Skip to content

Instantly share code, notes, and snippets.

@timelyportfolio
Last active November 8, 2016 22:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save timelyportfolio/0d5db6377a6e6eab3b02cc1d9f9bce77 to your computer and use it in GitHub Desktop.
Save timelyportfolio/0d5db6377a6e6eab3b02cc1d9f9bce77 to your computer and use it in GitHub Desktop.
animated efficient frontier with plotly
license: mit
This file has been truncated, but you can view the full file.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEFkZCBhIG1ldGhvZCB0byBkZWxlZ2F0b3IgdGhhdCwgd2hlbiBpbnZva2VkLCBjYWxscwogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbgogIC8vIHRoZSBkZWxlZ2F0ZWUsIGJ1dCB0aGVyZSB3YXMgb25lIG9uIGRlbGVnYXRvciBiZWZvcmUKICAvLyBkZWxlZ2F0ZU1ldGhvZCB3YXMgY2FsbGVkLCB0aGVuIHRoZSBvcmlnaW5hbCB2ZXJzaW9uCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gdmFyIGEgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ExJyk7IH0KICAvLyAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYTInKTsgfQogIC8vIH07CiAgLy8gdmFyIGIgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2IxJyk7IH0KICAvLyB9OwogIC8vIGRlbGVnYXRlTWV0aG9kKGEsIGIsICJtZXRob2QxIik7CiAgLy8gZGVsZWdhdGVNZXRob2QoYSwgYiwgIm1ldGhvZDIiKTsKICAvLyBhLm1ldGhvZDEoKTsKICAvLyBhLm1ldGhvZDIoKTsKICAvLwogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4KICBmdW5jdGlvbiBkZWxlZ2F0ZU1ldGhvZChkZWxlZ2F0b3IsIGRlbGVnYXRlZSwgbWV0aG9kTmFtZSkgewogICAgdmFyIGluaGVyaXRlZCA9IGRlbGVnYXRvclttZXRob2ROYW1lXTsKICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdGFyZ2V0ID0gZGVsZWdhdGVlOwogICAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGVlW21ldGhvZE5hbWVdOwoKICAgICAgLy8gVGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0IG9uIHRoZSBkZWxlZ2F0ZWUuIEluc3RlYWQsCiAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBvbiB0aGUgZGVsZWdhdG9yLCBpZiBpdCBleGlzdHMuCiAgICAgIGlmICghbWV0aG9kKSB7CiAgICAgICAgdGFyZ2V0ID0gZGVsZWdhdG9yOwogICAgICAgIG1ldGhvZCA9IGluaGVyaXRlZDsKICAgICAgfQoKICAgICAgaWYgKG1ldGhvZCkgewogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gSW1wbGVtZW50IGEgdmFndWUgZmFjc2ltaWxpZSBvZiBqUXVlcnkncyBkYXRhIG1ldGhvZAogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICByZXR1cm4gZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV07CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgewogICAgICBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXSA9IHZhbHVlOwogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGVsZW1lbnREYXRhOiAiICsKICAgICAgICBhcmd1bWVudHMubGVuZ3RoKTsKICAgIH0KICB9CgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleAogIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCAiXFwkJiIpOwogIH0KCiAgZnVuY3Rpb24gaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkgewogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOwogICAgcmV0dXJuIHJlLnRlc3QoZWwuY2xhc3NOYW1lKTsKICB9CgogIC8vIGVsZW1lbnRzIC0gYXJyYXkgKG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBvZiBIVE1MIGVsZW1lbnRzCiAgLy8gY2xhc3NOYW1lIC0gY2xhc3MgbmFtZSB0byB0ZXN0IGZvcgogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsKICAvLyAgIGlmIGZhbHNlLCBvbmx5IHJldHVybiBlbGVtZW50cyAqd2l0aG91dCogZ2l2ZW4gY2xhc3NOYW1lCiAgZnVuY3Rpb24gZmlsdGVyQnlDbGFzcyhlbGVtZW50cywgY2xhc3NOYW1lLCBpbmNsdWRlKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaGFzQ2xhc3MoZWxlbWVudHNbaV0sIGNsYXNzTmFtZSkgPT0gaW5jbHVkZSkKICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQoKICBmdW5jdGlvbiBvbihvYmosIGV2ZW50TmFtZSwgZnVuYykgewogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgZmFsc2UpOwogICAgfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpIHsKICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvZmYob2JqLCBldmVudE5hbWUsIGZ1bmMpIHsKICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7CiAgICBlbHNlIGlmIChvYmouZGV0YWNoRXZlbnQpIHsKICAgICAgb2JqLmRldGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aAogIC8vIHRoZSAicGFkZGluZyIgQ1NTIHByb3BlcnR5CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3BhZGRpbmcKICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7CiAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgIHZhbHVlID0gW3ZhbHVlXTsKICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMF0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzBdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzNdfTsKICAgIH0KICB9CgogIC8vIENvbnZlcnQgYW4gdW5wYWNrZWQgcGFkZGluZyBvYmplY3QgdG8gYSBDU1MgdmFsdWUKICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgewogICAgcmV0dXJuIHBhZGRpbmdPYmoudG9wICsgInB4ICIgKyBwYWRkaW5nT2JqLnJpZ2h0ICsgInB4ICIgKyBwYWRkaW5nT2JqLmJvdHRvbSArICJweCAiICsgcGFkZGluZ09iai5sZWZ0ICsgInB4IjsKICB9CgogIC8vIE1ha2VzIGEgbnVtYmVyIHN1aXRhYmxlIGZvciBDU1MKICBmdW5jdGlvbiBweCh4KSB7CiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIHggKyAicHgiOwogICAgZWxzZQogICAgICByZXR1cm4geDsKICB9CgogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuCiAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIgbnVsbCwgb3IgYW4gb2JqZWN0IHdpdGggZmlsbCwgcGFkZGluZywKICAvLyBkZWZhdWx0V2lkdGgsIGRlZmF1bHRIZWlnaHQgZmllbGRzLgogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgewogICAgdmFyIHNpemluZ0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vaHRtbHdpZGdldC1zaXppbmcnXSIpOwogICAgaWYgKCFzaXppbmdFbCkKICAgICAgcmV0dXJuIG51bGw7CiAgICB2YXIgc3AgPSBKU09OLnBhcnNlKHNpemluZ0VsLnRleHRDb250ZW50IHx8IHNpemluZ0VsLnRleHQgfHwgInt9Iik7CiAgICBpZiAodmlld2VyTW9kZSkgewogICAgICByZXR1cm4gc3Audmlld2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHNwLmJyb3dzZXI7CiAgICB9CiAgfQoKICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLgogIC8vICAgRWFjaCBlbGVtZW50IG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdGhhdCB5aWVsZHMgYQogIC8vICAgZnVuY3Rpb24uIE9yLCBjYW4gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICJjb2RlIiBhbmQgImRhdGEiCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nCiAgLy8gICBvZiBKUyB0aGF0J3MgYW4gZXhwciB0aGF0IHlpZWxkcyBhIGZ1bmN0aW9uLCBhbmQgImRhdGEiIHNob3VsZCBiZQogIC8vICAgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBhZGRlZCBhcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHdoZW4gdGhhdAogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLgogIC8vIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgInRoaXMiIGZvciBlYWNoIGZ1bmN0aW9uCiAgLy8gICBleGVjdXRpb24uCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlCiAgLy8gICBzYW1lIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zLikKICBmdW5jdGlvbiBldmFsQW5kUnVuKHRhc2tzLCB0YXJnZXQsIGFyZ3MpIHsKICAgIGlmICh0YXNrcykgewogICAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgdmFyIHRoZXNlQXJncyA9IGFyZ3M7CiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHRoZXNlQXJncyA9IHRoZXNlQXJncy5jb25jYXQoW3Rhc2suZGF0YV0pOwogICAgICAgICAgdGFzayA9IHRhc2suY29kZTsKICAgICAgICB9CiAgICAgICAgdmFyIHRhc2tGdW5jID0gZXZhbCgiKCIgKyB0YXNrICsgIikiKTsKICAgICAgICBpZiAodHlwZW9mKHRhc2tGdW5jKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOwogICAgICAgIH0KICAgICAgICB0YXNrRnVuYy5hcHBseSh0YXJnZXQsIHRoZXNlQXJncyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdFNpemluZyhlbCkgewogICAgdmFyIHNpemluZyA9IHNpemluZ1BvbGljeShlbCk7CiAgICBpZiAoIXNpemluZykKICAgICAgcmV0dXJuOwoKICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsKICAgIGlmICghY2VsKQogICAgICByZXR1cm47CgogICAgaWYgKHR5cGVvZihzaXppbmcucGFkZGluZykgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luID0gIjAiOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOwogICAgfQoKICAgIGlmIChzaXppbmcuZmlsbCkgewogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIGlmIChjZWwpIHsKICAgICAgICBjZWwuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgIHZhciBwYWQgPSB1bnBhY2tQYWRkaW5nKHNpemluZy5wYWRkaW5nKTsKICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLnJpZ2h0ID0gcGFkLnJpZ2h0ICsgInB4IjsKICAgICAgICBjZWwuc3R5bGUuYm90dG9tID0gcGFkLmJvdHRvbSArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7CiAgICAgICAgZWwuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwKICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY2VsLm9mZnNldEhlaWdodDsgfQogICAgICB9OwoKICAgIH0gZWxzZSB7CiAgICAgIGVsLnN0eWxlLndpZHRoID0gcHgoc2l6aW5nLndpZHRoKTsKICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LAogICAgICAgIGdldEhlaWdodDogZnVuY3Rpb24oKSB7IHJldHVybiBlbC5vZmZzZXRIZWlnaHQ7IH0KICAgICAgfTsKICAgIH0KICB9CgogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzCiAgdmFyIGRlZmF1bHRzID0gewogICAgZmluZDogZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7CiAgICB9LAogICAgcmVuZGVyRXJyb3I6IGZ1bmN0aW9uKGVsLCBlcnIpIHsKICAgICAgdmFyICRlbCA9ICQoZWwpOwoKICAgICAgdGhpcy5jbGVhckVycm9yKGVsKTsKCiAgICAgIC8vIEFkZCBhbGwgdGhlc2UgZXJyb3IgY2xhc3NlcywgYXMgU2hpbnkgZG9lcwogICAgICB2YXIgZXJyQ2xhc3MgPSAic2hpbnktb3V0cHV0LWVycm9yIjsKICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7CiAgICAgICAgLy8gdXNlIHRoZSBjbGFzc2VzIG9mIHRoZSBlcnJvciBjb25kaXRpb24gYXMgQ1NTIGNsYXNzIG5hbWVzCiAgICAgICAgZXJyQ2xhc3MgPSBlcnJDbGFzcyArICIgIiArICQubWFwKGFzQXJyYXkoZXJyLnR5cGUpLCBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOwogICAgICAgIH0pLmpvaW4oIiAiKTsKICAgICAgfQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7CgogICAgICAvLyBJcyBlbCBpbmxpbmUgb3IgYmxvY2s/IElmIGlubGluZSBvciBpbmxpbmUtYmxvY2ssIGp1c3QgZGlzcGxheTpub25lIGl0CiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLgogICAgICB2YXIgZGlzcGxheSA9ICRlbC5jc3MoImRpc3BsYXkiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgZGlzcGxheSk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICAkZWwuaGlkZSgpOwogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsKICAgICAgICAgIHZhciBlcnJvclNwYW4gPSAkKCI8c3Bhbj4iKS5hZGRDbGFzcyhlcnJDbGFzcyk7CiAgICAgICAgICBlcnJvclNwYW4udGV4dChlcnIubWVzc2FnZSk7CiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIikgewogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlCiAgICAgICAgLy8gZWwsIGFuZCBwb3NpdGlvbiB0aGUgZXJyb3IgdG8gYmUgb24gdG9wIG9mIHRoZSBlbC4KICAgICAgICAvLyBNYXJrIGl0IHdpdGggYSB1bmlxdWUgSUQgYW5kIENTUyBjbGFzcyBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGxhdGVyLgogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSAiIikgewogICAgICAgICAgdmFyIGVycm9yRGl2ID0gJCgiPGRpdj4iKS5hZGRDbGFzcyhlcnJDbGFzcykuY3NzKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpCiAgICAgICAgICAgIC8vIHNldHRpbmcgd2lkdGggY2FuIHB1c2ggb3V0IHRoZSBwYWdlIHNpemUsIGZvcmNpbmcgb3RoZXJ3aXNlCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3IKICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgdG8gc2hyaW5rOyBzbyB1c2UgbWF4LXdpZHRoIGluc3RlYWQKICAgICAgICAgICAgLmNzcygibWF4V2lkdGgiLCBlbC5vZmZzZXRXaWR0aCkKICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgIGVycm9yRGl2LnRleHQoZXJyLm1lc3NhZ2UpOwogICAgICAgICAgJGVsLmFmdGVyKGVycm9yRGl2KTsKCiAgICAgICAgICAvLyBSZWFsbHkgZHVtYiB3YXkgdG8ga2VlcCB0aGUgc2l6ZS9wb3NpdGlvbiBvZiB0aGUgZXJyb3IgaW4gc3luYyB3aXRoCiAgICAgICAgICAvLyB0aGUgcGFyZW50IGVsZW1lbnQgYXMgdGhlIHdpbmRvdyBpcyByZXNpemVkIG9yIHdoYXRldmVyLgogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghZXJyb3JEaXZbMF0ucGFyZW50RWxlbWVudCkgewogICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50SWQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvckRpdgogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgICAuY3NzKCJsZWZ0IiwgZWwub2Zmc2V0TGVmdCkKICAgICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICB9LCA1MDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGNsZWFyRXJyb3I6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIHZhciAkZWwgPSAkKGVsKTsKICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgbnVsbCk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICBpZiAoZGlzcGxheSkKICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsKICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOwogICAgICB9IGVsc2UgaWYgKGRpc3BsYXkgPT09ICJibG9jayIpewogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOwogICAgICAgICQoZWwubmV4dFNpYmxpbmcpLmZpbHRlcigiLmh0bWx3aWRnZXRzLWVycm9yIikucmVtb3ZlKCk7CiAgICAgIH0KICAgIH0sCiAgICBzaXppbmc6IHt9CiAgfTsKCiAgLy8gQ2FsbGVkIGJ5IHdpZGdldCBiaW5kaW5ncyB0byByZWdpc3RlciBhIG5ldyB0eXBlIG9mIHdpZGdldC4gVGhlIGRlZmluaXRpb24KICAvLyBvYmplY3QgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlCiAgLy8gICB1c2VkIGJ5IGRlZmF1bHQgYXMgdGhlIENTUyBjbGFzc25hbWUgdG8gbG9vayBmb3IuCiAgLy8gLSBpbml0aWFsaXplIChvcHRpb25hbCkgLSBBIGZ1bmN0aW9uKGVsKSB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uY2UgcGVyCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkCiAgLy8gICB2YWx1ZSB0byByZW5kZXJWYWx1ZS4KICAvLyAtIHJlbmRlclZhbHVlIChyZXF1aXJlZCkgLSBBIGZ1bmN0aW9uKGVsLCBkYXRhLCBpbml0VmFsdWUpIHRoYXQgd2lsbCBiZQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXIKICAvLyAgIGVsZW1lbnQ7IFNoaW55IGFwcHMgd2lsbCBjYXVzZSB0aGlzIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBwZXIKICAvLyAgIGVsZW1lbnQsIGFzIHRoZSBkYXRhIGNoYW5nZXMuCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsKICAgIGlmICghZGVmaW5pdGlvbi5uYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIG5hbWUiKTsKICAgIH0KICAgIGlmICghZGVmaW5pdGlvbi50eXBlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHR5cGUiKTsKICAgIH0KICAgIC8vIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgb3V0cHV0IHdpZGdldHMKICAgIGlmIChkZWZpbml0aW9uLnR5cGUgIT09ICJvdXRwdXQiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsKICAgIH0KICAgIC8vIFRPRE86IFZlcmlmeSB0aGF0IC5uYW1lIGlzIGEgdmFsaWQgQ1NTIGNsYXNzbmFtZQoKICAgIC8vIFN1cHBvcnQgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb25zLiBPbGQtc3R5bGUgY2xhc3MtYm91bmQKICAgIC8vIGRlZmluaXRpb25zIGhhdmUgb25lIHdpZGdldCAib2JqZWN0IiBwZXIgd2lkZ2V0IHBlciB0eXBlL2NsYXNzIG9mCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cwogICAgLy8gdGFrZSBlbCBhbmQgaW5zdGFuY2UgYXJndW1lbnRzLCBiZWNhdXNlIHRoZSB3aWRnZXQgb2JqZWN0IGNhbid0CiAgICAvLyBzdG9yZSB0aGVtLiBOZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0CiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0CiAgICAvLyBwcm92aWRlIHJlbmRlclZhbHVlIG9yIHJlc2l6ZSBtZXRob2RzIGF0IGFsbCwganVzdCB0aGUgc2luZ2xlIG1ldGhvZAogICAgLy8gICBmYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4KICAgIC8vIFRoaXMgZW5hYmxlcyBhIGZhciBtb3JlIG5hdHVyYWwgcHJvZ3JhbW1pbmcgc3R5bGUgZm9yIHRoZSB3aWRnZXQKICAgIC8vIGF1dGhvciwgd2hvIGNhbiBzdG9yZSBwZXItaW5zdGFuY2Ugc3RhdGUgdXNpbmcgZWl0aGVyIE9PLXN0eWxlCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzCiAgICAvLyBpcyBpbiBjb250cmFzdCB0byB3aGF0IGNhbiBvbmx5IGJlIGNhbGxlZCBDLXN0eWxlIHBzZXVkby1PTyB3aGljaCBpcwogICAgLy8gd2hhdCB3ZSByZXF1aXJlZCBiZWZvcmUpLgogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgewogICAgICBkZWZpbml0aW9uID0gY3JlYXRlTGVnYWN5RGVmaW5pdGlvbkFkYXB0ZXIoZGVmaW5pdGlvbik7CiAgICB9CgogICAgaWYgKCFkZWZpbml0aW9uLnJlbmRlclZhbHVlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHJlbmRlclZhbHVlIGZ1bmN0aW9uIik7CiAgICB9CgogICAgLy8gRm9yIHN0YXRpYyByZW5kZXJpbmcgKG5vbi1TaGlueSksIHVzZSBhIHNpbXBsZSB3aWRnZXQgcmVnaXN0cmF0aW9uCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28KICAgIC8vIGNvbnRhaW4gc3RhdGljIHdpZGdldHMuCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLgogICAgdmFyIHN0YXRpY0JpbmRpbmcgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKICAgIG92ZXJyaWRlTWV0aG9kKHN0YXRpY0JpbmRpbmcsICJmaW5kIiwgZnVuY3Rpb24oc3VwZXJmdW5jKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgewogICAgICAgIHZhciByZXN1bHRzID0gc3VwZXJmdW5jKHNjb3BlKTsKICAgICAgICAvLyBGaWx0ZXIgb3V0IFNoaW55IG91dHB1dHMsIHdlIG9ubHkgd2FudCB0aGUgc3RhdGljIGtpbmQKICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOwogICAgICB9OwogICAgfSk7CiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOwoKICAgIGlmIChzaGlueU1vZGUpIHsKICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4KICAgICAgLy8gVGhlIGRlZmluaXRpb24gaXRzZWxmIHdpbGwgbm90IGJlIHRoZSBvdXRwdXQgYmluZGluZywgaW5zdGVhZAogICAgICAvLyB3ZSB3aWxsIG1ha2UgYW4gb3V0cHV0IGJpbmRpbmcgb2JqZWN0IHRoYXQgZGVsZWdhdGVzIHRvIHRoZQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kCiAgICAgIC8vIG5hbWUgKHJlbmRlclZhbHVlKSBmb3IgaHRtbHdpZGdldHMgZGVmaW5pdGlvbiBhbmQgU2hpbnkgYmluZGluZ3MKICAgICAgLy8gYnV0IHRoZXkgYWN0dWFsbHkgaGF2ZSBxdWl0ZSBkaWZmZXJlbnQgc2VtYW50aWNzICh0aGUgU2hpbnkKICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0CiAgICAgIC8vIHN0cmlwcyBvZmYgYmVmb3JlIGNhbGxpbmcgaHRtbHdpZGdldHMgcmVuZGVyVmFsdWUpLiBXZSBjYW4ndAogICAgICAvLyBqdXN0IGlnbm9yZSB0aGUgZGlmZmVyZW5jZSBiZWNhdXNlIGluIHNvbWUgd2lkZ2V0cyBpdCdzIGhlbHBmdWwKICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZgogICAgICAvLyB3ZSdyZSBub3QgZGVsZWdhdGluZywgdGhlbiB0aGF0IGNhbGwgd2lsbCBnbyB0byB0aGUgU2hpbnkKICAgICAgLy8gdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBodG1sd2lkZ2V0cyB2ZXJzaW9uLgoKICAgICAgLy8gTWVyZ2UgZGVmYXVsdHMgd2l0aCBkZWZpbml0aW9uLCB3aXRob3V0IG11dGF0aW5nIGVpdGhlci4KICAgICAgdmFyIGJpbmRpbmdEZWYgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKCiAgICAgIC8vIFRoaXMgb2JqZWN0IHdpbGwgYmUgb3VyIGFjdHVhbCBTaGlueSBiaW5kaW5nLgogICAgICB2YXIgc2hpbnlCaW5kaW5nID0gbmV3IFNoaW55Lk91dHB1dEJpbmRpbmcoKTsKCiAgICAgIC8vIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgd2UnbGwgd2FudCB0byBzaW1wbHkgdXNlIHRoZSBiaW5kaW5nRGVmJ3MKICAgICAgLy8gdmVyc2lvbiBvZiBtZXRob2RzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0bwogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwKICAgICAgLy8gbWV0aG9kcyBpbiB0aGUgZnV0dXJlLCBhbmQgd2Ugd2FudCB0aGVtIHRvIGJlIG92ZXJyaWRlYWJsZSBieQogICAgICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcgZGVmaW5pdGlvbnMsIHRoZW4gd2UnbGwgbmVlZCB0byBhZGQgdGhlbSB0byB0aGlzCiAgICAgIC8vIGxpc3QuCiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImdldElkIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgIm9uVmFsdWVDaGFuZ2UiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgInJlbmRlckVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImNsZWFyRXJyb3IiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7CgogICAgICAvLyBUaGUgZmluZCwgcmVuZGVyVmFsdWUsIGFuZCByZXNpemUgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIGJlY2F1c2Ugd2UKICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4KCiAgICAgIHNoaW55QmluZGluZy5maW5kID0gZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7CgogICAgICAgIC8vIE9ubHkgcmV0dXJuIGVsZW1lbnRzIHRoYXQgYXJlIFNoaW55IG91dHB1dHMsIG5vdCBzdGF0aWMgb25lcwogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7CgogICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3aGF0ZXZlciBjYXVzZWQgU2hpbnkgdG8gdGhpbmsgdGhlcmUgbWlnaHQgYmUKICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuCiAgICAgICAgLy8gU2luY2UgdGhlcmUgbWlnaHQgYmUgbG90cyBvZiBkaWZmZXJlbnQgaHRtbHdpZGdldHMgYmluZGluZ3MsIHdlCiAgICAgICAgLy8gc2NoZWR1bGUgZXhlY3V0aW9uIGZvciBsYXRlci0tbm8gbmVlZCB0byBzdGF0aWNSZW5kZXIgbXVsdGlwbGUKICAgICAgICAvLyB0aW1lcy4KICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggIT09IGR5bmFtaWNSZXN1bHRzLmxlbmd0aCkKICAgICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyKCk7CgogICAgICAgIHJldHVybiBkeW5hbWljUmVzdWx0czsKICAgICAgfTsKCiAgICAgIC8vIFdyYXAgcmVuZGVyVmFsdWUgdG8gaGFuZGxlIGluaXRpYWxpemF0aW9uLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGlzbid0CiAgICAgIC8vIHN1cHBvcnRlZCBuYXRpdmVseSBieSBTaGlueSBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCgogICAgICBzaGlueUJpbmRpbmcucmVuZGVyVmFsdWUgPSBmdW5jdGlvbihlbCwgZGF0YSkgewogICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgZGF0YS5ldmFscyAmJiBpIDwgZGF0YS5ldmFscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1tpXSk7CiAgICAgICAgfQogICAgICAgIGlmICghYmluZGluZ0RlZi5yZW5kZXJPbk51bGxWYWx1ZSkgewogICAgICAgICAgaWYgKGRhdGEueCA9PT0gbnVsbCkgewogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7CiAgICAgICAgICBpbml0U2l6aW5nKGVsKTsKCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7CiAgICAgICAgICBpZiAoYmluZGluZ0RlZi5pbml0aWFsaXplKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBiaW5kaW5nRGVmLmluaXRpYWxpemUoZWwsIGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICAgIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiLCByZXN1bHQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBTaGlueS5yZW5kZXJEZXBlbmRlbmNpZXMoZGF0YS5kZXBzKTsKICAgICAgICBiaW5kaW5nRGVmLnJlbmRlclZhbHVlKGVsLCBkYXRhLngsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7CiAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7CiAgICAgIH07CgogICAgICAvLyBPbmx5IG92ZXJyaWRlIHJlc2l6ZSBpZiBiaW5kaW5nRGVmIGltcGxlbWVudHMgaXQKICAgICAgaWYgKGJpbmRpbmdEZWYucmVzaXplKSB7CiAgICAgICAgc2hpbnlCaW5kaW5nLnJlc2l6ZSA9IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgICAvLyBTaGlueSBjYW4gY2FsbCByZXNpemUgYmVmb3JlIGluaXRpYWxpemUvcmVuZGVyVmFsdWUgaGF2ZSBiZWVuCiAgICAgICAgICAvLyBjYWxsZWQsIHdoaWNoIGRvZXNuJ3QgbWFrZSBzZW5zZSBmb3Igd2lkZ2V0cy4KICAgICAgICAgIGlmIChlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIikpIHsKICAgICAgICAgICAgYmluZGluZ0RlZi5yZXNpemUoZWwsIHdpZHRoLCBoZWlnaHQsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgU2hpbnkub3V0cHV0QmluZGluZ3MucmVnaXN0ZXIoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLm5hbWUpOwogICAgfQogIH07CgogIHZhciBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogIGZ1bmN0aW9uIHNjaGVkdWxlU3RhdGljUmVuZGVyKCkgewogICAgaWYgKCFzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQpIHsKICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsKICAgICAgfSwgMSk7CiAgICB9CiAgfQoKICAvLyBSZW5kZXIgc3RhdGljIHdpZGdldHMgYWZ0ZXIgdGhlIGRvY3VtZW50IGZpbmlzaGVzIGxvYWRpbmcKICAvLyBTdGF0aWNhbGx5IHJlbmRlciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgb2YgdGhpcyB3aWRnZXQncyBjbGFzcwogIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIgPSBmdW5jdGlvbigpIHsKICAgIHZhciBiaW5kaW5ncyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgZm9yRWFjaChiaW5kaW5ncywgZnVuY3Rpb24oYmluZGluZykgewogICAgICB2YXIgbWF0Y2hlcyA9IGJpbmRpbmcuZmluZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOwogICAgICBmb3JFYWNoKG1hdGNoZXMsIGZ1bmN0aW9uKGVsKSB7CiAgICAgICAgdmFyIHNpemVPYmogPSBpbml0U2l6aW5nKGVsLCBiaW5kaW5nKTsKCiAgICAgICAgaWYgKGhhc0NsYXNzKGVsLCAiaHRtbC13aWRnZXQtc3RhdGljLWJvdW5kIikpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lICsgIiBodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiOwoKICAgICAgICB2YXIgaW5pdFJlc3VsdDsKICAgICAgICBpZiAoYmluZGluZy5pbml0aWFsaXplKSB7CiAgICAgICAgICBpbml0UmVzdWx0ID0gYmluZGluZy5pbml0aWFsaXplKGVsLAogICAgICAgICAgICBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0CiAgICAgICAgICApOwogICAgICAgICAgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIsIGluaXRSZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGJpbmRpbmcucmVzaXplKSB7CiAgICAgICAgICB2YXIgbGFzdFNpemUgPSB7fTsKICAgICAgICAgIHZhciByZXNpemVIYW5kbGVyID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICB2YXIgc2l6ZSA9IHsKICAgICAgICAgICAgICB3OiBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgICAgaDogc2l6ZU9iaiA/IHNpemVPYmouZ2V0SGVpZ2h0KCkgOiBlbC5vZmZzZXRIZWlnaHQKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHNpemUudyA9PT0gMCAmJiBzaXplLmggPT09IDApCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBpZiAoc2l6ZS53ID09PSBsYXN0U2l6ZS53ICYmIHNpemUuaCA9PT0gbGFzdFNpemUuaCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGxhc3RTaXplID0gc2l6ZTsKICAgICAgICAgICAgYmluZGluZy5yZXNpemUoZWwsIHNpemUudywgc2l6ZS5oLCBpbml0UmVzdWx0KTsKICAgICAgICAgIH07CgogICAgICAgICAgb24od2luZG93LCAicmVzaXplIiwgcmVzaXplSGFuZGxlcik7CgogICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIGNhc2VzIHdoZXJlIHdlJ3JlIHJ1bm5pbmcgaW4gYSBTaGlueQogICAgICAgICAgLy8gYXBwLCBidXQgdGhlIHdpZGdldCBpdHNlbGYgaXMgbm90IGEgU2hpbnkgb3V0cHV0LCBidXQKICAgICAgICAgIC8vIHJhdGhlciBhIHNpbXBsZSBzdGF0aWMgd2lkZ2V0LiBPbmUgZXhhbXBsZSBvZiB0aGlzIGlzCiAgICAgICAgICAvLyBhbiBybWFya2Rvd24gZG9jdW1lbnQgdGhhdCBoYXMgcnVudGltZTpzaGlueSBhbmQgd2lkZ2V0CiAgICAgICAgICAvLyB0aGF0IGlzbid0IGluIGEgcmVuZGVyIGZ1bmN0aW9uLiBTaGlueSBvbmx5IGtub3dzIHRvCiAgICAgICAgICAvLyBjYWxsIHJlc2l6ZSBoYW5kbGVycyBmb3IgU2hpbnkgb3V0cHV0cywgbm90IGZvciBzdGF0aWMKICAgICAgICAgIC8vIHdpZGdldHMsIHNvIHdlIGRvIGl0IG91cnNlbHZlcy4KICAgICAgICAgIGlmICh3aW5kb3cualF1ZXJ5KSB7CiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKAogICAgICAgICAgICAgICJzaG93bi5odG1sd2lkZ2V0cyBzaG93bi5icy50YWIuaHRtbHdpZGdldHMgc2hvd24uYnMuY29sbGFwc2UuaHRtbHdpZGdldHMiLAogICAgICAgICAgICAgIHJlc2l6ZUhhbmRsZXIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgd2luZG93LmpRdWVyeShkb2N1bWVudCkub24oCiAgICAgICAgICAgICAgImhpZGRlbi5odG1sd2lkZ2V0cyBoaWRkZW4uYnMudGFiLmh0bWx3aWRnZXRzIGhpZGRlbi5icy5jb2xsYXBzZS5odG1sd2lkZ2V0cyIsCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcgogICAgICAgICAgICApOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgc3BlY2lmaWMgY2FzZSBvZiBpb3NsaWRlcywgd2hpY2gKICAgICAgICAgIC8vIGZsaXBzIHNsaWRlcyBiZXR3ZWVuIGRpc3BsYXk6bm9uZSBhbmQgZGlzcGxheTpibG9jay4KICAgICAgICAgIC8vIElkZWFsbHkgd2Ugd291bGQgbm90IGhhdmUgdG8gaGF2ZSBpb3NsaWRlLXNwZWNpZmljIGNvZGUKICAgICAgICAgIC8vIGhlcmUsIGJ1dCByYXRoZXIgaGF2ZSBpb3NsaWRlcyByYWlzZSBhIGdlbmVyaWMgZXZlbnQsCiAgICAgICAgICAvLyBidXQgdGhlIHJtYXJrZG93biBwYWNrYWdlIGp1c3Qgd2VudCB0byBDUkFOIHNvIHRoZQogICAgICAgICAgLy8gd2luZG93IHRvIGdldHRpbmcgdGhhdCBmaXhlZCBtYXkgYmUgbG9uZy4KICAgICAgICAgIGlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikgewogICAgICAgICAgICAvLyBJdCdzIE9LIHRvIGxpbWl0IHRoaXMgdG8gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIKICAgICAgICAgICAgLy8gYnJvd3NlcnMgYmVjYXVzZSBpb3NsaWRlcyBpdHNlbGYgb25seSBzdXBwb3J0cwogICAgICAgICAgICAvLyBzdWNoIGJyb3dzZXJzLgogICAgICAgICAgICBvbihkb2N1bWVudCwgInNsaWRlZW50ZXIiLCByZXNpemVIYW5kbGVyKTsKICAgICAgICAgICAgb24oZG9jdW1lbnQsICJzbGlkZWxlYXZlIiwgcmVzaXplSGFuZGxlcik7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgc2NyaXB0RGF0YSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtkYXRhLWZvcj0nIiArIGVsLmlkICsgIiddW3R5cGU9J2FwcGxpY2F0aW9uL2pzb24nXSIpOwogICAgICAgIGlmIChzY3JpcHREYXRhKSB7CiAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2Uoc2NyaXB0RGF0YS50ZXh0Q29udGVudCB8fCBzY3JpcHREYXRhLnRleHQpOwogICAgICAgICAgLy8gUmVzb2x2ZSBzdHJpbmdzIG1hcmtlZCBhcyBqYXZhc2NyaXB0IGxpdGVyYWxzIHRvIG9iamVjdHMKICAgICAgICAgIGlmICghKGRhdGEuZXZhbHMgaW5zdGFuY2VvZiBBcnJheSkpIGRhdGEuZXZhbHMgPSBbZGF0YS5ldmFsc107CiAgICAgICAgICBmb3IgKHZhciBrID0gMDsgZGF0YS5ldmFscyAmJiBrIDwgZGF0YS5ldmFscy5sZW5ndGg7IGsrKykgewogICAgICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIoZGF0YS54LCBkYXRhLmV2YWxzW2tdKTsKICAgICAgICAgIH0KICAgICAgICAgIGJpbmRpbmcucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgaW5pdFJlc3VsdCk7CiAgICAgICAgICBldmFsQW5kUnVuKGRhdGEuanNIb29rcy5yZW5kZXIsIGluaXRSZXN1bHQsIFtlbCwgZGF0YS54XSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwoKICAgIGludm9rZVBvc3RSZW5kZXJIYW5kbGVycygpOwogIH0KCiAgLy8gV2FpdCB1bnRpbCBhZnRlciB0aGUgZG9jdW1lbnQgaGFzIGxvYWRlZCB0byByZW5kZXIgdGhlIHdpZGdldHMuCiAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigpIHsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlKTsKICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgfSwgZmFsc2UpOwogIH0gZWxzZSBpZiAoZG9jdW1lbnQuYXR0YWNoRXZlbnQpIHsKICAgIGRvY3VtZW50LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBmdW5jdGlvbigpIHsKICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIpIHsKICAgICAgICBkb2N1bWVudC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgYXJndW1lbnRzLmNhbGxlZSk7CiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgICB9CiAgICB9KTsKICB9CgoKICB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0QXR0YWNobWVudFVybCA9IGZ1bmN0aW9uKGRlcG5hbWUsIGtleSkgewogICAgLy8gSWYgbm8ga2V5LCBkZWZhdWx0IHRvIHRoZSBmaXJzdCBpdGVtCiAgICBpZiAodHlwZW9mKGtleSkgPT09ICJ1bmRlZmluZWQiKQogICAgICBrZXkgPSAxOwoKICAgIHZhciBsaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGVwbmFtZSArICItIiArIGtleSArICItYXR0YWNobWVudCIpOwogICAgaWYgKCFsaW5rKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiQXR0YWNobWVudCAiICsgZGVwbmFtZSArICIvIiArIGtleSArICIgbm90IGZvdW5kIGluIGRvY3VtZW50Iik7CiAgICB9CiAgICByZXR1cm4gbGluay5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKICB9OwoKICB3aW5kb3cuSFRNTFdpZGdldHMuZGF0YWZyYW1lVG9EMyA9IGZ1bmN0aW9uKGRmKSB7CiAgICB2YXIgbmFtZXMgPSBbXTsKICAgIHZhciBsZW5ndGg7CiAgICBmb3IgKHZhciBuYW1lIGluIGRmKSB7CiAgICAgICAgaWYgKGRmLmhhc093blByb3BlcnR5KG5hbWUpKQogICAgICAgICAgICBuYW1lcy5wdXNoKG5hbWUpOwogICAgICAgIGlmICh0eXBlb2YoZGZbbmFtZV0pICE9PSAib2JqZWN0IiB8fCB0eXBlb2YoZGZbbmFtZV0ubGVuZ3RoKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIik7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YobGVuZ3RoKSAhPT0gInVuZGVmaW5lZCIgJiYgbGVuZ3RoICE9PSBkZltuYW1lXS5sZW5ndGgpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIG9mIHRoZSBzYW1lIGxlbmd0aCIpOwogICAgICAgIH0KICAgICAgICBsZW5ndGggPSBkZltuYW1lXS5sZW5ndGg7CiAgICB9CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgdmFyIGl0ZW07CiAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCBsZW5ndGg7IHJvdysrKSB7CiAgICAgICAgaXRlbSA9IHt9OwogICAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG5hbWVzLmxlbmd0aDsgY29sKyspIHsKICAgICAgICAgICAgaXRlbVtuYW1lc1tjb2xdXSA9IGRmW25hbWVzW2NvbF1dW3Jvd107CiAgICAgICAgfQogICAgICAgIHJlc3VsdHMucHVzaChpdGVtKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIHdpbmRvdy5IVE1MV2lkZ2V0cy50cmFuc3Bvc2VBcnJheTJEID0gZnVuY3Rpb24oYXJyYXkpIHsKICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFycmF5OwogICAgICB2YXIgbmV3QXJyYXkgPSBhcnJheVswXS5tYXAoZnVuY3Rpb24oY29sLCBpKSB7CiAgICAgICAgICByZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uKHJvdykgewogICAgICAgICAgICAgIHJldHVybiByb3dbaV0KICAgICAgICAgIH0pCiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3QXJyYXk7CiAgfTsKICAvLyBTcGxpdCB2YWx1ZSBhdCBzcGxpdENoYXIsIGJ1dCBhbGxvdyBzcGxpdENoYXIgdG8gYmUgZXNjYXBlZAogIC8vIHVzaW5nIGVzY2FwZUNoYXIuIEFueSBvdGhlciBjaGFyYWN0ZXJzIGVzY2FwZWQgYnkgZXNjYXBlQ2hhcgogIC8vIHdpbGwgYmUgaW5jbHVkZWQgYXMgdXN1YWwgKGluY2x1ZGluZyBlc2NhcGVDaGFyIGl0c2VsZikuCiAgZnVuY3Rpb24gc3BsaXRXaXRoRXNjYXBlKHZhbHVlLCBzcGxpdENoYXIsIGVzY2FwZUNoYXIpIHsKICAgIHZhciByZXN1bHRzID0gW107CiAgICB2YXIgZXNjYXBlTW9kZSA9IGZhbHNlOwogICAgdmFyIGN1cnJlbnRSZXN1bHQgPSAiIjsKICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IHZhbHVlLmxlbmd0aDsgcG9zKyspIHsKICAgICAgaWYgKCFlc2NhcGVNb2RlKSB7CiAgICAgICAgaWYgKHZhbHVlW3Bvc10gPT09IHNwbGl0Q2hhcikgewogICAgICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOwogICAgICAgICAgY3VycmVudFJlc3VsdCA9ICIiOwogICAgICAgIH0gZWxzZSBpZiAodmFsdWVbcG9zXSA9PT0gZXNjYXBlQ2hhcikgewogICAgICAgICAgZXNjYXBlTW9kZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGN1cnJlbnRSZXN1bHQgKz0gdmFsdWVbcG9zXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOwogICAgICAgIGVzY2FwZU1vZGUgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgaWYgKGN1cnJlbnRSZXN1bHQgIT09ICIiKSB7CiAgICAgIHJlc3VsdHMucHVzaChjdXJyZW50UmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH0KICAvLyBGdW5jdGlvbiBhdXRob3JlZCBieSBZaWh1aS9KSiBBbGxhaXJlCiAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyID0gZnVuY3Rpb24obywgbWVtYmVyKSB7CiAgICB2YXIgcGFydHMgPSBzcGxpdFdpdGhFc2NhcGUobWVtYmVyLCAnLicsICdcXCcpOwogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBwYXJ0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsKICAgICAgLy8gcGFydCBtYXkgYmUgYSBjaGFyYWN0ZXIgb3IgJ251bWVyaWMnIG1lbWJlciBuYW1lCiAgICAgIGlmIChvICE9PSBudWxsICYmIHR5cGVvZiBvID09PSAib2JqZWN0IiAmJiBwYXJ0IGluIG8pIHsKICAgICAgICBpZiAoaSA9PSAobCAtIDEpKSB7IC8vIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIHRoZW4gZXZhbHVsYXRlCiAgICAgICAgICBpZiAodHlwZW9mIG9bcGFydF0gPT09ICJzdHJpbmciKQogICAgICAgICAgICBvW3BhcnRdID0gZXZhbCgiKCIgKyBvW3BhcnRdICsgIikiKTsKICAgICAgICB9IGVsc2UgeyAvLyBvdGhlcndpc2UgY29udGludWUgdG8gbmV4dCBlbWJlZGRlZCBvYmplY3QKICAgICAgICAgIG8gPSBvW3BhcnRdOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH07CgogIC8vIFJldHJpZXZlIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlIChpLmUuIHRoZSByZXR1cm4gdmFsdWUgb2YgYW4KICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQogIC8vIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50LCBvciBudWxsIGlmIG5vbmUuCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlID0gZnVuY3Rpb24oZWwpIHsKICAgIHJldHVybiBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0Iik7CiAgfTsKCiAgLy8gRmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHNjb3BlIHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsCiAgLy8gYW5kIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZgogIC8vIGFuIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pCiAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoYXQgZWxlbWVudCwgaWYgYW55LiBJZiBubyBlbGVtZW50IG1hdGNoZXMgdGhlCiAgLy8gc2VsZWN0b3IsIG9yIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IGhhcyBubyBIVE1MV2lkZ2V0CiAgLy8gaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGl0LCB0aGVuIG51bGwgaXMgcmV0dXJuZWQuCiAgLy8KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmQgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgc2VsZWN0b3IgPSBzY29wZTsKICAgICAgc2NvcGUgPSBkb2N1bWVudDsKICAgIH0KCiAgICB2YXIgZWwgPSBzY29wZS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgIGlmIChlbCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2UoZWwpOwogICAgfQogIH07CgogIC8vIEZpbmRzIGFsbCBlbGVtZW50cyBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IsIGFuZAogIC8vIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2VzIChpLmUuIHRoZSByZXR1cm4gdmFsdWVzIG9mCiAgLy8gYW4gSFRNTFdpZGdldCBiaW5kaW5nJ3MgaW5pdGlhbGl6ZSgpIG9yIGZhY3RvcnkoKSBmdW5jdGlvbikKICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnRzLCBpbiBhbiBhcnJheS4gSWYgZWxlbWVudHMgdGhhdAogIC8vIG1hdGNoIHRoZSBzZWxlY3RvciBkb24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgSFRNTFdpZGdldAogIC8vIGluc3RhbmNlLCB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBjb250YWluIG51bGxzLgogIC8vCiAgLy8gVGhlIHNjb3BlIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCBhbmQgZGVmYXVsdHMgdG8gd2luZG93LmRvY3VtZW50LgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5maW5kQWxsID0gZnVuY3Rpb24oc2NvcGUsIHNlbGVjdG9yKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgIHNlbGVjdG9yID0gc2NvcGU7CiAgICAgIHNjb3BlID0gZG9jdW1lbnQ7CiAgICB9CgogICAgdmFyIG5vZGVzID0gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewogICAgICByZXN1bHRzLnB1c2god2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlKG5vZGVzW2ldKSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICB2YXIgcG9zdFJlbmRlckhhbmRsZXJzID0gW107CiAgZnVuY3Rpb24gaW52b2tlUG9zdFJlbmRlckhhbmRsZXJzKCkgewogICAgd2hpbGUgKHBvc3RSZW5kZXJIYW5kbGVycy5sZW5ndGgpIHsKICAgICAgdmFyIGhhbmRsZXIgPSBwb3N0UmVuZGVySGFuZGxlcnMuc2hpZnQoKTsKICAgICAgaWYgKGhhbmRsZXIpIHsKICAgICAgICBoYW5kbGVyKCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFJlZ2lzdGVyIHRoZSBnaXZlbiBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBpbnZva2VkIGFmdGVyIHRoZQogIC8vIG5leHQgdGltZSBzdGF0aWMgd2lkZ2V0cyBhcmUgcmVuZGVyZWQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmFkZFBvc3RSZW5kZXJIYW5kbGVyID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIHBvc3RSZW5kZXJIYW5kbGVycy5wdXNoKGNhbGxiYWNrKTsKICB9OwoKICAvLyBUYWtlcyBhIG5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9uLCBhbmQgcmV0dXJucyBhbgogIC8vIG9sZC1zdHlsZSBjbGFzcy1ib3VuZCBkZWZpbml0aW9uLiBUaGlzIHNhdmVzIHVzIGZyb20gaGF2aW5nCiAgLy8gdG8gcmV3cml0ZSBhbGwgdGhlIGxvZ2ljIGluIHRoaXMgZmlsZSB0byBhY2NvbW9kYXRlIGJvdGgKICAvLyB0eXBlcyBvZiBkZWZpbml0aW9ucy4KICBmdW5jdGlvbiBjcmVhdGVMZWdhY3lEZWZpbml0aW9uQWRhcHRlcihkZWZuKSB7CiAgICB2YXIgcmVzdWx0ID0gewogICAgICBuYW1lOiBkZWZuLm5hbWUsCiAgICAgIHR5cGU6IGRlZm4udHlwZSwKICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICByZXR1cm4gZGVmbi5mYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgfSwKICAgICAgcmVuZGVyVmFsdWU6IGZ1bmN0aW9uKGVsLCB4LCBpbnN0YW5jZSkgewogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZW5kZXJWYWx1ZSh4KTsKICAgICAgfSwKICAgICAgcmVzaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCwgaW5zdGFuY2UpIHsKICAgICAgICByZXR1cm4gaW5zdGFuY2UucmVzaXplKHdpZHRoLCBoZWlnaHQpOwogICAgICB9CiAgICB9OwoKICAgIGlmIChkZWZuLmZpbmQpCiAgICAgIHJlc3VsdC5maW5kID0gZGVmbi5maW5kOwogICAgaWYgKGRlZm4ucmVuZGVyRXJyb3IpCiAgICAgIHJlc3VsdC5yZW5kZXJFcnJvciA9IGRlZm4ucmVuZGVyRXJyb3I7CiAgICBpZiAoZGVmbi5jbGVhckVycm9yKQogICAgICByZXN1bHQuY2xlYXJFcnJvciA9IGRlZm4uY2xlYXJFcnJvcjsKCiAgICByZXR1cm4gcmVzdWx0OwogIH0KfSkoKTsKCg=="></script>
<link href="data:text/css;charset=utf-8,%0Aslide%3Anot%28%2Ecurrent%29%20%2Eplotly%2Ehtml%2Dwidget%7B%0Adisplay%3A%20none%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,LyoqCiogcGxvdGx5LmpzIHYxLjE5LjIKKiBDb3B5cmlnaHQgMjAxMi0yMDE2LCBQbG90bHksIEluYy4KKiBBbGwgcmlnaHRzIHJlc2VydmVkLgoqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQoqLwohZnVuY3Rpb24odCl7aWYoIm9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZSltb2R1bGUuZXhwb3J0cz10KCk7ZWxzZSBpZigiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShbXSx0KTtlbHNle3ZhciBlO2U9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp0aGlzLGUuUGxvdGx5PXQoKX19KGZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIGZ1bmN0aW9uIHQoZSxyLG4pe2Z1bmN0aW9uIGkobyxzKXtpZighcltvXSl7aWYoIWVbb10pe3ZhciBsPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFzJiZsKXJldHVybiBsKG8sITApO2lmKGEpcmV0dXJuIGEobywhMCk7dmFyIHU9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrbysiJyIpO3Rocm93IHUuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsdX12YXIgYz1yW29dPXtleHBvcnRzOnt9fTtlW29dWzBdLmNhbGwoYy5leHBvcnRzLGZ1bmN0aW9uKHQpe3ZhciByPWVbb11bMV1bdF07cmV0dXJuIGkocj9yOnQpfSxjLGMuZXhwb3J0cyx0LGUscixuKX1yZXR1cm4gcltvXS5leHBvcnRzfWZvcih2YXIgYT0iZnVuY3Rpb24iPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxvPTA7bzxuLmxlbmd0aDtvKyspaShuW29dKTtyZXR1cm4gaX0oezE6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiLi4vc3JjL2xpYiIpLGk9eyJYLFggZGl2IjoiZm9udC1mYW1pbHk6J09wZW4gU2FucycsIHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmO21hcmdpbjowO3BhZGRpbmc6MDsiLCJYIGlucHV0LFggYnV0dG9uIjoiZm9udC1mYW1pbHk6J09wZW4gU2FucycsIHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOyIsIlggaW5wdXQ6Zm9jdXMsWCBidXR0b246Zm9jdXMiOiJvdXRsaW5lOm5vbmU7IiwiWCBhIjoidGV4dC1kZWNvcmF0aW9uOm5vbmU7IiwiWCBhOmhvdmVyIjoidGV4dC1kZWNvcmF0aW9uOm5vbmU7IiwiWCAuY3Jpc3AiOiJzaGFwZS1yZW5kZXJpbmc6Y3Jpc3BFZGdlczsiLCJYIC51c2VyLXNlbGVjdC1ub25lIjoiLXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTstby11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7IiwiWCBzdmciOiJvdmVyZmxvdzpoaWRkZW47IiwiWCBzdmcgYSI6ImZpbGw6IzQ0N2FkYjsiLCJYIHN2ZyBhOmhvdmVyIjoiZmlsbDojM2M2ZGM1OyIsIlggLm1haW4tc3ZnIjoicG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3BvaW50ZXItZXZlbnRzOm5vbmU7IiwiWCAubWFpbi1zdmcgLmRyYWdsYXllciI6InBvaW50ZXItZXZlbnRzOmFsbDsiLCJYIC5jdXJzb3ItcG9pbnRlciI6ImN1cnNvcjpwb2ludGVyOyIsIlggLmN1cnNvci1jcm9zc2hhaXIiOiJjdXJzb3I6Y3Jvc3NoYWlyOyIsIlggLmN1cnNvci1tb3ZlIjoiY3Vyc29yOm1vdmU7IiwiWCAuY3Vyc29yLWNvbC1yZXNpemUiOiJjdXJzb3I6Y29sLXJlc2l6ZTsiLCJYIC5jdXJzb3Itcm93LXJlc2l6ZSI6ImN1cnNvcjpyb3ctcmVzaXplOyIsIlggLmN1cnNvci1ucy1yZXNpemUiOiJjdXJzb3I6bnMtcmVzaXplOyIsIlggLmN1cnNvci1ldy1yZXNpemUiOiJjdXJzb3I6ZXctcmVzaXplOyIsIlggLmN1cnNvci1zdy1yZXNpemUiOiJjdXJzb3I6c3ctcmVzaXplOyIsIlggLmN1cnNvci1zLXJlc2l6ZSI6ImN1cnNvcjpzLXJlc2l6ZTsiLCJYIC5jdXJzb3Itc2UtcmVzaXplIjoiY3Vyc29yOnNlLXJlc2l6ZTsiLCJYIC5jdXJzb3Itdy1yZXNpemUiOiJjdXJzb3I6dy1yZXNpemU7IiwiWCAuY3Vyc29yLWUtcmVzaXplIjoiY3Vyc29yOmUtcmVzaXplOyIsIlggLmN1cnNvci1udy1yZXNpemUiOiJjdXJzb3I6bnctcmVzaXplOyIsIlggLmN1cnNvci1uLXJlc2l6ZSI6ImN1cnNvcjpuLXJlc2l6ZTsiLCJYIC5jdXJzb3ItbmUtcmVzaXplIjoiY3Vyc29yOm5lLXJlc2l6ZTsiLCJYIC5tb2RlYmFyIjoicG9zaXRpb246YWJzb2x1dGU7dG9wOjJweDtyaWdodDoycHg7ei1pbmRleDoxMDAxO2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwwLjcpOyIsIlggLm1vZGViYXItLWhvdmVyIjoib3BhY2l0eTowOy13ZWJraXQtdHJhbnNpdGlvbjpvcGFjaXR5IDAuM3MgZWFzZSAwczstbW96LXRyYW5zaXRpb246b3BhY2l0eSAwLjNzIGVhc2UgMHM7LW1zLXRyYW5zaXRpb246b3BhY2l0eSAwLjNzIGVhc2UgMHM7LW8tdHJhbnNpdGlvbjpvcGFjaXR5IDAuM3MgZWFzZSAwczt0cmFuc2l0aW9uOm9wYWNpdHkgMC4zcyBlYXNlIDBzOyIsIlg6aG92ZXIgLm1vZGViYXItLWhvdmVyIjoib3BhY2l0eToxOyIsIlggLm1vZGViYXItZ3JvdXAiOiJmbG9hdDpsZWZ0O2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDttYXJnaW4tbGVmdDo4cHg7cG9zaXRpb246cmVsYXRpdmU7dmVydGljYWwtYWxpZ246bWlkZGxlO3doaXRlLXNwYWNlOm5vd3JhcDsiLCJYIC5tb2RlYmFyLWdyb3VwOmZpcnN0LWNoaWxkIjoibWFyZ2luLWxlZnQ6MHB4OyIsIlggLm1vZGViYXItYnRuIjoicG9zaXRpb246cmVsYXRpdmU7Zm9udC1zaXplOjE2cHg7cGFkZGluZzozcHggNHB4O2N1cnNvcjpwb2ludGVyO2xpbmUtaGVpZ2h0Om5vcm1hbDtib3gtc2l6aW5nOmJvcmRlci1ib3g7IiwiWCAubW9kZWJhci1idG4gc3ZnIjoicG9zaXRpb246cmVsYXRpdmU7dG9wOjJweDsiLCJYIC5tb2RlYmFyLWJ0biBwYXRoIjoiZmlsbDpyZ2JhKDAsMzEsOTUsMC4zKTsiLCJYIC5tb2RlYmFyLWJ0bi5hY3RpdmUgcGF0aCxYIC5tb2RlYmFyLWJ0bjpob3ZlciBwYXRoIjoiZmlsbDpyZ2JhKDAsMjIsNzIsMC41KTsiLCJYIC5tb2RlYmFyLWJ0bi5tb2RlYmFyLWJ0bi0tbG9nbyI6InBhZGRpbmc6M3B4IDFweDsiLCJYIC5tb2RlYmFyLWJ0bi5tb2RlYmFyLWJ0bi0tbG9nbyBwYXRoIjoiZmlsbDojNDQ3YWRiICFpbXBvcnRhbnQ7IiwiWCBbZGF0YS10aXRsZV06YmVmb3JlLFggW2RhdGEtdGl0bGVdOmFmdGVyIjoicG9zaXRpb246YWJzb2x1dGU7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwgMCwgMCk7LW1vei10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwgMCwgMCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLCAwLCAwKTstby10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwgMCwgMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsIDAsIDApO2Rpc3BsYXk6bm9uZTtvcGFjaXR5OjA7ei1pbmRleDoxMDAxO3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjExMCU7cmlnaHQ6NTAlOyIsIlggW2RhdGEtdGl0bGVdOmhvdmVyOmJlZm9yZSxYIFtkYXRhLXRpdGxlXTpob3ZlcjphZnRlciI6ImRpc3BsYXk6YmxvY2s7b3BhY2l0eToxOyIsIlggW2RhdGEtdGl0bGVdOmJlZm9yZSI6ImNvbnRlbnQ6Jyc7cG9zaXRpb246YWJzb2x1dGU7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtib3JkZXI6NnB4IHNvbGlkIHRyYW5zcGFyZW50O3otaW5kZXg6MTAwMjttYXJnaW4tdG9wOi0xMnB4O2JvcmRlci1ib3R0b20tY29sb3I6IzY5NzM4YTttYXJnaW4tcmlnaHQ6LTZweDsiLCJYIFtkYXRhLXRpdGxlXTphZnRlciI6ImNvbnRlbnQ6YXR0cihkYXRhLXRpdGxlKTtiYWNrZ3JvdW5kOiM2OTczOGE7Y29sb3I6d2hpdGU7cGFkZGluZzo4cHggMTBweDtmb250LXNpemU6MTJweDtsaW5lLWhlaWdodDoxMnB4O3doaXRlLXNwYWNlOm5vd3JhcDttYXJnaW4tcmlnaHQ6LTE4cHg7Ym9yZGVyLXJhZGl1czoycHg7IiwiWCAuc2VsZWN0LW91dGxpbmUiOiJmaWxsOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c2hhcGUtcmVuZGVyaW5nOmNyaXNwRWRnZXM7IiwiWCAuc2VsZWN0LW91dGxpbmUtMSI6InN0cm9rZTp3aGl0ZTsiLCJYIC5zZWxlY3Qtb3V0bGluZS0yIjoic3Ryb2tlOmJsYWNrO3N0cm9rZS1kYXNoYXJyYXk6MnB4IDJweDsiLFk6ImZvbnQtZmFtaWx5OidPcGVuIFNhbnMnO3Bvc2l0aW9uOmZpeGVkO3RvcDo1MHB4O3JpZ2h0OjIwcHg7ei1pbmRleDoxMDAwMDtmb250LXNpemU6MTBwdDttYXgtd2lkdGg6MTgwcHg7IiwiWSBwIjoibWFyZ2luOjA7IiwiWSAubm90aWZpZXItbm90ZSI6Im1pbi13aWR0aDoxODBweDttYXgtd2lkdGg6MjUwcHg7Ym9yZGVyOjFweCBzb2xpZCAjZmZmO3otaW5kZXg6MzAwMDttYXJnaW46MDtiYWNrZ3JvdW5kLWNvbG9yOiM4Yzk3YWY7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDE0MCwxNTEsMTc1LDAuOSk7Y29sb3I6I2ZmZjtwYWRkaW5nOjEwcHg7IiwiWSAubm90aWZpZXItY2xvc2UiOiJjb2xvcjojZmZmO29wYWNpdHk6MC44O2Zsb2F0OnJpZ2h0O3BhZGRpbmc6MCA1cHg7YmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToyMHB4O2ZvbnQtd2VpZ2h0OmJvbGQ7bGluZS1oZWlnaHQ6MjBweDsiLCJZIC5ub3RpZmllci1jbG9zZTpob3ZlciI6ImNvbG9yOiM0NDQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Y3Vyc29yOnBvaW50ZXI7In07Zm9yKHZhciBhIGluIGkpe3ZhciBvPWEucmVwbGFjZSgvXiwvLCIgLCIpLnJlcGxhY2UoL1gvZywiLmpzLXBsb3RseS1wbG90IC5wbG90bHkiKS5yZXBsYWNlKC9ZL2csIi5wbG90bHktbm90aWZpZXIiKTtuLmFkZFN0eWxlUnVsZShvLGlbYV0pfX0seyIuLi9zcmMvbGliIjo2MzJ9XSwyOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz17dW5kbzp7d2lkdGg6ODU3LjEscGF0aDoibTg1NyAzNTBxMC04Ny0zNC0xNjZ0LTkxLTEzNy0xMzctOTItMTY2LTM0cS05NiAwLTE4MyA0MXQtMTQ3IDExNHEtNCA2LTQgMTN0NSAxMWw3NiA3N3E2IDUgMTQgNSA5LTEgMTMtNyA0MS01MyAxMDAtODJ0MTI2LTI5cTU4IDAgMTEwIDIzdDkyIDYxIDYxIDkxIDIyIDExMS0yMiAxMTEtNjEgOTEtOTIgNjEtMTEwIDIzcS01NSAwLTEwNS0yMHQtOTAtNTdsNzctNzdxMTctMTYgOC0zOC0xMC0yMy0zMy0yM2gtMjUwcS0xNSAwLTI1IDExdC0xMSAyNXYyNTBxMCAyNCAyMiAzMyAyMiAxMCAzOS04bDcyLTcycTYwIDU3IDEzNyA4OHQxNTkgMzFxODcgMCAxNjYtMzR0MTM3LTkyIDkxLTEzNyAzNC0xNjZ6Iixhc2NlbnQ6ODUwLGRlc2NlbnQ6LTE1MH0saG9tZTp7d2lkdGg6OTI4LjYscGF0aDoibTc4NiAyOTZ2LTI2N3EwLTE1LTExLTI2dC0yNS0xMGgtMjE0djIxNGgtMTQzdi0yMTRoLTIxNHEtMTUgMC0yNSAxMHQtMTEgMjZ2MjY3cTAgMSAwIDJ0MCAybDMyMSAyNjQgMzIxLTI2NHExLTEgMS00eiBtMTI0IDM5bC0zNC00MXEtNS01LTEyLTZoLTJxLTcgMC0xMiAzbC0zODYgMzIyLTM4Ni0zMjJxLTctNC0xMy00LTcgMi0xMiA3bC0zNSA0MXEtNCA1LTMgMTN0NiAxMmw0MDEgMzM0cTE4IDE1IDQyIDE1dDQzLTE1bDEzNi0xMTR2MTA5cTAgOCA1IDEzdDEzIDVoMTA3cTggMCAxMy01dDUtMTN2LTIyN2wxMjItMTAycTUtNSA2LTEydC00LTEzeiIsYXNjZW50Ojg1MCxkZXNjZW50Oi0xNTB9LCJjYW1lcmEtcmV0cm8iOnt3aWR0aDoxZTMscGF0aDoibTUxOCAzODZxMCA4LTUgMTN0LTEzIDVxLTM3IDAtNjMtMjd0LTI2LTYzcTAtOCA1LTEzdDEzLTUgMTIgNSA1IDEzcTAgMjMgMTYgMzh0MzggMTZxOCAwIDEzIDV0NSAxM3ogbTEyNS03M3EwLTU5LTQyLTEwMXQtMTAxLTQyLTEwMSA0Mi00MiAxMDEgNDIgMTAxIDEwMSA0MiAxMDEtNDIgNDItMTAxeiBtLTU3Mi0zMjBoODU4djcxaC04NTh2LTcxeiBtNjQzIDMyMHEwIDg5LTYyIDE1MnQtMTUyIDYyLTE1MS02Mi02My0xNTIgNjMtMTUxIDE1MS02MyAxNTIgNjMgNjIgMTUxeiBtLTU3MSAzNThoMjE0djcyaC0yMTR2LTcyeiBtLTcyLTEwN2g4NTh2MTQzaC00NjJsLTM2LTcxaC0zNjB2LTcyeiBtOTI5IDE0M3YtNzE0cTAtMzAtMjEtNTF0LTUwLTIxaC04NThxLTI5IDAtNTAgMjF0LTIxIDUxdjcxNHEwIDMwIDIxIDUxdDUwIDIxaDg1OHEyOSAwIDUwLTIxdDIxLTUxeiIsYXNjZW50Ojg1MCxkZXNjZW50Oi0xNTB9LHpvb21ib3g6e3dpZHRoOjFlMyxwYXRoOiJtMTAwMC0yNWwtMjUwIDI1MWM0MCA2MyA2MyAxMzggNjMgMjE4IDAgMjI0LTE4MiA0MDYtNDA3IDQwNi0yMjQgMC00MDYtMTgyLTQwNi00MDZzMTgzLTQwNiA0MDctNDA2YzgwIDAgMTU1IDIyIDIxOCA2MmwyNTAtMjUwIDEyNSAxMjV6IG0tODEyIDI1MGwwIDQzOCA0MzcgMCAwLTQzOC00MzcgMHogbTYyIDM3NWwzMTMgMCAwLTMxMi0zMTMgMCAwIDMxMnoiLGFzY2VudDo4NTAsZGVzY2VudDotMTUwfSxwYW46e3dpZHRoOjFlMyxwYXRoOiJtMTAwMCAzNTBsLTE4NyAxODggMC0xMjUtMjUwIDAgMCAyNTAgMTI1IDAtMTg4IDE4Ny0xODctMTg3IDEyNSAwIDAtMjUwLTI1MCAwIDAgMTI1LTE4OC0xODggMTg2LTE4NyAwIDEyNSAyNTIgMCAwLTI1MC0xMjUgMCAxODctMTg4IDE4OCAxODgtMTI1IDAgMCAyNTAgMjUwIDAgMC0xMjYgMTg3IDE4OHoiLGFzY2VudDo4NTAsZGVzY2VudDotMTUwfSx6b29tX3BsdXM6e3dpZHRoOjFlMyxwYXRoOiJtMSA3ODdsMC04NzUgODc1IDAgMCA4NzUtODc1IDB6IG02ODctNTAwbC0xODcgMCAwLTE4Ny0xMjUgMCAwIDE4Ny0xODggMCAwIDEyNSAxODggMCAwIDE4NyAxMjUgMCAwLTE4NyAxODcgMCAwLTEyNXoiLGFzY2VudDo4NTAsZGVzY2VudDotMTUwfSx6b29tX21pbnVzOnt3aWR0aDoxZTMscGF0aDoibTAgNzg4bDAtODc2IDg3NSAwIDAgODc2LTg3NSAweiBtNjg4LTUwMGwtNTAwIDAgMCAxMjUgNTAwIDAgMC0xMjV6Iixhc2NlbnQ6ODUwLGRlc2NlbnQ6LTE1MH0sYXV0b3NjYWxlOnt3aWR0aDoxZTMscGF0aDoibTI1MCA4NTBsLTE4NyAwLTYzIDAgMC02MiAwLTE4OCA2MyAwIDAgMTg4IDE4NyAwIDAgNjJ6IG02ODggMGwtMTg4IDAgMC02MiAxODggMCAwLTE4OCA2MiAwIDAgMTg4IDAgNjItNjIgMHogbS04NzUtOTM4bDAgMTg4LTYzIDAgMC0xODggMC02MiA2MyAwIDE4NyAwIDAgNjItMTg3IDB6IG04NzUgMTg4bDAtMTg4LTE4OCAwIDAtNjIgMTg4IDAgNjIgMCAwIDYyIDAgMTg4LTYyIDB6IG0tMTI1IDE4OGwtMSAwLTkzLTk0LTE1NiAxNTYgMTU2IDE1NiA5Mi05MyAyIDAgMCAyNTAtMjUwIDAgMC0yIDkzLTkyLTE1Ni0xNTYtMTU2IDE1NiA5NCA5MiAwIDItMjUwIDAgMC0yNTAgMCAwIDkzIDkzIDE1Ny0xNTYtMTU3LTE1Ni05MyA5NCAwIDAgMC0yNTAgMjUwIDAgMCAwLTk0IDkzIDE1NiAxNTcgMTU2LTE1Ny05My05MyAwIDAgMjUwIDAgMCAyNTB6Iixhc2NlbnQ6ODUwLGRlc2NlbnQ6LTE1MH0sdG9vbHRpcF9iYXNpYzp7d2lkdGg6MTUwMCxwYXRoOiJtMzc1IDcyNWwwIDAtMzc1LTM3NSAzNzUtMzc0IDAtMSAxMTI1IDAgMCA3NTAtMTEyNSAweiIsYXNjZW50Ojg1MCxkZXNjZW50Oi0xNTB9LHRvb2x0aXBfY29tcGFyZTp7d2lkdGg6MTEyNSxwYXRoOiJtMTg3IDc4NmwwIDItMTg3LTE4OCAxODgtMTg3IDAgMCA5MzcgMCAwIDM3My05MzggMHogbTAtNDk5bDAgMS0xODctMTg4IDE4OC0xODggMCAwIDkzNyAwIDAgMzc2LTkzOC0xeiIsYXNjZW50Ojg1MCxkZXNjZW50Oi0xNTB9LHBsb3RseWxvZ286e3dpZHRoOjE1NDIscGF0aDoibTAtMTBoMTgydi0xNDBoLTE4MnYxNDB6IG0yMjggMTQ2aDE4M3YtMjg2aC0xODN2Mjg2eiBtMjI1IDcxNGgxODJ2LTEwMDBoLTE4MnYxMDAweiBtMjI1LTI4NWgxODJ2LTcxNWgtMTgydjcxNXogbTIyNSAxNDJoMTgzdi04NTdoLTE4M3Y4NTd6IG0yMzEtNDI4aDE4MnYtNDI5aC0xODJ2NDI5eiBtMjI1LTI5MWgxODN2LTEzOGgtMTgzdjEzOHoiLGFzY2VudDo4NTAsZGVzY2VudDotMTUwfSwiei1heGlzIjp7d2lkdGg6MWUzLHBhdGg6Im04MzMgNWwtMTcgMTA4djQxbC0xMzAtNjUgMTMwLTY2YzAgMCAwIDM4IDAgMzkgMC0xIDM2LTE0IDM5LTI1IDQtMTUtNi0yMi0xNi0zMC0xNS0xMi0zOS0xNi01Ni0yMC05MC0yMi0xODctMjMtMjc5LTIzLTI2MSAwLTM0MSAzNC0zNTMgNTkgMyA2MCAyMjggMTEwIDIyOCAxMTAtMTQwLTgtMzUxLTM1LTM1MS0xMTYgMC0xMjAgMjkzLTE0MiA0NzQtMTQyIDE1NSAwIDQ3NyAyMiA0NzcgMTQyIDAgNTAtNzQgNzktMTYzIDk2eiBtLTM3NCA5NGMtNTgtNS05OS0yMS05OS00MCAwLTI0IDY1LTQzIDE0NC00MyA3OSAwIDE0MyAxOSAxNDMgNDMgMCAxOS00MiAzNC05OCA0MHYyMTZoODdsLTEzMiAxMzUtMTMzLTEzNWg4OHYtMjE2eiBtMTY3IDUxNWgtMTM2djFjMTYgMTYgMzEgMzQgNDYgNTJsODQgMTA5djU0aC0yMzB2LTcxaDEyNHYtMWMtMTYtMTctMjgtMzItNDQtNTFsLTg5LTExNHYtNTFoMjQ1djcyeiIsYXNjZW50Ojg1MCxkZXNjZW50Oi0xNTB9LCIzZF9yb3RhdGUiOnt3aWR0aDoxZTMscGF0aDoibTkyMiA2NjBjLTUgNC05IDctMTQgMTEtMzU5IDI2My01ODAtMzEtNTgwLTMxbC0xMDIgMjggNTgtNDAwYzAgMSAxIDEgMiAyIDExOCAxMDggMzUxIDI0OSAzNTEgMjQ5cy02MiAyNy0xMDAgNDJjODggODMgMjIyIDE4MyAzNDcgMTIyIDE2LTggMzAtMTcgNDQtMjctMiAxLTQgMi02IDR6IG0zNi0zMjljMCAwIDY0IDIyOS04OCAyOTYtNjIgMjctMTI0IDE0LTE3NS0xMSAxNTctNzggMjI1LTIwOCAyNDktMjY2IDgtMTkgMTEtMzEgMTEtMzEgMiA1IDYgMTUgMTEgMzItNS0xMy04LTIwLTgtMjB6IG0tNzc1LTIzOWM3MC0zMSAxMTctNTAgMTk4LTMyLTEyMSA4MC0xOTkgMzQ2LTE5OSAzNDZsLTk2LTE1LTU4LTEyYzAgMCA1NS0yMjYgMTU1LTI4N3ogbTYwMyAxMzNsLTMxNy0xMzljMCAwIDQtNCAxOS0xNCA3LTUgMjQtMTUgMjQtMTVzLTE3Ny0xNDctMzg5IDRjMjM1LTI4NyA1MzYtMTEyIDUzNi0xMTJsMzEtMjIgMTAwIDI5OS00LTF6IG0tMjk4LTE1M2M2LTQgMTQtOSAyNC0xNSAwIDAtMTcgMTAtMjQgMTV6Iixhc2NlbnQ6ODUwLGRlc2NlbnQ6LTE1MH0sY2FtZXJhOnt3aWR0aDoxZTMscGF0aDoibTUwMCA0NTBjLTgzIDAtMTUwLTY3LTE1MC0xNTAgMC04MyA2Ny0xNTAgMTUwLTE1MCA4MyAwIDE1MCA2NyAxNTAgMTUwIDAgODMtNjcgMTUwLTE1MCAxNTB6IG00MDAgMTUwaC0xMjBjLTE2IDAtMzQgMTMtMzkgMjlsLTMxIDkzYy02IDE1LTIzIDI4LTQwIDI4aC0zNDBjLTE2IDAtMzQtMTMtMzktMjhsLTMxLTk0Yy02LTE1LTIzLTI4LTQwLTI4aC0xMjBjLTU1IDAtMTAwLTQ1LTEwMC0xMDB2LTQ1MGMwLTU1IDQ1LTEwMCAxMDAtMTAwaDgwMGM1NSAwIDEwMCA0NSAxMDAgMTAwdjQ1MGMwIDU1LTQ1IDEwMC0xMDAgMTAweiBtLTQwMC01NTBjLTEzOCAwLTI1MCAxMTItMjUwIDI1MCAwIDEzOCAxMTIgMjUwIDI1MCAyNTAgMTM4IDAgMjUwLTExMiAyNTAtMjUwIDAtMTM4LTExMi0yNTAtMjUwLTI1MHogbTM2NSAzODBjLTE5IDAtMzUgMTYtMzUgMzUgMCAxOSAxNiAzNSAzNSAzNSAxOSAwIDM1LTE2IDM1LTM1IDAtMTktMTYtMzUtMzUtMzV6Iixhc2NlbnQ6ODUwLGRlc2NlbnQ6LTE1MH0sbW92aWU6e3dpZHRoOjFlMyxwYXRoOiJtOTM4IDQxM2wtMTg4LTEyNWMwIDM3LTE3IDcxLTQ0IDk0IDY0IDM4IDEwNyAxMDcgMTA3IDE4NyAwIDEyMS05OCAyMTktMjE5IDIxOS0xMjEgMC0yMTktOTgtMjE5LTIxOSAwLTYxIDI1LTExNyA2Ni0xNTZoLTExNWMzMCAzMyA0OSA3NiA0OSAxMjUgMCAxMDMtODQgMTg3LTE4NyAxODdzLTE4OC04NC0xODgtMTg3YzAtNTcgMjYtMTA3IDY1LTE0MS0zOC0yMi02NS02Mi02NS0xMDl2LTI1MGMwLTcwIDU2LTEyNiAxMjUtMTI2aDUwMGM2OSAwIDEyNSA1NiAxMjUgMTI2bDE4OC0xMjZjMzQgMCA2MiAyOCA2MiA2M3YzNzVjMCAzNS0yOCA2My02MiA2M3ogbS03NTAgMGMtNjkgMC0xMjUgNTYtMTI1IDEyNXM1NiAxMjUgMTI1IDEyNSAxMjUtNTYgMTI1LTEyNS01Ni0xMjUtMTI1LTEyNXogbTQwNi0xYy04NyAwLTE1NyA3MC0xNTcgMTU3IDAgODYgNzAgMTU2IDE1NyAxNTZzMTU2LTcwIDE1Ni0xNTYtNzAtMTU3LTE1Ni0xNTd6Iixhc2NlbnQ6ODUwLGRlc2NlbnQ6LTE1MH0scXVlc3Rpb246e3dpZHRoOjg1Ny4xLHBhdGg6Im01MDAgODJ2MTA3cTAgOC01IDEzdC0xMyA1aC0xMDdxLTggMC0xMy01dC01LTEzdi0xMDdxMC04IDUtMTN0MTMtNWgxMDdxOCAwIDEzIDV0NSAxM3ogbTE0MyAzNzVxMCA0OS0zMSA5MXQtNzcgNjUtOTUgMjNxLTEzNiAwLTIwNy0xMTktOS0xNCA0LTI0bDc0LTU1cTQtNCAxMC00IDkgMCAxNCA3IDMwIDM4IDQ4IDUxIDE5IDE0IDQ4IDE0IDI3IDAgNDgtMTV0MjEtMzNxMC0yMS0xMS0zNHQtMzgtMjVxLTM1LTE2LTY1LTQ4dC0yOS03MHYtMjBxMC04IDUtMTN0MTMtNWgxMDdxOCAwIDEzIDV0NSAxM3EwIDEwIDEyIDI3dDMwIDI4cTE4IDEwIDI4IDE2dDI1IDE5IDI1IDI3IDE2IDM0IDcgNDV6IG0yMTQtMTA3cTAtMTE3LTU3LTIxNXQtMTU2LTE1Ni0yMTUtNTgtMjE2IDU4LTE1NSAxNTYtNTggMjE1IDU4IDIxNSAxNTUgMTU2IDIxNiA1OCAyMTUtNTggMTU2LTE1NiA1Ny0yMTV6Iixhc2NlbnQ6ODUwLGRlc2NlbnQ6LTE1MH0sZGlzazp7d2lkdGg6ODU3LjEscGF0aDoibTIxNC03aDQyOXYyMTRoLTQyOXYtMjE0eiBtNTAwIDBoNzJ2NTAwcTAgOC02IDIxdC0xMSAyMGwtMTU3IDE1NnEtNSA2LTE5IDEydC0yMiA1di0yMzJxMC0yMi0xNS0zOHQtMzgtMTZoLTMyMnEtMjIgMC0zNyAxNnQtMTYgMzh2MjMyaC03MnYtNzE0aDcydjIzMnEwIDIyIDE2IDM4dDM3IDE2aDQ2NXEyMiAwIDM4LTE2dDE1LTM4di0yMzJ6IG0tMjE0IDUxOHYxNzhxMCA4LTUgMTN0LTEzIDVoLTEwN3EtNyAwLTEzLTV0LTUtMTN2LTE3OHEwLTggNS0xM3QxMy01aDEwN3E3IDAgMTMgNXQ1IDEzeiBtMzU3LTE4di01MThxMC0yMi0xNS0zOHQtMzgtMTZoLTc1MHEtMjMgMC0zOCAxNnQtMTYgMzh2NzUwcTAgMjIgMTYgMzh0MzggMTZoNTE3cTIzIDAgNTAtMTJ0NDItMjZsMTU2LTE1N3ExNi0xNSAyNy00MnQxMS00OXoiLGFzY2VudDo4NTAsZGVzY2VudDotMTUwfSxsYXNzbzp7d2lkdGg6MTAzMSxwYXRoOiJtMTAxOCA1MzhjLTM2IDIwNy0yOTAgMzM2LTU2OCAyODYtMjc3LTQ4LTQ3My0yNTYtNDM2LTQ2MyAxMC01NyAzNi0xMDggNzYtMTUxLTEzLTY2IDExLTEzNyA2OC0xODMgMzQtMjggNzUtNDEgMTE0LTQybC01NS03MCAwIDBjLTItMS0zLTItNC0zLTEwLTE0LTgtMzQgNS00NSAxNC0xMSAzNC04IDQ1IDQgMSAxIDIgMyAyIDVsMCAwIDExMyAxNDBjMTYgMTEgMzEgMjQgNDUgNDAgNCAzIDYgNyA4IDExIDQ4LTMgMTAwIDAgMTUxIDkgMjc4IDQ4IDQ3MyAyNTUgNDM2IDQ2MnogbS02MjQtMzc5Yy04MCAxNC0xNDkgNDgtMTk3IDk2IDQyIDQyIDEwOSA0NyAxNTYgOSAzMy0yNiA0Ny02NiA0MS0xMDV6IG0tMTg3LTc0Yy0xOSAxNi0zMyAzNy0zOSA2MCA1MC0zMiAxMDktNTUgMTc0LTY4LTQyLTI1LTk1LTI0LTEzNSA4eiBtMzYwIDc1Yy0zNC03LTY5LTktMTAyLTggOCA2Mi0xNiAxMjgtNjggMTcwLTczIDU5LTE3NSA1NC0yNDQtNS05IDIwLTE2IDQwLTIwIDYxLTI4IDE1OSAxMjEgMzE3IDMzMyAzNTRzNDA3LTYwIDQzNC0yMTdjMjgtMTU5LTEyMS0zMTgtMzMzLTM1NXoiLGFzY2VudDo4NTAsZGVzY2VudDotMTUwfSxzZWxlY3Rib3g6e3dpZHRoOjFlMyxwYXRoOiJtMCA4NTBsMC0xNDMgMTQzIDAgMCAxNDMtMTQzIDB6IG0yODYgMGwwLTE0MyAxNDMgMCAwIDE0My0xNDMgMHogbTI4NSAwbDAtMTQzIDE0MyAwIDAgMTQzLTE0MyAweiBtMjg2IDBsMC0xNDMgMTQzIDAgMCAxNDMtMTQzIDB6IG0tODU3LTI4NmwwLTE0MyAxNDMgMCAwIDE0My0xNDMgMHogbTg1NyAwbDAtMTQzIDE0MyAwIDAgMTQzLTE0MyAweiBtLTg1Ny0yODVsMC0xNDMgMTQzIDAgMCAxNDMtMTQzIDB6IG04NTcgMGwwLTE0MyAxNDMgMCAwIDE0My0xNDMgMHogbS04NTctMjg2bDAtMTQzIDE0MyAwIDAgMTQzLTE0MyAweiBtMjg2IDBsMC0xNDMgMTQzIDAgMCAxNDMtMTQzIDB6IG0yODUgMGwwLTE0MyAxNDMgMCAwIDE0My0xNDMgMHogbTI4NiAwbDAtMTQzIDE0MyAwIDAgMTQzLTE0MyAweiIsYXNjZW50Ojg1MCxkZXNjZW50Oi0xNTB9fX0se31dLDM6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvYmFyIil9LHsiLi4vc3JjL3RyYWNlcy9iYXIiOjc1Mn1dLDQ6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvYm94Iil9LHsiLi4vc3JjL3RyYWNlcy9ib3giOjc2NH1dLDU6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvY2FuZGxlc3RpY2siKX0seyIuLi9zcmMvdHJhY2VzL2NhbmRsZXN0aWNrIjo3NzJ9XSw2OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL2Nob3JvcGxldGgiKX0seyIuLi9zcmMvdHJhY2VzL2Nob3JvcGxldGgiOjc3N31dLDc6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvY29udG91ciIpfSx7Ii4uL3NyYy90cmFjZXMvY29udG91ciI6Nzg0fV0sODpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL2NvcmUiKX0seyIuLi9zcmMvY29yZSI6NjE5fV0sOTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYW5zZm9ybXMvZmlsdGVyIil9LHsiLi4vc3JjL3RyYW5zZm9ybXMvZmlsdGVyIjo5MDZ9XSwxMDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYW5zZm9ybXMvZ3JvdXBieSIpfSx7Ii4uL3NyYy90cmFuc2Zvcm1zL2dyb3VwYnkiOjkwN31dLDExOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL2hlYXRtYXAiKX0seyIuLi9zcmMvdHJhY2VzL2hlYXRtYXAiOjc5Nn1dLDEyOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL2hpc3RvZ3JhbSIpfSx7Ii4uL3NyYy90cmFjZXMvaGlzdG9ncmFtIjo4MDd9XSwxMzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYWNlcy9oaXN0b2dyYW0yZCIpfSx7Ii4uL3NyYy90cmFjZXMvaGlzdG9ncmFtMmQiOjgxMn1dLDE0OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL2hpc3RvZ3JhbTJkY29udG91ciIpfSx7Ii4uL3NyYy90cmFjZXMvaGlzdG9ncmFtMmRjb250b3VyIjo4MTZ9XSwxNTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj10KCIuL2NvcmUiKTtuLnJlZ2lzdGVyKFt0KCIuL2JhciIpLHQoIi4vYm94IiksdCgiLi9oZWF0bWFwIiksdCgiLi9oaXN0b2dyYW0iKSx0KCIuL2hpc3RvZ3JhbTJkIiksdCgiLi9oaXN0b2dyYW0yZGNvbnRvdXIiKSx0KCIuL3BpZSIpLHQoIi4vY29udG91ciIpLHQoIi4vc2NhdHRlcnRlcm5hcnkiKSx0KCIuL3NjYXR0ZXIzZCIpLHQoIi4vc3VyZmFjZSIpLHQoIi4vbWVzaDNkIiksdCgiLi9zY2F0dGVyZ2VvIiksdCgiLi9jaG9yb3BsZXRoIiksdCgiLi9zY2F0dGVyZ2wiKSx0KCIuL3BvaW50Y2xvdWQiKSx0KCIuL3NjYXR0ZXJtYXBib3giKSx0KCIuL29obGMiKSx0KCIuL2NhbmRsZXN0aWNrIildKSxuLnJlZ2lzdGVyKFt0KCIuL2ZpbHRlciIpLHQoIi4vZ3JvdXBieSIpXSksZS5leHBvcnRzPW59LHsiLi9iYXIiOjMsIi4vYm94Ijo0LCIuL2NhbmRsZXN0aWNrIjo1LCIuL2Nob3JvcGxldGgiOjYsIi4vY29udG91ciI6NywiLi9jb3JlIjo4LCIuL2ZpbHRlciI6OSwiLi9ncm91cGJ5IjoxMCwiLi9oZWF0bWFwIjoxMSwiLi9oaXN0b2dyYW0iOjEyLCIuL2hpc3RvZ3JhbTJkIjoxMywiLi9oaXN0b2dyYW0yZGNvbnRvdXIiOjE0LCIuL21lc2gzZCI6MTYsIi4vb2hsYyI6MTcsIi4vcGllIjoxOCwiLi9wb2ludGNsb3VkIjoxOSwiLi9zY2F0dGVyM2QiOjIwLCIuL3NjYXR0ZXJnZW8iOjIxLCIuL3NjYXR0ZXJnbCI6MjIsIi4vc2NhdHRlcm1hcGJveCI6MjMsIi4vc2NhdHRlcnRlcm5hcnkiOjI0LCIuL3N1cmZhY2UiOjI1fV0sMTY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvbWVzaDNkIil9LHsiLi4vc3JjL3RyYWNlcy9tZXNoM2QiOjgyMH1dLDE3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL29obGMiKX0seyIuLi9zcmMvdHJhY2VzL29obGMiOjgyNX1dLDE4OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL3BpZSIpfSx7Ii4uL3NyYy90cmFjZXMvcGllIjo4MzN9XSwxOTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYWNlcy9wb2ludGNsb3VkIil9LHsiLi4vc3JjL3RyYWNlcy9wb2ludGNsb3VkIjo4NDJ9XSwyMDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYWNlcy9zY2F0dGVyM2QiKX0seyIuLi9zcmMvdHJhY2VzL3NjYXR0ZXIzZCI6ODcyfV0sMjE6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvc2NhdHRlcmdlbyIpfSx7Ii4uL3NyYy90cmFjZXMvc2NhdHRlcmdlbyI6ODc4fV0sMjI6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvc2NhdHRlcmdsIil9LHsiLi4vc3JjL3RyYWNlcy9zY2F0dGVyZ2wiOjg4M31dLDIzOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL3NjYXR0ZXJtYXBib3giKX0seyIuLi9zcmMvdHJhY2VzL3NjYXR0ZXJtYXBib3giOjg5MH1dLDI0OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL3NjYXR0ZXJ0ZXJuYXJ5Iil9LHsiLi4vc3JjL3RyYWNlcy9zY2F0dGVydGVybmFyeSI6ODk2fV0sMjU6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvc3VyZmFjZSIpfSx7Ii4uL3NyYy90cmFjZXMvc3VyZmFjZSI6OTA1fV0sMjY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3Q9dHx8ZG9jdW1lbnQuYm9keSxlPWV8fHt9O3ZhciByPVsuMDEsMS8wXTsiZGlzdGFuY2VMaW1pdHMiaW4gZSYmKHJbMF09ZS5kaXN0YW5jZUxpbWl0c1swXSxyWzFdPWUuZGlzdGFuY2VMaW1pdHNbMV0pLCJ6b29tTWluImluIGUmJihyWzBdPWUuem9vbU1pbiksInpvb21NYXgiaW4gZSYmKHJbMV09ZS56b29tTWF4KTt2YXIgbj1hKHtjZW50ZXI6ZS5jZW50ZXJ8fFswLDAsMF0sdXA6ZS51cHx8WzAsMSwwXSxleWU6ZS5leWV8fFswLDAsMTBdLG1vZGU6ZS5tb2RlfHwib3JiaXQiLGRpc3RhbmNlTGltaXRzOnJ9KSxsPVswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXSx1PTAsYz10LmNsaWVudFdpZHRoLGg9dC5jbGllbnRIZWlnaHQsZj17dmlldzpuLGVsZW1lbnQ6dCxkZWxheTplLmRlbGF5fHwxNixyb3RhdGVTcGVlZDplLnJvdGF0ZVNwZWVkfHwxLHpvb21TcGVlZDplLnpvb21TcGVlZHx8MSx0cmFuc2xhdGVTcGVlZDplLnRyYW5zbGF0ZVNwZWVkfHwxLGZsaXBYOiEhZS5mbGlwWCxmbGlwWTohIWUuZmxpcFksbW9kZXM6bi5tb2Rlcyx0aWNrOmZ1bmN0aW9uKCl7dmFyIGU9aSgpLHI9dGhpcy5kZWxheTtuLmlkbGUoZS1yKSxuLmZsdXNoKGUtKDEwMCsyKnIpKTt2YXIgYT1lLTIqcjtuLnJlY2FsY01hdHJpeChhKTtmb3IodmFyIG89ITAscz1uLmNvbXB1dGVkTWF0cml4LGY9MDtmPDE2OysrZilvPW8mJmxbZl09PT1zW2ZdLGxbZl09c1tmXTt2YXIgZD10LmNsaWVudFdpZHRoPT09YyYmdC5jbGllbnRIZWlnaHQ9PT1oO3JldHVybiBjPXQuY2xpZW50V2lkdGgsaD10LmNsaWVudEhlaWdodCxvPyFkOih1PU1hdGguZXhwKG4uY29tcHV0ZWRSYWRpdXNbMF0pLCEwKX0sbG9va0F0OmZ1bmN0aW9uKHQsZSxyKXtuLmxvb2tBdChuLmxhc3RUKCksdCxlLHIpfSxyb3RhdGU6ZnVuY3Rpb24odCxlLHIpe24ucm90YXRlKG4ubGFzdFQoKSx0LGUscil9LHBhbjpmdW5jdGlvbih0LGUscil7bi5wYW4obi5sYXN0VCgpLHQsZSxyKX0sdHJhbnNsYXRlOmZ1bmN0aW9uKHQsZSxyKXtuLnRyYW5zbGF0ZShuLmxhc3RUKCksdCxlLHIpfX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZix7bWF0cml4OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5jb21wdXRlZE1hdHJpeH0sc2V0OmZ1bmN0aW9uKHQpe3JldHVybiBuLnNldE1hdHJpeChuLmxhc3RUKCksdCksbi5jb21wdXRlZE1hdHJpeH0sZW51bWVyYWJsZTohMH0sbW9kZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG4uZ2V0TW9kZSgpfSxzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIG4uc2V0TW9kZSh0KSxuLmdldE1vZGUoKX0sZW51bWVyYWJsZTohMH0sY2VudGVyOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5jb21wdXRlZENlbnRlcn0sc2V0OmZ1bmN0aW9uKHQpe3JldHVybiBuLmxvb2tBdChuLmxhc3RUKCksdCksbi5jb21wdXRlZENlbnRlcn0sZW51bWVyYWJsZTohMH0sZXllOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5jb21wdXRlZEV5ZX0sc2V0OmZ1bmN0aW9uKHQpe3JldHVybiBuLmxvb2tBdChuLmxhc3RUKCksbnVsbCx0KSxuLmNvbXB1dGVkRXllfSxlbnVtZXJhYmxlOiEwfSx1cDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG4uY29tcHV0ZWRVcH0sc2V0OmZ1bmN0aW9uKHQpe3JldHVybiBuLmxvb2tBdChuLmxhc3RUKCksbnVsbCxudWxsLHQpLG4uY29tcHV0ZWRVcH0sZW51bWVyYWJsZTohMH0sZGlzdGFuY2U6e2dldDpmdW5jdGlvbigpe3JldHVybiB1fSxzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIG4uc2V0RGlzdGFuY2Uobi5sYXN0VCgpLHQpLHR9LGVudW1lcmFibGU6ITB9LGRpc3RhbmNlTGltaXRzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5nZXREaXN0YW5jZUxpbWl0cyhyKX0sc2V0OmZ1bmN0aW9uKHQpe3JldHVybiBuLnNldERpc3RhbmNlTGltaXRzKHQpLHR9LGVudW1lcmFibGU6ITB9fSksdC5hZGRFdmVudExpc3RlbmVyKCJjb250ZXh0bWVudSIsZnVuY3Rpb24odCl7cmV0dXJuIHQucHJldmVudERlZmF1bHQoKSwhMX0pO3ZhciBkPTAscD0wO3JldHVybiBvKHQsZnVuY3Rpb24oZSxyLGEsbyl7dmFyIHM9MS90LmNsaWVudEhlaWdodCxsPXMqKHItZCksYz1zKihhLXApLGg9Zi5mbGlwWD8xOi0xLGc9Zi5mbGlwWT8xOi0xLG09TWF0aC5QSSpmLnJvdGF0ZVNwZWVkLHY9aSgpO2lmKDEmZSlvLnNoaWZ0P24ucm90YXRlKHYsMCwwLC1sKm0pOm4ucm90YXRlKHYsaCptKmwsLWcqbSpjLDApO2Vsc2UgaWYoMiZlKW4ucGFuKHYsLWYudHJhbnNsYXRlU3BlZWQqbCp1LGYudHJhbnNsYXRlU3BlZWQqYyp1LDApO2Vsc2UgaWYoNCZlKXt2YXIgeT1mLnpvb21TcGVlZCpjL3dpbmRvdy5pbm5lckhlaWdodCoodi1uLmxhc3RUKCkpKjUwO24ucGFuKHYsMCwwLHUqKE1hdGguZXhwKHkpLTEpKX1kPXIscD1hfSkscyh0LGZ1bmN0aW9uKHQsZSxyKXt2YXIgYT1mLmZsaXBYPzE6LTEsbz1mLmZsaXBZPzE6LTEscz1pKCk7aWYoTWF0aC5hYnModCk+TWF0aC5hYnMoZSkpbi5yb3RhdGUocywwLDAsLXQqYSpNYXRoLlBJKmYucm90YXRlU3BlZWQvd2luZG93LmlubmVyV2lkdGgpO2Vsc2V7dmFyIGw9Zi56b29tU3BlZWQqbyplL3dpbmRvdy5pbm5lckhlaWdodCoocy1uLmxhc3RUKCkpLzEwMDtuLnBhbihzLDAsMCx1KihNYXRoLmV4cChsKS0xKSl9fSwhMCksZn1lLmV4cG9ydHM9bjt2YXIgaT10KCJyaWdodC1ub3ciKSxhPXQoIjNkLXZpZXciKSxvPXQoIm1vdXNlLWNoYW5nZSIpLHM9dCgibW91c2Utd2hlZWwiKX0seyIzZC12aWV3IjoyNywibW91c2UtY2hhbmdlIjo0MTMsIm1vdXNlLXdoZWVsIjo0MTUsInJpZ2h0LW5vdyI6NDU5fV0sMjc6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3RoaXMuX2NvbnRyb2xsZXJOYW1lcz1PYmplY3Qua2V5cyh0KSx0aGlzLl9jb250cm9sbGVyTGlzdD10aGlzLl9jb250cm9sbGVyTmFtZXMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfSksdGhpcy5fbW9kZT1lLHRoaXMuX2FjdGl2ZT10W2VdLHRoaXMuX2FjdGl2ZXx8KHRoaXMuX21vZGU9InR1cm50YWJsZSIsdGhpcy5fYWN0aXZlPXQudHVybnRhYmxlKSx0aGlzLm1vZGVzPXRoaXMuX2NvbnRyb2xsZXJOYW1lcyx0aGlzLmNvbXB1dGVkTWF0cml4PXRoaXMuX2FjdGl2ZS5jb21wdXRlZE1hdHJpeCx0aGlzLmNvbXB1dGVkRXllPXRoaXMuX2FjdGl2ZS5jb21wdXRlZEV5ZSx0aGlzLmNvbXB1dGVkVXA9dGhpcy5fYWN0aXZlLmNvbXB1dGVkVXAsdGhpcy5jb21wdXRlZENlbnRlcj10aGlzLl9hY3RpdmUuY29tcHV0ZWRDZW50ZXIsdGhpcy5jb21wdXRlZFJhZGl1cz10aGlzLl9hY3RpdmUuY29tcHV0ZWRSYWRpdXN9ZnVuY3Rpb24gaSh0KXt0PXR8fHt9O3ZhciBlPXQuZXllfHxbMCwwLDFdLHI9dC5jZW50ZXJ8fFswLDAsMF0saT10LnVwfHxbMCwxLDBdLGw9dC5kaXN0YW5jZUxpbWl0c3x8WzAsMS8wXSx1PXQubW9kZXx8InR1cm50YWJsZSIsYz1hKCksaD1vKCksZj1zKCk7cmV0dXJuIGMuc2V0RGlzdGFuY2VMaW1pdHMobFswXSxsWzFdKSxjLmxvb2tBdCgwLGUscixpKSxoLnNldERpc3RhbmNlTGltaXRzKGxbMF0sbFsxXSksaC5sb29rQXQoMCxlLHIsaSksZi5zZXREaXN0YW5jZUxpbWl0cyhsWzBdLGxbMV0pLGYubG9va0F0KDAsZSxyLGkpLG5ldyBuKHt0dXJudGFibGU6YyxvcmJpdDpoLG1hdHJpeDpmfSx1KX1lLmV4cG9ydHM9aTt2YXIgYT10KCJ0dXJudGFibGUtY2FtZXJhLWNvbnRyb2xsZXIiKSxvPXQoIm9yYml0LWNhbWVyYS1jb250cm9sbGVyIikscz10KCJtYXRyaXgtY2FtZXJhLWNvbnRyb2xsZXIiKSxsPW4ucHJvdG90eXBlLHU9W1siZmx1c2giLDFdLFsiaWRsZSIsMV0sWyJsb29rQXQiLDRdLFsicm90YXRlIiw0XSxbInBhbiIsNF0sWyJ0cmFuc2xhdGUiLDRdLFsic2V0TWF0cml4IiwyXSxbInNldERpc3RhbmNlTGltaXRzIiwyXSxbInNldERpc3RhbmNlIiwyXV07dS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10WzBdLHI9W10sbj0wO248dFsxXTsrK24pci5wdXNoKCJhIituKTt2YXIgaT0idmFyIGNjPXRoaXMuX2NvbnRyb2xsZXJMaXN0O2Zvcih2YXIgaT0wO2k8Y2MubGVuZ3RoOysraSl7Y2NbaV0uIit0WzBdKyIoIityLmpvaW4oKSsiKX0iO2xbZV09RnVuY3Rpb24uYXBwbHkobnVsbCxyLmNvbmNhdChpKSl9KSxsLnJlY2FsY01hdHJpeD1mdW5jdGlvbih0KXt0aGlzLl9hY3RpdmUucmVjYWxjTWF0cml4KHQpfSxsLmdldERpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hY3RpdmUuZ2V0RGlzdGFuY2UodCl9LGwuZ2V0RGlzdGFuY2VMaW1pdHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2FjdGl2ZS5nZXREaXN0YW5jZUxpbWl0cyh0KX0sbC5sYXN0VD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hY3RpdmUubGFzdFQoKX0sbC5zZXRNb2RlPWZ1bmN0aW9uKHQpe2lmKHQhPT10aGlzLl9tb2RlKXt2YXIgZT10aGlzLl9jb250cm9sbGVyTmFtZXMuaW5kZXhPZih0KTtpZighKGU8MCkpe3ZhciByPXRoaXMuX2FjdGl2ZSxuPXRoaXMuX2NvbnRyb2xsZXJMaXN0W2VdLGk9TWF0aC5tYXgoci5sYXN0VCgpLG4ubGFzdFQoKSk7ci5yZWNhbGNNYXRyaXgoaSksbi5zZXRNYXRyaXgoaSxyLmNvbXB1dGVkTWF0cml4KSx0aGlzLl9hY3RpdmU9bix0aGlzLl9tb2RlPXQsdGhpcy5jb21wdXRlZE1hdHJpeD10aGlzLl9hY3RpdmUuY29tcHV0ZWRNYXRyaXgsdGhpcy5jb21wdXRlZEV5ZT10aGlzLl9hY3RpdmUuY29tcHV0ZWRFeWUsdGhpcy5jb21wdXRlZFVwPXRoaXMuX2FjdGl2ZS5jb21wdXRlZFVwLHRoaXMuY29tcHV0ZWRDZW50ZXI9dGhpcy5fYWN0aXZlLmNvbXB1dGVkQ2VudGVyLHRoaXMuY29tcHV0ZWRSYWRpdXM9dGhpcy5fYWN0aXZlLmNvbXB1dGVkUmFkaXVzfX19LGwuZ2V0TW9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tb2RlfX0seyJtYXRyaXgtY2FtZXJhLWNvbnRyb2xsZXIiOjQxMSwib3JiaXQtY2FtZXJhLWNvbnRyb2xsZXIiOjQzMSwidHVybnRhYmxlLWNhbWVyYS1jb250cm9sbGVyIjo0OTN9XSwyODpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3ZhciBlPXMuZ2V0KHQpO2lmKCFlfHwhdC5pc0J1ZmZlcihlLl90cmlhbmdsZUJ1ZmZlci5idWZmZXIpKXt2YXIgcj1hKHQsbmV3IEZsb2F0MzJBcnJheShbLTEsLTEsLTEsNCw0LC0xXSkpO2U9byh0LFt7YnVmZmVyOnIsdHlwZTp0LkZMT0FULHNpemU6Mn1dKSxlLl90cmlhbmdsZUJ1ZmZlcj1yLHMuc2V0KHQsZSl9ZS5iaW5kKCksdC5kcmF3QXJyYXlzKHQuVFJJQU5HTEVTLDAsMyksZS51bmJpbmQoKX12YXIgaT0idW5kZWZpbmVkIj09dHlwZW9mIFdlYWtNYXA/dCgid2Vhay1tYXAiKTpXZWFrTWFwLGE9dCgiZ2wtYnVmZmVyIiksbz10KCJnbC12YW8iKSxzPW5ldyBpO2UuZXhwb3J0cz1ufSx7ImdsLWJ1ZmZlciI6MTI4LCJnbC12YW8iOjIzNiwid2Vhay1tYXAiOjUxNH1dLDI5OltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUscil7ZT0ibnVtYmVyIj09dHlwZW9mIGU/ZToxLHI9cnx8IjogIjt2YXIgbj10LnNwbGl0KC9ccj9cbi8pLGE9U3RyaW5nKG4ubGVuZ3RoK2UtMSkubGVuZ3RoO3JldHVybiBuLm1hcChmdW5jdGlvbih0LG4pe3ZhciBvPW4rZSxzPVN0cmluZyhvKS5sZW5ndGgsbD1pKG8sYS1zKTtyZXR1cm4gbCtyK3R9KS5qb2luKCJcbiIpfXZhciBpPXQoInBhZC1sZWZ0Iik7ZS5leHBvcnRzPW59LHsicGFkLWxlZnQiOjQzMn1dLDMwOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtmb3IodmFyIHI9bmV3IEFycmF5KGUrMSksbj0wO248dC5sZW5ndGg7KytuKXJbbl09dFtuXTtmb3IodmFyIG49MDtuPD10Lmxlbmd0aDsrK24pe2Zvcih2YXIgaT10Lmxlbmd0aDtpPD1lOysraSl7Zm9yKHZhciBvPW5ldyBBcnJheShlKSxzPTA7czxlOysrcylvW3NdPU1hdGgucG93KGkrMS1uLHMpO3JbaV09b312YXIgbD1hLmFwcGx5KHZvaWQgMCxyKTtpZihsKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIGkodCl7dmFyIGU9dC5sZW5ndGg7aWYoMD09PWUpcmV0dXJuW107aWYoMT09PWUpcmV0dXJuWzBdO2Zvcih2YXIgcj10WzBdLmxlbmd0aCxpPVt0WzBdXSxhPVswXSxvPTE7bzxlOysrbylpZihpLnB1c2godFtvXSksbihpLHIpKXtpZihhLnB1c2gobyksYS5sZW5ndGg9PT1yKzEpcmV0dXJuIGF9ZWxzZSBpLnBvcCgpO3JldHVybiBhfWUuZXhwb3J0cz1pO3ZhciBhPXQoInJvYnVzdC1vcmllbnRhdGlvbiIpfSx7InJvYnVzdC1vcmllbnRhdGlvbiI6NDY1fV0sMzE6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3JldHVybiBpKGUpLmZpbHRlcihmdW5jdGlvbihyKXtmb3IodmFyIG49bmV3IEFycmF5KHIubGVuZ3RoKSxpPTA7aTxyLmxlbmd0aDsrK2kpbltpXT1lW3JbaV1dO3JldHVybiBhKG4pKnQ8MX0pfWUuZXhwb3J0cz1uO3ZhciBpPXQoImRlbGF1bmF5LXRyaWFuZ3VsYXRlIiksYT10KCJjaXJjdW1yYWRpdXMiKX0se2NpcmN1bXJhZGl1czo3NSwiZGVsYXVuYXktdHJpYW5ndWxhdGUiOjk2fV0sMzI6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIGEoaSh0LGUpKX1lLmV4cG9ydHM9bjt2YXIgaT10KCJhbHBoYS1jb21wbGV4IiksYT10KCJzaW1wbGljaWFsLWNvbXBsZXgtYm91bmRhcnkiKX0seyJhbHBoYS1jb21wbGV4IjozMSwic2ltcGxpY2lhbC1jb21wbGV4LWJvdW5kYXJ5Ijo0NzN9XSwzMzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7cmV0dXJuIUFycmF5LmlzQXJyYXkodCkmJm51bGwhPT10JiYib2JqZWN0Ij09dHlwZW9mIHR9ZnVuY3Rpb24gZSh0LGUscil7Zm9yKHZhciBuPShlLXQpL01hdGgubWF4KHItMSwxKSxpPVtdLGE9MDthPHI7YSsrKWkucHVzaCh0K2Eqbik7cmV0dXJuIGl9ZnVuY3Rpb24gcigpe2Zvcih2YXIgdD1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cyksZT10Lm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5sZW5ndGh9KSxyPU1hdGgubWluLmFwcGx5KG51bGwsZSksbj1bXSxpPTA7aTxyO2krKyl7bltpXT1bXTtmb3IodmFyIGE9MDthPHQubGVuZ3RoOysrYSluW2ldW2FdPXRbYV1baV19cmV0dXJuIG59ZnVuY3Rpb24gbih0LGUscil7Zm9yKHZhciBuPU1hdGgubWluLmFwcGx5KG51bGwsW3QubGVuZ3RoLGUubGVuZ3RoLHIubGVuZ3RoXSksaT1bXSxhPTA7YTxuO2ErKylpLnB1c2goW3RbYV0sZVthXSxyW2FdXSk7cmV0dXJuIGl9ZnVuY3Rpb24gaSh0KXtmdW5jdGlvbiBlKHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKUFycmF5LmlzQXJyYXkodFtuXSk/ZSh0W25dLHIpOnIrPXRbbl19dmFyIHI9MDtyZXR1cm4gZSh0LHIpLHJ9ZnVuY3Rpb24gYSh0KXtmb3IodmFyIGU9W10scj0wO3I8dC5sZW5ndGg7KytyKXtlW3JdPVtdO2Zvcih2YXIgbj0wO248dFtyXS5sZW5ndGg7KytuKWVbcl1bbl09dFtyXVtuXX1yZXR1cm4gZX1mdW5jdGlvbiBvKHQpe2Zvcih2YXIgZT1bXSxyPTA7cjx0Lmxlbmd0aDsrK3IpZVtyXT10W3JdO3JldHVybiBlfWZ1bmN0aW9uIHModCxlKXtpZih0Lmxlbmd0aCE9PWUubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgcj10Lmxlbmd0aDtyLS07KWlmKHRbcl0hPT1lW3JdKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGwodCxlKXt2YXIgcixuO2lmKCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gdDtpZihyPVtdLCIjIj09PXRbMF0/KHQ9dC5zdWJzdHIoMSksMz09PXQubGVuZ3RoJiYodCs9dCksbj1wYXJzZUludCh0LDE2KSxyWzBdPW4+PjE2JjI1NSxyWzFdPW4+PjgmMjU1LHJbMl09MjU1Jm4pOmgudGVzdCh0KSYmKG49dC5tYXRjaChmKSxyWzBdPXBhcnNlSW50KG5bMV0pLHJbMV09cGFyc2VJbnQoblsyXSksclsyXT1wYXJzZUludChuWzNdKSksIWUpZm9yKHZhciBpPTA7aTwzOysraSlyW2ldPXJbaV0vMjU1O3JldHVybiByfWZ1bmN0aW9uIHUodCxlKXt2YXIgcixuO2lmKCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gdDtpZihyPVtdLCIjIj09PXRbMF0/KHQ9dC5zdWJzdHIoMSksMz09PXQubGVuZ3RoJiYodCs9dCksbj1wYXJzZUludCh0LDE2KSxyWzBdPW4+PjE2JjI1NSxyWzFdPW4+PjgmMjU1LHJbMl09MjU1Jm4pOmgudGVzdCh0KSYmKG49dC5tYXRjaChmKSxyWzBdPXBhcnNlSW50KG5bMV0pLHJbMV09cGFyc2VJbnQoblsyXSksclsyXT1wYXJzZUludChuWzNdKSxuWzRdP3JbM109cGFyc2VGbG9hdChuWzRdKTpyWzNdPTEpLCFlKWZvcih2YXIgaT0wO2k8MzsrK2kpcltpXT1yW2ldLzI1NTtyZXR1cm4gcn12YXIgYz17fSxoPS9ecmdiYT9cKFxzKlxkezEsM31ccyosXHMqXGR7MSwzfVxzKixccypcZHsxLDN9XHMqKCwuKik/XCkkLyxmPS9ecmdiYT9cKFxzKihcZHsxLDN9KVxzKixccyooXGR7MSwzfSlccyosXHMqKFxkezEsM30pXHMqLD9ccyooLiopP1wpJC87cmV0dXJuIGMuaXNQbGFpbk9iamVjdD10LGMubGluc3BhY2U9ZSxjLnppcDM9bixjLnN1bT1pLGMuemlwPXIsYy5pc0VxdWFsPXMsYy5jb3B5MkQ9YSxjLmNvcHkxRD1vLGMuc3RyMlJnYkFycmF5PWwsYy5zdHIyUmdiYUFycmF5PXUsY307ZS5leHBvcnRzPW4oKX0se31dLDM0OltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUpe3JldHVybiBkLmlzVW5kZWZpbmVkKGUpPyIiK2U6ZC5pc051bWJlcihlKSYmIWlzRmluaXRlKGUpP2UudG9TdHJpbmcoKTpkLmlzRnVuY3Rpb24oZSl8fGQuaXNSZWdFeHAoZSk/ZS50b1N0cmluZygpOmV9ZnVuY3Rpb24gaSh0LGUpe3JldHVybiBkLmlzU3RyaW5nKHQpP3QubGVuZ3RoPGU/dDp0LnNsaWNlKDAsZSk6dH1mdW5jdGlvbiBhKHQpe3JldHVybiBpKEpTT04uc3RyaW5naWZ5KHQuYWN0dWFsLG4pLDEyOCkrIiAiK3Qub3BlcmF0b3IrIiAiK2koSlNPTi5zdHJpbmdpZnkodC5leHBlY3RlZCxuKSwxMjgpfWZ1bmN0aW9uIG8odCxlLHIsbixpKXt0aHJvdyBuZXcgbS5Bc3NlcnRpb25FcnJvcih7bWVzc2FnZTpyLGFjdHVhbDp0LGV4cGVjdGVkOmUsb3BlcmF0b3I6bixzdGFja1N0YXJ0RnVuY3Rpb246aX0pfWZ1bmN0aW9uIHModCxlKXt0fHxvKHQsITAsZSwiPT0iLG0ub2spfWZ1bmN0aW9uIGwodCxlKXtpZih0PT09ZSlyZXR1cm4hMDtpZihkLmlzQnVmZmVyKHQpJiZkLmlzQnVmZmVyKGUpKXtpZih0Lmxlbmd0aCE9ZS5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspaWYodFtyXSE9PWVbcl0pcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIGQuaXNEYXRlKHQpJiZkLmlzRGF0ZShlKT90LmdldFRpbWUoKT09PWUuZ2V0VGltZSgpOmQuaXNSZWdFeHAodCkmJmQuaXNSZWdFeHAoZSk/dC5zb3VyY2U9PT1lLnNvdXJjZSYmdC5nbG9iYWw9PT1lLmdsb2JhbCYmdC5tdWx0aWxpbmU9PT1lLm11bHRpbGluZSYmdC5sYXN0SW5kZXg9PT1lLmxhc3RJbmRleCYmdC5pZ25vcmVDYXNlPT09ZS5pZ25vcmVDYXNlOmQuaXNPYmplY3QodCl8fGQuaXNPYmplY3QoZSk/Yyh0LGUpOnQ9PWV9ZnVuY3Rpb24gdSh0KXtyZXR1cm4iW29iamVjdCBBcmd1bWVudHNdIj09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIGModCxlKXtpZihkLmlzTnVsbE9yVW5kZWZpbmVkKHQpfHxkLmlzTnVsbE9yVW5kZWZpbmVkKGUpKXJldHVybiExO2lmKHQucHJvdG90eXBlIT09ZS5wcm90b3R5cGUpcmV0dXJuITE7aWYoZC5pc1ByaW1pdGl2ZSh0KXx8ZC5pc1ByaW1pdGl2ZShlKSlyZXR1cm4gdD09PWU7dmFyIHI9dSh0KSxuPXUoZSk7aWYociYmIW58fCFyJiZuKXJldHVybiExO2lmKHIpcmV0dXJuIHQ9cC5jYWxsKHQpLGU9cC5jYWxsKGUpLGwodCxlKTt2YXIgaSxhLG89dih0KSxzPXYoZSk7aWYoby5sZW5ndGghPXMubGVuZ3RoKXJldHVybiExO2ZvcihvLnNvcnQoKSxzLnNvcnQoKSxhPW8ubGVuZ3RoLTE7YT49MDthLS0paWYob1thXSE9c1thXSlyZXR1cm4hMTtmb3IoYT1vLmxlbmd0aC0xO2E+PTA7YS0tKWlmKGk9b1thXSwhbCh0W2ldLGVbaV0pKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGgodCxlKXtyZXR1cm4hKCF0fHwhZSkmJigiW29iamVjdCBSZWdFeHBdIj09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpP2UudGVzdCh0KTp0IGluc3RhbmNlb2YgZXx8ZS5jYWxsKHt9LHQpPT09ITApfWZ1bmN0aW9uIGYodCxlLHIsbil7dmFyIGk7ZC5pc1N0cmluZyhyKSYmKG49cixyPW51bGwpO3RyeXtlKCl9Y2F0Y2godCl7aT10fWlmKG49KHImJnIubmFtZT8iICgiK3IubmFtZSsiKS4iOiIuIikrKG4/IiAiK246Ii4iKSx0JiYhaSYmbyhpLHIsIk1pc3NpbmcgZXhwZWN0ZWQgZXhjZXB0aW9uIituKSwhdCYmaChpLHIpJiZvKGksciwiR290IHVud2FudGVkIGV4Y2VwdGlvbiIrbiksdCYmaSYmciYmIWgoaSxyKXx8IXQmJmkpdGhyb3cgaX12YXIgZD10KCJ1dGlsLyIpLHA9QXJyYXkucHJvdG90eXBlLnNsaWNlLGc9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxtPWUuZXhwb3J0cz1zO20uQXNzZXJ0aW9uRXJyb3I9ZnVuY3Rpb24odCl7dGhpcy5uYW1lPSJBc3NlcnRpb25FcnJvciIsdGhpcy5hY3R1YWw9dC5hY3R1YWwsdGhpcy5leHBlY3RlZD10LmV4cGVjdGVkLHRoaXMub3BlcmF0b3I9dC5vcGVyYXRvcix0Lm1lc3NhZ2U/KHRoaXMubWVzc2FnZT10Lm1lc3NhZ2UsdGhpcy5nZW5lcmF0ZWRNZXNzYWdlPSExKToodGhpcy5tZXNzYWdlPWEodGhpcyksdGhpcy5nZW5lcmF0ZWRNZXNzYWdlPSEwKTt2YXIgZT10LnN0YWNrU3RhcnRGdW5jdGlvbnx8bztpZihFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSlFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLGUpO2Vsc2V7dmFyIHI9bmV3IEVycm9yO2lmKHIuc3RhY2spe3ZhciBuPXIuc3RhY2ssaT1lLm5hbWUscz1uLmluZGV4T2YoIlxuIitpKTtpZihzPj0wKXt2YXIgbD1uLmluZGV4T2YoIlxuIixzKzEpO249bi5zdWJzdHJpbmcobCsxKX10aGlzLnN0YWNrPW59fX0sZC5pbmhlcml0cyhtLkFzc2VydGlvbkVycm9yLEVycm9yKSxtLmZhaWw9byxtLm9rPXMsbS5lcXVhbD1mdW5jdGlvbih0LGUscil7dCE9ZSYmbyh0LGUsciwiPT0iLG0uZXF1YWwpfSxtLm5vdEVxdWFsPWZ1bmN0aW9uKHQsZSxyKXt0PT1lJiZvKHQsZSxyLCIhPSIsbS5ub3RFcXVhbCl9LG0uZGVlcEVxdWFsPWZ1bmN0aW9uKHQsZSxyKXtsKHQsZSl8fG8odCxlLHIsImRlZXBFcXVhbCIsbS5kZWVwRXF1YWwpfSxtLm5vdERlZXBFcXVhbD1mdW5jdGlvbih0LGUscil7bCh0LGUpJiZvKHQsZSxyLCJub3REZWVwRXF1YWwiLG0ubm90RGVlcEVxdWFsKX0sbS5zdHJpY3RFcXVhbD1mdW5jdGlvbih0LGUscil7dCE9PWUmJm8odCxlLHIsIj09PSIsbS5zdHJpY3RFcXVhbCl9LG0ubm90U3RyaWN0RXF1YWw9ZnVuY3Rpb24odCxlLHIpe3Q9PT1lJiZvKHQsZSxyLCIhPT0iLG0ubm90U3RyaWN0RXF1YWwpfSxtLnRocm93cz1mdW5jdGlvbih0LGUscil7Zi5hcHBseSh0aGlzLFshMF0uY29uY2F0KHAuY2FsbChhcmd1bWVudHMpKSl9LG0uZG9lc05vdFRocm93PWZ1bmN0aW9uKHQsZSl7Zi5hcHBseSh0aGlzLFshMV0uY29uY2F0KHAuY2FsbChhcmd1bWVudHMpKSl9LG0uaWZFcnJvcj1mdW5jdGlvbih0KXtpZih0KXRocm93IHR9O3ZhciB2PU9iamVjdC5rZXlzfHxmdW5jdGlvbih0KXt2YXIgZT1bXTtmb3IodmFyIHIgaW4gdClnLmNhbGwodCxyKSYmZS5wdXNoKHIpO3JldHVybiBlfX0seyJ1dGlsLyI6NTA0fV0sMzU6W2Z1bmN0aW9uKHQsZSxyKXtlLmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGF0b2IodCl9fSx7fV0sMzY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtmb3IodmFyIGU9MCxyPTA7cjx0Lmxlbmd0aDsrK3IpZSs9dFtyXTtyZXR1cm4gZX1mdW5jdGlvbiBpKHQsZSl7Zm9yKHZhciByPWUubGVuZ3RoLGk9bmV3IEFycmF5KHIrMSksbz0wO288cjsrK28pe2Zvcih2YXIgcz1uZXcgQXJyYXkocisxKSxsPTA7bDw9cjsrK2wpc1tsXT10W2xdW29dO2lbb109c31pW3JdPW5ldyBBcnJheShyKzEpO2Zvcih2YXIgbz0wO288PXI7KytvKWlbcl1bb109MTtmb3IodmFyIHU9bmV3IEFycmF5KHIrMSksbz0wO288cjsrK28pdVtvXT1lW29dO3Vbcl09MTt2YXIgYz1hKGksdSksaD1uKGNbcisxXSk7MD09PWgmJihoPTEpO2Zvcih2YXIgZj1uZXcgQXJyYXkocisxKSxvPTA7bzw9cjsrK28pZltvXT1uKGNbb10pL2g7cmV0dXJuIGZ9ZS5leHBvcnRzPWk7dmFyIGE9dCgicm9idXN0LWxpbmVhci1zb2x2ZSIpfSx7InJvYnVzdC1saW5lYXItc29sdmUiOjQ2NH1dLDM3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gaSh0WzBdLm11bChlWzFdKS5hZGQoZVswXS5tdWwodFsxXSkpLHRbMV0ubXVsKGVbMV0pKX12YXIgaT10KCIuL2xpYi9yYXRpb25hbGl6ZSIpO2UuZXhwb3J0cz1ufSx7Ii4vbGliL3JhdGlvbmFsaXplIjo0N31dLDM4OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gdFswXS5tdWwoZVsxXSkuY21wKGVbMF0ubXVsKHRbMV0pKX1lLmV4cG9ydHM9bn0se31dLDM5OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gaSh0WzBdLm11bChlWzFdKSx0WzFdLm11bChlWzBdKSl9dmFyIGk9dCgiLi9saWIvcmF0aW9uYWxpemUiKTtlLmV4cG9ydHM9bn0seyIuL2xpYi9yYXRpb25hbGl6ZSI6NDd9XSw0MDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7aWYoaSh0KSlyZXR1cm4gZT91KHQsbihlKSk6W3RbMF0uY2xvbmUoKSx0WzFdLmNsb25lKCldO3ZhciByLGMsaD0wO2lmKGEodCkpcj10LmNsb25lKCk7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIHQpcj1zKHQpO2Vsc2V7aWYoMD09PXQpcmV0dXJuW28oMCksbygxKV07aWYodD09PU1hdGguZmxvb3IodCkpcj1vKHQpO2Vsc2V7Zm9yKDt0IT09TWF0aC5mbG9vcih0KTspdCo9TWF0aC5wb3coMiwyNTYpLGgtPTI1NjtyPW8odCl9fWlmKGkoZSkpci5tdWwoZVsxXSksYz1lWzBdLmNsb25lKCk7ZWxzZSBpZihhKGUpKWM9ZS5jbG9uZSgpO2Vsc2UgaWYoInN0cmluZyI9PXR5cGVvZiBlKWM9cyhlKTtlbHNlIGlmKGUpaWYoZT09PU1hdGguZmxvb3IoZSkpYz1vKGUpO2Vsc2V7Zm9yKDtlIT09TWF0aC5mbG9vcihlKTspZSo9TWF0aC5wb3coMiwyNTYpLGgrPTI1NjtjPW8oZSl9ZWxzZSBjPW8oMSk7cmV0dXJuIGg+MD9yPXIuc2hsbihoKTpoPDAmJihjPWMuc2hsbigtaCkpLGwocixjKX12YXIgaT10KCIuL2lzLXJhdCIpLGE9dCgiLi9saWIvaXMtYm4iKSxvPXQoIi4vbGliL251bS10by1ibiIpLHM9dCgiLi9saWIvc3RyLXRvLWJuIiksbD10KCIuL2xpYi9yYXRpb25hbGl6ZSIpLHU9dCgiLi9kaXYiKTtlLmV4cG9ydHM9bn0seyIuL2RpdiI6MzksIi4vaXMtcmF0Ijo0MSwiLi9saWIvaXMtYm4iOjQ1LCIuL2xpYi9udW0tdG8tYm4iOjQ2LCIuL2xpYi9yYXRpb25hbGl6ZSI6NDcsIi4vbGliL3N0ci10by1ibiI6NDh9XSw0MTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpJiYyPT09dC5sZW5ndGgmJmkodFswXSkmJmkodFsxXSl9dmFyIGk9dCgiLi9saWIvaXMtYm4iKTtlLmV4cG9ydHM9bn0seyIuL2xpYi9pcy1ibiI6NDV9XSw0MjpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3JldHVybiB0LmNtcChuZXcgaSgwKSl9dmFyIGk9dCgiYm4uanMiKTtlLmV4cG9ydHM9bn0seyJibi5qcyI6NTV9XSw0MzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3ZhciBlPXQubGVuZ3RoLHI9dC53b3JkcyxuPTA7aWYoMT09PWUpbj1yWzBdO2Vsc2UgaWYoMj09PWUpbj1yWzBdKzY3MTA4ODY0KnJbMV07ZWxzZSBmb3IodmFyIG49MCxpPTA7aTxlO2krKyl7dmFyIGE9cltpXTtuKz1hKk1hdGgucG93KDY3MTA4ODY0LGkpfXJldHVybiB0LnNpZ24/LW46bn1lLmV4cG9ydHM9bn0se31dLDQ0OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGU9YShpLmxvKHQpKTtpZihlPDMyKXJldHVybiBlO3ZhciByPWEoaS5oaSh0KSk7cmV0dXJuIHI+MjA/NTI6ciszMn12YXIgaT10KCJkb3VibGUtYml0cyIpLGE9dCgiYml0LXR3aWRkbGUiKS5jb3VudFRyYWlsaW5nWmVyb3M7ZS5leHBvcnRzPW59LHsiYml0LXR3aWRkbGUiOjU0LCJkb3VibGUtYml0cyI6OTd9XSw0NTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3JldHVybiB0JiYib2JqZWN0Ij09dHlwZW9mIHQmJkJvb2xlYW4odC53b3Jkcyl9dCgiYm4uanMiKTtlLmV4cG9ydHM9bn0seyJibi5qcyI6NTV9XSw0NjpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3ZhciBlPWEuZXhwb25lbnQodCk7cmV0dXJuIGU8NTI/bmV3IGkodCk6bmV3IGkodCpNYXRoLnBvdygyLDUyLWUpKS5zaGxuKGUtNTIpfXZhciBpPXQoImJuLmpzIiksYT10KCJkb3VibGUtYml0cyIpO2UuZXhwb3J0cz1ufSx7ImJuLmpzIjo1NSwiZG91YmxlLWJpdHMiOjk3fV0sNDc6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3ZhciByPWEodCksbj1hKGUpO2lmKDA9PT1yKXJldHVybltpKDApLGkoMSldO2lmKDA9PT1uKXJldHVybltpKDApLGkoMCldO248MCYmKHQ9dC5uZWcoKSxlPWUubmVnKCkpO3ZhciBvPXQuZ2NkKGUpO3JldHVybiBvLmNtcG4oMSk/W3QuZGl2KG8pLGUuZGl2KG8pXTpbdCxlXX12YXIgaT10KCIuL251bS10by1ibiIpLGE9dCgiLi9ibi1zaWduIik7ZS5leHBvcnRzPW59LHsiLi9ibi1zaWduIjo0MiwiLi9udW0tdG8tYm4iOjQ2fV0sNDg6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtyZXR1cm4gbmV3IGkodCl9dmFyIGk9dCgiYm4uanMiKTtlLmV4cG9ydHM9bn0seyJibi5qcyI6NTV9XSw0OTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIGkodFswXS5tdWwoZVswXSksdFsxXS5tdWwoZVsxXSkpfXZhciBpPXQoIi4vbGliL3JhdGlvbmFsaXplIik7ZS5leHBvcnRzPW59LHsiLi9saWIvcmF0aW9uYWxpemUiOjQ3fV0sNTA6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtyZXR1cm4gaSh0WzBdKSppKHRbMV0pfXZhciBpPXQoIi4vbGliL2JuLXNpZ24iKTtlLmV4cG9ydHM9bn0seyIuL2xpYi9ibi1zaWduIjo0Mn1dLDUxOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gaSh0WzBdLm11bChlWzFdKS5zdWIodFsxXS5tdWwoZVswXSkpLHRbMV0ubXVsKGVbMV0pKX12YXIgaT10KCIuL2xpYi9yYXRpb25hbGl6ZSIpO2UuZXhwb3J0cz1ufSx7Ii4vbGliL3JhdGlvbmFsaXplIjo0N31dLDUyOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGU9dFswXSxyPXRbMV07aWYoMD09PWUuY21wbigwKSlyZXR1cm4gMDt2YXIgbj1lLmRpdm1vZChyKSxvPW4uZGl2LHM9aShvKSxsPW4ubW9kO2lmKDA9PT1sLmNtcG4oMCkpcmV0dXJuIHM7aWYocyl7dmFyIHU9YShzKSs0LGM9aShsLnNobG4odSkuZGl2Um91bmQocikpO3JldHVybiBzPDAmJihjPS1jKSxzK2MqTWF0aC5wb3coMiwtdSl9dmFyIGg9ci5iaXRMZW5ndGgoKS1sLmJpdExlbmd0aCgpKzUzLGM9aShsLnNobG4oaCkuZGl2Um91bmQocikpO3JldHVybiBoPDEwMjM/YypNYXRoLnBvdygyLC1oKTooYyo9TWF0aC5wb3coMiwtMTAyMyksYypNYXRoLnBvdygyLDEwMjMtaCkpfXZhciBpPXQoIi4vbGliL2JuLXRvLW51bSIpLGE9dCgiLi9saWIvY3R6Iik7ZS5leHBvcnRzPW59LHsiLi9saWIvYm4tdG8tbnVtIjo0MywiLi9saWIvY3R6Ijo0NH1dLDUzOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbixpLGEpe3ZhciBvPVsiZnVuY3Rpb24gIix0LCIoYSxsLGgsIixuLmpvaW4oIiwiKSwiKXsiLGE/IiI6InZhciBpPSIscj8ibC0xIjoiaCsxIiwiO3doaWxlKGw8PWgpe3ZhciBtPShsK2gpPj4+MSx4PWEiLGk/Ii5nZXQobSkiOiJbbV0iXTtyZXR1cm4gYT9lLmluZGV4T2YoImMiKTwwP28ucHVzaCgiO2lmKHg9PT15KXtyZXR1cm4gbX1lbHNlIGlmKHg8PXkpeyIpOm8ucHVzaCgiO3ZhciBwPWMoeCx5KTtpZihwPT09MCl7cmV0dXJuIG19ZWxzZSBpZihwPD0wKXsiKTpvLnB1c2goIjtpZigiLGUsIil7aT1tOyIpLHI/by5wdXNoKCJsPW0rMX1lbHNle2g9bS0xfSIpOm8ucHVzaCgiaD1tLTF9ZWxzZXtsPW0rMX0iKSxvLnB1c2goIn0iKSxhP28ucHVzaCgicmV0dXJuIC0xfTsiKTpvLnB1c2goInJldHVybiBpfTsiKSxvLmpvaW4oIiIpfWZ1bmN0aW9uIGkodCxlLHIsaSl7dmFyIGE9bmV3IEZ1bmN0aW9uKFtuKCJBIiwieCIrdCsieSIsZSxbInkiXSwhMSxpKSxuKCJCIiwieCIrdCsieSIsZSxbInkiXSwhMCxpKSxuKCJQIiwiYyh4LHkpIit0KyIwIixlLFsieSIsImMiXSwhMSxpKSxuKCJRIiwiYyh4LHkpIit0KyIwIixlLFsieSIsImMiXSwhMCxpKSwiZnVuY3Rpb24gZGlzcGF0Y2hCc2VhcmNoIixyLCIoYSx5LGMsbCxoKXtpZihhLnNoYXBlKXtpZih0eXBlb2YoYyk9PT0nZnVuY3Rpb24nKXtyZXR1cm4gUShhLChsPT09dW5kZWZpbmVkKT8wOmx8MCwoaD09PXVuZGVmaW5lZCk/YS5zaGFwZVswXS0xOmh8MCx5LGMpfWVsc2V7cmV0dXJuIEIoYSwoYz09PXVuZGVmaW5lZCk/MDpjfDAsKGw9PT11bmRlZmluZWQpP2Euc2hhcGVbMF0tMTpsfDAseSl9fWVsc2V7aWYodHlwZW9mKGMpPT09J2Z1bmN0aW9uJyl7cmV0dXJuIFAoYSwobD09PXVuZGVmaW5lZCk/MDpsfDAsKGg9PT11bmRlZmluZWQpP2EubGVuZ3RoLTE6aHwwLHksYyl9ZWxzZXtyZXR1cm4gQShhLChjPT09dW5kZWZpbmVkKT8wOmN8MCwobD09PXVuZGVmaW5lZCk/YS5sZW5ndGgtMTpsfDAseSl9fX1yZXR1cm4gZGlzcGF0Y2hCc2VhcmNoIixyXS5qb2luKCIiKSk7cmV0dXJuIGEoKX1lLmV4cG9ydHM9e2dlOmkoIj49IiwhMSwiR0UiKSxndDppKCI+IiwhMSwiR1QiKSxsdDppKCI8IiwhMCwiTFQiKSxsZTppKCI8PSIsITAsIkxFIiksZXE6aSgiLSIsITAsIkVRIiwhMCl9fSx7fV0sNTQ6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7InVzZSByZXN0cmljdCI7CmZ1bmN0aW9uIG4odCl7dmFyIGU9MzI7cmV0dXJuIHQmPS10LHQmJmUtLSw2NTUzNSZ0JiYoZS09MTYpLDE2NzExOTM1JnQmJihlLT04KSwyNTI2NDUxMzUmdCYmKGUtPTQpLDg1ODk5MzQ1OSZ0JiYoZS09MiksMTQzMTY1NTc2NSZ0JiYoZS09MSksZX12YXIgaT0zMjtyLklOVF9CSVRTPWksci5JTlRfTUFYPTIxNDc0ODM2NDcsci5JTlRfTUlOPS0xPDxpLTEsci5zaWduPWZ1bmN0aW9uKHQpe3JldHVybih0PjApLSh0PDApfSxyLmFicz1mdW5jdGlvbih0KXt2YXIgZT10Pj5pLTE7cmV0dXJuKHReZSktZX0sci5taW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gZV4odF5lKSYtKHQ8ZSl9LHIubWF4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHReKHReZSkmLSh0PGUpfSxyLmlzUG93Mj1mdW5jdGlvbih0KXtyZXR1cm4hKHQmdC0xfHwhdCl9LHIubG9nMj1mdW5jdGlvbih0KXt2YXIgZSxyO3JldHVybiBlPSh0PjY1NTM1KTw8NCx0Pj4+PWUscj0odD4yNTUpPDwzLHQ+Pj49cixlfD1yLHI9KHQ+MTUpPDwyLHQ+Pj49cixlfD1yLHI9KHQ+Myk8PDEsdD4+Pj1yLGV8PXIsZXx0Pj4xfSxyLmxvZzEwPWZ1bmN0aW9uKHQpe3JldHVybiB0Pj0xZTk/OTp0Pj0xZTg/ODp0Pj0xZTc/Nzp0Pj0xZTY/Njp0Pj0xZTU/NTp0Pj0xZTQ/NDp0Pj0xZTM/Mzp0Pj0xMDA/Mjp0Pj0xMD8xOjB9LHIucG9wQ291bnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQtPXQ+Pj4xJjE0MzE2NTU3NjUsdD0oODU4OTkzNDU5JnQpKyh0Pj4+MiY4NTg5OTM0NTkpLDE2ODQzMDA5Kih0Kyh0Pj4+NCkmMjUyNjQ1MTM1KT4+PjI0fSxyLmNvdW50VHJhaWxpbmdaZXJvcz1uLHIubmV4dFBvdzI9ZnVuY3Rpb24odCl7cmV0dXJuIHQrPTA9PT10LC0tdCx0fD10Pj4+MSx0fD10Pj4+Mix0fD10Pj4+NCx0fD10Pj4+OCx0fD10Pj4+MTYsdCsxfSxyLnByZXZQb3cyPWZ1bmN0aW9uKHQpe3JldHVybiB0fD10Pj4+MSx0fD10Pj4+Mix0fD10Pj4+NCx0fD10Pj4+OCx0fD10Pj4+MTYsdC0odD4+PjEpfSxyLnBhcml0eT1mdW5jdGlvbih0KXtyZXR1cm4gdF49dD4+PjE2LHRePXQ+Pj44LHRePXQ+Pj40LHQmPTE1LDI3MDMwPj4+dCYxfTt2YXIgYT1uZXcgQXJyYXkoMjU2KTshZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTwyNTY7KytlKXt2YXIgcj1lLG49ZSxpPTc7Zm9yKHI+Pj49MTtyO3I+Pj49MSluPDw9MSxufD0xJnIsLS1pO3RbZV09bjw8aSYyNTV9fShhKSxyLnJldmVyc2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFbMjU1JnRdPDwyNHxhW3Q+Pj44JjI1NV08PDE2fGFbdD4+PjE2JjI1NV08PDh8YVt0Pj4+MjQmMjU1XX0sci5pbnRlcmxlYXZlMj1mdW5jdGlvbih0LGUpe3JldHVybiB0Jj02NTUzNSx0PTE2NzExOTM1Jih0fHQ8PDgpLHQ9MjUyNjQ1MTM1Jih0fHQ8PDQpLHQ9ODU4OTkzNDU5Jih0fHQ8PDIpLHQ9MTQzMTY1NTc2NSYodHx0PDwxKSxlJj02NTUzNSxlPTE2NzExOTM1JihlfGU8PDgpLGU9MjUyNjQ1MTM1JihlfGU8PDQpLGU9ODU4OTkzNDU5JihlfGU8PDIpLGU9MTQzMTY1NTc2NSYoZXxlPDwxKSx0fGU8PDF9LHIuZGVpbnRlcmxlYXZlMj1mdW5jdGlvbih0LGUpe3JldHVybiB0PXQ+Pj5lJjE0MzE2NTU3NjUsdD04NTg5OTM0NTkmKHR8dD4+PjEpLHQ9MjUyNjQ1MTM1Jih0fHQ+Pj4yKSx0PTE2NzExOTM1Jih0fHQ+Pj40KSx0PTY1NTM1Jih0fHQ+Pj4xNiksdDw8MTY+PjE2fSxyLmludGVybGVhdmUzPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdCY9MTAyMyx0PTQyNzgxOTAzMzUmKHR8dDw8MTYpLHQ9MjUxNzE5Njk1Jih0fHQ8PDgpLHQ9MzI3MjM1NjAzNSYodHx0PDw0KSx0PTEyMjcxMzM1MTMmKHR8dDw8MiksZSY9MTAyMyxlPTQyNzgxOTAzMzUmKGV8ZTw8MTYpLGU9MjUxNzE5Njk1JihlfGU8PDgpLGU9MzI3MjM1NjAzNSYoZXxlPDw0KSxlPTEyMjcxMzM1MTMmKGV8ZTw8MiksdHw9ZTw8MSxyJj0xMDIzLHI9NDI3ODE5MDMzNSYocnxyPDwxNikscj0yNTE3MTk2OTUmKHJ8cjw8OCkscj0zMjcyMzU2MDM1JihyfHI8PDQpLHI9MTIyNzEzMzUxMyYocnxyPDwyKSx0fHI8PDJ9LHIuZGVpbnRlcmxlYXZlMz1mdW5jdGlvbih0LGUpe3JldHVybiB0PXQ+Pj5lJjEyMjcxMzM1MTMsdD0zMjcyMzU2MDM1Jih0fHQ+Pj4yKSx0PTI1MTcxOTY5NSYodHx0Pj4+NCksdD00Mjc4MTkwMzM1Jih0fHQ+Pj44KSx0PTEwMjMmKHR8dD4+PjE2KSx0PDwyMj4+MjJ9LHIubmV4dENvbWJpbmF0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPXR8dC0xO3JldHVybiBlKzF8KH5lJi1+ZSktMT4+Pm4odCkrMX19LHt9XSw1NTpbZnVuY3Rpb24odCxlLHIpeyFmdW5jdGlvbih0LGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKHQsZSl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKGV8fCJBc3NlcnRpb24gZmFpbGVkIil9ZnVuY3Rpb24gbih0LGUpe3Quc3VwZXJfPWU7dmFyIHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPWUucHJvdG90eXBlLHQucHJvdG90eXBlPW5ldyByLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXR9ZnVuY3Rpb24gaSh0LGUscil7cmV0dXJuIG51bGwhPT10JiYib2JqZWN0Ij09dHlwZW9mIHQmJkFycmF5LmlzQXJyYXkodC53b3Jkcyk/dDoodGhpcy5zaWduPSExLHRoaXMud29yZHM9bnVsbCx0aGlzLmxlbmd0aD0wLHRoaXMucmVkPW51bGwsImxlIiE9PWUmJiJiZSIhPT1lfHwocj1lLGU9MTApLHZvaWQobnVsbCE9PXQmJnRoaXMuX2luaXQodHx8MCxlfHwxMCxyfHwiYmUiKSkpfWZ1bmN0aW9uIGEodCxlLHIpe2Zvcih2YXIgbj0wLGk9TWF0aC5taW4odC5sZW5ndGgsciksYT1lO2E8aTthKyspe3ZhciBvPXQuY2hhckNvZGVBdChhKS00ODtuPDw9NCxufD1vPj00OSYmbzw9NTQ/by00OSsxMDpvPj0xNyYmbzw9MjI/by0xNysxMDoxNSZvfXJldHVybiBufWZ1bmN0aW9uIG8odCxlLHIsbil7Zm9yKHZhciBpPTAsYT1NYXRoLm1pbih0Lmxlbmd0aCxyKSxvPWU7bzxhO28rKyl7dmFyIHM9dC5jaGFyQ29kZUF0KG8pLTQ4O2kqPW4saSs9cz49NDk/cy00OSsxMDpzPj0xNz9zLTE3KzEwOnN9cmV0dXJuIGl9ZnVuY3Rpb24gcyh0LGUpe3RoaXMubmFtZT10LHRoaXMucD1uZXcgaShlLDE2KSx0aGlzLm49dGhpcy5wLmJpdExlbmd0aCgpLHRoaXMuaz1uZXcgaSgxKS5pc2hsbih0aGlzLm4pLmlzdWIodGhpcy5wKSx0aGlzLnRtcD10aGlzLl90bXAoKX1mdW5jdGlvbiBsKCl7cy5jYWxsKHRoaXMsImsyNTYiLCJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmMyZiIpfWZ1bmN0aW9uIHUoKXtzLmNhbGwodGhpcywicDIyNCIsImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxIil9ZnVuY3Rpb24gYygpe3MuY2FsbCh0aGlzLCJwMTkyIiwiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgZmZmZmZmZmYiKX1mdW5jdGlvbiBoKCl7cy5jYWxsKHRoaXMsIjI1NTE5IiwiN2ZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZlZCIpfWZ1bmN0aW9uIGYodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXt2YXIgZT1pLl9wcmltZSh0KTt0aGlzLm09ZS5wLHRoaXMucHJpbWU9ZX1lbHNlIHRoaXMubT10LHRoaXMucHJpbWU9bnVsbH1mdW5jdGlvbiBkKHQpe2YuY2FsbCh0aGlzLHQpLHRoaXMuc2hpZnQ9dGhpcy5tLmJpdExlbmd0aCgpLHRoaXMuc2hpZnQlMjYhPT0wJiYodGhpcy5zaGlmdCs9MjYtdGhpcy5zaGlmdCUyNiksdGhpcy5yPW5ldyBpKDEpLmlzaGxuKHRoaXMuc2hpZnQpLHRoaXMucjI9dGhpcy5pbW9kKHRoaXMuci5zcXIoKSksdGhpcy5yaW52PXRoaXMuci5faW52bXAodGhpcy5tKSx0aGlzLm1pbnY9dGhpcy5yaW52Lm11bCh0aGlzLnIpLmlzdWJuKDEpLmRpdih0aGlzLm0pLHRoaXMubWludi5zaWduPSEwLHRoaXMubWludj10aGlzLm1pbnYubW9kKHRoaXMucil9Im9iamVjdCI9PXR5cGVvZiB0P3QuZXhwb3J0cz1pOmUuQk49aSxpLkJOPWksaS53b3JkU2l6ZT0yNixpLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbih0LGUsbil7aWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVybiB0aGlzLl9pbml0TnVtYmVyKHQsZSxuKTtpZigib2JqZWN0Ij09dHlwZW9mIHQpcmV0dXJuIHRoaXMuX2luaXRBcnJheSh0LGUsbik7ImhleCI9PT1lJiYoZT0xNikscihlPT09KDB8ZSkmJmU+PTImJmU8PTM2KSx0PXQudG9TdHJpbmcoKS5yZXBsYWNlKC9ccysvZywiIik7dmFyIGk9MDsiLSI9PT10WzBdJiZpKyssMTY9PT1lP3RoaXMuX3BhcnNlSGV4KHQsaSk6dGhpcy5fcGFyc2VCYXNlKHQsZSxpKSwiLSI9PT10WzBdJiYodGhpcy5zaWduPSEwKSx0aGlzLnN0cmlwKCksImxlIj09PW4mJnRoaXMuX2luaXRBcnJheSh0aGlzLnRvQXJyYXkoKSxlLG4pfSxpLnByb3RvdHlwZS5faW5pdE51bWJlcj1mdW5jdGlvbih0LGUsbil7dDwwJiYodGhpcy5zaWduPSEwLHQ9LXQpLHQ8NjcxMDg4NjQ/KHRoaXMud29yZHM9WzY3MTA4ODYzJnRdLHRoaXMubGVuZ3RoPTEpOnQ8NDUwMzU5OTYyNzM3MDQ5Nj8odGhpcy53b3Jkcz1bNjcxMDg4NjMmdCx0LzY3MTA4ODY0JjY3MTA4ODYzXSx0aGlzLmxlbmd0aD0yKToocih0PDkwMDcxOTkyNTQ3NDA5OTIpLHRoaXMud29yZHM9WzY3MTA4ODYzJnQsdC82NzEwODg2NCY2NzEwODg2MywxXSx0aGlzLmxlbmd0aD0zKSwibGUiPT09biYmdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLGUsbil9LGkucHJvdG90eXBlLl9pbml0QXJyYXk9ZnVuY3Rpb24odCxlLG4pe2lmKHIoIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCksdC5sZW5ndGg8PTApcmV0dXJuIHRoaXMud29yZHM9WzBdLHRoaXMubGVuZ3RoPTEsdGhpczt0aGlzLmxlbmd0aD1NYXRoLmNlaWwodC5sZW5ndGgvMyksdGhpcy53b3Jkcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgpO2Zvcih2YXIgaT0wO2k8dGhpcy5sZW5ndGg7aSsrKXRoaXMud29yZHNbaV09MDt2YXIgYT0wO2lmKCJiZSI9PT1uKWZvcih2YXIgaT10Lmxlbmd0aC0xLG89MDtpPj0wO2ktPTMpe3ZhciBzPXRbaV18dFtpLTFdPDw4fHRbaS0yXTw8MTY7dGhpcy53b3Jkc1tvXXw9czw8YSY2NzEwODg2Myx0aGlzLndvcmRzW28rMV09cz4+PjI2LWEmNjcxMDg4NjMsYSs9MjQsYT49MjYmJihhLT0yNixvKyspfWVsc2UgaWYoImxlIj09PW4pZm9yKHZhciBpPTAsbz0wO2k8dC5sZW5ndGg7aSs9Myl7dmFyIHM9dFtpXXx0W2krMV08PDh8dFtpKzJdPDwxNjt0aGlzLndvcmRzW29dfD1zPDxhJjY3MTA4ODYzLHRoaXMud29yZHNbbysxXT1zPj4+MjYtYSY2NzEwODg2MyxhKz0yNCxhPj0yNiYmKGEtPTI2LG8rKyl9cmV0dXJuIHRoaXMuc3RyaXAoKX0saS5wcm90b3R5cGUuX3BhcnNlSGV4PWZ1bmN0aW9uKHQsZSl7dGhpcy5sZW5ndGg9TWF0aC5jZWlsKCh0Lmxlbmd0aC1lKS82KSx0aGlzLndvcmRzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKHZhciByPTA7cjx0aGlzLmxlbmd0aDtyKyspdGhpcy53b3Jkc1tyXT0wO2Zvcih2YXIgbj0wLHI9dC5sZW5ndGgtNixpPTA7cj49ZTtyLT02KXt2YXIgbz1hKHQscixyKzYpO3RoaXMud29yZHNbaV18PW88PG4mNjcxMDg4NjMsdGhpcy53b3Jkc1tpKzFdfD1vPj4+MjYtbiY0MTk0MzAzLG4rPTI0LG4+PTI2JiYobi09MjYsaSsrKX1pZihyKzYhPT1lKXt2YXIgbz1hKHQsZSxyKzYpO3RoaXMud29yZHNbaV18PW88PG4mNjcxMDg4NjMsdGhpcy53b3Jkc1tpKzFdfD1vPj4+MjYtbiY0MTk0MzAzfXRoaXMuc3RyaXAoKX0saS5wcm90b3R5cGUuX3BhcnNlQmFzZT1mdW5jdGlvbih0LGUscil7dGhpcy53b3Jkcz1bMF0sdGhpcy5sZW5ndGg9MTtmb3IodmFyIG49MCxpPTE7aTw9NjcxMDg4NjM7aSo9ZSluKys7bi0tLGk9aS9lfDA7Zm9yKHZhciBhPXQubGVuZ3RoLXIscz1hJW4sbD1NYXRoLm1pbihhLGEtcykrcix1PTAsYz1yO2M8bDtjKz1uKXU9byh0LGMsYytuLGUpLHRoaXMuaW11bG4oaSksdGhpcy53b3Jkc1swXSt1PDY3MTA4ODY0P3RoaXMud29yZHNbMF0rPXU6dGhpcy5faWFkZG4odSk7aWYoMCE9PXMpe2Zvcih2YXIgaD0xLHU9byh0LGMsdC5sZW5ndGgsZSksYz0wO2M8cztjKyspaCo9ZTt0aGlzLmltdWxuKGgpLHRoaXMud29yZHNbMF0rdTw2NzEwODg2ND90aGlzLndvcmRzWzBdKz11OnRoaXMuX2lhZGRuKHUpfX0saS5wcm90b3R5cGUuY29weT1mdW5jdGlvbih0KXt0LndvcmRzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKHZhciBlPTA7ZTx0aGlzLmxlbmd0aDtlKyspdC53b3Jkc1tlXT10aGlzLndvcmRzW2VdO3QubGVuZ3RoPXRoaXMubGVuZ3RoLHQuc2lnbj10aGlzLnNpZ24sdC5yZWQ9dGhpcy5yZWR9LGkucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGkobnVsbCk7cmV0dXJuIHRoaXMuY29weSh0KSx0fSxpLnByb3RvdHlwZS5zdHJpcD1mdW5jdGlvbigpe2Zvcig7dGhpcy5sZW5ndGg+MSYmMD09PXRoaXMud29yZHNbdGhpcy5sZW5ndGgtMV07KXRoaXMubGVuZ3RoLS07cmV0dXJuIHRoaXMuX25vcm1TaWduKCl9LGkucHJvdG90eXBlLl9ub3JtU2lnbj1mdW5jdGlvbigpe3JldHVybiAxPT09dGhpcy5sZW5ndGgmJjA9PT10aGlzLndvcmRzWzBdJiYodGhpcy5zaWduPSExKSx0aGlzfSxpLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMucmVkPyI8Qk4tUjogIjoiPEJOOiAiKSt0aGlzLnRvU3RyaW5nKDE2KSsiPiJ9O3ZhciBwPVsiIiwiMCIsIjAwIiwiMDAwIiwiMDAwMCIsIjAwMDAwIiwiMDAwMDAwIiwiMDAwMDAwMCIsIjAwMDAwMDAwIiwiMDAwMDAwMDAwIiwiMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCJdLGc9WzAsMCwyNSwxNiwxMiwxMSwxMCw5LDgsOCw3LDcsNyw3LDYsNiw2LDYsNiw2LDYsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNV0sbT1bMCwwLDMzNTU0NDMyLDQzMDQ2NzIxLDE2Nzc3MjE2LDQ4ODI4MTI1LDYwNDY2MTc2LDQwMzUzNjA3LDE2Nzc3MjE2LDQzMDQ2NzIxLDFlNywxOTQ4NzE3MSwzNTgzMTgwOCw2Mjc0ODUxNyw3NTI5NTM2LDExMzkwNjI1LDE2Nzc3MjE2LDI0MTM3NTY5LDM0MDEyMjI0LDQ3MDQ1ODgxLDY0ZTYsNDA4NDEwMSw1MTUzNjMyLDY0MzYzNDMsNzk2MjYyNCw5NzY1NjI1LDExODgxMzc2LDE0MzQ4OTA3LDE3MjEwMzY4LDIwNTExMTQ5LDI0M2U1LDI4NjI5MTUxLDMzNTU0NDMyLDM5MTM1MzkzLDQ1NDM1NDI0LDUyNTIxODc1LDYwNDY2MTc2XTtpLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbih0LGUpe2lmKHQ9dHx8MTAsMTY9PT10fHwiaGV4Ij09PXQpe2Zvcih2YXIgbj0iIixpPTAsZT0wfGV8fDEsYT0wLG89MDtvPHRoaXMubGVuZ3RoO28rKyl7dmFyIHM9dGhpcy53b3Jkc1tvXSxsPSgxNjc3NzIxNSYoczw8aXxhKSkudG9TdHJpbmcoMTYpO2E9cz4+PjI0LWkmMTY3NzcyMTUsbj0wIT09YXx8byE9PXRoaXMubGVuZ3RoLTE/cFs2LWwubGVuZ3RoXStsK246bCtuLGkrPTIsaT49MjYmJihpLT0yNixvLS0pfWZvcigwIT09YSYmKG49YS50b1N0cmluZygxNikrbik7bi5sZW5ndGglZSE9PTA7KW49IjAiK247cmV0dXJuIHRoaXMuc2lnbiYmKG49Ii0iK24pLG59aWYodD09PSgwfHQpJiZ0Pj0yJiZ0PD0zNil7dmFyIHU9Z1t0XSxjPW1bdF0sbj0iIixoPXRoaXMuY2xvbmUoKTtmb3IoaC5zaWduPSExOzAhPT1oLmNtcG4oMCk7KXt2YXIgZj1oLm1vZG4oYykudG9TdHJpbmcodCk7aD1oLmlkaXZuKGMpLG49MCE9PWguY21wbigwKT9wW3UtZi5sZW5ndGhdK2YrbjpmK259cmV0dXJuIDA9PT10aGlzLmNtcG4oMCkmJihuPSIwIituKSx0aGlzLnNpZ24mJihuPSItIituKSxufXIoITEsIkJhc2Ugc2hvdWxkIGJlIGJldHdlZW4gMiBhbmQgMzYiKX0saS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9TdHJpbmcoMTYpfSxpLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKHQpe3RoaXMuc3RyaXAoKTt2YXIgZT1uZXcgQXJyYXkodGhpcy5ieXRlTGVuZ3RoKCkpO2VbMF09MDt2YXIgcj10aGlzLmNsb25lKCk7aWYoImxlIiE9PXQpZm9yKHZhciBuPTA7MCE9PXIuY21wbigwKTtuKyspe3ZhciBpPXIuYW5kbG4oMjU1KTtyLmlzaHJuKDgpLGVbZS5sZW5ndGgtbi0xXT1pfWVsc2UgZm9yKHZhciBuPTA7MCE9PXIuY21wbigwKTtuKyspe3ZhciBpPXIuYW5kbG4oMjU1KTtyLmlzaHJuKDgpLGVbbl09aX1yZXR1cm4gZX0sTWF0aC5jbHozMj9pLnByb3RvdHlwZS5fY291bnRCaXRzPWZ1bmN0aW9uKHQpe3JldHVybiAzMi1NYXRoLmNsejMyKHQpfTppLnByb3RvdHlwZS5fY291bnRCaXRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQscj0wO3JldHVybiBlPj00MDk2JiYocis9MTMsZT4+Pj0xMyksZT49NjQmJihyKz03LGU+Pj49NyksZT49OCYmKHIrPTQsZT4+Pj00KSxlPj0yJiYocis9MixlPj4+PTIpLHIrZX0saS5wcm90b3R5cGUuX3plcm9CaXRzPWZ1bmN0aW9uKHQpe2lmKDA9PT10KXJldHVybiAyNjt2YXIgZT10LHI9MDtyZXR1cm4gMD09PSg4MTkxJmUpJiYocis9MTMsZT4+Pj0xMyksMD09PSgxMjcmZSkmJihyKz03LGU+Pj49NyksMD09PSgxNSZlKSYmKHIrPTQsZT4+Pj00KSwwPT09KDMmZSkmJihyKz0yLGU+Pj49MiksMD09PSgxJmUpJiZyKysscn0saS5wcm90b3R5cGUuYml0TGVuZ3RoPWZ1bmN0aW9uKCl7dmFyIHQ9MCxlPXRoaXMud29yZHNbdGhpcy5sZW5ndGgtMV0sdD10aGlzLl9jb3VudEJpdHMoZSk7cmV0dXJuIDI2Kih0aGlzLmxlbmd0aC0xKSt0fSxpLnByb3RvdHlwZS56ZXJvQml0cz1mdW5jdGlvbigpe2lmKDA9PT10aGlzLmNtcG4oMCkpcmV0dXJuIDA7Zm9yKHZhciB0PTAsZT0wO2U8dGhpcy5sZW5ndGg7ZSsrKXt2YXIgcj10aGlzLl96ZXJvQml0cyh0aGlzLndvcmRzW2VdKTtpZih0Kz1yLDI2IT09cilicmVha31yZXR1cm4gdH0saS5wcm90b3R5cGUuYnl0ZUxlbmd0aD1mdW5jdGlvbigpe3JldHVybiBNYXRoLmNlaWwodGhpcy5iaXRMZW5ndGgoKS84KX0saS5wcm90b3R5cGUubmVnPWZ1bmN0aW9uKCl7aWYoMD09PXRoaXMuY21wbigwKSlyZXR1cm4gdGhpcy5jbG9uZSgpO3ZhciB0PXRoaXMuY2xvbmUoKTtyZXR1cm4gdC5zaWduPSF0aGlzLnNpZ24sdH0saS5wcm90b3R5cGUuaW9yPWZ1bmN0aW9uKHQpe2Zvcih0aGlzLnNpZ249dGhpcy5zaWdufHx0LnNpZ247dGhpcy5sZW5ndGg8dC5sZW5ndGg7KXRoaXMud29yZHNbdGhpcy5sZW5ndGgrK109MDtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKyl0aGlzLndvcmRzW2VdPXRoaXMud29yZHNbZV18dC53b3Jkc1tlXTtyZXR1cm4gdGhpcy5zdHJpcCgpfSxpLnByb3RvdHlwZS5vcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sZW5ndGg+dC5sZW5ndGg/dGhpcy5jbG9uZSgpLmlvcih0KTp0LmNsb25lKCkuaW9yKHRoaXMpfSxpLnByb3RvdHlwZS5pYW5kPWZ1bmN0aW9uKHQpe3RoaXMuc2lnbj10aGlzLnNpZ24mJnQuc2lnbjt2YXIgZTtlPXRoaXMubGVuZ3RoPnQubGVuZ3RoP3Q6dGhpcztmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl0aGlzLndvcmRzW3JdPXRoaXMud29yZHNbcl0mdC53b3Jkc1tyXTtyZXR1cm4gdGhpcy5sZW5ndGg9ZS5sZW5ndGgsdGhpcy5zdHJpcCgpfSxpLnByb3RvdHlwZS5hbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGVuZ3RoPnQubGVuZ3RoP3RoaXMuY2xvbmUoKS5pYW5kKHQpOnQuY2xvbmUoKS5pYW5kKHRoaXMpfSxpLnByb3RvdHlwZS5peG9yPWZ1bmN0aW9uKHQpe3RoaXMuc2lnbj10aGlzLnNpZ258fHQuc2lnbjt2YXIgZSxyO3RoaXMubGVuZ3RoPnQubGVuZ3RoPyhlPXRoaXMscj10KTooZT10LHI9dGhpcyk7Zm9yKHZhciBuPTA7bjxyLmxlbmd0aDtuKyspdGhpcy53b3Jkc1tuXT1lLndvcmRzW25dXnIud29yZHNbbl07aWYodGhpcyE9PWUpZm9yKDtuPGUubGVuZ3RoO24rKyl0aGlzLndvcmRzW25dPWUud29yZHNbbl07cmV0dXJuIHRoaXMubGVuZ3RoPWUubGVuZ3RoLHRoaXMuc3RyaXAoKX0saS5wcm90b3R5cGUueG9yPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxlbmd0aD50Lmxlbmd0aD90aGlzLmNsb25lKCkuaXhvcih0KTp0LmNsb25lKCkuaXhvcih0aGlzKX0saS5wcm90b3R5cGUuc2V0bj1mdW5jdGlvbih0LGUpe3IoIm51bWJlciI9PXR5cGVvZiB0JiZ0Pj0wKTtmb3IodmFyIG49dC8yNnwwLGk9dCUyNjt0aGlzLmxlbmd0aDw9bjspdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCsrXT0wO3JldHVybiBlP3RoaXMud29yZHNbbl09dGhpcy53b3Jkc1tuXXwxPDxpOnRoaXMud29yZHNbbl09dGhpcy53b3Jkc1tuXSZ+KDE8PGkpLHRoaXMuc3RyaXAoKX0saS5wcm90b3R5cGUuaWFkZD1mdW5jdGlvbih0KXtpZih0aGlzLnNpZ24mJiF0LnNpZ24pe3RoaXMuc2lnbj0hMTt2YXIgZT10aGlzLmlzdWIodCk7cmV0dXJuIHRoaXMuc2lnbj0hdGhpcy5zaWduLHRoaXMuX25vcm1TaWduKCl9aWYoIXRoaXMuc2lnbiYmdC5zaWduKXt0LnNpZ249ITE7dmFyIGU9dGhpcy5pc3ViKHQpO3JldHVybiB0LnNpZ249ITAsZS5fbm9ybVNpZ24oKX12YXIgcixuO3RoaXMubGVuZ3RoPnQubGVuZ3RoPyhyPXRoaXMsbj10KToocj10LG49dGhpcyk7Zm9yKHZhciBpPTAsYT0wO2E8bi5sZW5ndGg7YSsrKXt2YXIgZT1yLndvcmRzW2FdK24ud29yZHNbYV0raTt0aGlzLndvcmRzW2FdPTY3MTA4ODYzJmUsaT1lPj4+MjZ9Zm9yKDswIT09aSYmYTxyLmxlbmd0aDthKyspe3ZhciBlPXIud29yZHNbYV0raTt0aGlzLndvcmRzW2FdPTY3MTA4ODYzJmUsaT1lPj4+MjZ9aWYodGhpcy5sZW5ndGg9ci5sZW5ndGgsMCE9PWkpdGhpcy53b3Jkc1t0aGlzLmxlbmd0aF09aSx0aGlzLmxlbmd0aCsrO2Vsc2UgaWYociE9PXRoaXMpZm9yKDthPHIubGVuZ3RoO2ErKyl0aGlzLndvcmRzW2FdPXIud29yZHNbYV07cmV0dXJuIHRoaXN9LGkucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtpZih0LnNpZ24mJiF0aGlzLnNpZ24pe3Quc2lnbj0hMTt2YXIgZT10aGlzLnN1Yih0KTtyZXR1cm4gdC5zaWduPSEwLGV9aWYoIXQuc2lnbiYmdGhpcy5zaWduKXt0aGlzLnNpZ249ITE7dmFyIGU9dC5zdWIodGhpcyk7cmV0dXJuIHRoaXMuc2lnbj0hMCxlfXJldHVybiB0aGlzLmxlbmd0aD50Lmxlbmd0aD90aGlzLmNsb25lKCkuaWFkZCh0KTp0LmNsb25lKCkuaWFkZCh0aGlzKX0saS5wcm90b3R5cGUuaXN1Yj1mdW5jdGlvbih0KXtpZih0LnNpZ24pe3Quc2lnbj0hMTt2YXIgZT10aGlzLmlhZGQodCk7cmV0dXJuIHQuc2lnbj0hMCxlLl9ub3JtU2lnbigpfWlmKHRoaXMuc2lnbilyZXR1cm4gdGhpcy5zaWduPSExLHRoaXMuaWFkZCh0KSx0aGlzLnNpZ249ITAsdGhpcy5fbm9ybVNpZ24oKTt2YXIgcj10aGlzLmNtcCh0KTtpZigwPT09cilyZXR1cm4gdGhpcy5zaWduPSExLHRoaXMubGVuZ3RoPTEsdGhpcy53b3Jkc1swXT0wLHRoaXM7dmFyIG4saTtyPjA/KG49dGhpcyxpPXQpOihuPXQsaT10aGlzKTtmb3IodmFyIGE9MCxvPTA7bzxpLmxlbmd0aDtvKyspe3ZhciBlPW4ud29yZHNbb10taS53b3Jkc1tvXSthO2E9ZT4+MjYsdGhpcy53b3Jkc1tvXT02NzEwODg2MyZlfWZvcig7MCE9PWEmJm88bi5sZW5ndGg7bysrKXt2YXIgZT1uLndvcmRzW29dK2E7YT1lPj4yNix0aGlzLndvcmRzW29dPTY3MTA4ODYzJmV9aWYoMD09PWEmJm88bi5sZW5ndGgmJm4hPT10aGlzKWZvcig7bzxuLmxlbmd0aDtvKyspdGhpcy53b3Jkc1tvXT1uLndvcmRzW29dO3JldHVybiB0aGlzLmxlbmd0aD1NYXRoLm1heCh0aGlzLmxlbmd0aCxvKSxuIT09dGhpcyYmKHRoaXMuc2lnbj0hMCksdGhpcy5zdHJpcCgpfSxpLnByb3RvdHlwZS5zdWI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pc3ViKHQpfSxpLnByb3RvdHlwZS5fc21hbGxNdWxUbz1mdW5jdGlvbih0LGUpe2Uuc2lnbj10LnNpZ24hPT10aGlzLnNpZ24sZS5sZW5ndGg9dGhpcy5sZW5ndGgrdC5sZW5ndGg7Zm9yKHZhciByPTAsbj0wO248ZS5sZW5ndGgtMTtuKyspe2Zvcih2YXIgaT1yPj4+MjYsYT02NzEwODg2MyZyLG89TWF0aC5taW4obix0Lmxlbmd0aC0xKSxzPU1hdGgubWF4KDAsbi10aGlzLmxlbmd0aCsxKTtzPD1vO3MrKyl7dmFyIGw9bi1zLHU9MHx0aGlzLndvcmRzW2xdLGM9MHx0LndvcmRzW3NdLGg9dSpjLGY9NjcxMDg4NjMmaDtpPWkrKGgvNjcxMDg4NjR8MCl8MCxmPWYrYXwwLGE9NjcxMDg4NjMmZixpPWkrKGY+Pj4yNil8MH1lLndvcmRzW25dPWEscj1pfXJldHVybiAwIT09cj9lLndvcmRzW25dPXI6ZS5sZW5ndGgtLSxlLnN0cmlwKCl9LGkucHJvdG90eXBlLl9iaWdNdWxUbz1mdW5jdGlvbih0LGUpe2Uuc2lnbj10LnNpZ24hPT10aGlzLnNpZ24sZS5sZW5ndGg9dGhpcy5sZW5ndGgrdC5sZW5ndGg7Zm9yKHZhciByPTAsbj0wLGk9MDtpPGUubGVuZ3RoLTE7aSsrKXt2YXIgYT1uO249MDtmb3IodmFyIG89NjcxMDg4NjMmcixzPU1hdGgubWluKGksdC5sZW5ndGgtMSksbD1NYXRoLm1heCgwLGktdGhpcy5sZW5ndGgrMSk7bDw9cztsKyspe3ZhciB1PWktbCxjPTB8dGhpcy53b3Jkc1t1XSxoPTB8dC53b3Jkc1tsXSxmPWMqaCxkPTY3MTA4ODYzJmY7YT1hKyhmLzY3MTA4ODY0fDApfDAsZD1kK298MCxvPTY3MTA4ODYzJmQsYT1hKyhkPj4+MjYpfDAsbis9YT4+PjI2LGEmPTY3MTA4ODYzfWUud29yZHNbaV09byxyPWEsYT1ufXJldHVybiAwIT09cj9lLndvcmRzW2ldPXI6ZS5sZW5ndGgtLSxlLnN0cmlwKCl9LGkucHJvdG90eXBlLm11bFRvPWZ1bmN0aW9uKHQsZSl7dmFyIHI7cmV0dXJuIHI9dGhpcy5sZW5ndGgrdC5sZW5ndGg8NjM/dGhpcy5fc21hbGxNdWxUbyh0LGUpOnRoaXMuX2JpZ011bFRvKHQsZSl9LGkucHJvdG90eXBlLm11bD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgaShudWxsKTtyZXR1cm4gZS53b3Jkcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgrdC5sZW5ndGgpLHRoaXMubXVsVG8odCxlKX0saS5wcm90b3R5cGUuaW11bD1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5jbXBuKDApfHwwPT09dC5jbXBuKDApKXJldHVybiB0aGlzLndvcmRzWzBdPTAsdGhpcy5sZW5ndGg9MSx0aGlzO3ZhciBlPXRoaXMubGVuZ3RoLHI9dC5sZW5ndGg7dGhpcy5zaWduPXQuc2lnbiE9PXRoaXMuc2lnbix0aGlzLmxlbmd0aD10aGlzLmxlbmd0aCt0Lmxlbmd0aCx0aGlzLndvcmRzW3RoaXMubGVuZ3RoLTFdPTA7Zm9yKHZhciBuPXRoaXMubGVuZ3RoLTI7bj49MDtuLS0pe2Zvcih2YXIgaT0wLGE9MCxvPU1hdGgubWluKG4sci0xKSxzPU1hdGgubWF4KDAsbi1lKzEpO3M8PW87cysrKXt2YXIgbD1uLXMsdT10aGlzLndvcmRzW2xdLGM9dC53b3Jkc1tzXSxoPXUqYyxmPTY3MTA4ODYzJmg7aSs9aC82NzEwODg2NHwwLGYrPWEsYT02NzEwODg2MyZmLGkrPWY+Pj4yNn10aGlzLndvcmRzW25dPWEsdGhpcy53b3Jkc1tuKzFdKz1pLGk9MH1mb3IodmFyIGk9MCxsPTE7bDx0aGlzLmxlbmd0aDtsKyspe3ZhciBkPXRoaXMud29yZHNbbF0raTt0aGlzLndvcmRzW2xdPTY3MTA4ODYzJmQsaT1kPj4+MjZ9cmV0dXJuIHRoaXMuc3RyaXAoKX0saS5wcm90b3R5cGUuaW11bG49ZnVuY3Rpb24odCl7cigibnVtYmVyIj09dHlwZW9mIHQpO2Zvcih2YXIgZT0wLG49MDtuPHRoaXMubGVuZ3RoO24rKyl7dmFyIGk9dGhpcy53b3Jkc1tuXSp0LGE9KDY3MTA4ODYzJmkpKyg2NzEwODg2MyZlKTtlPj49MjYsZSs9aS82NzEwODg2NHwwLGUrPWE+Pj4yNix0aGlzLndvcmRzW25dPTY3MTA4ODYzJmF9cmV0dXJuIDAhPT1lJiYodGhpcy53b3Jkc1tuXT1lLHRoaXMubGVuZ3RoKyspLHRoaXN9LGkucHJvdG90eXBlLm11bG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pbXVsbih0KX0saS5wcm90b3R5cGUuc3FyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXVsKHRoaXMpfSxpLnByb3RvdHlwZS5pc3FyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXVsKHRoaXMpfSxpLnByb3RvdHlwZS5pc2hsbj1mdW5jdGlvbih0KXtyKCJudW1iZXIiPT10eXBlb2YgdCYmdD49MCk7dmFyIGU9dCUyNixuPSh0LWUpLzI2LGk9NjcxMDg4NjM+Pj4yNi1lPDwyNi1lO2lmKDAhPT1lKXtmb3IodmFyIGE9MCxvPTA7bzx0aGlzLmxlbmd0aDtvKyspe3ZhciBzPXRoaXMud29yZHNbb10maSxsPXRoaXMud29yZHNbb10tczw8ZTt0aGlzLndvcmRzW29dPWx8YSxhPXM+Pj4yNi1lfWEmJih0aGlzLndvcmRzW29dPWEsdGhpcy5sZW5ndGgrKyl9aWYoMCE9PW4pe2Zvcih2YXIgbz10aGlzLmxlbmd0aC0xO28+PTA7by0tKXRoaXMud29yZHNbbytuXT10aGlzLndvcmRzW29dO2Zvcih2YXIgbz0wO288bjtvKyspdGhpcy53b3Jkc1tvXT0wO3RoaXMubGVuZ3RoKz1ufXJldHVybiB0aGlzLnN0cmlwKCl9LGkucHJvdG90eXBlLmlzaHJuPWZ1bmN0aW9uKHQsZSxuKXtyKCJudW1iZXIiPT10eXBlb2YgdCYmdD49MCk7dmFyIGk7aT1lPyhlLWUlMjYpLzI2OjA7dmFyIGE9dCUyNixvPU1hdGgubWluKCh0LWEpLzI2LHRoaXMubGVuZ3RoKSxzPTY3MTA4ODYzXjY3MTA4ODYzPj4+YTw8YSxsPW47aWYoaS09byxpPU1hdGgubWF4KDAsaSksbCl7Zm9yKHZhciB1PTA7dTxvO3UrKylsLndvcmRzW3VdPXRoaXMud29yZHNbdV07bC5sZW5ndGg9b31pZigwPT09byk7ZWxzZSBpZih0aGlzLmxlbmd0aD5vKXt0aGlzLmxlbmd0aC09bztmb3IodmFyIHU9MDt1PHRoaXMubGVuZ3RoO3UrKyl0aGlzLndvcmRzW3VdPXRoaXMud29yZHNbdStvXX1lbHNlIHRoaXMud29yZHNbMF09MCx0aGlzLmxlbmd0aD0xO2Zvcih2YXIgYz0wLHU9dGhpcy5sZW5ndGgtMTt1Pj0wJiYoMCE9PWN8fHU+PWkpO3UtLSl7dmFyIGg9dGhpcy53b3Jkc1t1XTt0aGlzLndvcmRzW3VdPWM8PDI2LWF8aD4+PmEsYz1oJnN9cmV0dXJuIGwmJjAhPT1jJiYobC53b3Jkc1tsLmxlbmd0aCsrXT1jKSwwPT09dGhpcy5sZW5ndGgmJih0aGlzLndvcmRzWzBdPTAsdGhpcy5sZW5ndGg9MSksdGhpcy5zdHJpcCgpLHRoaXN9LGkucHJvdG90eXBlLnNobG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pc2hsbih0KX0saS5wcm90b3R5cGUuc2hybj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlzaHJuKHQpfSxpLnByb3RvdHlwZS50ZXN0bj1mdW5jdGlvbih0KXtyKCJudW1iZXIiPT10eXBlb2YgdCYmdD49MCk7dmFyIGU9dCUyNixuPSh0LWUpLzI2LGk9MTw8ZTtpZih0aGlzLmxlbmd0aDw9bilyZXR1cm4hMTt2YXIgYT10aGlzLndvcmRzW25dO3JldHVybiEhKGEmaSl9LGkucHJvdG90eXBlLmltYXNrbj1mdW5jdGlvbih0KXtyKCJudW1iZXIiPT10eXBlb2YgdCYmdD49MCk7dmFyIGU9dCUyNixuPSh0LWUpLzI2O2lmKHIoIXRoaXMuc2lnbiwiaW1hc2tuIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZSBudW1iZXJzIiksMCE9PWUmJm4rKyx0aGlzLmxlbmd0aD1NYXRoLm1pbihuLHRoaXMubGVuZ3RoKSwwIT09ZSl7dmFyIGk9NjcxMDg4NjNeNjcxMDg4NjM+Pj5lPDxlO3RoaXMud29yZHNbdGhpcy5sZW5ndGgtMV0mPWl9cmV0dXJuIHRoaXMuc3RyaXAoKX0saS5wcm90b3R5cGUubWFza249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pbWFza24odCl9LGkucHJvdG90eXBlLmlhZGRuPWZ1bmN0aW9uKHQpe3JldHVybiByKCJudW1iZXIiPT10eXBlb2YgdCksdDwwP3RoaXMuaXN1Ym4oLXQpOnRoaXMuc2lnbj8xPT09dGhpcy5sZW5ndGgmJnRoaXMud29yZHNbMF08dD8odGhpcy53b3Jkc1swXT10LXRoaXMud29yZHNbMF0sdGhpcy5zaWduPSExLHRoaXMpOih0aGlzLnNpZ249ITEsdGhpcy5pc3Vibih0KSx0aGlzLnNpZ249ITAsdGhpcyk6dGhpcy5faWFkZG4odCl9LGkucHJvdG90eXBlLl9pYWRkbj1mdW5jdGlvbih0KXt0aGlzLndvcmRzWzBdKz10O2Zvcih2YXIgZT0wO2U8dGhpcy5sZW5ndGgmJnRoaXMud29yZHNbZV0+PTY3MTA4ODY0O2UrKyl0aGlzLndvcmRzW2VdLT02NzEwODg2NCxlPT09dGhpcy5sZW5ndGgtMT90aGlzLndvcmRzW2UrMV09MTp0aGlzLndvcmRzW2UrMV0rKztyZXR1cm4gdGhpcy5sZW5ndGg9TWF0aC5tYXgodGhpcy5sZW5ndGgsZSsxKSx0aGlzfSxpLnByb3RvdHlwZS5pc3Vibj1mdW5jdGlvbih0KXtpZihyKCJudW1iZXIiPT10eXBlb2YgdCksdDwwKXJldHVybiB0aGlzLmlhZGRuKC10KTtpZih0aGlzLnNpZ24pcmV0dXJuIHRoaXMuc2lnbj0hMSx0aGlzLmlhZGRuKHQpLHRoaXMuc2lnbj0hMCx0aGlzO3RoaXMud29yZHNbMF0tPXQ7Zm9yKHZhciBlPTA7ZTx0aGlzLmxlbmd0aCYmdGhpcy53b3Jkc1tlXTwwO2UrKyl0aGlzLndvcmRzW2VdKz02NzEwODg2NCx0aGlzLndvcmRzW2UrMV0tPTE7cmV0dXJuIHRoaXMuc3RyaXAoKX0saS5wcm90b3R5cGUuYWRkbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlhZGRuKHQpfSxpLnByb3RvdHlwZS5zdWJuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuaXN1Ym4odCl9LGkucHJvdG90eXBlLmlhYnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaWduPSExLHRoaXN9LGkucHJvdG90eXBlLmFicz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkuaWFicygpfSxpLnByb3RvdHlwZS5faXNobG5zdWJtdWw9ZnVuY3Rpb24odCxlLG4pe3ZhciBpLGE9dC5sZW5ndGgrbjtpZih0aGlzLndvcmRzLmxlbmd0aDxhKXtmb3IodmFyIG89bmV3IEFycmF5KGEpLGk9MDtpPHRoaXMubGVuZ3RoO2krKylvW2ldPXRoaXMud29yZHNbaV07dGhpcy53b3Jkcz1vfWVsc2UgaT10aGlzLmxlbmd0aDtmb3IodGhpcy5sZW5ndGg9TWF0aC5tYXgodGhpcy5sZW5ndGgsYSk7aTx0aGlzLmxlbmd0aDtpKyspdGhpcy53b3Jkc1tpXT0wO2Zvcih2YXIgcz0wLGk9MDtpPHQubGVuZ3RoO2krKyl7dmFyIGw9dGhpcy53b3Jkc1tpK25dK3MsdT10LndvcmRzW2ldKmU7bC09NjcxMDg4NjMmdSxzPShsPj4yNiktKHUvNjcxMDg4NjR8MCksdGhpcy53b3Jkc1tpK25dPTY3MTA4ODYzJmx9Zm9yKDtpPHRoaXMubGVuZ3RoLW47aSsrKXt2YXIgbD10aGlzLndvcmRzW2krbl0rcztzPWw+PjI2LHRoaXMud29yZHNbaStuXT02NzEwODg2MyZsfWlmKDA9PT1zKXJldHVybiB0aGlzLnN0cmlwKCk7cihzPT09LTEpLHM9MDtmb3IodmFyIGk9MDtpPHRoaXMubGVuZ3RoO2krKyl7dmFyIGw9LXRoaXMud29yZHNbaV0rcztzPWw+PjI2LHRoaXMud29yZHNbaV09NjcxMDg4NjMmbH1yZXR1cm4gdGhpcy5zaWduPSEwLHRoaXMuc3RyaXAoKX0saS5wcm90b3R5cGUuX3dvcmREaXY9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLmxlbmd0aC10Lmxlbmd0aCxuPXRoaXMuY2xvbmUoKSxhPXQsbz1hLndvcmRzW2EubGVuZ3RoLTFdLHM9dGhpcy5fY291bnRCaXRzKG8pO3I9MjYtcywwIT09ciYmKGE9YS5zaGxuKHIpLG4uaXNobG4ociksbz1hLndvcmRzW2EubGVuZ3RoLTFdKTt2YXIgbCx1PW4ubGVuZ3RoLWEubGVuZ3RoO2lmKCJtb2QiIT09ZSl7bD1uZXcgaShudWxsKSxsLmxlbmd0aD11KzEsbC53b3Jkcz1uZXcgQXJyYXkobC5sZW5ndGgpO2Zvcih2YXIgYz0wO2M8bC5sZW5ndGg7YysrKWwud29yZHNbY109MH12YXIgaD1uLmNsb25lKCkuX2lzaGxuc3VibXVsKGEsMSx1KTtoLnNpZ258fChuPWgsbCYmKGwud29yZHNbdV09MSkpO2Zvcih2YXIgZj11LTE7Zj49MDtmLS0pe3ZhciBkPTY3MTA4ODY0Km4ud29yZHNbYS5sZW5ndGgrZl0rbi53b3Jkc1thLmxlbmd0aCtmLTFdO2ZvcihkPU1hdGgubWluKGQvb3wwLDY3MTA4ODYzKSxuLl9pc2hsbnN1Ym11bChhLGQsZik7bi5zaWduOylkLS0sbi5zaWduPSExLG4uX2lzaGxuc3VibXVsKGEsMSxmKSwwIT09bi5jbXBuKDApJiYobi5zaWduPSFuLnNpZ24pO2wmJihsLndvcmRzW2ZdPWQpfXJldHVybiBsJiZsLnN0cmlwKCksbi5zdHJpcCgpLCJkaXYiIT09ZSYmMCE9PXImJm4uaXNocm4ocikse2RpdjpsP2w6bnVsbCxtb2Q6bn19LGkucHJvdG90eXBlLmRpdm1vZD1mdW5jdGlvbih0LGUpe2lmKHIoMCE9PXQuY21wbigwKSksdGhpcy5zaWduJiYhdC5zaWduKXt2YXIgbixhLG89dGhpcy5uZWcoKS5kaXZtb2QodCxlKTtyZXR1cm4ibW9kIiE9PWUmJihuPW8uZGl2Lm5lZygpKSwiZGl2IiE9PWUmJihhPTA9PT1vLm1vZC5jbXBuKDApP28ubW9kOnQuc3ViKG8ubW9kKSkse2RpdjpuLG1vZDphfX1pZighdGhpcy5zaWduJiZ0LnNpZ24pe3ZhciBuLG89dGhpcy5kaXZtb2QodC5uZWcoKSxlKTtyZXR1cm4ibW9kIiE9PWUmJihuPW8uZGl2Lm5lZygpKSx7ZGl2Om4sbW9kOm8ubW9kfX1yZXR1cm4gdGhpcy5zaWduJiZ0LnNpZ24/dGhpcy5uZWcoKS5kaXZtb2QodC5uZWcoKSxlKTp0Lmxlbmd0aD50aGlzLmxlbmd0aHx8dGhpcy5jbXAodCk8MD97ZGl2Om5ldyBpKDApLG1vZDp0aGlzfToxPT09dC5sZW5ndGg/ImRpdiI9PT1lP3tkaXY6dGhpcy5kaXZuKHQud29yZHNbMF0pLG1vZDpudWxsfToibW9kIj09PWU/e2RpdjpudWxsLG1vZDpuZXcgaSh0aGlzLm1vZG4odC53b3Jkc1swXSkpfTp7ZGl2OnRoaXMuZGl2bih0LndvcmRzWzBdKSxtb2Q6bmV3IGkodGhpcy5tb2RuKHQud29yZHNbMF0pKX06dGhpcy5fd29yZERpdih0LGUpfSxpLnByb3RvdHlwZS5kaXY9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGl2bW9kKHQsImRpdiIpLmRpdn0saS5wcm90b3R5cGUubW9kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRpdm1vZCh0LCJtb2QiKS5tb2R9LGkucHJvdG90eXBlLmRpdlJvdW5kPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZGl2bW9kKHQpO2lmKDA9PT1lLm1vZC5jbXBuKDApKXJldHVybiBlLmRpdjt2YXIgcj1lLmRpdi5zaWduP2UubW9kLmlzdWIodCk6ZS5tb2Qsbj10LnNocm4oMSksaT10LmFuZGxuKDEpLGE9ci5jbXAobik7cmV0dXJuIGE8MHx8MT09PWkmJjA9PT1hP2UuZGl2OmUuZGl2LnNpZ24/ZS5kaXYuaXN1Ym4oMSk6ZS5kaXYuaWFkZG4oMSl9LGkucHJvdG90eXBlLm1vZG49ZnVuY3Rpb24odCl7cih0PD02NzEwODg2Myk7Zm9yKHZhciBlPSgxPDwyNikldCxuPTAsaT10aGlzLmxlbmd0aC0xO2k+PTA7aS0tKW49KGUqbit0aGlzLndvcmRzW2ldKSV0O3JldHVybiBufSxpLnByb3RvdHlwZS5pZGl2bj1mdW5jdGlvbih0KXtyKHQ8PTY3MTA4ODYzKTtmb3IodmFyIGU9MCxuPXRoaXMubGVuZ3RoLTE7bj49MDtuLS0pe3ZhciBpPXRoaXMud29yZHNbbl0rNjcxMDg4NjQqZTt0aGlzLndvcmRzW25dPWkvdHwwLGU9aSV0fXJldHVybiB0aGlzLnN0cmlwKCl9LGkucHJvdG90eXBlLmRpdm49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pZGl2bih0KX0saS5wcm90b3R5cGUuZWdjZD1mdW5jdGlvbih0KXtyKCF0LnNpZ24pLHIoMCE9PXQuY21wbigwKSk7dmFyIGU9dGhpcyxuPXQuY2xvbmUoKTtlPWUuc2lnbj9lLm1vZCh0KTplLmNsb25lKCk7Zm9yKHZhciBhPW5ldyBpKDEpLG89bmV3IGkoMCkscz1uZXcgaSgwKSxsPW5ldyBpKDEpLHU9MDtlLmlzRXZlbigpJiZuLmlzRXZlbigpOyllLmlzaHJuKDEpLG4uaXNocm4oMSksKyt1O2Zvcih2YXIgYz1uLmNsb25lKCksaD1lLmNsb25lKCk7MCE9PWUuY21wbigwKTspe2Zvcig7ZS5pc0V2ZW4oKTspZS5pc2hybigxKSxhLmlzRXZlbigpJiZvLmlzRXZlbigpPyhhLmlzaHJuKDEpLG8uaXNocm4oMSkpOihhLmlhZGQoYykuaXNocm4oMSksby5pc3ViKGgpLmlzaHJuKDEpKTtmb3IoO24uaXNFdmVuKCk7KW4uaXNocm4oMSkscy5pc0V2ZW4oKSYmbC5pc0V2ZW4oKT8ocy5pc2hybigxKSxsLmlzaHJuKDEpKToocy5pYWRkKGMpLmlzaHJuKDEpLGwuaXN1YihoKS5pc2hybigxKSk7ZS5jbXAobik+PTA/KGUuaXN1YihuKSxhLmlzdWIocyksby5pc3ViKGwpKToobi5pc3ViKGUpLHMuaXN1YihhKSxsLmlzdWIobykpfXJldHVybnthOnMsYjpsLGdjZDpuLmlzaGxuKHUpfX0saS5wcm90b3R5cGUuX2ludm1wPWZ1bmN0aW9uKHQpe3IoIXQuc2lnbikscigwIT09dC5jbXBuKDApKTt2YXIgZT10aGlzLG49dC5jbG9uZSgpO2U9ZS5zaWduP2UubW9kKHQpOmUuY2xvbmUoKTtmb3IodmFyIGE9bmV3IGkoMSksbz1uZXcgaSgwKSxzPW4uY2xvbmUoKTtlLmNtcG4oMSk+MCYmbi5jbXBuKDEpPjA7KXtmb3IoO2UuaXNFdmVuKCk7KWUuaXNocm4oMSksYS5pc0V2ZW4oKT9hLmlzaHJuKDEpOmEuaWFkZChzKS5pc2hybigxKTtmb3IoO24uaXNFdmVuKCk7KW4uaXNocm4oMSksby5pc0V2ZW4oKT9vLmlzaHJuKDEpOm8uaWFkZChzKS5pc2hybigxKTtlLmNtcChuKT49MD8oZS5pc3ViKG4pLGEuaXN1YihvKSk6KG4uaXN1YihlKSxvLmlzdWIoYSkpfXJldHVybiAwPT09ZS5jbXBuKDEpP2E6b30saS5wcm90b3R5cGUuZ2NkPWZ1bmN0aW9uKHQpe2lmKDA9PT10aGlzLmNtcG4oMCkpcmV0dXJuIHQuY2xvbmUoKTtpZigwPT09dC5jbXBuKDApKXJldHVybiB0aGlzLmNsb25lKCk7dmFyIGU9dGhpcy5jbG9uZSgpLHI9dC5jbG9uZSgpO2Uuc2lnbj0hMSxyLnNpZ249ITE7Zm9yKHZhciBuPTA7ZS5pc0V2ZW4oKSYmci5pc0V2ZW4oKTtuKyspZS5pc2hybigxKSxyLmlzaHJuKDEpO2Zvcig7Oyl7Zm9yKDtlLmlzRXZlbigpOyllLmlzaHJuKDEpO2Zvcig7ci5pc0V2ZW4oKTspci5pc2hybigxKTt2YXIgaT1lLmNtcChyKTtpZihpPDApe3ZhciBhPWU7ZT1yLHI9YX1lbHNlIGlmKDA9PT1pfHwwPT09ci5jbXBuKDEpKWJyZWFrO2UuaXN1YihyKX1yZXR1cm4gci5pc2hsbihuKX0saS5wcm90b3R5cGUuaW52bT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lZ2NkKHQpLmEubW9kKHQpfSxpLnByb3RvdHlwZS5pc0V2ZW49ZnVuY3Rpb24oKXtyZXR1cm4gMD09PSgxJnRoaXMud29yZHNbMF0pfSxpLnByb3RvdHlwZS5pc09kZD1mdW5jdGlvbigpe3JldHVybiAxPT09KDEmdGhpcy53b3Jkc1swXSl9LGkucHJvdG90eXBlLmFuZGxuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLndvcmRzWzBdJnR9LGkucHJvdG90eXBlLmJpbmNuPWZ1bmN0aW9uKHQpe3IoIm51bWJlciI9PXR5cGVvZiB0KTt2YXIgZT10JTI2LG49KHQtZSkvMjYsaT0xPDxlO2lmKHRoaXMubGVuZ3RoPD1uKXtmb3IodmFyIGE9dGhpcy5sZW5ndGg7YTxuKzE7YSsrKXRoaXMud29yZHNbYV09MDtyZXR1cm4gdGhpcy53b3Jkc1tuXXw9aSx0aGlzLmxlbmd0aD1uKzEsdGhpc31mb3IodmFyIG89aSxhPW47MCE9PW8mJmE8dGhpcy5sZW5ndGg7YSsrKXt2YXIgcz10aGlzLndvcmRzW2FdO3MrPW8sbz1zPj4+MjYscyY9NjcxMDg4NjMsdGhpcy53b3Jkc1thXT1zfXJldHVybiAwIT09byYmKHRoaXMud29yZHNbYV09byx0aGlzLmxlbmd0aCsrKSx0aGlzfSxpLnByb3RvdHlwZS5jbXBuPWZ1bmN0aW9uKHQpe3ZhciBlPXQ8MDtpZihlJiYodD0tdCksdGhpcy5zaWduJiYhZSlyZXR1cm4tMTtpZighdGhpcy5zaWduJiZlKXJldHVybiAxO3QmPTY3MTA4ODYzLHRoaXMuc3RyaXAoKTt2YXIgcjtpZih0aGlzLmxlbmd0aD4xKXI9MTtlbHNle3ZhciBuPXRoaXMud29yZHNbMF07cj1uPT09dD8wOm48dD8tMToxfXJldHVybiB0aGlzLnNpZ24mJihyPS1yKSxyfSxpLnByb3RvdHlwZS5jbXA9ZnVuY3Rpb24odCl7aWYodGhpcy5zaWduJiYhdC5zaWduKXJldHVybi0xO2lmKCF0aGlzLnNpZ24mJnQuc2lnbilyZXR1cm4gMTt2YXIgZT10aGlzLnVjbXAodCk7cmV0dXJuIHRoaXMuc2lnbj8tZTplfSxpLnByb3RvdHlwZS51Y21wPWZ1bmN0aW9uKHQpe2lmKHRoaXMubGVuZ3RoPnQubGVuZ3RoKXJldHVybiAxO2lmKHRoaXMubGVuZ3RoPHQubGVuZ3RoKXJldHVybi0xO2Zvcih2YXIgZT0wLHI9dGhpcy5sZW5ndGgtMTtyPj0wO3ItLSl7dmFyIG49dGhpcy53b3Jkc1tyXSxpPXQud29yZHNbcl07aWYobiE9PWkpe248aT9lPS0xOm4+aSYmKGU9MSk7YnJlYWt9fXJldHVybiBlfSxpLnJlZD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGYodCl9LGkucHJvdG90eXBlLnRvUmVkPWZ1bmN0aW9uKHQpe3JldHVybiByKCF0aGlzLnJlZCwiQWxyZWFkeSBhIG51bWJlciBpbiByZWR1Y3Rpb24gY29udGV4dCIpLHIoIXRoaXMuc2lnbiwicmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMiKSx0LmNvbnZlcnRUbyh0aGlzKS5fZm9yY2VSZWQodCl9LGkucHJvdG90eXBlLmZyb21SZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gcih0aGlzLnJlZCwiZnJvbVJlZCB3b3JrcyBvbmx5IHdpdGggbnVtYmVycyBpbiByZWR1Y3Rpb24gY29udGV4dCIpLHRoaXMucmVkLmNvbnZlcnRGcm9tKHRoaXMpfSxpLnByb3RvdHlwZS5fZm9yY2VSZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmVkPXQsdGhpc30saS5wcm90b3R5cGUuZm9yY2VSZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHIoIXRoaXMucmVkLCJBbHJlYWR5IGEgbnVtYmVyIGluIHJlZHVjdGlvbiBjb250ZXh0IiksdGhpcy5fZm9yY2VSZWQodCl9LGkucHJvdG90eXBlLnJlZEFkZD1mdW5jdGlvbih0KXtyZXR1cm4gcih0aGlzLnJlZCwicmVkQWRkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLmFkZCh0aGlzLHQpfSxpLnByb3RvdHlwZS5yZWRJQWRkPWZ1bmN0aW9uKHQpe3JldHVybiByKHRoaXMucmVkLCJyZWRJQWRkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLmlhZGQodGhpcyx0KX0saS5wcm90b3R5cGUucmVkU3ViPWZ1bmN0aW9uKHQpe3JldHVybiByKHRoaXMucmVkLCJyZWRTdWIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuc3ViKHRoaXMsdCl9LGkucHJvdG90eXBlLnJlZElTdWI9ZnVuY3Rpb24odCl7cmV0dXJuIHIodGhpcy5yZWQsInJlZElTdWIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuaXN1Yih0aGlzLHQpfSxpLnByb3RvdHlwZS5yZWRTaGw9ZnVuY3Rpb24odCl7cmV0dXJuIHIodGhpcy5yZWQsInJlZFNobCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5zaGwodGhpcyx0KX0saS5wcm90b3R5cGUucmVkTXVsPWZ1bmN0aW9uKHQpe3JldHVybiByKHRoaXMucmVkLCJyZWRNdWwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuX3ZlcmlmeTIodGhpcyx0KSx0aGlzLnJlZC5tdWwodGhpcyx0KX0saS5wcm90b3R5cGUucmVkSU11bD1mdW5jdGlvbih0KXtyZXR1cm4gcih0aGlzLnJlZCwicmVkTXVsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLl92ZXJpZnkyKHRoaXMsdCksdGhpcy5yZWQuaW11bCh0aGlzLHQpfSxpLnByb3RvdHlwZS5yZWRTcXI9ZnVuY3Rpb24oKXtyZXR1cm4gcih0aGlzLnJlZCwicmVkU3FyIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLHRoaXMucmVkLnNxcih0aGlzKX0saS5wcm90b3R5cGUucmVkSVNxcj1mdW5jdGlvbigpe3JldHVybiByKHRoaXMucmVkLCJyZWRJU3FyIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLHRoaXMucmVkLmlzcXIodGhpcyl9LGkucHJvdG90eXBlLnJlZFNxcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gcih0aGlzLnJlZCwicmVkU3FydCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSx0aGlzLnJlZC5zcXJ0KHRoaXMpfSxpLnByb3RvdHlwZS5yZWRJbnZtPWZ1bmN0aW9uKCl7cmV0dXJuIHIodGhpcy5yZWQsInJlZEludm0gd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQuaW52bSh0aGlzKX0saS5wcm90b3R5cGUucmVkTmVnPWZ1bmN0aW9uKCl7cmV0dXJuIHIodGhpcy5yZWQsInJlZE5lZyB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSx0aGlzLnJlZC5uZWcodGhpcyl9LGkucHJvdG90eXBlLnJlZFBvdz1mdW5jdGlvbih0KXtyZXR1cm4gcih0aGlzLnJlZCYmIXQucmVkLCJyZWRQb3cobm9ybWFsTnVtKSIpLHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLHRoaXMucmVkLnBvdyh0aGlzLHQpfTt2YXIgdj17azI1NjpudWxsLHAyMjQ6bnVsbCxwMTkyOm51bGwscDI1NTE5Om51bGx9O3MucHJvdG90eXBlLl90bXA9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgaShudWxsKTtyZXR1cm4gdC53b3Jkcz1uZXcgQXJyYXkoTWF0aC5jZWlsKHRoaXMubi8xMykpLHR9LHMucHJvdG90eXBlLmlyZWR1Y2U9ZnVuY3Rpb24odCl7dmFyIGUscj10O2RvIHRoaXMuc3BsaXQocix0aGlzLnRtcCkscj10aGlzLmltdWxLKHIpLHI9ci5pYWRkKHRoaXMudG1wKSxlPXIuYml0TGVuZ3RoKCk7d2hpbGUoZT50aGlzLm4pO3ZhciBuPWU8dGhpcy5uPy0xOnIudWNtcCh0aGlzLnApO3JldHVybiAwPT09bj8oci53b3Jkc1swXT0wLHIubGVuZ3RoPTEpOm4+MD9yLmlzdWIodGhpcy5wKTpyLnN0cmlwKCkscn0scy5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24odCxlKXt0LmlzaHJuKHRoaXMubiwwLGUpfSxzLnByb3RvdHlwZS5pbXVsSz1mdW5jdGlvbih0KXtyZXR1cm4gdC5pbXVsKHRoaXMuayl9LG4obCxzKSxsLnByb3RvdHlwZS5zcGxpdD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj00MTk0MzAzLG49TWF0aC5taW4odC5sZW5ndGgsOSksaT0wO2k8bjtpKyspZS53b3Jkc1tpXT10LndvcmRzW2ldO2lmKGUubGVuZ3RoPW4sdC5sZW5ndGg8PTkpcmV0dXJuIHQud29yZHNbMF09MCx2b2lkKHQubGVuZ3RoPTEpO3ZhciBhPXQud29yZHNbOV07ZS53b3Jkc1tlLmxlbmd0aCsrXT1hJnI7Zm9yKHZhciBpPTEwO2k8dC5sZW5ndGg7aSsrKXt2YXIgbz10LndvcmRzW2ldO3Qud29yZHNbaS0xMF09KG8mcik8PDR8YT4+PjIyLGE9b310LndvcmRzW2ktMTBdPWE+Pj4yMix0Lmxlbmd0aC09OX0sbC5wcm90b3R5cGUuaW11bEs9ZnVuY3Rpb24odCl7dC53b3Jkc1t0Lmxlbmd0aF09MCx0LndvcmRzW3QubGVuZ3RoKzFdPTAsdC5sZW5ndGgrPTI7Zm9yKHZhciBlLHI9MCxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBpPXQud29yZHNbbl07ZT02NCppLHIrPTk3NyppLGUrPXIvNjcxMDg4NjR8MCxyJj02NzEwODg2Myx0LndvcmRzW25dPXIscj1lfXJldHVybiAwPT09dC53b3Jkc1t0Lmxlbmd0aC0xXSYmKHQubGVuZ3RoLS0sMD09PXQud29yZHNbdC5sZW5ndGgtMV0mJnQubGVuZ3RoLS0pLHR9LG4odSxzKSxuKGMscyksbihoLHMpLGgucHJvdG90eXBlLmltdWxLPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIG49MTkqdC53b3Jkc1tyXStlLGk9NjcxMDg4NjMmbjtuPj4+PTI2LHQud29yZHNbcl09aSxlPW59cmV0dXJuIDAhPT1lJiYodC53b3Jkc1t0Lmxlbmd0aCsrXT1lKSx0fSxpLl9wcmltZT1mdW5jdGlvbiB0KGUpe2lmKHZbZV0pcmV0dXJuIHZbZV07dmFyIHQ7aWYoImsyNTYiPT09ZSl0PW5ldyBsO2Vsc2UgaWYoInAyMjQiPT09ZSl0PW5ldyB1O2Vsc2UgaWYoInAxOTIiPT09ZSl0PW5ldyBjO2Vsc2V7aWYoInAyNTUxOSIhPT1lKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBwcmltZSAiK2UpO3Q9bmV3IGh9cmV0dXJuIHZbZV09dCx0fSxmLnByb3RvdHlwZS5fdmVyaWZ5MT1mdW5jdGlvbih0KXtyKCF0LnNpZ24sInJlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzIikscih0LnJlZCwicmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpfSxmLnByb3RvdHlwZS5fdmVyaWZ5Mj1mdW5jdGlvbih0LGUpe3IoIXQuc2lnbiYmIWUuc2lnbiwicmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMiKSxyKHQucmVkJiZ0LnJlZD09PWUucmVkLCJyZWQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIil9LGYucHJvdG90eXBlLmltb2Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHJpbWU/dGhpcy5wcmltZS5pcmVkdWNlKHQpLl9mb3JjZVJlZCh0aGlzKTp0Lm1vZCh0aGlzLm0pLl9mb3JjZVJlZCh0aGlzKX0sZi5wcm90b3R5cGUubmVnPWZ1bmN0aW9uKHQpe3ZhciBlPXQuY2xvbmUoKTtyZXR1cm4gZS5zaWduPSFlLnNpZ24sZS5pYWRkKHRoaXMubSkuX2ZvcmNlUmVkKHRoaXMpfSxmLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCxlKXt0aGlzLl92ZXJpZnkyKHQsZSk7dmFyIHI9dC5hZGQoZSk7cmV0dXJuIHIuY21wKHRoaXMubSk+PTAmJnIuaXN1Yih0aGlzLm0pLHIuX2ZvcmNlUmVkKHRoaXMpfSxmLnByb3RvdHlwZS5pYWRkPWZ1bmN0aW9uKHQsZSl7dGhpcy5fdmVyaWZ5Mih0LGUpO3ZhciByPXQuaWFkZChlKTtyZXR1cm4gci5jbXAodGhpcy5tKT49MCYmci5pc3ViKHRoaXMubSkscn0sZi5wcm90b3R5cGUuc3ViPWZ1bmN0aW9uKHQsZSl7dGhpcy5fdmVyaWZ5Mih0LGUpO3ZhciByPXQuc3ViKGUpO3JldHVybiByLmNtcG4oMCk8MCYmci5pYWRkKHRoaXMubSksci5fZm9yY2VSZWQodGhpcyl9LGYucHJvdG90eXBlLmlzdWI9ZnVuY3Rpb24odCxlKXt0aGlzLl92ZXJpZnkyKHQsZSk7dmFyIHI9dC5pc3ViKGUpO3JldHVybiByLmNtcG4oMCk8MCYmci5pYWRkKHRoaXMubSkscn0sZi5wcm90b3R5cGUuc2hsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3ZlcmlmeTEodCksdGhpcy5pbW9kKHQuc2hsbihlKSl9LGYucHJvdG90eXBlLmltdWw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fdmVyaWZ5Mih0LGUpLHRoaXMuaW1vZCh0LmltdWwoZSkpfSxmLnByb3RvdHlwZS5tdWw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fdmVyaWZ5Mih0LGUpLHRoaXMuaW1vZCh0Lm11bChlKSl9LGYucHJvdG90eXBlLmlzcXI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW11bCh0LHQpfSxmLnByb3RvdHlwZS5zcXI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubXVsKHQsdCl9LGYucHJvdG90eXBlLnNxcnQ9ZnVuY3Rpb24odCl7aWYoMD09PXQuY21wbigwKSlyZXR1cm4gdC5jbG9uZSgpO3ZhciBlPXRoaXMubS5hbmRsbigzKTtpZihyKGUlMj09PTEpLDM9PT1lKXt2YXIgbj10aGlzLm0uYWRkKG5ldyBpKDEpKS5pc2hybigyKSxhPXRoaXMucG93KHQsbik7cmV0dXJuIGF9Zm9yKHZhciBvPXRoaXMubS5zdWJuKDEpLHM9MDswIT09by5jbXBuKDApJiYwPT09by5hbmRsbigxKTspcysrLG8uaXNocm4oMSk7cigwIT09by5jbXBuKDApKTt2YXIgbD1uZXcgaSgxKS50b1JlZCh0aGlzKSx1PWwucmVkTmVnKCksYz10aGlzLm0uc3VibigxKS5pc2hybigxKSxoPXRoaXMubS5iaXRMZW5ndGgoKTtmb3IoaD1uZXcgaSgyKmgqaCkudG9SZWQodGhpcyk7MCE9PXRoaXMucG93KGgsYykuY21wKHUpOyloLnJlZElBZGQodSk7Zm9yKHZhciBmPXRoaXMucG93KGgsbyksYT10aGlzLnBvdyh0LG8uYWRkbigxKS5pc2hybigxKSksZD10aGlzLnBvdyh0LG8pLHA9czswIT09ZC5jbXAobCk7KXtmb3IodmFyIGc9ZCxtPTA7MCE9PWcuY21wKGwpO20rKylnPWcucmVkU3FyKCk7cihtPHApO3ZhciB2PXRoaXMucG93KGYsbmV3IGkoMSkuaXNobG4ocC1tLTEpKTthPWEucmVkTXVsKHYpLGY9di5yZWRTcXIoKSxkPWQucmVkTXVsKGYpLHA9bX1yZXR1cm4gYX0sZi5wcm90b3R5cGUuaW52bT1mdW5jdGlvbih0KXt2YXIgZT10Ll9pbnZtcCh0aGlzLm0pO3JldHVybiBlLnNpZ24/KGUuc2lnbj0hMSx0aGlzLmltb2QoZSkucmVkTmVnKCkpOnRoaXMuaW1vZChlKX0sZi5wcm90b3R5cGUucG93PWZ1bmN0aW9uKHQsZSl7dmFyIHI9W107aWYoMD09PWUuY21wbigwKSlyZXR1cm4gbmV3IGkoMSk7Zm9yKHZhciBuPWUuY2xvbmUoKTswIT09bi5jbXBuKDApOylyLnB1c2gobi5hbmRsbigxKSksbi5pc2hybigxKTtmb3IodmFyIGE9dCxvPTA7bzxyLmxlbmd0aCYmMD09PXJbb107bysrLGE9dGhpcy5zcXIoYSkpO2lmKCsrbzxyLmxlbmd0aClmb3IodmFyIG49dGhpcy5zcXIoYSk7bzxyLmxlbmd0aDtvKyssbj10aGlzLnNxcihuKSkwIT09cltvXSYmKGE9dGhpcy5tdWwoYSxuKSk7cmV0dXJuIGF9LGYucHJvdG90eXBlLmNvbnZlcnRUbz1mdW5jdGlvbih0KXt2YXIgZT10Lm1vZCh0aGlzLm0pO3JldHVybiBlPT09dD9lLmNsb25lKCk6ZX0sZi5wcm90b3R5cGUuY29udmVydEZyb209ZnVuY3Rpb24odCl7dmFyIGU9dC5jbG9uZSgpO3JldHVybiBlLnJlZD1udWxsLGV9LGkubW9udD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGQodCl9LG4oZCxmKSxkLnByb3RvdHlwZS5jb252ZXJ0VG89ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW1vZCh0LnNobG4odGhpcy5zaGlmdCkpfSxkLnByb3RvdHlwZS5jb252ZXJ0RnJvbT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmltb2QodC5tdWwodGhpcy5yaW52KSk7cmV0dXJuIGUucmVkPW51bGwsZX0sZC5wcm90b3R5cGUuaW11bD1mdW5jdGlvbih0LGUpe2lmKDA9PT10LmNtcG4oMCl8fDA9PT1lLmNtcG4oMCkpcmV0dXJuIHQud29yZHNbMF09MCx0Lmxlbmd0aD0xLHQ7dmFyIHI9dC5pbXVsKGUpLG49ci5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSksaT1yLmlzdWIobikuaXNocm4odGhpcy5zaGlmdCksYT1pO3JldHVybiBpLmNtcCh0aGlzLm0pPj0wP2E9aS5pc3ViKHRoaXMubSk6aS5jbXBuKDApPDAmJihhPWkuaWFkZCh0aGlzLm0pKSxhLl9mb3JjZVJlZCh0aGlzKX0sZC5wcm90b3R5cGUubXVsPWZ1bmN0aW9uKHQsZSl7aWYoMD09PXQuY21wbigwKXx8MD09PWUuY21wbigwKSlyZXR1cm4gbmV3IGkoMCkuX2ZvcmNlUmVkKHRoaXMpO3ZhciByPXQubXVsKGUpLG49ci5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSksYT1yLmlzdWIobikuaXNocm4odGhpcy5zaGlmdCksbz1hO3JldHVybiBhLmNtcCh0aGlzLm0pPj0wP289YS5pc3ViKHRoaXMubSk6YS5jbXBuKDApPDAmJihvPWEuaWFkZCh0aGlzLm0pKSxvLl9mb3JjZVJlZCh0aGlzKX0sZC5wcm90b3R5cGUuaW52bT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmltb2QodC5faW52bXAodGhpcy5tKS5tdWwodGhpcy5yMikpO3JldHVybiBlLl9mb3JjZVJlZCh0aGlzKX19KCJ1bmRlZmluZWQiPT10eXBlb2YgZXx8ZSx0aGlzKX0se31dLDU2OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGUscixuLGk9dC5sZW5ndGgsYT0wO2ZvcihlPTA7ZTxpOysrZSlhKz10W2VdLmxlbmd0aDt2YXIgbz1uZXcgQXJyYXkoYSkscz0wO2ZvcihlPTA7ZTxpOysrZSl7dmFyIGw9dFtlXSx1PWwubGVuZ3RoO2ZvcihyPTA7cjx1Oysrcil7dmFyIGM9b1tzKytdPW5ldyBBcnJheSh1LTEpLGg9MDtmb3Iobj0wO248dTsrK24pbiE9PXImJihjW2grK109bFtuXSk7aWYoMSZyKXt2YXIgZj1jWzFdO2NbMV09Y1swXSxjWzBdPWZ9fX1yZXR1cm4gb31lLmV4cG9ydHM9bn0se31dLDU3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtmb3IodmFyIHI9MDtyPHQ7KytyKWlmKCEoZVtyXTw9ZVtyK3RdKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBpKHQsZSxyLGkpe2Zvcih2YXIgYT0wLG89MCxzPTAsbD10Lmxlbmd0aDtzPGw7KytzKXt2YXIgdT10W3NdO2lmKCFuKGUsdSkpe2Zvcih2YXIgYz0wO2M8MiplOysrYylyW2ErK109dVtjXTtpW28rK109c319cmV0dXJuIG99ZnVuY3Rpb24gYSh0LGUscixuKXt2YXIgYT10Lmxlbmd0aCxvPWUubGVuZ3RoO2lmKCEoYTw9MHx8bzw9MCkpe3ZhciBzPXRbMF0ubGVuZ3RoPj4+MTtpZighKHM8PTApKXt2YXIgbCx1PWgubWFsbG9jRG91YmxlKDIqcyphKSxjPWgubWFsbG9jSW50MzIoYSk7aWYoYT1pKHQscyx1LGMpLGE+MCl7aWYoMT09PXMmJm4pZi5pbml0KGEpLGw9Zi5zd2VlcENvbXBsZXRlKHMsciwwLGEsdSxjLDAsYSx1LGMpO2Vsc2V7dmFyIHA9aC5tYWxsb2NEb3VibGUoMipzKm8pLGc9aC5tYWxsb2NJbnQzMihvKTtvPWkoZSxzLHAsZyksbz4wJiYoZi5pbml0KGErbyksbD0xPT09cz9mLnN3ZWVwQmlwYXJ0aXRlKHMsciwwLGEsdSxjLDAsbyxwLGcpOmQocyxyLG4sYSx1LGMsbyxwLGcpLGguZnJlZShwKSxoLmZyZWUoZykpfWguZnJlZSh1KSxoLmZyZWUoYyl9cmV0dXJuIGx9fX1mdW5jdGlvbiBvKHQsZSl7Yy5wdXNoKFt0LGVdKX1mdW5jdGlvbiBzKHQpe3JldHVybiBjPVtdLGEodCx0LG8sITApLGN9ZnVuY3Rpb24gbCh0LGUpe3JldHVybiBjPVtdLGEodCxlLG8sITEpLGN9ZnVuY3Rpb24gdSh0LGUscil7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMTpyZXR1cm4gcyh0KTtjYXNlIDI6cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGU/YSh0LHQsZSwhMCk6bCh0LGUpO2Nhc2UgMzpyZXR1cm4gYSh0LGUsciwhMSk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImJveC1pbnRlcnNlY3Q6IEludmFsaWQgYXJndW1lbnRzIil9fWUuZXhwb3J0cz11O3ZhciBjLGg9dCgidHlwZWRhcnJheS1wb29sIiksZj10KCIuL2xpYi9zd2VlcCIpLGQ9dCgiLi9saWIvaW50ZXJzZWN0Iil9LHsiLi9saWIvaW50ZXJzZWN0Ijo1OSwiLi9saWIvc3dlZXAiOjYzLCJ0eXBlZGFycmF5LXBvb2wiOjQ5Nn1dLDU4OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIpe3ZhciBuPSJicnV0ZUZvcmNlIisodD8iUmVkIjoiQmx1ZSIpKyhlPyJGbGlwIjoiIikrKHI/IkZ1bGwiOiIiKSxpPVsiZnVuY3Rpb24gIixuLCIoIix3LmpvaW4oKSwiKXsiLCJ2YXIgIix1LCI9MioiLGEsIjsiXSxsPSJmb3IodmFyIGk9IitjKyIsIitwKyI9Iit1KyIqIitjKyI7aTwiK2grIjsrK2ksIitwKyIrPSIrdSsiKXt2YXIgeDA9IitmKyJbIitvKyIrIitwKyJdLHgxPSIrZisiWyIrbysiKyIrcCsiKyIrYSsiXSx4aT0iK2QrIltpXTsiLE09ImZvcih2YXIgaj0iK2crIiwiK3grIj0iK3UrIioiK2crIjtqPCIrbSsiOysraiwiK3grIis9Iit1KyIpe3ZhciB5MD0iK3YrIlsiK28rIisiK3grIl0sIisocj8ieTE9Iit2KyJbIitvKyIrIit4KyIrIithKyJdLCI6IiIpKyJ5aT0iK3krIltqXTsiO3JldHVybiB0P2kucHVzaChsLF8sIjoiLE0pOmkucHVzaChNLF8sIjoiLGwpLHI/aS5wdXNoKCJpZih5MTx4MHx8eDE8eTApY29udGludWU7Iik6ZT9pLnB1c2goImlmKHkwPD14MHx8eDE8eTApY29udGludWU7Iik6aS5wdXNoKCJpZih5MDx4MHx8eDE8eTApY29udGludWU7IiksaS5wdXNoKCJmb3IodmFyIGs9IitvKyIrMTtrPCIrYSsiOysrayl7dmFyIHIwPSIrZisiW2srIitwKyJdLHIxPSIrZisiW2srIithKyIrIitwKyJdLGIwPSIrdisiW2srIit4KyJdLGIxPSIrdisiW2srIithKyIrIit4KyJdO2lmKHIxPGIwfHxiMTxyMCljb250aW51ZSAiK18rIjt9dmFyICIrYisiPSIrcysiKCIpLGU/aS5wdXNoKCJ5aSx4aSIpOmkucHVzaCgieGkseWkiKSxpLnB1c2goIik7aWYoIitiKyIhPT12b2lkIDApcmV0dXJuICIrYisiO319fSIpLHtuYW1lOm4sY29kZTppLmpvaW4oIiIpfX1mdW5jdGlvbiBpKHQpe2Z1bmN0aW9uIGUoZSxyKXt2YXIgYT1uKGUscix0KTtpLnB1c2goYS5jb2RlKSxvLnB1c2goInJldHVybiAiK2EubmFtZSsiKCIrdy5qb2luKCkrIik7Iil9dmFyIHI9ImJydXRlRm9yY2UiKyh0PyJGdWxsIjoiUGFydGlhbCIpLGk9W10sYT13LnNsaWNlKCk7dHx8YS5zcGxpY2UoMywwLGwpO3ZhciBvPVsiZnVuY3Rpb24gIityKyIoIithLmpvaW4oKSsiKXsiXTtvLnB1c2goImlmKCIraCsiLSIrYysiPiIrbSsiLSIrZysiKXsiKSx0PyhlKCEwLCExKSxvLnB1c2goIn1lbHNleyIpLGUoITEsITEpKTooby5wdXNoKCJpZigiK2wrIil7IiksZSghMCwhMCksby5wdXNoKCJ9ZWxzZXsiKSxlKCEwLCExKSxvLnB1c2goIn19ZWxzZXtpZigiK2wrIil7IiksZSghMSwhMCksby5wdXNoKCJ9ZWxzZXsiKSxlKCExLCExKSxvLnB1c2goIn0iKSksby5wdXNoKCJ9fXJldHVybiAiK3IpO3ZhciBzPWkuam9pbigiIikrby5qb2luKCIiKSx1PW5ldyBGdW5jdGlvbihzKTtyZXR1cm4gdSgpfXZhciBhPSJkIixvPSJheCIscz0idnYiLGw9ImZwIix1PSJlcyIsYz0icnMiLGg9InJlIixmPSJyYiIsZD0icmkiLHA9InJwIixnPSJicyIsbT0iYmUiLHY9ImJiIix5PSJiaSIseD0iYnAiLGI9InJ2IixfPSJRIix3PVthLG8scyxjLGgsZixkLGcsbSx2LHldO3IucGFydGlhbD1pKCExKSxyLmZ1bGw9aSghMCl9LHt9XSw1OTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7dmFyIHI9OCp1LmxvZzIoZSsxKSoodCsxKXwwLG49dS5uZXh0UG93MihrKnIpO1MubGVuZ3RoPG4mJihsLmZyZWUoUyksUz1sLm1hbGxvY0ludDMyKG4pKTsKdmFyIGk9dS5uZXh0UG93MihUKnIpO0w8aSYmKGwuZnJlZShMKSxMPWwubWFsbG9jRG91YmxlKGkpKX1mdW5jdGlvbiBpKHQsZSxyLG4saSxhLG8scyxsKXt2YXIgdT1rKnQ7U1t1XT1lLFNbdSsxXT1yLFNbdSsyXT1uLFNbdSszXT1pLFNbdSs0XT1hLFNbdSs1XT1vO3ZhciBjPVQqdDtMW2NdPXMsTFtjKzFdPWx9ZnVuY3Rpb24gYSh0LGUscixuLGksYSxvLHMsbCx1LGMpe3ZhciBoPTIqdCxmPWwqaCxkPXVbZitlXTt0OmZvcih2YXIgcD1pLGc9aSpoO3A8YTsrK3AsZys9aCl7dmFyIG09b1tnK2VdLHY9b1tnK2UrdF07aWYoIShkPG18fHY8ZHx8biYmZD09PW0pKXtmb3IodmFyIHk9c1twXSx4PWUrMTt4PHQ7Kyt4KXt2YXIgbT1vW2creF0sdj1vW2creCt0XSxiPXVbZit4XSxfPXVbZit4K3RdO2lmKHY8Ynx8XzxtKWNvbnRpbnVlIHR9dmFyIHc7aWYodz1uP3IoYyx5KTpyKHksYyksdm9pZCAwIT09dylyZXR1cm4gd319fWZ1bmN0aW9uIG8odCxlLHIsbixpLGEsbyxzLGwsdSl7dmFyIGM9Mip0LGg9cypjLGY9bFtoK2VdO3Q6Zm9yKHZhciBkPW4scD1uKmM7ZDxpOysrZCxwKz1jKXt2YXIgZz1vW2RdO2lmKGchPT11KXt2YXIgbT1hW3ArZV0sdj1hW3ArZSt0XTtpZighKGY8bXx8djxmKSl7Zm9yKHZhciB5PWUrMTt5PHQ7Kyt5KXt2YXIgbT1hW3AreV0sdj1hW3AreSt0XSx4PWxbaCt5XSxiPWxbaCt5K3RdO2lmKHY8eHx8YjxtKWNvbnRpbnVlIHR9dmFyIF89cihnLHUpO2lmKHZvaWQgMCE9PV8pcmV0dXJuIF99fX19ZnVuY3Rpb24gcyh0LGUscixzLGwsdSxjLGcsRSl7bih0LHMrYyk7dmFyIHosQz0wLEk9Mip0O2ZvcihpKEMrKywwLDAscywwLGMscj8xNjowLC0oMS8wKSwxLzApLHJ8fGkoQysrLDAsMCxjLDAscywxLC0oMS8wKSwxLzApO0M+MDspe0MtPTE7dmFyIFA9QyprLEQ9U1tQXSxSPVNbUCsxXSxPPVNbUCsyXSxGPVNbUCszXSxqPVNbUCs0XSxOPVNbUCs1XSxCPUMqVCxVPUxbQl0sVj1MW0IrMV0scT0xJk4sSD0hISgxNiZOKSxHPWwsWD11LFk9ZyxXPUU7aWYocSYmKEc9ZyxYPUUsWT1sLFc9dSksISgyJk4mJihPPV8odCxELFIsTyxHLFgsViksUj49Tyl8fDQmTiYmKFI9dyh0LEQsUixPLEcsWCxVKSxSPj1PKSkpe3ZhciBaPU8tUixRPWotRjtpZihIKXtpZih0KloqKForUSk8eSl7aWYoej1kLnNjYW5Db21wbGV0ZSh0LEQsZSxSLE8sRyxYLEYsaixZLFcpLHZvaWQgMCE9PXopcmV0dXJuIHo7Y29udGludWV9fWVsc2V7aWYodCpNYXRoLm1pbihaLFEpPG0pe2lmKHo9aCh0LEQsZSxxLFIsTyxHLFgsRixqLFksVyksdm9pZCAwIT09eilyZXR1cm4gejtjb250aW51ZX1pZih0KloqUTx2KXtpZih6PWQuc2NhbkJpcGFydGl0ZSh0LEQsZSxxLFIsTyxHLFgsRixqLFksVyksdm9pZCAwIT09eilyZXR1cm4gejtjb250aW51ZX19dmFyIEs9eCh0LEQsUixPLEcsWCxVLFYpO2lmKFI8SylpZih0KihLLVIpPG0pe2lmKHo9Zih0LEQrMSxlLFIsSyxHLFgsRixqLFksVyksdm9pZCAwIT09eilyZXR1cm4gen1lbHNlIGlmKEQ9PT10LTIpe2lmKHo9cT9kLnN3ZWVwQmlwYXJ0aXRlKHQsZSxGLGosWSxXLFIsSyxHLFgpOmQuc3dlZXBCaXBhcnRpdGUodCxlLFIsSyxHLFgsRixqLFksVyksdm9pZCAwIT09eilyZXR1cm4gen1lbHNlIGkoQysrLEQrMSxSLEssRixqLHEsLSgxLzApLDEvMCksaShDKyssRCsxLEYsaixSLEssMV5xLC0oMS8wKSwxLzApO2lmKEs8Tyl7dmFyICQ9cCh0LEQsRixqLFksVyksSj1ZW0kqJCtEXSx0dD1iKHQsRCwkLGosWSxXLEopO2lmKHR0PGomJmkoQysrLEQsSyxPLHR0LGosKDR8cSkrKEg/MTY6MCksSixWKSxGPCQmJmkoQysrLEQsSyxPLEYsJCwoMnxxKSsoSD8xNjowKSxVLEopLCQrMT09PXR0KXtpZih6PUg/byh0LEQsZSxLLE8sRyxYLCQsWSxXWyRdKTphKHQsRCxlLHEsSyxPLEcsWCwkLFksV1skXSksdm9pZCAwIT09eilyZXR1cm4gen1lbHNlIGlmKCQ8dHQpe3ZhciBldDtpZihIKXtpZihldD1NKHQsRCxLLE8sRyxYLEopLEs8ZXQpe3ZhciBydD1iKHQsRCxLLGV0LEcsWCxKKTtpZihEPT09dC0yKXtpZihLPHJ0JiYoej1kLnN3ZWVwQ29tcGxldGUodCxlLEsscnQsRyxYLCQsdHQsWSxXKSx2b2lkIDAhPT16KSlyZXR1cm4gejtpZihydDxldCYmKHo9ZC5zd2VlcEJpcGFydGl0ZSh0LGUscnQsZXQsRyxYLCQsdHQsWSxXKSx2b2lkIDAhPT16KSlyZXR1cm4gen1lbHNlIEs8cnQmJmkoQysrLEQrMSxLLHJ0LCQsdHQsMTYsLSgxLzApLDEvMCkscnQ8ZXQmJihpKEMrKyxEKzEscnQsZXQsJCx0dCwwLC0oMS8wKSwxLzApLGkoQysrLEQrMSwkLHR0LHJ0LGV0LDEsLSgxLzApLDEvMCkpfX1lbHNlIGV0PXE/QSh0LEQsSyxPLEcsWCxKKTpNKHQsRCxLLE8sRyxYLEopLEs8ZXQmJihEPT09dC0yP3o9cT9kLnN3ZWVwQmlwYXJ0aXRlKHQsZSwkLHR0LFksVyxLLGV0LEcsWCk6ZC5zd2VlcEJpcGFydGl0ZSh0LGUsSyxldCxHLFgsJCx0dCxZLFcpOihpKEMrKyxEKzEsSyxldCwkLHR0LHEsLSgxLzApLDEvMCksaShDKyssRCsxLCQsdHQsSyxldCwxXnEsLSgxLzApLDEvMCkpKX19fX19ZS5leHBvcnRzPXM7dmFyIGw9dCgidHlwZWRhcnJheS1wb29sIiksdT10KCJiaXQtdHdpZGRsZSIpLGM9dCgiLi9icnV0ZSIpLGg9Yy5wYXJ0aWFsLGY9Yy5mdWxsLGQ9dCgiLi9zd2VlcCIpLHA9dCgiLi9tZWRpYW4iKSxnPXQoIi4vcGFydGl0aW9uIiksbT0xMjgsdj0xPDwyMix5PTE8PDIyLHg9ZygiIShsbz49cDApJiYhKHAxPj1oaSkiLFsicDAiLCJwMSJdKSxiPWcoImxvPT09cDAiLFsicDAiXSksXz1nKCJsbzxwMCIsWyJwMCJdKSx3PWcoImhpPD1wMCIsWyJwMCJdKSxNPWcoImxvPD1wMCYmcDA8PWhpIixbInAwIl0pLEE9ZygibG88cDAmJnAwPD1oaSIsWyJwMCJdKSxrPTYsVD0yLEU9MTAyNCxTPWwubWFsbG9jSW50MzIoRSksTD1sLm1hbGxvY0RvdWJsZShFKX0seyIuL2JydXRlIjo1OCwiLi9tZWRpYW4iOjYwLCIuL3BhcnRpdGlvbiI6NjEsIi4vc3dlZXAiOjYzLCJiaXQtdHdpZGRsZSI6NTQsInR5cGVkYXJyYXktcG9vbCI6NDk2fV0sNjA6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuLGksYSl7Zm9yKHZhciBvPTIqdCxzPW8qKHIrMSkrZSxsPXIrMTtsPG47KytsLHMrPW8pZm9yKHZhciB1PWlbc10sYz1sLGg9byoobC0xKTtjPnImJmlbaCtlXT51Oy0tYyxoLT1vKXtmb3IodmFyIGY9aCxkPWgrbyxwPTA7cDxvOysrcCwrK2YsKytkKXt2YXIgZz1pW2ZdO2lbZl09aVtkXSxpW2RdPWd9dmFyIG09YVtjXTthW2NdPWFbYy0xXSxhW2MtMV09bX19ZnVuY3Rpb24gaSh0LGUscixpLGEsbCl7aWYoaTw9cisxKXJldHVybiByO2Zvcih2YXIgdT1yLGM9aSxoPWkrcj4+PjEsZj0yKnQsZD1oLHA9YVtmKmgrZV07dTxjOyl7aWYoYy11PHMpe24odCxlLHUsYyxhLGwpLHA9YVtmKmgrZV07YnJlYWt9dmFyIGc9Yy11LG09TWF0aC5yYW5kb20oKSpnK3V8MCx2PWFbZiptK2VdLHk9TWF0aC5yYW5kb20oKSpnK3V8MCx4PWFbZip5K2VdLGI9TWF0aC5yYW5kb20oKSpnK3V8MCxfPWFbZipiK2VdO3Y8PXg/Xz49eD8oZD15LHA9eCk6dj49Xz8oZD1tLHA9dik6KGQ9YixwPV8pOng+PV8/KGQ9eSxwPXgpOl8+PXY/KGQ9bSxwPXYpOihkPWIscD1fKTtmb3IodmFyIHc9ZiooYy0xKSxNPWYqZCxBPTA7QTxmOysrQSwrK3csKytNKXt2YXIgaz1hW3ddO2Fbd109YVtNXSxhW01dPWt9dmFyIFQ9bFtjLTFdO2xbYy0xXT1sW2RdLGxbZF09VCxkPW8odCxlLHUsYy0xLGEsbCxwKTtmb3IodmFyIHc9ZiooYy0xKSxNPWYqZCxBPTA7QTxmOysrQSwrK3csKytNKXt2YXIgaz1hW3ddO2Fbd109YVtNXSxhW01dPWt9dmFyIFQ9bFtjLTFdO2lmKGxbYy0xXT1sW2RdLGxbZF09VCxoPGQpe2ZvcihjPWQtMTt1PGMmJmFbZiooYy0xKStlXT09PXA7KWMtPTE7Yys9MX1lbHNle2lmKCEoZDxoKSlicmVhaztmb3IodT1kKzE7dTxjJiZhW2YqdStlXT09PXA7KXUrPTF9fXJldHVybiBvKHQsZSxyLGgsYSxsLGFbZipoK2VdKX1lLmV4cG9ydHM9aTt2YXIgYT10KCIuL3BhcnRpdGlvbiIpLG89YSgibG88cDAiLFsicDAiXSkscz04fSx7Ii4vcGFydGl0aW9uIjo2MX1dLDYxOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXt2YXIgcj0iYWJjZGVmIi5zcGxpdCgiIikuY29uY2F0KGUpLG49W107cmV0dXJuIHQuaW5kZXhPZigibG8iKT49MCYmbi5wdXNoKCJsbz1lW2srbl0iKSx0LmluZGV4T2YoImhpIik+PTAmJm4ucHVzaCgiaGk9ZVtrK29dIiksci5wdXNoKGkucmVwbGFjZSgiXyIsbi5qb2luKCkpLnJlcGxhY2UoIiQiLHQpKSxGdW5jdGlvbi5hcHBseSh2b2lkIDAscil9ZS5leHBvcnRzPW47dmFyIGk9ImZvcih2YXIgaj0yKmEsaz1qKmMsbD1rLG09YyxuPWIsbz1hK2IscD1jO2Q+cDsrK3Asays9ail7dmFyIF87aWYoJClpZihtPT09cCltKz0xLGwrPWo7ZWxzZXtmb3IodmFyIHM9MDtqPnM7KytzKXt2YXIgdD1lW2src107ZVtrK3NdPWVbbF0sZVtsKytdPXR9dmFyIHU9ZltwXTtmW3BdPWZbbV0sZlttKytdPXV9fXJldHVybiBtIn0se31dLDYyOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtlPD00KmY/aSgwLGUtMSx0KTpoKDAsZS0xLHQpfWZ1bmN0aW9uIGkodCxlLHIpe2Zvcih2YXIgbj0yKih0KzEpLGk9dCsxO2k8PWU7KytpKXtmb3IodmFyIGE9cltuKytdLG89cltuKytdLHM9aSxsPW4tMjtzLS0gPnQ7KXt2YXIgdT1yW2wtMl0sYz1yW2wtMV07aWYodTxhKWJyZWFrO2lmKHU9PT1hJiZjPG8pYnJlYWs7cltsXT11LHJbbCsxXT1jLGwtPTJ9cltsXT1hLHJbbCsxXT1vfX1mdW5jdGlvbiBhKHQsZSxyKXt0Kj0yLGUqPTI7dmFyIG49clt0XSxpPXJbdCsxXTtyW3RdPXJbZV0sclt0KzFdPXJbZSsxXSxyW2VdPW4scltlKzFdPWl9ZnVuY3Rpb24gbyh0LGUscil7dCo9MixlKj0yLHJbdF09cltlXSxyW3QrMV09cltlKzFdfWZ1bmN0aW9uIHModCxlLHIsbil7dCo9MixlKj0yLHIqPTI7dmFyIGk9blt0XSxhPW5bdCsxXTtuW3RdPW5bZV0sblt0KzFdPW5bZSsxXSxuW2VdPW5bcl0sbltlKzFdPW5bcisxXSxuW3JdPWksbltyKzFdPWF9ZnVuY3Rpb24gbCh0LGUscixuLGkpe3QqPTIsZSo9MixpW3RdPWlbZV0saVtlXT1yLGlbdCsxXT1pW2UrMV0saVtlKzFdPW59ZnVuY3Rpb24gdSh0LGUscil7dCo9MixlKj0yO3ZhciBuPXJbdF0saT1yW2VdO3JldHVybiEobjxpKSYmKG4hPT1pfHxyW3QrMV0+cltlKzFdKX1mdW5jdGlvbiBjKHQsZSxyLG4pe3QqPTI7dmFyIGk9blt0XTtyZXR1cm4gaTxlfHxpPT09ZSYmblt0KzFdPHJ9ZnVuY3Rpb24gaCh0LGUscil7dmFyIG49KGUtdCsxKS82fDAsZD10K24scD1lLW4sZz10K2U+PjEsbT1nLW4sdj1nK24seT1kLHg9bSxiPWcsXz12LHc9cCxNPXQrMSxBPWUtMSxrPTA7dSh5LHgscikmJihrPXkseT14LHg9ayksdShfLHcscikmJihrPV8sXz13LHc9ayksdSh5LGIscikmJihrPXkseT1iLGI9ayksdSh4LGIscikmJihrPXgseD1iLGI9ayksdSh5LF8scikmJihrPXkseT1fLF89ayksdShiLF8scikmJihrPWIsYj1fLF89ayksdSh4LHcscikmJihrPXgseD13LHc9ayksdSh4LGIscikmJihrPXgseD1iLGI9ayksdShfLHcscikmJihrPV8sXz13LHc9ayk7Zm9yKHZhciBUPXJbMip4XSxFPXJbMip4KzFdLFM9clsyKl9dLEw9clsyKl8rMV0sej0yKnksQz0yKmIsST0yKncsUD0yKmQsRD0yKmcsUj0yKnAsTz0wO088MjsrK08pe3ZhciBGPXJbeitPXSxqPXJbQytPXSxOPXJbSStPXTtyW1ArT109RixyW0QrT109aixyW1IrT109Tn1vKG0sdCxyKSxvKHYsZSxyKTtmb3IodmFyIEI9TTtCPD1BOysrQilpZihjKEIsVCxFLHIpKUIhPT1NJiZhKEIsTSxyKSwrK007ZWxzZSBpZighYyhCLFMsTCxyKSlmb3IoOzspe2lmKGMoQSxTLEwscikpe2MoQSxULEUscik/KHMoQixNLEEsciksKytNLC0tQSk6KGEoQixBLHIpLC0tQSk7YnJlYWt9aWYoLS1BPEIpYnJlYWt9bCh0LE0tMSxULEUsciksbChlLEErMSxTLEwsciksTS0yLXQ8PWY/aSh0LE0tMixyKTpoKHQsTS0yLHIpLGUtKEErMik8PWY/aShBKzIsZSxyKTpoKEErMixlLHIpLEEtTTw9Zj9pKE0sQSxyKTpoKE0sQSxyKX1lLmV4cG9ydHM9bjt2YXIgZj0zMn0se31dLDYzOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGU9aC5uZXh0UG93Mih0KTtnLmxlbmd0aDxlJiYoYy5mcmVlKGcpLGc9Yy5tYWxsb2NJbnQzMihlKSksbS5sZW5ndGg8ZSYmKGMuZnJlZShtKSxtPWMubWFsbG9jSW50MzIoZSkpLHYubGVuZ3RoPGUmJihjLmZyZWUodiksdj1jLm1hbGxvY0ludDMyKGUpKSx5Lmxlbmd0aDxlJiYoYy5mcmVlKHkpLHk9Yy5tYWxsb2NJbnQzMihlKSkseC5sZW5ndGg8ZSYmKGMuZnJlZSh4KSx4PWMubWFsbG9jSW50MzIoZSkpLGIubGVuZ3RoPGUmJihjLmZyZWUoYiksYj1jLm1hbGxvY0ludDMyKGUpKTt2YXIgcj04KmU7Xy5sZW5ndGg8ciYmKGMuZnJlZShfKSxfPWMubWFsbG9jRG91YmxlKHIpKX1mdW5jdGlvbiBpKHQsZSxyLG4pe3ZhciBpPWVbbl0sYT10W3ItMV07dFtpXT1hLGVbYV09aX1mdW5jdGlvbiBhKHQsZSxyLG4pe3Rbcl09bixlW25dPXJ9ZnVuY3Rpb24gbyh0LGUscixuLG8scyxsLHUsYyxoKXtmb3IodmFyIHA9MCx4PTIqdCxiPXQtMSx3PXgtMSxNPXI7TTxuOysrTSl7dmFyIEE9c1tNXSxrPXgqTTtfW3ArK109b1trK2JdLF9bcCsrXT0tKEErMSksX1twKytdPW9bayt3XSxfW3ArK109QX1mb3IodmFyIE09bDtNPHU7KytNKXt2YXIgQT1oW01dK2QsVD14Kk07X1twKytdPWNbVCtiXSxfW3ArK109LUEsX1twKytdPWNbVCt3XSxfW3ArK109QX12YXIgRT1wPj4+MTtmKF8sRSk7Zm9yKHZhciBTPTAsTD0wLE09MDtNPEU7KytNKXt2YXIgej0wfF9bMipNKzFdO2lmKHo+PWQpej16LWR8MCxpKHYseSxMLS0seik7ZWxzZSBpZih6Pj0wKWkoZyxtLFMtLSx6KTtlbHNlIGlmKHo8PS1kKXt6PS16LWR8MDtmb3IodmFyIEM9MDtDPFM7KytDKXt2YXIgST1lKGdbQ10seik7aWYodm9pZCAwIT09SSlyZXR1cm4gSX1hKHYseSxMKysseil9ZWxzZXt6PS16LTF8MDtmb3IodmFyIEM9MDtDPEw7KytDKXt2YXIgST1lKHosdltDXSk7aWYodm9pZCAwIT09SSlyZXR1cm4gSX1hKGcsbSxTKysseil9fX1mdW5jdGlvbiBzKHQsZSxyLG4sbyxzLGwsdSxjLGgpe2Zvcih2YXIgZD0wLHA9Mip0LHc9dC0xLE09cC0xLEE9cjtBPG47KytBKXt2YXIgaz1zW0FdKzE8PDEsVD1wKkE7X1tkKytdPW9bVCt3XSxfW2QrK109LWssX1tkKytdPW9bVCtNXSxfW2QrK109a31mb3IodmFyIEE9bDtBPHU7KytBKXt2YXIgaz1oW0FdKzE8PDEsRT1wKkE7X1tkKytdPWNbRSt3XSxfW2QrK109MXwtayxfW2QrK109Y1tFK01dLF9bZCsrXT0xfGt9dmFyIFM9ZD4+PjE7ZihfLFMpO2Zvcih2YXIgTD0wLHo9MCxDPTAsQT0wO0E8UzsrK0Epe3ZhciBJPTB8X1syKkErMV0sUD0xJkk7aWYoQTxTLTEmJkk+PjE9PT1fWzIqQSszXT4+MSYmKFA9MixBKz0xKSxJPDApe2Zvcih2YXIgRD0tKEk+PjEpLTEsUj0wO1I8QzsrK1Ipe3ZhciBPPWUoeFtSXSxEKTtpZih2b2lkIDAhPT1PKXJldHVybiBPfWlmKDAhPT1QKWZvcih2YXIgUj0wO1I8TDsrK1Ipe3ZhciBPPWUoZ1tSXSxEKTtpZih2b2lkIDAhPT1PKXJldHVybiBPfWlmKDEhPT1QKWZvcih2YXIgUj0wO1I8ejsrK1Ipe3ZhciBPPWUodltSXSxEKTtpZih2b2lkIDAhPT1PKXJldHVybiBPfTA9PT1QP2EoZyxtLEwrKyxEKToxPT09UD9hKHYseSx6KyssRCk6Mj09PVAmJmEoeCxiLEMrKyxEKX1lbHNle3ZhciBEPShJPj4xKS0xOzA9PT1QP2koZyxtLEwtLSxEKToxPT09UD9pKHYseSx6LS0sRCk6Mj09PVAmJmkoeCxiLEMtLSxEKX19fWZ1bmN0aW9uIGwodCxlLHIsbixvLHMsbCx1LGMsaCxwLHYpe3ZhciB5PTAseD0yKnQsYj1lLHc9ZSt0LE09MSxBPTE7bj9BPWQ6TT1kO2Zvcih2YXIgaz1vO2s8czsrK2spe3ZhciBUPWsrTSxFPXgqaztfW3krK109bFtFK2JdLF9beSsrXT0tVCxfW3krK109bFtFK3ddLF9beSsrXT1UfWZvcih2YXIgaz1jO2s8aDsrK2spe3ZhciBUPWsrQSxTPXgqaztfW3krK109cFtTK2JdLF9beSsrXT0tVH12YXIgTD15Pj4+MTtmKF8sTCk7Zm9yKHZhciB6PTAsaz0wO2s8TDsrK2spe3ZhciBDPTB8X1syKmsrMV07aWYoQzwwKXt2YXIgVD0tQyxJPSExO2lmKFQ+PWQ/KEk9IW4sVC09ZCk6KEk9ISFuLFQtPTEpLEkpYShnLG0seisrLFQpO2Vsc2V7dmFyIFA9dltUXSxEPXgqVCxSPXBbRCtlKzFdLE89cFtEK2UrMSt0XTt0OmZvcih2YXIgRj0wO0Y8ejsrK0Ype3ZhciBqPWdbRl0sTj14Kmo7aWYoIShPPGxbTitlKzFdfHxsW04rZSsxK3RdPFIpKXtmb3IodmFyIEI9ZSsyO0I8dDsrK0IpaWYocFtEK0IrdF08bFtOK0JdfHxsW04rQit0XTxwW0QrQl0pY29udGludWUgdDt2YXIgVSxWPXVbal07aWYoVT1uP3IoUCxWKTpyKFYsUCksdm9pZCAwIT09VSlyZXR1cm4gVX19fX1lbHNlIGkoZyxtLHotLSxDLU0pfX1mdW5jdGlvbiB1KHQsZSxyLG4saSxhLG8scyxsLHUsYyl7Zm9yKHZhciBoPTAscD0yKnQsbT1lLHY9ZSt0LHk9bjt5PGk7Kyt5KXt2YXIgeD15K2QsYj1wKnk7X1toKytdPWFbYittXSxfW2grK109LXgsX1toKytdPWFbYit2XSxfW2grK109eH1mb3IodmFyIHk9czt5PGw7Kyt5KXt2YXIgeD15KzEsdz1wKnk7X1toKytdPXVbdyttXSxfW2grK109LXh9dmFyIE09aD4+PjE7ZihfLE0pO2Zvcih2YXIgQT0wLHk9MDt5PE07Kyt5KXt2YXIgaz0wfF9bMip5KzFdO2lmKGs8MCl7dmFyIHg9LWs7aWYoeD49ZClnW0ErK109eC1kO2Vsc2V7eC09MTt2YXIgVD1jW3hdLEU9cCp4LFM9dVtFK2UrMV0sTD11W0UrZSsxK3RdO3Q6Zm9yKHZhciB6PTA7ejxBOysreil7dmFyIEM9Z1t6XSxJPW9bQ107aWYoST09PVQpYnJlYWs7dmFyIFA9cCpDO2lmKCEoTDxhW1ArZSsxXXx8YVtQK2UrMSt0XTxTKSl7Zm9yKHZhciBEPWUrMjtEPHQ7KytEKWlmKHVbRStEK3RdPGFbUCtEXXx8YVtQK0QrdF08dVtFK0RdKWNvbnRpbnVlIHQ7dmFyIFI9cihJLFQpO2lmKHZvaWQgMCE9PVIpcmV0dXJuIFJ9fX19ZWxzZXtmb3IodmFyIHg9ay1kLHo9QS0xO3o+PTA7LS16KWlmKGdbel09PT14KXtmb3IodmFyIEQ9eisxO0Q8QTsrK0QpZ1tELTFdPWdbRF07YnJlYWt9LS1BfX19ZS5leHBvcnRzPXtpbml0Om4sc3dlZXBCaXBhcnRpdGU6byxzd2VlcENvbXBsZXRlOnMsc2NhbkJpcGFydGl0ZTpsLHNjYW5Db21wbGV0ZTp1fTt2YXIgYz10KCJ0eXBlZGFycmF5LXBvb2wiKSxoPXQoImJpdC10d2lkZGxlIiksZj10KCIuL3NvcnQiKSxkPTE8PDI4LHA9MTAyNCxnPWMubWFsbG9jSW50MzIocCksbT1jLm1hbGxvY0ludDMyKHApLHY9Yy5tYWxsb2NJbnQzMihwKSx5PWMubWFsbG9jSW50MzIocCkseD1jLm1hbGxvY0ludDMyKHApLGI9Yy5tYWxsb2NJbnQzMihwKSxfPWMubWFsbG9jRG91YmxlKDgqcCl9LHsiLi9zb3J0Ijo2MiwiYml0LXR3aWRkbGUiOjU0LCJ0eXBlZGFycmF5LXBvb2wiOjQ5Nn1dLDY0OltmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKCl7dHJ5e3ZhciB0PW5ldyBVaW50OEFycmF5KDEpO3JldHVybiB0Ll9fcHJvdG9fXz17X19wcm90b19fOlVpbnQ4QXJyYXkucHJvdG90eXBlLGZvbzpmdW5jdGlvbigpe3JldHVybiA0Mn19LDQyPT09dC5mb28oKSYmImZ1bmN0aW9uIj09dHlwZW9mIHQuc3ViYXJyYXkmJjA9PT10LnN1YmFycmF5KDEsMSkuYnl0ZUxlbmd0aH1jYXRjaCh0KXtyZXR1cm4hMX19ZnVuY3Rpb24gaSgpe3JldHVybiBvLlRZUEVEX0FSUkFZX1NVUFBPUlQ/MjE0NzQ4MzY0NzoxMDczNzQxODIzfWZ1bmN0aW9uIGEodCxlKXtpZihpKCk8ZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgiKTtyZXR1cm4gby5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0PW5ldyBVaW50OEFycmF5KGUpLHQuX19wcm90b19fPW8ucHJvdG90eXBlKToobnVsbD09PXQmJih0PW5ldyBvKGUpKSx0Lmxlbmd0aD1lKSx0fWZ1bmN0aW9uIG8odCxlLHIpe2lmKCEoby5UWVBFRF9BUlJBWV9TVVBQT1JUfHx0aGlzIGluc3RhbmNlb2YgbykpcmV0dXJuIG5ldyBvKHQsZSxyKTtpZigibnVtYmVyIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoIklmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIik7cmV0dXJuIGModGhpcyx0KX1yZXR1cm4gcyh0aGlzLHQsZSxyKX1mdW5jdGlvbiBzKHQsZSxyLG4pe2lmKCJudW1iZXIiPT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyP2QodCxlLHIsbik6InN0cmluZyI9PXR5cGVvZiBlP2godCxlLHIpOnAodCxlKX1mdW5jdGlvbiBsKHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJyl9ZnVuY3Rpb24gdSh0LGUscixuKXtyZXR1cm4gbChlKSxlPD0wP2EodCxlKTp2b2lkIDAhPT1yPyJzdHJpbmciPT10eXBlb2Ygbj9hKHQsZSkuZmlsbChyLG4pOmEodCxlKS5maWxsKHIpOmEodCxlKX1mdW5jdGlvbiBjKHQsZSl7aWYobChlKSx0PWEodCxlPDA/MDowfGcoZSkpLCFvLlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKHZhciByPTA7cjxlOysrcil0W3JdPTA7cmV0dXJuIHR9ZnVuY3Rpb24gaCh0LGUscil7aWYoInN0cmluZyI9PXR5cGVvZiByJiYiIiE9PXJ8fChyPSJ1dGY4IiksIW8uaXNFbmNvZGluZyhyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciZW5jb2RpbmciIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKTt2YXIgbj0wfHYoZSxyKTt0PWEodCxuKTt2YXIgaT10LndyaXRlKGUscik7cmV0dXJuIGkhPT1uJiYodD10LnNsaWNlKDAsaSkpLHR9ZnVuY3Rpb24gZih0LGUpe3ZhciByPWUubGVuZ3RoPDA/MDowfGcoZS5sZW5ndGgpO3Q9YSh0LHIpO2Zvcih2YXIgbj0wO248cjtuKz0xKXRbbl09MjU1JmVbbl07cmV0dXJuIHR9ZnVuY3Rpb24gZCh0LGUscixuKXtpZihlLmJ5dGVMZW5ndGgscjwwfHxlLmJ5dGVMZW5ndGg8cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kcyIpO2lmKGUuYnl0ZUxlbmd0aDxyKyhufHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kcyIpO3JldHVybiBlPXZvaWQgMD09PXImJnZvaWQgMD09PW4/bmV3IFVpbnQ4QXJyYXkoZSk6dm9pZCAwPT09bj9uZXcgVWludDhBcnJheShlLHIpOm5ldyBVaW50OEFycmF5KGUscixuKSxvLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHQ9ZSx0Ll9fcHJvdG9fXz1vLnByb3RvdHlwZSk6dD1mKHQsZSksdH1mdW5jdGlvbiBwKHQsZSl7aWYoby5pc0J1ZmZlcihlKSl7dmFyIHI9MHxnKGUubGVuZ3RoKTtyZXR1cm4gdD1hKHQsciksMD09PXQubGVuZ3RoP3Q6KGUuY29weSh0LDAsMCxyKSx0KX1pZihlKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHwibGVuZ3RoImluIGUpcmV0dXJuIm51bWJlciIhPXR5cGVvZiBlLmxlbmd0aHx8UShlLmxlbmd0aCk/YSh0LDApOmYodCxlKTtpZigiQnVmZmVyIj09PWUudHlwZSYmSihlLmRhdGEpKXJldHVybiBmKHQsZS5kYXRhKX10aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuIil9ZnVuY3Rpb24gZyh0KXtpZih0Pj1pKCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHgiK2koKS50b1N0cmluZygxNikrIiBieXRlcyIpO3JldHVybiAwfHR9ZnVuY3Rpb24gbSh0KXtyZXR1cm4rdCE9dCYmKHQ9MCksby5hbGxvYygrdCl9ZnVuY3Rpb24gdih0LGUpe2lmKG8uaXNCdWZmZXIodCkpcmV0dXJuIHQubGVuZ3RoO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcmJihBcnJheUJ1ZmZlci5pc1ZpZXcodCl8fHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpcmV0dXJuIHQuYnl0ZUxlbmd0aDsic3RyaW5nIiE9dHlwZW9mIHQmJih0PSIiK3QpO3ZhciByPXQubGVuZ3RoO2lmKDA9PT1yKXJldHVybiAwO2Zvcih2YXIgbj0hMTs7KXN3aXRjaChlKXtjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiByO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSB2b2lkIDA6cmV0dXJuIEcodCkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipyO2Nhc2UiaGV4IjpyZXR1cm4gcj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBXKHQpLmxlbmd0aDtkZWZhdWx0OmlmKG4pcmV0dXJuIEcodCkubGVuZ3RoO2U9KCIiK2UpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24geSh0LGUscil7dmFyIG49ITE7aWYoKHZvaWQgMD09PWV8fGU8MCkmJihlPTApLGU+dGhpcy5sZW5ndGgpcmV0dXJuIiI7aWYoKHZvaWQgMD09PXJ8fHI+dGhpcy5sZW5ndGgpJiYocj10aGlzLmxlbmd0aCkscjw9MClyZXR1cm4iIjtpZihyPj4+PTAsZT4+Pj0wLHI8PWUpcmV0dXJuIiI7Zm9yKHR8fCh0PSJ1dGY4Iik7Oylzd2l0Y2godCl7Y2FzZSJoZXgiOnJldHVybiBQKHRoaXMsZSxyKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBMKHRoaXMsZSxyKTtjYXNlImFzY2lpIjpyZXR1cm4gQyh0aGlzLGUscik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gSSh0aGlzLGUscik7Y2FzZSJiYXNlNjQiOnJldHVybiBTKHRoaXMsZSxyKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIEQodGhpcyxlLHIpO2RlZmF1bHQ6aWYobil0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3QpO3Q9KHQrIiIpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24geCh0LGUscil7dmFyIG49dFtlXTt0W2VdPXRbcl0sdFtyXT1ufWZ1bmN0aW9uIGIodCxlLHIsbixpKXtpZigwPT09dC5sZW5ndGgpcmV0dXJuLTE7aWYoInN0cmluZyI9PXR5cGVvZiByPyhuPXIscj0wKTpyPjIxNDc0ODM2NDc/cj0yMTQ3NDgzNjQ3OnI8LTIxNDc0ODM2NDgmJihyPS0yMTQ3NDgzNjQ4KSxyPStyLGlzTmFOKHIpJiYocj1pPzA6dC5sZW5ndGgtMSkscjwwJiYocj10Lmxlbmd0aCtyKSxyPj10Lmxlbmd0aCl7aWYoaSlyZXR1cm4tMTtyPXQubGVuZ3RoLTF9ZWxzZSBpZihyPDApe2lmKCFpKXJldHVybi0xO3I9MH1pZigic3RyaW5nIj09dHlwZW9mIGUmJihlPW8uZnJvbShlLG4pKSxvLmlzQnVmZmVyKGUpKXJldHVybiAwPT09ZS5sZW5ndGg/LTE6Xyh0LGUscixuLGkpO2lmKCJudW1iZXIiPT10eXBlb2YgZSlyZXR1cm4gZT0yNTUmZSxvLlRZUEVEX0FSUkFZX1NVUFBPUlQmJiJmdW5jdGlvbiI9PXR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mP2k/VWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHQsZSxyKTpVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKHQsZSxyKTpfKHQsW2VdLHIsbixpKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXIiKX1mdW5jdGlvbiBfKHQsZSxyLG4saSl7ZnVuY3Rpb24gYSh0LGUpe3JldHVybiAxPT09bz90W2VdOnQucmVhZFVJbnQxNkJFKGUqbyl9dmFyIG89MSxzPXQubGVuZ3RoLGw9ZS5sZW5ndGg7aWYodm9pZCAwIT09biYmKG49U3RyaW5nKG4pLnRvTG93ZXJDYXNlKCksInVjczIiPT09bnx8InVjcy0yIj09PW58fCJ1dGYxNmxlIj09PW58fCJ1dGYtMTZsZSI9PT1uKSl7aWYodC5sZW5ndGg8Mnx8ZS5sZW5ndGg8MilyZXR1cm4tMTtvPTIscy89MixsLz0yLHIvPTJ9dmFyIHU7aWYoaSl7dmFyIGM9LTE7Zm9yKHU9cjt1PHM7dSsrKWlmKGEodCx1KT09PWEoZSxjPT09LTE/MDp1LWMpKXtpZihjPT09LTEmJihjPXUpLHUtYysxPT09bClyZXR1cm4gYypvfWVsc2UgYyE9PS0xJiYodS09dS1jKSxjPS0xfWVsc2UgZm9yKHIrbD5zJiYocj1zLWwpLHU9cjt1Pj0wO3UtLSl7Zm9yKHZhciBoPSEwLGY9MDtmPGw7ZisrKWlmKGEodCx1K2YpIT09YShlLGYpKXtoPSExO2JyZWFrfWlmKGgpcmV0dXJuIHV9cmV0dXJuLTF9ZnVuY3Rpb24gdyh0LGUscixuKXtyPU51bWJlcihyKXx8MDt2YXIgaT10Lmxlbmd0aC1yO24/KG49TnVtYmVyKG4pLG4+aSYmKG49aSkpOm49aTt2YXIgYT1lLmxlbmd0aDtpZihhJTIhPT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaGV4IHN0cmluZyIpO24+YS8yJiYobj1hLzIpO2Zvcih2YXIgbz0wO288bjsrK28pe3ZhciBzPXBhcnNlSW50KGUuc3Vic3RyKDIqbywyKSwxNik7aWYoaXNOYU4ocykpcmV0dXJuIG87dFtyK29dPXN9cmV0dXJuIG99ZnVuY3Rpb24gTSh0LGUscixuKXtyZXR1cm4gWihHKGUsdC5sZW5ndGgtciksdCxyLG4pfWZ1bmN0aW9uIEEodCxlLHIsbil7cmV0dXJuIFooWChlKSx0LHIsbil9ZnVuY3Rpb24gayh0LGUscixuKXtyZXR1cm4gQSh0LGUscixuKX1mdW5jdGlvbiBUKHQsZSxyLG4pe3JldHVybiBaKFcoZSksdCxyLG4pfWZ1bmN0aW9uIEUodCxlLHIsbil7cmV0dXJuIFooWShlLHQubGVuZ3RoLXIpLHQscixuKX1mdW5jdGlvbiBTKHQsZSxyKXtyZXR1cm4gMD09PWUmJnI9PT10Lmxlbmd0aD9LLmZyb21CeXRlQXJyYXkodCk6Sy5mcm9tQnl0ZUFycmF5KHQuc2xpY2UoZSxyKSl9ZnVuY3Rpb24gTCh0LGUscil7cj1NYXRoLm1pbih0Lmxlbmd0aCxyKTtmb3IodmFyIG49W10saT1lO2k8cjspe3ZhciBhPXRbaV0sbz1udWxsLHM9YT4yMzk/NDphPjIyMz8zOmE+MTkxPzI6MTtpZihpK3M8PXIpe3ZhciBsLHUsYyxoO3N3aXRjaChzKXtjYXNlIDE6YTwxMjgmJihvPWEpO2JyZWFrO2Nhc2UgMjpsPXRbaSsxXSwxMjg9PT0oMTkyJmwpJiYoaD0oMzEmYSk8PDZ8NjMmbCxoPjEyNyYmKG89aCkpO2JyZWFrO2Nhc2UgMzpsPXRbaSsxXSx1PXRbaSsyXSwxMjg9PT0oMTkyJmwpJiYxMjg9PT0oMTkyJnUpJiYoaD0oMTUmYSk8PDEyfCg2MyZsKTw8Nnw2MyZ1LGg+MjA0NyYmKGg8NTUyOTZ8fGg+NTczNDMpJiYobz1oKSk7YnJlYWs7Y2FzZSA0Omw9dFtpKzFdLHU9dFtpKzJdLGM9dFtpKzNdLDEyOD09PSgxOTImbCkmJjEyOD09PSgxOTImdSkmJjEyOD09PSgxOTImYykmJihoPSgxNSZhKTw8MTh8KDYzJmwpPDwxMnwoNjMmdSk8PDZ8NjMmYyxoPjY1NTM1JiZoPDExMTQxMTImJihvPWgpKX19bnVsbD09PW8/KG89NjU1MzMscz0xKTpvPjY1NTM1JiYoby09NjU1MzYsbi5wdXNoKG8+Pj4xMCYxMDIzfDU1Mjk2KSxvPTU2MzIwfDEwMjMmbyksbi5wdXNoKG8pLGkrPXN9cmV0dXJuIHoobil9ZnVuY3Rpb24geih0KXt2YXIgZT10Lmxlbmd0aDtpZihlPD10dClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdCk7Zm9yKHZhciByPSIiLG49MDtuPGU7KXIrPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHQuc2xpY2UobixuKz10dCkpO3JldHVybiByfWZ1bmN0aW9uIEModCxlLHIpe3ZhciBuPSIiO3I9TWF0aC5taW4odC5sZW5ndGgscik7Zm9yKHZhciBpPWU7aTxyOysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyNyZ0W2ldKTtyZXR1cm4gbn1mdW5jdGlvbiBJKHQsZSxyKXt2YXIgbj0iIjtyPU1hdGgubWluKHQubGVuZ3RoLHIpO2Zvcih2YXIgaT1lO2k8cjsrK2kpbis9U3RyaW5nLmZyb21DaGFyQ29kZSh0W2ldKTtyZXR1cm4gbn1mdW5jdGlvbiBQKHQsZSxyKXt2YXIgbj10Lmxlbmd0aDsoIWV8fGU8MCkmJihlPTApLCghcnx8cjwwfHxyPm4pJiYocj1uKTtmb3IodmFyIGk9IiIsYT1lO2E8cjsrK2EpaSs9SCh0W2FdKTtyZXR1cm4gaX1mdW5jdGlvbiBEKHQsZSxyKXtmb3IodmFyIG49dC5zbGljZShlLHIpLGk9IiIsYT0wO2E8bi5sZW5ndGg7YSs9MilpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG5bYV0rMjU2Km5bYSsxXSk7cmV0dXJuIGl9ZnVuY3Rpb24gUih0LGUscil7aWYodCUxIT09MHx8dDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgaXMgbm90IHVpbnQiKTtpZih0K2U+cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCIpfWZ1bmN0aW9uIE8odCxlLHIsbixpLGEpe2lmKCFvLmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJidWZmZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKTtpZihlPml8fGU8YSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInZhbHVlIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJyk7aWYocituPnQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBGKHQsZSxyLG4pe2U8MCYmKGU9NjU1MzUrZSsxKTtmb3IodmFyIGk9MCxhPU1hdGgubWluKHQubGVuZ3RoLXIsMik7aTxhOysraSl0W3IraV09KGUmMjU1PDw4KihuP2k6MS1pKSk+Pj44KihuP2k6MS1pKX1mdW5jdGlvbiBqKHQsZSxyLG4pe2U8MCYmKGU9NDI5NDk2NzI5NStlKzEpO2Zvcih2YXIgaT0wLGE9TWF0aC5taW4odC5sZW5ndGgtciw0KTtpPGE7KytpKXRbcitpXT1lPj4+OCoobj9pOjMtaSkmMjU1fWZ1bmN0aW9uIE4odCxlLHIsbixpLGEpe2lmKHIrbj50Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBCKHQsZSxyLG4saSl7cmV0dXJuIGl8fE4odCxlLHIsNCwzLjQwMjgyMzQ2NjM4NTI4ODZlMzgsLTMuNDAyODIzNDY2Mzg1Mjg4NmUzOCksJC53cml0ZSh0LGUscixuLDIzLDQpLHIrNH1mdW5jdGlvbiBVKHQsZSxyLG4saSl7cmV0dXJuIGl8fE4odCxlLHIsOCwxLjc5NzY5MzEzNDg2MjMxNTdlMzA4LC0xLjc5NzY5MzEzNDg2MjMxNTdlMzA4KSwkLndyaXRlKHQsZSxyLG4sNTIsOCkscis4fWZ1bmN0aW9uIFYodCl7aWYodD1xKHQpLnJlcGxhY2UoZXQsIiIpLHQubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDt0Lmxlbmd0aCU0IT09MDspdCs9Ij0iO3JldHVybiB0fWZ1bmN0aW9uIHEodCl7cmV0dXJuIHQudHJpbT90LnRyaW0oKTp0LnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX1mdW5jdGlvbiBIKHQpe3JldHVybiB0PDE2PyIwIit0LnRvU3RyaW5nKDE2KTp0LnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBHKHQsZSl7ZT1lfHwxLzA7Zm9yKHZhciByLG49dC5sZW5ndGgsaT1udWxsLGE9W10sbz0wO288bjsrK28pe2lmKHI9dC5jaGFyQ29kZUF0KG8pLHI+NTUyOTUmJnI8NTczNDQpe2lmKCFpKXtpZihyPjU2MzE5KXsoZS09Myk+LTEmJmEucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aWYobysxPT09bil7KGUtPTMpPi0xJiZhLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWk9cjtjb250aW51ZX1pZihyPDU2MzIwKXsoZS09Myk+LTEmJmEucHVzaCgyMzksMTkxLDE4OSksaT1yO2NvbnRpbnVlfXI9KGktNTUyOTY8PDEwfHItNTYzMjApKzY1NTM2fWVsc2UgaSYmKGUtPTMpPi0xJiZhLnB1c2goMjM5LDE5MSwxODkpO2lmKGk9bnVsbCxyPDEyOCl7aWYoKGUtPTEpPDApYnJlYWs7YS5wdXNoKHIpfWVsc2UgaWYocjwyMDQ4KXtpZigoZS09Mik8MClicmVhazthLnB1c2gocj4+NnwxOTIsNjMmcnwxMjgpfWVsc2UgaWYocjw2NTUzNil7aWYoKGUtPTMpPDApYnJlYWs7YS5wdXNoKHI+PjEyfDIyNCxyPj42JjYzfDEyOCw2MyZyfDEyOCl9ZWxzZXtpZighKHI8MTExNDExMikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTtpZigoZS09NCk8MClicmVhazthLnB1c2gocj4+MTh8MjQwLHI+PjEyJjYzfDEyOCxyPj42JjYzfDEyOCw2MyZyfDEyOCl9fXJldHVybiBhfWZ1bmN0aW9uIFgodCl7Zm9yKHZhciBlPVtdLHI9MDtyPHQubGVuZ3RoOysrcillLnB1c2goMjU1JnQuY2hhckNvZGVBdChyKSk7cmV0dXJuIGV9ZnVuY3Rpb24gWSh0LGUpe2Zvcih2YXIgcixuLGksYT1bXSxvPTA7bzx0Lmxlbmd0aCYmISgoZS09Mik8MCk7KytvKXI9dC5jaGFyQ29kZUF0KG8pLG49cj4+OCxpPXIlMjU2LGEucHVzaChpKSxhLnB1c2gobik7cmV0dXJuIGF9ZnVuY3Rpb24gVyh0KXtyZXR1cm4gSy50b0J5dGVBcnJheShWKHQpKX1mdW5jdGlvbiBaKHQsZSxyLG4pe2Zvcih2YXIgaT0wO2k8biYmIShpK3I+PWUubGVuZ3RofHxpPj10Lmxlbmd0aCk7KytpKWVbaStyXT10W2ldO3JldHVybiBpfWZ1bmN0aW9uIFEodCl7cmV0dXJuIHQhPT10fXZhciBLPXQoImJhc2U2NC1qcyIpLCQ9dCgiaWVlZTc1NCIpLEo9dCgiaXNhcnJheSIpO3IuQnVmZmVyPW8sci5TbG93QnVmZmVyPW0sci5JTlNQRUNUX01BWF9CWVRFUz01MCxvLlRZUEVEX0FSUkFZX1NVUFBPUlQ9dm9pZCAwIT09ZS5UWVBFRF9BUlJBWV9TVVBQT1JUP2UuVFlQRURfQVJSQVlfU1VQUE9SVDpuKCksci5rTWF4TGVuZ3RoPWkoKSxvLnBvb2xTaXplPTgxOTIsby5fYXVnbWVudD1mdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX189by5wcm90b3R5cGUsdH0sby5mcm9tPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gcyhudWxsLHQsZSxyKX0sby5UWVBFRF9BUlJBWV9TVVBQT1JUJiYoby5wcm90b3R5cGUuX19wcm90b19fPVVpbnQ4QXJyYXkucHJvdG90eXBlLG8uX19wcm90b19fPVVpbnQ4QXJyYXksInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5zcGVjaWVzJiZvW1N5bWJvbC5zcGVjaWVzXT09PW8mJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLFN5bWJvbC5zcGVjaWVzLHt2YWx1ZTpudWxsLGNvbmZpZ3VyYWJsZTohMH0pKSxvLmFsbG9jPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdShudWxsLHQsZSxyKX0sby5hbGxvY1Vuc2FmZT1mdW5jdGlvbih0KXtyZXR1cm4gYyhudWxsLHQpfSxvLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbih0KXtyZXR1cm4gYyhudWxsLHQpfSxvLmlzQnVmZmVyPWZ1bmN0aW9uKHQpe3JldHVybiEobnVsbD09dHx8IXQuX2lzQnVmZmVyKX0sby5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7aWYoIW8uaXNCdWZmZXIodCl8fCFvLmlzQnVmZmVyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMiKTtpZih0PT09ZSlyZXR1cm4gMDtmb3IodmFyIHI9dC5sZW5ndGgsbj1lLmxlbmd0aCxpPTAsYT1NYXRoLm1pbihyLG4pO2k8YTsrK2kpaWYodFtpXSE9PWVbaV0pe3I9dFtpXSxuPWVbaV07YnJlYWt9cmV0dXJuIHI8bj8tMTpuPHI/MTowfSxvLmlzRW5jb2Rpbmc9ZnVuY3Rpb24odCl7c3dpdGNoKFN0cmluZyh0KS50b0xvd2VyQ2FzZSgpKXtjYXNlImhleCI6Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19LG8uY29uY2F0PWZ1bmN0aW9uKHQsZSl7aWYoIUoodCkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2lmKDA9PT10Lmxlbmd0aClyZXR1cm4gby5hbGxvYygwKTt2YXIgcjtpZih2b2lkIDA9PT1lKWZvcihlPTAscj0wO3I8dC5sZW5ndGg7KytyKWUrPXRbcl0ubGVuZ3RoO3ZhciBuPW8uYWxsb2NVbnNhZmUoZSksaT0wO2ZvcihyPTA7cjx0Lmxlbmd0aDsrK3Ipe3ZhciBhPXRbcl07aWYoIW8uaXNCdWZmZXIoYSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2EuY29weShuLGkpLGkrPWEubGVuZ3RofXJldHVybiBufSxvLmJ5dGVMZW5ndGg9dixvLnByb3RvdHlwZS5faXNCdWZmZXI9ITAsby5wcm90b3R5cGUuc3dhcDE2PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCUyIT09MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9Mil4KHRoaXMsZSxlKzEpO3JldHVybiB0aGlzfSxvLnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTQhPT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz00KXgodGhpcyxlLGUrMykseCh0aGlzLGUrMSxlKzIpO3JldHVybiB0aGlzfSxvLnByb3RvdHlwZS5zd2FwNjQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTghPT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz04KXgodGhpcyxlLGUrNykseCh0aGlzLGUrMSxlKzYpLHgodGhpcyxlKzIsZSs1KSx4KHRoaXMsZSszLGUrNCk7cmV0dXJuIHRoaXN9LG8ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9MHx0aGlzLmxlbmd0aDtyZXR1cm4gMD09PXQ/IiI6MD09PWFyZ3VtZW50cy5sZW5ndGg/TCh0aGlzLDAsdCk6eS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtpZighby5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7cmV0dXJuIHRoaXM9PT10fHwwPT09by5jb21wYXJlKHRoaXMsdCl9LG8ucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXt2YXIgdD0iIixlPXIuSU5TUEVDVF9NQVhfQllURVM7cmV0dXJuIHRoaXMubGVuZ3RoPjAmJih0PXRoaXMudG9TdHJpbmcoImhleCIsMCxlKS5tYXRjaCgvLnsyfS9nKS5qb2luKCIgIiksdGhpcy5sZW5ndGg+ZSYmKHQrPSIgLi4uICIpKSwiPEJ1ZmZlciAiK3QrIj4ifSxvLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSxyLG4saSl7aWYoIW8uaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PXImJihyPXQ/dC5sZW5ndGg6MCksdm9pZCAwPT09biYmKG49MCksdm9pZCAwPT09aSYmKGk9dGhpcy5sZW5ndGgpLGU8MHx8cj50Lmxlbmd0aHx8bjwwfHxpPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihuPj1pJiZlPj1yKXJldHVybiAwO2lmKG4+PWkpcmV0dXJuLTE7aWYoZT49cilyZXR1cm4gMTtpZihlPj4+PTAscj4+Pj0wLG4+Pj49MCxpPj4+PTAsdGhpcz09PXQpcmV0dXJuIDA7Zm9yKHZhciBhPWktbixzPXItZSxsPU1hdGgubWluKGEscyksdT10aGlzLnNsaWNlKG4saSksYz10LnNsaWNlKGUsciksaD0wO2g8bDsrK2gpaWYodVtoXSE9PWNbaF0pe2E9dVtoXSxzPWNbaF07YnJlYWt9cmV0dXJuIGE8cz8tMTpzPGE/MTowfSxvLnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRoaXMuaW5kZXhPZih0LGUscikhPT0tMX0sby5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbih0LGUscil7cmV0dXJuIGIodGhpcyx0LGUsciwhMCl9LG8ucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gYih0aGlzLHQsZSxyLCExKX0sby5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCxlLHIsbil7aWYodm9pZCAwPT09ZSluPSJ1dGY4IixyPXRoaXMubGVuZ3RoLGU9MDtlbHNlIGlmKHZvaWQgMD09PXImJiJzdHJpbmciPT10eXBlb2YgZSluPWUscj10aGlzLmxlbmd0aCxlPTA7ZWxzZXtpZighaXNGaW5pdGUoZSkpdGhyb3cgbmV3IEVycm9yKCJCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCIpO2U9MHxlLGlzRmluaXRlKHIpPyhyPTB8cix2b2lkIDA9PT1uJiYobj0idXRmOCIpKToobj1yLHI9dm9pZCAwKX12YXIgaT10aGlzLmxlbmd0aC1lO2lmKCh2b2lkIDA9PT1yfHxyPmkpJiYocj1pKSx0Lmxlbmd0aD4wJiYocjwwfHxlPDApfHxlPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO258fChuPSJ1dGY4Iik7Zm9yKHZhciBhPSExOzspc3dpdGNoKG4pe2Nhc2UiaGV4IjpyZXR1cm4gdyh0aGlzLHQsZSxyKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBNKHRoaXMsdCxlLHIpO2Nhc2UiYXNjaWkiOnJldHVybiBBKHRoaXMsdCxlLHIpO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIGsodGhpcyx0LGUscik7Y2FzZSJiYXNlNjQiOnJldHVybiBUKHRoaXMsdCxlLHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gRSh0aGlzLHQsZSxyKTtkZWZhdWx0OmlmKGEpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIituKTtuPSgiIituKS50b0xvd2VyQ2FzZSgpLGE9ITB9fSxvLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O3ZhciB0dD00MDk2O28ucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5sZW5ndGg7dD1+fnQsZT12b2lkIDA9PT1lP3I6fn5lLHQ8MD8odCs9cix0PDAmJih0PTApKTp0PnImJih0PXIpLGU8MD8oZSs9cixlPDAmJihlPTApKTplPnImJihlPXIpLGU8dCYmKGU9dCk7dmFyIG47aWYoby5UWVBFRF9BUlJBWV9TVVBQT1JUKW49dGhpcy5zdWJhcnJheSh0LGUpLG4uX19wcm90b19fPW8ucHJvdG90eXBlO2Vsc2V7dmFyIGk9ZS10O249bmV3IG8oaSx2b2lkIDApO2Zvcih2YXIgYT0wO2E8aTsrK2EpblthXT10aGlzW2ErdF19cmV0dXJuIG59LG8ucHJvdG90eXBlLnJlYWRVSW50TEU9ZnVuY3Rpb24odCxlLHIpe3Q9MHx0LGU9MHxlLHJ8fFIodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1t0XSxpPTEsYT0wOysrYTxlJiYoaSo9MjU2KTspbis9dGhpc1t0K2FdKmk7cmV0dXJuIG59LG8ucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24odCxlLHIpe3Q9MHx0LGU9MHxlLHJ8fFIodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1t0Ky0tZV0saT0xO2U+MCYmKGkqPTI1Nik7KW4rPXRoaXNbdCstLWVdKmk7cmV0dXJuIG59LG8ucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxSKHQsMSx0aGlzLmxlbmd0aCksdGhpc1t0XX0sby5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFIodCwyLHRoaXMubGVuZ3RoKSx0aGlzW3RdfHRoaXNbdCsxXTw8OH0sby5wcm90b3R5cGUucmVhZFVJbnQxNkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFIodCwyLHRoaXMubGVuZ3RoKSx0aGlzW3RdPDw4fHRoaXNbdCsxXX0sby5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFIodCw0LHRoaXMubGVuZ3RoKSwodGhpc1t0XXx0aGlzW3QrMV08PDh8dGhpc1t0KzJdPDwxNikrMTY3NzcyMTYqdGhpc1t0KzNdfSxvLnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Uih0LDQsdGhpcy5sZW5ndGgpLDE2Nzc3MjE2KnRoaXNbdF0rKHRoaXNbdCsxXTw8MTZ8dGhpc1t0KzJdPDw4fHRoaXNbdCszXSl9LG8ucHJvdG90eXBlLnJlYWRJbnRMRT1mdW5jdGlvbih0LGUscil7dD0wfHQsZT0wfGUscnx8Uih0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW3RdLGk9MSxhPTA7KythPGUmJihpKj0yNTYpOyluKz10aGlzW3QrYV0qaTtyZXR1cm4gaSo9MTI4LG4+PWkmJihuLT1NYXRoLnBvdygyLDgqZSkpLG59LG8ucHJvdG90eXBlLnJlYWRJbnRCRT1mdW5jdGlvbih0LGUscil7dD0wfHQsZT0wfGUscnx8Uih0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj1lLGk9MSxhPXRoaXNbdCstLW5dO24+MCYmKGkqPTI1Nik7KWErPXRoaXNbdCstLW5dKmk7cmV0dXJuIGkqPTEyOCxhPj1pJiYoYS09TWF0aC5wb3coMiw4KmUpKSxhfSxvLnByb3RvdHlwZS5yZWFkSW50OD1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxSKHQsMSx0aGlzLmxlbmd0aCksMTI4JnRoaXNbdF0/KDI1NS10aGlzW3RdKzEpKi0xOnRoaXNbdF19LG8ucHJvdG90eXBlLnJlYWRJbnQxNkxFPWZ1bmN0aW9uKHQsZSl7ZXx8Uih0LDIsdGhpcy5sZW5ndGgpO3ZhciByPXRoaXNbdF18dGhpc1t0KzFdPDw4O3JldHVybiAzMjc2OCZyPzQyOTQ5MDE3NjB8cjpyfSxvLnByb3RvdHlwZS5yZWFkSW50MTZCRT1mdW5jdGlvbih0LGUpe2V8fFIodCwyLHRoaXMubGVuZ3RoKTt2YXIgcj10aGlzW3QrMV18dGhpc1t0XTw8ODtyZXR1cm4gMzI3Njgmcj80Mjk0OTAxNzYwfHI6cn0sby5wcm90b3R5cGUucmVhZEludDMyTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Uih0LDQsdGhpcy5sZW5ndGgpLHRoaXNbdF18dGhpc1t0KzFdPDw4fHRoaXNbdCsyXTw8MTZ8dGhpc1t0KzNdPDwyNH0sby5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Uih0LDQsdGhpcy5sZW5ndGgpLHRoaXNbdF08PDI0fHRoaXNbdCsxXTw8MTZ8dGhpc1t0KzJdPDw4fHRoaXNbdCszXX0sby5wcm90b3R5cGUucmVhZEZsb2F0TEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Uih0LDQsdGhpcy5sZW5ndGgpLCQucmVhZCh0aGlzLHQsITAsMjMsNCl9LG8ucHJvdG90eXBlLnJlYWRGbG9hdEJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFIodCw0LHRoaXMubGVuZ3RoKSwkLnJlYWQodGhpcyx0LCExLDIzLDQpfSxvLnByb3RvdHlwZS5yZWFkRG91YmxlTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Uih0LDgsdGhpcy5sZW5ndGgpLCQucmVhZCh0aGlzLHQsITAsNTIsOCl9LG8ucHJvdG90eXBlLnJlYWREb3VibGVCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxSKHQsOCx0aGlzLmxlbmd0aCksJC5yZWFkKHRoaXMsdCwhMSw1Miw4KX0sby5wcm90b3R5cGUud3JpdGVVSW50TEU9ZnVuY3Rpb24odCxlLHIsbil7aWYodD0rdCxlPTB8ZSxyPTB8ciwhbil7dmFyIGk9TWF0aC5wb3coMiw4KnIpLTE7Tyh0aGlzLHQsZSxyLGksMCl9dmFyIGE9MSxvPTA7Zm9yKHRoaXNbZV09MjU1JnQ7KytvPHImJihhKj0yNTYpOyl0aGlzW2Urb109dC9hJjI1NTtyZXR1cm4gZStyfSxvLnByb3RvdHlwZS53cml0ZVVJbnRCRT1mdW5jdGlvbih0LGUscixuKXtpZih0PSt0LGU9MHxlLHI9MHxyLCFuKXt2YXIgaT1NYXRoLnBvdygyLDgqciktMTtPKHRoaXMsdCxlLHIsaSwwKX12YXIgYT1yLTEsbz0xO2Zvcih0aGlzW2UrYV09MjU1JnQ7LS1hPj0wJiYobyo9MjU2KTspdGhpc1tlK2FdPXQvbyYyNTU7cmV0dXJuIGUrcn0sby5wcm90b3R5cGUud3JpdGVVSW50OD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZT0wfGUscnx8Tyh0aGlzLHQsZSwxLDI1NSwwKSxvLlRZUEVEX0FSUkFZX1NVUFBPUlR8fCh0PU1hdGguZmxvb3IodCkpLHRoaXNbZV09MjU1JnQsZSsxfSxvLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlPTB8ZSxyfHxPKHRoaXMsdCxlLDIsNjU1MzUsMCksby5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCk6Rih0aGlzLHQsZSwhMCksZSsyfSxvLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlPTB8ZSxyfHxPKHRoaXMsdCxlLDIsNjU1MzUsMCksby5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj44LHRoaXNbZSsxXT0yNTUmdCk6Rih0aGlzLHQsZSwhMSksZSsyfSxvLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlPTB8ZSxyfHxPKHRoaXMsdCxlLDQsNDI5NDk2NzI5NSwwKSxvLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZSszXT10Pj4+MjQsdGhpc1tlKzJdPXQ+Pj4xNix0aGlzW2UrMV09dD4+PjgsdGhpc1tlXT0yNTUmdCk6aih0aGlzLHQsZSwhMCksZSs0fSxvLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlPTB8ZSxyfHxPKHRoaXMsdCxlLDQsNDI5NDk2NzI5NSwwKSxvLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjI0LHRoaXNbZSsxXT10Pj4+MTYsdGhpc1tlKzJdPXQ+Pj44LHRoaXNbZSszXT0yNTUmdCk6aih0aGlzLHQsZSwhMSksZSs0fSxvLnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHQ9K3QsZT0wfGUsIW4pe3ZhciBpPU1hdGgucG93KDIsOCpyLTEpO08odGhpcyx0LGUscixpLTEsLWkpfXZhciBhPTAsbz0xLHM9MDtmb3IodGhpc1tlXT0yNTUmdDsrK2E8ciYmKG8qPTI1Nik7KXQ8MCYmMD09PXMmJjAhPT10aGlzW2UrYS0xXSYmKHM9MSksdGhpc1tlK2FdPSh0L28+PjApLXMmMjU1O3JldHVybiBlK3J9LG8ucHJvdG90eXBlLndyaXRlSW50QkU9ZnVuY3Rpb24odCxlLHIsbil7aWYodD0rdCxlPTB8ZSwhbil7dmFyIGk9TWF0aC5wb3coMiw4KnItMSk7Tyh0aGlzLHQsZSxyLGktMSwtaSl9dmFyIGE9ci0xLG89MSxzPTA7Zm9yKHRoaXNbZSthXT0yNTUmdDstLWE+PTAmJihvKj0yNTYpOyl0PDAmJjA9PT1zJiYwIT09dGhpc1tlK2ErMV0mJihzPTEpLHRoaXNbZSthXT0odC9vPj4wKS1zJjI1NTtyZXR1cm4gZStyfSxvLnByb3RvdHlwZS53cml0ZUludDg9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGU9MHxlLHJ8fE8odGhpcyx0LGUsMSwxMjcsLTEyOCksby5UWVBFRF9BUlJBWV9TVVBQT1JUfHwodD1NYXRoLmZsb29yKHQpKSx0PDAmJih0PTI1NSt0KzEpLHRoaXNbZV09MjU1JnQsZSsxfSxvLnByb3RvdHlwZS53cml0ZUludDE2TEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGU9MHxlLHJ8fE8odGhpcyx0LGUsMiwzMjc2NywtMzI3NjgpLG8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgpOkYodGhpcyx0LGUsITApLGUrMn0sby5wcm90b3R5cGUud3JpdGVJbnQxNkJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlPTB8ZSxyfHxPKHRoaXMsdCxlLDIsMzI3NjcsLTMyNzY4KSxvLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjgsdGhpc1tlKzFdPTI1NSZ0KTpGKHRoaXMsdCxlLCExKSxlKzJ9LG8ucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZT0wfGUscnx8Tyh0aGlzLHQsZSw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLG8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgsdGhpc1tlKzJdPXQ+Pj4xNix0aGlzW2UrM109dD4+PjI0KTpqKHRoaXMsdCxlLCEwKSxlKzR9LG8ucHJvdG90eXBlLndyaXRlSW50MzJCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZT0wfGUscnx8Tyh0aGlzLHQsZSw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLHQ8MCYmKHQ9NDI5NDk2NzI5NSt0KzEpLG8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+MjQsdGhpc1tlKzFdPXQ+Pj4xNix0aGlzW2UrMl09dD4+PjgsdGhpc1tlKzNdPTI1NSZ0KTpqKHRoaXMsdCxlLCExKSxlKzR9LG8ucHJvdG90eXBlLndyaXRlRmxvYXRMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIEIodGhpcyx0LGUsITAscil9LG8ucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIEIodGhpcyx0LGUsITEscil9LG8ucHJvdG90eXBlLndyaXRlRG91YmxlTEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBVKHRoaXMsdCxlLCEwLHIpfSxvLnByb3RvdHlwZS53cml0ZURvdWJsZUJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gVSh0aGlzLHQsZSwhMSxyKX0sby5wcm90b3R5cGUuY29weT1mdW5jdGlvbih0LGUscixuKXtpZihyfHwocj0wKSxufHwwPT09bnx8KG49dGhpcy5sZW5ndGgpLGU+PXQubGVuZ3RoJiYoZT10Lmxlbmd0aCksZXx8KGU9MCksbj4wJiZuPHImJihuPXIpLG49PT1yKXJldHVybiAwO2lmKDA9PT10Lmxlbmd0aHx8MD09PXRoaXMubGVuZ3RoKXJldHVybiAwO2lmKGU8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKHI8MHx8cj49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7bj50aGlzLmxlbmd0aCYmKG49dGhpcy5sZW5ndGgpLHQubGVuZ3RoLWU8bi1yJiYobj10Lmxlbmd0aC1lK3IpO3ZhciBpLGE9bi1yO2lmKHRoaXM9PT10JiZyPGUmJmU8bilmb3IoaT1hLTE7aT49MDstLWkpdFtpK2VdPXRoaXNbaStyXTtlbHNlIGlmKGE8MWUzfHwhby5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcihpPTA7aTxhOysraSl0W2krZV09dGhpc1tpK3JdO2Vsc2UgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwodCx0aGlzLnN1YmFycmF5KHIscithKSxlKTtyZXR1cm4gYX0sby5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbih0LGUscixuKXtpZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZT8obj1lLGU9MCxyPXRoaXMubGVuZ3RoKToic3RyaW5nIj09dHlwZW9mIHImJihuPXIscj10aGlzLmxlbmd0aCksMT09PXQubGVuZ3RoKXt2YXIgaT10LmNoYXJDb2RlQXQoMCk7aTwyNTYmJih0PWkpfWlmKHZvaWQgMCE9PW4mJiJzdHJpbmciIT10eXBlb2Ygbil0aHJvdyBuZXcgVHlwZUVycm9yKCJlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nIik7aWYoInN0cmluZyI9PXR5cGVvZiBuJiYhby5pc0VuY29kaW5nKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrbil9ZWxzZSJudW1iZXIiPT10eXBlb2YgdCYmKHQ9MjU1JnQpO2lmKGU8MHx8dGhpcy5sZW5ndGg8ZXx8dGhpcy5sZW5ndGg8cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiT3V0IG9mIHJhbmdlIGluZGV4Iik7aWYocjw9ZSlyZXR1cm4gdGhpcztlPj4+PTAscj12b2lkIDA9PT1yP3RoaXMubGVuZ3RoOnI+Pj4wLHR8fCh0PTApO3ZhciBhO2lmKCJudW1iZXIiPT10eXBlb2YgdClmb3IoYT1lO2E8cjsrK2EpdGhpc1thXT10O2Vsc2V7dmFyIHM9by5pc0J1ZmZlcih0KT90OkcobmV3IG8odCxuKS50b1N0cmluZygpKSxsPXMubGVuZ3RoO2ZvcihhPTA7YTxyLWU7KythKXRoaXNbYStlXT1zW2ElbF19cmV0dXJuIHRoaXN9O3ZhciBldD0vW14rXC8wLTlBLVphLXotX10vZ30pLmNhbGwodGhpcywidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9KX0seyJiYXNlNjQtanMiOjY1LGllZWU3NTQ6MjUzLGlzYXJyYXk6NjZ9XSw2NTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGUlND4wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIpO3JldHVybiI9Ij09PXRbZS0yXT8yOiI9Ij09PXRbZS0xXT8xOjB9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gMyp0Lmxlbmd0aC80LW4odCl9ZnVuY3Rpb24gYSh0KXt2YXIgZSxyLGksYSxvLHMsbD10Lmxlbmd0aDtvPW4odCkscz1uZXcgaCgzKmwvNC1vKSxpPW8+MD9sLTQ6bDt2YXIgdT0wO2ZvcihlPTAscj0wO2U8aTtlKz00LHIrPTMpYT1jW3QuY2hhckNvZGVBdChlKV08PDE4fGNbdC5jaGFyQ29kZUF0KGUrMSldPDwxMnxjW3QuY2hhckNvZGVBdChlKzIpXTw8NnxjW3QuY2hhckNvZGVBdChlKzMpXSxzW3UrK109YT4+MTYmMjU1LHNbdSsrXT1hPj44JjI1NSxzW3UrK109MjU1JmE7cmV0dXJuIDI9PT1vPyhhPWNbdC5jaGFyQ29kZUF0KGUpXTw8MnxjW3QuY2hhckNvZGVBdChlKzEpXT4+NCxzW3UrK109MjU1JmEpOjE9PT1vJiYoYT1jW3QuY2hhckNvZGVBdChlKV08PDEwfGNbdC5jaGFyQ29kZUF0KGUrMSldPDw0fGNbdC5jaGFyQ29kZUF0KGUrMildPj4yLHNbdSsrXT1hPj44JjI1NSxzW3UrK109MjU1JmEpLHN9ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdVt0Pj4xOCY2M10rdVt0Pj4xMiY2M10rdVt0Pj42JjYzXSt1WzYzJnRdfWZ1bmN0aW9uIHModCxlLHIpe2Zvcih2YXIgbixpPVtdLGE9ZTthPHI7YSs9MyluPSh0W2FdPDwxNikrKHRbYSsxXTw8OCkrdFthKzJdLGkucHVzaChvKG4pKTtyZXR1cm4gaS5qb2luKCIiKX1mdW5jdGlvbiBsKHQpe2Zvcih2YXIgZSxyPXQubGVuZ3RoLG49ciUzLGk9IiIsYT1bXSxvPTE2MzgzLGw9MCxjPXItbjtsPGM7bCs9bylhLnB1c2gocyh0LGwsbCtvPmM/YzpsK28pKTtyZXR1cm4gMT09PW4/KGU9dFtyLTFdLGkrPXVbZT4+Ml0saSs9dVtlPDw0JjYzXSxpKz0iPT0iKToyPT09biYmKGU9KHRbci0yXTw8OCkrdFtyLTFdLGkrPXVbZT4+MTBdLGkrPXVbZT4+NCY2M10saSs9dVtlPDwyJjYzXSxpKz0iPSIpLGEucHVzaChpKSxhLmpvaW4oIiIpfXIuYnl0ZUxlbmd0aD1pLHIudG9CeXRlQXJyYXk9YSxyLmZyb21CeXRlQXJyYXk9bDtmb3IodmFyIHU9W10sYz1bXSxoPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9VaW50OEFycmF5OkFycmF5LGY9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGQ9MCxwPWYubGVuZ3RoO2Q8cDsrK2QpdVtkXT1mW2RdLGNbZi5jaGFyQ29kZUF0KGQpXT1kO2NbIi0iLmNoYXJDb2RlQXQoMCldPTYyLGNbIl8iLmNoYXJDb2RlQXQoMCldPTYzfSx7fV0sNjY6W2Z1bmN0aW9uKHQsZSxyKXt2YXIgbj17fS50b1N0cmluZztlLmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09bi5jYWxsKHQpfX0se31dLDY3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7cmV0dXJuW01hdGgubWluKHRbMF0sdFsxXSksTWF0aC5tYXgodFswXSx0WzFdKV19ZnVuY3Rpb24gaSh0LGUpe3JldHVybiB0WzBdLWVbMF18fHRbMV0tZVsxXX1mdW5jdGlvbiBhKHQpe3JldHVybiB0Lm1hcChuKS5zb3J0KGkpfWZ1bmN0aW9uIG8odCxlLHIpe3JldHVybiBlIGluIHQ/dFtlXTpyfWZ1bmN0aW9uIHModCxlLHIpe0FycmF5LmlzQXJyYXkoZSk/KHI9cnx8e30sZT1lfHxbXSk6KHI9ZXx8e30sZT1bXSk7dmFyIG49ISFvKHIsImRlbGF1bmF5IiwhMCksaT0hIW8ociwiaW50ZXJpb3IiLCEwKSxzPSEhbyhyLCJleHRlcmlvciIsITApLGY9ISFvKHIsImluZmluaXR5IiwhMSk7aWYoIWkmJiFzfHwwPT09dC5sZW5ndGgpcmV0dXJuW107dmFyIGQ9bCh0LGUpO2lmKG58fGkhPT1zfHxmKXtmb3IodmFyIHA9dSh0Lmxlbmd0aCxhKGUpKSxnPTA7ZzxkLmxlbmd0aDsrK2cpe3ZhciBtPWRbZ107cC5hZGRUcmlhbmdsZShtWzBdLG1bMV0sbVsyXSl9cmV0dXJuIG4mJmModCxwKSxzP2k/Zj9oKHAsMCxmKTpwLmNlbGxzKCk6aChwLDEsZik6aChwLC0xKX1yZXR1cm4gZH12YXIgbD10KCIuL2xpYi9tb25vdG9uZSIpLHU9dCgiLi9saWIvdHJpYW5ndWxhdGlvbiIpLGM9dCgiLi9saWIvZGVsYXVuYXkiKSxoPXQoIi4vbGliL2ZpbHRlciIpO2UuZXhwb3J0cz1zfSx7Ii4vbGliL2RlbGF1bmF5Ijo2OCwiLi9saWIvZmlsdGVyIjo2OSwiLi9saWIvbW9ub3RvbmUiOjcwLCIuL2xpYi90cmlhbmd1bGF0aW9uIjo3MX1dLDY4OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbixpLG8pe3ZhciBzPWUub3Bwb3NpdGUobixpKTtpZighKHM8MCkpe2lmKGk8bil7dmFyIGw9bjtuPWksaT1sLGw9byxvPXMscz1sfWUuaXNDb25zdHJhaW50KG4saSl8fGEodFtuXSx0W2ldLHRbb10sdFtzXSk8MCYmci5wdXNoKG4saSl9fWZ1bmN0aW9uIGkodCxlKXtmb3IodmFyIHI9W10saT10Lmxlbmd0aCxvPWUuc3RhcnMscz0wO3M8aTsrK3MpZm9yKHZhciBsPW9bc10sdT0xO3U8bC5sZW5ndGg7dSs9Mil7CnZhciBjPWxbdV07aWYoIShjPHN8fGUuaXNDb25zdHJhaW50KHMsYykpKXtmb3IodmFyIGg9bFt1LTFdLGY9LTEsZD0xO2Q8bC5sZW5ndGg7ZCs9MilpZihsW2QtMV09PT1jKXtmPWxbZF07YnJlYWt9ZjwwfHxhKHRbc10sdFtjXSx0W2hdLHRbZl0pPDAmJnIucHVzaChzLGMpfX1mb3IoO3IubGVuZ3RoPjA7KXtmb3IodmFyIGM9ci5wb3AoKSxzPXIucG9wKCksaD0tMSxmPS0xLGw9b1tzXSxwPTE7cDxsLmxlbmd0aDtwKz0yKXt2YXIgZz1sW3AtMV0sbT1sW3BdO2c9PT1jP2Y9bTptPT09YyYmKGg9Zyl9aDwwfHxmPDB8fGEodFtzXSx0W2NdLHRbaF0sdFtmXSk+PTB8fChlLmZsaXAocyxjKSxuKHQsZSxyLGgscyxmKSxuKHQsZSxyLHMsZixoKSxuKHQsZSxyLGYsYyxoKSxuKHQsZSxyLGMsaCxmKSl9fXZhciBhPXQoInJvYnVzdC1pbi1zcGhlcmUiKVs0XTt0KCJiaW5hcnktc2VhcmNoLWJvdW5kcyIpO2UuZXhwb3J0cz1pfSx7ImJpbmFyeS1zZWFyY2gtYm91bmRzIjo3Miwicm9idXN0LWluLXNwaGVyZSI6NDYzfV0sNjk6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuLGksYSxvKXt0aGlzLmNlbGxzPXQsdGhpcy5uZWlnaGJvcj1lLHRoaXMuZmxhZ3M9bix0aGlzLmNvbnN0cmFpbnQ9cix0aGlzLmFjdGl2ZT1pLHRoaXMubmV4dD1hLHRoaXMuYm91bmRhcnk9b31mdW5jdGlvbiBpKHQsZSl7cmV0dXJuIHRbMF0tZVswXXx8dFsxXS1lWzFdfHx0WzJdLWVbMl19ZnVuY3Rpb24gYSh0LGUpe2Zvcih2YXIgcj10LmNlbGxzKCksYT1yLmxlbmd0aCxvPTA7bzxhOysrbyl7dmFyIHM9cltvXSxsPXNbMF0sdT1zWzFdLGM9c1syXTt1PGM/dTxsJiYoc1swXT11LHNbMV09YyxzWzJdPWwpOmM8bCYmKHNbMF09YyxzWzFdPWwsc1syXT11KX1yLnNvcnQoaSk7Zm9yKHZhciBoPW5ldyBBcnJheShhKSxvPTA7bzxoLmxlbmd0aDsrK28paFtvXT0wO3ZhciBmPVtdLGQ9W10scD1uZXcgQXJyYXkoMyphKSxnPW5ldyBBcnJheSgzKmEpLG09bnVsbDtlJiYobT1bXSk7Zm9yKHZhciB2PW5ldyBuKHIscCxnLGgsZixkLG0pLG89MDtvPGE7KytvKWZvcih2YXIgcz1yW29dLHk9MDt5PDM7Kyt5KXt2YXIgbD1zW3ldLHU9c1soeSsxKSUzXSx4PXBbMypvK3ldPXYubG9jYXRlKHUsbCx0Lm9wcG9zaXRlKHUsbCkpLGI9Z1szKm8reV09dC5pc0NvbnN0cmFpbnQobCx1KTt4PDAmJihiP2QucHVzaChvKTooZi5wdXNoKG8pLGhbb109MSksZSYmbS5wdXNoKFt1LGwsLTFdKSl9cmV0dXJuIHZ9ZnVuY3Rpb24gbyh0LGUscil7Zm9yKHZhciBuPTAsaT0wO2k8dC5sZW5ndGg7KytpKWVbaV09PT1yJiYodFtuKytdPXRbaV0pO3JldHVybiB0Lmxlbmd0aD1uLHR9ZnVuY3Rpb24gcyh0LGUscil7dmFyIG49YSh0LHIpO2lmKDA9PT1lKXJldHVybiByP24uY2VsbHMuY29uY2F0KG4uYm91bmRhcnkpOm4uY2VsbHM7Zm9yKHZhciBpPTEscz1uLmFjdGl2ZSxsPW4ubmV4dCx1PW4uZmxhZ3MsYz1uLmNlbGxzLGg9bi5jb25zdHJhaW50LGY9bi5uZWlnaGJvcjtzLmxlbmd0aD4wfHxsLmxlbmd0aD4wOyl7Zm9yKDtzLmxlbmd0aD4wOyl7dmFyIGQ9cy5wb3AoKTtpZih1W2RdIT09LWkpe3VbZF09aTtmb3IodmFyIHA9KGNbZF0sMCk7cDwzOysrcCl7dmFyIGc9ZlszKmQrcF07Zz49MCYmMD09PXVbZ10mJihoWzMqZCtwXT9sLnB1c2goZyk6KHMucHVzaChnKSx1W2ddPWkpKX19fXZhciBtPWw7bD1zLHM9bSxsLmxlbmd0aD0wLGk9LWl9dmFyIHY9byhjLHUsZSk7cmV0dXJuIHI/di5jb25jYXQobi5ib3VuZGFyeSk6dn12YXIgbD10KCJiaW5hcnktc2VhcmNoLWJvdW5kcyIpO2UuZXhwb3J0cz1zO3ZhciB1PW4ucHJvdG90eXBlO3UubG9jYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9WzAsMCwwXTtyZXR1cm4gZnVuY3Rpb24oZSxyLG4pe3ZhciBhPWUsbz1yLHM9bjtyZXR1cm4gcjxuP3I8ZSYmKGE9cixvPW4scz1lKTpuPGUmJihhPW4sbz1lLHM9ciksYTwwPy0xOih0WzBdPWEsdFsxXT1vLHRbMl09cyxsLmVxKHRoaXMuY2VsbHMsdCxpKSl9fSgpfSx7ImJpbmFyeS1zZWFyY2gtYm91bmRzIjo3Mn1dLDcwOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbixpKXt0aGlzLmE9dCx0aGlzLmI9ZSx0aGlzLmlkeD1yLHRoaXMubG93ZXJJZHM9bix0aGlzLnVwcGVySWRzPWl9ZnVuY3Rpb24gaSh0LGUscixuKXt0aGlzLmE9dCx0aGlzLmI9ZSx0aGlzLnR5cGU9cix0aGlzLmlkeD1ufWZ1bmN0aW9uIGEodCxlKXt2YXIgcj10LmFbMF0tZS5hWzBdfHx0LmFbMV0tZS5hWzFdfHx0LnR5cGUtZS50eXBlO3JldHVybiByP3I6dC50eXBlIT09cCYmKHI9ZCh0LmEsdC5iLGUuYikpP3I6dC5pZHgtZS5pZHh9ZnVuY3Rpb24gbyh0LGUpe3JldHVybiBkKHQuYSx0LmIsZSl9ZnVuY3Rpb24gcyh0LGUscixuLGkpe2Zvcih2YXIgYT1mLmx0KGUsbixvKSxzPWYuZ3QoZSxuLG8pLGw9YTtsPHM7KytsKXtmb3IodmFyIHU9ZVtsXSxjPXUubG93ZXJJZHMsaD1jLmxlbmd0aDtoPjEmJmQocltjW2gtMl1dLHJbY1toLTFdXSxuKT4wOyl0LnB1c2goW2NbaC0xXSxjW2gtMl0saV0pLGgtPTE7Yy5sZW5ndGg9aCxjLnB1c2goaSk7Zm9yKHZhciBwPXUudXBwZXJJZHMsaD1wLmxlbmd0aDtoPjEmJmQocltwW2gtMl1dLHJbcFtoLTFdXSxuKTwwOyl0LnB1c2goW3BbaC0yXSxwW2gtMV0saV0pLGgtPTE7cC5sZW5ndGg9aCxwLnB1c2goaSl9fWZ1bmN0aW9uIGwodCxlKXt2YXIgcjtyZXR1cm4ocj10LmFbMF08ZS5hWzBdP2QodC5hLHQuYixlLmEpOmQoZS5iLGUuYSx0LmEpKT9yOihyPWUuYlswXTx0LmJbMF0/ZCh0LmEsdC5iLGUuYik6ZChlLmIsZS5hLHQuYikscnx8dC5pZHgtZS5pZHgpfWZ1bmN0aW9uIHUodCxlLHIpe3ZhciBpPWYubGUodCxyLGwpLGE9dFtpXSxvPWEudXBwZXJJZHMscz1vW28ubGVuZ3RoLTFdO2EudXBwZXJJZHM9W3NdLHQuc3BsaWNlKGkrMSwwLG5ldyBuKHIuYSxyLmIsci5pZHgsW3NdLG8pKX1mdW5jdGlvbiBjKHQsZSxyKXt2YXIgbj1yLmE7ci5hPXIuYixyLmI9bjt2YXIgaT1mLmVxKHQscixsKSxhPXRbaV0sbz10W2ktMV07by51cHBlcklkcz1hLnVwcGVySWRzLHQuc3BsaWNlKGksMSl9ZnVuY3Rpb24gaCh0LGUpe2Zvcih2YXIgcj10Lmxlbmd0aCxvPWUubGVuZ3RoLGw9W10saD0wO2g8cjsrK2gpbC5wdXNoKG5ldyBpKHRbaF0sbnVsbCxwLGgpKTtmb3IodmFyIGg9MDtoPG87KytoKXt2YXIgZj1lW2hdLGQ9dFtmWzBdXSx2PXRbZlsxXV07ZFswXTx2WzBdP2wucHVzaChuZXcgaShkLHYsbSxoKSxuZXcgaSh2LGQsZyxoKSk6ZFswXT52WzBdJiZsLnB1c2gobmV3IGkodixkLG0saCksbmV3IGkoZCx2LGcsaCkpfWwuc29ydChhKTtmb3IodmFyIHk9bFswXS5hWzBdLSgxK01hdGguYWJzKGxbMF0uYVswXSkpKk1hdGgucG93KDIsLTUyKSx4PVtuZXcgbihbeSwxXSxbeSwwXSwtMSxbXSxbXSxbXSxbXSldLGI9W10saD0wLF89bC5sZW5ndGg7aDxfOysraCl7dmFyIHc9bFtoXSxNPXcudHlwZTtNPT09cD9zKGIseCx0LHcuYSx3LmlkeCk6TT09PW0/dSh4LHQsdyk6Yyh4LHQsdyl9cmV0dXJuIGJ9dmFyIGY9dCgiYmluYXJ5LXNlYXJjaC1ib3VuZHMiKSxkPXQoInJvYnVzdC1vcmllbnRhdGlvbiIpWzNdLHA9MCxnPTEsbT0yO2UuZXhwb3J0cz1ofSx7ImJpbmFyeS1zZWFyY2gtYm91bmRzIjo3Miwicm9idXN0LW9yaWVudGF0aW9uIjo0NjV9XSw3MTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7dGhpcy5zdGFycz10LHRoaXMuZWRnZXM9ZX1mdW5jdGlvbiBpKHQsZSxyKXtmb3IodmFyIG49MSxpPXQubGVuZ3RoO248aTtuKz0yKWlmKHRbbi0xXT09PWUmJnRbbl09PT1yKXJldHVybiB0W24tMV09dFtpLTJdLHRbbl09dFtpLTFdLHZvaWQodC5sZW5ndGg9aS0yKX1mdW5jdGlvbiBhKHQsZSl7Zm9yKHZhciByPW5ldyBBcnJheSh0KSxpPTA7aTx0OysraSlyW2ldPVtdO3JldHVybiBuZXcgbihyLGUpfXZhciBvPXQoImJpbmFyeS1zZWFyY2gtYm91bmRzIik7ZS5leHBvcnRzPWE7dmFyIHM9bi5wcm90b3R5cGU7cy5pc0NvbnN0cmFpbnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7cmV0dXJuIHRbMF0tZVswXXx8dFsxXS1lWzFdfXZhciBlPVswLDBdO3JldHVybiBmdW5jdGlvbihyLG4pe3JldHVybiBlWzBdPU1hdGgubWluKHIsbiksZVsxXT1NYXRoLm1heChyLG4pLG8uZXEodGhpcy5lZGdlcyxlLHQpPj0wfX0oKSxzLnJlbW92ZVRyaWFuZ2xlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLnN0YXJzO2koblt0XSxlLHIpLGkobltlXSxyLHQpLGkobltyXSx0LGUpfSxzLmFkZFRyaWFuZ2xlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLnN0YXJzO25bdF0ucHVzaChlLHIpLG5bZV0ucHVzaChyLHQpLG5bcl0ucHVzaCh0LGUpfSxzLm9wcG9zaXRlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXRoaXMuc3RhcnNbZV0sbj0xLGk9ci5sZW5ndGg7bjxpO24rPTIpaWYocltuXT09PXQpcmV0dXJuIHJbbi0xXTtyZXR1cm4tMX0scy5mbGlwPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5vcHBvc2l0ZSh0LGUpLG49dGhpcy5vcHBvc2l0ZShlLHQpO3RoaXMucmVtb3ZlVHJpYW5nbGUodCxlLHIpLHRoaXMucmVtb3ZlVHJpYW5nbGUoZSx0LG4pLHRoaXMuYWRkVHJpYW5nbGUodCxuLHIpLHRoaXMuYWRkVHJpYW5nbGUoZSxyLG4pfSxzLmVkZ2VzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuc3RhcnMsZT1bXSxyPTAsbj10Lmxlbmd0aDtyPG47KytyKWZvcih2YXIgaT10W3JdLGE9MCxvPWkubGVuZ3RoO2E8bzthKz0yKWUucHVzaChbaVthXSxpW2ErMV1dKTtyZXR1cm4gZX0scy5jZWxscz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnN0YXJzLGU9W10scj0wLG49dC5sZW5ndGg7cjxuOysrcilmb3IodmFyIGk9dFtyXSxhPTAsbz1pLmxlbmd0aDthPG87YSs9Mil7dmFyIHM9aVthXSxsPWlbYSsxXTtyPE1hdGgubWluKHMsbCkmJmUucHVzaChbcixzLGxdKX1yZXR1cm4gZX19LHsiYmluYXJ5LXNlYXJjaC1ib3VuZHMiOjcyfV0sNzI6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuLGkpe3ZhciBhPVsiZnVuY3Rpb24gIix0LCIoYSxsLGgsIixuLmpvaW4oIiwiKSwiKXsiLGk/IiI6InZhciBpPSIscj8ibC0xIjoiaCsxIiwiO3doaWxlKGw8PWgpe3ZhciBtPShsK2gpPj4+MSx4PWFbbV0iXTtyZXR1cm4gaT9lLmluZGV4T2YoImMiKTwwP2EucHVzaCgiO2lmKHg9PT15KXtyZXR1cm4gbX1lbHNlIGlmKHg8PXkpeyIpOmEucHVzaCgiO3ZhciBwPWMoeCx5KTtpZihwPT09MCl7cmV0dXJuIG19ZWxzZSBpZihwPD0wKXsiKTphLnB1c2goIjtpZigiLGUsIil7aT1tOyIpLHI/YS5wdXNoKCJsPW0rMX1lbHNle2g9bS0xfSIpOmEucHVzaCgiaD1tLTF9ZWxzZXtsPW0rMX0iKSxhLnB1c2goIn0iKSxpP2EucHVzaCgicmV0dXJuIC0xfTsiKTphLnB1c2goInJldHVybiBpfTsiKSxhLmpvaW4oIiIpfWZ1bmN0aW9uIGkodCxlLHIsaSl7dmFyIGE9bmV3IEZ1bmN0aW9uKFtuKCJBIiwieCIrdCsieSIsZSxbInkiXSxpKSxuKCJQIiwiYyh4LHkpIit0KyIwIixlLFsieSIsImMiXSxpKSwiZnVuY3Rpb24gZGlzcGF0Y2hCc2VhcmNoIixyLCIoYSx5LGMsbCxoKXtpZih0eXBlb2YoYyk9PT0nZnVuY3Rpb24nKXtyZXR1cm4gUChhLChsPT09dm9pZCAwKT8wOmx8MCwoaD09PXZvaWQgMCk/YS5sZW5ndGgtMTpofDAseSxjKX1lbHNle3JldHVybiBBKGEsKGM9PT12b2lkIDApPzA6Y3wwLChsPT09dm9pZCAwKT9hLmxlbmd0aC0xOmx8MCx5KX19cmV0dXJuIGRpc3BhdGNoQnNlYXJjaCIscl0uam9pbigiIikpO3JldHVybiBhKCl9ZS5leHBvcnRzPXtnZTppKCI+PSIsITEsIkdFIiksZ3Q6aSgiPiIsITEsIkdUIiksbHQ6aSgiPCIsITAsIkxUIiksbGU6aSgiPD0iLCEwLCJMRSIpLGVxOmkoIi0iLCEwLCJFUSIsITApfX0se31dLDczOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7Zm9yKHZhciBlPTEscj0xO3I8dC5sZW5ndGg7KytyKWZvcih2YXIgbj0wO248cjsrK24paWYodFtyXTx0W25dKWU9LWU7ZWxzZSBpZih0W25dPT09dFtyXSlyZXR1cm4gMDtyZXR1cm4gZX1lLmV4cG9ydHM9bn0se31dLDc0OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtmb3IodmFyIHI9MCxuPXQubGVuZ3RoLGk9MDtpPG47KytpKXIrPXRbaV0qZVtpXTtyZXR1cm4gcn1mdW5jdGlvbiBpKHQpe3ZhciBlPXQubGVuZ3RoO2lmKDA9PT1lKXJldHVybltdO3ZhciByPSh0WzBdLmxlbmd0aCxvKFt0Lmxlbmd0aCsxLHQubGVuZ3RoKzFdLDEpKSxpPW8oW3QubGVuZ3RoKzFdLDEpO3JbZV1bZV09MDtmb3IodmFyIGE9MDthPGU7KythKXtmb3IodmFyIGw9MDtsPD1hOysrbClyW2xdW2FdPXJbYV1bbF09MipuKHRbYV0sdFtsXSk7aVthXT1uKHRbYV0sdFthXSl9Zm9yKHZhciB1PXMocixpKSxjPTAsaD11W2UrMV0sYT0wO2E8aC5sZW5ndGg7KythKWMrPWhbYV07Zm9yKHZhciBmPW5ldyBBcnJheShlKSxhPTA7YTxlOysrYSl7Zm9yKHZhciBoPXVbYV0sZD0wLGw9MDtsPGgubGVuZ3RoOysrbClkKz1oW2xdO2ZbYV09ZC9jfXJldHVybiBmfWZ1bmN0aW9uIGEodCl7aWYoMD09PXQubGVuZ3RoKXJldHVybltdO2Zvcih2YXIgZT10WzBdLmxlbmd0aCxyPW8oW2VdKSxuPWkodCksYT0wO2E8dC5sZW5ndGg7KythKWZvcih2YXIgcz0wO3M8ZTsrK3MpcltzXSs9dFthXVtzXSpuW2FdO3JldHVybiByfXZhciBvPXQoImR1cCIpLHM9dCgicm9idXN0LWxpbmVhci1zb2x2ZSIpO2EuYmFyeWNlbmV0cmljPWksZS5leHBvcnRzPWF9LHtkdXA6OTgsInJvYnVzdC1saW5lYXItc29sdmUiOjQ2NH1dLDc1OltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0KXtmb3IodmFyIGU9aSh0KSxyPTAsbj0wO248dC5sZW5ndGg7KytuKWZvcih2YXIgYT10W25dLG89MDtvPGUubGVuZ3RoOysrbylyKz1NYXRoLnBvdyhhW29dLWVbb10sMik7cmV0dXJuIE1hdGguc3FydChyL3QubGVuZ3RoKX1lLmV4cG9ydHM9bjt2YXIgaT10KCJjaXJjdW1jZW50ZXIiKX0se2NpcmN1bWNlbnRlcjo3NH1dLDc2OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGU9Yih0KSxyPXgoeShlKSx0KTtyZXR1cm4gcjwwP1tlLHcoZSwxLzApXTpyPjA/W3coZSwtKDEvMCkpLGVdOltlLGVdfWZ1bmN0aW9uIGkodCxlKXtmb3IodmFyIHI9bmV3IEFycmF5KGUubGVuZ3RoKSxuPTA7bjxlLmxlbmd0aDsrK24pe3ZhciBpPWVbbl0sYT10W2lbMF1dLG89dFtpWzFdXTtyW25dPVtNYXRoLm1pbihhWzBdLG9bMF0pLE1hdGgubWluKGFbMV0sb1sxXSksTWF0aC5tYXgoYVswXSxvWzBdKSxNYXRoLm1heChhWzFdLG9bMV0pXX1yZXR1cm4gcn1mdW5jdGlvbiBhKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodC5sZW5ndGgpLHI9MDtyPHQubGVuZ3RoOysrcil7dmFyIG49dFtyXTtlW3JdPVtuWzBdLG5bMV0sblswXSxuWzFdXX1yZXR1cm4gZX1mdW5jdGlvbiBvKHQsZSxyKXt2YXIgbj1bXTtyZXR1cm4gbShyLGZ1bmN0aW9uKHIsaSl7dmFyIGE9ZVtyXSxvPWVbaV07aWYoYVswXSE9PW9bMF0mJmFbMF0hPT1vWzFdJiZhWzFdIT09b1swXSYmYVsxXSE9PW9bMV0pe3ZhciBzPXRbYVswXV0sbD10W2FbMV1dLHU9dFtvWzBdXSxjPXRbb1sxXV07dihzLGwsdSxjKSYmbi5wdXNoKFtyLGldKX19KSxufWZ1bmN0aW9uIHModCxlLHIsbil7dmFyIGk9W107cmV0dXJuIG0ocixuLGZ1bmN0aW9uKHIsbil7dmFyIGE9ZVtyXTtpZihhWzBdIT09biYmYVsxXSE9PW4pe3ZhciBvPXRbbl0scz10W2FbMF1dLGw9dFthWzFdXTt2KHMsbCxvLG8pJiZpLnB1c2goW3Isbl0pfX0pLGl9ZnVuY3Rpb24gbCh0LGUscixuLGkpe2Z1bmN0aW9uIGEoZSl7aWYoZT49dC5sZW5ndGgpcmV0dXJuIG9bZS10Lmxlbmd0aF07dmFyIHI9dFtlXTtyZXR1cm5beShyWzBdKSx5KHJbMV0pXX1mb3IodmFyIG89W10scz0wO3M8ci5sZW5ndGg7KytzKXt2YXIgbD1yW3NdLHU9bFswXSxjPWxbMV0saD1lW3VdLGY9ZVtjXSxkPU0oXyh0W2hbMF1dKSxfKHRbaFsxXV0pLF8odFtmWzBdXSksXyh0W2ZbMV1dKSk7aWYoZCl7dmFyIHA9by5sZW5ndGgrdC5sZW5ndGg7by5wdXNoKGQpLG4ucHVzaChbdSxwXSxbYyxwXSl9fW4uc29ydChmdW5jdGlvbih0LGUpe2lmKHRbMF0hPT1lWzBdKXJldHVybiB0WzBdLWVbMF07dmFyIHI9YSh0WzFdKSxuPWEoZVsxXSk7cmV0dXJuIHgoclswXSxuWzBdKXx8eChyWzFdLG5bMV0pfSk7Zm9yKHZhciBzPW4ubGVuZ3RoLTE7cz49MDstLXMpe3ZhciBnPW5bc10sdT1nWzBdLG09ZVt1XSx2PW1bMF0sYj1tWzFdLHc9dFt2XSxBPXRbYl07aWYoKHdbMF0tQVswXXx8d1sxXS1BWzFdKTwwKXt2YXIgaz12O3Y9YixiPWt9bVswXT12O3ZhciBULEU9bVsxXT1nWzFdO2ZvcihpJiYoVD1tWzJdKTtzPjAmJm5bcy0xXVswXT09PXU7KXt2YXIgZz1uWy0tc10sUz1nWzFdO2k/ZS5wdXNoKFtFLFMsVF0pOmUucHVzaChbRSxTXSksRT1TfWk/ZS5wdXNoKFtFLGIsVF0pOmUucHVzaChbRSxiXSl9cmV0dXJuIG99ZnVuY3Rpb24gdSh0LGUscil7Zm9yKHZhciBpPXQubGVuZ3RoK2UubGVuZ3RoLGE9bmV3IGcoaSksbz1yLHM9MDtzPGUubGVuZ3RoOysrcyl7dmFyIGw9ZVtzXSx1PW4obFswXSksYz1uKGxbMV0pO28ucHVzaChbdVswXSxjWzBdLHVbMV0sY1sxXV0pLHQucHVzaChbYihsWzBdKSxiKGxbMV0pXSl9bShvLGZ1bmN0aW9uKHQsZSl7YS5saW5rKHQsZSl9KTtmb3IodmFyIGg9MCxmPSEwLGQ9bmV3IEFycmF5KGkpLHM9MDtzPGk7KytzKXt2YXIgcD1hLmZpbmQocyk7cD09PXM/KGRbc109aCx0W2grK109dFtzXSk6KGY9ITEsZFtzXT0tMSl9aWYodC5sZW5ndGg9aCxmKXJldHVybiBudWxsO2Zvcih2YXIgcz0wO3M8aTsrK3MpZFtzXTwwJiYoZFtzXT1kW2EuZmluZChzKV0pO3JldHVybiBkfWZ1bmN0aW9uIGModCxlKXtyZXR1cm4gdFswXS1lWzBdfHx0WzFdLWVbMV19ZnVuY3Rpb24gaCh0LGUpe3ZhciByPXRbMF0tZVswXXx8dFsxXS1lWzFdO3JldHVybiByP3I6dFsyXTxlWzJdPy0xOnRbMl0+ZVsyXT8xOjB9ZnVuY3Rpb24gZih0LGUscil7aWYoMCE9PXQubGVuZ3RoKXtpZihlKWZvcih2YXIgbj0wO248dC5sZW5ndGg7KytuKXt2YXIgaT10W25dLGE9ZVtpWzBdXSxvPWVbaVsxXV07aVswXT1NYXRoLm1pbihhLG8pLGlbMV09TWF0aC5tYXgoYSxvKX1lbHNlIGZvcih2YXIgbj0wO248dC5sZW5ndGg7KytuKXt2YXIgaT10W25dLGE9aVswXSxvPWlbMV07aVswXT1NYXRoLm1pbihhLG8pLGlbMV09TWF0aC5tYXgoYSxvKX1yP3Quc29ydChoKTp0LnNvcnQoYyk7Zm9yKHZhciBzPTEsbj0xO248dC5sZW5ndGg7KytuKXt2YXIgbD10W24tMV0sdT10W25dOyh1WzBdIT09bFswXXx8dVsxXSE9PWxbMV18fHImJnVbMl0hPT1sWzJdKSYmKHRbcysrXT11KX10Lmxlbmd0aD1zfX1mdW5jdGlvbiBkKHQsZSxyKXt2YXIgbj1pKHQsZSksYz1vKHQsZSxuKSxoPWEodCksZD1zKHQsZSxuLGgpLHA9bCh0LGUsYyxkLHIpLGc9dSh0LHAsaCk7cmV0dXJuIGYoZSxnLHIpLCEhZ3x8KGMubGVuZ3RoPjB8fGQubGVuZ3RoPjApfWZ1bmN0aW9uIHAodCxlLHIpe3ZhciBuLGk9ITE7aWYocil7bj1lO2Zvcih2YXIgYT1uZXcgQXJyYXkoZS5sZW5ndGgpLG89MDtvPGUubGVuZ3RoOysrbyl7dmFyIHM9ZVtvXTthW29dPVtzWzBdLHNbMV0scltvXV19ZT1hfWZvcig7ZCh0LGUsISFyKTspaT0hMDtpZihyJiZpKXtuLmxlbmd0aD0wLHIubGVuZ3RoPTA7Zm9yKHZhciBvPTA7bzxlLmxlbmd0aDsrK28pe3ZhciBzPWVbb107bi5wdXNoKFtzWzBdLHNbMV1dKSxyLnB1c2goc1syXSl9fXJldHVybiBpfWUuZXhwb3J0cz1wO3ZhciBnPXQoInVuaW9uLWZpbmQiKSxtPXQoImJveC1pbnRlcnNlY3QiKSx2PSh0KCJjb21wYXJlLWNlbGwiKSx0KCJyb2J1c3Qtc2VnbWVudC1pbnRlcnNlY3QiKSkseT10KCJiaWctcmF0IikseD10KCJiaWctcmF0L2NtcCIpLGI9dCgiYmlnLXJhdC90by1mbG9hdCIpLF89dCgicmF0LXZlYyIpLHc9dCgibmV4dGFmdGVyIiksTT10KCIuL2xpYi9yYXQtc2VnLWludGVyc2VjdCIpfSx7Ii4vbGliL3JhdC1zZWctaW50ZXJzZWN0Ijo3NywiYmlnLXJhdCI6NDAsImJpZy1yYXQvY21wIjozOCwiYmlnLXJhdC90by1mbG9hdCI6NTIsImJveC1pbnRlcnNlY3QiOjU3LCJjb21wYXJlLWNlbGwiOjgyLG5leHRhZnRlcjo0MjgsInJhdC12ZWMiOjQ1Mywicm9idXN0LXNlZ21lbnQtaW50ZXJzZWN0Ijo0NjgsInVuaW9uLWZpbmQiOjQ5N31dLDc3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gcyhhKHRbMF0sZVsxXSksYSh0WzFdLGVbMF0pKX1mdW5jdGlvbiBpKHQsZSxyLGkpe3ZhciBhPXUoZSx0KSxzPXUoaSxyKSxmPW4oYSxzKTtpZigwPT09bChmKSlyZXR1cm4gbnVsbDt2YXIgZD11KHQscikscD1uKHMsZCksZz1vKHAsZik7cmV0dXJuIGModCxoKGEsZykpfWUuZXhwb3J0cz1pO3ZhciBhPXQoImJpZy1yYXQvbXVsIiksbz10KCJiaWctcmF0L2RpdiIpLHM9dCgiYmlnLXJhdC9zdWIiKSxsPXQoImJpZy1yYXQvc2lnbiIpLHU9dCgicmF0LXZlYy9zdWIiKSxjPXQoInJhdC12ZWMvYWRkIiksaD10KCJyYXQtdmVjL211bHMiKTt0KCJiaWctcmF0L3RvLWZsb2F0Iil9LHsiYmlnLXJhdC9kaXYiOjM5LCJiaWctcmF0L211bCI6NDksImJpZy1yYXQvc2lnbiI6NTAsImJpZy1yYXQvc3ViIjo1MSwiYmlnLXJhdC90by1mbG9hdCI6NTIsInJhdC12ZWMvYWRkIjo0NTIsInJhdC12ZWMvbXVscyI6NDU0LCJyYXQtdmVjL3N1YiI6NDU1fV0sNzg6W2Z1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24odCl7dmFyIHI9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZShyLG4saSxhKXtmdW5jdGlvbiBzKHIsaSl7aWYobnVsbD09PXIpcmV0dXJuIG51bGw7aWYoMD09aSlyZXR1cm4gcjt2YXIgbCxmO2lmKCJvYmplY3QiIT10eXBlb2YgcilyZXR1cm4gcjtpZihlLl9faXNBcnJheShyKSlsPVtdO2Vsc2UgaWYoZS5fX2lzUmVnRXhwKHIpKWw9bmV3IFJlZ0V4cChyLnNvdXJjZSxvKHIpKSxyLmxhc3RJbmRleCYmKGwubGFzdEluZGV4PXIubGFzdEluZGV4KTtlbHNlIGlmKGUuX19pc0RhdGUocikpbD1uZXcgRGF0ZShyLmdldFRpbWUoKSk7ZWxzZXtpZihoJiZ0LmlzQnVmZmVyKHIpKXJldHVybiBsPW5ldyB0KHIubGVuZ3RoKSxyLmNvcHkobCksbDsidW5kZWZpbmVkIj09dHlwZW9mIGE/KGY9T2JqZWN0LmdldFByb3RvdHlwZU9mKHIpLGw9T2JqZWN0LmNyZWF0ZShmKSk6KGw9T2JqZWN0LmNyZWF0ZShhKSxmPWEpfWlmKG4pe3ZhciBkPXUuaW5kZXhPZihyKTtpZihkIT0tMSlyZXR1cm4gY1tkXTt1LnB1c2gociksYy5wdXNoKGwpfWZvcih2YXIgcCBpbiByKXt2YXIgZztmJiYoZz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGYscCkpLGcmJm51bGw9PWcuc2V0fHwobFtwXT1zKHJbcF0saS0xKSl9cmV0dXJuIGx9dmFyIGw7Im9iamVjdCI9PXR5cGVvZiBuJiYoaT1uLmRlcHRoLGE9bi5wcm90b3R5cGUsbD1uLmZpbHRlcixuPW4uY2lyY3VsYXIpO3ZhciB1PVtdLGM9W10saD0idW5kZWZpbmVkIiE9dHlwZW9mIHQ7cmV0dXJuInVuZGVmaW5lZCI9PXR5cGVvZiBuJiYobj0hMCksInVuZGVmaW5lZCI9PXR5cGVvZiBpJiYoaT0xLzApLHMocixpKX1mdW5jdGlvbiByKHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gbih0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJiJbb2JqZWN0IERhdGVdIj09PXIodCl9ZnVuY3Rpb24gaSh0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJiJbb2JqZWN0IEFycmF5XSI9PT1yKHQpfWZ1bmN0aW9uIGEodCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiYiW29iamVjdCBSZWdFeHBdIj09PXIodCl9ZnVuY3Rpb24gbyh0KXt2YXIgZT0iIjtyZXR1cm4gdC5nbG9iYWwmJihlKz0iZyIpLHQuaWdub3JlQ2FzZSYmKGUrPSJpIiksdC5tdWx0aWxpbmUmJihlKz0ibSIpLGV9cmV0dXJuIGUuY2xvbmVQcm90b3R5cGU9ZnVuY3Rpb24odCl7aWYobnVsbD09PXQpcmV0dXJuIG51bGw7dmFyIGU9ZnVuY3Rpb24oKXt9O3JldHVybiBlLnByb3RvdHlwZT10LG5ldyBlfSxlLl9fb2JqVG9TdHI9cixlLl9faXNEYXRlPW4sZS5fX2lzQXJyYXk9aSxlLl9faXNSZWdFeHA9YSxlLl9fZ2V0UmVnRXhwRmxhZ3M9byxlfSgpOyJvYmplY3QiPT10eXBlb2YgZSYmZS5leHBvcnRzJiYoZS5leHBvcnRzPXIpfSkuY2FsbCh0aGlzLHQoImJ1ZmZlciIpLkJ1ZmZlcil9LHtidWZmZXI6NjR9XSw3OTpbZnVuY3Rpb24odCxlLHIpe2UuZXhwb3J0cz17amV0Olt7aW5kZXg6MCxyZ2I6WzAsMCwxMzFdfSx7aW5kZXg6LjEyNSxyZ2I6WzAsNjAsMTcwXX0se2luZGV4Oi4zNzUscmdiOls1LDI1NSwyNTVdfSx7aW5kZXg6LjYyNSxyZ2I6WzI1NSwyNTUsMF19LHtpbmRleDouODc1LHJnYjpbMjUwLDAsMF19LHtpbmRleDoxLHJnYjpbMTI4LDAsMF19XSxoc3Y6W3tpbmRleDowLHJnYjpbMjU1LDAsMF19LHtpbmRleDouMTY5LHJnYjpbMjUzLDI1NSwyXX0se2luZGV4Oi4xNzMscmdiOlsyNDcsMjU1LDJdfSx7aW5kZXg6LjMzNyxyZ2I6WzAsMjUyLDRdfSx7aW5kZXg6LjM0MSxyZ2I6WzAsMjUyLDEwXX0se2luZGV4Oi41MDYscmdiOlsxLDI0OSwyNTVdfSx7aW5kZXg6LjY3MSxyZ2I6WzIsMCwyNTNdfSx7aW5kZXg6LjY3NSxyZ2I6WzgsMCwyNTNdfSx7aW5kZXg6LjgzOSxyZ2I6WzI1NSwwLDI1MV19LHtpbmRleDouODQzLHJnYjpbMjU1LDAsMjQ1XX0se2luZGV4OjEscmdiOlsyNTUsMCw2XX1dLGhvdDpbe2luZGV4OjAscmdiOlswLDAsMF19LHtpbmRleDouMyxyZ2I6WzIzMCwwLDBdfSx7aW5kZXg6LjYscmdiOlsyNTUsMjEwLDBdfSx7aW5kZXg6MSxyZ2I6WzI1NSwyNTUsMjU1XX1dLGNvb2w6W3tpbmRleDowLHJnYjpbMCwyNTUsMjU1XX0se2luZGV4OjEscmdiOlsyNTUsMCwyNTVdfV0sc3ByaW5nOlt7aW5kZXg6MCxyZ2I6WzI1NSwwLDI1NV19LHtpbmRleDoxLHJnYjpbMjU1LDI1NSwwXX1dLHN1bW1lcjpbe2luZGV4OjAscmdiOlswLDEyOCwxMDJdfSx7aW5kZXg6MSxyZ2I6WzI1NSwyNTUsMTAyXX1dLGF1dHVtbjpbe2luZGV4OjAscmdiOlsyNTUsMCwwXX0se2luZGV4OjEscmdiOlsyNTUsMjU1LDBdfV0sd2ludGVyOlt7aW5kZXg6MCxyZ2I6WzAsMCwyNTVdfSx7aW5kZXg6MSxyZ2I6WzAsMjU1LDEyOF19XSxib25lOlt7aW5kZXg6MCxyZ2I6WzAsMCwwXX0se2luZGV4Oi4zNzYscmdiOls4NCw4NCwxMTZdfSx7aW5kZXg6Ljc1MyxyZ2I6WzE2OSwyMDAsMjAwXX0se2luZGV4OjEscmdiOlsyNTUsMjU1LDI1NV19XSxjb3BwZXI6W3tpbmRleDowLHJnYjpbMCwwLDBdfSx7aW5kZXg6LjgwNCxyZ2I6WzI1NSwxNjAsMTAyXX0se2luZGV4OjEscmdiOlsyNTUsMTk5LDEyN119XSxncmV5czpbe2luZGV4OjAscmdiOlswLDAsMF19LHtpbmRleDoxLHJnYjpbMjU1LDI1NSwyNTVdfV0seWlnbmJ1Olt7aW5kZXg6MCxyZ2I6WzgsMjksODhdfSx7aW5kZXg6LjEyNSxyZ2I6WzM3LDUyLDE0OF19LHtpbmRleDouMjUscmdiOlszNCw5NCwxNjhdfSx7aW5kZXg6LjM3NSxyZ2I6WzI5LDE0NSwxOTJdfSx7aW5kZXg6LjUscmdiOls2NSwxODIsMTk2XX0se2luZGV4Oi42MjUscmdiOlsxMjcsMjA1LDE4N119LHtpbmRleDouNzUscmdiOlsxOTksMjMzLDE4MF19LHtpbmRleDouODc1LHJnYjpbMjM3LDI0OCwyMTddfSx7aW5kZXg6MSxyZ2I6WzI1NSwyNTUsMjE3XX1dLGdyZWVuczpbe2luZGV4OjAscmdiOlswLDY4LDI3XX0se2luZGV4Oi4xMjUscmdiOlswLDEwOSw0NF19LHtpbmRleDouMjUscmdiOlszNSwxMzksNjldfSx7aW5kZXg6LjM3NSxyZ2I6WzY1LDE3MSw5M119LHtpbmRleDouNSxyZ2I6WzExNiwxOTYsMTE4XX0se2luZGV4Oi42MjUscmdiOlsxNjEsMjE3LDE1NV19LHtpbmRleDouNzUscmdiOlsxOTksMjMzLDE5Ml19LHtpbmRleDouODc1LHJnYjpbMjI5LDI0NSwyMjRdfSx7aW5kZXg6MSxyZ2I6WzI0NywyNTIsMjQ1XX1dLHlpb3JyZDpbe2luZGV4OjAscmdiOlsxMjgsMCwzOF19LHtpbmRleDouMTI1LHJnYjpbMTg5LDAsMzhdfSx7aW5kZXg6LjI1LHJnYjpbMjI3LDI2LDI4XX0se2luZGV4Oi4zNzUscmdiOlsyNTIsNzgsNDJdfSx7aW5kZXg6LjUscmdiOlsyNTMsMTQxLDYwXX0se2luZGV4Oi42MjUscmdiOlsyNTQsMTc4LDc2XX0se2luZGV4Oi43NSxyZ2I6WzI1NCwyMTcsMTE4XX0se2luZGV4Oi44NzUscmdiOlsyNTUsMjM3LDE2MF19LHtpbmRleDoxLHJnYjpbMjU1LDI1NSwyMDRdfV0sYmx1ZXJlZDpbe2luZGV4OjAscmdiOlswLDAsMjU1XX0se2luZGV4OjEscmdiOlsyNTUsMCwwXX1dLHJkYnU6W3tpbmRleDowLHJnYjpbNSwxMCwxNzJdfSx7aW5kZXg6LjM1LHJnYjpbMTA2LDEzNywyNDddfSx7aW5kZXg6LjUscmdiOlsxOTAsMTkwLDE5MF19LHtpbmRleDouNixyZ2I6WzIyMCwxNzAsMTMyXX0se2luZGV4Oi43LHJnYjpbMjMwLDE0NSw5MF19LHtpbmRleDoxLHJnYjpbMTc4LDEwLDI4XX1dLHBpY25pYzpbe2luZGV4OjAscmdiOlswLDAsMjU1XX0se2luZGV4Oi4xLHJnYjpbNTEsMTUzLDI1NV19LHtpbmRleDouMixyZ2I6WzEwMiwyMDQsMjU1XX0se2luZGV4Oi4zLHJnYjpbMTUzLDIwNCwyNTVdfSx7aW5kZXg6LjQscmdiOlsyMDQsMjA0LDI1NV19LHtpbmRleDouNSxyZ2I6WzI1NSwyNTUsMjU1XX0se2luZGV4Oi42LHJnYjpbMjU1LDIwNCwyNTVdfSx7aW5kZXg6LjcscmdiOlsyNTUsMTUzLDI1NV19LHtpbmRleDouOCxyZ2I6WzI1NSwxMDIsMjA0XX0se2luZGV4Oi45LHJnYjpbMjU1LDEwMiwxMDJdfSx7aW5kZXg6MSxyZ2I6WzI1NSwwLDBdfV0scmFpbmJvdzpbe2luZGV4OjAscmdiOlsxNTAsMCw5MF19LHtpbmRleDouMTI1LHJnYjpbMCwwLDIwMF19LHtpbmRleDouMjUscmdiOlswLDI1LDI1NV19LHtpbmRleDouMzc1LHJnYjpbMCwxNTIsMjU1XX0se2luZGV4Oi41LHJnYjpbNDQsMjU1LDE1MF19LHtpbmRleDouNjI1LHJnYjpbMTUxLDI1NSwwXX0se2luZGV4Oi43NSxyZ2I6WzI1NSwyMzQsMF19LHtpbmRleDouODc1LHJnYjpbMjU1LDExMSwwXX0se2luZGV4OjEscmdiOlsyNTUsMCwwXX1dLHBvcnRsYW5kOlt7aW5kZXg6MCxyZ2I6WzEyLDUxLDEzMV19LHtpbmRleDouMjUscmdiOlsxMCwxMzYsMTg2XX0se2luZGV4Oi41LHJnYjpbMjQyLDIxMSw1Nl19LHtpbmRleDouNzUscmdiOlsyNDIsMTQzLDU2XX0se2luZGV4OjEscmdiOlsyMTcsMzAsMzBdfV0sYmxhY2tib2R5Olt7aW5kZXg6MCxyZ2I6WzAsMCwwXX0se2luZGV4Oi4yLHJnYjpbMjMwLDAsMF19LHtpbmRleDouNCxyZ2I6WzIzMCwyMTAsMF19LHtpbmRleDouNyxyZ2I6WzI1NSwyNTUsMjU1XX0se2luZGV4OjEscmdiOlsxNjAsMjAwLDI1NV19XSxlYXJ0aDpbe2luZGV4OjAscmdiOlswLDAsMTMwXX0se2luZGV4Oi4xLHJnYjpbMCwxODAsMTgwXX0se2luZGV4Oi4yLHJnYjpbNDAsMjEwLDQwXX0se2luZGV4Oi40LHJnYjpbMjMwLDIzMCw1MF19LHtpbmRleDouNixyZ2I6WzEyMCw3MCwyMF19LHtpbmRleDoxLHJnYjpbMjU1LDI1NSwyNTVdfV0sZWxlY3RyaWM6W3tpbmRleDowLHJnYjpbMCwwLDBdfSx7aW5kZXg6LjE1LHJnYjpbMzAsMCwxMDBdfSx7aW5kZXg6LjQscmdiOlsxMjAsMCwxMDBdfSx7aW5kZXg6LjYscmdiOlsxNjAsOTAsMF19LHtpbmRleDouOCxyZ2I6WzIzMCwyMDAsMF19LHtpbmRleDoxLHJnYjpbMjU1LDI1MCwyMjBdfV0sYWxwaGE6W3tpbmRleDowLHJnYjpbMjU1LDI1NSwyNTUsMF19LHtpbmRleDowLHJnYjpbMjU1LDI1NSwyNTUsMV19XSx2aXJpZGlzOlt7aW5kZXg6MCxyZ2I6WzY4LDEsODRdfSx7aW5kZXg6LjEzLHJnYjpbNzEsNDQsMTIyXX0se2luZGV4Oi4yNSxyZ2I6WzU5LDgxLDEzOV19LHtpbmRleDouMzgscmdiOls0NCwxMTMsMTQyXX0se2luZGV4Oi41LHJnYjpbMzMsMTQ0LDE0MV19LHtpbmRleDouNjMscmdiOlszOSwxNzMsMTI5XX0se2luZGV4Oi43NSxyZ2I6WzkyLDIwMCw5OV19LHtpbmRleDouODgscmdiOlsxNzAsMjIwLDUwXX0se2luZGV4OjEscmdiOlsyNTMsMjMxLDM3XX1dLGluZmVybm86W3tpbmRleDowLHJnYjpbMCwwLDRdfSx7aW5kZXg6LjEzLHJnYjpbMzEsMTIsNzJdfSx7aW5kZXg6LjI1LHJnYjpbODUsMTUsMTA5XX0se2luZGV4Oi4zOCxyZ2I6WzEzNiwzNCwxMDZdfSx7aW5kZXg6LjUscmdiOlsxODYsNTQsODVdfSx7aW5kZXg6LjYzLHJnYjpbMjI3LDg5LDUxXX0se2luZGV4Oi43NSxyZ2I6WzI0OSwxNDAsMTBdfSx7aW5kZXg6Ljg4LHJnYjpbMjQ5LDIwMSw1MF19LHtpbmRleDoxLHJnYjpbMjUyLDI1NSwxNjRdfV0sbWFnbWE6W3tpbmRleDowLHJnYjpbMCwwLDRdfSx7aW5kZXg6LjEzLHJnYjpbMjgsMTYsNjhdfSx7aW5kZXg6LjI1LHJnYjpbNzksMTgsMTIzXX0se2luZGV4Oi4zOCxyZ2I6WzEyOSwzNywxMjldfSx7aW5kZXg6LjUscmdiOlsxODEsNTQsMTIyXX0se2luZGV4Oi42MyxyZ2I6WzIyOSw4MCwxMDBdfSx7aW5kZXg6Ljc1LHJnYjpbMjUxLDEzNSw5N119LHtpbmRleDouODgscmdiOlsyNTQsMTk0LDEzNV19LHtpbmRleDoxLHJnYjpbMjUyLDI1MywxOTFdfV0scGxhc21hOlt7aW5kZXg6MCxyZ2I6WzEzLDgsMTM1XX0se2luZGV4Oi4xMyxyZ2I6Wzc1LDMsMTYxXX0se2luZGV4Oi4yNSxyZ2I6WzEyNSwzLDE2OF19LHtpbmRleDouMzgscmdiOlsxNjgsMzQsMTUwXX0se2luZGV4Oi41LHJnYjpbMjAzLDcwLDEyMV19LHtpbmRleDouNjMscmdiOlsyMjksMTA3LDkzXX0se2luZGV4Oi43NSxyZ2I6WzI0OCwxNDgsNjVdfSx7aW5kZXg6Ljg4LHJnYjpbMjUzLDE5NSw0MF19LHtpbmRleDoxLHJnYjpbMjQwLDI0OSwzM119XSx3YXJtOlt7aW5kZXg6MCxyZ2I6WzEyNSwwLDE3OV19LHtpbmRleDouMTMscmdiOlsxNzIsMCwxODddfSx7aW5kZXg6LjI1LHJnYjpbMjE5LDAsMTcwXX0se2luZGV4Oi4zOCxyZ2I6WzI1NSwwLDEzMF19LHtpbmRleDouNSxyZ2I6WzI1NSw2Myw3NF19LHtpbmRleDouNjMscmdiOlsyNTUsMTIzLDBdfSx7aW5kZXg6Ljc1LHJnYjpbMjM0LDE3NiwwXX0se2luZGV4Oi44OCxyZ2I6WzE5MCwyMjgsMF19LHtpbmRleDoxLHJnYjpbMTQ3LDI1NSwwXX1dLGNvb2w6W3tpbmRleDowLHJnYjpbMTI1LDAsMTc5XX0se2luZGV4Oi4xMyxyZ2I6WzExNiwwLDIxOF19LHtpbmRleDouMjUscmdiOls5OCw3NCwyMzddfSx7aW5kZXg6LjM4LHJnYjpbNjgsMTQ2LDIzMV19LHtpbmRleDouNSxyZ2I6WzAsMjA0LDE5N119LHtpbmRleDouNjMscmdiOlswLDI0NywxNDZdfSx7aW5kZXg6Ljc1LHJnYjpbMCwyNTUsODhdfSx7aW5kZXg6Ljg4LHJnYjpbNDAsMjU1LDhdfSx7aW5kZXg6MSxyZ2I6WzE0NywyNTUsMF19XSwicmFpbmJvdy1zb2Z0Ijpbe2luZGV4OjAscmdiOlsxMjUsMCwxNzldfSx7aW5kZXg6LjEscmdiOlsxOTksMCwxODBdfSx7aW5kZXg6LjIscmdiOlsyNTUsMCwxMjFdfSx7aW5kZXg6LjMscmdiOlsyNTUsMTA4LDBdfSx7aW5kZXg6LjQscmdiOlsyMjIsMTk0LDBdfSx7aW5kZXg6LjUscmdiOlsxNTAsMjU1LDBdfSx7aW5kZXg6LjYscmdiOlswLDI1NSw1NV19LHtpbmRleDouNyxyZ2I6WzAsMjQ2LDE1MF19LHtpbmRleDouOCxyZ2I6WzUwLDE2NywyMjJdfSx7aW5kZXg6LjkscmdiOlsxMDMsNTEsMjM1XX0se2luZGV4OjEscmdiOlsxMjQsMCwxODZdfV0sYmF0aHltZXRyeTpbe2luZGV4OjAscmdiOls0MCwyNiw0NF19LHtpbmRleDouMTMscmdiOls1OSw0OSw5MF19LHtpbmRleDouMjUscmdiOls2NCw3NiwxMzldfSx7aW5kZXg6LjM4LHJnYjpbNjMsMTEwLDE1MV19LHtpbmRleDouNSxyZ2I6WzcyLDE0MiwxNThdfSx7aW5kZXg6LjYzLHJnYjpbODUsMTc0LDE2M119LHtpbmRleDouNzUscmdiOlsxMjAsMjA2LDE2M119LHtpbmRleDouODgscmdiOlsxODcsMjMwLDE3Ml19LHtpbmRleDoxLHJnYjpbMjUzLDI1NCwyMDRdfV0sY2RvbTpbe2luZGV4OjAscmdiOls0NywxNSw2Ml19LHtpbmRleDouMTMscmdiOls4NywyMyw4Nl19LHtpbmRleDouMjUscmdiOlsxMzAsMjgsOTldfSx7aW5kZXg6LjM4LHJnYjpbMTcxLDQxLDk2XX0se2luZGV4Oi41LHJnYjpbMjA2LDY3LDg2XX0se2luZGV4Oi42MyxyZ2I6WzIzMCwxMDYsODRdfSx7aW5kZXg6Ljc1LHJnYjpbMjQyLDE0OSwxMDNdfSx7aW5kZXg6Ljg4LHJnYjpbMjQ5LDE5MywxMzVdfSx7aW5kZXg6MSxyZ2I6WzI1NCwyMzcsMTc2XX1dLGNobG9yb3BoeWxsOlt7aW5kZXg6MCxyZ2I6WzE4LDM2LDIwXX0se2luZGV4Oi4xMyxyZ2I6WzI1LDYzLDQxXX0se2luZGV4Oi4yNSxyZ2I6WzI0LDkxLDU5XX0se2luZGV4Oi4zOCxyZ2I6WzEzLDExOSw3Ml19LHtpbmRleDouNSxyZ2I6WzE4LDE0OCw4MF19LHtpbmRleDouNjMscmdiOls4MCwxNzMsODldfSx7aW5kZXg6Ljc1LHJnYjpbMTMyLDE5NiwxMjJdfSx7aW5kZXg6Ljg4LHJnYjpbMTc1LDIyMSwxNjJdfSx7aW5kZXg6MSxyZ2I6WzIxNSwyNDksMjA4XX1dLGRlbnNpdHk6W3tpbmRleDowLHJnYjpbNTQsMTQsMzZdfSx7aW5kZXg6LjEzLHJnYjpbODksMjMsODBdfSx7aW5kZXg6LjI1LHJnYjpbMTEwLDQ1LDEzMl19LHtpbmRleDouMzgscmdiOlsxMjAsNzcsMTc4XX0se2luZGV4Oi41LHJnYjpbMTIwLDExMywyMTNdfSx7aW5kZXg6LjYzLHJnYjpbMTE1LDE1MSwyMjhdfSx7aW5kZXg6Ljc1LHJnYjpbMTM0LDE4NSwyMjddfSx7aW5kZXg6Ljg4LHJnYjpbMTc3LDIxNCwyMjddfSx7aW5kZXg6MSxyZ2I6WzIzMCwyNDEsMjQxXX1dLCJmcmVlc3VyZmFjZS1ibHVlIjpbe2luZGV4OjAscmdiOlszMCw0LDExMF19LHtpbmRleDouMTMscmdiOls0NywxNCwxNzZdfSx7aW5kZXg6LjI1LHJnYjpbNDEsNDUsMjM2XX0se2luZGV4Oi4zOCxyZ2I6WzI1LDk5LDIxMl19LHtpbmRleDouNSxyZ2I6WzY4LDEzMSwyMDBdfSx7aW5kZXg6LjYzLHJnYjpbMTE0LDE1NiwxOTddfSx7aW5kZXg6Ljc1LHJnYjpbMTU3LDE4MSwyMDNdfSx7aW5kZXg6Ljg4LHJnYjpbMjAwLDIwOCwyMTZdfSx7aW5kZXg6MSxyZ2I6WzI0MSwyMzcsMjM2XX1dLCJmcmVlc3VyZmFjZS1yZWQiOlt7aW5kZXg6MCxyZ2I6WzYwLDksMThdfSx7aW5kZXg6LjEzLHJnYjpbMTAwLDE3LDI3XX0se2luZGV4Oi4yNSxyZ2I6WzE0MiwyMCwyOV19LHtpbmRleDouMzgscmdiOlsxNzcsNDMsMjddfSx7aW5kZXg6LjUscmdiOlsxOTIsODcsNjNdfSx7aW5kZXg6LjYzLHJnYjpbMjA1LDEyNSwxMDVdfSx7aW5kZXg6Ljc1LHJnYjpbMjE2LDE2MiwxNDhdfSx7aW5kZXg6Ljg4LHJnYjpbMjI3LDE5OSwxOTNdfSx7aW5kZXg6MSxyZ2I6WzI0MSwyMzcsMjM2XX1dLG94eWdlbjpbe2luZGV4OjAscmdiOls2NCw1LDVdfSx7aW5kZXg6LjEzLHJnYjpbMTA2LDYsMTVdfSx7aW5kZXg6LjI1LHJnYjpbMTQ0LDI2LDddfSx7aW5kZXg6LjM4LHJnYjpbMTY4LDY0LDNdfSx7aW5kZXg6LjUscmdiOlsxODgsMTAwLDRdfSx7aW5kZXg6LjYzLHJnYjpbMjA2LDEzNiwxMV19LHtpbmRleDouNzUscmdiOlsyMjAsMTc0LDI1XX0se2luZGV4Oi44OCxyZ2I6WzIzMSwyMTUsNDRdfSx7aW5kZXg6MSxyZ2I6WzI0OCwyNTQsMTA1XX1dLHBhcjpbe2luZGV4OjAscmdiOls1MSwyMCwyNF19LHtpbmRleDouMTMscmdiOls5MCwzMiwzNV19LHtpbmRleDouMjUscmdiOlsxMjksNDQsMzRdfSx7aW5kZXg6LjM4LHJnYjpbMTU5LDY4LDI1XX0se2luZGV4Oi41LHJnYjpbMTgyLDk5LDE5XX0se2luZGV4Oi42MyxyZ2I6WzE5OSwxMzQsMjJdfSx7aW5kZXg6Ljc1LHJnYjpbMjEyLDE3MSwzNV19LHtpbmRleDouODgscmdiOlsyMjEsMjEwLDU0XX0se2luZGV4OjEscmdiOlsyMjUsMjUzLDc1XX1dLHBoYXNlOlt7aW5kZXg6MCxyZ2I6WzE0NSwxMDUsMThdfSx7aW5kZXg6LjEzLHJnYjpbMTg0LDcxLDM4XX0se2luZGV4Oi4yNSxyZ2I6WzE4Niw1OCwxMTVdfSx7aW5kZXg6LjM4LHJnYjpbMTYwLDcxLDE4NV19LHtpbmRleDouNSxyZ2I6WzExMCw5NywyMThdfSx7aW5kZXg6LjYzLHJnYjpbNTAsMTIzLDE2NF19LHtpbmRleDouNzUscmdiOlszMSwxMzEsMTEwXX0se2luZGV4Oi44OCxyZ2I6Wzc3LDEyOSwzNF19LHtpbmRleDoxLHJnYjpbMTQ1LDEwNSwxOF19XSxzYWxpbml0eTpbe2luZGV4OjAscmdiOls0MiwyNCwxMDhdfSx7aW5kZXg6LjEzLHJnYjpbMzMsNTAsMTYyXX0se2luZGV4Oi4yNSxyZ2I6WzE1LDkwLDE0NV19LHtpbmRleDouMzgscmdiOls0MCwxMTgsMTM3XX0se2luZGV4Oi41LHJnYjpbNTksMTQ2LDEzNV19LHtpbmRleDouNjMscmdiOls3OSwxNzUsMTI2XX0se2luZGV4Oi43NSxyZ2I6WzEyMCwyMDMsMTA0XX0se2luZGV4Oi44OCxyZ2I6WzE5MywyMjEsMTAwXX0se2luZGV4OjEscmdiOlsyNTMsMjM5LDE1NF19XSx0ZW1wZXJhdHVyZTpbe2luZGV4OjAscmdiOls0LDM1LDUxXX0se2luZGV4Oi4xMyxyZ2I6WzIzLDUxLDEyMl19LHtpbmRleDouMjUscmdiOls4NSw1OSwxNTddfSx7aW5kZXg6LjM4LHJnYjpbMTI5LDc5LDE0M119LHtpbmRleDouNSxyZ2I6WzE3NSw5NSwxMzBdfSx7aW5kZXg6LjYzLHJnYjpbMjIyLDExMiwxMDFdfSx7aW5kZXg6Ljc1LHJnYjpbMjQ5LDE0Niw2Nl19LHtpbmRleDouODgscmdiOlsyNDksMTk2LDY1XX0se2luZGV4OjEscmdiOlsyMzIsMjUwLDkxXX1dLHR1cmJpZGl0eTpbe2luZGV4OjAscmdiOlszNCwzMSwyN119LHtpbmRleDouMTMscmdiOls2NSw1MCw0MV19LHtpbmRleDouMjUscmdiOls5OCw2OSw1Ml19LHtpbmRleDouMzgscmdiOlsxMzEsODksNTddfSx7aW5kZXg6LjUscmdiOlsxNjEsMTEyLDU5XX0se2luZGV4Oi42MyxyZ2I6WzE4NSwxNDAsNjZdfSx7aW5kZXg6Ljc1LHJnYjpbMjAyLDE3NCw4OF19LHtpbmRleDouODgscmdiOlsyMTYsMjA5LDEyNl19LHtpbmRleDoxLHJnYjpbMjMzLDI0NiwxNzFdfV0sInZlbG9jaXR5LWJsdWUiOlt7aW5kZXg6MCxyZ2I6WzE3LDMyLDY0XX0se2luZGV4Oi4xMyxyZ2I6WzM1LDUyLDExNl19LHtpbmRleDouMjUscmdiOlsyOSw4MSwxNTZdfSx7aW5kZXg6LjM4LHJnYjpbMzEsMTEzLDE2Ml19LHtpbmRleDouNSxyZ2I6WzUwLDE0NCwxNjldfSx7aW5kZXg6LjYzLHJnYjpbODcsMTczLDE3Nl19LHtpbmRleDouNzUscmdiOlsxNDksMTk2LDE4OV19LHtpbmRleDouODgscmdiOlsyMDMsMjIxLDIxMV19LHtpbmRleDoxLHJnYjpbMjU0LDI1MSwyMzBdfV0sInZlbG9jaXR5LWdyZWVuIjpbe2luZGV4OjAscmdiOlsyMywzNSwxOV19LHtpbmRleDouMTMscmdiOlsyNCw2NCwzOF19LHtpbmRleDouMjUscmdiOlsxMSw5NSw0NV19LHtpbmRleDouMzgscmdiOlszOSwxMjMsMzVdfSx7aW5kZXg6LjUscmdiOls5NSwxNDYsMTJdfSx7aW5kZXg6LjYzLHJnYjpbMTUyLDE2NSwxOF19LHtpbmRleDouNzUscmdiOlsyMDEsMTg2LDY5XX0se2luZGV4Oi44OCxyZ2I6WzIzMywyMTYsMTM3XX0se2luZGV4OjEscmdiOlsyNTUsMjUzLDIwNV19XSxjdWJlaGVsaXg6W3tpbmRleDowLHJnYjpbMCwwLDBdfSx7aW5kZXg6LjA3LHJnYjpbMjIsNSw1OV19LHtpbmRleDouMTMscmdiOls2MCw0LDEwNV19LHtpbmRleDouMixyZ2I6WzEwOSwxLDEzNV19LHtpbmRleDouMjcscmdiOlsxNjEsMCwxNDddfSx7aW5kZXg6LjMzLHJnYjpbMjEwLDIsMTQyXX0se2luZGV4Oi40LHJnYjpbMjUxLDExLDEyM119LHtpbmRleDouNDcscmdiOlsyNTUsMjksOTddfSx7aW5kZXg6LjUzLHJnYjpbMjU1LDU0LDY5XX0se2luZGV4Oi42LHJnYjpbMjU1LDg1LDQ2XX0se2luZGV4Oi42NyxyZ2I6WzI1NSwxMjAsMzRdfSx7aW5kZXg6LjczLHJnYjpbMjU1LDE1NywzN119LHtpbmRleDouOCxyZ2I6WzI0MSwxOTEsNTddfSx7aW5kZXg6Ljg3LHJnYjpbMjI0LDIyMCw5M119LHtpbmRleDouOTMscmdiOlsyMTgsMjQxLDE0Ml19LHtpbmRleDoxLHJnYjpbMjI3LDI1MywxOThdfV19fSx7fV0sODA6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt2YXIgZSxyLG4sdSxjLGgsZixkLHAsZyxtLHYseSx4PVtdLGI9W10sXz1bXSx3PVtdO2lmKG8uaXNQbGFpbk9iamVjdCh0KXx8KHQ9e30pLHA9dC5uc2hhZGVzfHw3MixkPXQuZm9ybWF0fHwiaGV4IixmPXQuY29sb3JtYXAsZnx8KGY9ImpldCIpLCJzdHJpbmciPT10eXBlb2YgZil7aWYoZj1mLnRvTG93ZXJDYXNlKCksIWxbZl0pdGhyb3cgRXJyb3IoZisiIG5vdCBhIHN1cHBvcnRlZCBjb2xvcnNjYWxlIik7aD1zKGxbZl0pfWVsc2V7aWYoIUFycmF5LmlzQXJyYXkoZikpdGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIGNvbG9ybWFwIG9wdGlvbiIsZik7aD1zKGYpfWlmKGgubGVuZ3RoPnApdGhyb3cgbmV3IEVycm9yKGYrIiBtYXAgcmVxdWlyZXMgbnNoYWRlcyB0byBiZSBhdCBsZWFzdCBzaXplICIraC5sZW5ndGgpO2ZvcihtPUFycmF5LmlzQXJyYXkodC5hbHBoYSk/MiE9PXQuYWxwaGEubGVuZ3RoP1sxLDFdOnModC5hbHBoYSk6Im51bWJlciI9PXR5cGVvZiB0LmFscGhhP1t0LmFscGhhLHQuYWxwaGFdOlsxLDFdLGU9aC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodC5pbmRleCpwKX0pLG1bMF08MCYmKG1bMF09MCksbVsxXTwwJiYobVswXT0wKSxtWzBdPjEmJihtWzBdPTEpLG1bMV0+MSYmKG1bMF09MSkseT0wO3k8ZS5sZW5ndGg7Kyt5KXY9aFt5XS5pbmRleCxyPWhbeV0ucmdiLDQ9PT1yLmxlbmd0aCYmclszXT49MCYmclszXTw9MXx8KHJbM109bVswXSsobVsxXS1tWzBdKSp2KTtmb3IoeT0wO3k8ZS5sZW5ndGgtMTsrK3kpYz1lW3krMV0tZVt5XSxuPWhbeV0ucmdiLHU9aFt5KzFdLnJnYix4PXguY29uY2F0KG8ubGluc3BhY2UoblswXSx1WzBdLGMpKSxiPWIuY29uY2F0KG8ubGluc3BhY2UoblsxXSx1WzFdLGMpKSxfPV8uY29uY2F0KG8ubGluc3BhY2UoblsyXSx1WzJdLGMpKSx3PXcuY29uY2F0KG8ubGluc3BhY2UoblszXSx1WzNdLGMpKTtyZXR1cm4geD14Lm1hcChNYXRoLnJvdW5kKSxiPWIubWFwKE1hdGgucm91bmQpLF89Xy5tYXAoTWF0aC5yb3VuZCksZz1vLnppcCh4LGIsXyx3KSwiaGV4Ij09PWQmJihnPWcubWFwKGkpKSwicmdiYVN0cmluZyI9PT1kJiYoZz1nLm1hcChhKSksZ31mdW5jdGlvbiBpKHQpe2Zvcih2YXIgZSxyPSIjIixuPTA7bjwzOysrbillPXRbbl0sZT1lLnRvU3RyaW5nKDE2KSxyKz0oIjAwIitlKS5zdWJzdHIoZS5sZW5ndGgpO3JldHVybiByfWZ1bmN0aW9uIGEodCl7cmV0dXJuInJnYmEoIit0LmpvaW4oIiwiKSsiKSJ9dmFyIG89dCgiYXJyYXl0b29scyIpLHM9dCgiY2xvbmUiKSxsPXQoIi4vY29sb3JTY2FsZXMiKTtlLmV4cG9ydHM9bn0seyIuL2NvbG9yU2NhbGVzIjo3OSxhcnJheXRvb2xzOjMzLGNsb25lOjc4fV0sODE6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscil7dmFyIG49cyh0WzBdLC1lWzBdKSxpPXModFsxXSwtZVsxXSksYT1zKHJbMF0sLWVbMF0pLG89cyhyWzFdLC1lWzFdKSxjPXUobChuLGEpLGwoaSxvKSk7cmV0dXJuIGNbYy5sZW5ndGgtMV0+PTB9ZnVuY3Rpb24gaSh0LGUscixpKXt2YXIgcz1hKGUscixpKTtpZigwPT09cyl7dmFyIGw9byhhKHQsZSxyKSksdT1vKGEodCxlLGkpKTtpZihsPT09dSl7aWYoMD09PWwpe3ZhciBjPW4odCxlLHIpLGg9bih0LGUsaSk7cmV0dXJuIGM9PT1oPzA6Yz8xOi0xfXJldHVybiAwfXJldHVybiAwPT09dT9sPjA/LTE6bih0LGUsaSk/LTE6MTowPT09bD91PjA/MTpuKHQsZSxyKT8xOi0xOm8odS1sKX12YXIgZj1hKHQsZSxyKTtpZihmPjApcmV0dXJuIHM+MCYmYSh0LGUsaSk+MD8xOi0xO2lmKGY8MClyZXR1cm4gcz4wfHxhKHQsZSxpKT4wPzE6LTE7dmFyIGQ9YSh0LGUsaSk7cmV0dXJuIGQ+MD8xOm4odCxlLHIpPzE6LTF9ZS5leHBvcnRzPWk7dmFyIGE9dCgicm9idXN0LW9yaWVudGF0aW9uIiksbz10KCJzaWdudW0iKSxzPXQoInR3by1zdW0iKSxsPXQoInJvYnVzdC1wcm9kdWN0IiksdT10KCJyb2J1c3Qtc3VtIil9LHsicm9idXN0LW9yaWVudGF0aW9uIjo0NjUsInJvYnVzdC1wcm9kdWN0Ijo0NjYsInJvYnVzdC1zdW0iOjQ3MCxzaWdudW06NDcyLCJ0d28tc3VtIjo0OTV9XSw4MjpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gdC1lfWZ1bmN0aW9uIGkodCxlKXt2YXIgcj10Lmxlbmd0aCxpPXQubGVuZ3RoLWUubGVuZ3RoO2lmKGkpcmV0dXJuIGk7c3dpdGNoKHIpe2Nhc2UgMDpyZXR1cm4gMDtjYXNlIDE6cmV0dXJuIHRbMF0tZVswXTtjYXNlIDI6cmV0dXJuIHRbMF0rdFsxXS1lWzBdLWVbMV18fGEodFswXSx0WzFdKS1hKGVbMF0sZVsxXSk7Y2FzZSAzOnZhciBvPXRbMF0rdFsxXSxzPWVbMF0rZVsxXTtpZihpPW8rdFsyXS0ocytlWzJdKSlyZXR1cm4gaTt2YXIgbD1hKHRbMF0sdFsxXSksdT1hKGVbMF0sZVsxXSk7cmV0dXJuIGEobCx0WzJdKS1hKHUsZVsyXSl8fGEobCt0WzJdLG8pLWEodStlWzJdLHMpO2Nhc2UgNDp2YXIgYz10WzBdLGg9dFsxXSxmPXRbMl0sZD10WzNdLHA9ZVswXSxnPWVbMV0sbT1lWzJdLHY9ZVszXTtyZXR1cm4gYytoK2YrZC0ocCtnK20rdil8fGEoYyxoLGYsZCktYShwLGcsbSx2LHApfHxhKGMraCxjK2YsYytkLGgrZixoK2QsZitkKS1hKHArZyxwK20scCt2LGcrbSxnK3YsbSt2KXx8YShjK2grZixjK2grZCxjK2YrZCxoK2YrZCktYShwK2crbSxwK2crdixwK20rdixnK20rdik7ZGVmYXVsdDpmb3IodmFyIHk9dC5zbGljZSgpLnNvcnQobikseD1lLnNsaWNlKCkuc29ydChuKSxiPTA7YjxyOysrYilpZihpPXlbYl0teFtiXSlyZXR1cm4gaTtyZXR1cm4gMH19ZS5leHBvcnRzPWk7dmFyIGE9TWF0aC5taW59LHt9XSw4MzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIGkodCxlKXx8YSh0KS1hKGUpfXZhciBpPXQoImNvbXBhcmUtY2VsbCIpLGE9dCgiY2VsbC1vcmllbnRhdGlvbiIpO2UuZXhwb3J0cz1ufSx7ImNlbGwtb3JpZW50YXRpb24iOjczLCJjb21wYXJlLWNlbGwiOjgyfV0sODQ6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt2YXIgZT10Lmxlbmd0aDtpZigwPT09ZSlyZXR1cm5bXTtpZigxPT09ZSlyZXR1cm5bWzBdXTt2YXIgcj10WzBdLmxlbmd0aDtyZXR1cm4gMD09PXI/W106MT09PXI/aSh0KToyPT09cj9hKHQpOm8odCxyKX12YXIgaT10KCIuL2xpYi9jaDFkIiksYT10KCIuL2xpYi9jaDJkIiksbz10KCIuL2xpYi9jaG5kIik7ZS5leHBvcnRzPW59LHsiLi9saWIvY2gxZCI6ODUsIi4vbGliL2NoMmQiOjg2LCIuL2xpYi9jaG5kIjo4N31dLDg1OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7Zm9yKHZhciBlPTAscj0wLG49MTtuPHQubGVuZ3RoOysrbil0W25dWzBdPHRbZV1bMF0mJihlPW4pLHRbbl1bMF0+dFtyXVswXSYmKHI9bik7cmV0dXJuIGU8cj9bW2VdLFtyXV06ZT5yP1tbcl0sW2VdXTpbW2VdXX1lLmV4cG9ydHM9bn0se31dLDg2OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGU9aSh0KSxyPWUubGVuZ3RoO2lmKHI8PTIpcmV0dXJuW107Zm9yKHZhciBuPW5ldyBBcnJheShyKSxhPWVbci0xXSxvPTA7bzxyOysrbyl7dmFyIHM9ZVtvXTtuW29dPVthLHNdLGE9c31yZXR1cm4gbn1lLmV4cG9ydHM9bjt2YXIgaT10KCJtb25vdG9uZS1jb252ZXgtaHVsbC0yZCIpfSx7Im1vbm90b25lLWNvbnZleC1odWxsLTJkIjo0MTJ9XSw4NzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7Zm9yKHZhciByPXQubGVuZ3RoLG49bmV3IEFycmF5KHIpLGk9MDtpPGUubGVuZ3RoOysraSluW2ldPXRbZVtpXV07Zm9yKHZhciBhPWUubGVuZ3RoLGk9MDtpPHI7KytpKWUuaW5kZXhPZihpKTwwJiYoblthKytdPXRbaV0pO3JldHVybiBufWZ1bmN0aW9uIGkodCxlKXtmb3IodmFyIHI9dC5sZW5ndGgsbj1lLmxlbmd0aCxpPTA7aTxyOysraSlmb3IodmFyIGE9dFtpXSxvPTA7bzxhLmxlbmd0aDsrK28pe3ZhciBzPWFbb107aWYoczxuKWFbb109ZVtzXTtlbHNle3MtPW47Zm9yKHZhciBsPTA7bDxuOysrbClzPj1lW2xdJiYocys9MSk7YVtvXT1zfX1yZXR1cm4gdH1mdW5jdGlvbiBhKHQsZSl7dHJ5e3JldHVybiBvKHQsITApfWNhdGNoKHUpe3ZhciByPXModCk7aWYoci5sZW5ndGg8PWUpcmV0dXJuW107dmFyIGE9bih0LHIpLGw9byhhLCEwKTtyZXR1cm4gaShsLHIpfX1lLmV4cG9ydHM9YTt2YXIgbz10KCJpbmNyZW1lbnRhbC1jb252ZXgtaHVsbCIpLHM9dCgiYWZmaW5lLWh1bGwiKX0seyJhZmZpbmUtaHVsbCI6MzAsImluY3JlbWVudGFsLWNvbnZleC1odWxsIjoyNTR9XSw4ODpbZnVuY3Rpb24odCxlLHIpe2UuZXhwb3J0cz17QUZHOiJhZmdoYW4iLEFMQToiXFxiXFx3bGFuZCIsQUxCOiJhbGJhbmlhIixEWkE6ImFsZ2VyaWEiLEFTTToiXig/PS4qYW1lcmljKS4qc2Ftb2EiLEFORDoiYW5kb3JyYSIsQUdPOiJhbmdvbGEiLEFJQToiYW5ndWlsbD9hIixBVEE6ImFudGFyY3RpY2EiLEFURzoiYW50aWd1YSIsQVJHOiJhcmdlbnRpbiIsQVJNOiJhcm1lbmlhIixBQlc6Il4oPyEuKmJvbmFpcmUpLipcXGJhcnViYSIsQVVTOiJhdXN0cmFsaWEiLEFVVDoiXig/IS4qaHVuZ2FyeSkuKmF1c3RyaWF8XFxiYXVzdHJpLipcXGJlbXAiLEFaRToiYXplcmJhaWphbiIsQkhTOiJiYWhhbWFzIixCSFI6ImJhaHJhaW4iLEJHRDoiYmFuZ2xhZGVzaHxeKD89LiplYXN0KS4qcGFraT9zdGFuIixCUkI6ImJhcmJhZG9zIixCTFI6ImJlbGFydXN8YnllbG8iLEJFTDoiXig/IS4qbHV4ZW0pLipiZWxnaXVtIixCTFo6ImJlbGl6ZXxeKD89Lipicml0aXNoKS4qaG9uZHVyYXMiLEJFTjoiYmVuaW58ZGFob21lIixCTVU6ImJlcm11ZGEiLEJUTjoiYmh1dGFuIixCT0w6ImJvbGl2aWEiLEJFUzoiXig/PS4qYm9uYWlyZSkuKmV1c3RhdGl1c3xeKD89LipjYXJpYikuKm5ldGhlcmxhbmRzfFxcYmJlcy4/aXNsYW5kcyIsQklIOiJoZXJ6ZWdvdmluYXxib3NuaWEiLEJXQToiYm90c3dhbmF8YmVjaHVhbmEiLEJWVDoiYm91dmV0IixCUkE6ImJyYXppbCIsSU9UOiJicml0aXNoLj9pbmRpYW4uP29jZWFuIixCUk46ImJydW5laSIsQkdSOiJidWxnYXJpYSIsQkZBOiJidXJraW5hfFxcYmZhc298dXBwZXIuP3ZvbHRhIixCREk6ImJ1cnVuZGkiLEtITToiY2FtYm9kaWF8a2FtcHVjaGVhfGtobWVyIixDTVI6ImNhbWVyb29uIixDQU46ImNhbmFkYSIsQ1BWOiJ2ZXJkZSIsQ1lNOiJjYXltYW4iLENBRjoiXFxiY2VudHJhbC5hZnJpY2FuLnJlcHVibGljIixUQ0Q6IlxcYmNoYWQiLENITDoiXFxiY2hpbGUiLENITjoiXig/IS4qXFxibWFjKSg/IS4qXFxiaG9uZykoPyEuKlxcYnRhaSkoPyEuKlxcYnJlcCkuKmNoaW5hfF4oPz0uKnBlbykoPz0uKnJlcCkuKmNoaW5hIixDWFI6ImNocmlzdG1hcyIsQ0NLOiJcXGJjb2Nvc3xrZWVsaW5nIixDT0w6ImNvbG9tYmlhIixDT006ImNvbW9ybyIsQ09EOiJcXGJkZW0uKmNvbmdvfGNvbmdvLipcXGJkZW18Y29uZ28uKlxcYmRyfFxcYmRyLipjb25nb3xiZWxnaWFuLj9jb25nb3xjb25nby4/ZnJlZS4/c3RhdGV8a2luc2hhc2F8emFpcmV8bC5vcG9sZHZpbGxlfGRyY3xkcm9jfHJkYyIsQ09HOiJeKD8hLipcXGJkZW0pKD8hLipcXGJkcikoPyEuKmtpbnNoYXNhKSg/IS4qemFpcmUpKD8hLipiZWxnKSg/IS4qbC5vcG9sZHZpbGxlKSg/IS4qZnJlZSkuKlxcYmNvbmdvIixDT0s6IlxcYmNvb2siLENSSToiY29zdGEuP3JpY2EiLENJVjoiaXZvaXJlfGl2b3J5IixIUlY6ImNyb2F0aWEiLENVQjoiXFxiY3ViYSIsQ1VXOiJeKD8hLipib25haXJlKS4qXFxiY3VyYShjfFx4ZTcpYW8iLENZUDoiY3lwcnVzIixDWkU6Il4oPz0uKnJlcCkuKmN6ZWNofGN6ZWNoaWF8Ym9oZW1pYSIsQ1NLOiJjemVjaG9zbG92YWtpYSIsRE5LOiJkZW5tYXJrIixESkk6ImRqaWJvdXRpIixETUE6ImRvbWluaWNhKD8hbikiLERPTToiZG9taW5pY2FuLnJlcCIsRUNVOiJlY3VhZG9yIixFR1k6ImVneXB0IixTTFY6ImVsLj9zYWx2YWRvciIsR05ROiJndWluZS4qZXF8ZXEuKmd1aW5lfF4oPz0uKnNwYW4pLipndWluZWEiLEVSSToiZXJpdHJlYSIsRVNUOiJlc3RvbmlhIixFVEg6ImV0aGlvcGlhfGFieXNzaW5pYSIsRkxLOiJmYWxrbGFuZHxtYWx2aW5hcyIsRlJPOiJmYXJvZXxmYWVyb2UiLEZKSToiZmlqaSIsRklOOiJmaW5sYW5kIixGUkE6Il4oPyEuKlxcYmRlcCkoPyEuKm1hcnRpbmlxdWUpLipmcmFuY2V8ZnJlbmNoLj9yZXB1YmxpY3xcXGJnYXVsIixHVUY6Il4oPz0uKmZyZW5jaCkuKmd1aWFuYSIsUFlGOiJmcmVuY2guP3BvbHluZXNpYXx0YWhpdGkiLEFURjoiZnJlbmNoLj9zb3V0aGVybiIsR0FCOiJnYWJvbiIsR01COiJnYW1iaWEiLEdFTzoiXig/IS4qc291dGgpLipnZW9yZ2lhIixERFI6Imdlcm1hbi4/ZGVtb2NyYXRpYy4/cmVwdWJsaWN8ZGVtb2NyYXRpYy4/cmVwdWJsaWMuKmdlcm1hbnl8ZWFzdC5nZXJtYW55IixERVU6Il4oPyEuKmVhc3QpLipnZXJtYW55fF4oPz0uKlxcYmZlZC4qXFxicmVwKS4qZ2VybWFuIixHSEE6ImdoYW5hfGdvbGQuP2NvYXN0IixHSUI6ImdpYnJhbHRhciIsR1JDOiJncmVlY2V8aGVsbGVuaWN8aGVsbGFzIixHUkw6ImdyZWVubGFuZCIsR1JEOiJncmVuYWRhIixHTFA6Imd1YWRlbG91cGUiLEdVTToiXFxiZ3VhbSIsR1RNOiJndWF0ZW1hbGEiLEdHWToiZ3Vlcm5zZXkiLEdJTjoiXig/IS4qZXEpKD8hLipzcGFuKSg/IS4qYmlzc2F1KSg/IS4qcG9ydHUpKD8hLipuZXcpLipndWluZWEiLEdOQjoiYmlzc2F1fF4oPz0uKnBvcnR1KS4qZ3VpbmVhIixHVVk6Imd1eWFuYXxicml0aXNoLj9ndWlhbmEiLEhUSToiaGFpdGkiLEhNRDoiaGVhcmQuKm1jZG9uYWxkIixWQVQ6ImhvbHkuP3NlZXx2YXRpY2FufHBhcGFsLj9zdCIsSE5EOiJeKD8hLipicml0KS4qaG9uZHVyYXMiLEhLRzoiaG9uZy4/a29uZyIsSFVOOiJeKD8hLiphdXN0cikuKmh1bmdhcnkiLElTTDoiaWNlbGFuZCIsSU5EOiJpbmRpYSg/IS4qb2NlYSkiLElETjoiaW5kb25lc2lhIixJUk46IlxcYmlyYW58cGVyc2lhIixJUlE6IlxcYmlyYXF8bWVzb3BvdGFtaWEiLElSTDoiaXJlbGFuZCIsSU1OOiJeKD89Lippc2xlKS4qXFxibWFuIixJU1I6ImlzcmFlbCIsSVRBOiJpdGFseSIsSkFNOiJqYW1haWNhIixKUE46ImphcGFuIixKRVk6ImplcnNleSIsSk9SOiJqb3JkYW4iLEtBWjoia2F6YWsiLEtFTjoia2VueWF8YnJpdGlzaC4/ZWFzdC4/YWZyaWNhfGVhc3QuP2FmcmljYS4/cHJvdCIsS0lSOiJraXJpYmF0aSIsUFJLOiJeKD89LipkZW1vY3JhdCkuKlxcYmtvcmVhfF4oPz0uKnBlb3BsZSkuKlxcYmtvcmVhfF4oPz0uKm5vcnRoKS4qXFxia29yZWF8ZHByayIsS09SOiJeKD8hLipkZW1vY3JhdCkoPyEuKnBlb3BsZSkoPyEuKm5vcnRoKS4qXFxia29yZWEiLEtXVDoia3V3YWl0IixLR1o6Imt5cmd5enxraXJnaGl6IixMQU86IlxcYmxhb3M/XFxiIixMVkE6ImxhdHZpYSIsTEJOOiJsZWJhbm9uIixMU086Imxlc290aG98YmFzdXRvIixMQlI6ImxpYmVyaWEiLExCWToibGlieWEiLExJRToibGllY2h0ZW5zdGVpbiIsTFRVOiJsaXRodWFuaWEiLExVWDoiXig/IS4qYmVsZykuKmx1eGVtIixNQUM6Im1hY2Eob3x1KSIsTUtEOiJtYWNlZG9uaWF8Znlyb20iLE1ERzoibWFkYWdhc2NhcnxtYWxhZ2FzeSIsTVdJOiJtYWxhd2l8bnlhc2EiLE1ZUzoibWFsYXlzaWEiLE1EVjoibWFsZGl2ZSIsTUxJOiJcXGJtYWxpXFxiIixNTFQ6IlxcYm1hbHRhIixNSEw6Im1hcnNoYWxsIixNVFE6Im1hcnRpbmlxdWUiLE1SVDoibWF1cml0YW5pYSIsTVVTOiJtYXVyaXRpdXMiLE1ZVDoiXFxibWF5b3R0ZSIsTUVYOiJcXGJtZXhpYyIsRlNNOiJtaWNyb25lc2lhIixNREE6Im1vbGRvdnxiKGF8ZSlzc2FyYWJpYSIsTUNPOiJtb25hY28iLE1ORzoibW9uZ29saWEiLE1ORToiXig/IS4qc2VyYmlhKS4qbW9udGVuZWdybyIsTVNSOiJtb250c2VycmF0IixNQVI6Im1vcm9jY298XFxibWFyb2MiLE1PWjoibW96YW1iaXF1ZSIsTU1SOiJteWFubWFyfGJ1cm1hIixOQU06Im5hbWliaWEiLE5SVToibmF1cnUiLE5QTDoibmVwYWwiLE5MRDoiXig/IS4qXFxiYW50KSg/IS4qXFxiY2FyaWIpLipuZXRoZXJsYW5kcyIsQU5UOiJeKD89LipcXGJhbnQpLioobmV0aGVyfGR1dGNoKSIsTkNMOiJuZXcuP2NhbGVkb25pYSIsTlpMOiJuZXcuP3plYWxhbmQiLE5JQzoibmljYXJhZ3VhIixORVI6IlxcYm5pZ2VyKD8haWEpIixOR0E6Im5pZ2VyaWEiLE5JVToibml1ZSIsTkZLOiJub3Jmb2xrIixNTlA6Im1hcmlhbmEiLE5PUjoibm9yd2F5IixPTU46IlxcYm9tYW58dHJ1Y2lhbCIsUEFLOiJeKD8hLiplYXN0KS4qcGFraT9zdGFuIixQTFc6InBhbGF1IixQU0U6InBhbGVzdGlufFxcYmdhemF8d2VzdC4/YmFuayIsUEFOOiJwYW5hbWEiLFBORzoicGFwdWF8bmV3Lj9ndWluZWEiLFBSWToicGFyYWd1YXkiLFBFUjoicGVydSIsUEhMOiJwaGlsaXBwaW5lcyIsUENOOiJwaXRjYWlybiIsUE9MOiJwb2xhbmQiLFBSVDoicG9ydHVnYWwiLFBSSToicHVlcnRvLj9yaWNvIixRQVQ6InFhdGFyIixSRVU6InIoZXxceGU5KXVuaW9uIixST1U6InIob3x1fG91KW1hbmlhIixSVVM6IlxcYnJ1c3NpYXxzb3ZpZXQuP3VuaW9ufHVcXC4/c1xcLj9zXFwuP3J8c29jaWFsaXN0Lj9yZXB1YmxpY3MiLFJXQToicndhbmRhIixCTE06ImJhcnRoKGV8XHhlOSlsZW15IixTSE46ImhlbGVuYSIsS05BOiJraXR0c3xcXGJuZXZpcyIsTENBOiJcXGJsdWNpYSIsTUFGOiJeKD89Lipjb2xsZWN0aXZpdHkpLiptYXJ0aW58Xig/PS4qZnJhbmNlKS4qbWFydGluKD8haXF1ZSl8Xig/PS4qZnJlbmNoKS4qbWFydGluKD8haXF1ZSkiLFNQTToibWlxdWVsb24iLFZDVDoidmluY2VudCIsV1NNOiJeKD8hLiphbWVyKS4qc2Ftb2EiLFNNUjoic2FuLj9tYXJpbm8iLFNUUDoiXFxicyhhfFx4ZTMpby4/dG9tKGV8XHhlOSkiLFNBVToiXFxic2FcXHcqLj9hcmFiaWEiLFNFTjoic2VuZWdhbCIsU1JCOiJeKD8hLiptb250ZSkuKnNlcmJpYSIsU1lDOiJzZXljaGVsbCIsU0xFOiJzaWVycmEiLFNHUDoic2luZ2Fwb3JlIixTWE06Il4oPyEuKm1hcnRpbikoPyEuKnNhYmEpLiptYWFydGVuIixTVks6Il4oPyEuKmN6ZSkuKnNsb3ZhayIsU1ZOOiJzbG92ZW5pYSIsU0xCOiJzb2xvbW9uIixTT006InNvbWFsaSIsWkFGOiJcXGJzXFx3Ki4/YWZyaWNhIixTR1M6InNvdXRoLj9nZW9yZ2lhfHNhbmR3aWNoIixTU0Q6IlxcYnNcXHcqLj9zdWRhbiIsRVNQOiJzcGFpbiIsTEtBOiJzcmkuP2xhbmthfGNleWxvbiIsU0ROOiJeKD8hLipcXGJzKD8hdSkpLipzdWRhbiIsU1VSOiJzdXJpbmFtfGR1dGNoLj9ndWlhbmEiLFNKTToic3ZhbGJhcmQiLFNXWjoic3dhemlsYW5kIixTV0U6InN3ZWRlbiIsQ0hFOiJzd2l0enxzd2lzcyIsU1lSOiJzeXJpYSIsVFdOOiJ0YWl3YW58dGFpcGVpfGZvcm1vc2F8Xig/IS4qcGVvKSg/PS4qcmVwKS4qY2hpbmEiLFRKSzoidGFqaWsiLFRaQToidGFuemFuaWEiLFRIQToidGhhaWxhbmR8XFxic2lhbSIsVExTOiJeKD89LipsZXN0ZSkuKnRpbW9yfF4oPz0uKmVhc3QpLip0aW1vciIsVEdPOiJ0b2dvIixUS0w6InRva2VsYXUiLFRPTjoidG9uZ2EiLFRUTzoidHJpbmlkYWR8dG9iYWdvIixUVU46InR1bmlzaWEiLFRVUjoidHVya2V5IixUS006InR1cmttZW4iLFRDQToidHVya3MiLFRVVjoidHV2YWx1IixVR0E6InVnYW5kYSIsVUtSOiJ1a3JhaW4iLEFSRToiZW1pcmF0ZXN8XnVcXC4/YVxcLj9lXFwuPyR8dW5pdGVkLj9hcmFiLj9lbSIsR0JSOiJ1bml0ZWQuP2tpbmdkb218YnJpdGFpbnxedVxcLj9rXFwuPyQiLFVTQToidW5pdGVkLj9zdGF0ZXN8XFxidVxcLj9zXFwuP2FcXC4/XFxifFxcYnVcXC4/c1xcLj9cXGIoPyEuKmlzbGFuZHMpIixVTUk6Im1pbm9yLj9vdXRseWluZy4/aXMiLFVSWToidXJ1Z3VheSIsVVpCOiJ1emJlayIsVlVUOiJ2YW51YXR1fG5ldy4/aGVicmlkZXMiLFZFTjoidmVuZXp1ZWxhIixWTk06Il4oPyEuKnJlcHVibGljKS4qdmlldC4/bmFtfF4oPz0uKnNvY2lhbGlzdCkuKnZpZXQuP25hbSIsVkdCOiJeKD89LipcXGJ1XFwuP1xccz9rKS4qdmlyZ2lufF4oPz0uKmJyaXQpLip2aXJnaW58Xig/PS4qa2luZ2RvbSkuKnZpcmdpbiIsVklSOiJeKD89LipcXGJ1XFwuP1xccz9zKS4qdmlyZ2lufF4oPz0uKnN0YXRlcykuKnZpcmdpbiIsV0xGOiJmdXR1bmF8d2FsbGlzIixFU0g6Indlc3Rlcm4uc2FoYXJhIixZRU06Il4oPyEuKmFyYWIpKD8hLipub3J0aCkoPyEuKnNhbmEpKD8hLipwZW8pKD8hLipkZW0pKD8hLipzb3V0aCkoPyEuKmFkZW4pKD8hLipcXGJwXFwuP2RcXC4/cikuKnllbWVuIixZTUQ6Il4oPz0uKnBlbykuKnllbWVufF4oPyEuKnJlcCkoPz0uKmRlbSkuKnllbWVufF4oPz0uKnNvdXRoKS4qeWVtZW58Xig/PS4qYWRlbikuKnllbWVufF4oPz0uKlxcYnBcXC4/ZFxcLj9yKS4qeWVtZW4iLApZVUc6Inl1Z29zbGF2aWEiLFpNQjoiemFtYmlhfG5vcnRoZXJuLj9yaG9kZXNpYSIsRUFaOiJ6YW56aWJhciIsWldFOiJ6aW1iYWJ3ZXxeKD8hLipub3J0aGVybikuKnJob2Rlc2lhIn19LHt9XSw4OTpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIHQ9TWF0aC5yb3VuZCh0KSx0PDA/MDp0PjI1NT8yNTU6dH1mdW5jdGlvbiBpKHQpe3JldHVybiB0PDA/MDp0PjE/MTp0fWZ1bmN0aW9uIGEodCl7cmV0dXJuIG4oIiUiPT09dFt0Lmxlbmd0aC0xXT9wYXJzZUZsb2F0KHQpLzEwMCoyNTU6cGFyc2VJbnQodCkpfWZ1bmN0aW9uIG8odCl7cmV0dXJuIGkoIiUiPT09dFt0Lmxlbmd0aC0xXT9wYXJzZUZsb2F0KHQpLzEwMDpwYXJzZUZsb2F0KHQpKX1mdW5jdGlvbiBzKHQsZSxyKXtyZXR1cm4gcjwwP3IrPTE6cj4xJiYoci09MSksNipyPDE/dCsoZS10KSpyKjY6MipyPDE/ZTozKnI8Mj90KyhlLXQpKigyLzMtcikqNjp0fWZ1bmN0aW9uIGwodCl7dmFyIGU9dC5yZXBsYWNlKC8gL2csIiIpLnRvTG93ZXJDYXNlKCk7aWYoZSBpbiB1KXJldHVybiB1W2VdLnNsaWNlKCk7aWYoIiMiPT09ZVswXSl7aWYoND09PWUubGVuZ3RoKXt2YXIgcj1wYXJzZUludChlLnN1YnN0cigxKSwxNik7cmV0dXJuIHI+PTAmJnI8PTQwOTU/WygzODQwJnIpPj40fCgzODQwJnIpPj44LDI0MCZyfCgyNDAmcik+PjQsMTUmcnwoMTUmcik8PDQsMV06bnVsbH1pZig3PT09ZS5sZW5ndGgpe3ZhciByPXBhcnNlSW50KGUuc3Vic3RyKDEpLDE2KTtyZXR1cm4gcj49MCYmcjw9MTY3NzcyMTU/WygxNjcxMTY4MCZyKT4+MTYsKDY1MjgwJnIpPj44LDI1NSZyLDFdOm51bGx9cmV0dXJuIG51bGx9dmFyIGk9ZS5pbmRleE9mKCIoIiksbD1lLmluZGV4T2YoIikiKTtpZihpIT09LTEmJmwrMT09PWUubGVuZ3RoKXt2YXIgYz1lLnN1YnN0cigwLGkpLGg9ZS5zdWJzdHIoaSsxLGwtKGkrMSkpLnNwbGl0KCIsIiksZj0xO3N3aXRjaChjKXtjYXNlInJnYmEiOmlmKDQhPT1oLmxlbmd0aClyZXR1cm4gbnVsbDtmPW8oaC5wb3AoKSk7Y2FzZSJyZ2IiOnJldHVybiAzIT09aC5sZW5ndGg/bnVsbDpbYShoWzBdKSxhKGhbMV0pLGEoaFsyXSksZl07Y2FzZSJoc2xhIjppZig0IT09aC5sZW5ndGgpcmV0dXJuIG51bGw7Zj1vKGgucG9wKCkpO2Nhc2UiaHNsIjppZigzIT09aC5sZW5ndGgpcmV0dXJuIG51bGw7dmFyIGQ9KHBhcnNlRmxvYXQoaFswXSklMzYwKzM2MCklMzYwLzM2MCxwPW8oaFsxXSksZz1vKGhbMl0pLG09Zzw9LjU/ZyoocCsxKTpnK3AtZypwLHY9MipnLW07cmV0dXJuW24oMjU1KnModixtLGQrMS8zKSksbigyNTUqcyh2LG0sZCkpLG4oMjU1KnModixtLGQtMS8zKSksZl07ZGVmYXVsdDpyZXR1cm4gbnVsbH19cmV0dXJuIG51bGx9dmFyIHU9e3RyYW5zcGFyZW50OlswLDAsMCwwXSxhbGljZWJsdWU6WzI0MCwyNDgsMjU1LDFdLGFudGlxdWV3aGl0ZTpbMjUwLDIzNSwyMTUsMV0sYXF1YTpbMCwyNTUsMjU1LDFdLGFxdWFtYXJpbmU6WzEyNywyNTUsMjEyLDFdLGF6dXJlOlsyNDAsMjU1LDI1NSwxXSxiZWlnZTpbMjQ1LDI0NSwyMjAsMV0sYmlzcXVlOlsyNTUsMjI4LDE5NiwxXSxibGFjazpbMCwwLDAsMV0sYmxhbmNoZWRhbG1vbmQ6WzI1NSwyMzUsMjA1LDFdLGJsdWU6WzAsMCwyNTUsMV0sYmx1ZXZpb2xldDpbMTM4LDQzLDIyNiwxXSxicm93bjpbMTY1LDQyLDQyLDFdLGJ1cmx5d29vZDpbMjIyLDE4NCwxMzUsMV0sY2FkZXRibHVlOls5NSwxNTgsMTYwLDFdLGNoYXJ0cmV1c2U6WzEyNywyNTUsMCwxXSxjaG9jb2xhdGU6WzIxMCwxMDUsMzAsMV0sY29yYWw6WzI1NSwxMjcsODAsMV0sY29ybmZsb3dlcmJsdWU6WzEwMCwxNDksMjM3LDFdLGNvcm5zaWxrOlsyNTUsMjQ4LDIyMCwxXSxjcmltc29uOlsyMjAsMjAsNjAsMV0sY3lhbjpbMCwyNTUsMjU1LDFdLGRhcmtibHVlOlswLDAsMTM5LDFdLGRhcmtjeWFuOlswLDEzOSwxMzksMV0sZGFya2dvbGRlbnJvZDpbMTg0LDEzNCwxMSwxXSxkYXJrZ3JheTpbMTY5LDE2OSwxNjksMV0sZGFya2dyZWVuOlswLDEwMCwwLDFdLGRhcmtncmV5OlsxNjksMTY5LDE2OSwxXSxkYXJra2hha2k6WzE4OSwxODMsMTA3LDFdLGRhcmttYWdlbnRhOlsxMzksMCwxMzksMV0sZGFya29saXZlZ3JlZW46Wzg1LDEwNyw0NywxXSxkYXJrb3JhbmdlOlsyNTUsMTQwLDAsMV0sZGFya29yY2hpZDpbMTUzLDUwLDIwNCwxXSxkYXJrcmVkOlsxMzksMCwwLDFdLGRhcmtzYWxtb246WzIzMywxNTAsMTIyLDFdLGRhcmtzZWFncmVlbjpbMTQzLDE4OCwxNDMsMV0sZGFya3NsYXRlYmx1ZTpbNzIsNjEsMTM5LDFdLGRhcmtzbGF0ZWdyYXk6WzQ3LDc5LDc5LDFdLGRhcmtzbGF0ZWdyZXk6WzQ3LDc5LDc5LDFdLGRhcmt0dXJxdW9pc2U6WzAsMjA2LDIwOSwxXSxkYXJrdmlvbGV0OlsxNDgsMCwyMTEsMV0sZGVlcHBpbms6WzI1NSwyMCwxNDcsMV0sZGVlcHNreWJsdWU6WzAsMTkxLDI1NSwxXSxkaW1ncmF5OlsxMDUsMTA1LDEwNSwxXSxkaW1ncmV5OlsxMDUsMTA1LDEwNSwxXSxkb2RnZXJibHVlOlszMCwxNDQsMjU1LDFdLGZpcmVicmljazpbMTc4LDM0LDM0LDFdLGZsb3JhbHdoaXRlOlsyNTUsMjUwLDI0MCwxXSxmb3Jlc3RncmVlbjpbMzQsMTM5LDM0LDFdLGZ1Y2hzaWE6WzI1NSwwLDI1NSwxXSxnYWluc2Jvcm86WzIyMCwyMjAsMjIwLDFdLGdob3N0d2hpdGU6WzI0OCwyNDgsMjU1LDFdLGdvbGQ6WzI1NSwyMTUsMCwxXSxnb2xkZW5yb2Q6WzIxOCwxNjUsMzIsMV0sZ3JheTpbMTI4LDEyOCwxMjgsMV0sZ3JlZW46WzAsMTI4LDAsMV0sZ3JlZW55ZWxsb3c6WzE3MywyNTUsNDcsMV0sZ3JleTpbMTI4LDEyOCwxMjgsMV0saG9uZXlkZXc6WzI0MCwyNTUsMjQwLDFdLGhvdHBpbms6WzI1NSwxMDUsMTgwLDFdLGluZGlhbnJlZDpbMjA1LDkyLDkyLDFdLGluZGlnbzpbNzUsMCwxMzAsMV0saXZvcnk6WzI1NSwyNTUsMjQwLDFdLGtoYWtpOlsyNDAsMjMwLDE0MCwxXSxsYXZlbmRlcjpbMjMwLDIzMCwyNTAsMV0sbGF2ZW5kZXJibHVzaDpbMjU1LDI0MCwyNDUsMV0sbGF3bmdyZWVuOlsxMjQsMjUyLDAsMV0sbGVtb25jaGlmZm9uOlsyNTUsMjUwLDIwNSwxXSxsaWdodGJsdWU6WzE3MywyMTYsMjMwLDFdLGxpZ2h0Y29yYWw6WzI0MCwxMjgsMTI4LDFdLGxpZ2h0Y3lhbjpbMjI0LDI1NSwyNTUsMV0sbGlnaHRnb2xkZW5yb2R5ZWxsb3c6WzI1MCwyNTAsMjEwLDFdLGxpZ2h0Z3JheTpbMjExLDIxMSwyMTEsMV0sbGlnaHRncmVlbjpbMTQ0LDIzOCwxNDQsMV0sbGlnaHRncmV5OlsyMTEsMjExLDIxMSwxXSxsaWdodHBpbms6WzI1NSwxODIsMTkzLDFdLGxpZ2h0c2FsbW9uOlsyNTUsMTYwLDEyMiwxXSxsaWdodHNlYWdyZWVuOlszMiwxNzgsMTcwLDFdLGxpZ2h0c2t5Ymx1ZTpbMTM1LDIwNiwyNTAsMV0sbGlnaHRzbGF0ZWdyYXk6WzExOSwxMzYsMTUzLDFdLGxpZ2h0c2xhdGVncmV5OlsxMTksMTM2LDE1MywxXSxsaWdodHN0ZWVsYmx1ZTpbMTc2LDE5NiwyMjIsMV0sbGlnaHR5ZWxsb3c6WzI1NSwyNTUsMjI0LDFdLGxpbWU6WzAsMjU1LDAsMV0sbGltZWdyZWVuOls1MCwyMDUsNTAsMV0sbGluZW46WzI1MCwyNDAsMjMwLDFdLG1hZ2VudGE6WzI1NSwwLDI1NSwxXSxtYXJvb246WzEyOCwwLDAsMV0sbWVkaXVtYXF1YW1hcmluZTpbMTAyLDIwNSwxNzAsMV0sbWVkaXVtYmx1ZTpbMCwwLDIwNSwxXSxtZWRpdW1vcmNoaWQ6WzE4Niw4NSwyMTEsMV0sbWVkaXVtcHVycGxlOlsxNDcsMTEyLDIxOSwxXSxtZWRpdW1zZWFncmVlbjpbNjAsMTc5LDExMywxXSxtZWRpdW1zbGF0ZWJsdWU6WzEyMywxMDQsMjM4LDFdLG1lZGl1bXNwcmluZ2dyZWVuOlswLDI1MCwxNTQsMV0sbWVkaXVtdHVycXVvaXNlOls3MiwyMDksMjA0LDFdLG1lZGl1bXZpb2xldHJlZDpbMTk5LDIxLDEzMywxXSxtaWRuaWdodGJsdWU6WzI1LDI1LDExMiwxXSxtaW50Y3JlYW06WzI0NSwyNTUsMjUwLDFdLG1pc3R5cm9zZTpbMjU1LDIyOCwyMjUsMV0sbW9jY2FzaW46WzI1NSwyMjgsMTgxLDFdLG5hdmFqb3doaXRlOlsyNTUsMjIyLDE3MywxXSxuYXZ5OlswLDAsMTI4LDFdLG9sZGxhY2U6WzI1MywyNDUsMjMwLDFdLG9saXZlOlsxMjgsMTI4LDAsMV0sb2xpdmVkcmFiOlsxMDcsMTQyLDM1LDFdLG9yYW5nZTpbMjU1LDE2NSwwLDFdLG9yYW5nZXJlZDpbMjU1LDY5LDAsMV0sb3JjaGlkOlsyMTgsMTEyLDIxNCwxXSxwYWxlZ29sZGVucm9kOlsyMzgsMjMyLDE3MCwxXSxwYWxlZ3JlZW46WzE1MiwyNTEsMTUyLDFdLHBhbGV0dXJxdW9pc2U6WzE3NSwyMzgsMjM4LDFdLHBhbGV2aW9sZXRyZWQ6WzIxOSwxMTIsMTQ3LDFdLHBhcGF5YXdoaXA6WzI1NSwyMzksMjEzLDFdLHBlYWNocHVmZjpbMjU1LDIxOCwxODUsMV0scGVydTpbMjA1LDEzMyw2MywxXSxwaW5rOlsyNTUsMTkyLDIwMywxXSxwbHVtOlsyMjEsMTYwLDIyMSwxXSxwb3dkZXJibHVlOlsxNzYsMjI0LDIzMCwxXSxwdXJwbGU6WzEyOCwwLDEyOCwxXSxyZWJlY2NhcHVycGxlOlsxMDIsNTEsMTUzLDFdLHJlZDpbMjU1LDAsMCwxXSxyb3N5YnJvd246WzE4OCwxNDMsMTQzLDFdLHJveWFsYmx1ZTpbNjUsMTA1LDIyNSwxXSxzYWRkbGVicm93bjpbMTM5LDY5LDE5LDFdLHNhbG1vbjpbMjUwLDEyOCwxMTQsMV0sc2FuZHlicm93bjpbMjQ0LDE2NCw5NiwxXSxzZWFncmVlbjpbNDYsMTM5LDg3LDFdLHNlYXNoZWxsOlsyNTUsMjQ1LDIzOCwxXSxzaWVubmE6WzE2MCw4Miw0NSwxXSxzaWx2ZXI6WzE5MiwxOTIsMTkyLDFdLHNreWJsdWU6WzEzNSwyMDYsMjM1LDFdLHNsYXRlYmx1ZTpbMTA2LDkwLDIwNSwxXSxzbGF0ZWdyYXk6WzExMiwxMjgsMTQ0LDFdLHNsYXRlZ3JleTpbMTEyLDEyOCwxNDQsMV0sc25vdzpbMjU1LDI1MCwyNTAsMV0sc3ByaW5nZ3JlZW46WzAsMjU1LDEyNywxXSxzdGVlbGJsdWU6WzcwLDEzMCwxODAsMV0sdGFuOlsyMTAsMTgwLDE0MCwxXSx0ZWFsOlswLDEyOCwxMjgsMV0sdGhpc3RsZTpbMjE2LDE5MSwyMTYsMV0sdG9tYXRvOlsyNTUsOTksNzEsMV0sdHVycXVvaXNlOls2NCwyMjQsMjA4LDFdLHZpb2xldDpbMjM4LDEzMCwyMzgsMV0sd2hlYXQ6WzI0NSwyMjIsMTc5LDFdLHdoaXRlOlsyNTUsMjU1LDI1NSwxXSx3aGl0ZXNtb2tlOlsyNDUsMjQ1LDI0NSwxXSx5ZWxsb3c6WzI1NSwyNTUsMCwxXSx5ZWxsb3dncmVlbjpbMTU0LDIwNSw1MCwxXX07dHJ5e3IucGFyc2VDU1NDb2xvcj1sfWNhdGNoKHQpe319LHt9XSw5MDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyLG4saSxhKXt2YXIgbz02KmkqaS02Kmkscz0zKmkqaS00KmkrMSxsPS02KmkqaSs2KmksdT0zKmkqaS0yKmk7aWYodC5sZW5ndGgpe2F8fChhPW5ldyBBcnJheSh0Lmxlbmd0aCkpO2Zvcih2YXIgYz10Lmxlbmd0aC0xO2M+PTA7LS1jKWFbY109byp0W2NdK3MqZVtjXStsKnJbY10rdSpuW2NdO3JldHVybiBhfXJldHVybiBvKnQrcyplK2wqcltjXSt1Km59ZnVuY3Rpb24gaSh0LGUscixuLGksYSl7dmFyIG89aS0xLHM9aSppLGw9bypvLHU9KDErMippKSpsLGM9aSpsLGg9cyooMy0yKmkpLGY9cypvO2lmKHQubGVuZ3RoKXthfHwoYT1uZXcgQXJyYXkodC5sZW5ndGgpKTtmb3IodmFyIGQ9dC5sZW5ndGgtMTtkPj0wOy0tZClhW2RdPXUqdFtkXStjKmVbZF0raCpyW2RdK2YqbltkXTtyZXR1cm4gYX1yZXR1cm4gdSp0K2MqZStoKnIrZipufWUuZXhwb3J0cz1pLGUuZXhwb3J0cy5kZXJpdmF0aXZlPW59LHt9XSw5MTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKCl7dGhpcy5hcmdUeXBlcz1bXSx0aGlzLnNoaW1BcmdzPVtdLHRoaXMuYXJyYXlBcmdzPVtdLHRoaXMuYXJyYXlCbG9ja0luZGljZXM9W10sdGhpcy5zY2FsYXJBcmdzPVtdLHRoaXMub2Zmc2V0QXJncz1bXSx0aGlzLm9mZnNldEFyZ0luZGV4PVtdLHRoaXMuaW5kZXhBcmdzPVtdLHRoaXMuc2hhcGVBcmdzPVtdLHRoaXMuZnVuY05hbWU9IiIsdGhpcy5wcmU9bnVsbCx0aGlzLmJvZHk9bnVsbCx0aGlzLnBvc3Q9bnVsbCx0aGlzLmRlYnVnPSExfWZ1bmN0aW9uIGkodCl7dmFyIGU9bmV3IG47ZS5wcmU9dC5wcmUsZS5ib2R5PXQuYm9keSxlLnBvc3Q9dC5wb3N0O3ZhciByPXQuYXJncy5zbGljZSgwKTtlLmFyZ1R5cGVzPXI7Zm9yKHZhciBpPTA7aTxyLmxlbmd0aDsrK2kpe3ZhciBvPXJbaV07aWYoImFycmF5Ij09PW98fCJvYmplY3QiPT10eXBlb2YgbyYmby5ibG9ja0luZGljZXMpe2lmKGUuYXJnVHlwZXNbaV09ImFycmF5IixlLmFycmF5QXJncy5wdXNoKGkpLGUuYXJyYXlCbG9ja0luZGljZXMucHVzaChvLmJsb2NrSW5kaWNlcz9vLmJsb2NrSW5kaWNlczowKSxlLnNoaW1BcmdzLnB1c2goImFycmF5IitpKSxpPGUucHJlLmFyZ3MubGVuZ3RoJiZlLnByZS5hcmdzW2ldLmNvdW50PjApdGhyb3cgbmV3IEVycm9yKCJjd2lzZTogcHJlKCkgYmxvY2sgbWF5IG5vdCByZWZlcmVuY2UgYXJyYXkgYXJncyIpO2lmKGk8ZS5wb3N0LmFyZ3MubGVuZ3RoJiZlLnBvc3QuYXJnc1tpXS5jb3VudD4wKXRocm93IG5ldyBFcnJvcigiY3dpc2U6IHBvc3QoKSBibG9jayBtYXkgbm90IHJlZmVyZW5jZSBhcnJheSBhcmdzIil9ZWxzZSBpZigic2NhbGFyIj09PW8pZS5zY2FsYXJBcmdzLnB1c2goaSksZS5zaGltQXJncy5wdXNoKCJzY2FsYXIiK2kpO2Vsc2UgaWYoImluZGV4Ij09PW8pe2lmKGUuaW5kZXhBcmdzLnB1c2goaSksaTxlLnByZS5hcmdzLmxlbmd0aCYmZS5wcmUuYXJnc1tpXS5jb3VudD4wKXRocm93IG5ldyBFcnJvcigiY3dpc2U6IHByZSgpIGJsb2NrIG1heSBub3QgcmVmZXJlbmNlIGFycmF5IGluZGV4Iik7aWYoaTxlLmJvZHkuYXJncy5sZW5ndGgmJmUuYm9keS5hcmdzW2ldLmx2YWx1ZSl0aHJvdyBuZXcgRXJyb3IoImN3aXNlOiBib2R5KCkgYmxvY2sgbWF5IG5vdCB3cml0ZSB0byBhcnJheSBpbmRleCIpO2lmKGk8ZS5wb3N0LmFyZ3MubGVuZ3RoJiZlLnBvc3QuYXJnc1tpXS5jb3VudD4wKXRocm93IG5ldyBFcnJvcigiY3dpc2U6IHBvc3QoKSBibG9jayBtYXkgbm90IHJlZmVyZW5jZSBhcnJheSBpbmRleCIpfWVsc2UgaWYoInNoYXBlIj09PW8pe2lmKGUuc2hhcGVBcmdzLnB1c2goaSksaTxlLnByZS5hcmdzLmxlbmd0aCYmZS5wcmUuYXJnc1tpXS5sdmFsdWUpdGhyb3cgbmV3IEVycm9yKCJjd2lzZTogcHJlKCkgYmxvY2sgbWF5IG5vdCB3cml0ZSB0byBhcnJheSBzaGFwZSIpO2lmKGk8ZS5ib2R5LmFyZ3MubGVuZ3RoJiZlLmJvZHkuYXJnc1tpXS5sdmFsdWUpdGhyb3cgbmV3IEVycm9yKCJjd2lzZTogYm9keSgpIGJsb2NrIG1heSBub3Qgd3JpdGUgdG8gYXJyYXkgc2hhcGUiKTtpZihpPGUucG9zdC5hcmdzLmxlbmd0aCYmZS5wb3N0LmFyZ3NbaV0ubHZhbHVlKXRocm93IG5ldyBFcnJvcigiY3dpc2U6IHBvc3QoKSBibG9jayBtYXkgbm90IHdyaXRlIHRvIGFycmF5IHNoYXBlIil9ZWxzZXtpZigib2JqZWN0IiE9dHlwZW9mIG98fCFvLm9mZnNldCl0aHJvdyBuZXcgRXJyb3IoImN3aXNlOiBVbmtub3duIGFyZ3VtZW50IHR5cGUgIityW2ldKTtlLmFyZ1R5cGVzW2ldPSJvZmZzZXQiLGUub2Zmc2V0QXJncy5wdXNoKHthcnJheTpvLmFycmF5LG9mZnNldDpvLm9mZnNldH0pLGUub2Zmc2V0QXJnSW5kZXgucHVzaChpKX19aWYoZS5hcnJheUFyZ3MubGVuZ3RoPD0wKXRocm93IG5ldyBFcnJvcigiY3dpc2U6IE5vIGFycmF5IGFyZ3VtZW50cyBzcGVjaWZpZWQiKTtpZihlLnByZS5hcmdzLmxlbmd0aD5yLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImN3aXNlOiBUb28gbWFueSBhcmd1bWVudHMgaW4gcHJlKCkgYmxvY2siKTtpZihlLmJvZHkuYXJncy5sZW5ndGg+ci5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJjd2lzZTogVG9vIG1hbnkgYXJndW1lbnRzIGluIGJvZHkoKSBibG9jayIpO2lmKGUucG9zdC5hcmdzLmxlbmd0aD5yLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImN3aXNlOiBUb28gbWFueSBhcmd1bWVudHMgaW4gcG9zdCgpIGJsb2NrIik7cmV0dXJuIGUuZGVidWc9ISF0LnByaW50Q29kZXx8ISF0LmRlYnVnLGUuZnVuY05hbWU9dC5mdW5jTmFtZXx8ImN3aXNlIixlLmJsb2NrU2l6ZT10LmJsb2NrU2l6ZXx8NjQsYShlKX12YXIgYT10KCIuL2xpYi90aHVuay5qcyIpO2UuZXhwb3J0cz1pfSx7Ii4vbGliL3RodW5rLmpzIjo5M31dLDkyOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIpe3ZhciBuLGksYT10Lmxlbmd0aCxvPWUuYXJyYXlBcmdzLmxlbmd0aCxzPWUuaW5kZXhBcmdzLmxlbmd0aD4wLGw9W10sdT1bXSxjPTAsaD0wO2ZvcihuPTA7bjxhOysrbil1LnB1c2goWyJpIixuLCI9MCJdLmpvaW4oIiIpKTtmb3IoaT0wO2k8bzsrK2kpZm9yKG49MDtuPGE7KytuKWg9YyxjPXRbbl0sMD09PW4/dS5wdXNoKFsiZCIsaSwicyIsbiwiPXQiLGksInAiLGNdLmpvaW4oIiIpKTp1LnB1c2goWyJkIixpLCJzIixuLCI9KHQiLGksInAiLGMsIi1zIixoLCIqdCIsaSwicCIsaCwiKSJdLmpvaW4oIiIpKTtmb3IobC5wdXNoKCJ2YXIgIit1LmpvaW4oIiwiKSksbj1hLTE7bj49MDstLW4pYz10W25dLGwucHVzaChbImZvcihpIixuLCI9MDtpIixuLCI8cyIsYywiOysraSIsbiwiKXsiXS5qb2luKCIiKSk7Zm9yKGwucHVzaChyKSxuPTA7bjxhOysrbil7Zm9yKGg9YyxjPXRbbl0saT0wO2k8bzsrK2kpbC5wdXNoKFsicCIsaSwiKz1kIixpLCJzIixuXS5qb2luKCIiKSk7cyYmKG4+MCYmbC5wdXNoKFsiaW5kZXhbIixoLCJdLT1zIixoXS5qb2luKCIiKSksbC5wdXNoKFsiKytpbmRleFsiLGMsIl0iXS5qb2luKCIiKSkpLGwucHVzaCgifSIpfXJldHVybiBsLmpvaW4oIlxuIil9ZnVuY3Rpb24gaSh0LGUscixpKXtmb3IodmFyIGE9ZS5sZW5ndGgsbz1yLmFycmF5QXJncy5sZW5ndGgscz1yLmJsb2NrU2l6ZSxsPXIuaW5kZXhBcmdzLmxlbmd0aD4wLHU9W10sYz0wO2M8bzsrK2MpdS5wdXNoKFsidmFyIG9mZnNldCIsYywiPXAiLGNdLmpvaW4oIiIpKTtmb3IodmFyIGM9dDtjPGE7KytjKXUucHVzaChbImZvcih2YXIgaiIrYysiPVNTWyIsZVtjXSwiXXwwO2oiLGMsIj4wOyl7Il0uam9pbigiIikpLHUucHVzaChbImlmKGoiLGMsIjwiLHMsIil7Il0uam9pbigiIikpLHUucHVzaChbInMiLGVbY10sIj1qIixjXS5qb2luKCIiKSksdS5wdXNoKFsiaiIsYywiPTAiXS5qb2luKCIiKSksdS5wdXNoKFsifWVsc2V7cyIsZVtjXSwiPSIsc10uam9pbigiIikpLHUucHVzaChbImoiLGMsIi09IixzLCJ9Il0uam9pbigiIikpLGwmJnUucHVzaChbImluZGV4WyIsZVtjXSwiXT1qIixjXS5qb2luKCIiKSk7Zm9yKHZhciBjPTA7YzxvOysrYyl7Zm9yKHZhciBoPVsib2Zmc2V0IitjXSxmPXQ7ZjxhOysrZiloLnB1c2goWyJqIixmLCIqdCIsYywicCIsZVtmXV0uam9pbigiIikpO3UucHVzaChbInAiLGMsIj0oIixoLmpvaW4oIisiKSwiKSJdLmpvaW4oIiIpKX11LnB1c2gobihlLHIsaSkpO2Zvcih2YXIgYz10O2M8YTsrK2MpdS5wdXNoKCJ9Iik7cmV0dXJuIHUuam9pbigiXG4iKX1mdW5jdGlvbiBhKHQpe2Zvcih2YXIgZT0wLHI9dFswXS5sZW5ndGg7ZTxyOyl7Zm9yKHZhciBuPTE7bjx0Lmxlbmd0aDsrK24paWYodFtuXVtlXSE9PXRbMF1bZV0pcmV0dXJuIGU7KytlfXJldHVybiBlfWZ1bmN0aW9uIG8odCxlLHIpe2Zvcih2YXIgbj10LmJvZHksaT1bXSxhPVtdLG89MDtvPHQuYXJncy5sZW5ndGg7KytvKXt2YXIgcz10LmFyZ3Nbb107aWYoIShzLmNvdW50PD0wKSl7dmFyIGw9bmV3IFJlZ0V4cChzLm5hbWUsImciKSx1PSIiLGM9ZS5hcnJheUFyZ3MuaW5kZXhPZihvKTtzd2l0Y2goZS5hcmdUeXBlc1tvXSl7Y2FzZSJvZmZzZXQiOnZhciBoPWUub2Zmc2V0QXJnSW5kZXguaW5kZXhPZihvKSxmPWUub2Zmc2V0QXJnc1toXTtjPWYuYXJyYXksdT0iK3EiK2g7Y2FzZSJhcnJheSI6dT0icCIrYyt1O3ZhciBkPSJsIitvLHA9ImEiK2M7aWYoMD09PWUuYXJyYXlCbG9ja0luZGljZXNbY10pMT09PXMuY291bnQ/ImdlbmVyaWMiPT09cltjXT9zLmx2YWx1ZT8oaS5wdXNoKFsidmFyICIsZCwiPSIscCwiLmdldCgiLHUsIikiXS5qb2luKCIiKSksbj1uLnJlcGxhY2UobCxkKSxhLnB1c2goW3AsIi5zZXQoIix1LCIsIixkLCIpIl0uam9pbigiIikpKTpuPW4ucmVwbGFjZShsLFtwLCIuZ2V0KCIsdSwiKSJdLmpvaW4oIiIpKTpuPW4ucmVwbGFjZShsLFtwLCJbIix1LCJdIl0uam9pbigiIikpOiJnZW5lcmljIj09PXJbY10/KGkucHVzaChbInZhciAiLGQsIj0iLHAsIi5nZXQoIix1LCIpIl0uam9pbigiIikpLG49bi5yZXBsYWNlKGwsZCkscy5sdmFsdWUmJmEucHVzaChbcCwiLnNldCgiLHUsIiwiLGQsIikiXS5qb2luKCIiKSkpOihpLnB1c2goWyJ2YXIgIixkLCI9IixwLCJbIix1LCJdIl0uam9pbigiIikpLG49bi5yZXBsYWNlKGwsZCkscy5sdmFsdWUmJmEucHVzaChbcCwiWyIsdSwiXT0iLGRdLmpvaW4oIiIpKSk7ZWxzZXtmb3IodmFyIGc9W3MubmFtZV0sbT1bdV0sdj0wO3Y8TWF0aC5hYnMoZS5hcnJheUJsb2NrSW5kaWNlc1tjXSk7disrKWcucHVzaCgiXFxzKlxcWyhbXlxcXV0rKVxcXSIpLG0ucHVzaCgiJCIrKHYrMSkrIip0IitjKyJiIit2KTtpZihsPW5ldyBSZWdFeHAoZy5qb2luKCIiKSwiZyIpLHU9bS5qb2luKCIrIiksImdlbmVyaWMiPT09cltjXSl0aHJvdyBuZXcgRXJyb3IoImN3aXNlOiBHZW5lcmljIGFycmF5cyBub3Qgc3VwcG9ydGVkIGluIGNvbWJpbmF0aW9uIHdpdGggYmxvY2tzISIpO249bi5yZXBsYWNlKGwsW3AsIlsiLHUsIl0iXS5qb2luKCIiKSl9YnJlYWs7Y2FzZSJzY2FsYXIiOm49bi5yZXBsYWNlKGwsIlkiK2Uuc2NhbGFyQXJncy5pbmRleE9mKG8pKTticmVhaztjYXNlImluZGV4IjpuPW4ucmVwbGFjZShsLCJpbmRleCIpO2JyZWFrO2Nhc2Uic2hhcGUiOm49bi5yZXBsYWNlKGwsInNoYXBlIil9fX1yZXR1cm5baS5qb2luKCJcbiIpLG4sYS5qb2luKCJcbiIpXS5qb2luKCJcbiIpLnRyaW0oKX1mdW5jdGlvbiBzKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodC5sZW5ndGgpLHI9ITAsbj0wO248dC5sZW5ndGg7KytuKXt2YXIgaT10W25dLGE9aS5tYXRjaCgvXGQrLyk7YT1hP2FbMF06IiIsMD09PWkuY2hhckF0KDApP2Vbbl09InUiK2kuY2hhckF0KDEpK2E6ZVtuXT1pLmNoYXJBdCgwKSthLG4+MCYmKHI9ciYmZVtuXT09PWVbbi0xXSl9cmV0dXJuIHI/ZVswXTplLmpvaW4oIiIpfWZ1bmN0aW9uIGwodCxlKXtmb3IodmFyIHI9ZVsxXS5sZW5ndGgtTWF0aC5hYnModC5hcnJheUJsb2NrSW5kaWNlc1swXSl8MCxsPW5ldyBBcnJheSh0LmFycmF5QXJncy5sZW5ndGgpLGM9bmV3IEFycmF5KHQuYXJyYXlBcmdzLmxlbmd0aCksaD0wO2g8dC5hcnJheUFyZ3MubGVuZ3RoOysraCljW2hdPWVbMipoXSxsW2hdPWVbMipoKzFdO2Zvcih2YXIgZj1bXSxkPVtdLHA9W10sZz1bXSxtPVtdLGg9MDtoPHQuYXJyYXlBcmdzLmxlbmd0aDsrK2gpe3QuYXJyYXlCbG9ja0luZGljZXNbaF08MD8ocC5wdXNoKDApLGcucHVzaChyKSxmLnB1c2gociksZC5wdXNoKHIrdC5hcnJheUJsb2NrSW5kaWNlc1toXSkpOihwLnB1c2godC5hcnJheUJsb2NrSW5kaWNlc1toXSksZy5wdXNoKHQuYXJyYXlCbG9ja0luZGljZXNbaF0rciksZi5wdXNoKDApLGQucHVzaCh0LmFycmF5QmxvY2tJbmRpY2VzW2hdKSk7Zm9yKHZhciB2PVtdLHk9MDt5PGxbaF0ubGVuZ3RoO3krKylwW2hdPD1sW2hdW3ldJiZsW2hdW3ldPGdbaF0mJnYucHVzaChsW2hdW3ldLXBbaF0pO20ucHVzaCh2KX1mb3IodmFyIHg9WyJTUyJdLGI9WyIndXNlIHN0cmljdCciXSxfPVtdLHk9MDt5PHI7Kyt5KV8ucHVzaChbInMiLHksIj1TU1siLHksIl0iXS5qb2luKCIiKSk7Zm9yKHZhciBoPTA7aDx0LmFycmF5QXJncy5sZW5ndGg7KytoKXt4LnB1c2goImEiK2gpLHgucHVzaCgidCIraCkseC5wdXNoKCJwIitoKTtmb3IodmFyIHk9MDt5PHI7Kyt5KV8ucHVzaChbInQiLGgsInAiLHksIj10IixoLCJbIixwW2hdK3ksIl0iXS5qb2luKCIiKSk7Zm9yKHZhciB5PTA7eTxNYXRoLmFicyh0LmFycmF5QmxvY2tJbmRpY2VzW2hdKTsrK3kpXy5wdXNoKFsidCIsaCwiYiIseSwiPXQiLGgsIlsiLGZbaF0reSwiXSJdLmpvaW4oIiIpKX1mb3IodmFyIGg9MDtoPHQuc2NhbGFyQXJncy5sZW5ndGg7KytoKXgucHVzaCgiWSIraCk7aWYodC5zaGFwZUFyZ3MubGVuZ3RoPjAmJl8ucHVzaCgic2hhcGU9U1Muc2xpY2UoMCkiKSx0LmluZGV4QXJncy5sZW5ndGg+MCl7Zm9yKHZhciB3PW5ldyBBcnJheShyKSxoPTA7aDxyOysraCl3W2hdPSIwIjtfLnB1c2goWyJpbmRleD1bIix3LmpvaW4oIiwiKSwiXSJdLmpvaW4oIiIpKX1mb3IodmFyIGg9MDtoPHQub2Zmc2V0QXJncy5sZW5ndGg7KytoKXtmb3IodmFyIE09dC5vZmZzZXRBcmdzW2hdLEE9W10seT0wO3k8TS5vZmZzZXQubGVuZ3RoOysreSkwIT09TS5vZmZzZXRbeV0mJigxPT09TS5vZmZzZXRbeV0/QS5wdXNoKFsidCIsTS5hcnJheSwicCIseV0uam9pbigiIikpOkEucHVzaChbTS5vZmZzZXRbeV0sIip0IixNLmFycmF5LCJwIix5XS5qb2luKCIiKSkpOzA9PT1BLmxlbmd0aD9fLnB1c2goInEiK2grIj0wIik6Xy5wdXNoKFsicSIsaCwiPSIsQS5qb2luKCIrIildLmpvaW4oIiIpKX12YXIgaz11KFtdLmNvbmNhdCh0LnByZS50aGlzVmFycykuY29uY2F0KHQuYm9keS50aGlzVmFycykuY29uY2F0KHQucG9zdC50aGlzVmFycykpO189Xy5jb25jYXQoayksYi5wdXNoKCJ2YXIgIitfLmpvaW4oIiwiKSk7Zm9yKHZhciBoPTA7aDx0LmFycmF5QXJncy5sZW5ndGg7KytoKWIucHVzaCgicCIraCsifD0wIik7dC5wcmUuYm9keS5sZW5ndGg+MyYmYi5wdXNoKG8odC5wcmUsdCxjKSk7dmFyIFQ9byh0LmJvZHksdCxjKSxFPWEobSk7RTxyP2IucHVzaChpKEUsbVswXSx0LFQpKTpiLnB1c2gobihtWzBdLHQsVCkpLHQucG9zdC5ib2R5Lmxlbmd0aD4zJiZiLnB1c2gobyh0LnBvc3QsdCxjKSksdC5kZWJ1ZyYmY29uc29sZS5sb2coIi0tLS0tR2VuZXJhdGVkIGN3aXNlIHJvdXRpbmUgZm9yICIsZSwiOlxuIitiLmpvaW4oIlxuIikrIlxuLS0tLS0tLS0tLSIpO3ZhciBTPVt0LmZ1bmNOYW1lfHwidW5uYW1lZCIsIl9jd2lzZV9sb29wXyIsbFswXS5qb2luKCJzIiksIm0iLEUscyhjKV0uam9pbigiIiksTD1uZXcgRnVuY3Rpb24oWyJmdW5jdGlvbiAiLFMsIigiLHguam9pbigiLCIpLCIpeyIsYi5qb2luKCJcbiIpLCJ9IHJldHVybiAiLFNdLmpvaW4oIiIpKTtyZXR1cm4gTCgpfXZhciB1PXQoInVuaXEiKTtlLmV4cG9ydHM9bH0se3VuaXE6NDk4fV0sOTM6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt2YXIgZT1bIid1c2Ugc3RyaWN0JyIsInZhciBDQUNIRUQ9e30iXSxyPVtdLG49dC5mdW5jTmFtZSsiX2N3aXNlX3RodW5rIjtlLnB1c2goWyJyZXR1cm4gZnVuY3Rpb24gIixuLCIoIix0LnNoaW1BcmdzLmpvaW4oIiwiKSwiKXsiXS5qb2luKCIiKSk7Zm9yKHZhciBhPVtdLG89W10scz1bWyJhcnJheSIsdC5hcnJheUFyZ3NbMF0sIi5zaGFwZS5zbGljZSgiLE1hdGgubWF4KDAsdC5hcnJheUJsb2NrSW5kaWNlc1swXSksdC5hcnJheUJsb2NrSW5kaWNlc1swXTwwPyIsIit0LmFycmF5QmxvY2tJbmRpY2VzWzBdKyIpIjoiKSJdLmpvaW4oIiIpXSxsPVtdLHU9W10sYz0wO2M8dC5hcnJheUFyZ3MubGVuZ3RoOysrYyl7dmFyIGg9dC5hcnJheUFyZ3NbY107ci5wdXNoKFsidCIsaCwiPWFycmF5IixoLCIuZHR5cGUsIiwiciIsaCwiPWFycmF5IixoLCIub3JkZXIiXS5qb2luKCIiKSksYS5wdXNoKCJ0IitoKSxhLnB1c2goInIiK2gpLG8ucHVzaCgidCIraCksby5wdXNoKCJyIitoKyIuam9pbigpIikscy5wdXNoKCJhcnJheSIraCsiLmRhdGEiKSxzLnB1c2goImFycmF5IitoKyIuc3RyaWRlIikscy5wdXNoKCJhcnJheSIraCsiLm9mZnNldHwwIiksYz4wJiYobC5wdXNoKCJhcnJheSIrdC5hcnJheUFyZ3NbMF0rIi5zaGFwZS5sZW5ndGg9PT1hcnJheSIraCsiLnNoYXBlLmxlbmd0aCsiKyhNYXRoLmFicyh0LmFycmF5QmxvY2tJbmRpY2VzWzBdKS1NYXRoLmFicyh0LmFycmF5QmxvY2tJbmRpY2VzW2NdKSkpLHUucHVzaCgiYXJyYXkiK3QuYXJyYXlBcmdzWzBdKyIuc2hhcGVbc2hhcGVJbmRleCsiK01hdGgubWF4KDAsdC5hcnJheUJsb2NrSW5kaWNlc1swXSkrIl09PT1hcnJheSIraCsiLnNoYXBlW3NoYXBlSW5kZXgrIitNYXRoLm1heCgwLHQuYXJyYXlCbG9ja0luZGljZXNbY10pKyJdIikpfXQuYXJyYXlBcmdzLmxlbmd0aD4xJiYoZS5wdXNoKCJpZiAoISgiK2wuam9pbigiICYmICIpKyIpKSB0aHJvdyBuZXcgRXJyb3IoJ2N3aXNlOiBBcnJheXMgZG8gbm90IGFsbCBoYXZlIHRoZSBzYW1lIGRpbWVuc2lvbmFsaXR5IScpIiksZS5wdXNoKCJmb3IodmFyIHNoYXBlSW5kZXg9YXJyYXkiK3QuYXJyYXlBcmdzWzBdKyIuc2hhcGUubGVuZ3RoLSIrTWF0aC5hYnModC5hcnJheUJsb2NrSW5kaWNlc1swXSkrIjsgc2hhcGVJbmRleC0tPjA7KSB7IiksZS5wdXNoKCJpZiAoISgiK3Uuam9pbigiICYmICIpKyIpKSB0aHJvdyBuZXcgRXJyb3IoJ2N3aXNlOiBBcnJheXMgZG8gbm90IGFsbCBoYXZlIHRoZSBzYW1lIHNoYXBlIScpIiksZS5wdXNoKCJ9IikpO2Zvcih2YXIgYz0wO2M8dC5zY2FsYXJBcmdzLmxlbmd0aDsrK2Mpcy5wdXNoKCJzY2FsYXIiK3Quc2NhbGFyQXJnc1tjXSk7ci5wdXNoKFsidHlwZT1bIixvLmpvaW4oIiwiKSwiXS5qb2luKCkiXS5qb2luKCIiKSksci5wdXNoKCJwcm9jPUNBQ0hFRFt0eXBlXSIpLGUucHVzaCgidmFyICIrci5qb2luKCIsIikpLGUucHVzaChbImlmKCFwcm9jKXsiLCJDQUNIRURbdHlwZV09cHJvYz1jb21waWxlKFsiLGEuam9pbigiLCIpLCJdKX0iLCJyZXR1cm4gcHJvYygiLHMuam9pbigiLCIpLCIpfSJdLmpvaW4oIiIpKSx0LmRlYnVnJiZjb25zb2xlLmxvZygiLS0tLS1HZW5lcmF0ZWQgdGh1bms6XG4iK2Uuam9pbigiXG4iKSsiXG4tLS0tLS0tLS0tIik7dmFyIGY9bmV3IEZ1bmN0aW9uKCJjb21waWxlIixlLmpvaW4oIlxuIikpO3JldHVybiBmKGkuYmluZCh2b2lkIDAsdCkpfXZhciBpPXQoIi4vY29tcGlsZS5qcyIpO2UuZXhwb3J0cz1ufSx7Ii4vY29tcGlsZS5qcyI6OTJ9XSw5NDpbZnVuY3Rpb24odCxlLHIpe2UuZXhwb3J0cz10KCJjd2lzZS1jb21waWxlciIpfSx7ImN3aXNlLWNvbXBpbGVyIjo5MX1dLDk1OltmdW5jdGlvbihlLHIsbil7IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdCYmKHQub3duZXJEb2N1bWVudHx8dC5kb2N1bWVudHx8dCkuZG9jdW1lbnRFbGVtZW50fWZ1bmN0aW9uIG4odCl7cmV0dXJuIHQmJih0Lm93bmVyRG9jdW1lbnQmJnQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8dC5kb2N1bWVudCYmdHx8dC5kZWZhdWx0Vmlldyl9ZnVuY3Rpb24gaSh0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6dD49ZT8wOk5hTn1mdW5jdGlvbiBhKHQpe3JldHVybiBudWxsPT09dD9OYU46K3R9ZnVuY3Rpb24gbyh0KXtyZXR1cm4haXNOYU4odCl9ZnVuY3Rpb24gcyh0KXtyZXR1cm57bGVmdDpmdW5jdGlvbihlLHIsbixpKXtmb3IoYXJndW1lbnRzLmxlbmd0aDwzJiYobj0wKSxhcmd1bWVudHMubGVuZ3RoPDQmJihpPWUubGVuZ3RoKTtuPGk7KXt2YXIgYT1uK2k+Pj4xO3QoZVthXSxyKTwwP249YSsxOmk9YX1yZXR1cm4gbn0scmlnaHQ6ZnVuY3Rpb24oZSxyLG4saSl7Zm9yKGFyZ3VtZW50cy5sZW5ndGg8MyYmKG49MCksYXJndW1lbnRzLmxlbmd0aDw0JiYoaT1lLmxlbmd0aCk7bjxpOyl7dmFyIGE9bitpPj4+MTt0KGVbYV0scik+MD9pPWE6bj1hKzF9cmV0dXJuIG59fX1mdW5jdGlvbiBsKHQpe3JldHVybiB0Lmxlbmd0aH1mdW5jdGlvbiB1KHQpe2Zvcih2YXIgZT0xO3QqZSUxOyllKj0xMDtyZXR1cm4gZX1mdW5jdGlvbiBjKHQsZSl7Zm9yKHZhciByIGluIGUpT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLHIse3ZhbHVlOmVbcl0sZW51bWVyYWJsZTohMX0pfWZ1bmN0aW9uIGgoKXt0aGlzLl89T2JqZWN0LmNyZWF0ZShudWxsKX1mdW5jdGlvbiBmKHQpe3JldHVybih0Kz0iIik9PT1fb3x8dFswXT09PXdvP3dvK3Q6dH1mdW5jdGlvbiBkKHQpe3JldHVybih0Kz0iIilbMF09PT13bz90LnNsaWNlKDEpOnR9ZnVuY3Rpb24gcCh0KXtyZXR1cm4gZih0KWluIHRoaXMuX31mdW5jdGlvbiBnKHQpe3JldHVybih0PWYodCkpaW4gdGhpcy5fJiZkZWxldGUgdGhpcy5fW3RdfWZ1bmN0aW9uIG0oKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gdGhpcy5fKXQucHVzaChkKGUpKTtyZXR1cm4gdH1mdW5jdGlvbiB2KCl7dmFyIHQ9MDtmb3IodmFyIGUgaW4gdGhpcy5fKSsrdDtyZXR1cm4gdH1mdW5jdGlvbiB5KCl7Zm9yKHZhciB0IGluIHRoaXMuXylyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiB4KCl7dGhpcy5fPU9iamVjdC5jcmVhdGUobnVsbCl9ZnVuY3Rpb24gYih0KXtyZXR1cm4gdH1mdW5jdGlvbiBfKHQsZSxyKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1yLmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gbj09PWU/dDpufX1mdW5jdGlvbiB3KHQsZSl7aWYoZSBpbiB0KXJldHVybiBlO2U9ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnNsaWNlKDEpO2Zvcih2YXIgcj0wLG49TW8ubGVuZ3RoO3I8bjsrK3Ipe3ZhciBpPU1vW3JdK2U7aWYoaSBpbiB0KXJldHVybiBpfX1mdW5jdGlvbiBNKCl7fWZ1bmN0aW9uIEEoKXt9ZnVuY3Rpb24gayh0KXtmdW5jdGlvbiBlKCl7Zm9yKHZhciBlLG49cixpPS0xLGE9bi5sZW5ndGg7KytpPGE7KShlPW5baV0ub24pJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gdH12YXIgcj1bXSxuPW5ldyBoO3JldHVybiBlLm9uPWZ1bmN0aW9uKGUsaSl7dmFyIGEsbz1uLmdldChlKTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP28mJm8ub246KG8mJihvLm9uPW51bGwscj1yLnNsaWNlKDAsYT1yLmluZGV4T2YobykpLmNvbmNhdChyLnNsaWNlKGErMSkpLG4ucmVtb3ZlKGUpKSxpJiZyLnB1c2gobi5zZXQoZSx7b246aX0pKSx0KX0sZX1mdW5jdGlvbiBUKCl7dW8uZXZlbnQucHJldmVudERlZmF1bHQoKX1mdW5jdGlvbiBFKCl7Zm9yKHZhciB0LGU9dW8uZXZlbnQ7dD1lLnNvdXJjZUV2ZW50OyllPXQ7cmV0dXJuIGV9ZnVuY3Rpb24gUyh0KXtmb3IodmFyIGU9bmV3IEEscj0wLG49YXJndW1lbnRzLmxlbmd0aDsrK3I8bjspZVthcmd1bWVudHNbcl1dPWsoZSk7cmV0dXJuIGUub2Y9ZnVuY3Rpb24ocixuKXtyZXR1cm4gZnVuY3Rpb24oaSl7dHJ5e3ZhciBhPWkuc291cmNlRXZlbnQ9dW8uZXZlbnQ7aS50YXJnZXQ9dCx1by5ldmVudD1pLGVbaS50eXBlXS5hcHBseShyLG4pfWZpbmFsbHl7dW8uZXZlbnQ9YX19fSxlfWZ1bmN0aW9uIEwodCl7cmV0dXJuIGtvKHQsTG8pLHR9ZnVuY3Rpb24geih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90OmZ1bmN0aW9uKCl7cmV0dXJuIFRvKHQsdGhpcyl9fWZ1bmN0aW9uIEModCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmdW5jdGlvbigpe3JldHVybiBFbyh0LHRoaXMpfX1mdW5jdGlvbiBJKHQsZSl7ZnVuY3Rpb24gcigpe3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfWZ1bmN0aW9uIG4oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9ZnVuY3Rpb24gaSgpe3RoaXMuc2V0QXR0cmlidXRlKHQsZSl9ZnVuY3Rpb24gYSgpe3RoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLGUpfWZ1bmN0aW9uIG8oKXt2YXIgcj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1yP3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpOnRoaXMuc2V0QXR0cmlidXRlKHQscil9ZnVuY3Rpb24gcygpe3ZhciByPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PXI/dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpOnRoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLHIpfXJldHVybiB0PXVvLm5zLnF1YWxpZnkodCksbnVsbD09ZT90LmxvY2FsP246cjoiZnVuY3Rpb24iPT10eXBlb2YgZT90LmxvY2FsP3M6bzp0LmxvY2FsP2E6aX1mdW5jdGlvbiBQKHQpe3JldHVybiB0LnRyaW0oKS5yZXBsYWNlKC9ccysvZywiICIpfWZ1bmN0aW9uIEQodCl7cmV0dXJuIG5ldyBSZWdFeHAoIig/Ol58XFxzKykiK3VvLnJlcXVvdGUodCkrIig/Olxccyt8JCkiLCJnIil9ZnVuY3Rpb24gUih0KXtyZXR1cm4odCsiIikudHJpbSgpLnNwbGl0KC9efFxzKy8pfWZ1bmN0aW9uIE8odCxlKXtmdW5jdGlvbiByKCl7Zm9yKHZhciByPS0xOysrcjxpOyl0W3JdKHRoaXMsZSl9ZnVuY3Rpb24gbigpe2Zvcih2YXIgcj0tMSxuPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpOysrcjxpOyl0W3JdKHRoaXMsbil9dD1SKHQpLm1hcChGKTt2YXIgaT10Lmxlbmd0aDtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZT9uOnJ9ZnVuY3Rpb24gRih0KXt2YXIgZT1EKHQpO3JldHVybiBmdW5jdGlvbihyLG4pe2lmKGk9ci5jbGFzc0xpc3QpcmV0dXJuIG4/aS5hZGQodCk6aS5yZW1vdmUodCk7dmFyIGk9ci5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiO24/KGUubGFzdEluZGV4PTAsZS50ZXN0KGkpfHxyLnNldEF0dHJpYnV0ZSgiY2xhc3MiLFAoaSsiICIrdCkpKTpyLnNldEF0dHJpYnV0ZSgiY2xhc3MiLFAoaS5yZXBsYWNlKGUsIiAiKSkpfX1mdW5jdGlvbiBqKHQsZSxyKXtmdW5jdGlvbiBuKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KX1mdW5jdGlvbiBpKCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LGUscil9ZnVuY3Rpb24gYSgpe3ZhciBuPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PW4/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsbixyKX1yZXR1cm4gbnVsbD09ZT9uOiJmdW5jdGlvbiI9PXR5cGVvZiBlP2E6aX1mdW5jdGlvbiBOKHQsZSl7ZnVuY3Rpb24gcigpe2RlbGV0ZSB0aGlzW3RdfWZ1bmN0aW9uIG4oKXt0aGlzW3RdPWV9ZnVuY3Rpb24gaSgpe3ZhciByPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PXI/ZGVsZXRlIHRoaXNbdF06dGhpc1t0XT1yfXJldHVybiBudWxsPT1lP3I6ImZ1bmN0aW9uIj09dHlwZW9mIGU/aTpufWZ1bmN0aW9uIEIodCl7ZnVuY3Rpb24gZSgpe3ZhciBlPXRoaXMub3duZXJEb2N1bWVudCxyPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiByPT09em8mJmUuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSST09PXpvP2UuY3JlYXRlRWxlbWVudCh0KTplLmNyZWF0ZUVsZW1lbnROUyhyLHQpfWZ1bmN0aW9uIHIoKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0LnNwYWNlLHQubG9jYWwpfXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6KHQ9dW8ubnMucXVhbGlmeSh0KSkubG9jYWw/cjplfWZ1bmN0aW9uIFUoKXt2YXIgdD10aGlzLnBhcmVudE5vZGU7dCYmdC5yZW1vdmVDaGlsZCh0aGlzKX1mdW5jdGlvbiBWKHQpe3JldHVybntfX2RhdGFfXzp0fX1mdW5jdGlvbiBxKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBTbyh0aGlzLHQpfX1mdW5jdGlvbiBIKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RofHwodD1pKSxmdW5jdGlvbihlLHIpe3JldHVybiBlJiZyP3QoZS5fX2RhdGFfXyxyLl9fZGF0YV9fKTohZS0hcn19ZnVuY3Rpb24gRyh0LGUpe2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKylmb3IodmFyIGksYT10W3JdLG89MCxzPWEubGVuZ3RoO288cztvKyspKGk9YVtvXSkmJmUoaSxvLHIpO3JldHVybiB0fWZ1bmN0aW9uIFgodCl7cmV0dXJuIGtvKHQsSW8pLHR9ZnVuY3Rpb24gWSh0KXt2YXIgZSxyO3JldHVybiBmdW5jdGlvbihuLGksYSl7dmFyIG8scz10W2FdLnVwZGF0ZSxsPXMubGVuZ3RoO2ZvcihhIT1yJiYocj1hLGU9MCksaT49ZSYmKGU9aSsxKTshKG89c1tlXSkmJisrZTxsOyk7cmV0dXJuIG99fWZ1bmN0aW9uIFcodCxlLHIpe2Z1bmN0aW9uIG4oKXt2YXIgZT10aGlzW29dO2UmJih0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxlLGUuJCksZGVsZXRlIHRoaXNbb10pfWZ1bmN0aW9uIGkoKXt2YXIgaT1sKGUsaG8oYXJndW1lbnRzKSk7bi5jYWxsKHRoaXMpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcih0LHRoaXNbb109aSxpLiQ9ciksaS5fPWV9ZnVuY3Rpb24gYSgpe3ZhciBlLHI9bmV3IFJlZ0V4cCgiXl9fb24oW14uXSspIit1by5yZXF1b3RlKHQpKyIkIik7Zm9yKHZhciBuIGluIHRoaXMpaWYoZT1uLm1hdGNoKHIpKXt2YXIgaT10aGlzW25dO3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihlWzFdLGksaS4kKSxkZWxldGUgdGhpc1tuXX19dmFyIG89Il9fb24iK3Qscz10LmluZGV4T2YoIi4iKSxsPVo7cz4wJiYodD10LnNsaWNlKDAscykpO3ZhciB1PVBvLmdldCh0KTtyZXR1cm4gdSYmKHQ9dSxsPVEpLHM/ZT9pOm46ZT9NOmF9ZnVuY3Rpb24gWih0LGUpe3JldHVybiBmdW5jdGlvbihyKXt2YXIgbj11by5ldmVudDt1by5ldmVudD1yLGVbMF09dGhpcy5fX2RhdGFfXzt0cnl7dC5hcHBseSh0aGlzLGUpfWZpbmFsbHl7dW8uZXZlbnQ9bn19fWZ1bmN0aW9uIFEodCxlKXt2YXIgcj1aKHQsZSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10LnJlbGF0ZWRUYXJnZXQ7biYmKG49PT1lfHw4Jm4uY29tcGFyZURvY3VtZW50UG9zaXRpb24oZSkpfHxyLmNhbGwoZSx0KX19ZnVuY3Rpb24gSyh0KXt2YXIgcj0iLmRyYWdzdXBwcmVzcy0iKyArK1JvLGk9ImNsaWNrIityLGE9dW8uc2VsZWN0KG4odCkpLm9uKCJ0b3VjaG1vdmUiK3IsVCkub24oImRyYWdzdGFydCIrcixUKS5vbigic2VsZWN0c3RhcnQiK3IsVCk7aWYobnVsbD09RG8mJihEbz0hKCJvbnNlbGVjdHN0YXJ0ImluIHQpJiZ3KHQuc3R5bGUsInVzZXJTZWxlY3QiKSksRG8pe3ZhciBvPWUodCkuc3R5bGUscz1vW0RvXTtvW0RvXT0ibm9uZSJ9cmV0dXJuIGZ1bmN0aW9uKHQpe2lmKGEub24ocixudWxsKSxEbyYmKG9bRG9dPXMpLHQpe3ZhciBlPWZ1bmN0aW9uKCl7YS5vbihpLG51bGwpfTthLm9uKGksZnVuY3Rpb24oKXtUKCksZSgpfSwhMCksc2V0VGltZW91dChlLDApfX19ZnVuY3Rpb24gJCh0LGUpe2UuY2hhbmdlZFRvdWNoZXMmJihlPWUuY2hhbmdlZFRvdWNoZXNbMF0pO3ZhciByPXQub3duZXJTVkdFbGVtZW50fHx0O2lmKHIuY3JlYXRlU1ZHUG9pbnQpe3ZhciBpPXIuY3JlYXRlU1ZHUG9pbnQoKTtpZihPbzwwKXt2YXIgYT1uKHQpO2lmKGEuc2Nyb2xsWHx8YS5zY3JvbGxZKXtyPXVvLnNlbGVjdCgiYm9keSIpLmFwcGVuZCgic3ZnIikuc3R5bGUoe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjAsbGVmdDowLG1hcmdpbjowLHBhZGRpbmc6MCxib3JkZXI6Im5vbmUifSwiaW1wb3J0YW50Iik7dmFyIG89clswXVswXS5nZXRTY3JlZW5DVE0oKTtPbz0hKG8uZnx8by5lKSxyLnJlbW92ZSgpfX1yZXR1cm4gT28/KGkueD1lLnBhZ2VYLGkueT1lLnBhZ2VZKTooaS54PWUuY2xpZW50WCxpLnk9ZS5jbGllbnRZKSxpPWkubWF0cml4VHJhbnNmb3JtKHQuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKSxbaS54LGkueV19dmFyIHM9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm5bZS5jbGllbnRYLXMubGVmdC10LmNsaWVudExlZnQsZS5jbGllbnRZLXMudG9wLXQuY2xpZW50VG9wXX1mdW5jdGlvbiBKKCl7cmV0dXJuIHVvLmV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmlkZW50aWZpZXJ9ZnVuY3Rpb24gdHQodCl7cmV0dXJuIHQ+MD8xOnQ8MD8tMTowfWZ1bmN0aW9uIGV0KHQsZSxyKXtyZXR1cm4oZVswXS10WzBdKSooclsxXS10WzFdKS0oZVsxXS10WzFdKSooclswXS10WzBdKX1mdW5jdGlvbiBydCh0KXtyZXR1cm4gdD4xPzA6dDwtMT9ObzpNYXRoLmFjb3ModCl9ZnVuY3Rpb24gbnQodCl7cmV0dXJuIHQ+MT9Wbzp0PC0xPy1WbzpNYXRoLmFzaW4odCl9ZnVuY3Rpb24gaXQodCl7cmV0dXJuKCh0PU1hdGguZXhwKHQpKS0xL3QpLzJ9ZnVuY3Rpb24gYXQodCl7cmV0dXJuKCh0PU1hdGguZXhwKHQpKSsxL3QpLzJ9ZnVuY3Rpb24gb3QodCl7cmV0dXJuKCh0PU1hdGguZXhwKDIqdCkpLTEpLyh0KzEpfWZ1bmN0aW9uIHN0KHQpe3JldHVybih0PU1hdGguc2luKHQvMikpKnR9ZnVuY3Rpb24gbHQoKXt9ZnVuY3Rpb24gdXQodCxlLHIpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgdXQ/KHRoaXMuaD0rdCx0aGlzLnM9K2Usdm9pZCh0aGlzLmw9K3IpKTphcmd1bWVudHMubGVuZ3RoPDI/dCBpbnN0YW5jZW9mIHV0P25ldyB1dCh0LmgsdC5zLHQubCk6TXQoIiIrdCxBdCx1dCk6bmV3IHV0KHQsZSxyKX1mdW5jdGlvbiBjdCh0LGUscil7ZnVuY3Rpb24gbih0KXtyZXR1cm4gdD4zNjA/dC09MzYwOnQ8MCYmKHQrPTM2MCksdDw2MD9hKyhvLWEpKnQvNjA6dDwxODA/bzp0PDI0MD9hKyhvLWEpKigyNDAtdCkvNjA6YX1mdW5jdGlvbiBpKHQpe3JldHVybiBNYXRoLnJvdW5kKDI1NSpuKHQpKX12YXIgYSxvO3JldHVybiB0PWlzTmFOKHQpPzA6KHQlPTM2MCk8MD90KzM2MDp0LGU9aXNOYU4oZSk/MDplPDA/MDplPjE/MTplLHI9cjwwPzA6cj4xPzE6cixvPXI8PS41P3IqKDErZSk6citlLXIqZSxhPTIqci1vLG5ldyB4dChpKHQrMTIwKSxpKHQpLGkodC0xMjApKX1mdW5jdGlvbiBodCh0LGUscil7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBodD8odGhpcy5oPSt0LHRoaXMuYz0rZSx2b2lkKHRoaXMubD0rcikpOmFyZ3VtZW50cy5sZW5ndGg8Mj90IGluc3RhbmNlb2YgaHQ/bmV3IGh0KHQuaCx0LmMsdC5sKTp0IGluc3RhbmNlb2YgZHQ/Z3QodC5sLHQuYSx0LmIpOmd0KCh0PWt0KCh0PXVvLnJnYih0KSkucix0LmcsdC5iKSkubCx0LmEsdC5iKTpuZXcgaHQodCxlLHIpfWZ1bmN0aW9uIGZ0KHQsZSxyKXtyZXR1cm4gaXNOYU4odCkmJih0PTApLGlzTmFOKGUpJiYoZT0wKSxuZXcgZHQocixNYXRoLmNvcyh0Kj1xbykqZSxNYXRoLnNpbih0KSplKX1mdW5jdGlvbiBkdCh0LGUscil7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBkdD8odGhpcy5sPSt0LHRoaXMuYT0rZSx2b2lkKHRoaXMuYj0rcikpOmFyZ3VtZW50cy5sZW5ndGg8Mj90IGluc3RhbmNlb2YgZHQ/bmV3IGR0KHQubCx0LmEsdC5iKTp0IGluc3RhbmNlb2YgaHQ/ZnQodC5oLHQuYyx0LmwpOmt0KCh0PXh0KHQpKS5yLHQuZyx0LmIpOm5ldyBkdCh0LGUscil9ZnVuY3Rpb24gcHQodCxlLHIpe3ZhciBuPSh0KzE2KS8xMTYsaT1uK2UvNTAwLGE9bi1yLzIwMDtyZXR1cm4gaT1tdChpKSp0cyxuPW10KG4pKmVzLGE9bXQoYSkqcnMsbmV3IHh0KHl0KDMuMjQwNDU0MippLTEuNTM3MTM4NSpuLS40OTg1MzE0KmEpLHl0KC0uOTY5MjY2KmkrMS44NzYwMTA4Km4rLjA0MTU1NiphKSx5dCguMDU1NjQzNCppLS4yMDQwMjU5Km4rMS4wNTcyMjUyKmEpKX1mdW5jdGlvbiBndCh0LGUscil7cmV0dXJuIHQ+MD9uZXcgaHQoTWF0aC5hdGFuMihyLGUpKkhvLE1hdGguc3FydChlKmUrcipyKSx0KTpuZXcgaHQoTmFOLE5hTix0KX1mdW5jdGlvbiBtdCh0KXtyZXR1cm4gdD4uMjA2ODkzMDM0P3QqdCp0Oih0LTQvMjkpLzcuNzg3MDM3fWZ1bmN0aW9uIHZ0KHQpe3JldHVybiB0Pi4wMDg4NTY/TWF0aC5wb3codCwxLzMpOjcuNzg3MDM3KnQrNC8yOX1mdW5jdGlvbiB5dCh0KXtyZXR1cm4gTWF0aC5yb3VuZCgyNTUqKHQ8PS4wMDMwND8xMi45Mip0OjEuMDU1Kk1hdGgucG93KHQsMS8yLjQpLS4wNTUpKX1mdW5jdGlvbiB4dCh0LGUscil7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiB4dD8odGhpcy5yPX5+dCx0aGlzLmc9fn5lLHZvaWQodGhpcy5iPX5+cikpOmFyZ3VtZW50cy5sZW5ndGg8Mj90IGluc3RhbmNlb2YgeHQ/bmV3IHh0KHQucix0LmcsdC5iKTpNdCgiIit0LHh0LGN0KTpuZXcgeHQodCxlLHIpfWZ1bmN0aW9uIGJ0KHQpe3JldHVybiBuZXcgeHQodD4+MTYsdD4+OCYyNTUsMjU1JnQpfWZ1bmN0aW9uIF90KHQpe3JldHVybiBidCh0KSsiIn1mdW5jdGlvbiB3dCh0KXtyZXR1cm4gdDwxNj8iMCIrTWF0aC5tYXgoMCx0KS50b1N0cmluZygxNik6TWF0aC5taW4oMjU1LHQpLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBNdCh0LGUscil7dmFyIG4saSxhLG89MCxzPTAsbD0wO2lmKG49LyhbYS16XSspXCgoLiopXCkvLmV4ZWModD10LnRvTG93ZXJDYXNlKCkpKXN3aXRjaChpPW5bMl0uc3BsaXQoIiwiKSxuWzFdKXtjYXNlImhzbCI6cmV0dXJuIHIocGFyc2VGbG9hdChpWzBdKSxwYXJzZUZsb2F0KGlbMV0pLzEwMCxwYXJzZUZsb2F0KGlbMl0pLzEwMCk7Y2FzZSJyZ2IiOnJldHVybiBlKEV0KGlbMF0pLEV0KGlbMV0pLEV0KGlbMl0pKX1yZXR1cm4oYT1hcy5nZXQodCkpP2UoYS5yLGEuZyxhLmIpOihudWxsPT10fHwiIyIhPT10LmNoYXJBdCgwKXx8aXNOYU4oYT1wYXJzZUludCh0LnNsaWNlKDEpLDE2KSl8fCg0PT09dC5sZW5ndGg/KG89KDM4NDAmYSk+PjQsbz1vPj40fG8scz0yNDAmYSxzPXM+PjR8cyxsPTE1JmEsbD1sPDw0fGwpOjc9PT10Lmxlbmd0aCYmKG89KDE2NzExNjgwJmEpPj4xNixzPSg2NTI4MCZhKT4+OCxsPTI1NSZhKSksZShvLHMsbCkpfWZ1bmN0aW9uIEF0KHQsZSxyKXt2YXIgbixpLGE9TWF0aC5taW4odC89MjU1LGUvPTI1NSxyLz0yNTUpLG89TWF0aC5tYXgodCxlLHIpLHM9by1hLGw9KG8rYSkvMjtyZXR1cm4gcz8oaT1sPC41P3MvKG8rYSk6cy8oMi1vLWEpLG49dD09bz8oZS1yKS9zKyhlPHI/NjowKTplPT1vPyhyLXQpL3MrMjoodC1lKS9zKzQsbio9NjApOihuPU5hTixpPWw+MCYmbDwxPzA6biksbmV3IHV0KG4saSxsKX1mdW5jdGlvbiBrdCh0LGUscil7dD1UdCh0KSxlPVR0KGUpLHI9VHQocik7dmFyIG49dnQoKC40MTI0NTY0KnQrLjM1NzU3NjEqZSsuMTgwNDM3NSpyKS90cyksaT12dCgoLjIxMjY3MjkqdCsuNzE1MTUyMiplKy4wNzIxNzUqcikvZXMpLGE9dnQoKC4wMTkzMzM5KnQrLjExOTE5MiplKy45NTAzMDQxKnIpL3JzKTtyZXR1cm4gZHQoMTE2KmktMTYsNTAwKihuLWkpLDIwMCooaS1hKSl9ZnVuY3Rpb24gVHQodCl7cmV0dXJuKHQvPTI1NSk8PS4wNDA0NT90LzEyLjkyOk1hdGgucG93KCh0Ky4wNTUpLzEuMDU1LDIuNCl9ZnVuY3Rpb24gRXQodCl7dmFyIGU9cGFyc2VGbG9hdCh0KTtyZXR1cm4iJSI9PT10LmNoYXJBdCh0Lmxlbmd0aC0xKT9NYXRoLnJvdW5kKDIuNTUqZSk6ZX1mdW5jdGlvbiBTdCh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90OmZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIEx0KHQpe3JldHVybiBmdW5jdGlvbihlLHIsbil7cmV0dXJuIDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgciYmKG49cixyPW51bGwpLHp0KGUscix0LG4pfX1mdW5jdGlvbiB6dCh0LGUscixuKXtmdW5jdGlvbiBpKCl7dmFyIHQsZT1sLnN0YXR1cztpZighZSYmSXQobCl8fGU+PTIwMCYmZTwzMDB8fDMwND09PWUpe3RyeXt0PXIuY2FsbChhLGwpfWNhdGNoKHQpe3JldHVybiB2b2lkIG8uZXJyb3IuY2FsbChhLHQpfW8ubG9hZC5jYWxsKGEsdCl9ZWxzZSBvLmVycm9yLmNhbGwoYSxsKX12YXIgYT17fSxvPXVvLmRpc3BhdGNoKCJiZWZvcmVzZW5kIiwicHJvZ3Jlc3MiLCJsb2FkIiwiZXJyb3IiKSxzPXt9LGw9bmV3IFhNTEh0dHBSZXF1ZXN0LHU9bnVsbDtyZXR1cm4hdGhpcy5YRG9tYWluUmVxdWVzdHx8IndpdGhDcmVkZW50aWFscyJpbiBsfHwhL14oaHR0cChzKT86KT9cL1wvLy50ZXN0KHQpfHwobD1uZXcgWERvbWFpblJlcXVlc3QpLCJvbmxvYWQiaW4gbD9sLm9ubG9hZD1sLm9uZXJyb3I9aTpsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2wucmVhZHlTdGF0ZT4zJiZpKCl9LGwub25wcm9ncmVzcz1mdW5jdGlvbih0KXt2YXIgZT11by5ldmVudDt1by5ldmVudD10O3RyeXtvLnByb2dyZXNzLmNhbGwoYSxsKX1maW5hbGx5e3VvLmV2ZW50PWV9fSxhLmhlYWRlcj1mdW5jdGlvbih0LGUpe3JldHVybiB0PSh0KyIiKS50b0xvd2VyQ2FzZSgpLGFyZ3VtZW50cy5sZW5ndGg8Mj9zW3RdOihudWxsPT1lP2RlbGV0ZSBzW3RdOnNbdF09ZSsiIixhKX0sYS5taW1lVHlwZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT10P251bGw6dCsiIixhKTplfSxhLnJlc3BvbnNlVHlwZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LGEpOnV9LGEucmVzcG9uc2U9ZnVuY3Rpb24odCl7cmV0dXJuIHI9dCxhfSxbImdldCIsInBvc3QiXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2FbdF09ZnVuY3Rpb24oKXtyZXR1cm4gYS5zZW5kLmFwcGx5KGEsW3RdLmNvbmNhdChobyhhcmd1bWVudHMpKSl9fSksYS5zZW5kPWZ1bmN0aW9uKHIsbixpKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCYmImZ1bmN0aW9uIj09dHlwZW9mIG4mJihpPW4sbj1udWxsKSxsLm9wZW4ocix0LCEwKSxudWxsPT1lfHwiYWNjZXB0ImluIHN8fChzLmFjY2VwdD1lKyIsKi8qIiksbC5zZXRSZXF1ZXN0SGVhZGVyKWZvcih2YXIgYyBpbiBzKWwuc2V0UmVxdWVzdEhlYWRlcihjLHNbY10pO3JldHVybiBudWxsIT1lJiZsLm92ZXJyaWRlTWltZVR5cGUmJmwub3ZlcnJpZGVNaW1lVHlwZShlKSxudWxsIT11JiYobC5yZXNwb25zZVR5cGU9dSksbnVsbCE9aSYmYS5vbigiZXJyb3IiLGkpLm9uKCJsb2FkIixmdW5jdGlvbih0KXtpKG51bGwsdCl9KSxvLmJlZm9yZXNlbmQuY2FsbChhLGwpLGwuc2VuZChudWxsPT1uP251bGw6biksYX0sYS5hYm9ydD1mdW5jdGlvbigpe3JldHVybiBsLmFib3J0KCksYX0sdW8ucmViaW5kKGEsbywib24iKSxudWxsPT1uP2E6YS5nZXQoQ3QobikpfWZ1bmN0aW9uIEN0KHQpe3JldHVybiAxPT09dC5sZW5ndGg/ZnVuY3Rpb24oZSxyKXt0KG51bGw9PWU/cjpudWxsKX06dH1mdW5jdGlvbiBJdCh0KXt2YXIgZT10LnJlc3BvbnNlVHlwZTtyZXR1cm4gZSYmInRleHQiIT09ZT90LnJlc3BvbnNlOnQucmVzcG9uc2VUZXh0fWZ1bmN0aW9uIFB0KHQsZSxyKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoO248MiYmKGU9MCksbjwzJiYocj1EYXRlLm5vdygpKTt2YXIgaT1yK2UsYT17Yzp0LHQ6aSxuOm51bGx9O3JldHVybiBzcz9zcy5uPWE6b3M9YSxzcz1hLGxzfHwodXM9Y2xlYXJUaW1lb3V0KHVzKSxscz0xLGNzKER0KSksYX1mdW5jdGlvbiBEdCgpe3ZhciB0PVJ0KCksZT1PdCgpLXQ7ZT4yND8oaXNGaW5pdGUoZSkmJihjbGVhclRpbWVvdXQodXMpLHVzPXNldFRpbWVvdXQoRHQsZSkpLGxzPTApOihscz0xLGNzKER0KSl9ZnVuY3Rpb24gUnQoKXtmb3IodmFyIHQ9RGF0ZS5ub3coKSxlPW9zO2U7KXQ+PWUudCYmZS5jKHQtZS50KSYmKGUuYz1udWxsKSxlPWUubjtyZXR1cm4gdH1mdW5jdGlvbiBPdCgpe2Zvcih2YXIgdCxlPW9zLHI9MS8wO2U7KWUuYz8oZS50PHImJihyPWUudCksZT0odD1lKS5uKTplPXQ/dC5uPWUubjpvcz1lLm47cmV0dXJuIHNzPXQscn1mdW5jdGlvbiBGdCh0LGUpe3JldHVybiBlLSh0P01hdGguY2VpbChNYXRoLmxvZyh0KS9NYXRoLkxOMTApOjEpfWZ1bmN0aW9uIGp0KHQsZSl7dmFyIHI9TWF0aC5wb3coMTAsMypibyg4LWUpKTtyZXR1cm57c2NhbGU6ZT44P2Z1bmN0aW9uKHQpe3JldHVybiB0L3J9OmZ1bmN0aW9uKHQpe3JldHVybiB0KnJ9LHN5bWJvbDp0fX1mdW5jdGlvbiBOdCh0KXt2YXIgZT10LmRlY2ltYWwscj10LnRob3VzYW5kcyxuPXQuZ3JvdXBpbmcsaT10LmN1cnJlbmN5LGE9biYmcj9mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT10Lmxlbmd0aCxhPVtdLG89MCxzPW5bMF0sbD0wO2k+MCYmcz4wJiYobCtzKzE+ZSYmKHM9TWF0aC5tYXgoMSxlLWwpKSxhLnB1c2godC5zdWJzdHJpbmcoaS09cyxpK3MpKSwhKChsKz1zKzEpPmUpKTspcz1uW289KG8rMSklbi5sZW5ndGhdO3JldHVybiBhLnJldmVyc2UoKS5qb2luKHIpfTpiO3JldHVybiBmdW5jdGlvbih0KXt2YXIgcj1mcy5leGVjKHQpLG49clsxXXx8IiAiLG89clsyXXx8Ij4iLHM9clszXXx8Ii0iLGw9cls0XXx8IiIsdT1yWzVdLGM9K3JbNl0saD1yWzddLGY9cls4XSxkPXJbOV0scD0xLGc9IiIsbT0iIix2PSExLHk9ITA7c3dpdGNoKGYmJihmPStmLnN1YnN0cmluZygxKSksKHV8fCIwIj09PW4mJiI9Ij09PW8pJiYodT1uPSIwIixvPSI9IiksZCl7Y2FzZSJuIjpoPSEwLGQ9ImciO2JyZWFrO2Nhc2UiJSI6cD0xMDAsbT0iJSIsZD0iZiI7YnJlYWs7Y2FzZSJwIjpwPTEwMCxtPSIlIixkPSJyIjticmVhaztjYXNlImIiOmNhc2UibyI6Y2FzZSJ4IjpjYXNlIlgiOiIjIj09PWwmJihnPSIwIitkLnRvTG93ZXJDYXNlKCkpO2Nhc2UiYyI6eT0hMTtjYXNlImQiOnY9ITAsZj0wO2JyZWFrO2Nhc2UicyI6cD0tMSxkPSJyIn0iJCI9PT1sJiYoZz1pWzBdLG09aVsxXSksInIiIT1kfHxmfHwoZD0iZyIpLG51bGwhPWYmJigiZyI9PWQ/Zj1NYXRoLm1heCgxLE1hdGgubWluKDIxLGYpKToiZSIhPWQmJiJmIiE9ZHx8KGY9TWF0aC5tYXgoMCxNYXRoLm1pbigyMCxmKSkpKSxkPWRzLmdldChkKXx8QnQ7dmFyIHg9dSYmaDtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIHI9bTtpZih2JiZ0JTEpcmV0dXJuIiI7dmFyIGk9dDwwfHwwPT09dCYmMS90PDA/KHQ9LXQsIi0iKToiLSI9PT1zPyIiOnM7aWYocDwwKXt2YXIgbD11by5mb3JtYXRQcmVmaXgodCxmKTt0PWwuc2NhbGUodCkscj1sLnN5bWJvbCttfWVsc2UgdCo9cDt0PWQodCxmKTt2YXIgYixfLHc9dC5sYXN0SW5kZXhPZigiLiIpO2lmKHc8MCl7dmFyIE09eT90Lmxhc3RJbmRleE9mKCJlIik6LTE7TTwwPyhiPXQsXz0iIik6KGI9dC5zdWJzdHJpbmcoMCxNKSxfPXQuc3Vic3RyaW5nKE0pKX1lbHNlIGI9dC5zdWJzdHJpbmcoMCx3KSxfPWUrdC5zdWJzdHJpbmcodysxKTshdSYmaCYmKGI9YShiLDEvMCkpO3ZhciBBPWcubGVuZ3RoK2IubGVuZ3RoK18ubGVuZ3RoKyh4PzA6aS5sZW5ndGgpLGs9QTxjP25ldyBBcnJheShBPWMtQSsxKS5qb2luKG4pOiIiO3JldHVybiB4JiYoYj1hKGsrYixrLmxlbmd0aD9jLV8ubGVuZ3RoOjEvMCkpLGkrPWcsdD1iK18sKCI8Ij09PW8/aSt0K2s6Ij4iPT09bz9rK2krdDoiXiI9PT1vP2suc3Vic3RyaW5nKDAsQT4+PTEpK2krdCtrLnN1YnN0cmluZyhBKTppKyh4P3Q6ayt0KSkrcn19fWZ1bmN0aW9uIEJ0KHQpe3JldHVybiB0KyIifWZ1bmN0aW9uIFV0KCl7dGhpcy5fPW5ldyBEYXRlKGFyZ3VtZW50cy5sZW5ndGg+MT9EYXRlLlVUQy5hcHBseSh0aGlzLGFyZ3VtZW50cyk6YXJndW1lbnRzWzBdKX1mdW5jdGlvbiBWdCh0LGUscil7ZnVuY3Rpb24gbihlKXt2YXIgcj10KGUpLG49YShyLDEpO3JldHVybiBlLXI8bi1lP3I6bn1mdW5jdGlvbiBpKHIpe3JldHVybiBlKHI9dChuZXcgZ3Moci0xKSksMSkscn1mdW5jdGlvbiBhKHQscil7cmV0dXJuIGUodD1uZXcgZ3MoK3QpLHIpLHR9ZnVuY3Rpb24gbyh0LG4sYSl7dmFyIG89aSh0KSxzPVtdO2lmKGE+MSlmb3IoO288bjspcihvKSVhfHxzLnB1c2gobmV3IERhdGUoK28pKSxlKG8sMSk7ZWxzZSBmb3IoO288bjspcy5wdXNoKG5ldyBEYXRlKCtvKSksZShvLDEpO3JldHVybiBzfWZ1bmN0aW9uIHModCxlLHIpe3RyeXtncz1VdDt2YXIgbj1uZXcgVXQ7cmV0dXJuIG4uXz10LG8obixlLHIpfWZpbmFsbHl7Z3M9RGF0ZX19dC5mbG9vcj10LHQucm91bmQ9bix0LmNlaWw9aSx0Lm9mZnNldD1hLHQucmFuZ2U9bzt2YXIgbD10LnV0Yz1xdCh0KTtyZXR1cm4gbC5mbG9vcj1sLGwucm91bmQ9cXQobiksbC5jZWlsPXF0KGkpLGwub2Zmc2V0PXF0KGEpLGwucmFuZ2U9cyx0fWZ1bmN0aW9uIHF0KHQpe3JldHVybiBmdW5jdGlvbihlLHIpe3RyeXtncz1VdDt2YXIgbj1uZXcgVXQ7cmV0dXJuIG4uXz1lLHQobixyKS5ffWZpbmFsbHl7Z3M9RGF0ZX19fWZ1bmN0aW9uIEh0KHQpe2Z1bmN0aW9uIGUodCl7ZnVuY3Rpb24gZShlKXtmb3IodmFyIHIsaSxhLG89W10scz0tMSxsPTA7KytzPG47KTM3PT09dC5jaGFyQ29kZUF0KHMpJiYoby5wdXNoKHQuc2xpY2UobCxzKSksbnVsbCE9KGk9dnNbcj10LmNoYXJBdCgrK3MpXSkmJihyPXQuY2hhckF0KCsrcykpLChhPVNbcl0pJiYocj1hKGUsbnVsbD09aT8iZSI9PT1yPyIgIjoiMCI6aSkpLG8ucHVzaChyKSxsPXMrMSk7cmV0dXJuIG8ucHVzaCh0LnNsaWNlKGwscykpLG8uam9pbigiIil9dmFyIG49dC5sZW5ndGg7cmV0dXJuIGUucGFyc2U9ZnVuY3Rpb24oZSl7dmFyIG49e3k6MTkwMCxtOjAsZDoxLEg6MCxNOjAsUzowLEw6MCxaOm51bGx9LGk9cihuLHQsZSwwKTtpZihpIT1lLmxlbmd0aClyZXR1cm4gbnVsbDsicCJpbiBuJiYobi5IPW4uSCUxMisxMipuLnApO3ZhciBhPW51bGwhPW4uWiYmZ3MhPT1VdCxvPW5ldyhhP1V0OmdzKTtyZXR1cm4iaiJpbiBuP28uc2V0RnVsbFllYXIobi55LDAsbi5qKToiVyJpbiBufHwiVSJpbiBuPygidyJpbiBufHwobi53PSJXImluIG4/MTowKSxvLnNldEZ1bGxZZWFyKG4ueSwwLDEpLG8uc2V0RnVsbFllYXIobi55LDAsIlciaW4gbj8obi53KzYpJTcrNypuLlctKG8uZ2V0RGF5KCkrNSklNzpuLncrNypuLlUtKG8uZ2V0RGF5KCkrNiklNykpOm8uc2V0RnVsbFllYXIobi55LG4ubSxuLmQpLG8uc2V0SG91cnMobi5IKyhuLlovMTAwfDApLG4uTStuLlolMTAwLG4uUyxuLkwpLGE/by5fOm99LGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sZX1mdW5jdGlvbiByKHQsZSxyLG4pe2Zvcih2YXIgaSxhLG8scz0wLGw9ZS5sZW5ndGgsdT1yLmxlbmd0aDtzPGw7KXtpZihuPj11KXJldHVybi0xO2lmKGk9ZS5jaGFyQ29kZUF0KHMrKyksMzc9PT1pKXtpZihvPWUuY2hhckF0KHMrKyksYT1MW28gaW4gdnM/ZS5jaGFyQXQocysrKTpvXSwhYXx8KG49YSh0LHIsbikpPDApcmV0dXJuLTF9ZWxzZSBpZihpIT1yLmNoYXJDb2RlQXQobisrKSlyZXR1cm4tMX1yZXR1cm4gbn1mdW5jdGlvbiBuKHQsZSxyKXt3Lmxhc3RJbmRleD0wO3ZhciBuPXcuZXhlYyhlLnNsaWNlKHIpKTtyZXR1cm4gbj8odC53PU0uZ2V0KG5bMF0udG9Mb3dlckNhc2UoKSkscituWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gaSh0LGUscil7Yi5sYXN0SW5kZXg9MDt2YXIgbj1iLmV4ZWMoZS5zbGljZShyKSk7cmV0dXJuIG4/KHQudz1fLmdldChuWzBdLnRvTG93ZXJDYXNlKCkpLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGEodCxlLHIpe1QubGFzdEluZGV4PTA7dmFyIG49VC5leGVjKGUuc2xpY2UocikpO3JldHVybiBuPyh0Lm09RS5nZXQoblswXS50b0xvd2VyQ2FzZSgpKSxyK25bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBvKHQsZSxyKXtBLmxhc3RJbmRleD0wO3ZhciBuPUEuZXhlYyhlLnNsaWNlKHIpKTtyZXR1cm4gbj8odC5tPWsuZ2V0KG5bMF0udG9Mb3dlckNhc2UoKSkscituWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcyh0LGUsbil7cmV0dXJuIHIodCxTLmMudG9TdHJpbmcoKSxlLG4pfWZ1bmN0aW9uIGwodCxlLG4pe3JldHVybiByKHQsUy54LnRvU3RyaW5nKCksZSxuKX1mdW5jdGlvbiB1KHQsZSxuKXtyZXR1cm4gcih0LFMuWC50b1N0cmluZygpLGUsbil9ZnVuY3Rpb24gYyh0LGUscil7dmFyIG49eC5nZXQoZS5zbGljZShyLHIrPTIpLnRvTG93ZXJDYXNlKCkpO3JldHVybiBudWxsPT1uPy0xOih0LnA9bixyKX12YXIgaD10LmRhdGVUaW1lLGY9dC5kYXRlLGQ9dC50aW1lLHA9dC5wZXJpb2RzLGc9dC5kYXlzLG09dC5zaG9ydERheXMsdj10Lm1vbnRocyx5PXQuc2hvcnRNb250aHM7ZS51dGM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gcih0KXt0cnl7Z3M9VXQ7dmFyIGU9bmV3IGdzO3JldHVybiBlLl89dCxuKGUpfWZpbmFsbHl7Z3M9RGF0ZX19dmFyIG49ZSh0KTtyZXR1cm4gci5wYXJzZT1mdW5jdGlvbih0KXt0cnl7Z3M9VXQ7dmFyIGU9bi5wYXJzZSh0KTtyZXR1cm4gZSYmZS5ffWZpbmFsbHl7Z3M9RGF0ZX19LHIudG9TdHJpbmc9bi50b1N0cmluZyxyfSxlLm11bHRpPWUudXRjLm11bHRpPWNlO3ZhciB4PXVvLm1hcCgpLGI9WHQoZyksXz1ZdChnKSx3PVh0KG0pLE09WXQobSksQT1YdCh2KSxrPVl0KHYpLFQ9WHQoeSksRT1ZdCh5KTtwLmZvckVhY2goZnVuY3Rpb24odCxlKXt4LnNldCh0LnRvTG93ZXJDYXNlKCksZSl9KTt2YXIgUz17YTpmdW5jdGlvbih0KXtyZXR1cm4gbVt0LmdldERheSgpXX0sQTpmdW5jdGlvbih0KXtyZXR1cm4gZ1t0LmdldERheSgpXX0sYjpmdW5jdGlvbih0KXtyZXR1cm4geVt0LmdldE1vbnRoKCldfSxCOmZ1bmN0aW9uKHQpe3JldHVybiB2W3QuZ2V0TW9udGgoKV19LGM6ZShoKSxkOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEd0KHQuZ2V0RGF0ZSgpLGUsMil9LGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gR3QodC5nZXREYXRlKCksZSwyKX0sSDpmdW5jdGlvbih0LGUpe3JldHVybiBHdCh0LmdldEhvdXJzKCksZSwyKX0sSTpmdW5jdGlvbih0LGUpe3JldHVybiBHdCh0LmdldEhvdXJzKCklMTJ8fDEyLGUsMil9LGo6ZnVuY3Rpb24odCxlKXtyZXR1cm4gR3QoMStwcy5kYXlPZlllYXIodCksZSwzKX0sTDpmdW5jdGlvbih0LGUpewpyZXR1cm4gR3QodC5nZXRNaWxsaXNlY29uZHMoKSxlLDMpfSxtOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEd0KHQuZ2V0TW9udGgoKSsxLGUsMil9LE06ZnVuY3Rpb24odCxlKXtyZXR1cm4gR3QodC5nZXRNaW51dGVzKCksZSwyKX0scDpmdW5jdGlvbih0KXtyZXR1cm4gcFsrKHQuZ2V0SG91cnMoKT49MTIpXX0sUzpmdW5jdGlvbih0LGUpe3JldHVybiBHdCh0LmdldFNlY29uZHMoKSxlLDIpfSxVOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEd0KHBzLnN1bmRheU9mWWVhcih0KSxlLDIpfSx3OmZ1bmN0aW9uKHQpe3JldHVybiB0LmdldERheSgpfSxXOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEd0KHBzLm1vbmRheU9mWWVhcih0KSxlLDIpfSx4OmUoZiksWDplKGQpLHk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gR3QodC5nZXRGdWxsWWVhcigpJTEwMCxlLDIpfSxZOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEd0KHQuZ2V0RnVsbFllYXIoKSUxZTQsZSw0KX0sWjpsZSwiJSI6ZnVuY3Rpb24oKXtyZXR1cm4iJSJ9fSxMPXthOm4sQTppLGI6YSxCOm8sYzpzLGQ6cmUsZTpyZSxIOmllLEk6aWUsajpuZSxMOnNlLG06ZWUsTTphZSxwOmMsUzpvZSxVOlp0LHc6V3QsVzpRdCx4OmwsWDp1LHk6JHQsWTpLdCxaOkp0LCIlIjp1ZX07cmV0dXJuIGV9ZnVuY3Rpb24gR3QodCxlLHIpe3ZhciBuPXQ8MD8iLSI6IiIsaT0obj8tdDp0KSsiIixhPWkubGVuZ3RoO3JldHVybiBuKyhhPHI/bmV3IEFycmF5KHItYSsxKS5qb2luKGUpK2k6aSl9ZnVuY3Rpb24gWHQodCl7cmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiK3QubWFwKHVvLnJlcXVvdGUpLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiBZdCh0KXtmb3IodmFyIGU9bmV3IGgscj0tMSxuPXQubGVuZ3RoOysrcjxuOyllLnNldCh0W3JdLnRvTG93ZXJDYXNlKCkscik7cmV0dXJuIGV9ZnVuY3Rpb24gV3QodCxlLHIpe3lzLmxhc3RJbmRleD0wO3ZhciBuPXlzLmV4ZWMoZS5zbGljZShyLHIrMSkpO3JldHVybiBuPyh0Lnc9K25bMF0scituWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gWnQodCxlLHIpe3lzLmxhc3RJbmRleD0wO3ZhciBuPXlzLmV4ZWMoZS5zbGljZShyKSk7cmV0dXJuIG4/KHQuVT0rblswXSxyK25bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBRdCh0LGUscil7eXMubGFzdEluZGV4PTA7dmFyIG49eXMuZXhlYyhlLnNsaWNlKHIpKTtyZXR1cm4gbj8odC5XPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEt0KHQsZSxyKXt5cy5sYXN0SW5kZXg9MDt2YXIgbj15cy5leGVjKGUuc2xpY2UocixyKzQpKTtyZXR1cm4gbj8odC55PStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uICR0KHQsZSxyKXt5cy5sYXN0SW5kZXg9MDt2YXIgbj15cy5leGVjKGUuc2xpY2UocixyKzIpKTtyZXR1cm4gbj8odC55PXRlKCtuWzBdKSxyK25bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBKdCh0LGUscil7cmV0dXJuL15bKy1dXGR7NH0kLy50ZXN0KGU9ZS5zbGljZShyLHIrNSkpPyh0Llo9LWUscis1KTotMX1mdW5jdGlvbiB0ZSh0KXtyZXR1cm4gdCsodD42OD8xOTAwOjJlMyl9ZnVuY3Rpb24gZWUodCxlLHIpe3lzLmxhc3RJbmRleD0wO3ZhciBuPXlzLmV4ZWMoZS5zbGljZShyLHIrMikpO3JldHVybiBuPyh0Lm09blswXS0xLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHJlKHQsZSxyKXt5cy5sYXN0SW5kZXg9MDt2YXIgbj15cy5leGVjKGUuc2xpY2UocixyKzIpKTtyZXR1cm4gbj8odC5kPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG5lKHQsZSxyKXt5cy5sYXN0SW5kZXg9MDt2YXIgbj15cy5leGVjKGUuc2xpY2UocixyKzMpKTtyZXR1cm4gbj8odC5qPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGllKHQsZSxyKXt5cy5sYXN0SW5kZXg9MDt2YXIgbj15cy5leGVjKGUuc2xpY2UocixyKzIpKTtyZXR1cm4gbj8odC5IPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGFlKHQsZSxyKXt5cy5sYXN0SW5kZXg9MDt2YXIgbj15cy5leGVjKGUuc2xpY2UocixyKzIpKTtyZXR1cm4gbj8odC5NPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG9lKHQsZSxyKXt5cy5sYXN0SW5kZXg9MDt2YXIgbj15cy5leGVjKGUuc2xpY2UocixyKzIpKTtyZXR1cm4gbj8odC5TPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHNlKHQsZSxyKXt5cy5sYXN0SW5kZXg9MDt2YXIgbj15cy5leGVjKGUuc2xpY2UocixyKzMpKTtyZXR1cm4gbj8odC5MPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGxlKHQpe3ZhciBlPXQuZ2V0VGltZXpvbmVPZmZzZXQoKSxyPWU+MD8iLSI6IisiLG49Ym8oZSkvNjB8MCxpPWJvKGUpJTYwO3JldHVybiByK0d0KG4sIjAiLDIpK0d0KGksIjAiLDIpfWZ1bmN0aW9uIHVlKHQsZSxyKXt4cy5sYXN0SW5kZXg9MDt2YXIgbj14cy5leGVjKGUuc2xpY2UocixyKzEpKTtyZXR1cm4gbj9yK25bMF0ubGVuZ3RoOi0xfWZ1bmN0aW9uIGNlKHQpe2Zvcih2YXIgZT10Lmxlbmd0aCxyPS0xOysrcjxlOyl0W3JdWzBdPXRoaXModFtyXVswXSk7cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgcj0wLG49dFtyXTshblsxXShlKTspbj10Wysrcl07cmV0dXJuIG5bMF0oZSl9fWZ1bmN0aW9uIGhlKCl7fWZ1bmN0aW9uIGZlKHQsZSxyKXt2YXIgbj1yLnM9dCtlLGk9bi10LGE9bi1pO3IudD10LWErKGUtaSl9ZnVuY3Rpb24gZGUodCxlKXt0JiZNcy5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpJiZNc1t0LnR5cGVdKHQsZSl9ZnVuY3Rpb24gcGUodCxlLHIpe3ZhciBuLGk9LTEsYT10Lmxlbmd0aC1yO2ZvcihlLmxpbmVTdGFydCgpOysraTxhOyluPXRbaV0sZS5wb2ludChuWzBdLG5bMV0sblsyXSk7ZS5saW5lRW5kKCl9ZnVuY3Rpb24gZ2UodCxlKXt2YXIgcj0tMSxuPXQubGVuZ3RoO2ZvcihlLnBvbHlnb25TdGFydCgpOysrcjxuOylwZSh0W3JdLGUsMSk7ZS5wb2x5Z29uRW5kKCl9ZnVuY3Rpb24gbWUoKXtmdW5jdGlvbiB0KHQsZSl7dCo9cW8sZT1lKnFvLzIrTm8vNDt2YXIgcj10LW4sbz1yPj0wPzE6LTEscz1vKnIsbD1NYXRoLmNvcyhlKSx1PU1hdGguc2luKGUpLGM9YSp1LGg9aSpsK2MqTWF0aC5jb3MocyksZj1jKm8qTWF0aC5zaW4ocyk7a3MuYWRkKE1hdGguYXRhbjIoZixoKSksbj10LGk9bCxhPXV9dmFyIGUscixuLGksYTtUcy5wb2ludD1mdW5jdGlvbihvLHMpe1RzLnBvaW50PXQsbj0oZT1vKSpxbyxpPU1hdGguY29zKHM9KHI9cykqcW8vMitOby80KSxhPU1hdGguc2luKHMpfSxUcy5saW5lRW5kPWZ1bmN0aW9uKCl7dChlLHIpfX1mdW5jdGlvbiB2ZSh0KXt2YXIgZT10WzBdLHI9dFsxXSxuPU1hdGguY29zKHIpO3JldHVybltuKk1hdGguY29zKGUpLG4qTWF0aC5zaW4oZSksTWF0aC5zaW4ocildfWZ1bmN0aW9uIHllKHQsZSl7cmV0dXJuIHRbMF0qZVswXSt0WzFdKmVbMV0rdFsyXSplWzJdfWZ1bmN0aW9uIHhlKHQsZSl7cmV0dXJuW3RbMV0qZVsyXS10WzJdKmVbMV0sdFsyXSplWzBdLXRbMF0qZVsyXSx0WzBdKmVbMV0tdFsxXSplWzBdXX1mdW5jdGlvbiBiZSh0LGUpe3RbMF0rPWVbMF0sdFsxXSs9ZVsxXSx0WzJdKz1lWzJdfWZ1bmN0aW9uIF9lKHQsZSl7cmV0dXJuW3RbMF0qZSx0WzFdKmUsdFsyXSplXX1mdW5jdGlvbiB3ZSh0KXt2YXIgZT1NYXRoLnNxcnQodFswXSp0WzBdK3RbMV0qdFsxXSt0WzJdKnRbMl0pO3RbMF0vPWUsdFsxXS89ZSx0WzJdLz1lfWZ1bmN0aW9uIE1lKHQpe3JldHVybltNYXRoLmF0YW4yKHRbMV0sdFswXSksbnQodFsyXSldfWZ1bmN0aW9uIEFlKHQsZSl7cmV0dXJuIGJvKHRbMF0tZVswXSk8Rm8mJmJvKHRbMV0tZVsxXSk8Rm99ZnVuY3Rpb24ga2UodCxlKXt0Kj1xbzt2YXIgcj1NYXRoLmNvcyhlKj1xbyk7VGUocipNYXRoLmNvcyh0KSxyKk1hdGguc2luKHQpLE1hdGguc2luKGUpKX1mdW5jdGlvbiBUZSh0LGUscil7KytFcyxMcys9KHQtTHMpL0VzLHpzKz0oZS16cykvRXMsQ3MrPShyLUNzKS9Fc31mdW5jdGlvbiBFZSgpe2Z1bmN0aW9uIHQodCxpKXt0Kj1xbzt2YXIgYT1NYXRoLmNvcyhpKj1xbyksbz1hKk1hdGguY29zKHQpLHM9YSpNYXRoLnNpbih0KSxsPU1hdGguc2luKGkpLHU9TWF0aC5hdGFuMihNYXRoLnNxcnQoKHU9cipsLW4qcykqdSsodT1uKm8tZSpsKSp1Kyh1PWUqcy1yKm8pKnUpLGUqbytyKnMrbipsKTtTcys9dSxJcys9dSooZSsoZT1vKSksUHMrPXUqKHIrKHI9cykpLERzKz11KihuKyhuPWwpKSxUZShlLHIsbil9dmFyIGUscixuO2pzLnBvaW50PWZ1bmN0aW9uKGksYSl7aSo9cW87dmFyIG89TWF0aC5jb3MoYSo9cW8pO2U9bypNYXRoLmNvcyhpKSxyPW8qTWF0aC5zaW4oaSksbj1NYXRoLnNpbihhKSxqcy5wb2ludD10LFRlKGUscixuKX19ZnVuY3Rpb24gU2UoKXtqcy5wb2ludD1rZX1mdW5jdGlvbiBMZSgpe2Z1bmN0aW9uIHQodCxlKXt0Kj1xbzt2YXIgcj1NYXRoLmNvcyhlKj1xbyksbz1yKk1hdGguY29zKHQpLHM9cipNYXRoLnNpbih0KSxsPU1hdGguc2luKGUpLHU9aSpsLWEqcyxjPWEqby1uKmwsaD1uKnMtaSpvLGY9TWF0aC5zcXJ0KHUqdStjKmMraCpoKSxkPW4qbytpKnMrYSpsLHA9ZiYmLXJ0KGQpL2YsZz1NYXRoLmF0YW4yKGYsZCk7UnMrPXAqdSxPcys9cCpjLEZzKz1wKmgsU3MrPWcsSXMrPWcqKG4rKG49bykpLFBzKz1nKihpKyhpPXMpKSxEcys9ZyooYSsoYT1sKSksVGUobixpLGEpfXZhciBlLHIsbixpLGE7anMucG9pbnQ9ZnVuY3Rpb24obyxzKXtlPW8scj1zLGpzLnBvaW50PXQsbyo9cW87dmFyIGw9TWF0aC5jb3Mocyo9cW8pO249bCpNYXRoLmNvcyhvKSxpPWwqTWF0aC5zaW4obyksYT1NYXRoLnNpbihzKSxUZShuLGksYSl9LGpzLmxpbmVFbmQ9ZnVuY3Rpb24oKXt0KGUsciksanMubGluZUVuZD1TZSxqcy5wb2ludD1rZX19ZnVuY3Rpb24gemUodCxlKXtmdW5jdGlvbiByKHIsbil7cmV0dXJuIHI9dChyLG4pLGUoclswXSxyWzFdKX1yZXR1cm4gdC5pbnZlcnQmJmUuaW52ZXJ0JiYoci5pbnZlcnQ9ZnVuY3Rpb24ocixuKXtyZXR1cm4gcj1lLmludmVydChyLG4pLHImJnQuaW52ZXJ0KHJbMF0sclsxXSl9KSxyfWZ1bmN0aW9uIENlKCl7cmV0dXJuITB9ZnVuY3Rpb24gSWUodCxlLHIsbixpKXt2YXIgYT1bXSxvPVtdO2lmKHQuZm9yRWFjaChmdW5jdGlvbih0KXtpZighKChlPXQubGVuZ3RoLTEpPD0wKSl7dmFyIGUscj10WzBdLG49dFtlXTtpZihBZShyLG4pKXtpLmxpbmVTdGFydCgpO2Zvcih2YXIgcz0wO3M8ZTsrK3MpaS5wb2ludCgocj10W3NdKVswXSxyWzFdKTtyZXR1cm4gdm9pZCBpLmxpbmVFbmQoKX12YXIgbD1uZXcgRGUocix0LG51bGwsITApLHU9bmV3IERlKHIsbnVsbCxsLCExKTtsLm89dSxhLnB1c2gobCksby5wdXNoKHUpLGw9bmV3IERlKG4sdCxudWxsLCExKSx1PW5ldyBEZShuLG51bGwsbCwhMCksbC5vPXUsYS5wdXNoKGwpLG8ucHVzaCh1KX19KSxvLnNvcnQoZSksUGUoYSksUGUobyksYS5sZW5ndGgpe2Zvcih2YXIgcz0wLGw9cix1PW8ubGVuZ3RoO3M8dTsrK3Mpb1tzXS5lPWw9IWw7Zm9yKHZhciBjLGgsZj1hWzBdOzspe2Zvcih2YXIgZD1mLHA9ITA7ZC52OylpZigoZD1kLm4pPT09ZilyZXR1cm47Yz1kLnosaS5saW5lU3RhcnQoKTtkb3tpZihkLnY9ZC5vLnY9ITAsZC5lKXtpZihwKWZvcih2YXIgcz0wLHU9Yy5sZW5ndGg7czx1OysrcylpLnBvaW50KChoPWNbc10pWzBdLGhbMV0pO2Vsc2UgbihkLngsZC5uLngsMSxpKTtkPWQubn1lbHNle2lmKHApe2M9ZC5wLno7Zm9yKHZhciBzPWMubGVuZ3RoLTE7cz49MDstLXMpaS5wb2ludCgoaD1jW3NdKVswXSxoWzFdKX1lbHNlIG4oZC54LGQucC54LC0xLGkpO2Q9ZC5wfWQ9ZC5vLGM9ZC56LHA9IXB9d2hpbGUoIWQudik7aS5saW5lRW5kKCl9fX1mdW5jdGlvbiBQZSh0KXtpZihlPXQubGVuZ3RoKXtmb3IodmFyIGUscixuPTAsaT10WzBdOysrbjxlOylpLm49cj10W25dLHIucD1pLGk9cjtpLm49cj10WzBdLHIucD1pfX1mdW5jdGlvbiBEZSh0LGUscixuKXt0aGlzLng9dCx0aGlzLno9ZSx0aGlzLm89cix0aGlzLmU9bix0aGlzLnY9ITEsdGhpcy5uPXRoaXMucD1udWxsfWZ1bmN0aW9uIFJlKHQsZSxyLG4pe3JldHVybiBmdW5jdGlvbihpLGEpe2Z1bmN0aW9uIG8oZSxyKXt2YXIgbj1pKGUscik7dChlPW5bMF0scj1uWzFdKSYmYS5wb2ludChlLHIpfWZ1bmN0aW9uIHModCxlKXt2YXIgcj1pKHQsZSk7bS5wb2ludChyWzBdLHJbMV0pfWZ1bmN0aW9uIGwoKXt5LnBvaW50PXMsbS5saW5lU3RhcnQoKX1mdW5jdGlvbiB1KCl7eS5wb2ludD1vLG0ubGluZUVuZCgpfWZ1bmN0aW9uIGModCxlKXtnLnB1c2goW3QsZV0pO3ZhciByPWkodCxlKTtiLnBvaW50KHJbMF0sclsxXSl9ZnVuY3Rpb24gaCgpe2IubGluZVN0YXJ0KCksZz1bXX1mdW5jdGlvbiBmKCl7YyhnWzBdWzBdLGdbMF1bMV0pLGIubGluZUVuZCgpO3ZhciB0LGU9Yi5jbGVhbigpLHI9eC5idWZmZXIoKSxuPXIubGVuZ3RoO2lmKGcucG9wKCkscC5wdXNoKGcpLGc9bnVsbCxuKWlmKDEmZSl7dD1yWzBdO3ZhciBpLG49dC5sZW5ndGgtMSxvPS0xO2lmKG4+MCl7Zm9yKF98fChhLnBvbHlnb25TdGFydCgpLF89ITApLGEubGluZVN0YXJ0KCk7KytvPG47KWEucG9pbnQoKGk9dFtvXSlbMF0saVsxXSk7YS5saW5lRW5kKCl9fWVsc2Ugbj4xJiYyJmUmJnIucHVzaChyLnBvcCgpLmNvbmNhdChyLnNoaWZ0KCkpKSxkLnB1c2goci5maWx0ZXIoT2UpKX12YXIgZCxwLGcsbT1lKGEpLHY9aS5pbnZlcnQoblswXSxuWzFdKSx5PXtwb2ludDpvLGxpbmVTdGFydDpsLGxpbmVFbmQ6dSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt5LnBvaW50PWMseS5saW5lU3RhcnQ9aCx5LmxpbmVFbmQ9ZixkPVtdLHA9W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt5LnBvaW50PW8seS5saW5lU3RhcnQ9bCx5LmxpbmVFbmQ9dSxkPXVvLm1lcmdlKGQpO3ZhciB0PVZlKHYscCk7ZC5sZW5ndGg/KF98fChhLnBvbHlnb25TdGFydCgpLF89ITApLEllKGQsamUsdCxyLGEpKTp0JiYoX3x8KGEucG9seWdvblN0YXJ0KCksXz0hMCksYS5saW5lU3RhcnQoKSxyKG51bGwsbnVsbCwxLGEpLGEubGluZUVuZCgpKSxfJiYoYS5wb2x5Z29uRW5kKCksXz0hMSksZD1wPW51bGx9LHNwaGVyZTpmdW5jdGlvbigpe2EucG9seWdvblN0YXJ0KCksYS5saW5lU3RhcnQoKSxyKG51bGwsbnVsbCwxLGEpLGEubGluZUVuZCgpLGEucG9seWdvbkVuZCgpfX0seD1GZSgpLGI9ZSh4KSxfPSExO3JldHVybiB5fX1mdW5jdGlvbiBPZSh0KXtyZXR1cm4gdC5sZW5ndGg+MX1mdW5jdGlvbiBGZSgpe3ZhciB0LGU9W107cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2UucHVzaCh0PVtdKX0scG9pbnQ6ZnVuY3Rpb24oZSxyKXt0LnB1c2goW2Uscl0pfSxsaW5lRW5kOk0sYnVmZmVyOmZ1bmN0aW9uKCl7dmFyIHI9ZTtyZXR1cm4gZT1bXSx0PW51bGwscn0scmVqb2luOmZ1bmN0aW9uKCl7ZS5sZW5ndGg+MSYmZS5wdXNoKGUucG9wKCkuY29uY2F0KGUuc2hpZnQoKSkpfX19ZnVuY3Rpb24gamUodCxlKXtyZXR1cm4oKHQ9dC54KVswXTwwP3RbMV0tVm8tRm86Vm8tdFsxXSktKChlPWUueClbMF08MD9lWzFdLVZvLUZvOlZvLWVbMV0pfWZ1bmN0aW9uIE5lKHQpe3ZhciBlLHI9TmFOLG49TmFOLGk9TmFOO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0LmxpbmVTdGFydCgpLGU9MX0scG9pbnQ6ZnVuY3Rpb24oYSxvKXt2YXIgcz1hPjA/Tm86LU5vLGw9Ym8oYS1yKTtibyhsLU5vKTxGbz8odC5wb2ludChyLG49KG4rbykvMj4wP1ZvOi1WbyksdC5wb2ludChpLG4pLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludChzLG4pLHQucG9pbnQoYSxuKSxlPTApOmkhPT1zJiZsPj1ObyYmKGJvKHItaSk8Rm8mJihyLT1pKkZvKSxibyhhLXMpPEZvJiYoYS09cypGbyksbj1CZShyLG4sYSxvKSx0LnBvaW50KGksbiksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHMsbiksZT0wKSx0LnBvaW50KHI9YSxuPW8pLGk9c30sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpLHI9bj1OYU59LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItZX19fWZ1bmN0aW9uIEJlKHQsZSxyLG4pe3ZhciBpLGEsbz1NYXRoLnNpbih0LXIpO3JldHVybiBibyhvKT5Gbz9NYXRoLmF0YW4oKE1hdGguc2luKGUpKihhPU1hdGguY29zKG4pKSpNYXRoLnNpbihyKS1NYXRoLnNpbihuKSooaT1NYXRoLmNvcyhlKSkqTWF0aC5zaW4odCkpLyhpKmEqbykpOihlK24pLzJ9ZnVuY3Rpb24gVWUodCxlLHIsbil7dmFyIGk7aWYobnVsbD09dClpPXIqVm8sbi5wb2ludCgtTm8saSksbi5wb2ludCgwLGkpLG4ucG9pbnQoTm8saSksbi5wb2ludChObywwKSxuLnBvaW50KE5vLC1pKSxuLnBvaW50KDAsLWkpLG4ucG9pbnQoLU5vLC1pKSxuLnBvaW50KC1ObywwKSxuLnBvaW50KC1ObyxpKTtlbHNlIGlmKGJvKHRbMF0tZVswXSk+Rm8pe3ZhciBhPXRbMF08ZVswXT9ObzotTm87aT1yKmEvMixuLnBvaW50KC1hLGkpLG4ucG9pbnQoMCxpKSxuLnBvaW50KGEsaSl9ZWxzZSBuLnBvaW50KGVbMF0sZVsxXSl9ZnVuY3Rpb24gVmUodCxlKXt2YXIgcj10WzBdLG49dFsxXSxpPVtNYXRoLnNpbihyKSwtTWF0aC5jb3MociksMF0sYT0wLG89MDtrcy5yZXNldCgpO2Zvcih2YXIgcz0wLGw9ZS5sZW5ndGg7czxsOysrcyl7dmFyIHU9ZVtzXSxjPXUubGVuZ3RoO2lmKGMpZm9yKHZhciBoPXVbMF0sZj1oWzBdLGQ9aFsxXS8yK05vLzQscD1NYXRoLnNpbihkKSxnPU1hdGguY29zKGQpLG09MTs7KXttPT09YyYmKG09MCksdD11W21dO3ZhciB2PXRbMF0seT10WzFdLzIrTm8vNCx4PU1hdGguc2luKHkpLGI9TWF0aC5jb3MoeSksXz12LWYsdz1fPj0wPzE6LTEsTT13Kl8sQT1NPk5vLGs9cCp4O2lmKGtzLmFkZChNYXRoLmF0YW4yKGsqdypNYXRoLnNpbihNKSxnKmIraypNYXRoLmNvcyhNKSkpLGErPUE/Xyt3KkJvOl8sQV5mPj1yXnY+PXIpe3ZhciBUPXhlKHZlKGgpLHZlKHQpKTt3ZShUKTt2YXIgRT14ZShpLFQpO3dlKEUpO3ZhciBTPShBXl8+PTA/LTE6MSkqbnQoRVsyXSk7KG4+U3x8bj09PVMmJihUWzBdfHxUWzFdKSkmJihvKz1BXl8+PTA/MTotMSl9aWYoIW0rKylicmVhaztmPXYscD14LGc9YixoPXR9fXJldHVybihhPC1Gb3x8YTxGbyYma3M8LUZvKV4xJm99ZnVuY3Rpb24gcWUodCl7ZnVuY3Rpb24gZSh0LGUpe3JldHVybiBNYXRoLmNvcyh0KSpNYXRoLmNvcyhlKT5hfWZ1bmN0aW9uIHIodCl7dmFyIHIsYSxsLHUsYztyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dT1sPSExLGM9MX0scG9pbnQ6ZnVuY3Rpb24oaCxmKXt2YXIgZCxwPVtoLGZdLGc9ZShoLGYpLG09bz9nPzA6aShoLGYpOmc/aShoKyhoPDA/Tm86LU5vKSxmKTowO2lmKCFyJiYodT1sPWcpJiZ0LmxpbmVTdGFydCgpLGchPT1sJiYoZD1uKHIscCksKEFlKHIsZCl8fEFlKHAsZCkpJiYocFswXSs9Rm8scFsxXSs9Rm8sZz1lKHBbMF0scFsxXSkpKSxnIT09bCljPTAsZz8odC5saW5lU3RhcnQoKSxkPW4ocCxyKSx0LnBvaW50KGRbMF0sZFsxXSkpOihkPW4ocixwKSx0LnBvaW50KGRbMF0sZFsxXSksdC5saW5lRW5kKCkpLHI9ZDtlbHNlIGlmKHMmJnImJm9eZyl7dmFyIHY7bSZhfHwhKHY9bihwLHIsITApKXx8KGM9MCxvPyh0LmxpbmVTdGFydCgpLHQucG9pbnQodlswXVswXSx2WzBdWzFdKSx0LnBvaW50KHZbMV1bMF0sdlsxXVsxXSksdC5saW5lRW5kKCkpOih0LnBvaW50KHZbMV1bMF0sdlsxXVsxXSksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHZbMF1bMF0sdlswXVsxXSkpKX0hZ3x8ciYmQWUocixwKXx8dC5wb2ludChwWzBdLHBbMV0pLHI9cCxsPWcsYT1tfSxsaW5lRW5kOmZ1bmN0aW9uKCl7bCYmdC5saW5lRW5kKCkscj1udWxsfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiBjfCh1JiZsKTw8MX19fWZ1bmN0aW9uIG4odCxlLHIpe3ZhciBuPXZlKHQpLGk9dmUoZSksbz1bMSwwLDBdLHM9eGUobixpKSxsPXllKHMscyksdT1zWzBdLGM9bC11KnU7aWYoIWMpcmV0dXJuIXImJnQ7dmFyIGg9YSpsL2MsZj0tYSp1L2MsZD14ZShvLHMpLHA9X2UobyxoKSxnPV9lKHMsZik7YmUocCxnKTt2YXIgbT1kLHY9eWUocCxtKSx5PXllKG0sbSkseD12KnYteSooeWUocCxwKS0xKTtpZighKHg8MCkpe3ZhciBiPU1hdGguc3FydCh4KSxfPV9lKG0sKC12LWIpL3kpO2lmKGJlKF8scCksXz1NZShfKSwhcilyZXR1cm4gXzt2YXIgdyxNPXRbMF0sQT1lWzBdLGs9dFsxXSxUPWVbMV07QTxNJiYodz1NLE09QSxBPXcpO3ZhciBFPUEtTSxTPWJvKEUtTm8pPEZvLEw9U3x8RTxGbztpZighUyYmVDxrJiYodz1rLGs9VCxUPXcpLEw/Uz9rK1Q+MF5fWzFdPChibyhfWzBdLU0pPEZvP2s6VCk6azw9X1sxXSYmX1sxXTw9VDpFPk5vXihNPD1fWzBdJiZfWzBdPD1BKSl7dmFyIHo9X2UobSwoLXYrYikveSk7cmV0dXJuIGJlKHoscCksW18sTWUoeildfX19ZnVuY3Rpb24gaShlLHIpe3ZhciBuPW8/dDpOby10LGk9MDtyZXR1cm4gZTwtbj9pfD0xOmU+biYmKGl8PTIpLHI8LW4/aXw9NDpyPm4mJihpfD04KSxpfXZhciBhPU1hdGguY29zKHQpLG89YT4wLHM9Ym8oYSk+Rm8sbD1tcih0LDYqcW8pO3JldHVybiBSZShlLHIsbCxvP1swLC10XTpbLU5vLHQtTm9dKX1mdW5jdGlvbiBIZSh0LGUscixuKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIGEsbz1pLmEscz1pLmIsbD1vLngsdT1vLnksYz1zLngsaD1zLnksZj0wLGQ9MSxwPWMtbCxnPWgtdTtpZihhPXQtbCxwfHwhKGE+MCkpe2lmKGEvPXAscDwwKXtpZihhPGYpcmV0dXJuO2E8ZCYmKGQ9YSl9ZWxzZSBpZihwPjApe2lmKGE+ZClyZXR1cm47YT5mJiYoZj1hKX1pZihhPXItbCxwfHwhKGE8MCkpe2lmKGEvPXAscDwwKXtpZihhPmQpcmV0dXJuO2E+ZiYmKGY9YSl9ZWxzZSBpZihwPjApe2lmKGE8ZilyZXR1cm47YTxkJiYoZD1hKX1pZihhPWUtdSxnfHwhKGE+MCkpe2lmKGEvPWcsZzwwKXtpZihhPGYpcmV0dXJuO2E8ZCYmKGQ9YSl9ZWxzZSBpZihnPjApe2lmKGE+ZClyZXR1cm47YT5mJiYoZj1hKX1pZihhPW4tdSxnfHwhKGE8MCkpe2lmKGEvPWcsZzwwKXtpZihhPmQpcmV0dXJuO2E+ZiYmKGY9YSl9ZWxzZSBpZihnPjApe2lmKGE8ZilyZXR1cm47YTxkJiYoZD1hKX1yZXR1cm4gZj4wJiYoaS5hPXt4OmwrZipwLHk6dStmKmd9KSxkPDEmJihpLmI9e3g6bCtkKnAseTp1K2QqZ30pLGl9fX19fX1mdW5jdGlvbiBHZSh0LGUscixuKXtmdW5jdGlvbiBpKG4saSl7cmV0dXJuIGJvKG5bMF0tdCk8Rm8/aT4wPzA6MzpibyhuWzBdLXIpPEZvP2k+MD8yOjE6Ym8oblsxXS1lKTxGbz9pPjA/MTowOmk+MD8zOjJ9ZnVuY3Rpb24gYSh0LGUpe3JldHVybiBvKHQueCxlLngpfWZ1bmN0aW9uIG8odCxlKXt2YXIgcj1pKHQsMSksbj1pKGUsMSk7cmV0dXJuIHIhPT1uP3ItbjowPT09cj9lWzFdLXRbMV06MT09PXI/dFswXS1lWzBdOjI9PT1yP3RbMV0tZVsxXTplWzBdLXRbMF19cmV0dXJuIGZ1bmN0aW9uKHMpe2Z1bmN0aW9uIGwodCl7Zm9yKHZhciBlPTAscj1tLmxlbmd0aCxuPXRbMV0saT0wO2k8cjsrK2kpZm9yKHZhciBhLG89MSxzPW1baV0sbD1zLmxlbmd0aCx1PXNbMF07bzxsOysrbylhPXNbb10sdVsxXTw9bj9hWzFdPm4mJmV0KHUsYSx0KT4wJiYrK2U6YVsxXTw9biYmZXQodSxhLHQpPDAmJi0tZSx1PWE7cmV0dXJuIDAhPT1lfWZ1bmN0aW9uIHUoYSxzLGwsdSl7dmFyIGM9MCxoPTA7aWYobnVsbD09YXx8KGM9aShhLGwpKSE9PShoPWkocyxsKSl8fG8oYSxzKTwwXmw+MCl7ZG8gdS5wb2ludCgwPT09Y3x8Mz09PWM/dDpyLGM+MT9uOmUpO3doaWxlKChjPShjK2wrNCklNCkhPT1oKX1lbHNlIHUucG9pbnQoc1swXSxzWzFdKX1mdW5jdGlvbiBjKGksYSl7cmV0dXJuIHQ8PWkmJmk8PXImJmU8PWEmJmE8PW59ZnVuY3Rpb24gaCh0LGUpe2ModCxlKSYmcy5wb2ludCh0LGUpfWZ1bmN0aW9uIGYoKXtMLnBvaW50PXAsbSYmbS5wdXNoKHY9W10pLEE9ITAsTT0hMSxfPXc9TmFOfWZ1bmN0aW9uIGQoKXtnJiYocCh5LHgpLGImJk0mJkUucmVqb2luKCksZy5wdXNoKEUuYnVmZmVyKCkpKSxMLnBvaW50PWgsTSYmcy5saW5lRW5kKCl9ZnVuY3Rpb24gcCh0LGUpe3Q9TWF0aC5tYXgoLUJzLE1hdGgubWluKEJzLHQpKSxlPU1hdGgubWF4KC1CcyxNYXRoLm1pbihCcyxlKSk7dmFyIHI9Yyh0LGUpO2lmKG0mJnYucHVzaChbdCxlXSksQSl5PXQseD1lLGI9cixBPSExLHImJihzLmxpbmVTdGFydCgpLHMucG9pbnQodCxlKSk7ZWxzZSBpZihyJiZNKXMucG9pbnQodCxlKTtlbHNle3ZhciBuPXthOnt4Ol8seTp3fSxiOnt4OnQseTplfX07UyhuKT8oTXx8KHMubGluZVN0YXJ0KCkscy5wb2ludChuLmEueCxuLmEueSkpLHMucG9pbnQobi5iLngsbi5iLnkpLHJ8fHMubGluZUVuZCgpLGs9ITEpOnImJihzLmxpbmVTdGFydCgpLHMucG9pbnQodCxlKSxrPSExKX1fPXQsdz1lLE09cn12YXIgZyxtLHYseSx4LGIsXyx3LE0sQSxrLFQ9cyxFPUZlKCksUz1IZSh0LGUscixuKSxMPXtwb2ludDpoLGxpbmVTdGFydDpmLGxpbmVFbmQ6ZCxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtzPUUsZz1bXSxtPVtdLGs9ITB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtzPVQsZz11by5tZXJnZShnKTt2YXIgZT1sKFt0LG5dKSxyPWsmJmUsaT1nLmxlbmd0aDsocnx8aSkmJihzLnBvbHlnb25TdGFydCgpLHImJihzLmxpbmVTdGFydCgpLHUobnVsbCxudWxsLDEscykscy5saW5lRW5kKCkpLGkmJkllKGcsYSxlLHUscykscy5wb2x5Z29uRW5kKCkpLGc9bT12PW51bGx9fTtyZXR1cm4gTH19ZnVuY3Rpb24gWGUodCl7dmFyIGU9MCxyPU5vLzMsbj1scih0KSxpPW4oZSxyKTtyZXR1cm4gaS5wYXJhbGxlbHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bihlPXRbMF0qTm8vMTgwLHI9dFsxXSpOby8xODApOltlL05vKjE4MCxyL05vKjE4MF19LGl9ZnVuY3Rpb24gWWUodCxlKXtmdW5jdGlvbiByKHQsZSl7dmFyIHI9TWF0aC5zcXJ0KGEtMippKk1hdGguc2luKGUpKS9pO3JldHVybltyKk1hdGguc2luKHQqPWkpLG8tcipNYXRoLmNvcyh0KV19dmFyIG49TWF0aC5zaW4odCksaT0obitNYXRoLnNpbihlKSkvMixhPTErbiooMippLW4pLG89TWF0aC5zcXJ0KGEpL2k7cmV0dXJuIHIuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9by1lO3JldHVybltNYXRoLmF0YW4yKHQscikvaSxudCgoYS0odCp0K3IqcikqaSppKS8oMippKSldfSxyfWZ1bmN0aW9uIFdlKCl7ZnVuY3Rpb24gdCh0LGUpe1ZzKz1pKnQtbiplLG49dCxpPWV9dmFyIGUscixuLGk7WXMucG9pbnQ9ZnVuY3Rpb24oYSxvKXtZcy5wb2ludD10LGU9bj1hLHI9aT1vfSxZcy5saW5lRW5kPWZ1bmN0aW9uKCl7dChlLHIpfX1mdW5jdGlvbiBaZSh0LGUpe3Q8cXMmJihxcz10KSx0PkdzJiYoR3M9dCksZTxIcyYmKEhzPWUpLGU+WHMmJihYcz1lKX1mdW5jdGlvbiBRZSgpe2Z1bmN0aW9uIHQodCxlKXtvLnB1c2goIk0iLHQsIiwiLGUsYSl9ZnVuY3Rpb24gZSh0LGUpe28ucHVzaCgiTSIsdCwiLCIsZSkscy5wb2ludD1yfWZ1bmN0aW9uIHIodCxlKXtvLnB1c2goIkwiLHQsIiwiLGUpfWZ1bmN0aW9uIG4oKXtzLnBvaW50PXR9ZnVuY3Rpb24gaSgpe28ucHVzaCgiWiIpfXZhciBhPUtlKDQuNSksbz1bXSxzPXtwb2ludDp0LGxpbmVTdGFydDpmdW5jdGlvbigpe3MucG9pbnQ9ZX0sbGluZUVuZDpuLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3MubGluZUVuZD1pfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7cy5saW5lRW5kPW4scy5wb2ludD10fSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4gYT1LZSh0KSxzfSxyZXN1bHQ6ZnVuY3Rpb24oKXtpZihvLmxlbmd0aCl7dmFyIHQ9by5qb2luKCIiKTtyZXR1cm4gbz1bXSx0fX19O3JldHVybiBzfWZ1bmN0aW9uIEtlKHQpe3JldHVybiJtMCwiK3QrImEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrLTIqdCsiYSIrdCsiLCIrdCsiIDAgMSwxIDAsIisyKnQrInoifWZ1bmN0aW9uICRlKHQsZSl7THMrPXQsenMrPWUsKytDc31mdW5jdGlvbiBKZSgpe2Z1bmN0aW9uIHQodCxuKXt2YXIgaT10LWUsYT1uLXIsbz1NYXRoLnNxcnQoaSppK2EqYSk7SXMrPW8qKGUrdCkvMixQcys9byoocituKS8yLERzKz1vLCRlKGU9dCxyPW4pfXZhciBlLHI7WnMucG9pbnQ9ZnVuY3Rpb24obixpKXtacy5wb2ludD10LCRlKGU9bixyPWkpfX1mdW5jdGlvbiB0cigpe1pzLnBvaW50PSRlfWZ1bmN0aW9uIGVyKCl7ZnVuY3Rpb24gdCh0LGUpe3ZhciByPXQtbixhPWUtaSxvPU1hdGguc3FydChyKnIrYSphKTtJcys9byoobit0KS8yLFBzKz1vKihpK2UpLzIsRHMrPW8sbz1pKnQtbiplLFJzKz1vKihuK3QpLE9zKz1vKihpK2UpLEZzKz0zKm8sJGUobj10LGk9ZSl9dmFyIGUscixuLGk7WnMucG9pbnQ9ZnVuY3Rpb24oYSxvKXtacy5wb2ludD10LCRlKGU9bj1hLHI9aT1vKX0sWnMubGluZUVuZD1mdW5jdGlvbigpe3QoZSxyKX19ZnVuY3Rpb24gcnIodCl7ZnVuY3Rpb24gZShlLHIpe3QubW92ZVRvKGUrbyxyKSx0LmFyYyhlLHIsbywwLEJvKX1mdW5jdGlvbiByKGUscil7dC5tb3ZlVG8oZSxyKSxzLnBvaW50PW59ZnVuY3Rpb24gbihlLHIpe3QubGluZVRvKGUscil9ZnVuY3Rpb24gaSgpe3MucG9pbnQ9ZX1mdW5jdGlvbiBhKCl7dC5jbG9zZVBhdGgoKX12YXIgbz00LjUscz17cG9pbnQ6ZSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtzLnBvaW50PXJ9LGxpbmVFbmQ6aSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtzLmxpbmVFbmQ9YX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3MubGluZUVuZD1pLHMucG9pbnQ9ZX0scG9pbnRSYWRpdXM6ZnVuY3Rpb24odCl7cmV0dXJuIG89dCxzfSxyZXN1bHQ6TX07cmV0dXJuIHN9ZnVuY3Rpb24gbnIodCl7ZnVuY3Rpb24gZSh0KXtyZXR1cm4ocz9uOnIpKHQpfWZ1bmN0aW9uIHIoZSl7cmV0dXJuIG9yKGUsZnVuY3Rpb24ocixuKXtyPXQocixuKSxlLnBvaW50KHJbMF0sclsxXSl9KX1mdW5jdGlvbiBuKGUpe2Z1bmN0aW9uIHIocixuKXtyPXQocixuKSxlLnBvaW50KHJbMF0sclsxXSl9ZnVuY3Rpb24gbigpe3g9TmFOLEEucG9pbnQ9YSxlLmxpbmVTdGFydCgpfWZ1bmN0aW9uIGEocixuKXt2YXIgYT12ZShbcixuXSksbz10KHIsbik7aSh4LGIseSxfLHcsTSx4PW9bMF0sYj1vWzFdLHk9cixfPWFbMF0sdz1hWzFdLE09YVsyXSxzLGUpLGUucG9pbnQoeCxiKX1mdW5jdGlvbiBvKCl7QS5wb2ludD1yLGUubGluZUVuZCgpfWZ1bmN0aW9uIGwoKXtuKCksQS5wb2ludD11LEEubGluZUVuZD1jfWZ1bmN0aW9uIHUodCxlKXthKGg9dCxmPWUpLGQ9eCxwPWIsZz1fLG09dyx2PU0sQS5wb2ludD1hfWZ1bmN0aW9uIGMoKXtpKHgsYix5LF8sdyxNLGQscCxoLGcsbSx2LHMsZSksQS5saW5lRW5kPW8sbygpfXZhciBoLGYsZCxwLGcsbSx2LHkseCxiLF8sdyxNLEE9e3BvaW50OnIsbGluZVN0YXJ0Om4sbGluZUVuZDpvLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2UucG9seWdvblN0YXJ0KCksQS5saW5lU3RhcnQ9bH0scG9seWdvbkVuZDpmdW5jdGlvbigpe2UucG9seWdvbkVuZCgpLEEubGluZVN0YXJ0PW59fTtyZXR1cm4gQX1mdW5jdGlvbiBpKGUscixuLHMsbCx1LGMsaCxmLGQscCxnLG0sdil7dmFyIHk9Yy1lLHg9aC1yLGI9eSp5K3gqeDtpZihiPjQqYSYmbS0tKXt2YXIgXz1zK2Qsdz1sK3AsTT11K2csQT1NYXRoLnNxcnQoXypfK3cqdytNKk0pLGs9TWF0aC5hc2luKE0vPUEpLFQ9Ym8oYm8oTSktMSk8Rm98fGJvKG4tZik8Rm8/KG4rZikvMjpNYXRoLmF0YW4yKHcsXyksRT10KFQsayksUz1FWzBdLEw9RVsxXSx6PVMtZSxDPUwtcixJPXgqei15KkM7KEkqSS9iPmF8fGJvKCh5KnoreCpDKS9iLS41KT4uM3x8cypkK2wqcCt1Kmc8bykmJihpKGUscixuLHMsbCx1LFMsTCxULF8vPUEsdy89QSxNLG0sdiksdi5wb2ludChTLEwpLGkoUyxMLFQsXyx3LE0sYyxoLGYsZCxwLGcsbSx2KSl9fXZhciBhPS41LG89TWF0aC5jb3MoMzAqcW8pLHM9MTY7cmV0dXJuIGUucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPShhPXQqdCk+MCYmMTYsZSk6TWF0aC5zcXJ0KGEpfSxlfWZ1bmN0aW9uIGlyKHQpe3ZhciBlPW5yKGZ1bmN0aW9uKGUscil7cmV0dXJuIHQoW2UqSG8scipIb10pfSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB1cihlKHQpKX19ZnVuY3Rpb24gYXIodCl7dGhpcy5zdHJlYW09dH1mdW5jdGlvbiBvcih0LGUpe3JldHVybntwb2ludDplLHNwaGVyZTpmdW5jdGlvbigpe3Quc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3QubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0LmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dC5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3QucG9seWdvbkVuZCgpfX19ZnVuY3Rpb24gc3IodCl7cmV0dXJuIGxyKGZ1bmN0aW9uKCl7cmV0dXJuIHR9KSgpfWZ1bmN0aW9uIGxyKHQpe2Z1bmN0aW9uIGUodCl7cmV0dXJuIHQ9cyh0WzBdKnFvLHRbMV0qcW8pLFt0WzBdKmYrbCx1LXRbMV0qZl19ZnVuY3Rpb24gcih0KXtyZXR1cm4gdD1zLmludmVydCgodFswXS1sKS9mLCh1LXRbMV0pL2YpLHQmJlt0WzBdKkhvLHRbMV0qSG9dfWZ1bmN0aW9uIG4oKXtzPXplKG89ZnIodix5LHgpLGEpO3ZhciB0PWEoZyxtKTtyZXR1cm4gbD1kLXRbMF0qZix1PXArdFsxXSpmLGkoKX1mdW5jdGlvbiBpKCl7cmV0dXJuIGMmJihjLnZhbGlkPSExLGM9bnVsbCksZX12YXIgYSxvLHMsbCx1LGMsaD1ucihmdW5jdGlvbih0LGUpe3JldHVybiB0PWEodCxlKSxbdFswXSpmK2wsdS10WzFdKmZdfSksZj0xNTAsZD00ODAscD0yNTAsZz0wLG09MCx2PTAseT0wLHg9MCxfPU5zLHc9YixNPW51bGwsQT1udWxsO3JldHVybiBlLnN0cmVhbT1mdW5jdGlvbih0KXtyZXR1cm4gYyYmKGMudmFsaWQ9ITEpLGM9dXIoXyhvLGgodyh0KSkpKSxjLnZhbGlkPSEwLGN9LGUuY2xpcEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhfPW51bGw9PXQ/KE09dCxOcyk6cWUoKE09K3QpKnFvKSxpKCkpOk19LGUuY2xpcEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oQT10LHc9dD9HZSh0WzBdWzBdLHRbMF1bMV0sdFsxXVswXSx0WzFdWzFdKTpiLGkoKSk6QX0sZS5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0rdCxuKCkpOmZ9LGUudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPSt0WzBdLHA9K3RbMV0sbigpKTpbZCxwXX0sZS5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9dFswXSUzNjAqcW8sbT10WzFdJTM2MCpxbyxuKCkpOltnKkhvLG0qSG9dfSxlLnJvdGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj10WzBdJTM2MCpxbyx5PXRbMV0lMzYwKnFvLHg9dC5sZW5ndGg+Mj90WzJdJTM2MCpxbzowLG4oKSk6W3YqSG8seSpIbyx4KkhvXX0sdW8ucmViaW5kKGUsaCwicHJlY2lzaW9uIiksZnVuY3Rpb24oKXtyZXR1cm4gYT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlLmludmVydD1hLmludmVydCYmcixuKCl9fWZ1bmN0aW9uIHVyKHQpe3JldHVybiBvcih0LGZ1bmN0aW9uKGUscil7dC5wb2ludChlKnFvLHIqcW8pfSl9ZnVuY3Rpb24gY3IodCxlKXtyZXR1cm5bdCxlXX1mdW5jdGlvbiBocih0LGUpe3JldHVyblt0Pk5vP3QtQm86dDwtTm8/dCtCbzp0LGVdfWZ1bmN0aW9uIGZyKHQsZSxyKXtyZXR1cm4gdD9lfHxyP3plKHByKHQpLGdyKGUscikpOnByKHQpOmV8fHI/Z3IoZSxyKTpocn1mdW5jdGlvbiBkcih0KXtyZXR1cm4gZnVuY3Rpb24oZSxyKXtyZXR1cm4gZSs9dCxbZT5Obz9lLUJvOmU8LU5vP2UrQm86ZSxyXX19ZnVuY3Rpb24gcHIodCl7dmFyIGU9ZHIodCk7cmV0dXJuIGUuaW52ZXJ0PWRyKC10KSxlfWZ1bmN0aW9uIGdyKHQsZSl7ZnVuY3Rpb24gcih0LGUpe3ZhciByPU1hdGguY29zKGUpLHM9TWF0aC5jb3ModCkqcixsPU1hdGguc2luKHQpKnIsdT1NYXRoLnNpbihlKSxjPXUqbitzKmk7cmV0dXJuW01hdGguYXRhbjIobCphLWMqbyxzKm4tdSppKSxudChjKmErbCpvKV19dmFyIG49TWF0aC5jb3ModCksaT1NYXRoLnNpbih0KSxhPU1hdGguY29zKGUpLG89TWF0aC5zaW4oZSk7cmV0dXJuIHIuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9TWF0aC5jb3MoZSkscz1NYXRoLmNvcyh0KSpyLGw9TWF0aC5zaW4odCkqcix1PU1hdGguc2luKGUpLGM9dSphLWwqbztyZXR1cm5bTWF0aC5hdGFuMihsKmErdSpvLHMqbitjKmkpLG50KGMqbi1zKmkpXX0scn1mdW5jdGlvbiBtcih0LGUpe3ZhciByPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIGZ1bmN0aW9uKGksYSxvLHMpe3ZhciBsPW8qZTtudWxsIT1pPyhpPXZyKHIsaSksYT12cihyLGEpLChvPjA/aTxhOmk+YSkmJihpKz1vKkJvKSk6KGk9dCtvKkJvLGE9dC0uNSpsKTtmb3IodmFyIHUsYz1pO28+MD9jPmE6YzxhO2MtPWwpcy5wb2ludCgodT1NZShbciwtbipNYXRoLmNvcyhjKSwtbipNYXRoLnNpbihjKV0pKVswXSx1WzFdKX19ZnVuY3Rpb24gdnIodCxlKXt2YXIgcj12ZShlKTtyWzBdLT10LHdlKHIpO3ZhciBuPXJ0KC1yWzFdKTtyZXR1cm4oKC1yWzJdPDA/LW46bikrMipNYXRoLlBJLUZvKSUoMipNYXRoLlBJKX1mdW5jdGlvbiB5cih0LGUscil7dmFyIG49dW8ucmFuZ2UodCxlLUZvLHIpLmNvbmNhdChlKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4ubWFwKGZ1bmN0aW9uKGUpe3JldHVyblt0LGVdfSl9fWZ1bmN0aW9uIHhyKHQsZSxyKXt2YXIgbj11by5yYW5nZSh0LGUtRm8scikuY29uY2F0KGUpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuW2UsdF19KX19ZnVuY3Rpb24gYnIodCl7cmV0dXJuIHQuc291cmNlfWZ1bmN0aW9uIF9yKHQpe3JldHVybiB0LnRhcmdldH1mdW5jdGlvbiB3cih0LGUscixuKXt2YXIgaT1NYXRoLmNvcyhlKSxhPU1hdGguc2luKGUpLG89TWF0aC5jb3Mobikscz1NYXRoLnNpbihuKSxsPWkqTWF0aC5jb3ModCksdT1pKk1hdGguc2luKHQpLGM9bypNYXRoLmNvcyhyKSxoPW8qTWF0aC5zaW4ociksZj0yKk1hdGguYXNpbihNYXRoLnNxcnQoc3Qobi1lKStpKm8qc3Qoci10KSkpLGQ9MS9NYXRoLnNpbihmKSxwPWY/ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5zaW4odCo9ZikqZCxyPU1hdGguc2luKGYtdCkqZCxuPXIqbCtlKmMsaT1yKnUrZSpoLG89ciphK2UqcztyZXR1cm5bTWF0aC5hdGFuMihpLG4pKkhvLE1hdGguYXRhbjIobyxNYXRoLnNxcnQobipuK2kqaSkpKkhvXX06ZnVuY3Rpb24oKXtyZXR1cm5bdCpIbyxlKkhvXX07cmV0dXJuIHAuZGlzdGFuY2U9ZixwfWZ1bmN0aW9uIE1yKCl7ZnVuY3Rpb24gdCh0LGkpe3ZhciBhPU1hdGguc2luKGkqPXFvKSxvPU1hdGguY29zKGkpLHM9Ym8oKHQqPXFvKS1lKSxsPU1hdGguY29zKHMpO1FzKz1NYXRoLmF0YW4yKE1hdGguc3FydCgocz1vKk1hdGguc2luKHMpKSpzKyhzPW4qYS1yKm8qbCkqcyksciphK24qbypsKSxlPXQscj1hLG49b312YXIgZSxyLG47S3MucG9pbnQ9ZnVuY3Rpb24oaSxhKXtlPWkqcW8scj1NYXRoLnNpbihhKj1xbyksbj1NYXRoLmNvcyhhKSxLcy5wb2ludD10fSxLcy5saW5lRW5kPWZ1bmN0aW9uKCl7S3MucG9pbnQ9S3MubGluZUVuZD1NfX1mdW5jdGlvbiBBcih0LGUpe2Z1bmN0aW9uIHIoZSxyKXt2YXIgbj1NYXRoLmNvcyhlKSxpPU1hdGguY29zKHIpLGE9dChuKmkpO3JldHVyblthKmkqTWF0aC5zaW4oZSksYSpNYXRoLnNpbihyKV19cmV0dXJuIHIuaW52ZXJ0PWZ1bmN0aW9uKHQscil7dmFyIG49TWF0aC5zcXJ0KHQqdCtyKnIpLGk9ZShuKSxhPU1hdGguc2luKGkpLG89TWF0aC5jb3MoaSk7cmV0dXJuW01hdGguYXRhbjIodCphLG4qbyksTWF0aC5hc2luKG4mJnIqYS9uKV19LHJ9ZnVuY3Rpb24ga3IodCxlKXtmdW5jdGlvbiByKHQsZSl7bz4wP2U8LVZvK0ZvJiYoZT0tVm8rRm8pOmU+Vm8tRm8mJihlPVZvLUZvKTt2YXIgcj1vL01hdGgucG93KGkoZSksYSk7cmV0dXJuW3IqTWF0aC5zaW4oYSp0KSxvLXIqTWF0aC5jb3MoYSp0KV19dmFyIG49TWF0aC5jb3ModCksaT1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC50YW4oTm8vNCt0LzIpfSxhPXQ9PT1lP01hdGguc2luKHQpOk1hdGgubG9nKG4vTWF0aC5jb3MoZSkpL01hdGgubG9nKGkoZSkvaSh0KSksbz1uKk1hdGgucG93KGkodCksYSkvYTtyZXR1cm4gYT8oci5pbnZlcnQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1vLWUsbj10dChhKSpNYXRoLnNxcnQodCp0K3Iqcik7cmV0dXJuW01hdGguYXRhbjIodCxyKS9hLDIqTWF0aC5hdGFuKE1hdGgucG93KG8vbiwxL2EpKS1Wb119LHIpOkVyfWZ1bmN0aW9uIFRyKHQsZSl7ZnVuY3Rpb24gcih0LGUpe3ZhciByPWEtZTtyZXR1cm5bcipNYXRoLnNpbihpKnQpLGEtcipNYXRoLmNvcyhpKnQpXX12YXIgbj1NYXRoLmNvcyh0KSxpPXQ9PT1lP01hdGguc2luKHQpOihuLU1hdGguY29zKGUpKS8oZS10KSxhPW4vaSt0O3JldHVybiBibyhpKTxGbz9jcjooci5pbnZlcnQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1hLWU7cmV0dXJuW01hdGguYXRhbjIodCxyKS9pLGEtdHQoaSkqTWF0aC5zcXJ0KHQqdCtyKnIpXX0scil9ZnVuY3Rpb24gRXIodCxlKXtyZXR1cm5bdCxNYXRoLmxvZyhNYXRoLnRhbihOby80K2UvMikpXX1mdW5jdGlvbiBTcih0KXt2YXIgZSxyPXNyKHQpLG49ci5zY2FsZSxpPXIudHJhbnNsYXRlLGE9ci5jbGlwRXh0ZW50O3JldHVybiByLnNjYWxlPWZ1bmN0aW9uKCl7dmFyIHQ9bi5hcHBseShyLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1yP2U/ci5jbGlwRXh0ZW50KG51bGwpOnI6dH0sci50cmFuc2xhdGU9ZnVuY3Rpb24oKXt2YXIgdD1pLmFwcGx5KHIsYXJndW1lbnRzKTtyZXR1cm4gdD09PXI/ZT9yLmNsaXBFeHRlbnQobnVsbCk6cjp0fSxyLmNsaXBFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIG89YS5hcHBseShyLGFyZ3VtZW50cyk7aWYobz09PXIpe2lmKGU9bnVsbD09dCl7dmFyIHM9Tm8qbigpLGw9aSgpO2EoW1tsWzBdLXMsbFsxXS1zXSxbbFswXStzLGxbMV0rc11dKX19ZWxzZSBlJiYobz1udWxsKTtyZXR1cm4gb30sci5jbGlwRXh0ZW50KG51bGwpfWZ1bmN0aW9uIExyKHQsZSl7cmV0dXJuW01hdGgubG9nKE1hdGgudGFuKE5vLzQrZS8yKSksLXRdfWZ1bmN0aW9uIHpyKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIENyKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIElyKHQpe2Zvcih2YXIgZT10Lmxlbmd0aCxyPVswLDFdLG49MixpPTI7aTxlO2krKyl7Zm9yKDtuPjEmJmV0KHRbcltuLTJdXSx0W3Jbbi0xXV0sdFtpXSk8PTA7KS0tbjtyW24rK109aX1yZXR1cm4gci5zbGljZSgwLG4pfWZ1bmN0aW9uIFByKHQsZSl7cmV0dXJuIHRbMF0tZVswXXx8dFsxXS1lWzFdfWZ1bmN0aW9uIERyKHQsZSxyKXtyZXR1cm4oclswXS1lWzBdKSoodFsxXS1lWzFdKTwoclsxXS1lWzFdKSoodFswXS1lWzBdKX1mdW5jdGlvbiBScih0LGUscixuKXt2YXIgaT10WzBdLGE9clswXSxvPWVbMF0taSxzPW5bMF0tYSxsPXRbMV0sdT1yWzFdLGM9ZVsxXS1sLGg9blsxXS11LGY9KHMqKGwtdSktaCooaS1hKSkvKGgqby1zKmMpO3JldHVybltpK2YqbyxsK2YqY119ZnVuY3Rpb24gT3IodCl7dmFyIGU9dFswXSxyPXRbdC5sZW5ndGgtMV07cmV0dXJuIShlWzBdLXJbMF18fGVbMV0tclsxXSl9ZnVuY3Rpb24gRnIoKXthbih0aGlzKSx0aGlzLmVkZ2U9dGhpcy5zaXRlPXRoaXMuY2lyY2xlPW51bGx9ZnVuY3Rpb24ganIodCl7dmFyIGU9dWwucG9wKCl8fG5ldyBGcjtyZXR1cm4gZS5zaXRlPXQsZX1mdW5jdGlvbiBOcih0KXtacih0KSxvbC5yZW1vdmUodCksdWwucHVzaCh0KSxhbih0KX1mdW5jdGlvbiBCcih0KXt2YXIgZT10LmNpcmNsZSxyPWUueCxuPWUuY3ksaT17eDpyLHk6bn0sYT10LlAsbz10Lk4scz1bdF07TnIodCk7Zm9yKHZhciBsPWE7bC5jaXJjbGUmJmJvKHItbC5jaXJjbGUueCk8Rm8mJmJvKG4tbC5jaXJjbGUuY3kpPEZvOylhPWwuUCxzLnVuc2hpZnQobCksTnIobCksbD1hO3MudW5zaGlmdChsKSxacihsKTtmb3IodmFyIHU9bzt1LmNpcmNsZSYmYm8oci11LmNpcmNsZS54KTxGbyYmYm8obi11LmNpcmNsZS5jeSk8Rm87KW89dS5OLHMucHVzaCh1KSxOcih1KSx1PW87cy5wdXNoKHUpLFpyKHUpO3ZhciBjLGg9cy5sZW5ndGg7Zm9yKGM9MTtjPGg7KytjKXU9c1tjXSxsPXNbYy0xXSxlbih1LmVkZ2UsbC5zaXRlLHUuc2l0ZSxpKTtsPXNbMF0sdT1zW2gtMV0sdS5lZGdlPUpyKGwuc2l0ZSx1LnNpdGUsbnVsbCxpKSxXcihsKSxXcih1KX1mdW5jdGlvbiBVcih0KXtmb3IodmFyIGUscixuLGksYT10Lngsbz10Lnkscz1vbC5fO3M7KWlmKG49VnIocyxvKS1hLG4+Rm8pcz1zLkw7ZWxzZXtpZihpPWEtcXIocyxvKSwhKGk+Rm8pKXtuPi1Gbz8oZT1zLlAscj1zKTppPi1Gbz8oZT1zLHI9cy5OKTplPXI9czticmVha31pZighcy5SKXtlPXM7YnJlYWt9cz1zLlJ9dmFyIGw9anIodCk7aWYob2wuaW5zZXJ0KGUsbCksZXx8cil7aWYoZT09PXIpcmV0dXJuIFpyKGUpLHI9anIoZS5zaXRlKSxvbC5pbnNlcnQobCxyKSxsLmVkZ2U9ci5lZGdlPUpyKGUuc2l0ZSxsLnNpdGUpLFdyKGUpLHZvaWQgV3Iocik7aWYoIXIpcmV0dXJuIHZvaWQobC5lZGdlPUpyKGUuc2l0ZSxsLnNpdGUpKTtacihlKSxacihyKTt2YXIgdT1lLnNpdGUsYz11LngsaD11LnksZj10LngtYyxkPXQueS1oLHA9ci5zaXRlLGc9cC54LWMsbT1wLnktaCx2PTIqKGYqbS1kKmcpLHk9ZipmK2QqZCx4PWcqZyttKm0sYj17eDoobSp5LWQqeCkvditjLHk6KGYqeC1nKnkpL3YraH07ZW4oci5lZGdlLHUscCxiKSxsLmVkZ2U9SnIodSx0LG51bGwsYiksci5lZGdlPUpyKHQscCxudWxsLGIpLFdyKGUpLFdyKHIpfX1mdW5jdGlvbiBWcih0LGUpe3ZhciByPXQuc2l0ZSxuPXIueCxpPXIueSxhPWktZTtpZighYSlyZXR1cm4gbjt2YXIgbz10LlA7aWYoIW8pcmV0dXJuLSgxLzApO3I9by5zaXRlO3ZhciBzPXIueCxsPXIueSx1PWwtZTtpZighdSlyZXR1cm4gczt2YXIgYz1zLW4saD0xL2EtMS91LGY9Yy91O3JldHVybiBoPygtZitNYXRoLnNxcnQoZipmLTIqaCooYypjLygtMip1KS1sK3UvMitpLWEvMikpKS9oK246KG4rcykvMn1mdW5jdGlvbiBxcih0LGUpe3ZhciByPXQuTjtpZihyKXJldHVybiBWcihyLGUpO3ZhciBuPXQuc2l0ZTtyZXR1cm4gbi55PT09ZT9uLng6MS8wfWZ1bmN0aW9uIEhyKHQpe3RoaXMuc2l0ZT10LHRoaXMuZWRnZXM9W119ZnVuY3Rpb24gR3IodCl7Zm9yKHZhciBlLHIsbixpLGEsbyxzLGwsdSxjLGg9dFswXVswXSxmPXRbMV1bMF0sZD10WzBdWzFdLHA9dFsxXVsxXSxnPWFsLG09Zy5sZW5ndGg7bS0tOylpZihhPWdbbV0sYSYmYS5wcmVwYXJlKCkpZm9yKHM9YS5lZGdlcyxsPXMubGVuZ3RoLG89MDtvPGw7KWM9c1tvXS5lbmQoKSxuPWMueCxpPWMueSx1PXNbKytvJWxdLnN0YXJ0KCksZT11Lngscj11LnksKGJvKG4tZSk+Rm98fGJvKGktcik+Rm8pJiYocy5zcGxpY2UobywwLG5ldyBybih0bihhLnNpdGUsYyxibyhuLWgpPEZvJiZwLWk+Rm8/e3g6aCx5OmJvKGUtaCk8Rm8/cjpwfTpibyhpLXApPEZvJiZmLW4+Rm8/e3g6Ym8oci1wKTxGbz9lOmYseTpwfTpibyhuLWYpPEZvJiZpLWQ+Rm8/e3g6Zix5OmJvKGUtZik8Rm8/cjpkfTpibyhpLWQpPEZvJiZuLWg+Rm8/e3g6Ym8oci1kKTxGbz9lOmgseTpkfTpudWxsKSxhLnNpdGUsbnVsbCkpLCsrbCl9ZnVuY3Rpb24gWHIodCxlKXtyZXR1cm4gZS5hbmdsZS10LmFuZ2xlfWZ1bmN0aW9uIFlyKCl7YW4odGhpcyksdGhpcy54PXRoaXMueT10aGlzLmFyYz10aGlzLnNpdGU9dGhpcy5jeT1udWxsfWZ1bmN0aW9uIFdyKHQpe3ZhciBlPXQuUCxyPXQuTjtpZihlJiZyKXt2YXIgbj1lLnNpdGUsaT10LnNpdGUsYT1yLnNpdGU7aWYobiE9PWEpe3ZhciBvPWkueCxzPWkueSxsPW4ueC1vLHU9bi55LXMsYz1hLngtbyxoPWEueS1zLGY9MioobCpoLXUqYyk7aWYoIShmPj0tam8pKXt2YXIgZD1sKmwrdSp1LHA9YypjK2gqaCxnPShoKmQtdSpwKS9mLG09KGwqcC1jKmQpL2YsaD1tK3Msdj1jbC5wb3AoKXx8bmV3IFlyO3YuYXJjPXQsdi5zaXRlPWksdi54PWcrbyx2Lnk9aCtNYXRoLnNxcnQoZypnK20qbSksdi5jeT1oLHQuY2lyY2xlPXY7Zm9yKHZhciB5PW51bGwseD1sbC5fO3g7KWlmKHYueTx4Lnl8fHYueT09PXgueSYmdi54PD14Lngpe2lmKCF4Lkwpe3k9eC5QO2JyZWFrfXg9eC5MfWVsc2V7aWYoIXguUil7eT14O2JyZWFrfXg9eC5SfWxsLmluc2VydCh5LHYpLHl8fChzbD12KX19fX1mdW5jdGlvbiBacih0KXt2YXIgZT10LmNpcmNsZTtlJiYoZS5QfHwoc2w9ZS5OKSxsbC5yZW1vdmUoZSksY2wucHVzaChlKSxhbihlKSx0LmNpcmNsZT1udWxsKX1mdW5jdGlvbiBRcih0KXtmb3IodmFyIGUscj1pbCxuPUhlKHRbMF1bMF0sdFswXVsxXSx0WzFdWzBdLHRbMV1bMV0pLGk9ci5sZW5ndGg7aS0tOyllPXJbaV0sKCFLcihlLHQpfHwhbihlKXx8Ym8oZS5hLngtZS5iLngpPEZvJiZibyhlLmEueS1lLmIueSk8Rm8pJiYoZS5hPWUuYj1udWxsLHIuc3BsaWNlKGksMSkpfWZ1bmN0aW9uIEtyKHQsZSl7dmFyIHI9dC5iO2lmKHIpcmV0dXJuITA7dmFyIG4saSxhPXQuYSxvPWVbMF1bMF0scz1lWzFdWzBdLGw9ZVswXVsxXSx1PWVbMV1bMV0sYz10LmwsaD10LnIsZj1jLngsZD1jLnkscD1oLngsZz1oLnksbT0oZitwKS8yLHY9KGQrZykvMjtpZihnPT09ZCl7aWYobTxvfHxtPj1zKXJldHVybjtpZihmPnApe2lmKGEpe2lmKGEueT49dSlyZXR1cm59ZWxzZSBhPXt4Om0seTpsfTtyPXt4Om0seTp1fX1lbHNle2lmKGEpe2lmKGEueTxsKXJldHVybn1lbHNlIGE9e3g6bSx5OnV9O3I9e3g6bSx5Omx9fX1lbHNlIGlmKG49KGYtcCkvKGctZCksaT12LW4qbSxuPC0xfHxuPjEpaWYoZj5wKXtpZihhKXtpZihhLnk+PXUpcmV0dXJufWVsc2UgYT17eDoobC1pKS9uLHk6bH07cj17eDoodS1pKS9uLHk6dX19ZWxzZXtpZihhKXtpZihhLnk8bClyZXR1cm59ZWxzZSBhPXt4Oih1LWkpL24seTp1fTtyPXt4OihsLWkpL24seTpsfX1lbHNlIGlmKGQ8Zyl7aWYoYSl7aWYoYS54Pj1zKXJldHVybn1lbHNlIGE9e3g6byx5Om4qbytpfTtyPXt4OnMseTpuKnMraX19ZWxzZXtpZihhKXtpZihhLng8bylyZXR1cm59ZWxzZSBhPXt4OnMseTpuKnMraX07cj17eDpvLHk6bipvK2l9fXJldHVybiB0LmE9YSx0LmI9ciwhMH1mdW5jdGlvbiAkcih0LGUpe3RoaXMubD10LHRoaXMucj1lLHRoaXMuYT10aGlzLmI9bnVsbH1mdW5jdGlvbiBKcih0LGUscixuKXt2YXIgaT1uZXcgJHIodCxlKTtyZXR1cm4gaWwucHVzaChpKSxyJiZlbihpLHQsZSxyKSxuJiZlbihpLGUsdCxuKSxhbFt0LmldLmVkZ2VzLnB1c2gobmV3IHJuKGksdCxlKSksYWxbZS5pXS5lZGdlcy5wdXNoKG5ldyBybihpLGUsdCkpLGl9ZnVuY3Rpb24gdG4odCxlLHIpe3ZhciBuPW5ldyAkcih0LG51bGwpO3JldHVybiBuLmE9ZSxuLmI9cixpbC5wdXNoKG4pLG59ZnVuY3Rpb24gZW4odCxlLHIsbil7dC5hfHx0LmI/dC5sPT09cj90LmI9bjp0LmE9bjoodC5hPW4sdC5sPWUsdC5yPXIpfWZ1bmN0aW9uIHJuKHQsZSxyKXt2YXIgbj10LmEsaT10LmI7dGhpcy5lZGdlPXQsdGhpcy5zaXRlPWUsdGhpcy5hbmdsZT1yP01hdGguYXRhbjIoci55LWUueSxyLngtZS54KTp0Lmw9PT1lP01hdGguYXRhbjIoaS54LW4ueCxuLnktaS55KTpNYXRoLmF0YW4yKG4ueC1pLngsaS55LW4ueSl9ZnVuY3Rpb24gbm4oKXt0aGlzLl89bnVsbH1mdW5jdGlvbiBhbih0KXt0LlU9dC5DPXQuTD10LlI9dC5QPXQuTj1udWxsfWZ1bmN0aW9uIG9uKHQsZSl7dmFyIHI9ZSxuPWUuUixpPXIuVTtpP2kuTD09PXI/aS5MPW46aS5SPW46dC5fPW4sbi5VPWksci5VPW4sci5SPW4uTCxyLlImJihyLlIuVT1yKSxuLkw9cn1mdW5jdGlvbiBzbih0LGUpe3ZhciByPWUsbj1lLkwsaT1yLlU7aT9pLkw9PT1yP2kuTD1uOmkuUj1uOnQuXz1uLG4uVT1pLHIuVT1uLHIuTD1uLlIsci5MJiYoci5MLlU9ciksbi5SPXJ9ZnVuY3Rpb24gbG4odCl7Zm9yKDt0Lkw7KXQ9dC5MO3JldHVybiB0fWZ1bmN0aW9uIHVuKHQsZSl7dmFyIHIsbixpLGE9dC5zb3J0KGNuKS5wb3AoKTtmb3IoaWw9W10sYWw9bmV3IEFycmF5KHQubGVuZ3RoKSxvbD1uZXcgbm4sbGw9bmV3IG5uOzspaWYoaT1zbCxhJiYoIWl8fGEueTxpLnl8fGEueT09PWkueSYmYS54PGkueCkpYS54PT09ciYmYS55PT09bnx8KGFsW2EuaV09bmV3IEhyKGEpLFVyKGEpLHI9YS54LG49YS55KSxhPXQucG9wKCk7ZWxzZXtpZighaSlicmVhaztCcihpLmFyYyl9ZSYmKFFyKGUpLEdyKGUpKTt2YXIgbz17Y2VsbHM6YWwsZWRnZXM6aWx9O3JldHVybiBvbD1sbD1pbD1hbD1udWxsLG99ZnVuY3Rpb24gY24odCxlKXtyZXR1cm4gZS55LXQueXx8ZS54LXQueH1mdW5jdGlvbiBobih0LGUscil7cmV0dXJuKHQueC1yLngpKihlLnktdC55KS0odC54LWUueCkqKHIueS10LnkpfWZ1bmN0aW9uIGZuKHQpe3JldHVybiB0Lnh9ZnVuY3Rpb24gZG4odCl7cmV0dXJuIHQueX1mdW5jdGlvbiBwbigpe3JldHVybntsZWFmOiEwLG5vZGVzOltdLHBvaW50Om51bGwseDpudWxsLHk6bnVsbH19ZnVuY3Rpb24gZ24odCxlLHIsbixpLGEpe2lmKCF0KGUscixuLGksYSkpe3ZhciBvPS41KihyK2kpLHM9LjUqKG4rYSksbD1lLm5vZGVzO2xbMF0mJmduKHQsbFswXSxyLG4sbyxzKSxsWzFdJiZnbih0LGxbMV0sbyxuLGkscyksbFsyXSYmZ24odCxsWzJdLHIscyxvLGEpLGxbM10mJmduKHQsbFszXSxvLHMsaSxhKX19ZnVuY3Rpb24gbW4odCxlLHIsbixpLGEsbyl7dmFyIHMsbD0xLzA7cmV0dXJuIGZ1bmN0aW9uIHQodSxjLGgsZixkKXtpZighKGM+YXx8aD5vfHxmPG58fGQ8aSkpe2lmKHA9dS5wb2ludCl7dmFyIHAsZz1lLXUueCxtPXItdS55LHY9ZypnK20qbTtpZih2PGwpe3ZhciB5PU1hdGguc3FydChsPXYpO249ZS15LGk9ci15LGE9ZSt5LG89cit5LHM9cH19Zm9yKHZhciB4PXUubm9kZXMsYj0uNSooYytmKSxfPS41KihoK2QpLHc9ZT49YixNPXI+PV8sQT1NPDwxfHcsaz1BKzQ7QTxrOysrQSlpZih1PXhbMyZBXSlzd2l0Y2goMyZBKXtjYXNlIDA6dCh1LGMsaCxiLF8pO2JyZWFrO2Nhc2UgMTp0KHUsYixoLGYsXyk7YnJlYWs7Y2FzZSAyOnQodSxjLF8sYixkKTticmVhaztjYXNlIDM6dCh1LGIsXyxmLGQpfX19KHQsbixpLGEsbyksc31mdW5jdGlvbiB2bih0LGUpe3Q9dW8ucmdiKHQpLGU9dW8ucmdiKGUpO3ZhciByPXQucixuPXQuZyxpPXQuYixhPWUuci1yLG89ZS5nLW4scz1lLmItaTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIiMiK3d0KE1hdGgucm91bmQocithKnQpKSt3dChNYXRoLnJvdW5kKG4rbyp0KSkrd3QoTWF0aC5yb3VuZChpK3MqdCkpfX1mdW5jdGlvbiB5bih0LGUpe3ZhciByLG49e30saT17fTtmb3IociBpbiB0KXIgaW4gZT9uW3JdPV9uKHRbcl0sZVtyXSk6aVtyXT10W3JdO2ZvcihyIGluIGUpciBpbiB0fHwoaVtyXT1lW3JdKTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKHIgaW4gbilpW3JdPW5bcl0odCk7cmV0dXJuIGl9fWZ1bmN0aW9uIHhuKHQsZSl7cmV0dXJuIHQ9K3QsZT0rZSxmdW5jdGlvbihyKXtyZXR1cm4gdCooMS1yKStlKnJ9fWZ1bmN0aW9uIGJuKHQsZSl7dmFyIHIsbixpLGE9ZmwubGFzdEluZGV4PWRsLmxhc3RJbmRleD0wLG89LTEscz1bXSxsPVtdO2Zvcih0Kz0iIixlKz0iIjsocj1mbC5leGVjKHQpKSYmKG49ZGwuZXhlYyhlKSk7KShpPW4uaW5kZXgpPmEmJihpPWUuc2xpY2UoYSxpKSxzW29dP3Nbb10rPWk6c1srK29dPWkpLChyPXJbMF0pPT09KG49blswXSk/c1tvXT9zW29dKz1uOnNbKytvXT1uOihzWysrb109bnVsbCxsLnB1c2goe2k6byx4OnhuKHIsbil9KSksYT1kbC5sYXN0SW5kZXg7cmV0dXJuIGE8ZS5sZW5ndGgmJihpPWUuc2xpY2UoYSksc1tvXT9zW29dKz1pOnNbKytvXT1pKSxzLmxlbmd0aDwyP2xbMF0/KGU9bFswXS54LGZ1bmN0aW9uKHQpe3JldHVybiBlKHQpKyIifSk6ZnVuY3Rpb24oKXtyZXR1cm4gZX06KGU9bC5sZW5ndGgsZnVuY3Rpb24odCl7Zm9yKHZhciByLG49MDtuPGU7KytuKXNbKHI9bFtuXSkuaV09ci54KHQpO3JldHVybiBzLmpvaW4oIiIpfSl9ZnVuY3Rpb24gX24odCxlKXtmb3IodmFyIHIsbj11by5pbnRlcnBvbGF0b3JzLmxlbmd0aDstLW4+PTAmJiEocj11by5pbnRlcnBvbGF0b3JzW25dKHQsZSkpOyk7cmV0dXJuIHJ9ZnVuY3Rpb24gd24odCxlKXt2YXIgcixuPVtdLGk9W10sYT10Lmxlbmd0aCxvPWUubGVuZ3RoLHM9TWF0aC5taW4odC5sZW5ndGgsZS5sZW5ndGgpO2ZvcihyPTA7cjxzOysrciluLnB1c2goX24odFtyXSxlW3JdKSk7Zm9yKDtyPGE7KytyKWlbcl09dFtyXTtmb3IoO3I8bzsrK3IpaVtyXT1lW3JdO3JldHVybiBmdW5jdGlvbih0KXtmb3Iocj0wO3I8czsrK3IpaVtyXT1uW3JdKHQpO3JldHVybiBpfX1mdW5jdGlvbiBNbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGU8PTA/MDplPj0xPzE6dChlKX19ZnVuY3Rpb24gQW4odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiAxLXQoMS1lKX19ZnVuY3Rpb24ga24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybi41KihlPC41P3QoMiplKToyLXQoMi0yKmUpKX19ZnVuY3Rpb24gVG4odCl7cmV0dXJuIHQqdH1mdW5jdGlvbiBFbih0KXtyZXR1cm4gdCp0KnR9ZnVuY3Rpb24gU24odCl7aWYodDw9MClyZXR1cm4gMDtpZih0Pj0xKXJldHVybiAxO3ZhciBlPXQqdCxyPWUqdDtyZXR1cm4gNCoodDwuNT9yOjMqKHQtZSkrci0uNzUpfWZ1bmN0aW9uIExuKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5wb3coZSx0KX19ZnVuY3Rpb24gem4odCl7cmV0dXJuIDEtTWF0aC5jb3ModCpWbyl9ZnVuY3Rpb24gQ24odCl7cmV0dXJuIE1hdGgucG93KDIsMTAqKHQtMSkpfWZ1bmN0aW9uIEluKHQpe3JldHVybiAxLU1hdGguc3FydCgxLXQqdCl9ZnVuY3Rpb24gUG4odCxlKXt2YXIgcjtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyJiYoZT0uNDUpLGFyZ3VtZW50cy5sZW5ndGg/cj1lL0JvKk1hdGguYXNpbigxL3QpOih0PTEscj1lLzQpLGZ1bmN0aW9uKG4pe3JldHVybiAxK3QqTWF0aC5wb3coMiwtMTAqbikqTWF0aC5zaW4oKG4tcikqQm8vZSl9fWZ1bmN0aW9uIERuKHQpe3JldHVybiB0fHwodD0xLjcwMTU4KSxmdW5jdGlvbihlKXtyZXR1cm4gZSplKigodCsxKSplLXQpfX1mdW5jdGlvbiBSbih0KXtyZXR1cm4gdDwxLzIuNzU/Ny41NjI1KnQqdDp0PDIvMi43NT83LjU2MjUqKHQtPTEuNS8yLjc1KSp0Ky43NTp0PDIuNS8yLjc1PzcuNTYyNSoodC09Mi4yNS8yLjc1KSp0Ky45Mzc1OjcuNTYyNSoodC09Mi42MjUvMi43NSkqdCsuOTg0Mzc1fWZ1bmN0aW9uIE9uKHQsZSl7dD11by5oY2wodCksZT11by5oY2woZSk7dmFyIHI9dC5oLG49dC5jLGk9dC5sLGE9ZS5oLXIsbz1lLmMtbixzPWUubC1pO3JldHVybiBpc05hTihvKSYmKG89MCxuPWlzTmFOKG4pP2UuYzpuKSxpc05hTihhKT8oYT0wLHI9aXNOYU4ocik/ZS5oOnIpOmE+MTgwP2EtPTM2MDphPC0xODAmJihhKz0zNjApLGZ1bmN0aW9uKHQpe3JldHVybiBmdChyK2EqdCxuK28qdCxpK3MqdCkrIiJ9fWZ1bmN0aW9uIEZuKHQsZSl7dD11by5oc2wodCksZT11by5oc2woZSk7dmFyIHI9dC5oLG49dC5zLGk9dC5sLGE9ZS5oLXIsbz1lLnMtbixzPWUubC1pO3JldHVybiBpc05hTihvKSYmKG89MCxuPWlzTmFOKG4pP2UuczpuKSxpc05hTihhKT8oYT0wLHI9aXNOYU4ocik/ZS5oOnIpOmE+MTgwP2EtPTM2MDphPC0xODAmJihhKz0zNjApLGZ1bmN0aW9uKHQpe3JldHVybiBjdChyK2EqdCxuK28qdCxpK3MqdCkrIiJ9fWZ1bmN0aW9uIGpuKHQsZSl7dD11by5sYWIodCksZT11by5sYWIoZSk7dmFyIHI9dC5sLG49dC5hLGk9dC5iLGE9ZS5sLXIsbz1lLmEtbixzPWUuYi1pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gcHQocithKnQsbitvKnQsaStzKnQpKyIifX1mdW5jdGlvbiBObih0LGUpe3JldHVybiBlLT10LGZ1bmN0aW9uKHIpe3JldHVybiBNYXRoLnJvdW5kKHQrZSpyKX19ZnVuY3Rpb24gQm4odCl7dmFyIGU9W3QuYSx0LmJdLHI9W3QuYyx0LmRdLG49Vm4oZSksaT1VbihlLHIpLGE9Vm4ocW4ocixlLC1pKSl8fDA7ZVswXSpyWzFdPHJbMF0qZVsxXSYmKGVbMF0qPS0xLGVbMV0qPS0xLG4qPS0xLGkqPS0xKSx0aGlzLnJvdGF0ZT0obj9NYXRoLmF0YW4yKGVbMV0sZVswXSk6TWF0aC5hdGFuMigtclswXSxyWzFdKSkqSG8sdGhpcy50cmFuc2xhdGU9W3QuZSx0LmZdLHRoaXMuc2NhbGU9W24sYV0sdGhpcy5za2V3PWE/TWF0aC5hdGFuMihpLGEpKkhvOjB9ZnVuY3Rpb24gVW4odCxlKXtyZXR1cm4gdFswXSplWzBdK3RbMV0qZVsxXX1mdW5jdGlvbiBWbih0KXt2YXIgZT1NYXRoLnNxcnQoVW4odCx0KSk7cmV0dXJuIGUmJih0WzBdLz1lLHRbMV0vPWUpLGV9ZnVuY3Rpb24gcW4odCxlLHIpe3JldHVybiB0WzBdKz1yKmVbMF0sdFsxXSs9ciplWzFdLHR9ZnVuY3Rpb24gSG4odCl7cmV0dXJuIHQubGVuZ3RoP3QucG9wKCkrIiwiOiIifWZ1bmN0aW9uIEduKHQsZSxyLG4pe2lmKHRbMF0hPT1lWzBdfHx0WzFdIT09ZVsxXSl7dmFyIGk9ci5wdXNoKCJ0cmFuc2xhdGUoIixudWxsLCIsIixudWxsLCIpIik7bi5wdXNoKHtpOmktNCx4OnhuKHRbMF0sZVswXSl9LHtpOmktMix4OnhuKHRbMV0sZVsxXSl9KX1lbHNlKGVbMF18fGVbMV0pJiZyLnB1c2goInRyYW5zbGF0ZSgiK2UrIikiKX1mdW5jdGlvbiBYbih0LGUscixuKXt0IT09ZT8odC1lPjE4MD9lKz0zNjA6ZS10PjE4MCYmKHQrPTM2MCksbi5wdXNoKHtpOnIucHVzaChIbihyKSsicm90YXRlKCIsbnVsbCwiKSIpLTIseDp4bih0LGUpfSkpOmUmJnIucHVzaChIbihyKSsicm90YXRlKCIrZSsiKSIpfWZ1bmN0aW9uIFluKHQsZSxyLG4pe3QhPT1lP24ucHVzaCh7aTpyLnB1c2goSG4ocikrInNrZXdYKCIsbnVsbCwiKSIpLTIseDp4bih0LGUpfSk6ZSYmci5wdXNoKEhuKHIpKyJza2V3WCgiK2UrIikiKX1mdW5jdGlvbiBXbih0LGUscixuKXtpZih0WzBdIT09ZVswXXx8dFsxXSE9PWVbMV0pe3ZhciBpPXIucHVzaChIbihyKSsic2NhbGUoIixudWxsLCIsIixudWxsLCIpIik7bi5wdXNoKHtpOmktNCx4OnhuKHRbMF0sZVswXSl9LHtpOmktMix4OnhuKHRbMV0sZVsxXSl9KX1lbHNlIDE9PT1lWzBdJiYxPT09ZVsxXXx8ci5wdXNoKEhuKHIpKyJzY2FsZSgiK2UrIikiKX1mdW5jdGlvbiBabih0LGUpe3ZhciByPVtdLG49W107cmV0dXJuIHQ9dW8udHJhbnNmb3JtKHQpLGU9dW8udHJhbnNmb3JtKGUpLEduKHQudHJhbnNsYXRlLGUudHJhbnNsYXRlLHIsbiksWG4odC5yb3RhdGUsZS5yb3RhdGUscixuKSxZbih0LnNrZXcsZS5za2V3LHIsbiksV24odC5zY2FsZSxlLnNjYWxlLHIsbiksdD1lPW51bGwsZnVuY3Rpb24odCl7Zm9yKHZhciBlLGk9LTEsYT1uLmxlbmd0aDsrK2k8YTspclsoZT1uW2ldKS5pXT1lLngodCk7cmV0dXJuIHIuam9pbigiIil9fWZ1bmN0aW9uIFFuKHQsZSl7cmV0dXJuIGU9KGUtPXQ9K3QpfHwxL2UsZnVuY3Rpb24ocil7cmV0dXJuKHItdCkvZX19ZnVuY3Rpb24gS24odCxlKXtyZXR1cm4gZT0oZS09dD0rdCl8fDEvZSxmdW5jdGlvbihyKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbigxLChyLXQpL2UpKX19ZnVuY3Rpb24gJG4odCl7Zm9yKHZhciBlPXQuc291cmNlLHI9dC50YXJnZXQsbj10aShlLHIpLGk9W2VdO2UhPT1uOyllPWUucGFyZW50LGkucHVzaChlKTtmb3IodmFyIGE9aS5sZW5ndGg7ciE9PW47KWkuc3BsaWNlKGEsMCxyKSxyPXIucGFyZW50O3JldHVybiBpfWZ1bmN0aW9uIEpuKHQpe2Zvcih2YXIgZT1bXSxyPXQucGFyZW50O251bGwhPXI7KWUucHVzaCh0KSx0PXIscj1yLnBhcmVudDtyZXR1cm4gZS5wdXNoKHQpLGV9ZnVuY3Rpb24gdGkodCxlKXtpZih0PT09ZSlyZXR1cm4gdDtmb3IodmFyIHI9Sm4odCksbj1KbihlKSxpPXIucG9wKCksYT1uLnBvcCgpLG89bnVsbDtpPT09YTspbz1pLGk9ci5wb3AoKSxhPW4ucG9wKCk7cmV0dXJuIG99ZnVuY3Rpb24gZWkodCl7dC5maXhlZHw9Mn1mdW5jdGlvbiByaSh0KXt0LmZpeGVkJj0tN31mdW5jdGlvbiBuaSh0KXt0LmZpeGVkfD00LHQucHg9dC54LHQucHk9dC55fWZ1bmN0aW9uIGlpKHQpe3QuZml4ZWQmPS01fWZ1bmN0aW9uIGFpKHQsZSxyKXt2YXIgbj0wLGk9MDtpZih0LmNoYXJnZT0wLCF0LmxlYWYpZm9yKHZhciBhLG89dC5ub2RlcyxzPW8ubGVuZ3RoLGw9LTE7KytsPHM7KWE9b1tsXSxudWxsIT1hJiYoYWkoYSxlLHIpLHQuY2hhcmdlKz1hLmNoYXJnZSxuKz1hLmNoYXJnZSphLmN4LGkrPWEuY2hhcmdlKmEuY3kpO2lmKHQucG9pbnQpe3QubGVhZnx8KHQucG9pbnQueCs9TWF0aC5yYW5kb20oKS0uNSx0LnBvaW50LnkrPU1hdGgucmFuZG9tKCktLjUpOwp2YXIgdT1lKnJbdC5wb2ludC5pbmRleF07dC5jaGFyZ2UrPXQucG9pbnRDaGFyZ2U9dSxuKz11KnQucG9pbnQueCxpKz11KnQucG9pbnQueX10LmN4PW4vdC5jaGFyZ2UsdC5jeT1pL3QuY2hhcmdlfWZ1bmN0aW9uIG9pKHQsZSl7cmV0dXJuIHVvLnJlYmluZCh0LGUsInNvcnQiLCJjaGlsZHJlbiIsInZhbHVlIiksdC5ub2Rlcz10LHQubGlua3M9ZmksdH1mdW5jdGlvbiBzaSh0LGUpe2Zvcih2YXIgcj1bdF07bnVsbCE9KHQ9ci5wb3AoKSk7KWlmKGUodCksKGk9dC5jaGlsZHJlbikmJihuPWkubGVuZ3RoKSlmb3IodmFyIG4saTstLW4+PTA7KXIucHVzaChpW25dKX1mdW5jdGlvbiBsaSh0LGUpe2Zvcih2YXIgcj1bdF0sbj1bXTtudWxsIT0odD1yLnBvcCgpKTspaWYobi5wdXNoKHQpLChhPXQuY2hpbGRyZW4pJiYoaT1hLmxlbmd0aCkpZm9yKHZhciBpLGEsbz0tMTsrK288aTspci5wdXNoKGFbb10pO2Zvcig7bnVsbCE9KHQ9bi5wb3AoKSk7KWUodCl9ZnVuY3Rpb24gdWkodCl7cmV0dXJuIHQuY2hpbGRyZW59ZnVuY3Rpb24gY2kodCl7cmV0dXJuIHQudmFsdWV9ZnVuY3Rpb24gaGkodCxlKXtyZXR1cm4gZS52YWx1ZS10LnZhbHVlfWZ1bmN0aW9uIGZpKHQpe3JldHVybiB1by5tZXJnZSh0Lm1hcChmdW5jdGlvbih0KXtyZXR1cm4odC5jaGlsZHJlbnx8W10pLm1hcChmdW5jdGlvbihlKXtyZXR1cm57c291cmNlOnQsdGFyZ2V0OmV9fSl9KSl9ZnVuY3Rpb24gZGkodCl7cmV0dXJuIHQueH1mdW5jdGlvbiBwaSh0KXtyZXR1cm4gdC55fWZ1bmN0aW9uIGdpKHQsZSxyKXt0LnkwPWUsdC55PXJ9ZnVuY3Rpb24gbWkodCl7cmV0dXJuIHVvLnJhbmdlKHQubGVuZ3RoKX1mdW5jdGlvbiB2aSh0KXtmb3IodmFyIGU9LTEscj10WzBdLmxlbmd0aCxuPVtdOysrZTxyOyluW2VdPTA7cmV0dXJuIG59ZnVuY3Rpb24geWkodCl7Zm9yKHZhciBlLHI9MSxuPTAsaT10WzBdWzFdLGE9dC5sZW5ndGg7cjxhOysrcikoZT10W3JdWzFdKT5pJiYobj1yLGk9ZSk7cmV0dXJuIG59ZnVuY3Rpb24geGkodCl7cmV0dXJuIHQucmVkdWNlKGJpLDApfWZ1bmN0aW9uIGJpKHQsZSl7cmV0dXJuIHQrZVsxXX1mdW5jdGlvbiBfaSh0LGUpe3JldHVybiB3aSh0LE1hdGguY2VpbChNYXRoLmxvZyhlLmxlbmd0aCkvTWF0aC5MTjIrMSkpfWZ1bmN0aW9uIHdpKHQsZSl7Zm9yKHZhciByPS0xLG49K3RbMF0saT0odFsxXS1uKS9lLGE9W107KytyPD1lOylhW3JdPWkqcituO3JldHVybiBhfWZ1bmN0aW9uIE1pKHQpe3JldHVyblt1by5taW4odCksdW8ubWF4KHQpXX1mdW5jdGlvbiBBaSh0LGUpe3JldHVybiB0LnZhbHVlLWUudmFsdWV9ZnVuY3Rpb24ga2kodCxlKXt2YXIgcj10Ll9wYWNrX25leHQ7dC5fcGFja19uZXh0PWUsZS5fcGFja19wcmV2PXQsZS5fcGFja19uZXh0PXIsci5fcGFja19wcmV2PWV9ZnVuY3Rpb24gVGkodCxlKXt0Ll9wYWNrX25leHQ9ZSxlLl9wYWNrX3ByZXY9dH1mdW5jdGlvbiBFaSh0LGUpe3ZhciByPWUueC10Lngsbj1lLnktdC55LGk9dC5yK2UucjtyZXR1cm4uOTk5KmkqaT5yKnIrbipufWZ1bmN0aW9uIFNpKHQpe2Z1bmN0aW9uIGUodCl7Yz1NYXRoLm1pbih0LngtdC5yLGMpLGg9TWF0aC5tYXgodC54K3QucixoKSxmPU1hdGgubWluKHQueS10LnIsZiksZD1NYXRoLm1heCh0LnkrdC5yLGQpfWlmKChyPXQuY2hpbGRyZW4pJiYodT1yLmxlbmd0aCkpe3ZhciByLG4saSxhLG8scyxsLHUsYz0xLzAsaD0tKDEvMCksZj0xLzAsZD0tKDEvMCk7aWYoci5mb3JFYWNoKExpKSxuPXJbMF0sbi54PS1uLnIsbi55PTAsZShuKSx1PjEmJihpPXJbMV0saS54PWkucixpLnk9MCxlKGkpLHU+MikpZm9yKGE9clsyXSxJaShuLGksYSksZShhKSxraShuLGEpLG4uX3BhY2tfcHJldj1hLGtpKGEsaSksaT1uLl9wYWNrX25leHQsbz0zO288dTtvKyspe0lpKG4saSxhPXJbb10pO3ZhciBwPTAsZz0xLG09MTtmb3Iocz1pLl9wYWNrX25leHQ7cyE9PWk7cz1zLl9wYWNrX25leHQsZysrKWlmKEVpKHMsYSkpe3A9MTticmVha31pZigxPT1wKWZvcihsPW4uX3BhY2tfcHJldjtsIT09cy5fcGFja19wcmV2JiYhRWkobCxhKTtsPWwuX3BhY2tfcHJldixtKyspO3A/KGc8bXx8Zz09bSYmaS5yPG4ucj9UaShuLGk9cyk6VGkobj1sLGkpLG8tLSk6KGtpKG4sYSksaT1hLGUoYSkpfXZhciB2PShjK2gpLzIseT0oZitkKS8yLHg9MDtmb3Iobz0wO288dTtvKyspYT1yW29dLGEueC09dixhLnktPXkseD1NYXRoLm1heCh4LGEucitNYXRoLnNxcnQoYS54KmEueCthLnkqYS55KSk7dC5yPXgsci5mb3JFYWNoKHppKX19ZnVuY3Rpb24gTGkodCl7dC5fcGFja19uZXh0PXQuX3BhY2tfcHJldj10fWZ1bmN0aW9uIHppKHQpe2RlbGV0ZSB0Ll9wYWNrX25leHQsZGVsZXRlIHQuX3BhY2tfcHJldn1mdW5jdGlvbiBDaSh0LGUscixuKXt2YXIgaT10LmNoaWxkcmVuO2lmKHQueD1lKz1uKnQueCx0Lnk9cis9bip0LnksdC5yKj1uLGkpZm9yKHZhciBhPS0xLG89aS5sZW5ndGg7KythPG87KUNpKGlbYV0sZSxyLG4pfWZ1bmN0aW9uIElpKHQsZSxyKXt2YXIgbj10LnIrci5yLGk9ZS54LXQueCxhPWUueS10Lnk7aWYobiYmKGl8fGEpKXt2YXIgbz1lLnIrci5yLHM9aSppK2EqYTtvKj1vLG4qPW47dmFyIGw9LjUrKG4tbykvKDIqcyksdT1NYXRoLnNxcnQoTWF0aC5tYXgoMCwyKm8qKG4rcyktKG4tPXMpKm4tbypvKSkvKDIqcyk7ci54PXQueCtsKmkrdSphLHIueT10LnkrbCphLXUqaX1lbHNlIHIueD10LngrbixyLnk9dC55fWZ1bmN0aW9uIFBpKHQsZSl7cmV0dXJuIHQucGFyZW50PT1lLnBhcmVudD8xOjJ9ZnVuY3Rpb24gRGkodCl7dmFyIGU9dC5jaGlsZHJlbjtyZXR1cm4gZS5sZW5ndGg/ZVswXTp0LnR9ZnVuY3Rpb24gUmkodCl7dmFyIGUscj10LmNoaWxkcmVuO3JldHVybihlPXIubGVuZ3RoKT9yW2UtMV06dC50fWZ1bmN0aW9uIE9pKHQsZSxyKXt2YXIgbj1yLyhlLmktdC5pKTtlLmMtPW4sZS5zKz1yLHQuYys9bixlLnorPXIsZS5tKz1yfWZ1bmN0aW9uIEZpKHQpe2Zvcih2YXIgZSxyPTAsbj0wLGk9dC5jaGlsZHJlbixhPWkubGVuZ3RoOy0tYT49MDspZT1pW2FdLGUueis9cixlLm0rPXIscis9ZS5zKyhuKz1lLmMpfWZ1bmN0aW9uIGppKHQsZSxyKXtyZXR1cm4gdC5hLnBhcmVudD09PWUucGFyZW50P3QuYTpyfWZ1bmN0aW9uIE5pKHQpe3JldHVybiAxK3VvLm1heCh0LGZ1bmN0aW9uKHQpe3JldHVybiB0Lnl9KX1mdW5jdGlvbiBCaSh0KXtyZXR1cm4gdC5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCtlLnh9LDApL3QubGVuZ3RofWZ1bmN0aW9uIFVpKHQpe3ZhciBlPXQuY2hpbGRyZW47cmV0dXJuIGUmJmUubGVuZ3RoP1VpKGVbMF0pOnR9ZnVuY3Rpb24gVmkodCl7dmFyIGUscj10LmNoaWxkcmVuO3JldHVybiByJiYoZT1yLmxlbmd0aCk/VmkocltlLTFdKTp0fWZ1bmN0aW9uIHFpKHQpe3JldHVybnt4OnQueCx5OnQueSxkeDp0LmR4LGR5OnQuZHl9fWZ1bmN0aW9uIEhpKHQsZSl7dmFyIHI9dC54K2VbM10sbj10LnkrZVswXSxpPXQuZHgtZVsxXS1lWzNdLGE9dC5keS1lWzBdLWVbMl07cmV0dXJuIGk8MCYmKHIrPWkvMixpPTApLGE8MCYmKG4rPWEvMixhPTApLHt4OnIseTpuLGR4OmksZHk6YX19ZnVuY3Rpb24gR2kodCl7dmFyIGU9dFswXSxyPXRbdC5sZW5ndGgtMV07cmV0dXJuIGU8cj9bZSxyXTpbcixlXX1mdW5jdGlvbiBYaSh0KXtyZXR1cm4gdC5yYW5nZUV4dGVudD90LnJhbmdlRXh0ZW50KCk6R2kodC5yYW5nZSgpKX1mdW5jdGlvbiBZaSh0LGUscixuKXt2YXIgaT1yKHRbMF0sdFsxXSksYT1uKGVbMF0sZVsxXSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBhKGkodCkpfX1mdW5jdGlvbiBXaSh0LGUpe3ZhciByLG49MCxpPXQubGVuZ3RoLTEsYT10W25dLG89dFtpXTtyZXR1cm4gbzxhJiYocj1uLG49aSxpPXIscj1hLGE9byxvPXIpLHRbbl09ZS5mbG9vcihhKSx0W2ldPWUuY2VpbChvKSx0fWZ1bmN0aW9uIFppKHQpe3JldHVybiB0P3tmbG9vcjpmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5mbG9vcihlL3QpKnR9LGNlaWw6ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGguY2VpbChlL3QpKnR9fTpBbH1mdW5jdGlvbiBRaSh0LGUscixuKXt2YXIgaT1bXSxhPVtdLG89MCxzPU1hdGgubWluKHQubGVuZ3RoLGUubGVuZ3RoKS0xO2Zvcih0W3NdPHRbMF0mJih0PXQuc2xpY2UoKS5yZXZlcnNlKCksZT1lLnNsaWNlKCkucmV2ZXJzZSgpKTsrK288PXM7KWkucHVzaChyKHRbby0xXSx0W29dKSksYS5wdXNoKG4oZVtvLTFdLGVbb10pKTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHI9dW8uYmlzZWN0KHQsZSwxLHMpLTE7cmV0dXJuIGFbcl0oaVtyXShlKSl9fWZ1bmN0aW9uIEtpKHQsZSxyLG4pe2Z1bmN0aW9uIGkoKXt2YXIgaT1NYXRoLm1pbih0Lmxlbmd0aCxlLmxlbmd0aCk+Mj9RaTpZaSxsPW4/S246UW47cmV0dXJuIG89aSh0LGUsbCxyKSxzPWkoZSx0LGwsX24pLGF9ZnVuY3Rpb24gYSh0KXtyZXR1cm4gbyh0KX12YXIgbyxzO3JldHVybiBhLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gcyh0KX0sYS5kb21haW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZS5tYXAoTnVtYmVyKSxpKCkpOnR9LGEucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxpKCkpOmV9LGEucmFuZ2VSb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gYS5yYW5nZSh0KS5pbnRlcnBvbGF0ZShObil9LGEuY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxpKCkpOm59LGEuaW50ZXJwb2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxpKCkpOnJ9LGEudGlja3M9ZnVuY3Rpb24oZSl7cmV0dXJuIGVhKHQsZSl9LGEudGlja0Zvcm1hdD1mdW5jdGlvbihlLHIpe3JldHVybiByYSh0LGUscil9LGEubmljZT1mdW5jdGlvbihlKXtyZXR1cm4gSmkodCxlKSxpKCl9LGEuY29weT1mdW5jdGlvbigpe3JldHVybiBLaSh0LGUscixuKX0saSgpfWZ1bmN0aW9uICRpKHQsZSl7cmV0dXJuIHVvLnJlYmluZCh0LGUsInJhbmdlIiwicmFuZ2VSb3VuZCIsImludGVycG9sYXRlIiwiY2xhbXAiKX1mdW5jdGlvbiBKaSh0LGUpe3JldHVybiBXaSh0LFppKHRhKHQsZSlbMl0pKSxXaSh0LFppKHRhKHQsZSlbMl0pKSx0fWZ1bmN0aW9uIHRhKHQsZSl7bnVsbD09ZSYmKGU9MTApO3ZhciByPUdpKHQpLG49clsxXS1yWzBdLGk9TWF0aC5wb3coMTAsTWF0aC5mbG9vcihNYXRoLmxvZyhuL2UpL01hdGguTE4xMCkpLGE9ZS9uKmk7cmV0dXJuIGE8PS4xNT9pKj0xMDphPD0uMzU/aSo9NTphPD0uNzUmJihpKj0yKSxyWzBdPU1hdGguY2VpbChyWzBdL2kpKmksclsxXT1NYXRoLmZsb29yKHJbMV0vaSkqaSsuNSppLHJbMl09aSxyfWZ1bmN0aW9uIGVhKHQsZSl7cmV0dXJuIHVvLnJhbmdlLmFwcGx5KHVvLHRhKHQsZSkpfWZ1bmN0aW9uIHJhKHQsZSxyKXt2YXIgbj10YSh0LGUpO2lmKHIpe3ZhciBpPWZzLmV4ZWMocik7aWYoaS5zaGlmdCgpLCJzIj09PWlbOF0pe3ZhciBhPXVvLmZvcm1hdFByZWZpeChNYXRoLm1heChibyhuWzBdKSxibyhuWzFdKSkpO3JldHVybiBpWzddfHwoaVs3XT0iLiIrbmEoYS5zY2FsZShuWzJdKSkpLGlbOF09ImYiLHI9dW8uZm9ybWF0KGkuam9pbigiIikpLGZ1bmN0aW9uKHQpe3JldHVybiByKGEuc2NhbGUodCkpK2Euc3ltYm9sfX1pWzddfHwoaVs3XT0iLiIraWEoaVs4XSxuKSkscj1pLmpvaW4oIiIpfWVsc2Ugcj0iLC4iK25hKG5bMl0pKyJmIjtyZXR1cm4gdW8uZm9ybWF0KHIpfWZ1bmN0aW9uIG5hKHQpe3JldHVybi1NYXRoLmZsb29yKE1hdGgubG9nKHQpL01hdGguTE4xMCsuMDEpfWZ1bmN0aW9uIGlhKHQsZSl7dmFyIHI9bmEoZVsyXSk7cmV0dXJuIHQgaW4ga2w/TWF0aC5hYnMoci1uYShNYXRoLm1heChibyhlWzBdKSxibyhlWzFdKSkpKSsgKygiZSIhPT10KTpyLTIqKCIlIj09PXQpfWZ1bmN0aW9uIGFhKHQsZSxyLG4pe2Z1bmN0aW9uIGkodCl7cmV0dXJuKHI/TWF0aC5sb2codDwwPzA6dCk6LU1hdGgubG9nKHQ+MD8wOi10KSkvTWF0aC5sb2coZSl9ZnVuY3Rpb24gYSh0KXtyZXR1cm4gcj9NYXRoLnBvdyhlLHQpOi1NYXRoLnBvdyhlLC10KX1mdW5jdGlvbiBvKGUpe3JldHVybiB0KGkoZSkpfXJldHVybiBvLmludmVydD1mdW5jdGlvbihlKXtyZXR1cm4gYSh0LmludmVydChlKSl9LG8uZG9tYWluPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWVbMF0+PTAsdC5kb21haW4oKG49ZS5tYXAoTnVtYmVyKSkubWFwKGkpKSxvKTpufSxvLmJhc2U9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3IsdC5kb21haW4obi5tYXAoaSkpLG8pOmV9LG8ubmljZT1mdW5jdGlvbigpe3ZhciBlPVdpKG4ubWFwKGkpLHI/TWF0aDpFbCk7cmV0dXJuIHQuZG9tYWluKGUpLG49ZS5tYXAoYSksb30sby50aWNrcz1mdW5jdGlvbigpe3ZhciB0PUdpKG4pLG89W10scz10WzBdLGw9dFsxXSx1PU1hdGguZmxvb3IoaShzKSksYz1NYXRoLmNlaWwoaShsKSksaD1lJTE/MjplO2lmKGlzRmluaXRlKGMtdSkpe2lmKHIpe2Zvcig7dTxjO3UrKylmb3IodmFyIGY9MTtmPGg7ZisrKW8ucHVzaChhKHUpKmYpO28ucHVzaChhKHUpKX1lbHNlIGZvcihvLnB1c2goYSh1KSk7dSsrPGM7KWZvcih2YXIgZj1oLTE7Zj4wO2YtLSlvLnB1c2goYSh1KSpmKTtmb3IodT0wO29bdV08czt1KyspO2ZvcihjPW8ubGVuZ3RoO29bYy0xXT5sO2MtLSk7bz1vLnNsaWNlKHUsYyl9cmV0dXJuIG99LG8udGlja0Zvcm1hdD1mdW5jdGlvbih0LHIpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBUbDthcmd1bWVudHMubGVuZ3RoPDI/cj1UbDoiZnVuY3Rpb24iIT10eXBlb2YgciYmKHI9dW8uZm9ybWF0KHIpKTt2YXIgbj1NYXRoLm1heCgxLGUqdC9vLnRpY2tzKCkubGVuZ3RoKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG89dC9hKE1hdGgucm91bmQoaSh0KSkpO3JldHVybiBvKmU8ZS0uNSYmKG8qPWUpLG88PW4/cih0KToiIn19LG8uY29weT1mdW5jdGlvbigpe3JldHVybiBhYSh0LmNvcHkoKSxlLHIsbil9LCRpKG8sdCl9ZnVuY3Rpb24gb2EodCxlLHIpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHQoaShlKSl9dmFyIGk9c2EoZSksYT1zYSgxL2UpO3JldHVybiBuLmludmVydD1mdW5jdGlvbihlKXtyZXR1cm4gYSh0LmludmVydChlKSl9LG4uZG9tYWluPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0LmRvbWFpbigocj1lLm1hcChOdW1iZXIpKS5tYXAoaSkpLG4pOnJ9LG4udGlja3M9ZnVuY3Rpb24odCl7cmV0dXJuIGVhKHIsdCl9LG4udGlja0Zvcm1hdD1mdW5jdGlvbih0LGUpe3JldHVybiByYShyLHQsZSl9LG4ubmljZT1mdW5jdGlvbih0KXtyZXR1cm4gbi5kb21haW4oSmkocix0KSl9LG4uZXhwb25lbnQ9ZnVuY3Rpb24obyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9c2EoZT1vKSxhPXNhKDEvZSksdC5kb21haW4oci5tYXAoaSkpLG4pOmV9LG4uY29weT1mdW5jdGlvbigpe3JldHVybiBvYSh0LmNvcHkoKSxlLHIpfSwkaShuLHQpfWZ1bmN0aW9uIHNhKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZTwwPy1NYXRoLnBvdygtZSx0KTpNYXRoLnBvdyhlLHQpfX1mdW5jdGlvbiBsYSh0LGUpe2Z1bmN0aW9uIHIocil7cmV0dXJuIGFbKChpLmdldChyKXx8KCJyYW5nZSI9PT1lLnQ/aS5zZXQocix0LnB1c2gocikpOk5hTikpLTEpJWEubGVuZ3RoXX1mdW5jdGlvbiBuKGUscil7cmV0dXJuIHVvLnJhbmdlKHQubGVuZ3RoKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIGUrcip0fSl9dmFyIGksYSxvO3JldHVybiByLmRvbWFpbj1mdW5jdGlvbihuKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdDt0PVtdLGk9bmV3IGg7Zm9yKHZhciBhLG89LTEscz1uLmxlbmd0aDsrK288czspaS5oYXMoYT1uW29dKXx8aS5zZXQoYSx0LnB1c2goYSkpO3JldHVybiByW2UudF0uYXBwbHkocixlLmEpfSxyLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQsbz0wLGU9e3Q6InJhbmdlIixhOmFyZ3VtZW50c30scik6YX0sci5yYW5nZVBvaW50cz1mdW5jdGlvbihpLHMpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKHM9MCk7dmFyIGw9aVswXSx1PWlbMV0sYz10Lmxlbmd0aDwyPyhsPShsK3UpLzIsMCk6KHUtbCkvKHQubGVuZ3RoLTErcyk7cmV0dXJuIGE9bihsK2Mqcy8yLGMpLG89MCxlPXt0OiJyYW5nZVBvaW50cyIsYTphcmd1bWVudHN9LHJ9LHIucmFuZ2VSb3VuZFBvaW50cz1mdW5jdGlvbihpLHMpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKHM9MCk7dmFyIGw9aVswXSx1PWlbMV0sYz10Lmxlbmd0aDwyPyhsPXU9TWF0aC5yb3VuZCgobCt1KS8yKSwwKToodS1sKS8odC5sZW5ndGgtMStzKXwwO3JldHVybiBhPW4obCtNYXRoLnJvdW5kKGMqcy8yKyh1LWwtKHQubGVuZ3RoLTErcykqYykvMiksYyksbz0wLGU9e3Q6InJhbmdlUm91bmRQb2ludHMiLGE6YXJndW1lbnRzfSxyfSxyLnJhbmdlQmFuZHM9ZnVuY3Rpb24oaSxzLGwpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKHM9MCksYXJndW1lbnRzLmxlbmd0aDwzJiYobD1zKTt2YXIgdT1pWzFdPGlbMF0sYz1pW3UtMF0saD1pWzEtdV0sZj0oaC1jKS8odC5sZW5ndGgtcysyKmwpO3JldHVybiBhPW4oYytmKmwsZiksdSYmYS5yZXZlcnNlKCksbz1mKigxLXMpLGU9e3Q6InJhbmdlQmFuZHMiLGE6YXJndW1lbnRzfSxyfSxyLnJhbmdlUm91bmRCYW5kcz1mdW5jdGlvbihpLHMsbCl7YXJndW1lbnRzLmxlbmd0aDwyJiYocz0wKSxhcmd1bWVudHMubGVuZ3RoPDMmJihsPXMpO3ZhciB1PWlbMV08aVswXSxjPWlbdS0wXSxoPWlbMS11XSxmPU1hdGguZmxvb3IoKGgtYykvKHQubGVuZ3RoLXMrMipsKSk7cmV0dXJuIGE9bihjK01hdGgucm91bmQoKGgtYy0odC5sZW5ndGgtcykqZikvMiksZiksdSYmYS5yZXZlcnNlKCksbz1NYXRoLnJvdW5kKGYqKDEtcykpLGU9e3Q6InJhbmdlUm91bmRCYW5kcyIsYTphcmd1bWVudHN9LHJ9LHIucmFuZ2VCYW5kPWZ1bmN0aW9uKCl7cmV0dXJuIG99LHIucmFuZ2VFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gR2koZS5hWzBdKX0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGxhKHQsZSl9LHIuZG9tYWluKHQpfWZ1bmN0aW9uIHVhKHQsZSl7ZnVuY3Rpb24gcigpe3ZhciByPTAsaT1lLmxlbmd0aDtmb3Iocz1bXTsrK3I8aTspc1tyLTFdPXVvLnF1YW50aWxlKHQsci9pKTtyZXR1cm4gbn1mdW5jdGlvbiBuKHQpe2lmKCFpc05hTih0PSt0KSlyZXR1cm4gZVt1by5iaXNlY3Qocyx0KV19dmFyIHM7cmV0dXJuIG4uZG9tYWluPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUubWFwKGEpLmZpbHRlcihvKS5zb3J0KGkpLHIoKSk6dH0sbi5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LHIoKSk6ZX0sbi5xdWFudGlsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gc30sbi5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24ocil7cmV0dXJuIHI9ZS5pbmRleE9mKHIpLHI8MD9bTmFOLE5hTl06W3I+MD9zW3ItMV06dFswXSxyPHMubGVuZ3RoP3Nbcl06dFt0Lmxlbmd0aC0xXV19LG4uY29weT1mdW5jdGlvbigpe3JldHVybiB1YSh0LGUpfSxyKCl9ZnVuY3Rpb24gY2EodCxlLHIpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHJbTWF0aC5tYXgoMCxNYXRoLm1pbihvLE1hdGguZmxvb3IoYSooZS10KSkpKV19ZnVuY3Rpb24gaSgpe3JldHVybiBhPXIubGVuZ3RoLyhlLXQpLG89ci5sZW5ndGgtMSxufXZhciBhLG87cmV0dXJuIG4uZG9tYWluPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStyWzBdLGU9K3Jbci5sZW5ndGgtMV0saSgpKTpbdCxlXX0sbi5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LGkoKSk6cn0sbi5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ci5pbmRleE9mKGUpLGU9ZTwwP05hTjplL2ErdCxbZSxlKzEvYV19LG4uY29weT1mdW5jdGlvbigpe3JldHVybiBjYSh0LGUscil9LGkoKX1mdW5jdGlvbiBoYSh0LGUpe2Z1bmN0aW9uIHIocil7aWYocjw9cilyZXR1cm4gZVt1by5iaXNlY3QodCxyKV19cmV0dXJuIHIuZG9tYWluPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUscik6dH0sci5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LHIpOmV9LHIuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHIpe3JldHVybiByPWUuaW5kZXhPZihyKSxbdFtyLTFdLHRbcl1dfSxyLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gaGEodCxlKX0scn1mdW5jdGlvbiBmYSh0KXtmdW5jdGlvbiBlKHQpe3JldHVybit0fXJldHVybiBlLmludmVydD1lLGUuZG9tYWluPWUucmFuZ2U9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ci5tYXAoZSksZSk6dH0sZS50aWNrcz1mdW5jdGlvbihlKXtyZXR1cm4gZWEodCxlKX0sZS50aWNrRm9ybWF0PWZ1bmN0aW9uKGUscil7cmV0dXJuIHJhKHQsZSxyKX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGZhKHQpfSxlfWZ1bmN0aW9uIGRhKCl7cmV0dXJuIDB9ZnVuY3Rpb24gcGEodCl7cmV0dXJuIHQuaW5uZXJSYWRpdXN9ZnVuY3Rpb24gZ2EodCl7cmV0dXJuIHQub3V0ZXJSYWRpdXN9ZnVuY3Rpb24gbWEodCl7cmV0dXJuIHQuc3RhcnRBbmdsZX1mdW5jdGlvbiB2YSh0KXtyZXR1cm4gdC5lbmRBbmdsZX1mdW5jdGlvbiB5YSh0KXtyZXR1cm4gdCYmdC5wYWRBbmdsZX1mdW5jdGlvbiB4YSh0LGUscixuKXtyZXR1cm4odC1yKSplLShlLW4pKnQ+MD8wOjF9ZnVuY3Rpb24gYmEodCxlLHIsbixpKXt2YXIgYT10WzBdLWVbMF0sbz10WzFdLWVbMV0scz0oaT9uOi1uKS9NYXRoLnNxcnQoYSphK28qbyksbD1zKm8sdT0tcyphLGM9dFswXStsLGg9dFsxXSt1LGY9ZVswXStsLGQ9ZVsxXSt1LHA9KGMrZikvMixnPShoK2QpLzIsbT1mLWMsdj1kLWgseT1tKm0rdip2LHg9ci1uLGI9YypkLWYqaCxfPSh2PDA/LTE6MSkqTWF0aC5zcXJ0KE1hdGgubWF4KDAseCp4KnktYipiKSksdz0oYip2LW0qXykveSxNPSgtYiptLXYqXykveSxBPShiKnYrbSpfKS95LGs9KC1iKm0rdipfKS95LFQ9dy1wLEU9TS1nLFM9QS1wLEw9ay1nO3JldHVybiBUKlQrRSpFPlMqUytMKkwmJih3PUEsTT1rKSxbW3ctbCxNLXVdLFt3KnIveCxNKnIveF1dfWZ1bmN0aW9uIF9hKHQpe2Z1bmN0aW9uIGUoZSl7ZnVuY3Rpb24gbygpe3UucHVzaCgiTSIsYSh0KGMpLHMpKX1mb3IodmFyIGwsdT1bXSxjPVtdLGg9LTEsZj1lLmxlbmd0aCxkPVN0KHIpLHA9U3Qobik7KytoPGY7KWkuY2FsbCh0aGlzLGw9ZVtoXSxoKT9jLnB1c2goWytkLmNhbGwodGhpcyxsLGgpLCtwLmNhbGwodGhpcyxsLGgpXSk6Yy5sZW5ndGgmJihvKCksYz1bXSk7cmV0dXJuIGMubGVuZ3RoJiZvKCksdS5sZW5ndGg/dS5qb2luKCIiKTpudWxsfXZhciByPXpyLG49Q3IsaT1DZSxhPXdhLG89YS5rZXkscz0uNztyZXR1cm4gZS54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsZSk6cn0sZS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsZSk6bn0sZS5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsZSk6aX0sZS5pbnRlcnBvbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD9hPXQ6KGE9UGwuZ2V0KHQpfHx3YSkua2V5LGUpOm99LGUudGVuc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz10LGUpOnN9LGV9ZnVuY3Rpb24gd2EodCl7cmV0dXJuIHQubGVuZ3RoPjE/dC5qb2luKCJMIik6dCsiWiJ9ZnVuY3Rpb24gTWEodCl7cmV0dXJuIHQuam9pbigiTCIpKyJaIn1mdW5jdGlvbiBBYSh0KXtmb3IodmFyIGU9MCxyPXQubGVuZ3RoLG49dFswXSxpPVtuWzBdLCIsIixuWzFdXTsrK2U8cjspaS5wdXNoKCJIIiwoblswXSsobj10W2VdKVswXSkvMiwiViIsblsxXSk7cmV0dXJuIHI+MSYmaS5wdXNoKCJIIixuWzBdKSxpLmpvaW4oIiIpfWZ1bmN0aW9uIGthKHQpe2Zvcih2YXIgZT0wLHI9dC5sZW5ndGgsbj10WzBdLGk9W25bMF0sIiwiLG5bMV1dOysrZTxyOylpLnB1c2goIlYiLChuPXRbZV0pWzFdLCJIIixuWzBdKTtyZXR1cm4gaS5qb2luKCIiKX1mdW5jdGlvbiBUYSh0KXtmb3IodmFyIGU9MCxyPXQubGVuZ3RoLG49dFswXSxpPVtuWzBdLCIsIixuWzFdXTsrK2U8cjspaS5wdXNoKCJIIiwobj10W2VdKVswXSwiViIsblsxXSk7cmV0dXJuIGkuam9pbigiIil9ZnVuY3Rpb24gRWEodCxlKXtyZXR1cm4gdC5sZW5ndGg8ND93YSh0KTp0WzFdK3phKHQuc2xpY2UoMSwtMSksQ2EodCxlKSl9ZnVuY3Rpb24gU2EodCxlKXtyZXR1cm4gdC5sZW5ndGg8Mz9NYSh0KTp0WzBdK3phKCh0LnB1c2godFswXSksdCksQ2EoW3RbdC5sZW5ndGgtMl1dLmNvbmNhdCh0LFt0WzFdXSksZSkpfWZ1bmN0aW9uIExhKHQsZSl7cmV0dXJuIHQubGVuZ3RoPDM/d2EodCk6dFswXSt6YSh0LENhKHQsZSkpfWZ1bmN0aW9uIHphKHQsZSl7aWYoZS5sZW5ndGg8MXx8dC5sZW5ndGghPWUubGVuZ3RoJiZ0Lmxlbmd0aCE9ZS5sZW5ndGgrMilyZXR1cm4gd2EodCk7dmFyIHI9dC5sZW5ndGghPWUubGVuZ3RoLG49IiIsaT10WzBdLGE9dFsxXSxvPWVbMF0scz1vLGw9MTtpZihyJiYobis9IlEiKyhhWzBdLTIqb1swXS8zKSsiLCIrKGFbMV0tMipvWzFdLzMpKyIsIithWzBdKyIsIithWzFdLGk9dFsxXSxsPTIpLGUubGVuZ3RoPjEpe3M9ZVsxXSxhPXRbbF0sbCsrLG4rPSJDIisoaVswXStvWzBdKSsiLCIrKGlbMV0rb1sxXSkrIiwiKyhhWzBdLXNbMF0pKyIsIisoYVsxXS1zWzFdKSsiLCIrYVswXSsiLCIrYVsxXTtmb3IodmFyIHU9Mjt1PGUubGVuZ3RoO3UrKyxsKyspYT10W2xdLHM9ZVt1XSxuKz0iUyIrKGFbMF0tc1swXSkrIiwiKyhhWzFdLXNbMV0pKyIsIithWzBdKyIsIithWzFdfWlmKHIpe3ZhciBjPXRbbF07bis9IlEiKyhhWzBdKzIqc1swXS8zKSsiLCIrKGFbMV0rMipzWzFdLzMpKyIsIitjWzBdKyIsIitjWzFdfXJldHVybiBufWZ1bmN0aW9uIENhKHQsZSl7Zm9yKHZhciByLG49W10saT0oMS1lKS8yLGE9dFswXSxvPXRbMV0scz0xLGw9dC5sZW5ndGg7KytzPGw7KXI9YSxhPW8sbz10W3NdLG4ucHVzaChbaSoob1swXS1yWzBdKSxpKihvWzFdLXJbMV0pXSk7cmV0dXJuIG59ZnVuY3Rpb24gSWEodCl7aWYodC5sZW5ndGg8MylyZXR1cm4gd2EodCk7dmFyIGU9MSxyPXQubGVuZ3RoLG49dFswXSxpPW5bMF0sYT1uWzFdLG89W2ksaSxpLChuPXRbMV0pWzBdXSxzPVthLGEsYSxuWzFdXSxsPVtpLCIsIixhLCJMIixPYShPbCxvKSwiLCIsT2EoT2wscyldO2Zvcih0LnB1c2godFtyLTFdKTsrK2U8PXI7KW49dFtlXSxvLnNoaWZ0KCksby5wdXNoKG5bMF0pLHMuc2hpZnQoKSxzLnB1c2goblsxXSksRmEobCxvLHMpO3JldHVybiB0LnBvcCgpLGwucHVzaCgiTCIsbiksbC5qb2luKCIiKX1mdW5jdGlvbiBQYSh0KXtpZih0Lmxlbmd0aDw0KXJldHVybiB3YSh0KTtmb3IodmFyIGUscj1bXSxuPS0xLGk9dC5sZW5ndGgsYT1bMF0sbz1bMF07KytuPDM7KWU9dFtuXSxhLnB1c2goZVswXSksby5wdXNoKGVbMV0pO2ZvcihyLnB1c2goT2EoT2wsYSkrIiwiK09hKE9sLG8pKSwtLW47KytuPGk7KWU9dFtuXSxhLnNoaWZ0KCksYS5wdXNoKGVbMF0pLG8uc2hpZnQoKSxvLnB1c2goZVsxXSksRmEocixhLG8pO3JldHVybiByLmpvaW4oIiIpfWZ1bmN0aW9uIERhKHQpe2Zvcih2YXIgZSxyLG49LTEsaT10Lmxlbmd0aCxhPWkrNCxvPVtdLHM9W107KytuPDQ7KXI9dFtuJWldLG8ucHVzaChyWzBdKSxzLnB1c2goclsxXSk7Zm9yKGU9W09hKE9sLG8pLCIsIixPYShPbCxzKV0sLS1uOysrbjxhOylyPXRbbiVpXSxvLnNoaWZ0KCksby5wdXNoKHJbMF0pLHMuc2hpZnQoKSxzLnB1c2goclsxXSksRmEoZSxvLHMpO3JldHVybiBlLmpvaW4oIiIpfWZ1bmN0aW9uIFJhKHQsZSl7dmFyIHI9dC5sZW5ndGgtMTtpZihyKWZvcih2YXIgbixpLGE9dFswXVswXSxvPXRbMF1bMV0scz10W3JdWzBdLWEsbD10W3JdWzFdLW8sdT0tMTsrK3U8PXI7KW49dFt1XSxpPXUvcixuWzBdPWUqblswXSsoMS1lKSooYStpKnMpLG5bMV09ZSpuWzFdKygxLWUpKihvK2kqbCk7cmV0dXJuIElhKHQpfWZ1bmN0aW9uIE9hKHQsZSl7cmV0dXJuIHRbMF0qZVswXSt0WzFdKmVbMV0rdFsyXSplWzJdK3RbM10qZVszXX1mdW5jdGlvbiBGYSh0LGUscil7dC5wdXNoKCJDIixPYShEbCxlKSwiLCIsT2EoRGwsciksIiwiLE9hKFJsLGUpLCIsIixPYShSbCxyKSwiLCIsT2EoT2wsZSksIiwiLE9hKE9sLHIpKX1mdW5jdGlvbiBqYSh0LGUpe3JldHVybihlWzFdLXRbMV0pLyhlWzBdLXRbMF0pfWZ1bmN0aW9uIE5hKHQpe2Zvcih2YXIgZT0wLHI9dC5sZW5ndGgtMSxuPVtdLGk9dFswXSxhPXRbMV0sbz1uWzBdPWphKGksYSk7KytlPHI7KW5bZV09KG8rKG89amEoaT1hLGE9dFtlKzFdKSkpLzI7cmV0dXJuIG5bZV09byxufWZ1bmN0aW9uIEJhKHQpe2Zvcih2YXIgZSxyLG4saSxhPVtdLG89TmEodCkscz0tMSxsPXQubGVuZ3RoLTE7KytzPGw7KWU9amEodFtzXSx0W3MrMV0pLGJvKGUpPEZvP29bc109b1tzKzFdPTA6KHI9b1tzXS9lLG49b1tzKzFdL2UsaT1yKnIrbipuLGk+OSYmKGk9MyplL01hdGguc3FydChpKSxvW3NdPWkqcixvW3MrMV09aSpuKSk7Zm9yKHM9LTE7KytzPD1sOylpPSh0W01hdGgubWluKGwscysxKV1bMF0tdFtNYXRoLm1heCgwLHMtMSldWzBdKS8oNiooMStvW3NdKm9bc10pKSxhLnB1c2goW2l8fDAsb1tzXSppfHwwXSk7cmV0dXJuIGF9ZnVuY3Rpb24gVWEodCl7cmV0dXJuIHQubGVuZ3RoPDM/d2EodCk6dFswXSt6YSh0LEJhKHQpKX1mdW5jdGlvbiBWYSh0KXtmb3IodmFyIGUscixuLGk9LTEsYT10Lmxlbmd0aDsrK2k8YTspZT10W2ldLHI9ZVswXSxuPWVbMV0tVm8sZVswXT1yKk1hdGguY29zKG4pLGVbMV09cipNYXRoLnNpbihuKTtyZXR1cm4gdH1mdW5jdGlvbiBxYSh0KXtmdW5jdGlvbiBlKGUpe2Z1bmN0aW9uIGwoKXtnLnB1c2goIk0iLHModCh2KSxoKSxjLHUodChtLnJldmVyc2UoKSksaCksIloiKX1mb3IodmFyIGYsZCxwLGc9W10sbT1bXSx2PVtdLHk9LTEseD1lLmxlbmd0aCxiPVN0KHIpLF89U3QoaSksdz1yPT09bj9mdW5jdGlvbigpe3JldHVybiBkfTpTdChuKSxNPWk9PT1hP2Z1bmN0aW9uKCl7cmV0dXJuIHB9OlN0KGEpOysreTx4OylvLmNhbGwodGhpcyxmPWVbeV0seSk/KG0ucHVzaChbZD0rYi5jYWxsKHRoaXMsZix5KSxwPStfLmNhbGwodGhpcyxmLHkpXSksdi5wdXNoKFsrdy5jYWxsKHRoaXMsZix5KSwrTS5jYWxsKHRoaXMsZix5KV0pKTptLmxlbmd0aCYmKGwoKSxtPVtdLHY9W10pO3JldHVybiBtLmxlbmd0aCYmbCgpLGcubGVuZ3RoP2cuam9pbigiIik6bnVsbH12YXIgcj16cixuPXpyLGk9MCxhPUNyLG89Q2Uscz13YSxsPXMua2V5LHU9cyxjPSJMIixoPS43O3JldHVybiBlLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bj10LGUpOm59LGUueDA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxlKTpyfSxlLngxPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsZSk6bn0sZS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPWE9dCxlKTphfSxlLnkwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsZSk6aX0sZS55MT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT10LGUpOmF9LGUuZGVmaW5lZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz10LGUpOm99LGUuaW50ZXJwb2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/cz10OihzPVBsLmdldCh0KXx8d2EpLmtleSx1PXMucmV2ZXJzZXx8cyxjPXMuY2xvc2VkPyJNIjoiTCIsZSk6bH0sZS50ZW5zaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPXQsZSk6aH0sZX1mdW5jdGlvbiBIYSh0KXtyZXR1cm4gdC5yYWRpdXN9ZnVuY3Rpb24gR2EodCl7cmV0dXJuW3QueCx0LnldfWZ1bmN0aW9uIFhhKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHI9ZVswXSxuPWVbMV0tVm87cmV0dXJuW3IqTWF0aC5jb3MobikscipNYXRoLnNpbihuKV19fWZ1bmN0aW9uIFlhKCl7cmV0dXJuIDY0fWZ1bmN0aW9uIFdhKCl7cmV0dXJuImNpcmNsZSJ9ZnVuY3Rpb24gWmEodCl7dmFyIGU9TWF0aC5zcXJ0KHQvTm8pO3JldHVybiJNMCwiK2UrIkEiK2UrIiwiK2UrIiAwIDEsMSAwLCIrLWUrIkEiK2UrIiwiK2UrIiAwIDEsMSAwLCIrZSsiWiJ9ZnVuY3Rpb24gUWEodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGUscixuOyhlPXRoaXNbdF0pJiYobj1lW3I9ZS5hY3RpdmVdKSYmKG4udGltZXIuYz1udWxsLG4udGltZXIudD1OYU4sLS1lLmNvdW50P2RlbGV0ZSBlW3JdOmRlbGV0ZSB0aGlzW3RdLGUuYWN0aXZlKz0uNSxuLmV2ZW50JiZuLmV2ZW50LmludGVycnVwdC5jYWxsKHRoaXMsdGhpcy5fX2RhdGFfXyxuLmluZGV4KSl9fWZ1bmN0aW9uIEthKHQsZSxyKXtyZXR1cm4ga28odCxxbCksdC5uYW1lc3BhY2U9ZSx0LmlkPXIsdH1mdW5jdGlvbiAkYSh0LGUscixuKXt2YXIgaT10LmlkLGE9dC5uYW1lc3BhY2U7cmV0dXJuIEcodCwiZnVuY3Rpb24iPT10eXBlb2Ygcj9mdW5jdGlvbih0LG8scyl7dFthXVtpXS50d2Vlbi5zZXQoZSxuKHIuY2FsbCh0LHQuX19kYXRhX18sbyxzKSkpfToocj1uKHIpLGZ1bmN0aW9uKHQpe3RbYV1baV0udHdlZW4uc2V0KGUscil9KSl9ZnVuY3Rpb24gSmEodCl7cmV0dXJuIG51bGw9PXQmJih0PSIiKSxmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19ZnVuY3Rpb24gdG8odCl7cmV0dXJuIG51bGw9PXQ/Il9fdHJhbnNpdGlvbl9fIjoiX190cmFuc2l0aW9uXyIrdCsiX18ifWZ1bmN0aW9uIGVvKHQsZSxyLG4saSl7ZnVuY3Rpb24gYSh0KXt2YXIgZT1nLmRlbGF5O3JldHVybiB1LnQ9ZStsLGU8PXQ/byh0LWUpOnZvaWQodS5jPW8pfWZ1bmN0aW9uIG8ocil7dmFyIGk9cC5hY3RpdmUsYT1wW2ldO2EmJihhLnRpbWVyLmM9bnVsbCxhLnRpbWVyLnQ9TmFOLC0tcC5jb3VudCxkZWxldGUgcFtpXSxhLmV2ZW50JiZhLmV2ZW50LmludGVycnVwdC5jYWxsKHQsdC5fX2RhdGFfXyxhLmluZGV4KSk7Zm9yKHZhciBvIGluIHApaWYoK288bil7dmFyIGg9cFtvXTtoLnRpbWVyLmM9bnVsbCxoLnRpbWVyLnQ9TmFOLC0tcC5jb3VudCxkZWxldGUgcFtvXX11LmM9cyxQdChmdW5jdGlvbigpe3JldHVybiB1LmMmJnMocnx8MSkmJih1LmM9bnVsbCx1LnQ9TmFOKSwxfSwwLGwpLHAuYWN0aXZlPW4sZy5ldmVudCYmZy5ldmVudC5zdGFydC5jYWxsKHQsdC5fX2RhdGFfXyxlKSxkPVtdLGcudHdlZW4uZm9yRWFjaChmdW5jdGlvbihyLG4peyhuPW4uY2FsbCh0LHQuX19kYXRhX18sZSkpJiZkLnB1c2gobil9KSxmPWcuZWFzZSxjPWcuZHVyYXRpb259ZnVuY3Rpb24gcyhpKXtmb3IodmFyIGE9aS9jLG89ZihhKSxzPWQubGVuZ3RoO3M+MDspZFstLXNdLmNhbGwodCxvKTtpZihhPj0xKXJldHVybiBnLmV2ZW50JiZnLmV2ZW50LmVuZC5jYWxsKHQsdC5fX2RhdGFfXyxlKSwtLXAuY291bnQ/ZGVsZXRlIHBbbl06ZGVsZXRlIHRbcl0sMX12YXIgbCx1LGMsZixkLHA9dFtyXXx8KHRbcl09e2FjdGl2ZTowLGNvdW50OjB9KSxnPXBbbl07Z3x8KGw9aS50aW1lLHU9UHQoYSwwLGwpLGc9cFtuXT17dHdlZW46bmV3IGgsdGltZTpsLHRpbWVyOnUsZGVsYXk6aS5kZWxheSxkdXJhdGlvbjppLmR1cmF0aW9uLGVhc2U6aS5lYXNlLGluZGV4OmV9LGk9bnVsbCwrK3AuY291bnQpfWZ1bmN0aW9uIHJvKHQsZSxyKXt0LmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7dmFyIG49ZSh0KTtyZXR1cm4idHJhbnNsYXRlKCIrKGlzRmluaXRlKG4pP246cih0KSkrIiwwKSJ9KX1mdW5jdGlvbiBubyh0LGUscil7dC5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3ZhciBuPWUodCk7cmV0dXJuInRyYW5zbGF0ZSgwLCIrKGlzRmluaXRlKG4pP246cih0KSkrIikifSl9ZnVuY3Rpb24gaW8odCl7cmV0dXJuIHQudG9JU09TdHJpbmcoKX1mdW5jdGlvbiBhbyh0LGUscil7ZnVuY3Rpb24gbihlKXtyZXR1cm4gdChlKX1mdW5jdGlvbiBpKHQscil7dmFyIG49dFsxXS10WzBdLGk9bi9yLGE9dW8uYmlzZWN0KCRsLGkpO3JldHVybiBhPT0kbC5sZW5ndGg/W2UueWVhcix0YSh0Lm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC8zMTUzNmU2fSkscilbMl1dOmE/ZVtpLyRsW2EtMV08JGxbYV0vaT9hLTE6YV06W2V1LHRhKHQscilbMl1dfXJldHVybiBuLmludmVydD1mdW5jdGlvbihlKXtyZXR1cm4gb28odC5pbnZlcnQoZSkpfSxuLmRvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odC5kb21haW4oZSksbik6dC5kb21haW4oKS5tYXAob28pfSxuLm5pY2U9ZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKHIpe3JldHVybiFpc05hTihyKSYmIXQucmFuZ2UocixvbygrcisxKSxlKS5sZW5ndGh9dmFyIGE9bi5kb21haW4oKSxvPUdpKGEpLHM9bnVsbD09dD9pKG8sMTApOiJudW1iZXIiPT10eXBlb2YgdCYmaShvLHQpO3JldHVybiBzJiYodD1zWzBdLGU9c1sxXSksbi5kb21haW4oV2koYSxlPjE/e2Zsb29yOmZ1bmN0aW9uKGUpe2Zvcig7cihlPXQuZmxvb3IoZSkpOyllPW9vKGUtMSk7cmV0dXJuIGV9LGNlaWw6ZnVuY3Rpb24oZSl7Zm9yKDtyKGU9dC5jZWlsKGUpKTspZT1vbygrZSsxKTtyZXR1cm4gZX19OnQpKX0sbi50aWNrcz1mdW5jdGlvbih0LGUpe3ZhciByPUdpKG4uZG9tYWluKCkpLGE9bnVsbD09dD9pKHIsMTApOiJudW1iZXIiPT10eXBlb2YgdD9pKHIsdCk6IXQucmFuZ2UmJlt7cmFuZ2U6dH0sZV07cmV0dXJuIGEmJih0PWFbMF0sZT1hWzFdKSx0LnJhbmdlKHJbMF0sb28oK3JbMV0rMSksZTwxPzE6ZSl9LG4udGlja0Zvcm1hdD1mdW5jdGlvbigpe3JldHVybiByfSxuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gYW8odC5jb3B5KCksZSxyKX0sJGkobix0KX1mdW5jdGlvbiBvbyh0KXtyZXR1cm4gbmV3IERhdGUodCl9ZnVuY3Rpb24gc28odCl7cmV0dXJuIEpTT04ucGFyc2UodC5yZXNwb25zZVRleHQpfWZ1bmN0aW9uIGxvKHQpe3ZhciBlPWZvLmNyZWF0ZVJhbmdlKCk7cmV0dXJuIGUuc2VsZWN0Tm9kZShmby5ib2R5KSxlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCh0LnJlc3BvbnNlVGV4dCl9dmFyIHVvPXt2ZXJzaW9uOiIzLjUuMTcifSxjbz1bXS5zbGljZSxobz1mdW5jdGlvbih0KXtyZXR1cm4gY28uY2FsbCh0KX0sZm89dGhpcy5kb2N1bWVudDtpZihmbyl0cnl7aG8oZm8uZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMpWzBdLm5vZGVUeXBlfWNhdGNoKHQpe2hvPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aCxyPW5ldyBBcnJheShlKTtlLS07KXJbZV09dFtlXTtyZXR1cm4gcn19aWYoRGF0ZS5ub3d8fChEYXRlLm5vdz1mdW5jdGlvbigpe3JldHVybituZXcgRGF0ZX0pLGZvKXRyeXtmby5jcmVhdGVFbGVtZW50KCJESVYiKS5zdHlsZS5zZXRQcm9wZXJ0eSgib3BhY2l0eSIsMCwiIil9Y2F0Y2godCl7dmFyIHBvPXRoaXMuRWxlbWVudC5wcm90b3R5cGUsZ289cG8uc2V0QXR0cmlidXRlLG1vPXBvLnNldEF0dHJpYnV0ZU5TLHZvPXRoaXMuQ1NTU3R5bGVEZWNsYXJhdGlvbi5wcm90b3R5cGUseW89dm8uc2V0UHJvcGVydHk7cG8uc2V0QXR0cmlidXRlPWZ1bmN0aW9uKHQsZSl7Z28uY2FsbCh0aGlzLHQsZSsiIil9LHBvLnNldEF0dHJpYnV0ZU5TPWZ1bmN0aW9uKHQsZSxyKXttby5jYWxsKHRoaXMsdCxlLHIrIiIpfSx2by5zZXRQcm9wZXJ0eT1mdW5jdGlvbih0LGUscil7eW8uY2FsbCh0aGlzLHQsZSsiIixyKX19dW8uYXNjZW5kaW5nPWksdW8uZGVzY2VuZGluZz1mdW5jdGlvbih0LGUpe3JldHVybiBlPHQ/LTE6ZT50PzE6ZT49dD8wOk5hTn0sdW8ubWluPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbixpPS0xLGE9dC5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcig7KytpPGE7KWlmKG51bGwhPShuPXRbaV0pJiZuPj1uKXtyPW47YnJlYWt9Zm9yKDsrK2k8YTspbnVsbCE9KG49dFtpXSkmJnI+biYmKHI9bil9ZWxzZXtmb3IoOysraTxhOylpZihudWxsIT0obj1lLmNhbGwodCx0W2ldLGkpKSYmbj49bil7cj1uO2JyZWFrfWZvcig7KytpPGE7KW51bGwhPShuPWUuY2FsbCh0LHRbaV0saSkpJiZyPm4mJihyPW4pfXJldHVybiByfSx1by5tYXg9ZnVuY3Rpb24odCxlKXt2YXIgcixuLGk9LTEsYT10Lmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKDsrK2k8YTspaWYobnVsbCE9KG49dFtpXSkmJm4+PW4pe3I9bjticmVha31mb3IoOysraTxhOyludWxsIT0obj10W2ldKSYmbj5yJiYocj1uKX1lbHNle2Zvcig7KytpPGE7KWlmKG51bGwhPShuPWUuY2FsbCh0LHRbaV0saSkpJiZuPj1uKXtyPW47YnJlYWt9Zm9yKDsrK2k8YTspbnVsbCE9KG49ZS5jYWxsKHQsdFtpXSxpKSkmJm4+ciYmKHI9bil9cmV0dXJuIHJ9LHVvLmV4dGVudD1mdW5jdGlvbih0LGUpe3ZhciByLG4saSxhPS0xLG89dC5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcig7KythPG87KWlmKG51bGwhPShuPXRbYV0pJiZuPj1uKXtyPWk9bjticmVha31mb3IoOysrYTxvOyludWxsIT0obj10W2FdKSYmKHI+biYmKHI9biksaTxuJiYoaT1uKSl9ZWxzZXtmb3IoOysrYTxvOylpZihudWxsIT0obj1lLmNhbGwodCx0W2FdLGEpKSYmbj49bil7cj1pPW47YnJlYWt9Zm9yKDsrK2E8bzspbnVsbCE9KG49ZS5jYWxsKHQsdFthXSxhKSkmJihyPm4mJihyPW4pLGk8biYmKGk9bikpfXJldHVybltyLGldfSx1by5zdW09ZnVuY3Rpb24odCxlKXt2YXIgcixuPTAsaT10Lmxlbmd0aCxhPS0xO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7KythPGk7KW8ocj0rdFthXSkmJihuKz1yKTtlbHNlIGZvcig7KythPGk7KW8ocj0rZS5jYWxsKHQsdFthXSxhKSkmJihuKz1yKTtyZXR1cm4gbn0sdW8ubWVhbj1mdW5jdGlvbih0LGUpe3ZhciByLG49MCxpPXQubGVuZ3RoLHM9LTEsbD1pO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7KytzPGk7KW8ocj1hKHRbc10pKT9uKz1yOi0tbDtlbHNlIGZvcig7KytzPGk7KW8ocj1hKGUuY2FsbCh0LHRbc10scykpKT9uKz1yOi0tbDtpZihsKXJldHVybiBuL2x9LHVvLnF1YW50aWxlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9KHQubGVuZ3RoLTEpKmUrMSxuPU1hdGguZmxvb3IociksaT0rdFtuLTFdLGE9ci1uO3JldHVybiBhP2krYSoodFtuXS1pKTppfSx1by5tZWRpYW49ZnVuY3Rpb24odCxlKXt2YXIgcixuPVtdLHM9dC5sZW5ndGgsbD0tMTtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IoOysrbDxzOylvKHI9YSh0W2xdKSkmJm4ucHVzaChyKTtlbHNlIGZvcig7KytsPHM7KW8ocj1hKGUuY2FsbCh0LHRbbF0sbCkpKSYmbi5wdXNoKHIpO2lmKG4ubGVuZ3RoKXJldHVybiB1by5xdWFudGlsZShuLnNvcnQoaSksLjUpfSx1by52YXJpYW5jZT1mdW5jdGlvbih0LGUpe3ZhciByLG4saT10Lmxlbmd0aCxzPTAsbD0wLHU9LTEsYz0wO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7Kyt1PGk7KW8ocj1hKHRbdV0pKSYmKG49ci1zLHMrPW4vKytjLGwrPW4qKHItcykpO2Vsc2UgZm9yKDsrK3U8aTspbyhyPWEoZS5jYWxsKHQsdFt1XSx1KSkpJiYobj1yLXMscys9bi8rK2MsbCs9biooci1zKSk7aWYoYz4xKXJldHVybiBsLyhjLTEpfSx1by5kZXZpYXRpb249ZnVuY3Rpb24oKXt2YXIgdD11by52YXJpYW5jZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHQ/TWF0aC5zcXJ0KHQpOnR9O3ZhciB4bz1zKGkpO3VvLmJpc2VjdExlZnQ9eG8ubGVmdCx1by5iaXNlY3Q9dW8uYmlzZWN0UmlnaHQ9eG8ucmlnaHQsdW8uYmlzZWN0b3I9ZnVuY3Rpb24odCl7cmV0dXJuIHMoMT09PXQubGVuZ3RoP2Z1bmN0aW9uKGUscil7cmV0dXJuIGkodChlKSxyKX06dCl9LHVvLnNodWZmbGU9ZnVuY3Rpb24odCxlLHIpeyhhPWFyZ3VtZW50cy5sZW5ndGgpPDMmJihyPXQubGVuZ3RoLGE8MiYmKGU9MCkpO2Zvcih2YXIgbixpLGE9ci1lO2E7KWk9TWF0aC5yYW5kb20oKSphLS18MCxuPXRbYStlXSx0W2ErZV09dFtpK2VdLHRbaStlXT1uO3JldHVybiB0fSx1by5wZXJtdXRlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPWUubGVuZ3RoLG49bmV3IEFycmF5KHIpO3ItLTspbltyXT10W2Vbcl1dO3JldHVybiBufSx1by5wYWlycz1mdW5jdGlvbih0KXtmb3IodmFyIGUscj0wLG49dC5sZW5ndGgtMSxpPXRbMF0sYT1uZXcgQXJyYXkobjwwPzA6bik7cjxuOylhW3JdPVtlPWksaT10Wysrcl1dO3JldHVybiBhfSx1by50cmFuc3Bvc2U9ZnVuY3Rpb24odCl7aWYoIShpPXQubGVuZ3RoKSlyZXR1cm5bXTtmb3IodmFyIGU9LTEscj11by5taW4odCxsKSxuPW5ldyBBcnJheShyKTsrK2U8cjspZm9yKHZhciBpLGE9LTEsbz1uW2VdPW5ldyBBcnJheShpKTsrK2E8aTspb1thXT10W2FdW2VdO3JldHVybiBufSx1by56aXA9ZnVuY3Rpb24oKXtyZXR1cm4gdW8udHJhbnNwb3NlKGFyZ3VtZW50cyl9LHVvLmtleXM9ZnVuY3Rpb24odCl7dmFyIGU9W107Zm9yKHZhciByIGluIHQpZS5wdXNoKHIpO3JldHVybiBlfSx1by52YWx1ZXM9ZnVuY3Rpb24odCl7dmFyIGU9W107Zm9yKHZhciByIGluIHQpZS5wdXNoKHRbcl0pO3JldHVybiBlfSx1by5lbnRyaWVzPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO2Zvcih2YXIgciBpbiB0KWUucHVzaCh7a2V5OnIsdmFsdWU6dFtyXX0pO3JldHVybiBlfSx1by5tZXJnZT1mdW5jdGlvbih0KXtmb3IodmFyIGUscixuLGk9dC5sZW5ndGgsYT0tMSxvPTA7KythPGk7KW8rPXRbYV0ubGVuZ3RoO2ZvcihyPW5ldyBBcnJheShvKTstLWk+PTA7KWZvcihuPXRbaV0sZT1uLmxlbmd0aDstLWU+PTA7KXJbLS1vXT1uW2VdO3JldHVybiByfTt2YXIgYm89TWF0aC5hYnM7dW8ucmFuZ2U9ZnVuY3Rpb24odCxlLHIpe2lmKGFyZ3VtZW50cy5sZW5ndGg8MyYmKHI9MSxhcmd1bWVudHMubGVuZ3RoPDImJihlPXQsdD0wKSksKGUtdCkvcj09PTEvMCl0aHJvdyBuZXcgRXJyb3IoImluZmluaXRlIHJhbmdlIik7dmFyIG4saT1bXSxhPXUoYm8ocikpLG89LTE7aWYodCo9YSxlKj1hLHIqPWEscjwwKWZvcig7KG49dCtyKisrbyk+ZTspaS5wdXNoKG4vYSk7ZWxzZSBmb3IoOyhuPXQrciorK28pPGU7KWkucHVzaChuL2EpO3JldHVybiBpfSx1by5tYXA9ZnVuY3Rpb24odCxlKXt2YXIgcj1uZXcgaDtpZih0IGluc3RhbmNlb2YgaCl0LmZvckVhY2goZnVuY3Rpb24odCxlKXtyLnNldCh0LGUpfSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpKXt2YXIgbixpPS0xLGE9dC5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2k8YTspci5zZXQoaSx0W2ldKTtlbHNlIGZvcig7KytpPGE7KXIuc2V0KGUuY2FsbCh0LG49dFtpXSxpKSxuKX1lbHNlIGZvcih2YXIgbyBpbiB0KXIuc2V0KG8sdFtvXSk7cmV0dXJuIHJ9O3ZhciBfbz0iX19wcm90b19fIix3bz0iXDAiO2MoaCx7aGFzOnAsZ2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9bZih0KV19LHNldDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9bZih0KV09ZX0scmVtb3ZlOmcsa2V5czptLHZhbHVlczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzLl8pdC5wdXNoKHRoaXMuX1tlXSk7cmV0dXJuIHR9LGVudHJpZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gdGhpcy5fKXQucHVzaCh7a2V5OmQoZSksdmFsdWU6dGhpcy5fW2VdfSk7cmV0dXJuIHR9LHNpemU6dixlbXB0eTp5LGZvckVhY2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHRoaXMuXyl0LmNhbGwodGhpcyxkKGUpLHRoaXMuX1tlXSl9fSksdW8ubmVzdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxvLHMpe2lmKHM+PWEubGVuZ3RoKXJldHVybiBuP24uY2FsbChpLG8pOnI/by5zb3J0KHIpOm87Zm9yKHZhciBsLHUsYyxmLGQ9LTEscD1vLmxlbmd0aCxnPWFbcysrXSxtPW5ldyBoOysrZDxwOykoZj1tLmdldChsPWcodT1vW2RdKSkpP2YucHVzaCh1KTptLnNldChsLFt1XSk7cmV0dXJuIGU/KHU9ZSgpLGM9ZnVuY3Rpb24ocixuKXt1LnNldChyLHQoZSxuLHMpKX0pOih1PXt9LGM9ZnVuY3Rpb24ocixuKXt1W3JdPXQoZSxuLHMpfSksbS5mb3JFYWNoKGMpLHV9ZnVuY3Rpb24gZSh0LHIpe2lmKHI+PWEubGVuZ3RoKXJldHVybiB0O3ZhciBuPVtdLGk9b1tyKytdO3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24odCxpKXtuLnB1c2goe2tleTp0LHZhbHVlczplKGkscil9KX0pLGk/bi5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGkodC5rZXksZS5rZXkpfSk6bn12YXIgcixuLGk9e30sYT1bXSxvPVtdO3JldHVybiBpLm1hcD1mdW5jdGlvbihlLHIpe3JldHVybiB0KHIsZSwwKX0saS5lbnRyaWVzPWZ1bmN0aW9uKHIpe3JldHVybiBlKHQodW8ubWFwLHIsMCksMCl9LGkua2V5PWZ1bmN0aW9uKHQpe3JldHVybiBhLnB1c2godCksaX0saS5zb3J0S2V5cz1mdW5jdGlvbih0KXtyZXR1cm4gb1thLmxlbmd0aC0xXT10LGl9LGkuc29ydFZhbHVlcz1mdW5jdGlvbih0KXtyZXR1cm4gcj10LGl9LGkucm9sbHVwPWZ1bmN0aW9uKHQpe3JldHVybiBuPXQsaX0saX0sdW8uc2V0PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyB4O2lmKHQpZm9yKHZhciByPTAsbj10Lmxlbmd0aDtyPG47KytyKWUuYWRkKHRbcl0pO3JldHVybiBlfSxjKHgse2hhczpwLGFkZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fW2YodCs9IiIpXT0hMCx0fSxyZW1vdmU6Zyx2YWx1ZXM6bSxzaXplOnYsZW1wdHk6eSxmb3JFYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0aGlzLl8pdC5jYWxsKHRoaXMsZChlKSl9fSksdW8uYmVoYXZpb3I9e30sdW8ucmViaW5kPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7KytuPGk7KXRbcj1hcmd1bWVudHNbbl1dPV8odCxlLGVbcl0pO3JldHVybiB0fTt2YXIgTW89WyJ3ZWJraXQiLCJtcyIsIm1veiIsIk1veiIsIm8iLCJPIl07dW8uZGlzcGF0Y2g9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IEEsZT0tMSxyPWFyZ3VtZW50cy5sZW5ndGg7KytlPHI7KXRbYXJndW1lbnRzW2VdXT1rKHQpO3JldHVybiB0fSxBLnByb3RvdHlwZS5vbj1mdW5jdGlvbih0LGUpe3ZhciByPXQuaW5kZXhPZigiLiIpLG49IiI7aWYocj49MCYmKG49dC5zbGljZShyKzEpLHQ9dC5zbGljZSgwLHIpKSx0KXJldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/dGhpc1t0XS5vbihuKTp0aGlzW3RdLm9uKG4sZSk7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKG51bGw9PWUpZm9yKHQgaW4gdGhpcyl0aGlzLmhhc093blByb3BlcnR5KHQpJiZ0aGlzW3RdLm9uKG4sbnVsbCk7cmV0dXJuIHRoaXN9fSx1by5ldmVudD1udWxsLHVvLnJlcXVvdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVwbGFjZShBbywiXFwkJiIpfTt2YXIgQW89L1tcXFxeXCRcKlwrXD9cfFxbXF1cKFwpXC5ce1x9XS9nLGtvPXt9Ll9fcHJvdG9fXz9mdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9OmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByIGluIGUpdFtyXT1lW3JdfSxUbz1mdW5jdGlvbih0LGUpe3JldHVybiBlLnF1ZXJ5U2VsZWN0b3IodCl9LEVvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUucXVlcnlTZWxlY3RvckFsbCh0KX0sU289ZnVuY3Rpb24odCxlKXt2YXIgcj10Lm1hdGNoZXN8fHRbdyh0LCJtYXRjaGVzU2VsZWN0b3IiKV07cmV0dXJuKFNvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIuY2FsbCh0LGUpfSkodCxlKX07ImZ1bmN0aW9uIj09dHlwZW9mIFNpenpsZSYmKFRvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFNpenpsZSh0LGUpWzBdfHxudWxsfSxFbz1TaXp6bGUsU289U2l6emxlLm1hdGNoZXNTZWxlY3RvciksdW8uc2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHVvLnNlbGVjdChmby5kb2N1bWVudEVsZW1lbnQpfTt2YXIgTG89dW8uc2VsZWN0aW9uLnByb3RvdHlwZT1bXTtMby5zZWxlY3Q9ZnVuY3Rpb24odCl7dmFyIGUscixuLGksYT1bXTt0PXoodCk7Zm9yKHZhciBvPS0xLHM9dGhpcy5sZW5ndGg7KytvPHM7KXthLnB1c2goZT1bXSksZS5wYXJlbnROb2RlPShuPXRoaXNbb10pLnBhcmVudE5vZGU7Zm9yKHZhciBsPS0xLHU9bi5sZW5ndGg7KytsPHU7KShpPW5bbF0pPyhlLnB1c2gocj10LmNhbGwoaSxpLl9fZGF0YV9fLGwsbykpLHImJiJfX2RhdGFfXyJpbiBpJiYoci5fX2RhdGFfXz1pLl9fZGF0YV9fKSk6ZS5wdXNoKG51bGwpfXJldHVybiBMKGEpfSxMby5zZWxlY3RBbGw9ZnVuY3Rpb24odCl7dmFyIGUscixuPVtdO3Q9Qyh0KTtmb3IodmFyIGk9LTEsYT10aGlzLmxlbmd0aDsrK2k8YTspZm9yKHZhciBvPXRoaXNbaV0scz0tMSxsPW8ubGVuZ3RoOysrczxsOykocj1vW3NdKSYmKG4ucHVzaChlPWhvKHQuY2FsbChyLHIuX19kYXRhX18scyxpKSkpLGUucGFyZW50Tm9kZT1yKTtyZXR1cm4gTChuKX07dmFyIHpvPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIixDbz17c3ZnOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIseGh0bWw6em8seGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTt1by5ucz17cHJlZml4OkNvLHF1YWxpZnk6ZnVuY3Rpb24odCl7dmFyIGU9dC5pbmRleE9mKCI6Iikscj10O3JldHVybiBlPj0wJiYieG1sbnMiIT09KHI9dC5zbGljZSgwLGUpKSYmKHQ9dC5zbGljZShlKzEpKSxDby5oYXNPd25Qcm9wZXJ0eShyKT97c3BhY2U6Q29bcl0sbG9jYWw6dH06dH19LExvLmF0dHI9ZnVuY3Rpb24odCxlKXtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2lmKCJzdHJpbmciPT10eXBlb2YgdCl7dmFyIHI9dGhpcy5ub2RlKCk7cmV0dXJuIHQ9dW8ubnMucXVhbGlmeSh0KSx0LmxvY2FsP3IuZ2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKTpyLmdldEF0dHJpYnV0ZSh0KX1mb3IoZSBpbiB0KXRoaXMuZWFjaChJKGUsdFtlXSkpO3JldHVybiB0aGlzfXJldHVybiB0aGlzLmVhY2goSSh0LGUpKX0sTG8uY2xhc3NlZD1mdW5jdGlvbih0LGUpe2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7aWYoInN0cmluZyI9PXR5cGVvZiB0KXt2YXIgcj10aGlzLm5vZGUoKSxuPSh0PVIodCkpLmxlbmd0aCxpPS0xO2lmKGU9ci5jbGFzc0xpc3Qpe2Zvcig7KytpPG47KWlmKCFlLmNvbnRhaW5zKHRbaV0pKXJldHVybiExfWVsc2UgZm9yKGU9ci5nZXRBdHRyaWJ1dGUoImNsYXNzIik7KytpPG47KWlmKCFEKHRbaV0pLnRlc3QoZSkpcmV0dXJuITE7cmV0dXJuITB9Zm9yKGUgaW4gdCl0aGlzLmVhY2goTyhlLHRbZV0pKTtyZXR1cm4gdGhpc31yZXR1cm4gdGhpcy5lYWNoKE8odCxlKSl9LExvLnN0eWxlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoO2lmKGk8Myl7aWYoInN0cmluZyIhPXR5cGVvZiB0KXtpPDImJihlPSIiKTtmb3IociBpbiB0KXRoaXMuZWFjaChqKHIsdFtyXSxlKSk7cmV0dXJuIHRoaXN9aWYoaTwyKXt2YXIgYT10aGlzLm5vZGUoKTtyZXR1cm4gbihhKS5nZXRDb21wdXRlZFN0eWxlKGEsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSh0KX1yPSIifXJldHVybiB0aGlzLmVhY2goaih0LGUscikpfSxMby5wcm9wZXJ0eT1mdW5jdGlvbih0LGUpe2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiB0aGlzLm5vZGUoKVt0XTtmb3IoZSBpbiB0KXRoaXMuZWFjaChOKGUsdFtlXSkpO3JldHVybiB0aGlzfXJldHVybiB0aGlzLmVhY2goTih0LGUpKX0sTG8udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PWU/IiI6ZX06bnVsbD09dD9mdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9IiJ9OmZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD10fSk6dGhpcy5ub2RlKCkudGV4dENvbnRlbnR9LExvLmh0bWw9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCJmdW5jdGlvbiI9PXR5cGVvZiB0P2Z1bmN0aW9uKCl7dmFyIGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pbm5lckhUTUw9bnVsbD09ZT8iIjplfTpudWxsPT10P2Z1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9IiJ9OmZ1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9dH0pOnRoaXMubm9kZSgpLmlubmVySFRNTH0sTG8uYXBwZW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0PUIodCksdGhpcy5zZWxlY3QoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcHBlbmRDaGlsZCh0LmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9KX0sTG8uaW5zZXJ0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9Qih0KSxlPXooZSksdGhpcy5zZWxlY3QoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUodC5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fG51bGwpfSl9LExvLnJlbW92ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goVSl9LExvLmRhdGE9ZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKHQscil7dmFyIG4saSxhLG89dC5sZW5ndGgsYz1yLmxlbmd0aCxmPU1hdGgubWluKG8sYyksZD1uZXcgQXJyYXkoYykscD1uZXcgQXJyYXkoYyksZz1uZXcgQXJyYXkobyk7aWYoZSl7dmFyIG0sdj1uZXcgaCx5PW5ldyBBcnJheShvKTtmb3Iobj0tMTsrK248bzspKGk9dFtuXSkmJih2LmhhcyhtPWUuY2FsbChpLGkuX19kYXRhX18sbikpP2dbbl09aTp2LnNldChtLGkpLHlbbl09bSk7Zm9yKG49LTE7KytuPGM7KShpPXYuZ2V0KG09ZS5jYWxsKHIsYT1yW25dLG4pKSk/aSE9PSEwJiYoZFtuXT1pLGkuX19kYXRhX189YSk6cFtuXT1WKGEpLHYuc2V0KG0sITApO2ZvcihuPS0xOysrbjxvOyluIGluIHkmJnYuZ2V0KHlbbl0pIT09ITAmJihnW25dPXRbbl0pfWVsc2V7Zm9yKG49LTE7KytuPGY7KWk9dFtuXSxhPXJbbl0saT8oaS5fX2RhdGFfXz1hLGRbbl09aSk6cFtuXT1WKGEpO2Zvcig7bjxjOysrbilwW25dPVYocltuXSk7Zm9yKDtuPG87KytuKWdbbl09dFtuXX1wLnVwZGF0ZT1kLHAucGFyZW50Tm9kZT1kLnBhcmVudE5vZGU9Zy5wYXJlbnROb2RlPXQucGFyZW50Tm9kZSxzLnB1c2gocCksbC5wdXNoKGQpLHUucHVzaChnKX12YXIgbixpLGE9LTEsbz10aGlzLmxlbmd0aDtpZighYXJndW1lbnRzLmxlbmd0aCl7Zm9yKHQ9bmV3IEFycmF5KG89KG49dGhpc1swXSkubGVuZ3RoKTsrK2E8bzspKGk9blthXSkmJih0W2FdPWkuX19kYXRhX18pO3JldHVybiB0fXZhciBzPVgoW10pLGw9TChbXSksdT1MKFtdKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdClmb3IoOysrYTxvOylyKG49dGhpc1thXSx0LmNhbGwobixuLnBhcmVudE5vZGUuX19kYXRhX18sYSkpO2Vsc2UgZm9yKDsrK2E8bzspcihuPXRoaXNbYV0sdCk7cmV0dXJuIGwuZW50ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gc30sbC5leGl0PWZ1bmN0aW9uKCl7cmV0dXJuIHV9LGx9LExvLmRhdHVtPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMucHJvcGVydHkoIl9fZGF0YV9fIix0KTp0aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIpfSxMby5maWx0ZXI9ZnVuY3Rpb24odCl7dmFyIGUscixuLGk9W107ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXEodCkpO2Zvcih2YXIgYT0wLG89dGhpcy5sZW5ndGg7YTxvO2ErKyl7aS5wdXNoKGU9W10pLGUucGFyZW50Tm9kZT0ocj10aGlzW2FdKS5wYXJlbnROb2RlO2Zvcih2YXIgcz0wLGw9ci5sZW5ndGg7czxsO3MrKykobj1yW3NdKSYmdC5jYWxsKG4sbi5fX2RhdGFfXyxzLGEpJiZlLnB1c2gobil9cmV0dXJuIEwoaSl9LExvLm9yZGVyPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xLGU9dGhpcy5sZW5ndGg7Kyt0PGU7KWZvcih2YXIgcixuPXRoaXNbdF0saT1uLmxlbmd0aC0xLGE9bltpXTstLWk+PTA7KShyPW5baV0pJiYoYSYmYSE9PXIubmV4dFNpYmxpbmcmJmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocixhKSxhPXIpO3JldHVybiB0aGlzfSxMby5zb3J0PWZ1bmN0aW9uKHQpe3Q9SC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Zm9yKHZhciBlPS0xLHI9dGhpcy5sZW5ndGg7KytlPHI7KXRoaXNbZV0uc29ydCh0KTtyZXR1cm4gdGhpcy5vcmRlcigpfSxMby5lYWNoPWZ1bmN0aW9uKHQpe3JldHVybiBHKHRoaXMsZnVuY3Rpb24oZSxyLG4pe3QuY2FsbChlLGUuX19kYXRhX18scixuKX0pfSxMby5jYWxsPWZ1bmN0aW9uKHQpe3ZhciBlPWhvKGFyZ3VtZW50cyk7cmV0dXJuIHQuYXBwbHkoZVswXT10aGlzLGUpLHRoaXN9LExvLmVtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMubm9kZSgpfSxMby5ub2RlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT10aGlzLmxlbmd0aDt0PGU7dCsrKWZvcih2YXIgcj10aGlzW3RdLG49MCxpPXIubGVuZ3RoO248aTtuKyspe3ZhciBhPXJbbl07aWYoYSlyZXR1cm4gYX1yZXR1cm4gbnVsbH0sTG8uc2l6ZT1mdW5jdGlvbigpe3ZhciB0PTA7cmV0dXJuIEcodGhpcyxmdW5jdGlvbigpeysrdH0pLHR9O3ZhciBJbz1bXTt1by5zZWxlY3Rpb24uZW50ZXI9WCx1by5zZWxlY3Rpb24uZW50ZXIucHJvdG90eXBlPUlvLElvLmFwcGVuZD1Mby5hcHBlbmQsSW8uZW1wdHk9TG8uZW1wdHksSW8ubm9kZT1Mby5ub2RlLElvLmNhbGw9TG8uY2FsbCxJby5zaXplPUxvLnNpemUsSW8uc2VsZWN0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxyLG4saSxhLG89W10scz0tMSxsPXRoaXMubGVuZ3RoOysrczxsOyl7bj0oaT10aGlzW3NdKS51cGRhdGUsby5wdXNoKGU9W10pLGUucGFyZW50Tm9kZT1pLnBhcmVudE5vZGU7Zm9yKHZhciB1PS0xLGM9aS5sZW5ndGg7Kyt1PGM7KShhPWlbdV0pPyhlLnB1c2goblt1XT1yPXQuY2FsbChpLnBhcmVudE5vZGUsYS5fX2RhdGFfXyx1LHMpKSxyLl9fZGF0YV9fPWEuX19kYXRhX18pOmUucHVzaChudWxsKX1yZXR1cm4gTChvKX0sSW8uaW5zZXJ0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MiYmKGU9WSh0aGlzKSksTG8uaW5zZXJ0LmNhbGwodGhpcyx0LGUpfSx1by5zZWxlY3Q9ZnVuY3Rpb24odCl7dmFyIHI7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0PyhyPVtUbyh0LGZvKV0sci5wYXJlbnROb2RlPWZvLmRvY3VtZW50RWxlbWVudCk6KHI9W3RdLHIucGFyZW50Tm9kZT1lKHQpKSxMKFtyXSl9LHVvLnNlbGVjdEFsbD1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/KGU9aG8oRW8odCxmbykpLGUucGFyZW50Tm9kZT1mby5kb2N1bWVudEVsZW1lbnQpOihlPWhvKHQpLGUucGFyZW50Tm9kZT1udWxsKSxMKFtlXSl9LExvLm9uPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoO2lmKG48Myl7aWYoInN0cmluZyIhPXR5cGVvZiB0KXtuPDImJihlPSExKTtmb3IociBpbiB0KXRoaXMuZWFjaChXKHIsdFtyXSxlKSk7cmV0dXJuIHRoaXN9aWYobjwyKXJldHVybihuPXRoaXMubm9kZSgpWyJfX29uIit0XSkmJm4uXztyPSExfXJldHVybiB0aGlzLmVhY2goVyh0LGUscikpfTt2YXIgUG89dW8ubWFwKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0pO2ZvJiZQby5mb3JFYWNoKGZ1bmN0aW9uKHQpeyJvbiIrdCBpbiBmbyYmUG8ucmVtb3ZlKHQpfSk7dmFyIERvLFJvPTA7dW8ubW91c2U9ZnVuY3Rpb24odCl7cmV0dXJuICQodCxFKCkpfTt2YXIgT289dGhpcy5uYXZpZ2F0b3ImJi9XZWJLaXQvLnRlc3QodGhpcy5uYXZpZ2F0b3IudXNlckFnZW50KT8tMTowO3VvLnRvdWNoPWZ1bmN0aW9uKHQsZSxyKXtpZihhcmd1bWVudHMubGVuZ3RoPDMmJihyPWUsZT1FKCkuY2hhbmdlZFRvdWNoZXMpLGUpZm9yKHZhciBuLGk9MCxhPWUubGVuZ3RoO2k8YTsrK2kpaWYoKG49ZVtpXSkuaWRlbnRpZmllcj09PXIpcmV0dXJuICQodCxuKX0sdW8uYmVoYXZpb3IuZHJhZz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLm9uKCJtb3VzZWRvd24uZHJhZyIsYSkub24oInRvdWNoc3RhcnQuZHJhZyIsbyl9ZnVuY3Rpb24gZSh0LGUsbixhLG8pe3JldHVybiBmdW5jdGlvbigpe2Z1bmN0aW9uIHMoKXt2YXIgdCxyLG49ZShmLGcpO24mJih0PW5bMF0teFswXSwKcj1uWzFdLXhbMV0scHw9dHxyLHg9bixkKHt0eXBlOiJkcmFnIix4Om5bMF0rdVswXSx5Om5bMV0rdVsxXSxkeDp0LGR5OnJ9KSl9ZnVuY3Rpb24gbCgpe2UoZixnKSYmKHYub24oYSttLG51bGwpLm9uKG8rbSxudWxsKSx5KHApLGQoe3R5cGU6ImRyYWdlbmQifSkpfXZhciB1LGM9dGhpcyxoPXVvLmV2ZW50LnRhcmdldC5jb3JyZXNwb25kaW5nRWxlbWVudHx8dW8uZXZlbnQudGFyZ2V0LGY9Yy5wYXJlbnROb2RlLGQ9ci5vZihjLGFyZ3VtZW50cykscD0wLGc9dCgpLG09Ii5kcmFnIisobnVsbD09Zz8iIjoiLSIrZyksdj11by5zZWxlY3QobihoKSkub24oYSttLHMpLm9uKG8rbSxsKSx5PUsoaCkseD1lKGYsZyk7aT8odT1pLmFwcGx5KGMsYXJndW1lbnRzKSx1PVt1LngteFswXSx1LnkteFsxXV0pOnU9WzAsMF0sZCh7dHlwZToiZHJhZ3N0YXJ0In0pfX12YXIgcj1TKHQsImRyYWciLCJkcmFnc3RhcnQiLCJkcmFnZW5kIiksaT1udWxsLGE9ZShNLHVvLm1vdXNlLG4sIm1vdXNlbW92ZSIsIm1vdXNldXAiKSxvPWUoSix1by50b3VjaCxiLCJ0b3VjaG1vdmUiLCJ0b3VjaGVuZCIpO3JldHVybiB0Lm9yaWdpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1lLHQpOml9LHVvLnJlYmluZCh0LHIsIm9uIil9LHVvLnRvdWNoZXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyJiYoZT1FKCkudG91Y2hlcyksZT9obyhlKS5tYXAoZnVuY3Rpb24oZSl7dmFyIHI9JCh0LGUpO3JldHVybiByLmlkZW50aWZpZXI9ZS5pZGVudGlmaWVyLHJ9KTpbXX07dmFyIEZvPTFlLTYsam89Rm8qRm8sTm89TWF0aC5QSSxCbz0yKk5vLFVvPUJvLUZvLFZvPU5vLzIscW89Tm8vMTgwLEhvPTE4MC9ObyxHbz1NYXRoLlNRUlQyLFhvPTIsWW89NDt1by5pbnRlcnBvbGF0ZVpvb209ZnVuY3Rpb24odCxlKXt2YXIgcixuLGk9dFswXSxhPXRbMV0sbz10WzJdLHM9ZVswXSxsPWVbMV0sdT1lWzJdLGM9cy1pLGg9bC1hLGY9YypjK2gqaDtpZihmPGpvKW49TWF0aC5sb2codS9vKS9HbyxyPWZ1bmN0aW9uKHQpe3JldHVybltpK3QqYyxhK3QqaCxvKk1hdGguZXhwKEdvKnQqbildfTtlbHNle3ZhciBkPU1hdGguc3FydChmKSxwPSh1KnUtbypvK1lvKmYpLygyKm8qWG8qZCksZz0odSp1LW8qby1ZbypmKS8oMip1KlhvKmQpLG09TWF0aC5sb2coTWF0aC5zcXJ0KHAqcCsxKS1wKSx2PU1hdGgubG9nKE1hdGguc3FydChnKmcrMSktZyk7bj0odi1tKS9HbyxyPWZ1bmN0aW9uKHQpe3ZhciBlPXQqbixyPWF0KG0pLHM9by8oWG8qZCkqKHIqb3QoR28qZSttKS1pdChtKSk7cmV0dXJuW2krcypjLGErcypoLG8qci9hdChHbyplK20pXX19cmV0dXJuIHIuZHVyYXRpb249MWUzKm4scn0sdW8uYmVoYXZpb3Iuem9vbT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dC5vbihDLGgpLm9uKFpvKyIuem9vbSIsZCkub24oImRibGNsaWNrLnpvb20iLHApLm9uKEQsZil9ZnVuY3Rpb24gZSh0KXtyZXR1cm5bKHRbMF0tQS54KS9BLmssKHRbMV0tQS55KS9BLmtdfWZ1bmN0aW9uIHIodCl7cmV0dXJuW3RbMF0qQS5rK0EueCx0WzFdKkEuaytBLnldfWZ1bmN0aW9uIGkodCl7QS5rPU1hdGgubWF4KEVbMF0sTWF0aC5taW4oRVsxXSx0KSl9ZnVuY3Rpb24gYSh0LGUpe2U9cihlKSxBLngrPXRbMF0tZVswXSxBLnkrPXRbMV0tZVsxXX1mdW5jdGlvbiBvKGUscixuLG8pe2UuX19jaGFydF9fPXt4OkEueCx5OkEueSxrOkEua30saShNYXRoLnBvdygyLG8pKSxhKG09cixuKSxlPXVvLnNlbGVjdChlKSxMPjAmJihlPWUudHJhbnNpdGlvbigpLmR1cmF0aW9uKEwpKSxlLmNhbGwodC5ldmVudCl9ZnVuY3Rpb24gcygpe18mJl8uZG9tYWluKGIucmFuZ2UoKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuKHQtQS54KS9BLmt9KS5tYXAoYi5pbnZlcnQpKSxNJiZNLmRvbWFpbih3LnJhbmdlKCkubWFwKGZ1bmN0aW9uKHQpe3JldHVybih0LUEueSkvQS5rfSkubWFwKHcuaW52ZXJ0KSl9ZnVuY3Rpb24gbCh0KXt6Kyt8fHQoe3R5cGU6Inpvb21zdGFydCJ9KX1mdW5jdGlvbiB1KHQpe3MoKSx0KHt0eXBlOiJ6b29tIixzY2FsZTpBLmssdHJhbnNsYXRlOltBLngsQS55XX0pfWZ1bmN0aW9uIGModCl7LS16fHwodCh7dHlwZToiem9vbWVuZCJ9KSxtPW51bGwpfWZ1bmN0aW9uIGgoKXtmdW5jdGlvbiB0KCl7cz0xLGEodW8ubW91c2UoaSksZiksdShvKX1mdW5jdGlvbiByKCl7aC5vbihJLG51bGwpLm9uKFAsbnVsbCksZChzKSxjKG8pfXZhciBpPXRoaXMsbz1SLm9mKGksYXJndW1lbnRzKSxzPTAsaD11by5zZWxlY3QobihpKSkub24oSSx0KS5vbihQLHIpLGY9ZSh1by5tb3VzZShpKSksZD1LKGkpO1ZsLmNhbGwoaSksbChvKX1mdW5jdGlvbiBmKCl7ZnVuY3Rpb24gdCgpe3ZhciB0PXVvLnRvdWNoZXMocCk7cmV0dXJuIGQ9QS5rLHQuZm9yRWFjaChmdW5jdGlvbih0KXt0LmlkZW50aWZpZXIgaW4gbSYmKG1bdC5pZGVudGlmaWVyXT1lKHQpKX0pLHR9ZnVuY3Rpb24gcigpe3ZhciBlPXVvLmV2ZW50LnRhcmdldDt1by5zZWxlY3QoZSkub24oYixuKS5vbihfLHMpLHcucHVzaChlKTtmb3IodmFyIHI9dW8uZXZlbnQuY2hhbmdlZFRvdWNoZXMsaT0wLGE9ci5sZW5ndGg7aTxhOysraSltW3JbaV0uaWRlbnRpZmllcl09bnVsbDt2YXIgbD10KCksdT1EYXRlLm5vdygpO2lmKDE9PT1sLmxlbmd0aCl7aWYodS14PDUwMCl7dmFyIGM9bFswXTtvKHAsYyxtW2MuaWRlbnRpZmllcl0sTWF0aC5mbG9vcihNYXRoLmxvZyhBLmspL01hdGguTE4yKSsxKSxUKCl9eD11fWVsc2UgaWYobC5sZW5ndGg+MSl7dmFyIGM9bFswXSxoPWxbMV0sZj1jWzBdLWhbMF0sZD1jWzFdLWhbMV07dj1mKmYrZCpkfX1mdW5jdGlvbiBuKCl7dmFyIHQsZSxyLG4sbz11by50b3VjaGVzKHApO1ZsLmNhbGwocCk7Zm9yKHZhciBzPTAsbD1vLmxlbmd0aDtzPGw7KytzLG49bnVsbClpZihyPW9bc10sbj1tW3IuaWRlbnRpZmllcl0pe2lmKGUpYnJlYWs7dD1yLGU9bn1pZihuKXt2YXIgYz0oYz1yWzBdLXRbMF0pKmMrKGM9clsxXS10WzFdKSpjLGg9diYmTWF0aC5zcXJ0KGMvdik7dD1bKHRbMF0rclswXSkvMiwodFsxXStyWzFdKS8yXSxlPVsoZVswXStuWzBdKS8yLChlWzFdK25bMV0pLzJdLGkoaCpkKX14PW51bGwsYSh0LGUpLHUoZyl9ZnVuY3Rpb24gcygpe2lmKHVvLmV2ZW50LnRvdWNoZXMubGVuZ3RoKXtmb3IodmFyIGU9dW8uZXZlbnQuY2hhbmdlZFRvdWNoZXMscj0wLG49ZS5sZW5ndGg7cjxuOysrcilkZWxldGUgbVtlW3JdLmlkZW50aWZpZXJdO2Zvcih2YXIgaSBpbiBtKXJldHVybiB2b2lkIHQoKX11by5zZWxlY3RBbGwodykub24oeSxudWxsKSxNLm9uKEMsaCkub24oRCxmKSxrKCksYyhnKX12YXIgZCxwPXRoaXMsZz1SLm9mKHAsYXJndW1lbnRzKSxtPXt9LHY9MCx5PSIuem9vbS0iK3VvLmV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmlkZW50aWZpZXIsYj0idG91Y2htb3ZlIit5LF89InRvdWNoZW5kIit5LHc9W10sTT11by5zZWxlY3QocCksaz1LKHApO3IoKSxsKGcpLE0ub24oQyxudWxsKS5vbihELHIpfWZ1bmN0aW9uIGQoKXt2YXIgdD1SLm9mKHRoaXMsYXJndW1lbnRzKTt5P2NsZWFyVGltZW91dCh5KTooVmwuY2FsbCh0aGlzKSxnPWUobT12fHx1by5tb3VzZSh0aGlzKSksbCh0KSkseT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7eT1udWxsLGModCl9LDUwKSxUKCksaShNYXRoLnBvdygyLC4wMDIqV28oKSkqQS5rKSxhKG0sZyksdSh0KX1mdW5jdGlvbiBwKCl7dmFyIHQ9dW8ubW91c2UodGhpcykscj1NYXRoLmxvZyhBLmspL01hdGguTE4yO28odGhpcyx0LGUodCksdW8uZXZlbnQuc2hpZnRLZXk/TWF0aC5jZWlsKHIpLTE6TWF0aC5mbG9vcihyKSsxKX12YXIgZyxtLHYseSx4LGIsXyx3LE0sQT17eDowLHk6MCxrOjF9LGs9Wzk2MCw1MDBdLEU9UW8sTD0yNTAsej0wLEM9Im1vdXNlZG93bi56b29tIixJPSJtb3VzZW1vdmUuem9vbSIsUD0ibW91c2V1cC56b29tIixEPSJ0b3VjaHN0YXJ0Lnpvb20iLFI9Uyh0LCJ6b29tc3RhcnQiLCJ6b29tIiwiem9vbWVuZCIpO3JldHVybiBab3x8KFpvPSJvbndoZWVsImluIGZvPyhXbz1mdW5jdGlvbigpe3JldHVybi11by5ldmVudC5kZWx0YVkqKHVvLmV2ZW50LmRlbHRhTW9kZT8xMjA6MSl9LCJ3aGVlbCIpOiJvbm1vdXNld2hlZWwiaW4gZm8/KFdvPWZ1bmN0aW9uKCl7cmV0dXJuIHVvLmV2ZW50LndoZWVsRGVsdGF9LCJtb3VzZXdoZWVsIik6KFdvPWZ1bmN0aW9uKCl7cmV0dXJuLXVvLmV2ZW50LmRldGFpbH0sIk1vek1vdXNlUGl4ZWxTY3JvbGwiKSksdC5ldmVudD1mdW5jdGlvbih0KXt0LmVhY2goZnVuY3Rpb24oKXt2YXIgdD1SLm9mKHRoaXMsYXJndW1lbnRzKSxlPUE7Qmw/dW8uc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKS5lYWNoKCJzdGFydC56b29tIixmdW5jdGlvbigpe0E9dGhpcy5fX2NoYXJ0X198fHt4OjAseTowLGs6MX0sbCh0KX0pLnR3ZWVuKCJ6b29tOnpvb20iLGZ1bmN0aW9uKCl7dmFyIHI9a1swXSxuPWtbMV0saT1tP21bMF06ci8yLGE9bT9tWzFdOm4vMixvPXVvLmludGVycG9sYXRlWm9vbShbKGktQS54KS9BLmssKGEtQS55KS9BLmssci9BLmtdLFsoaS1lLngpL2UuaywoYS1lLnkpL2UuayxyL2Uua10pO3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj1vKGUpLHM9ci9uWzJdO3RoaXMuX19jaGFydF9fPUE9e3g6aS1uWzBdKnMseTphLW5bMV0qcyxrOnN9LHUodCl9fSkuZWFjaCgiaW50ZXJydXB0Lnpvb20iLGZ1bmN0aW9uKCl7Yyh0KX0pLmVhY2goImVuZC56b29tIixmdW5jdGlvbigpe2ModCl9KToodGhpcy5fX2NoYXJ0X189QSxsKHQpLHUodCksYyh0KSl9KX0sdC50cmFuc2xhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEE9e3g6K2VbMF0seTorZVsxXSxrOkEua30scygpLHQpOltBLngsQS55XX0sdC5zY2FsZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oQT17eDpBLngseTpBLnksazpudWxsfSxpKCtlKSxzKCksdCk6QS5rfSx0LnNjYWxlRXh0ZW50PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhFPW51bGw9PWU/UW86WytlWzBdLCtlWzFdXSx0KTpFfSx0LmNlbnRlcj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj1lJiZbK2VbMF0sK2VbMV1dLHQpOnZ9LHQuc2l6ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaz1lJiZbK2VbMF0sK2VbMV1dLHQpOmt9LHQuZHVyYXRpb249ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEw9K2UsdCk6TH0sdC54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhfPWUsYj1lLmNvcHkoKSxBPXt4OjAseTowLGs6MX0sdCk6X30sdC55PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhNPWUsdz1lLmNvcHkoKSxBPXt4OjAseTowLGs6MX0sdCk6TX0sdW8ucmViaW5kKHQsUiwib24iKX07dmFyIFdvLFpvLFFvPVswLDEvMF07dW8uY29sb3I9bHQsbHQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkrIiJ9LHVvLmhzbD11dDt2YXIgS289dXQucHJvdG90eXBlPW5ldyBsdDtLby5icmlnaHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLnBvdyguNyxhcmd1bWVudHMubGVuZ3RoP3Q6MSksbmV3IHV0KHRoaXMuaCx0aGlzLnMsdGhpcy5sL3QpfSxLby5kYXJrZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5wb3coLjcsYXJndW1lbnRzLmxlbmd0aD90OjEpLG5ldyB1dCh0aGlzLmgsdGhpcy5zLHQqdGhpcy5sKX0sS28ucmdiPWZ1bmN0aW9uKCl7cmV0dXJuIGN0KHRoaXMuaCx0aGlzLnMsdGhpcy5sKX0sdW8uaGNsPWh0O3ZhciAkbz1odC5wcm90b3R5cGU9bmV3IGx0OyRvLmJyaWdodGVyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaHQodGhpcy5oLHRoaXMuYyxNYXRoLm1pbigxMDAsdGhpcy5sK0pvKihhcmd1bWVudHMubGVuZ3RoP3Q6MSkpKX0sJG8uZGFya2VyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaHQodGhpcy5oLHRoaXMuYyxNYXRoLm1heCgwLHRoaXMubC1KbyooYXJndW1lbnRzLmxlbmd0aD90OjEpKSl9LCRvLnJnYj1mdW5jdGlvbigpe3JldHVybiBmdCh0aGlzLmgsdGhpcy5jLHRoaXMubCkucmdiKCl9LHVvLmxhYj1kdDt2YXIgSm89MTgsdHM9Ljk1MDQ3LGVzPTEscnM9MS4wODg4Myxucz1kdC5wcm90b3R5cGU9bmV3IGx0O25zLmJyaWdodGVyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZHQoTWF0aC5taW4oMTAwLHRoaXMubCtKbyooYXJndW1lbnRzLmxlbmd0aD90OjEpKSx0aGlzLmEsdGhpcy5iKX0sbnMuZGFya2VyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZHQoTWF0aC5tYXgoMCx0aGlzLmwtSm8qKGFyZ3VtZW50cy5sZW5ndGg/dDoxKSksdGhpcy5hLHRoaXMuYil9LG5zLnJnYj1mdW5jdGlvbigpe3JldHVybiBwdCh0aGlzLmwsdGhpcy5hLHRoaXMuYil9LHVvLnJnYj14dDt2YXIgaXM9eHQucHJvdG90eXBlPW5ldyBsdDtpcy5icmlnaHRlcj1mdW5jdGlvbih0KXt0PU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/dDoxKTt2YXIgZT10aGlzLnIscj10aGlzLmcsbj10aGlzLmIsaT0zMDtyZXR1cm4gZXx8cnx8bj8oZSYmZTxpJiYoZT1pKSxyJiZyPGkmJihyPWkpLG4mJm48aSYmKG49aSksbmV3IHh0KE1hdGgubWluKDI1NSxlL3QpLE1hdGgubWluKDI1NSxyL3QpLE1hdGgubWluKDI1NSxuL3QpKSk6bmV3IHh0KGksaSxpKX0saXMuZGFya2VyPWZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/dDoxKSxuZXcgeHQodCp0aGlzLnIsdCp0aGlzLmcsdCp0aGlzLmIpfSxpcy5oc2w9ZnVuY3Rpb24oKXtyZXR1cm4gQXQodGhpcy5yLHRoaXMuZyx0aGlzLmIpfSxpcy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiIjIit3dCh0aGlzLnIpK3d0KHRoaXMuZykrd3QodGhpcy5iKX07dmFyIGFzPXVvLm1hcCh7YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fSk7YXMuZm9yRWFjaChmdW5jdGlvbih0LGUpe2FzLnNldCh0LGJ0KGUpKX0pLHVvLmZ1bmN0b3I9U3QsdW8ueGhyPUx0KGIpLHVvLmRzdj1mdW5jdGlvbih0LGUpe2Z1bmN0aW9uIHIodCxyLGEpe2FyZ3VtZW50cy5sZW5ndGg8MyYmKGE9cixyPW51bGwpO3ZhciBvPXp0KHQsZSxudWxsPT1yP246aShyKSxhKTtyZXR1cm4gby5yb3c9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/by5yZXNwb25zZShudWxsPT0ocj10KT9uOmkodCkpOnJ9LG99ZnVuY3Rpb24gbih0KXtyZXR1cm4gci5wYXJzZSh0LnJlc3BvbnNlVGV4dCl9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHIucGFyc2UoZS5yZXNwb25zZVRleHQsdCl9fWZ1bmN0aW9uIGEoZSl7cmV0dXJuIGUubWFwKG8pLmpvaW4odCl9ZnVuY3Rpb24gbyh0KXtyZXR1cm4gcy50ZXN0KHQpPyciJyt0LnJlcGxhY2UoL1wiL2csJyIiJykrJyInOnR9dmFyIHM9bmV3IFJlZ0V4cCgnWyInK3QrIlxuXSIpLGw9dC5jaGFyQ29kZUF0KDApO3JldHVybiByLnBhcnNlPWZ1bmN0aW9uKHQsZSl7dmFyIG47cmV0dXJuIHIucGFyc2VSb3dzKHQsZnVuY3Rpb24odCxyKXtpZihuKXJldHVybiBuKHQsci0xKTt2YXIgaT1uZXcgRnVuY3Rpb24oImQiLCJyZXR1cm4geyIrdC5tYXAoZnVuY3Rpb24odCxlKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodCkrIjogZFsiK2UrIl0ifSkuam9pbigiLCIpKyJ9Iik7bj1lP2Z1bmN0aW9uKHQscil7cmV0dXJuIGUoaSh0KSxyKX06aX0pfSxyLnBhcnNlUm93cz1mdW5jdGlvbih0LGUpe2Z1bmN0aW9uIHIoKXtpZihjPj11KXJldHVybiBvO2lmKGkpcmV0dXJuIGk9ITEsYTt2YXIgZT1jO2lmKDM0PT09dC5jaGFyQ29kZUF0KGUpKXtmb3IodmFyIHI9ZTtyKys8dTspaWYoMzQ9PT10LmNoYXJDb2RlQXQocikpe2lmKDM0IT09dC5jaGFyQ29kZUF0KHIrMSkpYnJlYWs7KytyfWM9cisyO3ZhciBuPXQuY2hhckNvZGVBdChyKzEpO3JldHVybiAxMz09PW4/KGk9ITAsMTA9PT10LmNoYXJDb2RlQXQocisyKSYmKytjKToxMD09PW4mJihpPSEwKSx0LnNsaWNlKGUrMSxyKS5yZXBsYWNlKC8iIi9nLCciJyl9Zm9yKDtjPHU7KXt2YXIgbj10LmNoYXJDb2RlQXQoYysrKSxzPTE7aWYoMTA9PT1uKWk9ITA7ZWxzZSBpZigxMz09PW4paT0hMCwxMD09PXQuY2hhckNvZGVBdChjKSYmKCsrYywrK3MpO2Vsc2UgaWYobiE9PWwpY29udGludWU7cmV0dXJuIHQuc2xpY2UoZSxjLXMpfXJldHVybiB0LnNsaWNlKGUpfWZvcih2YXIgbixpLGE9e30sbz17fSxzPVtdLHU9dC5sZW5ndGgsYz0wLGg9MDsobj1yKCkpIT09bzspe2Zvcih2YXIgZj1bXTtuIT09YSYmbiE9PW87KWYucHVzaChuKSxuPXIoKTtlJiZudWxsPT0oZj1lKGYsaCsrKSl8fHMucHVzaChmKX1yZXR1cm4gc30sci5mb3JtYXQ9ZnVuY3Rpb24oZSl7aWYoQXJyYXkuaXNBcnJheShlWzBdKSlyZXR1cm4gci5mb3JtYXRSb3dzKGUpO3ZhciBuPW5ldyB4LGk9W107cmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdCluLmhhcyhlKXx8aS5wdXNoKG4uYWRkKGUpKX0pLFtpLm1hcChvKS5qb2luKHQpXS5jb25jYXQoZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBvKGVbdF0pfSkuam9pbih0KX0pKS5qb2luKCJcbiIpfSxyLmZvcm1hdFJvd3M9ZnVuY3Rpb24odCl7cmV0dXJuIHQubWFwKGEpLmpvaW4oIlxuIil9LHJ9LHVvLmNzdj11by5kc3YoIiwiLCJ0ZXh0L2NzdiIpLHVvLnRzdj11by5kc3YoIlx0IiwidGV4dC90YWItc2VwYXJhdGVkLXZhbHVlcyIpO3ZhciBvcyxzcyxscyx1cyxjcz10aGlzW3codGhpcywicmVxdWVzdEFuaW1hdGlvbkZyYW1lIildfHxmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHQsMTcpfTt1by50aW1lcj1mdW5jdGlvbigpe1B0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sdW8udGltZXIuZmx1c2g9ZnVuY3Rpb24oKXtSdCgpLE90KCl9LHVvLnJvdW5kPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU/TWF0aC5yb3VuZCh0KihlPU1hdGgucG93KDEwLGUpKSkvZTpNYXRoLnJvdW5kKHQpfTt2YXIgaHM9WyJ5IiwieiIsImEiLCJmIiwicCIsIm4iLCJceGI1IiwibSIsIiIsImsiLCJNIiwiRyIsIlQiLCJQIiwiRSIsIloiLCJZIl0ubWFwKGp0KTt1by5mb3JtYXRQcmVmaXg9ZnVuY3Rpb24odCxlKXt2YXIgcj0wO3JldHVybih0PSt0KSYmKHQ8MCYmKHQqPS0xKSxlJiYodD11by5yb3VuZCh0LEZ0KHQsZSkpKSxyPTErTWF0aC5mbG9vcigxZS0xMitNYXRoLmxvZyh0KS9NYXRoLkxOMTApLHI9TWF0aC5tYXgoLTI0LE1hdGgubWluKDI0LDMqTWF0aC5mbG9vcigoci0xKS8zKSkpKSxoc1s4K3IvM119O3ZhciBmcz0vKD86KFtee10pPyhbPD49Xl0pKT8oWytcLSBdKT8oWyQjXSk/KDApPyhcZCspPygsKT8oXC4tP1xkKyk/KFthLXolXSk/L2ksZHM9dW8ubWFwKHtiOmZ1bmN0aW9uKHQpe3JldHVybiB0LnRvU3RyaW5nKDIpfSxjOmZ1bmN0aW9uKHQpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHQpfSxvOmZ1bmN0aW9uKHQpe3JldHVybiB0LnRvU3RyaW5nKDgpfSx4OmZ1bmN0aW9uKHQpe3JldHVybiB0LnRvU3RyaW5nKDE2KX0sWDpmdW5jdGlvbih0KXtyZXR1cm4gdC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX0sZzpmdW5jdGlvbih0LGUpe3JldHVybiB0LnRvUHJlY2lzaW9uKGUpfSxlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudG9FeHBvbmVudGlhbChlKX0sZjpmdW5jdGlvbih0LGUpe3JldHVybiB0LnRvRml4ZWQoZSl9LHI6ZnVuY3Rpb24odCxlKXtyZXR1cm4odD11by5yb3VuZCh0LEZ0KHQsZSkpKS50b0ZpeGVkKE1hdGgubWF4KDAsTWF0aC5taW4oMjAsRnQodCooMSsxZS0xNSksZSkpKSl9fSkscHM9dW8udGltZT17fSxncz1EYXRlO1V0LnByb3RvdHlwZT17Z2V0RGF0ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDRGF0ZSgpfSxnZXREYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ0RheSgpfSxnZXRGdWxsWWVhcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDRnVsbFllYXIoKX0sZ2V0SG91cnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ0hvdXJzKCl9LGdldE1pbGxpc2Vjb25kczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDTWlsbGlzZWNvbmRzKCl9LGdldE1pbnV0ZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ01pbnV0ZXMoKX0sZ2V0TW9udGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ01vbnRoKCl9LGdldFNlY29uZHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ1NlY29uZHMoKX0sZ2V0VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VGltZSgpfSxnZXRUaW1lem9uZU9mZnNldDpmdW5jdGlvbigpe3JldHVybiAwfSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy52YWx1ZU9mKCl9LHNldERhdGU6ZnVuY3Rpb24oKXttcy5zZXRVVENEYXRlLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXREYXk6ZnVuY3Rpb24oKXttcy5zZXRVVENEYXkuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldEZ1bGxZZWFyOmZ1bmN0aW9uKCl7bXMuc2V0VVRDRnVsbFllYXIuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldEhvdXJzOmZ1bmN0aW9uKCl7bXMuc2V0VVRDSG91cnMuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldE1pbGxpc2Vjb25kczpmdW5jdGlvbigpe21zLnNldFVUQ01pbGxpc2Vjb25kcy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0TWludXRlczpmdW5jdGlvbigpe21zLnNldFVUQ01pbnV0ZXMuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldE1vbnRoOmZ1bmN0aW9uKCl7bXMuc2V0VVRDTW9udGguYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldFNlY29uZHM6ZnVuY3Rpb24oKXttcy5zZXRVVENTZWNvbmRzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRUaW1lOmZ1bmN0aW9uKCl7bXMuc2V0VGltZS5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX19O3ZhciBtcz1EYXRlLnByb3RvdHlwZTtwcy55ZWFyPVZ0KGZ1bmN0aW9uKHQpe3JldHVybiB0PXBzLmRheSh0KSx0LnNldE1vbnRoKDAsMSksdH0sZnVuY3Rpb24odCxlKXt0LnNldEZ1bGxZZWFyKHQuZ2V0RnVsbFllYXIoKStlKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0RnVsbFllYXIoKX0pLHBzLnllYXJzPXBzLnllYXIucmFuZ2UscHMueWVhcnMudXRjPXBzLnllYXIudXRjLnJhbmdlLHBzLmRheT1WdChmdW5jdGlvbih0KXt2YXIgZT1uZXcgZ3MoMmUzLDApO3JldHVybiBlLnNldEZ1bGxZZWFyKHQuZ2V0RnVsbFllYXIoKSx0LmdldE1vbnRoKCksdC5nZXREYXRlKCkpLGV9LGZ1bmN0aW9uKHQsZSl7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpK2UpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXREYXRlKCktMX0pLHBzLmRheXM9cHMuZGF5LnJhbmdlLHBzLmRheXMudXRjPXBzLmRheS51dGMucmFuZ2UscHMuZGF5T2ZZZWFyPWZ1bmN0aW9uKHQpe3ZhciBlPXBzLnllYXIodCk7cmV0dXJuIE1hdGguZmxvb3IoKHQtZS02ZTQqKHQuZ2V0VGltZXpvbmVPZmZzZXQoKS1lLmdldFRpbWV6b25lT2Zmc2V0KCkpKS84NjRlNSl9LFsic3VuZGF5IiwibW9uZGF5IiwidHVlc2RheSIsIndlZG5lc2RheSIsInRodXJzZGF5IiwiZnJpZGF5Iiwic2F0dXJkYXkiXS5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7ZT03LWU7dmFyIHI9cHNbdF09VnQoZnVuY3Rpb24odCl7cmV0dXJuKHQ9cHMuZGF5KHQpKS5zZXREYXRlKHQuZ2V0RGF0ZSgpLSh0LmdldERheSgpK2UpJTcpLHR9LGZ1bmN0aW9uKHQsZSl7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpKzcqTWF0aC5mbG9vcihlKSl9LGZ1bmN0aW9uKHQpe3ZhciByPXBzLnllYXIodCkuZ2V0RGF5KCk7cmV0dXJuIE1hdGguZmxvb3IoKHBzLmRheU9mWWVhcih0KSsocitlKSU3KS83KS0ociE9PWUpfSk7cHNbdCsicyJdPXIucmFuZ2UscHNbdCsicyJdLnV0Yz1yLnV0Yy5yYW5nZSxwc1t0KyJPZlllYXIiXT1mdW5jdGlvbih0KXt2YXIgcj1wcy55ZWFyKHQpLmdldERheSgpO3JldHVybiBNYXRoLmZsb29yKChwcy5kYXlPZlllYXIodCkrKHIrZSklNykvNyl9fSkscHMud2Vlaz1wcy5zdW5kYXkscHMud2Vla3M9cHMuc3VuZGF5LnJhbmdlLHBzLndlZWtzLnV0Yz1wcy5zdW5kYXkudXRjLnJhbmdlLHBzLndlZWtPZlllYXI9cHMuc3VuZGF5T2ZZZWFyO3ZhciB2cz17Ii0iOiIiLF86IiAiLDA6IjAifSx5cz0vXlxzKlxkKy8seHM9L14lLzt1by5sb2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJue251bWJlckZvcm1hdDpOdCh0KSx0aW1lRm9ybWF0Okh0KHQpfX07dmFyIGJzPXVvLmxvY2FsZSh7ZGVjaW1hbDoiLiIsdGhvdXNhbmRzOiIsIixncm91cGluZzpbM10sY3VycmVuY3k6WyIkIiwiIl0sZGF0ZVRpbWU6IiVhICViICVlICVYICVZIixkYXRlOiIlbS8lZC8lWSIsdGltZToiJUg6JU06JVMiLHBlcmlvZHM6WyJBTSIsIlBNIl0sZGF5czpbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sc2hvcnREYXlzOlsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0Il0sbW9udGhzOlsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxzaG9ydE1vbnRoczpbIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdfSk7dW8uZm9ybWF0PWJzLm51bWJlckZvcm1hdCx1by5nZW89e30saGUucHJvdG90eXBlPXtzOjAsdDowLGFkZDpmdW5jdGlvbih0KXtmZSh0LHRoaXMudCxfcyksZmUoX3Mucyx0aGlzLnMsdGhpcyksdGhpcy5zP3RoaXMudCs9X3MudDp0aGlzLnM9X3MudH0scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnM9dGhpcy50PTB9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zfX07dmFyIF9zPW5ldyBoZTt1by5nZW8uc3RyZWFtPWZ1bmN0aW9uKHQsZSl7dCYmd3MuaGFzT3duUHJvcGVydHkodC50eXBlKT93c1t0LnR5cGVdKHQsZSk6ZGUodCxlKX07dmFyIHdzPXtGZWF0dXJlOmZ1bmN0aW9uKHQsZSl7ZGUodC5nZW9tZXRyeSxlKX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9dC5mZWF0dXJlcyxuPS0xLGk9ci5sZW5ndGg7KytuPGk7KWRlKHJbbl0uZ2VvbWV0cnksZSl9fSxNcz17U3BoZXJlOmZ1bmN0aW9uKHQsZSl7ZS5zcGhlcmUoKX0sUG9pbnQ6ZnVuY3Rpb24odCxlKXt0PXQuY29vcmRpbmF0ZXMsZS5wb2ludCh0WzBdLHRbMV0sdFsyXSl9LE11bHRpUG9pbnQ6ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9dC5jb29yZGluYXRlcyxuPS0xLGk9ci5sZW5ndGg7KytuPGk7KXQ9cltuXSxlLnBvaW50KHRbMF0sdFsxXSx0WzJdKX0sTGluZVN0cmluZzpmdW5jdGlvbih0LGUpe3BlKHQuY29vcmRpbmF0ZXMsZSwwKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXQuY29vcmRpbmF0ZXMsbj0tMSxpPXIubGVuZ3RoOysrbjxpOylwZShyW25dLGUsMCl9LFBvbHlnb246ZnVuY3Rpb24odCxlKXtnZSh0LmNvb3JkaW5hdGVzLGUpfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9dC5jb29yZGluYXRlcyxuPS0xLGk9ci5sZW5ndGg7KytuPGk7KWdlKHJbbl0sZSl9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10Lmdlb21ldHJpZXMsbj0tMSxpPXIubGVuZ3RoOysrbjxpOylkZShyW25dLGUpfX07dW8uZ2VvLmFyZWE9ZnVuY3Rpb24odCl7cmV0dXJuIEFzPTAsdW8uZ2VvLnN0cmVhbSh0LFRzKSxBc307dmFyIEFzLGtzPW5ldyBoZSxUcz17c3BoZXJlOmZ1bmN0aW9uKCl7QXMrPTQqTm99LHBvaW50Ok0sbGluZVN0YXJ0Ok0sbGluZUVuZDpNLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2tzLnJlc2V0KCksVHMubGluZVN0YXJ0PW1lfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9MiprcztBcys9dDwwPzQqTm8rdDp0LFRzLmxpbmVTdGFydD1Ucy5saW5lRW5kPVRzLnBvaW50PU19fTt1by5nZW8uYm91bmRzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3gucHVzaChiPVtjPXQsZj10XSksZTxoJiYoaD1lKSxlPmQmJihkPWUpfWZ1bmN0aW9uIGUoZSxyKXt2YXIgbj12ZShbZSpxbyxyKnFvXSk7aWYodil7dmFyIGk9eGUodixuKSxhPVtpWzFdLC1pWzBdLDBdLG89eGUoYSxpKTt3ZShvKSxvPU1lKG8pO3ZhciBsPWUtcCx1PWw+MD8xOi0xLGc9b1swXSpIbyp1LG09Ym8obCk+MTgwO2lmKG1eKHUqcDxnJiZnPHUqZSkpe3ZhciB5PW9bMV0qSG87eT5kJiYoZD15KX1lbHNlIGlmKGc9KGcrMzYwKSUzNjAtMTgwLG1eKHUqcDxnJiZnPHUqZSkpe3ZhciB5PS1vWzFdKkhvO3k8aCYmKGg9eSl9ZWxzZSByPGgmJihoPXIpLHI+ZCYmKGQ9cik7bT9lPHA/cyhjLGUpPnMoYyxmKSYmKGY9ZSk6cyhlLGYpPnMoYyxmKSYmKGM9ZSk6Zj49Yz8oZTxjJiYoYz1lKSxlPmYmJihmPWUpKTplPnA/cyhjLGUpPnMoYyxmKSYmKGY9ZSk6cyhlLGYpPnMoYyxmKSYmKGM9ZSl9ZWxzZSB0KGUscik7dj1uLHA9ZX1mdW5jdGlvbiByKCl7Xy5wb2ludD1lfWZ1bmN0aW9uIG4oKXtiWzBdPWMsYlsxXT1mLF8ucG9pbnQ9dCx2PW51bGx9ZnVuY3Rpb24gaSh0LHIpe2lmKHYpe3ZhciBuPXQtcDt5Kz1ibyhuKT4xODA/bisobj4wPzM2MDotMzYwKTpufWVsc2UgZz10LG09cjtUcy5wb2ludCh0LHIpLGUodCxyKX1mdW5jdGlvbiBhKCl7VHMubGluZVN0YXJ0KCl9ZnVuY3Rpb24gbygpe2koZyxtKSxUcy5saW5lRW5kKCksYm8oeSk+Rm8mJihjPS0oZj0xODApKSxiWzBdPWMsYlsxXT1mLHY9bnVsbH1mdW5jdGlvbiBzKHQsZSl7cmV0dXJuKGUtPXQpPDA/ZSszNjA6ZX1mdW5jdGlvbiBsKHQsZSl7cmV0dXJuIHRbMF0tZVswXX1mdW5jdGlvbiB1KHQsZSl7cmV0dXJuIGVbMF08PWVbMV0/ZVswXTw9dCYmdDw9ZVsxXTp0PGVbMF18fGVbMV08dH12YXIgYyxoLGYsZCxwLGcsbSx2LHkseCxiLF89e3BvaW50OnQsbGluZVN0YXJ0OnIsbGluZUVuZDpuLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe18ucG9pbnQ9aSxfLmxpbmVTdGFydD1hLF8ubGluZUVuZD1vLHk9MCxUcy5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe1RzLnBvbHlnb25FbmQoKSxfLnBvaW50PXQsXy5saW5lU3RhcnQ9cixfLmxpbmVFbmQ9bixrczwwPyhjPS0oZj0xODApLGg9LShkPTkwKSk6eT5Gbz9kPTkwOnk8LUZvJiYoaD0tOTApLGJbMF09YyxiWzFdPWZ9fTtyZXR1cm4gZnVuY3Rpb24odCl7ZD1mPS0oYz1oPTEvMCkseD1bXSx1by5nZW8uc3RyZWFtKHQsXyk7dmFyIGU9eC5sZW5ndGg7aWYoZSl7eC5zb3J0KGwpO2Zvcih2YXIgcixuPTEsaT14WzBdLGE9W2ldO248ZTsrK24pcj14W25dLHUoclswXSxpKXx8dShyWzFdLGkpPyhzKGlbMF0sclsxXSk+cyhpWzBdLGlbMV0pJiYoaVsxXT1yWzFdKSxzKHJbMF0saVsxXSk+cyhpWzBdLGlbMV0pJiYoaVswXT1yWzBdKSk6YS5wdXNoKGk9cik7Zm9yKHZhciBvLHIscD0tKDEvMCksZT1hLmxlbmd0aC0xLG49MCxpPWFbZV07bjw9ZTtpPXIsKytuKXI9YVtuXSwobz1zKGlbMV0sclswXSkpPnAmJihwPW8sYz1yWzBdLGY9aVsxXSl9cmV0dXJuIHg9Yj1udWxsLGM9PT0xLzB8fGg9PT0xLzA/W1tOYU4sTmFOXSxbTmFOLE5hTl1dOltbYyxoXSxbZixkXV19fSgpLHVvLmdlby5jZW50cm9pZD1mdW5jdGlvbih0KXtFcz1Tcz1Mcz16cz1Dcz1Jcz1Qcz1Ecz1Scz1Pcz1Gcz0wLHVvLmdlby5zdHJlYW0odCxqcyk7dmFyIGU9UnMscj1PcyxuPUZzLGk9ZSplK3IqcituKm47cmV0dXJuIGk8am8mJihlPUlzLHI9UHMsbj1EcyxTczxGbyYmKGU9THMscj16cyxuPUNzKSxpPWUqZStyKnIrbipuLGk8am8pP1tOYU4sTmFOXTpbTWF0aC5hdGFuMihyLGUpKkhvLG50KG4vTWF0aC5zcXJ0KGkpKSpIb119O3ZhciBFcyxTcyxMcyx6cyxDcyxJcyxQcyxEcyxScyxPcyxGcyxqcz17c3BoZXJlOk0scG9pbnQ6a2UsbGluZVN0YXJ0OkVlLGxpbmVFbmQ6U2UscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7anMubGluZVN0YXJ0PUxlfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7anMubGluZVN0YXJ0PUVlfX0sTnM9UmUoQ2UsTmUsVWUsWy1ObywtTm8vMl0pLEJzPTFlOTt1by5nZW8uY2xpcEV4dGVudD1mdW5jdGlvbigpe3ZhciB0LGUscixuLGksYSxvPXtzdHJlYW06ZnVuY3Rpb24odCl7cmV0dXJuIGkmJihpLnZhbGlkPSExKSxpPWEodCksaS52YWxpZD0hMCxpfSxleHRlbnQ6ZnVuY3Rpb24ocyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9R2UodD0rc1swXVswXSxlPStzWzBdWzFdLHI9K3NbMV1bMF0sbj0rc1sxXVsxXSksaSYmKGkudmFsaWQ9ITEsaT1udWxsKSxvKTpbW3QsZV0sW3Isbl1dfX07cmV0dXJuIG8uZXh0ZW50KFtbMCwwXSxbOTYwLDUwMF1dKX0sKHVvLmdlby5jb25pY0VxdWFsQXJlYT1mdW5jdGlvbigpe3JldHVybiBYZShZZSl9KS5yYXc9WWUsdW8uZ2VvLmFsYmVycz1mdW5jdGlvbigpe3JldHVybiB1by5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWzk2LDBdKS5jZW50ZXIoWy0uNiwzOC43XSkucGFyYWxsZWxzKFsyOS41LDQ1LjVdKS5zY2FsZSgxMDcwKX0sdW8uZ2VvLmFsYmVyc1VzYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIGE9dFswXSxvPXRbMV07cmV0dXJuIGU9bnVsbCxyKGEsbyksZXx8KG4oYSxvKSxlKXx8aShhLG8pLGV9dmFyIGUscixuLGksYT11by5nZW8uYWxiZXJzKCksbz11by5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWzE1NCwwXSkuY2VudGVyKFstMiw1OC41XSkucGFyYWxsZWxzKFs1NSw2NV0pLHM9dW8uZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFsxNTcsMF0pLmNlbnRlcihbLTMsMTkuOV0pLnBhcmFsbGVscyhbOCwxOF0pLGw9e3BvaW50OmZ1bmN0aW9uKHQscil7ZT1bdCxyXX19O3JldHVybiB0LmludmVydD1mdW5jdGlvbih0KXt2YXIgZT1hLnNjYWxlKCkscj1hLnRyYW5zbGF0ZSgpLG49KHRbMF0tclswXSkvZSxpPSh0WzFdLXJbMV0pL2U7cmV0dXJuKGk+PS4xMiYmaTwuMjM0JiZuPj0tLjQyNSYmbjwtLjIxND9vOmk+PS4xNjYmJmk8LjIzNCYmbj49LS4yMTQmJm48LS4xMTU/czphKS5pbnZlcnQodCl9LHQuc3RyZWFtPWZ1bmN0aW9uKHQpe3ZhciBlPWEuc3RyZWFtKHQpLHI9by5zdHJlYW0odCksbj1zLnN0cmVhbSh0KTtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24odCxpKXtlLnBvaW50KHQsaSksci5wb2ludCh0LGkpLG4ucG9pbnQodCxpKX0sc3BoZXJlOmZ1bmN0aW9uKCl7ZS5zcGhlcmUoKSxyLnNwaGVyZSgpLG4uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe2UubGluZVN0YXJ0KCksci5saW5lU3RhcnQoKSxuLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7ZS5saW5lRW5kKCksci5saW5lRW5kKCksbi5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2UucG9seWdvblN0YXJ0KCksci5wb2x5Z29uU3RhcnQoKSxuLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7ZS5wb2x5Z29uRW5kKCksci5wb2x5Z29uRW5kKCksbi5wb2x5Z29uRW5kKCl9fX0sdC5wcmVjaXNpb249ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGEucHJlY2lzaW9uKGUpLG8ucHJlY2lzaW9uKGUpLHMucHJlY2lzaW9uKGUpLHQpOmEucHJlY2lzaW9uKCl9LHQuc2NhbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGEuc2NhbGUoZSksby5zY2FsZSguMzUqZSkscy5zY2FsZShlKSx0LnRyYW5zbGF0ZShhLnRyYW5zbGF0ZSgpKSk6YS5zY2FsZSgpfSx0LnRyYW5zbGF0ZT1mdW5jdGlvbihlKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gYS50cmFuc2xhdGUoKTt2YXIgdT1hLnNjYWxlKCksYz0rZVswXSxoPStlWzFdO3JldHVybiByPWEudHJhbnNsYXRlKGUpLmNsaXBFeHRlbnQoW1tjLS40NTUqdSxoLS4yMzgqdV0sW2MrLjQ1NSp1LGgrLjIzOCp1XV0pLnN0cmVhbShsKS5wb2ludCxuPW8udHJhbnNsYXRlKFtjLS4zMDcqdSxoKy4yMDEqdV0pLmNsaXBFeHRlbnQoW1tjLS40MjUqdStGbyxoKy4xMip1K0ZvXSxbYy0uMjE0KnUtRm8saCsuMjM0KnUtRm9dXSkuc3RyZWFtKGwpLnBvaW50LGk9cy50cmFuc2xhdGUoW2MtLjIwNSp1LGgrLjIxMip1XSkuY2xpcEV4dGVudChbW2MtLjIxNCp1K0ZvLGgrLjE2Nip1K0ZvXSxbYy0uMTE1KnUtRm8saCsuMjM0KnUtRm9dXSkuc3RyZWFtKGwpLnBvaW50LHR9LHQuc2NhbGUoMTA3MCl9O3ZhciBVcyxWcyxxcyxIcyxHcyxYcyxZcz17cG9pbnQ6TSxsaW5lU3RhcnQ6TSxsaW5lRW5kOk0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7VnM9MCxZcy5saW5lU3RhcnQ9V2V9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtZcy5saW5lU3RhcnQ9WXMubGluZUVuZD1Zcy5wb2ludD1NLFVzKz1ibyhWcy8yKX19LFdzPXtwb2ludDpaZSxsaW5lU3RhcnQ6TSxsaW5lRW5kOk0scG9seWdvblN0YXJ0Ok0scG9seWdvbkVuZDpNfSxacz17cG9pbnQ6JGUsbGluZVN0YXJ0OkplLGxpbmVFbmQ6dHIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7WnMubGluZVN0YXJ0PWVyfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7WnMucG9pbnQ9JGUsWnMubGluZVN0YXJ0PUplLFpzLmxpbmVFbmQ9dHJ9fTt1by5nZW8ucGF0aD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7cmV0dXJuIHQmJigiZnVuY3Rpb24iPT10eXBlb2YgcyYmYS5wb2ludFJhZGl1cygrcy5hcHBseSh0aGlzLGFyZ3VtZW50cykpLG8mJm8udmFsaWR8fChvPWkoYSkpLHVvLmdlby5zdHJlYW0odCxvKSksYS5yZXN1bHQoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIG89bnVsbCx0fXZhciByLG4saSxhLG8scz00LjU7cmV0dXJuIHQuYXJlYT1mdW5jdGlvbih0KXtyZXR1cm4gVXM9MCx1by5nZW8uc3RyZWFtKHQsaShZcykpLFVzfSx0LmNlbnRyb2lkPWZ1bmN0aW9uKHQpe3JldHVybiBMcz16cz1Dcz1Jcz1Qcz1Ecz1Scz1Pcz1Gcz0wLHVvLmdlby5zdHJlYW0odCxpKFpzKSksRnM/W1JzL0ZzLE9zL0ZzXTpEcz9bSXMvRHMsUHMvRHNdOkNzP1tMcy9Dcyx6cy9Dc106W05hTixOYU5dfSx0LmJvdW5kcz1mdW5jdGlvbih0KXtyZXR1cm4gR3M9WHM9LShxcz1Icz0xLzApLHVvLmdlby5zdHJlYW0odCxpKFdzKSksW1txcyxIc10sW0dzLFhzXV19LHQucHJvamVjdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0ocj10KT90LnN0cmVhbXx8aXIodCk6YixlKCkpOnJ9LHQuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1udWxsPT0obj10KT9uZXcgUWU6bmV3IHJyKHQpLCJmdW5jdGlvbiIhPXR5cGVvZiBzJiZhLnBvaW50UmFkaXVzKHMpLGUoKSk6bn0sdC5wb2ludFJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOihhLnBvaW50UmFkaXVzKCtlKSwrZSksdCk6c30sdC5wcm9qZWN0aW9uKHVvLmdlby5hbGJlcnNVc2EoKSkuY29udGV4dChudWxsKX0sdW8uZ2VvLnRyYW5zZm9ybT1mdW5jdGlvbih0KXtyZXR1cm57c3RyZWFtOmZ1bmN0aW9uKGUpe3ZhciByPW5ldyBhcihlKTtmb3IodmFyIG4gaW4gdClyW25dPXRbbl07cmV0dXJuIHJ9fX0sYXIucHJvdG90eXBlPXtwb2ludDpmdW5jdGlvbih0LGUpe3RoaXMuc3RyZWFtLnBvaW50KHQsZSl9LHNwaGVyZTpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uRW5kKCl9fSx1by5nZW8ucHJvamVjdGlvbj1zcix1by5nZW8ucHJvamVjdGlvbk11dGF0b3I9bHIsKHVvLmdlby5lcXVpcmVjdGFuZ3VsYXI9ZnVuY3Rpb24oKXtyZXR1cm4gc3IoY3IpfSkucmF3PWNyLmludmVydD1jcix1by5nZW8ucm90YXRpb249ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gZT10KGVbMF0qcW8sZVsxXSpxbyksZVswXSo9SG8sZVsxXSo9SG8sZX1yZXR1cm4gdD1mcih0WzBdJTM2MCpxbyx0WzFdKnFvLHQubGVuZ3RoPjI/dFsyXSpxbzowKSxlLmludmVydD1mdW5jdGlvbihlKXtyZXR1cm4gZT10LmludmVydChlWzBdKnFvLGVbMV0qcW8pLGVbMF0qPUhvLGVbMV0qPUhvLGV9LGV9LGhyLmludmVydD1jcix1by5nZW8uY2lyY2xlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciB0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOm4sZT1mcigtdFswXSpxbywtdFsxXSpxbywwKS5pbnZlcnQsaT1bXTtyZXR1cm4gcihudWxsLG51bGwsMSx7cG9pbnQ6ZnVuY3Rpb24odCxyKXtpLnB1c2godD1lKHQscikpLHRbMF0qPUhvLHRbMV0qPUhvfX0pLHt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbaV19fXZhciBlLHIsbj1bMCwwXSxpPTY7cmV0dXJuIHQub3JpZ2luPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWUsdCk6bn0sdC5hbmdsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1tcigoZT0rbikqcW8saSpxbyksdCk6ZX0sdC5wcmVjaXNpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bXIoZSpxbywoaT0rbikqcW8pLHQpOml9LHQuYW5nbGUoOTApfSx1by5nZW8uZGlzdGFuY2U9ZnVuY3Rpb24odCxlKXt2YXIgcixuPShlWzBdLXRbMF0pKnFvLGk9dFsxXSpxbyxhPWVbMV0qcW8sbz1NYXRoLnNpbihuKSxzPU1hdGguY29zKG4pLGw9TWF0aC5zaW4oaSksdT1NYXRoLmNvcyhpKSxjPU1hdGguc2luKGEpLGg9TWF0aC5jb3MoYSk7cmV0dXJuIE1hdGguYXRhbjIoTWF0aC5zcXJ0KChyPWgqbykqcisocj11KmMtbCpoKnMpKnIpLGwqYyt1Kmgqcyl9LHVvLmdlby5ncmF0aWN1bGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7cmV0dXJue3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6ZSgpfX1mdW5jdGlvbiBlKCl7cmV0dXJuIHVvLnJhbmdlKE1hdGguY2VpbChhL20pKm0saSxtKS5tYXAoZikuY29uY2F0KHVvLnJhbmdlKE1hdGguY2VpbCh1L3YpKnYsbCx2KS5tYXAoZCkpLmNvbmNhdCh1by5yYW5nZShNYXRoLmNlaWwobi9wKSpwLHIscCkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBibyh0JW0pPkZvfSkubWFwKGMpKS5jb25jYXQodW8ucmFuZ2UoTWF0aC5jZWlsKHMvZykqZyxvLGcpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gYm8odCV2KT5Gb30pLm1hcChoKSl9dmFyIHIsbixpLGEsbyxzLGwsdSxjLGgsZixkLHA9MTAsZz1wLG09OTAsdj0zNjAseT0yLjU7cmV0dXJuIHQubGluZXM9ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLm1hcChmdW5jdGlvbih0KXtyZXR1cm57dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6dH19KX0sdC5vdXRsaW5lPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltmKGEpLmNvbmNhdChkKGwpLnNsaWNlKDEpLGYoaSkucmV2ZXJzZSgpLnNsaWNlKDEpLGQodSkucmV2ZXJzZSgpLnNsaWNlKDEpKV19fSx0LmV4dGVudD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90Lm1ham9yRXh0ZW50KGUpLm1pbm9yRXh0ZW50KGUpOnQubWlub3JFeHRlbnQoKX0sdC5tYWpvckV4dGVudD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0rZVswXVswXSxpPStlWzFdWzBdLHU9K2VbMF1bMV0sbD0rZVsxXVsxXSxhPmkmJihlPWEsYT1pLGk9ZSksdT5sJiYoZT11LHU9bCxsPWUpLHQucHJlY2lzaW9uKHkpKTpbW2EsdV0sW2ksbF1dfSx0Lm1pbm9yRXh0ZW50PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStlWzBdWzBdLHI9K2VbMV1bMF0scz0rZVswXVsxXSxvPStlWzFdWzFdLG4+ciYmKGU9bixuPXIscj1lKSxzPm8mJihlPXMscz1vLG89ZSksdC5wcmVjaXNpb24oeSkpOltbbixzXSxbcixvXV19LHQuc3RlcD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90Lm1ham9yU3RlcChlKS5taW5vclN0ZXAoZSk6dC5taW5vclN0ZXAoKX0sdC5tYWpvclN0ZXA9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG09K2VbMF0sdj0rZVsxXSx0KTpbbSx2XX0sdC5taW5vclN0ZXA9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9K2VbMF0sZz0rZVsxXSx0KTpbcCxnXX0sdC5wcmVjaXNpb249ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9K2UsYz15cihzLG8sOTApLGg9eHIobixyLHkpLGY9eXIodSxsLDkwKSxkPXhyKGEsaSx5KSx0KTp5fSx0Lm1ham9yRXh0ZW50KFtbLTE4MCwtOTArRm9dLFsxODAsOTAtRm9dXSkubWlub3JFeHRlbnQoW1stMTgwLC04MC1Gb10sWzE4MCw4MCtGb11dKX0sdW8uZ2VvLmdyZWF0QXJjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3JldHVybnt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczpbZXx8bi5hcHBseSh0aGlzLGFyZ3VtZW50cykscnx8aS5hcHBseSh0aGlzLGFyZ3VtZW50cyldfX12YXIgZSxyLG49YnIsaT1fcjtyZXR1cm4gdC5kaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB1by5nZW8uZGlzdGFuY2UoZXx8bi5hcHBseSh0aGlzLGFyZ3VtZW50cykscnx8aS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSx0LnNvdXJjZT1mdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1yLGU9ImZ1bmN0aW9uIj09dHlwZW9mIHI/bnVsbDpyLHQpOm59LHQudGFyZ2V0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPWUscj0iZnVuY3Rpb24iPT10eXBlb2YgZT9udWxsOmUsdCk6aX0sdC5wcmVjaXNpb249ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90OjB9LHR9LHVvLmdlby5pbnRlcnBvbGF0ZT1mdW5jdGlvbih0LGUpe3JldHVybiB3cih0WzBdKnFvLHRbMV0qcW8sZVswXSpxbyxlWzFdKnFvKX0sdW8uZ2VvLmxlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gUXM9MCx1by5nZW8uc3RyZWFtKHQsS3MpLFFzfTt2YXIgUXMsS3M9e3NwaGVyZTpNLHBvaW50Ok0sbGluZVN0YXJ0Ok1yLGxpbmVFbmQ6TSxwb2x5Z29uU3RhcnQ6TSxwb2x5Z29uRW5kOk19LCRzPUFyKGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoMi8oMSt0KSl9LGZ1bmN0aW9uKHQpe3JldHVybiAyKk1hdGguYXNpbih0LzIpfSk7KHVvLmdlby5hemltdXRoYWxFcXVhbEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gc3IoJHMpfSkucmF3PSRzO3ZhciBKcz1BcihmdW5jdGlvbih0KXt2YXIgZT1NYXRoLmFjb3ModCk7cmV0dXJuIGUmJmUvTWF0aC5zaW4oZSl9LGIpOyh1by5nZW8uYXppbXV0aGFsRXF1aWRpc3RhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gc3IoSnMpfSkucmF3PUpzLCh1by5nZW8uY29uaWNDb25mb3JtYWw9ZnVuY3Rpb24oKXtyZXR1cm4gWGUoa3IpfSkucmF3PWtyLCh1by5nZW8uY29uaWNFcXVpZGlzdGFudD1mdW5jdGlvbigpe3JldHVybiBYZShUcil9KS5yYXc9VHI7dmFyIHRsPUFyKGZ1bmN0aW9uKHQpe3JldHVybiAxL3R9LE1hdGguYXRhbik7KHVvLmdlby5nbm9tb25pYz1mdW5jdGlvbigpe3JldHVybiBzcih0bCl9KS5yYXc9dGwsRXIuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuW3QsMipNYXRoLmF0YW4oTWF0aC5leHAoZSkpLVZvXX0sKHVvLmdlby5tZXJjYXRvcj1mdW5jdGlvbigpe3JldHVybiBTcihFcil9KS5yYXc9RXI7dmFyIGVsPUFyKGZ1bmN0aW9uKCl7cmV0dXJuIDF9LE1hdGguYXNpbik7KHVvLmdlby5vcnRob2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gc3IoZWwpfSkucmF3PWVsO3ZhciBybD1BcihmdW5jdGlvbih0KXtyZXR1cm4gMS8oMSt0KX0sZnVuY3Rpb24odCl7cmV0dXJuIDIqTWF0aC5hdGFuKHQpfSk7KHVvLmdlby5zdGVyZW9ncmFwaGljPWZ1bmN0aW9uKCl7cmV0dXJuIHNyKHJsKX0pLnJhdz1ybCxMci5pbnZlcnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm5bLWUsMipNYXRoLmF0YW4oTWF0aC5leHAodCkpLVZvXX0sKHVvLmdlby50cmFuc3ZlcnNlTWVyY2F0b3I9ZnVuY3Rpb24oKXt2YXIgdD1TcihMciksZT10LmNlbnRlcixyPXQucm90YXRlO3JldHVybiB0LmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gdD9lKFstdFsxXSx0WzBdXSk6KHQ9ZSgpLFt0WzFdLC10WzBdXSl9LHQucm90YXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0P3IoW3RbMF0sdFsxXSx0Lmxlbmd0aD4yP3RbMl0rOTA6OTBdKToodD1yKCksW3RbMF0sdFsxXSx0WzJdLTkwXSl9LHIoWzAsMCw5MF0pfSkucmF3PUxyLHVvLmdlb209e30sdW8uZ2VvbS5odWxsPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCl7aWYodC5sZW5ndGg8MylyZXR1cm5bXTt2YXIgZSxpPVN0KHIpLGE9U3Qobiksbz10Lmxlbmd0aCxzPVtdLGw9W107Zm9yKGU9MDtlPG87ZSsrKXMucHVzaChbK2kuY2FsbCh0aGlzLHRbZV0sZSksK2EuY2FsbCh0aGlzLHRbZV0sZSksZV0pO2ZvcihzLnNvcnQoUHIpLGU9MDtlPG87ZSsrKWwucHVzaChbc1tlXVswXSwtc1tlXVsxXV0pO3ZhciB1PUlyKHMpLGM9SXIobCksaD1jWzBdPT09dVswXSxmPWNbYy5sZW5ndGgtMV09PT11W3UubGVuZ3RoLTFdLGQ9W107Zm9yKGU9dS5sZW5ndGgtMTtlPj0wOy0tZSlkLnB1c2godFtzW3VbZV1dWzJdXSk7Zm9yKGU9K2g7ZTxjLmxlbmd0aC1mOysrZSlkLnB1c2godFtzW2NbZV1dWzJdXSk7cmV0dXJuIGR9dmFyIHI9enIsbj1DcjtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9lKHQpOihlLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxlKTpyfSxlLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxlKTpufSxlKX0sdW8uZ2VvbS5wb2x5Z29uPWZ1bmN0aW9uKHQpe3JldHVybiBrbyh0LG5sKSx0fTt2YXIgbmw9dW8uZ2VvbS5wb2x5Z29uLnByb3RvdHlwZT1bXTtubC5hcmVhPWZ1bmN0aW9uKCl7Zm9yKHZhciB0LGU9LTEscj10aGlzLmxlbmd0aCxuPXRoaXNbci0xXSxpPTA7KytlPHI7KXQ9bixuPXRoaXNbZV0saSs9dFsxXSpuWzBdLXRbMF0qblsxXTtyZXR1cm4uNSppfSxubC5jZW50cm9pZD1mdW5jdGlvbih0KXt2YXIgZSxyLG49LTEsaT10aGlzLmxlbmd0aCxhPTAsbz0wLHM9dGhpc1tpLTFdO2Zvcihhcmd1bWVudHMubGVuZ3RofHwodD0tMS8oNip0aGlzLmFyZWEoKSkpOysrbjxpOyllPXMscz10aGlzW25dLHI9ZVswXSpzWzFdLXNbMF0qZVsxXSxhKz0oZVswXStzWzBdKSpyLG8rPShlWzFdK3NbMV0pKnI7cmV0dXJuW2EqdCxvKnRdfSxubC5jbGlwPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxyLG4saSxhLG8scz1Pcih0KSxsPS0xLHU9dGhpcy5sZW5ndGgtT3IodGhpcyksYz10aGlzW3UtMV07KytsPHU7KXtmb3IoZT10LnNsaWNlKCksdC5sZW5ndGg9MCxpPXRoaXNbbF0sYT1lWyhuPWUubGVuZ3RoLXMpLTFdLHI9LTE7KytyPG47KW89ZVtyXSxEcihvLGMsaSk/KERyKGEsYyxpKXx8dC5wdXNoKFJyKGEsbyxjLGkpKSx0LnB1c2gobykpOkRyKGEsYyxpKSYmdC5wdXNoKFJyKGEsbyxjLGkpKSxhPW87cyYmdC5wdXNoKHRbMF0pLGM9aX1yZXR1cm4gdH07dmFyIGlsLGFsLG9sLHNsLGxsLHVsPVtdLGNsPVtdO0hyLnByb3RvdHlwZS5wcmVwYXJlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0LGU9dGhpcy5lZGdlcyxyPWUubGVuZ3RoO3ItLTspdD1lW3JdLmVkZ2UsdC5iJiZ0LmF8fGUuc3BsaWNlKHIsMSk7cmV0dXJuIGUuc29ydChYciksZS5sZW5ndGh9LHJuLnByb3RvdHlwZT17c3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGdlLmw9PT10aGlzLnNpdGU/dGhpcy5lZGdlLmE6dGhpcy5lZGdlLmJ9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2UubD09PXRoaXMuc2l0ZT90aGlzLmVkZ2UuYjp0aGlzLmVkZ2UuYX19LG5uLnByb3RvdHlwZT17aW5zZXJ0OmZ1bmN0aW9uKHQsZSl7dmFyIHIsbixpO2lmKHQpe2lmKGUuUD10LGUuTj10Lk4sdC5OJiYodC5OLlA9ZSksdC5OPWUsdC5SKXtmb3IodD10LlI7dC5MOyl0PXQuTDt0Lkw9ZX1lbHNlIHQuUj1lO3I9dH1lbHNlIHRoaXMuXz8odD1sbih0aGlzLl8pLGUuUD1udWxsLGUuTj10LHQuUD10Lkw9ZSxyPXQpOihlLlA9ZS5OPW51bGwsdGhpcy5fPWUscj1udWxsKTtmb3IoZS5MPWUuUj1udWxsLGUuVT1yLGUuQz0hMCx0PWU7ciYmci5DOyluPXIuVSxyPT09bi5MPyhpPW4uUixpJiZpLkM/KHIuQz1pLkM9ITEsbi5DPSEwLHQ9bik6KHQ9PT1yLlImJihvbih0aGlzLHIpLHQ9cixyPXQuVSksci5DPSExLG4uQz0hMCxzbih0aGlzLG4pKSk6KGk9bi5MLGkmJmkuQz8oci5DPWkuQz0hMSxuLkM9ITAsdD1uKToodD09PXIuTCYmKHNuKHRoaXMsciksdD1yLHI9dC5VKSxyLkM9ITEsbi5DPSEwLG9uKHRoaXMsbikpKSxyPXQuVTt0aGlzLl8uQz0hMX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3QuTiYmKHQuTi5QPXQuUCksdC5QJiYodC5QLk49dC5OKSx0Lk49dC5QPW51bGw7dmFyIGUscixuLGk9dC5VLGE9dC5MLG89dC5SO2lmKHI9YT9vP2xuKG8pOmE6byxpP2kuTD09PXQ/aS5MPXI6aS5SPXI6dGhpcy5fPXIsYSYmbz8obj1yLkMsci5DPXQuQyxyLkw9YSxhLlU9cixyIT09bz8oaT1yLlUsci5VPXQuVSx0PXIuUixpLkw9dCxyLlI9byxvLlU9cik6KHIuVT1pLGk9cix0PXIuUikpOihuPXQuQyx0PXIpLHQmJih0LlU9aSksIW4pe2lmKHQmJnQuQylyZXR1cm4gdm9pZCh0LkM9ITEpO2Rve2lmKHQ9PT10aGlzLl8pYnJlYWs7aWYodD09PWkuTCl7aWYoZT1pLlIsZS5DJiYoZS5DPSExLGkuQz0hMCxvbih0aGlzLGkpLGU9aS5SKSxlLkwmJmUuTC5DfHxlLlImJmUuUi5DKXtlLlImJmUuUi5DfHwoZS5MLkM9ITEsZS5DPSEwLHNuKHRoaXMsZSksZT1pLlIpLGUuQz1pLkMsaS5DPWUuUi5DPSExLG9uKHRoaXMsaSksdD10aGlzLl87YnJlYWt9fWVsc2UgaWYoZT1pLkwsZS5DJiYoZS5DPSExLGkuQz0hMCxzbih0aGlzLGkpLGU9aS5MKSxlLkwmJmUuTC5DfHxlLlImJmUuUi5DKXtlLkwmJmUuTC5DfHwoZS5SLkM9ITEsZS5DPSEwLG9uKHRoaXMsZSksZT1pLkwpLGUuQz1pLkMsaS5DPWUuTC5DPSExLHNuKHRoaXMsaSksdD10aGlzLl87YnJlYWt9ZS5DPSEwLHQ9aSxpPWkuVX13aGlsZSghdC5DKTt0JiYodC5DPSExKX19fSx1by5nZW9tLnZvcm9ub2k9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0KXt2YXIgZT1uZXcgQXJyYXkodC5sZW5ndGgpLG49c1swXVswXSxpPXNbMF1bMV0sYT1zWzFdWzBdLG89c1sxXVsxXTtyZXR1cm4gdW4ocih0KSxzKS5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKHIscyl7dmFyIGw9ci5lZGdlcyx1PXIuc2l0ZSxjPWVbc109bC5sZW5ndGg/bC5tYXAoZnVuY3Rpb24odCl7dmFyIGU9dC5zdGFydCgpO3JldHVybltlLngsZS55XX0pOnUueD49biYmdS54PD1hJiZ1Lnk+PWkmJnUueTw9bz9bW24sb10sW2Esb10sW2EsaV0sW24saV1dOltdO2MucG9pbnQ9dFtzXX0pLGV9ZnVuY3Rpb24gcih0KXtyZXR1cm4gdC5tYXAoZnVuY3Rpb24odCxlKXtyZXR1cm57eDpNYXRoLnJvdW5kKGEodCxlKS9GbykqRm8seTpNYXRoLnJvdW5kKG8odCxlKS9GbykqRm8saTplfX0pfXZhciBuPXpyLGk9Q3IsYT1uLG89aSxzPWhsO3JldHVybiB0P2UodCk6KGUubGlua3M9ZnVuY3Rpb24odCl7cmV0dXJuIHVuKHIodCkpLmVkZ2VzLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdC5sJiZ0LnJ9KS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJue3NvdXJjZTp0W2UubC5pXSx0YXJnZXQ6dFtlLnIuaV19fSl9LGUudHJpYW5nbGVzPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiB1bihyKHQpKS5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKHIsbil7Zm9yKHZhciBpLGEsbz1yLnNpdGUscz1yLmVkZ2VzLnNvcnQoWHIpLGw9LTEsdT1zLmxlbmd0aCxjPXNbdS0xXS5lZGdlLGg9Yy5sPT09bz9jLnI6Yy5sOysrbDx1OylpPWMsYT1oLGM9c1tsXS5lZGdlLGg9Yy5sPT09bz9jLnI6Yy5sLG48YS5pJiZuPGguaSYmaG4obyxhLGgpPDAmJmUucHVzaChbdFtuXSx0W2EuaV0sdFtoLmldXSl9KSxlfSxlLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9U3Qobj10KSxlKTpufSxlLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89U3QoaT10KSxlKTppfSxlLmNsaXBFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9bnVsbD09dD9obDp0LGUpOnM9PT1obD9udWxsOnN9LGUuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9lLmNsaXBFeHRlbnQodCYmW1swLDBdLHRdKTpzPT09aGw/bnVsbDpzJiZzWzFdfSxlKX07dmFyIGhsPVtbLTFlNiwtMWU2XSxbMWU2LDFlNl1dO3VvLmdlb20uZGVsYXVuYXk9ZnVuY3Rpb24odCl7cmV0dXJuIHVvLmdlb20udm9yb25vaSgpLnRyaWFuZ2xlcyh0KX0sdW8uZ2VvbS5xdWFkdHJlZT1mdW5jdGlvbih0LGUscixuLGkpe2Z1bmN0aW9uIGEodCl7ZnVuY3Rpb24gYSh0LGUscixuLGksYSxvLHMpe2lmKCFpc05hTihyKSYmIWlzTmFOKG4pKWlmKHQubGVhZil7dmFyIGw9dC54LGM9dC55O2lmKG51bGwhPWwpaWYoYm8obC1yKStibyhjLW4pPC4wMSl1KHQsZSxyLG4saSxhLG8scyk7ZWxzZXt2YXIgaD10LnBvaW50O3QueD10Lnk9dC5wb2ludD1udWxsLHUodCxoLGwsYyxpLGEsbyxzKSx1KHQsZSxyLG4saSxhLG8scyl9ZWxzZSB0Lng9cix0Lnk9bix0LnBvaW50PWV9ZWxzZSB1KHQsZSxyLG4saSxhLG8scyl9ZnVuY3Rpb24gdSh0LGUscixuLGksbyxzLGwpe3ZhciB1PS41KihpK3MpLGM9LjUqKG8rbCksaD1yPj11LGY9bj49YyxkPWY8PDF8aDt0LmxlYWY9ITEsdD10Lm5vZGVzW2RdfHwodC5ub2Rlc1tkXT1wbigpKSxoP2k9dTpzPXUsZj9vPWM6bD1jLGEodCxlLHIsbixpLG8scyxsKX12YXIgYyxoLGYsZCxwLGcsbSx2LHkseD1TdChzKSxiPVN0KGwpO2lmKG51bGwhPWUpZz1lLG09cix2PW4seT1pO2Vsc2UgaWYodj15PS0oZz1tPTEvMCksaD1bXSxmPVtdLHA9dC5sZW5ndGgsbylmb3IoZD0wO2Q8cDsrK2QpYz10W2RdLGMueDxnJiYoZz1jLngpLGMueTxtJiYobT1jLnkpLGMueD52JiYodj1jLngpLGMueT55JiYoeT1jLnkpLGgucHVzaChjLngpLGYucHVzaChjLnkpO2Vsc2UgZm9yKGQ9MDtkPHA7KytkKXt2YXIgXz0reChjPXRbZF0sZCksdz0rYihjLGQpO188ZyYmKGc9XyksdzxtJiYobT13KSxfPnYmJih2PV8pLHc+eSYmKHk9dyksaC5wdXNoKF8pLGYucHVzaCh3KX12YXIgTT12LWcsQT15LW07TT5BP3k9bStNOnY9ZytBO3ZhciBrPXBuKCk7aWYoay5hZGQ9ZnVuY3Rpb24odCl7YShrLHQsK3godCwrK2QpLCtiKHQsZCksZyxtLHYseSl9LGsudmlzaXQ9ZnVuY3Rpb24odCl7Z24odCxrLGcsbSx2LHkpfSxrLmZpbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG1uKGssdFswXSx0WzFdLGcsbSx2LHkpfSxkPS0xLG51bGw9PWUpe2Zvcig7KytkPHA7KWEoayx0W2RdLGhbZF0sZltkXSxnLG0sdix5KTstLWQ7Cn1lbHNlIHQuZm9yRWFjaChrLmFkZCk7cmV0dXJuIGg9Zj10PWM9bnVsbCxrfXZhciBvLHM9enIsbD1DcjtyZXR1cm4obz1hcmd1bWVudHMubGVuZ3RoKT8ocz1mbixsPWRuLDM9PT1vJiYoaT1yLG49ZSxyPWU9MCksYSh0KSk6KGEueD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz10LGEpOnN9LGEueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD10LGEpOmx9LGEuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P2U9cj1uPWk9bnVsbDooZT0rdFswXVswXSxyPSt0WzBdWzFdLG49K3RbMV1bMF0saT0rdFsxXVsxXSksYSk6bnVsbD09ZT9udWxsOltbZSxyXSxbbixpXV19LGEuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09dD9lPXI9bj1pPW51bGw6KGU9cj0wLG49K3RbMF0saT0rdFsxXSksYSk6bnVsbD09ZT9udWxsOltuLWUsaS1yXX0sYSl9LHVvLmludGVycG9sYXRlUmdiPXZuLHVvLmludGVycG9sYXRlT2JqZWN0PXluLHVvLmludGVycG9sYXRlTnVtYmVyPXhuLHVvLmludGVycG9sYXRlU3RyaW5nPWJuO3ZhciBmbD0vWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2csZGw9bmV3IFJlZ0V4cChmbC5zb3VyY2UsImciKTt1by5pbnRlcnBvbGF0ZT1fbix1by5pbnRlcnBvbGF0b3JzPVtmdW5jdGlvbih0LGUpe3ZhciByPXR5cGVvZiBlO3JldHVybigic3RyaW5nIj09PXI/YXMuaGFzKGUudG9Mb3dlckNhc2UoKSl8fC9eKCN8cmdiXCh8aHNsXCgpL2kudGVzdChlKT92bjpibjplIGluc3RhbmNlb2YgbHQ/dm46QXJyYXkuaXNBcnJheShlKT93bjoib2JqZWN0Ij09PXImJmlzTmFOKGUpP3luOnhuKSh0LGUpfV0sdW8uaW50ZXJwb2xhdGVBcnJheT13bjt2YXIgcGw9ZnVuY3Rpb24oKXtyZXR1cm4gYn0sZ2w9dW8ubWFwKHtsaW5lYXI6cGwscG9seTpMbixxdWFkOmZ1bmN0aW9uKCl7cmV0dXJuIFRufSxjdWJpYzpmdW5jdGlvbigpe3JldHVybiBFbn0sc2luOmZ1bmN0aW9uKCl7cmV0dXJuIHpufSxleHA6ZnVuY3Rpb24oKXtyZXR1cm4gQ259LGNpcmNsZTpmdW5jdGlvbigpe3JldHVybiBJbn0sZWxhc3RpYzpQbixiYWNrOkRuLGJvdW5jZTpmdW5jdGlvbigpe3JldHVybiBSbn19KSxtbD11by5tYXAoe2luOmIsb3V0OkFuLCJpbi1vdXQiOmtuLCJvdXQtaW4iOmZ1bmN0aW9uKHQpe3JldHVybiBrbihBbih0KSl9fSk7dW8uZWFzZT1mdW5jdGlvbih0KXt2YXIgZT10LmluZGV4T2YoIi0iKSxyPWU+PTA/dC5zbGljZSgwLGUpOnQsbj1lPj0wP3Quc2xpY2UoZSsxKToiaW4iO3JldHVybiByPWdsLmdldChyKXx8cGwsbj1tbC5nZXQobil8fGIsTW4obihyLmFwcGx5KG51bGwsY28uY2FsbChhcmd1bWVudHMsMSkpKSl9LHVvLmludGVycG9sYXRlSGNsPU9uLHVvLmludGVycG9sYXRlSHNsPUZuLHVvLmludGVycG9sYXRlTGFiPWpuLHVvLmludGVycG9sYXRlUm91bmQ9Tm4sdW8udHJhbnNmb3JtPWZ1bmN0aW9uKHQpe3ZhciBlPWZvLmNyZWF0ZUVsZW1lbnROUyh1by5ucy5wcmVmaXguc3ZnLCJnIik7cmV0dXJuKHVvLnRyYW5zZm9ybT1mdW5jdGlvbih0KXtpZihudWxsIT10KXtlLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIix0KTt2YXIgcj1lLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCl9cmV0dXJuIG5ldyBCbihyP3IubWF0cml4OnZsKX0pKHQpfSxCbi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4idHJhbnNsYXRlKCIrdGhpcy50cmFuc2xhdGUrIilyb3RhdGUoIit0aGlzLnJvdGF0ZSsiKXNrZXdYKCIrdGhpcy5za2V3KyIpc2NhbGUoIit0aGlzLnNjYWxlKyIpIn07dmFyIHZsPXthOjEsYjowLGM6MCxkOjEsZTowLGY6MH07dW8uaW50ZXJwb2xhdGVUcmFuc2Zvcm09Wm4sdW8ubGF5b3V0PXt9LHVvLmxheW91dC5idW5kbGU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLHI9LTEsbj10Lmxlbmd0aDsrK3I8bjspZS5wdXNoKCRuKHRbcl0pKTtyZXR1cm4gZX19LHVvLmxheW91dC5jaG9yZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt2YXIgdCx1LGgsZixkLHA9e30sZz1bXSxtPXVvLnJhbmdlKGEpLHY9W107Zm9yKHI9W10sbj1bXSx0PTAsZj0tMTsrK2Y8YTspe2Zvcih1PTAsZD0tMTsrK2Q8YTspdSs9aVtmXVtkXTtnLnB1c2godSksdi5wdXNoKHVvLnJhbmdlKGEpKSx0Kz11fWZvcihvJiZtLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gbyhnW3RdLGdbZV0pfSkscyYmdi5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7dC5zb3J0KGZ1bmN0aW9uKHQscil7cmV0dXJuIHMoaVtlXVt0XSxpW2VdW3JdKX0pfSksdD0oQm8tYyphKS90LHU9MCxmPS0xOysrZjxhOyl7Zm9yKGg9dSxkPS0xOysrZDxhOyl7dmFyIHk9bVtmXSx4PXZbeV1bZF0sYj1pW3ldW3hdLF89dSx3PXUrPWIqdDtwW3krIi0iK3hdPXtpbmRleDp5LHN1YmluZGV4Ongsc3RhcnRBbmdsZTpfLGVuZEFuZ2xlOncsdmFsdWU6Yn19blt5XT17aW5kZXg6eSxzdGFydEFuZ2xlOmgsZW5kQW5nbGU6dSx2YWx1ZTpnW3ldfSx1Kz1jfWZvcihmPS0xOysrZjxhOylmb3IoZD1mLTE7KytkPGE7KXt2YXIgTT1wW2YrIi0iK2RdLEE9cFtkKyItIitmXTsoTS52YWx1ZXx8QS52YWx1ZSkmJnIucHVzaChNLnZhbHVlPEEudmFsdWU/e3NvdXJjZTpBLHRhcmdldDpNfTp7c291cmNlOk0sdGFyZ2V0OkF9KX1sJiZlKCl9ZnVuY3Rpb24gZSgpe3Iuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBsKCh0LnNvdXJjZS52YWx1ZSt0LnRhcmdldC52YWx1ZSkvMiwoZS5zb3VyY2UudmFsdWUrZS50YXJnZXQudmFsdWUpLzIpfSl9dmFyIHIsbixpLGEsbyxzLGwsdT17fSxjPTA7cmV0dXJuIHUubWF0cml4PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPShpPXQpJiZpLmxlbmd0aCxyPW49bnVsbCx1KTppfSx1LnBhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9dCxyPW49bnVsbCx1KTpjfSx1LnNvcnRHcm91cHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89dCxyPW49bnVsbCx1KTpvfSx1LnNvcnRTdWJncm91cHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9dCxyPW51bGwsdSk6c30sdS5zb3J0Q2hvcmRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPXQsciYmZSgpLHUpOmx9LHUuY2hvcmRzPWZ1bmN0aW9uKCl7cmV0dXJuIHJ8fHQoKSxyfSx1Lmdyb3Vwcz1mdW5jdGlvbigpe3JldHVybiBufHx0KCksbn0sdX0sdW8ubGF5b3V0LmZvcmNlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gZnVuY3Rpb24oZSxyLG4saSl7aWYoZS5wb2ludCE9PXQpe3ZhciBhPWUuY3gtdC54LG89ZS5jeS10Lnkscz1pLXIsbD1hKmErbypvO2lmKHMqcy92PGwpe2lmKGw8Zyl7dmFyIHU9ZS5jaGFyZ2UvbDt0LnB4LT1hKnUsdC5weS09byp1fXJldHVybiEwfWlmKGUucG9pbnQmJmwmJmw8Zyl7dmFyIHU9ZS5wb2ludENoYXJnZS9sO3QucHgtPWEqdSx0LnB5LT1vKnV9fXJldHVybiFlLmNoYXJnZX19ZnVuY3Rpb24gZSh0KXt0LnB4PXVvLmV2ZW50LngsdC5weT11by5ldmVudC55LGwucmVzdW1lKCl9dmFyIHIsbixpLGEsbyxzLGw9e30sdT11by5kaXNwYXRjaCgic3RhcnQiLCJ0aWNrIiwiZW5kIiksYz1bMSwxXSxoPS45LGY9eWwsZD14bCxwPS0zMCxnPWJsLG09LjEsdj0uNjQseT1bXSx4PVtdO3JldHVybiBsLnRpY2s9ZnVuY3Rpb24oKXtpZigoaSo9Ljk5KTwuMDA1KXJldHVybiByPW51bGwsdS5lbmQoe3R5cGU6ImVuZCIsYWxwaGE6aT0wfSksITA7dmFyIGUsbixsLGYsZCxnLHYsYixfLHc9eS5sZW5ndGgsTT14Lmxlbmd0aDtmb3Iobj0wO248TTsrK24pbD14W25dLGY9bC5zb3VyY2UsZD1sLnRhcmdldCxiPWQueC1mLngsXz1kLnktZi55LChnPWIqYitfKl8pJiYoZz1pKm9bbl0qKChnPU1hdGguc3FydChnKSktYVtuXSkvZyxiKj1nLF8qPWcsZC54LT1iKih2PWYud2VpZ2h0K2Qud2VpZ2h0P2Yud2VpZ2h0LyhmLndlaWdodCtkLndlaWdodCk6LjUpLGQueS09Xyp2LGYueCs9Yioodj0xLXYpLGYueSs9Xyp2KTtpZigodj1pKm0pJiYoYj1jWzBdLzIsXz1jWzFdLzIsbj0tMSx2KSlmb3IoOysrbjx3OylsPXlbbl0sbC54Kz0oYi1sLngpKnYsbC55Kz0oXy1sLnkpKnY7aWYocClmb3IoYWkoZT11by5nZW9tLnF1YWR0cmVlKHkpLGkscyksbj0tMTsrK248dzspKGw9eVtuXSkuZml4ZWR8fGUudmlzaXQodChsKSk7Zm9yKG49LTE7KytuPHc7KWw9eVtuXSxsLmZpeGVkPyhsLng9bC5weCxsLnk9bC5weSk6KGwueC09KGwucHgtKGwucHg9bC54KSkqaCxsLnktPShsLnB5LShsLnB5PWwueSkpKmgpO3UudGljayh7dHlwZToidGljayIsYWxwaGE6aX0pfSxsLm5vZGVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PXQsbCk6eX0sbC5saW5rcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD10LGwpOnh9LGwuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz10LGwpOmN9LGwubGlua0Rpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6K3QsbCk6Zn0sbC5kaXN0YW5jZT1sLmxpbmtEaXN0YW5jZSxsLmxpbmtTdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD0iZnVuY3Rpb24iPT10eXBlb2YgdD90Oit0LGwpOmR9LGwuZnJpY3Rpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9K3QsbCk6aH0sbC5jaGFyZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDordCxsKTpwfSxsLmNoYXJnZURpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPXQqdCxsKTpNYXRoLnNxcnQoZyl9LGwuZ3Jhdml0eT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT0rdCxsKTptfSxsLnRoZXRhPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh2PXQqdCxsKTpNYXRoLnNxcnQodil9LGwuYWxwaGE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9K3QsaT90PjA/aT10OihyLmM9bnVsbCxyLnQ9TmFOLHI9bnVsbCx1LmVuZCh7dHlwZToiZW5kIixhbHBoYTppPTB9KSk6dD4wJiYodS5zdGFydCh7dHlwZToic3RhcnQiLGFscGhhOmk9dH0pLHI9UHQobC50aWNrKSksbCk6aX0sbC5zdGFydD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxuKXtpZighcil7Zm9yKHI9bmV3IEFycmF5KGkpLGw9MDtsPGk7KytsKXJbbF09W107Zm9yKGw9MDtsPHU7KytsKXt2YXIgYT14W2xdO3JbYS5zb3VyY2UuaW5kZXhdLnB1c2goYS50YXJnZXQpLHJbYS50YXJnZXQuaW5kZXhdLnB1c2goYS5zb3VyY2UpfX1mb3IodmFyIG8scz1yW2VdLGw9LTEsYz1zLmxlbmd0aDsrK2w8YzspaWYoIWlzTmFOKG89c1tsXVt0XSkpcmV0dXJuIG87cmV0dXJuIE1hdGgucmFuZG9tKCkqbn12YXIgZSxyLG4saT15Lmxlbmd0aCx1PXgubGVuZ3RoLGg9Y1swXSxnPWNbMV07Zm9yKGU9MDtlPGk7KytlKShuPXlbZV0pLmluZGV4PWUsbi53ZWlnaHQ9MDtmb3IoZT0wO2U8dTsrK2Upbj14W2VdLCJudW1iZXIiPT10eXBlb2Ygbi5zb3VyY2UmJihuLnNvdXJjZT15W24uc291cmNlXSksIm51bWJlciI9PXR5cGVvZiBuLnRhcmdldCYmKG4udGFyZ2V0PXlbbi50YXJnZXRdKSwrK24uc291cmNlLndlaWdodCwrK24udGFyZ2V0LndlaWdodDtmb3IoZT0wO2U8aTsrK2Upbj15W2VdLGlzTmFOKG4ueCkmJihuLng9dCgieCIsaCkpLGlzTmFOKG4ueSkmJihuLnk9dCgieSIsZykpLGlzTmFOKG4ucHgpJiYobi5weD1uLngpLGlzTmFOKG4ucHkpJiYobi5weT1uLnkpO2lmKGE9W10sImZ1bmN0aW9uIj09dHlwZW9mIGYpZm9yKGU9MDtlPHU7KytlKWFbZV09K2YuY2FsbCh0aGlzLHhbZV0sZSk7ZWxzZSBmb3IoZT0wO2U8dTsrK2UpYVtlXT1mO2lmKG89W10sImZ1bmN0aW9uIj09dHlwZW9mIGQpZm9yKGU9MDtlPHU7KytlKW9bZV09K2QuY2FsbCh0aGlzLHhbZV0sZSk7ZWxzZSBmb3IoZT0wO2U8dTsrK2Upb1tlXT1kO2lmKHM9W10sImZ1bmN0aW9uIj09dHlwZW9mIHApZm9yKGU9MDtlPGk7KytlKXNbZV09K3AuY2FsbCh0aGlzLHlbZV0sZSk7ZWxzZSBmb3IoZT0wO2U8aTsrK2Upc1tlXT1wO3JldHVybiBsLnJlc3VtZSgpfSxsLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBsLmFscGhhKC4xKX0sbC5zdG9wPWZ1bmN0aW9uKCl7cmV0dXJuIGwuYWxwaGEoMCl9LGwuZHJhZz1mdW5jdGlvbigpe3JldHVybiBufHwobj11by5iZWhhdmlvci5kcmFnKCkub3JpZ2luKGIpLm9uKCJkcmFnc3RhcnQuZm9yY2UiLGVpKS5vbigiZHJhZy5mb3JjZSIsZSkub24oImRyYWdlbmQuZm9yY2UiLHJpKSksYXJndW1lbnRzLmxlbmd0aD92b2lkIHRoaXMub24oIm1vdXNlb3Zlci5mb3JjZSIsbmkpLm9uKCJtb3VzZW91dC5mb3JjZSIsaWkpLmNhbGwobik6bn0sdW8ucmViaW5kKGwsdSwib24iKX07dmFyIHlsPTIwLHhsPTEsYmw9MS8wO3VvLmxheW91dC5oaWVyYXJjaHk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGkpe3ZhciBhLG89W2ldLHM9W107Zm9yKGkuZGVwdGg9MDtudWxsIT0oYT1vLnBvcCgpKTspaWYocy5wdXNoKGEpLCh1PXIuY2FsbCh0LGEsYS5kZXB0aCkpJiYobD11Lmxlbmd0aCkpe2Zvcih2YXIgbCx1LGM7LS1sPj0wOylvLnB1c2goYz11W2xdKSxjLnBhcmVudD1hLGMuZGVwdGg9YS5kZXB0aCsxO24mJihhLnZhbHVlPTApLGEuY2hpbGRyZW49dX1lbHNlIG4mJihhLnZhbHVlPStuLmNhbGwodCxhLGEuZGVwdGgpfHwwKSxkZWxldGUgYS5jaGlsZHJlbjtyZXR1cm4gbGkoaSxmdW5jdGlvbih0KXt2YXIgcixpO2UmJihyPXQuY2hpbGRyZW4pJiZyLnNvcnQoZSksbiYmKGk9dC5wYXJlbnQpJiYoaS52YWx1ZSs9dC52YWx1ZSl9KSxzfXZhciBlPWhpLHI9dWksbj1jaTtyZXR1cm4gdC5zb3J0PWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXIsdCk6ZX0sdC5jaGlsZHJlbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1lLHQpOnJ9LHQudmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ZSx0KTpufSx0LnJldmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIG4mJihzaShlLGZ1bmN0aW9uKHQpe3QuY2hpbGRyZW4mJih0LnZhbHVlPTApfSksbGkoZSxmdW5jdGlvbihlKXt2YXIgcjtlLmNoaWxkcmVufHwoZS52YWx1ZT0rbi5jYWxsKHQsZSxlLmRlcHRoKXx8MCksKHI9ZS5wYXJlbnQpJiYoci52YWx1ZSs9ZS52YWx1ZSl9KSksZX0sdH0sdW8ubGF5b3V0LnBhcnRpdGlvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxyLG4saSl7dmFyIGE9ZS5jaGlsZHJlbjtpZihlLng9cixlLnk9ZS5kZXB0aCppLGUuZHg9bixlLmR5PWksYSYmKG89YS5sZW5ndGgpKXt2YXIgbyxzLGwsdT0tMTtmb3Iobj1lLnZhbHVlP24vZS52YWx1ZTowOysrdTxvOyl0KHM9YVt1XSxyLGw9cy52YWx1ZSpuLGkpLHIrPWx9fWZ1bmN0aW9uIGUodCl7dmFyIHI9dC5jaGlsZHJlbixuPTA7aWYociYmKGk9ci5sZW5ndGgpKWZvcih2YXIgaSxhPS0xOysrYTxpOyluPU1hdGgubWF4KG4sZShyW2FdKSk7cmV0dXJuIDErbn1mdW5jdGlvbiByKHIsYSl7dmFyIG89bi5jYWxsKHRoaXMscixhKTtyZXR1cm4gdChvWzBdLDAsaVswXSxpWzFdL2Uob1swXSkpLG99dmFyIG49dW8ubGF5b3V0LmhpZXJhcmNoeSgpLGk9WzEsMV07cmV0dXJuIHIuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LHIpOml9LG9pKHIsbil9LHVvLmxheW91dC5waWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KG8pe3ZhciBzLGw9by5sZW5ndGgsdT1vLm1hcChmdW5jdGlvbihyLG4pe3JldHVybitlLmNhbGwodCxyLG4pfSksYz0rKCJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOm4pLGg9KCJmdW5jdGlvbiI9PXR5cGVvZiBpP2kuYXBwbHkodGhpcyxhcmd1bWVudHMpOmkpLWMsZj1NYXRoLm1pbihNYXRoLmFicyhoKS9sLCsoImZ1bmN0aW9uIj09dHlwZW9mIGE/YS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6YSkpLGQ9ZiooaDwwPy0xOjEpLHA9dW8uc3VtKHUpLGc9cD8oaC1sKmQpL3A6MCxtPXVvLnJhbmdlKGwpLHY9W107cmV0dXJuIG51bGwhPXImJm0uc29ydChyPT09X2w/ZnVuY3Rpb24odCxlKXtyZXR1cm4gdVtlXS11W3RdfTpmdW5jdGlvbih0LGUpe3JldHVybiByKG9bdF0sb1tlXSl9KSxtLmZvckVhY2goZnVuY3Rpb24odCl7dlt0XT17ZGF0YTpvW3RdLHZhbHVlOnM9dVt0XSxzdGFydEFuZ2xlOmMsZW5kQW5nbGU6Yys9cypnK2QscGFkQW5nbGU6Zn19KSx2fXZhciBlPU51bWJlcixyPV9sLG49MCxpPUJvLGE9MDtyZXR1cm4gdC52YWx1ZT1mdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1yLHQpOmV9LHQuc29ydD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1lLHQpOnJ9LHQuc3RhcnRBbmdsZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1lLHQpOm59LHQuZW5kQW5nbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ZSx0KTppfSx0LnBhZEFuZ2xlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPWUsdCk6YX0sdH07dmFyIF9sPXt9O3VvLmxheW91dC5zdGFjaz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQocyxsKXtpZighKGY9cy5sZW5ndGgpKXJldHVybiBzO3ZhciB1PXMubWFwKGZ1bmN0aW9uKHIsbil7cmV0dXJuIGUuY2FsbCh0LHIsbil9KSxjPXUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLm1hcChmdW5jdGlvbihlLHIpe3JldHVyblthLmNhbGwodCxlLHIpLG8uY2FsbCh0LGUscildfSl9KSxoPXIuY2FsbCh0LGMsbCk7dT11by5wZXJtdXRlKHUsaCksYz11by5wZXJtdXRlKGMsaCk7dmFyIGYsZCxwLGcsbT1uLmNhbGwodCxjLGwpLHY9dVswXS5sZW5ndGg7Zm9yKHA9MDtwPHY7KytwKWZvcihpLmNhbGwodCx1WzBdW3BdLGc9bVtwXSxjWzBdW3BdWzFdKSxkPTE7ZDxmOysrZClpLmNhbGwodCx1W2RdW3BdLGcrPWNbZC0xXVtwXVsxXSxjW2RdW3BdWzFdKTtyZXR1cm4gc312YXIgZT1iLHI9bWksbj12aSxpPWdpLGE9ZGksbz1waTtyZXR1cm4gdC52YWx1ZXM9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9cix0KTplfSx0Lm9yZGVyPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6d2wuZ2V0KGUpfHxtaSx0KTpyfSx0Lm9mZnNldD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOk1sLmdldChlKXx8dmksdCk6bn0sdC54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPWUsdCk6YX0sdC55PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWUsdCk6b30sdC5vdXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ZSx0KTppfSx0fTt2YXIgd2w9dW8ubWFwKHsiaW5zaWRlLW91dCI6ZnVuY3Rpb24odCl7dmFyIGUscixuPXQubGVuZ3RoLGk9dC5tYXAoeWkpLGE9dC5tYXAoeGkpLG89dW8ucmFuZ2Uobikuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBpW3RdLWlbZV19KSxzPTAsbD0wLHU9W10sYz1bXTtmb3IoZT0wO2U8bjsrK2Upcj1vW2VdLHM8bD8ocys9YVtyXSx1LnB1c2gocikpOihsKz1hW3JdLGMucHVzaChyKSk7cmV0dXJuIGMucmV2ZXJzZSgpLmNvbmNhdCh1KX0scmV2ZXJzZTpmdW5jdGlvbih0KXtyZXR1cm4gdW8ucmFuZ2UodC5sZW5ndGgpLnJldmVyc2UoKX0sZGVmYXVsdDptaX0pLE1sPXVvLm1hcCh7c2lsaG91ZXR0ZTpmdW5jdGlvbih0KXt2YXIgZSxyLG4saT10Lmxlbmd0aCxhPXRbMF0ubGVuZ3RoLG89W10scz0wLGw9W107Zm9yKHI9MDtyPGE7KytyKXtmb3IoZT0wLG49MDtlPGk7ZSsrKW4rPXRbZV1bcl1bMV07bj5zJiYocz1uKSxvLnB1c2gobil9Zm9yKHI9MDtyPGE7KytyKWxbcl09KHMtb1tyXSkvMjtyZXR1cm4gbH0sd2lnZ2xlOmZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpLGEsbyxzLGwsdSxjPXQubGVuZ3RoLGg9dFswXSxmPWgubGVuZ3RoLGQ9W107Zm9yKGRbMF09bD11PTAscj0xO3I8ZjsrK3Ipe2ZvcihlPTAsaT0wO2U8YzsrK2UpaSs9dFtlXVtyXVsxXTtmb3IoZT0wLGE9MCxzPWhbcl1bMF0taFtyLTFdWzBdO2U8YzsrK2Upe2ZvcihuPTAsbz0odFtlXVtyXVsxXS10W2VdW3ItMV1bMV0pLygyKnMpO248ZTsrK24pbys9KHRbbl1bcl1bMV0tdFtuXVtyLTFdWzFdKS9zO2ErPW8qdFtlXVtyXVsxXX1kW3JdPWwtPWk/YS9pKnM6MCxsPHUmJih1PWwpfWZvcihyPTA7cjxmOysrcilkW3JdLT11O3JldHVybiBkfSxleHBhbmQ6ZnVuY3Rpb24odCl7dmFyIGUscixuLGk9dC5sZW5ndGgsYT10WzBdLmxlbmd0aCxvPTEvaSxzPVtdO2ZvcihyPTA7cjxhOysrcil7Zm9yKGU9MCxuPTA7ZTxpO2UrKyluKz10W2VdW3JdWzFdO2lmKG4pZm9yKGU9MDtlPGk7ZSsrKXRbZV1bcl1bMV0vPW47ZWxzZSBmb3IoZT0wO2U8aTtlKyspdFtlXVtyXVsxXT1vfWZvcihyPTA7cjxhOysrcilzW3JdPTA7cmV0dXJuIHN9LHplcm86dml9KTt1by5sYXlvdXQuaGlzdG9ncmFtPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGEpe2Zvcih2YXIgbyxzLGw9W10sdT10Lm1hcChyLHRoaXMpLGM9bi5jYWxsKHRoaXMsdSxhKSxoPWkuY2FsbCh0aGlzLGMsdSxhKSxhPS0xLGY9dS5sZW5ndGgsZD1oLmxlbmd0aC0xLHA9ZT8xOjEvZjsrK2E8ZDspbz1sW2FdPVtdLG8uZHg9aFthKzFdLShvLng9aFthXSksby55PTA7aWYoZD4wKWZvcihhPS0xOysrYTxmOylzPXVbYV0scz49Y1swXSYmczw9Y1sxXSYmKG89bFt1by5iaXNlY3QoaCxzLDEsZCktMV0sby55Kz1wLG8ucHVzaCh0W2FdKSk7cmV0dXJuIGx9dmFyIGU9ITAscj1OdW1iZXIsbj1NaSxpPV9pO3JldHVybiB0LnZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWUsdCk6cn0sdC5yYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1TdChlKSx0KTpufSx0LmJpbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9Im51bWJlciI9PXR5cGVvZiBlP2Z1bmN0aW9uKHQpe3JldHVybiB3aSh0LGUpfTpTdChlKSx0KTppfSx0LmZyZXF1ZW5jeT1mdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0hIXIsdCk6ZX0sdH0sdW8ubGF5b3V0LnBhY2s9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsYSl7dmFyIG89ci5jYWxsKHRoaXMsdCxhKSxzPW9bMF0sbD1pWzBdLHU9aVsxXSxjPW51bGw9PWU/TWF0aC5zcXJ0OiJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6ZnVuY3Rpb24oKXtyZXR1cm4gZX07aWYocy54PXMueT0wLGxpKHMsZnVuY3Rpb24odCl7dC5yPStjKHQudmFsdWUpfSksbGkocyxTaSksbil7dmFyIGg9biooZT8xOk1hdGgubWF4KDIqcy5yL2wsMipzLnIvdSkpLzI7bGkocyxmdW5jdGlvbih0KXt0LnIrPWh9KSxsaShzLFNpKSxsaShzLGZ1bmN0aW9uKHQpe3Quci09aH0pfXJldHVybiBDaShzLGwvMix1LzIsZT8xOjEvTWF0aC5tYXgoMipzLnIvbCwyKnMuci91KSksb312YXIgZSxyPXVvLmxheW91dC5oaWVyYXJjaHkoKS5zb3J0KEFpKSxuPTAsaT1bMSwxXTtyZXR1cm4gdC5zaXplPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPWUsdCk6aX0sdC5yYWRpdXM9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09cnx8ImZ1bmN0aW9uIj09dHlwZW9mIHI/cjorcix0KTplfSx0LnBhZGRpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K2UsdCk6bn0sb2kodCxyKX0sdW8ubGF5b3V0LnRyZWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsaSl7dmFyIGM9by5jYWxsKHRoaXMsdCxpKSxoPWNbMF0sZj1lKGgpO2lmKGxpKGYsciksZi5wYXJlbnQubT0tZi56LHNpKGYsbiksdSlzaShoLGEpO2Vsc2V7dmFyIGQ9aCxwPWgsZz1oO3NpKGgsZnVuY3Rpb24odCl7dC54PGQueCYmKGQ9dCksdC54PnAueCYmKHA9dCksdC5kZXB0aD5nLmRlcHRoJiYoZz10KX0pO3ZhciBtPXMoZCxwKS8yLWQueCx2PWxbMF0vKHAueCtzKHAsZCkvMittKSx5PWxbMV0vKGcuZGVwdGh8fDEpO3NpKGgsZnVuY3Rpb24odCl7dC54PSh0LngrbSkqdix0Lnk9dC5kZXB0aCp5fSl9cmV0dXJuIGN9ZnVuY3Rpb24gZSh0KXtmb3IodmFyIGUscj17QTpudWxsLGNoaWxkcmVuOlt0XX0sbj1bcl07bnVsbCE9KGU9bi5wb3AoKSk7KWZvcih2YXIgaSxhPWUuY2hpbGRyZW4sbz0wLHM9YS5sZW5ndGg7bzxzOysrbyluLnB1c2goKGFbb109aT17XzphW29dLHBhcmVudDplLGNoaWxkcmVuOihpPWFbb10uY2hpbGRyZW4pJiZpLnNsaWNlKCl8fFtdLEE6bnVsbCxhOm51bGwsejowLG06MCxjOjAsczowLHQ6bnVsbCxpOm99KS5hPWkpO3JldHVybiByLmNoaWxkcmVuWzBdfWZ1bmN0aW9uIHIodCl7dmFyIGU9dC5jaGlsZHJlbixyPXQucGFyZW50LmNoaWxkcmVuLG49dC5pP3JbdC5pLTFdOm51bGw7aWYoZS5sZW5ndGgpe0ZpKHQpO3ZhciBhPShlWzBdLnorZVtlLmxlbmd0aC0xXS56KS8yO24/KHQuej1uLnorcyh0Ll8sbi5fKSx0Lm09dC56LWEpOnQuej1hfWVsc2UgbiYmKHQuej1uLnorcyh0Ll8sbi5fKSk7dC5wYXJlbnQuQT1pKHQsbix0LnBhcmVudC5BfHxyWzBdKX1mdW5jdGlvbiBuKHQpe3QuXy54PXQueit0LnBhcmVudC5tLHQubSs9dC5wYXJlbnQubX1mdW5jdGlvbiBpKHQsZSxyKXtpZihlKXtmb3IodmFyIG4saT10LGE9dCxvPWUsbD1pLnBhcmVudC5jaGlsZHJlblswXSx1PWkubSxjPWEubSxoPW8ubSxmPWwubTtvPVJpKG8pLGk9RGkoaSksbyYmaTspbD1EaShsKSxhPVJpKGEpLGEuYT10LG49by56K2gtaS56LXUrcyhvLl8saS5fKSxuPjAmJihPaShqaShvLHQsciksdCxuKSx1Kz1uLGMrPW4pLGgrPW8ubSx1Kz1pLm0sZis9bC5tLGMrPWEubTtvJiYhUmkoYSkmJihhLnQ9byxhLm0rPWgtYyksaSYmIURpKGwpJiYobC50PWksbC5tKz11LWYscj10KX1yZXR1cm4gcn1mdW5jdGlvbiBhKHQpe3QueCo9bFswXSx0Lnk9dC5kZXB0aCpsWzFdfXZhciBvPXVvLmxheW91dC5oaWVyYXJjaHkoKS5zb3J0KG51bGwpLnZhbHVlKG51bGwpLHM9UGksbD1bMSwxXSx1PW51bGw7cmV0dXJuIHQuc2VwYXJhdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1lLHQpOnN9LHQuc2l6ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1udWxsPT0obD1lKT9hOm51bGwsdCk6dT9udWxsOmx9LHQubm9kZVNpemU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bnVsbD09KGw9ZSk/bnVsbDphLHQpOnU/bDpudWxsfSxvaSh0LG8pfSx1by5sYXlvdXQuY2x1c3Rlcj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxhKXt2YXIgbyxzPWUuY2FsbCh0aGlzLHQsYSksbD1zWzBdLHU9MDtsaShsLGZ1bmN0aW9uKHQpe3ZhciBlPXQuY2hpbGRyZW47ZSYmZS5sZW5ndGg/KHQueD1CaShlKSx0Lnk9TmkoZSkpOih0Lng9bz91Kz1yKHQsbyk6MCx0Lnk9MCxvPXQpfSk7dmFyIGM9VWkobCksaD1WaShsKSxmPWMueC1yKGMsaCkvMixkPWgueCtyKGgsYykvMjtyZXR1cm4gbGkobCxpP2Z1bmN0aW9uKHQpe3QueD0odC54LWwueCkqblswXSx0Lnk9KGwueS10LnkpKm5bMV19OmZ1bmN0aW9uKHQpe3QueD0odC54LWYpLyhkLWYpKm5bMF0sdC55PSgxLShsLnk/dC55L2wueToxKSkqblsxXX0pLHN9dmFyIGU9dW8ubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQobnVsbCkudmFsdWUobnVsbCkscj1QaSxuPVsxLDFdLGk9ITE7cmV0dXJuIHQuc2VwYXJhdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1lLHQpOnJ9LHQuc2l6ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1udWxsPT0obj1lKSx0KTppP251bGw6bn0sdC5ub2RlU2l6ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1udWxsIT0obj1lKSx0KTppP246bnVsbH0sb2kodCxlKX0sdW8ubGF5b3V0LnRyZWVtYXA9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciByLG4saT0tMSxhPXQubGVuZ3RoOysraTxhOyluPShyPXRbaV0pLnZhbHVlKihlPDA/MDplKSxyLmFyZWE9aXNOYU4obil8fG48PTA/MDpufWZ1bmN0aW9uIGUocil7dmFyIGE9ci5jaGlsZHJlbjtpZihhJiZhLmxlbmd0aCl7dmFyIG8scyxsLHU9aChyKSxjPVtdLGY9YS5zbGljZSgpLHA9MS8wLGc9InNsaWNlIj09PWQ/dS5keDoiZGljZSI9PT1kP3UuZHk6InNsaWNlLWRpY2UiPT09ZD8xJnIuZGVwdGg/dS5keTp1LmR4Ok1hdGgubWluKHUuZHgsdS5keSk7Zm9yKHQoZix1LmR4KnUuZHkvci52YWx1ZSksYy5hcmVhPTA7KGw9Zi5sZW5ndGgpPjA7KWMucHVzaChvPWZbbC0xXSksYy5hcmVhKz1vLmFyZWEsInNxdWFyaWZ5IiE9PWR8fChzPW4oYyxnKSk8PXA/KGYucG9wKCkscD1zKTooYy5hcmVhLT1jLnBvcCgpLmFyZWEsaShjLGcsdSwhMSksZz1NYXRoLm1pbih1LmR4LHUuZHkpLGMubGVuZ3RoPWMuYXJlYT0wLHA9MS8wKTtjLmxlbmd0aCYmKGkoYyxnLHUsITApLGMubGVuZ3RoPWMuYXJlYT0wKSxhLmZvckVhY2goZSl9fWZ1bmN0aW9uIHIoZSl7dmFyIG49ZS5jaGlsZHJlbjtpZihuJiZuLmxlbmd0aCl7dmFyIGEsbz1oKGUpLHM9bi5zbGljZSgpLGw9W107Zm9yKHQocyxvLmR4Km8uZHkvZS52YWx1ZSksbC5hcmVhPTA7YT1zLnBvcCgpOylsLnB1c2goYSksbC5hcmVhKz1hLmFyZWEsbnVsbCE9YS56JiYoaShsLGEuej9vLmR4Om8uZHksbywhcy5sZW5ndGgpLGwubGVuZ3RoPWwuYXJlYT0wKTtuLmZvckVhY2gocil9fWZ1bmN0aW9uIG4odCxlKXtmb3IodmFyIHIsbj10LmFyZWEsaT0wLGE9MS8wLG89LTEscz10Lmxlbmd0aDsrK288czspKHI9dFtvXS5hcmVhKSYmKHI8YSYmKGE9cikscj5pJiYoaT1yKSk7cmV0dXJuIG4qPW4sZSo9ZSxuP01hdGgubWF4KGUqaSpwL24sbi8oZSphKnApKToxLzB9ZnVuY3Rpb24gaSh0LGUscixuKXt2YXIgaSxhPS0xLG89dC5sZW5ndGgscz1yLngsdT1yLnksYz1lP2wodC5hcmVhL2UpOjA7aWYoZT09ci5keCl7Zm9yKChufHxjPnIuZHkpJiYoYz1yLmR5KTsrK2E8bzspaT10W2FdLGkueD1zLGkueT11LGkuZHk9YyxzKz1pLmR4PU1hdGgubWluKHIueCtyLmR4LXMsYz9sKGkuYXJlYS9jKTowKTtpLno9ITAsaS5keCs9ci54K3IuZHgtcyxyLnkrPWMsci5keS09Y31lbHNle2Zvcigobnx8Yz5yLmR4KSYmKGM9ci5keCk7KythPG87KWk9dFthXSxpLng9cyxpLnk9dSxpLmR4PWMsdSs9aS5keT1NYXRoLm1pbihyLnkrci5keS11LGM/bChpLmFyZWEvYyk6MCk7aS56PSExLGkuZHkrPXIueStyLmR5LXUsci54Kz1jLHIuZHgtPWN9fWZ1bmN0aW9uIGEobil7dmFyIGk9b3x8cyhuKSxhPWlbMF07cmV0dXJuIGEueD1hLnk9MCxhLnZhbHVlPyhhLmR4PXVbMF0sYS5keT11WzFdKTphLmR4PWEuZHk9MCxvJiZzLnJldmFsdWUoYSksdChbYV0sYS5keCphLmR5L2EudmFsdWUpLChvP3I6ZSkoYSksZiYmKG89aSksaX12YXIgbyxzPXVvLmxheW91dC5oaWVyYXJjaHkoKSxsPU1hdGgucm91bmQsdT1bMSwxXSxjPW51bGwsaD1xaSxmPSExLGQ9InNxdWFyaWZ5IixwPS41KigxK01hdGguc3FydCg1KSk7cmV0dXJuIGEuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LGEpOnV9LGEucGFkZGluZz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciByPXQuY2FsbChhLGUsZS5kZXB0aCk7cmV0dXJuIG51bGw9PXI/cWkoZSk6SGkoZSwibnVtYmVyIj09dHlwZW9mIHI/W3IscixyLHJdOnIpfWZ1bmN0aW9uIHIoZSl7cmV0dXJuIEhpKGUsdCl9aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGM7dmFyIG47cmV0dXJuIGg9bnVsbD09KGM9dCk/cWk6ImZ1bmN0aW9uIj09KG49dHlwZW9mIHQpP2U6Im51bWJlciI9PT1uPyh0PVt0LHQsdCx0XSxyKTpyLGF9LGEucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9dD9NYXRoLnJvdW5kOk51bWJlcixhKTpsIT1OdW1iZXJ9LGEuc3RpY2t5PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPXQsbz1udWxsLGEpOmZ9LGEucmF0aW89ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9dCxhKTpwfSxhLm1vZGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9dCsiIixhKTpkfSxvaShhLHMpfSx1by5yYW5kb209e25vcm1hbDpmdW5jdGlvbih0LGUpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIHI8MiYmKGU9MSkscjwxJiYodD0wKSxmdW5jdGlvbigpe3ZhciByLG4saTtkbyByPTIqTWF0aC5yYW5kb20oKS0xLG49MipNYXRoLnJhbmRvbSgpLTEsaT1yKnIrbipuO3doaWxlKCFpfHxpPjEpO3JldHVybiB0K2UqcipNYXRoLnNxcnQoLTIqTWF0aC5sb2coaSkvaSl9fSxsb2dOb3JtYWw6ZnVuY3Rpb24oKXt2YXIgdD11by5yYW5kb20ubm9ybWFsLmFwcGx5KHVvLGFyZ3VtZW50cyk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguZXhwKHQoKSl9fSxiYXRlczpmdW5jdGlvbih0KXt2YXIgZT11by5yYW5kb20uaXJ3aW5IYWxsKHQpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlKCkvdH19LGlyd2luSGFsbDpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGU9MCxyPTA7cjx0O3IrKyllKz1NYXRoLnJhbmRvbSgpO3JldHVybiBlfX19LHVvLnNjYWxlPXt9O3ZhciBBbD17Zmxvb3I6YixjZWlsOmJ9O3VvLnNjYWxlLmxpbmVhcj1mdW5jdGlvbigpe3JldHVybiBLaShbMCwxXSxbMCwxXSxfbiwhMSl9O3ZhciBrbD17czoxLGc6MSxwOjEscjoxLGU6MX07dW8uc2NhbGUubG9nPWZ1bmN0aW9uKCl7cmV0dXJuIGFhKHVvLnNjYWxlLmxpbmVhcigpLmRvbWFpbihbMCwxXSksMTAsITAsWzEsMTBdKX07dmFyIFRsPXVvLmZvcm1hdCgiLjBlIiksRWw9e2Zsb29yOmZ1bmN0aW9uKHQpe3JldHVybi1NYXRoLmNlaWwoLXQpfSxjZWlsOmZ1bmN0aW9uKHQpe3JldHVybi1NYXRoLmZsb29yKC10KX19O3VvLnNjYWxlLnBvdz1mdW5jdGlvbigpe3JldHVybiBvYSh1by5zY2FsZS5saW5lYXIoKSwxLFswLDFdKX0sdW8uc2NhbGUuc3FydD1mdW5jdGlvbigpe3JldHVybiB1by5zY2FsZS5wb3coKS5leHBvbmVudCguNSl9LHVvLnNjYWxlLm9yZGluYWw9ZnVuY3Rpb24oKXtyZXR1cm4gbGEoW10se3Q6InJhbmdlIixhOltbXV19KX0sdW8uc2NhbGUuY2F0ZWdvcnkxMD1mdW5jdGlvbigpe3JldHVybiB1by5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoU2wpfSx1by5zY2FsZS5jYXRlZ29yeTIwPWZ1bmN0aW9uKCl7cmV0dXJuIHVvLnNjYWxlLm9yZGluYWwoKS5yYW5nZShMbCl9LHVvLnNjYWxlLmNhdGVnb3J5MjBiPWZ1bmN0aW9uKCl7cmV0dXJuIHVvLnNjYWxlLm9yZGluYWwoKS5yYW5nZSh6bCl9LHVvLnNjYWxlLmNhdGVnb3J5MjBjPWZ1bmN0aW9uKCl7cmV0dXJuIHVvLnNjYWxlLm9yZGluYWwoKS5yYW5nZShDbCl9O3ZhciBTbD1bMjA2MjI2MCwxNjc0NDIwNiwyOTI0NTg4LDE0MDM0NzI4LDk3MjU4ODUsOTE5NzEzMSwxNDkwNzMzMCw4MzU1NzExLDEyMzY5MTg2LDE1NTYxNzVdLm1hcChfdCksTGw9WzIwNjIyNjAsMTE0NTQ0NDAsMTY3NDQyMDYsMTY3NTk2NzIsMjkyNDU4OCwxMDAxODY5OCwxNDAzNDcyOCwxNjc1MDc0Miw5NzI1ODg1LDEyOTU1ODYxLDkxOTcxMzEsMTI4ODUxNDAsMTQ5MDczMzAsMTYyMzQxOTQsODM1NTcxMSwxMzA5MjgwNywxMjM2OTE4NiwxNDQwODU4OSwxNTU2MTc1LDEwNDEwNzI1XS5tYXAoX3QpLHpsPVszNzUwNzc3LDUzOTU2MTksNzA0MDcxOSwxMDI2NDI4Niw2NTE5MDk3LDkyMTY1OTQsMTE5MTUxMTUsMTM1NTY2MzYsOTIwMjk5MywxMjQyNjgwOSwxNTE4NjUxNCwxNTE5MDkzMiw4NjY2MTY5LDExMzU2NDkwLDE0MDQ5NjQzLDE1MTc3MzcyLDgwNzc2ODMsMTA4MzQzMjQsMTM1Mjg1MDksMTQ1ODk2NTRdLm1hcChfdCksQ2w9WzMyNDQ3MzMsNzA1NzExMCwxMDQwNjYyNSwxMzAzMjQzMSwxNTA5NTA1MywxNjYxNjc2NCwxNjYyNTI1OSwxNjYzNDAxOCwzMjUzMDc2LDc2NTI0NzAsMTA2MDcwMDMsMTMxMDE1MDQsNzY5NTI4MSwxMDM5NDMxMiwxMjM2OTM3MiwxNDM0Mjg5MSw2NTEzNTA3LDk4Njg5NTAsMTI0MzQ4NzcsMTQyNzcwODFdLm1hcChfdCk7dW8uc2NhbGUucXVhbnRpbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdWEoW10sW10pfSx1by5zY2FsZS5xdWFudGl6ZT1mdW5jdGlvbigpe3JldHVybiBjYSgwLDEsWzAsMV0pfSx1by5zY2FsZS50aHJlc2hvbGQ9ZnVuY3Rpb24oKXtyZXR1cm4gaGEoWy41XSxbMCwxXSl9LHVvLnNjYWxlLmlkZW50aXR5PWZ1bmN0aW9uKCl7cmV0dXJuIGZhKFswLDFdKX0sdW8uc3ZnPXt9LHVvLnN2Zy5hcmM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dmFyIHQ9TWF0aC5tYXgoMCwrci5hcHBseSh0aGlzLGFyZ3VtZW50cykpLHU9TWF0aC5tYXgoMCwrbi5hcHBseSh0aGlzLGFyZ3VtZW50cykpLGM9by5hcHBseSh0aGlzLGFyZ3VtZW50cyktVm8saD1zLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1WbyxmPU1hdGguYWJzKGgtYyksZD1jPmg/MDoxO2lmKHU8dCYmKHA9dSx1PXQsdD1wKSxmPj1VbylyZXR1cm4gZSh1LGQpKyh0P2UodCwxLWQpOiIiKSsiWiI7dmFyIHAsZyxtLHYseSx4LGIsXyx3LE0sQSxrLFQ9MCxFPTAsUz1bXTtpZigodj0oK2wuYXBwbHkodGhpcyxhcmd1bWVudHMpfHwwKS8yKSYmKG09YT09PUlsP01hdGguc3FydCh0KnQrdSp1KTorYS5hcHBseSh0aGlzLGFyZ3VtZW50cyksZHx8KEUqPS0xKSx1JiYoRT1udChtL3UqTWF0aC5zaW4odikpKSx0JiYoVD1udChtL3QqTWF0aC5zaW4odikpKSksdSl7eT11Kk1hdGguY29zKGMrRSkseD11Kk1hdGguc2luKGMrRSksYj11Kk1hdGguY29zKGgtRSksXz11Kk1hdGguc2luKGgtRSk7dmFyIEw9TWF0aC5hYnMoaC1jLTIqRSk8PU5vPzA6MTtpZihFJiZ4YSh5LHgsYixfKT09PWReTCl7dmFyIHo9KGMraCkvMjt5PXUqTWF0aC5jb3MoeikseD11Kk1hdGguc2luKHopLGI9Xz1udWxsfX1lbHNlIHk9eD0wO2lmKHQpe3c9dCpNYXRoLmNvcyhoLVQpLE09dCpNYXRoLnNpbihoLVQpLEE9dCpNYXRoLmNvcyhjK1QpLGs9dCpNYXRoLnNpbihjK1QpO3ZhciBDPU1hdGguYWJzKGMtaCsyKlQpPD1Obz8wOjE7aWYoVCYmeGEodyxNLEEsayk9PT0xLWReQyl7dmFyIEk9KGMraCkvMjt3PXQqTWF0aC5jb3MoSSksTT10Kk1hdGguc2luKEkpLEE9az1udWxsfX1lbHNlIHc9TT0wO2lmKGY+Rm8mJihwPU1hdGgubWluKE1hdGguYWJzKHUtdCkvMiwraS5hcHBseSh0aGlzLGFyZ3VtZW50cykpKT4uMDAxKXtnPXQ8dV5kPzA6MTt2YXIgUD1wLEQ9cDtpZihmPE5vKXt2YXIgUj1udWxsPT1BP1t3LE1dOm51bGw9PWI/W3kseF06UnIoW3kseF0sW0Esa10sW2IsX10sW3csTV0pLE89eS1SWzBdLEY9eC1SWzFdLGo9Yi1SWzBdLE49Xy1SWzFdLEI9MS9NYXRoLnNpbihNYXRoLmFjb3MoKE8qaitGKk4pLyhNYXRoLnNxcnQoTypPK0YqRikqTWF0aC5zcXJ0KGoqaitOKk4pKSkvMiksVT1NYXRoLnNxcnQoUlswXSpSWzBdK1JbMV0qUlsxXSk7RD1NYXRoLm1pbihwLCh0LVUpLyhCLTEpKSxQPU1hdGgubWluKHAsKHUtVSkvKEIrMSkpfWlmKG51bGwhPWIpe3ZhciBWPWJhKG51bGw9PUE/W3csTV06W0Esa10sW3kseF0sdSxQLGQpLHE9YmEoW2IsX10sW3csTV0sdSxQLGQpO3A9PT1QP1MucHVzaCgiTSIsVlswXSwiQSIsUCwiLCIsUCwiIDAgMCwiLGcsIiAiLFZbMV0sIkEiLHUsIiwiLHUsIiAwICIsMS1kXnhhKFZbMV1bMF0sVlsxXVsxXSxxWzFdWzBdLHFbMV1bMV0pLCIsIixkLCIgIixxWzFdLCJBIixQLCIsIixQLCIgMCAwLCIsZywiICIscVswXSk6Uy5wdXNoKCJNIixWWzBdLCJBIixQLCIsIixQLCIgMCAxLCIsZywiICIscVswXSl9ZWxzZSBTLnB1c2goIk0iLHksIiwiLHgpO2lmKG51bGwhPUEpe3ZhciBIPWJhKFt5LHhdLFtBLGtdLHQsLUQsZCksRz1iYShbdyxNXSxudWxsPT1iP1t5LHhdOltiLF9dLHQsLUQsZCk7cD09PUQ/Uy5wdXNoKCJMIixHWzBdLCJBIixELCIsIixELCIgMCAwLCIsZywiICIsR1sxXSwiQSIsdCwiLCIsdCwiIDAgIixkXnhhKEdbMV1bMF0sR1sxXVsxXSxIWzFdWzBdLEhbMV1bMV0pLCIsIiwxLWQsIiAiLEhbMV0sIkEiLEQsIiwiLEQsIiAwIDAsIixnLCIgIixIWzBdKTpTLnB1c2goIkwiLEdbMF0sIkEiLEQsIiwiLEQsIiAwIDAsIixnLCIgIixIWzBdKX1lbHNlIFMucHVzaCgiTCIsdywiLCIsTSl9ZWxzZSBTLnB1c2goIk0iLHksIiwiLHgpLG51bGwhPWImJlMucHVzaCgiQSIsdSwiLCIsdSwiIDAgIixMLCIsIixkLCIgIixiLCIsIixfKSxTLnB1c2goIkwiLHcsIiwiLE0pLG51bGwhPUEmJlMucHVzaCgiQSIsdCwiLCIsdCwiIDAgIixDLCIsIiwxLWQsIiAiLEEsIiwiLGspO3JldHVybiBTLnB1c2goIloiKSxTLmpvaW4oIiIpfWZ1bmN0aW9uIGUodCxlKXtyZXR1cm4iTTAsIit0KyJBIit0KyIsIit0KyIgMCAxLCIrZSsiIDAsIistdCsiQSIrdCsiLCIrdCsiIDAgMSwiK2UrIiAwLCIrdH12YXIgcj1wYSxuPWdhLGk9ZGEsYT1JbCxvPW1hLHM9dmEsbD15YTtyZXR1cm4gdC5pbm5lclJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1TdChlKSx0KTpyfSx0Lm91dGVyUmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPVN0KGUpLHQpOm59LHQuY29ybmVyUmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPVN0KGUpLHQpOml9LHQucGFkUmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPWU9PUlsP0lsOlN0KGUpLHQpOmF9LHQuc3RhcnRBbmdsZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1TdChlKSx0KTpvfSx0LmVuZEFuZ2xlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPVN0KGUpLHQpOnN9LHQucGFkQW5nbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9U3QoZSksdCk6bH0sdC5jZW50cm9pZD1mdW5jdGlvbigpe3ZhciB0PSgrci5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMixlPSgrby5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMi1WbztyZXR1cm5bTWF0aC5jb3MoZSkqdCxNYXRoLnNpbihlKSp0XX0sdH07dmFyIElsPSJhdXRvIjt1by5zdmcubGluZT1mdW5jdGlvbigpe3JldHVybiBfYShiKX07dmFyIFBsPXVvLm1hcCh7bGluZWFyOndhLCJsaW5lYXItY2xvc2VkIjpNYSxzdGVwOkFhLCJzdGVwLWJlZm9yZSI6a2EsInN0ZXAtYWZ0ZXIiOlRhLGJhc2lzOklhLCJiYXNpcy1vcGVuIjpQYSwiYmFzaXMtY2xvc2VkIjpEYSxidW5kbGU6UmEsY2FyZGluYWw6TGEsImNhcmRpbmFsLW9wZW4iOkVhLCJjYXJkaW5hbC1jbG9zZWQiOlNhLG1vbm90b25lOlVhfSk7UGwuZm9yRWFjaChmdW5jdGlvbih0LGUpe2Uua2V5PXQsZS5jbG9zZWQ9Ly1jbG9zZWQkLy50ZXN0KHQpfSk7dmFyIERsPVswLDIvMywxLzMsMF0sUmw9WzAsMS8zLDIvMywwXSxPbD1bMCwxLzYsMi8zLDEvNl07dW8uc3ZnLmxpbmUucmFkaWFsPWZ1bmN0aW9uKCl7dmFyIHQ9X2EoVmEpO3JldHVybiB0LnJhZGl1cz10LngsZGVsZXRlIHQueCx0LmFuZ2xlPXQueSxkZWxldGUgdC55LHR9LGthLnJldmVyc2U9VGEsVGEucmV2ZXJzZT1rYSx1by5zdmcuYXJlYT1mdW5jdGlvbigpe3JldHVybiBxYShiKX0sdW8uc3ZnLmFyZWEucmFkaWFsPWZ1bmN0aW9uKCl7dmFyIHQ9cWEoVmEpO3JldHVybiB0LnJhZGl1cz10LngsZGVsZXRlIHQueCx0LmlubmVyUmFkaXVzPXQueDAsZGVsZXRlIHQueDAsdC5vdXRlclJhZGl1cz10LngxLGRlbGV0ZSB0LngxLHQuYW5nbGU9dC55LGRlbGV0ZSB0LnksdC5zdGFydEFuZ2xlPXQueTAsZGVsZXRlIHQueTAsdC5lbmRBbmdsZT10LnkxLGRlbGV0ZSB0LnkxLHR9LHVvLnN2Zy5jaG9yZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxzKXt2YXIgbD1lKHRoaXMsYSx0LHMpLHU9ZSh0aGlzLG8sdCxzKTtyZXR1cm4iTSIrbC5wMCtuKGwucixsLnAxLGwuYTEtbC5hMCkrKHIobCx1KT9pKGwucixsLnAxLGwucixsLnAwKTppKGwucixsLnAxLHUucix1LnAwKStuKHUucix1LnAxLHUuYTEtdS5hMCkraSh1LnIsdS5wMSxsLnIsbC5wMCkpKyJaIn1mdW5jdGlvbiBlKHQsZSxyLG4pe3ZhciBpPWUuY2FsbCh0LHIsbiksYT1zLmNhbGwodCxpLG4pLG89bC5jYWxsKHQsaSxuKS1WbyxjPXUuY2FsbCh0LGksbiktVm87cmV0dXJue3I6YSxhMDpvLGExOmMscDA6W2EqTWF0aC5jb3MobyksYSpNYXRoLnNpbihvKV0scDE6W2EqTWF0aC5jb3MoYyksYSpNYXRoLnNpbihjKV19fWZ1bmN0aW9uIHIodCxlKXtyZXR1cm4gdC5hMD09ZS5hMCYmdC5hMT09ZS5hMX1mdW5jdGlvbiBuKHQsZSxyKXtyZXR1cm4iQSIrdCsiLCIrdCsiIDAgIisgKyhyPk5vKSsiLDEgIitlfWZ1bmN0aW9uIGkodCxlLHIsbil7cmV0dXJuIlEgMCwwICIrbn12YXIgYT1icixvPV9yLHM9SGEsbD1tYSx1PXZhO3JldHVybiB0LnJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1TdChlKSx0KTpzfSx0LnNvdXJjZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1TdChlKSx0KTphfSx0LnRhcmdldD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1TdChlKSx0KTpvfSx0LnN0YXJ0QW5nbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9U3QoZSksdCk6bH0sdC5lbmRBbmdsZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1TdChlKSx0KTp1fSx0fSx1by5zdmcuZGlhZ29uYWw9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsaSl7dmFyIGE9ZS5jYWxsKHRoaXMsdCxpKSxvPXIuY2FsbCh0aGlzLHQsaSkscz0oYS55K28ueSkvMixsPVthLHt4OmEueCx5OnN9LHt4Om8ueCx5OnN9LG9dO3JldHVybiBsPWwubWFwKG4pLCJNIitsWzBdKyJDIitsWzFdKyIgIitsWzJdKyIgIitsWzNdfXZhciBlPWJyLHI9X3Isbj1HYTtyZXR1cm4gdC5zb3VyY2U9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9U3QociksdCk6ZX0sdC50YXJnZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9U3QoZSksdCk6cn0sdC5wcm9qZWN0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWUsdCk6bn0sdH0sdW8uc3ZnLmRpYWdvbmFsLnJhZGlhbD1mdW5jdGlvbigpe3ZhciB0PXVvLnN2Zy5kaWFnb25hbCgpLGU9R2Escj10LnByb2plY3Rpb247cmV0dXJuIHQucHJvamVjdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9yKFhhKGU9dCkpOmV9LHR9LHVvLnN2Zy5zeW1ib2w9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsbil7cmV0dXJuKEZsLmdldChlLmNhbGwodGhpcyx0LG4pKXx8WmEpKHIuY2FsbCh0aGlzLHQsbikpfXZhciBlPVdhLHI9WWE7cmV0dXJuIHQudHlwZT1mdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1TdChyKSx0KTplfSx0LnNpemU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9U3QoZSksdCk6cn0sdH07dmFyIEZsPXVvLm1hcCh7Y2lyY2xlOlphLGNyb3NzOmZ1bmN0aW9uKHQpe3ZhciBlPU1hdGguc3FydCh0LzUpLzI7cmV0dXJuIk0iKy0zKmUrIiwiKy1lKyJIIistZSsiViIrLTMqZSsiSCIrZSsiViIrLWUrIkgiKzMqZSsiViIrZSsiSCIrZSsiViIrMyplKyJIIistZSsiViIrZSsiSCIrLTMqZSsiWiJ9LGRpYW1vbmQ6ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5zcXJ0KHQvKDIqTmwpKSxyPWUqTmw7cmV0dXJuIk0wLCIrLWUrIkwiK3IrIiwwIDAsIitlKyIgIistcisiLDBaIn0sc3F1YXJlOmZ1bmN0aW9uKHQpe3ZhciBlPU1hdGguc3FydCh0KS8yO3JldHVybiJNIistZSsiLCIrLWUrIkwiK2UrIiwiKy1lKyIgIitlKyIsIitlKyIgIistZSsiLCIrZSsiWiJ9LCJ0cmlhbmdsZS1kb3duIjpmdW5jdGlvbih0KXt2YXIgZT1NYXRoLnNxcnQodC9qbCkscj1lKmpsLzI7cmV0dXJuIk0wLCIrcisiTCIrZSsiLCIrLXIrIiAiKy1lKyIsIistcisiWiJ9LCJ0cmlhbmdsZS11cCI6ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5zcXJ0KHQvamwpLHI9ZSpqbC8yO3JldHVybiJNMCwiKy1yKyJMIitlKyIsIityKyIgIistZSsiLCIrcisiWiJ9fSk7dW8uc3ZnLnN5bWJvbFR5cGVzPUZsLmtleXMoKTt2YXIgamw9TWF0aC5zcXJ0KDMpLE5sPU1hdGgudGFuKDMwKnFvKTtMby50cmFuc2l0aW9uPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxyLG49Qmx8fCsrSGwsaT10byh0KSxhPVtdLG89VWx8fHt0aW1lOkRhdGUubm93KCksZWFzZTpTbixkZWxheTowLGR1cmF0aW9uOjI1MH0scz0tMSxsPXRoaXMubGVuZ3RoOysrczxsOyl7YS5wdXNoKGU9W10pO2Zvcih2YXIgdT10aGlzW3NdLGM9LTEsaD11Lmxlbmd0aDsrK2M8aDspKHI9dVtjXSkmJmVvKHIsYyxpLG4sbyksZS5wdXNoKHIpfXJldHVybiBLYShhLGksbil9LExvLmludGVycnVwdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKG51bGw9PXQ/Vmw6UWEodG8odCkpKX07dmFyIEJsLFVsLFZsPVFhKHRvKCkpLHFsPVtdLEhsPTA7cWwuY2FsbD1Mby5jYWxsLHFsLmVtcHR5PUxvLmVtcHR5LHFsLm5vZGU9TG8ubm9kZSxxbC5zaXplPUxvLnNpemUsdW8udHJhbnNpdGlvbj1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0LnRyYW5zaXRpb24/Qmw/dC50cmFuc2l0aW9uKGUpOnQ6dW8uc2VsZWN0aW9uKCkudHJhbnNpdGlvbih0KX0sdW8udHJhbnNpdGlvbi5wcm90b3R5cGU9cWwscWwuc2VsZWN0PWZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpPXRoaXMuaWQsYT10aGlzLm5hbWVzcGFjZSxvPVtdO3Q9eih0KTtmb3IodmFyIHM9LTEsbD10aGlzLmxlbmd0aDsrK3M8bDspe28ucHVzaChlPVtdKTtmb3IodmFyIHU9dGhpc1tzXSxjPS0xLGg9dS5sZW5ndGg7KytjPGg7KShuPXVbY10pJiYocj10LmNhbGwobixuLl9fZGF0YV9fLGMscykpPygiX19kYXRhX18iaW4gbiYmKHIuX19kYXRhX189bi5fX2RhdGFfXyksZW8ocixjLGEsaSxuW2FdW2ldKSxlLnB1c2gocikpOmUucHVzaChudWxsKX1yZXR1cm4gS2EobyxhLGkpfSxxbC5zZWxlY3RBbGw9ZnVuY3Rpb24odCl7dmFyIGUscixuLGksYSxvPXRoaXMuaWQscz10aGlzLm5hbWVzcGFjZSxsPVtdO3Q9Qyh0KTtmb3IodmFyIHU9LTEsYz10aGlzLmxlbmd0aDsrK3U8YzspZm9yKHZhciBoPXRoaXNbdV0sZj0tMSxkPWgubGVuZ3RoOysrZjxkOylpZihuPWhbZl0pe2E9bltzXVtvXSxyPXQuY2FsbChuLG4uX19kYXRhX18sZix1KSxsLnB1c2goZT1bXSk7Zm9yKHZhciBwPS0xLGc9ci5sZW5ndGg7KytwPGc7KShpPXJbcF0pJiZlbyhpLHAscyxvLGEpLGUucHVzaChpKX1yZXR1cm4gS2EobCxzLG8pfSxxbC5maWx0ZXI9ZnVuY3Rpb24odCl7dmFyIGUscixuLGk9W107ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXEodCkpO2Zvcih2YXIgYT0wLG89dGhpcy5sZW5ndGg7YTxvO2ErKyl7aS5wdXNoKGU9W10pO2Zvcih2YXIgcj10aGlzW2FdLHM9MCxsPXIubGVuZ3RoO3M8bDtzKyspKG49cltzXSkmJnQuY2FsbChuLG4uX19kYXRhX18scyxhKSYmZS5wdXNoKG4pfXJldHVybiBLYShpLHRoaXMubmFtZXNwYWNlLHRoaXMuaWQpfSxxbC50d2Vlbj1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuaWQsbj10aGlzLm5hbWVzcGFjZTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP3RoaXMubm9kZSgpW25dW3JdLnR3ZWVuLmdldCh0KTpHKHRoaXMsbnVsbD09ZT9mdW5jdGlvbihlKXtlW25dW3JdLnR3ZWVuLnJlbW92ZSh0KX06ZnVuY3Rpb24oaSl7aVtuXVtyXS50d2Vlbi5zZXQodCxlKX0pfSxxbC5hdHRyPWZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcigpe3RoaXMucmVtb3ZlQXR0cmlidXRlKHMpfWZ1bmN0aW9uIG4oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHMuc3BhY2Uscy5sb2NhbCl9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gbnVsbD09dD9yOih0Kz0iIixmdW5jdGlvbigpe3ZhciBlLHI9dGhpcy5nZXRBdHRyaWJ1dGUocyk7cmV0dXJuIHIhPT10JiYoZT1vKHIsdCksZnVuY3Rpb24odCl7dGhpcy5zZXRBdHRyaWJ1dGUocyxlKHQpKX0pfSl9ZnVuY3Rpb24gYSh0KXtyZXR1cm4gbnVsbD09dD9uOih0Kz0iIixmdW5jdGlvbigpe3ZhciBlLHI9dGhpcy5nZXRBdHRyaWJ1dGVOUyhzLnNwYWNlLHMubG9jYWwpO3JldHVybiByIT09dCYmKGU9byhyLHQpLGZ1bmN0aW9uKHQpe3RoaXMuc2V0QXR0cmlidXRlTlMocy5zcGFjZSxzLmxvY2FsLGUodCkpfSl9KX1pZihhcmd1bWVudHMubGVuZ3RoPDIpe2ZvcihlIGluIHQpdGhpcy5hdHRyKGUsdFtlXSk7cmV0dXJuIHRoaXN9dmFyIG89InRyYW5zZm9ybSI9PXQ/Wm46X24scz11by5ucy5xdWFsaWZ5KHQpO3JldHVybiAkYSh0aGlzLCJhdHRyLiIrdCxlLHMubG9jYWw/YTppKX0scWwuYXR0clR3ZWVuPWZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcih0LHIpe3ZhciBuPWUuY2FsbCh0aGlzLHQscix0aGlzLmdldEF0dHJpYnV0ZShpKSk7cmV0dXJuIG4mJmZ1bmN0aW9uKHQpe3RoaXMuc2V0QXR0cmlidXRlKGksbih0KSl9fWZ1bmN0aW9uIG4odCxyKXt2YXIgbj1lLmNhbGwodGhpcyx0LHIsdGhpcy5nZXRBdHRyaWJ1dGVOUyhpLnNwYWNlLGkubG9jYWwpKTtyZXR1cm4gbiYmZnVuY3Rpb24odCl7dGhpcy5zZXRBdHRyaWJ1dGVOUyhpLnNwYWNlLGkubG9jYWwsbih0KSl9fXZhciBpPXVvLm5zLnF1YWxpZnkodCk7cmV0dXJuIHRoaXMudHdlZW4oImF0dHIuIit0LGkubG9jYWw/bjpyKX0scWwuc3R5bGU9ZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIGkoKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfWZ1bmN0aW9uIGEoZSl7cmV0dXJuIG51bGw9PWU/aTooZSs9IiIsZnVuY3Rpb24oKXt2YXIgaSxhPW4odGhpcykuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLG51bGwpLmdldFByb3BlcnR5VmFsdWUodCk7cmV0dXJuIGEhPT1lJiYoaT1fbihhLGUpLGZ1bmN0aW9uKGUpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxpKGUpLHIpfSl9KX12YXIgbz1hcmd1bWVudHMubGVuZ3RoO2lmKG88Myl7aWYoInN0cmluZyIhPXR5cGVvZiB0KXtvPDImJihlPSIiKTtmb3IociBpbiB0KXRoaXMuc3R5bGUocix0W3JdLGUpO3JldHVybiB0aGlzfXI9IiJ9cmV0dXJuICRhKHRoaXMsInN0eWxlLiIrdCxlLGEpfSxxbC5zdHlsZVR3ZWVuPWZ1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBpKGksYSl7dmFyIG89ZS5jYWxsKHRoaXMsaSxhLG4odGhpcykuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLG51bGwpLmdldFByb3BlcnR5VmFsdWUodCkpO3JldHVybiBvJiZmdW5jdGlvbihlKXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsbyhlKSxyKX19cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MyYmKHI9IiIpLHRoaXMudHdlZW4oInN0eWxlLiIrdCxpKX0scWwudGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gJGEodGhpcywidGV4dCIsdCxKYSl9LHFsLnJlbW92ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMubmFtZXNwYWNlO3JldHVybiB0aGlzLmVhY2goImVuZC50cmFuc2l0aW9uIixmdW5jdGlvbigpe3ZhciBlO3RoaXNbdF0uY291bnQ8MiYmKGU9dGhpcy5wYXJlbnROb2RlKSYmZS5yZW1vdmVDaGlsZCh0aGlzKX0pfSxxbC5lYXNlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaWQscj10aGlzLm5hbWVzcGFjZTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwxP3RoaXMubm9kZSgpW3JdW2VdLmVhc2U6KCJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD11by5lYXNlLmFwcGx5KHVvLGFyZ3VtZW50cykpLEcodGhpcyxmdW5jdGlvbihuKXtuW3JdW2VdLmVhc2U9dH0pKX0scWwuZGVsYXk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5pZCxyPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/dGhpcy5ub2RlKClbcl1bZV0uZGVsYXk6Ryh0aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiB0P2Z1bmN0aW9uKG4saSxhKXtuW3JdW2VdLmRlbGF5PSt0LmNhbGwobixuLl9fZGF0YV9fLGksYSl9Oih0PSt0LGZ1bmN0aW9uKG4pe25bcl1bZV0uZGVsYXk9dH0pKX0scWwuZHVyYXRpb249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5pZCxyPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/dGhpcy5ub2RlKClbcl1bZV0uZHVyYXRpb246Ryh0aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiB0P2Z1bmN0aW9uKG4saSxhKXtuW3JdW2VdLmR1cmF0aW9uPU1hdGgubWF4KDEsdC5jYWxsKG4sbi5fX2RhdGFfXyxpLGEpKX06KHQ9TWF0aC5tYXgoMSx0KSxmdW5jdGlvbihuKXtuW3JdW2VdLmR1cmF0aW9uPXR9KSl9LHFsLmVhY2g9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLmlkLG49dGhpcy5uYW1lc3BhY2U7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXt2YXIgaT1VbCxhPUJsO3RyeXtCbD1yLEcodGhpcyxmdW5jdGlvbihlLGksYSl7VWw9ZVtuXVtyXSx0LmNhbGwoZSxlLl9fZGF0YV9fLGksYSl9KX1maW5hbGx5e1VsPWksQmw9YX19ZWxzZSBHKHRoaXMsZnVuY3Rpb24oaSl7dmFyIGE9aVtuXVtyXTsoYS5ldmVudHx8KGEuZXZlbnQ9dW8uZGlzcGF0Y2goInN0YXJ0IiwiZW5kIiwiaW50ZXJydXB0IikpKS5vbih0LGUpfSk7cmV0dXJuIHRoaXN9LHFsLnRyYW5zaXRpb249ZnVuY3Rpb24oKXtmb3IodmFyIHQsZSxyLG4saT10aGlzLmlkLGE9KytIbCxvPXRoaXMubmFtZXNwYWNlLHM9W10sbD0wLHU9dGhpcy5sZW5ndGg7bDx1O2wrKyl7cy5wdXNoKHQ9W10pO2Zvcih2YXIgZT10aGlzW2xdLGM9MCxoPWUubGVuZ3RoO2M8aDtjKyspKHI9ZVtjXSkmJihuPXJbb11baV0sZW8ocixjLG8sYSx7dGltZTpuLnRpbWUsZWFzZTpuLmVhc2UsZGVsYXk6bi5kZWxheStuLmR1cmF0aW9uLGR1cmF0aW9uOm4uZHVyYXRpb259KSksdC5wdXNoKHIpfXJldHVybiBLYShzLG8sYSl9LHVvLnN2Zy5heGlzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0LmVhY2goZnVuY3Rpb24oKXt2YXIgdCx1PXVvLnNlbGVjdCh0aGlzKSxjPXRoaXMuX19jaGFydF9ffHxyLGg9dGhpcy5fX2NoYXJ0X189ci5jb3B5KCksZj1udWxsPT1sP2gudGlja3M/aC50aWNrcy5hcHBseShoLHMpOmguZG9tYWluKCk6bCxkPW51bGw9PWU/aC50aWNrRm9ybWF0P2gudGlja0Zvcm1hdC5hcHBseShoLHMpOmI6ZSxwPXUuc2VsZWN0QWxsKCIudGljayIpLmRhdGEoZixoKSxnPXAuZW50ZXIoKS5pbnNlcnQoImciLCIuZG9tYWluIikuYXR0cigiY2xhc3MiLCJ0aWNrIikuc3R5bGUoIm9wYWNpdHkiLEZvKSxtPXVvLnRyYW5zaXRpb24ocC5leGl0KCkpLnN0eWxlKCJvcGFjaXR5IixGbykucmVtb3ZlKCksdj11by50cmFuc2l0aW9uKHAub3JkZXIoKSkuc3R5bGUoIm9wYWNpdHkiLDEpLHk9TWF0aC5tYXgoaSwwKStvLHg9WGkoaCksXz11LnNlbGVjdEFsbCgiLmRvbWFpbiIpLmRhdGEoWzBdKSx3PShfLmVudGVyKCkuYXBwZW5kKCJwYXRoIikuYXR0cigiY2xhc3MiLCJkb21haW4iKSx1by50cmFuc2l0aW9uKF8pKTtnLmFwcGVuZCgibGluZSIpLGcuYXBwZW5kKCJ0ZXh0Iik7dmFyIE0sQSxrLFQsRT1nLnNlbGVjdCgibGluZSIpLFM9di5zZWxlY3QoImxpbmUiKSxMPXAuc2VsZWN0KCJ0ZXh0IikudGV4dChkKSx6PWcuc2VsZWN0KCJ0ZXh0IiksQz12LnNlbGVjdCgidGV4dCIpLEk9InRvcCI9PT1ufHwibGVmdCI9PT1uPy0xOjE7aWYoImJvdHRvbSI9PT1ufHwidG9wIj09PW4/KHQ9cm8sTT0ieCIsaz0ieSIsQT0ieDIiLFQ9InkyIixMLmF0dHIoImR5IixJPDA/IjBlbSI6Ii43MWVtIikuc3R5bGUoInRleHQtYW5jaG9yIiwibWlkZGxlIiksdy5hdHRyKCJkIiwiTSIreFswXSsiLCIrSSphKyJWMEgiK3hbMV0rIlYiK0kqYSkpOih0PW5vLE09InkiLGs9IngiLEE9InkyIixUPSJ4MiIsTC5hdHRyKCJkeSIsIi4zMmVtIikuc3R5bGUoInRleHQtYW5jaG9yIixJPDA/ImVuZCI6InN0YXJ0Iiksdy5hdHRyKCJkIiwiTSIrSSphKyIsIit4WzBdKyJIMFYiK3hbMV0rIkgiK0kqYSkpLEUuYXR0cihULEkqaSksei5hdHRyKGssSSp5KSxTLmF0dHIoQSwwKS5hdHRyKFQsSSppKSxDLmF0dHIoTSwwKS5hdHRyKGssSSp5KSxoLnJhbmdlQmFuZCl7dmFyIFA9aCxEPVAucmFuZ2VCYW5kKCkvMjtjPWg9ZnVuY3Rpb24odCl7cmV0dXJuIFAodCkrRH19ZWxzZSBjLnJhbmdlQmFuZD9jPWg6bS5jYWxsKHQsaCxjKTtnLmNhbGwodCxjLGgpLHYuY2FsbCh0LGgsaCl9KX12YXIgZSxyPXVvLnNjYWxlLmxpbmVhcigpLG49R2wsaT02LGE9NixvPTMscz1bMTBdLGw9bnVsbDtyZXR1cm4gdC5zY2FsZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1lLHQpOnJ9LHQub3JpZW50PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWUgaW4gWGw/ZSsiIjpHbCx0KTpufSx0LnRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9aG8oYXJndW1lbnRzKSx0KTpzfSx0LnRpY2tWYWx1ZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ZSx0KTpsfSx0LnRpY2tGb3JtYXQ9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9cix0KTplfSx0LnRpY2tTaXplPWZ1bmN0aW9uKGUpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIHI/KGk9K2UsYT0rYXJndW1lbnRzW3ItMV0sdCk6aX0sdC5pbm5lclRpY2tTaXplPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPStlLHQpOml9LHQub3V0ZXJUaWNrU2l6ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0rZSx0KTphfSx0LnRpY2tQYWRkaW5nPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPStlLHQpOm99LHQudGlja1N1YmRpdmlkZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoJiZ0fSx0fTt2YXIgR2w9ImJvdHRvbSIsWGw9e3RvcDoxLHJpZ2h0OjEsYm90dG9tOjEsbGVmdDoxfTt1by5zdmcuYnJ1c2g9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KG4pe24uZWFjaChmdW5jdGlvbigpe3ZhciBuPXVvLnNlbGVjdCh0aGlzKS5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpLm9uKCJtb3VzZWRvd24uYnJ1c2giLGEpLm9uKCJ0b3VjaHN0YXJ0LmJydXNoIixhKSxvPW4uc2VsZWN0QWxsKCIuYmFja2dyb3VuZCIpLmRhdGEoWzBdKTtvLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJiYWNrZ3JvdW5kIikuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKS5zdHlsZSgiY3Vyc29yIiwiY3Jvc3NoYWlyIiksbi5zZWxlY3RBbGwoIi5leHRlbnQiKS5kYXRhKFswXSkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsImV4dGVudCIpLnN0eWxlKCJjdXJzb3IiLCJtb3ZlIik7dmFyIHM9bi5zZWxlY3RBbGwoIi5yZXNpemUiKS5kYXRhKGcsYik7cy5leGl0KCkucmVtb3ZlKCkscy5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIixmdW5jdGlvbih0KXtyZXR1cm4icmVzaXplICIrdH0pLnN0eWxlKCJjdXJzb3IiLGZ1bmN0aW9uKHQpe3JldHVybiBZbFt0XX0pLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLGZ1bmN0aW9uKHQpe3JldHVybi9bZXddJC8udGVzdCh0KT8tMzpudWxsfSkuYXR0cigieSIsZnVuY3Rpb24odCl7cmV0dXJuL15bbnNdLy50ZXN0KHQpPy0zOm51bGx9KS5hdHRyKCJ3aWR0aCIsNikuYXR0cigiaGVpZ2h0Iiw2KS5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpLHMuc3R5bGUoImRpc3BsYXkiLHQuZW1wdHkoKT8ibm9uZSI6bnVsbCk7dmFyIGwsaD11by50cmFuc2l0aW9uKG4pLGY9dW8udHJhbnNpdGlvbihvKTt1JiYobD1YaSh1KSxmLmF0dHIoIngiLGxbMF0pLmF0dHIoIndpZHRoIixsWzFdLWxbMF0pLHIoaCkpLGMmJihsPVhpKGMpLGYuYXR0cigieSIsbFswXSkuYXR0cigiaGVpZ2h0IixsWzFdLWxbMF0pLGkoaCkpLGUoaCl9KX1mdW5jdGlvbiBlKHQpe3Quc2VsZWN0QWxsKCIucmVzaXplIikuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbih0KXsKcmV0dXJuInRyYW5zbGF0ZSgiK2hbKy9lJC8udGVzdCh0KV0rIiwiK2ZbKy9ecy8udGVzdCh0KV0rIikifSl9ZnVuY3Rpb24gcih0KXt0LnNlbGVjdCgiLmV4dGVudCIpLmF0dHIoIngiLGhbMF0pLHQuc2VsZWN0QWxsKCIuZXh0ZW50LC5uPnJlY3QsLnM+cmVjdCIpLmF0dHIoIndpZHRoIixoWzFdLWhbMF0pfWZ1bmN0aW9uIGkodCl7dC5zZWxlY3QoIi5leHRlbnQiKS5hdHRyKCJ5IixmWzBdKSx0LnNlbGVjdEFsbCgiLmV4dGVudCwuZT5yZWN0LC53PnJlY3QiKS5hdHRyKCJoZWlnaHQiLGZbMV0tZlswXSl9ZnVuY3Rpb24gYSgpe2Z1bmN0aW9uIGEoKXszMj09dW8uZXZlbnQua2V5Q29kZSYmKEx8fCh4PW51bGwsQ1swXS09aFsxXSxDWzFdLT1mWzFdLEw9MiksVCgpKX1mdW5jdGlvbiBnKCl7MzI9PXVvLmV2ZW50LmtleUNvZGUmJjI9PUwmJihDWzBdKz1oWzFdLENbMV0rPWZbMV0sTD0wLFQoKSl9ZnVuY3Rpb24gbSgpe3ZhciB0PXVvLm1vdXNlKF8pLG49ITE7YiYmKHRbMF0rPWJbMF0sdFsxXSs9YlsxXSksTHx8KHVvLmV2ZW50LmFsdEtleT8oeHx8KHg9WyhoWzBdK2hbMV0pLzIsKGZbMF0rZlsxXSkvMl0pLENbMF09aFsrKHRbMF08eFswXSldLENbMV09ZlsrKHRbMV08eFsxXSldKTp4PW51bGwpLEUmJnYodCx1LDApJiYocihBKSxuPSEwKSxTJiZ2KHQsYywxKSYmKGkoQSksbj0hMCksbiYmKGUoQSksTSh7dHlwZToiYnJ1c2giLG1vZGU6TD8ibW92ZSI6InJlc2l6ZSJ9KSl9ZnVuY3Rpb24gdih0LGUscil7dmFyIG4saSxhPVhpKGUpLGw9YVswXSx1PWFbMV0sYz1DW3JdLGc9cj9mOmgsbT1nWzFdLWdbMF07aWYoTCYmKGwtPWMsdS09bStjKSxuPShyP3A6ZCk/TWF0aC5tYXgobCxNYXRoLm1pbih1LHRbcl0pKTp0W3JdLEw/aT0obis9YykrbTooeCYmKGM9TWF0aC5tYXgobCxNYXRoLm1pbih1LDIqeFtyXS1uKSkpLGM8bj8oaT1uLG49Yyk6aT1jKSxnWzBdIT1ufHxnWzFdIT1pKXJldHVybiByP3M9bnVsbDpvPW51bGwsZ1swXT1uLGdbMV09aSwhMH1mdW5jdGlvbiB5KCl7bSgpLEEuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuc2VsZWN0QWxsKCIucmVzaXplIikuc3R5bGUoImRpc3BsYXkiLHQuZW1wdHkoKT8ibm9uZSI6bnVsbCksdW8uc2VsZWN0KCJib2R5Iikuc3R5bGUoImN1cnNvciIsbnVsbCksSS5vbigibW91c2Vtb3ZlLmJydXNoIixudWxsKS5vbigibW91c2V1cC5icnVzaCIsbnVsbCkub24oInRvdWNobW92ZS5icnVzaCIsbnVsbCkub24oInRvdWNoZW5kLmJydXNoIixudWxsKS5vbigia2V5ZG93bi5icnVzaCIsbnVsbCkub24oImtleXVwLmJydXNoIixudWxsKSx6KCksTSh7dHlwZToiYnJ1c2hlbmQifSl9dmFyIHgsYixfPXRoaXMsdz11by5zZWxlY3QodW8uZXZlbnQudGFyZ2V0KSxNPWwub2YoXyxhcmd1bWVudHMpLEE9dW8uc2VsZWN0KF8pLGs9dy5kYXR1bSgpLEU9IS9eKG58cykkLy50ZXN0KGspJiZ1LFM9IS9eKGV8dykkLy50ZXN0KGspJiZjLEw9dy5jbGFzc2VkKCJleHRlbnQiKSx6PUsoXyksQz11by5tb3VzZShfKSxJPXVvLnNlbGVjdChuKF8pKS5vbigia2V5ZG93bi5icnVzaCIsYSkub24oImtleXVwLmJydXNoIixnKTtpZih1by5ldmVudC5jaGFuZ2VkVG91Y2hlcz9JLm9uKCJ0b3VjaG1vdmUuYnJ1c2giLG0pLm9uKCJ0b3VjaGVuZC5icnVzaCIseSk6SS5vbigibW91c2Vtb3ZlLmJydXNoIixtKS5vbigibW91c2V1cC5icnVzaCIseSksQS5pbnRlcnJ1cHQoKS5zZWxlY3RBbGwoIioiKS5pbnRlcnJ1cHQoKSxMKUNbMF09aFswXS1DWzBdLENbMV09ZlswXS1DWzFdO2Vsc2UgaWYoayl7dmFyIFA9Ky93JC8udGVzdChrKSxEPSsvXm4vLnRlc3Qoayk7Yj1baFsxLVBdLUNbMF0sZlsxLURdLUNbMV1dLENbMF09aFtQXSxDWzFdPWZbRF19ZWxzZSB1by5ldmVudC5hbHRLZXkmJih4PUMuc2xpY2UoKSk7QS5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJub25lIikuc2VsZWN0QWxsKCIucmVzaXplIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLHVvLnNlbGVjdCgiYm9keSIpLnN0eWxlKCJjdXJzb3IiLHcuc3R5bGUoImN1cnNvciIpKSxNKHt0eXBlOiJicnVzaHN0YXJ0In0pLG0oKX12YXIgbyxzLGw9Uyh0LCJicnVzaHN0YXJ0IiwiYnJ1c2giLCJicnVzaGVuZCIpLHU9bnVsbCxjPW51bGwsaD1bMCwwXSxmPVswLDBdLGQ9ITAscD0hMCxnPVdsWzBdO3JldHVybiB0LmV2ZW50PWZ1bmN0aW9uKHQpe3QuZWFjaChmdW5jdGlvbigpe3ZhciB0PWwub2YodGhpcyxhcmd1bWVudHMpLGU9e3g6aCx5OmYsaTpvLGo6c30scj10aGlzLl9fY2hhcnRfX3x8ZTt0aGlzLl9fY2hhcnRfXz1lLEJsP3VvLnNlbGVjdCh0aGlzKS50cmFuc2l0aW9uKCkuZWFjaCgic3RhcnQuYnJ1c2giLGZ1bmN0aW9uKCl7bz1yLmkscz1yLmosaD1yLngsZj1yLnksdCh7dHlwZToiYnJ1c2hzdGFydCJ9KX0pLnR3ZWVuKCJicnVzaDpicnVzaCIsZnVuY3Rpb24oKXt2YXIgcj13bihoLGUueCksbj13bihmLGUueSk7cmV0dXJuIG89cz1udWxsLGZ1bmN0aW9uKGkpe2g9ZS54PXIoaSksZj1lLnk9bihpKSx0KHt0eXBlOiJicnVzaCIsbW9kZToicmVzaXplIn0pfX0pLmVhY2goImVuZC5icnVzaCIsZnVuY3Rpb24oKXtvPWUuaSxzPWUuaix0KHt0eXBlOiJicnVzaCIsbW9kZToicmVzaXplIn0pLHQoe3R5cGU6ImJydXNoZW5kIn0pfSk6KHQoe3R5cGU6ImJydXNoc3RhcnQifSksdCh7dHlwZToiYnJ1c2giLG1vZGU6InJlc2l6ZSJ9KSx0KHt0eXBlOiJicnVzaGVuZCJ9KSl9KX0sdC54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWUsZz1XbFshdTw8MXwhY10sdCk6dX0sdC55PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPWUsZz1XbFshdTw8MXwhY10sdCk6Y30sdC5jbGFtcD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odSYmYz8oZD0hIWVbMF0scD0hIWVbMV0pOnU/ZD0hIWU6YyYmKHA9ISFlKSx0KTp1JiZjP1tkLHBdOnU/ZDpjP3A6bnVsbH0sdC5leHRlbnQ9ZnVuY3Rpb24oZSl7dmFyIHIsbixpLGEsbDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odSYmKHI9ZVswXSxuPWVbMV0sYyYmKHI9clswXSxuPW5bMF0pLG89W3Isbl0sdS5pbnZlcnQmJihyPXUociksbj11KG4pKSxuPHImJihsPXIscj1uLG49bCkscj09aFswXSYmbj09aFsxXXx8KGg9W3Isbl0pKSxjJiYoaT1lWzBdLGE9ZVsxXSx1JiYoaT1pWzFdLGE9YVsxXSkscz1baSxhXSxjLmludmVydCYmKGk9YyhpKSxhPWMoYSkpLGE8aSYmKGw9aSxpPWEsYT1sKSxpPT1mWzBdJiZhPT1mWzFdfHwoZj1baSxhXSkpLHQpOih1JiYobz8ocj1vWzBdLG49b1sxXSk6KHI9aFswXSxuPWhbMV0sdS5pbnZlcnQmJihyPXUuaW52ZXJ0KHIpLG49dS5pbnZlcnQobikpLG48ciYmKGw9cixyPW4sbj1sKSkpLGMmJihzPyhpPXNbMF0sYT1zWzFdKTooaT1mWzBdLGE9ZlsxXSxjLmludmVydCYmKGk9Yy5pbnZlcnQoaSksYT1jLmludmVydChhKSksYTxpJiYobD1pLGk9YSxhPWwpKSksdSYmYz9bW3IsaV0sW24sYV1dOnU/W3Isbl06YyYmW2ksYV0pfSx0LmNsZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIHQuZW1wdHkoKXx8KGg9WzAsMF0sZj1bMCwwXSxvPXM9bnVsbCksdH0sdC5lbXB0eT1mdW5jdGlvbigpe3JldHVybiEhdSYmaFswXT09aFsxXXx8ISFjJiZmWzBdPT1mWzFdfSx1by5yZWJpbmQodCxsLCJvbiIpfTt2YXIgWWw9e246Im5zLXJlc2l6ZSIsZToiZXctcmVzaXplIixzOiJucy1yZXNpemUiLHc6ImV3LXJlc2l6ZSIsbnc6Im53c2UtcmVzaXplIixuZToibmVzdy1yZXNpemUiLHNlOiJud3NlLXJlc2l6ZSIsc3c6Im5lc3ctcmVzaXplIn0sV2w9W1sibiIsImUiLCJzIiwidyIsIm53IiwibmUiLCJzZSIsInN3Il0sWyJlIiwidyJdLFsibiIsInMiXSxbXV0sWmw9cHMuZm9ybWF0PWJzLnRpbWVGb3JtYXQsUWw9WmwudXRjLEtsPVFsKCIlWS0lbS0lZFQlSDolTTolUy4lTFoiKTtabC5pc289RGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcmJituZXcgRGF0ZSgiMjAwMC0wMS0wMVQwMDowMDowMC4wMDBaIik/aW86S2wsaW8ucGFyc2U9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IERhdGUodCk7cmV0dXJuIGlzTmFOKGUpP251bGw6ZX0saW8udG9TdHJpbmc9S2wudG9TdHJpbmcscHMuc2Vjb25kPVZ0KGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZ3MoMWUzKk1hdGguZmxvb3IodC8xZTMpKX0sZnVuY3Rpb24odCxlKXt0LnNldFRpbWUodC5nZXRUaW1lKCkrMWUzKk1hdGguZmxvb3IoZSkpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRTZWNvbmRzKCl9KSxwcy5zZWNvbmRzPXBzLnNlY29uZC5yYW5nZSxwcy5zZWNvbmRzLnV0Yz1wcy5zZWNvbmQudXRjLnJhbmdlLHBzLm1pbnV0ZT1WdChmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGdzKDZlNCpNYXRoLmZsb29yKHQvNmU0KSl9LGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKHQuZ2V0VGltZSgpKzZlNCpNYXRoLmZsb29yKGUpKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TWludXRlcygpfSkscHMubWludXRlcz1wcy5taW51dGUucmFuZ2UscHMubWludXRlcy51dGM9cHMubWludXRlLnV0Yy5yYW5nZSxwcy5ob3VyPVZ0KGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0VGltZXpvbmVPZmZzZXQoKS82MDtyZXR1cm4gbmV3IGdzKDM2ZTUqKE1hdGguZmxvb3IodC8zNmU1LWUpK2UpKX0sZnVuY3Rpb24odCxlKXt0LnNldFRpbWUodC5nZXRUaW1lKCkrMzZlNSpNYXRoLmZsb29yKGUpKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0SG91cnMoKX0pLHBzLmhvdXJzPXBzLmhvdXIucmFuZ2UscHMuaG91cnMudXRjPXBzLmhvdXIudXRjLnJhbmdlLHBzLm1vbnRoPVZ0KGZ1bmN0aW9uKHQpe3JldHVybiB0PXBzLmRheSh0KSx0LnNldERhdGUoMSksdH0sZnVuY3Rpb24odCxlKXt0LnNldE1vbnRoKHQuZ2V0TW9udGgoKStlKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TW9udGgoKX0pLHBzLm1vbnRocz1wcy5tb250aC5yYW5nZSxwcy5tb250aHMudXRjPXBzLm1vbnRoLnV0Yy5yYW5nZTt2YXIgJGw9WzFlMyw1ZTMsMTVlMywzZTQsNmU0LDNlNSw5ZTUsMThlNSwzNmU1LDEwOGU1LDIxNmU1LDQzMmU1LDg2NGU1LDE3MjhlNSw2MDQ4ZTUsMjU5MmU2LDc3NzZlNiwzMTUzNmU2XSxKbD1bW3BzLnNlY29uZCwxXSxbcHMuc2Vjb25kLDVdLFtwcy5zZWNvbmQsMTVdLFtwcy5zZWNvbmQsMzBdLFtwcy5taW51dGUsMV0sW3BzLm1pbnV0ZSw1XSxbcHMubWludXRlLDE1XSxbcHMubWludXRlLDMwXSxbcHMuaG91ciwxXSxbcHMuaG91ciwzXSxbcHMuaG91ciw2XSxbcHMuaG91ciwxMl0sW3BzLmRheSwxXSxbcHMuZGF5LDJdLFtwcy53ZWVrLDFdLFtwcy5tb250aCwxXSxbcHMubW9udGgsM10sW3BzLnllYXIsMV1dLHR1PVpsLm11bHRpKFtbIi4lTCIsZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TWlsbGlzZWNvbmRzKCl9XSxbIjolUyIsZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0U2Vjb25kcygpfV0sWyIlSTolTSIsZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TWludXRlcygpfV0sWyIlSSAlcCIsZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0SG91cnMoKX1dLFsiJWEgJWQiLGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldERheSgpJiYxIT10LmdldERhdGUoKX1dLFsiJWIgJWQiLGZ1bmN0aW9uKHQpe3JldHVybiAxIT10LmdldERhdGUoKX1dLFsiJUIiLGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldE1vbnRoKCl9XSxbIiVZIixDZV1dKSxldT17cmFuZ2U6ZnVuY3Rpb24odCxlLHIpe3JldHVybiB1by5yYW5nZShNYXRoLmNlaWwodC9yKSpyLCtlLHIpLm1hcChvbyl9LGZsb29yOmIsY2VpbDpifTtKbC55ZWFyPXBzLnllYXIscHMuc2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gYW8odW8uc2NhbGUubGluZWFyKCksSmwsdHUpfTt2YXIgcnU9SmwubWFwKGZ1bmN0aW9uKHQpe3JldHVyblt0WzBdLnV0Yyx0WzFdXX0pLG51PVFsLm11bHRpKFtbIi4lTCIsZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDTWlsbGlzZWNvbmRzKCl9XSxbIjolUyIsZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDU2Vjb25kcygpfV0sWyIlSTolTSIsZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDTWludXRlcygpfV0sWyIlSSAlcCIsZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDSG91cnMoKX1dLFsiJWEgJWQiLGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0RheSgpJiYxIT10LmdldFVUQ0RhdGUoKX1dLFsiJWIgJWQiLGZ1bmN0aW9uKHQpe3JldHVybiAxIT10LmdldFVUQ0RhdGUoKX1dLFsiJUIiLGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01vbnRoKCl9XSxbIiVZIixDZV1dKTtydS55ZWFyPXBzLnllYXIudXRjLHBzLnNjYWxlLnV0Yz1mdW5jdGlvbigpe3JldHVybiBhbyh1by5zY2FsZS5saW5lYXIoKSxydSxudSl9LHVvLnRleHQ9THQoZnVuY3Rpb24odCl7cmV0dXJuIHQucmVzcG9uc2VUZXh0fSksdW8uanNvbj1mdW5jdGlvbih0LGUpe3JldHVybiB6dCh0LCJhcHBsaWNhdGlvbi9qc29uIixzbyxlKX0sdW8uaHRtbD1mdW5jdGlvbih0LGUpe3JldHVybiB6dCh0LCJ0ZXh0L2h0bWwiLGxvLGUpfSx1by54bWw9THQoZnVuY3Rpb24odCl7cmV0dXJuIHQucmVzcG9uc2VYTUx9KSwiZnVuY3Rpb24iPT10eXBlb2YgdCYmdC5hbWQ/KHRoaXMuZDM9dW8sdCh1bykpOiJvYmplY3QiPT10eXBlb2YgciYmci5leHBvcnRzP3IuZXhwb3J0cz11bzp0aGlzLmQzPXVvfSgpfSx7fV0sOTY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3RoaXMucG9pbnQ9dCx0aGlzLmluZGV4PWV9ZnVuY3Rpb24gaSh0LGUpe2Zvcih2YXIgcj10LnBvaW50LG49ZS5wb2ludCxpPXIubGVuZ3RoLGE9MDthPGk7KythKXt2YXIgbz1uW2FdLXJbYV07aWYobylyZXR1cm4gb31yZXR1cm4gMH1mdW5jdGlvbiBhKHQsZSxyKXtpZigxPT09dClyZXR1cm4gcj9bWy0xLDBdXTpbXTt2YXIgbj1lLm1hcChmdW5jdGlvbih0LGUpe3JldHVyblt0WzBdLGVdfSk7bi5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF0tZVswXX0pO2Zvcih2YXIgaT1uZXcgQXJyYXkodC0xKSxhPTE7YTx0OysrYSl7dmFyIG89blthLTFdLHM9blthXTtpW2EtMV09W29bMV0sc1sxXV19cmV0dXJuIHImJmkucHVzaChbLTEsaVswXVsxXV0sW2lbdC0xXVsxXSwtMV0pLGl9ZnVuY3Rpb24gbyh0LGUpe3ZhciByPXQubGVuZ3RoO2lmKDA9PT1yKXJldHVybltdO3ZhciBvPXRbMF0ubGVuZ3RoO2lmKG88MSlyZXR1cm5bXTtpZigxPT09bylyZXR1cm4gYShyLHQsZSk7Zm9yKHZhciB1PW5ldyBBcnJheShyKSxjPTEsaD0wO2g8cjsrK2gpe2Zvcih2YXIgZj10W2hdLGQ9bmV3IEFycmF5KG8rMSkscD0wLGc9MDtnPG87KytnKXt2YXIgbT1mW2ddO2RbZ109bSxwKz1tKm19ZFtvXT1wLHVbaF09bmV3IG4oZCxoKSxjPU1hdGgubWF4KHAsYyl9bCh1LGkpLHI9dS5sZW5ndGg7Zm9yKHZhciB2PW5ldyBBcnJheShyK28rMSkseT1uZXcgQXJyYXkocitvKzEpLHg9KG8rMSkqKG8rMSkqYyxiPW5ldyBBcnJheShvKzEpLGg9MDtoPD1vOysraCliW2hdPTA7YltvXT14LHZbMF09Yi5zbGljZSgpLHlbMF09LTE7Zm9yKHZhciBoPTA7aDw9bzsrK2gpe3ZhciBkPWIuc2xpY2UoKTtkW2hdPTEsdltoKzFdPWQseVtoKzFdPS0xfWZvcih2YXIgaD0wO2g8cjsrK2gpe3ZhciBfPXVbaF07dltoK28rMV09Xy5wb2ludCx5W2grbysxXT1fLmluZGV4fXZhciB3PXModiwhMSk7aWYodz1lP3cuZmlsdGVyKGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLHI9MDtyPD1vOysrcil7dmFyIG49eVt0W3JdXTtpZihuPDAmJisrZT49MilyZXR1cm4hMTt0W3JdPW59cmV0dXJuITB9KTp3LmZpbHRlcihmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPD1vOysrZSl7dmFyIHI9eVt0W2VdXTtpZihyPDApcmV0dXJuITE7dFtlXT1yfXJldHVybiEwfSksMSZvKWZvcih2YXIgaD0wO2g8dy5sZW5ndGg7KytoKXt2YXIgXz13W2hdLGQ9X1swXTtfWzBdPV9bMV0sX1sxXT1kfXJldHVybiB3fXZhciBzPXQoImluY3JlbWVudGFsLWNvbnZleC1odWxsIiksbD10KCJ1bmlxIik7ZS5leHBvcnRzPW99LHsiaW5jcmVtZW50YWwtY29udmV4LWh1bGwiOjI1NCx1bmlxOjQ5OH1dLDk3OltmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIHIodCxlKXtyZXR1cm4gZFswXT10LGRbMV09ZSxmWzBdfWZ1bmN0aW9uIG4odCl7cmV0dXJuIGZbMF09dCxkWzBdfWZ1bmN0aW9uIGkodCl7cmV0dXJuIGZbMF09dCxkWzFdfWZ1bmN0aW9uIGEodCxlKXtyZXR1cm4gZFsxXT10LGRbMF09ZSxmWzBdfWZ1bmN0aW9uIG8odCl7cmV0dXJuIGZbMF09dCxkWzFdfWZ1bmN0aW9uIHModCl7cmV0dXJuIGZbMF09dCxkWzBdfWZ1bmN0aW9uIGwodCxlKXtyZXR1cm4gcC53cml0ZVVJbnQzMkxFKHQsMCwhMCkscC53cml0ZVVJbnQzMkxFKGUsNCwhMCkscC5yZWFkRG91YmxlTEUoMCwhMCl9ZnVuY3Rpb24gdSh0KXtyZXR1cm4gcC53cml0ZURvdWJsZUxFKHQsMCwhMCkscC5yZWFkVUludDMyTEUoMCwhMCl9ZnVuY3Rpb24gYyh0KXtyZXR1cm4gcC53cml0ZURvdWJsZUxFKHQsMCwhMCkscC5yZWFkVUludDMyTEUoNCwhMCl9dmFyIGg9ITE7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBGbG9hdDY0QXJyYXkpe3ZhciBmPW5ldyBGbG9hdDY0QXJyYXkoMSksZD1uZXcgVWludDMyQXJyYXkoZi5idWZmZXIpO2ZbMF09MSxoPSEwLDEwNzI2OTMyNDg9PT1kWzFdPyhlLmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZbMF09dCxbZFswXSxkWzFdXX0sZS5leHBvcnRzLnBhY2s9cixlLmV4cG9ydHMubG89bixlLmV4cG9ydHMuaGk9aSk6MTA3MjY5MzI0OD09PWRbMF0/KGUuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gZlswXT10LFtkWzFdLGRbMF1dfSxlLmV4cG9ydHMucGFjaz1hLGUuZXhwb3J0cy5sbz1vLGUuZXhwb3J0cy5oaT1zKTpoPSExfWlmKCFoKXt2YXIgcD1uZXcgdCg4KTtlLmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHAud3JpdGVEb3VibGVMRSh0LDAsITApLFtwLnJlYWRVSW50MzJMRSgwLCEwKSxwLnJlYWRVSW50MzJMRSg0LCEwKV19LGUuZXhwb3J0cy5wYWNrPWwsZS5leHBvcnRzLmxvPXUsZS5leHBvcnRzLmhpPWN9ZS5leHBvcnRzLnNpZ249ZnVuY3Rpb24odCl7cmV0dXJuIGUuZXhwb3J0cy5oaSh0KT4+PjMxfSxlLmV4cG9ydHMuZXhwb25lbnQ9ZnVuY3Rpb24odCl7dmFyIHI9ZS5leHBvcnRzLmhpKHQpO3JldHVybihyPDwxPj4+MjEpLTEwMjN9LGUuZXhwb3J0cy5mcmFjdGlvbj1mdW5jdGlvbih0KXt2YXIgcj1lLmV4cG9ydHMubG8odCksbj1lLmV4cG9ydHMuaGkodCksaT0xMDQ4NTc1Jm47cmV0dXJuIDIxNDY0MzUwNzImbiYmKGkrPTE8PDIwKSxbcixpXX0sZS5leHBvcnRzLmRlbm9ybWFsaXplZD1mdW5jdGlvbih0KXt2YXIgcj1lLmV4cG9ydHMuaGkodCk7cmV0dXJuISgyMTQ2NDM1MDcyJnIpfX0pLmNhbGwodGhpcyx0KCJidWZmZXIiKS5CdWZmZXIpfSx7YnVmZmVyOjY0fV0sOTg6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscil7dmFyIGk9MHx0W3JdO2lmKGk8PTApcmV0dXJuW107dmFyIGEsbz1uZXcgQXJyYXkoaSk7aWYocj09PXQubGVuZ3RoLTEpZm9yKGE9MDthPGk7KythKW9bYV09ZTtlbHNlIGZvcihhPTA7YTxpOysrYSlvW2FdPW4odCxlLHIrMSk7cmV0dXJuIG99ZnVuY3Rpb24gaSh0LGUpe3ZhciByLG47Zm9yKHI9bmV3IEFycmF5KHQpLG49MDtuPHQ7KytuKXJbbl09ZTtyZXR1cm4gcn1mdW5jdGlvbiBhKHQsZSl7c3dpdGNoKCJ1bmRlZmluZWQiPT10eXBlb2YgZSYmKGU9MCksdHlwZW9mIHQpe2Nhc2UibnVtYmVyIjppZih0PjApcmV0dXJuIGkoMHx0LGUpO2JyZWFrO2Nhc2Uib2JqZWN0IjppZigibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoKXJldHVybiBuKHQsZSwwKX1yZXR1cm5bXX1lLmV4cG9ydHM9YX0se31dLDk5OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIpe3I9cnx8Mjt2YXIgbj1lJiZlLmxlbmd0aCxhPW4/ZVswXSpyOnQubGVuZ3RoLHM9aSh0LDAsYSxyLCEwKSxsPVtdO2lmKCFzKXJldHVybiBsO3ZhciB1LGMsZixkLHAsZyxtO2lmKG4mJihzPWgodCxlLHMscikpLHQubGVuZ3RoPjgwKnIpe3U9Zj10WzBdLGM9ZD10WzFdO2Zvcih2YXIgdj1yO3Y8YTt2Kz1yKXA9dFt2XSxnPXRbdisxXSxwPHUmJih1PXApLGc8YyYmKGM9ZykscD5mJiYoZj1wKSxnPmQmJihkPWcpO209TWF0aC5tYXgoZi11LGQtYyl9cmV0dXJuIG8ocyxsLHIsdSxjLG0pLGx9ZnVuY3Rpb24gaSh0LGUscixuLGkpe3ZhciBhLG87aWYoaT09PUModCxlLHIsbik+MClmb3IoYT1lO2E8cjthKz1uKW89UyhhLHRbYV0sdFthKzFdLG8pO2Vsc2UgZm9yKGE9ci1uO2E+PWU7YS09bilvPVMoYSx0W2FdLHRbYSsxXSxvKTtyZXR1cm4gbyYmdyhvLG8ubmV4dCkmJihMKG8pLG89by5uZXh0KSxvfWZ1bmN0aW9uIGEodCxlKXtpZighdClyZXR1cm4gdDtlfHwoZT10KTt2YXIgcixuPXQ7ZG8gaWYocj0hMSxuLnN0ZWluZXJ8fCF3KG4sbi5uZXh0KSYmMCE9PV8obi5wcmV2LG4sbi5uZXh0KSluPW4ubmV4dDtlbHNle2lmKEwobiksbj1lPW4ucHJldixuPT09bi5uZXh0KXJldHVybiBudWxsO3I9ITB9d2hpbGUocnx8biE9PWUpO3JldHVybiBlfWZ1bmN0aW9uIG8odCxlLHIsbixpLGgsZil7aWYodCl7IWYmJmgmJmcodCxuLGksaCk7Zm9yKHZhciBkLHAsbT10O3QucHJldiE9PXQubmV4dDspaWYoZD10LnByZXYscD10Lm5leHQsaD9sKHQsbixpLGgpOnModCkpZS5wdXNoKGQuaS9yKSxlLnB1c2godC5pL3IpLGUucHVzaChwLmkvciksTCh0KSx0PXAubmV4dCxtPXAubmV4dDtlbHNlIGlmKHQ9cCx0PT09bSl7Zj8xPT09Zj8odD11KHQsZSxyKSxvKHQsZSxyLG4saSxoLDIpKToyPT09ZiYmYyh0LGUscixuLGksaCk6byhhKHQpLGUscixuLGksaCwxKTticmVha319fWZ1bmN0aW9uIHModCl7dmFyIGU9dC5wcmV2LHI9dCxuPXQubmV4dDtpZihfKGUscixuKT49MClyZXR1cm4hMTtmb3IodmFyIGk9dC5uZXh0Lm5leHQ7aSE9PXQucHJldjspe2lmKHgoZS54LGUueSxyLngsci55LG4ueCxuLnksaS54LGkueSkmJl8oaS5wcmV2LGksaS5uZXh0KT49MClyZXR1cm4hMTtpPWkubmV4dH1yZXR1cm4hMH1mdW5jdGlvbiBsKHQsZSxyLG4pe3ZhciBpPXQucHJldixhPXQsbz10Lm5leHQ7aWYoXyhpLGEsbyk+PTApcmV0dXJuITE7Zm9yKHZhciBzPWkueDxhLng/aS54PG8ueD9pLng6by54OmEueDxvLng/YS54Om8ueCxsPWkueTxhLnk/aS55PG8ueT9pLnk6by55OmEueTxvLnk/YS55Om8ueSx1PWkueD5hLng/aS54Pm8ueD9pLng6by54OmEueD5vLng/YS54Om8ueCxjPWkueT5hLnk/aS55Pm8ueT9pLnk6by55OmEueT5vLnk/YS55Om8ueSxoPXYocyxsLGUscixuKSxmPXYodSxjLGUscixuKSxkPXQubmV4dFo7ZCYmZC56PD1mOyl7aWYoZCE9PXQucHJldiYmZCE9PXQubmV4dCYmeChpLngsaS55LGEueCxhLnksby54LG8ueSxkLngsZC55KSYmXyhkLnByZXYsZCxkLm5leHQpPj0wKXJldHVybiExO2Q9ZC5uZXh0Wn1mb3IoZD10LnByZXZaO2QmJmQuej49aDspe2lmKGQhPT10LnByZXYmJmQhPT10Lm5leHQmJngoaS54LGkueSxhLngsYS55LG8ueCxvLnksZC54LGQueSkmJl8oZC5wcmV2LGQsZC5uZXh0KT49MClyZXR1cm4hMTtkPWQucHJldlp9cmV0dXJuITB9ZnVuY3Rpb24gdSh0LGUscil7dmFyIG49dDtkb3t2YXIgaT1uLnByZXYsYT1uLm5leHQubmV4dDshdyhpLGEpJiZNKGksbixuLm5leHQsYSkmJmsoaSxhKSYmayhhLGkpJiYoZS5wdXNoKGkuaS9yKSxlLnB1c2gobi5pL3IpLGUucHVzaChhLmkvciksTChuKSxMKG4ubmV4dCksbj10PWEpLG49bi5uZXh0fXdoaWxlKG4hPT10KTtyZXR1cm4gbn1mdW5jdGlvbiBjKHQsZSxyLG4saSxzKXt2YXIgbD10O2Rve2Zvcih2YXIgdT1sLm5leHQubmV4dDt1IT09bC5wcmV2Oyl7aWYobC5pIT09dS5pJiZiKGwsdSkpe3ZhciBjPUUobCx1KTtyZXR1cm4gbD1hKGwsbC5uZXh0KSxjPWEoYyxjLm5leHQpLG8obCxlLHIsbixpLHMpLHZvaWQgbyhjLGUscixuLGkscyl9dT11Lm5leHR9bD1sLm5leHR9d2hpbGUobCE9PXQpfWZ1bmN0aW9uIGgodCxlLHIsbil7dmFyIG8scyxsLHUsYyxoPVtdO2ZvcihvPTAscz1lLmxlbmd0aDtvPHM7bysrKWw9ZVtvXSpuLHU9bzxzLTE/ZVtvKzFdKm46dC5sZW5ndGgsYz1pKHQsbCx1LG4sITEpLGM9PT1jLm5leHQmJihjLnN0ZWluZXI9ITApLGgucHVzaCh5KGMpKTtmb3IoaC5zb3J0KGYpLG89MDtvPGgubGVuZ3RoO28rKylkKGhbb10scikscj1hKHIsci5uZXh0KTtyZXR1cm4gcn1mdW5jdGlvbiBmKHQsZSl7cmV0dXJuIHQueC1lLnh9ZnVuY3Rpb24gZCh0LGUpe2lmKGU9cCh0LGUpKXt2YXIgcj1FKGUsdCk7YShyLHIubmV4dCl9fWZ1bmN0aW9uIHAodCxlKXt2YXIgcixuPWUsaT10LngsYT10Lnksbz0tKDEvMCk7ZG97aWYoYTw9bi55JiZhPj1uLm5leHQueSl7dmFyIHM9bi54KyhhLW4ueSkqKG4ubmV4dC54LW4ueCkvKG4ubmV4dC55LW4ueSk7aWYoczw9aSYmcz5vKXtpZihvPXMscz09PWkpe2lmKGE9PT1uLnkpcmV0dXJuIG47aWYoYT09PW4ubmV4dC55KXJldHVybiBuLm5leHR9cj1uLng8bi5uZXh0Lng/bjpuLm5leHR9fW49bi5uZXh0fXdoaWxlKG4hPT1lKTtpZighcilyZXR1cm4gbnVsbDtpZihpPT09bylyZXR1cm4gci5wcmV2O3ZhciBsLHU9cixjPXIueCxoPXIueSxmPTEvMDtmb3Iobj1yLm5leHQ7biE9PXU7KWk+PW4ueCYmbi54Pj1jJiZ4KGE8aD9pOm8sYSxjLGgsYTxoP286aSxhLG4ueCxuLnkpJiYobD1NYXRoLmFicyhhLW4ueSkvKGktbi54KSwobDxmfHxsPT09ZiYmbi54PnIueCkmJmsobix0KSYmKHI9bixmPWwpKSxuPW4ubmV4dDtyZXR1cm4gcn1mdW5jdGlvbiBnKHQsZSxyLG4pe3ZhciBpPXQ7ZG8gbnVsbD09PWkueiYmKGkuej12KGkueCxpLnksZSxyLG4pKSxpLnByZXZaPWkucHJldixpLm5leHRaPWkubmV4dCxpPWkubmV4dDt3aGlsZShpIT09dCk7aS5wcmV2Wi5uZXh0Wj1udWxsLGkucHJldlo9bnVsbCxtKGkpfWZ1bmN0aW9uIG0odCl7dmFyIGUscixuLGksYSxvLHMsbCx1PTE7ZG97Zm9yKHI9dCx0PW51bGwsYT1udWxsLG89MDtyOyl7Zm9yKG8rKyxuPXIscz0wLGU9MDtlPHUmJihzKyssbj1uLm5leHRaLG4pO2UrKyk7Zm9yKGw9dTtzPjB8fGw+MCYmbjspMD09PXM/KGk9bixuPW4ubmV4dFosbC0tKTowIT09bCYmbj9yLno8PW4uej8oaT1yLHI9ci5uZXh0WixzLS0pOihpPW4sbj1uLm5leHRaLGwtLSk6KGk9cixyPXIubmV4dFoscy0tKSxhP2EubmV4dFo9aTp0PWksaS5wcmV2Wj1hLGE9aTtyPW59YS5uZXh0Wj1udWxsLHUqPTJ9d2hpbGUobz4xKTtyZXR1cm4gdH1mdW5jdGlvbiB2KHQsZSxyLG4saSl7cmV0dXJuIHQ9MzI3NjcqKHQtcikvaSxlPTMyNzY3KihlLW4pL2ksdD0xNjcxMTkzNSYodHx0PDw4KSx0PTI1MjY0NTEzNSYodHx0PDw0KSx0PTg1ODk5MzQ1OSYodHx0PDwyKSx0PTE0MzE2NTU3NjUmKHR8dDw8MSksZT0xNjcxMTkzNSYoZXxlPDw4KSxlPTI1MjY0NTEzNSYoZXxlPDw0KSxlPTg1ODk5MzQ1OSYoZXxlPDwyKSxlPTE0MzE2NTU3NjUmKGV8ZTw8MSksdHxlPDwxfWZ1bmN0aW9uIHkodCl7dmFyIGU9dCxyPXQ7ZG8gZS54PHIueCYmKHI9ZSksZT1lLm5leHQ7d2hpbGUoZSE9PXQpO3JldHVybiByfWZ1bmN0aW9uIHgodCxlLHIsbixpLGEsbyxzKXtyZXR1cm4oaS1vKSooZS1zKS0odC1vKSooYS1zKT49MCYmKHQtbykqKG4tcyktKHItbykqKGUtcyk+PTAmJihyLW8pKihhLXMpLShpLW8pKihuLXMpPj0wfWZ1bmN0aW9uIGIodCxlKXtyZXR1cm4gdC5uZXh0LmkhPT1lLmkmJnQucHJldi5pIT09ZS5pJiYhQSh0LGUpJiZrKHQsZSkmJmsoZSx0KSYmVCh0LGUpfWZ1bmN0aW9uIF8odCxlLHIpe3JldHVybihlLnktdC55KSooci54LWUueCktKGUueC10LngpKihyLnktZS55KX1mdW5jdGlvbiB3KHQsZSl7cmV0dXJuIHQueD09PWUueCYmdC55PT09ZS55fWZ1bmN0aW9uIE0odCxlLHIsbil7cmV0dXJuISEodyh0LGUpJiZ3KHIsbil8fHcodCxuKSYmdyhyLGUpKXx8Xyh0LGUscik+MCE9Xyh0LGUsbik+MCYmXyhyLG4sdCk+MCE9XyhyLG4sZSk+MH1mdW5jdGlvbiBBKHQsZSl7dmFyIHI9dDtkb3tpZihyLmkhPT10LmkmJnIubmV4dC5pIT09dC5pJiZyLmkhPT1lLmkmJnIubmV4dC5pIT09ZS5pJiZNKHIsci5uZXh0LHQsZSkpcmV0dXJuITA7cj1yLm5leHR9d2hpbGUociE9PXQpO3JldHVybiExfWZ1bmN0aW9uIGsodCxlKXtyZXR1cm4gXyh0LnByZXYsdCx0Lm5leHQpPDA/Xyh0LGUsdC5uZXh0KT49MCYmXyh0LHQucHJldixlKT49MDpfKHQsZSx0LnByZXYpPDB8fF8odCx0Lm5leHQsZSk8MH1mdW5jdGlvbiBUKHQsZSl7dmFyIHI9dCxuPSExLGk9KHQueCtlLngpLzIsYT0odC55K2UueSkvMjtkbyByLnk+YSE9ci5uZXh0Lnk+YSYmaTwoci5uZXh0Lngtci54KSooYS1yLnkpLyhyLm5leHQueS1yLnkpK3IueCYmKG49IW4pLHI9ci5uZXh0O3doaWxlKHIhPT10KTtyZXR1cm4gbn1mdW5jdGlvbiBFKHQsZSl7dmFyIHI9bmV3IHoodC5pLHQueCx0LnkpLG49bmV3IHooZS5pLGUueCxlLnkpLGk9dC5uZXh0LGE9ZS5wcmV2O3JldHVybiB0Lm5leHQ9ZSxlLnByZXY9dCxyLm5leHQ9aSxpLnByZXY9cixuLm5leHQ9cixyLnByZXY9bixhLm5leHQ9bixuLnByZXY9YSxufWZ1bmN0aW9uIFModCxlLHIsbil7dmFyIGk9bmV3IHoodCxlLHIpO3JldHVybiBuPyhpLm5leHQ9bi5uZXh0LGkucHJldj1uLG4ubmV4dC5wcmV2PWksbi5uZXh0PWkpOihpLnByZXY9aSxpLm5leHQ9aSksaX1mdW5jdGlvbiBMKHQpe3QubmV4dC5wcmV2PXQucHJldix0LnByZXYubmV4dD10Lm5leHQsdC5wcmV2WiYmKHQucHJldloubmV4dFo9dC5uZXh0WiksdC5uZXh0WiYmKHQubmV4dFoucHJldlo9dC5wcmV2Wil9ZnVuY3Rpb24geih0LGUscil7dGhpcy5pPXQsdGhpcy54PWUsdGhpcy55PXIsdGhpcy5wcmV2PW51bGwsdGhpcy5uZXh0PW51bGwsdGhpcy56PW51bGwsdGhpcy5wcmV2Wj1udWxsLHRoaXMubmV4dFo9bnVsbCx0aGlzLnN0ZWluZXI9ITF9ZnVuY3Rpb24gQyh0LGUscixuKXtmb3IodmFyIGk9MCxhPWUsbz1yLW47YTxyO2ErPW4paSs9KHRbb10tdFthXSkqKHRbYSsxXSt0W28rMV0pLG89YTtyZXR1cm4gaX1lLmV4cG9ydHM9bixuLmRldmlhdGlvbj1mdW5jdGlvbih0LGUscixuKXt2YXIgaT1lJiZlLmxlbmd0aCxhPWk/ZVswXSpyOnQubGVuZ3RoLG89TWF0aC5hYnMoQyh0LDAsYSxyKSk7aWYoaSlmb3IodmFyIHM9MCxsPWUubGVuZ3RoO3M8bDtzKyspe3ZhciB1PWVbc10qcixjPXM8bC0xP2VbcysxXSpyOnQubGVuZ3RoO28tPU1hdGguYWJzKEModCx1LGMscikpfXZhciBoPTA7Zm9yKHM9MDtzPG4ubGVuZ3RoO3MrPTMpe3ZhciBmPW5bc10qcixkPW5bcysxXSpyLHA9bltzKzJdKnI7aCs9TWF0aC5hYnMoKHRbZl0tdFtwXSkqKHRbZCsxXS10W2YrMV0pLSh0W2ZdLXRbZF0pKih0W3ArMV0tdFtmKzFdKSl9cmV0dXJuIDA9PT1vJiYwPT09aD8wOk1hdGguYWJzKChoLW8pL28pfSxuLmZsYXR0ZW49ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRbMF1bMF0ubGVuZ3RoLHI9e3ZlcnRpY2VzOltdLGhvbGVzOltdLGRpbWVuc2lvbnM6ZX0sbj0wLGk9MDtpPHQubGVuZ3RoO2krKyl7Zm9yKHZhciBhPTA7YTx0W2ldLmxlbmd0aDthKyspZm9yKHZhciBvPTA7bzxlO28rKylyLnZlcnRpY2VzLnB1c2godFtpXVthXVtvXSk7aT4wJiYobis9dFtpLTFdLmxlbmd0aCxyLmhvbGVzLnB1c2gobikpfXJldHVybiByfX0se31dLDEwMDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7dmFyIHI9dC5sZW5ndGg7aWYoIm51bWJlciIhPXR5cGVvZiBlKXtlPTA7Zm9yKHZhciBuPTA7bjxyOysrbil7dmFyIGE9dFtuXTtlPU1hdGgubWF4KGUsYVswXSxhWzFdKX1lPSgwfGUpKzF9ZT0wfGU7Zm9yKHZhciBvPW5ldyBBcnJheShlKSxuPTA7bjxlOysrbilvW25dPVtdO2Zvcih2YXIgbj0wO248cjsrK24pe3ZhciBhPXRbbl07b1thWzBdXS5wdXNoKGFbMV0pLG9bYVsxXV0ucHVzaChhWzBdKX1mb3IodmFyIHM9MDtzPGU7KytzKWkob1tzXSxmdW5jdGlvbih0LGUpe3JldHVybiB0LWV9KTtyZXR1cm4gb31lLmV4cG9ydHM9bjt2YXIgaT10KCJ1bmlxIil9LHt1bmlxOjQ5OH1dLDEwMTpbZnVuY3Rpb24oZSxyLG4peyhmdW5jdGlvbihpLGEpeyFmdW5jdGlvbihlLGkpeyJvYmplY3QiPT10eXBlb2YgbiYmInVuZGVmaW5lZCIhPXR5cGVvZiByP3IuZXhwb3J0cz1pKCk6ImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQuYW1kP3QoaSk6ZS5FUzZQcm9taXNlPWkoKX0odGhpcyxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0KHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fHwib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10fWZ1bmN0aW9uIHIodCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHR9ZnVuY3Rpb24gbih0KXtaPXR9ZnVuY3Rpb24gbyh0KXtRPXR9ZnVuY3Rpb24gcygpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBpLm5leHRUaWNrKGYpfX1mdW5jdGlvbiBsKCl7cmV0dXJuIGZ1bmN0aW9uKCl7VyhmKX19ZnVuY3Rpb24gdSgpe3ZhciB0PTAsZT1uZXcgSihmKSxyPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKTtyZXR1cm4gZS5vYnNlcnZlKHIse2NoYXJhY3RlckRhdGE6ITB9KSxmdW5jdGlvbigpe3IuZGF0YT10PSsrdCUyfX1mdW5jdGlvbiBjKCl7dmFyIHQ9bmV3IE1lc3NhZ2VDaGFubmVsO3JldHVybiB0LnBvcnQxLm9ubWVzc2FnZT1mLGZ1bmN0aW9uKCl7cmV0dXJuIHQucG9ydDIucG9zdE1lc3NhZ2UoMCl9fWZ1bmN0aW9uIGgoKXt2YXIgdD1zZXRUaW1lb3V0O3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0KGYsMSl9fWZ1bmN0aW9uIGYoKXtmb3IodmFyIHQ9MDt0PFk7dCs9Mil7dmFyIGU9cnRbdF0scj1ydFt0KzFdO2UocikscnRbdF09dm9pZCAwLHJ0W3QrMV09dm9pZCAwfVk9MH1mdW5jdGlvbiBkKCl7dHJ5e3ZhciB0PWUscj10KCJ2ZXJ0eCIpO3JldHVybiBXPXIucnVuT25Mb29wfHxyLnJ1bk9uQ29udGV4dCxsKCl9Y2F0Y2godCl7cmV0dXJuIGgoKX19ZnVuY3Rpb24gcCh0LGUpe3ZhciByPWFyZ3VtZW50cyxuPXRoaXMsaT1uZXcgdGhpcy5jb25zdHJ1Y3RvcihtKTt2b2lkIDA9PT1pW2l0XSYmUihpKTt2YXIgYT1uLl9zdGF0ZTtyZXR1cm4gYT8hZnVuY3Rpb24oKXt2YXIgdD1yW2EtMV07UShmdW5jdGlvbigpe3JldHVybiBJKGEsaSx0LG4uX3Jlc3VsdCl9KX0oKTpTKG4saSx0LGUpLGl9ZnVuY3Rpb24gZyh0KXt2YXIgZT10aGlzO2lmKHQmJiJvYmplY3QiPT10eXBlb2YgdCYmdC5jb25zdHJ1Y3Rvcj09PWUpcmV0dXJuIHQ7dmFyIHI9bmV3IGUobSk7cmV0dXJuIEEocix0KSxyfWZ1bmN0aW9uIG0oKXt9ZnVuY3Rpb24gdigpe3JldHVybiBuZXcgVHlwZUVycm9yKCJZb3UgY2Fubm90IHJlc29sdmUgYSBwcm9taXNlIHdpdGggaXRzZWxmIil9ZnVuY3Rpb24geSgpe3JldHVybiBuZXcgVHlwZUVycm9yKCJBIHByb21pc2VzIGNhbGxiYWNrIGNhbm5vdCByZXR1cm4gdGhhdCBzYW1lIHByb21pc2UuIil9ZnVuY3Rpb24geCh0KXt0cnl7cmV0dXJuIHQudGhlbn1jYXRjaCh0KXtyZXR1cm4gbHQuZXJyb3I9dCxsdH19ZnVuY3Rpb24gYih0LGUscixuKXt0cnl7dC5jYWxsKGUscixuKX1jYXRjaCh0KXtyZXR1cm4gdH19ZnVuY3Rpb24gXyh0LGUscil7UShmdW5jdGlvbih0KXt2YXIgbj0hMSxpPWIocixlLGZ1bmN0aW9uKHIpe258fChuPSEwLGUhPT1yP0EodCxyKTpUKHQscikpfSxmdW5jdGlvbihlKXtufHwobj0hMCxFKHQsZSkpfSwiU2V0dGxlOiAiKyh0Ll9sYWJlbHx8IiB1bmtub3duIHByb21pc2UiKSk7IW4mJmkmJihuPSEwLEUodCxpKSl9LHQpfWZ1bmN0aW9uIHcodCxlKXtlLl9zdGF0ZT09PW90P1QodCxlLl9yZXN1bHQpOmUuX3N0YXRlPT09c3Q/RSh0LGUuX3Jlc3VsdCk6UyhlLHZvaWQgMCxmdW5jdGlvbihlKXtyZXR1cm4gQSh0LGUpfSxmdW5jdGlvbihlKXtyZXR1cm4gRSh0LGUpfSl9ZnVuY3Rpb24gTSh0LGUsbil7ZS5jb25zdHJ1Y3Rvcj09PXQuY29uc3RydWN0b3ImJm49PT1wJiZlLmNvbnN0cnVjdG9yLnJlc29sdmU9PT1nP3codCxlKTpuPT09bHQ/RSh0LGx0LmVycm9yKTp2b2lkIDA9PT1uP1QodCxlKTpyKG4pP18odCxlLG4pOlQodCxlKX1mdW5jdGlvbiBBKGUscil7ZT09PXI/RShlLHYoKSk6dChyKT9NKGUscix4KHIpKTpUKGUscil9ZnVuY3Rpb24gayh0KXt0Ll9vbmVycm9yJiZ0Ll9vbmVycm9yKHQuX3Jlc3VsdCksTCh0KX1mdW5jdGlvbiBUKHQsZSl7dC5fc3RhdGU9PT1hdCYmKHQuX3Jlc3VsdD1lLHQuX3N0YXRlPW90LDAhPT10Ll9zdWJzY3JpYmVycy5sZW5ndGgmJlEoTCx0KSl9ZnVuY3Rpb24gRSh0LGUpe3QuX3N0YXRlPT09YXQmJih0Ll9zdGF0ZT1zdCx0Ll9yZXN1bHQ9ZSxRKGssdCkpfWZ1bmN0aW9uIFModCxlLHIsbil7dmFyIGk9dC5fc3Vic2NyaWJlcnMsYT1pLmxlbmd0aDt0Ll9vbmVycm9yPW51bGwsaVthXT1lLGlbYStvdF09cixpW2Erc3RdPW4sMD09PWEmJnQuX3N0YXRlJiZRKEwsdCl9ZnVuY3Rpb24gTCh0KXt2YXIgZT10Ll9zdWJzY3JpYmVycyxyPXQuX3N0YXRlO2lmKDAhPT1lLmxlbmd0aCl7Zm9yKHZhciBuPXZvaWQgMCxpPXZvaWQgMCxhPXQuX3Jlc3VsdCxvPTA7bzxlLmxlbmd0aDtvKz0zKW49ZVtvXSxpPWVbbytyXSxuP0kocixuLGksYSk6aShhKTt0Ll9zdWJzY3JpYmVycy5sZW5ndGg9MH19ZnVuY3Rpb24geigpe3RoaXMuZXJyb3I9bnVsbH1mdW5jdGlvbiBDKHQsZSl7dHJ5e3JldHVybiB0KGUpfWNhdGNoKHQpe3JldHVybiB1dC5lcnJvcj10LHV0fX1mdW5jdGlvbiBJKHQsZSxuLGkpe3ZhciBhPXIobiksbz12b2lkIDAscz12b2lkIDAsbD12b2lkIDAsdT12b2lkIDA7aWYoYSl7aWYobz1DKG4saSksbz09PXV0Pyh1PSEwLHM9by5lcnJvcixvPW51bGwpOmw9ITAsZT09PW8pcmV0dXJuIHZvaWQgRShlLHkoKSl9ZWxzZSBvPWksbD0hMDtlLl9zdGF0ZSE9PWF0fHwoYSYmbD9BKGUsbyk6dT9FKGUscyk6dD09PW90P1QoZSxvKTp0PT09c3QmJkUoZSxvKSl9ZnVuY3Rpb24gUCh0LGUpe3RyeXtlKGZ1bmN0aW9uKGUpe0EodCxlKX0sZnVuY3Rpb24oZSl7RSh0LGUpfSl9Y2F0Y2goZSl7RSh0LGUpfX1mdW5jdGlvbiBEKCl7cmV0dXJuIGN0Kyt9ZnVuY3Rpb24gUih0KXt0W2l0XT1jdCsrLHQuX3N0YXRlPXZvaWQgMCx0Ll9yZXN1bHQ9dm9pZCAwLHQuX3N1YnNjcmliZXJzPVtdfWZ1bmN0aW9uIE8odCxlKXt0aGlzLl9pbnN0YW5jZUNvbnN0cnVjdG9yPXQsdGhpcy5wcm9taXNlPW5ldyB0KG0pLHRoaXMucHJvbWlzZVtpdF18fFIodGhpcy5wcm9taXNlKSxYKGUpPyh0aGlzLl9pbnB1dD1lLHRoaXMubGVuZ3RoPWUubGVuZ3RoLHRoaXMuX3JlbWFpbmluZz1lLmxlbmd0aCx0aGlzLl9yZXN1bHQ9bmV3IEFycmF5KHRoaXMubGVuZ3RoKSwwPT09dGhpcy5sZW5ndGg/VCh0aGlzLnByb21pc2UsdGhpcy5fcmVzdWx0KToodGhpcy5sZW5ndGg9dGhpcy5sZW5ndGh8fDAsdGhpcy5fZW51bWVyYXRlKCksMD09PXRoaXMuX3JlbWFpbmluZyYmVCh0aGlzLnByb21pc2UsdGhpcy5fcmVzdWx0KSkpOkUodGhpcy5wcm9taXNlLEYoKSl9ZnVuY3Rpb24gRigpe3JldHVybiBuZXcgRXJyb3IoIkFycmF5IE1ldGhvZHMgbXVzdCBiZSBwcm92aWRlZCBhbiBBcnJheSIpfWZ1bmN0aW9uIGoodCl7cmV0dXJuIG5ldyBPKHRoaXMsdCkucHJvbWlzZX1mdW5jdGlvbiBOKHQpe3ZhciBlPXRoaXM7cmV0dXJuIG5ldyBlKFgodCk/ZnVuY3Rpb24ocixuKXtmb3IodmFyIGk9dC5sZW5ndGgsYT0wO2E8aTthKyspZS5yZXNvbHZlKHRbYV0pLnRoZW4ocixuKX06ZnVuY3Rpb24odCxlKXtyZXR1cm4gZShuZXcgVHlwZUVycm9yKCJZb3UgbXVzdCBwYXNzIGFuIGFycmF5IHRvIHJhY2UuIikpfSl9ZnVuY3Rpb24gQih0KXt2YXIgZT10aGlzLHI9bmV3IGUobSk7cmV0dXJuIEUocix0KSxyfWZ1bmN0aW9uIFUoKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJZb3UgbXVzdCBwYXNzIGEgcmVzb2x2ZXIgZnVuY3Rpb24gYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBwcm9taXNlIGNvbnN0cnVjdG9yIil9ZnVuY3Rpb24gVigpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1Byb21pc2UnOiBQbGVhc2UgdXNlIHRoZSAnbmV3JyBvcGVyYXRvciwgdGhpcyBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLiIpfWZ1bmN0aW9uIHEodCl7dGhpc1tpdF09RCgpLHRoaXMuX3Jlc3VsdD10aGlzLl9zdGF0ZT12b2lkIDAsdGhpcy5fc3Vic2NyaWJlcnM9W10sbSE9PXQmJigiZnVuY3Rpb24iIT10eXBlb2YgdCYmVSgpLHRoaXMgaW5zdGFuY2VvZiBxP1AodGhpcyx0KTpWKCkpfWZ1bmN0aW9uIEgoKXt2YXIgdD12b2lkIDA7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBhKXQ9YTtlbHNlIGlmKCJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZil0PXNlbGY7ZWxzZSB0cnl7dD1GdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpfWNhdGNoKHQpe3Rocm93IG5ldyBFcnJvcigicG9seWZpbGwgZmFpbGVkIGJlY2F1c2UgZ2xvYmFsIG9iamVjdCBpcyB1bmF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50Iil9dmFyIGU9dC5Qcm9taXNlO2lmKGUpe3ZhciByPW51bGw7dHJ5e3I9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUucmVzb2x2ZSgpKX1jYXRjaCh0KXt9aWYoIltvYmplY3QgUHJvbWlzZV0iPT09ciYmIWUuY2FzdClyZXR1cm59dC5Qcm9taXNlPXF9dmFyIEc9dm9pZCAwO0c9QXJyYXkuaXNBcnJheT9BcnJheS5pc0FycmF5OmZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9O3ZhciBYPUcsWT0wLFc9dm9pZCAwLFo9dm9pZCAwLFE9ZnVuY3Rpb24odCxlKXtydFtZXT10LHJ0W1krMV09ZSxZKz0yLDI9PT1ZJiYoWj9aKGYpOm50KCkpfSxLPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp2b2lkIDAsJD1LfHx7fSxKPSQuTXV0YXRpb25PYnNlcnZlcnx8JC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyLHR0PSJ1bmRlZmluZWQiPT10eXBlb2Ygc2VsZiYmInVuZGVmaW5lZCIhPXR5cGVvZiBpJiYiW29iamVjdCBwcm9jZXNzXSI9PT17fS50b1N0cmluZy5jYWxsKGkpLGV0PSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhDbGFtcGVkQXJyYXkmJiJ1bmRlZmluZWQiIT10eXBlb2YgaW1wb3J0U2NyaXB0cyYmInVuZGVmaW5lZCIhPXR5cGVvZiBNZXNzYWdlQ2hhbm5lbCxydD1uZXcgQXJyYXkoMWUzKSxudD12b2lkIDA7bnQ9dHQ/cygpOko/dSgpOmV0P2MoKTp2b2lkIDA9PT1LJiYiZnVuY3Rpb24iPT10eXBlb2YgZT9kKCk6aCgpO3ZhciBpdD1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMTYpLGF0PXZvaWQgMCxvdD0xLHN0PTIsbHQ9bmV3IHosdXQ9bmV3IHosY3Q9MDtyZXR1cm4gTy5wcm90b3R5cGUuX2VudW1lcmF0ZT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmxlbmd0aCxlPXRoaXMuX2lucHV0LHI9MDt0aGlzLl9zdGF0ZT09PWF0JiZyPHQ7cisrKXRoaXMuX2VhY2hFbnRyeShlW3JdLHIpfSxPLnByb3RvdHlwZS5fZWFjaEVudHJ5PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5faW5zdGFuY2VDb25zdHJ1Y3RvcixuPXIucmVzb2x2ZTtpZihuPT09Zyl7dmFyIGk9eCh0KTtpZihpPT09cCYmdC5fc3RhdGUhPT1hdCl0aGlzLl9zZXR0bGVkQXQodC5fc3RhdGUsZSx0Ll9yZXN1bHQpO2Vsc2UgaWYoImZ1bmN0aW9uIiE9dHlwZW9mIGkpdGhpcy5fcmVtYWluaW5nLS0sdGhpcy5fcmVzdWx0W2VdPXQ7ZWxzZSBpZihyPT09cSl7dmFyIGE9bmV3IHIobSk7TShhLHQsaSksdGhpcy5fd2lsbFNldHRsZUF0KGEsZSl9ZWxzZSB0aGlzLl93aWxsU2V0dGxlQXQobmV3IHIoZnVuY3Rpb24oZSl7cmV0dXJuIGUodCl9KSxlKX1lbHNlIHRoaXMuX3dpbGxTZXR0bGVBdChuKHQpLGUpfSxPLnByb3RvdHlwZS5fc2V0dGxlZEF0PWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLnByb21pc2U7bi5fc3RhdGU9PT1hdCYmKHRoaXMuX3JlbWFpbmluZy0tLHQ9PT1zdD9FKG4scik6dGhpcy5fcmVzdWx0W2VdPXIpLDA9PT10aGlzLl9yZW1haW5pbmcmJlQobix0aGlzLl9yZXN1bHQpfSxPLnByb3RvdHlwZS5fd2lsbFNldHRsZUF0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcztTKHQsdm9pZCAwLGZ1bmN0aW9uKHQpe3JldHVybiByLl9zZXR0bGVkQXQob3QsZSx0KX0sZnVuY3Rpb24odCl7cmV0dXJuIHIuX3NldHRsZWRBdChzdCxlLHQpfSl9LHEuYWxsPWoscS5yYWNlPU4scS5yZXNvbHZlPWcscS5yZWplY3Q9QixxLl9zZXRTY2hlZHVsZXI9bixxLl9zZXRBc2FwPW8scS5fYXNhcD1RLHEucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpxLHRoZW46cCxjYXRjaDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aGVuKG51bGwsdCl9fSxIKCkscS5wb2x5ZmlsbD1ILHEuUHJvbWlzZT1xLHF9KX0pLmNhbGwodGhpcyxlKCJfcHJvY2VzcyIpLCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30pfSx7X3Byb2Nlc3M6NDQ1fV0sMTAyOltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbigpe3RoaXMuX2V2ZW50cz10aGlzLl9ldmVudHN8fHt9LHRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHZvaWQgMH1mdW5jdGlvbiBpKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIGEodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0fWZ1bmN0aW9uIG8odCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT09dH1mdW5jdGlvbiBzKHQpe3JldHVybiB2b2lkIDA9PT10fWUuZXhwb3J0cz1uLG4uRXZlbnRFbWl0dGVyPW4sbi5wcm90b3R5cGUuX2V2ZW50cz12b2lkIDAsbi5wcm90b3R5cGUuX21heExpc3RlbmVycz12b2lkIDAsbi5kZWZhdWx0TWF4TGlzdGVuZXJzPTEwLG4ucHJvdG90eXBlLnNldE1heExpc3RlbmVycz1mdW5jdGlvbih0KXtpZighYSh0KXx8dDwwfHxpc05hTih0KSl0aHJvdyBUeXBlRXJyb3IoIm4gbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciIpO3JldHVybiB0aGlzLl9tYXhMaXN0ZW5lcnM9dCx0aGlzfSxuLnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKHQpe3ZhciBlLHIsbixhLGwsdTtpZih0aGlzLl9ldmVudHN8fCh0aGlzLl9ldmVudHM9e30pLCJlcnJvciI9PT10JiYoIXRoaXMuX2V2ZW50cy5lcnJvcnx8byh0aGlzLl9ldmVudHMuZXJyb3IpJiYhdGhpcy5fZXZlbnRzLmVycm9yLmxlbmd0aCkpe2lmKGU9YXJndW1lbnRzWzFdLGUgaW5zdGFuY2VvZiBFcnJvcil0aHJvdyBlO3ZhciBjPW5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkICJlcnJvciIgZXZlbnQuICgnK2UrIikiKTt0aHJvdyBjLmNvbnRleHQ9ZSxjfWlmKHI9dGhpcy5fZXZlbnRzW3RdLHMocikpcmV0dXJuITE7aWYoaShyKSlzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAxOnIuY2FsbCh0aGlzKTticmVhaztjYXNlIDI6ci5jYWxsKHRoaXMsYXJndW1lbnRzWzFdKTticmVhaztjYXNlIDM6ci5jYWxsKHRoaXMsYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSk7YnJlYWs7ZGVmYXVsdDphPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxyLmFwcGx5KHRoaXMsYSl9ZWxzZSBpZihvKHIpKWZvcihhPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSx1PXIuc2xpY2UoKSxuPXUubGVuZ3RoLGw9MDtsPG47bCsrKXVbbF0uYXBwbHkodGhpcyxhKTtyZXR1cm4hMH0sbi5wcm90b3R5cGUuYWRkTGlzdGVuZXI9ZnVuY3Rpb24odCxlKXt2YXIgcjtpZighaShlKSl0aHJvdyBUeXBlRXJyb3IoImxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbiIpO3JldHVybiB0aGlzLl9ldmVudHN8fCh0aGlzLl9ldmVudHM9e30pLHRoaXMuX2V2ZW50cy5uZXdMaXN0ZW5lciYmdGhpcy5lbWl0KCJuZXdMaXN0ZW5lciIsdCxpKGUubGlzdGVuZXIpP2UubGlzdGVuZXI6ZSksdGhpcy5fZXZlbnRzW3RdP28odGhpcy5fZXZlbnRzW3RdKT90aGlzLl9ldmVudHNbdF0ucHVzaChlKTp0aGlzLl9ldmVudHNbdF09W3RoaXMuX2V2ZW50c1t0XSxlXTp0aGlzLl9ldmVudHNbdF09ZSxvKHRoaXMuX2V2ZW50c1t0XSkmJiF0aGlzLl9ldmVudHNbdF0ud2FybmVkJiYocj1zKHRoaXMuX21heExpc3RlbmVycyk/bi5kZWZhdWx0TWF4TGlzdGVuZXJzOnRoaXMuX21heExpc3RlbmVycyxyJiZyPjAmJnRoaXMuX2V2ZW50c1t0XS5sZW5ndGg+ciYmKHRoaXMuX2V2ZW50c1t0XS53YXJuZWQ9ITAsY29uc29sZS5lcnJvcigiKG5vZGUpIHdhcm5pbmc6IHBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJWQgbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdC4iLHRoaXMuX2V2ZW50c1t0XS5sZW5ndGgpLCJmdW5jdGlvbiI9PXR5cGVvZiBjb25zb2xlLnRyYWNlJiZjb25zb2xlLnRyYWNlKCkpKSx0aGlzfSxuLnByb3RvdHlwZS5vbj1uLnByb3RvdHlwZS5hZGRMaXN0ZW5lcixuLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcigpe3RoaXMucmVtb3ZlTGlzdGVuZXIodCxyKSxufHwobj0hMCxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9aWYoIWkoZSkpdGhyb3cgVHlwZUVycm9yKCJsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24iKTt2YXIgbj0hMTtyZXR1cm4gci5saXN0ZW5lcj1lLHRoaXMub24odCxyKSx0aGlzfSxuLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3ZhciByLG4sYSxzO2lmKCFpKGUpKXRocm93IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIik7aWYoIXRoaXMuX2V2ZW50c3x8IXRoaXMuX2V2ZW50c1t0XSlyZXR1cm4gdGhpcztpZihyPXRoaXMuX2V2ZW50c1t0XSxhPXIubGVuZ3RoLG49LTEscj09PWV8fGkoci5saXN0ZW5lcikmJnIubGlzdGVuZXI9PT1lKWRlbGV0ZSB0aGlzLl9ldmVudHNbdF0sdGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIix0LGUpO2Vsc2UgaWYobyhyKSl7Zm9yKHM9YTtzLS0gPjA7KWlmKHJbc109PT1lfHxyW3NdLmxpc3RlbmVyJiZyW3NdLmxpc3RlbmVyPT09ZSl7bj1zO2JyZWFrfWlmKG48MClyZXR1cm4gdGhpczsxPT09ci5sZW5ndGg/KHIubGVuZ3RoPTAsZGVsZXRlIHRoaXMuX2V2ZW50c1t0XSk6ci5zcGxpY2UobiwxKSx0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLHQsZSl9cmV0dXJuIHRoaXN9LG4ucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbih0KXt2YXIgZSxyO2lmKCF0aGlzLl9ldmVudHMpcmV0dXJuIHRoaXM7aWYoIXRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcilyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5fZXZlbnRzPXt9OnRoaXMuX2V2ZW50c1t0XSYmZGVsZXRlIHRoaXMuX2V2ZW50c1t0XSx0aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IoZSBpbiB0aGlzLl9ldmVudHMpInJlbW92ZUxpc3RlbmVyIiE9PWUmJnRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGUpO3JldHVybiB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygicmVtb3ZlTGlzdGVuZXIiKSx0aGlzLl9ldmVudHM9e30sdGhpc31pZihyPXRoaXMuX2V2ZW50c1t0XSxpKHIpKXRoaXMucmVtb3ZlTGlzdGVuZXIodCxyKTtlbHNlIGlmKHIpZm9yKDtyLmxlbmd0aDspdGhpcy5yZW1vdmVMaXN0ZW5lcih0LHJbci5sZW5ndGgtMV0pO3JldHVybiBkZWxldGUgdGhpcy5fZXZlbnRzW3RdLHRoaXN9LG4ucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gZT10aGlzLl9ldmVudHMmJnRoaXMuX2V2ZW50c1t0XT9pKHRoaXMuX2V2ZW50c1t0XSk/W3RoaXMuX2V2ZW50c1t0XV06dGhpcy5fZXZlbnRzW3RdLnNsaWNlKCk6W119LG4ucHJvdG90eXBlLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24odCl7aWYodGhpcy5fZXZlbnRzKXt2YXIgZT10aGlzLl9ldmVudHNbdF07aWYoaShlKSlyZXR1cm4gMTtpZihlKXJldHVybiBlLmxlbmd0aH1yZXR1cm4gMH0sbi5saXN0ZW5lckNvdW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQubGlzdGVuZXJDb3VudChlKX19LHt9XSwxMDM6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscil7dmFyIG49ZXx8MCxpPXJ8fDE7cmV0dXJuW1t0WzEyXSt0WzBdLHRbMTNdK3RbMV0sdFsxNF0rdFsyXSx0WzE1XSt0WzNdXSxbdFsxMl0tdFswXSx0WzEzXS10WzFdLHRbMTRdLXRbMl0sdFsxNV0tdFszXV0sW3RbMTJdK3RbNF0sdFsxM10rdFs1XSx0WzE0XSt0WzZdLHRbMTVdK3RbN11dLFt0WzEyXS10WzRdLHRbMTNdLXRbNV0sdFsxNF0tdFs2XSx0WzE1XS10WzddXSxbbip0WzEyXSt0WzhdLG4qdFsxM10rdFs5XSxuKnRbMTRdK3RbMTBdLG4qdFsxNV0rdFsxMV1dLFtpKnRbMTJdLXRbOF0saSp0WzEzXS10WzldLGkqdFsxNF0tdFsxMF0saSp0WzE1XS10WzExXV1dfWUuZXhwb3J0cz1ufSx7fV0sMTA0OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7Zm9yKHZhciBlLHI9dC5sZW5ndGgsbj0wO248cjtuKyspaWYoZT10LmNoYXJDb2RlQXQobiksKGU8OXx8ZT4xMykmJjMyIT09ZSYmMTMzIT09ZSYmMTYwIT09ZSYmNTc2MCE9PWUmJjYxNTghPT1lJiYoZTw4MTkyfHxlPjgyMDUpJiY4MjMyIT09ZSYmODIzMyE9PWUmJjgyMzkhPT1lJiY4Mjg3IT09ZSYmODI4OCE9PWUmJjEyMjg4IT09ZSYmNjUyNzkhPT1lKXJldHVybiExO3JldHVybiEwfWUuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtpZigic3RyaW5nIj09PWUpe3ZhciByPXQ7aWYodD0rdCwwPT09dCYmbihyKSlyZXR1cm4hMX1lbHNlIGlmKCJudW1iZXIiIT09ZSlyZXR1cm4hMTtyZXR1cm4gdC10PDF9fSx7fV0sMTA1OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7cmV0dXJuIG5ldyBGdW5jdGlvbigiZiIsInZhciBwID0gKGYgJiYgZi5wcm9wZXJ0aWVzIHx8IHt9KTsgcmV0dXJuICIraSh0KSl9ZnVuY3Rpb24gaSh0KXtpZighdClyZXR1cm4idHJ1ZSI7dmFyIGU9dFswXTtpZih0Lmxlbmd0aDw9MSlyZXR1cm4iYW55Ij09PWU/ImZhbHNlIjoidHJ1ZSI7dmFyIHI9Ij09Ij09PWU/byh0WzFdLHRbMl0sIj09PSIsITEpOiIhPSI9PT1lP28odFsxXSx0WzJdLCIhPT0iLCExKToiPCI9PT1lfHwiPiI9PT1lfHwiPD0iPT09ZXx8Ij49Ij09PWU/byh0WzFdLHRbMl0sZSwhMCk6ImFueSI9PT1lP3ModC5zbGljZSgxKSwifHwiKToiYWxsIj09PWU/cyh0LnNsaWNlKDEpLCImJiIpOiJub25lIj09PWU/YyhzKHQuc2xpY2UoMSksInx8IikpOiJpbiI9PT1lP2wodFsxXSx0LnNsaWNlKDIpKToiIWluIj09PWU/YyhsKHRbMV0sdC5zbGljZSgyKSkpOiJoYXMiPT09ZT91KHRbMV0pOiIhaGFzIj09PWU/Yyh1KFt0WzFdXSkpOiJ0cnVlIjtyZXR1cm4iKCIrcisiKSJ9ZnVuY3Rpb24gYSh0KXtyZXR1cm4iJHR5cGUiPT09dD8iZi50eXBlIjoiJGlkIj09PXQ/ImYuaWQiOiJwWyIrSlNPTi5zdHJpbmdpZnkodCkrIl0ifWZ1bmN0aW9uIG8odCxlLHIsbil7dmFyIGk9YSh0KSxvPSIkdHlwZSI9PT10P2YuaW5kZXhPZihlKTpKU09OLnN0cmluZ2lmeShlKTtyZXR1cm4obj8idHlwZW9mICIraSsiPT09IHR5cGVvZiAiK28rIiYmIjoiIikraStyK299ZnVuY3Rpb24gcyh0LGUpe3JldHVybiB0Lm1hcChpKS5qb2luKGUpfWZ1bmN0aW9uIGwodCxlKXsiJHR5cGUiPT09dCYmKGU9ZS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIGYuaW5kZXhPZih0KX0pKTt2YXIgcj1KU09OLnN0cmluZ2lmeShlLnNvcnQoaCkpLG49YSh0KTtyZXR1cm4gZS5sZW5ndGg8PTIwMD9yKyIuaW5kZXhPZigiK24rIikgIT09IC0xIjoiZnVuY3Rpb24odiwgYSwgaSwgaikge3doaWxlIChpIDw9IGopIHsgdmFyIG0gPSAoaSArIGopID4+IDE7ICAgIGlmIChhW21dID09PSB2KSByZXR1cm4gdHJ1ZTsgaWYgKGFbbV0gPiB2KSBqID0gbSAtIDE7IGVsc2UgaSA9IG0gKyAxO31yZXR1cm4gZmFsc2U7IH0oIituKyIsICIrcisiLDAsIisoZS5sZW5ndGgtMSkrIikifWZ1bmN0aW9uIHUodCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHQpKyIgaW4gcCJ9ZnVuY3Rpb24gYyh0KXtyZXR1cm4iISgiK3QrIikifWZ1bmN0aW9uIGgodCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOjB9ZS5leHBvcnRzPW47dmFyIGY9WyJVbmtub3duIiwiUG9pbnQiLCJMaW5lU3RyaW5nIiwiUG9seWdvbiJdfSx7fV0sMTA2OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIpe3JldHVybiBNYXRoLm1pbihlLE1hdGgubWF4KHQscikpfWZ1bmN0aW9uIGkodCxlLHIpe3RoaXMuZGltZW5zaW9uPXQubGVuZ3RoLHRoaXMuYm91bmRzPVtuZXcgQXJyYXkodGhpcy5kaW1lbnNpb24pLG5ldyBBcnJheSh0aGlzLmRpbWVuc2lvbildO2Zvcih2YXIgbj0wO248dGhpcy5kaW1lbnNpb247KytuKXRoaXMuYm91bmRzWzBdW25dPS0oMS8wKSx0aGlzLmJvdW5kc1sxXVtuXT0xLzA7dGhpcy5fc3RhdGU9dC5zbGljZSgpLnJldmVyc2UoKSx0aGlzLl92ZWxvY2l0eT1lLnNsaWNlKCkucmV2ZXJzZSgpLHRoaXMuX3RpbWU9W3JdLHRoaXMuX3NjcmF0Y2g9W3Quc2xpY2UoKSx0LnNsaWNlKCksdC5zbGljZSgpLHQuc2xpY2UoKSx0LnNsaWNlKCldfWZ1bmN0aW9uIGEodCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0KSxyPTA7cjx0OysrcillW3JdPTA7cmV0dXJuIGV9ZnVuY3Rpb24gbyh0LGUscil7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IGkoWzBdLFswXSwwKTtjYXNlIDE6aWYoIm51bWJlciI9PXR5cGVvZiB0KXt2YXIgbj1hKHQpO3JldHVybiBuZXcgaShuLG4sMCl9cmV0dXJuIG5ldyBpKHQsYSh0Lmxlbmd0aCksMCk7Y2FzZSAyOmlmKCJudW1iZXIiPT10eXBlb2YgZSl7dmFyIG49YSh0Lmxlbmd0aCk7cmV0dXJuIG5ldyBpKHQsbiwrZSl9cj0wO2Nhc2UgMzppZih0Lmxlbmd0aCE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigic3RhdGUgYW5kIHZlbG9jaXR5IGxlbmd0aHMgbXVzdCBtYXRjaCIpO3JldHVybiBuZXcgaSh0LGUscil9fWUuZXhwb3J0cz1vO3ZhciBzPXQoImN1YmljLWhlcm1pdGUiKSxsPXQoImJpbmFyeS1zZWFyY2gtYm91bmRzIiksdT1pLnByb3RvdHlwZTt1LmZsdXNoPWZ1bmN0aW9uKHQpe3ZhciBlPWwuZ3QodGhpcy5fdGltZSx0KS0xO2U8PTB8fCh0aGlzLl90aW1lLnNwbGljZSgwLGUpLHRoaXMuX3N0YXRlLnNwbGljZSgwLGUqdGhpcy5kaW1lbnNpb24pLHRoaXMuX3ZlbG9jaXR5LnNwbGljZSgwLGUqdGhpcy5kaW1lbnNpb24pKX0sdS5jdXJ2ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl90aW1lLHI9ZS5sZW5ndGgsaT1sLmxlKGUsdCksYT10aGlzLl9zY3JhdGNoWzBdLG89dGhpcy5fc3RhdGUsdT10aGlzLl92ZWxvY2l0eSxjPXRoaXMuZGltZW5zaW9uLGg9dGhpcy5ib3VuZHM7aWYoaTwwKWZvcih2YXIgZj1jLTEsZD0wO2Q8YzsrK2QsLS1mKWFbZF09b1tmXTtlbHNlIGlmKGk+PXItMSlmb3IodmFyIGY9by5sZW5ndGgtMSxwPXQtZVtyLTFdLGQ9MDtkPGM7KytkLC0tZilhW2RdPW9bZl0rcCp1W2ZdO2Vsc2V7Zm9yKHZhciBmPWMqKGkrMSktMSxnPWVbaV0sbT1lW2krMV0sdj1tLWd8fDEseT10aGlzLl9zY3JhdGNoWzFdLHg9dGhpcy5fc2NyYXRjaFsyXSxiPXRoaXMuX3NjcmF0Y2hbM10sXz10aGlzLl9zY3JhdGNoWzRdLHc9ITAsZD0wO2Q8YzsrK2QsLS1mKXlbZF09b1tmXSxiW2RdPXVbZl0qdix4W2RdPW9bZitjXSxfW2RdPXVbZitjXSp2LHc9dyYmeVtkXT09PXhbZF0mJmJbZF09PT1fW2RdJiYwPT09YltkXTtpZih3KWZvcih2YXIgZD0wO2Q8YzsrK2QpYVtkXT15W2RdO2Vsc2Ugcyh5LGIseCxfLCh0LWcpL3YsYSl9Zm9yKHZhciBNPWhbMF0sQT1oWzFdLGQ9MDtkPGM7KytkKWFbZF09bihNW2RdLEFbZF0sYVtkXSk7cmV0dXJuIGF9LHUuZGN1cnZlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3RpbWUscj1lLmxlbmd0aCxuPWwubGUoZSx0KSxpPXRoaXMuX3NjcmF0Y2hbMF0sYT10aGlzLl9zdGF0ZSxvPXRoaXMuX3ZlbG9jaXR5LHU9dGhpcy5kaW1lbnNpb247aWYobj49ci0xKWZvcih2YXIgYz1hLmxlbmd0aC0xLGg9KHQtZVtyLTFdLDApO2g8dTsrK2gsLS1jKWlbaF09b1tjXTtlbHNle2Zvcih2YXIgYz11KihuKzEpLTEsZj1lW25dLGQ9ZVtuKzFdLHA9ZC1mfHwxLGc9dGhpcy5fc2NyYXRjaFsxXSxtPXRoaXMuX3NjcmF0Y2hbMl0sdj10aGlzLl9zY3JhdGNoWzNdLHk9dGhpcy5fc2NyYXRjaFs0XSx4PSEwLGg9MDtoPHU7KytoLC0tYylnW2hdPWFbY10sdltoXT1vW2NdKnAsbVtoXT1hW2MrdV0seVtoXT1vW2MrdV0qcCx4PXgmJmdbaF09PT1tW2hdJiZ2W2hdPT09eVtoXSYmMD09PXZbaF07aWYoeClmb3IodmFyIGg9MDtoPHU7KytoKWlbaF09MDtlbHNle3MuZGVyaXZhdGl2ZShnLHYsbSx5LCh0LWYpL3AsaSk7Zm9yKHZhciBoPTA7aDx1OysraClpW2hdLz1wfX1yZXR1cm4gaX0sdS5sYXN0VD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3RpbWU7cmV0dXJuIHRbdC5sZW5ndGgtMV19LHUuc3RhYmxlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX3ZlbG9jaXR5LGU9dC5sZW5ndGgscj10aGlzLmRpbWVuc2lvbi0xO3I+PTA7LS1yKWlmKHRbLS1lXSlyZXR1cm4hMTtyZXR1cm4hMH0sdS5qdW1wPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubGFzdFQoKSxyPXRoaXMuZGltZW5zaW9uO2lmKCEodDxlfHxhcmd1bWVudHMubGVuZ3RoIT09cisxKSl7dmFyIGk9dGhpcy5fc3RhdGUsYT10aGlzLl92ZWxvY2l0eSxvPWkubGVuZ3RoLXRoaXMuZGltZW5zaW9uLHM9dGhpcy5ib3VuZHMsbD1zWzBdLHU9c1sxXTt0aGlzLl90aW1lLnB1c2goZSx0KTtmb3IodmFyIGM9MDtjPDI7KytjKWZvcih2YXIgaD0wO2g8cjsrK2gpaS5wdXNoKGlbbysrXSksYS5wdXNoKDApO3RoaXMuX3RpbWUucHVzaCh0KTtmb3IodmFyIGg9cjtoPjA7LS1oKWkucHVzaChuKGxbaC0xXSx1W2gtMV0sYXJndW1lbnRzW2hdKSksYS5wdXNoKDApfX0sdS5wdXNoPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubGFzdFQoKSxyPXRoaXMuZGltZW5zaW9uO2lmKCEodDxlfHxhcmd1bWVudHMubGVuZ3RoIT09cisxKSl7dmFyIGk9dGhpcy5fc3RhdGUsYT10aGlzLl92ZWxvY2l0eSxvPWkubGVuZ3RoLXRoaXMuZGltZW5zaW9uLHM9dC1lLGw9dGhpcy5ib3VuZHMsdT1sWzBdLGM9bFsxXSxoPXM+MWUtNj8xL3M6MDt0aGlzLl90aW1lLnB1c2godCk7Zm9yKHZhciBmPXI7Zj4wOy0tZil7dmFyIGQ9bih1W2YtMV0sY1tmLTFdLGFyZ3VtZW50c1tmXSk7aS5wdXNoKGQpLGEucHVzaCgoZC1pW28rK10pKmgpfX19LHUuc2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZGltZW5zaW9uO2lmKCEodDx0aGlzLmxhc3RUKCl8fGFyZ3VtZW50cy5sZW5ndGghPT1lKzEpKXt2YXIgcj10aGlzLl9zdGF0ZSxpPXRoaXMuX3ZlbG9jaXR5LGE9dGhpcy5ib3VuZHMsbz1hWzBdLHM9YVsxXTt0aGlzLl90aW1lLnB1c2godCk7Zm9yKHZhciBsPWU7bD4wOy0tbClyLnB1c2gobihvW2wtMV0sc1tsLTFdLGFyZ3VtZW50c1tsXSkpLGkucHVzaCgwKX19LHUubW92ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmxhc3RUKCkscj10aGlzLmRpbWVuc2lvbjtpZighKHQ8PWV8fGFyZ3VtZW50cy5sZW5ndGghPT1yKzEpKXt2YXIgaT10aGlzLl9zdGF0ZSxhPXRoaXMuX3ZlbG9jaXR5LG89aS5sZW5ndGgtdGhpcy5kaW1lbnNpb24scz10aGlzLmJvdW5kcyxsPXNbMF0sdT1zWzFdLGM9dC1lLGg9Yz4xZS02PzEvYzowO3RoaXMuX3RpbWUucHVzaCh0KTtmb3IodmFyIGY9cjtmPjA7LS1mKXt2YXIgZD1hcmd1bWVudHNbZl07aS5wdXNoKG4obFtmLTFdLHVbZi0xXSxpW28rK10rZCkpLGEucHVzaChkKmgpfX19LHUuaWRsZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmxhc3RUKCk7aWYoISh0PGUpKXt2YXIgcj10aGlzLmRpbWVuc2lvbixpPXRoaXMuX3N0YXRlLGE9dGhpcy5fdmVsb2NpdHksbz1pLmxlbmd0aC1yLHM9dGhpcy5ib3VuZHMsbD1zWzBdLHU9c1sxXSxjPXQtZTt0aGlzLl90aW1lLnB1c2godCk7Zm9yKHZhciBoPXItMTtoPj0wOy0taClpLnB1c2gobihsW2hdLHVbaF0saVtvXStjKmFbb10pKSxhLnB1c2goMCksbys9MX19fSx7ImJpbmFyeS1zZWFyY2gtYm91bmRzIjo1MywiY3ViaWMtaGVybWl0ZSI6OTAKfV0sMTA3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbixpLGEpe3RoaXMuX2NvbG9yPXQsdGhpcy5rZXk9ZSx0aGlzLnZhbHVlPXIsdGhpcy5sZWZ0PW4sdGhpcy5yaWdodD1pLHRoaXMuX2NvdW50PWF9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gbmV3IG4odC5fY29sb3IsdC5rZXksdC52YWx1ZSx0LmxlZnQsdC5yaWdodCx0Ll9jb3VudCl9ZnVuY3Rpb24gYSh0LGUpe3JldHVybiBuZXcgbih0LGUua2V5LGUudmFsdWUsZS5sZWZ0LGUucmlnaHQsZS5fY291bnQpfWZ1bmN0aW9uIG8odCl7dC5fY291bnQ9MSsodC5sZWZ0P3QubGVmdC5fY291bnQ6MCkrKHQucmlnaHQ/dC5yaWdodC5fY291bnQ6MCl9ZnVuY3Rpb24gcyh0LGUpe3RoaXMuX2NvbXBhcmU9dCx0aGlzLnJvb3Q9ZX1mdW5jdGlvbiBsKHQsZSl7aWYoZS5sZWZ0KXt2YXIgcj1sKHQsZS5sZWZ0KTtpZihyKXJldHVybiByfXZhciByPXQoZS5rZXksZS52YWx1ZSk7cmV0dXJuIHI/cjplLnJpZ2h0P2wodCxlLnJpZ2h0KTp2b2lkIDB9ZnVuY3Rpb24gdSh0LGUscixuKXt2YXIgaT1lKHQsbi5rZXkpO2lmKGk8PTApe2lmKG4ubGVmdCl7dmFyIGE9dSh0LGUscixuLmxlZnQpO2lmKGEpcmV0dXJuIGF9dmFyIGE9cihuLmtleSxuLnZhbHVlKTtpZihhKXJldHVybiBhfWlmKG4ucmlnaHQpcmV0dXJuIHUodCxlLHIsbi5yaWdodCl9ZnVuY3Rpb24gYyh0LGUscixuLGkpe3ZhciBhLG89cih0LGkua2V5KSxzPXIoZSxpLmtleSk7aWYobzw9MCl7aWYoaS5sZWZ0JiYoYT1jKHQsZSxyLG4saS5sZWZ0KSkpcmV0dXJuIGE7aWYocz4wJiYoYT1uKGkua2V5LGkudmFsdWUpKSlyZXR1cm4gYX1pZihzPjAmJmkucmlnaHQpcmV0dXJuIGModCxlLHIsbixpLnJpZ2h0KX1mdW5jdGlvbiBoKHQsZSl7dGhpcy50cmVlPXQsdGhpcy5fc3RhY2s9ZX1mdW5jdGlvbiBmKHQsZSl7dC5rZXk9ZS5rZXksdC52YWx1ZT1lLnZhbHVlLHQubGVmdD1lLmxlZnQsdC5yaWdodD1lLnJpZ2h0LHQuX2NvbG9yPWUuX2NvbG9yLHQuX2NvdW50PWUuX2NvdW50fWZ1bmN0aW9uIGQodCl7Zm9yKHZhciBlLHIsbixzLGw9dC5sZW5ndGgtMTtsPj0wOy0tbCl7aWYoZT10W2xdLDA9PT1sKXJldHVybiB2b2lkKGUuX2NvbG9yPXYpO2lmKHI9dFtsLTFdLHIubGVmdD09PWUpe2lmKG49ci5yaWdodCxuLnJpZ2h0JiZuLnJpZ2h0Ll9jb2xvcj09PW0pe2lmKG49ci5yaWdodD1pKG4pLHM9bi5yaWdodD1pKG4ucmlnaHQpLHIucmlnaHQ9bi5sZWZ0LG4ubGVmdD1yLG4ucmlnaHQ9cyxuLl9jb2xvcj1yLl9jb2xvcixlLl9jb2xvcj12LHIuX2NvbG9yPXYscy5fY29sb3I9dixvKHIpLG8obiksbD4xKXt2YXIgdT10W2wtMl07dS5sZWZ0PT09cj91LmxlZnQ9bjp1LnJpZ2h0PW59cmV0dXJuIHZvaWQodFtsLTFdPW4pfWlmKG4ubGVmdCYmbi5sZWZ0Ll9jb2xvcj09PW0pe2lmKG49ci5yaWdodD1pKG4pLHM9bi5sZWZ0PWkobi5sZWZ0KSxyLnJpZ2h0PXMubGVmdCxuLmxlZnQ9cy5yaWdodCxzLmxlZnQ9cixzLnJpZ2h0PW4scy5fY29sb3I9ci5fY29sb3Isci5fY29sb3I9dixuLl9jb2xvcj12LGUuX2NvbG9yPXYsbyhyKSxvKG4pLG8ocyksbD4xKXt2YXIgdT10W2wtMl07dS5sZWZ0PT09cj91LmxlZnQ9czp1LnJpZ2h0PXN9cmV0dXJuIHZvaWQodFtsLTFdPXMpfWlmKG4uX2NvbG9yPT09dil7aWYoci5fY29sb3I9PT1tKXJldHVybiByLl9jb2xvcj12LHZvaWQoci5yaWdodD1hKG0sbikpO3IucmlnaHQ9YShtLG4pO2NvbnRpbnVlfWlmKG49aShuKSxyLnJpZ2h0PW4ubGVmdCxuLmxlZnQ9cixuLl9jb2xvcj1yLl9jb2xvcixyLl9jb2xvcj1tLG8ociksbyhuKSxsPjEpe3ZhciB1PXRbbC0yXTt1LmxlZnQ9PT1yP3UubGVmdD1uOnUucmlnaHQ9bn10W2wtMV09bix0W2xdPXIsbCsxPHQubGVuZ3RoP3RbbCsxXT1lOnQucHVzaChlKSxsKz0yfWVsc2V7aWYobj1yLmxlZnQsbi5sZWZ0JiZuLmxlZnQuX2NvbG9yPT09bSl7aWYobj1yLmxlZnQ9aShuKSxzPW4ubGVmdD1pKG4ubGVmdCksci5sZWZ0PW4ucmlnaHQsbi5yaWdodD1yLG4ubGVmdD1zLG4uX2NvbG9yPXIuX2NvbG9yLGUuX2NvbG9yPXYsci5fY29sb3I9dixzLl9jb2xvcj12LG8ociksbyhuKSxsPjEpe3ZhciB1PXRbbC0yXTt1LnJpZ2h0PT09cj91LnJpZ2h0PW46dS5sZWZ0PW59cmV0dXJuIHZvaWQodFtsLTFdPW4pfWlmKG4ucmlnaHQmJm4ucmlnaHQuX2NvbG9yPT09bSl7aWYobj1yLmxlZnQ9aShuKSxzPW4ucmlnaHQ9aShuLnJpZ2h0KSxyLmxlZnQ9cy5yaWdodCxuLnJpZ2h0PXMubGVmdCxzLnJpZ2h0PXIscy5sZWZ0PW4scy5fY29sb3I9ci5fY29sb3Isci5fY29sb3I9dixuLl9jb2xvcj12LGUuX2NvbG9yPXYsbyhyKSxvKG4pLG8ocyksbD4xKXt2YXIgdT10W2wtMl07dS5yaWdodD09PXI/dS5yaWdodD1zOnUubGVmdD1zfXJldHVybiB2b2lkKHRbbC0xXT1zKX1pZihuLl9jb2xvcj09PXYpe2lmKHIuX2NvbG9yPT09bSlyZXR1cm4gci5fY29sb3I9dix2b2lkKHIubGVmdD1hKG0sbikpO3IubGVmdD1hKG0sbik7Y29udGludWV9aWYobj1pKG4pLHIubGVmdD1uLnJpZ2h0LG4ucmlnaHQ9cixuLl9jb2xvcj1yLl9jb2xvcixyLl9jb2xvcj1tLG8ociksbyhuKSxsPjEpe3ZhciB1PXRbbC0yXTt1LnJpZ2h0PT09cj91LnJpZ2h0PW46dS5sZWZ0PW59dFtsLTFdPW4sdFtsXT1yLGwrMTx0Lmxlbmd0aD90W2wrMV09ZTp0LnB1c2goZSksbCs9Mn19fWZ1bmN0aW9uIHAodCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOjB9ZnVuY3Rpb24gZyh0KXtyZXR1cm4gbmV3IHModHx8cCxudWxsKX1lLmV4cG9ydHM9Zzt2YXIgbT0wLHY9MSx5PXMucHJvdG90eXBlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJrZXlzIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMuZm9yRWFjaChmdW5jdGlvbihlLHIpe3QucHVzaChlKX0pLHR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHksInZhbHVlcyIse2dldDpmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24oZSxyKXt0LnB1c2gocil9KSx0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJsZW5ndGgiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb290P3RoaXMucm9vdC5fY291bnQ6MH19KSx5Lmluc2VydD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10aGlzLl9jb21wYXJlLGk9dGhpcy5yb290LGw9W10sdT1bXTtpOyl7dmFyIGM9cih0LGkua2V5KTtsLnB1c2goaSksdS5wdXNoKGMpLGk9Yzw9MD9pLmxlZnQ6aS5yaWdodH1sLnB1c2gobmV3IG4obSx0LGUsbnVsbCxudWxsLDEpKTtmb3IodmFyIGg9bC5sZW5ndGgtMjtoPj0wOy0taCl7dmFyIGk9bFtoXTt1W2hdPD0wP2xbaF09bmV3IG4oaS5fY29sb3IsaS5rZXksaS52YWx1ZSxsW2grMV0saS5yaWdodCxpLl9jb3VudCsxKTpsW2hdPW5ldyBuKGkuX2NvbG9yLGkua2V5LGkudmFsdWUsaS5sZWZ0LGxbaCsxXSxpLl9jb3VudCsxKX1mb3IodmFyIGg9bC5sZW5ndGgtMTtoPjE7LS1oKXt2YXIgZj1sW2gtMV0saT1sW2hdO2lmKGYuX2NvbG9yPT09dnx8aS5fY29sb3I9PT12KWJyZWFrO3ZhciBkPWxbaC0yXTtpZihkLmxlZnQ9PT1mKWlmKGYubGVmdD09PWkpe3ZhciBwPWQucmlnaHQ7aWYoIXB8fHAuX2NvbG9yIT09bSl7aWYoZC5fY29sb3I9bSxkLmxlZnQ9Zi5yaWdodCxmLl9jb2xvcj12LGYucmlnaHQ9ZCxsW2gtMl09ZixsW2gtMV09aSxvKGQpLG8oZiksaD49Myl7dmFyIGc9bFtoLTNdO2cubGVmdD09PWQ/Zy5sZWZ0PWY6Zy5yaWdodD1mfWJyZWFrfWYuX2NvbG9yPXYsZC5yaWdodD1hKHYscCksZC5fY29sb3I9bSxoLT0xfWVsc2V7dmFyIHA9ZC5yaWdodDtpZighcHx8cC5fY29sb3IhPT1tKXtpZihmLnJpZ2h0PWkubGVmdCxkLl9jb2xvcj1tLGQubGVmdD1pLnJpZ2h0LGkuX2NvbG9yPXYsaS5sZWZ0PWYsaS5yaWdodD1kLGxbaC0yXT1pLGxbaC0xXT1mLG8oZCksbyhmKSxvKGkpLGg+PTMpe3ZhciBnPWxbaC0zXTtnLmxlZnQ9PT1kP2cubGVmdD1pOmcucmlnaHQ9aX1icmVha31mLl9jb2xvcj12LGQucmlnaHQ9YSh2LHApLGQuX2NvbG9yPW0saC09MX1lbHNlIGlmKGYucmlnaHQ9PT1pKXt2YXIgcD1kLmxlZnQ7aWYoIXB8fHAuX2NvbG9yIT09bSl7aWYoZC5fY29sb3I9bSxkLnJpZ2h0PWYubGVmdCxmLl9jb2xvcj12LGYubGVmdD1kLGxbaC0yXT1mLGxbaC0xXT1pLG8oZCksbyhmKSxoPj0zKXt2YXIgZz1sW2gtM107Zy5yaWdodD09PWQ/Zy5yaWdodD1mOmcubGVmdD1mfWJyZWFrfWYuX2NvbG9yPXYsZC5sZWZ0PWEodixwKSxkLl9jb2xvcj1tLGgtPTF9ZWxzZXt2YXIgcD1kLmxlZnQ7aWYoIXB8fHAuX2NvbG9yIT09bSl7aWYoZi5sZWZ0PWkucmlnaHQsZC5fY29sb3I9bSxkLnJpZ2h0PWkubGVmdCxpLl9jb2xvcj12LGkucmlnaHQ9ZixpLmxlZnQ9ZCxsW2gtMl09aSxsW2gtMV09ZixvKGQpLG8oZiksbyhpKSxoPj0zKXt2YXIgZz1sW2gtM107Zy5yaWdodD09PWQ/Zy5yaWdodD1pOmcubGVmdD1pfWJyZWFrfWYuX2NvbG9yPXYsZC5sZWZ0PWEodixwKSxkLl9jb2xvcj1tLGgtPTF9fXJldHVybiBsWzBdLl9jb2xvcj12LG5ldyBzKHIsbFswXSl9LHkuZm9yRWFjaD1mdW5jdGlvbih0LGUscil7aWYodGhpcy5yb290KXN3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDE6cmV0dXJuIGwodCx0aGlzLnJvb3QpO2Nhc2UgMjpyZXR1cm4gdShlLHRoaXMuX2NvbXBhcmUsdCx0aGlzLnJvb3QpO2Nhc2UgMzppZih0aGlzLl9jb21wYXJlKGUscik+PTApcmV0dXJuO3JldHVybiBjKGUscix0aGlzLl9jb21wYXJlLHQsdGhpcy5yb290KX19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJiZWdpbiIse2dldDpmdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPXRoaXMucm9vdDtlOyl0LnB1c2goZSksZT1lLmxlZnQ7cmV0dXJuIG5ldyBoKHRoaXMsdCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHksImVuZCIse2dldDpmdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPXRoaXMucm9vdDtlOyl0LnB1c2goZSksZT1lLnJpZ2h0O3JldHVybiBuZXcgaCh0aGlzLHQpfX0pLHkuYXQ9ZnVuY3Rpb24odCl7aWYodDwwKXJldHVybiBuZXcgaCh0aGlzLFtdKTtmb3IodmFyIGU9dGhpcy5yb290LHI9W107Oyl7aWYoci5wdXNoKGUpLGUubGVmdCl7aWYodDxlLmxlZnQuX2NvdW50KXtlPWUubGVmdDtjb250aW51ZX10LT1lLmxlZnQuX2NvdW50fWlmKCF0KXJldHVybiBuZXcgaCh0aGlzLHIpO2lmKHQtPTEsIWUucmlnaHQpYnJlYWs7aWYodD49ZS5yaWdodC5fY291bnQpYnJlYWs7ZT1lLnJpZ2h0fXJldHVybiBuZXcgaCh0aGlzLFtdKX0seS5nZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fY29tcGFyZSxyPXRoaXMucm9vdCxuPVtdLGk9MDtyOyl7dmFyIGE9ZSh0LHIua2V5KTtuLnB1c2gociksYTw9MCYmKGk9bi5sZW5ndGgpLHI9YTw9MD9yLmxlZnQ6ci5yaWdodH1yZXR1cm4gbi5sZW5ndGg9aSxuZXcgaCh0aGlzLG4pfSx5Lmd0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9jb21wYXJlLHI9dGhpcy5yb290LG49W10saT0wO3I7KXt2YXIgYT1lKHQsci5rZXkpO24ucHVzaChyKSxhPDAmJihpPW4ubGVuZ3RoKSxyPWE8MD9yLmxlZnQ6ci5yaWdodH1yZXR1cm4gbi5sZW5ndGg9aSxuZXcgaCh0aGlzLG4pfSx5Lmx0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9jb21wYXJlLHI9dGhpcy5yb290LG49W10saT0wO3I7KXt2YXIgYT1lKHQsci5rZXkpO24ucHVzaChyKSxhPjAmJihpPW4ubGVuZ3RoKSxyPWE8PTA/ci5sZWZ0OnIucmlnaHR9cmV0dXJuIG4ubGVuZ3RoPWksbmV3IGgodGhpcyxuKX0seS5sZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fY29tcGFyZSxyPXRoaXMucm9vdCxuPVtdLGk9MDtyOyl7dmFyIGE9ZSh0LHIua2V5KTtuLnB1c2gociksYT49MCYmKGk9bi5sZW5ndGgpLHI9YTwwP3IubGVmdDpyLnJpZ2h0fXJldHVybiBuLmxlbmd0aD1pLG5ldyBoKHRoaXMsbil9LHkuZmluZD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fY29tcGFyZSxyPXRoaXMucm9vdCxuPVtdO3I7KXt2YXIgaT1lKHQsci5rZXkpO2lmKG4ucHVzaChyKSwwPT09aSlyZXR1cm4gbmV3IGgodGhpcyxuKTtyPWk8PTA/ci5sZWZ0OnIucmlnaHR9cmV0dXJuIG5ldyBoKHRoaXMsW10pfSx5LnJlbW92ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmZpbmQodCk7cmV0dXJuIGU/ZS5yZW1vdmUoKTp0aGlzfSx5LmdldD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fY29tcGFyZSxyPXRoaXMucm9vdDtyOyl7dmFyIG49ZSh0LHIua2V5KTtpZigwPT09bilyZXR1cm4gci52YWx1ZTtyPW48PTA/ci5sZWZ0OnIucmlnaHR9fTt2YXIgeD1oLnByb3RvdHlwZTtPYmplY3QuZGVmaW5lUHJvcGVydHkoeCwidmFsaWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3RhY2subGVuZ3RoPjB9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHgsIm5vZGUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3RhY2subGVuZ3RoPjA/dGhpcy5fc3RhY2tbdGhpcy5fc3RhY2subGVuZ3RoLTFdOm51bGx9LGVudW1lcmFibGU6ITB9KSx4LmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBoKHRoaXMudHJlZSx0aGlzLl9zdGFjay5zbGljZSgpKX0seC5yZW1vdmU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9zdGFjaztpZigwPT09dC5sZW5ndGgpcmV0dXJuIHRoaXMudHJlZTt2YXIgZT1uZXcgQXJyYXkodC5sZW5ndGgpLHI9dFt0Lmxlbmd0aC0xXTtlW2UubGVuZ3RoLTFdPW5ldyBuKHIuX2NvbG9yLHIua2V5LHIudmFsdWUsci5sZWZ0LHIucmlnaHQsci5fY291bnQpO2Zvcih2YXIgaT10Lmxlbmd0aC0yO2k+PTA7LS1pKXt2YXIgcj10W2ldO3IubGVmdD09PXRbaSsxXT9lW2ldPW5ldyBuKHIuX2NvbG9yLHIua2V5LHIudmFsdWUsZVtpKzFdLHIucmlnaHQsci5fY291bnQpOmVbaV09bmV3IG4oci5fY29sb3Isci5rZXksci52YWx1ZSxyLmxlZnQsZVtpKzFdLHIuX2NvdW50KX1pZihyPWVbZS5sZW5ndGgtMV0sci5sZWZ0JiZyLnJpZ2h0KXt2YXIgYT1lLmxlbmd0aDtmb3Iocj1yLmxlZnQ7ci5yaWdodDspZS5wdXNoKHIpLHI9ci5yaWdodDt2YXIgbz1lW2EtMV07ZS5wdXNoKG5ldyBuKHIuX2NvbG9yLG8ua2V5LG8udmFsdWUsci5sZWZ0LHIucmlnaHQsci5fY291bnQpKSxlW2EtMV0ua2V5PXIua2V5LGVbYS0xXS52YWx1ZT1yLnZhbHVlO2Zvcih2YXIgaT1lLmxlbmd0aC0yO2k+PWE7LS1pKXI9ZVtpXSxlW2ldPW5ldyBuKHIuX2NvbG9yLHIua2V5LHIudmFsdWUsci5sZWZ0LGVbaSsxXSxyLl9jb3VudCk7ZVthLTFdLmxlZnQ9ZVthXX1pZihyPWVbZS5sZW5ndGgtMV0sci5fY29sb3I9PT1tKXt2YXIgbD1lW2UubGVuZ3RoLTJdO2wubGVmdD09PXI/bC5sZWZ0PW51bGw6bC5yaWdodD09PXImJihsLnJpZ2h0PW51bGwpLGUucG9wKCk7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDsrK2kpZVtpXS5fY291bnQtLTtyZXR1cm4gbmV3IHModGhpcy50cmVlLl9jb21wYXJlLGVbMF0pfWlmKHIubGVmdHx8ci5yaWdodCl7ci5sZWZ0P2YocixyLmxlZnQpOnIucmlnaHQmJmYocixyLnJpZ2h0KSxyLl9jb2xvcj12O2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGgtMTsrK2kpZVtpXS5fY291bnQtLTtyZXR1cm4gbmV3IHModGhpcy50cmVlLl9jb21wYXJlLGVbMF0pfWlmKDE9PT1lLmxlbmd0aClyZXR1cm4gbmV3IHModGhpcy50cmVlLl9jb21wYXJlLG51bGwpO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7KytpKWVbaV0uX2NvdW50LS07dmFyIHU9ZVtlLmxlbmd0aC0yXTtyZXR1cm4gZChlKSx1LmxlZnQ9PT1yP3UubGVmdD1udWxsOnUucmlnaHQ9bnVsbCxuZXcgcyh0aGlzLnRyZWUuX2NvbXBhcmUsZVswXSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh4LCJrZXkiLHtnZXQ6ZnVuY3Rpb24oKXtpZih0aGlzLl9zdGFjay5sZW5ndGg+MClyZXR1cm4gdGhpcy5fc3RhY2tbdGhpcy5fc3RhY2subGVuZ3RoLTFdLmtleX0sZW51bWVyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh4LCJ2YWx1ZSIse2dldDpmdW5jdGlvbigpe2lmKHRoaXMuX3N0YWNrLmxlbmd0aD4wKXJldHVybiB0aGlzLl9zdGFja1t0aGlzLl9zdGFjay5sZW5ndGgtMV0udmFsdWV9LGVudW1lcmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeCwiaW5kZXgiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD0wLGU9dGhpcy5fc3RhY2s7aWYoMD09PWUubGVuZ3RoKXt2YXIgcj10aGlzLnRyZWUucm9vdDtyZXR1cm4gcj9yLl9jb3VudDowfWVbZS5sZW5ndGgtMV0ubGVmdCYmKHQ9ZVtlLmxlbmd0aC0xXS5sZWZ0Ll9jb3VudCk7Zm9yKHZhciBuPWUubGVuZ3RoLTI7bj49MDstLW4pZVtuKzFdPT09ZVtuXS5yaWdodCYmKCsrdCxlW25dLmxlZnQmJih0Kz1lW25dLmxlZnQuX2NvdW50KSk7cmV0dXJuIHR9LGVudW1lcmFibGU6ITB9KSx4Lm5leHQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9zdGFjaztpZigwIT09dC5sZW5ndGgpe3ZhciBlPXRbdC5sZW5ndGgtMV07aWYoZS5yaWdodClmb3IoZT1lLnJpZ2h0O2U7KXQucHVzaChlKSxlPWUubGVmdDtlbHNlIGZvcih0LnBvcCgpO3QubGVuZ3RoPjAmJnRbdC5sZW5ndGgtMV0ucmlnaHQ9PT1lOyllPXRbdC5sZW5ndGgtMV0sdC5wb3AoKX19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh4LCJoYXNOZXh0Iix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fc3RhY2s7aWYoMD09PXQubGVuZ3RoKXJldHVybiExO2lmKHRbdC5sZW5ndGgtMV0ucmlnaHQpcmV0dXJuITA7Zm9yKHZhciBlPXQubGVuZ3RoLTE7ZT4wOy0tZSlpZih0W2UtMV0ubGVmdD09PXRbZV0pcmV0dXJuITA7cmV0dXJuITF9fSkseC51cGRhdGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fc3RhY2s7aWYoMD09PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQ2FuJ3QgdXBkYXRlIGVtcHR5IG5vZGUhIik7dmFyIHI9bmV3IEFycmF5KGUubGVuZ3RoKSxpPWVbZS5sZW5ndGgtMV07cltyLmxlbmd0aC0xXT1uZXcgbihpLl9jb2xvcixpLmtleSx0LGkubGVmdCxpLnJpZ2h0LGkuX2NvdW50KTtmb3IodmFyIGE9ZS5sZW5ndGgtMjthPj0wOy0tYSlpPWVbYV0saS5sZWZ0PT09ZVthKzFdP3JbYV09bmV3IG4oaS5fY29sb3IsaS5rZXksaS52YWx1ZSxyW2ErMV0saS5yaWdodCxpLl9jb3VudCk6clthXT1uZXcgbihpLl9jb2xvcixpLmtleSxpLnZhbHVlLGkubGVmdCxyW2ErMV0saS5fY291bnQpO3JldHVybiBuZXcgcyh0aGlzLnRyZWUuX2NvbXBhcmUsclswXSl9LHgucHJldj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3N0YWNrO2lmKDAhPT10Lmxlbmd0aCl7dmFyIGU9dFt0Lmxlbmd0aC0xXTtpZihlLmxlZnQpZm9yKGU9ZS5sZWZ0O2U7KXQucHVzaChlKSxlPWUucmlnaHQ7ZWxzZSBmb3IodC5wb3AoKTt0Lmxlbmd0aD4wJiZ0W3QubGVuZ3RoLTFdLmxlZnQ9PT1lOyllPXRbdC5sZW5ndGgtMV0sdC5wb3AoKX19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh4LCJoYXNQcmV2Iix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fc3RhY2s7aWYoMD09PXQubGVuZ3RoKXJldHVybiExO2lmKHRbdC5sZW5ndGgtMV0ubGVmdClyZXR1cm4hMDtmb3IodmFyIGU9dC5sZW5ndGgtMTtlPjA7LS1lKWlmKHRbZS0xXS5yaWdodD09PXRbZV0pcmV0dXJuITA7cmV0dXJuITF9fSl9LHt9XSwxMDg6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQpe2lmKHQ8MClyZXR1cm4gTnVtYmVyKCIwLzAiKTtmb3IodmFyIGU9c1swXSxyPXMubGVuZ3RoLTE7cj4wOy0tcillKz1zW3JdLyh0K3IpO3ZhciBuPXQrbysuNTtyZXR1cm4uNSpNYXRoLmxvZygyKk1hdGguUEkpKyh0Ky41KSpNYXRoLmxvZyhuKS1uK01hdGgubG9nKGUpLU1hdGgubG9nKHQpfXZhciBpPTcsYT1bLjk5OTk5OTk5OTk5OTgwOTksNjc2LjUyMDM2ODEyMTg4NTEsLTEyNTkuMTM5MjE2NzIyNDAyOCw3NzEuMzIzNDI4Nzc3NjUzMSwtMTc2LjYxNTAyOTE2MjE0MDYsMTIuNTA3MzQzMjc4Njg2OTA1LC0uMTM4NTcxMDk1MjY1NzIwMTIsOTk4NDM2OTU3ODAxOTU3MmUtMjEsMS41MDU2MzI3MzUxNDkzMTE2ZS03XSxvPTYwNy8xMjgscz1bLjk5OTk5OTk5OTk5OTk5NzEsNTcuMTU2MjM1NjY1ODYyOTIsLTU5LjU5Nzk2MDM1NTQ3NTQ5LDE0LjEzNjA5Nzk3NDc0MTc0NiwtLjQ5MTkxMzgxNjA5NzYyMDIsMzM5OTQ2NDk5ODQ4MTE4OWUtMjAsNDY1MjM2Mjg5MjcwNDg1OGUtMjAsLTk4Mzc0NDc1MzA0ODc5NTZlLTIwLC4wMDAxNTgwODg3MDMyMjQ5MTI1LC0uMDAwMjEwMjY0NDQxNzI0MTA0ODgsLjAwMDIxNzQzOTYxODExNTIxMjY1LC0uMDAwMTY0MzE4MTA2NTM2NzYzOSw4NDQxODIyMzk4Mzg1Mjc1ZS0yMCwtMjYxOTA4Mzg0MDE1ODE0MDhlLTIxLDM2ODk5MTgyNjU5NTMxNjI1ZS0yMl07ZS5leHBvcnRzPWZ1bmN0aW9uIHQoZSl7aWYoZTwuNSlyZXR1cm4gTWF0aC5QSS8oTWF0aC5zaW4oTWF0aC5QSSplKSp0KDEtZSkpO2lmKGU+MTAwKXJldHVybiBNYXRoLmV4cChuKGUpKTtlLT0xO2Zvcih2YXIgcj1hWzBdLG89MTtvPGkrMjtvKyspcis9YVtvXS8oZStvKTt2YXIgcz1lK2krLjU7cmV0dXJuIE1hdGguc3FydCgyKk1hdGguUEkpKk1hdGgucG93KHMsZSsuNSkqTWF0aC5leHAoLXMpKnJ9LGUuZXhwb3J0cy5sb2c9bn0se31dLDEwOTpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCl7aWYoIlBvbHlnb24iPT09dC50eXBlKXJldHVybiBpKHQuY29vcmRpbmF0ZXMpO2lmKCJNdWx0aVBvbHlnb24iPT09dC50eXBlKXtmb3IodmFyIGU9MCxyPTA7cjx0LmNvb3JkaW5hdGVzLmxlbmd0aDtyKyspZSs9aSh0LmNvb3JkaW5hdGVzW3JdKTtyZXR1cm4gZX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBpKHQpe3ZhciBlPTA7aWYodCYmdC5sZW5ndGg+MCl7ZSs9TWF0aC5hYnMoYSh0WzBdKSk7Zm9yKHZhciByPTE7cjx0Lmxlbmd0aDtyKyspZS09TWF0aC5hYnMoYSh0W3JdKSl9cmV0dXJuIGV9ZnVuY3Rpb24gYSh0KXt2YXIgZT0wO2lmKHQubGVuZ3RoPjIpe2Zvcih2YXIgcixuLGk9MDtpPHQubGVuZ3RoLTE7aSsrKXI9dFtpXSxuPXRbaSsxXSxlKz1vKG5bMF0tclswXSkqKDIrTWF0aC5zaW4obyhyWzFdKSkrTWF0aC5zaW4obyhuWzFdKSkpO2U9ZSpzLlJBRElVUypzLlJBRElVUy8yfXJldHVybiBlfWZ1bmN0aW9uIG8odCl7cmV0dXJuIHQqTWF0aC5QSS8xODB9dmFyIHM9dCgid2dzODQiKTtlLmV4cG9ydHMuZ2VvbWV0cnk9bixlLmV4cG9ydHMucmluZz1hfSx7d2dzODQ6NTIwfV0sMTEwOltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUpe3N3aXRjaCh0JiZ0LnR5cGV8fG51bGwpe2Nhc2UiRmVhdHVyZUNvbGxlY3Rpb24iOnJldHVybiB0LmZlYXR1cmVzPXQuZmVhdHVyZXMubWFwKGkobixlKSksdDtjYXNlIkZlYXR1cmUiOnJldHVybiB0Lmdlb21ldHJ5PW4odC5nZW9tZXRyeSxlKSx0O2Nhc2UiUG9seWdvbiI6Y2FzZSJNdWx0aVBvbHlnb24iOnJldHVybiBhKHQsZSk7ZGVmYXVsdDpyZXR1cm4gdH19ZnVuY3Rpb24gaSh0LGUpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gdChyLGUpfX1mdW5jdGlvbiBhKHQsZSl7cmV0dXJuIlBvbHlnb24iPT09dC50eXBlP3QuY29vcmRpbmF0ZXM9byh0LmNvb3JkaW5hdGVzLGUpOiJNdWx0aVBvbHlnb24iPT09dC50eXBlJiYodC5jb29yZGluYXRlcz10LmNvb3JkaW5hdGVzLm1hcChpKG8sZSkpKSx0fWZ1bmN0aW9uIG8odCxlKXtlPSEhZSx0WzBdPXModFswXSwhZSk7Zm9yKHZhciByPTE7cjx0Lmxlbmd0aDtyKyspdFtyXT1zKHRbcl0sZSk7cmV0dXJuIHR9ZnVuY3Rpb24gcyh0LGUpe3JldHVybiBsKHQpPT09ZT90OnQucmV2ZXJzZSgpfWZ1bmN0aW9uIGwodCl7cmV0dXJuIHUucmluZyh0KT49MH12YXIgdT10KCJnZW9qc29uLWFyZWEiKTtlLmV4cG9ydHM9bn0seyJnZW9qc29uLWFyZWEiOjEwOX1dLDExMTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyLG4sbyxsLHUsYyl7aWYoci89ZSxuLz1lLHU+PXImJmM8PW4pcmV0dXJuIHQ7aWYodT5ufHxjPHIpcmV0dXJuIG51bGw7Zm9yKHZhciBoPVtdLGY9MDtmPHQubGVuZ3RoO2YrKyl7dmFyIGQscCxnPXRbZl0sbT1nLmdlb21ldHJ5LHY9Zy50eXBlO2lmKGQ9Zy5taW5bb10scD1nLm1heFtvXSxkPj1yJiZwPD1uKWgucHVzaChnKTtlbHNlIGlmKCEoZD5ufHxwPHIpKXt2YXIgeT0xPT09dj9pKG0scixuLG8pOmEobSxyLG4sbyxsLDM9PT12KTt5Lmxlbmd0aCYmaC5wdXNoKHMoZy50YWdzLHYseSxnLmlkKSl9fXJldHVybiBoLmxlbmd0aD9oOm51bGx9ZnVuY3Rpb24gaSh0LGUscixuKXtmb3IodmFyIGk9W10sYT0wO2E8dC5sZW5ndGg7YSsrKXt2YXIgbz10W2FdLHM9b1tuXTtzPj1lJiZzPD1yJiZpLnB1c2gobyl9cmV0dXJuIGl9ZnVuY3Rpb24gYSh0LGUscixuLGksYSl7Zm9yKHZhciBzPVtdLGw9MDtsPHQubGVuZ3RoO2wrKyl7dmFyIHUsYyxoLGY9MCxkPTAscD1udWxsLGc9dFtsXSxtPWcuYXJlYSx2PWcuZGlzdCx5PWcub3V0ZXIseD1nLmxlbmd0aCxiPVtdO2ZvcihjPTA7Yzx4LTE7YysrKXU9cHx8Z1tjXSxwPWdbYysxXSxmPWR8fHVbbl0sZD1wW25dLGY8ZT9kPnI/KGIucHVzaChpKHUscCxlKSxpKHUscCxyKSksYXx8KGI9byhzLGIsbSx2LHkpKSk6ZD49ZSYmYi5wdXNoKGkodSxwLGUpKTpmPnI/ZDxlPyhiLnB1c2goaSh1LHAsciksaSh1LHAsZSkpLGF8fChiPW8ocyxiLG0sdix5KSkpOmQ8PXImJmIucHVzaChpKHUscCxyKSk6KGIucHVzaCh1KSxkPGU/KGIucHVzaChpKHUscCxlKSksYXx8KGI9byhzLGIsbSx2LHkpKSk6ZD5yJiYoYi5wdXNoKGkodSxwLHIpKSxhfHwoYj1vKHMsYixtLHYseSkpKSk7dT1nW3gtMV0sZj11W25dLGY+PWUmJmY8PXImJmIucHVzaCh1KSxoPWJbYi5sZW5ndGgtMV0sYSYmaCYmKGJbMF1bMF0hPT1oWzBdfHxiWzBdWzFdIT09aFsxXSkmJmIucHVzaChiWzBdKSxvKHMsYixtLHYseSl9cmV0dXJuIHN9ZnVuY3Rpb24gbyh0LGUscixuLGkpe3JldHVybiBlLmxlbmd0aCYmKGUuYXJlYT1yLGUuZGlzdD1uLHZvaWQgMCE9PWkmJihlLm91dGVyPWkpLHQucHVzaChlKSksW119ZS5leHBvcnRzPW47dmFyIHM9dCgiLi9mZWF0dXJlIil9LHsiLi9mZWF0dXJlIjoxMTN9XSwxMTI6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3ZhciByPVtdO2lmKCJGZWF0dXJlQ29sbGVjdGlvbiI9PT10LnR5cGUpZm9yKHZhciBuPTA7bjx0LmZlYXR1cmVzLmxlbmd0aDtuKyspaShyLHQuZmVhdHVyZXNbbl0sZSk7ZWxzZSJGZWF0dXJlIj09PXQudHlwZT9pKHIsdCxlKTppKHIse2dlb21ldHJ5OnR9LGUpO3JldHVybiByfWZ1bmN0aW9uIGkodCxlLHIpe2lmKG51bGwhPT1lLmdlb21ldHJ5KXt2YXIgbixzLGwsYyxoPWUuZ2VvbWV0cnksZj1oLnR5cGUsZD1oLmNvb3JkaW5hdGVzLHA9ZS5wcm9wZXJ0aWVzLGc9ZS5pZDtpZigiUG9pbnQiPT09Zil0LnB1c2godShwLDEsW28oZCldLGcpKTtlbHNlIGlmKCJNdWx0aVBvaW50Ij09PWYpdC5wdXNoKHUocCwxLGEoZCksZykpO2Vsc2UgaWYoIkxpbmVTdHJpbmciPT09Zil0LnB1c2godShwLDIsW2EoZCxyKV0sZykpO2Vsc2UgaWYoIk11bHRpTGluZVN0cmluZyI9PT1mfHwiUG9seWdvbiI9PT1mKXtmb3IobD1bXSxuPTA7bjxkLmxlbmd0aDtuKyspYz1hKGRbbl0sciksIlBvbHlnb24iPT09ZiYmKGMub3V0ZXI9MD09PW4pLGwucHVzaChjKTt0LnB1c2godShwLCJQb2x5Z29uIj09PWY/MzoyLGwsZykpfWVsc2UgaWYoIk11bHRpUG9seWdvbiI9PT1mKXtmb3IobD1bXSxuPTA7bjxkLmxlbmd0aDtuKyspZm9yKHM9MDtzPGRbbl0ubGVuZ3RoO3MrKyljPWEoZFtuXVtzXSxyKSxjLm91dGVyPTA9PT1zLGwucHVzaChjKTt0LnB1c2godShwLDMsbCxnKSl9ZWxzZXtpZigiR2VvbWV0cnlDb2xsZWN0aW9uIiE9PWYpdGhyb3cgbmV3IEVycm9yKCJJbnB1dCBkYXRhIGlzIG5vdCBhIHZhbGlkIEdlb0pTT04gb2JqZWN0LiIpO2ZvcihuPTA7bjxoLmdlb21ldHJpZXMubGVuZ3RoO24rKylpKHQse2dlb21ldHJ5OmguZ2VvbWV0cmllc1tuXSxwcm9wZXJ0aWVzOnB9LHIpfX19ZnVuY3Rpb24gYSh0LGUpe2Zvcih2YXIgcj1bXSxuPTA7bjx0Lmxlbmd0aDtuKyspci5wdXNoKG8odFtuXSkpO3JldHVybiBlJiYobChyLGUpLHMocikpLHJ9ZnVuY3Rpb24gbyh0KXt2YXIgZT1NYXRoLnNpbih0WzFdKk1hdGguUEkvMTgwKSxyPXRbMF0vMzYwKy41LG49LjUtLjI1Kk1hdGgubG9nKCgxK2UpLygxLWUpKS9NYXRoLlBJO3JldHVybiBuPW48MD8wOm4+MT8xOm4sW3IsbiwwXX1mdW5jdGlvbiBzKHQpe2Zvcih2YXIgZSxyLG49MCxpPTAsYT0wO2E8dC5sZW5ndGgtMTthKyspZT1yfHx0W2FdLHI9dFthKzFdLG4rPWVbMF0qclsxXS1yWzBdKmVbMV0saSs9TWF0aC5hYnMoclswXS1lWzBdKStNYXRoLmFicyhyWzFdLWVbMV0pO3QuYXJlYT1NYXRoLmFicyhuLzIpLHQuZGlzdD1pfWUuZXhwb3J0cz1uO3ZhciBsPXQoIi4vc2ltcGxpZnkiKSx1PXQoIi4vZmVhdHVyZSIpfSx7Ii4vZmVhdHVyZSI6MTEzLCIuL3NpbXBsaWZ5IjoxMTV9XSwxMTM6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuKXt2YXIgYT17aWQ6bnx8bnVsbCx0eXBlOmUsZ2VvbWV0cnk6cix0YWdzOnR8fG51bGwsbWluOlsxLzAsMS8wXSxtYXg6Wy0oMS8wKSwtKDEvMCldfTtyZXR1cm4gaShhKSxhfWZ1bmN0aW9uIGkodCl7dmFyIGU9dC5nZW9tZXRyeSxyPXQubWluLG49dC5tYXg7aWYoMT09PXQudHlwZSlhKHIsbixlKTtlbHNlIGZvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKWEocixuLGVbaV0pO3JldHVybiB0fWZ1bmN0aW9uIGEodCxlLHIpe2Zvcih2YXIgbixpPTA7aTxyLmxlbmd0aDtpKyspbj1yW2ldLHRbMF09TWF0aC5taW4oblswXSx0WzBdKSxlWzBdPU1hdGgubWF4KG5bMF0sZVswXSksdFsxXT1NYXRoLm1pbihuWzFdLHRbMV0pLGVbMV09TWF0aC5tYXgoblsxXSxlWzFdKX1lLmV4cG9ydHM9bn0se31dLDExNDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIG5ldyBpKHQsZSl9ZnVuY3Rpb24gaSh0LGUpe2U9dGhpcy5vcHRpb25zPWwoT2JqZWN0LmNyZWF0ZSh0aGlzLm9wdGlvbnMpLGUpO3ZhciByPWUuZGVidWc7ciYmY29uc29sZS50aW1lKCJwcmVwcm9jZXNzIGRhdGEiKTt2YXIgbj0xPDxlLm1heFpvb20saT1jKHQsZS50b2xlcmFuY2UvKG4qZS5leHRlbnQpKTt0aGlzLnRpbGVzPXt9LHRoaXMudGlsZUNvb3Jkcz1bXSxyJiYoY29uc29sZS50aW1lRW5kKCJwcmVwcm9jZXNzIGRhdGEiKSxjb25zb2xlLmxvZygiaW5kZXg6IG1heFpvb206ICVkLCBtYXhQb2ludHM6ICVkIixlLmluZGV4TWF4Wm9vbSxlLmluZGV4TWF4UG9pbnRzKSxjb25zb2xlLnRpbWUoImdlbmVyYXRlIHRpbGVzIiksdGhpcy5zdGF0cz17fSx0aGlzLnRvdGFsPTApLGk9ZChpLGUuYnVmZmVyL2UuZXh0ZW50LG8pLGkubGVuZ3RoJiZ0aGlzLnNwbGl0VGlsZShpLDAsMCwwKSxyJiYoaS5sZW5ndGgmJmNvbnNvbGUubG9nKCJmZWF0dXJlczogJWQsIHBvaW50czogJWQiLHRoaXMudGlsZXNbMF0ubnVtRmVhdHVyZXMsdGhpcy50aWxlc1swXS5udW1Qb2ludHMpLGNvbnNvbGUudGltZUVuZCgiZ2VuZXJhdGUgdGlsZXMiKSxjb25zb2xlLmxvZygidGlsZXMgZ2VuZXJhdGVkOiIsdGhpcy50b3RhbCxKU09OLnN0cmluZ2lmeSh0aGlzLnN0YXRzKSkpfWZ1bmN0aW9uIGEodCxlLHIpe3JldHVybiAzMiooKDE8PHQpKnIrZSkrdH1mdW5jdGlvbiBvKHQsZSxyKXtyZXR1cm5bciwoci10WzBdKSooZVsxXS10WzFdKS8oZVswXS10WzBdKSt0WzFdLDFdfWZ1bmN0aW9uIHModCxlLHIpe3JldHVyblsoci10WzFdKSooZVswXS10WzBdKS8oZVsxXS10WzFdKSt0WzBdLHIsMV19ZnVuY3Rpb24gbCh0LGUpe2Zvcih2YXIgciBpbiBlKXRbcl09ZVtyXTtyZXR1cm4gdH1mdW5jdGlvbiB1KHQsZSxyKXt2YXIgbj10LnNvdXJjZTtpZigxIT09bi5sZW5ndGgpcmV0dXJuITE7dmFyIGk9blswXTtpZigzIT09aS50eXBlfHxpLmdlb21ldHJ5Lmxlbmd0aD4xKXJldHVybiExO3ZhciBhPWkuZ2VvbWV0cnlbMF0ubGVuZ3RoO2lmKDUhPT1hKXJldHVybiExO2Zvcih2YXIgbz0wO288YTtvKyspe3ZhciBzPWgucG9pbnQoaS5nZW9tZXRyeVswXVtvXSxlLHQuejIsdC54LHQueSk7aWYoc1swXSE9PS1yJiZzWzBdIT09ZStyfHxzWzFdIT09LXImJnNbMV0hPT1lK3IpcmV0dXJuITF9cmV0dXJuITB9ZS5leHBvcnRzPW47dmFyIGM9dCgiLi9jb252ZXJ0IiksaD10KCIuL3RyYW5zZm9ybSIpLGY9dCgiLi9jbGlwIiksZD10KCIuL3dyYXAiKSxwPXQoIi4vdGlsZSIpO2kucHJvdG90eXBlLm9wdGlvbnM9e21heFpvb206MTQsaW5kZXhNYXhab29tOjUsaW5kZXhNYXhQb2ludHM6MWU1LHNvbGlkQ2hpbGRyZW46ITEsdG9sZXJhbmNlOjMsZXh0ZW50OjQwOTYsYnVmZmVyOjY0LGRlYnVnOjB9LGkucHJvdG90eXBlLnNwbGl0VGlsZT1mdW5jdGlvbih0LGUscixuLGksbCxjKXtmb3IodmFyIGg9W3QsZSxyLG5dLGQ9dGhpcy5vcHRpb25zLGc9ZC5kZWJ1ZyxtPW51bGw7aC5sZW5ndGg7KXtuPWgucG9wKCkscj1oLnBvcCgpLGU9aC5wb3AoKSx0PWgucG9wKCk7dmFyIHY9MTw8ZSx5PWEoZSxyLG4pLHg9dGhpcy50aWxlc1t5XSxiPWU9PT1kLm1heFpvb20/MDpkLnRvbGVyYW5jZS8odipkLmV4dGVudCk7aWYoIXgmJihnPjEmJmNvbnNvbGUudGltZSgiY3JlYXRpb24iKSx4PXRoaXMudGlsZXNbeV09cCh0LHYscixuLGIsZT09PWQubWF4Wm9vbSksdGhpcy50aWxlQ29vcmRzLnB1c2goe3o6ZSx4OnIseTpufSksZykpe2c+MSYmKGNvbnNvbGUubG9nKCJ0aWxlIHolZC0lZC0lZCAoZmVhdHVyZXM6ICVkLCBwb2ludHM6ICVkLCBzaW1wbGlmaWVkOiAlZCkiLGUscixuLHgubnVtRmVhdHVyZXMseC5udW1Qb2ludHMseC5udW1TaW1wbGlmaWVkKSxjb25zb2xlLnRpbWVFbmQoImNyZWF0aW9uIikpO3ZhciBfPSJ6IitlO3RoaXMuc3RhdHNbX109KHRoaXMuc3RhdHNbX118fDApKzEsdGhpcy50b3RhbCsrfWlmKHguc291cmNlPXQsaSl7aWYoZT09PWQubWF4Wm9vbXx8ZT09PWkpY29udGludWU7dmFyIHc9MTw8aS1lO2lmKHIhPT1NYXRoLmZsb29yKGwvdyl8fG4hPT1NYXRoLmZsb29yKGMvdykpY29udGludWV9ZWxzZSBpZihlPT09ZC5pbmRleE1heFpvb218fHgubnVtUG9pbnRzPD1kLmluZGV4TWF4UG9pbnRzKWNvbnRpbnVlO2lmKGQuc29saWRDaGlsZHJlbnx8IXUoeCxkLmV4dGVudCxkLmJ1ZmZlcikpe3guc291cmNlPW51bGwsZz4xJiZjb25zb2xlLnRpbWUoImNsaXBwaW5nIik7dmFyIE0sQSxrLFQsRSxTLEw9LjUqZC5idWZmZXIvZC5leHRlbnQsej0uNS1MLEM9LjUrTCxJPTErTDtNPUE9az1UPW51bGwsRT1mKHQsdixyLUwscitDLDAsbyx4Lm1pblswXSx4Lm1heFswXSksUz1mKHQsdixyK3oscitJLDAsbyx4Lm1pblswXSx4Lm1heFswXSksRSYmKE09ZihFLHYsbi1MLG4rQywxLHMseC5taW5bMV0seC5tYXhbMV0pLEE9ZihFLHYsbit6LG4rSSwxLHMseC5taW5bMV0seC5tYXhbMV0pKSxTJiYoaz1mKFMsdixuLUwsbitDLDEscyx4Lm1pblsxXSx4Lm1heFsxXSksVD1mKFMsdixuK3osbitJLDEscyx4Lm1pblsxXSx4Lm1heFsxXSkpLGc+MSYmY29uc29sZS50aW1lRW5kKCJjbGlwcGluZyIpLHQubGVuZ3RoJiYoaC5wdXNoKE18fFtdLGUrMSwyKnIsMipuKSxoLnB1c2goQXx8W10sZSsxLDIqciwyKm4rMSksaC5wdXNoKGt8fFtdLGUrMSwyKnIrMSwyKm4pLGgucHVzaChUfHxbXSxlKzEsMipyKzEsMipuKzEpKX1lbHNlIGkmJihtPWUpfXJldHVybiBtfSxpLnByb3RvdHlwZS5nZXRUaWxlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLm9wdGlvbnMsaT1uLmV4dGVudCxvPW4uZGVidWcscz0xPDx0O2U9KGUlcytzKSVzO3ZhciBsPWEodCxlLHIpO2lmKHRoaXMudGlsZXNbbF0pcmV0dXJuIGgudGlsZSh0aGlzLnRpbGVzW2xdLGkpO28+MSYmY29uc29sZS5sb2coImRyaWxsaW5nIGRvd24gdG8geiVkLSVkLSVkIix0LGUscik7Zm9yKHZhciBjLGY9dCxkPWUscD1yOyFjJiZmPjA7KWYtLSxkPU1hdGguZmxvb3IoZC8yKSxwPU1hdGguZmxvb3IocC8yKSxjPXRoaXMudGlsZXNbYShmLGQscCldO2lmKCFjfHwhYy5zb3VyY2UpcmV0dXJuIG51bGw7aWYobz4xJiZjb25zb2xlLmxvZygiZm91bmQgcGFyZW50IHRpbGUgeiVkLSVkLSVkIixmLGQscCksdShjLGksbi5idWZmZXIpKXJldHVybiBoLnRpbGUoYyxpKTtvPjEmJmNvbnNvbGUudGltZSgiZHJpbGxpbmcgZG93biIpO3ZhciBnPXRoaXMuc3BsaXRUaWxlKGMuc291cmNlLGYsZCxwLHQsZSxyKTtpZihvPjEmJmNvbnNvbGUudGltZUVuZCgiZHJpbGxpbmcgZG93biIpLG51bGwhPT1nKXt2YXIgbT0xPDx0LWc7bD1hKGcsTWF0aC5mbG9vcihlL20pLE1hdGguZmxvb3Ioci9tKSl9cmV0dXJuIHRoaXMudGlsZXNbbF0/aC50aWxlKHRoaXMudGlsZXNbbF0saSk6bnVsbH19LHsiLi9jbGlwIjoxMTEsIi4vY29udmVydCI6MTEyLCIuL3RpbGUiOjExNiwiLi90cmFuc2Zvcm0iOjExNywiLi93cmFwIjoxMTh9XSwxMTU6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3ZhciByLG4sYSxvLHM9ZSplLGw9dC5sZW5ndGgsdT0wLGM9bC0xLGg9W107Zm9yKHRbdV1bMl09MSx0W2NdWzJdPTE7Yzspe2ZvcihuPTAscj11KzE7cjxjO3IrKylhPWkodFtyXSx0W3VdLHRbY10pLGE+biYmKG89cixuPWEpO24+cz8odFtvXVsyXT1uLGgucHVzaCh1KSxoLnB1c2gobyksdT1vKTooYz1oLnBvcCgpLHU9aC5wb3AoKSl9fWZ1bmN0aW9uIGkodCxlLHIpe3ZhciBuPWVbMF0saT1lWzFdLGE9clswXSxvPXJbMV0scz10WzBdLGw9dFsxXSx1PWEtbixjPW8taTtpZigwIT09dXx8MCE9PWMpe3ZhciBoPSgocy1uKSp1KyhsLWkpKmMpLyh1KnUrYypjKTtoPjE/KG49YSxpPW8pOmg+MCYmKG4rPXUqaCxpKz1jKmgpfXJldHVybiB1PXMtbixjPWwtaSx1KnUrYypjfWUuZXhwb3J0cz1ufSx7fV0sMTE2OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbixhLG8pe2Zvcih2YXIgcz17ZmVhdHVyZXM6W10sbnVtUG9pbnRzOjAsbnVtU2ltcGxpZmllZDowLG51bUZlYXR1cmVzOjAsc291cmNlOm51bGwseDpyLHk6bix6MjplLHRyYW5zZm9ybWVkOiExLG1pbjpbMiwxXSxtYXg6Wy0xLDBdfSxsPTA7bDx0Lmxlbmd0aDtsKyspe3MubnVtRmVhdHVyZXMrKyxpKHMsdFtsXSxhLG8pO3ZhciB1PXRbbF0ubWluLGM9dFtsXS5tYXg7dVswXTxzLm1pblswXSYmKHMubWluWzBdPXVbMF0pLHVbMV08cy5taW5bMV0mJihzLm1pblsxXT11WzFdKSxjWzBdPnMubWF4WzBdJiYocy5tYXhbMF09Y1swXSksY1sxXT5zLm1heFsxXSYmKHMubWF4WzFdPWNbMV0pfXJldHVybiBzfWZ1bmN0aW9uIGkodCxlLHIsbil7dmFyIGksbyxzLGwsdT1lLmdlb21ldHJ5LGM9ZS50eXBlLGg9W10sZj1yKnI7aWYoMT09PWMpZm9yKGk9MDtpPHUubGVuZ3RoO2krKyloLnB1c2godVtpXSksdC5udW1Qb2ludHMrKyx0Lm51bVNpbXBsaWZpZWQrKztlbHNlIGZvcihpPTA7aTx1Lmxlbmd0aDtpKyspaWYocz11W2ldLG58fCEoMj09PWMmJnMuZGlzdDxyfHwzPT09YyYmcy5hcmVhPGYpKXt2YXIgZD1bXTtmb3Iobz0wO288cy5sZW5ndGg7bysrKWw9c1tvXSwobnx8bFsyXT5mKSYmKGQucHVzaChsKSx0Lm51bVNpbXBsaWZpZWQrKyksdC5udW1Qb2ludHMrKzszPT09YyYmYShkLHMub3V0ZXIpLGgucHVzaChkKX1lbHNlIHQubnVtUG9pbnRzKz1zLmxlbmd0aDtpZihoLmxlbmd0aCl7dmFyIHA9e2dlb21ldHJ5OmgsdHlwZTpjLHRhZ3M6ZS50YWdzfHxudWxsfTtudWxsIT09ZS5pZCYmKHAuaWQ9ZS5pZCksdC5mZWF0dXJlcy5wdXNoKHApfX1mdW5jdGlvbiBhKHQsZSl7dmFyIHI9byh0KTtyPDA9PT1lJiZ0LnJldmVyc2UoKX1mdW5jdGlvbiBvKHQpe2Zvcih2YXIgZSxyLG49MCxpPTAsYT10Lmxlbmd0aCxvPWEtMTtpPGE7bz1pKyspZT10W2ldLHI9dFtvXSxuKz0oclswXS1lWzBdKSooZVsxXStyWzFdKTtyZXR1cm4gbn1lLmV4cG9ydHM9bn0se31dLDExNzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7aWYodC50cmFuc2Zvcm1lZClyZXR1cm4gdDt2YXIgcixuLGEsbz10LnoyLHM9dC54LGw9dC55O2ZvcihyPTA7cjx0LmZlYXR1cmVzLmxlbmd0aDtyKyspe3ZhciB1PXQuZmVhdHVyZXNbcl0sYz11Lmdlb21ldHJ5LGg9dS50eXBlO2lmKDE9PT1oKWZvcihuPTA7bjxjLmxlbmd0aDtuKyspY1tuXT1pKGNbbl0sZSxvLHMsbCk7ZWxzZSBmb3Iobj0wO248Yy5sZW5ndGg7bisrKXt2YXIgZj1jW25dO2ZvcihhPTA7YTxmLmxlbmd0aDthKyspZlthXT1pKGZbYV0sZSxvLHMsbCl9fXJldHVybiB0LnRyYW5zZm9ybWVkPSEwLHR9ZnVuY3Rpb24gaSh0LGUscixuLGkpe3ZhciBhPU1hdGgucm91bmQoZSoodFswXSpyLW4pKSxvPU1hdGgucm91bmQoZSoodFsxXSpyLWkpKTtyZXR1cm5bYSxvXX1yLnRpbGU9bixyLnBvaW50PWl9LHt9XSwxMTg6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscil7dmFyIG49dCxhPW8odCwxLC0xLWUsZSwwLHIsLTEsMikscz1vKHQsMSwxLWUsMitlLDAsciwtMSwyKTtyZXR1cm4oYXx8cykmJihuPW8odCwxLC1lLDErZSwwLHIsLTEsMil8fFtdLGEmJihuPWkoYSwxKS5jb25jYXQobikpLHMmJihuPW4uY29uY2F0KGkocywtMSkpKSksbn1mdW5jdGlvbiBpKHQsZSl7Zm9yKHZhciByPVtdLG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIGksbz10W25dLGw9by50eXBlO2lmKDE9PT1sKWk9YShvLmdlb21ldHJ5LGUpO2Vsc2V7aT1bXTtmb3IodmFyIHU9MDt1PG8uZ2VvbWV0cnkubGVuZ3RoO3UrKylpLnB1c2goYShvLmdlb21ldHJ5W3VdLGUpKX1yLnB1c2gocyhvLnRhZ3MsbCxpLG8uaWQpKX1yZXR1cm4gcn1mdW5jdGlvbiBhKHQsZSl7dmFyIHI9W107ci5hcmVhPXQuYXJlYSxyLmRpc3Q9dC5kaXN0O2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXIucHVzaChbdFtuXVswXStlLHRbbl1bMV0sdFtuXVsyXV0pO3JldHVybiByfXZhciBvPXQoIi4vY2xpcCIpLHM9dCgiLi9mZWF0dXJlIik7ZS5leHBvcnRzPW59LHsiLi9jbGlwIjoxMTEsIi4vZmVhdHVyZSI6MTEzfV0sMTE5OltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUpe2lmKCJzdHJpbmciIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJtdXN0IHNwZWNpZnkgdHlwZSBzdHJpbmciKTtpZihlPWV8fHt9LCJ1bmRlZmluZWQiPT10eXBlb2YgZG9jdW1lbnQmJiFlLmNhbnZhcylyZXR1cm4gbnVsbDt2YXIgcj1lLmNhbnZhc3x8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7Im51bWJlciI9PXR5cGVvZiBlLndpZHRoJiYoci53aWR0aD1lLndpZHRoKSwibnVtYmVyIj09dHlwZW9mIGUuaGVpZ2h0JiYoci5oZWlnaHQ9ZS5oZWlnaHQpO3ZhciBuLGk9ZTt0cnl7dmFyIGE9W3RdOzA9PT10LmluZGV4T2YoIndlYmdsIikmJmEucHVzaCgiZXhwZXJpbWVudGFsLSIrdCk7Zm9yKHZhciBvPTA7bzxhLmxlbmd0aDtvKyspaWYobj1yLmdldENvbnRleHQoYVtvXSxpKSlyZXR1cm4gbn1jYXRjaCh0KXtuPW51bGx9cmV0dXJuIG58fG51bGx9ZS5leHBvcnRzPW59LHt9XSwxMjA6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzFdLHRbMl09ZVsyXSx0fWZ1bmN0aW9uIGkodCl7dGhpcy5nbD10LHRoaXMucGl4ZWxSYXRpbz0xLHRoaXMuYm91bmRzPVtbLTEwLC0xMCwtMTBdLFsxMCwxMCwxMF1dLHRoaXMudGlja3M9W1tdLFtdLFtdXSx0aGlzLmF1dG9UaWNrcz0hMCx0aGlzLnRpY2tTcGFjaW5nPVsxLDEsMV0sdGhpcy50aWNrRW5hYmxlPVshMCwhMCwhMF0sdGhpcy50aWNrRm9udD1bInNhbnMtc2VyaWYiLCJzYW5zLXNlcmlmIiwic2Fucy1zZXJpZiJdLHRoaXMudGlja1NpemU9WzEyLDEyLDEyXSx0aGlzLnRpY2tBbmdsZT1bMCwwLDBdLHRoaXMudGlja0NvbG9yPVtbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXV0sdGhpcy50aWNrUGFkPVsxMCwxMCwxMF0sdGhpcy5sYXN0Q3ViZVByb3BzPXtjdWJlRWRnZXM6WzAsMCwwXSxheGlzOlswLDAsMF19LHRoaXMubGFiZWxzPVsieCIsInkiLCJ6Il0sdGhpcy5sYWJlbEVuYWJsZT1bITAsITAsITBdLHRoaXMubGFiZWxGb250PSJzYW5zLXNlcmlmIix0aGlzLmxhYmVsU2l6ZT1bMjAsMjAsMjBdLHRoaXMubGFiZWxBbmdsZT1bMCwwLDBdLHRoaXMubGFiZWxDb2xvcj1bWzAsMCwwLDFdLFswLDAsMCwxXSxbMCwwLDAsMV1dLHRoaXMubGFiZWxQYWQ9WzEwLDEwLDEwXSx0aGlzLmxpbmVFbmFibGU9WyEwLCEwLCEwXSx0aGlzLmxpbmVNaXJyb3I9WyExLCExLCExXSx0aGlzLmxpbmVXaWR0aD1bMSwxLDFdLHRoaXMubGluZUNvbG9yPVtbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXV0sdGhpcy5saW5lVGlja0VuYWJsZT1bITAsITAsITBdLHRoaXMubGluZVRpY2tNaXJyb3I9WyExLCExLCExXSx0aGlzLmxpbmVUaWNrTGVuZ3RoPVswLDAsMF0sdGhpcy5saW5lVGlja1dpZHRoPVsxLDEsMV0sdGhpcy5saW5lVGlja0NvbG9yPVtbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXV0sdGhpcy5ncmlkRW5hYmxlPVshMCwhMCwhMF0sdGhpcy5ncmlkV2lkdGg9WzEsMSwxXSx0aGlzLmdyaWRDb2xvcj1bWzAsMCwwLDFdLFswLDAsMCwxXSxbMCwwLDAsMV1dLHRoaXMuemVyb0VuYWJsZT1bITAsITAsITBdLHRoaXMuemVyb0xpbmVDb2xvcj1bWzAsMCwwLDFdLFswLDAsMCwxXSxbMCwwLDAsMV1dLHRoaXMuemVyb0xpbmVXaWR0aD1bMiwyLDJdLHRoaXMuYmFja2dyb3VuZEVuYWJsZT1bITEsITEsITFdLHRoaXMuYmFja2dyb3VuZENvbG9yPVtbLjgsLjgsLjgsLjVdLFsuOCwuOCwuOCwuNV0sWy44LC44LC44LC41XV0sdGhpcy5fZmlyc3RJbml0PSEwLHRoaXMuX3RleHQ9bnVsbCx0aGlzLl9saW5lcz1udWxsLHRoaXMuX2JhY2tncm91bmQ9Yyh0KX1mdW5jdGlvbiBhKCl7dGhpcy5wcmltYWxPZmZzZXQ9WzAsMCwwXSx0aGlzLnByaW1hbE1pbm9yPVswLDAsMF0sdGhpcy5taXJyb3JPZmZzZXQ9WzAsMCwwXSx0aGlzLm1pcnJvck1pbm9yPVswLDAsMF19ZnVuY3Rpb24gbyh0LGUscixuLGkpe2Zvcih2YXIgYT10LnByaW1hbE9mZnNldCxvPXQucHJpbWFsTWlub3Iscz10Lm1pcnJvck9mZnNldCxsPXQubWlycm9yTWlub3IsdT1uW2VdLGM9MDtjPDM7KytjKWlmKGUhPT1jKXt2YXIgaD1hLGY9cyxkPW8scD1sO3UmMTw8YyYmKGg9cyxmPWEsZD1sLHA9byksaFtjXT1yWzBdW2NdLGZbY109clsxXVtjXSxpW2NdPjA/KGRbY109LTEscFtjXT0wKTooZFtjXT0wLHBbY109MSl9fWZ1bmN0aW9uIHModCxlKXt2YXIgcj1uZXcgaSh0KTtyZXR1cm4gci51cGRhdGUoZSkscn1lLmV4cG9ydHM9czt2YXIgbD10KCIuL2xpYi90ZXh0LmpzIiksdT10KCIuL2xpYi9saW5lcy5qcyIpLGM9dCgiLi9saWIvYmFja2dyb3VuZC5qcyIpLGg9dCgiLi9saWIvY3ViZS5qcyIpLGY9dCgiLi9saWIvdGlja3MuanMiKSxkPW5ldyBGbG9hdDMyQXJyYXkoWzEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDFdKSxwPWkucHJvdG90eXBlO3AudXBkYXRlPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxyLG4pe2lmKG4gaW4gdCl7dmFyIGksYT10W25dLG89dGhpc1tuXTsoZT9BcnJheS5pc0FycmF5KGEpJiZBcnJheS5pc0FycmF5KGFbMF0pOkFycmF5LmlzQXJyYXkoYSkpP3RoaXNbbl09aT1bcihhWzBdKSxyKGFbMV0pLHIoYVsyXSldOnRoaXNbbl09aT1bcihhKSxyKGEpLHIoYSldO2Zvcih2YXIgcz0wO3M8MzsrK3MpaWYoaVtzXSE9PW9bc10pcmV0dXJuITB9cmV0dXJuITF9dD10fHx7fTt2YXIgcixuPWUuYmluZCh0aGlzLCExLE51bWJlciksaT1lLmJpbmQodGhpcywhMSxCb29sZWFuKSxhPWUuYmluZCh0aGlzLCExLFN0cmluZyksbz1lLmJpbmQodGhpcywhMCxmdW5jdGlvbih0KXtpZihBcnJheS5pc0FycmF5KHQpKXtpZigzPT09dC5sZW5ndGgpcmV0dXJuWyt0WzBdLCt0WzFdLCt0WzJdLDFdO2lmKDQ9PT10Lmxlbmd0aClyZXR1cm5bK3RbMF0sK3RbMV0sK3RbMl0sK3RbM11dfXJldHVyblswLDAsMCwxXX0pLHM9ITEsYz0hMTtpZigiYm91bmRzImluIHQpZm9yKHZhciBoPXQuYm91bmRzLGQ9MDtkPDI7KytkKWZvcih2YXIgcD0wO3A8MzsrK3ApaFtkXVtwXSE9PXRoaXMuYm91bmRzW2RdW3BdJiYoYz0hMCksdGhpcy5ib3VuZHNbZF1bcF09aFtkXVtwXTtpZigidGlja3MiaW4gdCl7cj10LnRpY2tzLHM9ITAsdGhpcy5hdXRvVGlja3M9ITE7Zm9yKHZhciBkPTA7ZDwzOysrZCl0aGlzLnRpY2tTcGFjaW5nW2RdPTB9ZWxzZSBuKCJ0aWNrU3BhY2luZyIpJiYodGhpcy5hdXRvVGlja3M9ITAsYz0hMCk7aWYodGhpcy5fZmlyc3RJbml0JiYoInRpY2tzImluIHR8fCJ0aWNrU3BhY2luZyJpbiB0fHwodGhpcy5hdXRvVGlja3M9ITApLGM9ITAscz0hMCx0aGlzLl9maXJzdEluaXQ9ITEpLGMmJnRoaXMuYXV0b1RpY2tzJiYocj1mLmNyZWF0ZSh0aGlzLmJvdW5kcyx0aGlzLnRpY2tTcGFjaW5nKSxzPSEwKSxzKXtmb3IodmFyIGQ9MDtkPDM7KytkKXJbZF0uc29ydChmdW5jdGlvbih0LGUpe3JldHVybiB0LngtZS54fSk7Zi5lcXVhbChyLHRoaXMudGlja3MpP3M9ITE6dGhpcy50aWNrcz1yfWkoInRpY2tFbmFibGUiKSxhKCJ0aWNrRm9udCIpJiYocz0hMCksbigidGlja1NpemUiKSxuKCJ0aWNrQW5nbGUiKSxuKCJ0aWNrUGFkIiksbygidGlja0NvbG9yIik7dmFyIGc9YSgibGFiZWxzIik7YSgibGFiZWxGb250IikmJihnPSEwKSxpKCJsYWJlbEVuYWJsZSIpLG4oImxhYmVsU2l6ZSIpLG4oImxhYmVsUGFkIiksbygibGFiZWxDb2xvciIpLGkoImxpbmVFbmFibGUiKSxpKCJsaW5lTWlycm9yIiksbigibGluZVdpZHRoIiksbygibGluZUNvbG9yIiksaSgibGluZVRpY2tFbmFibGUiKSxpKCJsaW5lVGlja01pcnJvciIpLG4oImxpbmVUaWNrTGVuZ3RoIiksbigibGluZVRpY2tXaWR0aCIpLG8oImxpbmVUaWNrQ29sb3IiKSxpKCJncmlkRW5hYmxlIiksbigiZ3JpZFdpZHRoIiksbygiZ3JpZENvbG9yIiksaSgiemVyb0VuYWJsZSIpLG8oInplcm9MaW5lQ29sb3IiKSxuKCJ6ZXJvTGluZVdpZHRoIiksaSgiYmFja2dyb3VuZEVuYWJsZSIpLG8oImJhY2tncm91bmRDb2xvciIpLHRoaXMuX3RleHQ/dGhpcy5fdGV4dCYmKGd8fHMpJiZ0aGlzLl90ZXh0LnVwZGF0ZSh0aGlzLmJvdW5kcyx0aGlzLmxhYmVscyx0aGlzLmxhYmVsRm9udCx0aGlzLnRpY2tzLHRoaXMudGlja0ZvbnQpOnRoaXMuX3RleHQ9bCh0aGlzLmdsLHRoaXMuYm91bmRzLHRoaXMubGFiZWxzLHRoaXMubGFiZWxGb250LHRoaXMudGlja3MsdGhpcy50aWNrRm9udCksdGhpcy5fbGluZXMmJnMmJih0aGlzLl9saW5lcy5kaXNwb3NlKCksdGhpcy5fbGluZXM9bnVsbCksdGhpcy5fbGluZXN8fCh0aGlzLl9saW5lcz11KHRoaXMuZ2wsdGhpcy5ib3VuZHMsdGhpcy50aWNrcykpfTt2YXIgZz1bbmV3IGEsbmV3IGEsbmV3IGFdLG09WzAsMCwwXSx2PXttb2RlbDpkLHZpZXc6ZCxwcm9qZWN0aW9uOmR9O3AuaXNPcGFxdWU9ZnVuY3Rpb24oKXtyZXR1cm4hMH0scC5pc1RyYW5zcGFyZW50PWZ1bmN0aW9uKCl7cmV0dXJuITF9LHAuZHJhd1RyYW5zcGFyZW50PWZ1bmN0aW9uKHQpe307dmFyIHk9WzAsMCwwXSx4PVswLDAsMF0sYj1bMCwwLDBdO3AuZHJhdz1mdW5jdGlvbih0KXt0PXR8fHY7Zm9yKHZhciBlPXRoaXMuZ2wscj10Lm1vZGVsfHxkLGk9dC52aWV3fHxkLGE9dC5wcm9qZWN0aW9ufHxkLHM9dGhpcy5ib3VuZHMsbD1oKHIsaSxhLHMpLHU9bC5jdWJlRWRnZXMsYz1sLmF4aXMsZj1pWzEyXSxwPWlbMTNdLF89aVsxNF0sdz1pWzE1XSxNPXRoaXMucGl4ZWxSYXRpbyooYVszXSpmK2FbN10qcCthWzExXSpfK2FbMTVdKncpL2UuZHJhd2luZ0J1ZmZlckhlaWdodCxBPTA7QTwzOysrQSl0aGlzLmxhc3RDdWJlUHJvcHMuY3ViZUVkZ2VzW0FdPXVbQV0sdGhpcy5sYXN0Q3ViZVByb3BzLmF4aXNbQV09Y1tBXTtmb3IodmFyIGs9ZyxBPTA7QTwzOysrQSlvKGdbQV0sQSx0aGlzLmJvdW5kcyx1LGMpO2Zvcih2YXIgZT10aGlzLmdsLFQ9bSxBPTA7QTwzOysrQSl0aGlzLmJhY2tncm91bmRFbmFibGVbQV0/VFtBXT1jW0FdOlRbQV09MDt0aGlzLl9iYWNrZ3JvdW5kLmRyYXcocixpLGEscyxULHRoaXMuYmFja2dyb3VuZENvbG9yKSx0aGlzLl9saW5lcy5iaW5kKHIsaSxhLHRoaXMpO2Zvcih2YXIgQT0wO0E8MzsrK0Epe3ZhciBFPVswLDAsMF07Y1tBXT4wP0VbQV09c1sxXVtBXTpFW0FdPXNbMF1bQV07Zm9yKHZhciBTPTA7UzwyOysrUyl7dmFyIEw9KEErMStTKSUzLHo9KEErMSsoMV5TKSklMzt0aGlzLmdyaWRFbmFibGVbTF0mJnRoaXMuX2xpbmVzLmRyYXdHcmlkKEwseix0aGlzLmJvdW5kcyxFLHRoaXMuZ3JpZENvbG9yW0xdLHRoaXMuZ3JpZFdpZHRoW0xdKnRoaXMucGl4ZWxSYXRpbyl9Zm9yKHZhciBTPTA7UzwyOysrUyl7dmFyIEw9KEErMStTKSUzLHo9KEErMSsoMV5TKSklMzt0aGlzLnplcm9FbmFibGVbel0mJnNbMF1bel08PTAmJnNbMV1bel0+PTAmJnRoaXMuX2xpbmVzLmRyYXdaZXJvKEwseix0aGlzLmJvdW5kcyxFLHRoaXMuemVyb0xpbmVDb2xvclt6XSx0aGlzLnplcm9MaW5lV2lkdGhbel0qdGhpcy5waXhlbFJhdGlvKX19Zm9yKHZhciBBPTA7QTwzOysrQSl7dGhpcy5saW5lRW5hYmxlW0FdJiZ0aGlzLl9saW5lcy5kcmF3QXhpc0xpbmUoQSx0aGlzLmJvdW5kcyxrW0FdLnByaW1hbE9mZnNldCx0aGlzLmxpbmVDb2xvcltBXSx0aGlzLmxpbmVXaWR0aFtBXSp0aGlzLnBpeGVsUmF0aW8pLHRoaXMubGluZU1pcnJvcltBXSYmdGhpcy5fbGluZXMuZHJhd0F4aXNMaW5lKEEsdGhpcy5ib3VuZHMsa1tBXS5taXJyb3JPZmZzZXQsdGhpcy5saW5lQ29sb3JbQV0sdGhpcy5saW5lV2lkdGhbQV0qdGhpcy5waXhlbFJhdGlvKTtmb3IodmFyIEM9bih5LGtbQV0ucHJpbWFsTWlub3IpLEk9bih4LGtbQV0ubWlycm9yTWlub3IpLFA9dGhpcy5saW5lVGlja0xlbmd0aCxTPTA7UzwzOysrUyl7dmFyIEQ9TS9yWzUqU107Q1tTXSo9UFtTXSpELElbU10qPVBbU10qRH10aGlzLmxpbmVUaWNrRW5hYmxlW0FdJiZ0aGlzLl9saW5lcy5kcmF3QXhpc1RpY2tzKEEsa1tBXS5wcmltYWxPZmZzZXQsQyx0aGlzLmxpbmVUaWNrQ29sb3JbQV0sdGhpcy5saW5lVGlja1dpZHRoW0FdKnRoaXMucGl4ZWxSYXRpbyksdGhpcy5saW5lVGlja01pcnJvcltBXSYmdGhpcy5fbGluZXMuZHJhd0F4aXNUaWNrcyhBLGtbQV0ubWlycm9yT2Zmc2V0LEksdGhpcy5saW5lVGlja0NvbG9yW0FdLHRoaXMubGluZVRpY2tXaWR0aFtBXSp0aGlzLnBpeGVsUmF0aW8pfXRoaXMuX3RleHQuYmluZChyLGksYSx0aGlzLnBpeGVsUmF0aW8pO2Zvcih2YXIgQT0wO0E8MzsrK0Epe2Zvcih2YXIgUj1rW0FdLnByaW1hbE1pbm9yLE89bihiLGtbQV0ucHJpbWFsT2Zmc2V0KSxTPTA7UzwzOysrUyl0aGlzLmxpbmVUaWNrRW5hYmxlW0FdJiYoT1tTXSs9TSpSW1NdKk1hdGgubWF4KHRoaXMubGluZVRpY2tMZW5ndGhbU10sMCkvcls1KlNdKTtpZih0aGlzLnRpY2tFbmFibGVbQV0pe2Zvcih2YXIgUz0wO1M8MzsrK1MpT1tTXSs9TSpSW1NdKnRoaXMudGlja1BhZFtTXS9yWzUqU107dGhpcy5fdGV4dC5kcmF3VGlja3MoQSx0aGlzLnRpY2tTaXplW0FdLHRoaXMudGlja0FuZ2xlW0FdLE8sdGhpcy50aWNrQ29sb3JbQV0pfWlmKHRoaXMubGFiZWxFbmFibGVbQV0pe2Zvcih2YXIgUz0wO1M8MzsrK1MpT1tTXSs9TSpSW1NdKnRoaXMubGFiZWxQYWRbU10vcls1KlNdO09bQV0rPS41KihzWzBdW0FdK3NbMV1bQV0pLHRoaXMuX3RleHQuZHJhd0xhYmVsKEEsdGhpcy5sYWJlbFNpemVbQV0sdGhpcy5sYWJlbEFuZ2xlW0FdLE8sdGhpcy5sYWJlbENvbG9yW0FdKX19fSxwLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLl90ZXh0LmRpc3Bvc2UoKSx0aGlzLl9saW5lcy5kaXNwb3NlKCksdGhpcy5fYmFja2dyb3VuZC5kaXNwb3NlKCksdGhpcy5fbGluZXM9bnVsbCx0aGlzLl90ZXh0PW51bGwsdGhpcy5fYmFja2dyb3VuZD1udWxsLHRoaXMuZ2w9bnVsbH19LHsiLi9saWIvYmFja2dyb3VuZC5qcyI6MTIxLCIuL2xpYi9jdWJlLmpzIjoxMjIsIi4vbGliL2xpbmVzLmpzIjoxMjMsIi4vbGliL3RleHQuanMiOjEyNSwiLi9saWIvdGlja3MuanMiOjEyNn1dLDEyMTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyLG4pe3RoaXMuZ2w9dCx0aGlzLmJ1ZmZlcj1lLHRoaXMudmFvPXIsdGhpcy5zaGFkZXI9bn1mdW5jdGlvbiBpKHQpe2Zvcih2YXIgZT1bXSxyPVtdLGk9MCxsPTA7bDwzOysrbClmb3IodmFyIHU9KGwrMSklMyxjPShsKzIpJTMsaD1bMCwwLDBdLGY9WzAsMCwwXSxkPS0xO2Q8PTE7ZCs9Mil7ci5wdXNoKGksaSsyLGkrMSxpKzEsaSsyLGkrMyksaFtsXT1kLGZbbF09ZDtmb3IodmFyIHA9LTE7cDw9MTtwKz0yKXtoW3VdPXA7Zm9yKHZhciBnPS0xO2c8PTE7Zys9MiloW2NdPWcsZS5wdXNoKGhbMF0saFsxXSxoWzJdLGZbMF0sZlsxXSxmWzJdKSxpKz0xfXZhciBtPXU7dT1jLGM9bX12YXIgdj1hKHQsbmV3IEZsb2F0MzJBcnJheShlKSkseT1hKHQsbmV3IFVpbnQxNkFycmF5KHIpLHQuRUxFTUVOVF9BUlJBWV9CVUZGRVIpLHg9byh0LFt7YnVmZmVyOnYsdHlwZTp0LkZMT0FULHNpemU6MyxvZmZzZXQ6MCxzdHJpZGU6MjR9LHtidWZmZXI6dix0eXBlOnQuRkxPQVQsc2l6ZTozLG9mZnNldDoxMixzdHJpZGU6MjR9XSx5KSxiPXModCk7cmV0dXJuIGIuYXR0cmlidXRlcy5wb3NpdGlvbi5sb2NhdGlvbj0wLGIuYXR0cmlidXRlcy5ub3JtYWwubG9jYXRpb249MSxuZXcgbih0LHYseCxiKX1lLmV4cG9ydHM9aTt2YXIgYT10KCJnbC1idWZmZXIiKSxvPXQoImdsLXZhbyIpLHM9dCgiLi9zaGFkZXJzIikuYmcsbD1uLnByb3RvdHlwZTtsLmRyYXc9ZnVuY3Rpb24odCxlLHIsbixpLGEpe2Zvcih2YXIgbz0hMSxzPTA7czwzOysrcylvPW98fGlbc107aWYobyl7dmFyIGw9dGhpcy5nbDtsLmVuYWJsZShsLlBPTFlHT05fT0ZGU0VUX0ZJTEwpLGwucG9seWdvbk9mZnNldCgxLDIpLHRoaXMuc2hhZGVyLmJpbmQoKSx0aGlzLnNoYWRlci51bmlmb3Jtcz17bW9kZWw6dCx2aWV3OmUscHJvamVjdGlvbjpyLGJvdW5kczpuLGVuYWJsZTppLGNvbG9yczphfSx0aGlzLnZhby5iaW5kKCksdGhpcy52YW8uZHJhdyh0aGlzLmdsLlRSSUFOR0xFUywzNiksbC5kaXNhYmxlKGwuUE9MWUdPTl9PRkZTRVRfRklMTCl9fSxsLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLnZhby5kaXNwb3NlKCksdGhpcy5idWZmZXIuZGlzcG9zZSgpLHRoaXMuc2hhZGVyLmRpc3Bvc2UoKX19LHsiLi9zaGFkZXJzIjoxMjQsImdsLWJ1ZmZlciI6MTI4LCJnbC12YW8iOjIzNn1dLDEyMjpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyKXtmb3IodmFyIG49MDtuPDQ7KytuKXt0W25dPXJbMTIrbl07Zm9yKHZhciBpPTA7aTwzOysraSl0W25dKz1lW2ldKnJbNCppK25dfX1mdW5jdGlvbiBpKHQpe2Zvcih2YXIgZT0wO2U8Zy5sZW5ndGg7KytlKWlmKHQ9bC5wb3NpdGl2ZSh0LGdbZV0pLHQubGVuZ3RoPDMpcmV0dXJuIDA7Zm9yKHZhciByPXRbMF0sbj1yWzBdL3JbM10saT1yWzFdL3JbM10sYT0wLGU9MTtlKzE8dC5sZW5ndGg7KytlKXt2YXIgbz10W2VdLHM9dFtlKzFdLHU9b1swXS9vWzNdLGM9b1sxXS9vWzNdLGg9c1swXS9zWzNdLGY9c1sxXS9zWzNdLGQ9dS1uLHA9Yy1pLG09aC1uLHY9Zi1pO2ErPU1hdGguYWJzKGQqdi1wKm0pfXJldHVybiBhfWZ1bmN0aW9uIGEodCxlLHIsYSl7cyhjLGUsdCkscyhjLHIsYyk7Zm9yKHZhciBsPTAsZz0wO2c8MjsrK2cpe2RbMl09YVtnXVsyXTtmb3IodmFyIHg9MDt4PDI7Kyt4KXtkWzFdPWFbeF1bMV07Zm9yKHZhciBiPTA7YjwyOysrYilkWzBdPWFbYl1bMF0sbihoW2xdLGQsYyksbCs9MX19Zm9yKHZhciBfPS0xLGc9MDtnPDg7KytnKXtmb3IodmFyIHc9aFtnXVszXSxNPTA7TTwzOysrTSlmW2ddW01dPWhbZ11bTV0vdzt3PDAmJihfPDA/Xz1nOmZbZ11bMl08ZltfXVsyXSYmKF89ZykpfWlmKF88MCl7Xz0wO2Zvcih2YXIgQT0wO0E8MzsrK0Epe2Zvcih2YXIgaz0oQSsyKSUzLFQ9KEErMSklMyxFPS0xLFM9LTEsTD0wO0w8MjsrK0wpe3ZhciB6PUw8PEEsQz16KyhMPDxrKSsoMS1MPDxUKSxJPXorKDEtTDw8aykrKEw8PFQpO3UoZlt6XSxmW0NdLGZbSV0scCk8MHx8KEw/RT0xOlM9MSl9aWYoRTwwfHxTPDApUz5FJiYoX3w9MTw8QSk7ZWxzZXtmb3IodmFyIEw9MDtMPDI7KytMKXt2YXIgej1MPDxBLEM9eisoTDw8aykrKDEtTDw8VCksST16KygxLUw8PGspKyhMPDxUKSxQPWkoW2hbel0saFtDXSxoW0ldLGhbeisoMTw8aykrKDE8PFQpXV0pO0w/RT1QOlM9UH1TPkUmJihffD0xPDxBKX19fWZvcih2YXIgRD03Xl8sUj0tMSxnPTA7Zzw4OysrZylnIT09XyYmZyE9PUQmJihSPDA/Uj1nOmZbUl1bMV0+ZltnXVsxXSYmKFI9ZykpO2Zvcih2YXIgTz0tMSxnPTA7ZzwzOysrZyl7dmFyIEY9Ul4xPDxnO2lmKEYhPT1fJiZGIT09RCl7TzwwJiYoTz1GKTt2YXIgVD1mW0ZdO1RbMF08ZltPXVswXSYmKE89Ril9fWZvcih2YXIgaj0tMSxnPTA7ZzwzOysrZyl7dmFyIEY9Ul4xPDxnO2lmKEYhPT1fJiZGIT09RCYmRiE9PU8pe2o8MCYmKGo9Rik7dmFyIFQ9ZltGXTtUWzBdPmZbal1bMF0mJihqPUYpfX12YXIgTj1tO05bMF09TlsxXT1OWzJdPTAsTltvLmxvZzIoT15SKV09UiZPLE5bby5sb2cyKFJeaildPVImajt2YXIgQj03Xmo7Qj09PV98fEI9PT1EPyhCPTdeTyxOW28ubG9nMihqXkIpXT1CJmopOk5bby5sb2cyKE9eQildPUImTztmb3IodmFyIFU9dixWPV8sQT0wO0E8MzsrK0EpViYxPDxBP1VbQV09LTE6VVtBXT0xO3JldHVybiB5fWUuZXhwb3J0cz1hO3ZhciBvPXQoImJpdC10d2lkZGxlIikscz10KCJnbC1tYXQ0L211bHRpcGx5IiksbD0odCgiZ2wtbWF0NC9pbnZlcnQiKSx0KCJzcGxpdC1wb2x5Z29uIikpLHU9dCgicm9idXN0LW9yaWVudGF0aW9uIiksYz1uZXcgQXJyYXkoMTYpLGg9KG5ldyBBcnJheSgxNiksbmV3IEFycmF5KDgpKSxmPW5ldyBBcnJheSg4KSxkPW5ldyBBcnJheSgzKSxwPVswLDAsMF07IWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDw4OysrdCloW3RdPVsxLDEsMSwxXSxmW3RdPVsxLDEsMV19KCk7dmFyIGc9W1swLDAsMSwwLDBdLFswLDAsLTEsMSwwXSxbMCwtMSwwLDEsMF0sWzAsMSwwLDEsMF0sWy0xLDAsMCwxLDBdLFsxLDAsMCwxLDBdXSxtPVsxLDEsMV0sdj1bMCwwLDBdLHk9e2N1YmVFZGdlczptLGF4aXM6dn19LHsiYml0LXR3aWRkbGUiOjU0LCJnbC1tYXQ0L2ludmVydCI6MTQ5LCJnbC1tYXQ0L211bHRpcGx5IjoxNTEsInJvYnVzdC1vcmllbnRhdGlvbiI6NDY1LCJzcGxpdC1wb2x5Z29uIjo0ODN9XSwxMjM6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtyZXR1cm4gdFswXT10WzFdPXRbMl09MCx0fWZ1bmN0aW9uIGkodCxlKXtyZXR1cm4gdFswXT1lWzBdLHRbMV09ZVsxXSx0WzJdPWVbMl0sdH1mdW5jdGlvbiBhKHQsZSxyLG4saSxhLG8scyl7dGhpcy5nbD10LHRoaXMudmVydEJ1ZmZlcj1lLHRoaXMudmFvPXIsdGhpcy5zaGFkZXI9bix0aGlzLnRpY2tDb3VudD1pLHRoaXMudGlja09mZnNldD1hLHRoaXMuZ3JpZENvdW50PW8sdGhpcy5ncmlkT2Zmc2V0PXN9ZnVuY3Rpb24gbyh0LGUscil7dmFyIG49W10saT1bMCwwLDBdLG89WzAsMCwwXSxjPVswLDAsMF0saD1bMCwwLDBdO24ucHVzaCgwLDAsMSwwLDEsMSwwLDAsLTEsMCwwLC0xLDAsMSwxLDAsMSwtMSk7Zm9yKHZhciBmPTA7ZjwzOysrZil7Zm9yKHZhciBkPW4ubGVuZ3RoLzN8MCxwPTA7cDxyW2ZdLmxlbmd0aDsrK3Ape3ZhciBnPStyW2ZdW3BdLng7bi5wdXNoKGcsMCwxLGcsMSwxLGcsMCwtMSxnLDAsLTEsZywxLDEsZywxLC0xKX12YXIgbT1uLmxlbmd0aC8zfDA7aVtmXT1kLG9bZl09bS1kO2Zvcih2YXIgZD1uLmxlbmd0aC8zfDAsdj0wO3Y8cltmXS5sZW5ndGg7Kyt2KXt2YXIgZz0rcltmXVt2XS54O24ucHVzaChnLDAsMSxnLDEsMSxnLDAsLTEsZywwLC0xLGcsMSwxLGcsMSwtMSl9dmFyIG09bi5sZW5ndGgvM3wwO2NbZl09ZCxoW2ZdPW0tZH12YXIgeT1zKHQsbmV3IEZsb2F0MzJBcnJheShuKSkseD1sKHQsW3tidWZmZXI6eSx0eXBlOnQuRkxPQVQsc2l6ZTozLHN0cmlkZTowLG9mZnNldDowfV0pLGI9dSh0KTtyZXR1cm4gYi5hdHRyaWJ1dGVzLnBvc2l0aW9uLmxvY2F0aW9uPTAsbmV3IGEodCx5LHgsYixvLGksaCxjKX1lLmV4cG9ydHM9bzt2YXIgcz10KCJnbC1idWZmZXIiKSxsPXQoImdsLXZhbyIpLHU9dCgiLi9zaGFkZXJzIikubGluZSxjPVswLDAsMF0saD1bMCwwLDBdLGY9WzAsMCwwXSxkPVswLDAsMF0scD1bMSwxXSxnPWEucHJvdG90eXBlOwpnLmJpbmQ9ZnVuY3Rpb24odCxlLHIpe3RoaXMuc2hhZGVyLmJpbmQoKSx0aGlzLnNoYWRlci51bmlmb3Jtcy5tb2RlbD10LHRoaXMuc2hhZGVyLnVuaWZvcm1zLnZpZXc9ZSx0aGlzLnNoYWRlci51bmlmb3Jtcy5wcm9qZWN0aW9uPXIscFswXT10aGlzLmdsLmRyYXdpbmdCdWZmZXJXaWR0aCxwWzFdPXRoaXMuZ2wuZHJhd2luZ0J1ZmZlckhlaWdodCx0aGlzLnNoYWRlci51bmlmb3Jtcy5zY3JlZW5TaGFwZT1wLHRoaXMudmFvLmJpbmQoKX0sZy5kcmF3QXhpc0xpbmU9ZnVuY3Rpb24odCxlLHIsYSxvKXt2YXIgcz1uKGgpO3RoaXMuc2hhZGVyLnVuaWZvcm1zLm1ham9yQXhpcz1oLHNbdF09ZVsxXVt0XS1lWzBdW3RdLHRoaXMuc2hhZGVyLnVuaWZvcm1zLm1pbm9yQXhpcz1zO3ZhciBsPWkoZCxyKTtsW3RdKz1lWzBdW3RdLHRoaXMuc2hhZGVyLnVuaWZvcm1zLm9mZnNldD1sLHRoaXMuc2hhZGVyLnVuaWZvcm1zLmxpbmVXaWR0aD1vLHRoaXMuc2hhZGVyLnVuaWZvcm1zLmNvbG9yPWE7dmFyIHU9bihmKTt1Wyh0KzIpJTNdPTEsdGhpcy5zaGFkZXIudW5pZm9ybXMuc2NyZWVuQXhpcz11LHRoaXMudmFvLmRyYXcodGhpcy5nbC5UUklBTkdMRVMsNik7dmFyIHU9bihmKTt1Wyh0KzEpJTNdPTEsdGhpcy5zaGFkZXIudW5pZm9ybXMuc2NyZWVuQXhpcz11LHRoaXMudmFvLmRyYXcodGhpcy5nbC5UUklBTkdMRVMsNil9LGcuZHJhd0F4aXNUaWNrcz1mdW5jdGlvbih0LGUscixpLGEpe2lmKHRoaXMudGlja0NvdW50W3RdKXt2YXIgbz1uKGMpO29bdF09MSx0aGlzLnNoYWRlci51bmlmb3Jtcy5tYWpvckF4aXM9byx0aGlzLnNoYWRlci51bmlmb3Jtcy5vZmZzZXQ9ZSx0aGlzLnNoYWRlci51bmlmb3Jtcy5taW5vckF4aXM9cix0aGlzLnNoYWRlci51bmlmb3Jtcy5jb2xvcj1pLHRoaXMuc2hhZGVyLnVuaWZvcm1zLmxpbmVXaWR0aD1hO3ZhciBzPW4oZik7c1t0XT0xLHRoaXMuc2hhZGVyLnVuaWZvcm1zLnNjcmVlbkF4aXM9cyx0aGlzLnZhby5kcmF3KHRoaXMuZ2wuVFJJQU5HTEVTLHRoaXMudGlja0NvdW50W3RdLHRoaXMudGlja09mZnNldFt0XSl9fSxnLmRyYXdHcmlkPWZ1bmN0aW9uKHQsZSxyLGEsbyxzKXtpZih0aGlzLmdyaWRDb3VudFt0XSl7dmFyIGw9bihoKTtsW2VdPXJbMV1bZV0tclswXVtlXSx0aGlzLnNoYWRlci51bmlmb3Jtcy5taW5vckF4aXM9bDt2YXIgdT1pKGQsYSk7dVtlXSs9clswXVtlXSx0aGlzLnNoYWRlci51bmlmb3Jtcy5vZmZzZXQ9dTt2YXIgcD1uKGMpO3BbdF09MSx0aGlzLnNoYWRlci51bmlmb3Jtcy5tYWpvckF4aXM9cDt2YXIgZz1uKGYpO2dbdF09MSx0aGlzLnNoYWRlci51bmlmb3Jtcy5zY3JlZW5BeGlzPWcsdGhpcy5zaGFkZXIudW5pZm9ybXMubGluZVdpZHRoPXMsdGhpcy5zaGFkZXIudW5pZm9ybXMuY29sb3I9byx0aGlzLnZhby5kcmF3KHRoaXMuZ2wuVFJJQU5HTEVTLHRoaXMuZ3JpZENvdW50W3RdLHRoaXMuZ3JpZE9mZnNldFt0XSl9fSxnLmRyYXdaZXJvPWZ1bmN0aW9uKHQsZSxyLGEsbyxzKXt2YXIgbD1uKGgpO3RoaXMuc2hhZGVyLnVuaWZvcm1zLm1ham9yQXhpcz1sLGxbdF09clsxXVt0XS1yWzBdW3RdLHRoaXMuc2hhZGVyLnVuaWZvcm1zLm1pbm9yQXhpcz1sO3ZhciB1PWkoZCxhKTt1W3RdKz1yWzBdW3RdLHRoaXMuc2hhZGVyLnVuaWZvcm1zLm9mZnNldD11O3ZhciBjPW4oZik7Y1tlXT0xLHRoaXMuc2hhZGVyLnVuaWZvcm1zLnNjcmVlbkF4aXM9Yyx0aGlzLnNoYWRlci51bmlmb3Jtcy5saW5lV2lkdGg9cyx0aGlzLnNoYWRlci51bmlmb3Jtcy5jb2xvcj1vLHRoaXMudmFvLmRyYXcodGhpcy5nbC5UUklBTkdMRVMsNil9LGcuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMudmFvLmRpc3Bvc2UoKSx0aGlzLnZlcnRCdWZmZXIuZGlzcG9zZSgpLHRoaXMuc2hhZGVyLmRpc3Bvc2UoKX19LHsiLi9zaGFkZXJzIjoxMjQsImdsLWJ1ZmZlciI6MTI4LCJnbC12YW8iOjIzNn1dLDEyNDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj10KCJnbC1zaGFkZXIiKSxpPSIjZGVmaW5lIEdMU0xJRlkgMVxuYXR0cmlidXRlIHZlYzMgcG9zaXRpb247XG5cbnVuaWZvcm0gbWF0NCBtb2RlbCwgdmlldywgcHJvamVjdGlvbjtcbnVuaWZvcm0gdmVjMyBvZmZzZXQsIG1ham9yQXhpcywgbWlub3JBeGlzLCBzY3JlZW5BeGlzO1xudW5pZm9ybSBmbG9hdCBsaW5lV2lkdGg7XG51bmlmb3JtIHZlYzIgc2NyZWVuU2hhcGU7XG5cbnZlYzMgcHJvamVjdCh2ZWMzIHApIHtcbiAgdmVjNCBwcCA9IHByb2plY3Rpb24gKiB2aWV3ICogbW9kZWwgKiB2ZWM0KHAsIDEuMCk7XG4gIHJldHVybiBwcC54eXogLyBtYXgocHAudywgMC4wMDAxKTtcbn1cblxudm9pZCBtYWluKCkge1xuICB2ZWMzIG1ham9yID0gcG9zaXRpb24ueCAqIG1ham9yQXhpcztcbiAgdmVjMyBtaW5vciA9IHBvc2l0aW9uLnkgKiBtaW5vckF4aXM7XG5cbiAgdmVjMyB2UG9zaXRpb24gPSBtYWpvciArIG1pbm9yICsgb2Zmc2V0O1xuICB2ZWMzIHBQb3NpdGlvbiA9IHByb2plY3QodlBvc2l0aW9uKTtcbiAgdmVjMyBvZmZzZXQgPSBwcm9qZWN0KHZQb3NpdGlvbiArIHNjcmVlbkF4aXMgKiBwb3NpdGlvbi56KTtcblxuICB2ZWMyIHNjcmVlbiA9IG5vcm1hbGl6ZSgob2Zmc2V0IC0gcFBvc2l0aW9uKS54eSAqIHNjcmVlblNoYXBlKSAvIHNjcmVlblNoYXBlO1xuXG4gIGdsX1Bvc2l0aW9uID0gdmVjNChwUG9zaXRpb24gKyB2ZWMzKDAuNSAqIHNjcmVlbiAqIGxpbmVXaWR0aCwgMCksIDEuMCk7XG59XG4iLGE9InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcbnVuaWZvcm0gdmVjNCBjb2xvcjtcbnZvaWQgbWFpbigpIHtcbiAgZ2xfRnJhZ0NvbG9yID0gY29sb3I7XG59IjtyLmxpbmU9ZnVuY3Rpb24odCl7cmV0dXJuIG4odCxpLGEsbnVsbCxbe25hbWU6InBvc2l0aW9uIix0eXBlOiJ2ZWMzIn1dKX07dmFyIG89IiNkZWZpbmUgR0xTTElGWSAxXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjtcblxudW5pZm9ybSBtYXQ0IG1vZGVsLCB2aWV3LCBwcm9qZWN0aW9uO1xudW5pZm9ybSB2ZWMzIG9mZnNldCwgYXhpcztcbnVuaWZvcm0gZmxvYXQgc2NhbGUsIGFuZ2xlLCBwaXhlbFNjYWxlO1xudW5pZm9ybSB2ZWMyIHJlc29sdXRpb247XG5cbnZvaWQgbWFpbigpIHsgIFxuICAvL0NvbXB1dGUgcGxhbmUgb2Zmc2V0XG4gIHZlYzIgcGxhbmVDb29yZCA9IHBvc2l0aW9uLnh5ICogcGl4ZWxTY2FsZTtcbiAgbWF0MiBwbGFuZVhmb3JtID0gc2NhbGUgKiBtYXQyKGNvcyhhbmdsZSksIHNpbihhbmdsZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1zaW4oYW5nbGUpLCBjb3MoYW5nbGUpKTtcbiAgdmVjMiB2aWV3T2Zmc2V0ID0gMi4wICogcGxhbmVYZm9ybSAqIHBsYW5lQ29vcmQgLyByZXNvbHV0aW9uO1xuXG4gIC8vQ29tcHV0ZSB3b3JsZCBvZmZzZXRcbiAgZmxvYXQgYXhpc0Rpc3RhbmNlID0gcG9zaXRpb24uejtcbiAgdmVjMyBkYXRhUG9zaXRpb24gPSBheGlzRGlzdGFuY2UgKiBheGlzICsgb2Zmc2V0O1xuICB2ZWM0IHdvcmxkUG9zaXRpb24gPSBtb2RlbCAqIHZlYzQoZGF0YVBvc2l0aW9uLCAxKTtcbiAgXG4gIC8vQ29tcHV0ZSBjbGlwIHBvc2l0aW9uXG4gIHZlYzQgdmlld1Bvc2l0aW9uID0gdmlldyAqIHdvcmxkUG9zaXRpb247XG4gIHZlYzQgY2xpcFBvc2l0aW9uID0gcHJvamVjdGlvbiAqIHZpZXdQb3NpdGlvbjtcbiAgY2xpcFBvc2l0aW9uIC89IGNsaXBQb3NpdGlvbi53O1xuXG4gIC8vQXBwbHkgdGV4dCBvZmZzZXQgaW4gY2xpcCBjb29yZGluYXRlc1xuICBjbGlwUG9zaXRpb24gKz0gdmVjNCh2aWV3T2Zmc2V0LCAwLCAwKTtcblxuICAvL0RvbmVcbiAgZ2xfUG9zaXRpb24gPSBjbGlwUG9zaXRpb247XG59IixzPSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG51bmlmb3JtIHZlYzQgY29sb3I7XG52b2lkIG1haW4oKSB7XG4gIGdsX0ZyYWdDb2xvciA9IGNvbG9yO1xufSI7ci50ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBuKHQsbyxzLG51bGwsW3tuYW1lOiJwb3NpdGlvbiIsdHlwZToidmVjMyJ9XSl9O3ZhciBsPSIjZGVmaW5lIEdMU0xJRlkgMVxuYXR0cmlidXRlIHZlYzMgcG9zaXRpb247XG5hdHRyaWJ1dGUgdmVjMyBub3JtYWw7XG5cbnVuaWZvcm0gbWF0NCBtb2RlbCwgdmlldywgcHJvamVjdGlvbjtcbnVuaWZvcm0gdmVjMyBlbmFibGU7XG51bmlmb3JtIHZlYzMgYm91bmRzWzJdO1xuXG52YXJ5aW5nIHZlYzMgY29sb3JDaGFubmVsO1xuXG52b2lkIG1haW4oKSB7XG4gIGlmKGRvdChub3JtYWwsIGVuYWJsZSkgPiAwLjApIHtcbiAgICB2ZWMzIG5Qb3NpdGlvbiA9IG1peChib3VuZHNbMF0sIGJvdW5kc1sxXSwgMC41ICogKHBvc2l0aW9uICsgMS4wKSk7XG4gICAgZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uICogdmlldyAqIG1vZGVsICogdmVjNChuUG9zaXRpb24sIDEuMCk7XG4gIH0gZWxzZSB7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KDAsMCwwLDApO1xuICB9XG4gIGNvbG9yQ2hhbm5lbCA9IGFicyhub3JtYWwpO1xufSIsdT0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG51bmlmb3JtIHZlYzQgY29sb3JzWzNdO1xuXG52YXJ5aW5nIHZlYzMgY29sb3JDaGFubmVsO1xuXG52b2lkIG1haW4oKSB7XG4gIGdsX0ZyYWdDb2xvciA9IGNvbG9yQ2hhbm5lbC54ICogY29sb3JzWzBdICsgXG4gICAgICAgICAgICAgICAgIGNvbG9yQ2hhbm5lbC55ICogY29sb3JzWzFdICtcbiAgICAgICAgICAgICAgICAgY29sb3JDaGFubmVsLnogKiBjb2xvcnNbMl07XG59IjtyLmJnPWZ1bmN0aW9uKHQpe3JldHVybiBuKHQsbCx1LG51bGwsW3tuYW1lOiJwb3NpdGlvbiIsdHlwZToidmVjMyJ9LHtuYW1lOiJub3JtYWwiLHR5cGU6InZlYzMifV0pfX0seyJnbC1zaGFkZXIiOjIyMH1dLDEyNTpbZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbihyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuKXt0aGlzLmdsPXQsdGhpcy5zaGFkZXI9ZSx0aGlzLmJ1ZmZlcj1yLHRoaXMudmFvPW4sdGhpcy50aWNrT2Zmc2V0PXRoaXMudGlja0NvdW50PXRoaXMubGFiZWxPZmZzZXQ9dGhpcy5sYWJlbENvdW50PW51bGx9ZnVuY3Rpb24gaSh0LGUpe3RyeXtyZXR1cm4gbCh0LGUpfWNhdGNoKHQpe3JldHVybiBjb25zb2xlLndhcm4oImVycm9yIHZlY3Rvcml6aW5nIHRleHQ6Iix0KSx7Y2VsbHM6W10scG9zaXRpb25zOltdfX19ZnVuY3Rpb24gYSh0LGUscixpLGEsbCl7dmFyIGM9byh0KSxoPXModCxbe2J1ZmZlcjpjLHNpemU6M31dKSxmPXUodCk7Zi5hdHRyaWJ1dGVzLnBvc2l0aW9uLmxvY2F0aW9uPTA7dmFyIGQ9bmV3IG4odCxmLGMsaCk7cmV0dXJuIGQudXBkYXRlKGUscixpLGEsbCksZH1lLmV4cG9ydHM9YTt2YXIgbz10KCJnbC1idWZmZXIiKSxzPXQoImdsLXZhbyIpLGw9dCgidmVjdG9yaXplLXRleHQiKSx1PXQoIi4vc2hhZGVycyIpLnRleHQsYz13aW5kb3d8fHIuZ2xvYmFsfHx7fSxoPWMuX19URVhUX0NBQ0hFfHx7fTtjLl9fVEVYVF9DQUNIRT17fTt2YXIgZj0zLGQ9bi5wcm90b3R5cGUscD1bMCwwXTtkLmJpbmQ9ZnVuY3Rpb24odCxlLHIsbil7dGhpcy52YW8uYmluZCgpLHRoaXMuc2hhZGVyLmJpbmQoKTt2YXIgaT10aGlzLnNoYWRlci51bmlmb3JtcztpLm1vZGVsPXQsaS52aWV3PWUsaS5wcm9qZWN0aW9uPXIsaS5waXhlbFNjYWxlPW4scFswXT10aGlzLmdsLmRyYXdpbmdCdWZmZXJXaWR0aCxwWzFdPXRoaXMuZ2wuZHJhd2luZ0J1ZmZlckhlaWdodCx0aGlzLnNoYWRlci51bmlmb3Jtcy5yZXNvbHV0aW9uPXB9LGQudXBkYXRlPWZ1bmN0aW9uKHQsZSxyLG4sYSl7ZnVuY3Rpb24gbyh0LGUscixuKXt2YXIgYT1oW3JdO2F8fChhPWhbcl09e30pO3ZhciBvPWFbZV07b3x8KG89YVtlXT1pKGUse3RyaWFuZ2xlczohMCxmb250OnIsdGV4dEFsaWduOiJjZW50ZXIiLHRleHRCYXNlbGluZToibWlkZGxlIn0pKTtmb3IodmFyIGw9KG58fDEyKS8xMix1PW8ucG9zaXRpb25zLGM9by5jZWxscyxmPTAsZD1jLmxlbmd0aDtmPGQ7KytmKWZvcih2YXIgcD1jW2ZdLGc9MjtnPj0wOy0tZyl7dmFyIG09dVtwW2ddXTtzLnB1c2gobCptWzBdLC1sKm1bMV0sdCl9fWZvcih2YXIgcz0odGhpcy5nbCxbXSksbD1bMCwwLDBdLHU9WzAsMCwwXSxjPVswLDAsMF0sZD1bMCwwLDBdLHA9MDtwPDM7KytwKXtjW3BdPXMubGVuZ3RoL2Z8MCxvKC41Kih0WzBdW3BdK3RbMV1bcF0pLGVbcF0sciksZFtwXT0ocy5sZW5ndGgvZnwwKS1jW3BdLGxbcF09cy5sZW5ndGgvZnwwO2Zvcih2YXIgZz0wO2c8bltwXS5sZW5ndGg7KytnKW5bcF1bZ10udGV4dCYmbyhuW3BdW2ddLngsbltwXVtnXS50ZXh0LG5bcF1bZ10uZm9udHx8YSxuW3BdW2ddLmZvbnRTaXplfHwxMik7dVtwXT0ocy5sZW5ndGgvZnwwKS1sW3BdfXRoaXMuYnVmZmVyLnVwZGF0ZShzKSx0aGlzLnRpY2tPZmZzZXQ9bCx0aGlzLnRpY2tDb3VudD11LHRoaXMubGFiZWxPZmZzZXQ9Yyx0aGlzLmxhYmVsQ291bnQ9ZH07dmFyIGc9WzAsMCwwXTtkLmRyYXdUaWNrcz1mdW5jdGlvbih0LGUscixuLGkpe2lmKHRoaXMudGlja0NvdW50W3RdKXt2YXIgYT1nO2FbMF09YVsxXT1hWzJdPTAsYVt0XT0xLHRoaXMuc2hhZGVyLnVuaWZvcm1zLmF4aXM9YSx0aGlzLnNoYWRlci51bmlmb3Jtcy5jb2xvcj1pLHRoaXMuc2hhZGVyLnVuaWZvcm1zLmFuZ2xlPXIsdGhpcy5zaGFkZXIudW5pZm9ybXMuc2NhbGU9ZSx0aGlzLnNoYWRlci51bmlmb3Jtcy5vZmZzZXQ9bix0aGlzLnZhby5kcmF3KHRoaXMuZ2wuVFJJQU5HTEVTLHRoaXMudGlja0NvdW50W3RdLHRoaXMudGlja09mZnNldFt0XSl9fTt2YXIgbT1bMCwwLDBdO2QuZHJhd0xhYmVsPWZ1bmN0aW9uKHQsZSxyLG4saSl7dGhpcy5sYWJlbENvdW50W3RdJiYodGhpcy5zaGFkZXIudW5pZm9ybXMuYXhpcz1tLHRoaXMuc2hhZGVyLnVuaWZvcm1zLmNvbG9yPWksdGhpcy5zaGFkZXIudW5pZm9ybXMuYW5nbGU9cix0aGlzLnNoYWRlci51bmlmb3Jtcy5zY2FsZT1lLHRoaXMuc2hhZGVyLnVuaWZvcm1zLm9mZnNldD1uLHRoaXMudmFvLmRyYXcodGhpcy5nbC5UUklBTkdMRVMsdGhpcy5sYWJlbENvdW50W3RdLHRoaXMubGFiZWxPZmZzZXRbdF0pKX0sZC5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5zaGFkZXIuZGlzcG9zZSgpLHRoaXMudmFvLmRpc3Bvc2UoKSx0aGlzLmJ1ZmZlci5kaXNwb3NlKCl9fSkuY2FsbCh0aGlzLHQoIl9wcm9jZXNzIikpfSx7Ii4vc2hhZGVycyI6MTI0LF9wcm9jZXNzOjQ0NSwiZ2wtYnVmZmVyIjoxMjgsImdsLXZhbyI6MjM2LCJ2ZWN0b3JpemUtdGV4dCI6NTA5fV0sMTI2OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXt2YXIgcj10KyIiLG49ci5pbmRleE9mKCIuIiksaT0wO24+PTAmJihpPXIubGVuZ3RoLW4tMSk7dmFyIGE9TWF0aC5wb3coMTAsaSksbz1NYXRoLnJvdW5kKHQqZSphKSxzPW8rIiI7aWYocy5pbmRleE9mKCJlIik+PTApcmV0dXJuIHM7dmFyIGw9by9hLHU9byVhO288MD8obD0wfC1NYXRoLmNlaWwobCksdT0wfC11KToobD0wfE1hdGguZmxvb3IobCksdT0wfHUpO3ZhciBjPSIiK2w7aWYobzwwJiYoYz0iLSIrYyksaSl7Zm9yKHZhciBoPSIiK3U7aC5sZW5ndGg8aTspaD0iMCIraDtyZXR1cm4gYysiLiIraH1yZXR1cm4gY31mdW5jdGlvbiBpKHQsZSl7Zm9yKHZhciByPVtdLGk9MDtpPDM7KytpKXtmb3IodmFyIGE9W10sbz0oLjUqKHRbMF1baV0rdFsxXVtpXSksMCk7byplW2ldPD10WzFdW2ldOysrbylhLnB1c2goe3g6byplW2ldLHRleHQ6bihlW2ldLG8pfSk7Zm9yKHZhciBvPS0xO28qZVtpXT49dFswXVtpXTstLW8pYS5wdXNoKHt4Om8qZVtpXSx0ZXh0Om4oZVtpXSxvKX0pO3IucHVzaChhKX1yZXR1cm4gcn1mdW5jdGlvbiBhKHQsZSl7Zm9yKHZhciByPTA7cjwzOysrcil7aWYodFtyXS5sZW5ndGghPT1lW3JdLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIG49MDtuPHRbcl0ubGVuZ3RoOysrbil7dmFyIGk9dFtyXVtuXSxhPWVbcl1bbl07aWYoaS54IT09YS54fHxpLnRleHQhPT1hLnRleHR8fGkuZm9udCE9PWEuZm9udHx8aS5mb250Q29sb3IhPT1hLmZvbnRDb2xvcnx8aS5mb250U2l6ZSE9PWEuZm9udFNpemV8fGkuZHghPT1hLmR4fHxpLmR5IT09YS5keSlyZXR1cm4hMX19cmV0dXJuITB9ci5jcmVhdGU9aSxyLmVxdWFsPWF9LHt9XSwxMjc6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscil7dGhpcy5sbz10LHRoaXMuaGk9ZSx0aGlzLnBpeGVsc1BlckRhdGFVbml0PXJ9ZnVuY3Rpb24gaSh0LGUscixuLGkpe2Zvcih2YXIgYT0wO2E8MzsrK2Epe2Zvcih2YXIgbz1wLHM9ZyxsPTA7bDwzOysrbClzW2xdPW9bbF09cltsXTtzWzNdPW9bM109MSxzW2FdKz0xLGgocyxzLGUpLHNbM108MCYmKHRbYV09MS8wKSxvW2FdLT0xLGgobyxvLGUpLG9bM108MCYmKHRbYV09MS8wKTt2YXIgdT0ob1swXS9vWzNdLXNbMF0vc1szXSkqbixjPShvWzFdL29bM10tc1sxXS9zWzNdKSppO3RbYV09LjI1Kk1hdGguc3FydCh1KnUrYypjKX1yZXR1cm4gdH1mdW5jdGlvbiBhKHQsZSxyLG4sYSl7dmFyIGg9ZS5tb2RlbHx8ZixwPWUudmlld3x8ZixnPWUucHJvamVjdGlvbnx8Zix5PXQuYm91bmRzLGE9YXx8bChoLHAsZyx5KSx4PWEuYXhpczthLmVkZ2VzO3UoZCxwLGgpLHUoZCxnLGQpO2Zvcih2YXIgYj1tLF89MDtfPDM7KytfKWJbX10ubG89MS8wLGJbX10uaGk9LSgxLzApLGJbX10ucGl4ZWxzUGVyRGF0YVVuaXQ9MS8wO3ZhciB3PW8oYyhkLGQpKTtjKGQsZCk7Zm9yKHZhciBNPTA7TTwzOysrTSl7dmFyIEE9KE0rMSklMyxrPShNKzIpJTMsVD12O3Q6Zm9yKHZhciBfPTA7XzwyOysrXyl7dmFyIEU9W107aWYoeFtNXTwwIT0hIV8pe1RbTV09eVtfXVtNXTtmb3IodmFyIFM9MDtTPDI7KytTKXtUW0FdPXlbU15fXVtBXTtmb3IodmFyIEw9MDtMPDI7KytMKVRba109eVtMXlNeX11ba10sRS5wdXNoKFQuc2xpY2UoKSl9Zm9yKHZhciBTPTA7Uzx3Lmxlbmd0aDsrK1Mpe2lmKDA9PT1FLmxlbmd0aCljb250aW51ZSB0O0U9cy5wb3NpdGl2ZShFLHdbU10pfWZvcih2YXIgUz0wO1M8RS5sZW5ndGg7KytTKWZvcih2YXIgaz1FW1NdLHo9aSh2LGQsayxyLG4pLEw9MDtMPDM7KytMKWJbTF0ubG89TWF0aC5taW4oYltMXS5sbyxrW0xdKSxiW0xdLmhpPU1hdGgubWF4KGJbTF0uaGksa1tMXSksTCE9PU0mJihiW0xdLnBpeGVsc1BlckRhdGFVbml0PU1hdGgubWluKGJbTF0ucGl4ZWxzUGVyRGF0YVVuaXQsTWF0aC5hYnMoeltMXSkpKX19fXJldHVybiBifWUuZXhwb3J0cz1hO3ZhciBvPXQoImV4dHJhY3QtZnJ1c3R1bS1wbGFuZXMiKSxzPXQoInNwbGl0LXBvbHlnb24iKSxsPXQoIi4vbGliL2N1YmUuanMiKSx1PXQoImdsLW1hdDQvbXVsdGlwbHkiKSxjPXQoImdsLW1hdDQvdHJhbnNwb3NlIiksaD10KCJnbC12ZWM0L3RyYW5zZm9ybU1hdDQiKSxmPW5ldyBGbG9hdDMyQXJyYXkoWzEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDFdKSxkPW5ldyBGbG9hdDMyQXJyYXkoMTYpLHA9WzAsMCwwLDFdLGc9WzAsMCwwLDFdLG09W25ldyBuKDEvMCwtKDEvMCksMS8wKSxuZXcgbigxLzAsLSgxLzApLDEvMCksbmV3IG4oMS8wLC0oMS8wKSwxLzApXSx2PVswLDAsMF19LHsiLi9saWIvY3ViZS5qcyI6MTIyLCJleHRyYWN0LWZydXN0dW0tcGxhbmVzIjoxMDMsImdsLW1hdDQvbXVsdGlwbHkiOjE1MSwiZ2wtbWF0NC90cmFuc3Bvc2UiOjE1OSwiZ2wtdmVjNC90cmFuc2Zvcm1NYXQ0IjoyNDIsInNwbGl0LXBvbHlnb24iOjQ4M31dLDEyODpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyLG4saSl7dGhpcy5nbD10LHRoaXMudHlwZT1lLHRoaXMuaGFuZGxlPXIsdGhpcy5sZW5ndGg9bix0aGlzLnVzYWdlPWl9ZnVuY3Rpb24gaSh0LGUscixuLGksYSl7dmFyIG89aS5sZW5ndGgqaS5CWVRFU19QRVJfRUxFTUVOVDtpZihhPDApcmV0dXJuIHQuYnVmZmVyRGF0YShlLGksbiksbztpZihvK2E+cil0aHJvdyBuZXcgRXJyb3IoImdsLWJ1ZmZlcjogSWYgcmVzaXppbmcgYnVmZmVyLCBtdXN0IG5vdCBzcGVjaWZ5IG9mZnNldCIpO3JldHVybiB0LmJ1ZmZlclN1YkRhdGEoZSxhLGkpLHJ9ZnVuY3Rpb24gYSh0LGUpe2Zvcih2YXIgcj1sLm1hbGxvYyh0Lmxlbmd0aCxlKSxuPXQubGVuZ3RoLGk9MDtpPG47KytpKXJbaV09dFtpXTtyZXR1cm4gcn1mdW5jdGlvbiBvKHQsZSl7Zm9yKHZhciByPTEsbj1lLmxlbmd0aC0xO24+PTA7LS1uKXtpZihlW25dIT09cilyZXR1cm4hMTtyKj10W25dfXJldHVybiEwfWZ1bmN0aW9uIHModCxlLHIsaSl7aWYocj1yfHx0LkFSUkFZX0JVRkZFUixpPWl8fHQuRFlOQU1JQ19EUkFXLHIhPT10LkFSUkFZX0JVRkZFUiYmciE9PXQuRUxFTUVOVF9BUlJBWV9CVUZGRVIpdGhyb3cgbmV3IEVycm9yKCJnbC1idWZmZXI6IEludmFsaWQgdHlwZSBmb3Igd2ViZ2wgYnVmZmVyLCBtdXN0IGJlIGVpdGhlciBnbC5BUlJBWV9CVUZGRVIgb3IgZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIiKTtpZihpIT09dC5EWU5BTUlDX0RSQVcmJmkhPT10LlNUQVRJQ19EUkFXJiZpIT09dC5TVFJFQU1fRFJBVyl0aHJvdyBuZXcgRXJyb3IoImdsLWJ1ZmZlcjogSW52YWxpZCB1c2FnZSBmb3IgYnVmZmVyLCBtdXN0IGJlIGVpdGhlciBnbC5EWU5BTUlDX0RSQVcsIGdsLlNUQVRJQ19EUkFXIG9yIGdsLlNUUkVBTV9EUkFXIik7dmFyIGE9dC5jcmVhdGVCdWZmZXIoKSxvPW5ldyBuKHQscixhLDAsaSk7cmV0dXJuIG8udXBkYXRlKGUpLG99dmFyIGw9dCgidHlwZWRhcnJheS1wb29sIiksdT10KCJuZGFycmF5LW9wcyIpLGM9dCgibmRhcnJheSIpLGg9WyJ1aW50OCIsInVpbnQ4X2NsYW1wZWQiLCJ1aW50MTYiLCJ1aW50MzIiLCJpbnQ4IiwiaW50MTYiLCJpbnQzMiIsImZsb2F0MzIiXSxmPW4ucHJvdG90eXBlO2YuYmluZD1mdW5jdGlvbigpe3RoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLnR5cGUsdGhpcy5oYW5kbGUpfSxmLnVuYmluZD1mdW5jdGlvbigpe3RoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLnR5cGUsbnVsbCl9LGYuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuZ2wuZGVsZXRlQnVmZmVyKHRoaXMuaGFuZGxlKX0sZi51cGRhdGU9ZnVuY3Rpb24odCxlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUmJihlPS0xKSx0aGlzLmJpbmQoKSwib2JqZWN0Ij09dHlwZW9mIHQmJiJ1bmRlZmluZWQiIT10eXBlb2YgdC5zaGFwZSl7dmFyIHI9dC5kdHlwZTtpZihoLmluZGV4T2Yocik8MCYmKHI9ImZsb2F0MzIiKSx0aGlzLnR5cGU9PT10aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSKXt2YXIgbj1nbC5nZXRFeHRlbnNpb24oIk9FU19lbGVtZW50X2luZGV4X3VpbnQiKTtyPW4mJiJ1aW50MTYiIT09cj8idWludDMyIjoidWludDE2In1pZihyPT09dC5kdHlwZSYmbyh0LnNoYXBlLHQuc3RyaWRlKSkwPT09dC5vZmZzZXQmJnQuZGF0YS5sZW5ndGg9PT10LnNoYXBlWzBdP3RoaXMubGVuZ3RoPWkodGhpcy5nbCx0aGlzLnR5cGUsdGhpcy5sZW5ndGgsdGhpcy51c2FnZSx0LmRhdGEsZSk6dGhpcy5sZW5ndGg9aSh0aGlzLmdsLHRoaXMudHlwZSx0aGlzLmxlbmd0aCx0aGlzLnVzYWdlLHQuZGF0YS5zdWJhcnJheSh0Lm9mZnNldCx0LnNoYXBlWzBdKSxlKTtlbHNle3ZhciBzPWwubWFsbG9jKHQuc2l6ZSxyKSxmPWMocyx0LnNoYXBlKTt1LmFzc2lnbihmLHQpLGU8MD90aGlzLmxlbmd0aD1pKHRoaXMuZ2wsdGhpcy50eXBlLHRoaXMubGVuZ3RoLHRoaXMudXNhZ2UscyxlKTp0aGlzLmxlbmd0aD1pKHRoaXMuZ2wsdGhpcy50eXBlLHRoaXMubGVuZ3RoLHRoaXMudXNhZ2Uscy5zdWJhcnJheSgwLHQuc2l6ZSksZSksbC5mcmVlKHMpfX1lbHNlIGlmKEFycmF5LmlzQXJyYXkodCkpe3ZhciBkO2Q9dGhpcy50eXBlPT09dGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUj9hKHQsInVpbnQxNiIpOmEodCwiZmxvYXQzMiIpLGU8MD90aGlzLmxlbmd0aD1pKHRoaXMuZ2wsdGhpcy50eXBlLHRoaXMubGVuZ3RoLHRoaXMudXNhZ2UsZCxlKTp0aGlzLmxlbmd0aD1pKHRoaXMuZ2wsdGhpcy50eXBlLHRoaXMubGVuZ3RoLHRoaXMudXNhZ2UsZC5zdWJhcnJheSgwLHQubGVuZ3RoKSxlKSxsLmZyZWUoZCl9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHQmJiJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGgpdGhpcy5sZW5ndGg9aSh0aGlzLmdsLHRoaXMudHlwZSx0aGlzLmxlbmd0aCx0aGlzLnVzYWdlLHQsZSk7ZWxzZXtpZigibnVtYmVyIiE9dHlwZW9mIHQmJnZvaWQgMCE9PXQpdGhyb3cgbmV3IEVycm9yKCJnbC1idWZmZXI6IEludmFsaWQgZGF0YSB0eXBlIik7aWYoZT49MCl0aHJvdyBuZXcgRXJyb3IoImdsLWJ1ZmZlcjogQ2Fubm90IHNwZWNpZnkgb2Zmc2V0IHdoZW4gcmVzaXppbmcgYnVmZmVyIik7dD0wfHQsdDw9MCYmKHQ9MSksdGhpcy5nbC5idWZmZXJEYXRhKHRoaXMudHlwZSwwfHQsdGhpcy51c2FnZSksdGhpcy5sZW5ndGg9dH19LGUuZXhwb3J0cz1zfSx7bmRhcnJheTo0MjcsIm5kYXJyYXktb3BzIjo0MjEsInR5cGVkYXJyYXktcG9vbCI6NDk2fV0sMTI5OltmdW5jdGlvbih0LGUscil7ZS5leHBvcnRzPXswOiJOT05FIiwxOiJPTkUiLDI6IkxJTkVfTE9PUCIsMzoiTElORV9TVFJJUCIsNDoiVFJJQU5HTEVTIiw1OiJUUklBTkdMRV9TVFJJUCIsNjoiVFJJQU5HTEVfRkFOIiwyNTY6IkRFUFRIX0JVRkZFUl9CSVQiLDUxMjoiTkVWRVIiLDUxMzoiTEVTUyIsNTE0OiJFUVVBTCIsNTE1OiJMRVFVQUwiLDUxNjoiR1JFQVRFUiIsNTE3OiJOT1RFUVVBTCIsNTE4OiJHRVFVQUwiLDUxOToiQUxXQVlTIiw3Njg6IlNSQ19DT0xPUiIsNzY5OiJPTkVfTUlOVVNfU1JDX0NPTE9SIiw3NzA6IlNSQ19BTFBIQSIsNzcxOiJPTkVfTUlOVVNfU1JDX0FMUEhBIiw3NzI6IkRTVF9BTFBIQSIsNzczOiJPTkVfTUlOVVNfRFNUX0FMUEhBIiw3NzQ6IkRTVF9DT0xPUiIsNzc1OiJPTkVfTUlOVVNfRFNUX0NPTE9SIiw3NzY6IlNSQ19BTFBIQV9TQVRVUkFURSIsMTAyNDoiU1RFTkNJTF9CVUZGRVJfQklUIiwxMDI4OiJGUk9OVCIsMTAyOToiQkFDSyIsMTAzMjoiRlJPTlRfQU5EX0JBQ0siLDEyODA6IklOVkFMSURfRU5VTSIsMTI4MToiSU5WQUxJRF9WQUxVRSIsMTI4MjoiSU5WQUxJRF9PUEVSQVRJT04iLDEyODU6Ik9VVF9PRl9NRU1PUlkiLDEyODY6IklOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OIiwyMzA0OiJDVyIsMjMwNToiQ0NXIiwyODQ5OiJMSU5FX1dJRFRIIiwyODg0OiJDVUxMX0ZBQ0UiLDI4ODU6IkNVTExfRkFDRV9NT0RFIiwyODg2OiJGUk9OVF9GQUNFIiwyOTI4OiJERVBUSF9SQU5HRSIsMjkyOToiREVQVEhfVEVTVCIsMjkzMDoiREVQVEhfV1JJVEVNQVNLIiwyOTMxOiJERVBUSF9DTEVBUl9WQUxVRSIsMjkzMjoiREVQVEhfRlVOQyIsMjk2MDoiU1RFTkNJTF9URVNUIiwyOTYxOiJTVEVOQ0lMX0NMRUFSX1ZBTFVFIiwyOTYyOiJTVEVOQ0lMX0ZVTkMiLDI5NjM6IlNURU5DSUxfVkFMVUVfTUFTSyIsMjk2NDoiU1RFTkNJTF9GQUlMIiwyOTY1OiJTVEVOQ0lMX1BBU1NfREVQVEhfRkFJTCIsMjk2NjoiU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1MiLDI5Njc6IlNURU5DSUxfUkVGIiwyOTY4OiJTVEVOQ0lMX1dSSVRFTUFTSyIsMjk3ODoiVklFV1BPUlQiLDMwMjQ6IkRJVEhFUiIsMzA0MjoiQkxFTkQiLDMwODg6IlNDSVNTT1JfQk9YIiwzMDg5OiJTQ0lTU09SX1RFU1QiLDMxMDY6IkNPTE9SX0NMRUFSX1ZBTFVFIiwzMTA3OiJDT0xPUl9XUklURU1BU0siLDMzMTc6IlVOUEFDS19BTElHTk1FTlQiLDMzMzM6IlBBQ0tfQUxJR05NRU5UIiwzMzc5OiJNQVhfVEVYVFVSRV9TSVpFIiwzMzg2OiJNQVhfVklFV1BPUlRfRElNUyIsMzQwODoiU1VCUElYRUxfQklUUyIsMzQxMDoiUkVEX0JJVFMiLDM0MTE6IkdSRUVOX0JJVFMiLDM0MTI6IkJMVUVfQklUUyIsMzQxMzoiQUxQSEFfQklUUyIsMzQxNDoiREVQVEhfQklUUyIsMzQxNToiU1RFTkNJTF9CSVRTIiwzNTUzOiJURVhUVVJFXzJEIiw0MzUyOiJET05UX0NBUkUiLDQzNTM6IkZBU1RFU1QiLDQzNTQ6Ik5JQ0VTVCIsNTEyMDoiQllURSIsNTEyMToiVU5TSUdORURfQllURSIsNTEyMjoiU0hPUlQiLDUxMjM6IlVOU0lHTkVEX1NIT1JUIiw1MTI0OiJJTlQiLDUxMjU6IlVOU0lHTkVEX0lOVCIsNTEyNjoiRkxPQVQiLDUzODY6IklOVkVSVCIsNTg5MDoiVEVYVFVSRSIsNjQwMToiU1RFTkNJTF9JTkRFWCIsNjQwMjoiREVQVEhfQ09NUE9ORU5UIiw2NDA2OiJBTFBIQSIsNjQwNzoiUkdCIiw2NDA4OiJSR0JBIiw2NDA5OiJMVU1JTkFOQ0UiLDY0MTA6IkxVTUlOQU5DRV9BTFBIQSIsNzY4MDoiS0VFUCIsNzY4MToiUkVQTEFDRSIsNzY4MjoiSU5DUiIsNzY4MzoiREVDUiIsNzkzNjoiVkVORE9SIiw3OTM3OiJSRU5ERVJFUiIsNzkzODoiVkVSU0lPTiIsOTcyODoiTkVBUkVTVCIsOTcyOToiTElORUFSIiw5OTg0OiJORUFSRVNUX01JUE1BUF9ORUFSRVNUIiw5OTg1OiJMSU5FQVJfTUlQTUFQX05FQVJFU1QiLDk5ODY6Ik5FQVJFU1RfTUlQTUFQX0xJTkVBUiIsOTk4NzoiTElORUFSX01JUE1BUF9MSU5FQVIiLDEwMjQwOiJURVhUVVJFX01BR19GSUxURVIiLDEwMjQxOiJURVhUVVJFX01JTl9GSUxURVIiLDEwMjQyOiJURVhUVVJFX1dSQVBfUyIsMTAyNDM6IlRFWFRVUkVfV1JBUF9UIiwxMDQ5NzoiUkVQRUFUIiwxMDc1MjoiUE9MWUdPTl9PRkZTRVRfVU5JVFMiLDE2Mzg0OiJDT0xPUl9CVUZGRVJfQklUIiwzMjc2OToiQ09OU1RBTlRfQ09MT1IiLDMyNzcwOiJPTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1IiLDMyNzcxOiJDT05TVEFOVF9BTFBIQSIsMzI3NzI6Ik9ORV9NSU5VU19DT05TVEFOVF9BTFBIQSIsMzI3NzM6IkJMRU5EX0NPTE9SIiwzMjc3NDoiRlVOQ19BREQiLDMyNzc3OiJCTEVORF9FUVVBVElPTl9SR0IiLDMyNzc4OiJGVU5DX1NVQlRSQUNUIiwzMjc3OToiRlVOQ19SRVZFUlNFX1NVQlRSQUNUIiwzMjgxOToiVU5TSUdORURfU0hPUlRfNF80XzRfNCIsMzI4MjA6IlVOU0lHTkVEX1NIT1JUXzVfNV81XzEiLDMyODIzOiJQT0xZR09OX09GRlNFVF9GSUxMIiwzMjgyNDoiUE9MWUdPTl9PRkZTRVRfRkFDVE9SIiwzMjg1NDoiUkdCQTQiLDMyODU1OiJSR0I1X0ExIiwzMjg3MzoiVEVYVFVSRV9CSU5ESU5HXzJEIiwzMjkyNjoiU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFIiwzMjkyODoiU0FNUExFX0NPVkVSQUdFIiwzMjkzNjoiU0FNUExFX0JVRkZFUlMiLDMyOTM3OiJTQU1QTEVTIiwzMjkzODoiU0FNUExFX0NPVkVSQUdFX1ZBTFVFIiwzMjkzOToiU0FNUExFX0NPVkVSQUdFX0lOVkVSVCIsMzI5Njg6IkJMRU5EX0RTVF9SR0IiLDMyOTY5OiJCTEVORF9TUkNfUkdCIiwzMjk3MDoiQkxFTkRfRFNUX0FMUEhBIiwzMjk3MToiQkxFTkRfU1JDX0FMUEhBIiwzMzA3MToiQ0xBTVBfVE9fRURHRSIsMzMxNzA6IkdFTkVSQVRFX01JUE1BUF9ISU5UIiwzMzE4OToiREVQVEhfQ09NUE9ORU5UMTYiLDMzMzA2OiJERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQiLDMzNjM1OiJVTlNJR05FRF9TSE9SVF81XzZfNSIsMzM2NDg6Ik1JUlJPUkVEX1JFUEVBVCIsMzM5MDE6IkFMSUFTRURfUE9JTlRfU0laRV9SQU5HRSIsMzM5MDI6IkFMSUFTRURfTElORV9XSURUSF9SQU5HRSIsMzM5ODQ6IlRFWFRVUkUwIiwzMzk4NToiVEVYVFVSRTEiLDMzOTg2OiJURVhUVVJFMiIsMzM5ODc6IlRFWFRVUkUzIiwzMzk4ODoiVEVYVFVSRTQiLDMzOTg5OiJURVhUVVJFNSIsMzM5OTA6IlRFWFRVUkU2IiwzMzk5MToiVEVYVFVSRTciLDMzOTkyOiJURVhUVVJFOCIsMzM5OTM6IlRFWFRVUkU5IiwzMzk5NDoiVEVYVFVSRTEwIiwzMzk5NToiVEVYVFVSRTExIiwzMzk5NjoiVEVYVFVSRTEyIiwzMzk5NzoiVEVYVFVSRTEzIiwzMzk5ODoiVEVYVFVSRTE0IiwzMzk5OToiVEVYVFVSRTE1IiwzNGUzOiJURVhUVVJFMTYiLDM0MDAxOiJURVhUVVJFMTciLDM0MDAyOiJURVhUVVJFMTgiLDM0MDAzOiJURVhUVVJFMTkiLDM0MDA0OiJURVhUVVJFMjAiLDM0MDA1OiJURVhUVVJFMjEiLDM0MDA2OiJURVhUVVJFMjIiLDM0MDA3OiJURVhUVVJFMjMiLDM0MDA4OiJURVhUVVJFMjQiLDM0MDA5OiJURVhUVVJFMjUiLDM0MDEwOiJURVhUVVJFMjYiLDM0MDExOiJURVhUVVJFMjciLDM0MDEyOiJURVhUVVJFMjgiLDM0MDEzOiJURVhUVVJFMjkiLDM0MDE0OiJURVhUVVJFMzAiLDM0MDE1OiJURVhUVVJFMzEiLDM0MDE2OiJBQ1RJVkVfVEVYVFVSRSIsMzQwMjQ6Ik1BWF9SRU5ERVJCVUZGRVJfU0laRSIsMzQwNDE6IkRFUFRIX1NURU5DSUwiLDM0MDU1OiJJTkNSX1dSQVAiLDM0MDU2OiJERUNSX1dSQVAiLDM0MDY3OiJURVhUVVJFX0NVQkVfTUFQIiwzNDA2ODoiVEVYVFVSRV9CSU5ESU5HX0NVQkVfTUFQIiwzNDA2OToiVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YIiwzNDA3MDoiVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YIiwzNDA3MToiVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZIiwzNDA3MjoiVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZIiwzNDA3MzoiVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aIiwzNDA3NDoiVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aIiwzNDA3NjoiTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSIsMzQzMzg6IlZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRCIsMzQzMzk6IlZFUlRFWF9BVFRSSUJfQVJSQVlfU0laRSIsMzQzNDA6IlZFUlRFWF9BVFRSSUJfQVJSQVlfU1RSSURFIiwzNDM0MToiVkVSVEVYX0FUVFJJQl9BUlJBWV9UWVBFIiwzNDM0MjoiQ1VSUkVOVF9WRVJURVhfQVRUUklCIiwzNDM3MzoiVkVSVEVYX0FUVFJJQl9BUlJBWV9QT0lOVEVSIiwzNDQ2NjoiTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTIiwzNDQ2NzoiQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMiLDM0NjYwOiJCVUZGRVJfU0laRSIsMzQ2NjE6IkJVRkZFUl9VU0FHRSIsMzQ4MTY6IlNURU5DSUxfQkFDS19GVU5DIiwzNDgxNzoiU1RFTkNJTF9CQUNLX0ZBSUwiLDM0ODE4OiJTVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9GQUlMIiwzNDgxOToiU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfUEFTUyIsMzQ4Nzc6IkJMRU5EX0VRVUFUSU9OX0FMUEhBIiwzNDkyMToiTUFYX1ZFUlRFWF9BVFRSSUJTIiwzNDkyMjoiVkVSVEVYX0FUVFJJQl9BUlJBWV9OT1JNQUxJWkVEIiwzNDkzMDoiTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMiLDM0OTYyOiJBUlJBWV9CVUZGRVIiLDM0OTYzOiJFTEVNRU5UX0FSUkFZX0JVRkZFUiIsMzQ5NjQ6IkFSUkFZX0JVRkZFUl9CSU5ESU5HIiwzNDk2NToiRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORyIsMzQ5NzU6IlZFUlRFWF9BVFRSSUJfQVJSQVlfQlVGRkVSX0JJTkRJTkciLDM1MDQwOiJTVFJFQU1fRFJBVyIsMzUwNDQ6IlNUQVRJQ19EUkFXIiwzNTA0ODoiRFlOQU1JQ19EUkFXIiwzNTYzMjoiRlJBR01FTlRfU0hBREVSIiwzNTYzMzoiVkVSVEVYX1NIQURFUiIsMzU2NjA6Ik1BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUyIsMzU2NjE6Ik1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTIiwzNTY2MzoiU0hBREVSX1RZUEUiLDM1NjY0OiJGTE9BVF9WRUMyIiwzNTY2NToiRkxPQVRfVkVDMyIsMzU2NjY6IkZMT0FUX1ZFQzQiLDM1NjY3OiJJTlRfVkVDMiIsMzU2Njg6IklOVF9WRUMzIiwzNTY2OToiSU5UX1ZFQzQiLDM1NjcwOiJCT09MIiwzNTY3MToiQk9PTF9WRUMyIiwzNTY3MjoiQk9PTF9WRUMzIiwzNTY3MzoiQk9PTF9WRUM0IiwzNTY3NDoiRkxPQVRfTUFUMiIsMzU2NzU6IkZMT0FUX01BVDMiLDM1Njc2OiJGTE9BVF9NQVQ0IiwzNTY3ODoiU0FNUExFUl8yRCIsMzU2ODA6IlNBTVBMRVJfQ1VCRSIsMzU3MTI6IkRFTEVURV9TVEFUVVMiLDM1NzEzOiJDT01QSUxFX1NUQVRVUyIsMzU3MTQ6IkxJTktfU1RBVFVTIiwzNTcxNToiVkFMSURBVEVfU1RBVFVTIiwzNTcxNjoiSU5GT19MT0dfTEVOR1RIIiwzNTcxNzoiQVRUQUNIRURfU0hBREVSUyIsMzU3MTg6IkFDVElWRV9VTklGT1JNUyIsMzU3MTk6IkFDVElWRV9VTklGT1JNX01BWF9MRU5HVEgiLDM1NzIwOiJTSEFERVJfU09VUkNFX0xFTkdUSCIsMzU3MjE6IkFDVElWRV9BVFRSSUJVVEVTIiwzNTcyMjoiQUNUSVZFX0FUVFJJQlVURV9NQVhfTEVOR1RIIiwzNTcyNDoiU0hBRElOR19MQU5HVUFHRV9WRVJTSU9OIiwzNTcyNToiQ1VSUkVOVF9QUk9HUkFNIiwzNjAwMzoiU1RFTkNJTF9CQUNLX1JFRiIsMzYwMDQ6IlNURU5DSUxfQkFDS19WQUxVRV9NQVNLIiwzNjAwNToiU1RFTkNJTF9CQUNLX1dSSVRFTUFTSyIsMzYwMDY6IkZSQU1FQlVGRkVSX0JJTkRJTkciLDM2MDA3OiJSRU5ERVJCVUZGRVJfQklORElORyIsMzYwNDg6IkZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEUiLDM2MDQ5OiJGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FIiwzNjA1MDoiRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xFVkVMIiwzNjA1MToiRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0UiLDM2MDUzOiJGUkFNRUJVRkZFUl9DT01QTEVURSIsMzYwNTQ6IkZSQU1FQlVGRkVSX0lOQ09NUExFVEVfQVRUQUNITUVOVCIsMzYwNTU6IkZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UIiwzNjA1NzoiRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TIiwzNjA2MToiRlJBTUVCVUZGRVJfVU5TVVBQT1JURUQiLDM2MDY0OiJDT0xPUl9BVFRBQ0hNRU5UMCIsMzYwOTY6IkRFUFRIX0FUVEFDSE1FTlQiLDM2MTI4OiJTVEVOQ0lMX0FUVEFDSE1FTlQiLDM2MTYwOiJGUkFNRUJVRkZFUiIsMzYxNjE6IlJFTkRFUkJVRkZFUiIsMzYxNjI6IlJFTkRFUkJVRkZFUl9XSURUSCIsMzYxNjM6IlJFTkRFUkJVRkZFUl9IRUlHSFQiLDM2MTY0OiJSRU5ERVJCVUZGRVJfSU5URVJOQUxfRk9STUFUIiwzNjE2ODoiU1RFTkNJTF9JTkRFWDgiLDM2MTc2OiJSRU5ERVJCVUZGRVJfUkVEX1NJWkUiLDM2MTc3OiJSRU5ERVJCVUZGRVJfR1JFRU5fU0laRSIsMzYxNzg6IlJFTkRFUkJVRkZFUl9CTFVFX1NJWkUiLDM2MTc5OiJSRU5ERVJCVUZGRVJfQUxQSEFfU0laRSIsMzYxODA6IlJFTkRFUkJVRkZFUl9ERVBUSF9TSVpFIiwzNjE4MToiUkVOREVSQlVGRkVSX1NURU5DSUxfU0laRSIsMzYxOTQ6IlJHQjU2NSIsMzYzMzY6IkxPV19GTE9BVCIsMzYzMzc6Ik1FRElVTV9GTE9BVCIsMzYzMzg6IkhJR0hfRkxPQVQiLDM2MzM5OiJMT1dfSU5UIiwzNjM0MDoiTUVESVVNX0lOVCIsMzYzNDE6IkhJR0hfSU5UIiwzNjM0NjoiU0hBREVSX0NPTVBJTEVSIiwzNjM0NzoiTUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlMiLDM2MzQ4OiJNQVhfVkFSWUlOR19WRUNUT1JTIiwzNjM0OToiTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUyIsMzc0NDA6IlVOUEFDS19GTElQX1lfV0VCR0wiLDM3NDQxOiJVTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wiLDM3NDQyOiJDT05URVhUX0xPU1RfV0VCR0wiLDM3NDQzOiJVTlBBQ0tfQ09MT1JTUEFDRV9DT05WRVJTSU9OX1dFQkdMIiwzNzQ0NDoiQlJPV1NFUl9ERUZBVUxUX1dFQkdMIn19LHt9XSwxMzA6W2Z1bmN0aW9uKHQsZSxyKXt2YXIgbj10KCIuLzEuMC9udW1iZXJzIik7ZS5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBuW3RdfX0seyIuLzEuMC9udW1iZXJzIjoxMjl9XSwxMzE6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuKXt0aGlzLnBsb3Q9dCx0aGlzLnNoYWRlcj1lLHRoaXMuYnVmZmVySGk9cix0aGlzLmJ1ZmZlckxvPW4sdGhpcy5ib3VuZHM9WzEvMCwxLzAsLSgxLzApLC0oMS8wKV0sdGhpcy5udW1Qb2ludHM9MCx0aGlzLmNvbG9yPVswLDAsMCwxXX1mdW5jdGlvbiBpKHQsZSl7dmFyIHI9YSh0LmdsLGwudmVydGV4LGwuZnJhZ21lbnQpLGk9byh0LmdsKSxzPW8odC5nbCksdT1uZXcgbih0LHIsaSxzKTtyZXR1cm4gdS51cGRhdGUoZSksdC5hZGRPYmplY3QodSksdX12YXIgYT10KCJnbC1zaGFkZXIiKSxvPXQoImdsLWJ1ZmZlciIpLHM9dCgidHlwZWRhcnJheS1wb29sIiksbD10KCIuL2xpYi9zaGFkZXJzIik7ZS5leHBvcnRzPWk7dmFyIHU9W1sxLDAsMCwxLDAsMF0sWzEsMCwwLC0xLDAsMF0sWy0xLDAsMCwtMSwwLDBdLFstMSwwLDAsLTEsMCwwXSxbLTEsMCwwLDEsMCwwXSxbMSwwLDAsMSwwLDBdLFsxLDAsLTEsMCwwLDFdLFsxLDAsLTEsMCwwLC0xXSxbMSwwLDEsMCwwLC0xXSxbMSwwLDEsMCwwLC0xXSxbMSwwLDEsMCwwLDFdLFsxLDAsLTEsMCwwLDFdLFstMSwwLC0xLDAsMCwxXSxbLTEsMCwtMSwwLDAsLTFdLFstMSwwLDEsMCwwLC0xXSxbLTEsMCwxLDAsMCwtMV0sWy0xLDAsMSwwLDAsMV0sWy0xLDAsLTEsMCwwLDFdLFswLDEsMSwwLDAsMF0sWzAsMSwtMSwwLDAsMF0sWzAsLTEsLTEsMCwwLDBdLFswLC0xLC0xLDAsMCwwXSxbMCwxLDEsMCwwLDBdLFswLC0xLDEsMCwwLDBdLFswLDEsMCwtMSwxLDBdLFswLDEsMCwtMSwtMSwwXSxbMCwxLDAsMSwtMSwwXSxbMCwxLDAsMSwxLDBdLFswLDEsMCwtMSwxLDBdLFswLDEsMCwxLC0xLDBdLFswLC0xLDAsLTEsMSwwXSxbMCwtMSwwLC0xLC0xLDBdLFswLC0xLDAsMSwtMSwwXSxbMCwtMSwwLDEsMSwwXSxbMCwtMSwwLC0xLDEsMF0sWzAsLTEsMCwxLC0xLDBdXSxjPW4ucHJvdG90eXBlO2MuZHJhdz1mdW5jdGlvbigpe3ZhciB0PW5ldyBGbG9hdDMyQXJyYXkoWzAsMF0pLGU9bmV3IEZsb2F0MzJBcnJheShbMCwwXSkscj1uZXcgRmxvYXQzMkFycmF5KFswLDBdKSxuPW5ldyBGbG9hdDMyQXJyYXkoWzAsMF0pLGk9WzEsMV07cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbG90LG89dGhpcy5zaGFkZXIscz10aGlzLmJvdW5kcyxsPXRoaXMubnVtUG9pbnRzO2lmKGwpe3ZhciBjPWEuZ2wsaD1hLmRhdGFCb3gsZj1hLnZpZXdCb3gsZD1hLnBpeGVsUmF0aW8scD1zWzJdLXNbMF0sZz1zWzNdLXNbMV0sbT1oWzJdLWhbMF0sdj1oWzNdLWhbMV0seT0yKnAvbSx4PTIqZy92LGI9Miooc1swXS1oWzBdKS9tLTEsXz0yKihzWzFdLWhbMV0pL3YtMTt0WzBdPXksdFsxXT14LGVbMF09eS10WzBdLGVbMV09eC10WzFdLHJbMF09YixyWzFdPV8sblswXT1iLXJbMF0sblsxXT1fLXJbMV07dmFyIHc9ZlsyXS1mWzBdLE09ZlszXS1mWzFdO2lbMF09MipkL3csaVsxXT0yKmQvTSxvLmJpbmQoKSxvLnVuaWZvcm1zLnNjYWxlSGk9dCxvLnVuaWZvcm1zLnNjYWxlTG89ZSxvLnVuaWZvcm1zLnRyYW5zbGF0ZUhpPXIsby51bmlmb3Jtcy50cmFuc2xhdGVMbz1uLG8udW5pZm9ybXMucGl4ZWxTY2FsZT1pLG8udW5pZm9ybXMuY29sb3I9dGhpcy5jb2xvcix0aGlzLmJ1ZmZlckxvLmJpbmQoKSxvLmF0dHJpYnV0ZXMucG9zaXRpb25Mby5wb2ludGVyKGMuRkxPQVQsITEsMTYsMCksdGhpcy5idWZmZXJIaS5iaW5kKCksby5hdHRyaWJ1dGVzLnBvc2l0aW9uSGkucG9pbnRlcihjLkZMT0FULCExLDE2LDApLG8uYXR0cmlidXRlcy5waXhlbE9mZnNldC5wb2ludGVyKGMuRkxPQVQsITEsMTYsOCksYy5kcmF3QXJyYXlzKGMuVFJJQU5HTEVTLDAsbCp1Lmxlbmd0aCl9fX0oKSxjLmRyYXdQaWNrPWZ1bmN0aW9uKHQpe3JldHVybiB0fSxjLnBpY2s9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbH0sYy51cGRhdGU9ZnVuY3Rpb24odCl7dD10fHx7fTt2YXIgZSxyLG4saT10LnBvc2l0aW9uc3x8W10sYT10LmVycm9yc3x8W10sbz0xOyJsaW5lV2lkdGgiaW4gdCYmKG89K3QubGluZVdpZHRoKTt2YXIgbD01OyJjYXBTaXplImluIHQmJihsPSt0LmNhcFNpemUpLHRoaXMuY29sb3I9KHQuY29sb3J8fFswLDAsMCwxXSkuc2xpY2UoKTt2YXIgYz10aGlzLmJvdW5kcz1bMS8wLDEvMCwtKDEvMCksLSgxLzApXSxoPXRoaXMubnVtUG9pbnRzPWkubGVuZ3RoPj4xO2ZvcihlPTA7ZTxoOysrZSlyPWlbMiplXSxuPWlbMiplKzFdLGNbMF09TWF0aC5taW4ocixjWzBdKSxjWzFdPU1hdGgubWluKG4sY1sxXSksY1syXT1NYXRoLm1heChyLGNbMl0pLGNbM109TWF0aC5tYXgobixjWzNdKTtjWzJdPT09Y1swXSYmKGNbMl0rPTEpLGNbM109PT1jWzFdJiYoY1szXSs9MSk7dmFyIGY9MS8oY1syXS1jWzBdKSxkPTEvKGNbM10tY1sxXSkscD1jWzBdLGc9Y1sxXSxtPXMubWFsbG9jRmxvYXQ2NChoKnUubGVuZ3RoKjQpLHY9cy5tYWxsb2NGbG9hdDMyKGgqdS5sZW5ndGgqNCkseT1zLm1hbGxvY0Zsb2F0MzIoaCp1Lmxlbmd0aCo0KSx4PTA7Zm9yKGU9MDtlPGg7KytlKXtyPWlbMiplXSxuPWlbMiplKzFdO2Zvcih2YXIgYj1hWzQqZV0sXz1hWzQqZSsxXSx3PWFbNCplKzJdLE09YVs0KmUrM10sQT0wO0E8dS5sZW5ndGg7KytBKXt2YXIgaz11W0FdLFQ9a1swXSxFPWtbMV07VDwwP1QqPWI6VD4wJiYoVCo9XyksRTwwP0UqPXc6RT4wJiYoRSo9TSksbVt4KytdPWYqKHItcCtUKSxtW3grK109ZCoobi1nK0UpLG1beCsrXT1vKmtbMl0rKGwrbykqa1s0XSxtW3grK109byprWzNdKyhsK28pKmtbNV19fWZvcihlPTA7ZTxtLmxlbmd0aDtlKyspdltlXT1tW2VdLHlbZV09bVtlXS12W2VdO3RoaXMuYnVmZmVySGkudXBkYXRlKHYpLHRoaXMuYnVmZmVyTG8udXBkYXRlKHkpLHMuZnJlZShtKX0sYy5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5wbG90LnJlbW92ZU9iamVjdCh0aGlzKSx0aGlzLnNoYWRlci5kaXNwb3NlKCksdGhpcy5idWZmZXJIaS5kaXNwb3NlKCksdGhpcy5idWZmZXJMby5kaXNwb3NlKCl9fSx7Ii4vbGliL3NoYWRlcnMiOjEzMiwiZ2wtYnVmZmVyIjoxMjgsImdsLXNoYWRlciI6MjIwLCJ0eXBlZGFycmF5LXBvb2wiOjQ5Nn1dLDEzMjpbZnVuY3Rpb24odCxlLHIpe2UuZXhwb3J0cz17dmVydGV4OiJwcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG5hdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbkhpO1xuYXR0cmlidXRlIHZlYzIgcG9zaXRpb25MbztcbmF0dHJpYnV0ZSB2ZWMyIHBpeGVsT2Zmc2V0O1xuXG51bmlmb3JtIHZlYzIgc2NhbGVIaSwgc2NhbGVMbywgdHJhbnNsYXRlSGksIHRyYW5zbGF0ZUxvLCBwaXhlbFNjYWxlO1xuXG52ZWMyIHByb2plY3QodmVjMiBzY0hpLCB2ZWMyIHRySGksIHZlYzIgc2NMbywgdmVjMiB0ckxvLCB2ZWMyIHBvc0hpLCB2ZWMyIHBvc0xvKSB7XG4gIHJldHVybiBzY0hpICogcG9zSGkgKyB0ckhpXG4gICAgICAgKyBzY0xvICogcG9zSGkgKyB0ckxvXG4gICAgICAgKyBzY0hpICogcG9zTG9cbiAgICAgICArIHNjTG8gKiBwb3NMbztcbn1cblxudm9pZCBtYWluKCkge1xuICB2ZWMzIHNjclBvc2l0aW9uID0gdmVjMyhcbiAgICAgICAgIHByb2plY3Qoc2NhbGVIaSwgdHJhbnNsYXRlSGksIHNjYWxlTG8sIHRyYW5zbGF0ZUxvLCBwb3NpdGlvbkhpLCBwb3NpdGlvbkxvKSxcbiAgICAgICAgIDEpO1xuICBnbF9Qb3NpdGlvbiA9IHZlYzQoXG4gICAgc2NyUG9zaXRpb24ueHkgKyBzY3JQb3NpdGlvbi56ICogcGl4ZWxTY2FsZSAqIHBpeGVsT2Zmc2V0LFxuICAgIDAsXG4gICAgc2NyUG9zaXRpb24ueik7XG59XG4iLGZyYWdtZW50OiJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbnVuaWZvcm0gdmVjNCBjb2xvcjtcblxudm9pZCBtYWluKCkge1xuICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLnJnYiAqIGNvbG9yLmEsIGNvbG9yLmEpO1xufVxuIn19LHt9XSwxMzM6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuKXt0aGlzLmdsPXQsdGhpcy5zaGFkZXI9bix0aGlzLmJ1ZmZlcj1lLHRoaXMudmFvPXIsdGhpcy5waXhlbFJhdGlvPTEsdGhpcy5ib3VuZHM9W1sxLzAsMS8wLDEvMF0sWy0oMS8wKSwtKDEvMCksLSgxLzApXV0sdGhpcy5jbGlwQm91bmRzPVtbLSgxLzApLC0oMS8wKSwtKDEvMCldLFsxLzAsMS8wLDEvMF1dLHRoaXMubGluZVdpZHRoPVsxLDEsMV0sdGhpcy5jYXBTaXplPVsxMCwxMCwxMF0sdGhpcy5saW5lQ291bnQ9WzAsMCwwXSx0aGlzLmxpbmVPZmZzZXQ9WzAsMCwwXSx0aGlzLm9wYWNpdHk9MX1mdW5jdGlvbiBpKHQsZSl7Zm9yKHZhciByPTA7cjwzOysrcil0WzBdW3JdPU1hdGgubWluKHRbMF1bcl0sZVtyXSksdFsxXVtyXT1NYXRoLm1heCh0WzFdW3JdLGVbcl0pfWZ1bmN0aW9uIGEodCxlLHIsbil7Zm9yKHZhciBpPWZbbl0sYT0wO2E8aS5sZW5ndGg7KythKXt2YXIgbz1pW2FdO3QucHVzaChlWzBdLGVbMV0sZVsyXSxyWzBdLHJbMV0sclsyXSxyWzNdLG9bMF0sb1sxXSxvWzJdKX1yZXR1cm4gaS5sZW5ndGh9ZnVuY3Rpb24gbyh0KXt2YXIgZT10LmdsLHI9cyhlKSxpPWwoZSxbe2J1ZmZlcjpyLHR5cGU6ZS5GTE9BVCxzaXplOjMsb2Zmc2V0OjAsc3RyaWRlOjQwfSx7YnVmZmVyOnIsdHlwZTplLkZMT0FULHNpemU6NCxvZmZzZXQ6MTIsc3RyaWRlOjQwfSx7YnVmZmVyOnIsdHlwZTplLkZMT0FULHNpemU6MyxvZmZzZXQ6Mjgsc3RyaWRlOjQwfV0pLGE9dShlKTthLmF0dHJpYnV0ZXMucG9zaXRpb24ubG9jYXRpb249MCxhLmF0dHJpYnV0ZXMuY29sb3IubG9jYXRpb249MSxhLmF0dHJpYnV0ZXMub2Zmc2V0LmxvY2F0aW9uPTI7dmFyIG89bmV3IG4oZSxyLGksYSk7cmV0dXJuIG8udXBkYXRlKHQpLG99ZS5leHBvcnRzPW87dmFyIHM9dCgiZ2wtYnVmZmVyIiksbD10KCJnbC12YW8iKSx1PXQoIi4vc2hhZGVycy9pbmRleCIpLGM9WzEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDFdLGg9bi5wcm90b3R5cGU7aC5pc09wYXF1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wYWNpdHk+PTF9LGguaXNUcmFuc3BhcmVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wYWNpdHk8MX0saC5kcmF3VHJhbnNwYXJlbnQ9aC5kcmF3PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2wscj10aGlzLnNoYWRlci51bmlmb3Jtczt0aGlzLnNoYWRlci5iaW5kKCk7dmFyIG49ci52aWV3PXQudmlld3x8YyxpPXIucHJvamVjdGlvbj10LnByb2plY3Rpb258fGM7ci5tb2RlbD10Lm1vZGVsfHxjLHIuY2xpcEJvdW5kcz10aGlzLmNsaXBCb3VuZHMsci5vcGFjaXR5PXRoaXMub3BhY2l0eTt2YXIgYT1uWzEyXSxvPW5bMTNdLHM9blsxNF0sbD1uWzE1XSx1PXRoaXMucGl4ZWxSYXRpbyooaVszXSphK2lbN10qbytpWzExXSpzK2lbMTVdKmwpL2UuZHJhd2luZ0J1ZmZlckhlaWdodDt0aGlzLnZhby5iaW5kKCk7Zm9yKHZhciBoPTA7aDwzOysraCllLmxpbmVXaWR0aCh0aGlzLmxpbmVXaWR0aFtoXSksci5jYXBTaXplPXRoaXMuY2FwU2l6ZVtoXSp1LGUuZHJhd0FycmF5cyhlLkxJTkVTLHRoaXMubGluZU9mZnNldFtoXSx0aGlzLmxpbmVDb3VudFtoXSk7dGhpcy52YW8udW5iaW5kKCl9O3ZhciBmPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBBcnJheSgzKSxlPTA7ZTwzOysrZSl7Zm9yKHZhciByPVtdLG49MTtuPD0yOysrbilmb3IodmFyIGk9LTE7aTw9MTtpKz0yKXt2YXIgYT0obitlKSUzLG89WzAsMCwwXTtvW2FdPWksci5wdXNoKG8pfXRbZV09cn1yZXR1cm4gdH0oKTtoLnVwZGF0ZT1mdW5jdGlvbih0KXt0PXR8fHt9LCJsaW5lV2lkdGgiaW4gdCYmKHRoaXMubGluZVdpZHRoPXQubGluZVdpZHRoLEFycmF5LmlzQXJyYXkodGhpcy5saW5lV2lkdGgpfHwodGhpcy5saW5lV2lkdGg9W3RoaXMubGluZVdpZHRoLHRoaXMubGluZVdpZHRoLHRoaXMubGluZVdpZHRoXSkpLCJjYXBTaXplImluIHQmJih0aGlzLmNhcFNpemU9dC5jYXBTaXplLEFycmF5LmlzQXJyYXkodGhpcy5jYXBTaXplKXx8KHRoaXMuY2FwU2l6ZT1bdGhpcy5jYXBTaXplLHRoaXMuY2FwU2l6ZSx0aGlzLmNhcFNpemVdKSksIm9wYWNpdHkiaW4gdCYmKHRoaXMub3BhY2l0eT10Lm9wYWNpdHkpO3ZhciBlPXQuY29sb3J8fFtbMCwwLDBdLFswLDAsMF0sWzAsMCwwXV0scj10LnBvc2l0aW9uLG49dC5lcnJvcjtpZihBcnJheS5pc0FycmF5KGVbMF0pfHwoZT1bZSxlLGVdKSxyJiZuKXt2YXIgbz1bXSxzPXIubGVuZ3RoLGw9MDt0aGlzLmJvdW5kcz1bWzEvMCwxLzAsMS8wXSxbLSgxLzApLC0oMS8wKSwtKDEvMCldXSx0aGlzLmxpbmVDb3VudD1bMCwwLDBdO2Zvcih2YXIgdT0wO3U8MzsrK3Upe3RoaXMubGluZU9mZnNldFt1XT1sO3Q6Zm9yKHZhciBjPTA7YzxzOysrYyl7Zm9yKHZhciBoPXJbY10sZj0wO2Y8MzsrK2YpaWYoaXNOYU4oaFtmXSl8fCFpc0Zpbml0ZShoW2ZdKSljb250aW51ZSB0O3ZhciBkPW5bY10scD1lW3VdO2lmKEFycmF5LmlzQXJyYXkocFswXSkmJihwPWVbY10pLDM9PT1wLmxlbmd0aCYmKHA9W3BbMF0scFsxXSxwWzJdLDFdKSwhaXNOYU4oZFswXVt1XSkmJiFpc05hTihkWzFdW3VdKSl7aWYoZFswXVt1XTwwKXt2YXIgZz1oLnNsaWNlKCk7Z1t1XSs9ZFswXVt1XSxvLnB1c2goaFswXSxoWzFdLGhbMl0scFswXSxwWzFdLHBbMl0scFszXSwwLDAsMCxnWzBdLGdbMV0sZ1syXSxwWzBdLHBbMV0scFsyXSxwWzNdLDAsMCwwKSxpKHRoaXMuYm91bmRzLGcpLGwrPTIrYShvLGcscCx1KX1pZihkWzFdW3VdPjApe3ZhciBnPWguc2xpY2UoKTtnW3VdKz1kWzFdW3VdLG8ucHVzaChoWzBdLGhbMV0saFsyXSxwWzBdLHBbMV0scFsyXSxwWzNdLDAsMCwwLGdbMF0sZ1sxXSxnWzJdLHBbMF0scFsxXSxwWzJdLHBbM10sMCwwLDApLGkodGhpcy5ib3VuZHMsZyksbCs9MithKG8sZyxwLHUpfX19dGhpcy5saW5lQ291bnRbdV09bC10aGlzLmxpbmVPZmZzZXRbdV19dGhpcy5idWZmZXIudXBkYXRlKG8pfX0saC5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5zaGFkZXIuZGlzcG9zZSgpLHRoaXMuYnVmZmVyLmRpc3Bvc2UoKSx0aGlzLnZhby5kaXNwb3NlKCl9fSx7Ii4vc2hhZGVycy9pbmRleCI6MTM0LCJnbC1idWZmZXIiOjEyOCwiZ2wtdmFvIjoyMzZ9XSwxMzQ6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiZ2wtc2hhZGVyIiksaT0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbiwgb2Zmc2V0O1xuYXR0cmlidXRlIHZlYzQgY29sb3I7XG51bmlmb3JtIG1hdDQgbW9kZWwsIHZpZXcsIHByb2plY3Rpb247XG51bmlmb3JtIGZsb2F0IGNhcFNpemU7XG52YXJ5aW5nIHZlYzQgZnJhZ0NvbG9yO1xudmFyeWluZyB2ZWMzIGZyYWdQb3NpdGlvbjtcblxudm9pZCBtYWluKCkge1xuICB2ZWM0IHdvcmxkUG9zaXRpb24gID0gbW9kZWwgKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xuICB3b3JsZFBvc2l0aW9uICAgICAgID0gKHdvcmxkUG9zaXRpb24gLyB3b3JsZFBvc2l0aW9uLncpICsgdmVjNChjYXBTaXplICogb2Zmc2V0LCAwLjApO1xuICBnbF9Qb3NpdGlvbiAgICAgICAgID0gcHJvamVjdGlvbiAqIHZpZXcgKiB3b3JsZFBvc2l0aW9uO1xuICBmcmFnQ29sb3IgICAgICAgICAgID0gY29sb3I7XG4gIGZyYWdQb3NpdGlvbiAgICAgICAgPSBwb3NpdGlvbjtcbn0iLGE9InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcbnVuaWZvcm0gdmVjMyBjbGlwQm91bmRzWzJdO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xudmFyeWluZyB2ZWMzIGZyYWdQb3NpdGlvbjtcbnZhcnlpbmcgdmVjNCBmcmFnQ29sb3I7XG5cbnZvaWQgbWFpbigpIHtcbiAgaWYoYW55KGxlc3NUaGFuKGZyYWdQb3NpdGlvbiwgY2xpcEJvdW5kc1swXSkpIHx8IGFueShncmVhdGVyVGhhbihmcmFnUG9zaXRpb24sIGNsaXBCb3VuZHNbMV0pKSkge1xuICAgIGRpc2NhcmQ7XG4gIH1cbiAgZ2xfRnJhZ0NvbG9yID0gb3BhY2l0eSAqIGZyYWdDb2xvcjtcbn0iO2UuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbih0LGksYSxudWxsLFt7bmFtZToicG9zaXRpb24iLHR5cGU6InZlYzMifSx7bmFtZToib2Zmc2V0Iix0eXBlOiJ2ZWMzIn0se25hbWU6ImNvbG9yIix0eXBlOiJ2ZWM0In1dKX19LHsiZ2wtc2hhZGVyIjoyMjB9XSwxMzU6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt2YXIgZT10LmdldFBhcmFtZXRlcih0LkZSQU1FQlVGRkVSX0JJTkRJTkcpLHI9dC5nZXRQYXJhbWV0ZXIodC5SRU5ERVJCVUZGRVJfQklORElORyksbj10LmdldFBhcmFtZXRlcih0LlRFWFRVUkVfQklORElOR18yRCk7cmV0dXJuW2UscixuXX1mdW5jdGlvbiBpKHQsZSl7dC5iaW5kRnJhbWVidWZmZXIodC5GUkFNRUJVRkZFUixlWzBdKSx0LmJpbmRSZW5kZXJidWZmZXIodC5SRU5ERVJCVUZGRVIsZVsxXSksdC5iaW5kVGV4dHVyZSh0LlRFWFRVUkVfMkQsZVsyXSl9ZnVuY3Rpb24gYSh0LGUpe3ZhciByPXQuZ2V0UGFyYW1ldGVyKGUuTUFYX0NPTE9SX0FUVEFDSE1FTlRTX1dFQkdMKTt5PW5ldyBBcnJheShyKzEpO2Zvcih2YXIgbj0wO248PXI7KytuKXtmb3IodmFyIGk9bmV3IEFycmF5KHIpLGE9MDthPG47KythKWlbYV09dC5DT0xPUl9BVFRBQ0hNRU5UMCthO2Zvcih2YXIgYT1uO2E8cjsrK2EpaVthXT10Lk5PTkU7eVtuXT1pfX1mdW5jdGlvbiBvKHQpe3N3aXRjaCh0KXtjYXNlIHA6dGhyb3cgbmV3IEVycm9yKCJnbC1mYm86IEZyYW1lYnVmZmVyIHVuc3VwcG9ydGVkIik7Y2FzZSBnOnRocm93IG5ldyBFcnJvcigiZ2wtZmJvOiBGcmFtZWJ1ZmZlciBpbmNvbXBsZXRlIGF0dGFjaG1lbnQiKTtjYXNlIG06dGhyb3cgbmV3IEVycm9yKCJnbC1mYm86IEZyYW1lYnVmZmVyIGluY29tcGxldGUgZGltZW5zaW9ucyIpO2Nhc2Ugdjp0aHJvdyBuZXcgRXJyb3IoImdsLWZibzogRnJhbWVidWZmZXIgaW5jb21wbGV0ZSBtaXNzaW5nIGF0dGFjaG1lbnQiKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiZ2wtZmJvOiBGcmFtZWJ1ZmZlciBmYWlsZWQgZm9yIHVuc3BlY2lmaWVkIHJlYXNvbiIpfX1mdW5jdGlvbiBzKHQsZSxyLG4saSxhKXtpZighbilyZXR1cm4gbnVsbDt2YXIgbz1kKHQsZSxyLGksbik7cmV0dXJuIG8ubWFnRmlsdGVyPXQuTkVBUkVTVCxvLm1pbkZpbHRlcj10Lk5FQVJFU1Qsby5taXBTYW1wbGVzPTEsby5iaW5kKCksdC5mcmFtZWJ1ZmZlclRleHR1cmUyRCh0LkZSQU1FQlVGRkVSLGEsdC5URVhUVVJFXzJELG8uaGFuZGxlLDApLG99ZnVuY3Rpb24gbCh0LGUscixuLGkpe3ZhciBhPXQuY3JlYXRlUmVuZGVyYnVmZmVyKCk7cmV0dXJuIHQuYmluZFJlbmRlcmJ1ZmZlcih0LlJFTkRFUkJVRkZFUixhKSx0LnJlbmRlcmJ1ZmZlclN0b3JhZ2UodC5SRU5ERVJCVUZGRVIsbixlLHIpLHQuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIodC5GUkFNRUJVRkZFUixpLHQuUkVOREVSQlVGRkVSLGEpLGF9ZnVuY3Rpb24gdSh0KXt2YXIgZT1uKHQuZ2wpLHI9dC5nbCxhPXQuaGFuZGxlPXIuY3JlYXRlRnJhbWVidWZmZXIoKSx1PXQuX3NoYXBlWzBdLGM9dC5fc2hhcGVbMV0saD10LmNvbG9yLmxlbmd0aCxmPXQuX2V4dCxkPXQuX3VzZVN0ZW5jaWwscD10Ll91c2VEZXB0aCxnPXQuX2NvbG9yVHlwZTtyLmJpbmRGcmFtZWJ1ZmZlcihyLkZSQU1FQlVGRkVSLGEpO2Zvcih2YXIgbT0wO208aDsrK20pdC5jb2xvclttXT1zKHIsdSxjLGcsci5SR0JBLHIuQ09MT1JfQVRUQUNITUVOVDArbSk7MD09PWg/KHQuX2NvbG9yX3JiPWwocix1LGMsci5SR0JBNCxyLkNPTE9SX0FUVEFDSE1FTlQwKSxmJiZmLmRyYXdCdWZmZXJzV0VCR0woeVswXSkpOmg+MSYmZi5kcmF3QnVmZmVyc1dFQkdMKHlbaF0pO3ZhciB2PXIuZ2V0RXh0ZW5zaW9uKCJXRUJHTF9kZXB0aF90ZXh0dXJlIik7dj9kP3QuZGVwdGg9cyhyLHUsYyx2LlVOU0lHTkVEX0lOVF8yNF84X1dFQkdMLHIuREVQVEhfU1RFTkNJTCxyLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCk6cCYmKHQuZGVwdGg9cyhyLHUsYyxyLlVOU0lHTkVEX1NIT1JULHIuREVQVEhfQ09NUE9ORU5ULHIuREVQVEhfQVRUQUNITUVOVCkpOnAmJmQ/dC5fZGVwdGhfcmI9bChyLHUsYyxyLkRFUFRIX1NURU5DSUwsci5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQpOnA/dC5fZGVwdGhfcmI9bChyLHUsYyxyLkRFUFRIX0NPTVBPTkVOVDE2LHIuREVQVEhfQVRUQUNITUVOVCk6ZCYmKHQuX2RlcHRoX3JiPWwocix1LGMsci5TVEVOQ0lMX0lOREVYLHIuU1RFTkNJTF9BVFRBQ0hNRU5UKSk7dmFyIHg9ci5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKHIuRlJBTUVCVUZGRVIpO2lmKHghPT1yLkZSQU1FQlVGRkVSX0NPTVBMRVRFKXt0Ll9kZXN0cm95ZWQ9ITAsci5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUixudWxsKSxyLmRlbGV0ZUZyYW1lYnVmZmVyKHQuaGFuZGxlKSx0LmhhbmRsZT1udWxsLHQuZGVwdGgmJih0LmRlcHRoLmRpc3Bvc2UoKSx0LmRlcHRoPW51bGwpLHQuX2RlcHRoX3JiJiYoci5kZWxldGVSZW5kZXJidWZmZXIodC5fZGVwdGhfcmIpLHQuX2RlcHRoX3JiPW51bGwpO2Zvcih2YXIgbT0wO208dC5jb2xvci5sZW5ndGg7KyttKXQuY29sb3JbbV0uZGlzcG9zZSgpLHQuY29sb3JbbV09bnVsbDt0Ll9jb2xvcl9yYiYmKHIuZGVsZXRlUmVuZGVyYnVmZmVyKHQuX2NvbG9yX3JiKSx0Ll9jb2xvcl9yYj1udWxsKSxpKHIsZSksbyh4KX1pKHIsZSl9ZnVuY3Rpb24gYyh0LGUscixuLGksYSxvLHMpe3RoaXMuZ2w9dCx0aGlzLl9zaGFwZT1bMHxlLDB8cl0sdGhpcy5fZGVzdHJveWVkPSExLHRoaXMuX2V4dD1zLHRoaXMuY29sb3I9bmV3IEFycmF5KGkpO2Zvcih2YXIgbD0wO2w8aTsrK2wpdGhpcy5jb2xvcltsXT1udWxsO3RoaXMuX2NvbG9yX3JiPW51bGwsdGhpcy5kZXB0aD1udWxsLHRoaXMuX2RlcHRoX3JiPW51bGwsdGhpcy5fY29sb3JUeXBlPW4sdGhpcy5fdXNlRGVwdGg9YSx0aGlzLl91c2VTdGVuY2lsPW87dmFyIGM9dGhpcyxoPVswfGUsMHxyXTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhoLHswOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYy5fc2hhcGVbMF19LHNldDpmdW5jdGlvbih0KXtyZXR1cm4gYy53aWR0aD10fX0sMTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGMuX3NoYXBlWzFdfSxzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGMuaGVpZ2h0PXR9fX0pLHRoaXMuX3NoYXBlVmVjdG9yPWgsdSh0aGlzKX1mdW5jdGlvbiBoKHQsZSxyKXtpZih0Ll9kZXN0cm95ZWQpdGhyb3cgbmV3IEVycm9yKCJnbC1mYm86IENhbid0IHJlc2l6ZSBkZXN0cm95ZWQgRkJPIik7aWYodC5fc2hhcGVbMF0hPT1lfHx0Ll9zaGFwZVsxXSE9PXIpe3ZhciBhPXQuZ2wscz1hLmdldFBhcmFtZXRlcihhLk1BWF9SRU5ERVJCVUZGRVJfU0laRSk7aWYoZTwwfHxlPnN8fHI8MHx8cj5zKXRocm93IG5ldyBFcnJvcigiZ2wtZmJvOiBDYW4ndCByZXNpemUgRkJPLCBpbnZhbGlkIGRpbWVuc2lvbnMiKTt0Ll9zaGFwZVswXT1lLHQuX3NoYXBlWzFdPXI7Zm9yKHZhciBsPW4oYSksdT0wO3U8dC5jb2xvci5sZW5ndGg7Kyt1KXQuY29sb3JbdV0uc2hhcGU9dC5fc2hhcGU7dC5fY29sb3JfcmImJihhLmJpbmRSZW5kZXJidWZmZXIoYS5SRU5ERVJCVUZGRVIsdC5fY29sb3JfcmIpLGEucmVuZGVyYnVmZmVyU3RvcmFnZShhLlJFTkRFUkJVRkZFUixhLlJHQkE0LHQuX3NoYXBlWzBdLHQuX3NoYXBlWzFdKSksdC5kZXB0aCYmKHQuZGVwdGguc2hhcGU9dC5fc2hhcGUpLHQuX2RlcHRoX3JiJiYoYS5iaW5kUmVuZGVyYnVmZmVyKGEuUkVOREVSQlVGRkVSLHQuX2RlcHRoX3JiKSx0Ll91c2VEZXB0aCYmdC5fdXNlU3RlbmNpbD9hLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoYS5SRU5ERVJCVUZGRVIsYS5ERVBUSF9TVEVOQ0lMLHQuX3NoYXBlWzBdLHQuX3NoYXBlWzFdKTp0Ll91c2VEZXB0aD9hLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoYS5SRU5ERVJCVUZGRVIsYS5ERVBUSF9DT01QT05FTlQxNix0Ll9zaGFwZVswXSx0Ll9zaGFwZVsxXSk6dC5fdXNlU3RlbmNpbCYmYS5yZW5kZXJidWZmZXJTdG9yYWdlKGEuUkVOREVSQlVGRkVSLGEuU1RFTkNJTF9JTkRFWCx0Ll9zaGFwZVswXSx0Ll9zaGFwZVsxXSkpLGEuYmluZEZyYW1lYnVmZmVyKGEuRlJBTUVCVUZGRVIsdC5oYW5kbGUpO3ZhciBjPWEuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyhhLkZSQU1FQlVGRkVSKTtjIT09YS5GUkFNRUJVRkZFUl9DT01QTEVURSYmKHQuZGlzcG9zZSgpLGkoYSxsKSxvKGMpKSxpKGEsbCl9fWZ1bmN0aW9uIGYodCxlLHIsbil7cHx8KHA9dC5GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRCxnPXQuRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5ULG09dC5GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlMsdj10LkZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UKTt2YXIgaT10LmdldEV4dGVuc2lvbigiV0VCR0xfZHJhd19idWZmZXJzIik7aWYoIXkmJmkmJmEodCxpKSxBcnJheS5pc0FycmF5KGUpJiYobj1yLHI9MHxlWzFdLGU9MHxlWzBdKSwibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJnbC1mYm86IE1pc3Npbmcgc2hhcGUgcGFyYW1ldGVyIik7dmFyIG89dC5nZXRQYXJhbWV0ZXIodC5NQVhfUkVOREVSQlVGRkVSX1NJWkUpOwppZihlPDB8fGU+b3x8cjwwfHxyPm8pdGhyb3cgbmV3IEVycm9yKCJnbC1mYm86IFBhcmFtZXRlcnMgYXJlIHRvbyBsYXJnZSBmb3IgRkJPIik7bj1ufHx7fTt2YXIgcz0xO2lmKCJjb2xvciJpbiBuKXtpZihzPU1hdGgubWF4KDB8bi5jb2xvciwwKSxzPDApdGhyb3cgbmV3IEVycm9yKCJnbC1mYm86IE11c3Qgc3BlY2lmeSBhIG5vbm5lZ2F0aXZlIG51bWJlciBvZiBjb2xvcnMiKTtpZihzPjEpe2lmKCFpKXRocm93IG5ldyBFcnJvcigiZ2wtZmJvOiBNdWx0aXBsZSBkcmF3IGJ1ZmZlciBleHRlbnNpb24gbm90IHN1cHBvcnRlZCIpO2lmKHM+dC5nZXRQYXJhbWV0ZXIoaS5NQVhfQ09MT1JfQVRUQUNITUVOVFNfV0VCR0wpKXRocm93IG5ldyBFcnJvcigiZ2wtZmJvOiBDb250ZXh0IGRvZXMgbm90IHN1cHBvcnQgIitzKyIgZHJhdyBidWZmZXJzIil9fXZhciBsPXQuVU5TSUdORURfQllURSx1PXQuZ2V0RXh0ZW5zaW9uKCJPRVNfdGV4dHVyZV9mbG9hdCIpO2lmKG4uZmxvYXQmJnM+MCl7aWYoIXUpdGhyb3cgbmV3IEVycm9yKCJnbC1mYm86IENvbnRleHQgZG9lcyBub3Qgc3VwcG9ydCBmbG9hdGluZyBwb2ludCB0ZXh0dXJlcyIpO2w9dC5GTE9BVH1lbHNlIG4ucHJlZmVyRmxvYXQmJnM+MCYmdSYmKGw9dC5GTE9BVCk7dmFyIGg9ITA7ImRlcHRoImluIG4mJihoPSEhbi5kZXB0aCk7dmFyIGY9ITE7cmV0dXJuInN0ZW5jaWwiaW4gbiYmKGY9ISFuLnN0ZW5jaWwpLG5ldyBjKHQsZSxyLGwscyxoLGYsaSl9dmFyIGQ9dCgiZ2wtdGV4dHVyZTJkIik7ZS5leHBvcnRzPWY7dmFyIHAsZyxtLHYseT1udWxsLHg9Yy5wcm90b3R5cGU7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoeCx7c2hhcGU6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZXN0cm95ZWQ/WzAsMF06dGhpcy5fc2hhcGVWZWN0b3J9LHNldDpmdW5jdGlvbih0KXtpZihBcnJheS5pc0FycmF5KHQpfHwodD1bMHx0LDB8dF0pLDIhPT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImdsLWZibzogU2hhcGUgdmVjdG9yIG11c3QgYmUgbGVuZ3RoIDIiKTt2YXIgZT0wfHRbMF0scj0wfHRbMV07cmV0dXJuIGgodGhpcyxlLHIpLFtlLHJdfSxlbnVtZXJhYmxlOiExfSx3aWR0aDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rlc3Ryb3llZD8wOnRoaXMuX3NoYXBlWzBdfSxzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9MHx0LGgodGhpcyx0LHRoaXMuX3NoYXBlWzFdKSx0fSxlbnVtZXJhYmxlOiExfSxoZWlnaHQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZXN0cm95ZWQ/MDp0aGlzLl9zaGFwZVsxXX0sc2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0PTB8dCxoKHRoaXMsdGhpcy5fc2hhcGVbMF0sdCksdH0sZW51bWVyYWJsZTohMX19KSx4LmJpbmQ9ZnVuY3Rpb24oKXtpZighdGhpcy5fZGVzdHJveWVkKXt2YXIgdD10aGlzLmdsO3QuYmluZEZyYW1lYnVmZmVyKHQuRlJBTUVCVUZGRVIsdGhpcy5oYW5kbGUpLHQudmlld3BvcnQoMCwwLHRoaXMuX3NoYXBlWzBdLHRoaXMuX3NoYXBlWzFdKX19LHguZGlzcG9zZT1mdW5jdGlvbigpe2lmKCF0aGlzLl9kZXN0cm95ZWQpe3RoaXMuX2Rlc3Ryb3llZD0hMDt2YXIgdD10aGlzLmdsO3QuZGVsZXRlRnJhbWVidWZmZXIodGhpcy5oYW5kbGUpLHRoaXMuaGFuZGxlPW51bGwsdGhpcy5kZXB0aCYmKHRoaXMuZGVwdGguZGlzcG9zZSgpLHRoaXMuZGVwdGg9bnVsbCksdGhpcy5fZGVwdGhfcmImJih0LmRlbGV0ZVJlbmRlcmJ1ZmZlcih0aGlzLl9kZXB0aF9yYiksdGhpcy5fZGVwdGhfcmI9bnVsbCk7Zm9yKHZhciBlPTA7ZTx0aGlzLmNvbG9yLmxlbmd0aDsrK2UpdGhpcy5jb2xvcltlXS5kaXNwb3NlKCksdGhpcy5jb2xvcltlXT1udWxsO3RoaXMuX2NvbG9yX3JiJiYodC5kZWxldGVSZW5kZXJidWZmZXIodGhpcy5fY29sb3JfcmIpLHRoaXMuX2NvbG9yX3JiPW51bGwpfX19LHsiZ2wtdGV4dHVyZTJkIjoyMzJ9XSwxMzY6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49byhlKXx8Im9mIHVua25vd24gbmFtZSAoc2VlIG5wbSBnbHNsLXNoYWRlci1uYW1lKSIsbD0idW5rbm93biB0eXBlIjt2b2lkIDAhPT1yJiYobD1yPT09YS5GUkFHTUVOVF9TSEFERVI/ImZyYWdtZW50IjoidmVydGV4Iik7Zm9yKHZhciB1PWkoIkVycm9yIGNvbXBpbGluZyAlcyBzaGFkZXIgJXM6XG4iLGwsbiksYz1pKCIlcyVzIix1LHQpLGg9dC5zcGxpdCgiXG4iKSxmPXt9LGQ9MDtkPGgubGVuZ3RoO2QrKyl7dmFyIHA9aFtkXTtpZigiIiE9PXApe3ZhciBnPXBhcnNlSW50KHAuc3BsaXQoIjoiKVsyXSk7aWYoaXNOYU4oZykpdGhyb3cgbmV3IEVycm9yKGkoIkNvdWxkIG5vdCBwYXJzZSBlcnJvcjogJXMiLHApKTtmW2ddPXB9fWZvcih2YXIgbT1zKGUpLnNwbGl0KCJcbiIpLGQ9MDtkPG0ubGVuZ3RoO2QrKylpZihmW2QrM118fGZbZCsyXXx8ZltkKzFdKXt2YXIgdj1tW2RdO2lmKHUrPXYrIlxuIixmW2QrMV0pe3ZhciB5PWZbZCsxXTt5PXkuc3Vic3RyKHkuc3BsaXQoIjoiLDMpLmpvaW4oIjoiKS5sZW5ndGgrMSkudHJpbSgpLHUrPWkoIl5eXiAlc1xuXG4iLHkpfX1yZXR1cm57bG9uZzp1LnRyaW0oKSxzaG9ydDpjLnRyaW0oKX19dmFyIGk9dCgic3ByaW50Zi1qcyIpLnNwcmludGYsYT10KCJnbC1jb25zdGFudHMvbG9va3VwIiksbz10KCJnbHNsLXNoYWRlci1uYW1lIikscz10KCJhZGQtbGluZS1udW1iZXJzIik7ZS5leHBvcnRzPW59LHsiYWRkLWxpbmUtbnVtYmVycyI6MjksImdsLWNvbnN0YW50cy9sb29rdXAiOjEzMCwiZ2xzbC1zaGFkZXItbmFtZSI6MjQ0LCJzcHJpbnRmLWpzIjo0ODR9XSwxMzc6W2Z1bmN0aW9uKHQsZSxyKXtyLmxpbmVWZXJ0ZXg9InByZWNpc2lvbiBoaWdocCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbmF0dHJpYnV0ZSB2ZWMyIGFIaSwgYUxvLCBkSGksIGRMbztcblxudW5pZm9ybSB2ZWMyIHNjYWxlSGksIHRyYW5zbGF0ZUhpLCBzY2FsZUxvLCB0cmFuc2xhdGVMbywgc2NyZWVuU2hhcGU7XG51bmlmb3JtIGZsb2F0IHdpZHRoO1xuXG52YXJ5aW5nIHZlYzIgZGlyZWN0aW9uO1xuXG5cbnZlYzIgcHJvamVjdF8xXzAodmVjMiBzY0hpLCB2ZWMyIHRySGksIHZlYzIgc2NMbywgdmVjMiB0ckxvLCB2ZWMyIHBvc0hpLCB2ZWMyIHBvc0xvKSB7XG4gIHJldHVybiBzY0hpICogcG9zSGkgKyB0ckhpXG4gICAgICAgKyBzY0xvICogcG9zSGkgKyB0ckxvXG4gICAgICAgKyBzY0hpICogcG9zTG9cbiAgICAgICArIHNjTG8gKiBwb3NMbztcbn1cblxuXG52ZWMyIHByb2plY3RfMl8xKHZlYzIgc2NIaSwgdmVjMiBzY0xvLCB2ZWMyIHBvc0hpLCB2ZWMyIHBvc0xvKSB7XG4gIHJldHVybiBzY0hpICogcG9zSGlcbiAgICAgICArIHNjTG8gKiBwb3NIaVxuICAgICAgICsgc2NIaSAqIHBvc0xvXG4gICAgICAgKyBzY0xvICogcG9zTG87XG59XG5cbnZvaWQgbWFpbigpIHtcbiAgdmVjMiBwID0gcHJvamVjdF8xXzAoc2NhbGVIaSwgdHJhbnNsYXRlSGksIHNjYWxlTG8sIHRyYW5zbGF0ZUxvLCBhSGksIGFMbyk7XG4gIHZlYzIgZGlyID0gcHJvamVjdF8yXzEoc2NhbGVIaSwgc2NhbGVMbywgZEhpLCBkTG8pO1xuICB2ZWMyIG4gPSAwLjUgKiB3aWR0aCAqIG5vcm1hbGl6ZShzY3JlZW5TaGFwZS55eCAqIHZlYzIoZGlyLnksIC1kaXIueCkpIC8gc2NyZWVuU2hhcGUueHk7XG4gIHZlYzIgdGFuZ2VudCA9IG5vcm1hbGl6ZShzY3JlZW5TaGFwZS54eSAqIGRpcik7XG4gIGlmKGRpci54IDwgMC4wIHx8IChkaXIueCA9PSAwLjAgJiYgZGlyLnkgPCAwLjApKSB7XG4gICAgZGlyZWN0aW9uID0gLXRhbmdlbnQ7XG4gIH0gZWxzZSB7XG4gICAgZGlyZWN0aW9uID0gdGFuZ2VudDtcbiAgfVxuICBnbF9Qb3NpdGlvbiA9IHZlYzQocCArIG4sIDAuMCwgMS4wKTtcbn0iLHIubGluZUZyYWdtZW50PSJwcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG51bmlmb3JtIHZlYzQgY29sb3I7XG51bmlmb3JtIHZlYzIgc2NyZWVuU2hhcGU7XG51bmlmb3JtIHNhbXBsZXIyRCBkYXNoUGF0dGVybjtcbnVuaWZvcm0gZmxvYXQgZGFzaExlbmd0aDtcblxudmFyeWluZyB2ZWMyIGRpcmVjdGlvbjtcblxudm9pZCBtYWluKCkge1xuICBmbG9hdCB0ID0gZnJhY3QoZG90KGRpcmVjdGlvbiwgZ2xfRnJhZ0Nvb3JkLnh5KSAvIGRhc2hMZW5ndGgpO1xuICB2ZWM0IHBjb2xvciA9IGNvbG9yICogdGV4dHVyZTJEKGRhc2hQYXR0ZXJuLCB2ZWMyKHQsIDAuMCkpLnI7XG4gIGdsX0ZyYWdDb2xvciA9IHZlYzQocGNvbG9yLnJnYiAqIHBjb2xvci5hLCBwY29sb3IuYSk7XG59IixyLm1pdHJlVmVydGV4PSJwcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG5hdHRyaWJ1dGUgdmVjMiBhSGksIGFMbztcblxudW5pZm9ybSB2ZWMyIHNjYWxlSGksIHRyYW5zbGF0ZUhpLCBzY2FsZUxvLCB0cmFuc2xhdGVMbztcbnVuaWZvcm0gZmxvYXQgcmFkaXVzO1xuXG5cbnZlYzIgcHJvamVjdF8xXzAodmVjMiBzY0hpLCB2ZWMyIHRySGksIHZlYzIgc2NMbywgdmVjMiB0ckxvLCB2ZWMyIHBvc0hpLCB2ZWMyIHBvc0xvKSB7XG4gIHJldHVybiBzY0hpICogcG9zSGkgKyB0ckhpXG4gICAgICAgKyBzY0xvICogcG9zSGkgKyB0ckxvXG4gICAgICAgKyBzY0hpICogcG9zTG9cbiAgICAgICArIHNjTG8gKiBwb3NMbztcbn1cblxuXG52b2lkIG1haW4oKSB7XG4gIHZlYzIgcCA9IHByb2plY3RfMV8wKHNjYWxlSGksIHRyYW5zbGF0ZUhpLCBzY2FsZUxvLCB0cmFuc2xhdGVMbywgYUhpLCBhTG8pO1xuICBnbF9Qb3NpdGlvbiA9IHZlYzQocCwgMC4wLCAxLjApO1xuICBnbF9Qb2ludFNpemUgPSByYWRpdXM7XG59IixyLm1pdHJlRnJhZ21lbnQ9InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxudW5pZm9ybSB2ZWM0IGNvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gIGlmKGxlbmd0aChnbF9Qb2ludENvb3JkLnh5IC0gMC41KSA+IDAuMjUpIHtcbiAgICBkaXNjYXJkO1xuICB9XG4gIGdsX0ZyYWdDb2xvciA9IHZlYzQoY29sb3IucmdiLCBjb2xvci5hKTtcbn0iLHIucGlja1ZlcnRleD0icHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxuYXR0cmlidXRlIHZlYzIgYUhpLCBhTG8sIGRIaTtcbmF0dHJpYnV0ZSB2ZWM0IHBpY2swLCBwaWNrMTtcblxudW5pZm9ybSB2ZWMyIHNjYWxlSGksIHRyYW5zbGF0ZUhpLCBzY2FsZUxvLCB0cmFuc2xhdGVMbywgc2NyZWVuU2hhcGU7XG51bmlmb3JtIGZsb2F0IHdpZHRoO1xuXG52YXJ5aW5nIHZlYzQgcGlja0EsIHBpY2tCO1xuXG5cbnZlYzIgcHJvamVjdF8xXzAodmVjMiBzY0hpLCB2ZWMyIHRySGksIHZlYzIgc2NMbywgdmVjMiB0ckxvLCB2ZWMyIHBvc0hpLCB2ZWMyIHBvc0xvKSB7XG4gIHJldHVybiBzY0hpICogcG9zSGkgKyB0ckhpXG4gICAgICAgKyBzY0xvICogcG9zSGkgKyB0ckxvXG4gICAgICAgKyBzY0hpICogcG9zTG9cbiAgICAgICArIHNjTG8gKiBwb3NMbztcbn1cblxuXG52b2lkIG1haW4oKSB7XG4gIHZlYzIgcCA9IHByb2plY3RfMV8wKHNjYWxlSGksIHRyYW5zbGF0ZUhpLCBzY2FsZUxvLCB0cmFuc2xhdGVMbywgYUhpLCBhTG8pO1xuICB2ZWMyIG4gPSB3aWR0aCAqIG5vcm1hbGl6ZShzY3JlZW5TaGFwZS55eCAqIHZlYzIoZEhpLnksIC1kSGkueCkpIC8gc2NyZWVuU2hhcGUueHk7XG4gIGdsX1Bvc2l0aW9uID0gdmVjNChwICsgbiwgMCwgMSk7XG4gIHBpY2tBID0gcGljazA7XG4gIHBpY2tCID0gcGljazE7XG59IixyLnBpY2tGcmFnbWVudD0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG51bmlmb3JtIHZlYzQgcGlja09mZnNldDtcblxudmFyeWluZyB2ZWM0IHBpY2tBLCBwaWNrQjtcblxudm9pZCBtYWluKCkge1xuICB2ZWM0IGZyYWdJZCA9IHZlYzQocGlja0EueHl6LCAwLjApO1xuICBpZihwaWNrQi53ID4gcGlja0Eudykge1xuICAgIGZyYWdJZC54eXogPSBwaWNrQi54eXo7XG4gIH1cblxuICBmcmFnSWQgKz0gcGlja09mZnNldDtcblxuICBmcmFnSWQueSArPSBmbG9vcihmcmFnSWQueCAvIDI1Ni4wKTtcbiAgZnJhZ0lkLnggLT0gZmxvb3IoZnJhZ0lkLnggLyAyNTYuMCkgKiAyNTYuMDtcblxuICBmcmFnSWQueiArPSBmbG9vcihmcmFnSWQueSAvIDI1Ni4wKTtcbiAgZnJhZ0lkLnkgLT0gZmxvb3IoZnJhZ0lkLnkgLyAyNTYuMCkgKiAyNTYuMDtcblxuICBmcmFnSWQudyArPSBmbG9vcihmcmFnSWQueiAvIDI1Ni4wKTtcbiAgZnJhZ0lkLnogLT0gZmxvb3IoZnJhZ0lkLnogLyAyNTYuMCkgKiAyNTYuMDtcblxuICBnbF9GcmFnQ29sb3IgPSBmcmFnSWQgLyAyNTUuMDtcbn0iLHIuZmlsbFZlcnRleD0icHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxuYXR0cmlidXRlIHZlYzIgYUhpLCBhTG8sIGRIaTtcblxudW5pZm9ybSB2ZWMyIHNjYWxlSGksIHRyYW5zbGF0ZUhpLCBzY2FsZUxvLCB0cmFuc2xhdGVMbywgcHJvamVjdEF4aXM7XG51bmlmb3JtIGZsb2F0IHByb2plY3RWYWx1ZSwgZGVwdGg7XG5cblxudmVjMiBwcm9qZWN0XzFfMCh2ZWMyIHNjSGksIHZlYzIgdHJIaSwgdmVjMiBzY0xvLCB2ZWMyIHRyTG8sIHZlYzIgcG9zSGksIHZlYzIgcG9zTG8pIHtcbiAgcmV0dXJuIHNjSGkgKiBwb3NIaSArIHRySGlcbiAgICAgICArIHNjTG8gKiBwb3NIaSArIHRyTG9cbiAgICAgICArIHNjSGkgKiBwb3NMb1xuICAgICAgICsgc2NMbyAqIHBvc0xvO1xufVxuXG5cbnZvaWQgbWFpbigpIHtcbiAgdmVjMiBwID0gcHJvamVjdF8xXzAoc2NhbGVIaSwgdHJhbnNsYXRlSGksIHNjYWxlTG8sIHRyYW5zbGF0ZUxvLCBhSGksIGFMbyk7XG4gIGlmKGRIaS55IDwgMC4wIHx8IChkSGkueSA9PSAwLjAgJiYgZEhpLnggPCAwLjApKSB7XG4gICAgaWYoZG90KHAsIHByb2plY3RBeGlzKSA8IHByb2plY3RWYWx1ZSkge1xuICAgICAgcCA9IHAgKiAoMS4wIC0gYWJzKHByb2plY3RBeGlzKSkgKyBwcm9qZWN0QXhpcyAqIHByb2plY3RWYWx1ZTtcbiAgICB9XG4gIH1cbiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHAsIGRlcHRoLCAxKTtcbn0iLHIuZmlsbEZyYWdtZW50PSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbnVuaWZvcm0gdmVjNCBjb2xvcjtcblxudm9pZCBtYWluKCkge1xuICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLnJnYiAqIGNvbG9yLmEsIGNvbG9yLmEpO1xufSJ9LHt9XSwxMzg6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuLGksYSxvLHMsbCl7dGhpcy5wbG90PXQsdGhpcy5kYXNoUGF0dGVybj1lLHRoaXMubGluZUJ1ZmZlckhpPXIsdGhpcy5saW5lQnVmZmVyTG89bix0aGlzLnBpY2tCdWZmZXI9aSx0aGlzLmxpbmVTaGFkZXI9YSx0aGlzLm1pdHJlU2hhZGVyPW8sdGhpcy5maWxsU2hhZGVyPXMsdGhpcy5waWNrU2hhZGVyPWwsdGhpcy51c2luZ0Rhc2hlcz0hMSx0aGlzLmJvdW5kcz1bMS8wLDEvMCwtKDEvMCksLSgxLzApXSx0aGlzLndpZHRoPTEsdGhpcy5jb2xvcj1bMCwwLDEsMV0sdGhpcy5maWxsPVshMSwhMSwhMSwhMV0sdGhpcy5maWxsQ29sb3I9W1swLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXV0sdGhpcy5kYXRhPW51bGwsdGhpcy5udW1Qb2ludHM9MCx0aGlzLnZlcnRDb3VudD0wLHRoaXMucGlja09mZnNldD0wfWZ1bmN0aW9uIGkodCl7cmV0dXJuIHQubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0LnNsaWNlKCl9KX1mdW5jdGlvbiBhKHQsZSl7dmFyIHI9dC5nbCxpPXMociksYT1zKHIpLHU9cyhyKSxjPWwocixbMSwxXSksZj1vKHIsaC5saW5lVmVydGV4LGgubGluZUZyYWdtZW50KSxkPW8ocixoLm1pdHJlVmVydGV4LGgubWl0cmVGcmFnbWVudCkscD1vKHIsaC5maWxsVmVydGV4LGguZmlsbEZyYWdtZW50KSxnPW8ocixoLnBpY2tWZXJ0ZXgsaC5waWNrRnJhZ21lbnQpLG09bmV3IG4odCxjLGksYSx1LGYsZCxwLGcpO3JldHVybiB0LmFkZE9iamVjdChtKSxtLnVwZGF0ZShlKSxtfWUuZXhwb3J0cz1hO3ZhciBvPXQoImdsLXNoYWRlciIpLHM9dCgiZ2wtYnVmZmVyIiksbD10KCJnbC10ZXh0dXJlMmQiKSx1PXQoIm5kYXJyYXkiKSxjPXQoInR5cGVkYXJyYXktcG9vbCIpLGg9dCgiLi9saWIvc2hhZGVycyIpLGY9bi5wcm90b3R5cGU7Zi5zZXRQcm9qZWN0aW9uTW9kZWw9ZnVuY3Rpb24oKXt2YXIgdD17c2NhbGVIaTpuZXcgRmxvYXQzMkFycmF5KFswLDBdKSxzY2FsZUxvOm5ldyBGbG9hdDMyQXJyYXkoWzAsMF0pLHRyYW5zbGF0ZUhpOm5ldyBGbG9hdDMyQXJyYXkoWzAsMF0pLHRyYW5zbGF0ZUxvOm5ldyBGbG9hdDMyQXJyYXkoWzAsMF0pLHNjcmVlblNoYXBlOlswLDBdfTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLmJvdW5kcyxyPXRoaXMucGxvdC52aWV3Qm94LG49dGhpcy5wbG90LmRhdGFCb3gsaT1lWzJdLWVbMF0sYT1lWzNdLWVbMV0sbz1uWzJdLW5bMF0scz1uWzNdLW5bMV0sbD1yWzJdLXJbMF0sdT1yWzNdLXJbMV0sYz0yKmkvbyxoPTIqYS9zLGY9MiooZVswXS1uWzBdKS9vLTEsZD0yKihlWzFdLW5bMV0pL3MtMTtyZXR1cm4gdC5zY2FsZUhpWzBdPWMsdC5zY2FsZUhpWzFdPWgsdC5zY2FsZUxvWzBdPWMtdC5zY2FsZUhpWzBdLHQuc2NhbGVMb1sxXT1oLXQuc2NhbGVIaVsxXSx0LnRyYW5zbGF0ZUhpWzBdPWYsdC50cmFuc2xhdGVIaVsxXT1kLHQudHJhbnNsYXRlTG9bMF09Zi10LnRyYW5zbGF0ZUhpWzBdLHQudHJhbnNsYXRlTG9bMV09ZC10LnRyYW5zbGF0ZUhpWzFdLHQuc2NyZWVuU2hhcGVbMF09bCx0LnNjcmVlblNoYXBlWzFdPXUsdH19KCksZi5zZXRQcm9qZWN0aW9uVW5pZm9ybXM9ZnVuY3Rpb24odCxlKXt0LnNjYWxlSGk9ZS5zY2FsZUhpLHQuc2NhbGVMbz1lLnNjYWxlTG8sdC50cmFuc2xhdGVIaT1lLnRyYW5zbGF0ZUhpLHQudHJhbnNsYXRlTG89ZS50cmFuc2xhdGVMbyx0LnNjcmVlblNoYXBlPWUuc2NyZWVuU2hhcGV9LGYuZHJhdz1mdW5jdGlvbigpe3ZhciB0PVsxLDBdLGU9Wy0xLDBdLHI9WzAsMV0sbj1bMCwtMV07cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9dGhpcy52ZXJ0Q291bnQ7aWYoaSl7dmFyIGE9dGhpcy5zZXRQcm9qZWN0aW9uTW9kZWwoKSxvPXRoaXMucGxvdCxzPXRoaXMud2lkdGgsbD1vLmdsLHU9by5waXhlbFJhdGlvLGM9dGhpcy5jb2xvcixoPXRoaXMuZmlsbFNoYWRlci5hdHRyaWJ1dGVzO3RoaXMubGluZUJ1ZmZlckxvLmJpbmQoKSxoLmFMby5wb2ludGVyKGwuRkxPQVQsITEsMTYsMCksdGhpcy5saW5lQnVmZmVySGkuYmluZCgpO3ZhciBmPXRoaXMuZmlsbDtpZihmWzBdfHxmWzFdfHxmWzJdfHxmWzNdKXt2YXIgZD10aGlzLmZpbGxTaGFkZXI7ZC5iaW5kKCk7dmFyIHA9ZC51bmlmb3Jtczt0aGlzLnNldFByb2plY3Rpb25Vbmlmb3JtcyhwLGEpLHAuZGVwdGg9by5uZXh0RGVwdGhWYWx1ZSgpLGguYUhpLnBvaW50ZXIobC5GTE9BVCwhMSwxNiwwKSxoLmRIaS5wb2ludGVyKGwuRkxPQVQsITEsMTYsOCksbC5kZXB0aE1hc2soITApLGwuZW5hYmxlKGwuREVQVEhfVEVTVCk7dmFyIGc9dGhpcy5maWxsQ29sb3I7ZlswXSYmKHAuY29sb3I9Z1swXSxwLnByb2plY3RBeGlzPWUscC5wcm9qZWN0VmFsdWU9MSxsLmRyYXdBcnJheXMobC5UUklBTkdMRVMsMCxpKSksZlsxXSYmKHAuY29sb3I9Z1sxXSxwLnByb2plY3RBeGlzPW4scC5wcm9qZWN0VmFsdWU9MSxsLmRyYXdBcnJheXMobC5UUklBTkdMRVMsMCxpKSksZlsyXSYmKHAuY29sb3I9Z1syXSxwLnByb2plY3RBeGlzPXQscC5wcm9qZWN0VmFsdWU9MSxsLmRyYXdBcnJheXMobC5UUklBTkdMRVMsMCxpKSksZlszXSYmKHAuY29sb3I9Z1szXSxwLnByb2plY3RBeGlzPXIscC5wcm9qZWN0VmFsdWU9MSxsLmRyYXdBcnJheXMobC5UUklBTkdMRVMsMCxpKSksbC5kZXB0aE1hc2soITEpLGwuZGlzYWJsZShsLkRFUFRIX1RFU1QpfXZhciBtPXRoaXMubGluZVNoYWRlcjttLmJpbmQoKSx0aGlzLmxpbmVCdWZmZXJMby5iaW5kKCksbS5hdHRyaWJ1dGVzLmFMby5wb2ludGVyKGwuRkxPQVQsITEsMTYsMCksbS5hdHRyaWJ1dGVzLmRMby5wb2ludGVyKGwuRkxPQVQsITEsMTYsOCksdGhpcy5saW5lQnVmZmVySGkuYmluZCgpO3ZhciB2PW0udW5pZm9ybXM7dGhpcy5zZXRQcm9qZWN0aW9uVW5pZm9ybXModixhKSx2LmNvbG9yPWMsdi53aWR0aD1zKnUsdi5kYXNoUGF0dGVybj10aGlzLmRhc2hQYXR0ZXJuLmJpbmQoKSx2LmRhc2hMZW5ndGg9dGhpcy5kYXNoTGVuZ3RoKnU7dmFyIHk9bS5hdHRyaWJ1dGVzO2lmKHkuYUhpLnBvaW50ZXIobC5GTE9BVCwhMSwxNiwwKSx5LmRIaS5wb2ludGVyKGwuRkxPQVQsITEsMTYsOCksbC5kcmF3QXJyYXlzKGwuVFJJQU5HTEVTLDAsaSkscz4yJiYhdGhpcy51c2luZ0Rhc2hlcyl7dmFyIHg9dGhpcy5taXRyZVNoYWRlcjt0aGlzLmxpbmVCdWZmZXJMby5iaW5kKCkseC5hdHRyaWJ1dGVzLmFMby5wb2ludGVyKGwuRkxPQVQsITEsNDgsMCksdGhpcy5saW5lQnVmZmVySGkuYmluZCgpLHguYmluZCgpO3ZhciBiPXgudW5pZm9ybXM7dGhpcy5zZXRQcm9qZWN0aW9uVW5pZm9ybXMoYixhKSxiLmNvbG9yPWMsYi5yYWRpdXM9cyp1LHguYXR0cmlidXRlcy5hSGkucG9pbnRlcihsLkZMT0FULCExLDQ4LDApLGwuZHJhd0FycmF5cyhsLlBPSU5UUywwLGkvM3wwKX19fX0oKSxmLmRyYXdQaWNrPWZ1bmN0aW9uKCl7dmFyIHQ9WzAsMCwwLDBdO3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj10aGlzLnZlcnRDb3VudCxuPXRoaXMubnVtUG9pbnRzO2lmKHRoaXMucGlja09mZnNldD1lLCFyKXJldHVybiBlK247dmFyIGk9dGhpcy5zZXRQcm9qZWN0aW9uTW9kZWwoKSxhPXRoaXMucGxvdCxvPXRoaXMud2lkdGgscz1hLmdsLGw9YS5waWNrUGl4ZWxSYXRpbyx1PXRoaXMucGlja1NoYWRlcixjPXRoaXMucGlja0J1ZmZlcjt0WzBdPTI1NSZlLHRbMV09ZT4+PjgmMjU1LHRbMl09ZT4+PjE2JjI1NSx0WzNdPWU+Pj4yNCx1LmJpbmQoKTt2YXIgaD11LnVuaWZvcm1zO3RoaXMuc2V0UHJvamVjdGlvblVuaWZvcm1zKGgsaSksaC53aWR0aD1vKmwsaC5waWNrT2Zmc2V0PXQ7dmFyIGY9dS5hdHRyaWJ1dGVzO3JldHVybiB0aGlzLmxpbmVCdWZmZXJIaS5iaW5kKCksZi5hSGkucG9pbnRlcihzLkZMT0FULCExLDE2LDApLGYuZEhpLnBvaW50ZXIocy5GTE9BVCwhMSwxNiw4KSx0aGlzLmxpbmVCdWZmZXJMby5iaW5kKCksZi5hTG8ucG9pbnRlcihzLkZMT0FULCExLDE2LDApLGMuYmluZCgpLGYucGljazAucG9pbnRlcihzLlVOU0lHTkVEX0JZVEUsITEsOCwwKSxmLnBpY2sxLnBvaW50ZXIocy5VTlNJR05FRF9CWVRFLCExLDgsNCkscy5kcmF3QXJyYXlzKHMuVFJJQU5HTEVTLDAsciksZStufX0oKSxmLnBpY2s9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMucGlja09mZnNldCxpPXRoaXMubnVtUG9pbnRzO2lmKHI8bnx8cj49bitpKXJldHVybiBudWxsO3ZhciBhPXItbixvPXRoaXMuZGF0YTtyZXR1cm57b2JqZWN0OnRoaXMscG9pbnRJZDphLGRhdGFDb29yZDpbb1syKmFdLG9bMiphKzFdXX19LGYudXBkYXRlPWZ1bmN0aW9uKHQpe3Q9dHx8e307dmFyIGUscixuLGEsbyxzPXRoaXMucGxvdC5nbDt0aGlzLmNvbG9yPSh0LmNvbG9yfHxbMCwwLDEsMV0pLnNsaWNlKCksdGhpcy53aWR0aD0rKHQud2lkdGh8fDEpLHRoaXMuZmlsbD0odC5maWxsfHxbITEsITEsITEsITFdKS5zbGljZSgpLHRoaXMuZmlsbENvbG9yPWkodC5maWxsQ29sb3J8fFtbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXSxbMCwwLDAsMV1dKTt2YXIgaD10LmRhc2hlc3x8WzFdLGY9MDtmb3IoZT0wO2U8aC5sZW5ndGg7KytlKWYrPWhbZV07dmFyIGQ9Yy5tYWxsb2NVaW50OChmKTtuPTA7dmFyIHA9MjU1O2ZvcihlPTA7ZTxoLmxlbmd0aDsrK2Upe2ZvcihyPTA7cjxoW2VdOysrcilkW24rK109cDtwXj0yNTV9dGhpcy5kYXNoUGF0dGVybi5kaXNwb3NlKCksdGhpcy51c2luZ0Rhc2hlcz1oLmxlbmd0aD4xLHRoaXMuZGFzaFBhdHRlcm49bChzLHUoZCxbZiwxLDRdLFsxLDAsMF0pKSx0aGlzLmRhc2hQYXR0ZXJuLm1pbkZpbHRlcj1zLk5FQVJFU1QsdGhpcy5kYXNoUGF0dGVybi5tYWdGaWx0ZXI9cy5ORUFSRVNULHRoaXMuZGFzaExlbmd0aD1mLGMuZnJlZShkKTt2YXIgZz10LnBvc2l0aW9uczt0aGlzLmRhdGE9Zzt2YXIgbT10aGlzLmJvdW5kczttWzBdPW1bMV09MS8wLG1bMl09bVszXT0tKDEvMCk7dmFyIHY9dGhpcy5udW1Qb2ludHM9Zy5sZW5ndGg+Pj4xO2lmKDAhPT12KXtmb3IoZT0wO2U8djsrK2UpYT1nWzIqZV0sbz1nWzIqZSsxXSxpc05hTihhKXx8aXNOYU4obyl8fChtWzBdPU1hdGgubWluKG1bMF0sYSksbVsxXT1NYXRoLm1pbihtWzFdLG8pLG1bMl09TWF0aC5tYXgobVsyXSxhKSxtWzNdPU1hdGgubWF4KG1bM10sbykpO21bMF09PT1tWzJdJiYobVsyXSs9MSksbVszXT09PW1bMV0mJihtWzNdKz0xKTt2YXIgeT1jLm1hbGxvY0Zsb2F0NjQoMjQqKHYtMSkpLHg9Yy5tYWxsb2NGbG9hdDMyKDI0Kih2LTEpKSxiPWMubWFsbG9jRmxvYXQzMigyNCoodi0xKSksXz1jLm1hbGxvY1VpbnQzMigxMioodi0xKSksdz14Lmxlbmd0aCxNPV8ubGVuZ3RoO249djtmb3IodmFyIEE9MDtuPjE7KXt2YXIgaz0tLW47YT1nWzIqbl0sbz1nWzIqbisxXTt2YXIgVD1rLTEsRT1nWzIqVF0sUz1nWzIqVCsxXTtpZighKGlzTmFOKGEpfHxpc05hTihvKXx8aXNOYU4oRSl8fGlzTmFOKFMpKSl7QSs9MSxhPShhLW1bMF0pLyhtWzJdLW1bMF0pLG89KG8tbVsxXSkvKG1bM10tbVsxXSksRT0oRS1tWzBdKS8obVsyXS1tWzBdKSxTPShTLW1bMV0pLyhtWzNdLW1bMV0pO3ZhciBMPUUtYSx6PVMtbyxDPWt8MTw8MjQsST1rLTEsUD1rLEQ9ay0xfDE8PDI0O3lbLS13XT0teix5Wy0td109LUwseVstLXddPW8seVstLXddPWEsX1stLU1dPUMsX1stLU1dPUkseVstLXddPXoseVstLXddPUwseVstLXddPVMseVstLXddPUUsX1stLU1dPVAsX1stLU1dPUQseVstLXddPS16LHlbLS13XT0tTCx5Wy0td109Uyx5Wy0td109RSxfWy0tTV09UCxfWy0tTV09RCx5Wy0td109eix5Wy0td109TCx5Wy0td109Uyx5Wy0td109RSxfWy0tTV09UCxfWy0tTV09RCx5Wy0td109LXoseVstLXddPS1MLHlbLS13XT1vLHlbLS13XT1hLF9bLS1NXT1DLF9bLS1NXT1JLHlbLS13XT16LHlbLS13XT1MLHlbLS13XT1vLHlbLS13XT1hLF9bLS1NXT1DLF9bLS1NXT1JfX1mb3IoZT0wO2U8eS5sZW5ndGg7ZSsrKXhbZV09eVtlXSxiW2VdPXlbZV0teFtlXTt0aGlzLnZlcnRDb3VudD02KkEsdGhpcy5saW5lQnVmZmVySGkudXBkYXRlKHguc3ViYXJyYXkodykpLHRoaXMubGluZUJ1ZmZlckxvLnVwZGF0ZShiLnN1YmFycmF5KHcpKSx0aGlzLnBpY2tCdWZmZXIudXBkYXRlKF8uc3ViYXJyYXkoTSkpLGMuZnJlZSh5KSxjLmZyZWUoeCksYy5mcmVlKGIpLGMuZnJlZShfKX19LGYuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMucGxvdC5yZW1vdmVPYmplY3QodGhpcyksdGhpcy5saW5lQnVmZmVyTG8uZGlzcG9zZSgpLHRoaXMubGluZUJ1ZmZlckhpLmRpc3Bvc2UoKSx0aGlzLnBpY2tCdWZmZXIuZGlzcG9zZSgpLHRoaXMubGluZVNoYWRlci5kaXNwb3NlKCksdGhpcy5taXRyZVNoYWRlci5kaXNwb3NlKCksdGhpcy5maWxsU2hhZGVyLmRpc3Bvc2UoKSx0aGlzLnBpY2tTaGFkZXIuZGlzcG9zZSgpLHRoaXMuZGFzaFBhdHRlcm4uZGlzcG9zZSgpfX0seyIuL2xpYi9zaGFkZXJzIjoxMzcsImdsLWJ1ZmZlciI6MTI4LCJnbC1zaGFkZXIiOjIyMCwiZ2wtdGV4dHVyZTJkIjoyMzIsbmRhcnJheTo0MjcsInR5cGVkYXJyYXktcG9vbCI6NDk2fV0sMTM5OltmdW5jdGlvbih0LGUscil7dmFyIG49dCgiZ2wtc2hhZGVyIiksaT0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbiwgbmV4dFBvc2l0aW9uO1xuYXR0cmlidXRlIGZsb2F0IGFyY0xlbmd0aCwgbGluZVdpZHRoO1xuYXR0cmlidXRlIHZlYzQgY29sb3I7XG5cbnVuaWZvcm0gdmVjMiBzY3JlZW5TaGFwZTtcbnVuaWZvcm0gZmxvYXQgcGl4ZWxSYXRpbztcbnVuaWZvcm0gbWF0NCBtb2RlbCwgdmlldywgcHJvamVjdGlvbjtcblxudmFyeWluZyB2ZWM0IGZyYWdDb2xvcjtcbnZhcnlpbmcgdmVjMyB3b3JsZFBvc2l0aW9uO1xudmFyeWluZyBmbG9hdCBwaXhlbEFyY0xlbmd0aDtcblxudm9pZCBtYWluKCkge1xuICB2ZWM0IHByb2plY3RlZCA9IHByb2plY3Rpb24gKiB2aWV3ICogbW9kZWwgKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xuICB2ZWM0IHRhbmdlbnRDbGlwID0gcHJvamVjdGlvbiAqIHZpZXcgKiBtb2RlbCAqIHZlYzQobmV4dFBvc2l0aW9uIC0gcG9zaXRpb24sIDAuMCk7XG4gIHZlYzIgdGFuZ2VudCA9IG5vcm1hbGl6ZShzY3JlZW5TaGFwZSAqIHRhbmdlbnRDbGlwLnh5KTtcbiAgdmVjMiBvZmZzZXQgPSAwLjUgKiBwaXhlbFJhdGlvICogbGluZVdpZHRoICogdmVjMih0YW5nZW50LnksIC10YW5nZW50LngpIC8gc2NyZWVuU2hhcGU7XG5cbiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHByb2plY3RlZC54eSArIHByb2plY3RlZC53ICogb2Zmc2V0LCBwcm9qZWN0ZWQuencpO1xuXG4gIHdvcmxkUG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgcGl4ZWxBcmNMZW5ndGggPSBhcmNMZW5ndGg7XG4gIGZyYWdDb2xvciA9IGNvbG9yO1xufVxuIixhPSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbnVuaWZvcm0gdmVjMyAgICAgIGNsaXBCb3VuZHNbMl07XG51bmlmb3JtIHNhbXBsZXIyRCBkYXNoVGV4dHVyZTtcbnVuaWZvcm0gZmxvYXQgICAgIGRhc2hTY2FsZTtcbnVuaWZvcm0gZmxvYXQgICAgIG9wYWNpdHk7XG5cbnZhcnlpbmcgdmVjMyAgICB3b3JsZFBvc2l0aW9uO1xudmFyeWluZyBmbG9hdCAgIHBpeGVsQXJjTGVuZ3RoO1xudmFyeWluZyB2ZWM0ICAgIGZyYWdDb2xvcjtcblxudm9pZCBtYWluKCkge1xuICBpZihhbnkobGVzc1RoYW4od29ybGRQb3NpdGlvbiwgY2xpcEJvdW5kc1swXSkpIHx8IGFueShncmVhdGVyVGhhbih3b3JsZFBvc2l0aW9uLCBjbGlwQm91bmRzWzFdKSkpIHtcbiAgICBkaXNjYXJkO1xuICB9XG4gIGZsb2F0IGRhc2hXZWlnaHQgPSB0ZXh0dXJlMkQoZGFzaFRleHR1cmUsIHZlYzIoZGFzaFNjYWxlICogcGl4ZWxBcmNMZW5ndGgsIDApKS5yO1xuICBpZihkYXNoV2VpZ2h0IDwgMC41KSB7XG4gICAgZGlzY2FyZDtcbiAgfVxuICBnbF9GcmFnQ29sb3IgPSBmcmFnQ29sb3IgKiBvcGFjaXR5O1xufVxuIixvPSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbiNkZWZpbmUgRkxPQVRfTUFYICAxLjcwMTQxMTg0ZTM4XG4jZGVmaW5lIEZMT0FUX01JTiAgMS4xNzU0OTQzNWUtMzhcblxubG93cCB2ZWM0IGVuY29kZV9mbG9hdF8xXzAoaGlnaHAgZmxvYXQgdikge1xuICBoaWdocCBmbG9hdCBhdiA9IGFicyh2KTtcblxuICAvL0hhbmRsZSBzcGVjaWFsIGNhc2VzXG4gIGlmKGF2IDwgRkxPQVRfTUlOKSB7XG4gICAgcmV0dXJuIHZlYzQoMC4wLCAwLjAsIDAuMCwgMC4wKTtcbiAgfSBlbHNlIGlmKHYgPiBGTE9BVF9NQVgpIHtcbiAgICByZXR1cm4gdmVjNCgxMjcuMCwgMTI4LjAsIDAuMCwgMC4wKSAvIDI1NS4wO1xuICB9IGVsc2UgaWYodiA8IC1GTE9BVF9NQVgpIHtcbiAgICByZXR1cm4gdmVjNCgyNTUuMCwgMTI4LjAsIDAuMCwgMC4wKSAvIDI1NS4wO1xuICB9XG5cbiAgaGlnaHAgdmVjNCBjID0gdmVjNCgwLDAsMCwwKTtcblxuICAvL0NvbXB1dGUgZXhwb25lbnQgYW5kIG1hbnRpc3NhXG4gIGhpZ2hwIGZsb2F0IGUgPSBmbG9vcihsb2cyKGF2KSk7XG4gIGhpZ2hwIGZsb2F0IG0gPSBhdiAqIHBvdygyLjAsIC1lKSAtIDEuMDtcbiAgXG4gIC8vVW5wYWNrIG1hbnRpc3NhXG4gIGNbMV0gPSBmbG9vcigxMjguMCAqIG0pO1xuICBtIC09IGNbMV0gLyAxMjguMDtcbiAgY1syXSA9IGZsb29yKDMyNzY4LjAgKiBtKTtcbiAgbSAtPSBjWzJdIC8gMzI3NjguMDtcbiAgY1szXSA9IGZsb29yKDgzODg2MDguMCAqIG0pO1xuICBcbiAgLy9VbnBhY2sgZXhwb25lbnRcbiAgaGlnaHAgZmxvYXQgZWJpYXMgPSBlICsgMTI3LjA7XG4gIGNbMF0gPSBmbG9vcihlYmlhcyAvIDIuMCk7XG4gIGViaWFzIC09IGNbMF0gKiAyLjA7XG4gIGNbMV0gKz0gZmxvb3IoZWJpYXMpICogMTI4LjA7IFxuXG4gIC8vVW5wYWNrIHNpZ24gYml0XG4gIGNbMF0gKz0gMTI4LjAgKiBzdGVwKDAuMCwgLXYpO1xuXG4gIC8vU2NhbGUgYmFjayB0byByYW5nZVxuICByZXR1cm4gYyAvIDI1NS4wO1xufVxuXG5cblxudW5pZm9ybSBmbG9hdCBwaWNrSWQ7XG51bmlmb3JtIHZlYzMgY2xpcEJvdW5kc1syXTtcblxudmFyeWluZyB2ZWMzIHdvcmxkUG9zaXRpb247XG52YXJ5aW5nIGZsb2F0IHBpeGVsQXJjTGVuZ3RoO1xudmFyeWluZyB2ZWM0IGZyYWdDb2xvcjtcblxudm9pZCBtYWluKCkge1xuICBpZihhbnkobGVzc1RoYW4od29ybGRQb3NpdGlvbiwgY2xpcEJvdW5kc1swXSkpIHx8IGFueShncmVhdGVyVGhhbih3b3JsZFBvc2l0aW9uLCBjbGlwQm91bmRzWzFdKSkpIHtcbiAgICBkaXNjYXJkO1xuICB9XG4gIGdsX0ZyYWdDb2xvciA9IHZlYzQocGlja0lkLzI1NS4wLCBlbmNvZGVfZmxvYXRfMV8wKHBpeGVsQXJjTGVuZ3RoKS54eXopO1xufSIscz1be25hbWU6InBvc2l0aW9uIix0eXBlOiJ2ZWMzIn0se25hbWU6Im5leHRQb3NpdGlvbiIsdHlwZToidmVjMyJ9LHtuYW1lOiJhcmNMZW5ndGgiLHR5cGU6ImZsb2F0In0se25hbWU6ImxpbmVXaWR0aCIsdHlwZToiZmxvYXQifSx7bmFtZToiY29sb3IiLHR5cGU6InZlYzQifV07ci5jcmVhdGVTaGFkZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG4odCxpLGEsbnVsbCxzKX0sci5jcmVhdGVQaWNrU2hhZGVyPWZ1bmN0aW9uKHQpe3JldHVybiBuKHQsaSxvLG51bGwscyl9fSx7ImdsLXNoYWRlciI6MjIwfV0sMTQwOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtmb3IodmFyIHI9MCxuPTA7bjwzOysrbil7dmFyIGk9dFtuXS1lW25dO3IrPWkqaX1yZXR1cm4gTWF0aC5zcXJ0KHIpfWZ1bmN0aW9uIGkodCl7Zm9yKHZhciBlPVtbLTFlNiwtMWU2LC0xZTZdLFsxZTYsMWU2LDFlNl1dLHI9MDtyPDM7KytyKWVbMF1bcl09TWF0aC5tYXgodFswXVtyXSxlWzBdW3JdKSxlWzFdW3JdPU1hdGgubWluKHRbMV1bcl0sZVsxXVtyXSk7cmV0dXJuIGV9ZnVuY3Rpb24gYSh0LGUscixuKXt0aGlzLmFyY0xlbmd0aD10LHRoaXMucG9zaXRpb249ZSx0aGlzLmluZGV4PXIsdGhpcy5kYXRhQ29vcmRpbmF0ZT1ufWZ1bmN0aW9uIG8odCxlLHIsbixpLGEpe3RoaXMuZ2w9dCx0aGlzLnNoYWRlcj1lLHRoaXMucGlja1NoYWRlcj1yLHRoaXMuYnVmZmVyPW4sdGhpcy52YW89aSx0aGlzLmNsaXBCb3VuZHM9W1stKDEvMCksLSgxLzApLC0oMS8wKV0sWzEvMCwxLzAsMS8wXV0sdGhpcy5wb2ludHM9W10sdGhpcy5hcmNMZW5ndGg9W10sdGhpcy52ZXJ0ZXhDb3VudD0wLHRoaXMuYm91bmRzPVtbMCwwLDBdLFswLDAsMF1dLHRoaXMucGlja0lkPTAsdGhpcy5saW5lV2lkdGg9MSx0aGlzLnRleHR1cmU9YSx0aGlzLmRhc2hTY2FsZT0xLHRoaXMub3BhY2l0eT0xLHRoaXMuZGlydHk9ITAsdGhpcy5waXhlbFJhdGlvPTF9ZnVuY3Rpb24gcyh0KXt2YXIgZT10LmdsfHx0LnNjZW5lJiZ0LnNjZW5lLmdsLHI9ZyhlKTtyLmF0dHJpYnV0ZXMucG9zaXRpb24ubG9jYXRpb249MCxyLmF0dHJpYnV0ZXMubmV4dFBvc2l0aW9uLmxvY2F0aW9uPTEsci5hdHRyaWJ1dGVzLmFyY0xlbmd0aC5sb2NhdGlvbj0yLHIuYXR0cmlidXRlcy5saW5lV2lkdGgubG9jYXRpb249MyxyLmF0dHJpYnV0ZXMuY29sb3IubG9jYXRpb249NDt2YXIgbj1tKGUpO24uYXR0cmlidXRlcy5wb3NpdGlvbi5sb2NhdGlvbj0wLG4uYXR0cmlidXRlcy5uZXh0UG9zaXRpb24ubG9jYXRpb249MSxuLmF0dHJpYnV0ZXMuYXJjTGVuZ3RoLmxvY2F0aW9uPTIsbi5hdHRyaWJ1dGVzLmxpbmVXaWR0aC5sb2NhdGlvbj0zLG4uYXR0cmlidXRlcy5jb2xvci5sb2NhdGlvbj00O2Zvcih2YXIgaT1sKGUpLGE9dShlLFt7YnVmZmVyOmksc2l6ZTozLG9mZnNldDowLHN0cmlkZTo0OH0se2J1ZmZlcjppLHNpemU6MyxvZmZzZXQ6MTIsc3RyaWRlOjQ4fSx7YnVmZmVyOmksc2l6ZToxLG9mZnNldDoyNCxzdHJpZGU6NDh9LHtidWZmZXI6aSxzaXplOjEsb2Zmc2V0OjI4LHN0cmlkZTo0OH0se2J1ZmZlcjppLHNpemU6NCxvZmZzZXQ6MzIsc3RyaWRlOjQ4fV0pLHM9ZChuZXcgQXJyYXkoMTAyNCksWzI1NiwxLDRdKSxoPTA7aDwxMDI0OysraClzLmRhdGFbaF09MjU1O3ZhciBmPWMoZSxzKTtmLndyYXA9ZS5SRVBFQVQ7dmFyIHA9bmV3IG8oZSxyLG4saSxhLGYpO3JldHVybiBwLnVwZGF0ZSh0KSxwfWUuZXhwb3J0cz1zO3ZhciBsPXQoImdsLWJ1ZmZlciIpLHU9dCgiZ2wtdmFvIiksYz10KCJnbC10ZXh0dXJlMmQiKSxoPXQoImdsc2wtcmVhZC1mbG9hdCIpLGY9dCgiYmluYXJ5LXNlYXJjaC1ib3VuZHMiKSxkPXQoIm5kYXJyYXkiKSxwPXQoIi4vbGliL3NoYWRlcnMiKSxnPXAuY3JlYXRlU2hhZGVyLG09cC5jcmVhdGVQaWNrU2hhZGVyLHY9WzEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDFdLHk9by5wcm90b3R5cGU7eS5pc1RyYW5zcGFyZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3BhY2l0eTwxfSx5LmlzT3BhcXVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3BhY2l0eT49MX0seS5waWNrU2xvdHM9MSx5LnNldFBpY2tCYXNlPWZ1bmN0aW9uKHQpe3RoaXMucGlja0lkPXR9LHkuZHJhd1RyYW5zcGFyZW50PXkuZHJhdz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdsLHI9dGhpcy5zaGFkZXIsbj10aGlzLnZhbztyLmJpbmQoKSxyLnVuaWZvcm1zPXttb2RlbDp0Lm1vZGVsfHx2LHZpZXc6dC52aWV3fHx2LHByb2plY3Rpb246dC5wcm9qZWN0aW9ufHx2LGNsaXBCb3VuZHM6aSh0aGlzLmNsaXBCb3VuZHMpLGRhc2hUZXh0dXJlOnRoaXMudGV4dHVyZS5iaW5kKCksZGFzaFNjYWxlOnRoaXMuZGFzaFNjYWxlL3RoaXMuYXJjTGVuZ3RoW3RoaXMuYXJjTGVuZ3RoLmxlbmd0aC0xXSxvcGFjaXR5OnRoaXMub3BhY2l0eSxzY3JlZW5TaGFwZTpbZS5kcmF3aW5nQnVmZmVyV2lkdGgsZS5kcmF3aW5nQnVmZmVySGVpZ2h0XSxwaXhlbFJhdGlvOnRoaXMucGl4ZWxSYXRpb30sbi5iaW5kKCksbi5kcmF3KGUuVFJJQU5HTEVfU1RSSVAsdGhpcy52ZXJ0ZXhDb3VudCl9LHkuZHJhd1BpY2s9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nbCxyPXRoaXMucGlja1NoYWRlcixuPXRoaXMudmFvO3IuYmluZCgpLHIudW5pZm9ybXM9e21vZGVsOnQubW9kZWx8fHYsdmlldzp0LnZpZXd8fHYscHJvamVjdGlvbjp0LnByb2plY3Rpb258fHYscGlja0lkOnRoaXMucGlja0lkLGNsaXBCb3VuZHM6aSh0aGlzLmNsaXBCb3VuZHMpLHNjcmVlblNoYXBlOltlLmRyYXdpbmdCdWZmZXJXaWR0aCxlLmRyYXdpbmdCdWZmZXJIZWlnaHRdLHBpeGVsUmF0aW86dGhpcy5waXhlbFJhdGlvfSxuLmJpbmQoKSxuLmRyYXcoZS5UUklBTkdMRV9TVFJJUCx0aGlzLnZlcnRleENvdW50KX0seS51cGRhdGU9ZnVuY3Rpb24odCl7dmFyIGUscjt0aGlzLmRpcnR5PSEwO3ZhciBpPSEhdC5jb25uZWN0R2FwczsiZGFzaFNjYWxlImluIHQmJih0aGlzLmRhc2hTY2FsZT10LmRhc2hTY2FsZSksIm9wYWNpdHkiaW4gdCYmKHRoaXMub3BhY2l0eT0rdC5vcGFjaXR5KTt2YXIgYT10LnBvc2l0aW9ufHx0LnBvc2l0aW9ucztpZihhKXt2YXIgbz10LmNvbG9yfHx0LmNvbG9yc3x8WzAsMCwwLDFdLHM9dC5saW5lV2lkdGh8fDEsbD1bXSx1PVtdLGM9W10saD0wLHA9MCxnPVtbMS8wLDEvMCwxLzBdLFstKDEvMCksLSgxLzApLC0oMS8wKV1dLG09ITE7dDpmb3IoZT0xO2U8YS5sZW5ndGg7KytlKXt2YXIgdj1hW2UtMV0seT1hW2VdO2Zvcih1LnB1c2goaCksYy5wdXNoKHYuc2xpY2UoKSkscj0wO3I8MzsrK3Ipe2lmKGlzTmFOKHZbcl0pfHxpc05hTih5W3JdKXx8IWlzRmluaXRlKHZbcl0pfHwhaXNGaW5pdGUoeVtyXSkpe2lmKCFpJiZsLmxlbmd0aD4wKXtmb3IodmFyIHg9MDt4PDI0OysreClsLnB1c2gobFtsLmxlbmd0aC0xMl0pO3ArPTIsbT0hMH1jb250aW51ZSB0fWdbMF1bcl09TWF0aC5taW4oZ1swXVtyXSx2W3JdLHlbcl0pLGdbMV1bcl09TWF0aC5tYXgoZ1sxXVtyXSx2W3JdLHlbcl0pfXZhciBiLF87QXJyYXkuaXNBcnJheShvWzBdKT8oYj1vW2UtMV0sXz1vW2VdKTpiPV89bywzPT09Yi5sZW5ndGgmJihiPVtiWzBdLGJbMV0sYlsyXSwxXSksMz09PV8ubGVuZ3RoJiYoXz1bX1swXSxfWzFdLF9bMl0sMV0pO3ZhciB3O3c9QXJyYXkuaXNBcnJheShzKT9zW2UtMV06czt2YXIgTT1oO2lmKGgrPW4odix5KSxtKXtmb3Iocj0wO3I8MjsrK3IpbC5wdXNoKHZbMF0sdlsxXSx2WzJdLHlbMF0seVsxXSx5WzJdLE0sdyxiWzBdLGJbMV0sYlsyXSxiWzNdKTtwKz0yLG09ITF9bC5wdXNoKHZbMF0sdlsxXSx2WzJdLHlbMF0seVsxXSx5WzJdLE0sdyxiWzBdLGJbMV0sYlsyXSxiWzNdLHZbMF0sdlsxXSx2WzJdLHlbMF0seVsxXSx5WzJdLE0sLXcsYlswXSxiWzFdLGJbMl0sYlszXSx5WzBdLHlbMV0seVsyXSx2WzBdLHZbMV0sdlsyXSxoLC13LF9bMF0sX1sxXSxfWzJdLF9bM10seVswXSx5WzFdLHlbMl0sdlswXSx2WzFdLHZbMl0saCx3LF9bMF0sX1sxXSxfWzJdLF9bM10pLHArPTR9aWYodGhpcy5idWZmZXIudXBkYXRlKGwpLHUucHVzaChoKSxjLnB1c2goYVthLmxlbmd0aC0xXS5zbGljZSgpKSx0aGlzLmJvdW5kcz1nLHRoaXMudmVydGV4Q291bnQ9cCx0aGlzLnBvaW50cz1jLHRoaXMuYXJjTGVuZ3RoPXUsImRhc2hlcyJpbiB0KXt2YXIgQT10LmRhc2hlcyxrPUEuc2xpY2UoKTtmb3Ioay51bnNoaWZ0KDApLGU9MTtlPGsubGVuZ3RoOysrZSlrW2VdPWtbZS0xXStrW2VdO3ZhciBUPWQobmV3IEFycmF5KDEwMjQpLFsyNTYsMSw0XSk7Zm9yKGU9MDtlPDI1NjsrK2Upe2ZvcihyPTA7cjw0OysrcilULnNldChlLDAsciwwKTsxJmYubGUoayxrW2subGVuZ3RoLTFdKmUvMjU1KT9ULnNldChlLDAsMCwwKTpULnNldChlLDAsMCwyNTUpfXRoaXMudGV4dHVyZS5zZXRQaXhlbHMoVCl9fX0seS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5zaGFkZXIuZGlzcG9zZSgpLHRoaXMudmFvLmRpc3Bvc2UoKSx0aGlzLmJ1ZmZlci5kaXNwb3NlKCl9LHkucGljaz1mdW5jdGlvbih0KXtpZighdClyZXR1cm4gbnVsbDtpZih0LmlkIT09dGhpcy5waWNrSWQpcmV0dXJuIG51bGw7dmFyIGU9aCh0LnZhbHVlWzBdLHQudmFsdWVbMV0sdC52YWx1ZVsyXSwwKSxyPWYubGUodGhpcy5hcmNMZW5ndGgsZSk7aWYocjwwKXJldHVybiBudWxsO2lmKHI9PT10aGlzLmFyY0xlbmd0aC5sZW5ndGgtMSlyZXR1cm4gbmV3IGEodGhpcy5hcmNMZW5ndGhbdGhpcy5hcmNMZW5ndGgubGVuZ3RoLTFdLHRoaXMucG9pbnRzW3RoaXMucG9pbnRzLmxlbmd0aC0xXS5zbGljZSgpLHIpO2Zvcih2YXIgbj10aGlzLnBvaW50c1tyXSxpPXRoaXMucG9pbnRzW01hdGgubWluKHIrMSx0aGlzLnBvaW50cy5sZW5ndGgtMSldLG89KGUtdGhpcy5hcmNMZW5ndGhbcl0pLyh0aGlzLmFyY0xlbmd0aFtyKzFdLXRoaXMuYXJjTGVuZ3RoW3JdKSxzPTEtbyxsPVswLDAsMF0sdT0wO3U8MzsrK3UpbFt1XT1zKm5bdV0rbyppW3VdO3ZhciBjPU1hdGgubWluKG88LjU/cjpyKzEsdGhpcy5wb2ludHMubGVuZ3RoLTEpO3JldHVybiBuZXcgYShlLGwsYyx0aGlzLnBvaW50c1tjXSl9fSx7Ii4vbGliL3NoYWRlcnMiOjEzOSwiYmluYXJ5LXNlYXJjaC1ib3VuZHMiOjUzLCJnbC1idWZmZXIiOjEyOCwiZ2wtdGV4dHVyZTJkIjoyMzIsImdsLXZhbyI6MjM2LCJnbHNsLXJlYWQtZmxvYXQiOjI0MyxuZGFycmF5OjQyN31dLDE0MTpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlKXt2YXIgcj1lWzBdLG49ZVsxXSxpPWVbMl0sYT1lWzNdLG89ciphLWkqbjtyZXR1cm4gbz8obz0xL28sdFswXT1hKm8sdFsxXT0tbipvLHRbMl09LWkqbyx0WzNdPXIqbyx0KTpudWxsfWUuZXhwb3J0cz1ufSx7fV0sMTQyOltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUpe3ZhciByPWVbMF0sbj1lWzFdLGk9ZVsyXSxhPWVbM10sbz1lWzRdLHM9ZVs1XSxsPWVbNl0sdT1lWzddLGM9ZVs4XSxoPWMqby1zKnUsZj0tYyphK3MqbCxkPXUqYS1vKmwscD1yKmgrbipmK2kqZDtyZXR1cm4gcD8ocD0xL3AsdFswXT1oKnAsdFsxXT0oLWMqbitpKnUpKnAsdFsyXT0ocypuLWkqbykqcCx0WzNdPWYqcCx0WzRdPShjKnItaSpsKSpwLHRbNV09KC1zKnIraSphKSpwLHRbNl09ZCpwLHRbN109KC11KnIrbipsKSpwLHRbOF09KG8qci1uKmEpKnAsdCk6bnVsbH1lLmV4cG9ydHM9bn0se31dLDE0MzpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCl7dmFyIGU9bmV3IEZsb2F0MzJBcnJheSgxNik7cmV0dXJuIGVbMF09dFswXSxlWzFdPXRbMV0sZVsyXT10WzJdLGVbM109dFszXSxlWzRdPXRbNF0sZVs1XT10WzVdLGVbNl09dFs2XSxlWzddPXRbN10sZVs4XT10WzhdLGVbOV09dFs5XSxlWzEwXT10WzEwXSxlWzExXT10WzExXSxlWzEyXT10WzEyXSxlWzEzXT10WzEzXSxlWzE0XT10WzE0XSxlWzE1XT10WzE1XSxlfWUuZXhwb3J0cz1ufSx7fV0sMTQ0OltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbigpe3ZhciB0PW5ldyBGbG9hdDMyQXJyYXkoMTYpO3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT0wLHRbNV09MSx0WzZdPTAsdFs3XT0wLHRbOF09MCx0WzldPTAsdFsxMF09MSx0WzExXT0wLHRbMTJdPTAsdFsxM109MCx0WzE0XT0wLHRbMTVdPTEsdH1lLmV4cG9ydHM9bn0se31dLDE0NTpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCl7dmFyIGU9dFswXSxyPXRbMV0sbj10WzJdLGk9dFszXSxhPXRbNF0sbz10WzVdLHM9dFs2XSxsPXRbN10sdT10WzhdLGM9dFs5XSxoPXRbMTBdLGY9dFsxMV0sZD10WzEyXSxwPXRbMTNdLGc9dFsxNF0sbT10WzE1XSx2PWUqby1yKmEseT1lKnMtbiphLHg9ZSpsLWkqYSxiPXIqcy1uKm8sXz1yKmwtaSpvLHc9bipsLWkqcyxNPXUqcC1jKmQsQT11KmctaCpkLGs9dSptLWYqZCxUPWMqZy1oKnAsRT1jKm0tZipwLFM9aCptLWYqZztyZXR1cm4gdipTLXkqRSt4KlQrYiprLV8qQSt3Kk19ZS5leHBvcnRzPW59LHt9XSwxNDY6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSl7dmFyIHI9ZVswXSxuPWVbMV0saT1lWzJdLGE9ZVszXSxvPXIrcixzPW4rbixsPWkraSx1PXIqbyxjPW4qbyxoPW4qcyxmPWkqbyxkPWkqcyxwPWkqbCxnPWEqbyxtPWEqcyx2PWEqbDtyZXR1cm4gdFswXT0xLWgtcCx0WzFdPWMrdix0WzJdPWYtbSx0WzNdPTAsdFs0XT1jLXYsdFs1XT0xLXUtcCx0WzZdPWQrZyx0WzddPTAsdFs4XT1mK20sdFs5XT1kLWcsdFsxMF09MS11LWgsdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCx0WzE1XT0xLHR9ZS5leHBvcnRzPW59LHt9XSwxNDc6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSxyKXt2YXIgbj1lWzBdLGk9ZVsxXSxhPWVbMl0sbz1lWzNdLHM9bituLGw9aStpLHU9YSthLGM9bipzLGg9bipsLGY9bip1LGQ9aSpsLHA9aSp1LGc9YSp1LG09bypzLHY9bypsLHk9byp1O3JldHVybiB0WzBdPTEtKGQrZyksdFsxXT1oK3ksdFsyXT1mLXYsdFszXT0wLHRbNF09aC15LHRbNV09MS0oYytnKSx0WzZdPXArbSx0WzddPTAsdFs4XT1mK3YsdFs5XT1wLW0sdFsxMF09MS0oYytkKSx0WzExXT0wLHRbMTJdPXJbMF0sdFsxM109clsxXSx0WzE0XT1yWzJdLHRbMTVdPTEsdH1lLmV4cG9ydHM9bn0se31dLDE0ODpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT0xLHRbNl09MCx0WzddPTAsdFs4XT0wLHRbOV09MCx0WzEwXT0xLHRbMTFdPTAsdFsxMl09MCx0WzEzXT0wLHRbMTRdPTAsdFsxNV09MSx0fWUuZXhwb3J0cz1ufSx7fV0sMTQ5OltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUpe3ZhciByPWVbMF0sbj1lWzFdLGk9ZVsyXSxhPWVbM10sbz1lWzRdLHM9ZVs1XSxsPWVbNl0sdT1lWzddLGM9ZVs4XSxoPWVbOV0sZj1lWzEwXSxkPWVbMTFdLHA9ZVsxMl0sZz1lWzEzXSxtPWVbMTRdLHY9ZVsxNV0seT1yKnMtbipvLHg9cipsLWkqbyxiPXIqdS1hKm8sXz1uKmwtaSpzLHc9bip1LWEqcyxNPWkqdS1hKmwsQT1jKmctaCpwLGs9YyptLWYqcCxUPWMqdi1kKnAsRT1oKm0tZipnLFM9aCp2LWQqZyxMPWYqdi1kKm0sej15KkwteCpTK2IqRStfKlQtdyprK00qQTtyZXR1cm4gej8oej0xL3osdFswXT0ocypMLWwqUyt1KkUpKnosdFsxXT0oaSpTLW4qTC1hKkUpKnosdFsyXT0oZypNLW0qdyt2Kl8pKnosdFszXT0oZip3LWgqTS1kKl8pKnosdFs0XT0obCpULW8qTC11KmspKnosdFs1XT0ocipMLWkqVCthKmspKnosdFs2XT0obSpiLXAqTS12KngpKnosdFs3XT0oYypNLWYqYitkKngpKnosdFs4XT0obypTLXMqVCt1KkEpKnosdFs5XT0obipULXIqUy1hKkEpKnosdFsxMF09KHAqdy1nKmIrdip5KSp6LHRbMTFdPShoKmItYyp3LWQqeSkqeix0WzEyXT0ocyprLW8qRS1sKkEpKnosdFsxM109KHIqRS1uKmsraSpBKSp6LHRbMTRdPShnKngtcCpfLW0qeSkqeix0WzE1XT0oYypfLWgqeCtmKnkpKnosdCk6bnVsbH1lLmV4cG9ydHM9bn0se31dLDE1MDpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlLHIsbil7dmFyIGEsbyxzLGwsdSxjLGgsZixkLHAsZz1lWzBdLG09ZVsxXSx2PWVbMl0seT1uWzBdLHg9blsxXSxiPW5bMl0sXz1yWzBdLHc9clsxXSxNPXJbMl07cmV0dXJuIE1hdGguYWJzKGctXyk8MWUtNiYmTWF0aC5hYnMobS13KTwxZS02JiZNYXRoLmFicyh2LU0pPDFlLTY/aSh0KTooaD1nLV8sZj1tLXcsZD12LU0scD0xL01hdGguc3FydChoKmgrZipmK2QqZCksaCo9cCxmKj1wLGQqPXAsYT14KmQtYipmLG89YipoLXkqZCxzPXkqZi14KmgscD1NYXRoLnNxcnQoYSphK28qbytzKnMpLHA/KHA9MS9wLGEqPXAsbyo9cCxzKj1wKTooYT0wLG89MCxzPTApLGw9ZipzLWQqbyx1PWQqYS1oKnMsYz1oKm8tZiphLHA9TWF0aC5zcXJ0KGwqbCt1KnUrYypjKSxwPyhwPTEvcCxsKj1wLHUqPXAsYyo9cCk6KGw9MCx1PTAsYz0wKSx0WzBdPWEsdFsxXT1sLHRbMl09aCx0WzNdPTAsdFs0XT1vLHRbNV09dSx0WzZdPWYsdFs3XT0wLHRbOF09cyx0WzldPWMsdFsxMF09ZCx0WzExXT0wLHRbMTJdPS0oYSpnK28qbStzKnYpLHRbMTNdPS0obCpnK3UqbStjKnYpLHRbMTRdPS0oaCpnK2YqbStkKnYpLHRbMTVdPTEsdCl9dmFyIGk9dCgiLi9pZGVudGl0eSIpO2UuZXhwb3J0cz1ufSx7Ii4vaWRlbnRpdHkiOjE0OH1dLDE1MTpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlLHIpe3ZhciBuPWVbMF0saT1lWzFdLGE9ZVsyXSxvPWVbM10scz1lWzRdLGw9ZVs1XSx1PWVbNl0sYz1lWzddLGg9ZVs4XSxmPWVbOV0sZD1lWzEwXSxwPWVbMTFdLGc9ZVsxMl0sbT1lWzEzXSx2PWVbMTRdLHk9ZVsxNV0seD1yWzBdLGI9clsxXSxfPXJbMl0sdz1yWzNdO3JldHVybiB0WzBdPXgqbitiKnMrXypoK3cqZyx0WzFdPXgqaStiKmwrXypmK3cqbSx0WzJdPXgqYStiKnUrXypkK3cqdix0WzNdPXgqbytiKmMrXypwK3cqeSx4PXJbNF0sYj1yWzVdLF89cls2XSx3PXJbN10sdFs0XT14Km4rYipzK18qaCt3KmcsdFs1XT14KmkrYipsK18qZit3Km0sdFs2XT14KmErYip1K18qZCt3KnYsdFs3XT14Km8rYipjK18qcCt3KnkseD1yWzhdLGI9cls5XSxfPXJbMTBdLHc9clsxMV0sdFs4XT14Km4rYipzK18qaCt3KmcsdFs5XT14KmkrYipsK18qZit3Km0sdFsxMF09eCphK2IqdStfKmQrdyp2LHRbMTFdPXgqbytiKmMrXypwK3cqeSx4PXJbMTJdLGI9clsxM10sXz1yWzE0XSx3PXJbMTVdLHRbMTJdPXgqbitiKnMrXypoK3cqZyx0WzEzXT14KmkrYipsK18qZit3Km0sdFsxNF09eCphK2IqdStfKmQrdyp2LHRbMTVdPXgqbytiKmMrXypwK3cqeSx0fWUuZXhwb3J0cz1ufSx7fV0sMTUyOltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUscixuLGkpe3ZhciBhPTEvTWF0aC50YW4oZS8yKSxvPTEvKG4taSk7cmV0dXJuIHRbMF09YS9yLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MCx0WzVdPWEsdFs2XT0wLHRbN109MCx0WzhdPTAsdFs5XT0wLHRbMTBdPShpK24pKm8sdFsxMV09LTEsdFsxMl09MCx0WzEzXT0wLHRbMTRdPTIqaSpuKm8sdFsxNV09MCx0fWUuZXhwb3J0cz1ufSx7fV0sMTUzOltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUscixuKXt2YXIgaSxhLG8scyxsLHUsYyxoLGYsZCxwLGcsbSx2LHkseCxiLF8sdyxNLEEsayxULEUsUz1uWzBdLEw9blsxXSx6PW5bMl0sQz1NYXRoLnNxcnQoUypTK0wqTCt6KnopO3JldHVybiBNYXRoLmFicyhDKTwxZS02P251bGw6KEM9MS9DLFMqPUMsTCo9Qyx6Kj1DLGk9TWF0aC5zaW4ociksYT1NYXRoLmNvcyhyKSxvPTEtYSxzPWVbMF0sbD1lWzFdLHU9ZVsyXSxjPWVbM10saD1lWzRdLGY9ZVs1XSxkPWVbNl0scD1lWzddLGc9ZVs4XSxtPWVbOV0sdj1lWzEwXSx5PWVbMTFdLHg9UypTKm8rYSxiPUwqUypvK3oqaSxfPXoqUypvLUwqaSx3PVMqTCpvLXoqaSxNPUwqTCpvK2EsQT16KkwqbytTKmksaz1TKnoqbytMKmksVD1MKnoqby1TKmksRT16KnoqbythLHRbMF09cyp4K2gqYitnKl8sdFsxXT1sKngrZipiK20qXyx0WzJdPXUqeCtkKmIrdipfLHRbM109Yyp4K3AqYit5Kl8sdFs0XT1zKncraCpNK2cqQSx0WzVdPWwqdytmKk0rbSpBLHRbNl09dSp3K2QqTSt2KkEsdFs3XT1jKncrcCpNK3kqQSx0WzhdPXMqaytoKlQrZypFLHRbOV09bCprK2YqVCttKkUsdFsxMF09dSprK2QqVCt2KkUsdFsxMV09YyprK3AqVCt5KkUsZSE9PXQmJih0WzEyXT1lWzEyXSx0WzEzXT1lWzEzXSx0WzE0XT1lWzE0XSx0WzE1XT1lWzE1XSksdCl9ZS5leHBvcnRzPW59LHt9XSwxNTQ6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSxyKXt2YXIgbj1NYXRoLnNpbihyKSxpPU1hdGguY29zKHIpLGE9ZVs0XSxvPWVbNV0scz1lWzZdLGw9ZVs3XSx1PWVbOF0sYz1lWzldLGg9ZVsxMF0sZj1lWzExXTtyZXR1cm4gZSE9PXQmJih0WzBdPWVbMF0sdFsxXT1lWzFdLHRbMl09ZVsyXSx0WzNdPWVbM10sdFsxMl09ZVsxMl0sdFsxM109ZVsxM10sdFsxNF09ZVsxNF0sdFsxNV09ZVsxNV0pLHRbNF09YSppK3Uqbix0WzVdPW8qaStjKm4sdFs2XT1zKmkraCpuLHRbN109bCppK2Yqbix0WzhdPXUqaS1hKm4sdFs5XT1jKmktbypuLHRbMTBdPWgqaS1zKm4sdFsxMV09ZippLWwqbix0fWUuZXhwb3J0cz1ufSx7fV0sMTU1OltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUscil7dmFyIG49TWF0aC5zaW4ociksaT1NYXRoLmNvcyhyKSxhPWVbMF0sbz1lWzFdLHM9ZVsyXSxsPWVbM10sdT1lWzhdLGM9ZVs5XSxoPWVbMTBdLGY9ZVsxMV07cmV0dXJuIGUhPT10JiYodFs0XT1lWzRdLHRbNV09ZVs1XSx0WzZdPWVbNl0sdFs3XT1lWzddLHRbMTJdPWVbMTJdLHRbMTNdPWVbMTNdLHRbMTRdPWVbMTRdLHRbMTVdPWVbMTVdKSx0WzBdPWEqaS11Km4sdFsxXT1vKmktYypuLHRbMl09cyppLWgqbix0WzNdPWwqaS1mKm4sdFs4XT1hKm4rdSppLHRbOV09bypuK2MqaSx0WzEwXT1zKm4raCppLHRbMTFdPWwqbitmKmksdH1lLmV4cG9ydHM9bn0se31dLDE1NjpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlLHIpe3ZhciBuPU1hdGguc2luKHIpLGk9TWF0aC5jb3MociksYT1lWzBdLG89ZVsxXSxzPWVbMl0sbD1lWzNdLHU9ZVs0XSxjPWVbNV0saD1lWzZdLGY9ZVs3XTtyZXR1cm4gZSE9PXQmJih0WzhdPWVbOF0sdFs5XT1lWzldLHRbMTBdPWVbMTBdLHRbMTFdPWVbMTFdLHRbMTJdPWVbMTJdLHRbMTNdPWVbMTNdLHRbMTRdPWVbMTRdLHRbMTVdPWVbMTVdKSx0WzBdPWEqaSt1Km4sdFsxXT1vKmkrYypuLHRbMl09cyppK2gqbix0WzNdPWwqaStmKm4sdFs0XT11KmktYSpuLHRbNV09YyppLW8qbix0WzZdPWgqaS1zKm4sdFs3XT1mKmktbCpuLHR9ZS5leHBvcnRzPW59LHt9XSwxNTc6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSxyKXt2YXIgbj1yWzBdLGk9clsxXSxhPXJbMl07cmV0dXJuIHRbMF09ZVswXSpuLHRbMV09ZVsxXSpuLHRbMl09ZVsyXSpuLHRbM109ZVszXSpuLHRbNF09ZVs0XSppLHRbNV09ZVs1XSppLHRbNl09ZVs2XSppLHRbN109ZVs3XSppLHRbOF09ZVs4XSphLHRbOV09ZVs5XSphLHRbMTBdPWVbMTBdKmEsdFsxMV09ZVsxMV0qYSx0WzEyXT1lWzEyXSx0WzEzXT1lWzEzXSx0WzE0XT1lWzE0XSx0WzE1XT1lWzE1XSx0fWUuZXhwb3J0cz1ufSx7fV0sMTU4OltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUscil7dmFyIG4saSxhLG8scyxsLHUsYyxoLGYsZCxwLGc9clswXSxtPXJbMV0sdj1yWzJdO3JldHVybiBlPT09dD8odFsxMl09ZVswXSpnK2VbNF0qbStlWzhdKnYrZVsxMl0sdFsxM109ZVsxXSpnK2VbNV0qbStlWzldKnYrZVsxM10sdFsxNF09ZVsyXSpnK2VbNl0qbStlWzEwXSp2K2VbMTRdLHRbMTVdPWVbM10qZytlWzddKm0rZVsxMV0qditlWzE1XSk6KG49ZVswXSxpPWVbMV0sYT1lWzJdLG89ZVszXSxzPWVbNF0sbD1lWzVdLHU9ZVs2XSxjPWVbN10saD1lWzhdLGY9ZVs5XSxkPWVbMTBdLHA9ZVsxMV0sdFswXT1uLHRbMV09aSx0WzJdPWEsdFszXT1vLHRbNF09cyx0WzVdPWwsdFs2XT11LHRbN109Yyx0WzhdPWgsdFs5XT1mLHRbMTBdPWQsdFsxMV09cCx0WzEyXT1uKmcrcyptK2gqditlWzEyXSx0WzEzXT1pKmcrbCptK2YqditlWzEzXSx0WzE0XT1hKmcrdSptK2QqditlWzE0XSx0WzE1XT1vKmcrYyptK3AqditlWzE1XSksdH1lLmV4cG9ydHM9bn0se31dLDE1OTpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlKXtpZih0PT09ZSl7dmFyIHI9ZVsxXSxuPWVbMl0saT1lWzNdLGE9ZVs2XSxvPWVbN10scz1lWzExXTt0WzFdPWVbNF0sdFsyXT1lWzhdLHRbM109ZVsxMl0sdFs0XT1yLHRbNl09ZVs5XSx0WzddPWVbMTNdLHRbOF09bix0WzldPWEsdFsxMV09ZVsxNF0sdFsxMl09aSx0WzEzXT1vLHRbMTRdPXN9ZWxzZSB0WzBdPWVbMF0sdFsxXT1lWzRdLHRbMl09ZVs4XSx0WzNdPWVbMTJdLHRbNF09ZVsxXSx0WzVdPWVbNV0sdFs2XT1lWzldLHRbN109ZVsxM10sdFs4XT1lWzJdLHRbOV09ZVs2XSx0WzEwXT1lWzEwXSx0WzExXT1lWzE0XSx0WzEyXT1lWzNdLHRbMTNdPWVbN10sdFsxNF09ZVsxMV0sdFsxNV09ZVsxNV07cmV0dXJuIHR9ZS5leHBvcnRzPW59LHt9XSwxNjA6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3N3aXRjaChlLmxlbmd0aCl7Y2FzZSAwOmJyZWFrO2Nhc2UgMTp0WzBdPTEvZVswXTticmVhaztjYXNlIDQ6aSh0LGUpO2JyZWFrO2Nhc2UgOTphKHQsZSk7YnJlYWs7Y2FzZSAxNjpvKHQsZSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImN1cnJlbnRseSBzdXBwb3J0cyBtYXRyaWNlcyB1cCB0byA0eDQiKX1yZXR1cm4gdH1lLmV4cG9ydHM9bjt2YXIgaT10KCJnbC1tYXQyL2ludmVydCIpLGE9dCgiZ2wtbWF0My9pbnZlcnQiKSxvPXQoImdsLW1hdDQvaW52ZXJ0Iil9LHsiZ2wtbWF0Mi9pbnZlcnQiOjE0MSwiZ2wtbWF0My9pbnZlcnQiOjE0MiwiZ2wtbWF0NC9pbnZlcnQiOjE0OX1dLDE2MTpbZnVuY3Rpb24odCxlLHIpe3IuZ2xNYXRyaXg9dCgiLi9nbC1tYXRyaXgvY29tbW9uLmpzIiksci5tYXQyPXQoIi4vZ2wtbWF0cml4L21hdDIuanMiKSxyLm1hdDJkPXQoIi4vZ2wtbWF0cml4L21hdDJkLmpzIiksci5tYXQzPXQoIi4vZ2wtbWF0cml4L21hdDMuanMiKSxyLm1hdDQ9dCgiLi9nbC1tYXRyaXgvbWF0NC5qcyIpLHIucXVhdD10KCIuL2dsLW1hdHJpeC9xdWF0LmpzIiksci52ZWMyPXQoIi4vZ2wtbWF0cml4L3ZlYzIuanMiKSxyLnZlYzM9dCgiLi9nbC1tYXRyaXgvdmVjMy5qcyIpLHIudmVjND10KCIuL2dsLW1hdHJpeC92ZWM0LmpzIil9LHsiLi9nbC1tYXRyaXgvY29tbW9uLmpzIjoxNjIsIi4vZ2wtbWF0cml4L21hdDIuanMiOjE2MywiLi9nbC1tYXRyaXgvbWF0MmQuanMiOjE2NCwiLi9nbC1tYXRyaXgvbWF0My5qcyI6MTY1LCIuL2dsLW1hdHJpeC9tYXQ0LmpzIjoxNjYsIi4vZ2wtbWF0cml4L3F1YXQuanMiOjE2NywiLi9nbC1tYXRyaXgvdmVjMi5qcyI6MTY4LCIuL2dsLW1hdHJpeC92ZWMzLmpzIjoxNjksIi4vZ2wtbWF0cml4L3ZlYzQuanMiOjE3MH1dLDE2MjpbZnVuY3Rpb24odCxlLHIpe3ZhciBuPXt9O24uRVBTSUxPTj0xZS02LG4uQVJSQVlfVFlQRT0idW5kZWZpbmVkIiE9dHlwZW9mIEZsb2F0MzJBcnJheT9GbG9hdDMyQXJyYXk6QXJyYXksbi5SQU5ET009TWF0aC5yYW5kb20sbi5FTkFCTEVfU0lNRD0hMSxuLlNJTURfQVZBSUxBQkxFPW4uQVJSQVlfVFlQRT09PUZsb2F0MzJBcnJheSYmIlNJTUQiaW4gdGhpcyxuLlVTRV9TSU1EPW4uRU5BQkxFX1NJTUQmJm4uU0lNRF9BVkFJTEFCTEUsbi5zZXRNYXRyaXhBcnJheVR5cGU9ZnVuY3Rpb24odCl7bi5BUlJBWV9UWVBFPXR9O3ZhciBpPU1hdGguUEkvMTgwO24udG9SYWRpYW49ZnVuY3Rpb24odCl7cmV0dXJuIHQqaX0sbi5lcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gTWF0aC5hYnModC1lKTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnModCksTWF0aC5hYnMoZSkpfSxlLmV4cG9ydHM9bn0se31dLDE2MzpbZnVuY3Rpb24odCxlLHIpe3ZhciBuPXQoIi4vY29tbW9uLmpzIiksaT17fTtpLmNyZWF0ZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBuLkFSUkFZX1RZUEUoNCk7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MSx0fSxpLmNsb25lPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBuLkFSUkFZX1RZUEUoNCk7cmV0dXJuIGVbMF09dFswXSxlWzFdPXRbMV0sZVsyXT10WzJdLGVbM109dFszXSxlfSxpLmNvcHk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT1lWzBdLHRbMV09ZVsxXSx0WzJdPWVbMl0sdFszXT1lWzNdLHR9LGkuaWRlbnRpdHk9ZnVuY3Rpb24odCl7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MSx0fSxpLmZyb21WYWx1ZXM9ZnVuY3Rpb24odCxlLHIsaSl7dmFyIGE9bmV3IG4uQVJSQVlfVFlQRSg0KTtyZXR1cm4gYVswXT10LGFbMV09ZSxhWzJdPXIsYVszXT1pLGF9LGkuc2V0PWZ1bmN0aW9uKHQsZSxyLG4saSl7cmV0dXJuIHRbMF09ZSx0WzFdPXIsdFsyXT1uLHRbM109aSx0fSxpLnRyYW5zcG9zZT1mdW5jdGlvbih0LGUpe2lmKHQ9PT1lKXt2YXIgcj1lWzFdO3RbMV09ZVsyXSx0WzJdPXJ9ZWxzZSB0WzBdPWVbMF0sdFsxXT1lWzJdLHRbMl09ZVsxXSx0WzNdPWVbM107cmV0dXJuIHR9LGkuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZVswXSxuPWVbMV0saT1lWzJdLGE9ZVszXSxvPXIqYS1pKm47cmV0dXJuIG8/KG89MS9vLHRbMF09YSpvLHRbMV09LW4qbyx0WzJdPS1pKm8sdFszXT1yKm8sdCk6bnVsbH0saS5hZGpvaW50PWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZVswXTtyZXR1cm4gdFswXT1lWzNdLHRbMV09LWVbMV0sdFsyXT0tZVsyXSx0WzNdPXIsdH0saS5kZXRlcm1pbmFudD1mdW5jdGlvbih0KXtyZXR1cm4gdFswXSp0WzNdLXRbMl0qdFsxXX0saS5tdWx0aXBseT1mdW5jdGlvbih0LGUscil7dmFyIG49ZVswXSxpPWVbMV0sYT1lWzJdLG89ZVszXSxzPXJbMF0sbD1yWzFdLHU9clsyXSxjPXJbM107cmV0dXJuIHRbMF09bipzK2EqbCx0WzFdPWkqcytvKmwsdFsyXT1uKnUrYSpjLHRbM109aSp1K28qYyx0fSxpLm11bD1pLm11bHRpcGx5LGkucm90YXRlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lWzBdLGk9ZVsxXSxhPWVbMl0sbz1lWzNdLHM9TWF0aC5zaW4ociksbD1NYXRoLmNvcyhyKTtyZXR1cm4gdFswXT1uKmwrYSpzLHRbMV09aSpsK28qcyx0WzJdPW4qLXMrYSpsLHRbM109aSotcytvKmwsdH0saS5zY2FsZT1mdW5jdGlvbih0LGUscil7dmFyIG49ZVswXSxpPWVbMV0sYT1lWzJdLG89ZVszXSxzPXJbMF0sbD1yWzFdO3JldHVybiB0WzBdPW4qcyx0WzFdPWkqcyx0WzJdPWEqbCx0WzNdPW8qbCx0fSxpLmZyb21Sb3RhdGlvbj1mdW5jdGlvbih0LGUpe3ZhciByPU1hdGguc2luKGUpLG49TWF0aC5jb3MoZSk7cmV0dXJuIHRbMF09bix0WzFdPXIsdFsyXT0tcix0WzNdPW4sdH0saS5mcm9tU2NhbGluZz1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPWVbMF0sdFsxXT0wLHRbMl09MCx0WzNdPWVbMV0sdH0saS5zdHI9ZnVuY3Rpb24odCl7cmV0dXJuIm1hdDIoIit0WzBdKyIsICIrdFsxXSsiLCAiK3RbMl0rIiwgIit0WzNdKyIpIn0saS5mcm9iPWZ1bmN0aW9uKHQpewpyZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHRbMF0sMikrTWF0aC5wb3codFsxXSwyKStNYXRoLnBvdyh0WzJdLDIpK01hdGgucG93KHRbM10sMikpfSxpLkxEVT1mdW5jdGlvbih0LGUscixuKXtyZXR1cm4gdFsyXT1uWzJdL25bMF0sclswXT1uWzBdLHJbMV09blsxXSxyWzNdPW5bM10tdFsyXSpyWzFdLFt0LGUscl19LGkuYWRkPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFswXT1lWzBdK3JbMF0sdFsxXT1lWzFdK3JbMV0sdFsyXT1lWzJdK3JbMl0sdFszXT1lWzNdK3JbM10sdH0saS5zdWJ0cmFjdD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09ZVswXS1yWzBdLHRbMV09ZVsxXS1yWzFdLHRbMl09ZVsyXS1yWzJdLHRbM109ZVszXS1yWzNdLHR9LGkuc3ViPWkuc3VidHJhY3QsaS5leGFjdEVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPT09ZVswXSYmdFsxXT09PWVbMV0mJnRbMl09PT1lWzJdJiZ0WzNdPT09ZVszXX0saS5lcXVhbHM9ZnVuY3Rpb24odCxlKXt2YXIgcj10WzBdLGk9dFsxXSxhPXRbMl0sbz10WzNdLHM9ZVswXSxsPWVbMV0sdT1lWzJdLGM9ZVszXTtyZXR1cm4gTWF0aC5hYnMoci1zKTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMociksTWF0aC5hYnMocykpJiZNYXRoLmFicyhpLWwpPD1uLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhpKSxNYXRoLmFicyhsKSkmJk1hdGguYWJzKGEtdSk8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGEpLE1hdGguYWJzKHUpKSYmTWF0aC5hYnMoby1jKTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMobyksTWF0aC5hYnMoYykpfSxpLm11bHRpcGx5U2NhbGFyPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFswXT1lWzBdKnIsdFsxXT1lWzFdKnIsdFsyXT1lWzJdKnIsdFszXT1lWzNdKnIsdH0saS5tdWx0aXBseVNjYWxhckFuZEFkZD1mdW5jdGlvbih0LGUscixuKXtyZXR1cm4gdFswXT1lWzBdK3JbMF0qbix0WzFdPWVbMV0rclsxXSpuLHRbMl09ZVsyXStyWzJdKm4sdFszXT1lWzNdK3JbM10qbix0fSxlLmV4cG9ydHM9aX0seyIuL2NvbW1vbi5qcyI6MTYyfV0sMTY0OltmdW5jdGlvbih0LGUscil7dmFyIG49dCgiLi9jb21tb24uanMiKSxpPXt9O2kuY3JlYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IG4uQVJSQVlfVFlQRSg2KTtyZXR1cm4gdFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0xLHRbNF09MCx0WzVdPTAsdH0saS5jbG9uZT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgbi5BUlJBWV9UWVBFKDYpO3JldHVybiBlWzBdPXRbMF0sZVsxXT10WzFdLGVbMl09dFsyXSxlWzNdPXRbM10sZVs0XT10WzRdLGVbNV09dFs1XSxlfSxpLmNvcHk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT1lWzBdLHRbMV09ZVsxXSx0WzJdPWVbMl0sdFszXT1lWzNdLHRbNF09ZVs0XSx0WzVdPWVbNV0sdH0saS5pZGVudGl0eT1mdW5jdGlvbih0KXtyZXR1cm4gdFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0xLHRbNF09MCx0WzVdPTAsdH0saS5mcm9tVmFsdWVzPWZ1bmN0aW9uKHQsZSxyLGksYSxvKXt2YXIgcz1uZXcgbi5BUlJBWV9UWVBFKDYpO3JldHVybiBzWzBdPXQsc1sxXT1lLHNbMl09cixzWzNdPWksc1s0XT1hLHNbNV09byxzfSxpLnNldD1mdW5jdGlvbih0LGUscixuLGksYSxvKXtyZXR1cm4gdFswXT1lLHRbMV09cix0WzJdPW4sdFszXT1pLHRbNF09YSx0WzVdPW8sdH0saS5pbnZlcnQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1lWzBdLG49ZVsxXSxpPWVbMl0sYT1lWzNdLG89ZVs0XSxzPWVbNV0sbD1yKmEtbippO3JldHVybiBsPyhsPTEvbCx0WzBdPWEqbCx0WzFdPS1uKmwsdFsyXT0taSpsLHRbM109cipsLHRbNF09KGkqcy1hKm8pKmwsdFs1XT0obipvLXIqcykqbCx0KTpudWxsfSxpLmRldGVybWluYW50PWZ1bmN0aW9uKHQpe3JldHVybiB0WzBdKnRbM10tdFsxXSp0WzJdfSxpLm11bHRpcGx5PWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lWzBdLGk9ZVsxXSxhPWVbMl0sbz1lWzNdLHM9ZVs0XSxsPWVbNV0sdT1yWzBdLGM9clsxXSxoPXJbMl0sZj1yWzNdLGQ9cls0XSxwPXJbNV07cmV0dXJuIHRbMF09bip1K2EqYyx0WzFdPWkqdStvKmMsdFsyXT1uKmgrYSpmLHRbM109aSpoK28qZix0WzRdPW4qZCthKnArcyx0WzVdPWkqZCtvKnArbCx0fSxpLm11bD1pLm11bHRpcGx5LGkucm90YXRlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lWzBdLGk9ZVsxXSxhPWVbMl0sbz1lWzNdLHM9ZVs0XSxsPWVbNV0sdT1NYXRoLnNpbihyKSxjPU1hdGguY29zKHIpO3JldHVybiB0WzBdPW4qYythKnUsdFsxXT1pKmMrbyp1LHRbMl09biotdSthKmMsdFszXT1pKi11K28qYyx0WzRdPXMsdFs1XT1sLHR9LGkuc2NhbGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWVbMF0saT1lWzFdLGE9ZVsyXSxvPWVbM10scz1lWzRdLGw9ZVs1XSx1PXJbMF0sYz1yWzFdO3JldHVybiB0WzBdPW4qdSx0WzFdPWkqdSx0WzJdPWEqYyx0WzNdPW8qYyx0WzRdPXMsdFs1XT1sLHR9LGkudHJhbnNsYXRlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lWzBdLGk9ZVsxXSxhPWVbMl0sbz1lWzNdLHM9ZVs0XSxsPWVbNV0sdT1yWzBdLGM9clsxXTtyZXR1cm4gdFswXT1uLHRbMV09aSx0WzJdPWEsdFszXT1vLHRbNF09bip1K2EqYytzLHRbNV09aSp1K28qYytsLHR9LGkuZnJvbVJvdGF0aW9uPWZ1bmN0aW9uKHQsZSl7dmFyIHI9TWF0aC5zaW4oZSksbj1NYXRoLmNvcyhlKTtyZXR1cm4gdFswXT1uLHRbMV09cix0WzJdPS1yLHRbM109bix0WzRdPTAsdFs1XT0wLHR9LGkuZnJvbVNjYWxpbmc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT1lWzBdLHRbMV09MCx0WzJdPTAsdFszXT1lWzFdLHRbNF09MCx0WzVdPTAsdH0saS5mcm9tVHJhbnNsYXRpb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0xLHRbNF09ZVswXSx0WzVdPWVbMV0sdH0saS5zdHI9ZnVuY3Rpb24odCl7cmV0dXJuIm1hdDJkKCIrdFswXSsiLCAiK3RbMV0rIiwgIit0WzJdKyIsICIrdFszXSsiLCAiK3RbNF0rIiwgIit0WzVdKyIpIn0saS5mcm9iPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoTWF0aC5wb3codFswXSwyKStNYXRoLnBvdyh0WzFdLDIpK01hdGgucG93KHRbMl0sMikrTWF0aC5wb3codFszXSwyKStNYXRoLnBvdyh0WzRdLDIpK01hdGgucG93KHRbNV0sMikrMSl9LGkuYWRkPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFswXT1lWzBdK3JbMF0sdFsxXT1lWzFdK3JbMV0sdFsyXT1lWzJdK3JbMl0sdFszXT1lWzNdK3JbM10sdFs0XT1lWzRdK3JbNF0sdFs1XT1lWzVdK3JbNV0sdH0saS5zdWJ0cmFjdD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09ZVswXS1yWzBdLHRbMV09ZVsxXS1yWzFdLHRbMl09ZVsyXS1yWzJdLHRbM109ZVszXS1yWzNdLHRbNF09ZVs0XS1yWzRdLHRbNV09ZVs1XS1yWzVdLHR9LGkuc3ViPWkuc3VidHJhY3QsaS5tdWx0aXBseVNjYWxhcj1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09ZVswXSpyLHRbMV09ZVsxXSpyLHRbMl09ZVsyXSpyLHRbM109ZVszXSpyLHRbNF09ZVs0XSpyLHRbNV09ZVs1XSpyLHR9LGkubXVsdGlwbHlTY2FsYXJBbmRBZGQ9ZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuIHRbMF09ZVswXStyWzBdKm4sdFsxXT1lWzFdK3JbMV0qbix0WzJdPWVbMl0rclsyXSpuLHRbM109ZVszXStyWzNdKm4sdFs0XT1lWzRdK3JbNF0qbix0WzVdPWVbNV0rcls1XSpuLHR9LGkuZXhhY3RFcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT09PWVbMF0mJnRbMV09PT1lWzFdJiZ0WzJdPT09ZVsyXSYmdFszXT09PWVbM10mJnRbNF09PT1lWzRdJiZ0WzVdPT09ZVs1XX0saS5lcXVhbHM9ZnVuY3Rpb24odCxlKXt2YXIgcj10WzBdLGk9dFsxXSxhPXRbMl0sbz10WzNdLHM9dFs0XSxsPXRbNV0sdT1lWzBdLGM9ZVsxXSxoPWVbMl0sZj1lWzNdLGQ9ZVs0XSxwPWVbNV07cmV0dXJuIE1hdGguYWJzKHItdSk8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHIpLE1hdGguYWJzKHUpKSYmTWF0aC5hYnMoaS1jKTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoaSksTWF0aC5hYnMoYykpJiZNYXRoLmFicyhhLWgpPD1uLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhhKSxNYXRoLmFicyhoKSkmJk1hdGguYWJzKG8tZik8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKG8pLE1hdGguYWJzKGYpKSYmTWF0aC5hYnMocy1kKTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMocyksTWF0aC5hYnMoZCkpJiZNYXRoLmFicyhsLXApPD1uLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhsKSxNYXRoLmFicyhwKSl9LGUuZXhwb3J0cz1pfSx7Ii4vY29tbW9uLmpzIjoxNjJ9XSwxNjU6W2Z1bmN0aW9uKHQsZSxyKXt2YXIgbj10KCIuL2NvbW1vbi5qcyIpLGk9e307aS5jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgbi5BUlJBWV9UWVBFKDkpO3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT0xLHRbNV09MCx0WzZdPTAsdFs3XT0wLHRbOF09MSx0fSxpLmZyb21NYXQ0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbMV0sdFsyXT1lWzJdLHRbM109ZVs0XSx0WzRdPWVbNV0sdFs1XT1lWzZdLHRbNl09ZVs4XSx0WzddPWVbOV0sdFs4XT1lWzEwXSx0fSxpLmNsb25lPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBuLkFSUkFZX1RZUEUoOSk7cmV0dXJuIGVbMF09dFswXSxlWzFdPXRbMV0sZVsyXT10WzJdLGVbM109dFszXSxlWzRdPXRbNF0sZVs1XT10WzVdLGVbNl09dFs2XSxlWzddPXRbN10sZVs4XT10WzhdLGV9LGkuY29weT1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzFdLHRbMl09ZVsyXSx0WzNdPWVbM10sdFs0XT1lWzRdLHRbNV09ZVs1XSx0WzZdPWVbNl0sdFs3XT1lWzddLHRbOF09ZVs4XSx0fSxpLmZyb21WYWx1ZXM9ZnVuY3Rpb24odCxlLHIsaSxhLG8scyxsLHUpe3ZhciBjPW5ldyBuLkFSUkFZX1RZUEUoOSk7cmV0dXJuIGNbMF09dCxjWzFdPWUsY1syXT1yLGNbM109aSxjWzRdPWEsY1s1XT1vLGNbNl09cyxjWzddPWwsY1s4XT11LGN9LGkuc2V0PWZ1bmN0aW9uKHQsZSxyLG4saSxhLG8scyxsLHUpe3JldHVybiB0WzBdPWUsdFsxXT1yLHRbMl09bix0WzNdPWksdFs0XT1hLHRbNV09byx0WzZdPXMsdFs3XT1sLHRbOF09dSx0fSxpLmlkZW50aXR5PWZ1bmN0aW9uKHQpe3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT0xLHRbNV09MCx0WzZdPTAsdFs3XT0wLHRbOF09MSx0fSxpLnRyYW5zcG9zZT1mdW5jdGlvbih0LGUpe2lmKHQ9PT1lKXt2YXIgcj1lWzFdLG49ZVsyXSxpPWVbNV07dFsxXT1lWzNdLHRbMl09ZVs2XSx0WzNdPXIsdFs1XT1lWzddLHRbNl09bix0WzddPWl9ZWxzZSB0WzBdPWVbMF0sdFsxXT1lWzNdLHRbMl09ZVs2XSx0WzNdPWVbMV0sdFs0XT1lWzRdLHRbNV09ZVs3XSx0WzZdPWVbMl0sdFs3XT1lWzVdLHRbOF09ZVs4XTtyZXR1cm4gdH0saS5pbnZlcnQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1lWzBdLG49ZVsxXSxpPWVbMl0sYT1lWzNdLG89ZVs0XSxzPWVbNV0sbD1lWzZdLHU9ZVs3XSxjPWVbOF0saD1jKm8tcyp1LGY9LWMqYStzKmwsZD11KmEtbypsLHA9cipoK24qZitpKmQ7cmV0dXJuIHA/KHA9MS9wLHRbMF09aCpwLHRbMV09KC1jKm4raSp1KSpwLHRbMl09KHMqbi1pKm8pKnAsdFszXT1mKnAsdFs0XT0oYypyLWkqbCkqcCx0WzVdPSgtcypyK2kqYSkqcCx0WzZdPWQqcCx0WzddPSgtdSpyK24qbCkqcCx0WzhdPShvKnItbiphKSpwLHQpOm51bGx9LGkuYWRqb2ludD1mdW5jdGlvbih0LGUpe3ZhciByPWVbMF0sbj1lWzFdLGk9ZVsyXSxhPWVbM10sbz1lWzRdLHM9ZVs1XSxsPWVbNl0sdT1lWzddLGM9ZVs4XTtyZXR1cm4gdFswXT1vKmMtcyp1LHRbMV09aSp1LW4qYyx0WzJdPW4qcy1pKm8sdFszXT1zKmwtYSpjLHRbNF09cipjLWkqbCx0WzVdPWkqYS1yKnMsdFs2XT1hKnUtbypsLHRbN109bipsLXIqdSx0WzhdPXIqby1uKmEsdH0saS5kZXRlcm1pbmFudD1mdW5jdGlvbih0KXt2YXIgZT10WzBdLHI9dFsxXSxuPXRbMl0saT10WzNdLGE9dFs0XSxvPXRbNV0scz10WzZdLGw9dFs3XSx1PXRbOF07cmV0dXJuIGUqKHUqYS1vKmwpK3IqKC11KmkrbypzKStuKihsKmktYSpzKX0saS5tdWx0aXBseT1mdW5jdGlvbih0LGUscil7dmFyIG49ZVswXSxpPWVbMV0sYT1lWzJdLG89ZVszXSxzPWVbNF0sbD1lWzVdLHU9ZVs2XSxjPWVbN10saD1lWzhdLGY9clswXSxkPXJbMV0scD1yWzJdLGc9clszXSxtPXJbNF0sdj1yWzVdLHk9cls2XSx4PXJbN10sYj1yWzhdO3JldHVybiB0WzBdPWYqbitkKm8rcCp1LHRbMV09ZippK2QqcytwKmMsdFsyXT1mKmErZCpsK3AqaCx0WzNdPWcqbittKm8rdip1LHRbNF09ZyppK20qcyt2KmMsdFs1XT1nKmErbSpsK3YqaCx0WzZdPXkqbit4Km8rYip1LHRbN109eSppK3gqcytiKmMsdFs4XT15KmEreCpsK2IqaCx0fSxpLm11bD1pLm11bHRpcGx5LGkudHJhbnNsYXRlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lWzBdLGk9ZVsxXSxhPWVbMl0sbz1lWzNdLHM9ZVs0XSxsPWVbNV0sdT1lWzZdLGM9ZVs3XSxoPWVbOF0sZj1yWzBdLGQ9clsxXTtyZXR1cm4gdFswXT1uLHRbMV09aSx0WzJdPWEsdFszXT1vLHRbNF09cyx0WzVdPWwsdFs2XT1mKm4rZCpvK3UsdFs3XT1mKmkrZCpzK2MsdFs4XT1mKmErZCpsK2gsdH0saS5yb3RhdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWVbMF0saT1lWzFdLGE9ZVsyXSxvPWVbM10scz1lWzRdLGw9ZVs1XSx1PWVbNl0sYz1lWzddLGg9ZVs4XSxmPU1hdGguc2luKHIpLGQ9TWF0aC5jb3Mocik7cmV0dXJuIHRbMF09ZCpuK2Yqbyx0WzFdPWQqaStmKnMsdFsyXT1kKmErZipsLHRbM109ZCpvLWYqbix0WzRdPWQqcy1mKmksdFs1XT1kKmwtZiphLHRbNl09dSx0WzddPWMsdFs4XT1oLHR9LGkuc2NhbGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXJbMF0saT1yWzFdO3JldHVybiB0WzBdPW4qZVswXSx0WzFdPW4qZVsxXSx0WzJdPW4qZVsyXSx0WzNdPWkqZVszXSx0WzRdPWkqZVs0XSx0WzVdPWkqZVs1XSx0WzZdPWVbNl0sdFs3XT1lWzddLHRbOF09ZVs4XSx0fSxpLmZyb21UcmFuc2xhdGlvbj1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT0xLHRbNV09MCx0WzZdPWVbMF0sdFs3XT1lWzFdLHRbOF09MSx0fSxpLmZyb21Sb3RhdGlvbj1mdW5jdGlvbih0LGUpe3ZhciByPU1hdGguc2luKGUpLG49TWF0aC5jb3MoZSk7cmV0dXJuIHRbMF09bix0WzFdPXIsdFsyXT0wLHRbM109LXIsdFs0XT1uLHRbNV09MCx0WzZdPTAsdFs3XT0wLHRbOF09MSx0fSxpLmZyb21TY2FsaW5nPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09ZVswXSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPWVbMV0sdFs1XT0wLHRbNl09MCx0WzddPTAsdFs4XT0xLHR9LGkuZnJvbU1hdDJkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbMV0sdFsyXT0wLHRbM109ZVsyXSx0WzRdPWVbM10sdFs1XT0wLHRbNl09ZVs0XSx0WzddPWVbNV0sdFs4XT0xLHR9LGkuZnJvbVF1YXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1lWzBdLG49ZVsxXSxpPWVbMl0sYT1lWzNdLG89cityLHM9bituLGw9aStpLHU9cipvLGM9bipvLGg9bipzLGY9aSpvLGQ9aSpzLHA9aSpsLGc9YSpvLG09YSpzLHY9YSpsO3JldHVybiB0WzBdPTEtaC1wLHRbM109Yy12LHRbNl09ZittLHRbMV09Yyt2LHRbNF09MS11LXAsdFs3XT1kLWcsdFsyXT1mLW0sdFs1XT1kK2csdFs4XT0xLXUtaCx0fSxpLm5vcm1hbEZyb21NYXQ0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZVswXSxuPWVbMV0saT1lWzJdLGE9ZVszXSxvPWVbNF0scz1lWzVdLGw9ZVs2XSx1PWVbN10sYz1lWzhdLGg9ZVs5XSxmPWVbMTBdLGQ9ZVsxMV0scD1lWzEyXSxnPWVbMTNdLG09ZVsxNF0sdj1lWzE1XSx5PXIqcy1uKm8seD1yKmwtaSpvLGI9cip1LWEqbyxfPW4qbC1pKnMsdz1uKnUtYSpzLE09aSp1LWEqbCxBPWMqZy1oKnAsaz1jKm0tZipwLFQ9Yyp2LWQqcCxFPWgqbS1mKmcsUz1oKnYtZCpnLEw9Zip2LWQqbSx6PXkqTC14KlMrYipFK18qVC13KmsrTSpBO3JldHVybiB6Pyh6PTEveix0WzBdPShzKkwtbCpTK3UqRSkqeix0WzFdPShsKlQtbypMLXUqaykqeix0WzJdPShvKlMtcypUK3UqQSkqeix0WzNdPShpKlMtbipMLWEqRSkqeix0WzRdPShyKkwtaSpUK2Eqaykqeix0WzVdPShuKlQtcipTLWEqQSkqeix0WzZdPShnKk0tbSp3K3YqXykqeix0WzddPShtKmItcCpNLXYqeCkqeix0WzhdPShwKnctZypiK3YqeSkqeix0KTpudWxsfSxpLnN0cj1mdW5jdGlvbih0KXtyZXR1cm4ibWF0MygiK3RbMF0rIiwgIit0WzFdKyIsICIrdFsyXSsiLCAiK3RbM10rIiwgIit0WzRdKyIsICIrdFs1XSsiLCAiK3RbNl0rIiwgIit0WzddKyIsICIrdFs4XSsiKSJ9LGkuZnJvYj1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHRbMF0sMikrTWF0aC5wb3codFsxXSwyKStNYXRoLnBvdyh0WzJdLDIpK01hdGgucG93KHRbM10sMikrTWF0aC5wb3codFs0XSwyKStNYXRoLnBvdyh0WzVdLDIpK01hdGgucG93KHRbNl0sMikrTWF0aC5wb3codFs3XSwyKStNYXRoLnBvdyh0WzhdLDIpKX0saS5hZGQ9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0WzBdPWVbMF0rclswXSx0WzFdPWVbMV0rclsxXSx0WzJdPWVbMl0rclsyXSx0WzNdPWVbM10rclszXSx0WzRdPWVbNF0rcls0XSx0WzVdPWVbNV0rcls1XSx0WzZdPWVbNl0rcls2XSx0WzddPWVbN10rcls3XSx0WzhdPWVbOF0rcls4XSx0fSxpLnN1YnRyYWN0PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFswXT1lWzBdLXJbMF0sdFsxXT1lWzFdLXJbMV0sdFsyXT1lWzJdLXJbMl0sdFszXT1lWzNdLXJbM10sdFs0XT1lWzRdLXJbNF0sdFs1XT1lWzVdLXJbNV0sdFs2XT1lWzZdLXJbNl0sdFs3XT1lWzddLXJbN10sdFs4XT1lWzhdLXJbOF0sdH0saS5zdWI9aS5zdWJ0cmFjdCxpLm11bHRpcGx5U2NhbGFyPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFswXT1lWzBdKnIsdFsxXT1lWzFdKnIsdFsyXT1lWzJdKnIsdFszXT1lWzNdKnIsdFs0XT1lWzRdKnIsdFs1XT1lWzVdKnIsdFs2XT1lWzZdKnIsdFs3XT1lWzddKnIsdFs4XT1lWzhdKnIsdH0saS5tdWx0aXBseVNjYWxhckFuZEFkZD1mdW5jdGlvbih0LGUscixuKXtyZXR1cm4gdFswXT1lWzBdK3JbMF0qbix0WzFdPWVbMV0rclsxXSpuLHRbMl09ZVsyXStyWzJdKm4sdFszXT1lWzNdK3JbM10qbix0WzRdPWVbNF0rcls0XSpuLHRbNV09ZVs1XStyWzVdKm4sdFs2XT1lWzZdK3JbNl0qbix0WzddPWVbN10rcls3XSpuLHRbOF09ZVs4XStyWzhdKm4sdH0saS5leGFjdEVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPT09ZVswXSYmdFsxXT09PWVbMV0mJnRbMl09PT1lWzJdJiZ0WzNdPT09ZVszXSYmdFs0XT09PWVbNF0mJnRbNV09PT1lWzVdJiZ0WzZdPT09ZVs2XSYmdFs3XT09PWVbN10mJnRbOF09PT1lWzhdfSxpLmVxdWFscz1mdW5jdGlvbih0LGUpe3ZhciByPXRbMF0saT10WzFdLGE9dFsyXSxvPXRbM10scz10WzRdLGw9dFs1XSx1PXRbNl0sYz10WzddLGg9dFs4XSxmPWVbMF0sZD1lWzFdLHA9ZVsyXSxnPWVbM10sbT1lWzRdLHY9ZVs1XSx5PXRbNl0seD1lWzddLGI9ZVs4XTtyZXR1cm4gTWF0aC5hYnMoci1mKTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMociksTWF0aC5hYnMoZikpJiZNYXRoLmFicyhpLWQpPD1uLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhpKSxNYXRoLmFicyhkKSkmJk1hdGguYWJzKGEtcCk8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGEpLE1hdGguYWJzKHApKSYmTWF0aC5hYnMoby1nKTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMobyksTWF0aC5hYnMoZykpJiZNYXRoLmFicyhzLW0pPD1uLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhzKSxNYXRoLmFicyhtKSkmJk1hdGguYWJzKGwtdik8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGwpLE1hdGguYWJzKHYpKSYmTWF0aC5hYnModS15KTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnModSksTWF0aC5hYnMoeSkpJiZNYXRoLmFicyhjLXgpPD1uLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhjKSxNYXRoLmFicyh4KSkmJk1hdGguYWJzKGgtYik8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGgpLE1hdGguYWJzKGIpKX0sZS5leHBvcnRzPWl9LHsiLi9jb21tb24uanMiOjE2Mn1dLDE2NjpbZnVuY3Rpb24odCxlLHIpe3ZhciBuPXQoIi4vY29tbW9uLmpzIiksaT17c2NhbGFyOnt9LFNJTUQ6e319O2kuY3JlYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IG4uQVJSQVlfVFlQRSgxNik7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT0xLHRbNl09MCx0WzddPTAsdFs4XT0wLHRbOV09MCx0WzEwXT0xLHRbMTFdPTAsdFsxMl09MCx0WzEzXT0wLHRbMTRdPTAsdFsxNV09MSx0fSxpLmNsb25lPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBuLkFSUkFZX1RZUEUoMTYpO3JldHVybiBlWzBdPXRbMF0sZVsxXT10WzFdLGVbMl09dFsyXSxlWzNdPXRbM10sZVs0XT10WzRdLGVbNV09dFs1XSxlWzZdPXRbNl0sZVs3XT10WzddLGVbOF09dFs4XSxlWzldPXRbOV0sZVsxMF09dFsxMF0sZVsxMV09dFsxMV0sZVsxMl09dFsxMl0sZVsxM109dFsxM10sZVsxNF09dFsxNF0sZVsxNV09dFsxNV0sZX0saS5jb3B5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbMV0sdFsyXT1lWzJdLHRbM109ZVszXSx0WzRdPWVbNF0sdFs1XT1lWzVdLHRbNl09ZVs2XSx0WzddPWVbN10sdFs4XT1lWzhdLHRbOV09ZVs5XSx0WzEwXT1lWzEwXSx0WzExXT1lWzExXSx0WzEyXT1lWzEyXSx0WzEzXT1lWzEzXSx0WzE0XT1lWzE0XSx0WzE1XT1lWzE1XSx0fSxpLmZyb21WYWx1ZXM9ZnVuY3Rpb24odCxlLHIsaSxhLG8scyxsLHUsYyxoLGYsZCxwLGcsbSl7dmFyIHY9bmV3IG4uQVJSQVlfVFlQRSgxNik7cmV0dXJuIHZbMF09dCx2WzFdPWUsdlsyXT1yLHZbM109aSx2WzRdPWEsdls1XT1vLHZbNl09cyx2WzddPWwsdls4XT11LHZbOV09Yyx2WzEwXT1oLHZbMTFdPWYsdlsxMl09ZCx2WzEzXT1wLHZbMTRdPWcsdlsxNV09bSx2fSxpLnNldD1mdW5jdGlvbih0LGUscixuLGksYSxvLHMsbCx1LGMsaCxmLGQscCxnLG0pe3JldHVybiB0WzBdPWUsdFsxXT1yLHRbMl09bix0WzNdPWksdFs0XT1hLHRbNV09byx0WzZdPXMsdFs3XT1sLHRbOF09dSx0WzldPWMsdFsxMF09aCx0WzExXT1mLHRbMTJdPWQsdFsxM109cCx0WzE0XT1nLHRbMTVdPW0sdH0saS5pZGVudGl0eT1mdW5jdGlvbih0KXtyZXR1cm4gdFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MCx0WzVdPTEsdFs2XT0wLHRbN109MCx0WzhdPTAsdFs5XT0wLHRbMTBdPTEsdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCx0WzE1XT0xLHR9LGkuc2NhbGFyLnRyYW5zcG9zZT1mdW5jdGlvbih0LGUpe2lmKHQ9PT1lKXt2YXIgcj1lWzFdLG49ZVsyXSxpPWVbM10sYT1lWzZdLG89ZVs3XSxzPWVbMTFdO3RbMV09ZVs0XSx0WzJdPWVbOF0sdFszXT1lWzEyXSx0WzRdPXIsdFs2XT1lWzldLHRbN109ZVsxM10sdFs4XT1uLHRbOV09YSx0WzExXT1lWzE0XSx0WzEyXT1pLHRbMTNdPW8sdFsxNF09c31lbHNlIHRbMF09ZVswXSx0WzFdPWVbNF0sdFsyXT1lWzhdLHRbM109ZVsxMl0sdFs0XT1lWzFdLHRbNV09ZVs1XSx0WzZdPWVbOV0sdFs3XT1lWzEzXSx0WzhdPWVbMl0sdFs5XT1lWzZdLHRbMTBdPWVbMTBdLHRbMTFdPWVbMTRdLHRbMTJdPWVbM10sdFsxM109ZVs3XSx0WzE0XT1lWzExXSx0WzE1XT1lWzE1XTtyZXR1cm4gdH0saS5TSU1ELnRyYW5zcG9zZT1mdW5jdGlvbih0LGUpe3ZhciByLG4saSxhLG8scyxsLHUsYyxoO3JldHVybiByPVNJTUQuRmxvYXQzMng0LmxvYWQoZSwwKSxuPVNJTUQuRmxvYXQzMng0LmxvYWQoZSw0KSxpPVNJTUQuRmxvYXQzMng0LmxvYWQoZSw4KSxhPVNJTUQuRmxvYXQzMng0LmxvYWQoZSwxMiksbz1TSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKHIsbiwwLDEsNCw1KSxzPVNJTUQuRmxvYXQzMng0LnNodWZmbGUoaSxhLDAsMSw0LDUpLGw9U0lNRC5GbG9hdDMyeDQuc2h1ZmZsZShvLHMsMCwyLDQsNiksdT1TSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKG8scywxLDMsNSw3KSxTSU1ELkZsb2F0MzJ4NC5zdG9yZSh0LDAsbCksU0lNRC5GbG9hdDMyeDQuc3RvcmUodCw0LHUpLG89U0lNRC5GbG9hdDMyeDQuc2h1ZmZsZShyLG4sMiwzLDYsNykscz1TSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKGksYSwyLDMsNiw3KSxjPVNJTUQuRmxvYXQzMng0LnNodWZmbGUobyxzLDAsMiw0LDYpLGg9U0lNRC5GbG9hdDMyeDQuc2h1ZmZsZShvLHMsMSwzLDUsNyksU0lNRC5GbG9hdDMyeDQuc3RvcmUodCw4LGMpLFNJTUQuRmxvYXQzMng0LnN0b3JlKHQsMTIsaCksdH0saS50cmFuc3Bvc2U9bi5VU0VfU0lNRD9pLlNJTUQudHJhbnNwb3NlOmkuc2NhbGFyLnRyYW5zcG9zZSxpLnNjYWxhci5pbnZlcnQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1lWzBdLG49ZVsxXSxpPWVbMl0sYT1lWzNdLG89ZVs0XSxzPWVbNV0sbD1lWzZdLHU9ZVs3XSxjPWVbOF0saD1lWzldLGY9ZVsxMF0sZD1lWzExXSxwPWVbMTJdLGc9ZVsxM10sbT1lWzE0XSx2PWVbMTVdLHk9cipzLW4qbyx4PXIqbC1pKm8sYj1yKnUtYSpvLF89bipsLWkqcyx3PW4qdS1hKnMsTT1pKnUtYSpsLEE9YypnLWgqcCxrPWMqbS1mKnAsVD1jKnYtZCpwLEU9aCptLWYqZyxTPWgqdi1kKmcsTD1mKnYtZCptLHo9eSpMLXgqUytiKkUrXypULXcqaytNKkE7cmV0dXJuIHo/KHo9MS96LHRbMF09KHMqTC1sKlMrdSpFKSp6LHRbMV09KGkqUy1uKkwtYSpFKSp6LHRbMl09KGcqTS1tKncrdipfKSp6LHRbM109KGYqdy1oKk0tZCpfKSp6LHRbNF09KGwqVC1vKkwtdSprKSp6LHRbNV09KHIqTC1pKlQrYSprKSp6LHRbNl09KG0qYi1wKk0tdip4KSp6LHRbN109KGMqTS1mKmIrZCp4KSp6LHRbOF09KG8qUy1zKlQrdSpBKSp6LHRbOV09KG4qVC1yKlMtYSpBKSp6LHRbMTBdPShwKnctZypiK3YqeSkqeix0WzExXT0oaCpiLWMqdy1kKnkpKnosdFsxMl09KHMqay1vKkUtbCpBKSp6LHRbMTNdPShyKkUtbiprK2kqQSkqeix0WzE0XT0oZyp4LXAqXy1tKnkpKnosdFsxNV09KGMqXy1oKngrZip5KSp6LHQpOm51bGx9LGkuU0lNRC5pbnZlcnQ9ZnVuY3Rpb24odCxlKXt2YXIgcixuLGksYSxvLHMsbCx1LGMsaCxmPVNJTUQuRmxvYXQzMng0LmxvYWQoZSwwKSxkPVNJTUQuRmxvYXQzMng0LmxvYWQoZSw0KSxwPVNJTUQuRmxvYXQzMng0LmxvYWQoZSw4KSxnPVNJTUQuRmxvYXQzMng0LmxvYWQoZSwxMik7cmV0dXJuIG89U0lNRC5GbG9hdDMyeDQuc2h1ZmZsZShmLGQsMCwxLDQsNSksbj1TSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKHAsZywwLDEsNCw1KSxyPVNJTUQuRmxvYXQzMng0LnNodWZmbGUobyxuLDAsMiw0LDYpLG49U0lNRC5GbG9hdDMyeDQuc2h1ZmZsZShuLG8sMSwzLDUsNyksbz1TSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKGYsZCwyLDMsNiw3KSxhPVNJTUQuRmxvYXQzMng0LnNodWZmbGUocCxnLDIsMyw2LDcpLGk9U0lNRC5GbG9hdDMyeDQuc2h1ZmZsZShvLGEsMCwyLDQsNiksYT1TSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKGEsbywxLDMsNSw3KSxvPVNJTUQuRmxvYXQzMng0Lm11bChpLGEpLG89U0lNRC5GbG9hdDMyeDQuc3dpenpsZShvLDEsMCwzLDIpLHM9U0lNRC5GbG9hdDMyeDQubXVsKG4sbyksbD1TSU1ELkZsb2F0MzJ4NC5tdWwocixvKSxvPVNJTUQuRmxvYXQzMng0LnN3aXp6bGUobywyLDMsMCwxKSxzPVNJTUQuRmxvYXQzMng0LnN1YihTSU1ELkZsb2F0MzJ4NC5tdWwobixvKSxzKSxsPVNJTUQuRmxvYXQzMng0LnN1YihTSU1ELkZsb2F0MzJ4NC5tdWwocixvKSxsKSxsPVNJTUQuRmxvYXQzMng0LnN3aXp6bGUobCwyLDMsMCwxKSxvPVNJTUQuRmxvYXQzMng0Lm11bChuLGkpLG89U0lNRC5GbG9hdDMyeDQuc3dpenpsZShvLDEsMCwzLDIpLHM9U0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChhLG8pLHMpLGM9U0lNRC5GbG9hdDMyeDQubXVsKHIsbyksbz1TSU1ELkZsb2F0MzJ4NC5zd2l6emxlKG8sMiwzLDAsMSkscz1TSU1ELkZsb2F0MzJ4NC5zdWIocyxTSU1ELkZsb2F0MzJ4NC5tdWwoYSxvKSksYz1TSU1ELkZsb2F0MzJ4NC5zdWIoU0lNRC5GbG9hdDMyeDQubXVsKHIsbyksYyksYz1TSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGMsMiwzLDAsMSksbz1TSU1ELkZsb2F0MzJ4NC5tdWwoU0lNRC5GbG9hdDMyeDQuc3dpenpsZShuLDIsMywwLDEpLGEpLG89U0lNRC5GbG9hdDMyeDQuc3dpenpsZShvLDEsMCwzLDIpLGk9U0lNRC5GbG9hdDMyeDQuc3dpenpsZShpLDIsMywwLDEpLHM9U0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChpLG8pLHMpLHU9U0lNRC5GbG9hdDMyeDQubXVsKHIsbyksbz1TSU1ELkZsb2F0MzJ4NC5zd2l6emxlKG8sMiwzLDAsMSkscz1TSU1ELkZsb2F0MzJ4NC5zdWIocyxTSU1ELkZsb2F0MzJ4NC5tdWwoaSxvKSksdT1TSU1ELkZsb2F0MzJ4NC5zdWIoU0lNRC5GbG9hdDMyeDQubXVsKHIsbyksdSksdT1TSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHUsMiwzLDAsMSksbz1TSU1ELkZsb2F0MzJ4NC5tdWwocixuKSxvPVNJTUQuRmxvYXQzMng0LnN3aXp6bGUobywxLDAsMywyKSx1PVNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwoYSxvKSx1KSxjPVNJTUQuRmxvYXQzMng0LnN1YihTSU1ELkZsb2F0MzJ4NC5tdWwoaSxvKSxjKSxvPVNJTUQuRmxvYXQzMng0LnN3aXp6bGUobywyLDMsMCwxKSx1PVNJTUQuRmxvYXQzMng0LnN1YihTSU1ELkZsb2F0MzJ4NC5tdWwoYSxvKSx1KSxjPVNJTUQuRmxvYXQzMng0LnN1YihjLFNJTUQuRmxvYXQzMng0Lm11bChpLG8pKSxvPVNJTUQuRmxvYXQzMng0Lm11bChyLGEpLG89U0lNRC5GbG9hdDMyeDQuc3dpenpsZShvLDEsMCwzLDIpLGw9U0lNRC5GbG9hdDMyeDQuc3ViKGwsU0lNRC5GbG9hdDMyeDQubXVsKGksbykpLHU9U0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChuLG8pLHUpLG89U0lNRC5GbG9hdDMyeDQuc3dpenpsZShvLDIsMywwLDEpLGw9U0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChpLG8pLGwpLHU9U0lNRC5GbG9hdDMyeDQuc3ViKHUsU0lNRC5GbG9hdDMyeDQubXVsKG4sbykpLG89U0lNRC5GbG9hdDMyeDQubXVsKHIsaSksbz1TSU1ELkZsb2F0MzJ4NC5zd2l6emxlKG8sMSwwLDMsMiksbD1TSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKGEsbyksbCksYz1TSU1ELkZsb2F0MzJ4NC5zdWIoYyxTSU1ELkZsb2F0MzJ4NC5tdWwobixvKSksbz1TSU1ELkZsb2F0MzJ4NC5zd2l6emxlKG8sMiwzLDAsMSksbD1TSU1ELkZsb2F0MzJ4NC5zdWIobCxTSU1ELkZsb2F0MzJ4NC5tdWwoYSxvKSksYz1TSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKG4sbyksYyksaD1TSU1ELkZsb2F0MzJ4NC5tdWwocixzKSxoPVNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGgsMiwzLDAsMSksaCksaD1TSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQuc3dpenpsZShoLDEsMCwzLDIpLGgpLG89U0lNRC5GbG9hdDMyeDQucmVjaXByb2NhbEFwcHJveGltYXRpb24oaCksaD1TSU1ELkZsb2F0MzJ4NC5zdWIoU0lNRC5GbG9hdDMyeDQuYWRkKG8sbyksU0lNRC5GbG9hdDMyeDQubXVsKGgsU0lNRC5GbG9hdDMyeDQubXVsKG8sbykpKSwoaD1TSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGgsMCwwLDAsMCkpPyhTSU1ELkZsb2F0MzJ4NC5zdG9yZSh0LDAsU0lNRC5GbG9hdDMyeDQubXVsKGgscykpLFNJTUQuRmxvYXQzMng0LnN0b3JlKHQsNCxTSU1ELkZsb2F0MzJ4NC5tdWwoaCxsKSksU0lNRC5GbG9hdDMyeDQuc3RvcmUodCw4LFNJTUQuRmxvYXQzMng0Lm11bChoLHUpKSxTSU1ELkZsb2F0MzJ4NC5zdG9yZSh0LDEyLFNJTUQuRmxvYXQzMng0Lm11bChoLGMpKSx0KTpudWxsfSxpLmludmVydD1uLlVTRV9TSU1EP2kuU0lNRC5pbnZlcnQ6aS5zY2FsYXIuaW52ZXJ0LGkuc2NhbGFyLmFkam9pbnQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1lWzBdLG49ZVsxXSxpPWVbMl0sYT1lWzNdLG89ZVs0XSxzPWVbNV0sbD1lWzZdLHU9ZVs3XSxjPWVbOF0saD1lWzldLGY9ZVsxMF0sZD1lWzExXSxwPWVbMTJdLGc9ZVsxM10sbT1lWzE0XSx2PWVbMTVdO3JldHVybiB0WzBdPXMqKGYqdi1kKm0pLWgqKGwqdi11Km0pK2cqKGwqZC11KmYpLHRbMV09LShuKihmKnYtZCptKS1oKihpKnYtYSptKStnKihpKmQtYSpmKSksdFsyXT1uKihsKnYtdSptKS1zKihpKnYtYSptKStnKihpKnUtYSpsKSx0WzNdPS0obioobCpkLXUqZiktcyooaSpkLWEqZikraCooaSp1LWEqbCkpLHRbNF09LShvKihmKnYtZCptKS1jKihsKnYtdSptKStwKihsKmQtdSpmKSksdFs1XT1yKihmKnYtZCptKS1jKihpKnYtYSptKStwKihpKmQtYSpmKSx0WzZdPS0ocioobCp2LXUqbSktbyooaSp2LWEqbSkrcCooaSp1LWEqbCkpLHRbN109cioobCpkLXUqZiktbyooaSpkLWEqZikrYyooaSp1LWEqbCksdFs4XT1vKihoKnYtZCpnKS1jKihzKnYtdSpnKStwKihzKmQtdSpoKSx0WzldPS0ociooaCp2LWQqZyktYyoobip2LWEqZykrcCoobipkLWEqaCkpLHRbMTBdPXIqKHMqdi11KmcpLW8qKG4qdi1hKmcpK3AqKG4qdS1hKnMpLHRbMTFdPS0ocioocypkLXUqaCktbyoobipkLWEqaCkrYyoobip1LWEqcykpLHRbMTJdPS0obyooaCptLWYqZyktYyoocyptLWwqZykrcCoocypmLWwqaCkpLHRbMTNdPXIqKGgqbS1mKmcpLWMqKG4qbS1pKmcpK3AqKG4qZi1pKmgpLHRbMTRdPS0ocioocyptLWwqZyktbyoobiptLWkqZykrcCoobipsLWkqcykpLHRbMTVdPXIqKHMqZi1sKmgpLW8qKG4qZi1pKmgpK2MqKG4qbC1pKnMpLHR9LGkuU0lNRC5hZGpvaW50PWZ1bmN0aW9uKHQsZSl7dmFyIHIsbixpLGEsbyxzLGwsdSxjLGgsZixkLHAscj1TSU1ELkZsb2F0MzJ4NC5sb2FkKGUsMCksbj1TSU1ELkZsb2F0MzJ4NC5sb2FkKGUsNCksaT1TSU1ELkZsb2F0MzJ4NC5sb2FkKGUsOCksYT1TSU1ELkZsb2F0MzJ4NC5sb2FkKGUsMTIpO3JldHVybiBjPVNJTUQuRmxvYXQzMng0LnNodWZmbGUocixuLDAsMSw0LDUpLHM9U0lNRC5GbG9hdDMyeDQuc2h1ZmZsZShpLGEsMCwxLDQsNSksbz1TSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKGMscywwLDIsNCw2KSxzPVNJTUQuRmxvYXQzMng0LnNodWZmbGUocyxjLDEsMyw1LDcpLGM9U0lNRC5GbG9hdDMyeDQuc2h1ZmZsZShyLG4sMiwzLDYsNyksdT1TSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKGksYSwyLDMsNiw3KSxsPVNJTUQuRmxvYXQzMng0LnNodWZmbGUoYyx1LDAsMiw0LDYpLHU9U0lNRC5GbG9hdDMyeDQuc2h1ZmZsZSh1LGMsMSwzLDUsNyksYz1TSU1ELkZsb2F0MzJ4NC5tdWwobCx1KSxjPVNJTUQuRmxvYXQzMng0LnN3aXp6bGUoYywxLDAsMywyKSxoPVNJTUQuRmxvYXQzMng0Lm11bChzLGMpLGY9U0lNRC5GbG9hdDMyeDQubXVsKG8sYyksYz1TSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGMsMiwzLDAsMSksaD1TSU1ELkZsb2F0MzJ4NC5zdWIoU0lNRC5GbG9hdDMyeDQubXVsKHMsYyksaCksZj1TSU1ELkZsb2F0MzJ4NC5zdWIoU0lNRC5GbG9hdDMyeDQubXVsKG8sYyksZiksZj1TSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGYsMiwzLDAsMSksYz1TSU1ELkZsb2F0MzJ4NC5tdWwocyxsKSxjPVNJTUQuRmxvYXQzMng0LnN3aXp6bGUoYywxLDAsMywyKSxoPVNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwodSxjKSxoKSxwPVNJTUQuRmxvYXQzMng0Lm11bChvLGMpLGM9U0lNRC5GbG9hdDMyeDQuc3dpenpsZShjLDIsMywwLDEpLGg9U0lNRC5GbG9hdDMyeDQuc3ViKGgsU0lNRC5GbG9hdDMyeDQubXVsKHUsYykpLHA9U0lNRC5GbG9hdDMyeDQuc3ViKFNJTUQuRmxvYXQzMng0Lm11bChvLGMpLHApLHA9U0lNRC5GbG9hdDMyeDQuc3dpenpsZShwLDIsMywwLDEpLGM9U0lNRC5GbG9hdDMyeDQubXVsKFNJTUQuRmxvYXQzMng0LnN3aXp6bGUocywyLDMsMCwxKSx1KSxjPVNJTUQuRmxvYXQzMng0LnN3aXp6bGUoYywxLDAsMywyKSxsPVNJTUQuRmxvYXQzMng0LnN3aXp6bGUobCwyLDMsMCwxKSxoPVNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwobCxjKSxoKSxkPVNJTUQuRmxvYXQzMng0Lm11bChvLGMpLGM9U0lNRC5GbG9hdDMyeDQuc3dpenpsZShjLDIsMywwLDEpLGg9U0lNRC5GbG9hdDMyeDQuc3ViKGgsU0lNRC5GbG9hdDMyeDQubXVsKGwsYykpLGQ9U0lNRC5GbG9hdDMyeDQuc3ViKFNJTUQuRmxvYXQzMng0Lm11bChvLGMpLGQpLGQ9U0lNRC5GbG9hdDMyeDQuc3dpenpsZShkLDIsMywwLDEpLGM9U0lNRC5GbG9hdDMyeDQubXVsKG8scyksYz1TSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGMsMSwwLDMsMiksZD1TSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKHUsYyksZCkscD1TSU1ELkZsb2F0MzJ4NC5zdWIoU0lNRC5GbG9hdDMyeDQubXVsKGwsYykscCksYz1TSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGMsMiwzLDAsMSksZD1TSU1ELkZsb2F0MzJ4NC5zdWIoU0lNRC5GbG9hdDMyeDQubXVsKHUsYyksZCkscD1TSU1ELkZsb2F0MzJ4NC5zdWIocCxTSU1ELkZsb2F0MzJ4NC5tdWwobCxjKSksYz1TSU1ELkZsb2F0MzJ4NC5tdWwobyx1KSxjPVNJTUQuRmxvYXQzMng0LnN3aXp6bGUoYywxLDAsMywyKSxmPVNJTUQuRmxvYXQzMng0LnN1YihmLFNJTUQuRmxvYXQzMng0Lm11bChsLGMpKSxkPVNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwocyxjKSxkKSxjPVNJTUQuRmxvYXQzMng0LnN3aXp6bGUoYywyLDMsMCwxKSxmPVNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwobCxjKSxmKSxkPVNJTUQuRmxvYXQzMng0LnN1YihkLFNJTUQuRmxvYXQzMng0Lm11bChzLGMpKSxjPVNJTUQuRmxvYXQzMng0Lm11bChvLGwpLGM9U0lNRC5GbG9hdDMyeDQuc3dpenpsZShjLDEsMCwzLDIpLGY9U0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bCh1LGMpLGYpLHA9U0lNRC5GbG9hdDMyeDQuc3ViKHAsU0lNRC5GbG9hdDMyeDQubXVsKHMsYykpLGM9U0lNRC5GbG9hdDMyeDQuc3dpenpsZShjLDIsMywwLDEpLGY9U0lNRC5GbG9hdDMyeDQuc3ViKGYsU0lNRC5GbG9hdDMyeDQubXVsKHUsYykpLHA9U0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChzLGMpLHApLFNJTUQuRmxvYXQzMng0LnN0b3JlKHQsMCxoKSxTSU1ELkZsb2F0MzJ4NC5zdG9yZSh0LDQsZiksU0lNRC5GbG9hdDMyeDQuc3RvcmUodCw4LGQpLFNJTUQuRmxvYXQzMng0LnN0b3JlKHQsMTIscCksdH0saS5hZGpvaW50PW4uVVNFX1NJTUQ/aS5TSU1ELmFkam9pbnQ6aS5zY2FsYXIuYWRqb2ludCxpLmRldGVybWluYW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0scj10WzFdLG49dFsyXSxpPXRbM10sYT10WzRdLG89dFs1XSxzPXRbNl0sbD10WzddLHU9dFs4XSxjPXRbOV0saD10WzEwXSxmPXRbMTFdLGQ9dFsxMl0scD10WzEzXSxnPXRbMTRdLG09dFsxNV0sdj1lKm8tciphLHk9ZSpzLW4qYSx4PWUqbC1pKmEsYj1yKnMtbipvLF89cipsLWkqbyx3PW4qbC1pKnMsTT11KnAtYypkLEE9dSpnLWgqZCxrPXUqbS1mKmQsVD1jKmctaCpwLEU9YyptLWYqcCxTPWgqbS1mKmc7cmV0dXJuIHYqUy15KkUreCpUK2Iqay1fKkErdypNfSxpLlNJTUQubXVsdGlwbHk9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPVNJTUQuRmxvYXQzMng0LmxvYWQoZSwwKSxpPVNJTUQuRmxvYXQzMng0LmxvYWQoZSw0KSxhPVNJTUQuRmxvYXQzMng0LmxvYWQoZSw4KSxvPVNJTUQuRmxvYXQzMng0LmxvYWQoZSwxMikscz1TSU1ELkZsb2F0MzJ4NC5sb2FkKHIsMCksbD1TSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKFNJTUQuRmxvYXQzMng0LnN3aXp6bGUocywwLDAsMCwwKSxuKSxTSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKFNJTUQuRmxvYXQzMng0LnN3aXp6bGUocywxLDEsMSwxKSxpKSxTSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKFNJTUQuRmxvYXQzMng0LnN3aXp6bGUocywyLDIsMiwyKSxhKSxTSU1ELkZsb2F0MzJ4NC5tdWwoU0lNRC5GbG9hdDMyeDQuc3dpenpsZShzLDMsMywzLDMpLG8pKSkpO1NJTUQuRmxvYXQzMng0LnN0b3JlKHQsMCxsKTt2YXIgdT1TSU1ELkZsb2F0MzJ4NC5sb2FkKHIsNCksYz1TSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKFNJTUQuRmxvYXQzMng0LnN3aXp6bGUodSwwLDAsMCwwKSxuKSxTSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKFNJTUQuRmxvYXQzMng0LnN3aXp6bGUodSwxLDEsMSwxKSxpKSxTSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKFNJTUQuRmxvYXQzMng0LnN3aXp6bGUodSwyLDIsMiwyKSxhKSxTSU1ELkZsb2F0MzJ4NC5tdWwoU0lNRC5GbG9hdDMyeDQuc3dpenpsZSh1LDMsMywzLDMpLG8pKSkpO1NJTUQuRmxvYXQzMng0LnN0b3JlKHQsNCxjKTt2YXIgaD1TSU1ELkZsb2F0MzJ4NC5sb2FkKHIsOCksZj1TSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKFNJTUQuRmxvYXQzMng0LnN3aXp6bGUoaCwwLDAsMCwwKSxuKSxTSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKFNJTUQuRmxvYXQzMng0LnN3aXp6bGUoaCwxLDEsMSwxKSxpKSxTSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKFNJTUQuRmxvYXQzMng0LnN3aXp6bGUoaCwyLDIsMiwyKSxhKSxTSU1ELkZsb2F0MzJ4NC5tdWwoU0lNRC5GbG9hdDMyeDQuc3dpenpsZShoLDMsMywzLDMpLG8pKSkpO1NJTUQuRmxvYXQzMng0LnN0b3JlKHQsOCxmKTt2YXIgZD1TSU1ELkZsb2F0MzJ4NC5sb2FkKHIsMTIpLHA9U0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGQsMCwwLDAsMCksbiksU0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGQsMSwxLDEsMSksaSksU0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGQsMiwyLDIsMiksYSksU0lNRC5GbG9hdDMyeDQubXVsKFNJTUQuRmxvYXQzMng0LnN3aXp6bGUoZCwzLDMsMywzKSxvKSkpKTtyZXR1cm4gU0lNRC5GbG9hdDMyeDQuc3RvcmUodCwxMixwKSx0fSxpLnNjYWxhci5tdWx0aXBseT1mdW5jdGlvbih0LGUscil7dmFyIG49ZVswXSxpPWVbMV0sYT1lWzJdLG89ZVszXSxzPWVbNF0sbD1lWzVdLHU9ZVs2XSxjPWVbN10saD1lWzhdLGY9ZVs5XSxkPWVbMTBdLHA9ZVsxMV0sZz1lWzEyXSxtPWVbMTNdLHY9ZVsxNF0seT1lWzE1XSx4PXJbMF0sYj1yWzFdLF89clsyXSx3PXJbM107cmV0dXJuIHRbMF09eCpuK2IqcytfKmgrdypnLHRbMV09eCppK2IqbCtfKmYrdyptLHRbMl09eCphK2IqdStfKmQrdyp2LHRbM109eCpvK2IqYytfKnArdyp5LHg9cls0XSxiPXJbNV0sXz1yWzZdLHc9cls3XSx0WzRdPXgqbitiKnMrXypoK3cqZyx0WzVdPXgqaStiKmwrXypmK3cqbSx0WzZdPXgqYStiKnUrXypkK3cqdix0WzddPXgqbytiKmMrXypwK3cqeSx4PXJbOF0sYj1yWzldLF89clsxMF0sdz1yWzExXSx0WzhdPXgqbitiKnMrXypoK3cqZyx0WzldPXgqaStiKmwrXypmK3cqbSx0WzEwXT14KmErYip1K18qZCt3KnYsdFsxMV09eCpvK2IqYytfKnArdyp5LHg9clsxMl0sYj1yWzEzXSxfPXJbMTRdLHc9clsxNV0sdFsxMl09eCpuK2IqcytfKmgrdypnLHRbMTNdPXgqaStiKmwrXypmK3cqbSx0WzE0XT14KmErYip1K18qZCt3KnYsdFsxNV09eCpvK2IqYytfKnArdyp5LHR9LGkubXVsdGlwbHk9bi5VU0VfU0lNRD9pLlNJTUQubXVsdGlwbHk6aS5zY2FsYXIubXVsdGlwbHksaS5tdWw9aS5tdWx0aXBseSxpLnNjYWxhci50cmFuc2xhdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuLGksYSxvLHMsbCx1LGMsaCxmLGQscCxnPXJbMF0sbT1yWzFdLHY9clsyXTtyZXR1cm4gZT09PXQ/KHRbMTJdPWVbMF0qZytlWzRdKm0rZVs4XSp2K2VbMTJdLHRbMTNdPWVbMV0qZytlWzVdKm0rZVs5XSp2K2VbMTNdLHRbMTRdPWVbMl0qZytlWzZdKm0rZVsxMF0qditlWzE0XSx0WzE1XT1lWzNdKmcrZVs3XSptK2VbMTFdKnYrZVsxNV0pOihuPWVbMF0saT1lWzFdLGE9ZVsyXSxvPWVbM10scz1lWzRdLGw9ZVs1XSx1PWVbNl0sYz1lWzddLGg9ZVs4XSxmPWVbOV0sZD1lWzEwXSxwPWVbMTFdLHRbMF09bix0WzFdPWksdFsyXT1hLHRbM109byx0WzRdPXMsdFs1XT1sLHRbNl09dSx0WzddPWMsdFs4XT1oLHRbOV09Zix0WzEwXT1kLHRbMTFdPXAsdFsxMl09bipnK3MqbStoKnYrZVsxMl0sdFsxM109aSpnK2wqbStmKnYrZVsxM10sdFsxNF09YSpnK3UqbStkKnYrZVsxNF0sdFsxNV09bypnK2MqbStwKnYrZVsxNV0pLHR9LGkuU0lNRC50cmFuc2xhdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPVNJTUQuRmxvYXQzMng0LmxvYWQoZSwwKSxpPVNJTUQuRmxvYXQzMng0LmxvYWQoZSw0KSxhPVNJTUQuRmxvYXQzMng0LmxvYWQoZSw4KSxvPVNJTUQuRmxvYXQzMng0LmxvYWQoZSwxMikscz1TSU1ELkZsb2F0MzJ4NChyWzBdLHJbMV0sclsyXSwwKTtlIT09dCYmKHRbMF09ZVswXSx0WzFdPWVbMV0sdFsyXT1lWzJdLHRbM109ZVszXSx0WzRdPWVbNF0sdFs1XT1lWzVdLHRbNl09ZVs2XSx0WzddPWVbN10sdFs4XT1lWzhdLHRbOV09ZVs5XSx0WzEwXT1lWzEwXSx0WzExXT1lWzExXSksbj1TSU1ELkZsb2F0MzJ4NC5tdWwobixTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHMsMCwwLDAsMCkpLGk9U0lNRC5GbG9hdDMyeDQubXVsKGksU0lNRC5GbG9hdDMyeDQuc3dpenpsZShzLDEsMSwxLDEpKSxhPVNJTUQuRmxvYXQzMng0Lm11bChhLFNJTUQuRmxvYXQzMng0LnN3aXp6bGUocywyLDIsMiwyKSk7dmFyIGw9U0lNRC5GbG9hdDMyeDQuYWRkKG4sU0lNRC5GbG9hdDMyeDQuYWRkKGksU0lNRC5GbG9hdDMyeDQuYWRkKGEsbykpKTtyZXR1cm4gU0lNRC5GbG9hdDMyeDQuc3RvcmUodCwxMixsKSx0fSxpLnRyYW5zbGF0ZT1uLlVTRV9TSU1EP2kuU0lNRC50cmFuc2xhdGU6aS5zY2FsYXIudHJhbnNsYXRlLGkuc2NhbGFyLnNjYWxlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yWzBdLGk9clsxXSxhPXJbMl07cmV0dXJuIHRbMF09ZVswXSpuLHRbMV09ZVsxXSpuLHRbMl09ZVsyXSpuLHRbM109ZVszXSpuLHRbNF09ZVs0XSppLHRbNV09ZVs1XSppLHRbNl09ZVs2XSppLHRbN109ZVs3XSppLHRbOF09ZVs4XSphLHRbOV09ZVs5XSphLHRbMTBdPWVbMTBdKmEsdFsxMV09ZVsxMV0qYSx0WzEyXT1lWzEyXSx0WzEzXT1lWzEzXSx0WzE0XT1lWzE0XSx0WzE1XT1lWzE1XSx0fSxpLlNJTUQuc2NhbGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuLGksYSxvPVNJTUQuRmxvYXQzMng0KHJbMF0sclsxXSxyWzJdLDApO3JldHVybiBuPVNJTUQuRmxvYXQzMng0LmxvYWQoZSwwKSxTSU1ELkZsb2F0MzJ4NC5zdG9yZSh0LDAsU0lNRC5GbG9hdDMyeDQubXVsKG4sU0lNRC5GbG9hdDMyeDQuc3dpenpsZShvLDAsMCwwLDApKSksaT1TSU1ELkZsb2F0MzJ4NC5sb2FkKGUsNCksU0lNRC5GbG9hdDMyeDQuc3RvcmUodCw0LFNJTUQuRmxvYXQzMng0Lm11bChpLFNJTUQuRmxvYXQzMng0LnN3aXp6bGUobywxLDEsMSwxKSkpLGE9U0lNRC5GbG9hdDMyeDQubG9hZChlLDgpLFNJTUQuRmxvYXQzMng0LnN0b3JlKHQsOCxTSU1ELkZsb2F0MzJ4NC5tdWwoYSxTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKG8sMiwyLDIsMikpKSx0WzEyXT1lWzEyXSx0WzEzXT1lWzEzXSx0WzE0XT1lWzE0XSx0WzE1XT1lWzE1XSx0fSxpLnNjYWxlPW4uVVNFX1NJTUQ/aS5TSU1ELnNjYWxlOmkuc2NhbGFyLnNjYWxlLGkucm90YXRlPWZ1bmN0aW9uKHQsZSxyLGkpe3ZhciBhLG8scyxsLHUsYyxoLGYsZCxwLGcsbSx2LHkseCxiLF8sdyxNLEEsayxULEUsUyxMPWlbMF0sej1pWzFdLEM9aVsyXSxJPU1hdGguc3FydChMKkwreip6K0MqQyk7cmV0dXJuIE1hdGguYWJzKEkpPG4uRVBTSUxPTj9udWxsOihJPTEvSSxMKj1JLHoqPUksQyo9SSxhPU1hdGguc2luKHIpLG89TWF0aC5jb3Mocikscz0xLW8sbD1lWzBdLHU9ZVsxXSxjPWVbMl0saD1lWzNdLGY9ZVs0XSxkPWVbNV0scD1lWzZdLGc9ZVs3XSxtPWVbOF0sdj1lWzldLHk9ZVsxMF0seD1lWzExXSxiPUwqTCpzK28sXz16KkwqcytDKmEsdz1DKkwqcy16KmEsTT1MKnoqcy1DKmEsQT16KnoqcytvLGs9Qyp6KnMrTCphLFQ9TCpDKnMreiphLEU9eipDKnMtTCphLFM9QypDKnMrbyx0WzBdPWwqYitmKl8rbSp3LHRbMV09dSpiK2QqXyt2KncsdFsyXT1jKmIrcCpfK3kqdyx0WzNdPWgqYitnKl8reCp3LHRbNF09bCpNK2YqQSttKmssdFs1XT11Kk0rZCpBK3Yqayx0WzZdPWMqTStwKkEreSprLHRbN109aCpNK2cqQSt4KmssdFs4XT1sKlQrZipFK20qUyx0WzldPXUqVCtkKkUrdipTLHRbMTBdPWMqVCtwKkUreSpTLHRbMTFdPWgqVCtnKkUreCpTLGUhPT10JiYodFsxMl09ZVsxMl0sdFsxM109ZVsxM10sdFsxNF09ZVsxNF0sdFsxNV09ZVsxNV0pLHQpfSxpLnNjYWxhci5yb3RhdGVYPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1NYXRoLnNpbihyKSxpPU1hdGguY29zKHIpLGE9ZVs0XSxvPWVbNV0scz1lWzZdLGw9ZVs3XSx1PWVbOF0sYz1lWzldLGg9ZVsxMF0sZj1lWzExXTtyZXR1cm4gZSE9PXQmJih0WzBdPWVbMF0sdFsxXT1lWzFdLHRbMl09ZVsyXSx0WzNdPWVbM10sdFsxMl09ZVsxMl0sdFsxM109ZVsxM10sdFsxNF09ZVsxNF0sdFsxNV09ZVsxNV0pLHRbNF09YSppK3Uqbix0WzVdPW8qaStjKm4sdFs2XT1zKmkraCpuLHRbN109bCppK2Yqbix0WzhdPXUqaS1hKm4sdFs5XT1jKmktbypuLHRbMTBdPWgqaS1zKm4sdFsxMV09ZippLWwqbix0fSxpLlNJTUQucm90YXRlWD1mdW5jdGlvbih0LGUscil7dmFyIG49U0lNRC5GbG9hdDMyeDQuc3BsYXQoTWF0aC5zaW4ocikpLGk9U0lNRC5GbG9hdDMyeDQuc3BsYXQoTWF0aC5jb3MocikpO2UhPT10JiYodFswXT1lWzBdLHRbMV09ZVsxXSx0WzJdPWVbMl0sdFszXT1lWzNdLHRbMTJdPWVbMTJdLHRbMTNdPWVbMTNdLHRbMTRdPWVbMTRdLHRbMTVdPWVbMTVdKTt2YXIgYT1TSU1ELkZsb2F0MzJ4NC5sb2FkKGUsNCksbz1TSU1ELkZsb2F0MzJ4NC5sb2FkKGUsOCk7cmV0dXJuIFNJTUQuRmxvYXQzMng0LnN0b3JlKHQsNCxTSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKGEsaSksU0lNRC5GbG9hdDMyeDQubXVsKG8sbikpKSxTSU1ELkZsb2F0MzJ4NC5zdG9yZSh0LDgsU0lNRC5GbG9hdDMyeDQuc3ViKFNJTUQuRmxvYXQzMng0Lm11bChvLGkpLFNJTUQuRmxvYXQzMng0Lm11bChhLG4pKSksdH0saS5yb3RhdGVYPW4uVVNFX1NJTUQ/aS5TSU1ELnJvdGF0ZVg6aS5zY2FsYXIucm90YXRlWCxpLnNjYWxhci5yb3RhdGVZPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1NYXRoLnNpbihyKSxpPU1hdGguY29zKHIpLGE9ZVswXSxvPWVbMV0scz1lWzJdLGw9ZVszXSx1PWVbOF0sYz1lWzldLGg9ZVsxMF0sZj1lWzExXTtyZXR1cm4gZSE9PXQmJih0WzRdPWVbNF0sdFs1XT1lWzVdLHRbNl09ZVs2XSx0WzddPWVbN10sdFsxMl09ZVsxMl0sdFsxM109ZVsxM10sdFsxNF09ZVsxNF0sdFsxNV09ZVsxNV0pLHRbMF09YSppLXUqbix0WzFdPW8qaS1jKm4sdFsyXT1zKmktaCpuLHRbM109bCppLWYqbix0WzhdPWEqbit1KmksdFs5XT1vKm4rYyppLHRbMTBdPXMqbitoKmksdFsxMV09bCpuK2YqaSx0fSxpLlNJTUQucm90YXRlWT1mdW5jdGlvbih0LGUscil7dmFyIG49U0lNRC5GbG9hdDMyeDQuc3BsYXQoTWF0aC5zaW4ocikpLGk9U0lNRC5GbG9hdDMyeDQuc3BsYXQoTWF0aC5jb3MocikpO2UhPT10JiYodFs0XT1lWzRdLHRbNV09ZVs1XSx0WzZdPWVbNl0sdFs3XT1lWzddLHRbMTJdPWVbMTJdLHRbMTNdPWVbMTNdLHRbMTRdPWVbMTRdLHRbMTVdPWVbMTVdKTt2YXIgYT1TSU1ELkZsb2F0MzJ4NC5sb2FkKGUsMCksbz1TSU1ELkZsb2F0MzJ4NC5sb2FkKGUsOCk7cmV0dXJuIFNJTUQuRmxvYXQzMng0LnN0b3JlKHQsMCxTSU1ELkZsb2F0MzJ4NC5zdWIoU0lNRC5GbG9hdDMyeDQubXVsKGEsaSksU0lNRC5GbG9hdDMyeDQubXVsKG8sbikpKSxTSU1ELkZsb2F0MzJ4NC5zdG9yZSh0LDgsU0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChhLG4pLFNJTUQuRmxvYXQzMng0Lm11bChvLGkpKSksdH0saS5yb3RhdGVZPW4uVVNFX1NJTUQ/aS5TSU1ELnJvdGF0ZVk6aS5zY2FsYXIucm90YXRlWSxpLnNjYWxhci5yb3RhdGVaPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1NYXRoLnNpbihyKSxpPU1hdGguY29zKHIpLGE9ZVswXSxvPWVbMV0scz1lWzJdLGw9ZVszXSx1PWVbNF0sYz1lWzVdLGg9ZVs2XSxmPWVbN107cmV0dXJuIGUhPT10JiYodFs4XT1lWzhdLHRbOV09ZVs5XSx0WzEwXT1lWzEwXSx0WzExXT1lWzExXSx0WzEyXT1lWzEyXSx0WzEzXT1lWzEzXSx0WzE0XT1lWzE0XSx0WzE1XT1lWzE1XSksdFswXT1hKmkrdSpuLHRbMV09byppK2Mqbix0WzJdPXMqaStoKm4sdFszXT1sKmkrZipuLHRbNF09dSppLWEqbix0WzVdPWMqaS1vKm4sdFs2XT1oKmktcypuLHRbN109ZippLWwqbix0fSxpLlNJTUQucm90YXRlWj1mdW5jdGlvbih0LGUscil7dmFyIG49U0lNRC5GbG9hdDMyeDQuc3BsYXQoTWF0aC5zaW4ocikpLGk9U0lNRC5GbG9hdDMyeDQuc3BsYXQoTWF0aC5jb3MocikpO2UhPT10JiYodFs4XT1lWzhdLHRbOV09ZVs5XSx0WzEwXT1lWzEwXSx0WzExXT1lWzExXSx0WzEyXT1lWzEyXSx0WzEzXT1lWzEzXSx0WzE0XT1lWzE0XSx0WzE1XT1lWzE1XSk7dmFyIGE9U0lNRC5GbG9hdDMyeDQubG9hZChlLDApLG89U0lNRC5GbG9hdDMyeDQubG9hZChlLDQpO3JldHVybiBTSU1ELkZsb2F0MzJ4NC5zdG9yZSh0LDAsU0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChhLGkpLFNJTUQuRmxvYXQzMng0Lm11bChvLG4pKSksU0lNRC5GbG9hdDMyeDQuc3RvcmUodCw0LFNJTUQuRmxvYXQzMng0LnN1YihTSU1ELkZsb2F0MzJ4NC5tdWwobyxpKSxTSU1ELkZsb2F0MzJ4NC5tdWwoYSxuKSkpLHR9LGkucm90YXRlWj1uLlVTRV9TSU1EP2kuU0lNRC5yb3RhdGVaOmkuc2NhbGFyLnJvdGF0ZVosaS5mcm9tVHJhbnNsYXRpb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MCx0WzVdPTEsdFs2XT0wLHRbN109MCx0WzhdPTAsdFs5XT0wLHRbMTBdPTEsdFsxMV09MCx0WzEyXT1lWzBdLHRbMTNdPWVbMV0sdFsxNF09ZVsyXSx0WzE1XT0xLHR9LGkuZnJvbVNjYWxpbmc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT1lWzBdLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MCx0WzVdPWVbMV0sdFs2XT0wLHRbN109MCx0WzhdPTAsdFs5XT0wLHRbMTBdPWVbMl0sdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCx0WzE1XT0xLHR9LGkuZnJvbVJvdGF0aW9uPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaSxhLG8scz1yWzBdLGw9clsxXSx1PXJbMl0sYz1NYXRoLnNxcnQocypzK2wqbCt1KnUpO3JldHVybiBNYXRoLmFicyhjKTxuLkVQU0lMT04/bnVsbDooYz0xL2Mscyo9YyxsKj1jLHUqPWMsaT1NYXRoLnNpbihlKSxhPU1hdGguY29zKGUpLG89MS1hLHRbMF09cypzKm8rYSx0WzFdPWwqcypvK3UqaSx0WzJdPXUqcypvLWwqaSx0WzNdPTAsdFs0XT1zKmwqby11KmksdFs1XT1sKmwqbythLHRbNl09dSpsKm8rcyppLHRbN109MCx0WzhdPXMqdSpvK2wqaSx0WzldPWwqdSpvLXMqaSx0WzEwXT11KnUqbythLHRbMTFdPTAsdFsxMl09MCx0WzEzXT0wLHRbMTRdPTAsdFsxNV09MSx0KX0saS5mcm9tWFJvdGF0aW9uPWZ1bmN0aW9uKHQsZSl7dmFyIHI9TWF0aC5zaW4oZSksbj1NYXRoLmNvcyhlKTtyZXR1cm4gdFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MCx0WzVdPW4sdFs2XT1yLHRbN109MCx0WzhdPTAsdFs5XT0tcix0WzEwXT1uLHRbMTFdPTAsdFsxMl09MCx0WzEzXT0wLHRbMTRdPTAsdFsxNV09MSx0fSxpLmZyb21ZUm90YXRpb249ZnVuY3Rpb24odCxlKXt2YXIgcj1NYXRoLnNpbihlKSxuPU1hdGguY29zKGUpO3JldHVybiB0WzBdPW4sdFsxXT0wLHRbMl09LXIsdFszXT0wLHRbNF09MCx0WzVdPTEsdFs2XT0wLHRbN109MCx0WzhdPXIsdFs5XT0wLHRbMTBdPW4sdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCx0WzE1XT0xLHR9LGkuZnJvbVpSb3RhdGlvbj1mdW5jdGlvbih0LGUpe3ZhciByPU1hdGguc2luKGUpLG49TWF0aC5jb3MoZSk7cmV0dXJuIHRbMF09bix0WzFdPXIsdFsyXT0wLHRbM109MCx0WzRdPS1yLHRbNV09bix0WzZdPTAsdFs3XT0wLHRbOF09MCx0WzldPTAsdFsxMF09MSx0WzExXT0wLHRbMTJdPTAsdFsxM109MCx0WzE0XT0wLHRbMTVdPTEsdH0saS5mcm9tUm90YXRpb25UcmFuc2xhdGlvbj1mdW5jdGlvbih0LGUscil7dmFyIG49ZVswXSxpPWVbMV0sYT1lWzJdLG89ZVszXSxzPW4rbixsPWkraSx1PWErYSxjPW4qcyxoPW4qbCxmPW4qdSxkPWkqbCxwPWkqdSxnPWEqdSxtPW8qcyx2PW8qbCx5PW8qdTtyZXR1cm4gdFswXT0xLShkK2cpLHRbMV09aCt5LHRbMl09Zi12LHRbM109MCx0WzRdPWgteSx0WzVdPTEtKGMrZyksdFs2XT1wK20sdFs3XT0wLHRbOF09Zit2LHRbOV09cC1tLHRbMTBdPTEtKGMrZCksdFsxMV09MCx0WzEyXT1yWzBdLHRbMTNdPXJbMV0sdFsxNF09clsyXSx0WzE1XT0xLHR9LGkuZ2V0VHJhbnNsYXRpb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT1lWzEyXSx0WzFdPWVbMTNdLHRbMl09ZVsxNF0sdH0saS5nZXRSb3RhdGlvbj1mdW5jdGlvbih0LGUpe3ZhciByPWVbMF0rZVs1XStlWzEwXSxuPTA7cmV0dXJuIHI+MD8obj0yKk1hdGguc3FydChyKzEpLHRbM109LjI1Km4sdFswXT0oZVs2XS1lWzldKS9uLHRbMV09KGVbOF0tZVsyXSkvbix0WzJdPShlWzFdLWVbNF0pL24pOmVbMF0+ZVs1XSZlWzBdPmVbMTBdPyhuPTIqTWF0aC5zcXJ0KDErZVswXS1lWzVdLWVbMTBdKSx0WzNdPShlWzZdLWVbOV0pL24sdFswXT0uMjUqbix0WzFdPShlWzFdK2VbNF0pL24sdFsyXT0oZVs4XStlWzJdKS9uKTplWzVdPmVbMTBdPyhuPTIqTWF0aC5zcXJ0KDErZVs1XS1lWzBdLWVbMTBdKSx0WzNdPShlWzhdLWVbMl0pL24sdFswXT0oZVsxXStlWzRdKS9uLHRbMV09LjI1Km4sdFsyXT0oZVs2XStlWzldKS9uKToobj0yKk1hdGguc3FydCgxK2VbMTBdLWVbMF0tZVs1XSksdFszXT0oZVsxXS1lWzRdKS9uLHRbMF09KGVbOF0rZVsyXSkvbix0WzFdPShlWzZdK2VbOV0pL24sdFsyXT0uMjUqbiksdH0saS5mcm9tUm90YXRpb25UcmFuc2xhdGlvblNjYWxlPWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPWVbMF0sYT1lWzFdLG89ZVsyXSxzPWVbM10sbD1pK2ksdT1hK2EsYz1vK28saD1pKmwsZj1pKnUsZD1pKmMscD1hKnUsZz1hKmMsbT1vKmMsdj1zKmwseT1zKnUseD1zKmMsYj1uWzBdLF89blsxXSx3PW5bMl07cmV0dXJuIHRbMF09KDEtKHArbSkpKmIsdFsxXT0oZit4KSpiLHRbMl09KGQteSkqYix0WzNdPTAsdFs0XT0oZi14KSpfLHRbNV09KDEtKGgrbSkpKl8sdFs2XT0oZyt2KSpfLHRbN109MCx0WzhdPShkK3kpKncsdFs5XT0oZy12KSp3LHRbMTBdPSgxLShoK3ApKSp3LHRbMTFdPTAsdFsxMl09clswXSx0WzEzXT1yWzFdLHRbMTRdPXJbMl0sdFsxNV09MSx0fSxpLmZyb21Sb3RhdGlvblRyYW5zbGF0aW9uU2NhbGVPcmlnaW49ZnVuY3Rpb24odCxlLHIsbixpKXt2YXIgYT1lWzBdLG89ZVsxXSxzPWVbMl0sbD1lWzNdLHU9YSthLGM9bytvLGg9cytzLGY9YSp1LGQ9YSpjLHA9YSpoLGc9bypjLG09bypoLHY9cypoLHk9bCp1LHg9bCpjLGI9bCpoLF89blswXSx3PW5bMV0sTT1uWzJdLEE9aVswXSxrPWlbMV0sVD1pWzJdO3JldHVybiB0WzBdPSgxLShnK3YpKSpfLHRbMV09KGQrYikqXyx0WzJdPShwLXgpKl8sdFszXT0wLHRbNF09KGQtYikqdyx0WzVdPSgxLShmK3YpKSp3LHRbNl09KG0reSkqdyx0WzddPTAsdFs4XT0ocCt4KSpNLHRbOV09KG0teSkqTSx0WzEwXT0oMS0oZitnKSkqTSx0WzExXT0wLHRbMTJdPXJbMF0rQS0odFswXSpBK3RbNF0qayt0WzhdKlQpLHRbMTNdPXJbMV0ray0odFsxXSpBK3RbNV0qayt0WzldKlQpLHRbMTRdPXJbMl0rVC0odFsyXSpBK3RbNl0qayt0WzEwXSpUKSx0WzE1XT0xLHR9LGkuZnJvbVF1YXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1lWzBdLG49ZVsxXSxpPWVbMl0sYT1lWzNdLG89cityLHM9bituLGw9aStpLHU9cipvLGM9bipvLGg9bipzLGY9aSpvLGQ9aSpzLHA9aSpsLGc9YSpvLG09YSpzLHY9YSpsO3JldHVybiB0WzBdPTEtaC1wLHRbMV09Yyt2LHRbMl09Zi1tLHRbM109MCx0WzRdPWMtdix0WzVdPTEtdS1wLHRbNl09ZCtnLHRbN109MCx0WzhdPWYrbSx0WzldPWQtZyx0WzEwXT0xLXUtaCx0WzExXT0wLHRbMTJdPTAsdFsxM109MCx0WzE0XT0wLHRbMTVdPTEsdH0saS5mcnVzdHVtPWZ1bmN0aW9uKHQsZSxyLG4saSxhLG8pe3ZhciBzPTEvKHItZSksbD0xLyhpLW4pLHU9MS8oYS1vKTtyZXR1cm4gdFswXT0yKmEqcyx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT0yKmEqbCx0WzZdPTAsdFs3XT0wLHRbOF09KHIrZSkqcyx0WzldPShpK24pKmwsdFsxMF09KG8rYSkqdSx0WzExXT0tMSx0WzEyXT0wLHRbMTNdPTAsdFsxNF09byphKjIqdSx0WzE1XT0wLHR9LGkucGVyc3BlY3RpdmU9ZnVuY3Rpb24odCxlLHIsbixpKXt2YXIgYT0xL01hdGgudGFuKGUvMiksbz0xLyhuLWkpO3JldHVybiB0WzBdPWEvcix0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT1hLHRbNl09MCx0WzddPTAsdFs4XT0wLHRbOV09MCx0WzEwXT0oaStuKSpvLHRbMTFdPS0xLHRbMTJdPTAsdFsxM109MCx0WzE0XT0yKmkqbipvLHRbMTVdPTAsdH0saS5wZXJzcGVjdGl2ZUZyb21GaWVsZE9mVmlldz1mdW5jdGlvbih0LGUscixuKXt2YXIgaT1NYXRoLnRhbihlLnVwRGVncmVlcypNYXRoLlBJLzE4MCksYT1NYXRoLnRhbihlLmRvd25EZWdyZWVzKk1hdGguUEkvMTgwKSxvPU1hdGgudGFuKGUubGVmdERlZ3JlZXMqTWF0aC5QSS8xODApLHM9TWF0aC50YW4oZS5yaWdodERlZ3JlZXMqTWF0aC5QSS8xODApLGw9Mi8obytzKSx1PTIvKGkrYSk7cmV0dXJuIHRbMF09bCx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT11LHRbNl09MCx0WzddPTAsdFs4XT0tKChvLXMpKmwqLjUpLHRbOV09KGktYSkqdSouNSx0WzEwXT1uLyhyLW4pLHRbMTFdPS0xLHRbMTJdPTAsdFsxM109MCx0WzE0XT1uKnIvKHItbiksdFsxNV09MCx0fSxpLm9ydGhvPWZ1bmN0aW9uKHQsZSxyLG4saSxhLG8pe3ZhciBzPTEvKGUtciksbD0xLyhuLWkpLHU9MS8oYS1vKTtyZXR1cm4gdFswXT0tMipzLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MCx0WzVdPS0yKmwsdFs2XT0wLHRbN109MCx0WzhdPTAsdFs5XT0wLHRbMTBdPTIqdSx0WzExXT0wLHRbMTJdPShlK3IpKnMsdFsxM109KGkrbikqbCx0WzE0XT0obythKSp1LHRbMTVdPTEsdH0saS5sb29rQXQ9ZnVuY3Rpb24odCxlLHIsYSl7dmFyIG8scyxsLHUsYyxoLGYsZCxwLGcsbT1lWzBdLHY9ZVsxXSx5PWVbMl0seD1hWzBdLGI9YVsxXSxfPWFbMl0sdz1yWzBdLE09clsxXSxBPXJbMl07cmV0dXJuIE1hdGguYWJzKG0tdyk8bi5FUFNJTE9OJiZNYXRoLmFicyh2LU0pPG4uRVBTSUxPTiYmTWF0aC5hYnMoeS1BKTxuLkVQU0lMT04/aS5pZGVudGl0eSh0KTooZj1tLXcsZD12LU0scD15LUEsZz0xL01hdGguc3FydChmKmYrZCpkK3AqcCksZio9ZyxkKj1nLHAqPWcsbz1iKnAtXypkLHM9XypmLXgqcCxsPXgqZC1iKmYsZz1NYXRoLnNxcnQobypvK3MqcytsKmwpLGc/KGc9MS9nLG8qPWcscyo9ZyxsKj1nKToobz0wLHM9MCxsPTApLHU9ZCpsLXAqcyxjPXAqby1mKmwsaD1mKnMtZCpvLGc9TWF0aC5zcXJ0KHUqdStjKmMraCpoKSxnPyhnPTEvZyx1Kj1nLGMqPWcsaCo9Zyk6KHU9MCxjPTAsaD0wKSx0WzBdPW8sdFsxXT11LHRbMl09Zix0WzNdPTAsdFs0XT1zLHRbNV09Yyx0WzZdPWQsdFs3XT0wLHRbOF09bCx0WzldPWgsdFsxMF09cCx0WzExXT0wLHRbMTJdPS0obyptK3MqditsKnkpLHRbMTNdPS0odSptK2MqditoKnkpLHRbMTRdPS0oZiptK2QqditwKnkpLHRbMTVdPTEsdCl9LGkuc3RyPWZ1bmN0aW9uKHQpe3JldHVybiJtYXQ0KCIrdFswXSsiLCAiK3RbMV0rIiwgIit0WzJdKyIsICIrdFszXSsiLCAiK3RbNF0rIiwgIit0WzVdKyIsICIrdFs2XSsiLCAiK3RbN10rIiwgIit0WzhdKyIsICIrdFs5XSsiLCAiK3RbMTBdKyIsICIrdFsxMV0rIiwgIit0WzEyXSsiLCAiK3RbMTNdKyIsICIrdFsxNF0rIiwgIit0WzE1XSsiKSI7Cn0saS5mcm9iPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoTWF0aC5wb3codFswXSwyKStNYXRoLnBvdyh0WzFdLDIpK01hdGgucG93KHRbMl0sMikrTWF0aC5wb3codFszXSwyKStNYXRoLnBvdyh0WzRdLDIpK01hdGgucG93KHRbNV0sMikrTWF0aC5wb3codFs2XSwyKStNYXRoLnBvdyh0WzddLDIpK01hdGgucG93KHRbOF0sMikrTWF0aC5wb3codFs5XSwyKStNYXRoLnBvdyh0WzEwXSwyKStNYXRoLnBvdyh0WzExXSwyKStNYXRoLnBvdyh0WzEyXSwyKStNYXRoLnBvdyh0WzEzXSwyKStNYXRoLnBvdyh0WzE0XSwyKStNYXRoLnBvdyh0WzE1XSwyKSl9LGkuYWRkPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFswXT1lWzBdK3JbMF0sdFsxXT1lWzFdK3JbMV0sdFsyXT1lWzJdK3JbMl0sdFszXT1lWzNdK3JbM10sdFs0XT1lWzRdK3JbNF0sdFs1XT1lWzVdK3JbNV0sdFs2XT1lWzZdK3JbNl0sdFs3XT1lWzddK3JbN10sdFs4XT1lWzhdK3JbOF0sdFs5XT1lWzldK3JbOV0sdFsxMF09ZVsxMF0rclsxMF0sdFsxMV09ZVsxMV0rclsxMV0sdFsxMl09ZVsxMl0rclsxMl0sdFsxM109ZVsxM10rclsxM10sdFsxNF09ZVsxNF0rclsxNF0sdFsxNV09ZVsxNV0rclsxNV0sdH0saS5zdWJ0cmFjdD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09ZVswXS1yWzBdLHRbMV09ZVsxXS1yWzFdLHRbMl09ZVsyXS1yWzJdLHRbM109ZVszXS1yWzNdLHRbNF09ZVs0XS1yWzRdLHRbNV09ZVs1XS1yWzVdLHRbNl09ZVs2XS1yWzZdLHRbN109ZVs3XS1yWzddLHRbOF09ZVs4XS1yWzhdLHRbOV09ZVs5XS1yWzldLHRbMTBdPWVbMTBdLXJbMTBdLHRbMTFdPWVbMTFdLXJbMTFdLHRbMTJdPWVbMTJdLXJbMTJdLHRbMTNdPWVbMTNdLXJbMTNdLHRbMTRdPWVbMTRdLXJbMTRdLHRbMTVdPWVbMTVdLXJbMTVdLHR9LGkuc3ViPWkuc3VidHJhY3QsaS5tdWx0aXBseVNjYWxhcj1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09ZVswXSpyLHRbMV09ZVsxXSpyLHRbMl09ZVsyXSpyLHRbM109ZVszXSpyLHRbNF09ZVs0XSpyLHRbNV09ZVs1XSpyLHRbNl09ZVs2XSpyLHRbN109ZVs3XSpyLHRbOF09ZVs4XSpyLHRbOV09ZVs5XSpyLHRbMTBdPWVbMTBdKnIsdFsxMV09ZVsxMV0qcix0WzEyXT1lWzEyXSpyLHRbMTNdPWVbMTNdKnIsdFsxNF09ZVsxNF0qcix0WzE1XT1lWzE1XSpyLHR9LGkubXVsdGlwbHlTY2FsYXJBbmRBZGQ9ZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuIHRbMF09ZVswXStyWzBdKm4sdFsxXT1lWzFdK3JbMV0qbix0WzJdPWVbMl0rclsyXSpuLHRbM109ZVszXStyWzNdKm4sdFs0XT1lWzRdK3JbNF0qbix0WzVdPWVbNV0rcls1XSpuLHRbNl09ZVs2XStyWzZdKm4sdFs3XT1lWzddK3JbN10qbix0WzhdPWVbOF0rcls4XSpuLHRbOV09ZVs5XStyWzldKm4sdFsxMF09ZVsxMF0rclsxMF0qbix0WzExXT1lWzExXStyWzExXSpuLHRbMTJdPWVbMTJdK3JbMTJdKm4sdFsxM109ZVsxM10rclsxM10qbix0WzE0XT1lWzE0XStyWzE0XSpuLHRbMTVdPWVbMTVdK3JbMTVdKm4sdH0saS5leGFjdEVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPT09ZVswXSYmdFsxXT09PWVbMV0mJnRbMl09PT1lWzJdJiZ0WzNdPT09ZVszXSYmdFs0XT09PWVbNF0mJnRbNV09PT1lWzVdJiZ0WzZdPT09ZVs2XSYmdFs3XT09PWVbN10mJnRbOF09PT1lWzhdJiZ0WzldPT09ZVs5XSYmdFsxMF09PT1lWzEwXSYmdFsxMV09PT1lWzExXSYmdFsxMl09PT1lWzEyXSYmdFsxM109PT1lWzEzXSYmdFsxNF09PT1lWzE0XSYmdFsxNV09PT1lWzE1XX0saS5lcXVhbHM9ZnVuY3Rpb24odCxlKXt2YXIgcj10WzBdLGk9dFsxXSxhPXRbMl0sbz10WzNdLHM9dFs0XSxsPXRbNV0sdT10WzZdLGM9dFs3XSxoPXRbOF0sZj10WzldLGQ9dFsxMF0scD10WzExXSxnPXRbMTJdLG09dFsxM10sdj10WzE0XSx5PXRbMTVdLHg9ZVswXSxiPWVbMV0sXz1lWzJdLHc9ZVszXSxNPWVbNF0sQT1lWzVdLGs9ZVs2XSxUPWVbN10sRT1lWzhdLFM9ZVs5XSxMPWVbMTBdLHo9ZVsxMV0sQz1lWzEyXSxJPWVbMTNdLFA9ZVsxNF0sRD1lWzE1XTtyZXR1cm4gTWF0aC5hYnMoci14KTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMociksTWF0aC5hYnMoeCkpJiZNYXRoLmFicyhpLWIpPD1uLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhpKSxNYXRoLmFicyhiKSkmJk1hdGguYWJzKGEtXyk8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGEpLE1hdGguYWJzKF8pKSYmTWF0aC5hYnMoby13KTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMobyksTWF0aC5hYnModykpJiZNYXRoLmFicyhzLU0pPD1uLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhzKSxNYXRoLmFicyhNKSkmJk1hdGguYWJzKGwtQSk8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGwpLE1hdGguYWJzKEEpKSYmTWF0aC5hYnModS1rKTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnModSksTWF0aC5hYnMoaykpJiZNYXRoLmFicyhjLVQpPD1uLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhjKSxNYXRoLmFicyhUKSkmJk1hdGguYWJzKGgtRSk8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGgpLE1hdGguYWJzKEUpKSYmTWF0aC5hYnMoZi1TKTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoZiksTWF0aC5hYnMoUykpJiZNYXRoLmFicyhkLUwpPD1uLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhkKSxNYXRoLmFicyhMKSkmJk1hdGguYWJzKHAteik8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHApLE1hdGguYWJzKHopKSYmTWF0aC5hYnMoZy1DKTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoZyksTWF0aC5hYnMoQykpJiZNYXRoLmFicyhtLUkpPD1uLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhtKSxNYXRoLmFicyhJKSkmJk1hdGguYWJzKHYtUCk8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHYpLE1hdGguYWJzKFApKSYmTWF0aC5hYnMoeS1EKTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoeSksTWF0aC5hYnMoRCkpfSxlLmV4cG9ydHM9aX0seyIuL2NvbW1vbi5qcyI6MTYyfV0sMTY3OltmdW5jdGlvbih0LGUscil7dmFyIG49dCgiLi9jb21tb24uanMiKSxpPXQoIi4vbWF0My5qcyIpLGE9dCgiLi92ZWMzLmpzIiksbz10KCIuL3ZlYzQuanMiKSxzPXt9O3MuY3JlYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IG4uQVJSQVlfVFlQRSg0KTtyZXR1cm4gdFswXT0wLHRbMV09MCx0WzJdPTAsdFszXT0xLHR9LHMucm90YXRpb25Ubz1mdW5jdGlvbigpe3ZhciB0PWEuY3JlYXRlKCksZT1hLmZyb21WYWx1ZXMoMSwwLDApLHI9YS5mcm9tVmFsdWVzKDAsMSwwKTtyZXR1cm4gZnVuY3Rpb24obixpLG8pe3ZhciBsPWEuZG90KGksbyk7cmV0dXJuIGw8LS45OTk5OTk/KGEuY3Jvc3ModCxlLGkpLGEubGVuZ3RoKHQpPDFlLTYmJmEuY3Jvc3ModCxyLGkpLGEubm9ybWFsaXplKHQsdCkscy5zZXRBeGlzQW5nbGUobix0LE1hdGguUEkpLG4pOmw+Ljk5OTk5OT8oblswXT0wLG5bMV09MCxuWzJdPTAsblszXT0xLG4pOihhLmNyb3NzKHQsaSxvKSxuWzBdPXRbMF0sblsxXT10WzFdLG5bMl09dFsyXSxuWzNdPTErbCxzLm5vcm1hbGl6ZShuLG4pKX19KCkscy5zZXRBeGVzPWZ1bmN0aW9uKCl7dmFyIHQ9aS5jcmVhdGUoKTtyZXR1cm4gZnVuY3Rpb24oZSxyLG4saSl7cmV0dXJuIHRbMF09blswXSx0WzNdPW5bMV0sdFs2XT1uWzJdLHRbMV09aVswXSx0WzRdPWlbMV0sdFs3XT1pWzJdLHRbMl09LXJbMF0sdFs1XT0tclsxXSx0WzhdPS1yWzJdLHMubm9ybWFsaXplKGUscy5mcm9tTWF0MyhlLHQpKX19KCkscy5jbG9uZT1vLmNsb25lLHMuZnJvbVZhbHVlcz1vLmZyb21WYWx1ZXMscy5jb3B5PW8uY29weSxzLnNldD1vLnNldCxzLmlkZW50aXR5PWZ1bmN0aW9uKHQpe3JldHVybiB0WzBdPTAsdFsxXT0wLHRbMl09MCx0WzNdPTEsdH0scy5zZXRBeGlzQW5nbGU9ZnVuY3Rpb24odCxlLHIpe3I9LjUqcjt2YXIgbj1NYXRoLnNpbihyKTtyZXR1cm4gdFswXT1uKmVbMF0sdFsxXT1uKmVbMV0sdFsyXT1uKmVbMl0sdFszXT1NYXRoLmNvcyhyKSx0fSxzLmdldEF4aXNBbmdsZT1mdW5jdGlvbih0LGUpe3ZhciByPTIqTWF0aC5hY29zKGVbM10pLG49TWF0aC5zaW4oci8yKTtyZXR1cm4gMCE9bj8odFswXT1lWzBdL24sdFsxXT1lWzFdL24sdFsyXT1lWzJdL24pOih0WzBdPTEsdFsxXT0wLHRbMl09MCkscn0scy5hZGQ9by5hZGQscy5tdWx0aXBseT1mdW5jdGlvbih0LGUscil7dmFyIG49ZVswXSxpPWVbMV0sYT1lWzJdLG89ZVszXSxzPXJbMF0sbD1yWzFdLHU9clsyXSxjPXJbM107cmV0dXJuIHRbMF09bipjK28qcytpKnUtYSpsLHRbMV09aSpjK28qbCthKnMtbip1LHRbMl09YSpjK28qdStuKmwtaSpzLHRbM109bypjLW4qcy1pKmwtYSp1LHR9LHMubXVsPXMubXVsdGlwbHkscy5zY2FsZT1vLnNjYWxlLHMucm90YXRlWD1mdW5jdGlvbih0LGUscil7cio9LjU7dmFyIG49ZVswXSxpPWVbMV0sYT1lWzJdLG89ZVszXSxzPU1hdGguc2luKHIpLGw9TWF0aC5jb3Mocik7cmV0dXJuIHRbMF09bipsK28qcyx0WzFdPWkqbCthKnMsdFsyXT1hKmwtaSpzLHRbM109bypsLW4qcyx0fSxzLnJvdGF0ZVk9ZnVuY3Rpb24odCxlLHIpe3IqPS41O3ZhciBuPWVbMF0saT1lWzFdLGE9ZVsyXSxvPWVbM10scz1NYXRoLnNpbihyKSxsPU1hdGguY29zKHIpO3JldHVybiB0WzBdPW4qbC1hKnMsdFsxXT1pKmwrbypzLHRbMl09YSpsK24qcyx0WzNdPW8qbC1pKnMsdH0scy5yb3RhdGVaPWZ1bmN0aW9uKHQsZSxyKXtyKj0uNTt2YXIgbj1lWzBdLGk9ZVsxXSxhPWVbMl0sbz1lWzNdLHM9TWF0aC5zaW4ociksbD1NYXRoLmNvcyhyKTtyZXR1cm4gdFswXT1uKmwraSpzLHRbMV09aSpsLW4qcyx0WzJdPWEqbCtvKnMsdFszXT1vKmwtYSpzLHR9LHMuY2FsY3VsYXRlVz1mdW5jdGlvbih0LGUpe3ZhciByPWVbMF0sbj1lWzFdLGk9ZVsyXTtyZXR1cm4gdFswXT1yLHRbMV09bix0WzJdPWksdFszXT1NYXRoLnNxcnQoTWF0aC5hYnMoMS1yKnItbipuLWkqaSkpLHR9LHMuZG90PW8uZG90LHMubGVycD1vLmxlcnAscy5zbGVycD1mdW5jdGlvbih0LGUscixuKXt2YXIgaSxhLG8scyxsLHU9ZVswXSxjPWVbMV0saD1lWzJdLGY9ZVszXSxkPXJbMF0scD1yWzFdLGc9clsyXSxtPXJbM107cmV0dXJuIGE9dSpkK2MqcCtoKmcrZiptLGE8MCYmKGE9LWEsZD0tZCxwPS1wLGc9LWcsbT0tbSksMS1hPjFlLTY/KGk9TWF0aC5hY29zKGEpLG89TWF0aC5zaW4oaSkscz1NYXRoLnNpbigoMS1uKSppKS9vLGw9TWF0aC5zaW4obippKS9vKToocz0xLW4sbD1uKSx0WzBdPXMqdStsKmQsdFsxXT1zKmMrbCpwLHRbMl09cypoK2wqZyx0WzNdPXMqZitsKm0sdH0scy5zcWxlcnA9ZnVuY3Rpb24oKXt2YXIgdD1zLmNyZWF0ZSgpLGU9cy5jcmVhdGUoKTtyZXR1cm4gZnVuY3Rpb24ocixuLGksYSxvLGwpe3JldHVybiBzLnNsZXJwKHQsbixvLGwpLHMuc2xlcnAoZSxpLGEsbCkscy5zbGVycChyLHQsZSwyKmwqKDEtbCkpLHJ9fSgpLHMuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZVswXSxuPWVbMV0saT1lWzJdLGE9ZVszXSxvPXIqcituKm4raSppK2EqYSxzPW8/MS9vOjA7cmV0dXJuIHRbMF09LXIqcyx0WzFdPS1uKnMsdFsyXT0taSpzLHRbM109YSpzLHR9LHMuY29uanVnYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09LWVbMF0sdFsxXT0tZVsxXSx0WzJdPS1lWzJdLHRbM109ZVszXSx0fSxzLmxlbmd0aD1vLmxlbmd0aCxzLmxlbj1zLmxlbmd0aCxzLnNxdWFyZWRMZW5ndGg9by5zcXVhcmVkTGVuZ3RoLHMuc3FyTGVuPXMuc3F1YXJlZExlbmd0aCxzLm5vcm1hbGl6ZT1vLm5vcm1hbGl6ZSxzLmZyb21NYXQzPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbj1lWzBdK2VbNF0rZVs4XTtpZihuPjApcj1NYXRoLnNxcnQobisxKSx0WzNdPS41KnIscj0uNS9yLHRbMF09KGVbNV0tZVs3XSkqcix0WzFdPShlWzZdLWVbMl0pKnIsdFsyXT0oZVsxXS1lWzNdKSpyO2Vsc2V7dmFyIGk9MDtlWzRdPmVbMF0mJihpPTEpLGVbOF0+ZVszKmkraV0mJihpPTIpO3ZhciBhPShpKzEpJTMsbz0oaSsyKSUzO3I9TWF0aC5zcXJ0KGVbMyppK2ldLWVbMyphK2FdLWVbMypvK29dKzEpLHRbaV09LjUqcixyPS41L3IsdFszXT0oZVszKmErb10tZVszKm8rYV0pKnIsdFthXT0oZVszKmEraV0rZVszKmkrYV0pKnIsdFtvXT0oZVszKm8raV0rZVszKmkrb10pKnJ9cmV0dXJuIHR9LHMuc3RyPWZ1bmN0aW9uKHQpe3JldHVybiJxdWF0KCIrdFswXSsiLCAiK3RbMV0rIiwgIit0WzJdKyIsICIrdFszXSsiKSJ9LHMuZXhhY3RFcXVhbHM9by5leGFjdEVxdWFscyxzLmVxdWFscz1vLmVxdWFscyxlLmV4cG9ydHM9c30seyIuL2NvbW1vbi5qcyI6MTYyLCIuL21hdDMuanMiOjE2NSwiLi92ZWMzLmpzIjoxNjksIi4vdmVjNC5qcyI6MTcwfV0sMTY4OltmdW5jdGlvbih0LGUscil7dmFyIG49dCgiLi9jb21tb24uanMiKSxpPXt9O2kuY3JlYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IG4uQVJSQVlfVFlQRSgyKTtyZXR1cm4gdFswXT0wLHRbMV09MCx0fSxpLmNsb25lPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBuLkFSUkFZX1RZUEUoMik7cmV0dXJuIGVbMF09dFswXSxlWzFdPXRbMV0sZX0saS5mcm9tVmFsdWVzPWZ1bmN0aW9uKHQsZSl7dmFyIHI9bmV3IG4uQVJSQVlfVFlQRSgyKTtyZXR1cm4gclswXT10LHJbMV09ZSxyfSxpLmNvcHk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT1lWzBdLHRbMV09ZVsxXSx0fSxpLnNldD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09ZSx0WzFdPXIsdH0saS5hZGQ9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0WzBdPWVbMF0rclswXSx0WzFdPWVbMV0rclsxXSx0fSxpLnN1YnRyYWN0PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFswXT1lWzBdLXJbMF0sdFsxXT1lWzFdLXJbMV0sdH0saS5zdWI9aS5zdWJ0cmFjdCxpLm11bHRpcGx5PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFswXT1lWzBdKnJbMF0sdFsxXT1lWzFdKnJbMV0sdH0saS5tdWw9aS5tdWx0aXBseSxpLmRpdmlkZT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09ZVswXS9yWzBdLHRbMV09ZVsxXS9yWzFdLHR9LGkuZGl2PWkuZGl2aWRlLGkuY2VpbD1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPU1hdGguY2VpbChlWzBdKSx0WzFdPU1hdGguY2VpbChlWzFdKSx0fSxpLmZsb29yPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09TWF0aC5mbG9vcihlWzBdKSx0WzFdPU1hdGguZmxvb3IoZVsxXSksdH0saS5taW49ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0WzBdPU1hdGgubWluKGVbMF0sclswXSksdFsxXT1NYXRoLm1pbihlWzFdLHJbMV0pLHR9LGkubWF4PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFswXT1NYXRoLm1heChlWzBdLHJbMF0pLHRbMV09TWF0aC5tYXgoZVsxXSxyWzFdKSx0fSxpLnJvdW5kPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09TWF0aC5yb3VuZChlWzBdKSx0WzFdPU1hdGgucm91bmQoZVsxXSksdH0saS5zY2FsZT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09ZVswXSpyLHRbMV09ZVsxXSpyLHR9LGkuc2NhbGVBbmRBZGQ9ZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuIHRbMF09ZVswXStyWzBdKm4sdFsxXT1lWzFdK3JbMV0qbix0fSxpLmRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZVswXS10WzBdLG49ZVsxXS10WzFdO3JldHVybiBNYXRoLnNxcnQocipyK24qbil9LGkuZGlzdD1pLmRpc3RhbmNlLGkuc3F1YXJlZERpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZVswXS10WzBdLG49ZVsxXS10WzFdO3JldHVybiByKnIrbipufSxpLnNxckRpc3Q9aS5zcXVhcmVkRGlzdGFuY2UsaS5sZW5ndGg9ZnVuY3Rpb24odCl7dmFyIGU9dFswXSxyPXRbMV07cmV0dXJuIE1hdGguc3FydChlKmUrcipyKX0saS5sZW49aS5sZW5ndGgsaS5zcXVhcmVkTGVuZ3RoPWZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0scj10WzFdO3JldHVybiBlKmUrcipyfSxpLnNxckxlbj1pLnNxdWFyZWRMZW5ndGgsaS5uZWdhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT0tZVswXSx0WzFdPS1lWzFdLHR9LGkuaW52ZXJzZT1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPTEvZVswXSx0WzFdPTEvZVsxXSx0fSxpLm5vcm1hbGl6ZT1mdW5jdGlvbih0LGUpe3ZhciByPWVbMF0sbj1lWzFdLGk9cipyK24qbjtyZXR1cm4gaT4wJiYoaT0xL01hdGguc3FydChpKSx0WzBdPWVbMF0qaSx0WzFdPWVbMV0qaSksdH0saS5kb3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXSplWzBdK3RbMV0qZVsxXX0saS5jcm9zcz1mdW5jdGlvbih0LGUscil7dmFyIG49ZVswXSpyWzFdLWVbMV0qclswXTtyZXR1cm4gdFswXT10WzFdPTAsdFsyXT1uLHR9LGkubGVycD1mdW5jdGlvbih0LGUscixuKXt2YXIgaT1lWzBdLGE9ZVsxXTtyZXR1cm4gdFswXT1pK24qKHJbMF0taSksdFsxXT1hK24qKHJbMV0tYSksdH0saS5yYW5kb209ZnVuY3Rpb24odCxlKXtlPWV8fDE7dmFyIHI9MipuLlJBTkRPTSgpKk1hdGguUEk7cmV0dXJuIHRbMF09TWF0aC5jb3MocikqZSx0WzFdPU1hdGguc2luKHIpKmUsdH0saS50cmFuc2Zvcm1NYXQyPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lWzBdLGk9ZVsxXTtyZXR1cm4gdFswXT1yWzBdKm4rclsyXSppLHRbMV09clsxXSpuK3JbM10qaSx0fSxpLnRyYW5zZm9ybU1hdDJkPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lWzBdLGk9ZVsxXTtyZXR1cm4gdFswXT1yWzBdKm4rclsyXSppK3JbNF0sdFsxXT1yWzFdKm4rclszXSppK3JbNV0sdH0saS50cmFuc2Zvcm1NYXQzPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lWzBdLGk9ZVsxXTtyZXR1cm4gdFswXT1yWzBdKm4rclszXSppK3JbNl0sdFsxXT1yWzFdKm4rcls0XSppK3JbN10sdH0saS50cmFuc2Zvcm1NYXQ0PWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lWzBdLGk9ZVsxXTtyZXR1cm4gdFswXT1yWzBdKm4rcls0XSppK3JbMTJdLHRbMV09clsxXSpuK3JbNV0qaStyWzEzXSx0fSxpLmZvckVhY2g9ZnVuY3Rpb24oKXt2YXIgdD1pLmNyZWF0ZSgpO3JldHVybiBmdW5jdGlvbihlLHIsbixpLGEsbyl7dmFyIHMsbDtmb3Iocnx8KHI9Miksbnx8KG49MCksbD1pP01hdGgubWluKGkqcituLGUubGVuZ3RoKTplLmxlbmd0aCxzPW47czxsO3MrPXIpdFswXT1lW3NdLHRbMV09ZVtzKzFdLGEodCx0LG8pLGVbc109dFswXSxlW3MrMV09dFsxXTtyZXR1cm4gZX19KCksaS5zdHI9ZnVuY3Rpb24odCl7cmV0dXJuInZlYzIoIit0WzBdKyIsICIrdFsxXSsiKSJ9LGkuZXhhY3RFcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT09PWVbMF0mJnRbMV09PT1lWzFdfSxpLmVxdWFscz1mdW5jdGlvbih0LGUpe3ZhciByPXRbMF0saT10WzFdLGE9ZVswXSxvPWVbMV07cmV0dXJuIE1hdGguYWJzKHItYSk8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHIpLE1hdGguYWJzKGEpKSYmTWF0aC5hYnMoaS1vKTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoaSksTWF0aC5hYnMobykpfSxlLmV4cG9ydHM9aX0seyIuL2NvbW1vbi5qcyI6MTYyfV0sMTY5OltmdW5jdGlvbih0LGUscil7dmFyIG49dCgiLi9jb21tb24uanMiKSxpPXt9O2kuY3JlYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IG4uQVJSQVlfVFlQRSgzKTtyZXR1cm4gdFswXT0wLHRbMV09MCx0WzJdPTAsdH0saS5jbG9uZT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgbi5BUlJBWV9UWVBFKDMpO3JldHVybiBlWzBdPXRbMF0sZVsxXT10WzFdLGVbMl09dFsyXSxlfSxpLmZyb21WYWx1ZXM9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPW5ldyBuLkFSUkFZX1RZUEUoMyk7cmV0dXJuIGlbMF09dCxpWzFdPWUsaVsyXT1yLGl9LGkuY29weT1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzFdLHRbMl09ZVsyXSx0fSxpLnNldD1mdW5jdGlvbih0LGUscixuKXtyZXR1cm4gdFswXT1lLHRbMV09cix0WzJdPW4sdH0saS5hZGQ9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0WzBdPWVbMF0rclswXSx0WzFdPWVbMV0rclsxXSx0WzJdPWVbMl0rclsyXSx0fSxpLnN1YnRyYWN0PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFswXT1lWzBdLXJbMF0sdFsxXT1lWzFdLXJbMV0sdFsyXT1lWzJdLXJbMl0sdH0saS5zdWI9aS5zdWJ0cmFjdCxpLm11bHRpcGx5PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFswXT1lWzBdKnJbMF0sdFsxXT1lWzFdKnJbMV0sdFsyXT1lWzJdKnJbMl0sdH0saS5tdWw9aS5tdWx0aXBseSxpLmRpdmlkZT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09ZVswXS9yWzBdLHRbMV09ZVsxXS9yWzFdLHRbMl09ZVsyXS9yWzJdLHR9LGkuZGl2PWkuZGl2aWRlLGkuY2VpbD1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPU1hdGguY2VpbChlWzBdKSx0WzFdPU1hdGguY2VpbChlWzFdKSx0WzJdPU1hdGguY2VpbChlWzJdKSx0fSxpLmZsb29yPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09TWF0aC5mbG9vcihlWzBdKSx0WzFdPU1hdGguZmxvb3IoZVsxXSksdFsyXT1NYXRoLmZsb29yKGVbMl0pLHR9LGkubWluPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFswXT1NYXRoLm1pbihlWzBdLHJbMF0pLHRbMV09TWF0aC5taW4oZVsxXSxyWzFdKSx0WzJdPU1hdGgubWluKGVbMl0sclsyXSksdH0saS5tYXg9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0WzBdPU1hdGgubWF4KGVbMF0sclswXSksdFsxXT1NYXRoLm1heChlWzFdLHJbMV0pLHRbMl09TWF0aC5tYXgoZVsyXSxyWzJdKSx0fSxpLnJvdW5kPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09TWF0aC5yb3VuZChlWzBdKSx0WzFdPU1hdGgucm91bmQoZVsxXSksdFsyXT1NYXRoLnJvdW5kKGVbMl0pLHR9LGkuc2NhbGU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0WzBdPWVbMF0qcix0WzFdPWVbMV0qcix0WzJdPWVbMl0qcix0fSxpLnNjYWxlQW5kQWRkPWZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiB0WzBdPWVbMF0rclswXSpuLHRbMV09ZVsxXStyWzFdKm4sdFsyXT1lWzJdK3JbMl0qbix0fSxpLmRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZVswXS10WzBdLG49ZVsxXS10WzFdLGk9ZVsyXS10WzJdO3JldHVybiBNYXRoLnNxcnQocipyK24qbitpKmkpfSxpLmRpc3Q9aS5kaXN0YW5jZSxpLnNxdWFyZWREaXN0YW5jZT1mdW5jdGlvbih0LGUpe3ZhciByPWVbMF0tdFswXSxuPWVbMV0tdFsxXSxpPWVbMl0tdFsyXTtyZXR1cm4gcipyK24qbitpKml9LGkuc3FyRGlzdD1pLnNxdWFyZWREaXN0YW5jZSxpLmxlbmd0aD1mdW5jdGlvbih0KXt2YXIgZT10WzBdLHI9dFsxXSxuPXRbMl07cmV0dXJuIE1hdGguc3FydChlKmUrcipyK24qbil9LGkubGVuPWkubGVuZ3RoLGkuc3F1YXJlZExlbmd0aD1mdW5jdGlvbih0KXt2YXIgZT10WzBdLHI9dFsxXSxuPXRbMl07cmV0dXJuIGUqZStyKnIrbipufSxpLnNxckxlbj1pLnNxdWFyZWRMZW5ndGgsaS5uZWdhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT0tZVswXSx0WzFdPS1lWzFdLHRbMl09LWVbMl0sdH0saS5pbnZlcnNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09MS9lWzBdLHRbMV09MS9lWzFdLHRbMl09MS9lWzJdLHR9LGkubm9ybWFsaXplPWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZVswXSxuPWVbMV0saT1lWzJdLGE9cipyK24qbitpKmk7cmV0dXJuIGE+MCYmKGE9MS9NYXRoLnNxcnQoYSksdFswXT1lWzBdKmEsdFsxXT1lWzFdKmEsdFsyXT1lWzJdKmEpLHR9LGkuZG90PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF0qZVswXSt0WzFdKmVbMV0rdFsyXSplWzJdfSxpLmNyb3NzPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lWzBdLGk9ZVsxXSxhPWVbMl0sbz1yWzBdLHM9clsxXSxsPXJbMl07cmV0dXJuIHRbMF09aSpsLWEqcyx0WzFdPWEqby1uKmwsdFsyXT1uKnMtaSpvLHR9LGkubGVycD1mdW5jdGlvbih0LGUscixuKXt2YXIgaT1lWzBdLGE9ZVsxXSxvPWVbMl07cmV0dXJuIHRbMF09aStuKihyWzBdLWkpLHRbMV09YStuKihyWzFdLWEpLHRbMl09bytuKihyWzJdLW8pLHR9LGkuaGVybWl0ZT1mdW5jdGlvbih0LGUscixuLGksYSl7dmFyIG89YSphLHM9byooMiphLTMpKzEsbD1vKihhLTIpK2EsdT1vKihhLTEpLGM9byooMy0yKmEpO3JldHVybiB0WzBdPWVbMF0qcytyWzBdKmwrblswXSp1K2lbMF0qYyx0WzFdPWVbMV0qcytyWzFdKmwrblsxXSp1K2lbMV0qYyx0WzJdPWVbMl0qcytyWzJdKmwrblsyXSp1K2lbMl0qYyx0fSxpLmJlemllcj1mdW5jdGlvbih0LGUscixuLGksYSl7dmFyIG89MS1hLHM9bypvLGw9YSphLHU9cypvLGM9MyphKnMsaD0zKmwqbyxmPWwqYTtyZXR1cm4gdFswXT1lWzBdKnUrclswXSpjK25bMF0qaCtpWzBdKmYsdFsxXT1lWzFdKnUrclsxXSpjK25bMV0qaCtpWzFdKmYsdFsyXT1lWzJdKnUrclsyXSpjK25bMl0qaCtpWzJdKmYsdH0saS5yYW5kb209ZnVuY3Rpb24odCxlKXtlPWV8fDE7dmFyIHI9MipuLlJBTkRPTSgpKk1hdGguUEksaT0yKm4uUkFORE9NKCktMSxhPU1hdGguc3FydCgxLWkqaSkqZTtyZXR1cm4gdFswXT1NYXRoLmNvcyhyKSphLHRbMV09TWF0aC5zaW4ocikqYSx0WzJdPWkqZSx0fSxpLnRyYW5zZm9ybU1hdDQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWVbMF0saT1lWzFdLGE9ZVsyXSxvPXJbM10qbityWzddKmkrclsxMV0qYStyWzE1XTtyZXR1cm4gbz1vfHwxLHRbMF09KHJbMF0qbityWzRdKmkrcls4XSphK3JbMTJdKS9vLHRbMV09KHJbMV0qbityWzVdKmkrcls5XSphK3JbMTNdKS9vLHRbMl09KHJbMl0qbityWzZdKmkrclsxMF0qYStyWzE0XSkvbyx0fSxpLnRyYW5zZm9ybU1hdDM9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWVbMF0saT1lWzFdLGE9ZVsyXTtyZXR1cm4gdFswXT1uKnJbMF0raSpyWzNdK2Eqcls2XSx0WzFdPW4qclsxXStpKnJbNF0rYSpyWzddLHRbMl09bipyWzJdK2kqcls1XSthKnJbOF0sdH0saS50cmFuc2Zvcm1RdWF0PWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lWzBdLGk9ZVsxXSxhPWVbMl0sbz1yWzBdLHM9clsxXSxsPXJbMl0sdT1yWzNdLGM9dSpuK3MqYS1sKmksaD11KmkrbCpuLW8qYSxmPXUqYStvKmktcypuLGQ9LW8qbi1zKmktbCphO3JldHVybiB0WzBdPWMqdStkKi1vK2gqLWwtZiotcyx0WzFdPWgqdStkKi1zK2YqLW8tYyotbCx0WzJdPWYqdStkKi1sK2MqLXMtaCotbyx0fSxpLnJvdGF0ZVg9ZnVuY3Rpb24odCxlLHIsbil7dmFyIGk9W10sYT1bXTtyZXR1cm4gaVswXT1lWzBdLXJbMF0saVsxXT1lWzFdLXJbMV0saVsyXT1lWzJdLXJbMl0sYVswXT1pWzBdLGFbMV09aVsxXSpNYXRoLmNvcyhuKS1pWzJdKk1hdGguc2luKG4pLGFbMl09aVsxXSpNYXRoLnNpbihuKStpWzJdKk1hdGguY29zKG4pLHRbMF09YVswXStyWzBdLHRbMV09YVsxXStyWzFdLHRbMl09YVsyXStyWzJdLHR9LGkucm90YXRlWT1mdW5jdGlvbih0LGUscixuKXt2YXIgaT1bXSxhPVtdO3JldHVybiBpWzBdPWVbMF0tclswXSxpWzFdPWVbMV0tclsxXSxpWzJdPWVbMl0tclsyXSxhWzBdPWlbMl0qTWF0aC5zaW4obikraVswXSpNYXRoLmNvcyhuKSxhWzFdPWlbMV0sYVsyXT1pWzJdKk1hdGguY29zKG4pLWlbMF0qTWF0aC5zaW4obiksdFswXT1hWzBdK3JbMF0sdFsxXT1hWzFdK3JbMV0sdFsyXT1hWzJdK3JbMl0sdH0saS5yb3RhdGVaPWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPVtdLGE9W107cmV0dXJuIGlbMF09ZVswXS1yWzBdLGlbMV09ZVsxXS1yWzFdLGlbMl09ZVsyXS1yWzJdLGFbMF09aVswXSpNYXRoLmNvcyhuKS1pWzFdKk1hdGguc2luKG4pLGFbMV09aVswXSpNYXRoLnNpbihuKStpWzFdKk1hdGguY29zKG4pLGFbMl09aVsyXSx0WzBdPWFbMF0rclswXSx0WzFdPWFbMV0rclsxXSx0WzJdPWFbMl0rclsyXSx0fSxpLmZvckVhY2g9ZnVuY3Rpb24oKXt2YXIgdD1pLmNyZWF0ZSgpO3JldHVybiBmdW5jdGlvbihlLHIsbixpLGEsbyl7dmFyIHMsbDtmb3Iocnx8KHI9Myksbnx8KG49MCksbD1pP01hdGgubWluKGkqcituLGUubGVuZ3RoKTplLmxlbmd0aCxzPW47czxsO3MrPXIpdFswXT1lW3NdLHRbMV09ZVtzKzFdLHRbMl09ZVtzKzJdLGEodCx0LG8pLGVbc109dFswXSxlW3MrMV09dFsxXSxlW3MrMl09dFsyXTtyZXR1cm4gZX19KCksaS5hbmdsZT1mdW5jdGlvbih0LGUpe3ZhciByPWkuZnJvbVZhbHVlcyh0WzBdLHRbMV0sdFsyXSksbj1pLmZyb21WYWx1ZXMoZVswXSxlWzFdLGVbMl0pO2kubm9ybWFsaXplKHIsciksaS5ub3JtYWxpemUobixuKTt2YXIgYT1pLmRvdChyLG4pO3JldHVybiBhPjE/MDpNYXRoLmFjb3MoYSl9LGkuc3RyPWZ1bmN0aW9uKHQpe3JldHVybiJ2ZWMzKCIrdFswXSsiLCAiK3RbMV0rIiwgIit0WzJdKyIpIn0saS5leGFjdEVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPT09ZVswXSYmdFsxXT09PWVbMV0mJnRbMl09PT1lWzJdfSxpLmVxdWFscz1mdW5jdGlvbih0LGUpe3ZhciByPXRbMF0saT10WzFdLGE9dFsyXSxvPWVbMF0scz1lWzFdLGw9ZVsyXTtyZXR1cm4gTWF0aC5hYnMoci1vKTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMociksTWF0aC5hYnMobykpJiZNYXRoLmFicyhpLXMpPD1uLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhpKSxNYXRoLmFicyhzKSkmJk1hdGguYWJzKGEtbCk8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGEpLE1hdGguYWJzKGwpKX0sZS5leHBvcnRzPWl9LHsiLi9jb21tb24uanMiOjE2Mn1dLDE3MDpbZnVuY3Rpb24odCxlLHIpe3ZhciBuPXQoIi4vY29tbW9uLmpzIiksaT17fTtpLmNyZWF0ZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBuLkFSUkFZX1RZUEUoNCk7cmV0dXJuIHRbMF09MCx0WzFdPTAsdFsyXT0wLHRbM109MCx0fSxpLmNsb25lPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBuLkFSUkFZX1RZUEUoNCk7cmV0dXJuIGVbMF09dFswXSxlWzFdPXRbMV0sZVsyXT10WzJdLGVbM109dFszXSxlfSxpLmZyb21WYWx1ZXM9ZnVuY3Rpb24odCxlLHIsaSl7dmFyIGE9bmV3IG4uQVJSQVlfVFlQRSg0KTtyZXR1cm4gYVswXT10LGFbMV09ZSxhWzJdPXIsYVszXT1pLGF9LGkuY29weT1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzFdLHRbMl09ZVsyXSx0WzNdPWVbM10sdH0saS5zZXQ9ZnVuY3Rpb24odCxlLHIsbixpKXtyZXR1cm4gdFswXT1lLHRbMV09cix0WzJdPW4sdFszXT1pLHR9LGkuYWRkPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFswXT1lWzBdK3JbMF0sdFsxXT1lWzFdK3JbMV0sdFsyXT1lWzJdK3JbMl0sdFszXT1lWzNdK3JbM10sdH0saS5zdWJ0cmFjdD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09ZVswXS1yWzBdLHRbMV09ZVsxXS1yWzFdLHRbMl09ZVsyXS1yWzJdLHRbM109ZVszXS1yWzNdLHR9LGkuc3ViPWkuc3VidHJhY3QsaS5tdWx0aXBseT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09ZVswXSpyWzBdLHRbMV09ZVsxXSpyWzFdLHRbMl09ZVsyXSpyWzJdLHRbM109ZVszXSpyWzNdLHR9LGkubXVsPWkubXVsdGlwbHksaS5kaXZpZGU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0WzBdPWVbMF0vclswXSx0WzFdPWVbMV0vclsxXSx0WzJdPWVbMl0vclsyXSx0WzNdPWVbM10vclszXSx0fSxpLmRpdj1pLmRpdmlkZSxpLmNlaWw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT1NYXRoLmNlaWwoZVswXSksdFsxXT1NYXRoLmNlaWwoZVsxXSksdFsyXT1NYXRoLmNlaWwoZVsyXSksdFszXT1NYXRoLmNlaWwoZVszXSksdH0saS5mbG9vcj1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPU1hdGguZmxvb3IoZVswXSksdFsxXT1NYXRoLmZsb29yKGVbMV0pLHRbMl09TWF0aC5mbG9vcihlWzJdKSx0WzNdPU1hdGguZmxvb3IoZVszXSksdH0saS5taW49ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0WzBdPU1hdGgubWluKGVbMF0sclswXSksdFsxXT1NYXRoLm1pbihlWzFdLHJbMV0pLHRbMl09TWF0aC5taW4oZVsyXSxyWzJdKSx0WzNdPU1hdGgubWluKGVbM10sclszXSksdH0saS5tYXg9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0WzBdPU1hdGgubWF4KGVbMF0sclswXSksdFsxXT1NYXRoLm1heChlWzFdLHJbMV0pLHRbMl09TWF0aC5tYXgoZVsyXSxyWzJdKSx0WzNdPU1hdGgubWF4KGVbM10sclszXSksdH0saS5yb3VuZD1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPU1hdGgucm91bmQoZVswXSksdFsxXT1NYXRoLnJvdW5kKGVbMV0pLHRbMl09TWF0aC5yb3VuZChlWzJdKSx0WzNdPU1hdGgucm91bmQoZVszXSksdH0saS5zY2FsZT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09ZVswXSpyLHRbMV09ZVsxXSpyLHRbMl09ZVsyXSpyLHRbM109ZVszXSpyLHR9LGkuc2NhbGVBbmRBZGQ9ZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuIHRbMF09ZVswXStyWzBdKm4sdFsxXT1lWzFdK3JbMV0qbix0WzJdPWVbMl0rclsyXSpuLHRbM109ZVszXStyWzNdKm4sdH0saS5kaXN0YW5jZT1mdW5jdGlvbih0LGUpe3ZhciByPWVbMF0tdFswXSxuPWVbMV0tdFsxXSxpPWVbMl0tdFsyXSxhPWVbM10tdFszXTtyZXR1cm4gTWF0aC5zcXJ0KHIqcituKm4raSppK2EqYSl9LGkuZGlzdD1pLmRpc3RhbmNlLGkuc3F1YXJlZERpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZVswXS10WzBdLG49ZVsxXS10WzFdLGk9ZVsyXS10WzJdLGE9ZVszXS10WzNdO3JldHVybiByKnIrbipuK2kqaSthKmF9LGkuc3FyRGlzdD1pLnNxdWFyZWREaXN0YW5jZSxpLmxlbmd0aD1mdW5jdGlvbih0KXt2YXIgZT10WzBdLHI9dFsxXSxuPXRbMl0saT10WzNdO3JldHVybiBNYXRoLnNxcnQoZSplK3IqcituKm4raSppKX0saS5sZW49aS5sZW5ndGgsaS5zcXVhcmVkTGVuZ3RoPWZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0scj10WzFdLG49dFsyXSxpPXRbM107cmV0dXJuIGUqZStyKnIrbipuK2kqaX0saS5zcXJMZW49aS5zcXVhcmVkTGVuZ3RoLGkubmVnYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09LWVbMF0sdFsxXT0tZVsxXSx0WzJdPS1lWzJdLHRbM109LWVbM10sdH0saS5pbnZlcnNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09MS9lWzBdLHRbMV09MS9lWzFdLHRbMl09MS9lWzJdLHRbM109MS9lWzNdLHR9LGkubm9ybWFsaXplPWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZVswXSxuPWVbMV0saT1lWzJdLGE9ZVszXSxvPXIqcituKm4raSppK2EqYTtyZXR1cm4gbz4wJiYobz0xL01hdGguc3FydChvKSx0WzBdPXIqbyx0WzFdPW4qbyx0WzJdPWkqbyx0WzNdPWEqbyksdH0saS5kb3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXSplWzBdK3RbMV0qZVsxXSt0WzJdKmVbMl0rdFszXSplWzNdfSxpLmxlcnA9ZnVuY3Rpb24odCxlLHIsbil7dmFyIGk9ZVswXSxhPWVbMV0sbz1lWzJdLHM9ZVszXTtyZXR1cm4gdFswXT1pK24qKHJbMF0taSksdFsxXT1hK24qKHJbMV0tYSksdFsyXT1vK24qKHJbMl0tbyksdFszXT1zK24qKHJbM10tcyksdH0saS5yYW5kb209ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT1lfHwxLHRbMF09bi5SQU5ET00oKSx0WzFdPW4uUkFORE9NKCksdFsyXT1uLlJBTkRPTSgpLHRbM109bi5SQU5ET00oKSxpLm5vcm1hbGl6ZSh0LHQpLGkuc2NhbGUodCx0LGUpLHR9LGkudHJhbnNmb3JtTWF0ND1mdW5jdGlvbih0LGUscil7dmFyIG49ZVswXSxpPWVbMV0sYT1lWzJdLG89ZVszXTtyZXR1cm4gdFswXT1yWzBdKm4rcls0XSppK3JbOF0qYStyWzEyXSpvLHRbMV09clsxXSpuK3JbNV0qaStyWzldKmErclsxM10qbyx0WzJdPXJbMl0qbityWzZdKmkrclsxMF0qYStyWzE0XSpvLHRbM109clszXSpuK3JbN10qaStyWzExXSphK3JbMTVdKm8sdH0saS50cmFuc2Zvcm1RdWF0PWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lWzBdLGk9ZVsxXSxhPWVbMl0sbz1yWzBdLHM9clsxXSxsPXJbMl0sdT1yWzNdLGM9dSpuK3MqYS1sKmksaD11KmkrbCpuLW8qYSxmPXUqYStvKmktcypuLGQ9LW8qbi1zKmktbCphO3JldHVybiB0WzBdPWMqdStkKi1vK2gqLWwtZiotcyx0WzFdPWgqdStkKi1zK2YqLW8tYyotbCx0WzJdPWYqdStkKi1sK2MqLXMtaCotbyx0WzNdPWVbM10sdH0saS5mb3JFYWNoPWZ1bmN0aW9uKCl7dmFyIHQ9aS5jcmVhdGUoKTtyZXR1cm4gZnVuY3Rpb24oZSxyLG4saSxhLG8pe3ZhciBzLGw7Zm9yKHJ8fChyPTQpLG58fChuPTApLGw9aT9NYXRoLm1pbihpKnIrbixlLmxlbmd0aCk6ZS5sZW5ndGgscz1uO3M8bDtzKz1yKXRbMF09ZVtzXSx0WzFdPWVbcysxXSx0WzJdPWVbcysyXSx0WzNdPWVbcyszXSxhKHQsdCxvKSxlW3NdPXRbMF0sZVtzKzFdPXRbMV0sZVtzKzJdPXRbMl0sZVtzKzNdPXRbM107cmV0dXJuIGV9fSgpLGkuc3RyPWZ1bmN0aW9uKHQpe3JldHVybiJ2ZWM0KCIrdFswXSsiLCAiK3RbMV0rIiwgIit0WzJdKyIsICIrdFszXSsiKSJ9LGkuZXhhY3RFcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT09PWVbMF0mJnRbMV09PT1lWzFdJiZ0WzJdPT09ZVsyXSYmdFszXT09PWVbM119LGkuZXF1YWxzPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dFswXSxpPXRbMV0sYT10WzJdLG89dFszXSxzPWVbMF0sbD1lWzFdLHU9ZVsyXSxjPWVbM107cmV0dXJuIE1hdGguYWJzKHItcyk8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHIpLE1hdGguYWJzKHMpKSYmTWF0aC5hYnMoaS1sKTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoaSksTWF0aC5hYnMobCkpJiZNYXRoLmFicyhhLXUpPD1uLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhhKSxNYXRoLmFicyh1KSkmJk1hdGguYWJzKG8tYyk8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKG8pLE1hdGguYWJzKGMpKX0sZS5leHBvcnRzPWl9LHsiLi9jb21tb24uanMiOjE2Mn1dLDE3MTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7Zm9yKHZhciByPVswLDAsMCwwXSxuPTA7bjw0Oysrbilmb3IodmFyIGk9MDtpPDQ7KytpKXJbaV0rPXRbNCpuK2ldKmVbbl07cmV0dXJuIHJ9ZnVuY3Rpb24gaSh0LGUscixpLGEpe2Zvcih2YXIgbz1uKGksbihyLG4oZSxbdFswXSx0WzFdLHRbMl0sMV0pKSkscz0wO3M8MzsrK3Mpb1tzXS89b1szXTtyZXR1cm5bLjUqYVswXSooMStvWzBdKSwuNSphWzFdKigxLW9bMV0pXX1mdW5jdGlvbiBhKHQsZSl7aWYoMj09PXQubGVuZ3RoKXtmb3IodmFyIHI9MCxuPTAsaT0wO2k8MjsrK2kpcis9TWF0aC5wb3coZVtpXS10WzBdW2ldLDIpLG4rPU1hdGgucG93KGVbaV0tdFsxXVtpXSwyKTtyZXR1cm4gcj1NYXRoLnNxcnQociksbj1NYXRoLnNxcnQobikscituPDFlLTY/WzEsMF06W24vKHIrbiksci8obityKV19aWYoMz09PXQubGVuZ3RoKXt2YXIgYT1bMCwwXTtyZXR1cm4gdSh0WzBdLHRbMV0sdFsyXSxlLGEpLGwodCxhKX1yZXR1cm5bXX1mdW5jdGlvbiBvKHQsZSl7Zm9yKHZhciByPVswLDAsMF0sbj0wO248dC5sZW5ndGg7KytuKWZvcih2YXIgaT10W25dLGE9ZVtuXSxvPTA7bzwzOysrbylyW29dKz1hKmlbb107cmV0dXJuIHJ9ZnVuY3Rpb24gcyh0LGUscixuLHMsbCl7aWYoMT09PXQubGVuZ3RoKXJldHVyblswLHRbMF0uc2xpY2UoKV07Zm9yKHZhciB1PW5ldyBBcnJheSh0Lmxlbmd0aCksYz0wO2M8dC5sZW5ndGg7KytjKXVbY109aSh0W2NdLHIsbixzLGwpO2Zvcih2YXIgaD0wLGY9MS8wLGM9MDtjPHUubGVuZ3RoOysrYyl7Zm9yKHZhciBkPTAscD0wO3A8MjsrK3ApZCs9TWF0aC5wb3codVtjXVtwXS1lW3BdLDIpO2Q8ZiYmKGY9ZCxoPWMpfWZvcih2YXIgZz1hKHUsZSksbT0wLGM9MDtjPDM7KytjKXtpZihnW2NdPC0uMDAxfHxnW2NdPjEuMDAwMSlyZXR1cm4gbnVsbDttKz1nW2NdfXJldHVybiBNYXRoLmFicyhtLTEpPi4wMDE/bnVsbDpbaCxvKHQsZyksZ119dmFyIGw9dCgiYmFyeWNlbnRyaWMiKSx1PXQoInBvbHl0b3BlLWNsb3Nlc3QtcG9pbnQvbGliL2Nsb3Nlc3RfcG9pbnRfMmQuanMiKTtlLmV4cG9ydHM9c30se2JhcnljZW50cmljOjM2LCJwb2x5dG9wZS1jbG9zZXN0LXBvaW50L2xpYi9jbG9zZXN0X3BvaW50XzJkLmpzIjo0NDR9XSwxNzI6W2Z1bmN0aW9uKHQsZSxyKXt2YXIgbj0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbiwgbm9ybWFsO1xuYXR0cmlidXRlIHZlYzQgY29sb3I7XG5hdHRyaWJ1dGUgdmVjMiB1djtcblxudW5pZm9ybSBtYXQ0IG1vZGVsXG4gICAgICAgICAgICwgdmlld1xuICAgICAgICAgICAsIHByb2plY3Rpb247XG51bmlmb3JtIHZlYzMgZXllUG9zaXRpb25cbiAgICAgICAgICAgLCBsaWdodFBvc2l0aW9uO1xuXG52YXJ5aW5nIHZlYzMgZl9ub3JtYWxcbiAgICAgICAgICAgLCBmX2xpZ2h0RGlyZWN0aW9uXG4gICAgICAgICAgICwgZl9leWVEaXJlY3Rpb25cbiAgICAgICAgICAgLCBmX2RhdGE7XG52YXJ5aW5nIHZlYzQgZl9jb2xvcjtcbnZhcnlpbmcgdmVjMiBmX3V2O1xuXG52b2lkIG1haW4oKSB7XG4gIHZlYzQgbV9wb3NpdGlvbiAgPSBtb2RlbCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XG4gIHZlYzQgdF9wb3NpdGlvbiAgPSB2aWV3ICogbV9wb3NpdGlvbjtcbiAgZ2xfUG9zaXRpb24gICAgICA9IHByb2plY3Rpb24gKiB0X3Bvc2l0aW9uO1xuICBmX2NvbG9yICAgICAgICAgID0gY29sb3I7XG4gIGZfbm9ybWFsICAgICAgICAgPSBub3JtYWw7XG4gIGZfZGF0YSAgICAgICAgICAgPSBwb3NpdGlvbjtcbiAgZl9leWVEaXJlY3Rpb24gICA9IGV5ZVBvc2l0aW9uICAgLSBwb3NpdGlvbjtcbiAgZl9saWdodERpcmVjdGlvbiA9IGxpZ2h0UG9zaXRpb24gLSBwb3NpdGlvbjtcbiAgZl91diAgICAgICAgICAgICA9IHV2O1xufSIsaT0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG5mbG9hdCBiZWNrbWFubkRpc3RyaWJ1dGlvbl8yXzAoZmxvYXQgeCwgZmxvYXQgcm91Z2huZXNzKSB7XG4gIGZsb2F0IE5kb3RIID0gbWF4KHgsIDAuMDAwMSk7XG4gIGZsb2F0IGNvczJBbHBoYSA9IE5kb3RIICogTmRvdEg7XG4gIGZsb2F0IHRhbjJBbHBoYSA9IChjb3MyQWxwaGEgLSAxLjApIC8gY29zMkFscGhhO1xuICBmbG9hdCByb3VnaG5lc3MyID0gcm91Z2huZXNzICogcm91Z2huZXNzO1xuICBmbG9hdCBkZW5vbSA9IDMuMTQxNTkyNjUzNTg5NzkzICogcm91Z2huZXNzMiAqIGNvczJBbHBoYSAqIGNvczJBbHBoYTtcbiAgcmV0dXJuIGV4cCh0YW4yQWxwaGEgLyByb3VnaG5lc3MyKSAvIGRlbm9tO1xufVxuXG5cblxuZmxvYXQgY29va1RvcnJhbmNlU3BlY3VsYXJfMV8xKFxuICB2ZWMzIGxpZ2h0RGlyZWN0aW9uLFxuICB2ZWMzIHZpZXdEaXJlY3Rpb24sXG4gIHZlYzMgc3VyZmFjZU5vcm1hbCxcbiAgZmxvYXQgcm91Z2huZXNzLFxuICBmbG9hdCBmcmVzbmVsKSB7XG5cbiAgZmxvYXQgVmRvdE4gPSBtYXgoZG90KHZpZXdEaXJlY3Rpb24sIHN1cmZhY2VOb3JtYWwpLCAwLjApO1xuICBmbG9hdCBMZG90TiA9IG1heChkb3QobGlnaHREaXJlY3Rpb24sIHN1cmZhY2VOb3JtYWwpLCAwLjApO1xuXG4gIC8vSGFsZiBhbmdsZSB2ZWN0b3JcbiAgdmVjMyBIID0gbm9ybWFsaXplKGxpZ2h0RGlyZWN0aW9uICsgdmlld0RpcmVjdGlvbik7XG5cbiAgLy9HZW9tZXRyaWMgdGVybVxuICBmbG9hdCBOZG90SCA9IG1heChkb3Qoc3VyZmFjZU5vcm1hbCwgSCksIDAuMCk7XG4gIGZsb2F0IFZkb3RIID0gbWF4KGRvdCh2aWV3RGlyZWN0aW9uLCBIKSwgMC4wMDAwMDEpO1xuICBmbG9hdCBMZG90SCA9IG1heChkb3QobGlnaHREaXJlY3Rpb24sIEgpLCAwLjAwMDAwMSk7XG4gIGZsb2F0IEcxID0gKDIuMCAqIE5kb3RIICogVmRvdE4pIC8gVmRvdEg7XG4gIGZsb2F0IEcyID0gKDIuMCAqIE5kb3RIICogTGRvdE4pIC8gTGRvdEg7XG4gIGZsb2F0IEcgPSBtaW4oMS4wLCBtaW4oRzEsIEcyKSk7XG4gIFxuICAvL0Rpc3RyaWJ1dGlvbiB0ZXJtXG4gIGZsb2F0IEQgPSBiZWNrbWFubkRpc3RyaWJ1dGlvbl8yXzAoTmRvdEgsIHJvdWdobmVzcyk7XG5cbiAgLy9GcmVzbmVsIHRlcm1cbiAgZmxvYXQgRiA9IHBvdygxLjAgLSBWZG90TiwgZnJlc25lbCk7XG5cbiAgLy9NdWx0aXBseSB0ZXJtcyBhbmQgZG9uZVxuICByZXR1cm4gIEcgKiBGICogRCAvIG1heCgzLjE0MTU5MjY1ICogVmRvdE4sIDAuMDAwMDAxKTtcbn1cblxuXG5cbnVuaWZvcm0gdmVjMyBjbGlwQm91bmRzWzJdO1xudW5pZm9ybSBmbG9hdCByb3VnaG5lc3NcbiAgICAgICAgICAgICwgZnJlc25lbFxuICAgICAgICAgICAgLCBrYW1iaWVudFxuICAgICAgICAgICAgLCBrZGlmZnVzZVxuICAgICAgICAgICAgLCBrc3BlY3VsYXJcbiAgICAgICAgICAgICwgb3BhY2l0eTtcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU7XG5cbnZhcnlpbmcgdmVjMyBmX25vcm1hbFxuICAgICAgICAgICAsIGZfbGlnaHREaXJlY3Rpb25cbiAgICAgICAgICAgLCBmX2V5ZURpcmVjdGlvblxuICAgICAgICAgICAsIGZfZGF0YTtcbnZhcnlpbmcgdmVjNCBmX2NvbG9yO1xudmFyeWluZyB2ZWMyIGZfdXY7XG5cbnZvaWQgbWFpbigpIHtcbiAgaWYoYW55KGxlc3NUaGFuKGZfZGF0YSwgY2xpcEJvdW5kc1swXSkpIHx8IFxuICAgICBhbnkoZ3JlYXRlclRoYW4oZl9kYXRhLCBjbGlwQm91bmRzWzFdKSkpIHtcbiAgICBkaXNjYXJkO1xuICB9XG5cbiAgdmVjMyBOID0gbm9ybWFsaXplKGZfbm9ybWFsKTtcbiAgdmVjMyBMID0gbm9ybWFsaXplKGZfbGlnaHREaXJlY3Rpb24pO1xuICB2ZWMzIFYgPSBub3JtYWxpemUoZl9leWVEaXJlY3Rpb24pO1xuICBcbiAgaWYoIWdsX0Zyb250RmFjaW5nKSB7XG4gICAgTiA9IC1OO1xuICB9XG5cbiAgZmxvYXQgc3BlY3VsYXIgPSBjb29rVG9ycmFuY2VTcGVjdWxhcl8xXzEoTCwgViwgTiwgcm91Z2huZXNzLCBmcmVzbmVsKTtcbiAgZmxvYXQgZGlmZnVzZSAgPSBtaW4oa2FtYmllbnQgKyBrZGlmZnVzZSAqIG1heChkb3QoTiwgTCksIDAuMCksIDEuMCk7XG5cbiAgdmVjNCBzdXJmYWNlQ29sb3IgPSBmX2NvbG9yICogdGV4dHVyZTJEKHRleHR1cmUsIGZfdXYpO1xuICB2ZWM0IGxpdENvbG9yID0gc3VyZmFjZUNvbG9yLmEgKiB2ZWM0KGRpZmZ1c2UgKiBzdXJmYWNlQ29sb3IucmdiICsga3NwZWN1bGFyICogdmVjMygxLDEsMSkgKiBzcGVjdWxhciwgIDEuMCk7XG5cbiAgZ2xfRnJhZ0NvbG9yID0gbGl0Q29sb3IgKiBvcGFjaXR5O1xufSIsYT0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjtcbmF0dHJpYnV0ZSB2ZWM0IGNvbG9yO1xuYXR0cmlidXRlIHZlYzIgdXY7XG5cbnVuaWZvcm0gbWF0NCBtb2RlbCwgdmlldywgcHJvamVjdGlvbjtcblxudmFyeWluZyB2ZWM0IGZfY29sb3I7XG52YXJ5aW5nIHZlYzMgZl9kYXRhO1xudmFyeWluZyB2ZWMyIGZfdXY7XG5cbnZvaWQgbWFpbigpIHtcbiAgZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uICogdmlldyAqIG1vZGVsICogdmVjNChwb3NpdGlvbiwgMS4wKTtcbiAgZl9jb2xvciA9IGNvbG9yO1xuICBmX2RhdGEgID0gcG9zaXRpb247XG4gIGZfdXYgICAgPSB1djtcbn0iLG89InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxudW5pZm9ybSB2ZWMzIGNsaXBCb3VuZHNbMl07XG51bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuXG52YXJ5aW5nIHZlYzQgZl9jb2xvcjtcbnZhcnlpbmcgdmVjMyBmX2RhdGE7XG52YXJ5aW5nIHZlYzIgZl91djtcblxudm9pZCBtYWluKCkge1xuICBpZihhbnkobGVzc1RoYW4oZl9kYXRhLCBjbGlwQm91bmRzWzBdKSkgfHwgXG4gICAgIGFueShncmVhdGVyVGhhbihmX2RhdGEsIGNsaXBCb3VuZHNbMV0pKSkge1xuICAgIGRpc2NhcmQ7XG4gIH1cblxuICBnbF9GcmFnQ29sb3IgPSBmX2NvbG9yICogdGV4dHVyZTJEKHRleHR1cmUsIGZfdXYpICogb3BhY2l0eTtcbn0iLHM9InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxuYXR0cmlidXRlIHZlYzMgcG9zaXRpb247XG5hdHRyaWJ1dGUgdmVjNCBjb2xvcjtcbmF0dHJpYnV0ZSB2ZWMyIHV2O1xuYXR0cmlidXRlIGZsb2F0IHBvaW50U2l6ZTtcblxudW5pZm9ybSBtYXQ0IG1vZGVsLCB2aWV3LCBwcm9qZWN0aW9uO1xudW5pZm9ybSB2ZWMzIGNsaXBCb3VuZHNbMl07XG5cbnZhcnlpbmcgdmVjNCBmX2NvbG9yO1xudmFyeWluZyB2ZWMyIGZfdXY7XG5cbnZvaWQgbWFpbigpIHtcbiAgaWYoYW55KGxlc3NUaGFuKHBvc2l0aW9uLCBjbGlwQm91bmRzWzBdKSkgfHwgXG4gICAgIGFueShncmVhdGVyVGhhbihwb3NpdGlvbiwgY2xpcEJvdW5kc1sxXSkpKSB7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KDAsMCwwLDApO1xuICB9IGVsc2Uge1xuICAgIGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbiAqIHZpZXcgKiBtb2RlbCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XG4gIH1cbiAgZ2xfUG9pbnRTaXplID0gcG9pbnRTaXplO1xuICBmX2NvbG9yID0gY29sb3I7XG4gIGZfdXYgPSB1djtcbn0iLGw9InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxudW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcblxudmFyeWluZyB2ZWM0IGZfY29sb3I7XG52YXJ5aW5nIHZlYzIgZl91djtcblxudm9pZCBtYWluKCkge1xuICB2ZWMyIHBvaW50UiA9IGdsX1BvaW50Q29vcmQueHkgLSB2ZWMyKDAuNSwwLjUpO1xuICBpZihkb3QocG9pbnRSLCBwb2ludFIpID4gMC4yNSkge1xuICAgIGRpc2NhcmQ7XG4gIH1cbiAgZ2xfRnJhZ0NvbG9yID0gZl9jb2xvciAqIHRleHR1cmUyRCh0ZXh0dXJlLCBmX3V2KSAqIG9wYWNpdHk7XG59Iix1PSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbmF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uO1xuYXR0cmlidXRlIHZlYzQgaWQ7XG5cbnVuaWZvcm0gbWF0NCBtb2RlbCwgdmlldywgcHJvamVjdGlvbjtcblxudmFyeWluZyB2ZWMzIGZfcG9zaXRpb247XG52YXJ5aW5nIHZlYzQgZl9pZDtcblxudm9pZCBtYWluKCkge1xuICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb24gKiB2aWV3ICogbW9kZWwgKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xuICBmX2lkICAgICAgICA9IGlkO1xuICBmX3Bvc2l0aW9uICA9IHBvc2l0aW9uO1xufSIsYz0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG51bmlmb3JtIHZlYzMgIGNsaXBCb3VuZHNbMl07XG51bmlmb3JtIGZsb2F0IHBpY2tJZDtcblxudmFyeWluZyB2ZWMzIGZfcG9zaXRpb247XG52YXJ5aW5nIHZlYzQgZl9pZDtcblxudm9pZCBtYWluKCkge1xuICBpZihhbnkobGVzc1RoYW4oZl9wb3NpdGlvbiwgY2xpcEJvdW5kc1swXSkpIHx8IFxuICAgICBhbnkoZ3JlYXRlclRoYW4oZl9wb3NpdGlvbiwgY2xpcEJvdW5kc1sxXSkpKSB7XG4gICAgZGlzY2FyZDtcbiAgfVxuICBnbF9GcmFnQ29sb3IgPSB2ZWM0KHBpY2tJZCwgZl9pZC54eXopO1xufSIsaD0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG5hdHRyaWJ1dGUgdmVjMyAgcG9zaXRpb247XG5hdHRyaWJ1dGUgZmxvYXQgcG9pbnRTaXplO1xuYXR0cmlidXRlIHZlYzQgIGlkO1xuXG51bmlmb3JtIG1hdDQgbW9kZWwsIHZpZXcsIHByb2plY3Rpb247XG51bmlmb3JtIHZlYzMgY2xpcEJvdW5kc1syXTtcblxudmFyeWluZyB2ZWMzIGZfcG9zaXRpb247XG52YXJ5aW5nIHZlYzQgZl9pZDtcblxudm9pZCBtYWluKCkge1xuICBpZihhbnkobGVzc1RoYW4ocG9zaXRpb24sIGNsaXBCb3VuZHNbMF0pKSB8fCBcbiAgICAgYW55KGdyZWF0ZXJUaGFuKHBvc2l0aW9uLCBjbGlwQm91bmRzWzFdKSkpIHtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoMCwwLDAsMCk7XG4gIH0gZWxzZSB7XG4gICAgZ2xfUG9zaXRpb24gID0gcHJvamVjdGlvbiAqIHZpZXcgKiBtb2RlbCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XG4gICAgZ2xfUG9pbnRTaXplID0gcG9pbnRTaXplO1xuICB9XG4gIGZfaWQgICAgICAgICA9IGlkO1xuICBmX3Bvc2l0aW9uICAgPSBwb3NpdGlvbjtcbn0iLGY9InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxuYXR0cmlidXRlIHZlYzMgcG9zaXRpb247XG5cbnVuaWZvcm0gbWF0NCBtb2RlbCwgdmlldywgcHJvamVjdGlvbjtcblxudm9pZCBtYWluKCkge1xuICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb24gKiB2aWV3ICogbW9kZWwgKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xufSIsZD0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG51bmlmb3JtIHZlYzMgY29udG91ckNvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gIGdsX0ZyYWdDb2xvciA9IHZlYzQoY29udG91ckNvbG9yLDEpO1xufVxuIjtyLm1lc2hTaGFkZXI9e3ZlcnRleDpuLGZyYWdtZW50OmksYXR0cmlidXRlczpbe25hbWU6InBvc2l0aW9uIix0eXBlOiJ2ZWMzIn0se25hbWU6Im5vcm1hbCIsdHlwZToidmVjMyJ9LHtuYW1lOiJjb2xvciIsdHlwZToidmVjNCJ9LHtuYW1lOiJ1diIsdHlwZToidmVjMiJ9XX0sci53aXJlU2hhZGVyPXt2ZXJ0ZXg6YSxmcmFnbWVudDpvLGF0dHJpYnV0ZXM6W3tuYW1lOiJwb3NpdGlvbiIsdHlwZToidmVjMyJ9LHtuYW1lOiJjb2xvciIsdHlwZToidmVjNCJ9LHtuYW1lOiJ1diIsdHlwZToidmVjMiJ9XX0sci5wb2ludFNoYWRlcj17dmVydGV4OnMsZnJhZ21lbnQ6bCxhdHRyaWJ1dGVzOlt7bmFtZToicG9zaXRpb24iLHR5cGU6InZlYzMifSx7bmFtZToiY29sb3IiLHR5cGU6InZlYzQifSx7bmFtZToidXYiLHR5cGU6InZlYzIifSx7bmFtZToicG9pbnRTaXplIix0eXBlOiJmbG9hdCJ9XX0sci5waWNrU2hhZGVyPXt2ZXJ0ZXg6dSxmcmFnbWVudDpjLGF0dHJpYnV0ZXM6W3tuYW1lOiJwb3NpdGlvbiIsdHlwZToidmVjMyJ9LHtuYW1lOiJpZCIsdHlwZToidmVjNCJ9XX0sci5wb2ludFBpY2tTaGFkZXI9e3ZlcnRleDpoLGZyYWdtZW50OmMsYXR0cmlidXRlczpbe25hbWU6InBvc2l0aW9uIix0eXBlOiJ2ZWMzIn0se25hbWU6InBvaW50U2l6ZSIsdHlwZToiZmxvYXQifSx7bmFtZToiaWQiLHR5cGU6InZlYzQifV19LHIuY29udG91clNoYWRlcj17dmVydGV4OmYsZnJhZ21lbnQ6ZCxhdHRyaWJ1dGVzOlt7bmFtZToicG9zaXRpb24iLHR5cGU6InZlYzMifV19fSx7fV0sMTczOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbixpLGEsbyxzLGwsdSxjLGgsZixkLHAsZyxtLHYseSx4LGIsXyx3LE0sQSxrLFQpe3RoaXMuZ2w9dCx0aGlzLmNlbGxzPVtdLHRoaXMucG9zaXRpb25zPVtdLHRoaXMuaW50ZW5zaXR5PVtdLHRoaXMudGV4dHVyZT1lLHRoaXMuZGlydHk9ITAsdGhpcy50cmlTaGFkZXI9cix0aGlzLmxpbmVTaGFkZXI9bix0aGlzLnBvaW50U2hhZGVyPWksdGhpcy5waWNrU2hhZGVyPWEsdGhpcy5wb2ludFBpY2tTaGFkZXI9byx0aGlzLmNvbnRvdXJTaGFkZXI9cyx0aGlzLnRyaWFuZ2xlUG9zaXRpb25zPWwsdGhpcy50cmlhbmdsZUNvbG9ycz1jLHRoaXMudHJpYW5nbGVOb3JtYWxzPWYsdGhpcy50cmlhbmdsZVVWcz1oLHRoaXMudHJpYW5nbGVJZHM9dSx0aGlzLnRyaWFuZ2xlVkFPPWQsdGhpcy50cmlhbmdsZUNvdW50PTAsdGhpcy5saW5lV2lkdGg9MSx0aGlzLmVkZ2VQb3NpdGlvbnM9cCx0aGlzLmVkZ2VDb2xvcnM9bSx0aGlzLmVkZ2VVVnM9dix0aGlzLmVkZ2VJZHM9Zyx0aGlzLmVkZ2VWQU89eSx0aGlzLmVkZ2VDb3VudD0wLHRoaXMucG9pbnRQb3NpdGlvbnM9eCx0aGlzLnBvaW50Q29sb3JzPV8sdGhpcy5wb2ludFVWcz13LHRoaXMucG9pbnRTaXplcz1NLHRoaXMucG9pbnRJZHM9Yix0aGlzLnBvaW50VkFPPUEsdGhpcy5wb2ludENvdW50PTAsdGhpcy5jb250b3VyTGluZVdpZHRoPTEsdGhpcy5jb250b3VyUG9zaXRpb25zPWssdGhpcy5jb250b3VyVkFPPVQsdGhpcy5jb250b3VyQ291bnQ9MCx0aGlzLmNvbnRvdXJDb2xvcj1bMCwwLDBdLHRoaXMuY29udG91ckVuYWJsZT0hMCx0aGlzLnBpY2tJZD0xLHRoaXMuYm91bmRzPVtbMS8wLDEvMCwxLzBdLFstKDEvMCksLSgxLzApLC0oMS8wKV1dLHRoaXMuY2xpcEJvdW5kcz1bWy0oMS8wKSwtKDEvMCksLSgxLzApXSxbMS8wLDEvMCwxLzBdXSx0aGlzLmxpZ2h0UG9zaXRpb249WzFlNSwxZTUsMF0sdGhpcy5hbWJpZW50TGlnaHQ9LjgsdGhpcy5kaWZmdXNlTGlnaHQ9LjgsdGhpcy5zcGVjdWxhckxpZ2h0PTIsdGhpcy5yb3VnaG5lc3M9LjUsdGhpcy5mcmVzbmVsPTEuNSx0aGlzLm9wYWNpdHk9MSx0aGlzLl9tb2RlbD1SLHRoaXMuX3ZpZXc9Uix0aGlzLl9wcm9qZWN0aW9uPVIsdGhpcy5fcmVzb2x1dGlvbj1bMSwxXX1mdW5jdGlvbiBpKHQpe2Zvcih2YXIgZT1BKHtjb2xvcm1hcDp0LG5zaGFkZXM6MjU2LGZvcm1hdDoicmdiYSJ9KSxyPW5ldyBVaW50OEFycmF5KDEwMjQpLG49MDtuPDI1NjsrK24pe2Zvcih2YXIgaT1lW25dLGE9MDthPDM7KythKXJbNCpuK2FdPWlbYV07cls0Km4rM109MjU1KmlbM119cmV0dXJuIE0ocixbMjU2LDI1Niw0XSxbNCwwLDFdKX1mdW5jdGlvbiBhKHQsZSxyKXtmb3IodmFyIG49bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKW5baV09MDtmb3IodmFyIGE9dC5sZW5ndGgsaT0wO2k8YTsrK2kpZm9yKHZhciBvPXRbaV0scz0wO3M8by5sZW5ndGg7KytzKW5bb1tzXV09cltpXTtyZXR1cm4gbn1mdW5jdGlvbiBvKHQpe2Zvcih2YXIgZT10Lmxlbmd0aCxyPW5ldyBBcnJheShlKSxuPTA7bjxlOysrbilyW25dPXRbbl1bMl07cmV0dXJuIHJ9ZnVuY3Rpb24gcyh0KXt2YXIgZT1tKHQsTCk7cmV0dXJuIGUuYXR0cmlidXRlcy5wb3NpdGlvbi5sb2NhdGlvbj0wLGUuYXR0cmlidXRlcy5jb2xvci5sb2NhdGlvbj0yLGUuYXR0cmlidXRlcy51di5sb2NhdGlvbj0zLGUuYXR0cmlidXRlcy5ub3JtYWwubG9jYXRpb249NCxlfWZ1bmN0aW9uIGwodCl7dmFyIGU9bSh0LHopO3JldHVybiBlLmF0dHJpYnV0ZXMucG9zaXRpb24ubG9jYXRpb249MCxlLmF0dHJpYnV0ZXMuY29sb3IubG9jYXRpb249MixlLmF0dHJpYnV0ZXMudXYubG9jYXRpb249MyxlfWZ1bmN0aW9uIHUodCl7dmFyIGU9bSh0LEMpO3JldHVybiBlLmF0dHJpYnV0ZXMucG9zaXRpb24ubG9jYXRpb249MCxlLmF0dHJpYnV0ZXMuY29sb3IubG9jYXRpb249MixlLmF0dHJpYnV0ZXMudXYubG9jYXRpb249MyxlLmF0dHJpYnV0ZXMucG9pbnRTaXplLmxvY2F0aW9uPTQsZX1mdW5jdGlvbiBjKHQpe3ZhciBlPW0odCxJKTtyZXR1cm4gZS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmxvY2F0aW9uPTAsZS5hdHRyaWJ1dGVzLmlkLmxvY2F0aW9uPTEsZX1mdW5jdGlvbiBoKHQpe3ZhciBlPW0odCxQKTtyZXR1cm4gZS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmxvY2F0aW9uPTAsZS5hdHRyaWJ1dGVzLmlkLmxvY2F0aW9uPTEsZS5hdHRyaWJ1dGVzLnBvaW50U2l6ZS5sb2NhdGlvbj00LGV9ZnVuY3Rpb24gZih0KXt2YXIgZT1tKHQsRCk7cmV0dXJuIGUuYXR0cmlidXRlcy5wb3NpdGlvbi5sb2NhdGlvbj0wLGV9ZnVuY3Rpb24gZCh0KXt2YXIgZT10LmdsLHI9cyhlKSxpPWwoZSksYT11KGUpLG89YyhlKSxkPWgoZSkscD1mKGUpLGc9eChlLE0obmV3IFVpbnQ4QXJyYXkoWzI1NSwyNTUsMjU1LDI1NV0pLFsxLDEsNF0pKTtnLmdlbmVyYXRlTWlwbWFwKCksZy5taW5GaWx0ZXI9ZS5MSU5FQVJfTUlQTUFQX0xJTkVBUixnLm1hZ0ZpbHRlcj1lLkxJTkVBUjt2YXIgbT12KGUpLGI9dihlKSxfPXYoZSksdz12KGUpLEE9dihlKSxrPXkoZSxbe2J1ZmZlcjptLHR5cGU6ZS5GTE9BVCxzaXplOjN9LHtidWZmZXI6QSx0eXBlOmUuVU5TSUdORURfQllURSxzaXplOjQsbm9ybWFsaXplZDohMH0se2J1ZmZlcjpiLHR5cGU6ZS5GTE9BVCxzaXplOjR9LHtidWZmZXI6Xyx0eXBlOmUuRkxPQVQsc2l6ZToyfSx7YnVmZmVyOncsdHlwZTplLkZMT0FULHNpemU6M31dKSxUPXYoZSksRT12KGUpLFM9dihlKSxMPXYoZSksej15KGUsW3tidWZmZXI6VCx0eXBlOmUuRkxPQVQsc2l6ZTozfSx7YnVmZmVyOkwsdHlwZTplLlVOU0lHTkVEX0JZVEUsc2l6ZTo0LG5vcm1hbGl6ZWQ6ITB9LHtidWZmZXI6RSx0eXBlOmUuRkxPQVQsc2l6ZTo0fSx7YnVmZmVyOlMsdHlwZTplLkZMT0FULHNpemU6Mn1dKSxDPXYoZSksST12KGUpLFA9dihlKSxEPXYoZSksUj12KGUpLE89eShlLFt7YnVmZmVyOkMsdHlwZTplLkZMT0FULHNpemU6M30se2J1ZmZlcjpSLHR5cGU6ZS5VTlNJR05FRF9CWVRFLHNpemU6NCxub3JtYWxpemVkOiEwfSx7YnVmZmVyOkksdHlwZTplLkZMT0FULHNpemU6NH0se2J1ZmZlcjpQLHR5cGU6ZS5GTE9BVCxzaXplOjJ9LHtidWZmZXI6RCx0eXBlOmUuRkxPQVQsc2l6ZToxfV0pLEY9dihlKSxqPXkoZSxbe2J1ZmZlcjpGLHR5cGU6ZS5GTE9BVCxzaXplOjN9XSksTj1uZXcgbihlLGcscixpLGEsbyxkLHAsbSxBLGIsXyx3LGssVCxMLEUsUyx6LEMsUixJLFAsRCxPLEYsaik7cmV0dXJuIE4udXBkYXRlKHQpLE59dmFyIHA9MWUtNixnPTFlLTYsbT10KCJnbC1zaGFkZXIiKSx2PXQoImdsLWJ1ZmZlciIpLHk9dCgiZ2wtdmFvIikseD10KCJnbC10ZXh0dXJlMmQiKSxiPXQoIm5vcm1hbHMiKSxfPXQoImdsLW1hdDQvbXVsdGlwbHkiKSx3PXQoImdsLW1hdDQvaW52ZXJ0IiksTT10KCJuZGFycmF5IiksQT10KCJjb2xvcm1hcCIpLGs9dCgic2ltcGxpY2lhbC1jb21wbGV4LWNvbnRvdXIiKSxUPXQoInR5cGVkYXJyYXktcG9vbCIpLEU9dCgiLi9saWIvc2hhZGVycyIpLFM9dCgiLi9saWIvY2xvc2VzdC1wb2ludCIpLEw9RS5tZXNoU2hhZGVyLHo9RS53aXJlU2hhZGVyLEM9RS5wb2ludFNoYWRlcixJPUUucGlja1NoYWRlcixQPUUucG9pbnRQaWNrU2hhZGVyLEQ9RS5jb250b3VyU2hhZGVyLFI9WzEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDFdLE89bi5wcm90b3R5cGU7Ty5pc09wYXF1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wYWNpdHk+PTF9LE8uaXNUcmFuc3BhcmVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wYWNpdHk8MX0sTy5waWNrU2xvdHM9MSxPLnNldFBpY2tCYXNlPWZ1bmN0aW9uKHQpe3RoaXMucGlja0lkPXR9LE8uaGlnaGxpZ2h0PWZ1bmN0aW9uKHQpe2lmKCF0fHwhdGhpcy5jb250b3VyRW5hYmxlKXJldHVybiB2b2lkKHRoaXMuY29udG91ckNvdW50PTApO2Zvcih2YXIgZT1rKHRoaXMuY2VsbHMsdGhpcy5pbnRlbnNpdHksdC5pbnRlbnNpdHkpLHI9ZS5jZWxscyxuPWUudmVydGV4SWRzLGk9ZS52ZXJ0ZXhXZWlnaHRzLGE9ci5sZW5ndGgsbz1ULm1hbGxvY0Zsb2F0MzIoNiphKSxzPTAsbD0wO2w8YTsrK2wpZm9yKHZhciB1PXJbbF0sYz0wO2M8MjsrK2Mpe3ZhciBoPXVbMF07Mj09PXUubGVuZ3RoJiYoaD11W2NdKTtmb3IodmFyIGY9bltoXVswXSxkPW5baF1bMV0scD1pW2hdLGc9MS1wLG09dGhpcy5wb3NpdGlvbnNbZl0sdj10aGlzLnBvc2l0aW9uc1tkXSx5PTA7eTwzOysreSlvW3MrK109cCptW3ldK2cqdlt5XX10aGlzLmNvbnRvdXJDb3VudD1zLzN8MCx0aGlzLmNvbnRvdXJQb3NpdGlvbnMudXBkYXRlKG8uc3ViYXJyYXkoMCxzKSksVC5mcmVlKG8pfSxPLnVwZGF0ZT1mdW5jdGlvbih0KXt0PXR8fHt9O3ZhciBlPXRoaXMuZ2w7dGhpcy5kaXJ0eT0hMCwiY29udG91ckVuYWJsZSJpbiB0JiYodGhpcy5jb250b3VyRW5hYmxlPXQuY29udG91ckVuYWJsZSksImNvbnRvdXJDb2xvciJpbiB0JiYodGhpcy5jb250b3VyQ29sb3I9dC5jb250b3VyQ29sb3IpLCJsaW5lV2lkdGgiaW4gdCYmKHRoaXMubGluZVdpZHRoPXQubGluZVdpZHRoKSwibGlnaHRQb3NpdGlvbiJpbiB0JiYodGhpcy5saWdodFBvc2l0aW9uPXQubGlnaHRQb3NpdGlvbiksIm9wYWNpdHkiaW4gdCYmKHRoaXMub3BhY2l0eT10Lm9wYWNpdHkpLCJhbWJpZW50ImluIHQmJih0aGlzLmFtYmllbnRMaWdodD10LmFtYmllbnQpLCJkaWZmdXNlImluIHQmJih0aGlzLmRpZmZ1c2VMaWdodD10LmRpZmZ1c2UpLCJzcGVjdWxhciJpbiB0JiYodGhpcy5zcGVjdWxhckxpZ2h0PXQuc3BlY3VsYXIpLCJyb3VnaG5lc3MiaW4gdCYmKHRoaXMucm91Z2huZXNzPXQucm91Z2huZXNzKSwiZnJlc25lbCJpbiB0JiYodGhpcy5mcmVzbmVsPXQuZnJlc25lbCksdC50ZXh0dXJlPyh0aGlzLnRleHR1cmUuZGlzcG9zZSgpLHRoaXMudGV4dHVyZT14KGUsdC50ZXh0dXJlKSk6dC5jb2xvcm1hcCYmKHRoaXMudGV4dHVyZS5zaGFwZT1bMjU2LDI1Nl0sdGhpcy50ZXh0dXJlLm1pbkZpbHRlcj1lLkxJTkVBUl9NSVBNQVBfTElORUFSLHRoaXMudGV4dHVyZS5tYWdGaWx0ZXI9ZS5MSU5FQVIsdGhpcy50ZXh0dXJlLnNldFBpeGVscyhpKHQuY29sb3JtYXApKSwKdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwKCkpO3ZhciByPXQuY2VsbHMsbj10LnBvc2l0aW9ucztpZihuJiZyKXt2YXIgcz1bXSxsPVtdLHU9W10sYz1bXSxoPVtdLGY9W10sZD1bXSxtPVtdLHY9W10seT1bXSxfPVtdLHc9W10sTT1bXSxBPVtdO3RoaXMuY2VsbHM9cix0aGlzLnBvc2l0aW9ucz1uO3ZhciBrPXQudmVydGV4Tm9ybWFscyxUPXQuY2VsbE5vcm1hbHMsRT12b2lkIDA9PT10LnZlcnRleE5vcm1hbHNFcHNpbG9uP3A6dC52ZXJ0ZXhOb3JtYWxzRXBzaWxvbixTPXZvaWQgMD09PXQuZmFjZU5vcm1hbHNFcHNpbG9uP2c6dC5mYWNlTm9ybWFsc0Vwc2lsb247dC51c2VGYWNldE5vcm1hbHMmJiFUJiYoVD1iLmZhY2VOb3JtYWxzKHIsbixTKSksVHx8a3x8KGs9Yi52ZXJ0ZXhOb3JtYWxzKHIsbixFKSk7dmFyIEw9dC52ZXJ0ZXhDb2xvcnMsej10LmNlbGxDb2xvcnMsQz10Lm1lc2hDb2xvcnx8WzEsMSwxLDFdLEk9dC52ZXJ0ZXhVVnMsUD10LnZlcnRleEludGVuc2l0eSxEPXQuY2VsbFVWcyxSPXQuY2VsbEludGVuc2l0eSxPPTEvMCxGPS0oMS8wKTtpZighSSYmIUQpaWYoUClmb3IodmFyIGo9MDtqPFAubGVuZ3RoOysrail7dmFyIE49UFtqXTtPPU1hdGgubWluKE8sTiksRj1NYXRoLm1heChGLE4pfWVsc2UgaWYoUilmb3IodmFyIGo9MDtqPFIubGVuZ3RoOysrail7dmFyIE49UltqXTtPPU1hdGgubWluKE8sTiksRj1NYXRoLm1heChGLE4pfWVsc2UgZm9yKHZhciBqPTA7ajxuLmxlbmd0aDsrK2ope3ZhciBOPW5bal1bMl07Tz1NYXRoLm1pbihPLE4pLEY9TWF0aC5tYXgoRixOKX1QP3RoaXMuaW50ZW5zaXR5PVA6Uj90aGlzLmludGVuc2l0eT1hKHIsbi5sZW5ndGgsUik6dGhpcy5pbnRlbnNpdHk9byhuKTt2YXIgQj10LnBvaW50U2l6ZXMsVT10LnBvaW50U2l6ZXx8MTt0aGlzLmJvdW5kcz1bWzEvMCwxLzAsMS8wXSxbLSgxLzApLC0oMS8wKSwtKDEvMCldXTtmb3IodmFyIGo9MDtqPG4ubGVuZ3RoOysrailmb3IodmFyIFY9bltqXSxxPTA7cTwzOysrcSkhaXNOYU4oVltxXSkmJmlzRmluaXRlKFZbcV0pJiYodGhpcy5ib3VuZHNbMF1bcV09TWF0aC5taW4odGhpcy5ib3VuZHNbMF1bcV0sVltxXSksdGhpcy5ib3VuZHNbMV1bcV09TWF0aC5tYXgodGhpcy5ib3VuZHNbMV1bcV0sVltxXSkpO3ZhciBIPTAsRz0wLFg9MDt0OmZvcih2YXIgaj0wO2o8ci5sZW5ndGg7KytqKXt2YXIgWT1yW2pdO3N3aXRjaChZLmxlbmd0aCl7Y2FzZSAxOmZvcih2YXIgVz1ZWzBdLFY9bltXXSxxPTA7cTwzOysrcSlpZihpc05hTihWW3FdKXx8IWlzRmluaXRlKFZbcV0pKWNvbnRpbnVlIHQ7eS5wdXNoKFZbMF0sVlsxXSxWWzJdKTt2YXIgWjtaPUw/TFtXXTp6P3pbal06QywzPT09Wi5sZW5ndGg/Xy5wdXNoKFpbMF0sWlsxXSxaWzJdLDEpOl8ucHVzaChaWzBdLFpbMV0sWlsyXSxaWzNdKTt2YXIgUTtRPUk/SVtXXTpQP1soUFtXXS1PKS8oRi1PKSwwXTpEP0Rbal06Uj9bKFJbal0tTykvKEYtTyksMF06WyhWWzJdLU8pLyhGLU8pLDBdLHcucHVzaChRWzBdLFFbMV0pLEI/TS5wdXNoKEJbV10pOk0ucHVzaChVKSxBLnB1c2goaiksWCs9MTticmVhaztjYXNlIDI6Zm9yKHZhciBxPTA7cTwyOysrcSlmb3IodmFyIFc9WVtxXSxWPW5bV10sSz0wO0s8MzsrK0spaWYoaXNOYU4oVltLXSl8fCFpc0Zpbml0ZShWW0tdKSljb250aW51ZSB0O2Zvcih2YXIgcT0wO3E8MjsrK3Epe3ZhciBXPVlbcV0sVj1uW1ddO2YucHVzaChWWzBdLFZbMV0sVlsyXSk7dmFyIFo7Wj1MP0xbV106ej96W2pdOkMsMz09PVoubGVuZ3RoP2QucHVzaChaWzBdLFpbMV0sWlsyXSwxKTpkLnB1c2goWlswXSxaWzFdLFpbMl0sWlszXSk7dmFyIFE7UT1JP0lbV106UD9bKFBbV10tTykvKEYtTyksMF06RD9EW2pdOlI/WyhSW2pdLU8pLyhGLU8pLDBdOlsoVlsyXS1PKS8oRi1PKSwwXSxtLnB1c2goUVswXSxRWzFdKSx2LnB1c2goail9Rys9MTticmVhaztjYXNlIDM6Zm9yKHZhciBxPTA7cTwzOysrcSlmb3IodmFyIFc9WVtxXSxWPW5bV10sSz0wO0s8MzsrK0spaWYoaXNOYU4oVltLXSl8fCFpc0Zpbml0ZShWW0tdKSljb250aW51ZSB0O2Zvcih2YXIgcT0wO3E8MzsrK3Epe3ZhciBXPVlbcV0sVj1uW1ddO3MucHVzaChWWzBdLFZbMV0sVlsyXSk7dmFyIFo7Wj1MP0xbV106ej96W2pdOkMsMz09PVoubGVuZ3RoP2wucHVzaChaWzBdLFpbMV0sWlsyXSwxKTpsLnB1c2goWlswXSxaWzFdLFpbMl0sWlszXSk7dmFyIFE7UT1JP0lbV106UD9bKFBbV10tTykvKEYtTyksMF06RD9EW2pdOlI/WyhSW2pdLU8pLyhGLU8pLDBdOlsoVlsyXS1PKS8oRi1PKSwwXSxjLnB1c2goUVswXSxRWzFdKTt2YXIgJDskPWs/a1tXXTpUW2pdLHUucHVzaCgkWzBdLCRbMV0sJFsyXSksaC5wdXNoKGopfUgrPTF9fXRoaXMucG9pbnRDb3VudD1YLHRoaXMuZWRnZUNvdW50PUcsdGhpcy50cmlhbmdsZUNvdW50PUgsdGhpcy5wb2ludFBvc2l0aW9ucy51cGRhdGUoeSksdGhpcy5wb2ludENvbG9ycy51cGRhdGUoXyksdGhpcy5wb2ludFVWcy51cGRhdGUodyksdGhpcy5wb2ludFNpemVzLnVwZGF0ZShNKSx0aGlzLnBvaW50SWRzLnVwZGF0ZShuZXcgVWludDMyQXJyYXkoQSkpLHRoaXMuZWRnZVBvc2l0aW9ucy51cGRhdGUoZiksdGhpcy5lZGdlQ29sb3JzLnVwZGF0ZShkKSx0aGlzLmVkZ2VVVnMudXBkYXRlKG0pLHRoaXMuZWRnZUlkcy51cGRhdGUobmV3IFVpbnQzMkFycmF5KHYpKSx0aGlzLnRyaWFuZ2xlUG9zaXRpb25zLnVwZGF0ZShzKSx0aGlzLnRyaWFuZ2xlQ29sb3JzLnVwZGF0ZShsKSx0aGlzLnRyaWFuZ2xlVVZzLnVwZGF0ZShjKSx0aGlzLnRyaWFuZ2xlTm9ybWFscy51cGRhdGUodSksdGhpcy50cmlhbmdsZUlkcy51cGRhdGUobmV3IFVpbnQzMkFycmF5KGgpKX19LE8uZHJhd1RyYW5zcGFyZW50PU8uZHJhdz1mdW5jdGlvbih0KXt0PXR8fHt9O2Zvcih2YXIgZT10aGlzLmdsLHI9dC5tb2RlbHx8UixuPXQudmlld3x8UixpPXQucHJvamVjdGlvbnx8UixhPVtbLTFlNiwtMWU2LC0xZTZdLFsxZTYsMWU2LDFlNl1dLG89MDtvPDM7KytvKWFbMF1bb109TWF0aC5tYXgoYVswXVtvXSx0aGlzLmNsaXBCb3VuZHNbMF1bb10pLGFbMV1bb109TWF0aC5taW4oYVsxXVtvXSx0aGlzLmNsaXBCb3VuZHNbMV1bb10pO3ZhciBzPXttb2RlbDpyLHZpZXc6bixwcm9qZWN0aW9uOmksY2xpcEJvdW5kczphLGthbWJpZW50OnRoaXMuYW1iaWVudExpZ2h0LGtkaWZmdXNlOnRoaXMuZGlmZnVzZUxpZ2h0LGtzcGVjdWxhcjp0aGlzLnNwZWN1bGFyTGlnaHQscm91Z2huZXNzOnRoaXMucm91Z2huZXNzLGZyZXNuZWw6dGhpcy5mcmVzbmVsLGV5ZVBvc2l0aW9uOlswLDAsMF0sbGlnaHRQb3NpdGlvbjpbMCwwLDBdLG9wYWNpdHk6dGhpcy5vcGFjaXR5LGNvbnRvdXJDb2xvcjp0aGlzLmNvbnRvdXJDb2xvcix0ZXh0dXJlOjB9O3RoaXMudGV4dHVyZS5iaW5kKDApO3ZhciBsPW5ldyBBcnJheSgxNik7XyhsLHMudmlldyxzLm1vZGVsKSxfKGwscy5wcm9qZWN0aW9uLGwpLHcobCxsKTtmb3IodmFyIG89MDtvPDM7KytvKXMuZXllUG9zaXRpb25bb109bFsxMitvXS9sWzE1XTtmb3IodmFyIHU9bFsxNV0sbz0wO288MzsrK28pdSs9dGhpcy5saWdodFBvc2l0aW9uW29dKmxbNCpvKzNdO2Zvcih2YXIgbz0wO288MzsrK28pe2Zvcih2YXIgYz1sWzEyK29dLGg9MDtoPDM7KytoKWMrPWxbNCpoK29dKnRoaXMubGlnaHRQb3NpdGlvbltoXTtzLmxpZ2h0UG9zaXRpb25bb109Yy91fWlmKHRoaXMudHJpYW5nbGVDb3VudD4wKXt2YXIgZj10aGlzLnRyaVNoYWRlcjtmLmJpbmQoKSxmLnVuaWZvcm1zPXMsdGhpcy50cmlhbmdsZVZBTy5iaW5kKCksZS5kcmF3QXJyYXlzKGUuVFJJQU5HTEVTLDAsMyp0aGlzLnRyaWFuZ2xlQ291bnQpLHRoaXMudHJpYW5nbGVWQU8udW5iaW5kKCl9aWYodGhpcy5lZGdlQ291bnQ+MCYmdGhpcy5saW5lV2lkdGg+MCl7dmFyIGY9dGhpcy5saW5lU2hhZGVyO2YuYmluZCgpLGYudW5pZm9ybXM9cyx0aGlzLmVkZ2VWQU8uYmluZCgpLGUubGluZVdpZHRoKHRoaXMubGluZVdpZHRoKSxlLmRyYXdBcnJheXMoZS5MSU5FUywwLDIqdGhpcy5lZGdlQ291bnQpLHRoaXMuZWRnZVZBTy51bmJpbmQoKX1pZih0aGlzLnBvaW50Q291bnQ+MCl7dmFyIGY9dGhpcy5wb2ludFNoYWRlcjtmLmJpbmQoKSxmLnVuaWZvcm1zPXMsdGhpcy5wb2ludFZBTy5iaW5kKCksZS5kcmF3QXJyYXlzKGUuUE9JTlRTLDAsdGhpcy5wb2ludENvdW50KSx0aGlzLnBvaW50VkFPLnVuYmluZCgpfWlmKHRoaXMuY29udG91ckVuYWJsZSYmdGhpcy5jb250b3VyQ291bnQ+MCYmdGhpcy5jb250b3VyTGluZVdpZHRoPjApe3ZhciBmPXRoaXMuY29udG91clNoYWRlcjtmLmJpbmQoKSxmLnVuaWZvcm1zPXMsdGhpcy5jb250b3VyVkFPLmJpbmQoKSxlLmRyYXdBcnJheXMoZS5MSU5FUywwLHRoaXMuY29udG91ckNvdW50KSx0aGlzLmNvbnRvdXJWQU8udW5iaW5kKCl9fSxPLmRyYXdQaWNrPWZ1bmN0aW9uKHQpe3Q9dHx8e307Zm9yKHZhciBlPXRoaXMuZ2wscj10Lm1vZGVsfHxSLG49dC52aWV3fHxSLGk9dC5wcm9qZWN0aW9ufHxSLGE9W1stMWU2LC0xZTYsLTFlNl0sWzFlNiwxZTYsMWU2XV0sbz0wO288MzsrK28pYVswXVtvXT1NYXRoLm1heChhWzBdW29dLHRoaXMuY2xpcEJvdW5kc1swXVtvXSksYVsxXVtvXT1NYXRoLm1pbihhWzFdW29dLHRoaXMuY2xpcEJvdW5kc1sxXVtvXSk7dGhpcy5fbW9kZWw9W10uc2xpY2UuY2FsbChyKSx0aGlzLl92aWV3PVtdLnNsaWNlLmNhbGwobiksdGhpcy5fcHJvamVjdGlvbj1bXS5zbGljZS5jYWxsKGkpLHRoaXMuX3Jlc29sdXRpb249W2UuZHJhd2luZ0J1ZmZlcldpZHRoLGUuZHJhd2luZ0J1ZmZlckhlaWdodF07dmFyIHM9e21vZGVsOnIsdmlldzpuLHByb2plY3Rpb246aSxjbGlwQm91bmRzOmEscGlja0lkOnRoaXMucGlja0lkLzI1NX0sbD10aGlzLnBpY2tTaGFkZXI7aWYobC5iaW5kKCksbC51bmlmb3Jtcz1zLHRoaXMudHJpYW5nbGVDb3VudD4wJiYodGhpcy50cmlhbmdsZVZBTy5iaW5kKCksZS5kcmF3QXJyYXlzKGUuVFJJQU5HTEVTLDAsMyp0aGlzLnRyaWFuZ2xlQ291bnQpLHRoaXMudHJpYW5nbGVWQU8udW5iaW5kKCkpLHRoaXMuZWRnZUNvdW50PjAmJih0aGlzLmVkZ2VWQU8uYmluZCgpLGUubGluZVdpZHRoKHRoaXMubGluZVdpZHRoKSxlLmRyYXdBcnJheXMoZS5MSU5FUywwLDIqdGhpcy5lZGdlQ291bnQpLHRoaXMuZWRnZVZBTy51bmJpbmQoKSksdGhpcy5wb2ludENvdW50PjApe3ZhciBsPXRoaXMucG9pbnRQaWNrU2hhZGVyO2wuYmluZCgpLGwudW5pZm9ybXM9cyx0aGlzLnBvaW50VkFPLmJpbmQoKSxlLmRyYXdBcnJheXMoZS5QT0lOVFMsMCx0aGlzLnBvaW50Q291bnQpLHRoaXMucG9pbnRWQU8udW5iaW5kKCl9fSxPLnBpY2s9ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIG51bGw7aWYodC5pZCE9PXRoaXMucGlja0lkKXJldHVybiBudWxsO2Zvcih2YXIgZT10LnZhbHVlWzBdKzI1Nip0LnZhbHVlWzFdKzY1NTM2KnQudmFsdWVbMl0scj10aGlzLmNlbGxzW2VdLG49dGhpcy5wb3NpdGlvbnMsaT1uZXcgQXJyYXkoci5sZW5ndGgpLGE9MDthPHIubGVuZ3RoOysrYSlpW2FdPW5bclthXV07dmFyIG89UyhpLFt0LmNvb3JkWzBdLHRoaXMuX3Jlc29sdXRpb25bMV0tdC5jb29yZFsxXV0sdGhpcy5fbW9kZWwsdGhpcy5fdmlldyx0aGlzLl9wcm9qZWN0aW9uLHRoaXMuX3Jlc29sdXRpb24pO2lmKCFvKXJldHVybiBudWxsO2Zvcih2YXIgcz1vWzJdLGw9MCxhPTA7YTxyLmxlbmd0aDsrK2EpbCs9c1thXSp0aGlzLmludGVuc2l0eVtyW2FdXTtyZXR1cm57cG9zaXRpb246b1sxXSxpbmRleDpyW29bMF1dLGNlbGw6cixjZWxsSWQ6ZSxpbnRlbnNpdHk6bCxkYXRhQ29vcmRpbmF0ZTp0aGlzLnBvc2l0aW9uc1tyW29bMF1dXX19LE8uZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMudGV4dHVyZS5kaXNwb3NlKCksdGhpcy50cmlTaGFkZXIuZGlzcG9zZSgpLHRoaXMubGluZVNoYWRlci5kaXNwb3NlKCksdGhpcy5wb2ludFNoYWRlci5kaXNwb3NlKCksdGhpcy5waWNrU2hhZGVyLmRpc3Bvc2UoKSx0aGlzLnBvaW50UGlja1NoYWRlci5kaXNwb3NlKCksdGhpcy50cmlhbmdsZVZBTy5kaXNwb3NlKCksdGhpcy50cmlhbmdsZVBvc2l0aW9ucy5kaXNwb3NlKCksdGhpcy50cmlhbmdsZUNvbG9ycy5kaXNwb3NlKCksdGhpcy50cmlhbmdsZVVWcy5kaXNwb3NlKCksdGhpcy50cmlhbmdsZU5vcm1hbHMuZGlzcG9zZSgpLHRoaXMudHJpYW5nbGVJZHMuZGlzcG9zZSgpLHRoaXMuZWRnZVZBTy5kaXNwb3NlKCksdGhpcy5lZGdlUG9zaXRpb25zLmRpc3Bvc2UoKSx0aGlzLmVkZ2VDb2xvcnMuZGlzcG9zZSgpLHRoaXMuZWRnZVVWcy5kaXNwb3NlKCksdGhpcy5lZGdlSWRzLmRpc3Bvc2UoKSx0aGlzLnBvaW50VkFPLmRpc3Bvc2UoKSx0aGlzLnBvaW50UG9zaXRpb25zLmRpc3Bvc2UoKSx0aGlzLnBvaW50Q29sb3JzLmRpc3Bvc2UoKSx0aGlzLnBvaW50VVZzLmRpc3Bvc2UoKSx0aGlzLnBvaW50U2l6ZXMuZGlzcG9zZSgpLHRoaXMucG9pbnRJZHMuZGlzcG9zZSgpLHRoaXMuY29udG91clZBTy5kaXNwb3NlKCksdGhpcy5jb250b3VyUG9zaXRpb25zLmRpc3Bvc2UoKSx0aGlzLmNvbnRvdXJTaGFkZXIuZGlzcG9zZSgpfSxlLmV4cG9ydHM9ZH0seyIuL2xpYi9jbG9zZXN0LXBvaW50IjoxNzEsIi4vbGliL3NoYWRlcnMiOjE3Mixjb2xvcm1hcDo4MCwiZ2wtYnVmZmVyIjoxMjgsImdsLW1hdDQvaW52ZXJ0IjoxNDksImdsLW1hdDQvbXVsdGlwbHkiOjE1MSwiZ2wtc2hhZGVyIjoyMjAsImdsLXRleHR1cmUyZCI6MjMyLCJnbC12YW8iOjIzNixuZGFycmF5OjQyNyxub3JtYWxzOjQyOSwic2ltcGxpY2lhbC1jb21wbGV4LWNvbnRvdXIiOjQ3NCwidHlwZWRhcnJheS1wb29sIjo0OTZ9XSwxNzQ6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscil7dGhpcy5wbG90PXQsdGhpcy52Ym89ZSx0aGlzLnNoYWRlcj1yfWZ1bmN0aW9uIGkodCl7dmFyIGU9dC5nbCxyPWEoZSxbMCwwLDAsMSwxLDAsMSwxXSksaT1vKGUscy5ib3hWZXJ0LHMubGluZUZyYWcpO3JldHVybiBuZXcgbih0LHIsaSl9ZS5leHBvcnRzPWk7dmFyIGE9dCgiZ2wtYnVmZmVyIiksbz10KCJnbC1zaGFkZXIiKSxzPXQoIi4vc2hhZGVycyIpLGw9bi5wcm90b3R5cGU7bC5iaW5kPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zaGFkZXI7dGhpcy52Ym8uYmluZCgpLHRoaXMuc2hhZGVyLmJpbmQoKSx0LmF0dHJpYnV0ZXMuY29vcmQucG9pbnRlcigpLHQudW5pZm9ybXMuc2NyZWVuQm94PXRoaXMucGxvdC5zY3JlZW5Cb3h9LGwuZHJhd0JveD1mdW5jdGlvbigpe3ZhciB0PVswLDBdLGU9WzAsMF07cmV0dXJuIGZ1bmN0aW9uKHIsbixpLGEsbyl7dmFyIHM9dGhpcy5wbG90LGw9dGhpcy5zaGFkZXIsdT1zLmdsO3RbMF09cix0WzFdPW4sZVswXT1pLGVbMV09YSxsLnVuaWZvcm1zLmxvPXQsbC51bmlmb3Jtcy5oaT1lLGwudW5pZm9ybXMuY29sb3I9byx1LmRyYXdBcnJheXModS5UUklBTkdMRV9TVFJJUCwwLDQpfX0oKSxsLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLnZiby5kaXNwb3NlKCksdGhpcy5zaGFkZXIuZGlzcG9zZSgpfX0seyIuL3NoYWRlcnMiOjE3NywiZ2wtYnVmZmVyIjoxMjgsImdsLXNoYWRlciI6MTgwfV0sMTc1OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbil7dGhpcy5wbG90PXQsdGhpcy52Ym89ZSx0aGlzLnNoYWRlcj1yLHRoaXMudGlja1NoYWRlcj1uLHRoaXMudGlja3M9W1tdLFtdXX1mdW5jdGlvbiBpKHQsZSl7cmV0dXJuIHQtZX1mdW5jdGlvbiBhKHQpe3ZhciBlPXQuZ2wscj1vKGUpLGk9cyhlLHUuZ3JpZFZlcnQsdS5ncmlkRnJhZyksYT1zKGUsdS50aWNrVmVydCx1LmdyaWRGcmFnKSxsPW5ldyBuKHQscixpLGEpO3JldHVybiBsfWUuZXhwb3J0cz1hO3ZhciBvPXQoImdsLWJ1ZmZlciIpLHM9dCgiZ2wtc2hhZGVyIiksbD10KCJiaW5hcnktc2VhcmNoLWJvdW5kcyIpLHU9dCgiLi9zaGFkZXJzIiksYz1uLnByb3RvdHlwZTtjLmRyYXc9ZnVuY3Rpb24oKXt2YXIgdD1bMCwwXSxlPVswLDBdLHI9WzAsMF07cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBuPXRoaXMucGxvdCxpPXRoaXMudmJvLGE9dGhpcy5zaGFkZXIsbz10aGlzLnRpY2tzLHM9bi5nbCxsPW4uX3RpY2tCb3VuZHMsdT1uLmRhdGFCb3gsYz1uLnZpZXdCb3gsaD1uLmdyaWRMaW5lV2lkdGgsZj1uLmdyaWRMaW5lQ29sb3IsZD1uLmdyaWRMaW5lRW5hYmxlLHA9bi5waXhlbFJhdGlvLGc9MDtnPDI7KytnKXt2YXIgbT1sW2ddLHY9bFtnKzJdLHk9di1tLHg9LjUqKHVbZysyXSt1W2ddKSxiPXVbZysyXS11W2ddO2VbZ109Mip5L2IsdFtnXT0yKihtLXgpL2J9YS5iaW5kKCksaS5iaW5kKCksYS5hdHRyaWJ1dGVzLmRhdGFDb29yZC5wb2ludGVyKCksYS51bmlmb3Jtcy5kYXRhU2hpZnQ9dCxhLnVuaWZvcm1zLmRhdGFTY2FsZT1lO2Zvcih2YXIgXz0wLGc9MDtnPDI7KytnKXtyWzBdPXJbMV09MCxyW2ddPTEsYS51bmlmb3Jtcy5kYXRhQXhpcz1yLGEudW5pZm9ybXMubGluZVdpZHRoPWhbZ10vKGNbZysyXS1jW2ddKSpwLGEudW5pZm9ybXMuY29sb3I9ZltnXTt2YXIgdz02Km9bZ10ubGVuZ3RoO2RbZ10mJncmJnMuZHJhd0FycmF5cyhzLlRSSUFOR0xFUyxfLHcpLF8rPXd9fX0oKSxjLmRyYXdUaWNrTWFya3M9ZnVuY3Rpb24oKXt2YXIgdD1bMCwwXSxlPVswLDBdLHI9WzEsMF0sbj1bMCwxXSxhPVswLDBdLG89WzAsMF07cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBzPXRoaXMucGxvdCx1PXRoaXMudmJvLGM9dGhpcy50aWNrU2hhZGVyLGg9dGhpcy50aWNrcyxmPXMuZ2wsZD1zLl90aWNrQm91bmRzLHA9cy5kYXRhQm94LGc9cy52aWV3Qm94LG09cy5waXhlbFJhdGlvLHY9cy5zY3JlZW5Cb3gseT12WzJdLXZbMF0seD12WzNdLXZbMV0sYj1nWzJdLWdbMF0sXz1nWzNdLWdbMV0sdz0wO3c8MjsrK3cpe3ZhciBNPWRbd10sQT1kW3crMl0saz1BLU0sVD0uNSoocFt3KzJdK3Bbd10pLEU9cFt3KzJdLXBbd107ZVt3XT0yKmsvRSx0W3ddPTIqKE0tVCkvRX1lWzBdKj1iL3ksdFswXSo9Yi95LGVbMV0qPV8veCx0WzFdKj1fL3gsYy5iaW5kKCksdS5iaW5kKCksYy5hdHRyaWJ1dGVzLmRhdGFDb29yZC5wb2ludGVyKCk7dmFyIFM9Yy51bmlmb3JtcztTLmRhdGFTaGlmdD10LFMuZGF0YVNjYWxlPWU7dmFyIEw9cy50aWNrTWFya0xlbmd0aCx6PXMudGlja01hcmtXaWR0aCxDPXMudGlja01hcmtDb2xvcixJPTAsUD02KmhbMF0ubGVuZ3RoLEQ9TWF0aC5taW4obC5nZShoWzBdLChwWzBdLWRbMF0pLyhkWzJdLWRbMF0pLGkpLGhbMF0ubGVuZ3RoKSxSPU1hdGgubWluKGwuZ3QoaFswXSwocFsyXS1kWzBdKS8oZFsyXS1kWzBdKSxpKSxoWzBdLmxlbmd0aCksTz1JKzYqRCxGPTYqTWF0aC5tYXgoMCxSLUQpLGo9TWF0aC5taW4obC5nZShoWzFdLChwWzFdLWRbMV0pLyhkWzNdLWRbMV0pLGkpLGhbMV0ubGVuZ3RoKSxOPU1hdGgubWluKGwuZ3QoaFsxXSwocFszXS1kWzFdKS8oZFszXS1kWzFdKSxpKSxoWzFdLmxlbmd0aCksQj1QKzYqaixVPTYqTWF0aC5tYXgoMCxOLWopO2FbMF09MiooZ1swXS1MWzFdKS95LTEsYVsxXT0oZ1szXStnWzFdKS94LTEsb1swXT1MWzFdKm0veSxvWzFdPXpbMV0qbS94LFUmJihTLmNvbG9yPUNbMV0sUy50aWNrU2NhbGU9byxTLmRhdGFBeGlzPW4sUy5zY3JlZW5PZmZzZXQ9YSxmLmRyYXdBcnJheXMoZi5UUklBTkdMRVMsQixVKSksYVswXT0oZ1syXStnWzBdKS95LTEsYVsxXT0yKihnWzFdLUxbMF0pL3gtMSxvWzBdPXpbMF0qbS95LG9bMV09TFswXSptL3gsRiYmKFMuY29sb3I9Q1swXSxTLnRpY2tTY2FsZT1vLFMuZGF0YUF4aXM9cixTLnNjcmVlbk9mZnNldD1hLGYuZHJhd0FycmF5cyhmLlRSSUFOR0xFUyxPLEYpKSxhWzBdPTIqKGdbMl0rTFszXSkveS0xLGFbMV09KGdbM10rZ1sxXSkveC0xLG9bMF09TFszXSptL3ksb1sxXT16WzNdKm0veCxVJiYoUy5jb2xvcj1DWzNdLFMudGlja1NjYWxlPW8sUy5kYXRhQXhpcz1uLFMuc2NyZWVuT2Zmc2V0PWEsZi5kcmF3QXJyYXlzKGYuVFJJQU5HTEVTLEIsVSkpLGFbMF09KGdbMl0rZ1swXSkveS0xLGFbMV09MiooZ1szXStMWzJdKS94LTEsb1swXT16WzJdKm0veSxvWzFdPUxbMl0qbS94LEYmJihTLmNvbG9yPUNbMl0sUy50aWNrU2NhbGU9byxTLmRhdGFBeGlzPXIsUy5zY3JlZW5PZmZzZXQ9YSxmLmRyYXdBcnJheXMoZi5UUklBTkdMRVMsTyxGKSl9fSgpLGMudXBkYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9WzEsMSwtMSwtMSwxLC0xXSxlPVsxLC0xLDEsMSwtMSwtMV07cmV0dXJuIGZ1bmN0aW9uKHIpe2Zvcih2YXIgbj1yLnRpY2tzLGk9ci5ib3VuZHMsYT1uZXcgRmxvYXQzMkFycmF5KDE4KihuWzBdLmxlbmd0aCtuWzFdLmxlbmd0aCkpLG89KHRoaXMucGxvdC56ZXJvTGluZUVuYWJsZSwwKSxzPVtbXSxbXV0sbD0wO2w8MjsrK2wpZm9yKHZhciB1PXNbbF0sYz1uW2xdLGg9aVtsXSxmPWlbbCsyXSxkPTA7ZDxjLmxlbmd0aDsrK2Qpe3ZhciBwPShjW2RdLngtaCkvKGYtaCk7dS5wdXNoKHApO2Zvcih2YXIgZz0wO2c8NjsrK2cpYVtvKytdPXAsYVtvKytdPXRbZ10sYVtvKytdPWVbZ119dGhpcy50aWNrcz1zLHRoaXMudmJvLnVwZGF0ZShhKX19KCksYy5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy52Ym8uZGlzcG9zZSgpLHRoaXMuc2hhZGVyLmRpc3Bvc2UoKSx0aGlzLnRpY2tTaGFkZXIuZGlzcG9zZSgpfX0seyIuL3NoYWRlcnMiOjE3NywiYmluYXJ5LXNlYXJjaC1ib3VuZHMiOjE3OSwiZ2wtYnVmZmVyIjoxMjgsImdsLXNoYWRlciI6MTgwfV0sMTc2OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIpe3RoaXMucGxvdD10LHRoaXMudmJvPWUsdGhpcy5zaGFkZXI9cn1mdW5jdGlvbiBpKHQpe3ZhciBlPXQuZ2wscj1hKGUsWy0xLC0xLC0xLDEsMSwtMSwxLDFdKSxpPW8oZSxzLmxpbmVWZXJ0LHMubGluZUZyYWcpLGw9bmV3IG4odCxyLGkpO3JldHVybiBsfWUuZXhwb3J0cz1pO3ZhciBhPXQoImdsLWJ1ZmZlciIpLG89dCgiZ2wtc2hhZGVyIikscz10KCIuL3NoYWRlcnMiKSxsPW4ucHJvdG90eXBlO2wuYmluZD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuc2hhZGVyO3RoaXMudmJvLmJpbmQoKSx0aGlzLnNoYWRlci5iaW5kKCksdC5hdHRyaWJ1dGVzLmNvb3JkLnBvaW50ZXIoKSx0LnVuaWZvcm1zLnNjcmVlbkJveD10aGlzLnBsb3Quc2NyZWVuQm94fSxsLmRyYXdMaW5lPWZ1bmN0aW9uKCl7dmFyIHQ9WzAsMF0sZT1bMCwwXTtyZXR1cm4gZnVuY3Rpb24ocixuLGksYSxvLHMpe3ZhciBsPXRoaXMucGxvdCx1PXRoaXMuc2hhZGVyLGM9bC5nbDt0WzBdPXIsdFsxXT1uLGVbMF09aSxlWzFdPWEsdS51bmlmb3Jtcy5zdGFydD10LHUudW5pZm9ybXMuZW5kPWUsdS51bmlmb3Jtcy53aWR0aD1vKmwucGl4ZWxSYXRpbyx1LnVuaWZvcm1zLmNvbG9yPXMsYy5kcmF3QXJyYXlzKGMuVFJJQU5HTEVfU1RSSVAsMCw0KX19KCksbC5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy52Ym8uZGlzcG9zZSgpLHRoaXMuc2hhZGVyLmRpc3Bvc2UoKX19LHsiLi9zaGFkZXJzIjoxNzcsImdsLWJ1ZmZlciI6MTI4LCJnbC1zaGFkZXIiOjE4MH1dLDE3NzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj0icHJlY2lzaW9uIGxvd3AgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxudW5pZm9ybSB2ZWM0IGNvbG9yO1xudm9pZCBtYWluKCkge1xuICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLnh5eiAqIGNvbG9yLncsIGNvbG9yLncpO1xufVxuIjtlLmV4cG9ydHM9e2xpbmVWZXJ0OiJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbmF0dHJpYnV0ZSB2ZWMyIGNvb3JkO1xuXG51bmlmb3JtIHZlYzQgc2NyZWVuQm94O1xudW5pZm9ybSB2ZWMyIHN0YXJ0LCBlbmQ7XG51bmlmb3JtIGZsb2F0IHdpZHRoO1xuXG52ZWMyIHBlcnAodmVjMiB2KSB7XG4gIHJldHVybiB2ZWMyKHYueSwgLXYueCk7XG59XG5cbnZlYzIgc2NyZWVuKHZlYzIgdikge1xuICByZXR1cm4gMi4wICogKHYgLSBzY3JlZW5Cb3gueHkpIC8gKHNjcmVlbkJveC56dyAtIHNjcmVlbkJveC54eSkgLSAxLjA7XG59XG5cbnZvaWQgbWFpbigpIHtcbiAgdmVjMiBkZWx0YSA9IG5vcm1hbGl6ZShwZXJwKHN0YXJ0IC0gZW5kKSk7XG4gIHZlYzIgb2Zmc2V0ID0gbWl4KHN0YXJ0LCBlbmQsIDAuNSAqIChjb29yZC55KzEuMCkpO1xuICBnbF9Qb3NpdGlvbiA9IHZlYzQoc2NyZWVuKG9mZnNldCArIDAuNSAqIHdpZHRoICogZGVsdGEgKiBjb29yZC54KSwgMCwgMSk7XG59XG4iLGxpbmVGcmFnOm4sdGV4dFZlcnQ6IiNkZWZpbmUgR0xTTElGWSAxXG5hdHRyaWJ1dGUgdmVjMyB0ZXh0Q29vcmRpbmF0ZTtcblxudW5pZm9ybSB2ZWMyIGRhdGFTY2FsZSwgZGF0YVNoaWZ0LCBkYXRhQXhpcywgc2NyZWVuT2Zmc2V0LCB0ZXh0U2NhbGU7XG51bmlmb3JtIGZsb2F0IGFuZ2xlO1xuXG52b2lkIG1haW4oKSB7XG4gIGZsb2F0IGRhdGFPZmZzZXQgID0gdGV4dENvb3JkaW5hdGUuejtcbiAgdmVjMiBnbHlwaE9mZnNldCAgPSB0ZXh0Q29vcmRpbmF0ZS54eTtcbiAgbWF0MiBnbHlwaE1hdHJpeCA9IG1hdDIoY29zKGFuZ2xlKSwgc2luKGFuZ2xlKSwgLXNpbihhbmdsZSksIGNvcyhhbmdsZSkpO1xuICB2ZWMyIHNjcmVlbkNvb3JkaW5hdGUgPSBkYXRhQXhpcyAqIChkYXRhU2NhbGUgKiBkYXRhT2Zmc2V0ICsgZGF0YVNoaWZ0KSArXG4gICAgZ2x5cGhNYXRyaXggKiBnbHlwaE9mZnNldCAqIHRleHRTY2FsZSArIHNjcmVlbk9mZnNldDtcbiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHNjcmVlbkNvb3JkaW5hdGUsIDAsIDEpO1xufVxuIix0ZXh0RnJhZzpuLGdyaWRWZXJ0OiJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbmF0dHJpYnV0ZSB2ZWMzIGRhdGFDb29yZDtcblxudW5pZm9ybSB2ZWMyIGRhdGFBeGlzLCBkYXRhU2hpZnQsIGRhdGFTY2FsZTtcbnVuaWZvcm0gZmxvYXQgbGluZVdpZHRoO1xuXG52b2lkIG1haW4oKSB7XG4gIHZlYzIgcG9zID0gZGF0YUF4aXMgKiAoZGF0YVNjYWxlICogZGF0YUNvb3JkLnggKyBkYXRhU2hpZnQpO1xuICBwb3MgKz0gMTAuMCAqIGRhdGFDb29yZC55ICogdmVjMihkYXRhQXhpcy55LCAtZGF0YUF4aXMueCkgKyBkYXRhQ29vcmQueiAqIGxpbmVXaWR0aDtcbiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvcywgMCwgMSk7XG59XG4iLGdyaWRGcmFnOm4sYm94VmVydDoicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG5hdHRyaWJ1dGUgdmVjMiBjb29yZDtcblxudW5pZm9ybSB2ZWM0IHNjcmVlbkJveDtcbnVuaWZvcm0gdmVjMiBsbywgaGk7XG5cbnZlYzIgc2NyZWVuKHZlYzIgdikge1xuICByZXR1cm4gMi4wICogKHYgLSBzY3JlZW5Cb3gueHkpIC8gKHNjcmVlbkJveC56dyAtIHNjcmVlbkJveC54eSkgLSAxLjA7XG59XG5cbnZvaWQgbWFpbigpIHtcbiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHNjcmVlbihtaXgobG8sIGhpLCBjb29yZCkpLCAwLCAxKTtcbn1cbiIsdGlja1ZlcnQ6InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxuYXR0cmlidXRlIHZlYzMgZGF0YUNvb3JkO1xuXG51bmlmb3JtIHZlYzIgZGF0YUF4aXMsIGRhdGFTaGlmdCwgZGF0YVNjYWxlLCBzY3JlZW5PZmZzZXQsIHRpY2tTY2FsZTtcblxudm9pZCBtYWluKCkge1xuICB2ZWMyIHBvcyA9IGRhdGFBeGlzICogKGRhdGFTY2FsZSAqIGRhdGFDb29yZC54ICsgZGF0YVNoaWZ0KTtcbiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvcyArIHRpY2tTY2FsZSpkYXRhQ29vcmQueXogKyBzY3JlZW5PZmZzZXQsIDAsIDEpO1xufVxuIn19LHt9XSwxNzg6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscil7dGhpcy5wbG90PXQsdGhpcy52Ym89ZSx0aGlzLnNoYWRlcj1yLHRoaXMudGlja09mZnNldD1bW10sW11dLHRoaXMudGlja1g9W1tdLFtdXSx0aGlzLmxhYmVsT2Zmc2V0PVswLDBdLHRoaXMubGFiZWxDb3VudD1bMCwwXX1mdW5jdGlvbiBpKHQpe3ZhciBlPXQuZ2wscj1hKGUpLGk9byhlLHUudGV4dFZlcnQsdS50ZXh0RnJhZykscz1uZXcgbih0LHIsaSk7cmV0dXJuIHN9ZS5leHBvcnRzPWk7dmFyIGE9dCgiZ2wtYnVmZmVyIiksbz10KCJnbC1zaGFkZXIiKSxzPXQoInRleHQtY2FjaGUiKSxsPXQoImJpbmFyeS1zZWFyY2gtYm91bmRzIiksdT10KCIuL3NoYWRlcnMiKSxjPW4ucHJvdG90eXBlO2MuZHJhd1RpY2tzPWZ1bmN0aW9uKCl7dmFyIHQ9WzAsMF0sZT1bMCwwXSxyPVswLDBdO3JldHVybiBmdW5jdGlvbihuKXt2YXIgaT10aGlzLnBsb3QsYT10aGlzLnNoYWRlcixvPXRoaXMudGlja1hbbl0scz10aGlzLnRpY2tPZmZzZXRbbl0sdT1pLmdsLGM9aS52aWV3Qm94LGg9aS5kYXRhQm94LGY9aS5zY3JlZW5Cb3gsZD1pLnBpeGVsUmF0aW8scD1pLnRpY2tFbmFibGUsZz1pLnRpY2tQYWQsbT1pLnRpY2tDb2xvcix2PWkudGlja0FuZ2xlLHk9aS5sYWJlbEVuYWJsZSx4PWkubGFiZWxQYWQsYj1pLmxhYmVsQ29sb3IsXz1pLmxhYmVsQW5nbGUsdz10aGlzLmxhYmVsT2Zmc2V0W25dLE09dGhpcy5sYWJlbENvdW50W25dLEE9bC5sdChvLGhbbl0pLGs9bC5sZShvLGhbbisyXSk7dFswXT10WzFdPTAsdFtuXT0xLGVbbl09KGNbMituXStjW25dKS8oZlsyK25dLWZbbl0pLTE7dmFyIFQ9Mi9mWzIrKDFebildLWZbMV5uXTtlWzFebl09VCpjWzFebl0tMSxwW25dJiYoZVsxXm5dLT1UKmQqZ1tuXSxBPGsmJnNba10+c1tBXSYmKGEudW5pZm9ybXMuZGF0YUF4aXM9dCxhLnVuaWZvcm1zLnNjcmVlbk9mZnNldD1lLGEudW5pZm9ybXMuY29sb3I9bVtuXSxhLnVuaWZvcm1zLmFuZ2xlPXZbbl0sdS5kcmF3QXJyYXlzKHUuVFJJQU5HTEVTLHNbQV0sc1trXS1zW0FdKSkpLHlbbl0mJk0mJihlWzFebl0tPVQqZCp4W25dLGEudW5pZm9ybXMuZGF0YUF4aXM9cixhLnVuaWZvcm1zLnNjcmVlbk9mZnNldD1lLGEudW5pZm9ybXMuY29sb3I9YltuXSxhLnVuaWZvcm1zLmFuZ2xlPV9bbl0sdS5kcmF3QXJyYXlzKHUuVFJJQU5HTEVTLHcsTSkpLGVbMV5uXT1UKmNbMisoMV5uKV0tMSxwW24rMl0mJihlWzFebl0rPVQqZCpnW24rMl0sQTxrJiZzW2tdPnNbQV0mJihhLnVuaWZvcm1zLmRhdGFBeGlzPXQsYS51bmlmb3Jtcy5zY3JlZW5PZmZzZXQ9ZSxhLnVuaWZvcm1zLmNvbG9yPW1bbisyXSxhLnVuaWZvcm1zLmFuZ2xlPXZbbisyXSx1LmRyYXdBcnJheXModS5UUklBTkdMRVMsc1tBXSxzW2tdLXNbQV0pKSkseVtuKzJdJiZNJiYoZVsxXm5dKz1UKmQqeFtuKzJdLGEudW5pZm9ybXMuZGF0YUF4aXM9cixhLnVuaWZvcm1zLnNjcmVlbk9mZnNldD1lLGEudW5pZm9ybXMuY29sb3I9YltuKzJdLGEudW5pZm9ybXMuYW5nbGU9X1tuKzJdLHUuZHJhd0FycmF5cyh1LlRSSUFOR0xFUyx3LE0pKX19KCksYy5kcmF3VGl0bGU9ZnVuY3Rpb24oKXt2YXIgdD1bMCwwXSxlPVswLDBdO3JldHVybiBmdW5jdGlvbigpe3ZhciByPXRoaXMucGxvdCxuPXRoaXMuc2hhZGVyLGk9ci5nbCxhPXIuc2NyZWVuQm94LG89ci50aXRsZUNlbnRlcixzPXIudGl0bGVBbmdsZSxsPXIudGl0bGVDb2xvcix1PXIucGl4ZWxSYXRpbztpZih0aGlzLnRpdGxlQ291bnQpe2Zvcih2YXIgYz0wO2M8MjsrK2MpZVtjXT0yKihvW2NdKnUtYVtjXSkvKGFbMitjXS1hW2NdKS0xO24uYmluZCgpLG4udW5pZm9ybXMuZGF0YUF4aXM9dCxuLnVuaWZvcm1zLnNjcmVlbk9mZnNldD1lLG4udW5pZm9ybXMuYW5nbGU9cyxuLnVuaWZvcm1zLmNvbG9yPWwsaS5kcmF3QXJyYXlzKGkuVFJJQU5HTEVTLHRoaXMudGl0bGVPZmZzZXQsdGhpcy50aXRsZUNvdW50KX19fSgpLGMuYmluZD1mdW5jdGlvbigpe3ZhciB0PVswLDBdLGU9WzAsMF0scj1bMCwwXTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10aGlzLnBsb3QsaT10aGlzLnNoYWRlcixhPW4uX3RpY2tCb3VuZHMsbz1uLmRhdGFCb3gscz1uLnNjcmVlbkJveCxsPW4udmlld0JveDtpLmJpbmQoKTtmb3IodmFyIHU9MDt1PDI7Kyt1KXt2YXIgYz1hW3VdLGg9YVt1KzJdLGY9aC1jLGQ9LjUqKG9bdSsyXStvW3VdKSxwPW9bdSsyXS1vW3VdLGc9bFt1XSxtPWxbdSsyXSx2PW0tZyx5PXNbdV0seD1zW3UrMl0sYj14LXk7ZVt1XT0yKmYvcCp2L2IsdFt1XT0yKihjLWQpL3Aqdi9ifXJbMV09MipuLnBpeGVsUmF0aW8vKHNbM10tc1sxXSksclswXT1yWzFdKihzWzNdLXNbMV0pLyhzWzJdLXNbMF0pLGkudW5pZm9ybXMuZGF0YVNjYWxlPWUsaS51bmlmb3Jtcy5kYXRhU2hpZnQ9dCxpLnVuaWZvcm1zLnRleHRTY2FsZT1yLHRoaXMudmJvLmJpbmQoKSxpLmF0dHJpYnV0ZXMudGV4dENvb3JkaW5hdGUucG9pbnRlcigpfX0oKSxjLnVwZGF0ZT1mdW5jdGlvbih0KXt2YXIgZSxyLG4saSxhLG89W10sbD10LnRpY2tzLHU9dC5ib3VuZHM7Zm9yKGE9MDthPDI7KythKXt2YXIgYz1bTWF0aC5mbG9vcihvLmxlbmd0aC8zKV0saD1bLSgxLzApXSxmPWxbYV07Zm9yKGU9MDtlPGYubGVuZ3RoOysrZSl7dmFyIGQ9ZltlXSxwPWQueCxnPWQudGV4dCxtPWQuZm9udHx8InNhbnMtc2VyaWYiO2k9ZC5mb250U2l6ZXx8MTI7Zm9yKHZhciB2PTEvKHVbYSsyXS11W2FdKSx5PXVbYV0seD1nLnNwbGl0KCJcbiIpLGI9MDtiPHgubGVuZ3RoO2IrKylmb3Iobj1zKG0seFtiXSkuZGF0YSxyPTA7cjxuLmxlbmd0aDtyKz0yKW8ucHVzaChuW3JdKmksLW5bcisxXSppLWIqaSoxLjIsKHAteSkqdik7Yy5wdXNoKE1hdGguZmxvb3Ioby5sZW5ndGgvMykpLGgucHVzaChwKX10aGlzLnRpY2tPZmZzZXRbYV09Yyx0aGlzLnRpY2tYW2FdPWh9Zm9yKGE9MDthPDI7KythKXtmb3IodGhpcy5sYWJlbE9mZnNldFthXT1NYXRoLmZsb29yKG8ubGVuZ3RoLzMpLG49cyh0LmxhYmVsRm9udFthXSx0LmxhYmVsc1thXSx7dGV4dEFsaWduOiJjZW50ZXIifSkuZGF0YSxpPXQubGFiZWxTaXplW2FdLGU9MDtlPG4ubGVuZ3RoO2UrPTIpby5wdXNoKG5bZV0qaSwtbltlKzFdKmksMCk7dGhpcy5sYWJlbENvdW50W2FdPU1hdGguZmxvb3Ioby5sZW5ndGgvMyktdGhpcy5sYWJlbE9mZnNldFthXX1mb3IodGhpcy50aXRsZU9mZnNldD1NYXRoLmZsb29yKG8ubGVuZ3RoLzMpLG49cyh0LnRpdGxlRm9udCx0LnRpdGxlKS5kYXRhLGk9dC50aXRsZVNpemUsZT0wO2U8bi5sZW5ndGg7ZSs9MilvLnB1c2gobltlXSppLC1uW2UrMV0qaSwwKTt0aGlzLnRpdGxlQ291bnQ9TWF0aC5mbG9vcihvLmxlbmd0aC8zKS10aGlzLnRpdGxlT2Zmc2V0LHRoaXMudmJvLnVwZGF0ZShvKX0sYy5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy52Ym8uZGlzcG9zZSgpLHRoaXMuc2hhZGVyLmRpc3Bvc2UoKX19LHsiLi9zaGFkZXJzIjoxNzcsImJpbmFyeS1zZWFyY2gtYm91bmRzIjoxNzksImdsLWJ1ZmZlciI6MTI4LCJnbC1zaGFkZXIiOjE4MCwidGV4dC1jYWNoZSI6NDg4fV0sMTc5OltmdW5jdGlvbih0LGUscil7YXJndW1lbnRzWzRdWzcyXVswXS5hcHBseShyLGFyZ3VtZW50cyl9LHtkdXA6NzJ9XSwxODA6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt0aGlzLmdsPXQsdGhpcy5nbC5sYXN0QXR0cmliQ291bnQ9MCx0aGlzLl92cmVmPXRoaXMuX2ZyZWY9dGhpcy5fcmVsaW5rPXRoaXMudmVydFNoYWRlcj10aGlzLmZyYWdTaGFkZXI9dGhpcy5wcm9ncmFtPXRoaXMuYXR0cmlidXRlcz10aGlzLnVuaWZvcm1zPXRoaXMudHlwZXM9bnVsbH1mdW5jdGlvbiBpKHQsZSl7cmV0dXJuIHQubmFtZTxlLm5hbWU/LTE6MX1mdW5jdGlvbiBhKHQsZSxyLGksYSl7dmFyIG89bmV3IG4odCk7cmV0dXJuIG8udXBkYXRlKGUscixpLGEpLG99dmFyIG89dCgiLi9saWIvY3JlYXRlLXVuaWZvcm1zIikscz10KCIuL2xpYi9jcmVhdGUtYXR0cmlidXRlcyIpLGw9dCgiLi9saWIvcmVmbGVjdCIpLHU9dCgiLi9saWIvc2hhZGVyLWNhY2hlIiksYz10KCIuL2xpYi9ydW50aW1lLXJlZmxlY3QiKSxoPXQoIi4vbGliL0dMRXJyb3IiKSxmPW4ucHJvdG90eXBlO2YuYmluZD1mdW5jdGlvbigpe3RoaXMucHJvZ3JhbXx8dGhpcy5fcmVsaW5rKCk7dmFyIHQsZT10aGlzLmdsLmdldFByb2dyYW1QYXJhbWV0ZXIodGhpcy5wcm9ncmFtLHRoaXMuZ2wuQUNUSVZFX0FUVFJJQlVURVMpLHI9dGhpcy5nbC5sYXN0QXR0cmliQ291bnQ7aWYoZT5yKWZvcih0PXI7dDxlO3QrKyl0aGlzLmdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHQpO2Vsc2UgaWYocj5lKWZvcih0PWU7dDxyO3QrKyl0aGlzLmdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSh0KTt0aGlzLmdsLmxhc3RBdHRyaWJDb3VudD1lLHRoaXMuZ2wudXNlUHJvZ3JhbSh0aGlzLnByb2dyYW0pfSxmLmRpc3Bvc2U9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5nbC5sYXN0QXR0cmliQ291bnQsZT0wO2U8dDtlKyspdGhpcy5nbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoZSk7dGhpcy5nbC5sYXN0QXR0cmliQ291bnQ9MCx0aGlzLl9mcmVmJiZ0aGlzLl9mcmVmLmRpc3Bvc2UoKSx0aGlzLl92cmVmJiZ0aGlzLl92cmVmLmRpc3Bvc2UoKSx0aGlzLmF0dHJpYnV0ZXM9dGhpcy50eXBlcz10aGlzLnZlcnRTaGFkZXI9dGhpcy5mcmFnU2hhZGVyPXRoaXMucHJvZ3JhbT10aGlzLl9yZWxpbms9dGhpcy5fZnJlZj10aGlzLl92cmVmPW51bGx9LGYudXBkYXRlPWZ1bmN0aW9uKHQsZSxyLG4pe2Z1bmN0aW9uIGEoKXtkLnByb2dyYW09dS5wcm9ncmFtKHAsZC5fdnJlZixkLl9mcmVmLF8sdyk7Zm9yKHZhciB0PTA7dDxyLmxlbmd0aDsrK3QpU1t0XT1wLmdldFVuaWZvcm1Mb2NhdGlvbihkLnByb2dyYW0sclt0XS5uYW1lKX1pZighZXx8MT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBmPXQ7dD1mLnZlcnRleCxlPWYuZnJhZ21lbnQscj1mLnVuaWZvcm1zLG49Zi5hdHRyaWJ1dGVzfXZhciBkPXRoaXMscD1kLmdsLGc9ZC5fdnJlZjtkLl92cmVmPXUuc2hhZGVyKHAscC5WRVJURVhfU0hBREVSLHQpLGcmJmcuZGlzcG9zZSgpLGQudmVydFNoYWRlcj1kLl92cmVmLnNoYWRlcjt2YXIgbT10aGlzLl9mcmVmO2lmKGQuX2ZyZWY9dS5zaGFkZXIocCxwLkZSQUdNRU5UX1NIQURFUixlKSxtJiZtLmRpc3Bvc2UoKSxkLmZyYWdTaGFkZXI9ZC5fZnJlZi5zaGFkZXIsIXJ8fCFuKXt2YXIgdj1wLmNyZWF0ZVByb2dyYW0oKTtpZihwLmF0dGFjaFNoYWRlcih2LGQuZnJhZ1NoYWRlcikscC5hdHRhY2hTaGFkZXIodixkLnZlcnRTaGFkZXIpLHAubGlua1Byb2dyYW0odiksIXAuZ2V0UHJvZ3JhbVBhcmFtZXRlcih2LHAuTElOS19TVEFUVVMpKXt2YXIgeT1wLmdldFByb2dyYW1JbmZvTG9nKHYpO3Rocm93IG5ldyBoKHksIkVycm9yIGxpbmtpbmcgcHJvZ3JhbToiK3kpfXI9cnx8Yy51bmlmb3JtcyhwLHYpLG49bnx8Yy5hdHRyaWJ1dGVzKHAsdikscC5kZWxldGVQcm9ncmFtKHYpfW49bi5zbGljZSgpLG4uc29ydChpKTt2YXIgeCxiPVtdLF89W10sdz1bXTtmb3IoeD0wO3g8bi5sZW5ndGg7Kyt4KXt2YXIgTT1uW3hdO2lmKE0udHlwZS5pbmRleE9mKCJtYXQiKT49MCl7Zm9yKHZhciBBPTB8TS50eXBlLmNoYXJBdChNLnR5cGUubGVuZ3RoLTEpLGs9bmV3IEFycmF5KEEpLFQ9MDtUPEE7KytUKWtbVF09dy5sZW5ndGgsXy5wdXNoKE0ubmFtZSsiWyIrVCsiXSIpLCJudW1iZXIiPT10eXBlb2YgTS5sb2NhdGlvbj93LnB1c2goTS5sb2NhdGlvbitUKTpBcnJheS5pc0FycmF5KE0ubG9jYXRpb24pJiZNLmxvY2F0aW9uLmxlbmd0aD09PUEmJiJudW1iZXIiPT10eXBlb2YgTS5sb2NhdGlvbltUXT93LnB1c2goMHxNLmxvY2F0aW9uW1RdKTp3LnB1c2goLTEpO2IucHVzaCh7bmFtZTpNLm5hbWUsdHlwZTpNLnR5cGUsbG9jYXRpb25zOmt9KX1lbHNlIGIucHVzaCh7bmFtZTpNLm5hbWUsdHlwZTpNLnR5cGUsbG9jYXRpb25zOlt3Lmxlbmd0aF19KSxfLnB1c2goTS5uYW1lKSwibnVtYmVyIj09dHlwZW9mIE0ubG9jYXRpb24/dy5wdXNoKDB8TS5sb2NhdGlvbik6dy5wdXNoKC0xKX12YXIgRT0wO2Zvcih4PTA7eDx3Lmxlbmd0aDsrK3gpaWYod1t4XTwwKXtmb3IoO3cuaW5kZXhPZihFKT49MDspRSs9MTt3W3hdPUV9dmFyIFM9bmV3IEFycmF5KHIubGVuZ3RoKTthKCksZC5fcmVsaW5rPWEsZC50eXBlcz17dW5pZm9ybXM6bChyKSxhdHRyaWJ1dGVzOmwobil9LGQuYXR0cmlidXRlcz1zKHAsZCxiLHcpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkLCJ1bmlmb3JtcyIsbyhwLGQscixTKSl9LGUuZXhwb3J0cz1hfSx7Ii4vbGliL0dMRXJyb3IiOjE4MSwiLi9saWIvY3JlYXRlLWF0dHJpYnV0ZXMiOjE4MiwiLi9saWIvY3JlYXRlLXVuaWZvcm1zIjoxODMsIi4vbGliL3JlZmxlY3QiOjE4NCwiLi9saWIvcnVudGltZS1yZWZsZWN0IjoxODUsIi4vbGliL3NoYWRlci1jYWNoZSI6MTg2fV0sMTgxOltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUscil7dGhpcy5zaG9ydE1lc3NhZ2U9ZXx8IiIsdGhpcy5sb25nTWVzc2FnZT1yfHwiIix0aGlzLnJhd0Vycm9yPXR8fCIiLHRoaXMubWVzc2FnZT0iZ2wtc2hhZGVyOiAiKyhlfHx0fHwiIikrKHI/IlxuIityOiIiKSx0aGlzLnN0YWNrPShuZXcgRXJyb3IpLnN0YWNrfW4ucHJvdG90eXBlPW5ldyBFcnJvcixuLnByb3RvdHlwZS5uYW1lPSJHTEVycm9yIixuLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1uLGUuZXhwb3J0cz1ufSx7fV0sMTgyOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbixpLGEpe3RoaXMuX2dsPXQsdGhpcy5fd3JhcHBlcj1lLHRoaXMuX2luZGV4PXIsdGhpcy5fbG9jYXRpb25zPW4sdGhpcy5fZGltZW5zaW9uPWksdGhpcy5fY29uc3RGdW5jPWF9ZnVuY3Rpb24gaSh0LGUscixpLGEsbyxzKXtmb3IodmFyIGw9WyJnbCIsInYiXSx1PVtdLGM9MDtjPGE7KytjKWwucHVzaCgieCIrYyksdS5wdXNoKCJ4IitjKTtsLnB1c2goImlmKHgwLmxlbmd0aD09PXZvaWQgMCl7cmV0dXJuIGdsLnZlcnRleEF0dHJpYiIrYSsiZih2LCIrdS5qb2luKCkrIil9ZWxzZXtyZXR1cm4gZ2wudmVydGV4QXR0cmliIithKyJmdih2LHgwKX0iKTt2YXIgaD1GdW5jdGlvbi5hcHBseShudWxsLGwpLGY9bmV3IG4odCxlLHIsaSxhLGgpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShvLHMse3NldDpmdW5jdGlvbihlKXtyZXR1cm4gdC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoaVtyXSksaCh0LGlbcl0sZSksZX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGZ9LGVudW1lcmFibGU6ITB9KX1mdW5jdGlvbiBhKHQsZSxyLG4sYSxvLHMpe2Zvcih2YXIgbD1uZXcgQXJyYXkoYSksdT1uZXcgQXJyYXkoYSksYz0wO2M8YTsrK2MpaSh0LGUscltjXSxuLGEsbCxjKSx1W2NdPWxbY107T2JqZWN0LmRlZmluZVByb3BlcnR5KGwsImxvY2F0aW9uIix7c2V0OmZ1bmN0aW9uKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKHZhciBlPTA7ZTxhOysrZSl1W2VdLmxvY2F0aW9uPXRbZV07ZWxzZSBmb3IodmFyIGU9MDtlPGE7KytlKXVbZV0ubG9jYXRpb249dCtlO3JldHVybiB0fSxnZXQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IEFycmF5KGEpLGU9MDtlPGE7KytlKXRbZV09bltyW2VdXTtyZXR1cm4gdH0sZW51bWVyYWJsZTohMH0pLGwucG9pbnRlcj1mdW5jdGlvbihlLGksbyxzKXtlPWV8fHQuRkxPQVQsaT0hIWksbz1vfHxhKmEscz1zfHwwO2Zvcih2YXIgbD0wO2w8YTsrK2wpe3ZhciB1PW5bcltsXV07dC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHUsYSxlLGksbyxzK2wqYSksdC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh1KX19O3ZhciBoPW5ldyBBcnJheShhKSxmPXRbInZlcnRleEF0dHJpYiIrYSsiZnYiXTtPYmplY3QuZGVmaW5lUHJvcGVydHkobyxzLHtzZXQ6ZnVuY3Rpb24oZSl7Zm9yKHZhciBpPTA7aTxhOysraSl7dmFyIG89bltyW2ldXTtpZih0LmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShvKSxBcnJheS5pc0FycmF5KGVbMF0pKWYuY2FsbCh0LG8sZVtpXSk7ZWxzZXtmb3IodmFyIHM9MDtzPGE7KytzKWhbc109ZVthKmkrc107Zi5jYWxsKHQsbyxoKX19cmV0dXJuIGV9LGdldDpmdW5jdGlvbigpe3JldHVybiBsfSxlbnVtZXJhYmxlOiEwfSl9ZnVuY3Rpb24gbyh0LGUscixuKXtmb3IodmFyIG89e30sbD0wLHU9ci5sZW5ndGg7bDx1OysrbCl7dmFyIGM9cltsXSxoPWMubmFtZSxmPWMudHlwZSxkPWMubG9jYXRpb25zO3N3aXRjaChmKXtjYXNlImJvb2wiOmNhc2UiaW50IjpjYXNlImZsb2F0IjppKHQsZSxkWzBdLG4sMSxvLGgpO2JyZWFrO2RlZmF1bHQ6aWYoZi5pbmRleE9mKCJ2ZWMiKT49MCl7dmFyIHA9Zi5jaGFyQ29kZUF0KGYubGVuZ3RoLTEpLTQ4O2lmKHA8Mnx8cD40KXRocm93IG5ldyBzKCIiLCJJbnZhbGlkIGRhdGEgdHlwZSBmb3IgYXR0cmlidXRlICIraCsiOiAiK2YpO2kodCxlLGRbMF0sbixwLG8saCl9ZWxzZXtpZighKGYuaW5kZXhPZigibWF0Iik+PTApKXRocm93IG5ldyBzKCIiLCJVbmtub3duIGRhdGEgdHlwZSBmb3IgYXR0cmlidXRlICIraCsiOiAiK2YpO3ZhciBwPWYuY2hhckNvZGVBdChmLmxlbmd0aC0xKS00ODtpZihwPDJ8fHA+NCl0aHJvdyBuZXcgcygiIiwiSW52YWxpZCBkYXRhIHR5cGUgZm9yIGF0dHJpYnV0ZSAiK2grIjogIitmKTthKHQsZSxkLG4scCxvLGgpfX19cmV0dXJuIG99ZS5leHBvcnRzPW87dmFyIHM9dCgiLi9HTEVycm9yIiksbD1uLnByb3RvdHlwZTtsLnBvaW50ZXI9ZnVuY3Rpb24odCxlLHIsbil7dmFyIGk9dGhpcyxhPWkuX2dsLG89aS5fbG9jYXRpb25zW2kuX2luZGV4XTthLnZlcnRleEF0dHJpYlBvaW50ZXIobyxpLl9kaW1lbnNpb24sdHx8YS5GTE9BVCwhIWUscnx8MCxufHwwKSxhLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG8pfSxsLnNldD1mdW5jdGlvbih0LGUscixuKXtyZXR1cm4gdGhpcy5fY29uc3RGdW5jKHRoaXMuX2xvY2F0aW9uc1t0aGlzLl9pbmRleF0sdCxlLHIsbil9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShsLCJsb2NhdGlvbiIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sb2NhdGlvbnNbdGhpcy5faW5kZXhdfSxzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQhPT10aGlzLl9sb2NhdGlvbnNbdGhpcy5faW5kZXhdJiYodGhpcy5fbG9jYXRpb25zW3RoaXMuX2luZGV4XT0wfHQsdGhpcy5fd3JhcHBlci5wcm9ncmFtPW51bGwpLDB8dH19KX0seyIuL0dMRXJyb3IiOjE4MX1dLDE4MzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3ZhciBlPW5ldyBGdW5jdGlvbigieSIsInJldHVybiBmdW5jdGlvbigpe3JldHVybiB5fSIpO3JldHVybiBlKHQpfWZ1bmN0aW9uIGkodCxlKXtmb3IodmFyIHI9bmV3IEFycmF5KHQpLG49MDtuPHQ7KytuKXJbbl09ZTtyZXR1cm4gcn1mdW5jdGlvbiBhKHQsZSxyLGEpe2Z1bmN0aW9uIGwocil7dmFyIG49bmV3IEZ1bmN0aW9uKCJnbCIsIndyYXBwZXIiLCJsb2NhdGlvbnMiLCJyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZ2wuZ2V0VW5pZm9ybSh3cmFwcGVyLnByb2dyYW0sbG9jYXRpb25zWyIrcisiXSl9Iik7cmV0dXJuIG4odCxlLGEpfWZ1bmN0aW9uIHUodCxlLHIpe3N3aXRjaChyKXtjYXNlImJvb2wiOmNhc2UiaW50IjpjYXNlInNhbXBsZXIyRCI6Y2FzZSJzYW1wbGVyQ3ViZSI6cmV0dXJuImdsLnVuaWZvcm0xaShsb2NhdGlvbnNbIitlKyJdLG9iaiIrdCsiKSI7Y2FzZSJmbG9hdCI6cmV0dXJuImdsLnVuaWZvcm0xZihsb2NhdGlvbnNbIitlKyJdLG9iaiIrdCsiKSI7ZGVmYXVsdDp2YXIgbj1yLmluZGV4T2YoInZlYyIpO2lmKCEoMDw9biYmbjw9MSYmci5sZW5ndGg9PT00K24pKXtpZigwPT09ci5pbmRleE9mKCJtYXQiKSYmND09PXIubGVuZ3RoKXt2YXIgaT1yLmNoYXJDb2RlQXQoci5sZW5ndGgtMSktNDg7aWYoaTwyfHxpPjQpdGhyb3cgbmV3IHMoIiIsIkludmFsaWQgdW5pZm9ybSBkaW1lbnNpb24gdHlwZSBmb3IgbWF0cml4ICIrbmFtZSsiOiAiK3IpO3JldHVybiJnbC51bmlmb3JtTWF0cml4IitpKyJmdihsb2NhdGlvbnNbIitlKyJdLGZhbHNlLG9iaiIrdCsiKSJ9dGhyb3cgbmV3IHMoIiIsIlVua25vd24gdW5pZm9ybSBkYXRhIHR5cGUgZm9yICIrbmFtZSsiOiAiK3IpfXZhciBpPXIuY2hhckNvZGVBdChyLmxlbmd0aC0xKS00ODtpZihpPDJ8fGk+NCl0aHJvdyBuZXcgcygiIiwiSW52YWxpZCBkYXRhIHR5cGUiKTtzd2l0Y2goci5jaGFyQXQoMCkpe2Nhc2UiYiI6Y2FzZSJpIjpyZXR1cm4iZ2wudW5pZm9ybSIraSsiaXYobG9jYXRpb25zWyIrZSsiXSxvYmoiK3QrIikiO2Nhc2UidiI6cmV0dXJuImdsLnVuaWZvcm0iK2krImZ2KGxvY2F0aW9uc1siK2UrIl0sb2JqIit0KyIpIjtkZWZhdWx0OnRocm93IG5ldyBzKCIiLCJVbnJlY29nbml6ZWQgZGF0YSB0eXBlIGZvciB2ZWN0b3IgIituYW1lKyI6ICIrcil9fX1mdW5jdGlvbiBjKHQsZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlKXJldHVybltbdCxlXV07dmFyIHI9W107Zm9yKHZhciBuIGluIGUpe3ZhciBpPWVbbl0sYT10O2ErPXBhcnNlSW50KG4pKyIiPT09bj8iWyIrbisiXSI6Ii4iK24sIm9iamVjdCI9PXR5cGVvZiBpP3IucHVzaC5hcHBseShyLGMoYSxpKSk6ci5wdXNoKFthLGldKX1yZXR1cm4gcn1mdW5jdGlvbiBoKGUpe2Zvcih2YXIgbj1bInJldHVybiBmdW5jdGlvbiB1cGRhdGVQcm9wZXJ0eShvYmopeyJdLGk9YygiIixlKSxvPTA7bzxpLmxlbmd0aDsrK28pe3ZhciBzPWlbb10sbD1zWzBdLGg9c1sxXTthW2hdJiZuLnB1c2godShsLGgscltoXS50eXBlKSl9bi5wdXNoKCJyZXR1cm4gb2JqfSIpO3ZhciBmPW5ldyBGdW5jdGlvbigiZ2wiLCJsb2NhdGlvbnMiLG4uam9pbigiXG4iKSk7cmV0dXJuIGYodCxhKX1mdW5jdGlvbiBmKHQpe3N3aXRjaCh0KXtjYXNlImJvb2wiOnJldHVybiExO2Nhc2UiaW50IjpjYXNlInNhbXBsZXIyRCI6Y2FzZSJzYW1wbGVyQ3ViZSI6cmV0dXJuIDA7Y2FzZSJmbG9hdCI6cmV0dXJuIDA7ZGVmYXVsdDp2YXIgZT10LmluZGV4T2YoInZlYyIpO2lmKDA8PWUmJmU8PTEmJnQubGVuZ3RoPT09NCtlKXt2YXIgcj10LmNoYXJDb2RlQXQodC5sZW5ndGgtMSktNDg7aWYocjwyfHxyPjQpdGhyb3cgbmV3IHMoIiIsIkludmFsaWQgZGF0YSB0eXBlIik7cmV0dXJuImIiPT09dC5jaGFyQXQoMCk/aShyLCExKTppKHIsMCl9aWYoMD09PXQuaW5kZXhPZigibWF0IikmJjQ9PT10Lmxlbmd0aCl7dmFyIHI9dC5jaGFyQ29kZUF0KHQubGVuZ3RoLTEpLTQ4O2lmKHI8Mnx8cj40KXRocm93IG5ldyBzKCIiLCJJbnZhbGlkIHVuaWZvcm0gZGltZW5zaW9uIHR5cGUgZm9yIG1hdHJpeCAiK25hbWUrIjogIit0KTtyZXR1cm4gaShyKnIsMCl9dGhyb3cgbmV3IHMoIiIsIlVua25vd24gdW5pZm9ybSBkYXRhIHR5cGUgZm9yICIrbmFtZSsiOiAiK3QpfX1mdW5jdGlvbiBkKHQsZSxpKXtpZigib2JqZWN0Ij09dHlwZW9mIGkpe3ZhciBvPXAoaSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7Z2V0Om4obyksc2V0OmgoaSksZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITF9KX1lbHNlIGFbaV0/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7Z2V0OmwoaSksc2V0OmgoaSksZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITF9KTp0W2VdPWYocltpXS50eXBlKX1mdW5jdGlvbiBwKHQpe3ZhciBlO2lmKEFycmF5LmlzQXJyYXkodCkpe2U9bmV3IEFycmF5KHQubGVuZ3RoKTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoOysrcilkKGUscix0W3JdKX1lbHNle2U9e307Zm9yKHZhciBuIGluIHQpZChlLG4sdFtuXSl9cmV0dXJuIGV9dmFyIGc9byhyLCEwKTtyZXR1cm57Z2V0Om4ocChnKSksc2V0OmgoZyksZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9fXZhciBvPXQoIi4vcmVmbGVjdCIpLHM9dCgiLi9HTEVycm9yIik7ZS5leHBvcnRzPWF9LHsiLi9HTEVycm9yIjoxODEsIi4vcmVmbGVjdCI6MTg0fV0sMTg0OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtmb3IodmFyIHI9e30sbj0wO248dC5sZW5ndGg7KytuKWZvcih2YXIgaT10W25dLm5hbWUsYT1pLnNwbGl0KCIuIiksbz1yLHM9MDtzPGEubGVuZ3RoOysrcyl7dmFyIGw9YVtzXS5zcGxpdCgiWyIpO2lmKGwubGVuZ3RoPjEpe2xbMF1pbiBvfHwob1tsWzBdXT1bXSksbz1vW2xbMF1dO2Zvcih2YXIgdT0xO3U8bC5sZW5ndGg7Kyt1KXt2YXIgYz1wYXJzZUludChsW3VdKTt1PGwubGVuZ3RoLTF8fHM8YS5sZW5ndGgtMT8oYyBpbiBvfHwodTxsLmxlbmd0aC0xP29bY109W106b1tjXT17fSksbz1vW2NdKTplP29bY109bjpvW2NdPXRbbl0udHlwZX19ZWxzZSBzPGEubGVuZ3RoLTE/KGxbMF1pbiBvfHwob1tsWzBdXT17fSksbz1vW2xbMF1dKTplP29bbFswXV09bjpvW2xbMF1dPXRbbl0udHlwZX1yZXR1cm4gcn1lLmV4cG9ydHM9bn0se31dLDE4NTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7aWYoIXMpe3ZhciByPU9iamVjdC5rZXlzKG8pO3M9e307Zm9yKHZhciBuPTA7bjxyLmxlbmd0aDsrK24pe3ZhciBpPXJbbl07c1t0W2ldXT1vW2ldfX1yZXR1cm4gc1tlXX1mdW5jdGlvbiBpKHQsZSl7Zm9yKHZhciByPXQuZ2V0UHJvZ3JhbVBhcmFtZXRlcihlLHQuQUNUSVZFX1VOSUZPUk1TKSxpPVtdLGE9MDthPHI7KythKXt2YXIgbz10LmdldEFjdGl2ZVVuaWZvcm0oZSxhKTtpZihvKXt2YXIgcz1uKHQsby50eXBlKTtpZihvLnNpemU+MSlmb3IodmFyIGw9MDtsPG8uc2l6ZTsrK2wpaS5wdXNoKHtuYW1lOm8ubmFtZS5yZXBsYWNlKCJbMF0iLCJbIitsKyJdIiksdHlwZTpzfSk7ZWxzZSBpLnB1c2goe25hbWU6by5uYW1lLHR5cGU6c30pfX1yZXR1cm4gaX1mdW5jdGlvbiBhKHQsZSl7Zm9yKHZhciByPXQuZ2V0UHJvZ3JhbVBhcmFtZXRlcihlLHQuQUNUSVZFX0FUVFJJQlVURVMpLGk9W10sYT0wO2E8cjsrK2Epe3ZhciBvPXQuZ2V0QWN0aXZlQXR0cmliKGUsYSk7byYmaS5wdXNoKHtuYW1lOm8ubmFtZSx0eXBlOm4odCxvLnR5cGUpfSl9cmV0dXJuIGl9ci51bmlmb3Jtcz1pLHIuYXR0cmlidXRlcz1hO3ZhciBvPXtGTE9BVDoiZmxvYXQiLEZMT0FUX1ZFQzI6InZlYzIiLEZMT0FUX1ZFQzM6InZlYzMiLEZMT0FUX1ZFQzQ6InZlYzQiLElOVDoiaW50IixJTlRfVkVDMjoiaXZlYzIiLElOVF9WRUMzOiJpdmVjMyIsSU5UX1ZFQzQ6Iml2ZWM0IixCT09MOiJib29sIixCT09MX1ZFQzI6ImJ2ZWMyIixCT09MX1ZFQzM6ImJ2ZWMzIixCT09MX1ZFQzQ6ImJ2ZWM0IixGTE9BVF9NQVQyOiJtYXQyIixGTE9BVF9NQVQzOiJtYXQzIixGTE9BVF9NQVQ0OiJtYXQ0IixTQU1QTEVSXzJEOiJzYW1wbGVyMkQiLFNBTVBMRVJfQ1VCRToic2FtcGxlckN1YmUifSxzPW51bGx9LHt9XSwxODY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuLGksYSxvKXt0aGlzLmlkPXQsdGhpcy5zcmM9ZSx0aGlzLnR5cGU9cix0aGlzLnNoYWRlcj1uLHRoaXMuY291bnQ9YSx0aGlzLnByb2dyYW1zPVtdLHRoaXMuY2FjaGU9b31mdW5jdGlvbiBpKHQpe3RoaXMuZ2w9dCx0aGlzLnNoYWRlcnM9W3t9LHt9XSx0aGlzLnByb2dyYW1zPXt9fWZ1bmN0aW9uIGEodCxlLHIpe3ZhciBuPXQuY3JlYXRlU2hhZGVyKGUpO2lmKHQuc2hhZGVyU291cmNlKG4sciksdC5jb21waWxlU2hhZGVyKG4pLCF0LmdldFNoYWRlclBhcmFtZXRlcihuLHQuQ09NUElMRV9TVEFUVVMpKXt2YXIgaT10LmdldFNoYWRlckluZm9Mb2cobik7dHJ5e3ZhciBhPWgoaSxyLGUpfWNhdGNoKHQpe3Rocm93IGNvbnNvbGUud2FybigiRmFpbGVkIHRvIGZvcm1hdCBjb21waWxlciBlcnJvcjogIit0KSxuZXcgYyhpLCJFcnJvciBjb21waWxpbmcgc2hhZGVyOlxuIitpKX10aHJvdyBuZXcgYyhpLGEuc2hvcnQsYS5sb25nKX1yZXR1cm4gbn1mdW5jdGlvbiBvKHQsZSxyLG4saSl7dmFyIGE9dC5jcmVhdGVQcm9ncmFtKCk7dC5hdHRhY2hTaGFkZXIoYSxlKSx0LmF0dGFjaFNoYWRlcihhLHIpO2Zvcih2YXIgbz0wO288bi5sZW5ndGg7KytvKXQuYmluZEF0dHJpYkxvY2F0aW9uKGEsaVtvXSxuW29dKTtpZih0LmxpbmtQcm9ncmFtKGEpLCF0LmdldFByb2dyYW1QYXJhbWV0ZXIoYSx0LkxJTktfU1RBVFVTKSl7dmFyIHM9dC5nZXRQcm9ncmFtSW5mb0xvZyhhKTt0aHJvdyBuZXcgYyhzLCJFcnJvciBsaW5raW5nIHByb2dyYW06ICIrcyl9cmV0dXJuIGF9ZnVuY3Rpb24gcyh0KXt2YXIgZT1kLmdldCh0KTtyZXR1cm4gZXx8KGU9bmV3IGkodCksZC5zZXQodCxlKSksZX1mdW5jdGlvbiBsKHQsZSxyKXtyZXR1cm4gcyh0KS5nZXRTaGFkZXJSZWZlcmVuY2UoZSxyKX1mdW5jdGlvbiB1KHQsZSxyLG4saSl7cmV0dXJuIHModCkuZ2V0UHJvZ3JhbShlLHIsbixpKX1yLnNoYWRlcj1sLHIucHJvZ3JhbT11O3ZhciBjPXQoIi4vR0xFcnJvciIpLGg9dCgiZ2wtZm9ybWF0LWNvbXBpbGVyLWVycm9yIiksZj0idW5kZWZpbmVkIj09dHlwZW9mIFdlYWtNYXA/dCgid2Vha21hcC1zaGltIik6V2Vha01hcCxkPW5ldyBmLHA9MDtuLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7aWYoMD09PS0tdGhpcy5jb3VudCl7Zm9yKHZhciB0PXRoaXMuY2FjaGUsZT10LmdsLHI9dGhpcy5wcm9ncmFtcyxuPTAsaT1yLmxlbmd0aDtuPGk7KytuKXt2YXIgYT10LnByb2dyYW1zW3Jbbl1dO2EmJihkZWxldGUgdC5wcm9ncmFtc1tuXSxlLmRlbGV0ZVByb2dyYW0oYSkpfWUuZGVsZXRlU2hhZGVyKHRoaXMuc2hhZGVyKSxkZWxldGUgdC5zaGFkZXJzW3RoaXMudHlwZT09PWUuRlJBR01FTlRfU0hBREVSfDBdW3RoaXMuc3JjXX19O3ZhciBnPWkucHJvdG90eXBlO2cuZ2V0U2hhZGVyUmVmZXJlbmNlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5nbCxpPXRoaXMuc2hhZGVyc1t0PT09ci5GUkFHTUVOVF9TSEFERVJ8MF0sbz1pW2VdO2lmKG8mJnIuaXNTaGFkZXIoby5zaGFkZXIpKW8uY291bnQrPTE7ZWxzZXt2YXIgcz1hKHIsdCxlKTtvPWlbZV09bmV3IG4ocCsrLGUsdCxzLFtdLDEsdGhpcyl9cmV0dXJuIG99LGcuZ2V0UHJvZ3JhbT1mdW5jdGlvbih0LGUscixuKXt2YXIgaT1bdC5pZCxlLmlkLHIuam9pbigiOiIpLG4uam9pbigiOiIpXS5qb2luKCJAIiksYT10aGlzLnByb2dyYW1zW2ldO3JldHVybiBhJiZ0aGlzLmdsLmlzUHJvZ3JhbShhKXx8KHRoaXMucHJvZ3JhbXNbaV09YT1vKHRoaXMuZ2wsdC5zaGFkZXIsZS5zaGFkZXIscixuKSx0LnByb2dyYW1zLnB1c2goaSksZS5wcm9ncmFtcy5wdXNoKGkpKSxhfX0seyIuL0dMRXJyb3IiOjE4MSwiZ2wtZm9ybWF0LWNvbXBpbGVyLWVycm9yIjoxMzYsIndlYWttYXAtc2hpbSI6NTE3fV0sMTg3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXt0aGlzLmdsPXQsdGhpcy5waWNrQnVmZmVyPWUsdGhpcy5zY3JlZW5Cb3g9WzAsMCx0LmRyYXdpbmdCdWZmZXJXaWR0aCx0LmRyYXdpbmdCdWZmZXJIZWlnaHRdLHRoaXMudmlld0JveD1bMCwwLDAsMF0sdGhpcy5kYXRhQm94PVstMTAsLTEwLDEwLDEwXSx0aGlzLmdyaWRMaW5lRW5hYmxlPVshMCwhMF0sdGhpcy5ncmlkTGluZVdpZHRoPVsxLDFdLHRoaXMuZ3JpZExpbmVDb2xvcj1bWzAsMCwwLDFdLFswLDAsMCwxXV0sdGhpcy5waXhlbFJhdGlvPTEsdGhpcy50aWNrTWFya0xlbmd0aD1bMCwwLDAsMF0sdGhpcy50aWNrTWFya1dpZHRoPVswLDAsMCwwXSx0aGlzLnRpY2tNYXJrQ29sb3I9W1swLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXV0sdGhpcy50aWNrUGFkPVsxNSwxNSwxNSwxNV0sdGhpcy50aWNrQW5nbGU9WzAsMCwwLDBdLHRoaXMudGlja0VuYWJsZT1bITAsITAsITAsITBdLHRoaXMudGlja0NvbG9yPVtbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXSxbMCwwLDAsMV1dLHRoaXMubGFiZWxQYWQ9WzE1LDE1LDE1LDE1XSx0aGlzLmxhYmVsQW5nbGU9WzAsTWF0aC5QSS8yLDAsMypNYXRoLlBJLzJdLHRoaXMubGFiZWxFbmFibGU9WyEwLCEwLCEwLCEwXSx0aGlzLmxhYmVsQ29sb3I9W1swLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXV0sdGhpcy50aXRsZUNlbnRlcj1bMCwwXSx0aGlzLnRpdGxlRW5hYmxlPSEwLHRoaXMudGl0bGVBbmdsZT0wLHRoaXMudGl0bGVDb2xvcj1bMCwwLDAsMV0sdGhpcy5ib3JkZXJDb2xvcj1bMCwwLDAsMF0sdGhpcy5iYWNrZ3JvdW5kQ29sb3I9WzAsMCwwLDBdLHRoaXMuemVyb0xpbmVFbmFibGU9WyEwLCEwXSx0aGlzLnplcm9MaW5lV2lkdGg9WzQsNF0sdGhpcy56ZXJvTGluZUNvbG9yPVtbMCwwLDAsMV0sWzAsMCwwLDFdXSx0aGlzLmJvcmRlckxpbmVFbmFibGU9WyEwLCEwLCEwLCEwXSx0aGlzLmJvcmRlckxpbmVXaWR0aD1bMiwyLDIsMl0sdGhpcy5ib3JkZXJMaW5lQ29sb3I9W1swLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXV0sdGhpcy5ncmlkPW51bGwsdGhpcy50ZXh0PW51bGwsdGhpcy5saW5lPW51bGwsdGhpcy5ib3g9bnVsbCx0aGlzLm9iamVjdHM9W10sdGhpcy5vdmVybGF5cz1bXSx0aGlzLl90aWNrQm91bmRzPVsxLzAsMS8wLC0oMS8wKSwtKDEvMCldLHRoaXMuc3RhdGljPSExLHRoaXMuZGlydHk9ITEsdGhpcy5waWNrRGlydHk9ITEsdGhpcy5waWNrRGVsYXk9MTIwLHRoaXMucGlja1JhZGl1cz0xMCx0aGlzLl9waWNrVGltZW91dD1udWxsLHRoaXMuX2RyYXdQaWNrPXRoaXMuZHJhd1BpY2suYmluZCh0aGlzKSx0aGlzLl9kZXB0aENvdW50ZXI9MH1mdW5jdGlvbiBpKHQpe2Zvcih2YXIgZT10LnNsaWNlKCkscj0wO3I8ZS5sZW5ndGg7KytyKWVbcl09ZVtyXS5zbGljZSgpO3JldHVybiBlfWZ1bmN0aW9uIGEodCxlKXtyZXR1cm4gdC54LWUueH1mdW5jdGlvbiBvKHQpe3ZhciBlPXQuZ2wscj1zKGUsW2UuZHJhd2luZ0J1ZmZlcldpZHRoLGUuZHJhd2luZ0J1ZmZlckhlaWdodF0pLGk9bmV3IG4oZSxyKTtyZXR1cm4gaS5ncmlkPWwoaSksaS50ZXh0PXUoaSksaS5saW5lPWMoaSksaS5ib3g9aChpKSxpLnVwZGF0ZSh0KSxpfWUuZXhwb3J0cz1vO3ZhciBzPXQoImdsLXNlbGVjdC1zdGF0aWMiKSxsPXQoIi4vbGliL2dyaWQiKSx1PXQoIi4vbGliL3RleHQiKSxjPXQoIi4vbGliL2xpbmUiKSxoPXQoIi4vbGliL2JveCIpLGY9bi5wcm90b3R5cGU7Zi5zZXREaXJ0eT1mdW5jdGlvbigpe3RoaXMuZGlydHk9dGhpcy5waWNrRGlydHk9ITB9LGYuc2V0T3ZlcmxheURpcnR5PWZ1bmN0aW9uKCl7dGhpcy5kaXJ0eT0hMH0sZi5uZXh0RGVwdGhWYWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZXB0aENvdW50ZXIrKy82NTUzNn0sZi5kcmF3PWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nbCxlPXRoaXMuc2NyZWVuQm94LHI9dGhpcy52aWV3Qm94LG49dGhpcy5kYXRhQm94LGk9dGhpcy5waXhlbFJhdGlvLGE9dGhpcy5ncmlkLG89dGhpcy5saW5lLHM9dGhpcy50ZXh0LGw9dGhpcy5vYmplY3RzO2lmKHRoaXMuX2RlcHRoQ291bnRlcj0wLHRoaXMucGlja0RpcnR5JiYodGhpcy5fcGlja1RpbWVvdXQmJmNsZWFyVGltZW91dCh0aGlzLl9waWNrVGltZW91dCksdGhpcy5waWNrRGlydHk9ITEsdGhpcy5fcGlja1RpbWVvdXQ9c2V0VGltZW91dCh0aGlzLl9kcmF3UGljayx0aGlzLnBpY2tEZWxheSkpLHRoaXMuZGlydHkpe3RoaXMuZGlydHk9ITEsdC5iaW5kRnJhbWVidWZmZXIodC5GUkFNRUJVRkZFUixudWxsKSx0LmVuYWJsZSh0LlNDSVNTT1JfVEVTVCksdC5kaXNhYmxlKHQuREVQVEhfVEVTVCksdC5kZXB0aEZ1bmModC5MRVNTKSx0LmRlcHRoTWFzayghMSksdC5lbmFibGUodC5CTEVORCksdC5ibGVuZEVxdWF0aW9uKHQuRlVOQ19BREQsdC5GVU5DX0FERCksdC5ibGVuZEZ1bmModC5PTkUsdC5PTkVfTUlOVVNfU1JDX0FMUEhBKSx0LnNjaXNzb3IoZVswXSxlWzFdLGVbMl0tZVswXSxlWzNdLWVbMV0pO3ZhciB1PXRoaXMuYm9yZGVyQ29sb3I7dC5jbGVhckNvbG9yKHVbMF0qdVszXSx1WzFdKnVbM10sdVsyXSp1WzNdLHVbM10pLHQuY2xlYXIodC5DT0xPUl9CVUZGRVJfQklUfHQuREVQVEhfQlVGRkVSX0JJVCksdC5zY2lzc29yKHJbMF0sclsxXSxyWzJdLXJbMF0sclszXS1yWzFdKSx0LnZpZXdwb3J0KHJbMF0sclsxXSxyWzJdLXJbMF0sclszXS1yWzFdKTt2YXIgYz10aGlzLmJhY2tncm91bmRDb2xvcjt0LmNsZWFyQ29sb3IoY1swXSpjWzNdLGNbMV0qY1szXSxjWzJdKmNbM10sY1szXSksdC5jbGVhcih0LkNPTE9SX0JVRkZFUl9CSVQpLGEuZHJhdygpO3ZhciBoPXRoaXMuemVyb0xpbmVFbmFibGUsZj10aGlzLnplcm9MaW5lQ29sb3IsZD10aGlzLnplcm9MaW5lV2lkdGg7aWYoaFswXXx8aFsxXSl7by5iaW5kKCk7Zm9yKHZhciBwPTA7cDwyOysrcClpZihoW3BdJiZuW3BdPD0wJiZuW3ArMl0+PTApewp2YXIgZz1lW3BdLW5bcF0qKGVbcCsyXS1lW3BdKS8obltwKzJdLW5bcF0pOzA9PT1wP28uZHJhd0xpbmUoZyxlWzFdLGcsZVszXSxkW3BdLGZbcF0pOm8uZHJhd0xpbmUoZVswXSxnLGVbMl0sZyxkW3BdLGZbcF0pfX1mb3IodmFyIHA9MDtwPGwubGVuZ3RoOysrcClsW3BdLmRyYXcoKTt0LnZpZXdwb3J0KGVbMF0sZVsxXSxlWzJdLWVbMF0sZVszXS1lWzFdKSx0LnNjaXNzb3IoZVswXSxlWzFdLGVbMl0tZVswXSxlWzNdLWVbMV0pLHRoaXMuZ3JpZC5kcmF3VGlja01hcmtzKCksby5iaW5kKCk7dmFyIG09dGhpcy5ib3JkZXJMaW5lRW5hYmxlLHY9dGhpcy5ib3JkZXJMaW5lV2lkdGgseT10aGlzLmJvcmRlckxpbmVDb2xvcjttWzFdJiZvLmRyYXdMaW5lKHJbMF0sclsxXS0uNSp2WzFdKmksclswXSxyWzNdKy41KnZbM10qaSx2WzFdLHlbMV0pLG1bMF0mJm8uZHJhd0xpbmUoclswXS0uNSp2WzBdKmksclsxXSxyWzJdKy41KnZbMl0qaSxyWzFdLHZbMF0seVswXSksbVszXSYmby5kcmF3TGluZShyWzJdLHJbMV0tLjUqdlsxXSppLHJbMl0sclszXSsuNSp2WzNdKmksdlszXSx5WzNdKSxtWzJdJiZvLmRyYXdMaW5lKHJbMF0tLjUqdlswXSppLHJbM10sclsyXSsuNSp2WzJdKmksclszXSx2WzJdLHlbMl0pLHMuYmluZCgpO2Zvcih2YXIgcD0wO3A8MjsrK3Apcy5kcmF3VGlja3MocCk7dGhpcy50aXRsZUVuYWJsZSYmcy5kcmF3VGl0bGUoKTtmb3IodmFyIHg9dGhpcy5vdmVybGF5cyxwPTA7cDx4Lmxlbmd0aDsrK3ApeFtwXS5kcmF3KCk7dC5kaXNhYmxlKHQuU0NJU1NPUl9URVNUKSx0LmRpc2FibGUodC5CTEVORCksdC5kZXB0aE1hc2soITApfX19KCksZi5kcmF3UGljaz1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe2lmKCF0aGlzLnN0YXRpYyl7dmFyIHQ9dGhpcy5waWNrQnVmZmVyO3RoaXMuZ2w7dGhpcy5fcGlja1RpbWVvdXQ9bnVsbCx0LmJlZ2luKCk7Zm9yKHZhciBlPTEscj10aGlzLm9iamVjdHMsbj0wO248ci5sZW5ndGg7KytuKWU9cltuXS5kcmF3UGljayhlKTt0LmVuZCgpfX19KCksZi5waWNrPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7aWYoIXRoaXMuc3RhdGljKXt2YXIgcj10aGlzLnBpeGVsUmF0aW8sbj10aGlzLnBpY2tQaXhlbFJhdGlvLGk9dGhpcy52aWV3Qm94LGE9MHxNYXRoLnJvdW5kKCh0LWlbMF0vcikqbiksbz0wfE1hdGgucm91bmQoKGUtaVsxXS9yKSpuKSxzPXRoaXMucGlja0J1ZmZlci5xdWVyeShhLG8sdGhpcy5waWNrUmFkaXVzKTtpZighcylyZXR1cm4gbnVsbDtmb3IodmFyIGw9cy5pZCsocy52YWx1ZVswXTw8OCkrKHMudmFsdWVbMV08PDE2KSsocy52YWx1ZVsyXTw8MjQpLHU9dGhpcy5vYmplY3RzLGM9MDtjPHUubGVuZ3RoOysrYyl7dmFyIGg9dVtjXS5waWNrKGEsbyxsKTtpZihoKXJldHVybiBofXJldHVybiBudWxsfX19KCksZi5zZXRTY3JlZW5Cb3g9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zY3JlZW5Cb3gscj10aGlzLnBpeGVsUmF0aW87ZVswXT0wfE1hdGgucm91bmQodFswXSpyKSxlWzFdPTB8TWF0aC5yb3VuZCh0WzFdKnIpLGVbMl09MHxNYXRoLnJvdW5kKHRbMl0qciksZVszXT0wfE1hdGgucm91bmQodFszXSpyKSx0aGlzLnNldERpcnR5KCl9LGYuc2V0RGF0YUJveD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmRhdGFCb3gscj1lWzBdIT09dFswXXx8ZVsxXSE9PXRbMV18fGVbMl0hPT10WzJdfHxlWzNdIT09dFszXTtyJiYoZVswXT10WzBdLGVbMV09dFsxXSxlWzJdPXRbMl0sZVszXT10WzNdLHRoaXMuc2V0RGlydHkoKSl9LGYuc2V0Vmlld0JveD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnBpeGVsUmF0aW8scj10aGlzLnZpZXdCb3g7clswXT0wfE1hdGgucm91bmQodFswXSplKSxyWzFdPTB8TWF0aC5yb3VuZCh0WzFdKmUpLHJbMl09MHxNYXRoLnJvdW5kKHRbMl0qZSksclszXT0wfE1hdGgucm91bmQodFszXSplKTt2YXIgbj10aGlzLnBpY2tQaXhlbFJhdGlvO3RoaXMucGlja0J1ZmZlci5zaGFwZT1bMHxNYXRoLnJvdW5kKCh0WzJdLXRbMF0pKm4pLDB8TWF0aC5yb3VuZCgodFszXS10WzFdKSpuKV0sdGhpcy5zZXREaXJ0eSgpfSxmLnVwZGF0ZT1mdW5jdGlvbih0KXt0PXR8fHt9O3ZhciBlPXRoaXMuZ2w7dGhpcy5waXhlbFJhdGlvPXQucGl4ZWxSYXRpb3x8MTt2YXIgcj10aGlzLnBpeGVsUmF0aW87dGhpcy5waWNrUGl4ZWxSYXRpbz1NYXRoLm1heChyLDEpLHRoaXMuc2V0U2NyZWVuQm94KHQuc2NyZWVuQm94fHxbMCwwLGUuZHJhd2luZ0J1ZmZlcldpZHRoL3IsZS5kcmF3aW5nQnVmZmVySGVpZ2h0L3JdKTt0aGlzLnNjcmVlbkJveDt0aGlzLnNldFZpZXdCb3godC52aWV3Qm94fHxbLjEyNSoodGhpcy5zY3JlZW5Cb3hbMl0tdGhpcy5zY3JlZW5Cb3hbMF0pL3IsLjEyNSoodGhpcy5zY3JlZW5Cb3hbM10tdGhpcy5zY3JlZW5Cb3hbMV0pL3IsLjg3NSoodGhpcy5zY3JlZW5Cb3hbMl0tdGhpcy5zY3JlZW5Cb3hbMF0pL3IsLjg3NSoodGhpcy5zY3JlZW5Cb3hbM10tdGhpcy5zY3JlZW5Cb3hbMV0pL3JdKTt2YXIgbj10aGlzLnZpZXdCb3gsbz0oblsyXS1uWzBdKS8oblszXS1uWzFdKTt0aGlzLnNldERhdGFCb3godC5kYXRhQm94fHxbLTEwLC0xMC9vLDEwLDEwL29dKSx0aGlzLmJvcmRlckNvbG9yPSh0LmJvcmRlckNvbG9yfHxbMCwwLDAsMF0pLnNsaWNlKCksdGhpcy5iYWNrZ3JvdW5kQ29sb3I9KHQuYmFja2dyb3VuZENvbG9yfHxbMCwwLDAsMF0pLnNsaWNlKCksdGhpcy5ncmlkTGluZUVuYWJsZT0odC5ncmlkTGluZUVuYWJsZXx8WyEwLCEwXSkuc2xpY2UoKSx0aGlzLmdyaWRMaW5lV2lkdGg9KHQuZ3JpZExpbmVXaWR0aHx8WzEsMV0pLnNsaWNlKCksdGhpcy5ncmlkTGluZUNvbG9yPWkodC5ncmlkTGluZUNvbG9yfHxbWy41LC41LC41LDFdLFsuNSwuNSwuNSwxXV0pLHRoaXMuemVyb0xpbmVFbmFibGU9KHQuemVyb0xpbmVFbmFibGV8fFshMCwhMF0pLnNsaWNlKCksdGhpcy56ZXJvTGluZVdpZHRoPSh0Lnplcm9MaW5lV2lkdGh8fFs0LDRdKS5zbGljZSgpLHRoaXMuemVyb0xpbmVDb2xvcj1pKHQuemVyb0xpbmVDb2xvcnx8W1swLDAsMCwxXSxbMCwwLDAsMV1dKSx0aGlzLnRpY2tNYXJrTGVuZ3RoPSh0LnRpY2tNYXJrTGVuZ3RofHxbMCwwLDAsMF0pLnNsaWNlKCksdGhpcy50aWNrTWFya1dpZHRoPSh0LnRpY2tNYXJrV2lkdGh8fFswLDAsMCwwXSkuc2xpY2UoKSx0aGlzLnRpY2tNYXJrQ29sb3I9aSh0LnRpY2tNYXJrQ29sb3J8fFtbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXSxbMCwwLDAsMV1dKSx0aGlzLnRpdGxlQ2VudGVyPSh0LnRpdGxlQ2VudGVyfHxbLjUqKG5bMF0rblsyXSkvciwoblszXSsxMjApL3JdKS5zbGljZSgpLHRoaXMudGl0bGVFbmFibGU9ISgidGl0bGVFbmFibGUiaW4gdCYmIXQudGl0bGVFbmFibGUpLHRoaXMudGl0bGVBbmdsZT10LnRpdGxlQW5nbGV8fDAsdGhpcy50aXRsZUNvbG9yPSh0LnRpdGxlQ29sb3J8fFswLDAsMCwxXSkuc2xpY2UoKSx0aGlzLmxhYmVsUGFkPSh0LmxhYmVsUGFkfHxbMTUsMTUsMTUsMTVdKS5zbGljZSgpLHRoaXMubGFiZWxBbmdsZT0odC5sYWJlbEFuZ2xlfHxbMCxNYXRoLlBJLzIsMCwzKk1hdGguUEkvMl0pLnNsaWNlKCksdGhpcy5sYWJlbEVuYWJsZT0odC5sYWJlbEVuYWJsZXx8WyEwLCEwLCEwLCEwXSkuc2xpY2UoKSx0aGlzLmxhYmVsQ29sb3I9aSh0LmxhYmVsQ29sb3J8fFtbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXSxbMCwwLDAsMV1dKSx0aGlzLnRpY2tQYWQ9KHQudGlja1BhZHx8WzE1LDE1LDE1LDE1XSkuc2xpY2UoKSx0aGlzLnRpY2tBbmdsZT0odC50aWNrQW5nbGV8fFswLDAsMCwwXSkuc2xpY2UoKSx0aGlzLnRpY2tFbmFibGU9KHQudGlja0VuYWJsZXx8WyEwLCEwLCEwLCEwXSkuc2xpY2UoKSx0aGlzLnRpY2tDb2xvcj1pKHQudGlja0NvbG9yfHxbWzAsMCwwLDFdLFswLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdXSksdGhpcy5ib3JkZXJMaW5lRW5hYmxlPSh0LmJvcmRlckxpbmVFbmFibGV8fFshMCwhMCwhMCwhMF0pLnNsaWNlKCksdGhpcy5ib3JkZXJMaW5lV2lkdGg9KHQuYm9yZGVyTGluZVdpZHRofHxbMiwyLDIsMl0pLnNsaWNlKCksdGhpcy5ib3JkZXJMaW5lQ29sb3I9aSh0LmJvcmRlckxpbmVDb2xvcnx8W1swLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXV0pO3ZhciBzPXQudGlja3N8fFtbXSxbXV0sbD10aGlzLl90aWNrQm91bmRzO2xbMF09bFsxXT0xLzAsbFsyXT1sWzNdPS0oMS8wKTtmb3IodmFyIHU9MDt1PDI7Kyt1KXt2YXIgYz1zW3VdLnNsaWNlKDApOzAhPT1jLmxlbmd0aCYmKGMuc29ydChhKSxsW3VdPU1hdGgubWluKGxbdV0sY1swXS54KSxsW3UrMl09TWF0aC5tYXgobFt1KzJdLGNbYy5sZW5ndGgtMV0ueCkpfXRoaXMuZ3JpZC51cGRhdGUoe2JvdW5kczpsLHRpY2tzOnN9KSx0aGlzLnRleHQudXBkYXRlKHtib3VuZHM6bCx0aWNrczpzLGxhYmVsczp0LmxhYmVsc3x8WyJ4IiwieSJdLGxhYmVsU2l6ZTp0LmxhYmVsU2l6ZXx8WzEyLDEyXSxsYWJlbEZvbnQ6dC5sYWJlbEZvbnR8fFsic2Fucy1zZXJpZiIsInNhbnMtc2VyaWYiXSx0aXRsZTp0LnRpdGxlfHwiIix0aXRsZVNpemU6dC50aXRsZVNpemV8fDE4LHRpdGxlRm9udDp0LnRpdGxlRm9udHx8InNhbnMtc2VyaWYifSksdGhpcy5zdGF0aWM9ISF0LnN0YXRpYyx0aGlzLnNldERpcnR5KCl9LGYuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuYm94LmRpc3Bvc2UoKSx0aGlzLmdyaWQuZGlzcG9zZSgpLHRoaXMudGV4dC5kaXNwb3NlKCksdGhpcy5saW5lLmRpc3Bvc2UoKTtmb3IodmFyIHQ9dGhpcy5vYmplY3RzLmxlbmd0aC0xO3Q+PTA7LS10KXRoaXMub2JqZWN0c1t0XS5kaXNwb3NlKCk7dGhpcy5vYmplY3RzLmxlbmd0aD0wO2Zvcih2YXIgdD10aGlzLm92ZXJsYXlzLmxlbmd0aC0xO3Q+PTA7LS10KXRoaXMub3ZlcmxheXNbdF0uZGlzcG9zZSgpO3RoaXMub3ZlcmxheXMubGVuZ3RoPTAsdGhpcy5nbD1udWxsfSxmLmFkZE9iamVjdD1mdW5jdGlvbih0KXt0aGlzLm9iamVjdHMuaW5kZXhPZih0KTwwJiYodGhpcy5vYmplY3RzLnB1c2godCksdGhpcy5zZXREaXJ0eSgpKX0sZi5yZW1vdmVPYmplY3Q9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMub2JqZWN0cyxyPTA7cjxlLmxlbmd0aDsrK3IpaWYoZVtyXT09PXQpe2Uuc3BsaWNlKHIsMSksdGhpcy5zZXREaXJ0eSgpO2JyZWFrfX0sZi5hZGRPdmVybGF5PWZ1bmN0aW9uKHQpe3RoaXMub3ZlcmxheXMuaW5kZXhPZih0KTwwJiYodGhpcy5vdmVybGF5cy5wdXNoKHQpLHRoaXMuc2V0T3ZlcmxheURpcnR5KCkpfSxmLnJlbW92ZU92ZXJsYXk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMub3ZlcmxheXMscj0wO3I8ZS5sZW5ndGg7KytyKWlmKGVbcl09PT10KXtlLnNwbGljZShyLDEpLHRoaXMuc2V0T3ZlcmxheURpcnR5KCk7YnJlYWt9fX0seyIuL2xpYi9ib3giOjE3NCwiLi9saWIvZ3JpZCI6MTc1LCIuL2xpYi9saW5lIjoxNzYsIi4vbGliL3RleHQiOjE3OCwiZ2wtc2VsZWN0LXN0YXRpYyI6MjE5fV0sMTg4OltmdW5jdGlvbih0LGUscil7dmFyIG49dCgiZ2wtc2hhZGVyIiksaT0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuYXR0cmlidXRlIHZlYzIgcG9zaXRpb247XG52YXJ5aW5nIHZlYzIgdXY7XG52b2lkIG1haW4oKSB7XG4gIHV2ID0gcG9zaXRpb247XG4gIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMCwgMSk7XG59IixhPSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbnVuaWZvcm0gc2FtcGxlcjJEIGFjY3VtQnVmZmVyO1xudmFyeWluZyB2ZWMyIHV2O1xuXG52b2lkIG1haW4oKSB7XG4gIHZlYzQgYWNjdW0gPSB0ZXh0dXJlMkQoYWNjdW1CdWZmZXIsIDAuNSAqICh1diArIDEuMCkpO1xuICBnbF9GcmFnQ29sb3IgPSBtaW4odmVjNCgxLDEsMSwxKSwgYWNjdW0pO1xufSI7ZS5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBuKHQsaSxhLG51bGwsW3tuYW1lOiJwb3NpdGlvbiIsdHlwZToidmVjMiJ9XSl9fSx7ImdsLXNoYWRlciI6MjIwfV0sMTg5OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oKXt0aGlzLm1vdXNlPVstMSwtMV0sdGhpcy5zY3JlZW49bnVsbCx0aGlzLmRpc3RhbmNlPTEvMCx0aGlzLmluZGV4PW51bGwsdGhpcy5kYXRhQ29vcmRpbmF0ZT1udWxsLHRoaXMuZGF0YVBvc2l0aW9uPW51bGwsdGhpcy5vYmplY3Q9bnVsbCx0aGlzLmRhdGE9bnVsbH1mdW5jdGlvbiBpKHQsZSl7dmFyIHI9bnVsbDt0cnl7cj10LmdldENvbnRleHQoIndlYmdsIixlKSxyfHwocj10LmdldENvbnRleHQoImV4cGVyaW1lbnRhbC13ZWJnbCIsZSkpfWNhdGNoKHQpe3JldHVybiBudWxsfXJldHVybiByfWZ1bmN0aW9uIGEodCl7dmFyIGU9TWF0aC5yb3VuZChNYXRoLmxvZyhNYXRoLmFicyh0KSkvTWF0aC5sb2coMTApKTtpZihlPDApe3ZhciByPU1hdGgucm91bmQoTWF0aC5wb3coMTAsLWUpKTtyZXR1cm4gTWF0aC5jZWlsKHQqcikvcn1pZihlPjApe3ZhciByPU1hdGgucm91bmQoTWF0aC5wb3coMTAsZSkpO3JldHVybiBNYXRoLmNlaWwodC9yKSpyfXJldHVybiBNYXRoLmNlaWwodCl9ZnVuY3Rpb24gbyh0KXtyZXR1cm4iYm9vbGVhbiIhPXR5cGVvZiB0fHx0fWZ1bmN0aW9uIHModCl7ZnVuY3Rpb24gZSgpe2lmKCFfJiZILmF1dG9SZXNpemUpe3ZhciB0PXcucGFyZW50Tm9kZSxlPTEscj0xO3QmJnQhPT1kb2N1bWVudC5ib2R5PyhlPXQuY2xpZW50V2lkdGgscj10LmNsaWVudEhlaWdodCk6KGU9d2luZG93LmlubmVyV2lkdGgscj13aW5kb3cuaW5uZXJIZWlnaHQpO3ZhciBuPTB8TWF0aC5jZWlsKGUqSC5waXhlbFJhdGlvKSxpPTB8TWF0aC5jZWlsKHIqSC5waXhlbFJhdGlvKTtpZihuIT09dy53aWR0aHx8aSE9PXcuaGVpZ2h0KXt3LndpZHRoPW4sdy5oZWlnaHQ9aTt2YXIgYT13LnN0eWxlO2EucG9zaXRpb249YS5wb3NpdGlvbnx8ImFic29sdXRlIixhLmxlZnQ9IjBweCIsYS50b3A9IjBweCIsYS53aWR0aD1lKyJweCIsYS5oZWlnaHQ9cisicHgiLGo9ITB9fX1mdW5jdGlvbiByKCl7Zm9yKHZhciB0PUQubGVuZ3RoLGU9Ri5sZW5ndGgscj0wO3I8ZTsrK3IpT1tyXT0wO3Q6Zm9yKHZhciByPTA7cjx0Oysrcil7dmFyIG49RFtyXSxpPW4ucGlja1Nsb3RzO2lmKGkpe2Zvcih2YXIgYT0wO2E8ZTsrK2EpaWYoT1thXStpPDI1NSl7UltyXT1hLG4uc2V0UGlja0Jhc2UoT1thXSsxKSxPW2FdKz1pO2NvbnRpbnVlIHR9dmFyIG89ZihBLHEpO1Jbcl09ZSxGLnB1c2gobyksTy5wdXNoKGkpLG4uc2V0UGlja0Jhc2UoMSksZSs9MX1lbHNlIFJbcl09LTF9Zm9yKDtlPjAmJjA9PT1PW2UtMV07KU8ucG9wKCksRi5wb3AoKS5kaXNwb3NlKCl9ZnVuY3Rpb24gcygpe3JldHVybiEhSC5jb250ZXh0TG9zdHx8dm9pZChBLmlzQ29udGV4dExvc3QoKSYmKEguY29udGV4dExvc3Q9ITAsSC5tb3VzZUxpc3RlbmVyLmVuYWJsZWQ9ITEsSC5zZWxlY3Rpb24ub2JqZWN0PW51bGwsSC5vbmNvbnRleHRsb3NzJiZILm9uY29udGV4dGxvc3MoKSkpfWZ1bmN0aW9uIHkoKXtpZighcygpKXtBLmNvbG9yTWFzayghMCwhMCwhMCwhMCksQS5kZXB0aE1hc2soITApLEEuZGlzYWJsZShBLkJMRU5EKSxBLmVuYWJsZShBLkRFUFRIX1RFU1QpO2Zvcih2YXIgdD1ELmxlbmd0aCxlPUYubGVuZ3RoLHI9MDtyPGU7KytyKXt2YXIgbj1GW3JdO24uc2hhcGU9RyxuLmJlZ2luKCk7Zm9yKHZhciBpPTA7aTx0OysraSlpZihSW2ldPT09cil7dmFyIGE9RFtpXTthLmRyYXdQaWNrJiYoYS5waXhlbFJhdGlvPTEsYS5kcmF3UGljayhWKSl9bi5lbmQoKX19fWZ1bmN0aW9uIHgoKXtpZighcygpKXtlKCk7dmFyIHQ9SC5jYW1lcmEudGljaygpO1Yudmlldz1ILmNhbWVyYS5tYXRyaXgsaj1qfHx0LE49Tnx8dCxDLnBpeGVsUmF0aW89SC5waXhlbFJhdGlvLFAucGl4ZWxSYXRpbz1ILnBpeGVsUmF0aW87dmFyIHI9RC5sZW5ndGgsbj1XWzBdLGk9V1sxXTtuWzBdPW5bMV09blsyXT0xLzAsaVswXT1pWzFdPWlbMl09LSgxLzApO2Zvcih2YXIgbz0wO288cjsrK28pe3ZhciBsPURbb107bC5waXhlbFJhdGlvPUgucGl4ZWxSYXRpbyxsLmF4ZXM9SC5heGVzLGo9anx8ISFsLmRpcnR5LE49Tnx8ISFsLmRpcnR5O3ZhciB1PWwuYm91bmRzO2lmKHUpZm9yKHZhciBoPXVbMF0sZj11WzFdLGQ9MDtkPDM7KytkKW5bZF09TWF0aC5taW4obltkXSxoW2RdKSxpW2RdPU1hdGgubWF4KGlbZF0sZltkXSl9dmFyIGc9SC5ib3VuZHM7aWYoSC5hdXRvQm91bmRzKWZvcih2YXIgZD0wO2Q8MzsrK2Qpe2lmKGlbZF08bltkXSluW2RdPS0xLGlbZF09MTtlbHNle25bZF09PT1pW2RdJiYobltkXS09MSxpW2RdKz0xKTt2YXIgdj0uMDUqKGlbZF0tbltkXSk7bltkXT1uW2RdLXYsaVtkXT1pW2RdK3Z9Z1swXVtkXT1uW2RdLGdbMV1bZF09aVtkXX1mb3IodmFyIHg9ITEsZD0wO2Q8MzsrK2QpeD14fHxaWzBdW2RdIT09Z1swXVtkXXx8WlsxXVtkXSE9PWdbMV1bZF0sWlswXVtkXT1nWzBdW2RdLFpbMV1bZF09Z1sxXVtkXTtpZih4KXtmb3IodmFyIGI9WzAsMCwwXSxvPTA7bzwzOysrbyliW29dPWEoKGdbMV1bb10tZ1swXVtvXSkvMTApO0MuYXV0b1RpY2tzP0MudXBkYXRlKHtib3VuZHM6Zyx0aWNrU3BhY2luZzpifSk6Qy51cGRhdGUoe2JvdW5kczpnfSl9Tj1OfHx4LGo9anx8eDt2YXIgXz1BLmRyYXdpbmdCdWZmZXJXaWR0aCx3PUEuZHJhd2luZ0J1ZmZlckhlaWdodDtxWzBdPV8scVsxXT13LEdbMF09MHxNYXRoLm1heChfL0gucGl4ZWxSYXRpbywxKSxHWzFdPTB8TWF0aC5tYXgody9ILnBpeGVsUmF0aW8sMSksbShCLEguZm92eSxfL3csSC56TmVhcixILnpGYXIpO2Zvcih2YXIgbz0wO288MTY7KytvKVVbb109MDtVWzE1XT0xO2Zvcih2YXIgTT0wLG89MDtvPDM7KytvKU09TWF0aC5tYXgoTSxnWzFdW29dLWdbMF1bb10pO2Zvcih2YXIgbz0wO288MzsrK28pSC5hdXRvU2NhbGU/VVs1Km9dPUguYXNwZWN0W29dLyhnWzFdW29dLWdbMF1bb10pOlVbNSpvXT0xL00sSC5hdXRvQ2VudGVyJiYoVVsxMitvXT0uNSotVVs1Km9dKihnWzBdW29dK2dbMV1bb10pKTtmb3IodmFyIG89MDtvPHI7KytvKXt2YXIgbD1EW29dO2wuYXhlc0JvdW5kcz1nLEguY2xpcFRvQm91bmRzJiYobC5jbGlwQm91bmRzPWcpfWlmKFQub2JqZWN0JiYoSC5zbmFwVG9EYXRhP1AucG9zaXRpb249VC5kYXRhQ29vcmRpbmF0ZTpQLnBvc2l0aW9uPVQuZGF0YVBvc2l0aW9uLFAuYm91bmRzPWcpLE4mJihOPSExLHkoKSksail7SC5heGVzUGl4ZWxzPWMoSC5heGVzLFYsXyx3KSxILm9ucmVuZGVyJiZILm9ucmVuZGVyKCksQS5iaW5kRnJhbWVidWZmZXIoQS5GUkFNRUJVRkZFUixudWxsKSxBLnZpZXdwb3J0KDAsMCxfLHcpO3ZhciBrPUguY2xlYXJDb2xvcjtBLmNsZWFyQ29sb3Ioa1swXSxrWzFdLGtbMl0sa1szXSksQS5jbGVhcihBLkNPTE9SX0JVRkZFUl9CSVR8QS5ERVBUSF9CVUZGRVJfQklUKSxBLmRlcHRoTWFzayghMCksQS5jb2xvck1hc2soITAsITAsITAsITApLEEuZW5hYmxlKEEuREVQVEhfVEVTVCksQS5kZXB0aEZ1bmMoQS5MRVFVQUwpLEEuZGlzYWJsZShBLkJMRU5EKSxBLmRpc2FibGUoQS5DVUxMX0ZBQ0UpO3ZhciBMPSExO0MuZW5hYmxlJiYoTD1MfHxDLmlzVHJhbnNwYXJlbnQoKSxDLmRyYXcoVikpLFAuYXhlcz1DLFQub2JqZWN0JiZQLmRyYXcoViksQS5kaXNhYmxlKEEuQ1VMTF9GQUNFKTtmb3IodmFyIG89MDtvPHI7KytvKXt2YXIgbD1EW29dO2wuYXhlcz1DLGwucGl4ZWxSYXRpbz1ILnBpeGVsUmF0aW8sbC5pc09wYXF1ZSYmbC5pc09wYXF1ZSgpJiZsLmRyYXcoViksbC5pc1RyYW5zcGFyZW50JiZsLmlzVHJhbnNwYXJlbnQoKSYmKEw9ITApfWlmKEwpe0Uuc2hhcGU9cSxFLmJpbmQoKSxBLmNsZWFyKEEuREVQVEhfQlVGRkVSX0JJVCksQS5jb2xvck1hc2soITEsITEsITEsITEpLEEuZGVwdGhNYXNrKCEwKSxBLmRlcHRoRnVuYyhBLkxFU1MpLEMuZW5hYmxlJiZDLmlzVHJhbnNwYXJlbnQoKSYmQy5kcmF3VHJhbnNwYXJlbnQoVik7Zm9yKHZhciBvPTA7bzxyOysrbyl7dmFyIGw9RFtvXTtsLmlzT3BhcXVlJiZsLmlzT3BhcXVlKCkmJmwuZHJhdyhWKX1BLmVuYWJsZShBLkJMRU5EKSxBLmJsZW5kRXF1YXRpb24oQS5GVU5DX0FERCksQS5ibGVuZEZ1bmMoQS5PTkUsQS5PTkVfTUlOVVNfU1JDX0FMUEhBKSxBLmNvbG9yTWFzayghMCwhMCwhMCwhMCksQS5kZXB0aE1hc2soITEpLEEuY2xlYXJDb2xvcigwLDAsMCwwKSxBLmNsZWFyKEEuQ09MT1JfQlVGRkVSX0JJVCksQy5pc1RyYW5zcGFyZW50KCkmJkMuZHJhd1RyYW5zcGFyZW50KFYpO2Zvcih2YXIgbz0wO288cjsrK28pe3ZhciBsPURbb107bC5pc1RyYW5zcGFyZW50JiZsLmlzVHJhbnNwYXJlbnQoKSYmbC5kcmF3VHJhbnNwYXJlbnQoVil9QS5iaW5kRnJhbWVidWZmZXIoQS5GUkFNRUJVRkZFUixudWxsKSxBLmJsZW5kRnVuYyhBLk9ORSxBLk9ORV9NSU5VU19TUkNfQUxQSEEpLEEuZGlzYWJsZShBLkRFUFRIX1RFU1QpLFMuYmluZCgpLEUuY29sb3JbMF0uYmluZCgwKSxTLnVuaWZvcm1zLmFjY3VtQnVmZmVyPTAscChBKSxBLmRpc2FibGUoQS5CTEVORCl9aj0hMTtmb3IodmFyIG89MDtvPHI7KytvKURbb10uZGlydHk9ITF9fX1mdW5jdGlvbiBiKCl7X3x8SC5jb250ZXh0TG9zdHx8KHJlcXVlc3RBbmltYXRpb25GcmFtZShiKSx4KCkpfXQ9dHx8e307dmFyIF89ITEsdz0odC5waXhlbFJhdGlvfHxwYXJzZUZsb2F0KHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKSx0LmNhbnZhcyk7aWYoIXcpaWYodz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSx0LmNvbnRhaW5lcil7dmFyIE09dC5jb250YWluZXI7TS5hcHBlbmRDaGlsZCh3KX1lbHNlIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodyk7dmFyIEE9dC5nbDtpZihBfHwoQT1pKHcsdC5nbE9wdGlvbnN8fHtwcmVtdWx0aXBsaWVkQWxwaGE6ITAsYW50aWFsaWFzOiEwfSkpLCFBKXRocm93IG5ldyBFcnJvcigid2ViZ2wgbm90IHN1cHBvcnRlZCIpO3ZhciBrPXQuYm91bmRzfHxbWy0xMCwtMTAsLTEwXSxbMTAsMTAsMTBdXSxUPW5ldyBuLEU9ZChBLFtBLmRyYXdpbmdCdWZmZXJXaWR0aCxBLmRyYXdpbmdCdWZmZXJIZWlnaHRdLHtwcmVmZXJGbG9hdDohMH0pLFM9dihBKSxMPXQuY2FtZXJhfHx7ZXllOlsyLDAsMF0sY2VudGVyOlswLDAsMF0sdXA6WzAsMSwwXSx6b29tTWluOi4xLHpvb21NYXg6MTAwLG1vZGU6InR1cm50YWJsZSJ9LHo9dC5heGVzfHx7fSxDPXUoQSx6KTtDLmVuYWJsZT0hei5kaXNhYmxlO3ZhciBJPXQuc3Bpa2VzfHx7fSxQPWgoQSxJKSxEPVtdLFI9W10sTz1bXSxGPVtdLGo9ITAsTj0hMCxCPW5ldyBBcnJheSgxNiksVT1uZXcgQXJyYXkoMTYpLFY9e3ZpZXc6bnVsbCxwcm9qZWN0aW9uOkIsbW9kZWw6VX0sTj0hMCxxPVtBLmRyYXdpbmdCdWZmZXJXaWR0aCxBLmRyYXdpbmdCdWZmZXJIZWlnaHRdLEg9e2dsOkEsY29udGV4dExvc3Q6ITEscGl4ZWxSYXRpbzp0LnBpeGVsUmF0aW98fHBhcnNlRmxvYXQod2luZG93LmRldmljZVBpeGVsUmF0aW8pLGNhbnZhczp3LHNlbGVjdGlvbjpULGNhbWVyYTpsKHcsTCksYXhlczpDLGF4ZXNQaXhlbHM6bnVsbCxzcGlrZXM6UCxib3VuZHM6ayxvYmplY3RzOkQsc2hhcGU6cSxhc3BlY3Q6dC5hc3BlY3RSYXRpb3x8WzEsMSwxXSxwaWNrUmFkaXVzOnQucGlja1JhZGl1c3x8MTAsek5lYXI6dC56TmVhcnx8LjAxLHpGYXI6dC56RmFyfHwxZTMsZm92eTp0LmZvdnl8fE1hdGguUEkvNCxjbGVhckNvbG9yOnQuY2xlYXJDb2xvcnx8WzAsMCwwLDBdLGF1dG9SZXNpemU6byh0LmF1dG9SZXNpemUpLGF1dG9Cb3VuZHM6byh0LmF1dG9Cb3VuZHMpLGF1dG9TY2FsZTohIXQuYXV0b1NjYWxlLGF1dG9DZW50ZXI6byh0LmF1dG9DZW50ZXIpLGNsaXBUb0JvdW5kczpvKHQuY2xpcFRvQm91bmRzKSxzbmFwVG9EYXRhOiEhdC5zbmFwVG9EYXRhLG9uc2VsZWN0OnQub25zZWxlY3R8fG51bGwsb25yZW5kZXI6dC5vbnJlbmRlcnx8bnVsbCxvbmNsaWNrOnQub25jbGlja3x8bnVsbCxjYW1lcmFQYXJhbXM6VixvbmNvbnRleHRsb3NzOm51bGwsbW91c2VMaXN0ZW5lcjpudWxsfSxHPVtBLmRyYXdpbmdCdWZmZXJXaWR0aC9ILnBpeGVsUmF0aW98MCxBLmRyYXdpbmdCdWZmZXJIZWlnaHQvSC5waXhlbFJhdGlvfDBdO0guYXV0b1Jlc2l6ZSYmZSgpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLGUpLEgudXBkYXRlPWZ1bmN0aW9uKHQpe198fCh0PXR8fHt9LGo9ITAsTj0hMCl9LEguYWRkPWZ1bmN0aW9uKHQpe198fCh0LmF4ZXM9QyxELnB1c2godCksUi5wdXNoKC0xKSxqPSEwLE49ITAscigpKX0sSC5yZW1vdmU9ZnVuY3Rpb24odCl7aWYoIV8pe3ZhciBlPUQuaW5kZXhPZih0KTtlPDB8fChELnNwbGljZShlLDEpLFIucG9wKCksaj0hMCxOPSEwLHIoKSl9fSxILmRpc3Bvc2U9ZnVuY3Rpb24oKXtpZighXyYmKF89ITAsd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsZSksdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRsb3N0IixzKSxILm1vdXNlTGlzdGVuZXIuZW5hYmxlZD0hMSwhSC5jb250ZXh0TG9zdCkpe0MuZGlzcG9zZSgpLFAuZGlzcG9zZSgpO2Zvcih2YXIgdD0wO3Q8RC5sZW5ndGg7Kyt0KURbdF0uZGlzcG9zZSgpO0UuZGlzcG9zZSgpO2Zvcih2YXIgdD0wO3Q8Ri5sZW5ndGg7Kyt0KUZbdF0uZGlzcG9zZSgpO1MuZGlzcG9zZSgpLEE9bnVsbCxDPW51bGwsUD1udWxsLEQ9W119fTt2YXIgWD0hMSxZPTA7SC5tb3VzZUxpc3RlbmVyPWcodyxmdW5jdGlvbih0LGUscil7aWYoIV8pe3ZhciBuPUYubGVuZ3RoLGk9RC5sZW5ndGgsYT1ULm9iamVjdDtULmRpc3RhbmNlPTEvMCxULm1vdXNlWzBdPWUsVC5tb3VzZVsxXT1yLFQub2JqZWN0PW51bGwsVC5zY3JlZW49bnVsbCxULmRhdGFDb29yZGluYXRlPVQuZGF0YVBvc2l0aW9uPW51bGw7dmFyIG89ITE7aWYodCYmWSlYPSEwO2Vsc2V7WCYmKE49ITApLFg9ITE7Zm9yKHZhciBzPTA7czxuOysrcyl7dmFyIGw9RltzXS5xdWVyeShlLEdbMV0tci0xLEgucGlja1JhZGl1cyk7aWYobCl7aWYobC5kaXN0YW5jZT5ULmRpc3RhbmNlKWNvbnRpbnVlO2Zvcih2YXIgdT0wO3U8aTsrK3Upe3ZhciBjPURbdV07aWYoUlt1XT09PXMpe3ZhciBoPWMucGljayhsKTtoJiYoVC5idXR0b25zPXQsVC5zY3JlZW49bC5jb29yZCxULmRpc3RhbmNlPWwuZGlzdGFuY2UsVC5vYmplY3Q9YyxULmluZGV4PWguZGlzdGFuY2UsVC5kYXRhUG9zaXRpb249aC5wb3NpdGlvbixULmRhdGFDb29yZGluYXRlPWguZGF0YUNvb3JkaW5hdGUsVC5kYXRhPWgsbz0hMCl9fX19fWEmJmEhPT1ULm9iamVjdCYmKGEuaGlnaGxpZ2h0JiZhLmhpZ2hsaWdodChudWxsKSxqPSEwKSxULm9iamVjdCYmKFQub2JqZWN0LmhpZ2hsaWdodCYmVC5vYmplY3QuaGlnaGxpZ2h0KFQuZGF0YSksaj0hMCksbz1vfHxULm9iamVjdCE9PWEsbyYmSC5vbnNlbGVjdCYmSC5vbnNlbGVjdChUKSwxJnQmJiEoMSZZKSYmSC5vbmNsaWNrJiZILm9uY2xpY2soVCksWT10fX0pLHcuYWRkRXZlbnRMaXN0ZW5lcigid2ViZ2xjb250ZXh0bG9zdCIscyk7dmFyIFc9W1sxLzAsMS8wLDEvMF0sWy0oMS8wKSwtKDEvMCksLSgxLzApXV0sWj1bV1swXS5zbGljZSgpLFdbMV0uc2xpY2UoKV07cmV0dXJuIGIoKSxILnJlZHJhdz1mdW5jdGlvbigpe198fChqPSEwLHgoKSl9LEh9ZS5leHBvcnRzPXM7dmFyIGw9dCgiM2Qtdmlldy1jb250cm9scyIpLHU9dCgiZ2wtYXhlczNkIiksYz10KCJnbC1heGVzM2QvcHJvcGVydGllcyIpLGg9dCgiZ2wtc3Bpa2VzM2QiKSxmPXQoImdsLXNlbGVjdC1zdGF0aWMiKSxkPXQoImdsLWZibyIpLHA9dCgiYS1iaWctdHJpYW5nbGUiKSxnPXQoIm1vdXNlLWNoYW5nZSIpLG09dCgiZ2wtbWF0NC9wZXJzcGVjdGl2ZSIpLHY9dCgiLi9saWIvc2hhZGVyIil9LHsiLi9saWIvc2hhZGVyIjoxODgsIjNkLXZpZXctY29udHJvbHMiOjI2LCJhLWJpZy10cmlhbmdsZSI6MjgsImdsLWF4ZXMzZCI6MTIwLCJnbC1heGVzM2QvcHJvcGVydGllcyI6MTI3LCJnbC1mYm8iOjEzNSwiZ2wtbWF0NC9wZXJzcGVjdGl2ZSI6MTUyLCJnbC1zZWxlY3Qtc3RhdGljIjoyMTksImdsLXNwaWtlczNkIjoyMjksIm1vdXNlLWNoYW5nZSI6NDEzfV0sMTkwOltmdW5jdGlvbih0LGUscil7ci5wb2ludFZlcnRleD0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG5hdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjtcblxudW5pZm9ybSBtYXQzIG1hdHJpeDtcbnVuaWZvcm0gZmxvYXQgcG9pbnRTaXplO1xudW5pZm9ybSBmbG9hdCBwb2ludENsb3VkO1xuXG5oaWdocCBmbG9hdCByYW5kKHZlYzIgY28pIHtcbiAgaGlnaHAgZmxvYXQgYSA9IDEyLjk4OTg7XG4gIGhpZ2hwIGZsb2F0IGIgPSA3OC4yMzM7XG4gIGhpZ2hwIGZsb2F0IGMgPSA0Mzc1OC41NDUzO1xuICBoaWdocCBmbG9hdCBkID0gZG90KGNvLnh5LCB2ZWMyKGEsIGIpKTtcbiAgaGlnaHAgZmxvYXQgZSA9IG1vZChkLCAzLjE0KTtcbiAgcmV0dXJuIGZyYWN0KHNpbihlKSAqIGMpO1xufVxuXG52b2lkIG1haW4oKSB7XG4gIHZlYzMgaGdQb3NpdGlvbiA9IG1hdHJpeCAqIHZlYzMocG9zaXRpb24sIDEpO1xuICBnbF9Qb3NpdGlvbiAgPSB2ZWM0KGhnUG9zaXRpb24ueHksIDAsIGhnUG9zaXRpb24ueik7XG4gICAgLy8gaWYgd2UgZG9uJ3Qgaml0dGVyIHRoZSBwb2ludCBzaXplIGEgYml0LCBvdmVyYWxsIHBvaW50IGNsb3VkXG4gICAgLy8gc2F0dXJhdGlvbiAnanVtcHMnIG9uIHpvb21pbmcsIHdoaWNoIGlzIGRpc3R1cmJpbmcgYW5kIGNvbmZ1c2luZ1xuICBnbF9Qb2ludFNpemUgPSBwb2ludFNpemUgKiAoKDE5LjUgKyByYW5kKHBvc2l0aW9uKSkgLyAyMC4wKTtcbiAgaWYocG9pbnRDbG91ZCAhPSAwLjApIHsgLy8gcG9pbnRDbG91ZCBpcyB0cnV0aHlcbiAgICAvLyBnZXQgdGhlIHNhbWUgc3F1YXJlIHN1cmZhY2UgYXMgY2lyY2xlIHdvdWxkIGJlXG4gICAgZ2xfUG9pbnRTaXplICo9IDAuODg2O1xuICB9XG59IixyLnBvaW50RnJhZ21lbnQ9InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxudW5pZm9ybSB2ZWM0IGNvbG9yLCBib3JkZXJDb2xvcjtcbnVuaWZvcm0gZmxvYXQgY2VudGVyRnJhY3Rpb247XG51bmlmb3JtIGZsb2F0IHBvaW50Q2xvdWQ7XG5cbnZvaWQgbWFpbigpIHtcbiAgZmxvYXQgcmFkaXVzO1xuICB2ZWM0IGJhc2VDb2xvcjtcbiAgaWYocG9pbnRDbG91ZCAhPSAwLjApIHsgLy8gcG9pbnRDbG91ZCBpcyB0cnV0aHlcbiAgICBpZihjZW50ZXJGcmFjdGlvbiA9PSAxLjApIHtcbiAgICAgIGdsX0ZyYWdDb2xvciA9IGNvbG9yO1xuICAgIH0gZWxzZSB7XG4gICAgICBnbF9GcmFnQ29sb3IgPSBtaXgoYm9yZGVyQ29sb3IsIGNvbG9yLCBjZW50ZXJGcmFjdGlvbik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJhZGl1cyA9IGxlbmd0aCgyLjAgKiBnbF9Qb2ludENvb3JkLnh5IC0gMS4wKTtcbiAgICBpZihyYWRpdXMgPiAxLjApIHtcbiAgICAgIGRpc2NhcmQ7XG4gICAgfVxuICAgIGJhc2VDb2xvciA9IG1peChib3JkZXJDb2xvciwgY29sb3IsIHN0ZXAocmFkaXVzLCBjZW50ZXJGcmFjdGlvbikpO1xuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoYmFzZUNvbG9yLnJnYiAqIGJhc2VDb2xvci5hLCBiYXNlQ29sb3IuYSk7XG4gIH1cbn1cbiIsci5waWNrVmVydGV4PSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbmF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uO1xuYXR0cmlidXRlIHZlYzQgcGlja0lkO1xuXG51bmlmb3JtIG1hdDMgbWF0cml4O1xudW5pZm9ybSBmbG9hdCBwb2ludFNpemU7XG51bmlmb3JtIHZlYzQgcGlja09mZnNldDtcblxudmFyeWluZyB2ZWM0IGZyYWdJZDtcblxudm9pZCBtYWluKCkge1xuICB2ZWMzIGhnUG9zaXRpb24gPSBtYXRyaXggKiB2ZWMzKHBvc2l0aW9uLCAxKTtcbiAgZ2xfUG9zaXRpb24gID0gdmVjNChoZ1Bvc2l0aW9uLnh5LCAwLCBoZ1Bvc2l0aW9uLnopO1xuICBnbF9Qb2ludFNpemUgPSBwb2ludFNpemU7XG5cbiAgdmVjNCBpZCA9IHBpY2tJZCArIHBpY2tPZmZzZXQ7XG4gIGlkLnkgKz0gZmxvb3IoaWQueCAvIDI1Ni4wKTtcbiAgaWQueCAtPSBmbG9vcihpZC54IC8gMjU2LjApICogMjU2LjA7XG5cbiAgaWQueiArPSBmbG9vcihpZC55IC8gMjU2LjApO1xuICBpZC55IC09IGZsb29yKGlkLnkgLyAyNTYuMCkgKiAyNTYuMDtcblxuICBpZC53ICs9IGZsb29yKGlkLnogLyAyNTYuMCk7XG4gIGlkLnogLT0gZmxvb3IoaWQueiAvIDI1Ni4wKSAqIDI1Ni4wO1xuXG4gIGZyYWdJZCA9IGlkO1xufVxuIixyLnBpY2tGcmFnbWVudD0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG52YXJ5aW5nIHZlYzQgZnJhZ0lkO1xuXG52b2lkIG1haW4oKSB7XG4gIGZsb2F0IHJhZGl1cyA9IGxlbmd0aCgyLjAgKiBnbF9Qb2ludENvb3JkLnh5IC0gMS4wKTtcbiAgaWYocmFkaXVzID4gMS4wKSB7XG4gICAgZGlzY2FyZDtcbiAgfVxuICBnbF9GcmFnQ29sb3IgPSBmcmFnSWQgLyAyNTUuMDtcbn1cbiJ9LHt9XSwxOTE6W2Z1bmN0aW9uKHQsZSxyKXthcmd1bWVudHNbNF1bMTgwXVswXS5hcHBseShyLGFyZ3VtZW50cyl9LHsiLi9saWIvR0xFcnJvciI6MTkyLCIuL2xpYi9jcmVhdGUtYXR0cmlidXRlcyI6MTkzLCIuL2xpYi9jcmVhdGUtdW5pZm9ybXMiOjE5NCwiLi9saWIvcmVmbGVjdCI6MTk1LCIuL2xpYi9ydW50aW1lLXJlZmxlY3QiOjE5NiwiLi9saWIvc2hhZGVyLWNhY2hlIjoxOTcsZHVwOjE4MH1dLDE5MjpbZnVuY3Rpb24odCxlLHIpe2FyZ3VtZW50c1s0XVsxODFdWzBdLmFwcGx5KHIsYXJndW1lbnRzKX0se2R1cDoxODF9XSwxOTM6W2Z1bmN0aW9uKHQsZSxyKXthcmd1bWVudHNbNF1bMTgyXVswXS5hcHBseShyLGFyZ3VtZW50cyl9LHsiLi9HTEVycm9yIjoxOTIsZHVwOjE4Mn1dLDE5NDpbZnVuY3Rpb24odCxlLHIpe2FyZ3VtZW50c1s0XVsxODNdWzBdLmFwcGx5KHIsYXJndW1lbnRzKX0seyIuL0dMRXJyb3IiOjE5MiwiLi9yZWZsZWN0IjoxOTUsZHVwOjE4M31dLDE5NTpbZnVuY3Rpb24odCxlLHIpe2FyZ3VtZW50c1s0XVsxODRdWzBdLmFwcGx5KHIsYXJndW1lbnRzKX0se2R1cDoxODR9XSwxOTY6W2Z1bmN0aW9uKHQsZSxyKXthcmd1bWVudHNbNF1bMTg1XVswXS5hcHBseShyLGFyZ3VtZW50cyl9LHtkdXA6MTg1fV0sMTk3OltmdW5jdGlvbih0LGUscil7YXJndW1lbnRzWzRdWzE4Nl1bMF0uYXBwbHkocixhcmd1bWVudHMpfSx7Ii4vR0xFcnJvciI6MTkyLGR1cDoxODYsImdsLWZvcm1hdC1jb21waWxlci1lcnJvciI6MTM2LCJ3ZWFrbWFwLXNoaW0iOjUxN31dLDE5ODpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyLG4saSl7dGhpcy5wbG90PXQsdGhpcy5vZmZzZXRCdWZmZXI9ZSx0aGlzLnBpY2tCdWZmZXI9cix0aGlzLnNoYWRlcj1uLHRoaXMucGlja1NoYWRlcj1pLHRoaXMuc2l6ZU1pbj0uNSx0aGlzLnNpemVNaW5DYXA9Mix0aGlzLnNpemVNYXg9MjAsdGhpcy5hcmVhUmF0aW89MSx0aGlzLnBvaW50Q291bnQ9MCx0aGlzLmNvbG9yPVsxLDAsMCwxXSx0aGlzLmJvcmRlckNvbG9yPVswLDAsMCwxXSx0aGlzLmJsZW5kPSExLHRoaXMucGlja09mZnNldD0wLHRoaXMucG9pbnRzPW51bGx9ZnVuY3Rpb24gaSh0LGUpe3ZhciByLG49MCxpPXQubGVuZ3RoPj4+MTtmb3Iocj0wO3I8aTtyKyspe3ZhciBhPXRbMipyXSxvPXRbMipyKzFdO2E+PWVbMF0mJmE8PWVbMl0mJm8+PWVbMV0mJm88PWVbM10mJm4rK31yZXR1cm4gbn1mdW5jdGlvbiBhKHQsZSl7dmFyIHI9dC5nbCxpPXMociksYT1zKHIpLGw9byhyLHUucG9pbnRWZXJ0ZXgsdS5wb2ludEZyYWdtZW50KSxjPW8ocix1LnBpY2tWZXJ0ZXgsdS5waWNrRnJhZ21lbnQpLGg9bmV3IG4odCxpLGEsbCxjKTtyZXR1cm4gaC51cGRhdGUoZSksdC5hZGRPYmplY3QoaCksaH12YXIgbz10KCJnbC1zaGFkZXIiKSxzPXQoImdsLWJ1ZmZlciIpLGw9dCgidHlwZWRhcnJheS1wb29sIiksdT10KCIuL2xpYi9zaGFkZXIiKTtlLmV4cG9ydHM9YTt2YXIgYz1uLnByb3RvdHlwZTtjLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLnNoYWRlci5kaXNwb3NlKCksdGhpcy5waWNrU2hhZGVyLmRpc3Bvc2UoKSx0aGlzLm9mZnNldEJ1ZmZlci5kaXNwb3NlKCksdGhpcy5waWNrQnVmZmVyLmRpc3Bvc2UoKSx0aGlzLnBsb3QucmVtb3ZlT2JqZWN0KHRoaXMpfSxjLnVwZGF0ZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUscil7cmV0dXJuIGUgaW4gdD90W2VdOnJ9dmFyIHI7dD10fHx7fSx0aGlzLnNpemVNaW49ZSgic2l6ZU1pbiIsLjUpLHRoaXMuc2l6ZU1heD1lKCJzaXplTWF4IiwyMCksdGhpcy5jb2xvcj1lKCJjb2xvciIsWzEsMCwwLDFdKS5zbGljZSgpLHRoaXMuYXJlYVJhdGlvPWUoImFyZWFSYXRpbyIsMSksdGhpcy5ib3JkZXJDb2xvcj1lKCJib3JkZXJDb2xvciIsWzAsMCwwLDFdKS5zbGljZSgpLHRoaXMuYmxlbmQ9ZSgiYmxlbmQiLCExKTt2YXIgbj10LnBvc2l0aW9ucy5sZW5ndGg+Pj4xLGk9dC5wb3NpdGlvbnMgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXksYT10LmlkVG9JbmRleCBpbnN0YW5jZW9mIEludDMyQXJyYXkmJnQuaWRUb0luZGV4Lmxlbmd0aD49bixvPXQucG9zaXRpb25zLHM9aT9vOmwubWFsbG9jRmxvYXQzMihvLmxlbmd0aCksdT1hP3QuaWRUb0luZGV4OmwubWFsbG9jSW50MzIobik7aWYoaXx8cy5zZXQobyksIWEpZm9yKHMuc2V0KG8pLHI9MDtyPG47cisrKXVbcl09cjt0aGlzLnBvaW50cz1vLHRoaXMub2Zmc2V0QnVmZmVyLnVwZGF0ZShzKSx0aGlzLnBpY2tCdWZmZXIudXBkYXRlKHUpLGl8fGwuZnJlZShzKSxhfHxsLmZyZWUodSksdGhpcy5wb2ludENvdW50PW4sdGhpcy5waWNrT2Zmc2V0PTB9LGMudW5pZmllZERyYXc9ZnVuY3Rpb24oKXt2YXIgdD1bMSwwLDAsMCwxLDAsMCwwLDFdLGU9WzAsMCwwLDBdO3JldHVybiBmdW5jdGlvbihyKXt2YXIgbj12b2lkIDAhPT1yLGE9bj90aGlzLnBpY2tTaGFkZXI6dGhpcy5zaGFkZXIsbz10aGlzLnBsb3QuZ2wscz10aGlzLnBsb3QuZGF0YUJveDtpZigwPT09dGhpcy5wb2ludENvdW50KXJldHVybiByO3ZhciBsPXNbMl0tc1swXSx1PXNbM10tc1sxXSxjPWkodGhpcy5wb2ludHMscyksaD10aGlzLnBsb3QucGlja1BpeGVsUmF0aW8qTWF0aC5tYXgoTWF0aC5taW4odGhpcy5zaXplTWluQ2FwLHRoaXMuc2l6ZU1pbiksTWF0aC5taW4odGhpcy5zaXplTWF4LHRoaXMuc2l6ZU1heC9NYXRoLnBvdyhjLC4zMzMzMykpKTt0WzBdPTIvbCx0WzRdPTIvdSx0WzZdPS0yKnNbMF0vbC0xLHRbN109LTIqc1sxXS91LTEsdGhpcy5vZmZzZXRCdWZmZXIuYmluZCgpLGEuYmluZCgpLGEuYXR0cmlidXRlcy5wb3NpdGlvbi5wb2ludGVyKCksYS51bmlmb3Jtcy5tYXRyaXg9dCxhLnVuaWZvcm1zLmNvbG9yPXRoaXMuY29sb3IsYS51bmlmb3Jtcy5ib3JkZXJDb2xvcj10aGlzLmJvcmRlckNvbG9yLGEudW5pZm9ybXMucG9pbnRDbG91ZD1oPDUsYS51bmlmb3Jtcy5wb2ludFNpemU9aCxhLnVuaWZvcm1zLmNlbnRlckZyYWN0aW9uPU1hdGgubWluKDEsTWF0aC5tYXgoMCxNYXRoLnNxcnQoMS10aGlzLmFyZWFSYXRpbykpKSxuJiYoZVswXT0yNTUmcixlWzFdPXI+PjgmMjU1LGVbMl09cj4+MTYmMjU1LGVbM109cj4+MjQmMjU1LHRoaXMucGlja0J1ZmZlci5iaW5kKCksYS5hdHRyaWJ1dGVzLnBpY2tJZC5wb2ludGVyKG8uVU5TSUdORURfQllURSksYS51bmlmb3Jtcy5waWNrT2Zmc2V0PWUsdGhpcy5waWNrT2Zmc2V0PXIpO3ZhciBmPW8uZ2V0UGFyYW1ldGVyKG8uQkxFTkQpLGQ9by5nZXRQYXJhbWV0ZXIoby5ESVRIRVIpO3JldHVybiBmJiYhdGhpcy5ibGVuZCYmby5kaXNhYmxlKG8uQkxFTkQpLGQmJm8uZGlzYWJsZShvLkRJVEhFUiksby5kcmF3QXJyYXlzKG8uUE9JTlRTLDAsdGhpcy5wb2ludENvdW50KSxmJiYhdGhpcy5ibGVuZCYmby5lbmFibGUoby5CTEVORCksZCYmby5lbmFibGUoby5ESVRIRVIpLHIrdGhpcy5wb2ludENvdW50fX0oKSxjLmRyYXc9Yy51bmlmaWVkRHJhdyxjLmRyYXdQaWNrPWMudW5pZmllZERyYXcsYy5waWNrPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLnBpY2tPZmZzZXQsaT10aGlzLnBvaW50Q291bnQ7aWYocjxufHxyPj1uK2kpcmV0dXJuIG51bGw7dmFyIGE9ci1uLG89dGhpcy5wb2ludHM7cmV0dXJue29iamVjdDp0aGlzLHBvaW50SWQ6YSxkYXRhQ29vcmQ6W29bMiphXSxvWzIqYSsxXV19fX0seyIuL2xpYi9zaGFkZXIiOjE5MCwiZ2wtYnVmZmVyIjoxMjgsImdsLXNoYWRlciI6MTkxLCJ0eXBlZGFycmF5LXBvb2wiOjQ5Nn1dLDE5OTpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlLHIsbil7dmFyIGksYSxvLHMsbCx1PWVbMF0sYz1lWzFdLGg9ZVsyXSxmPWVbM10sZD1yWzBdLHA9clsxXSxnPXJbMl0sbT1yWzNdO3JldHVybiBhPXUqZCtjKnAraCpnK2YqbSxhPDAmJihhPS1hLGQ9LWQscD0tcCxnPS1nLG09LW0pLDEtYT4xZS02PyhpPU1hdGguYWNvcyhhKSxvPU1hdGguc2luKGkpLHM9TWF0aC5zaW4oKDEtbikqaSkvbyxsPU1hdGguc2luKG4qaSkvbyk6KHM9MS1uLGw9biksdFswXT1zKnUrbCpkLHRbMV09cypjK2wqcCx0WzJdPXMqaCtsKmcsdFszXT1zKmYrbCptLHR9ZS5leHBvcnRzPW59LHt9XSwyMDA6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXt2ZXJ0ZXg6InByZWNpc2lvbiBoaWdocCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbmF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uSGksIHBvc2l0aW9uTG87XG5hdHRyaWJ1dGUgdmVjMiBvZmZzZXQ7XG5hdHRyaWJ1dGUgdmVjNCBjb2xvcjtcblxudW5pZm9ybSB2ZWMyIHNjYWxlSGksIHNjYWxlTG8sIHRyYW5zbGF0ZUhpLCB0cmFuc2xhdGVMbywgcGl4ZWxTY2FsZTtcblxudmFyeWluZyB2ZWM0IGZyYWdDb2xvcjtcblxuXG52ZWM0IGNvbXB1dGVQb3NpdGlvbl8xXzAodmVjMiBwb3NIaSwgdmVjMiBwb3NMbywgdmVjMiBzY0hpLCB2ZWMyIHNjTG8sIHZlYzIgdHJIaSwgdmVjMiB0ckxvLCB2ZWMyIHNjcmVlblNjYWxlLCB2ZWMyIHNjcmVlbk9mZnNldCkge1xuICByZXR1cm4gdmVjNChzY0hpICogcG9zSGkgKyB0ckhpXG4gICAgICAgICAgICArIHNjTG8gKiBwb3NIaSArIHRyTG9cbiAgICAgICAgICAgICsgc2NIaSAqIHBvc0xvXG4gICAgICAgICAgICArIHNjTG8gKiBwb3NMb1xuICAgICAgICAgICAgKyBzY3JlZW5TY2FsZSAqIHNjcmVlbk9mZnNldCwgMCwgMSk7XG59XG5cbnZvaWQgbWFpbigpIHtcbiAgZnJhZ0NvbG9yID0gY29sb3I7XG5cbiAgZ2xfUG9zaXRpb24gPSBjb21wdXRlUG9zaXRpb25fMV8wKFxuICAgIHBvc2l0aW9uSGksIHBvc2l0aW9uTG8sXG4gICAgc2NhbGVIaSwgc2NhbGVMbyxcbiAgICB0cmFuc2xhdGVIaSwgdHJhbnNsYXRlTG8sXG4gICAgcGl4ZWxTY2FsZSwgb2Zmc2V0KTtcbn1cbiIsZnJhZ21lbnQ6InByZWNpc2lvbiBsb3dwIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcbnZhcnlpbmcgdmVjNCBmcmFnQ29sb3I7XG52b2lkIG1haW4oKSB7XG4gIGdsX0ZyYWdDb2xvciA9IHZlYzQoZnJhZ0NvbG9yLnJnYiAqIGZyYWdDb2xvci5hLCBmcmFnQ29sb3IuYSk7XG59XG4iLHBpY2tWZXJ0ZXg6InByZWNpc2lvbiBoaWdocCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbmF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uSGksIHBvc2l0aW9uTG87XG5hdHRyaWJ1dGUgdmVjMiBvZmZzZXQ7XG5hdHRyaWJ1dGUgdmVjNCBpZDtcblxudW5pZm9ybSB2ZWMyIHNjYWxlSGksIHNjYWxlTG8sIHRyYW5zbGF0ZUhpLCB0cmFuc2xhdGVMbywgcGl4ZWxTY2FsZTtcbnVuaWZvcm0gdmVjNCBwaWNrT2Zmc2V0O1xuXG52YXJ5aW5nIHZlYzQgZnJhZ0NvbG9yO1xuXG5cbnZlYzQgY29tcHV0ZVBvc2l0aW9uXzFfMCh2ZWMyIHBvc0hpLCB2ZWMyIHBvc0xvLCB2ZWMyIHNjSGksIHZlYzIgc2NMbywgdmVjMiB0ckhpLCB2ZWMyIHRyTG8sIHZlYzIgc2NyZWVuU2NhbGUsIHZlYzIgc2NyZWVuT2Zmc2V0KSB7XG4gIHJldHVybiB2ZWM0KHNjSGkgKiBwb3NIaSArIHRySGlcbiAgICAgICAgICAgICsgc2NMbyAqIHBvc0hpICsgdHJMb1xuICAgICAgICAgICAgKyBzY0hpICogcG9zTG9cbiAgICAgICAgICAgICsgc2NMbyAqIHBvc0xvXG4gICAgICAgICAgICArIHNjcmVlblNjYWxlICogc2NyZWVuT2Zmc2V0LCAwLCAxKTtcbn1cblxudm9pZCBtYWluKCkge1xuICB2ZWM0IGZyYWdJZCA9IGlkICsgcGlja09mZnNldDtcblxuICBmcmFnSWQueSArPSBmbG9vcihmcmFnSWQueCAvIDI1Ni4wKTtcbiAgZnJhZ0lkLnggLT0gZmxvb3IoZnJhZ0lkLnggLyAyNTYuMCkgKiAyNTYuMDtcblxuICBmcmFnSWQueiArPSBmbG9vcihmcmFnSWQueSAvIDI1Ni4wKTtcbiAgZnJhZ0lkLnkgLT0gZmxvb3IoZnJhZ0lkLnkgLyAyNTYuMCkgKiAyNTYuMDtcblxuICBmcmFnSWQudyArPSBmbG9vcihmcmFnSWQueiAvIDI1Ni4wKTtcbiAgZnJhZ0lkLnogLT0gZmxvb3IoZnJhZ0lkLnogLyAyNTYuMCkgKiAyNTYuMDtcblxuICBmcmFnQ29sb3IgPSBmcmFnSWQgLyAyNTUuMDtcblxuICBnbF9Qb3NpdGlvbiA9IGNvbXB1dGVQb3NpdGlvbl8xXzAoXG4gICAgcG9zaXRpb25IaSwgcG9zaXRpb25MbyxcbiAgICBzY2FsZUhpLCBzY2FsZUxvLFxuICAgIHRyYW5zbGF0ZUhpLCB0cmFuc2xhdGVMbyxcbiAgICBwaXhlbFNjYWxlLCBvZmZzZXQpO1xufVxuIixwaWNrRnJhZ21lbnQ6InByZWNpc2lvbiBsb3dwIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcbnZhcnlpbmcgdmVjNCBmcmFnQ29sb3I7XG52b2lkIG1haW4oKSB7XG4gIGdsX0ZyYWdDb2xvciA9IGZyYWdDb2xvcjtcbn1cbiJ9fSx7fV0sMjAxOltmdW5jdGlvbih0LGUscil7YXJndW1lbnRzWzRdWzE4MF1bMF0uYXBwbHkocixhcmd1bWVudHMpfSx7Ii4vbGliL0dMRXJyb3IiOjIwMiwiLi9saWIvY3JlYXRlLWF0dHJpYnV0ZXMiOjIwMywiLi9saWIvY3JlYXRlLXVuaWZvcm1zIjoyMDQsIi4vbGliL3JlZmxlY3QiOjIwNSwiLi9saWIvcnVudGltZS1yZWZsZWN0IjoyMDYsIi4vbGliL3NoYWRlci1jYWNoZSI6MjA3LGR1cDoxODB9XSwyMDI6W2Z1bmN0aW9uKHQsZSxyKXthcmd1bWVudHNbNF1bMTgxXVswXS5hcHBseShyLGFyZ3VtZW50cyl9LHtkdXA6MTgxfV0sMjAzOltmdW5jdGlvbih0LGUscil7YXJndW1lbnRzWzRdWzE4Ml1bMF0uYXBwbHkocixhcmd1bWVudHMpfSx7Ii4vR0xFcnJvciI6MjAyLGR1cDoxODJ9XSwyMDQ6W2Z1bmN0aW9uKHQsZSxyKXthcmd1bWVudHNbNF1bMTgzXVswXS5hcHBseShyLGFyZ3VtZW50cyl9LHsiLi9HTEVycm9yIjoyMDIsIi4vcmVmbGVjdCI6MjA1LGR1cDoxODN9XSwyMDU6W2Z1bmN0aW9uKHQsZSxyKXthcmd1bWVudHNbNF1bMTg0XVswXS5hcHBseShyLGFyZ3VtZW50cyl9LHtkdXA6MTg0fV0sMjA2OltmdW5jdGlvbih0LGUscil7YXJndW1lbnRzWzRdWzE4NV1bMF0uYXBwbHkocixhcmd1bWVudHMpfSx7ZHVwOjE4NX1dLDIwNzpbZnVuY3Rpb24odCxlLHIpe2FyZ3VtZW50c1s0XVsxODZdWzBdLmFwcGx5KHIsYXJndW1lbnRzKX0seyIuL0dMRXJyb3IiOjIwMixkdXA6MTg2LCJnbC1mb3JtYXQtY29tcGlsZXItZXJyb3IiOjEzNiwid2Vha21hcC1zaGltIjo1MTd9XSwyMDg6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtpZih0IGluIGYpcmV0dXJuIGZbdF07dmFyIGU9Yyh0LHtwb2x5Z29uczohMCxmb250OiJzYW5zLXNlcmlmIix0ZXh0QWxpZ246ImxlZnQiLHRleHRCYXNlbGluZToiYWxwaGFiZXRpYyJ9KSxyPVtdLG49W107ZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuZm9yRWFjaChmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoOysrZSl7dmFyIGk9dFsoZSt0Lmxlbmd0aC0xKSV0Lmxlbmd0aF0sYT10W2VdLG89dFsoZSsxKSV0Lmxlbmd0aF0scz10WyhlKzIpJXQubGVuZ3RoXSxsPWFbMF0taVswXSx1PWFbMV0taVsxXSxjPU1hdGguc3FydChsKmwrdSp1KTtsLz1jLHUvPWMsci5wdXNoKGlbMF0saVsxXSsxLjQpLG4ucHVzaCh1LC1sKSxyLnB1c2goaVswXSxpWzFdKzEuNCksbi5wdXNoKC11LGwpLHIucHVzaChhWzBdLGFbMV0rMS40KSxuLnB1c2goLXUsbCksci5wdXNoKGFbMF0sYVsxXSsxLjQpLG4ucHVzaCgtdSxsKSxyLnB1c2goaVswXSxpWzFdKzEuNCksbi5wdXNoKHUsLWwpLHIucHVzaChhWzBdLGFbMV0rMS40KSxuLnB1c2godSwtbCk7dmFyIGg9c1swXS1vWzBdLGY9c1sxXS1vWzFdLGQ9TWF0aC5zcXJ0KGgqaCtmKmYpO2gvPWQsZi89ZCxyLnB1c2goYVswXSxhWzFdKzEuNCksbi5wdXNoKHUsLWwpLHIucHVzaChhWzBdLGFbMV0rMS40KSxuLnB1c2goLXUsbCksci5wdXNoKG9bMF0sb1sxXSsxLjQpLG4ucHVzaCgtZixoKSxyLnB1c2gob1swXSxvWzFdKzEuNCksbi5wdXNoKC1mLGgpLHIucHVzaChhWzBdLGFbMV0rMS40KSxuLnB1c2goZiwtaCksci5wdXNoKG9bMF0sb1sxXSsxLjQpLG4ucHVzaChmLC1oKX19KX0pO2Zvcih2YXIgaT1bMS8wLDEvMCwtKDEvMCksLSgxLzApXSxhPTA7YTxyLmxlbmd0aDthKz0yKWZvcih2YXIgbz0wO288MjsrK28paVtvXT1NYXRoLm1pbihpW29dLHJbYStvXSksaVsyK29dPU1hdGgubWF4KGlbMitvXSxyW2Erb10pO3JldHVybiBmW3RdPXtjb29yZHM6cixub3JtYWxzOm4sYm91bmRzOml9fWZ1bmN0aW9uIGkodCxlLHIsbixpLGEsbyxzKXt0aGlzLnBsb3Q9dCx0aGlzLnNoYWRlcj1lLHRoaXMucGlja1NoYWRlcj1yLHRoaXMucG9zSGlCdWZmZXI9bix0aGlzLnBvc0xvQnVmZmVyPWksdGhpcy5vZmZzZXRCdWZmZXI9YSx0aGlzLmNvbG9yQnVmZmVyPW8sdGhpcy5pZEJ1ZmZlcj1zLHRoaXMuYm91bmRzPVsxLzAsMS8wLC0oMS8wKSwtKDEvMCldLHRoaXMubnVtUG9pbnRzPTAsdGhpcy5udW1WZXJ0aWNlcz0wLHRoaXMucGlja09mZnNldD0wLHRoaXMucG9pbnRzPW51bGx9ZnVuY3Rpb24gYSh0LGUpe3ZhciByPXQuZ2wsbj1vKHIsaC52ZXJ0ZXgsaC5mcmFnbWVudCksYT1vKHIsaC5waWNrVmVydGV4LGgucGlja0ZyYWdtZW50KSxsPXMociksdT1zKHIpLGM9cyhyKSxmPXMociksZD1zKHIpLHA9bmV3IGkodCxuLGEsbCx1LGMsZixkKTtyZXR1cm4gcC51cGRhdGUoZSksdC5hZGRPYmplY3QocCkscH1lLmV4cG9ydHM9YTt2YXIgbz10KCJnbC1zaGFkZXIiKSxzPXQoImdsLWJ1ZmZlciIpLGw9dCgidGV4dC1jYWNoZSIpLHU9dCgidHlwZWRhcnJheS1wb29sIiksYz10KCJ2ZWN0b3JpemUtdGV4dCIpLGg9dCgiLi9saWIvc2hhZGVycyIpLGY9e30sZD1pLnByb3RvdHlwZTshZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dmFyIHQ9dGhpcy5wbG90LG89dGhpcy5ib3VuZHMscz10LnZpZXdCb3gsbD10LmRhdGFCb3gsdT10LnBpeGVsUmF0aW8sYz1vWzJdLW9bMF0saD1vWzNdLW9bMV0sZj1sWzJdLWxbMF0sZD1sWzNdLWxbMV0scD0yKmMvZixnPTIqaC9kLG09Mioob1swXS1sWzBdKS9mLTEsdj0yKihvWzFdLWxbMV0pL2QtMTtlWzBdPXAsclswXT1wLWVbMF0sZVsxXT1nLHJbMV09Zy1lWzFdLG5bMF09bSxpWzBdPW0tblswXSxuWzFdPXYsaVsxXT12LW5bMV07dmFyIHk9c1syXS1zWzBdLHg9c1szXS1zWzFdO2FbMF09Mip1L3ksYVsxXT0yKnUveH12YXIgZT1uZXcgRmxvYXQzMkFycmF5KFswLDBdKSxyPW5ldyBGbG9hdDMyQXJyYXkoWzAsMF0pLG49bmV3IEZsb2F0MzJBcnJheShbMCwwXSksaT1uZXcgRmxvYXQzMkFycmF5KFswLDBdKSxhPVswLDBdLG89WzAsMCwwLDBdO2QuZHJhd1BpY2s9ZnVuY3Rpb24ocyl7dmFyIGw9dm9pZCAwIT09cyx1PXRoaXMucGxvdCxjPXRoaXMubnVtVmVydGljZXM7aWYoIWMpcmV0dXJuIHM7dC5jYWxsKHRoaXMpO3ZhciBoPXUuZ2wsZj1sP3RoaXMucGlja1NoYWRlcjp0aGlzLnNoYWRlcjtpZihmLmJpbmQoKSxsKXt0aGlzLnBpY2tPZmZzZXQ9cztmb3IodmFyIGQ9MDtkPDQ7KytkKW9bZF09cz4+OCpkJjI1NTtmLnVuaWZvcm1zLnBpY2tPZmZzZXQ9byx0aGlzLmlkQnVmZmVyLmJpbmQoKSxmLmF0dHJpYnV0ZXMuaWQucG9pbnRlcihoLlVOU0lHTkVEX0JZVEUsITEpfWVsc2UgdGhpcy5jb2xvckJ1ZmZlci5iaW5kKCksZi5hdHRyaWJ1dGVzLmNvbG9yLnBvaW50ZXIoaC5VTlNJR05FRF9CWVRFLCEwKTtyZXR1cm4gdGhpcy5wb3NIaUJ1ZmZlci5iaW5kKCksZi5hdHRyaWJ1dGVzLnBvc2l0aW9uSGkucG9pbnRlcigpLHRoaXMucG9zTG9CdWZmZXIuYmluZCgpLGYuYXR0cmlidXRlcy5wb3NpdGlvbkxvLnBvaW50ZXIoKSx0aGlzLm9mZnNldEJ1ZmZlci5iaW5kKCksZi5hdHRyaWJ1dGVzLm9mZnNldC5wb2ludGVyKCksZi51bmlmb3Jtcy5waXhlbFNjYWxlPWEsZi51bmlmb3Jtcy5zY2FsZUhpPWUsZi51bmlmb3Jtcy5zY2FsZUxvPXIsZi51bmlmb3Jtcy50cmFuc2xhdGVIaT1uLGYudW5pZm9ybXMudHJhbnNsYXRlTG89aSxoLmRyYXdBcnJheXMoaC5UUklBTkdMRVMsMCxjKSxsP3MrdGhpcy5udW1Qb2ludHM6dm9pZCAwfX0oKSxkLmRyYXc9ZC5kcmF3UGljayxkLnBpY2s9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMucGlja09mZnNldCxpPXRoaXMubnVtUG9pbnRzO2lmKHI8bnx8cj49bitpKXJldHVybiBudWxsO3ZhciBhPXItbixvPXRoaXMucG9pbnRzO3JldHVybntvYmplY3Q6dGhpcyxwb2ludElkOmEsZGF0YUNvb3JkOltvWzIqYV0sb1syKmErMV1dfX0sZC51cGRhdGU9ZnVuY3Rpb24odCl7dD10fHx7fTt2YXIgZSxyLGk9dC5wb3NpdGlvbnN8fFtdLGE9dC5jb2xvcnN8fFtdLG89dC5nbHlwaHN8fFtdLHM9dC5zaXplc3x8W10sYz10LmJvcmRlcldpZHRoc3x8W10saD10LmJvcmRlckNvbG9yc3x8W107dGhpcy5wb2ludHM9aTt2YXIgZixkLHA9dGhpcy5ib3VuZHM9WzEvMCwxLzAsLSgxLzApLC0oMS8wKV0sZz0wLG09W10sdj1bXTtmb3IoZT0wO2U8by5sZW5ndGg7KytlKWZvcihmPWwoInNhbnMtc2VyaWYiLG9bZV0pLGQ9bihvW2VdKSxtLnB1c2goZiksdi5wdXNoKGQpLGcrPWYuZGF0YS5sZW5ndGgrZC5jb29yZHMubGVuZ3RoPj4xLHI9MDtyPDI7KytyKXBbcl09TWF0aC5taW4ocFtyXSxpWzIqZStyXSkscFsyK3JdPU1hdGgubWF4KHBbMityXSxpWzIqZStyXSk7cFswXT09PXBbMl0mJihwWzJdKz0xKSxwWzNdPT09cFsxXSYmKHBbM10rPTEpO3ZhciB5PTEvKHBbMl0tcFswXSkseD0xLyhwWzNdLXBbMV0pLGI9cFswXSxfPXBbMV0sdz11Lm1hbGxvY0Zsb2F0NjQoMipnKSxNPXUubWFsbG9jRmxvYXQzMigyKmcpLEE9dS5tYWxsb2NGbG9hdDMyKDIqZyksaz11Lm1hbGxvY0Zsb2F0MzIoMipnKSxUPXUubWFsbG9jVWludDgoNCpnKSxFPXUubWFsbG9jVWludDMyKGcpLFM9MDtmb3IoZT0wO2U8by5sZW5ndGg7KytlKXtmPW1bZV0sZD12W2VdO3ZhciBMPXkqKGlbMiplXS1iKSx6PXgqKGlbMiplKzFdLV8pLEM9c1tlXSxJPTI1NSphWzQqZV0sUD0yNTUqYVs0KmUrMV0sRD0yNTUqYVs0KmUrMl0sUj0yNTUqYVs0KmUrM10sTz0uNSooZC5ib3VuZHNbMF0rZC5ib3VuZHNbMl0pLEY9LjUqKGQuYm91bmRzWzFdK2QuYm91bmRzWzNdKTtmb3Iocj0wO3I8Zi5kYXRhLmxlbmd0aDtyKz0yKXdbMipTXT1MLHdbMipTKzFdPXosa1syKlNdPS1DKihmLmRhdGFbcl0tTyksa1syKlMrMV09LUMqKGYuZGF0YVtyKzFdLUYpLFRbNCpTXT1JLFRbNCpTKzFdPVAsVFs0KlMrMl09RCxUWzQqUyszXT1SLEVbU109ZSxTKz0xO3ZhciBqPWNbZV07Zm9yKEk9MjU1KmhbNCplXSxQPTI1NSpoWzQqZSsxXSxEPTI1NSpoWzQqZSsyXSxSPTI1NSpoWzQqZSszXSxyPTA7cjxkLmNvb3Jkcy5sZW5ndGg7cis9Mil3WzIqU109TCx3WzIqUysxXT16LGtbMipTXT0tKEMqKGQuY29vcmRzW3JdLU8pK2oqZC5ub3JtYWxzW3JdKSxrWzIqUysxXT0tKEMqKGQuY29vcmRzW3IrMV0tRikraipkLm5vcm1hbHNbcisxXSksVFs0KlNdPUksVFs0KlMrMV09UCxUWzQqUysyXT1ELFRbNCpTKzNdPVIsRVtTXT1lLFMrPTF9Zm9yKHRoaXMubnVtUG9pbnRzPW8ubGVuZ3RoLHRoaXMubnVtVmVydGljZXM9ZyxNLnNldCh3KSxlPTA7ZTx3Lmxlbmd0aDtlKyspQVtlXT13W2VdLU1bZV07dGhpcy5wb3NIaUJ1ZmZlci51cGRhdGUoTSksdGhpcy5wb3NMb0J1ZmZlci51cGRhdGUoQSksdGhpcy5vZmZzZXRCdWZmZXIudXBkYXRlKGspLHRoaXMuY29sb3JCdWZmZXIudXBkYXRlKFQpLHRoaXMuaWRCdWZmZXIudXBkYXRlKEUpLHUuZnJlZSh3KSx1LmZyZWUoTSksdS5mcmVlKEEpLHUuZnJlZShrKSx1LmZyZWUoVCksdS5mcmVlKEUpfSxkLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLnNoYWRlci5kaXNwb3NlKCksdGhpcy5waWNrU2hhZGVyLmRpc3Bvc2UoKSx0aGlzLnBvc0hpQnVmZmVyLmRpc3Bvc2UoKSx0aGlzLnBvc0xvQnVmZmVyLmRpc3Bvc2UoKSx0aGlzLm9mZnNldEJ1ZmZlci5kaXNwb3NlKCksdGhpcy5jb2xvckJ1ZmZlci5kaXNwb3NlKCksdGhpcy5pZEJ1ZmZlci5kaXNwb3NlKCksdGhpcy5wbG90LnJlbW92ZU9iamVjdCh0aGlzKX19LHsiLi9saWIvc2hhZGVycyI6MjAwLCJnbC1idWZmZXIiOjEyOCwiZ2wtc2hhZGVyIjoyMDEsInRleHQtY2FjaGUiOjQ4OCwidHlwZWRhcnJheS1wb29sIjo0OTYsInZlY3Rvcml6ZS10ZXh0Ijo1MDl9XSwyMDk6W2Z1bmN0aW9uKHQsZSxyKXtyLnBvaW50VmVydGV4PSJwcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG5hdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbkhpLCBwb3NpdGlvbkxvO1xuYXR0cmlidXRlIGZsb2F0IHdlaWdodDtcblxudW5pZm9ybSB2ZWMyIHNjYWxlSGksIHNjYWxlTG8sIHRyYW5zbGF0ZUhpLCB0cmFuc2xhdGVMbztcbnVuaWZvcm0gZmxvYXQgcG9pbnRTaXplLCB1c2VXZWlnaHQ7XG5cbnZhcnlpbmcgZmxvYXQgZnJhZ1dlaWdodDtcblxuXG52ZWM0IHBmeF8xXzAodmVjMiBzY2FsZUhpLCB2ZWMyIHNjYWxlTG8sIHZlYzIgdHJhbnNsYXRlSGksIHZlYzIgdHJhbnNsYXRlTG8sIHZlYzIgcG9zaXRpb25IaSwgdmVjMiBwb3NpdGlvbkxvKSB7XG4gIHJldHVybiB2ZWM0KHNjYWxlSGkgKiBwb3NpdGlvbkhpICsgdHJhbnNsYXRlSGlcbiAgICAgICAgICAgICsgc2NhbGVMbyAqIHBvc2l0aW9uSGkgKyB0cmFuc2xhdGVMb1xuICAgICAgICAgICAgKyBzY2FsZUhpICogcG9zaXRpb25Mb1xuICAgICAgICAgICAgKyBzY2FsZUxvICogcG9zaXRpb25MbywgMC4wLCAxLjApO1xufVxuXG52b2lkIG1haW4oKSB7XG4gIGdsX1Bvc2l0aW9uID0gcGZ4XzFfMChzY2FsZUhpLCBzY2FsZUxvLCB0cmFuc2xhdGVIaSwgdHJhbnNsYXRlTG8sIHBvc2l0aW9uSGksIHBvc2l0aW9uTG8pO1xuICBnbF9Qb2ludFNpemUgPSBwb2ludFNpemU7XG4gIGZyYWdXZWlnaHQgPSBtaXgoMS4wLCB3ZWlnaHQsIHVzZVdlaWdodCk7XG59IixyLnBvaW50RnJhZ21lbnQ9InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxudW5pZm9ybSB2ZWM0IGNvbG9yLCBib3JkZXJDb2xvcjtcbnVuaWZvcm0gZmxvYXQgY2VudGVyRnJhY3Rpb247XG5cbnZhcnlpbmcgZmxvYXQgZnJhZ1dlaWdodDtcblxuZmxvYXQgc21vb3RoU3RlcChmbG9hdCB4LCBmbG9hdCB5KSB7XG4gIHJldHVybiAxLjAgLyAoMS4wICsgZXhwKDUwLjAqKHggLSB5KSkpO1xufVxuXG52b2lkIG1haW4oKSB7XG4gIGZsb2F0IHJhZGl1cyA9IGxlbmd0aCgyLjAqZ2xfUG9pbnRDb29yZC54eS0xLjApO1xuICBpZihyYWRpdXMgPiAxLjApIHtcbiAgICBkaXNjYXJkO1xuICB9XG4gIHZlYzQgYmFzZUNvbG9yID0gbWl4KGJvcmRlckNvbG9yLCBjb2xvciwgc21vb3RoU3RlcChyYWRpdXMsIGNlbnRlckZyYWN0aW9uKSk7XG4gIGZsb2F0IGFscGhhID0gMS4wIC0gcG93KDEuMCAtIGJhc2VDb2xvci5hLCBmcmFnV2VpZ2h0KTtcbiAgZ2xfRnJhZ0NvbG9yID0gdmVjNChiYXNlQ29sb3IucmdiICogYWxwaGEsIGFscGhhKTtcbn0iLHIucGlja1ZlcnRleD0icHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxudmVjNCBwZnhfMV8wKHZlYzIgc2NhbGVIaSwgdmVjMiBzY2FsZUxvLCB2ZWMyIHRyYW5zbGF0ZUhpLCB2ZWMyIHRyYW5zbGF0ZUxvLCB2ZWMyIHBvc2l0aW9uSGksIHZlYzIgcG9zaXRpb25Mbykge1xuICByZXR1cm4gdmVjNChzY2FsZUhpICogcG9zaXRpb25IaSArIHRyYW5zbGF0ZUhpXG4gICAgICAgICAgICArIHNjYWxlTG8gKiBwb3NpdGlvbkhpICsgdHJhbnNsYXRlTG9cbiAgICAgICAgICAgICsgc2NhbGVIaSAqIHBvc2l0aW9uTG9cbiAgICAgICAgICAgICsgc2NhbGVMbyAqIHBvc2l0aW9uTG8sIDAuMCwgMS4wKTtcbn1cblxuYXR0cmlidXRlIHZlYzIgcG9zaXRpb25IaSwgcG9zaXRpb25MbztcbmF0dHJpYnV0ZSB2ZWM0IHBpY2tJZDtcblxudW5pZm9ybSB2ZWMyIHNjYWxlSGksIHNjYWxlTG8sIHRyYW5zbGF0ZUhpLCB0cmFuc2xhdGVMbztcbnVuaWZvcm0gZmxvYXQgcG9pbnRTaXplO1xudW5pZm9ybSB2ZWM0IHBpY2tPZmZzZXQ7XG5cbnZhcnlpbmcgdmVjNCBmcmFnSWQ7XG5cbnZvaWQgbWFpbigpIHtcblxuICB2ZWM0IGlkID0gcGlja0lkICsgcGlja09mZnNldDtcbiAgaWQueSArPSBmbG9vcihpZC54IC8gMjU2LjApO1xuICBpZC54IC09IGZsb29yKGlkLnggLyAyNTYuMCkgKiAyNTYuMDtcblxuICBpZC56ICs9IGZsb29yKGlkLnkgLyAyNTYuMCk7XG4gIGlkLnkgLT0gZmxvb3IoaWQueSAvIDI1Ni4wKSAqIDI1Ni4wO1xuXG4gIGlkLncgKz0gZmxvb3IoaWQueiAvIDI1Ni4wKTtcbiAgaWQueiAtPSBmbG9vcihpZC56IC8gMjU2LjApICogMjU2LjA7XG5cbiAgZ2xfUG9zaXRpb24gPSBwZnhfMV8wKHNjYWxlSGksIHNjYWxlTG8sIHRyYW5zbGF0ZUhpLCB0cmFuc2xhdGVMbywgcG9zaXRpb25IaSwgcG9zaXRpb25Mbyk7XG4gIGdsX1BvaW50U2l6ZSA9IHBvaW50U2l6ZTtcbiAgZnJhZ0lkID0gaWQ7XG59IixyLnBpY2tGcmFnbWVudD0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG52YXJ5aW5nIHZlYzQgZnJhZ0lkO1xuXG52b2lkIG1haW4oKSB7XG4gIGZsb2F0IHJhZGl1cyA9IGxlbmd0aCgyLjAgKiBnbF9Qb2ludENvb3JkLnh5IC0gMS4wKTtcbiAgaWYocmFkaXVzID4gMS4wKSB7XG4gICAgZGlzY2FyZDtcbiAgfVxuICBnbF9GcmFnQ29sb3IgPSBmcmFnSWQgLyAyNTUuMDtcbn0ifSx7fV0sMjEwOltmdW5jdGlvbih0LGUscil7YXJndW1lbnRzWzRdWzcyXVswXS5hcHBseShyLGFyZ3VtZW50cyl9LHtkdXA6NzJ9XSwyMTE6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuLGEpe2E8PTQqZj9pKDAsYS0xLHQsZSxyLG4pOmgoMCxhLTEsdCxlLHIsbil9ZnVuY3Rpb24gaSh0LGUscixuLGksYSl7Zm9yKHZhciBvPXQrMTtvPD1lOysrbyl7Zm9yKHZhciBzPXJbb10sbD1uWzIqb10sdT1uWzIqbysxXSxjPWlbb10saD1hW29dLGY9bztmPnQ7KXt2YXIgZD1yW2YtMV0scD1uWzIqKGYtMSldO2lmKChkLXN8fGwtcCk+PTApYnJlYWs7cltmXT1kLG5bMipmXT1wLG5bMipmKzFdPW5bMipmLTFdLGlbZl09aVtmLTFdLGFbZl09YVtmLTFdLGYtPTF9cltmXT1zLG5bMipmXT1sLG5bMipmKzFdPXUsaVtmXT1jLGFbZl09aH19ZnVuY3Rpb24gYSh0LGUscixuLGksYSl7dmFyIG89clt0XSxzPW5bMip0XSxsPW5bMip0KzFdLHU9aVt0XSxjPWFbdF07clt0XT1yW2VdLG5bMip0XT1uWzIqZV0sblsyKnQrMV09blsyKmUrMV0saVt0XT1pW2VdLGFbdF09YVtlXSxyW2VdPW8sblsyKmVdPXMsblsyKmUrMV09bCxpW2VdPXUsYVtlXT1jfWZ1bmN0aW9uIG8odCxlLHIsbixpLGEpe3JbdF09cltlXSxuWzIqdF09blsyKmVdLG5bMip0KzFdPW5bMiplKzFdLGlbdF09aVtlXSxhW3RdPWFbZV19ZnVuY3Rpb24gcyh0LGUscixuLGksYSxvKXt2YXIgcz1uW3RdLGw9aVsyKnRdLHU9aVsyKnQrMV0sYz1hW3RdLGg9b1t0XTtuW3RdPW5bZV0saVsyKnRdPWlbMiplXSxpWzIqdCsxXT1pWzIqZSsxXSxhW3RdPWFbZV0sb1t0XT1vW2VdLG5bZV09bltyXSxpWzIqZV09aVsyKnJdLGlbMiplKzFdPWlbMipyKzFdLGFbZV09YVtyXSxvW2VdPW9bcl0sbltyXT1zLGlbMipyXT1sLGlbMipyKzFdPXUsYVtyXT1jLG9bcl09aH1mdW5jdGlvbiBsKHQsZSxyLG4saSxhLG8scyxsLHUsYyl7c1t0XT1zW2VdLGxbMip0XT1sWzIqZV0sbFsyKnQrMV09bFsyKmUrMV0sdVt0XT11W2VdLGNbdF09Y1tlXSxzW2VdPXIsbFsyKmVdPW4sbFsyKmUrMV09aSx1W2VdPWEsY1tlXT1vfWZ1bmN0aW9uIHUodCxlLHIsbixpKXtyZXR1cm4oclt0XS1yW2VdfHxuWzIqZV0tblsyKnRdfHxpW3RdLWlbZV0pPDA7Cn1mdW5jdGlvbiBjKHQsZSxyLG4saSxhLG8scyl7cmV0dXJuKGUtYVt0XXx8b1syKnRdLXJ8fGktc1t0XSk8MH1mdW5jdGlvbiBoKHQsZSxyLG4sZCxwKXt2YXIgZz0oZS10KzEpLzZ8MCxtPXQrZyx2PWUtZyx5PXQrZT4+MSx4PXktZyxiPXkrZyxfPW0sdz14LE09eSxBPWIsaz12LFQ9dCsxLEU9ZS0xLFM9MDt1KF8sdyxyLG4sZCxwKSYmKFM9XyxfPXcsdz1TKSx1KEEsayxyLG4sZCxwKSYmKFM9QSxBPWssaz1TKSx1KF8sTSxyLG4sZCxwKSYmKFM9XyxfPU0sTT1TKSx1KHcsTSxyLG4sZCxwKSYmKFM9dyx3PU0sTT1TKSx1KF8sQSxyLG4sZCxwKSYmKFM9XyxfPUEsQT1TKSx1KE0sQSxyLG4sZCxwKSYmKFM9TSxNPUEsQT1TKSx1KHcsayxyLG4sZCxwKSYmKFM9dyx3PWssaz1TKSx1KHcsTSxyLG4sZCxwKSYmKFM9dyx3PU0sTT1TKSx1KEEsayxyLG4sZCxwKSYmKFM9QSxBPWssaz1TKTt2YXIgTD1yW3ddLHo9blsyKnddLEM9blsyKncrMV0sST1kW3ddLFA9cFt3XSxEPXJbQV0sUj1uWzIqQV0sTz1uWzIqQSsxXSxGPWRbQV0saj1wW0FdLE49XyxCPU0sVT1rLFY9bSxxPXksSD12LEc9cltOXSxYPXJbQl0sWT1yW1VdO3JbVl09RyxyW3FdPVgscltIXT1ZO2Zvcih2YXIgVz0wO1c8MjsrK1cpe3ZhciBaPW5bMipOK1ddLFE9blsyKkIrV10sSz1uWzIqVStXXTtuWzIqVitXXT1aLG5bMipxK1ddPVEsblsyKkgrV109S312YXIgJD1kW05dLEo9ZFtCXSx0dD1kW1VdO2RbVl09JCxkW3FdPUosZFtIXT10dDt2YXIgZXQ9cFtOXSxydD1wW0JdLG50PXBbVV07cFtWXT1ldCxwW3FdPXJ0LHBbSF09bnQsbyh4LHQscixuLGQscCksbyhiLGUscixuLGQscCk7Zm9yKHZhciBpdD1UO2l0PD1FOysraXQpaWYoYyhpdCxMLHosQyxJLHIsbixkKSlpdCE9PVQmJmEoaXQsVCxyLG4sZCxwKSwrK1Q7ZWxzZSBpZighYyhpdCxELFIsTyxGLHIsbixkKSlmb3IoOzspe2lmKGMoRSxELFIsTyxGLHIsbixkKSl7YyhFLEwseixDLEkscixuLGQpPyhzKGl0LFQsRSxyLG4sZCxwKSwrK1QsLS1FKTooYShpdCxFLHIsbixkLHApLC0tRSk7YnJlYWt9aWYoLS1FPGl0KWJyZWFrfWwodCxULTEsTCx6LEMsSSxQLHIsbixkLHApLGwoZSxFKzEsRCxSLE8sRixqLHIsbixkLHApLFQtMi10PD1mP2kodCxULTIscixuLGQscCk6aCh0LFQtMixyLG4sZCxwKSxlLShFKzIpPD1mP2koRSsyLGUscixuLGQscCk6aChFKzIsZSxyLG4sZCxwKSxFLVQ8PWY/aShULEUscixuLGQscCk6aChULEUscixuLGQscCl9ZS5leHBvcnRzPW47dmFyIGY9MzJ9LHt9XSwyMTI6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuLGksYSxvLHMpe2Zvcih2YXIgbD1yLHU9cjt1PG47Kyt1KXt2YXIgYz10WzIqdV0saD10WzIqdSsxXSxmPWVbdV07aTw9YyYmYzw9byYmYTw9aCYmaDw9cyYmKHU9PT1sP2wrPTE6KHRbMip1XT10WzIqbF0sdFsyKnUrMV09dFsyKmwrMV0sZVt1XT1lW2xdLHRbMipsXT1jLHRbMipsKzFdPWgsZVtsXT1mLGwrPTEpKX1yZXR1cm4gbH1mdW5jdGlvbiBpKHQsZSxyKXt0aGlzLnBpeGVsU2l6ZT10LHRoaXMub2Zmc2V0PWUsdGhpcy5jb3VudD1yfWZ1bmN0aW9uIGEodCxlLHIsYSl7ZnVuY3Rpb24gbChpLGEsbyxzLHUsYyl7dmFyIGg9LjUqbyxmPXMrMSxkPXUtcztyW19dPWQsYltfKytdPWM7Zm9yKHZhciBwPTA7cDwyOysrcClmb3IodmFyIGc9MDtnPDI7KytnKXt2YXIgbT1pK3AqaCx2PWErZypoLHk9bih0LGUsZix1LG0sdixtK2gsditoKTtpZih5IT09Zil7aWYoeS1mPj1NYXRoLm1heCguOSpkLDMyKSl7dmFyIHg9dStzPj4+MTtsKG0sdixoLGYseCxjKzEpLGY9eH1sKG0sdixoLGYseSxjKzEpLGY9eX19fXZhciB1PXQubGVuZ3RoPj4+MTtpZih1PDEpcmV0dXJuW107Zm9yKHZhciBjPTEvMCxoPTEvMCxmPS0oMS8wKSxkPS0oMS8wKSxwPTA7cDx1OysrcCl7dmFyIGc9dFsyKnBdLG09dFsyKnArMV07Yz1NYXRoLm1pbihjLGcpLGY9TWF0aC5tYXgoZixnKSxoPU1hdGgubWluKGgsbSksZD1NYXRoLm1heChkLG0pLGVbcF09cH1jPT09ZiYmKGYrPTErTWF0aC5hYnMoZikpLGg9PT1kJiYoZCs9MStNYXRoLmFicyhmKSk7dmFyIHY9MS8oZi1jKSx5PTEvKGQtaCkseD1NYXRoLm1heChmLWMsZC1oKTthPWF8fFswLDAsMCwwXSxhWzBdPWMsYVsxXT1oLGFbMl09ZixhWzNdPWQ7dmFyIGI9by5tYWxsb2NJbnQzMih1KSxfPTA7bChjLGgseCwwLHUsMCkscyhiLHQsZSxyLHUpO2Zvcih2YXIgdz1bXSxNPTAsQT11LF89dS0xO18+PTA7LS1fKXt0WzIqX109KHRbMipfXS1jKSp2LHRbMipfKzFdPSh0WzIqXysxXS1oKSp5O3ZhciBrPWJbX107ayE9PU0mJih3LnB1c2gobmV3IGkoeCpNYXRoLnBvdyguNSxrKSxfKzEsQS0oXysxKSkpLEE9XysxLE09ayl9cmV0dXJuIHcucHVzaChuZXcgaSh4Kk1hdGgucG93KC41LGsrMSksMCxBKSksby5mcmVlKGIpLHd9dmFyIG89dCgidHlwZWRhcnJheS1wb29sIikscz10KCIuL2xpYi9zb3J0Iik7ZS5leHBvcnRzPWF9LHsiLi9saWIvc29ydCI6MjExLCJ0eXBlZGFycmF5LXBvb2wiOjQ5Nn1dLDIxMzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyLG4saSxhLG8pe3RoaXMucGxvdD10LHRoaXMucG9zaXRpb25CdWZmZXJIaT1lLHRoaXMucG9zaXRpb25CdWZmZXJMbz1yLHRoaXMucGlja0J1ZmZlcj1uLHRoaXMud2VpZ2h0QnVmZmVyPWksdGhpcy5zaGFkZXI9YSx0aGlzLnBpY2tTaGFkZXI9byx0aGlzLnNjYWxlcz1bXSx0aGlzLnNpemU9MTIsdGhpcy5ib3JkZXJTaXplPTEsdGhpcy5wb2ludENvdW50PTAsdGhpcy5jb2xvcj1bMSwwLDAsMV0sdGhpcy5ib3JkZXJDb2xvcj1bMCwwLDAsMV0sdGhpcy5ib3VuZHM9WzEvMCwxLzAsLSgxLzApLC0oMS8wKV0sdGhpcy5waWNrT2Zmc2V0PTAsdGhpcy5wb2ludHM9bnVsbCx0aGlzLnhDb29yZHM9bnVsbH1mdW5jdGlvbiBpKHQsZSl7dmFyIHI9dC5nbCxpPW8ocikscz1vKHIpLGw9byhyKSx1PW8ociksaD1hKHIsYy5wb2ludFZlcnRleCxjLnBvaW50RnJhZ21lbnQpLGY9YShyLGMucGlja1ZlcnRleCxjLnBpY2tGcmFnbWVudCksZD1uZXcgbih0LGkscyxsLHUsaCxmKTtyZXR1cm4gZC51cGRhdGUoZSksdC5hZGRPYmplY3QoZCksZH12YXIgYT10KCJnbC1zaGFkZXIiKSxvPXQoImdsLWJ1ZmZlciIpLHM9dCgiYmluYXJ5LXNlYXJjaC1ib3VuZHMiKSxsPXQoInNuYXAtcG9pbnRzLTJkIiksdT10KCJ0eXBlZGFycmF5LXBvb2wiKSxjPXQoIi4vbGliL3NoYWRlciIpO2UuZXhwb3J0cz1pO3ZhciBoPW4ucHJvdG90eXBlLGY9bmV3IEZsb2F0MzJBcnJheSgyKSxkPW5ldyBGbG9hdDMyQXJyYXkoMikscD1uZXcgRmxvYXQzMkFycmF5KDIpLGc9bmV3IEZsb2F0MzJBcnJheSgyKSxtPVswLDAsMCwwXTtoLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLnNoYWRlci5kaXNwb3NlKCksdGhpcy5waWNrU2hhZGVyLmRpc3Bvc2UoKSx0aGlzLnBvc2l0aW9uQnVmZmVySGkuZGlzcG9zZSgpLHRoaXMucG9zaXRpb25CdWZmZXJMby5kaXNwb3NlKCksdGhpcy5waWNrQnVmZmVyLmRpc3Bvc2UoKSx0aGlzLnhDb29yZHMmJnUuZnJlZSh0aGlzLnhDb29yZHMpLHRoaXMucGxvdC5yZW1vdmVPYmplY3QodGhpcyl9LGgudXBkYXRlPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxyKXtyZXR1cm4gZSBpbiB0P3RbZV06cn10PXR8fHt9LHRoaXMuc2l6ZT1lKCJzaXplIiwxMiksdGhpcy5jb2xvcj1lKCJjb2xvciIsWzEsMCwwLDFdKS5zbGljZSgpLHRoaXMuYm9yZGVyU2l6ZT1lKCJib3JkZXJTaXplIiwxKSx0aGlzLmJvcmRlckNvbG9yPWUoImJvcmRlckNvbG9yIixbMCwwLDAsMV0pLnNsaWNlKCksdGhpcy54Q29vcmRzJiZ1LmZyZWUodGhpcy54Q29vcmRzKSx0aGlzLnBvaW50cz10LnBvc2l0aW9uczt2YXIgcj10aGlzLnBvaW50cy5sZW5ndGg+Pj4xLG49dS5tYWxsb2NJbnQzMihyKSxpPXUubWFsbG9jRmxvYXQzMigyKnIpLGE9dS5tYWxsb2NGbG9hdDY0KDIqcik7YS5zZXQodGhpcy5wb2ludHMpLHRoaXMuc2NhbGVzPWwoYSxuLGksdGhpcy5ib3VuZHMpO3ZhciBvPXUubWFsbG9jRmxvYXQ2NChyKSxzPXUubWFsbG9jRmxvYXQzMigyKnIpLGM9dS5tYWxsb2NGbG9hdDMyKDIqcik7cy5zZXQoYSk7Zm9yKHZhciBoPTAsZj0wO2g8cjtoKyssZis9MiljW2ZdPWFbZl0tc1tmXSxjW2YrMV09YVtmKzFdLXNbZisxXSxvW2hdPWFbZl07dGhpcy5wb3NpdGlvbkJ1ZmZlckhpLnVwZGF0ZShzKSx0aGlzLnBvc2l0aW9uQnVmZmVyTG8udXBkYXRlKGMpLHRoaXMucGlja0J1ZmZlci51cGRhdGUobiksdGhpcy53ZWlnaHRCdWZmZXIudXBkYXRlKGkpLHUuZnJlZShuKSx1LmZyZWUoYSksdS5mcmVlKHMpLHUuZnJlZShjKSx1LmZyZWUoaSksdGhpcy54Q29vcmRzPW8sdGhpcy5wb2ludENvdW50PXIsdGhpcy5waWNrT2Zmc2V0PTB9LGguZHJhdz1mdW5jdGlvbih0KXt2YXIgZT12b2lkIDAhPT10LHI9dGhpcy5wbG90LG49ZT90aGlzLnBpY2tTaGFkZXI6dGhpcy5zaGFkZXIsaT10aGlzLnNjYWxlcyxhPXRoaXMucG9zaXRpb25CdWZmZXJIaSxvPXRoaXMucG9zaXRpb25CdWZmZXJMbyxsPXRoaXMucGlja0J1ZmZlcix1PXRoaXMuYm91bmRzLGM9dGhpcy5zaXplLGg9dGhpcy5ib3JkZXJTaXplLHY9ci5nbCx5PWU/ci5waWNrUGl4ZWxSYXRpbzpyLnBpeGVsUmF0aW8seD1yLnZpZXdCb3gsYj1yLmRhdGFCb3g7aWYoMD09PXRoaXMucG9pbnRDb3VudClyZXR1cm4gdDt2YXIgXz11WzJdLXVbMF0sdz11WzNdLXVbMV0sTT1iWzJdLWJbMF0sQT1iWzNdLWJbMV0saz0oeFsyXS14WzBdKSp5L3IucGl4ZWxSYXRpbyxUPSh4WzNdLXhbMV0pKnkvci5waXhlbFJhdGlvLEU9TWF0aC5taW4oTS9rLEEvVCksUz0yKl8vTSxMPTIqdy9BO2ZbMF09UyxmWzFdPUwsZFswXT1TLWZbMF0sZFsxXT1MLWZbMV07dmFyIHo9MioodVswXS1iWzBdKS9NLTEsQz0yKih1WzFdLWJbMV0pL0EtMTtwWzBdPXoscFsxXT1DLGdbMF09ei1wWzBdLGdbMV09Qy1wWzFdLG4uYmluZCgpLG4udW5pZm9ybXMuc2NhbGVIaT1mLG4udW5pZm9ybXMuc2NhbGVMbz1kLG4udW5pZm9ybXMudHJhbnNsYXRlSGk9cCxuLnVuaWZvcm1zLnRyYW5zbGF0ZUxvPWcsbi51bmlmb3Jtcy5jb2xvcj10aGlzLmNvbG9yLG4udW5pZm9ybXMuYm9yZGVyQ29sb3I9dGhpcy5ib3JkZXJDb2xvcixuLnVuaWZvcm1zLnBvaW50U2l6ZT15KihjK2gpLG4udW5pZm9ybXMuY2VudGVyRnJhY3Rpb249MD09PXRoaXMuYm9yZGVyU2l6ZT8yOmMvKGMraCsxLjI1KSxhLmJpbmQoKSxuLmF0dHJpYnV0ZXMucG9zaXRpb25IaS5wb2ludGVyKCksby5iaW5kKCksbi5hdHRyaWJ1dGVzLnBvc2l0aW9uTG8ucG9pbnRlcigpLGU/KHRoaXMucGlja09mZnNldD10LG1bMF09MjU1JnQsbVsxXT10Pj44JjI1NSxtWzJdPXQ+PjE2JjI1NSxtWzNdPXQ+PjI0JjI1NSxuLnVuaWZvcm1zLnBpY2tPZmZzZXQ9bSxsLmJpbmQoKSxuLmF0dHJpYnV0ZXMucGlja0lkLnBvaW50ZXIodi5VTlNJR05FRF9CWVRFKSk6KG4udW5pZm9ybXMudXNlV2VpZ2h0PTEsdGhpcy53ZWlnaHRCdWZmZXIuYmluZCgpLG4uYXR0cmlidXRlcy53ZWlnaHQucG9pbnRlcigpKTtmb3IodmFyIEk9dGhpcy54Q29vcmRzLFA9KGJbMF0tdVswXS1FKmMqeSkvXyxEPShiWzJdLXVbMF0rRSpjKnkpL18sUj0hMCxPPWkubGVuZ3RoLTE7Tz49MDtPLS0pe3ZhciBGPWlbT107aWYoIShGLnBpeGVsU2l6ZTxFJiZPPjEpKXt2YXIgaj1GLm9mZnNldCxOPUYuY291bnQraixCPXMuZ2UoSSxQLGosTi0xKSxVPXMubHQoSSxELEIsTi0xKSsxO1U+QiYmdi5kcmF3QXJyYXlzKHYuUE9JTlRTLEIsVS1CKSwhZSYmUiYmKFI9ITEsbi51bmlmb3Jtcy51c2VXZWlnaHQ9MCl9fX0saC5kcmF3UGljaz1oLmRyYXcsaC5waWNrPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yLXRoaXMucGlja09mZnNldDtyZXR1cm4gbjwwfHxuPj10aGlzLnBvaW50Q291bnQ/bnVsbDp7b2JqZWN0OnRoaXMscG9pbnRJZDpuLGRhdGFDb29yZDpbdGhpcy5wb2ludHNbMipuXSx0aGlzLnBvaW50c1syKm4rMV1dfX19LHsiLi9saWIvc2hhZGVyIjoyMDksImJpbmFyeS1zZWFyY2gtYm91bmRzIjoyMTAsImdsLWJ1ZmZlciI6MTI4LCJnbC1zaGFkZXIiOjIyMCwic25hcC1wb2ludHMtMmQiOjIxMiwidHlwZWRhcnJheS1wb29sIjo0OTZ9XSwyMTQ6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3ZhciByPWFbZV07aWYocnx8KHI9YVtlXT17fSksdCBpbiByKXJldHVybiByW3RdO2Zvcih2YXIgbj1pKHQse3RleHRBbGlnbjoiY2VudGVyIix0ZXh0QmFzZWxpbmU6Im1pZGRsZSIsbGluZUhlaWdodDoxLGZvbnQ6ZX0pLG89aSh0LHt0cmlhbmdsZXM6ITAsdGV4dEFsaWduOiJjZW50ZXIiLHRleHRCYXNlbGluZToibWlkZGxlIixsaW5lSGVpZ2h0OjEsZm9udDplfSkscz1bWzEvMCwxLzBdLFstKDEvMCksLSgxLzApXV0sbD0wO2w8bi5wb3NpdGlvbnMubGVuZ3RoOysrbClmb3IodmFyIHU9bi5wb3NpdGlvbnNbbF0sYz0wO2M8MjsrK2Mpc1swXVtjXT1NYXRoLm1pbihzWzBdW2NdLHVbY10pLHNbMV1bY109TWF0aC5tYXgoc1sxXVtjXSx1W2NdKTtyZXR1cm4gclt0XT1bbyxuLHNdfXZhciBpPXQoInZlY3Rvcml6ZS10ZXh0Iik7ZS5leHBvcnRzPW47dmFyIGE9e319LHsidmVjdG9yaXplLXRleHQiOjUwOX1dLDIxNTpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlKXt2YXIgcj1pKHQsZSksbj1yLmF0dHJpYnV0ZXM7cmV0dXJuIG4ucG9zaXRpb24ubG9jYXRpb249MCxuLmNvbG9yLmxvY2F0aW9uPTEsbi5nbHlwaC5sb2NhdGlvbj0yLG4uaWQubG9jYXRpb249MyxyfXZhciBpPXQoImdsLXNoYWRlciIpLGE9InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxuYXR0cmlidXRlIHZlYzMgcG9zaXRpb247XG5hdHRyaWJ1dGUgdmVjNCBjb2xvcjtcbmF0dHJpYnV0ZSB2ZWMyIGdseXBoO1xuYXR0cmlidXRlIHZlYzQgaWQ7XG5cblxudW5pZm9ybSB2ZWM0IGhpZ2hsaWdodElkO1xudW5pZm9ybSBmbG9hdCBoaWdobGlnaHRTY2FsZTtcbnVuaWZvcm0gbWF0NCBtb2RlbCwgdmlldywgcHJvamVjdGlvbjtcbnVuaWZvcm0gdmVjMyBjbGlwQm91bmRzWzJdO1xuXG52YXJ5aW5nIHZlYzQgaW50ZXJwQ29sb3I7XG52YXJ5aW5nIHZlYzQgcGlja0lkO1xudmFyeWluZyB2ZWMzIGRhdGFDb29yZGluYXRlO1xuXG52b2lkIG1haW4oKSB7XG4gIGlmKGFueShsZXNzVGhhbihwb3NpdGlvbiwgY2xpcEJvdW5kc1swXSkpICAgfHwgXG4gICAgIGFueShncmVhdGVyVGhhbihwb3NpdGlvbiwgY2xpcEJvdW5kc1sxXSkpICkge1xuICAgIGdsX1Bvc2l0aW9uID0gdmVjNCgwLDAsMCwwKTtcbiAgfSBlbHNlIHtcbiAgICBmbG9hdCBzY2FsZSA9IDEuMDtcbiAgICBpZihkaXN0YW5jZShoaWdobGlnaHRJZCwgaWQpIDwgMC4wMDAxKSB7XG4gICAgICBzY2FsZSA9IGhpZ2hsaWdodFNjYWxlO1xuICAgIH1cblxuICAgIHZlYzQgd29ybGRQb3NpdGlvbiA9IG1vZGVsICogdmVjNChwb3NpdGlvbiwgMSk7XG4gICAgdmVjNCB2aWV3UG9zaXRpb24gPSB2aWV3ICogd29ybGRQb3NpdGlvbjtcbiAgICB2aWV3UG9zaXRpb24gPSB2aWV3UG9zaXRpb24gLyB2aWV3UG9zaXRpb24udztcbiAgICB2ZWM0IGNsaXBQb3NpdGlvbiA9IHByb2plY3Rpb24gKiAodmlld1Bvc2l0aW9uICsgc2NhbGUgKiB2ZWM0KGdseXBoLngsIC1nbHlwaC55LCAwLCAwKSk7XG4gICAgXG4gICAgZ2xfUG9zaXRpb24gPSBjbGlwUG9zaXRpb247XG4gICAgaW50ZXJwQ29sb3IgPSBjb2xvcjtcbiAgICBwaWNrSWQgPSBpZDtcbiAgICBkYXRhQ29vcmRpbmF0ZSA9IHBvc2l0aW9uO1xuICB9XG59IixvPSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbmF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uO1xuYXR0cmlidXRlIHZlYzQgY29sb3I7XG5hdHRyaWJ1dGUgdmVjMiBnbHlwaDtcbmF0dHJpYnV0ZSB2ZWM0IGlkO1xuXG51bmlmb3JtIG1hdDQgbW9kZWwsIHZpZXcsIHByb2plY3Rpb247XG51bmlmb3JtIHZlYzIgc2NyZWVuU2l6ZTtcbnVuaWZvcm0gdmVjMyBjbGlwQm91bmRzWzJdO1xudW5pZm9ybSBmbG9hdCBoaWdobGlnaHRTY2FsZSwgcGl4ZWxSYXRpbztcbnVuaWZvcm0gdmVjNCBoaWdobGlnaHRJZDtcblxudmFyeWluZyB2ZWM0IGludGVycENvbG9yO1xudmFyeWluZyB2ZWM0IHBpY2tJZDtcbnZhcnlpbmcgdmVjMyBkYXRhQ29vcmRpbmF0ZTtcblxudm9pZCBtYWluKCkge1xuICBpZihhbnkobGVzc1RoYW4ocG9zaXRpb24sIGNsaXBCb3VuZHNbMF0pKSB8fCBhbnkoZ3JlYXRlclRoYW4ocG9zaXRpb24sIGNsaXBCb3VuZHNbMV0pKSkge1xuICAgIGdsX1Bvc2l0aW9uID0gdmVjNCgwLDAsMCwwKTtcbiAgfSBlbHNlIHtcbiAgICBmbG9hdCBzY2FsZSA9IHBpeGVsUmF0aW87XG4gICAgaWYoZGlzdGFuY2UoaGlnaGxpZ2h0SWQuYmdyLCBpZC5iZ3IpIDwgMC4wMDEpIHtcbiAgICAgIHNjYWxlICo9IGhpZ2hsaWdodFNjYWxlO1xuICAgIH1cblxuICAgIHZlYzQgd29ybGRQb3NpdGlvbiA9IG1vZGVsICogdmVjNChwb3NpdGlvbiwgMS4wKTtcbiAgICB2ZWM0IHZpZXdQb3NpdGlvbiA9IHZpZXcgKiB3b3JsZFBvc2l0aW9uO1xuICAgIHZlYzQgY2xpcFBvc2l0aW9uID0gcHJvamVjdGlvbiAqIHZpZXdQb3NpdGlvbjtcbiAgICBjbGlwUG9zaXRpb24gLz0gY2xpcFBvc2l0aW9uLnc7XG4gICAgXG4gICAgZ2xfUG9zaXRpb24gPSBjbGlwUG9zaXRpb24gKyB2ZWM0KHNjcmVlblNpemUgKiBzY2FsZSAqIHZlYzIoZ2x5cGgueCwgLWdseXBoLnkpLCAwLjAsIDAuMCk7XG4gICAgaW50ZXJwQ29sb3IgPSBjb2xvcjtcbiAgICBwaWNrSWQgPSBpZDtcbiAgICBkYXRhQ29vcmRpbmF0ZSA9IHBvc2l0aW9uO1xuICB9XG59IixzPSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbmF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uO1xuYXR0cmlidXRlIHZlYzQgY29sb3I7XG5hdHRyaWJ1dGUgdmVjMiBnbHlwaDtcbmF0dHJpYnV0ZSB2ZWM0IGlkO1xuXG51bmlmb3JtIGZsb2F0IGhpZ2hsaWdodFNjYWxlO1xudW5pZm9ybSB2ZWM0IGhpZ2hsaWdodElkO1xudW5pZm9ybSB2ZWMzIGF4ZXNbMl07XG51bmlmb3JtIG1hdDQgbW9kZWwsIHZpZXcsIHByb2plY3Rpb247XG51bmlmb3JtIHZlYzIgc2NyZWVuU2l6ZTtcbnVuaWZvcm0gdmVjMyBjbGlwQm91bmRzWzJdO1xudW5pZm9ybSBmbG9hdCBzY2FsZSwgcGl4ZWxSYXRpbztcblxudmFyeWluZyB2ZWM0IGludGVycENvbG9yO1xudmFyeWluZyB2ZWM0IHBpY2tJZDtcbnZhcnlpbmcgdmVjMyBkYXRhQ29vcmRpbmF0ZTtcblxudm9pZCBtYWluKCkge1xuICBpZihhbnkobGVzc1RoYW4ocG9zaXRpb24sIGNsaXBCb3VuZHNbMF0pKSAgIHx8XG4gICAgIGFueShncmVhdGVyVGhhbihwb3NpdGlvbiwgY2xpcEJvdW5kc1sxXSkpICkge1xuICAgIGdsX1Bvc2l0aW9uID0gdmVjNCgwLDAsMCwwKTtcbiAgfSBlbHNlIHtcbiAgICBmbG9hdCBsc2NhbGUgPSBwaXhlbFJhdGlvICogc2NhbGU7XG4gICAgaWYoZGlzdGFuY2UoaGlnaGxpZ2h0SWQsIGlkKSA8IDAuMDAwMSkge1xuICAgICAgbHNjYWxlICo9IGhpZ2hsaWdodFNjYWxlO1xuICAgIH1cblxuICAgIHZlYzQgY2xpcENlbnRlciAgID0gcHJvamVjdGlvbiAqIHZpZXcgKiBtb2RlbCAqIHZlYzQocG9zaXRpb24sIDEpO1xuICAgIHZlYzMgZGF0YVBvc2l0aW9uID0gcG9zaXRpb24gKyAwLjUqbHNjYWxlKihheGVzWzBdICogZ2x5cGgueCArIGF4ZXNbMV0gKiBnbHlwaC55KSAqIGNsaXBDZW50ZXIudyAqIHNjcmVlblNpemUueTtcbiAgICB2ZWM0IGNsaXBQb3NpdGlvbiA9IHByb2plY3Rpb24gKiB2aWV3ICogbW9kZWwgKiB2ZWM0KGRhdGFQb3NpdGlvbiwgMSk7XG5cbiAgICBnbF9Qb3NpdGlvbiA9IGNsaXBQb3NpdGlvbjtcbiAgICBpbnRlcnBDb2xvciA9IGNvbG9yO1xuICAgIHBpY2tJZCA9IGlkO1xuICAgIGRhdGFDb29yZGluYXRlID0gZGF0YVBvc2l0aW9uO1xuICB9XG59XG4iLGw9InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxudW5pZm9ybSB2ZWMzIGZyYWdDbGlwQm91bmRzWzJdO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuXG52YXJ5aW5nIHZlYzQgaW50ZXJwQ29sb3I7XG52YXJ5aW5nIHZlYzQgcGlja0lkO1xudmFyeWluZyB2ZWMzIGRhdGFDb29yZGluYXRlO1xuXG52b2lkIG1haW4oKSB7XG4gIGlmKGFueShsZXNzVGhhbihkYXRhQ29vcmRpbmF0ZSwgZnJhZ0NsaXBCb3VuZHNbMF0pKSAgIHx8XG4gICAgIGFueShncmVhdGVyVGhhbihkYXRhQ29vcmRpbmF0ZSwgZnJhZ0NsaXBCb3VuZHNbMV0pKSApIHtcbiAgICBkaXNjYXJkO1xuICB9IGVsc2Uge1xuICAgIGdsX0ZyYWdDb2xvciA9IGludGVycENvbG9yICogb3BhY2l0eTtcbiAgfVxufVxuIix1PSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbnVuaWZvcm0gdmVjMyBmcmFnQ2xpcEJvdW5kc1syXTtcbnVuaWZvcm0gZmxvYXQgcGlja0dyb3VwO1xuXG52YXJ5aW5nIHZlYzQgcGlja0lkO1xudmFyeWluZyB2ZWMzIGRhdGFDb29yZGluYXRlO1xuXG52b2lkIG1haW4oKSB7XG4gIGlmKGFueShsZXNzVGhhbihkYXRhQ29vcmRpbmF0ZSwgZnJhZ0NsaXBCb3VuZHNbMF0pKSAgIHx8IFxuICAgICBhbnkoZ3JlYXRlclRoYW4oZGF0YUNvb3JkaW5hdGUsIGZyYWdDbGlwQm91bmRzWzFdKSkgKSB7XG4gICAgZGlzY2FyZDtcbiAgfSBlbHNlIHtcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KHBpY2tHcm91cCwgcGlja0lkLmJncik7XG4gIH1cbn0iLGM9W3tuYW1lOiJwb3NpdGlvbiIsdHlwZToidmVjMyJ9LHtuYW1lOiJjb2xvciIsdHlwZToidmVjNCJ9LHtuYW1lOiJnbHlwaCIsdHlwZToidmVjMiJ9LHtuYW1lOiJpZCIsdHlwZToidmVjNCJ9XSxoPXt2ZXJ0ZXg6YSxmcmFnbWVudDpsLGF0dHJpYnV0ZXM6Y30sZj17dmVydGV4Om8sZnJhZ21lbnQ6bCxhdHRyaWJ1dGVzOmN9LGQ9e3ZlcnRleDpzLGZyYWdtZW50OmwsYXR0cmlidXRlczpjfSxwPXt2ZXJ0ZXg6YSxmcmFnbWVudDp1LGF0dHJpYnV0ZXM6Y30sZz17dmVydGV4Om8sZnJhZ21lbnQ6dSxhdHRyaWJ1dGVzOmN9LG09e3ZlcnRleDpzLGZyYWdtZW50OnUsYXR0cmlidXRlczpjfTtyLmNyZWF0ZVBlcnNwZWN0aXZlPWZ1bmN0aW9uKHQpe3JldHVybiBuKHQsaCl9LHIuY3JlYXRlT3J0aG89ZnVuY3Rpb24odCl7cmV0dXJuIG4odCxmKX0sci5jcmVhdGVQcm9qZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBuKHQsZCl9LHIuY3JlYXRlUGlja1BlcnNwZWN0aXZlPWZ1bmN0aW9uKHQpe3JldHVybiBuKHQscCl9LHIuY3JlYXRlUGlja09ydGhvPWZ1bmN0aW9uKHQpe3JldHVybiBuKHQsZyl9LHIuY3JlYXRlUGlja1Byb2plY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIG4odCxtKX19LHsiZ2wtc2hhZGVyIjoyMjB9XSwyMTY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3ZhciByPXRbMF0sbj10WzFdLGk9dFsyXSxhPXRbM107cmV0dXJuIHRbMF09ZVswXSpyK2VbNF0qbitlWzhdKmkrZVsxMl0qYSx0WzFdPWVbMV0qcitlWzVdKm4rZVs5XSppK2VbMTNdKmEsdFsyXT1lWzJdKnIrZVs2XSpuK2VbMTBdKmkrZVsxNF0qYSx0WzNdPWVbM10qcitlWzddKm4rZVsxMV0qaStlWzE1XSphLHR9ZnVuY3Rpb24gaSh0LGUscixpKXtyZXR1cm4gbihpLGksciksbihpLGksZSksbihpLGksdCl9ZnVuY3Rpb24gYSh0LGUpe3RoaXMuaW5kZXg9dCx0aGlzLmRhdGFDb29yZGluYXRlPXRoaXMucG9zaXRpb249ZX1mdW5jdGlvbiBvKHQsZSxyLG4saSxvLHMsbCx1LGMsaCxmKXt0aGlzLmdsPXQsdGhpcy5waXhlbFJhdGlvPTEsdGhpcy5zaGFkZXI9ZSx0aGlzLm9ydGhvU2hhZGVyPXIsdGhpcy5wcm9qZWN0U2hhZGVyPW4sdGhpcy5wb2ludEJ1ZmZlcj1pLHRoaXMuY29sb3JCdWZmZXI9byx0aGlzLmdseXBoQnVmZmVyPXMsdGhpcy5pZEJ1ZmZlcj1sLHRoaXMudmFvPXUsdGhpcy52ZXJ0ZXhDb3VudD0wLHRoaXMubGluZVZlcnRleENvdW50PTAsdGhpcy5vcGFjaXR5PTEsdGhpcy5saW5lV2lkdGg9MCx0aGlzLnByb2plY3RTY2FsZT1bMi8zLDIvMywyLzNdLHRoaXMucHJvamVjdE9wYWNpdHk9WzEsMSwxXSx0aGlzLnBpY2tJZD0wLHRoaXMucGlja1BlcnNwZWN0aXZlU2hhZGVyPWMsdGhpcy5waWNrT3J0aG9TaGFkZXI9aCx0aGlzLnBpY2tQcm9qZWN0U2hhZGVyPWYsdGhpcy5wb2ludHM9W10sdGhpcy5fc2VsZWN0UmVzdWx0PW5ldyBhKDAsWzAsMCwwXSksdGhpcy51c2VPcnRobz0hMCx0aGlzLmJvdW5kcz1bWzEvMCwxLzAsMS8wXSxbLSgxLzApLC0oMS8wKSwtKDEvMCldXSx0aGlzLmF4ZXNQcm9qZWN0PVshMCwhMCwhMF0sdGhpcy5heGVzQm91bmRzPVtbLSgxLzApLC0oMS8wKSwtKDEvMCldLFsxLzAsMS8wLDEvMF1dLHRoaXMuaGlnaGxpZ2h0SWQ9WzEsMSwxLDFdLHRoaXMuaGlnaGxpZ2h0U2NhbGU9Mix0aGlzLmNsaXBCb3VuZHM9W1stKDEvMCksLSgxLzApLC0oMS8wKV0sWzEvMCwxLzAsMS8wXV0sdGhpcy5kaXJ0eT0hMH1mdW5jdGlvbiBzKHQpe3JldHVybiB0WzBdPXRbMV09dFsyXT0wLHR9ZnVuY3Rpb24gbCh0LGUpe3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzFdLHRbMl09ZVsyXSx0WzNdPTEsdH1mdW5jdGlvbiB1KHQsZSxyLG4pe3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzFdLHRbMl09ZVsyXSx0W3JdPW4sdH1mdW5jdGlvbiBjKHQpe2Zvcih2YXIgZT1MLHI9MDtyPDI7KytyKWZvcih2YXIgbj0wO248MzsrK24pZVtyXVtuXT1NYXRoLm1heChNYXRoLm1pbih0W3JdW25dLDFlOCksLTFlOCk7cmV0dXJuIGV9ZnVuY3Rpb24gaCh0LGUscixuLGEpe3ZhciBvLGg9ZS5heGVzUHJvamVjdCxmPWUuZ2wsZD10LnVuaWZvcm1zLHA9ci5tb2RlbHx8YixnPXIudmlld3x8YixtPXIucHJvamVjdGlvbnx8Yix5PWUuYXhlc0JvdW5kcyx4PWMoZS5jbGlwQm91bmRzKTtvPWUuYXhlcz9lLmF4ZXMubGFzdEN1YmVQcm9wcy5heGlzOlsxLDEsMV0sd1swXT0yL2YuZHJhd2luZ0J1ZmZlcldpZHRoLHdbMV09Mi9mLmRyYXdpbmdCdWZmZXJIZWlnaHQsdC5iaW5kKCksZC52aWV3PWcsZC5wcm9qZWN0aW9uPW0sZC5zY3JlZW5TaXplPXcsZC5oaWdobGlnaHRJZD1lLmhpZ2hsaWdodElkLGQuaGlnaGxpZ2h0U2NhbGU9ZS5oaWdobGlnaHRTY2FsZSxkLmNsaXBCb3VuZHM9eCxkLnBpY2tHcm91cD1lLnBpY2tJZC8yNTUsZC5waXhlbFJhdGlvPWUucGl4ZWxSYXRpbztmb3IodmFyIF89MDtfPDM7KytfKWlmKGhbX10mJmUucHJvamVjdE9wYWNpdHlbX108MT09PW4pe2Quc2NhbGU9ZS5wcm9qZWN0U2NhbGVbX10sZC5vcGFjaXR5PWUucHJvamVjdE9wYWNpdHlbX107Zm9yKHZhciBMPUUsej0wO3o8MTY7Kyt6KUxbel09MDtmb3IodmFyIHo9MDt6PDQ7Kyt6KUxbNSp6XT0xO0xbNSpfXT0wLG9bX108MD9MWzEyK19dPXlbMF1bX106TFsxMitfXT15WzFdW19dLHYoTCxwLEwpLGQubW9kZWw9TDt2YXIgQz0oXysxKSUzLEk9KF8rMiklMyxQPXMoTSksRD1zKEEpO1BbQ109MSxEW0ldPTE7dmFyIFI9aShtLGcscCxsKGssUCkpLE89aShtLGcscCxsKFQsRCkpO2lmKE1hdGguYWJzKFJbMV0pPk1hdGguYWJzKE9bMV0pKXt2YXIgRj1SO1I9TyxPPUYsRj1QLFA9RCxEPUY7dmFyIGo9QztDPUksST1qfVJbMF08MCYmKFBbQ109LTEpLE9bMV0+MCYmKERbSV09LTEpO2Zvcih2YXIgTj0wLEI9MCx6PTA7ejw0OysreilOKz1NYXRoLnBvdyhwWzQqQyt6XSwyKSxCKz1NYXRoLnBvdyhwWzQqSSt6XSwyKTtQW0NdLz1NYXRoLnNxcnQoTiksRFtJXS89TWF0aC5zcXJ0KEIpLGQuYXhlc1swXT1QLGQuYXhlc1sxXT1ELGQuZnJhZ0NsaXBCb3VuZHNbMF09dShTLHhbMF0sXywtMWU4KSxkLmZyYWdDbGlwQm91bmRzWzFdPXUoUyx4WzFdLF8sMWU4KSxlLnZhby5kcmF3KGYuVFJJQU5HTEVTLGUudmVydGV4Q291bnQpLGUubGluZVdpZHRoPjAmJihmLmxpbmVXaWR0aChlLmxpbmVXaWR0aCksZS52YW8uZHJhdyhmLkxJTkVTLGUubGluZVZlcnRleENvdW50LGUudmVydGV4Q291bnQpKX19ZnVuY3Rpb24gZih0LGUscixuLGksYSl7dmFyIG89ci5nbDtpZihyLnZhby5iaW5kKCksaT09PXIub3BhY2l0eTwxfHxhKXt0LmJpbmQoKTt2YXIgcz10LnVuaWZvcm1zO3MubW9kZWw9bi5tb2RlbHx8YixzLnZpZXc9bi52aWV3fHxiLHMucHJvamVjdGlvbj1uLnByb2plY3Rpb258fGIsd1swXT0yL28uZHJhd2luZ0J1ZmZlcldpZHRoLHdbMV09Mi9vLmRyYXdpbmdCdWZmZXJIZWlnaHQscy5zY3JlZW5TaXplPXcscy5oaWdobGlnaHRJZD1yLmhpZ2hsaWdodElkLHMuaGlnaGxpZ2h0U2NhbGU9ci5oaWdobGlnaHRTY2FsZSxzLmZyYWdDbGlwQm91bmRzPUkscy5jbGlwQm91bmRzPXIuYXhlcy5ib3VuZHMscy5vcGFjaXR5PXIub3BhY2l0eSxzLnBpY2tHcm91cD1yLnBpY2tJZC8yNTUscy5waXhlbFJhdGlvPXIucGl4ZWxSYXRpbyxyLnZhby5kcmF3KG8uVFJJQU5HTEVTLHIudmVydGV4Q291bnQpLHIubGluZVdpZHRoPjAmJihvLmxpbmVXaWR0aChyLmxpbmVXaWR0aCksci52YW8uZHJhdyhvLkxJTkVTLHIubGluZVZlcnRleENvdW50LHIudmVydGV4Q291bnQpKX1oKGUscixuLGksYSksci52YW8udW5iaW5kKCl9ZnVuY3Rpb24gZCh0KXt2YXIgZT10LmdsLHI9eS5jcmVhdGVQZXJzcGVjdGl2ZShlKSxuPXkuY3JlYXRlT3J0aG8oZSksaT15LmNyZWF0ZVByb2plY3QoZSksYT15LmNyZWF0ZVBpY2tQZXJzcGVjdGl2ZShlKSxzPXkuY3JlYXRlUGlja09ydGhvKGUpLGw9eS5jcmVhdGVQaWNrUHJvamVjdChlKSx1PXAoZSksYz1wKGUpLGg9cChlKSxmPXAoZSksZD1nKGUsW3tidWZmZXI6dSxzaXplOjMsdHlwZTplLkZMT0FUfSx7YnVmZmVyOmMsc2l6ZTo0LHR5cGU6ZS5GTE9BVH0se2J1ZmZlcjpoLHNpemU6Mix0eXBlOmUuRkxPQVR9LHtidWZmZXI6ZixzaXplOjQsdHlwZTplLlVOU0lHTkVEX0JZVEUsbm9ybWFsaXplZDohMH1dKSxtPW5ldyBvKGUscixuLGksdSxjLGgsZixkLGEscyxsKTtyZXR1cm4gbS51cGRhdGUodCksbX12YXIgcD10KCJnbC1idWZmZXIiKSxnPXQoImdsLXZhbyIpLG09dCgidHlwZWRhcnJheS1wb29sIiksdj10KCJnbC1tYXQ0L211bHRpcGx5IikseT10KCIuL2xpYi9zaGFkZXJzIikseD10KCIuL2xpYi9nbHlwaHMiKSxiPVsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXTtlLmV4cG9ydHM9ZDt2YXIgXz1vLnByb3RvdHlwZTtfLnBpY2tTbG90cz0xLF8uc2V0UGlja0Jhc2U9ZnVuY3Rpb24odCl7dGhpcy5waWNrSWQ9dH0sXy5pc1RyYW5zcGFyZW50PWZ1bmN0aW9uKCl7aWYodGhpcy5vcGFjaXR5PDEpcmV0dXJuITA7Zm9yKHZhciB0PTA7dDwzOysrdClpZih0aGlzLmF4ZXNQcm9qZWN0W3RdJiZ0aGlzLnByb2plY3RPcGFjaXR5W3RdPDEpcmV0dXJuITA7cmV0dXJuITF9LF8uaXNPcGFxdWU9ZnVuY3Rpb24oKXtpZih0aGlzLm9wYWNpdHk+PTEpcmV0dXJuITA7Zm9yKHZhciB0PTA7dDwzOysrdClpZih0aGlzLmF4ZXNQcm9qZWN0W3RdJiZ0aGlzLnByb2plY3RPcGFjaXR5W3RdPj0xKXJldHVybiEwO3JldHVybiExfTt2YXIgdz1bMCwwXSxNPVswLDAsMF0sQT1bMCwwLDBdLGs9WzAsMCwwLDFdLFQ9WzAsMCwwLDFdLEU9Yi5zbGljZSgpLFM9WzAsMCwwXSxMPVtbMCwwLDBdLFswLDAsMF1dLHo9Wy0xZTgsLTFlOCwtMWU4XSxDPVsxZTgsMWU4LDFlOF0sST1beixDXTtfLmRyYXc9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy51c2VPcnRobz90aGlzLm9ydGhvU2hhZGVyOnRoaXMuc2hhZGVyO2YoZSx0aGlzLnByb2plY3RTaGFkZXIsdGhpcyx0LCExLCExKX0sXy5kcmF3VHJhbnNwYXJlbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy51c2VPcnRobz90aGlzLm9ydGhvU2hhZGVyOnRoaXMuc2hhZGVyO2YoZSx0aGlzLnByb2plY3RTaGFkZXIsdGhpcyx0LCEwLCExKX0sXy5kcmF3UGljaz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnVzZU9ydGhvP3RoaXMucGlja09ydGhvU2hhZGVyOnRoaXMucGlja1BlcnNwZWN0aXZlU2hhZGVyO2YoZSx0aGlzLnBpY2tQcm9qZWN0U2hhZGVyLHRoaXMsdCwhMSwhMCl9LF8ucGljaz1mdW5jdGlvbih0KXtpZighdClyZXR1cm4gbnVsbDtpZih0LmlkIT09dGhpcy5waWNrSWQpcmV0dXJuIG51bGw7dmFyIGU9dC52YWx1ZVsyXSsodC52YWx1ZVsxXTw8OCkrKHQudmFsdWVbMF08PDE2KTtpZihlPj10aGlzLnBvaW50Q291bnR8fGU8MClyZXR1cm4gbnVsbDt2YXIgcj10aGlzLnBvaW50c1tlXSxuPXRoaXMuX3NlbGVjdFJlc3VsdDtuLmluZGV4PWU7Zm9yKHZhciBpPTA7aTwzOysraSluLnBvc2l0aW9uW2ldPW4uZGF0YUNvb3JkaW5hdGVbaV09cltpXTtyZXR1cm4gbn0sXy5oaWdobGlnaHQ9ZnVuY3Rpb24odCl7aWYodCl7dmFyIGU9dC5pbmRleCxyPTI1NSZlLG49ZT4+OCYyNTUsaT1lPj4xNiYyNTU7dGhpcy5oaWdobGlnaHRJZD1bci8yNTUsbi8yNTUsaS8yNTUsMF19ZWxzZSB0aGlzLmhpZ2hsaWdodElkPVsxLDEsMSwxXX0sXy51cGRhdGU9ZnVuY3Rpb24odCl7aWYodD10fHx7fSwicGVyc3BlY3RpdmUiaW4gdCYmKHRoaXMudXNlT3J0aG89IXQucGVyc3BlY3RpdmUpLCJvcnRob2dyYXBoaWMiaW4gdCYmKHRoaXMudXNlT3J0aG89ISF0Lm9ydGhvZ3JhcGhpYyksImxpbmVXaWR0aCJpbiB0JiYodGhpcy5saW5lV2lkdGg9dC5saW5lV2lkdGgpLCJwcm9qZWN0ImluIHQpaWYoQXJyYXkuaXNBcnJheSh0LnByb2plY3QpKXRoaXMuYXhlc1Byb2plY3Q9dC5wcm9qZWN0O2Vsc2V7dmFyIGU9ISF0LnByb2plY3Q7dGhpcy5heGVzUHJvamVjdD1bZSxlLGVdfWlmKCJwcm9qZWN0U2NhbGUiaW4gdClpZihBcnJheS5pc0FycmF5KHQucHJvamVjdFNjYWxlKSl0aGlzLnByb2plY3RTY2FsZT10LnByb2plY3RTY2FsZS5zbGljZSgpO2Vsc2V7dmFyIHI9K3QucHJvamVjdFNjYWxlO3RoaXMucHJvamVjdFNjYWxlPVtyLHIscl19aWYoInByb2plY3RPcGFjaXR5ImluIHQpaWYoQXJyYXkuaXNBcnJheSh0LnByb2plY3RPcGFjaXR5KSl0aGlzLnByb2plY3RPcGFjaXR5PXQucHJvamVjdE9wYWNpdHkuc2xpY2UoKTtlbHNle3ZhciByPSt0LnByb2plY3RPcGFjaXR5O3RoaXMucHJvamVjdE9wYWNpdHk9W3IscixyXX0ib3BhY2l0eSJpbiB0JiYodGhpcy5vcGFjaXR5PXQub3BhY2l0eSksdGhpcy5kaXJ0eT0hMDt2YXIgbj10LnBvc2l0aW9uO2lmKG4pe3ZhciBpPXQuZm9udHx8Im5vcm1hbCIsYT10LmFsaWdubWVudHx8WzAsMF0sbz1bMS8wLDEvMCwxLzBdLHM9Wy0oMS8wKSwtKDEvMCksLSgxLzApXSxsPXQuZ2x5cGgsdT10LmNvbG9yLGM9dC5zaXplLGg9dC5hbmdsZSxmPXQubGluZUNvbG9yLGQ9MCxwPTAsZz0wLHY9bi5sZW5ndGg7dDpmb3IodmFyIHk9MDt5PHY7Kyt5KXtmb3IodmFyIGI9blt5XSxfPTA7XzwzOysrXylpZihpc05hTihiW19dKXx8IWlzRmluaXRlKGJbX10pKWNvbnRpbnVlIHQ7dmFyIHc7dz1BcnJheS5pc0FycmF5KGwpP3gobFt5XSxpKTpsP3gobCxpKTp4KCJcdTI1Y2YiLGkpO3ZhciBNPXdbMF0sQT13WzFdLGs9d1syXTtwKz0zKk0uY2VsbHMubGVuZ3RoLGcrPTIqQS5lZGdlcy5sZW5ndGh9dmFyIFQ9cCtnLEU9bS5tYWxsb2NGbG9hdCgzKlQpLFM9bS5tYWxsb2NGbG9hdCg0KlQpLEw9bS5tYWxsb2NGbG9hdCgyKlQpLHo9bS5tYWxsb2NVaW50MzIoVCksQz1bMCxhWzFdXSxJPTAsUD1wLEQ9WzAsMCwwLDFdLFI9WzAsMCwwLDFdLE89QXJyYXkuaXNBcnJheSh1KSYmQXJyYXkuaXNBcnJheSh1WzBdKSxGPUFycmF5LmlzQXJyYXkoZikmJkFycmF5LmlzQXJyYXkoZlswXSk7dDpmb3IodmFyIHk9MDt5PHY7Kyt5KXtmb3IodmFyIGI9blt5XSxfPTA7XzwzOysrXyl7aWYoaXNOYU4oYltfXSl8fCFpc0Zpbml0ZShiW19dKSl7ZCs9MTtjb250aW51ZSB0fXNbX109TWF0aC5tYXgoc1tfXSxiW19dKSxvW19dPU1hdGgubWluKG9bX10sYltfXSl9dmFyIHc7dz1BcnJheS5pc0FycmF5KGwpP3gobFt5XSxpKTpsP3gobCxpKTp4KCJcdTI1Y2YiLGkpO3ZhciBNPXdbMF0sQT13WzFdLGs9d1syXTtpZihBcnJheS5pc0FycmF5KHUpKXt2YXIgajtpZihqPU8/dVt5XTp1LDM9PT1qLmxlbmd0aCl7Zm9yKHZhciBfPTA7XzwzOysrXylEW19dPWpbX107RFszXT0xfWVsc2UgaWYoND09PWoubGVuZ3RoKWZvcih2YXIgXz0wO188NDsrK18pRFtfXT1qW19dfWVsc2UgRFswXT1EWzFdPURbMl09MCxEWzNdPTE7aWYoQXJyYXkuaXNBcnJheShmKSl7dmFyIGo7aWYoaj1GP2ZbeV06ZiwzPT09ai5sZW5ndGgpe2Zvcih2YXIgXz0wO188MzsrK18pUltfXT1qW19dO1JbX109MX1lbHNlIGlmKDQ9PT1qLmxlbmd0aClmb3IodmFyIF89MDtfPDQ7KytfKVJbX109altfXX1lbHNlIFJbMF09UlsxXT1SWzJdPTAsUlszXT0xO3ZhciBOPS41O0FycmF5LmlzQXJyYXkoYyk/Tj0rY1t5XTpjP049K2M6dGhpcy51c2VPcnRobyYmKE49MTIpO3ZhciBCPTA7QXJyYXkuaXNBcnJheShoKT9CPStoW3ldOmgmJihCPStoKTtmb3IodmFyIFU9TWF0aC5jb3MoQiksVj1NYXRoLnNpbihCKSxiPW5beV0sXz0wO188MzsrK18pc1tfXT1NYXRoLm1heChzW19dLGJbX10pLG9bX109TWF0aC5taW4ob1tfXSxiW19dKTthWzBdPDA/Q1swXT1hWzBdKigxK2tbMV1bMF0pOmFbMF0+MCYmKENbMF09LWFbMF0qKDEra1swXVswXSkpO2Zvcih2YXIgcT1NLmNlbGxzLEg9TS5wb3NpdGlvbnMsXz0wO188cS5sZW5ndGg7KytfKWZvcih2YXIgRz1xW19dLFg9MDtYPDM7KytYKXtmb3IodmFyIFk9MDtZPDM7KytZKUVbMypJK1ldPWJbWV07Zm9yKHZhciBZPTA7WTw0OysrWSlTWzQqSStZXT1EW1ldO3pbSV09ZDt2YXIgVz1IW0dbWF1dO0xbMipJXT1OKihVKldbMF0tVipXWzFdK0NbMF0pLExbMipJKzFdPU4qKFYqV1swXStVKldbMV0rQ1sxXSksSSs9MX1mb3IodmFyIHE9QS5lZGdlcyxIPUEucG9zaXRpb25zLF89MDtfPHEubGVuZ3RoOysrXylmb3IodmFyIEc9cVtfXSxYPTA7WDwyOysrWCl7Zm9yKHZhciBZPTA7WTwzOysrWSlFWzMqUCtZXT1iW1ldO2Zvcih2YXIgWT0wO1k8NDsrK1kpU1s0KlArWV09UltZXTt6W1BdPWQ7dmFyIFc9SFtHW1hdXTtMWzIqUF09TiooVSpXWzBdLVYqV1sxXStDWzBdKSxMWzIqUCsxXT1OKihWKldbMF0rVSpXWzFdK0NbMV0pLFArPTF9ZCs9MX10aGlzLnZlcnRleENvdW50PXAsdGhpcy5saW5lVmVydGV4Q291bnQ9Zyx0aGlzLnBvaW50QnVmZmVyLnVwZGF0ZShFKSx0aGlzLmNvbG9yQnVmZmVyLnVwZGF0ZShTKSx0aGlzLmdseXBoQnVmZmVyLnVwZGF0ZShMKSx0aGlzLmlkQnVmZmVyLnVwZGF0ZShuZXcgVWludDMyQXJyYXkoeikpLG0uZnJlZShFKSxtLmZyZWUoUyksbS5mcmVlKEwpLG0uZnJlZSh6KSx0aGlzLmJvdW5kcz1bbyxzXSx0aGlzLnBvaW50cz1uLHRoaXMucG9pbnRDb3VudD1uLmxlbmd0aH19LF8uZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuc2hhZGVyLmRpc3Bvc2UoKSx0aGlzLm9ydGhvU2hhZGVyLmRpc3Bvc2UoKSx0aGlzLnBpY2tQZXJzcGVjdGl2ZVNoYWRlci5kaXNwb3NlKCksdGhpcy5waWNrT3J0aG9TaGFkZXIuZGlzcG9zZSgpLHRoaXMudmFvLmRpc3Bvc2UoKSx0aGlzLnBvaW50QnVmZmVyLmRpc3Bvc2UoKSx0aGlzLmNvbG9yQnVmZmVyLmRpc3Bvc2UoKSx0aGlzLmdseXBoQnVmZmVyLmRpc3Bvc2UoKSx0aGlzLmlkQnVmZmVyLmRpc3Bvc2UoKX19LHsiLi9saWIvZ2x5cGhzIjoyMTQsIi4vbGliL3NoYWRlcnMiOjIxNSwiZ2wtYnVmZmVyIjoxMjgsImdsLW1hdDQvbXVsdGlwbHkiOjE1MSwiZ2wtdmFvIjoyMzYsInR5cGVkYXJyYXktcG9vbCI6NDk2fV0sMjE3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3IuYm94VmVydGV4PSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbmF0dHJpYnV0ZSB2ZWMyIHZlcnRleDtcblxudW5pZm9ybSB2ZWMyIGNvcm5lckEsIGNvcm5lckI7XG5cbnZvaWQgbWFpbigpIHtcbiAgZ2xfUG9zaXRpb24gPSB2ZWM0KG1peChjb3JuZXJBLCBjb3JuZXJCLCB2ZXJ0ZXgpLCAwLCAxKTtcbn1cbiIsci5ib3hGcmFnbWVudD0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG51bmlmb3JtIHZlYzQgY29sb3I7XG5cbnZvaWQgbWFpbigpIHtcbiAgZ2xfRnJhZ0NvbG9yID0gY29sb3I7XG59XG4ifSx7fV0sMjE4OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIpe3RoaXMucGxvdD10LHRoaXMuYm94QnVmZmVyPWUsdGhpcy5ib3hTaGFkZXI9cix0aGlzLmVuYWJsZWQ9ITAsdGhpcy5zZWxlY3RCb3g9WzEvMCwxLzAsLSgxLzApLC0oMS8wKV0sdGhpcy5ib3JkZXJDb2xvcj1bMCwwLDAsMV0sdGhpcy5pbm5lckZpbGw9ITEsdGhpcy5pbm5lckNvbG9yPVswLDAsMCwuMjVdLHRoaXMub3V0ZXJGaWxsPSEwLHRoaXMub3V0ZXJDb2xvcj1bMCwwLDAsLjVdLHRoaXMuYm9yZGVyV2lkdGg9MTB9ZnVuY3Rpb24gaSh0LGUpe3ZhciByPXQuZ2wsaT1vKHIsWzAsMCwwLDEsMSwwLDEsMV0pLGw9YShyLHMuYm94VmVydGV4LHMuYm94RnJhZ21lbnQpLHU9bmV3IG4odCxpLGwpO3JldHVybiB1LnVwZGF0ZShlKSx0LmFkZE92ZXJsYXkodSksdX12YXIgYT10KCJnbC1zaGFkZXIiKSxvPXQoImdsLWJ1ZmZlciIpLHM9dCgiLi9saWIvc2hhZGVycyIpO2UuZXhwb3J0cz1pO3ZhciBsPW4ucHJvdG90eXBlO2wuZHJhdz1mdW5jdGlvbigpe2lmKHRoaXMuZW5hYmxlZCl7dmFyIHQ9dGhpcy5wbG90LGU9dGhpcy5zZWxlY3RCb3gscj10aGlzLmJvcmRlcldpZHRoLG49KHRoaXMuaW5uZXJGaWxsLHRoaXMuaW5uZXJDb2xvciksaT0odGhpcy5vdXRlckZpbGwsdGhpcy5vdXRlckNvbG9yKSxhPXRoaXMuYm9yZGVyQ29sb3Isbz10LmJveCxzPXQuc2NyZWVuQm94LGw9dC5kYXRhQm94LHU9dC52aWV3Qm94LGM9dC5waXhlbFJhdGlvLGg9KGVbMF0tbFswXSkqKHVbMl0tdVswXSkvKGxbMl0tbFswXSkrdVswXSxmPShlWzFdLWxbMV0pKih1WzNdLXVbMV0pLyhsWzNdLWxbMV0pK3VbMV0sZD0oZVsyXS1sWzBdKSoodVsyXS11WzBdKS8obFsyXS1sWzBdKSt1WzBdLHA9KGVbM10tbFsxXSkqKHVbM10tdVsxXSkvKGxbM10tbFsxXSkrdVsxXTtpZihoPU1hdGgubWF4KGgsdVswXSksZj1NYXRoLm1heChmLHVbMV0pLGQ9TWF0aC5taW4oZCx1WzJdKSxwPU1hdGgubWluKHAsdVszXSksIShkPGh8fHA8Zikpe28uYmluZCgpO3ZhciBnPXNbMl0tc1swXSxtPXNbM10tc1sxXTtpZih0aGlzLm91dGVyRmlsbCYmKG8uZHJhd0JveCgwLDAsZyxmLGkpLG8uZHJhd0JveCgwLGYsaCxwLGkpLG8uZHJhd0JveCgwLHAsZyxtLGkpLG8uZHJhd0JveChkLGYsZyxwLGkpKSx0aGlzLmlubmVyRmlsbCYmby5kcmF3Qm94KGgsZixkLHAsbikscj4wKXt2YXIgdj1yKmM7by5kcmF3Qm94KGgtdixmLXYsZCt2LGYrdixhKSxvLmRyYXdCb3goaC12LHAtdixkK3YscCt2LGEpLG8uZHJhd0JveChoLXYsZi12LGgrdixwK3YsYSksby5kcmF3Qm94KGQtdixmLXYsZCt2LHArdixhKX19fX0sbC51cGRhdGU9ZnVuY3Rpb24odCl7dD10fHx7fSx0aGlzLmlubmVyRmlsbD0hIXQuaW5uZXJGaWxsLHRoaXMub3V0ZXJGaWxsPSEhdC5vdXRlckZpbGwsdGhpcy5pbm5lckNvbG9yPSh0LmlubmVyQ29sb3J8fFswLDAsMCwuNV0pLnNsaWNlKCksdGhpcy5vdXRlckNvbG9yPSh0Lm91dGVyQ29sb3J8fFswLDAsMCwuNV0pLnNsaWNlKCksdGhpcy5ib3JkZXJDb2xvcj0odC5ib3JkZXJDb2xvcnx8WzAsMCwwLDFdKS5zbGljZSgpLHRoaXMuYm9yZGVyV2lkdGg9dC5ib3JkZXJXaWR0aHx8MCx0aGlzLnNlbGVjdEJveD0odC5zZWxlY3RCb3h8fHRoaXMuc2VsZWN0Qm94KS5zbGljZSgpfSxsLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmJveEJ1ZmZlci5kaXNwb3NlKCksdGhpcy5ib3hTaGFkZXIuZGlzcG9zZSgpLHRoaXMucGxvdC5yZW1vdmVPdmVybGF5KHRoaXMpfX0seyIuL2xpYi9zaGFkZXJzIjoyMTcsImdsLWJ1ZmZlciI6MTI4LCJnbC1zaGFkZXIiOjIyMH1dLDIxOTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyLG4saSl7dGhpcy5jb29yZD1bdCxlXSx0aGlzLmlkPXIsdGhpcy52YWx1ZT1uLHRoaXMuZGlzdGFuY2U9aX1mdW5jdGlvbiBpKHQsZSxyKXt0aGlzLmdsPXQsdGhpcy5mYm89ZSx0aGlzLmJ1ZmZlcj1yLHRoaXMuX3JlYWRUaW1lb3V0PW51bGw7dmFyIG49dGhpczt0aGlzLl9yZWFkQ2FsbGJhY2s9ZnVuY3Rpb24oKXtuLmdsJiYoZS5iaW5kKCksdC5yZWFkUGl4ZWxzKDAsMCxlLnNoYXBlWzBdLGUuc2hhcGVbMV0sdC5SR0JBLHQuVU5TSUdORURfQllURSxuLmJ1ZmZlciksbi5fcmVhZFRpbWVvdXQ9bnVsbCl9fWZ1bmN0aW9uIGEodCxlKXt2YXIgcj1vKHQsZSksbj1zLm1hbGxvY1VpbnQ4KGVbMF0qZVsxXSo0KTtyZXR1cm4gbmV3IGkodCxyLG4pfWUuZXhwb3J0cz1hO3ZhciBvPXQoImdsLWZibyIpLHM9dCgidHlwZWRhcnJheS1wb29sIiksbD10KCJuZGFycmF5IiksdT10KCJiaXQtdHdpZGRsZSIpLm5leHRQb3cyLGM9dCgiY3dpc2UvbGliL3dyYXBwZXIiKSh7YXJnczpbImFycmF5Iix7b2Zmc2V0OlswLDAsMV0sYXJyYXk6MH0se29mZnNldDpbMCwwLDJdLGFycmF5OjB9LHtvZmZzZXQ6WzAsMCwzXSxhcnJheTowfSwic2NhbGFyIiwic2NhbGFyIiwiaW5kZXgiXSxwcmU6e2JvZHk6Int0aGlzX2Nsb3Nlc3REMj0xZTgsdGhpc19jbG9zZXN0WD0tMSx0aGlzX2Nsb3Nlc3RZPS0xfSIsYXJnczpbXSx0aGlzVmFyczpbInRoaXNfY2xvc2VzdEQyIiwidGhpc19jbG9zZXN0WCIsInRoaXNfY2xvc2VzdFkiXSxsb2NhbFZhcnM6W119LGJvZHk6e2JvZHk6IntpZihfaW5saW5lXzQ5X2FyZzBfPDI1NXx8X2lubGluZV80OV9hcmcxXzwyNTV8fF9pbmxpbmVfNDlfYXJnMl88MjU1fHxfaW5saW5lXzQ5X2FyZzNfPDI1NSl7dmFyIF9pbmxpbmVfNDlfbD1faW5saW5lXzQ5X2FyZzRfLV9pbmxpbmVfNDlfYXJnNl9bMF0sX2lubGluZV80OV9hPV9pbmxpbmVfNDlfYXJnNV8tX2lubGluZV80OV9hcmc2X1sxXSxfaW5saW5lXzQ5X2Y9X2lubGluZV80OV9sKl9pbmxpbmVfNDlfbCtfaW5saW5lXzQ5X2EqX2lubGluZV80OV9hO19pbmxpbmVfNDlfZjx0aGlzX2Nsb3Nlc3REMiYmKHRoaXNfY2xvc2VzdEQyPV9pbmxpbmVfNDlfZix0aGlzX2Nsb3Nlc3RYPV9pbmxpbmVfNDlfYXJnNl9bMF0sdGhpc19jbG9zZXN0WT1faW5saW5lXzQ5X2FyZzZfWzFdKX19IixhcmdzOlt7bmFtZToiX2lubGluZV80OV9hcmcwXyIsbHZhbHVlOiExLHJ2YWx1ZTohMCxjb3VudDoxfSx7bmFtZToiX2lubGluZV80OV9hcmcxXyIsbHZhbHVlOiExLHJ2YWx1ZTohMCxjb3VudDoxfSx7bmFtZToiX2lubGluZV80OV9hcmcyXyIsbHZhbHVlOiExLHJ2YWx1ZTohMCxjb3VudDoxfSx7bmFtZToiX2lubGluZV80OV9hcmczXyIsbHZhbHVlOiExLHJ2YWx1ZTohMCxjb3VudDoxfSx7bmFtZToiX2lubGluZV80OV9hcmc0XyIsbHZhbHVlOiExLHJ2YWx1ZTohMCxjb3VudDoxfSx7bmFtZToiX2lubGluZV80OV9hcmc1XyIsbHZhbHVlOiExLHJ2YWx1ZTohMCxjb3VudDoxfSx7bmFtZToiX2lubGluZV80OV9hcmc2XyIsbHZhbHVlOiExLHJ2YWx1ZTohMCxjb3VudDo0fV0sdGhpc1ZhcnM6WyJ0aGlzX2Nsb3Nlc3REMiIsInRoaXNfY2xvc2VzdFgiLCJ0aGlzX2Nsb3Nlc3RZIl0sbG9jYWxWYXJzOlsiX2lubGluZV80OV9hIiwiX2lubGluZV80OV9mIiwiX2lubGluZV80OV9sIl19LHBvc3Q6e2JvZHk6IntyZXR1cm5bdGhpc19jbG9zZXN0WCx0aGlzX2Nsb3Nlc3RZLHRoaXNfY2xvc2VzdEQyXX0iLGFyZ3M6W10sdGhpc1ZhcnM6WyJ0aGlzX2Nsb3Nlc3REMiIsInRoaXNfY2xvc2VzdFgiLCJ0aGlzX2Nsb3Nlc3RZIl0sbG9jYWxWYXJzOltdfSxkZWJ1ZzohMSxmdW5jTmFtZToiY3dpc2UiLGJsb2NrU2l6ZTo2NH0pLGg9aS5wcm90b3R5cGU7T2JqZWN0LmRlZmluZVByb3BlcnR5KGgsInNoYXBlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2w/dGhpcy5mYm8uc2hhcGUuc2xpY2UoKTpbMCwwXX0sc2V0OmZ1bmN0aW9uKHQpe2lmKHRoaXMuZ2wpe3RoaXMuZmJvLnNoYXBlPXQ7dmFyIGU9dGhpcy5mYm8uc2hhcGVbMF0scj10aGlzLmZiby5zaGFwZVsxXTtpZihyKmUqND50aGlzLmJ1ZmZlci5sZW5ndGgpe3MuZnJlZSh0aGlzLmJ1ZmZlcik7Zm9yKHZhciBuPXRoaXMuYnVmZmVyPXMubWFsbG9jVWludDgodShyKmUqNCkpLGk9MDtpPHIqZSo0OysraSluW2ldPTI1NX1yZXR1cm4gdH19fSksaC5iZWdpbj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2w7dGhpcy5zaGFwZTt0JiYodGhpcy5mYm8uYmluZCgpLHQuY2xlYXJDb2xvcigxLDEsMSwxKSx0LmNsZWFyKHQuQ09MT1JfQlVGRkVSX0JJVHx0LkRFUFRIX0JVRkZFUl9CSVQpKX0saC5lbmQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdsO3QmJih0LmJpbmRGcmFtZWJ1ZmZlcih0LkZSQU1FQlVGRkVSLG51bGwpLHRoaXMuX3JlYWRUaW1lb3V0fHxjbGVhclRpbWVvdXQodGhpcy5fcmVhZFRpbWVvdXQpLHRoaXMuX3JlYWRUaW1lb3V0PXNldFRpbWVvdXQodGhpcy5fcmVhZENhbGxiYWNrLDEpKX0saC5xdWVyeT1mdW5jdGlvbih0LGUscil7aWYoIXRoaXMuZ2wpcmV0dXJuIG51bGw7dmFyIGk9dGhpcy5mYm8uc2hhcGUuc2xpY2UoKTt0PTB8dCxlPTB8ZSwibnVtYmVyIiE9dHlwZW9mIHImJihyPTEpO3ZhciBhPTB8TWF0aC5taW4oTWF0aC5tYXgodC1yLDApLGlbMF0pLG89MHxNYXRoLm1pbihNYXRoLm1heCh0K3IsMCksaVswXSkscz0wfE1hdGgubWluKE1hdGgubWF4KGUtciwwKSxpWzFdKSx1PTB8TWF0aC5taW4oTWF0aC5tYXgoZStyLDApLGlbMV0pO2lmKG88PWF8fHU8PXMpcmV0dXJuIG51bGw7dmFyIGg9W28tYSx1LXNdLGY9bCh0aGlzLmJ1ZmZlcixbaFswXSxoWzFdLDRdLFs0LDQqaVswXSwxXSw0KihhK2lbMF0qcykpLGQ9YyhmLmhpKGhbMF0saFsxXSwxKSxyLHIpLHA9ZFswXSxnPWRbMV07aWYocDwwfHxNYXRoLnBvdyh0aGlzLnJhZGl1cywyKTxkWzJdKXJldHVybiBudWxsO3ZhciBtPWYuZ2V0KHAsZywwKSx2PWYuZ2V0KHAsZywxKSx5PWYuZ2V0KHAsZywyKSx4PWYuZ2V0KHAsZywzKTtyZXR1cm4gbmV3IG4ocCthfDAsZytzfDAsbSxbdix5LHhdLE1hdGguc3FydChkWzJdKSl9LGguZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuZ2wmJih0aGlzLmZiby5kaXNwb3NlKCkscy5mcmVlKHRoaXMuYnVmZmVyKSx0aGlzLmdsPW51bGwsdGhpcy5fcmVhZFRpbWVvdXQmJmNsZWFyVGltZW91dCh0aGlzLl9yZWFkVGltZW91dCkpfX0seyJiaXQtdHdpZGRsZSI6NTQsImN3aXNlL2xpYi93cmFwcGVyIjo5NCwiZ2wtZmJvIjoxMzUsbmRhcnJheTo0MjcsInR5cGVkYXJyYXktcG9vbCI6NDk2fV0sMjIwOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dGhpcy5nbD10LHRoaXMuX3ZyZWY9dGhpcy5fZnJlZj10aGlzLl9yZWxpbms9dGhpcy52ZXJ0U2hhZGVyPXRoaXMuZnJhZ1NoYWRlcj10aGlzLnByb2dyYW09dGhpcy5hdHRyaWJ1dGVzPXRoaXMudW5pZm9ybXM9dGhpcy50eXBlcz1udWxsfWZ1bmN0aW9uIGkodCxlKXtyZXR1cm4gdC5uYW1lPGUubmFtZT8tMToxfWZ1bmN0aW9uIGEodCxlLHIsaSxhKXt2YXIgbz1uZXcgbih0KTtyZXR1cm4gby51cGRhdGUoZSxyLGksYSksb312YXIgbz10KCIuL2xpYi9jcmVhdGUtdW5pZm9ybXMiKSxzPXQoIi4vbGliL2NyZWF0ZS1hdHRyaWJ1dGVzIiksbD10KCIuL2xpYi9yZWZsZWN0IiksdT10KCIuL2xpYi9zaGFkZXItY2FjaGUiKSxjPXQoIi4vbGliL3J1bnRpbWUtcmVmbGVjdCIpLGg9dCgiLi9saWIvR0xFcnJvciIpLGY9bi5wcm90b3R5cGU7Zi5iaW5kPWZ1bmN0aW9uKCl7dGhpcy5wcm9ncmFtfHx0aGlzLl9yZWxpbmsoKSx0aGlzLmdsLnVzZVByb2dyYW0odGhpcy5wcm9ncmFtKX0sZi5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5fZnJlZiYmdGhpcy5fZnJlZi5kaXNwb3NlKCksdGhpcy5fdnJlZiYmdGhpcy5fdnJlZi5kaXNwb3NlKCksdGhpcy5hdHRyaWJ1dGVzPXRoaXMudHlwZXM9dGhpcy52ZXJ0U2hhZGVyPXRoaXMuZnJhZ1NoYWRlcj10aGlzLnByb2dyYW09dGhpcy5fcmVsaW5rPXRoaXMuX2ZyZWY9dGhpcy5fdnJlZj1udWxsfSxmLnVwZGF0ZT1mdW5jdGlvbih0LGUscixuKXtmdW5jdGlvbiBhKCl7ZC5wcm9ncmFtPXUucHJvZ3JhbShwLGQuX3ZyZWYsZC5fZnJlZixiLF8pO2Zvcih2YXIgdD0wO3Q8ci5sZW5ndGg7Kyt0KVNbdF09cC5nZXRVbmlmb3JtTG9jYXRpb24oZC5wcm9ncmFtLHJbdF0ubmFtZSl9aWYoIWV8fDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZj10O3Q9Zi52ZXJ0ZXgsZT1mLmZyYWdtZW50LHI9Zi51bmlmb3JtcyxuPWYuYXR0cmlidXRlc312YXIgZD10aGlzLHA9ZC5nbCxnPWQuX3ZyZWY7ZC5fdnJlZj11LnNoYWRlcihwLHAuVkVSVEVYX1NIQURFUix0KSxnJiZnLmRpc3Bvc2UoKSxkLnZlcnRTaGFkZXI9ZC5fdnJlZi5zaGFkZXI7dmFyIG09dGhpcy5fZnJlZjtpZihkLl9mcmVmPXUuc2hhZGVyKHAscC5GUkFHTUVOVF9TSEFERVIsZSksbSYmbS5kaXNwb3NlKCksZC5mcmFnU2hhZGVyPWQuX2ZyZWYuc2hhZGVyLCFyfHwhbil7dmFyIHY9cC5jcmVhdGVQcm9ncmFtKCk7aWYocC5hdHRhY2hTaGFkZXIodixkLmZyYWdTaGFkZXIpLHAuYXR0YWNoU2hhZGVyKHYsZC52ZXJ0U2hhZGVyKSxwLmxpbmtQcm9ncmFtKHYpLCFwLmdldFByb2dyYW1QYXJhbWV0ZXIodixwLkxJTktfU1RBVFVTKSl7dmFyIHk9cC5nZXRQcm9ncmFtSW5mb0xvZyh2KTt0aHJvdyBuZXcgaCh5LCJFcnJvciBsaW5raW5nIHByb2dyYW06Iit5KX1yPXJ8fGMudW5pZm9ybXMocCx2KSxuPW58fGMuYXR0cmlidXRlcyhwLHYpLHAuZGVsZXRlUHJvZ3JhbSh2KX1uPW4uc2xpY2UoKSxuLnNvcnQoaSk7Zm9yKHZhciB4PVtdLGI9W10sXz1bXSx3PTA7dzxuLmxlbmd0aDsrK3cpe3ZhciBNPW5bd107aWYoTS50eXBlLmluZGV4T2YoIm1hdCIpPj0wKXtmb3IodmFyIEE9MHxNLnR5cGUuY2hhckF0KE0udHlwZS5sZW5ndGgtMSksaz1uZXcgQXJyYXkoQSksVD0wO1Q8QTsrK1Qpa1tUXT1fLmxlbmd0aCxiLnB1c2goTS5uYW1lKyJbIitUKyJdIiksIm51bWJlciI9PXR5cGVvZiBNLmxvY2F0aW9uP18ucHVzaChNLmxvY2F0aW9uK1QpOkFycmF5LmlzQXJyYXkoTS5sb2NhdGlvbikmJk0ubG9jYXRpb24ubGVuZ3RoPT09QSYmIm51bWJlciI9PXR5cGVvZiBNLmxvY2F0aW9uW1RdP18ucHVzaCgwfE0ubG9jYXRpb25bVF0pOl8ucHVzaCgtMSk7eC5wdXNoKHtuYW1lOk0ubmFtZSx0eXBlOk0udHlwZSxsb2NhdGlvbnM6a30pfWVsc2UgeC5wdXNoKHtuYW1lOk0ubmFtZSx0eXBlOk0udHlwZSxsb2NhdGlvbnM6W18ubGVuZ3RoXX0pLGIucHVzaChNLm5hbWUpLCJudW1iZXIiPT10eXBlb2YgTS5sb2NhdGlvbj9fLnB1c2goMHxNLmxvY2F0aW9uKTpfLnB1c2goLTEpfWZvcih2YXIgRT0wLHc9MDt3PF8ubGVuZ3RoOysrdylpZihfW3ddPDApe2Zvcig7Xy5pbmRleE9mKEUpPj0wOylFKz0xO19bd109RX12YXIgUz1uZXcgQXJyYXkoci5sZW5ndGgpO2EoKSxkLl9yZWxpbms9YSxkLnR5cGVzPXt1bmlmb3JtczpsKHIpLGF0dHJpYnV0ZXM6bChuKX0sZC5hdHRyaWJ1dGVzPXMocCxkLHgsXyksT2JqZWN0LmRlZmluZVByb3BlcnR5KGQsInVuaWZvcm1zIixvKHAsZCxyLFMpKX0sZS5leHBvcnRzPWF9LHsiLi9saWIvR0xFcnJvciI6MjIxLCIuL2xpYi9jcmVhdGUtYXR0cmlidXRlcyI6MjIyLCIuL2xpYi9jcmVhdGUtdW5pZm9ybXMiOjIyMywiLi9saWIvcmVmbGVjdCI6MjI0LCIuL2xpYi9ydW50aW1lLXJlZmxlY3QiOjIyNSwiLi9saWIvc2hhZGVyLWNhY2hlIjoyMjZ9XSwyMjE6W2Z1bmN0aW9uKHQsZSxyKXthcmd1bWVudHNbNF1bMTgxXVswXS5hcHBseShyLGFyZ3VtZW50cyl9LHtkdXA6MTgxfV0sMjIyOltmdW5jdGlvbih0LGUscil7YXJndW1lbnRzWzRdWzE4Ml1bMF0uYXBwbHkocixhcmd1bWVudHMpfSx7Ii4vR0xFcnJvciI6MjIxLGR1cDoxODJ9XSwyMjM6W2Z1bmN0aW9uKHQsZSxyKXthcmd1bWVudHNbNF1bMTgzXVswXS5hcHBseShyLGFyZ3VtZW50cyl9LHsiLi9HTEVycm9yIjoyMjEsIi4vcmVmbGVjdCI6MjI0LGR1cDoxODN9XSwyMjQ6W2Z1bmN0aW9uKHQsZSxyKXthcmd1bWVudHNbNF1bMTg0XVswXS5hcHBseShyLGFyZ3VtZW50cyl9LHtkdXA6MTg0fV0sMjI1OltmdW5jdGlvbih0LGUscil7YXJndW1lbnRzWzRdWzE4NV1bMF0uYXBwbHkocixhcmd1bWVudHMpfSx7ZHVwOjE4NX1dLDIyNjpbZnVuY3Rpb24odCxlLHIpe2FyZ3VtZW50c1s0XVsxODZdWzBdLmFwcGx5KHIsYXJndW1lbnRzKX0seyIuL0dMRXJyb3IiOjIyMSxkdXA6MTg2LCJnbC1mb3JtYXQtY29tcGlsZXItZXJyb3IiOjEzNiwid2Vha21hcC1zaGltIjo1MTd9XSwyMjc6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt0aGlzLnBsb3Q9dCx0aGlzLmVuYWJsZT1bITAsITAsITEsITFdLHRoaXMud2lkdGg9WzEsMSwxLDFdLHRoaXMuY29sb3I9W1swLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXV0sdGhpcy5jZW50ZXI9WzEvMCwxLzBdfWZ1bmN0aW9uIGkodCxlKXt2YXIgcj1uZXcgbih0KTtyZXR1cm4gci51cGRhdGUoZSksdC5hZGRPdmVybGF5KHIpLHJ9ZS5leHBvcnRzPWk7dmFyIGE9bi5wcm90b3R5cGU7YS51cGRhdGU9ZnVuY3Rpb24odCl7dD10fHx7fSx0aGlzLmVuYWJsZT0odC5lbmFibGV8fFshMCwhMCwhMSwhMV0pLnNsaWNlKCksdGhpcy53aWR0aD0odC53aWR0aHx8WzEsMSwxLDFdKS5zbGljZSgpLHRoaXMuY29sb3I9KHQuY29sb3J8fFtbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXSxbMCwwLDAsMV1dKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQuc2xpY2UoKX0pLHRoaXMuY2VudGVyPSh0LmNlbnRlcnx8WzEvMCwxLzBdKS5zbGljZSgpLHRoaXMucGxvdC5zZXRPdmVybGF5RGlydHkoKX0sYS5kcmF3PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lbmFibGUsZT10aGlzLndpZHRoLHI9dGhpcy5jb2xvcixuPXRoaXMuY2VudGVyLGk9dGhpcy5wbG90LGE9aS5saW5lLG89aS5kYXRhQm94LHM9aS52aWV3Qm94O2lmKGEuYmluZCgpLG9bMF08PW5bMF0mJm5bMF08PW9bMl0mJm9bMV08PW5bMV0mJm5bMV08PW9bM10pe3ZhciBsPXNbMF0rKG5bMF0tb1swXSkvKG9bMl0tb1swXSkqKHNbMl0tc1swXSksdT1zWzFdKyhuWzFdLW9bMV0pLyhvWzNdLW9bMV0pKihzWzNdLXNbMV0pO3RbMF0mJmEuZHJhd0xpbmUobCx1LHNbMF0sdSxlWzBdLHJbMF0pLHRbMV0mJmEuZHJhd0xpbmUobCx1LGwsc1sxXSxlWzFdLHJbMV0pLHRbMl0mJmEuZHJhd0xpbmUobCx1LHNbMl0sdSxlWzJdLHJbMl0pLHRbM10mJmEuZHJhd0xpbmUobCx1LGwsc1szXSxlWzNdLHJbM10pfX0sYS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5wbG90LnJlbW92ZU92ZXJsYXkodGhpcyl9fSx7fV0sMjI4OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoImdsLXNoYWRlciIpLGk9InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxuYXR0cmlidXRlIHZlYzMgcG9zaXRpb24sIGNvbG9yO1xuYXR0cmlidXRlIGZsb2F0IHdlaWdodDtcblxudW5pZm9ybSBtYXQ0IG1vZGVsLCB2aWV3LCBwcm9qZWN0aW9uO1xudW5pZm9ybSB2ZWMzIGNvb3JkaW5hdGVzWzNdO1xudW5pZm9ybSB2ZWM0IGNvbG9yc1szXTtcbnVuaWZvcm0gdmVjMiBzY3JlZW5TaGFwZTtcbnVuaWZvcm0gZmxvYXQgbGluZVdpZHRoO1xuXG52YXJ5aW5nIHZlYzQgZnJhZ0NvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gIHZlYzMgdmVydGV4UG9zaXRpb24gPSBtaXgoY29vcmRpbmF0ZXNbMF0sXG4gICAgbWl4KGNvb3JkaW5hdGVzWzJdLCBjb29yZGluYXRlc1sxXSwgMC41ICogKHBvc2l0aW9uICsgMS4wKSksIGFicyhwb3NpdGlvbikpO1xuXG4gIHZlYzQgY2xpcFBvcyA9IHByb2plY3Rpb24gKiB2aWV3ICogbW9kZWwgKiB2ZWM0KHZlcnRleFBvc2l0aW9uLCAxLjApO1xuICB2ZWMyIGNsaXBPZmZzZXQgPSAocHJvamVjdGlvbiAqIHZpZXcgKiBtb2RlbCAqIHZlYzQoY29sb3IsIDAuMCkpLnh5O1xuICB2ZWMyIGRlbHRhID0gd2VpZ2h0ICogY2xpcE9mZnNldCAqIHNjcmVlblNoYXBlO1xuICB2ZWMyIGxpbmVPZmZzZXQgPSBub3JtYWxpemUodmVjMihkZWx0YS55LCAtZGVsdGEueCkpIC8gc2NyZWVuU2hhcGU7XG5cbiAgZ2xfUG9zaXRpb24gICA9IHZlYzQoY2xpcFBvcy54eSArIGNsaXBQb3MudyAqIDAuNSAqIGxpbmVXaWR0aCAqIGxpbmVPZmZzZXQsIGNsaXBQb3MueiwgY2xpcFBvcy53KTtcbiAgZnJhZ0NvbG9yICAgICA9IGNvbG9yLnggKiBjb2xvcnNbMF0gKyBjb2xvci55ICogY29sb3JzWzFdICsgY29sb3IueiAqIGNvbG9yc1syXTtcbn1cbiIsYT0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG52YXJ5aW5nIHZlYzQgZnJhZ0NvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gIGdsX0ZyYWdDb2xvciA9IGZyYWdDb2xvcjtcbn0iO2UuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbih0LGksYSxudWxsLFt7bmFtZToicG9zaXRpb24iLHR5cGU6InZlYzMifSx7bmFtZToiY29sb3IiLHR5cGU6InZlYzMifSx7bmFtZToid2VpZ2h0Iix0eXBlOiJmbG9hdCJ9XSl9fSx7ImdsLXNoYWRlciI6MjIwfV0sMjI5OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbil7dGhpcy5nbD10LHRoaXMuYnVmZmVyPWUsdGhpcy52YW89cix0aGlzLnNoYWRlcj1uLHRoaXMucGl4ZWxSYXRpbz0xLHRoaXMuYm91bmRzPVtbLTFlMywtMWUzLC0xZTNdLFsxZTMsMWUzLDFlM11dLHRoaXMucG9zaXRpb249WzAsMCwwXSx0aGlzLmxpbmVXaWR0aD1bMiwyLDJdLHRoaXMuY29sb3JzPVtbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXV0sdGhpcy5lbmFibGVkPVshMCwhMCwhMF0sdGhpcy5kcmF3U2lkZXM9WyEwLCEwLCEwXSx0aGlzLmF4ZXM9bnVsbH1mdW5jdGlvbiBpKHQsZSl7ZnVuY3Rpb24gcih0LGUscixuLGEsbyl7dmFyIHM9W3QsZSxyLDAsMCwwLDFdO3NbbiszXT0xLHNbbl09YSxpLnB1c2guYXBwbHkoaSxzKSxzWzZdPS0xLGkucHVzaC5hcHBseShpLHMpLHNbbl09byxpLnB1c2guYXBwbHkoaSxzKSxpLnB1c2guYXBwbHkoaSxzKSxzWzZdPTEsaS5wdXNoLmFwcGx5KGkscyksc1tuXT1hLGkucHVzaC5hcHBseShpLHMpfXZhciBpPVtdO3IoMCwwLDAsMCwwLDEpLHIoMCwwLDAsMSwwLDEpLHIoMCwwLDAsMiwwLDEpLHIoMSwwLDAsMSwtMSwxKSxyKDEsMCwwLDIsLTEsMSkscigwLDEsMCwwLC0xLDEpLHIoMCwxLDAsMiwtMSwxKSxyKDAsMCwxLDAsLTEsMSkscigwLDAsMSwxLC0xLDEpO3ZhciBsPWEodCxpKSx1PW8odCxbe3R5cGU6dC5GTE9BVCxidWZmZXI6bCxzaXplOjMsb2Zmc2V0OjAsc3RyaWRlOjI4fSx7dHlwZTp0LkZMT0FULGJ1ZmZlcjpsLHNpemU6MyxvZmZzZXQ6MTIsc3RyaWRlOjI4fSx7dHlwZTp0LkZMT0FULGJ1ZmZlcjpsLHNpemU6MSxvZmZzZXQ6MjQsc3RyaWRlOjI4fV0pLGM9cyh0KTtjLmF0dHJpYnV0ZXMucG9zaXRpb24ubG9jYXRpb249MCxjLmF0dHJpYnV0ZXMuY29sb3IubG9jYXRpb249MSxjLmF0dHJpYnV0ZXMud2VpZ2h0LmxvY2F0aW9uPTI7dmFyIGg9bmV3IG4odCxsLHUsYyk7cmV0dXJuIGgudXBkYXRlKGUpLGh9dmFyIGE9dCgiZ2wtYnVmZmVyIiksbz10KCJnbC12YW8iKSxzPXQoIi4vc2hhZGVycy9pbmRleCIpO2UuZXhwb3J0cz1pO3ZhciBsPVsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXSx1PW4ucHJvdG90eXBlLGM9WzAsMCwwXSxoPVswLDAsMF0sZj1bMCwwXTt1LmlzVHJhbnNwYXJlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdS5kcmF3VHJhbnNwYXJlbnQ9ZnVuY3Rpb24odCl7fSx1LmRyYXc9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nbCxyPXRoaXMudmFvLG49dGhpcy5zaGFkZXI7ci5iaW5kKCksbi5iaW5kKCk7dmFyIGksYT10Lm1vZGVsfHxsLG89dC52aWV3fHxsLHM9dC5wcm9qZWN0aW9ufHxsO3RoaXMuYXhlcyYmKGk9dGhpcy5heGVzLmxhc3RDdWJlUHJvcHMuYXhpcyk7Zm9yKHZhciB1PWMsZD1oLHA9MDtwPDM7KytwKWkmJmlbcF08MD8odVtwXT10aGlzLmJvdW5kc1swXVtwXSxkW3BdPXRoaXMuYm91bmRzWzFdW3BdKToodVtwXT10aGlzLmJvdW5kc1sxXVtwXSxkW3BdPXRoaXMuYm91bmRzWzBdW3BdKTtmWzBdPWUuZHJhd2luZ0J1ZmZlcldpZHRoLGZbMV09ZS5kcmF3aW5nQnVmZmVySGVpZ2h0LG4udW5pZm9ybXMubW9kZWw9YSxuLnVuaWZvcm1zLnZpZXc9bywKbi51bmlmb3Jtcy5wcm9qZWN0aW9uPXMsbi51bmlmb3Jtcy5jb29yZGluYXRlcz1bdGhpcy5wb3NpdGlvbix1LGRdLG4udW5pZm9ybXMuY29sb3JzPXRoaXMuY29sb3JzLG4udW5pZm9ybXMuc2NyZWVuU2hhcGU9Zjtmb3IodmFyIHA9MDtwPDM7KytwKW4udW5pZm9ybXMubGluZVdpZHRoPXRoaXMubGluZVdpZHRoW3BdKnRoaXMucGl4ZWxSYXRpbyx0aGlzLmVuYWJsZWRbcF0mJihyLmRyYXcoZS5UUklBTkdMRVMsNiw2KnApLHRoaXMuZHJhd1NpZGVzW3BdJiZyLmRyYXcoZS5UUklBTkdMRVMsMTIsMTgrMTIqcCkpO3IudW5iaW5kKCl9LHUudXBkYXRlPWZ1bmN0aW9uKHQpe3QmJigiYm91bmRzImluIHQmJih0aGlzLmJvdW5kcz10LmJvdW5kcyksInBvc2l0aW9uImluIHQmJih0aGlzLnBvc2l0aW9uPXQucG9zaXRpb24pLCJsaW5lV2lkdGgiaW4gdCYmKHRoaXMubGluZVdpZHRoPXQubGluZVdpZHRoKSwiY29sb3JzImluIHQmJih0aGlzLmNvbG9ycz10LmNvbG9ycyksImVuYWJsZWQiaW4gdCYmKHRoaXMuZW5hYmxlZD10LmVuYWJsZWQpLCJkcmF3U2lkZXMiaW4gdCYmKHRoaXMuZHJhd1NpZGVzPXQuZHJhd1NpZGVzKSl9LHUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMudmFvLmRpc3Bvc2UoKSx0aGlzLmJ1ZmZlci5kaXNwb3NlKCksdGhpcy5zaGFkZXIuZGlzcG9zZSgpfX0seyIuL3NoYWRlcnMvaW5kZXgiOjIyOCwiZ2wtYnVmZmVyIjoxMjgsImdsLXZhbyI6MjM2fV0sMjMwOltmdW5jdGlvbih0LGUscil7dmFyIG49dCgiZ2wtc2hhZGVyIiksaT0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG5hdHRyaWJ1dGUgdmVjNCB1djtcbmF0dHJpYnV0ZSB2ZWMzIGY7XG5hdHRyaWJ1dGUgdmVjMyBub3JtYWw7XG5cbnVuaWZvcm0gbWF0NCBtb2RlbCwgdmlldywgcHJvamVjdGlvbiwgaW52ZXJzZU1vZGVsO1xudW5pZm9ybSB2ZWMzIGxpZ2h0UG9zaXRpb24sIGV5ZVBvc2l0aW9uO1xudW5pZm9ybSBzYW1wbGVyMkQgY29sb3JtYXA7XG5cbnZhcnlpbmcgZmxvYXQgdmFsdWUsIGtpbGw7XG52YXJ5aW5nIHZlYzMgd29ybGRDb29yZGluYXRlO1xudmFyeWluZyB2ZWMyIHBsYW5lQ29vcmRpbmF0ZTtcbnZhcnlpbmcgdmVjMyBsaWdodERpcmVjdGlvbiwgZXllRGlyZWN0aW9uLCBzdXJmYWNlTm9ybWFsO1xudmFyeWluZyB2ZWM0IHZDb2xvcjtcblxudm9pZCBtYWluKCkge1xuICB3b3JsZENvb3JkaW5hdGUgPSB2ZWMzKHV2Lnp3LCBmLngpO1xuICB2ZWM0IHdvcmxkUG9zaXRpb24gPSBtb2RlbCAqIHZlYzQod29ybGRDb29yZGluYXRlLCAxLjApO1xuICB2ZWM0IGNsaXBQb3NpdGlvbiA9IHByb2plY3Rpb24gKiB2aWV3ICogd29ybGRQb3NpdGlvbjtcbiAgZ2xfUG9zaXRpb24gPSBjbGlwUG9zaXRpb247XG4gIGtpbGwgPSBmLnk7XG4gIHZhbHVlID0gZi56O1xuICBwbGFuZUNvb3JkaW5hdGUgPSB1di54eTtcblxuICB2Q29sb3IgPSB0ZXh0dXJlMkQoY29sb3JtYXAsIHZlYzIodmFsdWUsIHZhbHVlKSk7XG5cbiAgLy9MaWdodGluZyBnZW9tZXRyeSBwYXJhbWV0ZXJzXG4gIHZlYzQgY2FtZXJhQ29vcmRpbmF0ZSA9IHZpZXcgKiB3b3JsZFBvc2l0aW9uO1xuICBjYW1lcmFDb29yZGluYXRlLnh5eiAvPSBjYW1lcmFDb29yZGluYXRlLnc7XG4gIGxpZ2h0RGlyZWN0aW9uID0gbGlnaHRQb3NpdGlvbiAtIGNhbWVyYUNvb3JkaW5hdGUueHl6O1xuICBleWVEaXJlY3Rpb24gICA9IGV5ZVBvc2l0aW9uIC0gY2FtZXJhQ29vcmRpbmF0ZS54eXo7XG4gIHN1cmZhY2VOb3JtYWwgID0gbm9ybWFsaXplKCh2ZWM0KG5vcm1hbCwwKSAqIGludmVyc2VNb2RlbCkueHl6KTtcbn1cbiIsYT0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG5mbG9hdCBiZWNrbWFubkRpc3RyaWJ1dGlvbl8yXzAoZmxvYXQgeCwgZmxvYXQgcm91Z2huZXNzKSB7XG4gIGZsb2F0IE5kb3RIID0gbWF4KHgsIDAuMDAwMSk7XG4gIGZsb2F0IGNvczJBbHBoYSA9IE5kb3RIICogTmRvdEg7XG4gIGZsb2F0IHRhbjJBbHBoYSA9IChjb3MyQWxwaGEgLSAxLjApIC8gY29zMkFscGhhO1xuICBmbG9hdCByb3VnaG5lc3MyID0gcm91Z2huZXNzICogcm91Z2huZXNzO1xuICBmbG9hdCBkZW5vbSA9IDMuMTQxNTkyNjUzNTg5NzkzICogcm91Z2huZXNzMiAqIGNvczJBbHBoYSAqIGNvczJBbHBoYTtcbiAgcmV0dXJuIGV4cCh0YW4yQWxwaGEgLyByb3VnaG5lc3MyKSAvIGRlbm9tO1xufVxuXG5cblxuZmxvYXQgYmVja21hbm5TcGVjdWxhcl8xXzEoXG4gIHZlYzMgbGlnaHREaXJlY3Rpb24sXG4gIHZlYzMgdmlld0RpcmVjdGlvbixcbiAgdmVjMyBzdXJmYWNlTm9ybWFsLFxuICBmbG9hdCByb3VnaG5lc3MpIHtcbiAgcmV0dXJuIGJlY2ttYW5uRGlzdHJpYnV0aW9uXzJfMChkb3Qoc3VyZmFjZU5vcm1hbCwgbm9ybWFsaXplKGxpZ2h0RGlyZWN0aW9uICsgdmlld0RpcmVjdGlvbikpLCByb3VnaG5lc3MpO1xufVxuXG5cblxudW5pZm9ybSB2ZWMzIGxvd2VyQm91bmQsIHVwcGVyQm91bmQ7XG51bmlmb3JtIGZsb2F0IGNvbnRvdXJUaW50O1xudW5pZm9ybSB2ZWM0IGNvbnRvdXJDb2xvcjtcbnVuaWZvcm0gc2FtcGxlcjJEIGNvbG9ybWFwO1xudW5pZm9ybSB2ZWMzIGNsaXBCb3VuZHNbMl07XG51bmlmb3JtIGZsb2F0IHJvdWdobmVzcywgZnJlc25lbCwga2FtYmllbnQsIGtkaWZmdXNlLCBrc3BlY3VsYXIsIG9wYWNpdHk7XG51bmlmb3JtIGZsb2F0IHZlcnRleENvbG9yO1xuXG52YXJ5aW5nIGZsb2F0IHZhbHVlLCBraWxsO1xudmFyeWluZyB2ZWMzIHdvcmxkQ29vcmRpbmF0ZTtcbnZhcnlpbmcgdmVjMyBsaWdodERpcmVjdGlvbiwgZXllRGlyZWN0aW9uLCBzdXJmYWNlTm9ybWFsO1xudmFyeWluZyB2ZWM0IHZDb2xvcjtcblxudm9pZCBtYWluKCkge1xuICBpZiAoa2lsbCA+IDAuMCB8fFxuICAgIGFueShsZXNzVGhhbih3b3JsZENvb3JkaW5hdGUsIGNsaXBCb3VuZHNbMF0pKSB8fCBhbnkoZ3JlYXRlclRoYW4od29ybGRDb29yZGluYXRlLCBjbGlwQm91bmRzWzFdKSkpIHtcbiAgICBkaXNjYXJkO1xuICB9XG5cbiAgdmVjMyBOID0gbm9ybWFsaXplKHN1cmZhY2VOb3JtYWwpO1xuICB2ZWMzIFYgPSBub3JtYWxpemUoZXllRGlyZWN0aW9uKTtcbiAgdmVjMyBMID0gbm9ybWFsaXplKGxpZ2h0RGlyZWN0aW9uKTtcblxuICBpZihnbF9Gcm9udEZhY2luZykge1xuICAgIE4gPSAtTjtcbiAgfVxuXG4gIGZsb2F0IHNwZWN1bGFyID0gYmVja21hbm5TcGVjdWxhcl8xXzEoTCwgViwgTiwgcm91Z2huZXNzKTtcbiAgZmxvYXQgZGlmZnVzZSAgPSBtaW4oa2FtYmllbnQgKyBrZGlmZnVzZSAqIG1heChkb3QoTiwgTCksIDAuMCksIDEuMCk7XG5cbiAgLy9kZWNpZGUgaG93IHRvIGludGVycG9sYXRlIGNvbG9yIFx1MjAxNCBpbiB2ZXJ0ZXggb3IgaW4gZnJhZ21lbnRcbiAgdmVjNCBzdXJmYWNlQ29sb3IgPSBzdGVwKHZlcnRleENvbG9yLCAuNSkgKiB0ZXh0dXJlMkQoY29sb3JtYXAsIHZlYzIodmFsdWUsIHZhbHVlKSkgKyBzdGVwKC41LCB2ZXJ0ZXhDb2xvcikgKiB2Q29sb3I7XG5cbiAgdmVjNCBsaXRDb2xvciA9IHN1cmZhY2VDb2xvci5hICogdmVjNChkaWZmdXNlICogc3VyZmFjZUNvbG9yLnJnYiArIGtzcGVjdWxhciAqIHZlYzMoMSwxLDEpICogc3BlY3VsYXIsICAxLjApO1xuXG4gIGdsX0ZyYWdDb2xvciA9IG1peChsaXRDb2xvciwgY29udG91ckNvbG9yLCBjb250b3VyVGludCkgKiBvcGFjaXR5O1xufVxuIixvPSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbmF0dHJpYnV0ZSB2ZWM0IHV2O1xuYXR0cmlidXRlIGZsb2F0IGY7XG5cbnVuaWZvcm0gbWF0MyBwZXJtdXRhdGlvbjtcbnVuaWZvcm0gbWF0NCBtb2RlbCwgdmlldywgcHJvamVjdGlvbjtcbnVuaWZvcm0gZmxvYXQgaGVpZ2h0LCB6T2Zmc2V0O1xudW5pZm9ybSBzYW1wbGVyMkQgY29sb3JtYXA7XG5cbnZhcnlpbmcgZmxvYXQgdmFsdWUsIGtpbGw7XG52YXJ5aW5nIHZlYzMgd29ybGRDb29yZGluYXRlO1xudmFyeWluZyB2ZWMyIHBsYW5lQ29vcmRpbmF0ZTtcbnZhcnlpbmcgdmVjMyBsaWdodERpcmVjdGlvbiwgZXllRGlyZWN0aW9uLCBzdXJmYWNlTm9ybWFsO1xudmFyeWluZyB2ZWM0IHZDb2xvcjtcblxudm9pZCBtYWluKCkge1xuICB2ZWMzIGRhdGFDb29yZGluYXRlID0gcGVybXV0YXRpb24gKiB2ZWMzKHV2Lnh5LCBoZWlnaHQpO1xuICB2ZWM0IHdvcmxkUG9zaXRpb24gPSBtb2RlbCAqIHZlYzQoZGF0YUNvb3JkaW5hdGUsIDEuMCk7XG5cbiAgdmVjNCBjbGlwUG9zaXRpb24gPSBwcm9qZWN0aW9uICogdmlldyAqIHdvcmxkUG9zaXRpb247XG4gIGNsaXBQb3NpdGlvbi56ID0gY2xpcFBvc2l0aW9uLnogKyB6T2Zmc2V0O1xuXG4gIGdsX1Bvc2l0aW9uID0gY2xpcFBvc2l0aW9uO1xuICB2YWx1ZSA9IGY7XG4gIGtpbGwgPSAtMS4wO1xuICB3b3JsZENvb3JkaW5hdGUgPSBkYXRhQ29vcmRpbmF0ZTtcbiAgcGxhbmVDb29yZGluYXRlID0gdXYuenc7XG5cbiAgdkNvbG9yID0gdGV4dHVyZTJEKGNvbG9ybWFwLCB2ZWMyKHZhbHVlLCB2YWx1ZSkpO1xuXG4gIC8vRG9uJ3QgZG8gbGlnaHRpbmcgZm9yIGNvbnRvdXJzXG4gIHN1cmZhY2VOb3JtYWwgICA9IHZlYzMoMSwwLDApO1xuICBleWVEaXJlY3Rpb24gICAgPSB2ZWMzKDAsMSwwKTtcbiAgbGlnaHREaXJlY3Rpb24gID0gdmVjMygwLDAsMSk7XG59XG4iLHM9InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxudW5pZm9ybSB2ZWMyIHNoYXBlO1xudW5pZm9ybSB2ZWMzIGNsaXBCb3VuZHNbMl07XG51bmlmb3JtIGZsb2F0IHBpY2tJZDtcblxudmFyeWluZyBmbG9hdCB2YWx1ZSwga2lsbDtcbnZhcnlpbmcgdmVjMyB3b3JsZENvb3JkaW5hdGU7XG52YXJ5aW5nIHZlYzIgcGxhbmVDb29yZGluYXRlO1xudmFyeWluZyB2ZWMzIHN1cmZhY2VOb3JtYWw7XG5cbnZlYzIgc3BsaXRGbG9hdChmbG9hdCB2KSB7XG4gIGZsb2F0IHZoID0gMjU1LjAgKiB2O1xuICBmbG9hdCB1cHBlciA9IGZsb29yKHZoKTtcbiAgZmxvYXQgbG93ZXIgPSBmcmFjdCh2aCk7XG4gIHJldHVybiB2ZWMyKHVwcGVyIC8gMjU1LjAsIGZsb29yKGxvd2VyICogMTYuMCkgLyAxNi4wKTtcbn1cblxudm9pZCBtYWluKCkge1xuICBpZihraWxsID4gMC4wIHx8XG4gICAgYW55KGxlc3NUaGFuKHdvcmxkQ29vcmRpbmF0ZSwgY2xpcEJvdW5kc1swXSkpIHx8IGFueShncmVhdGVyVGhhbih3b3JsZENvb3JkaW5hdGUsIGNsaXBCb3VuZHNbMV0pKSkge1xuICAgIGRpc2NhcmQ7XG4gIH1cbiAgdmVjMiB1eCA9IHNwbGl0RmxvYXQocGxhbmVDb29yZGluYXRlLnggLyBzaGFwZS54KTtcbiAgdmVjMiB1eSA9IHNwbGl0RmxvYXQocGxhbmVDb29yZGluYXRlLnkgLyBzaGFwZS55KTtcbiAgZ2xfRnJhZ0NvbG9yID0gdmVjNChwaWNrSWQsIHV4LngsIHV5LngsIHV4LnkgKyAodXkueS8xNi4wKSk7XG59XG4iO3IuY3JlYXRlU2hhZGVyPWZ1bmN0aW9uKHQpe3ZhciBlPW4odCxpLGEsbnVsbCxbe25hbWU6InV2Iix0eXBlOiJ2ZWM0In0se25hbWU6ImYiLHR5cGU6InZlYzMifSx7bmFtZToibm9ybWFsIix0eXBlOiJ2ZWMzIn1dKTtyZXR1cm4gZS5hdHRyaWJ1dGVzLnV2LmxvY2F0aW9uPTAsZS5hdHRyaWJ1dGVzLmYubG9jYXRpb249MSxlLmF0dHJpYnV0ZXMubm9ybWFsLmxvY2F0aW9uPTIsZX0sci5jcmVhdGVQaWNrU2hhZGVyPWZ1bmN0aW9uKHQpe3ZhciBlPW4odCxpLHMsbnVsbCxbe25hbWU6InV2Iix0eXBlOiJ2ZWM0In0se25hbWU6ImYiLHR5cGU6InZlYzMifSx7bmFtZToibm9ybWFsIix0eXBlOiJ2ZWMzIn1dKTtyZXR1cm4gZS5hdHRyaWJ1dGVzLnV2LmxvY2F0aW9uPTAsZS5hdHRyaWJ1dGVzLmYubG9jYXRpb249MSxlLmF0dHJpYnV0ZXMubm9ybWFsLmxvY2F0aW9uPTIsZX0sci5jcmVhdGVDb250b3VyU2hhZGVyPWZ1bmN0aW9uKHQpe3ZhciBlPW4odCxvLGEsbnVsbCxbe25hbWU6InV2Iix0eXBlOiJ2ZWM0In0se25hbWU6ImYiLHR5cGU6ImZsb2F0In1dKTtyZXR1cm4gZS5hdHRyaWJ1dGVzLnV2LmxvY2F0aW9uPTAsZS5hdHRyaWJ1dGVzLmYubG9jYXRpb249MSxlfSxyLmNyZWF0ZVBpY2tDb250b3VyU2hhZGVyPWZ1bmN0aW9uKHQpe3ZhciBlPW4odCxvLHMsbnVsbCxbe25hbWU6InV2Iix0eXBlOiJ2ZWM0In0se25hbWU6ImYiLHR5cGU6ImZsb2F0In1dKTtyZXR1cm4gZS5hdHRyaWJ1dGVzLnV2LmxvY2F0aW9uPTAsZS5hdHRyaWJ1dGVzLmYubG9jYXRpb249MSxlfX0seyJnbC1zaGFkZXIiOjIyMH1dLDIzMTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyLG4saSl7dGhpcy5wb3NpdGlvbj10LHRoaXMuaW5kZXg9ZSx0aGlzLnV2PXIsdGhpcy5sZXZlbD1uLHRoaXMuZGF0YUNvb3JkaW5hdGU9aX1mdW5jdGlvbiBpKHQpe3ZhciBlPWIoW3koe2NvbG9ybWFwOnQsbnNoYWRlczpPLGZvcm1hdDoicmdiYSJ9KS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuW3RbMF0sdFsxXSx0WzJdLDI1NSp0WzNdXX0pXSk7cmV0dXJuIHguZGl2c2VxKGUsMjU1KSxlfWZ1bmN0aW9uIGEodCxlLHIsaSxhLG8scyxsLHUsYyxoLGYsZCxwKXt0aGlzLmdsPXQsdGhpcy5zaGFwZT1lLHRoaXMuYm91bmRzPXIsdGhpcy5pbnRlbnNpdHlCb3VuZHM9W10sdGhpcy5fc2hhZGVyPWksdGhpcy5fcGlja1NoYWRlcj1hLHRoaXMuX2Nvb3JkaW5hdGVCdWZmZXI9byx0aGlzLl92YW89cyx0aGlzLl9jb2xvck1hcD1sLHRoaXMuX2NvbnRvdXJTaGFkZXI9dSx0aGlzLl9jb250b3VyUGlja1NoYWRlcj1jLHRoaXMuX2NvbnRvdXJCdWZmZXI9aCx0aGlzLl9jb250b3VyVkFPPWYsdGhpcy5fY29udG91ck9mZnNldHM9W1tdLFtdLFtdXSx0aGlzLl9jb250b3VyQ291bnRzPVtbXSxbXSxbXV0sdGhpcy5fdmVydGV4Q291bnQ9MCx0aGlzLl9waWNrUmVzdWx0PW5ldyBuKFswLDAsMF0sWzAsMF0sWzAsMF0sWzAsMCwwXSxbMCwwLDBdKSx0aGlzLl9keW5hbWljQnVmZmVyPWQsdGhpcy5fZHluYW1pY1ZBTz1wLHRoaXMuX2R5bmFtaWNPZmZzZXRzPVswLDAsMF0sdGhpcy5fZHluYW1pY0NvdW50cz1bMCwwLDBdLHRoaXMuY29udG91cldpZHRoPVsxLDEsMV0sdGhpcy5jb250b3VyTGV2ZWxzPVtbMV0sWzFdLFsxXV0sdGhpcy5jb250b3VyVGludD1bMCwwLDBdLHRoaXMuY29udG91ckNvbG9yPVtbLjUsLjUsLjUsMV0sWy41LC41LC41LDFdLFsuNSwuNSwuNSwxXV0sdGhpcy5zaG93Q29udG91cj0hMCx0aGlzLnNob3dTdXJmYWNlPSEwLHRoaXMuZW5hYmxlSGlnaGxpZ2h0PVshMCwhMCwhMF0sdGhpcy5oaWdobGlnaHRDb2xvcj1bWzAsMCwwLDFdLFswLDAsMCwxXSxbMCwwLDAsMV1dLHRoaXMuaGlnaGxpZ2h0VGludD1bMSwxLDFdLHRoaXMuaGlnaGxpZ2h0TGV2ZWw9Wy0xLC0xLC0xXSx0aGlzLmVuYWJsZUR5bmFtaWM9WyEwLCEwLCEwXSx0aGlzLmR5bmFtaWNMZXZlbD1bTmFOLE5hTixOYU5dLHRoaXMuZHluYW1pY0NvbG9yPVtbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXV0sdGhpcy5keW5hbWljVGludD1bMSwxLDFdLHRoaXMuZHluYW1pY1dpZHRoPVsxLDEsMV0sdGhpcy5heGVzQm91bmRzPVtbMS8wLDEvMCwxLzBdLFstKDEvMCksLSgxLzApLC0oMS8wKV1dLHRoaXMuc3VyZmFjZVByb2plY3Q9WyExLCExLCExXSx0aGlzLmNvbnRvdXJQcm9qZWN0PVtbITEsITEsITFdLFshMSwhMSwhMV0sWyExLCExLCExXV0sdGhpcy5jb2xvckJvdW5kcz1bITEsITFdLHRoaXMuX2ZpZWxkPVtfKHYubWFsbG9jRmxvYXQoMTAyNCksWzAsMF0pLF8odi5tYWxsb2NGbG9hdCgxMDI0KSxbMCwwXSksXyh2Lm1hbGxvY0Zsb2F0KDEwMjQpLFswLDBdKV0sdGhpcy5waWNrSWQ9MSx0aGlzLmNsaXBCb3VuZHM9W1stKDEvMCksLSgxLzApLC0oMS8wKV0sWzEvMCwxLzAsMS8wXV0sdGhpcy5zbmFwVG9EYXRhPSExLHRoaXMub3BhY2l0eT0xLHRoaXMubGlnaHRQb3NpdGlvbj1bMTAsMWU0LDBdLHRoaXMuYW1iaWVudExpZ2h0PS44LHRoaXMuZGlmZnVzZUxpZ2h0PS44LHRoaXMuc3BlY3VsYXJMaWdodD0yLHRoaXMucm91Z2huZXNzPS41LHRoaXMuZnJlc25lbD0xLjUsdGhpcy52ZXJ0ZXhDb2xvcj0wLHRoaXMuZGlydHk9ITB9ZnVuY3Rpb24gbyh0LGUpe3ZhciByLG4saSxhPWUuYXhlcyYmZS5heGVzLmxhc3RDdWJlUHJvcHMuYXhpc3x8aixvPWUuc2hvd1N1cmZhY2Uscz1lLnNob3dDb250b3VyO2ZvcihyPTA7cjwzOysrcilmb3Iobz1vfHxlLnN1cmZhY2VQcm9qZWN0W3JdLG49MDtuPDM7KytuKXM9c3x8ZS5jb250b3VyUHJvamVjdFtyXVtuXTtmb3Iocj0wO3I8MzsrK3Ipe3ZhciBsPU4ucHJvamVjdGlvbnNbcl07Zm9yKG49MDtuPDE2OysrbilsW25dPTA7Zm9yKG49MDtuPDQ7KytuKWxbNSpuXT0xO2xbNSpyXT0wLGxbMTIrcl09ZS5heGVzQm91bmRzWysoYVtyXT4wKV1bcl0sTShsLHQubW9kZWwsbCk7dmFyIHU9Ti5jbGlwQm91bmRzW3JdO2ZvcihpPTA7aTwyOysraSlmb3Iobj0wO248MzsrK24pdVtpXVtuXT10LmNsaXBCb3VuZHNbaV1bbl07dVswXVtyXT0tMWU4LHVbMV1bcl09MWU4fXJldHVybiBOLnNob3dTdXJmYWNlPW8sTi5zaG93Q29udG91cj1zLE59ZnVuY3Rpb24gcyh0LGUpe3Q9dHx8e307dmFyIHI9dGhpcy5nbDtyLmRpc2FibGUoci5DVUxMX0ZBQ0UpLHRoaXMuX2NvbG9yTWFwLmJpbmQoMCk7dmFyIG49QjtuLm1vZGVsPXQubW9kZWx8fFAsbi52aWV3PXQudmlld3x8UCxuLnByb2plY3Rpb249dC5wcm9qZWN0aW9ufHxQLG4ubG93ZXJCb3VuZD1bdGhpcy5ib3VuZHNbMF1bMF0sdGhpcy5ib3VuZHNbMF1bMV0sdGhpcy5jb2xvckJvdW5kc1swXXx8dGhpcy5ib3VuZHNbMF1bMl1dLG4udXBwZXJCb3VuZD1bdGhpcy5ib3VuZHNbMV1bMF0sdGhpcy5ib3VuZHNbMV1bMV0sdGhpcy5jb2xvckJvdW5kc1sxXXx8dGhpcy5ib3VuZHNbMV1bMl1dLG4uY29udG91ckNvbG9yPXRoaXMuY29udG91ckNvbG9yWzBdLG4uaW52ZXJzZU1vZGVsPUEobi5pbnZlcnNlTW9kZWwsbi5tb2RlbCk7Zm9yKHZhciBpPTA7aTwyOysraSlmb3IodmFyIGE9bi5jbGlwQm91bmRzW2ldLHM9MDtzPDM7KytzKWFbc109TWF0aC5taW4oTWF0aC5tYXgodGhpcy5jbGlwQm91bmRzW2ldW3NdLC0xZTgpLDFlOCk7bi5rYW1iaWVudD10aGlzLmFtYmllbnRMaWdodCxuLmtkaWZmdXNlPXRoaXMuZGlmZnVzZUxpZ2h0LG4ua3NwZWN1bGFyPXRoaXMuc3BlY3VsYXJMaWdodCxuLnJvdWdobmVzcz10aGlzLnJvdWdobmVzcyxuLmZyZXNuZWw9dGhpcy5mcmVzbmVsLG4ub3BhY2l0eT10aGlzLm9wYWNpdHksbi5oZWlnaHQ9MCxuLnBlcm11dGF0aW9uPVYsbi52ZXJ0ZXhDb2xvcj10aGlzLnZlcnRleENvbG9yO3ZhciBsPVU7Zm9yKE0obCxuLnZpZXcsbi5tb2RlbCksTShsLG4ucHJvamVjdGlvbixsKSxBKGwsbCksaT0wO2k8MzsrK2kpbi5leWVQb3NpdGlvbltpXT1sWzEyK2ldL2xbMTVdO3ZhciB1PWxbMTVdO2ZvcihpPTA7aTwzOysraSl1Kz10aGlzLmxpZ2h0UG9zaXRpb25baV0qbFs0KmkrM107Zm9yKGk9MDtpPDM7KytpKXt2YXIgYz1sWzEyK2ldO2ZvcihzPTA7czwzOysrcyljKz1sWzQqcytpXSp0aGlzLmxpZ2h0UG9zaXRpb25bc107bi5saWdodFBvc2l0aW9uW2ldPWMvdX12YXIgaD1vKG4sdGhpcyk7aWYoaC5zaG93U3VyZmFjZSYmZT09PXRoaXMub3BhY2l0eTwxKXtmb3IodGhpcy5fc2hhZGVyLmJpbmQoKSx0aGlzLl9zaGFkZXIudW5pZm9ybXM9bix0aGlzLl92YW8uYmluZCgpLHRoaXMuc2hvd1N1cmZhY2UmJnRoaXMuX3ZlcnRleENvdW50JiZ0aGlzLl92YW8uZHJhdyhyLlRSSUFOR0xFUyx0aGlzLl92ZXJ0ZXhDb3VudCksaT0wO2k8MzsrK2kpdGhpcy5zdXJmYWNlUHJvamVjdFtpXSYmdGhpcy52ZXJ0ZXhDb3VudCYmKHRoaXMuX3NoYWRlci51bmlmb3Jtcy5tb2RlbD1oLnByb2plY3Rpb25zW2ldLHRoaXMuX3NoYWRlci51bmlmb3Jtcy5jbGlwQm91bmRzPWguY2xpcEJvdW5kc1tpXSx0aGlzLl92YW8uZHJhdyhyLlRSSUFOR0xFUyx0aGlzLl92ZXJ0ZXhDb3VudCkpO3RoaXMuX3Zhby51bmJpbmQoKX1pZihoLnNob3dDb250b3VyJiYhZSl7dmFyIGY9dGhpcy5fY29udG91clNoYWRlcjtuLmthbWJpZW50PTEsbi5rZGlmZnVzZT0wLG4ua3NwZWN1bGFyPTAsbi5vcGFjaXR5PTEsZi5iaW5kKCksZi51bmlmb3Jtcz1uO3ZhciBkPXRoaXMuX2NvbnRvdXJWQU87Zm9yKGQuYmluZCgpLGk9MDtpPDM7KytpKWZvcihmLnVuaWZvcm1zLnBlcm11dGF0aW9uPVJbaV0sci5saW5lV2lkdGgodGhpcy5jb250b3VyV2lkdGhbaV0pLHM9MDtzPHRoaXMuY29udG91ckxldmVsc1tpXS5sZW5ndGg7KytzKXRoaXMuX2NvbnRvdXJDb3VudHNbaV1bc10mJihzPT09dGhpcy5oaWdobGlnaHRMZXZlbFtpXT8oZi51bmlmb3Jtcy5jb250b3VyQ29sb3I9dGhpcy5oaWdobGlnaHRDb2xvcltpXSxmLnVuaWZvcm1zLmNvbnRvdXJUaW50PXRoaXMuaGlnaGxpZ2h0VGludFtpXSk6MCE9PXMmJnMtMSE9PXRoaXMuaGlnaGxpZ2h0TGV2ZWxbaV18fChmLnVuaWZvcm1zLmNvbnRvdXJDb2xvcj10aGlzLmNvbnRvdXJDb2xvcltpXSxmLnVuaWZvcm1zLmNvbnRvdXJUaW50PXRoaXMuY29udG91clRpbnRbaV0pLGYudW5pZm9ybXMuaGVpZ2h0PXRoaXMuY29udG91ckxldmVsc1tpXVtzXSxkLmRyYXcoci5MSU5FUyx0aGlzLl9jb250b3VyQ291bnRzW2ldW3NdLHRoaXMuX2NvbnRvdXJPZmZzZXRzW2ldW3NdKSk7Zm9yKGk9MDtpPDM7KytpKWZvcihmLnVuaWZvcm1zLm1vZGVsPWgucHJvamVjdGlvbnNbaV0sZi51bmlmb3Jtcy5jbGlwQm91bmRzPWguY2xpcEJvdW5kc1tpXSxzPTA7czwzOysrcylpZih0aGlzLmNvbnRvdXJQcm9qZWN0W2ldW3NdKXtmLnVuaWZvcm1zLnBlcm11dGF0aW9uPVJbc10sci5saW5lV2lkdGgodGhpcy5jb250b3VyV2lkdGhbc10pO2Zvcih2YXIgcD0wO3A8dGhpcy5jb250b3VyTGV2ZWxzW3NdLmxlbmd0aDsrK3ApcD09PXRoaXMuaGlnaGxpZ2h0TGV2ZWxbc10/KGYudW5pZm9ybXMuY29udG91ckNvbG9yPXRoaXMuaGlnaGxpZ2h0Q29sb3Jbc10sZi51bmlmb3Jtcy5jb250b3VyVGludD10aGlzLmhpZ2hsaWdodFRpbnRbc10pOjAhPT1wJiZwLTEhPT10aGlzLmhpZ2hsaWdodExldmVsW3NdfHwoZi51bmlmb3Jtcy5jb250b3VyQ29sb3I9dGhpcy5jb250b3VyQ29sb3Jbc10sZi51bmlmb3Jtcy5jb250b3VyVGludD10aGlzLmNvbnRvdXJUaW50W3NdKSxmLnVuaWZvcm1zLmhlaWdodD10aGlzLmNvbnRvdXJMZXZlbHNbc11bcF0sZC5kcmF3KHIuTElORVMsdGhpcy5fY29udG91ckNvdW50c1tzXVtwXSx0aGlzLl9jb250b3VyT2Zmc2V0c1tzXVtwXSl9Zm9yKGQ9dGhpcy5fZHluYW1pY1ZBTyxkLmJpbmQoKSxpPTA7aTwzOysraSlpZigwIT09dGhpcy5fZHluYW1pY0NvdW50c1tpXSlmb3IoZi51bmlmb3Jtcy5tb2RlbD1uLm1vZGVsLGYudW5pZm9ybXMuY2xpcEJvdW5kcz1uLmNsaXBCb3VuZHMsZi51bmlmb3Jtcy5wZXJtdXRhdGlvbj1SW2ldLHIubGluZVdpZHRoKHRoaXMuZHluYW1pY1dpZHRoW2ldKSxmLnVuaWZvcm1zLmNvbnRvdXJDb2xvcj10aGlzLmR5bmFtaWNDb2xvcltpXSxmLnVuaWZvcm1zLmNvbnRvdXJUaW50PXRoaXMuZHluYW1pY1RpbnRbaV0sZi51bmlmb3Jtcy5oZWlnaHQ9dGhpcy5keW5hbWljTGV2ZWxbaV0sZC5kcmF3KHIuTElORVMsdGhpcy5fZHluYW1pY0NvdW50c1tpXSx0aGlzLl9keW5hbWljT2Zmc2V0c1tpXSkscz0wO3M8MzsrK3MpdGhpcy5jb250b3VyUHJvamVjdFtzXVtpXSYmKGYudW5pZm9ybXMubW9kZWw9aC5wcm9qZWN0aW9uc1tzXSxmLnVuaWZvcm1zLmNsaXBCb3VuZHM9aC5jbGlwQm91bmRzW3NdLGQuZHJhdyhyLkxJTkVTLHRoaXMuX2R5bmFtaWNDb3VudHNbaV0sdGhpcy5fZHluYW1pY09mZnNldHNbaV0pKTtkLnVuYmluZCgpfX1mdW5jdGlvbiBsKHQsZSl7dmFyIHI9ZS5zaGFwZS5zbGljZSgpLG49dC5zaGFwZS5zbGljZSgpO3guYXNzaWduKHQubG8oMSwxKS5oaShyWzBdLHJbMV0pLGUpLHguYXNzaWduKHQubG8oMSkuaGkoclswXSwxKSxlLmhpKHJbMF0sMSkpLHguYXNzaWduKHQubG8oMSxuWzFdLTEpLmhpKHJbMF0sMSksZS5sbygwLHJbMV0tMSkuaGkoclswXSwxKSkseC5hc3NpZ24odC5sbygwLDEpLmhpKDEsclsxXSksZS5oaSgxKSkseC5hc3NpZ24odC5sbyhuWzBdLTEsMSkuaGkoMSxyWzFdKSxlLmxvKHJbMF0tMSkpLHQuc2V0KDAsMCxlLmdldCgwLDApKSx0LnNldCgwLG5bMV0tMSxlLmdldCgwLHJbMV0tMSkpLHQuc2V0KG5bMF0tMSwwLGUuZ2V0KHJbMF0tMSwwKSksdC5zZXQoblswXS0xLG5bMV0tMSxlLmdldChyWzBdLTEsclsxXS0xKSl9ZnVuY3Rpb24gdSh0LGUpe3JldHVybiBBcnJheS5pc0FycmF5KHQpP1tlKHRbMF0pLGUodFsxXSksZSh0WzJdKV06W2UodCksZSh0KSxlKHQpXX1mdW5jdGlvbiBjKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpPzM9PT10Lmxlbmd0aD9bdFswXSx0WzFdLHRbMl0sMV06W3RbMF0sdFsxXSx0WzJdLHRbM11dOlswLDAsMCwxXX1mdW5jdGlvbiBoKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuW2ModFswXSksYyh0WzFdKSxjKHRbMl0pXTt2YXIgZT1jKHQpO3JldHVybltlLnNsaWNlKCksZS5zbGljZSgpLGUuc2xpY2UoKV19fWZ1bmN0aW9uIGYodCl7dmFyIGU9dC5nbCxyPVMoZSksbj16KGUpLGk9TChlKSxvPUMoZSkscz1wKGUpLGw9ZyhlLFt7YnVmZmVyOnMsc2l6ZTo0LHN0cmlkZTpJLG9mZnNldDowfSx7YnVmZmVyOnMsc2l6ZTozLHN0cmlkZTpJLG9mZnNldDoxNn0se2J1ZmZlcjpzLHNpemU6MyxzdHJpZGU6SSxvZmZzZXQ6Mjh9XSksdT1wKGUpLGM9ZyhlLFt7YnVmZmVyOnUsc2l6ZTo0LHN0cmlkZToyMCxvZmZzZXQ6MH0se2J1ZmZlcjp1LHNpemU6MSxzdHJpZGU6MjAsb2Zmc2V0OjE2fV0pLGg9cChlKSxmPWcoZSxbe2J1ZmZlcjpoLHNpemU6Mix0eXBlOmUuRkxPQVR9XSksZD1tKGUsMSxPLGUuUkdCQSxlLlVOU0lHTkVEX0JZVEUpO2QubWluRmlsdGVyPWUuTElORUFSLGQubWFnRmlsdGVyPWUuTElORUFSO3ZhciB2PW5ldyBhKGUsWzAsMF0sW1swLDAsMF0sWzAsMCwwXV0scixuLHMsbCxkLGksbyx1LGMsaCxmKSx5PXtsZXZlbHM6W1tdLFtdLFtdXX07Zm9yKHZhciB4IGluIHQpeVt4XT10W3hdO3JldHVybiB5LmNvbG9ybWFwPXkuY29sb3JtYXB8fCJqZXQiLHYudXBkYXRlKHkpLHZ9ZS5leHBvcnRzPWY7dmFyIGQ9dCgiYml0LXR3aWRkbGUiKSxwPXQoImdsLWJ1ZmZlciIpLGc9dCgiZ2wtdmFvIiksbT10KCJnbC10ZXh0dXJlMmQiKSx2PXQoInR5cGVkYXJyYXktcG9vbCIpLHk9dCgiY29sb3JtYXAiKSx4PXQoIm5kYXJyYXktb3BzIiksYj10KCJuZGFycmF5LXBhY2siKSxfPXQoIm5kYXJyYXkiKSx3PXQoInN1cmZhY2UtbmV0cyIpLE09dCgiZ2wtbWF0NC9tdWx0aXBseSIpLEE9dCgiZ2wtbWF0NC9pbnZlcnQiKSxrPXQoImJpbmFyeS1zZWFyY2gtYm91bmRzIiksVD10KCJuZGFycmF5LWdyYWRpZW50IiksRT10KCIuL2xpYi9zaGFkZXJzIiksUz1FLmNyZWF0ZVNoYWRlcixMPUUuY3JlYXRlQ29udG91clNoYWRlcix6PUUuY3JlYXRlUGlja1NoYWRlcixDPUUuY3JlYXRlUGlja0NvbnRvdXJTaGFkZXIsST00MCxQPVsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXSxEPVtbMCwwXSxbMCwxXSxbMSwwXSxbMSwxXSxbMSwwXSxbMCwxXV0sUj1bWzAsMCwwLDAsMCwwLDAsMCwwXSxbMCwwLDAsMCwwLDAsMCwwLDBdLFswLDAsMCwwLDAsMCwwLDAsMF1dOyFmdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8MzsrK3Qpe3ZhciBlPVJbdF0scj0odCsxKSUzLG49KHQrMiklMztlW3IrMF09MSxlW24rM109MSxlW3QrNl09MX19KCk7dmFyIE89MjU2LEY9YS5wcm90b3R5cGU7Ri5pc1RyYW5zcGFyZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3BhY2l0eTwxfSxGLmlzT3BhcXVlPWZ1bmN0aW9uKCl7aWYodGhpcy5vcGFjaXR5Pj0xKXJldHVybiEwO2Zvcih2YXIgdD0wO3Q8MzsrK3QpaWYodGhpcy5fY29udG91ckNvdW50c1t0XS5sZW5ndGg+MHx8dGhpcy5fZHluYW1pY0NvdW50c1t0XT4wKXJldHVybiEwO3JldHVybiExfSxGLnBpY2tTbG90cz0xLEYuc2V0UGlja0Jhc2U9ZnVuY3Rpb24odCl7dGhpcy5waWNrSWQ9dH07dmFyIGo9WzAsMCwwXSxOPXtzaG93U3VyZmFjZTohMSxzaG93Q29udG91cjohMSxwcm9qZWN0aW9uczpbUC5zbGljZSgpLFAuc2xpY2UoKSxQLnNsaWNlKCldLGNsaXBCb3VuZHM6W1tbMCwwLDBdLFswLDAsMF1dLFtbMCwwLDBdLFswLDAsMF1dLFtbMCwwLDBdLFswLDAsMF1dXX0sQj17bW9kZWw6UCx2aWV3OlAscHJvamVjdGlvbjpQLGludmVyc2VNb2RlbDpQLnNsaWNlKCksbG93ZXJCb3VuZDpbMCwwLDBdLHVwcGVyQm91bmQ6WzAsMCwwXSxjb2xvck1hcDowLGNsaXBCb3VuZHM6W1swLDAsMF0sWzAsMCwwXV0saGVpZ2h0OjAsY29udG91clRpbnQ6MCxjb250b3VyQ29sb3I6WzAsMCwwLDFdLHBlcm11dGF0aW9uOlsxLDAsMCwwLDEsMCwwLDAsMV0sek9mZnNldDotMWUtNCxrYW1iaWVudDoxLGtkaWZmdXNlOjEsa3NwZWN1bGFyOjEsbGlnaHRQb3NpdGlvbjpbMWUzLDFlMywxZTNdLGV5ZVBvc2l0aW9uOlswLDAsMF0scm91Z2huZXNzOjEsZnJlc25lbDoxLG9wYWNpdHk6MSx2ZXJ0ZXhDb2xvcjowfSxVPVAuc2xpY2UoKSxWPVsxLDAsMCwwLDEsMCwwLDAsMV07Ri5kcmF3PWZ1bmN0aW9uKHQpe3JldHVybiBzLmNhbGwodGhpcyx0LCExKX0sRi5kcmF3VHJhbnNwYXJlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHMuY2FsbCh0aGlzLHQsITApfTt2YXIgcT17bW9kZWw6UCx2aWV3OlAscHJvamVjdGlvbjpQLGludmVyc2VNb2RlbDpQLGNsaXBCb3VuZHM6W1swLDAsMF0sWzAsMCwwXV0saGVpZ2h0OjAsc2hhcGU6WzAsMF0scGlja0lkOjAsbG93ZXJCb3VuZDpbMCwwLDBdLHVwcGVyQm91bmQ6WzAsMCwwXSx6T2Zmc2V0OjAscGVybXV0YXRpb246WzEsMCwwLDAsMSwwLDAsMCwxXSxsaWdodFBvc2l0aW9uOlswLDAsMF0sZXllUG9zaXRpb246WzAsMCwwXX07Ri5kcmF3UGljaz1mdW5jdGlvbih0KXt0PXR8fHt9O3ZhciBlPXRoaXMuZ2w7ZS5kaXNhYmxlKGUuQ1VMTF9GQUNFKTt2YXIgcj1xO3IubW9kZWw9dC5tb2RlbHx8UCxyLnZpZXc9dC52aWV3fHxQLHIucHJvamVjdGlvbj10LnByb2plY3Rpb258fFAsci5zaGFwZT10aGlzLl9maWVsZFsyXS5zaGFwZSxyLnBpY2tJZD10aGlzLnBpY2tJZC8yNTUsci5sb3dlckJvdW5kPXRoaXMuYm91bmRzWzBdLHIudXBwZXJCb3VuZD10aGlzLmJvdW5kc1sxXSxyLnBlcm11dGF0aW9uPVY7Zm9yKHZhciBuPTA7bjwyOysrbilmb3IodmFyIGk9ci5jbGlwQm91bmRzW25dLGE9MDthPDM7KythKWlbYV09TWF0aC5taW4oTWF0aC5tYXgodGhpcy5jbGlwQm91bmRzW25dW2FdLC0xZTgpLDFlOCk7dmFyIHM9byhyLHRoaXMpO2lmKHMuc2hvd1N1cmZhY2Upe2Zvcih0aGlzLl9waWNrU2hhZGVyLmJpbmQoKSx0aGlzLl9waWNrU2hhZGVyLnVuaWZvcm1zPXIsdGhpcy5fdmFvLmJpbmQoKSx0aGlzLl92YW8uZHJhdyhlLlRSSUFOR0xFUyx0aGlzLl92ZXJ0ZXhDb3VudCksbj0wO248MzsrK24pdGhpcy5zdXJmYWNlUHJvamVjdFtuXSYmKHRoaXMuX3BpY2tTaGFkZXIudW5pZm9ybXMubW9kZWw9cy5wcm9qZWN0aW9uc1tuXSx0aGlzLl9waWNrU2hhZGVyLnVuaWZvcm1zLmNsaXBCb3VuZHM9cy5jbGlwQm91bmRzW25dLHRoaXMuX3Zhby5kcmF3KGUuVFJJQU5HTEVTLHRoaXMuX3ZlcnRleENvdW50KSk7dGhpcy5fdmFvLnVuYmluZCgpfWlmKHMuc2hvd0NvbnRvdXIpe3ZhciBsPXRoaXMuX2NvbnRvdXJQaWNrU2hhZGVyO2wuYmluZCgpLGwudW5pZm9ybXM9cjt2YXIgdT10aGlzLl9jb250b3VyVkFPO2Zvcih1LmJpbmQoKSxhPTA7YTwzOysrYSlmb3IoZS5saW5lV2lkdGgodGhpcy5jb250b3VyV2lkdGhbYV0pLGwudW5pZm9ybXMucGVybXV0YXRpb249UlthXSxuPTA7bjx0aGlzLmNvbnRvdXJMZXZlbHNbYV0ubGVuZ3RoOysrbil0aGlzLl9jb250b3VyQ291bnRzW2FdW25dJiYobC51bmlmb3Jtcy5oZWlnaHQ9dGhpcy5jb250b3VyTGV2ZWxzW2FdW25dLHUuZHJhdyhlLkxJTkVTLHRoaXMuX2NvbnRvdXJDb3VudHNbYV1bbl0sdGhpcy5fY29udG91ck9mZnNldHNbYV1bbl0pKTtmb3Iobj0wO248MzsrK24pZm9yKGwudW5pZm9ybXMubW9kZWw9cy5wcm9qZWN0aW9uc1tuXSxsLnVuaWZvcm1zLmNsaXBCb3VuZHM9cy5jbGlwQm91bmRzW25dLGE9MDthPDM7KythKWlmKHRoaXMuY29udG91clByb2plY3Rbbl1bYV0pe2wudW5pZm9ybXMucGVybXV0YXRpb249UlthXSxlLmxpbmVXaWR0aCh0aGlzLmNvbnRvdXJXaWR0aFthXSk7Zm9yKHZhciBjPTA7Yzx0aGlzLmNvbnRvdXJMZXZlbHNbYV0ubGVuZ3RoOysrYyl0aGlzLl9jb250b3VyQ291bnRzW2FdW2NdJiYobC51bmlmb3Jtcy5oZWlnaHQ9dGhpcy5jb250b3VyTGV2ZWxzW2FdW2NdLHUuZHJhdyhlLkxJTkVTLHRoaXMuX2NvbnRvdXJDb3VudHNbYV1bY10sdGhpcy5fY29udG91ck9mZnNldHNbYV1bY10pKX11LnVuYmluZCgpfX0sRi5waWNrPWZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiBudWxsO2lmKHQuaWQhPT10aGlzLnBpY2tJZClyZXR1cm4gbnVsbDt2YXIgZT10aGlzLl9maWVsZFsyXS5zaGFwZSxyPXRoaXMuX3BpY2tSZXN1bHQsbj1lWzBdKih0LnZhbHVlWzBdKyh0LnZhbHVlWzJdPj40KS8xNikvMjU1LGk9TWF0aC5mbG9vcihuKSxhPW4taSxvPWVbMV0qKHQudmFsdWVbMV0rKDE1JnQudmFsdWVbMl0pLzE2KS8yNTUscz1NYXRoLmZsb29yKG8pLGw9by1zO2krPTEscys9MTt2YXIgdT1yLnBvc2l0aW9uO3VbMF09dVsxXT11WzJdPTA7Zm9yKHZhciBjPTA7YzwyOysrYylmb3IodmFyIGg9Yz9hOjEtYSxmPTA7ZjwyOysrZilmb3IodmFyIGQ9Zj9sOjEtbCxwPWkrYyxnPXMrZixtPWgqZCx2PTA7djwzOysrdil1W3ZdKz10aGlzLl9maWVsZFt2XS5nZXQocCxnKSptO2Zvcih2YXIgeT10aGlzLl9waWNrUmVzdWx0LmxldmVsLHg9MDt4PDM7Kyt4KWlmKHlbeF09ay5sZSh0aGlzLmNvbnRvdXJMZXZlbHNbeF0sdVt4XSkseVt4XTwwKXRoaXMuY29udG91ckxldmVsc1t4XS5sZW5ndGg+MCYmKHlbeF09MCk7ZWxzZSBpZih5W3hdPHRoaXMuY29udG91ckxldmVsc1t4XS5sZW5ndGgtMSl7dmFyIGI9dGhpcy5jb250b3VyTGV2ZWxzW3hdW3lbeF1dLF89dGhpcy5jb250b3VyTGV2ZWxzW3hdW3lbeF0rMV07TWF0aC5hYnMoYi11W3hdKT5NYXRoLmFicyhfLXVbeF0pJiYoeVt4XSs9MSl9Zm9yKHIuaW5kZXhbMF09YTwuNT9pOmkrMSxyLmluZGV4WzFdPWw8LjU/czpzKzEsci51dlswXT1uL2VbMF0sci51dlsxXT1vL2VbMV0sdj0wO3Y8MzsrK3Ypci5kYXRhQ29vcmRpbmF0ZVt2XT10aGlzLl9maWVsZFt2XS5nZXQoci5pbmRleFswXSxyLmluZGV4WzFdKTtyZXR1cm4gcn0sRi51cGRhdGU9ZnVuY3Rpb24odCl7dD10fHx7fSx0aGlzLmRpcnR5PSEwLCJjb250b3VyV2lkdGgiaW4gdCYmKHRoaXMuY29udG91cldpZHRoPXUodC5jb250b3VyV2lkdGgsTnVtYmVyKSksInNob3dDb250b3VyImluIHQmJih0aGlzLnNob3dDb250b3VyPXUodC5zaG93Q29udG91cixCb29sZWFuKSksInNob3dTdXJmYWNlImluIHQmJih0aGlzLnNob3dTdXJmYWNlPSEhdC5zaG93U3VyZmFjZSksImNvbnRvdXJUaW50ImluIHQmJih0aGlzLmNvbnRvdXJUaW50PXUodC5jb250b3VyVGludCxCb29sZWFuKSksImNvbnRvdXJDb2xvciJpbiB0JiYodGhpcy5jb250b3VyQ29sb3I9aCh0LmNvbnRvdXJDb2xvcikpLCJjb250b3VyUHJvamVjdCJpbiB0JiYodGhpcy5jb250b3VyUHJvamVjdD11KHQuY29udG91clByb2plY3QsZnVuY3Rpb24odCl7cmV0dXJuIHUodCxCb29sZWFuKX0pKSwic3VyZmFjZVByb2plY3QiaW4gdCYmKHRoaXMuc3VyZmFjZVByb2plY3Q9dC5zdXJmYWNlUHJvamVjdCksImR5bmFtaWNDb2xvciJpbiB0JiYodGhpcy5keW5hbWljQ29sb3I9aCh0LmR5bmFtaWNDb2xvcikpLCJkeW5hbWljVGludCJpbiB0JiYodGhpcy5keW5hbWljVGludD11KHQuZHluYW1pY1RpbnQsTnVtYmVyKSksImR5bmFtaWNXaWR0aCJpbiB0JiYodGhpcy5keW5hbWljV2lkdGg9dSh0LmR5bmFtaWNXaWR0aCxOdW1iZXIpKSwib3BhY2l0eSJpbiB0JiYodGhpcy5vcGFjaXR5PXQub3BhY2l0eSksImNvbG9yQm91bmRzImluIHQmJih0aGlzLmNvbG9yQm91bmRzPXQuY29sb3JCb3VuZHMpLCJ2ZXJ0ZXhDb2xvciJpbiB0JiYodGhpcy52ZXJ0ZXhDb2xvcj10LnZlcnRleENvbG9yPzE6MCk7dmFyIGU9dC5maWVsZHx8dC5jb29yZHMmJnQuY29vcmRzWzJdfHxudWxsLHI9ITE7aWYoZXx8KGU9dGhpcy5fZmllbGRbMl0uc2hhcGVbMF18fHRoaXMuX2ZpZWxkWzJdLnNoYXBlWzJdP3RoaXMuX2ZpZWxkWzJdLmxvKDEsMSkuaGkodGhpcy5fZmllbGRbMl0uc2hhcGVbMF0tMix0aGlzLl9maWVsZFsyXS5zaGFwZVsxXS0yKTp0aGlzLl9maWVsZFsyXS5oaSgwLDApKSwiZmllbGQiaW4gdHx8ImNvb3JkcyJpbiB0KXt2YXIgbj0oZS5zaGFwZVswXSsyKSooZS5zaGFwZVsxXSsyKTtuPnRoaXMuX2ZpZWxkWzJdLmRhdGEubGVuZ3RoJiYodi5mcmVlRmxvYXQodGhpcy5fZmllbGRbMl0uZGF0YSksdGhpcy5fZmllbGRbMl0uZGF0YT12Lm1hbGxvY0Zsb2F0KGQubmV4dFBvdzIobikpKSx0aGlzLl9maWVsZFsyXT1fKHRoaXMuX2ZpZWxkWzJdLmRhdGEsW2Uuc2hhcGVbMF0rMixlLnNoYXBlWzFdKzJdKSxsKHRoaXMuX2ZpZWxkWzJdLGUpLHRoaXMuc2hhcGU9ZS5zaGFwZS5zbGljZSgpO2Zvcih2YXIgYT10aGlzLnNoYXBlLG89MDtvPDI7KytvKXRoaXMuX2ZpZWxkWzJdLnNpemU+dGhpcy5fZmllbGRbb10uZGF0YS5sZW5ndGgmJih2LmZyZWVGbG9hdCh0aGlzLl9maWVsZFtvXS5kYXRhKSx0aGlzLl9maWVsZFtvXS5kYXRhPXYubWFsbG9jRmxvYXQodGhpcy5fZmllbGRbMl0uc2l6ZSkpLHRoaXMuX2ZpZWxkW29dPV8odGhpcy5fZmllbGRbb10uZGF0YSxbYVswXSsyLGFbMV0rMl0pO2lmKHQuY29vcmRzKXt2YXIgcz10LmNvb3JkcztpZighQXJyYXkuaXNBcnJheShzKXx8MyE9PXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiZ2wtc3VyZmFjZTogaW52YWxpZCBjb29yZGluYXRlcyBmb3IgeC95Iik7Zm9yKG89MDtvPDI7KytvKXt2YXIgYz1zW29dO2Zvcih5PTA7eTwyOysreSlpZihjLnNoYXBlW3ldIT09YVt5XSl0aHJvdyBuZXcgRXJyb3IoImdsLXN1cmZhY2U6IGNvb3JkcyBoYXZlIGluY29ycmVjdCBzaGFwZSIpO2wodGhpcy5fZmllbGRbb10sYyl9fWVsc2UgaWYodC50aWNrcyl7dmFyIGY9dC50aWNrcztpZighQXJyYXkuaXNBcnJheShmKXx8MiE9PWYubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiZ2wtc3VyZmFjZTogaW52YWxpZCB0aWNrcyIpO2ZvcihvPTA7bzwyOysrbyl7dmFyIHA9ZltvXTtpZigoQXJyYXkuaXNBcnJheShwKXx8cC5sZW5ndGgpJiYocD1fKHApKSxwLnNoYXBlWzBdIT09YVtvXSl0aHJvdyBuZXcgRXJyb3IoImdsLXN1cmZhY2U6IGludmFsaWQgdGljayBsZW5ndGgiKTt2YXIgZz1fKHAuZGF0YSxhKTtnLnN0cmlkZVtvXT1wLnN0cmlkZVswXSxnLnN0cmlkZVsxXm9dPTAsbCh0aGlzLl9maWVsZFtvXSxnKX19ZWxzZXtmb3Iobz0wO288MjsrK28pe3ZhciBtPVswLDBdO21bb109MSx0aGlzLl9maWVsZFtvXT1fKHRoaXMuX2ZpZWxkW29dLmRhdGEsW2FbMF0rMixhWzFdKzJdLG0sMCl9dGhpcy5fZmllbGRbMF0uc2V0KDAsMCwwKTtmb3IodmFyIHk9MDt5PGFbMF07Kyt5KXRoaXMuX2ZpZWxkWzBdLnNldCh5KzEsMCx5KTtmb3IodGhpcy5fZmllbGRbMF0uc2V0KGFbMF0rMSwwLGFbMF0tMSksdGhpcy5fZmllbGRbMV0uc2V0KDAsMCwwKSx5PTA7eTxhWzFdOysreSl0aGlzLl9maWVsZFsxXS5zZXQoMCx5KzEseSk7dGhpcy5fZmllbGRbMV0uc2V0KDAsYVsxXSsxLGFbMV0tMSl9dmFyIHg9dGhpcy5fZmllbGQsYj1fKHYubWFsbG9jRmxvYXQoMyp4WzJdLnNpemUqMiksWzMsYVswXSsyLGFbMV0rMiwyXSk7Zm9yKG89MDtvPDM7KytvKVQoYi5waWNrKG8pLHhbb10sIm1pcnJvciIpO3ZhciBNPV8odi5tYWxsb2NGbG9hdCgzKnhbMl0uc2l6ZSksW2FbMF0rMixhWzFdKzIsM10pO2ZvcihvPTA7bzxhWzBdKzI7KytvKWZvcih5PTA7eTxhWzFdKzI7Kyt5KXt2YXIgQT1iLmdldCgwLG8seSwwKSxrPWIuZ2V0KDAsbyx5LDEpLEU9Yi5nZXQoMSxvLHksMCksUz1iLmdldCgxLG8seSwxKSxMPWIuZ2V0KDIsbyx5LDApLHo9Yi5nZXQoMixvLHksMSksQz1FKnotUypMLEk9TCprLXoqQSxQPUEqUy1rKkUsUj1NYXRoLnNxcnQoQypDK0kqSStQKlApO1I8MWUtOD8oUj1NYXRoLm1heChNYXRoLmFicyhDKSxNYXRoLmFicyhJKSxNYXRoLmFicyhQKSksUjwxZS04PyhQPTEsST1DPTAsUj0xKTpSPTEvUik6Uj0xL01hdGguc3FydChSKSxNLnNldChvLHksMCxDKlIpLE0uc2V0KG8seSwxLEkqUiksTS5zZXQobyx5LDIsUCpSKX12LmZyZWUoYi5kYXRhKTt2YXIgTz1bMS8wLDEvMCwxLzBdLEY9Wy0oMS8wKSwtKDEvMCksLSgxLzApXSxqPTEvMCxOPS0oMS8wKSxCPShhWzBdLTEpKihhWzFdLTEpKjYsVT12Lm1hbGxvY0Zsb2F0KGQubmV4dFBvdzIoMTAqQikpLFY9MCxxPTA7Zm9yKG89MDtvPGFbMF0tMTsrK28pdDpmb3IoeT0wO3k8YVsxXS0xOysreSl7Zm9yKHZhciBIPTA7SDwyOysrSClmb3IodmFyIEc9MDtHPDI7KytHKWZvcih2YXIgWD0wO1g8MzsrK1gpe3ZhciBZPXRoaXMuX2ZpZWxkW1hdLmdldCgxK28rSCwxK3krRyk7aWYoaXNOYU4oWSl8fCFpc0Zpbml0ZShZKSljb250aW51ZSB0fWZvcihYPTA7WDw2OysrWCl7dmFyIFc9bytEW1hdWzBdLFo9eStEW1hdWzFdLFE9dGhpcy5fZmllbGRbMF0uZ2V0KFcrMSxaKzEpLEs9dGhpcy5fZmllbGRbMV0uZ2V0KFcrMSxaKzEpO1k9dGhpcy5fZmllbGRbMl0uZ2V0KFcrMSxaKzEpO3ZhciAkPVk7Qz1NLmdldChXKzEsWisxLDApLEk9TS5nZXQoVysxLForMSwxKSxQPU0uZ2V0KFcrMSxaKzEsMiksdC5pbnRlbnNpdHkmJigkPXQuaW50ZW5zaXR5LmdldChXLFopKSxVW1YrK109VyxVW1YrK109WixVW1YrK109USxVW1YrK109SyxVW1YrK109WSxVW1YrK109MCxVW1YrK109JCxVW1YrK109QyxVW1YrK109SSxVW1YrK109UCxPWzBdPU1hdGgubWluKE9bMF0sUSksT1sxXT1NYXRoLm1pbihPWzFdLEspLE9bMl09TWF0aC5taW4oT1syXSxZKSxqPU1hdGgubWluKGosJCksRlswXT1NYXRoLm1heChGWzBdLFEpLEZbMV09TWF0aC5tYXgoRlsxXSxLKSxGWzJdPU1hdGgubWF4KEZbMl0sWSksTj1NYXRoLm1heChOLCQpLHErPTF9fWZvcih0LmludGVuc2l0eUJvdW5kcyYmKGo9K3QuaW50ZW5zaXR5Qm91bmRzWzBdLE49K3QuaW50ZW5zaXR5Qm91bmRzWzFdKSxvPTY7bzxWO28rPTEwKVVbb109KFVbb10taikvKE4taik7dGhpcy5fdmVydGV4Q291bnQ9cSx0aGlzLl9jb29yZGluYXRlQnVmZmVyLnVwZGF0ZShVLnN1YmFycmF5KDAsVikpLHYuZnJlZUZsb2F0KFUpLHYuZnJlZShNLmRhdGEpLHRoaXMuYm91bmRzPVtPLEZdLHRoaXMuaW50ZW5zaXR5PXQuaW50ZW5zaXR5fHx0aGlzLl9maWVsZFsyXSx0aGlzLmludGVuc2l0eUJvdW5kc1swXT09PWomJnRoaXMuaW50ZW5zaXR5Qm91bmRzWzFdPT09Tnx8KHI9ITApLHRoaXMuaW50ZW5zaXR5Qm91bmRzPVtqLE5dfWlmKCJsZXZlbHMiaW4gdCl7dmFyIEo9dC5sZXZlbHM7Zm9yKEo9QXJyYXkuaXNBcnJheShKWzBdKT9KLnNsaWNlKCk6W1tdLFtdLEpdLG89MDtvPDM7KytvKUpbb109SltvXS5zbGljZSgpLEouc29ydChmdW5jdGlvbih0LGUpe3JldHVybiB0LWV9KTt0OmZvcihvPTA7bzwzOysrbyl7aWYoSltvXS5sZW5ndGghPT10aGlzLmNvbnRvdXJMZXZlbHNbb10ubGVuZ3RoKXtyPSEwO2JyZWFrfWZvcih5PTA7eTxKW29dLmxlbmd0aDsrK3kpaWYoSltvXVt5XSE9PXRoaXMuY29udG91ckxldmVsc1tvXVt5XSl7cj0hMDticmVhayB0fX10aGlzLmNvbnRvdXJMZXZlbHM9Sn1pZihyKXt4PXRoaXMuX2ZpZWxkLGE9dGhpcy5zaGFwZTtmb3IodmFyIHR0PVtdLGV0PTA7ZXQ8MzsrK2V0KXtKPXRoaXMuY29udG91ckxldmVsc1tldF07dmFyIHJ0PVtdLG50PVtdLGl0PVswLDAsMF07Zm9yKG89MDtvPEoubGVuZ3RoOysrbyl7dmFyIGF0PXcodGhpcy5fZmllbGRbZXRdLEpbb10pO3J0LnB1c2godHQubGVuZ3RoLzV8MCkscT0wO3Q6Zm9yKHk9MDt5PGF0LmNlbGxzLmxlbmd0aDsrK3kpe3ZhciBvdD1hdC5jZWxsc1t5XTtmb3IoWD0wO1g8MjsrK1gpe3ZhciBzdD1hdC5wb3NpdGlvbnNbb3RbWF1dLGx0PXN0WzBdLHV0PTB8TWF0aC5mbG9vcihsdCksY3Q9bHQtdXQsaHQ9c3RbMV0sZnQ9MHxNYXRoLmZsb29yKGh0KSxkdD1odC1mdCxwdD0hMTtlOmZvcih2YXIgZ3Q9MDtndDwzOysrZ3Qpe2l0W2d0XT0wO3ZhciBtdD0oZXQrZ3QrMSklMztmb3IoSD0wO0g8MjsrK0gpe3ZhciB2dD1IP2N0OjEtY3Q7Zm9yKFc9MHxNYXRoLm1pbihNYXRoLm1heCh1dCtILDApLGFbMF0pLEc9MDtHPDI7KytHKXt2YXIgeXQ9Rz9kdDoxLWR0O2lmKFo9MHxNYXRoLm1pbihNYXRoLm1heChmdCtHLDApLGFbMV0pLFk9Z3Q8Mj90aGlzLl9maWVsZFttdF0uZ2V0KFcsWik6KHRoaXMuaW50ZW5zaXR5LmdldChXLFopLXRoaXMuaW50ZW5zaXR5Qm91bmRzWzBdKS8odGhpcy5pbnRlbnNpdHlCb3VuZHNbMV0tdGhpcy5pbnRlbnNpdHlCb3VuZHNbMF0pLCFpc0Zpbml0ZShZKXx8aXNOYU4oWSkpe3B0PSEwO2JyZWFrIGV9dmFyIHh0PXZ0Knl0O2l0W2d0XSs9eHQqWX19fWlmKHB0KXtpZihYPjApe2Zvcih2YXIgYnQ9MDtidDw1OysrYnQpdHQucG9wKCk7cS09MX1jb250aW51ZSB0fXR0LnB1c2goaXRbMF0saXRbMV0sc3RbMF0sc3RbMV0saXRbMl0pLHErPTF9fW50LnB1c2gocSl9dGhpcy5fY29udG91ck9mZnNldHNbZXRdPXJ0LHRoaXMuX2NvbnRvdXJDb3VudHNbZXRdPW50fXZhciBfdD12Lm1hbGxvY0Zsb2F0KHR0Lmxlbmd0aCk7Zm9yKG89MDtvPHR0Lmxlbmd0aDsrK28pX3Rbb109dHRbb107dGhpcy5fY29udG91ckJ1ZmZlci51cGRhdGUoX3QpLHYuZnJlZUZsb2F0KF90KX10LmNvbG9ybWFwJiZ0aGlzLl9jb2xvck1hcC5zZXRQaXhlbHMoaSh0LmNvbG9ybWFwKSl9LEYuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuX3NoYWRlci5kaXNwb3NlKCksdGhpcy5fdmFvLmRpc3Bvc2UoKSx0aGlzLl9jb29yZGluYXRlQnVmZmVyLmRpc3Bvc2UoKSx0aGlzLl9jb2xvck1hcC5kaXNwb3NlKCksdGhpcy5fY29udG91ckJ1ZmZlci5kaXNwb3NlKCksdGhpcy5fY29udG91clZBTy5kaXNwb3NlKCksdGhpcy5fY29udG91clNoYWRlci5kaXNwb3NlKCksdGhpcy5fY29udG91clBpY2tTaGFkZXIuZGlzcG9zZSgpLHRoaXMuX2R5bmFtaWNCdWZmZXIuZGlzcG9zZSgpLHRoaXMuX2R5bmFtaWNWQU8uZGlzcG9zZSgpO2Zvcih2YXIgdD0wO3Q8MzsrK3Qpdi5mcmVlRmxvYXQodGhpcy5fZmllbGRbdF0uZGF0YSl9LEYuaGlnaGxpZ2h0PWZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiB0aGlzLl9keW5hbWljQ291bnRzPVswLDAsMF0sdGhpcy5keWFuYW1pY0xldmVsPVtOYU4sTmFOLE5hTl0sdm9pZCh0aGlzLmhpZ2hsaWdodExldmVsPVstMSwtMSwtMV0pO2Zvcih2YXIgZT0wO2U8MzsrK2UpdGhpcy5lbmFibGVIaWdobGlnaHRbZV0/dGhpcy5oaWdobGlnaHRMZXZlbFtlXT10LmxldmVsW2VdOnRoaXMuaGlnaGxpZ2h0TGV2ZWxbZV09LTE7dmFyIHI7aWYocj10aGlzLnNuYXBUb0RhdGE/dC5kYXRhQ29vcmRpbmF0ZTp0LnBvc2l0aW9uLHRoaXMuZW5hYmxlRHluYW1pY1swXSYmclswXSE9PXRoaXMuZHluYW1pY0xldmVsWzBdfHx0aGlzLmVuYWJsZUR5bmFtaWNbMV0mJnJbMV0hPT10aGlzLmR5bmFtaWNMZXZlbFsxXXx8dGhpcy5lbmFibGVEeW5hbWljWzJdJiZyWzJdIT09dGhpcy5keW5hbWljTGV2ZWxbMl0pe2Zvcih2YXIgbj0wLGk9dGhpcy5zaGFwZSxhPXYubWFsbG9jRmxvYXQoMTIqaVswXSppWzFdKSxvPTA7bzwzOysrbylpZih0aGlzLmVuYWJsZUR5bmFtaWNbb10pe3RoaXMuZHluYW1pY0xldmVsW29dPXJbb107dmFyIHM9KG8rMSklMyxsPShvKzIpJTMsdT10aGlzLl9maWVsZFtvXSxjPXRoaXMuX2ZpZWxkW3NdLGg9dGhpcy5fZmllbGRbbF0sZj0odGhpcy5pbnRlbnNpdHksdyh1LHJbb10pKSxkPWYuY2VsbHMscD1mLnBvc2l0aW9ucztmb3IodGhpcy5fZHluYW1pY09mZnNldHNbb109bixlPTA7ZTxkLmxlbmd0aDsrK2UpZm9yKHZhciBnPWRbZV0sbT0wO208MjsrK20pe3ZhciB5PXBbZ1ttXV0seD0reVswXSxiPTB8eCxfPTB8TWF0aC5taW4oYisxLGlbMF0pLE09eC1iLEE9MS1NLGs9K3lbMV0sVD0wfGssRT0wfE1hdGgubWluKFQrMSxpWzFdKSxTPWstVCxMPTEtUyx6PUEqTCxDPUEqUyxJPU0qTCxQPU0qUyxEPXoqYy5nZXQoYixUKStDKmMuZ2V0KGIsRSkrSSpjLmdldChfLFQpK1AqYy5nZXQoXyxFKSxSPXoqaC5nZXQoYixUKStDKmguZ2V0KGIsRSkrSSpoLmdldChfLFQpK1AqaC5nZXQoXyxFKTtpZihpc05hTihEKXx8aXNOYU4oUikpe20mJihuLT0xKTticmVha31hWzIqbiswXT1ELGFbMipuKzFdPVIsbis9MX10aGlzLl9keW5hbWljQ291bnRzW29dPW4tdGhpcy5fZHluYW1pY09mZnNldHNbb119ZWxzZSB0aGlzLmR5bmFtaWNMZXZlbFtvXT1OYU4sdGhpcy5fZHluYW1pY0NvdW50c1tvXT0wO3RoaXMuX2R5bmFtaWNCdWZmZXIudXBkYXRlKGEuc3ViYXJyYXkoMCwyKm4pKSx2LmZyZWVGbG9hdChhKX19fSx7Ii4vbGliL3NoYWRlcnMiOjIzMCwiYmluYXJ5LXNlYXJjaC1ib3VuZHMiOjUzLCJiaXQtdHdpZGRsZSI6NTQsY29sb3JtYXA6ODAsImdsLWJ1ZmZlciI6MTI4LCJnbC1tYXQ0L2ludmVydCI6MTQ5LCJnbC1tYXQ0L211bHRpcGx5IjoxNTEsImdsLXRleHR1cmUyZCI6MjMyLCJnbC12YW8iOjIzNixuZGFycmF5OjQyNywibmRhcnJheS1ncmFkaWVudCI6NDE4LCJuZGFycmF5LW9wcyI6NDIxLCJuZGFycmF5LXBhY2siOjQyMiwic3VyZmFjZS1uZXRzIjo0ODcsInR5cGVkYXJyYXktcG9vbCI6NDk2fV0sMjMyOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7bT1bdC5MSU5FQVIsdC5ORUFSRVNUX01JUE1BUF9MSU5FQVIsdC5MSU5FQVJfTUlQTUFQX05FQVJFU1QsdC5MSU5FQVJfTUlQTUFQX05FQVJFU1RdLHY9W3QuTkVBUkVTVCx0LkxJTkVBUix0Lk5FQVJFU1RfTUlQTUFQX05FQVJFU1QsdC5ORUFSRVNUX01JUE1BUF9MSU5FQVIsdC5MSU5FQVJfTUlQTUFQX05FQVJFU1QsdC5MSU5FQVJfTUlQTUFQX0xJTkVBUl0seT1bdC5SRVBFQVQsdC5DTEFNUF9UT19FREdFLHQuTUlSUk9SRURfUkVQRUFUXX1mdW5jdGlvbiBpKHQsZSxyKXt2YXIgbj10LmdsLGk9bi5nZXRQYXJhbWV0ZXIobi5NQVhfVEVYVFVSRV9TSVpFKTtpZihlPDB8fGU+aXx8cjwwfHxyPmkpdGhyb3cgbmV3IEVycm9yKCJnbC10ZXh0dXJlMmQ6IEludmFsaWQgdGV4dHVyZSBzaXplIik7cmV0dXJuIHQuX3NoYXBlPVtlLHJdLHQuYmluZCgpLG4udGV4SW1hZ2UyRChuLlRFWFRVUkVfMkQsMCx0LmZvcm1hdCxlLHIsMCx0LmZvcm1hdCx0LnR5cGUsbnVsbCksdC5fbWlwTGV2ZWxzPVswXSx0fWZ1bmN0aW9uIGEodCxlLHIsbixpLGEpe3RoaXMuZ2w9dCx0aGlzLmhhbmRsZT1lLHRoaXMuZm9ybWF0PWksdGhpcy50eXBlPWEsdGhpcy5fc2hhcGU9W3Isbl0sdGhpcy5fbWlwTGV2ZWxzPVswXSx0aGlzLl9tYWdGaWx0ZXI9dC5ORUFSRVNULHRoaXMuX21pbkZpbHRlcj10Lk5FQVJFU1QsdGhpcy5fd3JhcFM9dC5DTEFNUF9UT19FREdFLHRoaXMuX3dyYXBUPXQuQ0xBTVBfVE9fRURHRSx0aGlzLl9hbmlzb1NhbXBsZXM9MTt2YXIgbz10aGlzLHM9W3RoaXMuX3dyYXBTLHRoaXMuX3dyYXBUXTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhzLFt7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG8uX3dyYXBTfSxzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIG8ud3JhcFM9dH19LHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gby5fd3JhcFR9LHNldDpmdW5jdGlvbih0KXtyZXR1cm4gby53cmFwVD10fX1dKSx0aGlzLl93cmFwVmVjdG9yPXM7dmFyIGw9W3RoaXMuX3NoYXBlWzBdLHRoaXMuX3NoYXBlWzFdXTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhsLFt7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG8uX3NoYXBlWzBdfSxzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIG8ud2lkdGg9dH19LHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gby5fc2hhcGVbMV19LHNldDpmdW5jdGlvbih0KXtyZXR1cm4gby5oZWlnaHQ9dH19XSksdGhpcy5fc2hhcGVWZWN0b3I9bH1mdW5jdGlvbiBvKHQsZSl7cmV0dXJuIDM9PT10Lmxlbmd0aD8xPT09ZVsyXSYmZVsxXT09PXRbMF0qdFsyXSYmZVswXT09PXRbMl06MT09PWVbMF0mJmVbMV09PT10WzBdfWZ1bmN0aW9uIHModCxlLHIsbixpLGEscyxsKXt2YXIgdT1sLmR0eXBlLGM9bC5zaGFwZS5zbGljZSgpO2lmKGMubGVuZ3RoPDJ8fGMubGVuZ3RoPjMpdGhyb3cgbmV3IEVycm9yKCJnbC10ZXh0dXJlMmQ6IEludmFsaWQgbmRhcnJheSwgbXVzdCBiZSAyZCBvciAzZCIpO3ZhciBoPTAsZj0wLG09byhjLGwuc3RyaWRlLnNsaWNlKCkpOyJmbG9hdDMyIj09PXU/aD10LkZMT0FUOiJmbG9hdDY0Ij09PXU/KGg9dC5GTE9BVCxtPSExLHU9ImZsb2F0MzIiKToidWludDgiPT09dT9oPXQuVU5TSUdORURfQllURTooaD10LlVOU0lHTkVEX0JZVEUsbT0hMSx1PSJ1aW50OCIpO3ZhciB2PTE7aWYoMj09PWMubGVuZ3RoKWY9dC5MVU1JTkFOQ0UsYz1bY1swXSxjWzFdLDFdLGw9ZChsLmRhdGEsYyxbbC5zdHJpZGVbMF0sbC5zdHJpZGVbMV0sMV0sbC5vZmZzZXQpO2Vsc2V7aWYoMyE9PWMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiZ2wtdGV4dHVyZTJkOiBJbnZhbGlkIHNoYXBlIGZvciB0ZXh0dXJlIik7aWYoMT09PWNbMl0pZj10LkFMUEhBO2Vsc2UgaWYoMj09PWNbMl0pZj10LkxVTUlOQU5DRV9BTFBIQTtlbHNlIGlmKDM9PT1jWzJdKWY9dC5SR0I7ZWxzZXtpZig0IT09Y1syXSl0aHJvdyBuZXcgRXJyb3IoImdsLXRleHR1cmUyZDogSW52YWxpZCBzaGFwZSBmb3IgcGl4ZWwgY29vcmRzIik7Zj10LlJHQkF9dj1jWzJdfWlmKGYhPT10LkxVTUlOQU5DRSYmZiE9PXQuQUxQSEF8fGkhPT10LkxVTUlOQU5DRSYmaSE9PXQuQUxQSEF8fChmPWkpLGYhPT1pKXRocm93IG5ldyBFcnJvcigiZ2wtdGV4dHVyZTJkOiBJbmNvbXBhdGlibGUgdGV4dHVyZSBmb3JtYXQgZm9yIHNldFBpeGVscyIpO3ZhciB5PWwuc2l6ZSxiPXMuaW5kZXhPZihuKTwwO2lmKGImJnMucHVzaChuKSxoPT09YSYmbSkwPT09bC5vZmZzZXQmJmwuZGF0YS5sZW5ndGg9PT15P2I/dC50ZXhJbWFnZTJEKHQuVEVYVFVSRV8yRCxuLGksY1swXSxjWzFdLDAsaSxhLGwuZGF0YSk6dC50ZXhTdWJJbWFnZTJEKHQuVEVYVFVSRV8yRCxuLGUscixjWzBdLGNbMV0saSxhLGwuZGF0YSk6Yj90LnRleEltYWdlMkQodC5URVhUVVJFXzJELG4saSxjWzBdLGNbMV0sMCxpLGEsbC5kYXRhLnN1YmFycmF5KGwub2Zmc2V0LGwub2Zmc2V0K3kpKTp0LnRleFN1YkltYWdlMkQodC5URVhUVVJFXzJELG4sZSxyLGNbMF0sY1sxXSxpLGEsbC5kYXRhLnN1YmFycmF5KGwub2Zmc2V0LGwub2Zmc2V0K3kpKTtlbHNle3ZhciBfO189YT09PXQuRkxPQVQ/Zy5tYWxsb2NGbG9hdDMyKHkpOmcubWFsbG9jVWludDgoeSk7dmFyIHc9ZChfLGMsW2NbMl0sY1syXSpjWzBdLDFdKTtoPT09dC5GTE9BVCYmYT09PXQuVU5TSUdORURfQllURT94KHcsbCk6cC5hc3NpZ24odyxsKSxiP3QudGV4SW1hZ2UyRCh0LlRFWFRVUkVfMkQsbixpLGNbMF0sY1sxXSwwLGksYSxfLnN1YmFycmF5KDAseSkpOnQudGV4U3ViSW1hZ2UyRCh0LlRFWFRVUkVfMkQsbixlLHIsY1swXSxjWzFdLGksYSxfLnN1YmFycmF5KDAseSkpLGE9PT10LkZMT0FUP2cuZnJlZUZsb2F0MzIoXyk6Zy5mcmVlVWludDgoXyl9fWZ1bmN0aW9uIGwodCl7dmFyIGU9dC5jcmVhdGVUZXh0dXJlKCk7cmV0dXJuIHQuYmluZFRleHR1cmUodC5URVhUVVJFXzJELGUpLHQudGV4UGFyYW1ldGVyaSh0LlRFWFRVUkVfMkQsdC5URVhUVVJFX01JTl9GSUxURVIsdC5ORUFSRVNUKSx0LnRleFBhcmFtZXRlcmkodC5URVhUVVJFXzJELHQuVEVYVFVSRV9NQUdfRklMVEVSLHQuTkVBUkVTVCksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfV1JBUF9TLHQuQ0xBTVBfVE9fRURHRSksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfV1JBUF9ULHQuQ0xBTVBfVE9fRURHRSksZX1mdW5jdGlvbiB1KHQsZSxyLG4saSl7dmFyIG89dC5nZXRQYXJhbWV0ZXIodC5NQVhfVEVYVFVSRV9TSVpFKTtpZihlPDB8fGU+b3x8cjwwfHxyPm8pdGhyb3cgbmV3IEVycm9yKCJnbC10ZXh0dXJlMmQ6IEludmFsaWQgdGV4dHVyZSBzaGFwZSIpO2lmKGk9PT10LkZMT0FUJiYhdC5nZXRFeHRlbnNpb24oIk9FU190ZXh0dXJlX2Zsb2F0IikpdGhyb3cgbmV3IEVycm9yKCJnbC10ZXh0dXJlMmQ6IEZsb2F0aW5nIHBvaW50IHRleHR1cmVzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSIpO3ZhciBzPWwodCk7cmV0dXJuIHQudGV4SW1hZ2UyRCh0LlRFWFRVUkVfMkQsMCxuLGUsciwwLG4saSxudWxsKSxuZXcgYSh0LHMsZSxyLG4saSl9ZnVuY3Rpb24gYyh0LGUscixuKXt2YXIgaT1sKHQpO3JldHVybiB0LnRleEltYWdlMkQodC5URVhUVVJFXzJELDAscixyLG4sZSksbmV3IGEodCxpLDB8ZS53aWR0aCwwfGUuaGVpZ2h0LHIsbil9ZnVuY3Rpb24gaCh0LGUpe3ZhciByPWUuZHR5cGUsbj1lLnNoYXBlLnNsaWNlKCksaT10LmdldFBhcmFtZXRlcih0Lk1BWF9URVhUVVJFX1NJWkUpO2lmKG5bMF08MHx8blswXT5pfHxuWzFdPDB8fG5bMV0+aSl0aHJvdyBuZXcgRXJyb3IoImdsLXRleHR1cmUyZDogSW52YWxpZCB0ZXh0dXJlIHNpemUiKTt2YXIgcz1vKG4sZS5zdHJpZGUuc2xpY2UoKSksdT0wOyJmbG9hdDMyIj09PXI/dT10LkZMT0FUOiJmbG9hdDY0Ij09PXI/KHU9dC5GTE9BVCxzPSExLHI9ImZsb2F0MzIiKToidWludDgiPT09cj91PXQuVU5TSUdORURfQllURToodT10LlVOU0lHTkVEX0JZVEUscz0hMSxyPSJ1aW50OCIpO3ZhciBjPTA7aWYoMj09PW4ubGVuZ3RoKWM9dC5MVU1JTkFOQ0Usbj1bblswXSxuWzFdLDFdLGU9ZChlLmRhdGEsbixbZS5zdHJpZGVbMF0sZS5zdHJpZGVbMV0sMV0sZS5vZmZzZXQpO2Vsc2V7aWYoMyE9PW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiZ2wtdGV4dHVyZTJkOiBJbnZhbGlkIHNoYXBlIGZvciB0ZXh0dXJlIik7aWYoMT09PW5bMl0pYz10LkFMUEhBO2Vsc2UgaWYoMj09PW5bMl0pYz10LkxVTUlOQU5DRV9BTFBIQTtlbHNlIGlmKDM9PT1uWzJdKWM9dC5SR0I7ZWxzZXtpZig0IT09blsyXSl0aHJvdyBuZXcgRXJyb3IoImdsLXRleHR1cmUyZDogSW52YWxpZCBzaGFwZSBmb3IgcGl4ZWwgY29vcmRzIik7Yz10LlJHQkF9fXUhPT10LkZMT0FUfHx0LmdldEV4dGVuc2lvbigiT0VTX3RleHR1cmVfZmxvYXQiKXx8KHU9dC5VTlNJR05FRF9CWVRFLHM9ITEpO3ZhciBoLGYsbT1lLnNpemU7aWYocyloPTA9PT1lLm9mZnNldCYmZS5kYXRhLmxlbmd0aD09PW0/ZS5kYXRhOmUuZGF0YS5zdWJhcnJheShlLm9mZnNldCxlLm9mZnNldCttKTtlbHNle3ZhciB2PVtuWzJdLG5bMl0qblswXSwxXTtmPWcubWFsbG9jKG0scik7dmFyIHk9ZChmLG4sdiwwKTsiZmxvYXQzMiIhPT1yJiYiZmxvYXQ2NCIhPT1yfHx1IT09dC5VTlNJR05FRF9CWVRFP3AuYXNzaWduKHksZSk6eCh5LGUpLGg9Zi5zdWJhcnJheSgwLG0pfXZhciBiPWwodCk7cmV0dXJuIHQudGV4SW1hZ2UyRCh0LlRFWFRVUkVfMkQsMCxjLG5bMF0sblsxXSwwLGMsdSxoKSxzfHxnLmZyZWUoZiksbmV3IGEodCxiLG5bMF0sblsxXSxjLHUpfWZ1bmN0aW9uIGYodCl7aWYoYXJndW1lbnRzLmxlbmd0aDw9MSl0aHJvdyBuZXcgRXJyb3IoImdsLXRleHR1cmUyZDogTWlzc2luZyBhcmd1bWVudHMgZm9yIHRleHR1cmUyZCBjb25zdHJ1Y3RvciIpO2lmKG18fG4odCksIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMV0pcmV0dXJuIHUodCxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdLGFyZ3VtZW50c1szXXx8dC5SR0JBLGFyZ3VtZW50c1s0XXx8dC5VTlNJR05FRF9CWVRFKTtpZihBcnJheS5pc0FycmF5KGFyZ3VtZW50c1sxXSkpcmV0dXJuIHUodCwwfGFyZ3VtZW50c1sxXVswXSwwfGFyZ3VtZW50c1sxXVsxXSxhcmd1bWVudHNbMl18fHQuUkdCQSxhcmd1bWVudHNbM118fHQuVU5TSUdORURfQllURSk7aWYoIm9iamVjdCI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciBlPWFyZ3VtZW50c1sxXTtpZihlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnR8fGUgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHxlIGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudHx8ZSBpbnN0YW5jZW9mIEltYWdlRGF0YSlyZXR1cm4gYyh0LGUsYXJndW1lbnRzWzJdfHx0LlJHQkEsYXJndW1lbnRzWzNdfHx0LlVOU0lHTkVEX0JZVEUpO2lmKGUuc2hhcGUmJmUuZGF0YSYmZS5zdHJpZGUpcmV0dXJuIGgodCxlKX10aHJvdyBuZXcgRXJyb3IoImdsLXRleHR1cmUyZDogSW52YWxpZCBhcmd1bWVudHMgZm9yIHRleHR1cmUyZCBjb25zdHJ1Y3RvciIpfXZhciBkPXQoIm5kYXJyYXkiKSxwPXQoIm5kYXJyYXktb3BzIiksZz10KCJ0eXBlZGFycmF5LXBvb2wiKTtlLmV4cG9ydHM9Zjt2YXIgbT1udWxsLHY9bnVsbCx5PW51bGwseD1mdW5jdGlvbih0LGUpe3AubXVscyh0LGUsMjU1KX0sYj1hLnByb3RvdHlwZTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhiLHttaW5GaWx0ZXI6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9taW5GaWx0ZXJ9LHNldDpmdW5jdGlvbih0KXt0aGlzLmJpbmQoKTt2YXIgZT10aGlzLmdsO2lmKHRoaXMudHlwZT09PWUuRkxPQVQmJm0uaW5kZXhPZih0KT49MCYmKGUuZ2V0RXh0ZW5zaW9uKCJPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIiKXx8KHQ9ZS5ORUFSRVNUKSksdi5pbmRleE9mKHQpPDApdGhyb3cgbmV3IEVycm9yKCJnbC10ZXh0dXJlMmQ6IFVua25vd24gZmlsdGVyIG1vZGUgIit0KTtyZXR1cm4gZS50ZXhQYXJhbWV0ZXJpKGUuVEVYVFVSRV8yRCxlLlRFWFRVUkVfTUlOX0ZJTFRFUix0KSx0aGlzLl9taW5GaWx0ZXI9dH19LG1hZ0ZpbHRlcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hZ0ZpbHRlcn0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuYmluZCgpO3ZhciBlPXRoaXMuZ2w7aWYodGhpcy50eXBlPT09ZS5GTE9BVCYmbS5pbmRleE9mKHQpPj0wJiYoZS5nZXRFeHRlbnNpb24oIk9FU190ZXh0dXJlX2Zsb2F0X2xpbmVhciIpfHwodD1lLk5FQVJFU1QpKSx2LmluZGV4T2YodCk8MCl0aHJvdyBuZXcgRXJyb3IoImdsLXRleHR1cmUyZDogVW5rbm93biBmaWx0ZXIgbW9kZSAiK3QpO3JldHVybiBlLnRleFBhcmFtZXRlcmkoZS5URVhUVVJFXzJELGUuVEVYVFVSRV9NQUdfRklMVEVSLHQpLHRoaXMuX21hZ0ZpbHRlcj10fX0sbWlwU2FtcGxlczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FuaXNvU2FtcGxlc30sc2V0OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2FuaXNvU2FtcGxlcztpZih0aGlzLl9hbmlzb1NhbXBsZXM9MHxNYXRoLm1heCh0LDEpLGUhPT10aGlzLl9hbmlzb1NhbXBsZXMpe3ZhciByPXRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKTtyJiZ0aGlzLmdsLnRleFBhcmFtZXRlcmYodGhpcy5nbC5URVhUVVJFXzJELHIuVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQsdGhpcy5fYW5pc29TYW1wbGVzKX1yZXR1cm4gdGhpcy5fYW5pc29TYW1wbGVzfX0sd3JhcFM6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93cmFwU30sc2V0OmZ1bmN0aW9uKHQpe2lmKHRoaXMuYmluZCgpLHkuaW5kZXhPZih0KTwwKXRocm93IG5ldyBFcnJvcigiZ2wtdGV4dHVyZTJkOiBVbmtub3duIHdyYXAgbW9kZSAiK3QpO3JldHVybiB0aGlzLmdsLnRleFBhcmFtZXRlcmkodGhpcy5nbC5URVhUVVJFXzJELHRoaXMuZ2wuVEVYVFVSRV9XUkFQX1MsdCksdGhpcy5fd3JhcFM9dH19LHdyYXBUOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd3JhcFR9LHNldDpmdW5jdGlvbih0KXtpZih0aGlzLmJpbmQoKSx5LmluZGV4T2YodCk8MCl0aHJvdyBuZXcgRXJyb3IoImdsLXRleHR1cmUyZDogVW5rbm93biB3cmFwIG1vZGUgIit0KTtyZXR1cm4gdGhpcy5nbC50ZXhQYXJhbWV0ZXJpKHRoaXMuZ2wuVEVYVFVSRV8yRCx0aGlzLmdsLlRFWFRVUkVfV1JBUF9ULHQpLHRoaXMuX3dyYXBUPXR9fSx3cmFwOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd3JhcFZlY3Rvcn0sc2V0OmZ1bmN0aW9uKHQpewppZihBcnJheS5pc0FycmF5KHQpfHwodD1bdCx0XSksMiE9PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiZ2wtdGV4dHVyZTJkOiBNdXN0IHNwZWNpZnkgd3JhcCBtb2RlIGZvciByb3dzIGFuZCBjb2x1bW5zIik7Zm9yKHZhciBlPTA7ZTwyOysrZSlpZih5LmluZGV4T2YodFtlXSk8MCl0aHJvdyBuZXcgRXJyb3IoImdsLXRleHR1cmUyZDogVW5rbm93biB3cmFwIG1vZGUgIit0KTt0aGlzLl93cmFwUz10WzBdLHRoaXMuX3dyYXBUPXRbMV07dmFyIHI9dGhpcy5nbDtyZXR1cm4gdGhpcy5iaW5kKCksci50ZXhQYXJhbWV0ZXJpKHIuVEVYVFVSRV8yRCxyLlRFWFRVUkVfV1JBUF9TLHRoaXMuX3dyYXBTKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9XUkFQX1QsdGhpcy5fd3JhcFQpLHR9fSxzaGFwZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NoYXBlVmVjdG9yfSxzZXQ6ZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheSh0KSl7aWYoMiE9PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiZ2wtdGV4dHVyZTJkOiBJbnZhbGlkIHRleHR1cmUgc2hhcGUiKX1lbHNlIHQ9WzB8dCwwfHRdO3JldHVybiBpKHRoaXMsMHx0WzBdLDB8dFsxXSksWzB8dFswXSwwfHRbMV1dfX0sd2lkdGg6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaGFwZVswXX0sc2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0PTB8dCxpKHRoaXMsdCx0aGlzLl9zaGFwZVsxXSksdH19LGhlaWdodDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NoYXBlWzFdfSxzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9MHx0LGkodGhpcyx0aGlzLl9zaGFwZVswXSx0KSx0fX19KSxiLmJpbmQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nbDtyZXR1cm4gdm9pZCAwIT09dCYmZS5hY3RpdmVUZXh0dXJlKGUuVEVYVFVSRTArKDB8dCkpLGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELHRoaXMuaGFuZGxlKSx2b2lkIDAhPT10PzB8dDplLmdldFBhcmFtZXRlcihlLkFDVElWRV9URVhUVVJFKS1lLlRFWFRVUkUwfSxiLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmdsLmRlbGV0ZVRleHR1cmUodGhpcy5oYW5kbGUpfSxiLmdlbmVyYXRlTWlwbWFwPWZ1bmN0aW9uKCl7dGhpcy5iaW5kKCksdGhpcy5nbC5nZW5lcmF0ZU1pcG1hcCh0aGlzLmdsLlRFWFRVUkVfMkQpO2Zvcih2YXIgdD1NYXRoLm1pbih0aGlzLl9zaGFwZVswXSx0aGlzLl9zaGFwZVsxXSksZT0wO3Q+MDsrK2UsdD4+Pj0xKXRoaXMuX21pcExldmVscy5pbmRleE9mKGUpPDAmJnRoaXMuX21pcExldmVscy5wdXNoKGUpfSxiLnNldFBpeGVscz1mdW5jdGlvbih0LGUscixuKXt2YXIgaT10aGlzLmdsO2lmKHRoaXMuYmluZCgpLEFycmF5LmlzQXJyYXkoZSk/KG49cixyPTB8ZVsxXSxlPTB8ZVswXSk6KGU9ZXx8MCxyPXJ8fDApLG49bnx8MCx0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnR8fHQgaW5zdGFuY2VvZiBJbWFnZURhdGF8fHQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHx0IGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudCl7dmFyIGE9dGhpcy5fbWlwTGV2ZWxzLmluZGV4T2Yobik8MDthPyhpLnRleEltYWdlMkQoaS5URVhUVVJFXzJELDAsdGhpcy5mb3JtYXQsdGhpcy5mb3JtYXQsdGhpcy50eXBlLHQpLHRoaXMuX21pcExldmVscy5wdXNoKG4pKTppLnRleFN1YkltYWdlMkQoaS5URVhUVVJFXzJELG4sZSxyLHRoaXMuZm9ybWF0LHRoaXMudHlwZSx0KX1lbHNle2lmKCEodC5zaGFwZSYmdC5zdHJpZGUmJnQuZGF0YSkpdGhyb3cgbmV3IEVycm9yKCJnbC10ZXh0dXJlMmQ6IFVuc3VwcG9ydGVkIGRhdGEgdHlwZSIpO2lmKHQuc2hhcGUubGVuZ3RoPDJ8fGUrdC5zaGFwZVsxXT50aGlzLl9zaGFwZVsxXT4+Pm58fHIrdC5zaGFwZVswXT50aGlzLl9zaGFwZVswXT4+Pm58fGU8MHx8cjwwKXRocm93IG5ldyBFcnJvcigiZ2wtdGV4dHVyZTJkOiBUZXh0dXJlIGRpbWVuc2lvbnMgYXJlIG91dCBvZiBib3VuZHMiKTtzKGksZSxyLG4sdGhpcy5mb3JtYXQsdGhpcy50eXBlLHRoaXMuX21pcExldmVscyx0KX19fSx7bmRhcnJheTo0MjcsIm5kYXJyYXktb3BzIjo0MjEsInR5cGVkYXJyYXktcG9vbCI6NDk2fV0sMjMzOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIpe2U/ZS5iaW5kKCk6dC5iaW5kQnVmZmVyKHQuRUxFTUVOVF9BUlJBWV9CVUZGRVIsbnVsbCk7dmFyIG49MHx0LmdldFBhcmFtZXRlcih0Lk1BWF9WRVJURVhfQVRUUklCUyk7aWYocil7aWYoci5sZW5ndGg+bil0aHJvdyBuZXcgRXJyb3IoImdsLXZhbzogVG9vIG1hbnkgdmVydGV4IGF0dHJpYnV0ZXMiKTtmb3IodmFyIGk9MDtpPHIubGVuZ3RoOysraSl7dmFyIGE9cltpXTtpZihhLmJ1ZmZlcil7dmFyIG89YS5idWZmZXIscz1hLnNpemV8fDQsbD1hLnR5cGV8fHQuRkxPQVQsdT0hIWEubm9ybWFsaXplZCxjPWEuc3RyaWRlfHwwLGg9YS5vZmZzZXR8fDA7by5iaW5kKCksdC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShpKSx0LnZlcnRleEF0dHJpYlBvaW50ZXIoaSxzLGwsdSxjLGgpfWVsc2V7aWYoIm51bWJlciI9PXR5cGVvZiBhKXQudmVydGV4QXR0cmliMWYoaSxhKTtlbHNlIGlmKDE9PT1hLmxlbmd0aCl0LnZlcnRleEF0dHJpYjFmKGksYVswXSk7ZWxzZSBpZigyPT09YS5sZW5ndGgpdC52ZXJ0ZXhBdHRyaWIyZihpLGFbMF0sYVsxXSk7ZWxzZSBpZigzPT09YS5sZW5ndGgpdC52ZXJ0ZXhBdHRyaWIzZihpLGFbMF0sYVsxXSxhWzJdKTtlbHNle2lmKDQhPT1hLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImdsLXZhbzogSW52YWxpZCB2ZXJ0ZXggYXR0cmlidXRlIik7dC52ZXJ0ZXhBdHRyaWI0ZihpLGFbMF0sYVsxXSxhWzJdLGFbM10pfXQuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGkpfX1mb3IoO2k8bjsrK2kpdC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoaSl9ZWxzZXt0LmJpbmRCdWZmZXIodC5BUlJBWV9CVUZGRVIsbnVsbCk7Zm9yKHZhciBpPTA7aTxuOysraSl0LmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShpKX19ZS5leHBvcnRzPW59LHt9XSwyMzQ6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt0aGlzLmdsPXQsdGhpcy5fZWxlbWVudHM9bnVsbCx0aGlzLl9hdHRyaWJ1dGVzPW51bGwsdGhpcy5fZWxlbWVudHNUeXBlPXQuVU5TSUdORURfU0hPUlR9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gbmV3IG4odCl9dmFyIGE9dCgiLi9kby1iaW5kLmpzIik7bi5wcm90b3R5cGUuYmluZD1mdW5jdGlvbigpe2EodGhpcy5nbCx0aGlzLl9lbGVtZW50cyx0aGlzLl9hdHRyaWJ1dGVzKX0sbi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQsZSxyKXt0aGlzLl9lbGVtZW50cz1lLHRoaXMuX2F0dHJpYnV0ZXM9dCx0aGlzLl9lbGVtZW50c1R5cGU9cnx8dGhpcy5nbC5VTlNJR05FRF9TSE9SVH0sbi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe30sbi5wcm90b3R5cGUudW5iaW5kPWZ1bmN0aW9uKCl7fSxuLnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKHQsZSxyKXtyPXJ8fDA7dmFyIG49dGhpcy5nbDt0aGlzLl9lbGVtZW50cz9uLmRyYXdFbGVtZW50cyh0LGUsdGhpcy5fZWxlbWVudHNUeXBlLHIpOm4uZHJhd0FycmF5cyh0LHIsZSl9LGUuZXhwb3J0cz1pfSx7Ii4vZG8tYmluZC5qcyI6MjMzfV0sMjM1OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbixpLGEpe3RoaXMubG9jYXRpb249dCx0aGlzLmRpbWVuc2lvbj1lLHRoaXMuYT1yLHRoaXMuYj1uLHRoaXMuYz1pLHRoaXMuZD1hfWZ1bmN0aW9uIGkodCxlLHIpe3RoaXMuZ2w9dCx0aGlzLl9leHQ9ZSx0aGlzLmhhbmRsZT1yLHRoaXMuX2F0dHJpYnM9W10sdGhpcy5fdXNlRWxlbWVudHM9ITEsdGhpcy5fZWxlbWVudHNUeXBlPXQuVU5TSUdORURfU0hPUlR9ZnVuY3Rpb24gYSh0LGUpe3JldHVybiBuZXcgaSh0LGUsZS5jcmVhdGVWZXJ0ZXhBcnJheU9FUygpKX12YXIgbz10KCIuL2RvLWJpbmQuanMiKTtuLnByb3RvdHlwZS5iaW5kPWZ1bmN0aW9uKHQpe3N3aXRjaCh0aGlzLmRpbWVuc2lvbil7Y2FzZSAxOnQudmVydGV4QXR0cmliMWYodGhpcy5sb2NhdGlvbix0aGlzLmEpO2JyZWFrO2Nhc2UgMjp0LnZlcnRleEF0dHJpYjJmKHRoaXMubG9jYXRpb24sdGhpcy5hLHRoaXMuYik7YnJlYWs7Y2FzZSAzOnQudmVydGV4QXR0cmliM2YodGhpcy5sb2NhdGlvbix0aGlzLmEsdGhpcy5iLHRoaXMuYyk7YnJlYWs7Y2FzZSA0OnQudmVydGV4QXR0cmliNGYodGhpcy5sb2NhdGlvbix0aGlzLmEsdGhpcy5iLHRoaXMuYyx0aGlzLmQpfX0saS5wcm90b3R5cGUuYmluZD1mdW5jdGlvbigpe3RoaXMuX2V4dC5iaW5kVmVydGV4QXJyYXlPRVModGhpcy5oYW5kbGUpO2Zvcih2YXIgdD0wO3Q8dGhpcy5fYXR0cmlicy5sZW5ndGg7Kyt0KXRoaXMuX2F0dHJpYnNbdF0uYmluZCh0aGlzLmdsKX0saS5wcm90b3R5cGUudW5iaW5kPWZ1bmN0aW9uKCl7dGhpcy5fZXh0LmJpbmRWZXJ0ZXhBcnJheU9FUyhudWxsKX0saS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuX2V4dC5kZWxldGVWZXJ0ZXhBcnJheU9FUyh0aGlzLmhhbmRsZSl9LGkucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0LGUscil7aWYodGhpcy5iaW5kKCksbyh0aGlzLmdsLGUsdCksdGhpcy51bmJpbmQoKSx0aGlzLl9hdHRyaWJzLmxlbmd0aD0wLHQpZm9yKHZhciBpPTA7aTx0Lmxlbmd0aDsrK2kpe3ZhciBhPXRbaV07Im51bWJlciI9PXR5cGVvZiBhP3RoaXMuX2F0dHJpYnMucHVzaChuZXcgbihpLDEsYSkpOkFycmF5LmlzQXJyYXkoYSkmJnRoaXMuX2F0dHJpYnMucHVzaChuZXcgbihpLGEubGVuZ3RoLGFbMF0sYVsxXSxhWzJdLGFbM10pKX10aGlzLl91c2VFbGVtZW50cz0hIWUsdGhpcy5fZWxlbWVudHNUeXBlPXJ8fHRoaXMuZ2wuVU5TSUdORURfU0hPUlR9LGkucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24odCxlLHIpe3I9cnx8MDt2YXIgbj10aGlzLmdsO3RoaXMuX3VzZUVsZW1lbnRzP24uZHJhd0VsZW1lbnRzKHQsZSx0aGlzLl9lbGVtZW50c1R5cGUscik6bi5kcmF3QXJyYXlzKHQscixlKX0sZS5leHBvcnRzPWF9LHsiLi9kby1iaW5kLmpzIjoyMzN9XSwyMzY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt0aGlzLmJpbmRWZXJ0ZXhBcnJheU9FUz10LmJpbmRWZXJ0ZXhBcnJheS5iaW5kKHQpLHRoaXMuY3JlYXRlVmVydGV4QXJyYXlPRVM9dC5jcmVhdGVWZXJ0ZXhBcnJheS5iaW5kKHQpLHRoaXMuZGVsZXRlVmVydGV4QXJyYXlPRVM9dC5kZWxldGVWZXJ0ZXhBcnJheS5iaW5kKHQpfWZ1bmN0aW9uIGkodCxlLHIsaSl7dmFyIHMsbD10LmNyZWF0ZVZlcnRleEFycmF5P25ldyBuKHQpOnQuZ2V0RXh0ZW5zaW9uKCJPRVNfdmVydGV4X2FycmF5X29iamVjdCIpO3JldHVybiBzPWw/YSh0LGwpOm8odCkscy51cGRhdGUoZSxyLGkpLHN9dmFyIGE9dCgiLi9saWIvdmFvLW5hdGl2ZS5qcyIpLG89dCgiLi9saWIvdmFvLWVtdWxhdGVkLmpzIik7ZS5leHBvcnRzPWl9LHsiLi9saWIvdmFvLWVtdWxhdGVkLmpzIjoyMzQsIi4vbGliL3Zhby1uYXRpdmUuanMiOjIzNX1dLDIzNzpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlLHIpe3ZhciBuPWVbMF0saT1lWzFdLGE9ZVsyXSxvPXJbMF0scz1yWzFdLGw9clsyXTtyZXR1cm4gdFswXT1pKmwtYSpzLHRbMV09YSpvLW4qbCx0WzJdPW4qcy1pKm8sdH1lLmV4cG9ydHM9bn0se31dLDIzODpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gdFswXSplWzBdK3RbMV0qZVsxXSt0WzJdKmVbMl19ZS5leHBvcnRzPW59LHt9XSwyMzk6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQpe3ZhciBlPXRbMF0scj10WzFdLG49dFsyXTtyZXR1cm4gTWF0aC5zcXJ0KGUqZStyKnIrbipuKX1lLmV4cG9ydHM9bn0se31dLDI0MDpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlLHIsbil7dmFyIGk9ZVswXSxhPWVbMV0sbz1lWzJdO3JldHVybiB0WzBdPWkrbiooclswXS1pKSx0WzFdPWErbiooclsxXS1hKSx0WzJdPW8rbiooclsyXS1vKSx0fWUuZXhwb3J0cz1ufSx7fV0sMjQxOltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUpe3ZhciByPWVbMF0sbj1lWzFdLGk9ZVsyXSxhPXIqcituKm4raSppO3JldHVybiBhPjAmJihhPTEvTWF0aC5zcXJ0KGEpLHRbMF09ZVswXSphLHRbMV09ZVsxXSphLHRbMl09ZVsyXSphKSx0fWUuZXhwb3J0cz1ufSx7fV0sMjQyOltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUscil7dmFyIG49ZVswXSxpPWVbMV0sYT1lWzJdLG89ZVszXTtyZXR1cm4gdFswXT1yWzBdKm4rcls0XSppK3JbOF0qYStyWzEyXSpvLHRbMV09clsxXSpuK3JbNV0qaStyWzldKmErclsxM10qbyx0WzJdPXJbMl0qbityWzZdKmkrclsxMF0qYStyWzE0XSpvLHRbM109clszXSpuK3JbN10qaStyWzExXSphK3JbMTVdKm8sdH1lLmV4cG9ydHM9bn0se31dLDI0MzpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlLHIsbil7cmV0dXJuIGlbMF09bixpWzFdPXIsaVsyXT1lLGlbM109dCxhWzBdfWUuZXhwb3J0cz1uO3ZhciBpPW5ldyBVaW50OEFycmF5KDQpLGE9bmV3IEZsb2F0MzJBcnJheShpLmJ1ZmZlcil9LHt9XSwyNDQ6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQpe2Zvcih2YXIgZT1BcnJheS5pc0FycmF5KHQpP3Q6aSh0KSxyPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBuPWVbcl07aWYoInByZXByb2Nlc3NvciI9PT1uLnR5cGUpe3ZhciBvPW4uZGF0YS5tYXRjaCgvXCNkZWZpbmVccytTSEFERVJfTkFNRShfQjY0KT9ccysoLispJC8pO2lmKG8mJm9bMl0pe3ZhciBzPW9bMV0sbD1vWzJdO3JldHVybihzP2EobCk6bCkudHJpbSgpfX19fXZhciBpPXQoImdsc2wtdG9rZW5pemVyIiksYT10KCJhdG9iLWxpdGUiKTtlLmV4cG9ydHM9bn0seyJhdG9iLWxpdGUiOjM1LCJnbHNsLXRva2VuaXplciI6MjUxfV0sMjQ1OltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0KXtmdW5jdGlvbiBlKHQpe3QubGVuZ3RoJiZWLnB1c2goe3R5cGU6TVtCXSxkYXRhOnQscG9zaXRpb246RyxsaW5lOnEsY29sdW1uOkh9KX1mdW5jdGlvbiByKHQpe2o9MCxXKz10LEY9Vy5sZW5ndGg7Zm9yKHZhciBlO1I9V1tqXSxqPEY7KXtzd2l0Y2goZT1qLEIpe2Nhc2UgaDpqPVMoKTticmVhaztjYXNlIGY6aj1FKCk7YnJlYWs7Y2FzZSBkOmo9VCgpO2JyZWFrO2Nhc2UgcDpqPUwoKTticmVhaztjYXNlIGc6aj1JKCk7YnJlYWs7Y2FzZSB3Omo9QygpO2JyZWFrO2Nhc2UgbTpqPVAoKTticmVhaztjYXNlIGM6aj1EKCk7YnJlYWs7Y2FzZSBiOmo9aygpO2JyZWFrO2Nhc2UgdTpqPUEoKX1pZihlIT09ailzd2l0Y2goV1tlXSl7Y2FzZSJcbiI6SD0wLCsrcTticmVhaztkZWZhdWx0OisrSH19cmV0dXJuIE4rPWosVz1XLnNsaWNlKGopLFZ9ZnVuY3Rpb24gbih0KXtyZXR1cm4gVS5sZW5ndGgmJmUoVS5qb2luKCIiKSksQj1fLGUoIihlb2YpIiksVn1mdW5jdGlvbiBBKCl7cmV0dXJuIFU9VS5sZW5ndGg/W106VSwiLyI9PT1PJiYiKiI9PT1SPyhHPU4rai0xLEI9aCxPPVIsaisxKToiLyI9PT1PJiYiLyI9PT1SPyhHPU4rai0xLEI9ZixPPVIsaisxKToiIyI9PT1SPyhCPWQsRz1OK2osaik6L1xzLy50ZXN0KFIpPyhCPWIsRz1OK2osaik6KFg9L1xkLy50ZXN0KFIpLFk9L1teXHdfXS8udGVzdChSKSxHPU4raixCPVg/ZzpZP3A6YyxqKX1mdW5jdGlvbiBrKCl7cmV0dXJuL1teXHNdL2cudGVzdChSKT8oZShVLmpvaW4oIiIpKSxCPXUsaik6KFUucHVzaChSKSxPPVIsaisxKX1mdW5jdGlvbiBUKCl7cmV0dXJuIlxyIiE9PVImJiJcbiIhPT1SfHwiXFwiPT09Tz8oVS5wdXNoKFIpLE89UixqKzEpOihlKFUuam9pbigiIikpLEI9dSxqKX1mdW5jdGlvbiBFKCl7cmV0dXJuIFQoKX1mdW5jdGlvbiBTKCl7cmV0dXJuIi8iPT09UiYmIioiPT09Tz8oVS5wdXNoKFIpLGUoVS5qb2luKCIiKSksQj11LGorMSk6KFUucHVzaChSKSxPPVIsaisxKX1mdW5jdGlvbiBMKCl7aWYoIi4iPT09TyYmL1xkLy50ZXN0KFIpKXJldHVybiBCPW0sajtpZigiLyI9PT1PJiYiKiI9PT1SKXJldHVybiBCPWgsajtpZigiLyI9PT1PJiYiLyI9PT1SKXJldHVybiBCPWYsajtpZigiLiI9PT1SJiZVLmxlbmd0aCl7Zm9yKDt6KFUpOyk7cmV0dXJuIEI9bSxqfWlmKCI7Ij09PVJ8fCIpIj09PVJ8fCIoIj09PVIpe2lmKFUubGVuZ3RoKWZvcig7eihVKTspO3JldHVybiBlKFIpLEI9dSxqKzF9dmFyIHQ9Mj09PVUubGVuZ3RoJiYiPSIhPT1SO2lmKC9bXHdfXGRcc10vLnRlc3QoUil8fHQpe2Zvcig7eihVKTspO3JldHVybiBCPXUsan1yZXR1cm4gVS5wdXNoKFIpLE89UixqKzF9ZnVuY3Rpb24geih0KXtmb3IodmFyIHIsbixpPTA7Oyl7aWYocj1hLmluZGV4T2YodC5zbGljZSgwLHQubGVuZ3RoK2kpLmpvaW4oIiIpKSxuPWFbcl0scj09PS0xKXtpZihpLS0rdC5sZW5ndGg+MCljb250aW51ZTtuPXQuc2xpY2UoMCwxKS5qb2luKCIiKX1yZXR1cm4gZShuKSxHKz1uLmxlbmd0aCxVPVUuc2xpY2Uobi5sZW5ndGgpLFUubGVuZ3RofX1mdW5jdGlvbiBDKCl7cmV0dXJuL1teYS1mQS1GMC05XS8udGVzdChSKT8oZShVLmpvaW4oIiIpKSxCPXUsaik6KFUucHVzaChSKSxPPVIsaisxKX1mdW5jdGlvbiBJKCl7cmV0dXJuIi4iPT09Uj8oVS5wdXNoKFIpLEI9bSxPPVIsaisxKTovW2VFXS8udGVzdChSKT8oVS5wdXNoKFIpLEI9bSxPPVIsaisxKToieCI9PT1SJiYxPT09VS5sZW5ndGgmJiIwIj09PVVbMF0/KEI9dyxVLnB1c2goUiksTz1SLGorMSk6L1teXGRdLy50ZXN0KFIpPyhlKFUuam9pbigiIikpLEI9dSxqKTooVS5wdXNoKFIpLE89UixqKzEpfWZ1bmN0aW9uIFAoKXtyZXR1cm4iZiI9PT1SJiYoVS5wdXNoKFIpLE89UixqKz0xKSwvW2VFXS8udGVzdChSKT8oVS5wdXNoKFIpLE89UixqKzEpOiItIj09PVImJi9bZUVdLy50ZXN0KE8pPyhVLnB1c2goUiksTz1SLGorMSk6L1teXGRdLy50ZXN0KFIpPyhlKFUuam9pbigiIikpLEI9dSxqKTooVS5wdXNoKFIpLE89UixqKzEpfWZ1bmN0aW9uIEQoKXtpZigvW15cZFx3X10vLnRlc3QoUikpe3ZhciB0PVUuam9pbigiIik7cmV0dXJuIEI9US5pbmRleE9mKHQpPi0xP3g6Wi5pbmRleE9mKHQpPi0xP3k6dixlKFUuam9pbigiIikpLEI9dSxqfXJldHVybiBVLnB1c2goUiksTz1SLGorMX12YXIgUixPLEYsaj0wLE49MCxCPXUsVT1bXSxWPVtdLHE9MSxIPTAsRz0wLFg9ITEsWT0hMSxXPSIiO3Q9dHx8e307dmFyIFo9byxRPWk7cmV0dXJuIjMwMCBlcyI9PT10LnZlcnNpb24mJihaPWwsUT1zKSxmdW5jdGlvbih0KXtyZXR1cm4gVj1bXSxudWxsIT09dD9yKHQucmVwbGFjZT90LnJlcGxhY2UoL1xyXG4vZywiXG4iKTp0KTpuKCl9fWUuZXhwb3J0cz1uO3ZhciBpPXQoIi4vbGliL2xpdGVyYWxzIiksYT10KCIuL2xpYi9vcGVyYXRvcnMiKSxvPXQoIi4vbGliL2J1aWx0aW5zIikscz10KCIuL2xpYi9saXRlcmFscy0zMDBlcyIpLGw9dCgiLi9saWIvYnVpbHRpbnMtMzAwZXMiKSx1PTk5OSxjPTk5OTksaD0wLGY9MSxkPTIscD0zLGc9NCxtPTUsdj02LHk9Nyx4PTgsYj05LF89MTAsdz0xMSxNPVsiYmxvY2stY29tbWVudCIsImxpbmUtY29tbWVudCIsInByZXByb2Nlc3NvciIsIm9wZXJhdG9yIiwiaW50ZWdlciIsImZsb2F0IiwiaWRlbnQiLCJidWlsdGluIiwia2V5d29yZCIsIndoaXRlc3BhY2UiLCJlb2YiLCJpbnRlZ2VyIl19LHsiLi9saWIvYnVpbHRpbnMiOjI0NywiLi9saWIvYnVpbHRpbnMtMzAwZXMiOjI0NiwiLi9saWIvbGl0ZXJhbHMiOjI0OSwiLi9saWIvbGl0ZXJhbHMtMzAwZXMiOjI0OCwiLi9saWIvb3BlcmF0b3JzIjoyNTB9XSwyNDY6W2Z1bmN0aW9uKHQsZSxyKXt2YXIgbj10KCIuL2J1aWx0aW5zIik7bj1uLnNsaWNlKCkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiEvXihnbFxffHRleHR1cmUpLy50ZXN0KHQpfSksZS5leHBvcnRzPW4uY29uY2F0KFsiZ2xfVmVydGV4SUQiLCJnbF9JbnN0YW5jZUlEIiwiZ2xfUG9zaXRpb24iLCJnbF9Qb2ludFNpemUiLCJnbF9GcmFnQ29vcmQiLCJnbF9Gcm9udEZhY2luZyIsImdsX0ZyYWdEZXB0aCIsImdsX1BvaW50Q29vcmQiLCJnbF9NYXhWZXJ0ZXhBdHRyaWJzIiwiZ2xfTWF4VmVydGV4VW5pZm9ybVZlY3RvcnMiLCJnbF9NYXhWZXJ0ZXhPdXRwdXRWZWN0b3JzIiwiZ2xfTWF4RnJhZ21lbnRJbnB1dFZlY3RvcnMiLCJnbF9NYXhWZXJ0ZXhUZXh0dXJlSW1hZ2VVbml0cyIsImdsX01heENvbWJpbmVkVGV4dHVyZUltYWdlVW5pdHMiLCJnbF9NYXhUZXh0dXJlSW1hZ2VVbml0cyIsImdsX01heEZyYWdtZW50VW5pZm9ybVZlY3RvcnMiLCJnbF9NYXhEcmF3QnVmZmVycyIsImdsX01pblByb2dyYW1UZXhlbE9mZnNldCIsImdsX01heFByb2dyYW1UZXhlbE9mZnNldCIsImdsX0RlcHRoUmFuZ2VQYXJhbWV0ZXJzIiwiZ2xfRGVwdGhSYW5nZSIsInRydW5jIiwicm91bmQiLCJyb3VuZEV2ZW4iLCJpc25hbiIsImlzaW5mIiwiZmxvYXRCaXRzVG9JbnQiLCJmbG9hdEJpdHNUb1VpbnQiLCJpbnRCaXRzVG9GbG9hdCIsInVpbnRCaXRzVG9GbG9hdCIsInBhY2tTbm9ybTJ4MTYiLCJ1bnBhY2tTbm9ybTJ4MTYiLCJwYWNrVW5vcm0yeDE2IiwidW5wYWNrVW5vcm0yeDE2IiwicGFja0hhbGYyeDE2IiwidW5wYWNrSGFsZjJ4MTYiLCJvdXRlclByb2R1Y3QiLCJ0cmFuc3Bvc2UiLCJkZXRlcm1pbmFudCIsImludmVyc2UiLCJ0ZXh0dXJlIiwidGV4dHVyZVNpemUiLCJ0ZXh0dXJlUHJvaiIsInRleHR1cmVMb2QiLCJ0ZXh0dXJlT2Zmc2V0IiwidGV4ZWxGZXRjaCIsInRleGVsRmV0Y2hPZmZzZXQiLCJ0ZXh0dXJlUHJvak9mZnNldCIsInRleHR1cmVMb2RPZmZzZXQiLCJ0ZXh0dXJlUHJvakxvZCIsInRleHR1cmVQcm9qTG9kT2Zmc2V0IiwidGV4dHVyZUdyYWQiLCJ0ZXh0dXJlR3JhZE9mZnNldCIsInRleHR1cmVQcm9qR3JhZCIsInRleHR1cmVQcm9qR3JhZE9mZnNldCJdKX0seyIuL2J1aWx0aW5zIjoyNDd9XSwyNDc6W2Z1bmN0aW9uKHQsZSxyKXtlLmV4cG9ydHM9WyJhYnMiLCJhY29zIiwiYWxsIiwiYW55IiwiYXNpbiIsImF0YW4iLCJjZWlsIiwiY2xhbXAiLCJjb3MiLCJjcm9zcyIsImRGZHgiLCJkRmR5IiwiZGVncmVlcyIsImRpc3RhbmNlIiwiZG90IiwiZXF1YWwiLCJleHAiLCJleHAyIiwiZmFjZWZvcndhcmQiLCJmbG9vciIsImZyYWN0IiwiZ2xfQmFja0NvbG9yIiwiZ2xfQmFja0xpZ2h0TW9kZWxQcm9kdWN0IiwiZ2xfQmFja0xpZ2h0UHJvZHVjdCIsImdsX0JhY2tNYXRlcmlhbCIsImdsX0JhY2tTZWNvbmRhcnlDb2xvciIsImdsX0NsaXBQbGFuZSIsImdsX0NsaXBWZXJ0ZXgiLCJnbF9Db2xvciIsImdsX0RlcHRoUmFuZ2UiLCJnbF9EZXB0aFJhbmdlUGFyYW1ldGVycyIsImdsX0V5ZVBsYW5lUSIsImdsX0V5ZVBsYW5lUiIsImdsX0V5ZVBsYW5lUyIsImdsX0V5ZVBsYW5lVCIsImdsX0ZvZyIsImdsX0ZvZ0Nvb3JkIiwiZ2xfRm9nRnJhZ0Nvb3JkIiwiZ2xfRm9nUGFyYW1ldGVycyIsImdsX0ZyYWdDb2xvciIsImdsX0ZyYWdDb29yZCIsImdsX0ZyYWdEYXRhIiwiZ2xfRnJhZ0RlcHRoIiwiZ2xfRnJhZ0RlcHRoRVhUIiwiZ2xfRnJvbnRDb2xvciIsImdsX0Zyb250RmFjaW5nIiwiZ2xfRnJvbnRMaWdodE1vZGVsUHJvZHVjdCIsImdsX0Zyb250TGlnaHRQcm9kdWN0IiwiZ2xfRnJvbnRNYXRlcmlhbCIsImdsX0Zyb250U2Vjb25kYXJ5Q29sb3IiLCJnbF9MaWdodE1vZGVsIiwiZ2xfTGlnaHRNb2RlbFBhcmFtZXRlcnMiLCJnbF9MaWdodE1vZGVsUHJvZHVjdHMiLCJnbF9MaWdodFByb2R1Y3RzIiwiZ2xfTGlnaHRTb3VyY2UiLCJnbF9MaWdodFNvdXJjZVBhcmFtZXRlcnMiLCJnbF9NYXRlcmlhbFBhcmFtZXRlcnMiLCJnbF9NYXhDbGlwUGxhbmVzIiwiZ2xfTWF4Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0cyIsImdsX01heERyYXdCdWZmZXJzIiwiZ2xfTWF4RnJhZ21lbnRVbmlmb3JtQ29tcG9uZW50cyIsImdsX01heExpZ2h0cyIsImdsX01heFRleHR1cmVDb29yZHMiLCJnbF9NYXhUZXh0dXJlSW1hZ2VVbml0cyIsImdsX01heFRleHR1cmVVbml0cyIsImdsX01heFZhcnlpbmdGbG9hdHMiLCJnbF9NYXhWZXJ0ZXhBdHRyaWJzIiwiZ2xfTWF4VmVydGV4VGV4dHVyZUltYWdlVW5pdHMiLCJnbF9NYXhWZXJ0ZXhVbmlmb3JtQ29tcG9uZW50cyIsImdsX01vZGVsVmlld01hdHJpeCIsImdsX01vZGVsVmlld01hdHJpeEludmVyc2UiLCJnbF9Nb2RlbFZpZXdNYXRyaXhJbnZlcnNlVHJhbnNwb3NlIiwiZ2xfTW9kZWxWaWV3TWF0cml4VHJhbnNwb3NlIiwiZ2xfTW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeCIsImdsX01vZGVsVmlld1Byb2plY3Rpb25NYXRyaXhJbnZlcnNlIiwiZ2xfTW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeEludmVyc2VUcmFuc3Bvc2UiLCJnbF9Nb2RlbFZpZXdQcm9qZWN0aW9uTWF0cml4VHJhbnNwb3NlIiwiZ2xfTXVsdGlUZXhDb29yZDAiLCJnbF9NdWx0aVRleENvb3JkMSIsImdsX011bHRpVGV4Q29vcmQyIiwiZ2xfTXVsdGlUZXhDb29yZDMiLCJnbF9NdWx0aVRleENvb3JkNCIsImdsX011bHRpVGV4Q29vcmQ1IiwiZ2xfTXVsdGlUZXhDb29yZDYiLCJnbF9NdWx0aVRleENvb3JkNyIsImdsX05vcm1hbCIsImdsX05vcm1hbE1hdHJpeCIsImdsX05vcm1hbFNjYWxlIiwiZ2xfT2JqZWN0UGxhbmVRIiwiZ2xfT2JqZWN0UGxhbmVSIiwiZ2xfT2JqZWN0UGxhbmVTIiwiZ2xfT2JqZWN0UGxhbmVUIiwiZ2xfUG9pbnQiLCJnbF9Qb2ludENvb3JkIiwiZ2xfUG9pbnRQYXJhbWV0ZXJzIiwiZ2xfUG9pbnRTaXplIiwiZ2xfUG9zaXRpb24iLCJnbF9Qcm9qZWN0aW9uTWF0cml4IiwiZ2xfUHJvamVjdGlvbk1hdHJpeEludmVyc2UiLCJnbF9Qcm9qZWN0aW9uTWF0cml4SW52ZXJzZVRyYW5zcG9zZSIsImdsX1Byb2plY3Rpb25NYXRyaXhUcmFuc3Bvc2UiLCJnbF9TZWNvbmRhcnlDb2xvciIsImdsX1RleENvb3JkIiwiZ2xfVGV4dHVyZUVudkNvbG9yIiwiZ2xfVGV4dHVyZU1hdHJpeCIsImdsX1RleHR1cmVNYXRyaXhJbnZlcnNlIiwiZ2xfVGV4dHVyZU1hdHJpeEludmVyc2VUcmFuc3Bvc2UiLCJnbF9UZXh0dXJlTWF0cml4VHJhbnNwb3NlIiwiZ2xfVmVydGV4IiwiZ3JlYXRlclRoYW4iLCJncmVhdGVyVGhhbkVxdWFsIiwiaW52ZXJzZXNxcnQiLCJsZW5ndGgiLCJsZXNzVGhhbiIsImxlc3NUaGFuRXF1YWwiLCJsb2ciLCJsb2cyIiwibWF0cml4Q29tcE11bHQiLCJtYXgiLCJtaW4iLCJtaXgiLCJtb2QiLCJub3JtYWxpemUiLCJub3QiLCJub3RFcXVhbCIsInBvdyIsInJhZGlhbnMiLCJyZWZsZWN0IiwicmVmcmFjdCIsInNpZ24iLCJzaW4iLCJzbW9vdGhzdGVwIiwic3FydCIsInN0ZXAiLCJ0YW4iLCJ0ZXh0dXJlMkQiLCJ0ZXh0dXJlMkRMb2QiLCJ0ZXh0dXJlMkRQcm9qIiwidGV4dHVyZTJEUHJvakxvZCIsInRleHR1cmVDdWJlIiwidGV4dHVyZUN1YmVMb2QiLCJ0ZXh0dXJlMkRMb2RFWFQiLCJ0ZXh0dXJlMkRQcm9qTG9kRVhUIiwidGV4dHVyZUN1YmVMb2RFWFQiLCJ0ZXh0dXJlMkRHcmFkRVhUIiwidGV4dHVyZTJEUHJvakdyYWRFWFQiLCJ0ZXh0dXJlQ3ViZUdyYWRFWFQiXX0se31dLDI0ODpbZnVuY3Rpb24odCxlLHIpe3ZhciBuPXQoIi4vbGl0ZXJhbHMiKTtlLmV4cG9ydHM9bi5zbGljZSgpLmNvbmNhdChbImxheW91dCIsImNlbnRyb2lkIiwic21vb3RoIiwiY2FzZSIsIm1hdDJ4MiIsIm1hdDJ4MyIsIm1hdDJ4NCIsIm1hdDN4MiIsIm1hdDN4MyIsIm1hdDN4NCIsIm1hdDR4MiIsIm1hdDR4MyIsIm1hdDR4NCIsInVpbnQiLCJ1dmVjMiIsInV2ZWMzIiwidXZlYzQiLCJzYW1wbGVyQ3ViZVNoYWRvdyIsInNhbXBsZXIyREFycmF5Iiwic2FtcGxlcjJEQXJyYXlTaGFkb3ciLCJpc2FtcGxlcjJEIiwiaXNhbXBsZXIzRCIsImlzYW1wbGVyQ3ViZSIsImlzYW1wbGVyMkRBcnJheSIsInVzYW1wbGVyMkQiLCJ1c2FtcGxlcjNEIiwidXNhbXBsZXJDdWJlIiwidXNhbXBsZXIyREFycmF5IiwiY29oZXJlbnQiLCJyZXN0cmljdCIsInJlYWRvbmx5Iiwid3JpdGVvbmx5IiwicmVzb3VyY2UiLCJhdG9taWNfdWludCIsIm5vcGVyc3BlY3RpdmUiLCJwYXRjaCIsInNhbXBsZSIsInN1YnJvdXRpbmUiLCJjb21tb24iLCJwYXJ0aXRpb24iLCJhY3RpdmUiLCJmaWx0ZXIiLCJpbWFnZTFEIiwiaW1hZ2UyRCIsImltYWdlM0QiLCJpbWFnZUN1YmUiLCJpaW1hZ2UxRCIsImlpbWFnZTJEIiwiaWltYWdlM0QiLCJpaW1hZ2VDdWJlIiwidWltYWdlMUQiLCJ1aW1hZ2UyRCIsInVpbWFnZTNEIiwidWltYWdlQ3ViZSIsImltYWdlMURBcnJheSIsImltYWdlMkRBcnJheSIsImlpbWFnZTFEQXJyYXkiLCJpaW1hZ2UyREFycmF5IiwidWltYWdlMURBcnJheSIsInVpbWFnZTJEQXJyYXkiLCJpbWFnZTFEU2hhZG93IiwiaW1hZ2UyRFNoYWRvdyIsImltYWdlMURBcnJheVNoYWRvdyIsImltYWdlMkRBcnJheVNoYWRvdyIsImltYWdlQnVmZmVyIiwiaWltYWdlQnVmZmVyIiwidWltYWdlQnVmZmVyIiwic2FtcGxlcjFEQXJyYXkiLCJzYW1wbGVyMURBcnJheVNoYWRvdyIsImlzYW1wbGVyMUQiLCJpc2FtcGxlcjFEQXJyYXkiLCJ1c2FtcGxlcjFEIiwidXNhbXBsZXIxREFycmF5IiwiaXNhbXBsZXIyRFJlY3QiLCJ1c2FtcGxlcjJEUmVjdCIsInNhbXBsZXJCdWZmZXIiLCJpc2FtcGxlckJ1ZmZlciIsInVzYW1wbGVyQnVmZmVyIiwic2FtcGxlcjJETVMiLCJpc2FtcGxlcjJETVMiLCJ1c2FtcGxlcjJETVMiLCJzYW1wbGVyMkRNU0FycmF5IiwiaXNhbXBsZXIyRE1TQXJyYXkiLCJ1c2FtcGxlcjJETVNBcnJheSJdKX0seyIuL2xpdGVyYWxzIjoyNDl9XSwyNDk6W2Z1bmN0aW9uKHQsZSxyKXtlLmV4cG9ydHM9WyJwcmVjaXNpb24iLCJoaWdocCIsIm1lZGl1bXAiLCJsb3dwIiwiYXR0cmlidXRlIiwiY29uc3QiLCJ1bmlmb3JtIiwidmFyeWluZyIsImJyZWFrIiwiY29udGludWUiLCJkbyIsImZvciIsIndoaWxlIiwiaWYiLCJlbHNlIiwiaW4iLCJvdXQiLCJpbm91dCIsImZsb2F0IiwiaW50Iiwidm9pZCIsImJvb2wiLCJ0cnVlIiwiZmFsc2UiLCJkaXNjYXJkIiwicmV0dXJuIiwibWF0MiIsIm1hdDMiLCJtYXQ0IiwidmVjMiIsInZlYzMiLCJ2ZWM0IiwiaXZlYzIiLCJpdmVjMyIsIml2ZWM0IiwiYnZlYzIiLCJidmVjMyIsImJ2ZWM0Iiwic2FtcGxlcjFEIiwic2FtcGxlcjJEIiwic2FtcGxlcjNEIiwic2FtcGxlckN1YmUiLCJzYW1wbGVyMURTaGFkb3ciLCJzYW1wbGVyMkRTaGFkb3ciLCJzdHJ1Y3QiLCJhc20iLCJjbGFzcyIsInVuaW9uIiwiZW51bSIsInR5cGVkZWYiLCJ0ZW1wbGF0ZSIsInRoaXMiLCJwYWNrZWQiLCJnb3RvIiwic3dpdGNoIiwiZGVmYXVsdCIsImlubGluZSIsIm5vaW5saW5lIiwidm9sYXRpbGUiLCJwdWJsaWMiLCJzdGF0aWMiLCJleHRlcm4iLCJleHRlcm5hbCIsImludGVyZmFjZSIsImxvbmciLCJzaG9ydCIsImRvdWJsZSIsImhhbGYiLCJmaXhlZCIsInVuc2lnbmVkIiwiaW5wdXQiLCJvdXRwdXQiLCJodmVjMiIsImh2ZWMzIiwiaHZlYzQiLCJkdmVjMiIsImR2ZWMzIiwiZHZlYzQiLCJmdmVjMiIsImZ2ZWMzIiwiZnZlYzQiLCJzYW1wbGVyMkRSZWN0Iiwic2FtcGxlcjNEUmVjdCIsInNhbXBsZXIyRFJlY3RTaGFkb3ciLCJzaXplb2YiLCJjYXN0IiwibmFtZXNwYWNlIiwidXNpbmciXX0se31dLDI1MDpbZnVuY3Rpb24odCxlLHIpe2UuZXhwb3J0cz1bIjw8PSIsIj4+PSIsIisrIiwiLS0iLCI8PCIsIj4+IiwiPD0iLCI+PSIsIj09IiwiIT0iLCImJiIsInx8IiwiKz0iLCItPSIsIio9IiwiLz0iLCIlPSIsIiY9IiwiXl4iLCJePSIsInw9IiwiKCIsIikiLCJbIiwiXSIsIi4iLCIhIiwifiIsIioiLCIvIiwiJSIsIisiLCItIiwiPCIsIj4iLCImIiwiXiIsInwiLCI/IiwiOiIsIj0iLCIsIiwiOyIsInsiLCJ9Il19LHt9XSwyNTE6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSl7dmFyIHI9aShlKSxuPVtdO3JldHVybiBuPW4uY29uY2F0KHIodCkpLG49bi5jb25jYXQocihudWxsKSl9dmFyIGk9dCgiLi9pbmRleCIpO2UuZXhwb3J0cz1ufSx7Ii4vaW5kZXgiOjI0NX1dLDI1MjpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyKXt2YXIgbj10aGlzLmNlbGxzPVtdO2lmKHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcil7dGhpcy5hcnJheUJ1ZmZlcj10O3ZhciBhPW5ldyBJbnQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO3Q9YVswXSxlPWFbMV0scj1hWzJdLHRoaXMuZD1lKzIqcjtmb3IodmFyIG89MDtvPHRoaXMuZCp0aGlzLmQ7bysrKXt2YXIgcz1hW2krb10sbD1hW2krbysxXTtuLnB1c2gocz09PWw/bnVsbDphLnN1YmFycmF5KHMsbCkpfXZhciB1PWFbaStuLmxlbmd0aF0sYz1hW2krbi5sZW5ndGgrMV07dGhpcy5rZXlzPWEuc3ViYXJyYXkodSxjKSx0aGlzLmJib3hlcz1hLnN1YmFycmF5KGMpLHRoaXMuaW5zZXJ0PXRoaXMuX2luc2VydFJlYWRvbmx5fWVsc2V7dGhpcy5kPWUrMipyO2Zvcih2YXIgaD0wO2g8dGhpcy5kKnRoaXMuZDtoKyspbi5wdXNoKFtdKTt0aGlzLmtleXM9W10sdGhpcy5iYm94ZXM9W119dGhpcy5uPWUsdGhpcy5leHRlbnQ9dCx0aGlzLnBhZGRpbmc9cix0aGlzLnNjYWxlPWUvdCx0aGlzLnVpZD0wO3ZhciBmPXIvZSp0O3RoaXMubWluPS1mLHRoaXMubWF4PXQrZn1lLmV4cG9ydHM9bjt2YXIgaT0zO24ucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0LGUscixuLGkpe3RoaXMuX2ZvckVhY2hDZWxsKGUscixuLGksdGhpcy5faW5zZXJ0Q2VsbCx0aGlzLnVpZCsrKSx0aGlzLmtleXMucHVzaCh0KSx0aGlzLmJib3hlcy5wdXNoKGUpLHRoaXMuYmJveGVzLnB1c2gociksdGhpcy5iYm94ZXMucHVzaChuKSx0aGlzLmJib3hlcy5wdXNoKGkpfSxuLnByb3RvdHlwZS5faW5zZXJ0UmVhZG9ubHk9ZnVuY3Rpb24oKXt0aHJvdyJDYW5ub3QgaW5zZXJ0IGludG8gYSBHcmlkSW5kZXggY3JlYXRlZCBmcm9tIGFuIEFycmF5QnVmZmVyLiJ9LG4ucHJvdG90eXBlLl9pbnNlcnRDZWxsPWZ1bmN0aW9uKHQsZSxyLG4saSxhKXt0aGlzLmNlbGxzW2ldLnB1c2goYSl9LG4ucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPXRoaXMubWluLGE9dGhpcy5tYXg7aWYodDw9aSYmZTw9aSYmYTw9ciYmYTw9bilyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5rZXlzKTt2YXIgbz1bXSxzPXt9O3JldHVybiB0aGlzLl9mb3JFYWNoQ2VsbCh0LGUscixuLHRoaXMuX3F1ZXJ5Q2VsbCxvLHMpLG99LG4ucHJvdG90eXBlLl9xdWVyeUNlbGw9ZnVuY3Rpb24odCxlLHIsbixpLGEsbyl7dmFyIHM9dGhpcy5jZWxsc1tpXTtpZihudWxsIT09cylmb3IodmFyIGw9dGhpcy5rZXlzLHU9dGhpcy5iYm94ZXMsYz0wO2M8cy5sZW5ndGg7YysrKXt2YXIgaD1zW2NdO2lmKHZvaWQgMD09PW9baF0pe3ZhciBmPTQqaDt0PD11W2YrMl0mJmU8PXVbZiszXSYmcj49dVtmKzBdJiZuPj11W2YrMV0/KG9baF09ITAsYS5wdXNoKGxbaF0pKTpvW2hdPSExfX19LG4ucHJvdG90eXBlLl9mb3JFYWNoQ2VsbD1mdW5jdGlvbih0LGUscixuLGksYSxvKXtmb3IodmFyIHM9dGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHQpLGw9dGhpcy5fY29udmVydFRvQ2VsbENvb3JkKGUpLHU9dGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHIpLGM9dGhpcy5fY29udmVydFRvQ2VsbENvb3JkKG4pLGg9cztoPD11O2grKylmb3IodmFyIGY9bDtmPD1jO2YrKyl7dmFyIGQ9dGhpcy5kKmYraDtpZihpLmNhbGwodGhpcyx0LGUscixuLGQsYSxvKSlyZXR1cm59fSxuLnByb3RvdHlwZS5fY29udmVydFRvQ2VsbENvb3JkPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKHRoaXMuZC0xLE1hdGguZmxvb3IodCp0aGlzLnNjYWxlKSt0aGlzLnBhZGRpbmcpKX0sbi5wcm90b3R5cGUudG9BcnJheUJ1ZmZlcj1mdW5jdGlvbigpe2lmKHRoaXMuYXJyYXlCdWZmZXIpcmV0dXJuIHRoaXMuYXJyYXlCdWZmZXI7Zm9yKHZhciB0PXRoaXMuY2VsbHMsZT1pK3RoaXMuY2VsbHMubGVuZ3RoKzErMSxyPTAsbj0wO248dGhpcy5jZWxscy5sZW5ndGg7bisrKXIrPXRoaXMuY2VsbHNbbl0ubGVuZ3RoO3ZhciBhPW5ldyBJbnQzMkFycmF5KGUrcit0aGlzLmtleXMubGVuZ3RoK3RoaXMuYmJveGVzLmxlbmd0aCk7YVswXT10aGlzLmV4dGVudCxhWzFdPXRoaXMubixhWzJdPXRoaXMucGFkZGluZztmb3IodmFyIG89ZSxzPTA7czx0Lmxlbmd0aDtzKyspe3ZhciBsPXRbc107YVtpK3NdPW8sYS5zZXQobCxvKSxvKz1sLmxlbmd0aH1yZXR1cm4gYVtpK3QubGVuZ3RoXT1vLGEuc2V0KHRoaXMua2V5cyxvKSxvKz10aGlzLmtleXMubGVuZ3RoLGFbaSt0Lmxlbmd0aCsxXT1vLGEuc2V0KHRoaXMuYmJveGVzLG8pLG8rPXRoaXMuYmJveGVzLmxlbmd0aCxhLmJ1ZmZlcn19LHt9XSwyNTM6W2Z1bmN0aW9uKHQsZSxyKXtyLnJlYWQ9ZnVuY3Rpb24odCxlLHIsbixpKXt2YXIgYSxvLHM9OCppLW4tMSxsPSgxPDxzKS0xLHU9bD4+MSxjPS03LGg9cj9pLTE6MCxmPXI/LTE6MSxkPXRbZStoXTtmb3IoaCs9ZixhPWQmKDE8PC1jKS0xLGQ+Pj0tYyxjKz1zO2M+MDthPTI1NiphK3RbZStoXSxoKz1mLGMtPTgpO2ZvcihvPWEmKDE8PC1jKS0xLGE+Pj0tYyxjKz1uO2M+MDtvPTI1NipvK3RbZStoXSxoKz1mLGMtPTgpO2lmKDA9PT1hKWE9MS11O2Vsc2V7aWYoYT09PWwpcmV0dXJuIG8/TmFOOihkPy0xOjEpKigxLzApO28rPU1hdGgucG93KDIsbiksYS09dX1yZXR1cm4oZD8tMToxKSpvKk1hdGgucG93KDIsYS1uKX0sci53cml0ZT1mdW5jdGlvbih0LGUscixuLGksYSl7dmFyIG8scyxsLHU9OCphLWktMSxjPSgxPDx1KS0xLGg9Yz4+MSxmPTIzPT09aT9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAsZD1uPzA6YS0xLHA9bj8xOi0xLGc9ZTwwfHwwPT09ZSYmMS9lPDA/MTowO2ZvcihlPU1hdGguYWJzKGUpLGlzTmFOKGUpfHxlPT09MS8wPyhzPWlzTmFOKGUpPzE6MCxvPWMpOihvPU1hdGguZmxvb3IoTWF0aC5sb2coZSkvTWF0aC5MTjIpLGUqKGw9TWF0aC5wb3coMiwtbykpPDEmJihvLS0sbCo9MiksZSs9bytoPj0xP2YvbDpmKk1hdGgucG93KDIsMS1oKSxlKmw+PTImJihvKyssbC89MiksbytoPj1jPyhzPTAsbz1jKTpvK2g+PTE/KHM9KGUqbC0xKSpNYXRoLnBvdygyLGkpLG8rPWgpOihzPWUqTWF0aC5wb3coMixoLTEpKk1hdGgucG93KDIsaSksbz0wKSk7aT49ODt0W3IrZF09MjU1JnMsZCs9cCxzLz0yNTYsaS09OCk7Zm9yKG89bzw8aXxzLHUrPWk7dT4wO3RbcitkXT0yNTUmbyxkKz1wLG8vPTI1Nix1LT04KTt0W3IrZC1wXXw9MTI4Kmd9fSx7fV0sMjU0OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIpe3RoaXMudmVydGljZXM9dCx0aGlzLmFkamFjZW50PWUsdGhpcy5ib3VuZGFyeT1yLHRoaXMubGFzdFZpc2l0ZWQ9LTF9ZnVuY3Rpb24gaSh0LGUscil7dGhpcy52ZXJ0aWNlcz10LHRoaXMuY2VsbD1lLHRoaXMuaW5kZXg9cn1mdW5jdGlvbiBhKHQsZSl7cmV0dXJuIGModC52ZXJ0aWNlcyxlLnZlcnRpY2VzKX1mdW5jdGlvbiBvKHQpe2Zvcih2YXIgZT1bImZ1bmN0aW9uIG9yaWVudCgpe3ZhciB0dXBsZT10aGlzLnR1cGxlO3JldHVybiB0ZXN0KCJdLHI9MDtyPD10OysrcilyPjAmJmUucHVzaCgiLCIpLGUucHVzaCgidHVwbGVbIixyLCJdIik7ZS5wdXNoKCIpfXJldHVybiBvcmllbnQiKTt2YXIgbj1uZXcgRnVuY3Rpb24oInRlc3QiLGUuam9pbigiIikpLGk9dVt0KzFdO3JldHVybiBpfHwoaT11KSxuKGkpfWZ1bmN0aW9uIHModCxlLHIpe3RoaXMuZGltZW5zaW9uPXQsdGhpcy52ZXJ0aWNlcz1lLHRoaXMuc2ltcGxpY2VzPXIsdGhpcy5pbnRlcmlvcj1yLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4hdC5ib3VuZGFyeX0pLHRoaXMudHVwbGU9bmV3IEFycmF5KHQrMSk7Zm9yKHZhciBuPTA7bjw9dDsrK24pdGhpcy50dXBsZVtuXT10aGlzLnZlcnRpY2VzW25dO3ZhciBpPWhbdF07aXx8KGk9aFt0XT1vKHQpKSx0aGlzLm9yaWVudD1pfWZ1bmN0aW9uIGwodCxlKXt2YXIgcj10Lmxlbmd0aDtpZigwPT09cil0aHJvdyBuZXcgRXJyb3IoIk11c3QgaGF2ZSBhdCBsZWFzdCBkKzEgcG9pbnRzIik7dmFyIGk9dFswXS5sZW5ndGg7aWYocjw9aSl0aHJvdyBuZXcgRXJyb3IoIk11c3QgaW5wdXQgYXQgbGVhc3QgZCsxIHBvaW50cyIpO3ZhciBhPXQuc2xpY2UoMCxpKzEpLG89dS5hcHBseSh2b2lkIDAsYSk7aWYoMD09PW8pdGhyb3cgbmV3IEVycm9yKCJJbnB1dCBub3QgaW4gZ2VuZXJhbCBwb3NpdGlvbiIpO2Zvcih2YXIgbD1uZXcgQXJyYXkoaSsxKSxjPTA7Yzw9aTsrK2MpbFtjXT1jO288MCYmKGxbMF09MSxsWzFdPTApO2Zvcih2YXIgaD1uZXcgbihsLG5ldyBBcnJheShpKzEpLCExKSxmPWguYWRqYWNlbnQsZD1uZXcgQXJyYXkoaSsyKSxjPTA7Yzw9aTsrK2Mpe2Zvcih2YXIgcD1sLnNsaWNlKCksZz0wO2c8PWk7KytnKWc9PT1jJiYocFtnXT0tMSk7dmFyIG09cFswXTtwWzBdPXBbMV0scFsxXT1tO3ZhciB2PW5ldyBuKHAsbmV3IEFycmF5KGkrMSksITApO2ZbY109dixkW2NdPXZ9ZFtpKzFdPWg7Zm9yKHZhciBjPTA7Yzw9aTsrK2MpZm9yKHZhciBwPWZbY10udmVydGljZXMseT1mW2NdLmFkamFjZW50LGc9MDtnPD1pOysrZyl7dmFyIHg9cFtnXTtpZih4PDApeVtnXT1oO2Vsc2UgZm9yKHZhciBiPTA7Yjw9aTsrK2IpZltiXS52ZXJ0aWNlcy5pbmRleE9mKHgpPDAmJih5W2ddPWZbYl0pfWZvcih2YXIgXz1uZXcgcyhpLGEsZCksdz0hIWUsYz1pKzE7YzxyOysrYylfLmluc2VydCh0W2NdLHcpO3JldHVybiBfLmJvdW5kYXJ5KCl9ZS5leHBvcnRzPWw7dmFyIHU9dCgicm9idXN0LW9yaWVudGF0aW9uIiksYz10KCJzaW1wbGljaWFsLWNvbXBsZXgiKS5jb21wYXJlQ2VsbHM7bi5wcm90b3R5cGUuZmxpcD1mdW5jdGlvbigpe3ZhciB0PXRoaXMudmVydGljZXNbMF07dGhpcy52ZXJ0aWNlc1swXT10aGlzLnZlcnRpY2VzWzFdLHRoaXMudmVydGljZXNbMV09dDt2YXIgZT10aGlzLmFkamFjZW50WzBdO3RoaXMuYWRqYWNlbnRbMF09dGhpcy5hZGphY2VudFsxXSx0aGlzLmFkamFjZW50WzFdPWV9O3ZhciBoPVtdLGY9cy5wcm90b3R5cGU7Zi5oYW5kbGVCb3VuZGFyeURlZ2VuZXJhY3k9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLmRpbWVuc2lvbixuPXRoaXMudmVydGljZXMubGVuZ3RoLTEsaT10aGlzLnR1cGxlLGE9dGhpcy52ZXJ0aWNlcyxvPVt0XTtmb3IodC5sYXN0VmlzaXRlZD0tbjtvLmxlbmd0aD4wOyl7dD1vLnBvcCgpO2Zvcih2YXIgcz0odC52ZXJ0aWNlcyx0LmFkamFjZW50KSxsPTA7bDw9cjsrK2wpe3ZhciB1PXNbbF07aWYodS5ib3VuZGFyeSYmISh1Lmxhc3RWaXNpdGVkPD0tbikpe2Zvcih2YXIgYz11LnZlcnRpY2VzLGg9MDtoPD1yOysraCl7dmFyIGY9Y1toXTtmPDA/aVtoXT1lOmlbaF09YVtmXX12YXIgZD10aGlzLm9yaWVudCgpO2lmKGQ+MClyZXR1cm4gdTt1Lmxhc3RWaXNpdGVkPS1uLDA9PT1kJiZvLnB1c2godSl9fX1yZXR1cm4gbnVsbH0sZi53YWxrPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy52ZXJ0aWNlcy5sZW5ndGgtMSxuPXRoaXMuZGltZW5zaW9uLGk9dGhpcy52ZXJ0aWNlcyxhPXRoaXMudHVwbGUsbz1lP3RoaXMuaW50ZXJpb3IubGVuZ3RoKk1hdGgucmFuZG9tKCl8MDp0aGlzLmludGVyaW9yLmxlbmd0aC0xLHM9dGhpcy5pbnRlcmlvcltvXTt0OmZvcig7IXMuYm91bmRhcnk7KXtmb3IodmFyIGw9cy52ZXJ0aWNlcyx1PXMuYWRqYWNlbnQsYz0wO2M8PW47KytjKWFbY109aVtsW2NdXTtzLmxhc3RWaXNpdGVkPXI7Zm9yKHZhciBjPTA7Yzw9bjsrK2Mpe3ZhciBoPXVbY107aWYoIShoLmxhc3RWaXNpdGVkPj1yKSl7dmFyIGY9YVtjXTthW2NdPXQ7dmFyIGQ9dGhpcy5vcmllbnQoKTtpZihhW2NdPWYsZDwwKXtzPWg7Y29udGludWUgdH1oLmJvdW5kYXJ5P2gubGFzdFZpc2l0ZWQ9LXI6aC5sYXN0VmlzaXRlZD1yfX1yZXR1cm59cmV0dXJuIHN9LGYuYWRkUGVha3M9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLnZlcnRpY2VzLmxlbmd0aC0xLG89dGhpcy5kaW1lbnNpb24scz10aGlzLnZlcnRpY2VzLGw9dGhpcy50dXBsZSx1PXRoaXMuaW50ZXJpb3IsYz10aGlzLnNpbXBsaWNlcyxoPVtlXTtlLmxhc3RWaXNpdGVkPXIsZS52ZXJ0aWNlc1tlLnZlcnRpY2VzLmluZGV4T2YoLTEpXT1yLGUuYm91bmRhcnk9ITEsdS5wdXNoKGUpO2Zvcih2YXIgZj1bXTtoLmxlbmd0aD4wOyl7dmFyIGU9aC5wb3AoKSxkPWUudmVydGljZXMscD1lLmFkamFjZW50LGc9ZC5pbmRleE9mKHIpO2lmKCEoZzwwKSlmb3IodmFyIG09MDttPD1vOysrbSlpZihtIT09Zyl7dmFyIHY9cFttXTtpZih2LmJvdW5kYXJ5JiYhKHYubGFzdFZpc2l0ZWQ+PXIpKXt2YXIgeT12LnZlcnRpY2VzO2lmKHYubGFzdFZpc2l0ZWQhPT0tcil7Zm9yKHZhciB4PTAsYj0wO2I8PW87KytiKXlbYl08MD8oeD1iLGxbYl09dCk6bFtiXT1zW3lbYl1dO3ZhciBfPXRoaXMub3JpZW50KCk7aWYoXz4wKXt5W3hdPXIsdi5ib3VuZGFyeT0hMSx1LnB1c2godiksaC5wdXNoKHYpLHYubGFzdFZpc2l0ZWQ9cjtjb250aW51ZX12Lmxhc3RWaXNpdGVkPS1yfXZhciB3PXYuYWRqYWNlbnQsTT1kLnNsaWNlKCksQT1wLnNsaWNlKCksaz1uZXcgbihNLEEsITApO2MucHVzaChrKTt2YXIgVD13LmluZGV4T2YoZSk7aWYoIShUPDApKXt3W1RdPWssQVtnXT12LE1bbV09LTEsQVttXT1lLHBbbV09ayxrLmZsaXAoKTtmb3IodmFyIGI9MDtiPD1vOysrYil7dmFyIEU9TVtiXTtpZighKEU8MHx8RT09PXIpKXtmb3IodmFyIFM9bmV3IEFycmF5KG8tMSksTD0wLHo9MDt6PD1vOysreil7dmFyIEM9TVt6XTtDPDB8fHo9PT1ifHwoU1tMKytdPUMpfWYucHVzaChuZXcgaShTLGssYikpfX19fX19Zi5zb3J0KGEpO2Zvcih2YXIgbT0wO20rMTxmLmxlbmd0aDttKz0yKXt2YXIgST1mW21dLFA9ZlttKzFdLEQ9SS5pbmRleCxSPVAuaW5kZXg7RDwwfHxSPDB8fChJLmNlbGwuYWRqYWNlbnRbSS5pbmRleF09UC5jZWxsLFAuY2VsbC5hZGphY2VudFtQLmluZGV4XT1JLmNlbGwpfX0sZi5pbnNlcnQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLnZlcnRpY2VzO3IucHVzaCh0KTt2YXIgbj10aGlzLndhbGsodCxlKTtpZihuKXtmb3IodmFyIGk9dGhpcy5kaW1lbnNpb24sYT10aGlzLnR1cGxlLG89MDtvPD1pOysrbyl7dmFyIHM9bi52ZXJ0aWNlc1tvXTtzPDA/YVtvXT10OmFbb109cltzXX12YXIgbD10aGlzLm9yaWVudChhKTtsPDB8fCgwIT09bHx8KG49dGhpcy5oYW5kbGVCb3VuZGFyeURlZ2VuZXJhY3kobix0KSkpJiZ0aGlzLmFkZFBlYWtzKHQsbil9fSxmLmJvdW5kYXJ5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuZGltZW5zaW9uLGU9W10scj10aGlzLnNpbXBsaWNlcyxuPXIubGVuZ3RoLGk9MDtpPG47KytpKXt2YXIgYT1yW2ldO2lmKGEuYm91bmRhcnkpe2Zvcih2YXIgbz1uZXcgQXJyYXkodCkscz1hLnZlcnRpY2VzLGw9MCx1PTAsYz0wO2M8PXQ7KytjKXNbY10+PTA/b1tsKytdPXNbY106dT0xJmM7aWYodT09PSgxJnQpKXt2YXIgaD1vWzBdO29bMF09b1sxXSxvWzFdPWh9ZS5wdXNoKG8pfX1yZXR1cm4gZX19LHsicm9idXN0LW9yaWVudGF0aW9uIjo0NjUsInNpbXBsaWNpYWwtY29tcGxleCI6NDc2fV0sMjU1OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbixpKXt0aGlzLm1pZD10LHRoaXMubGVmdD1lLHRoaXMucmlnaHQ9cix0aGlzLmxlZnRQb2ludHM9bix0aGlzLnJpZ2h0UG9pbnRzPWksdGhpcy5jb3VudD0oZT9lLmNvdW50OjApKyhyP3IuY291bnQ6MCkrbi5sZW5ndGh9ZnVuY3Rpb24gaSh0LGUpe3QubWlkPWUubWlkLHQubGVmdD1lLmxlZnQsdC5yaWdodD1lLnJpZ2h0LHQubGVmdFBvaW50cz1lLmxlZnRQb2ludHMsdC5yaWdodFBvaW50cz1lLnJpZ2h0UG9pbnRzLHQuY291bnQ9ZS5jb3VudH1mdW5jdGlvbiBhKHQsZSl7dmFyIHI9cChlKTt0Lm1pZD1yLm1pZCx0LmxlZnQ9ci5sZWZ0LHQucmlnaHQ9ci5yaWdodCx0LmxlZnRQb2ludHM9ci5sZWZ0UG9pbnRzLHQucmlnaHRQb2ludHM9ci5yaWdodFBvaW50cyx0LmNvdW50PXIuY291bnR9ZnVuY3Rpb24gbyh0LGUpe3ZhciByPXQuaW50ZXJ2YWxzKFtdKTtyLnB1c2goZSksYSh0LHIpfWZ1bmN0aW9uIHModCxlKXt2YXIgcj10LmludGVydmFscyhbXSksbj1yLmluZGV4T2YoZSk7cmV0dXJuIG48MD95OihyLnNwbGljZShuLDEpLGEodCxyKSx4KX1mdW5jdGlvbiBsKHQsZSxyKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoJiZ0W25dWzBdPD1lOysrbil7dmFyIGk9cih0W25dKTtpZihpKXJldHVybiBpfX1mdW5jdGlvbiB1KHQsZSxyKXtmb3IodmFyIG49dC5sZW5ndGgtMTtuPj0wJiZ0W25dWzFdPj1lOy0tbil7dmFyIGk9cih0W25dKTtpZihpKXJldHVybiBpfX1mdW5jdGlvbiBjKHQsZSl7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDsrK3Ipe3ZhciBuPWUodFtyXSk7aWYobilyZXR1cm4gbn19ZnVuY3Rpb24gaCh0LGUpe3JldHVybiB0LWV9ZnVuY3Rpb24gZih0LGUpe3ZhciByPXRbMF0tZVswXTtyZXR1cm4gcj9yOnRbMV0tZVsxXX1mdW5jdGlvbiBkKHQsZSl7dmFyIHI9dFsxXS1lWzFdO3JldHVybiByP3I6dFswXS1lWzBdfWZ1bmN0aW9uIHAodCl7aWYoMD09PXQubGVuZ3RoKXJldHVybiBudWxsO2Zvcih2YXIgZT1bXSxyPTA7cjx0Lmxlbmd0aDsrK3IpZS5wdXNoKHRbcl1bMF0sdFtyXVsxXSk7ZS5zb3J0KGgpO2Zvcih2YXIgaT1lW2UubGVuZ3RoPj4xXSxhPVtdLG89W10scz1bXSxyPTA7cjx0Lmxlbmd0aDsrK3Ipe3ZhciBsPXRbcl07bFsxXTxpP2EucHVzaChsKTppPGxbMF0/by5wdXNoKGwpOnMucHVzaChsKX12YXIgdT1zLGM9cy5zbGljZSgpO3JldHVybiB1LnNvcnQoZiksYy5zb3J0KGQpLG5ldyBuKGkscChhKSxwKG8pLHUsYyl9ZnVuY3Rpb24gZyh0KXt0aGlzLnJvb3Q9dH1mdW5jdGlvbiBtKHQpe3JldHVybiBuZXcgZyh0JiYwIT09dC5sZW5ndGg/cCh0KTpudWxsKX12YXIgdj10KCJiaW5hcnktc2VhcmNoLWJvdW5kcyIpLHk9MCx4PTEsYj0yO2UuZXhwb3J0cz1tO3ZhciBfPW4ucHJvdG90eXBlO18uaW50ZXJ2YWxzPWZ1bmN0aW9uKHQpe3JldHVybiB0LnB1c2guYXBwbHkodCx0aGlzLmxlZnRQb2ludHMpLHRoaXMubGVmdCYmdGhpcy5sZWZ0LmludGVydmFscyh0KSx0aGlzLnJpZ2h0JiZ0aGlzLnJpZ2h0LmludGVydmFscyh0KSx0fSxfLmluc2VydD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmNvdW50LXRoaXMubGVmdFBvaW50cy5sZW5ndGg7aWYodGhpcy5jb3VudCs9MSx0WzFdPHRoaXMubWlkKXRoaXMubGVmdD80Kih0aGlzLmxlZnQuY291bnQrMSk+MyooZSsxKT9vKHRoaXMsdCk6dGhpcy5sZWZ0Lmluc2VydCh0KTp0aGlzLmxlZnQ9cChbdF0pO2Vsc2UgaWYodFswXT50aGlzLm1pZCl0aGlzLnJpZ2h0PzQqKHRoaXMucmlnaHQuY291bnQrMSk+MyooZSsxKT9vKHRoaXMsdCk6dGhpcy5yaWdodC5pbnNlcnQodCk6dGhpcy5yaWdodD1wKFt0XSk7ZWxzZXt2YXIgcj12LmdlKHRoaXMubGVmdFBvaW50cyx0LGYpLG49di5nZSh0aGlzLnJpZ2h0UG9pbnRzLHQsZCk7dGhpcy5sZWZ0UG9pbnRzLnNwbGljZShyLDAsdCksdGhpcy5yaWdodFBvaW50cy5zcGxpY2UobiwwLHQpfX0sXy5yZW1vdmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jb3VudC10aGlzLmxlZnRQb2ludHM7aWYodFsxXTx0aGlzLm1pZCl7aWYoIXRoaXMubGVmdClyZXR1cm4geTt2YXIgcj10aGlzLnJpZ2h0P3RoaXMucmlnaHQuY291bnQ6MDtpZig0KnI+MyooZS0xKSlyZXR1cm4gcyh0aGlzLHQpO3ZhciBuPXRoaXMubGVmdC5yZW1vdmUodCk7cmV0dXJuIG49PT1iPyh0aGlzLmxlZnQ9bnVsbCx0aGlzLmNvdW50LT0xLHgpOihuPT09eCYmKHRoaXMuY291bnQtPTEpLG4pfWlmKHRbMF0+dGhpcy5taWQpe2lmKCF0aGlzLnJpZ2h0KXJldHVybiB5O3ZhciBhPXRoaXMubGVmdD90aGlzLmxlZnQuY291bnQ6MDtpZig0KmE+MyooZS0xKSlyZXR1cm4gcyh0aGlzLHQpO3ZhciBuPXRoaXMucmlnaHQucmVtb3ZlKHQpO3JldHVybiBuPT09Yj8odGhpcy5yaWdodD1udWxsLHRoaXMuY291bnQtPTEseCk6KG49PT14JiYodGhpcy5jb3VudC09MSksbil9aWYoMT09PXRoaXMuY291bnQpcmV0dXJuIHRoaXMubGVmdFBvaW50c1swXT09PXQ/Yjp5O2lmKDE9PT10aGlzLmxlZnRQb2ludHMubGVuZ3RoJiZ0aGlzLmxlZnRQb2ludHNbMF09PT10KXtpZih0aGlzLmxlZnQmJnRoaXMucmlnaHQpe2Zvcih2YXIgbz10aGlzLGw9dGhpcy5sZWZ0O2wucmlnaHQ7KW89bCxsPWwucmlnaHQ7aWYobz09PXRoaXMpbC5yaWdodD10aGlzLnJpZ2h0O2Vsc2V7dmFyIHU9dGhpcy5sZWZ0LG49dGhpcy5yaWdodDtvLmNvdW50LT1sLmNvdW50LG8ucmlnaHQ9bC5sZWZ0LGwubGVmdD11LGwucmlnaHQ9bn1pKHRoaXMsbCksdGhpcy5jb3VudD0odGhpcy5sZWZ0P3RoaXMubGVmdC5jb3VudDowKSsodGhpcy5yaWdodD90aGlzLnJpZ2h0LmNvdW50OjApK3RoaXMubGVmdFBvaW50cy5sZW5ndGh9ZWxzZSB0aGlzLmxlZnQ/aSh0aGlzLHRoaXMubGVmdCk6aSh0aGlzLHRoaXMucmlnaHQpO3JldHVybiB4fWZvcih2YXIgdT12LmdlKHRoaXMubGVmdFBvaW50cyx0LGYpO3U8dGhpcy5sZWZ0UG9pbnRzLmxlbmd0aCYmdGhpcy5sZWZ0UG9pbnRzW3VdWzBdPT09dFswXTsrK3UpaWYodGhpcy5sZWZ0UG9pbnRzW3VdPT09dCl7dGhpcy5jb3VudC09MSx0aGlzLmxlZnRQb2ludHMuc3BsaWNlKHUsMSk7Zm9yKHZhciBuPXYuZ2UodGhpcy5yaWdodFBvaW50cyx0LGQpO248dGhpcy5yaWdodFBvaW50cy5sZW5ndGgmJnRoaXMucmlnaHRQb2ludHNbbl1bMV09PT10WzFdOysrbilpZih0aGlzLnJpZ2h0UG9pbnRzW25dPT09dClyZXR1cm4gdGhpcy5yaWdodFBvaW50cy5zcGxpY2UobiwxKSx4fXJldHVybiB5fSxfLnF1ZXJ5UG9pbnQ9ZnVuY3Rpb24odCxlKXtpZih0PHRoaXMubWlkKXtpZih0aGlzLmxlZnQpe3ZhciByPXRoaXMubGVmdC5xdWVyeVBvaW50KHQsZSk7aWYocilyZXR1cm4gcn1yZXR1cm4gbCh0aGlzLmxlZnRQb2ludHMsdCxlKX1pZih0PnRoaXMubWlkKXtpZih0aGlzLnJpZ2h0KXt2YXIgcj10aGlzLnJpZ2h0LnF1ZXJ5UG9pbnQodCxlKTtpZihyKXJldHVybiByfXJldHVybiB1KHRoaXMucmlnaHRQb2ludHMsdCxlKX1yZXR1cm4gYyh0aGlzLmxlZnRQb2ludHMsZSl9LF8ucXVlcnlJbnRlcnZhbD1mdW5jdGlvbih0LGUscil7aWYodDx0aGlzLm1pZCYmdGhpcy5sZWZ0KXt2YXIgbj10aGlzLmxlZnQucXVlcnlJbnRlcnZhbCh0LGUscik7aWYobilyZXR1cm4gbn1pZihlPnRoaXMubWlkJiZ0aGlzLnJpZ2h0KXt2YXIgbj10aGlzLnJpZ2h0LnF1ZXJ5SW50ZXJ2YWwodCxlLHIpO2lmKG4pcmV0dXJuIG59cmV0dXJuIGU8dGhpcy5taWQ/bCh0aGlzLmxlZnRQb2ludHMsZSxyKTp0PnRoaXMubWlkP3UodGhpcy5yaWdodFBvaW50cyx0LHIpOmModGhpcy5sZWZ0UG9pbnRzLHIpfTt2YXIgdz1nLnByb3RvdHlwZTt3Lmluc2VydD1mdW5jdGlvbih0KXt0aGlzLnJvb3Q/dGhpcy5yb290Lmluc2VydCh0KTp0aGlzLnJvb3Q9bmV3IG4odFswXSxudWxsLG51bGwsW3RdLFt0XSl9LHcucmVtb3ZlPWZ1bmN0aW9uKHQpe2lmKHRoaXMucm9vdCl7dmFyIGU9dGhpcy5yb290LnJlbW92ZSh0KTtyZXR1cm4gZT09PWImJih0aGlzLnJvb3Q9bnVsbCksZSE9PXl9cmV0dXJuITF9LHcucXVlcnlQb2ludD1mdW5jdGlvbih0LGUpe2lmKHRoaXMucm9vdClyZXR1cm4gdGhpcy5yb290LnF1ZXJ5UG9pbnQodCxlKX0sdy5xdWVyeUludGVydmFsPWZ1bmN0aW9uKHQsZSxyKXtpZih0PD1lJiZ0aGlzLnJvb3QpcmV0dXJuIHRoaXMucm9vdC5xdWVyeUludGVydmFsKHQsZSxyKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHcsImNvdW50Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucm9vdD90aGlzLnJvb3QuY291bnQ6MH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodywiaW50ZXJ2YWxzIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucm9vdD90aGlzLnJvb3QuaW50ZXJ2YWxzKFtdKTpbXX19KX0seyJiaW5hcnktc2VhcmNoLWJvdW5kcyI6NTN9XSwyNTY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe2U9ZXx8bmV3IEFycmF5KHQubGVuZ3RoKTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoOysrcillW3Rbcl1dPXI7cmV0dXJuIGV9ZS5leHBvcnRzPW59LHt9XSwyNTc6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtmb3IodmFyIGU9bmV3IEFycmF5KHQpLHI9MDtyPHQ7KytyKWVbcl09cjtyZXR1cm4gZX1lLmV4cG9ydHM9bn0se31dLDI1ODpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCl7cmV0dXJuISF0LmNvbnN0cnVjdG9yJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5jb25zdHJ1Y3Rvci5pc0J1ZmZlciYmdC5jb25zdHJ1Y3Rvci5pc0J1ZmZlcih0KX1mdW5jdGlvbiBpKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlYWRGbG9hdExFJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5zbGljZSYmbih0LnNsaWNlKDAsMCkpfWUuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmKG4odCl8fGkodCl8fCEhdC5faXNCdWZmZXIpfX0se31dLDI1OTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyLG4sYSl7cmV0dXJuIG5ldyBpKHQsZSxyLG4sYSl9ZnVuY3Rpb24gaSh0LGUscixuLGkpe2U9ZXx8YSxyPXJ8fG8saT1pfHxBcnJheSx0aGlzLm5vZGVTaXplPW58fDY0LHRoaXMucG9pbnRzPXQsdGhpcy5pZHM9bmV3IGkodC5sZW5ndGgpLHRoaXMuY29vcmRzPW5ldyBpKDIqdC5sZW5ndGgpO2Zvcih2YXIgbD0wO2w8dC5sZW5ndGg7bCsrKXRoaXMuaWRzW2xdPWwsdGhpcy5jb29yZHNbMipsXT1lKHRbbF0pLHRoaXMuY29vcmRzWzIqbCsxXT1yKHRbbF0pO3ModGhpcy5pZHMsdGhpcy5jb29yZHMsdGhpcy5ub2RlU2l6ZSwwLHRoaXMuaWRzLmxlbmd0aC0xLDApfWZ1bmN0aW9uIGEodCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdFsxXX12YXIgcz10KCIuL3NvcnQiKSxsPXQoIi4vcmFuZ2UiKSx1PXQoIi4vd2l0aGluIik7ZS5leHBvcnRzPW4saS5wcm90b3R5cGU9e3JhbmdlOmZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiBsKHRoaXMuaWRzLHRoaXMuY29vcmRzLHQsZSxyLG4sdGhpcy5ub2RlU2l6ZSl9LHdpdGhpbjpmdW5jdGlvbih0LGUscil7cmV0dXJuIHUodGhpcy5pZHMsdGhpcy5jb29yZHMsdCxlLHIsdGhpcy5ub2RlU2l6ZSl9fX0seyIuL3JhbmdlIjoyNjAsIi4vc29ydCI6MjYxLCIuL3dpdGhpbiI6MjYyfV0sMjYwOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbixpLGEsbyl7Zm9yKHZhciBzLGwsdT1bMCx0Lmxlbmd0aC0xLDBdLGM9W107dS5sZW5ndGg7KXt2YXIgaD11LnBvcCgpLGY9dS5wb3AoKSxkPXUucG9wKCk7aWYoZi1kPD1vKWZvcih2YXIgcD1kO3A8PWY7cCsrKXM9ZVsyKnBdLGw9ZVsyKnArMV0scz49ciYmczw9aSYmbD49biYmbDw9YSYmYy5wdXNoKHRbcF0pO2Vsc2V7dmFyIGc9TWF0aC5mbG9vcigoZCtmKS8yKTtzPWVbMipnXSxsPWVbMipnKzFdLHM+PXImJnM8PWkmJmw+PW4mJmw8PWEmJmMucHVzaCh0W2ddKTt2YXIgbT0oaCsxKSUyOygwPT09aD9yPD1zOm48PWwpJiYodS5wdXNoKGQpLHUucHVzaChnLTEpLHUucHVzaChtKSksKDA9PT1oP2k+PXM6YT49bCkmJih1LnB1c2goZysxKSx1LnB1c2goZiksdS5wdXNoKG0pKX19cmV0dXJuIGN9ZS5leHBvcnRzPW59LHt9XSwyNjE6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixhLG8scyl7aWYoIShvLWE8PXIpKXt2YXIgbD1NYXRoLmZsb29yKChhK28pLzIpO2kodCxlLGwsYSxvLHMlMiksbih0LGUscixhLGwtMSxzKzEpLG4odCxlLHIsbCsxLG8scysxKX19ZnVuY3Rpb24gaSh0LGUscixuLG8scyl7Zm9yKDtvPm47KXtpZihvLW4+NjAwKXt2YXIgbD1vLW4rMSx1PXItbisxLGM9TWF0aC5sb2cobCksaD0uNSpNYXRoLmV4cCgyKmMvMyksZj0uNSpNYXRoLnNxcnQoYypoKihsLWgpL2wpKih1LWwvMjwwPy0xOjEpLGQ9TWF0aC5tYXgobixNYXRoLmZsb29yKHItdSpoL2wrZikpLHA9TWF0aC5taW4obyxNYXRoLmZsb29yKHIrKGwtdSkqaC9sK2YpKTtpKHQsZSxyLGQscCxzKX12YXIgZz1lWzIqcitzXSxtPW4sdj1vO2ZvcihhKHQsZSxuLHIpLGVbMipvK3NdPmcmJmEodCxlLG4sbyk7bTx2Oyl7Zm9yKGEodCxlLG0sdiksbSsrLHYtLTtlWzIqbStzXTxnOyltKys7Zm9yKDtlWzIqditzXT5nOyl2LS19ZVsyKm4rc109PT1nP2EodCxlLG4sdik6KHYrKyxhKHQsZSx2LG8pKSx2PD1yJiYobj12KzEpLHI8PXYmJihvPXYtMSl9fWZ1bmN0aW9uIGEodCxlLHIsbil7byh0LHIsbiksbyhlLDIqciwyKm4pLG8oZSwyKnIrMSwyKm4rMSl9ZnVuY3Rpb24gbyh0LGUscil7dmFyIG49dFtlXTt0W2VdPXRbcl0sdFtyXT1ufWUuZXhwb3J0cz1ufSx7fV0sMjYyOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbixhLG8pe2Zvcih2YXIgcz1bMCx0Lmxlbmd0aC0xLDBdLGw9W10sdT1hKmE7cy5sZW5ndGg7KXt2YXIgYz1zLnBvcCgpLGg9cy5wb3AoKSxmPXMucG9wKCk7aWYoaC1mPD1vKWZvcih2YXIgZD1mO2Q8PWg7ZCsrKWkoZVsyKmRdLGVbMipkKzFdLHIsbik8PXUmJmwucHVzaCh0W2RdKTtlbHNle3ZhciBwPU1hdGguZmxvb3IoKGYraCkvMiksZz1lWzIqcF0sbT1lWzIqcCsxXTtpKGcsbSxyLG4pPD11JiZsLnB1c2godFtwXSk7dmFyIHY9KGMrMSklMjsoMD09PWM/ci1hPD1nOm4tYTw9bSkmJihzLnB1c2goZikscy5wdXNoKHAtMSkscy5wdXNoKHYpKSwoMD09PWM/cithPj1nOm4rYT49bSkmJihzLnB1c2gocCsxKSxzLnB1c2goaCkscy5wdXNoKHYpKX19cmV0dXJuIGx9ZnVuY3Rpb24gaSh0LGUscixuKXt2YXIgaT10LXIsYT1lLW47cmV0dXJuIGkqaSthKmF9ZS5leHBvcnRzPW59LHt9XSwyNjM6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3ZhciByO2lmKGgodCkpe3ZhciBsLHU9dC5zdG9wcyYmIm9iamVjdCI9PXR5cGVvZiB0LnN0b3BzWzBdWzBdLGM9dXx8dm9pZCAwIT09dC5wcm9wZXJ0eSxmPXV8fCFjLGQ9dC50eXBlfHxlfHwiZXhwb25lbnRpYWwiO2lmKCJleHBvbmVudGlhbCI9PT1kKWw9bztlbHNlIGlmKCJpbnRlcnZhbCI9PT1kKWw9YTtlbHNlIGlmKCJjYXRlZ29yaWNhbCI9PT1kKWw9aTtlbHNle2lmKCJpZGVudGl0eSIhPT1kKXRocm93IG5ldyBFcnJvcignVW5rbm93biBmdW5jdGlvbiB0eXBlICInK2QrJyInKTtsPXN9aWYodSl7Zm9yKHZhciBwPXt9LGc9W10sbT0wO208dC5zdG9wcy5sZW5ndGg7bSsrKXt2YXIgdj10LnN0b3BzW21dO3ZvaWQgMD09PXBbdlswXS56b29tXSYmKHBbdlswXS56b29tXT17em9vbTp2WzBdLnpvb20sdHlwZTp0LnR5cGUscHJvcGVydHk6dC5wcm9wZXJ0eSxzdG9wczpbXX0pLHBbdlswXS56b29tXS5zdG9wcy5wdXNoKFt2WzBdLnZhbHVlLHZbMV1dKX1mb3IodmFyIHkgaW4gcClnLnB1c2goW3BbeV0uem9vbSxuKHBbeV0pXSk7cj1mdW5jdGlvbihlLHIpe3JldHVybiBvKHtzdG9wczpnLGJhc2U6dC5iYXNlfSxlKShlLHIpfSxyLmlzRmVhdHVyZUNvbnN0YW50PSExLHIuaXNab29tQ29uc3RhbnQ9ITF9ZWxzZSBmPyhyPWZ1bmN0aW9uKGUpe3JldHVybiBsKHQsZSl9LHIuaXNGZWF0dXJlQ29uc3RhbnQ9ITAsci5pc1pvb21Db25zdGFudD0hMSk6KHI9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gbCh0LHJbdC5wcm9wZXJ0eV0pfSxyLmlzRmVhdHVyZUNvbnN0YW50PSExLHIuaXNab29tQ29uc3RhbnQ9ITApfWVsc2Ugcj1mdW5jdGlvbigpe3JldHVybiB0fSxyLmlzRmVhdHVyZUNvbnN0YW50PSEwLHIuaXNab29tQ29uc3RhbnQ9ITA7cmV0dXJuIHJ9ZnVuY3Rpb24gaSh0LGUpe2Zvcih2YXIgcj0wO3I8dC5zdG9wcy5sZW5ndGg7cisrKWlmKGU9PT10LnN0b3BzW3JdWzBdKXJldHVybiB0LnN0b3BzW3JdWzFdO3JldHVybiB0LnN0b3BzWzBdWzFdfWZ1bmN0aW9uIGEodCxlKXtmb3IodmFyIHI9MDtyPHQuc3RvcHMubGVuZ3RoJiYhKGU8dC5zdG9wc1tyXVswXSk7cisrKTtyZXR1cm4gdC5zdG9wc1tNYXRoLm1heChyLTEsMCldWzFdfWZ1bmN0aW9uIG8odCxlKXtmb3IodmFyIHI9dm9pZCAwIT09dC5iYXNlP3QuYmFzZToxLG49MDs7KXtpZihuPj10LnN0b3BzLmxlbmd0aClicmVhaztpZihlPD10LnN0b3BzW25dWzBdKWJyZWFrO24rK31yZXR1cm4gMD09PW4/dC5zdG9wc1tuXVsxXTpuPT09dC5zdG9wcy5sZW5ndGg/dC5zdG9wc1tuLTFdWzFdOmwoZSxyLHQuc3RvcHNbbi0xXVswXSx0LnN0b3BzW25dWzBdLHQuc3RvcHNbbi0xXVsxXSx0LnN0b3BzW25dWzFdKTsKfWZ1bmN0aW9uIHModCxlKXtyZXR1cm4gZX1mdW5jdGlvbiBsKHQsZSxyLG4saSxhKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgaT9mdW5jdGlvbigpe3ZhciBvPWkuYXBwbHkodm9pZCAwLGFyZ3VtZW50cykscz1hLmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpO3JldHVybiBsKHQsZSxyLG4sbyxzKX06aS5sZW5ndGg/Yyh0LGUscixuLGksYSk6dSh0LGUscixuLGksYSl9ZnVuY3Rpb24gdSh0LGUscixuLGksYSl7dmFyIG8scz1uLXIsbD10LXI7cmV0dXJuIG89MT09PWU/bC9zOihNYXRoLnBvdyhlLGwpLTEpLyhNYXRoLnBvdyhlLHMpLTEpLGkqKDEtbykrYSpvfWZ1bmN0aW9uIGModCxlLHIsbixpLGEpe2Zvcih2YXIgbz1bXSxzPTA7czxpLmxlbmd0aDtzKyspb1tzXT11KHQsZSxyLG4saVtzXSxhW3NdKTtyZXR1cm4gb31mdW5jdGlvbiBoKHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmKHQuc3RvcHN8fCJpZGVudGl0eSI9PT10LnR5cGUpfWUuZXhwb3J0cy5pc0Z1bmN0aW9uRGVmaW5pdGlvbj1oLGUuZXhwb3J0cy5pbnRlcnBvbGF0ZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIG4odCwiZXhwb25lbnRpYWwiKX0sZS5leHBvcnRzWyJwaWVjZXdpc2UtY29uc3RhbnQiXT1mdW5jdGlvbih0KXtyZXR1cm4gbih0LCJpbnRlcnZhbCIpfX0se31dLDI2NDpbZnVuY3Rpb24odCxlLHIpe3QoInBhdGgiKTtlLmV4cG9ydHM9e2RlYnVnOntmcmFnbWVudFNvdXJjZToiI2lmZGVmIEdMX0VTXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNlbHNlXG4jZGVmaW5lIGxvd3BcbiNkZWZpbmUgbWVkaXVtcFxuI2RlZmluZSBoaWdocFxuI2VuZGlmXG5cbnVuaWZvcm0gbG93cCB2ZWM0IHVfY29sb3I7XG5cbnZvaWQgbWFpbigpIHtcbiAgICBnbF9GcmFnQ29sb3IgPSB1X2NvbG9yO1xufVxuIix2ZXJ0ZXhTb3VyY2U6IiNpZmRlZiBHTF9FU1xucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuI2Vsc2VcbiNkZWZpbmUgbG93cFxuI2RlZmluZSBtZWRpdW1wXG4jZGVmaW5lIGhpZ2hwXG4jZW5kaWZcblxuYXR0cmlidXRlIHZlYzIgYV9wb3M7XG5cbnVuaWZvcm0gbWF0NCB1X21hdHJpeDtcblxudm9pZCBtYWluKCkge1xuICAgIGdsX1Bvc2l0aW9uID0gdV9tYXRyaXggKiB2ZWM0KGFfcG9zLCBzdGVwKDMyNzY3LjAsIGFfcG9zLngpLCAxKTtcbn1cbiJ9LGZpbGw6e2ZyYWdtZW50U291cmNlOiIjaWZkZWYgR0xfRVNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2Vsc2VcbiNkZWZpbmUgbG93cFxuI2RlZmluZSBtZWRpdW1wXG4jZGVmaW5lIGhpZ2hwXG4jZW5kaWZcblxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgY29sb3JcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XG5cbnZvaWQgbWFpbigpIHtcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIHZlYzQgY29sb3JcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcblxuICAgIGdsX0ZyYWdDb2xvciA9IGNvbG9yICogb3BhY2l0eTtcblxuI2lmZGVmIE9WRVJEUkFXX0lOU1BFQ1RPUlxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoMS4wKTtcbiNlbmRpZlxufVxuIix2ZXJ0ZXhTb3VyY2U6IiNpZmRlZiBHTF9FU1xucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuI2Vsc2VcbiNkZWZpbmUgbG93cFxuI2RlZmluZSBtZWRpdW1wXG4jZGVmaW5lIGhpZ2hwXG4jZW5kaWZcblxuYXR0cmlidXRlIHZlYzIgYV9wb3M7XG5cbnVuaWZvcm0gbWF0NCB1X21hdHJpeDtcblxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgY29sb3JcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XG5cbnZvaWQgbWFpbigpIHtcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIHZlYzQgY29sb3JcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcblxuICAgIGdsX1Bvc2l0aW9uID0gdV9tYXRyaXggKiB2ZWM0KGFfcG9zLCAwLCAxKTtcbn1cbiJ9LGNpcmNsZTp7ZnJhZ21lbnRTb3VyY2U6IiNpZmRlZiBHTF9FU1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZWxzZVxuI2RlZmluZSBsb3dwXG4jZGVmaW5lIG1lZGl1bXBcbiNkZWZpbmUgaGlnaHBcbiNlbmRpZlxuXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgdmVjNCBjb2xvclxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGJsdXJcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XG5cbnZhcnlpbmcgdmVjMiB2X2V4dHJ1ZGU7XG52YXJ5aW5nIGxvd3AgZmxvYXQgdl9hbnRpYWxpYXNibHVyO1xuXG52b2lkIG1haW4oKSB7XG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCB2ZWM0IGNvbG9yXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBibHVyXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XG5cbiAgICBmbG9hdCB0ID0gc21vb3Roc3RlcCgxLjAgLSBtYXgoYmx1ciwgdl9hbnRpYWxpYXNibHVyKSwgMS4wLCBsZW5ndGgodl9leHRydWRlKSk7XG4gICAgZ2xfRnJhZ0NvbG9yID0gY29sb3IgKiAoMS4wIC0gdCkgKiBvcGFjaXR5O1xuXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXG4gICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCgxLjApO1xuI2VuZGlmXG59XG4iLHZlcnRleFNvdXJjZToiI2lmZGVmIEdMX0VTXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4jZWxzZVxuI2RlZmluZSBsb3dwXG4jZGVmaW5lIG1lZGl1bXBcbiNkZWZpbmUgaGlnaHBcbiNlbmRpZlxuXG51bmlmb3JtIG1hdDQgdV9tYXRyaXg7XG51bmlmb3JtIGJvb2wgdV9zY2FsZV93aXRoX21hcDtcbnVuaWZvcm0gdmVjMiB1X2V4dHJ1ZGVfc2NhbGU7XG51bmlmb3JtIGZsb2F0IHVfZGV2aWNlcGl4ZWxyYXRpbztcblxuYXR0cmlidXRlIHZlYzIgYV9wb3M7XG5cbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCB2ZWM0IGNvbG9yXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIG1lZGl1bXAgZmxvYXQgcmFkaXVzXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgYmx1clxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcblxudmFyeWluZyB2ZWMyIHZfZXh0cnVkZTtcbnZhcnlpbmcgbG93cCBmbG9hdCB2X2FudGlhbGlhc2JsdXI7XG5cbnZvaWQgbWFpbih2b2lkKSB7XG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCB2ZWM0IGNvbG9yXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCBmbG9hdCByYWRpdXNcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGJsdXJcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcblxuICAgIC8vIHVuZW5jb2RlIHRoZSBleHRydXNpb24gdmVjdG9yIHRoYXQgd2Ugc251Y2sgaW50byB0aGUgYV9wb3MgdmVjdG9yXG4gICAgdl9leHRydWRlID0gdmVjMihtb2QoYV9wb3MsIDIuMCkgKiAyLjAgLSAxLjApO1xuXG4gICAgdmVjMiBleHRydWRlID0gdl9leHRydWRlICogcmFkaXVzICogdV9leHRydWRlX3NjYWxlO1xuICAgIC8vIG11bHRpcGx5IGFfcG9zIGJ5IDAuNSwgc2luY2Ugd2UgaGFkIGl0ICogMiBpbiBvcmRlciB0byBzbmVha1xuICAgIC8vIGluIGV4dHJ1c2lvbiBkYXRhXG4gICAgZ2xfUG9zaXRpb24gPSB1X21hdHJpeCAqIHZlYzQoZmxvb3IoYV9wb3MgKiAwLjUpLCAwLCAxKTtcblxuICAgIGlmICh1X3NjYWxlX3dpdGhfbWFwKSB7XG4gICAgICAgIGdsX1Bvc2l0aW9uLnh5ICs9IGV4dHJ1ZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZ2xfUG9zaXRpb24ueHkgKz0gZXh0cnVkZSAqIGdsX1Bvc2l0aW9uLnc7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyBhIG1pbmltdW0gYmx1ciBkaXN0YW5jZSB0aGF0IHNlcnZlcyBhcyBhIGZhdXgtYW50aWFsaWFzaW5nIGZvclxuICAgIC8vIHRoZSBjaXJjbGUuIHNpbmNlIGJsdXIgaXMgYSByYXRpbyBvZiB0aGUgY2lyY2xlJ3Mgc2l6ZSBhbmQgdGhlIGludGVudCBpc1xuICAgIC8vIHRvIGtlZXAgdGhlIGJsdXIgYXQgcm91Z2hseSAxcHgsIHRoZSB0d28gYXJlIGludmVyc2VseSByZWxhdGVkLlxuICAgIHZfYW50aWFsaWFzYmx1ciA9IDEuMCAvIHVfZGV2aWNlcGl4ZWxyYXRpbyAvIHJhZGl1cztcbn1cbiJ9LGxpbmU6e2ZyYWdtZW50U291cmNlOiIjaWZkZWYgR0xfRVNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2Vsc2VcbiNkZWZpbmUgbG93cFxuI2RlZmluZSBtZWRpdW1wXG4jZGVmaW5lIGhpZ2hwXG4jZW5kaWZcblxudW5pZm9ybSBsb3dwIHZlYzQgdV9jb2xvcjtcbnVuaWZvcm0gbG93cCBmbG9hdCB1X29wYWNpdHk7XG51bmlmb3JtIGZsb2F0IHVfYmx1cjtcblxudmFyeWluZyB2ZWMyIHZfbGluZXdpZHRoO1xudmFyeWluZyB2ZWMyIHZfbm9ybWFsO1xudmFyeWluZyBmbG9hdCB2X2dhbW1hX3NjYWxlO1xuXG52b2lkIG1haW4oKSB7XG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBvZiB0aGUgcGl4ZWwgZnJvbSB0aGUgbGluZSBpbiBwaXhlbHMuXG4gICAgZmxvYXQgZGlzdCA9IGxlbmd0aCh2X25vcm1hbCkgKiB2X2xpbmV3aWR0aC5zO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBhbnRpYWxpYXNpbmcgZmFkZSBmYWN0b3IuIFRoaXMgaXMgZWl0aGVyIHdoZW4gZmFkaW5nIGluXG4gICAgLy8gdGhlIGxpbmUgaW4gY2FzZSBvZiBhbiBvZmZzZXQgbGluZSAodl9saW5ld2lkdGgudCkgb3Igd2hlbiBmYWRpbmcgb3V0XG4gICAgLy8gKHZfbGluZXdpZHRoLnMpXG4gICAgZmxvYXQgYmx1ciA9IHVfYmx1ciAqIHZfZ2FtbWFfc2NhbGU7XG4gICAgZmxvYXQgYWxwaGEgPSBjbGFtcChtaW4oZGlzdCAtICh2X2xpbmV3aWR0aC50IC0gYmx1ciksIHZfbGluZXdpZHRoLnMgLSBkaXN0KSAvIGJsdXIsIDAuMCwgMS4wKTtcblxuICAgIGdsX0ZyYWdDb2xvciA9IHVfY29sb3IgKiAoYWxwaGEgKiB1X29wYWNpdHkpO1xuXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXG4gICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCgxLjApO1xuI2VuZGlmXG59XG4iLHZlcnRleFNvdXJjZToiI2lmZGVmIEdMX0VTXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4jZWxzZVxuI2RlZmluZSBsb3dwXG4jZGVmaW5lIG1lZGl1bXBcbiNkZWZpbmUgaGlnaHBcbiNlbmRpZlxuXG4vLyBmbG9vcigxMjcgLyAyKSA9PSA2My4wXG4vLyB0aGUgbWF4aW11bSBhbGxvd2VkIG1pdGVyIGxpbWl0IGlzIDIuMCBhdCB0aGUgbW9tZW50LiB0aGUgZXh0cnVkZSBub3JtYWwgaXNcbi8vIHN0b3JlZCBpbiBhIGJ5dGUgKC0xMjguLjEyNykuIHdlIHNjYWxlIHJlZ3VsYXIgbm9ybWFscyB1cCB0byBsZW5ndGggNjMsIGJ1dFxuLy8gdGhlcmUgYXJlIGFsc28gXCJzcGVjaWFsXCIgbm9ybWFscyB0aGF0IGhhdmUgYSBiaWdnZXIgbGVuZ3RoIChvZiB1cCB0byAxMjYgaW5cbi8vIHRoaXMgY2FzZSkuXG4vLyAjZGVmaW5lIHNjYWxlIDYzLjBcbiNkZWZpbmUgc2NhbGUgMC4wMTU4NzMwMTZcblxuYXR0cmlidXRlIHZlYzIgYV9wb3M7XG5hdHRyaWJ1dGUgdmVjNCBhX2RhdGE7XG5cbnVuaWZvcm0gbWF0NCB1X21hdHJpeDtcbnVuaWZvcm0gbWVkaXVtcCBmbG9hdCB1X3JhdGlvO1xudW5pZm9ybSBtZWRpdW1wIGZsb2F0IHVfbGluZXdpZHRoO1xudW5pZm9ybSBtZWRpdW1wIGZsb2F0IHVfZ2Fwd2lkdGg7XG51bmlmb3JtIG1lZGl1bXAgZmxvYXQgdV9hbnRpYWxpYXNpbmc7XG51bmlmb3JtIG1lZGl1bXAgZmxvYXQgdV9leHRyYTtcbnVuaWZvcm0gbWF0MiB1X2FudGlhbGlhc2luZ21hdHJpeDtcbnVuaWZvcm0gbWVkaXVtcCBmbG9hdCB1X29mZnNldDtcbnVuaWZvcm0gbWVkaXVtcCBmbG9hdCB1X2JsdXI7XG5cbnZhcnlpbmcgdmVjMiB2X25vcm1hbDtcbnZhcnlpbmcgdmVjMiB2X2xpbmV3aWR0aDtcbnZhcnlpbmcgZmxvYXQgdl9nYW1tYV9zY2FsZTtcblxudm9pZCBtYWluKCkge1xuICAgIHZlYzIgYV9leHRydWRlID0gYV9kYXRhLnh5IC0gMTI4LjA7XG4gICAgZmxvYXQgYV9kaXJlY3Rpb24gPSBtb2QoYV9kYXRhLnosIDQuMCkgLSAxLjA7XG5cbiAgICAvLyBXZSBzdG9yZSB0aGUgdGV4dHVyZSBub3JtYWxzIGluIHRoZSBtb3N0IGluc2lnbmlmaWNhbnQgYml0XG4gICAgLy8gdHJhbnNmb3JtIHkgc28gdGhhdCAwID0+IC0xIGFuZCAxID0+IDFcbiAgICAvLyBJbiB0aGUgdGV4dHVyZSBub3JtYWwsIHggaXMgMCBpZiB0aGUgbm9ybWFsIHBvaW50cyBzdHJhaWdodCB1cC9kb3duIGFuZCAxIGlmIGl0J3MgYSByb3VuZCBjYXBcbiAgICAvLyB5IGlzIDEgaWYgdGhlIG5vcm1hbCBwb2ludHMgdXAsIGFuZCAtMSBpZiBpdCBwb2ludHMgZG93blxuICAgIG1lZGl1bXAgdmVjMiBub3JtYWwgPSBtb2QoYV9wb3MsIDIuMCk7XG4gICAgbm9ybWFsLnkgPSBzaWduKG5vcm1hbC55IC0gMC41KTtcbiAgICB2X25vcm1hbCA9IG5vcm1hbDtcblxuICAgIGZsb2F0IGluc2V0ID0gdV9nYXB3aWR0aCArICh1X2dhcHdpZHRoID4gMC4wID8gdV9hbnRpYWxpYXNpbmcgOiAwLjApO1xuICAgIGZsb2F0IG91dHNldCA9IHVfZ2Fwd2lkdGggKyB1X2xpbmV3aWR0aCAqICh1X2dhcHdpZHRoID4gMC4wID8gMi4wIDogMS4wKSArIHVfYW50aWFsaWFzaW5nO1xuXG4gICAgLy8gU2NhbGUgdGhlIGV4dHJ1c2lvbiB2ZWN0b3IgZG93biB0byBhIG5vcm1hbCBhbmQgdGhlbiB1cCBieSB0aGUgbGluZSB3aWR0aFxuICAgIC8vIG9mIHRoaXMgdmVydGV4LlxuICAgIG1lZGl1bXAgdmVjMiBkaXN0ID0gb3V0c2V0ICogYV9leHRydWRlICogc2NhbGU7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIG9mZnNldCB3aGVuIGRyYXdpbmcgYSBsaW5lIHRoYXQgaXMgdG8gdGhlIHNpZGUgb2YgdGhlIGFjdHVhbCBsaW5lLlxuICAgIC8vIFdlIGRvIHRoaXMgYnkgY3JlYXRpbmcgYSB2ZWN0b3IgdGhhdCBwb2ludHMgdG93YXJkcyB0aGUgZXh0cnVkZSwgYnV0IHJvdGF0ZVxuICAgIC8vIGl0IHdoZW4gd2UncmUgZHJhd2luZyByb3VuZCBlbmQgcG9pbnRzIChhX2RpcmVjdGlvbiA9IC0xIG9yIDEpIHNpbmNlIHRoZWlyXG4gICAgLy8gZXh0cnVkZSB2ZWN0b3IgcG9pbnRzIGluIGFub3RoZXIgZGlyZWN0aW9uLlxuICAgIG1lZGl1bXAgZmxvYXQgdSA9IDAuNSAqIGFfZGlyZWN0aW9uO1xuICAgIG1lZGl1bXAgZmxvYXQgdCA9IDEuMCAtIGFicyh1KTtcbiAgICBtZWRpdW1wIHZlYzIgb2Zmc2V0ID0gdV9vZmZzZXQgKiBhX2V4dHJ1ZGUgKiBzY2FsZSAqIG5vcm1hbC55ICogbWF0Mih0LCAtdSwgdSwgdCk7XG5cbiAgICAvLyBSZW1vdmUgdGhlIHRleHR1cmUgbm9ybWFsIGJpdCBvZiB0aGUgcG9zaXRpb24gYmVmb3JlIHNjYWxpbmcgaXQgd2l0aCB0aGVcbiAgICAvLyBtb2RlbC92aWV3IG1hdHJpeC5cbiAgICBnbF9Qb3NpdGlvbiA9IHVfbWF0cml4ICogdmVjNChmbG9vcihhX3BvcyAqIDAuNSkgKyAob2Zmc2V0ICsgZGlzdCkgLyB1X3JhdGlvLCAwLjAsIDEuMCk7XG5cbiAgICAvLyBwb3NpdGlvbiBvZiB5IG9uIHRoZSBzY3JlZW5cbiAgICBmbG9hdCB5ID0gZ2xfUG9zaXRpb24ueSAvIGdsX1Bvc2l0aW9uLnc7XG5cbiAgICAvLyBob3cgbXVjaCBmZWF0dXJlcyBhcmUgc3F1aXNoZWQgaW4gdGhlIHkgZGlyZWN0aW9uIGJ5IHRoZSB0aWx0XG4gICAgZmxvYXQgc3F1aXNoX3NjYWxlID0gbGVuZ3RoKGFfZXh0cnVkZSkgLyBsZW5ndGgodV9hbnRpYWxpYXNpbmdtYXRyaXggKiBhX2V4dHJ1ZGUpO1xuXG4gICAgLy8gaG93IG11Y2ggZmVhdHVyZXMgYXJlIHNxdWlzaGVkIGluIGFsbCBkaXJlY3Rpb25zIGJ5IHRoZSBwZXJzcGVjdGl2ZW5lc3NcbiAgICBmbG9hdCBwZXJzcGVjdGl2ZV9zY2FsZSA9IDEuMCAvICgxLjAgLSBtaW4oeSAqIHVfZXh0cmEsIDAuOSkpO1xuXG4gICAgdl9saW5ld2lkdGggPSB2ZWMyKG91dHNldCwgaW5zZXQpO1xuICAgIHZfZ2FtbWFfc2NhbGUgPSBwZXJzcGVjdGl2ZV9zY2FsZSAqIHNxdWlzaF9zY2FsZTtcbn1cbiJ9LGxpbmVwYXR0ZXJuOntmcmFnbWVudFNvdXJjZToiI2lmZGVmIEdMX0VTXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNlbHNlXG4jZGVmaW5lIGxvd3BcbiNkZWZpbmUgbWVkaXVtcFxuI2RlZmluZSBoaWdocFxuI2VuZGlmXG5cbnVuaWZvcm0gZmxvYXQgdV9ibHVyO1xuXG51bmlmb3JtIHZlYzIgdV9wYXR0ZXJuX3NpemVfYTtcbnVuaWZvcm0gdmVjMiB1X3BhdHRlcm5fc2l6ZV9iO1xudW5pZm9ybSB2ZWMyIHVfcGF0dGVybl90bF9hO1xudW5pZm9ybSB2ZWMyIHVfcGF0dGVybl9icl9hO1xudW5pZm9ybSB2ZWMyIHVfcGF0dGVybl90bF9iO1xudW5pZm9ybSB2ZWMyIHVfcGF0dGVybl9icl9iO1xudW5pZm9ybSBmbG9hdCB1X2ZhZGU7XG51bmlmb3JtIGZsb2F0IHVfb3BhY2l0eTtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV9pbWFnZTtcblxudmFyeWluZyB2ZWMyIHZfbm9ybWFsO1xudmFyeWluZyB2ZWMyIHZfbGluZXdpZHRoO1xudmFyeWluZyBmbG9hdCB2X2xpbmVzb2ZhcjtcbnZhcnlpbmcgZmxvYXQgdl9nYW1tYV9zY2FsZTtcblxudm9pZCBtYWluKCkge1xuICAgIC8vIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2Ugb2YgdGhlIHBpeGVsIGZyb20gdGhlIGxpbmUgaW4gcGl4ZWxzLlxuICAgIGZsb2F0IGRpc3QgPSBsZW5ndGgodl9ub3JtYWwpICogdl9saW5ld2lkdGgucztcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgYW50aWFsaWFzaW5nIGZhZGUgZmFjdG9yLiBUaGlzIGlzIGVpdGhlciB3aGVuIGZhZGluZyBpblxuICAgIC8vIHRoZSBsaW5lIGluIGNhc2Ugb2YgYW4gb2Zmc2V0IGxpbmUgKHZfbGluZXdpZHRoLnQpIG9yIHdoZW4gZmFkaW5nIG91dFxuICAgIC8vICh2X2xpbmV3aWR0aC5zKVxuICAgIGZsb2F0IGJsdXIgPSB1X2JsdXIgKiB2X2dhbW1hX3NjYWxlO1xuICAgIGZsb2F0IGFscGhhID0gY2xhbXAobWluKGRpc3QgLSAodl9saW5ld2lkdGgudCAtIGJsdXIpLCB2X2xpbmV3aWR0aC5zIC0gZGlzdCkgLyBibHVyLCAwLjAsIDEuMCk7XG5cbiAgICBmbG9hdCB4X2EgPSBtb2Qodl9saW5lc29mYXIgLyB1X3BhdHRlcm5fc2l6ZV9hLngsIDEuMCk7XG4gICAgZmxvYXQgeF9iID0gbW9kKHZfbGluZXNvZmFyIC8gdV9wYXR0ZXJuX3NpemVfYi54LCAxLjApO1xuICAgIGZsb2F0IHlfYSA9IDAuNSArICh2X25vcm1hbC55ICogdl9saW5ld2lkdGgucyAvIHVfcGF0dGVybl9zaXplX2EueSk7XG4gICAgZmxvYXQgeV9iID0gMC41ICsgKHZfbm9ybWFsLnkgKiB2X2xpbmV3aWR0aC5zIC8gdV9wYXR0ZXJuX3NpemVfYi55KTtcbiAgICB2ZWMyIHBvc19hID0gbWl4KHVfcGF0dGVybl90bF9hLCB1X3BhdHRlcm5fYnJfYSwgdmVjMih4X2EsIHlfYSkpO1xuICAgIHZlYzIgcG9zX2IgPSBtaXgodV9wYXR0ZXJuX3RsX2IsIHVfcGF0dGVybl9icl9iLCB2ZWMyKHhfYiwgeV9iKSk7XG5cbiAgICB2ZWM0IGNvbG9yID0gbWl4KHRleHR1cmUyRCh1X2ltYWdlLCBwb3NfYSksIHRleHR1cmUyRCh1X2ltYWdlLCBwb3NfYiksIHVfZmFkZSk7XG5cbiAgICBhbHBoYSAqPSB1X29wYWNpdHk7XG5cbiAgICBnbF9GcmFnQ29sb3IgPSBjb2xvciAqIGFscGhhO1xuXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXG4gICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCgxLjApO1xuI2VuZGlmXG59XG4iLHZlcnRleFNvdXJjZToiI2lmZGVmIEdMX0VTXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4jZWxzZVxuI2RlZmluZSBsb3dwXG4jZGVmaW5lIG1lZGl1bXBcbiNkZWZpbmUgaGlnaHBcbiNlbmRpZlxuXG4vLyBmbG9vcigxMjcgLyAyKSA9PSA2My4wXG4vLyB0aGUgbWF4aW11bSBhbGxvd2VkIG1pdGVyIGxpbWl0IGlzIDIuMCBhdCB0aGUgbW9tZW50LiB0aGUgZXh0cnVkZSBub3JtYWwgaXNcbi8vIHN0b3JlZCBpbiBhIGJ5dGUgKC0xMjguLjEyNykuIHdlIHNjYWxlIHJlZ3VsYXIgbm9ybWFscyB1cCB0byBsZW5ndGggNjMsIGJ1dFxuLy8gdGhlcmUgYXJlIGFsc28gXCJzcGVjaWFsXCIgbm9ybWFscyB0aGF0IGhhdmUgYSBiaWdnZXIgbGVuZ3RoIChvZiB1cCB0byAxMjYgaW5cbi8vIHRoaXMgY2FzZSkuXG4vLyAjZGVmaW5lIHNjYWxlIDYzLjBcbiNkZWZpbmUgc2NhbGUgMC4wMTU4NzMwMTZcblxuLy8gV2Ugc2NhbGUgdGhlIGRpc3RhbmNlIGJlZm9yZSBhZGRpbmcgaXQgdG8gdGhlIGJ1ZmZlcnMgc28gdGhhdCB3ZSBjYW4gc3RvcmVcbi8vIGxvbmcgZGlzdGFuY2VzIGZvciBsb25nIHNlZ21lbnRzLiBVc2UgdGhpcyB2YWx1ZSB0byB1bnNjYWxlIHRoZSBkaXN0YW5jZS5cbiNkZWZpbmUgTElORV9ESVNUQU5DRV9TQ0FMRSAyLjBcblxuYXR0cmlidXRlIHZlYzIgYV9wb3M7XG5hdHRyaWJ1dGUgdmVjNCBhX2RhdGE7XG5cbnVuaWZvcm0gbWF0NCB1X21hdHJpeDtcbnVuaWZvcm0gbWVkaXVtcCBmbG9hdCB1X3JhdGlvO1xudW5pZm9ybSBtZWRpdW1wIGZsb2F0IHVfbGluZXdpZHRoO1xudW5pZm9ybSBtZWRpdW1wIGZsb2F0IHVfZ2Fwd2lkdGg7XG51bmlmb3JtIG1lZGl1bXAgZmxvYXQgdV9hbnRpYWxpYXNpbmc7XG51bmlmb3JtIG1lZGl1bXAgZmxvYXQgdV9leHRyYTtcbnVuaWZvcm0gbWF0MiB1X2FudGlhbGlhc2luZ21hdHJpeDtcbnVuaWZvcm0gbWVkaXVtcCBmbG9hdCB1X29mZnNldDtcblxudmFyeWluZyB2ZWMyIHZfbm9ybWFsO1xudmFyeWluZyB2ZWMyIHZfbGluZXdpZHRoO1xudmFyeWluZyBmbG9hdCB2X2xpbmVzb2ZhcjtcbnZhcnlpbmcgZmxvYXQgdl9nYW1tYV9zY2FsZTtcblxudm9pZCBtYWluKCkge1xuICAgIHZlYzIgYV9leHRydWRlID0gYV9kYXRhLnh5IC0gMTI4LjA7XG4gICAgZmxvYXQgYV9kaXJlY3Rpb24gPSBtb2QoYV9kYXRhLnosIDQuMCkgLSAxLjA7XG4gICAgZmxvYXQgYV9saW5lc29mYXIgPSAoZmxvb3IoYV9kYXRhLnogLyA0LjApICsgYV9kYXRhLncgKiA2NC4wKSAqIExJTkVfRElTVEFOQ0VfU0NBTEU7XG5cbiAgICAvLyBXZSBzdG9yZSB0aGUgdGV4dHVyZSBub3JtYWxzIGluIHRoZSBtb3N0IGluc2lnbmlmaWNhbnQgYml0XG4gICAgLy8gdHJhbnNmb3JtIHkgc28gdGhhdCAwID0+IC0xIGFuZCAxID0+IDFcbiAgICAvLyBJbiB0aGUgdGV4dHVyZSBub3JtYWwsIHggaXMgMCBpZiB0aGUgbm9ybWFsIHBvaW50cyBzdHJhaWdodCB1cC9kb3duIGFuZCAxIGlmIGl0J3MgYSByb3VuZCBjYXBcbiAgICAvLyB5IGlzIDEgaWYgdGhlIG5vcm1hbCBwb2ludHMgdXAsIGFuZCAtMSBpZiBpdCBwb2ludHMgZG93blxuICAgIG1lZGl1bXAgdmVjMiBub3JtYWwgPSBtb2QoYV9wb3MsIDIuMCk7XG4gICAgbm9ybWFsLnkgPSBzaWduKG5vcm1hbC55IC0gMC41KTtcbiAgICB2X25vcm1hbCA9IG5vcm1hbDtcblxuICAgIGZsb2F0IGluc2V0ID0gdV9nYXB3aWR0aCArICh1X2dhcHdpZHRoID4gMC4wID8gdV9hbnRpYWxpYXNpbmcgOiAwLjApO1xuICAgIGZsb2F0IG91dHNldCA9IHVfZ2Fwd2lkdGggKyB1X2xpbmV3aWR0aCAqICh1X2dhcHdpZHRoID4gMC4wID8gMi4wIDogMS4wKSArIHVfYW50aWFsaWFzaW5nO1xuXG4gICAgLy8gU2NhbGUgdGhlIGV4dHJ1c2lvbiB2ZWN0b3IgZG93biB0byBhIG5vcm1hbCBhbmQgdGhlbiB1cCBieSB0aGUgbGluZSB3aWR0aFxuICAgIC8vIG9mIHRoaXMgdmVydGV4LlxuICAgIG1lZGl1bXAgdmVjMiBkaXN0ID0gb3V0c2V0ICogYV9leHRydWRlICogc2NhbGU7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIG9mZnNldCB3aGVuIGRyYXdpbmcgYSBsaW5lIHRoYXQgaXMgdG8gdGhlIHNpZGUgb2YgdGhlIGFjdHVhbCBsaW5lLlxuICAgIC8vIFdlIGRvIHRoaXMgYnkgY3JlYXRpbmcgYSB2ZWN0b3IgdGhhdCBwb2ludHMgdG93YXJkcyB0aGUgZXh0cnVkZSwgYnV0IHJvdGF0ZVxuICAgIC8vIGl0IHdoZW4gd2UncmUgZHJhd2luZyByb3VuZCBlbmQgcG9pbnRzIChhX2RpcmVjdGlvbiA9IC0xIG9yIDEpIHNpbmNlIHRoZWlyXG4gICAgLy8gZXh0cnVkZSB2ZWN0b3IgcG9pbnRzIGluIGFub3RoZXIgZGlyZWN0aW9uLlxuICAgIG1lZGl1bXAgZmxvYXQgdSA9IDAuNSAqIGFfZGlyZWN0aW9uO1xuICAgIG1lZGl1bXAgZmxvYXQgdCA9IDEuMCAtIGFicyh1KTtcbiAgICBtZWRpdW1wIHZlYzIgb2Zmc2V0ID0gdV9vZmZzZXQgKiBhX2V4dHJ1ZGUgKiBzY2FsZSAqIG5vcm1hbC55ICogbWF0Mih0LCAtdSwgdSwgdCk7XG5cbiAgICAvLyBSZW1vdmUgdGhlIHRleHR1cmUgbm9ybWFsIGJpdCBvZiB0aGUgcG9zaXRpb24gYmVmb3JlIHNjYWxpbmcgaXQgd2l0aCB0aGVcbiAgICAvLyBtb2RlbC92aWV3IG1hdHJpeC5cbiAgICBnbF9Qb3NpdGlvbiA9IHVfbWF0cml4ICogdmVjNChmbG9vcihhX3BvcyAqIDAuNSkgKyAob2Zmc2V0ICsgZGlzdCkgLyB1X3JhdGlvLCAwLjAsIDEuMCk7XG4gICAgdl9saW5lc29mYXIgPSBhX2xpbmVzb2ZhcjtcblxuICAgIC8vIHBvc2l0aW9uIG9mIHkgb24gdGhlIHNjcmVlblxuICAgIGZsb2F0IHkgPSBnbF9Qb3NpdGlvbi55IC8gZ2xfUG9zaXRpb24udztcblxuICAgIC8vIGhvdyBtdWNoIGZlYXR1cmVzIGFyZSBzcXVpc2hlZCBpbiB0aGUgeSBkaXJlY3Rpb24gYnkgdGhlIHRpbHRcbiAgICBmbG9hdCBzcXVpc2hfc2NhbGUgPSBsZW5ndGgoYV9leHRydWRlKSAvIGxlbmd0aCh1X2FudGlhbGlhc2luZ21hdHJpeCAqIGFfZXh0cnVkZSk7XG5cbiAgICAvLyBob3cgbXVjaCBmZWF0dXJlcyBhcmUgc3F1aXNoZWQgaW4gYWxsIGRpcmVjdGlvbnMgYnkgdGhlIHBlcnNwZWN0aXZlbmVzc1xuICAgIGZsb2F0IHBlcnNwZWN0aXZlX3NjYWxlID0gMS4wIC8gKDEuMCAtIG1pbih5ICogdV9leHRyYSwgMC45KSk7XG5cbiAgICB2X2xpbmV3aWR0aCA9IHZlYzIob3V0c2V0LCBpbnNldCk7XG4gICAgdl9nYW1tYV9zY2FsZSA9IHBlcnNwZWN0aXZlX3NjYWxlICogc3F1aXNoX3NjYWxlO1xufVxuIn0sbGluZXNkZnBhdHRlcm46e2ZyYWdtZW50U291cmNlOiIjaWZkZWYgR0xfRVNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2Vsc2VcbiNkZWZpbmUgbG93cFxuI2RlZmluZSBtZWRpdW1wXG4jZGVmaW5lIGhpZ2hwXG4jZW5kaWZcblxudW5pZm9ybSBsb3dwIHZlYzQgdV9jb2xvcjtcbnVuaWZvcm0gbG93cCBmbG9hdCB1X29wYWNpdHk7XG5cbnVuaWZvcm0gZmxvYXQgdV9ibHVyO1xudW5pZm9ybSBzYW1wbGVyMkQgdV9pbWFnZTtcbnVuaWZvcm0gZmxvYXQgdV9zZGZnYW1tYTtcbnVuaWZvcm0gZmxvYXQgdV9taXg7XG5cbnZhcnlpbmcgdmVjMiB2X25vcm1hbDtcbnZhcnlpbmcgdmVjMiB2X2xpbmV3aWR0aDtcbnZhcnlpbmcgdmVjMiB2X3RleF9hO1xudmFyeWluZyB2ZWMyIHZfdGV4X2I7XG52YXJ5aW5nIGZsb2F0IHZfZ2FtbWFfc2NhbGU7XG5cbnZvaWQgbWFpbigpIHtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIG9mIHRoZSBwaXhlbCBmcm9tIHRoZSBsaW5lIGluIHBpeGVscy5cbiAgICBmbG9hdCBkaXN0ID0gbGVuZ3RoKHZfbm9ybWFsKSAqIHZfbGluZXdpZHRoLnM7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGFudGlhbGlhc2luZyBmYWRlIGZhY3Rvci4gVGhpcyBpcyBlaXRoZXIgd2hlbiBmYWRpbmcgaW5cbiAgICAvLyB0aGUgbGluZSBpbiBjYXNlIG9mIGFuIG9mZnNldCBsaW5lICh2X2xpbmV3aWR0aC50KSBvciB3aGVuIGZhZGluZyBvdXRcbiAgICAvLyAodl9saW5ld2lkdGgucylcbiAgICBmbG9hdCBibHVyID0gdV9ibHVyICogdl9nYW1tYV9zY2FsZTtcbiAgICBmbG9hdCBhbHBoYSA9IGNsYW1wKG1pbihkaXN0IC0gKHZfbGluZXdpZHRoLnQgLSBibHVyKSwgdl9saW5ld2lkdGgucyAtIGRpc3QpIC8gYmx1ciwgMC4wLCAxLjApO1xuXG4gICAgZmxvYXQgc2RmZGlzdF9hID0gdGV4dHVyZTJEKHVfaW1hZ2UsIHZfdGV4X2EpLmE7XG4gICAgZmxvYXQgc2RmZGlzdF9iID0gdGV4dHVyZTJEKHVfaW1hZ2UsIHZfdGV4X2IpLmE7XG4gICAgZmxvYXQgc2RmZGlzdCA9IG1peChzZGZkaXN0X2EsIHNkZmRpc3RfYiwgdV9taXgpO1xuICAgIGFscGhhICo9IHNtb290aHN0ZXAoMC41IC0gdV9zZGZnYW1tYSwgMC41ICsgdV9zZGZnYW1tYSwgc2RmZGlzdCk7XG5cbiAgICBnbF9GcmFnQ29sb3IgPSB1X2NvbG9yICogKGFscGhhICogdV9vcGFjaXR5KTtcblxuI2lmZGVmIE9WRVJEUkFXX0lOU1BFQ1RPUlxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoMS4wKTtcbiNlbmRpZlxufVxuIix2ZXJ0ZXhTb3VyY2U6IiNpZmRlZiBHTF9FU1xucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuI2Vsc2VcbiNkZWZpbmUgbG93cFxuI2RlZmluZSBtZWRpdW1wXG4jZGVmaW5lIGhpZ2hwXG4jZW5kaWZcblxuLy8gZmxvb3IoMTI3IC8gMikgPT0gNjMuMFxuLy8gdGhlIG1heGltdW0gYWxsb3dlZCBtaXRlciBsaW1pdCBpcyAyLjAgYXQgdGhlIG1vbWVudC4gdGhlIGV4dHJ1ZGUgbm9ybWFsIGlzXG4vLyBzdG9yZWQgaW4gYSBieXRlICgtMTI4Li4xMjcpLiB3ZSBzY2FsZSByZWd1bGFyIG5vcm1hbHMgdXAgdG8gbGVuZ3RoIDYzLCBidXRcbi8vIHRoZXJlIGFyZSBhbHNvIFwic3BlY2lhbFwiIG5vcm1hbHMgdGhhdCBoYXZlIGEgYmlnZ2VyIGxlbmd0aCAob2YgdXAgdG8gMTI2IGluXG4vLyB0aGlzIGNhc2UpLlxuLy8gI2RlZmluZSBzY2FsZSA2My4wXG4jZGVmaW5lIHNjYWxlIDAuMDE1ODczMDE2XG5cbi8vIFdlIHNjYWxlIHRoZSBkaXN0YW5jZSBiZWZvcmUgYWRkaW5nIGl0IHRvIHRoZSBidWZmZXJzIHNvIHRoYXQgd2UgY2FuIHN0b3JlXG4vLyBsb25nIGRpc3RhbmNlcyBmb3IgbG9uZyBzZWdtZW50cy4gVXNlIHRoaXMgdmFsdWUgdG8gdW5zY2FsZSB0aGUgZGlzdGFuY2UuXG4jZGVmaW5lIExJTkVfRElTVEFOQ0VfU0NBTEUgMi4wXG5cbmF0dHJpYnV0ZSB2ZWMyIGFfcG9zO1xuYXR0cmlidXRlIHZlYzQgYV9kYXRhO1xuXG51bmlmb3JtIG1hdDQgdV9tYXRyaXg7XG51bmlmb3JtIG1lZGl1bXAgZmxvYXQgdV9yYXRpbztcbnVuaWZvcm0gbWVkaXVtcCBmbG9hdCB1X2xpbmV3aWR0aDtcbnVuaWZvcm0gbWVkaXVtcCBmbG9hdCB1X2dhcHdpZHRoO1xudW5pZm9ybSBtZWRpdW1wIGZsb2F0IHVfYW50aWFsaWFzaW5nO1xudW5pZm9ybSB2ZWMyIHVfcGF0dGVybnNjYWxlX2E7XG51bmlmb3JtIGZsb2F0IHVfdGV4X3lfYTtcbnVuaWZvcm0gdmVjMiB1X3BhdHRlcm5zY2FsZV9iO1xudW5pZm9ybSBmbG9hdCB1X3RleF95X2I7XG51bmlmb3JtIGZsb2F0IHVfZXh0cmE7XG51bmlmb3JtIG1hdDIgdV9hbnRpYWxpYXNpbmdtYXRyaXg7XG51bmlmb3JtIG1lZGl1bXAgZmxvYXQgdV9vZmZzZXQ7XG5cbnZhcnlpbmcgdmVjMiB2X25vcm1hbDtcbnZhcnlpbmcgdmVjMiB2X2xpbmV3aWR0aDtcbnZhcnlpbmcgdmVjMiB2X3RleF9hO1xudmFyeWluZyB2ZWMyIHZfdGV4X2I7XG52YXJ5aW5nIGZsb2F0IHZfZ2FtbWFfc2NhbGU7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2ZWMyIGFfZXh0cnVkZSA9IGFfZGF0YS54eSAtIDEyOC4wO1xuICAgIGZsb2F0IGFfZGlyZWN0aW9uID0gbW9kKGFfZGF0YS56LCA0LjApIC0gMS4wO1xuICAgIGZsb2F0IGFfbGluZXNvZmFyID0gKGZsb29yKGFfZGF0YS56IC8gNC4wKSArIGFfZGF0YS53ICogNjQuMCkgKiBMSU5FX0RJU1RBTkNFX1NDQUxFO1xuXG4gICAgLy8gV2Ugc3RvcmUgdGhlIHRleHR1cmUgbm9ybWFscyBpbiB0aGUgbW9zdCBpbnNpZ25pZmljYW50IGJpdFxuICAgIC8vIHRyYW5zZm9ybSB5IHNvIHRoYXQgMCA9PiAtMSBhbmQgMSA9PiAxXG4gICAgLy8gSW4gdGhlIHRleHR1cmUgbm9ybWFsLCB4IGlzIDAgaWYgdGhlIG5vcm1hbCBwb2ludHMgc3RyYWlnaHQgdXAvZG93biBhbmQgMSBpZiBpdCdzIGEgcm91bmQgY2FwXG4gICAgLy8geSBpcyAxIGlmIHRoZSBub3JtYWwgcG9pbnRzIHVwLCBhbmQgLTEgaWYgaXQgcG9pbnRzIGRvd25cbiAgICBtZWRpdW1wIHZlYzIgbm9ybWFsID0gbW9kKGFfcG9zLCAyLjApO1xuICAgIG5vcm1hbC55ID0gc2lnbihub3JtYWwueSAtIDAuNSk7XG4gICAgdl9ub3JtYWwgPSBub3JtYWw7XG5cbiAgICBmbG9hdCBpbnNldCA9IHVfZ2Fwd2lkdGggKyAodV9nYXB3aWR0aCA+IDAuMCA/IHVfYW50aWFsaWFzaW5nIDogMC4wKTtcbiAgICBmbG9hdCBvdXRzZXQgPSB1X2dhcHdpZHRoICsgdV9saW5ld2lkdGggKiAodV9nYXB3aWR0aCA+IDAuMCA/IDIuMCA6IDEuMCkgKyB1X2FudGlhbGlhc2luZztcblxuICAgIC8vIFNjYWxlIHRoZSBleHRydXNpb24gdmVjdG9yIGRvd24gdG8gYSBub3JtYWwgYW5kIHRoZW4gdXAgYnkgdGhlIGxpbmUgd2lkdGhcbiAgICAvLyBvZiB0aGlzIHZlcnRleC5cbiAgICBtZWRpdW1wIHZlYzIgZGlzdCA9IG91dHNldCAqIGFfZXh0cnVkZSAqIHNjYWxlO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBvZmZzZXQgd2hlbiBkcmF3aW5nIGEgbGluZSB0aGF0IGlzIHRvIHRoZSBzaWRlIG9mIHRoZSBhY3R1YWwgbGluZS5cbiAgICAvLyBXZSBkbyB0aGlzIGJ5IGNyZWF0aW5nIGEgdmVjdG9yIHRoYXQgcG9pbnRzIHRvd2FyZHMgdGhlIGV4dHJ1ZGUsIGJ1dCByb3RhdGVcbiAgICAvLyBpdCB3aGVuIHdlJ3JlIGRyYXdpbmcgcm91bmQgZW5kIHBvaW50cyAoYV9kaXJlY3Rpb24gPSAtMSBvciAxKSBzaW5jZSB0aGVpclxuICAgIC8vIGV4dHJ1ZGUgdmVjdG9yIHBvaW50cyBpbiBhbm90aGVyIGRpcmVjdGlvbi5cbiAgICBtZWRpdW1wIGZsb2F0IHUgPSAwLjUgKiBhX2RpcmVjdGlvbjtcbiAgICBtZWRpdW1wIGZsb2F0IHQgPSAxLjAgLSBhYnModSk7XG4gICAgbWVkaXVtcCB2ZWMyIG9mZnNldCA9IHVfb2Zmc2V0ICogYV9leHRydWRlICogc2NhbGUgKiBub3JtYWwueSAqIG1hdDIodCwgLXUsIHUsIHQpO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSB0ZXh0dXJlIG5vcm1hbCBiaXQgb2YgdGhlIHBvc2l0aW9uIGJlZm9yZSBzY2FsaW5nIGl0IHdpdGggdGhlXG4gICAgLy8gbW9kZWwvdmlldyBtYXRyaXguXG4gICAgZ2xfUG9zaXRpb24gPSB1X21hdHJpeCAqIHZlYzQoZmxvb3IoYV9wb3MgKiAwLjUpICsgKG9mZnNldCArIGRpc3QpIC8gdV9yYXRpbywgMC4wLCAxLjApO1xuXG4gICAgdl90ZXhfYSA9IHZlYzIoYV9saW5lc29mYXIgKiB1X3BhdHRlcm5zY2FsZV9hLngsIG5vcm1hbC55ICogdV9wYXR0ZXJuc2NhbGVfYS55ICsgdV90ZXhfeV9hKTtcbiAgICB2X3RleF9iID0gdmVjMihhX2xpbmVzb2ZhciAqIHVfcGF0dGVybnNjYWxlX2IueCwgbm9ybWFsLnkgKiB1X3BhdHRlcm5zY2FsZV9iLnkgKyB1X3RleF95X2IpO1xuXG4gICAgLy8gcG9zaXRpb24gb2YgeSBvbiB0aGUgc2NyZWVuXG4gICAgZmxvYXQgeSA9IGdsX1Bvc2l0aW9uLnkgLyBnbF9Qb3NpdGlvbi53O1xuXG4gICAgLy8gaG93IG11Y2ggZmVhdHVyZXMgYXJlIHNxdWlzaGVkIGluIHRoZSB5IGRpcmVjdGlvbiBieSB0aGUgdGlsdFxuICAgIGZsb2F0IHNxdWlzaF9zY2FsZSA9IGxlbmd0aChhX2V4dHJ1ZGUpIC8gbGVuZ3RoKHVfYW50aWFsaWFzaW5nbWF0cml4ICogYV9leHRydWRlKTtcblxuICAgIC8vIGhvdyBtdWNoIGZlYXR1cmVzIGFyZSBzcXVpc2hlZCBpbiBhbGwgZGlyZWN0aW9ucyBieSB0aGUgcGVyc3BlY3RpdmVuZXNzXG4gICAgZmxvYXQgcGVyc3BlY3RpdmVfc2NhbGUgPSAxLjAgLyAoMS4wIC0gbWluKHkgKiB1X2V4dHJhLCAwLjkpKTtcblxuICAgIHZfbGluZXdpZHRoID0gdmVjMihvdXRzZXQsIGluc2V0KTtcbiAgICB2X2dhbW1hX3NjYWxlID0gcGVyc3BlY3RpdmVfc2NhbGUgKiBzcXVpc2hfc2NhbGU7XG59XG4ifSxvdXRsaW5lOntmcmFnbWVudFNvdXJjZToiI2lmZGVmIEdMX0VTXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNlbHNlXG4jZGVmaW5lIGxvd3BcbiNkZWZpbmUgbWVkaXVtcFxuI2RlZmluZSBoaWdocFxuI2VuZGlmXG5cbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCB2ZWM0IG91dGxpbmVfY29sb3JcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XG5cbnZhcnlpbmcgdmVjMiB2X3Bvcztcblxudm9pZCBtYWluKCkge1xuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgdmVjNCBvdXRsaW5lX2NvbG9yXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XG5cbiAgICBmbG9hdCBkaXN0ID0gbGVuZ3RoKHZfcG9zIC0gZ2xfRnJhZ0Nvb3JkLnh5KTtcbiAgICBmbG9hdCBhbHBoYSA9IHNtb290aHN0ZXAoMS4wLCAwLjAsIGRpc3QpO1xuICAgIGdsX0ZyYWdDb2xvciA9IG91dGxpbmVfY29sb3IgKiAoYWxwaGEgKiBvcGFjaXR5KTtcblxuI2lmZGVmIE9WRVJEUkFXX0lOU1BFQ1RPUlxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoMS4wKTtcbiNlbmRpZlxufVxuIix2ZXJ0ZXhTb3VyY2U6IiNpZmRlZiBHTF9FU1xucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuI2Vsc2VcbiNkZWZpbmUgbG93cFxuI2RlZmluZSBtZWRpdW1wXG4jZGVmaW5lIGhpZ2hwXG4jZW5kaWZcblxuYXR0cmlidXRlIHZlYzIgYV9wb3M7XG5cbnVuaWZvcm0gbWF0NCB1X21hdHJpeDtcbnVuaWZvcm0gdmVjMiB1X3dvcmxkO1xuXG52YXJ5aW5nIHZlYzIgdl9wb3M7XG5cbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCB2ZWM0IG91dGxpbmVfY29sb3JcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XG5cbnZvaWQgbWFpbigpIHtcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIHZlYzQgb3V0bGluZV9jb2xvclxuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxuXG4gICAgZ2xfUG9zaXRpb24gPSB1X21hdHJpeCAqIHZlYzQoYV9wb3MsIDAsIDEpO1xuICAgIHZfcG9zID0gKGdsX1Bvc2l0aW9uLnh5IC8gZ2xfUG9zaXRpb24udyArIDEuMCkgLyAyLjAgKiB1X3dvcmxkO1xufVxuIn0sb3V0bGluZXBhdHRlcm46e2ZyYWdtZW50U291cmNlOiIjaWZkZWYgR0xfRVNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2Vsc2VcbiNkZWZpbmUgbG93cFxuI2RlZmluZSBtZWRpdW1wXG4jZGVmaW5lIGhpZ2hwXG4jZW5kaWZcblxudW5pZm9ybSBmbG9hdCB1X29wYWNpdHk7XG51bmlmb3JtIHZlYzIgdV9wYXR0ZXJuX3RsX2E7XG51bmlmb3JtIHZlYzIgdV9wYXR0ZXJuX2JyX2E7XG51bmlmb3JtIHZlYzIgdV9wYXR0ZXJuX3RsX2I7XG51bmlmb3JtIHZlYzIgdV9wYXR0ZXJuX2JyX2I7XG51bmlmb3JtIGZsb2F0IHVfbWl4O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlO1xuXG52YXJ5aW5nIHZlYzIgdl9wb3NfYTtcbnZhcnlpbmcgdmVjMiB2X3Bvc19iO1xudmFyeWluZyB2ZWMyIHZfcG9zO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdmVjMiBpbWFnZWNvb3JkID0gbW9kKHZfcG9zX2EsIDEuMCk7XG4gICAgdmVjMiBwb3MgPSBtaXgodV9wYXR0ZXJuX3RsX2EsIHVfcGF0dGVybl9icl9hLCBpbWFnZWNvb3JkKTtcbiA
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment