Skip to content

Instantly share code, notes, and snippets.

@justlebeau
Last active October 5, 2016 18:18
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 justlebeau/c19508c25c3032669b0e016b8d2f437d to your computer and use it in GitHub Desktop.
Save justlebeau/c19508c25c3032669b0e016b8d2f437d to your computer and use it in GitHub Desktop.
Interlock directorate Network Plot
license: mit
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEFkZCBhIG1ldGhvZCB0byBkZWxlZ2F0b3IgdGhhdCwgd2hlbiBpbnZva2VkLCBjYWxscwogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbgogIC8vIHRoZSBkZWxlZ2F0ZWUsIGJ1dCB0aGVyZSB3YXMgb25lIG9uIGRlbGVnYXRvciBiZWZvcmUKICAvLyBkZWxlZ2F0ZU1ldGhvZCB3YXMgY2FsbGVkLCB0aGVuIHRoZSBvcmlnaW5hbCB2ZXJzaW9uCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gdmFyIGEgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ExJyk7IH0KICAvLyAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYTInKTsgfQogIC8vIH07CiAgLy8gdmFyIGIgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2IxJyk7IH0KICAvLyB9OwogIC8vIGRlbGVnYXRlTWV0aG9kKGEsIGIsICJtZXRob2QxIik7CiAgLy8gZGVsZWdhdGVNZXRob2QoYSwgYiwgIm1ldGhvZDIiKTsKICAvLyBhLm1ldGhvZDEoKTsKICAvLyBhLm1ldGhvZDIoKTsKICAvLwogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4KICBmdW5jdGlvbiBkZWxlZ2F0ZU1ldGhvZChkZWxlZ2F0b3IsIGRlbGVnYXRlZSwgbWV0aG9kTmFtZSkgewogICAgdmFyIGluaGVyaXRlZCA9IGRlbGVnYXRvclttZXRob2ROYW1lXTsKICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdGFyZ2V0ID0gZGVsZWdhdGVlOwogICAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGVlW21ldGhvZE5hbWVdOwoKICAgICAgLy8gVGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0IG9uIHRoZSBkZWxlZ2F0ZWUuIEluc3RlYWQsCiAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBvbiB0aGUgZGVsZWdhdG9yLCBpZiBpdCBleGlzdHMuCiAgICAgIGlmICghbWV0aG9kKSB7CiAgICAgICAgdGFyZ2V0ID0gZGVsZWdhdG9yOwogICAgICAgIG1ldGhvZCA9IGluaGVyaXRlZDsKICAgICAgfQoKICAgICAgaWYgKG1ldGhvZCkgewogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gSW1wbGVtZW50IGEgdmFndWUgZmFjc2ltaWxpZSBvZiBqUXVlcnkncyBkYXRhIG1ldGhvZAogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICByZXR1cm4gZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV07CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgewogICAgICBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXSA9IHZhbHVlOwogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGVsZW1lbnREYXRhOiAiICsKICAgICAgICBhcmd1bWVudHMubGVuZ3RoKTsKICAgIH0KICB9CgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleAogIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCAiXFwkJiIpOwogIH0KCiAgZnVuY3Rpb24gaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkgewogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOwogICAgcmV0dXJuIHJlLnRlc3QoZWwuY2xhc3NOYW1lKTsKICB9CgogIC8vIGVsZW1lbnRzIC0gYXJyYXkgKG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBvZiBIVE1MIGVsZW1lbnRzCiAgLy8gY2xhc3NOYW1lIC0gY2xhc3MgbmFtZSB0byB0ZXN0IGZvcgogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsKICAvLyAgIGlmIGZhbHNlLCBvbmx5IHJldHVybiBlbGVtZW50cyAqd2l0aG91dCogZ2l2ZW4gY2xhc3NOYW1lCiAgZnVuY3Rpb24gZmlsdGVyQnlDbGFzcyhlbGVtZW50cywgY2xhc3NOYW1lLCBpbmNsdWRlKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaGFzQ2xhc3MoZWxlbWVudHNbaV0sIGNsYXNzTmFtZSkgPT0gaW5jbHVkZSkKICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQoKICBmdW5jdGlvbiBvbihvYmosIGV2ZW50TmFtZSwgZnVuYykgewogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgZmFsc2UpOwogICAgfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpIHsKICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvZmYob2JqLCBldmVudE5hbWUsIGZ1bmMpIHsKICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7CiAgICBlbHNlIGlmIChvYmouZGV0YWNoRXZlbnQpIHsKICAgICAgb2JqLmRldGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aAogIC8vIHRoZSAicGFkZGluZyIgQ1NTIHByb3BlcnR5CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3BhZGRpbmcKICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7CiAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgIHZhbHVlID0gW3ZhbHVlXTsKICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMF0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzBdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzNdfTsKICAgIH0KICB9CgogIC8vIENvbnZlcnQgYW4gdW5wYWNrZWQgcGFkZGluZyBvYmplY3QgdG8gYSBDU1MgdmFsdWUKICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgewogICAgcmV0dXJuIHBhZGRpbmdPYmoudG9wICsgInB4ICIgKyBwYWRkaW5nT2JqLnJpZ2h0ICsgInB4ICIgKyBwYWRkaW5nT2JqLmJvdHRvbSArICJweCAiICsgcGFkZGluZ09iai5sZWZ0ICsgInB4IjsKICB9CgogIC8vIE1ha2VzIGEgbnVtYmVyIHN1aXRhYmxlIGZvciBDU1MKICBmdW5jdGlvbiBweCh4KSB7CiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIHggKyAicHgiOwogICAgZWxzZQogICAgICByZXR1cm4geDsKICB9CgogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuCiAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIgbnVsbCwgb3IgYW4gb2JqZWN0IHdpdGggZmlsbCwgcGFkZGluZywKICAvLyBkZWZhdWx0V2lkdGgsIGRlZmF1bHRIZWlnaHQgZmllbGRzLgogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgewogICAgdmFyIHNpemluZ0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vaHRtbHdpZGdldC1zaXppbmcnXSIpOwogICAgaWYgKCFzaXppbmdFbCkKICAgICAgcmV0dXJuIG51bGw7CiAgICB2YXIgc3AgPSBKU09OLnBhcnNlKHNpemluZ0VsLnRleHRDb250ZW50IHx8IHNpemluZ0VsLnRleHQgfHwgInt9Iik7CiAgICBpZiAodmlld2VyTW9kZSkgewogICAgICByZXR1cm4gc3Audmlld2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHNwLmJyb3dzZXI7CiAgICB9CiAgfQoKICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLgogIC8vICAgRWFjaCBlbGVtZW50IG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdGhhdCB5aWVsZHMgYQogIC8vICAgZnVuY3Rpb24uIE9yLCBjYW4gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICJjb2RlIiBhbmQgImRhdGEiCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nCiAgLy8gICBvZiBKUyB0aGF0J3MgYW4gZXhwciB0aGF0IHlpZWxkcyBhIGZ1bmN0aW9uLCBhbmQgImRhdGEiIHNob3VsZCBiZQogIC8vICAgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBhZGRlZCBhcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHdoZW4gdGhhdAogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLgogIC8vIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgInRoaXMiIGZvciBlYWNoIGZ1bmN0aW9uCiAgLy8gICBleGVjdXRpb24uCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlCiAgLy8gICBzYW1lIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zLikKICBmdW5jdGlvbiBldmFsQW5kUnVuKHRhc2tzLCB0YXJnZXQsIGFyZ3MpIHsKICAgIGlmICh0YXNrcykgewogICAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgdmFyIHRoZXNlQXJncyA9IGFyZ3M7CiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHRoZXNlQXJncyA9IHRoZXNlQXJncy5jb25jYXQoW3Rhc2suZGF0YV0pOwogICAgICAgICAgdGFzayA9IHRhc2suY29kZTsKICAgICAgICB9CiAgICAgICAgdmFyIHRhc2tGdW5jID0gZXZhbCgiKCIgKyB0YXNrICsgIikiKTsKICAgICAgICBpZiAodHlwZW9mKHRhc2tGdW5jKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOwogICAgICAgIH0KICAgICAgICB0YXNrRnVuYy5hcHBseSh0YXJnZXQsIHRoZXNlQXJncyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdFNpemluZyhlbCkgewogICAgdmFyIHNpemluZyA9IHNpemluZ1BvbGljeShlbCk7CiAgICBpZiAoIXNpemluZykKICAgICAgcmV0dXJuOwoKICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsKICAgIGlmICghY2VsKQogICAgICByZXR1cm47CgogICAgaWYgKHR5cGVvZihzaXppbmcucGFkZGluZykgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luID0gIjAiOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOwogICAgfQoKICAgIGlmIChzaXppbmcuZmlsbCkgewogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIGlmIChjZWwpIHsKICAgICAgICBjZWwuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgIHZhciBwYWQgPSB1bnBhY2tQYWRkaW5nKHNpemluZy5wYWRkaW5nKTsKICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLnJpZ2h0ID0gcGFkLnJpZ2h0ICsgInB4IjsKICAgICAgICBjZWwuc3R5bGUuYm90dG9tID0gcGFkLmJvdHRvbSArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7CiAgICAgICAgZWwuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwKICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY2VsLm9mZnNldEhlaWdodDsgfQogICAgICB9OwoKICAgIH0gZWxzZSB7CiAgICAgIGVsLnN0eWxlLndpZHRoID0gcHgoc2l6aW5nLndpZHRoKTsKICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LAogICAgICAgIGdldEhlaWdodDogZnVuY3Rpb24oKSB7IHJldHVybiBlbC5vZmZzZXRIZWlnaHQ7IH0KICAgICAgfTsKICAgIH0KICB9CgogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzCiAgdmFyIGRlZmF1bHRzID0gewogICAgZmluZDogZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7CiAgICB9LAogICAgcmVuZGVyRXJyb3I6IGZ1bmN0aW9uKGVsLCBlcnIpIHsKICAgICAgdmFyICRlbCA9ICQoZWwpOwoKICAgICAgdGhpcy5jbGVhckVycm9yKGVsKTsKCiAgICAgIC8vIEFkZCBhbGwgdGhlc2UgZXJyb3IgY2xhc3NlcywgYXMgU2hpbnkgZG9lcwogICAgICB2YXIgZXJyQ2xhc3MgPSAic2hpbnktb3V0cHV0LWVycm9yIjsKICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7CiAgICAgICAgLy8gdXNlIHRoZSBjbGFzc2VzIG9mIHRoZSBlcnJvciBjb25kaXRpb24gYXMgQ1NTIGNsYXNzIG5hbWVzCiAgICAgICAgZXJyQ2xhc3MgPSBlcnJDbGFzcyArICIgIiArICQubWFwKGFzQXJyYXkoZXJyLnR5cGUpLCBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOwogICAgICAgIH0pLmpvaW4oIiAiKTsKICAgICAgfQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7CgogICAgICAvLyBJcyBlbCBpbmxpbmUgb3IgYmxvY2s/IElmIGlubGluZSBvciBpbmxpbmUtYmxvY2ssIGp1c3QgZGlzcGxheTpub25lIGl0CiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLgogICAgICB2YXIgZGlzcGxheSA9ICRlbC5jc3MoImRpc3BsYXkiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgZGlzcGxheSk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICAkZWwuaGlkZSgpOwogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsKICAgICAgICAgIHZhciBlcnJvclNwYW4gPSAkKCI8c3Bhbj4iKS5hZGRDbGFzcyhlcnJDbGFzcyk7CiAgICAgICAgICBlcnJvclNwYW4udGV4dChlcnIubWVzc2FnZSk7CiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIikgewogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlCiAgICAgICAgLy8gZWwsIGFuZCBwb3NpdGlvbiB0aGUgZXJyb3IgdG8gYmUgb24gdG9wIG9mIHRoZSBlbC4KICAgICAgICAvLyBNYXJrIGl0IHdpdGggYSB1bmlxdWUgSUQgYW5kIENTUyBjbGFzcyBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGxhdGVyLgogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSAiIikgewogICAgICAgICAgdmFyIGVycm9yRGl2ID0gJCgiPGRpdj4iKS5hZGRDbGFzcyhlcnJDbGFzcykuY3NzKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpCiAgICAgICAgICAgIC8vIHNldHRpbmcgd2lkdGggY2FuIHB1c2ggb3V0IHRoZSBwYWdlIHNpemUsIGZvcmNpbmcgb3RoZXJ3aXNlCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3IKICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgdG8gc2hyaW5rOyBzbyB1c2UgbWF4LXdpZHRoIGluc3RlYWQKICAgICAgICAgICAgLmNzcygibWF4V2lkdGgiLCBlbC5vZmZzZXRXaWR0aCkKICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgIGVycm9yRGl2LnRleHQoZXJyLm1lc3NhZ2UpOwogICAgICAgICAgJGVsLmFmdGVyKGVycm9yRGl2KTsKCiAgICAgICAgICAvLyBSZWFsbHkgZHVtYiB3YXkgdG8ga2VlcCB0aGUgc2l6ZS9wb3NpdGlvbiBvZiB0aGUgZXJyb3IgaW4gc3luYyB3aXRoCiAgICAgICAgICAvLyB0aGUgcGFyZW50IGVsZW1lbnQgYXMgdGhlIHdpbmRvdyBpcyByZXNpemVkIG9yIHdoYXRldmVyLgogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghZXJyb3JEaXZbMF0ucGFyZW50RWxlbWVudCkgewogICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50SWQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvckRpdgogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgICAuY3NzKCJsZWZ0IiwgZWwub2Zmc2V0TGVmdCkKICAgICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICB9LCA1MDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGNsZWFyRXJyb3I6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIHZhciAkZWwgPSAkKGVsKTsKICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgbnVsbCk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICBpZiAoZGlzcGxheSkKICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsKICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOwogICAgICB9IGVsc2UgaWYgKGRpc3BsYXkgPT09ICJibG9jayIpewogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOwogICAgICAgICQoZWwubmV4dFNpYmxpbmcpLmZpbHRlcigiLmh0bWx3aWRnZXRzLWVycm9yIikucmVtb3ZlKCk7CiAgICAgIH0KICAgIH0sCiAgICBzaXppbmc6IHt9CiAgfTsKCiAgLy8gQ2FsbGVkIGJ5IHdpZGdldCBiaW5kaW5ncyB0byByZWdpc3RlciBhIG5ldyB0eXBlIG9mIHdpZGdldC4gVGhlIGRlZmluaXRpb24KICAvLyBvYmplY3QgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlCiAgLy8gICB1c2VkIGJ5IGRlZmF1bHQgYXMgdGhlIENTUyBjbGFzc25hbWUgdG8gbG9vayBmb3IuCiAgLy8gLSBpbml0aWFsaXplIChvcHRpb25hbCkgLSBBIGZ1bmN0aW9uKGVsKSB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uY2UgcGVyCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkCiAgLy8gICB2YWx1ZSB0byByZW5kZXJWYWx1ZS4KICAvLyAtIHJlbmRlclZhbHVlIChyZXF1aXJlZCkgLSBBIGZ1bmN0aW9uKGVsLCBkYXRhLCBpbml0VmFsdWUpIHRoYXQgd2lsbCBiZQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXIKICAvLyAgIGVsZW1lbnQ7IFNoaW55IGFwcHMgd2lsbCBjYXVzZSB0aGlzIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBwZXIKICAvLyAgIGVsZW1lbnQsIGFzIHRoZSBkYXRhIGNoYW5nZXMuCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsKICAgIGlmICghZGVmaW5pdGlvbi5uYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIG5hbWUiKTsKICAgIH0KICAgIGlmICghZGVmaW5pdGlvbi50eXBlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHR5cGUiKTsKICAgIH0KICAgIC8vIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgb3V0cHV0IHdpZGdldHMKICAgIGlmIChkZWZpbml0aW9uLnR5cGUgIT09ICJvdXRwdXQiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsKICAgIH0KICAgIC8vIFRPRE86IFZlcmlmeSB0aGF0IC5uYW1lIGlzIGEgdmFsaWQgQ1NTIGNsYXNzbmFtZQoKICAgIC8vIFN1cHBvcnQgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb25zLiBPbGQtc3R5bGUgY2xhc3MtYm91bmQKICAgIC8vIGRlZmluaXRpb25zIGhhdmUgb25lIHdpZGdldCAib2JqZWN0IiBwZXIgd2lkZ2V0IHBlciB0eXBlL2NsYXNzIG9mCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cwogICAgLy8gdGFrZSBlbCBhbmQgaW5zdGFuY2UgYXJndW1lbnRzLCBiZWNhdXNlIHRoZSB3aWRnZXQgb2JqZWN0IGNhbid0CiAgICAvLyBzdG9yZSB0aGVtLiBOZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0CiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0CiAgICAvLyBwcm92aWRlIHJlbmRlclZhbHVlIG9yIHJlc2l6ZSBtZXRob2RzIGF0IGFsbCwganVzdCB0aGUgc2luZ2xlIG1ldGhvZAogICAgLy8gICBmYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4KICAgIC8vIFRoaXMgZW5hYmxlcyBhIGZhciBtb3JlIG5hdHVyYWwgcHJvZ3JhbW1pbmcgc3R5bGUgZm9yIHRoZSB3aWRnZXQKICAgIC8vIGF1dGhvciwgd2hvIGNhbiBzdG9yZSBwZXItaW5zdGFuY2Ugc3RhdGUgdXNpbmcgZWl0aGVyIE9PLXN0eWxlCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzCiAgICAvLyBpcyBpbiBjb250cmFzdCB0byB3aGF0IGNhbiBvbmx5IGJlIGNhbGxlZCBDLXN0eWxlIHBzZXVkby1PTyB3aGljaCBpcwogICAgLy8gd2hhdCB3ZSByZXF1aXJlZCBiZWZvcmUpLgogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgewogICAgICBkZWZpbml0aW9uID0gY3JlYXRlTGVnYWN5RGVmaW5pdGlvbkFkYXB0ZXIoZGVmaW5pdGlvbik7CiAgICB9CgogICAgaWYgKCFkZWZpbml0aW9uLnJlbmRlclZhbHVlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHJlbmRlclZhbHVlIGZ1bmN0aW9uIik7CiAgICB9CgogICAgLy8gRm9yIHN0YXRpYyByZW5kZXJpbmcgKG5vbi1TaGlueSksIHVzZSBhIHNpbXBsZSB3aWRnZXQgcmVnaXN0cmF0aW9uCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28KICAgIC8vIGNvbnRhaW4gc3RhdGljIHdpZGdldHMuCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLgogICAgdmFyIHN0YXRpY0JpbmRpbmcgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKICAgIG92ZXJyaWRlTWV0aG9kKHN0YXRpY0JpbmRpbmcsICJmaW5kIiwgZnVuY3Rpb24oc3VwZXJmdW5jKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgewogICAgICAgIHZhciByZXN1bHRzID0gc3VwZXJmdW5jKHNjb3BlKTsKICAgICAgICAvLyBGaWx0ZXIgb3V0IFNoaW55IG91dHB1dHMsIHdlIG9ubHkgd2FudCB0aGUgc3RhdGljIGtpbmQKICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOwogICAgICB9OwogICAgfSk7CiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOwoKICAgIGlmIChzaGlueU1vZGUpIHsKICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4KICAgICAgLy8gVGhlIGRlZmluaXRpb24gaXRzZWxmIHdpbGwgbm90IGJlIHRoZSBvdXRwdXQgYmluZGluZywgaW5zdGVhZAogICAgICAvLyB3ZSB3aWxsIG1ha2UgYW4gb3V0cHV0IGJpbmRpbmcgb2JqZWN0IHRoYXQgZGVsZWdhdGVzIHRvIHRoZQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kCiAgICAgIC8vIG5hbWUgKHJlbmRlclZhbHVlKSBmb3IgaHRtbHdpZGdldHMgZGVmaW5pdGlvbiBhbmQgU2hpbnkgYmluZGluZ3MKICAgICAgLy8gYnV0IHRoZXkgYWN0dWFsbHkgaGF2ZSBxdWl0ZSBkaWZmZXJlbnQgc2VtYW50aWNzICh0aGUgU2hpbnkKICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0CiAgICAgIC8vIHN0cmlwcyBvZmYgYmVmb3JlIGNhbGxpbmcgaHRtbHdpZGdldHMgcmVuZGVyVmFsdWUpLiBXZSBjYW4ndAogICAgICAvLyBqdXN0IGlnbm9yZSB0aGUgZGlmZmVyZW5jZSBiZWNhdXNlIGluIHNvbWUgd2lkZ2V0cyBpdCdzIGhlbHBmdWwKICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZgogICAgICAvLyB3ZSdyZSBub3QgZGVsZWdhdGluZywgdGhlbiB0aGF0IGNhbGwgd2lsbCBnbyB0byB0aGUgU2hpbnkKICAgICAgLy8gdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBodG1sd2lkZ2V0cyB2ZXJzaW9uLgoKICAgICAgLy8gTWVyZ2UgZGVmYXVsdHMgd2l0aCBkZWZpbml0aW9uLCB3aXRob3V0IG11dGF0aW5nIGVpdGhlci4KICAgICAgdmFyIGJpbmRpbmdEZWYgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKCiAgICAgIC8vIFRoaXMgb2JqZWN0IHdpbGwgYmUgb3VyIGFjdHVhbCBTaGlueSBiaW5kaW5nLgogICAgICB2YXIgc2hpbnlCaW5kaW5nID0gbmV3IFNoaW55Lk91dHB1dEJpbmRpbmcoKTsKCiAgICAgIC8vIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgd2UnbGwgd2FudCB0byBzaW1wbHkgdXNlIHRoZSBiaW5kaW5nRGVmJ3MKICAgICAgLy8gdmVyc2lvbiBvZiBtZXRob2RzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0bwogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwKICAgICAgLy8gbWV0aG9kcyBpbiB0aGUgZnV0dXJlLCBhbmQgd2Ugd2FudCB0aGVtIHRvIGJlIG92ZXJyaWRlYWJsZSBieQogICAgICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcgZGVmaW5pdGlvbnMsIHRoZW4gd2UnbGwgbmVlZCB0byBhZGQgdGhlbSB0byB0aGlzCiAgICAgIC8vIGxpc3QuCiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImdldElkIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgIm9uVmFsdWVDaGFuZ2UiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgInJlbmRlckVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImNsZWFyRXJyb3IiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7CgogICAgICAvLyBUaGUgZmluZCwgcmVuZGVyVmFsdWUsIGFuZCByZXNpemUgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIGJlY2F1c2Ugd2UKICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4KCiAgICAgIHNoaW55QmluZGluZy5maW5kID0gZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7CgogICAgICAgIC8vIE9ubHkgcmV0dXJuIGVsZW1lbnRzIHRoYXQgYXJlIFNoaW55IG91dHB1dHMsIG5vdCBzdGF0aWMgb25lcwogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7CgogICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3aGF0ZXZlciBjYXVzZWQgU2hpbnkgdG8gdGhpbmsgdGhlcmUgbWlnaHQgYmUKICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuCiAgICAgICAgLy8gU2luY2UgdGhlcmUgbWlnaHQgYmUgbG90cyBvZiBkaWZmZXJlbnQgaHRtbHdpZGdldHMgYmluZGluZ3MsIHdlCiAgICAgICAgLy8gc2NoZWR1bGUgZXhlY3V0aW9uIGZvciBsYXRlci0tbm8gbmVlZCB0byBzdGF0aWNSZW5kZXIgbXVsdGlwbGUKICAgICAgICAvLyB0aW1lcy4KICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggIT09IGR5bmFtaWNSZXN1bHRzLmxlbmd0aCkKICAgICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyKCk7CgogICAgICAgIHJldHVybiBkeW5hbWljUmVzdWx0czsKICAgICAgfTsKCiAgICAgIC8vIFdyYXAgcmVuZGVyVmFsdWUgdG8gaGFuZGxlIGluaXRpYWxpemF0aW9uLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGlzbid0CiAgICAgIC8vIHN1cHBvcnRlZCBuYXRpdmVseSBieSBTaGlueSBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCgogICAgICBzaGlueUJpbmRpbmcucmVuZGVyVmFsdWUgPSBmdW5jdGlvbihlbCwgZGF0YSkgewogICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgZGF0YS5ldmFscyAmJiBpIDwgZGF0YS5ldmFscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1tpXSk7CiAgICAgICAgfQogICAgICAgIGlmICghYmluZGluZ0RlZi5yZW5kZXJPbk51bGxWYWx1ZSkgewogICAgICAgICAgaWYgKGRhdGEueCA9PT0gbnVsbCkgewogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7CiAgICAgICAgICBpbml0U2l6aW5nKGVsKTsKCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7CiAgICAgICAgICBpZiAoYmluZGluZ0RlZi5pbml0aWFsaXplKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBiaW5kaW5nRGVmLmluaXRpYWxpemUoZWwsIGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICAgIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiLCByZXN1bHQpOwogICAgICAgICAgfQogICAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7CiAgICAgICAgfQogICAgICAgIFNoaW55LnJlbmRlckRlcGVuZGVuY2llcyhkYXRhLmRlcHMpOwogICAgICAgIGJpbmRpbmdEZWYucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsKICAgICAgfTsKCiAgICAgIC8vIE9ubHkgb3ZlcnJpZGUgcmVzaXplIGlmIGJpbmRpbmdEZWYgaW1wbGVtZW50cyBpdAogICAgICBpZiAoYmluZGluZ0RlZi5yZXNpemUpIHsKICAgICAgICBzaGlueUJpbmRpbmcucmVzaXplID0gZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICAgIC8vIFNoaW55IGNhbiBjYWxsIHJlc2l6ZSBiZWZvcmUgaW5pdGlhbGl6ZS9yZW5kZXJWYWx1ZSBoYXZlIGJlZW4KICAgICAgICAgIC8vIGNhbGxlZCwgd2hpY2ggZG9lc24ndCBtYWtlIHNlbnNlIGZvciB3aWRnZXRzLgogICAgICAgICAgaWYgKGVsZW1lbnREYXRhKGVsLCAiaW5pdGlhbGl6ZWQiKSkgewogICAgICAgICAgICBiaW5kaW5nRGVmLnJlc2l6ZShlbCwgd2lkdGgsIGhlaWdodCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9CgogICAgICBTaGlueS5vdXRwdXRCaW5kaW5ncy5yZWdpc3RlcihzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYubmFtZSk7CiAgICB9CiAgfTsKCiAgdmFyIHNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCA9IG51bGw7CiAgZnVuY3Rpb24gc2NoZWR1bGVTdGF0aWNSZW5kZXIoKSB7CiAgICBpZiAoIXNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCkgewogICAgICBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCA9IG51bGw7CiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgICB9LCAxKTsKICAgIH0KICB9CgogIC8vIFJlbmRlciBzdGF0aWMgd2lkZ2V0cyBhZnRlciB0aGUgZG9jdW1lbnQgZmluaXNoZXMgbG9hZGluZwogIC8vIFN0YXRpY2FsbHkgcmVuZGVyIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBvZiB0aGlzIHdpZGdldCdzIGNsYXNzCiAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlciA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGJpbmRpbmdzID0gd2luZG93LkhUTUxXaWRnZXRzLndpZGdldHMgfHwgW107CiAgICBmb3JFYWNoKGJpbmRpbmdzLCBmdW5jdGlvbihiaW5kaW5nKSB7CiAgICAgIHZhciBtYXRjaGVzID0gYmluZGluZy5maW5kKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7CiAgICAgIGZvckVhY2gobWF0Y2hlcywgZnVuY3Rpb24oZWwpIHsKICAgICAgICB2YXIgc2l6ZU9iaiA9IGluaXRTaXppbmcoZWwsIGJpbmRpbmcpOwoKICAgICAgICBpZiAoaGFzQ2xhc3MoZWwsICJodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiKSkKICAgICAgICAgIHJldHVybjsKICAgICAgICBlbC5jbGFzc05hbWUgPSBlbC5jbGFzc05hbWUgKyAiIGh0bWwtd2lkZ2V0LXN0YXRpYy1ib3VuZCI7CgogICAgICAgIHZhciBpbml0UmVzdWx0OwogICAgICAgIGlmIChiaW5kaW5nLmluaXRpYWxpemUpIHsKICAgICAgICAgIGluaXRSZXN1bHQgPSBiaW5kaW5nLmluaXRpYWxpemUoZWwsCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgc2l6ZU9iaiA/IHNpemVPYmouZ2V0SGVpZ2h0KCkgOiBlbC5vZmZzZXRIZWlnaHQKICAgICAgICAgICk7CiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgaW5pdFJlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoYmluZGluZy5yZXNpemUpIHsKICAgICAgICAgIHZhciBsYXN0U2l6ZSA9IHt9OwogICAgICAgICAgdmFyIHJlc2l6ZUhhbmRsZXIgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIHZhciBzaXplID0gewogICAgICAgICAgICAgIHc6IHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgICBoOiBzaXplT2JqID8gc2l6ZU9iai5nZXRIZWlnaHQoKSA6IGVsLm9mZnNldEhlaWdodAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoc2l6ZS53ID09PSAwICYmIHNpemUuaCA9PT0gMCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGlmIChzaXplLncgPT09IGxhc3RTaXplLncgJiYgc2l6ZS5oID09PSBsYXN0U2l6ZS5oKQogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgbGFzdFNpemUgPSBzaXplOwogICAgICAgICAgICBiaW5kaW5nLnJlc2l6ZShlbCwgc2l6ZS53LCBzaXplLmgsIGluaXRSZXN1bHQpOwogICAgICAgICAgfTsKCiAgICAgICAgICBvbih3aW5kb3csICJyZXNpemUiLCByZXNpemVIYW5kbGVyKTsKCiAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgY2FzZXMgd2hlcmUgd2UncmUgcnVubmluZyBpbiBhIFNoaW55CiAgICAgICAgICAvLyBhcHAsIGJ1dCB0aGUgd2lkZ2V0IGl0c2VsZiBpcyBub3QgYSBTaGlueSBvdXRwdXQsIGJ1dAogICAgICAgICAgLy8gcmF0aGVyIGEgc2ltcGxlIHN0YXRpYyB3aWRnZXQuIE9uZSBleGFtcGxlIG9mIHRoaXMgaXMKICAgICAgICAgIC8vIGFuIHJtYXJrZG93biBkb2N1bWVudCB0aGF0IGhhcyBydW50aW1lOnNoaW55IGFuZCB3aWRnZXQKICAgICAgICAgIC8vIHRoYXQgaXNuJ3QgaW4gYSByZW5kZXIgZnVuY3Rpb24uIFNoaW55IG9ubHkga25vd3MgdG8KICAgICAgICAgIC8vIGNhbGwgcmVzaXplIGhhbmRsZXJzIGZvciBTaGlueSBvdXRwdXRzLCBub3QgZm9yIHN0YXRpYwogICAgICAgICAgLy8gd2lkZ2V0cywgc28gd2UgZG8gaXQgb3Vyc2VsdmVzLgogICAgICAgICAgaWYgKHdpbmRvdy5qUXVlcnkpIHsKICAgICAgICAgICAgd2luZG93LmpRdWVyeShkb2N1bWVudCkub24oCiAgICAgICAgICAgICAgInNob3duLmh0bWx3aWRnZXRzIHNob3duLmJzLnRhYi5odG1sd2lkZ2V0cyBzaG93bi5icy5jb2xsYXBzZS5odG1sd2lkZ2V0cyIsCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcgogICAgICAgICAgICApOwogICAgICAgICAgICB3aW5kb3cualF1ZXJ5KGRvY3VtZW50KS5vbigKICAgICAgICAgICAgICAiaGlkZGVuLmh0bWx3aWRnZXRzIGhpZGRlbi5icy50YWIuaHRtbHdpZGdldHMgaGlkZGVuLmJzLmNvbGxhcHNlLmh0bWx3aWRnZXRzIiwKICAgICAgICAgICAgICByZXNpemVIYW5kbGVyCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIHRoZSBzcGVjaWZpYyBjYXNlIG9mIGlvc2xpZGVzLCB3aGljaAogICAgICAgICAgLy8gZmxpcHMgc2xpZGVzIGJldHdlZW4gZGlzcGxheTpub25lIGFuZCBkaXNwbGF5OmJsb2NrLgogICAgICAgICAgLy8gSWRlYWxseSB3ZSB3b3VsZCBub3QgaGF2ZSB0byBoYXZlIGlvc2xpZGUtc3BlY2lmaWMgY29kZQogICAgICAgICAgLy8gaGVyZSwgYnV0IHJhdGhlciBoYXZlIGlvc2xpZGVzIHJhaXNlIGEgZ2VuZXJpYyBldmVudCwKICAgICAgICAgIC8vIGJ1dCB0aGUgcm1hcmtkb3duIHBhY2thZ2UganVzdCB3ZW50IHRvIENSQU4gc28gdGhlCiAgICAgICAgICAvLyB3aW5kb3cgdG8gZ2V0dGluZyB0aGF0IGZpeGVkIG1heSBiZSBsb25nLgogICAgICAgICAgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgICAgICAgIC8vIEl0J3MgT0sgdG8gbGltaXQgdGhpcyB0byB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcgogICAgICAgICAgICAvLyBicm93c2VycyBiZWNhdXNlIGlvc2xpZGVzIGl0c2VsZiBvbmx5IHN1cHBvcnRzCiAgICAgICAgICAgIC8vIHN1Y2ggYnJvd3NlcnMuCiAgICAgICAgICAgIG9uKGRvY3VtZW50LCAic2xpZGVlbnRlciIsIHJlc2l6ZUhhbmRsZXIpOwogICAgICAgICAgICBvbihkb2N1bWVudCwgInNsaWRlbGVhdmUiLCByZXNpemVIYW5kbGVyKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHZhciBzY3JpcHREYXRhID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vanNvbiddIik7CiAgICAgICAgaWYgKHNjcmlwdERhdGEpIHsKICAgICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShzY3JpcHREYXRhLnRleHRDb250ZW50IHx8IHNjcmlwdERhdGEudGV4dCk7CiAgICAgICAgICAvLyBSZXNvbHZlIHN0cmluZ3MgbWFya2VkIGFzIGphdmFzY3JpcHQgbGl0ZXJhbHMgdG8gb2JqZWN0cwogICAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBkYXRhLmV2YWxzICYmIGsgPCBkYXRhLmV2YWxzLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5ldmFsdWF0ZVN0cmluZ01lbWJlcihkYXRhLngsIGRhdGEuZXZhbHNba10pOwogICAgICAgICAgfQogICAgICAgICAgYmluZGluZy5yZW5kZXJWYWx1ZShlbCwgZGF0YS54LCBpbml0UmVzdWx0KTsKICAgICAgICAgIGV2YWxBbmRSdW4oZGF0YS5qc0hvb2tzLnJlbmRlciwgaW5pdFJlc3VsdCwgW2VsLCBkYXRhLnhdKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CgogICAgaW52b2tlUG9zdFJlbmRlckhhbmRsZXJzKCk7CiAgfQoKICAvLyBXYWl0IHVudGlsIGFmdGVyIHRoZSBkb2N1bWVudCBoYXMgbG9hZGVkIHRvIHJlbmRlciB0aGUgd2lkZ2V0cy4KICBpZiAoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikgewogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCkgewogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgYXJndW1lbnRzLmNhbGxlZSwgZmFsc2UpOwogICAgICB3aW5kb3cuSFRNTFdpZGdldHMuc3RhdGljUmVuZGVyKCk7CiAgICB9LCBmYWxzZSk7CiAgfSBlbHNlIGlmIChkb2N1bWVudC5hdHRhY2hFdmVudCkgewogICAgZG9jdW1lbnQuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIGZ1bmN0aW9uKCkgewogICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIikgewogICAgICAgIGRvY3VtZW50LmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBhcmd1bWVudHMuY2FsbGVlKTsKICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuc3RhdGljUmVuZGVyKCk7CiAgICAgIH0KICAgIH0pOwogIH0KCgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRBdHRhY2htZW50VXJsID0gZnVuY3Rpb24oZGVwbmFtZSwga2V5KSB7CiAgICAvLyBJZiBubyBrZXksIGRlZmF1bHQgdG8gdGhlIGZpcnN0IGl0ZW0KICAgIGlmICh0eXBlb2Yoa2V5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgIGtleSA9IDE7CgogICAgdmFyIGxpbmsgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkZXBuYW1lICsgIi0iICsga2V5ICsgIi1hdHRhY2htZW50Iik7CiAgICBpZiAoIWxpbmspIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJBdHRhY2htZW50ICIgKyBkZXBuYW1lICsgIi8iICsga2V5ICsgIiBub3QgZm91bmQgaW4gZG9jdW1lbnQiKTsKICAgIH0KICAgIHJldHVybiBsaW5rLmdldEF0dHJpYnV0ZSgiaHJlZiIpOwogIH07CgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5kYXRhZnJhbWVUb0QzID0gZnVuY3Rpb24oZGYpIHsKICAgIHZhciBuYW1lcyA9IFtdOwogICAgdmFyIGxlbmd0aDsKICAgIGZvciAodmFyIG5hbWUgaW4gZGYpIHsKICAgICAgICBpZiAoZGYuaGFzT3duUHJvcGVydHkobmFtZSkpCiAgICAgICAgICAgIG5hbWVzLnB1c2gobmFtZSk7CiAgICAgICAgaWYgKHR5cGVvZihkZltuYW1lXSkgIT09ICJvYmplY3QiIHx8IHR5cGVvZihkZltuYW1lXS5sZW5ndGgpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMiKTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZihsZW5ndGgpICE9PSAidW5kZWZpbmVkIiAmJiBsZW5ndGggIT09IGRmW25hbWVdLmxlbmd0aCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMgb2YgdGhlIHNhbWUgbGVuZ3RoIik7CiAgICAgICAgfQogICAgICAgIGxlbmd0aCA9IGRmW25hbWVdLmxlbmd0aDsKICAgIH0KICAgIHZhciByZXN1bHRzID0gW107CiAgICB2YXIgaXRlbTsKICAgIGZvciAodmFyIHJvdyA9IDA7IHJvdyA8IGxlbmd0aDsgcm93KyspIHsKICAgICAgICBpdGVtID0ge307CiAgICAgICAgZm9yICh2YXIgY29sID0gMDsgY29sIDwgbmFtZXMubGVuZ3RoOyBjb2wrKykgewogICAgICAgICAgICBpdGVtW25hbWVzW2NvbF1dID0gZGZbbmFtZXNbY29sXV1bcm93XTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0cy5wdXNoKGl0ZW0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfTsKCiAgd2luZG93LkhUTUxXaWRnZXRzLnRyYW5zcG9zZUFycmF5MkQgPSBmdW5jdGlvbihhcnJheSkgewogICAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gYXJyYXk7CiAgICAgIHZhciBuZXdBcnJheSA9IGFycmF5WzBdLm1hcChmdW5jdGlvbihjb2wsIGkpIHsKICAgICAgICAgIHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24ocm93KSB7CiAgICAgICAgICAgICAgcmV0dXJuIHJvd1tpXQogICAgICAgICAgfSkKICAgICAgfSk7CiAgICAgIHJldHVybiBuZXdBcnJheTsKICB9OwogIC8vIFNwbGl0IHZhbHVlIGF0IHNwbGl0Q2hhciwgYnV0IGFsbG93IHNwbGl0Q2hhciB0byBiZSBlc2NhcGVkCiAgLy8gdXNpbmcgZXNjYXBlQ2hhci4gQW55IG90aGVyIGNoYXJhY3RlcnMgZXNjYXBlZCBieSBlc2NhcGVDaGFyCiAgLy8gd2lsbCBiZSBpbmNsdWRlZCBhcyB1c3VhbCAoaW5jbHVkaW5nIGVzY2FwZUNoYXIgaXRzZWxmKS4KICBmdW5jdGlvbiBzcGxpdFdpdGhFc2NhcGUodmFsdWUsIHNwbGl0Q2hhciwgZXNjYXBlQ2hhcikgewogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIHZhciBlc2NhcGVNb2RlID0gZmFsc2U7CiAgICB2YXIgY3VycmVudFJlc3VsdCA9ICIiOwogICAgZm9yICh2YXIgcG9zID0gMDsgcG9zIDwgdmFsdWUubGVuZ3RoOyBwb3MrKykgewogICAgICBpZiAoIWVzY2FwZU1vZGUpIHsKICAgICAgICBpZiAodmFsdWVbcG9zXSA9PT0gc3BsaXRDaGFyKSB7CiAgICAgICAgICByZXN1bHRzLnB1c2goY3VycmVudFJlc3VsdCk7CiAgICAgICAgICBjdXJyZW50UmVzdWx0ID0gIiI7CiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVtwb3NdID09PSBlc2NhcGVDaGFyKSB7CiAgICAgICAgICBlc2NhcGVNb2RlID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjdXJyZW50UmVzdWx0ICs9IHZhbHVlW3Bvc107CiAgICAgICAgZXNjYXBlTW9kZSA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgICBpZiAoY3VycmVudFJlc3VsdCAhPT0gIiIpIHsKICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQogIC8vIEZ1bmN0aW9uIGF1dGhvcmVkIGJ5IFlpaHVpL0pKIEFsbGFpcmUKICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIgPSBmdW5jdGlvbihvLCBtZW1iZXIpIHsKICAgIHZhciBwYXJ0cyA9IHNwbGl0V2l0aEVzY2FwZShtZW1iZXIsICcuJywgJ1xcJyk7CiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICB2YXIgcGFydCA9IHBhcnRzW2ldOwogICAgICAvLyBwYXJ0IG1heSBiZSBhIGNoYXJhY3RlciBvciAnbnVtZXJpYycgbWVtYmVyIG5hbWUKICAgICAgaWYgKG8gIT09IG51bGwgJiYgdHlwZW9mIG8gPT09ICJvYmplY3QiICYmIHBhcnQgaW4gbykgewogICAgICAgIGlmIChpID09IChsIC0gMSkpIHsgLy8gaWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgdGhlbiBldmFsdWxhdGUKICAgICAgICAgIGlmICh0eXBlb2Ygb1twYXJ0XSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIG9bcGFydF0gPSBldmFsKCIoIiArIG9bcGFydF0gKyAiKSIpOwogICAgICAgIH0gZWxzZSB7IC8vIG90aGVyd2lzZSBjb250aW51ZSB0byBuZXh0IGVtYmVkZGVkIG9iamVjdAogICAgICAgICAgbyA9IG9bcGFydF07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfTsKCiAgLy8gUmV0cmlldmUgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZiBhbgogIC8vIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pCiAgLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGVsZW1lbnQsIG9yIG51bGwgaWYgbm9uZS4KICB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2UgPSBmdW5jdGlvbihlbCkgewogICAgcmV0dXJuIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKTsKICB9OwoKICAvLyBGaW5kcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3RvciwKICAvLyBhbmQgcmV0dXJucyB0aGUgSFRNTFdpZGdldCBpbnN0YW5jZSAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlIG9mCiAgLy8gYW4gSFRNTFdpZGdldCBiaW5kaW5nJ3MgaW5pdGlhbGl6ZSgpIG9yIGZhY3RvcnkoKSBmdW5jdGlvbikKICAvLyBhc3NvY2lhdGVkIHdpdGggdGhhdCBlbGVtZW50LCBpZiBhbnkuIElmIG5vIGVsZW1lbnQgbWF0Y2hlcyB0aGUKICAvLyBzZWxlY3Rvciwgb3IgdGhlIGZpcnN0IG1hdGNoaW5nIGVsZW1lbnQgaGFzIG5vIEhUTUxXaWRnZXQKICAvLyBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggaXQsIHRoZW4gbnVsbCBpcyByZXR1cm5lZC4KICAvLwogIC8vIFRoZSBzY29wZSBhcmd1bWVudCBpcyBvcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIHdpbmRvdy5kb2N1bWVudC4KICB3aW5kb3cuSFRNTFdpZGdldHMuZmluZCA9IGZ1bmN0aW9uKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgewogICAgICBzZWxlY3RvciA9IHNjb3BlOwogICAgICBzY29wZSA9IGRvY3VtZW50OwogICAgfQoKICAgIHZhciBlbCA9IHNjb3BlLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOwogICAgaWYgKGVsID09PSBudWxsKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZShlbCk7CiAgICB9CiAgfTsKCiAgLy8gRmluZHMgYWxsIGVsZW1lbnRzIGluIHRoZSBzY29wZSB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciwgYW5kCiAgLy8gcmV0dXJucyB0aGUgSFRNTFdpZGdldCBpbnN0YW5jZXMgKGkuZS4gdGhlIHJldHVybiB2YWx1ZXMgb2YKICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQogIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudHMsIGluIGFuIGFycmF5LiBJZiBlbGVtZW50cyB0aGF0CiAgLy8gbWF0Y2ggdGhlIHNlbGVjdG9yIGRvbid0IGhhdmUgYW4gYXNzb2NpYXRlZCBIVE1MV2lkZ2V0CiAgLy8gaW5zdGFuY2UsIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGNvbnRhaW4gbnVsbHMuCiAgLy8KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmRBbGwgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgc2VsZWN0b3IgPSBzY29wZTsKICAgICAgc2NvcGUgPSBkb2N1bWVudDsKICAgIH0KCiAgICB2YXIgbm9kZXMgPSBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsKICAgIHZhciByZXN1bHRzID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlc3VsdHMucHVzaCh3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2Uobm9kZXNbaV0pKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIHZhciBwb3N0UmVuZGVySGFuZGxlcnMgPSBbXTsKICBmdW5jdGlvbiBpbnZva2VQb3N0UmVuZGVySGFuZGxlcnMoKSB7CiAgICB3aGlsZSAocG9zdFJlbmRlckhhbmRsZXJzLmxlbmd0aCkgewogICAgICB2YXIgaGFuZGxlciA9IHBvc3RSZW5kZXJIYW5kbGVycy5zaGlmdCgpOwogICAgICBpZiAoaGFuZGxlcikgewogICAgICAgIGhhbmRsZXIoKTsKICAgICAgfQogICAgfQogIH0KCiAgLy8gUmVnaXN0ZXIgdGhlIGdpdmVuIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgYWZ0ZXIgdGhlCiAgLy8gbmV4dCB0aW1lIHN0YXRpYyB3aWRnZXRzIGFyZSByZW5kZXJlZC4KICB3aW5kb3cuSFRNTFdpZGdldHMuYWRkUG9zdFJlbmRlckhhbmRsZXIgPSBmdW5jdGlvbihjYWxsYmFjaykgewogICAgcG9zdFJlbmRlckhhbmRsZXJzLnB1c2goY2FsbGJhY2spOwogIH07CgogIC8vIFRha2VzIGEgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb24sIGFuZCByZXR1cm5zIGFuCiAgLy8gb2xkLXN0eWxlIGNsYXNzLWJvdW5kIGRlZmluaXRpb24uIFRoaXMgc2F2ZXMgdXMgZnJvbSBoYXZpbmcKICAvLyB0byByZXdyaXRlIGFsbCB0aGUgbG9naWMgaW4gdGhpcyBmaWxlIHRvIGFjY29tb2RhdGUgYm90aAogIC8vIHR5cGVzIG9mIGRlZmluaXRpb25zLgogIGZ1bmN0aW9uIGNyZWF0ZUxlZ2FjeURlZmluaXRpb25BZGFwdGVyKGRlZm4pIHsKICAgIHZhciByZXN1bHQgPSB7CiAgICAgIG5hbWU6IGRlZm4ubmFtZSwKICAgICAgdHlwZTogZGVmbi50eXBlLAogICAgICBpbml0aWFsaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCkgewogICAgICAgIHJldHVybiBkZWZuLmZhY3RvcnkoZWwsIHdpZHRoLCBoZWlnaHQpOwogICAgICB9LAogICAgICByZW5kZXJWYWx1ZTogZnVuY3Rpb24oZWwsIHgsIGluc3RhbmNlKSB7CiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnJlbmRlclZhbHVlKHgpOwogICAgICB9LAogICAgICByZXNpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0LCBpbnN0YW5jZSkgewogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZXNpemUod2lkdGgsIGhlaWdodCk7CiAgICAgIH0KICAgIH07CgogICAgaWYgKGRlZm4uZmluZCkKICAgICAgcmVzdWx0LmZpbmQgPSBkZWZuLmZpbmQ7CiAgICBpZiAoZGVmbi5yZW5kZXJFcnJvcikKICAgICAgcmVzdWx0LnJlbmRlckVycm9yID0gZGVmbi5yZW5kZXJFcnJvcjsKICAgIGlmIChkZWZuLmNsZWFyRXJyb3IpCiAgICAgIHJlc3VsdC5jbGVhckVycm9yID0gZGVmbi5jbGVhckVycm9yOwoKICAgIHJldHVybiByZXN1bHQ7CiAgfQp9KSgpOwoK"></script>
<script src="data:application/x-javascript;base64,IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbiYmKG4ub3duZXJEb2N1bWVudHx8bi5kb2N1bWVudHx8bikuZG9jdW1lbnRFbGVtZW50fWZ1bmN0aW9uIHQobil7cmV0dXJuIG4mJihuLm93bmVyRG9jdW1lbnQmJm4ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8bi5kb2N1bWVudCYmbnx8bi5kZWZhdWx0Vmlldyl9ZnVuY3Rpb24gZShuLHQpe3JldHVybiB0Pm4/LTE6bj50PzE6bj49dD8wOjAvMH1mdW5jdGlvbiByKG4pe3JldHVybiBudWxsPT09bj8wLzA6K259ZnVuY3Rpb24gdShuKXtyZXR1cm4haXNOYU4obil9ZnVuY3Rpb24gaShuKXtyZXR1cm57bGVmdDpmdW5jdGlvbih0LGUscix1KXtmb3IoYXJndW1lbnRzLmxlbmd0aDwzJiYocj0wKSxhcmd1bWVudHMubGVuZ3RoPDQmJih1PXQubGVuZ3RoKTt1PnI7KXt2YXIgaT1yK3U+Pj4xO24odFtpXSxlKTwwP3I9aSsxOnU9aX1yZXR1cm4gcn0scmlnaHQ6ZnVuY3Rpb24odCxlLHIsdSl7Zm9yKGFyZ3VtZW50cy5sZW5ndGg8MyYmKHI9MCksYXJndW1lbnRzLmxlbmd0aDw0JiYodT10Lmxlbmd0aCk7dT5yOyl7dmFyIGk9cit1Pj4+MTtuKHRbaV0sZSk+MD91PWk6cj1pKzF9cmV0dXJuIHJ9fX1mdW5jdGlvbiBvKG4pe3JldHVybiBuLmxlbmd0aH1mdW5jdGlvbiBhKG4pe2Zvcih2YXIgdD0xO24qdCUxOyl0Kj0xMDtyZXR1cm4gdH1mdW5jdGlvbiBjKG4sdCl7Zm9yKHZhciBlIGluIHQpT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLGUse3ZhbHVlOnRbZV0sZW51bWVyYWJsZTohMX0pfWZ1bmN0aW9uIGwoKXt0aGlzLl89T2JqZWN0LmNyZWF0ZShudWxsKX1mdW5jdGlvbiBzKG4pe3JldHVybihuKz0iIik9PT1wYXx8blswXT09PXZhP3ZhK246bn1mdW5jdGlvbiBmKG4pe3JldHVybihuKz0iIilbMF09PT12YT9uLnNsaWNlKDEpOm59ZnVuY3Rpb24gaChuKXtyZXR1cm4gcyhuKWluIHRoaXMuX31mdW5jdGlvbiBnKG4pe3JldHVybihuPXMobikpaW4gdGhpcy5fJiZkZWxldGUgdGhpcy5fW25dfWZ1bmN0aW9uIHAoKXt2YXIgbj1bXTtmb3IodmFyIHQgaW4gdGhpcy5fKW4ucHVzaChmKHQpKTtyZXR1cm4gbn1mdW5jdGlvbiB2KCl7dmFyIG49MDtmb3IodmFyIHQgaW4gdGhpcy5fKSsrbjtyZXR1cm4gbn1mdW5jdGlvbiBkKCl7Zm9yKHZhciBuIGluIHRoaXMuXylyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBtKCl7dGhpcy5fPU9iamVjdC5jcmVhdGUobnVsbCl9ZnVuY3Rpb24geShuKXtyZXR1cm4gbn1mdW5jdGlvbiBNKG4sdCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1lLmFwcGx5KHQsYXJndW1lbnRzKTtyZXR1cm4gcj09PXQ/bjpyfX1mdW5jdGlvbiB4KG4sdCl7aWYodCBpbiBuKXJldHVybiB0O3Q9dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpO2Zvcih2YXIgZT0wLHI9ZGEubGVuZ3RoO3I+ZTsrK2Upe3ZhciB1PWRhW2VdK3Q7aWYodSBpbiBuKXJldHVybiB1fX1mdW5jdGlvbiBiKCl7fWZ1bmN0aW9uIF8oKXt9ZnVuY3Rpb24gdyhuKXtmdW5jdGlvbiB0KCl7Zm9yKHZhciB0LHI9ZSx1PS0xLGk9ci5sZW5ndGg7Kyt1PGk7KSh0PXJbdV0ub24pJiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbn12YXIgZT1bXSxyPW5ldyBsO3JldHVybiB0Lm9uPWZ1bmN0aW9uKHQsdSl7dmFyIGksbz1yLmdldCh0KTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP28mJm8ub246KG8mJihvLm9uPW51bGwsZT1lLnNsaWNlKDAsaT1lLmluZGV4T2YobykpLmNvbmNhdChlLnNsaWNlKGkrMSkpLHIucmVtb3ZlKHQpKSx1JiZlLnB1c2goci5zZXQodCx7b246dX0pKSxuKX0sdH1mdW5jdGlvbiBTKCl7dGEuZXZlbnQucHJldmVudERlZmF1bHQoKX1mdW5jdGlvbiBrKCl7Zm9yKHZhciBuLHQ9dGEuZXZlbnQ7bj10LnNvdXJjZUV2ZW50Oyl0PW47cmV0dXJuIHR9ZnVuY3Rpb24gRShuKXtmb3IodmFyIHQ9bmV3IF8sZT0wLHI9YXJndW1lbnRzLmxlbmd0aDsrK2U8cjspdFthcmd1bWVudHNbZV1dPXcodCk7cmV0dXJuIHQub2Y9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZnVuY3Rpb24odSl7dHJ5e3ZhciBpPXUuc291cmNlRXZlbnQ9dGEuZXZlbnQ7dS50YXJnZXQ9bix0YS5ldmVudD11LHRbdS50eXBlXS5hcHBseShlLHIpfWZpbmFsbHl7dGEuZXZlbnQ9aX19fSx0fWZ1bmN0aW9uIEEobil7cmV0dXJuIHlhKG4sX2EpLG59ZnVuY3Rpb24gTihuKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmZ1bmN0aW9uKCl7cmV0dXJuIE1hKG4sdGhpcyl9fWZ1bmN0aW9uIEMobil7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpmdW5jdGlvbigpe3JldHVybiB4YShuLHRoaXMpfX1mdW5jdGlvbiB6KG4sdCl7ZnVuY3Rpb24gZSgpe3RoaXMucmVtb3ZlQXR0cmlidXRlKG4pfWZ1bmN0aW9uIHIoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCl9ZnVuY3Rpb24gdSgpe3RoaXMuc2V0QXR0cmlidXRlKG4sdCl9ZnVuY3Rpb24gaSgpe3RoaXMuc2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsLHQpfWZ1bmN0aW9uIG8oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlKG4pOnRoaXMuc2V0QXR0cmlidXRlKG4sZSl9ZnVuY3Rpb24gYSgpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpOnRoaXMuc2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsLGUpfXJldHVybiBuPXRhLm5zLnF1YWxpZnkobiksbnVsbD09dD9uLmxvY2FsP3I6ZToiZnVuY3Rpb24iPT10eXBlb2YgdD9uLmxvY2FsP2E6bzpuLmxvY2FsP2k6dX1mdW5jdGlvbiBxKG4pe3JldHVybiBuLnRyaW0oKS5yZXBsYWNlKC9ccysvZywiICIpfWZ1bmN0aW9uIEwobil7cmV0dXJuIG5ldyBSZWdFeHAoIig/Ol58XFxzKykiK3RhLnJlcXVvdGUobikrIig/Olxccyt8JCkiLCJnIil9ZnVuY3Rpb24gVChuKXtyZXR1cm4obisiIikudHJpbSgpLnNwbGl0KC9efFxzKy8pfWZ1bmN0aW9uIFIobix0KXtmdW5jdGlvbiBlKCl7Zm9yKHZhciBlPS0xOysrZTx1OyluW2VdKHRoaXMsdCl9ZnVuY3Rpb24gcigpe2Zvcih2YXIgZT0tMSxyPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpOysrZTx1OyluW2VdKHRoaXMscil9bj1UKG4pLm1hcChEKTt2YXIgdT1uLmxlbmd0aDtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD9yOmV9ZnVuY3Rpb24gRChuKXt2YXIgdD1MKG4pO3JldHVybiBmdW5jdGlvbihlLHIpe2lmKHU9ZS5jbGFzc0xpc3QpcmV0dXJuIHI/dS5hZGQobik6dS5yZW1vdmUobik7dmFyIHU9ZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiO3I/KHQubGFzdEluZGV4PTAsdC50ZXN0KHUpfHxlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHEodSsiICIrbikpKTplLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHEodS5yZXBsYWNlKHQsIiAiKSkpfX1mdW5jdGlvbiBQKG4sdCxlKXtmdW5jdGlvbiByKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKX1mdW5jdGlvbiB1KCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLHQsZSl9ZnVuY3Rpb24gaSgpe3ZhciByPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PXI/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KG4scixlKX1yZXR1cm4gbnVsbD09dD9yOiJmdW5jdGlvbiI9PXR5cGVvZiB0P2k6dX1mdW5jdGlvbiBVKG4sdCl7ZnVuY3Rpb24gZSgpe2RlbGV0ZSB0aGlzW25dfWZ1bmN0aW9uIHIoKXt0aGlzW25dPXR9ZnVuY3Rpb24gdSgpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/ZGVsZXRlIHRoaXNbbl06dGhpc1tuXT1lfXJldHVybiBudWxsPT10P2U6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dTpyfWZ1bmN0aW9uIGoobil7ZnVuY3Rpb24gdCgpe3ZhciB0PXRoaXMub3duZXJEb2N1bWVudCxlPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBlP3QuY3JlYXRlRWxlbWVudE5TKGUsbik6dC5jcmVhdGVFbGVtZW50KG4pfWZ1bmN0aW9uIGUoKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuLnNwYWNlLG4ubG9jYWwpfXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246KG49dGEubnMucXVhbGlmeShuKSkubG9jYWw/ZTp0fWZ1bmN0aW9uIEYoKXt2YXIgbj10aGlzLnBhcmVudE5vZGU7biYmbi5yZW1vdmVDaGlsZCh0aGlzKX1mdW5jdGlvbiBIKG4pe3JldHVybntfX2RhdGFfXzpufX1mdW5jdGlvbiBPKG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiYSh0aGlzLG4pfX1mdW5jdGlvbiBJKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RofHwobj1lKSxmdW5jdGlvbih0LGUpe3JldHVybiB0JiZlP24odC5fX2RhdGFfXyxlLl9fZGF0YV9fKTohdC0hZX19ZnVuY3Rpb24gWShuLHQpe2Zvcih2YXIgZT0wLHI9bi5sZW5ndGg7cj5lO2UrKylmb3IodmFyIHUsaT1uW2VdLG89MCxhPWkubGVuZ3RoO2E+bztvKyspKHU9aVtvXSkmJnQodSxvLGUpO3JldHVybiBufWZ1bmN0aW9uIFoobil7cmV0dXJuIHlhKG4sU2EpLG59ZnVuY3Rpb24gVihuKXt2YXIgdCxlO3JldHVybiBmdW5jdGlvbihyLHUsaSl7dmFyIG8sYT1uW2ldLnVwZGF0ZSxjPWEubGVuZ3RoO2ZvcihpIT1lJiYoZT1pLHQ9MCksdT49dCYmKHQ9dSsxKTshKG89YVt0XSkmJisrdDxjOyk7cmV0dXJuIG99fWZ1bmN0aW9uIFgobix0LGUpe2Z1bmN0aW9uIHIoKXt2YXIgdD10aGlzW29dO3QmJih0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIobix0LHQuJCksZGVsZXRlIHRoaXNbb10pfWZ1bmN0aW9uIHUoKXt2YXIgdT1jKHQscmEoYXJndW1lbnRzKSk7ci5jYWxsKHRoaXMpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihuLHRoaXNbb109dSx1LiQ9ZSksdS5fPXR9ZnVuY3Rpb24gaSgpe3ZhciB0LGU9bmV3IFJlZ0V4cCgiXl9fb24oW14uXSspIit0YS5yZXF1b3RlKG4pKyIkIik7Zm9yKHZhciByIGluIHRoaXMpaWYodD1yLm1hdGNoKGUpKXt2YXIgdT10aGlzW3JdO3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0WzFdLHUsdS4kKSxkZWxldGUgdGhpc1tyXX19dmFyIG89Il9fb24iK24sYT1uLmluZGV4T2YoIi4iKSxjPSQ7YT4wJiYobj1uLnNsaWNlKDAsYSkpO3ZhciBsPWthLmdldChuKTtyZXR1cm4gbCYmKG49bCxjPUIpLGE/dD91OnI6dD9iOml9ZnVuY3Rpb24gJChuLHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj10YS5ldmVudDt0YS5ldmVudD1lLHRbMF09dGhpcy5fX2RhdGFfXzt0cnl7bi5hcHBseSh0aGlzLHQpfWZpbmFsbHl7dGEuZXZlbnQ9cn19fWZ1bmN0aW9uIEIobix0KXt2YXIgZT0kKG4sdCk7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMscj1uLnJlbGF0ZWRUYXJnZXQ7ciYmKHI9PT10fHw4JnIuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCkpfHxlLmNhbGwodCxuKX19ZnVuY3Rpb24gVyhlKXt2YXIgcj0iLmRyYWdzdXBwcmVzcy0iKyArK0FhLHU9ImNsaWNrIityLGk9dGEuc2VsZWN0KHQoZSkpLm9uKCJ0b3VjaG1vdmUiK3IsUykub24oImRyYWdzdGFydCIrcixTKS5vbigic2VsZWN0c3RhcnQiK3IsUyk7aWYobnVsbD09RWEmJihFYT0ib25zZWxlY3RzdGFydCJpbiBlPyExOngoZS5zdHlsZSwidXNlclNlbGVjdCIpKSxFYSl7dmFyIG89bihlKS5zdHlsZSxhPW9bRWFdO29bRWFdPSJub25lIn1yZXR1cm4gZnVuY3Rpb24obil7aWYoaS5vbihyLG51bGwpLEVhJiYob1tFYV09YSksbil7dmFyIHQ9ZnVuY3Rpb24oKXtpLm9uKHUsbnVsbCl9O2kub24odSxmdW5jdGlvbigpe1MoKSx0KCl9LCEwKSxzZXRUaW1lb3V0KHQsMCl9fX1mdW5jdGlvbiBKKG4sZSl7ZS5jaGFuZ2VkVG91Y2hlcyYmKGU9ZS5jaGFuZ2VkVG91Y2hlc1swXSk7dmFyIHI9bi5vd25lclNWR0VsZW1lbnR8fG47aWYoci5jcmVhdGVTVkdQb2ludCl7dmFyIHU9ci5jcmVhdGVTVkdQb2ludCgpO2lmKDA+TmEpe3ZhciBpPXQobik7aWYoaS5zY3JvbGxYfHxpLnNjcm9sbFkpe3I9dGEuc2VsZWN0KCJib2R5IikuYXBwZW5kKCJzdmciKS5zdHlsZSh7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAsbWFyZ2luOjAscGFkZGluZzowLGJvcmRlcjoibm9uZSJ9LCJpbXBvcnRhbnQiKTt2YXIgbz1yWzBdWzBdLmdldFNjcmVlbkNUTSgpO05hPSEoby5mfHxvLmUpLHIucmVtb3ZlKCl9fXJldHVybiBOYT8odS54PWUucGFnZVgsdS55PWUucGFnZVkpOih1Lng9ZS5jbGllbnRYLHUueT1lLmNsaWVudFkpLHU9dS5tYXRyaXhUcmFuc2Zvcm0obi5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpLFt1LngsdS55XX12YXIgYT1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybltlLmNsaWVudFgtYS5sZWZ0LW4uY2xpZW50TGVmdCxlLmNsaWVudFktYS50b3Atbi5jbGllbnRUb3BdfWZ1bmN0aW9uIEcoKXtyZXR1cm4gdGEuZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcn1mdW5jdGlvbiBLKG4pe3JldHVybiBuPjA/MTowPm4/LTE6MH1mdW5jdGlvbiBRKG4sdCxlKXtyZXR1cm4odFswXS1uWzBdKSooZVsxXS1uWzFdKS0odFsxXS1uWzFdKSooZVswXS1uWzBdKX1mdW5jdGlvbiBudChuKXtyZXR1cm4gbj4xPzA6LTE+bj9xYTpNYXRoLmFjb3Mobil9ZnVuY3Rpb24gdHQobil7cmV0dXJuIG4+MT9SYTotMT5uPy1SYTpNYXRoLmFzaW4obil9ZnVuY3Rpb24gZXQobil7cmV0dXJuKChuPU1hdGguZXhwKG4pKS0xL24pLzJ9ZnVuY3Rpb24gcnQobil7cmV0dXJuKChuPU1hdGguZXhwKG4pKSsxL24pLzJ9ZnVuY3Rpb24gdXQobil7cmV0dXJuKChuPU1hdGguZXhwKDIqbikpLTEpLyhuKzEpfWZ1bmN0aW9uIGl0KG4pe3JldHVybihuPU1hdGguc2luKG4vMikpKm59ZnVuY3Rpb24gb3QoKXt9ZnVuY3Rpb24gYXQobix0LGUpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgYXQ/KHRoaXMuaD0rbix0aGlzLnM9K3Qsdm9pZCh0aGlzLmw9K2UpKTphcmd1bWVudHMubGVuZ3RoPDI/biBpbnN0YW5jZW9mIGF0P25ldyBhdChuLmgsbi5zLG4ubCk6YnQoIiIrbixfdCxhdCk6bmV3IGF0KG4sdCxlKX1mdW5jdGlvbiBjdChuLHQsZSl7ZnVuY3Rpb24gcihuKXtyZXR1cm4gbj4zNjA/bi09MzYwOjA+biYmKG4rPTM2MCksNjA+bj9pKyhvLWkpKm4vNjA6MTgwPm4/bzoyNDA+bj9pKyhvLWkpKigyNDAtbikvNjA6aX1mdW5jdGlvbiB1KG4pe3JldHVybiBNYXRoLnJvdW5kKDI1NSpyKG4pKX12YXIgaSxvO3JldHVybiBuPWlzTmFOKG4pPzA6KG4lPTM2MCk8MD9uKzM2MDpuLHQ9aXNOYU4odCk/MDowPnQ/MDp0PjE/MTp0LGU9MD5lPzA6ZT4xPzE6ZSxvPS41Pj1lP2UqKDErdCk6ZSt0LWUqdCxpPTIqZS1vLG5ldyBtdCh1KG4rMTIwKSx1KG4pLHUobi0xMjApKX1mdW5jdGlvbiBsdChuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBsdD8odGhpcy5oPStuLHRoaXMuYz0rdCx2b2lkKHRoaXMubD0rZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgbHQ/bmV3IGx0KG4uaCxuLmMsbi5sKTpuIGluc3RhbmNlb2YgZnQ/Z3Qobi5sLG4uYSxuLmIpOmd0KChuPXd0KChuPXRhLnJnYihuKSkucixuLmcsbi5iKSkubCxuLmEsbi5iKTpuZXcgbHQobix0LGUpfWZ1bmN0aW9uIHN0KG4sdCxlKXtyZXR1cm4gaXNOYU4obikmJihuPTApLGlzTmFOKHQpJiYodD0wKSxuZXcgZnQoZSxNYXRoLmNvcyhuKj1EYSkqdCxNYXRoLnNpbihuKSp0KX1mdW5jdGlvbiBmdChuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBmdD8odGhpcy5sPStuLHRoaXMuYT0rdCx2b2lkKHRoaXMuYj0rZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgZnQ/bmV3IGZ0KG4ubCxuLmEsbi5iKTpuIGluc3RhbmNlb2YgbHQ/c3Qobi5oLG4uYyxuLmwpOnd0KChuPW10KG4pKS5yLG4uZyxuLmIpOm5ldyBmdChuLHQsZSl9ZnVuY3Rpb24gaHQobix0LGUpe3ZhciByPShuKzE2KS8xMTYsdT1yK3QvNTAwLGk9ci1lLzIwMDtyZXR1cm4gdT1wdCh1KSpYYSxyPXB0KHIpKiRhLGk9cHQoaSkqQmEsbmV3IG10KGR0KDMuMjQwNDU0Mip1LTEuNTM3MTM4NSpyLS40OTg1MzE0KmkpLGR0KC0uOTY5MjY2KnUrMS44NzYwMTA4KnIrLjA0MTU1NippKSxkdCguMDU1NjQzNCp1LS4yMDQwMjU5KnIrMS4wNTcyMjUyKmkpKX1mdW5jdGlvbiBndChuLHQsZSl7cmV0dXJuIG4+MD9uZXcgbHQoTWF0aC5hdGFuMihlLHQpKlBhLE1hdGguc3FydCh0KnQrZSplKSxuKTpuZXcgbHQoMC8wLDAvMCxuKX1mdW5jdGlvbiBwdChuKXtyZXR1cm4gbj4uMjA2ODkzMDM0P24qbipuOihuLTQvMjkpLzcuNzg3MDM3fWZ1bmN0aW9uIHZ0KG4pe3JldHVybiBuPi4wMDg4NTY/TWF0aC5wb3cobiwxLzMpOjcuNzg3MDM3Km4rNC8yOX1mdW5jdGlvbiBkdChuKXtyZXR1cm4gTWF0aC5yb3VuZCgyNTUqKC4wMDMwND49bj8xMi45MipuOjEuMDU1Kk1hdGgucG93KG4sMS8yLjQpLS4wNTUpKX1mdW5jdGlvbiBtdChuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBtdD8odGhpcy5yPX5+bix0aGlzLmc9fn50LHZvaWQodGhpcy5iPX5+ZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgbXQ/bmV3IG10KG4ucixuLmcsbi5iKTpidCgiIituLG10LGN0KTpuZXcgbXQobix0LGUpfWZ1bmN0aW9uIHl0KG4pe3JldHVybiBuZXcgbXQobj4+MTYsbj4+OCYyNTUsMjU1Jm4pfWZ1bmN0aW9uIE10KG4pe3JldHVybiB5dChuKSsiIn1mdW5jdGlvbiB4dChuKXtyZXR1cm4gMTY+bj8iMCIrTWF0aC5tYXgoMCxuKS50b1N0cmluZygxNik6TWF0aC5taW4oMjU1LG4pLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBidChuLHQsZSl7dmFyIHIsdSxpLG89MCxhPTAsYz0wO2lmKHI9LyhbYS16XSspXCgoLiopXCkvaS5leGVjKG4pKXN3aXRjaCh1PXJbMl0uc3BsaXQoIiwiKSxyWzFdKXtjYXNlImhzbCI6cmV0dXJuIGUocGFyc2VGbG9hdCh1WzBdKSxwYXJzZUZsb2F0KHVbMV0pLzEwMCxwYXJzZUZsb2F0KHVbMl0pLzEwMCk7Y2FzZSJyZ2IiOnJldHVybiB0KGt0KHVbMF0pLGt0KHVbMV0pLGt0KHVbMl0pKX1yZXR1cm4oaT1HYS5nZXQobi50b0xvd2VyQ2FzZSgpKSk/dChpLnIsaS5nLGkuYik6KG51bGw9PW58fCIjIiE9PW4uY2hhckF0KDApfHxpc05hTihpPXBhcnNlSW50KG4uc2xpY2UoMSksMTYpKXx8KDQ9PT1uLmxlbmd0aD8obz0oMzg0MCZpKT4+NCxvPW8+PjR8byxhPTI0MCZpLGE9YT4+NHxhLGM9MTUmaSxjPWM8PDR8Yyk6Nz09PW4ubGVuZ3RoJiYobz0oMTY3MTE2ODAmaSk+PjE2LGE9KDY1MjgwJmkpPj44LGM9MjU1JmkpKSx0KG8sYSxjKSl9ZnVuY3Rpb24gX3Qobix0LGUpe3ZhciByLHUsaT1NYXRoLm1pbihuLz0yNTUsdC89MjU1LGUvPTI1NSksbz1NYXRoLm1heChuLHQsZSksYT1vLWksYz0obytpKS8yO3JldHVybiBhPyh1PS41PmM/YS8obytpKTphLygyLW8taSkscj1uPT1vPyh0LWUpL2ErKGU+dD82OjApOnQ9PW8/KGUtbikvYSsyOihuLXQpL2ErNCxyKj02MCk6KHI9MC8wLHU9Yz4wJiYxPmM/MDpyKSxuZXcgYXQocix1LGMpfWZ1bmN0aW9uIHd0KG4sdCxlKXtuPVN0KG4pLHQ9U3QodCksZT1TdChlKTt2YXIgcj12dCgoLjQxMjQ1NjQqbisuMzU3NTc2MSp0Ky4xODA0Mzc1KmUpL1hhKSx1PXZ0KCguMjEyNjcyOSpuKy43MTUxNTIyKnQrLjA3MjE3NSplKS8kYSksaT12dCgoLjAxOTMzMzkqbisuMTE5MTkyKnQrLjk1MDMwNDEqZSkvQmEpO3JldHVybiBmdCgxMTYqdS0xNiw1MDAqKHItdSksMjAwKih1LWkpKX1mdW5jdGlvbiBTdChuKXtyZXR1cm4obi89MjU1KTw9LjA0MDQ1P24vMTIuOTI6TWF0aC5wb3coKG4rLjA1NSkvMS4wNTUsMi40KX1mdW5jdGlvbiBrdChuKXt2YXIgdD1wYXJzZUZsb2F0KG4pO3JldHVybiIlIj09PW4uY2hhckF0KG4ubGVuZ3RoLTEpP01hdGgucm91bmQoMi41NSp0KTp0fWZ1bmN0aW9uIEV0KG4pe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246ZnVuY3Rpb24oKXtyZXR1cm4gbn19ZnVuY3Rpb24gQXQobil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gMj09PWFyZ3VtZW50cy5sZW5ndGgmJiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9bnVsbCksTnQodCxlLG4scil9fWZ1bmN0aW9uIE50KG4sdCxlLHIpe2Z1bmN0aW9uIHUoKXt2YXIgbix0PWMuc3RhdHVzO2lmKCF0JiZ6dChjKXx8dD49MjAwJiYzMDA+dHx8MzA0PT09dCl7dHJ5e249ZS5jYWxsKGksYyl9Y2F0Y2gocil7cmV0dXJuIHZvaWQgby5lcnJvci5jYWxsKGkscil9by5sb2FkLmNhbGwoaSxuKX1lbHNlIG8uZXJyb3IuY2FsbChpLGMpfXZhciBpPXt9LG89dGEuZGlzcGF0Y2goImJlZm9yZXNlbmQiLCJwcm9ncmVzcyIsImxvYWQiLCJlcnJvciIpLGE9e30sYz1uZXcgWE1MSHR0cFJlcXVlc3QsbD1udWxsO3JldHVybiF0aGlzLlhEb21haW5SZXF1ZXN0fHwid2l0aENyZWRlbnRpYWxzImluIGN8fCEvXihodHRwKHMpPzopP1wvXC8vLnRlc3Qobil8fChjPW5ldyBYRG9tYWluUmVxdWVzdCksIm9ubG9hZCJpbiBjP2Mub25sb2FkPWMub25lcnJvcj11OmMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7Yy5yZWFkeVN0YXRlPjMmJnUoKX0sYy5vbnByb2dyZXNzPWZ1bmN0aW9uKG4pe3ZhciB0PXRhLmV2ZW50O3RhLmV2ZW50PW47dHJ5e28ucHJvZ3Jlc3MuY2FsbChpLGMpfWZpbmFsbHl7dGEuZXZlbnQ9dH19LGkuaGVhZGVyPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49KG4rIiIpLnRvTG93ZXJDYXNlKCksYXJndW1lbnRzLmxlbmd0aDwyP2Fbbl06KG51bGw9PXQ/ZGVsZXRlIGFbbl06YVtuXT10KyIiLGkpfSxpLm1pbWVUeXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PW4/bnVsbDpuKyIiLGkpOnR9LGkucmVzcG9uc2VUeXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4saSk6bH0saS5yZXNwb25zZT1mdW5jdGlvbihuKXtyZXR1cm4gZT1uLGl9LFsiZ2V0IiwicG9zdCJdLmZvckVhY2goZnVuY3Rpb24obil7aVtuXT1mdW5jdGlvbigpe3JldHVybiBpLnNlbmQuYXBwbHkoaSxbbl0uY29uY2F0KHJhKGFyZ3VtZW50cykpKX19KSxpLnNlbmQ9ZnVuY3Rpb24oZSxyLHUpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgciYmKHU9cixyPW51bGwpLGMub3BlbihlLG4sITApLG51bGw9PXR8fCJhY2NlcHQiaW4gYXx8KGEuYWNjZXB0PXQrIiwqLyoiKSxjLnNldFJlcXVlc3RIZWFkZXIpZm9yKHZhciBzIGluIGEpYy5zZXRSZXF1ZXN0SGVhZGVyKHMsYVtzXSk7cmV0dXJuIG51bGwhPXQmJmMub3ZlcnJpZGVNaW1lVHlwZSYmYy5vdmVycmlkZU1pbWVUeXBlKHQpLG51bGwhPWwmJihjLnJlc3BvbnNlVHlwZT1sKSxudWxsIT11JiZpLm9uKCJlcnJvciIsdSkub24oImxvYWQiLGZ1bmN0aW9uKG4pe3UobnVsbCxuKX0pLG8uYmVmb3Jlc2VuZC5jYWxsKGksYyksYy5zZW5kKG51bGw9PXI/bnVsbDpyKSxpfSxpLmFib3J0PWZ1bmN0aW9uKCl7cmV0dXJuIGMuYWJvcnQoKSxpfSx0YS5yZWJpbmQoaSxvLCJvbiIpLG51bGw9PXI/aTppLmdldChDdChyKSl9ZnVuY3Rpb24gQ3Qobil7cmV0dXJuIDE9PT1uLmxlbmd0aD9mdW5jdGlvbih0LGUpe24obnVsbD09dD9lOm51bGwpfTpufWZ1bmN0aW9uIHp0KG4pe3ZhciB0PW4ucmVzcG9uc2VUeXBlO3JldHVybiB0JiYidGV4dCIhPT10P24ucmVzcG9uc2U6bi5yZXNwb25zZVRleHR9ZnVuY3Rpb24gcXQoKXt2YXIgbj1MdCgpLHQ9VHQoKS1uO3Q+MjQ/KGlzRmluaXRlKHQpJiYoY2xlYXJUaW1lb3V0KHRjKSx0Yz1zZXRUaW1lb3V0KHF0LHQpKSxuYz0wKToobmM9MSxyYyhxdCkpfWZ1bmN0aW9uIEx0KCl7dmFyIG49RGF0ZS5ub3coKTtmb3IoZWM9S2E7ZWM7KW4+PWVjLnQmJihlYy5mPWVjLmMobi1lYy50KSksZWM9ZWMubjtyZXR1cm4gbn1mdW5jdGlvbiBUdCgpe2Zvcih2YXIgbix0PUthLGU9MS8wO3Q7KXQuZj90PW4/bi5uPXQubjpLYT10Lm46KHQudDxlJiYoZT10LnQpLHQ9KG49dCkubik7cmV0dXJuIFFhPW4sZX1mdW5jdGlvbiBSdChuLHQpe3JldHVybiB0LShuP01hdGguY2VpbChNYXRoLmxvZyhuKS9NYXRoLkxOMTApOjEpfWZ1bmN0aW9uIER0KG4sdCl7dmFyIGU9TWF0aC5wb3coMTAsMypnYSg4LXQpKTtyZXR1cm57c2NhbGU6dD44P2Z1bmN0aW9uKG4pe3JldHVybiBuL2V9OmZ1bmN0aW9uKG4pe3JldHVybiBuKmV9LHN5bWJvbDpufX1mdW5jdGlvbiBQdChuKXt2YXIgdD1uLmRlY2ltYWwsZT1uLnRob3VzYW5kcyxyPW4uZ3JvdXBpbmcsdT1uLmN1cnJlbmN5LGk9ciYmZT9mdW5jdGlvbihuLHQpe2Zvcih2YXIgdT1uLmxlbmd0aCxpPVtdLG89MCxhPXJbMF0sYz0wO3U+MCYmYT4wJiYoYythKzE+dCYmKGE9TWF0aC5tYXgoMSx0LWMpKSxpLnB1c2gobi5zdWJzdHJpbmcodS09YSx1K2EpKSwhKChjKz1hKzEpPnQpKTspYT1yW289KG8rMSklci5sZW5ndGhdO3JldHVybiBpLnJldmVyc2UoKS5qb2luKGUpfTp5O3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1pYy5leGVjKG4pLHI9ZVsxXXx8IiAiLG89ZVsyXXx8Ij4iLGE9ZVszXXx8Ii0iLGM9ZVs0XXx8IiIsbD1lWzVdLHM9K2VbNl0sZj1lWzddLGg9ZVs4XSxnPWVbOV0scD0xLHY9IiIsZD0iIixtPSExLHk9ITA7c3dpdGNoKGgmJihoPStoLnN1YnN0cmluZygxKSksKGx8fCIwIj09PXImJiI9Ij09PW8pJiYobD1yPSIwIixvPSI9IiksZyl7Y2FzZSJuIjpmPSEwLGc9ImciO2JyZWFrO2Nhc2UiJSI6cD0xMDAsZD0iJSIsZz0iZiI7YnJlYWs7Y2FzZSJwIjpwPTEwMCxkPSIlIixnPSJyIjticmVhaztjYXNlImIiOmNhc2UibyI6Y2FzZSJ4IjpjYXNlIlgiOiIjIj09PWMmJih2PSIwIitnLnRvTG93ZXJDYXNlKCkpO2Nhc2UiYyI6eT0hMTtjYXNlImQiOm09ITAsaD0wO2JyZWFrO2Nhc2UicyI6cD0tMSxnPSJyIn0iJCI9PT1jJiYodj11WzBdLGQ9dVsxXSksInIiIT1nfHxofHwoZz0iZyIpLG51bGwhPWgmJigiZyI9PWc/aD1NYXRoLm1heCgxLE1hdGgubWluKDIxLGgpKTooImUiPT1nfHwiZiI9PWcpJiYoaD1NYXRoLm1heCgwLE1hdGgubWluKDIwLGgpKSkpLGc9b2MuZ2V0KGcpfHxVdDt2YXIgTT1sJiZmO3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1kO2lmKG0mJm4lMSlyZXR1cm4iIjt2YXIgdT0wPm58fDA9PT1uJiYwPjEvbj8obj0tbiwiLSIpOiItIj09PWE/IiI6YTtpZigwPnApe3ZhciBjPXRhLmZvcm1hdFByZWZpeChuLGgpO249Yy5zY2FsZShuKSxlPWMuc3ltYm9sK2R9ZWxzZSBuKj1wO249ZyhuLGgpO3ZhciB4LGIsXz1uLmxhc3RJbmRleE9mKCIuIik7aWYoMD5fKXt2YXIgdz15P24ubGFzdEluZGV4T2YoImUiKTotMTswPnc/KHg9bixiPSIiKTooeD1uLnN1YnN0cmluZygwLHcpLGI9bi5zdWJzdHJpbmcodykpfWVsc2UgeD1uLnN1YnN0cmluZygwLF8pLGI9dCtuLnN1YnN0cmluZyhfKzEpOyFsJiZmJiYoeD1pKHgsMS8wKSk7dmFyIFM9di5sZW5ndGgreC5sZW5ndGgrYi5sZW5ndGgrKE0/MDp1Lmxlbmd0aCksaz1zPlM/bmV3IEFycmF5KFM9cy1TKzEpLmpvaW4ocik6IiI7cmV0dXJuIE0mJih4PWkoayt4LGsubGVuZ3RoP3MtYi5sZW5ndGg6MS8wKSksdSs9dixuPXgrYiwoIjwiPT09bz91K24razoiPiI9PT1vP2srdStuOiJeIj09PW8/ay5zdWJzdHJpbmcoMCxTPj49MSkrdStuK2suc3Vic3RyaW5nKFMpOnUrKE0/bjprK24pKStlfX19ZnVuY3Rpb24gVXQobil7cmV0dXJuIG4rIiJ9ZnVuY3Rpb24ganQoKXt0aGlzLl89bmV3IERhdGUoYXJndW1lbnRzLmxlbmd0aD4xP0RhdGUuVVRDLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHNbMF0pfWZ1bmN0aW9uIEZ0KG4sdCxlKXtmdW5jdGlvbiByKHQpe3ZhciBlPW4odCkscj1pKGUsMSk7cmV0dXJuIHItdD50LWU/ZTpyfWZ1bmN0aW9uIHUoZSl7cmV0dXJuIHQoZT1uKG5ldyBjYyhlLTEpKSwxKSxlfWZ1bmN0aW9uIGkobixlKXtyZXR1cm4gdChuPW5ldyBjYygrbiksZSksbn1mdW5jdGlvbiBvKG4scixpKXt2YXIgbz11KG4pLGE9W107aWYoaT4xKWZvcig7cj5vOyllKG8pJWl8fGEucHVzaChuZXcgRGF0ZSgrbykpLHQobywxKTtlbHNlIGZvcig7cj5vOylhLnB1c2gobmV3IERhdGUoK28pKSx0KG8sMSk7cmV0dXJuIGF9ZnVuY3Rpb24gYShuLHQsZSl7dHJ5e2NjPWp0O3ZhciByPW5ldyBqdDtyZXR1cm4gci5fPW4sbyhyLHQsZSl9ZmluYWxseXtjYz1EYXRlfX1uLmZsb29yPW4sbi5yb3VuZD1yLG4uY2VpbD11LG4ub2Zmc2V0PWksbi5yYW5nZT1vO3ZhciBjPW4udXRjPUh0KG4pO3JldHVybiBjLmZsb29yPWMsYy5yb3VuZD1IdChyKSxjLmNlaWw9SHQodSksYy5vZmZzZXQ9SHQoaSksYy5yYW5nZT1hLG59ZnVuY3Rpb24gSHQobil7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dHJ5e2NjPWp0O3ZhciByPW5ldyBqdDtyZXR1cm4gci5fPXQsbihyLGUpLl99ZmluYWxseXtjYz1EYXRlfX19ZnVuY3Rpb24gT3Qobil7ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiB0KHQpe2Zvcih2YXIgZSx1LGksbz1bXSxhPS0xLGM9MDsrK2E8cjspMzc9PT1uLmNoYXJDb2RlQXQoYSkmJihvLnB1c2gobi5zbGljZShjLGEpKSxudWxsIT0odT1zY1tlPW4uY2hhckF0KCsrYSldKSYmKGU9bi5jaGFyQXQoKythKSksKGk9TltlXSkmJihlPWkodCxudWxsPT11PyJlIj09PWU/IiAiOiIwIjp1KSksby5wdXNoKGUpLGM9YSsxKTtyZXR1cm4gby5wdXNoKG4uc2xpY2UoYyxhKSksby5qb2luKCIiKX12YXIgcj1uLmxlbmd0aDtyZXR1cm4gdC5wYXJzZT1mdW5jdGlvbih0KXt2YXIgcj17eToxOTAwLG06MCxkOjEsSDowLE06MCxTOjAsTDowLFo6bnVsbH0sdT1lKHIsbix0LDApO2lmKHUhPXQubGVuZ3RoKXJldHVybiBudWxsOyJwImluIHImJihyLkg9ci5IJTEyKzEyKnIucCk7dmFyIGk9bnVsbCE9ci5aJiZjYyE9PWp0LG89bmV3KGk/anQ6Y2MpO3JldHVybiJqImluIHI/by5zZXRGdWxsWWVhcihyLnksMCxyLmopOiJ3ImluIHImJigiVyJpbiByfHwiVSJpbiByKT8oby5zZXRGdWxsWWVhcihyLnksMCwxKSxvLnNldEZ1bGxZZWFyKHIueSwwLCJXImluIHI/KHIudys2KSU3Kzcqci5XLShvLmdldERheSgpKzUpJTc6ci53Kzcqci5VLShvLmdldERheSgpKzYpJTcpKTpvLnNldEZ1bGxZZWFyKHIueSxyLm0sci5kKSxvLnNldEhvdXJzKHIuSCsoci5aLzEwMHwwKSxyLk0rci5aJTEwMCxyLlMsci5MKSxpP28uXzpvfSx0LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIG59LHR9ZnVuY3Rpb24gZShuLHQsZSxyKXtmb3IodmFyIHUsaSxvLGE9MCxjPXQubGVuZ3RoLGw9ZS5sZW5ndGg7Yz5hOyl7aWYocj49bClyZXR1cm4tMTtpZih1PXQuY2hhckNvZGVBdChhKyspLDM3PT09dSl7aWYobz10LmNoYXJBdChhKyspLGk9Q1tvIGluIHNjP3QuY2hhckF0KGErKyk6b10sIWl8fChyPWkobixlLHIpKTwwKXJldHVybi0xfWVsc2UgaWYodSE9ZS5jaGFyQ29kZUF0KHIrKykpcmV0dXJuLTF9cmV0dXJuIHJ9ZnVuY3Rpb24gcihuLHQsZSl7Xy5sYXN0SW5kZXg9MDt2YXIgcj1fLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4udz13LmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHUobix0LGUpe3gubGFzdEluZGV4PTA7dmFyIHI9eC5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLnc9Yi5nZXQoclswXS50b0xvd2VyQ2FzZSgpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBpKG4sdCxlKXtFLmxhc3RJbmRleD0wO3ZhciByPUUuZXhlYyh0LnNsaWNlKGUpKTtyZXR1cm4gcj8obi5tPUEuZ2V0KHJbMF0udG9Mb3dlckNhc2UoKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gbyhuLHQsZSl7Uy5sYXN0SW5kZXg9MDt2YXIgcj1TLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4ubT1rLmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGEobix0LHIpe3JldHVybiBlKG4sTi5jLnRvU3RyaW5nKCksdCxyKX1mdW5jdGlvbiBjKG4sdCxyKXtyZXR1cm4gZShuLE4ueC50b1N0cmluZygpLHQscil9ZnVuY3Rpb24gbChuLHQscil7cmV0dXJuIGUobixOLlgudG9TdHJpbmcoKSx0LHIpfWZ1bmN0aW9uIHMobix0LGUpe3ZhciByPU0uZ2V0KHQuc2xpY2UoZSxlKz0yKS50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gbnVsbD09cj8tMToobi5wPXIsZSl9dmFyIGY9bi5kYXRlVGltZSxoPW4uZGF0ZSxnPW4udGltZSxwPW4ucGVyaW9kcyx2PW4uZGF5cyxkPW4uc2hvcnREYXlzLG09bi5tb250aHMseT1uLnNob3J0TW9udGhzO3QudXRjPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIGUobil7dHJ5e2NjPWp0O3ZhciB0PW5ldyBjYztyZXR1cm4gdC5fPW4scih0KX1maW5hbGx5e2NjPURhdGV9fXZhciByPXQobik7cmV0dXJuIGUucGFyc2U9ZnVuY3Rpb24obil7dHJ5e2NjPWp0O3ZhciB0PXIucGFyc2Uobik7cmV0dXJuIHQmJnQuX31maW5hbGx5e2NjPURhdGV9fSxlLnRvU3RyaW5nPXIudG9TdHJpbmcsZX0sdC5tdWx0aT10LnV0Yy5tdWx0aT1hZTt2YXIgTT10YS5tYXAoKSx4PVl0KHYpLGI9WnQodiksXz1ZdChkKSx3PVp0KGQpLFM9WXQobSksaz1adChtKSxFPVl0KHkpLEE9WnQoeSk7cC5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7TS5zZXQobi50b0xvd2VyQ2FzZSgpLHQpfSk7dmFyIE49e2E6ZnVuY3Rpb24obil7cmV0dXJuIGRbbi5nZXREYXkoKV19LEE6ZnVuY3Rpb24obil7cmV0dXJuIHZbbi5nZXREYXkoKV19LGI6ZnVuY3Rpb24obil7cmV0dXJuIHlbbi5nZXRNb250aCgpXX0sQjpmdW5jdGlvbihuKXtyZXR1cm4gbVtuLmdldE1vbnRoKCldfSxjOnQoZiksZDpmdW5jdGlvbihuLHQpe3JldHVybiBJdChuLmdldERhdGUoKSx0LDIpfSxlOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KG4uZ2V0RGF0ZSgpLHQsMil9LEg6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRIb3VycygpLHQsMil9LEk6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRIb3VycygpJTEyfHwxMix0LDIpfSxqOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KDErYWMuZGF5T2ZZZWFyKG4pLHQsMyl9LEw6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRNaWxsaXNlY29uZHMoKSx0LDMpfSxtOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KG4uZ2V0TW9udGgoKSsxLHQsMil9LE06ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRNaW51dGVzKCksdCwyKX0scDpmdW5jdGlvbihuKXtyZXR1cm4gcFsrKG4uZ2V0SG91cnMoKT49MTIpXX0sUzpmdW5jdGlvbihuLHQpe3JldHVybiBJdChuLmdldFNlY29uZHMoKSx0LDIpfSxVOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KGFjLnN1bmRheU9mWWVhcihuKSx0LDIpfSx3OmZ1bmN0aW9uKG4pe3JldHVybiBuLmdldERheSgpfSxXOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KGFjLm1vbmRheU9mWWVhcihuKSx0LDIpfSx4OnQoaCksWDp0KGcpLHk6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRGdWxsWWVhcigpJTEwMCx0LDIpfSxZOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KG4uZ2V0RnVsbFllYXIoKSUxZTQsdCw0KX0sWjppZSwiJSI6ZnVuY3Rpb24oKXtyZXR1cm4iJSJ9fSxDPXthOnIsQTp1LGI6aSxCOm8sYzphLGQ6UXQsZTpRdCxIOnRlLEk6dGUsajpuZSxMOnVlLG06S3QsTTplZSxwOnMsUzpyZSxVOlh0LHc6VnQsVzokdCx4OmMsWDpsLHk6V3QsWTpCdCxaOkp0LCIlIjpvZX07cmV0dXJuIHR9ZnVuY3Rpb24gSXQobix0LGUpe3ZhciByPTA+bj8iLSI6IiIsdT0ocj8tbjpuKSsiIixpPXUubGVuZ3RoO3JldHVybiByKyhlPmk/bmV3IEFycmF5KGUtaSsxKS5qb2luKHQpK3U6dSl9ZnVuY3Rpb24gWXQobil7cmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiK24ubWFwKHRhLnJlcXVvdGUpLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiBadChuKXtmb3IodmFyIHQ9bmV3IGwsZT0tMSxyPW4ubGVuZ3RoOysrZTxyOyl0LnNldChuW2VdLnRvTG93ZXJDYXNlKCksZSk7cmV0dXJuIHR9ZnVuY3Rpb24gVnQobix0LGUpe2ZjLmxhc3RJbmRleD0wO3ZhciByPWZjLmV4ZWModC5zbGljZShlLGUrMSkpO3JldHVybiByPyhuLnc9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gWHQobix0LGUpe2ZjLmxhc3RJbmRleD0wO3ZhciByPWZjLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4uVT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiAkdChuLHQsZSl7ZmMubGFzdEluZGV4PTA7dmFyIHI9ZmMuZXhlYyh0LnNsaWNlKGUpKTtyZXR1cm4gcj8obi5XPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEJ0KG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzQpKTtyZXR1cm4gcj8obi55PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFd0KG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi55PUd0KCtyWzBdKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBKdChuLHQsZSl7cmV0dXJuL15bKy1dXGR7NH0kLy50ZXN0KHQ9dC5zbGljZShlLGUrNSkpPyhuLlo9LXQsZSs1KTotMX1mdW5jdGlvbiBHdChuKXtyZXR1cm4gbisobj42OD8xOTAwOjJlMyl9ZnVuY3Rpb24gS3Qobix0LGUpe2ZjLmxhc3RJbmRleD0wO3ZhciByPWZjLmV4ZWModC5zbGljZShlLGUrMikpO3JldHVybiByPyhuLm09clswXS0xLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFF0KG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG5lKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8obi5qPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHRlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5IPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGVlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5NPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHJlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5TPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHVlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8obi5MPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGllKG4pe3ZhciB0PW4uZ2V0VGltZXpvbmVPZmZzZXQoKSxlPXQ+MD8iLSI6IisiLHI9Z2EodCkvNjB8MCx1PWdhKHQpJTYwO3JldHVybiBlK0l0KHIsIjAiLDIpK0l0KHUsIjAiLDIpfWZ1bmN0aW9uIG9lKG4sdCxlKXtoYy5sYXN0SW5kZXg9MDt2YXIgcj1oYy5leGVjKHQuc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj9lK3JbMF0ubGVuZ3RoOi0xfWZ1bmN0aW9uIGFlKG4pe2Zvcih2YXIgdD1uLmxlbmd0aCxlPS0xOysrZTx0OyluW2VdWzBdPXRoaXMobltlXVswXSk7cmV0dXJuIGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLHI9bltlXTshclsxXSh0KTspcj1uWysrZV07cmV0dXJuIHJbMF0odCl9fWZ1bmN0aW9uIGNlKCl7fWZ1bmN0aW9uIGxlKG4sdCxlKXt2YXIgcj1lLnM9bit0LHU9ci1uLGk9ci11O2UudD1uLWkrKHQtdSl9ZnVuY3Rpb24gc2Uobix0KXtuJiZkYy5oYXNPd25Qcm9wZXJ0eShuLnR5cGUpJiZkY1tuLnR5cGVdKG4sdCl9ZnVuY3Rpb24gZmUobix0LGUpe3ZhciByLHU9LTEsaT1uLmxlbmd0aC1lO2Zvcih0LmxpbmVTdGFydCgpOysrdTxpOylyPW5bdV0sdC5wb2ludChyWzBdLHJbMV0sclsyXSk7dC5saW5lRW5kKCl9ZnVuY3Rpb24gaGUobix0KXt2YXIgZT0tMSxyPW4ubGVuZ3RoO2Zvcih0LnBvbHlnb25TdGFydCgpOysrZTxyOylmZShuW2VdLHQsMSk7dC5wb2x5Z29uRW5kKCl9ZnVuY3Rpb24gZ2UoKXtmdW5jdGlvbiBuKG4sdCl7bio9RGEsdD10KkRhLzIrcWEvNDt2YXIgZT1uLXIsbz1lPj0wPzE6LTEsYT1vKmUsYz1NYXRoLmNvcyh0KSxsPU1hdGguc2luKHQpLHM9aSpsLGY9dSpjK3MqTWF0aC5jb3MoYSksaD1zKm8qTWF0aC5zaW4oYSk7eWMuYWRkKE1hdGguYXRhbjIoaCxmKSkscj1uLHU9YyxpPWx9dmFyIHQsZSxyLHUsaTtNYy5wb2ludD1mdW5jdGlvbihvLGEpe01jLnBvaW50PW4scj0odD1vKSpEYSx1PU1hdGguY29zKGE9KGU9YSkqRGEvMitxYS80KSxpPU1hdGguc2luKGEpfSxNYy5saW5lRW5kPWZ1bmN0aW9uKCl7bih0LGUpfX1mdW5jdGlvbiBwZShuKXt2YXIgdD1uWzBdLGU9blsxXSxyPU1hdGguY29zKGUpO3JldHVybltyKk1hdGguY29zKHQpLHIqTWF0aC5zaW4odCksTWF0aC5zaW4oZSldfWZ1bmN0aW9uIHZlKG4sdCl7cmV0dXJuIG5bMF0qdFswXStuWzFdKnRbMV0rblsyXSp0WzJdfWZ1bmN0aW9uIGRlKG4sdCl7cmV0dXJuW25bMV0qdFsyXS1uWzJdKnRbMV0sblsyXSp0WzBdLW5bMF0qdFsyXSxuWzBdKnRbMV0tblsxXSp0WzBdXX1mdW5jdGlvbiBtZShuLHQpe25bMF0rPXRbMF0sblsxXSs9dFsxXSxuWzJdKz10WzJdfWZ1bmN0aW9uIHllKG4sdCl7cmV0dXJuW25bMF0qdCxuWzFdKnQsblsyXSp0XX1mdW5jdGlvbiBNZShuKXt2YXIgdD1NYXRoLnNxcnQoblswXSpuWzBdK25bMV0qblsxXStuWzJdKm5bMl0pO25bMF0vPXQsblsxXS89dCxuWzJdLz10fWZ1bmN0aW9uIHhlKG4pe3JldHVybltNYXRoLmF0YW4yKG5bMV0sblswXSksdHQoblsyXSldfWZ1bmN0aW9uIGJlKG4sdCl7cmV0dXJuIGdhKG5bMF0tdFswXSk8Q2EmJmdhKG5bMV0tdFsxXSk8Q2F9ZnVuY3Rpb24gX2Uobix0KXtuKj1EYTt2YXIgZT1NYXRoLmNvcyh0Kj1EYSk7d2UoZSpNYXRoLmNvcyhuKSxlKk1hdGguc2luKG4pLE1hdGguc2luKHQpKX1mdW5jdGlvbiB3ZShuLHQsZSl7Kyt4YyxfYys9KG4tX2MpL3hjLHdjKz0odC13YykveGMsU2MrPShlLVNjKS94Y31mdW5jdGlvbiBTZSgpe2Z1bmN0aW9uIG4obix1KXtuKj1EYTt2YXIgaT1NYXRoLmNvcyh1Kj1EYSksbz1pKk1hdGguY29zKG4pLGE9aSpNYXRoLnNpbihuKSxjPU1hdGguc2luKHUpLGw9TWF0aC5hdGFuMihNYXRoLnNxcnQoKGw9ZSpjLXIqYSkqbCsobD1yKm8tdCpjKSpsKyhsPXQqYS1lKm8pKmwpLHQqbytlKmErcipjKTtiYys9bCxrYys9bCoodCsodD1vKSksRWMrPWwqKGUrKGU9YSkpLEFjKz1sKihyKyhyPWMpKSx3ZSh0LGUscil9dmFyIHQsZSxyO3FjLnBvaW50PWZ1bmN0aW9uKHUsaSl7dSo9RGE7dmFyIG89TWF0aC5jb3MoaSo9RGEpO3Q9bypNYXRoLmNvcyh1KSxlPW8qTWF0aC5zaW4odSkscj1NYXRoLnNpbihpKSxxYy5wb2ludD1uLHdlKHQsZSxyKX19ZnVuY3Rpb24ga2UoKXtxYy5wb2ludD1fZX1mdW5jdGlvbiBFZSgpe2Z1bmN0aW9uIG4obix0KXtuKj1EYTt2YXIgZT1NYXRoLmNvcyh0Kj1EYSksbz1lKk1hdGguY29zKG4pLGE9ZSpNYXRoLnNpbihuKSxjPU1hdGguc2luKHQpLGw9dSpjLWkqYSxzPWkqby1yKmMsZj1yKmEtdSpvLGg9TWF0aC5zcXJ0KGwqbCtzKnMrZipmKSxnPXIqbyt1KmEraSpjLHA9aCYmLW50KGcpL2gsdj1NYXRoLmF0YW4yKGgsZyk7TmMrPXAqbCxDYys9cCpzLHpjKz1wKmYsYmMrPXYsa2MrPXYqKHIrKHI9bykpLEVjKz12Kih1Kyh1PWEpKSxBYys9diooaSsoaT1jKSksd2Uocix1LGkpfXZhciB0LGUscix1LGk7cWMucG9pbnQ9ZnVuY3Rpb24obyxhKXt0PW8sZT1hLHFjLnBvaW50PW4sbyo9RGE7dmFyIGM9TWF0aC5jb3MoYSo9RGEpO3I9YypNYXRoLmNvcyhvKSx1PWMqTWF0aC5zaW4obyksaT1NYXRoLnNpbihhKSx3ZShyLHUsaSl9LHFjLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSkscWMubGluZUVuZD1rZSxxYy5wb2ludD1fZX19ZnVuY3Rpb24gQWUobix0KXtmdW5jdGlvbiBlKGUscil7cmV0dXJuIGU9bihlLHIpLHQoZVswXSxlWzFdKX1yZXR1cm4gbi5pbnZlcnQmJnQuaW52ZXJ0JiYoZS5pbnZlcnQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZT10LmludmVydChlLHIpLGUmJm4uaW52ZXJ0KGVbMF0sZVsxXSl9KSxlfWZ1bmN0aW9uIE5lKCl7cmV0dXJuITB9ZnVuY3Rpb24gQ2Uobix0LGUscix1KXt2YXIgaT1bXSxvPVtdO2lmKG4uZm9yRWFjaChmdW5jdGlvbihuKXtpZighKCh0PW4ubGVuZ3RoLTEpPD0wKSl7dmFyIHQsZT1uWzBdLHI9blt0XTtpZihiZShlLHIpKXt1LmxpbmVTdGFydCgpO2Zvcih2YXIgYT0wO3Q+YTsrK2EpdS5wb2ludCgoZT1uW2FdKVswXSxlWzFdKTtyZXR1cm4gdm9pZCB1LmxpbmVFbmQoKX12YXIgYz1uZXcgcWUoZSxuLG51bGwsITApLGw9bmV3IHFlKGUsbnVsbCxjLCExKTtjLm89bCxpLnB1c2goYyksby5wdXNoKGwpLGM9bmV3IHFlKHIsbixudWxsLCExKSxsPW5ldyBxZShyLG51bGwsYywhMCksYy5vPWwsaS5wdXNoKGMpLG8ucHVzaChsKX19KSxvLnNvcnQodCksemUoaSksemUobyksaS5sZW5ndGgpe2Zvcih2YXIgYT0wLGM9ZSxsPW8ubGVuZ3RoO2w+YTsrK2Epb1thXS5lPWM9IWM7Zm9yKHZhciBzLGYsaD1pWzBdOzspe2Zvcih2YXIgZz1oLHA9ITA7Zy52OylpZigoZz1nLm4pPT09aClyZXR1cm47cz1nLnosdS5saW5lU3RhcnQoKTtkb3tpZihnLnY9Zy5vLnY9ITAsZy5lKXtpZihwKWZvcih2YXIgYT0wLGw9cy5sZW5ndGg7bD5hOysrYSl1LnBvaW50KChmPXNbYV0pWzBdLGZbMV0pO2Vsc2UgcihnLngsZy5uLngsMSx1KTtnPWcubn1lbHNle2lmKHApe3M9Zy5wLno7Zm9yKHZhciBhPXMubGVuZ3RoLTE7YT49MDstLWEpdS5wb2ludCgoZj1zW2FdKVswXSxmWzFdKX1lbHNlIHIoZy54LGcucC54LC0xLHUpO2c9Zy5wfWc9Zy5vLHM9Zy56LHA9IXB9d2hpbGUoIWcudik7dS5saW5lRW5kKCl9fX1mdW5jdGlvbiB6ZShuKXtpZih0PW4ubGVuZ3RoKXtmb3IodmFyIHQsZSxyPTAsdT1uWzBdOysrcjx0Oyl1Lm49ZT1uW3JdLGUucD11LHU9ZTt1Lm49ZT1uWzBdLGUucD11fX1mdW5jdGlvbiBxZShuLHQsZSxyKXt0aGlzLng9bix0aGlzLno9dCx0aGlzLm89ZSx0aGlzLmU9cix0aGlzLnY9ITEsdGhpcy5uPXRoaXMucD1udWxsfWZ1bmN0aW9uIExlKG4sdCxlLHIpe3JldHVybiBmdW5jdGlvbih1LGkpe2Z1bmN0aW9uIG8odCxlKXt2YXIgcj11KHQsZSk7bih0PXJbMF0sZT1yWzFdKSYmaS5wb2ludCh0LGUpfWZ1bmN0aW9uIGEobix0KXt2YXIgZT11KG4sdCk7ZC5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIGMoKXt5LnBvaW50PWEsZC5saW5lU3RhcnQoKX1mdW5jdGlvbiBsKCl7eS5wb2ludD1vLGQubGluZUVuZCgpfWZ1bmN0aW9uIHMobix0KXt2LnB1c2goW24sdF0pO3ZhciBlPXUobix0KTt4LnBvaW50KGVbMF0sZVsxXSl9ZnVuY3Rpb24gZigpe3gubGluZVN0YXJ0KCksdj1bXX1mdW5jdGlvbiBoKCl7cyh2WzBdWzBdLHZbMF1bMV0pLHgubGluZUVuZCgpO3ZhciBuLHQ9eC5jbGVhbigpLGU9TS5idWZmZXIoKSxyPWUubGVuZ3RoO2lmKHYucG9wKCkscC5wdXNoKHYpLHY9bnVsbCxyKWlmKDEmdCl7bj1lWzBdO3ZhciB1LHI9bi5sZW5ndGgtMSxvPS0xO2lmKHI+MCl7Zm9yKGJ8fChpLnBvbHlnb25TdGFydCgpLGI9ITApLGkubGluZVN0YXJ0KCk7KytvPHI7KWkucG9pbnQoKHU9bltvXSlbMF0sdVsxXSk7aS5saW5lRW5kKCl9fWVsc2Ugcj4xJiYyJnQmJmUucHVzaChlLnBvcCgpLmNvbmNhdChlLnNoaWZ0KCkpKSxnLnB1c2goZS5maWx0ZXIoVGUpKX12YXIgZyxwLHYsZD10KGkpLG09dS5pbnZlcnQoclswXSxyWzFdKSx5PXtwb2ludDpvLGxpbmVTdGFydDpjLGxpbmVFbmQ6bCxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt5LnBvaW50PXMseS5saW5lU3RhcnQ9Zix5LmxpbmVFbmQ9aCxnPVtdLHA9W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt5LnBvaW50PW8seS5saW5lU3RhcnQ9Yyx5LmxpbmVFbmQ9bCxnPXRhLm1lcmdlKGcpO3ZhciBuPUZlKG0scCk7Zy5sZW5ndGg/KGJ8fChpLnBvbHlnb25TdGFydCgpLGI9ITApLENlKGcsRGUsbixlLGkpKTpuJiYoYnx8KGkucG9seWdvblN0YXJ0KCksYj0hMCksaS5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLGkpLGkubGluZUVuZCgpKSxiJiYoaS5wb2x5Z29uRW5kKCksYj0hMSksZz1wPW51bGx9LHNwaGVyZTpmdW5jdGlvbigpe2kucG9seWdvblN0YXJ0KCksaS5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLGkpLGkubGluZUVuZCgpLGkucG9seWdvbkVuZCgpfX0sTT1SZSgpLHg9dChNKSxiPSExO3JldHVybiB5fX1mdW5jdGlvbiBUZShuKXtyZXR1cm4gbi5sZW5ndGg+MX1mdW5jdGlvbiBSZSgpe3ZhciBuLHQ9W107cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe3QucHVzaChuPVtdKX0scG9pbnQ6ZnVuY3Rpb24odCxlKXtuLnB1c2goW3QsZV0pfSxsaW5lRW5kOmIsYnVmZmVyOmZ1bmN0aW9uKCl7dmFyIGU9dDtyZXR1cm4gdD1bXSxuPW51bGwsZX0scmVqb2luOmZ1bmN0aW9uKCl7dC5sZW5ndGg+MSYmdC5wdXNoKHQucG9wKCkuY29uY2F0KHQuc2hpZnQoKSkpfX19ZnVuY3Rpb24gRGUobix0KXtyZXR1cm4oKG49bi54KVswXTwwP25bMV0tUmEtQ2E6UmEtblsxXSktKCh0PXQueClbMF08MD90WzFdLVJhLUNhOlJhLXRbMV0pfWZ1bmN0aW9uIFBlKG4pe3ZhciB0LGU9MC8wLHI9MC8wLHU9MC8wO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtuLmxpbmVTdGFydCgpLHQ9MX0scG9pbnQ6ZnVuY3Rpb24oaSxvKXt2YXIgYT1pPjA/cWE6LXFhLGM9Z2EoaS1lKTtnYShjLXFhKTxDYT8obi5wb2ludChlLHI9KHIrbykvMj4wP1JhOi1SYSksbi5wb2ludCh1LHIpLG4ubGluZUVuZCgpLG4ubGluZVN0YXJ0KCksbi5wb2ludChhLHIpLG4ucG9pbnQoaSxyKSx0PTApOnUhPT1hJiZjPj1xYSYmKGdhKGUtdSk8Q2EmJihlLT11KkNhKSxnYShpLWEpPENhJiYoaS09YSpDYSkscj1VZShlLHIsaSxvKSxuLnBvaW50KHUsciksbi5saW5lRW5kKCksbi5saW5lU3RhcnQoKSxuLnBvaW50KGEsciksdD0wKSxuLnBvaW50KGU9aSxyPW8pLHU9YX0sbGluZUVuZDpmdW5jdGlvbigpe24ubGluZUVuZCgpLGU9cj0wLzB9LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItdH19fWZ1bmN0aW9uIFVlKG4sdCxlLHIpe3ZhciB1LGksbz1NYXRoLnNpbihuLWUpO3JldHVybiBnYShvKT5DYT9NYXRoLmF0YW4oKE1hdGguc2luKHQpKihpPU1hdGguY29zKHIpKSpNYXRoLnNpbihlKS1NYXRoLnNpbihyKSoodT1NYXRoLmNvcyh0KSkqTWF0aC5zaW4obikpLyh1KmkqbykpOih0K3IpLzJ9ZnVuY3Rpb24gamUobix0LGUscil7dmFyIHU7aWYobnVsbD09bil1PWUqUmEsci5wb2ludCgtcWEsdSksci5wb2ludCgwLHUpLHIucG9pbnQocWEsdSksci5wb2ludChxYSwwKSxyLnBvaW50KHFhLC11KSxyLnBvaW50KDAsLXUpLHIucG9pbnQoLXFhLC11KSxyLnBvaW50KC1xYSwwKSxyLnBvaW50KC1xYSx1KTtlbHNlIGlmKGdhKG5bMF0tdFswXSk+Q2Epe3ZhciBpPW5bMF08dFswXT9xYTotcWE7dT1lKmkvMixyLnBvaW50KC1pLHUpLHIucG9pbnQoMCx1KSxyLnBvaW50KGksdSl9ZWxzZSByLnBvaW50KHRbMF0sdFsxXSl9ZnVuY3Rpb24gRmUobix0KXt2YXIgZT1uWzBdLHI9blsxXSx1PVtNYXRoLnNpbihlKSwtTWF0aC5jb3MoZSksMF0saT0wLG89MDt5Yy5yZXNldCgpO2Zvcih2YXIgYT0wLGM9dC5sZW5ndGg7Yz5hOysrYSl7dmFyIGw9dFthXSxzPWwubGVuZ3RoO2lmKHMpZm9yKHZhciBmPWxbMF0saD1mWzBdLGc9ZlsxXS8yK3FhLzQscD1NYXRoLnNpbihnKSx2PU1hdGguY29zKGcpLGQ9MTs7KXtkPT09cyYmKGQ9MCksbj1sW2RdO3ZhciBtPW5bMF0seT1uWzFdLzIrcWEvNCxNPU1hdGguc2luKHkpLHg9TWF0aC5jb3MoeSksYj1tLWgsXz1iPj0wPzE6LTEsdz1fKmIsUz13PnFhLGs9cCpNO2lmKHljLmFkZChNYXRoLmF0YW4yKGsqXypNYXRoLnNpbih3KSx2KngraypNYXRoLmNvcyh3KSkpLGkrPVM/YitfKkxhOmIsU15oPj1lXm0+PWUpe3ZhciBFPWRlKHBlKGYpLHBlKG4pKTtNZShFKTt2YXIgQT1kZSh1LEUpO01lKEEpO3ZhciBOPShTXmI+PTA/LTE6MSkqdHQoQVsyXSk7KHI+Tnx8cj09PU4mJihFWzBdfHxFWzFdKSkmJihvKz1TXmI+PTA/MTotMSl9aWYoIWQrKylicmVhaztoPW0scD1NLHY9eCxmPW59fXJldHVybigtQ2E+aXx8Q2E+aSYmMD55YyleMSZvfWZ1bmN0aW9uIEhlKG4pe2Z1bmN0aW9uIHQobix0KXtyZXR1cm4gTWF0aC5jb3MobikqTWF0aC5jb3ModCk+aX1mdW5jdGlvbiBlKG4pe3ZhciBlLGksYyxsLHM7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2w9Yz0hMSxzPTF9LHBvaW50OmZ1bmN0aW9uKGYsaCl7dmFyIGcscD1bZixoXSx2PXQoZixoKSxkPW8/dj8wOnUoZixoKTp2P3UoZisoMD5mP3FhOi1xYSksaCk6MDtpZighZSYmKGw9Yz12KSYmbi5saW5lU3RhcnQoKSx2IT09YyYmKGc9cihlLHApLChiZShlLGcpfHxiZShwLGcpKSYmKHBbMF0rPUNhLHBbMV0rPUNhLHY9dChwWzBdLHBbMV0pKSksdiE9PWMpcz0wLHY/KG4ubGluZVN0YXJ0KCksZz1yKHAsZSksbi5wb2ludChnWzBdLGdbMV0pKTooZz1yKGUscCksbi5wb2ludChnWzBdLGdbMV0pLG4ubGluZUVuZCgpKSxlPWc7ZWxzZSBpZihhJiZlJiZvXnYpe3ZhciBtO2QmaXx8IShtPXIocCxlLCEwKSl8fChzPTAsbz8obi5saW5lU3RhcnQoKSxuLnBvaW50KG1bMF1bMF0sbVswXVsxXSksbi5wb2ludChtWzFdWzBdLG1bMV1bMV0pLG4ubGluZUVuZCgpKToobi5wb2ludChtWzFdWzBdLG1bMV1bMV0pLG4ubGluZUVuZCgpLG4ubGluZVN0YXJ0KCksbi5wb2ludChtWzBdWzBdLG1bMF1bMV0pKSl9IXZ8fGUmJmJlKGUscCl8fG4ucG9pbnQocFswXSxwWzFdKSxlPXAsYz12LGk9ZH0sbGluZUVuZDpmdW5jdGlvbigpe2MmJm4ubGluZUVuZCgpLGU9bnVsbH0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gc3wobCYmYyk8PDF9fX1mdW5jdGlvbiByKG4sdCxlKXt2YXIgcj1wZShuKSx1PXBlKHQpLG89WzEsMCwwXSxhPWRlKHIsdSksYz12ZShhLGEpLGw9YVswXSxzPWMtbCpsO2lmKCFzKXJldHVybiFlJiZuO3ZhciBmPWkqYy9zLGg9LWkqbC9zLGc9ZGUobyxhKSxwPXllKG8sZiksdj15ZShhLGgpO21lKHAsdik7dmFyIGQ9ZyxtPXZlKHAsZCkseT12ZShkLGQpLE09bSptLXkqKHZlKHAscCktMSk7aWYoISgwPk0pKXt2YXIgeD1NYXRoLnNxcnQoTSksYj15ZShkLCgtbS14KS95KTtpZihtZShiLHApLGI9eGUoYiksIWUpcmV0dXJuIGI7dmFyIF8sdz1uWzBdLFM9dFswXSxrPW5bMV0sRT10WzFdO3c+UyYmKF89dyx3PVMsUz1fKTt2YXIgQT1TLXcsTj1nYShBLXFhKTxDYSxDPU58fENhPkE7aWYoIU4mJms+RSYmKF89ayxrPUUsRT1fKSxDP04/aytFPjBeYlsxXTwoZ2EoYlswXS13KTxDYT9rOkUpOms8PWJbMV0mJmJbMV08PUU6QT5xYV4odzw9YlswXSYmYlswXTw9Uykpe3ZhciB6PXllKGQsKC1tK3gpL3kpO3JldHVybiBtZSh6LHApLFtiLHhlKHopXX19fWZ1bmN0aW9uIHUodCxlKXt2YXIgcj1vP246cWEtbix1PTA7cmV0dXJuLXI+dD91fD0xOnQ+ciYmKHV8PTIpLC1yPmU/dXw9NDplPnImJih1fD04KSx1fXZhciBpPU1hdGguY29zKG4pLG89aT4wLGE9Z2EoaSk+Q2EsYz1ncihuLDYqRGEpO3JldHVybiBMZSh0LGUsYyxvP1swLC1uXTpbLXFhLG4tcWFdKX1mdW5jdGlvbiBPZShuLHQsZSxyKXtyZXR1cm4gZnVuY3Rpb24odSl7dmFyIGksbz11LmEsYT11LmIsYz1vLngsbD1vLnkscz1hLngsZj1hLnksaD0wLGc9MSxwPXMtYyx2PWYtbDtpZihpPW4tYyxwfHwhKGk+MCkpe2lmKGkvPXAsMD5wKXtpZihoPmkpcmV0dXJuO2c+aSYmKGc9aSl9ZWxzZSBpZihwPjApe2lmKGk+ZylyZXR1cm47aT5oJiYoaD1pKX1pZihpPWUtYyxwfHwhKDA+aSkpe2lmKGkvPXAsMD5wKXtpZihpPmcpcmV0dXJuO2k+aCYmKGg9aSl9ZWxzZSBpZihwPjApe2lmKGg+aSlyZXR1cm47Zz5pJiYoZz1pKX1pZihpPXQtbCx2fHwhKGk+MCkpe2lmKGkvPXYsMD52KXtpZihoPmkpcmV0dXJuO2c+aSYmKGc9aSl9ZWxzZSBpZih2PjApe2lmKGk+ZylyZXR1cm47aT5oJiYoaD1pKX1pZihpPXItbCx2fHwhKDA+aSkpe2lmKGkvPXYsMD52KXtpZihpPmcpcmV0dXJuO2k+aCYmKGg9aSl9ZWxzZSBpZih2PjApe2lmKGg+aSlyZXR1cm47Zz5pJiYoZz1pKX1yZXR1cm4gaD4wJiYodS5hPXt4OmMraCpwLHk6bCtoKnZ9KSwxPmcmJih1LmI9e3g6YytnKnAseTpsK2cqdn0pLHV9fX19fX1mdW5jdGlvbiBJZShuLHQsZSxyKXtmdW5jdGlvbiB1KHIsdSl7cmV0dXJuIGdhKHJbMF0tbik8Q2E/dT4wPzA6MzpnYShyWzBdLWUpPENhP3U+MD8yOjE6Z2EoclsxXS10KTxDYT91PjA/MTowOnU+MD8zOjJ9ZnVuY3Rpb24gaShuLHQpe3JldHVybiBvKG4ueCx0LngpfWZ1bmN0aW9uIG8obix0KXt2YXIgZT11KG4sMSkscj11KHQsMSk7cmV0dXJuIGUhPT1yP2UtcjowPT09ZT90WzFdLW5bMV06MT09PWU/blswXS10WzBdOjI9PT1lP25bMV0tdFsxXTp0WzBdLW5bMF19cmV0dXJuIGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMobil7Zm9yKHZhciB0PTAsZT1kLmxlbmd0aCxyPW5bMV0sdT0wO2U+dTsrK3UpZm9yKHZhciBpLG89MSxhPWRbdV0sYz1hLmxlbmd0aCxsPWFbMF07Yz5vOysrbylpPWFbb10sbFsxXTw9cj9pWzFdPnImJlEobCxpLG4pPjAmJisrdDppWzFdPD1yJiZRKGwsaSxuKTwwJiYtLXQsbD1pO3JldHVybiAwIT09dH1mdW5jdGlvbiBsKGksYSxjLGwpe3ZhciBzPTAsZj0wO2lmKG51bGw9PWl8fChzPXUoaSxjKSkhPT0oZj11KGEsYykpfHxvKGksYSk8MF5jPjApe2RvIGwucG9pbnQoMD09PXN8fDM9PT1zP246ZSxzPjE/cjp0KTt3aGlsZSgocz0ocytjKzQpJTQpIT09Zil9ZWxzZSBsLnBvaW50KGFbMF0sYVsxXSl9ZnVuY3Rpb24gcyh1LGkpe3JldHVybiB1Pj1uJiZlPj11JiZpPj10JiZyPj1pfWZ1bmN0aW9uIGYobix0KXtzKG4sdCkmJmEucG9pbnQobix0KX1mdW5jdGlvbiBoKCl7Qy5wb2ludD1wLGQmJmQucHVzaChtPVtdKSxTPSEwLHc9ITEsYj1fPTAvMH1mdW5jdGlvbiBnKCl7diYmKHAoeSxNKSx4JiZ3JiZBLnJlam9pbigpLHYucHVzaChBLmJ1ZmZlcigpKSksQy5wb2ludD1mLHcmJmEubGluZUVuZCgpfWZ1bmN0aW9uIHAobix0KXtuPU1hdGgubWF4KC1UYyxNYXRoLm1pbihUYyxuKSksdD1NYXRoLm1heCgtVGMsTWF0aC5taW4oVGMsdCkpO3ZhciBlPXMobix0KTtpZihkJiZtLnB1c2goW24sdF0pLFMpeT1uLE09dCx4PWUsUz0hMSxlJiYoYS5saW5lU3RhcnQoKSxhLnBvaW50KG4sdCkpO2Vsc2UgaWYoZSYmdylhLnBvaW50KG4sdCk7ZWxzZXt2YXIgcj17YTp7eDpiLHk6X30sYjp7eDpuLHk6dH19O04ocik/KHd8fChhLmxpbmVTdGFydCgpLGEucG9pbnQoci5hLngsci5hLnkpKSxhLnBvaW50KHIuYi54LHIuYi55KSxlfHxhLmxpbmVFbmQoKSxrPSExKTplJiYoYS5saW5lU3RhcnQoKSxhLnBvaW50KG4sdCksaz0hMSl9Yj1uLF89dCx3PWV9dmFyIHYsZCxtLHksTSx4LGIsXyx3LFMsayxFPWEsQT1SZSgpLE49T2Uobix0LGUsciksQz17cG9pbnQ6ZixsaW5lU3RhcnQ6aCxsaW5lRW5kOmcscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7YT1BLHY9W10sZD1bXSxrPSEwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7YT1FLHY9dGEubWVyZ2Uodik7dmFyIHQ9YyhbbixyXSksZT1rJiZ0LHU9di5sZW5ndGg7KGV8fHUpJiYoYS5wb2x5Z29uU3RhcnQoKSxlJiYoYS5saW5lU3RhcnQoKSxsKG51bGwsbnVsbCwxLGEpLGEubGluZUVuZCgpKSx1JiZDZSh2LGksdCxsLGEpLGEucG9seWdvbkVuZCgpKSx2PWQ9bT1udWxsfX07cmV0dXJuIEN9fWZ1bmN0aW9uIFllKG4pe3ZhciB0PTAsZT1xYS8zLHI9aXIobiksdT1yKHQsZSk7cmV0dXJuIHUucGFyYWxsZWxzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3IodD1uWzBdKnFhLzE4MCxlPW5bMV0qcWEvMTgwKTpbdC9xYSoxODAsZS9xYSoxODBdfSx1fWZ1bmN0aW9uIFplKG4sdCl7ZnVuY3Rpb24gZShuLHQpe3ZhciBlPU1hdGguc3FydChpLTIqdSpNYXRoLnNpbih0KSkvdTtyZXR1cm5bZSpNYXRoLnNpbihuKj11KSxvLWUqTWF0aC5jb3MobildfXZhciByPU1hdGguc2luKG4pLHU9KHIrTWF0aC5zaW4odCkpLzIsaT0xK3IqKDIqdS1yKSxvPU1hdGguc3FydChpKS91O3JldHVybiBlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPW8tdDtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL3UsdHQoKGktKG4qbitlKmUpKnUqdSkvKDIqdSkpXX0sZX1mdW5jdGlvbiBWZSgpe2Z1bmN0aW9uIG4obix0KXtEYys9dSpuLXIqdCxyPW4sdT10fXZhciB0LGUscix1O0hjLnBvaW50PWZ1bmN0aW9uKGksbyl7SGMucG9pbnQ9bix0PXI9aSxlPXU9b30sSGMubGluZUVuZD1mdW5jdGlvbigpe24odCxlKX19ZnVuY3Rpb24gWGUobix0KXtQYz5uJiYoUGM9biksbj5qYyYmKGpjPW4pLFVjPnQmJihVYz10KSx0PkZjJiYoRmM9dCl9ZnVuY3Rpb24gJGUoKXtmdW5jdGlvbiBuKG4sdCl7by5wdXNoKCJNIixuLCIsIix0LGkpfWZ1bmN0aW9uIHQobix0KXtvLnB1c2goIk0iLG4sIiwiLHQpLGEucG9pbnQ9ZX1mdW5jdGlvbiBlKG4sdCl7by5wdXNoKCJMIixuLCIsIix0KX1mdW5jdGlvbiByKCl7YS5wb2ludD1ufWZ1bmN0aW9uIHUoKXtvLnB1c2goIloiKX12YXIgaT1CZSg0LjUpLG89W10sYT17cG9pbnQ6bixsaW5lU3RhcnQ6ZnVuY3Rpb24oKXthLnBvaW50PXR9LGxpbmVFbmQ6cixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXthLmxpbmVFbmQ9dX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2EubGluZUVuZD1yLGEucG9pbnQ9bn0scG9pbnRSYWRpdXM6ZnVuY3Rpb24obil7cmV0dXJuIGk9QmUobiksYX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYoby5sZW5ndGgpe3ZhciBuPW8uam9pbigiIik7cmV0dXJuIG89W10sbn19fTtyZXR1cm4gYX1mdW5jdGlvbiBCZShuKXtyZXR1cm4ibTAsIituKyJhIituKyIsIituKyIgMCAxLDEgMCwiKy0yKm4rImEiK24rIiwiK24rIiAwIDEsMSAwLCIrMipuKyJ6In1mdW5jdGlvbiBXZShuLHQpe19jKz1uLHdjKz10LCsrU2N9ZnVuY3Rpb24gSmUoKXtmdW5jdGlvbiBuKG4scil7dmFyIHU9bi10LGk9ci1lLG89TWF0aC5zcXJ0KHUqdStpKmkpO2tjKz1vKih0K24pLzIsRWMrPW8qKGUrcikvMixBYys9byxXZSh0PW4sZT1yKX12YXIgdCxlO0ljLnBvaW50PWZ1bmN0aW9uKHIsdSl7SWMucG9pbnQ9bixXZSh0PXIsZT11KX19ZnVuY3Rpb24gR2UoKXtJYy5wb2ludD1XZX1mdW5jdGlvbiBLZSgpe2Z1bmN0aW9uIG4obix0KXt2YXIgZT1uLXIsaT10LXUsbz1NYXRoLnNxcnQoZSplK2kqaSk7a2MrPW8qKHIrbikvMixFYys9byoodSt0KS8yLEFjKz1vLG89dSpuLXIqdCxOYys9byoocituKSxDYys9byoodSt0KSx6Yys9MypvLFdlKHI9bix1PXQpfXZhciB0LGUscix1O0ljLnBvaW50PWZ1bmN0aW9uKGksbyl7SWMucG9pbnQ9bixXZSh0PXI9aSxlPXU9byl9LEljLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSl9fWZ1bmN0aW9uIFFlKG4pe2Z1bmN0aW9uIHQodCxlKXtuLm1vdmVUbyh0K28sZSksbi5hcmModCxlLG8sMCxMYSl9ZnVuY3Rpb24gZSh0LGUpe24ubW92ZVRvKHQsZSksYS5wb2ludD1yfWZ1bmN0aW9uIHIodCxlKXtuLmxpbmVUbyh0LGUpfWZ1bmN0aW9uIHUoKXthLnBvaW50PXR9ZnVuY3Rpb24gaSgpe24uY2xvc2VQYXRoKCl9dmFyIG89NC41LGE9e3BvaW50OnQsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7YS5wb2ludD1lfSxsaW5lRW5kOnUscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7YS5saW5lRW5kPWl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXthLmxpbmVFbmQ9dSxhLnBvaW50PXR9LHBvaW50UmFkaXVzOmZ1bmN0aW9uKG4pe3JldHVybiBvPW4sYX0scmVzdWx0OmJ9O3JldHVybiBhfWZ1bmN0aW9uIG5yKG4pe2Z1bmN0aW9uIHQobil7cmV0dXJuKGE/cjplKShuKX1mdW5jdGlvbiBlKHQpe3JldHVybiBycih0LGZ1bmN0aW9uKGUscil7ZT1uKGUsciksdC5wb2ludChlWzBdLGVbMV0pfSl9ZnVuY3Rpb24gcih0KXtmdW5jdGlvbiBlKGUscil7ZT1uKGUsciksdC5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIHIoKXtNPTAvMCxTLnBvaW50PWksdC5saW5lU3RhcnQoKX1mdW5jdGlvbiBpKGUscil7dmFyIGk9cGUoW2Uscl0pLG89bihlLHIpO3UoTSx4LHksYixfLHcsTT1vWzBdLHg9b1sxXSx5PWUsYj1pWzBdLF89aVsxXSx3PWlbMl0sYSx0KSx0LnBvaW50KE0seCl9ZnVuY3Rpb24gbygpe1MucG9pbnQ9ZSx0LmxpbmVFbmQoKX1mdW5jdGlvbiBjKCl7cigpLFMucG9pbnQ9bCxTLmxpbmVFbmQ9c31mdW5jdGlvbiBsKG4sdCl7aShmPW4saD10KSxnPU0scD14LHY9YixkPV8sbT13LFMucG9pbnQ9aX1mdW5jdGlvbiBzKCl7dShNLHgseSxiLF8sdyxnLHAsZix2LGQsbSxhLHQpLFMubGluZUVuZD1vLG8oKX12YXIgZixoLGcscCx2LGQsbSx5LE0seCxiLF8sdyxTPXtwb2ludDplLGxpbmVTdGFydDpyLGxpbmVFbmQ6byxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0LnBvbHlnb25TdGFydCgpLFMubGluZVN0YXJ0PWMKfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dC5wb2x5Z29uRW5kKCksUy5saW5lU3RhcnQ9cn19O3JldHVybiBTfWZ1bmN0aW9uIHUodCxlLHIsYSxjLGwscyxmLGgsZyxwLHYsZCxtKXt2YXIgeT1zLXQsTT1mLWUseD15KnkrTSpNO2lmKHg+NCppJiZkLS0pe3ZhciBiPWErZyxfPWMrcCx3PWwrdixTPU1hdGguc3FydChiKmIrXypfK3cqdyksaz1NYXRoLmFzaW4ody89UyksRT1nYShnYSh3KS0xKTxDYXx8Z2Eoci1oKTxDYT8ocitoKS8yOk1hdGguYXRhbjIoXyxiKSxBPW4oRSxrKSxOPUFbMF0sQz1BWzFdLHo9Ti10LHE9Qy1lLEw9TSp6LXkqcTsoTCpML3g+aXx8Z2EoKHkqeitNKnEpL3gtLjUpPi4zfHxvPmEqZytjKnArbCp2KSYmKHUodCxlLHIsYSxjLGwsTixDLEUsYi89UyxfLz1TLHcsZCxtKSxtLnBvaW50KE4sQyksdShOLEMsRSxiLF8sdyxzLGYsaCxnLHAsdixkLG0pKX19dmFyIGk9LjUsbz1NYXRoLmNvcygzMCpEYSksYT0xNjtyZXR1cm4gdC5wcmVjaXNpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9KGk9bipuKT4wJiYxNix0KTpNYXRoLnNxcnQoaSl9LHR9ZnVuY3Rpb24gdHIobil7dmFyIHQ9bnIoZnVuY3Rpb24odCxlKXtyZXR1cm4gbihbdCpQYSxlKlBhXSl9KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG9yKHQobikpfX1mdW5jdGlvbiBlcihuKXt0aGlzLnN0cmVhbT1ufWZ1bmN0aW9uIHJyKG4sdCl7cmV0dXJue3BvaW50OnQsc3BoZXJlOmZ1bmN0aW9uKCl7bi5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7bi5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe24ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtuLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7bi5wb2x5Z29uRW5kKCl9fX1mdW5jdGlvbiB1cihuKXtyZXR1cm4gaXIoZnVuY3Rpb24oKXtyZXR1cm4gbn0pKCl9ZnVuY3Rpb24gaXIobil7ZnVuY3Rpb24gdChuKXtyZXR1cm4gbj1hKG5bMF0qRGEsblsxXSpEYSksW25bMF0qaCtjLGwtblsxXSpoXX1mdW5jdGlvbiBlKG4pe3JldHVybiBuPWEuaW52ZXJ0KChuWzBdLWMpL2gsKGwtblsxXSkvaCksbiYmW25bMF0qUGEsblsxXSpQYV19ZnVuY3Rpb24gcigpe2E9QWUobz1scihtLE0seCksaSk7dmFyIG49aSh2LGQpO3JldHVybiBjPWctblswXSpoLGw9cCtuWzFdKmgsdSgpfWZ1bmN0aW9uIHUoKXtyZXR1cm4gcyYmKHMudmFsaWQ9ITEscz1udWxsKSx0fXZhciBpLG8sYSxjLGwscyxmPW5yKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49aShuLHQpLFtuWzBdKmgrYyxsLW5bMV0qaF19KSxoPTE1MCxnPTQ4MCxwPTI1MCx2PTAsZD0wLG09MCxNPTAseD0wLGI9TGMsXz15LHc9bnVsbCxTPW51bGw7cmV0dXJuIHQuc3RyZWFtPWZ1bmN0aW9uKG4pe3JldHVybiBzJiYocy52YWxpZD0hMSkscz1vcihiKG8sZihfKG4pKSkpLHMudmFsaWQ9ITAsc30sdC5jbGlwQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGI9bnVsbD09bj8odz1uLExjKTpIZSgodz0rbikqRGEpLHUoKSk6d30sdC5jbGlwRXh0ZW50PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhTPW4sXz1uP0llKG5bMF1bMF0sblswXVsxXSxuWzFdWzBdLG5bMV1bMV0pOnksdSgpKTpTfSx0LnNjYWxlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPStuLHIoKSk6aH0sdC50cmFuc2xhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9K25bMF0scD0rblsxXSxyKCkpOltnLHBdfSx0LmNlbnRlcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj1uWzBdJTM2MCpEYSxkPW5bMV0lMzYwKkRhLHIoKSk6W3YqUGEsZCpQYV19LHQucm90YXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPW5bMF0lMzYwKkRhLE09blsxXSUzNjAqRGEseD1uLmxlbmd0aD4yP25bMl0lMzYwKkRhOjAscigpKTpbbSpQYSxNKlBhLHgqUGFdfSx0YS5yZWJpbmQodCxmLCJwcmVjaXNpb24iKSxmdW5jdGlvbigpe3JldHVybiBpPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHQuaW52ZXJ0PWkuaW52ZXJ0JiZlLHIoKX19ZnVuY3Rpb24gb3Iobil7cmV0dXJuIHJyKG4sZnVuY3Rpb24odCxlKXtuLnBvaW50KHQqRGEsZSpEYSl9KX1mdW5jdGlvbiBhcihuLHQpe3JldHVybltuLHRdfWZ1bmN0aW9uIGNyKG4sdCl7cmV0dXJuW24+cWE/bi1MYTotcWE+bj9uK0xhOm4sdF19ZnVuY3Rpb24gbHIobix0LGUpe3JldHVybiBuP3R8fGU/QWUoZnIobiksaHIodCxlKSk6ZnIobik6dHx8ZT9ocih0LGUpOmNyfWZ1bmN0aW9uIHNyKG4pe3JldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiB0Kz1uLFt0PnFhP3QtTGE6LXFhPnQ/dCtMYTp0LGVdfX1mdW5jdGlvbiBmcihuKXt2YXIgdD1zcihuKTtyZXR1cm4gdC5pbnZlcnQ9c3IoLW4pLHR9ZnVuY3Rpb24gaHIobix0KXtmdW5jdGlvbiBlKG4sdCl7dmFyIGU9TWF0aC5jb3ModCksYT1NYXRoLmNvcyhuKSplLGM9TWF0aC5zaW4obikqZSxsPU1hdGguc2luKHQpLHM9bCpyK2EqdTtyZXR1cm5bTWF0aC5hdGFuMihjKmktcypvLGEqci1sKnUpLHR0KHMqaStjKm8pXX12YXIgcj1NYXRoLmNvcyhuKSx1PU1hdGguc2luKG4pLGk9TWF0aC5jb3ModCksbz1NYXRoLnNpbih0KTtyZXR1cm4gZS5pbnZlcnQ9ZnVuY3Rpb24obix0KXt2YXIgZT1NYXRoLmNvcyh0KSxhPU1hdGguY29zKG4pKmUsYz1NYXRoLnNpbihuKSplLGw9TWF0aC5zaW4odCkscz1sKmktYypvO3JldHVybltNYXRoLmF0YW4yKGMqaStsKm8sYSpyK3MqdSksdHQocypyLWEqdSldfSxlfWZ1bmN0aW9uIGdyKG4sdCl7dmFyIGU9TWF0aC5jb3Mobikscj1NYXRoLnNpbihuKTtyZXR1cm4gZnVuY3Rpb24odSxpLG8sYSl7dmFyIGM9byp0O251bGwhPXU/KHU9cHIoZSx1KSxpPXByKGUsaSksKG8+MD9pPnU6dT5pKSYmKHUrPW8qTGEpKToodT1uK28qTGEsaT1uLS41KmMpO2Zvcih2YXIgbCxzPXU7bz4wP3M+aTppPnM7cy09YylhLnBvaW50KChsPXhlKFtlLC1yKk1hdGguY29zKHMpLC1yKk1hdGguc2luKHMpXSkpWzBdLGxbMV0pfX1mdW5jdGlvbiBwcihuLHQpe3ZhciBlPXBlKHQpO2VbMF0tPW4sTWUoZSk7dmFyIHI9bnQoLWVbMV0pO3JldHVybigoLWVbMl08MD8tcjpyKSsyKk1hdGguUEktQ2EpJSgyKk1hdGguUEkpfWZ1bmN0aW9uIHZyKG4sdCxlKXt2YXIgcj10YS5yYW5nZShuLHQtQ2EsZSkuY29uY2F0KHQpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gci5tYXAoZnVuY3Rpb24odCl7cmV0dXJuW24sdF19KX19ZnVuY3Rpb24gZHIobix0LGUpe3ZhciByPXRhLnJhbmdlKG4sdC1DYSxlKS5jb25jYXQodCk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiByLm1hcChmdW5jdGlvbih0KXtyZXR1cm5bdCxuXX0pfX1mdW5jdGlvbiBtcihuKXtyZXR1cm4gbi5zb3VyY2V9ZnVuY3Rpb24geXIobil7cmV0dXJuIG4udGFyZ2V0fWZ1bmN0aW9uIE1yKG4sdCxlLHIpe3ZhciB1PU1hdGguY29zKHQpLGk9TWF0aC5zaW4odCksbz1NYXRoLmNvcyhyKSxhPU1hdGguc2luKHIpLGM9dSpNYXRoLmNvcyhuKSxsPXUqTWF0aC5zaW4obikscz1vKk1hdGguY29zKGUpLGY9bypNYXRoLnNpbihlKSxoPTIqTWF0aC5hc2luKE1hdGguc3FydChpdChyLXQpK3UqbyppdChlLW4pKSksZz0xL01hdGguc2luKGgpLHA9aD9mdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNpbihuKj1oKSpnLGU9TWF0aC5zaW4oaC1uKSpnLHI9ZSpjK3Qqcyx1PWUqbCt0KmYsbz1lKmkrdCphO3JldHVybltNYXRoLmF0YW4yKHUscikqUGEsTWF0aC5hdGFuMihvLE1hdGguc3FydChyKnIrdSp1KSkqUGFdfTpmdW5jdGlvbigpe3JldHVybltuKlBhLHQqUGFdfTtyZXR1cm4gcC5kaXN0YW5jZT1oLHB9ZnVuY3Rpb24geHIoKXtmdW5jdGlvbiBuKG4sdSl7dmFyIGk9TWF0aC5zaW4odSo9RGEpLG89TWF0aC5jb3ModSksYT1nYSgobio9RGEpLXQpLGM9TWF0aC5jb3MoYSk7WWMrPU1hdGguYXRhbjIoTWF0aC5zcXJ0KChhPW8qTWF0aC5zaW4oYSkpKmErKGE9cippLWUqbypjKSphKSxlKmkrcipvKmMpLHQ9bixlPWkscj1vfXZhciB0LGUscjtaYy5wb2ludD1mdW5jdGlvbih1LGkpe3Q9dSpEYSxlPU1hdGguc2luKGkqPURhKSxyPU1hdGguY29zKGkpLFpjLnBvaW50PW59LFpjLmxpbmVFbmQ9ZnVuY3Rpb24oKXtaYy5wb2ludD1aYy5saW5lRW5kPWJ9fWZ1bmN0aW9uIGJyKG4sdCl7ZnVuY3Rpb24gZSh0LGUpe3ZhciByPU1hdGguY29zKHQpLHU9TWF0aC5jb3MoZSksaT1uKHIqdSk7cmV0dXJuW2kqdSpNYXRoLnNpbih0KSxpKk1hdGguc2luKGUpXX1yZXR1cm4gZS5pbnZlcnQ9ZnVuY3Rpb24obixlKXt2YXIgcj1NYXRoLnNxcnQobipuK2UqZSksdT10KHIpLGk9TWF0aC5zaW4odSksbz1NYXRoLmNvcyh1KTtyZXR1cm5bTWF0aC5hdGFuMihuKmkscipvKSxNYXRoLmFzaW4ociYmZSppL3IpXX0sZX1mdW5jdGlvbiBfcihuLHQpe2Z1bmN0aW9uIGUobix0KXtvPjA/LVJhK0NhPnQmJih0PS1SYStDYSk6dD5SYS1DYSYmKHQ9UmEtQ2EpO3ZhciBlPW8vTWF0aC5wb3codSh0KSxpKTtyZXR1cm5bZSpNYXRoLnNpbihpKm4pLG8tZSpNYXRoLmNvcyhpKm4pXX12YXIgcj1NYXRoLmNvcyhuKSx1PWZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnRhbihxYS80K24vMil9LGk9bj09PXQ/TWF0aC5zaW4obik6TWF0aC5sb2coci9NYXRoLmNvcyh0KSkvTWF0aC5sb2codSh0KS91KG4pKSxvPXIqTWF0aC5wb3codShuKSxpKS9pO3JldHVybiBpPyhlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPW8tdCxyPUsoaSkqTWF0aC5zcXJ0KG4qbitlKmUpO3JldHVybltNYXRoLmF0YW4yKG4sZSkvaSwyKk1hdGguYXRhbihNYXRoLnBvdyhvL3IsMS9pKSktUmFdfSxlKTpTcn1mdW5jdGlvbiB3cihuLHQpe2Z1bmN0aW9uIGUobix0KXt2YXIgZT1pLXQ7cmV0dXJuW2UqTWF0aC5zaW4odSpuKSxpLWUqTWF0aC5jb3ModSpuKV19dmFyIHI9TWF0aC5jb3MobiksdT1uPT09dD9NYXRoLnNpbihuKTooci1NYXRoLmNvcyh0KSkvKHQtbiksaT1yL3UrbjtyZXR1cm4gZ2EodSk8Q2E/YXI6KGUuaW52ZXJ0PWZ1bmN0aW9uKG4sdCl7dmFyIGU9aS10O3JldHVybltNYXRoLmF0YW4yKG4sZSkvdSxpLUsodSkqTWF0aC5zcXJ0KG4qbitlKmUpXX0sZSl9ZnVuY3Rpb24gU3Iobix0KXtyZXR1cm5bbixNYXRoLmxvZyhNYXRoLnRhbihxYS80K3QvMikpXX1mdW5jdGlvbiBrcihuKXt2YXIgdCxlPXVyKG4pLHI9ZS5zY2FsZSx1PWUudHJhbnNsYXRlLGk9ZS5jbGlwRXh0ZW50O3JldHVybiBlLnNjYWxlPWZ1bmN0aW9uKCl7dmFyIG49ci5hcHBseShlLGFyZ3VtZW50cyk7cmV0dXJuIG49PT1lP3Q/ZS5jbGlwRXh0ZW50KG51bGwpOmU6bn0sZS50cmFuc2xhdGU9ZnVuY3Rpb24oKXt2YXIgbj11LmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gbj09PWU/dD9lLmNsaXBFeHRlbnQobnVsbCk6ZTpufSxlLmNsaXBFeHRlbnQ9ZnVuY3Rpb24obil7dmFyIG89aS5hcHBseShlLGFyZ3VtZW50cyk7aWYobz09PWUpe2lmKHQ9bnVsbD09bil7dmFyIGE9cWEqcigpLGM9dSgpO2koW1tjWzBdLWEsY1sxXS1hXSxbY1swXSthLGNbMV0rYV1dKX19ZWxzZSB0JiYobz1udWxsKTtyZXR1cm4gb30sZS5jbGlwRXh0ZW50KG51bGwpfWZ1bmN0aW9uIEVyKG4sdCl7cmV0dXJuW01hdGgubG9nKE1hdGgudGFuKHFhLzQrdC8yKSksLW5dfWZ1bmN0aW9uIEFyKG4pe3JldHVybiBuWzBdfWZ1bmN0aW9uIE5yKG4pe3JldHVybiBuWzFdfWZ1bmN0aW9uIENyKG4pe2Zvcih2YXIgdD1uLmxlbmd0aCxlPVswLDFdLHI9Mix1PTI7dD51O3UrKyl7Zm9yKDtyPjEmJlEobltlW3ItMl1dLG5bZVtyLTFdXSxuW3VdKTw9MDspLS1yO2VbcisrXT11fXJldHVybiBlLnNsaWNlKDAscil9ZnVuY3Rpb24genIobix0KXtyZXR1cm4gblswXS10WzBdfHxuWzFdLXRbMV19ZnVuY3Rpb24gcXIobix0LGUpe3JldHVybihlWzBdLXRbMF0pKihuWzFdLXRbMV0pPChlWzFdLXRbMV0pKihuWzBdLXRbMF0pfWZ1bmN0aW9uIExyKG4sdCxlLHIpe3ZhciB1PW5bMF0saT1lWzBdLG89dFswXS11LGE9clswXS1pLGM9blsxXSxsPWVbMV0scz10WzFdLWMsZj1yWzFdLWwsaD0oYSooYy1sKS1mKih1LWkpKS8oZipvLWEqcyk7cmV0dXJuW3UraCpvLGMraCpzXX1mdW5jdGlvbiBUcihuKXt2YXIgdD1uWzBdLGU9bltuLmxlbmd0aC0xXTtyZXR1cm4hKHRbMF0tZVswXXx8dFsxXS1lWzFdKX1mdW5jdGlvbiBScigpe3R1KHRoaXMpLHRoaXMuZWRnZT10aGlzLnNpdGU9dGhpcy5jaXJjbGU9bnVsbH1mdW5jdGlvbiBEcihuKXt2YXIgdD1lbC5wb3AoKXx8bmV3IFJyO3JldHVybiB0LnNpdGU9bix0fWZ1bmN0aW9uIFByKG4pe1hyKG4pLFFjLnJlbW92ZShuKSxlbC5wdXNoKG4pLHR1KG4pfWZ1bmN0aW9uIFVyKG4pe3ZhciB0PW4uY2lyY2xlLGU9dC54LHI9dC5jeSx1PXt4OmUseTpyfSxpPW4uUCxvPW4uTixhPVtuXTtQcihuKTtmb3IodmFyIGM9aTtjLmNpcmNsZSYmZ2EoZS1jLmNpcmNsZS54KTxDYSYmZ2Eoci1jLmNpcmNsZS5jeSk8Q2E7KWk9Yy5QLGEudW5zaGlmdChjKSxQcihjKSxjPWk7YS51bnNoaWZ0KGMpLFhyKGMpO2Zvcih2YXIgbD1vO2wuY2lyY2xlJiZnYShlLWwuY2lyY2xlLngpPENhJiZnYShyLWwuY2lyY2xlLmN5KTxDYTspbz1sLk4sYS5wdXNoKGwpLFByKGwpLGw9bzthLnB1c2gobCksWHIobCk7dmFyIHMsZj1hLmxlbmd0aDtmb3Iocz0xO2Y+czsrK3MpbD1hW3NdLGM9YVtzLTFdLEtyKGwuZWRnZSxjLnNpdGUsbC5zaXRlLHUpO2M9YVswXSxsPWFbZi0xXSxsLmVkZ2U9SnIoYy5zaXRlLGwuc2l0ZSxudWxsLHUpLFZyKGMpLFZyKGwpfWZ1bmN0aW9uIGpyKG4pe2Zvcih2YXIgdCxlLHIsdSxpPW4ueCxvPW4ueSxhPVFjLl87YTspaWYocj1GcihhLG8pLWkscj5DYSlhPWEuTDtlbHNle2lmKHU9aS1IcihhLG8pLCEodT5DYSkpe3I+LUNhPyh0PWEuUCxlPWEpOnU+LUNhPyh0PWEsZT1hLk4pOnQ9ZT1hO2JyZWFrfWlmKCFhLlIpe3Q9YTticmVha31hPWEuUn12YXIgYz1EcihuKTtpZihRYy5pbnNlcnQodCxjKSx0fHxlKXtpZih0PT09ZSlyZXR1cm4gWHIodCksZT1Ecih0LnNpdGUpLFFjLmluc2VydChjLGUpLGMuZWRnZT1lLmVkZ2U9SnIodC5zaXRlLGMuc2l0ZSksVnIodCksdm9pZCBWcihlKTtpZighZSlyZXR1cm4gdm9pZChjLmVkZ2U9SnIodC5zaXRlLGMuc2l0ZSkpO1hyKHQpLFhyKGUpO3ZhciBsPXQuc2l0ZSxzPWwueCxmPWwueSxoPW4ueC1zLGc9bi55LWYscD1lLnNpdGUsdj1wLngtcyxkPXAueS1mLG09MiooaCpkLWcqdikseT1oKmgrZypnLE09dip2K2QqZCx4PXt4OihkKnktZypNKS9tK3MseTooaCpNLXYqeSkvbStmfTtLcihlLmVkZ2UsbCxwLHgpLGMuZWRnZT1KcihsLG4sbnVsbCx4KSxlLmVkZ2U9SnIobixwLG51bGwseCksVnIodCksVnIoZSl9fWZ1bmN0aW9uIEZyKG4sdCl7dmFyIGU9bi5zaXRlLHI9ZS54LHU9ZS55LGk9dS10O2lmKCFpKXJldHVybiByO3ZhciBvPW4uUDtpZighbylyZXR1cm4tMS8wO2U9by5zaXRlO3ZhciBhPWUueCxjPWUueSxsPWMtdDtpZighbClyZXR1cm4gYTt2YXIgcz1hLXIsZj0xL2ktMS9sLGg9cy9sO3JldHVybiBmPygtaCtNYXRoLnNxcnQoaCpoLTIqZioocypzLygtMipsKS1jK2wvMit1LWkvMikpKS9mK3I6KHIrYSkvMn1mdW5jdGlvbiBIcihuLHQpe3ZhciBlPW4uTjtpZihlKXJldHVybiBGcihlLHQpO3ZhciByPW4uc2l0ZTtyZXR1cm4gci55PT09dD9yLng6MS8wfWZ1bmN0aW9uIE9yKG4pe3RoaXMuc2l0ZT1uLHRoaXMuZWRnZXM9W119ZnVuY3Rpb24gSXIobil7Zm9yKHZhciB0LGUscix1LGksbyxhLGMsbCxzLGY9blswXVswXSxoPW5bMV1bMF0sZz1uWzBdWzFdLHA9blsxXVsxXSx2PUtjLGQ9di5sZW5ndGg7ZC0tOylpZihpPXZbZF0saSYmaS5wcmVwYXJlKCkpZm9yKGE9aS5lZGdlcyxjPWEubGVuZ3RoLG89MDtjPm87KXM9YVtvXS5lbmQoKSxyPXMueCx1PXMueSxsPWFbKytvJWNdLnN0YXJ0KCksdD1sLngsZT1sLnksKGdhKHItdCk+Q2F8fGdhKHUtZSk+Q2EpJiYoYS5zcGxpY2UobywwLG5ldyBRcihHcihpLnNpdGUscyxnYShyLWYpPENhJiZwLXU+Q2E/e3g6Zix5OmdhKHQtZik8Q2E/ZTpwfTpnYSh1LXApPENhJiZoLXI+Q2E/e3g6Z2EoZS1wKTxDYT90OmgseTpwfTpnYShyLWgpPENhJiZ1LWc+Q2E/e3g6aCx5OmdhKHQtaCk8Q2E/ZTpnfTpnYSh1LWcpPENhJiZyLWY+Q2E/e3g6Z2EoZS1nKTxDYT90OmYseTpnfTpudWxsKSxpLnNpdGUsbnVsbCkpLCsrYyl9ZnVuY3Rpb24gWXIobix0KXtyZXR1cm4gdC5hbmdsZS1uLmFuZ2xlfWZ1bmN0aW9uIFpyKCl7dHUodGhpcyksdGhpcy54PXRoaXMueT10aGlzLmFyYz10aGlzLnNpdGU9dGhpcy5jeT1udWxsfWZ1bmN0aW9uIFZyKG4pe3ZhciB0PW4uUCxlPW4uTjtpZih0JiZlKXt2YXIgcj10LnNpdGUsdT1uLnNpdGUsaT1lLnNpdGU7aWYociE9PWkpe3ZhciBvPXUueCxhPXUueSxjPXIueC1vLGw9ci55LWEscz1pLngtbyxmPWkueS1hLGg9MiooYypmLWwqcyk7aWYoIShoPj0temEpKXt2YXIgZz1jKmMrbCpsLHA9cypzK2YqZix2PShmKmctbCpwKS9oLGQ9KGMqcC1zKmcpL2gsZj1kK2EsbT1ybC5wb3AoKXx8bmV3IFpyO20uYXJjPW4sbS5zaXRlPXUsbS54PXYrbyxtLnk9ZitNYXRoLnNxcnQodip2K2QqZCksbS5jeT1mLG4uY2lyY2xlPW07Zm9yKHZhciB5PW51bGwsTT10bC5fO007KWlmKG0ueTxNLnl8fG0ueT09PU0ueSYmbS54PD1NLngpe2lmKCFNLkwpe3k9TS5QO2JyZWFrfU09TS5MfWVsc2V7aWYoIU0uUil7eT1NO2JyZWFrfU09TS5SfXRsLmluc2VydCh5LG0pLHl8fChubD1tKX19fX1mdW5jdGlvbiBYcihuKXt2YXIgdD1uLmNpcmNsZTt0JiYodC5QfHwobmw9dC5OKSx0bC5yZW1vdmUodCkscmwucHVzaCh0KSx0dSh0KSxuLmNpcmNsZT1udWxsKX1mdW5jdGlvbiAkcihuKXtmb3IodmFyIHQsZT1HYyxyPU9lKG5bMF1bMF0sblswXVsxXSxuWzFdWzBdLG5bMV1bMV0pLHU9ZS5sZW5ndGg7dS0tOyl0PWVbdV0sKCFCcih0LG4pfHwhcih0KXx8Z2EodC5hLngtdC5iLngpPENhJiZnYSh0LmEueS10LmIueSk8Q2EpJiYodC5hPXQuYj1udWxsLGUuc3BsaWNlKHUsMSkpfWZ1bmN0aW9uIEJyKG4sdCl7dmFyIGU9bi5iO2lmKGUpcmV0dXJuITA7dmFyIHIsdSxpPW4uYSxvPXRbMF1bMF0sYT10WzFdWzBdLGM9dFswXVsxXSxsPXRbMV1bMV0scz1uLmwsZj1uLnIsaD1zLngsZz1zLnkscD1mLngsdj1mLnksZD0oaCtwKS8yLG09KGcrdikvMjtpZih2PT09Zyl7aWYobz5kfHxkPj1hKXJldHVybjtpZihoPnApe2lmKGkpe2lmKGkueT49bClyZXR1cm59ZWxzZSBpPXt4OmQseTpjfTtlPXt4OmQseTpsfX1lbHNle2lmKGkpe2lmKGkueTxjKXJldHVybn1lbHNlIGk9e3g6ZCx5Omx9O2U9e3g6ZCx5OmN9fX1lbHNlIGlmKHI9KGgtcCkvKHYtZyksdT1tLXIqZCwtMT5yfHxyPjEpaWYoaD5wKXtpZihpKXtpZihpLnk+PWwpcmV0dXJufWVsc2UgaT17eDooYy11KS9yLHk6Y307ZT17eDoobC11KS9yLHk6bH19ZWxzZXtpZihpKXtpZihpLnk8YylyZXR1cm59ZWxzZSBpPXt4OihsLXUpL3IseTpsfTtlPXt4OihjLXUpL3IseTpjfX1lbHNlIGlmKHY+Zyl7aWYoaSl7aWYoaS54Pj1hKXJldHVybn1lbHNlIGk9e3g6byx5OnIqbyt1fTtlPXt4OmEseTpyKmErdX19ZWxzZXtpZihpKXtpZihpLng8bylyZXR1cm59ZWxzZSBpPXt4OmEseTpyKmErdX07ZT17eDpvLHk6cipvK3V9fXJldHVybiBuLmE9aSxuLmI9ZSwhMH1mdW5jdGlvbiBXcihuLHQpe3RoaXMubD1uLHRoaXMucj10LHRoaXMuYT10aGlzLmI9bnVsbH1mdW5jdGlvbiBKcihuLHQsZSxyKXt2YXIgdT1uZXcgV3Iobix0KTtyZXR1cm4gR2MucHVzaCh1KSxlJiZLcih1LG4sdCxlKSxyJiZLcih1LHQsbixyKSxLY1tuLmldLmVkZ2VzLnB1c2gobmV3IFFyKHUsbix0KSksS2NbdC5pXS5lZGdlcy5wdXNoKG5ldyBRcih1LHQsbikpLHV9ZnVuY3Rpb24gR3Iobix0LGUpe3ZhciByPW5ldyBXcihuLG51bGwpO3JldHVybiByLmE9dCxyLmI9ZSxHYy5wdXNoKHIpLHJ9ZnVuY3Rpb24gS3Iobix0LGUscil7bi5hfHxuLmI/bi5sPT09ZT9uLmI9cjpuLmE9cjoobi5hPXIsbi5sPXQsbi5yPWUpfWZ1bmN0aW9uIFFyKG4sdCxlKXt2YXIgcj1uLmEsdT1uLmI7dGhpcy5lZGdlPW4sdGhpcy5zaXRlPXQsdGhpcy5hbmdsZT1lP01hdGguYXRhbjIoZS55LXQueSxlLngtdC54KTpuLmw9PT10P01hdGguYXRhbjIodS54LXIueCxyLnktdS55KTpNYXRoLmF0YW4yKHIueC11LngsdS55LXIueSl9ZnVuY3Rpb24gbnUoKXt0aGlzLl89bnVsbH1mdW5jdGlvbiB0dShuKXtuLlU9bi5DPW4uTD1uLlI9bi5QPW4uTj1udWxsfWZ1bmN0aW9uIGV1KG4sdCl7dmFyIGU9dCxyPXQuUix1PWUuVTt1P3UuTD09PWU/dS5MPXI6dS5SPXI6bi5fPXIsci5VPXUsZS5VPXIsZS5SPXIuTCxlLlImJihlLlIuVT1lKSxyLkw9ZX1mdW5jdGlvbiBydShuLHQpe3ZhciBlPXQscj10LkwsdT1lLlU7dT91Lkw9PT1lP3UuTD1yOnUuUj1yOm4uXz1yLHIuVT11LGUuVT1yLGUuTD1yLlIsZS5MJiYoZS5MLlU9ZSksci5SPWV9ZnVuY3Rpb24gdXUobil7Zm9yKDtuLkw7KW49bi5MO3JldHVybiBufWZ1bmN0aW9uIGl1KG4sdCl7dmFyIGUscix1LGk9bi5zb3J0KG91KS5wb3AoKTtmb3IoR2M9W10sS2M9bmV3IEFycmF5KG4ubGVuZ3RoKSxRYz1uZXcgbnUsdGw9bmV3IG51OzspaWYodT1ubCxpJiYoIXV8fGkueTx1Lnl8fGkueT09PXUueSYmaS54PHUueCkpKGkueCE9PWV8fGkueSE9PXIpJiYoS2NbaS5pXT1uZXcgT3IoaSksanIoaSksZT1pLngscj1pLnkpLGk9bi5wb3AoKTtlbHNle2lmKCF1KWJyZWFrO1VyKHUuYXJjKX10JiYoJHIodCksSXIodCkpO3ZhciBvPXtjZWxsczpLYyxlZGdlczpHY307cmV0dXJuIFFjPXRsPUdjPUtjPW51bGwsb31mdW5jdGlvbiBvdShuLHQpe3JldHVybiB0Lnktbi55fHx0Lngtbi54fWZ1bmN0aW9uIGF1KG4sdCxlKXtyZXR1cm4obi54LWUueCkqKHQueS1uLnkpLShuLngtdC54KSooZS55LW4ueSl9ZnVuY3Rpb24gY3Uobil7cmV0dXJuIG4ueH1mdW5jdGlvbiBsdShuKXtyZXR1cm4gbi55fWZ1bmN0aW9uIHN1KCl7cmV0dXJue2xlYWY6ITAsbm9kZXM6W10scG9pbnQ6bnVsbCx4Om51bGwseTpudWxsfX1mdW5jdGlvbiBmdShuLHQsZSxyLHUsaSl7aWYoIW4odCxlLHIsdSxpKSl7dmFyIG89LjUqKGUrdSksYT0uNSoocitpKSxjPXQubm9kZXM7Y1swXSYmZnUobixjWzBdLGUscixvLGEpLGNbMV0mJmZ1KG4sY1sxXSxvLHIsdSxhKSxjWzJdJiZmdShuLGNbMl0sZSxhLG8saSksY1szXSYmZnUobixjWzNdLG8sYSx1LGkpfX1mdW5jdGlvbiBodShuLHQsZSxyLHUsaSxvKXt2YXIgYSxjPTEvMDtyZXR1cm4gZnVuY3Rpb24gbChuLHMsZixoLGcpe2lmKCEocz5pfHxmPm98fHI+aHx8dT5nKSl7aWYocD1uLnBvaW50KXt2YXIgcCx2PXQtbi54LGQ9ZS1uLnksbT12KnYrZCpkO2lmKGM+bSl7dmFyIHk9TWF0aC5zcXJ0KGM9bSk7cj10LXksdT1lLXksaT10K3ksbz1lK3ksYT1wfX1mb3IodmFyIE09bi5ub2Rlcyx4PS41KihzK2gpLGI9LjUqKGYrZyksXz10Pj14LHc9ZT49YixTPXc8PDF8XyxrPVMrNDtrPlM7KytTKWlmKG49TVszJlNdKXN3aXRjaCgzJlMpe2Nhc2UgMDpsKG4scyxmLHgsYik7YnJlYWs7Y2FzZSAxOmwobix4LGYsaCxiKTticmVhaztjYXNlIDI6bChuLHMsYix4LGcpO2JyZWFrO2Nhc2UgMzpsKG4seCxiLGgsZyl9fX0obixyLHUsaSxvKSxhfWZ1bmN0aW9uIGd1KG4sdCl7bj10YS5yZ2IobiksdD10YS5yZ2IodCk7dmFyIGU9bi5yLHI9bi5nLHU9bi5iLGk9dC5yLWUsbz10LmctcixhPXQuYi11O3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4iIyIreHQoTWF0aC5yb3VuZChlK2kqbikpK3h0KE1hdGgucm91bmQocitvKm4pKSt4dChNYXRoLnJvdW5kKHUrYSpuKSl9fWZ1bmN0aW9uIHB1KG4sdCl7dmFyIGUscj17fSx1PXt9O2ZvcihlIGluIG4pZSBpbiB0P3JbZV09bXUobltlXSx0W2VdKTp1W2VdPW5bZV07Zm9yKGUgaW4gdCllIGluIG58fCh1W2VdPXRbZV0pO3JldHVybiBmdW5jdGlvbihuKXtmb3IoZSBpbiByKXVbZV09cltlXShuKTtyZXR1cm4gdX19ZnVuY3Rpb24gdnUobix0KXtyZXR1cm4gbj0rbix0PSt0LGZ1bmN0aW9uKGUpe3JldHVybiBuKigxLWUpK3QqZX19ZnVuY3Rpb24gZHUobix0KXt2YXIgZSxyLHUsaT1pbC5sYXN0SW5kZXg9b2wubGFzdEluZGV4PTAsbz0tMSxhPVtdLGM9W107Zm9yKG4rPSIiLHQrPSIiOyhlPWlsLmV4ZWMobikpJiYocj1vbC5leGVjKHQpKTspKHU9ci5pbmRleCk+aSYmKHU9dC5zbGljZShpLHUpLGFbb10/YVtvXSs9dTphWysrb109dSksKGU9ZVswXSk9PT0ocj1yWzBdKT9hW29dP2Fbb10rPXI6YVsrK29dPXI6KGFbKytvXT1udWxsLGMucHVzaCh7aTpvLHg6dnUoZSxyKX0pKSxpPW9sLmxhc3RJbmRleDtyZXR1cm4gaTx0Lmxlbmd0aCYmKHU9dC5zbGljZShpKSxhW29dP2Fbb10rPXU6YVsrK29dPXUpLGEubGVuZ3RoPDI/Y1swXT8odD1jWzBdLngsZnVuY3Rpb24obil7cmV0dXJuIHQobikrIiJ9KTpmdW5jdGlvbigpe3JldHVybiB0fToodD1jLmxlbmd0aCxmdW5jdGlvbihuKXtmb3IodmFyIGUscj0wO3Q+cjsrK3IpYVsoZT1jW3JdKS5pXT1lLngobik7cmV0dXJuIGEuam9pbigiIil9KX1mdW5jdGlvbiBtdShuLHQpe2Zvcih2YXIgZSxyPXRhLmludGVycG9sYXRvcnMubGVuZ3RoOy0tcj49MCYmIShlPXRhLmludGVycG9sYXRvcnNbcl0obix0KSk7KTtyZXR1cm4gZX1mdW5jdGlvbiB5dShuLHQpe3ZhciBlLHI9W10sdT1bXSxpPW4ubGVuZ3RoLG89dC5sZW5ndGgsYT1NYXRoLm1pbihuLmxlbmd0aCx0Lmxlbmd0aCk7Zm9yKGU9MDthPmU7KytlKXIucHVzaChtdShuW2VdLHRbZV0pKTtmb3IoO2k+ZTsrK2UpdVtlXT1uW2VdO2Zvcig7bz5lOysrZSl1W2VdPXRbZV07cmV0dXJuIGZ1bmN0aW9uKG4pe2ZvcihlPTA7YT5lOysrZSl1W2VdPXJbZV0obik7cmV0dXJuIHV9fWZ1bmN0aW9uIE11KG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gMD49dD8wOnQ+PTE/MTpuKHQpfX1mdW5jdGlvbiB4dShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIDEtbigxLXQpfX1mdW5jdGlvbiBidShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuLjUqKC41PnQ/bigyKnQpOjItbigyLTIqdCkpfX1mdW5jdGlvbiBfdShuKXtyZXR1cm4gbipufWZ1bmN0aW9uIHd1KG4pe3JldHVybiBuKm4qbn1mdW5jdGlvbiBTdShuKXtpZigwPj1uKXJldHVybiAwO2lmKG4+PTEpcmV0dXJuIDE7dmFyIHQ9bipuLGU9dCpuO3JldHVybiA0KiguNT5uP2U6Myoobi10KStlLS43NSl9ZnVuY3Rpb24ga3Uobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnBvdyh0LG4pfX1mdW5jdGlvbiBFdShuKXtyZXR1cm4gMS1NYXRoLmNvcyhuKlJhKX1mdW5jdGlvbiBBdShuKXtyZXR1cm4gTWF0aC5wb3coMiwxMCoobi0xKSl9ZnVuY3Rpb24gTnUobil7cmV0dXJuIDEtTWF0aC5zcXJ0KDEtbipuKX1mdW5jdGlvbiBDdShuLHQpe3ZhciBlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDImJih0PS40NSksYXJndW1lbnRzLmxlbmd0aD9lPXQvTGEqTWF0aC5hc2luKDEvbik6KG49MSxlPXQvNCksZnVuY3Rpb24ocil7cmV0dXJuIDErbipNYXRoLnBvdygyLC0xMCpyKSpNYXRoLnNpbigoci1lKSpMYS90KX19ZnVuY3Rpb24genUobil7cmV0dXJuIG58fChuPTEuNzAxNTgpLGZ1bmN0aW9uKHQpe3JldHVybiB0KnQqKChuKzEpKnQtbil9fWZ1bmN0aW9uIHF1KG4pe3JldHVybiAxLzIuNzU+bj83LjU2MjUqbipuOjIvMi43NT5uPzcuNTYyNSoobi09MS41LzIuNzUpKm4rLjc1OjIuNS8yLjc1Pm4/Ny41NjI1KihuLT0yLjI1LzIuNzUpKm4rLjkzNzU6Ny41NjI1KihuLT0yLjYyNS8yLjc1KSpuKy45ODQzNzV9ZnVuY3Rpb24gTHUobix0KXtuPXRhLmhjbChuKSx0PXRhLmhjbCh0KTt2YXIgZT1uLmgscj1uLmMsdT1uLmwsaT10LmgtZSxvPXQuYy1yLGE9dC5sLXU7cmV0dXJuIGlzTmFOKG8pJiYobz0wLHI9aXNOYU4ocik/dC5jOnIpLGlzTmFOKGkpPyhpPTAsZT1pc05hTihlKT90Lmg6ZSk6aT4xODA/aS09MzYwOi0xODA+aSYmKGkrPTM2MCksZnVuY3Rpb24obil7cmV0dXJuIHN0KGUraSpuLHIrbypuLHUrYSpuKSsiIn19ZnVuY3Rpb24gVHUobix0KXtuPXRhLmhzbChuKSx0PXRhLmhzbCh0KTt2YXIgZT1uLmgscj1uLnMsdT1uLmwsaT10LmgtZSxvPXQucy1yLGE9dC5sLXU7cmV0dXJuIGlzTmFOKG8pJiYobz0wLHI9aXNOYU4ocik/dC5zOnIpLGlzTmFOKGkpPyhpPTAsZT1pc05hTihlKT90Lmg6ZSk6aT4xODA/aS09MzYwOi0xODA+aSYmKGkrPTM2MCksZnVuY3Rpb24obil7cmV0dXJuIGN0KGUraSpuLHIrbypuLHUrYSpuKSsiIn19ZnVuY3Rpb24gUnUobix0KXtuPXRhLmxhYihuKSx0PXRhLmxhYih0KTt2YXIgZT1uLmwscj1uLmEsdT1uLmIsaT10LmwtZSxvPXQuYS1yLGE9dC5iLXU7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBodChlK2kqbixyK28qbix1K2EqbikrIiJ9fWZ1bmN0aW9uIER1KG4sdCl7cmV0dXJuIHQtPW4sZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucm91bmQobit0KmUpfX1mdW5jdGlvbiBQdShuKXt2YXIgdD1bbi5hLG4uYl0sZT1bbi5jLG4uZF0scj1qdSh0KSx1PVV1KHQsZSksaT1qdShGdShlLHQsLXUpKXx8MDt0WzBdKmVbMV08ZVswXSp0WzFdJiYodFswXSo9LTEsdFsxXSo9LTEscio9LTEsdSo9LTEpLHRoaXMucm90YXRlPShyP01hdGguYXRhbjIodFsxXSx0WzBdKTpNYXRoLmF0YW4yKC1lWzBdLGVbMV0pKSpQYSx0aGlzLnRyYW5zbGF0ZT1bbi5lLG4uZl0sdGhpcy5zY2FsZT1bcixpXSx0aGlzLnNrZXc9aT9NYXRoLmF0YW4yKHUsaSkqUGE6MH1mdW5jdGlvbiBVdShuLHQpe3JldHVybiBuWzBdKnRbMF0rblsxXSp0WzFdfWZ1bmN0aW9uIGp1KG4pe3ZhciB0PU1hdGguc3FydChVdShuLG4pKTtyZXR1cm4gdCYmKG5bMF0vPXQsblsxXS89dCksdH1mdW5jdGlvbiBGdShuLHQsZSl7cmV0dXJuIG5bMF0rPWUqdFswXSxuWzFdKz1lKnRbMV0sbn1mdW5jdGlvbiBIdShuLHQpe3ZhciBlLHI9W10sdT1bXSxpPXRhLnRyYW5zZm9ybShuKSxvPXRhLnRyYW5zZm9ybSh0KSxhPWkudHJhbnNsYXRlLGM9by50cmFuc2xhdGUsbD1pLnJvdGF0ZSxzPW8ucm90YXRlLGY9aS5za2V3LGg9by5za2V3LGc9aS5zY2FsZSxwPW8uc2NhbGU7cmV0dXJuIGFbMF0hPWNbMF18fGFbMV0hPWNbMV0/KHIucHVzaCgidHJhbnNsYXRlKCIsbnVsbCwiLCIsbnVsbCwiKSIpLHUucHVzaCh7aToxLHg6dnUoYVswXSxjWzBdKX0se2k6Myx4OnZ1KGFbMV0sY1sxXSl9KSk6ci5wdXNoKGNbMF18fGNbMV0/InRyYW5zbGF0ZSgiK2MrIikiOiIiKSxsIT1zPyhsLXM+MTgwP3MrPTM2MDpzLWw+MTgwJiYobCs9MzYwKSx1LnB1c2goe2k6ci5wdXNoKHIucG9wKCkrInJvdGF0ZSgiLG51bGwsIikiKS0yLHg6dnUobCxzKX0pKTpzJiZyLnB1c2goci5wb3AoKSsicm90YXRlKCIrcysiKSIpLGYhPWg/dS5wdXNoKHtpOnIucHVzaChyLnBvcCgpKyJza2V3WCgiLG51bGwsIikiKS0yLHg6dnUoZixoKX0pOmgmJnIucHVzaChyLnBvcCgpKyJza2V3WCgiK2grIikiKSxnWzBdIT1wWzBdfHxnWzFdIT1wWzFdPyhlPXIucHVzaChyLnBvcCgpKyJzY2FsZSgiLG51bGwsIiwiLG51bGwsIikiKSx1LnB1c2goe2k6ZS00LHg6dnUoZ1swXSxwWzBdKX0se2k6ZS0yLHg6dnUoZ1sxXSxwWzFdKX0pKTooMSE9cFswXXx8MSE9cFsxXSkmJnIucHVzaChyLnBvcCgpKyJzY2FsZSgiK3ArIikiKSxlPXUubGVuZ3RoLGZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxpPS0xOysraTxlOylyWyh0PXVbaV0pLmldPXQueChuKTtyZXR1cm4gci5qb2luKCIiKX19ZnVuY3Rpb24gT3Uobix0KXtyZXR1cm4gdD0odC09bj0rbil8fDEvdCxmdW5jdGlvbihlKXtyZXR1cm4oZS1uKS90fX1mdW5jdGlvbiBJdShuLHQpe3JldHVybiB0PSh0LT1uPStuKXx8MS90LGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKDEsKGUtbikvdCkpfX1mdW5jdGlvbiBZdShuKXtmb3IodmFyIHQ9bi5zb3VyY2UsZT1uLnRhcmdldCxyPVZ1KHQsZSksdT1bdF07dCE9PXI7KXQ9dC5wYXJlbnQsdS5wdXNoKHQpO2Zvcih2YXIgaT11Lmxlbmd0aDtlIT09cjspdS5zcGxpY2UoaSwwLGUpLGU9ZS5wYXJlbnQ7cmV0dXJuIHV9ZnVuY3Rpb24gWnUobil7Zm9yKHZhciB0PVtdLGU9bi5wYXJlbnQ7bnVsbCE9ZTspdC5wdXNoKG4pLG49ZSxlPWUucGFyZW50O3JldHVybiB0LnB1c2gobiksdH1mdW5jdGlvbiBWdShuLHQpe2lmKG49PT10KXJldHVybiBuO2Zvcih2YXIgZT1adShuKSxyPVp1KHQpLHU9ZS5wb3AoKSxpPXIucG9wKCksbz1udWxsO3U9PT1pOylvPXUsdT1lLnBvcCgpLGk9ci5wb3AoKTtyZXR1cm4gb31mdW5jdGlvbiBYdShuKXtuLmZpeGVkfD0yfWZ1bmN0aW9uICR1KG4pe24uZml4ZWQmPS03fWZ1bmN0aW9uIEJ1KG4pe24uZml4ZWR8PTQsbi5weD1uLngsbi5weT1uLnl9ZnVuY3Rpb24gV3Uobil7bi5maXhlZCY9LTV9ZnVuY3Rpb24gSnUobix0LGUpe3ZhciByPTAsdT0wO2lmKG4uY2hhcmdlPTAsIW4ubGVhZilmb3IodmFyIGksbz1uLm5vZGVzLGE9by5sZW5ndGgsYz0tMTsrK2M8YTspaT1vW2NdLG51bGwhPWkmJihKdShpLHQsZSksbi5jaGFyZ2UrPWkuY2hhcmdlLHIrPWkuY2hhcmdlKmkuY3gsdSs9aS5jaGFyZ2UqaS5jeSk7aWYobi5wb2ludCl7bi5sZWFmfHwobi5wb2ludC54Kz1NYXRoLnJhbmRvbSgpLS41LG4ucG9pbnQueSs9TWF0aC5yYW5kb20oKS0uNSk7dmFyIGw9dCplW24ucG9pbnQuaW5kZXhdO24uY2hhcmdlKz1uLnBvaW50Q2hhcmdlPWwscis9bCpuLnBvaW50LngsdSs9bCpuLnBvaW50Lnl9bi5jeD1yL24uY2hhcmdlLG4uY3k9dS9uLmNoYXJnZX1mdW5jdGlvbiBHdShuLHQpe3JldHVybiB0YS5yZWJpbmQobix0LCJzb3J0IiwiY2hpbGRyZW4iLCJ2YWx1ZSIpLG4ubm9kZXM9bixuLmxpbmtzPXJpLG59ZnVuY3Rpb24gS3Uobix0KXtmb3IodmFyIGU9W25dO251bGwhPShuPWUucG9wKCkpOylpZih0KG4pLCh1PW4uY2hpbGRyZW4pJiYocj11Lmxlbmd0aCkpZm9yKHZhciByLHU7LS1yPj0wOyllLnB1c2godVtyXSl9ZnVuY3Rpb24gUXUobix0KXtmb3IodmFyIGU9W25dLHI9W107bnVsbCE9KG49ZS5wb3AoKSk7KWlmKHIucHVzaChuKSwoaT1uLmNoaWxkcmVuKSYmKHU9aS5sZW5ndGgpKWZvcih2YXIgdSxpLG89LTE7KytvPHU7KWUucHVzaChpW29dKTtmb3IoO251bGwhPShuPXIucG9wKCkpOyl0KG4pfWZ1bmN0aW9uIG5pKG4pe3JldHVybiBuLmNoaWxkcmVufWZ1bmN0aW9uIHRpKG4pe3JldHVybiBuLnZhbHVlfWZ1bmN0aW9uIGVpKG4sdCl7cmV0dXJuIHQudmFsdWUtbi52YWx1ZX1mdW5jdGlvbiByaShuKXtyZXR1cm4gdGEubWVyZ2Uobi5tYXAoZnVuY3Rpb24obil7cmV0dXJuKG4uY2hpbGRyZW58fFtdKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJue3NvdXJjZTpuLHRhcmdldDp0fX0pfSkpfWZ1bmN0aW9uIHVpKG4pe3JldHVybiBuLnh9ZnVuY3Rpb24gaWkobil7cmV0dXJuIG4ueX1mdW5jdGlvbiBvaShuLHQsZSl7bi55MD10LG4ueT1lfWZ1bmN0aW9uIGFpKG4pe3JldHVybiB0YS5yYW5nZShuLmxlbmd0aCl9ZnVuY3Rpb24gY2kobil7Zm9yKHZhciB0PS0xLGU9blswXS5sZW5ndGgscj1bXTsrK3Q8ZTspclt0XT0wO3JldHVybiByfWZ1bmN0aW9uIGxpKG4pe2Zvcih2YXIgdCxlPTEscj0wLHU9blswXVsxXSxpPW4ubGVuZ3RoO2k+ZTsrK2UpKHQ9bltlXVsxXSk+dSYmKHI9ZSx1PXQpO3JldHVybiByfWZ1bmN0aW9uIHNpKG4pe3JldHVybiBuLnJlZHVjZShmaSwwKX1mdW5jdGlvbiBmaShuLHQpe3JldHVybiBuK3RbMV19ZnVuY3Rpb24gaGkobix0KXtyZXR1cm4gZ2kobixNYXRoLmNlaWwoTWF0aC5sb2codC5sZW5ndGgpL01hdGguTE4yKzEpKX1mdW5jdGlvbiBnaShuLHQpe2Zvcih2YXIgZT0tMSxyPStuWzBdLHU9KG5bMV0tcikvdCxpPVtdOysrZTw9dDspaVtlXT11KmUrcjtyZXR1cm4gaX1mdW5jdGlvbiBwaShuKXtyZXR1cm5bdGEubWluKG4pLHRhLm1heChuKV19ZnVuY3Rpb24gdmkobix0KXtyZXR1cm4gbi52YWx1ZS10LnZhbHVlfWZ1bmN0aW9uIGRpKG4sdCl7dmFyIGU9bi5fcGFja19uZXh0O24uX3BhY2tfbmV4dD10LHQuX3BhY2tfcHJldj1uLHQuX3BhY2tfbmV4dD1lLGUuX3BhY2tfcHJldj10fWZ1bmN0aW9uIG1pKG4sdCl7bi5fcGFja19uZXh0PXQsdC5fcGFja19wcmV2PW59ZnVuY3Rpb24geWkobix0KXt2YXIgZT10Lngtbi54LHI9dC55LW4ueSx1PW4ucit0LnI7cmV0dXJuLjk5OSp1KnU+ZSplK3Iqcn1mdW5jdGlvbiBNaShuKXtmdW5jdGlvbiB0KG4pe3M9TWF0aC5taW4obi54LW4ucixzKSxmPU1hdGgubWF4KG4ueCtuLnIsZiksaD1NYXRoLm1pbihuLnktbi5yLGgpLGc9TWF0aC5tYXgobi55K24ucixnKX1pZigoZT1uLmNoaWxkcmVuKSYmKGw9ZS5sZW5ndGgpKXt2YXIgZSxyLHUsaSxvLGEsYyxsLHM9MS8wLGY9LTEvMCxoPTEvMCxnPS0xLzA7aWYoZS5mb3JFYWNoKHhpKSxyPWVbMF0sci54PS1yLnIsci55PTAsdChyKSxsPjEmJih1PWVbMV0sdS54PXUucix1Lnk9MCx0KHUpLGw+MikpZm9yKGk9ZVsyXSx3aShyLHUsaSksdChpKSxkaShyLGkpLHIuX3BhY2tfcHJldj1pLGRpKGksdSksdT1yLl9wYWNrX25leHQsbz0zO2w+bztvKyspe3dpKHIsdSxpPWVbb10pO3ZhciBwPTAsdj0xLGQ9MTtmb3IoYT11Ll9wYWNrX25leHQ7YSE9PXU7YT1hLl9wYWNrX25leHQsdisrKWlmKHlpKGEsaSkpe3A9MTticmVha31pZigxPT1wKWZvcihjPXIuX3BhY2tfcHJldjtjIT09YS5fcGFja19wcmV2JiYheWkoYyxpKTtjPWMuX3BhY2tfcHJldixkKyspO3A/KGQ+dnx8dj09ZCYmdS5yPHIucj9taShyLHU9YSk6bWkocj1jLHUpLG8tLSk6KGRpKHIsaSksdT1pLHQoaSkpfXZhciBtPShzK2YpLzIseT0oaCtnKS8yLE09MDtmb3Iobz0wO2w+bztvKyspaT1lW29dLGkueC09bSxpLnktPXksTT1NYXRoLm1heChNLGkucitNYXRoLnNxcnQoaS54KmkueCtpLnkqaS55KSk7bi5yPU0sZS5mb3JFYWNoKGJpKX19ZnVuY3Rpb24geGkobil7bi5fcGFja19uZXh0PW4uX3BhY2tfcHJldj1ufWZ1bmN0aW9uIGJpKG4pe2RlbGV0ZSBuLl9wYWNrX25leHQsZGVsZXRlIG4uX3BhY2tfcHJldn1mdW5jdGlvbiBfaShuLHQsZSxyKXt2YXIgdT1uLmNoaWxkcmVuO2lmKG4ueD10Kz1yKm4ueCxuLnk9ZSs9cipuLnksbi5yKj1yLHUpZm9yKHZhciBpPS0xLG89dS5sZW5ndGg7KytpPG87KV9pKHVbaV0sdCxlLHIpfWZ1bmN0aW9uIHdpKG4sdCxlKXt2YXIgcj1uLnIrZS5yLHU9dC54LW4ueCxpPXQueS1uLnk7aWYociYmKHV8fGkpKXt2YXIgbz10LnIrZS5yLGE9dSp1K2kqaTtvKj1vLHIqPXI7dmFyIGM9LjUrKHItbykvKDIqYSksbD1NYXRoLnNxcnQoTWF0aC5tYXgoMCwyKm8qKHIrYSktKHItPWEpKnItbypvKSkvKDIqYSk7ZS54PW4ueCtjKnUrbCppLGUueT1uLnkrYyppLWwqdX1lbHNlIGUueD1uLngrcixlLnk9bi55fWZ1bmN0aW9uIFNpKG4sdCl7cmV0dXJuIG4ucGFyZW50PT10LnBhcmVudD8xOjJ9ZnVuY3Rpb24ga2kobil7dmFyIHQ9bi5jaGlsZHJlbjtyZXR1cm4gdC5sZW5ndGg/dFswXTpuLnR9ZnVuY3Rpb24gRWkobil7dmFyIHQsZT1uLmNoaWxkcmVuO3JldHVybih0PWUubGVuZ3RoKT9lW3QtMV06bi50fWZ1bmN0aW9uIEFpKG4sdCxlKXt2YXIgcj1lLyh0Lmktbi5pKTt0LmMtPXIsdC5zKz1lLG4uYys9cix0LnorPWUsdC5tKz1lfWZ1bmN0aW9uIE5pKG4pe2Zvcih2YXIgdCxlPTAscj0wLHU9bi5jaGlsZHJlbixpPXUubGVuZ3RoOy0taT49MDspdD11W2ldLHQueis9ZSx0Lm0rPWUsZSs9dC5zKyhyKz10LmMpfWZ1bmN0aW9uIENpKG4sdCxlKXtyZXR1cm4gbi5hLnBhcmVudD09PXQucGFyZW50P24uYTplfWZ1bmN0aW9uIHppKG4pe3JldHVybiAxK3RhLm1heChuLGZ1bmN0aW9uKG4pe3JldHVybiBuLnl9KX1mdW5jdGlvbiBxaShuKXtyZXR1cm4gbi5yZWR1Y2UoZnVuY3Rpb24obix0KXtyZXR1cm4gbit0Lnh9LDApL24ubGVuZ3RofWZ1bmN0aW9uIExpKG4pe3ZhciB0PW4uY2hpbGRyZW47cmV0dXJuIHQmJnQubGVuZ3RoP0xpKHRbMF0pOm59ZnVuY3Rpb24gVGkobil7dmFyIHQsZT1uLmNoaWxkcmVuO3JldHVybiBlJiYodD1lLmxlbmd0aCk/VGkoZVt0LTFdKTpufWZ1bmN0aW9uIFJpKG4pe3JldHVybnt4Om4ueCx5Om4ueSxkeDpuLmR4LGR5Om4uZHl9fWZ1bmN0aW9uIERpKG4sdCl7dmFyIGU9bi54K3RbM10scj1uLnkrdFswXSx1PW4uZHgtdFsxXS10WzNdLGk9bi5keS10WzBdLXRbMl07cmV0dXJuIDA+dSYmKGUrPXUvMix1PTApLDA+aSYmKHIrPWkvMixpPTApLHt4OmUseTpyLGR4OnUsZHk6aX19ZnVuY3Rpb24gUGkobil7dmFyIHQ9blswXSxlPW5bbi5sZW5ndGgtMV07cmV0dXJuIGU+dD9bdCxlXTpbZSx0XX1mdW5jdGlvbiBVaShuKXtyZXR1cm4gbi5yYW5nZUV4dGVudD9uLnJhbmdlRXh0ZW50KCk6UGkobi5yYW5nZSgpKX1mdW5jdGlvbiBqaShuLHQsZSxyKXt2YXIgdT1lKG5bMF0sblsxXSksaT1yKHRbMF0sdFsxXSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBpKHUobikpfX1mdW5jdGlvbiBGaShuLHQpe3ZhciBlLHI9MCx1PW4ubGVuZ3RoLTEsaT1uW3JdLG89blt1XTtyZXR1cm4gaT5vJiYoZT1yLHI9dSx1PWUsZT1pLGk9byxvPWUpLG5bcl09dC5mbG9vcihpKSxuW3VdPXQuY2VpbChvKSxufWZ1bmN0aW9uIEhpKG4pe3JldHVybiBuP3tmbG9vcjpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5mbG9vcih0L24pKm59LGNlaWw6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguY2VpbCh0L24pKm59fTptbH1mdW5jdGlvbiBPaShuLHQsZSxyKXt2YXIgdT1bXSxpPVtdLG89MCxhPU1hdGgubWluKG4ubGVuZ3RoLHQubGVuZ3RoKS0xO2ZvcihuW2FdPG5bMF0mJihuPW4uc2xpY2UoKS5yZXZlcnNlKCksdD10LnNsaWNlKCkucmV2ZXJzZSgpKTsrK288PWE7KXUucHVzaChlKG5bby0xXSxuW29dKSksaS5wdXNoKHIodFtvLTFdLHRbb10pKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9dGEuYmlzZWN0KG4sdCwxLGEpLTE7cmV0dXJuIGlbZV0odVtlXSh0KSl9fWZ1bmN0aW9uIElpKG4sdCxlLHIpe2Z1bmN0aW9uIHUoKXt2YXIgdT1NYXRoLm1pbihuLmxlbmd0aCx0Lmxlbmd0aCk+Mj9PaTpqaSxjPXI/SXU6T3U7cmV0dXJuIG89dShuLHQsYyxlKSxhPXUodCxuLGMsbXUpLGl9ZnVuY3Rpb24gaShuKXtyZXR1cm4gbyhuKX12YXIgbyxhO3JldHVybiBpLmludmVydD1mdW5jdGlvbihuKXtyZXR1cm4gYShuKX0saS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dC5tYXAoTnVtYmVyKSx1KCkpOm59LGkucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bix1KCkpOnR9LGkucmFuZ2VSb3VuZD1mdW5jdGlvbihuKXtyZXR1cm4gaS5yYW5nZShuKS5pbnRlcnBvbGF0ZShEdSl9LGkuY2xhbXA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bix1KCkpOnJ9LGkuaW50ZXJwb2xhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix1KCkpOmV9LGkudGlja3M9ZnVuY3Rpb24odCl7cmV0dXJuIFhpKG4sdCl9LGkudGlja0Zvcm1hdD1mdW5jdGlvbih0LGUpe3JldHVybiAkaShuLHQsZSl9LGkubmljZT1mdW5jdGlvbih0KXtyZXR1cm4gWmkobix0KSx1KCl9LGkuY29weT1mdW5jdGlvbigpe3JldHVybiBJaShuLHQsZSxyKX0sdSgpfWZ1bmN0aW9uIFlpKG4sdCl7cmV0dXJuIHRhLnJlYmluZChuLHQsInJhbmdlIiwicmFuZ2VSb3VuZCIsImludGVycG9sYXRlIiwiY2xhbXAiKX1mdW5jdGlvbiBaaShuLHQpe3JldHVybiBGaShuLEhpKFZpKG4sdClbMl0pKX1mdW5jdGlvbiBWaShuLHQpe251bGw9PXQmJih0PTEwKTt2YXIgZT1QaShuKSxyPWVbMV0tZVswXSx1PU1hdGgucG93KDEwLE1hdGguZmxvb3IoTWF0aC5sb2coci90KS9NYXRoLkxOMTApKSxpPXQvcip1O3JldHVybi4xNT49aT91Kj0xMDouMzU+PWk/dSo9NTouNzU+PWkmJih1Kj0yKSxlWzBdPU1hdGguY2VpbChlWzBdL3UpKnUsZVsxXT1NYXRoLmZsb29yKGVbMV0vdSkqdSsuNSp1LGVbMl09dSxlfWZ1bmN0aW9uIFhpKG4sdCl7cmV0dXJuIHRhLnJhbmdlLmFwcGx5KHRhLFZpKG4sdCkpfWZ1bmN0aW9uICRpKG4sdCxlKXt2YXIgcj1WaShuLHQpO2lmKGUpe3ZhciB1PWljLmV4ZWMoZSk7aWYodS5zaGlmdCgpLCJzIj09PXVbOF0pe3ZhciBpPXRhLmZvcm1hdFByZWZpeChNYXRoLm1heChnYShyWzBdKSxnYShyWzFdKSkpO3JldHVybiB1WzddfHwodVs3XT0iLiIrQmkoaS5zY2FsZShyWzJdKSkpLHVbOF09ImYiLGU9dGEuZm9ybWF0KHUuam9pbigiIikpLGZ1bmN0aW9uKG4pe3JldHVybiBlKGkuc2NhbGUobikpK2kuc3ltYm9sfX11WzddfHwodVs3XT0iLiIrV2kodVs4XSxyKSksZT11LmpvaW4oIiIpfWVsc2UgZT0iLC4iK0JpKHJbMl0pKyJmIjtyZXR1cm4gdGEuZm9ybWF0KGUpfWZ1bmN0aW9uIEJpKG4pe3JldHVybi1NYXRoLmZsb29yKE1hdGgubG9nKG4pL01hdGguTE4xMCsuMDEpfWZ1bmN0aW9uIFdpKG4sdCl7dmFyIGU9QmkodFsyXSk7cmV0dXJuIG4gaW4geWw/TWF0aC5hYnMoZS1CaShNYXRoLm1heChnYSh0WzBdKSxnYSh0WzFdKSkpKSsgKygiZSIhPT1uKTplLTIqKCIlIj09PW4pfWZ1bmN0aW9uIEppKG4sdCxlLHIpe2Z1bmN0aW9uIHUobil7cmV0dXJuKGU/TWF0aC5sb2coMD5uPzA6bik6LU1hdGgubG9nKG4+MD8wOi1uKSkvTWF0aC5sb2codCl9ZnVuY3Rpb24gaShuKXtyZXR1cm4gZT9NYXRoLnBvdyh0LG4pOi1NYXRoLnBvdyh0LC1uKX1mdW5jdGlvbiBvKHQpe3JldHVybiBuKHUodCkpfXJldHVybiBvLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gaShuLmludmVydCh0KSl9LG8uZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXRbMF0+PTAsbi5kb21haW4oKHI9dC5tYXAoTnVtYmVyKSkubWFwKHUpKSxvKTpyfSxvLmJhc2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9K2Usbi5kb21haW4oci5tYXAodSkpLG8pOnR9LG8ubmljZT1mdW5jdGlvbigpe3ZhciB0PUZpKHIubWFwKHUpLGU/TWF0aDp4bCk7cmV0dXJuIG4uZG9tYWluKHQpLHI9dC5tYXAoaSksb30sby50aWNrcz1mdW5jdGlvbigpe3ZhciBuPVBpKHIpLG89W10sYT1uWzBdLGM9blsxXSxsPU1hdGguZmxvb3IodShhKSkscz1NYXRoLmNlaWwodShjKSksZj10JTE/Mjp0O2lmKGlzRmluaXRlKHMtbCkpe2lmKGUpe2Zvcig7cz5sO2wrKylmb3IodmFyIGg9MTtmPmg7aCsrKW8ucHVzaChpKGwpKmgpO28ucHVzaChpKGwpKX1lbHNlIGZvcihvLnB1c2goaShsKSk7bCsrPHM7KWZvcih2YXIgaD1mLTE7aD4wO2gtLSlvLnB1c2goaShsKSpoKTtmb3IobD0wO29bbF08YTtsKyspO2ZvcihzPW8ubGVuZ3RoO29bcy0xXT5jO3MtLSk7bz1vLnNsaWNlKGwscyl9cmV0dXJuIG99LG8udGlja0Zvcm1hdD1mdW5jdGlvbihuLHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBNbDthcmd1bWVudHMubGVuZ3RoPDI/dD1NbDoiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9dGEuZm9ybWF0KHQpKTt2YXIgcixhPU1hdGgubWF4KC4xLG4vby50aWNrcygpLmxlbmd0aCksYz1lPyhyPTFlLTEyLE1hdGguY2VpbCk6KHI9LTFlLTEyLE1hdGguZmxvb3IpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbi9pKGModShuKStyKSk8PWE/dChuKToiIn19LG8uY29weT1mdW5jdGlvbigpe3JldHVybiBKaShuLmNvcHkoKSx0LGUscil9LFlpKG8sbil9ZnVuY3Rpb24gR2kobix0LGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIG4odSh0KSl9dmFyIHU9S2kodCksaT1LaSgxL3QpO3JldHVybiByLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gaShuLmludmVydCh0KSl9LHIuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuLmRvbWFpbigoZT10Lm1hcChOdW1iZXIpKS5tYXAodSkpLHIpOmV9LHIudGlja3M9ZnVuY3Rpb24obil7cmV0dXJuIFhpKGUsbil9LHIudGlja0Zvcm1hdD1mdW5jdGlvbihuLHQpe3JldHVybiAkaShlLG4sdCl9LHIubmljZT1mdW5jdGlvbihuKXtyZXR1cm4gci5kb21haW4oWmkoZSxuKSl9LHIuZXhwb25lbnQ9ZnVuY3Rpb24obyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9S2kodD1vKSxpPUtpKDEvdCksbi5kb21haW4oZS5tYXAodSkpLHIpOnR9LHIuY29weT1mdW5jdGlvbigpe3JldHVybiBHaShuLmNvcHkoKSx0LGUpfSxZaShyLG4pfWZ1bmN0aW9uIEtpKG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gMD50Py1NYXRoLnBvdygtdCxuKTpNYXRoLnBvdyh0LG4pfX1mdW5jdGlvbiBRaShuLHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIGlbKCh1LmdldChlKXx8KCJyYW5nZSI9PT10LnQ/dS5zZXQoZSxuLnB1c2goZSkpOjAvMCkpLTEpJWkubGVuZ3RoXX1mdW5jdGlvbiByKHQsZSl7cmV0dXJuIHRhLnJhbmdlKG4ubGVuZ3RoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIHQrZSpufSl9dmFyIHUsaSxvO3JldHVybiBlLmRvbWFpbj1mdW5jdGlvbihyKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbjtuPVtdLHU9bmV3IGw7Zm9yKHZhciBpLG89LTEsYT1yLmxlbmd0aDsrK288YTspdS5oYXMoaT1yW29dKXx8dS5zZXQoaSxuLnB1c2goaSkpO3JldHVybiBlW3QudF0uYXBwbHkoZSx0LmEpfSxlLnJhbmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW4sbz0wLHQ9e3Q6InJhbmdlIixhOmFyZ3VtZW50c30sZSk6aX0sZS5yYW5nZVBvaW50cz1mdW5jdGlvbih1LGEpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKGE9MCk7dmFyIGM9dVswXSxsPXVbMV0scz1uLmxlbmd0aDwyPyhjPShjK2wpLzIsMCk6KGwtYykvKG4ubGVuZ3RoLTErYSk7cmV0dXJuIGk9cihjK3MqYS8yLHMpLG89MCx0PXt0OiJyYW5nZVBvaW50cyIsYTphcmd1bWVudHN9LGV9LGUucmFuZ2VSb3VuZFBvaW50cz1mdW5jdGlvbih1LGEpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKGE9MCk7dmFyIGM9dVswXSxsPXVbMV0scz1uLmxlbmd0aDwyPyhjPWw9TWF0aC5yb3VuZCgoYytsKS8yKSwwKToobC1jKS8obi5sZW5ndGgtMSthKXwwO3JldHVybiBpPXIoYytNYXRoLnJvdW5kKHMqYS8yKyhsLWMtKG4ubGVuZ3RoLTErYSkqcykvMikscyksbz0wLHQ9e3Q6InJhbmdlUm91bmRQb2ludHMiLGE6YXJndW1lbnRzfSxlfSxlLnJhbmdlQmFuZHM9ZnVuY3Rpb24odSxhLGMpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKGE9MCksYXJndW1lbnRzLmxlbmd0aDwzJiYoYz1hKTt2YXIgbD11WzFdPHVbMF0scz11W2wtMF0sZj11WzEtbF0saD0oZi1zKS8obi5sZW5ndGgtYSsyKmMpO3JldHVybiBpPXIocytoKmMsaCksbCYmaS5yZXZlcnNlKCksbz1oKigxLWEpLHQ9e3Q6InJhbmdlQmFuZHMiLGE6YXJndW1lbnRzfSxlfSxlLnJhbmdlUm91bmRCYW5kcz1mdW5jdGlvbih1LGEsYyl7YXJndW1lbnRzLmxlbmd0aDwyJiYoYT0wKSxhcmd1bWVudHMubGVuZ3RoPDMmJihjPWEpO3ZhciBsPXVbMV08dVswXSxzPXVbbC0wXSxmPXVbMS1sXSxoPU1hdGguZmxvb3IoKGYtcykvKG4ubGVuZ3RoLWErMipjKSk7cmV0dXJuIGk9cihzK01hdGgucm91bmQoKGYtcy0obi5sZW5ndGgtYSkqaCkvMiksaCksbCYmaS5yZXZlcnNlKCksbz1NYXRoLnJvdW5kKGgqKDEtYSkpLHQ9e3Q6InJhbmdlUm91bmRCYW5kcyIsYTphcmd1bWVudHN9LGV9LGUucmFuZ2VCYW5kPWZ1bmN0aW9uKCl7cmV0dXJuIG99LGUucmFuZ2VFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gUGkodC5hWzBdKX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFFpKG4sdCl9LGUuZG9tYWluKG4pfWZ1bmN0aW9uIG5vKG4sdCl7ZnVuY3Rpb24gaSgpe3ZhciBlPTAscj10Lmxlbmd0aDtmb3IoYT1bXTsrK2U8cjspYVtlLTFdPXRhLnF1YW50aWxlKG4sZS9yKTtyZXR1cm4gb31mdW5jdGlvbiBvKG4pe3JldHVybiBpc05hTihuPStuKT92b2lkIDA6dFt0YS5iaXNlY3QoYSxuKV19dmFyIGE7cmV0dXJuIG8uZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQubWFwKHIpLmZpbHRlcih1KS5zb3J0KGUpLGkoKSk6bn0sby5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGkoKSk6dH0sby5xdWFudGlsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gYX0sby5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dC5pbmRleE9mKGUpLDA+ZT9bMC8wLDAvMF06W2U+MD9hW2UtMV06blswXSxlPGEubGVuZ3RoP2FbZV06bltuLmxlbmd0aC0xXV19LG8uY29weT1mdW5jdGlvbigpe3JldHVybiBubyhuLHQpfSxpKCl9ZnVuY3Rpb24gdG8obix0LGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIGVbTWF0aC5tYXgoMCxNYXRoLm1pbihvLE1hdGguZmxvb3IoaSoodC1uKSkpKV19ZnVuY3Rpb24gdSgpe3JldHVybiBpPWUubGVuZ3RoLyh0LW4pLG89ZS5sZW5ndGgtMSxyfXZhciBpLG87cmV0dXJuIHIuZG9tYWluPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStlWzBdLHQ9K2VbZS5sZW5ndGgtMV0sdSgpKTpbbix0XX0sci5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHUoKSk6ZX0sci5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9ZS5pbmRleE9mKHQpLHQ9MD50PzAvMDp0L2krbixbdCx0KzEvaV19LHIuY29weT1mdW5jdGlvbigpe3JldHVybiB0byhuLHQsZSl9LHUoKX1mdW5jdGlvbiBlbyhuLHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIGU+PWU/dFt0YS5iaXNlY3QobixlKV06dm9pZCAwfXJldHVybiBlLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGUpOm59LGUucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixlKTp0fSxlLmludmVydEV4dGVudD1mdW5jdGlvbihlKXtyZXR1cm4gZT10LmluZGV4T2YoZSksW25bZS0xXSxuW2VdXX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGVvKG4sdCl9LGV9ZnVuY3Rpb24gcm8obil7ZnVuY3Rpb24gdChuKXtyZXR1cm4rbn1yZXR1cm4gdC5pbnZlcnQ9dCx0LmRvbWFpbj10LnJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWUubWFwKHQpLHQpOm59LHQudGlja3M9ZnVuY3Rpb24odCl7cmV0dXJuIFhpKG4sdCl9LHQudGlja0Zvcm1hdD1mdW5jdGlvbih0LGUpe3JldHVybiAkaShuLHQsZSl9LHQuY29weT1mdW5jdGlvbigpe3JldHVybiBybyhuKX0sdH1mdW5jdGlvbiB1bygpe3JldHVybiAwfWZ1bmN0aW9uIGlvKG4pe3JldHVybiBuLmlubmVyUmFkaXVzfWZ1bmN0aW9uIG9vKG4pe3JldHVybiBuLm91dGVyUmFkaXVzfWZ1bmN0aW9uIGFvKG4pe3JldHVybiBuLnN0YXJ0QW5nbGV9ZnVuY3Rpb24gY28obil7cmV0dXJuIG4uZW5kQW5nbGV9ZnVuY3Rpb24gbG8obil7cmV0dXJuIG4mJm4ucGFkQW5nbGV9ZnVuY3Rpb24gc28obix0LGUscil7cmV0dXJuKG4tZSkqdC0odC1yKSpuPjA/MDoxfWZ1bmN0aW9uIGZvKG4sdCxlLHIsdSl7dmFyIGk9blswXS10WzBdLG89blsxXS10WzFdLGE9KHU/cjotcikvTWF0aC5zcXJ0KGkqaStvKm8pLGM9YSpvLGw9LWEqaSxzPW5bMF0rYyxmPW5bMV0rbCxoPXRbMF0rYyxnPXRbMV0rbCxwPShzK2gpLzIsdj0oZitnKS8yLGQ9aC1zLG09Zy1mLHk9ZCpkK20qbSxNPWUtcix4PXMqZy1oKmYsYj0oMD5tPy0xOjEpKk1hdGguc3FydChNKk0qeS14KngpLF89KHgqbS1kKmIpL3ksdz0oLXgqZC1tKmIpL3ksUz0oeCptK2QqYikveSxrPSgteCpkK20qYikveSxFPV8tcCxBPXctdixOPVMtcCxDPWstdjtyZXR1cm4gRSpFK0EqQT5OKk4rQypDJiYoXz1TLHc9ayksW1tfLWMsdy1sXSxbXyplL00sdyplL01dXX1mdW5jdGlvbiBobyhuKXtmdW5jdGlvbiB0KHQpe2Z1bmN0aW9uIG8oKXtsLnB1c2goIk0iLGkobihzKSxhKSl9Zm9yKHZhciBjLGw9W10scz1bXSxmPS0xLGg9dC5sZW5ndGgsZz1FdChlKSxwPUV0KHIpOysrZjxoOyl1LmNhbGwodGhpcyxjPXRbZl0sZik/cy5wdXNoKFsrZy5jYWxsKHRoaXMsYyxmKSwrcC5jYWxsKHRoaXMsYyxmKV0pOnMubGVuZ3RoJiYobygpLHM9W10pO3JldHVybiBzLmxlbmd0aCYmbygpLGwubGVuZ3RoP2wuam9pbigiIik6bnVsbH12YXIgZT1BcixyPU5yLHU9TmUsaT1nbyxvPWkua2V5LGE9Ljc7cmV0dXJuIHQueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHQpOmV9LHQueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1uLHQpOnJ9LHQuZGVmaW5lZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1uLHQpOnV9LHQuaW50ZXJwb2xhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIG4/aT1uOihpPUVsLmdldChuKXx8Z28pLmtleSx0KTpvfSx0LnRlbnNpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9bix0KTphfSx0fWZ1bmN0aW9uIGdvKG4pe3JldHVybiBuLmpvaW4oIkwiKX1mdW5jdGlvbiBwbyhuKXtyZXR1cm4gZ28obikrIloifWZ1bmN0aW9uIHZvKG4pe2Zvcih2YXIgdD0wLGU9bi5sZW5ndGgscj1uWzBdLHU9W3JbMF0sIiwiLHJbMV1dOysrdDxlOyl1LnB1c2goIkgiLChyWzBdKyhyPW5bdF0pWzBdKS8yLCJWIixyWzFdKTtyZXR1cm4gZT4xJiZ1LnB1c2goIkgiLHJbMF0pLHUuam9pbigiIil9ZnVuY3Rpb24gbW8obil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aCxyPW5bMF0sdT1bclswXSwiLCIsclsxXV07Kyt0PGU7KXUucHVzaCgiViIsKHI9blt0XSlbMV0sIkgiLHJbMF0pO3JldHVybiB1LmpvaW4oIiIpfWZ1bmN0aW9uIHlvKG4pe2Zvcih2YXIgdD0wLGU9bi5sZW5ndGgscj1uWzBdLHU9W3JbMF0sIiwiLHJbMV1dOysrdDxlOyl1LnB1c2goIkgiLChyPW5bdF0pWzBdLCJWIixyWzFdKTtyZXR1cm4gdS5qb2luKCIiKX1mdW5jdGlvbiBNbyhuLHQpe3JldHVybiBuLmxlbmd0aDw0P2dvKG4pOm5bMV0rX28obi5zbGljZSgxLC0xKSx3byhuLHQpKX1mdW5jdGlvbiB4byhuLHQpe3JldHVybiBuLmxlbmd0aDwzP2dvKG4pOm5bMF0rX28oKG4ucHVzaChuWzBdKSxuKSx3byhbbltuLmxlbmd0aC0yXV0uY29uY2F0KG4sW25bMV1dKSx0KSl9ZnVuY3Rpb24gYm8obix0KXtyZXR1cm4gbi5sZW5ndGg8Mz9nbyhuKTpuWzBdK19vKG4sd28obix0KSl9ZnVuY3Rpb24gX28obix0KXtpZih0Lmxlbmd0aDwxfHxuLmxlbmd0aCE9dC5sZW5ndGgmJm4ubGVuZ3RoIT10Lmxlbmd0aCsyKXJldHVybiBnbyhuKTt2YXIgZT1uLmxlbmd0aCE9dC5sZW5ndGgscj0iIix1PW5bMF0saT1uWzFdLG89dFswXSxhPW8sYz0xO2lmKGUmJihyKz0iUSIrKGlbMF0tMipvWzBdLzMpKyIsIisoaVsxXS0yKm9bMV0vMykrIiwiK2lbMF0rIiwiK2lbMV0sdT1uWzFdLGM9MiksdC5sZW5ndGg+MSl7YT10WzFdLGk9bltjXSxjKysscis9IkMiKyh1WzBdK29bMF0pKyIsIisodVsxXStvWzFdKSsiLCIrKGlbMF0tYVswXSkrIiwiKyhpWzFdLWFbMV0pKyIsIitpWzBdKyIsIitpWzFdO2Zvcih2YXIgbD0yO2w8dC5sZW5ndGg7bCsrLGMrKylpPW5bY10sYT10W2xdLHIrPSJTIisoaVswXS1hWzBdKSsiLCIrKGlbMV0tYVsxXSkrIiwiK2lbMF0rIiwiK2lbMV19aWYoZSl7dmFyIHM9bltjXTtyKz0iUSIrKGlbMF0rMiphWzBdLzMpKyIsIisoaVsxXSsyKmFbMV0vMykrIiwiK3NbMF0rIiwiK3NbMV19cmV0dXJuIHJ9ZnVuY3Rpb24gd28obix0KXtmb3IodmFyIGUscj1bXSx1PSgxLXQpLzIsaT1uWzBdLG89blsxXSxhPTEsYz1uLmxlbmd0aDsrK2E8YzspZT1pLGk9byxvPW5bYV0sci5wdXNoKFt1KihvWzBdLWVbMF0pLHUqKG9bMV0tZVsxXSldKTtyZXR1cm4gcn1mdW5jdGlvbiBTbyhuKXtpZihuLmxlbmd0aDwzKXJldHVybiBnbyhuKTt2YXIgdD0xLGU9bi5sZW5ndGgscj1uWzBdLHU9clswXSxpPXJbMV0sbz1bdSx1LHUsKHI9blsxXSlbMF1dLGE9W2ksaSxpLHJbMV1dLGM9W3UsIiwiLGksIkwiLE5vKENsLG8pLCIsIixObyhDbCxhKV07Zm9yKG4ucHVzaChuW2UtMV0pOysrdDw9ZTspcj1uW3RdLG8uc2hpZnQoKSxvLnB1c2goclswXSksYS5zaGlmdCgpLGEucHVzaChyWzFdKSxDbyhjLG8sYSk7cmV0dXJuIG4ucG9wKCksYy5wdXNoKCJMIixyKSxjLmpvaW4oIiIpfWZ1bmN0aW9uIGtvKG4pe2lmKG4ubGVuZ3RoPDQpcmV0dXJuIGdvKG4pO2Zvcih2YXIgdCxlPVtdLHI9LTEsdT1uLmxlbmd0aCxpPVswXSxvPVswXTsrK3I8MzspdD1uW3JdLGkucHVzaCh0WzBdKSxvLnB1c2godFsxXSk7Zm9yKGUucHVzaChObyhDbCxpKSsiLCIrTm8oQ2wsbykpLC0tcjsrK3I8dTspdD1uW3JdLGkuc2hpZnQoKSxpLnB1c2godFswXSksby5zaGlmdCgpLG8ucHVzaCh0WzFdKSxDbyhlLGksbyk7cmV0dXJuIGUuam9pbigiIil9ZnVuY3Rpb24gRW8obil7Zm9yKHZhciB0LGUscj0tMSx1PW4ubGVuZ3RoLGk9dSs0LG89W10sYT1bXTsrK3I8NDspZT1uW3IldV0sby5wdXNoKGVbMF0pLGEucHVzaChlWzFdKTtmb3IodD1bTm8oQ2wsbyksIiwiLE5vKENsLGEpXSwtLXI7KytyPGk7KWU9bltyJXVdLG8uc2hpZnQoKSxvLnB1c2goZVswXSksYS5zaGlmdCgpLGEucHVzaChlWzFdKSxDbyh0LG8sYSk7cmV0dXJuIHQuam9pbigiIil9ZnVuY3Rpb24gQW8obix0KXt2YXIgZT1uLmxlbmd0aC0xO2lmKGUpZm9yKHZhciByLHUsaT1uWzBdWzBdLG89blswXVsxXSxhPW5bZV1bMF0taSxjPW5bZV1bMV0tbyxsPS0xOysrbDw9ZTspcj1uW2xdLHU9bC9lLHJbMF09dCpyWzBdKygxLXQpKihpK3UqYSksclsxXT10KnJbMV0rKDEtdCkqKG8rdSpjKTtyZXR1cm4gU28obil9ZnVuY3Rpb24gTm8obix0KXtyZXR1cm4gblswXSp0WzBdK25bMV0qdFsxXStuWzJdKnRbMl0rblszXSp0WzNdfWZ1bmN0aW9uIENvKG4sdCxlKXtuLnB1c2goIkMiLE5vKEFsLHQpLCIsIixObyhBbCxlKSwiLCIsTm8oTmwsdCksIiwiLE5vKE5sLGUpLCIsIixObyhDbCx0KSwiLCIsTm8oQ2wsZSkpfWZ1bmN0aW9uIHpvKG4sdCl7cmV0dXJuKHRbMV0tblsxXSkvKHRbMF0tblswXSl9ZnVuY3Rpb24gcW8obil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aC0xLHI9W10sdT1uWzBdLGk9blsxXSxvPXJbMF09em8odSxpKTsrK3Q8ZTspclt0XT0obysobz16byh1PWksaT1uW3QrMV0pKSkvMjtyZXR1cm4gclt0XT1vLHJ9ZnVuY3Rpb24gTG8obil7Zm9yKHZhciB0LGUscix1LGk9W10sbz1xbyhuKSxhPS0xLGM9bi5sZW5ndGgtMTsrK2E8YzspdD16byhuW2FdLG5bYSsxXSksZ2EodCk8Q2E/b1thXT1vW2ErMV09MDooZT1vW2FdL3Qscj1vW2ErMV0vdCx1PWUqZStyKnIsdT45JiYodT0zKnQvTWF0aC5zcXJ0KHUpLG9bYV09dSplLG9bYSsxXT11KnIpKTtmb3IoYT0tMTsrK2E8PWM7KXU9KG5bTWF0aC5taW4oYyxhKzEpXVswXS1uW01hdGgubWF4KDAsYS0xKV1bMF0pLyg2KigxK29bYV0qb1thXSkpLGkucHVzaChbdXx8MCxvW2FdKnV8fDBdKTtyZXR1cm4gaX1mdW5jdGlvbiBUbyhuKXtyZXR1cm4gbi5sZW5ndGg8Mz9nbyhuKTpuWzBdK19vKG4sTG8obikpfWZ1bmN0aW9uIFJvKG4pe2Zvcih2YXIgdCxlLHIsdT0tMSxpPW4ubGVuZ3RoOysrdTxpOyl0PW5bdV0sZT10WzBdLHI9dFsxXS1SYSx0WzBdPWUqTWF0aC5jb3MociksdFsxXT1lKk1hdGguc2luKHIpO3JldHVybiBufWZ1bmN0aW9uIERvKG4pe2Z1bmN0aW9uIHQodCl7ZnVuY3Rpb24gYygpe3YucHVzaCgiTSIsYShuKG0pLGYpLHMsbChuKGQucmV2ZXJzZSgpKSxmKSwiWiIpfWZvcih2YXIgaCxnLHAsdj1bXSxkPVtdLG09W10seT0tMSxNPXQubGVuZ3RoLHg9RXQoZSksYj1FdCh1KSxfPWU9PT1yP2Z1bmN0aW9uKCl7cmV0dXJuIGd9OkV0KHIpLHc9dT09PWk/ZnVuY3Rpb24oKXtyZXR1cm4gcH06RXQoaSk7Kyt5PE07KW8uY2FsbCh0aGlzLGg9dFt5XSx5KT8oZC5wdXNoKFtnPSt4LmNhbGwodGhpcyxoLHkpLHA9K2IuY2FsbCh0aGlzLGgseSldKSxtLnB1c2goWytfLmNhbGwodGhpcyxoLHkpLCt3LmNhbGwodGhpcyxoLHkpXSkpOmQubGVuZ3RoJiYoYygpLGQ9W10sbT1bXSk7cmV0dXJuIGQubGVuZ3RoJiZjKCksdi5sZW5ndGg/di5qb2luKCIiKTpudWxsfXZhciBlPUFyLHI9QXIsdT0wLGk9TnIsbz1OZSxhPWdvLGM9YS5rZXksbD1hLHM9IkwiLGY9Ljc7cmV0dXJuIHQueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1yPW4sdCk6cn0sdC54MD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHQpOmV9LHQueDE9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bix0KTpyCn0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWk9bix0KTppfSx0LnkwPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW4sdCk6dX0sdC55MT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1uLHQpOml9LHQuZGVmaW5lZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1uLHQpOm99LHQuaW50ZXJwb2xhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ImZ1bmN0aW9uIj09dHlwZW9mIG4/YT1uOihhPUVsLmdldChuKXx8Z28pLmtleSxsPWEucmV2ZXJzZXx8YSxzPWEuY2xvc2VkPyJNIjoiTCIsdCk6Y30sdC50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPW4sdCk6Zn0sdH1mdW5jdGlvbiBQbyhuKXtyZXR1cm4gbi5yYWRpdXN9ZnVuY3Rpb24gVW8obil7cmV0dXJuW24ueCxuLnldfWZ1bmN0aW9uIGpvKG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLGU9dFswXSxyPXRbMV0tUmE7cmV0dXJuW2UqTWF0aC5jb3MociksZSpNYXRoLnNpbihyKV19fWZ1bmN0aW9uIEZvKCl7cmV0dXJuIDY0fWZ1bmN0aW9uIEhvKCl7cmV0dXJuImNpcmNsZSJ9ZnVuY3Rpb24gT28obil7dmFyIHQ9TWF0aC5zcXJ0KG4vcWEpO3JldHVybiJNMCwiK3QrIkEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrLXQrIkEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrdCsiWiJ9ZnVuY3Rpb24gSW8obil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQsZTsodD10aGlzW25dKSYmKGU9dFt0LmFjdGl2ZV0pJiYoLS10LmNvdW50P2RlbGV0ZSB0W3QuYWN0aXZlXTpkZWxldGUgdGhpc1tuXSx0LmFjdGl2ZSs9LjUsZS5ldmVudCYmZS5ldmVudC5pbnRlcnJ1cHQuY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sZS5pbmRleCkpfX1mdW5jdGlvbiBZbyhuLHQsZSl7cmV0dXJuIHlhKG4sUGwpLG4ubmFtZXNwYWNlPXQsbi5pZD1lLG59ZnVuY3Rpb24gWm8obix0LGUscil7dmFyIHU9bi5pZCxpPW4ubmFtZXNwYWNlO3JldHVybiBZKG4sImZ1bmN0aW9uIj09dHlwZW9mIGU/ZnVuY3Rpb24obixvLGEpe25baV1bdV0udHdlZW4uc2V0KHQscihlLmNhbGwobixuLl9fZGF0YV9fLG8sYSkpKX06KGU9cihlKSxmdW5jdGlvbihuKXtuW2ldW3VdLnR3ZWVuLnNldCh0LGUpfSkpfWZ1bmN0aW9uIFZvKG4pe3JldHVybiBudWxsPT1uJiYobj0iIiksZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PW59fWZ1bmN0aW9uIFhvKG4pe3JldHVybiBudWxsPT1uPyJfX3RyYW5zaXRpb25fXyI6Il9fdHJhbnNpdGlvbl8iK24rIl9fIn1mdW5jdGlvbiAkbyhuLHQsZSxyLHUpe3ZhciBpPW5bZV18fChuW2VdPXthY3RpdmU6MCxjb3VudDowfSksbz1pW3JdO2lmKCFvKXt2YXIgYT11LnRpbWU7bz1pW3JdPXt0d2VlbjpuZXcgbCx0aW1lOmEsZGVsYXk6dS5kZWxheSxkdXJhdGlvbjp1LmR1cmF0aW9uLGVhc2U6dS5lYXNlLGluZGV4OnR9LHU9bnVsbCwrK2kuY291bnQsdGEudGltZXIoZnVuY3Rpb24odSl7ZnVuY3Rpb24gYyhlKXtpZihpLmFjdGl2ZT5yKXJldHVybiBzKCk7dmFyIHU9aVtpLmFjdGl2ZV07dSYmKC0taS5jb3VudCxkZWxldGUgaVtpLmFjdGl2ZV0sdS5ldmVudCYmdS5ldmVudC5pbnRlcnJ1cHQuY2FsbChuLG4uX19kYXRhX18sdS5pbmRleCkpLGkuYWN0aXZlPXIsby5ldmVudCYmby5ldmVudC5zdGFydC5jYWxsKG4sbi5fX2RhdGFfXyx0KSxvLnR3ZWVuLmZvckVhY2goZnVuY3Rpb24oZSxyKXsocj1yLmNhbGwobixuLl9fZGF0YV9fLHQpKSYmdi5wdXNoKHIpfSksaD1vLmVhc2UsZj1vLmR1cmF0aW9uLHRhLnRpbWVyKGZ1bmN0aW9uKCl7cmV0dXJuIHAuYz1sKGV8fDEpP05lOmwsMX0sMCxhKX1mdW5jdGlvbiBsKGUpe2lmKGkuYWN0aXZlIT09cilyZXR1cm4gMTtmb3IodmFyIHU9ZS9mLGE9aCh1KSxjPXYubGVuZ3RoO2M+MDspdlstLWNdLmNhbGwobixhKTtyZXR1cm4gdT49MT8oby5ldmVudCYmby5ldmVudC5lbmQuY2FsbChuLG4uX19kYXRhX18sdCkscygpKTp2b2lkIDB9ZnVuY3Rpb24gcygpe3JldHVybi0taS5jb3VudD9kZWxldGUgaVtyXTpkZWxldGUgbltlXSwxfXZhciBmLGgsZz1vLmRlbGF5LHA9ZWMsdj1bXTtyZXR1cm4gcC50PWcrYSx1Pj1nP2ModS1nKTp2b2lkKHAuYz1jKX0sMCxhKX19ZnVuY3Rpb24gQm8obix0LGUpe24uYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihuKXt2YXIgcj10KG4pO3JldHVybiJ0cmFuc2xhdGUoIisoaXNGaW5pdGUocik/cjplKG4pKSsiLDApIn0pfWZ1bmN0aW9uIFdvKG4sdCxlKXtuLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24obil7dmFyIHI9dChuKTtyZXR1cm4idHJhbnNsYXRlKDAsIisoaXNGaW5pdGUocik/cjplKG4pKSsiKSJ9KX1mdW5jdGlvbiBKbyhuKXtyZXR1cm4gbi50b0lTT1N0cmluZygpfWZ1bmN0aW9uIEdvKG4sdCxlKXtmdW5jdGlvbiByKHQpe3JldHVybiBuKHQpfWZ1bmN0aW9uIHUobixlKXt2YXIgcj1uWzFdLW5bMF0sdT1yL2UsaT10YS5iaXNlY3QoVmwsdSk7cmV0dXJuIGk9PVZsLmxlbmd0aD9bdC55ZWFyLFZpKG4ubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBuLzMxNTM2ZTZ9KSxlKVsyXV06aT90W3UvVmxbaS0xXTxWbFtpXS91P2ktMTppXTpbQmwsVmkobixlKVsyXV19cmV0dXJuIHIuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBLbyhuLmludmVydCh0KSl9LHIuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuLmRvbWFpbih0KSxyKTpuLmRvbWFpbigpLm1hcChLbyl9LHIubmljZT1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIWlzTmFOKGUpJiYhbi5yYW5nZShlLEtvKCtlKzEpLHQpLmxlbmd0aH12YXIgaT1yLmRvbWFpbigpLG89UGkoaSksYT1udWxsPT1uP3UobywxMCk6Im51bWJlciI9PXR5cGVvZiBuJiZ1KG8sbik7cmV0dXJuIGEmJihuPWFbMF0sdD1hWzFdKSxyLmRvbWFpbihGaShpLHQ+MT97Zmxvb3I6ZnVuY3Rpb24odCl7Zm9yKDtlKHQ9bi5mbG9vcih0KSk7KXQ9S28odC0xKTtyZXR1cm4gdH0sY2VpbDpmdW5jdGlvbih0KXtmb3IoO2UodD1uLmNlaWwodCkpOyl0PUtvKCt0KzEpO3JldHVybiB0fX06bikpfSxyLnRpY2tzPWZ1bmN0aW9uKG4sdCl7dmFyIGU9UGkoci5kb21haW4oKSksaT1udWxsPT1uP3UoZSwxMCk6Im51bWJlciI9PXR5cGVvZiBuP3UoZSxuKTohbi5yYW5nZSYmW3tyYW5nZTpufSx0XTtyZXR1cm4gaSYmKG49aVswXSx0PWlbMV0pLG4ucmFuZ2UoZVswXSxLbygrZVsxXSsxKSwxPnQ/MTp0KX0sci50aWNrRm9ybWF0PWZ1bmN0aW9uKCl7cmV0dXJuIGV9LHIuY29weT1mdW5jdGlvbigpe3JldHVybiBHbyhuLmNvcHkoKSx0LGUpfSxZaShyLG4pfWZ1bmN0aW9uIEtvKG4pe3JldHVybiBuZXcgRGF0ZShuKX1mdW5jdGlvbiBRbyhuKXtyZXR1cm4gSlNPTi5wYXJzZShuLnJlc3BvbnNlVGV4dCl9ZnVuY3Rpb24gbmEobil7dmFyIHQ9dWEuY3JlYXRlUmFuZ2UoKTtyZXR1cm4gdC5zZWxlY3ROb2RlKHVhLmJvZHkpLHQuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KG4ucmVzcG9uc2VUZXh0KX12YXIgdGE9e3ZlcnNpb246IjMuNS41In0sZWE9W10uc2xpY2UscmE9ZnVuY3Rpb24obil7cmV0dXJuIGVhLmNhbGwobil9LHVhPXRoaXMuZG9jdW1lbnQ7aWYodWEpdHJ5e3JhKHVhLmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzKVswXS5ub2RlVHlwZX1jYXRjaChpYSl7cmE9ZnVuY3Rpb24obil7Zm9yKHZhciB0PW4ubGVuZ3RoLGU9bmV3IEFycmF5KHQpO3QtLTspZVt0XT1uW3RdO3JldHVybiBlfX1pZihEYXRlLm5vd3x8KERhdGUubm93PWZ1bmN0aW9uKCl7cmV0dXJuK25ldyBEYXRlfSksdWEpdHJ5e3VhLmNyZWF0ZUVsZW1lbnQoIkRJViIpLnN0eWxlLnNldFByb3BlcnR5KCJvcGFjaXR5IiwwLCIiKX1jYXRjaChvYSl7dmFyIGFhPXRoaXMuRWxlbWVudC5wcm90b3R5cGUsY2E9YWEuc2V0QXR0cmlidXRlLGxhPWFhLnNldEF0dHJpYnV0ZU5TLHNhPXRoaXMuQ1NTU3R5bGVEZWNsYXJhdGlvbi5wcm90b3R5cGUsZmE9c2Euc2V0UHJvcGVydHk7YWEuc2V0QXR0cmlidXRlPWZ1bmN0aW9uKG4sdCl7Y2EuY2FsbCh0aGlzLG4sdCsiIil9LGFhLnNldEF0dHJpYnV0ZU5TPWZ1bmN0aW9uKG4sdCxlKXtsYS5jYWxsKHRoaXMsbix0LGUrIiIpfSxzYS5zZXRQcm9wZXJ0eT1mdW5jdGlvbihuLHQsZSl7ZmEuY2FsbCh0aGlzLG4sdCsiIixlKX19dGEuYXNjZW5kaW5nPWUsdGEuZGVzY2VuZGluZz1mdW5jdGlvbihuLHQpe3JldHVybiBuPnQ/LTE6dD5uPzE6dD49bj8wOjAvMH0sdGEubWluPWZ1bmN0aW9uKG4sdCl7dmFyIGUscix1PS0xLGk9bi5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcig7Kyt1PGk7KWlmKG51bGwhPShyPW5bdV0pJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK3U8aTspbnVsbCE9KHI9blt1XSkmJmU+ciYmKGU9cil9ZWxzZXtmb3IoOysrdTxpOylpZihudWxsIT0ocj10LmNhbGwobixuW3VdLHUpKSYmcj49cil7ZT1yO2JyZWFrfWZvcig7Kyt1PGk7KW51bGwhPShyPXQuY2FsbChuLG5bdV0sdSkpJiZlPnImJihlPXIpfXJldHVybiBlfSx0YS5tYXg9ZnVuY3Rpb24obix0KXt2YXIgZSxyLHU9LTEsaT1uLmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKDsrK3U8aTspaWYobnVsbCE9KHI9blt1XSkmJnI+PXIpe2U9cjticmVha31mb3IoOysrdTxpOyludWxsIT0ocj1uW3VdKSYmcj5lJiYoZT1yKX1lbHNle2Zvcig7Kyt1PGk7KWlmKG51bGwhPShyPXQuY2FsbChuLG5bdV0sdSkpJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK3U8aTspbnVsbCE9KHI9dC5jYWxsKG4sblt1XSx1KSkmJnI+ZSYmKGU9cil9cmV0dXJuIGV9LHRhLmV4dGVudD1mdW5jdGlvbihuLHQpe3ZhciBlLHIsdSxpPS0xLG89bi5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcig7KytpPG87KWlmKG51bGwhPShyPW5baV0pJiZyPj1yKXtlPXU9cjticmVha31mb3IoOysraTxvOyludWxsIT0ocj1uW2ldKSYmKGU+ciYmKGU9cikscj51JiYodT1yKSl9ZWxzZXtmb3IoOysraTxvOylpZihudWxsIT0ocj10LmNhbGwobixuW2ldLGkpKSYmcj49cil7ZT11PXI7YnJlYWt9Zm9yKDsrK2k8bzspbnVsbCE9KHI9dC5jYWxsKG4sbltpXSxpKSkmJihlPnImJihlPXIpLHI+dSYmKHU9cikpfXJldHVybltlLHVdfSx0YS5zdW09ZnVuY3Rpb24obix0KXt2YXIgZSxyPTAsaT1uLmxlbmd0aCxvPS0xO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7KytvPGk7KXUoZT0rbltvXSkmJihyKz1lKTtlbHNlIGZvcig7KytvPGk7KXUoZT0rdC5jYWxsKG4sbltvXSxvKSkmJihyKz1lKTtyZXR1cm4gcn0sdGEubWVhbj1mdW5jdGlvbihuLHQpe3ZhciBlLGk9MCxvPW4ubGVuZ3RoLGE9LTEsYz1vO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7KythPG87KXUoZT1yKG5bYV0pKT9pKz1lOi0tYztlbHNlIGZvcig7KythPG87KXUoZT1yKHQuY2FsbChuLG5bYV0sYSkpKT9pKz1lOi0tYztyZXR1cm4gYz9pL2M6dm9pZCAwfSx0YS5xdWFudGlsZT1mdW5jdGlvbihuLHQpe3ZhciBlPShuLmxlbmd0aC0xKSp0KzEscj1NYXRoLmZsb29yKGUpLHU9K25bci0xXSxpPWUtcjtyZXR1cm4gaT91K2kqKG5bcl0tdSk6dX0sdGEubWVkaWFuPWZ1bmN0aW9uKG4sdCl7dmFyIGksbz1bXSxhPW4ubGVuZ3RoLGM9LTE7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2M8YTspdShpPXIobltjXSkpJiZvLnB1c2goaSk7ZWxzZSBmb3IoOysrYzxhOyl1KGk9cih0LmNhbGwobixuW2NdLGMpKSkmJm8ucHVzaChpKTtyZXR1cm4gby5sZW5ndGg/dGEucXVhbnRpbGUoby5zb3J0KGUpLC41KTp2b2lkIDB9LHRhLnZhcmlhbmNlPWZ1bmN0aW9uKG4sdCl7dmFyIGUsaSxvPW4ubGVuZ3RoLGE9MCxjPTAsbD0tMSxzPTA7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2w8bzspdShlPXIobltsXSkpJiYoaT1lLWEsYSs9aS8rK3MsYys9aSooZS1hKSk7ZWxzZSBmb3IoOysrbDxvOyl1KGU9cih0LmNhbGwobixuW2xdLGwpKSkmJihpPWUtYSxhKz1pLysrcyxjKz1pKihlLWEpKTtyZXR1cm4gcz4xP2MvKHMtMSk6dm9pZCAwfSx0YS5kZXZpYXRpb249ZnVuY3Rpb24oKXt2YXIgbj10YS52YXJpYW5jZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG4/TWF0aC5zcXJ0KG4pOm59O3ZhciBoYT1pKGUpO3RhLmJpc2VjdExlZnQ9aGEubGVmdCx0YS5iaXNlY3Q9dGEuYmlzZWN0UmlnaHQ9aGEucmlnaHQsdGEuYmlzZWN0b3I9ZnVuY3Rpb24obil7cmV0dXJuIGkoMT09PW4ubGVuZ3RoP2Z1bmN0aW9uKHQscil7cmV0dXJuIGUobih0KSxyKX06bil9LHRhLnNodWZmbGU9ZnVuY3Rpb24obix0LGUpeyhpPWFyZ3VtZW50cy5sZW5ndGgpPDMmJihlPW4ubGVuZ3RoLDI+aSYmKHQ9MCkpO2Zvcih2YXIgcix1LGk9ZS10O2k7KXU9TWF0aC5yYW5kb20oKSppLS18MCxyPW5baSt0XSxuW2krdF09blt1K3RdLG5bdSt0XT1yO3JldHVybiBufSx0YS5wZXJtdXRlPWZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPXQubGVuZ3RoLHI9bmV3IEFycmF5KGUpO2UtLTspcltlXT1uW3RbZV1dO3JldHVybiByfSx0YS5wYWlycz1mdW5jdGlvbihuKXtmb3IodmFyIHQsZT0wLHI9bi5sZW5ndGgtMSx1PW5bMF0saT1uZXcgQXJyYXkoMD5yPzA6cik7cj5lOylpW2VdPVt0PXUsdT1uWysrZV1dO3JldHVybiBpfSx0YS56aXA9ZnVuY3Rpb24oKXtpZighKHI9YXJndW1lbnRzLmxlbmd0aCkpcmV0dXJuW107Zm9yKHZhciBuPS0xLHQ9dGEubWluKGFyZ3VtZW50cyxvKSxlPW5ldyBBcnJheSh0KTsrK248dDspZm9yKHZhciByLHU9LTEsaT1lW25dPW5ldyBBcnJheShyKTsrK3U8cjspaVt1XT1hcmd1bWVudHNbdV1bbl07cmV0dXJuIGV9LHRhLnRyYW5zcG9zZT1mdW5jdGlvbihuKXtyZXR1cm4gdGEuemlwLmFwcGx5KHRhLG4pfSx0YS5rZXlzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiBuKXQucHVzaChlKTtyZXR1cm4gdH0sdGEudmFsdWVzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiBuKXQucHVzaChuW2VdKTtyZXR1cm4gdH0sdGEuZW50cmllcz1mdW5jdGlvbihuKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gbil0LnB1c2goe2tleTplLHZhbHVlOm5bZV19KTtyZXR1cm4gdH0sdGEubWVyZ2U9ZnVuY3Rpb24obil7Zm9yKHZhciB0LGUscix1PW4ubGVuZ3RoLGk9LTEsbz0wOysraTx1OylvKz1uW2ldLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkobyk7LS11Pj0wOylmb3Iocj1uW3VdLHQ9ci5sZW5ndGg7LS10Pj0wOyllWy0tb109clt0XTtyZXR1cm4gZX07dmFyIGdhPU1hdGguYWJzO3RhLnJhbmdlPWZ1bmN0aW9uKG4sdCxlKXtpZihhcmd1bWVudHMubGVuZ3RoPDMmJihlPTEsYXJndW1lbnRzLmxlbmd0aDwyJiYodD1uLG49MCkpLCh0LW4pL2U9PT0xLzApdGhyb3cgbmV3IEVycm9yKCJpbmZpbml0ZSByYW5nZSIpO3ZhciByLHU9W10saT1hKGdhKGUpKSxvPS0xO2lmKG4qPWksdCo9aSxlKj1pLDA+ZSlmb3IoOyhyPW4rZSorK28pPnQ7KXUucHVzaChyL2kpO2Vsc2UgZm9yKDsocj1uK2UqKytvKTx0Oyl1LnB1c2goci9pKTtyZXR1cm4gdX0sdGEubWFwPWZ1bmN0aW9uKG4sdCl7dmFyIGU9bmV3IGw7aWYobiBpbnN0YW5jZW9mIGwpbi5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7ZS5zZXQobix0KX0pO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShuKSl7dmFyIHIsdT0tMSxpPW4ubGVuZ3RoO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7Kyt1PGk7KWUuc2V0KHUsblt1XSk7ZWxzZSBmb3IoOysrdTxpOyllLnNldCh0LmNhbGwobixyPW5bdV0sdSkscil9ZWxzZSBmb3IodmFyIG8gaW4gbillLnNldChvLG5bb10pO3JldHVybiBlfTt2YXIgcGE9Il9fcHJvdG9fXyIsdmE9Ilx4MDAiO2MobCx7aGFzOmgsZ2V0OmZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLl9bcyhuKV19LHNldDpmdW5jdGlvbihuLHQpe3JldHVybiB0aGlzLl9bcyhuKV09dH0scmVtb3ZlOmcsa2V5czpwLHZhbHVlczpmdW5jdGlvbigpe3ZhciBuPVtdO2Zvcih2YXIgdCBpbiB0aGlzLl8pbi5wdXNoKHRoaXMuX1t0XSk7cmV0dXJuIG59LGVudHJpZXM6ZnVuY3Rpb24oKXt2YXIgbj1bXTtmb3IodmFyIHQgaW4gdGhpcy5fKW4ucHVzaCh7a2V5OmYodCksdmFsdWU6dGhpcy5fW3RdfSk7cmV0dXJuIG59LHNpemU6dixlbXB0eTpkLGZvckVhY2g6ZnVuY3Rpb24obil7Zm9yKHZhciB0IGluIHRoaXMuXyluLmNhbGwodGhpcyxmKHQpLHRoaXMuX1t0XSl9fSksdGEubmVzdD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odCxvLGEpe2lmKGE+PWkubGVuZ3RoKXJldHVybiByP3IuY2FsbCh1LG8pOmU/by5zb3J0KGUpOm87Zm9yKHZhciBjLHMsZixoLGc9LTEscD1vLmxlbmd0aCx2PWlbYSsrXSxkPW5ldyBsOysrZzxwOykoaD1kLmdldChjPXYocz1vW2ddKSkpP2gucHVzaChzKTpkLnNldChjLFtzXSk7cmV0dXJuIHQ/KHM9dCgpLGY9ZnVuY3Rpb24oZSxyKXtzLnNldChlLG4odCxyLGEpKX0pOihzPXt9LGY9ZnVuY3Rpb24oZSxyKXtzW2VdPW4odCxyLGEpfSksZC5mb3JFYWNoKGYpLHN9ZnVuY3Rpb24gdChuLGUpe2lmKGU+PWkubGVuZ3RoKXJldHVybiBuO3ZhciByPVtdLHU9b1tlKytdO3JldHVybiBuLmZvckVhY2goZnVuY3Rpb24obix1KXtyLnB1c2goe2tleTpuLHZhbHVlczp0KHUsZSl9KX0pLHU/ci5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIHUobi5rZXksdC5rZXkpfSk6cn12YXIgZSxyLHU9e30saT1bXSxvPVtdO3JldHVybiB1Lm1hcD1mdW5jdGlvbih0LGUpe3JldHVybiBuKGUsdCwwKX0sdS5lbnRyaWVzPWZ1bmN0aW9uKGUpe3JldHVybiB0KG4odGEubWFwLGUsMCksMCl9LHUua2V5PWZ1bmN0aW9uKG4pe3JldHVybiBpLnB1c2gobiksdX0sdS5zb3J0S2V5cz1mdW5jdGlvbihuKXtyZXR1cm4gb1tpLmxlbmd0aC0xXT1uLHV9LHUuc29ydFZhbHVlcz1mdW5jdGlvbihuKXtyZXR1cm4gZT1uLHV9LHUucm9sbHVwPWZ1bmN0aW9uKG4pe3JldHVybiByPW4sdX0sdX0sdGEuc2V0PWZ1bmN0aW9uKG4pe3ZhciB0PW5ldyBtO2lmKG4pZm9yKHZhciBlPTAscj1uLmxlbmd0aDtyPmU7KytlKXQuYWRkKG5bZV0pO3JldHVybiB0fSxjKG0se2hhczpoLGFkZDpmdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5fW3Mobis9IiIpXT0hMCxufSxyZW1vdmU6Zyx2YWx1ZXM6cCxzaXplOnYsZW1wdHk6ZCxmb3JFYWNoOmZ1bmN0aW9uKG4pe2Zvcih2YXIgdCBpbiB0aGlzLl8pbi5jYWxsKHRoaXMsZih0KSl9fSksdGEuYmVoYXZpb3I9e30sdGEucmViaW5kPWZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlLHI9MSx1PWFyZ3VtZW50cy5sZW5ndGg7KytyPHU7KW5bZT1hcmd1bWVudHNbcl1dPU0obix0LHRbZV0pO3JldHVybiBufTt2YXIgZGE9WyJ3ZWJraXQiLCJtcyIsIm1veiIsIk1veiIsIm8iLCJPIl07dGEuZGlzcGF0Y2g9ZnVuY3Rpb24oKXtmb3IodmFyIG49bmV3IF8sdD0tMSxlPWFyZ3VtZW50cy5sZW5ndGg7Kyt0PGU7KW5bYXJndW1lbnRzW3RdXT13KG4pO3JldHVybiBufSxfLnByb3RvdHlwZS5vbj1mdW5jdGlvbihuLHQpe3ZhciBlPW4uaW5kZXhPZigiLiIpLHI9IiI7aWYoZT49MCYmKHI9bi5zbGljZShlKzEpLG49bi5zbGljZSgwLGUpKSxuKXJldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/dGhpc1tuXS5vbihyKTp0aGlzW25dLm9uKHIsdCk7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKG51bGw9PXQpZm9yKG4gaW4gdGhpcyl0aGlzLmhhc093blByb3BlcnR5KG4pJiZ0aGlzW25dLm9uKHIsbnVsbCk7cmV0dXJuIHRoaXN9fSx0YS5ldmVudD1udWxsLHRhLnJlcXVvdGU9ZnVuY3Rpb24obil7cmV0dXJuIG4ucmVwbGFjZShtYSwiXFwkJiIpfTt2YXIgbWE9L1tcXFxeXCRcKlwrXD9cfFxbXF1cKFwpXC5ce1x9XS9nLHlhPXt9Ll9fcHJvdG9fXz9mdW5jdGlvbihuLHQpe24uX19wcm90b19fPXR9OmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlIGluIHQpbltlXT10W2VdfSxNYT1mdW5jdGlvbihuLHQpe3JldHVybiB0LnF1ZXJ5U2VsZWN0b3Iobil9LHhhPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHQucXVlcnlTZWxlY3RvckFsbChuKX0sYmE9ZnVuY3Rpb24obix0KXt2YXIgZT1uLm1hdGNoZXN8fG5beChuLCJtYXRjaGVzU2VsZWN0b3IiKV07cmV0dXJuKGJhPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIGUuY2FsbChuLHQpfSkobix0KX07ImZ1bmN0aW9uIj09dHlwZW9mIFNpenpsZSYmKE1hPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIFNpenpsZShuLHQpWzBdfHxudWxsfSx4YT1TaXp6bGUsYmE9U2l6emxlLm1hdGNoZXNTZWxlY3RvciksdGEuc2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRhLnNlbGVjdCh1YS5kb2N1bWVudEVsZW1lbnQpfTt2YXIgX2E9dGEuc2VsZWN0aW9uLnByb3RvdHlwZT1bXTtfYS5zZWxlY3Q9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHUsaT1bXTtuPU4obik7Zm9yKHZhciBvPS0xLGE9dGhpcy5sZW5ndGg7KytvPGE7KXtpLnB1c2godD1bXSksdC5wYXJlbnROb2RlPShyPXRoaXNbb10pLnBhcmVudE5vZGU7Zm9yKHZhciBjPS0xLGw9ci5sZW5ndGg7KytjPGw7KSh1PXJbY10pPyh0LnB1c2goZT1uLmNhbGwodSx1Ll9fZGF0YV9fLGMsbykpLGUmJiJfX2RhdGFfXyJpbiB1JiYoZS5fX2RhdGFfXz11Ll9fZGF0YV9fKSk6dC5wdXNoKG51bGwpfXJldHVybiBBKGkpfSxfYS5zZWxlY3RBbGw9ZnVuY3Rpb24obil7dmFyIHQsZSxyPVtdO249QyhuKTtmb3IodmFyIHU9LTEsaT10aGlzLmxlbmd0aDsrK3U8aTspZm9yKHZhciBvPXRoaXNbdV0sYT0tMSxjPW8ubGVuZ3RoOysrYTxjOykoZT1vW2FdKSYmKHIucHVzaCh0PXJhKG4uY2FsbChlLGUuX19kYXRhX18sYSx1KSkpLHQucGFyZW50Tm9kZT1lKTtyZXR1cm4gQShyKX07dmFyIHdhPXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTt0YS5ucz17cHJlZml4OndhLHF1YWxpZnk6ZnVuY3Rpb24obil7dmFyIHQ9bi5pbmRleE9mKCI6IiksZT1uO3JldHVybiB0Pj0wJiYoZT1uLnNsaWNlKDAsdCksbj1uLnNsaWNlKHQrMSkpLHdhLmhhc093blByb3BlcnR5KGUpP3tzcGFjZTp3YVtlXSxsb2NhbDpufTpufX0sX2EuYXR0cj1mdW5jdGlvbihuLHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7aWYoInN0cmluZyI9PXR5cGVvZiBuKXt2YXIgZT10aGlzLm5vZGUoKTtyZXR1cm4gbj10YS5ucy5xdWFsaWZ5KG4pLG4ubG9jYWw/ZS5nZXRBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpOmUuZ2V0QXR0cmlidXRlKG4pfWZvcih0IGluIG4pdGhpcy5lYWNoKHoodCxuW3RdKSk7cmV0dXJuIHRoaXN9cmV0dXJuIHRoaXMuZWFjaCh6KG4sdCkpfSxfYS5jbGFzc2VkPWZ1bmN0aW9uKG4sdCl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtpZigic3RyaW5nIj09dHlwZW9mIG4pe3ZhciBlPXRoaXMubm9kZSgpLHI9KG49VChuKSkubGVuZ3RoLHU9LTE7aWYodD1lLmNsYXNzTGlzdCl7Zm9yKDsrK3U8cjspaWYoIXQuY29udGFpbnMoblt1XSkpcmV0dXJuITF9ZWxzZSBmb3IodD1lLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsrK3U8cjspaWYoIUwoblt1XSkudGVzdCh0KSlyZXR1cm4hMTtyZXR1cm4hMH1mb3IodCBpbiBuKXRoaXMuZWFjaChSKHQsblt0XSkpO3JldHVybiB0aGlzfXJldHVybiB0aGlzLmVhY2goUihuLHQpKX0sX2Euc3R5bGU9ZnVuY3Rpb24obixlLHIpe3ZhciB1PWFyZ3VtZW50cy5sZW5ndGg7aWYoMz51KXtpZigic3RyaW5nIiE9dHlwZW9mIG4pezI+dSYmKGU9IiIpO2ZvcihyIGluIG4pdGhpcy5lYWNoKFAocixuW3JdLGUpKTtyZXR1cm4gdGhpc31pZigyPnUpe3ZhciBpPXRoaXMubm9kZSgpO3JldHVybiB0KGkpLmdldENvbXB1dGVkU3R5bGUoaSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG4pfXI9IiJ9cmV0dXJuIHRoaXMuZWFjaChQKG4sZSxyKSl9LF9hLnByb3BlcnR5PWZ1bmN0aW9uKG4sdCl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtpZigic3RyaW5nIj09dHlwZW9mIG4pcmV0dXJuIHRoaXMubm9kZSgpW25dO2Zvcih0IGluIG4pdGhpcy5lYWNoKFUodCxuW3RdKSk7cmV0dXJuIHRoaXN9cmV0dXJuIHRoaXMuZWFjaChVKG4sdCkpfSxfYS50ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbigpe3ZhciB0PW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09dD8iIjp0fTpudWxsPT1uP2Z1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD0iIn06ZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PW59KTp0aGlzLm5vZGUoKS50ZXh0Q29udGVudH0sX2EuaHRtbD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24oKXt2YXIgdD1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmlubmVySFRNTD1udWxsPT10PyIiOnR9Om51bGw9PW4/ZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD0iIn06ZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD1ufSk6dGhpcy5ub2RlKCkuaW5uZXJIVE1MfSxfYS5hcHBlbmQ9ZnVuY3Rpb24obil7cmV0dXJuIG49aihuKSx0aGlzLnNlbGVjdChmdW5jdGlvbigpe3JldHVybiB0aGlzLmFwcGVuZENoaWxkKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpKX0pfSxfYS5pbnNlcnQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gbj1qKG4pLHQ9Tih0KSx0aGlzLnNlbGVjdChmdW5jdGlvbigpe3JldHVybiB0aGlzLmluc2VydEJlZm9yZShuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8bnVsbCl9KX0sX2EucmVtb3ZlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChGKX0sX2EuZGF0YT1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobixlKXt2YXIgcix1LGksbz1uLmxlbmd0aCxmPWUubGVuZ3RoLGg9TWF0aC5taW4obyxmKSxnPW5ldyBBcnJheShmKSxwPW5ldyBBcnJheShmKSx2PW5ldyBBcnJheShvKTtpZih0KXt2YXIgZCxtPW5ldyBsLHk9bmV3IEFycmF5KG8pO2ZvcihyPS0xOysrcjxvOyltLmhhcyhkPXQuY2FsbCh1PW5bcl0sdS5fX2RhdGFfXyxyKSk/dltyXT11Om0uc2V0KGQsdSkseVtyXT1kO2ZvcihyPS0xOysrcjxmOykodT1tLmdldChkPXQuY2FsbChlLGk9ZVtyXSxyKSkpP3UhPT0hMCYmKGdbcl09dSx1Ll9fZGF0YV9fPWkpOnBbcl09SChpKSxtLnNldChkLCEwKTtmb3Iocj0tMTsrK3I8bzspbS5nZXQoeVtyXSkhPT0hMCYmKHZbcl09bltyXSl9ZWxzZXtmb3Iocj0tMTsrK3I8aDspdT1uW3JdLGk9ZVtyXSx1Pyh1Ll9fZGF0YV9fPWksZ1tyXT11KTpwW3JdPUgoaSk7Zm9yKDtmPnI7KytyKXBbcl09SChlW3JdKTtmb3IoO28+cjsrK3IpdltyXT1uW3JdfXAudXBkYXRlPWcscC5wYXJlbnROb2RlPWcucGFyZW50Tm9kZT12LnBhcmVudE5vZGU9bi5wYXJlbnROb2RlLGEucHVzaChwKSxjLnB1c2goZykscy5wdXNoKHYpfXZhciByLHUsaT0tMSxvPXRoaXMubGVuZ3RoO2lmKCFhcmd1bWVudHMubGVuZ3RoKXtmb3Iobj1uZXcgQXJyYXkobz0ocj10aGlzWzBdKS5sZW5ndGgpOysraTxvOykodT1yW2ldKSYmKG5baV09dS5fX2RhdGFfXyk7cmV0dXJuIG59dmFyIGE9WihbXSksYz1BKFtdKSxzPUEoW10pO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuKWZvcig7KytpPG87KWUocj10aGlzW2ldLG4uY2FsbChyLHIucGFyZW50Tm9kZS5fX2RhdGFfXyxpKSk7ZWxzZSBmb3IoOysraTxvOyllKHI9dGhpc1tpXSxuKTtyZXR1cm4gYy5lbnRlcj1mdW5jdGlvbigpe3JldHVybiBhfSxjLmV4aXQ9ZnVuY3Rpb24oKXtyZXR1cm4gc30sY30sX2EuZGF0dW09ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLG4pOnRoaXMucHJvcGVydHkoIl9fZGF0YV9fIil9LF9hLmZpbHRlcj1mdW5jdGlvbihuKXt2YXIgdCxlLHIsdT1bXTsiZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49TyhuKSk7Zm9yKHZhciBpPTAsbz10aGlzLmxlbmd0aDtvPmk7aSsrKXt1LnB1c2godD1bXSksdC5wYXJlbnROb2RlPShlPXRoaXNbaV0pLnBhcmVudE5vZGU7Zm9yKHZhciBhPTAsYz1lLmxlbmd0aDtjPmE7YSsrKShyPWVbYV0pJiZuLmNhbGwocixyLl9fZGF0YV9fLGEsaSkmJnQucHVzaChyKX1yZXR1cm4gQSh1KX0sX2Eub3JkZXI9ZnVuY3Rpb24oKXtmb3IodmFyIG49LTEsdD10aGlzLmxlbmd0aDsrK248dDspZm9yKHZhciBlLHI9dGhpc1tuXSx1PXIubGVuZ3RoLTEsaT1yW3VdOy0tdT49MDspKGU9clt1XSkmJihpJiZpIT09ZS5uZXh0U2libGluZyYmaS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLGkpLGk9ZSk7cmV0dXJuIHRoaXN9LF9hLnNvcnQ9ZnVuY3Rpb24obil7bj1JLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtmb3IodmFyIHQ9LTEsZT10aGlzLmxlbmd0aDsrK3Q8ZTspdGhpc1t0XS5zb3J0KG4pO3JldHVybiB0aGlzLm9yZGVyKCl9LF9hLmVhY2g9ZnVuY3Rpb24obil7cmV0dXJuIFkodGhpcyxmdW5jdGlvbih0LGUscil7bi5jYWxsKHQsdC5fX2RhdGFfXyxlLHIpfSl9LF9hLmNhbGw9ZnVuY3Rpb24obil7dmFyIHQ9cmEoYXJndW1lbnRzKTtyZXR1cm4gbi5hcHBseSh0WzBdPXRoaXMsdCksdGhpc30sX2EuZW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5ub2RlKCl9LF9hLm5vZGU9ZnVuY3Rpb24oKXtmb3IodmFyIG49MCx0PXRoaXMubGVuZ3RoO3Q+bjtuKyspZm9yKHZhciBlPXRoaXNbbl0scj0wLHU9ZS5sZW5ndGg7dT5yO3IrKyl7dmFyIGk9ZVtyXTtpZihpKXJldHVybiBpfXJldHVybiBudWxsfSxfYS5zaXplPWZ1bmN0aW9uKCl7dmFyIG49MDtyZXR1cm4gWSh0aGlzLGZ1bmN0aW9uKCl7KytufSksbn07dmFyIFNhPVtdO3RhLnNlbGVjdGlvbi5lbnRlcj1aLHRhLnNlbGVjdGlvbi5lbnRlci5wcm90b3R5cGU9U2EsU2EuYXBwZW5kPV9hLmFwcGVuZCxTYS5lbXB0eT1fYS5lbXB0eSxTYS5ub2RlPV9hLm5vZGUsU2EuY2FsbD1fYS5jYWxsLFNhLnNpemU9X2Euc2l6ZSxTYS5zZWxlY3Q9ZnVuY3Rpb24obil7Zm9yKHZhciB0LGUscix1LGksbz1bXSxhPS0xLGM9dGhpcy5sZW5ndGg7KythPGM7KXtyPSh1PXRoaXNbYV0pLnVwZGF0ZSxvLnB1c2godD1bXSksdC5wYXJlbnROb2RlPXUucGFyZW50Tm9kZTtmb3IodmFyIGw9LTEscz11Lmxlbmd0aDsrK2w8czspKGk9dVtsXSk/KHQucHVzaChyW2xdPWU9bi5jYWxsKHUucGFyZW50Tm9kZSxpLl9fZGF0YV9fLGwsYSkpLGUuX19kYXRhX189aS5fX2RhdGFfXyk6dC5wdXNoKG51bGwpfXJldHVybiBBKG8pfSxTYS5pbnNlcnQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyJiYodD1WKHRoaXMpKSxfYS5pbnNlcnQuY2FsbCh0aGlzLG4sdCl9LHRhLnNlbGVjdD1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/KGU9W01hKHQsdWEpXSxlLnBhcmVudE5vZGU9dWEuZG9jdW1lbnRFbGVtZW50KTooZT1bdF0sZS5wYXJlbnROb2RlPW4odCkpLEEoW2VdKX0sdGEuc2VsZWN0QWxsPWZ1bmN0aW9uKG4pe3ZhciB0O3JldHVybiJzdHJpbmciPT10eXBlb2Ygbj8odD1yYSh4YShuLHVhKSksdC5wYXJlbnROb2RlPXVhLmRvY3VtZW50RWxlbWVudCk6KHQ9bix0LnBhcmVudE5vZGU9bnVsbCksQShbdF0pfSxfYS5vbj1mdW5jdGlvbihuLHQsZSl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aDtpZigzPnIpe2lmKCJzdHJpbmciIT10eXBlb2Ygbil7Mj5yJiYodD0hMSk7Zm9yKGUgaW4gbil0aGlzLmVhY2goWChlLG5bZV0sdCkpO3JldHVybiB0aGlzfWlmKDI+cilyZXR1cm4ocj10aGlzLm5vZGUoKVsiX19vbiIrbl0pJiZyLl87ZT0hMX1yZXR1cm4gdGhpcy5lYWNoKFgobix0LGUpKX07dmFyIGthPXRhLm1hcCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9KTt1YSYma2EuZm9yRWFjaChmdW5jdGlvbihuKXsib24iK24gaW4gdWEmJmthLnJlbW92ZShuKX0pO3ZhciBFYSxBYT0wO3RhLm1vdXNlPWZ1bmN0aW9uKG4pe3JldHVybiBKKG4saygpKX07dmFyIE5hPXRoaXMubmF2aWdhdG9yJiYvV2ViS2l0Ly50ZXN0KHRoaXMubmF2aWdhdG9yLnVzZXJBZ2VudCk/LTE6MDt0YS50b3VjaD1mdW5jdGlvbihuLHQsZSl7aWYoYXJndW1lbnRzLmxlbmd0aDwzJiYoZT10LHQ9aygpLmNoYW5nZWRUb3VjaGVzKSx0KWZvcih2YXIgcix1PTAsaT10Lmxlbmd0aDtpPnU7Kyt1KWlmKChyPXRbdV0pLmlkZW50aWZpZXI9PT1lKXJldHVybiBKKG4scil9LHRhLmJlaGF2aW9yLmRyYWc9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7dGhpcy5vbigibW91c2Vkb3duLmRyYWciLGkpLm9uKCJ0b3VjaHN0YXJ0LmRyYWciLG8pfWZ1bmN0aW9uIGUobix0LGUsaSxvKXtyZXR1cm4gZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dmFyIG4sZSxyPXQoaCx2KTtyJiYobj1yWzBdLU1bMF0sZT1yWzFdLU1bMV0scHw9bnxlLE09cixnKHt0eXBlOiJkcmFnIix4OnJbMF0rbFswXSx5OnJbMV0rbFsxXSxkeDpuLGR5OmV9KSl9ZnVuY3Rpb24gYygpe3QoaCx2KSYmKG0ub24oaStkLG51bGwpLm9uKG8rZCxudWxsKSx5KHAmJnRhLmV2ZW50LnRhcmdldD09PWYpLGcoe3R5cGU6ImRyYWdlbmQifSkpfXZhciBsLHM9dGhpcyxmPXRhLmV2ZW50LnRhcmdldCxoPXMucGFyZW50Tm9kZSxnPXIub2Yocyxhcmd1bWVudHMpLHA9MCx2PW4oKSxkPSIuZHJhZyIrKG51bGw9PXY/IiI6Ii0iK3YpLG09dGEuc2VsZWN0KGUoZikpLm9uKGkrZCxhKS5vbihvK2QsYykseT1XKGYpLE09dChoLHYpO3U/KGw9dS5hcHBseShzLGFyZ3VtZW50cyksbD1bbC54LU1bMF0sbC55LU1bMV1dKTpsPVswLDBdLGcoe3R5cGU6ImRyYWdzdGFydCJ9KX19dmFyIHI9RShuLCJkcmFnIiwiZHJhZ3N0YXJ0IiwiZHJhZ2VuZCIpLHU9bnVsbCxpPWUoYix0YS5tb3VzZSx0LCJtb3VzZW1vdmUiLCJtb3VzZXVwIiksbz1lKEcsdGEudG91Y2gseSwidG91Y2htb3ZlIiwidG91Y2hlbmQiKTtyZXR1cm4gbi5vcmlnaW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxuKTp1fSx0YS5yZWJpbmQobixyLCJvbiIpfSx0YS50b3VjaGVzPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MiYmKHQ9aygpLnRvdWNoZXMpLHQ/cmEodCkubWFwKGZ1bmN0aW9uKHQpe3ZhciBlPUoobix0KTtyZXR1cm4gZS5pZGVudGlmaWVyPXQuaWRlbnRpZmllcixlfSk6W119O3ZhciBDYT0xZS02LHphPUNhKkNhLHFhPU1hdGguUEksTGE9MipxYSxUYT1MYS1DYSxSYT1xYS8yLERhPXFhLzE4MCxQYT0xODAvcWEsVWE9TWF0aC5TUVJUMixqYT0yLEZhPTQ7dGEuaW50ZXJwb2xhdGVab29tPWZ1bmN0aW9uKG4sdCl7ZnVuY3Rpb24gZShuKXt2YXIgdD1uKnk7aWYobSl7dmFyIGU9cnQodiksbz1pLyhqYSpoKSooZSp1dChVYSp0K3YpLWV0KHYpKTtyZXR1cm5bcitvKmwsdStvKnMsaSplL3J0KFVhKnQrdildfXJldHVybltyK24qbCx1K24qcyxpKk1hdGguZXhwKFVhKnQpXX12YXIgcj1uWzBdLHU9blsxXSxpPW5bMl0sbz10WzBdLGE9dFsxXSxjPXRbMl0sbD1vLXIscz1hLXUsZj1sKmwrcypzLGg9TWF0aC5zcXJ0KGYpLGc9KGMqYy1pKmkrRmEqZikvKDIqaSpqYSpoKSxwPShjKmMtaSppLUZhKmYpLygyKmMqamEqaCksdj1NYXRoLmxvZyhNYXRoLnNxcnQoZypnKzEpLWcpLGQ9TWF0aC5sb2coTWF0aC5zcXJ0KHAqcCsxKS1wKSxtPWQtdix5PShtfHxNYXRoLmxvZyhjL2kpKS9VYTtyZXR1cm4gZS5kdXJhdGlvbj0xZTMqeSxlfSx0YS5iZWhhdmlvci56b29tPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtuLm9uKHEsZikub24oT2ErIi56b29tIixnKS5vbigiZGJsY2xpY2suem9vbSIscCkub24oUixoKX1mdW5jdGlvbiBlKG4pe3JldHVyblsoblswXS1rLngpL2suaywoblsxXS1rLnkpL2sua119ZnVuY3Rpb24gcihuKXtyZXR1cm5bblswXSprLmsray54LG5bMV0qay5rK2sueV19ZnVuY3Rpb24gdShuKXtrLms9TWF0aC5tYXgoTlswXSxNYXRoLm1pbihOWzFdLG4pKX1mdW5jdGlvbiBpKG4sdCl7dD1yKHQpLGsueCs9blswXS10WzBdLGsueSs9blsxXS10WzFdfWZ1bmN0aW9uIG8odCxlLHIsbyl7dC5fX2NoYXJ0X189e3g6ay54LHk6ay55LGs6ay5rfSx1KE1hdGgucG93KDIsbykpLGkoZD1lLHIpLHQ9dGEuc2VsZWN0KHQpLEM+MCYmKHQ9dC50cmFuc2l0aW9uKCkuZHVyYXRpb24oQykpLHQuY2FsbChuLmV2ZW50KX1mdW5jdGlvbiBhKCl7YiYmYi5kb21haW4oeC5yYW5nZSgpLm1hcChmdW5jdGlvbihuKXtyZXR1cm4obi1rLngpL2sua30pLm1hcCh4LmludmVydCkpLHcmJncuZG9tYWluKF8ucmFuZ2UoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuKG4tay55KS9rLmt9KS5tYXAoXy5pbnZlcnQpKX1mdW5jdGlvbiBjKG4pe3orK3x8bih7dHlwZToiem9vbXN0YXJ0In0pfWZ1bmN0aW9uIGwobil7YSgpLG4oe3R5cGU6Inpvb20iLHNjYWxlOmsuayx0cmFuc2xhdGU6W2sueCxrLnldfSl9ZnVuY3Rpb24gcyhuKXstLXp8fG4oe3R5cGU6Inpvb21lbmQifSksZD1udWxsfWZ1bmN0aW9uIGYoKXtmdW5jdGlvbiBuKCl7Zj0xLGkodGEubW91c2UodSksZyksbChhKX1mdW5jdGlvbiByKCl7aC5vbihMLG51bGwpLm9uKFQsbnVsbCkscChmJiZ0YS5ldmVudC50YXJnZXQ9PT1vKSxzKGEpfXZhciB1PXRoaXMsbz10YS5ldmVudC50YXJnZXQsYT1ELm9mKHUsYXJndW1lbnRzKSxmPTAsaD10YS5zZWxlY3QodCh1KSkub24oTCxuKS5vbihULHIpLGc9ZSh0YS5tb3VzZSh1KSkscD1XKHUpO0RsLmNhbGwodSksYyhhKX1mdW5jdGlvbiBoKCl7ZnVuY3Rpb24gbigpe3ZhciBuPXRhLnRvdWNoZXMocCk7cmV0dXJuIGc9ay5rLG4uZm9yRWFjaChmdW5jdGlvbihuKXtuLmlkZW50aWZpZXIgaW4gZCYmKGRbbi5pZGVudGlmaWVyXT1lKG4pKX0pLG59ZnVuY3Rpb24gdCgpe3ZhciB0PXRhLmV2ZW50LnRhcmdldDt0YS5zZWxlY3QodCkub24oeCxyKS5vbihiLGEpLF8ucHVzaCh0KTtmb3IodmFyIGU9dGEuZXZlbnQuY2hhbmdlZFRvdWNoZXMsdT0wLGk9ZS5sZW5ndGg7aT51OysrdSlkW2VbdV0uaWRlbnRpZmllcl09bnVsbDt2YXIgYz1uKCksbD1EYXRlLm5vdygpO2lmKDE9PT1jLmxlbmd0aCl7aWYoNTAwPmwtTSl7dmFyIHM9Y1swXTtvKHAscyxkW3MuaWRlbnRpZmllcl0sTWF0aC5mbG9vcihNYXRoLmxvZyhrLmspL01hdGguTE4yKSsxKSxTKCl9TT1sfWVsc2UgaWYoYy5sZW5ndGg+MSl7dmFyIHM9Y1swXSxmPWNbMV0saD1zWzBdLWZbMF0sZz1zWzFdLWZbMV07bT1oKmgrZypnfX1mdW5jdGlvbiByKCl7dmFyIG4sdCxlLHIsbz10YS50b3VjaGVzKHApO0RsLmNhbGwocCk7Zm9yKHZhciBhPTAsYz1vLmxlbmd0aDtjPmE7KythLHI9bnVsbClpZihlPW9bYV0scj1kW2UuaWRlbnRpZmllcl0pe2lmKHQpYnJlYWs7bj1lLHQ9cn1pZihyKXt2YXIgcz0ocz1lWzBdLW5bMF0pKnMrKHM9ZVsxXS1uWzFdKSpzLGY9bSYmTWF0aC5zcXJ0KHMvbSk7bj1bKG5bMF0rZVswXSkvMiwoblsxXStlWzFdKS8yXSx0PVsodFswXStyWzBdKS8yLCh0WzFdK3JbMV0pLzJdLHUoZipnKX1NPW51bGwsaShuLHQpLGwodil9ZnVuY3Rpb24gYSgpe2lmKHRhLmV2ZW50LnRvdWNoZXMubGVuZ3RoKXtmb3IodmFyIHQ9dGEuZXZlbnQuY2hhbmdlZFRvdWNoZXMsZT0wLHI9dC5sZW5ndGg7cj5lOysrZSlkZWxldGUgZFt0W2VdLmlkZW50aWZpZXJdO2Zvcih2YXIgdSBpbiBkKXJldHVybiB2b2lkIG4oKX10YS5zZWxlY3RBbGwoXykub24oeSxudWxsKSx3Lm9uKHEsZikub24oUixoKSxFKCkscyh2KX12YXIgZyxwPXRoaXMsdj1ELm9mKHAsYXJndW1lbnRzKSxkPXt9LG09MCx5PSIuem9vbS0iK3RhLmV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmlkZW50aWZpZXIseD0idG91Y2htb3ZlIit5LGI9InRvdWNoZW5kIit5LF89W10sdz10YS5zZWxlY3QocCksRT1XKHApO3QoKSxjKHYpLHcub24ocSxudWxsKS5vbihSLHQpfWZ1bmN0aW9uIGcoKXt2YXIgbj1ELm9mKHRoaXMsYXJndW1lbnRzKTt5P2NsZWFyVGltZW91dCh5KToodj1lKGQ9bXx8dGEubW91c2UodGhpcykpLERsLmNhbGwodGhpcyksYyhuKSkseT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7eT1udWxsLHMobil9LDUwKSxTKCksdShNYXRoLnBvdygyLC4wMDIqSGEoKSkqay5rKSxpKGQsdiksbChuKX1mdW5jdGlvbiBwKCl7dmFyIG49dGEubW91c2UodGhpcyksdD1NYXRoLmxvZyhrLmspL01hdGguTE4yO28odGhpcyxuLGUobiksdGEuZXZlbnQuc2hpZnRLZXk/TWF0aC5jZWlsKHQpLTE6TWF0aC5mbG9vcih0KSsxKX12YXIgdixkLG0seSxNLHgsYixfLHcsaz17eDowLHk6MCxrOjF9LEE9Wzk2MCw1MDBdLE49SWEsQz0yNTAsej0wLHE9Im1vdXNlZG93bi56b29tIixMPSJtb3VzZW1vdmUuem9vbSIsVD0ibW91c2V1cC56b29tIixSPSJ0b3VjaHN0YXJ0Lnpvb20iLEQ9RShuLCJ6b29tc3RhcnQiLCJ6b29tIiwiem9vbWVuZCIpO3JldHVybiBPYXx8KE9hPSJvbndoZWVsImluIHVhPyhIYT1mdW5jdGlvbigpe3JldHVybi10YS5ldmVudC5kZWx0YVkqKHRhLmV2ZW50LmRlbHRhTW9kZT8xMjA6MSl9LCJ3aGVlbCIpOiJvbm1vdXNld2hlZWwiaW4gdWE/KEhhPWZ1bmN0aW9uKCl7cmV0dXJuIHRhLmV2ZW50LndoZWVsRGVsdGF9LCJtb3VzZXdoZWVsIik6KEhhPWZ1bmN0aW9uKCl7cmV0dXJuLXRhLmV2ZW50LmRldGFpbH0sIk1vek1vdXNlUGl4ZWxTY3JvbGwiKSksbi5ldmVudD1mdW5jdGlvbihuKXtuLmVhY2goZnVuY3Rpb24oKXt2YXIgbj1ELm9mKHRoaXMsYXJndW1lbnRzKSx0PWs7VGw/dGEuc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKS5lYWNoKCJzdGFydC56b29tIixmdW5jdGlvbigpe2s9dGhpcy5fX2NoYXJ0X198fHt4OjAseTowLGs6MX0sYyhuKX0pLnR3ZWVuKCJ6b29tOnpvb20iLGZ1bmN0aW9uKCl7dmFyIGU9QVswXSxyPUFbMV0sdT1kP2RbMF06ZS8yLGk9ZD9kWzFdOnIvMixvPXRhLmludGVycG9sYXRlWm9vbShbKHUtay54KS9rLmssKGktay55KS9rLmssZS9rLmtdLFsodS10LngpL3QuaywoaS10LnkpL3QuayxlL3Qua10pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgcj1vKHQpLGE9ZS9yWzJdO3RoaXMuX19jaGFydF9fPWs9e3g6dS1yWzBdKmEseTppLXJbMV0qYSxrOmF9LGwobil9fSkuZWFjaCgiaW50ZXJydXB0Lnpvb20iLGZ1bmN0aW9uKCl7cyhuKX0pLmVhY2goImVuZC56b29tIixmdW5jdGlvbigpe3Mobil9KToodGhpcy5fX2NoYXJ0X189ayxjKG4pLGwobikscyhuKSl9KX0sbi50cmFuc2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGs9e3g6K3RbMF0seTordFsxXSxrOmsua30sYSgpLG4pOltrLngsay55XX0sbi5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaz17eDprLngseTprLnksazordH0sYSgpLG4pOmsua30sbi5zY2FsZUV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oTj1udWxsPT10P0lhOlsrdFswXSwrdFsxXV0sbik6Tn0sbi5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG09dCYmWyt0WzBdLCt0WzFdXSxuKTptfSxuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEE9dCYmWyt0WzBdLCt0WzFdXSxuKTpBfSxuLmR1cmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhDPSt0LG4pOkN9LG4ueD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYj10LHg9dC5jb3B5KCksaz17eDowLHk6MCxrOjF9LG4pOmJ9LG4ueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odz10LF89dC5jb3B5KCksaz17eDowLHk6MCxrOjF9LG4pOnd9LHRhLnJlYmluZChuLEQsIm9uIil9O3ZhciBIYSxPYSxJYT1bMCwxLzBdO3RhLmNvbG9yPW90LG90LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJnYigpKyIifSx0YS5oc2w9YXQ7dmFyIFlhPWF0LnByb3RvdHlwZT1uZXcgb3Q7WWEuYnJpZ2h0ZXI9ZnVuY3Rpb24obil7cmV0dXJuIG49TWF0aC5wb3coLjcsYXJndW1lbnRzLmxlbmd0aD9uOjEpLG5ldyBhdCh0aGlzLmgsdGhpcy5zLHRoaXMubC9uKX0sWWEuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKSxuZXcgYXQodGhpcy5oLHRoaXMucyxuKnRoaXMubCl9LFlhLnJnYj1mdW5jdGlvbigpe3JldHVybiBjdCh0aGlzLmgsdGhpcy5zLHRoaXMubCl9LHRhLmhjbD1sdDt2YXIgWmE9bHQucHJvdG90eXBlPW5ldyBvdDtaYS5icmlnaHRlcj1mdW5jdGlvbihuKXtyZXR1cm4gbmV3IGx0KHRoaXMuaCx0aGlzLmMsTWF0aC5taW4oMTAwLHRoaXMubCtWYSooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSl9LFphLmRhcmtlcj1mdW5jdGlvbihuKXtyZXR1cm4gbmV3IGx0KHRoaXMuaCx0aGlzLmMsTWF0aC5tYXgoMCx0aGlzLmwtVmEqKGFyZ3VtZW50cy5sZW5ndGg/bjoxKSkpfSxaYS5yZ2I9ZnVuY3Rpb24oKXtyZXR1cm4gc3QodGhpcy5oLHRoaXMuYyx0aGlzLmwpLnJnYigpfSx0YS5sYWI9ZnQ7dmFyIFZhPTE4LFhhPS45NTA0NywkYT0xLEJhPTEuMDg4ODMsV2E9ZnQucHJvdG90eXBlPW5ldyBvdDtXYS5icmlnaHRlcj1mdW5jdGlvbihuKXtyZXR1cm4gbmV3IGZ0KE1hdGgubWluKDEwMCx0aGlzLmwrVmEqKGFyZ3VtZW50cy5sZW5ndGg/bjoxKSksdGhpcy5hLHRoaXMuYil9LFdhLmRhcmtlcj1mdW5jdGlvbihuKXtyZXR1cm4gbmV3IGZ0KE1hdGgubWF4KDAsdGhpcy5sLVZhKihhcmd1bWVudHMubGVuZ3RoP246MSkpLHRoaXMuYSx0aGlzLmIpfSxXYS5yZ2I9ZnVuY3Rpb24oKXtyZXR1cm4gaHQodGhpcy5sLHRoaXMuYSx0aGlzLmIpfSx0YS5yZ2I9bXQ7dmFyIEphPW10LnByb3RvdHlwZT1uZXcgb3Q7SmEuYnJpZ2h0ZXI9ZnVuY3Rpb24obil7bj1NYXRoLnBvdyguNyxhcmd1bWVudHMubGVuZ3RoP246MSk7dmFyIHQ9dGhpcy5yLGU9dGhpcy5nLHI9dGhpcy5iLHU9MzA7cmV0dXJuIHR8fGV8fHI/KHQmJnU+dCYmKHQ9dSksZSYmdT5lJiYoZT11KSxyJiZ1PnImJihyPXUpLG5ldyBtdChNYXRoLm1pbigyNTUsdC9uKSxNYXRoLm1pbigyNTUsZS9uKSxNYXRoLm1pbigyNTUsci9uKSkpOm5ldyBtdCh1LHUsdSl9LEphLmRhcmtlcj1mdW5jdGlvbihuKXtyZXR1cm4gbj1NYXRoLnBvdyguNyxhcmd1bWVudHMubGVuZ3RoP246MSksbmV3IG10KG4qdGhpcy5yLG4qdGhpcy5nLG4qdGhpcy5iKX0sSmEuaHNsPWZ1bmN0aW9uKCl7cmV0dXJuIF90KHRoaXMucix0aGlzLmcsdGhpcy5iKX0sSmEudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iIyIreHQodGhpcy5yKSt4dCh0aGlzLmcpK3h0KHRoaXMuYil9O3ZhciBHYT10YS5tYXAoe2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LGRhcmtzbGF0ZWdyZXk6MzEwMDQ5NSxkYXJrdHVycXVvaXNlOjUyOTQ1LGRhcmt2aW9sZXQ6OTY5OTUzOSxkZWVwcGluazoxNjcxNjk0NyxkZWVwc2t5Ymx1ZTo0OTE1MSxkaW1ncmF5OjY5MDgyNjUsZGltZ3JleTo2OTA4MjY1LGRvZGdlcmJsdWU6MjAwMzE5OSxmaXJlYnJpY2s6MTE2NzQxNDYsZmxvcmFsd2hpdGU6MTY3NzU5MjAsZm9yZXN0Z3JlZW46MjI2Mzg0MixmdWNoc2lhOjE2NzExOTM1LGdhaW5zYm9ybzoxNDQ3NDQ2MCxnaG9zdHdoaXRlOjE2MzE2NjcxLGdvbGQ6MTY3NjY3MjAsZ29sZGVucm9kOjE0MzI5MTIwLGdyYXk6ODQyMTUwNCxncmVlbjozMjc2OCxncmVlbnllbGxvdzoxMTQwMzA1NSxncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LHJlYmVjY2FwdXJwbGU6NjY5Nzg4MSxyZWQ6MTY3MTE2ODAscm9zeWJyb3duOjEyMzU3NTE5LHJveWFsYmx1ZTo0Mjg2OTQ1LHNhZGRsZWJyb3duOjkxMjcxODcsc2FsbW9uOjE2NDE2ODgyLHNhbmR5YnJvd246MTYwMzI4NjQsc2VhZ3JlZW46MzA1MDMyNyxzZWFzaGVsbDoxNjc3NDYzOCxzaWVubmE6MTA1MDY3OTcsc2lsdmVyOjEyNjMyMjU2LHNreWJsdWU6ODkwMDMzMSxzbGF0ZWJsdWU6Njk3MDA2MSxzbGF0ZWdyYXk6NzM3Mjk0NCxzbGF0ZWdyZXk6NzM3Mjk0NCxzbm93OjE2Nzc1OTMwLHNwcmluZ2dyZWVuOjY1NDA3LHN0ZWVsYmx1ZTo0NjIwOTgwLHRhbjoxMzgwODc4MCx0ZWFsOjMyODk2LHRoaXN0bGU6MTQyMDQ4ODgsdG9tYXRvOjE2NzM3MDk1LHR1cnF1b2lzZTo0MjUxODU2LHZpb2xldDoxNTYzMTA4Nix3aGVhdDoxNjExMzMzMSx3aGl0ZToxNjc3NzIxNSx3aGl0ZXNtb2tlOjE2MTE5Mjg1LHllbGxvdzoxNjc3Njk2MCx5ZWxsb3dncmVlbjoxMDE0NTA3NH0pO0dhLmZvckVhY2goZnVuY3Rpb24obix0KXtHYS5zZXQobix5dCh0KSl9KSx0YS5mdW5jdG9yPUV0LHRhLnhocj1BdCh5KSx0YS5kc3Y9ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKG4sZSxpKXthcmd1bWVudHMubGVuZ3RoPDMmJihpPWUsZT1udWxsKTt2YXIgbz1OdChuLHQsbnVsbD09ZT9yOnUoZSksaSk7cmV0dXJuIG8ucm93PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP28ucmVzcG9uc2UobnVsbD09KGU9bik/cjp1KG4pKTplfSxvfWZ1bmN0aW9uIHIobil7cmV0dXJuIGUucGFyc2Uobi5yZXNwb25zZVRleHQpfWZ1bmN0aW9uIHUobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLnBhcnNlKHQucmVzcG9uc2VUZXh0LG4pfX1mdW5jdGlvbiBpKHQpe3JldHVybiB0Lm1hcChvKS5qb2luKG4pfWZ1bmN0aW9uIG8obil7cmV0dXJuIGEudGVzdChuKT8nIicrbi5yZXBsYWNlKC9cIi9nLCciIicpKyciJzpufXZhciBhPW5ldyBSZWdFeHAoJ1siJytuKyJcbl0iKSxjPW4uY2hhckNvZGVBdCgwKTtyZXR1cm4gZS5wYXJzZT1mdW5jdGlvbihuLHQpe3ZhciByO3JldHVybiBlLnBhcnNlUm93cyhuLGZ1bmN0aW9uKG4sZSl7aWYocilyZXR1cm4gcihuLGUtMSk7dmFyIHU9bmV3IEZ1bmN0aW9uKCJkIiwicmV0dXJuIHsiK24ubWFwKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KG4pKyI6IGRbIit0KyJdIn0pLmpvaW4oIiwiKSsifSIpO3I9dD9mdW5jdGlvbihuLGUpe3JldHVybiB0KHUobiksZSl9OnV9KX0sZS5wYXJzZVJvd3M9ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKCl7aWYocz49bClyZXR1cm4gbztpZih1KXJldHVybiB1PSExLGk7dmFyIHQ9cztpZigzND09PW4uY2hhckNvZGVBdCh0KSl7Zm9yKHZhciBlPXQ7ZSsrPGw7KWlmKDM0PT09bi5jaGFyQ29kZUF0KGUpKXtpZigzNCE9PW4uY2hhckNvZGVBdChlKzEpKWJyZWFrOysrZX1zPWUrMjt2YXIgcj1uLmNoYXJDb2RlQXQoZSsxKTtyZXR1cm4gMTM9PT1yPyh1PSEwLDEwPT09bi5jaGFyQ29kZUF0KGUrMikmJisrcyk6MTA9PT1yJiYodT0hMCksbi5zbGljZSh0KzEsZSkucmVwbGFjZSgvIiIvZywnIicpfWZvcig7bD5zOyl7dmFyIHI9bi5jaGFyQ29kZUF0KHMrKyksYT0xO2lmKDEwPT09cil1PSEwO2Vsc2UgaWYoMTM9PT1yKXU9ITAsMTA9PT1uLmNoYXJDb2RlQXQocykmJigrK3MsKythKTtlbHNlIGlmKHIhPT1jKWNvbnRpbnVlO3JldHVybiBuLnNsaWNlKHQscy1hKX1yZXR1cm4gbi5zbGljZSh0KX1mb3IodmFyIHIsdSxpPXt9LG89e30sYT1bXSxsPW4ubGVuZ3RoLHM9MCxmPTA7KHI9ZSgpKSE9PW87KXtmb3IodmFyIGg9W107ciE9PWkmJnIhPT1vOyloLnB1c2gocikscj1lKCk7dCYmbnVsbD09KGg9dChoLGYrKykpfHxhLnB1c2goaCl9cmV0dXJuIGF9LGUuZm9ybWF0PWZ1bmN0aW9uKHQpe2lmKEFycmF5LmlzQXJyYXkodFswXSkpcmV0dXJuIGUuZm9ybWF0Um93cyh0KTt2YXIgcj1uZXcgbSx1PVtdO3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24obil7Zm9yKHZhciB0IGluIG4pci5oYXModCl8fHUucHVzaChyLmFkZCh0KSl9KSxbdS5tYXAobykuam9pbihuKV0uY29uY2F0KHQubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB1Lm1hcChmdW5jdGlvbihuKXtyZXR1cm4gbyh0W25dKX0pLmpvaW4obil9KSkuam9pbigiXG4iKX0sZS5mb3JtYXRSb3dzPWZ1bmN0aW9uKG4pe3JldHVybiBuLm1hcChpKS5qb2luKCJcbiIpfSxlfSx0YS5jc3Y9dGEuZHN2KCIsIiwidGV4dC9jc3YiKSx0YS50c3Y9dGEuZHN2KCIJIiwidGV4dC90YWItc2VwYXJhdGVkLXZhbHVlcyIpO3ZhciBLYSxRYSxuYyx0YyxlYyxyYz10aGlzW3godGhpcywicmVxdWVzdEFuaW1hdGlvbkZyYW1lIildfHxmdW5jdGlvbihuKXtzZXRUaW1lb3V0KG4sMTcpfTt0YS50aW1lcj1mdW5jdGlvbihuLHQsZSl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aDsyPnImJih0PTApLDM+ciYmKGU9RGF0ZS5ub3coKSk7dmFyIHU9ZSt0LGk9e2M6bix0OnUsZjohMSxuOm51bGx9O1FhP1FhLm49aTpLYT1pLFFhPWksbmN8fCh0Yz1jbGVhclRpbWVvdXQodGMpLG5jPTEscmMocXQpKX0sdGEudGltZXIuZmx1c2g9ZnVuY3Rpb24oKXtMdCgpLFR0KCl9LHRhLnJvdW5kPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHQ/TWF0aC5yb3VuZChuKih0PU1hdGgucG93KDEwLHQpKSkvdDpNYXRoLnJvdW5kKG4pfTt2YXIgdWM9WyJ5IiwieiIsImEiLCJmIiwicCIsIm4iLCJceGI1IiwibSIsIiIsImsiLCJNIiwiRyIsIlQiLCJQIiwiRSIsIloiLCJZIl0ubWFwKER0KTt0YS5mb3JtYXRQcmVmaXg9ZnVuY3Rpb24obix0KXt2YXIgZT0wO3JldHVybiBuJiYoMD5uJiYobio9LTEpLHQmJihuPXRhLnJvdW5kKG4sUnQobix0KSkpLGU9MStNYXRoLmZsb29yKDFlLTEyK01hdGgubG9nKG4pL01hdGguTE4xMCksZT1NYXRoLm1heCgtMjQsTWF0aC5taW4oMjQsMypNYXRoLmZsb29yKChlLTEpLzMpKSkpLHVjWzgrZS8zXX07dmFyIGljPS8oPzooW157XSk/KFs8Pj1eXSkpPyhbK1wtIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLi0/XGQrKT8oW2EteiVdKT8vaSxvYz10YS5tYXAoe2I6ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoMil9LGM6ZnVuY3Rpb24obil7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUobil9LG86ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoOCl9LHg6ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoMTYpfSxYOmZ1bmN0aW9uKG4pe3JldHVybiBuLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfSxnOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4udG9QcmVjaXNpb24odCl9LGU6ZnVuY3Rpb24obix0KXtyZXR1cm4gbi50b0V4cG9uZW50aWFsKHQpfSxmOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4udG9GaXhlZCh0KX0scjpmdW5jdGlvbihuLHQpe3JldHVybihuPXRhLnJvdW5kKG4sUnQobix0KSkpLnRvRml4ZWQoTWF0aC5tYXgoMCxNYXRoLm1pbigyMCxSdChuKigxKzFlLTE1KSx0KSkpKX19KSxhYz10YS50aW1lPXt9LGNjPURhdGU7anQucHJvdG90eXBlPXtnZXREYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENEYXRlKCl9LGdldERheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDRGF5KCl9LGdldEZ1bGxZZWFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENGdWxsWWVhcigpfSxnZXRIb3VyczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDSG91cnMoKX0sZ2V0TWlsbGlzZWNvbmRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENNaWxsaXNlY29uZHMoKX0sZ2V0TWludXRlczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDTWludXRlcygpfSxnZXRNb250aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDTW9udGgoKX0sZ2V0U2Vjb25kczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDU2Vjb25kcygpfSxnZXRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRUaW1lKCl9LGdldFRpbWV6b25lT2Zmc2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDB9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLnZhbHVlT2YoKX0sc2V0RGF0ZTpmdW5jdGlvbigpe2xjLnNldFVUQ0RhdGUuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldERheTpmdW5jdGlvbigpe2xjLnNldFVUQ0RheS5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0RnVsbFllYXI6ZnVuY3Rpb24oKXtsYy5zZXRVVENGdWxsWWVhci5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0SG91cnM6ZnVuY3Rpb24oKXtsYy5zZXRVVENIb3Vycy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0TWlsbGlzZWNvbmRzOmZ1bmN0aW9uKCl7bGMuc2V0VVRDTWlsbGlzZWNvbmRzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRNaW51dGVzOmZ1bmN0aW9uKCl7bGMuc2V0VVRDTWludXRlcy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0TW9udGg6ZnVuY3Rpb24oKXtsYy5zZXRVVENNb250aC5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0U2Vjb25kczpmdW5jdGlvbigpe2xjLnNldFVUQ1NlY29uZHMuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldFRpbWU6ZnVuY3Rpb24oKXtsYy5zZXRUaW1lLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfX07dmFyIGxjPURhdGUucHJvdG90eXBlO2FjLnllYXI9RnQoZnVuY3Rpb24obil7cmV0dXJuIG49YWMuZGF5KG4pLG4uc2V0TW9udGgoMCwxKSxufSxmdW5jdGlvbihuLHQpe24uc2V0RnVsbFllYXIobi5nZXRGdWxsWWVhcigpK3QpfSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRGdWxsWWVhcigpfSksYWMueWVhcnM9YWMueWVhci5yYW5nZSxhYy55ZWFycy51dGM9YWMueWVhci51dGMucmFuZ2UsYWMuZGF5PUZ0KGZ1bmN0aW9uKG4pe3ZhciB0PW5ldyBjYygyZTMsMCk7cmV0dXJuIHQuc2V0RnVsbFllYXIobi5nZXRGdWxsWWVhcigpLG4uZ2V0TW9udGgoKSxuLmdldERhdGUoKSksdH0sZnVuY3Rpb24obix0KXtuLnNldERhdGUobi5nZXREYXRlKCkrdCl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldERhdGUoKS0xfSksYWMuZGF5cz1hYy5kYXkucmFuZ2UsYWMuZGF5cy51dGM9YWMuZGF5LnV0Yy5yYW5nZSxhYy5kYXlPZlllYXI9ZnVuY3Rpb24obil7dmFyIHQ9YWMueWVhcihuKTtyZXR1cm4gTWF0aC5mbG9vcigobi10LTZlNCoobi5nZXRUaW1lem9uZU9mZnNldCgpLXQuZ2V0VGltZXpvbmVPZmZzZXQoKSkpLzg2NGU1KX0sWyJzdW5kYXkiLCJtb25kYXkiLCJ0dWVzZGF5Iiwid2VkbmVzZGF5IiwidGh1cnNkYXkiLCJmcmlkYXkiLCJzYXR1cmRheSJdLmZvckVhY2goZnVuY3Rpb24obix0KXt0PTctdDt2YXIgZT1hY1tuXT1GdChmdW5jdGlvbihuKXtyZXR1cm4obj1hYy5kYXkobikpLnNldERhdGUobi5nZXREYXRlKCktKG4uZ2V0RGF5KCkrdCklNyksbn0sZnVuY3Rpb24obix0KXtuLnNldERhdGUobi5nZXREYXRlKCkrNypNYXRoLmZsb29yKHQpKX0sZnVuY3Rpb24obil7dmFyIGU9YWMueWVhcihuKS5nZXREYXkoKTtyZXR1cm4gTWF0aC5mbG9vcigoYWMuZGF5T2ZZZWFyKG4pKyhlK3QpJTcpLzcpLShlIT09dCl9KTthY1tuKyJzIl09ZS5yYW5nZSxhY1tuKyJzIl0udXRjPWUudXRjLnJhbmdlLGFjW24rIk9mWWVhciJdPWZ1bmN0aW9uKG4pe3ZhciBlPWFjLnllYXIobikuZ2V0RGF5KCk7cmV0dXJuIE1hdGguZmxvb3IoKGFjLmRheU9mWWVhcihuKSsoZSt0KSU3KS83KX19KSxhYy53ZWVrPWFjLnN1bmRheSxhYy53ZWVrcz1hYy5zdW5kYXkucmFuZ2UsYWMud2Vla3MudXRjPWFjLnN1bmRheS51dGMucmFuZ2UsYWMud2Vla09mWWVhcj1hYy5zdW5kYXlPZlllYXI7dmFyIHNjPXsiLSI6IiIsXzoiICIsMDoiMCJ9LGZjPS9eXHMqXGQrLyxoYz0vXiUvO3RhLmxvY2FsZT1mdW5jdGlvbihuKXtyZXR1cm57bnVtYmVyRm9ybWF0OlB0KG4pLHRpbWVGb3JtYXQ6T3Qobil9fTt2YXIgZ2M9dGEubG9jYWxlKHtkZWNpbWFsOiIuIix0aG91c2FuZHM6IiwiLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbIiQiLCIiXSxkYXRlVGltZToiJWEgJWIgJWUgJVggJVkiLGRhdGU6IiVtLyVkLyVZIix0aW1lOiIlSDolTTolUyIscGVyaW9kczpbIkFNIiwiUE0iXSxkYXlzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxzaG9ydERheXM6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxtb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHNob3J0TW9udGhzOlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl19KTt0YS5mb3JtYXQ9Z2MubnVtYmVyRm9ybWF0LHRhLmdlbz17fSxjZS5wcm90b3R5cGU9e3M6MCx0OjAsYWRkOmZ1bmN0aW9uKG4pe2xlKG4sdGhpcy50LHBjKSxsZShwYy5zLHRoaXMucyx0aGlzKSx0aGlzLnM/dGhpcy50Kz1wYy50OnRoaXMucz1wYy50Cn0scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnM9dGhpcy50PTB9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zfX07dmFyIHBjPW5ldyBjZTt0YS5nZW8uc3RyZWFtPWZ1bmN0aW9uKG4sdCl7biYmdmMuaGFzT3duUHJvcGVydHkobi50eXBlKT92Y1tuLnR5cGVdKG4sdCk6c2Uobix0KX07dmFyIHZjPXtGZWF0dXJlOmZ1bmN0aW9uKG4sdCl7c2Uobi5nZW9tZXRyeSx0KX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5mZWF0dXJlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KXNlKGVbcl0uZ2VvbWV0cnksdCl9fSxkYz17U3BoZXJlOmZ1bmN0aW9uKG4sdCl7dC5zcGhlcmUoKX0sUG9pbnQ6ZnVuY3Rpb24obix0KXtuPW4uY29vcmRpbmF0ZXMsdC5wb2ludChuWzBdLG5bMV0sblsyXSl9LE11bHRpUG9pbnQ6ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5jb29yZGluYXRlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KW49ZVtyXSx0LnBvaW50KG5bMF0sblsxXSxuWzJdKX0sTGluZVN0cmluZzpmdW5jdGlvbihuLHQpe2ZlKG4uY29vcmRpbmF0ZXMsdCwwKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPW4uY29vcmRpbmF0ZXMscj0tMSx1PWUubGVuZ3RoOysrcjx1OylmZShlW3JdLHQsMCl9LFBvbHlnb246ZnVuY3Rpb24obix0KXtoZShuLmNvb3JkaW5hdGVzLHQpfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5jb29yZGluYXRlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KWhlKGVbcl0sdCl9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbihuLHQpe2Zvcih2YXIgZT1uLmdlb21ldHJpZXMscj0tMSx1PWUubGVuZ3RoOysrcjx1OylzZShlW3JdLHQpfX07dGEuZ2VvLmFyZWE9ZnVuY3Rpb24obil7cmV0dXJuIG1jPTAsdGEuZ2VvLnN0cmVhbShuLE1jKSxtY307dmFyIG1jLHljPW5ldyBjZSxNYz17c3BoZXJlOmZ1bmN0aW9uKCl7bWMrPTQqcWF9LHBvaW50OmIsbGluZVN0YXJ0OmIsbGluZUVuZDpiLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3ljLnJlc2V0KCksTWMubGluZVN0YXJ0PWdlfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIG49Mip5YzttYys9MD5uPzQqcWErbjpuLE1jLmxpbmVTdGFydD1NYy5saW5lRW5kPU1jLnBvaW50PWJ9fTt0YS5nZW8uYm91bmRzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHQpe00ucHVzaCh4PVtzPW4saD1uXSksZj50JiYoZj10KSx0PmcmJihnPXQpfWZ1bmN0aW9uIHQodCxlKXt2YXIgcj1wZShbdCpEYSxlKkRhXSk7aWYobSl7dmFyIHU9ZGUobSxyKSxpPVt1WzFdLC11WzBdLDBdLG89ZGUoaSx1KTtNZShvKSxvPXhlKG8pO3ZhciBjPXQtcCxsPWM+MD8xOi0xLHY9b1swXSpQYSpsLGQ9Z2EoYyk+MTgwO2lmKGReKHY+bCpwJiZsKnQ+dikpe3ZhciB5PW9bMV0qUGE7eT5nJiYoZz15KX1lbHNlIGlmKHY9KHYrMzYwKSUzNjAtMTgwLGReKHY+bCpwJiZsKnQ+dikpe3ZhciB5PS1vWzFdKlBhO2Y+eSYmKGY9eSl9ZWxzZSBmPmUmJihmPWUpLGU+ZyYmKGc9ZSk7ZD9wPnQ/YShzLHQpPmEocyxoKSYmKGg9dCk6YSh0LGgpPmEocyxoKSYmKHM9dCk6aD49cz8ocz50JiYocz10KSx0PmgmJihoPXQpKTp0PnA/YShzLHQpPmEocyxoKSYmKGg9dCk6YSh0LGgpPmEocyxoKSYmKHM9dCl9ZWxzZSBuKHQsZSk7bT1yLHA9dH1mdW5jdGlvbiBlKCl7Yi5wb2ludD10fWZ1bmN0aW9uIHIoKXt4WzBdPXMseFsxXT1oLGIucG9pbnQ9bixtPW51bGx9ZnVuY3Rpb24gdShuLGUpe2lmKG0pe3ZhciByPW4tcDt5Kz1nYShyKT4xODA/cisocj4wPzM2MDotMzYwKTpyfWVsc2Ugdj1uLGQ9ZTtNYy5wb2ludChuLGUpLHQobixlKX1mdW5jdGlvbiBpKCl7TWMubGluZVN0YXJ0KCl9ZnVuY3Rpb24gbygpe3UodixkKSxNYy5saW5lRW5kKCksZ2EoeSk+Q2EmJihzPS0oaD0xODApKSx4WzBdPXMseFsxXT1oLG09bnVsbH1mdW5jdGlvbiBhKG4sdCl7cmV0dXJuKHQtPW4pPDA/dCszNjA6dH1mdW5jdGlvbiBjKG4sdCl7cmV0dXJuIG5bMF0tdFswXX1mdW5jdGlvbiBsKG4sdCl7cmV0dXJuIHRbMF08PXRbMV0/dFswXTw9biYmbjw9dFsxXTpuPHRbMF18fHRbMV08bn12YXIgcyxmLGgsZyxwLHYsZCxtLHksTSx4LGI9e3BvaW50Om4sbGluZVN0YXJ0OmUsbGluZUVuZDpyLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2IucG9pbnQ9dSxiLmxpbmVTdGFydD1pLGIubGluZUVuZD1vLHk9MCxNYy5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe01jLnBvbHlnb25FbmQoKSxiLnBvaW50PW4sYi5saW5lU3RhcnQ9ZSxiLmxpbmVFbmQ9ciwwPnljPyhzPS0oaD0xODApLGY9LShnPTkwKSk6eT5DYT9nPTkwOi1DYT55JiYoZj0tOTApLHhbMF09cyx4WzFdPWh9fTtyZXR1cm4gZnVuY3Rpb24obil7Zz1oPS0ocz1mPTEvMCksTT1bXSx0YS5nZW8uc3RyZWFtKG4sYik7dmFyIHQ9TS5sZW5ndGg7aWYodCl7TS5zb3J0KGMpO2Zvcih2YXIgZSxyPTEsdT1NWzBdLGk9W3VdO3Q+cjsrK3IpZT1NW3JdLGwoZVswXSx1KXx8bChlWzFdLHUpPyhhKHVbMF0sZVsxXSk+YSh1WzBdLHVbMV0pJiYodVsxXT1lWzFdKSxhKGVbMF0sdVsxXSk+YSh1WzBdLHVbMV0pJiYodVswXT1lWzBdKSk6aS5wdXNoKHU9ZSk7Zm9yKHZhciBvLGUscD0tMS8wLHQ9aS5sZW5ndGgtMSxyPTAsdT1pW3RdO3Q+PXI7dT1lLCsrcillPWlbcl0sKG89YSh1WzFdLGVbMF0pKT5wJiYocD1vLHM9ZVswXSxoPXVbMV0pfXJldHVybiBNPXg9bnVsbCwxLzA9PT1zfHwxLzA9PT1mP1tbMC8wLDAvMF0sWzAvMCwwLzBdXTpbW3MsZl0sW2gsZ11dfX0oKSx0YS5nZW8uY2VudHJvaWQ9ZnVuY3Rpb24obil7eGM9YmM9X2M9d2M9U2M9a2M9RWM9QWM9TmM9Q2M9emM9MCx0YS5nZW8uc3RyZWFtKG4scWMpO3ZhciB0PU5jLGU9Q2Mscj16Yyx1PXQqdCtlKmUrcipyO3JldHVybiB6YT51JiYodD1rYyxlPUVjLHI9QWMsQ2E+YmMmJih0PV9jLGU9d2Mscj1TYyksdT10KnQrZSplK3Iqcix6YT51KT9bMC8wLDAvMF06W01hdGguYXRhbjIoZSx0KSpQYSx0dChyL01hdGguc3FydCh1KSkqUGFdfTt2YXIgeGMsYmMsX2Msd2MsU2Msa2MsRWMsQWMsTmMsQ2MsemMscWM9e3NwaGVyZTpiLHBvaW50Ol9lLGxpbmVTdGFydDpTZSxsaW5lRW5kOmtlLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3FjLmxpbmVTdGFydD1FZX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3FjLmxpbmVTdGFydD1TZX19LExjPUxlKE5lLFBlLGplLFstcWEsLXFhLzJdKSxUYz0xZTk7dGEuZ2VvLmNsaXBFeHRlbnQ9ZnVuY3Rpb24oKXt2YXIgbix0LGUscix1LGksbz17c3RyZWFtOmZ1bmN0aW9uKG4pe3JldHVybiB1JiYodS52YWxpZD0hMSksdT1pKG4pLHUudmFsaWQ9ITAsdX0sZXh0ZW50OmZ1bmN0aW9uKGEpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPUllKG49K2FbMF1bMF0sdD0rYVswXVsxXSxlPSthWzFdWzBdLHI9K2FbMV1bMV0pLHUmJih1LnZhbGlkPSExLHU9bnVsbCksbyk6W1tuLHRdLFtlLHJdXX19O3JldHVybiBvLmV4dGVudChbWzAsMF0sWzk2MCw1MDBdXSl9LCh0YS5nZW8uY29uaWNFcXVhbEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gWWUoWmUpfSkucmF3PVplLHRhLmdlby5hbGJlcnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFs5NiwwXSkuY2VudGVyKFstLjYsMzguN10pLnBhcmFsbGVscyhbMjkuNSw0NS41XSkuc2NhbGUoMTA3MCl9LHRhLmdlby5hbGJlcnNVc2E9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe3ZhciBpPW5bMF0sbz1uWzFdO3JldHVybiB0PW51bGwsZShpLG8pLHR8fChyKGksbyksdCl8fHUoaSxvKSx0fXZhciB0LGUscix1LGk9dGEuZ2VvLmFsYmVycygpLG89dGEuZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFsxNTQsMF0pLmNlbnRlcihbLTIsNTguNV0pLnBhcmFsbGVscyhbNTUsNjVdKSxhPXRhLmdlby5jb25pY0VxdWFsQXJlYSgpLnJvdGF0ZShbMTU3LDBdKS5jZW50ZXIoWy0zLDE5LjldKS5wYXJhbGxlbHMoWzgsMThdKSxjPXtwb2ludDpmdW5jdGlvbihuLGUpe3Q9W24sZV19fTtyZXR1cm4gbi5pbnZlcnQ9ZnVuY3Rpb24obil7dmFyIHQ9aS5zY2FsZSgpLGU9aS50cmFuc2xhdGUoKSxyPShuWzBdLWVbMF0pL3QsdT0oblsxXS1lWzFdKS90O3JldHVybih1Pj0uMTImJi4yMzQ+dSYmcj49LS40MjUmJi0uMjE0PnI/bzp1Pj0uMTY2JiYuMjM0PnUmJnI+PS0uMjE0JiYtLjExNT5yP2E6aSkuaW52ZXJ0KG4pfSxuLnN0cmVhbT1mdW5jdGlvbihuKXt2YXIgdD1pLnN0cmVhbShuKSxlPW8uc3RyZWFtKG4pLHI9YS5zdHJlYW0obik7cmV0dXJue3BvaW50OmZ1bmN0aW9uKG4sdSl7dC5wb2ludChuLHUpLGUucG9pbnQobix1KSxyLnBvaW50KG4sdSl9LHNwaGVyZTpmdW5jdGlvbigpe3Quc3BoZXJlKCksZS5zcGhlcmUoKSxyLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0LmxpbmVTdGFydCgpLGUubGluZVN0YXJ0KCksci5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpLGUubGluZUVuZCgpLHIubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0LnBvbHlnb25TdGFydCgpLGUucG9seWdvblN0YXJ0KCksci5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3QucG9seWdvbkVuZCgpLGUucG9seWdvbkVuZCgpLHIucG9seWdvbkVuZCgpfX19LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpLnByZWNpc2lvbih0KSxvLnByZWNpc2lvbih0KSxhLnByZWNpc2lvbih0KSxuKTppLnByZWNpc2lvbigpfSxuLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpLnNjYWxlKHQpLG8uc2NhbGUoLjM1KnQpLGEuc2NhbGUodCksbi50cmFuc2xhdGUoaS50cmFuc2xhdGUoKSkpOmkuc2NhbGUoKX0sbi50cmFuc2xhdGU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGkudHJhbnNsYXRlKCk7dmFyIGw9aS5zY2FsZSgpLHM9K3RbMF0sZj0rdFsxXTtyZXR1cm4gZT1pLnRyYW5zbGF0ZSh0KS5jbGlwRXh0ZW50KFtbcy0uNDU1KmwsZi0uMjM4KmxdLFtzKy40NTUqbCxmKy4yMzgqbF1dKS5zdHJlYW0oYykucG9pbnQscj1vLnRyYW5zbGF0ZShbcy0uMzA3KmwsZisuMjAxKmxdKS5jbGlwRXh0ZW50KFtbcy0uNDI1KmwrQ2EsZisuMTIqbCtDYV0sW3MtLjIxNCpsLUNhLGYrLjIzNCpsLUNhXV0pLnN0cmVhbShjKS5wb2ludCx1PWEudHJhbnNsYXRlKFtzLS4yMDUqbCxmKy4yMTIqbF0pLmNsaXBFeHRlbnQoW1tzLS4yMTQqbCtDYSxmKy4xNjYqbCtDYV0sW3MtLjExNSpsLUNhLGYrLjIzNCpsLUNhXV0pLnN0cmVhbShjKS5wb2ludCxufSxuLnNjYWxlKDEwNzApfTt2YXIgUmMsRGMsUGMsVWMsamMsRmMsSGM9e3BvaW50OmIsbGluZVN0YXJ0OmIsbGluZUVuZDpiLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe0RjPTAsSGMubGluZVN0YXJ0PVZlfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7SGMubGluZVN0YXJ0PUhjLmxpbmVFbmQ9SGMucG9pbnQ9YixSYys9Z2EoRGMvMil9fSxPYz17cG9pbnQ6WGUsbGluZVN0YXJ0OmIsbGluZUVuZDpiLHBvbHlnb25TdGFydDpiLHBvbHlnb25FbmQ6Yn0sSWM9e3BvaW50OldlLGxpbmVTdGFydDpKZSxsaW5lRW5kOkdlLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe0ljLmxpbmVTdGFydD1LZX0scG9seWdvbkVuZDpmdW5jdGlvbigpe0ljLnBvaW50PVdlLEljLmxpbmVTdGFydD1KZSxJYy5saW5lRW5kPUdlfX07dGEuZ2VvLnBhdGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe3JldHVybiBuJiYoImZ1bmN0aW9uIj09dHlwZW9mIGEmJmkucG9pbnRSYWRpdXMoK2EuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxvJiZvLnZhbGlkfHwobz11KGkpKSx0YS5nZW8uc3RyZWFtKG4sbykpLGkucmVzdWx0KCl9ZnVuY3Rpb24gdCgpe3JldHVybiBvPW51bGwsbn12YXIgZSxyLHUsaSxvLGE9NC41O3JldHVybiBuLmFyZWE9ZnVuY3Rpb24obil7cmV0dXJuIFJjPTAsdGEuZ2VvLnN0cmVhbShuLHUoSGMpKSxSY30sbi5jZW50cm9pZD1mdW5jdGlvbihuKXtyZXR1cm4gX2M9d2M9U2M9a2M9RWM9QWM9TmM9Q2M9emM9MCx0YS5nZW8uc3RyZWFtKG4sdShJYykpLHpjP1tOYy96YyxDYy96Y106QWM/W2tjL0FjLEVjL0FjXTpTYz9bX2MvU2Msd2MvU2NdOlswLzAsMC8wXX0sbi5ib3VuZHM9ZnVuY3Rpb24obil7cmV0dXJuIGpjPUZjPS0oUGM9VWM9MS8wKSx0YS5nZW8uc3RyZWFtKG4sdShPYykpLFtbUGMsVWNdLFtqYyxGY11dfSxuLnByb2plY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9KGU9bik/bi5zdHJlYW18fHRyKG4pOnksdCgpKTplfSxuLmNvbnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09KHI9bik/bmV3ICRlOm5ldyBRZShuKSwiZnVuY3Rpb24iIT10eXBlb2YgYSYmaS5wb2ludFJhZGl1cyhhKSx0KCkpOnJ9LG4ucG9pbnRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDooaS5wb2ludFJhZGl1cygrdCksK3QpLG4pOmF9LG4ucHJvamVjdGlvbih0YS5nZW8uYWxiZXJzVXNhKCkpLmNvbnRleHQobnVsbCl9LHRhLmdlby50cmFuc2Zvcm09ZnVuY3Rpb24obil7cmV0dXJue3N0cmVhbTpmdW5jdGlvbih0KXt2YXIgZT1uZXcgZXIodCk7Zm9yKHZhciByIGluIG4pZVtyXT1uW3JdO3JldHVybiBlfX19LGVyLnByb3RvdHlwZT17cG9pbnQ6ZnVuY3Rpb24obix0KXt0aGlzLnN0cmVhbS5wb2ludChuLHQpfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX0sdGEuZ2VvLnByb2plY3Rpb249dXIsdGEuZ2VvLnByb2plY3Rpb25NdXRhdG9yPWlyLCh0YS5nZW8uZXF1aXJlY3Rhbmd1bGFyPWZ1bmN0aW9uKCl7cmV0dXJuIHVyKGFyKX0pLnJhdz1hci5pbnZlcnQ9YXIsdGEuZ2VvLnJvdGF0aW9uPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQodCl7cmV0dXJuIHQ9bih0WzBdKkRhLHRbMV0qRGEpLHRbMF0qPVBhLHRbMV0qPVBhLHR9cmV0dXJuIG49bHIoblswXSUzNjAqRGEsblsxXSpEYSxuLmxlbmd0aD4yP25bMl0qRGE6MCksdC5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bi5pbnZlcnQodFswXSpEYSx0WzFdKkRhKSx0WzBdKj1QYSx0WzFdKj1QYSx0fSx0fSxjci5pbnZlcnQ9YXIsdGEuZ2VvLmNpcmNsZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpyLHQ9bHIoLW5bMF0qRGEsLW5bMV0qRGEsMCkuaW52ZXJ0LHU9W107cmV0dXJuIGUobnVsbCxudWxsLDEse3BvaW50OmZ1bmN0aW9uKG4sZSl7dS5wdXNoKG49dChuLGUpKSxuWzBdKj1QYSxuWzFdKj1QYX19KSx7dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W3VdfX12YXIgdCxlLHI9WzAsMF0sdT02O3JldHVybiBuLm9yaWdpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG4uYW5nbGU9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9Z3IoKHQ9K3IpKkRhLHUqRGEpLG4pOnR9LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWdyKHQqRGEsKHU9K3IpKkRhKSxuKTp1fSxuLmFuZ2xlKDkwKX0sdGEuZ2VvLmRpc3RhbmNlPWZ1bmN0aW9uKG4sdCl7dmFyIGUscj0odFswXS1uWzBdKSpEYSx1PW5bMV0qRGEsaT10WzFdKkRhLG89TWF0aC5zaW4ociksYT1NYXRoLmNvcyhyKSxjPU1hdGguc2luKHUpLGw9TWF0aC5jb3ModSkscz1NYXRoLnNpbihpKSxmPU1hdGguY29zKGkpO3JldHVybiBNYXRoLmF0YW4yKE1hdGguc3FydCgoZT1mKm8pKmUrKGU9bCpzLWMqZiphKSplKSxjKnMrbCpmKmEpfSx0YS5nZW8uZ3JhdGljdWxlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe3JldHVybnt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnQoKX19ZnVuY3Rpb24gdCgpe3JldHVybiB0YS5yYW5nZShNYXRoLmNlaWwoaS9kKSpkLHUsZCkubWFwKGgpLmNvbmNhdCh0YS5yYW5nZShNYXRoLmNlaWwobC9tKSptLGMsbSkubWFwKGcpKS5jb25jYXQodGEucmFuZ2UoTWF0aC5jZWlsKHIvcCkqcCxlLHApLmZpbHRlcihmdW5jdGlvbihuKXtyZXR1cm4gZ2EobiVkKT5DYX0pLm1hcChzKSkuY29uY2F0KHRhLnJhbmdlKE1hdGguY2VpbChhL3YpKnYsbyx2KS5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIGdhKG4lbSk+Q2F9KS5tYXAoZikpfXZhciBlLHIsdSxpLG8sYSxjLGwscyxmLGgsZyxwPTEwLHY9cCxkPTkwLG09MzYwLHk9Mi41O3JldHVybiBuLmxpbmVzPWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJue3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOm59fSl9LG4ub3V0bGluZT1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbaChpKS5jb25jYXQoZyhjKS5zbGljZSgxKSxoKHUpLnJldmVyc2UoKS5zbGljZSgxKSxnKGwpLnJldmVyc2UoKS5zbGljZSgxKSldfX0sbi5leHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bi5tYWpvckV4dGVudCh0KS5taW5vckV4dGVudCh0KTpuLm1pbm9yRXh0ZW50KCl9LG4ubWFqb3JFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3RbMF1bMF0sdT0rdFsxXVswXSxsPSt0WzBdWzFdLGM9K3RbMV1bMV0saT51JiYodD1pLGk9dSx1PXQpLGw+YyYmKHQ9bCxsPWMsYz10KSxuLnByZWNpc2lvbih5KSk6W1tpLGxdLFt1LGNdXX0sbi5taW5vckV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdFswXVswXSxlPSt0WzFdWzBdLGE9K3RbMF1bMV0sbz0rdFsxXVsxXSxyPmUmJih0PXIscj1lLGU9dCksYT5vJiYodD1hLGE9byxvPXQpLG4ucHJlY2lzaW9uKHkpKTpbW3IsYV0sW2Usb11dfSxuLnN0ZXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bi5tYWpvclN0ZXAodCkubWlub3JTdGVwKHQpOm4ubWlub3JTdGVwKCl9LG4ubWFqb3JTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPSt0WzBdLG09K3RbMV0sbik6W2QsbV19LG4ubWlub3JTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPSt0WzBdLHY9K3RbMV0sbik6W3Asdl19LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PSt0LHM9dnIoYSxvLDkwKSxmPWRyKHIsZSx5KSxoPXZyKGwsYyw5MCksZz1kcihpLHUseSksbik6eX0sbi5tYWpvckV4dGVudChbWy0xODAsLTkwK0NhXSxbMTgwLDkwLUNhXV0pLm1pbm9yRXh0ZW50KFtbLTE4MCwtODAtQ2FdLFsxODAsODArQ2FdXSl9LHRhLmdlby5ncmVhdEFyYz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXtyZXR1cm57dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6W3R8fHIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGV8fHUuYXBwbHkodGhpcyxhcmd1bWVudHMpXX19dmFyIHQsZSxyPW1yLHU9eXI7cmV0dXJuIG4uZGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuZ2VvLmRpc3RhbmNlKHR8fHIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGV8fHUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sbi5zb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ZSx0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP251bGw6ZSxuKTpyfSxuLnRhcmdldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/bnVsbDp0LG4pOnV9LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bjowfSxufSx0YS5nZW8uaW50ZXJwb2xhdGU9ZnVuY3Rpb24obix0KXtyZXR1cm4gTXIoblswXSpEYSxuWzFdKkRhLHRbMF0qRGEsdFsxXSpEYSl9LHRhLmdlby5sZW5ndGg9ZnVuY3Rpb24obil7cmV0dXJuIFljPTAsdGEuZ2VvLnN0cmVhbShuLFpjKSxZY307dmFyIFljLFpjPXtzcGhlcmU6Yixwb2ludDpiLGxpbmVTdGFydDp4cixsaW5lRW5kOmIscG9seWdvblN0YXJ0OmIscG9seWdvbkVuZDpifSxWYz1icihmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5zcXJ0KDIvKDErbikpfSxmdW5jdGlvbihuKXtyZXR1cm4gMipNYXRoLmFzaW4obi8yKX0pOyh0YS5nZW8uYXppbXV0aGFsRXF1YWxBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIHVyKFZjKX0pLnJhdz1WYzt2YXIgWGM9YnIoZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5hY29zKG4pO3JldHVybiB0JiZ0L01hdGguc2luKHQpfSx5KTsodGEuZ2VvLmF6aW11dGhhbEVxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIHVyKFhjKX0pLnJhdz1YYywodGEuZ2VvLmNvbmljQ29uZm9ybWFsPWZ1bmN0aW9uKCl7cmV0dXJuIFllKF9yKX0pLnJhdz1fciwodGEuZ2VvLmNvbmljRXF1aWRpc3RhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gWWUod3IpfSkucmF3PXdyO3ZhciAkYz1icihmdW5jdGlvbihuKXtyZXR1cm4gMS9ufSxNYXRoLmF0YW4pOyh0YS5nZW8uZ25vbW9uaWM9ZnVuY3Rpb24oKXtyZXR1cm4gdXIoJGMpfSkucmF3PSRjLFNyLmludmVydD1mdW5jdGlvbihuLHQpe3JldHVybltuLDIqTWF0aC5hdGFuKE1hdGguZXhwKHQpKS1SYV19LCh0YS5nZW8ubWVyY2F0b3I9ZnVuY3Rpb24oKXtyZXR1cm4ga3IoU3IpfSkucmF3PVNyO3ZhciBCYz1icihmdW5jdGlvbigpe3JldHVybiAxfSxNYXRoLmFzaW4pOyh0YS5nZW8ub3J0aG9ncmFwaGljPWZ1bmN0aW9uKCl7cmV0dXJuIHVyKEJjKX0pLnJhdz1CYzt2YXIgV2M9YnIoZnVuY3Rpb24obil7cmV0dXJuIDEvKDErbil9LGZ1bmN0aW9uKG4pe3JldHVybiAyKk1hdGguYXRhbihuKX0pOyh0YS5nZW8uc3RlcmVvZ3JhcGhpYz1mdW5jdGlvbigpe3JldHVybiB1cihXYyl9KS5yYXc9V2MsRXIuaW52ZXJ0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuWy10LDIqTWF0aC5hdGFuKE1hdGguZXhwKG4pKS1SYV19LCh0YS5nZW8udHJhbnN2ZXJzZU1lcmNhdG9yPWZ1bmN0aW9uKCl7dmFyIG49a3IoRXIpLHQ9bi5jZW50ZXIsZT1uLnJvdGF0ZTtyZXR1cm4gbi5jZW50ZXI9ZnVuY3Rpb24obil7cmV0dXJuIG4/dChbLW5bMV0sblswXV0pOihuPXQoKSxbblsxXSwtblswXV0pfSxuLnJvdGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gbj9lKFtuWzBdLG5bMV0sbi5sZW5ndGg+Mj9uWzJdKzkwOjkwXSk6KG49ZSgpLFtuWzBdLG5bMV0sblsyXS05MF0pfSxlKFswLDAsOTBdKX0pLnJhdz1Fcix0YS5nZW9tPXt9LHRhLmdlb20uaHVsbD1mdW5jdGlvbihuKXtmdW5jdGlvbiB0KG4pe2lmKG4ubGVuZ3RoPDMpcmV0dXJuW107dmFyIHQsdT1FdChlKSxpPUV0KHIpLG89bi5sZW5ndGgsYT1bXSxjPVtdO2Zvcih0PTA7bz50O3QrKylhLnB1c2goWyt1LmNhbGwodGhpcyxuW3RdLHQpLCtpLmNhbGwodGhpcyxuW3RdLHQpLHRdKTtmb3IoYS5zb3J0KHpyKSx0PTA7bz50O3QrKyljLnB1c2goW2FbdF1bMF0sLWFbdF1bMV1dKTt2YXIgbD1DcihhKSxzPUNyKGMpLGY9c1swXT09PWxbMF0saD1zW3MubGVuZ3RoLTFdPT09bFtsLmxlbmd0aC0xXSxnPVtdO2Zvcih0PWwubGVuZ3RoLTE7dD49MDstLXQpZy5wdXNoKG5bYVtsW3RdXVsyXV0pO2Zvcih0PStmO3Q8cy5sZW5ndGgtaDsrK3QpZy5wdXNoKG5bYVtzW3RdXVsyXV0pO3JldHVybiBnfXZhciBlPUFyLHI9TnI7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dChuKToodC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdCk6ZX0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdCk6cn0sdCl9LHRhLmdlb20ucG9seWdvbj1mdW5jdGlvbihuKXtyZXR1cm4geWEobixKYyksbn07dmFyIEpjPXRhLmdlb20ucG9seWdvbi5wcm90b3R5cGU9W107SmMuYXJlYT1mdW5jdGlvbigpe2Zvcih2YXIgbix0PS0xLGU9dGhpcy5sZW5ndGgscj10aGlzW2UtMV0sdT0wOysrdDxlOyluPXIscj10aGlzW3RdLHUrPW5bMV0qclswXS1uWzBdKnJbMV07cmV0dXJuLjUqdX0sSmMuY2VudHJvaWQ9ZnVuY3Rpb24obil7dmFyIHQsZSxyPS0xLHU9dGhpcy5sZW5ndGgsaT0wLG89MCxhPXRoaXNbdS0xXTtmb3IoYXJndW1lbnRzLmxlbmd0aHx8KG49LTEvKDYqdGhpcy5hcmVhKCkpKTsrK3I8dTspdD1hLGE9dGhpc1tyXSxlPXRbMF0qYVsxXS1hWzBdKnRbMV0saSs9KHRbMF0rYVswXSkqZSxvKz0odFsxXSthWzFdKSplO3JldHVybltpKm4sbypuXX0sSmMuY2xpcD1mdW5jdGlvbihuKXtmb3IodmFyIHQsZSxyLHUsaSxvLGE9VHIobiksYz0tMSxsPXRoaXMubGVuZ3RoLVRyKHRoaXMpLHM9dGhpc1tsLTFdOysrYzxsOyl7Zm9yKHQ9bi5zbGljZSgpLG4ubGVuZ3RoPTAsdT10aGlzW2NdLGk9dFsocj10Lmxlbmd0aC1hKS0xXSxlPS0xOysrZTxyOylvPXRbZV0scXIobyxzLHUpPyhxcihpLHMsdSl8fG4ucHVzaChMcihpLG8scyx1KSksbi5wdXNoKG8pKTpxcihpLHMsdSkmJm4ucHVzaChMcihpLG8scyx1KSksaT1vO2EmJm4ucHVzaChuWzBdKSxzPXV9cmV0dXJuIG59O3ZhciBHYyxLYyxRYyxubCx0bCxlbD1bXSxybD1bXTtPci5wcm90b3R5cGUucHJlcGFyZT1mdW5jdGlvbigpe2Zvcih2YXIgbix0PXRoaXMuZWRnZXMsZT10Lmxlbmd0aDtlLS07KW49dFtlXS5lZGdlLG4uYiYmbi5hfHx0LnNwbGljZShlLDEpO3JldHVybiB0LnNvcnQoWXIpLHQubGVuZ3RofSxRci5wcm90b3R5cGU9e3N0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZS5sPT09dGhpcy5zaXRlP3RoaXMuZWRnZS5hOnRoaXMuZWRnZS5ifSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGdlLmw9PT10aGlzLnNpdGU/dGhpcy5lZGdlLmI6dGhpcy5lZGdlLmF9fSxudS5wcm90b3R5cGU9e2luc2VydDpmdW5jdGlvbihuLHQpe3ZhciBlLHIsdTtpZihuKXtpZih0LlA9bix0Lk49bi5OLG4uTiYmKG4uTi5QPXQpLG4uTj10LG4uUil7Zm9yKG49bi5SO24uTDspbj1uLkw7bi5MPXR9ZWxzZSBuLlI9dDtlPW59ZWxzZSB0aGlzLl8/KG49dXUodGhpcy5fKSx0LlA9bnVsbCx0Lk49bixuLlA9bi5MPXQsZT1uKToodC5QPXQuTj1udWxsLHRoaXMuXz10LGU9bnVsbCk7Zm9yKHQuTD10LlI9bnVsbCx0LlU9ZSx0LkM9ITAsbj10O2UmJmUuQzspcj1lLlUsZT09PXIuTD8odT1yLlIsdSYmdS5DPyhlLkM9dS5DPSExLHIuQz0hMCxuPXIpOihuPT09ZS5SJiYoZXUodGhpcyxlKSxuPWUsZT1uLlUpLGUuQz0hMSxyLkM9ITAscnUodGhpcyxyKSkpOih1PXIuTCx1JiZ1LkM/KGUuQz11LkM9ITEsci5DPSEwLG49cik6KG49PT1lLkwmJihydSh0aGlzLGUpLG49ZSxlPW4uVSksZS5DPSExLHIuQz0hMCxldSh0aGlzLHIpKSksZT1uLlU7dGhpcy5fLkM9ITF9LHJlbW92ZTpmdW5jdGlvbihuKXtuLk4mJihuLk4uUD1uLlApLG4uUCYmKG4uUC5OPW4uTiksbi5OPW4uUD1udWxsO3ZhciB0LGUscix1PW4uVSxpPW4uTCxvPW4uUjtpZihlPWk/bz91dShvKTppOm8sdT91Lkw9PT1uP3UuTD1lOnUuUj1lOnRoaXMuXz1lLGkmJm8/KHI9ZS5DLGUuQz1uLkMsZS5MPWksaS5VPWUsZSE9PW8/KHU9ZS5VLGUuVT1uLlUsbj1lLlIsdS5MPW4sZS5SPW8sby5VPWUpOihlLlU9dSx1PWUsbj1lLlIpKToocj1uLkMsbj1lKSxuJiYobi5VPXUpLCFyKXtpZihuJiZuLkMpcmV0dXJuIHZvaWQobi5DPSExKTtkb3tpZihuPT09dGhpcy5fKWJyZWFrO2lmKG49PT11Lkwpe2lmKHQ9dS5SLHQuQyYmKHQuQz0hMSx1LkM9ITAsZXUodGhpcyx1KSx0PXUuUiksdC5MJiZ0LkwuQ3x8dC5SJiZ0LlIuQyl7dC5SJiZ0LlIuQ3x8KHQuTC5DPSExLHQuQz0hMCxydSh0aGlzLHQpLHQ9dS5SKSx0LkM9dS5DLHUuQz10LlIuQz0hMSxldSh0aGlzLHUpLG49dGhpcy5fO2JyZWFrfX1lbHNlIGlmKHQ9dS5MLHQuQyYmKHQuQz0hMSx1LkM9ITAscnUodGhpcyx1KSx0PXUuTCksdC5MJiZ0LkwuQ3x8dC5SJiZ0LlIuQyl7dC5MJiZ0LkwuQ3x8KHQuUi5DPSExLHQuQz0hMCxldSh0aGlzLHQpLHQ9dS5MKSx0LkM9dS5DLHUuQz10LkwuQz0hMSxydSh0aGlzLHUpLG49dGhpcy5fO2JyZWFrfXQuQz0hMCxuPXUsdT11LlV9d2hpbGUoIW4uQyk7biYmKG4uQz0hMSl9fX0sdGEuZ2VvbS52b3Jvbm9pPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQobil7dmFyIHQ9bmV3IEFycmF5KG4ubGVuZ3RoKSxyPWFbMF1bMF0sdT1hWzBdWzFdLGk9YVsxXVswXSxvPWFbMV1bMV07cmV0dXJuIGl1KGUobiksYSkuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihlLGEpe3ZhciBjPWUuZWRnZXMsbD1lLnNpdGUscz10W2FdPWMubGVuZ3RoP2MubWFwKGZ1bmN0aW9uKG4pe3ZhciB0PW4uc3RhcnQoKTtyZXR1cm5bdC54LHQueV19KTpsLng+PXImJmwueDw9aSYmbC55Pj11JiZsLnk8PW8/W1tyLG9dLFtpLG9dLFtpLHVdLFtyLHVdXTpbXTtzLnBvaW50PW5bYV19KSx0fWZ1bmN0aW9uIGUobil7cmV0dXJuIG4ubWFwKGZ1bmN0aW9uKG4sdCl7cmV0dXJue3g6TWF0aC5yb3VuZChpKG4sdCkvQ2EpKkNhLHk6TWF0aC5yb3VuZChvKG4sdCkvQ2EpKkNhLGk6dH19KX12YXIgcj1Bcix1PU5yLGk9cixvPXUsYT11bDtyZXR1cm4gbj90KG4pOih0LmxpbmtzPWZ1bmN0aW9uKG4pe3JldHVybiBpdShlKG4pKS5lZGdlcy5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIG4ubCYmbi5yfSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybntzb3VyY2U6blt0LmwuaV0sdGFyZ2V0Om5bdC5yLmldfX0pfSx0LnRyaWFuZ2xlcz1mdW5jdGlvbihuKXt2YXIgdD1bXTtyZXR1cm4gaXUoZShuKSkuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihlLHIpe2Zvcih2YXIgdSxpLG89ZS5zaXRlLGE9ZS5lZGdlcy5zb3J0KFlyKSxjPS0xLGw9YS5sZW5ndGgscz1hW2wtMV0uZWRnZSxmPXMubD09PW8/cy5yOnMubDsrK2M8bDspdT1zLGk9ZixzPWFbY10uZWRnZSxmPXMubD09PW8/cy5yOnMubCxyPGkuaSYmcjxmLmkmJmF1KG8saSxmKTwwJiZ0LnB1c2goW25bcl0sbltpLmldLG5bZi5pXV0pfSksdH0sdC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPUV0KHI9biksdCk6cn0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPUV0KHU9biksdCk6dX0sdC5jbGlwRXh0ZW50PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPW51bGw9PW4/dWw6bix0KTphPT09dWw/bnVsbDphfSx0LnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dC5jbGlwRXh0ZW50KG4mJltbMCwwXSxuXSk6YT09PXVsP251bGw6YSYmYVsxXX0sdCl9O3ZhciB1bD1bWy0xZTYsLTFlNl0sWzFlNiwxZTZdXTt0YS5nZW9tLmRlbGF1bmF5PWZ1bmN0aW9uKG4pe3JldHVybiB0YS5nZW9tLnZvcm9ub2koKS50cmlhbmdsZXMobil9LHRhLmdlb20ucXVhZHRyZWU9ZnVuY3Rpb24obix0LGUscix1KXtmdW5jdGlvbiBpKG4pe2Z1bmN0aW9uIGkobix0LGUscix1LGksbyxhKXtpZighaXNOYU4oZSkmJiFpc05hTihyKSlpZihuLmxlYWYpe3ZhciBjPW4ueCxzPW4ueTtpZihudWxsIT1jKWlmKGdhKGMtZSkrZ2Eocy1yKTwuMDEpbChuLHQsZSxyLHUsaSxvLGEpO2Vsc2V7dmFyIGY9bi5wb2ludDtuLng9bi55PW4ucG9pbnQ9bnVsbCxsKG4sZixjLHMsdSxpLG8sYSksbChuLHQsZSxyLHUsaSxvLGEpfWVsc2Ugbi54PWUsbi55PXIsbi5wb2ludD10fWVsc2UgbChuLHQsZSxyLHUsaSxvLGEpfWZ1bmN0aW9uIGwobix0LGUscix1LG8sYSxjKXt2YXIgbD0uNSoodSthKSxzPS41KihvK2MpLGY9ZT49bCxoPXI+PXMsZz1oPDwxfGY7bi5sZWFmPSExLG49bi5ub2Rlc1tnXXx8KG4ubm9kZXNbZ109c3UoKSksZj91PWw6YT1sLGg/bz1zOmM9cyxpKG4sdCxlLHIsdSxvLGEsYyl9dmFyIHMsZixoLGcscCx2LGQsbSx5LE09RXQoYSkseD1FdChjKTtpZihudWxsIT10KXY9dCxkPWUsbT1yLHk9dTtlbHNlIGlmKG09eT0tKHY9ZD0xLzApLGY9W10saD1bXSxwPW4ubGVuZ3RoLG8pZm9yKGc9MDtwPmc7KytnKXM9bltnXSxzLng8diYmKHY9cy54KSxzLnk8ZCYmKGQ9cy55KSxzLng+bSYmKG09cy54KSxzLnk+eSYmKHk9cy55KSxmLnB1c2gocy54KSxoLnB1c2gocy55KTtlbHNlIGZvcihnPTA7cD5nOysrZyl7dmFyIGI9K00ocz1uW2ddLGcpLF89K3gocyxnKTt2PmImJih2PWIpLGQ+XyYmKGQ9XyksYj5tJiYobT1iKSxfPnkmJih5PV8pLGYucHVzaChiKSxoLnB1c2goXyl9dmFyIHc9bS12LFM9eS1kO3c+Uz95PWQrdzptPXYrUzt2YXIgaz1zdSgpO2lmKGsuYWRkPWZ1bmN0aW9uKG4pe2koayxuLCtNKG4sKytnKSwreChuLGcpLHYsZCxtLHkpfSxrLnZpc2l0PWZ1bmN0aW9uKG4pe2Z1KG4sayx2LGQsbSx5KX0say5maW5kPWZ1bmN0aW9uKG4pe3JldHVybiBodShrLG5bMF0sblsxXSx2LGQsbSx5KX0sZz0tMSxudWxsPT10KXtmb3IoOysrZzxwOylpKGssbltnXSxmW2ddLGhbZ10sdixkLG0seSk7LS1nfWVsc2Ugbi5mb3JFYWNoKGsuYWRkKTtyZXR1cm4gZj1oPW49cz1udWxsLGt9dmFyIG8sYT1BcixjPU5yO3JldHVybihvPWFyZ3VtZW50cy5sZW5ndGgpPyhhPWN1LGM9bHUsMz09PW8mJih1PWUscj10LGU9dD0wKSxpKG4pKTooaS54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPW4saSk6YX0saS55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW4saSk6Y30saS5leHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PW4/dD1lPXI9dT1udWxsOih0PStuWzBdWzBdLGU9K25bMF1bMV0scj0rblsxXVswXSx1PStuWzFdWzFdKSxpKTpudWxsPT10P251bGw6W1t0LGVdLFtyLHVdXX0saS5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT1uP3Q9ZT1yPXU9bnVsbDoodD1lPTAscj0rblswXSx1PStuWzFdKSxpKTpudWxsPT10P251bGw6W3ItdCx1LWVdfSxpKX0sdGEuaW50ZXJwb2xhdGVSZ2I9Z3UsdGEuaW50ZXJwb2xhdGVPYmplY3Q9cHUsdGEuaW50ZXJwb2xhdGVOdW1iZXI9dnUsdGEuaW50ZXJwb2xhdGVTdHJpbmc9ZHU7dmFyIGlsPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxvbD1uZXcgUmVnRXhwKGlsLnNvdXJjZSwiZyIpO3RhLmludGVycG9sYXRlPW11LHRhLmludGVycG9sYXRvcnM9W2Z1bmN0aW9uKG4sdCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuKCJzdHJpbmciPT09ZT9HYS5oYXModCl8fC9eKCN8cmdiXCh8aHNsXCgpLy50ZXN0KHQpP2d1OmR1OnQgaW5zdGFuY2VvZiBvdD9ndTpBcnJheS5pc0FycmF5KHQpP3l1OiJvYmplY3QiPT09ZSYmaXNOYU4odCk/cHU6dnUpKG4sdCl9XSx0YS5pbnRlcnBvbGF0ZUFycmF5PXl1O3ZhciBhbD1mdW5jdGlvbigpe3JldHVybiB5fSxjbD10YS5tYXAoe2xpbmVhcjphbCxwb2x5Omt1LHF1YWQ6ZnVuY3Rpb24oKXtyZXR1cm4gX3V9LGN1YmljOmZ1bmN0aW9uKCl7cmV0dXJuIHd1fSxzaW46ZnVuY3Rpb24oKXtyZXR1cm4gRXV9LGV4cDpmdW5jdGlvbigpe3JldHVybiBBdX0sY2lyY2xlOmZ1bmN0aW9uKCl7cmV0dXJuIE51fSxlbGFzdGljOkN1LGJhY2s6enUsYm91bmNlOmZ1bmN0aW9uKCl7cmV0dXJuIHF1fX0pLGxsPXRhLm1hcCh7ImluIjp5LG91dDp4dSwiaW4tb3V0IjpidSwib3V0LWluIjpmdW5jdGlvbihuKXtyZXR1cm4gYnUoeHUobikpfX0pO3RhLmVhc2U9ZnVuY3Rpb24obil7dmFyIHQ9bi5pbmRleE9mKCItIiksZT10Pj0wP24uc2xpY2UoMCx0KTpuLHI9dD49MD9uLnNsaWNlKHQrMSk6ImluIjtyZXR1cm4gZT1jbC5nZXQoZSl8fGFsLHI9bGwuZ2V0KHIpfHx5LE11KHIoZS5hcHBseShudWxsLGVhLmNhbGwoYXJndW1lbnRzLDEpKSkpfSx0YS5pbnRlcnBvbGF0ZUhjbD1MdSx0YS5pbnRlcnBvbGF0ZUhzbD1UdSx0YS5pbnRlcnBvbGF0ZUxhYj1SdSx0YS5pbnRlcnBvbGF0ZVJvdW5kPUR1LHRhLnRyYW5zZm9ybT1mdW5jdGlvbihuKXt2YXIgdD11YS5jcmVhdGVFbGVtZW50TlModGEubnMucHJlZml4LnN2ZywiZyIpO3JldHVybih0YS50cmFuc2Zvcm09ZnVuY3Rpb24obil7aWYobnVsbCE9bil7dC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsbik7dmFyIGU9dC50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpfXJldHVybiBuZXcgUHUoZT9lLm1hdHJpeDpzbCl9KShuKX0sUHUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK3RoaXMudHJhbnNsYXRlKyIpcm90YXRlKCIrdGhpcy5yb3RhdGUrIilza2V3WCgiK3RoaXMuc2tldysiKXNjYWxlKCIrdGhpcy5zY2FsZSsiKSJ9O3ZhciBzbD17YToxLGI6MCxjOjAsZDoxLGU6MCxmOjB9O3RhLmludGVycG9sYXRlVHJhbnNmb3JtPUh1LHRhLmxheW91dD17fSx0YS5sYXlvdXQuYnVuZGxlPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKG4pe2Zvcih2YXIgdD1bXSxlPS0xLHI9bi5sZW5ndGg7KytlPHI7KXQucHVzaChZdShuW2VdKSk7cmV0dXJuIHR9fSx0YS5sYXlvdXQuY2hvcmQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7dmFyIG4sbCxmLGgsZyxwPXt9LHY9W10sZD10YS5yYW5nZShpKSxtPVtdO2ZvcihlPVtdLHI9W10sbj0wLGg9LTE7KytoPGk7KXtmb3IobD0wLGc9LTE7KytnPGk7KWwrPXVbaF1bZ107di5wdXNoKGwpLG0ucHVzaCh0YS5yYW5nZShpKSksbis9bH1mb3IobyYmZC5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIG8odltuXSx2W3RdKX0pLGEmJm0uZm9yRWFjaChmdW5jdGlvbihuLHQpe24uc29ydChmdW5jdGlvbihuLGUpe3JldHVybiBhKHVbdF1bbl0sdVt0XVtlXSl9KX0pLG49KExhLXMqaSkvbixsPTAsaD0tMTsrK2g8aTspe2ZvcihmPWwsZz0tMTsrK2c8aTspe3ZhciB5PWRbaF0sTT1tW3ldW2ddLHg9dVt5XVtNXSxiPWwsXz1sKz14Km47cFt5KyItIitNXT17aW5kZXg6eSxzdWJpbmRleDpNLHN0YXJ0QW5nbGU6YixlbmRBbmdsZTpfLHZhbHVlOnh9fXJbeV09e2luZGV4Onksc3RhcnRBbmdsZTpmLGVuZEFuZ2xlOmwsdmFsdWU6KGwtZikvbn0sbCs9c31mb3IoaD0tMTsrK2g8aTspZm9yKGc9aC0xOysrZzxpOyl7dmFyIHc9cFtoKyItIitnXSxTPXBbZysiLSIraF07KHcudmFsdWV8fFMudmFsdWUpJiZlLnB1c2gody52YWx1ZTxTLnZhbHVlP3tzb3VyY2U6Uyx0YXJnZXQ6d306e3NvdXJjZTp3LHRhcmdldDpTfSl9YyYmdCgpfWZ1bmN0aW9uIHQoKXtlLnNvcnQoZnVuY3Rpb24obix0KXtyZXR1cm4gYygobi5zb3VyY2UudmFsdWUrbi50YXJnZXQudmFsdWUpLzIsKHQuc291cmNlLnZhbHVlK3QudGFyZ2V0LnZhbHVlKS8yKX0pfXZhciBlLHIsdSxpLG8sYSxjLGw9e30scz0wO3JldHVybiBsLm1hdHJpeD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0odT1uKSYmdS5sZW5ndGgsZT1yPW51bGwsbCk6dX0sbC5wYWRkaW5nPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPW4sZT1yPW51bGwsbCk6c30sbC5zb3J0R3JvdXBzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW4sZT1yPW51bGwsbCk6b30sbC5zb3J0U3ViZ3JvdXBzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPW4sZT1udWxsLGwpOmF9LGwuc29ydENob3Jkcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1uLGUmJnQoKSxsKTpjfSxsLmNob3Jkcz1mdW5jdGlvbigpe3JldHVybiBlfHxuKCksZX0sbC5ncm91cHM9ZnVuY3Rpb24oKXtyZXR1cm4gcnx8bigpLHJ9LGx9LHRhLmxheW91dC5mb3JjZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyLHUpe2lmKHQucG9pbnQhPT1uKXt2YXIgaT10LmN4LW4ueCxvPXQuY3ktbi55LGE9dS1lLGM9aSppK28qbztpZihjPmEqYS9kKXtpZihwPmMpe3ZhciBsPXQuY2hhcmdlL2M7bi5weC09aSpsLG4ucHktPW8qbH1yZXR1cm4hMH1pZih0LnBvaW50JiZjJiZwPmMpe3ZhciBsPXQucG9pbnRDaGFyZ2UvYztuLnB4LT1pKmwsbi5weS09bypsfX1yZXR1cm4hdC5jaGFyZ2V9fWZ1bmN0aW9uIHQobil7bi5weD10YS5ldmVudC54LG4ucHk9dGEuZXZlbnQueSxhLnJlc3VtZSgpfXZhciBlLHIsdSxpLG8sYT17fSxjPXRhLmRpc3BhdGNoKCJzdGFydCIsInRpY2siLCJlbmQiKSxsPVsxLDFdLHM9LjksZj1mbCxoPWhsLGc9LTMwLHA9Z2wsdj0uMSxkPS42NCxtPVtdLE09W107cmV0dXJuIGEudGljaz1mdW5jdGlvbigpe2lmKChyKj0uOTkpPC4wMDUpcmV0dXJuIGMuZW5kKHt0eXBlOiJlbmQiLGFscGhhOnI9MH0pLCEwO3ZhciB0LGUsYSxmLGgscCxkLHkseCxiPW0ubGVuZ3RoLF89TS5sZW5ndGg7Zm9yKGU9MDtfPmU7KytlKWE9TVtlXSxmPWEuc291cmNlLGg9YS50YXJnZXQseT1oLngtZi54LHg9aC55LWYueSwocD15KnkreCp4KSYmKHA9cippW2VdKigocD1NYXRoLnNxcnQocCkpLXVbZV0pL3AseSo9cCx4Kj1wLGgueC09eSooZD1mLndlaWdodC8oaC53ZWlnaHQrZi53ZWlnaHQpKSxoLnktPXgqZCxmLngrPXkqKGQ9MS1kKSxmLnkrPXgqZCk7aWYoKGQ9cip2KSYmKHk9bFswXS8yLHg9bFsxXS8yLGU9LTEsZCkpZm9yKDsrK2U8YjspYT1tW2VdLGEueCs9KHktYS54KSpkLGEueSs9KHgtYS55KSpkO2lmKGcpZm9yKEp1KHQ9dGEuZ2VvbS5xdWFkdHJlZShtKSxyLG8pLGU9LTE7KytlPGI7KShhPW1bZV0pLmZpeGVkfHx0LnZpc2l0KG4oYSkpO2ZvcihlPS0xOysrZTxiOylhPW1bZV0sYS5maXhlZD8oYS54PWEucHgsYS55PWEucHkpOihhLngtPShhLnB4LShhLnB4PWEueCkpKnMsYS55LT0oYS5weS0oYS5weT1hLnkpKSpzKTtjLnRpY2soe3R5cGU6InRpY2siLGFscGhhOnJ9KX0sYS5ub2Rlcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT1uLGEpOm19LGEubGlua3M9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KE09bixhKTpNfSxhLnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9bixhKTpsfSxhLmxpbmtEaXN0YW5jZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOituLGEpOmZ9LGEuZGlzdGFuY2U9YS5saW5rRGlzdGFuY2UsYS5saW5rU3RyZW5ndGg9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjorbixhKTpofSxhLmZyaWN0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPStuLGEpOnN9LGEuY2hhcmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246K24sYSk6Z30sYS5jaGFyZ2VEaXN0YW5jZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD1uKm4sYSk6TWF0aC5zcXJ0KHApfSxhLmdyYXZpdHk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9K24sYSk6dn0sYS50aGV0YT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1uKm4sYSk6TWF0aC5zcXJ0KGQpfSxhLmFscGhhPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStuLHI/cj1uPjA/bjowOm4+MCYmKGMuc3RhcnQoe3R5cGU6InN0YXJ0IixhbHBoYTpyPW59KSx0YS50aW1lcihhLnRpY2spKSxhKTpyfSxhLnN0YXJ0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHIpe2lmKCFlKXtmb3IoZT1uZXcgQXJyYXkoYyksYT0wO2M+YTsrK2EpZVthXT1bXTtmb3IoYT0wO3M+YTsrK2Epe3ZhciB1PU1bYV07ZVt1LnNvdXJjZS5pbmRleF0ucHVzaCh1LnRhcmdldCksZVt1LnRhcmdldC5pbmRleF0ucHVzaCh1LnNvdXJjZSl9fWZvcih2YXIgaSxvPWVbdF0sYT0tMSxsPW8ubGVuZ3RoOysrYTxsOylpZighaXNOYU4oaT1vW2FdW25dKSlyZXR1cm4gaTtyZXR1cm4gTWF0aC5yYW5kb20oKSpyfXZhciB0LGUscixjPW0ubGVuZ3RoLHM9TS5sZW5ndGgscD1sWzBdLHY9bFsxXTtmb3IodD0wO2M+dDsrK3QpKHI9bVt0XSkuaW5kZXg9dCxyLndlaWdodD0wO2Zvcih0PTA7cz50OysrdClyPU1bdF0sIm51bWJlciI9PXR5cGVvZiByLnNvdXJjZSYmKHIuc291cmNlPW1bci5zb3VyY2VdKSwibnVtYmVyIj09dHlwZW9mIHIudGFyZ2V0JiYoci50YXJnZXQ9bVtyLnRhcmdldF0pLCsrci5zb3VyY2Uud2VpZ2h0LCsrci50YXJnZXQud2VpZ2h0O2Zvcih0PTA7Yz50OysrdClyPW1bdF0saXNOYU4oci54KSYmKHIueD1uKCJ4IixwKSksaXNOYU4oci55KSYmKHIueT1uKCJ5Iix2KSksaXNOYU4oci5weCkmJihyLnB4PXIueCksaXNOYU4oci5weSkmJihyLnB5PXIueSk7aWYodT1bXSwiZnVuY3Rpb24iPT10eXBlb2YgZilmb3IodD0wO3M+dDsrK3QpdVt0XT0rZi5jYWxsKHRoaXMsTVt0XSx0KTtlbHNlIGZvcih0PTA7cz50OysrdCl1W3RdPWY7aWYoaT1bXSwiZnVuY3Rpb24iPT10eXBlb2YgaClmb3IodD0wO3M+dDsrK3QpaVt0XT0raC5jYWxsKHRoaXMsTVt0XSx0KTtlbHNlIGZvcih0PTA7cz50OysrdClpW3RdPWg7aWYobz1bXSwiZnVuY3Rpb24iPT10eXBlb2YgZylmb3IodD0wO2M+dDsrK3Qpb1t0XT0rZy5jYWxsKHRoaXMsbVt0XSx0KTtlbHNlIGZvcih0PTA7Yz50OysrdClvW3RdPWc7cmV0dXJuIGEucmVzdW1lKCl9LGEucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIGEuYWxwaGEoLjEpfSxhLnN0b3A9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hbHBoYSgwKX0sYS5kcmFnPWZ1bmN0aW9uKCl7cmV0dXJuIGV8fChlPXRhLmJlaGF2aW9yLmRyYWcoKS5vcmlnaW4oeSkub24oImRyYWdzdGFydC5mb3JjZSIsWHUpLm9uKCJkcmFnLmZvcmNlIix0KS5vbigiZHJhZ2VuZC5mb3JjZSIsJHUpKSxhcmd1bWVudHMubGVuZ3RoP3ZvaWQgdGhpcy5vbigibW91c2VvdmVyLmZvcmNlIixCdSkub24oIm1vdXNlb3V0LmZvcmNlIixXdSkuY2FsbChlKTplfSx0YS5yZWJpbmQoYSxjLCJvbiIpfTt2YXIgZmw9MjAsaGw9MSxnbD0xLzA7dGEubGF5b3V0LmhpZXJhcmNoeT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odSl7dmFyIGksbz1bdV0sYT1bXTtmb3IodS5kZXB0aD0wO251bGwhPShpPW8ucG9wKCkpOylpZihhLnB1c2goaSksKGw9ZS5jYWxsKG4saSxpLmRlcHRoKSkmJihjPWwubGVuZ3RoKSl7Zm9yKHZhciBjLGwsczstLWM+PTA7KW8ucHVzaChzPWxbY10pLHMucGFyZW50PWkscy5kZXB0aD1pLmRlcHRoKzE7ciYmKGkudmFsdWU9MCksaS5jaGlsZHJlbj1sfWVsc2UgciYmKGkudmFsdWU9K3IuY2FsbChuLGksaS5kZXB0aCl8fDApLGRlbGV0ZSBpLmNoaWxkcmVuO3JldHVybiBRdSh1LGZ1bmN0aW9uKG4pe3ZhciBlLHU7dCYmKGU9bi5jaGlsZHJlbikmJmUuc29ydCh0KSxyJiYodT1uLnBhcmVudCkmJih1LnZhbHVlKz1uLnZhbHVlKX0pLGF9dmFyIHQ9ZWksZT1uaSxyPXRpO3JldHVybiBuLnNvcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLmNoaWxkcmVuPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbik6ZX0sbi52YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG4ucmV2YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gciYmKEt1KHQsZnVuY3Rpb24obil7bi5jaGlsZHJlbiYmKG4udmFsdWU9MCl9KSxRdSh0LGZ1bmN0aW9uKHQpe3ZhciBlO3QuY2hpbGRyZW58fCh0LnZhbHVlPStyLmNhbGwobix0LHQuZGVwdGgpfHwwKSwoZT10LnBhcmVudCkmJihlLnZhbHVlKz10LnZhbHVlKX0pKSx0fSxufSx0YS5sYXlvdXQucGFydGl0aW9uPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih0LGUscix1KXt2YXIgaT10LmNoaWxkcmVuO2lmKHQueD1lLHQueT10LmRlcHRoKnUsdC5keD1yLHQuZHk9dSxpJiYobz1pLmxlbmd0aCkpe3ZhciBvLGEsYyxsPS0xO2ZvcihyPXQudmFsdWU/ci90LnZhbHVlOjA7KytsPG87KW4oYT1pW2xdLGUsYz1hLnZhbHVlKnIsdSksZSs9Y319ZnVuY3Rpb24gdChuKXt2YXIgZT1uLmNoaWxkcmVuLHI9MDtpZihlJiYodT1lLmxlbmd0aCkpZm9yKHZhciB1LGk9LTE7KytpPHU7KXI9TWF0aC5tYXgocix0KGVbaV0pKTtyZXR1cm4gMStyfWZ1bmN0aW9uIGUoZSxpKXt2YXIgbz1yLmNhbGwodGhpcyxlLGkpO3JldHVybiBuKG9bMF0sMCx1WzBdLHVbMV0vdChvWzBdKSksb312YXIgcj10YS5sYXlvdXQuaGllcmFyY2h5KCksdT1bMSwxXTtyZXR1cm4gZS5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW4sZSk6dX0sR3UoZSxyKX0sdGEubGF5b3V0LnBpZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obyl7dmFyIGEsYz1vLmxlbmd0aCxsPW8ubWFwKGZ1bmN0aW9uKGUscil7cmV0dXJuK3QuY2FsbChuLGUscil9KSxzPSsoImZ1bmN0aW9uIj09dHlwZW9mIHI/ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ciksZj0oImZ1bmN0aW9uIj09dHlwZW9mIHU/dS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dSktcyxoPU1hdGgubWluKE1hdGguYWJzKGYpL2MsKygiZnVuY3Rpb24iPT10eXBlb2YgaT9pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTppKSksZz1oKigwPmY/LTE6MSkscD0oZi1jKmcpL3RhLnN1bShsKSx2PXRhLnJhbmdlKGMpLGQ9W107cmV0dXJuIG51bGwhPWUmJnYuc29ydChlPT09cGw/ZnVuY3Rpb24obix0KXtyZXR1cm4gbFt0XS1sW25dfTpmdW5jdGlvbihuLHQpe3JldHVybiBlKG9bbl0sb1t0XSl9KSx2LmZvckVhY2goZnVuY3Rpb24obil7ZFtuXT17ZGF0YTpvW25dLHZhbHVlOmE9bFtuXSxzdGFydEFuZ2xlOnMsZW5kQW5nbGU6cys9YSpwK2cscGFkQW5nbGU6aH19KSxkfXZhciB0PU51bWJlcixlPXBsLHI9MCx1PUxhLGk9MDtyZXR1cm4gbi52YWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLG4pOnR9LG4uc29ydD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4uc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG4uZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxuKTp1fSxuLnBhZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbik6aX0sbn07dmFyIHBsPXt9O3RhLmxheW91dC5zdGFjaz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oYSxjKXtpZighKGg9YS5sZW5ndGgpKXJldHVybiBhO3ZhciBsPWEubWFwKGZ1bmN0aW9uKGUscil7cmV0dXJuIHQuY2FsbChuLGUscil9KSxzPWwubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm1hcChmdW5jdGlvbih0LGUpe3JldHVybltpLmNhbGwobix0LGUpLG8uY2FsbChuLHQsZSldfSl9KSxmPWUuY2FsbChuLHMsYyk7bD10YS5wZXJtdXRlKGwsZikscz10YS5wZXJtdXRlKHMsZik7dmFyIGgsZyxwLHYsZD1yLmNhbGwobixzLGMpLG09bFswXS5sZW5ndGg7Zm9yKHA9MDttPnA7KytwKWZvcih1LmNhbGwobixsWzBdW3BdLHY9ZFtwXSxzWzBdW3BdWzFdKSxnPTE7aD5nOysrZyl1LmNhbGwobixsW2ddW3BdLHYrPXNbZy0xXVtwXVsxXSxzW2ddW3BdWzFdKTtyZXR1cm4gYX12YXIgdD15LGU9YWkscj1jaSx1PW9pLGk9dWksbz1paTtyZXR1cm4gbi52YWx1ZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLm9yZGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6dmwuZ2V0KHQpfHxhaSxuKTplfSxuLm9mZnNldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmRsLmdldCh0KXx8Y2ksbik6cn0sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbik6aX0sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXQsbik6b30sbi5vdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxuKTp1fSxufTt2YXIgdmw9dGEubWFwKHsiaW5zaWRlLW91dCI6ZnVuY3Rpb24obil7dmFyIHQsZSxyPW4ubGVuZ3RoLHU9bi5tYXAobGkpLGk9bi5tYXAoc2kpLG89dGEucmFuZ2Uocikuc29ydChmdW5jdGlvbihuLHQpe3JldHVybiB1W25dLXVbdF19KSxhPTAsYz0wLGw9W10scz1bXTtmb3IodD0wO3I+dDsrK3QpZT1vW3RdLGM+YT8oYSs9aVtlXSxsLnB1c2goZSkpOihjKz1pW2VdLHMucHVzaChlKSk7cmV0dXJuIHMucmV2ZXJzZSgpLmNvbmNhdChsKX0scmV2ZXJzZTpmdW5jdGlvbihuKXtyZXR1cm4gdGEucmFuZ2Uobi5sZW5ndGgpLnJldmVyc2UoKX0sImRlZmF1bHQiOmFpfSksZGw9dGEubWFwKHtzaWxob3VldHRlOmZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PW4ubGVuZ3RoLGk9blswXS5sZW5ndGgsbz1bXSxhPTAsYz1bXTtmb3IoZT0wO2k+ZTsrK2Upe2Zvcih0PTAscj0wO3U+dDt0Kyspcis9blt0XVtlXVsxXTtyPmEmJihhPXIpLG8ucHVzaChyKX1mb3IoZT0wO2k+ZTsrK2UpY1tlXT0oYS1vW2VdKS8yO3JldHVybiBjfSx3aWdnbGU6ZnVuY3Rpb24obil7dmFyIHQsZSxyLHUsaSxvLGEsYyxsLHM9bi5sZW5ndGgsZj1uWzBdLGg9Zi5sZW5ndGgsZz1bXTtmb3IoZ1swXT1jPWw9MCxlPTE7aD5lOysrZSl7Zm9yKHQ9MCx1PTA7cz50OysrdCl1Kz1uW3RdW2VdWzFdO2Zvcih0PTAsaT0wLGE9ZltlXVswXS1mW2UtMV1bMF07cz50OysrdCl7Zm9yKHI9MCxvPShuW3RdW2VdWzFdLW5bdF1bZS0xXVsxXSkvKDIqYSk7dD5yOysrcilvKz0obltyXVtlXVsxXS1uW3JdW2UtMV1bMV0pL2E7aSs9bypuW3RdW2VdWzFdfWdbZV09Yy09dT9pL3UqYTowLGw+YyYmKGw9Yyl9Zm9yKGU9MDtoPmU7KytlKWdbZV0tPWw7cmV0dXJuIGd9LGV4cGFuZDpmdW5jdGlvbihuKXt2YXIgdCxlLHIsdT1uLmxlbmd0aCxpPW5bMF0ubGVuZ3RoLG89MS91LGE9W107Zm9yKGU9MDtpPmU7KytlKXtmb3IodD0wLHI9MDt1PnQ7dCsrKXIrPW5bdF1bZV1bMV07aWYocilmb3IodD0wO3U+dDt0Kyspblt0XVtlXVsxXS89cjtlbHNlIGZvcih0PTA7dT50O3QrKyluW3RdW2VdWzFdPW99Zm9yKGU9MDtpPmU7KytlKWFbZV09MDtyZXR1cm4gYX0semVybzpjaX0pO3RhLmxheW91dC5oaXN0b2dyYW09ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4saSl7Zm9yKHZhciBvLGEsYz1bXSxsPW4ubWFwKGUsdGhpcykscz1yLmNhbGwodGhpcyxsLGkpLGY9dS5jYWxsKHRoaXMscyxsLGkpLGk9LTEsaD1sLmxlbmd0aCxnPWYubGVuZ3RoLTEscD10PzE6MS9oOysraTxnOylvPWNbaV09W10sby5keD1mW2krMV0tKG8ueD1mW2ldKSxvLnk9MDtpZihnPjApZm9yKGk9LTE7KytpPGg7KWE9bFtpXSxhPj1zWzBdJiZhPD1zWzFdJiYobz1jW3RhLmJpc2VjdChmLGEsMSxnKS0xXSxvLnkrPXAsby5wdXNoKG5baV0pKTtyZXR1cm4gY312YXIgdD0hMCxlPU51bWJlcixyPXBpLHU9aGk7cmV0dXJuIG4udmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPUV0KHQpLG4pOnJ9LG4uYmlucz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0ibnVtYmVyIj09dHlwZW9mIHQ/ZnVuY3Rpb24obil7cmV0dXJuIGdpKG4sdCl9OkV0KHQpLG4pOnV9LG4uZnJlcXVlbmN5PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSEhZSxuKTp0fSxufSx0YS5sYXlvdXQucGFjaz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixpKXt2YXIgbz1lLmNhbGwodGhpcyxuLGkpLGE9b1swXSxjPXVbMF0sbD11WzFdLHM9bnVsbD09dD9NYXRoLnNxcnQ6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmdW5jdGlvbigpe3JldHVybiB0fTtpZihhLng9YS55PTAsUXUoYSxmdW5jdGlvbihuKXtuLnI9K3Mobi52YWx1ZSl9KSxRdShhLE1pKSxyKXt2YXIgZj1yKih0PzE6TWF0aC5tYXgoMiphLnIvYywyKmEuci9sKSkvMjtRdShhLGZ1bmN0aW9uKG4pe24ucis9Zn0pLFF1KGEsTWkpLFF1KGEsZnVuY3Rpb24obil7bi5yLT1mfSl9cmV0dXJuIF9pKGEsYy8yLGwvMix0PzE6MS9NYXRoLm1heCgyKmEuci9jLDIqYS5yL2wpKSxvfXZhciB0LGU9dGEubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQodmkpLHI9MCx1PVsxLDFdO3JldHVybiBuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxuKTp1fSxuLnJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1udWxsPT1lfHwiZnVuY3Rpb24iPT10eXBlb2YgZT9lOitlLG4pOnR9LG4ucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdCxuKTpyfSxHdShuLGUpfSx0YS5sYXlvdXQudHJlZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obix1KXt2YXIgcz1vLmNhbGwodGhpcyxuLHUpLGY9c1swXSxoPXQoZik7aWYoUXUoaCxlKSxoLnBhcmVudC5tPS1oLnosS3UoaCxyKSxsKUt1KGYsaSk7ZWxzZXt2YXIgZz1mLHA9Zix2PWY7S3UoZixmdW5jdGlvbihuKXtuLng8Zy54JiYoZz1uKSxuLng+cC54JiYocD1uKSxuLmRlcHRoPnYuZGVwdGgmJih2PW4pfSk7dmFyIGQ9YShnLHApLzItZy54LG09Y1swXS8ocC54K2EocCxnKS8yK2QpLHk9Y1sxXS8odi5kZXB0aHx8MSk7S3UoZixmdW5jdGlvbihuKXtuLng9KG4ueCtkKSptLG4ueT1uLmRlcHRoKnl9KX1yZXR1cm4gc31mdW5jdGlvbiB0KG4pe2Zvcih2YXIgdCxlPXtBOm51bGwsY2hpbGRyZW46W25dfSxyPVtlXTtudWxsIT0odD1yLnBvcCgpKTspZm9yKHZhciB1LGk9dC5jaGlsZHJlbixvPTAsYT1pLmxlbmd0aDthPm87KytvKXIucHVzaCgoaVtvXT11PXtfOmlbb10scGFyZW50OnQsY2hpbGRyZW46KHU9aVtvXS5jaGlsZHJlbikmJnUuc2xpY2UoKXx8W10sQTpudWxsLGE6bnVsbCx6OjAsbTowLGM6MCxzOjAsdDpudWxsLGk6b30pLmE9dSk7cmV0dXJuIGUuY2hpbGRyZW5bMF19ZnVuY3Rpb24gZShuKXt2YXIgdD1uLmNoaWxkcmVuLGU9bi5wYXJlbnQuY2hpbGRyZW4scj1uLmk/ZVtuLmktMV06bnVsbDtpZih0Lmxlbmd0aCl7Tmkobik7dmFyIGk9KHRbMF0ueit0W3QubGVuZ3RoLTFdLnopLzI7cj8obi56PXIueithKG4uXyxyLl8pLG4ubT1uLnotaSk6bi56PWl9ZWxzZSByJiYobi56PXIueithKG4uXyxyLl8pKTtuLnBhcmVudC5BPXUobixyLG4ucGFyZW50LkF8fGVbMF0pfWZ1bmN0aW9uIHIobil7bi5fLng9bi56K24ucGFyZW50Lm0sbi5tKz1uLnBhcmVudC5tfWZ1bmN0aW9uIHUobix0LGUpe2lmKHQpe2Zvcih2YXIgcix1PW4saT1uLG89dCxjPXUucGFyZW50LmNoaWxkcmVuWzBdLGw9dS5tLHM9aS5tLGY9by5tLGg9Yy5tO289RWkobyksdT1raSh1KSxvJiZ1OyljPWtpKGMpLGk9RWkoaSksaS5hPW4scj1vLnorZi11LnotbCthKG8uXyx1Ll8pLHI+MCYmKEFpKENpKG8sbixlKSxuLHIpLGwrPXIscys9ciksZis9by5tLGwrPXUubSxoKz1jLm0scys9aS5tO28mJiFFaShpKSYmKGkudD1vLGkubSs9Zi1zKSx1JiYha2koYykmJihjLnQ9dSxjLm0rPWwtaCxlPW4pfXJldHVybiBlfWZ1bmN0aW9uIGkobil7bi54Kj1jWzBdLG4ueT1uLmRlcHRoKmNbMV19dmFyIG89dGEubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQobnVsbCkudmFsdWUobnVsbCksYT1TaSxjPVsxLDFdLGw9bnVsbDtyZXR1cm4gbi5zZXBhcmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQsbik6YX0sbi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW51bGw9PShjPXQpP2k6bnVsbCxuKTpsP251bGw6Y30sbi5ub2RlU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1udWxsPT0oYz10KT9udWxsOmksbik6bD9jOm51bGx9LEd1KG4sbyl9LHRhLmxheW91dC5jbHVzdGVyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLGkpe3ZhciBvLGE9dC5jYWxsKHRoaXMsbixpKSxjPWFbMF0sbD0wO1F1KGMsZnVuY3Rpb24obil7dmFyIHQ9bi5jaGlsZHJlbjt0JiZ0Lmxlbmd0aD8obi54PXFpKHQpLG4ueT16aSh0KSk6KG4ueD1vP2wrPWUobixvKTowLG4ueT0wLG89bil9KTt2YXIgcz1MaShjKSxmPVRpKGMpLGg9cy54LWUocyxmKS8yLGc9Zi54K2UoZixzKS8yO3JldHVybiBRdShjLHU/ZnVuY3Rpb24obil7bi54PShuLngtYy54KSpyWzBdLG4ueT0oYy55LW4ueSkqclsxXX06ZnVuY3Rpb24obil7bi54PShuLngtaCkvKGctaCkqclswXSxuLnk9KDEtKGMueT9uLnkvYy55OjEpKSpyWzFdfSksYX12YXIgdD10YS5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChudWxsKS52YWx1ZShudWxsKSxlPVNpLHI9WzEsMV0sdT0hMTtyZXR1cm4gbi5zZXBhcmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbik6ZX0sbi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGw9PShyPXQpLG4pOnU/bnVsbDpyfSxuLm5vZGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGwhPShyPXQpLG4pOnU/cjpudWxsfSxHdShuLHQpfSx0YS5sYXlvdXQudHJlZW1hcD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obix0KXtmb3IodmFyIGUscix1PS0xLGk9bi5sZW5ndGg7Kyt1PGk7KXI9KGU9blt1XSkudmFsdWUqKDA+dD8wOnQpLGUuYXJlYT1pc05hTihyKXx8MD49cj8wOnJ9ZnVuY3Rpb24gdChlKXt2YXIgaT1lLmNoaWxkcmVuO2lmKGkmJmkubGVuZ3RoKXt2YXIgbyxhLGMsbD1mKGUpLHM9W10saD1pLnNsaWNlKCkscD0xLzAsdj0ic2xpY2UiPT09Zz9sLmR4OiJkaWNlIj09PWc/bC5keToic2xpY2UtZGljZSI9PT1nPzEmZS5kZXB0aD9sLmR5OmwuZHg6TWF0aC5taW4obC5keCxsLmR5KTtmb3IobihoLGwuZHgqbC5keS9lLnZhbHVlKSxzLmFyZWE9MDsoYz1oLmxlbmd0aCk+MDspcy5wdXNoKG89aFtjLTFdKSxzLmFyZWErPW8uYXJlYSwic3F1YXJpZnkiIT09Z3x8KGE9cihzLHYpKTw9cD8oaC5wb3AoKSxwPWEpOihzLmFyZWEtPXMucG9wKCkuYXJlYSx1KHMsdixsLCExKSx2PU1hdGgubWluKGwuZHgsbC5keSkscy5sZW5ndGg9cy5hcmVhPTAscD0xLzApO3MubGVuZ3RoJiYodShzLHYsbCwhMCkscy5sZW5ndGg9cy5hcmVhPTApLGkuZm9yRWFjaCh0KX19ZnVuY3Rpb24gZSh0KXt2YXIgcj10LmNoaWxkcmVuO2lmKHImJnIubGVuZ3RoKXt2YXIgaSxvPWYodCksYT1yLnNsaWNlKCksYz1bXTtmb3IobihhLG8uZHgqby5keS90LnZhbHVlKSxjLmFyZWE9MDtpPWEucG9wKCk7KWMucHVzaChpKSxjLmFyZWErPWkuYXJlYSxudWxsIT1pLnomJih1KGMsaS56P28uZHg6by5keSxvLCFhLmxlbmd0aCksYy5sZW5ndGg9Yy5hcmVhPTApO3IuZm9yRWFjaChlKX19ZnVuY3Rpb24gcihuLHQpe2Zvcih2YXIgZSxyPW4uYXJlYSx1PTAsaT0xLzAsbz0tMSxhPW4ubGVuZ3RoOysrbzxhOykoZT1uW29dLmFyZWEpJiYoaT5lJiYoaT1lKSxlPnUmJih1PWUpKTtyZXR1cm4gcio9cix0Kj10LHI/TWF0aC5tYXgodCp1KnAvcixyLyh0KmkqcCkpOjEvMH1mdW5jdGlvbiB1KG4sdCxlLHIpe3ZhciB1LGk9LTEsbz1uLmxlbmd0aCxhPWUueCxsPWUueSxzPXQ/YyhuLmFyZWEvdCk6MDtpZih0PT1lLmR4KXtmb3IoKHJ8fHM+ZS5keSkmJihzPWUuZHkpOysraTxvOyl1PW5baV0sdS54PWEsdS55PWwsdS5keT1zLGErPXUuZHg9TWF0aC5taW4oZS54K2UuZHgtYSxzP2ModS5hcmVhL3MpOjApO3Uuej0hMCx1LmR4Kz1lLngrZS5keC1hLGUueSs9cyxlLmR5LT1zfWVsc2V7Zm9yKChyfHxzPmUuZHgpJiYocz1lLmR4KTsrK2k8bzspdT1uW2ldLHUueD1hLHUueT1sLHUuZHg9cyxsKz11LmR5PU1hdGgubWluKGUueStlLmR5LWwscz9jKHUuYXJlYS9zKTowKTt1Lno9ITEsdS5keSs9ZS55K2UuZHktbCxlLngrPXMsZS5keC09c319ZnVuY3Rpb24gaShyKXt2YXIgdT1vfHxhKHIpLGk9dVswXTtyZXR1cm4gaS54PTAsaS55PTAsaS5keD1sWzBdLGkuZHk9bFsxXSxvJiZhLnJldmFsdWUoaSksbihbaV0saS5keCppLmR5L2kudmFsdWUpLChvP2U6dCkoaSksaCYmKG89dSksdX12YXIgbyxhPXRhLmxheW91dC5oaWVyYXJjaHkoKSxjPU1hdGgucm91bmQsbD1bMSwxXSxzPW51bGwsZj1SaSxoPSExLGc9InNxdWFyaWZ5IixwPS41KigxK01hdGguc3FydCg1KSk7CnJldHVybiBpLnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9bixpKTpsfSxpLnBhZGRpbmc9ZnVuY3Rpb24obil7ZnVuY3Rpb24gdCh0KXt2YXIgZT1uLmNhbGwoaSx0LHQuZGVwdGgpO3JldHVybiBudWxsPT1lP1JpKHQpOkRpKHQsIm51bWJlciI9PXR5cGVvZiBlP1tlLGUsZSxlXTplKX1mdW5jdGlvbiBlKHQpe3JldHVybiBEaSh0LG4pfWlmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBzO3ZhciByO3JldHVybiBmPW51bGw9PShzPW4pP1JpOiJmdW5jdGlvbiI9PShyPXR5cGVvZiBuKT90OiJudW1iZXIiPT09cj8obj1bbixuLG4sbl0sZSk6ZSxpfSxpLnJvdW5kPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW4/TWF0aC5yb3VuZDpOdW1iZXIsaSk6YyE9TnVtYmVyfSxpLnN0aWNreT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD1uLG89bnVsbCxpKTpofSxpLnJhdGlvPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPW4saSk6cH0saS5tb2RlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPW4rIiIsaSk6Z30sR3UoaSxhKX0sdGEucmFuZG9tPXtub3JtYWw6ZnVuY3Rpb24obix0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoO3JldHVybiAyPmUmJih0PTEpLDE+ZSYmKG49MCksZnVuY3Rpb24oKXt2YXIgZSxyLHU7ZG8gZT0yKk1hdGgucmFuZG9tKCktMSxyPTIqTWF0aC5yYW5kb20oKS0xLHU9ZSplK3Iqcjt3aGlsZSghdXx8dT4xKTtyZXR1cm4gbit0KmUqTWF0aC5zcXJ0KC0yKk1hdGgubG9nKHUpL3UpfX0sbG9nTm9ybWFsOmZ1bmN0aW9uKCl7dmFyIG49dGEucmFuZG9tLm5vcm1hbC5hcHBseSh0YSxhcmd1bWVudHMpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBNYXRoLmV4cChuKCkpfX0sYmF0ZXM6ZnVuY3Rpb24obil7dmFyIHQ9dGEucmFuZG9tLmlyd2luSGFsbChuKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdCgpL259fSxpcndpbkhhbGw6ZnVuY3Rpb24obil7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT0wO24+ZTtlKyspdCs9TWF0aC5yYW5kb20oKTtyZXR1cm4gdH19fSx0YS5zY2FsZT17fTt2YXIgbWw9e2Zsb29yOnksY2VpbDp5fTt0YS5zY2FsZS5saW5lYXI9ZnVuY3Rpb24oKXtyZXR1cm4gSWkoWzAsMV0sWzAsMV0sbXUsITEpfTt2YXIgeWw9e3M6MSxnOjEscDoxLHI6MSxlOjF9O3RhLnNjYWxlLmxvZz1mdW5jdGlvbigpe3JldHVybiBKaSh0YS5zY2FsZS5saW5lYXIoKS5kb21haW4oWzAsMV0pLDEwLCEwLFsxLDEwXSl9O3ZhciBNbD10YS5mb3JtYXQoIi4wZSIpLHhsPXtmbG9vcjpmdW5jdGlvbihuKXtyZXR1cm4tTWF0aC5jZWlsKC1uKX0sY2VpbDpmdW5jdGlvbihuKXtyZXR1cm4tTWF0aC5mbG9vcigtbil9fTt0YS5zY2FsZS5wb3c9ZnVuY3Rpb24oKXtyZXR1cm4gR2kodGEuc2NhbGUubGluZWFyKCksMSxbMCwxXSl9LHRhLnNjYWxlLnNxcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuc2NhbGUucG93KCkuZXhwb25lbnQoLjUpfSx0YS5zY2FsZS5vcmRpbmFsPWZ1bmN0aW9uKCl7cmV0dXJuIFFpKFtdLHt0OiJyYW5nZSIsYTpbW11dfSl9LHRhLnNjYWxlLmNhdGVnb3J5MTA9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuc2NhbGUub3JkaW5hbCgpLnJhbmdlKGJsKX0sdGEuc2NhbGUuY2F0ZWdvcnkyMD1mdW5jdGlvbigpe3JldHVybiB0YS5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoX2wpfSx0YS5zY2FsZS5jYXRlZ29yeTIwYj1mdW5jdGlvbigpe3JldHVybiB0YS5zY2FsZS5vcmRpbmFsKCkucmFuZ2Uod2wpfSx0YS5zY2FsZS5jYXRlZ29yeTIwYz1mdW5jdGlvbigpe3JldHVybiB0YS5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoU2wpfTt2YXIgYmw9WzIwNjIyNjAsMTY3NDQyMDYsMjkyNDU4OCwxNDAzNDcyOCw5NzI1ODg1LDkxOTcxMzEsMTQ5MDczMzAsODM1NTcxMSwxMjM2OTE4NiwxNTU2MTc1XS5tYXAoTXQpLF9sPVsyMDYyMjYwLDExNDU0NDQwLDE2NzQ0MjA2LDE2NzU5NjcyLDI5MjQ1ODgsMTAwMTg2OTgsMTQwMzQ3MjgsMTY3NTA3NDIsOTcyNTg4NSwxMjk1NTg2MSw5MTk3MTMxLDEyODg1MTQwLDE0OTA3MzMwLDE2MjM0MTk0LDgzNTU3MTEsMTMwOTI4MDcsMTIzNjkxODYsMTQ0MDg1ODksMTU1NjE3NSwxMDQxMDcyNV0ubWFwKE10KSx3bD1bMzc1MDc3Nyw1Mzk1NjE5LDcwNDA3MTksMTAyNjQyODYsNjUxOTA5Nyw5MjE2NTk0LDExOTE1MTE1LDEzNTU2NjM2LDkyMDI5OTMsMTI0MjY4MDksMTUxODY1MTQsMTUxOTA5MzIsODY2NjE2OSwxMTM1NjQ5MCwxNDA0OTY0MywxNTE3NzM3Miw4MDc3NjgzLDEwODM0MzI0LDEzNTI4NTA5LDE0NTg5NjU0XS5tYXAoTXQpLFNsPVszMjQ0NzMzLDcwNTcxMTAsMTA0MDY2MjUsMTMwMzI0MzEsMTUwOTUwNTMsMTY2MTY3NjQsMTY2MjUyNTksMTY2MzQwMTgsMzI1MzA3Niw3NjUyNDcwLDEwNjA3MDAzLDEzMTAxNTA0LDc2OTUyODEsMTAzOTQzMTIsMTIzNjkzNzIsMTQzNDI4OTEsNjUxMzUwNyw5ODY4OTUwLDEyNDM0ODc3LDE0Mjc3MDgxXS5tYXAoTXQpO3RhLnNjYWxlLnF1YW50aWxlPWZ1bmN0aW9uKCl7cmV0dXJuIG5vKFtdLFtdKX0sdGEuc2NhbGUucXVhbnRpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdG8oMCwxLFswLDFdKX0sdGEuc2NhbGUudGhyZXNob2xkPWZ1bmN0aW9uKCl7cmV0dXJuIGVvKFsuNV0sWzAsMV0pfSx0YS5zY2FsZS5pZGVudGl0eT1mdW5jdGlvbigpe3JldHVybiBybyhbMCwxXSl9LHRhLnN2Zz17fSx0YS5zdmcuYXJjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe3ZhciBuPU1hdGgubWF4KDAsK2UuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxsPU1hdGgubWF4KDAsK3IuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxzPW8uYXBwbHkodGhpcyxhcmd1bWVudHMpLVJhLGY9YS5hcHBseSh0aGlzLGFyZ3VtZW50cyktUmEsaD1NYXRoLmFicyhmLXMpLGc9cz5mPzA6MTtpZihuPmwmJihwPWwsbD1uLG49cCksaD49VGEpcmV0dXJuIHQobCxnKSsobj90KG4sMS1nKToiIikrIloiO3ZhciBwLHYsZCxtLHksTSx4LGIsXyx3LFMsayxFPTAsQT0wLE49W107aWYoKG09KCtjLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8MCkvMikmJihkPWk9PT1rbD9NYXRoLnNxcnQobipuK2wqbCk6K2kuYXBwbHkodGhpcyxhcmd1bWVudHMpLGd8fChBKj0tMSksbCYmKEE9dHQoZC9sKk1hdGguc2luKG0pKSksbiYmKEU9dHQoZC9uKk1hdGguc2luKG0pKSkpLGwpe3k9bCpNYXRoLmNvcyhzK0EpLE09bCpNYXRoLnNpbihzK0EpLHg9bCpNYXRoLmNvcyhmLUEpLGI9bCpNYXRoLnNpbihmLUEpO3ZhciBDPU1hdGguYWJzKGYtcy0yKkEpPD1xYT8wOjE7aWYoQSYmc28oeSxNLHgsYik9PT1nXkMpe3ZhciB6PShzK2YpLzI7eT1sKk1hdGguY29zKHopLE09bCpNYXRoLnNpbih6KSx4PWI9bnVsbH19ZWxzZSB5PU09MDtpZihuKXtfPW4qTWF0aC5jb3MoZi1FKSx3PW4qTWF0aC5zaW4oZi1FKSxTPW4qTWF0aC5jb3MocytFKSxrPW4qTWF0aC5zaW4ocytFKTt2YXIgcT1NYXRoLmFicyhzLWYrMipFKTw9cWE/MDoxO2lmKEUmJnNvKF8sdyxTLGspPT09MS1nXnEpe3ZhciBMPShzK2YpLzI7Xz1uKk1hdGguY29zKEwpLHc9bipNYXRoLnNpbihMKSxTPWs9bnVsbH19ZWxzZSBfPXc9MDtpZigocD1NYXRoLm1pbihNYXRoLmFicyhsLW4pLzIsK3UuYXBwbHkodGhpcyxhcmd1bWVudHMpKSk+LjAwMSl7dj1sPm5eZz8wOjE7dmFyIFQ9bnVsbD09Uz9bXyx3XTpudWxsPT14P1t5LE1dOkxyKFt5LE1dLFtTLGtdLFt4LGJdLFtfLHddKSxSPXktVFswXSxEPU0tVFsxXSxQPXgtVFswXSxVPWItVFsxXSxqPTEvTWF0aC5zaW4oTWF0aC5hY29zKChSKlArRCpVKS8oTWF0aC5zcXJ0KFIqUitEKkQpKk1hdGguc3FydChQKlArVSpVKSkpLzIpLEY9TWF0aC5zcXJ0KFRbMF0qVFswXStUWzFdKlRbMV0pO2lmKG51bGwhPXgpe3ZhciBIPU1hdGgubWluKHAsKGwtRikvKGorMSkpLE89Zm8obnVsbD09Uz9bXyx3XTpbUyxrXSxbeSxNXSxsLEgsZyksST1mbyhbeCxiXSxbXyx3XSxsLEgsZyk7cD09PUg/Ti5wdXNoKCJNIixPWzBdLCJBIixILCIsIixILCIgMCAwLCIsdiwiICIsT1sxXSwiQSIsbCwiLCIsbCwiIDAgIiwxLWdec28oT1sxXVswXSxPWzFdWzFdLElbMV1bMF0sSVsxXVsxXSksIiwiLGcsIiAiLElbMV0sIkEiLEgsIiwiLEgsIiAwIDAsIix2LCIgIixJWzBdKTpOLnB1c2goIk0iLE9bMF0sIkEiLEgsIiwiLEgsIiAwIDEsIix2LCIgIixJWzBdKX1lbHNlIE4ucHVzaCgiTSIseSwiLCIsTSk7aWYobnVsbCE9Uyl7dmFyIFk9TWF0aC5taW4ocCwobi1GKS8oai0xKSksWj1mbyhbeSxNXSxbUyxrXSxuLC1ZLGcpLFY9Zm8oW18sd10sbnVsbD09eD9beSxNXTpbeCxiXSxuLC1ZLGcpO3A9PT1ZP04ucHVzaCgiTCIsVlswXSwiQSIsWSwiLCIsWSwiIDAgMCwiLHYsIiAiLFZbMV0sIkEiLG4sIiwiLG4sIiAwICIsZ15zbyhWWzFdWzBdLFZbMV1bMV0sWlsxXVswXSxaWzFdWzFdKSwiLCIsMS1nLCIgIixaWzFdLCJBIixZLCIsIixZLCIgMCAwLCIsdiwiICIsWlswXSk6Ti5wdXNoKCJMIixWWzBdLCJBIixZLCIsIixZLCIgMCAwLCIsdiwiICIsWlswXSl9ZWxzZSBOLnB1c2goIkwiLF8sIiwiLHcpfWVsc2UgTi5wdXNoKCJNIix5LCIsIixNKSxudWxsIT14JiZOLnB1c2goIkEiLGwsIiwiLGwsIiAwICIsQywiLCIsZywiICIseCwiLCIsYiksTi5wdXNoKCJMIixfLCIsIix3KSxudWxsIT1TJiZOLnB1c2goIkEiLG4sIiwiLG4sIiAwICIscSwiLCIsMS1nLCIgIixTLCIsIixrKTtyZXR1cm4gTi5wdXNoKCJaIiksTi5qb2luKCIiKX1mdW5jdGlvbiB0KG4sdCl7cmV0dXJuIk0wLCIrbisiQSIrbisiLCIrbisiIDAgMSwiK3QrIiAwLCIrLW4rIkEiK24rIiwiK24rIiAwIDEsIit0KyIgMCwiK259dmFyIGU9aW8scj1vbyx1PXVvLGk9a2wsbz1hbyxhPWNvLGM9bG87cmV0dXJuIG4uaW5uZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9RXQodCksbik6ZX0sbi5vdXRlclJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1FdCh0KSxuKTpyfSxuLmNvcm5lclJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1FdCh0KSxuKTp1fSxuLnBhZFJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10PT1rbD9rbDpFdCh0KSxuKTppfSxuLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89RXQodCksbik6b30sbi5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1FdCh0KSxuKTphfSxuLnBhZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPUV0KHQpLG4pOmN9LG4uY2VudHJvaWQ9ZnVuY3Rpb24oKXt2YXIgbj0oK2UuYXBwbHkodGhpcyxhcmd1bWVudHMpKyArci5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzIsdD0oK28uYXBwbHkodGhpcyxhcmd1bWVudHMpKyArYS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzItUmE7cmV0dXJuW01hdGguY29zKHQpKm4sTWF0aC5zaW4odCkqbl19LG59O3ZhciBrbD0iYXV0byI7dGEuc3ZnLmxpbmU9ZnVuY3Rpb24oKXtyZXR1cm4gaG8oeSl9O3ZhciBFbD10YS5tYXAoe2xpbmVhcjpnbywibGluZWFyLWNsb3NlZCI6cG8sc3RlcDp2bywic3RlcC1iZWZvcmUiOm1vLCJzdGVwLWFmdGVyIjp5byxiYXNpczpTbywiYmFzaXMtb3BlbiI6a28sImJhc2lzLWNsb3NlZCI6RW8sYnVuZGxlOkFvLGNhcmRpbmFsOmJvLCJjYXJkaW5hbC1vcGVuIjpNbywiY2FyZGluYWwtY2xvc2VkIjp4byxtb25vdG9uZTpUb30pO0VsLmZvckVhY2goZnVuY3Rpb24obix0KXt0LmtleT1uLHQuY2xvc2VkPS8tY2xvc2VkJC8udGVzdChuKX0pO3ZhciBBbD1bMCwyLzMsMS8zLDBdLE5sPVswLDEvMywyLzMsMF0sQ2w9WzAsMS82LDIvMywxLzZdO3RhLnN2Zy5saW5lLnJhZGlhbD1mdW5jdGlvbigpe3ZhciBuPWhvKFJvKTtyZXR1cm4gbi5yYWRpdXM9bi54LGRlbGV0ZSBuLngsbi5hbmdsZT1uLnksZGVsZXRlIG4ueSxufSxtby5yZXZlcnNlPXlvLHlvLnJldmVyc2U9bW8sdGEuc3ZnLmFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gRG8oeSl9LHRhLnN2Zy5hcmVhLnJhZGlhbD1mdW5jdGlvbigpe3ZhciBuPURvKFJvKTtyZXR1cm4gbi5yYWRpdXM9bi54LGRlbGV0ZSBuLngsbi5pbm5lclJhZGl1cz1uLngwLGRlbGV0ZSBuLngwLG4ub3V0ZXJSYWRpdXM9bi54MSxkZWxldGUgbi54MSxuLmFuZ2xlPW4ueSxkZWxldGUgbi55LG4uc3RhcnRBbmdsZT1uLnkwLGRlbGV0ZSBuLnkwLG4uZW5kQW5nbGU9bi55MSxkZWxldGUgbi55MSxufSx0YS5zdmcuY2hvcmQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4sYSl7dmFyIGM9dCh0aGlzLGksbixhKSxsPXQodGhpcyxvLG4sYSk7cmV0dXJuIk0iK2MucDArcihjLnIsYy5wMSxjLmExLWMuYTApKyhlKGMsbCk/dShjLnIsYy5wMSxjLnIsYy5wMCk6dShjLnIsYy5wMSxsLnIsbC5wMCkrcihsLnIsbC5wMSxsLmExLWwuYTApK3UobC5yLGwucDEsYy5yLGMucDApKSsiWiJ9ZnVuY3Rpb24gdChuLHQsZSxyKXt2YXIgdT10LmNhbGwobixlLHIpLGk9YS5jYWxsKG4sdSxyKSxvPWMuY2FsbChuLHUsciktUmEscz1sLmNhbGwobix1LHIpLVJhO3JldHVybntyOmksYTA6byxhMTpzLHAwOltpKk1hdGguY29zKG8pLGkqTWF0aC5zaW4obyldLHAxOltpKk1hdGguY29zKHMpLGkqTWF0aC5zaW4ocyldfX1mdW5jdGlvbiBlKG4sdCl7cmV0dXJuIG4uYTA9PXQuYTAmJm4uYTE9PXQuYTF9ZnVuY3Rpb24gcihuLHQsZSl7cmV0dXJuIkEiK24rIiwiK24rIiAwICIrICsoZT5xYSkrIiwxICIrdH1mdW5jdGlvbiB1KG4sdCxlLHIpe3JldHVybiJRIDAsMCAiK3J9dmFyIGk9bXIsbz15cixhPVBvLGM9YW8sbD1jbztyZXR1cm4gbi5yYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9RXQodCksbik6YX0sbi5zb3VyY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9RXQodCksbik6aX0sbi50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89RXQodCksbik6b30sbi5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPUV0KHQpLG4pOmN9LG4uZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9RXQodCksbik6bH0sbn0sdGEuc3ZnLmRpYWdvbmFsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHUpe3ZhciBpPXQuY2FsbCh0aGlzLG4sdSksbz1lLmNhbGwodGhpcyxuLHUpLGE9KGkueStvLnkpLzIsYz1baSx7eDppLngseTphfSx7eDpvLngseTphfSxvXTtyZXR1cm4gYz1jLm1hcChyKSwiTSIrY1swXSsiQyIrY1sxXSsiICIrY1syXSsiICIrY1szXX12YXIgdD1tcixlPXlyLHI9VW87cmV0dXJuIG4uc291cmNlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PUV0KGUpLG4pOnR9LG4udGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPUV0KHQpLG4pOmV9LG4ucHJvamVjdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG59LHRhLnN2Zy5kaWFnb25hbC5yYWRpYWw9ZnVuY3Rpb24oKXt2YXIgbj10YS5zdmcuZGlhZ29uYWwoKSx0PVVvLGU9bi5wcm9qZWN0aW9uO3JldHVybiBuLnByb2plY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/ZShqbyh0PW4pKTp0fSxufSx0YS5zdmcuc3ltYm9sPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHIpe3JldHVybih6bC5nZXQodC5jYWxsKHRoaXMsbixyKSl8fE9vKShlLmNhbGwodGhpcyxuLHIpKX12YXIgdD1IbyxlPUZvO3JldHVybiBuLnR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9RXQoZSksbik6dH0sbi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPUV0KHQpLG4pOmV9LG59O3ZhciB6bD10YS5tYXAoe2NpcmNsZTpPbyxjcm9zczpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobi81KS8yO3JldHVybiJNIistMyp0KyIsIistdCsiSCIrLXQrIlYiKy0zKnQrIkgiK3QrIlYiKy10KyJIIiszKnQrIlYiK3QrIkgiK3QrIlYiKzMqdCsiSCIrLXQrIlYiK3QrIkgiKy0zKnQrIloifSxkaWFtb25kOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuLygyKkxsKSksZT10KkxsO3JldHVybiJNMCwiKy10KyJMIitlKyIsMCAwLCIrdCsiICIrLWUrIiwwWiJ9LHNxdWFyZTpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobikvMjtyZXR1cm4iTSIrLXQrIiwiKy10KyJMIit0KyIsIistdCsiICIrdCsiLCIrdCsiICIrLXQrIiwiK3QrIloifSwidHJpYW5nbGUtZG93biI6ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zcXJ0KG4vcWwpLGU9dCpxbC8yO3JldHVybiJNMCwiK2UrIkwiK3QrIiwiKy1lKyIgIistdCsiLCIrLWUrIloifSwidHJpYW5nbGUtdXAiOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuL3FsKSxlPXQqcWwvMjtyZXR1cm4iTTAsIistZSsiTCIrdCsiLCIrZSsiICIrLXQrIiwiK2UrIloifX0pO3RhLnN2Zy5zeW1ib2xUeXBlcz16bC5rZXlzKCk7dmFyIHFsPU1hdGguc3FydCgzKSxMbD1NYXRoLnRhbigzMCpEYSk7X2EudHJhbnNpdGlvbj1mdW5jdGlvbihuKXtmb3IodmFyIHQsZSxyPVRsfHwrK1VsLHU9WG8obiksaT1bXSxvPVJsfHx7dGltZTpEYXRlLm5vdygpLGVhc2U6U3UsZGVsYXk6MCxkdXJhdGlvbjoyNTB9LGE9LTEsYz10aGlzLmxlbmd0aDsrK2E8Yzspe2kucHVzaCh0PVtdKTtmb3IodmFyIGw9dGhpc1thXSxzPS0xLGY9bC5sZW5ndGg7KytzPGY7KShlPWxbc10pJiYkbyhlLHMsdSxyLG8pLHQucHVzaChlKX1yZXR1cm4gWW8oaSx1LHIpfSxfYS5pbnRlcnJ1cHQ9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuZWFjaChudWxsPT1uP0RsOklvKFhvKG4pKSl9O3ZhciBUbCxSbCxEbD1JbyhYbygpKSxQbD1bXSxVbD0wO1BsLmNhbGw9X2EuY2FsbCxQbC5lbXB0eT1fYS5lbXB0eSxQbC5ub2RlPV9hLm5vZGUsUGwuc2l6ZT1fYS5zaXplLHRhLnRyYW5zaXRpb249ZnVuY3Rpb24obix0KXtyZXR1cm4gbiYmbi50cmFuc2l0aW9uP1RsP24udHJhbnNpdGlvbih0KTpuOnRhLnNlbGVjdGlvbigpLnRyYW5zaXRpb24obil9LHRhLnRyYW5zaXRpb24ucHJvdG90eXBlPVBsLFBsLnNlbGVjdD1mdW5jdGlvbihuKXt2YXIgdCxlLHIsdT10aGlzLmlkLGk9dGhpcy5uYW1lc3BhY2Usbz1bXTtuPU4obik7Zm9yKHZhciBhPS0xLGM9dGhpcy5sZW5ndGg7KythPGM7KXtvLnB1c2godD1bXSk7Zm9yKHZhciBsPXRoaXNbYV0scz0tMSxmPWwubGVuZ3RoOysrczxmOykocj1sW3NdKSYmKGU9bi5jYWxsKHIsci5fX2RhdGFfXyxzLGEpKT8oIl9fZGF0YV9fImluIHImJihlLl9fZGF0YV9fPXIuX19kYXRhX18pLCRvKGUscyxpLHUscltpXVt1XSksdC5wdXNoKGUpKTp0LnB1c2gobnVsbCl9cmV0dXJuIFlvKG8saSx1KX0sUGwuc2VsZWN0QWxsPWZ1bmN0aW9uKG4pe3ZhciB0LGUscix1LGksbz10aGlzLmlkLGE9dGhpcy5uYW1lc3BhY2UsYz1bXTtuPUMobik7Zm9yKHZhciBsPS0xLHM9dGhpcy5sZW5ndGg7KytsPHM7KWZvcih2YXIgZj10aGlzW2xdLGg9LTEsZz1mLmxlbmd0aDsrK2g8ZzspaWYocj1mW2hdKXtpPXJbYV1bb10sZT1uLmNhbGwocixyLl9fZGF0YV9fLGgsbCksYy5wdXNoKHQ9W10pO2Zvcih2YXIgcD0tMSx2PWUubGVuZ3RoOysrcDx2OykodT1lW3BdKSYmJG8odSxwLGEsbyxpKSx0LnB1c2godSl9cmV0dXJuIFlvKGMsYSxvKX0sUGwuZmlsdGVyPWZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PVtdOyJmdW5jdGlvbiIhPXR5cGVvZiBuJiYobj1PKG4pKTtmb3IodmFyIGk9MCxvPXRoaXMubGVuZ3RoO28+aTtpKyspe3UucHVzaCh0PVtdKTtmb3IodmFyIGU9dGhpc1tpXSxhPTAsYz1lLmxlbmd0aDtjPmE7YSsrKShyPWVbYV0pJiZuLmNhbGwocixyLl9fZGF0YV9fLGEsaSkmJnQucHVzaChyKX1yZXR1cm4gWW8odSx0aGlzLm5hbWVzcGFjZSx0aGlzLmlkKX0sUGwudHdlZW49ZnVuY3Rpb24obix0KXt2YXIgZT10aGlzLmlkLHI9dGhpcy5uYW1lc3BhY2U7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj90aGlzLm5vZGUoKVtyXVtlXS50d2Vlbi5nZXQobik6WSh0aGlzLG51bGw9PXQ/ZnVuY3Rpb24odCl7dFtyXVtlXS50d2Vlbi5yZW1vdmUobil9OmZ1bmN0aW9uKHUpe3Vbcl1bZV0udHdlZW4uc2V0KG4sdCl9KX0sUGwuYXR0cj1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZShhKX1mdW5jdGlvbiByKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhhLnNwYWNlLGEubG9jYWwpfWZ1bmN0aW9uIHUobil7cmV0dXJuIG51bGw9PW4/ZToobis9IiIsZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuZ2V0QXR0cmlidXRlKGEpO3JldHVybiBlIT09biYmKHQ9byhlLG4pLGZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlKGEsdChuKSl9KX0pfWZ1bmN0aW9uIGkobil7cmV0dXJuIG51bGw9PW4/cjoobis9IiIsZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuZ2V0QXR0cmlidXRlTlMoYS5zcGFjZSxhLmxvY2FsKTtyZXR1cm4gZSE9PW4mJih0PW8oZSxuKSxmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZU5TKGEuc3BhY2UsYS5sb2NhbCx0KG4pKX0pfSl9aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtmb3IodCBpbiBuKXRoaXMuYXR0cih0LG5bdF0pO3JldHVybiB0aGlzfXZhciBvPSJ0cmFuc2Zvcm0iPT1uP0h1Om11LGE9dGEubnMucXVhbGlmeShuKTtyZXR1cm4gWm8odGhpcywiYXR0ci4iK24sdCxhLmxvY2FsP2k6dSl9LFBsLmF0dHJUd2Vlbj1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobixlKXt2YXIgcj10LmNhbGwodGhpcyxuLGUsdGhpcy5nZXRBdHRyaWJ1dGUodSkpO3JldHVybiByJiZmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZSh1LHIobikpfX1mdW5jdGlvbiByKG4sZSl7dmFyIHI9dC5jYWxsKHRoaXMsbixlLHRoaXMuZ2V0QXR0cmlidXRlTlModS5zcGFjZSx1LmxvY2FsKSk7cmV0dXJuIHImJmZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlTlModS5zcGFjZSx1LmxvY2FsLHIobikpfX12YXIgdT10YS5ucy5xdWFsaWZ5KG4pO3JldHVybiB0aGlzLnR3ZWVuKCJhdHRyLiIrbix1LmxvY2FsP3I6ZSl9LFBsLnN0eWxlPWZ1bmN0aW9uKG4sZSxyKXtmdW5jdGlvbiB1KCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKX1mdW5jdGlvbiBpKGUpe3JldHVybiBudWxsPT1lP3U6KGUrPSIiLGZ1bmN0aW9uKCl7dmFyIHUsaT10KHRoaXMpLmdldENvbXB1dGVkU3R5bGUodGhpcyxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG4pO3JldHVybiBpIT09ZSYmKHU9bXUoaSxlKSxmdW5jdGlvbih0KXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KG4sdSh0KSxyKX0pfSl9dmFyIG89YXJndW1lbnRzLmxlbmd0aDtpZigzPm8pe2lmKCJzdHJpbmciIT10eXBlb2Ygbil7Mj5vJiYoZT0iIik7Zm9yKHIgaW4gbil0aGlzLnN0eWxlKHIsbltyXSxlKTtyZXR1cm4gdGhpc31yPSIifXJldHVybiBabyh0aGlzLCJzdHlsZS4iK24sZSxpKX0sUGwuc3R5bGVUd2Vlbj1mdW5jdGlvbihuLGUscil7ZnVuY3Rpb24gdSh1LGkpe3ZhciBvPWUuY2FsbCh0aGlzLHUsaSx0KHRoaXMpLmdldENvbXB1dGVkU3R5bGUodGhpcyxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG4pKTtyZXR1cm4gbyYmZnVuY3Rpb24odCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLG8odCkscil9fXJldHVybiBhcmd1bWVudHMubGVuZ3RoPDMmJihyPSIiKSx0aGlzLnR3ZWVuKCJzdHlsZS4iK24sdSl9LFBsLnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIFpvKHRoaXMsInRleHQiLG4sVm8pfSxQbC5yZW1vdmU9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLm5hbWVzcGFjZTtyZXR1cm4gdGhpcy5lYWNoKCJlbmQudHJhbnNpdGlvbiIsZnVuY3Rpb24oKXt2YXIgdDt0aGlzW25dLmNvdW50PDImJih0PXRoaXMucGFyZW50Tm9kZSkmJnQucmVtb3ZlQ2hpbGQodGhpcyl9KX0sUGwuZWFzZT1mdW5jdGlvbihuKXt2YXIgdD10aGlzLmlkLGU9dGhpcy5uYW1lc3BhY2U7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MT90aGlzLm5vZGUoKVtlXVt0XS5lYXNlOigiZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49dGEuZWFzZS5hcHBseSh0YSxhcmd1bWVudHMpKSxZKHRoaXMsZnVuY3Rpb24ocil7cltlXVt0XS5lYXNlPW59KSl9LFBsLmRlbGF5PWZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMuaWQsZT10aGlzLm5hbWVzcGFjZTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwxP3RoaXMubm9kZSgpW2VdW3RdLmRlbGF5OlkodGhpcywiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbihyLHUsaSl7cltlXVt0XS5kZWxheT0rbi5jYWxsKHIsci5fX2RhdGFfXyx1LGkpfToobj0rbixmdW5jdGlvbihyKXtyW2VdW3RdLmRlbGF5PW59KSl9LFBsLmR1cmF0aW9uPWZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMuaWQsZT10aGlzLm5hbWVzcGFjZTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwxP3RoaXMubm9kZSgpW2VdW3RdLmR1cmF0aW9uOlkodGhpcywiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbihyLHUsaSl7cltlXVt0XS5kdXJhdGlvbj1NYXRoLm1heCgxLG4uY2FsbChyLHIuX19kYXRhX18sdSxpKSl9OihuPU1hdGgubWF4KDEsbiksZnVuY3Rpb24ocil7cltlXVt0XS5kdXJhdGlvbj1ufSkpfSxQbC5lYWNoPWZ1bmN0aW9uKG4sdCl7dmFyIGU9dGhpcy5pZCxyPXRoaXMubmFtZXNwYWNlO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7dmFyIHU9UmwsaT1UbDt0cnl7VGw9ZSxZKHRoaXMsZnVuY3Rpb24odCx1LGkpe1JsPXRbcl1bZV0sbi5jYWxsKHQsdC5fX2RhdGFfXyx1LGkpfSl9ZmluYWxseXtSbD11LFRsPWl9fWVsc2UgWSh0aGlzLGZ1bmN0aW9uKHUpe3ZhciBpPXVbcl1bZV07KGkuZXZlbnR8fChpLmV2ZW50PXRhLmRpc3BhdGNoKCJzdGFydCIsImVuZCIsImludGVycnVwdCIpKSkub24obix0KX0pO3JldHVybiB0aGlzfSxQbC50cmFuc2l0aW9uPWZ1bmN0aW9uKCl7Zm9yKHZhciBuLHQsZSxyLHU9dGhpcy5pZCxpPSsrVWwsbz10aGlzLm5hbWVzcGFjZSxhPVtdLGM9MCxsPXRoaXMubGVuZ3RoO2w+YztjKyspe2EucHVzaChuPVtdKTtmb3IodmFyIHQ9dGhpc1tjXSxzPTAsZj10Lmxlbmd0aDtmPnM7cysrKShlPXRbc10pJiYocj1lW29dW3VdLCRvKGUscyxvLGkse3RpbWU6ci50aW1lLGVhc2U6ci5lYXNlLGRlbGF5OnIuZGVsYXkrci5kdXJhdGlvbixkdXJhdGlvbjpyLmR1cmF0aW9ufSkpLG4ucHVzaChlKX1yZXR1cm4gWW8oYSxvLGkpfSx0YS5zdmcuYXhpcz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7bi5lYWNoKGZ1bmN0aW9uKCl7dmFyIG4sbD10YS5zZWxlY3QodGhpcykscz10aGlzLl9fY2hhcnRfX3x8ZSxmPXRoaXMuX19jaGFydF9fPWUuY29weSgpLGg9bnVsbD09Yz9mLnRpY2tzP2YudGlja3MuYXBwbHkoZixhKTpmLmRvbWFpbigpOmMsZz1udWxsPT10P2YudGlja0Zvcm1hdD9mLnRpY2tGb3JtYXQuYXBwbHkoZixhKTp5OnQscD1sLnNlbGVjdEFsbCgiLnRpY2siKS5kYXRhKGgsZiksdj1wLmVudGVyKCkuaW5zZXJ0KCJnIiwiLmRvbWFpbiIpLmF0dHIoImNsYXNzIiwidGljayIpLnN0eWxlKCJvcGFjaXR5IixDYSksZD10YS50cmFuc2l0aW9uKHAuZXhpdCgpKS5zdHlsZSgib3BhY2l0eSIsQ2EpLnJlbW92ZSgpLG09dGEudHJhbnNpdGlvbihwLm9yZGVyKCkpLnN0eWxlKCJvcGFjaXR5IiwxKSxNPU1hdGgubWF4KHUsMCkrbyx4PVVpKGYpLGI9bC5zZWxlY3RBbGwoIi5kb21haW4iKS5kYXRhKFswXSksXz0oYi5lbnRlcigpLmFwcGVuZCgicGF0aCIpLmF0dHIoImNsYXNzIiwiZG9tYWluIiksdGEudHJhbnNpdGlvbihiKSk7di5hcHBlbmQoImxpbmUiKSx2LmFwcGVuZCgidGV4dCIpO3ZhciB3LFMsayxFLEE9di5zZWxlY3QoImxpbmUiKSxOPW0uc2VsZWN0KCJsaW5lIiksQz1wLnNlbGVjdCgidGV4dCIpLnRleHQoZyksej12LnNlbGVjdCgidGV4dCIpLHE9bS5zZWxlY3QoInRleHQiKSxMPSJ0b3AiPT09cnx8ImxlZnQiPT09cj8tMToxO2lmKCJib3R0b20iPT09cnx8InRvcCI9PT1yPyhuPUJvLHc9IngiLGs9InkiLFM9IngyIixFPSJ5MiIsQy5hdHRyKCJkeSIsMD5MPyIwZW0iOiIuNzFlbSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLF8uYXR0cigiZCIsIk0iK3hbMF0rIiwiK0wqaSsiVjBIIit4WzFdKyJWIitMKmkpKToobj1Xbyx3PSJ5IixrPSJ4IixTPSJ5MiIsRT0ieDIiLEMuYXR0cigiZHkiLCIuMzJlbSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsMD5MPyJlbmQiOiJzdGFydCIpLF8uYXR0cigiZCIsIk0iK0wqaSsiLCIreFswXSsiSDBWIit4WzFdKyJIIitMKmkpKSxBLmF0dHIoRSxMKnUpLHouYXR0cihrLEwqTSksTi5hdHRyKFMsMCkuYXR0cihFLEwqdSkscS5hdHRyKHcsMCkuYXR0cihrLEwqTSksZi5yYW5nZUJhbmQpe3ZhciBUPWYsUj1ULnJhbmdlQmFuZCgpLzI7cz1mPWZ1bmN0aW9uKG4pe3JldHVybiBUKG4pK1J9fWVsc2Ugcy5yYW5nZUJhbmQ/cz1mOmQuY2FsbChuLGYscyk7di5jYWxsKG4scyxmKSxtLmNhbGwobixmLGYpfSl9dmFyIHQsZT10YS5zY2FsZS5saW5lYXIoKSxyPWpsLHU9NixpPTYsbz0zLGE9WzEwXSxjPW51bGw7cmV0dXJuIG4uc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLm9yaWVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10IGluIEZsP3QrIiI6amwsbik6cn0sbi50aWNrcz1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPWFyZ3VtZW50cyxuKTphfSxuLnRpY2tWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9dCxuKTpjfSxuLnRpY2tGb3JtYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLnRpY2tTaXplPWZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIGU/KHU9K3QsaT0rYXJndW1lbnRzW2UtMV0sbik6dX0sbi5pbm5lclRpY2tTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSt0LG4pOnV9LG4ub3V0ZXJUaWNrU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCxuKTppfSxuLnRpY2tQYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSt0LG4pOm99LG4udGlja1N1YmRpdmlkZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoJiZufSxufTt2YXIgamw9ImJvdHRvbSIsRmw9e3RvcDoxLHJpZ2h0OjEsYm90dG9tOjEsbGVmdDoxfTt0YS5zdmcuYnJ1c2g9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKHQpe3QuZWFjaChmdW5jdGlvbigpe3ZhciB0PXRhLnNlbGVjdCh0aGlzKS5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpLm9uKCJtb3VzZWRvd24uYnJ1c2giLGkpLm9uKCJ0b3VjaHN0YXJ0LmJydXNoIixpKSxvPXQuc2VsZWN0QWxsKCIuYmFja2dyb3VuZCIpLmRhdGEoWzBdKTtvLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJiYWNrZ3JvdW5kIikuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKS5zdHlsZSgiY3Vyc29yIiwiY3Jvc3NoYWlyIiksdC5zZWxlY3RBbGwoIi5leHRlbnQiKS5kYXRhKFswXSkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsImV4dGVudCIpLnN0eWxlKCJjdXJzb3IiLCJtb3ZlIik7dmFyIGE9dC5zZWxlY3RBbGwoIi5yZXNpemUiKS5kYXRhKHYseSk7YS5leGl0KCkucmVtb3ZlKCksYS5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIixmdW5jdGlvbihuKXtyZXR1cm4icmVzaXplICIrbn0pLnN0eWxlKCJjdXJzb3IiLGZ1bmN0aW9uKG4pe3JldHVybiBIbFtuXX0pLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLGZ1bmN0aW9uKG4pe3JldHVybi9bZXddJC8udGVzdChuKT8tMzpudWxsfSkuYXR0cigieSIsZnVuY3Rpb24obil7cmV0dXJuL15bbnNdLy50ZXN0KG4pPy0zOm51bGx9KS5hdHRyKCJ3aWR0aCIsNikuYXR0cigiaGVpZ2h0Iiw2KS5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpLGEuc3R5bGUoImRpc3BsYXkiLG4uZW1wdHkoKT8ibm9uZSI6bnVsbCk7dmFyIGMsZj10YS50cmFuc2l0aW9uKHQpLGg9dGEudHJhbnNpdGlvbihvKTtsJiYoYz1VaShsKSxoLmF0dHIoIngiLGNbMF0pLmF0dHIoIndpZHRoIixjWzFdLWNbMF0pLHIoZikpLHMmJihjPVVpKHMpLGguYXR0cigieSIsY1swXSkuYXR0cigiaGVpZ2h0IixjWzFdLWNbMF0pLHUoZikpLGUoZil9KX1mdW5jdGlvbiBlKG4pe24uc2VsZWN0QWxsKCIucmVzaXplIikuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihuKXtyZXR1cm4idHJhbnNsYXRlKCIrZlsrL2UkLy50ZXN0KG4pXSsiLCIraFsrL15zLy50ZXN0KG4pXSsiKSJ9KX1mdW5jdGlvbiByKG4pe24uc2VsZWN0KCIuZXh0ZW50IikuYXR0cigieCIsZlswXSksbi5zZWxlY3RBbGwoIi5leHRlbnQsLm4+cmVjdCwucz5yZWN0IikuYXR0cigid2lkdGgiLGZbMV0tZlswXSl9ZnVuY3Rpb24gdShuKXtuLnNlbGVjdCgiLmV4dGVudCIpLmF0dHIoInkiLGhbMF0pLG4uc2VsZWN0QWxsKCIuZXh0ZW50LC5lPnJlY3QsLnc+cmVjdCIpLmF0dHIoImhlaWdodCIsaFsxXS1oWzBdKX1mdW5jdGlvbiBpKCl7ZnVuY3Rpb24gaSgpezMyPT10YS5ldmVudC5rZXlDb2RlJiYoQ3x8KE09bnVsbCxxWzBdLT1mWzFdLHFbMV0tPWhbMV0sQz0yKSxTKCkpfWZ1bmN0aW9uIHYoKXszMj09dGEuZXZlbnQua2V5Q29kZSYmMj09QyYmKHFbMF0rPWZbMV0scVsxXSs9aFsxXSxDPTAsUygpKX1mdW5jdGlvbiBkKCl7dmFyIG49dGEubW91c2UoYiksdD0hMTt4JiYoblswXSs9eFswXSxuWzFdKz14WzFdKSxDfHwodGEuZXZlbnQuYWx0S2V5PyhNfHwoTT1bKGZbMF0rZlsxXSkvMiwoaFswXStoWzFdKS8yXSkscVswXT1mWysoblswXTxNWzBdKV0scVsxXT1oWysoblsxXTxNWzFdKV0pOk09bnVsbCksQSYmbShuLGwsMCkmJihyKGspLHQ9ITApLE4mJm0obixzLDEpJiYodShrKSx0PSEwKSx0JiYoZShrKSx3KHt0eXBlOiJicnVzaCIsbW9kZTpDPyJtb3ZlIjoicmVzaXplIn0pKX1mdW5jdGlvbiBtKG4sdCxlKXt2YXIgcix1LGk9VWkodCksYz1pWzBdLGw9aVsxXSxzPXFbZV0sdj1lP2g6ZixkPXZbMV0tdlswXTtyZXR1cm4gQyYmKGMtPXMsbC09ZCtzKSxyPShlP3A6Zyk/TWF0aC5tYXgoYyxNYXRoLm1pbihsLG5bZV0pKTpuW2VdLEM/dT0ocis9cykrZDooTSYmKHM9TWF0aC5tYXgoYyxNYXRoLm1pbihsLDIqTVtlXS1yKSkpLHI+cz8odT1yLHI9cyk6dT1zKSx2WzBdIT1yfHx2WzFdIT11PyhlP2E9bnVsbDpvPW51bGwsdlswXT1yLHZbMV09dSwhMCk6dm9pZCAwfWZ1bmN0aW9uIHkoKXtkKCksay5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zZWxlY3RBbGwoIi5yZXNpemUiKS5zdHlsZSgiZGlzcGxheSIsbi5lbXB0eSgpPyJub25lIjpudWxsKSx0YS5zZWxlY3QoImJvZHkiKS5zdHlsZSgiY3Vyc29yIixudWxsKSxMLm9uKCJtb3VzZW1vdmUuYnJ1c2giLG51bGwpLm9uKCJtb3VzZXVwLmJydXNoIixudWxsKS5vbigidG91Y2htb3ZlLmJydXNoIixudWxsKS5vbigidG91Y2hlbmQuYnJ1c2giLG51bGwpLm9uKCJrZXlkb3duLmJydXNoIixudWxsKS5vbigia2V5dXAuYnJ1c2giLG51bGwpLHooKSx3KHt0eXBlOiJicnVzaGVuZCJ9KX12YXIgTSx4LGI9dGhpcyxfPXRhLnNlbGVjdCh0YS5ldmVudC50YXJnZXQpLHc9Yy5vZihiLGFyZ3VtZW50cyksaz10YS5zZWxlY3QoYiksRT1fLmRhdHVtKCksQT0hL14obnxzKSQvLnRlc3QoRSkmJmwsTj0hL14oZXx3KSQvLnRlc3QoRSkmJnMsQz1fLmNsYXNzZWQoImV4dGVudCIpLHo9VyhiKSxxPXRhLm1vdXNlKGIpLEw9dGEuc2VsZWN0KHQoYikpLm9uKCJrZXlkb3duLmJydXNoIixpKS5vbigia2V5dXAuYnJ1c2giLHYpO2lmKHRhLmV2ZW50LmNoYW5nZWRUb3VjaGVzP0wub24oInRvdWNobW92ZS5icnVzaCIsZCkub24oInRvdWNoZW5kLmJydXNoIix5KTpMLm9uKCJtb3VzZW1vdmUuYnJ1c2giLGQpLm9uKCJtb3VzZXVwLmJydXNoIix5KSxrLmludGVycnVwdCgpLnNlbGVjdEFsbCgiKiIpLmludGVycnVwdCgpLEMpcVswXT1mWzBdLXFbMF0scVsxXT1oWzBdLXFbMV07ZWxzZSBpZihFKXt2YXIgVD0rL3ckLy50ZXN0KEUpLFI9Ky9ebi8udGVzdChFKTt4PVtmWzEtVF0tcVswXSxoWzEtUl0tcVsxXV0scVswXT1mW1RdLHFbMV09aFtSXX1lbHNlIHRhLmV2ZW50LmFsdEtleSYmKE09cS5zbGljZSgpKTtrLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsIm5vbmUiKS5zZWxlY3RBbGwoIi5yZXNpemUiKS5zdHlsZSgiZGlzcGxheSIsbnVsbCksdGEuc2VsZWN0KCJib2R5Iikuc3R5bGUoImN1cnNvciIsXy5zdHlsZSgiY3Vyc29yIikpLHcoe3R5cGU6ImJydXNoc3RhcnQifSksZCgpfXZhciBvLGEsYz1FKG4sImJydXNoc3RhcnQiLCJicnVzaCIsImJydXNoZW5kIiksbD1udWxsLHM9bnVsbCxmPVswLDBdLGg9WzAsMF0sZz0hMCxwPSEwLHY9T2xbMF07cmV0dXJuIG4uZXZlbnQ9ZnVuY3Rpb24obil7bi5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49Yy5vZih0aGlzLGFyZ3VtZW50cyksdD17eDpmLHk6aCxpOm8sajphfSxlPXRoaXMuX19jaGFydF9ffHx0O3RoaXMuX19jaGFydF9fPXQsVGw/dGEuc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKS5lYWNoKCJzdGFydC5icnVzaCIsZnVuY3Rpb24oKXtvPWUuaSxhPWUuaixmPWUueCxoPWUueSxuKHt0eXBlOiJicnVzaHN0YXJ0In0pfSkudHdlZW4oImJydXNoOmJydXNoIixmdW5jdGlvbigpe3ZhciBlPXl1KGYsdC54KSxyPXl1KGgsdC55KTtyZXR1cm4gbz1hPW51bGwsZnVuY3Rpb24odSl7Zj10Lng9ZSh1KSxoPXQueT1yKHUpLG4oe3R5cGU6ImJydXNoIixtb2RlOiJyZXNpemUifSl9fSkuZWFjaCgiZW5kLmJydXNoIixmdW5jdGlvbigpe289dC5pLGE9dC5qLG4oe3R5cGU6ImJydXNoIixtb2RlOiJyZXNpemUifSksbih7dHlwZToiYnJ1c2hlbmQifSl9KToobih7dHlwZToiYnJ1c2hzdGFydCJ9KSxuKHt0eXBlOiJicnVzaCIsbW9kZToicmVzaXplIn0pLG4oe3R5cGU6ImJydXNoZW5kIn0pKX0pfSxuLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9dCx2PU9sWyFsPDwxfCFzXSxuKTpsfSxuLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9dCx2PU9sWyFsPDwxfCFzXSxuKTpzfSxuLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsJiZzPyhnPSEhdFswXSxwPSEhdFsxXSk6bD9nPSEhdDpzJiYocD0hIXQpLG4pOmwmJnM/W2cscF06bD9nOnM/cDpudWxsfSxuLmV4dGVudD1mdW5jdGlvbih0KXt2YXIgZSxyLHUsaSxjO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsJiYoZT10WzBdLHI9dFsxXSxzJiYoZT1lWzBdLHI9clswXSksbz1bZSxyXSxsLmludmVydCYmKGU9bChlKSxyPWwocikpLGU+ciYmKGM9ZSxlPXIscj1jKSwoZSE9ZlswXXx8ciE9ZlsxXSkmJihmPVtlLHJdKSkscyYmKHU9dFswXSxpPXRbMV0sbCYmKHU9dVsxXSxpPWlbMV0pLGE9W3UsaV0scy5pbnZlcnQmJih1PXModSksaT1zKGkpKSx1PmkmJihjPXUsdT1pLGk9YyksKHUhPWhbMF18fGkhPWhbMV0pJiYoaD1bdSxpXSkpLG4pOihsJiYobz8oZT1vWzBdLHI9b1sxXSk6KGU9ZlswXSxyPWZbMV0sbC5pbnZlcnQmJihlPWwuaW52ZXJ0KGUpLHI9bC5pbnZlcnQocikpLGU+ciYmKGM9ZSxlPXIscj1jKSkpLHMmJihhPyh1PWFbMF0saT1hWzFdKToodT1oWzBdLGk9aFsxXSxzLmludmVydCYmKHU9cy5pbnZlcnQodSksaT1zLmludmVydChpKSksdT5pJiYoYz11LHU9aSxpPWMpKSksbCYmcz9bW2UsdV0sW3IsaV1dOmw/W2Uscl06cyYmW3UsaV0pfSxuLmNsZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIG4uZW1wdHkoKXx8KGY9WzAsMF0saD1bMCwwXSxvPWE9bnVsbCksbn0sbi5lbXB0eT1mdW5jdGlvbigpe3JldHVybiEhbCYmZlswXT09ZlsxXXx8ISFzJiZoWzBdPT1oWzFdfSx0YS5yZWJpbmQobixjLCJvbiIpfTt2YXIgSGw9e246Im5zLXJlc2l6ZSIsZToiZXctcmVzaXplIixzOiJucy1yZXNpemUiLHc6ImV3LXJlc2l6ZSIsbnc6Im53c2UtcmVzaXplIixuZToibmVzdy1yZXNpemUiLHNlOiJud3NlLXJlc2l6ZSIsc3c6Im5lc3ctcmVzaXplIn0sT2w9W1sibiIsImUiLCJzIiwidyIsIm53IiwibmUiLCJzZSIsInN3Il0sWyJlIiwidyJdLFsibiIsInMiXSxbXV0sSWw9YWMuZm9ybWF0PWdjLnRpbWVGb3JtYXQsWWw9SWwudXRjLFpsPVlsKCIlWS0lbS0lZFQlSDolTTolUy4lTFoiKTtJbC5pc289RGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcmJituZXcgRGF0ZSgiMjAwMC0wMS0wMVQwMDowMDowMC4wMDBaIik/Sm86WmwsSm8ucGFyc2U9ZnVuY3Rpb24obil7dmFyIHQ9bmV3IERhdGUobik7cmV0dXJuIGlzTmFOKHQpP251bGw6dH0sSm8udG9TdHJpbmc9WmwudG9TdHJpbmcsYWMuc2Vjb25kPUZ0KGZ1bmN0aW9uKG4pe3JldHVybiBuZXcgY2MoMWUzKk1hdGguZmxvb3Iobi8xZTMpKX0sZnVuY3Rpb24obix0KXtuLnNldFRpbWUobi5nZXRUaW1lKCkrMWUzKk1hdGguZmxvb3IodCkpfSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRTZWNvbmRzKCl9KSxhYy5zZWNvbmRzPWFjLnNlY29uZC5yYW5nZSxhYy5zZWNvbmRzLnV0Yz1hYy5zZWNvbmQudXRjLnJhbmdlLGFjLm1pbnV0ZT1GdChmdW5jdGlvbihuKXtyZXR1cm4gbmV3IGNjKDZlNCpNYXRoLmZsb29yKG4vNmU0KSl9LGZ1bmN0aW9uKG4sdCl7bi5zZXRUaW1lKG4uZ2V0VGltZSgpKzZlNCpNYXRoLmZsb29yKHQpKX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0TWludXRlcygpfSksYWMubWludXRlcz1hYy5taW51dGUucmFuZ2UsYWMubWludXRlcy51dGM9YWMubWludXRlLnV0Yy5yYW5nZSxhYy5ob3VyPUZ0KGZ1bmN0aW9uKG4pe3ZhciB0PW4uZ2V0VGltZXpvbmVPZmZzZXQoKS82MDtyZXR1cm4gbmV3IGNjKDM2ZTUqKE1hdGguZmxvb3Iobi8zNmU1LXQpK3QpKX0sZnVuY3Rpb24obix0KXtuLnNldFRpbWUobi5nZXRUaW1lKCkrMzZlNSpNYXRoLmZsb29yKHQpKX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0SG91cnMoKX0pLGFjLmhvdXJzPWFjLmhvdXIucmFuZ2UsYWMuaG91cnMudXRjPWFjLmhvdXIudXRjLnJhbmdlLGFjLm1vbnRoPUZ0KGZ1bmN0aW9uKG4pe3JldHVybiBuPWFjLmRheShuKSxuLnNldERhdGUoMSksbn0sZnVuY3Rpb24obix0KXtuLnNldE1vbnRoKG4uZ2V0TW9udGgoKSt0KX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0TW9udGgoKX0pLGFjLm1vbnRocz1hYy5tb250aC5yYW5nZSxhYy5tb250aHMudXRjPWFjLm1vbnRoLnV0Yy5yYW5nZTt2YXIgVmw9WzFlMyw1ZTMsMTVlMywzZTQsNmU0LDNlNSw5ZTUsMThlNSwzNmU1LDEwOGU1LDIxNmU1LDQzMmU1LDg2NGU1LDE3MjhlNSw2MDQ4ZTUsMjU5MmU2LDc3NzZlNiwzMTUzNmU2XSxYbD1bW2FjLnNlY29uZCwxXSxbYWMuc2Vjb25kLDVdLFthYy5zZWNvbmQsMTVdLFthYy5zZWNvbmQsMzBdLFthYy5taW51dGUsMV0sW2FjLm1pbnV0ZSw1XSxbYWMubWludXRlLDE1XSxbYWMubWludXRlLDMwXSxbYWMuaG91ciwxXSxbYWMuaG91ciwzXSxbYWMuaG91ciw2XSxbYWMuaG91ciwxMl0sW2FjLmRheSwxXSxbYWMuZGF5LDJdLFthYy53ZWVrLDFdLFthYy5tb250aCwxXSxbYWMubW9udGgsM10sW2FjLnllYXIsMV1dLCRsPUlsLm11bHRpKFtbIi4lTCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0TWlsbGlzZWNvbmRzKCl9XSxbIjolUyIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0U2Vjb25kcygpfV0sWyIlSTolTSIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0TWludXRlcygpfV0sWyIlSSAlcCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0SG91cnMoKX1dLFsiJWEgJWQiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldERheSgpJiYxIT1uLmdldERhdGUoKX1dLFsiJWIgJWQiLGZ1bmN0aW9uKG4pe3JldHVybiAxIT1uLmdldERhdGUoKX1dLFsiJUIiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1vbnRoKCl9XSxbIiVZIixOZV1dKSxCbD17cmFuZ2U6ZnVuY3Rpb24obix0LGUpe3JldHVybiB0YS5yYW5nZShNYXRoLmNlaWwobi9lKSplLCt0LGUpLm1hcChLbyl9LGZsb29yOnksY2VpbDp5fTtYbC55ZWFyPWFjLnllYXIsYWMuc2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gR28odGEuc2NhbGUubGluZWFyKCksWGwsJGwpfTt2YXIgV2w9WGwubWFwKGZ1bmN0aW9uKG4pe3JldHVybltuWzBdLnV0YyxuWzFdXX0pLEpsPVlsLm11bHRpKFtbIi4lTCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDTWlsbGlzZWNvbmRzKCl9XSxbIjolUyIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDU2Vjb25kcygpfV0sWyIlSTolTSIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDTWludXRlcygpfV0sWyIlSSAlcCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDSG91cnMoKX1dLFsiJWEgJWQiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ0RheSgpJiYxIT1uLmdldFVUQ0RhdGUoKX1dLFsiJWIgJWQiLGZ1bmN0aW9uKG4pe3JldHVybiAxIT1uLmdldFVUQ0RhdGUoKX1dLFsiJUIiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ01vbnRoKCl9XSxbIiVZIixOZV1dKTtXbC55ZWFyPWFjLnllYXIudXRjLGFjLnNjYWxlLnV0Yz1mdW5jdGlvbigpe3JldHVybiBHbyh0YS5zY2FsZS5saW5lYXIoKSxXbCxKbCl9LHRhLnRleHQ9QXQoZnVuY3Rpb24obil7cmV0dXJuIG4ucmVzcG9uc2VUZXh0fSksdGEuanNvbj1mdW5jdGlvbihuLHQpe3JldHVybiBOdChuLCJhcHBsaWNhdGlvbi9qc29uIixRbyx0KX0sdGEuaHRtbD1mdW5jdGlvbihuLHQpe3JldHVybiBOdChuLCJ0ZXh0L2h0bWwiLG5hLHQpfSx0YS54bWw9QXQoZnVuY3Rpb24obil7cmV0dXJuIG4ucmVzcG9uc2VYTUx9KSwiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZSh0YSk6Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzJiYobW9kdWxlLmV4cG9ydHM9dGEpLHRoaXMuZDM9dGF9KCk7Cg=="></script>
<link href="data:text/css;charset=utf-8,%2EedgebundleR%20%2Enode%20%7B%0Afill%3A%20black%3B%0Afont%2Dfamily%3A%20%22Helvetica%20Neue%22%2C%20Helvetica%2C%20Arial%2C%20sans%2Dserif%3B%0A%7D%0A%2EedgebundleR%20%2Enode%3Ahover%20%7B%0Afont%2Dweight%3A%20800%3B%0Afill%3A%20steelblue%3B%0A%7D%0A%2EedgebundleR%20%2Elink%20%7B%0Astroke%3A%20steelblue%3B%0Astroke%2Dopacity%3A%20%2E3%3B%0Afill%3A%20none%3B%0Apointer%2Devents%3A%20none%3B%0A%7D%0A%2EedgebundleR%20path%2Earc%20%7B%0Acursor%3A%20move%3B%0Afill%3A%20%23fff%3B%0A%7D%0A%2EedgebundleR%20%2Elink%2Esource%20%7B%0Astroke%2Dopacity%3A%201%3B%0Astroke%2Dwidth%3A%202px%3B%0Astroke%3A%20%23d62728%3B%0A%7D%0A%2EedgebundleR%20%2Enode%2Etarget%20%7B%0Afill%3A%20%23d62728%20%3B%0Afont%2Dweight%3A%20800%3B%0A%7D%0A%2EedgebundleR%20%2Enode%2Esource%20%7B%0Afill%3A%20%23d62728%20%3B%20%0Afont%2Dweight%3A%20800%3B%0A%7D%0A%2EedgebundleR%20%2Elink%2Etarget%20%7B%0Astroke%2Dopacity%3A%201%3B%0Astroke%2Dwidth%3A%202px%3B%0Astroke%3A%20%23d62728%3B%20%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewogIHBhY2thZ2VzID0gewoKICAgIC8vIExhemlseSBjb25zdHJ1Y3QgdGhlIHBhY2thZ2UgaGllcmFyY2h5IGZyb20gY2xhc3MgbmFtZXMuCiAgICByb290OiBmdW5jdGlvbihjbGFzc2VzKSB7CiAgICAgIHZhciBtYXAgPSB7fTsKCiAgICAgIGZ1bmN0aW9uIGZpbmQobmFtZSwgZGF0YSkgewogICAgICAgIHZhciBub2RlID0gbWFwW25hbWVdLCBpOwogICAgICAgIGlmICghbm9kZSkgewogICAgICAgICAgbm9kZSA9IG1hcFtuYW1lXSA9IGRhdGEgfHwge25hbWU6IG5hbWUsIGNoaWxkcmVuOiBbXX07CiAgICAgICAgICBpZiAobmFtZS5sZW5ndGgpIHsKICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBmaW5kKG5hbWUuc3Vic3RyaW5nKDAsIGkgPSBuYW1lLmxhc3RJbmRleE9mKCIuIikpKTsKICAgICAgICAgICAgbm9kZS5wYXJlbnQuY2hpbGRyZW4ucHVzaChub2RlKTsKICAgICAgICAgICAgbm9kZS5rZXkgPSBuYW1lLnN1YnN0cmluZyhpICsgMSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBub2RlOwogICAgICB9CiAgICAgIGNsYXNzZXMuZm9yRWFjaChmdW5jdGlvbihkKSB7CiAgICAgICAgZmluZChkLm5hbWUsIGQpOwogICAgICB9KTsKICAgICAgcmV0dXJuIG1hcFsiIl07CiAgICB9LAoKICAgIC8vIFJldHVybiBhIGxpc3Qgb2YgaW1wb3J0cyBmb3IgdGhlIGdpdmVuIGFycmF5IG9mIG5vZGVzLgogICAgaW1wb3J0czogZnVuY3Rpb24obm9kZXMpIHsKICAgICAgdmFyIG1hcCA9IHt9LAogICAgICAgICAgaW1wb3J0cyA9IFtdOwoKICAgICAgLy8gQ29tcHV0ZSBhIG1hcCBmcm9tIG5hbWUgdG8gbm9kZS4KICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihkKSB7CiAgICAgICAgbWFwW2QubmFtZV0gPSBkOwogICAgICB9KTsKCiAgICAgIC8vIEZvciBlYWNoIGltcG9ydCwgY29uc3RydWN0IGEgbGluayBmcm9tIHRoZSBzb3VyY2UgdG8gdGFyZ2V0IG5vZGUuCiAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24oZCkgewogICAgICAgIGlmIChkLmltcG9ydHMpIHsKICAgICAgICAgIGlmKHR5cGVvZiBkLmltcG9ydHMuZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJyl7CiAgICAgICAgICBkLmltcG9ydHMuZm9yRWFjaChmdW5jdGlvbihpKSB7CiAgICAgICAgICBpbXBvcnRzLnB1c2goe3NvdXJjZTogbWFwW2QubmFtZV0sIHRhcmdldDogbWFwW2ldfSk7CiAgICAgICAgfSkKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gaWYgdGhlcmUncyBvbmx5IG9uZSBpbXBvcnQgaW4gZC5pbXBvcnRzIHRoZW4geW91IG5lZWQgdG8gZG8KICAgICAgICAgIC8vIHNvbWV0aGluZyBkaWZmZXJlbnQgYmVjYXVzZSB0aGUgLmZvckVhY2ggYXR0cmlidXRlIGRvZXNuJ3QKICAgICAgICAgIC8vIGV4aXN0OgogICAgICAgICAgaW1wb3J0cy5wdXNoKHtzb3VyY2U6IG1hcFtkLm5hbWVdLCB0YXJnZXQ6IG1hcFtkLmltcG9ydHNdfSk7CiAgICAgICAgfTsKICAgICAgICB9OwogICAgICB9KTsKCiAgICAgIHJldHVybiBpbXBvcnRzOwogICAgfQoKICB9Owp9KSgpOwo="></script>
<script src="data:application/x-javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsKICBuYW1lOiAnZWRnZWJ1bmRsZVInLAogIHR5cGU6ICdvdXRwdXQnLAogIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICByZXR1cm4ge307CiAgfSwKCiAgcmVuZGVyVmFsdWU6IGZ1bmN0aW9uKGVsLCB4aW4sIGluc3RhbmNlKSB7CiAgICAvLyBzYXZlIHBhcmFtcyBmb3IgcmVmZXJlbmNlIGZyb20gcmVzaXplIG1ldGhvZAogICAgaW5zdGFuY2UueGluID0geGluOwogICAgLy8gZHJhdyB0aGUgZ3JhcGhpYwogICAgdGhpcy5kcmF3R3JhcGhpYyhlbCwgeGluLCBlbC5vZmZzZXRXaWR0aCwgZWwub2Zmc2V0SGVpZ2h0KTsKICB9LAogIGRyYXdHcmFwaGljOiBmdW5jdGlvbihlbCwgeGluLCB3aWR0aCwgaGVpZ2h0KXsKICAgIC8vIHJlbW92ZSBleGlzdGluZyBjaGlsZHJlbgogICAgd2hpbGUgKGVsLmZpcnN0Q2hpbGQpCiAgICAgIGVsLnJlbW92ZUNoaWxkKGVsLmZpcnN0Q2hpbGQpOwoKCiAgICB2YXIgc2l6ZSA9IGQzLm1pbihbd2lkdGgsaGVpZ2h0XSk7CiAgICB2YXIgdyA9IHNpemUsCiAgICBoID0gc2l6ZSwKICAgIHJ4ID0gdyAvIDIsCiAgICByeSA9IGggLyAyLAogICAgbTAsCiAgICByb3RhdGUgPSAwOwoKICAgIHZhciBzcGxpbmVzID0gW107CgogICAgdmFyIGNsdXN0ZXIgPSBkMy5sYXlvdXQuY2x1c3RlcigpCiAgICAgICAgICAgICAgICAgIC5zaXplKFszNjAsIHJ5LXhpbi5wYWRkaW5nXSkKICAgICAgICAgICAgICAgICAgLnNvcnQoZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gZDMuYXNjZW5kaW5nKGEua2V5LCBiLmtleSk7IH0pOwoKICAgIHZhciBidW5kbGUgPSBkMy5sYXlvdXQuYnVuZGxlKCk7CiAgICB2YXIgbGluZSA9IGQzLnN2Zy5saW5lLnJhZGlhbCgpCiAgICAgICAgICAgICAgICAgIC5pbnRlcnBvbGF0ZSgiYnVuZGxlIikKICAgICAgICAgICAgICAgICAgLnRlbnNpb24oeGluLnRlbnNpb24pCiAgICAgICAgICAgICAgICAgIC5yYWRpdXMoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC55OyB9KQogICAgICAgICAgICAgICAgICAuYW5nbGUoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC54IC8gMTgwICogTWF0aC5QSTsgfSk7CgogICAgLy92YXIgZGl2ID0gZDMuc2VsZWN0KCJib2R5IikuaW5zZXJ0KCJkaXYiLCAiaDIiKQogICAgdmFyIGRpdiA9IGQzLnNlbGVjdChlbCkuaW5zZXJ0KCJkaXYiKQogICAgICAgICAgICAgICAgLy8uc3R5bGUoInRvcCIsICItODBweCIpCiAgICAgICAgICAgICAgICAvLy5zdHlsZSgibGVmdCIsICItMTYwcHgiKQogICAgICAgICAgICAgICAgLnN0eWxlKCJ3aWR0aCIsIHcgKyAicHgiKQogICAgICAgICAgICAgICAgLnN0eWxlKCJoZWlnaHQiLCB3ICsgInB4IikKICAgICAgICAgICAgICAgIC5zdHlsZSgicG9zaXRpb24iLCAiYWJzb2x1dGUiKQogICAgICAgICAgICAgICAgLnN0eWxlKCJtYXJnaW4tbGVmdCIsICJhdXRvIikKICAgICAgICAgICAgICAgIC5zdHlsZSgibWFyZ2luLXJpZ2h0IiwgImF1dG8iKQogICAgICAgICAgICAgICAgLnN0eWxlKCJsZWZ0IiwgIjAiKQogICAgICAgICAgICAgICAgLnN0eWxlKCJyaWdodCIsICIwIikKICAgICAgICAgICAgICAgIC5zdHlsZSgiYmFja2ZhY2UtdmlzaWJpbGl0eSIsICJoaWRkZW4iKTsKCgogICAgdmFyIHN2ZyA9IGRpdi5hcHBlbmQoInN2ZyIpCiAgICAgICAgICAgICAgICAuYXR0cigid2lkdGgiLCB3ICsgInB4IikKICAgICAgICAgICAgICAgIC5hdHRyKCJoZWlnaHQiLCB3ICsgInB4IikKICAgICAgICAgICAgICAgIC5hcHBlbmQoImciKQogICAgICAgICAgICAgICAgLmF0dHIoImlkIiwiYWN0dWFscGxvdCIpCiAgICAgICAgICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgiICsgcnggKyAiLCIgKyByeSArICIpIik7CgogICAgc3ZnLmFwcGVuZCgicGF0aCIpCiAgICAgIC5hdHRyKCJjbGFzcyIsICJhcmMiKQogICAgICAuYXR0cigiZCIsIGQzLnN2Zy5hcmMoKS5vdXRlclJhZGl1cyhyeSAtIDEyMCkuaW5uZXJSYWRpdXMoMCkucGFkUmFkaXVzKDApLnN0YXJ0QW5nbGUoMCkuZW5kQW5nbGUoMiAqIE1hdGguUEkpKQogICAgICAub24oIm1vdXNlZG93biIsIG1vdXNlZG93bik7CgogICAgY2xhc3NlcyA9IEpTT04ucGFyc2UoeGluLmpzb25fcmVhbCk7CiAgICBub2RlcyA9IGNsdXN0ZXIubm9kZXMocGFja2FnZXMucm9vdChjbGFzc2VzKSk7CiAgICBsaW5rcyA9IHBhY2thZ2VzLmltcG9ydHMobm9kZXMpOwogICAgc3BsaW5lcyA9IGJ1bmRsZShsaW5rcyk7CgogICAgdmFyIHBhdGggPSBzdmcuc2VsZWN0QWxsKCJwYXRoLmxpbmsiKQogICAgICAgICAgICAgICAgLmRhdGEobGlua3MpCiAgICAgICAgICAgICAgICAuZW50ZXIoKS5hcHBlbmQoInBhdGgiKQogICAgICAgICAgICAgICAgLmF0dHIoImNsYXNzIiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gImxpbmsgc291cmNlLSIgKyBkLnNvdXJjZS5rZXkgKyAiIHRhcmdldC0iICsgZC50YXJnZXQua2V5OwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5hdHRyKCJkIiwgZnVuY3Rpb24oZCwgaSkgeyByZXR1cm4gbGluZShzcGxpbmVzW2ldKTsgfSkKICAgICAgICAgICAgICAgIC5zdHlsZSgic3Ryb2tlIiwgZnVuY3Rpb24oZCl7CiAgICAgICAgICAgICAgICAgIGlmKGQuc291cmNlLmNvbG9yKSByZXR1cm4gZC5zb3VyY2UuY29sb3I7CiAgICAgICAgICAgICAgICAgIC8qaWYoIXhpbi5kaXJlY3RlZCkgcmV0dXJuICdzdGVlbGJsdWUnOyovCiAgICAgICAgICAgICAgICB9KTsKCiAgICB2YXIgbm9kZXNfZyA9IHN2Zy5zZWxlY3RBbGwoImcubm9kZSIpCiAgICAgIC5kYXRhKG5vZGVzLmZpbHRlcihmdW5jdGlvbihuKSB7IHJldHVybiAhbi5jaGlsZHJlbjsgfSkpCiAgICAgIC5lbnRlcigpLmFwcGVuZCgiZyIpCiAgICAgICAgLmF0dHIoImNsYXNzIiwgIm5vZGUiKQogICAgICAgIC5hdHRyKCJpZCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuICJub2RlLSIgKyBkLmtleTsgfSkKICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gInJvdGF0ZSgiICsgKGQueCAtIDkwKSArICIpdHJhbnNsYXRlKCIgKyBkLnkgKyAiKSI7IH0pCiAgICAgICAgLnN0eWxlKCJmb250LXNpemUiLHhpbi5mb250c2l6ZSk7CgogICAgbm9kZXNfZy5hcHBlbmQoInRleHQiKQogICAgICAuYXR0cigiZHgiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnggPCAxODAgPyA4IDogLTg7IH0pCiAgICAgIC5hdHRyKCJkeSIsICIuMzFlbSIpCiAgICAgIC5hdHRyKCJ0ZXh0LWFuY2hvciIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQueCA8IDE4MCA/ICJzdGFydCIgOiAiZW5kIjsgfSkKICAgICAgLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQueCA8IDE4MCA/IG51bGwgOiAicm90YXRlKDE4MCkiOyB9KQogICAgICAuc3R5bGUoImZpbGwiLCBmdW5jdGlvbihkKXsKICAgICAgICBpZihkLmNvbG9yKSByZXR1cm4gZC5jb2xvcjsKICAgICAgfSkKICAgICAgLnRleHQoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5rZXk7IH0pCiAgICAgIC5vbigibW91c2VvdmVyIiwgbW91c2VvdmVyKQogICAgICAub24oIm1vdXNlb3V0IiwgbW91c2VvdXQpOwoKICAgIC8vIHNldCB1cCBhIHNjYWxlIHRvIHNpemUgbm9kZXMgYmFzZWQgb24geGluLm5vZGVzaXplCiAgICB2YXIgbm9kZXNpemVyID0gZDMuc2NhbGUubGluZWFyKCkKICAgICAgLmRvbWFpbihkMy5leHRlbnQobm9kZXMubWFwKGZ1bmN0aW9uKGQpe3JldHVybiBkLnNpemV9KSkpCiAgICAgIC5yYW5nZSh4aW4ubm9kZXNpemUpOwoKICAgIG5vZGVzX2cuYXBwZW5kKCJjaXJjbGUiKQogICAgCS5hdHRyKCJjeCIsIDApCiAgICAJLmF0dHIoImN5IiwgMCkKICAgIAkuYXR0cigiZmlsbCIsIGZ1bmN0aW9uKGQsaSl7CiAgICAgICAgaWYoZC5jb2xvcikgcmV0dXJuIGQuY29sb3I7CiAgICAgICAgcmV0dXJuICdzdGVlbGJsdWUnOwogICAgCX0pCiAgICAJLmF0dHIoIm9wYWNpdHkiLCAxLjApCiAgICAJLmF0dHIoInIiLCBmdW5jdGlvbihkLGkpewogICAgCSAgdmFyIHNpemUgPSBkMy5tYXgobm9kZXNpemVyLnJhbmdlKCkpOwogICAgCSAgaWYoZC5zaXplKXsKICAgIAkgICAgc2l6ZSA9IG5vZGVzaXplcihkLnNpemUpCiAgCSAgICB9CiAgICAJICByZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdyhzaXplLCAxLzIpKTsKICAgIAl9KTsKCiAgICBkMy5zZWxlY3QoZWwpCiAgICAgIC5vbigibW91c2Vtb3ZlIiwgbW91c2Vtb3ZlKQogICAgICAub24oIm1vdXNldXAiLCBtb3VzZXVwKTsKCiAgICBmdW5jdGlvbiBtb3VzZShlKSB7CiAgICAgIHJldHVybiBbZS5wYWdlWCAtIHJ4LCBlLnBhZ2VZIC0gcnldOwogICAgfQoKICAgIGZ1bmN0aW9uIG1vdXNlZG93bigpIHsKICAgICAgbTAgPSBtb3VzZShkMy5ldmVudCk7CiAgICAgIGQzLmV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICB9CgogICAgZnVuY3Rpb24gbW91c2Vtb3ZlKCkgewogICAgICBpZiAobTApIHsKICAgICAgICB2YXIgbTEgPSBtb3VzZShkMy5ldmVudCksCiAgICAgICAgZG0gPSBNYXRoLmF0YW4yKGNyb3NzKG0wLCBtMSksIGRvdChtMCwgbTEpKSAqIDE4MCAvIE1hdGguUEk7CiAgICAgICAgZGl2LnN0eWxlKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlWSgiICsgKHJ5IC0gcngpICsgInB4KXJvdGF0ZVooIiArIGRtICsgImRlZyl0cmFuc2xhdGVZKCIgKyAocnggLSByeSkgKyAicHgpIik7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBtb3VzZXVwKCkgewogICAgICBpZiAobTApIHsKICAgICAgICB2YXIgbTEgPSBtb3VzZShkMy5ldmVudCksCiAgICAgICAgZG0gPSBNYXRoLmF0YW4yKGNyb3NzKG0wLCBtMSksIGRvdChtMCwgbTEpKSAqIDE4MCAvIE1hdGguUEk7CiAgICAgICAgcm90YXRlICs9IGRtOwogICAgICAgIGlmIChyb3RhdGUgPiAzNjApIHJvdGF0ZSAtPSAzNjA7CiAgICAgICAgZWxzZSBpZiAocm90YXRlIDwgMCkgcm90YXRlICs9IDM2MDsKICAgICAgICBtMCA9IG51bGw7CiAgICAgICAgZGl2LnN0eWxlKCJ0cmFuc2Zvcm0iLCBudWxsKTsKICAgICAgICBzdmcKICAgICAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlKCIgKyByeCArICIsIiArIHJ5ICsgIilyb3RhdGUoIiArIHJvdGF0ZSArICIpIikKICAgICAgICAgIC5zZWxlY3RBbGwoImcubm9kZSB0ZXh0IikKICAgICAgICAgIC5hdHRyKCJkeCIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgcmV0dXJuIChkLnggKyByb3RhdGUpICUgMzYwIDwgMTgwID8gOCA6IC04OwogICAgICAgICAgfSkKICAgICAgICAgIC5hdHRyKCJ0ZXh0LWFuY2hvciIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgcmV0dXJuIChkLnggKyByb3RhdGUpICUgMzYwIDwgMTgwID8gInN0YXJ0IiA6ICJlbmQiOwogICAgICAgICAgfSkKICAgICAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgIHJldHVybiAoZC54ICsgcm90YXRlKSAlIDM2MCA8IDE4MCA/IG51bGwgOiAicm90YXRlKDE4MCkiOwogICAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBtb3VzZW92ZXIoZCkgewogICAgICBzdmcuc2VsZWN0QWxsKCJwYXRoLmxpbmsudGFyZ2V0LSIgKyBkLmtleSkKICAgICAgICAuY2xhc3NlZCgidGFyZ2V0IiwgdHJ1ZSkKICAgICAgICAuZWFjaCh1cGRhdGVOb2Rlcygic291cmNlIiwgdHJ1ZSkpOwogICAgICBzdmcuc2VsZWN0QWxsKCJwYXRoLmxpbmsuc291cmNlLSIgKyBkLmtleSkKICAgICAgICAuY2xhc3NlZCgic291cmNlIiwgdHJ1ZSkKICAgICAgICAuZWFjaCh1cGRhdGVOb2RlcygidGFyZ2V0IiwgdHJ1ZSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIG1vdXNlb3V0KGQpIHsKICAgICAgc3ZnLnNlbGVjdEFsbCgicGF0aC5saW5rLnNvdXJjZS0iICsgZC5rZXkpCiAgICAgICAgLmNsYXNzZWQoInNvdXJjZSIsIGZhbHNlKQogICAgICAgIC5lYWNoKHVwZGF0ZU5vZGVzKCJ0YXJnZXQiLCBmYWxzZSkpOwogICAgICBzdmcuc2VsZWN0QWxsKCJwYXRoLmxpbmsudGFyZ2V0LSIgKyBkLmtleSkKICAgICAgICAuY2xhc3NlZCgidGFyZ2V0IiwgZmFsc2UpCiAgICAgICAgLmVhY2godXBkYXRlTm9kZXMoInNvdXJjZSIsIGZhbHNlKSk7CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlTm9kZXMobmFtZSwgdmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGQpIHsKICAgICAgICBpZiAodmFsdWUpIHRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzKTsKICAgICAgICBzdmcuc2VsZWN0KCIjbm9kZS0iICsgZFtuYW1lXS5rZXkpLmNsYXNzZWQobmFtZSwgdmFsdWUpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNyb3NzKGEsIGIpIHsKICAgICAgcmV0dXJuIGFbMF0gKiBiWzFdIC0gYVsxXSAqIGJbMF07CiAgICB9CgogICAgZnVuY3Rpb24gZG90KGEsIGIpIHsKICAgICAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV07CiAgICB9CgoKICB9LAogIHJlc2l6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQsIGluc3RhbmNlKSB7CiAgICBpZihpbnN0YW5jZS54aW4pewogICAgICB0aGlzLmRyYXdHcmFwaGljKGVsLCBpbnN0YW5jZS54aW4sIHdpZHRoLCBoZWlnaHQpOwogICAgfQogIH0KfSk7Cg=="></script>
</head>
<body style="background-color:white;">
<div id="htmlwidget_container">
<div id="htmlwidget-786b6455b7c0b4a1963d" class="edgebundleR html-widget" style="width:960px;height:500px;">
</div>
</div>
<script type="application/json" data-for="htmlwidget-786b6455b7c0b4a1963d">{"x":{"json_real":"[{\"name\":\"Aida Alvarez\",\"color\":\"5\",\"Color\":\"red\",\"imports\":\"Walmart\"},{\"name\":\"Alain Monie\",\"color\":\"4\",\"Color\":\"red\",\"imports\":\"Amazon\"},{\"name\":\"Alan Mulally\",\"color\":\"2\",\"Color\":\"red\",\"imports\":\"Google\"},{\"name\":\"Albert Gore\",\"color\":\"1\",\"Color\":\"red\",\"imports\":\"Apple\"},{\"name\":\"Andrea Jung\",\"color\":\"1\",\"Color\":\"red\",\"imports\":\"Apple\"},{\"name\":\"Ann Mather\",\"color\":\"2\",\"Color\":\"red\",\"imports\":\"Google\"},{\"name\":\"Arthur Levinson\",\"color\":\"1\",\"Color\":\"red\",\"imports\":\"Apple\"},{\"name\":\"Aylwinn Lewis\",\"color\":\"3\",\"Color\":\"red\",\"imports\":\"Disney\"},{\"name\":\"David Rosenblatt\",\"color\":\"8\",\"Color\":\"red\",\"imports\":\"Twitter\"},{\"name\":\"Diane Greene\",\"color\":\"2\",\"Color\":\"red\",\"imports\":\"Google\"},{\"name\":\"Dick Costolo\",\"color\":\"8\",\"Color\":\"red\",\"imports\":\"Twitter\"},{\"name\":\"Donald Graham\",\"color\":\"6\",\"Color\":\"red\",\"imports\":\"Facebook\"},{\"name\":\"Doug McMillon\",\"color\":\"5\",\"Color\":\"red\",\"imports\":\"Walmart\"},{\"name\":\"Douglas Daft\",\"color\":\"5\",\"Color\":\"red\",\"imports\":\"Walmart\"},{\"name\":\"Eric Schmidt\",\"color\":\"2\",\"Color\":\"red\",\"imports\":\"Google\"},{\"name\":\"Erskine Bowles\",\"color\":\"6\",\"Color\":\"red\",\"imports\":\"Facebook\"},{\"name\":\"Evan Williams\",\"color\":\"8\",\"Color\":\"red\",\"imports\":\"Twitter\"},{\"name\":\"Fred Langhammer\",\"color\":\"3\",\"Color\":\"red\",\"imports\":\"Disney\"},{\"name\":\"Gregory Penner\",\"color\":\"5\",\"Color\":\"red\",\"imports\":\"Walmart\"},{\"name\":\"Henrietta Fore\",\"color\":\"7\",\"Color\":\"red\",\"imports\":\"Exxon Mobile\"},{\"name\":\"Jack Dorsey\",\"color\":\"3\",\"Color\":\"red\",\"imports\":[\"Disney\",\"Twitter\"]},{\"name\":\"James Cash\",\"color\":\"8\",\"Color\":\"red\",\"imports\":\"Walmart\"},{\"name\":\"Jamie Gorelick\",\"color\":\"5\",\"Color\":\"red\",\"imports\":\"Amazon\"},{\"name\":\"Jan Koum\",\"color\":\"4\",\"Color\":\"red\",\"imports\":\"Facebook\"},{\"name\":\"Jay Fishman\",\"color\":\"6\",\"Color\":\"red\",\"imports\":\"Exxon Mobile\"},{\"name\":\"Jeff Bezos\",\"color\":\"7\",\"Color\":\"red\",\"imports\":\"Amazon\"},{\"name\":\"Jim Walton\",\"color\":\"4\",\"Color\":\"red\",\"imports\":\"Walmart\"},{\"name\":\"John Brown\",\"color\":\"5\",\"Color\":\"red\",\"imports\":\"Amazon\"},{\"name\":\"John Chen\",\"color\":\"4\",\"Color\":\"red\",\"imports\":\"Disney\"},{\"name\":\"John Hennessy\",\"color\":\"3\",\"Color\":\"red\",\"imports\":\"Google\"},{\"name\":\"Jonathan Rubinstein\",\"color\":\"2\",\"Color\":\"red\",\"imports\":\"Amazon\"},{\"name\":\"Judith McGrath\",\"color\":\"4\",\"Color\":\"red\",\"imports\":\"Amazon\"},{\"name\":\"K.Ram Shriram\",\"color\":\"4\",\"Color\":\"red\",\"imports\":\"Google\"},{\"name\":\"Kenneth Frazier\",\"color\":\"2\",\"Color\":\"red\",\"imports\":\"Exxon Mobile\"},{\"name\":\"Kevin Systrom\",\"color\":\"7\",\"Color\":\"red\",\"imports\":\"Walmart\"},{\"name\":\"L. John Doerr\",\"color\":\"5\",\"Color\":\"red\",\"imports\":\"Google\"},{\"name\":\"Larry Faulkner\",\"color\":\"2\",\"Color\":\"red\",\"imports\":\"Exxon Mobile\"},{\"name\":\"Larry Page\",\"color\":\"7\",\"Color\":\"red\",\"imports\":\"Google\"},{\"name\":\"Linda Wolf\",\"color\":\"2\",\"Color\":\"red\",\"imports\":\"Walmart\"},{\"name\":\"Marc Andreessen\",\"color\":\"5\",\"Color\":\"red\",\"imports\":\"Facebook\"},{\"name\":\"Marissa Mayer\",\"color\":\"6\",\"Color\":\"red\",\"imports\":\"Walmart\"},{\"name\":\"Marjorie Scardino\",\"color\":\"5\",\"Color\":\"red\",\"imports\":\"Twitter\"},{\"name\":\"Mark Zuckerberg\",\"color\":\"8\",\"Color\":\"red\",\"imports\":\"Facebook\"},{\"name\":\"Michael Boskin\",\"color\":\"6\",\"Color\":\"red\",\"imports\":\"Exxon Mobile\"},{\"name\":\"Mike Duke\",\"color\":\"7\",\"Color\":\"red\",\"imports\":\"Walmart\"},{\"name\":\"Millard Drexler\",\"color\":\"5\",\"Color\":\"red\",\"imports\":\"Apple\"},{\"name\":\"Monica Lozano\",\"color\":\"1\",\"Color\":\"red\",\"imports\":\"Disney\"},{\"name\":\"Orin Smith\",\"color\":\"3\",\"Color\":\"red\",\"imports\":\"Disney\"},{\"name\":\"Pamela Craig\",\"color\":\"3\",\"Color\":\"red\",\"imports\":\"Walmart\"},{\"name\":\"Patricia Stonesifer\",\"color\":\"5\",\"Color\":\"red\",\"imports\":\"Amazon\"},{\"name\":\"Paul Otellini\",\"color\":\"4\",\"Color\":\"red\",\"imports\":\"Google\"},{\"name\":\"Peter Brabeck-Letmathe\",\"color\":\"2\",\"Color\":\"red\",\"imports\":\"Exxon Mobile\"},{\"name\":\"Peter Chernin\",\"color\":\"7\",\"Color\":\"red\",\"imports\":\"Twitter\"},{\"name\":\"Peter Currie\",\"color\":\"8\",\"Color\":\"red\",\"imports\":\"Twitter\"},{\"name\":\"Peter Fenton\",\"color\":\"8\",\"Color\":\"red\",\"imports\":\"Twitter\"},{\"name\":\"Peter Thiel\",\"color\":\"8\",\"Color\":\"red\",\"imports\":\"Facebook\"},{\"name\":\"Reed Hastings\",\"color\":\"6\",\"Color\":\"red\",\"imports\":\"Facebook\"},{\"name\":\"Rex Tillerson\",\"color\":\"6\",\"Color\":\"red\",\"imports\":\"Exxon Mobile\"},{\"name\":\"Rob Walton\",\"color\":\"7\",\"Color\":\"red\",\"imports\":\"Walmart\"},{\"name\":\"Robert Iger\",\"color\":\"5\",\"Color\":\"red\",\"imports\":[\"Apple\",\"Disney\"]},{\"name\":\"Robert Matschullat\",\"color\":\"1\",\"Color\":\"red\",\"imports\":\"Disney\"},{\"name\":\"Roger Corbett\",\"color\":\"3\",\"Color\":\"red\",\"imports\":\"Walmart\"},{\"name\":\"Ronald Sugar\",\"color\":\"3\",\"Color\":\"red\",\"imports\":\"Apple\"},{\"name\":\"Samuel Palmisano\",\"color\":\"5\",\"Color\":\"red\",\"imports\":\"Exxon Mobile\"},{\"name\":\"Sergey Brin\",\"color\":\"1\",\"Color\":\"red\",\"imports\":\"Google\"},{\"name\":\"Sheryl Sandberg\",\"color\":\"7\",\"Color\":\"red\",\"imports\":[\"Disney\",\"Facebook\"]},{\"name\":\"Shirley Tilghman\",\"color\":\"2\",\"Color\":\"red\",\"imports\":\"Google\"},{\"name\":\"Steven Reinemund\",\"color\":\"3\",\"Color\":\"red\",\"imports\":[\"Walmart\",\"Exxon Mobile\"]},{\"name\":\"Susan Arnold\",\"color\":\"6\",\"Color\":\"red\",\"imports\":\"Disney\"},{\"name\":\"Susan Desmond-Hellmann\",\"color\":\"2\",\"Color\":\"red\",\"imports\":\"Facebook\"},{\"name\":\"Susan Wagner\",\"color\":\"5\",\"Color\":\"red\",\"imports\":\"Apple\"},{\"name\":\"Thomas Ryder\",\"color\":\"7\",\"Color\":\"red\",\"imports\":\"Amazon\"},{\"name\":\"Timothy Cook\",\"color\":\"3\",\"Color\":\"red\",\"imports\":\"Apple\"},{\"name\":\"Timothy Flynn\",\"color\":\"6\",\"Color\":\"red\",\"imports\":\"Walmart\"},{\"name\":\"Tom Alberg\",\"color\":\"1\",\"Color\":\"red\",\"imports\":\"Amazon\"},{\"name\":\"Tom Horton\",\"color\":\"4\",\"Color\":\"red\",\"imports\":\"Walmart\"},{\"name\":\"Ursula Burns\",\"color\":\"1\",\"Color\":\"red\",\"imports\":\"Exxon Mobile\"},{\"name\":\"William George\",\"color\":\"5\",\"Color\":\"red\",\"imports\":\"Exxon Mobile\"},{\"name\":\"William Gordon\",\"color\":\"4\",\"Color\":\"red\",\"imports\":\"Amazon\"},{\"name\":\"William Weldon\",\"color\":\"5\",\"Color\":\"red\",\"imports\":\"Exxon Mobile\"},{\"name\":\"Walmart\",\"color\":\"7\",\"Color\":\"red\",\"imports\":null},{\"name\":\"Amazon\",\"color\":\"7\",\"Color\":\"red\",\"imports\":null},{\"name\":\"Google\",\"color\":\"4\",\"Color\":\"red\",\"imports\":null},{\"name\":\"Apple\",\"color\":\"7\",\"Color\":\"red\",\"imports\":null},{\"name\":\"Disney\",\"color\":\"5\",\"Color\":\"red\",\"imports\":null},{\"name\":\"Twitter\",\"color\":\"4\",\"Color\":\"red\",\"imports\":null},{\"name\":\"Facebook\",\"color\":\"2\",\"Color\":\"red\",\"imports\":null},{\"name\":\"Exxon Mobile\",\"color\":\"1\",\"Color\":\"red\",\"imports\":null}]","width":null,"height":null,"padding":130,"tension":0.8,"fontsize":12,"nodesize":[5,20],"directed":true},"evals":[],"jsHooks":[]}</script>
<script type="application/htmlwidget-sizing" data-for="htmlwidget-786b6455b7c0b4a1963d">{"viewer":{"width":450,"height":350,"padding":15,"fill":true},"browser":{"width":960,"height":500,"padding":40,"fill":false}}</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment