<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEFkZCBhIG1ldGhvZCB0byBkZWxlZ2F0b3IgdGhhdCwgd2hlbiBpbnZva2VkLCBjYWxscwogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbgogIC8vIHRoZSBkZWxlZ2F0ZWUsIGJ1dCB0aGVyZSB3YXMgb25lIG9uIGRlbGVnYXRvciBiZWZvcmUKICAvLyBkZWxlZ2F0ZU1ldGhvZCB3YXMgY2FsbGVkLCB0aGVuIHRoZSBvcmlnaW5hbCB2ZXJzaW9uCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gdmFyIGEgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ExJyk7IH0KICAvLyAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYTInKTsgfQogIC8vIH07CiAgLy8gdmFyIGIgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2IxJyk7IH0KICAvLyB9OwogIC8vIGRlbGVnYXRlTWV0aG9kKGEsIGIsICJtZXRob2QxIik7CiAgLy8gZGVsZWdhdGVNZXRob2QoYSwgYiwgIm1ldGhvZDIiKTsKICAvLyBhLm1ldGhvZDEoKTsKICAvLyBhLm1ldGhvZDIoKTsKICAvLwogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4KICBmdW5jdGlvbiBkZWxlZ2F0ZU1ldGhvZChkZWxlZ2F0b3IsIGRlbGVnYXRlZSwgbWV0aG9kTmFtZSkgewogICAgdmFyIGluaGVyaXRlZCA9IGRlbGVnYXRvclttZXRob2ROYW1lXTsKICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdGFyZ2V0ID0gZGVsZWdhdGVlOwogICAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGVlW21ldGhvZE5hbWVdOwoKICAgICAgLy8gVGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0IG9uIHRoZSBkZWxlZ2F0ZWUuIEluc3RlYWQsCiAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBvbiB0aGUgZGVsZWdhdG9yLCBpZiBpdCBleGlzdHMuCiAgICAgIGlmICghbWV0aG9kKSB7CiAgICAgICAgdGFyZ2V0ID0gZGVsZWdhdG9yOwogICAgICAgIG1ldGhvZCA9IGluaGVyaXRlZDsKICAgICAgfQoKICAgICAgaWYgKG1ldGhvZCkgewogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gSW1wbGVtZW50IGEgdmFndWUgZmFjc2ltaWxpZSBvZiBqUXVlcnkncyBkYXRhIG1ldGhvZAogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICByZXR1cm4gZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV07CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgewogICAgICBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXSA9IHZhbHVlOwogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGVsZW1lbnREYXRhOiAiICsKICAgICAgICBhcmd1bWVudHMubGVuZ3RoKTsKICAgIH0KICB9CgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleAogIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCAiXFwkJiIpOwogIH0KCiAgZnVuY3Rpb24gaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkgewogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOwogICAgcmV0dXJuIHJlLnRlc3QoZWwuY2xhc3NOYW1lKTsKICB9CgogIC8vIGVsZW1lbnRzIC0gYXJyYXkgKG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBvZiBIVE1MIGVsZW1lbnRzCiAgLy8gY2xhc3NOYW1lIC0gY2xhc3MgbmFtZSB0byB0ZXN0IGZvcgogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsKICAvLyAgIGlmIGZhbHNlLCBvbmx5IHJldHVybiBlbGVtZW50cyAqd2l0aG91dCogZ2l2ZW4gY2xhc3NOYW1lCiAgZnVuY3Rpb24gZmlsdGVyQnlDbGFzcyhlbGVtZW50cywgY2xhc3NOYW1lLCBpbmNsdWRlKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaGFzQ2xhc3MoZWxlbWVudHNbaV0sIGNsYXNzTmFtZSkgPT0gaW5jbHVkZSkKICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQoKICBmdW5jdGlvbiBvbihvYmosIGV2ZW50TmFtZSwgZnVuYykgewogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgZmFsc2UpOwogICAgfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpIHsKICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvZmYob2JqLCBldmVudE5hbWUsIGZ1bmMpIHsKICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7CiAgICBlbHNlIGlmIChvYmouZGV0YWNoRXZlbnQpIHsKICAgICAgb2JqLmRldGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aAogIC8vIHRoZSAicGFkZGluZyIgQ1NTIHByb3BlcnR5CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3BhZGRpbmcKICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7CiAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgIHZhbHVlID0gW3ZhbHVlXTsKICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMF0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzBdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzNdfTsKICAgIH0KICB9CgogIC8vIENvbnZlcnQgYW4gdW5wYWNrZWQgcGFkZGluZyBvYmplY3QgdG8gYSBDU1MgdmFsdWUKICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgewogICAgcmV0dXJuIHBhZGRpbmdPYmoudG9wICsgInB4ICIgKyBwYWRkaW5nT2JqLnJpZ2h0ICsgInB4ICIgKyBwYWRkaW5nT2JqLmJvdHRvbSArICJweCAiICsgcGFkZGluZ09iai5sZWZ0ICsgInB4IjsKICB9CgogIC8vIE1ha2VzIGEgbnVtYmVyIHN1aXRhYmxlIGZvciBDU1MKICBmdW5jdGlvbiBweCh4KSB7CiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIHggKyAicHgiOwogICAgZWxzZQogICAgICByZXR1cm4geDsKICB9CgogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuCiAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIgbnVsbCwgb3IgYW4gb2JqZWN0IHdpdGggZmlsbCwgcGFkZGluZywKICAvLyBkZWZhdWx0V2lkdGgsIGRlZmF1bHRIZWlnaHQgZmllbGRzLgogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgewogICAgdmFyIHNpemluZ0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vaHRtbHdpZGdldC1zaXppbmcnXSIpOwogICAgaWYgKCFzaXppbmdFbCkKICAgICAgcmV0dXJuIG51bGw7CiAgICB2YXIgc3AgPSBKU09OLnBhcnNlKHNpemluZ0VsLnRleHRDb250ZW50IHx8IHNpemluZ0VsLnRleHQgfHwgInt9Iik7CiAgICBpZiAodmlld2VyTW9kZSkgewogICAgICByZXR1cm4gc3Audmlld2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHNwLmJyb3dzZXI7CiAgICB9CiAgfQoKICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLgogIC8vICAgRWFjaCBlbGVtZW50IG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdGhhdCB5aWVsZHMgYQogIC8vICAgZnVuY3Rpb24uIE9yLCBjYW4gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICJjb2RlIiBhbmQgImRhdGEiCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nCiAgLy8gICBvZiBKUyB0aGF0J3MgYW4gZXhwciB0aGF0IHlpZWxkcyBhIGZ1bmN0aW9uLCBhbmQgImRhdGEiIHNob3VsZCBiZQogIC8vICAgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBhZGRlZCBhcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHdoZW4gdGhhdAogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLgogIC8vIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgInRoaXMiIGZvciBlYWNoIGZ1bmN0aW9uCiAgLy8gICBleGVjdXRpb24uCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlCiAgLy8gICBzYW1lIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zLikKICBmdW5jdGlvbiBldmFsQW5kUnVuKHRhc2tzLCB0YXJnZXQsIGFyZ3MpIHsKICAgIGlmICh0YXNrcykgewogICAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgdmFyIHRoZXNlQXJncyA9IGFyZ3M7CiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHRoZXNlQXJncyA9IHRoZXNlQXJncy5jb25jYXQoW3Rhc2suZGF0YV0pOwogICAgICAgICAgdGFzayA9IHRhc2suY29kZTsKICAgICAgICB9CiAgICAgICAgdmFyIHRhc2tGdW5jID0gZXZhbCgiKCIgKyB0YXNrICsgIikiKTsKICAgICAgICBpZiAodHlwZW9mKHRhc2tGdW5jKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOwogICAgICAgIH0KICAgICAgICB0YXNrRnVuYy5hcHBseSh0YXJnZXQsIHRoZXNlQXJncyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdFNpemluZyhlbCkgewogICAgdmFyIHNpemluZyA9IHNpemluZ1BvbGljeShlbCk7CiAgICBpZiAoIXNpemluZykKICAgICAgcmV0dXJuOwoKICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsKICAgIGlmICghY2VsKQogICAgICByZXR1cm47CgogICAgaWYgKHR5cGVvZihzaXppbmcucGFkZGluZykgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luID0gIjAiOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOwogICAgfQoKICAgIGlmIChzaXppbmcuZmlsbCkgewogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIGlmIChjZWwpIHsKICAgICAgICBjZWwuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgIHZhciBwYWQgPSB1bnBhY2tQYWRkaW5nKHNpemluZy5wYWRkaW5nKTsKICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLnJpZ2h0ID0gcGFkLnJpZ2h0ICsgInB4IjsKICAgICAgICBjZWwuc3R5bGUuYm90dG9tID0gcGFkLmJvdHRvbSArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7CiAgICAgICAgZWwuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwKICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY2VsLm9mZnNldEhlaWdodDsgfQogICAgICB9OwoKICAgIH0gZWxzZSB7CiAgICAgIGVsLnN0eWxlLndpZHRoID0gcHgoc2l6aW5nLndpZHRoKTsKICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LAogICAgICAgIGdldEhlaWdodDogZnVuY3Rpb24oKSB7IHJldHVybiBlbC5vZmZzZXRIZWlnaHQ7IH0KICAgICAgfTsKICAgIH0KICB9CgogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzCiAgdmFyIGRlZmF1bHRzID0gewogICAgZmluZDogZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7CiAgICB9LAogICAgcmVuZGVyRXJyb3I6IGZ1bmN0aW9uKGVsLCBlcnIpIHsKICAgICAgdmFyICRlbCA9ICQoZWwpOwoKICAgICAgdGhpcy5jbGVhckVycm9yKGVsKTsKCiAgICAgIC8vIEFkZCBhbGwgdGhlc2UgZXJyb3IgY2xhc3NlcywgYXMgU2hpbnkgZG9lcwogICAgICB2YXIgZXJyQ2xhc3MgPSAic2hpbnktb3V0cHV0LWVycm9yIjsKICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7CiAgICAgICAgLy8gdXNlIHRoZSBjbGFzc2VzIG9mIHRoZSBlcnJvciBjb25kaXRpb24gYXMgQ1NTIGNsYXNzIG5hbWVzCiAgICAgICAgZXJyQ2xhc3MgPSBlcnJDbGFzcyArICIgIiArICQubWFwKGFzQXJyYXkoZXJyLnR5cGUpLCBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOwogICAgICAgIH0pLmpvaW4oIiAiKTsKICAgICAgfQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7CgogICAgICAvLyBJcyBlbCBpbmxpbmUgb3IgYmxvY2s/IElmIGlubGluZSBvciBpbmxpbmUtYmxvY2ssIGp1c3QgZGlzcGxheTpub25lIGl0CiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLgogICAgICB2YXIgZGlzcGxheSA9ICRlbC5jc3MoImRpc3BsYXkiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgZGlzcGxheSk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICAkZWwuaGlkZSgpOwogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsKICAgICAgICAgIHZhciBlcnJvclNwYW4gPSAkKCI8c3Bhbj4iKS5hZGRDbGFzcyhlcnJDbGFzcyk7CiAgICAgICAgICBlcnJvclNwYW4udGV4dChlcnIubWVzc2FnZSk7CiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIikgewogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlCiAgICAgICAgLy8gZWwsIGFuZCBwb3NpdGlvbiB0aGUgZXJyb3IgdG8gYmUgb24gdG9wIG9mIHRoZSBlbC4KICAgICAgICAvLyBNYXJrIGl0IHdpdGggYSB1bmlxdWUgSUQgYW5kIENTUyBjbGFzcyBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGxhdGVyLgogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSAiIikgewogICAgICAgICAgdmFyIGVycm9yRGl2ID0gJCgiPGRpdj4iKS5hZGRDbGFzcyhlcnJDbGFzcykuY3NzKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpCiAgICAgICAgICAgIC8vIHNldHRpbmcgd2lkdGggY2FuIHB1c2ggb3V0IHRoZSBwYWdlIHNpemUsIGZvcmNpbmcgb3RoZXJ3aXNlCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3IKICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgdG8gc2hyaW5rOyBzbyB1c2UgbWF4LXdpZHRoIGluc3RlYWQKICAgICAgICAgICAgLmNzcygibWF4V2lkdGgiLCBlbC5vZmZzZXRXaWR0aCkKICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgIGVycm9yRGl2LnRleHQoZXJyLm1lc3NhZ2UpOwogICAgICAgICAgJGVsLmFmdGVyKGVycm9yRGl2KTsKCiAgICAgICAgICAvLyBSZWFsbHkgZHVtYiB3YXkgdG8ga2VlcCB0aGUgc2l6ZS9wb3NpdGlvbiBvZiB0aGUgZXJyb3IgaW4gc3luYyB3aXRoCiAgICAgICAgICAvLyB0aGUgcGFyZW50IGVsZW1lbnQgYXMgdGhlIHdpbmRvdyBpcyByZXNpemVkIG9yIHdoYXRldmVyLgogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghZXJyb3JEaXZbMF0ucGFyZW50RWxlbWVudCkgewogICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50SWQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvckRpdgogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgICAuY3NzKCJsZWZ0IiwgZWwub2Zmc2V0TGVmdCkKICAgICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICB9LCA1MDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGNsZWFyRXJyb3I6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIHZhciAkZWwgPSAkKGVsKTsKICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgbnVsbCk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICBpZiAoZGlzcGxheSkKICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsKICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOwogICAgICB9IGVsc2UgaWYgKGRpc3BsYXkgPT09ICJibG9jayIpewogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOwogICAgICAgICQoZWwubmV4dFNpYmxpbmcpLmZpbHRlcigiLmh0bWx3aWRnZXRzLWVycm9yIikucmVtb3ZlKCk7CiAgICAgIH0KICAgIH0sCiAgICBzaXppbmc6IHt9CiAgfTsKCiAgLy8gQ2FsbGVkIGJ5IHdpZGdldCBiaW5kaW5ncyB0byByZWdpc3RlciBhIG5ldyB0eXBlIG9mIHdpZGdldC4gVGhlIGRlZmluaXRpb24KICAvLyBvYmplY3QgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlCiAgLy8gICB1c2VkIGJ5IGRlZmF1bHQgYXMgdGhlIENTUyBjbGFzc25hbWUgdG8gbG9vayBmb3IuCiAgLy8gLSBpbml0aWFsaXplIChvcHRpb25hbCkgLSBBIGZ1bmN0aW9uKGVsKSB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uY2UgcGVyCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkCiAgLy8gICB2YWx1ZSB0byByZW5kZXJWYWx1ZS4KICAvLyAtIHJlbmRlclZhbHVlIChyZXF1aXJlZCkgLSBBIGZ1bmN0aW9uKGVsLCBkYXRhLCBpbml0VmFsdWUpIHRoYXQgd2lsbCBiZQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXIKICAvLyAgIGVsZW1lbnQ7IFNoaW55IGFwcHMgd2lsbCBjYXVzZSB0aGlzIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBwZXIKICAvLyAgIGVsZW1lbnQsIGFzIHRoZSBkYXRhIGNoYW5nZXMuCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsKICAgIGlmICghZGVmaW5pdGlvbi5uYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIG5hbWUiKTsKICAgIH0KICAgIGlmICghZGVmaW5pdGlvbi50eXBlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHR5cGUiKTsKICAgIH0KICAgIC8vIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgb3V0cHV0IHdpZGdldHMKICAgIGlmIChkZWZpbml0aW9uLnR5cGUgIT09ICJvdXRwdXQiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsKICAgIH0KICAgIC8vIFRPRE86IFZlcmlmeSB0aGF0IC5uYW1lIGlzIGEgdmFsaWQgQ1NTIGNsYXNzbmFtZQoKICAgIC8vIFN1cHBvcnQgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb25zLiBPbGQtc3R5bGUgY2xhc3MtYm91bmQKICAgIC8vIGRlZmluaXRpb25zIGhhdmUgb25lIHdpZGdldCAib2JqZWN0IiBwZXIgd2lkZ2V0IHBlciB0eXBlL2NsYXNzIG9mCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cwogICAgLy8gdGFrZSBlbCBhbmQgaW5zdGFuY2UgYXJndW1lbnRzLCBiZWNhdXNlIHRoZSB3aWRnZXQgb2JqZWN0IGNhbid0CiAgICAvLyBzdG9yZSB0aGVtLiBOZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0CiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0CiAgICAvLyBwcm92aWRlIHJlbmRlclZhbHVlIG9yIHJlc2l6ZSBtZXRob2RzIGF0IGFsbCwganVzdCB0aGUgc2luZ2xlIG1ldGhvZAogICAgLy8gICBmYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4KICAgIC8vIFRoaXMgZW5hYmxlcyBhIGZhciBtb3JlIG5hdHVyYWwgcHJvZ3JhbW1pbmcgc3R5bGUgZm9yIHRoZSB3aWRnZXQKICAgIC8vIGF1dGhvciwgd2hvIGNhbiBzdG9yZSBwZXItaW5zdGFuY2Ugc3RhdGUgdXNpbmcgZWl0aGVyIE9PLXN0eWxlCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzCiAgICAvLyBpcyBpbiBjb250cmFzdCB0byB3aGF0IGNhbiBvbmx5IGJlIGNhbGxlZCBDLXN0eWxlIHBzZXVkby1PTyB3aGljaCBpcwogICAgLy8gd2hhdCB3ZSByZXF1aXJlZCBiZWZvcmUpLgogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgewogICAgICBkZWZpbml0aW9uID0gY3JlYXRlTGVnYWN5RGVmaW5pdGlvbkFkYXB0ZXIoZGVmaW5pdGlvbik7CiAgICB9CgogICAgaWYgKCFkZWZpbml0aW9uLnJlbmRlclZhbHVlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHJlbmRlclZhbHVlIGZ1bmN0aW9uIik7CiAgICB9CgogICAgLy8gRm9yIHN0YXRpYyByZW5kZXJpbmcgKG5vbi1TaGlueSksIHVzZSBhIHNpbXBsZSB3aWRnZXQgcmVnaXN0cmF0aW9uCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28KICAgIC8vIGNvbnRhaW4gc3RhdGljIHdpZGdldHMuCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLgogICAgdmFyIHN0YXRpY0JpbmRpbmcgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKICAgIG92ZXJyaWRlTWV0aG9kKHN0YXRpY0JpbmRpbmcsICJmaW5kIiwgZnVuY3Rpb24oc3VwZXJmdW5jKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgewogICAgICAgIHZhciByZXN1bHRzID0gc3VwZXJmdW5jKHNjb3BlKTsKICAgICAgICAvLyBGaWx0ZXIgb3V0IFNoaW55IG91dHB1dHMsIHdlIG9ubHkgd2FudCB0aGUgc3RhdGljIGtpbmQKICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOwogICAgICB9OwogICAgfSk7CiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOwoKICAgIGlmIChzaGlueU1vZGUpIHsKICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4KICAgICAgLy8gVGhlIGRlZmluaXRpb24gaXRzZWxmIHdpbGwgbm90IGJlIHRoZSBvdXRwdXQgYmluZGluZywgaW5zdGVhZAogICAgICAvLyB3ZSB3aWxsIG1ha2UgYW4gb3V0cHV0IGJpbmRpbmcgb2JqZWN0IHRoYXQgZGVsZWdhdGVzIHRvIHRoZQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kCiAgICAgIC8vIG5hbWUgKHJlbmRlclZhbHVlKSBmb3IgaHRtbHdpZGdldHMgZGVmaW5pdGlvbiBhbmQgU2hpbnkgYmluZGluZ3MKICAgICAgLy8gYnV0IHRoZXkgYWN0dWFsbHkgaGF2ZSBxdWl0ZSBkaWZmZXJlbnQgc2VtYW50aWNzICh0aGUgU2hpbnkKICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0CiAgICAgIC8vIHN0cmlwcyBvZmYgYmVmb3JlIGNhbGxpbmcgaHRtbHdpZGdldHMgcmVuZGVyVmFsdWUpLiBXZSBjYW4ndAogICAgICAvLyBqdXN0IGlnbm9yZSB0aGUgZGlmZmVyZW5jZSBiZWNhdXNlIGluIHNvbWUgd2lkZ2V0cyBpdCdzIGhlbHBmdWwKICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZgogICAgICAvLyB3ZSdyZSBub3QgZGVsZWdhdGluZywgdGhlbiB0aGF0IGNhbGwgd2lsbCBnbyB0byB0aGUgU2hpbnkKICAgICAgLy8gdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBodG1sd2lkZ2V0cyB2ZXJzaW9uLgoKICAgICAgLy8gTWVyZ2UgZGVmYXVsdHMgd2l0aCBkZWZpbml0aW9uLCB3aXRob3V0IG11dGF0aW5nIGVpdGhlci4KICAgICAgdmFyIGJpbmRpbmdEZWYgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKCiAgICAgIC8vIFRoaXMgb2JqZWN0IHdpbGwgYmUgb3VyIGFjdHVhbCBTaGlueSBiaW5kaW5nLgogICAgICB2YXIgc2hpbnlCaW5kaW5nID0gbmV3IFNoaW55Lk91dHB1dEJpbmRpbmcoKTsKCiAgICAgIC8vIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgd2UnbGwgd2FudCB0byBzaW1wbHkgdXNlIHRoZSBiaW5kaW5nRGVmJ3MKICAgICAgLy8gdmVyc2lvbiBvZiBtZXRob2RzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0bwogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwKICAgICAgLy8gbWV0aG9kcyBpbiB0aGUgZnV0dXJlLCBhbmQgd2Ugd2FudCB0aGVtIHRvIGJlIG92ZXJyaWRlYWJsZSBieQogICAgICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcgZGVmaW5pdGlvbnMsIHRoZW4gd2UnbGwgbmVlZCB0byBhZGQgdGhlbSB0byB0aGlzCiAgICAgIC8vIGxpc3QuCiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImdldElkIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgIm9uVmFsdWVDaGFuZ2UiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgInJlbmRlckVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImNsZWFyRXJyb3IiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7CgogICAgICAvLyBUaGUgZmluZCwgcmVuZGVyVmFsdWUsIGFuZCByZXNpemUgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIGJlY2F1c2Ugd2UKICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4KCiAgICAgIHNoaW55QmluZGluZy5maW5kID0gZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7CgogICAgICAgIC8vIE9ubHkgcmV0dXJuIGVsZW1lbnRzIHRoYXQgYXJlIFNoaW55IG91dHB1dHMsIG5vdCBzdGF0aWMgb25lcwogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7CgogICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3aGF0ZXZlciBjYXVzZWQgU2hpbnkgdG8gdGhpbmsgdGhlcmUgbWlnaHQgYmUKICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuCiAgICAgICAgLy8gU2luY2UgdGhlcmUgbWlnaHQgYmUgbG90cyBvZiBkaWZmZXJlbnQgaHRtbHdpZGdldHMgYmluZGluZ3MsIHdlCiAgICAgICAgLy8gc2NoZWR1bGUgZXhlY3V0aW9uIGZvciBsYXRlci0tbm8gbmVlZCB0byBzdGF0aWNSZW5kZXIgbXVsdGlwbGUKICAgICAgICAvLyB0aW1lcy4KICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggIT09IGR5bmFtaWNSZXN1bHRzLmxlbmd0aCkKICAgICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyKCk7CgogICAgICAgIHJldHVybiBkeW5hbWljUmVzdWx0czsKICAgICAgfTsKCiAgICAgIC8vIFdyYXAgcmVuZGVyVmFsdWUgdG8gaGFuZGxlIGluaXRpYWxpemF0aW9uLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGlzbid0CiAgICAgIC8vIHN1cHBvcnRlZCBuYXRpdmVseSBieSBTaGlueSBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCgogICAgICBzaGlueUJpbmRpbmcucmVuZGVyVmFsdWUgPSBmdW5jdGlvbihlbCwgZGF0YSkgewogICAgICAgIFNoaW55LnJlbmRlckRlcGVuZGVuY2llcyhkYXRhLmRlcHMpOwogICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgZGF0YS5ldmFscyAmJiBpIDwgZGF0YS5ldmFscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1tpXSk7CiAgICAgICAgfQogICAgICAgIGlmICghYmluZGluZ0RlZi5yZW5kZXJPbk51bGxWYWx1ZSkgewogICAgICAgICAgaWYgKGRhdGEueCA9PT0gbnVsbCkgewogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7CiAgICAgICAgICBpbml0U2l6aW5nKGVsKTsKCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7CiAgICAgICAgICBpZiAoYmluZGluZ0RlZi5pbml0aWFsaXplKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBiaW5kaW5nRGVmLmluaXRpYWxpemUoZWwsIGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICAgIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiLCByZXN1bHQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBiaW5kaW5nRGVmLnJlbmRlclZhbHVlKGVsLCBkYXRhLngsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7CiAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7CiAgICAgIH07CgogICAgICAvLyBPbmx5IG92ZXJyaWRlIHJlc2l6ZSBpZiBiaW5kaW5nRGVmIGltcGxlbWVudHMgaXQKICAgICAgaWYgKGJpbmRpbmdEZWYucmVzaXplKSB7CiAgICAgICAgc2hpbnlCaW5kaW5nLnJlc2l6ZSA9IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgICAvLyBTaGlueSBjYW4gY2FsbCByZXNpemUgYmVmb3JlIGluaXRpYWxpemUvcmVuZGVyVmFsdWUgaGF2ZSBiZWVuCiAgICAgICAgICAvLyBjYWxsZWQsIHdoaWNoIGRvZXNuJ3QgbWFrZSBzZW5zZSBmb3Igd2lkZ2V0cy4KICAgICAgICAgIGlmIChlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIikpIHsKICAgICAgICAgICAgYmluZGluZ0RlZi5yZXNpemUoZWwsIHdpZHRoLCBoZWlnaHQsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgU2hpbnkub3V0cHV0QmluZGluZ3MucmVnaXN0ZXIoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLm5hbWUpOwogICAgfQogIH07CgogIHZhciBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogIGZ1bmN0aW9uIHNjaGVkdWxlU3RhdGljUmVuZGVyKCkgewogICAgaWYgKCFzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQpIHsKICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsKICAgICAgfSwgMSk7CiAgICB9CiAgfQoKICAvLyBSZW5kZXIgc3RhdGljIHdpZGdldHMgYWZ0ZXIgdGhlIGRvY3VtZW50IGZpbmlzaGVzIGxvYWRpbmcKICAvLyBTdGF0aWNhbGx5IHJlbmRlciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgb2YgdGhpcyB3aWRnZXQncyBjbGFzcwogIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIgPSBmdW5jdGlvbigpIHsKICAgIHZhciBiaW5kaW5ncyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgZm9yRWFjaChiaW5kaW5ncywgZnVuY3Rpb24oYmluZGluZykgewogICAgICB2YXIgbWF0Y2hlcyA9IGJpbmRpbmcuZmluZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOwogICAgICBmb3JFYWNoKG1hdGNoZXMsIGZ1bmN0aW9uKGVsKSB7CiAgICAgICAgdmFyIHNpemVPYmogPSBpbml0U2l6aW5nKGVsLCBiaW5kaW5nKTsKCiAgICAgICAgaWYgKGhhc0NsYXNzKGVsLCAiaHRtbC13aWRnZXQtc3RhdGljLWJvdW5kIikpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lICsgIiBodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiOwoKICAgICAgICB2YXIgaW5pdFJlc3VsdDsKICAgICAgICBpZiAoYmluZGluZy5pbml0aWFsaXplKSB7CiAgICAgICAgICBpbml0UmVzdWx0ID0gYmluZGluZy5pbml0aWFsaXplKGVsLAogICAgICAgICAgICBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0CiAgICAgICAgICApOwogICAgICAgICAgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIsIGluaXRSZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGJpbmRpbmcucmVzaXplKSB7CiAgICAgICAgICB2YXIgbGFzdFNpemUgPSB7fTsKICAgICAgICAgIHZhciByZXNpemVIYW5kbGVyID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICB2YXIgc2l6ZSA9IHsKICAgICAgICAgICAgICB3OiBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgICAgaDogc2l6ZU9iaiA/IHNpemVPYmouZ2V0SGVpZ2h0KCkgOiBlbC5vZmZzZXRIZWlnaHQKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHNpemUudyA9PT0gMCAmJiBzaXplLmggPT09IDApCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBpZiAoc2l6ZS53ID09PSBsYXN0U2l6ZS53ICYmIHNpemUuaCA9PT0gbGFzdFNpemUuaCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGxhc3RTaXplID0gc2l6ZTsKICAgICAgICAgICAgYmluZGluZy5yZXNpemUoZWwsIHNpemUudywgc2l6ZS5oLCBpbml0UmVzdWx0KTsKICAgICAgICAgIH07CgogICAgICAgICAgb24od2luZG93LCAicmVzaXplIiwgcmVzaXplSGFuZGxlcik7CgogICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIGNhc2VzIHdoZXJlIHdlJ3JlIHJ1bm5pbmcgaW4gYSBTaGlueQogICAgICAgICAgLy8gYXBwLCBidXQgdGhlIHdpZGdldCBpdHNlbGYgaXMgbm90IGEgU2hpbnkgb3V0cHV0LCBidXQKICAgICAgICAgIC8vIHJhdGhlciBhIHNpbXBsZSBzdGF0aWMgd2lkZ2V0LiBPbmUgZXhhbXBsZSBvZiB0aGlzIGlzCiAgICAgICAgICAvLyBhbiBybWFya2Rvd24gZG9jdW1lbnQgdGhhdCBoYXMgcnVudGltZTpzaGlueSBhbmQgd2lkZ2V0CiAgICAgICAgICAvLyB0aGF0IGlzbid0IGluIGEgcmVuZGVyIGZ1bmN0aW9uLiBTaGlueSBvbmx5IGtub3dzIHRvCiAgICAgICAgICAvLyBjYWxsIHJlc2l6ZSBoYW5kbGVycyBmb3IgU2hpbnkgb3V0cHV0cywgbm90IGZvciBzdGF0aWMKICAgICAgICAgIC8vIHdpZGdldHMsIHNvIHdlIGRvIGl0IG91cnNlbHZlcy4KICAgICAgICAgIGlmICh3aW5kb3cualF1ZXJ5KSB7CiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKAogICAgICAgICAgICAgICJzaG93bi5odG1sd2lkZ2V0cyBzaG93bi5icy50YWIuaHRtbHdpZGdldHMgc2hvd24uYnMuY29sbGFwc2UuaHRtbHdpZGdldHMiLAogICAgICAgICAgICAgIHJlc2l6ZUhhbmRsZXIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgd2luZG93LmpRdWVyeShkb2N1bWVudCkub24oCiAgICAgICAgICAgICAgImhpZGRlbi5odG1sd2lkZ2V0cyBoaWRkZW4uYnMudGFiLmh0bWx3aWRnZXRzIGhpZGRlbi5icy5jb2xsYXBzZS5odG1sd2lkZ2V0cyIsCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcgogICAgICAgICAgICApOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgc3BlY2lmaWMgY2FzZSBvZiBpb3NsaWRlcywgd2hpY2gKICAgICAgICAgIC8vIGZsaXBzIHNsaWRlcyBiZXR3ZWVuIGRpc3BsYXk6bm9uZSBhbmQgZGlzcGxheTpibG9jay4KICAgICAgICAgIC8vIElkZWFsbHkgd2Ugd291bGQgbm90IGhhdmUgdG8gaGF2ZSBpb3NsaWRlLXNwZWNpZmljIGNvZGUKICAgICAgICAgIC8vIGhlcmUsIGJ1dCByYXRoZXIgaGF2ZSBpb3NsaWRlcyByYWlzZSBhIGdlbmVyaWMgZXZlbnQsCiAgICAgICAgICAvLyBidXQgdGhlIHJtYXJrZG93biBwYWNrYWdlIGp1c3Qgd2VudCB0byBDUkFOIHNvIHRoZQogICAgICAgICAgLy8gd2luZG93IHRvIGdldHRpbmcgdGhhdCBmaXhlZCBtYXkgYmUgbG9uZy4KICAgICAgICAgIGlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikgewogICAgICAgICAgICAvLyBJdCdzIE9LIHRvIGxpbWl0IHRoaXMgdG8gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIKICAgICAgICAgICAgLy8gYnJvd3NlcnMgYmVjYXVzZSBpb3NsaWRlcyBpdHNlbGYgb25seSBzdXBwb3J0cwogICAgICAgICAgICAvLyBzdWNoIGJyb3dzZXJzLgogICAgICAgICAgICBvbihkb2N1bWVudCwgInNsaWRlZW50ZXIiLCByZXNpemVIYW5kbGVyKTsKICAgICAgICAgICAgb24oZG9jdW1lbnQsICJzbGlkZWxlYXZlIiwgcmVzaXplSGFuZGxlcik7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgc2NyaXB0RGF0YSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtkYXRhLWZvcj0nIiArIGVsLmlkICsgIiddW3R5cGU9J2FwcGxpY2F0aW9uL2pzb24nXSIpOwogICAgICAgIGlmIChzY3JpcHREYXRhKSB7CiAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2Uoc2NyaXB0RGF0YS50ZXh0Q29udGVudCB8fCBzY3JpcHREYXRhLnRleHQpOwogICAgICAgICAgLy8gUmVzb2x2ZSBzdHJpbmdzIG1hcmtlZCBhcyBqYXZhc2NyaXB0IGxpdGVyYWxzIHRvIG9iamVjdHMKICAgICAgICAgIGlmICghKGRhdGEuZXZhbHMgaW5zdGFuY2VvZiBBcnJheSkpIGRhdGEuZXZhbHMgPSBbZGF0YS5ldmFsc107CiAgICAgICAgICBmb3IgKHZhciBrID0gMDsgZGF0YS5ldmFscyAmJiBrIDwgZGF0YS5ldmFscy5sZW5ndGg7IGsrKykgewogICAgICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIoZGF0YS54LCBkYXRhLmV2YWxzW2tdKTsKICAgICAgICAgIH0KICAgICAgICAgIGJpbmRpbmcucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgaW5pdFJlc3VsdCk7CiAgICAgICAgICBldmFsQW5kUnVuKGRhdGEuanNIb29rcy5yZW5kZXIsIGluaXRSZXN1bHQsIFtlbCwgZGF0YS54XSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwoKICAgIGludm9rZVBvc3RSZW5kZXJIYW5kbGVycygpOwogIH0KCiAgLy8gV2FpdCB1bnRpbCBhZnRlciB0aGUgZG9jdW1lbnQgaGFzIGxvYWRlZCB0byByZW5kZXIgdGhlIHdpZGdldHMuCiAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigpIHsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlKTsKICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgfSwgZmFsc2UpOwogIH0gZWxzZSBpZiAoZG9jdW1lbnQuYXR0YWNoRXZlbnQpIHsKICAgIGRvY3VtZW50LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBmdW5jdGlvbigpIHsKICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIpIHsKICAgICAgICBkb2N1bWVudC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgYXJndW1lbnRzLmNhbGxlZSk7CiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgICB9CiAgICB9KTsKICB9CgoKICB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0QXR0YWNobWVudFVybCA9IGZ1bmN0aW9uKGRlcG5hbWUsIGtleSkgewogICAgLy8gSWYgbm8ga2V5LCBkZWZhdWx0IHRvIHRoZSBmaXJzdCBpdGVtCiAgICBpZiAodHlwZW9mKGtleSkgPT09ICJ1bmRlZmluZWQiKQogICAgICBrZXkgPSAxOwoKICAgIHZhciBsaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGVwbmFtZSArICItIiArIGtleSArICItYXR0YWNobWVudCIpOwogICAgaWYgKCFsaW5rKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiQXR0YWNobWVudCAiICsgZGVwbmFtZSArICIvIiArIGtleSArICIgbm90IGZvdW5kIGluIGRvY3VtZW50Iik7CiAgICB9CiAgICByZXR1cm4gbGluay5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKICB9OwoKICB3aW5kb3cuSFRNTFdpZGdldHMuZGF0YWZyYW1lVG9EMyA9IGZ1bmN0aW9uKGRmKSB7CiAgICB2YXIgbmFtZXMgPSBbXTsKICAgIHZhciBsZW5ndGg7CiAgICBmb3IgKHZhciBuYW1lIGluIGRmKSB7CiAgICAgICAgaWYgKGRmLmhhc093blByb3BlcnR5KG5hbWUpKQogICAgICAgICAgICBuYW1lcy5wdXNoKG5hbWUpOwogICAgICAgIGlmICh0eXBlb2YoZGZbbmFtZV0pICE9PSAib2JqZWN0IiB8fCB0eXBlb2YoZGZbbmFtZV0ubGVuZ3RoKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIik7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YobGVuZ3RoKSAhPT0gInVuZGVmaW5lZCIgJiYgbGVuZ3RoICE9PSBkZltuYW1lXS5sZW5ndGgpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIG9mIHRoZSBzYW1lIGxlbmd0aCIpOwogICAgICAgIH0KICAgICAgICBsZW5ndGggPSBkZltuYW1lXS5sZW5ndGg7CiAgICB9CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgdmFyIGl0ZW07CiAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCBsZW5ndGg7IHJvdysrKSB7CiAgICAgICAgaXRlbSA9IHt9OwogICAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG5hbWVzLmxlbmd0aDsgY29sKyspIHsKICAgICAgICAgICAgaXRlbVtuYW1lc1tjb2xdXSA9IGRmW25hbWVzW2NvbF1dW3Jvd107CiAgICAgICAgfQogICAgICAgIHJlc3VsdHMucHVzaChpdGVtKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIHdpbmRvdy5IVE1MV2lkZ2V0cy50cmFuc3Bvc2VBcnJheTJEID0gZnVuY3Rpb24oYXJyYXkpIHsKICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFycmF5OwogICAgICB2YXIgbmV3QXJyYXkgPSBhcnJheVswXS5tYXAoZnVuY3Rpb24oY29sLCBpKSB7CiAgICAgICAgICByZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uKHJvdykgewogICAgICAgICAgICAgIHJldHVybiByb3dbaV0KICAgICAgICAgIH0pCiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3QXJyYXk7CiAgfTsKICAvLyBTcGxpdCB2YWx1ZSBhdCBzcGxpdENoYXIsIGJ1dCBhbGxvdyBzcGxpdENoYXIgdG8gYmUgZXNjYXBlZAogIC8vIHVzaW5nIGVzY2FwZUNoYXIuIEFueSBvdGhlciBjaGFyYWN0ZXJzIGVzY2FwZWQgYnkgZXNjYXBlQ2hhcgogIC8vIHdpbGwgYmUgaW5jbHVkZWQgYXMgdXN1YWwgKGluY2x1ZGluZyBlc2NhcGVDaGFyIGl0c2VsZikuCiAgZnVuY3Rpb24gc3BsaXRXaXRoRXNjYXBlKHZhbHVlLCBzcGxpdENoYXIsIGVzY2FwZUNoYXIpIHsKICAgIHZhciByZXN1bHRzID0gW107CiAgICB2YXIgZXNjYXBlTW9kZSA9IGZhbHNlOwogICAgdmFyIGN1cnJlbnRSZXN1bHQgPSAiIjsKICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IHZhbHVlLmxlbmd0aDsgcG9zKyspIHsKICAgICAgaWYgKCFlc2NhcGVNb2RlKSB7CiAgICAgICAgaWYgKHZhbHVlW3Bvc10gPT09IHNwbGl0Q2hhcikgewogICAgICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOwogICAgICAgICAgY3VycmVudFJlc3VsdCA9ICIiOwogICAgICAgIH0gZWxzZSBpZiAodmFsdWVbcG9zXSA9PT0gZXNjYXBlQ2hhcikgewogICAgICAgICAgZXNjYXBlTW9kZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGN1cnJlbnRSZXN1bHQgKz0gdmFsdWVbcG9zXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOwogICAgICAgIGVzY2FwZU1vZGUgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgaWYgKGN1cnJlbnRSZXN1bHQgIT09ICIiKSB7CiAgICAgIHJlc3VsdHMucHVzaChjdXJyZW50UmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH0KICAvLyBGdW5jdGlvbiBhdXRob3JlZCBieSBZaWh1aS9KSiBBbGxhaXJlCiAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyID0gZnVuY3Rpb24obywgbWVtYmVyKSB7CiAgICB2YXIgcGFydHMgPSBzcGxpdFdpdGhFc2NhcGUobWVtYmVyLCAnLicsICdcXCcpOwogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBwYXJ0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsKICAgICAgLy8gcGFydCBtYXkgYmUgYSBjaGFyYWN0ZXIgb3IgJ251bWVyaWMnIG1lbWJlciBuYW1lCiAgICAgIGlmIChvICE9PSBudWxsICYmIHR5cGVvZiBvID09PSAib2JqZWN0IiAmJiBwYXJ0IGluIG8pIHsKICAgICAgICBpZiAoaSA9PSAobCAtIDEpKSB7IC8vIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIHRoZW4gZXZhbHVsYXRlCiAgICAgICAgICBpZiAodHlwZW9mIG9bcGFydF0gPT09ICJzdHJpbmciKQogICAgICAgICAgICBvW3BhcnRdID0gZXZhbCgiKCIgKyBvW3BhcnRdICsgIikiKTsKICAgICAgICB9IGVsc2UgeyAvLyBvdGhlcndpc2UgY29udGludWUgdG8gbmV4dCBlbWJlZGRlZCBvYmplY3QKICAgICAgICAgIG8gPSBvW3BhcnRdOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH07CgogIC8vIFJldHJpZXZlIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlIChpLmUuIHRoZSByZXR1cm4gdmFsdWUgb2YgYW4KICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQogIC8vIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50LCBvciBudWxsIGlmIG5vbmUuCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlID0gZnVuY3Rpb24oZWwpIHsKICAgIHJldHVybiBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0Iik7CiAgfTsKCiAgLy8gRmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHNjb3BlIHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsCiAgLy8gYW5kIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZgogIC8vIGFuIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pCiAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoYXQgZWxlbWVudCwgaWYgYW55LiBJZiBubyBlbGVtZW50IG1hdGNoZXMgdGhlCiAgLy8gc2VsZWN0b3IsIG9yIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IGhhcyBubyBIVE1MV2lkZ2V0CiAgLy8gaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGl0LCB0aGVuIG51bGwgaXMgcmV0dXJuZWQuCiAgLy8KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmQgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgc2VsZWN0b3IgPSBzY29wZTsKICAgICAgc2NvcGUgPSBkb2N1bWVudDsKICAgIH0KCiAgICB2YXIgZWwgPSBzY29wZS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgIGlmIChlbCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2UoZWwpOwogICAgfQogIH07CgogIC8vIEZpbmRzIGFsbCBlbGVtZW50cyBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IsIGFuZAogIC8vIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2VzIChpLmUuIHRoZSByZXR1cm4gdmFsdWVzIG9mCiAgLy8gYW4gSFRNTFdpZGdldCBiaW5kaW5nJ3MgaW5pdGlhbGl6ZSgpIG9yIGZhY3RvcnkoKSBmdW5jdGlvbikKICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnRzLCBpbiBhbiBhcnJheS4gSWYgZWxlbWVudHMgdGhhdAogIC8vIG1hdGNoIHRoZSBzZWxlY3RvciBkb24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgSFRNTFdpZGdldAogIC8vIGluc3RhbmNlLCB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBjb250YWluIG51bGxzLgogIC8vCiAgLy8gVGhlIHNjb3BlIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCBhbmQgZGVmYXVsdHMgdG8gd2luZG93LmRvY3VtZW50LgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5maW5kQWxsID0gZnVuY3Rpb24oc2NvcGUsIHNlbGVjdG9yKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgIHNlbGVjdG9yID0gc2NvcGU7CiAgICAgIHNjb3BlID0gZG9jdW1lbnQ7CiAgICB9CgogICAgdmFyIG5vZGVzID0gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewogICAgICByZXN1bHRzLnB1c2god2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlKG5vZGVzW2ldKSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICB2YXIgcG9zdFJlbmRlckhhbmRsZXJzID0gW107CiAgZnVuY3Rpb24gaW52b2tlUG9zdFJlbmRlckhhbmRsZXJzKCkgewogICAgd2hpbGUgKHBvc3RSZW5kZXJIYW5kbGVycy5sZW5ndGgpIHsKICAgICAgdmFyIGhhbmRsZXIgPSBwb3N0UmVuZGVySGFuZGxlcnMuc2hpZnQoKTsKICAgICAgaWYgKGhhbmRsZXIpIHsKICAgICAgICBoYW5kbGVyKCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFJlZ2lzdGVyIHRoZSBnaXZlbiBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBpbnZva2VkIGFmdGVyIHRoZQogIC8vIG5leHQgdGltZSBzdGF0aWMgd2lkZ2V0cyBhcmUgcmVuZGVyZWQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmFkZFBvc3RSZW5kZXJIYW5kbGVyID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIHBvc3RSZW5kZXJIYW5kbGVycy5wdXNoKGNhbGxiYWNrKTsKICB9OwoKICAvLyBUYWtlcyBhIG5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9uLCBhbmQgcmV0dXJucyBhbgogIC8vIG9sZC1zdHlsZSBjbGFzcy1ib3VuZCBkZWZpbml0aW9uLiBUaGlzIHNhdmVzIHVzIGZyb20gaGF2aW5nCiAgLy8gdG8gcmV3cml0ZSBhbGwgdGhlIGxvZ2ljIGluIHRoaXMgZmlsZSB0byBhY2NvbW9kYXRlIGJvdGgKICAvLyB0eXBlcyBvZiBkZWZpbml0aW9ucy4KICBmdW5jdGlvbiBjcmVhdGVMZWdhY3lEZWZpbml0aW9uQWRhcHRlcihkZWZuKSB7CiAgICB2YXIgcmVzdWx0ID0gewogICAgICBuYW1lOiBkZWZuLm5hbWUsCiAgICAgIHR5cGU6IGRlZm4udHlwZSwKICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICByZXR1cm4gZGVmbi5mYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgfSwKICAgICAgcmVuZGVyVmFsdWU6IGZ1bmN0aW9uKGVsLCB4LCBpbnN0YW5jZSkgewogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZW5kZXJWYWx1ZSh4KTsKICAgICAgfSwKICAgICAgcmVzaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCwgaW5zdGFuY2UpIHsKICAgICAgICByZXR1cm4gaW5zdGFuY2UucmVzaXplKHdpZHRoLCBoZWlnaHQpOwogICAgICB9CiAgICB9OwoKICAgIGlmIChkZWZuLmZpbmQpCiAgICAgIHJlc3VsdC5maW5kID0gZGVmbi5maW5kOwogICAgaWYgKGRlZm4ucmVuZGVyRXJyb3IpCiAgICAgIHJlc3VsdC5yZW5kZXJFcnJvciA9IGRlZm4ucmVuZGVyRXJyb3I7CiAgICBpZiAoZGVmbi5jbGVhckVycm9yKQogICAgICByZXN1bHQuY2xlYXJFcnJvciA9IGRlZm4uY2xlYXJFcnJvcjsKCiAgICByZXR1cm4gcmVzdWx0OwogIH0KfSkoKTsKCg=="></script> <script src="data:application/x-javascript;base64,Ly8gaHR0cHM6Ly9kM2pzLm9yZyBWZXJzaW9uIDQuNS4wLiBDb3B5cmlnaHQgMjAxNyBNaWtlIEJvc3RvY2suDQooZnVuY3Rpb24odCxuKXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP24oZXhwb3J0cyk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJleHBvcnRzIl0sbik6bih0LmQzPXQuZDN8fHt9KX0pKHRoaXMsZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7cmV0dXJuIE5zKHQobiksZSl9fWZ1bmN0aW9uIGUodCxuLGUpe3ZhciByPU1hdGguYWJzKG4tdCkvTWF0aC5tYXgoMCxlKSxpPU1hdGgucG93KDEwLE1hdGguZmxvb3IoTWF0aC5sb2cocikvTWF0aC5MTjEwKSksbz1yL2k7cmV0dXJuIG8+PVlzP2kqPTEwOm8+PUJzP2kqPTU6bz49anMmJihpKj0yKSxuPHQ/LWk6aX1mdW5jdGlvbiByKHQpe3JldHVybiB0Lmxlbmd0aH1mdW5jdGlvbiBpKHQsbixlKXt2YXIgcj10KGUpO3JldHVybiJ0cmFuc2xhdGUoIisoaXNGaW5pdGUocik/cjpuKGUpKSsiLDApIn1mdW5jdGlvbiBvKHQsbixlKXt2YXIgcj10KGUpO3JldHVybiJ0cmFuc2xhdGUoMCwiKyhpc0Zpbml0ZShyKT9yOm4oZSkpKyIpIn1mdW5jdGlvbiB1KHQpe3ZhciBuPXQuYmFuZHdpZHRoKCkvMjtyZXR1cm4gdC5yb3VuZCgpJiYobj1NYXRoLnJvdW5kKG4pKSxmdW5jdGlvbihlKXtyZXR1cm4gdChlKStufX1mdW5jdGlvbiBhKCl7cmV0dXJuIXRoaXMuX19heGlzfWZ1bmN0aW9uIGModCxuKXtmdW5jdGlvbiBlKGUpe3ZhciBwLGQ9bnVsbD09Yz9uLnRpY2tzP24udGlja3MuYXBwbHkobixyKTpuLmRvbWFpbigpOmMsdj1udWxsPT1zP24udGlja0Zvcm1hdD9uLnRpY2tGb3JtYXQuYXBwbHkobixyKTpmZjpzLF89TWF0aC5tYXgoZiwwKStoLHk9dD09PWxmfHx0PT09cGY/aTpvLGc9bi5yYW5nZSgpLG09Z1swXSsuNSx4PWdbZy5sZW5ndGgtMV0rLjUsYj0obi5iYW5kd2lkdGg/dTpmZikobi5jb3B5KCkpLHc9ZS5zZWxlY3Rpb24/ZS5zZWxlY3Rpb24oKTplLE09dy5zZWxlY3RBbGwoIi5kb21haW4iKS5kYXRhKFtudWxsXSksVD13LnNlbGVjdEFsbCgiLnRpY2siKS5kYXRhKGQsbikub3JkZXIoKSxOPVQuZXhpdCgpLGs9VC5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwidGljayIpLFM9VC5zZWxlY3QoImxpbmUiKSxFPVQuc2VsZWN0KCJ0ZXh0IiksQT10PT09bGZ8fHQ9PT1kZj8tMToxLEM9dD09PWRmfHx0PT09aGY/KHA9IngiLCJ5Iik6KHA9InkiLCJ4Iik7TT1NLm1lcmdlKE0uZW50ZXIoKS5pbnNlcnQoInBhdGgiLCIudGljayIpLmF0dHIoImNsYXNzIiwiZG9tYWluIikuYXR0cigic3Ryb2tlIiwiIzAwMCIpKSxUPVQubWVyZ2UoayksUz1TLm1lcmdlKGsuYXBwZW5kKCJsaW5lIikuYXR0cigic3Ryb2tlIiwiIzAwMCIpLmF0dHIocCsiMiIsQSpmKS5hdHRyKEMrIjEiLC41KS5hdHRyKEMrIjIiLC41KSksRT1FLm1lcmdlKGsuYXBwZW5kKCJ0ZXh0IikuYXR0cigiZmlsbCIsIiMwMDAiKS5hdHRyKHAsQSpfKS5hdHRyKEMsLjUpLmF0dHIoImR5Iix0PT09bGY/IjBlbSI6dD09PXBmPyIwLjcxZW0iOiIwLjMyZW0iKSksZSE9PXcmJihNPU0udHJhbnNpdGlvbihlKSxUPVQudHJhbnNpdGlvbihlKSxTPVMudHJhbnNpdGlvbihlKSxFPUUudHJhbnNpdGlvbihlKSxOPU4udHJhbnNpdGlvbihlKS5hdHRyKCJvcGFjaXR5Iix2ZikuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbih0KXtyZXR1cm4geShiLHRoaXMucGFyZW50Tm9kZS5fX2F4aXN8fGIsdCl9KSxrLmF0dHIoIm9wYWNpdHkiLHZmKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3JldHVybiB5KHRoaXMucGFyZW50Tm9kZS5fX2F4aXN8fGIsYix0KX0pKSxOLnJlbW92ZSgpLE0uYXR0cigiZCIsdD09PWRmfHx0PT1oZj8iTSIrQSpsKyIsIittKyJIMC41ViIreCsiSCIrQSpsOiJNIittKyIsIitBKmwrIlYwLjVIIit4KyJWIitBKmwpLFQuYXR0cigib3BhY2l0eSIsMSkuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbih0KXtyZXR1cm4geShiLGIsdCl9KSxTLmF0dHIocCsiMiIsQSpmKSxFLmF0dHIocCxBKl8pLnRleHQodiksdy5maWx0ZXIoYSkuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJmb250LXNpemUiLDEwKS5hdHRyKCJmb250LWZhbWlseSIsInNhbnMtc2VyaWYiKS5hdHRyKCJ0ZXh0LWFuY2hvciIsdD09PWhmPyJzdGFydCI6dD09PWRmPyJlbmQiOiJtaWRkbGUiKSx3LmVhY2goZnVuY3Rpb24oKXt0aGlzLl9fYXhpcz1ifSl9dmFyIHI9W10sYz1udWxsLHM9bnVsbCxmPTYsbD02LGg9MztyZXR1cm4gZS5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGUpOm59LGUudGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gcj1zZi5jYWxsKGFyZ3VtZW50cyksZX0sZS50aWNrQXJndW1lbnRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PXQ/W106c2YuY2FsbCh0KSxlKTpyLnNsaWNlKCl9LGUudGlja1ZhbHVlcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1udWxsPT10P251bGw6c2YuY2FsbCh0KSxlKTpjJiZjLnNsaWNlKCl9LGUudGlja0Zvcm1hdD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz10LGUpOnN9LGUudGlja1NpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9bD0rdCxlKTpmfSxlLnRpY2tTaXplSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9K3QsZSk6Zn0sZS50aWNrU2l6ZU91dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPSt0LGUpOmx9LGUudGlja1BhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9K3QsZSk6aH0sZX1mdW5jdGlvbiBzKHQpe3JldHVybiBjKGxmLHQpfWZ1bmN0aW9uIGYodCl7cmV0dXJuIGMoaGYsdCl9ZnVuY3Rpb24gbCh0KXtyZXR1cm4gYyhwZix0KX1mdW5jdGlvbiBoKHQpe3JldHVybiBjKGRmLHQpfWZ1bmN0aW9uIHAoKXtmb3IodmFyIHQsbj0wLGU9YXJndW1lbnRzLmxlbmd0aCxyPXt9O248ZTsrK24pe2lmKCEodD1hcmd1bWVudHNbbl0rIiIpfHx0IGluIHIpdGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIHR5cGU6ICIrdCk7clt0XT1bXX1yZXR1cm4gbmV3IGQocil9ZnVuY3Rpb24gZCh0KXt0aGlzLl89dH1mdW5jdGlvbiB2KHQsbil7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcChmdW5jdGlvbih0KXt2YXIgZT0iIixyPXQuaW5kZXhPZigiLiIpO2lmKHI+PTAmJihlPXQuc2xpY2UocisxKSx0PXQuc2xpY2UoMCxyKSksdCYmIW4uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7cmV0dXJue3R5cGU6dCxuYW1lOmV9fSl9ZnVuY3Rpb24gXyh0LG4pe2Zvcih2YXIgZSxyPTAsaT10Lmxlbmd0aDtyPGk7KytyKWlmKChlPXRbcl0pLm5hbWU9PT1uKXJldHVybiBlLnZhbHVlfWZ1bmN0aW9uIHkodCxuLGUpe2Zvcih2YXIgcj0wLGk9dC5sZW5ndGg7cjxpOysrcilpZih0W3JdLm5hbWU9PT1uKXt0W3JdPV9mLHQ9dC5zbGljZSgwLHIpLmNvbmNhdCh0LnNsaWNlKHIrMSkpO2JyZWFrfXJldHVybiBudWxsIT1lJiZ0LnB1c2goe25hbWU6bix2YWx1ZTplfSksdH1mdW5jdGlvbiBnKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMub3duZXJEb2N1bWVudCxlPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBlPT09eWYmJm4uZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSST09PXlmP24uY3JlYXRlRWxlbWVudCh0KTpuLmNyZWF0ZUVsZW1lbnROUyhlLHQpfX1mdW5jdGlvbiBtKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIHgoKXtyZXR1cm4gbmV3IGJ9ZnVuY3Rpb24gYigpe3RoaXMuXz0iQCIrKCsrYmYpLnRvU3RyaW5nKDM2KX1mdW5jdGlvbiB3KHQsbixlKXtyZXR1cm4gdD1NKHQsbixlKSxmdW5jdGlvbihuKXt2YXIgZT1uLnJlbGF0ZWRUYXJnZXQ7ZSYmKGU9PT10aGlzfHw4JmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24odGhpcykpfHx0LmNhbGwodGhpcyxuKX19ZnVuY3Rpb24gTShuLGUscil7cmV0dXJuIGZ1bmN0aW9uKGkpe3ZhciBvPXQuZXZlbnQ7dC5ldmVudD1pO3RyeXtuLmNhbGwodGhpcyx0aGlzLl9fZGF0YV9fLGUscil9ZmluYWxseXt0LmV2ZW50PW99fX1mdW5jdGlvbiBUKHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCl7dmFyIG49IiIsZT10LmluZGV4T2YoIi4iKTtyZXR1cm4gZT49MCYmKG49dC5zbGljZShlKzEpLHQ9dC5zbGljZSgwLGUpKSx7dHlwZTp0LG5hbWU6bn19KX1mdW5jdGlvbiBOKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMuX19vbjtpZihuKXtmb3IodmFyIGUscj0wLGk9LTEsbz1uLmxlbmd0aDtyPG87KytyKWU9bltyXSx0LnR5cGUmJmUudHlwZSE9PXQudHlwZXx8ZS5uYW1lIT09dC5uYW1lP25bKytpXT1lOnRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLnR5cGUsZS5saXN0ZW5lcixlLmNhcHR1cmUpOysraT9uLmxlbmd0aD1pOmRlbGV0ZSB0aGlzLl9fb259fX1mdW5jdGlvbiBrKHQsbixlKXt2YXIgcj1rZi5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpP3c6TTtyZXR1cm4gZnVuY3Rpb24oaSxvLHUpe3ZhciBhLGM9dGhpcy5fX29uLHM9cihuLG8sdSk7aWYoYylmb3IodmFyIGY9MCxsPWMubGVuZ3RoO2Y8bDsrK2YpaWYoKGE9Y1tmXSkudHlwZT09PXQudHlwZSYmYS5uYW1lPT09dC5uYW1lKXJldHVybiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYS50eXBlLGEubGlzdGVuZXIsYS5jYXB0dXJlKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoYS50eXBlLGEubGlzdGVuZXI9cyxhLmNhcHR1cmU9ZSksdm9pZChhLnZhbHVlPW4pO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcih0LnR5cGUscyxlKSxhPXt0eXBlOnQudHlwZSxuYW1lOnQubmFtZSx2YWx1ZTpuLGxpc3RlbmVyOnMsY2FwdHVyZTplfSxjP2MucHVzaChhKTp0aGlzLl9fb249W2FdfX1mdW5jdGlvbiBTKG4sZSxyLGkpe3ZhciBvPXQuZXZlbnQ7bi5zb3VyY2VFdmVudD10LmV2ZW50LHQuZXZlbnQ9bjt0cnl7cmV0dXJuIGUuYXBwbHkocixpKX1maW5hbGx5e3QuZXZlbnQ9b319ZnVuY3Rpb24gRSgpe31mdW5jdGlvbiBBKCl7cmV0dXJuW119ZnVuY3Rpb24gQyh0LG4pe3RoaXMub3duZXJEb2N1bWVudD10Lm93bmVyRG9jdW1lbnQsdGhpcy5uYW1lc3BhY2VVUkk9dC5uYW1lc3BhY2VVUkksdGhpcy5fbmV4dD1udWxsLHRoaXMuX3BhcmVudD10LHRoaXMuX19kYXRhX189bn1mdW5jdGlvbiB6KHQsbixlLHIsaSxvKXtmb3IodmFyIHUsYT0wLGM9bi5sZW5ndGgscz1vLmxlbmd0aDthPHM7KythKSh1PW5bYV0pPyh1Ll9fZGF0YV9fPW9bYV0sclthXT11KTplW2FdPW5ldyBDKHQsb1thXSk7Zm9yKDthPGM7KythKSh1PW5bYV0pJiYoaVthXT11KX1mdW5jdGlvbiBQKHQsbixlLHIsaSxvLHUpe3ZhciBhLGMscyxmPXt9LGw9bi5sZW5ndGgsaD1vLmxlbmd0aCxwPW5ldyBBcnJheShsKTtmb3IoYT0wO2E8bDsrK2EpKGM9blthXSkmJihwW2FdPXM9SWYrdS5jYWxsKGMsYy5fX2RhdGFfXyxhLG4pLHMgaW4gZj9pW2FdPWM6ZltzXT1jKTtmb3IoYT0wO2E8aDsrK2Epcz1JZit1LmNhbGwodCxvW2FdLGEsbyksKGM9ZltzXSk/KHJbYV09YyxjLl9fZGF0YV9fPW9bYV0sZltzXT1udWxsKTplW2FdPW5ldyBDKHQsb1thXSk7Zm9yKGE9MDthPGw7KythKShjPW5bYV0pJiZmW3BbYV1dPT09YyYmKGlbYV09Yyl9ZnVuY3Rpb24gUih0LG4pe3JldHVybiB0PG4/LTE6dD5uPzE6dD49bj8wOk5hTn1mdW5jdGlvbiBxKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX1mdW5jdGlvbiBMKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gVSh0LG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlKHQsbil9fWZ1bmN0aW9uIEQodCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxuKX19ZnVuY3Rpb24gTyh0LG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCk6dGhpcy5zZXRBdHRyaWJ1dGUodCxlKX19ZnVuY3Rpb24gRih0LG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpOnRoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLGUpfX1mdW5jdGlvbiBJKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fWZ1bmN0aW9uIFkodCxuLGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxuLGUpfX1mdW5jdGlvbiBCKHQsbixlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1yP3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCk6dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LHIsZSl9fWZ1bmN0aW9uIGoodCl7cmV0dXJuIGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbdF19fWZ1bmN0aW9uIEgodCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzW3RdPW59fWZ1bmN0aW9uIFgodCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP2RlbGV0ZSB0aGlzW3RdOnRoaXNbdF09ZX19ZnVuY3Rpb24gVih0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLyl9ZnVuY3Rpb24gVyh0KXtyZXR1cm4gdC5jbGFzc0xpc3R8fG5ldyAkKHQpfWZ1bmN0aW9uICQodCl7dGhpcy5fbm9kZT10LHRoaXMuX25hbWVzPVYodC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX1mdW5jdGlvbiBaKHQsbil7Zm9yKHZhciBlPVcodCkscj0tMSxpPW4ubGVuZ3RoOysrcjxpOyllLmFkZChuW3JdKX1mdW5jdGlvbiBHKHQsbil7Zm9yKHZhciBlPVcodCkscj0tMSxpPW4ubGVuZ3RoOysrcjxpOyllLnJlbW92ZShuW3JdKX1mdW5jdGlvbiBKKHQpe3JldHVybiBmdW5jdGlvbigpe1oodGhpcyx0KX19ZnVuY3Rpb24gUSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtHKHRoaXMsdCl9fWZ1bmN0aW9uIEsodCxuKXtyZXR1cm4gZnVuY3Rpb24oKXsobi5hcHBseSh0aGlzLGFyZ3VtZW50cyk/WjpHKSh0aGlzLHQpfX1mdW5jdGlvbiB0dCgpe3RoaXMudGV4dENvbnRlbnQ9IiJ9ZnVuY3Rpb24gbnQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD10fX1mdW5jdGlvbiBldCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PW4/IiI6bn19ZnVuY3Rpb24gcnQoKXt0aGlzLmlubmVySFRNTD0iIn1mdW5jdGlvbiBpdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD10fX1mdW5jdGlvbiBvdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmlubmVySFRNTD1udWxsPT1uPyIiOm59fWZ1bmN0aW9uIHV0KCl7dGhpcy5uZXh0U2libGluZyYmdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpfWZ1bmN0aW9uIGF0KCl7dGhpcy5wcmV2aW91c1NpYmxpbmcmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcyx0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCl9ZnVuY3Rpb24gY3QoKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBzdCgpe3ZhciB0PXRoaXMucGFyZW50Tm9kZTt0JiZ0LnJlbW92ZUNoaWxkKHRoaXMpfWZ1bmN0aW9uIGZ0KHQsbixlKXt2YXIgcj1LZih0KSxpPXIuQ3VzdG9tRXZlbnQ7aT9pPW5ldyBpKG4sZSk6KGk9ci5kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxlPyhpLmluaXRFdmVudChuLGUuYnViYmxlcyxlLmNhbmNlbGFibGUpLGkuZGV0YWlsPWUuZGV0YWlsKTppLmluaXRFdmVudChuLCExLCExKSksdC5kaXNwYXRjaEV2ZW50KGkpfWZ1bmN0aW9uIGx0KHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGZ0KHRoaXMsdCxuKX19ZnVuY3Rpb24gaHQodCxuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZnQodGhpcyx0LG4uYXBwbHkodGhpcyxhcmd1bWVudHMpKX19ZnVuY3Rpb24gcHQodCxuKXt0aGlzLl9ncm91cHM9dCx0aGlzLl9wYXJlbnRzPW59ZnVuY3Rpb24gZHQoKXtyZXR1cm4gbmV3IHB0KFtbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XV0saGwpfWZ1bmN0aW9uIHZ0KCl7dC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBfdCh0LG4pe3ZhciBlPXQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LHI9cGwodCkub24oImRyYWdzdGFydC5kcmFnIixudWxsKTtuJiYoci5vbigiY2xpY2suZHJhZyIseWwsITApLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLm9uKCJjbGljay5kcmFnIixudWxsKX0sMCkpLCJvbnNlbGVjdHN0YXJ0ImluIGU/ci5vbigic2VsZWN0c3RhcnQuZHJhZyIsbnVsbCk6KGUuc3R5bGUuTW96VXNlclNlbGVjdD1lLl9fbm9zZWxlY3QsZGVsZXRlIGUuX19ub3NlbGVjdCl9ZnVuY3Rpb24geXQodCxuLGUscixpLG8sdSxhLGMscyl7dGhpcy50YXJnZXQ9dCx0aGlzLnR5cGU9bix0aGlzLnN1YmplY3Q9ZSx0aGlzLmlkZW50aWZpZXI9cix0aGlzLmFjdGl2ZT1pLHRoaXMueD1vLHRoaXMueT11LHRoaXMuZHg9YSx0aGlzLmR5PWMsdGhpcy5fPXN9ZnVuY3Rpb24gZ3QoKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gbXQoKXtyZXR1cm4gdGhpcy5wYXJlbnROb2RlfWZ1bmN0aW9uIHh0KG4pe3JldHVybiBudWxsPT1uP3t4OnQuZXZlbnQueCx5OnQuZXZlbnQueX06bn1mdW5jdGlvbiBidCh0LG4pe3ZhciBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpO2Zvcih2YXIgciBpbiBuKWVbcl09bltyXTtyZXR1cm4gZX1mdW5jdGlvbiB3dCgpe31mdW5jdGlvbiBNdCh0KXt2YXIgbjtyZXR1cm4gdD0odCsiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksKG49U2wuZXhlYyh0KSk/KG49cGFyc2VJbnQoblsxXSwxNiksbmV3IEV0KG4+PjgmMTV8bj4+NCYyNDAsbj4+NCYxNXwyNDAmbiwoMTUmbik8PDR8MTUmbiwxKSk6KG49RWwuZXhlYyh0KSk/VHQocGFyc2VJbnQoblsxXSwxNikpOihuPUFsLmV4ZWModCkpP25ldyBFdChuWzFdLG5bMl0sblszXSwxKToobj1DbC5leGVjKHQpKT9uZXcgRXQoMjU1Km5bMV0vMTAwLDI1NSpuWzJdLzEwMCwyNTUqblszXS8xMDAsMSk6KG49emwuZXhlYyh0KSk/TnQoblsxXSxuWzJdLG5bM10sbls0XSk6KG49UGwuZXhlYyh0KSk/TnQoMjU1Km5bMV0vMTAwLDI1NSpuWzJdLzEwMCwyNTUqblszXS8xMDAsbls0XSk6KG49UmwuZXhlYyh0KSk/QXQoblsxXSxuWzJdLzEwMCxuWzNdLzEwMCwxKToobj1xbC5leGVjKHQpKT9BdChuWzFdLG5bMl0vMTAwLG5bM10vMTAwLG5bNF0pOkxsLmhhc093blByb3BlcnR5KHQpP1R0KExsW3RdKToidHJhbnNwYXJlbnQiPT09dD9uZXcgRXQoTmFOLE5hTixOYU4sMCk6bnVsbH1mdW5jdGlvbiBUdCh0KXtyZXR1cm4gbmV3IEV0KHQ+PjE2JjI1NSx0Pj44JjI1NSwyNTUmdCwxKX1mdW5jdGlvbiBOdCh0LG4sZSxyKXtyZXR1cm4gcjw9MCYmKHQ9bj1lPU5hTiksbmV3IEV0KHQsbixlLHIpfWZ1bmN0aW9uIGt0KHQpe3JldHVybiB0IGluc3RhbmNlb2Ygd3R8fCh0PU10KHQpKSx0Pyh0PXQucmdiKCksbmV3IEV0KHQucix0LmcsdC5iLHQub3BhY2l0eSkpOm5ldyBFdH1mdW5jdGlvbiBTdCh0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/a3QodCk6bmV3IEV0KHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBFdCh0LG4sZSxyKXt0aGlzLnI9K3QsdGhpcy5nPStuLHRoaXMuYj0rZSx0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gQXQodCxuLGUscil7cmV0dXJuIHI8PTA/dD1uPWU9TmFOOmU8PTB8fGU+PTE/dD1uPU5hTjpuPD0wJiYodD1OYU4pLG5ldyBQdCh0LG4sZSxyKX1mdW5jdGlvbiBDdCh0KXtpZih0IGluc3RhbmNlb2YgUHQpcmV0dXJuIG5ldyBQdCh0LmgsdC5zLHQubCx0Lm9wYWNpdHkpO2lmKHQgaW5zdGFuY2VvZiB3dHx8KHQ9TXQodCkpLCF0KXJldHVybiBuZXcgUHQ7aWYodCBpbnN0YW5jZW9mIFB0KXJldHVybiB0O3Q9dC5yZ2IoKTt2YXIgbj10LnIvMjU1LGU9dC5nLzI1NSxyPXQuYi8yNTUsaT1NYXRoLm1pbihuLGUsciksbz1NYXRoLm1heChuLGUsciksdT1OYU4sYT1vLWksYz0obytpKS8yO3JldHVybiBhPyh1PW49PT1vPyhlLXIpL2ErNiooZTxyKTplPT09bz8oci1uKS9hKzI6KG4tZSkvYSs0LGEvPWM8LjU/bytpOjItby1pLHUqPTYwKTphPWM+MCYmYzwxPzA6dSxuZXcgUHQodSxhLGMsdC5vcGFjaXR5KX1mdW5jdGlvbiB6dCh0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/Q3QodCk6bmV3IFB0KHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBQdCh0LG4sZSxyKXt0aGlzLmg9K3QsdGhpcy5zPStuLHRoaXMubD0rZSx0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gUnQodCxuLGUpe3JldHVybiAyNTUqKHQ8NjA/bisoZS1uKSp0LzYwOnQ8MTgwP2U6dDwyNDA/bisoZS1uKSooMjQwLXQpLzYwOm4pfWZ1bmN0aW9uIHF0KHQpe2lmKHQgaW5zdGFuY2VvZiBVdClyZXR1cm4gbmV3IFV0KHQubCx0LmEsdC5iLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIGp0KXt2YXIgbj10LmgqVWw7cmV0dXJuIG5ldyBVdCh0LmwsTWF0aC5jb3MobikqdC5jLE1hdGguc2luKG4pKnQuYyx0Lm9wYWNpdHkpfXQgaW5zdGFuY2VvZiBFdHx8KHQ9a3QodCkpO3ZhciBlPUl0KHQucikscj1JdCh0LmcpLGk9SXQodC5iKSxvPUR0KCguNDEyNDU2NCplKy4zNTc1NzYxKnIrLjE4MDQzNzUqaSkvRmwpLHU9RHQoKC4yMTI2NzI5KmUrLjcxNTE1MjIqcisuMDcyMTc1KmkpL0lsKSxhPUR0KCguMDE5MzMzOSplKy4xMTkxOTIqcisuOTUwMzA0MSppKS9ZbCk7cmV0dXJuIG5ldyBVdCgxMTYqdS0xNiw1MDAqKG8tdSksMjAwKih1LWEpLHQub3BhY2l0eSl9ZnVuY3Rpb24gTHQodCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3F0KHQpOm5ldyBVdCh0LG4sZSxudWxsPT1yPzE6cil9ZnVuY3Rpb24gVXQodCxuLGUscil7dGhpcy5sPSt0LHRoaXMuYT0rbix0aGlzLmI9K2UsdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIER0KHQpe3JldHVybiB0PlhsP01hdGgucG93KHQsMS8zKTp0L0hsK0JsfWZ1bmN0aW9uIE90KHQpe3JldHVybiB0PmpsP3QqdCp0OkhsKih0LUJsKX1mdW5jdGlvbiBGdCh0KXtyZXR1cm4gMjU1Kih0PD0uMDAzMTMwOD8xMi45Mip0OjEuMDU1Kk1hdGgucG93KHQsMS8yLjQpLS4wNTUpfWZ1bmN0aW9uIEl0KHQpe3JldHVybih0Lz0yNTUpPD0uMDQwNDU/dC8xMi45MjpNYXRoLnBvdygodCsuMDU1KS8xLjA1NSwyLjQpfWZ1bmN0aW9uIFl0KHQpe2lmKHQgaW5zdGFuY2VvZiBqdClyZXR1cm4gbmV3IGp0KHQuaCx0LmMsdC5sLHQub3BhY2l0eSk7dCBpbnN0YW5jZW9mIFV0fHwodD1xdCh0KSk7dmFyIG49TWF0aC5hdGFuMih0LmIsdC5hKSpEbDtyZXR1cm4gbmV3IGp0KG48MD9uKzM2MDpuLE1hdGguc3FydCh0LmEqdC5hK3QuYip0LmIpLHQubCx0Lm9wYWNpdHkpfWZ1bmN0aW9uIEJ0KHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9ZdCh0KTpuZXcganQodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIGp0KHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLmM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBIdCh0KXtpZih0IGluc3RhbmNlb2YgVnQpcmV0dXJuIG5ldyBWdCh0LmgsdC5zLHQubCx0Lm9wYWNpdHkpO3QgaW5zdGFuY2VvZiBFdHx8KHQ9a3QodCkpO3ZhciBuPXQuci8yNTUsZT10LmcvMjU1LHI9dC5iLzI1NSxpPShLbCpyK0psKm4tUWwqZSkvKEtsK0psLVFsKSxvPXItaSx1PShHbCooZS1pKS0kbCpvKS9abCxhPU1hdGguc3FydCh1KnUrbypvKS8oR2wqaSooMS1pKSksYz1hP01hdGguYXRhbjIodSxvKSpEbC0xMjA6TmFOO3JldHVybiBuZXcgVnQoYzwwP2MrMzYwOmMsYSxpLHQub3BhY2l0eSl9ZnVuY3Rpb24gWHQodCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP0h0KHQpOm5ldyBWdCh0LG4sZSxudWxsPT1yPzE6cil9ZnVuY3Rpb24gVnQodCxuLGUscil7dGhpcy5oPSt0LHRoaXMucz0rbix0aGlzLmw9K2UsdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIFd0KHQsbixlLHIsaSl7dmFyIG89dCp0LHU9byp0O3JldHVybigoMS0zKnQrMypvLXUpKm4rKDQtNipvKzMqdSkqZSsoMSszKnQrMypvLTMqdSkqcit1KmkpLzZ9ZnVuY3Rpb24gJHQodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQrZSpufX1mdW5jdGlvbiBadCh0LG4sZSl7cmV0dXJuIHQ9TWF0aC5wb3codCxlKSxuPU1hdGgucG93KG4sZSktdCxlPTEvZSxmdW5jdGlvbihyKXtyZXR1cm4gTWF0aC5wb3codCtyKm4sZSl9fWZ1bmN0aW9uIEd0KHQsbil7dmFyIGU9bi10O3JldHVybiBlPyR0KHQsZT4xODB8fGU8LTE4MD9lLTM2MCpNYXRoLnJvdW5kKGUvMzYwKTplKTpjaChpc05hTih0KT9uOnQpfWZ1bmN0aW9uIEp0KHQpe3JldHVybiAxPT09KHQ9K3QpP1F0OmZ1bmN0aW9uKG4sZSl7cmV0dXJuIGUtbj9adChuLGUsdCk6Y2goaXNOYU4obik/ZTpuKX19ZnVuY3Rpb24gUXQodCxuKXt2YXIgZT1uLXQ7cmV0dXJuIGU/JHQodCxlKTpjaChpc05hTih0KT9uOnQpfWZ1bmN0aW9uIEt0KHQpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgZSxyLGk9bi5sZW5ndGgsbz1uZXcgQXJyYXkoaSksdT1uZXcgQXJyYXkoaSksYT1uZXcgQXJyYXkoaSk7Zm9yKGU9MDtlPGk7KytlKXI9U3QobltlXSksb1tlXT1yLnJ8fDAsdVtlXT1yLmd8fDAsYVtlXT1yLmJ8fDA7cmV0dXJuIG89dChvKSx1PXQodSksYT10KGEpLHIub3BhY2l0eT0xLGZ1bmN0aW9uKHQpe3JldHVybiByLnI9byh0KSxyLmc9dSh0KSxyLmI9YSh0KSxyKyIifX19ZnVuY3Rpb24gdG4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIG5uKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdChuKSsiIn19ZnVuY3Rpb24gZW4odCl7cmV0dXJuIm5vbmUiPT09dD93aDoodGh8fCh0aD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSxuaD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZWg9ZG9jdW1lbnQuZGVmYXVsdFZpZXcpLHRoLnN0eWxlLnRyYW5zZm9ybT10LHQ9ZWguZ2V0Q29tcHV0ZWRTdHlsZShuaC5hcHBlbmRDaGlsZCh0aCksbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSgidHJhbnNmb3JtIiksbmgucmVtb3ZlQ2hpbGQodGgpLHQ9dC5zbGljZSg3LC0xKS5zcGxpdCgiLCIpLE1oKCt0WzBdLCt0WzFdLCt0WzJdLCt0WzNdLCt0WzRdLCt0WzVdKSl9ZnVuY3Rpb24gcm4odCl7cmV0dXJuIG51bGw9PXQ/d2g6KHJofHwocmg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsImciKSkscmguc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLHQpLCh0PXJoLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpPyh0PXQubWF0cml4LE1oKHQuYSx0LmIsdC5jLHQuZCx0LmUsdC5mKSk6d2gpfWZ1bmN0aW9uIG9uKHQsbixlLHIpe2Z1bmN0aW9uIGkodCl7cmV0dXJuIHQubGVuZ3RoP3QucG9wKCkrIiAiOiIifWZ1bmN0aW9uIG8odCxyLGksbyx1LGEpe2lmKHQhPT1pfHxyIT09byl7dmFyIGM9dS5wdXNoKCJ0cmFuc2xhdGUoIixudWxsLG4sbnVsbCxlKTthLnB1c2goe2k6Yy00LHg6ZGgodCxpKX0se2k6Yy0yLHg6ZGgocixvKX0pfWVsc2UoaXx8bykmJnUucHVzaCgidHJhbnNsYXRlKCIraStuK28rZSl9ZnVuY3Rpb24gdSh0LG4sZSxvKXt0IT09bj8odC1uPjE4MD9uKz0zNjA6bi10PjE4MCYmKHQrPTM2MCksby5wdXNoKHtpOmUucHVzaChpKGUpKyJyb3RhdGUoIixudWxsLHIpLTIseDpkaCh0LG4pfSkpOm4mJmUucHVzaChpKGUpKyJyb3RhdGUoIituK3IpfWZ1bmN0aW9uIGEodCxuLGUsbyl7dCE9PW4/by5wdXNoKHtpOmUucHVzaChpKGUpKyJza2V3WCgiLG51bGwsciktMix4OmRoKHQsbil9KTpuJiZlLnB1c2goaShlKSsic2tld1goIituK3IpfWZ1bmN0aW9uIGModCxuLGUscixvLHUpe2lmKHQhPT1lfHxuIT09cil7dmFyIGE9by5wdXNoKGkobykrInNjYWxlKCIsbnVsbCwiLCIsbnVsbCwiKSIpO3UucHVzaCh7aTphLTQseDpkaCh0LGUpfSx7aTphLTIseDpkaChuLHIpfSl9ZWxzZSAxPT09ZSYmMT09PXJ8fG8ucHVzaChpKG8pKyJzY2FsZSgiK2UrIiwiK3IrIikiKX1yZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj1bXSxpPVtdO3JldHVybiBuPXQobiksZT10KGUpLG8obi50cmFuc2xhdGVYLG4udHJhbnNsYXRlWSxlLnRyYW5zbGF0ZVgsZS50cmFuc2xhdGVZLHIsaSksdShuLnJvdGF0ZSxlLnJvdGF0ZSxyLGkpLGEobi5za2V3WCxlLnNrZXdYLHIsaSksYyhuLnNjYWxlWCxuLnNjYWxlWSxlLnNjYWxlWCxlLnNjYWxlWSxyLGkpLG49ZT1udWxsLGZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlPS0xLG89aS5sZW5ndGg7KytlPG87KXJbKG49aVtlXSkuaV09bi54KHQpO3JldHVybiByLmpvaW4oIiIpfX19ZnVuY3Rpb24gdW4odCl7cmV0dXJuKCh0PU1hdGguZXhwKHQpKSsxL3QpLzJ9ZnVuY3Rpb24gYW4odCl7cmV0dXJuKCh0PU1hdGguZXhwKHQpKS0xL3QpLzJ9ZnVuY3Rpb24gY24odCl7cmV0dXJuKCh0PU1hdGguZXhwKDIqdCkpLTEpLyh0KzEpfWZ1bmN0aW9uIHNuKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPXQoKG49enQobikpLmgsKGU9enQoZSkpLmgpLGk9UXQobi5zLGUucyksbz1RdChuLmwsZS5sKSx1PVF0KG4ub3BhY2l0eSxlLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbi5oPXIodCksbi5zPWkodCksbi5sPW8odCksbi5vcGFjaXR5PXUodCksbisiIn19fWZ1bmN0aW9uIGZuKHQsbil7dmFyIGU9UXQoKHQ9THQodCkpLmwsKG49THQobikpLmwpLHI9UXQodC5hLG4uYSksaT1RdCh0LmIsbi5iKSxvPVF0KHQub3BhY2l0eSxuLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdC5sPWUobiksdC5hPXIobiksdC5iPWkobiksdC5vcGFjaXR5PW8obiksdCsiIn19ZnVuY3Rpb24gbG4odCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9dCgobj1CdChuKSkuaCwoZT1CdChlKSkuaCksaT1RdChuLmMsZS5jKSxvPVF0KG4ubCxlLmwpLHU9UXQobi5vcGFjaXR5LGUub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuLmg9cih0KSxuLmM9aSh0KSxuLmw9byh0KSxuLm9wYWNpdHk9dSh0KSxuKyIifX19ZnVuY3Rpb24gaG4odCl7cmV0dXJuIGZ1bmN0aW9uIG4oZSl7ZnVuY3Rpb24gcihuLHIpe3ZhciBpPXQoKG49WHQobikpLmgsKHI9WHQocikpLmgpLG89UXQobi5zLHIucyksdT1RdChuLmwsci5sKSxhPVF0KG4ub3BhY2l0eSxyLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbi5oPWkodCksbi5zPW8odCksbi5sPXUoTWF0aC5wb3codCxlKSksbi5vcGFjaXR5PWEodCksbisiIn19cmV0dXJuIGU9K2Usci5nYW1tYT1uLHJ9KDEpfWZ1bmN0aW9uIHBuKCl7cmV0dXJuIGpofHwoVmgoZG4pLGpoPVhoLm5vdygpK0hoKX1mdW5jdGlvbiBkbigpe2poPTB9ZnVuY3Rpb24gdm4oKXt0aGlzLl9jYWxsPXRoaXMuX3RpbWU9dGhpcy5fbmV4dD1udWxsfWZ1bmN0aW9uIF9uKHQsbixlKXt2YXIgcj1uZXcgdm47cmV0dXJuIHIucmVzdGFydCh0LG4sZSkscn1mdW5jdGlvbiB5bigpe3BuKCksKytPaDtmb3IodmFyIHQsbj1paDtuOykodD1qaC1uLl90aW1lKT49MCYmbi5fY2FsbC5jYWxsKG51bGwsdCksbj1uLl9uZXh0Oy0tT2h9ZnVuY3Rpb24gZ24oKXtqaD0oQmg9WGgubm93KCkpK0hoLE9oPUZoPTA7dHJ5e3luKCl9ZmluYWxseXtPaD0wLHhuKCksamg9MH19ZnVuY3Rpb24gbW4oKXt2YXIgdD1YaC5ub3coKSxuPXQtQmg7bj5ZaCYmKEhoLT1uLEJoPXQpfWZ1bmN0aW9uIHhuKCl7Zm9yKHZhciB0LG4sZT1paCxyPTEvMDtlOyllLl9jYWxsPyhyPmUuX3RpbWUmJihyPWUuX3RpbWUpLHQ9ZSxlPWUuX25leHQpOihuPWUuX25leHQsZS5fbmV4dD1udWxsLGU9dD90Ll9uZXh0PW46aWg9bik7b2g9dCxibihyKX1mdW5jdGlvbiBibih0KXtpZighT2gpe0ZoJiYoRmg9Y2xlYXJUaW1lb3V0KEZoKSk7dmFyIG49dC1qaDtuPjI0Pyh0PDEvMCYmKEZoPXNldFRpbWVvdXQoZ24sbikpLEloJiYoSWg9Y2xlYXJJbnRlcnZhbChJaCkpKTooSWh8fChCaD1qaCxJaD1zZXRJbnRlcnZhbChtbixZaCkpLE9oPTEsVmgoZ24pKX19ZnVuY3Rpb24gd24odCxuKXt2YXIgZT10Ll9fdHJhbnNpdGlvbjtpZighZXx8IShlPWVbbl0pfHxlLnN0YXRlPkpoKXRocm93IG5ldyBFcnJvcigidG9vIGxhdGUiKTtyZXR1cm4gZX1mdW5jdGlvbiBNbih0LG4pe3ZhciBlPXQuX190cmFuc2l0aW9uO2lmKCFlfHwhKGU9ZVtuXSl8fGUuc3RhdGU+S2gpdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZSIpO3JldHVybiBlfWZ1bmN0aW9uIFRuKHQsbil7dmFyIGU9dC5fX3RyYW5zaXRpb247aWYoIWV8fCEoZT1lW25dKSl0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlIik7cmV0dXJuIGV9ZnVuY3Rpb24gTm4odCxuLGUpe2Z1bmN0aW9uIHIodCl7ZS5zdGF0ZT1RaCxlLnRpbWVyLnJlc3RhcnQoaSxlLmRlbGF5LGUudGltZSksZS5kZWxheTw9dCYmaSh0LWUuZGVsYXkpfWZ1bmN0aW9uIGkocil7dmFyIHMsZixsLGg7aWYoZS5zdGF0ZSE9PVFoKXJldHVybiB1KCk7Zm9yKHMgaW4gYylpZihoPWNbc10saC5uYW1lPT09ZS5uYW1lKXtpZihoLnN0YXRlPT09dHApcmV0dXJuIFdoKGkpO2guc3RhdGU9PT1ucD8oaC5zdGF0ZT1ycCxoLnRpbWVyLnN0b3AoKSxoLm9uLmNhbGwoImludGVycnVwdCIsdCx0Ll9fZGF0YV9fLGguaW5kZXgsaC5ncm91cCksZGVsZXRlIGNbc10pOitzPG4mJihoLnN0YXRlPXJwLGgudGltZXIuc3RvcCgpLGRlbGV0ZSBjW3NdKX1pZihXaChmdW5jdGlvbigpe2Uuc3RhdGU9PT10cCYmKGUuc3RhdGU9bnAsZS50aW1lci5yZXN0YXJ0KG8sZS5kZWxheSxlLnRpbWUpLG8ocikpfSksZS5zdGF0ZT1LaCxlLm9uLmNhbGwoInN0YXJ0Iix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSxlLnN0YXRlPT09S2gpe2ZvcihlLnN0YXRlPXRwLGE9bmV3IEFycmF5KGw9ZS50d2Vlbi5sZW5ndGgpLHM9MCxmPS0xO3M8bDsrK3MpKGg9ZS50d2VlbltzXS52YWx1ZS5jYWxsKHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApKSYmKGFbKytmXT1oKTthLmxlbmd0aD1mKzF9fWZ1bmN0aW9uIG8obil7Zm9yKHZhciByPW48ZS5kdXJhdGlvbj9lLmVhc2UuY2FsbChudWxsLG4vZS5kdXJhdGlvbik6KGUudGltZXIucmVzdGFydCh1KSxlLnN0YXRlPWVwLDEpLGk9LTEsbz1hLmxlbmd0aDsrK2k8bzspYVtpXS5jYWxsKG51bGwscik7ZS5zdGF0ZT09PWVwJiYoZS5vbi5jYWxsKCJlbmQiLHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApLHUoKSl9ZnVuY3Rpb24gdSgpe2Uuc3RhdGU9cnAsZS50aW1lci5zdG9wKCksZGVsZXRlIGNbbl07Zm9yKHZhciByIGluIGMpcmV0dXJuO2RlbGV0ZSB0Ll9fdHJhbnNpdGlvbn12YXIgYSxjPXQuX190cmFuc2l0aW9uO2Nbbl09ZSxlLnRpbWVyPV9uKHIsMCxlLnRpbWUpfWZ1bmN0aW9uIGtuKHQsbil7dmFyIGUscjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaT1Nbih0aGlzLHQpLG89aS50d2VlbjtpZihvIT09ZSl7cj1lPW87Zm9yKHZhciB1PTAsYT1yLmxlbmd0aDt1PGE7Kyt1KWlmKHJbdV0ubmFtZT09PW4pe3I9ci5zbGljZSgpLHIuc3BsaWNlKHUsMSk7YnJlYWt9fWkudHdlZW49cn19ZnVuY3Rpb24gU24odCxuLGUpe3ZhciByLGk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPU1uKHRoaXMsdCksdT1vLnR3ZWVuO2lmKHUhPT1yKXtpPShyPXUpLnNsaWNlKCk7Zm9yKHZhciBhPXtuYW1lOm4sdmFsdWU6ZX0sYz0wLHM9aS5sZW5ndGg7YzxzOysrYylpZihpW2NdLm5hbWU9PT1uKXtpW2NdPWE7YnJlYWt9Yz09PXMmJmkucHVzaChhKX1vLnR3ZWVuPWl9fWZ1bmN0aW9uIEVuKHQsbixlKXt2YXIgcj10Ll9pZDtyZXR1cm4gdC5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9TW4odGhpcyxyKTsodC52YWx1ZXx8KHQudmFsdWU9e30pKVtuXT1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLGZ1bmN0aW9uKHQpe3JldHVybiBUbih0LHIpLnZhbHVlW25dfX1mdW5jdGlvbiBBbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19ZnVuY3Rpb24gQ24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiB6bih0LG4sZSl7dmFyIHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz10aGlzLmdldEF0dHJpYnV0ZSh0KTtyZXR1cm4gbz09PWU/bnVsbDpvPT09cj9pOmk9bihyPW8sZSl9fWZ1bmN0aW9uIFBuKHQsbixlKXt2YXIgcixpO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPXRoaXMuZ2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKTtyZXR1cm4gbz09PWU/bnVsbDpvPT09cj9pOmk9bihyPW8sZSl9fWZ1bmN0aW9uIFJuKHQsbixlKXt2YXIgcixpLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHUsYT1lKHRoaXMpO3JldHVybiBudWxsPT1hP3ZvaWQgdGhpcy5yZW1vdmVBdHRyaWJ1dGUodCk6KHU9dGhpcy5nZXRBdHRyaWJ1dGUodCksdT09PWE/bnVsbDp1PT09ciYmYT09PWk/bzpvPW4ocj11LGk9YSkpfX1mdW5jdGlvbiBxbih0LG4sZSl7dmFyIHIsaSxvO3JldHVybiBmdW5jdGlvbigpe3ZhciB1LGE9ZSh0aGlzKTtyZXR1cm4gbnVsbD09YT92b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKToodT10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCksdT09PWE/bnVsbDp1PT09ciYmYT09PWk/bzpvPW4ocj11LGk9YSkpfX1mdW5jdGlvbiBMbih0LG4pe2Z1bmN0aW9uIGUoKXt2YXIgZT10aGlzLHI9bi5hcHBseShlLGFyZ3VtZW50cyk7cmV0dXJuIHImJmZ1bmN0aW9uKG4pe2Uuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLHIobikpfX1yZXR1cm4gZS5fdmFsdWU9bixlfWZ1bmN0aW9uIFVuKHQsbil7ZnVuY3Rpb24gZSgpe3ZhciBlPXRoaXMscj1uLmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gciYmZnVuY3Rpb24obil7ZS5zZXRBdHRyaWJ1dGUodCxyKG4pKX19cmV0dXJuIGUuX3ZhbHVlPW4sZX1mdW5jdGlvbiBEbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3duKHRoaXMsdCkuZGVsYXk9K24uYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBPbih0LG4pe3JldHVybiBuPStuLGZ1bmN0aW9uKCl7d24odGhpcyx0KS5kZWxheT1ufX1mdW5jdGlvbiBGbih0LG4pe3JldHVybiBmdW5jdGlvbigpe01uKHRoaXMsdCkuZHVyYXRpb249K24uYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBJbih0LG4pe3JldHVybiBuPStuLGZ1bmN0aW9uKCl7TW4odGhpcyx0KS5kdXJhdGlvbj1ufX1mdW5jdGlvbiBZbih0LG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gZnVuY3Rpb24oKXtNbih0aGlzLHQpLmVhc2U9bn19ZnVuY3Rpb24gQm4odCl7cmV0dXJuKHQrIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKS5ldmVyeShmdW5jdGlvbih0KXt2YXIgbj10LmluZGV4T2YoIi4iKTtyZXR1cm4gbj49MCYmKHQ9dC5zbGljZSgwLG4pKSwhdHx8InN0YXJ0Ij09PXR9KX1mdW5jdGlvbiBqbih0LG4sZSl7dmFyIHIsaSxvPUJuKG4pP3duOk1uO3JldHVybiBmdW5jdGlvbigpe3ZhciB1PW8odGhpcyx0KSxhPXUub247YSE9PXImJihpPShyPWEpLmNvcHkoKSkub24obixlKSx1Lm9uPWl9fWZ1bmN0aW9uIEhuKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMucGFyZW50Tm9kZTtmb3IodmFyIGUgaW4gdGhpcy5fX3RyYW5zaXRpb24paWYoK2UhPT10KXJldHVybjtuJiZuLnJlbW92ZUNoaWxkKHRoaXMpfX1mdW5jdGlvbiBYbih0LG4pe3ZhciBlLHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1LZih0aGlzKS5nZXRDb21wdXRlZFN0eWxlKHRoaXMsbnVsbCksdT1vLmdldFByb3BlcnR5VmFsdWUodCksYT0odGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KSxvLmdldFByb3BlcnR5VmFsdWUodCkpO3JldHVybiB1PT09YT9udWxsOnU9PT1lJiZhPT09cj9pOmk9bihlPXUscj1hKX19ZnVuY3Rpb24gVm4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KX19ZnVuY3Rpb24gV24odCxuLGUpe3ZhciByLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89S2YodGhpcykuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLG51bGwpLmdldFByb3BlcnR5VmFsdWUodCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX1mdW5jdGlvbiAkbih0LG4sZSl7dmFyIHIsaSxvO3JldHVybiBmdW5jdGlvbigpe3ZhciB1PUtmKHRoaXMpLmdldENvbXB1dGVkU3R5bGUodGhpcyxudWxsKSxhPXUuZ2V0UHJvcGVydHlWYWx1ZSh0KSxjPWUodGhpcyk7cmV0dXJuIG51bGw9PWMmJih0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLGM9dS5nZXRQcm9wZXJ0eVZhbHVlKHQpKSxhPT09Yz9udWxsOmE9PT1yJiZjPT09aT9vOm89bihyPWEsaT1jKX19ZnVuY3Rpb24gWm4odCxuLGUpe2Z1bmN0aW9uIHIoKXt2YXIgcj10aGlzLGk9bi5hcHBseShyLGFyZ3VtZW50cyk7cmV0dXJuIGkmJmZ1bmN0aW9uKG4pe3Iuc3R5bGUuc2V0UHJvcGVydHkodCxpKG4pLGUpfX1yZXR1cm4gci5fdmFsdWU9bixyfWZ1bmN0aW9uIEduKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19ZnVuY3Rpb24gSm4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dCh0aGlzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PW4/IiI6bn19ZnVuY3Rpb24gUW4odCxuLGUscil7dGhpcy5fZ3JvdXBzPXQsdGhpcy5fcGFyZW50cz1uLHRoaXMuX25hbWU9ZSx0aGlzLl9pZD1yfWZ1bmN0aW9uIEtuKHQpe3JldHVybiBkdCgpLnRyYW5zaXRpb24odCl9ZnVuY3Rpb24gdGUoKXtyZXR1cm4rK2twfWZ1bmN0aW9uIG5lKHQpe3JldHVybit0fWZ1bmN0aW9uIGVlKHQpe3JldHVybiB0KnR9ZnVuY3Rpb24gcmUodCl7cmV0dXJuIHQqKDItdCl9ZnVuY3Rpb24gaWUodCl7cmV0dXJuKCh0Kj0yKTw9MT90KnQ6LS10KigyLXQpKzEpLzJ9ZnVuY3Rpb24gb2UodCl7cmV0dXJuIHQqdCp0fWZ1bmN0aW9uIHVlKHQpe3JldHVybi0tdCp0KnQrMX1mdW5jdGlvbiBhZSh0KXtyZXR1cm4oKHQqPTIpPD0xP3QqdCp0Oih0LT0yKSp0KnQrMikvMn1mdW5jdGlvbiBjZSh0KXtyZXR1cm4gMS1NYXRoLmNvcyh0KlJwKX1mdW5jdGlvbiBzZSh0KXtyZXR1cm4gTWF0aC5zaW4odCpScCl9ZnVuY3Rpb24gZmUodCl7cmV0dXJuKDEtTWF0aC5jb3MoUHAqdCkpLzJ9ZnVuY3Rpb24gbGUodCl7cmV0dXJuIE1hdGgucG93KDIsMTAqdC0xMCl9ZnVuY3Rpb24gaGUodCl7cmV0dXJuIDEtTWF0aC5wb3coMiwtMTAqdCl9ZnVuY3Rpb24gcGUodCl7cmV0dXJuKCh0Kj0yKTw9MT9NYXRoLnBvdygyLDEwKnQtMTApOjItTWF0aC5wb3coMiwxMC0xMCp0KSkvMn1mdW5jdGlvbiBkZSh0KXtyZXR1cm4gMS1NYXRoLnNxcnQoMS10KnQpfWZ1bmN0aW9uIHZlKHQpe3JldHVybiBNYXRoLnNxcnQoMS0gLS10KnQpfWZ1bmN0aW9uIF9lKHQpe3JldHVybigodCo9Mik8PTE/MS1NYXRoLnNxcnQoMS10KnQpOk1hdGguc3FydCgxLSh0LT0yKSp0KSsxKS8yfWZ1bmN0aW9uIHllKHQpe3JldHVybiAxLWdlKDEtdCl9ZnVuY3Rpb24gZ2UodCl7cmV0dXJuKHQ9K3QpPHFwP2pwKnQqdDp0PFVwP2pwKih0LT1McCkqdCtEcDp0PEZwP2pwKih0LT1PcCkqdCtJcDpqcCoodC09WXApKnQrQnB9ZnVuY3Rpb24gbWUodCl7cmV0dXJuKCh0Kj0yKTw9MT8xLWdlKDEtdCk6Z2UodC0xKSsxKS8yfWZ1bmN0aW9uIHhlKHQsbil7Zm9yKHZhciBlOyEoZT10Ll9fdHJhbnNpdGlvbil8fCEoZT1lW25dKTspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuIHRkLnRpbWU9cG4oKSx0ZDtyZXR1cm4gZX1mdW5jdGlvbiBiZSgpe3QuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gd2UodCl7cmV0dXJue3R5cGU6dH19ZnVuY3Rpb24gTWUoKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gVGUoKXt2YXIgdD10aGlzLm93bmVyU1ZHRWxlbWVudHx8dGhpcztyZXR1cm5bWzAsMF0sW3Qud2lkdGguYmFzZVZhbC52YWx1ZSx0LmhlaWdodC5iYXNlVmFsLnZhbHVlXV19ZnVuY3Rpb24gTmUodCl7Zm9yKDshdC5fX2JydXNoOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm47cmV0dXJuIHQuX19icnVzaH1mdW5jdGlvbiBrZSh0KXtyZXR1cm4gdFswXVswXT09PXRbMV1bMF18fHRbMF1bMV09PT10WzFdWzFdfWZ1bmN0aW9uIFNlKHQpe3ZhciBuPXQuX19icnVzaDtyZXR1cm4gbj9uLmRpbS5vdXRwdXQobi5zZWxlY3Rpb24pOm51bGx9ZnVuY3Rpb24gRWUoKXtyZXR1cm4gQ2UobGQpfWZ1bmN0aW9uIEFlKCl7cmV0dXJuIENlKGhkKX1mdW5jdGlvbiBDZShuKXtmdW5jdGlvbiBlKHQpe3ZhciBlPXQucHJvcGVydHkoIl9fYnJ1c2giLGEpLnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5kYXRhKFt3ZSgib3ZlcmxheSIpXSk7ZS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwib3ZlcmxheSIpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuYXR0cigiY3Vyc29yIixkZC5vdmVybGF5KS5tZXJnZShlKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9TmUodGhpcykuZXh0ZW50O3BsKHRoaXMpLmF0dHIoIngiLHRbMF1bMF0pLmF0dHIoInkiLHRbMF1bMV0pLmF0dHIoIndpZHRoIix0WzFdWzBdLXRbMF1bMF0pLmF0dHIoImhlaWdodCIsdFsxXVsxXS10WzBdWzFdKX0pLHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuZGF0YShbd2UoInNlbGVjdGlvbiIpXSkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsInNlbGVjdGlvbiIpLmF0dHIoImN1cnNvciIsZGQuc2VsZWN0aW9uKS5hdHRyKCJmaWxsIiwiIzc3NyIpLmF0dHIoImZpbGwtb3BhY2l0eSIsLjMpLmF0dHIoInN0cm9rZSIsIiNmZmYiKS5hdHRyKCJzaGFwZS1yZW5kZXJpbmciLCJjcmlzcEVkZ2VzIik7dmFyIGk9dC5zZWxlY3RBbGwoIi5oYW5kbGUiKS5kYXRhKG4uaGFuZGxlcyxmdW5jdGlvbih0KXtyZXR1cm4gdC50eXBlfSk7aS5leGl0KCkucmVtb3ZlKCksaS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIixmdW5jdGlvbih0KXtyZXR1cm4iaGFuZGxlIGhhbmRsZS0tIit0LnR5cGV9KS5hdHRyKCJjdXJzb3IiLGZ1bmN0aW9uKHQpe3JldHVybiBkZFt0LnR5cGVdfSksdC5lYWNoKHIpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpLm9uKCJtb3VzZWRvd24uYnJ1c2ggdG91Y2hzdGFydC5icnVzaCIsdSl9ZnVuY3Rpb24gcigpe3ZhciB0PXBsKHRoaXMpLG49TmUodGhpcykuc2VsZWN0aW9uO24/KHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLmF0dHIoIngiLG5bMF1bMF0pLmF0dHIoInkiLG5bMF1bMV0pLmF0dHIoIndpZHRoIixuWzFdWzBdLW5bMF1bMF0pLmF0dHIoImhlaWdodCIsblsxXVsxXS1uWzBdWzFdKSx0LnNlbGVjdEFsbCgiLmhhbmRsZSIpLnN0eWxlKCJkaXNwbGF5IixudWxsKS5hdHRyKCJ4IixmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGVbdC50eXBlLmxlbmd0aC0xXT9uWzFdWzBdLWgvMjpuWzBdWzBdLWgvMn0pLmF0dHIoInkiLGZ1bmN0aW9uKHQpe3JldHVybiJzIj09PXQudHlwZVswXT9uWzFdWzFdLWgvMjpuWzBdWzFdLWgvMn0pLmF0dHIoIndpZHRoIixmdW5jdGlvbih0KXtyZXR1cm4ibiI9PT10LnR5cGV8fCJzIj09PXQudHlwZT9uWzFdWzBdLW5bMF1bMF0raDpofSkuYXR0cigiaGVpZ2h0IixmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGV8fCJ3Ij09PXQudHlwZT9uWzFdWzFdLW5bMF1bMV0raDpofSkpOnQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uLC5oYW5kbGUiKS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKS5hdHRyKCJ4IixudWxsKS5hdHRyKCJ5IixudWxsKS5hdHRyKCJ3aWR0aCIsbnVsbCkuYXR0cigiaGVpZ2h0IixudWxsKX1mdW5jdGlvbiBpKHQsbil7cmV0dXJuIHQuX19icnVzaC5lbWl0dGVyfHxuZXcgbyh0LG4pfWZ1bmN0aW9uIG8odCxuKXt0aGlzLnRoYXQ9dCx0aGlzLmFyZ3M9bix0aGlzLnN0YXRlPXQuX19icnVzaCx0aGlzLmFjdGl2ZT0wfWZ1bmN0aW9uIHUoKXtmdW5jdGlvbiBlKCl7dmFyIHQ9emYoVCk7IVV8fHd8fE18fChNYXRoLmFicyh0WzBdLU9bMF0pPk1hdGguYWJzKHRbMV0tT1sxXSk/TT0hMDp3PSEwKSxPPXQsYj0hMCx1ZCgpLG8oKX1mdW5jdGlvbiBvKCl7dmFyIHQ7c3dpdGNoKG09T1swXS1EWzBdLHg9T1sxXS1EWzFdLGspe2Nhc2UgY2Q6Y2FzZSBhZDpTJiYobT1NYXRoLm1heChQLWwsTWF0aC5taW4ocS12LG0pKSxoPWwrbSxfPXYrbSksRSYmKHg9TWF0aC5tYXgoUi1wLE1hdGgubWluKEwteSx4KSksZD1wK3gsZz15K3gpO2JyZWFrO2Nhc2Ugc2Q6UzwwPyhtPU1hdGgubWF4KFAtbCxNYXRoLm1pbihxLWwsbSkpLGg9bCttLF89dik6Uz4wJiYobT1NYXRoLm1heChQLXYsTWF0aC5taW4ocS12LG0pKSxoPWwsXz12K20pLEU8MD8oeD1NYXRoLm1heChSLXAsTWF0aC5taW4oTC1wLHgpKSxkPXAreCxnPXkpOkU+MCYmKHg9TWF0aC5tYXgoUi15LE1hdGgubWluKEwteSx4KSksZD1wLGc9eSt4KTticmVhaztjYXNlIGZkOlMmJihoPU1hdGgubWF4KFAsTWF0aC5taW4ocSxsLW0qUykpLF89TWF0aC5tYXgoUCxNYXRoLm1pbihxLHYrbSpTKSkpLEUmJihkPU1hdGgubWF4KFIsTWF0aC5taW4oTCxwLXgqRSkpLGc9TWF0aC5tYXgoUixNYXRoLm1pbihMLHkreCpFKSkpfV88aCYmKFMqPS0xLHQ9bCxsPXYsdj10LHQ9aCxoPV8sXz10LE4gaW4gdmQmJlkuYXR0cigiY3Vyc29yIixkZFtOPXZkW05dXSkpLGc8ZCYmKEUqPS0xLHQ9cCxwPXkseT10LHQ9ZCxkPWcsZz10LE4gaW4gX2QmJlkuYXR0cigiY3Vyc29yIixkZFtOPV9kW05dXSkpLEEuc2VsZWN0aW9uJiYoej1BLnNlbGVjdGlvbiksdyYmKGg9elswXVswXSxfPXpbMV1bMF0pLE0mJihkPXpbMF1bMV0sZz16WzFdWzFdKSx6WzBdWzBdPT09aCYmelswXVsxXT09PWQmJnpbMV1bMF09PT1fJiZ6WzFdWzFdPT09Z3x8KEEuc2VsZWN0aW9uPVtbaCxkXSxbXyxnXV0sci5jYWxsKFQpLEYuYnJ1c2goKSl9ZnVuY3Rpb24gdSgpe2lmKGJlKCksdC5ldmVudC50b3VjaGVzKXtpZih0LmV2ZW50LnRvdWNoZXMubGVuZ3RoKXJldHVybjtjJiZjbGVhclRpbWVvdXQoYyksYz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yz1udWxsfSw1MDApLEkub24oInRvdWNobW92ZS5icnVzaCB0b3VjaGVuZC5icnVzaCB0b3VjaGNhbmNlbC5icnVzaCIsbnVsbCl9ZWxzZSBfdCh0LmV2ZW50LnZpZXcsYiksQi5vbigia2V5ZG93bi5icnVzaCBrZXl1cC5icnVzaCBtb3VzZW1vdmUuYnJ1c2ggbW91c2V1cC5icnVzaCIsbnVsbCk7SS5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLFkuYXR0cigiY3Vyc29yIixkZC5vdmVybGF5KSxBLnNlbGVjdGlvbiYmKHo9QS5zZWxlY3Rpb24pLGtlKHopJiYoQS5zZWxlY3Rpb249bnVsbCxyLmNhbGwoVCkpLEYuZW5kKCl9ZnVuY3Rpb24gYSgpe3N3aXRjaCh0LmV2ZW50LmtleUNvZGUpe2Nhc2UgMTY6VT1TJiZFO2JyZWFrO2Nhc2UgMTg6az09PXNkJiYoUyYmKHY9Xy1tKlMsbD1oK20qUyksRSYmKHk9Zy14KkUscD1kK3gqRSksaz1mZCxvKCkpO2JyZWFrO2Nhc2UgMzI6ayE9PXNkJiZrIT09ZmR8fChTPDA/dj1fLW06Uz4wJiYobD1oLW0pLEU8MD95PWcteDpFPjAmJihwPWQteCksaz1jZCxZLmF0dHIoImN1cnNvciIsZGQuc2VsZWN0aW9uKSxvKCkpO2JyZWFrO2RlZmF1bHQ6cmV0dXJufXVkKCl9ZnVuY3Rpb24gcygpe3N3aXRjaCh0LmV2ZW50LmtleUNvZGUpe2Nhc2UgMTY6VSYmKHc9TT1VPSExLG8oKSk7YnJlYWs7Y2FzZSAxODprPT09ZmQmJihTPDA/dj1fOlM+MCYmKGw9aCksRTwwP3k9ZzpFPjAmJihwPWQpLGs9c2QsbygpKTticmVhaztjYXNlIDMyOms9PT1jZCYmKHQuZXZlbnQuYWx0S2V5PyhTJiYodj1fLW0qUyxsPWgrbSpTKSxFJiYoeT1nLXgqRSxwPWQreCpFKSxrPWZkKTooUzwwP3Y9XzpTPjAmJihsPWgpLEU8MD95PWc6RT4wJiYocD1kKSxrPXNkKSxZLmF0dHIoImN1cnNvciIsZGRbTl0pLG8oKSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59dWQoKX1pZih0LmV2ZW50LnRvdWNoZXMpe2lmKHQuZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoPHQuZXZlbnQudG91Y2hlcy5sZW5ndGgpcmV0dXJuIHVkKCl9ZWxzZSBpZihjKXJldHVybjtpZihmLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIGwsaCxwLGQsdixfLHksZyxtLHgsYix3LE0sVD10aGlzLE49dC5ldmVudC50YXJnZXQuX19kYXRhX18udHlwZSxrPSJzZWxlY3Rpb24iPT09KHQuZXZlbnQubWV0YUtleT9OPSJvdmVybGF5IjpOKT9hZDp0LmV2ZW50LmFsdEtleT9mZDpzZCxTPW49PT1oZD9udWxsOnlkW05dLEU9bj09PWxkP251bGw6Z2RbTl0sQT1OZShUKSxDPUEuZXh0ZW50LHo9QS5zZWxlY3Rpb24sUD1DWzBdWzBdLFI9Q1swXVsxXSxxPUNbMV1bMF0sTD1DWzFdWzFdLFU9UyYmRSYmdC5ldmVudC5zaGlmdEtleSxEPXpmKFQpLE89RCxGPWkoVCxhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCk7Im92ZXJsYXkiPT09Tj9BLnNlbGVjdGlvbj16PVtbbD1uPT09aGQ/UDpEWzBdLHA9bj09PWxkP1I6RFsxXV0sW3Y9bj09PWhkP3E6bCx5PW49PT1sZD9MOnBdXToobD16WzBdWzBdLHA9elswXVsxXSx2PXpbMV1bMF0seT16WzFdWzFdKSxoPWwsZD1wLF89dixnPXk7dmFyIEk9cGwoVCkuYXR0cigicG9pbnRlci1ldmVudHMiLCJub25lIiksWT1JLnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5hdHRyKCJjdXJzb3IiLGRkW05dKTtpZih0LmV2ZW50LnRvdWNoZXMpSS5vbigidG91Y2htb3ZlLmJydXNoIixlLCEwKS5vbigidG91Y2hlbmQuYnJ1c2ggdG91Y2hjYW5jZWwuYnJ1c2giLHUsITApO2Vsc2V7dmFyIEI9cGwodC5ldmVudC52aWV3KS5vbigia2V5ZG93bi5icnVzaCIsYSwhMCkub24oImtleXVwLmJydXNoIixzLCEwKS5vbigibW91c2Vtb3ZlLmJydXNoIixlLCEwKS5vbigibW91c2V1cC5icnVzaCIsdSwhMCk7Z2wodC5ldmVudC52aWV3KX1iZSgpLG9wKFQpLHIuY2FsbChUKSxGLnN0YXJ0KCl9fWZ1bmN0aW9uIGEoKXt2YXIgdD10aGlzLl9fYnJ1c2h8fHtzZWxlY3Rpb246bnVsbH07cmV0dXJuIHQuZXh0ZW50PXMuYXBwbHkodGhpcyxhcmd1bWVudHMpLHQuZGltPW4sdH12YXIgYyxzPVRlLGY9TWUsbD1wKGUsInN0YXJ0IiwiYnJ1c2giLCJlbmQiKSxoPTY7cmV0dXJuIGUubW92ZT1mdW5jdGlvbih0LGUpe3Quc2VsZWN0aW9uP3Qub24oInN0YXJ0LmJydXNoIixmdW5jdGlvbigpe2kodGhpcyxhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCkuc3RhcnQoKX0pLm9uKCJpbnRlcnJ1cHQuYnJ1c2ggZW5kLmJydXNoIixmdW5jdGlvbigpe2kodGhpcyxhcmd1bWVudHMpLmVuZCgpfSkudHdlZW4oImJydXNoIixmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dS5zZWxlY3Rpb249MT09PXQmJmtlKHMpP251bGw6Zih0KSxyLmNhbGwobyksYS5icnVzaCgpfXZhciBvPXRoaXMsdT1vLl9fYnJ1c2gsYT1pKG8sYXJndW1lbnRzKSxjPXUuc2VsZWN0aW9uLHM9bi5pbnB1dCgiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTplLHUuZXh0ZW50KSxmPW1oKGMscyk7cmV0dXJuIGMmJnM/dDp0KDEpfSk6dC5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxvPWFyZ3VtZW50cyx1PXQuX19icnVzaCxhPW4uaW5wdXQoImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0LG8pOmUsdS5leHRlbnQpLGM9aSh0LG8pLmJlZm9yZXN0YXJ0KCk7b3AodCksdS5zZWxlY3Rpb249bnVsbD09YXx8a2UoYSk/bnVsbDphLHIuY2FsbCh0KSxjLnN0YXJ0KCkuYnJ1c2goKS5lbmQoKX0pfSxvLnByb3RvdHlwZT17YmVmb3Jlc3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gMT09PSsrdGhpcy5hY3RpdmUmJih0aGlzLnN0YXRlLmVtaXR0ZXI9dGhpcyx0aGlzLnN0YXJ0aW5nPSEwKSx0aGlzfSxzdGFydDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0aW5nJiYodGhpcy5zdGFydGluZz0hMSx0aGlzLmVtaXQoInN0YXJ0IikpLHRoaXN9LGJydXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW1pdCgiYnJ1c2giKSx0aGlzfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09PS0tdGhpcy5hY3RpdmUmJihkZWxldGUgdGhpcy5zdGF0ZS5lbWl0dGVyLHRoaXMuZW1pdCgiZW5kIikpLHRoaXN9LGVtaXQ6ZnVuY3Rpb24odCl7UyhuZXcgb2QoZSx0LG4ub3V0cHV0KHRoaXMuc3RhdGUuc2VsZWN0aW9uKSksbC5hcHBseSxsLFt0LHRoaXMudGhhdCx0aGlzLmFyZ3NdKX19LGUuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6aWQoW1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0pLGUpOnN9LGUuZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6aWQoISF0KSxlKTpmfSxlLmhhbmRsZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9K3QsZSk6aH0sZS5vbj1mdW5jdGlvbigpe3ZhciB0PWwub24uYXBwbHkobCxhcmd1bWVudHMpO3JldHVybiB0PT09bD9lOnR9LGV9ZnVuY3Rpb24gemUodCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7cmV0dXJuIHQobi5zb3VyY2UudmFsdWUrbi50YXJnZXQudmFsdWUsZS5zb3VyY2UudmFsdWUrZS50YXJnZXQudmFsdWUpfX1mdW5jdGlvbiBQZSgpe3RoaXMuX3gwPXRoaXMuX3kwPXRoaXMuX3gxPXRoaXMuX3kxPW51bGwsdGhpcy5fPSIifWZ1bmN0aW9uIFJlKCl7cmV0dXJuIG5ldyBQZX1mdW5jdGlvbiBxZSh0KXtyZXR1cm4gdC5zb3VyY2V9ZnVuY3Rpb24gTGUodCl7cmV0dXJuIHQudGFyZ2V0fWZ1bmN0aW9uIFVlKHQpe3JldHVybiB0LnJhZGl1c31mdW5jdGlvbiBEZSh0KXtyZXR1cm4gdC5zdGFydEFuZ2xlfWZ1bmN0aW9uIE9lKHQpe3JldHVybiB0LmVuZEFuZ2xlfWZ1bmN0aW9uIEZlKCl7fWZ1bmN0aW9uIEllKHQsbil7dmFyIGU9bmV3IEZlO2lmKHQgaW5zdGFuY2VvZiBGZSl0LmVhY2goZnVuY3Rpb24odCxuKXtlLnNldChuLHQpfSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpKXt2YXIgcixpPS0xLG89dC5sZW5ndGg7aWYobnVsbD09bilmb3IoOysraTxvOyllLnNldChpLHRbaV0pO2Vsc2UgZm9yKDsrK2k8bzspZS5zZXQobihyPXRbaV0saSx0KSxyKX1lbHNlIGlmKHQpZm9yKHZhciB1IGluIHQpZS5zZXQodSx0W3VdKTtyZXR1cm4gZX1mdW5jdGlvbiBZZSgpe3JldHVybnt9fWZ1bmN0aW9uIEJlKHQsbixlKXt0W25dPWV9ZnVuY3Rpb24gamUoKXtyZXR1cm4gSWUoKX1mdW5jdGlvbiBIZSh0LG4sZSl7dC5zZXQobixlKX1mdW5jdGlvbiBYZSgpe31mdW5jdGlvbiBWZSh0LG4pe3ZhciBlPW5ldyBYZTtpZih0IGluc3RhbmNlb2YgWGUpdC5lYWNoKGZ1bmN0aW9uKHQpe2UuYWRkKHQpfSk7ZWxzZSBpZih0KXt2YXIgcj0tMSxpPXQubGVuZ3RoO2lmKG51bGw9PW4pZm9yKDsrK3I8aTspZS5hZGQodFtyXSk7ZWxzZSBmb3IoOysrcjxpOyllLmFkZChuKHRbcl0scix0KSl9cmV0dXJuIGV9ZnVuY3Rpb24gV2UodCl7cmV0dXJuIG5ldyBGdW5jdGlvbigiZCIsInJldHVybiB7Iit0Lm1hcChmdW5jdGlvbih0LG4pe3JldHVybiBKU09OLnN0cmluZ2lmeSh0KSsiOiBkWyIrbisiXSJ9KS5qb2luKCIsIikrIn0iKX1mdW5jdGlvbiAkZSh0LG4pe3ZhciBlPVdlKHQpO3JldHVybiBmdW5jdGlvbihyLGkpe3JldHVybiBuKGUociksaSx0KX19ZnVuY3Rpb24gWmUodCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKSxlPVtdO3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24odCl7Zm9yKHZhciByIGluIHQpciBpbiBufHxlLnB1c2gobltyXT1yKX0pLGV9ZnVuY3Rpb24gR2UodCxuLGUscil7aWYoaXNOYU4obil8fGlzTmFOKGUpKXJldHVybiB0O3ZhciBpLG8sdSxhLGMscyxmLGwsaCxwPXQuX3Jvb3QsZD17ZGF0YTpyfSx2PXQuX3gwLF89dC5feTAseT10Ll94MSxnPXQuX3kxO2lmKCFwKXJldHVybiB0Ll9yb290PWQsdDtmb3IoO3AubGVuZ3RoOylpZigocz1uPj0obz0odit5KS8yKSk/dj1vOnk9bywoZj1lPj0odT0oXytnKS8yKSk/Xz11Omc9dSxpPXAsIShwPXBbbD1mPDwxfHNdKSlyZXR1cm4gaVtsXT1kLHQ7aWYoYT0rdC5feC5jYWxsKG51bGwscC5kYXRhKSxjPSt0Ll95LmNhbGwobnVsbCxwLmRhdGEpLG49PT1hJiZlPT09YylyZXR1cm4gZC5uZXh0PXAsaT9pW2xdPWQ6dC5fcm9vdD1kLHQ7ZG8gaT1pP2lbbF09bmV3IEFycmF5KDQpOnQuX3Jvb3Q9bmV3IEFycmF5KDQpLChzPW4+PShvPSh2K3kpLzIpKT92PW86eT1vLChmPWU+PSh1PShfK2cpLzIpKT9fPXU6Zz11O3doaWxlKChsPWY8PDF8cyk9PT0oaD0oYz49dSk8PDF8YT49bykpO3JldHVybiBpW2hdPXAsaVtsXT1kLHR9ZnVuY3Rpb24gSmUodCl7dmFyIG4sZSxyLGksbz10Lmxlbmd0aCx1PW5ldyBBcnJheShvKSxhPW5ldyBBcnJheShvKSxjPTEvMCxzPTEvMCxmPS0oMS8wKSxsPS0oMS8wKTtmb3IoZT0wO2U8bzsrK2UpaXNOYU4ocj0rdGhpcy5feC5jYWxsKG51bGwsbj10W2VdKSl8fGlzTmFOKGk9K3RoaXMuX3kuY2FsbChudWxsLG4pKXx8KHVbZV09cixhW2VdPWkscjxjJiYoYz1yKSxyPmYmJihmPXIpLGk8cyYmKHM9aSksaT5sJiYobD1pKSk7Zm9yKGY8YyYmKGM9dGhpcy5feDAsZj10aGlzLl94MSksbDxzJiYocz10aGlzLl95MCxsPXRoaXMuX3kxKSx0aGlzLmNvdmVyKGMscykuY292ZXIoZixsKSxlPTA7ZTxvOysrZSlHZSh0aGlzLHVbZV0sYVtlXSx0W2VdKTtyZXR1cm4gdGhpc31mdW5jdGlvbiBRZSh0KXtmb3IodmFyIG49MCxlPXQubGVuZ3RoO248ZTsrK24pdGhpcy5yZW1vdmUodFtuXSk7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gS2UodCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gdHIodCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gbnIodCxuLGUpe3ZhciByPW5ldyBlcihudWxsPT1uP0tlOm4sbnVsbD09ZT90cjplLE5hTixOYU4sTmFOLE5hTik7cmV0dXJuIG51bGw9PXQ/cjpyLmFkZEFsbCh0KX1mdW5jdGlvbiBlcih0LG4sZSxyLGksbyl7dGhpcy5feD10LHRoaXMuX3k9bix0aGlzLl94MD1lLHRoaXMuX3kwPXIsdGhpcy5feDE9aSx0aGlzLl95MT1vLHRoaXMuX3Jvb3Q9dm9pZCAwfWZ1bmN0aW9uIHJyKHQpe2Zvcih2YXIgbj17ZGF0YTp0LmRhdGF9LGU9bjt0PXQubmV4dDspZT1lLm5leHQ9e2RhdGE6dC5kYXRhfTtyZXR1cm4gbn1mdW5jdGlvbiBpcih0KXtyZXR1cm4gdC54K3Qudnh9ZnVuY3Rpb24gb3IodCl7cmV0dXJuIHQueSt0LnZ5fWZ1bmN0aW9uIHVyKHQpe3JldHVybiB0LmluZGV4fWZ1bmN0aW9uIGFyKHQsbil7dmFyIGU9dC5nZXQobik7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nOiAiK24pO3JldHVybiBlfWZ1bmN0aW9uIGNyKHQpe3JldHVybiB0Lnh9ZnVuY3Rpb24gc3IodCl7cmV0dXJuIHQueX1mdW5jdGlvbiBmcih0KXtpZighKG49Q3YuZXhlYyh0KSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdDogIit0KTt2YXIgbixlPW5bMV18fCIgIixyPW5bMl18fCI+IixpPW5bM118fCItIixvPW5bNF18fCIiLHU9ISFuWzVdLGE9bls2XSYmK25bNl0sYz0hIW5bN10scz1uWzhdJiYrbls4XS5zbGljZSgxKSxmPW5bOV18fCIiOyJuIj09PWY/KGM9ITAsZj0iZyIpOkF2W2ZdfHwoZj0iIiksKHV8fCIwIj09PWUmJiI9Ij09PXIpJiYodT0hMCxlPSIwIixyPSI9IiksdGhpcy5maWxsPWUsdGhpcy5hbGlnbj1yLHRoaXMuc2lnbj1pLHRoaXMuc3ltYm9sPW8sdGhpcy56ZXJvPXUsdGhpcy53aWR0aD1hLHRoaXMuY29tbWE9Yyx0aGlzLnByZWNpc2lvbj1zLHRoaXMudHlwZT1mfWZ1bmN0aW9uIGxyKHQpe3JldHVybiB0fWZ1bmN0aW9uIGhyKG4pe3JldHVybiBQdj1xdihuKSwNCnQuZm9ybWF0PVB2LmZvcm1hdCx0LmZvcm1hdFByZWZpeD1Qdi5mb3JtYXRQcmVmaXgsUHZ9ZnVuY3Rpb24gcHIoKXt0aGlzLnJlc2V0KCl9ZnVuY3Rpb24gZHIodCxuLGUpe3ZhciByPXQucz1uK2UsaT1yLW4sbz1yLWk7dC50PW4tbysoZS1pKX1mdW5jdGlvbiB2cih0KXtyZXR1cm4gdD4xPzA6dDwtMT9tXzpNYXRoLmFjb3ModCl9ZnVuY3Rpb24gX3IodCl7cmV0dXJuIHQ+MT94Xzp0PC0xPy14XzpNYXRoLmFzaW4odCl9ZnVuY3Rpb24geXIodCl7cmV0dXJuKHQ9Ul8odC8yKSkqdH1mdW5jdGlvbiBncigpe31mdW5jdGlvbiBtcih0LG4pe3QmJk9fLmhhc093blByb3BlcnR5KHQudHlwZSkmJk9fW3QudHlwZV0odCxuKX1mdW5jdGlvbiB4cih0LG4sZSl7dmFyIHIsaT0tMSxvPXQubGVuZ3RoLWU7Zm9yKG4ubGluZVN0YXJ0KCk7KytpPG87KXI9dFtpXSxuLnBvaW50KHJbMF0sclsxXSxyWzJdKTtuLmxpbmVFbmQoKX1mdW5jdGlvbiBicih0LG4pe3ZhciBlPS0xLHI9dC5sZW5ndGg7Zm9yKG4ucG9seWdvblN0YXJ0KCk7KytlPHI7KXhyKHRbZV0sbiwxKTtuLnBvbHlnb25FbmQoKX1mdW5jdGlvbiB3cigpe0JfLnBvaW50PVRyfWZ1bmN0aW9uIE1yKCl7TnIoRnYsSXYpfWZ1bmN0aW9uIFRyKHQsbil7Ql8ucG9pbnQ9TnIsRnY9dCxJdj1uLHQqPVRfLG4qPVRfLFl2PXQsQnY9RV8obj1uLzIrYl8pLGp2PVJfKG4pfWZ1bmN0aW9uIE5yKHQsbil7dCo9VF8sbio9VF8sbj1uLzIrYl87dmFyIGU9dC1ZdixyPWU+PTA/MTotMSxpPXIqZSxvPUVfKG4pLHU9Ul8obiksYT1qdip1LGM9QnYqbythKkVfKGkpLHM9YSpyKlJfKGkpO0lfLmFkZChTXyhzLGMpKSxZdj10LEJ2PW8sanY9dX1mdW5jdGlvbiBrcih0KXtyZXR1cm5bU18odFsxXSx0WzBdKSxfcih0WzJdKV19ZnVuY3Rpb24gU3IodCl7dmFyIG49dFswXSxlPXRbMV0scj1FXyhlKTtyZXR1cm5bcipFXyhuKSxyKlJfKG4pLFJfKGUpXX1mdW5jdGlvbiBFcih0LG4pe3JldHVybiB0WzBdKm5bMF0rdFsxXSpuWzFdK3RbMl0qblsyXX1mdW5jdGlvbiBBcih0LG4pe3JldHVyblt0WzFdKm5bMl0tdFsyXSpuWzFdLHRbMl0qblswXS10WzBdKm5bMl0sdFswXSpuWzFdLXRbMV0qblswXV19ZnVuY3Rpb24gQ3IodCxuKXt0WzBdKz1uWzBdLHRbMV0rPW5bMV0sdFsyXSs9blsyXX1mdW5jdGlvbiB6cih0LG4pe3JldHVyblt0WzBdKm4sdFsxXSpuLHRbMl0qbl19ZnVuY3Rpb24gUHIodCl7dmFyIG49TF8odFswXSp0WzBdK3RbMV0qdFsxXSt0WzJdKnRbMl0pO3RbMF0vPW4sdFsxXS89bix0WzJdLz1ufWZ1bmN0aW9uIFJyKHQsbil7UXYucHVzaChLdj1bSHY9dCxWdj10XSksbjxYdiYmKFh2PW4pLG4+V3YmJihXdj1uKX1mdW5jdGlvbiBxcih0LG4pe3ZhciBlPVNyKFt0KlRfLG4qVF9dKTtpZihKdil7dmFyIHI9QXIoSnYsZSksaT1bclsxXSwtclswXSwwXSxvPUFyKGkscik7UHIobyksbz1rcihvKTt2YXIgdSxhPXQtJHYsYz1hPjA/MTotMSxzPW9bMF0qTV8qYyxmPU5fKGEpPjE4MDtmXihjKiR2PHMmJnM8Yyp0KT8odT1vWzFdKk1fLHU+V3YmJihXdj11KSk6KHM9KHMrMzYwKSUzNjAtMTgwLGZeKGMqJHY8cyYmczxjKnQpPyh1PS1vWzFdKk1fLHU8WHYmJihYdj11KSk6KG48WHYmJihYdj1uKSxuPld2JiYoV3Y9bikpKSxmP3Q8JHY/SXIoSHYsdCk+SXIoSHYsVnYpJiYoVnY9dCk6SXIodCxWdik+SXIoSHYsVnYpJiYoSHY9dCk6VnY+PUh2Pyh0PEh2JiYoSHY9dCksdD5WdiYmKFZ2PXQpKTp0PiR2P0lyKEh2LHQpPklyKEh2LFZ2KSYmKFZ2PXQpOklyKHQsVnYpPklyKEh2LFZ2KSYmKEh2PXQpfWVsc2UgUnIodCxuKTtKdj1lLCR2PXR9ZnVuY3Rpb24gTHIoKXtYXy5wb2ludD1xcn1mdW5jdGlvbiBVcigpe0t2WzBdPUh2LEt2WzFdPVZ2LFhfLnBvaW50PVJyLEp2PW51bGx9ZnVuY3Rpb24gRHIodCxuKXtpZihKdil7dmFyIGU9dC0kdjtIXy5hZGQoTl8oZSk+MTgwP2UrKGU+MD8zNjA6LTM2MCk6ZSl9ZWxzZSBadj10LEd2PW47Ql8ucG9pbnQodCxuKSxxcih0LG4pfWZ1bmN0aW9uIE9yKCl7Ql8ubGluZVN0YXJ0KCl9ZnVuY3Rpb24gRnIoKXtEcihadixHdiksQl8ubGluZUVuZCgpLE5fKEhfKT55XyYmKEh2PS0oVnY9MTgwKSksS3ZbMF09SHYsS3ZbMV09VnYsSnY9bnVsbH1mdW5jdGlvbiBJcih0LG4pe3JldHVybihuLT10KTwwP24rMzYwOm59ZnVuY3Rpb24gWXIodCxuKXtyZXR1cm4gdFswXS1uWzBdfWZ1bmN0aW9uIEJyKHQsbil7cmV0dXJuIHRbMF08PXRbMV0/dFswXTw9biYmbjw9dFsxXTpuPHRbMF18fHRbMV08bn1mdW5jdGlvbiBqcih0LG4pe3QqPVRfLG4qPVRfO3ZhciBlPUVfKG4pO0hyKGUqRV8odCksZSpSXyh0KSxSXyhuKSl9ZnVuY3Rpb24gSHIodCxuLGUpeysrdF8sZV8rPSh0LWVfKS90XyxyXys9KG4tcl8pL3RfLGlfKz0oZS1pXykvdF99ZnVuY3Rpb24gWHIoKXtXXy5wb2ludD1Wcn1mdW5jdGlvbiBWcih0LG4pe3QqPVRfLG4qPVRfO3ZhciBlPUVfKG4pO3BfPWUqRV8odCksZF89ZSpSXyh0KSx2Xz1SXyhuKSxXXy5wb2ludD1XcixIcihwXyxkXyx2Xyl9ZnVuY3Rpb24gV3IodCxuKXt0Kj1UXyxuKj1UXzt2YXIgZT1FXyhuKSxyPWUqRV8odCksaT1lKlJfKHQpLG89Ul8obiksdT1TXyhMXygodT1kXypvLXZfKmkpKnUrKHU9dl8qci1wXypvKSp1Kyh1PXBfKmktZF8qcikqdSkscF8qcitkXyppK3ZfKm8pO25fKz11LG9fKz11KihwXysocF89cikpLHVfKz11KihkXysoZF89aSkpLGFfKz11Kih2Xysodl89bykpLEhyKHBfLGRfLHZfKX1mdW5jdGlvbiAkcigpe1dfLnBvaW50PWpyfWZ1bmN0aW9uIFpyKCl7V18ucG9pbnQ9SnJ9ZnVuY3Rpb24gR3IoKXtRcihsXyxoXyksV18ucG9pbnQ9anJ9ZnVuY3Rpb24gSnIodCxuKXtsXz10LGhfPW4sdCo9VF8sbio9VF8sV18ucG9pbnQ9UXI7dmFyIGU9RV8obik7cF89ZSpFXyh0KSxkXz1lKlJfKHQpLHZfPVJfKG4pLEhyKHBfLGRfLHZfKX1mdW5jdGlvbiBRcih0LG4pe3QqPVRfLG4qPVRfO3ZhciBlPUVfKG4pLHI9ZSpFXyh0KSxpPWUqUl8odCksbz1SXyhuKSx1PWRfKm8tdl8qaSxhPXZfKnItcF8qbyxjPXBfKmktZF8qcixzPUxfKHUqdSthKmErYypjKSxmPXBfKnIrZF8qaSt2XypvLGw9cyYmLXZyKGYpL3MsaD1TXyhzLGYpO2NfKz1sKnUsc18rPWwqYSxmXys9bCpjLG5fKz1oLG9fKz1oKihwXysocF89cikpLHVfKz1oKihkXysoZF89aSkpLGFfKz1oKih2Xysodl89bykpLEhyKHBfLGRfLHZfKX1mdW5jdGlvbiBLcih0LG4pe3JldHVyblt0Pm1fP3Qtd186dDwtbV8/dCt3Xzp0LG5dfWZ1bmN0aW9uIHRpKHQsbixlKXtyZXR1cm4odCU9d18pP258fGU/R18oZWkodCkscmkobixlKSk6ZWkodCk6bnx8ZT9yaShuLGUpOktyfWZ1bmN0aW9uIG5pKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3JldHVybiBuKz10LFtuPm1fP24td186bjwtbV8/bit3XzpuLGVdfX1mdW5jdGlvbiBlaSh0KXt2YXIgbj1uaSh0KTtyZXR1cm4gbi5pbnZlcnQ9bmkoLXQpLG59ZnVuY3Rpb24gcmkodCxuKXtmdW5jdGlvbiBlKHQsbil7dmFyIGU9RV8obiksYT1FXyh0KSplLGM9Ul8odCkqZSxzPVJfKG4pLGY9cypyK2EqaTtyZXR1cm5bU18oYypvLWYqdSxhKnItcyppKSxfcihmKm8rYyp1KV19dmFyIHI9RV8odCksaT1SXyh0KSxvPUVfKG4pLHU9Ul8obik7cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9RV8obiksYT1FXyh0KSplLGM9Ul8odCkqZSxzPVJfKG4pLGY9cypvLWMqdTtyZXR1cm5bU18oYypvK3MqdSxhKnIrZippKSxfcihmKnItYSppKV19LGV9ZnVuY3Rpb24gaWkodCxuLGUscixpLG8pe2lmKGUpe3ZhciB1PUVfKG4pLGE9Ul8obiksYz1yKmU7bnVsbD09aT8oaT1uK3Iqd18sbz1uLWMvMik6KGk9b2kodSxpKSxvPW9pKHUsbyksKHI+MD9pPG86aT5vKSYmKGkrPXIqd18pKTtmb3IodmFyIHMsZj1pO3I+MD9mPm86ZjxvO2YtPWMpcz1rcihbdSwtYSpFXyhmKSwtYSpSXyhmKV0pLHQucG9pbnQoc1swXSxzWzFdKX19ZnVuY3Rpb24gb2kodCxuKXtuPVNyKG4pLG5bMF0tPXQsUHIobik7dmFyIGU9dnIoLW5bMV0pO3JldHVybigoLW5bMl08MD8tZTplKSt3Xy15Xykld199ZnVuY3Rpb24gdWkodCxuLGUscil7dGhpcy54PXQsdGhpcy56PW4sdGhpcy5vPWUsdGhpcy5lPXIsdGhpcy52PSExLHRoaXMubj10aGlzLnA9bnVsbH1mdW5jdGlvbiBhaSh0KXtpZihuPXQubGVuZ3RoKXtmb3IodmFyIG4sZSxyPTAsaT10WzBdOysrcjxuOylpLm49ZT10W3JdLGUucD1pLGk9ZTtpLm49ZT10WzBdLGUucD1pfX1mdW5jdGlvbiBjaSh0LG4sZSxyKXtmdW5jdGlvbiBpKGksbyl7cmV0dXJuIHQ8PWkmJmk8PWUmJm48PW8mJm88PXJ9ZnVuY3Rpb24gbyhpLG8sYSxzKXt2YXIgZj0wLGw9MDtpZihudWxsPT1pfHwoZj11KGksYSkpIT09KGw9dShvLGEpKXx8YyhpLG8pPDBeYT4wKXtkbyBzLnBvaW50KDA9PT1mfHwzPT09Zj90OmUsZj4xP3I6bik7d2hpbGUoKGY9KGYrYSs0KSU0KSE9PWwpfWVsc2Ugcy5wb2ludChvWzBdLG9bMV0pfWZ1bmN0aW9uIHUocixpKXtyZXR1cm4gTl8oclswXS10KTx5Xz9pPjA/MDozOk5fKHJbMF0tZSk8eV8/aT4wPzI6MTpOXyhyWzFdLW4pPHlfP2k+MD8xOjA6aT4wPzM6Mn1mdW5jdGlvbiBhKHQsbil7cmV0dXJuIGModC54LG4ueCl9ZnVuY3Rpb24gYyh0LG4pe3ZhciBlPXUodCwxKSxyPXUobiwxKTtyZXR1cm4gZSE9PXI/ZS1yOjA9PT1lP25bMV0tdFsxXToxPT09ZT90WzBdLW5bMF06Mj09PWU/dFsxXS1uWzFdOm5bMF0tdFswXX1yZXR1cm4gZnVuY3Rpb24odSl7ZnVuY3Rpb24gYyh0LG4pe2kodCxuKSYmay5wb2ludCh0LG4pfWZ1bmN0aW9uIHMoKXtmb3IodmFyIG49MCxlPTAsaT1fLmxlbmd0aDtlPGk7KytlKWZvcih2YXIgbyx1LGE9X1tlXSxjPTEscz1hLmxlbmd0aCxmPWFbMF0sbD1mWzBdLGg9ZlsxXTtjPHM7KytjKW89bCx1PWgsZj1hW2NdLGw9ZlswXSxoPWZbMV0sdTw9cj9oPnImJihsLW8pKihyLXUpPihoLXUpKih0LW8pJiYrK246aDw9ciYmKGwtbykqKHItdSk8KGgtdSkqKHQtbykmJi0tbjtyZXR1cm4gbn1mdW5jdGlvbiBmKCl7az1TLHY9W10sXz1bXSxOPSEwfWZ1bmN0aW9uIGwoKXt2YXIgdD1zKCksbj1OJiZ0LGU9KHY9S3ModikpLmxlbmd0aDsobnx8ZSkmJih1LnBvbHlnb25TdGFydCgpLG4mJih1LmxpbmVTdGFydCgpLG8obnVsbCxudWxsLDEsdSksdS5saW5lRW5kKCkpLGUmJnB5KHYsYSx0LG8sdSksdS5wb2x5Z29uRW5kKCkpLGs9dSx2PV89eT1udWxsfWZ1bmN0aW9uIGgoKXtFLnBvaW50PWQsXyYmXy5wdXNoKHk9W10pLFQ9ITAsTT0hMSxiPXc9TmFOfWZ1bmN0aW9uIHAoKXt2JiYoZChnLG0pLHgmJk0mJlMucmVqb2luKCksdi5wdXNoKFMucmVzdWx0KCkpKSxFLnBvaW50PWMsTSYmay5saW5lRW5kKCl9ZnVuY3Rpb24gZChvLHUpe3ZhciBhPWkobyx1KTtpZihfJiZ5LnB1c2goW28sdV0pLFQpZz1vLG09dSx4PWEsVD0hMSxhJiYoay5saW5lU3RhcnQoKSxrLnBvaW50KG8sdSkpO2Vsc2UgaWYoYSYmTSlrLnBvaW50KG8sdSk7ZWxzZXt2YXIgYz1bYj1NYXRoLm1heCh2eSxNYXRoLm1pbihkeSxiKSksdz1NYXRoLm1heCh2eSxNYXRoLm1pbihkeSx3KSldLHM9W289TWF0aC5tYXgodnksTWF0aC5taW4oZHksbykpLHU9TWF0aC5tYXgodnksTWF0aC5taW4oZHksdSkpXTtseShjLHMsdCxuLGUscik/KE18fChrLmxpbmVTdGFydCgpLGsucG9pbnQoY1swXSxjWzFdKSksay5wb2ludChzWzBdLHNbMV0pLGF8fGsubGluZUVuZCgpLE49ITEpOmEmJihrLmxpbmVTdGFydCgpLGsucG9pbnQobyx1KSxOPSExKX1iPW8sdz11LE09YX12YXIgdixfLHksZyxtLHgsYix3LE0sVCxOLGs9dSxTPWZ5KCksRT17cG9pbnQ6YyxsaW5lU3RhcnQ6aCxsaW5lRW5kOnAscG9seWdvblN0YXJ0OmYscG9seWdvbkVuZDpsfTtyZXR1cm4gRX19ZnVuY3Rpb24gc2koKXtneS5wb2ludD1saSxneS5saW5lRW5kPWZpfWZ1bmN0aW9uIGZpKCl7Z3kucG9pbnQ9Z3kubGluZUVuZD1ncn1mdW5jdGlvbiBsaSh0LG4pe3QqPVRfLG4qPVRfLEpfPXQsUV89Ul8obiksS189RV8obiksZ3kucG9pbnQ9aGl9ZnVuY3Rpb24gaGkodCxuKXt0Kj1UXyxuKj1UXzt2YXIgZT1SXyhuKSxyPUVfKG4pLGk9Tl8odC1KXyksbz1FXyhpKSx1PVJfKGkpLGE9cip1LGM9S18qZS1RXypyKm8scz1RXyplK0tfKnIqbzt5eS5hZGQoU18oTF8oYSphK2MqYykscykpLEpfPXQsUV89ZSxLXz1yfWZ1bmN0aW9uIHBpKHQsbixlKXt2YXIgcj1Jcyh0LG4teV8sZSkuY29uY2F0KG4pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gci5tYXAoZnVuY3Rpb24obil7cmV0dXJuW3Qsbl19KX19ZnVuY3Rpb24gZGkodCxuLGUpe3ZhciByPUlzKHQsbi15XyxlKS5jb25jYXQobik7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiByLm1hcChmdW5jdGlvbihuKXtyZXR1cm5bbix0XX0pfX1mdW5jdGlvbiB2aSgpe2Z1bmN0aW9uIHQoKXtyZXR1cm57dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczpuKCl9fWZ1bmN0aW9uIG4oKXtyZXR1cm4gSXMoQV8oby9fKSpfLGksXykubWFwKGgpLmNvbmNhdChJcyhBXyhzL3kpKnksYyx5KS5tYXAocCkpLmNvbmNhdChJcyhBXyhyL2QpKmQsZSxkKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIE5fKHQlXyk+eV99KS5tYXAoZikpLmNvbmNhdChJcyhBXyhhL3YpKnYsdSx2KS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIE5fKHQleSk+eV99KS5tYXAobCkpfXZhciBlLHIsaSxvLHUsYSxjLHMsZixsLGgscCxkPTEwLHY9ZCxfPTkwLHk9MzYwLGc9Mi41O3JldHVybiB0LmxpbmVzPWZ1bmN0aW9uKCl7cmV0dXJuIG4oKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJue3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnR9fSl9LHQub3V0bGluZT1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbaChvKS5jb25jYXQocChjKS5zbGljZSgxKSxoKGkpLnJldmVyc2UoKS5zbGljZSgxKSxwKHMpLnJldmVyc2UoKS5zbGljZSgxKSldfX0sdC5leHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dC5leHRlbnRNYWpvcihuKS5leHRlbnRNaW5vcihuKTp0LmV4dGVudE1pbm9yKCl9LHQuZXh0ZW50TWFqb3I9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K25bMF1bMF0saT0rblsxXVswXSxzPStuWzBdWzFdLGM9K25bMV1bMV0sbz5pJiYobj1vLG89aSxpPW4pLHM+YyYmKG49cyxzPWMsYz1uKSx0LnByZWNpc2lvbihnKSk6W1tvLHNdLFtpLGNdXX0sdC5leHRlbnRNaW5vcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rblswXVswXSxlPStuWzFdWzBdLGE9K25bMF1bMV0sdT0rblsxXVsxXSxyPmUmJihuPXIscj1lLGU9biksYT51JiYobj1hLGE9dSx1PW4pLHQucHJlY2lzaW9uKGcpKTpbW3IsYV0sW2UsdV1dfSx0LnN0ZXA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dC5zdGVwTWFqb3Iobikuc3RlcE1pbm9yKG4pOnQuc3RlcE1pbm9yKCl9LHQuc3RlcE1ham9yPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhfPStuWzBdLHk9K25bMV0sdCk6W18seV19LHQuc3RlcE1pbm9yPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPStuWzBdLHY9K25bMV0sdCk6W2Qsdl19LHQucHJlY2lzaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPStuLGY9cGkoYSx1LDkwKSxsPWRpKHIsZSxnKSxoPXBpKHMsYyw5MCkscD1kaShvLGksZyksdCk6Z30sdC5leHRlbnRNYWpvcihbWy0xODAsLTkwK3lfXSxbMTgwLDkwLXlfXV0pLmV4dGVudE1pbm9yKFtbLTE4MCwtODAteV9dLFsxODAsODAreV9dXSl9ZnVuY3Rpb24gX2koKXtyZXR1cm4gdmkoKSgpfWZ1bmN0aW9uIHlpKCl7U3kucG9pbnQ9Z2l9ZnVuY3Rpb24gZ2kodCxuKXtTeS5wb2ludD1taSx0eT1leT10LG55PXJ5PW59ZnVuY3Rpb24gbWkodCxuKXtreS5hZGQocnkqdC1leSpuKSxleT10LHJ5PW59ZnVuY3Rpb24geGkoKXttaSh0eSxueSl9ZnVuY3Rpb24gYmkodCxuKXt0PEV5JiYoRXk9dCksdD5DeSYmKEN5PXQpLG48QXkmJihBeT1uKSxuPnp5JiYoenk9bil9ZnVuY3Rpb24gd2kodCxuKXtSeSs9dCxxeSs9biwrK0x5fWZ1bmN0aW9uIE1pKCl7QnkucG9pbnQ9VGl9ZnVuY3Rpb24gVGkodCxuKXtCeS5wb2ludD1OaSx3aSh1eT10LGF5PW4pfWZ1bmN0aW9uIE5pKHQsbil7dmFyIGU9dC11eSxyPW4tYXksaT1MXyhlKmUrcipyKTtVeSs9aSoodXkrdCkvMixEeSs9aSooYXkrbikvMixPeSs9aSx3aSh1eT10LGF5PW4pfWZ1bmN0aW9uIGtpKCl7QnkucG9pbnQ9d2l9ZnVuY3Rpb24gU2koKXtCeS5wb2ludD1BaX1mdW5jdGlvbiBFaSgpe0NpKGl5LG95KX1mdW5jdGlvbiBBaSh0LG4pe0J5LnBvaW50PUNpLHdpKGl5PXV5PXQsb3k9YXk9bil9ZnVuY3Rpb24gQ2kodCxuKXt2YXIgZT10LXV5LHI9bi1heSxpPUxfKGUqZStyKnIpO1V5Kz1pKih1eSt0KS8yLER5Kz1pKihheStuKS8yLE95Kz1pLGk9YXkqdC11eSpuLEZ5Kz1pKih1eSt0KSxJeSs9aSooYXkrbiksWXkrPTMqaSx3aSh1eT10LGF5PW4pfWZ1bmN0aW9uIHppKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBQaSgpe3RoaXMuX3N0cmluZz1bXX1mdW5jdGlvbiBSaSh0KXtyZXR1cm4ibTAsIit0KyJhIit0KyIsIit0KyIgMCAxLDEgMCwiKy0yKnQrImEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrMip0KyJ6In1mdW5jdGlvbiBxaSh0KXtyZXR1cm4gdC5sZW5ndGg+MX1mdW5jdGlvbiBMaSh0LG4pe3JldHVybigodD10LngpWzBdPDA/dFsxXS14Xy15Xzp4Xy10WzFdKS0oKG49bi54KVswXTwwP25bMV0teF8teV86eF8tblsxXSl9ZnVuY3Rpb24gVWkodCl7dmFyIG4sZT1OYU4scj1OYU4saT1OYU47cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe3QubGluZVN0YXJ0KCksbj0xfSxwb2ludDpmdW5jdGlvbihvLHUpe3ZhciBhPW8+MD9tXzotbV8sYz1OXyhvLWUpO05fKGMtbV8pPHlfPyh0LnBvaW50KGUscj0ocit1KS8yPjA/eF86LXhfKSx0LnBvaW50KGksciksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KGEsciksdC5wb2ludChvLHIpLG49MCk6aSE9PWEmJmM+PW1fJiYoTl8oZS1pKTx5XyYmKGUtPWkqeV8pLE5fKG8tYSk8eV8mJihvLT1hKnlfKSxyPURpKGUscixvLHUpLHQucG9pbnQoaSxyKSx0LmxpbmVFbmQoKSx0LmxpbmVTdGFydCgpLHQucG9pbnQoYSxyKSxuPTApLHQucG9pbnQoZT1vLHI9dSksaT1hfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dC5saW5lRW5kKCksZT1yPU5hTn0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gMi1ufX19ZnVuY3Rpb24gRGkodCxuLGUscil7dmFyIGksbyx1PVJfKHQtZSk7cmV0dXJuIE5fKHUpPnlfP2tfKChSXyhuKSoobz1FXyhyKSkqUl8oZSktUl8ocikqKGk9RV8obikpKlJfKHQpKS8oaSpvKnUpKToobityKS8yfWZ1bmN0aW9uIE9pKHQsbixlLHIpe3ZhciBpO2lmKG51bGw9PXQpaT1lKnhfLHIucG9pbnQoLW1fLGkpLHIucG9pbnQoMCxpKSxyLnBvaW50KG1fLGkpLHIucG9pbnQobV8sMCksci5wb2ludChtXywtaSksci5wb2ludCgwLC1pKSxyLnBvaW50KC1tXywtaSksci5wb2ludCgtbV8sMCksci5wb2ludCgtbV8saSk7ZWxzZSBpZihOXyh0WzBdLW5bMF0pPnlfKXt2YXIgbz10WzBdPG5bMF0/bV86LW1fO2k9ZSpvLzIsci5wb2ludCgtbyxpKSxyLnBvaW50KDAsaSksci5wb2ludChvLGkpfWVsc2Ugci5wb2ludChuWzBdLG5bMV0pfWZ1bmN0aW9uIEZpKHQpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1uZXcgSWk7Zm9yKHZhciByIGluIHQpZVtyXT10W3JdO3JldHVybiBlLnN0cmVhbT1uLGV9fWZ1bmN0aW9uIElpKCl7fWZ1bmN0aW9uIFlpKHQsbixlKXt2YXIgcj1uWzFdWzBdLW5bMF1bMF0saT1uWzFdWzFdLW5bMF1bMV0sbz10LmNsaXBFeHRlbnQmJnQuY2xpcEV4dGVudCgpO3Quc2NhbGUoMTUwKS50cmFuc2xhdGUoWzAsMF0pLG51bGwhPW8mJnQuY2xpcEV4dGVudChudWxsKSxGXyhlLHQuc3RyZWFtKFB5KSk7dmFyIHU9UHkucmVzdWx0KCksYT1NYXRoLm1pbihyLyh1WzFdWzBdLXVbMF1bMF0pLGkvKHVbMV1bMV0tdVswXVsxXSkpLGM9K25bMF1bMF0rKHItYSoodVsxXVswXSt1WzBdWzBdKSkvMixzPStuWzBdWzFdKyhpLWEqKHVbMV1bMV0rdVswXVsxXSkpLzI7cmV0dXJuIG51bGwhPW8mJnQuY2xpcEV4dGVudChvKSx0LnNjYWxlKDE1MCphKS50cmFuc2xhdGUoW2Msc10pfWZ1bmN0aW9uIEJpKHQsbixlKXtyZXR1cm4gWWkodCxbWzAsMF0sbl0sZSl9ZnVuY3Rpb24gamkodCl7cmV0dXJuIEZpKHtwb2ludDpmdW5jdGlvbihuLGUpe249dChuLGUpLHRoaXMuc3RyZWFtLnBvaW50KG5bMF0sblsxXSl9fSl9ZnVuY3Rpb24gSGkodCxuKXtmdW5jdGlvbiBlKHIsaSxvLHUsYSxjLHMsZixsLGgscCxkLHYsXyl7dmFyIHk9cy1yLGc9Zi1pLG09eSp5K2cqZztpZihtPjQqbiYmdi0tKXt2YXIgeD11K2gsYj1hK3Asdz1jK2QsTT1MXyh4KngrYipiK3cqdyksVD1fcih3Lz1NKSxOPU5fKE5fKHcpLTEpPHlffHxOXyhvLWwpPHlfPyhvK2wpLzI6U18oYix4KSxrPXQoTixUKSxTPWtbMF0sRT1rWzFdLEE9Uy1yLEM9RS1pLHo9ZypBLXkqQzsoeip6L20+bnx8Tl8oKHkqQStnKkMpL20tLjUpPi4zfHx1KmgrYSpwK2MqZDxKeSkmJihlKHIsaSxvLHUsYSxjLFMsRSxOLHgvPU0sYi89TSx3LHYsXyksXy5wb2ludChTLEUpLGUoUyxFLE4seCxiLHcscyxmLGwsaCxwLGQsdixfKSl9fXJldHVybiBmdW5jdGlvbihuKXtmdW5jdGlvbiByKGUscil7ZT10KGUsciksbi5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIGkoKXt5PU5hTix3LnBvaW50PW8sbi5saW5lU3RhcnQoKX1mdW5jdGlvbiBvKHIsaSl7dmFyIG89U3IoW3IsaV0pLHU9dChyLGkpO2UoeSxnLF8sbSx4LGIseT11WzBdLGc9dVsxXSxfPXIsbT1vWzBdLHg9b1sxXSxiPW9bMl0sR3ksbiksbi5wb2ludCh5LGcpfWZ1bmN0aW9uIHUoKXt3LnBvaW50PXIsbi5saW5lRW5kKCl9ZnVuY3Rpb24gYSgpe2koKSx3LnBvaW50PWMsdy5saW5lRW5kPXN9ZnVuY3Rpb24gYyh0LG4pe28oZj10LG4pLGw9eSxoPWcscD1tLGQ9eCx2PWIsdy5wb2ludD1vfWZ1bmN0aW9uIHMoKXtlKHksZyxfLG0seCxiLGwsaCxmLHAsZCx2LEd5LG4pLHcubGluZUVuZD11LHUoKX12YXIgZixsLGgscCxkLHYsXyx5LGcsbSx4LGIsdz17cG9pbnQ6cixsaW5lU3RhcnQ6aSxsaW5lRW5kOnUscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7bi5wb2x5Z29uU3RhcnQoKSx3LmxpbmVTdGFydD1hfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7bi5wb2x5Z29uRW5kKCksdy5saW5lU3RhcnQ9aX19O3JldHVybiB3fX1mdW5jdGlvbiBYaSh0KXtyZXR1cm4gVmkoZnVuY3Rpb24oKXtyZXR1cm4gdH0pKCl9ZnVuY3Rpb24gVmkodCl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gdD1mKHRbMF0qVF8sdFsxXSpUXyksW3RbMF0qXythLGMtdFsxXSpfXX1mdW5jdGlvbiBlKHQpe3JldHVybiB0PWYuaW52ZXJ0KCh0WzBdLWEpL18sKGMtdFsxXSkvXyksdCYmW3RbMF0qTV8sdFsxXSpNX119ZnVuY3Rpb24gcih0LG4pe3JldHVybiB0PXUodCxuKSxbdFswXSpfK2EsYy10WzFdKl9dfWZ1bmN0aW9uIGkoKXtmPUdfKHM9dGkoYix3LE0pLHUpO3ZhciB0PXUobSx4KTtyZXR1cm4gYT15LXRbMF0qXyxjPWcrdFsxXSpfLG8oKX1mdW5jdGlvbiBvKCl7cmV0dXJuIGQ9dj1udWxsLG59dmFyIHUsYSxjLHMsZixsLGgscCxkLHYsXz0xNTAseT00ODAsZz0yNTAsbT0wLHg9MCxiPTAsdz0wLE09MCxUPW51bGwsTj1XeSxrPW51bGwsUz1UeSxFPS41LEE9UXkocixFKTtyZXR1cm4gbi5zdHJlYW09ZnVuY3Rpb24odCl7cmV0dXJuIGQmJnY9PT10P2Q6ZD1LeShOKHMsQShTKHY9dCkpKSl9LG4uY2xpcEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhOPSt0PyR5KFQ9dCpUXyw2KlRfKTooVD1udWxsLFd5KSxvKCkpOlQqTV99LG4uY2xpcEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oUz1udWxsPT10PyhrPWw9aD1wPW51bGwsVHkpOmNpKGs9K3RbMF1bMF0sbD0rdFswXVsxXSxoPSt0WzFdWzBdLHA9K3RbMV1bMV0pLG8oKSk6bnVsbD09az9udWxsOltbayxsXSxbaCxwXV19LG4uc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KF89K3QsaSgpKTpffSxuLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT0rdFswXSxnPSt0WzFdLGkoKSk6W3ksZ119LG4uY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPXRbMF0lMzYwKlRfLHg9dFsxXSUzNjAqVF8saSgpKTpbbSpNXyx4Kk1fXX0sbi5yb3RhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGI9dFswXSUzNjAqVF8sdz10WzFdJTM2MCpUXyxNPXQubGVuZ3RoPjI/dFsyXSUzNjAqVF86MCxpKCkpOltiKk1fLHcqTV8sTSpNX119LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhBPVF5KHIsRT10KnQpLG8oKSk6TF8oRSl9LG4uZml0RXh0ZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFlpKG4sdCxlKX0sbi5maXRTaXplPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEJpKG4sdCxlKX0sZnVuY3Rpb24oKXtyZXR1cm4gdT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxuLmludmVydD11LmludmVydCYmZSxpKCl9fWZ1bmN0aW9uIFdpKHQpe3ZhciBuPTAsZT1tXy8zLHI9VmkodCksaT1yKG4sZSk7cmV0dXJuIGkucGFyYWxsZWxzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3Iobj10WzBdKlRfLGU9dFsxXSpUXyk6W24qTV8sZSpNX119LGl9ZnVuY3Rpb24gJGkodCl7ZnVuY3Rpb24gbih0LG4pe3JldHVyblt0KmUsUl8obikvZV19dmFyIGU9RV8odCk7cmV0dXJuIG4uaW52ZXJ0PWZ1bmN0aW9uKHQsbil7cmV0dXJuW3QvZSxfcihuKmUpXX0sbn1mdW5jdGlvbiBaaSh0LG4pe2Z1bmN0aW9uIGUodCxuKXt2YXIgZT1MXyhvLTIqaSpSXyhuKSkvaTtyZXR1cm5bZSpSXyh0Kj1pKSx1LWUqRV8odCldfXZhciByPVJfKHQpLGk9KHIrUl8obikpLzI7aWYoTl8oaSk8eV8pcmV0dXJuICRpKHQpO3ZhciBvPTErciooMippLXIpLHU9TF8obykvaTtyZXR1cm4gZS5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZT11LW47cmV0dXJuW1NfKHQsTl8oZSkpL2kqcV8oZSksX3IoKG8tKHQqdCtlKmUpKmkqaSkvKDIqaSkpXX0sZX1mdW5jdGlvbiBHaSh0KXt2YXIgbj10Lmxlbmd0aDtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24oZSxyKXtmb3IodmFyIGk9LTE7KytpPG47KXRbaV0ucG9pbnQoZSxyKX0sc3BoZXJlOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPS0xOysrZTxuOyl0W2VdLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtmb3IodmFyIGU9LTE7KytlPG47KXRbZV0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtmb3IodmFyIGU9LTE7KytlPG47KXRbZV0ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtmb3IodmFyIGU9LTE7KytlPG47KXRbZV0ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtmb3IodmFyIGU9LTE7KytlPG47KXRbZV0ucG9seWdvbkVuZCgpfX19ZnVuY3Rpb24gSmkodCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9RV8obiksaT1FXyhlKSxvPXQocippKTtyZXR1cm5bbyppKlJfKG4pLG8qUl8oZSldfX1mdW5jdGlvbiBRaSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj1MXyhuKm4rZSplKSxpPXQociksbz1SXyhpKSx1PUVfKGkpO3JldHVybltTXyhuKm8scip1KSxfcihyJiZlKm8vcildfX1mdW5jdGlvbiBLaSh0LG4pe3JldHVyblt0LHpfKFVfKCh4XytuKS8yKSldfWZ1bmN0aW9uIHRvKHQpe3ZhciBuLGU9WGkodCkscj1lLnNjYWxlLGk9ZS50cmFuc2xhdGUsbz1lLmNsaXBFeHRlbnQ7cmV0dXJuIGUuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHIodCksbiYmZS5jbGlwRXh0ZW50KG51bGwpLGUpOnIoKX0sZS50cmFuc2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGkodCksbiYmZS5jbGlwRXh0ZW50KG51bGwpLGUpOmkoKX0sZS5jbGlwRXh0ZW50PWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBuP251bGw6bygpO2lmKG49bnVsbD09dCl7dmFyIHU9bV8qcigpLGE9aSgpO3Q9W1thWzBdLXUsYVsxXS11XSxbYVswXSt1LGFbMV0rdV1dfXJldHVybiBvKHQpLGV9LGUuY2xpcEV4dGVudChudWxsKX1mdW5jdGlvbiBubyh0KXtyZXR1cm4gVV8oKHhfK3QpLzIpfWZ1bmN0aW9uIGVvKHQsbil7ZnVuY3Rpb24gZSh0LG4pe28+MD9uPC14Xyt5XyYmKG49LXhfK3lfKTpuPnhfLXlfJiYobj14Xy15Xyk7dmFyIGU9by9QXyhubyhuKSxpKTtyZXR1cm5bZSpSXyhpKnQpLG8tZSpFXyhpKnQpXX12YXIgcj1FXyh0KSxpPXQ9PT1uP1JfKHQpOnpfKHIvRV8obikpL3pfKG5vKG4pL25vKHQpKSxvPXIqUF8obm8odCksaSkvaTtyZXR1cm4gaT8oZS5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZT1vLW4scj1xXyhpKSpMXyh0KnQrZSplKTtyZXR1cm5bU18odCxOXyhlKSkvaSpxXyhlKSwyKmtfKFBfKG8vciwxL2kpKS14X119LGUpOktpfWZ1bmN0aW9uIHJvKHQsbil7cmV0dXJuW3Qsbl19ZnVuY3Rpb24gaW8odCxuKXtmdW5jdGlvbiBlKHQsbil7dmFyIGU9by1uLHI9aSp0O3JldHVybltlKlJfKHIpLG8tZSpFXyhyKV19dmFyIHI9RV8odCksaT10PT09bj9SXyh0KTooci1FXyhuKSkvKG4tdCksbz1yL2krdDtyZXR1cm4gTl8oaSk8eV8/cm86KGUuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9by1uO3JldHVybltTXyh0LE5fKGUpKS9pKnFfKGUpLG8tcV8oaSkqTF8odCp0K2UqZSldfSxlKX1mdW5jdGlvbiBvbyh0LG4pe3ZhciBlPUVfKG4pLHI9RV8odCkqZTtyZXR1cm5bZSpSXyh0KS9yLFJfKG4pL3JdfWZ1bmN0aW9uIHVvKHQsbixlLHIpe3JldHVybiAxPT09dCYmMT09PW4mJjA9PT1lJiYwPT09cj9UeTpGaSh7cG9pbnQ6ZnVuY3Rpb24oaSxvKXt0aGlzLnN0cmVhbS5wb2ludChpKnQrZSxvKm4rcil9fSl9ZnVuY3Rpb24gYW8odCxuKXtyZXR1cm5bRV8obikqUl8odCksUl8obildfWZ1bmN0aW9uIGNvKHQsbil7dmFyIGU9RV8obikscj0xK0VfKHQpKmU7cmV0dXJuW2UqUl8odCkvcixSXyhuKS9yXX1mdW5jdGlvbiBzbyh0LG4pe3JldHVyblt6XyhVXygoeF8rbikvMikpLC10XX1mdW5jdGlvbiBmbyh0LG4pe3JldHVybiB0LnBhcmVudD09PW4ucGFyZW50PzE6Mn1mdW5jdGlvbiBsbyh0KXtyZXR1cm4gdC5yZWR1Y2UoaG8sMCkvdC5sZW5ndGh9ZnVuY3Rpb24gaG8odCxuKXtyZXR1cm4gdCtuLnh9ZnVuY3Rpb24gcG8odCl7cmV0dXJuIDErdC5yZWR1Y2Uodm8sMCl9ZnVuY3Rpb24gdm8odCxuKXtyZXR1cm4gTWF0aC5tYXgodCxuLnkpfWZ1bmN0aW9uIF9vKHQpe2Zvcih2YXIgbjtuPXQuY2hpbGRyZW47KXQ9blswXTtyZXR1cm4gdH1mdW5jdGlvbiB5byh0KXtmb3IodmFyIG47bj10LmNoaWxkcmVuOyl0PW5bbi5sZW5ndGgtMV07cmV0dXJuIHR9ZnVuY3Rpb24gZ28odCl7dmFyIG49MCxlPXQuY2hpbGRyZW4scj1lJiZlLmxlbmd0aDtpZihyKWZvcig7LS1yPj0wOyluKz1lW3JdLnZhbHVlO2Vsc2Ugbj0xO3QudmFsdWU9bn1mdW5jdGlvbiBtbyh0LG4pe2lmKHQ9PT1uKXJldHVybiB0O3ZhciBlPXQuYW5jZXN0b3JzKCkscj1uLmFuY2VzdG9ycygpLGk9bnVsbDtmb3IodD1lLnBvcCgpLG49ci5wb3AoKTt0PT09bjspaT10LHQ9ZS5wb3AoKSxuPXIucG9wKCk7cmV0dXJuIGl9ZnVuY3Rpb24geG8odCxuKXt2YXIgZSxyLGksbyx1LGE9bmV3IE5vKHQpLGM9K3QudmFsdWUmJihhLnZhbHVlPXQudmFsdWUpLHM9W2FdO2ZvcihudWxsPT1uJiYobj13byk7ZT1zLnBvcCgpOylpZihjJiYoZS52YWx1ZT0rZS5kYXRhLnZhbHVlKSwoaT1uKGUuZGF0YSkpJiYodT1pLmxlbmd0aCkpZm9yKGUuY2hpbGRyZW49bmV3IEFycmF5KHUpLG89dS0xO28+PTA7LS1vKXMucHVzaChyPWUuY2hpbGRyZW5bb109bmV3IE5vKGlbb10pKSxyLnBhcmVudD1lLHIuZGVwdGg9ZS5kZXB0aCsxO3JldHVybiBhLmVhY2hCZWZvcmUoVG8pfWZ1bmN0aW9uIGJvKCl7cmV0dXJuIHhvKHRoaXMpLmVhY2hCZWZvcmUoTW8pfWZ1bmN0aW9uIHdvKHQpe3JldHVybiB0LmNoaWxkcmVufWZ1bmN0aW9uIE1vKHQpe3QuZGF0YT10LmRhdGEuZGF0YX1mdW5jdGlvbiBUbyh0KXt2YXIgbj0wO2RvIHQuaGVpZ2h0PW47d2hpbGUoKHQ9dC5wYXJlbnQpJiZ0LmhlaWdodDwrK24pfWZ1bmN0aW9uIE5vKHQpe3RoaXMuZGF0YT10LHRoaXMuZGVwdGg9dGhpcy5oZWlnaHQ9MCx0aGlzLnBhcmVudD1udWxsfWZ1bmN0aW9uIGtvKHQpe3RoaXMuXz10LHRoaXMubmV4dD1udWxsfWZ1bmN0aW9uIFNvKHQsbil7dmFyIGU9bi54LXQueCxyPW4ueS10LnksaT10LnItbi5yO3JldHVybiBpKmkrMWUtNj5lKmUrcipyfWZ1bmN0aW9uIEVvKHQsbil7dmFyIGUscixpLG89bnVsbCx1PXQuaGVhZDtzd2l0Y2gobi5sZW5ndGgpe2Nhc2UgMTplPUFvKG5bMF0pO2JyZWFrO2Nhc2UgMjplPUNvKG5bMF0sblsxXSk7YnJlYWs7Y2FzZSAzOmU9em8oblswXSxuWzFdLG5bMl0pfWZvcig7dTspaT11Ll8scj11Lm5leHQsZSYmU28oZSxpKT9vPXU6KG8/KHQudGFpbD1vLG8ubmV4dD1udWxsKTp0LmhlYWQ9dC50YWlsPW51bGwsbi5wdXNoKGkpLGU9RW8odCxuKSxuLnBvcCgpLHQuaGVhZD8odS5uZXh0PXQuaGVhZCx0LmhlYWQ9dSk6KHUubmV4dD1udWxsLHQuaGVhZD10LnRhaWw9dSksbz10LnRhaWwsby5uZXh0PXIpLHU9cjtyZXR1cm4gdC50YWlsPW8sZX1mdW5jdGlvbiBBbyh0KXtyZXR1cm57eDp0LngseTp0Lnkscjp0LnJ9fWZ1bmN0aW9uIENvKHQsbil7dmFyIGU9dC54LHI9dC55LGk9dC5yLG89bi54LHU9bi55LGE9bi5yLGM9by1lLHM9dS1yLGY9YS1pLGw9TWF0aC5zcXJ0KGMqYytzKnMpO3JldHVybnt4OihlK28rYy9sKmYpLzIseToocit1K3MvbCpmKS8yLHI6KGwraSthKS8yfX1mdW5jdGlvbiB6byh0LG4sZSl7dmFyIHI9dC54LGk9dC55LG89dC5yLHU9bi54LGE9bi55LGM9bi5yLHM9ZS54LGY9ZS55LGw9ZS5yLGg9Miooci11KSxwPTIqKGktYSksZD0yKihjLW8pLHY9cipyK2kqaS1vKm8tdSp1LWEqYStjKmMsXz0yKihyLXMpLHk9MiooaS1mKSxnPTIqKGwtbyksbT1yKnIraSppLW8qby1zKnMtZipmK2wqbCx4PV8qcC1oKnksYj0ocCptLXkqdikveC1yLHc9KHkqZC1wKmcpL3gsTT0oXyp2LWgqbSkveC1pLFQ9KGgqZy1fKmQpL3gsTj13KncrVCpULTEsaz0yKihiKncrTSpUK28pLFM9YipiK00qTS1vKm8sRT0oLWstTWF0aC5zcXJ0KGsqay00Kk4qUykpLygyKk4pO3JldHVybnt4OmIrdypFK3IseTpNK1QqRStpLHI6RX19ZnVuY3Rpb24gUG8odCxuLGUpe3ZhciByPXQueCxpPXQueSxvPW4ucitlLnIsdT10LnIrZS5yLGE9bi54LXIsYz1uLnktaSxzPWEqYStjKmM7aWYocyl7dmFyIGY9LjUrKCh1Kj11KS0obyo9bykpLygyKnMpLGw9TWF0aC5zcXJ0KE1hdGgubWF4KDAsMipvKih1K3MpLSh1LT1zKSp1LW8qbykpLygyKnMpO2UueD1yK2YqYStsKmMsZS55PWkrZipjLWwqYX1lbHNlIGUueD1yK3UsZS55PWl9ZnVuY3Rpb24gUm8odCxuKXt2YXIgZT1uLngtdC54LHI9bi55LXQueSxpPXQucituLnI7cmV0dXJuIGkqaS0xZS02PmUqZStyKnJ9ZnVuY3Rpb24gcW8odCxuKXtmb3IodmFyIGU9dC5fLnI7dCE9PW47KWUrPTIqKHQ9dC5uZXh0KS5fLnI7cmV0dXJuIGUtbi5fLnJ9ZnVuY3Rpb24gTG8odCxuLGUpe3ZhciByPXQueC1uLGk9dC55LWU7cmV0dXJuIHIqcitpKml9ZnVuY3Rpb24gVW8odCl7dGhpcy5fPXQsdGhpcy5uZXh0PW51bGwsdGhpcy5wcmV2aW91cz1udWxsfWZ1bmN0aW9uIERvKHQpe2lmKCEoaT10Lmxlbmd0aCkpcmV0dXJuIDA7dmFyIG4sZSxyLGk7aWYobj10WzBdLG4ueD0wLG4ueT0wLCEoaT4xKSlyZXR1cm4gbi5yO2lmKGU9dFsxXSxuLng9LWUucixlLng9bi5yLGUueT0wLCEoaT4yKSlyZXR1cm4gbi5yK2UucjtQbyhlLG4scj10WzJdKTt2YXIgbyx1LGEsYyxzLGYsbCxoPW4ucipuLnIscD1lLnIqZS5yLGQ9ci5yKnIucix2PWgrcCtkLF89aCpuLngrcCplLngrZCpyLngseT1oKm4ueStwKmUueStkKnIueTtuPW5ldyBVbyhuKSxlPW5ldyBVbyhlKSxyPW5ldyBVbyhyKSxuLm5leHQ9ci5wcmV2aW91cz1lLGUubmV4dD1uLnByZXZpb3VzPXIsci5uZXh0PWUucHJldmlvdXM9bjt0OmZvcihhPTM7YTxpOysrYSl7UG8obi5fLGUuXyxyPXRbYV0pLHI9bmV3IFVvKHIpLGM9ZS5uZXh0LHM9bi5wcmV2aW91cyxmPWUuXy5yLGw9bi5fLnI7ZG8gaWYoZjw9bCl7aWYoUm8oYy5fLHIuXykpe2Yrbi5fLnIrZS5fLnI+cW8oYyxlKT9uPWM6ZT1jLG4ubmV4dD1lLGUucHJldmlvdXM9biwtLWE7Y29udGludWUgdH1mKz1jLl8ucixjPWMubmV4dH1lbHNle2lmKFJvKHMuXyxyLl8pKXtxbyhuLHMpPmwrbi5fLnIrZS5fLnI/bj1zOmU9cyxuLm5leHQ9ZSxlLnByZXZpb3VzPW4sLS1hO2NvbnRpbnVlIHR9bCs9cy5fLnIscz1zLnByZXZpb3VzfXdoaWxlKGMhPT1zLm5leHQpO2ZvcihyLnByZXZpb3VzPW4sci5uZXh0PWUsbi5uZXh0PWUucHJldmlvdXM9ZT1yLHYrPWQ9ci5fLnIqci5fLnIsXys9ZCpyLl8ueCx5Kz1kKnIuXy55LGg9TG8obi5fLG89Xy92LHU9eS92KTsocj1yLm5leHQpIT09ZTspKGQ9TG8oci5fLG8sdSkpPGgmJihuPXIsaD1kKTtlPW4ubmV4dH1mb3Iobj1bZS5fXSxyPWU7KHI9ci5uZXh0KSE9PWU7KW4ucHVzaChyLl8pO2ZvcihyPUFnKG4pLGE9MDthPGk7KythKW49dFthXSxuLngtPXIueCxuLnktPXIueTtyZXR1cm4gci5yfWZ1bmN0aW9uIE9vKHQpe3JldHVybiBudWxsPT10P251bGw6Rm8odCl9ZnVuY3Rpb24gRm8odCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yO3JldHVybiB0fWZ1bmN0aW9uIElvKCl7cmV0dXJuIDB9ZnVuY3Rpb24gWW8odCl7cmV0dXJuIE1hdGguc3FydCh0LnZhbHVlKX1mdW5jdGlvbiBCbyh0KXtyZXR1cm4gZnVuY3Rpb24obil7bi5jaGlsZHJlbnx8KG4ucj1NYXRoLm1heCgwLCt0KG4pfHwwKSl9fWZ1bmN0aW9uIGpvKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKHI9ZS5jaGlsZHJlbil7dmFyIHIsaSxvLHU9ci5sZW5ndGgsYT10KGUpKm58fDA7aWYoYSlmb3IoaT0wO2k8dTsrK2kpcltpXS5yKz1hO2lmKG89RG8ociksYSlmb3IoaT0wO2k8dTsrK2kpcltpXS5yLT1hO2Uucj1vK2F9fX1mdW5jdGlvbiBIbyh0KXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9bi5wYXJlbnQ7bi5yKj10LGUmJihuLng9ZS54K3Qqbi54LG4ueT1lLnkrdCpuLnkpfX1mdW5jdGlvbiBYbyh0KXtyZXR1cm4gdC5pZH1mdW5jdGlvbiBWbyh0KXtyZXR1cm4gdC5wYXJlbnRJZH1mdW5jdGlvbiBXbyh0LG4pe3JldHVybiB0LnBhcmVudD09PW4ucGFyZW50PzE6Mn1mdW5jdGlvbiAkbyh0KXt2YXIgbj10LmNoaWxkcmVuO3JldHVybiBuP25bMF06dC50fWZ1bmN0aW9uIFpvKHQpe3ZhciBuPXQuY2hpbGRyZW47cmV0dXJuIG4/bltuLmxlbmd0aC0xXTp0LnR9ZnVuY3Rpb24gR28odCxuLGUpe3ZhciByPWUvKG4uaS10LmkpO24uYy09cixuLnMrPWUsdC5jKz1yLG4ueis9ZSxuLm0rPWV9ZnVuY3Rpb24gSm8odCl7Zm9yKHZhciBuLGU9MCxyPTAsaT10LmNoaWxkcmVuLG89aS5sZW5ndGg7LS1vPj0wOyluPWlbb10sbi56Kz1lLG4ubSs9ZSxlKz1uLnMrKHIrPW4uYyl9ZnVuY3Rpb24gUW8odCxuLGUpe3JldHVybiB0LmEucGFyZW50PT09bi5wYXJlbnQ/dC5hOmV9ZnVuY3Rpb24gS28odCxuKXt0aGlzLl89dCx0aGlzLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49bnVsbCx0aGlzLkE9bnVsbCx0aGlzLmE9dGhpcyx0aGlzLno9MCx0aGlzLm09MCx0aGlzLmM9MCx0aGlzLnM9MCx0aGlzLnQ9bnVsbCx0aGlzLmk9bn1mdW5jdGlvbiB0dSh0KXtmb3IodmFyIG4sZSxyLGksbyx1PW5ldyBLbyh0LDApLGE9W3VdO249YS5wb3AoKTspaWYocj1uLl8uY2hpbGRyZW4pZm9yKG4uY2hpbGRyZW49bmV3IEFycmF5KG89ci5sZW5ndGgpLGk9by0xO2k+PTA7LS1pKWEucHVzaChlPW4uY2hpbGRyZW5baV09bmV3IEtvKHJbaV0saSkpLGUucGFyZW50PW47cmV0dXJuKHUucGFyZW50PW5ldyBLbyhudWxsLDApKS5jaGlsZHJlbj1bdV0sdX1mdW5jdGlvbiBudSh0LG4sZSxyLGksbyl7Zm9yKHZhciB1LGEsYyxzLGYsbCxoLHAsZCx2LF8seT1bXSxnPW4uY2hpbGRyZW4sbT0wLHg9MCxiPWcubGVuZ3RoLHc9bi52YWx1ZTttPGI7KXtjPWktZSxzPW8tcjtkbyBmPWdbeCsrXS52YWx1ZTt3aGlsZSghZiYmeDxiKTtmb3IobD1oPWYsdj1NYXRoLm1heChzL2MsYy9zKS8odyp0KSxfPWYqZip2LGQ9TWF0aC5tYXgoaC9fLF8vbCk7eDxiOysreCl7aWYoZis9YT1nW3hdLnZhbHVlLGE8bCYmKGw9YSksYT5oJiYoaD1hKSxfPWYqZip2LHA9TWF0aC5tYXgoaC9fLF8vbCkscD5kKXtmLT1hO2JyZWFrfWQ9cH15LnB1c2godT17dmFsdWU6ZixkaWNlOmM8cyxjaGlsZHJlbjpnLnNsaWNlKG0seCl9KSx1LmRpY2U/cWcodSxlLHIsaSx3P3IrPXMqZi93Om8pOllnKHUsZSxyLHc/ZSs9YypmL3c6aSxvKSx3LT1mLG09eH1yZXR1cm4geX1mdW5jdGlvbiBldSh0LG4pe3JldHVybiB0WzBdLW5bMF18fHRbMV0tblsxXX1mdW5jdGlvbiBydSh0KXtmb3IodmFyIG49dC5sZW5ndGgsZT1bMCwxXSxyPTIsaT0yO2k8bjsrK2kpe2Zvcig7cj4xJiZHZyh0W2Vbci0yXV0sdFtlW3ItMV1dLHRbaV0pPD0wOyktLXI7ZVtyKytdPWl9cmV0dXJuIGUuc2xpY2UoMCxyKX1mdW5jdGlvbiBpdSh0KXtpZighKHQ+PTEpKXRocm93IG5ldyBFcnJvcjt0aGlzLl9zaXplPXQsdGhpcy5fY2FsbD10aGlzLl9lcnJvcj1udWxsLHRoaXMuX3Rhc2tzPVtdLHRoaXMuX2RhdGE9W10sdGhpcy5fd2FpdGluZz10aGlzLl9hY3RpdmU9dGhpcy5fZW5kZWQ9dGhpcy5fc3RhcnQ9MH1mdW5jdGlvbiBvdSh0KXtpZighdC5fc3RhcnQpdHJ5e3V1KHQpfWNhdGNoKG4pe2lmKHQuX3Rhc2tzW3QuX2VuZGVkK3QuX2FjdGl2ZS0xXSljdSh0LG4pO2Vsc2UgaWYoIXQuX2RhdGEpdGhyb3cgbn19ZnVuY3Rpb24gdXUodCl7Zm9yKDt0Ll9zdGFydD10Ll93YWl0aW5nJiZ0Ll9hY3RpdmU8dC5fc2l6ZTspe3ZhciBuPXQuX2VuZGVkK3QuX2FjdGl2ZSxlPXQuX3Rhc2tzW25dLHI9ZS5sZW5ndGgtMSxpPWVbcl07ZVtyXT1hdSh0LG4pLC0tdC5fd2FpdGluZywrK3QuX2FjdGl2ZSxlPWkuYXBwbHkobnVsbCxlKSx0Ll90YXNrc1tuXSYmKHQuX3Rhc2tzW25dPWV8fG5tKX19ZnVuY3Rpb24gYXUodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSxyKXt0Ll90YXNrc1tuXSYmKC0tdC5fYWN0aXZlLCsrdC5fZW5kZWQsdC5fdGFza3Nbbl09bnVsbCxudWxsPT10Ll9lcnJvciYmKG51bGwhPWU/Y3UodCxlKToodC5fZGF0YVtuXT1yLHQuX3dhaXRpbmc/b3UodCk6c3UodCkpKSl9fWZ1bmN0aW9uIGN1KHQsbil7dmFyIGUscj10Ll90YXNrcy5sZW5ndGg7Zm9yKHQuX2Vycm9yPW4sdC5fZGF0YT12b2lkIDAsdC5fd2FpdGluZz1OYU47LS1yPj0wOylpZigoZT10Ll90YXNrc1tyXSkmJih0Ll90YXNrc1tyXT1udWxsLGUuYWJvcnQpKXRyeXtlLmFib3J0KCl9Y2F0Y2godCl7fXQuX2FjdGl2ZT1OYU4sc3UodCl9ZnVuY3Rpb24gc3UodCl7aWYoIXQuX2FjdGl2ZSYmdC5fY2FsbCl7dmFyIG49dC5fZGF0YTt0Ll9kYXRhPXZvaWQgMCx0Ll9jYWxsKHQuX2Vycm9yLG4pfX1mdW5jdGlvbiBmdSh0KXtyZXR1cm4gbmV3IGl1KGFyZ3VtZW50cy5sZW5ndGg/K3Q6MS8wKX1mdW5jdGlvbiBsdSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt0KG51bGw9PW4/ZTpudWxsKX19ZnVuY3Rpb24gaHUodCl7dmFyIG49dC5yZXNwb25zZVR5cGU7cmV0dXJuIG4mJiJ0ZXh0IiE9PW4/dC5yZXNwb25zZTp0LnJlc3BvbnNlVGV4dH1mdW5jdGlvbiBwdSh0LG4pe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChlLnJlc3BvbnNlVGV4dCxuKX19ZnVuY3Rpb24gZHUodCl7ZnVuY3Rpb24gbihuKXt2YXIgbz1uKyIiLHU9ZS5nZXQobyk7aWYoIXUpe2lmKGkhPT14bSlyZXR1cm4gaTtlLnNldChvLHU9ci5wdXNoKG4pKX1yZXR1cm4gdFsodS0xKSV0Lmxlbmd0aF19dmFyIGU9SWUoKSxyPVtdLGk9eG07cmV0dXJuIHQ9bnVsbD09dD9bXTptbS5jYWxsKHQpLG4uZG9tYWluPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiByLnNsaWNlKCk7cj1bXSxlPUllKCk7Zm9yKHZhciBpLG8sdT0tMSxhPXQubGVuZ3RoOysrdTxhOyllLmhhcyhvPShpPXRbdV0pKyIiKXx8ZS5zZXQobyxyLnB1c2goaSkpO3JldHVybiBufSxuLnJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW1tLmNhbGwoZSksbik6dC5zbGljZSgpfSxuLnVua25vd249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dCxuKTppfSxuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gZHUoKS5kb21haW4ocikucmFuZ2UodCkudW5rbm93bihpKX0sbn1mdW5jdGlvbiB2dSgpe2Z1bmN0aW9uIHQoKXt2YXIgdD1pKCkubGVuZ3RoLHI9dVsxXTx1WzBdLGw9dVtyLTBdLGg9dVsxLXJdO249KGgtbCkvTWF0aC5tYXgoMSx0LWMrMipzKSxhJiYobj1NYXRoLmZsb29yKG4pKSxsKz0oaC1sLW4qKHQtYykpKmYsZT1uKigxLWMpLGEmJihsPU1hdGgucm91bmQobCksZT1NYXRoLnJvdW5kKGUpKTt2YXIgcD1Jcyh0KS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIGwrbip0fSk7cmV0dXJuIG8ocj9wLnJldmVyc2UoKTpwKX12YXIgbixlLHI9ZHUoKS51bmtub3duKHZvaWQgMCksaT1yLmRvbWFpbixvPXIucmFuZ2UsdT1bMCwxXSxhPSExLGM9MCxzPTAsZj0uNTtyZXR1cm4gZGVsZXRlIHIudW5rbm93bixyLmRvbWFpbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaShuKSx0KCkpOmkoKX0sci5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1bK25bMF0sK25bMV1dLHQoKSk6dS5zbGljZSgpfSxyLnJhbmdlUm91bmQ9ZnVuY3Rpb24obil7cmV0dXJuIHU9WytuWzBdLCtuWzFdXSxhPSEwLHQoKX0sci5iYW5kd2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sci5zdGVwPWZ1bmN0aW9uKCl7cmV0dXJuIG59LHIucm91bmQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ISFuLHQoKSk6YX0sci5wYWRkaW5nPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPXM9TWF0aC5tYXgoMCxNYXRoLm1pbigxLG4pKSx0KCkpOmN9LHIucGFkZGluZ0lubmVyPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPU1hdGgubWF4KDAsTWF0aC5taW4oMSxuKSksdCgpKTpjfSxyLnBhZGRpbmdPdXRlcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1NYXRoLm1heCgwLE1hdGgubWluKDEsbikpLHQoKSk6c30sci5hbGlnbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1NYXRoLm1heCgwLE1hdGgubWluKDEsbikpLHQoKSk6Zn0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHZ1KCkuZG9tYWluKGkoKSkucmFuZ2UodSkucm91bmQoYSkucGFkZGluZ0lubmVyKGMpLnBhZGRpbmdPdXRlcihzKS5hbGlnbihmKX0sdCgpfWZ1bmN0aW9uIF91KHQpe3ZhciBuPXQuY29weTtyZXR1cm4gdC5wYWRkaW5nPXQucGFkZGluZ091dGVyLGRlbGV0ZSB0LnBhZGRpbmdJbm5lcixkZWxldGUgdC5wYWRkaW5nT3V0ZXIsdC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIF91KG4oKSl9LHR9ZnVuY3Rpb24geXUoKXtyZXR1cm4gX3UodnUoKS5wYWRkaW5nSW5uZXIoMSkpfWZ1bmN0aW9uIGd1KHQsbil7cmV0dXJuKG4tPXQ9K3QpP2Z1bmN0aW9uKGUpe3JldHVybihlLXQpL259OmJtKG4pfWZ1bmN0aW9uIG11KHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPXQobj0rbixlPStlKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQ8PW4/MDp0Pj1lPzE6cih0KX19fWZ1bmN0aW9uIHh1KHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPXQobj0rbixlPStlKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQ8PTA/bjp0Pj0xP2U6cih0KX19fWZ1bmN0aW9uIGJ1KHQsbixlLHIpe3ZhciBpPXRbMF0sbz10WzFdLHU9blswXSxhPW5bMV07cmV0dXJuIG88aT8oaT1lKG8saSksdT1yKGEsdSkpOihpPWUoaSxvKSx1PXIodSxhKSksZnVuY3Rpb24odCl7cmV0dXJuIHUoaSh0KSl9fWZ1bmN0aW9uIHd1KHQsbixlLHIpe3ZhciBpPU1hdGgubWluKHQubGVuZ3RoLG4ubGVuZ3RoKS0xLG89bmV3IEFycmF5KGkpLHU9bmV3IEFycmF5KGkpLGE9LTE7Zm9yKHRbaV08dFswXSYmKHQ9dC5zbGljZSgpLnJldmVyc2UoKSxuPW4uc2xpY2UoKS5yZXZlcnNlKCkpOysrYTxpOylvW2FdPWUodFthXSx0W2ErMV0pLHVbYV09cihuW2FdLG5bYSsxXSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlPUVzKHQsbiwxLGkpLTE7cmV0dXJuIHVbZV0ob1tlXShuKSl9fWZ1bmN0aW9uIE11KHQsbil7cmV0dXJuIG4uZG9tYWluKHQuZG9tYWluKCkpLnJhbmdlKHQucmFuZ2UoKSkuaW50ZXJwb2xhdGUodC5pbnRlcnBvbGF0ZSgpKS5jbGFtcCh0LmNsYW1wKCkpfWZ1bmN0aW9uIFR1KHQsbil7ZnVuY3Rpb24gZSgpe3JldHVybiBpPU1hdGgubWluKGEubGVuZ3RoLGMubGVuZ3RoKT4yP3d1OmJ1LG89dT1udWxsLHJ9ZnVuY3Rpb24gcihuKXtyZXR1cm4ob3x8KG89aShhLGMsZj9tdSh0KTp0LHMpKSkoK24pfXZhciBpLG8sdSxhPU1tLGM9TW0scz1taCxmPSExO3JldHVybiByLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4odXx8KHU9aShjLGEsZ3UsZj94dShuKTpuKSkpKCt0KX0sci5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9Z20uY2FsbCh0LHdtKSxlKCkpOmEuc2xpY2UoKX0sci5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1tbS5jYWxsKHQpLGUoKSk6Yy5zbGljZSgpfSxyLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGM9bW0uY2FsbCh0KSxzPXhoLGUoKX0sci5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0hIXQsZSgpKTpmfSxyLmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPXQsZSgpKTpzfSxlKCl9ZnVuY3Rpb24gTnUodCl7dmFyIG49dC5kb21haW47cmV0dXJuIHQudGlja3M9ZnVuY3Rpb24odCl7dmFyIGU9bigpO3JldHVybiBIcyhlWzBdLGVbZS5sZW5ndGgtMV0sbnVsbD09dD8xMDp0KX0sdC50aWNrRm9ybWF0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFRtKG4oKSx0LGUpfSx0Lm5pY2U9ZnVuY3Rpb24ocil7dmFyIGk9bigpLG89aS5sZW5ndGgtMSx1PW51bGw9PXI/MTA6cixhPWlbMF0sYz1pW29dLHM9ZShhLGMsdSk7cmV0dXJuIHMmJihzPWUoTWF0aC5mbG9vcihhL3MpKnMsTWF0aC5jZWlsKGMvcykqcyx1KSxpWzBdPU1hdGguZmxvb3IoYS9zKSpzLGlbb109TWF0aC5jZWlsKGMvcykqcyxuKGkpKSx0fSx0fWZ1bmN0aW9uIGt1KCl7dmFyIHQ9VHUoZ3UsZGgpO3JldHVybiB0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gTXUodCxrdSgpKX0sTnUodCl9ZnVuY3Rpb24gU3UoKXtmdW5jdGlvbiB0KHQpe3JldHVybit0fXZhciBuPVswLDFdO3JldHVybiB0LmludmVydD10LHQuZG9tYWluPXQucmFuZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49Z20uY2FsbChlLHdtKSx0KTpuLnNsaWNlKCl9LHQuY29weT1mdW5jdGlvbigpe3JldHVybiBTdSgpLmRvbWFpbihuKX0sTnUodCl9ZnVuY3Rpb24gRXUodCxuKXtyZXR1cm4obj1NYXRoLmxvZyhuL3QpKT9mdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5sb2coZS90KS9ufTpibShuKX1mdW5jdGlvbiBBdSh0LG4pe3JldHVybiB0PDA/ZnVuY3Rpb24oZSl7cmV0dXJuLU1hdGgucG93KC1uLGUpKk1hdGgucG93KC10LDEtZSl9OmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnBvdyhuLGUpKk1hdGgucG93KHQsMS1lKX19ZnVuY3Rpb24gQ3UodCl7cmV0dXJuIGlzRmluaXRlKHQpPysoIjFlIit0KTp0PDA/MDp0fWZ1bmN0aW9uIHp1KHQpe3JldHVybiAxMD09PXQ/Q3U6dD09PU1hdGguRT9NYXRoLmV4cDpmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5wb3codCxuKX19ZnVuY3Rpb24gUHUodCl7cmV0dXJuIHQ9PT1NYXRoLkU/TWF0aC5sb2c6MTA9PT10JiZNYXRoLmxvZzEwfHwyPT09dCYmTWF0aC5sb2cyfHwodD1NYXRoLmxvZyh0KSxmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5sb2cobikvdH0pfWZ1bmN0aW9uIFJ1KHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4tdCgtbil9fWZ1bmN0aW9uIHF1KCl7ZnVuY3Rpb24gbigpe3JldHVybiBvPVB1KGkpLHU9enUoaSkscigpWzBdPDAmJihvPVJ1KG8pLHU9UnUodSkpLGV9dmFyIGU9VHUoRXUsQXUpLmRvbWFpbihbMSwxMF0pLHI9ZS5kb21haW4saT0xMCxvPVB1KDEwKSx1PXp1KDEwKTtyZXR1cm4gZS5iYXNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0LG4oKSk6aX0sZS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHIodCksbigpKTpyKCl9LGUudGlja3M9ZnVuY3Rpb24odCl7dmFyIG4sZT1yKCksYT1lWzBdLGM9ZVtlLmxlbmd0aC0xXTsobj1jPGEpJiYoaD1hLGE9YyxjPWgpO3ZhciBzLGYsbCxoPW8oYSkscD1vKGMpLGQ9bnVsbD09dD8xMDordCx2PVtdO2lmKCEoaSUxKSYmcC1oPGQpe2lmKGg9TWF0aC5yb3VuZChoKS0xLHA9TWF0aC5yb3VuZChwKSsxLGE+MCl7Zm9yKDtoPHA7KytoKWZvcihmPTEscz11KGgpO2Y8aTsrK2YpaWYobD1zKmYsIShsPGEpKXtpZihsPmMpYnJlYWs7di5wdXNoKGwpfX1lbHNlIGZvcig7aDxwOysraClmb3IoZj1pLTEscz11KGgpO2Y+PTE7LS1mKWlmKGw9cypmLCEobDxhKSl7aWYobD5jKWJyZWFrO3YucHVzaChsKX19ZWxzZSB2PUhzKGgscCxNYXRoLm1pbihwLWgsZCkpLm1hcCh1KTtyZXR1cm4gbj92LnJldmVyc2UoKTp2fSxlLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obixyKXtpZihudWxsPT1yJiYocj0xMD09PWk/Ii4wZSI6IiwiKSwiZnVuY3Rpb24iIT10eXBlb2YgciYmKHI9dC5mb3JtYXQocikpLG49PT0xLzApcmV0dXJuIHI7bnVsbD09biYmKG49MTApO3ZhciBhPU1hdGgubWF4KDEsaSpuL2UudGlja3MoKS5sZW5ndGgpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10L3UoTWF0aC5yb3VuZChvKHQpKSk7cmV0dXJuIG4qaTxpLS41JiYobio9aSksbjw9YT9yKHQpOiIifX0sZS5uaWNlPWZ1bmN0aW9uKCl7cmV0dXJuIHIoTm0ocigpLHtmbG9vcjpmdW5jdGlvbih0KXtyZXR1cm4gdShNYXRoLmZsb29yKG8odCkpKX0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4gdShNYXRoLmNlaWwobyh0KSkpfX0pKX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIE11KGUscXUoKS5iYXNlKGkpKX0sZX1mdW5jdGlvbiBMdSh0LG4pe3JldHVybiB0PDA/LU1hdGgucG93KC10LG4pOk1hdGgucG93KHQsbil9ZnVuY3Rpb24gVXUoKXtmdW5jdGlvbiB0KHQsbil7cmV0dXJuKG49THUobixlKS0odD1MdSh0LGUpKSk/ZnVuY3Rpb24ocil7cmV0dXJuKEx1KHIsZSktdCkvbn06Ym0obil9ZnVuY3Rpb24gbih0LG4pe3JldHVybiBuPUx1KG4sZSktKHQ9THUodCxlKSksZnVuY3Rpb24ocil7cmV0dXJuIEx1KHQrbipyLDEvZSl9fXZhciBlPTEscj1UdSh0LG4pLGk9ci5kb21haW47cmV0dXJuIHIuZXhwb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3QsaShpKCkpKTplfSxyLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gTXUocixVdSgpLmV4cG9uZW50KGUpKX0sTnUocil9ZnVuY3Rpb24gRHUoKXtyZXR1cm4gVXUoKS5leHBvbmVudCguNSl9ZnVuY3Rpb24gT3UoKXtmdW5jdGlvbiB0KCl7dmFyIHQ9MCxvPU1hdGgubWF4KDEsci5sZW5ndGgpO2ZvcihpPW5ldyBBcnJheShvLTEpOysrdDxvOylpW3QtMV09V3MoZSx0L28pO3JldHVybiBufWZ1bmN0aW9uIG4odCl7aWYoIWlzTmFOKHQ9K3QpKXJldHVybiByW0VzKGksdCldfXZhciBlPVtdLHI9W10saT1bXTtyZXR1cm4gbi5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIG49ci5pbmRleE9mKHQpO3JldHVybiBuPDA/W05hTixOYU5dOltuPjA/aVtuLTFdOmVbMF0sbjxpLmxlbmd0aD9pW25dOmVbZS5sZW5ndGgtMV1dfSxuLmRvbWFpbj1mdW5jdGlvbihuKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZS5zbGljZSgpO2U9W107Zm9yKHZhciByLGk9MCxvPW4ubGVuZ3RoO2k8bzsrK2kpcj1uW2ldLG51bGw9PXJ8fGlzTmFOKHI9K3IpfHxlLnB1c2gocik7cmV0dXJuIGUuc29ydChOcyksdCgpfSxuLnJhbmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW1tLmNhbGwobiksdCgpKTpyLnNsaWNlKCl9LG4ucXVhbnRpbGVzPWZ1bmN0aW9uKCl7cmV0dXJuIGkuc2xpY2UoKX0sbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIE91KCkuZG9tYWluKGUpLnJhbmdlKHIpfSxufWZ1bmN0aW9uIEZ1KCl7ZnVuY3Rpb24gdCh0KXtpZih0PD10KXJldHVybiB1W0VzKG8sdCwwLGkpXX1mdW5jdGlvbiBuKCl7dmFyIG49LTE7Zm9yKG89bmV3IEFycmF5KGkpOysrbjxpOylvW25dPSgobisxKSpyLShuLWkpKmUpLyhpKzEpO3JldHVybiB0fXZhciBlPTAscj0xLGk9MSxvPVsuNV0sdT1bMCwxXTtyZXR1cm4gdC5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3RbMF0scj0rdFsxXSxuKCkpOltlLHJdfSx0LnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSh1PW1tLmNhbGwodCkpLmxlbmd0aC0xLG4oKSk6dS5zbGljZSgpfSx0LmludmVydEV4dGVudD1mdW5jdGlvbih0KXt2YXIgbj11LmluZGV4T2YodCk7cmV0dXJuIG48MD9bTmFOLE5hTl06bjwxP1tlLG9bMF1dOm4+PWk/W29baS0xXSxyXTpbb1tuLTFdLG9bbl1dfSx0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gRnUoKS5kb21haW4oW2Uscl0pLnJhbmdlKHUpfSxOdSh0KX1mdW5jdGlvbiBJdSgpe2Z1bmN0aW9uIHQodCl7aWYodDw9dClyZXR1cm4gZVtFcyhuLHQsMCxyKV19dmFyIG49Wy41XSxlPVswLDFdLHI9MTtyZXR1cm4gdC5kb21haW49ZnVuY3Rpb24oaSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49bW0uY2FsbChpKSxyPU1hdGgubWluKG4ubGVuZ3RoLGUubGVuZ3RoLTEpLHQpOm4uc2xpY2UoKX0sdC5yYW5nZT1mdW5jdGlvbihpKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1tbS5jYWxsKGkpLHI9TWF0aC5taW4obi5sZW5ndGgsZS5sZW5ndGgtMSksdCk6ZS5zbGljZSgpfSx0LmludmVydEV4dGVudD1mdW5jdGlvbih0KXt2YXIgcj1lLmluZGV4T2YodCk7cmV0dXJuW25bci0xXSxuW3JdXX0sdC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIEl1KCkuZG9tYWluKG4pLnJhbmdlKGUpfSx0fWZ1bmN0aW9uIFl1KHQsbixlLHIpe2Z1bmN0aW9uIGkobil7cmV0dXJuIHQobj1uZXcgRGF0ZSgrbikpLG59cmV0dXJuIGkuZmxvb3I9aSxpLmNlaWw9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZT1uZXcgRGF0ZShlLTEpKSxuKGUsMSksdChlKSxlfSxpLnJvdW5kPWZ1bmN0aW9uKHQpe3ZhciBuPWkodCksZT1pLmNlaWwodCk7cmV0dXJuIHQtbjxlLXQ/bjplfSxpLm9mZnNldD1mdW5jdGlvbih0LGUpe3JldHVybiBuKHQ9bmV3IERhdGUoK3QpLG51bGw9PWU/MTpNYXRoLmZsb29yKGUpKSx0fSxpLnJhbmdlPWZ1bmN0aW9uKGUscixvKXt2YXIgdT1bXTtpZihlPWkuY2VpbChlKSxvPW51bGw9PW8/MTpNYXRoLmZsb29yKG8pLCEoZTxyJiZvPjApKXJldHVybiB1O2RvIHUucHVzaChuZXcgRGF0ZSgrZSkpO3doaWxlKG4oZSxvKSx0KGUpLGU8cik7cmV0dXJuIHV9LGkuZmlsdGVyPWZ1bmN0aW9uKGUpe3JldHVybiBZdShmdW5jdGlvbihuKXtpZihuPj1uKWZvcig7dChuKSwhZShuKTspbi5zZXRUaW1lKG4tMSl9LGZ1bmN0aW9uKHQscil7aWYodD49dClmb3IoOy0tcj49MDspZm9yKDtuKHQsMSksIWUodCk7KTt9KX0sZSYmKGkuY291bnQ9ZnVuY3Rpb24obixyKXtyZXR1cm4ga20uc2V0VGltZSgrbiksU20uc2V0VGltZSgrciksdChrbSksdChTbSksTWF0aC5mbG9vcihlKGttLFNtKSl9LGkuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSxpc0Zpbml0ZSh0KSYmdD4wP3Q+MT9pLmZpbHRlcihyP2Z1bmN0aW9uKG4pe3JldHVybiByKG4pJXQ9PT0wfTpmdW5jdGlvbihuKXtyZXR1cm4gaS5jb3VudCgwLG4pJXQ9PT0wfSk6aTpudWxsfSksaX1mdW5jdGlvbiBCdSh0KXtyZXR1cm4gWXUoZnVuY3Rpb24obil7bi5zZXREYXRlKG4uZ2V0RGF0ZSgpLShuLmdldERheSgpKzctdCklNyksbi5zZXRIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldERhdGUodC5nZXREYXRlKCkrNypuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10LShuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSp6bSkvcW19KX1mdW5jdGlvbiBqdSh0KXtyZXR1cm4gWXUoZnVuY3Rpb24obil7bi5zZXRVVENEYXRlKG4uZ2V0VVRDRGF0ZSgpLShuLmdldFVUQ0RheSgpKzctdCklNyksbi5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFVUQ0RhdGUodC5nZXRVVENEYXRlKCkrNypuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS9xbX0pfWZ1bmN0aW9uIEh1KHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIG49bmV3IERhdGUoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpO3JldHVybiBuLnNldEZ1bGxZZWFyKHQueSksbn1yZXR1cm4gbmV3IERhdGUodC55LHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKX1mdW5jdGlvbiBYdSh0KXtpZigwPD10LnkmJnQueTwxMDApe3ZhciBuPW5ldyBEYXRlKERhdGUuVVRDKC0xLHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKSk7cmV0dXJuIG4uc2V0VVRDRnVsbFllYXIodC55KSxufXJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh0LnksdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpKX1mdW5jdGlvbiBWdSh0KXtyZXR1cm57eTp0LG06MCxkOjEsSDowLE06MCxTOjAsTDowfX1mdW5jdGlvbiBXdSh0KXtmdW5jdGlvbiBuKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByLGksbyx1PVtdLGE9LTEsYz0wLHM9dC5sZW5ndGg7Zm9yKGUgaW5zdGFuY2VvZiBEYXRlfHwoZT1uZXcgRGF0ZSgrZSkpOysrYTxzOykzNz09PXQuY2hhckNvZGVBdChhKSYmKHUucHVzaCh0LnNsaWNlKGMsYSkpLG51bGwhPShpPVB4W3I9dC5jaGFyQXQoKythKV0pP3I9dC5jaGFyQXQoKythKTppPSJlIj09PXI/IiAiOiIwIiwobz1uW3JdKSYmKHI9byhlLGkpKSx1LnB1c2gociksYz1hKzEpO3JldHVybiB1LnB1c2godC5zbGljZShjLGEpKSx1LmpvaW4oIiIpfX1mdW5jdGlvbiBlKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBpPVZ1KDE5MDApLG89cihpLHQsZSs9IiIsMCk7aWYobyE9ZS5sZW5ndGgpcmV0dXJuIG51bGw7aWYoInAiaW4gaSYmKGkuSD1pLkglMTIrMTIqaS5wKSwiVyJpbiBpfHwiVSJpbiBpKXsidyJpbiBpfHwoaS53PSJXImluIGk/MTowKTt2YXIgdT0iWiJpbiBpP1h1KFZ1KGkueSkpLmdldFVUQ0RheSgpOm4oVnUoaS55KSkuZ2V0RGF5KCk7aS5tPTAsaS5kPSJXImluIGk/KGkudys2KSU3KzcqaS5XLSh1KzUpJTc6aS53KzcqaS5VLSh1KzYpJTd9cmV0dXJuIloiaW4gaT8oaS5IKz1pLlovMTAwfDAsaS5NKz1pLlolMTAwLFh1KGkpKTpuKGkpfX1mdW5jdGlvbiByKHQsbixlLHIpe2Zvcih2YXIgaSxvLHU9MCxhPW4ubGVuZ3RoLGM9ZS5sZW5ndGg7dTxhOyl7aWYocj49YylyZXR1cm4tMTtpZihpPW4uY2hhckNvZGVBdCh1KyspLDM3PT09aSl7aWYoaT1uLmNoYXJBdCh1KyspLG89QltpIGluIFB4P24uY2hhckF0KHUrKyk6aV0sIW98fChyPW8odCxlLHIpKTwwKXJldHVybi0xfWVsc2UgaWYoaSE9ZS5jaGFyQ29kZUF0KHIrKykpcmV0dXJuLTF9cmV0dXJuIHJ9ZnVuY3Rpb24gaSh0LG4sZSl7dmFyIHI9Qy5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0LnA9eltyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG8odCxuLGUpe3ZhciByPXEuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC53PUxbclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB1KHQsbixlKXt2YXIgcj1QLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQudz1SW3JbMF0udG9Mb3dlckNhc2UoKV0sZStyWzBdLmxlbmd0aCk6LTE7DQp9ZnVuY3Rpb24gYSh0LG4sZSl7dmFyIHI9Ty5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lm09RltyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGModCxuLGUpe3ZhciByPVUuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5tPURbclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBzKHQsbixlKXtyZXR1cm4gcih0LHcsbixlKX1mdW5jdGlvbiBmKHQsbixlKXtyZXR1cm4gcih0LE0sbixlKX1mdW5jdGlvbiBsKHQsbixlKXtyZXR1cm4gcih0LFQsbixlKX1mdW5jdGlvbiBoKHQpe3JldHVybiBTW3QuZ2V0RGF5KCldfWZ1bmN0aW9uIHAodCl7cmV0dXJuIGtbdC5nZXREYXkoKV19ZnVuY3Rpb24gZCh0KXtyZXR1cm4gQVt0LmdldE1vbnRoKCldfWZ1bmN0aW9uIHYodCl7cmV0dXJuIEVbdC5nZXRNb250aCgpXX1mdW5jdGlvbiBfKHQpe3JldHVybiBOWysodC5nZXRIb3VycygpPj0xMildfWZ1bmN0aW9uIHkodCl7cmV0dXJuIFNbdC5nZXRVVENEYXkoKV19ZnVuY3Rpb24gZyh0KXtyZXR1cm4ga1t0LmdldFVUQ0RheSgpXX1mdW5jdGlvbiBtKHQpe3JldHVybiBBW3QuZ2V0VVRDTW9udGgoKV19ZnVuY3Rpb24geCh0KXtyZXR1cm4gRVt0LmdldFVUQ01vbnRoKCldfWZ1bmN0aW9uIGIodCl7cmV0dXJuIE5bKyh0LmdldFVUQ0hvdXJzKCk+PTEyKV19dmFyIHc9dC5kYXRlVGltZSxNPXQuZGF0ZSxUPXQudGltZSxOPXQucGVyaW9kcyxrPXQuZGF5cyxTPXQuc2hvcnREYXlzLEU9dC5tb250aHMsQT10LnNob3J0TW9udGhzLEM9R3UoTiksej1KdShOKSxQPUd1KGspLFI9SnUoaykscT1HdShTKSxMPUp1KFMpLFU9R3UoRSksRD1KdShFKSxPPUd1KEEpLEY9SnUoQSksST17YTpoLEE6cCxiOmQsQjp2LGM6bnVsbCxkOmhhLGU6aGEsSDpwYSxJOmRhLGo6dmEsTDpfYSxtOnlhLE06Z2EscDpfLFM6bWEsVTp4YSx3OmJhLFc6d2EseDpudWxsLFg6bnVsbCx5Ok1hLFk6VGEsWjpOYSwiJSI6SWF9LFk9e2E6eSxBOmcsYjptLEI6eCxjOm51bGwsZDprYSxlOmthLEg6U2EsSTpFYSxqOkFhLEw6Q2EsbTp6YSxNOlBhLHA6YixTOlJhLFU6cWEsdzpMYSxXOlVhLHg6bnVsbCxYOm51bGwseTpEYSxZOk9hLFo6RmEsIiUiOklhfSxCPXthOm8sQTp1LGI6YSxCOmMsYzpzLGQ6b2EsZTpvYSxIOmFhLEk6YWEsajp1YSxMOmZhLG06aWEsTTpjYSxwOmksUzpzYSxVOkt1LHc6UXUsVzp0YSx4OmYsWDpsLHk6ZWEsWTpuYSxaOnJhLCIlIjpsYX07cmV0dXJuIEkueD1uKE0sSSksSS5YPW4oVCxJKSxJLmM9bih3LEkpLFkueD1uKE0sWSksWS5YPW4oVCxZKSxZLmM9bih3LFkpLHtmb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIGU9bih0Kz0iIixJKTtyZXR1cm4gZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxlfSxwYXJzZTpmdW5jdGlvbih0KXt2YXIgbj1lKHQrPSIiLEh1KTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSx1dGNGb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIGU9bih0Kz0iIixZKTtyZXR1cm4gZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxlfSx1dGNQYXJzZTpmdW5jdGlvbih0KXt2YXIgbj1lKHQsWHUpO3JldHVybiBuLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LG59fX1mdW5jdGlvbiAkdSh0LG4sZSl7dmFyIHI9dDwwPyItIjoiIixpPShyPy10OnQpKyIiLG89aS5sZW5ndGg7cmV0dXJuIHIrKG88ZT9uZXcgQXJyYXkoZS1vKzEpLmpvaW4obikraTppKX1mdW5jdGlvbiBadSh0KXtyZXR1cm4gdC5yZXBsYWNlKEx4LCJcXCQmIil9ZnVuY3Rpb24gR3UodCl7cmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiK3QubWFwKFp1KS5qb2luKCJ8IikrIikiLCJpIil9ZnVuY3Rpb24gSnUodCl7Zm9yKHZhciBuPXt9LGU9LTEscj10Lmxlbmd0aDsrK2U8cjspblt0W2VdLnRvTG93ZXJDYXNlKCldPWU7cmV0dXJuIG59ZnVuY3Rpb24gUXUodCxuLGUpe3ZhciByPVJ4LmV4ZWMobi5zbGljZShlLGUrMSkpO3JldHVybiByPyh0Lnc9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gS3UodCxuLGUpe3ZhciByPVJ4LmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQuVT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB0YSh0LG4sZSl7dmFyIHI9UnguZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5XPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG5hKHQsbixlKXt2YXIgcj1SeC5leGVjKG4uc2xpY2UoZSxlKzQpKTtyZXR1cm4gcj8odC55PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGVhKHQsbixlKXt2YXIgcj1SeC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC55PStyWzBdKygrclswXT42OD8xOTAwOjJlMyksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcmEodCxuLGUpe3ZhciByPS9eKFopfChbKy1dXGRcZCkoPzpcOj8oXGRcZCkpPy8uZXhlYyhuLnNsaWNlKGUsZSs2KSk7cmV0dXJuIHI/KHQuWj1yWzFdPzA6LShyWzJdKyhyWzNdfHwiMDAiKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gaWEodCxuLGUpe3ZhciByPVJ4LmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Lm09clswXS0xLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG9hKHQsbixlKXt2YXIgcj1SeC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHVhKHQsbixlKXt2YXIgcj1SeC5leGVjKG4uc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8odC5tPTAsdC5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGFhKHQsbixlKXt2YXIgcj1SeC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5IPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGNhKHQsbixlKXt2YXIgcj1SeC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5NPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHNhKHQsbixlKXt2YXIgcj1SeC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5TPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGZhKHQsbixlKXt2YXIgcj1SeC5leGVjKG4uc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8odC5MPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGxhKHQsbixlKXt2YXIgcj1xeC5leGVjKG4uc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj9lK3JbMF0ubGVuZ3RoOi0xfWZ1bmN0aW9uIGhhKHQsbil7cmV0dXJuICR1KHQuZ2V0RGF0ZSgpLG4sMil9ZnVuY3Rpb24gcGEodCxuKXtyZXR1cm4gJHUodC5nZXRIb3VycygpLG4sMil9ZnVuY3Rpb24gZGEodCxuKXtyZXR1cm4gJHUodC5nZXRIb3VycygpJTEyfHwxMixuLDIpfWZ1bmN0aW9uIHZhKHQsbil7cmV0dXJuICR1KDErWW0uY291bnQob3godCksdCksbiwzKX1mdW5jdGlvbiBfYSh0LG4pe3JldHVybiAkdSh0LmdldE1pbGxpc2Vjb25kcygpLG4sMyl9ZnVuY3Rpb24geWEodCxuKXtyZXR1cm4gJHUodC5nZXRNb250aCgpKzEsbiwyKX1mdW5jdGlvbiBnYSh0LG4pe3JldHVybiAkdSh0LmdldE1pbnV0ZXMoKSxuLDIpfWZ1bmN0aW9uIG1hKHQsbil7cmV0dXJuICR1KHQuZ2V0U2Vjb25kcygpLG4sMil9ZnVuY3Rpb24geGEodCxuKXtyZXR1cm4gJHUoam0uY291bnQob3godCksdCksbiwyKX1mdW5jdGlvbiBiYSh0KXtyZXR1cm4gdC5nZXREYXkoKX1mdW5jdGlvbiB3YSh0LG4pe3JldHVybiAkdShIbS5jb3VudChveCh0KSx0KSxuLDIpfWZ1bmN0aW9uIE1hKHQsbil7cmV0dXJuICR1KHQuZ2V0RnVsbFllYXIoKSUxMDAsbiwyKX1mdW5jdGlvbiBUYSh0LG4pe3JldHVybiAkdSh0LmdldEZ1bGxZZWFyKCklMWU0LG4sNCl9ZnVuY3Rpb24gTmEodCl7dmFyIG49dC5nZXRUaW1lem9uZU9mZnNldCgpO3JldHVybihuPjA/Ii0iOihuKj0tMSwiKyIpKSskdShuLzYwfDAsIjAiLDIpKyR1KG4lNjAsIjAiLDIpfWZ1bmN0aW9uIGthKHQsbil7cmV0dXJuICR1KHQuZ2V0VVRDRGF0ZSgpLG4sMil9ZnVuY3Rpb24gU2EodCxuKXtyZXR1cm4gJHUodC5nZXRVVENIb3VycygpLG4sMil9ZnVuY3Rpb24gRWEodCxuKXtyZXR1cm4gJHUodC5nZXRVVENIb3VycygpJTEyfHwxMixuLDIpfWZ1bmN0aW9uIEFhKHQsbil7cmV0dXJuICR1KDErbHguY291bnQoQXgodCksdCksbiwzKX1mdW5jdGlvbiBDYSh0LG4pe3JldHVybiAkdSh0LmdldFVUQ01pbGxpc2Vjb25kcygpLG4sMyl9ZnVuY3Rpb24gemEodCxuKXtyZXR1cm4gJHUodC5nZXRVVENNb250aCgpKzEsbiwyKX1mdW5jdGlvbiBQYSh0LG4pe3JldHVybiAkdSh0LmdldFVUQ01pbnV0ZXMoKSxuLDIpfWZ1bmN0aW9uIFJhKHQsbil7cmV0dXJuICR1KHQuZ2V0VVRDU2Vjb25kcygpLG4sMil9ZnVuY3Rpb24gcWEodCxuKXtyZXR1cm4gJHUocHguY291bnQoQXgodCksdCksbiwyKX1mdW5jdGlvbiBMYSh0KXtyZXR1cm4gdC5nZXRVVENEYXkoKX1mdW5jdGlvbiBVYSh0LG4pe3JldHVybiAkdShkeC5jb3VudChBeCh0KSx0KSxuLDIpfWZ1bmN0aW9uIERhKHQsbil7cmV0dXJuICR1KHQuZ2V0VVRDRnVsbFllYXIoKSUxMDAsbiwyKX1mdW5jdGlvbiBPYSh0LG4pe3JldHVybiAkdSh0LmdldFVUQ0Z1bGxZZWFyKCklMWU0LG4sNCl9ZnVuY3Rpb24gRmEoKXtyZXR1cm4iKzAwMDAifWZ1bmN0aW9uIElhKCl7cmV0dXJuIiUifWZ1bmN0aW9uIFlhKG4pe3JldHVybiBDeD1XdShuKSx0LnRpbWVGb3JtYXQ9Q3guZm9ybWF0LHQudGltZVBhcnNlPUN4LnBhcnNlLHQudXRjRm9ybWF0PUN4LnV0Y0Zvcm1hdCx0LnV0Y1BhcnNlPUN4LnV0Y1BhcnNlLEN4fWZ1bmN0aW9uIEJhKHQpe3JldHVybiB0LnRvSVNPU3RyaW5nKCl9ZnVuY3Rpb24gamEodCl7dmFyIG49bmV3IERhdGUodCk7cmV0dXJuIGlzTmFOKG4pP251bGw6bn1mdW5jdGlvbiBIYSh0KXtyZXR1cm4gbmV3IERhdGUodCl9ZnVuY3Rpb24gWGEodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlPyt0OituZXcgRGF0ZSgrdCl9ZnVuY3Rpb24gVmEodCxuLHIsaSxvLHUsYSxjLHMpe2Z1bmN0aW9uIGYoZSl7cmV0dXJuKGEoZSk8ZT92OnUoZSk8ZT9fOm8oZSk8ZT95OmkoZSk8ZT9nOm4oZSk8ZT9yKGUpPGU/bTp4OnQoZSk8ZT9iOncpKGUpfWZ1bmN0aW9uIGwobixyLGksbyl7aWYobnVsbD09biYmKG49MTApLCJudW1iZXIiPT10eXBlb2Ygbil7dmFyIHU9TWF0aC5hYnMoaS1yKS9uLGE9a3MoZnVuY3Rpb24odCl7cmV0dXJuIHRbMl19KS5yaWdodChNLHUpO2E9PT1NLmxlbmd0aD8obz1lKHIvWHgsaS9YeCxuKSxuPXQpOmE/KGE9TVt1L01bYS0xXVsyXTxNW2FdWzJdL3U/YS0xOmFdLG89YVsxXSxuPWFbMF0pOihvPWUocixpLG4pLG49Yyl9cmV0dXJuIG51bGw9PW8/bjpuLmV2ZXJ5KG8pfXZhciBoPVR1KGd1LGRoKSxwPWguaW52ZXJ0LGQ9aC5kb21haW4sdj1zKCIuJUwiKSxfPXMoIjolUyIpLHk9cygiJUk6JU0iKSxnPXMoIiVJICVwIiksbT1zKCIlYSAlZCIpLHg9cygiJWIgJWQiKSxiPXMoIiVCIiksdz1zKCIlWSIpLE09W1thLDEsRnhdLFthLDUsNSpGeF0sW2EsMTUsMTUqRnhdLFthLDMwLDMwKkZ4XSxbdSwxLEl4XSxbdSw1LDUqSXhdLFt1LDE1LDE1Kkl4XSxbdSwzMCwzMCpJeF0sW28sMSxZeF0sW28sMywzKll4XSxbbyw2LDYqWXhdLFtvLDEyLDEyKll4XSxbaSwxLEJ4XSxbaSwyLDIqQnhdLFtyLDEsanhdLFtuLDEsSHhdLFtuLDMsMypIeF0sW3QsMSxYeF1dO3JldHVybiBoLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IERhdGUocCh0KSl9LGguZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2QoZ20uY2FsbCh0LFhhKSk6ZCgpLm1hcChIYSl9LGgudGlja3M9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPWQoKSxpPXJbMF0sbz1yW3IubGVuZ3RoLTFdLHU9bzxpO3JldHVybiB1JiYoZT1pLGk9byxvPWUpLGU9bCh0LGksbyxuKSxlPWU/ZS5yYW5nZShpLG8rMSk6W10sdT9lLnJldmVyc2UoKTplfSxoLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbnVsbD09bj9mOnMobil9LGgubmljZT1mdW5jdGlvbih0LG4pe3ZhciBlPWQoKTtyZXR1cm4odD1sKHQsZVswXSxlW2UubGVuZ3RoLTFdLG4pKT9kKE5tKGUsdCkpOmh9LGguY29weT1mdW5jdGlvbigpe3JldHVybiBNdShoLFZhKHQsbixyLGksbyx1LGEsYyxzKSl9LGh9ZnVuY3Rpb24gV2EodCl7dmFyIG49dC5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0W01hdGgubWF4KDAsTWF0aC5taW4obi0xLE1hdGguZmxvb3IoZSpuKSkpXX19ZnVuY3Rpb24gJGEodCl7ZnVuY3Rpb24gbihuKXt2YXIgbz0obi1lKS8oci1lKTtyZXR1cm4gdChpP01hdGgubWF4KDAsTWF0aC5taW4oMSxvKSk6byl9dmFyIGU9MCxyPTEsaT0hMTtyZXR1cm4gbi5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3RbMF0scj0rdFsxXSxuKTpbZSxyXX0sbi5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0hIXQsbik6aX0sbi5pbnRlcnBvbGF0b3I9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gJGEodCkuZG9tYWluKFtlLHJdKS5jbGFtcChpKX0sTnUobil9ZnVuY3Rpb24gWmEodCl7cmV0dXJuIHQuaW5uZXJSYWRpdXN9ZnVuY3Rpb24gR2EodCl7cmV0dXJuIHQub3V0ZXJSYWRpdXN9ZnVuY3Rpb24gSmEodCl7cmV0dXJuIHQuc3RhcnRBbmdsZX1mdW5jdGlvbiBRYSh0KXtyZXR1cm4gdC5lbmRBbmdsZX1mdW5jdGlvbiBLYSh0KXtyZXR1cm4gdCYmdC5wYWRBbmdsZX1mdW5jdGlvbiB0Yyh0KXtyZXR1cm4gdD49MT9sYjp0PD0tMT8tbGI6TWF0aC5hc2luKHQpfWZ1bmN0aW9uIG5jKHQsbixlLHIsaSxvLHUsYSl7dmFyIGM9ZS10LHM9ci1uLGY9dS1pLGw9YS1vLGg9KGYqKG4tbyktbCoodC1pKSkvKGwqYy1mKnMpO3JldHVyblt0K2gqYyxuK2gqc119ZnVuY3Rpb24gZWModCxuLGUscixpLG8sdSl7dmFyIGE9dC1lLGM9bi1yLHM9KHU/bzotbykvTWF0aC5zcXJ0KGEqYStjKmMpLGY9cypjLGw9LXMqYSxoPXQrZixwPW4rbCxkPWUrZix2PXIrbCxfPShoK2QpLzIseT0ocCt2KS8yLGc9ZC1oLG09di1wLHg9ZypnK20qbSxiPWktbyx3PWgqdi1kKnAsTT0obTwwPy0xOjEpKk1hdGguc3FydChNYXRoLm1heCgwLGIqYip4LXcqdykpLFQ9KHcqbS1nKk0pL3gsTj0oLXcqZy1tKk0pL3gsaz0odyptK2cqTSkveCxTPSgtdypnK20qTSkveCxFPVQtXyxBPU4teSxDPWstXyx6PVMteTtyZXR1cm4gRSpFK0EqQT5DKkMreip6JiYoVD1rLE49Uykse2N4OlQsY3k6Tix4MDE6LWYseTAxOi1sLHgxMTpUKihpL2ItMSkseTExOk4qKGkvYi0xKX19ZnVuY3Rpb24gcmModCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIGljKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIG9jKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIHVjKHQpe3RoaXMuX2N1cnZlPXR9ZnVuY3Rpb24gYWModCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbmV3IHVjKHQobikpfXJldHVybiBuLl9jdXJ2ZT10LG59ZnVuY3Rpb24gY2ModCl7dmFyIG49dC5jdXJ2ZTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnJhZGl1cz10LnksZGVsZXRlIHQueSx0LmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oYWModCkpOm4oKS5fY3VydmV9LHR9ZnVuY3Rpb24gc2ModCxuLGUpe3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbygoMip0Ll94MCt0Ll94MSkvMywoMip0Ll95MCt0Ll95MSkvMywodC5feDArMip0Ll94MSkvMywodC5feTArMip0Ll95MSkvMywodC5feDArNCp0Ll94MStuKS82LCh0Ll95MCs0KnQuX3kxK2UpLzYpfWZ1bmN0aW9uIGZjKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBsYyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gaGModCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIHBjKHQsbil7dGhpcy5fYmFzaXM9bmV3IGZjKHQpLHRoaXMuX2JldGE9bn1mdW5jdGlvbiBkYyh0LG4sZSl7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHQuX3gxK3QuX2sqKHQuX3gyLXQuX3gwKSx0Ll95MSt0Ll9rKih0Ll95Mi10Ll95MCksdC5feDIrdC5fayoodC5feDEtbiksdC5feTIrdC5fayoodC5feTEtZSksdC5feDIsdC5feTIpfWZ1bmN0aW9uIHZjKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1mdW5jdGlvbiBfYyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9rPSgxLW4pLzZ9ZnVuY3Rpb24geWModCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5faz0oMS1uKS82fWZ1bmN0aW9uIGdjKHQsbixlKXt2YXIgcj10Ll94MSxpPXQuX3kxLG89dC5feDIsdT10Ll95MjtpZih0Ll9sMDFfYT5zYil7dmFyIGE9Mip0Ll9sMDFfMmErMyp0Ll9sMDFfYSp0Ll9sMTJfYSt0Ll9sMTJfMmEsYz0zKnQuX2wwMV9hKih0Ll9sMDFfYSt0Ll9sMTJfYSk7cj0ociphLXQuX3gwKnQuX2wxMl8yYSt0Ll94Mip0Ll9sMDFfMmEpL2MsaT0oaSphLXQuX3kwKnQuX2wxMl8yYSt0Ll95Mip0Ll9sMDFfMmEpL2N9aWYodC5fbDIzX2E+c2Ipe3ZhciBzPTIqdC5fbDIzXzJhKzMqdC5fbDIzX2EqdC5fbDEyX2ErdC5fbDEyXzJhLGY9Myp0Ll9sMjNfYSoodC5fbDIzX2ErdC5fbDEyX2EpO289KG8qcyt0Ll94MSp0Ll9sMjNfMmEtbip0Ll9sMTJfMmEpL2YsdT0odSpzK3QuX3kxKnQuX2wyM18yYS1lKnQuX2wxMl8yYSkvZn10Ll9jb250ZXh0LmJlemllckN1cnZlVG8ocixpLG8sdSx0Ll94Mix0Ll95Mil9ZnVuY3Rpb24gbWModCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fYWxwaGE9bn1mdW5jdGlvbiB4Yyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1ufWZ1bmN0aW9uIGJjKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPW59ZnVuY3Rpb24gd2ModCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIE1jKHQpe3JldHVybiB0PDA/LTE6MX1mdW5jdGlvbiBUYyh0LG4sZSl7dmFyIHI9dC5feDEtdC5feDAsaT1uLXQuX3gxLG89KHQuX3kxLXQuX3kwKS8ocnx8aTwwJiYtMCksdT0oZS10Ll95MSkvKGl8fHI8MCYmLTApLGE9KG8qaSt1KnIpLyhyK2kpO3JldHVybihNYyhvKStNYyh1KSkqTWF0aC5taW4oTWF0aC5hYnMobyksTWF0aC5hYnModSksLjUqTWF0aC5hYnMoYSkpfHwwfWZ1bmN0aW9uIE5jKHQsbil7dmFyIGU9dC5feDEtdC5feDA7cmV0dXJuIGU/KDMqKHQuX3kxLXQuX3kwKS9lLW4pLzI6bn1mdW5jdGlvbiBrYyh0LG4sZSl7dmFyIHI9dC5feDAsaT10Ll95MCxvPXQuX3gxLHU9dC5feTEsYT0oby1yKS8zO3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhyK2EsaSthKm4sby1hLHUtYSplLG8sdSl9ZnVuY3Rpb24gU2ModCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIEVjKHQpe3RoaXMuX2NvbnRleHQ9bmV3IEFjKHQpfWZ1bmN0aW9uIEFjKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBDYyh0KXtyZXR1cm4gbmV3IFNjKHQpfWZ1bmN0aW9uIHpjKHQpe3JldHVybiBuZXcgRWModCl9ZnVuY3Rpb24gUGModCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIFJjKHQpe3ZhciBuLGUscj10Lmxlbmd0aC0xLGk9bmV3IEFycmF5KHIpLG89bmV3IEFycmF5KHIpLHU9bmV3IEFycmF5KHIpO2ZvcihpWzBdPTAsb1swXT0yLHVbMF09dFswXSsyKnRbMV0sbj0xO248ci0xOysrbilpW25dPTEsb1tuXT00LHVbbl09NCp0W25dKzIqdFtuKzFdO2ZvcihpW3ItMV09MixvW3ItMV09Nyx1W3ItMV09OCp0W3ItMV0rdFtyXSxuPTE7bjxyOysrbillPWlbbl0vb1tuLTFdLG9bbl0tPWUsdVtuXS09ZSp1W24tMV07Zm9yKGlbci0xXT11W3ItMV0vb1tyLTFdLG49ci0yO24+PTA7LS1uKWlbbl09KHVbbl0taVtuKzFdKS9vW25dO2ZvcihvW3ItMV09KHRbcl0raVtyLTFdKS8yLG49MDtuPHItMTsrK24pb1tuXT0yKnRbbisxXS1pW24rMV07cmV0dXJuW2ksb119ZnVuY3Rpb24gcWModCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fdD1ufWZ1bmN0aW9uIExjKHQpe3JldHVybiBuZXcgcWModCwwKX1mdW5jdGlvbiBVYyh0KXtyZXR1cm4gbmV3IHFjKHQsMSl9ZnVuY3Rpb24gRGModCxuKXtyZXR1cm4gdFtuXX1mdW5jdGlvbiBPYyh0KXtmb3IodmFyIG4sZT0wLHI9LTEsaT10Lmxlbmd0aDsrK3I8aTspKG49K3Rbcl1bMV0pJiYoZSs9bik7cmV0dXJuIGV9ZnVuY3Rpb24gRmModCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gSWModCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gWWMoKXt0aGlzLl89bnVsbH1mdW5jdGlvbiBCYyh0KXt0LlU9dC5DPXQuTD10LlI9dC5QPXQuTj1udWxsfWZ1bmN0aW9uIGpjKHQsbil7dmFyIGU9bixyPW4uUixpPWUuVTtpP2kuTD09PWU/aS5MPXI6aS5SPXI6dC5fPXIsci5VPWksZS5VPXIsZS5SPXIuTCxlLlImJihlLlIuVT1lKSxyLkw9ZX1mdW5jdGlvbiBIYyh0LG4pe3ZhciBlPW4scj1uLkwsaT1lLlU7aT9pLkw9PT1lP2kuTD1yOmkuUj1yOnQuXz1yLHIuVT1pLGUuVT1yLGUuTD1yLlIsZS5MJiYoZS5MLlU9ZSksci5SPWV9ZnVuY3Rpb24gWGModCl7Zm9yKDt0Lkw7KXQ9dC5MO3JldHVybiB0fWZ1bmN0aW9uIFZjKHQsbixlLHIpe3ZhciBpPVtudWxsLG51bGxdLG89bXcucHVzaChpKS0xO3JldHVybiBpLmxlZnQ9dCxpLnJpZ2h0PW4sZSYmJGMoaSx0LG4sZSksciYmJGMoaSxuLHQscikseXdbdC5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobykseXdbbi5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksaX1mdW5jdGlvbiBXYyh0LG4sZSl7dmFyIHI9W24sZV07cmV0dXJuIHIubGVmdD10LHJ9ZnVuY3Rpb24gJGModCxuLGUscil7dFswXXx8dFsxXT90LmxlZnQ9PT1lP3RbMV09cjp0WzBdPXI6KHRbMF09cix0LmxlZnQ9bix0LnJpZ2h0PWUpfWZ1bmN0aW9uIFpjKHQsbixlLHIsaSl7dmFyIG8sdT10WzBdLGE9dFsxXSxjPXVbMF0scz11WzFdLGY9YVswXSxsPWFbMV0saD0wLHA9MSxkPWYtYyx2PWwtcztpZihvPW4tYyxkfHwhKG8+MCkpe2lmKG8vPWQsZDwwKXtpZihvPGgpcmV0dXJuO288cCYmKHA9byl9ZWxzZSBpZihkPjApe2lmKG8+cClyZXR1cm47bz5oJiYoaD1vKX1pZihvPXItYyxkfHwhKG88MCkpe2lmKG8vPWQsZDwwKXtpZihvPnApcmV0dXJuO28+aCYmKGg9byl9ZWxzZSBpZihkPjApe2lmKG88aClyZXR1cm47bzxwJiYocD1vKX1pZihvPWUtcyx2fHwhKG8+MCkpe2lmKG8vPXYsdjwwKXtpZihvPGgpcmV0dXJuO288cCYmKHA9byl9ZWxzZSBpZih2PjApe2lmKG8+cClyZXR1cm47bz5oJiYoaD1vKX1pZihvPWktcyx2fHwhKG88MCkpe2lmKG8vPXYsdjwwKXtpZihvPnApcmV0dXJuO28+aCYmKGg9byl9ZWxzZSBpZih2PjApe2lmKG88aClyZXR1cm47bzxwJiYocD1vKX1yZXR1cm4hKGg+MHx8cDwxKXx8KGg+MCYmKHRbMF09W2MraCpkLHMraCp2XSkscDwxJiYodFsxXT1bYytwKmQscytwKnZdKSwhMCl9fX19fWZ1bmN0aW9uIEdjKHQsbixlLHIsaSl7dmFyIG89dFsxXTtpZihvKXJldHVybiEwO3ZhciB1LGEsYz10WzBdLHM9dC5sZWZ0LGY9dC5yaWdodCxsPXNbMF0saD1zWzFdLHA9ZlswXSxkPWZbMV0sdj0obCtwKS8yLF89KGgrZCkvMjtpZihkPT09aCl7aWYodjxufHx2Pj1yKXJldHVybjtpZihsPnApe2lmKGMpe2lmKGNbMV0+PWkpcmV0dXJufWVsc2UgYz1bdixlXTtvPVt2LGldfWVsc2V7aWYoYyl7aWYoY1sxXTxlKXJldHVybn1lbHNlIGM9W3YsaV07bz1bdixlXX19ZWxzZSBpZih1PShsLXApLyhkLWgpLGE9Xy11KnYsdTwtMXx8dT4xKWlmKGw+cCl7aWYoYyl7aWYoY1sxXT49aSlyZXR1cm59ZWxzZSBjPVsoZS1hKS91LGVdO289WyhpLWEpL3UsaV19ZWxzZXtpZihjKXtpZihjWzFdPGUpcmV0dXJufWVsc2UgYz1bKGktYSkvdSxpXTtvPVsoZS1hKS91LGVdfWVsc2UgaWYoaDxkKXtpZihjKXtpZihjWzBdPj1yKXJldHVybn1lbHNlIGM9W24sdSpuK2FdO289W3IsdSpyK2FdfWVsc2V7aWYoYyl7aWYoY1swXTxuKXJldHVybn1lbHNlIGM9W3IsdSpyK2FdO289W24sdSpuK2FdfXJldHVybiB0WzBdPWMsdFsxXT1vLCEwfWZ1bmN0aW9uIEpjKHQsbixlLHIpe2Zvcih2YXIgaSxvPW13Lmxlbmd0aDtvLS07KUdjKGk9bXdbb10sdCxuLGUscikmJlpjKGksdCxuLGUscikmJihNYXRoLmFicyhpWzBdWzBdLWlbMV1bMF0pPnd3fHxNYXRoLmFicyhpWzBdWzFdLWlbMV1bMV0pPnd3KXx8ZGVsZXRlIG13W29dfWZ1bmN0aW9uIFFjKHQpe3JldHVybiB5d1t0LmluZGV4XT17c2l0ZTp0LGhhbGZlZGdlczpbXX19ZnVuY3Rpb24gS2ModCxuKXt2YXIgZT10LnNpdGUscj1uLmxlZnQsaT1uLnJpZ2h0O3JldHVybiBlPT09aSYmKGk9cixyPWUpLGk/TWF0aC5hdGFuMihpWzFdLXJbMV0saVswXS1yWzBdKTooZT09PXI/KHI9blsxXSxpPW5bMF0pOihyPW5bMF0saT1uWzFdKSxNYXRoLmF0YW4yKHJbMF0taVswXSxpWzFdLXJbMV0pKX1mdW5jdGlvbiB0cyh0LG4pe3JldHVybiBuWysobi5sZWZ0IT09dC5zaXRlKV19ZnVuY3Rpb24gbnModCxuKXtyZXR1cm4gblsrKG4ubGVmdD09PXQuc2l0ZSldfWZ1bmN0aW9uIGVzKCl7Zm9yKHZhciB0LG4sZSxyLGk9MCxvPXl3Lmxlbmd0aDtpPG87KytpKWlmKCh0PXl3W2ldKSYmKHI9KG49dC5oYWxmZWRnZXMpLmxlbmd0aCkpe3ZhciB1PW5ldyBBcnJheShyKSxhPW5ldyBBcnJheShyKTtmb3IoZT0wO2U8cjsrK2UpdVtlXT1lLGFbZV09S2ModCxtd1tuW2VdXSk7Zm9yKHUuc29ydChmdW5jdGlvbih0LG4pe3JldHVybiBhW25dLWFbdF19KSxlPTA7ZTxyOysrZSlhW2VdPW5bdVtlXV07Zm9yKGU9MDtlPHI7KytlKW5bZV09YVtlXX19ZnVuY3Rpb24gcnModCxuLGUscil7dmFyIGksbyx1LGEsYyxzLGYsbCxoLHAsZCx2LF89eXcubGVuZ3RoLHk9ITA7Zm9yKGk9MDtpPF87KytpKWlmKG89eXdbaV0pe2Zvcih1PW8uc2l0ZSxjPW8uaGFsZmVkZ2VzLGE9Yy5sZW5ndGg7YS0tOyltd1tjW2FdXXx8Yy5zcGxpY2UoYSwxKTtmb3IoYT0wLHM9Yy5sZW5ndGg7YTxzOylwPW5zKG8sbXdbY1thXV0pLGQ9cFswXSx2PXBbMV0sZj10cyhvLG13W2NbKythJXNdXSksbD1mWzBdLGg9ZlsxXSwoTWF0aC5hYnMoZC1sKT53d3x8TWF0aC5hYnModi1oKT53dykmJihjLnNwbGljZShhLDAsbXcucHVzaChXYyh1LHAsTWF0aC5hYnMoZC10KTx3dyYmci12Pnd3P1t0LE1hdGguYWJzKGwtdCk8d3c/aDpyXTpNYXRoLmFicyh2LXIpPHd3JiZlLWQ+d3c/W01hdGguYWJzKGgtcik8d3c/bDplLHJdOk1hdGguYWJzKGQtZSk8d3cmJnYtbj53dz9bZSxNYXRoLmFicyhsLWUpPHd3P2g6bl06TWF0aC5hYnModi1uKTx3dyYmZC10Pnd3P1tNYXRoLmFicyhoLW4pPHd3P2w6dCxuXTpudWxsKSktMSksKytzKTtzJiYoeT0hMSl9aWYoeSl7dmFyIGcsbSx4LGI9MS8wO2ZvcihpPTAseT1udWxsO2k8XzsrK2kpKG89eXdbaV0pJiYodT1vLnNpdGUsZz11WzBdLXQsbT11WzFdLW4seD1nKmcrbSptLHg8YiYmKGI9eCx5PW8pKTtpZih5KXt2YXIgdz1bdCxuXSxNPVt0LHJdLFQ9W2Uscl0sTj1bZSxuXTt5LmhhbGZlZGdlcy5wdXNoKG13LnB1c2goV2ModT15LnNpdGUsdyxNKSktMSxtdy5wdXNoKFdjKHUsTSxUKSktMSxtdy5wdXNoKFdjKHUsVCxOKSktMSxtdy5wdXNoKFdjKHUsTix3KSktMSl9fWZvcihpPTA7aTxfOysraSkobz15d1tpXSkmJihvLmhhbGZlZGdlcy5sZW5ndGh8fGRlbGV0ZSB5d1tpXSl9ZnVuY3Rpb24gaXMoKXtCYyh0aGlzKSx0aGlzLng9dGhpcy55PXRoaXMuYXJjPXRoaXMuc2l0ZT10aGlzLmN5PW51bGx9ZnVuY3Rpb24gb3ModCl7dmFyIG49dC5QLGU9dC5OO2lmKG4mJmUpe3ZhciByPW4uc2l0ZSxpPXQuc2l0ZSxvPWUuc2l0ZTtpZihyIT09byl7dmFyIHU9aVswXSxhPWlbMV0sYz1yWzBdLXUscz1yWzFdLWEsZj1vWzBdLXUsbD1vWzFdLWEsaD0yKihjKmwtcypmKTtpZighKGg+PS1Ndykpe3ZhciBwPWMqYytzKnMsZD1mKmYrbCpsLHY9KGwqcC1zKmQpL2gsXz0oYypkLWYqcCkvaCx5PXh3LnBvcCgpfHxuZXcgaXM7eS5hcmM9dCx5LnNpdGU9aSx5Lng9dit1LHkueT0oeS5jeT1fK2EpK01hdGguc3FydCh2KnYrXypfKSx0LmNpcmNsZT15O2Zvcih2YXIgZz1udWxsLG09Z3cuXzttOylpZih5Lnk8bS55fHx5Lnk9PT1tLnkmJnkueDw9bS54KXtpZighbS5MKXtnPW0uUDticmVha31tPW0uTH1lbHNle2lmKCFtLlIpe2c9bTticmVha31tPW0uUn1ndy5pbnNlcnQoZyx5KSxnfHwodnc9eSl9fX19ZnVuY3Rpb24gdXModCl7dmFyIG49dC5jaXJjbGU7biYmKG4uUHx8KHZ3PW4uTiksZ3cucmVtb3ZlKG4pLHh3LnB1c2gobiksQmMobiksdC5jaXJjbGU9bnVsbCl9ZnVuY3Rpb24gYXMoKXtCYyh0aGlzKSx0aGlzLmVkZ2U9dGhpcy5zaXRlPXRoaXMuY2lyY2xlPW51bGx9ZnVuY3Rpb24gY3ModCl7dmFyIG49YncucG9wKCl8fG5ldyBhcztyZXR1cm4gbi5zaXRlPXQsbn1mdW5jdGlvbiBzcyh0KXt1cyh0KSxfdy5yZW1vdmUodCksYncucHVzaCh0KSxCYyh0KX1mdW5jdGlvbiBmcyh0KXt2YXIgbj10LmNpcmNsZSxlPW4ueCxyPW4uY3ksaT1bZSxyXSxvPXQuUCx1PXQuTixhPVt0XTtzcyh0KTtmb3IodmFyIGM9bztjLmNpcmNsZSYmTWF0aC5hYnMoZS1jLmNpcmNsZS54KTx3dyYmTWF0aC5hYnMoci1jLmNpcmNsZS5jeSk8d3c7KW89Yy5QLGEudW5zaGlmdChjKSxzcyhjKSxjPW87YS51bnNoaWZ0KGMpLHVzKGMpO2Zvcih2YXIgcz11O3MuY2lyY2xlJiZNYXRoLmFicyhlLXMuY2lyY2xlLngpPHd3JiZNYXRoLmFicyhyLXMuY2lyY2xlLmN5KTx3dzspdT1zLk4sYS5wdXNoKHMpLHNzKHMpLHM9dTthLnB1c2gocyksdXMocyk7dmFyIGYsbD1hLmxlbmd0aDtmb3IoZj0xO2Y8bDsrK2Ypcz1hW2ZdLGM9YVtmLTFdLCRjKHMuZWRnZSxjLnNpdGUscy5zaXRlLGkpO2M9YVswXSxzPWFbbC0xXSxzLmVkZ2U9VmMoYy5zaXRlLHMuc2l0ZSxudWxsLGkpLG9zKGMpLG9zKHMpfWZ1bmN0aW9uIGxzKHQpe2Zvcih2YXIgbixlLHIsaSxvPXRbMF0sdT10WzFdLGE9X3cuXzthOylpZihyPWhzKGEsdSktbyxyPnd3KWE9YS5MO2Vsc2V7aWYoaT1vLXBzKGEsdSksIShpPnd3KSl7cj4td3c/KG49YS5QLGU9YSk6aT4td3c/KG49YSxlPWEuTik6bj1lPWE7YnJlYWt9aWYoIWEuUil7bj1hO2JyZWFrfWE9YS5SfVFjKHQpO3ZhciBjPWNzKHQpO2lmKF93Lmluc2VydChuLGMpLG58fGUpe2lmKG49PT1lKXJldHVybiB1cyhuKSxlPWNzKG4uc2l0ZSksX3cuaW5zZXJ0KGMsZSksYy5lZGdlPWUuZWRnZT1WYyhuLnNpdGUsYy5zaXRlKSxvcyhuKSx2b2lkIG9zKGUpO2lmKCFlKXJldHVybiB2b2lkKGMuZWRnZT1WYyhuLnNpdGUsYy5zaXRlKSk7dXMobiksdXMoZSk7dmFyIHM9bi5zaXRlLGY9c1swXSxsPXNbMV0saD10WzBdLWYscD10WzFdLWwsZD1lLnNpdGUsdj1kWzBdLWYsXz1kWzFdLWwseT0yKihoKl8tcCp2KSxnPWgqaCtwKnAsbT12KnYrXypfLHg9WyhfKmctcCptKS95K2YsKGgqbS12KmcpL3krbF07JGMoZS5lZGdlLHMsZCx4KSxjLmVkZ2U9VmMocyx0LG51bGwseCksZS5lZGdlPVZjKHQsZCxudWxsLHgpLG9zKG4pLG9zKGUpfX1mdW5jdGlvbiBocyh0LG4pe3ZhciBlPXQuc2l0ZSxyPWVbMF0saT1lWzFdLG89aS1uO2lmKCFvKXJldHVybiByO3ZhciB1PXQuUDtpZighdSlyZXR1cm4tKDEvMCk7ZT11LnNpdGU7dmFyIGE9ZVswXSxjPWVbMV0scz1jLW47aWYoIXMpcmV0dXJuIGE7dmFyIGY9YS1yLGw9MS9vLTEvcyxoPWYvcztyZXR1cm4gbD8oLWgrTWF0aC5zcXJ0KGgqaC0yKmwqKGYqZi8oLTIqcyktYytzLzIraS1vLzIpKSkvbCtyOihyK2EpLzJ9ZnVuY3Rpb24gcHModCxuKXt2YXIgZT10Lk47aWYoZSlyZXR1cm4gaHMoZSxuKTt2YXIgcj10LnNpdGU7cmV0dXJuIHJbMV09PT1uP3JbMF06MS8wfWZ1bmN0aW9uIGRzKHQsbixlKXtyZXR1cm4odFswXS1lWzBdKSooblsxXS10WzFdKS0odFswXS1uWzBdKSooZVsxXS10WzFdKX1mdW5jdGlvbiB2cyh0LG4pe3JldHVybiBuWzFdLXRbMV18fG5bMF0tdFswXX1mdW5jdGlvbiBfcyh0LG4pe3ZhciBlLHIsaSxvPXQuc29ydCh2cykucG9wKCk7Zm9yKG13PVtdLHl3PW5ldyBBcnJheSh0Lmxlbmd0aCksX3c9bmV3IFljLGd3PW5ldyBZYzs7KWlmKGk9dncsbyYmKCFpfHxvWzFdPGkueXx8b1sxXT09PWkueSYmb1swXTxpLngpKW9bMF09PT1lJiZvWzFdPT09cnx8KGxzKG8pLGU9b1swXSxyPW9bMV0pLG89dC5wb3AoKTtlbHNle2lmKCFpKWJyZWFrO2ZzKGkuYXJjKX1pZihlcygpLG4pe3ZhciB1PStuWzBdWzBdLGE9K25bMF1bMV0sYz0rblsxXVswXSxzPStuWzFdWzFdO0pjKHUsYSxjLHMpLHJzKHUsYSxjLHMpfXRoaXMuZWRnZXM9bXcsdGhpcy5jZWxscz15dyxfdz1ndz1tdz15dz1udWxsfWZ1bmN0aW9uIHlzKHQsbixlKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1uLHRoaXMudHJhbnNmb3JtPWV9ZnVuY3Rpb24gZ3ModCxuLGUpe3RoaXMuaz10LHRoaXMueD1uLHRoaXMueT1lfWZ1bmN0aW9uIG1zKHQpe3JldHVybiB0Ll9fem9vbXx8a3d9ZnVuY3Rpb24geHMoKXt0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIGJzKCl7cmV0dXJuIXQuZXZlbnQuYnV0dG9ufWZ1bmN0aW9uIHdzKCl7dmFyIHQsbixlPXRoaXM7cmV0dXJuIGUgaW5zdGFuY2VvZiBTVkdFbGVtZW50PyhlPWUub3duZXJTVkdFbGVtZW50fHxlLHQ9ZS53aWR0aC5iYXNlVmFsLnZhbHVlLG49ZS5oZWlnaHQuYmFzZVZhbC52YWx1ZSk6KHQ9ZS5jbGllbnRXaWR0aCxuPWUuY2xpZW50SGVpZ2h0KSxbWzAsMF0sW3Qsbl1dfWZ1bmN0aW9uIE1zKCl7cmV0dXJuIHRoaXMuX196b29tfHxrd312YXIgVHM9IjQuNS4wIixOcz1mdW5jdGlvbih0LG4pe3JldHVybiB0PG4/LTE6dD5uPzE6dD49bj8wOk5hTn0sa3M9ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10Lmxlbmd0aCYmKHQ9bih0KSkse2xlZnQ6ZnVuY3Rpb24obixlLHIsaSl7Zm9yKG51bGw9PXImJihyPTApLG51bGw9PWkmJihpPW4ubGVuZ3RoKTtyPGk7KXt2YXIgbz1yK2k+Pj4xO3QobltvXSxlKTwwP3I9bysxOmk9b31yZXR1cm4gcn0scmlnaHQ6ZnVuY3Rpb24obixlLHIsaSl7Zm9yKG51bGw9PXImJihyPTApLG51bGw9PWkmJihpPW4ubGVuZ3RoKTtyPGk7KXt2YXIgbz1yK2k+Pj4xO3QobltvXSxlKT4wP2k9bzpyPW8rMX1yZXR1cm4gcn19fSxTcz1rcyhOcyksRXM9U3MucmlnaHQsQXM9U3MubGVmdCxDcz1mdW5jdGlvbih0LG4pe3JldHVybiBuPHQ/LTE6bj50PzE6bj49dD8wOk5hTn0senM9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PT10P05hTjordH0sUHM9ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk9dC5sZW5ndGgsbz0wLHU9MCxhPS0xLGM9MDtpZihudWxsPT1uKWZvcig7KythPGk7KWlzTmFOKGU9enModFthXSkpfHwocj1lLW8sbys9ci8rK2MsdSs9ciooZS1vKSk7ZWxzZSBmb3IoOysrYTxpOylpc05hTihlPXpzKG4odFthXSxhLHQpKSl8fChyPWUtbyxvKz1yLysrYyx1Kz1yKihlLW8pKTtpZihjPjEpcmV0dXJuIHUvKGMtMSl9LFJzPWZ1bmN0aW9uKHQsbil7dmFyIGU9UHModCxuKTtyZXR1cm4gZT9NYXRoLnNxcnQoZSk6ZX0scXM9ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGksbz0tMSx1PXQubGVuZ3RoO2lmKG51bGw9PW4pe2Zvcig7KytvPHU7KWlmKG51bGwhPShyPXRbb10pJiZyPj1yKXtlPWk9cjticmVha31mb3IoOysrbzx1OyludWxsIT0ocj10W29dKSYmKGU+ciYmKGU9ciksaTxyJiYoaT1yKSl9ZWxzZXtmb3IoOysrbzx1OylpZihudWxsIT0ocj1uKHRbb10sbyx0KSkmJnI+PXIpe2U9aT1yO2JyZWFrfWZvcig7KytvPHU7KW51bGwhPShyPW4odFtvXSxvLHQpKSYmKGU+ciYmKGU9ciksaTxyJiYoaT1yKSl9cmV0dXJuW2UsaV19LExzPUFycmF5LnByb3RvdHlwZSxVcz1Mcy5zbGljZSxEcz1Mcy5tYXAsT3M9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSxGcz1mdW5jdGlvbih0KXtyZXR1cm4gdH0sSXM9ZnVuY3Rpb24odCxuLGUpe3Q9K3Qsbj0rbixlPShpPWFyZ3VtZW50cy5sZW5ndGgpPDI/KG49dCx0PTAsMSk6aTwzPzE6K2U7Zm9yKHZhciByPS0xLGk9MHxNYXRoLm1heCgwLE1hdGguY2VpbCgobi10KS9lKSksbz1uZXcgQXJyYXkoaSk7KytyPGk7KW9bcl09dCtyKmU7cmV0dXJuIG99LFlzPU1hdGguc3FydCg1MCksQnM9TWF0aC5zcXJ0KDEwKSxqcz1NYXRoLnNxcnQoMiksSHM9ZnVuY3Rpb24odCxuLHIpe3ZhciBpPWUodCxuLHIpO3JldHVybiBJcyhNYXRoLmNlaWwodC9pKSppLE1hdGguZmxvb3Iobi9pKSppK2kvMixpKX0sWHM9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguY2VpbChNYXRoLmxvZyh0Lmxlbmd0aCkvTWF0aC5MTjIpKzF9LFZzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgaSxvLHU9dC5sZW5ndGgsYT1uZXcgQXJyYXkodSk7Zm9yKGk9MDtpPHU7KytpKWFbaV09bih0W2ldLGksdCk7dmFyIGM9ZShhKSxzPWNbMF0sZj1jWzFdLGw9cihhLHMsZik7QXJyYXkuaXNBcnJheShsKXx8KGw9SHMocyxmLGwpKTtmb3IodmFyIGg9bC5sZW5ndGg7bFswXTw9czspbC5zaGlmdCgpLC0taDtmb3IoO2xbaC0xXT49ZjspbC5wb3AoKSwtLWg7dmFyIHAsZD1uZXcgQXJyYXkoaCsxKTtmb3IoaT0wO2k8PWg7KytpKXA9ZFtpXT1bXSxwLngwPWk+MD9sW2ktMV06cyxwLngxPWk8aD9sW2ldOmY7Zm9yKGk9MDtpPHU7KytpKW89YVtpXSxzPD1vJiZvPD1mJiZkW0VzKGwsbywwLGgpXS5wdXNoKHRbaV0pO3JldHVybiBkfXZhciBuPUZzLGU9cXMscj1YcztyZXR1cm4gdC52YWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOk9zKGUpLHQpOm59LHQuZG9tYWluPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246T3MoW25bMF0sblsxXV0pLHQpOmV9LHQudGhyZXNob2xkcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOk9zKEFycmF5LmlzQXJyYXkobik/VXMuY2FsbChuKTpuKSx0KTpyfSx0fSxXcz1mdW5jdGlvbih0LG4sZSl7aWYobnVsbD09ZSYmKGU9enMpLHI9dC5sZW5ndGgpe2lmKChuPStuKTw9MHx8cjwyKXJldHVybitlKHRbMF0sMCx0KTtpZihuPj0xKXJldHVybitlKHRbci0xXSxyLTEsdCk7dmFyIHIsaT0oci0xKSpuLG89TWF0aC5mbG9vcihpKSx1PStlKHRbb10sbyx0KSxhPStlKHRbbysxXSxvKzEsdCk7cmV0dXJuIHUrKGEtdSkqKGktbyl9fSwkcz1mdW5jdGlvbih0LG4sZSl7cmV0dXJuIHQ9RHMuY2FsbCh0LHpzKS5zb3J0KE5zKSxNYXRoLmNlaWwoKGUtbikvKDIqKFdzKHQsLjc1KS1Xcyh0LC4yNSkpKk1hdGgucG93KHQubGVuZ3RoLC0xLzMpKSl9LFpzPWZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gTWF0aC5jZWlsKChlLW4pLygzLjUqUnModCkqTWF0aC5wb3codC5sZW5ndGgsLTEvMykpKX0sR3M9ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk9LTEsbz10Lmxlbmd0aDtpZihudWxsPT1uKXtmb3IoOysraTxvOylpZihudWxsIT0ocj10W2ldKSYmcj49cil7ZT1yO2JyZWFrfWZvcig7KytpPG87KW51bGwhPShyPXRbaV0pJiZyPmUmJihlPXIpfWVsc2V7Zm9yKDsrK2k8bzspaWYobnVsbCE9KHI9bih0W2ldLGksdCkpJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK2k8bzspbnVsbCE9KHI9bih0W2ldLGksdCkpJiZyPmUmJihlPXIpfXJldHVybiBlfSxKcz1mdW5jdGlvbih0LG4pe3ZhciBlLHI9MCxpPXQubGVuZ3RoLG89LTEsdT1pO2lmKG51bGw9PW4pZm9yKDsrK288aTspaXNOYU4oZT16cyh0W29dKSk/LS11OnIrPWU7ZWxzZSBmb3IoOysrbzxpOylpc05hTihlPXpzKG4odFtvXSxvLHQpKSk/LS11OnIrPWU7aWYodSlyZXR1cm4gci91fSxRcz1mdW5jdGlvbih0LG4pe3ZhciBlLHI9W10saT10Lmxlbmd0aCxvPS0xO2lmKG51bGw9PW4pZm9yKDsrK288aTspaXNOYU4oZT16cyh0W29dKSl8fHIucHVzaChlKTtlbHNlIGZvcig7KytvPGk7KWlzTmFOKGU9enMobih0W29dLG8sdCkpKXx8ci5wdXNoKGUpO3JldHVybiBXcyhyLnNvcnQoTnMpLC41KX0sS3M9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscixpPXQubGVuZ3RoLG89LTEsdT0wOysrbzxpOyl1Kz10W29dLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkodSk7LS1pPj0wOylmb3Iocj10W2ldLG49ci5sZW5ndGg7LS1uPj0wOyllWy0tdV09cltuXTtyZXR1cm4gZX0sdGY9ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk9LTEsbz10Lmxlbmd0aDtpZihudWxsPT1uKXtmb3IoOysraTxvOylpZihudWxsIT0ocj10W2ldKSYmcj49cil7ZT1yO2JyZWFrfWZvcig7KytpPG87KW51bGwhPShyPXRbaV0pJiZlPnImJihlPXIpfWVsc2V7Zm9yKDsrK2k8bzspaWYobnVsbCE9KHI9bih0W2ldLGksdCkpJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK2k8bzspbnVsbCE9KHI9bih0W2ldLGksdCkpJiZlPnImJihlPXIpfXJldHVybiBlfSxuZj1mdW5jdGlvbih0KXtmb3IodmFyIG49MCxlPXQubGVuZ3RoLTEscj10WzBdLGk9bmV3IEFycmF5KGU8MD8wOmUpO248ZTspaVtuXT1bcixyPXRbKytuXV07cmV0dXJuIGl9LGVmPWZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpO2UtLTspcltlXT10W25bZV1dO3JldHVybiByfSxyZj1mdW5jdGlvbih0LG4pe2lmKGU9dC5sZW5ndGgpe3ZhciBlLHIsaT0wLG89MCx1PXRbb107Zm9yKG58fChuPU5zKTsrK2k8ZTspKG4ocj10W2ldLHUpPDB8fDAhPT1uKHUsdSkpJiYodT1yLG89aSk7cmV0dXJuIDA9PT1uKHUsdSk/bzp2b2lkIDB9fSxvZj1mdW5jdGlvbih0LG4sZSl7Zm9yKHZhciByLGksbz0obnVsbD09ZT90Lmxlbmd0aDplKS0obj1udWxsPT1uPzA6K24pO287KWk9TWF0aC5yYW5kb20oKSpvLS18MCxyPXRbbytuXSx0W28rbl09dFtpK25dLHRbaStuXT1yO3JldHVybiB0fSx1Zj1mdW5jdGlvbih0LG4pe3ZhciBlLHI9MCxpPXQubGVuZ3RoLG89LTE7aWYobnVsbD09bilmb3IoOysrbzxpOykoZT0rdFtvXSkmJihyKz1lKTtlbHNlIGZvcig7KytvPGk7KShlPStuKHRbb10sbyx0KSkmJihyKz1lKTtyZXR1cm4gcn0sYWY9ZnVuY3Rpb24odCl7aWYoIShvPXQubGVuZ3RoKSlyZXR1cm5bXTtmb3IodmFyIG49LTEsZT10Zih0LHIpLGk9bmV3IEFycmF5KGUpOysrbjxlOylmb3IodmFyIG8sdT0tMSxhPWlbbl09bmV3IEFycmF5KG8pOysrdTxvOylhW3VdPXRbdV1bbl07cmV0dXJuIGl9LGNmPWZ1bmN0aW9uKCl7cmV0dXJuIGFmKGFyZ3VtZW50cyl9LHNmPUFycmF5LnByb3RvdHlwZS5zbGljZSxmZj1mdW5jdGlvbih0KXtyZXR1cm4gdH0sbGY9MSxoZj0yLHBmPTMsZGY9NCx2Zj0xZS02LF9mPXt2YWx1ZTpmdW5jdGlvbigpe319O2QucHJvdG90eXBlPXAucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpkLG9uOmZ1bmN0aW9uKHQsbil7dmFyIGUscj10aGlzLl8saT12KHQrIiIsciksbz0tMSx1PWkubGVuZ3RoO3tpZighKGFyZ3VtZW50cy5sZW5ndGg8Mikpe2lmKG51bGwhPW4mJiJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjazogIituKTtmb3IoOysrbzx1OylpZihlPSh0PWlbb10pLnR5cGUpcltlXT15KHJbZV0sdC5uYW1lLG4pO2Vsc2UgaWYobnVsbD09bilmb3IoZSBpbiByKXJbZV09eShyW2VdLHQubmFtZSxudWxsKTtyZXR1cm4gdGhpc31mb3IoOysrbzx1OylpZigoZT0odD1pW29dKS50eXBlKSYmKGU9XyhyW2VdLHQubmFtZSkpKXJldHVybiBlfX0sY29weTpmdW5jdGlvbigpe3ZhciB0PXt9LG49dGhpcy5fO2Zvcih2YXIgZSBpbiBuKXRbZV09bltlXS5zbGljZSgpO3JldHVybiBuZXcgZCh0KX0sY2FsbDpmdW5jdGlvbih0LG4pe2lmKChlPWFyZ3VtZW50cy5sZW5ndGgtMik+MClmb3IodmFyIGUscixpPW5ldyBBcnJheShlKSxvPTA7bzxlOysrbylpW29dPWFyZ3VtZW50c1tvKzJdO2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKHI9dGhpcy5fW3RdLG89MCxlPXIubGVuZ3RoO288ZTsrK28pcltvXS52YWx1ZS5hcHBseShuLGkpfSxhcHBseTpmdW5jdGlvbih0LG4sZSl7aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3IodmFyIHI9dGhpcy5fW3RdLGk9MCxvPXIubGVuZ3RoO2k8bzsrK2kpcltpXS52YWx1ZS5hcHBseShuLGUpfX07dmFyIHlmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIixnZj17c3ZnOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIseGh0bWw6eWYseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifSxtZj1mdW5jdGlvbih0KXt2YXIgbj10Kz0iIixlPW4uaW5kZXhPZigiOiIpO3JldHVybiBlPj0wJiYieG1sbnMiIT09KG49dC5zbGljZSgwLGUpKSYmKHQ9dC5zbGljZShlKzEpKSxnZi5oYXNPd25Qcm9wZXJ0eShuKT97c3BhY2U6Z2Zbbl0sbG9jYWw6dH06dH0seGY9ZnVuY3Rpb24odCl7dmFyIG49bWYodCk7cmV0dXJuKG4ubG9jYWw/bTpnKShuKX0sYmY9MDtiLnByb3RvdHlwZT14LnByb3RvdHlwZT17Y29uc3RydWN0b3I6YixnZXQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMuXzshKG4gaW4gdCk7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybjtyZXR1cm4gdFtuXX0sc2V0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbdGhpcy5fXT1ufSxyZW1vdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuXyBpbiB0JiZkZWxldGUgdFt0aGlzLl9dfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl99fTt2YXIgd2Y9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF0Y2hlcyh0KX19O2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQpe3ZhciBNZj1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7aWYoIU1mLm1hdGNoZXMpe3ZhciBUZj1NZi53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fE1mLm1zTWF0Y2hlc1NlbGVjdG9yfHxNZi5tb3pNYXRjaGVzU2VsZWN0b3J8fE1mLm9NYXRjaGVzU2VsZWN0b3I7d2Y9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIFRmLmNhbGwodGhpcyx0KX19fX12YXIgTmY9d2Ysa2Y9e307aWYodC5ldmVudD1udWxsLCJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQpe3ZhciBTZj1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7Im9ubW91c2VlbnRlciJpbiBTZnx8KGtmPXttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0pfXZhciBFZj1mdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvPVQodCsiIiksdT1vLmxlbmd0aDt7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtmb3IoYT1uP2s6TixudWxsPT1lJiYoZT0hMSkscj0wO3I8dTsrK3IpdGhpcy5lYWNoKGEob1tyXSxuLGUpKTtyZXR1cm4gdGhpc312YXIgYT10aGlzLm5vZGUoKS5fX29uO2lmKGEpZm9yKHZhciBjLHM9MCxmPWEubGVuZ3RoO3M8ZjsrK3MpZm9yKHI9MCxjPWFbc107cjx1OysrcilpZigoaT1vW3JdKS50eXBlPT09Yy50eXBlJiZpLm5hbWU9PT1jLm5hbWUpcmV0dXJuIGMudmFsdWV9fSxBZj1mdW5jdGlvbigpe2Zvcih2YXIgbixlPXQuZXZlbnQ7bj1lLnNvdXJjZUV2ZW50OyllPW47cmV0dXJuIGV9LENmPWZ1bmN0aW9uKHQsbil7dmFyIGU9dC5vd25lclNWR0VsZW1lbnR8fHQ7aWYoZS5jcmVhdGVTVkdQb2ludCl7dmFyIHI9ZS5jcmVhdGVTVkdQb2ludCgpO3JldHVybiByLng9bi5jbGllbnRYLHIueT1uLmNsaWVudFkscj1yLm1hdHJpeFRyYW5zZm9ybSh0LmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSksW3IueCxyLnldfXZhciBpPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuW24uY2xpZW50WC1pLmxlZnQtdC5jbGllbnRMZWZ0LG4uY2xpZW50WS1pLnRvcC10LmNsaWVudFRvcF19LHpmPWZ1bmN0aW9uKHQpe3ZhciBuPUFmKCk7cmV0dXJuIG4uY2hhbmdlZFRvdWNoZXMmJihuPW4uY2hhbmdlZFRvdWNoZXNbMF0pLENmKHQsbil9LFBmPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P0U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHQpfX0sUmY9ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVBmKHQpKTtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9bi5sZW5ndGgscj1uZXcgQXJyYXkoZSksaT0wO2k8ZTsrK2kpZm9yKHZhciBvLHUsYT1uW2ldLGM9YS5sZW5ndGgscz1yW2ldPW5ldyBBcnJheShjKSxmPTA7ZjxjOysrZikobz1hW2ZdKSYmKHU9dC5jYWxsKG8sby5fX2RhdGFfXyxmLGEpKSYmKCJfX2RhdGFfXyJpbiBvJiYodS5fX2RhdGFfXz1vLl9fZGF0YV9fKSxzW2ZdPXUpO3JldHVybiBuZXcgcHQocix0aGlzLl9wYXJlbnRzKX0scWY9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/QTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwodCl9fSxMZj1mdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9cWYodCkpO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT1uLmxlbmd0aCxyPVtdLGk9W10sbz0wO288ZTsrK28pZm9yKHZhciB1LGE9bltvXSxjPWEubGVuZ3RoLHM9MDtzPGM7KytzKSh1PWFbc10pJiYoci5wdXNoKHQuY2FsbCh1LHUuX19kYXRhX18scyxhKSksaS5wdXNoKHUpKTtyZXR1cm4gbmV3IHB0KHIsaSl9LFVmPWZ1bmN0aW9uKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1OZih0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyx1PW5baV0sYT11Lmxlbmd0aCxjPXJbaV09W10scz0wO3M8YTsrK3MpKG89dVtzXSkmJnQuY2FsbChvLG8uX19kYXRhX18scyx1KSYmYy5wdXNoKG8pO3JldHVybiBuZXcgcHQocix0aGlzLl9wYXJlbnRzKX0sRGY9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBBcnJheSh0Lmxlbmd0aCl9LE9mPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBwdCh0aGlzLl9lbnRlcnx8dGhpcy5fZ3JvdXBzLm1hcChEZiksdGhpcy5fcGFyZW50cyl9O0MucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpDLGFwcGVuZENoaWxkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsdGhpcy5fbmV4dCl9LGluc2VydEJlZm9yZTpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsbil9LHF1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHQpfSxxdWVyeVNlbGVjdG9yQWxsOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbCh0KX19O3ZhciBGZj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19LElmPSIkIixZZj1mdW5jdGlvbih0LG4pe2lmKCF0KXJldHVybiBwPW5ldyBBcnJheSh0aGlzLnNpemUoKSkscz0tMSx0aGlzLmVhY2goZnVuY3Rpb24odCl7cFsrK3NdPXR9KSxwO3ZhciBlPW4/UDp6LHI9dGhpcy5fcGFyZW50cyxpPXRoaXMuX2dyb3VwczsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9RmYodCkpO2Zvcih2YXIgbz1pLmxlbmd0aCx1PW5ldyBBcnJheShvKSxhPW5ldyBBcnJheShvKSxjPW5ldyBBcnJheShvKSxzPTA7czxvOysrcyl7dmFyIGY9cltzXSxsPWlbc10saD1sLmxlbmd0aCxwPXQuY2FsbChmLGYmJmYuX19kYXRhX18scyxyKSxkPXAubGVuZ3RoLHY9YVtzXT1uZXcgQXJyYXkoZCksXz11W3NdPW5ldyBBcnJheShkKSx5PWNbc109bmV3IEFycmF5KGgpO2UoZixsLHYsXyx5LHAsbik7Zm9yKHZhciBnLG0seD0wLGI9MDt4PGQ7Kyt4KWlmKGc9dlt4XSl7Zm9yKHg+PWImJihiPXgrMSk7IShtPV9bYl0pJiYrK2I8ZDspO2cuX25leHQ9bXx8bnVsbH19cmV0dXJuIHU9bmV3IHB0KHUsciksdS5fZW50ZXI9YSx1Ll9leGl0PWMsdX0sQmY9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHB0KHRoaXMuX2V4aXR8fHRoaXMuX2dyb3Vwcy5tYXAoRGYpLHRoaXMuX3BhcmVudHMpfSxqZj1mdW5jdGlvbih0KXtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9dC5fZ3JvdXBzLHI9bi5sZW5ndGgsaT1lLmxlbmd0aCxvPU1hdGgubWluKHIsaSksdT1uZXcgQXJyYXkociksYT0wO2E8bzsrK2EpZm9yKHZhciBjLHM9blthXSxmPWVbYV0sbD1zLmxlbmd0aCxoPXVbYV09bmV3IEFycmF5KGwpLHA9MDtwPGw7KytwKShjPXNbcF18fGZbcF0pJiYoaFtwXT1jKTtmb3IoO2E8cjsrK2EpdVthXT1uW2FdO3JldHVybiBuZXcgcHQodSx0aGlzLl9wYXJlbnRzKX0sSGY9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLG49LTEsZT10Lmxlbmd0aDsrK248ZTspZm9yKHZhciByLGk9dFtuXSxvPWkubGVuZ3RoLTEsdT1pW29dOy0tbz49MDspKHI9aVtvXSkmJih1JiZ1IT09ci5uZXh0U2libGluZyYmdS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShyLHUpLHU9cik7cmV0dXJuIHRoaXN9LFhmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4obixlKXtyZXR1cm4gbiYmZT90KG4uX19kYXRhX18sZS5fX2RhdGFfXyk6IW4tIWV9dHx8KHQ9Uik7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxyPWUubGVuZ3RoLGk9bmV3IEFycmF5KHIpLG89MDtvPHI7KytvKXtmb3IodmFyIHUsYT1lW29dLGM9YS5sZW5ndGgscz1pW29dPW5ldyBBcnJheShjKSxmPTA7ZjxjOysrZikodT1hW2ZdKSYmKHNbZl09dSk7cy5zb3J0KG4pfXJldHVybiBuZXcgcHQoaSx0aGlzLl9wYXJlbnRzKS5vcmRlcigpfSxWZj1mdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gYXJndW1lbnRzWzBdPXRoaXMsdC5hcHBseShudWxsLGFyZ3VtZW50cyksdGhpc30sV2Y9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgQXJyYXkodGhpcy5zaXplKCkpLG49LTE7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3RbKytuXT10aGlzfSksdH0sJGY9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLG49MCxlPXQubGVuZ3RoO248ZTsrK24pZm9yKHZhciByPXRbbl0saT0wLG89ci5sZW5ndGg7aTxvOysraSl7dmFyIHU9cltpXTtpZih1KXJldHVybiB1fXJldHVybiBudWxsfSxaZj1mdW5jdGlvbigpe3ZhciB0PTA7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeysrdH0pLHR9LEdmPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMubm9kZSgpfSxKZj1mdW5jdGlvbih0KXtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9MCxyPW4ubGVuZ3RoO2U8cjsrK2UpZm9yKHZhciBpLG89bltlXSx1PTAsYT1vLmxlbmd0aDt1PGE7Kyt1KShpPW9bdV0pJiZ0LmNhbGwoaSxpLl9fZGF0YV9fLHUsbyk7cmV0dXJuIHRoaXN9LFFmPWZ1bmN0aW9uKHQsbil7dmFyIGU9bWYodCk7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXt2YXIgcj10aGlzLm5vZGUoKTtyZXR1cm4gZS5sb2NhbD9yLmdldEF0dHJpYnV0ZU5TKGUuc3BhY2UsZS5sb2NhbCk6ci5nZXRBdHRyaWJ1dGUoZSl9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09bj9lLmxvY2FsP0w6cToiZnVuY3Rpb24iPT10eXBlb2Ygbj9lLmxvY2FsP0Y6TzplLmxvY2FsP0Q6VSkoZSxuKSl9LEtmPWZ1bmN0aW9uKHQpe3JldHVybiB0Lm93bmVyRG9jdW1lbnQmJnQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8dC5kb2N1bWVudCYmdHx8dC5kZWZhdWx0Vmlld30sdGw9ZnVuY3Rpb24odCxuLGUpe3ZhciByO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKChudWxsPT1uP0k6ImZ1bmN0aW9uIj09dHlwZW9mIG4/QjpZKSh0LG4sbnVsbD09ZT8iIjplKSk6S2Yocj10aGlzLm5vZGUoKSkuZ2V0Q29tcHV0ZWRTdHlsZShyLG51bGwpLmdldFByb3BlcnR5VmFsdWUodCl9LG5sPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PW4/ajoiZnVuY3Rpb24iPT10eXBlb2Ygbj9YOkgpKHQsbikpOnRoaXMubm9kZSgpW3RdfTskLnByb3RvdHlwZT17YWRkOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX25hbWVzLmluZGV4T2YodCk7bjwwJiYodGhpcy5fbmFtZXMucHVzaCh0KSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fbmFtZXMuaW5kZXhPZih0KTtuPj0wJiYodGhpcy5fbmFtZXMuc3BsaWNlKG4sMSksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YodCk+PTB9fTt2YXIgZWw9ZnVuY3Rpb24odCxuKXt2YXIgZT1WKHQrIiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHZhciByPVcodGhpcy5ub2RlKCkpLGk9LTEsbz1lLmxlbmd0aDsrK2k8bzspaWYoIXIuY29udGFpbnMoZVtpXSkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIG4/SzpuP0o6USkoZSxuKSl9LHJsPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT10P3R0OigiZnVuY3Rpb24iPT10eXBlb2YgdD9ldDpudCkodCkpOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxpbD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD9ydDooImZ1bmN0aW9uIj09dHlwZW9mIHQ/b3Q6aXQpKHQpKTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LG9sPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaCh1dCl9LHVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChhdCl9LGFsPWZ1bmN0aW9uKHQpe3ZhciBuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eGYodCk7cmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQobi5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSl9LGNsPWZ1bmN0aW9uKHQsbil7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp4Zih0KSxyPW51bGw9PW4/Y3Q6ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpQZihuKTtyZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksci5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fG51bGwpfSl9LHNsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChzdCl9LGZsPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMucHJvcGVydHkoIl9fZGF0YV9fIix0KTp0aGlzLm5vZGUoKS5fX2RhdGFfX30sbGw9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9odDpsdCkodCxuKSl9LGhsPVtudWxsXTtwdC5wcm90b3R5cGU9ZHQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpwdCxzZWxlY3Q6UmYsc2VsZWN0QWxsOkxmLGZpbHRlcjpVZixkYXRhOllmLGVudGVyOk9mLGV4aXQ6QmYsbWVyZ2U6amYsb3JkZXI6SGYsc29ydDpYZixjYWxsOlZmLG5vZGVzOldmLG5vZGU6JGYsc2l6ZTpaZixlbXB0eTpHZixlYWNoOkpmLGF0dHI6UWYsc3R5bGU6dGwscHJvcGVydHk6bmwsY2xhc3NlZDplbCx0ZXh0OnJsLGh0bWw6aWwscmFpc2U6b2wsbG93ZXI6dWwsYXBwZW5kOmFsLGluc2VydDpjbCxyZW1vdmU6c2wsZGF0dW06Zmwsb246RWYsZGlzcGF0Y2g6bGx9O3ZhciBwbD1mdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IHB0KFtbZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0KV1dLFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKTpuZXcgcHQoW1t0XV0saGwpfSxkbD1mdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IHB0KFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHQpXSxbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSk6bmV3IHB0KFtudWxsPT10P1tdOnRdLGhsKX0sdmw9ZnVuY3Rpb24odCxuLGUpe2FyZ3VtZW50cy5sZW5ndGg8MyYmKGU9bixuPUFmKCkuY2hhbmdlZFRvdWNoZXMpO2Zvcih2YXIgcixpPTAsbz1uP24ubGVuZ3RoOjA7aTxvOysraSlpZigocj1uW2ldKS5pZGVudGlmaWVyPT09ZSlyZXR1cm4gQ2YodCxyKTtyZXR1cm4gbnVsbH0sX2w9ZnVuY3Rpb24odCxuKXtudWxsPT1uJiYobj1BZigpLnRvdWNoZXMpO2Zvcih2YXIgZT0wLHI9bj9uLmxlbmd0aDowLGk9bmV3IEFycmF5KHIpO2U8cjsrK2UpaVtlXT1DZih0LG5bZV0pO3JldHVybiBpfSx5bD1mdW5jdGlvbigpe3QuZXZlbnQucHJldmVudERlZmF1bHQoKSx0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfSxnbD1mdW5jdGlvbih0KXt2YXIgbj10LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxlPXBsKHQpLm9uKCJkcmFnc3RhcnQuZHJhZyIseWwsITApOyJvbnNlbGVjdHN0YXJ0ImluIG4/ZS5vbigic2VsZWN0c3RhcnQuZHJhZyIseWwsITApOihuLl9fbm9zZWxlY3Q9bi5zdHlsZS5Nb3pVc2VyU2VsZWN0LG4uc3R5bGUuTW96VXNlclNlbGVjdD0ibm9uZSIpfSxtbD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19O3l0LnByb3RvdHlwZS5vbj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuXy5vbi5hcHBseSh0aGlzLl8sYXJndW1lbnRzKTtyZXR1cm4gdD09PXRoaXMuXz90aGlzOnR9O3ZhciB4bD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odCl7dC5vbigibW91c2Vkb3duLmRyYWciLGUpLm9uKCJ0b3VjaHN0YXJ0LmRyYWciLG8pLm9uKCJ0b3VjaG1vdmUuZHJhZyIsdSkub24oInRvdWNoZW5kLmRyYWcgdG91Y2hjYW5jZWwuZHJhZyIsYSkuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKX1mdW5jdGlvbiBlKCl7aWYoIWYmJmwuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbj1jKCJtb3VzZSIsaC5hcHBseSh0aGlzLGFyZ3VtZW50cyksemYsdGhpcyxhcmd1bWVudHMpO24mJihwbCh0LmV2ZW50LnZpZXcpLm9uKCJtb3VzZW1vdmUuZHJhZyIsciwhMCkub24oIm1vdXNldXAuZHJhZyIsaSwhMCksZ2wodC5ldmVudC52aWV3KSx2dCgpLHM9ITEsbigic3RhcnQiKSl9fWZ1bmN0aW9uIHIoKXt5bCgpLHM9ITAsdi5tb3VzZSgiZHJhZyIpfWZ1bmN0aW9uIGkoKXtwbCh0LmV2ZW50LnZpZXcpLm9uKCJtb3VzZW1vdmUuZHJhZyBtb3VzZXVwLmRyYWciLG51bGwpLF90KHQuZXZlbnQudmlldyxzKSx5bCgpLHYubW91c2UoImVuZCIpfWZ1bmN0aW9uIG8oKXtpZihsLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIG4sZSxyPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsaT1oLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxvPXIubGVuZ3RoO2ZvcihuPTA7bjxvOysrbikoZT1jKHJbbl0uaWRlbnRpZmllcixpLHZsLHRoaXMsYXJndW1lbnRzKSkmJih2dCgpLGUoInN0YXJ0IikpfX1mdW5jdGlvbiB1KCl7dmFyIG4sZSxyPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsaT1yLmxlbmd0aDtmb3Iobj0wO248aTsrK24pKGU9dltyW25dLmlkZW50aWZpZXJdKSYmKHlsKCksZSgiZHJhZyIpKX1mdW5jdGlvbiBhKCl7dmFyIG4sZSxyPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsaT1yLmxlbmd0aDtmb3IoZiYmY2xlYXJUaW1lb3V0KGYpLGY9c2V0VGltZW91dChmdW5jdGlvbigpe2Y9bnVsbH0sNTAwKSxuPTA7bjxpOysrbikoZT12W3Jbbl0uaWRlbnRpZmllcl0pJiYodnQoKSxlKCJlbmQiKSl9ZnVuY3Rpb24gYyhlLHIsaSxvLHUpe3ZhciBhLGMscyxmPWkocixlKSxsPV8uY29weSgpO2lmKFMobmV3IHl0KG4sImJlZm9yZXN0YXJ0IixhLGUseSxmWzBdLGZbMV0sMCwwLGwpLGZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPSh0LmV2ZW50LnN1YmplY3Q9YT1kLmFwcGx5KG8sdSkpJiYoYz1hLngtZlswXXx8MCxzPWEueS1mWzFdfHwwLCEwKX0pKXJldHVybiBmdW5jdGlvbiB0KGgpe3ZhciBwLGQ9Zjtzd2l0Y2goaCl7Y2FzZSJzdGFydCI6dltlXT10LHA9eSsrO2JyZWFrO2Nhc2UiZW5kIjpkZWxldGUgdltlXSwtLXk7Y2FzZSJkcmFnIjpmPWkocixlKSxwPXl9UyhuZXcgeXQobixoLGEsZSxwLGZbMF0rYyxmWzFdK3MsZlswXS1kWzBdLGZbMV0tZFsxXSxsKSxsLmFwcGx5LGwsW2gsbyx1XSl9fXZhciBzLGYsbD1ndCxoPW10LGQ9eHQsdj17fSxfPXAoInN0YXJ0IiwiZHJhZyIsImVuZCIpLHk9MDtyZXR1cm4gbi5maWx0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDptbCghIXQpLG4pOmx9LG4uY29udGFpbmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bWwodCksbik6aH0sbi5zdWJqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bWwodCksDQpuKTpkfSxuLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9Xy5vbi5hcHBseShfLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1fP246dH0sbn0sYmw9ZnVuY3Rpb24odCxuLGUpe3QucHJvdG90eXBlPW4ucHJvdG90eXBlPWUsZS5jb25zdHJ1Y3Rvcj10fSx3bD0uNyxNbD0xL3dsLFRsPSJcXHMqKFsrLV0/XFxkKylcXHMqIixObD0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIixrbD0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiIsU2w9L14jKFswLTlhLWZdezN9KSQvLEVsPS9eIyhbMC05YS1mXXs2fSkkLyxBbD1uZXcgUmVnRXhwKCJecmdiXFwoIitbVGwsVGwsVGxdKyJcXCkkIiksQ2w9bmV3IFJlZ0V4cCgiXnJnYlxcKCIrW2tsLGtsLGtsXSsiXFwpJCIpLHpsPW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbVGwsVGwsVGwsTmxdKyJcXCkkIiksUGw9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1trbCxrbCxrbCxObF0rIlxcKSQiKSxSbD1uZXcgUmVnRXhwKCJeaHNsXFwoIitbTmwsa2wsa2xdKyJcXCkkIikscWw9bmV3IFJlZ0V4cCgiXmhzbGFcXCgiK1tObCxrbCxrbCxObF0rIlxcKSQiKSxMbD17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTtibCh3dCxNdCx7ZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJnYigpKyIifX0pLGJsKEV0LFN0LGJ0KHd0LHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10P01sOk1hdGgucG93KE1sLHQpLG5ldyBFdCh0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD93bDpNYXRoLnBvdyh3bCx0KSxuZXcgRXQodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PXRoaXMuciYmdGhpcy5yPD0yNTUmJjA8PXRoaXMuZyYmdGhpcy5nPD0yNTUmJjA8PXRoaXMuYiYmdGhpcy5iPD0yNTUmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSx0b1N0cmluZzpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3BhY2l0eTtyZXR1cm4gdD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSksKDE9PT10PyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX19KSksYmwoUHQsenQsYnQod3Qse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/TWw6TWF0aC5wb3coTWwsdCksbmV3IFB0KHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/d2w6TWF0aC5wb3cod2wsdCksbmV3IFB0KHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5oJTM2MCszNjAqKHRoaXMuaDwwKSxuPWlzTmFOKHQpfHxpc05hTih0aGlzLnMpPzA6dGhpcy5zLGU9dGhpcy5sLHI9ZSsoZTwuNT9lOjEtZSkqbixpPTIqZS1yO3JldHVybiBuZXcgRXQoUnQodD49MjQwP3QtMjQwOnQrMTIwLGksciksUnQodCxpLHIpLFJ0KHQ8MTIwP3QrMjQwOnQtMTIwLGksciksdGhpcy5vcGFjaXR5KX0sZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4oMDw9dGhpcy5zJiZ0aGlzLnM8PTF8fGlzTmFOKHRoaXMucykpJiYwPD10aGlzLmwmJnRoaXMubDw9MSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9fSkpO3ZhciBVbD1NYXRoLlBJLzE4MCxEbD0xODAvTWF0aC5QSSxPbD0xOCxGbD0uOTUwNDcsSWw9MSxZbD0xLjA4ODgzLEJsPTQvMjksamw9Ni8yOSxIbD0zKmpsKmpsLFhsPWpsKmpsKmpsO2JsKFV0LEx0LGJ0KHd0LHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IFV0KHRoaXMubCtPbCoobnVsbD09dD8xOnQpLHRoaXMuYSx0aGlzLmIsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgVXQodGhpcy5sLU9sKihudWxsPT10PzE6dCksdGhpcy5hLHRoaXMuYix0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD0odGhpcy5sKzE2KS8xMTYsbj1pc05hTih0aGlzLmEpP3Q6dCt0aGlzLmEvNTAwLGU9aXNOYU4odGhpcy5iKT90OnQtdGhpcy5iLzIwMDtyZXR1cm4gdD1JbCpPdCh0KSxuPUZsKk90KG4pLGU9WWwqT3QoZSksbmV3IEV0KEZ0KDMuMjQwNDU0MipuLTEuNTM3MTM4NSp0LS40OTg1MzE0KmUpLEZ0KC0uOTY5MjY2Km4rMS44NzYwMTA4KnQrLjA0MTU1NiplKSxGdCguMDU1NjQzNCpuLS4yMDQwMjU5KnQrMS4wNTcyMjUyKmUpLHRoaXMub3BhY2l0eSl9fSkpLGJsKGp0LEJ0LGJ0KHd0LHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGp0KHRoaXMuaCx0aGlzLmMsdGhpcy5sK09sKihudWxsPT10PzE6dCksdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcganQodGhpcy5oLHRoaXMuYyx0aGlzLmwtT2wqKG51bGw9PXQ/MTp0KSx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXtyZXR1cm4gcXQodGhpcykucmdiKCl9fSkpO3ZhciBWbD0tLjE0ODYxLFdsPTEuNzgyNzcsJGw9LS4yOTIyNyxabD0tLjkwNjQ5LEdsPTEuOTcyOTQsSmw9R2wqWmwsUWw9R2wqV2wsS2w9V2wqJGwtWmwqVmw7YmwoVnQsWHQsYnQod3Qse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/TWw6TWF0aC5wb3coTWwsdCksbmV3IFZ0KHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/d2w6TWF0aC5wb3cod2wsdCksbmV3IFZ0KHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9aXNOYU4odGhpcy5oKT8wOih0aGlzLmgrMTIwKSpVbCxuPSt0aGlzLmwsZT1pc05hTih0aGlzLnMpPzA6dGhpcy5zKm4qKDEtbikscj1NYXRoLmNvcyh0KSxpPU1hdGguc2luKHQpO3JldHVybiBuZXcgRXQoMjU1KihuK2UqKFZsKnIrV2wqaSkpLDI1NSoobitlKigkbCpyK1psKmkpKSwyNTUqKG4rZSooR2wqcikpLHRoaXMub3BhY2l0eSl9fSkpO3ZhciB0aCxuaCxlaCxyaCxpaCxvaCx1aD1mdW5jdGlvbih0KXt2YXIgbj10Lmxlbmd0aC0xO3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1lPD0wP2U9MDplPj0xPyhlPTEsbi0xKTpNYXRoLmZsb29yKGUqbiksaT10W3JdLG89dFtyKzFdLHU9cj4wP3Rbci0xXToyKmktbyxhPXI8bi0xP3RbcisyXToyKm8taTtyZXR1cm4gV3QoKGUtci9uKSpuLHUsaSxvLGEpfX0sYWg9ZnVuY3Rpb24odCl7dmFyIG49dC5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByPU1hdGguZmxvb3IoKChlJT0xKTwwPysrZTplKSpuKSxpPXRbKHIrbi0xKSVuXSxvPXRbciVuXSx1PXRbKHIrMSklbl0sYT10WyhyKzIpJW5dO3JldHVybiBXdCgoZS1yL24pKm4saSxvLHUsYSl9fSxjaD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19LHNoPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LG4pe3ZhciBlPXIoKHQ9U3QodCkpLnIsKG49U3QobikpLnIpLGk9cih0Lmcsbi5nKSxvPXIodC5iLG4uYiksdT1RdCh0Lm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQucj1lKG4pLHQuZz1pKG4pLHQuYj1vKG4pLHQub3BhY2l0eT11KG4pLHQrIiJ9fXZhciByPUp0KG4pO3JldHVybiBlLmdhbW1hPXQsZX0oMSksZmg9S3QodWgpLGxoPUt0KGFoKSxoaD1mdW5jdGlvbih0LG4pe3ZhciBlLHI9bj9uLmxlbmd0aDowLGk9dD9NYXRoLm1pbihyLHQubGVuZ3RoKTowLG89bmV3IEFycmF5KHIpLHU9bmV3IEFycmF5KHIpO2ZvcihlPTA7ZTxpOysrZSlvW2VdPW1oKHRbZV0sbltlXSk7Zm9yKDtlPHI7KytlKXVbZV09bltlXTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKGU9MDtlPGk7KytlKXVbZV09b1tlXSh0KTtyZXR1cm4gdX19LHBoPWZ1bmN0aW9uKHQsbil7dmFyIGU9bmV3IERhdGU7cmV0dXJuIHQ9K3Qsbi09dCxmdW5jdGlvbihyKXtyZXR1cm4gZS5zZXRUaW1lKHQrbipyKSxlfX0sZGg9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdD0rdCxuLT10LGZ1bmN0aW9uKGUpe3JldHVybiB0K24qZX19LHZoPWZ1bmN0aW9uKHQsbil7dmFyIGUscj17fSxpPXt9O251bGwhPT10JiYib2JqZWN0Ij09dHlwZW9mIHR8fCh0PXt9KSxudWxsIT09biYmIm9iamVjdCI9PXR5cGVvZiBufHwobj17fSk7Zm9yKGUgaW4gbillIGluIHQ/cltlXT1taCh0W2VdLG5bZV0pOmlbZV09bltlXTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKGUgaW4gcilpW2VdPXJbZV0odCk7cmV0dXJuIGl9fSxfaD0vWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2cseWg9bmV3IFJlZ0V4cChfaC5zb3VyY2UsImciKSxnaD1mdW5jdGlvbih0LG4pe3ZhciBlLHIsaSxvPV9oLmxhc3RJbmRleD15aC5sYXN0SW5kZXg9MCx1PS0xLGE9W10sYz1bXTtmb3IodCs9IiIsbis9IiI7KGU9X2guZXhlYyh0KSkmJihyPXloLmV4ZWMobikpOykoaT1yLmluZGV4KT5vJiYoaT1uLnNsaWNlKG8saSksYVt1XT9hW3VdKz1pOmFbKyt1XT1pKSwoZT1lWzBdKT09PShyPXJbMF0pP2FbdV0/YVt1XSs9cjphWysrdV09cjooYVsrK3VdPW51bGwsYy5wdXNoKHtpOnUseDpkaChlLHIpfSkpLG89eWgubGFzdEluZGV4O3JldHVybiBvPG4ubGVuZ3RoJiYoaT1uLnNsaWNlKG8pLGFbdV0/YVt1XSs9aTphWysrdV09aSksYS5sZW5ndGg8Mj9jWzBdP25uKGNbMF0ueCk6dG4obik6KG49Yy5sZW5ndGgsZnVuY3Rpb24odCl7Zm9yKHZhciBlLHI9MDtyPG47KytyKWFbKGU9Y1tyXSkuaV09ZS54KHQpO3JldHVybiBhLmpvaW4oIiIpfSl9LG1oPWZ1bmN0aW9uKHQsbil7dmFyIGUscj10eXBlb2YgbjtyZXR1cm4gbnVsbD09bnx8ImJvb2xlYW4iPT09cj9jaChuKTooIm51bWJlciI9PT1yP2RoOiJzdHJpbmciPT09cj8oZT1NdChuKSk/KG49ZSxzaCk6Z2g6biBpbnN0YW5jZW9mIE10P3NoOm4gaW5zdGFuY2VvZiBEYXRlP3BoOkFycmF5LmlzQXJyYXkobik/aGg6aXNOYU4obik/dmg6ZGgpKHQsbil9LHhoPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHQ9K3Qsbi09dCxmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5yb3VuZCh0K24qZSl9fSxiaD0xODAvTWF0aC5QSSx3aD17dHJhbnNsYXRlWDowLHRyYW5zbGF0ZVk6MCxyb3RhdGU6MCxza2V3WDowLHNjYWxlWDoxLHNjYWxlWToxfSxNaD1mdW5jdGlvbih0LG4sZSxyLGksbyl7dmFyIHUsYSxjO3JldHVybih1PU1hdGguc3FydCh0KnQrbipuKSkmJih0Lz11LG4vPXUpLChjPXQqZStuKnIpJiYoZS09dCpjLHItPW4qYyksKGE9TWF0aC5zcXJ0KGUqZStyKnIpKSYmKGUvPWEsci89YSxjLz1hKSx0KnI8biplJiYodD0tdCxuPS1uLGM9LWMsdT0tdSkse3RyYW5zbGF0ZVg6aSx0cmFuc2xhdGVZOm8scm90YXRlOk1hdGguYXRhbjIobix0KSpiaCxza2V3WDpNYXRoLmF0YW4oYykqYmgsc2NhbGVYOnUsc2NhbGVZOmF9fSxUaD1vbihlbiwicHgsICIsInB4KSIsImRlZykiKSxOaD1vbihybiwiLCAiLCIpIiwiKSIpLGtoPU1hdGguU1FSVDIsU2g9MixFaD00LEFoPTFlLTEyLENoPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXRbMF0sbz10WzFdLHU9dFsyXSxhPW5bMF0sYz1uWzFdLHM9blsyXSxmPWEtaSxsPWMtbyxoPWYqZitsKmw7aWYoaDxBaClyPU1hdGgubG9nKHMvdSkva2gsZT1mdW5jdGlvbih0KXtyZXR1cm5baSt0KmYsbyt0KmwsdSpNYXRoLmV4cChraCp0KnIpXX07ZWxzZXt2YXIgcD1NYXRoLnNxcnQoaCksZD0ocypzLXUqdStFaCpoKS8oMip1KlNoKnApLHY9KHMqcy11KnUtRWgqaCkvKDIqcypTaCpwKSxfPU1hdGgubG9nKE1hdGguc3FydChkKmQrMSktZCkseT1NYXRoLmxvZyhNYXRoLnNxcnQodip2KzEpLXYpO3I9KHktXykva2gsZT1mdW5jdGlvbih0KXt2YXIgbj10KnIsZT11bihfKSxhPXUvKFNoKnApKihlKmNuKGtoKm4rXyktYW4oXykpO3JldHVybltpK2EqZixvK2EqbCx1KmUvdW4oa2gqbitfKV19fXJldHVybiBlLmR1cmF0aW9uPTFlMypyLGV9LHpoPXNuKEd0KSxQaD1zbihRdCksUmg9bG4oR3QpLHFoPWxuKFF0KSxMaD1obihHdCksVWg9aG4oUXQpLERoPWZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPW5ldyBBcnJheShuKSxyPTA7cjxuOysrcillW3JdPXQoci8obi0xKSk7cmV0dXJuIGV9LE9oPTAsRmg9MCxJaD0wLFloPTFlMyxCaD0wLGpoPTAsSGg9MCxYaD0ib2JqZWN0Ij09dHlwZW9mIHBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2U6RGF0ZSxWaD0iZnVuY3Rpb24iPT10eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lP3JlcXVlc3RBbmltYXRpb25GcmFtZTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHQsMTcpfTt2bi5wcm90b3R5cGU9X24ucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp2bixyZXN0YXJ0OmZ1bmN0aW9uKHQsbixlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbiIpO2U9KG51bGw9PWU/cG4oKTorZSkrKG51bGw9PW4/MDorbiksdGhpcy5fbmV4dHx8b2g9PT10aGlzfHwob2g/b2guX25leHQ9dGhpczppaD10aGlzLG9oPXRoaXMpLHRoaXMuX2NhbGw9dCx0aGlzLl90aW1lPWUsYm4oKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuX2NhbGwmJih0aGlzLl9jYWxsPW51bGwsdGhpcy5fdGltZT0xLzAsYm4oKSl9fTt2YXIgV2g9ZnVuY3Rpb24odCxuLGUpe3ZhciByPW5ldyB2bjtyZXR1cm4gbj1udWxsPT1uPzA6K24sci5yZXN0YXJ0KGZ1bmN0aW9uKGUpe3Iuc3RvcCgpLHQoZStuKX0sbixlKSxyfSwkaD1mdW5jdGlvbih0LG4sZSl7dmFyIHI9bmV3IHZuLGk9bjtyZXR1cm4gbnVsbD09bj8oci5yZXN0YXJ0KHQsbixlKSxyKToobj0rbixlPW51bGw9PWU/cG4oKTorZSxyLnJlc3RhcnQoZnVuY3Rpb24gbyh1KXt1Kz1pLHIucmVzdGFydChvLGkrPW4sZSksdCh1KX0sbixlKSxyKX0sWmg9cCgic3RhcnQiLCJlbmQiLCJpbnRlcnJ1cHQiKSxHaD1bXSxKaD0wLFFoPTEsS2g9Mix0cD0zLG5wPTQsZXA9NSxycD02LGlwPWZ1bmN0aW9uKHQsbixlLHIsaSxvKXt2YXIgdT10Ll9fdHJhbnNpdGlvbjtpZih1KXtpZihlIGluIHUpcmV0dXJufWVsc2UgdC5fX3RyYW5zaXRpb249e307Tm4odCxlLHtuYW1lOm4saW5kZXg6cixncm91cDppLG9uOlpoLHR3ZWVuOkdoLHRpbWU6by50aW1lLGRlbGF5Om8uZGVsYXksZHVyYXRpb246by5kdXJhdGlvbixlYXNlOm8uZWFzZSx0aW1lcjpudWxsLHN0YXRlOkpofSl9LG9wPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpLG89dC5fX3RyYW5zaXRpb24sdT0hMDtpZihvKXtuPW51bGw9PW4/bnVsbDpuKyIiO2ZvcihpIGluIG8pKGU9b1tpXSkubmFtZT09PW4/KHI9ZS5zdGF0ZT5LaCYmZS5zdGF0ZTxlcCxlLnN0YXRlPXJwLGUudGltZXIuc3RvcCgpLHImJmUub24uY2FsbCgiaW50ZXJydXB0Iix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSxkZWxldGUgb1tpXSk6dT0hMTt1JiZkZWxldGUgdC5fX3RyYW5zaXRpb259fSx1cD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7b3AodGhpcyx0KX0pfSxhcD1mdW5jdGlvbih0LG4pe3ZhciBlPXRoaXMuX2lkO2lmKHQrPSIiLGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHZhciByLGk9VG4odGhpcy5ub2RlKCksZSkudHdlZW4sbz0wLHU9aS5sZW5ndGg7bzx1OysrbylpZigocj1pW29dKS5uYW1lPT09dClyZXR1cm4gci52YWx1ZTtyZXR1cm4gbnVsbH1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1uP2tuOlNuKShlLHQsbikpfSxjcD1mdW5jdGlvbih0LG4pe3ZhciBlO3JldHVybigibnVtYmVyIj09dHlwZW9mIG4/ZGg6biBpbnN0YW5jZW9mIE10P3NoOihlPU10KG4pKT8obj1lLHNoKTpnaCkodCxuKX0sc3A9ZnVuY3Rpb24odCxuKXt2YXIgZT1tZih0KSxyPSJ0cmFuc2Zvcm0iPT09ZT9OaDpjcDtyZXR1cm4gdGhpcy5hdHRyVHdlZW4odCwiZnVuY3Rpb24iPT10eXBlb2Ygbj8oZS5sb2NhbD9xbjpSbikoZSxyLEVuKHRoaXMsImF0dHIuIit0LG4pKTpudWxsPT1uPyhlLmxvY2FsP0NuOkFuKShlKTooZS5sb2NhbD9Qbjp6bikoZSxyLG4pKX0sZnA9ZnVuY3Rpb24odCxuKXt2YXIgZT0iYXR0ci4iK3Q7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXJldHVybihlPXRoaXMudHdlZW4oZSkpJiZlLl92YWx1ZTtpZihudWxsPT1uKXJldHVybiB0aGlzLnR3ZWVuKGUsbnVsbCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEVycm9yO3ZhciByPW1mKHQpO3JldHVybiB0aGlzLnR3ZWVuKGUsKHIubG9jYWw/TG46VW4pKHIsbikpfSxscD1mdW5jdGlvbih0KXt2YXIgbj10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiB0P0RuOk9uKShuLHQpKTpUbih0aGlzLm5vZGUoKSxuKS5kZWxheX0saHA9ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9GbjpJbikobix0KSk6VG4odGhpcy5ub2RlKCksbikuZHVyYXRpb259LHBwPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChZbihuLHQpKTpUbih0aGlzLm5vZGUoKSxuKS5lYXNlfSxkcD1mdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9TmYodCkpO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT1uLmxlbmd0aCxyPW5ldyBBcnJheShlKSxpPTA7aTxlOysraSlmb3IodmFyIG8sdT1uW2ldLGE9dS5sZW5ndGgsYz1yW2ldPVtdLHM9MDtzPGE7KytzKShvPXVbc10pJiZ0LmNhbGwobyxvLl9fZGF0YV9fLHMsdSkmJmMucHVzaChvKTtyZXR1cm4gbmV3IFFuKHIsdGhpcy5fcGFyZW50cyx0aGlzLl9uYW1lLHRoaXMuX2lkKX0sdnA9ZnVuY3Rpb24odCl7aWYodC5faWQhPT10aGlzLl9pZCl0aHJvdyBuZXcgRXJyb3I7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPXQuX2dyb3VwcyxyPW4ubGVuZ3RoLGk9ZS5sZW5ndGgsbz1NYXRoLm1pbihyLGkpLHU9bmV3IEFycmF5KHIpLGE9MDthPG87KythKWZvcih2YXIgYyxzPW5bYV0sZj1lW2FdLGw9cy5sZW5ndGgsaD11W2FdPW5ldyBBcnJheShsKSxwPTA7cDxsOysrcCkoYz1zW3BdfHxmW3BdKSYmKGhbcF09Yyk7Zm9yKDthPHI7KythKXVbYV09blthXTtyZXR1cm4gbmV3IFFuKHUsdGhpcy5fcGFyZW50cyx0aGlzLl9uYW1lLHRoaXMuX2lkKX0sX3A9ZnVuY3Rpb24odCxuKXt2YXIgZT10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP1RuKHRoaXMubm9kZSgpLGUpLm9uLm9uKHQpOnRoaXMuZWFjaChqbihlLHQsbikpfSx5cD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9uKCJlbmQucmVtb3ZlIixIbih0aGlzLl9pZCkpfSxncD1mdW5jdGlvbih0KXt2YXIgbj10aGlzLl9uYW1lLGU9dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVBmKHQpKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz1uZXcgQXJyYXkoaSksdT0wO3U8aTsrK3UpZm9yKHZhciBhLGMscz1yW3VdLGY9cy5sZW5ndGgsbD1vW3VdPW5ldyBBcnJheShmKSxoPTA7aDxmOysraCkoYT1zW2hdKSYmKGM9dC5jYWxsKGEsYS5fX2RhdGFfXyxoLHMpKSYmKCJfX2RhdGFfXyJpbiBhJiYoYy5fX2RhdGFfXz1hLl9fZGF0YV9fKSxsW2hdPWMsaXAobFtoXSxuLGUsaCxsLFRuKGEsZSkpKTtyZXR1cm4gbmV3IFFuKG8sdGhpcy5fcGFyZW50cyxuLGUpfSxtcD1mdW5jdGlvbih0KXt2YXIgbj10aGlzLl9uYW1lLGU9dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXFmKHQpKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz1bXSx1PVtdLGE9MDthPGk7KythKWZvcih2YXIgYyxzPXJbYV0sZj1zLmxlbmd0aCxsPTA7bDxmOysrbClpZihjPXNbbF0pe2Zvcih2YXIgaCxwPXQuY2FsbChjLGMuX19kYXRhX18sbCxzKSxkPVRuKGMsZSksdj0wLF89cC5sZW5ndGg7djxfOysrdikoaD1wW3ZdKSYmaXAoaCxuLGUsdixwLGQpO28ucHVzaChwKSx1LnB1c2goYyl9cmV0dXJuIG5ldyBRbihvLHUsbixlKX0seHA9ZHQucHJvdG90eXBlLmNvbnN0cnVjdG9yLGJwPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB4cCh0aGlzLl9ncm91cHMsdGhpcy5fcGFyZW50cyl9LHdwPWZ1bmN0aW9uKHQsbixlKXt2YXIgcj0idHJhbnNmb3JtIj09KHQrPSIiKT9UaDpjcDtyZXR1cm4gbnVsbD09bj90aGlzLnN0eWxlVHdlZW4odCxYbih0LHIpKS5vbigiZW5kLnN0eWxlLiIrdCxWbih0KSk6dGhpcy5zdHlsZVR3ZWVuKHQsImZ1bmN0aW9uIj09dHlwZW9mIG4/JG4odCxyLEVuKHRoaXMsInN0eWxlLiIrdCxuKSk6V24odCxyLG4pLGUpfSxNcD1mdW5jdGlvbih0LG4sZSl7dmFyIHI9InN0eWxlLiIrKHQrPSIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKHI9dGhpcy50d2VlbihyKSkmJnIuX3ZhbHVlO2lmKG51bGw9PW4pcmV0dXJuIHRoaXMudHdlZW4ocixudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHRoaXMudHdlZW4ocixabih0LG4sbnVsbD09ZT8iIjplKSl9LFRwPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnR3ZWVuKCJ0ZXh0IiwiZnVuY3Rpb24iPT10eXBlb2YgdD9KbihFbih0aGlzLCJ0ZXh0Iix0KSk6R24obnVsbD09dD8iIjp0KyIiKSl9LE5wPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX25hbWUsbj10aGlzLl9pZCxlPXRlKCkscj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPTA7bzxpOysrbylmb3IodmFyIHUsYT1yW29dLGM9YS5sZW5ndGgscz0wO3M8YzsrK3MpaWYodT1hW3NdKXt2YXIgZj1Ubih1LG4pO2lwKHUsdCxlLHMsYSx7dGltZTpmLnRpbWUrZi5kZWxheStmLmR1cmF0aW9uLGRlbGF5OjAsZHVyYXRpb246Zi5kdXJhdGlvbixlYXNlOmYuZWFzZX0pfXJldHVybiBuZXcgUW4ocix0aGlzLl9wYXJlbnRzLHQsZSl9LGtwPTAsU3A9ZHQucHJvdG90eXBlO1FuLnByb3RvdHlwZT1Lbi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlFuLHNlbGVjdDpncCxzZWxlY3RBbGw6bXAsZmlsdGVyOmRwLG1lcmdlOnZwLHNlbGVjdGlvbjpicCx0cmFuc2l0aW9uOk5wLGNhbGw6U3AuY2FsbCxub2RlczpTcC5ub2Rlcyxub2RlOlNwLm5vZGUsc2l6ZTpTcC5zaXplLGVtcHR5OlNwLmVtcHR5LGVhY2g6U3AuZWFjaCxvbjpfcCxhdHRyOnNwLGF0dHJUd2VlbjpmcCxzdHlsZTp3cCxzdHlsZVR3ZWVuOk1wLHRleHQ6VHAscmVtb3ZlOnlwLHR3ZWVuOmFwLGRlbGF5OmxwLGR1cmF0aW9uOmhwLGVhc2U6cHB9O3ZhciBFcD0zLEFwPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gTWF0aC5wb3codCxuKX1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oRXApLENwPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gMS1NYXRoLnBvdygxLXQsbil9cmV0dXJuIG49K24sZS5leHBvbmVudD10LGV9KEVwKSx6cD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuKCh0Kj0yKTw9MT9NYXRoLnBvdyh0LG4pOjItTWF0aC5wb3coMi10LG4pKS8yfXJldHVybiBuPStuLGUuZXhwb25lbnQ9dCxlfShFcCksUHA9TWF0aC5QSSxScD1QcC8yLHFwPTQvMTEsTHA9Ni8xMSxVcD04LzExLERwPS43NSxPcD05LzExLEZwPTEwLzExLElwPS45Mzc1LFlwPTIxLzIyLEJwPTYzLzY0LGpwPTEvcXAvcXAsSHA9MS43MDE1OCxYcD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIHQqdCooKG4rMSkqdC1uKX1yZXR1cm4gbj0rbixlLm92ZXJzaG9vdD10LGV9KEhwKSxWcD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuLS10KnQqKChuKzEpKnQrbikrMX1yZXR1cm4gbj0rbixlLm92ZXJzaG9vdD10LGV9KEhwKSxXcD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuKCh0Kj0yKTwxP3QqdCooKG4rMSkqdC1uKToodC09MikqdCooKG4rMSkqdCtuKSsyKS8yfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oSHApLCRwPTIqTWF0aC5QSSxacD0xLEdwPS4zLEpwPWZ1bmN0aW9uIHQobixlKXtmdW5jdGlvbiByKHQpe3JldHVybiBuKk1hdGgucG93KDIsMTAqLS10KSpNYXRoLnNpbigoaS10KS9lKX12YXIgaT1NYXRoLmFzaW4oMS8obj1NYXRoLm1heCgxLG4pKSkqKGUvPSRwKTtyZXR1cm4gci5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKiRwKX0sci5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0scn0oWnAsR3ApLFFwPWZ1bmN0aW9uIHQobixlKXtmdW5jdGlvbiByKHQpe3JldHVybiAxLW4qTWF0aC5wb3coMiwtMTAqKHQ9K3QpKSpNYXRoLnNpbigodCtpKS9lKX12YXIgaT1NYXRoLmFzaW4oMS8obj1NYXRoLm1heCgxLG4pKSkqKGUvPSRwKTtyZXR1cm4gci5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKiRwKX0sci5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0scn0oWnAsR3ApLEtwPWZ1bmN0aW9uIHQobixlKXtmdW5jdGlvbiByKHQpe3JldHVybigodD0yKnQtMSk8MD9uKk1hdGgucG93KDIsMTAqdCkqTWF0aC5zaW4oKGktdCkvZSk6Mi1uKk1hdGgucG93KDIsLTEwKnQpKk1hdGguc2luKChpK3QpL2UpKS8yfXZhciBpPU1hdGguYXNpbigxLyhuPU1hdGgubWF4KDEsbikpKSooZS89JHApO3JldHVybiByLmFtcGxpdHVkZT1mdW5jdGlvbihuKXtyZXR1cm4gdChuLGUqJHApfSxyLnBlcmlvZD1mdW5jdGlvbihlKXtyZXR1cm4gdChuLGUpfSxyfShacCxHcCksdGQ9e3RpbWU6bnVsbCxkZWxheTowLGR1cmF0aW9uOjI1MCxlYXNlOmFlfSxuZD1mdW5jdGlvbih0KXt2YXIgbixlO3QgaW5zdGFuY2VvZiBRbj8obj10Ll9pZCx0PXQuX25hbWUpOihuPXRlKCksKGU9dGQpLnRpbWU9cG4oKSx0PW51bGw9PXQ/bnVsbDp0KyIiKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz0wO288aTsrK28pZm9yKHZhciB1LGE9cltvXSxjPWEubGVuZ3RoLHM9MDtzPGM7KytzKSh1PWFbc10pJiZpcCh1LHQsbixzLGEsZXx8eGUodSxuKSk7cmV0dXJuIG5ldyBRbihyLHRoaXMuX3BhcmVudHMsdCxuKX07ZHQucHJvdG90eXBlLmludGVycnVwdD11cCxkdC5wcm90b3R5cGUudHJhbnNpdGlvbj1uZDt2YXIgZWQ9W251bGxdLHJkPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXQuX190cmFuc2l0aW9uO2lmKGkpe249bnVsbD09bj9udWxsOm4rIiI7Zm9yKHIgaW4gaSlpZigoZT1pW3JdKS5zdGF0ZT5RaCYmZS5uYW1lPT09bilyZXR1cm4gbmV3IFFuKFtbdF1dLGVkLG4sK3IpfXJldHVybiBudWxsfSxpZD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19LG9kPWZ1bmN0aW9uKHQsbixlKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1uLHRoaXMuc2VsZWN0aW9uPWV9LHVkPWZ1bmN0aW9uKCl7dC5ldmVudC5wcmV2ZW50RGVmYXVsdCgpLHQuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9LGFkPXtuYW1lOiJkcmFnIn0sY2Q9e25hbWU6InNwYWNlIn0sc2Q9e25hbWU6ImhhbmRsZSJ9LGZkPXtuYW1lOiJjZW50ZXIifSxsZD17bmFtZToieCIsaGFuZGxlczpbImUiLCJ3Il0ubWFwKHdlKSxpbnB1dDpmdW5jdGlvbih0LG4pe3JldHVybiB0JiZbW3RbMF0sblswXVsxXV0sW3RbMV0sblsxXVsxXV1dfSxvdXRwdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlt0WzBdWzBdLHRbMV1bMF1dfX0saGQ9e25hbWU6InkiLGhhbmRsZXM6WyJuIiwicyJdLm1hcCh3ZSksaW5wdXQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdCYmW1tuWzBdWzBdLHRbMF1dLFtuWzFdWzBdLHRbMV1dXX0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZbdFswXVsxXSx0WzFdWzFdXX19LHBkPXtuYW1lOiJ4eSIsaGFuZGxlczpbIm4iLCJlIiwicyIsInciLCJudyIsIm5lIiwic2UiLCJzdyJdLm1hcCh3ZSksaW5wdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHR9LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdH19LGRkPXtvdmVybGF5OiJjcm9zc2hhaXIiLHNlbGVjdGlvbjoibW92ZSIsbjoibnMtcmVzaXplIixlOiJldy1yZXNpemUiLHM6Im5zLXJlc2l6ZSIsdzoiZXctcmVzaXplIixudzoibndzZS1yZXNpemUiLG5lOiJuZXN3LXJlc2l6ZSIsc2U6Im53c2UtcmVzaXplIixzdzoibmVzdy1yZXNpemUifSx2ZD17ZToidyIsdzoiZSIsbnc6Im5lIixuZToibnciLHNlOiJzdyIsc3c6InNlIn0sX2Q9e246InMiLHM6Im4iLG53OiJzdyIsbmU6InNlIixzZToibmUiLHN3OiJudyJ9LHlkPXtvdmVybGF5OjEsc2VsZWN0aW9uOjEsbjpudWxsLGU6MSxzOm51bGwsdzotMSxudzotMSxuZToxLHNlOjEsc3c6LTF9LGdkPXtvdmVybGF5OjEsc2VsZWN0aW9uOjEsbjotMSxlOm51bGwsczoxLHc6bnVsbCxudzotMSxuZTotMSxzZToxLHN3OjF9LG1kPWZ1bmN0aW9uKCl7cmV0dXJuIENlKHBkKX0seGQ9TWF0aC5jb3MsYmQ9TWF0aC5zaW4sd2Q9TWF0aC5QSSxNZD13ZC8yLFRkPTIqd2QsTmQ9TWF0aC5tYXgsa2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBvLHUsYSxjLHMsZixsPXQubGVuZ3RoLGg9W10scD1JcyhsKSxkPVtdLHY9W10sXz12Lmdyb3Vwcz1uZXcgQXJyYXkobCkseT1uZXcgQXJyYXkobCpsKTtmb3Iobz0wLHM9LTE7KytzPGw7KXtmb3IodT0wLGY9LTE7KytmPGw7KXUrPXRbc11bZl07aC5wdXNoKHUpLGQucHVzaChJcyhsKSksbys9dX1mb3IoZSYmcC5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUoaFt0XSxoW25dKX0pLHImJmQuZm9yRWFjaChmdW5jdGlvbihuLGUpe24uc29ydChmdW5jdGlvbihuLGkpe3JldHVybiByKHRbZV1bbl0sdFtlXVtpXSl9KX0pLG89TmQoMCxUZC1uKmwpL28sYz1vP246VGQvbCx1PTAscz0tMTsrK3M8bDspe2ZvcihhPXUsZj0tMTsrK2Y8bDspe3ZhciBnPXBbc10sbT1kW2ddW2ZdLHg9dFtnXVttXSxiPXUsdz11Kz14Km87eVttKmwrZ109e2luZGV4Omcsc3ViaW5kZXg6bSxzdGFydEFuZ2xlOmIsZW5kQW5nbGU6dyx2YWx1ZTp4fX1fW2ddPXtpbmRleDpnLHN0YXJ0QW5nbGU6YSxlbmRBbmdsZTp1LHZhbHVlOmhbZ119LHUrPWN9Zm9yKHM9LTE7KytzPGw7KWZvcihmPXMtMTsrK2Y8bDspe3ZhciBNPXlbZipsK3NdLFQ9eVtzKmwrZl07KE0udmFsdWV8fFQudmFsdWUpJiZ2LnB1c2goTS52YWx1ZTxULnZhbHVlP3tzb3VyY2U6VCx0YXJnZXQ6TX06e3NvdXJjZTpNLHRhcmdldDpUfSl9cmV0dXJuIGk/di5zb3J0KGkpOnZ9dmFyIG49MCxlPW51bGwscj1udWxsLGk9bnVsbDtyZXR1cm4gdC5wYWRBbmdsZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1OZCgwLGUpLHQpOm59LHQuc29ydEdyb3Vwcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHQpOmV9LHQuc29ydFN1Ymdyb3Vwcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1uLHQpOnJ9LHQuc29ydENob3Jkcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09bj9pPW51bGw6KGk9emUobikpLl89bix0KTppJiZpLl99LHR9LFNkPUFycmF5LnByb3RvdHlwZS5zbGljZSxFZD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19LEFkPU1hdGguUEksQ2Q9MipBZCx6ZD0xZS02LFBkPUNkLXpkO1BlLnByb3RvdHlwZT1SZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlBlLG1vdmVUbzpmdW5jdGlvbih0LG4pe3RoaXMuXys9Ik0iKyh0aGlzLl94MD10aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MD10aGlzLl95MT0rbil9LGNsb3NlUGF0aDpmdW5jdGlvbigpe251bGwhPT10aGlzLl94MSYmKHRoaXMuX3gxPXRoaXMuX3gwLHRoaXMuX3kxPXRoaXMuX3kwLHRoaXMuXys9IloiKX0sbGluZVRvOmZ1bmN0aW9uKHQsbil7dGhpcy5fKz0iTCIrKHRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kxPStuKX0scXVhZHJhdGljQ3VydmVUbzpmdW5jdGlvbih0LG4sZSxyKXt0aGlzLl8rPSJRIisgK3QrIiwiKyArbisiLCIrKHRoaXMuX3gxPStlKSsiLCIrKHRoaXMuX3kxPStyKX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbih0LG4sZSxyLGksbyl7dGhpcy5fKz0iQyIrICt0KyIsIisgK24rIiwiKyArZSsiLCIrICtyKyIsIisodGhpcy5feDE9K2kpKyIsIisodGhpcy5feTE9K28pfSxhcmNUbzpmdW5jdGlvbih0LG4sZSxyLGkpe3Q9K3Qsbj0rbixlPStlLHI9K3IsaT0raTt2YXIgbz10aGlzLl94MSx1PXRoaXMuX3kxLGE9ZS10LGM9ci1uLHM9by10LGY9dS1uLGw9cypzK2YqZjtpZihpPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXM6ICIraSk7aWYobnVsbD09PXRoaXMuX3gxKXRoaXMuXys9Ik0iKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPW4pO2Vsc2UgaWYobD56ZClpZihNYXRoLmFicyhmKmEtYypzKT56ZCYmaSl7dmFyIGg9ZS1vLHA9ci11LGQ9YSphK2MqYyx2PWgqaCtwKnAsXz1NYXRoLnNxcnQoZCkseT1NYXRoLnNxcnQobCksZz1pKk1hdGgudGFuKChBZC1NYXRoLmFjb3MoKGQrbC12KS8oMipfKnkpKSkvMiksbT1nL3kseD1nL187TWF0aC5hYnMobS0xKT56ZCYmKHRoaXMuXys9IkwiKyh0K20qcykrIiwiKyhuK20qZikpLHRoaXMuXys9IkEiK2krIiwiK2krIiwwLDAsIisgKyhmKmg+cypwKSsiLCIrKHRoaXMuX3gxPXQreCphKSsiLCIrKHRoaXMuX3kxPW4reCpjKX1lbHNlIHRoaXMuXys9IkwiKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPW4pO2Vsc2U7fSxhcmM6ZnVuY3Rpb24odCxuLGUscixpLG8pe3Q9K3Qsbj0rbixlPStlO3ZhciB1PWUqTWF0aC5jb3MociksYT1lKk1hdGguc2luKHIpLGM9dCt1LHM9bithLGY9MV5vLGw9bz9yLWk6aS1yO2lmKGU8MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIitlKTtudWxsPT09dGhpcy5feDE/dGhpcy5fKz0iTSIrYysiLCIrczooTWF0aC5hYnModGhpcy5feDEtYyk+emR8fE1hdGguYWJzKHRoaXMuX3kxLXMpPnpkKSYmKHRoaXMuXys9IkwiK2MrIiwiK3MpLGUmJihsPlBkP3RoaXMuXys9IkEiK2UrIiwiK2UrIiwwLDEsIitmKyIsIisodC11KSsiLCIrKG4tYSkrIkEiK2UrIiwiK2UrIiwwLDEsIitmKyIsIisodGhpcy5feDE9YykrIiwiKyh0aGlzLl95MT1zKToobDwwJiYobD1sJUNkK0NkKSx0aGlzLl8rPSJBIitlKyIsIitlKyIsMCwiKyArKGw+PUFkKSsiLCIrZisiLCIrKHRoaXMuX3gxPXQrZSpNYXRoLmNvcyhpKSkrIiwiKyh0aGlzLl95MT1uK2UqTWF0aC5zaW4oaSkpKSl9LHJlY3Q6ZnVuY3Rpb24odCxuLGUscil7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPStuKSsiaCIrICtlKyJ2IisgK3IrImgiKy1lKyJaIn0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX07dmFyIFJkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciB0LGE9U2QuY2FsbChhcmd1bWVudHMpLGM9bi5hcHBseSh0aGlzLGEpLHM9ZS5hcHBseSh0aGlzLGEpLGY9K3IuYXBwbHkodGhpcywoYVswXT1jLGEpKSxsPWkuYXBwbHkodGhpcyxhKS1NZCxoPW8uYXBwbHkodGhpcyxhKS1NZCxwPWYqeGQobCksZD1mKmJkKGwpLHY9K3IuYXBwbHkodGhpcywoYVswXT1zLGEpKSxfPWkuYXBwbHkodGhpcyxhKS1NZCx5PW8uYXBwbHkodGhpcyxhKS1NZDtpZih1fHwodT10PVJlKCkpLHUubW92ZVRvKHAsZCksdS5hcmMoMCwwLGYsbCxoKSxsPT09XyYmaD09PXl8fCh1LnF1YWRyYXRpY0N1cnZlVG8oMCwwLHYqeGQoXyksdipiZChfKSksdS5hcmMoMCwwLHYsXyx5KSksdS5xdWFkcmF0aWNDdXJ2ZVRvKDAsMCxwLGQpLHUuY2xvc2VQYXRoKCksdClyZXR1cm4gdT1udWxsLHQrIiJ8fG51bGx9dmFyIG49cWUsZT1MZSxyPVVlLGk9RGUsbz1PZSx1PW51bGw7cmV0dXJuIHQucmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246RWQoK24pLHQpOnJ9LHQuc3RhcnRBbmdsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkVkKCtuKSx0KTppfSx0LmVuZEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246RWQoK24pLHQpOm99LHQuc291cmNlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWUsdCk6bn0sdC50YXJnZXQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix0KTplfSx0LmNvbnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bnVsbD09bj9udWxsOm4sdCk6dX0sdH0scWQ9IiQiO0ZlLnByb3RvdHlwZT1JZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkZlLGhhczpmdW5jdGlvbih0KXtyZXR1cm4gcWQrdCBpbiB0aGlzfSxnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbcWQrdF19LHNldDpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzW3FkK3RdPW4sdGhpc30scmVtb3ZlOmZ1bmN0aW9uKHQpe3ZhciBuPXFkK3Q7cmV0dXJuIG4gaW4gdGhpcyYmZGVsZXRlIHRoaXNbbl19LGNsZWFyOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpdFswXT09PXFkJiZkZWxldGUgdGhpc1t0XX0sa2V5czpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiB0aGlzKW5bMF09PT1xZCYmdC5wdXNoKG4uc2xpY2UoMSkpO3JldHVybiB0fSx2YWx1ZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gdGhpcyluWzBdPT09cWQmJnQucHVzaCh0aGlzW25dKTtyZXR1cm4gdH0sZW50cmllczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiB0aGlzKW5bMF09PT1xZCYmdC5wdXNoKHtrZXk6bi5zbGljZSgxKSx2YWx1ZTp0aGlzW25dfSk7cmV0dXJuIHR9LHNpemU6ZnVuY3Rpb24oKXt2YXIgdD0wO2Zvcih2YXIgbiBpbiB0aGlzKW5bMF09PT1xZCYmKyt0O3JldHVybiB0fSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzKWlmKHRbMF09PT1xZClyZXR1cm4hMTtyZXR1cm4hMH0sZWFjaDpmdW5jdGlvbih0KXtmb3IodmFyIG4gaW4gdGhpcyluWzBdPT09cWQmJnQodGhpc1tuXSxuLnNsaWNlKDEpLHRoaXMpfX07dmFyIExkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChuLGksdSxhKXtpZihpPj1vLmxlbmd0aClyZXR1cm4gbnVsbCE9cj9yKG4pOm51bGwhPWU/bi5zb3J0KGUpOm47Zm9yKHZhciBjLHMsZixsPS0xLGg9bi5sZW5ndGgscD1vW2krK10sZD1JZSgpLHY9dSgpOysrbDxoOykoZj1kLmdldChjPXAocz1uW2xdKSsiIikpP2YucHVzaChzKTpkLnNldChjLFtzXSk7cmV0dXJuIGQuZWFjaChmdW5jdGlvbihuLGUpe2EodixlLHQobixpLHUsYSkpfSksdn1mdW5jdGlvbiBuKHQsZSl7aWYoKytlPm8ubGVuZ3RoKXJldHVybiB0O3ZhciBpLGE9dVtlLTFdO3JldHVybiBudWxsIT1yJiZlPj1vLmxlbmd0aD9pPXQuZW50cmllcygpOihpPVtdLHQuZWFjaChmdW5jdGlvbih0LHIpe2kucHVzaCh7a2V5OnIsdmFsdWVzOm4odCxlKX0pfSkpLG51bGwhPWE/aS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIGEodC5rZXksbi5rZXkpfSk6aX12YXIgZSxyLGksbz1bXSx1PVtdO3JldHVybiBpPXtvYmplY3Q6ZnVuY3Rpb24obil7cmV0dXJuIHQobiwwLFllLEJlKX0sbWFwOmZ1bmN0aW9uKG4pe3JldHVybiB0KG4sMCxqZSxIZSl9LGVudHJpZXM6ZnVuY3Rpb24oZSl7cmV0dXJuIG4odChlLDAsamUsSGUpLDApfSxrZXk6ZnVuY3Rpb24odCl7cmV0dXJuIG8ucHVzaCh0KSxpfSxzb3J0S2V5czpmdW5jdGlvbih0KXtyZXR1cm4gdVtvLmxlbmd0aC0xXT10LGl9LHNvcnRWYWx1ZXM6ZnVuY3Rpb24odCl7cmV0dXJuIGU9dCxpfSxyb2xsdXA6ZnVuY3Rpb24odCl7cmV0dXJuIHI9dCxpfX19LFVkPUllLnByb3RvdHlwZTtYZS5wcm90b3R5cGU9VmUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpYZSxoYXM6VWQuaGFzLGFkZDpmdW5jdGlvbih0KXtyZXR1cm4gdCs9IiIsdGhpc1txZCt0XT10LHRoaXN9LHJlbW92ZTpVZC5yZW1vdmUsY2xlYXI6VWQuY2xlYXIsdmFsdWVzOlVkLmtleXMsc2l6ZTpVZC5zaXplLGVtcHR5OlVkLmVtcHR5LGVhY2g6VWQuZWFjaH07dmFyIERkPWZ1bmN0aW9uKHQpe3ZhciBuPVtdO2Zvcih2YXIgZSBpbiB0KW4ucHVzaChlKTtyZXR1cm4gbn0sT2Q9ZnVuY3Rpb24odCl7dmFyIG49W107Zm9yKHZhciBlIGluIHQpbi5wdXNoKHRbZV0pO3JldHVybiBufSxGZD1mdW5jdGlvbih0KXt2YXIgbj1bXTtmb3IodmFyIGUgaW4gdCluLnB1c2goe2tleTplLHZhbHVlOnRbZV19KTtyZXR1cm4gbn0sSWQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbih0LG4pe3ZhciByLGksbz1lKHQsZnVuY3Rpb24odCxlKXtyZXR1cm4gcj9yKHQsZS0xKTooaT10LHZvaWQocj1uPyRlKHQsbik6V2UodCkpKX0pO3JldHVybiBvLmNvbHVtbnM9aSxvfWZ1bmN0aW9uIGUodCxuKXtmdW5jdGlvbiBlKCl7aWYoZj49cylyZXR1cm4gdTtpZihpKXJldHVybiBpPSExLG87dmFyIG4sZT1mO2lmKDM0PT09dC5jaGFyQ29kZUF0KGUpKXtmb3IodmFyIHI9ZTtyKys8czspaWYoMzQ9PT10LmNoYXJDb2RlQXQocikpe2lmKDM0IT09dC5jaGFyQ29kZUF0KHIrMSkpYnJlYWs7KytyfXJldHVybiBmPXIrMixuPXQuY2hhckNvZGVBdChyKzEpLDEzPT09bj8oaT0hMCwxMD09PXQuY2hhckNvZGVBdChyKzIpJiYrK2YpOjEwPT09biYmKGk9ITApLHQuc2xpY2UoZSsxLHIpLnJlcGxhY2UoLyIiL2csJyInKX1mb3IoO2Y8czspe3ZhciBhPTE7aWYobj10LmNoYXJDb2RlQXQoZisrKSwxMD09PW4paT0hMDtlbHNlIGlmKDEzPT09bilpPSEwLDEwPT09dC5jaGFyQ29kZUF0KGYpJiYoKytmLCsrYSk7ZWxzZSBpZihuIT09Yyljb250aW51ZTtyZXR1cm4gdC5zbGljZShlLGYtYSl9cmV0dXJuIHQuc2xpY2UoZSl9Zm9yKHZhciByLGksbz17fSx1PXt9LGE9W10scz10Lmxlbmd0aCxmPTAsbD0wOyhyPWUoKSkhPT11Oyl7Zm9yKHZhciBoPVtdO3IhPT1vJiZyIT09dTspaC5wdXNoKHIpLHI9ZSgpO24mJm51bGw9PShoPW4oaCxsKyspKXx8YS5wdXNoKGgpfXJldHVybiBhfWZ1bmN0aW9uIHIobixlKXtyZXR1cm4gbnVsbD09ZSYmKGU9WmUobikpLFtlLm1hcCh1KS5qb2luKHQpXS5jb25jYXQobi5tYXAoZnVuY3Rpb24obil7cmV0dXJuIGUubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB1KG5bdF0pfSkuam9pbih0KX0pKS5qb2luKCJcbiIpfWZ1bmN0aW9uIGkodCl7cmV0dXJuIHQubWFwKG8pLmpvaW4oIlxuIil9ZnVuY3Rpb24gbyhuKXtyZXR1cm4gbi5tYXAodSkuam9pbih0KX1mdW5jdGlvbiB1KHQpe3JldHVybiBudWxsPT10PyIiOmEudGVzdCh0Kz0iIik/JyInK3QucmVwbGFjZSgvXCIvZywnIiInKSsnIic6dH12YXIgYT1uZXcgUmVnRXhwKCdbIicrdCsiXG5dIiksYz10LmNoYXJDb2RlQXQoMCk7cmV0dXJue3BhcnNlOm4scGFyc2VSb3dzOmUsZm9ybWF0OnIsZm9ybWF0Um93czppfX0sWWQ9SWQoIiwiKSxCZD1ZZC5wYXJzZSxqZD1ZZC5wYXJzZVJvd3MsSGQ9WWQuZm9ybWF0LFhkPVlkLmZvcm1hdFJvd3MsVmQ9SWQoIlx0IiksV2Q9VmQucGFyc2UsJGQ9VmQucGFyc2VSb3dzLFpkPVZkLmZvcm1hdCxHZD1WZC5mb3JtYXRSb3dzLEpkPWZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZSgpe3ZhciBlLGksbz1yLmxlbmd0aCx1PTAsYT0wO2ZvcihlPTA7ZTxvOysrZSlpPXJbZV0sdSs9aS54LGErPWkueTtmb3IodT11L28tdCxhPWEvby1uLGU9MDtlPG87KytlKWk9cltlXSxpLngtPXUsaS55LT1hfXZhciByO3JldHVybiBudWxsPT10JiYodD0wKSxudWxsPT1uJiYobj0wKSxlLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7cj10fSxlLng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9K24sZSk6dH0sZS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0LGUpOm59LGV9LFFkPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0sS2Q9ZnVuY3Rpb24oKXtyZXR1cm4gMWUtNiooTWF0aC5yYW5kb20oKS0uNSl9LHR2PWZ1bmN0aW9uKHQpe3ZhciBuPSt0aGlzLl94LmNhbGwobnVsbCx0KSxlPSt0aGlzLl95LmNhbGwobnVsbCx0KTtyZXR1cm4gR2UodGhpcy5jb3ZlcihuLGUpLG4sZSx0KX0sbnY9ZnVuY3Rpb24odCxuKXtpZihpc05hTih0PSt0KXx8aXNOYU4obj0rbikpcmV0dXJuIHRoaXM7dmFyIGU9dGhpcy5feDAscj10aGlzLl95MCxpPXRoaXMuX3gxLG89dGhpcy5feTE7aWYoaXNOYU4oZSkpaT0oZT1NYXRoLmZsb29yKHQpKSsxLG89KHI9TWF0aC5mbG9vcihuKSkrMTtlbHNle2lmKCEoZT50fHx0Pml8fHI+bnx8bj5vKSlyZXR1cm4gdGhpczt2YXIgdSxhLGM9aS1lLHM9dGhpcy5fcm9vdDtzd2l0Y2goYT0objwocitvKS8yKTw8MXx0PChlK2kpLzIpe2Nhc2UgMDpkbyB1PW5ldyBBcnJheSg0KSx1W2FdPXMscz11O3doaWxlKGMqPTIsaT1lK2Msbz1yK2MsdD5pfHxuPm8pO2JyZWFrO2Nhc2UgMTpkbyB1PW5ldyBBcnJheSg0KSx1W2FdPXMscz11O3doaWxlKGMqPTIsZT1pLWMsbz1yK2MsZT50fHxuPm8pO2JyZWFrO2Nhc2UgMjpkbyB1PW5ldyBBcnJheSg0KSx1W2FdPXMscz11O3doaWxlKGMqPTIsaT1lK2Mscj1vLWMsdD5pfHxyPm4pO2JyZWFrO2Nhc2UgMzpkbyB1PW5ldyBBcnJheSg0KSx1W2FdPXMscz11O3doaWxlKGMqPTIsZT1pLWMscj1vLWMsZT50fHxyPm4pfXRoaXMuX3Jvb3QmJnRoaXMuX3Jvb3QubGVuZ3RoJiYodGhpcy5fcm9vdD1zKX1yZXR1cm4gdGhpcy5feDA9ZSx0aGlzLl95MD1yLHRoaXMuX3gxPWksdGhpcy5feTE9byx0aGlzfSxldj1mdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLnZpc2l0KGZ1bmN0aW9uKG4pe2lmKCFuLmxlbmd0aClkbyB0LnB1c2gobi5kYXRhKTt3aGlsZShuPW4ubmV4dCl9KSx0fSxydj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmNvdmVyKCt0WzBdWzBdLCt0WzBdWzFdKS5jb3ZlcigrdFsxXVswXSwrdFsxXVsxXSk6aXNOYU4odGhpcy5feDApP3ZvaWQgMDpbW3RoaXMuX3gwLHRoaXMuX3kwXSxbdGhpcy5feDEsdGhpcy5feTFdXX0saXY9ZnVuY3Rpb24odCxuLGUscixpKXt0aGlzLm5vZGU9dCx0aGlzLngwPW4sdGhpcy55MD1lLHRoaXMueDE9cix0aGlzLnkxPWl9LG92PWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG8sdSxhLGMscyxmPXRoaXMuX3gwLGw9dGhpcy5feTAsaD10aGlzLl94MSxwPXRoaXMuX3kxLGQ9W10sdj10aGlzLl9yb290O2Zvcih2JiZkLnB1c2gobmV3IGl2KHYsZixsLGgscCkpLG51bGw9PWU/ZT0xLzA6KGY9dC1lLGw9bi1lLGg9dCtlLHA9bitlLGUqPWUpO2M9ZC5wb3AoKTspaWYoISghKHY9Yy5ub2RlKXx8KGk9Yy54MCk+aHx8KG89Yy55MCk+cHx8KHU9Yy54MSk8Znx8KGE9Yy55MSk8bCkpaWYodi5sZW5ndGgpe3ZhciBfPShpK3UpLzIseT0obythKS8yO2QucHVzaChuZXcgaXYodlszXSxfLHksdSxhKSxuZXcgaXYodlsyXSxpLHksXyxhKSxuZXcgaXYodlsxXSxfLG8sdSx5KSxuZXcgaXYodlswXSxpLG8sXyx5KSksKHM9KG4+PXkpPDwxfHQ+PV8pJiYoYz1kW2QubGVuZ3RoLTFdLGRbZC5sZW5ndGgtMV09ZFtkLmxlbmd0aC0xLXNdLGRbZC5sZW5ndGgtMS1zXT1jKX1lbHNle3ZhciBnPXQtK3RoaXMuX3guY2FsbChudWxsLHYuZGF0YSksbT1uLSt0aGlzLl95LmNhbGwobnVsbCx2LmRhdGEpLHg9ZypnK20qbTtpZih4PGUpe3ZhciBiPU1hdGguc3FydChlPXgpO2Y9dC1iLGw9bi1iLGg9dCtiLHA9bitiLHI9di5kYXRhfX1yZXR1cm4gcn0sdXY9ZnVuY3Rpb24odCl7aWYoaXNOYU4obz0rdGhpcy5feC5jYWxsKG51bGwsdCkpfHxpc05hTih1PSt0aGlzLl95LmNhbGwobnVsbCx0KSkpcmV0dXJuIHRoaXM7dmFyIG4sZSxyLGksbyx1LGEsYyxzLGYsbCxoLHA9dGhpcy5fcm9vdCxkPXRoaXMuX3gwLHY9dGhpcy5feTAsXz10aGlzLl94MSx5PXRoaXMuX3kxO2lmKCFwKXJldHVybiB0aGlzO2lmKHAubGVuZ3RoKWZvcig7Oyl7aWYoKHM9bz49KGE9KGQrXykvMikpP2Q9YTpfPWEsKGY9dT49KGM9KHYreSkvMikpP3Y9Yzp5PWMsbj1wLCEocD1wW2w9Zjw8MXxzXSkpcmV0dXJuIHRoaXM7aWYoIXAubGVuZ3RoKWJyZWFrOyhuW2wrMSYzXXx8bltsKzImM118fG5bbCszJjNdKSYmKGU9bixoPWwpfWZvcig7cC5kYXRhIT09dDspaWYocj1wLCEocD1wLm5leHQpKXJldHVybiB0aGlzO3JldHVybihpPXAubmV4dCkmJmRlbGV0ZSBwLm5leHQscj8oaT9yLm5leHQ9aTpkZWxldGUgci5uZXh0LHRoaXMpOm4/KGk/bltsXT1pOmRlbGV0ZSBuW2xdLChwPW5bMF18fG5bMV18fG5bMl18fG5bM10pJiZwPT09KG5bM118fG5bMl18fG5bMV18fG5bMF0pJiYhcC5sZW5ndGgmJihlP2VbaF09cDp0aGlzLl9yb290PXApLHRoaXMpOih0aGlzLl9yb290PWksdGhpcyl9LGF2PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jvb3R9LGN2PWZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy52aXNpdChmdW5jdGlvbihuKXtpZighbi5sZW5ndGgpZG8rK3Q7d2hpbGUobj1uLm5leHQpfSksdH0sc3Y9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbyx1LGE9W10sYz10aGlzLl9yb290O2ZvcihjJiZhLnB1c2gobmV3IGl2KGMsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtuPWEucG9wKCk7KWlmKCF0KGM9bi5ub2RlLHI9bi54MCxpPW4ueTAsbz1uLngxLHU9bi55MSkmJmMubGVuZ3RoKXt2YXIgcz0ocitvKS8yLGY9KGkrdSkvMjsoZT1jWzNdKSYmYS5wdXNoKG5ldyBpdihlLHMsZixvLHUpKSwoZT1jWzJdKSYmYS5wdXNoKG5ldyBpdihlLHIsZixzLHUpKSwoZT1jWzFdKSYmYS5wdXNoKG5ldyBpdihlLHMsaSxvLGYpKSwoZT1jWzBdKSYmYS5wdXNoKG5ldyBpdihlLHIsaSxzLGYpKX1yZXR1cm4gdGhpc30sZnY9ZnVuY3Rpb24odCl7dmFyIG4sZT1bXSxyPVtdO2Zvcih0aGlzLl9yb290JiZlLnB1c2gobmV3IGl2KHRoaXMuX3Jvb3QsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtuPWUucG9wKCk7KXt2YXIgaT1uLm5vZGU7aWYoaS5sZW5ndGgpe3ZhciBvLHU9bi54MCxhPW4ueTAsYz1uLngxLHM9bi55MSxmPSh1K2MpLzIsbD0oYStzKS8yOyhvPWlbMF0pJiZlLnB1c2gobmV3IGl2KG8sdSxhLGYsbCkpLChvPWlbMV0pJiZlLnB1c2gobmV3IGl2KG8sZixhLGMsbCkpLChvPWlbMl0pJiZlLnB1c2gobmV3IGl2KG8sdSxsLGYscykpLChvPWlbM10pJiZlLnB1c2gobmV3IGl2KG8sZixsLGMscykpfXIucHVzaChuKX1mb3IoO249ci5wb3AoKTspdChuLm5vZGUsbi54MCxuLnkwLG4ueDEsbi55MSk7cmV0dXJuIHRoaXN9LGx2PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl94PXQsdGhpcyk6dGhpcy5feH0saHY9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3k9dCx0aGlzKTp0aGlzLl95fSxwdj1uci5wcm90b3R5cGU9ZXIucHJvdG90eXBlO3B2LmNvcHk9ZnVuY3Rpb24oKXt2YXIgdCxuLGU9bmV3IGVyKHRoaXMuX3gsdGhpcy5feSx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkscj10aGlzLl9yb290O2lmKCFyKXJldHVybiBlO2lmKCFyLmxlbmd0aClyZXR1cm4gZS5fcm9vdD1ycihyKSxlO2Zvcih0PVt7c291cmNlOnIsdGFyZ2V0OmUuX3Jvb3Q9bmV3IEFycmF5KDQpfV07cj10LnBvcCgpOylmb3IodmFyIGk9MDtpPDQ7KytpKShuPXIuc291cmNlW2ldKSYmKG4ubGVuZ3RoP3QucHVzaCh7c291cmNlOm4sdGFyZ2V0OnIudGFyZ2V0W2ldPW5ldyBBcnJheSg0KX0pOnIudGFyZ2V0W2ldPXJyKG4pKTtyZXR1cm4gZX0scHYuYWRkPXR2LHB2LmFkZEFsbD1KZSxwdi5jb3Zlcj1udixwdi5kYXRhPWV2LHB2LmV4dGVudD1ydixwdi5maW5kPW92LHB2LnJlbW92ZT11dixwdi5yZW1vdmVBbGw9UWUscHYucm9vdD1hdixwdi5zaXplPWN2LHB2LnZpc2l0PXN2LHB2LnZpc2l0QWZ0ZXI9ZnYscHYueD1sdixwdi55PWh2O3ZhciBkdix2dj1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKCl7ZnVuY3Rpb24gdCh0LG4sZSxyLGkpe3ZhciBvPXQuZGF0YSxhPXQucixwPWwrYTt7aWYoIW8pcmV0dXJuIG4+cytwfHxyPHMtcHx8ZT5mK3B8fGk8Zi1wO2lmKG8uaW5kZXg+Yy5pbmRleCl7dmFyIGQ9cy1vLngtby52eCx2PWYtby55LW8udnksXz1kKmQrdip2O188cCpwJiYoMD09PWQmJihkPUtkKCksXys9ZCpkKSwwPT09diYmKHY9S2QoKSxfKz12KnYpLF89KHAtKF89TWF0aC5zcXJ0KF8pKSkvXyp1LGMudngrPShkKj1fKSoocD0oYSo9YSkvKGgrYSkpLGMudnkrPSh2Kj1fKSpwLG8udngtPWQqKHA9MS1wKSxvLnZ5LT12KnApfX19Zm9yKHZhciBuLHIsYyxzLGYsbCxoLHA9aS5sZW5ndGgsZD0wO2Q8YTsrK2QpZm9yKHI9bnIoaSxpcixvcikudmlzaXRBZnRlcihlKSxuPTA7bjxwOysrbiljPWlbbl0sbD1vW2MuaW5kZXhdLGg9bCpsLHM9Yy54K2MudngsZj1jLnkrYy52eSxyLnZpc2l0KHQpfWZ1bmN0aW9uIGUodCl7aWYodC5kYXRhKXJldHVybiB0LnI9b1t0LmRhdGEuaW5kZXhdO2Zvcih2YXIgbj10LnI9MDtuPDQ7KytuKXRbbl0mJnRbbl0ucj50LnImJih0LnI9dFtuXS5yKX1mdW5jdGlvbiByKCl7aWYoaSl7dmFyIG4sZSxyPWkubGVuZ3RoO2ZvcihvPW5ldyBBcnJheShyKSxuPTA7bjxyOysrbillPWlbbl0sb1tlLmluZGV4XT0rdChlLG4saSl9fXZhciBpLG8sdT0xLGE9MTtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9UWQobnVsbD09dD8xOit0KSksbi5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2k9dCxyKCl9LG4uaXRlcmF0aW9ucz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0rdCxuKTphfSxuLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSt0LG4pOnV9LG4ucmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6UWQoK2UpLHIoKSxuKTp0fSxufSxfdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKHQpe3JldHVybiAxL01hdGgubWluKHNbdC5zb3VyY2UuaW5kZXhdLHNbdC50YXJnZXQuaW5kZXhdKX1mdW5jdGlvbiBlKG4pe2Zvcih2YXIgZT0wLHI9dC5sZW5ndGg7ZTxkOysrZSlmb3IodmFyIGksbyxjLHMsbCxoLHAsdj0wO3Y8cjsrK3YpaT10W3ZdLG89aS5zb3VyY2UsYz1pLnRhcmdldCxzPWMueCtjLnZ4LW8ueC1vLnZ4fHxLZCgpLGw9Yy55K2Mudnktby55LW8udnl8fEtkKCksaD1NYXRoLnNxcnQocypzK2wqbCksaD0oaC1hW3ZdKS9oKm4qdVt2XSxzKj1oLGwqPWgsYy52eC09cyoocD1mW3ZdKSxjLnZ5LT1sKnAsby52eCs9cyoocD0xLXApLG8udnkrPWwqcH1mdW5jdGlvbiByKCl7aWYoYyl7dmFyIG4sZSxyPWMubGVuZ3RoLGg9dC5sZW5ndGgscD1JZShjLGwpO2ZvcihuPTAscz1uZXcgQXJyYXkocik7bjxoOysrbillPXRbbl0sZS5pbmRleD1uLCJvYmplY3QiIT10eXBlb2YgZS5zb3VyY2UmJihlLnNvdXJjZT1hcihwLGUuc291cmNlKSksIm9iamVjdCIhPXR5cGVvZiBlLnRhcmdldCYmKGUudGFyZ2V0PWFyKHAsZS50YXJnZXQpKSxzW2Uuc291cmNlLmluZGV4XT0oc1tlLnNvdXJjZS5pbmRleF18fDApKzEsc1tlLnRhcmdldC5pbmRleF09KHNbZS50YXJnZXQuaW5kZXhdfHwwKSsxO2ZvcihuPTAsZj1uZXcgQXJyYXkoaCk7bjxoOysrbillPXRbbl0sZltuXT1zW2Uuc291cmNlLmluZGV4XS8oc1tlLnNvdXJjZS5pbmRleF0rc1tlLnRhcmdldC5pbmRleF0pO3U9bmV3IEFycmF5KGgpLGkoKSxhPW5ldyBBcnJheShoKSxvKCl9fWZ1bmN0aW9uIGkoKXtpZihjKWZvcih2YXIgbj0wLGU9dC5sZW5ndGg7bjxlOysrbil1W25dPStoKHRbbl0sbix0KX1mdW5jdGlvbiBvKCl7aWYoYylmb3IodmFyIG49MCxlPXQubGVuZ3RoO248ZTsrK24pYVtuXT0rcCh0W25dLG4sdCl9dmFyIHUsYSxjLHMsZixsPXVyLGg9bixwPVFkKDMwKSxkPTE7cmV0dXJuIG51bGw9PXQmJih0PVtdKSxlLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7Yz10LHIoKX0sZS5saW5rcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLHIoKSxlKTp0fSxlLmlkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPXQsZSk6bH0sZS5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPSt0LGUpOmR9LGUuc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRZCgrdCksaSgpLGUpOmh9LGUuZGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRZCgrdCksbygpLGUpOnB9LGV9LHl2PTEwLGd2PU1hdGguUEkqKDMtTWF0aC5zcXJ0KDUpKSxtdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKCl7ZSgpLGQuY2FsbCgidGljayIsbyksdTxhJiYoaC5zdG9wKCksZC5jYWxsKCJlbmQiLG8pKX1mdW5jdGlvbiBlKCl7dmFyIG4sZSxyPXQubGVuZ3RoO2Zvcih1Kz0ocy11KSpjLGwuZWFjaChmdW5jdGlvbih0KXt0KHUpfSksbj0wO248cjsrK24pZT10W25dLG51bGw9PWUuZng/ZS54Kz1lLnZ4Kj1mOihlLng9ZS5meCxlLnZ4PTApLG51bGw9PWUuZnk/ZS55Kz1lLnZ5Kj1mOihlLnk9ZS5meSxlLnZ5PTApfWZ1bmN0aW9uIHIoKXtmb3IodmFyIG4sZT0wLHI9dC5sZW5ndGg7ZTxyOysrZSl7aWYobj10W2VdLG4uaW5kZXg9ZSxpc05hTihuLngpfHxpc05hTihuLnkpKXt2YXIgaT15dipNYXRoLnNxcnQoZSksbz1lKmd2O24ueD1pKk1hdGguY29zKG8pLG4ueT1pKk1hdGguc2luKG8pfShpc05hTihuLnZ4KXx8aXNOYU4obi52eSkpJiYobi52eD1uLnZ5PTApfX1mdW5jdGlvbiBpKG4pe3JldHVybiBuLmluaXRpYWxpemUmJm4uaW5pdGlhbGl6ZSh0KSxufXZhciBvLHU9MSxhPS4wMDEsYz0xLU1hdGgucG93KGEsMS8zMDApLHM9MCxmPS42LGw9SWUoKSxoPV9uKG4pLGQ9cCgidGljayIsImVuZCIpO3JldHVybiBudWxsPT10JiYodD1bXSkscigpLG89e3RpY2s6ZSxyZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIGgucmVzdGFydChuKSxvfSxzdG9wOmZ1bmN0aW9uKCl7cmV0dXJuIGguc3RvcCgpLG99LG5vZGVzOmZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4scigpLGwuZWFjaChpKSxvKTp0fSxhbHBoYTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0rdCxvKTp1fSxhbHBoYU1pbjpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0rdCxvKTphfSxhbHBoYURlY2F5OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSt0LG8pOitjfSxhbHBoYVRhcmdldDpmdW5jdGlvbih0KXsNCnJldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSt0LG8pOnN9LHZlbG9jaXR5RGVjYXk6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9MS10LG8pOjEtZn0sZm9yY2U6ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xPyhudWxsPT1uP2wucmVtb3ZlKHQpOmwuc2V0KHQsaShuKSksbyk6bC5nZXQodCl9LGZpbmQ6ZnVuY3Rpb24obixlLHIpe3ZhciBpLG8sdSxhLGMscz0wLGY9dC5sZW5ndGg7Zm9yKG51bGw9PXI/cj0xLzA6cio9cixzPTA7czxmOysrcylhPXRbc10saT1uLWEueCxvPWUtYS55LHU9aSppK28qbyx1PHImJihjPWEscj11KTtyZXR1cm4gY30sb246ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xPyhkLm9uKHQsbiksbyk6ZC5vbih0KX19fSx4dj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIG4sYT1pLmxlbmd0aCxjPW5yKGksY3Isc3IpLnZpc2l0QWZ0ZXIoZSk7Zm9yKHU9dCxuPTA7bjxhOysrbilvPWlbbl0sYy52aXNpdChyKX1mdW5jdGlvbiBuKCl7aWYoaSl7dmFyIHQsbixlPWkubGVuZ3RoO2ZvcihhPW5ldyBBcnJheShlKSx0PTA7dDxlOysrdCluPWlbdF0sYVtuLmluZGV4XT0rYyhuLHQsaSl9fWZ1bmN0aW9uIGUodCl7dmFyIG4sZSxyLGksbyx1PTA7aWYodC5sZW5ndGgpe2ZvcihyPWk9bz0wO288NDsrK28pKG49dFtvXSkmJihlPW4udmFsdWUpJiYodSs9ZSxyKz1lKm4ueCxpKz1lKm4ueSk7dC54PXIvdSx0Lnk9aS91fWVsc2V7bj10LG4ueD1uLmRhdGEueCxuLnk9bi5kYXRhLnk7ZG8gdSs9YVtuLmRhdGEuaW5kZXhdO3doaWxlKG49bi5uZXh0KX10LnZhbHVlPXV9ZnVuY3Rpb24gcih0LG4sZSxyKXtpZighdC52YWx1ZSlyZXR1cm4hMDt2YXIgaT10Lngtby54LGM9dC55LW8ueSxoPXItbixwPWkqaStjKmM7aWYoaCpoL2w8cClyZXR1cm4gcDxmJiYoMD09PWkmJihpPUtkKCkscCs9aSppKSwwPT09YyYmKGM9S2QoKSxwKz1jKmMpLHA8cyYmKHA9TWF0aC5zcXJ0KHMqcCkpLG8udngrPWkqdC52YWx1ZSp1L3Asby52eSs9Yyp0LnZhbHVlKnUvcCksITA7aWYoISh0Lmxlbmd0aHx8cD49Zikpeyh0LmRhdGEhPT1vfHx0Lm5leHQpJiYoMD09PWkmJihpPUtkKCkscCs9aSppKSwwPT09YyYmKGM9S2QoKSxwKz1jKmMpLHA8cyYmKHA9TWF0aC5zcXJ0KHMqcCkpKTtkbyB0LmRhdGEhPT1vJiYoaD1hW3QuZGF0YS5pbmRleF0qdS9wLG8udngrPWkqaCxvLnZ5Kz1jKmgpO3doaWxlKHQ9dC5uZXh0KX19dmFyIGksbyx1LGEsYz1RZCgtMzApLHM9MSxmPTEvMCxsPS44MTtyZXR1cm4gdC5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2k9dCxuKCl9LHQuc3RyZW5ndGg9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpRZCgrZSksbigpLHQpOmN9LHQuZGlzdGFuY2VNaW49ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9bipuLHQpOk1hdGguc3FydChzKX0sdC5kaXN0YW5jZU1heD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1uKm4sdCk6TWF0aC5zcXJ0KGYpfSx0LnRoZXRhPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4qbix0KTpNYXRoLnNxcnQobCl9LHR9LGJ2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4odCl7Zm9yKHZhciBuLGU9MCx1PXIubGVuZ3RoO2U8dTsrK2Upbj1yW2VdLG4udngrPShvW2VdLW4ueCkqaVtlXSp0fWZ1bmN0aW9uIGUoKXtpZihyKXt2YXIgbixlPXIubGVuZ3RoO2ZvcihpPW5ldyBBcnJheShlKSxvPW5ldyBBcnJheShlKSxuPTA7bjxlOysrbilpW25dPWlzTmFOKG9bbl09K3QocltuXSxuLHIpKT8wOit1KHJbbl0sbixyKX19dmFyIHIsaSxvLHU9UWQoLjEpO3JldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RZChudWxsPT10PzA6K3QpKSxuLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7cj10LGUoKX0sbi5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlFkKCt0KSxlKCksbik6dX0sbi54PWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiByP3I6UWQoK3IpLGUoKSxuKTp0fSxufSx3dj1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKHQpe2Zvcih2YXIgbixlPTAsdT1yLmxlbmd0aDtlPHU7KytlKW49cltlXSxuLnZ5Kz0ob1tlXS1uLnkpKmlbZV0qdH1mdW5jdGlvbiBlKCl7aWYocil7dmFyIG4sZT1yLmxlbmd0aDtmb3IoaT1uZXcgQXJyYXkoZSksbz1uZXcgQXJyYXkoZSksbj0wO248ZTsrK24paVtuXT1pc05hTihvW25dPSt0KHJbbl0sbixyKSk/MDordShyW25dLG4scil9fXZhciByLGksbyx1PVFkKC4xKTtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9UWQobnVsbD09dD8wOit0KSksbi5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe3I9dCxlKCl9LG4uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRZCgrdCksZSgpLG4pOnV9LG4ueT1mdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yOlFkKCtyKSxlKCksbik6dH0sbn0sTXY9ZnVuY3Rpb24odCxuKXtpZigoZT0odD1uP3QudG9FeHBvbmVudGlhbChuLTEpOnQudG9FeHBvbmVudGlhbCgpKS5pbmRleE9mKCJlIikpPDApcmV0dXJuIG51bGw7dmFyIGUscj10LnNsaWNlKDAsZSk7cmV0dXJuW3IubGVuZ3RoPjE/clswXStyLnNsaWNlKDIpOnIsK3Quc2xpY2UoZSsxKV19LFR2PWZ1bmN0aW9uKHQpe3JldHVybiB0PU12KE1hdGguYWJzKHQpKSx0P3RbMV06TmFOfSxOdj1mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbihlLHIpe2Zvcih2YXIgaT1lLmxlbmd0aCxvPVtdLHU9MCxhPXRbMF0sYz0wO2k+MCYmYT4wJiYoYythKzE+ciYmKGE9TWF0aC5tYXgoMSxyLWMpKSxvLnB1c2goZS5zdWJzdHJpbmcoaS09YSxpK2EpKSwhKChjKz1hKzEpPnIpKTspYT10W3U9KHUrMSkldC5sZW5ndGhdO3JldHVybiBvLnJldmVyc2UoKS5qb2luKG4pfX0sa3Y9ZnVuY3Rpb24odCxuKXt0PXQudG9QcmVjaXNpb24obik7dDpmb3IodmFyIGUscj10Lmxlbmd0aCxpPTEsbz0tMTtpPHI7KytpKXN3aXRjaCh0W2ldKXtjYXNlIi4iOm89ZT1pO2JyZWFrO2Nhc2UiMCI6MD09PW8mJihvPWkpLGU9aTticmVhaztjYXNlImUiOmJyZWFrIHQ7ZGVmYXVsdDpvPjAmJihvPTApfXJldHVybiBvPjA/dC5zbGljZSgwLG8pK3Quc2xpY2UoZSsxKTp0fSxTdj1mdW5jdGlvbih0LG4pe3ZhciBlPU12KHQsbik7aWYoIWUpcmV0dXJuIHQrIiI7dmFyIHI9ZVswXSxpPWVbMV0sbz1pLShkdj0zKk1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihpLzMpKSkpKzEsdT1yLmxlbmd0aDtyZXR1cm4gbz09PXU/cjpvPnU/cituZXcgQXJyYXkoby11KzEpLmpvaW4oIjAiKTpvPjA/ci5zbGljZSgwLG8pKyIuIityLnNsaWNlKG8pOiIwLiIrbmV3IEFycmF5KDEtbykuam9pbigiMCIpK012KHQsTWF0aC5tYXgoMCxuK28tMSkpWzBdfSxFdj1mdW5jdGlvbih0LG4pe3ZhciBlPU12KHQsbik7aWYoIWUpcmV0dXJuIHQrIiI7dmFyIHI9ZVswXSxpPWVbMV07cmV0dXJuIGk8MD8iMC4iK25ldyBBcnJheSgtaSkuam9pbigiMCIpK3I6ci5sZW5ndGg+aSsxP3Iuc2xpY2UoMCxpKzEpKyIuIityLnNsaWNlKGkrMSk6cituZXcgQXJyYXkoaS1yLmxlbmd0aCsyKS5qb2luKCIwIil9LEF2PXsiIjprdiwiJSI6ZnVuY3Rpb24odCxuKXtyZXR1cm4oMTAwKnQpLnRvRml4ZWQobil9LGI6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMil9LGM6ZnVuY3Rpb24odCl7cmV0dXJuIHQrIiJ9LGQ6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTApfSxlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQudG9FeHBvbmVudGlhbChuKX0sZjpmdW5jdGlvbih0LG4pe3JldHVybiB0LnRvRml4ZWQobil9LGc6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdC50b1ByZWNpc2lvbihuKX0sbzpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZyg4KX0scDpmdW5jdGlvbih0LG4pe3JldHVybiBFdigxMDAqdCxuKX0scjpFdixzOlN2LFg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LHg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpfX0sQ3Y9L14oPzooLik/KFs8Pj1eXSkpPyhbK1wtXCggXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuXGQrKT8oW2EteiVdKT8kL2ksenY9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBmcih0KX07ZnIucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsbCt0aGlzLmFsaWduK3RoaXMuc2lnbit0aGlzLnN5bWJvbCsodGhpcy56ZXJvPyIwIjoiIikrKG51bGw9PXRoaXMud2lkdGg/IiI6TWF0aC5tYXgoMSwwfHRoaXMud2lkdGgpKSsodGhpcy5jb21tYT8iLCI6IiIpKyhudWxsPT10aGlzLnByZWNpc2lvbj8iIjoiLiIrTWF0aC5tYXgoMCwwfHRoaXMucHJlY2lzaW9uKSkrdGhpcy50eXBlfTt2YXIgUHYsUnY9WyJ5IiwieiIsImEiLCJmIiwicCIsIm4iLCLCtSIsIm0iLCIiLCJrIiwiTSIsIkciLCJUIiwiUCIsIkUiLCJaIiwiWSJdLHF2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4odCl7ZnVuY3Rpb24gbih0KXt2YXIgbixpLGMsZz1kLG09djtpZigiYyI9PT1wKW09Xyh0KSttLHQ9IiI7ZWxzZXt0PSt0O3ZhciB4PSh0PDB8fDEvdDwwKSYmKHQqPS0xLCEwKTtpZih0PV8odCxoKSx4KWZvcihuPS0xLGk9dC5sZW5ndGgseD0hMTsrK248aTspaWYoYz10LmNoYXJDb2RlQXQobiksNDg8YyYmYzw1OHx8IngiPT09cCYmOTY8YyYmYzwxMDN8fCJYIj09PXAmJjY0PGMmJmM8NzEpe3g9ITA7YnJlYWt9aWYoZz0oeD8iKCI9PT1hP2E6Ii0iOiItIj09PWF8fCIoIj09PWE/IiI6YSkrZyxtPW0rKCJzIj09PXA/UnZbOCtkdi8zXToiIikrKHgmJiIoIj09PWE/IikiOiIiKSx5KWZvcihuPS0xLGk9dC5sZW5ndGg7KytuPGk7KWlmKGM9dC5jaGFyQ29kZUF0KG4pLDQ4PmN8fGM+NTcpe209KDQ2PT09Yz9vK3Quc2xpY2UobisxKTp0LnNsaWNlKG4pKSttLHQ9dC5zbGljZSgwLG4pO2JyZWFrfX1sJiYhcyYmKHQ9cih0LDEvMCkpO3ZhciBiPWcubGVuZ3RoK3QubGVuZ3RoK20ubGVuZ3RoLHc9YjxmP25ldyBBcnJheShmLWIrMSkuam9pbihlKToiIjtzd2l0Y2gobCYmcyYmKHQ9cih3K3Qsdy5sZW5ndGg/Zi1tLmxlbmd0aDoxLzApLHc9IiIpLHUpe2Nhc2UiPCI6cmV0dXJuIGcrdCttK3c7Y2FzZSI9IjpyZXR1cm4gZyt3K3QrbTtjYXNlIl4iOnJldHVybiB3LnNsaWNlKDAsYj13Lmxlbmd0aD4+MSkrZyt0K20rdy5zbGljZShiKX1yZXR1cm4gdytnK3QrbX10PXp2KHQpO3ZhciBlPXQuZmlsbCx1PXQuYWxpZ24sYT10LnNpZ24sYz10LnN5bWJvbCxzPXQuemVybyxmPXQud2lkdGgsbD10LmNvbW1hLGg9dC5wcmVjaXNpb24scD10LnR5cGUsZD0iJCI9PT1jP2lbMF06IiMiPT09YyYmL1tib3hYXS8udGVzdChwKT8iMCIrcC50b0xvd2VyQ2FzZSgpOiIiLHY9IiQiPT09Yz9pWzFdOi9bJXBdLy50ZXN0KHApPyIlIjoiIixfPUF2W3BdLHk9IXB8fC9bZGVmZ3BycyVdLy50ZXN0KHApO3JldHVybiBoPW51bGw9PWg/cD82OjEyOi9bZ3Byc10vLnRlc3QocCk/TWF0aC5tYXgoMSxNYXRoLm1pbigyMSxoKSk6TWF0aC5tYXgoMCxNYXRoLm1pbigyMCxoKSksbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0KyIifSxufWZ1bmN0aW9uIGUodCxlKXt2YXIgcj1uKCh0PXp2KHQpLHQudHlwZT0iZiIsdCkpLGk9MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoVHYoZSkvMykpKSxvPU1hdGgucG93KDEwLC1pKSx1PVJ2WzgraS8zXTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIobyp0KSt1fX12YXIgcj10Lmdyb3VwaW5nJiZ0LnRob3VzYW5kcz9Odih0Lmdyb3VwaW5nLHQudGhvdXNhbmRzKTpscixpPXQuY3VycmVuY3ksbz10LmRlY2ltYWw7cmV0dXJue2Zvcm1hdDpuLGZvcm1hdFByZWZpeDplfX07aHIoe2RlY2ltYWw6Ii4iLHRob3VzYW5kczoiLCIsZ3JvdXBpbmc6WzNdLGN1cnJlbmN5OlsiJCIsIiJdfSk7dmFyIEx2PWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLm1heCgwLC1UdihNYXRoLmFicyh0KSkpfSxVdj1mdW5jdGlvbih0LG4pe3JldHVybiBNYXRoLm1heCgwLDMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKFR2KG4pLzMpKSktVHYoTWF0aC5hYnModCkpKX0sRHY9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdD1NYXRoLmFicyh0KSxuPU1hdGguYWJzKG4pLXQsTWF0aC5tYXgoMCxUdihuKS1Udih0KSkrMX0sT3Y9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHByfTtwci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnByLHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5zPXRoaXMudD0wfSxhZGQ6ZnVuY3Rpb24odCl7ZHIoX18sdCx0aGlzLnQpLGRyKHRoaXMsX18ucyx0aGlzLnMpLHRoaXMucz90aGlzLnQrPV9fLnQ6dGhpcy5zPV9fLnR9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zfX07dmFyIEZ2LEl2LFl2LEJ2LGp2LEh2LFh2LFZ2LFd2LCR2LFp2LEd2LEp2LFF2LEt2LHRfLG5fLGVfLHJfLGlfLG9fLHVfLGFfLGNfLHNfLGZfLGxfLGhfLHBfLGRfLHZfLF9fPW5ldyBwcix5Xz0xZS02LGdfPTFlLTEyLG1fPU1hdGguUEkseF89bV8vMixiXz1tXy80LHdfPTIqbV8sTV89MTgwL21fLFRfPW1fLzE4MCxOXz1NYXRoLmFicyxrXz1NYXRoLmF0YW4sU189TWF0aC5hdGFuMixFXz1NYXRoLmNvcyxBXz1NYXRoLmNlaWwsQ189TWF0aC5leHAsel89TWF0aC5sb2csUF89TWF0aC5wb3csUl89TWF0aC5zaW4scV89TWF0aC5zaWdufHxmdW5jdGlvbih0KXtyZXR1cm4gdD4wPzE6dDwwPy0xOjB9LExfPU1hdGguc3FydCxVXz1NYXRoLnRhbixEXz17RmVhdHVyZTpmdW5jdGlvbih0LG4pe21yKHQuZ2VvbWV0cnksbil9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZmVhdHVyZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOyltcihlW3JdLmdlb21ldHJ5LG4pfX0sT189e1NwaGVyZTpmdW5jdGlvbih0LG4pe24uc3BoZXJlKCl9LFBvaW50OmZ1bmN0aW9uKHQsbil7dD10LmNvb3JkaW5hdGVzLG4ucG9pbnQodFswXSx0WzFdLHRbMl0pfSxNdWx0aVBvaW50OmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOyl0PWVbcl0sbi5wb2ludCh0WzBdLHRbMV0sdFsyXSl9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXt4cih0LmNvb3JkaW5hdGVzLG4sMCl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspeHIoZVtyXSxuLDApfSxQb2x5Z29uOmZ1bmN0aW9uKHQsbil7YnIodC5jb29yZGluYXRlcyxuKX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylicihlW3JdLG4pfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5nZW9tZXRyaWVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspbXIoZVtyXSxuKX19LEZfPWZ1bmN0aW9uKHQsbil7dCYmRF8uaGFzT3duUHJvcGVydHkodC50eXBlKT9EX1t0LnR5cGVdKHQsbik6bXIodCxuKX0sSV89T3YoKSxZXz1PdigpLEJfPXtwb2ludDpncixsaW5lU3RhcnQ6Z3IsbGluZUVuZDpncixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtJXy5yZXNldCgpLEJfLmxpbmVTdGFydD13cixCXy5saW5lRW5kPU1yfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9K0lfO1lfLmFkZCh0PDA/d18rdDp0KSx0aGlzLmxpbmVTdGFydD10aGlzLmxpbmVFbmQ9dGhpcy5wb2ludD1ncn0sc3BoZXJlOmZ1bmN0aW9uKCl7WV8uYWRkKHdfKX19LGpfPWZ1bmN0aW9uKHQpe3JldHVybiBZXy5yZXNldCgpLEZfKHQsQl8pLDIqWV99LEhfPU92KCksWF89e3BvaW50OlJyLGxpbmVTdGFydDpMcixsaW5lRW5kOlVyLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe1hfLnBvaW50PURyLFhfLmxpbmVTdGFydD1PcixYXy5saW5lRW5kPUZyLEhfLnJlc2V0KCksQl8ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtCXy5wb2x5Z29uRW5kKCksWF8ucG9pbnQ9UnIsWF8ubGluZVN0YXJ0PUxyLFhfLmxpbmVFbmQ9VXIsSV88MD8oSHY9LShWdj0xODApLFh2PS0oV3Y9OTApKTpIXz55Xz9Xdj05MDpIXzwteV8mJihYdj0tOTApLEt2WzBdPUh2LEt2WzFdPVZ2fX0sVl89ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbyx1LGE7aWYoV3Y9VnY9LShIdj1Ydj0xLzApLFF2PVtdLEZfKHQsWF8pLGU9UXYubGVuZ3RoKXtmb3IoUXYuc29ydChZciksbj0xLHI9UXZbMF0sbz1bcl07bjxlOysrbilpPVF2W25dLEJyKHIsaVswXSl8fEJyKHIsaVsxXSk/KElyKHJbMF0saVsxXSk+SXIoclswXSxyWzFdKSYmKHJbMV09aVsxXSksSXIoaVswXSxyWzFdKT5JcihyWzBdLHJbMV0pJiYoclswXT1pWzBdKSk6by5wdXNoKHI9aSk7Zm9yKHU9LSgxLzApLGU9by5sZW5ndGgtMSxuPTAscj1vW2VdO248PWU7cj1pLCsrbilpPW9bbl0sKGE9SXIoclsxXSxpWzBdKSk+dSYmKHU9YSxIdj1pWzBdLFZ2PXJbMV0pfXJldHVybiBRdj1Ldj1udWxsLEh2PT09MS8wfHxYdj09PTEvMD9bW05hTixOYU5dLFtOYU4sTmFOXV06W1tIdixYdl0sW1Z2LFd2XV19LFdfPXtzcGhlcmU6Z3IscG9pbnQ6anIsbGluZVN0YXJ0OlhyLGxpbmVFbmQ6JHIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7V18ubGluZVN0YXJ0PVpyLFdfLmxpbmVFbmQ9R3J9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtXXy5saW5lU3RhcnQ9WHIsV18ubGluZUVuZD0kcn19LCRfPWZ1bmN0aW9uKHQpe3RfPW5fPWVfPXJfPWlfPW9fPXVfPWFfPWNfPXNfPWZfPTAsRl8odCxXXyk7dmFyIG49Y18sZT1zXyxyPWZfLGk9bipuK2UqZStyKnI7cmV0dXJuIGk8Z18mJihuPW9fLGU9dV8scj1hXyxuXzx5XyYmKG49ZV8sZT1yXyxyPWlfKSxpPW4qbitlKmUrcipyLGk8Z18pP1tOYU4sTmFOXTpbU18oZSxuKSpNXyxfcihyL0xfKGkpKSpNX119LFpfPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0sR189ZnVuY3Rpb24odCxuKXtmdW5jdGlvbiBlKGUscil7cmV0dXJuIGU9dChlLHIpLG4oZVswXSxlWzFdKX1yZXR1cm4gdC5pbnZlcnQmJm4uaW52ZXJ0JiYoZS5pbnZlcnQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZT1uLmludmVydChlLHIpLGUmJnQuaW52ZXJ0KGVbMF0sZVsxXSl9KSxlfTtLci5pbnZlcnQ9S3I7dmFyIEpfLFFfLEtfLHR5LG55LGV5LHJ5LGl5LG95LHV5LGF5LGN5PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4obil7cmV0dXJuIG49dChuWzBdKlRfLG5bMV0qVF8pLG5bMF0qPU1fLG5bMV0qPU1fLG59cmV0dXJuIHQ9dGkodFswXSpUXyx0WzFdKlRfLHQubGVuZ3RoPjI/dFsyXSpUXzowKSxuLmludmVydD1mdW5jdGlvbihuKXtyZXR1cm4gbj10LmludmVydChuWzBdKlRfLG5bMV0qVF8pLG5bMF0qPU1fLG5bMV0qPU1fLG59LG59LHN5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LG4pe2UucHVzaCh0PXIodCxuKSksdFswXSo9TV8sdFsxXSo9TV99ZnVuY3Rpb24gbigpe3ZhciB0PWkuYXBwbHkodGhpcyxhcmd1bWVudHMpLG49by5hcHBseSh0aGlzLGFyZ3VtZW50cykqVF8sYz11LmFwcGx5KHRoaXMsYXJndW1lbnRzKSpUXztyZXR1cm4gZT1bXSxyPXRpKC10WzBdKlRfLC10WzFdKlRfLDApLmludmVydCxpaShhLG4sYywxKSx0PXt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbZV19LGU9cj1udWxsLHR9dmFyIGUscixpPVpfKFswLDBdKSxvPVpfKDkwKSx1PVpfKDYpLGE9e3BvaW50OnR9O3JldHVybiBuLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlpfKFsrdFswXSwrdFsxXV0pLG4pOml9LG4ucmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Wl8oK3QpLG4pOm99LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Wl8oK3QpLG4pOnV9LG59LGZ5PWZ1bmN0aW9uKCl7dmFyIHQsbj1bXTtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24obixlKXt0LnB1c2goW24sZV0pfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtuLnB1c2godD1bXSl9LGxpbmVFbmQ6Z3IscmVqb2luOmZ1bmN0aW9uKCl7bi5sZW5ndGg+MSYmbi5wdXNoKG4ucG9wKCkuY29uY2F0KG4uc2hpZnQoKSkpfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgZT1uO3JldHVybiBuPVtdLHQ9bnVsbCxlfX19LGx5PWZ1bmN0aW9uKHQsbixlLHIsaSxvKXt2YXIgdSxhPXRbMF0sYz10WzFdLHM9blswXSxmPW5bMV0sbD0wLGg9MSxwPXMtYSxkPWYtYztpZih1PWUtYSxwfHwhKHU+MCkpe2lmKHUvPXAscDwwKXtpZih1PGwpcmV0dXJuO3U8aCYmKGg9dSl9ZWxzZSBpZihwPjApe2lmKHU+aClyZXR1cm47dT5sJiYobD11KX1pZih1PWktYSxwfHwhKHU8MCkpe2lmKHUvPXAscDwwKXtpZih1PmgpcmV0dXJuO3U+bCYmKGw9dSl9ZWxzZSBpZihwPjApe2lmKHU8bClyZXR1cm47dTxoJiYoaD11KX1pZih1PXItYyxkfHwhKHU+MCkpe2lmKHUvPWQsZDwwKXtpZih1PGwpcmV0dXJuO3U8aCYmKGg9dSl9ZWxzZSBpZihkPjApe2lmKHU+aClyZXR1cm47dT5sJiYobD11KX1pZih1PW8tYyxkfHwhKHU8MCkpe2lmKHUvPWQsZDwwKXtpZih1PmgpcmV0dXJuO3U+bCYmKGw9dSl9ZWxzZSBpZihkPjApe2lmKHU8bClyZXR1cm47dTxoJiYoaD11KX1yZXR1cm4gbD4wJiYodFswXT1hK2wqcCx0WzFdPWMrbCpkKSxoPDEmJihuWzBdPWEraCpwLG5bMV09YytoKmQpLCEwfX19fX0saHk9ZnVuY3Rpb24odCxuKXtyZXR1cm4gTl8odFswXS1uWzBdKTx5XyYmTl8odFsxXS1uWzFdKTx5X30scHk9ZnVuY3Rpb24odCxuLGUscixpKXt2YXIgbyx1LGE9W10sYz1bXTtpZih0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoISgobj10Lmxlbmd0aC0xKTw9MCkpe3ZhciBuLGUscj10WzBdLHU9dFtuXTtpZihoeShyLHUpKXtmb3IoaS5saW5lU3RhcnQoKSxvPTA7bzxuOysrbylpLnBvaW50KChyPXRbb10pWzBdLHJbMV0pO3JldHVybiB2b2lkIGkubGluZUVuZCgpfWEucHVzaChlPW5ldyB1aShyLHQsbnVsbCwhMCkpLGMucHVzaChlLm89bmV3IHVpKHIsbnVsbCxlLCExKSksYS5wdXNoKGU9bmV3IHVpKHUsdCxudWxsLCExKSksYy5wdXNoKGUubz1uZXcgdWkodSxudWxsLGUsITApKX19KSxhLmxlbmd0aCl7Zm9yKGMuc29ydChuKSxhaShhKSxhaShjKSxvPTAsdT1jLmxlbmd0aDtvPHU7KytvKWNbb10uZT1lPSFlO2Zvcih2YXIgcyxmLGw9YVswXTs7KXtmb3IodmFyIGg9bCxwPSEwO2gudjspaWYoKGg9aC5uKT09PWwpcmV0dXJuO3M9aC56LGkubGluZVN0YXJ0KCk7ZG97aWYoaC52PWguby52PSEwLGguZSl7aWYocClmb3Iobz0wLHU9cy5sZW5ndGg7bzx1OysrbylpLnBvaW50KChmPXNbb10pWzBdLGZbMV0pO2Vsc2UgcihoLngsaC5uLngsMSxpKTtoPWgubn1lbHNle2lmKHApZm9yKHM9aC5wLnosbz1zLmxlbmd0aC0xO28+PTA7LS1vKWkucG9pbnQoKGY9c1tvXSlbMF0sZlsxXSk7ZWxzZSByKGgueCxoLnAueCwtMSxpKTtoPWgucH1oPWgubyxzPWgueixwPSFwfXdoaWxlKCFoLnYpO2kubGluZUVuZCgpfX19LGR5PTFlOSx2eT0tZHksX3k9ZnVuY3Rpb24oKXt2YXIgdCxuLGUscj0wLGk9MCxvPTk2MCx1PTUwMDtyZXR1cm4gZT17c3RyZWFtOmZ1bmN0aW9uKGUpe3JldHVybiB0JiZuPT09ZT90OnQ9Y2kocixpLG8sdSkobj1lKX0sZXh0ZW50OmZ1bmN0aW9uKGEpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSthWzBdWzBdLGk9K2FbMF1bMV0sbz0rYVsxXVswXSx1PSthWzFdWzFdLHQ9bj1udWxsLGUpOltbcixpXSxbbyx1XV19fX0seXk9T3YoKSxneT17c3BoZXJlOmdyLHBvaW50OmdyLGxpbmVTdGFydDpzaSxsaW5lRW5kOmdyLHBvbHlnb25TdGFydDpncixwb2x5Z29uRW5kOmdyfSxteT1mdW5jdGlvbih0KXtyZXR1cm4geXkucmVzZXQoKSxGXyh0LGd5KSwreXl9LHh5PVtudWxsLG51bGxdLGJ5PXt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczp4eX0sd3k9ZnVuY3Rpb24odCxuKXtyZXR1cm4geHlbMF09dCx4eVsxXT1uLG15KGJ5KX0sTXk9ZnVuY3Rpb24odCxuKXt2YXIgZT10WzBdKlRfLHI9dFsxXSpUXyxpPW5bMF0qVF8sbz1uWzFdKlRfLHU9RV8ociksYT1SXyhyKSxjPUVfKG8pLHM9Ul8obyksZj11KkVfKGUpLGw9dSpSXyhlKSxoPWMqRV8oaSkscD1jKlJfKGkpLGQ9MipfcihMXyh5cihvLXIpK3UqYyp5cihpLWUpKSksdj1SXyhkKSxfPWQ/ZnVuY3Rpb24odCl7dmFyIG49Ul8odCo9ZCkvdixlPVJfKGQtdCkvdixyPWUqZituKmgsaT1lKmwrbipwLG89ZSphK24qcztyZXR1cm5bU18oaSxyKSpNXyxTXyhvLExfKHIqcitpKmkpKSpNX119OmZ1bmN0aW9uKCl7cmV0dXJuW2UqTV8scipNX119O3JldHVybiBfLmRpc3RhbmNlPWQsX30sVHk9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LE55PU92KCksa3k9T3YoKSxTeT17cG9pbnQ6Z3IsbGluZVN0YXJ0OmdyLGxpbmVFbmQ6Z3IscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7U3kubGluZVN0YXJ0PXlpLFN5LmxpbmVFbmQ9eGl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtTeS5saW5lU3RhcnQ9U3kubGluZUVuZD1TeS5wb2ludD1ncixOeS5hZGQoTl8oa3kpKSxreS5yZXNldCgpfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD1OeS8yO3JldHVybiBOeS5yZXNldCgpLHR9fSxFeT0xLzAsQXk9RXksQ3k9LUV5LHp5PUN5LFB5PXtwb2ludDpiaSxsaW5lU3RhcnQ6Z3IsbGluZUVuZDpncixwb2x5Z29uU3RhcnQ6Z3IscG9seWdvbkVuZDpncixyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD1bW0V5LEF5XSxbQ3ksenldXTtyZXR1cm4gQ3k9enk9LShBeT1FeT0xLzApLHR9fSxSeT0wLHF5PTAsTHk9MCxVeT0wLER5PTAsT3k9MCxGeT0wLEl5PTAsWXk9MCxCeT17cG9pbnQ6d2ksbGluZVN0YXJ0Ok1pLGxpbmVFbmQ6a2kscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7QnkubGluZVN0YXJ0PVNpLEJ5LmxpbmVFbmQ9RWl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtCeS5wb2ludD13aSxCeS5saW5lU3RhcnQ9TWksQnkubGluZUVuZD1raX0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9WXk/W0Z5L1l5LEl5L1l5XTpPeT9bVXkvT3ksRHkvT3ldOkx5P1tSeS9MeSxxeS9MeV06W05hTixOYU5dO3JldHVybiBSeT1xeT1MeT1VeT1EeT1PeT1GeT1JeT1ZeT0wLHR9fTt6aS5wcm90b3R5cGU9e19yYWRpdXM6NC41LHBvaW50UmFkaXVzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yYWRpdXM9dCx0aGlzfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpezA9PT10aGlzLl9saW5lJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX3BvaW50PU5hTn0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pLHRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX2NvbnRleHQubGluZVRvKHQsbik7YnJlYWs7ZGVmYXVsdDp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0K3RoaXMuX3JhZGl1cyxuKSx0aGlzLl9jb250ZXh0LmFyYyh0LG4sdGhpcy5fcmFkaXVzLDAsd18pfX0scmVzdWx0OmdyfSxQaS5wcm90b3R5cGU9e19jaXJjbGU6UmkoNC41KSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY2lyY2xlPVJpKHQpLHRoaXN9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MD09PXRoaXMuX2xpbmUmJnRoaXMuX3N0cmluZy5wdXNoKCJaIiksdGhpcy5fcG9pbnQ9TmFOfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3N0cmluZy5wdXNoKCJNIix0LCIsIixuKSx0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9zdHJpbmcucHVzaCgiTCIsdCwiLCIsbik7YnJlYWs7ZGVmYXVsdDp0aGlzLl9zdHJpbmcucHVzaCgiTSIsdCwiLCIsbix0aGlzLl9jaXJjbGUpfX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYodGhpcy5fc3RyaW5nLmxlbmd0aCl7dmFyIHQ9dGhpcy5fc3RyaW5nLmpvaW4oIiIpO3JldHVybiB0aGlzLl9zdHJpbmc9W10sdH19fTt2YXIgank9ZnVuY3Rpb24odCxuKXtmdW5jdGlvbiBlKHQpe3JldHVybiB0JiYoImZ1bmN0aW9uIj09dHlwZW9mIG8mJmkucG9pbnRSYWRpdXMoK28uYXBwbHkodGhpcyxhcmd1bWVudHMpKSxGXyh0LHIoaSkpKSxpLnJlc3VsdCgpfXZhciByLGksbz00LjU7cmV0dXJuIGUuYXJlYT1mdW5jdGlvbih0KXtyZXR1cm4gRl8odCxyKFN5KSksU3kucmVzdWx0KCl9LGUuYm91bmRzPWZ1bmN0aW9uKHQpe3JldHVybiBGXyh0LHIoUHkpKSxQeS5yZXN1bHQoKX0sZS5jZW50cm9pZD1mdW5jdGlvbih0KXtyZXR1cm4gRl8odCxyKEJ5KSksQnkucmVzdWx0KCl9LGUucHJvamVjdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT1uPyh0PW51bGwsVHkpOih0PW4pLnN0cmVhbSxlKTp0fSxlLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09dD8obj1udWxsLG5ldyBQaSk6bmV3IHppKG49dCksImZ1bmN0aW9uIiE9dHlwZW9mIG8mJmkucG9pbnRSYWRpdXMobyksZSk6bn0sZS5wb2ludFJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OihpLnBvaW50UmFkaXVzKCt0KSwrdCksZSk6b30sZS5wcm9qZWN0aW9uKHQpLmNvbnRleHQobil9LEh5PU92KCksWHk9ZnVuY3Rpb24odCxuKXt2YXIgZT1uWzBdLHI9blsxXSxpPVtSXyhlKSwtRV8oZSksMF0sbz0wLHU9MDtIeS5yZXNldCgpO2Zvcih2YXIgYT0wLGM9dC5sZW5ndGg7YTxjOysrYSlpZihmPShzPXRbYV0pLmxlbmd0aClmb3IodmFyIHMsZixsPXNbZi0xXSxoPWxbMF0scD1sWzFdLzIrYl8sZD1SXyhwKSx2PUVfKHApLF89MDtfPGY7KytfLGg9ZyxkPXgsdj1iLGw9eSl7dmFyIHk9c1tfXSxnPXlbMF0sbT15WzFdLzIrYl8seD1SXyhtKSxiPUVfKG0pLHc9Zy1oLE09dz49MD8xOi0xLFQ9TSp3LE49VD5tXyxrPWQqeDtpZihIeS5hZGQoU18oaypNKlJfKFQpLHYqYitrKkVfKFQpKSksbys9Tj93K00qd186dyxOXmg+PWVeZz49ZSl7dmFyIFM9QXIoU3IobCksU3IoeSkpO1ByKFMpO3ZhciBFPUFyKGksUyk7UHIoRSk7dmFyIEE9KE5edz49MD8tMToxKSpfcihFWzJdKTsocj5BfHxyPT09QSYmKFNbMF18fFNbMV0pKSYmKHUrPU5edz49MD8xOi0xKX19cmV0dXJuKG88LXlffHxvPHlfJiZIeTwteV8pXjEmdX0sVnk9ZnVuY3Rpb24odCxuLGUscil7cmV0dXJuIGZ1bmN0aW9uKGksbyl7ZnVuY3Rpb24gdShuLGUpe3ZhciByPWkobixlKTt0KG49clswXSxlPXJbMV0pJiZvLnBvaW50KG4sZSl9ZnVuY3Rpb24gYSh0LG4pe3ZhciBlPWkodCxuKTtfLnBvaW50KGVbMF0sZVsxXSl9ZnVuY3Rpb24gYygpe2IucG9pbnQ9YSxfLmxpbmVTdGFydCgpfWZ1bmN0aW9uIHMoKXtiLnBvaW50PXUsXy5saW5lRW5kKCl9ZnVuY3Rpb24gZih0LG4pe3YucHVzaChbdCxuXSk7dmFyIGU9aSh0LG4pO20ucG9pbnQoZVswXSxlWzFdKX1mdW5jdGlvbiBsKCl7bS5saW5lU3RhcnQoKSx2PVtdfWZ1bmN0aW9uIGgoKXtmKHZbMF1bMF0sdlswXVsxXSksbS5saW5lRW5kKCk7dmFyIHQsbixlLHIsaT1tLmNsZWFuKCksdT1nLnJlc3VsdCgpLGE9dS5sZW5ndGg7aWYodi5wb3AoKSxwLnB1c2godiksdj1udWxsLGEpaWYoMSZpKXtpZihlPXVbMF0sKG49ZS5sZW5ndGgtMSk+MCl7Zm9yKHh8fChvLnBvbHlnb25TdGFydCgpLHg9ITApLG8ubGluZVN0YXJ0KCksdD0wO3Q8bjsrK3Qpby5wb2ludCgocj1lW3RdKVswXSxyWzFdKTtvLmxpbmVFbmQoKX19ZWxzZSBhPjEmJjImaSYmdS5wdXNoKHUucG9wKCkuY29uY2F0KHUuc2hpZnQoKSkpLGQucHVzaCh1LmZpbHRlcihxaSkpfXZhciBwLGQsdixfPW4obykseT1pLmludmVydChyWzBdLHJbMV0pLGc9ZnkoKSxtPW4oZykseD0hMSxiPXtwb2ludDp1LGxpbmVTdGFydDpjLGxpbmVFbmQ6cyxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtiLnBvaW50PWYsYi5saW5lU3RhcnQ9bCxiLmxpbmVFbmQ9aCxkPVtdLHA9W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtiLnBvaW50PXUsYi5saW5lU3RhcnQ9YyxiLmxpbmVFbmQ9cyxkPUtzKGQpO3ZhciB0PVh5KHAseSk7ZC5sZW5ndGg/KHh8fChvLnBvbHlnb25TdGFydCgpLHg9ITApLHB5KGQsTGksdCxlLG8pKTp0JiYoeHx8KG8ucG9seWdvblN0YXJ0KCkseD0hMCksby5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLG8pLG8ubGluZUVuZCgpKSx4JiYoby5wb2x5Z29uRW5kKCkseD0hMSksZD1wPW51bGx9LHNwaGVyZTpmdW5jdGlvbigpe28ucG9seWdvblN0YXJ0KCksby5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLG8pLG8ubGluZUVuZCgpLG8ucG9seWdvbkVuZCgpfX07cmV0dXJuIGJ9fSxXeT1WeShmdW5jdGlvbigpe3JldHVybiEwfSxVaSxPaSxbLW1fLC14X10pLCR5PWZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZShlLHIsaSxvKXtpaShvLHQsbixpLGUscil9ZnVuY3Rpb24gcih0LG4pe3JldHVybiBFXyh0KSpFXyhuKT5hfWZ1bmN0aW9uIGkodCl7dmFyIG4sZSxpLGEsZjtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7YT1pPSExLGY9MX0scG9pbnQ6ZnVuY3Rpb24obCxoKXt2YXIgcCxkPVtsLGhdLHY9cihsLGgpLF89Yz92PzA6dShsLGgpOnY/dShsKyhsPDA/bV86LW1fKSxoKTowO2lmKCFuJiYoYT1pPXYpJiZ0LmxpbmVTdGFydCgpLHYhPT1pJiYocD1vKG4sZCksKGh5KG4scCl8fGh5KGQscCkpJiYoZFswXSs9eV8sZFsxXSs9eV8sdj1yKGRbMF0sZFsxXSkpKSx2IT09aSlmPTAsdj8odC5saW5lU3RhcnQoKSxwPW8oZCxuKSx0LnBvaW50KHBbMF0scFsxXSkpOihwPW8obixkKSx0LnBvaW50KHBbMF0scFsxXSksdC5saW5lRW5kKCkpLG49cDtlbHNlIGlmKHMmJm4mJmNedil7dmFyIHk7XyZlfHwhKHk9byhkLG4sITApKXx8KGY9MCxjPyh0LmxpbmVTdGFydCgpLHQucG9pbnQoeVswXVswXSx5WzBdWzFdKSx0LnBvaW50KHlbMV1bMF0seVsxXVsxXSksdC5saW5lRW5kKCkpOih0LnBvaW50KHlbMV1bMF0seVsxXVsxXSksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHlbMF1bMF0seVswXVsxXSkpKX0hdnx8biYmaHkobixkKXx8dC5wb2ludChkWzBdLGRbMV0pLG49ZCxpPXYsZT1ffSxsaW5lRW5kOmZ1bmN0aW9uKCl7aSYmdC5saW5lRW5kKCksbj1udWxsfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiBmfChhJiZpKTw8MX19fWZ1bmN0aW9uIG8odCxuLGUpe3ZhciByPVNyKHQpLGk9U3Iobiksbz1bMSwwLDBdLHU9QXIocixpKSxjPUVyKHUsdSkscz11WzBdLGY9Yy1zKnM7aWYoIWYpcmV0dXJuIWUmJnQ7dmFyIGw9YSpjL2YsaD0tYSpzL2YscD1BcihvLHUpLGQ9enIobyxsKSx2PXpyKHUsaCk7Q3IoZCx2KTt2YXIgXz1wLHk9RXIoZCxfKSxnPUVyKF8sXyksbT15KnktZyooRXIoZCxkKS0xKTtpZighKG08MCkpe3ZhciB4PUxfKG0pLGI9enIoXywoLXkteCkvZyk7aWYoQ3IoYixkKSxiPWtyKGIpLCFlKXJldHVybiBiO3ZhciB3LE09dFswXSxUPW5bMF0sTj10WzFdLGs9blsxXTtUPE0mJih3PU0sTT1ULFQ9dyk7dmFyIFM9VC1NLEU9Tl8oUy1tXyk8eV8sQT1FfHxTPHlfO2lmKCFFJiZrPE4mJih3PU4sTj1rLGs9dyksQT9FP04raz4wXmJbMV08KE5fKGJbMF0tTSk8eV8/TjprKTpOPD1iWzFdJiZiWzFdPD1rOlM+bV9eKE08PWJbMF0mJmJbMF08PVQpKXt2YXIgQz16cihfLCgteSt4KS9nKTtyZXR1cm4gQ3IoQyxkKSxbYixrcihDKV19fX1mdW5jdGlvbiB1KG4sZSl7dmFyIHI9Yz90Om1fLXQsaT0wO3JldHVybiBuPC1yP2l8PTE6bj5yJiYoaXw9MiksZTwtcj9pfD00OmU+ciYmKGl8PTgpLGl9dmFyIGE9RV8odCksYz1hPjAscz1OXyhhKT55XztyZXR1cm4gVnkocixpLGUsYz9bMCwtdF06Wy1tXyx0LW1fXSl9LFp5PWZ1bmN0aW9uKHQpe3JldHVybntzdHJlYW06RmkodCl9fTtJaS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOklpLHBvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5zdHJlYW0ucG9pbnQodCxuKX0sc3BoZXJlOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25FbmQoKX19O3ZhciBHeT0xNixKeT1FXygzMCpUXyksUXk9ZnVuY3Rpb24odCxuKXtyZXR1cm4rbj9IaSh0LG4pOmppKHQpfSxLeT1GaSh7cG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLnN0cmVhbS5wb2ludCh0KlRfLG4qVF8pfX0pLHRnPWZ1bmN0aW9uKCl7cmV0dXJuIFdpKFppKS5zY2FsZSgxNTUuNDI0KS5jZW50ZXIoWzAsMzMuNjQ0Ml0pfSxuZz1mdW5jdGlvbigpe3JldHVybiB0ZygpLnBhcmFsbGVscyhbMjkuNSw0NS41XSkuc2NhbGUoMTA3MCkudHJhbnNsYXRlKFs0ODAsMjUwXSkucm90YXRlKFs5NiwwXSkuY2VudGVyKFstLjYsMzguN10pfSxlZz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIG49dFswXSxlPXRbMV07cmV0dXJuIGE9bnVsbCxpLnBvaW50KG4sZSksYXx8KG8ucG9pbnQobixlKSxhKXx8KHUucG9pbnQobixlKSxhKX1mdW5jdGlvbiBuKCl7cmV0dXJuIGU9cj1udWxsLHR9dmFyIGUscixpLG8sdSxhLGM9bmcoKSxzPXRnKCkucm90YXRlKFsxNTQsMF0pLmNlbnRlcihbLTIsNTguNV0pLnBhcmFsbGVscyhbNTUsNjVdKSxmPXRnKCkucm90YXRlKFsxNTcsMF0pLmNlbnRlcihbLTMsMTkuOV0pLnBhcmFsbGVscyhbOCwxOF0pLGw9e3BvaW50OmZ1bmN0aW9uKHQsbil7YT1bdCxuXX19O3JldHVybiB0LmludmVydD1mdW5jdGlvbih0KXt2YXIgbj1jLnNjYWxlKCksZT1jLnRyYW5zbGF0ZSgpLHI9KHRbMF0tZVswXSkvbixpPSh0WzFdLWVbMV0pL247cmV0dXJuKGk+PS4xMiYmaTwuMjM0JiZyPj0tLjQyNSYmcjwtLjIxND9zOmk+PS4xNjYmJmk8LjIzNCYmcj49LS4yMTQmJnI8LS4xMTU/ZjpjKS5pbnZlcnQodCl9LHQuc3RyZWFtPWZ1bmN0aW9uKHQpe3JldHVybiBlJiZyPT09dD9lOmU9R2koW2Muc3RyZWFtKHI9dCkscy5zdHJlYW0odCksZi5zdHJlYW0odCldKX0sdC5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGMucHJlY2lzaW9uKHQpLHMucHJlY2lzaW9uKHQpLGYucHJlY2lzaW9uKHQpLG4oKSk6Yy5wcmVjaXNpb24oKX0sdC5zY2FsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYy5zY2FsZShuKSxzLnNjYWxlKC4zNSpuKSxmLnNjYWxlKG4pLHQudHJhbnNsYXRlKGMudHJhbnNsYXRlKCkpKTpjLnNjYWxlKCl9LHQudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBjLnRyYW5zbGF0ZSgpO3ZhciBlPWMuc2NhbGUoKSxyPSt0WzBdLGE9K3RbMV07cmV0dXJuIGk9Yy50cmFuc2xhdGUodCkuY2xpcEV4dGVudChbW3ItLjQ1NSplLGEtLjIzOCplXSxbcisuNDU1KmUsYSsuMjM4KmVdXSkuc3RyZWFtKGwpLG89cy50cmFuc2xhdGUoW3ItLjMwNyplLGErLjIwMSplXSkuY2xpcEV4dGVudChbW3ItLjQyNSplK3lfLGErLjEyKmUreV9dLFtyLS4yMTQqZS15XyxhKy4yMzQqZS15X11dKS5zdHJlYW0obCksdT1mLnRyYW5zbGF0ZShbci0uMjA1KmUsYSsuMjEyKmVdKS5jbGlwRXh0ZW50KFtbci0uMjE0KmUreV8sYSsuMTY2KmUreV9dLFtyLS4xMTUqZS15XyxhKy4yMzQqZS15X11dKS5zdHJlYW0obCksbigpfSx0LmZpdEV4dGVudD1mdW5jdGlvbihuLGUpe3JldHVybiBZaSh0LG4sZSl9LHQuZml0U2l6ZT1mdW5jdGlvbihuLGUpe3JldHVybiBCaSh0LG4sZSl9LHQuc2NhbGUoMTA3MCl9LHJnPUppKGZ1bmN0aW9uKHQpe3JldHVybiBMXygyLygxK3QpKX0pO3JnLmludmVydD1RaShmdW5jdGlvbih0KXtyZXR1cm4gMipfcih0LzIpfSk7dmFyIGlnPWZ1bmN0aW9uKCl7cmV0dXJuIFhpKHJnKS5zY2FsZSgxMjQuNzUpLmNsaXBBbmdsZSgxNzkuOTk5KX0sb2c9SmkoZnVuY3Rpb24odCl7cmV0dXJuKHQ9dnIodCkpJiZ0L1JfKHQpfSk7b2cuaW52ZXJ0PVFpKGZ1bmN0aW9uKHQpe3JldHVybiB0fSk7dmFyIHVnPWZ1bmN0aW9uKCl7cmV0dXJuIFhpKG9nKS5zY2FsZSg3OS40MTg4KS5jbGlwQW5nbGUoMTc5Ljk5OSl9O0tpLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVyblt0LDIqa18oQ18obikpLXhfXX07dmFyIGFnPWZ1bmN0aW9uKCl7cmV0dXJuIHRvKEtpKS5zY2FsZSg5NjEvd18pfSxjZz1mdW5jdGlvbigpe3JldHVybiBXaShlbykuc2NhbGUoMTA5LjUpLnBhcmFsbGVscyhbMzAsMzBdKX07cm8uaW52ZXJ0PXJvO3ZhciBzZz1mdW5jdGlvbigpe3JldHVybiBYaShybykuc2NhbGUoMTUyLjYzKX0sZmc9ZnVuY3Rpb24oKXtyZXR1cm4gV2koaW8pLnNjYWxlKDEzMS4xNTQpLmNlbnRlcihbMCwxMy45Mzg5XSl9O29vLmludmVydD1RaShrXyk7dmFyIGxnPWZ1bmN0aW9uKCl7cmV0dXJuIFhpKG9vKS5zY2FsZSgxNDQuMDQ5KS5jbGlwQW5nbGUoNjApfSxoZz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtyZXR1cm4gaT1vPW51bGwsdX12YXIgbixlLHIsaSxvLHUsYT0xLGM9MCxzPTAsZj0xLGw9MSxoPVR5LHA9bnVsbCxkPVR5O3JldHVybiB1PXtzdHJlYW06ZnVuY3Rpb24odCl7cmV0dXJuIGkmJm89PT10P2k6aT1oKGQobz10KSl9LGNsaXBFeHRlbnQ6ZnVuY3Rpb24oaSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9bnVsbD09aT8ocD1uPWU9cj1udWxsLFR5KTpjaShwPStpWzBdWzBdLG49K2lbMF1bMV0sZT0raVsxXVswXSxyPStpWzFdWzFdKSx0KCkpOm51bGw9PXA/bnVsbDpbW3Asbl0sW2Uscl1dfSxzY2FsZTpmdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD11bygoYT0rbikqZixhKmwsYyxzKSx0KCkpOmF9LHRyYW5zbGF0ZTpmdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD11byhhKmYsYSpsLGM9K25bMF0scz0rblsxXSksdCgpKTpbYyxzXX0scmVmbGVjdFg6ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9dW8oYSooZj1uPy0xOjEpLGEqbCxjLHMpLHQoKSk6ZjwwfSxyZWZsZWN0WTpmdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD11byhhKmYsYSoobD1uPy0xOjEpLGMscyksdCgpKTpsPDB9LGZpdEV4dGVudDpmdW5jdGlvbih0LG4pe3JldHVybiBZaSh1LHQsbil9LGZpdFNpemU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gQmkodSx0LG4pfX19O2FvLmludmVydD1RaShfcik7dmFyIHBnPWZ1bmN0aW9uKCl7cmV0dXJuIFhpKGFvKS5zY2FsZSgyNDkuNSkuY2xpcEFuZ2xlKDkwK3lfKX07Y28uaW52ZXJ0PVFpKGZ1bmN0aW9uKHQpe3JldHVybiAyKmtfKHQpfSk7dmFyIGRnPWZ1bmN0aW9uKCl7cmV0dXJuIFhpKGNvKS5zY2FsZSgyNTApLmNsaXBBbmdsZSgxNDIpfTtzby5pbnZlcnQ9ZnVuY3Rpb24odCxuKXtyZXR1cm5bLW4sMiprXyhDXyh0KSkteF9dfTt2YXIgdmc9ZnVuY3Rpb24oKXt2YXIgdD10byhzbyksbj10LmNlbnRlcixlPXQucm90YXRlO3JldHVybiB0LmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uKFstdFsxXSx0WzBdXSk6KHQ9bigpLFt0WzFdLC10WzBdXSl9LHQucm90YXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2UoW3RbMF0sdFsxXSx0Lmxlbmd0aD4yP3RbMl0rOTA6OTBdKToodD1lKCksW3RbMF0sdFsxXSx0WzJdLTkwXSl9LGUoWzAsMCw5MF0pLnNjYWxlKDE1OS4xNTUpfSxfZz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIG8sdT0wO3QuZWFjaEFmdGVyKGZ1bmN0aW9uKHQpe3ZhciBlPXQuY2hpbGRyZW47ZT8odC54PWxvKGUpLHQueT1wbyhlKSk6KHQueD1vP3UrPW4odCxvKTowLHQueT0wLG89dCl9KTt2YXIgYT1fbyh0KSxjPXlvKHQpLHM9YS54LW4oYSxjKS8yLGY9Yy54K24oYyxhKS8yO3JldHVybiB0LmVhY2hBZnRlcihpP2Z1bmN0aW9uKG4pe24ueD0obi54LXQueCkqZSxuLnk9KHQueS1uLnkpKnJ9OmZ1bmN0aW9uKG4pe24ueD0obi54LXMpLyhmLXMpKmUsbi55PSgxLSh0Lnk/bi55L3QueToxKSkqcn0pfXZhciBuPWZvLGU9MSxyPTEsaT0hMTtyZXR1cm4gdC5zZXBhcmF0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWUsdCk6bn0sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSExLGU9K25bMF0scj0rblsxXSx0KTppP251bGw6W2Uscl19LHQubm9kZVNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ITAsZT0rblswXSxyPStuWzFdLHQpOmk/W2Uscl06bnVsbH0sdH0seWc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoQWZ0ZXIoZ28pfSxnZz1mdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvPXRoaXMsdT1bb107ZG8gZm9yKG49dS5yZXZlcnNlKCksdT1bXTtvPW4ucG9wKCk7KWlmKHQobyksZT1vLmNoaWxkcmVuKWZvcihyPTAsaT1lLmxlbmd0aDtyPGk7KytyKXUucHVzaChlW3JdKTt3aGlsZSh1Lmxlbmd0aCk7cmV0dXJuIHRoaXN9LG1nPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHI9dGhpcyxpPVtyXTtyPWkucG9wKCk7KWlmKHQociksbj1yLmNoaWxkcmVuKWZvcihlPW4ubGVuZ3RoLTE7ZT49MDstLWUpaS5wdXNoKG5bZV0pO3JldHVybiB0aGlzfSx4Zz1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyLGk9dGhpcyxvPVtpXSx1PVtdO2k9by5wb3AoKTspaWYodS5wdXNoKGkpLG49aS5jaGlsZHJlbilmb3IoZT0wLHI9bi5sZW5ndGg7ZTxyOysrZSlvLnB1c2gobltlXSk7Zm9yKDtpPXUucG9wKCk7KXQoaSk7cmV0dXJuIHRoaXN9LGJnPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2hBZnRlcihmdW5jdGlvbihuKXtmb3IodmFyIGU9K3Qobi5kYXRhKXx8MCxyPW4uY2hpbGRyZW4saT1yJiZyLmxlbmd0aDstLWk+PTA7KWUrPXJbaV0udmFsdWU7bi52YWx1ZT1lfSl9LHdnPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obil7bi5jaGlsZHJlbiYmbi5jaGlsZHJlbi5zb3J0KHQpfSl9LE1nPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLGU9bW8obix0KSxyPVtuXTtuIT09ZTspbj1uLnBhcmVudCxyLnB1c2gobik7Zm9yKHZhciBpPXIubGVuZ3RoO3QhPT1lOylyLnNwbGljZShpLDAsdCksdD10LnBhcmVudDtyZXR1cm4gcn0sVGc9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxuPVt0XTt0PXQucGFyZW50OyluLnB1c2godCk7cmV0dXJuIG59LE5nPWZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihuKXt0LnB1c2gobil9KSx0fSxrZz1mdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obil7bi5jaGlsZHJlbnx8dC5wdXNoKG4pfSksdH0sU2c9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49W107cmV0dXJuIHQuZWFjaChmdW5jdGlvbihlKXtlIT09dCYmbi5wdXNoKHtzb3VyY2U6ZS5wYXJlbnQsdGFyZ2V0OmV9KX0pLG59O05vLnByb3RvdHlwZT14by5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk5vLGNvdW50OnlnLGVhY2g6Z2csZWFjaEFmdGVyOnhnLGVhY2hCZWZvcmU6bWcsc3VtOmJnLHNvcnQ6d2cscGF0aDpNZyxhbmNlc3RvcnM6VGcsZGVzY2VuZGFudHM6TmcsbGVhdmVzOmtnLGxpbmtzOlNnLGNvcHk6Ym99O3ZhciBFZz1mdW5jdGlvbih0KXtmb3IodmFyIG4sZT0odD10LnNsaWNlKCkpLmxlbmd0aCxyPW51bGwsaT1yO2U7KXt2YXIgbz1uZXcga28odFtlLTFdKTtpPWk/aS5uZXh0PW86cj1vLHRbbl09dFstLWVdfXJldHVybntoZWFkOnIsdGFpbDppfX0sQWc9ZnVuY3Rpb24odCl7cmV0dXJuIEVvKEVnKHQpLFtdKX0sQ2c9ZnVuY3Rpb24odCl7cmV0dXJuIERvKHQpLHR9LHpnPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0sUGc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3JldHVybiB0Lng9ZS8yLHQueT1yLzIsbj90LmVhY2hCZWZvcmUoQm8obikpLmVhY2hBZnRlcihqbyhpLC41KSkuZWFjaEJlZm9yZShIbygxKSk6dC5lYWNoQmVmb3JlKEJvKFlvKSkuZWFjaEFmdGVyKGpvKElvLDEpKS5lYWNoQWZ0ZXIoam8oaSx0LnIvTWF0aC5taW4oZSxyKSkpLmVhY2hCZWZvcmUoSG8oTWF0aC5taW4oZSxyKS8oMip0LnIpKSksdH12YXIgbj1udWxsLGU9MSxyPTEsaT1JbztyZXR1cm4gdC5yYWRpdXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49T28oZSksdCk6bn0sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPStuWzBdLHI9K25bMV0sdCk6W2Uscl19LHQucGFkZGluZz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnpnKCtuKSx0KTppfSx0fSxSZz1mdW5jdGlvbih0KXt0LngwPU1hdGgucm91bmQodC54MCksdC55MD1NYXRoLnJvdW5kKHQueTApLHQueDE9TWF0aC5yb3VuZCh0LngxKSx0LnkxPU1hdGgucm91bmQodC55MSl9LHFnPWZ1bmN0aW9uKHQsbixlLHIsaSl7Zm9yKHZhciBvLHU9dC5jaGlsZHJlbixhPS0xLGM9dS5sZW5ndGgscz10LnZhbHVlJiYoci1uKS90LnZhbHVlOysrYTxjOylvPXVbYV0sby55MD1lLG8ueTE9aSxvLngwPW4sby54MT1uKz1vLnZhbHVlKnN9LExnPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgdT10LmhlaWdodCsxO3JldHVybiB0LngwPXQueTA9aSx0LngxPWUsdC55MT1yL3UsdC5lYWNoQmVmb3JlKG4ocix1KSksbyYmdC5lYWNoQmVmb3JlKFJnKSx0fWZ1bmN0aW9uIG4odCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7ZS5jaGlsZHJlbiYmcWcoZSxlLngwLHQqKGUuZGVwdGgrMSkvbixlLngxLHQqKGUuZGVwdGgrMikvbik7dmFyIHI9ZS54MCxvPWUueTAsdT1lLngxLWksYT1lLnkxLWk7dTxyJiYocj11PShyK3UpLzIpLGE8byYmKG89YT0obythKS8yKSxlLngwPXIsZS55MD1vLGUueDE9dSxlLnkxPWF9fXZhciBlPTEscj0xLGk9MCxvPSExO3JldHVybiB0LnJvdW5kPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSEhbix0KTpvfSx0LnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K25bMF0scj0rblsxXSx0KTpbZSxyXX0sdC5wYWRkaW5nPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPStuLHQpOml9LHR9LFVnPSIkIixEZz17ZGVwdGg6LTF9LE9nPXt9LEZnPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgcixpLG8sdSxhLGMscyxmPXQubGVuZ3RoLGw9bmV3IEFycmF5KGYpLGg9e307Zm9yKGk9MDtpPGY7KytpKXI9dFtpXSxhPWxbaV09bmV3IE5vKHIpLG51bGwhPShjPW4ocixpLHQpKSYmKGMrPSIiKSYmKHM9VWcrKGEuaWQ9YyksaFtzXT1zIGluIGg/T2c6YSk7Zm9yKGk9MDtpPGY7KytpKWlmKGE9bFtpXSxjPWUodFtpXSxpLHQpLG51bGwhPWMmJihjKz0iIikpe2lmKHU9aFtVZytjXSwhdSl0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIrYyk7aWYodT09PU9nKXRocm93IG5ldyBFcnJvcigiYW1iaWd1b3VzOiAiK2MpO3UuY2hpbGRyZW4/dS5jaGlsZHJlbi5wdXNoKGEpOnUuY2hpbGRyZW49W2FdLGEucGFyZW50PXV9ZWxzZXtpZihvKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgcm9vdHMiKTtvPWF9aWYoIW8pdGhyb3cgbmV3IEVycm9yKCJubyByb290Iik7aWYoby5wYXJlbnQ9RGcsby5lYWNoQmVmb3JlKGZ1bmN0aW9uKHQpe3QuZGVwdGg9dC5wYXJlbnQuZGVwdGgrMSwtLWZ9KS5lYWNoQmVmb3JlKFRvKSxvLnBhcmVudD1udWxsLGY+MCl0aHJvdyBuZXcgRXJyb3IoImN5Y2xlIik7cmV0dXJuIG99dmFyIG49WG8sZT1WbztyZXR1cm4gdC5pZD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1GbyhlKSx0KTpufSx0LnBhcmVudElkPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPUZvKG4pLHQpOmV9LHR9O0tvLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE5vLnByb3RvdHlwZSk7dmFyIElnPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgcj10dSh0KTtpZihyLmVhY2hBZnRlcihuKSxyLnBhcmVudC5tPS1yLnosci5lYWNoQmVmb3JlKGUpLGMpdC5lYWNoQmVmb3JlKGkpO2Vsc2V7dmFyIHM9dCxmPXQsbD10O3QuZWFjaEJlZm9yZShmdW5jdGlvbih0KXt0Lng8cy54JiYocz10KSx0Lng+Zi54JiYoZj10KSx0LmRlcHRoPmwuZGVwdGgmJihsPXQpfSk7dmFyIGg9cz09PWY/MTpvKHMsZikvMixwPWgtcy54LGQ9dS8oZi54K2grcCksdj1hLyhsLmRlcHRofHwxKTt0LmVhY2hCZWZvcmUoZnVuY3Rpb24odCl7dC54PSh0LngrcCkqZCx0Lnk9dC5kZXB0aCp2fSl9cmV0dXJuIHR9ZnVuY3Rpb24gbih0KXt2YXIgbj10LmNoaWxkcmVuLGU9dC5wYXJlbnQuY2hpbGRyZW4saT10Lmk/ZVt0LmktMV06bnVsbDtpZihuKXtKbyh0KTt2YXIgdT0oblswXS56K25bbi5sZW5ndGgtMV0ueikvMjtpPyh0Lno9aS56K28odC5fLGkuXyksdC5tPXQuei11KTp0Lno9dX1lbHNlIGkmJih0Lno9aS56K28odC5fLGkuXykpO3QucGFyZW50LkE9cih0LGksdC5wYXJlbnQuQXx8ZVswXSl9ZnVuY3Rpb24gZSh0KXt0Ll8ueD10LnordC5wYXJlbnQubSx0Lm0rPXQucGFyZW50Lm19ZnVuY3Rpb24gcih0LG4sZSl7aWYobil7Zm9yKHZhciByLGk9dCx1PXQsYT1uLGM9aS5wYXJlbnQuY2hpbGRyZW5bMF0scz1pLm0sZj11Lm0sbD1hLm0saD1jLm07YT1abyhhKSxpPSRvKGkpLGEmJmk7KWM9JG8oYyksdT1abyh1KSx1LmE9dCxyPWEueitsLWkuei1zK28oYS5fLGkuXykscj4wJiYoR28oUW8oYSx0LGUpLHQscikscys9cixmKz1yKSxsKz1hLm0scys9aS5tLGgrPWMubSxmKz11Lm07YSYmIVpvKHUpJiYodS50PWEsdS5tKz1sLWYpLGkmJiEkbyhjKSYmKGMudD1pLGMubSs9cy1oLGU9dCl9cmV0dXJuIGV9ZnVuY3Rpb24gaSh0KXt0LngqPXUsdC55PXQuZGVwdGgqYX12YXIgbz1Xbyx1PTEsYT0xLGM9bnVsbDtyZXR1cm4gdC5zZXBhcmF0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW4sdCk6b30sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSExLHU9K25bMF0sYT0rblsxXSx0KTpjP251bGw6W3UsYV19LHQubm9kZVNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ITAsdT0rblswXSxhPStuWzFdLHQpOmM/W3UsYV06bnVsbH0sdH0sWWc9ZnVuY3Rpb24odCxuLGUscixpKXtmb3IodmFyIG8sdT10LmNoaWxkcmVuLGE9LTEsYz11Lmxlbmd0aCxzPXQudmFsdWUmJihpLWUpL3QudmFsdWU7KythPGM7KW89dVthXSxvLngwPW4sby54MT1yLG8ueTA9ZSxvLnkxPWUrPW8udmFsdWUqc30sQmc9KDErTWF0aC5zcXJ0KDUpKS8yLGpnPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUscixpLG8pe251KG4sdCxlLHIsaSxvKX1yZXR1cm4gZS5yYXRpbz1mdW5jdGlvbihuKXtyZXR1cm4gdCgobj0rbik+MT9uOjEpfSxlfShCZyksSGc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3JldHVybiB0LngwPXQueTA9MCx0LngxPWksdC55MT1vLHQuZWFjaEJlZm9yZShuKSx1PVswXSxyJiZ0LmVhY2hCZWZvcmUoUmcpLHR9ZnVuY3Rpb24gbih0KXt2YXIgbj11W3QuZGVwdGhdLHI9dC54MCtuLGk9dC55MCtuLG89dC54MS1uLGg9dC55MS1uO288ciYmKHI9bz0ocitvKS8yKSxoPGkmJihpPWg9KGkraCkvMiksdC54MD1yLHQueTA9aSx0LngxPW8sdC55MT1oLHQuY2hpbGRyZW4mJihuPXVbdC5kZXB0aCsxXT1hKHQpLzIscis9bCh0KS1uLGkrPWModCktbixvLT1zKHQpLW4saC09Zih0KS1uLG88ciYmKHI9bz0ocitvKS8yKSxoPGkmJihpPWg9KGkraCkvMiksZSh0LHIsaSxvLGgpKX12YXIgZT1qZyxyPSExLGk9MSxvPTEsdT1bMF0sYT1JbyxjPUlvLHM9SW8sZj1JbyxsPUlvO3JldHVybiB0LnJvdW5kPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSEhbix0KTpyfSx0LnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K25bMF0sbz0rblsxXSx0KTpbaSxvXX0sdC50aWxlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPUZvKG4pLHQpOmV9LHQucGFkZGluZz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90LnBhZGRpbmdJbm5lcihuKS5wYWRkaW5nT3V0ZXIobik6dC5wYWRkaW5nSW5uZXIoKX0sdC5wYWRkaW5nSW5uZXI9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp6ZygrbiksdCk6YX0sdC5wYWRkaW5nT3V0ZXI9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dC5wYWRkaW5nVG9wKG4pLnBhZGRpbmdSaWdodChuKS5wYWRkaW5nQm90dG9tKG4pLnBhZGRpbmdMZWZ0KG4pOnQucGFkZGluZ1RvcCgpfSx0LnBhZGRpbmdUb3A9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp6ZygrbiksdCk6Y30sdC5wYWRkaW5nUmlnaHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp6ZygrbiksdCk6c30sdC5wYWRkaW5nQm90dG9tPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246emcoK24pLHQpOmZ9LHQucGFkZGluZ0xlZnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp6ZygrbiksdCk6bH0sdH0sWGc9ZnVuY3Rpb24odCxuLGUscixpKXtmdW5jdGlvbiBvKHQsbixlLHIsaSx1LGEpe2lmKHQ+PW4tMSl7dmFyIHM9Y1t0XTtyZXR1cm4gcy54MD1yLHMueTA9aSxzLngxPXUscy55MT1hLHZvaWQgMH1mb3IodmFyIGw9Zlt0XSxoPWUvMitsLHA9dCsxLGQ9bi0xO3A8ZDspe3ZhciB2PXArZD4+PjE7Zlt2XTxoP3A9disxOmQ9dn12YXIgXz1mW3BdLWwseT1lLV87aWYoYS1pPnUtcil7dmFyIGc9KGkqeSthKl8pL2U7byh0LHAsXyxyLGksdSxnKSxvKHAsbix5LHIsZyx1LGEpfWVsc2V7dmFyIG09KHIqeSt1Kl8pL2U7byh0LHAsXyxyLGksbSxhKSxvKHAsbix5LG0saSx1LGEpfX12YXIgdSxhLGM9dC5jaGlsZHJlbixzPWMubGVuZ3RoLGY9bmV3IEFycmF5KHMrMSk7Zm9yKGZbMF09YT11PTA7dTxzOysrdSlmW3UrMV09YSs9Y1t1XS52YWx1ZTtvKDAscyx0LnZhbHVlLG4sZSxyLGkpfSxWZz1mdW5jdGlvbih0LG4sZSxyLGkpeygxJnQuZGVwdGg/WWc6cWcpKHQsbixlLHIsaSl9LFdnPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUscixpLG8pe2lmKCh1PXQuX3NxdWFyaWZ5KSYmdS5yYXRpbz09PW4pZm9yKHZhciB1LGEsYyxzLGYsbD0tMSxoPXUubGVuZ3RoLHA9dC52YWx1ZTsrK2w8aDspe2ZvcihhPXVbbF0sYz1hLmNoaWxkcmVuLHM9YS52YWx1ZT0wLGY9Yy5sZW5ndGg7czxmOysrcylhLnZhbHVlKz1jW3NdLnZhbHVlO2EuZGljZT9xZyhhLGUscixpLHIrPShvLXIpKmEudmFsdWUvcCk6WWcoYSxlLHIsZSs9KGktZSkqYS52YWx1ZS9wLG8pLHAtPWEudmFsdWV9ZWxzZSB0Ll9zcXVhcmlmeT11PW51KG4sdCxlLHIsaSxvKSx1LnJhdGlvPW59cmV0dXJuIGUucmF0aW89ZnVuY3Rpb24obil7cmV0dXJuIHQoKG49K24pPjE/bjoxKX0sZX0oQmcpLCRnPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlPS0xLHI9dC5sZW5ndGgsaT10W3ItMV0sbz0wOysrZTxyOyluPWksaT10W2VdLG8rPW5bMV0qaVswXS1uWzBdKmlbMV07cmV0dXJuIG8vMn0sWmc9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscj0tMSxpPXQubGVuZ3RoLG89MCx1PTAsYT10W2ktMV0sYz0wOysrcjxpOyluPWEsYT10W3JdLGMrPWU9blswXSphWzFdLWFbMF0qblsxXSxvKz0oblswXSthWzBdKSplLHUrPShuWzFdK2FbMV0pKmU7cmV0dXJuIGMqPTMsW28vYyx1L2NdfSxHZz1mdW5jdGlvbih0LG4sZSl7cmV0dXJuKG5bMF0tdFswXSkqKGVbMV0tdFsxXSktKG5bMV0tdFsxXSkqKGVbMF0tdFswXSl9LEpnPWZ1bmN0aW9uKHQpe2lmKChlPXQubGVuZ3RoKTwzKXJldHVybiBudWxsO3ZhciBuLGUscj1uZXcgQXJyYXkoZSksaT1uZXcgQXJyYXkoZSk7Zm9yKG49MDtuPGU7KytuKXJbbl09Wyt0W25dWzBdLCt0W25dWzFdLG5dO2ZvcihyLnNvcnQoZXUpLG49MDtuPGU7KytuKWlbbl09W3Jbbl1bMF0sLXJbbl1bMV1dO3ZhciBvPXJ1KHIpLHU9cnUoaSksYT11WzBdPT09b1swXSxjPXVbdS5sZW5ndGgtMV09PT1vW28ubGVuZ3RoLTFdLHM9W107Zm9yKG49by5sZW5ndGgtMTtuPj0wOy0tbilzLnB1c2godFtyW29bbl1dWzJdXSk7Zm9yKG49K2E7bjx1Lmxlbmd0aC1jOysrbilzLnB1c2godFtyW3Vbbl1dWzJdXSk7cmV0dXJuIHN9LFFnPWZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlLHIsaT10Lmxlbmd0aCxvPXRbaS0xXSx1PW5bMF0sYT1uWzFdLGM9b1swXSxzPW9bMV0sZj0hMSxsPTA7bDxpOysrbClvPXRbbF0sZT1vWzBdLHI9b1sxXSxyPmEhPXM+YSYmdTwoYy1lKSooYS1yKS8ocy1yKStlJiYoZj0hZiksYz1lLHM9cjtyZXR1cm4gZn0sS2c9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscj0tMSxpPXQubGVuZ3RoLG89dFtpLTFdLHU9b1swXSxhPW9bMV0sYz0wOysrcjxpOyluPXUsZT1hLG89dFtyXSx1PW9bMF0sYT1vWzFdLG4tPXUsZS09YSxjKz1NYXRoLnNxcnQobipuK2UqZSk7cmV0dXJuIGN9LHRtPVtdLnNsaWNlLG5tPXt9O2l1LnByb3RvdHlwZT1mdS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOml1LGRlZmVyOmZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0fHx0aGlzLl9jYWxsKXRocm93IG5ldyBFcnJvcjtpZihudWxsIT10aGlzLl9lcnJvcilyZXR1cm4gdGhpczt2YXIgbj10bS5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gbi5wdXNoKHQpLCsrdGhpcy5fd2FpdGluZyx0aGlzLl90YXNrcy5wdXNoKG4pLG91KHRoaXMpLHRoaXN9LGFib3J0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PXRoaXMuX2Vycm9yJiZjdSh0aGlzLG5ldyBFcnJvcigiYWJvcnQiKSksdGhpc30sYXdhaXQ6ZnVuY3Rpb24odCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHR8fHRoaXMuX2NhbGwpdGhyb3cgbmV3IEVycm9yO3JldHVybiB0aGlzLl9jYWxsPWZ1bmN0aW9uKG4sZSl7dC5hcHBseShudWxsLFtuXS5jb25jYXQoZSkpfSxzdSh0aGlzKSx0aGlzfSxhd2FpdEFsbDpmdW5jdGlvbih0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdHx8dGhpcy5fY2FsbCl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHRoaXMuX2NhbGw9dCxzdSh0aGlzKSx0aGlzfX07dmFyIGVtPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHQ9bnVsbD09dD8wOit0LG49bnVsbD09bj8xOituLDE9PT1hcmd1bWVudHMubGVuZ3RoPyhuPXQsdD0wKTpuLT10LGZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucmFuZG9tKCkqbit0fX0scm09ZnVuY3Rpb24odCxuKXt2YXIgZSxyO3JldHVybiB0PW51bGw9PXQ/MDordCxuPW51bGw9PW4/MTorbixmdW5jdGlvbigpe3ZhciBpO2lmKG51bGwhPWUpaT1lLGU9bnVsbDtlbHNlIGRvIGU9MipNYXRoLnJhbmRvbSgpLTEsaT0yKk1hdGgucmFuZG9tKCktMSxyPWUqZStpKmk7d2hpbGUoIXJ8fHI+MSk7cmV0dXJuIHQrbippKk1hdGguc3FydCgtMipNYXRoLmxvZyhyKS9yKX19LGltPWZ1bmN0aW9uKCl7dmFyIHQ9cm0uYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBNYXRoLmV4cCh0KCkpfX0sb209ZnVuY3Rpb24odCl7DQpyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIG49MCxlPTA7ZTx0OysrZSluKz1NYXRoLnJhbmRvbSgpO3JldHVybiBufX0sdW09ZnVuY3Rpb24odCl7dmFyIG49b20odCk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG4oKS90fX0sYW09ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuLU1hdGgubG9nKDEtTWF0aC5yYW5kb20oKSkvdH19LGNtPWZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZSh0KXt2YXIgbixlPXMuc3RhdHVzO2lmKCFlJiZodShzKXx8ZT49MjAwJiZlPDMwMHx8MzA0PT09ZSl7aWYobyl0cnl7bj1vLmNhbGwocixzKX1jYXRjaCh0KXtyZXR1cm4gdm9pZCBhLmNhbGwoImVycm9yIixyLHQpfWVsc2Ugbj1zO2EuY2FsbCgibG9hZCIscixuKX1lbHNlIGEuY2FsbCgiZXJyb3IiLHIsdCl9dmFyIHIsaSxvLHUsYT1wKCJiZWZvcmVzZW5kIiwicHJvZ3Jlc3MiLCJsb2FkIiwiZXJyb3IiKSxjPUllKCkscz1uZXcgWE1MSHR0cFJlcXVlc3QsZj1udWxsLGw9bnVsbCxoPTA7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBYRG9tYWluUmVxdWVzdHx8IndpdGhDcmVkZW50aWFscyJpbiBzfHwhL14oaHR0cChzKT86KT9cL1wvLy50ZXN0KHQpfHwocz1uZXcgWERvbWFpblJlcXVlc3QpLCJvbmxvYWQiaW4gcz9zLm9ubG9hZD1zLm9uZXJyb3I9cy5vbnRpbWVvdXQ9ZTpzLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbih0KXtzLnJlYWR5U3RhdGU+MyYmZSh0KX0scy5vbnByb2dyZXNzPWZ1bmN0aW9uKHQpe2EuY2FsbCgicHJvZ3Jlc3MiLHIsdCl9LHI9e2hlYWRlcjpmdW5jdGlvbih0LG4pe3JldHVybiB0PSh0KyIiKS50b0xvd2VyQ2FzZSgpLGFyZ3VtZW50cy5sZW5ndGg8Mj9jLmdldCh0KToobnVsbD09bj9jLnJlbW92ZSh0KTpjLnNldCh0LG4rIiIpLHIpfSxtaW1lVHlwZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1udWxsPT10P251bGw6dCsiIixyKTppfSxyZXNwb25zZVR5cGU6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxyKTp1fSx0aW1lb3V0OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSt0LHIpOmh9LHVzZXI6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MT9mOihmPW51bGw9PXQ/bnVsbDp0KyIiLHIpfSxwYXNzd29yZDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwxP2w6KGw9bnVsbD09dD9udWxsOnQrIiIscil9LHJlc3BvbnNlOmZ1bmN0aW9uKHQpe3JldHVybiBvPXQscn0sZ2V0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHIuc2VuZCgiR0VUIix0LG4pfSxwb3N0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHIuc2VuZCgiUE9TVCIsdCxuKX0sc2VuZDpmdW5jdGlvbihuLGUsbyl7cmV0dXJuIHMub3BlbihuLHQsITAsZixsKSxudWxsPT1pfHxjLmhhcygiYWNjZXB0Iil8fGMuc2V0KCJhY2NlcHQiLGkrIiwqLyoiKSxzLnNldFJlcXVlc3RIZWFkZXImJmMuZWFjaChmdW5jdGlvbih0LG4pe3Muc2V0UmVxdWVzdEhlYWRlcihuLHQpfSksbnVsbCE9aSYmcy5vdmVycmlkZU1pbWVUeXBlJiZzLm92ZXJyaWRlTWltZVR5cGUoaSksbnVsbCE9dSYmKHMucmVzcG9uc2VUeXBlPXUpLGg+MCYmKHMudGltZW91dD1oKSxudWxsPT1vJiYiZnVuY3Rpb24iPT10eXBlb2YgZSYmKG89ZSxlPW51bGwpLG51bGwhPW8mJjE9PT1vLmxlbmd0aCYmKG89bHUobykpLG51bGwhPW8mJnIub24oImVycm9yIixvKS5vbigibG9hZCIsZnVuY3Rpb24odCl7byhudWxsLHQpfSksYS5jYWxsKCJiZWZvcmVzZW5kIixyLHMpLHMuc2VuZChudWxsPT1lP251bGw6ZSkscn0sYWJvcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gcy5hYm9ydCgpLHJ9LG9uOmZ1bmN0aW9uKCl7dmFyIHQ9YS5vbi5hcHBseShhLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1hP3I6dH19LG51bGwhPW4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjazogIituKTtyZXR1cm4gci5nZXQobil9cmV0dXJuIHJ9LHNtPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUscil7dmFyIGk9Y20oZSkubWltZVR5cGUodCkucmVzcG9uc2Uobik7aWYobnVsbCE9cil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiK3IpO3JldHVybiBpLmdldChyKX1yZXR1cm4gaX19LGZtPXNtKCJ0ZXh0L2h0bWwiLGZ1bmN0aW9uKHQpe3JldHVybiBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCh0LnJlc3BvbnNlVGV4dCl9KSxsbT1zbSgiYXBwbGljYXRpb24vanNvbiIsZnVuY3Rpb24odCl7cmV0dXJuIEpTT04ucGFyc2UodC5yZXNwb25zZVRleHQpfSksaG09c20oInRleHQvcGxhaW4iLGZ1bmN0aW9uKHQpe3JldHVybiB0LnJlc3BvbnNlVGV4dH0pLHBtPXNtKCJhcHBsaWNhdGlvbi94bWwiLGZ1bmN0aW9uKHQpe3ZhciBuPXQucmVzcG9uc2VYTUw7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJwYXJzZSBlcnJvciIpO3JldHVybiBufSksZG09ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oZSxyLGkpe2FyZ3VtZW50cy5sZW5ndGg8MyYmKGk9cixyPW51bGwpO3ZhciBvPWNtKGUpLm1pbWVUeXBlKHQpO3JldHVybiBvLnJvdz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9vLnJlc3BvbnNlKHB1KG4scj10KSk6cn0sby5yb3cociksaT9vLmdldChpKTpvfX0sdm09ZG0oInRleHQvY3N2IixCZCksX209ZG0oInRleHQvdGFiLXNlcGFyYXRlZC12YWx1ZXMiLFdkKSx5bT1BcnJheS5wcm90b3R5cGUsZ209eW0ubWFwLG1tPXltLnNsaWNlLHhtPXtuYW1lOiJpbXBsaWNpdCJ9LGJtPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0sd209ZnVuY3Rpb24odCl7cmV0dXJuK3R9LE1tPVswLDFdLFRtPWZ1bmN0aW9uKG4scixpKXt2YXIgbyx1PW5bMF0sYT1uW24ubGVuZ3RoLTFdLGM9ZSh1LGEsbnVsbD09cj8xMDpyKTtzd2l0Y2goaT16dihudWxsPT1pPyIsZiI6aSksaS50eXBlKXtjYXNlInMiOnZhciBzPU1hdGgubWF4KE1hdGguYWJzKHUpLE1hdGguYWJzKGEpKTtyZXR1cm4gbnVsbCE9aS5wcmVjaXNpb258fGlzTmFOKG89VXYoYyxzKSl8fChpLnByZWNpc2lvbj1vKSx0LmZvcm1hdFByZWZpeChpLHMpO2Nhc2UiIjpjYXNlImUiOmNhc2UiZyI6Y2FzZSJwIjpjYXNlInIiOm51bGwhPWkucHJlY2lzaW9ufHxpc05hTihvPUR2KGMsTWF0aC5tYXgoTWF0aC5hYnModSksTWF0aC5hYnMoYSkpKSl8fChpLnByZWNpc2lvbj1vLSgiZSI9PT1pLnR5cGUpKTticmVhaztjYXNlImYiOmNhc2UiJSI6bnVsbCE9aS5wcmVjaXNpb258fGlzTmFOKG89THYoYykpfHwoaS5wcmVjaXNpb249by0yKigiJSI9PT1pLnR5cGUpKX1yZXR1cm4gdC5mb3JtYXQoaSl9LE5tPWZ1bmN0aW9uKHQsbil7dD10LnNsaWNlKCk7dmFyIGUscj0wLGk9dC5sZW5ndGgtMSxvPXRbcl0sdT10W2ldO3JldHVybiB1PG8mJihlPXIscj1pLGk9ZSxlPW8sbz11LHU9ZSksdFtyXT1uLmZsb29yKG8pLHRbaV09bi5jZWlsKHUpLHR9LGttPW5ldyBEYXRlLFNtPW5ldyBEYXRlLEVtPVl1KGZ1bmN0aW9uKCl7fSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCtuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4gbi10fSk7RW0uZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSxpc0Zpbml0ZSh0KSYmdD4wP3Q+MT9ZdShmdW5jdGlvbihuKXtuLnNldFRpbWUoTWF0aC5mbG9vcihuL3QpKnQpfSxmdW5jdGlvbihuLGUpe24uc2V0VGltZSgrbitlKnQpfSxmdW5jdGlvbihuLGUpe3JldHVybihlLW4pL3R9KTpFbTpudWxsfTt2YXIgQW09RW0ucmFuZ2UsQ209MWUzLHptPTZlNCxQbT0zNmU1LFJtPTg2NGU1LHFtPTYwNDhlNSxMbT1ZdShmdW5jdGlvbih0KXt0LnNldFRpbWUoTWF0aC5mbG9vcih0L0NtKSpDbSl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0K24qQ20pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpL0NtfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENTZWNvbmRzKCl9KSxVbT1MbS5yYW5nZSxEbT1ZdShmdW5jdGlvbih0KXt0LnNldFRpbWUoTWF0aC5mbG9vcih0L3ptKSp6bSl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0K24qem0pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpL3ptfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRNaW51dGVzKCl9KSxPbT1EbS5yYW5nZSxGbT1ZdShmdW5jdGlvbih0KXt2YXIgbj10LmdldFRpbWV6b25lT2Zmc2V0KCkqem0lUG07bjwwJiYobis9UG0pLHQuc2V0VGltZShNYXRoLmZsb29yKCgrdC1uKS9QbSkqUG0rbil9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0K24qUG0pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpL1BtfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRIb3VycygpfSksSW09Rm0ucmFuZ2UsWW09WXUoZnVuY3Rpb24odCl7dC5zZXRIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldERhdGUodC5nZXREYXRlKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdC0obi5nZXRUaW1lem9uZU9mZnNldCgpLXQuZ2V0VGltZXpvbmVPZmZzZXQoKSkqem0pL1JtfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXREYXRlKCktMX0pLEJtPVltLnJhbmdlLGptPUJ1KDApLEhtPUJ1KDEpLFhtPUJ1KDIpLFZtPUJ1KDMpLFdtPUJ1KDQpLCRtPUJ1KDUpLFptPUJ1KDYpLEdtPWptLnJhbmdlLEptPUhtLnJhbmdlLFFtPVhtLnJhbmdlLEttPVZtLnJhbmdlLHR4PVdtLnJhbmdlLG54PSRtLnJhbmdlLGV4PVptLnJhbmdlLHJ4PVl1KGZ1bmN0aW9uKHQpe3Quc2V0RGF0ZSgxKSx0LnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0TW9udGgodC5nZXRNb250aCgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldE1vbnRoKCktdC5nZXRNb250aCgpKzEyKihuLmdldEZ1bGxZZWFyKCktdC5nZXRGdWxsWWVhcigpKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TW9udGgoKX0pLGl4PXJ4LnJhbmdlLG94PVl1KGZ1bmN0aW9uKHQpe3Quc2V0TW9udGgoMCwxKSx0LnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0RnVsbFllYXIodC5nZXRGdWxsWWVhcigpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldEZ1bGxZZWFyKCktdC5nZXRGdWxsWWVhcigpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRGdWxsWWVhcigpfSk7b3guZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9ZdShmdW5jdGlvbihuKXtuLnNldEZ1bGxZZWFyKE1hdGguZmxvb3Iobi5nZXRGdWxsWWVhcigpL3QpKnQpLG4uc2V0TW9udGgoMCwxKSxuLnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbihuLGUpe24uc2V0RnVsbFllYXIobi5nZXRGdWxsWWVhcigpK2UqdCl9KTpudWxsfTt2YXIgdXg9b3gucmFuZ2UsYXg9WXUoZnVuY3Rpb24odCl7dC5zZXRVVENTZWNvbmRzKDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0K24qem0pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpL3ptfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENNaW51dGVzKCl9KSxjeD1heC5yYW5nZSxzeD1ZdShmdW5jdGlvbih0KXt0LnNldFVUQ01pbnV0ZXMoMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCtuKlBtKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS9QbX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDSG91cnMoKX0pLGZ4PXN4LnJhbmdlLGx4PVl1KGZ1bmN0aW9uKHQpe3Quc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpL1JtfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENEYXRlKCktMX0pLGh4PWx4LnJhbmdlLHB4PWp1KDApLGR4PWp1KDEpLHZ4PWp1KDIpLF94PWp1KDMpLHl4PWp1KDQpLGd4PWp1KDUpLG14PWp1KDYpLHh4PXB4LnJhbmdlLGJ4PWR4LnJhbmdlLHd4PXZ4LnJhbmdlLE14PV94LnJhbmdlLFR4PXl4LnJhbmdlLE54PWd4LnJhbmdlLGt4PW14LnJhbmdlLFN4PVl1KGZ1bmN0aW9uKHQpe3Quc2V0VVRDRGF0ZSgxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDTW9udGgodC5nZXRVVENNb250aCgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldFVUQ01vbnRoKCktdC5nZXRVVENNb250aCgpKzEyKihuLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDTW9udGgoKX0pLEV4PVN4LnJhbmdlLEF4PVl1KGZ1bmN0aW9uKHQpe3Quc2V0VVRDTW9udGgoMCwxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDRnVsbFllYXIodC5nZXRVVENGdWxsWWVhcigpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENGdWxsWWVhcigpfSk7QXguZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9ZdShmdW5jdGlvbihuKXtuLnNldFVUQ0Z1bGxZZWFyKE1hdGguZmxvb3Iobi5nZXRVVENGdWxsWWVhcigpL3QpKnQpLG4uc2V0VVRDTW9udGgoMCwxKSxuLnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbihuLGUpe24uc2V0VVRDRnVsbFllYXIobi5nZXRVVENGdWxsWWVhcigpK2UqdCl9KTpudWxsfTt2YXIgQ3gseng9QXgucmFuZ2UsUHg9eyItIjoiIixfOiIgIiwwOiIwIn0sUng9L15ccypcZCsvLHF4PS9eJS8sTHg9L1tcXFxeXCRcKlwrXD9cfFxbXF1cKFwpXC5ce1x9XS9nO1lhKHtkYXRlVGltZToiJXgsICVYIixkYXRlOiIlLW0vJS1kLyVZIix0aW1lOiIlLUk6JU06JVMgJXAiLHBlcmlvZHM6WyJBTSIsIlBNIl0sZGF5czpbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sc2hvcnREYXlzOlsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0Il0sbW9udGhzOlsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxzaG9ydE1vbnRoczpbIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdfSk7dmFyIFV4PSIlWS0lbS0lZFQlSDolTTolUy4lTFoiLER4PURhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nP0JhOnQudXRjRm9ybWF0KFV4KSxPeD0rbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpP2phOnQudXRjUGFyc2UoVXgpLEZ4PTFlMyxJeD02MCpGeCxZeD02MCpJeCxCeD0yNCpZeCxqeD03KkJ4LEh4PTMwKkJ4LFh4PTM2NSpCeCxWeD1mdW5jdGlvbigpe3JldHVybiBWYShveCxyeCxqbSxZbSxGbSxEbSxMbSxFbSx0LnRpbWVGb3JtYXQpLmRvbWFpbihbbmV3IERhdGUoMmUzLDAsMSksbmV3IERhdGUoMmUzLDAsMildKX0sV3g9ZnVuY3Rpb24oKXtyZXR1cm4gVmEoQXgsU3gscHgsbHgsc3gsYXgsTG0sRW0sdC51dGNGb3JtYXQpLmRvbWFpbihbRGF0ZS5VVEMoMmUzLDAsMSksRGF0ZS5VVEMoMmUzLDAsMildKX0sJHg9ZnVuY3Rpb24odCl7cmV0dXJuIHQubWF0Y2goLy57Nn0vZykubWFwKGZ1bmN0aW9uKHQpe3JldHVybiIjIit0fSl9LFp4PSR4KCIxZjc3YjRmZjdmMGUyY2EwMmNkNjI3Mjg5NDY3YmQ4YzU2NGJlMzc3YzI3ZjdmN2ZiY2JkMjIxN2JlY2YiKSxHeD0keCgiMzkzYjc5NTI1NGEzNmI2ZWNmOWM5ZWRlNjM3OTM5OGNhMjUyYjVjZjZiY2VkYjljOGM2ZDMxYmQ5ZTM5ZTdiYTUyZTdjYjk0ODQzYzM5YWQ0OTRhZDY2MTZiZTc5NjljN2I0MTczYTU1MTk0Y2U2ZGJkZGU5ZWQ2IiksSng9JHgoIjMxODJiZDZiYWVkNjllY2FlMWM2ZGJlZmU2NTUwZGZkOGQzY2ZkYWU2YmZkZDBhMjMxYTM1NDc0YzQ3NmExZDk5YmM3ZTljMDc1NmJiMTllOWFjOGJjYmRkY2RhZGFlYjYzNjM2Mzk2OTY5NmJkYmRiZGQ5ZDlkOSIpLFF4PSR4KCIxZjc3YjRhZWM3ZThmZjdmMGVmZmJiNzgyY2EwMmM5OGRmOGFkNjI3MjhmZjk4OTY5NDY3YmRjNWIwZDU4YzU2NGJjNDljOTRlMzc3YzJmN2I2ZDI3ZjdmN2ZjN2M3YzdiY2JkMjJkYmRiOGQxN2JlY2Y5ZWRhZTUiKSxLeD1VaChYdCgzMDAsLjUsMCksWHQoLTI0MCwuNSwxKSksdGI9VWgoWHQoLTEwMCwuNzUsLjM1KSxYdCg4MCwxLjUsLjgpKSxuYj1VaChYdCgyNjAsLjc1LC4zNSksWHQoODAsMS41LC44KSksZWI9WHQoKSxyYj1mdW5jdGlvbih0KXsodDwwfHx0PjEpJiYodC09TWF0aC5mbG9vcih0KSk7dmFyIG49TWF0aC5hYnModC0uNSk7cmV0dXJuIGViLmg9MzYwKnQtMTAwLGViLnM9MS41LTEuNSpuLGViLmw9LjgtLjkqbixlYisiIn0saWI9V2EoJHgoIjQ0MDE1NDQ0MDI1NjQ1MDQ1NzQ1MDU1OTQ2MDc1YTQ2MDg1YzQ2MGE1ZDQ2MGI1ZTQ3MGQ2MDQ3MGU2MTQ3MTA2MzQ3MTE2NDQ3MTM2NTQ4MTQ2NzQ4MTY2ODQ4MTc2OTQ4MTg2YTQ4MWE2YzQ4MWI2ZDQ4MWM2ZTQ4MWQ2ZjQ4MWY3MDQ4MjA3MTQ4MjE3MzQ4MjM3NDQ4MjQ3NTQ4MjU3NjQ4MjY3NzQ4Mjg3ODQ4Mjk3OTQ3MmE3YTQ3MmM3YTQ3MmQ3YjQ3MmU3YzQ3MmY3ZDQ2MzA3ZTQ2MzI3ZTQ2MzM3ZjQ2MzQ4MDQ1MzU4MTQ1Mzc4MTQ1Mzg4MjQ0Mzk4MzQ0M2E4MzQ0M2I4NDQzM2Q4NDQzM2U4NTQyM2Y4NTQyNDA4NjQyNDE4NjQxNDI4NzQxNDQ4NzQwNDU4ODQwNDY4ODNmNDc4ODNmNDg4OTNlNDk4OTNlNGE4OTNlNGM4YTNkNGQ4YTNkNGU4YTNjNGY4YTNjNTA4YjNiNTE4YjNiNTI4YjNhNTM4YjNhNTQ4YzM5NTU4YzM5NTY4YzM4NTg4YzM4NTk4YzM3NWE4YzM3NWI4ZDM2NWM4ZDM2NWQ4ZDM1NWU4ZDM1NWY4ZDM0NjA4ZDM0NjE4ZDMzNjI4ZDMzNjM4ZDMyNjQ4ZTMyNjU4ZTMxNjY4ZTMxNjc4ZTMxNjg4ZTMwNjk4ZTMwNmE4ZTJmNmI4ZTJmNmM4ZTJlNmQ4ZTJlNmU4ZTJlNmY4ZTJkNzA4ZTJkNzE4ZTJjNzE4ZTJjNzI4ZTJjNzM4ZTJiNzQ4ZTJiNzU4ZTJhNzY4ZTJhNzc4ZTJhNzg4ZTI5Nzk4ZTI5N2E4ZTI5N2I4ZTI4N2M4ZTI4N2Q4ZTI3N2U4ZTI3N2Y4ZTI3ODA4ZTI2ODE4ZTI2ODI4ZTI2ODI4ZTI1ODM4ZTI1ODQ4ZTI1ODU4ZTI0ODY4ZTI0ODc4ZTIzODg4ZTIzODk4ZTIzOGE4ZDIyOGI4ZDIyOGM4ZDIyOGQ4ZDIxOGU4ZDIxOGY4ZDIxOTA4ZDIxOTE4YzIwOTI4YzIwOTI4YzIwOTM4YzFmOTQ4YzFmOTU4YjFmOTY4YjFmOTc4YjFmOTg4YjFmOTk4YTFmOWE4YTFlOWI4YTFlOWM4OTFlOWQ4OTFmOWU4OTFmOWY4ODFmYTA4ODFmYTE4ODFmYTE4NzFmYTI4NzIwYTM4NjIwYTQ4NjIxYTU4NTIxYTY4NTIyYTc4NTIyYTg4NDIzYTk4MzI0YWE4MzI1YWI4MjI1YWM4MjI2YWQ4MTI3YWQ4MTI4YWU4MDI5YWY3ZjJhYjA3ZjJjYjE3ZTJkYjI3ZDJlYjM3YzJmYjQ3YzMxYjU3YjMyYjY3YTM0YjY3OTM1Yjc3OTM3Yjg3ODM4Yjk3NzNhYmE3NjNiYmI3NTNkYmM3NDNmYmM3MzQwYmQ3MjQyYmU3MTQ0YmY3MDQ2YzA2ZjQ4YzE2ZTRhYzE2ZDRjYzI2YzRlYzM2YjUwYzQ2YTUyYzU2OTU0YzU2ODU2YzY2NzU4Yzc2NTVhYzg2NDVjYzg2MzVlYzk2MjYwY2E2MDYzY2I1ZjY1Y2I1ZTY3Y2M1YzY5Y2Q1YjZjY2Q1YTZlY2U1ODcwY2Y1NzczZDA1Njc1ZDA1NDc3ZDE1MzdhZDE1MTdjZDI1MDdmZDM0ZTgxZDM0ZDg0ZDQ0Yjg2ZDU0OTg5ZDU0ODhiZDY0NjhlZDY0NTkwZDc0MzkzZDc0MTk1ZDg0MDk4ZDgzZTliZDkzYzlkZDkzYmEwZGEzOWEyZGEzN2E1ZGIzNmE4ZGIzNGFhZGMzMmFkZGMzMGIwZGQyZmIyZGQyZGI1ZGUyYmI4ZGUyOWJhZGUyOGJkZGYyNmMwZGYyNWMyZGYyM2M1ZTAyMWM4ZTAyMGNhZTExZmNkZTExZGQwZTExY2QyZTIxYmQ1ZTIxYWQ4ZTIxOWRhZTMxOWRkZTMxOGRmZTMxOGUyZTQxOGU1ZTQxOWU3ZTQxOWVhZTUxYWVjZTUxYmVmZTUxY2YxZTUxZGY0ZTYxZWY2ZTYyMGY4ZTYyMWZiZTcyM2ZkZTcyNSIpKSxvYj1XYSgkeCgiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTA5MDIwMjBiMDIwMjBkMDMwMzBmMDMwMzEyMDQwNDE0MDUwNDE2MDYwNTE4MDYwNTFhMDcwNjFjMDgwNzFlMDkwNzIwMGEwODIyMGIwOTI0MGMwOTI2MGQwYTI5MGUwYjJiMTAwYjJkMTEwYzJmMTIwZDMxMTMwZDM0MTQwZTM2MTUwZTM4MTYwZjNiMTgwZjNkMTkxMDNmMWExMDQyMWMxMDQ0MWQxMTQ3MWUxMTQ5MjAxMTRiMjExMTRlMjIxMTUwMjQxMjUzMjUxMjU1MjcxMjU4MjkxMTVhMmExMTVjMmMxMTVmMmQxMTYxMmYxMTYzMzExMTY1MzMxMDY3MzQxMDY5MzYxMDZiMzgxMDZjMzkwZjZlM2IwZjcwM2QwZjcxM2YwZjcyNDAwZjc0NDIwZjc1NDQwZjc2NDUxMDc3NDcxMDc4NDkxMDc4NGExMDc5NGMxMTdhNGUxMTdiNGYxMjdiNTExMjdjNTIxMzdjNTQxMzdkNTYxNDdkNTcxNTdlNTkxNTdlNWExNjdlNWMxNjdmNWQxNzdmNWYxODdmNjAxODgwNjIxOTgwNjQxYTgwNjUxYTgwNjcxYjgwNjgxYzgxNmExYzgxNmIxZDgxNmQxZDgxNmUxZTgxNzAxZjgxNzIxZjgxNzMyMDgxNzUyMTgxNzYyMTgxNzgyMjgxNzkyMjgyN2IyMzgyN2MyMzgyN2UyNDgyODAyNTgyODEyNTgxODMyNjgxODQyNjgxODYyNzgxODgyNzgxODkyODgxOGIyOTgxOGMyOTgxOGUyYTgxOTAyYTgxOTEyYjgxOTMyYjgwOTQyYzgwOTYyYzgwOTgyZDgwOTkyZDgwOWIyZTdmOWMyZTdmOWUyZjdmYTAyZjdmYTEzMDdlYTMzMDdlYTUzMTdlYTYzMTdkYTgzMjdkYWEzMzdkYWIzMzdjYWQzNDdjYWUzNDdiYjAzNTdiYjIzNTdiYjMzNjdhYjUzNjdhYjczNzc5YjgzNzc5YmEzODc4YmMzOTc4YmQzOTc3YmYzYTc3YzAzYTc2YzIzYjc1YzQzYzc1YzUzYzc0YzczZDczYzgzZTczY2EzZTcyY2MzZjcxY2Q0MDcxY2Y0MDcwZDA0MTZmZDI0MjZmZDM0MzZlZDU0NDZkZDY0NTZjZDg0NTZjZDk0NjZiZGI0NzZhZGM0ODY5ZGU0OTY4ZGY0YTY4ZTA0YzY3ZTI0ZDY2ZTM0ZTY1ZTQ0ZjY0ZTU1MDY0ZTc1MjYzZTg1MzYyZTk1NDYyZWE1NjYxZWI1NzYwZWM1ODYwZWQ1YTVmZWU1YjVlZWY1ZDVlZjA1ZjVlZjE2MDVkZjI2MjVkZjI2NDVjZjM2NTVjZjQ2NzVjZjQ2OTVjZjU2YjVjZjY2YzVjZjY2ZTVjZjc3MDVjZjc3MjVjZjg3NDVjZjg3NjVjZjk3ODVkZjk3OTVkZjk3YjVkZmE3ZDVlZmE3ZjVlZmE4MTVmZmI4MzVmZmI4NTYwZmI4NzYxZmM4OTYxZmM4YTYyZmM4YzYzZmM4ZTY0ZmM5MDY1ZmQ5MjY2ZmQ5NDY3ZmQ5NjY4ZmQ5ODY5ZmQ5YTZhZmQ5YjZiZmU5ZDZjZmU5ZjZkZmVhMTZlZmVhMzZmZmVhNTcxZmVhNzcyZmVhOTczZmVhYTc0ZmVhYzc2ZmVhZTc3ZmViMDc4ZmViMjdhZmViNDdiZmViNjdjZmViNzdlZmViOTdmZmViYjgxZmViZDgyZmViZjg0ZmVjMTg1ZmVjMjg3ZmVjNDg4ZmVjNjhhZmVjODhjZmVjYThkZmVjYzhmZmVjZDkwZmVjZjkyZmVkMTk0ZmVkMzk1ZmVkNTk3ZmVkNzk5ZmVkODlhZmRkYTljZmRkYzllZmRkZWEwZmRlMGExZmRlMmEzZmRlM2E1ZmRlNWE3ZmRlN2E5ZmRlOWFhZmRlYmFjZmNlY2FlZmNlZWIwZmNmMGIyZmNmMmI0ZmNmNGI2ZmNmNmI4ZmNmN2I5ZmNmOWJiZmNmYmJkZmNmZGJmIikpLHViPVdhKCR4KCIwMDAwMDQwMTAwMDUwMTAxMDYwMTAxMDgwMjAxMGEwMjAyMGMwMjAyMGUwMzAyMTAwNDAzMTIwNDAzMTQwNTA0MTcwNjA0MTkwNzA1MWIwODA1MWQwOTA2MWYwYTA3MjIwYjA3MjQwYzA4MjYwZDA4MjkwZTA5MmIxMDA5MmQxMTBhMzAxMjBhMzIxNDBiMzQxNTBiMzcxNjBiMzkxODBjM2MxOTBjM2UxYjBjNDExYzBjNDMxZTBjNDUxZjBjNDgyMTBjNGEyMzBjNGMyNDBjNGYyNjBjNTEyODBiNTMyOTBiNTUyYjBiNTcyZDBiNTkyZjBhNWIzMTBhNWMzMjBhNWUzNDBhNWYzNjA5NjEzODA5NjIzOTA5NjMzYjA5NjQzZDA5NjUzZTA5NjY0MDBhNjc0MjBhNjg0NDBhNjg0NTBhNjk0NzBiNmE0OTBiNmE0YTBjNmI0YzBjNmI0ZDBkNmM0ZjBkNmM1MTBlNmM1MjBlNmQ1NDBmNmQ1NTBmNmQ1NzEwNmU1OTEwNmU1YTExNmU1YzEyNmU1ZDEyNmU1ZjEzNmU2MTEzNmU2MjE0NmU2NDE1NmU2NTE1NmU2NzE2NmU2OTE2NmU2YTE3NmU2YzE4NmU2ZDE4NmU2ZjE5NmU3MTE5NmU3MjFhNmU3NDFhNmU3NTFiNmU3NzFjNmQ3ODFjNmQ3YTFkNmQ3YzFkNmQ3ZDFlNmQ3ZjFlNmM4MDFmNmM4MjIwNmM4NDIwNmI4NTIxNmI4NzIxNmI4ODIyNmE4YTIyNmE4YzIzNjk4ZDIzNjk4ZjI0Njk5MDI1Njg5MjI1Njg5MzI2Njc5NTI2Njc5NzI3NjY5ODI3NjY5YTI4NjU5YjI5NjQ5ZDI5NjQ5ZjJhNjNhMDJhNjNhMjJiNjJhMzJjNjFhNTJjNjBhNjJkNjBhODJlNWZhOTJlNWVhYjJmNWVhZDMwNWRhZTMwNWNiMDMxNWJiMTMyNWFiMzMyNWFiNDMzNTliNjM0NThiNzM1NTdiOTM1NTZiYTM2NTViYzM3NTRiZDM4NTNiZjM5NTJjMDNhNTFjMTNhNTBjMzNiNGZjNDNjNGVjNjNkNGRjNzNlNGNjODNmNGJjYTQwNGFjYjQxNDljYzQyNDhjZTQzNDdjZjQ0NDZkMDQ1NDVkMjQ2NDRkMzQ3NDNkNDQ4NDJkNTRhNDFkNzRiM2ZkODRjM2VkOTRkM2RkYTRlM2NkYjUwM2JkZDUxM2FkZTUyMzhkZjUzMzdlMDU1MzZlMTU2MzVlMjU3MzRlMzU5MzNlNDVhMzFlNTVjMzBlNjVkMmZlNzVlMmVlODYwMmRlOTYxMmJlYTYzMmFlYjY0MjllYjY2MjhlYzY3MjZlZDY5MjVlZTZhMjRlZjZjMjNlZjZlMjFmMDZmMjBmMTcxMWZmMTczMWRmMjc0MWNmMzc2MWJmMzc4MTlmNDc5MThmNTdiMTdmNTdkMTVmNjdlMTRmNjgwMTNmNzgyMTJmNzg0MTBmODg1MGZmODg3MGVmODg5MGNmOThiMGJmOThjMGFmOThlMDlmYTkwMDhmYTkyMDdmYTk0MDdmYjk2MDZmYjk3MDZmYjk5MDZmYjliMDZmYjlkMDdmYzlmMDdmY2ExMDhmY2EzMDlmY2E1MGFmY2E2MGNmY2E4MGRmY2FhMGZmY2FjMTFmY2FlMTJmY2IwMTRmY2IyMTZmY2I0MThmYmI2MWFmYmI4MWRmYmJhMWZmYmJjMjFmYmJlMjNmYWMwMjZmYWMyMjhmYWM0MmFmYWM2MmRmOWM3MmZmOWM5MzJmOWNiMzVmOGNkMzdmOGNmM2FmN2QxM2RmN2QzNDBmNmQ1NDNmNmQ3NDZmNWQ5NDlmNWRiNGNmNGRkNGZmNGRmNTNmNGUxNTZmM2UzNWFmM2U1NWRmMmU2NjFmMmU4NjVmMmVhNjlmMWVjNmRmMWVkNzFmMWVmNzVmMWYxNzlmMmYyN2RmMmY0ODJmM2Y1ODZmM2Y2OGFmNGY4OGVmNWY5OTJmNmZhOTZmOGZiOWFmOWZjOWRmYWZkYTFmY2ZmYTQiKSksYWI9V2EoJHgoIjBkMDg4NzEwMDc4ODEzMDc4OTE2MDc4YTE5MDY4YzFiMDY4ZDFkMDY4ZTIwMDY4ZjIyMDY5MDI0MDY5MTI2MDU5MTI4MDU5MjJhMDU5MzJjMDU5NDJlMDU5NTJmMDU5NjMxMDU5NzMzMDU5NzM1MDQ5ODM3MDQ5OTM4MDQ5YTNhMDQ5YTNjMDQ5YjNlMDQ5YzNmMDQ5YzQxMDQ5ZDQzMDM5ZTQ0MDM5ZTQ2MDM5ZjQ4MDM5ZjQ5MDNhMDRiMDNhMTRjMDJhMTRlMDJhMjUwMDJhMjUxMDJhMzUzMDJhMzU1MDJhNDU2MDFhNDU4MDFhNDU5MDFhNTViMDFhNTVjMDFhNjVlMDFhNjYwMDFhNjYxMDBhNzYzMDBhNzY0MDBhNzY2MDBhNzY3MDBhODY5MDBhODZhMDBhODZjMDBhODZlMDBhODZmMDBhODcxMDBhODcyMDFhODc0MDFhODc1MDFhODc3MDFhODc4MDFhODdhMDJhODdiMDJhODdkMDNhODdlMDNhODgwMDRhODgxMDRhNzgzMDVhNzg0MDVhNzg2MDZhNjg3MDdhNjg4MDhhNjhhMDlhNThiMGFhNThkMGJhNThlMGNhNDhmMGRhNDkxMGVhMzkyMGZhMzk0MTBhMjk1MTFhMTk2MTNhMTk4MTRhMDk5MTU5ZjlhMTY5ZjljMTc5ZTlkMTg5ZDllMTk5ZGEwMWE5Y2ExMWI5YmEyMWQ5YWEzMWU5YWE1MWY5OWE2MjA5OGE3MjE5N2E4MjI5NmFhMjM5NWFiMjQ5NGFjMjY5NGFkMjc5M2FlMjg5MmIwMjk5MWIxMmE5MGIyMmI4ZmIzMmM4ZWI0MmU4ZGI1MmY4Y2I2MzA4YmI3MzE4YWI4MzI4OWJhMzM4OGJiMzQ4OGJjMzU4N2JkMzc4NmJlMzg4NWJmMzk4NGMwM2E4M2MxM2I4MmMyM2M4MWMzM2Q4MGM0M2U3ZmM1NDA3ZWM2NDE3ZGM3NDI3Y2M4NDM3YmM5NDQ3YWNhNDU3YWNiNDY3OWNjNDc3OGNjNDk3N2NkNGE3NmNlNGI3NWNmNGM3NGQwNGQ3M2QxNGU3MmQyNGY3MWQzNTE3MWQ0NTI3MGQ1NTM2ZmQ1NTQ2ZWQ2NTU2ZGQ3NTY2Y2Q4NTc2YmQ5NTg2YWRhNWE2YWRhNWI2OWRiNWM2OGRjNWQ2N2RkNWU2NmRlNWY2NWRlNjE2NGRmNjI2M2UwNjM2M2UxNjQ2MmUyNjU2MWUyNjY2MGUzNjg1ZmU0Njk1ZWU1NmE1ZGU1NmI1ZGU2NmM1Y2U3NmU1YmU3NmY1YWU4NzA1OWU5NzE1OGU5NzI1N2VhNzQ1N2ViNzU1NmViNzY1NWVjNzc1NGVkNzk1M2VkN2E1MmVlN2I1MWVmN2M1MWVmN2U1MGYwN2Y0ZmYwODA0ZWYxODE0ZGYxODM0Y2YyODQ0YmYzODU0YmYzODc0YWY0ODg0OWY0ODk0OGY1OGI0N2Y1OGM0NmY2OGQ0NWY2OGY0NGY3OTA0NGY3OTE0M2Y3OTM0MmY4OTQ0MWY4OTU0MGY5OTczZmY5OTgzZWY5OWEzZWZhOWIzZGZhOWMzY2ZhOWUzYmZiOWYzYWZiYTEzOWZiYTIzOGZjYTMzOGZjYTUzN2ZjYTYzNmZjYTgzNWZjYTkzNGZkYWIzM2ZkYWMzM2ZkYWUzMmZkYWYzMWZkYjEzMGZkYjIyZmZkYjQyZmZkYjUyZWZlYjcyZGZlYjgyY2ZlYmEyY2ZlYmIyYmZlYmQyYWZlYmUyYWZlYzAyOWZkYzIyOWZkYzMyOGZkYzUyN2ZkYzYyN2ZkYzgyN2ZkY2EyNmZkY2IyNmZjY2QyNWZjY2UyNWZjZDAyNWZjZDIyNWZiZDMyNGZiZDUyNGZiZDcyNGZhZDgyNGZhZGEyNGY5ZGMyNGY5ZGQyNWY4ZGYyNWY4ZTEyNWY3ZTIyNWY3ZTQyNWY2ZTYyNmY2ZTgyNmY1ZTkyNmY1ZWIyN2Y0ZWQyN2YzZWUyN2YzZjAyN2YyZjIyN2YxZjQyNmYxZjUyNWYwZjcyNGYwZjkyMSIpKSxjYj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19LHNiPTFlLTEyLGZiPU1hdGguUEksbGI9ZmIvMixoYj0yKmZiLHBiPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciB0LHMsZj0rbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksbD0rZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksaD1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1sYixwPXUuYXBwbHkodGhpcyxhcmd1bWVudHMpLWxiLGQ9TWF0aC5hYnMocC1oKSx2PXA+aDtpZihjfHwoYz10PVJlKCkpLGw8ZiYmKHM9bCxsPWYsZj1zKSxsPnNiKWlmKGQ+aGItc2IpYy5tb3ZlVG8obCpNYXRoLmNvcyhoKSxsKk1hdGguc2luKGgpKSxjLmFyYygwLDAsbCxoLHAsIXYpLGY+c2ImJihjLm1vdmVUbyhmKk1hdGguY29zKHApLGYqTWF0aC5zaW4ocCkpLGMuYXJjKDAsMCxmLHAsaCx2KSk7ZWxzZXt2YXIgXyx5LGc9aCxtPXAseD1oLGI9cCx3PWQsTT1kLFQ9YS5hcHBseSh0aGlzLGFyZ3VtZW50cykvMixOPVQ+c2ImJihpPytpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpNYXRoLnNxcnQoZipmK2wqbCkpLGs9TWF0aC5taW4oTWF0aC5hYnMobC1mKS8yLCtyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksUz1rLEU9aztpZihOPnNiKXt2YXIgQT10YyhOL2YqTWF0aC5zaW4oVCkpLEM9dGMoTi9sKk1hdGguc2luKFQpKTsody09MipBKT5zYj8oQSo9dj8xOi0xLHgrPUEsYi09QSk6KHc9MCx4PWI9KGgrcCkvMiksKE0tPTIqQyk+c2I/KEMqPXY/MTotMSxnKz1DLG0tPUMpOihNPTAsZz1tPShoK3ApLzIpfXZhciB6PWwqTWF0aC5jb3MoZyksUD1sKk1hdGguc2luKGcpLFI9ZipNYXRoLmNvcyhiKSxxPWYqTWF0aC5zaW4oYik7aWYoaz5zYil7dmFyIEw9bCpNYXRoLmNvcyhtKSxVPWwqTWF0aC5zaW4obSksRD1mKk1hdGguY29zKHgpLE89ZipNYXRoLnNpbih4KTtpZihkPGZiKXt2YXIgRj13PnNiP25jKHosUCxELE8sTCxVLFIscSk6W1IscV0sST16LUZbMF0sWT1QLUZbMV0sQj1MLUZbMF0saj1VLUZbMV0sSD0xL01hdGguc2luKE1hdGguYWNvcygoSSpCK1kqaikvKE1hdGguc3FydChJKkkrWSpZKSpNYXRoLnNxcnQoQipCK2oqaikpKS8yKSxYPU1hdGguc3FydChGWzBdKkZbMF0rRlsxXSpGWzFdKTtTPU1hdGgubWluKGssKGYtWCkvKEgtMSkpLEU9TWF0aC5taW4oaywobC1YKS8oSCsxKSl9fU0+c2I/RT5zYj8oXz1lYyhELE8seixQLGwsRSx2KSx5PWVjKEwsVSxSLHEsbCxFLHYpLGMubW92ZVRvKF8uY3grXy54MDEsXy5jeStfLnkwMSksRTxrP2MuYXJjKF8uY3gsXy5jeSxFLE1hdGguYXRhbjIoXy55MDEsXy54MDEpLE1hdGguYXRhbjIoeS55MDEseS54MDEpLCF2KTooYy5hcmMoXy5jeCxfLmN5LEUsTWF0aC5hdGFuMihfLnkwMSxfLngwMSksTWF0aC5hdGFuMihfLnkxMSxfLngxMSksIXYpLGMuYXJjKDAsMCxsLE1hdGguYXRhbjIoXy5jeStfLnkxMSxfLmN4K18ueDExKSxNYXRoLmF0YW4yKHkuY3kreS55MTEseS5jeCt5LngxMSksIXYpLGMuYXJjKHkuY3gseS5jeSxFLE1hdGguYXRhbjIoeS55MTEseS54MTEpLE1hdGguYXRhbjIoeS55MDEseS54MDEpLCF2KSkpOihjLm1vdmVUbyh6LFApLGMuYXJjKDAsMCxsLGcsbSwhdikpOmMubW92ZVRvKHosUCksZj5zYiYmdz5zYj9TPnNiPyhfPWVjKFIscSxMLFUsZiwtUyx2KSx5PWVjKHosUCxELE8sZiwtUyx2KSxjLmxpbmVUbyhfLmN4K18ueDAxLF8uY3krXy55MDEpLFM8az9jLmFyYyhfLmN4LF8uY3ksUyxNYXRoLmF0YW4yKF8ueTAxLF8ueDAxKSxNYXRoLmF0YW4yKHkueTAxLHkueDAxKSwhdik6KGMuYXJjKF8uY3gsXy5jeSxTLE1hdGguYXRhbjIoXy55MDEsXy54MDEpLE1hdGguYXRhbjIoXy55MTEsXy54MTEpLCF2KSxjLmFyYygwLDAsZixNYXRoLmF0YW4yKF8uY3krXy55MTEsXy5jeCtfLngxMSksTWF0aC5hdGFuMih5LmN5K3kueTExLHkuY3greS54MTEpLHYpLGMuYXJjKHkuY3gseS5jeSxTLE1hdGguYXRhbjIoeS55MTEseS54MTEpLE1hdGguYXRhbjIoeS55MDEseS54MDEpLCF2KSkpOmMuYXJjKDAsMCxmLGIseCx2KTpjLmxpbmVUbyhSLHEpfWVsc2UgYy5tb3ZlVG8oMCwwKTtpZihjLmNsb3NlUGF0aCgpLHQpcmV0dXJuIGM9bnVsbCx0KyIifHxudWxsfXZhciBuPVphLGU9R2Escj1jYigwKSxpPW51bGwsbz1KYSx1PVFhLGE9S2EsYz1udWxsO3JldHVybiB0LmNlbnRyb2lkPWZ1bmN0aW9uKCl7dmFyIHQ9KCtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSsgK2UuYXBwbHkodGhpcyxhcmd1bWVudHMpKS8yLHI9KCtvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSsgK3UuYXBwbHkodGhpcyxhcmd1bWVudHMpKS8yLWZiLzI7cmV0dXJuW01hdGguY29zKHIpKnQsTWF0aC5zaW4ocikqdF19LHQuaW5uZXJSYWRpdXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpjYigrZSksdCk6bn0sdC5vdXRlclJhZGl1cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmNiKCtuKSx0KTplfSx0LmNvcm5lclJhZGl1cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmNiKCtuKSx0KTpyfSx0LnBhZFJhZGl1cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1udWxsPT1uP251bGw6ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpjYigrbiksdCk6aX0sdC5zdGFydEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246Y2IoK24pLHQpOm99LHQuZW5kQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpjYigrbiksdCk6dX0sdC5wYWRBbmdsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmNiKCtuKSx0KTphfSx0LmNvbnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9bnVsbD09bj9udWxsOm4sdCk6Y30sdH07cmMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OnRoaXMuX2NvbnRleHQubGluZVRvKHQsbil9fX07dmFyIGRiPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcmModCl9LHZiPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgYSxjLHMsZj10Lmxlbmd0aCxsPSExO2ZvcihudWxsPT1pJiYodT1vKHM9UmUoKSkpLGE9MDthPD1mOysrYSkhKGE8ZiYmcihjPXRbYV0sYSx0KSk9PT1sJiYoKGw9IWwpP3UubGluZVN0YXJ0KCk6dS5saW5lRW5kKCkpLGwmJnUucG9pbnQoK24oYyxhLHQpLCtlKGMsYSx0KSk7aWYocylyZXR1cm4gdT1udWxsLHMrIiJ8fG51bGx9dmFyIG49aWMsZT1vYyxyPWNiKCEwKSxpPW51bGwsbz1kYix1PW51bGw7cmV0dXJuIHQueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOmNiKCtlKSx0KTpufSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpjYigrbiksdCk6ZX0sdC5kZWZpbmVkPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246Y2IoISFuKSx0KTpyfSx0LmN1cnZlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW4sbnVsbCE9aSYmKHU9byhpKSksdCk6b30sdC5jb250ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT1uP2k9dT1udWxsOnU9byhpPW4pLHQpOml9LHR9LF9iPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgbixmLGwsaCxwLGQ9dC5sZW5ndGgsdj0hMSxfPW5ldyBBcnJheShkKSx5PW5ldyBBcnJheShkKTtmb3IobnVsbD09YSYmKHM9YyhwPVJlKCkpKSxuPTA7bjw9ZDsrK24pe2lmKCEobjxkJiZ1KGg9dFtuXSxuLHQpKT09PXYpaWYodj0hdilmPW4scy5hcmVhU3RhcnQoKSxzLmxpbmVTdGFydCgpO2Vsc2V7Zm9yKHMubGluZUVuZCgpLHMubGluZVN0YXJ0KCksbD1uLTE7bD49ZjstLWwpcy5wb2ludChfW2xdLHlbbF0pO3MubGluZUVuZCgpLHMuYXJlYUVuZCgpfXYmJihfW25dPStlKGgsbix0KSx5W25dPStpKGgsbix0KSxzLnBvaW50KHI/K3IoaCxuLHQpOl9bbl0sbz8rbyhoLG4sdCk6eVtuXSkpfWlmKHApcmV0dXJuIHM9bnVsbCxwKyIifHxudWxsfWZ1bmN0aW9uIG4oKXtyZXR1cm4gdmIoKS5kZWZpbmVkKHUpLmN1cnZlKGMpLmNvbnRleHQoYSl9dmFyIGU9aWMscj1udWxsLGk9Y2IoMCksbz1vYyx1PWNiKCEwKSxhPW51bGwsYz1kYixzPW51bGw7cmV0dXJuIHQueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmNiKCtuKSxyPW51bGwsdCk6ZX0sdC54MD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmNiKCtuKSx0KTplfSx0LngxPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PW4/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmNiKCtuKSx0KTpyfSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpjYigrbiksbz1udWxsLHQpOml9LHQueTA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpjYigrbiksdCk6aX0sdC55MT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1udWxsPT1uP251bGw6ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpjYigrbiksdCk6b30sdC5saW5lWDA9dC5saW5lWTA9ZnVuY3Rpb24oKXtyZXR1cm4gbigpLngoZSkueShpKX0sdC5saW5lWTE9ZnVuY3Rpb24oKXtyZXR1cm4gbigpLngoZSkueShvKX0sdC5saW5lWDE9ZnVuY3Rpb24oKXtyZXR1cm4gbigpLngocikueShpKX0sdC5kZWZpbmVkPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246Y2IoISFuKSx0KTp1fSx0LmN1cnZlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW4sbnVsbCE9YSYmKHM9YyhhKSksdCk6Y30sdC5jb250ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT1uP2E9cz1udWxsOnM9YyhhPW4pLHQpOmF9LHR9LHliPWZ1bmN0aW9uKHQsbil7cmV0dXJuIG48dD8tMTpuPnQ/MTpuPj10PzA6TmFOfSxnYj1mdW5jdGlvbih0KXtyZXR1cm4gdH0sbWI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBhLGMscyxmLGwsaD10Lmxlbmd0aCxwPTAsZD1uZXcgQXJyYXkoaCksdj1uZXcgQXJyYXkoaCksXz0raS5hcHBseSh0aGlzLGFyZ3VtZW50cykseT1NYXRoLm1pbihoYixNYXRoLm1heCgtaGIsby5hcHBseSh0aGlzLGFyZ3VtZW50cyktXykpLGc9TWF0aC5taW4oTWF0aC5hYnMoeSkvaCx1LmFwcGx5KHRoaXMsYXJndW1lbnRzKSksbT1nKih5PDA/LTE6MSk7Zm9yKGE9MDthPGg7KythKShsPXZbZFthXT1hXT0rbih0W2FdLGEsdCkpPjAmJihwKz1sKTtmb3IobnVsbCE9ZT9kLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gZSh2W3RdLHZbbl0pfSk6bnVsbCE9ciYmZC5zb3J0KGZ1bmN0aW9uKG4sZSl7cmV0dXJuIHIodFtuXSx0W2VdKX0pLGE9MCxzPXA/KHktaCptKS9wOjA7YTxoOysrYSxfPWYpYz1kW2FdLGw9dltjXSxmPV8rKGw+MD9sKnM6MCkrbSx2W2NdPXtkYXRhOnRbY10saW5kZXg6YSx2YWx1ZTpsLHN0YXJ0QW5nbGU6XyxlbmRBbmdsZTpmLHBhZEFuZ2xlOmd9O3JldHVybiB2fXZhciBuPWdiLGU9eWIscj1udWxsLGk9Y2IoMCksbz1jYihoYiksdT1jYigwKTtyZXR1cm4gdC52YWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOmNiKCtlKSx0KTpufSx0LnNvcnRWYWx1ZXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bixyPW51bGwsdCk6ZX0sdC5zb3J0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sZT1udWxsLHQpOnJ9LHQuc3RhcnRBbmdsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmNiKCtuKSx0KTppfSx0LmVuZEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246Y2IoK24pLHQpOm99LHQucGFkQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpjYigrbiksdCk6dX0sdH0seGI9YWMoZGIpO3VjLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUuYXJlYVN0YXJ0KCl9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5hcmVhRW5kKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX2N1cnZlLnBvaW50KG4qTWF0aC5zaW4odCksbiotTWF0aC5jb3ModCkpfX07dmFyIGJiPWZ1bmN0aW9uKCl7cmV0dXJuIGNjKHZiKCkuY3VydmUoeGIpKX0sd2I9ZnVuY3Rpb24oKXt2YXIgdD1fYigpLmN1cnZlKHhiKSxuPXQuY3VydmUsZT10LmxpbmVYMCxyPXQubGluZVgxLGk9dC5saW5lWTAsbz10LmxpbmVZMTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnN0YXJ0QW5nbGU9dC54MCxkZWxldGUgdC54MCx0LmVuZEFuZ2xlPXQueDEsZGVsZXRlIHQueDEsdC5yYWRpdXM9dC55LGRlbGV0ZSB0LnksdC5pbm5lclJhZGl1cz10LnkwLGRlbGV0ZSB0LnkwLHQub3V0ZXJSYWRpdXM9dC55MSxkZWxldGUgdC55MSx0LmxpbmVTdGFydEFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIGNjKGUoKSl9LGRlbGV0ZSB0LmxpbmVYMCx0LmxpbmVFbmRBbmdsZT1mdW5jdGlvbigpe3JldHVybiBjYyhyKCkpfSxkZWxldGUgdC5saW5lWDEsdC5saW5lSW5uZXJSYWRpdXM9ZnVuY3Rpb24oKXtyZXR1cm4gY2MoaSgpKX0sZGVsZXRlIHQubGluZVkwLHQubGluZU91dGVyUmFkaXVzPWZ1bmN0aW9uKCl7cmV0dXJuIGNjKG8oKSl9LGRlbGV0ZSB0LmxpbmVZMSx0LmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oYWModCkpOm4oKS5fY3VydmV9LHR9LE1iPXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vZmIpO3QubW92ZVRvKGUsMCksdC5hcmMoMCwwLGUsMCxoYil9fSxUYj17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuLzUpLzI7dC5tb3ZlVG8oLTMqZSwtZSksdC5saW5lVG8oLWUsLWUpLHQubGluZVRvKC1lLC0zKmUpLHQubGluZVRvKGUsLTMqZSksdC5saW5lVG8oZSwtZSksdC5saW5lVG8oMyplLC1lKSx0LmxpbmVUbygzKmUsZSksdC5saW5lVG8oZSxlKSx0LmxpbmVUbyhlLDMqZSksdC5saW5lVG8oLWUsMyplKSx0LmxpbmVUbygtZSxlKSx0LmxpbmVUbygtMyplLGUpLHQuY2xvc2VQYXRoKCl9fSxOYj1NYXRoLnNxcnQoMS8zKSxrYj0yKk5iLFNiPXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4va2IpLHI9ZSpOYjt0Lm1vdmVUbygwLC1lKSx0LmxpbmVUbyhyLDApLHQubGluZVRvKDAsZSksdC5saW5lVG8oLXIsMCksdC5jbG9zZVBhdGgoKX19LEViPS44OTA4MTMwOTE1MjkyODUyLEFiPU1hdGguc2luKGZiLzEwKS9NYXRoLnNpbig3KmZiLzEwKSxDYj1NYXRoLnNpbihoYi8xMCkqQWIsemI9LU1hdGguY29zKGhiLzEwKSpBYixQYj17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuKkViKSxyPUNiKmUsaT16YiplO3QubW92ZVRvKDAsLWUpLHQubGluZVRvKHIsaSk7Zm9yKHZhciBvPTE7bzw1Oysrbyl7dmFyIHU9aGIqby81LGE9TWF0aC5jb3ModSksYz1NYXRoLnNpbih1KTt0LmxpbmVUbyhjKmUsLWEqZSksdC5saW5lVG8oYSpyLWMqaSxjKnIrYSppKX10LmNsb3NlUGF0aCgpfX0sUmI9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQobikscj0tZS8yO3QucmVjdChyLHIsZSxlKX19LHFiPU1hdGguc3FydCgzKSxMYj17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPS1NYXRoLnNxcnQobi8oMypxYikpO3QubW92ZVRvKDAsMiplKSx0LmxpbmVUbygtcWIqZSwtZSksdC5saW5lVG8ocWIqZSwtZSksdC5jbG9zZVBhdGgoKX19LFViPS0uNSxEYj1NYXRoLnNxcnQoMykvMixPYj0xL01hdGguc3FydCgxMiksRmI9MyooT2IvMisxKSxJYj17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuL0ZiKSxyPWUvMixpPWUqT2Isbz1yLHU9ZSpPYitlLGE9LW8sYz11O3QubW92ZVRvKHIsaSksdC5saW5lVG8obyx1KSx0LmxpbmVUbyhhLGMpLHQubGluZVRvKFViKnItRGIqaSxEYipyK1ViKmkpLHQubGluZVRvKFViKm8tRGIqdSxEYipvK1ViKnUpLHQubGluZVRvKFViKmEtRGIqYyxEYiphK1ViKmMpLHQubGluZVRvKFViKnIrRGIqaSxVYippLURiKnIpLHQubGluZVRvKFViKm8rRGIqdSxVYip1LURiKm8pLHQubGluZVRvKFViKmErRGIqYyxVYipjLURiKmEpLHQuY2xvc2VQYXRoKCl9fSxZYj1bTWIsVGIsU2IsUmIsUGIsTGIsSWJdLEJiPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciB0O2lmKHJ8fChyPXQ9UmUoKSksbi5hcHBseSh0aGlzLGFyZ3VtZW50cykuZHJhdyhyLCtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksdClyZXR1cm4gcj1udWxsLHQrIiJ8fG51bGx9dmFyIG49Y2IoTWIpLGU9Y2IoNjQpLHI9bnVsbDtyZXR1cm4gdC50eXBlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6Y2IoZSksdCk6bn0sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246Y2IoK24pLHQpOmV9LHQuY29udGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT1uP251bGw6bix0KTpyfSx0fSxqYj1mdW5jdGlvbigpe307ZmMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMzpzYyh0aGlzLHRoaXMuX3gxLHRoaXMuX3kxKTtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDEsdGhpcy5feTEpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9jb250ZXh0LmxpbmVUbygoNSp0aGlzLl94MCt0aGlzLl94MSkvNiwoNSp0aGlzLl95MCt0aGlzLl95MSkvNik7ZGVmYXVsdDpzYyh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX07dmFyIEhiPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZmModCl9O2xjLnByb3RvdHlwZT17YXJlYVN0YXJ0OmpiLGFyZWFFbmQ6amIsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95MiksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5tb3ZlVG8oKHRoaXMuX3gyKzIqdGhpcy5feDMpLzMsKHRoaXMuX3kyKzIqdGhpcy5feTMpLzMpLHRoaXMuX2NvbnRleHQubGluZVRvKCh0aGlzLl94MysyKnRoaXMuX3gyKS8zLCh0aGlzLl95MysyKnRoaXMuX3kyKS8zKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gyLHRoaXMuX3kyKSx0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KX19LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDI9dCx0aGlzLl95Mj1uO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX3gzPXQsdGhpcy5feTM9bjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl94ND10LHRoaXMuX3k0PW4sdGhpcy5fY29udGV4dC5tb3ZlVG8oKHRoaXMuX3gwKzQqdGhpcy5feDErdCkvNiwodGhpcy5feTArNCp0aGlzLl95MStuKS82KTticmVhaztkZWZhdWx0OnNjKHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPW59fTt2YXIgWGI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBsYyh0KX07aGMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7dmFyIGU9KHRoaXMuX3gwKzQqdGhpcy5feDErdCkvNixyPSh0aGlzLl95MCs0KnRoaXMuX3kxK24pLzY7dGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyhlLHIpOnRoaXMuX2NvbnRleHQubW92ZVRvKGUscik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpzYyh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX07dmFyIFZiPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaGModCl9O3BjLnByb3RvdHlwZT17bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD1bXSx0aGlzLl95PVtdLHRoaXMuX2Jhc2lzLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5feCxuPXRoaXMuX3ksZT10Lmxlbmd0aC0xO2lmKGU+MClmb3IodmFyIHIsaT10WzBdLG89blswXSx1PXRbZV0taSxhPW5bZV0tbyxjPS0xOysrYzw9ZTspcj1jL2UsdGhpcy5fYmFzaXMucG9pbnQodGhpcy5fYmV0YSp0W2NdKygxLXRoaXMuX2JldGEpKihpK3IqdSksdGhpcy5fYmV0YSpuW2NdKygxLXRoaXMuX2JldGEpKihvK3IqYSkpO3RoaXMuX3g9dGhpcy5feT1udWxsLHRoaXMuX2Jhc2lzLmxpbmVFbmQoKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLl94LnB1c2goK3QpLHRoaXMuX3kucHVzaCgrbil9fTt2YXIgV2I9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiAxPT09bj9uZXcgZmModCk6bmV3IHBjKHQsbil9cmV0dXJuIGUuYmV0YT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC44NSk7dmMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOmRjKHRoaXMsdGhpcy5feDEsdGhpcy5feTEpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl94MT10LHRoaXMuX3kxPW47YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7ZGVmYXVsdDpkYyh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyICRiPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IHZjKHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO19jLnByb3RvdHlwZT17YXJlYVN0YXJ0OmpiLGFyZWFFbmQ6amIsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpLHRoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDQ9dCx0aGlzLl95ND1uKTticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl94NT10LHRoaXMuX3k1PW47YnJlYWs7ZGVmYXVsdDpkYyh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIFpiPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IF9jKHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO3ljLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYzPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5fcG9pbnQ9NDtkZWZhdWx0OmRjKHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgR2I9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuZXcgeWModCxuKX1yZXR1cm4gZS50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oMCk7bWMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDIsdGhpcy5feTIpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtpZih0PSt0LG49K24sdGhpcy5fcG9pbnQpe3ZhciBlPXRoaXMuX3gyLXQscj10aGlzLl95Mi1uO3RoaXMuX2wyM19hPU1hdGguc3FydCh0aGlzLl9sMjNfMmE9TWF0aC5wb3coZSplK3Iqcix0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7ZGVmYXVsdDpnYyh0aGlzLHQsbil9dGhpcy5fbDAxX2E9dGhpcy5fbDEyX2EsdGhpcy5fbDEyX2E9dGhpcy5fbDIzX2EsdGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYSx0aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhLHRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciBKYj1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG4/bmV3IG1jKHQsbik6bmV3IHZjKHQsMCl9cmV0dXJuIGUuYWxwaGE9ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSguNSk7eGMucHJvdG90eXBlPXthcmVhU3RhcnQ6amIsYXJlYUVuZDpqYixsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl94Mz10aGlzLl94ND10aGlzLl94NT10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj10aGlzLl95Mz10aGlzLl95ND10aGlzLl95NT1OYU4sdGhpcy5fbDAxX2E9dGhpcy5fbDEyX2E9dGhpcy5fbDIzX2E9dGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmE9dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAxOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5wb2ludCh0aGlzLl94NCx0aGlzLl95NCksdGhpcy5wb2ludCh0aGlzLl94NSx0aGlzLl95NSl9fSxwb2ludDpmdW5jdGlvbih0LG4pe2lmKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7dmFyIGU9dGhpcy5feDItdCxyPXRoaXMuX3kyLW47dGhpcy5fbDIzX2E9TWF0aC5zcXJ0KHRoaXMuX2wyM18yYT1NYXRoLnBvdyhlKmUrcipyLHRoaXMuX2FscGhhKSl9c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDQ9dCx0aGlzLl95ND1uKTticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl94NT10LHRoaXMuX3k1PW47YnJlYWs7ZGVmYXVsdDpnYyh0aGlzLHQsbil9dGhpcy5fbDAxX2E9dGhpcy5fbDEyX2EsdGhpcy5fbDEyX2E9dGhpcy5fbDIzX2EsdGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYSx0aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhLHRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciBRYj1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG4/bmV3IHhjKHQsbik6bmV3IF9jKHQsMCl9cmV0dXJuIGUuYWxwaGE9ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSguNSk7YmMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTA7DQp9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7aWYodD0rdCxuPStuLHRoaXMuX3BvaW50KXt2YXIgZT10aGlzLl94Mi10LHI9dGhpcy5feTItbjt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KGUqZStyKnIsdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5fcG9pbnQ9NDtkZWZhdWx0OmdjKHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIEtiPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgYmModCxuKTpuZXcgeWModCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTt3Yy5wcm90b3R5cGU9e2FyZWFTdGFydDpqYixhcmVhRW5kOmpiLGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludCYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXt0PSt0LG49K24sdGhpcy5fcG9pbnQ/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKToodGhpcy5fcG9pbnQ9MSx0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pKX19O3ZhciB0dz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHdjKHQpfTtTYy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT10aGlzLl90MD1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLHRoaXMuX3kxKTticmVhaztjYXNlIDM6a2ModGhpcyx0aGlzLl90MCxOYyh0aGlzLHRoaXMuX3QwKSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3ZhciBlPU5hTjtpZih0PSt0LG49K24sdCE9PXRoaXMuX3gxfHxuIT09dGhpcy5feTEpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsa2ModGhpcyxOYyh0aGlzLGU9VGModGhpcyx0LG4pKSxlKTticmVhaztkZWZhdWx0OmtjKHRoaXMsdGhpcy5fdDAsZT1UYyh0aGlzLHQsbikpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9bix0aGlzLl90MD1lfX19LChFYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShTYy5wcm90b3R5cGUpKS5wb2ludD1mdW5jdGlvbih0LG4pe1NjLnByb3RvdHlwZS5wb2ludC5jYWxsKHRoaXMsbix0KX0sQWMucHJvdG90eXBlPXttb3ZlVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0Lm1vdmVUbyhuLHQpfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXt0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpfSxsaW5lVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0LmxpbmVUbyhuLHQpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsbixlLHIsaSxvKXt0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8obix0LHIsZSxvLGkpfX0sUGMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD1bXSx0aGlzLl95PVtdfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5feCxuPXRoaXMuX3ksZT10Lmxlbmd0aDtpZihlKWlmKHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odFswXSxuWzBdKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0WzBdLG5bMF0pLDI9PT1lKXRoaXMuX2NvbnRleHQubGluZVRvKHRbMV0sblsxXSk7ZWxzZSBmb3IodmFyIHI9UmModCksaT1SYyhuKSxvPTAsdT0xO3U8ZTsrK28sKyt1KXRoaXMuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhyWzBdW29dLGlbMF1bb10sclsxXVtvXSxpWzFdW29dLHRbdV0sblt1XSk7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09ZSkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmUsdGhpcy5feD10aGlzLl95PW51bGx9LHBvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5feC5wdXNoKCt0KSx0aGlzLl95LnB1c2goK24pfX07dmFyIG53PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgUGModCl9O3FjLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3g9dGhpcy5feT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpezA8dGhpcy5fdCYmdGhpcy5fdDwxJiYyPT09dGhpcy5fcG9pbnQmJnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gsdGhpcy5feSksKHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU+PTAmJih0aGlzLl90PTEtdGhpcy5fdCx0aGlzLl9saW5lPTEtdGhpcy5fbGluZSl9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7ZGVmYXVsdDppZih0aGlzLl90PD0wKXRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gsbiksdGhpcy5fY29udGV4dC5saW5lVG8odCxuKTtlbHNle3ZhciBlPXRoaXMuX3gqKDEtdGhpcy5fdCkrdCp0aGlzLl90O3RoaXMuX2NvbnRleHQubGluZVRvKGUsdGhpcy5feSksdGhpcy5fY29udGV4dC5saW5lVG8oZSxuKX19dGhpcy5feD10LHRoaXMuX3k9bn19O3ZhciBldz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHFjKHQsLjUpfSxydz1BcnJheS5wcm90b3R5cGUuc2xpY2UsaXc9ZnVuY3Rpb24odCxuKXtpZigocj10Lmxlbmd0aCk+MSlmb3IodmFyIGUscixpPTEsbz10W25bMF1dLHU9by5sZW5ndGg7aTxyOysraSl7ZT1vLG89dFtuW2ldXTtmb3IodmFyIGE9MDthPHU7KythKW9bYV1bMV0rPW9bYV1bMF09aXNOYU4oZVthXVsxXSk/ZVthXVswXTplW2FdWzFdfX0sb3c9ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXQubGVuZ3RoLGU9bmV3IEFycmF5KG4pOy0tbj49MDspZVtuXT1uO3JldHVybiBlfSx1dz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIG8sdSxhPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLGM9dC5sZW5ndGgscz1hLmxlbmd0aCxmPW5ldyBBcnJheShzKTtmb3Iobz0wO288czsrK28pe2Zvcih2YXIgbCxoPWFbb10scD1mW29dPW5ldyBBcnJheShjKSxkPTA7ZDxjOysrZClwW2RdPWw9WzAsK2kodFtkXSxoLGQsdCldLGwuZGF0YT10W2RdO3Aua2V5PWh9Zm9yKG89MCx1PWUoZik7bzxzOysrbylmW3Vbb11dLmluZGV4PW87cmV0dXJuIHIoZix1KSxmfXZhciBuPWNiKFtdKSxlPW93LHI9aXcsaT1EYztyZXR1cm4gdC5rZXlzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6Y2IocncuY2FsbChlKSksdCk6bn0sdC52YWx1ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmNiKCtuKSx0KTppfSx0Lm9yZGVyPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PW4/b3c6ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpjYihydy5jYWxsKG4pKSx0KTplfSx0Lm9mZnNldD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT1uP2l3Om4sdCk6cn0sdH0sYXc9ZnVuY3Rpb24odCxuKXtpZigocj10Lmxlbmd0aCk+MCl7Zm9yKHZhciBlLHIsaSxvPTAsdT10WzBdLmxlbmd0aDtvPHU7KytvKXtmb3IoaT1lPTA7ZTxyOysrZSlpKz10W2VdW29dWzFdfHwwO2lmKGkpZm9yKGU9MDtlPHI7KytlKXRbZV1bb11bMV0vPWl9aXcodCxuKX19LGN3PWZ1bmN0aW9uKHQsbil7aWYoKGU9dC5sZW5ndGgpPjApe2Zvcih2YXIgZSxyPTAsaT10W25bMF1dLG89aS5sZW5ndGg7cjxvOysrcil7Zm9yKHZhciB1PTAsYT0wO3U8ZTsrK3UpYSs9dFt1XVtyXVsxXXx8MDtpW3JdWzFdKz1pW3JdWzBdPS1hLzJ9aXcodCxuKX19LHN3PWZ1bmN0aW9uKHQsbil7aWYoKGk9dC5sZW5ndGgpPjAmJihyPShlPXRbblswXV0pLmxlbmd0aCk+MCl7Zm9yKHZhciBlLHIsaSxvPTAsdT0xO3U8cjsrK3Upe2Zvcih2YXIgYT0wLGM9MCxzPTA7YTxpOysrYSl7Zm9yKHZhciBmPXRbblthXV0sbD1mW3VdWzFdfHwwLGg9Zlt1LTFdWzFdfHwwLHA9KGwtaCkvMixkPTA7ZDxhOysrZCl7dmFyIHY9dFtuW2RdXSxfPXZbdV1bMV18fDAseT12W3UtMV1bMV18fDA7cCs9Xy15fWMrPWwscys9cCpsfWVbdS0xXVsxXSs9ZVt1LTFdWzBdPW8sYyYmKG8tPXMvYyl9ZVt1LTFdWzFdKz1lW3UtMV1bMF09byxpdyh0LG4pfX0sZnc9ZnVuY3Rpb24odCl7dmFyIG49dC5tYXAoT2MpO3JldHVybiBvdyh0KS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5bdF0tbltlXX0pfSxsdz1mdW5jdGlvbih0KXtyZXR1cm4gZncodCkucmV2ZXJzZSgpfSxodz1mdW5jdGlvbih0KXt2YXIgbixlLHI9dC5sZW5ndGgsaT10Lm1hcChPYyksbz1vdyh0KS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIGlbbl0taVt0XX0pLHU9MCxhPTAsYz1bXSxzPVtdO2ZvcihuPTA7bjxyOysrbillPW9bbl0sdTxhPyh1Kz1pW2VdLGMucHVzaChlKSk6KGErPWlbZV0scy5wdXNoKGUpKTtyZXR1cm4gcy5yZXZlcnNlKCkuY29uY2F0KGMpfSxwdz1mdW5jdGlvbih0KXtyZXR1cm4gb3codCkucmV2ZXJzZSgpfSxkdz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19O1ljLnByb3RvdHlwZT17Y29uc3RydWN0b3I6WWMsaW5zZXJ0OmZ1bmN0aW9uKHQsbil7dmFyIGUscixpO2lmKHQpe2lmKG4uUD10LG4uTj10Lk4sdC5OJiYodC5OLlA9biksdC5OPW4sdC5SKXtmb3IodD10LlI7dC5MOyl0PXQuTDt0Lkw9bn1lbHNlIHQuUj1uO2U9dH1lbHNlIHRoaXMuXz8odD1YYyh0aGlzLl8pLG4uUD1udWxsLG4uTj10LHQuUD10Lkw9bixlPXQpOihuLlA9bi5OPW51bGwsdGhpcy5fPW4sZT1udWxsKTtmb3Iobi5MPW4uUj1udWxsLG4uVT1lLG4uQz0hMCx0PW47ZSYmZS5DOylyPWUuVSxlPT09ci5MPyhpPXIuUixpJiZpLkM/KGUuQz1pLkM9ITEsci5DPSEwLHQ9cik6KHQ9PT1lLlImJihqYyh0aGlzLGUpLHQ9ZSxlPXQuVSksZS5DPSExLHIuQz0hMCxIYyh0aGlzLHIpKSk6KGk9ci5MLGkmJmkuQz8oZS5DPWkuQz0hMSxyLkM9ITAsdD1yKToodD09PWUuTCYmKEhjKHRoaXMsZSksdD1lLGU9dC5VKSxlLkM9ITEsci5DPSEwLGpjKHRoaXMscikpKSxlPXQuVTt0aGlzLl8uQz0hMX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3QuTiYmKHQuTi5QPXQuUCksdC5QJiYodC5QLk49dC5OKSx0Lk49dC5QPW51bGw7dmFyIG4sZSxyLGk9dC5VLG89dC5MLHU9dC5SO2lmKGU9bz91P1hjKHUpOm86dSxpP2kuTD09PXQ/aS5MPWU6aS5SPWU6dGhpcy5fPWUsbyYmdT8ocj1lLkMsZS5DPXQuQyxlLkw9byxvLlU9ZSxlIT09dT8oaT1lLlUsZS5VPXQuVSx0PWUuUixpLkw9dCxlLlI9dSx1LlU9ZSk6KGUuVT1pLGk9ZSx0PWUuUikpOihyPXQuQyx0PWUpLHQmJih0LlU9aSksIXIpe2lmKHQmJnQuQylyZXR1cm4gdm9pZCh0LkM9ITEpO2Rve2lmKHQ9PT10aGlzLl8pYnJlYWs7aWYodD09PWkuTCl7aWYobj1pLlIsbi5DJiYobi5DPSExLGkuQz0hMCxqYyh0aGlzLGkpLG49aS5SKSxuLkwmJm4uTC5DfHxuLlImJm4uUi5DKXtuLlImJm4uUi5DfHwobi5MLkM9ITEsbi5DPSEwLEhjKHRoaXMsbiksbj1pLlIpLG4uQz1pLkMsaS5DPW4uUi5DPSExLGpjKHRoaXMsaSksdD10aGlzLl87YnJlYWt9fWVsc2UgaWYobj1pLkwsbi5DJiYobi5DPSExLGkuQz0hMCxIYyh0aGlzLGkpLG49aS5MKSxuLkwmJm4uTC5DfHxuLlImJm4uUi5DKXtuLkwmJm4uTC5DfHwobi5SLkM9ITEsbi5DPSEwLGpjKHRoaXMsbiksbj1pLkwpLG4uQz1pLkMsaS5DPW4uTC5DPSExLEhjKHRoaXMsaSksdD10aGlzLl87YnJlYWt9bi5DPSEwLHQ9aSxpPWkuVX13aGlsZSghdC5DKTt0JiYodC5DPSExKX19fTt2YXIgdncsX3cseXcsZ3csbXcseHc9W10sYnc9W10sd3c9MWUtNixNdz0xZS0xMjtfcy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOl9zLHBvbHlnb25zOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lZGdlcztyZXR1cm4gdGhpcy5jZWxscy5tYXAoZnVuY3Rpb24obil7dmFyIGU9bi5oYWxmZWRnZXMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiB0cyhuLHRbZV0pfSk7cmV0dXJuIGUuZGF0YT1uLnNpdGUuZGF0YSxlfSl9LHRyaWFuZ2xlczpmdW5jdGlvbigpe3ZhciB0PVtdLG49dGhpcy5lZGdlcztyZXR1cm4gdGhpcy5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKGUscil7aWYobz0oaT1lLmhhbGZlZGdlcykubGVuZ3RoKWZvcih2YXIgaSxvLHUsYT1lLnNpdGUsYz0tMSxzPW5baVtvLTFdXSxmPXMubGVmdD09PWE/cy5yaWdodDpzLmxlZnQ7KytjPG87KXU9ZixzPW5baVtjXV0sZj1zLmxlZnQ9PT1hP3MucmlnaHQ6cy5sZWZ0LHUmJmYmJnI8dS5pbmRleCYmcjxmLmluZGV4JiZkcyhhLHUsZik8MCYmdC5wdXNoKFthLmRhdGEsdS5kYXRhLGYuZGF0YV0pfSksdH0sbGlua3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGdlcy5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQucmlnaHR9KS5tYXAoZnVuY3Rpb24odCl7cmV0dXJue3NvdXJjZTp0LmxlZnQuZGF0YSx0YXJnZXQ6dC5yaWdodC5kYXRhfX0pfSxmaW5kOmZ1bmN0aW9uKHQsbixlKXtmb3IodmFyIHIsaSxvPXRoaXMsdT1vLl9mb3VuZHx8MCxhPW8uY2VsbHMubGVuZ3RoOyEoaT1vLmNlbGxzW3VdKTspaWYoKyt1Pj1hKXJldHVybiBudWxsO3ZhciBjPXQtaS5zaXRlWzBdLHM9bi1pLnNpdGVbMV0sZj1jKmMrcypzO2RvIGk9by5jZWxsc1tyPXVdLHU9bnVsbCxpLmhhbGZlZGdlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciByPW8uZWRnZXNbZV0sYT1yLmxlZnQ7aWYoYSE9PWkuc2l0ZSYmYXx8KGE9ci5yaWdodCkpe3ZhciBjPXQtYVswXSxzPW4tYVsxXSxsPWMqYytzKnM7bDxmJiYoZj1sLHU9YS5pbmRleCl9fSk7d2hpbGUobnVsbCE9PXUpO3JldHVybiBvLl9mb3VuZD1yLG51bGw9PWV8fGY8PWUqZT9pLnNpdGU6bnVsbH19O3ZhciBUdz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7cmV0dXJuIG5ldyBfcyh0Lm1hcChmdW5jdGlvbihyLGkpe3ZhciBvPVtNYXRoLnJvdW5kKG4ocixpLHQpL3d3KSp3dyxNYXRoLnJvdW5kKGUocixpLHQpL3d3KSp3d107cmV0dXJuIG8uaW5kZXg9aSxvLmRhdGE9cixvfSkscil9dmFyIG49RmMsZT1JYyxyPW51bGw7cmV0dXJuIHQucG9seWdvbnM9ZnVuY3Rpb24obil7cmV0dXJuIHQobikucG9seWdvbnMoKX0sdC5saW5rcz1mdW5jdGlvbihuKXtyZXR1cm4gdChuKS5saW5rcygpfSx0LnRyaWFuZ2xlcz1mdW5jdGlvbihuKXtyZXR1cm4gdChuKS50cmlhbmdsZXMoKX0sdC54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6ZHcoK2UpLHQpOm59LHQueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmR3KCtuKSx0KTplfSx0LmV4dGVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT1uP251bGw6W1srblswXVswXSwrblswXVsxXV0sWytuWzFdWzBdLCtuWzFdWzFdXV0sdCk6ciYmW1tyWzBdWzBdLHJbMF1bMV1dLFtyWzFdWzBdLHJbMV1bMV1dXX0sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PW4/bnVsbDpbWzAsMF0sWytuWzBdLCtuWzFdXV0sdCk6ciYmW3JbMV1bMF0tclswXVswXSxyWzFdWzFdLXJbMF1bMV1dfSx0fSxOdz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19O2dzLnByb3RvdHlwZT17Y29uc3RydWN0b3I6Z3Msc2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10P3RoaXM6bmV3IGdzKHRoaXMuayp0LHRoaXMueCx0aGlzLnkpfSx0cmFuc2xhdGU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gMD09PXQmMD09PW4/dGhpczpuZXcgZ3ModGhpcy5rLHRoaXMueCt0aGlzLmsqdCx0aGlzLnkrdGhpcy5rKm4pfSxhcHBseTpmdW5jdGlvbih0KXtyZXR1cm5bdFswXSp0aGlzLmsrdGhpcy54LHRbMV0qdGhpcy5rK3RoaXMueV19LGFwcGx5WDpmdW5jdGlvbih0KXtyZXR1cm4gdCp0aGlzLmsrdGhpcy54fSxhcHBseVk6ZnVuY3Rpb24odCl7cmV0dXJuIHQqdGhpcy5rK3RoaXMueX0saW52ZXJ0OmZ1bmN0aW9uKHQpe3JldHVyblsodFswXS10aGlzLngpL3RoaXMuaywodFsxXS10aGlzLnkpL3RoaXMua119LGludmVydFg6ZnVuY3Rpb24odCl7cmV0dXJuKHQtdGhpcy54KS90aGlzLmt9LGludmVydFk6ZnVuY3Rpb24odCl7cmV0dXJuKHQtdGhpcy55KS90aGlzLmt9LHJlc2NhbGVYOmZ1bmN0aW9uKHQpe3JldHVybiB0LmNvcHkoKS5kb21haW4odC5yYW5nZSgpLm1hcCh0aGlzLmludmVydFgsdGhpcykubWFwKHQuaW52ZXJ0LHQpKX0scmVzY2FsZVk6ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weSgpLmRvbWFpbih0LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WSx0aGlzKS5tYXAodC5pbnZlcnQsdCkpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiJ0cmFuc2xhdGUoIit0aGlzLngrIiwiK3RoaXMueSsiKSBzY2FsZSgiK3RoaXMuaysiKSJ9fTt2YXIga3c9bmV3IGdzKDEsMCwwKTttcy5wcm90b3R5cGU9Z3MucHJvdG90eXBlO3ZhciBTdz1mdW5jdGlvbigpe3QuZXZlbnQucHJldmVudERlZmF1bHQoKSx0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfSxFdz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odCl7dC5vbigid2hlZWwuem9vbSIscykub24oIm1vdXNlZG93bi56b29tIixmKS5vbigiZGJsY2xpY2suem9vbSIsbCkub24oInRvdWNoc3RhcnQuem9vbSIsaCkub24oInRvdWNobW92ZS56b29tIixkKS5vbigidG91Y2hlbmQuem9vbSB0b3VjaGNhbmNlbC56b29tIix2KS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpLnByb3BlcnR5KCJfX3pvb20iLE1zKX1mdW5jdGlvbiBlKHQsbil7cmV0dXJuIG49TWF0aC5tYXgoeCxNYXRoLm1pbihiLG4pKSxuPT09dC5rP3Q6bmV3IGdzKG4sdC54LHQueSl9ZnVuY3Rpb24gcih0LG4sZSl7dmFyIHI9blswXS1lWzBdKnQuayxpPW5bMV0tZVsxXSp0Lms7cmV0dXJuIHI9PT10LngmJmk9PT10Lnk/dDpuZXcgZ3ModC5rLHIsaSl9ZnVuY3Rpb24gaSh0LG4pe3ZhciBlPXQuaW52ZXJ0WChuWzBdWzBdKS13LHI9dC5pbnZlcnRYKG5bMV1bMF0pLU0saT10LmludmVydFkoblswXVsxXSktVCxvPXQuaW52ZXJ0WShuWzFdWzFdKS1OO3JldHVybiB0LnRyYW5zbGF0ZShyPmU/KGUrcikvMjpNYXRoLm1pbigwLGUpfHxNYXRoLm1heCgwLHIpLG8+aT8oaStvKS8yOk1hdGgubWluKDAsaSl8fE1hdGgubWF4KDAsbykpfWZ1bmN0aW9uIG8odCl7cmV0dXJuWygrdFswXVswXSsgK3RbMV1bMF0pLzIsKCt0WzBdWzFdKyArdFsxXVsxXSkvMl19ZnVuY3Rpb24gdSh0LG4sZSl7dC5vbigic3RhcnQuem9vbSIsZnVuY3Rpb24oKXthKHRoaXMsYXJndW1lbnRzKS5zdGFydCgpfSkub24oImludGVycnVwdC56b29tIGVuZC56b29tIixmdW5jdGlvbigpe2EodGhpcyxhcmd1bWVudHMpLmVuZCgpfSkudHdlZW4oInpvb20iLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxyPWFyZ3VtZW50cyxpPWEodCxyKSx1PW0uYXBwbHkodCxyKSxjPWV8fG8odSkscz1NYXRoLm1heCh1WzFdWzBdLXVbMF1bMF0sdVsxXVsxXS11WzBdWzFdKSxmPXQuX196b29tLGw9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0LHIpOm4saD1FKGYuaW52ZXJ0KGMpLmNvbmNhdChzL2YuayksbC5pbnZlcnQoYykuY29uY2F0KHMvbC5rKSk7cmV0dXJuIGZ1bmN0aW9uKHQpe2lmKDE9PT10KXQ9bDtlbHNle3ZhciBuPWgodCksZT1zL25bMl07dD1uZXcgZ3MoZSxjWzBdLW5bMF0qZSxjWzFdLW5bMV0qZSl9aS56b29tKG51bGwsdCl9fSl9ZnVuY3Rpb24gYSh0LG4pe2Zvcih2YXIgZSxyPTAsaT1BLmxlbmd0aDtyPGk7KytyKWlmKChlPUFbcl0pLnRoYXQ9PT10KXJldHVybiBlO3JldHVybiBuZXcgYyh0LG4pfWZ1bmN0aW9uIGModCxuKXt0aGlzLnRoYXQ9dCx0aGlzLmFyZ3M9bix0aGlzLmluZGV4PS0xLHRoaXMuYWN0aXZlPTAsdGhpcy5leHRlbnQ9bS5hcHBseSh0LG4pfWZ1bmN0aW9uIHMoKXtmdW5jdGlvbiBuKCl7by53aGVlbD1udWxsLG8uZW5kKCl9aWYoZy5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBvPWEodGhpcyxhcmd1bWVudHMpLHU9dGhpcy5fX3pvb20sYz1NYXRoLm1heCh4LE1hdGgubWluKGIsdS5rKk1hdGgucG93KDIsLXQuZXZlbnQuZGVsdGFZKih0LmV2ZW50LmRlbHRhTW9kZT8xMjA6MSkvNTAwKSkpLHM9emYodGhpcyk7aWYoby53aGVlbClvLm1vdXNlWzBdWzBdPT09c1swXSYmby5tb3VzZVswXVsxXT09PXNbMV18fChvLm1vdXNlWzFdPXUuaW52ZXJ0KG8ubW91c2VbMF09cykpLGNsZWFyVGltZW91dChvLndoZWVsKTtlbHNle2lmKHUuaz09PWMpcmV0dXJuO28ubW91c2U9W3MsdS5pbnZlcnQocyldLG9wKHRoaXMpLG8uc3RhcnQoKX1TdygpLG8ud2hlZWw9c2V0VGltZW91dChuLFApLG8uem9vbSgibW91c2UiLGkocihlKHUsYyksby5tb3VzZVswXSxvLm1vdXNlWzFdKSxvLmV4dGVudCkpfX1mdW5jdGlvbiBmKCl7ZnVuY3Rpb24gbigpe1N3KCksby5tb3ZlZD0hMCxvLnpvb20oIm1vdXNlIixpKHIoby50aGF0Ll9fem9vbSxvLm1vdXNlWzBdPXpmKG8udGhhdCksby5tb3VzZVsxXSksby5leHRlbnQpKX1mdW5jdGlvbiBlKCl7dS5vbigibW91c2Vtb3ZlLnpvb20gbW91c2V1cC56b29tIixudWxsKSxfdCh0LmV2ZW50LnZpZXcsby5tb3ZlZCksU3coKSxvLmVuZCgpfWlmKCF5JiZnLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIG89YSh0aGlzLGFyZ3VtZW50cyksdT1wbCh0LmV2ZW50LnZpZXcpLm9uKCJtb3VzZW1vdmUuem9vbSIsbiwhMCkub24oIm1vdXNldXAuem9vbSIsZSwhMCksYz16Zih0aGlzKTtnbCh0LmV2ZW50LnZpZXcpLHhzKCksby5tb3VzZT1bYyx0aGlzLl9fem9vbS5pbnZlcnQoYyldLG9wKHRoaXMpLG8uc3RhcnQoKX19ZnVuY3Rpb24gbCgpe2lmKGcuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbz10aGlzLl9fem9vbSxhPXpmKHRoaXMpLGM9by5pbnZlcnQoYSkscz1vLmsqKHQuZXZlbnQuc2hpZnRLZXk/LjU6MiksZj1pKHIoZShvLHMpLGEsYyksbS5hcHBseSh0aGlzLGFyZ3VtZW50cykpO1N3KCksaz4wP3BsKHRoaXMpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihrKS5jYWxsKHUsZixhKTpwbCh0aGlzKS5jYWxsKG4udHJhbnNmb3JtLGYpfX1mdW5jdGlvbiBoKCl7aWYoZy5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBuLGUscixpLG89YSh0aGlzLGFyZ3VtZW50cyksdT10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGM9dS5sZW5ndGg7Zm9yKHhzKCksZT0wO2U8YzsrK2Upcj11W2VdLGk9dmwodGhpcyx1LHIuaWRlbnRpZmllciksaT1baSx0aGlzLl9fem9vbS5pbnZlcnQoaSksci5pZGVudGlmaWVyXSxvLnRvdWNoMD9vLnRvdWNoMXx8KG8udG91Y2gxPWkpOihvLnRvdWNoMD1pLG49ITApO3JldHVybiBfJiYoXz1jbGVhclRpbWVvdXQoXyksIW8udG91Y2gxKT8oby5lbmQoKSxpPXBsKHRoaXMpLm9uKCJkYmxjbGljay56b29tIiksdm9pZChpJiZpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkpOnZvaWQobiYmKF89c2V0VGltZW91dChmdW5jdGlvbigpe189bnVsbH0seiksb3AodGhpcyksby5zdGFydCgpKSl9fWZ1bmN0aW9uIGQoKXt2YXIgbixvLHUsYyxzPWEodGhpcyxhcmd1bWVudHMpLGY9dC5ldmVudC5jaGFuZ2VkVG91Y2hlcyxsPWYubGVuZ3RoO2ZvcihTdygpLF8mJihfPWNsZWFyVGltZW91dChfKSksbj0wO248bDsrK24pbz1mW25dLHU9dmwodGhpcyxmLG8uaWRlbnRpZmllcikscy50b3VjaDAmJnMudG91Y2gwWzJdPT09by5pZGVudGlmaWVyP3MudG91Y2gwWzBdPXU6cy50b3VjaDEmJnMudG91Y2gxWzJdPT09by5pZGVudGlmaWVyJiYocy50b3VjaDFbMF09dSk7aWYobz1zLnRoYXQuX196b29tLHMudG91Y2gxKXt2YXIgaD1zLnRvdWNoMFswXSxwPXMudG91Y2gwWzFdLGQ9cy50b3VjaDFbMF0sdj1zLnRvdWNoMVsxXSx5PSh5PWRbMF0taFswXSkqeSsoeT1kWzFdLWhbMV0pKnksZz0oZz12WzBdLXBbMF0pKmcrKGc9dlsxXS1wWzFdKSpnO289ZShvLE1hdGguc3FydCh5L2cpKSx1PVsoaFswXStkWzBdKS8yLChoWzFdK2RbMV0pLzJdLGM9WyhwWzBdK3ZbMF0pLzIsKHBbMV0rdlsxXSkvMl19ZWxzZXtpZighcy50b3VjaDApcmV0dXJuO3U9cy50b3VjaDBbMF0sYz1zLnRvdWNoMFsxXX1zLnpvb20oInRvdWNoIixpKHIobyx1LGMpLHMuZXh0ZW50KSl9ZnVuY3Rpb24gdigpe3ZhciBuLGUscj1hKHRoaXMsYXJndW1lbnRzKSxpPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsbz1pLmxlbmd0aDtmb3IoeHMoKSx5JiZjbGVhclRpbWVvdXQoeSkseT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7eT1udWxsfSx6KSxuPTA7bjxvOysrbillPWlbbl0sci50b3VjaDAmJnIudG91Y2gwWzJdPT09ZS5pZGVudGlmaWVyP2RlbGV0ZSByLnRvdWNoMDpyLnRvdWNoMSYmci50b3VjaDFbMl09PT1lLmlkZW50aWZpZXImJmRlbGV0ZSByLnRvdWNoMTtyLnRvdWNoMSYmIXIudG91Y2gwJiYoci50b3VjaDA9ci50b3VjaDEsZGVsZXRlIHIudG91Y2gxKSxyLnRvdWNoMHx8ci5lbmQoKX12YXIgXyx5LGc9YnMsbT13cyx4PTAsYj0xLzAsdz0tYixNPWIsVD13LE49TSxrPTI1MCxFPUNoLEE9W10sQz1wKCJzdGFydCIsInpvb20iLCJlbmQiKSx6PTUwMCxQPTE1MDtyZXR1cm4gbi50cmFuc2Zvcm09ZnVuY3Rpb24odCxuKXt2YXIgZT10LnNlbGVjdGlvbj90LnNlbGVjdGlvbigpOnQ7ZS5wcm9wZXJ0eSgiX196b29tIixNcyksdCE9PWU/dSh0LG4pOmUuaW50ZXJydXB0KCkuZWFjaChmdW5jdGlvbigpe2EodGhpcyxhcmd1bWVudHMpLnN0YXJ0KCkuem9vbShudWxsLCJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOm4pLmVuZCgpfSl9LG4uc2NhbGVCeT1mdW5jdGlvbih0LGUpe24uc2NhbGVUbyh0LGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fX3pvb20uayxuPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmU7cmV0dXJuIHQqbn0pfSxuLnNjYWxlVG89ZnVuY3Rpb24odCx1KXtuLnRyYW5zZm9ybSh0LGZ1bmN0aW9uKCl7dmFyIHQ9bS5hcHBseSh0aGlzLGFyZ3VtZW50cyksbj10aGlzLl9fem9vbSxhPW8odCksYz1uLmludmVydChhKSxzPSJmdW5jdGlvbiI9PXR5cGVvZiB1P3UuYXBwbHkodGhpcyxhcmd1bWVudHMpOnU7cmV0dXJuIGkocihlKG4scyksYSxjKSx0KX0pfSxuLnRyYW5zbGF0ZUJ5PWZ1bmN0aW9uKHQsZSxyKXtuLnRyYW5zZm9ybSh0LGZ1bmN0aW9uKCl7cmV0dXJuIGkodGhpcy5fX3pvb20udHJhbnNsYXRlKCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmUsImZ1bmN0aW9uIj09dHlwZW9mIHI/ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ciksbS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSl9LGMucHJvdG90eXBlPXtzdGFydDpmdW5jdGlvbigpe3JldHVybiAxPT09Kyt0aGlzLmFjdGl2ZSYmKHRoaXMuaW5kZXg9QS5wdXNoKHRoaXMpLTEsdGhpcy5lbWl0KCJzdGFydCIpKSx0aGlzfSx6b29tOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMubW91c2UmJiJtb3VzZSIhPT10JiYodGhpcy5tb3VzZVsxXT1uLmludmVydCh0aGlzLm1vdXNlWzBdKSksdGhpcy50b3VjaDAmJiJ0b3VjaCIhPT10JiYodGhpcy50b3VjaDBbMV09bi5pbnZlcnQodGhpcy50b3VjaDBbMF0pKSx0aGlzLnRvdWNoMSYmInRvdWNoIiE9PXQmJih0aGlzLnRvdWNoMVsxXT1uLmludmVydCh0aGlzLnRvdWNoMVswXSkpLHRoaXMudGhhdC5fX3pvb209bix0aGlzLmVtaXQoInpvb20iKSx0aGlzfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09PS0tdGhpcy5hY3RpdmUmJihBLnNwbGljZSh0aGlzLmluZGV4LDEpLHRoaXMuaW5kZXg9LTEsdGhpcy5lbWl0KCJlbmQiKSksdGhpc30sZW1pdDpmdW5jdGlvbih0KXtTKG5ldyB5cyhuLHQsdGhpcy50aGF0Ll9fem9vbSksQy5hcHBseSxDLFt0LHRoaXMudGhhdCx0aGlzLmFyZ3NdKX19LG4uZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6TncoISF0KSxuKTpnfSxuLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT0iZnVuY3Rpb24iPT10eXBlb2YgdD90Ok53KFtbK3RbMF1bMF0sK3RbMF1bMV1dLFsrdFsxXVswXSwrdFsxXVsxXV1dKSxuKTptfSxuLnNjYWxlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PSt0WzBdLGI9K3RbMV0sbik6W3gsYl19LG4udHJhbnNsYXRlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh3PSt0WzBdWzBdLE09K3RbMV1bMF0sVD0rdFswXVsxXSxOPSt0WzFdWzFdLG4pOltbdyxUXSxbTSxOXV19LG4uZHVyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGs9K3Qsbik6a30sbi5pbnRlcnBvbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oRT10LG4pOkV9LG4ub249ZnVuY3Rpb24oKXt2YXIgdD1DLm9uLmFwcGx5KEMsYXJndW1lbnRzKTtyZXR1cm4gdD09PUM/bjp0fSxufTt0LnZlcnNpb249VHMsdC5iaXNlY3Q9RXMsdC5iaXNlY3RSaWdodD1Fcyx0LmJpc2VjdExlZnQ9QXMsdC5hc2NlbmRpbmc9TnMsdC5iaXNlY3Rvcj1rcyx0LmRlc2NlbmRpbmc9Q3MsdC5kZXZpYXRpb249UnMsdC5leHRlbnQ9cXMsdC5oaXN0b2dyYW09VnMsdC50aHJlc2hvbGRGcmVlZG1hbkRpYWNvbmlzPSRzLHQudGhyZXNob2xkU2NvdHQ9WnMsdC50aHJlc2hvbGRTdHVyZ2VzPVhzLHQubWF4PUdzLHQubWVhbj1Kcyx0Lm1lZGlhbj1Rcyx0Lm1lcmdlPUtzLHQubWluPXRmLHQucGFpcnM9bmYsdC5wZXJtdXRlPWVmLHQucXVhbnRpbGU9V3MsdC5yYW5nZT1Jcyx0LnNjYW49cmYsdC5zaHVmZmxlPW9mLHQuc3VtPXVmLHQudGlja3M9SHMsdC50aWNrU3RlcD1lLHQudHJhbnNwb3NlPWFmLHQudmFyaWFuY2U9UHMsdC56aXA9Y2YsdC5heGlzVG9wPXMsdC5heGlzUmlnaHQ9Zix0LmF4aXNCb3R0b209bCx0LmF4aXNMZWZ0PWgsdC5icnVzaD1tZCx0LmJydXNoWD1FZSx0LmJydXNoWT1BZSx0LmJydXNoU2VsZWN0aW9uPVNlLHQuY2hvcmQ9a2QsdC5yaWJib249UmQsdC5uZXN0PUxkLHQuc2V0PVZlLHQubWFwPUllLHQua2V5cz1EZCx0LnZhbHVlcz1PZCx0LmVudHJpZXM9RmQsdC5jb2xvcj1NdCx0LnJnYj1TdCx0LmhzbD16dCx0LmxhYj1MdCx0LmhjbD1CdCx0LmN1YmVoZWxpeD1YdCx0LmRpc3BhdGNoPXAsdC5kcmFnPXhsLHQuZHJhZ0Rpc2FibGU9Z2wsdC5kcmFnRW5hYmxlPV90LHQuZHN2Rm9ybWF0PUlkLHQuY3N2UGFyc2U9QmQsdC5jc3ZQYXJzZVJvd3M9amQsdC5jc3ZGb3JtYXQ9SGQsdC5jc3ZGb3JtYXRSb3dzPVhkLHQudHN2UGFyc2U9V2QsdC50c3ZQYXJzZVJvd3M9JGQsdC50c3ZGb3JtYXQ9WmQsdC50c3ZGb3JtYXRSb3dzPUdkLHQuZWFzZUxpbmVhcj1uZSx0LmVhc2VRdWFkPWllLHQuZWFzZVF1YWRJbj1lZSx0LmVhc2VRdWFkT3V0PXJlLHQuZWFzZVF1YWRJbk91dD1pZSx0LmVhc2VDdWJpYz1hZSx0LmVhc2VDdWJpY0luPW9lLHQuZWFzZUN1YmljT3V0PXVlLHQuZWFzZUN1YmljSW5PdXQ9YWUsdC5lYXNlUG9seT16cCx0LmVhc2VQb2x5SW49QXAsdC5lYXNlUG9seU91dD1DcCx0LmVhc2VQb2x5SW5PdXQ9enAsdC5lYXNlU2luPWZlLHQuZWFzZVNpbkluPWNlLHQuZWFzZVNpbk91dD1zZSx0LmVhc2VTaW5Jbk91dD1mZSx0LmVhc2VFeHA9cGUsdC5lYXNlRXhwSW49bGUsdC5lYXNlRXhwT3V0PWhlLHQuZWFzZUV4cEluT3V0PXBlLHQuZWFzZUNpcmNsZT1fZSx0LmVhc2VDaXJjbGVJbj1kZSx0LmVhc2VDaXJjbGVPdXQ9dmUsdC5lYXNlQ2lyY2xlSW5PdXQ9X2UsdC5lYXNlQm91bmNlPWdlLHQuZWFzZUJvdW5jZUluPXllLHQuZWFzZUJvdW5jZU91dD1nZSx0LmVhc2VCb3VuY2VJbk91dD1tZSx0LmVhc2VCYWNrPVdwLHQuZWFzZUJhY2tJbj1YcCx0LmVhc2VCYWNrT3V0PVZwLHQuZWFzZUJhY2tJbk91dD1XcCx0LmVhc2VFbGFzdGljPVFwLHQuZWFzZUVsYXN0aWNJbj1KcCx0LmVhc2VFbGFzdGljT3V0PVFwLHQuZWFzZUVsYXN0aWNJbk91dD1LcCx0LmZvcmNlQ2VudGVyPUpkLHQuZm9yY2VDb2xsaWRlPXZ2LHQuZm9yY2VMaW5rPV92LHQuZm9yY2VNYW55Qm9keT14dix0LmZvcmNlU2ltdWxhdGlvbj1tdix0LmZvcmNlWD1idix0LmZvcmNlWT13dix0LmZvcm1hdERlZmF1bHRMb2NhbGU9aHIsdC5mb3JtYXRMb2NhbGU9cXYsdC5mb3JtYXRTcGVjaWZpZXI9enYsdC5wcmVjaXNpb25GaXhlZD1Mdix0LnByZWNpc2lvblByZWZpeD1Vdix0LnByZWNpc2lvblJvdW5kPUR2LHQuZ2VvQXJlYT1qXyx0Lmdlb0JvdW5kcz1WXyx0Lmdlb0NlbnRyb2lkPSRfLHQuZ2VvQ2lyY2xlPXN5LHQuZ2VvQ2xpcEV4dGVudD1feSx0Lmdlb0Rpc3RhbmNlPXd5LHQuZ2VvR3JhdGljdWxlPXZpLHQuZ2VvR3JhdGljdWxlMTA9X2ksdC5nZW9JbnRlcnBvbGF0ZT1NeSx0Lmdlb0xlbmd0aD1teSx0Lmdlb1BhdGg9anksdC5nZW9BbGJlcnM9bmcsdC5nZW9BbGJlcnNVc2E9ZWcsdC5nZW9BemltdXRoYWxFcXVhbEFyZWE9aWcsdC5nZW9BemltdXRoYWxFcXVhbEFyZWFSYXc9cmcsdC5nZW9BemltdXRoYWxFcXVpZGlzdGFudD11Zyx0Lmdlb0F6aW11dGhhbEVxdWlkaXN0YW50UmF3PW9nLHQuZ2VvQ29uaWNDb25mb3JtYWw9Y2csdC5nZW9Db25pY0NvbmZvcm1hbFJhdz1lbyx0Lmdlb0NvbmljRXF1YWxBcmVhPXRnLHQuZ2VvQ29uaWNFcXVhbEFyZWFSYXc9WmksdC5nZW9Db25pY0VxdWlkaXN0YW50PWZnLHQuZ2VvQ29uaWNFcXVpZGlzdGFudFJhdz1pbyx0Lmdlb0VxdWlyZWN0YW5ndWxhcj1zZyx0Lmdlb0VxdWlyZWN0YW5ndWxhclJhdz1ybyx0Lmdlb0dub21vbmljPWxnLHQuZ2VvR25vbW9uaWNSYXc9b28sdC5nZW9JZGVudGl0eT1oZyx0Lmdlb1Byb2plY3Rpb249WGksdC5nZW9Qcm9qZWN0aW9uTXV0YXRvcj1WaSx0Lmdlb01lcmNhdG9yPWFnLHQuZ2VvTWVyY2F0b3JSYXc9S2ksdC5nZW9PcnRob2dyYXBoaWM9cGcsdC5nZW9PcnRob2dyYXBoaWNSYXc9YW8sdC5nZW9TdGVyZW9ncmFwaGljPWRnLHQuZ2VvU3RlcmVvZ3JhcGhpY1Jhdz1jbyx0Lmdlb1RyYW5zdmVyc2VNZXJjYXRvcj12Zyx0Lmdlb1RyYW5zdmVyc2VNZXJjYXRvclJhdz1zbyx0Lmdlb1JvdGF0aW9uPWN5LHQuZ2VvU3RyZWFtPUZfLHQuZ2VvVHJhbnNmb3JtPVp5LHQuY2x1c3Rlcj1fZyx0LmhpZXJhcmNoeT14byx0LnBhY2s9UGcsdC5wYWNrU2libGluZ3M9Q2csdC5wYWNrRW5jbG9zZT1BZyx0LnBhcnRpdGlvbj1MZyx0LnN0cmF0aWZ5PUZnLHQudHJlZT1JZyx0LnRyZWVtYXA9SGcsdC50cmVlbWFwQmluYXJ5PVhnLHQudHJlZW1hcERpY2U9cWcsdC50cmVlbWFwU2xpY2U9WWcsdC50cmVlbWFwU2xpY2VEaWNlPVZnLHQudHJlZW1hcFNxdWFyaWZ5PWpnLHQudHJlZW1hcFJlc3F1YXJpZnk9V2csdC5pbnRlcnBvbGF0ZT1taCx0LmludGVycG9sYXRlQXJyYXk9aGgsdC5pbnRlcnBvbGF0ZUJhc2lzPXVoLHQuaW50ZXJwb2xhdGVCYXNpc0Nsb3NlZD1haCx0LmludGVycG9sYXRlRGF0ZT1waCx0LmludGVycG9sYXRlTnVtYmVyPWRoLHQuaW50ZXJwb2xhdGVPYmplY3Q9dmgsdC5pbnRlcnBvbGF0ZVJvdW5kPXhoLHQuaW50ZXJwb2xhdGVTdHJpbmc9Z2gsdC5pbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcz1UaCx0LmludGVycG9sYXRlVHJhbnNmb3JtU3ZnPU5oLHQuaW50ZXJwb2xhdGVab29tPUNoLHQuaW50ZXJwb2xhdGVSZ2I9c2gsdC5pbnRlcnBvbGF0ZVJnYkJhc2lzPWZoLHQuaW50ZXJwb2xhdGVSZ2JCYXNpc0Nsb3NlZD1saCx0LmludGVycG9sYXRlSHNsPXpoLHQuaW50ZXJwb2xhdGVIc2xMb25nPVBoLHQuaW50ZXJwb2xhdGVMYWI9Zm4sdC5pbnRlcnBvbGF0ZUhjbD1SaCx0LmludGVycG9sYXRlSGNsTG9uZz1xaCx0LmludGVycG9sYXRlQ3ViZWhlbGl4PUxoLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXhMb25nPVVoLHQucXVhbnRpemU9RGgsdC5wYXRoPVJlLHQucG9seWdvbkFyZWE9JGcsdC5wb2x5Z29uQ2VudHJvaWQ9WmcsdC5wb2x5Z29uSHVsbD1KZyx0LnBvbHlnb25Db250YWlucz1RZyx0LnBvbHlnb25MZW5ndGg9S2c7dC5xdWFkdHJlZT1ucjt0LnF1ZXVlPWZ1LHQucmFuZG9tVW5pZm9ybT1lbSx0LnJhbmRvbU5vcm1hbD1ybSx0LnJhbmRvbUxvZ05vcm1hbD1pbSx0LnJhbmRvbUJhdGVzPXVtLHQucmFuZG9tSXJ3aW5IYWxsPW9tLHQucmFuZG9tRXhwb25lbnRpYWw9YW0sdC5yZXF1ZXN0PWNtLHQuaHRtbD1mbSx0Lmpzb249bG0sdC50ZXh0PWhtLHQueG1sPXBtLHQuY3N2PXZtLHQudHN2PV9tLHQuc2NhbGVCYW5kPXZ1LHQuc2NhbGVQb2ludD15dSx0LnNjYWxlSWRlbnRpdHk9U3UsdC5zY2FsZUxpbmVhcj1rdSx0LnNjYWxlTG9nPXF1LHQuc2NhbGVPcmRpbmFsPWR1LHQuc2NhbGVJbXBsaWNpdD14bSx0LnNjYWxlUG93PVV1LHQuc2NhbGVTcXJ0PUR1LHQuc2NhbGVRdWFudGlsZT1PdSx0LnNjYWxlUXVhbnRpemU9RnUsdC5zY2FsZVRocmVzaG9sZD1JdSx0LnNjYWxlVGltZT1WeCx0LnNjYWxlVXRjPVd4LHQuc2NoZW1lQ2F0ZWdvcnkxMD1aeCx0LnNjaGVtZUNhdGVnb3J5MjBiPUd4LHQuc2NoZW1lQ2F0ZWdvcnkyMGM9SngsdC5zY2hlbWVDYXRlZ29yeTIwPVF4LHQuaW50ZXJwb2xhdGVDdWJlaGVsaXhEZWZhdWx0PUt4LHQuaW50ZXJwb2xhdGVSYWluYm93PXJiLHQuaW50ZXJwb2xhdGVXYXJtPXRiLHQuaW50ZXJwb2xhdGVDb29sPW5iLHQuaW50ZXJwb2xhdGVWaXJpZGlzPWliLHQuaW50ZXJwb2xhdGVNYWdtYT1vYix0LmludGVycG9sYXRlSW5mZXJubz11Yix0LmludGVycG9sYXRlUGxhc21hPWFiLHQuc2NhbGVTZXF1ZW50aWFsPSRhLHQuY3JlYXRvcj14Zix0LmxvY2FsPXgsdC5tYXRjaGVyPU5mLHQubW91c2U9emYsdC5uYW1lc3BhY2U9bWYsdC5uYW1lc3BhY2VzPWdmLHQuc2VsZWN0PXBsLHQuc2VsZWN0QWxsPWRsLHQuc2VsZWN0aW9uPWR0LHQuc2VsZWN0b3I9UGYsdC5zZWxlY3RvckFsbD1xZix0LnRvdWNoPXZsLHQudG91Y2hlcz1fbCx0LndpbmRvdz1LZix0LmN1c3RvbUV2ZW50PVMsdC5hcmM9cGIsdC5hcmVhPV9iLHQubGluZT12Yix0LnBpZT1tYix0LnJhZGlhbEFyZWE9d2IsdC5yYWRpYWxMaW5lPWJiLHQuc3ltYm9sPUJiLHQuc3ltYm9scz1ZYix0LnN5bWJvbENpcmNsZT1NYix0LnN5bWJvbENyb3NzPVRiLHQuc3ltYm9sRGlhbW9uZD1TYix0LnN5bWJvbFNxdWFyZT1SYix0LnN5bWJvbFN0YXI9UGIsdC5zeW1ib2xUcmlhbmdsZT1MYix0LnN5bWJvbFd5ZT1JYix0LmN1cnZlQmFzaXNDbG9zZWQ9WGIsdC5jdXJ2ZUJhc2lzT3Blbj1WYix0LmN1cnZlQmFzaXM9SGIsdC5jdXJ2ZUJ1bmRsZT1XYix0LmN1cnZlQ2FyZGluYWxDbG9zZWQ9WmIsdC5jdXJ2ZUNhcmRpbmFsT3Blbj1HYix0LmN1cnZlQ2FyZGluYWw9JGIsdC5jdXJ2ZUNhdG11bGxSb21DbG9zZWQ9UWIsdC5jdXJ2ZUNhdG11bGxSb21PcGVuPUtiLHQuY3VydmVDYXRtdWxsUm9tPUpiLHQuY3VydmVMaW5lYXJDbG9zZWQ9dHcsdC5jdXJ2ZUxpbmVhcj1kYix0LmN1cnZlTW9ub3RvbmVYPUNjLHQuY3VydmVNb25vdG9uZVk9emMsdC5jdXJ2ZU5hdHVyYWw9bncsdC5jdXJ2ZVN0ZXA9ZXcsdC5jdXJ2ZVN0ZXBBZnRlcj1VYyx0LmN1cnZlU3RlcEJlZm9yZT1MYyx0LnN0YWNrPXV3LHQuc3RhY2tPZmZzZXRFeHBhbmQ9YXcsdC5zdGFja09mZnNldE5vbmU9aXcsdC5zdGFja09mZnNldFNpbGhvdWV0dGU9Y3csdC5zdGFja09mZnNldFdpZ2dsZT1zdyx0LnN0YWNrT3JkZXJBc2NlbmRpbmc9ZncsdC5zdGFja09yZGVyRGVzY2VuZGluZz1sdyx0LnN0YWNrT3JkZXJJbnNpZGVPdXQ9aHcsdC5zdGFja09yZGVyTm9uZT1vdyx0LnN0YWNrT3JkZXJSZXZlcnNlPXB3LHQudGltZUludGVydmFsPVl1LHQudGltZU1pbGxpc2Vjb25kPUVtLHQudGltZU1pbGxpc2Vjb25kcz1BbSx0LnV0Y01pbGxpc2Vjb25kPUVtLHQudXRjTWlsbGlzZWNvbmRzPUFtLHQudGltZVNlY29uZD1MbSx0LnRpbWVTZWNvbmRzPVVtLHQudXRjU2Vjb25kPUxtLHQudXRjU2Vjb25kcz1VbSx0LnRpbWVNaW51dGU9RG0sdC50aW1lTWludXRlcz1PbSx0LnRpbWVIb3VyPUZtLHQudGltZUhvdXJzPUltLHQudGltZURheT1ZbSx0LnRpbWVEYXlzPUJtLHQudGltZVdlZWs9am0sdC50aW1lV2Vla3M9R20sdC50aW1lU3VuZGF5PWptLHQudGltZVN1bmRheXM9R20sdC50aW1lTW9uZGF5PUhtLHQudGltZU1vbmRheXM9Sm0sdC50aW1lVHVlc2RheT1YbSx0LnRpbWVUdWVzZGF5cz1RbSx0LnRpbWVXZWRuZXNkYXk9Vm0sdC50aW1lV2VkbmVzZGF5cz1LbSx0LnRpbWVUaHVyc2RheT1XbSx0LnRpbWVUaHVyc2RheXM9dHgsdC50aW1lRnJpZGF5PSRtLHQudGltZUZyaWRheXM9bngsdC50aW1lU2F0dXJkYXk9Wm0sdC50aW1lU2F0dXJkYXlzPWV4LHQudGltZU1vbnRoPXJ4LHQudGltZU1vbnRocz1peCx0LnRpbWVZZWFyPW94LHQudGltZVllYXJzPXV4LHQudXRjTWludXRlPWF4LHQudXRjTWludXRlcz1jeCx0LnV0Y0hvdXI9c3gsdC51dGNIb3Vycz1meCx0LnV0Y0RheT1seCx0LnV0Y0RheXM9aHgsdC51dGNXZWVrPXB4LHQudXRjV2Vla3M9eHgsdC51dGNTdW5kYXk9cHgsdC51dGNTdW5kYXlzPXh4LHQudXRjTW9uZGF5PWR4LHQudXRjTW9uZGF5cz1ieCx0LnV0Y1R1ZXNkYXk9dngsdC51dGNUdWVzZGF5cz13eCx0LnV0Y1dlZG5lc2RheT1feCx0LnV0Y1dlZG5lc2RheXM9TXgsdC51dGNUaHVyc2RheT15eCx0LnV0Y1RodXJzZGF5cz1UeCx0LnV0Y0ZyaWRheT1neCx0LnV0Y0ZyaWRheXM9TngsdC51dGNTYXR1cmRheT1teCx0LnV0Y1NhdHVyZGF5cz1reCx0LnV0Y01vbnRoPVN4LHQudXRjTW9udGhzPUV4LHQudXRjWWVhcj1BeCx0LnV0Y1llYXJzPXp4LHQudGltZUZvcm1hdERlZmF1bHRMb2NhbGU9WWEsdC50aW1lRm9ybWF0TG9jYWxlPVd1LHQuaXNvRm9ybWF0PUR4LHQuaXNvUGFyc2U9T3gsdC5ub3c9cG4sdC50aW1lcj1fbix0LnRpbWVyRmx1c2g9eW4sdC50aW1lb3V0PVdoLHQuaW50ZXJ2YWw9JGgsdC50cmFuc2l0aW9uPUtuLHQuYWN0aXZlPXJkLHQuaW50ZXJydXB0PW9wLHQudm9yb25vaT1Udyx0Lnpvb209RXcsdC56b29tVHJhbnNmb3JtPW1zLHQuem9vbUlkZW50aXR5PWt3LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0pOw=="></script> <script src="data:application/x-javascript;base64,ZDMuc2Fua2V5ID0gZnVuY3Rpb24oKSB7DQogIHZhciBzYW5rZXkgPSB7fSwNCiAgICAgIG5vZGVXaWR0aCA9IDI0LA0KICAgICAgbm9kZVBhZGRpbmcgPSA4LA0KICAgICAgc2l6ZSA9IFsxLCAxXSwNCiAgICAgIG5vZGVzID0gW10sDQogICAgICBsaW5rcyA9IFtdLA0KICAgICAgc2lua3NSaWdodCA9IHRydWU7DQoNCiAgc2Fua2V5Lm5vZGVXaWR0aCA9IGZ1bmN0aW9uKF8pIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBub2RlV2lkdGg7DQogICAgbm9kZVdpZHRoID0gK187DQogICAgcmV0dXJuIHNhbmtleTsNCiAgfTsNCg0KICBzYW5rZXkubm9kZVBhZGRpbmcgPSBmdW5jdGlvbihfKSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbm9kZVBhZGRpbmc7DQogICAgbm9kZVBhZGRpbmcgPSArXzsNCiAgICByZXR1cm4gc2Fua2V5Ow0KICB9Ow0KDQogIHNhbmtleS5ub2RlcyA9IGZ1bmN0aW9uKF8pIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBub2RlczsNCiAgICBub2RlcyA9IF87DQogICAgcmV0dXJuIHNhbmtleTsNCiAgfTsNCg0KICBzYW5rZXkubGlua3MgPSBmdW5jdGlvbihfKSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbGlua3M7DQogICAgbGlua3MgPSBfOw0KICAgIHJldHVybiBzYW5rZXk7DQogIH07DQoNCiAgc2Fua2V5LnNpemUgPSBmdW5jdGlvbihfKSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2l6ZTsNCiAgICBzaXplID0gXzsNCiAgICByZXR1cm4gc2Fua2V5Ow0KICB9Ow0KDQogc2Fua2V5LnNpbmtzUmlnaHQgPSBmdW5jdGlvbiAoXykgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNpbmtzUmlnaHQ7DQogICAgc2lua3NSaWdodCA9IF87DQogICAgcmV0dXJuIHNhbmtleTsNCiB9Ow0KDQogIHNhbmtleS5sYXlvdXQgPSBmdW5jdGlvbihpdGVyYXRpb25zKSB7DQogICAgY29tcHV0ZU5vZGVMaW5rcygpOw0KICAgIGNvbXB1dGVOb2RlVmFsdWVzKCk7DQogICAgY29tcHV0ZU5vZGVCcmVhZHRocygpOw0KICAgIGNvbXB1dGVOb2RlRGVwdGhzKGl0ZXJhdGlvbnMpOw0KICAgIHJldHVybiBzYW5rZXk7DQogIH07DQoNCiAgc2Fua2V5LnJlbGF5b3V0ID0gZnVuY3Rpb24oKSB7DQogICAgY29tcHV0ZUxpbmtEZXB0aHMoKTsNCiAgICByZXR1cm4gc2Fua2V5Ow0KICB9Ow0KDQogIC8vIFNWRyBwYXRoIGRhdGEgZ2VuZXJhdG9yLCB0byBiZSB1c2VkIGFzICJkIiBhdHRyaWJ1dGUgb24gInBhdGgiIGVsZW1lbnQgc2VsZWN0aW9uLg0KICBzYW5rZXkubGluayA9IGZ1bmN0aW9uKCkgew0KICAgIHZhciBjdXJ2YXR1cmUgPSAuNTsNCg0KICAgIGZ1bmN0aW9uIGxpbmsoZCkgew0KICAgICAgdmFyIHhzID0gZC5zb3VyY2UueCArIGQuc291cmNlLmR4LA0KICAgICAgICAgIHh0ID0gZC50YXJnZXQueCwNCiAgICAgICAgICB4aSA9IGQzLmludGVycG9sYXRlTnVtYmVyKHhzLCB4dCksDQogICAgICAgICAgeHNjID0geGkoY3VydmF0dXJlKSwNCiAgICAgICAgICB4dGMgPSB4aSgxIC0gY3VydmF0dXJlKSwNCiAgICAgICAgICB5cyA9IGQuc291cmNlLnkgKyBkLnN5ICsgZC5keSAvIDIsDQogICAgICAgICAgeXQgPSBkLnRhcmdldC55ICsgZC50eSArIGQuZHkgLyAyOw0KDQogICAgICBpZiAoIWQuY3ljbGVCcmVha2VyKSB7DQogICAgICAgIHJldHVybiAiTSIgKyB4cyArICIsIiArIHlzDQogICAgICAgICAgICAgKyAiQyIgKyB4c2MgKyAiLCIgKyB5cw0KICAgICAgICAgICAgICsgIiAiICsgeHRjICsgIiwiICsgeXQNCiAgICAgICAgICAgICArICIgIiArIHh0ICsgIiwiICsgeXQ7DQogICAgICB9IGVsc2Ugew0KICAgICAgICB2YXIgeGRlbHRhID0gKDEuNSAqIGQuZHkgKyAwLjA1ICogTWF0aC5hYnMoeHMgLSB4dCkpOw0KICAgICAgICB4c2MgPSB4cyArIHhkZWx0YTsNCiAgICAgICAgeHRjID0geHQgLSB4ZGVsdGE7DQogICAgICAgIHZhciB4bSA9IHhpKDAuNSk7DQogICAgICAgIHZhciB5bSA9IGQzLmludGVycG9sYXRlTnVtYmVyKHlzLCB5dCkoMC41KTsNCiAgICAgICAgdmFyIHlkZWx0YSA9ICgyICogZC5keSArIDAuMSAqIE1hdGguYWJzKHhzIC0geHQpICsgMC4xICogTWF0aC5hYnMoeXMgLSB5dCkpICogKHltIDwgKHNpemVbMV0gLyAyKSA/IC0xIDogMSk7DQogICAgICAgIHJldHVybiAiTSIgKyB4cyArICIsIiArIHlzDQogICAgICAgICAgICAgKyAiQyIgKyB4c2MgKyAiLCIgKyB5cw0KICAgICAgICAgICAgICsgIiAiICsgeHNjICsgIiwiICsgKHlzICsgeWRlbHRhKQ0KICAgICAgICAgICAgICsgIiAiICsgeG0gKyAiLCIgKyAoeW0gKyB5ZGVsdGEpDQogICAgICAgICAgICAgKyAiUyIgKyB4dGMgKyAiLCIgKyB5dA0KICAgICAgICAgICAgICsgIiAiICsgeHQgKyAiLCIgKyB5dDsNCg0KICAgICAgfQ0KICAgIH0NCg0KICAgIGxpbmsuY3VydmF0dXJlID0gZnVuY3Rpb24oXykgew0KICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY3VydmF0dXJlOw0KICAgICAgY3VydmF0dXJlID0gK187DQogICAgICByZXR1cm4gbGluazsNCiAgICB9Ow0KDQogICAgcmV0dXJuIGxpbms7DQogIH07DQoNCiAgLy8gUG9wdWxhdGUgdGhlIHNvdXJjZUxpbmtzIGFuZCB0YXJnZXRMaW5rcyBmb3IgZWFjaCBub2RlLg0KICAvLyBBbHNvLCBpZiB0aGUgc291cmNlIGFuZCB0YXJnZXQgYXJlIG5vdCBvYmplY3RzLCBhc3N1bWUgdGhleSBhcmUgaW5kaWNlcy4NCiAgZnVuY3Rpb24gY29tcHV0ZU5vZGVMaW5rcygpIHsNCiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUpIHsNCiAgICAgIC8vIExpbmtzIHRoYXQgaGF2ZSB0aGlzIG5vZGUgYXMgc291cmNlLg0KICAgICAgbm9kZS5zb3VyY2VMaW5rcyA9IFtdOw0KICAgICAgLy8gTGlua3MgdGhhdCBoYXZlIHRoaXMgbm9kZSBhcyB0YXJnZXQuDQogICAgICBub2RlLnRhcmdldExpbmtzID0gW107DQogICAgfSk7DQogICAgbGlua3MuZm9yRWFjaChmdW5jdGlvbihsaW5rKSB7DQogICAgICB2YXIgc291cmNlID0gbGluay5zb3VyY2UsDQogICAgICAgICAgdGFyZ2V0ID0gbGluay50YXJnZXQ7DQogICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gIm51bWJlciIpIHNvdXJjZSA9IGxpbmsuc291cmNlID0gbm9kZXNbbGluay5zb3VyY2VdOw0KICAgICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09ICJudW1iZXIiKSB0YXJnZXQgPSBsaW5rLnRhcmdldCA9IG5vZGVzW2xpbmsudGFyZ2V0XTsNCiAgICAgIHNvdXJjZS5zb3VyY2VMaW5rcy5wdXNoKGxpbmspOw0KICAgICAgdGFyZ2V0LnRhcmdldExpbmtzLnB1c2gobGluayk7DQogICAgfSk7DQogIH0NCg0KICAvLyBDb21wdXRlIHRoZSB2YWx1ZSAoc2l6ZSkgb2YgZWFjaCBub2RlIGJ5IHN1bW1pbmcgdGhlIGFzc29jaWF0ZWQgbGlua3MuDQogIGZ1bmN0aW9uIGNvbXB1dGVOb2RlVmFsdWVzKCkgew0KICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24obm9kZSkgew0KICAgICAgbm9kZS52YWx1ZSA9IE1hdGgubWF4KA0KICAgICAgICBkMy5zdW0obm9kZS5zb3VyY2VMaW5rcywgdmFsdWUpLA0KICAgICAgICBkMy5zdW0obm9kZS50YXJnZXRMaW5rcywgdmFsdWUpDQogICAgICApOw0KICAgIH0pOw0KICB9DQoNCiAgLy8gSXRlcmF0aXZlbHkgYXNzaWduIHRoZSBicmVhZHRoICh4LXBvc2l0aW9uKSBmb3IgZWFjaCBub2RlLg0KICAvLyBOb2RlcyBhcmUgYXNzaWduZWQgdGhlIG1heGltdW0gYnJlYWR0aCBvZiBpbmNvbWluZyBuZWlnaGJvcnMgcGx1cyBvbmU7DQogIC8vIG5vZGVzIHdpdGggbm8gaW5jb21pbmcgbGlua3MgYXJlIGFzc2lnbmVkIGJyZWFkdGggemVybywgd2hpbGUNCiAgLy8gbm9kZXMgd2l0aCBubyBvdXRnb2luZyBsaW5rcyBhcmUgYXNzaWduZWQgdGhlIG1heGltdW0gYnJlYWR0aC4NCiAgZnVuY3Rpb24gY29tcHV0ZU5vZGVCcmVhZHRocygpIHsNCiAgICB2YXIgcmVtYWluaW5nTm9kZXMgPSBub2RlcywNCiAgICAgICAgbmV4dE5vZGVzLA0KICAgICAgICB4ID0gMDsNCg0KICAgIC8vIFdvcmsgZnJvbSBsZWZ0IHRvIHJpZ2h0Lg0KICAgIC8vIEtlZXAgdXBkYXRpbmcgdGhlIGJyZWF0aCAoeC1wb3NpdGlvbikgb2Ygbm9kZXMgdGhhdCBhcmUgdGFyZ2V0IG9mIHJlY2VudGx5IHVwZGF0ZWQgbm9kZXMuDQogICAgd2hpbGUgKHJlbWFpbmluZ05vZGVzLmxlbmd0aCAmJiB4IDwgbm9kZXMubGVuZ3RoKSB7DQogICAgICBuZXh0Tm9kZXMgPSBbXTsNCiAgICAgIHJlbWFpbmluZ05vZGVzLmZvckVhY2goZnVuY3Rpb24obm9kZSkgew0KICAgICAgICBub2RlLnggPSB4Ow0KICAgICAgICBub2RlLmR4ID0gbm9kZVdpZHRoOw0KICAgICAgICBub2RlLnNvdXJjZUxpbmtzLmZvckVhY2goZnVuY3Rpb24obGluaykgew0KICAgICAgICAgIGlmIChuZXh0Tm9kZXMuaW5kZXhPZihsaW5rLnRhcmdldCkgPCAwICYmICFsaW5rLmN5Y2xlQnJlYWtlcikgew0KICAgICAgICAgICAgbmV4dE5vZGVzLnB1c2gobGluay50YXJnZXQpOw0KICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgICB9KTsNCiAgICAgIGlmIChuZXh0Tm9kZXMubGVuZ3RoID09IHJlbWFpbmluZ05vZGVzLmxlbmd0aCkgew0KICAgICAgICAvLyBUaGVyZSBtdXN0IGJlIGEgY3ljbGUgaGVyZS4gTGV0J3Mgc2VhcmNoIGZvciBhIGxpbmsgdGhhdCBicmVha3MgaXQuDQogICAgICAgIGZpbmRBbmRNYXJrQ3ljbGVCcmVha2VyKG5leHROb2Rlcyk7DQogICAgICAgIC8vIFN0YXJ0IG92ZXIuDQogICAgICAgIC8vIFRPRE86IG1ha2UgdGhpcyBvcHRpb25hbD8NCiAgICAgICAgcmV0dXJuIGNvbXB1dGVOb2RlQnJlYWR0aHMoKTsNCiAgICAgIH0NCiAgICAgIGVsc2Ugew0KICAgICAgICByZW1haW5pbmdOb2RlcyA9IG5leHROb2RlczsNCiAgICAgICAgKyt4Ow0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIE9wdGlvbmFsbHkgbW92ZSBwdXJlIHNpbmtzIGFsd2F5cyB0byB0aGUgcmlnaHQsIGFuZCBzY2FsZSBub2RlIGJyZWFkdGhzDQogICAgaWYgKHNpbmtzUmlnaHQpIHsNCiAgICAgIG1vdmVTaW5rc1JpZ2h0KHgpOw0KICAgICAgc2NhbGVOb2RlQnJlYWR0aHMoKHNpemVbMF0gLSBub2RlV2lkdGgpIC8gKHggLSAxKSk7DQogICAgfSBlbHNlIHsNCiAgICAgIHNjYWxlTm9kZUJyZWFkdGhzKChzaXplWzBdIC0gbm9kZVdpZHRoKSAvIHgpOw0KICAgIH0NCg0KICAgIA0KICB9DQoNCiAgLy8gRmluZCBhIGxpbmsgdGhhdCBicmVha3MgYSBjeWNsZSBpbiB0aGUgZ3JhcGggKGlmIGFueSkuDQogIGZ1bmN0aW9uIGZpbmRBbmRNYXJrQ3ljbGVCcmVha2VyKG5vZGVzKSB7DQogIC8vIEdvIHRocm91Z2ggYWxsIG5vZGVzIGZyb20gdGhlIGdpdmVuIHN1YnNldCBhbmQgdHJhdmVyc2UgbGlua3Mgc2VhcmNoaW5nIGZvciBjeWNsZXMuDQogICAgdmFyIGxpbms7DQogICAgZm9yICh2YXIgbj1ub2Rlcy5sZW5ndGggLSAxOyBuID49IDA7IG4tLSkgew0KICAgICAgbGluayA9IGRlcHRoRmlyc3RDeWNsZVNlYXJjaChub2Rlc1tuXSwgW10pOw0KICAgICAgaWYgKGxpbmspIHsNCiAgICAgICAgcmV0dXJuIGxpbms7DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gRGVwdGgtZmlyc3Qgc2VhcmNoIHRvIGZpbmQgYSBsaW5rIHRoYXQgaXMgcGFydCBvZiBhIGN5Y2xlLg0KICAgIGZ1bmN0aW9uIGRlcHRoRmlyc3RDeWNsZVNlYXJjaChjdXJzb3JOb2RlLCBwYXRoKSB7DQogICAgICB2YXIgdGFyZ2V0LCBsaW5rOw0KICAgICAgZm9yICh2YXIgbiA9IGN1cnNvck5vZGUuc291cmNlTGlua3MubGVuZ3RoIC0gMTsgbiA+PSAwOyBuLS0pIHsNCiAgICAgICAgbGluayA9IGN1cnNvck5vZGUuc291cmNlTGlua3Nbbl07DQogICAgICAgIGlmIChsaW5rLmN5Y2xlQnJlYWtlcikgew0KICAgICAgICAgIC8vIFNraXAgYWxyZWFkeSBrbm93biBjeWNsZSBicmVha2Vycy4NCiAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIENoZWNrIGlmIHRhcmdldCBvZiBsaW5rIG1ha2VzIGEgY3ljbGUgaW4gY3VycmVudCBwYXRoLg0KICAgICAgICB0YXJnZXQgPSBsaW5rLnRhcmdldDsNCiAgICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPCBwYXRoLmxlbmd0aDsgbCsrKSB7DQogICAgICAgICAgaWYgKHBhdGhbbF0uc291cmNlID09IHRhcmdldCkgew0KICAgICAgICAgICAgLy8gV2UgZm91bmQgYSBjeWNsZS4gU2VhcmNoIGZvciB3ZWFrZXN0IGxpbmsgaW4gY3ljbGUNCiAgICAgICAgICAgIHZhciB3ZWFrZXN0ID0gbGluazsNCiAgICAgICAgICAgIGZvciAoOyBsIDwgcGF0aC5sZW5ndGg7IGwrKykgew0KICAgICAgICAgICAgICBpZiAocGF0aFtsXS52YWx1ZSA8IHdlYWtlc3QudmFsdWUpIHsNCiAgICAgICAgICAgICAgICB3ZWFrZXN0ID0gcGF0aFtsXTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gTWFyayB3ZWFrZXN0IGxpbmsgYXMgKGtub3duKSBjeWNsZSBicmVha2VyIGFuZCBhYm9ydCBzZWFyY2guDQogICAgICAgICAgICB3ZWFrZXN0LmN5Y2xlQnJlYWtlciA9IHRydWU7DQogICAgICAgICAgICByZXR1cm4gd2Vha2VzdDsNCiAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAvLyBSZWN1cnNlIGRlZXBlci4NCiAgICAgICAgcGF0aC5wdXNoKGxpbmspOw0KICAgICAgICBsaW5rID0gZGVwdGhGaXJzdEN5Y2xlU2VhcmNoKHRhcmdldCwgcGF0aCk7DQogICAgICAgIHBhdGgucG9wKCk7DQogICAgICAgIC8vIFN0b3AgZnVydGhlciBzZWFyY2ggaWYgd2UgZm91bmQgYSBjeWNsZSBicmVha2VyLg0KICAgICAgICBpZiAobGluaykgew0KICAgICAgICAgIHJldHVybiBsaW5rOw0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICB9DQoNCg0KICBmdW5jdGlvbiBtb3ZlU291cmNlc1JpZ2h0KCkgew0KICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24obm9kZSkgew0KICAgICAgaWYgKCFub2RlLnRhcmdldExpbmtzLmxlbmd0aCkgew0KICAgICAgICBub2RlLnggPSBkMy5taW4obm9kZS5zb3VyY2VMaW5rcywgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC50YXJnZXQueDsgfSkgLSAxOw0KICAgICAgfQ0KICAgIH0pOw0KICB9DQoNCiAgZnVuY3Rpb24gbW92ZVNpbmtzUmlnaHQoeCkgew0KICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24obm9kZSkgew0KICAgICAgaWYgKCFub2RlLnNvdXJjZUxpbmtzLmxlbmd0aCkgew0KICAgICAgICBub2RlLnggPSB4IC0gMTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIC8vbW92ZSBub2RlIHRvIHNlY29uZCBmcm9tIHJpZ2h0IA0KICAgICAgICB2YXIgbm9kZXNfdG9fcmlnaHQgPSAwOw0KICAgICAgICBub2RlLnNvdXJjZUxpbmtzLmZvckVhY2goZnVuY3Rpb24obikgew0KICAgICAgICAgIG5vZGVzX3RvX3JpZ2h0ID0gTWF0aC5tYXgobm9kZXNfdG9fcmlnaHQsbi50YXJnZXQuc291cmNlTGlua3MubGVuZ3RoKQ0KICAgICAgICAgIC8vY29uc29sZS5sb2cobm9kZS5uYW1lLG4pDQogICAgICAgIH0pDQogICAgICAgICAvL2NvbnNvbGUubG9nKG5vZGUubmFtZSxub2Rlc190b19yaWdodCkNCiAgICAgICAgIGlmIChub2Rlc190b19yaWdodD09MClub2RlLnggPSB4IC0gMjsNCiAgICAgIH0NCiAgICAgIA0KICAgIH0pOw0KICB9DQoNCiAgZnVuY3Rpb24gc2NhbGVOb2RlQnJlYWR0aHMoa3gpIHsNCiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUpIHsNCiAgICAgIG5vZGUueCAqPSBreDsNCiAgICB9KTsNCiAgfQ0KDQogIC8vIENvbXB1dGUgdGhlIGRlcHRoICh5LXBvc2l0aW9uKSBmb3IgZWFjaCBub2RlLg0KICBmdW5jdGlvbiBjb21wdXRlTm9kZURlcHRocyhpdGVyYXRpb25zKSB7DQogICAgLy8gR3JvdXAgbm9kZXMgYnkgYnJlYXRoLg0KICAgIHZhciBub2Rlc0J5QnJlYWR0aCA9IGQzLm5lc3QoKQ0KICAgICAgICAua2V5KGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQueDsgfSkNCiAgICAgICAgLnNvcnRLZXlzKGQzLmFzY2VuZGluZykNCiAgICAgICAgLmVudHJpZXMobm9kZXMpDQogICAgICAgIC5tYXAoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC52YWx1ZXM7IH0pOw0KDQogICAgLy8NCiAgICBpbml0aWFsaXplTm9kZURlcHRoKCk7DQogICAgcmVzb2x2ZUNvbGxpc2lvbnMoKTsNCiAgICBjb21wdXRlTGlua0RlcHRocygpOw0KICAgIGZvciAodmFyIGFscGhhID0gMTsgaXRlcmF0aW9ucyA+IDA7IC0taXRlcmF0aW9ucykgew0KICAgICAgcmVsYXhSaWdodFRvTGVmdChhbHBoYSAqPSAuOTkpOw0KICAgICAgcmVzb2x2ZUNvbGxpc2lvbnMoKTsNCiAgICAgIGNvbXB1dGVMaW5rRGVwdGhzKCk7DQogICAgICByZWxheExlZnRUb1JpZ2h0KGFscGhhKTsNCiAgICAgIHJlc29sdmVDb2xsaXNpb25zKCk7DQogICAgICBjb21wdXRlTGlua0RlcHRocygpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGluaXRpYWxpemVOb2RlRGVwdGgoKSB7DQogICAgICAvLyBDYWxjdWxhdGUgdmVydGljYWwgc2NhbGluZyBmYWN0b3IuDQogICAgICB2YXIga3kgPSBkMy5taW4obm9kZXNCeUJyZWFkdGgsIGZ1bmN0aW9uKG5vZGVzKSB7DQogICAgICAgIHJldHVybiAoc2l6ZVsxXSAtIChub2Rlcy5sZW5ndGggLSAxKSAqIG5vZGVQYWRkaW5nKSAvIGQzLnN1bShub2RlcywgdmFsdWUpOw0KICAgICAgfSk7DQoNCiAgICAgIG5vZGVzQnlCcmVhZHRoLmZvckVhY2goZnVuY3Rpb24obm9kZXMpIHsNCiAgICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihub2RlLCBpKSB7DQogICAgICAgICAgbm9kZS55ID0gaTsNCiAgICAgICAgICBub2RlLmR5ID0gbm9kZS52YWx1ZSAqIGt5Ow0KICAgICAgICB9KTsNCiAgICAgIH0pOw0KDQogICAgICBsaW5rcy5mb3JFYWNoKGZ1bmN0aW9uKGxpbmspIHsNCiAgICAgICAgbGluay5keSA9IGxpbmsudmFsdWUgKiBreTsNCiAgICAgIH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHJlbGF4TGVmdFRvUmlnaHQoYWxwaGEpIHsNCiAgICAgIG5vZGVzQnlCcmVhZHRoLmZvckVhY2goZnVuY3Rpb24obm9kZXMsIGJyZWFkdGgpIHsNCiAgICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihub2RlKSB7DQogICAgICAgICAgaWYgKG5vZGUudGFyZ2V0TGlua3MubGVuZ3RoKSB7DQogICAgICAgICAgICAvLyBWYWx1ZS13ZWlnaHRlZCBhdmVyYWdlIG9mIHRoZSB5LXBvc2l0aW9uIG9mIHNvdXJjZSBub2RlIGNlbnRlcnMgbGlua2VkIHRvIHRoaXMgbm9kZS4NCiAgICAgICAgICAgIHZhciB5ID0gZDMuc3VtKG5vZGUudGFyZ2V0TGlua3MsIHdlaWdodGVkU291cmNlKSAvIGQzLnN1bShub2RlLnRhcmdldExpbmtzLCB2YWx1ZSk7DQogICAgICAgICAgICBub2RlLnkgKz0gKHkgLSBjZW50ZXIobm9kZSkpICogYWxwaGE7DQogICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgIH0pOw0KDQogICAgICBmdW5jdGlvbiB3ZWlnaHRlZFNvdXJjZShsaW5rKSB7DQogICAgICAgIHJldHVybiAobGluay5zb3VyY2UueSArIGxpbmsuc3kgKyBsaW5rLmR5IC8gMikgKiBsaW5rLnZhbHVlOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHJlbGF4UmlnaHRUb0xlZnQoYWxwaGEpIHsNCiAgICAgIG5vZGVzQnlCcmVhZHRoLnNsaWNlKCkucmV2ZXJzZSgpLmZvckVhY2goZnVuY3Rpb24obm9kZXMpIHsNCiAgICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihub2RlKSB7DQogICAgICAgICAgaWYgKG5vZGUuc291cmNlTGlua3MubGVuZ3RoKSB7DQogICAgICAgICAgICAvLyBWYWx1ZS13ZWlnaHRlZCBhdmVyYWdlIG9mIHRoZSB5LXBvc2l0aW9ucyBvZiB0YXJnZXQgbm9kZXMgbGlua2VkIHRvIHRoaXMgbm9kZS4NCiAgICAgICAgICAgIHZhciB5ID0gZDMuc3VtKG5vZGUuc291cmNlTGlua3MsIHdlaWdodGVkVGFyZ2V0KSAvIGQzLnN1bShub2RlLnNvdXJjZUxpbmtzLCB2YWx1ZSk7DQogICAgICAgICAgICBub2RlLnkgKz0gKHkgLSBjZW50ZXIobm9kZSkpICogYWxwaGE7DQogICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgIH0pOw0KDQogICAgICBmdW5jdGlvbiB3ZWlnaHRlZFRhcmdldChsaW5rKSB7DQogICAgICAgIHJldHVybiAobGluay50YXJnZXQueSArIGxpbmsudHkgKyBsaW5rLmR5IC8gMikgKiBsaW5rLnZhbHVlOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHJlc29sdmVDb2xsaXNpb25zKCkgew0KICAgICAgbm9kZXNCeUJyZWFkdGguZm9yRWFjaChmdW5jdGlvbihub2Rlcykgew0KICAgICAgICB2YXIgbm9kZSwNCiAgICAgICAgICAgIGR5LA0KICAgICAgICAgICAgeTAgPSAwLA0KICAgICAgICAgICAgbiA9IG5vZGVzLmxlbmd0aCwNCiAgICAgICAgICAgIGk7DQoNCiAgICAgICAgLy8gUHVzaCBhbnkgb3ZlcmxhcHBpbmcgbm9kZXMgZG93bi4NCiAgICAgICAgbm9kZXMuc29ydChhc2NlbmRpbmdEZXB0aCk7DQogICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsNCiAgICAgICAgICBub2RlID0gbm9kZXNbaV07DQogICAgICAgICAgZHkgPSB5MCAtIG5vZGUueTsNCiAgICAgICAgICBpZiAoZHkgPiAwKSBub2RlLnkgKz0gZHk7DQogICAgICAgICAgeTAgPSBub2RlLnkgKyBub2RlLmR5ICsgbm9kZVBhZGRpbmc7DQogICAgICAgIH0NCg0KICAgICAgICAvLyBJZiB0aGUgYm90dG9tbW9zdCBub2RlIGdvZXMgb3V0c2lkZSB0aGUgYm91bmRzLCBwdXNoIGl0IGJhY2sgdXAuDQogICAgICAgIGR5ID0geTAgLSBub2RlUGFkZGluZyAtIHNpemVbMV07DQogICAgICAgIGlmIChkeSA+IDApIHsNCiAgICAgICAgICB5MCA9IG5vZGUueSAtPSBkeTsNCg0KICAgICAgICAgIC8vIFB1c2ggYW55IG92ZXJsYXBwaW5nIG5vZGVzIGJhY2sgdXAuDQogICAgICAgICAgZm9yIChpID0gbiAtIDI7IGkgPj0gMDsgLS1pKSB7DQogICAgICAgICAgICBub2RlID0gbm9kZXNbaV07DQogICAgICAgICAgICBkeSA9IG5vZGUueSArIG5vZGUuZHkgKyBub2RlUGFkZGluZyAtIHkwOw0KICAgICAgICAgICAgaWYgKGR5ID4gMCkgbm9kZS55IC09IGR5Ow0KICAgICAgICAgICAgeTAgPSBub2RlLnk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBhc2NlbmRpbmdEZXB0aChhLCBiKSB7DQogICAgICByZXR1cm4gYS55IC0gYi55Ow0KICAgIH0NCiAgfQ0KDQogIC8vIENvbXB1dGUgeS1vZmZzZXQgb2YgdGhlIHNvdXJjZSBlbmRwb2ludCAoc3kpIGFuZCB0YXJnZXQgZW5kcG9pbnRzICh0eSkgb2YgbGlua3MsDQogIC8vIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UvdGFyZ2V0IG5vZGUncyB5LXBvc2l0aW9uLg0KICBmdW5jdGlvbiBjb21wdXRlTGlua0RlcHRocygpIHsNCiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUpIHsNCiAgICAgIG5vZGUuc291cmNlTGlua3Muc29ydChhc2NlbmRpbmdUYXJnZXREZXB0aCk7DQogICAgICBub2RlLnRhcmdldExpbmtzLnNvcnQoYXNjZW5kaW5nU291cmNlRGVwdGgpOw0KICAgIH0pOw0KICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24obm9kZSkgew0KICAgICAgdmFyIHN5ID0gMCwgdHkgPSAwOw0KICAgICAgbm9kZS5zb3VyY2VMaW5rcy5mb3JFYWNoKGZ1bmN0aW9uKGxpbmspIHsNCiAgICAgICAgbGluay5zeSA9IHN5Ow0KICAgICAgICBzeSArPSBsaW5rLmR5Ow0KICAgICAgfSk7DQogICAgICBub2RlLnRhcmdldExpbmtzLmZvckVhY2goZnVuY3Rpb24obGluaykgew0KICAgICAgICBsaW5rLnR5ID0gdHk7DQogICAgICAgIHR5ICs9IGxpbmsuZHk7DQogICAgICB9KTsNCiAgICB9KTsNCg0KICAgIGZ1bmN0aW9uIGFzY2VuZGluZ1NvdXJjZURlcHRoKGEsIGIpIHsNCiAgICAgIHJldHVybiBhLnNvdXJjZS55IC0gYi5zb3VyY2UueTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBhc2NlbmRpbmdUYXJnZXREZXB0aChhLCBiKSB7DQogICAgICByZXR1cm4gYS50YXJnZXQueSAtIGIudGFyZ2V0Lnk7DQogICAgfQ0KICB9DQoNCiAgLy8gWS1wb3NpdGlvbiBvZiB0aGUgbWlkZGxlIG9mIGEgbm9kZS4NCiAgZnVuY3Rpb24gY2VudGVyKG5vZGUpIHsNCiAgICByZXR1cm4gbm9kZS55ICsgbm9kZS5keSAvIDI7DQogIH0NCg0KICAvLyBWYWx1ZSBwcm9wZXJ0eSBhY2Nlc3Nvci4NCiAgZnVuY3Rpb24gdmFsdWUoeCkgew0KICAgIHJldHVybiB4LnZhbHVlOw0KICB9DQoNCiAgcmV0dXJuIHNhbmtleTsNCn07"></script> <script src="data:application/x-javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsNCg0KICAgIG5hbWU6ICJzYW5rZXlOZXR3b3JrIiwNCg0KICAgIHR5cGU6ICJvdXRwdXQiLA0KDQogICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsNCg0KICAgICAgICBkMy5zZWxlY3QoZWwpLmFwcGVuZCgic3ZnIikNCiAgICAgICAgICAgIC5zdHlsZSgid2lkdGgiLCAiMTAwJSIpDQogICAgICAgICAgICAuc3R5bGUoImhlaWdodCIsICIxMDAlIik7DQoNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICBzYW5rZXk6IGQzLnNhbmtleSgpLA0KICAgICAgICAgIHg6IG51bGwNCiAgICAgICAgfTsNCiAgICB9LA0KDQogICAgcmVzaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCwgaW5zdGFuY2UpIHsNCiAgICAgICAgLyogIGhhbmRsZSByZXNpemluZyBub3cgdGhyb3VnaCB0aGUgdmlld0JveA0KICAgICAgICBkMy5zZWxlY3QoZWwpLnNlbGVjdCgic3ZnIikNCiAgICAgICAgICAgIC5hdHRyKCJ3aWR0aCIsIHdpZHRoKQ0KICAgICAgICAgICAgLmF0dHIoImhlaWdodCIsIGhlaWdodCArIGhlaWdodCAqIDAuMDUpOw0KDQogICAgICAgIHRoaXMucmVuZGVyVmFsdWUoZWwsIGluc3RhbmNlLngsIGluc3RhbmNlKTsNCiAgICAgICAgKi8NCiAgICAgICAgDQogICAgICAgIC8vIHdpdGggZmxleGRhc2hib2FyZCBhbmQgc2xpZGVzDQogICAgICAgIC8vICAgc2Fua2V5IG1pZ2h0IGJlIGhpZGRlbiBzbyBoZWlnaHQgYW5kIHdpZHRoIDANCiAgICAgICAgLy8gICBpbiB0aGlzIGluc3RhbmNlIHJlLXJlbmRlciBvbiByZXNpemUNCiAgICAgICAgaWYoIGQzLm1pbihpbnN0YW5jZS5zYW5rZXkuc2l6ZSgpKSA8PSAwICkgew0KICAgICAgICAgIHRoaXMucmVuZGVyVmFsdWUoZWwsIGluc3RhbmNlLngsIGluc3RhbmNlKTsNCiAgICAgICAgfQ0KICAgIH0sDQoNCiAgICByZW5kZXJWYWx1ZTogZnVuY3Rpb24oZWwsIHgsIGluc3RhbmNlKSB7DQoNCiAgICAgICAgLy8gc2F2ZSB0aGUgeCBpbiBvdXIgaW5zdGFuY2UgKGZvciBjYWxsaW5nIGJhY2sgZnJvbSByZXNpemUpDQogICAgICAgIGluc3RhbmNlLnggPSB4Ow0KDQogICAgICAgIC8vIGFsaWFzIHNhbmtleSBhbmQgb3B0aW9ucw0KICAgICAgICB2YXIgc2Fua2V5ID0gaW5zdGFuY2Uuc2Fua2V5Ow0KICAgICAgICB2YXIgb3B0aW9ucyA9IHgub3B0aW9uczsNCg0KICAgICAgICAvLyBjb252ZXJ0IGxpbmtzIGFuZCBub2RlcyBkYXRhIGZyYW1lcyB0byBkMyBmcmllbmRseSBmb3JtYXQNCiAgICAgICAgdmFyIGxpbmtzID0gSFRNTFdpZGdldHMuZGF0YWZyYW1lVG9EMyh4LmxpbmtzKTsNCiAgICAgICAgdmFyIG5vZGVzID0gSFRNTFdpZGdldHMuZGF0YWZyYW1lVG9EMyh4Lm5vZGVzKTsNCg0KDQogICAgICAgIC8vIG1hcmdpbiBoYW5kbGluZw0KICAgICAgICAvLyAgIHNldCBvdXIgZGVmYXVsdCBtYXJnaW4gdG8gYmUgMjANCiAgICAgICAgLy8gICB3aWxsIG92ZXJyaWRlIHdpdGggeC5vcHRpb25zLm1hcmdpbiBpZiBwcm92aWRlZA0KICAgICAgICB2YXIgbWFyZ2luID0ge3RvcDogMjAsIHJpZ2h0OiAyMCwgYm90dG9tOiAyMCwgbGVmdDogMjB9Ow0KICAgICAgICAvLyAgIGdvIHRocm91Z2ggZWFjaCBrZXkgb2YgeC5vcHRpb25zLm1hcmdpbg0KICAgICAgICAvLyAgIHVzZSB0aGlzIHZhbHVlIGlmIHByb3ZpZGVkIGZyb20gdGhlIFIgc2lkZQ0KICAgICAgICBPYmplY3Qua2V5cyh4Lm9wdGlvbnMubWFyZ2luKS5tYXAoZnVuY3Rpb24oa3kpew0KICAgICAgICAgIGlmKHgub3B0aW9ucy5tYXJnaW5ba3ldICE9PSBudWxsKSB7DQogICAgICAgICAgICBtYXJnaW5ba3ldID0geC5vcHRpb25zLm1hcmdpbltreV07DQogICAgICAgICAgfQ0KICAgICAgICAgIC8vIHNldCB0aGUgbWFyZ2luIG9uIHRoZSBzdmcgd2l0aCBjc3Mgc3R5bGUNCiAgICAgICAgICAvLyBjb21tZW50aW5nIHRoaXMgb3V0IHNpbmNlIG5vdCBjb3JyZWN0DQogICAgICAgICAgLy8gcy5zdHlsZShbIm1hcmdpbiIsa3ldLmpvaW4oIi0iKSwgbWFyZ2luW2t5XSk7DQogICAgICAgIH0pOw0KDQogICAgICAgIC8vIGdldCB0aGUgd2lkdGggYW5kIGhlaWdodA0KICAgICAgICB2YXIgd2lkdGggPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAtIG1hcmdpbi5yaWdodCAtIG1hcmdpbi5sZWZ0Ow0KICAgICAgICB2YXIgaGVpZ2h0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0IC0gbWFyZ2luLnRvcCAtIG1hcmdpbi5ib3R0b207DQoNCiAgICAgICAgdmFyIGNvbG9yID0gZXZhbChvcHRpb25zLmNvbG91clNjYWxlKTsNCg0KICAgICAgICB2YXIgY29sb3Jfbm9kZSA9IGZ1bmN0aW9uIGNvbG9yX25vZGUoZCl7DQogICAgICAgICAgaWYgKGQuZ3JvdXApew0KICAgICAgICAgICAgcmV0dXJuIGNvbG9yKGQuZ3JvdXAucmVwbGFjZSgvIC4qLywgIiIpKTsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuICIjY2NjY2NjIjsNCiAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgY29sb3JfbGluayA9IGZ1bmN0aW9uIGNvbG9yX2xpbmsoZCl7DQogICAgICAgICAgaWYgKGQuZ3JvdXApew0KICAgICAgICAgICAgcmV0dXJuIGNvbG9yKGQuZ3JvdXAucmVwbGFjZSgvIC4qLywgIiIpKTsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuICIjMDAwMDAwIjsNCiAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgb3BhY2l0eV9saW5rID0gZnVuY3Rpb24gb3BhY2l0eV9saW5rKGQpew0KICAgICAgICAgIGlmIChkLmdyb3VwKXsNCiAgICAgICAgICAgIHJldHVybiAwLjc7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiAwLjI7DQogICAgICAgICAgfQ0KICAgICAgICB9DQoNCg0KICAgICAgICB2YXIgZm9ybWF0TnVtYmVyID0gZDMuZm9ybWF0KCIsLjBmIiksDQogICAgICAgIGZvcm1hdCA9IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGZvcm1hdE51bWJlcihkKTsgfQ0KDQogICAgICAgIC8vIGNyZWF0ZSBkMyBzYW5rZXkgbGF5b3V0DQogICAgICAgIHNhbmtleQ0KICAgICAgICAgICAgLm5vZGVzKG5vZGVzKQ0KICAgICAgICAgICAgLmxpbmtzKGxpbmtzKQ0KICAgICAgICAgICAgLnNpemUoW3dpZHRoLCBoZWlnaHRdKQ0KICAgICAgICAgICAgLm5vZGVXaWR0aChvcHRpb25zLm5vZGVXaWR0aCkNCiAgICAgICAgICAgIC5ub2RlUGFkZGluZyhvcHRpb25zLm5vZGVQYWRkaW5nKQ0KICAgICAgICAgICAgLnNpbmtzUmlnaHQob3B0aW9ucy5zaW5rc1JpZ2h0KQ0KICAgICAgICAgICAgLmxheW91dChvcHRpb25zLml0ZXJhdGlvbnMpOw0KDQogICAgICAgIC8vIHNlbGVjdCB0aGUgc3ZnIGVsZW1lbnQgYW5kIHJlbW92ZSBleGlzdGluZyBjaGlsZHJlbg0KICAgICAgICBkMy5zZWxlY3QoZWwpLnNlbGVjdCgic3ZnIikuc2VsZWN0QWxsKCIqIikucmVtb3ZlKCk7DQogICAgICAgIC8vIHJlbW92ZSBhbnkgcHJldmlvdXNseSBzZXQgdmlld0JveCBhdHRyaWJ1dGUNCiAgICAgICAgZDMuc2VsZWN0KGVsKS5zZWxlY3QoInN2ZyIpLmF0dHIoInZpZXdCb3giLCBudWxsKTsNCiAgICAgICAgLy8gYXBwZW5kIGcgZm9yIG91ciBjb250YWluZXIgdG8gdHJhbnNmb3JtIGJ5IG1hcmdpbg0KICAgICAgICB2YXIgc3ZnID0gZDMuc2VsZWN0KGVsKS5zZWxlY3QoInN2ZyIpLmFwcGVuZCgiZyIpDQogICAgICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgiICsgbWFyZ2luLmxlZnQgKyAiLCIgKyBtYXJnaW4udG9wICsgIikiKTsNCg0KICAgICAgICAvLyBkcmF3IHBhdGgNCiAgICAgICAgdmFyIHBhdGggPSBzYW5rZXkubGluaygpOw0KDQogICAgICAgIC8vIGRyYXcgbGlua3MNCiAgICAgICAgdmFyIGxpbmsgPSBzdmcuc2VsZWN0QWxsKCIubGluayIpDQogICAgICAgICAgICAuZGF0YShsaW5rcykNCiAgICAgICAgICAgIC5lbnRlcigpLmFwcGVuZCgicGF0aCIpDQogICAgICAgICAgICAuYXR0cigiY2xhc3MiLCAibGluayIpDQogICAgICAgICAgICAuYXR0cigiZCIsIHBhdGgpDQogICAgICAgICAgICAuc3R5bGUoInN0cm9rZS13aWR0aCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIE1hdGgubWF4KDEsIGQuZHkpOyB9KQ0KICAgICAgICAgICAgLnN0eWxlKCJmaWxsIiwgIm5vbmUiKQ0KICAgICAgICAgICAgLnN0eWxlKCJzdHJva2UiLCBjb2xvcl9saW5rKQ0KICAgICAgICAgICAgLnN0eWxlKCJzdHJva2Utb3BhY2l0eSIsIG9wYWNpdHlfbGluaykNCiAgICAgICAgICAgIC5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIGIuZHkgLSBhLmR5OyB9KQ0KICAgICAgICAgICAgLm9uKCJtb3VzZW92ZXIiLCBmdW5jdGlvbihkKSB7DQogICAgICAgICAgICAgICAgZDMuc2VsZWN0KHRoaXMpDQogICAgICAgICAgICAgICAgLnN0eWxlKCJzdHJva2Utb3BhY2l0eSIsIGZ1bmN0aW9uKGQpe3JldHVybiBvcGFjaXR5X2xpbmsoZCkgKyAwLjN9KTsNCiAgICAgICAgICAgIH0pDQogICAgICAgICAgICAub24oIm1vdXNlb3V0IiwgZnVuY3Rpb24oZCkgew0KICAgICAgICAgICAgICAgIGQzLnNlbGVjdCh0aGlzKQ0KICAgICAgICAgICAgICAgIC5zdHlsZSgic3Ryb2tlLW9wYWNpdHkiLCBvcGFjaXR5X2xpbmspOw0KICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgLy8gYWRkIGJhY2t3YXJkcyBjbGFzcyB0byBjeWNsZXMNCiAgICAgICAgbGluay5jbGFzc2VkKCdiYWNrd2FyZHMnLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC50YXJnZXQueCA8IGQuc291cmNlLng7IH0pOw0KDQogICAgICAgIHN2Zy5zZWxlY3RBbGwoIi5saW5rLmJhY2t3YXJkcyIpDQogICAgICAgICAgICAuc3R5bGUoInN0cm9rZS1kYXNoYXJyYXkiLCI5LDEiKQ0KICAgICAgICAgICAgLnN0eWxlKCJzdHJva2UiLCIjNDAyIikNCg0KICAgICAgICAvLyBkcmF3IG5vZGVzDQogICAgICAgIHZhciBub2RlID0gc3ZnLnNlbGVjdEFsbCgiLm5vZGUiKQ0KICAgICAgICAgICAgLmRhdGEobm9kZXMpDQogICAgICAgICAgICAuZW50ZXIoKS5hcHBlbmQoImciKQ0KICAgICAgICAgICAgLmF0dHIoImNsYXNzIiwgIm5vZGUiKQ0KICAgICAgICAgICAgLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuICJ0cmFuc2xhdGUoIiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQueCArICIsIiArIGQueSArICIpIjsgfSkNCiAgICAgICAgICAgIC5jYWxsKGQzLmRyYWcoKQ0KICAgICAgICAgICAgLnN1YmplY3QoZnVuY3Rpb24oZCkgeyByZXR1cm4gZDsgfSkNCiAgICAgICAgICAgIC5vbigic3RhcnQiLCBmdW5jdGlvbigpIHsgdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpOyB9KQ0KICAgICAgICAgICAgLm9uKCJkcmFnIiwgZHJhZ21vdmUpKQ0KICAgICAgICAgICAgLm9uKCJtb3VzZW92ZXIiLCBmdW5jdGlvbihkKSB7DQogICAgICAgICAgICAgICAgbGluay5maWx0ZXIoZnVuY3Rpb24oZDEsIGkpIHsgcmV0dXJuIGQudGFyZ2V0TGlua3MuaW5jbHVkZXMoZDEpIHwgZC5zb3VyY2VMaW5rcy5pbmNsdWRlcyhkMSk7IH0pDQogICAgICAgICAgICAgICAgIC5zdHlsZSgic3Ryb2tlLW9wYWNpdHkiLCBmdW5jdGlvbihkKXtyZXR1cm4gb3BhY2l0eV9saW5rKGQpICsgMC4zfSk7DQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgLm9uKCJtb3VzZW91dCIsIGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgICAgICAgICBsaW5rLmZpbHRlcihmdW5jdGlvbihkMSwgaSkgeyByZXR1cm4gZC50YXJnZXRMaW5rcy5pbmNsdWRlcyhkMSkgfCBkLnNvdXJjZUxpbmtzLmluY2x1ZGVzKGQxKTsgfSkNCiAgICAgICAgICAgICAgICAuc3R5bGUoInN0cm9rZS1vcGFjaXR5Iiwgb3BhY2l0eV9saW5rKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAvLyBub3RlOiB1MjE5MiBpcyByaWdodC1hcnJvdw0KICAgICAgICBsaW5rLmFwcGVuZCgidGl0bGUiKQ0KICAgICAgICAgICAgLmFwcGVuZCgiZm9yZWlnbk9iamVjdCIpDQogICAgICAgICAgICAuYXBwZW5kKCJ4aHRtbDpib2R5IikNCiAgICAgICAgICAgIC5odG1sKGZ1bmN0aW9uKGQpIHsgcmV0dXJuICI8cHJlPiIgKyBkLnNvdXJjZS5uYW1lICsgIiBcdTIxOTIgIiArIGQudGFyZ2V0Lm5hbWUgKw0KICAgICAgICAgICAgICAgICJcbiIgKyBmb3JtYXQoZC52YWx1ZSkgKyAiICIgKyBvcHRpb25zLnVuaXRzICsgIjwvcHJlPiI7IH0pOw0KDQogICAgICAgIG5vZGUuYXBwZW5kKCJyZWN0IikNCiAgICAgICAgICAgIC5hdHRyKCJoZWlnaHQiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmR5OyB9KQ0KICAgICAgICAgICAgLmF0dHIoIndpZHRoIiwgc2Fua2V5Lm5vZGVXaWR0aCgpKQ0KICAgICAgICAgICAgLnN0eWxlKCJmaWxsIiwgZnVuY3Rpb24oZCkgew0KICAgICAgICAgICAgICAgIHJldHVybiBkLmNvbG9yID0gY29sb3Jfbm9kZShkKTsgfSkNCiAgICAgICAgICAgIC5zdHlsZSgic3Ryb2tlIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZDMucmdiKGQuY29sb3IpLmRhcmtlcigyKTsgfSkNCiAgICAgICAgICAgIC5zdHlsZSgib3BhY2l0eSIsIDAuOSkNCiAgICAgICAgICAgIC5zdHlsZSgiY3Vyc29yIiwgIm1vdmUiKQ0KICAgICAgICAgICAgLmFwcGVuZCgidGl0bGUiKQ0KICAgICAgICAgICAgLmFwcGVuZCgiZm9yZWlnbk9iamVjdCIpDQogICAgICAgICAgICAuYXBwZW5kKCJ4aHRtbDpib2R5IikNCiAgICAgICAgICAgIC5odG1sKGZ1bmN0aW9uKGQpIHsgcmV0dXJuICI8cHJlPiIgKyBkLm5hbWUgKyAiPGJyPiIgKyBmb3JtYXQoZC52YWx1ZSkgKyANCiAgICAgICAgICAgICAgICAiICIgKyBvcHRpb25zLnVuaXRzICsgIjwvcHJlPiI7IH0pOw0KDQogICAgICAgIG5vZGUuYXBwZW5kKCJ0ZXh0IikNCiAgICAgICAgICAgIC5hdHRyKCJ4IiwgLTYpDQogICAgICAgICAgICAuYXR0cigieSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuZHkgLyAyOyB9KQ0KICAgICAgICAgICAgLmF0dHIoImR5IiwgIi4zNWVtIikNCiAgICAgICAgICAgIC5hdHRyKCJ0ZXh0LWFuY2hvciIsICJlbmQiKQ0KICAgICAgICAgICAgLmF0dHIoInRyYW5zZm9ybSIsIG51bGwpDQogICAgICAgICAgICAudGV4dChmdW5jdGlvbihkKSB7IHJldHVybiBkLm5hbWU7IH0pDQogICAgICAgICAgICAuc3R5bGUoImZvbnQtc2l6ZSIsIG9wdGlvbnMuZm9udFNpemUgKyAicHgiKQ0KICAgICAgICAgICAgLnN0eWxlKCJmb250LWZhbWlseSIsIG9wdGlvbnMuZm9udEZhbWlseSA/IG9wdGlvbnMuZm9udEZhbWlseSA6ICJpbmhlcml0IikNCiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC54IDwgd2lkdGggLyAyIHx8ICFvcHRpb25zLnNpbmtzUmlnaHQ7IH0pDQogICAgICAgICAgICAuYXR0cigieCIsIDYgKyBzYW5rZXkubm9kZVdpZHRoKCkpDQogICAgICAgICAgICAuYXR0cigidGV4dC1hbmNob3IiLCAic3RhcnQiKTsNCg0KDQogICAgICAgIC8vIGFkanVzdCB2aWV3Qm94IHRvIGZpdCB0aGUgYm91bmRzIG9mIG91ciB0cmVlDQogICAgICAgIHZhciBzID0gZDMuc2VsZWN0KHN2Zy5ub2RlKCkucGFyZW50Tm9kZSk7DQogICAgICAgIHMuYXR0cigNCiAgICAgICAgICAgICJ2aWV3Qm94IiwNCiAgICAgICAgICAgIFsNCiAgICAgICAgICAgICAgZDMubWluKA0KICAgICAgICAgICAgICAgIHMuc2VsZWN0QWxsKCdnJykubm9kZXMoKS5tYXAoZnVuY3Rpb24oZCl7DQogICAgICAgICAgICAgICAgICByZXR1cm4gZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0DQogICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgKSAtIHMubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSBtYXJnaW4ucmlnaHQsDQogICAgICAgICAgICAgIGQzLm1pbigNCiAgICAgICAgICAgICAgICBzLnNlbGVjdEFsbCgnZycpLm5vZGVzKCkubWFwKGZ1bmN0aW9uKGQpew0KICAgICAgICAgICAgICAgICAgcmV0dXJuIGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wDQogICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgKSAtIHMubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIG1hcmdpbi50b3AsDQogICAgICAgICAgICAgIGQzLm1heCgNCiAgICAgICAgICAgICAgICBzLnNlbGVjdEFsbCgnZycpLm5vZGVzKCkubWFwKGZ1bmN0aW9uKGQpew0KICAgICAgICAgICAgICAgICAgcmV0dXJuIGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICApIC0NCiAgICAgICAgICAgICAgZDMubWluKA0KICAgICAgICAgICAgICAgIHMuc2VsZWN0QWxsKCdnJykubm9kZXMoKS5tYXAoZnVuY3Rpb24oZCl7DQogICAgICAgICAgICAgICAgICByZXR1cm4gZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0DQogICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgKSAgKyBtYXJnaW4ubGVmdCArIG1hcmdpbi5yaWdodCwNCiAgICAgICAgICAgICAgZDMubWF4KA0KICAgICAgICAgICAgICAgIHMuc2VsZWN0QWxsKCdnJykubm9kZXMoKS5tYXAoZnVuY3Rpb24oZCl7DQogICAgICAgICAgICAgICAgICByZXR1cm4gZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20NCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICApIC0NCiAgICAgICAgICAgICAgZDMubWluKA0KICAgICAgICAgICAgICAgIHMuc2VsZWN0QWxsKCdnJykubm9kZXMoKS5tYXAoZnVuY3Rpb24oZCl7DQogICAgICAgICAgICAgICAgICByZXR1cm4gZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3ANCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICApICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20NCiAgICAgICAgICAgIF0uam9pbigiLCIpDQogICAgICAgICAgKTsNCg0KDQogICAgICAgIGZ1bmN0aW9uIGRyYWdtb3ZlKGQpIHsNCiAgICAgICAgICAgIGQzLnNlbGVjdCh0aGlzKS5hdHRyKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlKCIgKyBkLnggKyAiLCIgKw0KICAgICAgICAgICAgKGQueSA9IE1hdGgubWF4KDAsIE1hdGgubWluKGhlaWdodCAtIGQuZHksIGQzLmV2ZW50LnkpKSkgKyAiKSIpOw0KICAgICAgICAgICAgc2Fua2V5LnJlbGF5b3V0KCk7DQogICAgICAgICAgICBsaW5rLmF0dHIoImQiLCBwYXRoKTsNCiAgICAgICAgfQ0KICAgIH0sDQp9KTsNCg=="></script> <link href="data:text/css;charset=utf-8,%2Evis%20%2Eoverlay%20%7B%0Aposition%3A%20absolute%3B%0Atop%3A%200%3B%0Aleft%3A%200%3B%0Awidth%3A%20100%25%3B%0Aheight%3A%20100%25%3B%0A%0Az%2Dindex%3A%2010%3B%0A%7D%0A%2Evis%2Dactive%20%7B%0Abox%2Dshadow%3A%200%200%2010px%20%2386d5f8%3B%0A%7D%0A%0A%2Evis%20%5Bclass%2A%3D%22span%22%5D%20%7B%0Amin%2Dheight%3A%200%3B%0Awidth%3A%20auto%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%20%7B%0Aposition%3Arelative%3B%0Adisplay%3Ablock%3B%0Afloat%3Aleft%3B%0Afont%2Dsize%3A12px%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Dwrapper%20%7B%0Adisplay%3Ablock%3B%0Awidth%3A700px%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Dwrapper%3A%3Aafter%20%7B%0Aclear%3A%20both%3B%0Acontent%3A%20%22%22%3B%0Adisplay%3A%20block%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Evis%2Dconfig%2Doption%2Dcontainer%7B%0Adisplay%3Ablock%3B%0Awidth%3A495px%3B%0Abackground%2Dcolor%3A%20%23ffffff%3B%0Aborder%3A2px%20solid%20%23f7f8fa%3B%0Aborder%2Dradius%3A4px%3B%0Amargin%2Dtop%3A20px%3B%0Aleft%3A10px%3B%0Apadding%2Dleft%3A5px%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Evis%2Dconfig%2Dbutton%7B%0Adisplay%3Ablock%3B%0Awidth%3A495px%3B%0Aheight%3A25px%3B%0Avertical%2Dalign%3A%20middle%3B%0Aline%2Dheight%3A25px%3B%0Abackground%2Dcolor%3A%20%23f7f8fa%3B%0Aborder%3A2px%20solid%20%23ceced0%3B%0Aborder%2Dradius%3A4px%3B%0Amargin%2Dtop%3A20px%3B%0Aleft%3A10px%3B%0Apadding%2Dleft%3A5px%3B%0Acursor%3A%20pointer%3B%0Amargin%2Dbottom%3A30px%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Evis%2Dconfig%2Dbutton%2Ehover%7B%0Abackground%2Dcolor%3A%20%234588e6%3B%0Aborder%3A2px%20solid%20%23214373%3B%0Acolor%3A%23ffffff%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Evis%2Dconfig%2Ditem%7B%0Adisplay%3Ablock%3B%0Afloat%3Aleft%3B%0Awidth%3A495px%3B%0Aheight%3A25px%3B%0Avertical%2Dalign%3A%20middle%3B%0Aline%2Dheight%3A25px%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Evis%2Dconfig%2Ditem%2Evis%2Dconfig%2Ds2%7B%0Aleft%3A10px%3B%0Abackground%2Dcolor%3A%20%23f7f8fa%3B%0Apadding%2Dleft%3A5px%3B%0Aborder%2Dradius%3A3px%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Evis%2Dconfig%2Ditem%2Evis%2Dconfig%2Ds3%7B%0Aleft%3A20px%3B%0Abackground%2Dcolor%3A%20%23e4e9f0%3B%0Apadding%2Dleft%3A5px%3B%0Aborder%2Dradius%3A3px%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Evis%2Dconfig%2Ditem%2Evis%2Dconfig%2Ds4%7B%0Aleft%3A30px%3B%0Abackground%2Dcolor%3A%20%23cfd8e6%3B%0Apadding%2Dleft%3A5px%3B%0Aborder%2Dradius%3A3px%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Evis%2Dconfig%2Dheader%7B%0Afont%2Dsize%3A18px%3B%0Afont%2Dweight%3A%20bold%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Evis%2Dconfig%2Dlabel%7B%0Awidth%3A120px%3B%0Aheight%3A25px%3B%0Aline%2Dheight%3A%2025px%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Evis%2Dconfig%2Dlabel%2Evis%2Dconfig%2Ds3%7B%0Awidth%3A110px%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Evis%2Dconfig%2Dlabel%2Evis%2Dconfig%2Ds4%7B%0Awidth%3A100px%3B%0A%7D%0Adiv%2Evis%2Dconfiguration%2Evis%2Dconfig%2DcolorBlock%7B%0Atop%3A1px%3B%0Awidth%3A30px%3B%0Aheight%3A19px%3B%0Aborder%3A1px%20solid%20%23444444%3B%0Aborder%2Dradius%3A2px%3B%0Apadding%3A0px%3B%0Amargin%3A0px%3B%0Acursor%3Apointer%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Dcheckbox%20%7B%0Aleft%3A%2D5px%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drangeinput%7B%0Aposition%3Arelative%3B%0Atop%3A%2D5px%3B%0Awidth%3A60px%3B%0A%0Apadding%3A1px%3B%0Amargin%3A0%3B%0Apointer%2Devents%3Anone%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%7B%0A%0A%2Dwebkit%2Dappearance%3A%20none%3B%0A%0Aborder%3A%200px%20solid%20white%3B%0Abackground%2Dcolor%3Argba%280%2C0%2C0%2C0%29%3B%0A%0Awidth%3A%20300px%3B%0Aheight%3A20px%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%3A%3A%2Dwebkit%2Dslider%2Drunnable%2Dtrack%20%7B%0Awidth%3A%20300px%3B%0Aheight%3A%205px%3B%0Abackground%3A%20%23dedede%3B%20%0Abackground%3A%20%2Dmoz%2Dlinear%2Dgradient%28top%2C%20%23dedede%200%25%2C%20%23c8c8c8%2099%25%29%3B%20%0Abackground%3A%20%2Dwebkit%2Dgradient%28linear%2C%20left%20top%2C%20left%20bottom%2C%20color%2Dstop%280%25%2C%23dedede%29%2C%20color%2Dstop%2899%25%2C%23c8c8c8%29%29%3B%20%0Abackground%3A%20%2Dwebkit%2Dlinear%2Dgradient%28top%2C%20%23dedede%200%25%2C%23c8c8c8%2099%25%29%3B%20%0Abackground%3A%20%2Do%2Dlinear%2Dgradient%28top%2C%20%23dedede%200%25%2C%20%23c8c8c8%2099%25%29%3B%20%0Abackground%3A%20%2Dms%2Dlinear%2Dgradient%28top%2C%20%23dedede%200%25%2C%23c8c8c8%2099%25%29%3B%20%0Abackground%3A%20linear%2Dgradient%28to%20bottom%2C%20%23dedede%200%25%2C%23c8c8c8%2099%25%29%3B%20%0Afilter%3A%20progid%3ADXImageTransform%2EMicrosoft%2Egradient%28%20startColorstr%3D%27%23dedede%27%2C%20endColorstr%3D%27%23c8c8c8%27%2CGradientType%3D0%20%29%3B%20%0Aborder%3A%201px%20solid%20%23999999%3B%0Abox%2Dshadow%3A%20%23aaaaaa%200px%200px%203px%200px%3B%0Aborder%2Dradius%3A%203px%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%3A%3A%2Dwebkit%2Dslider%2Dthumb%20%7B%0A%2Dwebkit%2Dappearance%3A%20none%3B%0Aborder%3A%201px%20solid%20%2314334b%3B%0Aheight%3A%2017px%3B%0Awidth%3A%2017px%3B%0Aborder%2Dradius%3A%2050%25%3B%0Abackground%3A%20%233876c2%3B%20%0Abackground%3A%20%2Dmoz%2Dlinear%2Dgradient%28top%2C%20%233876c2%200%25%2C%20%23385380%20100%25%29%3B%20%0Abackground%3A%20%2Dwebkit%2Dgradient%28linear%2C%20left%20top%2C%20left%20bottom%2C%20color%2Dstop%280%25%2C%233876c2%29%2C%20color%2Dstop%28100%25%2C%23385380%29%29%3B%20%0Abackground%3A%20%2Dwebkit%2Dlinear%2Dgradient%28top%2C%20%233876c2%200%25%2C%23385380%20100%25%29%3B%20%0Abackground%3A%20%2Do%2Dlinear%2Dgradient%28top%2C%20%233876c2%200%25%2C%23385380%20100%25%29%3B%20%0Abackground%3A%20%2Dms%2Dlinear%2Dgradient%28top%2C%20%233876c2%200%25%2C%23385380%20100%25%29%3B%20%0Abackground%3A%20linear%2Dgradient%28to%20bottom%2C%20%233876c2%200%25%2C%23385380%20100%25%29%3B%20%0Afilter%3A%20progid%3ADXImageTransform%2EMicrosoft%2Egradient%28%20startColorstr%3D%27%233876c2%27%2C%20endColorstr%3D%27%23385380%27%2CGradientType%3D0%20%29%3B%20%0Abox%2Dshadow%3A%20%23111927%200px%200px%201px%200px%3B%0Amargin%2Dtop%3A%20%2D7px%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%3Afocus%20%7B%0Aoutline%3A%20none%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%3Afocus%3A%3A%2Dwebkit%2Dslider%2Drunnable%2Dtrack%20%7B%0Abackground%3A%20%239d9d9d%3B%20%0Abackground%3A%20%2Dmoz%2Dlinear%2Dgradient%28top%2C%20%239d9d9d%200%25%2C%20%23c8c8c8%2099%25%29%3B%20%0Abackground%3A%20%2Dwebkit%2Dgradient%28linear%2C%20left%20top%2C%20left%20bottom%2C%20color%2Dstop%280%25%2C%239d9d9d%29%2C%20color%2Dstop%2899%25%2C%23c8c8c8%29%29%3B%20%0Abackground%3A%20%2Dwebkit%2Dlinear%2Dgradient%28top%2C%20%239d9d9d%200%25%2C%23c8c8c8%2099%25%29%3B%20%0Abackground%3A%20%2Do%2Dlinear%2Dgradient%28top%2C%20%239d9d9d%200%25%2C%23c8c8c8%2099%25%29%3B%20%0Abackground%3A%20%2Dms%2Dlinear%2Dgradient%28top%2C%20%239d9d9d%200%25%2C%23c8c8c8%2099%25%29%3B%20%0Abackground%3A%20linear%2Dgradient%28to%20bottom%2C%20%239d9d9d%200%25%2C%23c8c8c8%2099%25%29%3B%20%0Afilter%3A%20progid%3ADXImageTransform%2EMicrosoft%2Egradient%28%20startColorstr%3D%27%239d9d9d%27%2C%20endColorstr%3D%27%23c8c8c8%27%2CGradientType%3D0%20%29%3B%20%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%3A%3A%2Dmoz%2Drange%2Dtrack%20%7B%0Awidth%3A%20300px%3B%0Aheight%3A%2010px%3B%0Abackground%3A%20%23dedede%3B%20%0Abackground%3A%20%2Dmoz%2Dlinear%2Dgradient%28top%2C%20%23dedede%200%25%2C%20%23c8c8c8%2099%25%29%3B%20%0Abackground%3A%20%2Dwebkit%2Dgradient%28linear%2C%20left%20top%2C%20left%20bottom%2C%20color%2Dstop%280%25%2C%23dedede%29%2C%20color%2Dstop%2899%25%2C%23c8c8c8%29%29%3B%20%0Abackground%3A%20%2Dwebkit%2Dlinear%2Dgradient%28top%2C%20%23dedede%200%25%2C%23c8c8c8%2099%25%29%3B%20%0Abackground%3A%20%2Do%2Dlinear%2Dgradient%28top%2C%20%23dedede%200%25%2C%20%23c8c8c8%2099%25%29%3B%20%0Abackground%3A%20%2Dms%2Dlinear%2Dgradient%28top%2C%20%23dedede%200%25%2C%23c8c8c8%2099%25%29%3B%20%0Abackground%3A%20linear%2Dgradient%28to%20bottom%2C%20%23dedede%200%25%2C%23c8c8c8%2099%25%29%3B%20%0Afilter%3A%20progid%3ADXImageTransform%2EMicrosoft%2Egradient%28%20startColorstr%3D%27%23dedede%27%2C%20endColorstr%3D%27%23c8c8c8%27%2CGradientType%3D0%20%29%3B%20%0Aborder%3A%201px%20solid%20%23999999%3B%0Abox%2Dshadow%3A%20%23aaaaaa%200px%200px%203px%200px%3B%0Aborder%2Dradius%3A%203px%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%3A%3A%2Dmoz%2Drange%2Dthumb%20%7B%0Aborder%3A%20none%3B%0Aheight%3A%2016px%3B%0Awidth%3A%2016px%3B%0Aborder%2Dradius%3A%2050%25%3B%0Abackground%3A%20%23385380%3B%0A%7D%0A%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%3A%2Dmoz%2Dfocusring%7B%0Aoutline%3A%201px%20solid%20white%3B%0Aoutline%2Doffset%3A%20%2D1px%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%3A%3A%2Dms%2Dtrack%20%7B%0Awidth%3A%20300px%3B%0Aheight%3A%205px%3B%0A%0Abackground%3A%20transparent%3B%0A%0Aborder%2Dcolor%3A%20transparent%3B%0Aborder%2Dwidth%3A%206px%200%3B%0A%0Acolor%3A%20transparent%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%3A%3A%2Dms%2Dfill%2Dlower%20%7B%0Abackground%3A%20%23777%3B%0Aborder%2Dradius%3A%2010px%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%3A%3A%2Dms%2Dfill%2Dupper%20%7B%0Abackground%3A%20%23ddd%3B%0Aborder%2Dradius%3A%2010px%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%3A%3A%2Dms%2Dthumb%20%7B%0Aborder%3A%20none%3B%0Aheight%3A%2016px%3B%0Awidth%3A%2016px%3B%0Aborder%2Dradius%3A%2050%25%3B%0Abackground%3A%20%23385380%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%3Afocus%3A%3A%2Dms%2Dfill%2Dlower%20%7B%0Abackground%3A%20%23888%3B%0A%7D%0Ainput%2Evis%2Dconfiguration%2Evis%2Dconfig%2Drange%3Afocus%3A%3A%2Dms%2Dfill%2Dupper%20%7B%0Abackground%3A%20%23ccc%3B%0A%7D%0A%2Evis%2Dconfiguration%2Dpopup%20%7B%0Aposition%3A%20absolute%3B%0Abackground%3A%20rgba%2857%2C%2076%2C%2089%2C%200%2E85%29%3B%0Aborder%3A%202px%20solid%20%23f2faff%3B%0Aline%2Dheight%3A30px%3B%0Aheight%3A30px%3B%0Awidth%3A150px%3B%0Atext%2Dalign%3Acenter%3B%0Acolor%3A%20%23ffffff%3B%0Afont%2Dsize%3A14px%3B%0Aborder%2Dradius%3A4px%3B%0A%2Dwebkit%2Dtransition%3A%20opacity%200%2E3s%20ease%2Din%2Dout%3B%0A%2Dmoz%2Dtransition%3A%20opacity%200%2E3s%20ease%2Din%2Dout%3B%0Atransition%3A%20opacity%200%2E3s%20ease%2Din%2Dout%3B%0A%7D%0A%2Evis%2Dconfiguration%2Dpopup%3Aafter%2C%20%2Evis%2Dconfiguration%2Dpopup%3Abefore%20%7B%0Aleft%3A%20100%25%3B%0Atop%3A%2050%25%3B%0Aborder%3A%20solid%20transparent%3B%0Acontent%3A%20%22%20%22%3B%0Aheight%3A%200%3B%0Awidth%3A%200%3B%0Aposition%3A%20absolute%3B%0Apointer%2Devents%3A%20none%3B%0A%7D%0A%2Evis%2Dconfiguration%2Dpopup%3Aafter%20%7B%0Aborder%2Dcolor%3A%20rgba%28136%2C%20183%2C%20213%2C%200%29%3B%0Aborder%2Dleft%2Dcolor%3A%20rgba%2857%2C%2076%2C%2089%2C%200%2E85%29%3B%0Aborder%2Dwidth%3A%208px%3B%0Amargin%2Dtop%3A%20%2D8px%3B%0A%7D%0A%2Evis%2Dconfiguration%2Dpopup%3Abefore%20%7B%0Aborder%2Dcolor%3A%20rgba%28194%2C%20225%2C%20245%2C%200%29%3B%0Aborder%2Dleft%2Dcolor%3A%20%23f2faff%3B%0Aborder%2Dwidth%3A%2012px%3B%0Amargin%2Dtop%3A%20%2D12px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20%7B%0Aposition%3Aabsolute%3B%0Atop%3A%200px%3B%0Aleft%3A%2030px%3B%0Amargin%2Dtop%3A%2D140px%3B%0Amargin%2Dleft%3A30px%3B%0Awidth%3A310px%3B%0Aheight%3A444px%3B%0Az%2Dindex%3A%201%3B%0Apadding%3A%2010px%3B%0Aborder%2Dradius%3A15px%3B%0Abackground%2Dcolor%3A%23ffffff%3B%0Adisplay%3A%20none%3B%0Abox%2Dshadow%3A%20rgba%280%2C0%2C0%2C0%2E5%29%200px%200px%2010px%200px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Darrow%20%7B%0Aposition%3A%20absolute%3B%0Atop%3A147px%3B%0Aleft%3A5px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Darrow%3A%3Aafter%2C%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Darrow%3A%3Abefore%20%7B%0Aright%3A%20100%25%3B%0Atop%3A%2050%25%3B%0Aborder%3A%20solid%20transparent%3B%0Acontent%3A%20%22%20%22%3B%0Aheight%3A%200%3B%0Awidth%3A%200%3B%0Aposition%3A%20absolute%3B%0Apointer%2Devents%3A%20none%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Darrow%3Aafter%20%7B%0Aborder%2Dcolor%3A%20rgba%28255%2C%20255%2C%20255%2C%200%29%3B%0Aborder%2Dright%2Dcolor%3A%20%23ffffff%3B%0Aborder%2Dwidth%3A%2030px%3B%0Amargin%2Dtop%3A%20%2D30px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dcolor%20%7B%0Aposition%3Aabsolute%3B%0Awidth%3A%20289px%3B%0Aheight%3A%20289px%3B%0Acursor%3A%20pointer%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dbrightness%20%7B%0Aposition%3A%20absolute%3B%0Atop%3A313px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dopacity%20%7B%0Aposition%3Aabsolute%3B%0Atop%3A350px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dselector%20%7B%0Aposition%3Aabsolute%3B%0Atop%3A137px%3B%0Aleft%3A137px%3B%0Awidth%3A15px%3B%0Aheight%3A15px%3B%0Aborder%2Dradius%3A15px%3B%0Aborder%3A1px%20solid%20%23ffffff%3B%0Abackground%3A%20%234c4c4c%3B%20%0Abackground%3A%20%2Dmoz%2Dlinear%2Dgradient%28top%2C%20%234c4c4c%200%25%2C%20%23595959%2012%25%2C%20%23666666%2025%25%2C%20%23474747%2039%25%2C%20%232c2c2c%2050%25%2C%20%23000000%2051%25%2C%20%23111111%2060%25%2C%20%232b2b2b%2076%25%2C%20%231c1c1c%2091%25%2C%20%23131313%20100%25%29%3B%20%0Abackground%3A%20%2Dwebkit%2Dgradient%28linear%2C%20left%20top%2C%20left%20bottom%2C%20color%2Dstop%280%25%2C%234c4c4c%29%2C%20color%2Dstop%2812%25%2C%23595959%29%2C%20color%2Dstop%2825%25%2C%23666666%29%2C%20color%2Dstop%2839%25%2C%23474747%29%2C%20color%2Dstop%2850%25%2C%232c2c2c%29%2C%20color%2Dstop%2851%25%2C%23000000%29%2C%20color%2Dstop%2860%25%2C%23111111%29%2C%20color%2Dstop%2876%25%2C%232b2b2b%29%2C%20color%2Dstop%2891%25%2C%231c1c1c%29%2C%20color%2Dstop%28100%25%2C%23131313%29%29%3B%20%0Abackground%3A%20%2Dwebkit%2Dlinear%2Dgradient%28top%2C%20%234c4c4c%200%25%2C%23595959%2012%25%2C%23666666%2025%25%2C%23474747%2039%25%2C%232c2c2c%2050%25%2C%23000000%2051%25%2C%23111111%2060%25%2C%232b2b2b%2076%25%2C%231c1c1c%2091%25%2C%23131313%20100%25%29%3B%20%0Abackground%3A%20%2Do%2Dlinear%2Dgradient%28top%2C%20%234c4c4c%200%25%2C%23595959%2012%25%2C%23666666%2025%25%2C%23474747%2039%25%2C%232c2c2c%2050%25%2C%23000000%2051%25%2C%23111111%2060%25%2C%232b2b2b%2076%25%2C%231c1c1c%2091%25%2C%23131313%20100%25%29%3B%20%0Abackground%3A%20%2Dms%2Dlinear%2Dgradient%28top%2C%20%234c4c4c%200%25%2C%23595959%2012%25%2C%23666666%2025%25%2C%23474747%2039%25%2C%232c2c2c%2050%25%2C%23000000%2051%25%2C%23111111%2060%25%2C%232b2b2b%2076%25%2C%231c1c1c%2091%25%2C%23131313%20100%25%29%3B%20%0Abackground%3A%20linear%2Dgradient%28to%20bottom%2C%20%234c4c4c%200%25%2C%23595959%2012%25%2C%23666666%2025%25%2C%23474747%2039%25%2C%232c2c2c%2050%25%2C%23000000%2051%25%2C%23111111%2060%25%2C%232b2b2b%2076%25%2C%231c1c1c%2091%25%2C%23131313%20100%25%29%3B%20%0Afilter%3A%20progid%3ADXImageTransform%2EMicrosoft%2Egradient%28%20startColorstr%3D%27%234c4c4c%27%2C%20endColorstr%3D%27%23131313%27%2CGradientType%3D0%20%29%3B%20%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dnew%2Dcolor%20%7B%0Aposition%3Aabsolute%3B%0Awidth%3A140px%3B%0Aheight%3A20px%3B%0Aborder%3A1px%20solid%20rgba%280%2C0%2C0%2C0%2E1%29%3B%0Aborder%2Dradius%3A5px%3B%0Atop%3A380px%3B%0Aleft%3A159px%3B%0Atext%2Dalign%3Aright%3B%0Apadding%2Dright%3A2px%3B%0Afont%2Dsize%3A10px%3B%0Acolor%3Argba%280%2C0%2C0%2C0%2E4%29%3B%0Avertical%2Dalign%3Amiddle%3B%0Aline%2Dheight%3A20px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dinitial%2Dcolor%20%7B%0Aposition%3Aabsolute%3B%0Awidth%3A140px%3B%0Aheight%3A20px%3B%0Aborder%3A1px%20solid%20rgba%280%2C0%2C0%2C0%2E1%29%3B%0Aborder%2Dradius%3A5px%3B%0Atop%3A380px%3B%0Aleft%3A10px%3B%0Atext%2Dalign%3Aleft%3B%0Apadding%2Dleft%3A2px%3B%0Afont%2Dsize%3A10px%3B%0Acolor%3Argba%280%2C0%2C0%2C0%2E4%29%3B%0Avertical%2Dalign%3Amiddle%3B%0Aline%2Dheight%3A20px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dlabel%20%7B%0Aposition%3Aabsolute%3B%0Awidth%3A300px%3B%0Aleft%3A10px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dlabel%2Evis%2Dbrightness%20%7B%0Atop%3A300px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dlabel%2Evis%2Dopacity%20%7B%0Atop%3A338px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dbutton%20%7B%0Aposition%3Aabsolute%3B%0Awidth%3A68px%3B%0Aheight%3A25px%3B%0Aborder%2Dradius%3A10px%3B%0Avertical%2Dalign%3A%20middle%3B%0Atext%2Dalign%3Acenter%3B%0Aline%2Dheight%3A%2025px%3B%0Atop%3A410px%3B%0Aborder%3A2px%20solid%20%23d9d9d9%3B%0Abackground%2Dcolor%3A%20%23f7f7f7%3B%0Acursor%3Apointer%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dbutton%2Evis%2Dcancel%20%7B%0A%0A%0Aleft%3A5px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dbutton%2Evis%2Dload%20%7B%0A%0A%0Aleft%3A82px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dbutton%2Evis%2Dapply%20%7B%0A%0A%0Aleft%3A159px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20div%2Evis%2Dbutton%2Evis%2Dsave%20%7B%0A%0A%0Aleft%3A236px%3B%0A%7D%0Adiv%2Evis%2Dcolor%2Dpicker%20input%2Evis%2Drange%20%7B%0Awidth%3A%20290px%3B%0Aheight%3A20px%3B%0A%7D%0A%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20%7B%0Aborder%2Dwidth%3A%200%3B%0Aborder%2Dbottom%3A%201px%3B%0Aborder%2Dstyle%3Asolid%3B%0Aborder%2Dcolor%3A%20%23d6d9d8%3B%0Abackground%3A%20%23ffffff%3B%20%0Abackground%3A%20%2Dmoz%2Dlinear%2Dgradient%28top%2C%20%23ffffff%200%25%2C%20%23fcfcfc%2048%25%2C%20%23fafafa%2050%25%2C%20%23fcfcfc%20100%25%29%3B%20%0Abackground%3A%20%2Dwebkit%2Dgradient%28linear%2C%20left%20top%2C%20left%20bottom%2C%20color%2Dstop%280%25%2C%23ffffff%29%2C%20color%2Dstop%2848%25%2C%23fcfcfc%29%2C%20color%2Dstop%2850%25%2C%23fafafa%29%2C%20color%2Dstop%28100%25%2C%23fcfcfc%29%29%3B%20%0Abackground%3A%20%2Dwebkit%2Dlinear%2Dgradient%28top%2C%20%23ffffff%200%25%2C%23fcfcfc%2048%25%2C%23fafafa%2050%25%2C%23fcfcfc%20100%25%29%3B%20%0Abackground%3A%20%2Do%2Dlinear%2Dgradient%28top%2C%20%23ffffff%200%25%2C%23fcfcfc%2048%25%2C%23fafafa%2050%25%2C%23fcfcfc%20100%25%29%3B%20%0Abackground%3A%20%2Dms%2Dlinear%2Dgradient%28top%2C%20%23ffffff%200%25%2C%23fcfcfc%2048%25%2C%23fafafa%2050%25%2C%23fcfcfc%20100%25%29%3B%20%0Abackground%3A%20linear%2Dgradient%28to%20bottom%2C%20%23ffffff%200%25%2C%23fcfcfc%2048%25%2C%23fafafa%2050%25%2C%23fcfcfc%20100%25%29%3B%20%0Afilter%3A%20progid%3ADXImageTransform%2EMicrosoft%2Egradient%28%20startColorstr%3D%27%23ffffff%27%2C%20endColorstr%3D%27%23fcfcfc%27%2CGradientType%3D0%20%29%3B%20%0Apadding%2Dtop%3A4px%3B%0Aposition%3A%20absolute%3B%0Aleft%3A%200%3B%0Atop%3A%200%3B%0Awidth%3A%20100%25%3B%0Aheight%3A%2028px%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dedit%2Dmode%20%7B%0Aposition%3Aabsolute%3B%0Aleft%3A%200%3B%0Atop%3A%205px%3B%0Aheight%3A%2030px%3B%0A%7D%0A%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dclose%20%7B%0Aposition%3Aabsolute%3B%0Aright%3A%200%3B%0Atop%3A%200%3B%0Awidth%3A%2030px%3B%0Aheight%3A%2030px%3B%0Abackground%2Dposition%3A%2020px%203px%3B%0Abackground%2Drepeat%3A%20no%2Drepeat%3B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAADvGaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI%2BCiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI%2BCiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICAgICAgICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8eG1wOkNyZWF0b3JUb29sPkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTQtMDItMTRUMTE6NTU6MzUrMDE6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDE0LTAyLTE0VDEyOjA1OjE3KzAxOjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU%2BMjAxNC0wMi0xNFQxMjowNToxNyswMTowMDwveG1wOk1vZGlmeURhdGU%2BCiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6NjU0YmM5YmQtMWI2Yi1jYjRhLTllOWQtNWY2MzgxNDVjZjk0PC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD54bXAuZGlkOjk4MmM2MGIwLWUzZjMtMDk0MC04MjU0LTFiZTliNWE0ZTE4MzwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjk4MmM2MGIwLWUzZjMtMDk0MC04MjU0LTFiZTliNWE0ZTE4MzwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE%2BCiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ%2BeG1wLmlpZDo5ODJjNjBiMC1lM2YzLTA5NDAtODI1NC0xYmU5YjVhNGUxODM8L3N0RXZ0Omluc3RhbmNlSUQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMTRUMTE6NTU6MzUrMDE6MDA8L3N0RXZ0OndoZW4%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ%2BCiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjIxODYxNmM2LTM1MWMtNDI0OS04YWFkLWJkZDQ2ZTczNWE0NDwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4%2BMjAxNC0wMi0xNFQxMTo1NTozNSswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ%2BQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ%2BLzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6NjU0YmM5YmQtMWI2Yi1jYjRhLTllOWQtNWY2MzgxNDVjZjk0PC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAyLTE0VDEyOjA1OjE3KzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6U2VxPgogICAgICAgICA8L3htcE1NOkhpc3Rvcnk%2BCiAgICAgICAgIDxkYzpmb3JtYXQ%2BaW1hZ2UvcG5nPC9kYzpmb3JtYXQ%2BCiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU%2BCiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU%2BCiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24%2BCiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24%2BNzIwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjc8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24%2BNzwvZXhpZjpQaXhlbFlEaW1lbnNpb24%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY%2BCjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8%2BcZUZMwAAACBjSFJNAAB6JQAAgIMAAPn%2FAACA6QAAdTAAAOpgAAA6mAAAF2%2BSX8VGAAAA2ElEQVR42gDLADT%2FAS0tLUQFBQUVFxcXtPHx8fPl5eUNCAgITCkpKesEHx8fGgYGBjH%2B%2Fv4a%2BPj4qgQEBFU6OjodMTExzwQUFBSvEBAQEfX19SD19fVqNDQ0CElJSd%2F9%2Ff2vAwEBAfrn5%2BfkBwcHLRYWFgsXFxfz29vbo9LS0uwDDQ0NDfPz81orKysXIyMj%2BODg4Avh4eEa%2Ff391gMkJCRYPz8%2FKUhISOMCAgKh8fHxHRsbGx4UFBQQBDk5OeY7Ozv7CAgItPb29vMEBASaJSUlTQ0NDesDAEwpT0Ko8Ri2AAAAAElFTkSuQmCC%29%3B%0Acursor%3A%20pointer%3B%0A%2Dwebkit%2Dtouch%2Dcallout%3A%20none%3B%0A%2Dwebkit%2Duser%2Dselect%3A%20none%3B%0A%2Dkhtml%2Duser%2Dselect%3A%20none%3B%0A%2Dmoz%2Duser%2Dselect%3A%20none%3B%0A%2Dms%2Duser%2Dselect%3A%20none%3B%0Auser%2Dselect%3A%20none%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dclose%3Ahover%20%7B%0Aopacity%3A%200%2E6%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Evis%2Dbutton%2C%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dedit%2Dmode%20div%2Evis%2Dbutton%20%7B%0Afloat%3Aleft%3B%0Afont%2Dfamily%3A%20verdana%3B%0Afont%2Dsize%3A%2012px%3B%0A%2Dmoz%2Dborder%2Dradius%3A%2015px%3B%0Aborder%2Dradius%3A%2015px%3B%0Adisplay%3Ainline%2Dblock%3B%0Abackground%2Dposition%3A%200px%200px%3B%0Abackground%2Drepeat%3Ano%2Drepeat%3B%0Aheight%3A24px%3B%0Amargin%2Dleft%3A%2010px%3B%0A%0Acursor%3A%20pointer%3B%0Apadding%3A%200px%208px%200px%208px%3B%0A%2Dwebkit%2Dtouch%2Dcallout%3A%20none%3B%0A%2Dwebkit%2Duser%2Dselect%3A%20none%3B%0A%2Dkhtml%2Duser%2Dselect%3A%20none%3B%0A%2Dmoz%2Duser%2Dselect%3A%20none%3B%0A%2Dms%2Duser%2Dselect%3A%20none%3B%0Auser%2Dselect%3A%20none%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Evis%2Dbutton%3Ahover%20%7B%0Abox%2Dshadow%3A%201px%201px%208px%20rgba%280%2C%200%2C%200%2C%200%2E20%29%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Evis%2Dbutton%3Aactive%20%7B%0Abox%2Dshadow%3A%201px%201px%208px%20rgba%280%2C%200%2C%200%2C%200%2E50%29%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Evis%2Dbutton%2Evis%2Dback%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAEEOaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI%2BCiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI%2BCiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w%2BCiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU%2BMjAxNC0wMi0wNFQxNTowMTowOSswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMDItMDRUMTU6MDE6MDkrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOmI2YjQwMjVkLTAxNjQtMzU0OC1hOTdlLTQ4ZmYxMWM3NTYzMzwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ%2BeG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ%2BCiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24%2BY3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6RUE2MEEyNEUxOTg0RTMxMUFEQUZFRkU2RUMzMzNFMDM8L3N0RXZ0Omluc3RhbmNlSUQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDEtMjNUMTk6MTg6MDcrMDE6MDA8L3N0RXZ0OndoZW4%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24%2Bc2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ%2BeG1wLmlpZDpmOWQ3OGY4ZC1lNzY0LTc1NDgtODZiNy1iNmQ1OGMzZDg2OTc8L3N0RXZ0Omluc3RhbmNlSUQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMDRUMTU6MDE6MDkrMDE6MDA8L3N0RXZ0OndoZW4%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ%2BCiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM%2BZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM%2BY29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM%2BCiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOmI2YjQwMjVkLTAxNjQtMzU0OC1hOTdlLTQ4ZmYxMWM3NTYzMzwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4%2BMjAxNC0wMi0wNFQxNTowMTowOSswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ%2BQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ%2BLzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOmY5ZDc4ZjhkLWU3NjQtNzU0OC04NmI3LWI2ZDU4YzNkODY5Nzwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ%2BeG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ%2BCiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20%2BCiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU%2BCiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU%2BCiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24%2BCiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDA5MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24%2BNzIwMDkwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24%2BCiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE%2BCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw%2FeHBhY2tldCBlbmQ9InciPz4jq1U%2FAAAAIGNIUk0AAHolAACAgwAA%2Bf8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAVTSURBVHjanFVfTFNnFP%2Bd77ve8qeVFbBrpcVgRrCRFikFByLxwSAaE32oRCHD6JMxxhhn8G2RxxH3MsOTbyYsmCAxPMmMMYtkIUYmK60OO0qAK23BFlNob0uh3x7WS5jLZPpLbm6%2Bk%2FP9zrm5v9855PF4UFhYCABgjIExBgAgIqRSqRIi6gDQRkQ1RGTB3wgR0e8AHgH4Sa%2FXR%2FEBiAiJRAJ04cIF5Ofng4g2n0gkUkxENwF0c843LzHGQEQQQkCLExEA9ALotVgsUQAQQmgNQhJCbF5kjCEUCl0moj4t5na7fTU1NUpVVVXUYrEkASAcDhe8efOmxOfzWScmJqoBdBNR99LS0hWz2dynNSSEAF28eBGFhYVgjCEcDn9HRD1EhIMHD3o9Hs9kWVlZAh9BKBQqGB4edr58%2BdKZ%2B6JbJpOpBwBWV1fB6%2BrqIMsyIpHIFcZYL2MMra2tY5cuXRrfuXNnBtvAYDBk3G63oqpqZm5uzgrgSDKZjBoMhueZTAbc5XIhFouVEtFTxhiOHTs2dv78eS8%2BEfv374%2BoqpqZnZ21cs5PJJPJPlmWkyynnBuMMTQ0NHi7uro%2BmVyDx%2BPxulwu71ZOlkqlSonoJhGhvb39s8k1nDx50ss5hyRJN9PpdKlERB2aWjSVaEilUvzBgwcORVEs5eXloXPnzk1sV8BkMiUdDofP7%2FdXZ7PZDilnIhw4cGBeS1pbW2P37t1zBwKBikQiUUREWFhYsHHO0d7evm0Ru90%2B%2F%2BrVq2rO%2BXGJiJxEhMrKyhgAjI6OWoeHh5tWVla%2B4JzDZrO9bW5unhwcHGzz%2B%2F32np4e%2BxaDbfoHAMxmc6ijo2O0oqIiJkkSNjY2HBIRmRljMJvNyWfPnln7%2B%2FtPMMZQXl6%2B0NbW9qK2tjYcj8floaEhqKpq%2BHCkbD3PzMwYBgYG0NXV9UuusFna2kEgELAQEQ4dOvSis7PzN41Ar9dnrl27NqCNkv%2FC3bt3zy4tLVmICJxzEBFJRBQmorLFxcWCqqqq0Pj4eO3Y2JhbUZTdra2tL2pra8OJRGLHnTt3zkqS9K%2BhuHU4EhHMZnMoGo0W5OIh7nK5jjLGKq1W69vDhw8rRqMxMjc3t2t5eXnX5ORklc%2FnM%2Bfl5SWnpqa%2B0uv1K%2Fn5%2BWs6nW5NluXNd15e3ppOp1uz2WyzZ86cGQ0Gg6ZAIFCZzWZ%2FlYjokRDiuN%2Fvt7W0tMw3NTUpbrd78P79%2B%2B5gMFgRiUTKHj58WMYYQ3V19etTp05tq6Lp6Wkb5xxCiEfc7XZPM8a6FxcXTfX19a%2F1en2Gcy5qamreNjY2%2FqGq6joRZe12%2B9Tp06e3JY%2FFYgWPHz8%2Bmhvr3%2FCWlpbk%2Bvp6PmOseWVlBS6XS9GSJUkSdrs93NDQ8Oe%2BffvC%2F8fJIyMjddFo9Esi6pVleVjT2m0A8Hq9zqGhIefnjoknT544A4GAM%2FeDbxMReFNTE0pKSpKqqsaI6Pj8%2FLxVVdWM3W6PfCr5xMTE1zllXS0uLn6aSqXAGxsbodPpoNfrn6uqCs75EUVRrJFIZMfevXsXdTrdxseIE4mEPDIyUu%2F3%2B%2Btynd8yGo29RIR0Og26fv06ioqKwBgD5xzv3r27zBjrIyJIkgSHwzFZWVmp7NmzJ1ZaWpoAgGg0WqgoSvHMzIw1GAw6tvjhitFo7NPW5fv370Hd3d0oKCgA53zTQMvLy%2BVCiKuSJH0rSdLmztZytIWv5RPRD0T0Y3Fx8dzWfby6ugopHo%2F%2Fw4mcc8iyPMc5v5FOp7%2FPZrOdQohWInIC2C2EgBBigYi8Qoifs9lsv06nWyIiaFxagXg8jr8GAGxuIe7LBeWhAAAAAElFTkSuQmCC%29%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Evis%2Dbutton%2Evis%2Dnone%3Ahover%20%7B%0Abox%2Dshadow%3A%201px%201px%208px%20rgba%280%2C%200%2C%200%2C%200%2E0%29%3B%0Acursor%3A%20default%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Evis%2Dbutton%2Evis%2Dnone%3Aactive%20%7B%0Abox%2Dshadow%3A%201px%201px%208px%20rgba%280%2C%200%2C%200%2C%200%2E0%29%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Evis%2Dbutton%2Evis%2Dnone%20%7B%0Apadding%3A%200%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Enotification%20%7B%0Amargin%3A%202px%3B%0Afont%2Dweight%3A%20bold%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Evis%2Dbutton%2Evis%2Dadd%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAEEOaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI%2BCiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI%2BCiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w%2BCiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU%2BMjAxNC0wMi0wNFQxNDo0MDoyOSswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMDItMDRUMTQ6NDA6MjkrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjVkNWIwNmQwLTVmMjAtOGE0NC1hMzIwLWZmMTEzMzQwNDc0YjwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ%2BeG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ%2BCiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24%2BY3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6RUE2MEEyNEUxOTg0RTMxMUFEQUZFRkU2RUMzMzNFMDM8L3N0RXZ0Omluc3RhbmNlSUQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDEtMjNUMTk6MTg6MDcrMDE6MDA8L3N0RXZ0OndoZW4%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24%2Bc2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ%2BeG1wLmlpZDo2OWVmYWE1NS01ZTI5LTIzNGUtYTUzMy0xNDkxYjM1NDNmYmE8L3N0RXZ0Omluc3RhbmNlSUQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMDRUMTQ6NDA6MjkrMDE6MDA8L3N0RXZ0OndoZW4%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ%2BCiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM%2BZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM%2BY29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM%2BCiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjVkNWIwNmQwLTVmMjAtOGE0NC1hMzIwLWZmMTEzMzQwNDc0Yjwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4%2BMjAxNC0wMi0wNFQxNDo0MDoyOSswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ%2BQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ%2BLzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOjY5ZWZhYTU1LTVlMjktMjM0ZS1hNTMzLTE0OTFiMzU0M2ZiYTwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ%2BeG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ%2BCiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20%2BCiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU%2BCiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU%2BCiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24%2BCiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDA5MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24%2BNzIwMDkwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24%2BCiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE%2BCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw%2FeHBhY2tldCBlbmQ9InciPz5WKqp9AAAAIGNIUk0AAHolAACAgwAA%2Bf8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAYXSURBVHjafFZtUFTXGX7e9z27sveuMCwYV8ElrA7YSFYHtJUPkaaI0aRqG8wP00zUzljDINNSA%2F2ROtpO24SxnahlxjYd7SSjmUkymcxYlDhQPzHGisEVp8HwYWCVVVgEsrsuLnL74%2B5uqTF9Z%2B7cO%2Fd8PO95zvO851BlZSV0XQcAMDOYGQBARDhX3JRmMDYZwLPMWAzGHACYIgwS46oBNBNwtOL8CwE8EkSEUCgE2rJlC2w2G4go8Zwo%2FbMDgnoG6gxLfAAAYvPDMCCszKTAMIAGAhrWnf15AAAMwwARIRKJgDZv3gy73Q4iAjPjxIr9VVOMRhbAYKB8zvrO0llrfEsdKwLZek6YAPSFvtSu3GtLawu0ZJ6625SHGBQB1T88t6MxvopgMAjaunUrdF0HM%2BP4yv27DMYeJmB1RqW3Jnf3tQX2p0L4P9EXuqEd7PmDp%2BXuMU9sRbvXnnt1TxxACgoKYLVacbzsQDUJGkSATe6qi28uPtzusM6Kxie6NHLGUX3lxVUNX9StPHnn4wy3njuUYcu6n2pNi66avcEXnByP%2Fnv8aiaIyrqz2gO5A9%2B9FI1GIfn5%2BWhZdTAdjFMkwMvZOy7uWnTAOz3L4Yk71m3t69fdfTDoUGTBeHTUfiHQ6lo7Z2OXJvpDAChKe%2BaOCdKRKWxZ2%2B1qb3yyd3GYmRkQ7GQBVs99wfv6on3eR2k4PdTkDEbH7IuS8%2Fsvld%2F561PJS%2FpDk1%2Fbzwx94pze7xc5v%2FH%2BYPY6r5BAkdrJzODTK46lE6PeYEJt7u%2B8j%2BOZwCBiEAgAoNgKJoEQf6PvNvdrXgtZoNhSf7q0KZ3B2AQmVMze0Jmt54S%2FDcDCVig2NcvEUGxJAE4Pl%2BYOr0iv6BRSIPAmBeBZAmHlE2sH4p1uhrq1s0MnnEQMBsf8wRASAICQQCCITN1X7%2FsOuc0kgOVp3%2FfPs2WHv%2BcoG7gQOJUnLGsUCTxEjPzUohEA%2BNfIWUdtx0%2BefzA1kSSkIGyBAQNCKgHAEBAJ3u79U7kiAcWoem%2Fgb5Fd33nrH3kp%2BSMWtuAB%2BGllMJxMjCx9QRgA3uiqL5kwHiTlpxb3smlfMDGYGPP1hcMAkJvs8ScpfdJspdj%2BMK6Pf%2B5%2Bu29vyb4lR4%2BBGEziVESAkEpw6Av1OhUpHCz4qOXbzFWz4Ncdj%2Fv%2Fo08Lt92ODDgZDCEFJYoUGH4mzugP92puPTf0pD3H7wvfdFZdqSxnMtWjoGAAmG9fOLxjwesdjT2%2FXzIQ7ks3sycYMSEwGHNtWf5bkX5NkYCJBxUBXiGV0XHvosOt54Zey33j%2FK%2B8P33%2B%2BvjnbiGJbbLE%2BJ9SANAb6nJ2B79wcUwETAwQQ7fMjPzMvfP8ja87HUIKMOiaAqMZhrGmLdAy78eZrwwsTS0eObTs%2BIdtgVanxBUExqGbb5VzrIISGIoUXsmqbgEhJldCQWqRf27SvPAn%2Fo8XmgLhZsUkR4ll37mhk3n94Z4OlzY%2F7NLcYZfm7o1z2zT4vsvUNSXqprBCkmiTFbPX90%2Ffh8GIT2sf%2BzTPdDMf4dVnNg4z%2BE0ixsGeBs9jd5ViSgLHjCb%2FpeaR%2BMD3d4%2FZJg2llyuG2Vwy7QWAs8PNnn1f7vkGSGxAzE6mk%2Bkxkx%2Fp%2F4unffSCR0hAoL1EBCYiPNdWNcwkNQTCR7feWX6g%2B7f%2FA7I8rcw%2FU6UEe0Ndrhc%2FW7mtL9ztmqlSgstSS%2FzTJ28dalpOpkRryrwbhwBACgsLMWPGDOT4ll3qyeqAkJTdCF7P%2FCrUY%2FGkLL1rE%2B2hTbSH8%2B0Lb%2FWEuhzhyaA905blf9Vd%2F895WnZwLHrPevir%2FcvOB1oLYpTtLrm6oYGIMDExAaqtrUVKSgqYGSKCk0WHq5ikkWEWtNL0imv5qUW%2BRclLRjJsrhBAuH1%2FQL8R7HR4xy5nescuP23E6hOA6mLv%2Bsb4uTw6Ogqqq6uDpmkQkcStorX4XRcM1FjZ%2BkvFFjCJKU1WpkNJJUqIMtX1RyLeX3JtQ0JRhmGYZ%2FL27duRnJycuFGISOJ9pqh5lrB6iYgqGOxRrOaa54DcZmKvkJxk8JHC9rKh%2BKVhOsD4%2BDj%2BMwADIf8n5m4xGwAAAABJRU5ErkJggg%3D%3D%29%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Evis%2Dbutton%2Evis%2Dedit%2C%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dedit%2Dmode%20div%2Evis%2Dbutton%2Evis%2Dedit%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAEEOaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI%2BCiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI%2BCiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w%2BCiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU%2BMjAxNC0wMi0wNVQxNDoxMjoyNSswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMDItMDVUMTQ6MTI6MjUrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjY5OTM3ZGZjLTJjNzQtYTU0YS05OTIzLTQyMmZhNDNkMjljNDwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ%2BeG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ%2BCiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24%2BY3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6RUE2MEEyNEUxOTg0RTMxMUFEQUZFRkU2RUMzMzNFMDM8L3N0RXZ0Omluc3RhbmNlSUQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDEtMjNUMTk6MTg6MDcrMDE6MDA8L3N0RXZ0OndoZW4%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24%2Bc2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ%2BeG1wLmlpZDozOWNhNzE5ZC03YzNlLTUyNGEtYmY1NS03NGVmMmM1MzE0YTc8L3N0RXZ0Omluc3RhbmNlSUQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMDVUMTQ6MTI6MjUrMDE6MDA8L3N0RXZ0OndoZW4%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ%2BCiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM%2BZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM%2BY29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM%2BCiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjY5OTM3ZGZjLTJjNzQtYTU0YS05OTIzLTQyMmZhNDNkMjljNDwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4%2BMjAxNC0wMi0wNVQxNDoxMjoyNSswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ%2BQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ%2BLzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOjM5Y2E3MTlkLTdjM2UtNTI0YS1iZjU1LTc0ZWYyYzUzMTRhNzwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ%2BeG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ%2BCiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20%2BCiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU%2BCiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU%2BCiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24%2BCiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDA5MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24%2BNzIwMDkwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24%2BCiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE%2BCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw%2FeHBhY2tldCBlbmQ9InciPz4ykninAAAAIGNIUk0AAHolAACAgwAA%2Bf8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAYpSURBVHjafFZtTFvnFX7Oea%2BNudiY2Hwam4CBlgQwXdKREDKUoYg0jbRJ29RJ2VZ1mjRFUxSpA3VTfkzJfkQbS7spU6rtx5Z2UtppScjaHxvLuiatWi2jLEoMIUDCh23g2gbj7%2BtPuPvhOurawPl1dc99n%2Bc55z33fV46ceIEZFkGADAziAgAQERoe%2F9ZK4GPM%2FAcgbsIXAcABCgMvkfAqAa89eDoJyF8LogIqqqChoaGYDAYHr8kItS8uc8iIH6iAa9IkAo5EAQX8pqmgUVBCBggYFgDhv0%2FGAsBgKZpICJkMhnQ4OAgZFkGEYGZUXmp%2B0cS%2BCKBwWA0DVRPOg5Zl2q6zaHyJlnVAMQXVTkwHrUqH0Xsvn%2BtdQAAMQDgpPLS2MViFY8rkGUZzIzaS%2Ft%2FxqCzGggtz9e697zsnKhoLUtim4jOq%2FLE6x7X0nsh16dEZ5a%2FO3a2SCAOHjwInU6Hujd6ThJ4mCDQ%2Bb2G232v7v6vwarPbQn8MGlMr%2BX0kpE3Wr5Zt5hL5HPhqYSdQIfKJ%2ByhxDPKWC6Xg%2Bjt7UXD5b5KBt1kCHS85Ljd8%2FOn3NupfnhFaZj4rWff1B98B1R%2FhnUmKd36bdtCNl4g0en4edNE%2FcXwLq8qMTMIPAQwmo%2FWuHvObA8%2B9c58k%2FdKtD0TyZWXN5YGA7ej7epKxspM%2F%2F7SoNOdWc%2FJyq2wiwhDzPxT8cP0jys3VMM7OmL0%2F77zn4Ydui3b8uiK0jD7RrA77c9Wd57cefPpF%2B2T6bWsFPWkaiPTCWvTsZpHFU%2BXrS%2B8G3AR08F6X%2B1FJvBxQQzHQOWk2SmrW4FPX%2FU2LVwPuDZj%2BfJKl2khPpeyAqA9rzR%2FYqwuiWXX8taN%2FCabGkrVuq9YJlkQQDjOAJ5jAhz9Vt9W4N5%2FrNp8I%2BvtMV%2FaZm4zLnUNNt0urdYnF68HWoJj4Wo1mLGUNRr8LEgDgNqeCh8xQIKOsgC7iAjVe83rT9zQa8uNM28u70kspessu8q8zq%2FV3NcZpVzb9%2B0zmVhOvvvrhaMVzrJg0zeq7xMVCCwdpnWSGBqjUyJwLTFgbvxie3w31uoWR1Y74r60rdxZqrR8q85t2W2MGCp12bm%2FKC3hyaSTiMhxuGrKcahqpbjOaDOoEhOEoFqJQCCJvqA85I6bfTdDjQlf2lbxVNlS6wt19yy7jRHZZlDnrinNj%2F6sHMhnNw2Ogco7O79e5fm%2FxQywRBBCEAuwn4gQ96bkYj4Vyuq9N1Z3Bj4Od5bs0MXt%2FdZZ21ctiqFan174q985P%2BLfp%2BU1g7XDON%2F1ctP458WlVjLyJhOISZE0wM0S1QfuRC3lTjkJAKKEtNC9eIOhSh9xHLZOJRZTFuXDsEoStLkR%2F768ummsaJG9Pb9oe%2B9J%2BxaeSVokiQDSJphAo5uaBuWjiKP4QTqS1cUWU7ayesN66wu22frD1vmVW6GW6T8u9eVjGyZzs%2Bw78Nqu0a2mbvVu1KEJQAgeZRL0liQYyx%2BGOmKeQpu0rMYsAJPNEFGD2dLodLIy6c9Ys7G8yeSUl3tf2%2FX3rcBVJSOv34l3sCBogi7z1LH%2FrBHjl4IJ93%2FncQFAnjeImJD0Z8zuCwu9q3djDXqTlAKID5xv%2B9t2R8n8VcUFBljQ8Gyfe40BYBM4DwDLt8Kue79ZcFkbzfEdbUbv%2BoN4c9KTtsfm1MbYQqqh%2B2zrVZYKs%2F7Ef%2Bbyimt1POYiJhDhPBFBIiIEXhxfs7%2FdfYoIF%2BauBfYTE%2Fpebx%2FV8hqBP2ODvD34yvuh%2FWCAmU75Bx6sIgaI%2Fv5%2B6PV6JLqUsYr7dpDAoehs0h73pHTWrvKgThYbRSt9UmSjef3MpaUvBz4O72UmADgTOPJguGiZor%2B%2FHyUlJWBmJFz%2BD8xTtlUiOpbwpmrmrweeSXrT%2Bg11k4SBN3RGKUcAVCVdFhyP1nreDbY%2F%2FNPyEXUlU%2FPp4XYycGT6V0Ux2WwWdO7cOZSWlkII8diX7SPPNgDaKdbxoNAxwATBAEkEEgSWCEQAqPAMwqvMdCEwMO0tVqZpWsGTT58%2BDaPR%2BPhGIYQAAAgh0P7B3ioW%2FB0iGiCGiwXbCuOHFSJys6AbYFye2T%2BxWhT3WYJEIoH%2FDQBMw3kes8OJPgAAAABJRU5ErkJggg%3D%3D%29%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dedit%2Dmode%20div%2Evis%2Dbutton%2Evis%2Dedit%2Evis%2Dedit%2Dmode%20%7B%0Abackground%2Dcolor%3A%20%23fcfcfc%3B%0Aborder%3A%201px%20solid%20%23cccccc%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Evis%2Dbutton%2Evis%2Dconnect%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAEEOaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI%2BCiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI%2BCiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w%2BCiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU%2BMjAxNC0wMi0wNFQxNDozODo1NyswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMDItMDRUMTQ6Mzg6NTcrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjlmYjUwMDU0LWE3ODEtMWQ0OC05ZTllLTU2ZWQ5YzhlYjdjNjwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ%2BeG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ%2BCiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24%2BY3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6RUE2MEEyNEUxOTg0RTMxMUFEQUZFRkU2RUMzMzNFMDM8L3N0RXZ0Omluc3RhbmNlSUQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDEtMjNUMTk6MTg6MDcrMDE6MDA8L3N0RXZ0OndoZW4%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24%2Bc2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ%2BeG1wLmlpZDo3ZWRhMjI0MC0yYTQxLTNlNDQtYWM2My1iNzNiYTE5OWI3Y2E8L3N0RXZ0Omluc3RhbmNlSUQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMDRUMTQ6Mzg6NTcrMDE6MDA8L3N0RXZ0OndoZW4%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ%2BCiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM%2BZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM%2BY29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM%2BCiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjlmYjUwMDU0LWE3ODEtMWQ0OC05ZTllLTU2ZWQ5YzhlYjdjNjwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4%2BMjAxNC0wMi0wNFQxNDozODo1NyswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ%2BQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ%2BLzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOjdlZGEyMjQwLTJhNDEtM2U0NC1hYzYzLWI3M2JhMTk5YjdjYTwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ%2BeG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ%2BCiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20%2BCiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU%2BCiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU%2BCiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24%2BCiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDA5MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24%2BNzIwMDkwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24%2BCiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE%2BCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw%2FeHBhY2tldCBlbmQ9InciPz4ubxs%2BAAAAIGNIUk0AAHolAACAgwAA%2Bf8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAUtSURBVHjajJZ%2FbNT1Gcdfz%2FP53PV6B4W7VltLqdAaplIOiMOoyxxJCSs%2FGv%2FyB4gzJroAosmmDklwkYWR0bQsdmkykoojTpcsWYLxD%2FlRZdMQkTHRtkLZRqG0tIVe7662vTu43n32x%2FVKZ%2Fjh89cn38%2FzvN7P5%2Fl88zwf2blzJz6fDwARQUSm1n8s31CM0%2FVAnbNmsUPuAsDpgEO%2BBg4C7%2F%2Fiyv5hvmMiQiqVQpqamvB6vVNwEeG1JZtCBrYi%2FMrkAwDNgjhwAlbzICBLA0rDb0%2B%2F839C6XQaaWxspLCw8Dp86cbNmqVFJQddE6KzdjZ9D89g%2BB6fSyCOcyn1nxil%2BO9xKg5HqWFSHGXLjrP7W%2FICqVQK2bNnDz6fDxFh65KNvxbHDhF4rJj2bXPo%2BIGfcW5h5xL4f99P%2BFCEMIAob75x9t0dAMlkElNXV4e1lteXbNqiQoMaeOFOjrdU868SD2luYyEP6dUh%2BsYmSHeOU6GO5Z8VLx5%2BNNZxIpPJ5AS2L3upROCoCvz8Lo7vnkf77cAHhpiz%2FzIL9vWz8L8p%2FNvupmM0Q7pjnAoLqz8tDrc8MnQqYVUVhVdF4LEg7b%2BrvDn8wDDlH0WoPpukLJImSBaMwjcJqmwWts2jPZLG%2F8kwYVFeVdXXZcFf4yVDc2cNKfBFmD9X%2B0ncCP58F48eG%2BFeo2CAUkvs4dl0V%2FuJvdXLiiV%2But%2B%2Bn7YLSfxPfMMG54ChzB3WIesVWB2i82bw1AR6fJR7C4VsfYiv6u%2Fk3A9nEgP4zXke8DiYHyAOMK%2BQxPIgnZ9GqSHr1itQJ8DK2fTerDQ%2BS%2FbHRXQJaHSCwNIZ2Xh%2B7%2BS3VAmwNMBA%2FtuPZtErgKquUmdMWIFlRURvdamRNEXGwIWrlP47pTMzLiunxghGMwTLvcTWlHAp77s4QNSrYMQtss6ZMgWqCm5cHoDHO1nbk6K8zEN8%2B3zatv2Hn1b59EqJZdxmYUERg9P9KwpIiAOTdWUWBXuLzB%2FvZG3P1Un4PNp2d1MbmyD45TWCxuCsQm0x56bHGHFYEZwxok7toAA9Sfw3hCcoL%2FNOwi9QO5wmWO1j4JEgZxTkodmcWRGkf3pcX0r8xoAaBixKu4U5%2FxwndM%2B0tpAvS6mP%2BPZK2nb1UBvPEKwKMLDvPj4ESGc55lGy303sdJKQdZB2rkMdctAB%2F4gzN%2B%2FQ2ENNd4LyUi%2FxN%2BbTtquX2thk5nk4wI3gAF%2BOMNcA1nFQDfK%2BBY5GqbkwWabTY5QZhXWlnNx1ntrY1Rz87fuvw29m%2FSn8J%2BPUGAFj5T19baA1IspuBZp7cx1x4SwG1cEf%2BlgRSROs8jGwb%2BHt4QB%2FGSSsAhYano39LWIBxNEIbP14hPDuiyS2VtJuHXQlKKvxM%2FjiXDq%2FD%2FxPlwifGMkJZB2NIoKpr69nxeiZxLHicFSFVWfGqBidIP3LSjrWltD94CyufF%2F4kQgPuVz2Lz93%2BdDRa9eu5QQ8Hg8%2FiXee%2BDy4CKMs7xqn4nwKz9IirhQqmVuB42m8ey%2Bx7LMoD6iAON782eChhqmRuXfvXgKBAKqKqtI0%2F8nNKrQI4BVYXkzHgzPpC88gWuHL%2FcaXrhLoGiN0apSKr0ZZRBZM7q2w5ZnLR1oAnHOMjY0hra2tFBQUYIyZmstvVT1Z6eDlAuEVq7merxmwueNPDXy9PvybjKP5mctHLk4%2FXTKZRJqbm%2FH7%2FVNw1VyEMYbW4FN3WNWnnchKoy5sHeVGBRX6VWi3ymFx7r11Ix8MTX%2Fy5C2RSPC%2FAQB61erowbpqSwAAAABJRU5ErkJggg%3D%3D%29%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Evis%2Dbutton%2Evis%2Ddelete%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAEEOaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI%2BCiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI%2BCiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w%2BCiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU%2BMjAxNC0wMi0wNFQxNDo0MTowNCswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMDItMDRUMTQ6NDE6MDQrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjc3NDkzYmUxLTEyZGItOTg0NC1iNDYyLTg2NGVmNGIzMzM3MTwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ%2BeG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ%2BCiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24%2BY3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6RUE2MEEyNEUxOTg0RTMxMUFEQUZFRkU2RUMzMzNFMDM8L3N0RXZ0Omluc3RhbmNlSUQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDEtMjNUMTk6MTg6MDcrMDE6MDA8L3N0RXZ0OndoZW4%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24%2Bc2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ%2BeG1wLmlpZDowNmE3NWYwMy04MDdhLWUzNGYtYjk1Zi1jZGU2MjM0Mzg4OGY8L3N0RXZ0Omluc3RhbmNlSUQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMDRUMTQ6NDE6MDQrMDE6MDA8L3N0RXZ0OndoZW4%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ%2BCiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ%2BCiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM%2BZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM%2BY29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM%2BCiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjc3NDkzYmUxLTEyZGItOTg0NC1iNDYyLTg2NGVmNGIzMzM3MTwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4%2BMjAxNC0wMi0wNFQxNDo0MTowNCswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ%2BQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ%2BLzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk%2BCiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOjA2YTc1ZjAzLTgwN2EtZTM0Zi1iOTVmLWNkZTYyMzQzODg4Zjwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ%2BeG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ%2BCiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20%2BCiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU%2BCiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU%2BCiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24%2BCiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDA5MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24%2BNzIwMDkwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24%2BCiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE%2BCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw%2FeHBhY2tldCBlbmQ9InciPz4aYJzYAAAAIGNIUk0AAHolAACAgwAA%2Bf8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAYGSURBVHjalJZ7UJTnFcZ%2F73m%2F72PdJY1RbhoQp6lkXRAvmIYxdCUadLVOozPNtGObap1JsKipjiShbdoRbeKEiQHpQK3xj0xa03aamTbaTGyAYV1QGeqFi%2BJyiZFLAlmESBkWRmS3fyzslGkmnZ5%2Fv%2FM873Oe75zzvqqoqAibzQaAiKCUAkApRdHIK%2FNFsx2NR91nOSILADDoJyzNaM4xxbtvPHh0iC%2BJiYkJ1OHDh4mJiUEpFSXPv%2FziPC28TIiXDCOSrAClQDSEpsCwJPIhrEBRQpiSytXlQwDhcBilFPfu3UMVFxdjt9ujFTzfcLBADCoEEAFr1ZbrrNjch2vtEImPBgHob7fTcWE%2BbVXJNJ%2FNiFQlEGLvieXHKmYqGB8fRx05cgSbzYaIsPvywV8pKFaA7fGtLTzz61YWpo%2FxVTHQbufsq5lcez9zWuWhk5mvFwMEg0H0%2BvXrMU2Tn1wp3CtCiQ5DjGd3A%2Fm%2Fv8IDCZP8r4iNmyRrWx%2Fj%2F5qktykZpXKzAjVDVxPzGqemptDr1q1jX3NRnIJarcDKK2hgR2ULXRfncv7UYv7xpovhnhiW5Mz%2BkefeSKO6LJ1A1xzEuk%2FOjm4mRibpuZaMZW3OCtRUND60NmiICCIUShisx7a2sLMiQn4s77uEQgIabnqdfHIlgT1%2FqQeg8vs5dHhdCNB1wYn3RIiC995j26stjAbsNH%2BYiZJCESnS1Y%2FXxIXu8r4YIPv%2FVkVs3CTnTy2ms34xro1%2Bsp9po6sxlTu34ultmsPVvy6is86FCHgO%2BDDs49zpjufBpCG%2BseYOC9OHaTidieicb9ouVAhKtouAseI710ma7pLuqwmgYfHqAFt%2B6WdLoQ%2FLBl11Lm7VudAa8vb72PCin9TlAWIsGGhLACD%2BkSAZnusYBii1XQAPYWDllt6ov2lrBkDBR2%2B6Ofuak2%2F%2F3M%2BG%2FT4wAAPW7fPhKfRTVeqk9qQbFKRmDUTxS3N7QYGYmwzCkqklBGlPDEcTNv%2Bsg9tNCbTXuvBWujE0bHrZj9JE1B%2FwU1Pm5PwJN6YBS9a2kVvQEcWnrh5GTFD3lxkYkqRMgYQlwVldUvDnen73LHTUuqitdKM0eAr9AFQfd1J%2Fyo2aJn%2B2sn4Wdn5qEFODJskgBIjx5T0uCrQA08pnIjS9PERDjPnfOKXAMEBECUoGEIHBj%2B2zkt76UQ6dXheGAev3%2Bcg74Kf6uJPqcicbfuond7cPy4SOiy7%2BtD9nFvZurx00KOk3CNEC%2BmE%2BvjSPBc7IWqgqTaPT60IMcO%2FxsXGa3HfKjRgRdbl7%2FKDg0jtubje6aHj7c7J3dgLQ2zoPwwQ91SooOQdAW1VKVMHty0kA5Bb48BycJn%2FLjWFGbLv4thvvb53kFvjJ%2BXEdWkPfjQVR%2FCcNKYgGMc8JWt5Fa2j%2BMIPPuyI2pa4IoHSkt6vLIuRaQ9q32khzt4GCxtNu6k46GeiIR2lIfDQQsafPzq1LGRGL9Gk9d%2BvrwewvfHPQOoexQVjxdB%2Fauk%2FzmaUMdsfz6bVUtIalT7bxveP1ZHh6GPDPYeSzeD69kcpIfxymFWLNrka%2BljhBTWkWwz2JiJT84YHnz2iPx0P20PkmRF5i6HYiwZFJsn%2FYzdezbzE3cQibY5xV266z6RfXohakb%2BxB9CjanCD9qTbW7Grk4WV38VZm0l6dhQiEw9taHSuDqrS0FIfDwXM3X9mHMsvRAk%2FsauDpQy38P%2BGtzOTGB9mEpkD0C2dS8n8zOjqK9ng8WJZFU%2BJTjasGvaCNXPpvJBPoMlm0OoDNMfWVxONfWNSUPUZ7TUQ56tCZlPwSgMnJSVRpaSmxsbFE1raw82ZxAZZRQUiBYUKGp5UlOX2krBzmoUVjiIKhHge9rfPo%2BWcy3ZeXIYASgL1%2FX5RfMXMvj46OosrLy7HZbGitUUohIuzoem0RofALaOsghgWGjky0MiJTL8b0lOvI8hN1DKXKP0jd3TNTWDgcJhgMoo4ePYrD4Yi%2BKmaeLlprnrtXFo9h%2FAAlG1AqE8yFmBrC%2BjO0bgH9EVpO%2F1F2Dc5g%2F%2FOAsbEx%2Fj0Af%2BUSsQynL1UAAAAASUVORK5CYII%3D%29%3B%0A%7D%0A%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Evis%2Dlabel%2C%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dedit%2Dmode%20div%2Evis%2Dlabel%20%7B%0Amargin%3A%200%200%200%2023px%3B%0Aline%2Dheight%3A%2025px%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dmanipulation%20div%2Evis%2Dseparator%2Dline%20%7B%0Afloat%3Aleft%3B%0Adisplay%3Ainline%2Dblock%3B%0Awidth%3A1px%3B%0Aheight%3A21px%3B%0Abackground%2Dcolor%3A%20%23bdbdbd%3B%0Amargin%3A%200px%207px%200%2015px%3B%20%0A%7D%0A%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dnavigation%20div%2Evis%2Dbutton%20%7B%0Awidth%3A34px%3B%0Aheight%3A34px%3B%0A%2Dmoz%2Dborder%2Dradius%3A%2017px%3B%0Aborder%2Dradius%3A%2017px%3B%0Aposition%3Aabsolute%3B%0Adisplay%3Ainline%2Dblock%3B%0Abackground%2Dposition%3A%202px%202px%3B%0Abackground%2Drepeat%3Ano%2Drepeat%3B%0Acursor%3A%20pointer%3B%0A%2Dwebkit%2Dtouch%2Dcallout%3A%20none%3B%0A%2Dwebkit%2Duser%2Dselect%3A%20none%3B%0A%2Dkhtml%2Duser%2Dselect%3A%20none%3B%0A%2Dmoz%2Duser%2Dselect%3A%20none%3B%0A%2Dms%2Duser%2Dselect%3A%20none%3B%0Auser%2Dselect%3A%20none%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dnavigation%20div%2Evis%2Dbutton%3Ahover%20%7B%0Abox%2Dshadow%3A%200%200%203px%203px%20rgba%2856%2C%20207%2C%2021%2C%200%2E30%29%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dnavigation%20div%2Evis%2Dbutton%3Aactive%20%7B%0Abox%2Dshadow%3A%200%200%201px%203px%20rgba%2856%2C%20207%2C%2021%2C%200%2E95%29%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dnavigation%20div%2Evis%2Dbutton%2Evis%2Dup%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAAAgY0hSTQAAeiUAAICDAAD5%2FwAAgOkAAHUwAADqYAAAOpgAABdvkl%2FFRgAABphJREFUeNqcV2twU9cR%2FnbPlVTHxpKRbNnBLyEbPyJisLEcPwgwUMKQtjNJAzNJZkgNNJOmJaZAaDKlxaXDTIBAcJtOOzSYKSkdiimhAdIMjyT4bYgBYxA2BgcUQPLrCiGDR4qt2x%2ByXTASFt1%2F957d7zt3z3d39xDCMQWUfgAz%2FRI%2FT4pSTAJpAGL8rECAXX7QFQGq9wOHOxYO1oCgjAdJj1wtB095Giv9TFuZAIWHAziATMPhTAwiHgUkYPXFJu92lMP%2F2MTpB1AKUCVEgNAcleUo1M%2B2F8TO6crSTncb1QleAOj2OTSX3Ge1p%2BVa42m5JrnzbnsCE8Ov%2BEHgpa0LPLvCJjZ%2FwhuIlN8wAcXG%2Be1LUn9hm238QU84p1Ld83nsXvuO7Lq%2BLzKYGAT6%2Fdn58m%2FHJTYf4O3EShkT8Irpzab1Uz9sGevT5%2BtWn%2Bj6NB4A5hp%2F5NSr43xjfd5rW5tT9e3OAhCBiCua5%2FWsDEls%2FhdvYklZSwDefmrT8eXmtzuDkb5YZ33p9ndylICAVjWxf39xw%2F5g5Luv%2F9H84ZWNcwNEypZT87rXjqyJB85UYDMJYN3U7UdLJ6%2F6JlgqV517teRqf9uTlug8e1zEk27HgD22o98WsTBh8fWxvjm6ApdONbGvse8LM5NUPOm1Cfabuz3nACAgxX0QEFTJAnjNvLJ%2BSepb14KRHnN%2BEv%2B1XJOhZs3Qu1mbG97J2NQgsXroa1dtxrGuf8cHi1mUtPTay0lv1DMJSCRVLtoX%2BFgGgDQNysBAcez89l9nbbsQSji7rlXkEhjPxb%2FQatHOcFu0M9zz419oFSRhj%2F3PuaHiyqasv1Con9NGxHAYUsoCxAqImbYSgCWmFbZQwdsur7N0eC4m6tT6%2FjUZ750Zeb82c%2BOZGLWh%2F2p%2FW%2BKfrmy0hIp%2FaVKpTSIJEqu2QgFx2iE8CwDp0RbH7Ljng%2F4yXr%2BXT3QdyhYsodS0slGr0g2OrEUK7eCrKW82SqzCVz3%2Fyfb6vRwM4xn9rN7JkRkOQRLmfJn2LBPxQjDBqp9lD7XbX7X8pKTP160zR2bdeiX5jYeU%2FnLSTztNkem3XL5eXbltRUkonBxdgZ2IIUmahUxERQSCVT%2BrK5hzQ89xQ6P8VaaK1f5VmRvqQ4G%2Blba%2Bnlnlb5brMhvlk7FBiaPzuwQEmEQhg5BOxMjWTncHc2501cQLkjDTsMCWpyuRQxFP0xXIJfp5FyVW4Zy7KajC06ItbiIGg6ZITBxDxIgbrr1jTSM0fibGIHz8O9sKK0GAibEua9spANh4aY2VmcEg%2BDEkiBgR%2FL2hYFgGtcErkQQAMVJgBxyy9hboZzv32v%2BKpr7qbEECTAIMAoaJa3qPTmNiiAAgJAjk6J5xhu6HDAIgQYGLmI29PocmMcI8MNYvT1ckfzD9H%2Fub5br4e4Me9WfOKqtyX6Ud2cwC449PRamifDm6Auc0rTXokci%2BXo1EAgBckiDuYGLjpTvntcGIA%2BSFcp6uUAaAI879VhWrRteYAqn%2Fedq758brXJ1327QMhgJcZjA3EBjNrgZjOG1PkAjyTGENMjZPq5ECQ0MDE9ERBqFZrk0OJ3i4x%2F7vyIjBxGERt3takgVJEAp9xq3f769WiPDNvSsJdT3HDOEASPelmoBRYT3Kzt5uMtwauJEgSOCpwrk1DIJCoNUMwj9v7MweP9XSQ8%2FhJPp496fZTAICvLqcyv2B7nRbrgCA03JN5h8ub7A8VqpB437xHvsOy3l3cyaB4L2uqxhti1WLMcSgZQCw7%2BbOooO3Pk4JBZIYYXISMV5sKH59UePM10GESRGpIf%2FbE92HU452HywSJIGIllctrhp6YAK5%2BfHds0lLtJFMXNwkV6fFqA29mROefqiMJj1h6um4a5vY%2F92dKGaBxIhU5zJTWW2cJmEgGOmeb3c8FxAfb9mdf2RzyGGv5MvU7QwuEySwKHFp%2Fc%2FM71zA%2F2F7b1RajnYdLAqMukMVu2YcfmDYE2MD7H%2B7%2FXlq6cRIJqm4zXM%2Bqd3TGjVBir43KSLlXjiELe5TsX%2B3%2FyW%2FST45PaAHbKmccWh12AP93JNZywj0kSABIobpiXRHjtZ6faout2tyZMadGLXBCxBcvl6NfaAz%2BtKdFmObpzWl2%2BtIIBACYy0t%2Fyj34M7HvsKUK%2BCGassvicX7alYDwwq%2BvykIEqPVa%2BQ9gdYk5%2BV%2BUE7lj3%2BFGbuBM%2FX5JUT8QwIVSSSZiTgmoFR2MfiqYFFPfjpkyrfWPopwxP47AP1pK1g9%2FdqeAAAAAElFTkSuQmCC%29%3B%0Abottom%3A50px%3B%0Aleft%3A55px%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dnavigation%20div%2Evis%2Dbutton%2Evis%2Ddown%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAAAgY0hSTQAAeiUAAICDAAD5%2FwAAgOkAAHUwAADqYAAAOpgAABdvkl%2FFRgAABpdJREFUeNqcV21QlNcVfp5zX9ikoAvLEsAIIgsoHwpqWAQUNKLNaNv8iZ1JMkNG6%2FQj%2FdDUyCSTtCHpmEkwVk3TToZRMjXj5MOG2KidjIkxQYSAQUAtX6IgIN8su8KCoOzbH4sk4q5g77%2F33uee555z7rnneYmZDB2MKcJKlyYbqOsZVIgGEOgSHQoy4AKbFFjqAo5dWn%2FrNAh9OpO852oeJHYxtrmEu4WALhMbxG2ZE9uFAlImDRLY%2Ft%2Fy0b3Ig%2Bu%2BiWOKsAlgIZSb0OIf15kWtKo1NXh1d5xxiSPEN2wUAHrGOg11jirjWVtJyFnb6YgrzoYwocClu0DI5guPDb43Y2LLp%2FIaqf9JCGSErGvIifxd7aqQn%2FTOJCvFvZ8Hf9haEH%2Bm%2F6sFQgHBv1Sts%2F15WmJLkeyl6FuFwFPzny1%2FZdE7Nfg%2Fxhv1uUmH2w6kggQp%2Byqze7d5JbZ8Im%2BKpucSwI6EN7%2FcYtlxZarBCts3ptfrtq9odjaGKihE%2BsV0vRC3u8RqWmmbij149W%2BWd5p2rnET6bsqsntyb6%2BpO3KqkE8FvLxo74lNUX9s9uTJb8%2F9fG2L81KoogJFYfCm3b9usNq0MXxzw1RsUkDqQICPqf%2Fb%2Fq8sQi3j4WdmtV47OFgNAO6r%2BDEUFAtFAc9YtpXmRP6hxVsI24cvhyoqnFtrK6jM7isgBa3Dl0O94TeGb255MvzXpUIFjVrhxo%2FdzgoARBuwFQJkBK9reCnurxfvXX8CRW3yW1G749vT2Br7ysW0oNX1pKDTPG%2Brm1gHRbibAHLm%2F7522sKnQCZqFgCUaBCqaS%2FbEw9vqtWoQROf3dBBiT6KTACImZ3YueqhDdOWjDbFQ4IzIl4elNUX5begU1HD6lPRmULKeghhDcpqnUmZuD3%2BnkgTH6gZEE9ctlZSoGmG9UIynSCsQVndMyX%2BIZGiBoHMjHh2SreCglClaSBiSEG8cYnD24bv7CWms%2F3FocO3hnw13plTggAFb196NdlPM44tC0zrSg5ItXmyEz070UEKCMRqQgkkBQ9NvL2eSJ%2BrevoJTORSpoT6do4%2F7%2F7UShBFHQexM%2BHdfyUHWO8iN%2FuaRzX3%2FQjUSLlnqM72F4cCRIY5u9Zf%2BY%2BBAv4AvzpkQ7WAIBRujA%2F7Vg6cia9xlId6InafVEAAGnQMUCSkb6zTMPdBy8hU3JjrphIq%2BCrD%2BMvxeyumrr%2B4IH9y7o2GF5eDghuuGx4L2zbWZ9Dc0RoQRbkkFNRdP2%2F0BH7EtLJLKCjr%2Bzqh2l5u8haZ847vTBW24kRFQXKAtcsT5oqz3igQENIoECkjBJUDZSGewBlBj%2FammjLrdX1c%2Ft70ero34gMte9IByLLAjPrUwKweT5jawQshdIuGMiF5XEBU2koivBl9NeEfJeYHwuxtI81zPrn2z6ip60c6DkV1jLTOCTaE2HNjd5Z4s9MwWBOhqEHp%2FI9cWDtUrJNoHm4KO9P7hdnTBoMYXI8Gb6gVCg63FS53jg9O5tA57tSOdHywnCAygrJrfcTgUe5U2cvNHSPtYYoKCWlrTgsIneB2AfFR%2B4F4b6f9ZdTzF6P8Ytud407%2Fdy%2FnL7k9X9i8J9l5y%2BEf6RfbnjPvWa8N5suez%2BKFCgqyPY95Lnd3stv2AcBZ2%2BmFbze%2Blui1xc3dXCUUlPafXNx4%2FaKxcajWWNp%2FMklRw8%2FmPFntbd%2Bh1oLE847KhQQxejVg36QQqD0MPTzHv42Ux%2BuGasJNBnPfwllJd71kkX7RQ3WDNf7dox3BLcNNs6vt34bbbvYHJhlTGp6O%2BJVHb0%2F2HJtX1PH%2BaqECqG%2F5YN1nlXcokGvvO6vCc4x%2BQskotxVHB%2Fqa%2BxbOWuzw8NB3nuo%2BHt0z2hHsuGU3GrWAoZfi3jrxgHpw3BPpobaCH7vbqOw6mHI836vYW3Eqcq9AtioqbJy7ufQ3lhfu8sR%2Bs9%2B3vL8klACsQSu7AnxMY1MxH7YXJp7oPpLulrrj%2B9575Ni2aeVt1teWfEWfHQLCaspseHzOU7VWU%2BaM5G2NoyL4i%2B6j8XWDNQsmGsKu%2Fcv%2BnTtjQb%2Fmm7hfENyvqEAK5v8opjPJaL26KGBpd5TfguuBvuZRgBgY6zO0jlyZXXe9JqR%2B8MK8ntHOMHfHIkhu2b%2F0yIH7%2FoXJ0yFlxYnPUdRbvuILgO7%2By%2B91l6Ka6M%2BcnCf4fMSypXvymHf%2FvzBTD3CuNGUFKT8lmK5Rs5ASqKiBlAGBXFaiSuni0fkp1pJ7Ed4e%2FxsAqLk46EWsG1EAAAAASUVORK5CYII%3D%29%3B%0Abottom%3A10px%3B%0Aleft%3A55px%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dnavigation%20div%2Evis%2Dbutton%2Evis%2Dleft%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAAAgY0hSTQAAeiUAAICDAAD5%2FwAAgOkAAHUwAADqYAAAOpgAABdvkl%2FFRgAABt5JREFUeNqsl2lUlOcVx%2F%2F3Pi9DZRsGBgYiS2RYBQKIjAhEJW4pNrXNMbZpWtTGNkttYmJMG5soSZckRk%2B0p%2BdYPYY0Gk0ihlhRj63GhVUgBhDD5oIOy8AAMwzD4lCYtx%2BGqCQKuNyP7%2FPc%2B3u2%2B7%2F3JUzEZFBYLh62S7yIZDmVBEIBqOwsQ4DNdtBFASq2A4cuZAwVgCCPF5LGHM0Chz%2BE1XamzUyAzCMO7IhMI%2B5MDCK%2BHpCANd%2BU2rYgC%2FY7BoflYgVA2RAOoNYtyjDTe45%2Bhk96e5QywaJR%2BNsAwDhocK61VCjLTYWaclNB0OW%2Ben8mhl22g8C%2Frn7U%2BuGEwdov%2BC0i%2BQ0mIFWzoD7zwVU1czQ%2F6pjIreR3HPX5VL9jalHXiQgmBoH%2BXLHAtH5csDaXtxDLLzIBv5jyfOmG2H9U4S7snbpX43KaPpgBIhDx1rPzOlbfPC5GQT%2Fnd1mS1zABa6PfPf5y5F%2FrcJeWpp7fPkly6f7KXBRCoOSATFfXll19x74HDsvFCghsJAG8HrvlvytCXm7EPVqc5wyzp5NX15muE1omKXXyMnd9yy5r5Q3wPghvJzrLAlimXV38%2B7D1DbhPFq1M6O4b6rPVWKsCBfHi5EWWv9TkQBYAEPpLvERMC9N8FtRvjt9dPl6wwo5jPvuas7WV5jNqEjz8wA%2BCBsaan%2Bw9x1hrrXJtuaZX97ooLfqPLCUEGRR%2BiOwAsF2X98Uc30W3fb02u41frVqeVmo6FUkkwCAwCWxJ2Ls%2F0TPFNBb8TNdp9WvnVz4OAKdmX2QOzcMsAAjziDGMBd3asCF6SXHyknJTfqQTK%2BzpvhnVKT5zawCgzFTgN94pJXvP7gxxjTAIkpB%2BMnSWRMQZYEDnPVt%2FK4ejbZ%2F77726Lb6h95tAAiPELaJ1bcTbRfGeM8xv1azWSeyEa0P9igk%2BNr1%2BoNFfkpwzJCJKIQA679ntN08yDXYo3qh%2BLuUrc0E4EcNL4dP7VNDzpU8FP3vpekoQQ5CEw4bPdEfa9%2BsAgEZUmkmAAAS5hLQ9p11XGO%2BpM8V5JLUfMeQARDMlEMKIGFOVCZYb0C7Fz0oeXmIZ6nZzYoV9od%2FjVS%2BGbahUOnn9b7T6sEOviUGyA8bMDlUa0W79wBW%2FbZf%2BlrY98cDBUI8YCxGDgHCJiVVEDN8R7QWAE8Z%2F%2B1mGut2i3eP1r0S%2BXRztkdBzq6NbF7WpbF3UprKxjvfHxbrfttla%2FQBArVDbJJIAQCURMRg8ugrKIAKBSNxzHtN3VdmxY0iQYSZmTeegwTlgknYAAB7RZBh2Nm7urbeeC1r19ROT52kWn3shfH2Fu1AO3RxjY%2F0fdac7%2FhPPJMDE11GC%2BHpBJmIEuAS3Oa6w01lybMbMgvgCE6O255zy24DeCr%2FBvckn9%2Bu8ZjXYIYvjxoMJy8oeXZrT9GHIqMWTwA2oI6cFMeDIcAiSEOyibXsmZG0hAFzuq1OyY6xBAnMJgdPOmks08zU%2FbbsB9x18P37PqS%2Fb8%2Bo%2Fa96ZcLm3PmBH46Z5x40HW1eFvl4Uq0w0MwiCBOb7%2FqTsd6GvVY537DXWas1Iw1AiNJnOgwJi%2BbXhAbE08OnvaXSIW0TvYw88eaF%2FuM%2FWNdju3m5r9TlhPBzVNNDoPGC%2F5tRma%2FGJ80xqjPPUjVuvP2narrMOWd1Jlv%2FE1fN782UiNPZf9C%2FqOKa%2BndOz2j%2Bcz046sn%2B6KrVOsODirpOxld0lUxmEBK%2FktvGgFd2l6taBZn9BAtEz5xYIvAn4%2F8rFKkgstAyZ6Yf%2BS67ezlkiSU73XXRV6xqh93TyssR4JF75efBvymLdE03jgT%2FWb5tutLWpGbTm7wHZxQQAT%2ByDuKLyHRIk4cnAZ4pfCF9%2FHvfR9uh3xBxtz00BANsVDylnac6wAICaHMiBmW5NRLy4trcq0MtZ3RnpHme5H9AvjYeCc1t3pzMJgOSVnyw4eHZUB9Kyu68iMFPpysSppab8UJVC3Rnp%2FpDlXqF7mnYsdKQbv7cr6fDGW%2FZczbt6jgUtV6kIlFxuyg%2FtH%2B6zJXmlGe8G%2BmlzdsyB1j3pTAwZ9q3%2FSspbc9tmDwD0H3UffXCFlyuTlFpnPRdYb612c5c8%2BidPCu6fCLDKUubzsf6fSaWm0wmO9hbvZU8fDR2zoZ97OuppAu0UJEDEmOISZohT6q7Gek5rD3GN6FEp1DaAYB7sdNYPXPao7anS1Fmrg402g7%2BjYhGIaOXOaQc%2BuONfmCwZXJIf8xKx2KRgxYgOS%2BCROuyoyQKCxIhkOr4T6JWgxGnvZ1HWnf%2FCfHcBXxcnpRHxYwRKkUjSErFKkAQiNjP4kmBRTHbKm5KkKxwL%2BK39fwDX1XGF8ct%2B%2BQAAAABJRU5ErkJggg%3D%3D%29%3B%0Abottom%3A10px%3B%0Aleft%3A15px%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dnavigation%20div%2Evis%2Dbutton%2Evis%2Dright%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAAAgY0hSTQAAeiUAAICDAAD5%2FwAAgOkAAHUwAADqYAAAOpgAABdvkl%2FFRgAABs1JREFUeNqsl3tQlOcVxp9z3m%2BXygK7C4sLxkW5o4CAkYssFSkRjabjJEOSJm1IbZx2krapiZdeprW0NVVJ0pqMM0kYJQlqkoZImGioE1ItiCAgIsFwE4Es99vCslwChf36xy5EW1A0Pn9%2B73fO772e93kJC5EMCszFd20SbyFZNpJAAACtjWUI8KAN1CRAJTbg9LXNU%2BdBkG%2BXkm7Zmg4OWoUdNqZXmQCZHQFsz0yOcCYGEc8mJGDnl2UTh5AO2x2DA3OxDaAsCDvQ32VF11qP9aZYz6SeFeooi17pPQEAvZNdTnWWKnWFuVhfYT7v0zza4M3EsMk2EPgnNZusby8Y7P8x%2F5lI%2FgMTYNSnNKQt%2F0Xtev1DfQtZlaK%2BM54fmDJXXhg4G8zEINBfqlLMe28L9s%2FlQ8Tyr5iAJ32fK%2Ftj%2BOFq3IUO1O%2BJyGk7GgsiEPFrlQ%2F07bixXdwEPckHWZJ3MgG7Qw9%2B%2FmLIS%2FW4SyXoNvQskpyHLg1e8CNQ3NI0laoje7Tg%2F8CBudgGgQwSwO%2FDD322ze%2FFFnxLRWhiBzUK94GLA2f9mSTjfU%2B7mjqyrVe%2BAX8I4aGgShbA0%2F47Sn4ZuLcR90ih6qih0anRiVprtUEQb43bYtlXmwNZAEDAj%2FACMW1M8ExpeDXyWMVCEl4yF7vntR%2FzLeov8JJlWfZR%2BY3N92%2Bcx%2FreOmu1quNrk27EWW0xvWspJcigoNNkA4C3Yk59vH7xltvu3ktDxe7PX34ilQCQfeci1j2xfn94ZrGCneY8uxcHCnW%2Fvbr9EQD4d2ITc8AprAOAQLewroVAAaB8oMiLiRHvmVy7znNTjWCFrXKoJOSHFQ%2BkvnF9f%2Bjco07s91MFdwmSkHQuYB0T8WYwIcYj0bTQdRufGlFKJMFVaCb%2FGvZW6aGI4yeXOwd2mr%2Fu05zsyDY%2BW5X64Nm%2BfO85NpuJiCFJTpslIoonADEeiT2zIzIXuh%2Bo25PQNtbsNVMOBUn2g08MiSTHN3uZjNTEDr4dnX%2F6H%2B1H%2FXPasmKvW%2BsMGfW%2FMXzende4K3h%2FibvSYxIAItyie%2FK7cgCitQxCIBFjpTrKMgM%2BWPfrhLbxFi9iMQtlYjAJSCSBSYBAIPBNI3p86TPXj8bk56R4PVylFE626uFLQc9efiTVPDmgBIAAtzALEYNBQRITa4kYix21FwBax655CVagPLk7806Pj1qo%2F7MraF%2FFQ14%2FaMhszYhvGqn3KTef89rklWrSKXUTkn3mtJK9Bzf3XJA0e%2FPcrdgxIwSCDPmbZMQgABJkDBKzvn%2Byy2npIv9xAPB1Ceo2jTZ7Gc8afipIgEhAkACDwcSQQZBIIGnx5it7gg%2BU3wgcnbZKR1r%2BFnW%2Bv2DVtDwtXCXNSKz797oAwDzZ7ySRAIBBFsTXmBh1w1%2BoZ4J3h%2Bwv9lUFdbMDOrO%2B5IAqWIGZthuV13nC77nKRx8r7PssyibLIkoT1%2Fh65HsfzWyu5tF6NYNB4EYJzKUETqgcLNVv0D%2FcDQBrNAnm9%2BLOfTLfNB5u2hf5z%2B6TMexYji%2BtVdrM5leMbWOtSwQx%2FF1C2rcuebIqwSO568a4WmuN3mEYSiUi%2BpRl2l1pLvYBsKArUKVwnZRYgdHpMWVG4%2B%2FWXhwoDBXE7OmkHzJ6JNemLfv51bniGqzVPoIkyLbpfK7ZMFIkE6FlrMn7Ql%2BBbiHg%2BzXGbgLjylDpyosD58KZmKM0cfWHI9%2F%2FaD5o1VCZrnO83VuQQOja5PMCfwK8n3K2ChIbLVOD9KB36le3A%2Bu%2Fs2Q81C2yRavQmQNdVnamLnmq4nHD9jpB0rwm77jpjTW9E906Bu18fWlWCQHAox9CtGoXTwmS8IThZyXPB%2B29inuoE6bMsDM9ufEAMNHqJuU8ljMtAKA2B7IhzaWNiLfWjVQb3J10%2FSGuEZZ7Af1X7%2BlluZ3HkpgEQPL291M%2BqbzJgXQcG60ypKlVTGwsMxcFaJW6%2FhDXVZZvCz3RlrmRiQHwy9nRn2bM6bnas4cLfH6s1RIorsJcFDA2PToR7Z7QezfQD9qzwvI6TyTZC47ttXeiT%2B2c1%2BwBgOndoTPLt7mrmCRjvfULQ4O1xsVVchu7b9GysYUAqy3lnsdNb0aXmQuj7PYWL2etuRl6S0OfXLjiGQIdEY6K5esc2BWhjvkqXLO6x08VPKxV6iYAwuBkv5NpvNmtbrhaX2%2BtWdY70eVNINhtLW0%2Fsjrv6B0%2FYdJlcGlR2AvE4hUlKwHQ7BU5cz8LRx0HaPY7gXb53L%2F67%2BmUfudPmP%2FtwOWS6AQi%2Fj6B4iWS%2FIlYK%2ByGYJDB1wWLErLRKd%2FomOJbAWf03wEAyO9m%2B%2FTtS3AAAAAASUVORK5CYII%3D%29%3B%0Abottom%3A10px%3B%0Aleft%3A95px%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dnavigation%20div%2Evis%2Dbutton%2Evis%2DzoomIn%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAAAgY0hSTQAAeiUAAICDAAD5%2FwAAgOkAAHUwAADqYAAAOpgAABdvkl%2FFRgAABiBJREFUeNqkV2tQlOcVfp7zvgvDRe66y8htXUBR1GoFI%2BBtFJvRtjPJBGeaH2a8DGmbttgSTWbSJEw6TWOsrbbpTIeJZGqaTipTa6LJZDTVUTYQdNAohoso6qLucnERN0Axcb%2F8%2BHaJUHDX9Pz6vnnPe57vXJ5zzkeEIwaYcwBL%2FVrW0TCKqZANINEvBhSk3w9eUmC9HzjcsfarOhBGKJN84GkVJHcetvqFu4SAIYELYlpm4LpQQMqoQQKVnzeO7EYV%2FA8NnHMAGwHWQJmAjtg895LkFa7FU1d258UvGLBGpI4AQM9dd2TrwNn4016n9bS3LqNzsD1VKPAbfhCyqflR31thAzv%2BLa%2BQxotCoNi6pn1D1s9aVli%2F3xtOVk72fjT1XVf17E9uHZspFBD8zdk13pdCAjsOyG6KUSEEnrT%2FtPHluW%2Bcw7eQ19q2z6%2Ft2rsYJEjZ07S6d%2BukwI5%2FyQ7RxnYC2DZnx8dbHNs6xxs85T2R9GprZcmVwYs2BYWsmBzP83m7nIVJS73jdfdd%2B7PjjUu%2FXWUCGTtPre7ZHjxTY3Kq8DoV8Ou5u49snPGrKxN58syZ9aVXBztsigoUBd%2BXt2NbfZ8llaVvah%2BvOz9hcX%2BCJenWp7eOOYS6ePpTU1w39vk%2BAwCzFPdDQbFGFPCUY2v9hqxfXJ0shNeHLtsUFc6UequbVvdVkwLX0GXbZPpl6Zuu%2Fij9x%2FVCBU1dU7bfdFYAIDsSFRCgeOqa9hfy%2FnDhwfwTKOrRd0U95n0iqch9%2BcKS5JVtpMCdkllhAhugCHcRwAb7z1tCEp8CCXAWAJRoCFXIYnti%2BsYWTQ0tll0wQMk%2BhGUAkBOX714xbV1IyuhxHhIMC%2FiR5OV9M2JmuhU1Vh7PXiakrIUQhcnLXeHQxPT4GyAtFqgwgAPF5iIFWkeu1SSLCKAweXn3%2FZR5rXV7SddQpy3YDoNems9qTI5hGCitm1MOAAx0aaFCerTd84zjBed3Egq9ADA%2FrqD7Q3ctQC4REDmkYHb8goGgsR2tz5V0DV%2BxUdQoqAQ81RybU4IgFWgACgpaLLCIBUo0bv63y%2FaXy6%2BWBHWz4%2FIHSIGAuVooiaRgWqD3AsDVoQ6bEgtOrfJUhwrf0WUtk%2Br8sL6wvHvk5ijVUiJSRrQZuURtfoGMuaCoRyfP%2FyMy0XykgAA0DPRTxNp31x2ZFuUYBgB7bK7HNdhpKz6WXq6oQCooKghMKhkgji77vBoA1jkXlAvVfRQjFMUcmxSkRWd6gpjeu32R2kxTvyhKh1DQeud8fFBh26zfOe0xuR4JgAbzywCoRSzfeDUKatJKUQK%2BCjKiHZ6nZ2xzBnU7B9vixTy7qCHSQEhJU3%2BDtdT6mAcAFiWUeP%2FxyPH3Jwrfo3XzysemRcEA8F5RY8h6aPE1WwMLQ4OQ%2FEBANHmdGWHlzZyxk3ayB0m771yGooYy%2BKE0l35x0iBxZehS6ie9R1PCMaDvCzWDXA4hZ283ptwcvp6qqDBnyao6AWEQrBQQ%2F7y%2Bd3YoA%2BNBTAaElo973p8tVFCQyipW%2Bc3pdNu7BwBOe%2Btm%2FeniK%2FkPFWowpMfvuKrzzw80zSKIkWsJe0bHYu163BNwMwDsv7G36ODNtzMnM5IWZfeQgscbisvLPl1aDhLTo7I8k%2Bn%2Fp%2Bdw5pGeg0WKGiS31K6vvTdmA7nx9uDZ9A3xMUIpbvSezE6MSOmbNWXewHhD6dH23o7BlqQvvrwTK6KQFpXl2WyvcE6LTB2eCPSdrurvmcUnO%2FcVfPD6pMteyfGs3QKpUFQoS9tU%2FxPH8xe%2BTdd693pN%2FpHug0Xmqntvz1uLDo9Z9v5nnrn%2BdvujrI1JMUJd3OY7n97ua46douOGpkdlDoUDeG7g1NS%2Fu%2F5a0Og9scCsB%2BysWXSoMuyFftWJvM0E31SBjmWPznHPjy%2B8NjdhYfeMmJl3EiNSRgCi%2F25fpGu4M671zjlrm685s2fEnUoQ5lrLLW8uPLj3oX9hqgxIw8n8X1LU7yMkItCHzREZrGQV6ONmy5TggHk247sL%2F1jFqof%2FhRn%2FAWfqC0pI%2BQHBIk3tICXRrFTpF8hlJaqefh6yFxQ6HwQYlK8HAKyt3WsWxl7fAAAAAElFTkSuQmCC%29%3B%0Abottom%3A10px%3B%0Aright%3A15px%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dnavigation%20div%2Evis%2Dbutton%2Evis%2DzoomOut%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAAAgY0hSTQAAeiUAAICDAAD5%2FwAAgOkAAHUwAADqYAAAOpgAABdvkl%2FFRgAABV5JREFUeNq0l2tQVVUYht%2F3W%2FvACMr16IFRQDiAgChpgiikMqY1WjnN9KsfGOXYTOVgkvbDUsZuXrK0qZmGUSvNspjI8TZOmo6AGBoZYly8YB6Qw80DBwQ6jJ3dj30OZZmiwvtv77XW96y91l7v9y1iMNLBuCI84tZkIXU9gwqxAILdokNBOtzgJQWWuYEDFxfcLAGh3y0k79iaD4mfjOVu4WYhoItngBiR6RkuFJAyEJBA3m%2Flri3Ih%2FuewXFFyAG4A8oAWkcm2meEzrFNH53Vkhg4xWnxCXcBQGu%2F3bfGeTbwjKPUcsZRElnfUxcuFLh1Nwh5vurx7s8GDbZ%2BL%2BtI%2FU0hkGGZX5c9%2FpXqOZYn2gazK8Vth0fvsRUknbx%2BbIJQQPCts%2FMda%2B4KthbJFoqeKwSejX6pfO2kjytxH1pfuyqlsGH7dJAgZWvFo23L%2F9muboF%2BJxtE0%2FOEwMqJG46uSHinFvepTPO8lhGaX%2BfPHSdjCKaPy%2Fb3v7az58h%2FwHFFyIHCRirgjUlbfsiJWXEFD6iUoOkdQaaQ6z9dP2YVahljF4%2ByXdvZ%2Fevf4G%2BhQk2sEAUsti4vWxa35gKGSBMDp3T23OxxVXdXRijKovSFzrerC6ELAMT6IhcCZIyeX7c68YPzGGLlxq89PyM0q5YU2M1RuQAg0EERbiaA7Ohl1RgmPTM2p1qjBk1Mm6GDErsfswAgLiDZPmfMwrbhAqeHzm6P8Z9gV9SQdTx2lpCyAEKkhc62YZiVEjTdRgo0zXeBRnImAaSFzm7xdjjtOBGyvmZVZkNvfZjXDhU14%2BBToFEDKRAQpAJ0HRTjP6XHpYUKEX7RzS9bV5c%2BFJTmAICUgNSWQ%2FZCgJwhIOJIQVLgFKcXvKHm9cyGvithFDUAFQqECho1CBUIggYapAJ1QEFBExNMYoISDU1%2FNIR9cvndTG%2Fc2IBkp2fC8ZpQgknBGI%2F3AsDvvRfDlJhwem5zwYMs7VNlaUtbXE1h3mezj9mlGSsXrBkzkFsGKGoDmedBJLfLjxQQgAYdHRSxtPfbfceNsPYBQPTI%2BGZbT31YxrGIpYoKpIKigkAgFOggNBrbQBBCBaEM2L%2BiGGmTgnF%2BUc1epqO%2F3VejAoAOUZSLQkFN17lAb4eVCe%2BVRvvHN4sH6t1feqAmMUGoPHvvhdLzTjzfKoj0sza%2FGLOy1Bu3vqc20Pgl5YIGkVOEZFZ0nLLMszzdDADTgjIdX6Uf3zfUx6m6u8riKRhOCcmDAqLCURo53Oe4rrsyUlGD0nlIqubdKNZJXOm9FH6y7Yh5uKBnO8vNTX2N4YoKE2fMLREQOsE8AfFN4%2Fak4QIfbd2XJFRQkLx85ruN7NTp2AoAZxwlCR9dWJc81NDdtoLkc86KBIJwXQ3aOpCPqwuhR2SPbCBlUc2NyogQX3N7wqgU51BAf2w9EFXUtCtLqADqS76ev6%2Filgrk2q6esxHZgf5CySh3FMcG%2B5jbE0ZNdj4odHdDwWPGcZNNO1MPbrxtzdW4s%2BtI5HPBwQTTzziKY3v%2F7HGlhmS23g90T%2BOO5L1Nu7MMw3Fv%2FTx1f97%2FFnsAYPui8%2FD4nBB%2FoZZR230uoq67auQoLaB37Iio3sEAK52nR39p%2BzS13HFiilHeYtOOabdC71jQzz2R%2BALBbcrjWNF%2BcfaUwLSrk4KmtsT4T%2BgK9jG7AKKjv93X1lcfUNNVaantropqddnDCcIoa7lk29S92%2B%2F5CpOvQ04VJ79KUe%2F7iI%2FHh40U6c3PyuPjhmWKN8G8Fvnw1A%2FzmX%2FvV5h%2FT%2BCXstRMUp4kOFOjZiUlWBkFQYdALitRZXRzf3RqWumdgF79NQDBOa2V%2FiYSHAAAAABJRU5ErkJggg%3D%3D%29%3B%0Abottom%3A10px%3B%0Aright%3A55px%3B%0A%7D%0Adiv%2Evis%2Dnetwork%20div%2Evis%2Dnavigation%20div%2Evis%2Dbutton%2Evis%2DzoomExtends%20%7B%0Abackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAAAgY0hSTQAAeiUAAICDAAD5%2FwAAgOkAAHUwAADqYAAAOpgAABdvkl%2FFRgAABptJREFUeNqsl21QlNcVx%2F%2F%2Fcx9hIipuAJHasgHlRdw0xay7yK7smg6sb2DSdtqZduLUNENmOk1tQuM4U7UzTvshSRlFZzoNCWSSSTJp%2B6VNkLCAeQHBoCCgqNBE0wUqL%2BKuwIiiZZ9%2BeHa3aAS3Sf8zO8%2FL3nt%2B95x7z7n3YWlpKUQEJAEgch9%2BJola9xEC2ADBVgAOKqwCYAqKDgUJBIHPBWwFWQNdbyZFBwAC0GGIAHQSj3%2F8HHRdhzYbdDfwg4IjAsGvICgXAroYBiCEDkBBACBZoyST4gDwQqh7mQ4cEkhQD0EBIIggRMQAh2EiEvEYAGrdR3YSqIYCIEDaotVDeYnu%2FryEjSOr43PHl8WmTBPA6PRQ7IWJrvhT%2FubkU%2F7m1EvX%2B1KEUh7Ug%2BWkPEXgdUSkR%2Bxrd0NJ4qjr8AEI9pGAI7mo78mHfnF%2BY%2FK2K7iHUheuvJG6cOUNz%2FLvDwPobrpSl%2FRuf2VOy9UPs4RSTSANwH4Y449EVdnt9ojHIeghCHYLgR%2Bn%2F7zt4Np32tIWZU4hSpnjVk1t%2FcaPfOO3%2Ff%2B%2BMNH5TVJcisoEoo4ksgbsXwYfdR1%2BkQplQuCFNS82Pp%2F9%2B158RTkTC0ce0OKutQeOp5PME0qcUBqyBmwGOC8vz4AWVOyE4CUqYO%2FDh%2Bp3pj%2F%2FBb6mHllqCyxd8ODVT69%2BuFKoOYTSnzFg7SJpzHFNQYWiQrUIsCN9V%2BuOh375zz179pSGI1FSUuK12%2B2%2BaGDt7e3muro6T%2Fh57969lZdvDrT%2BZbA6n0B1nfPVN7e0PjMjIgIIdkEAR1JR329yDvaE0%2Bl%2FhQKA1Wr1bd682SsikUW7K%2BO3PesTNvaSAiXaLhGBvO86RFEoJ4Adac%2BeDxsgiZKSEm9NTY3n5MmT5mjBHR0d5vr6es%2BmTZu8SqnI%2Bx%2Bs%2BOl5jRo0auX1jtepQaEAADKWWIbcy7ZGUmb79u1eu93uI%2Bmtra31HLj5TGDs9rBJICCNn1GRCKGCUJAUuzzw6CfbTB6Px7t27VofAG%2FYXl6Ceyw9LmvIN3UxZUafKRACWyCELcHVP3vk4fDabDZf%2B2N%2FD9g%2BfsLEEFSooFGDogZNFkBRgSCsTcWm066jgRAU4et%2FF5u9nxRosmCLRmE%2BQdgSXCNzhW%2Fs9rDJ63wVJx77V%2BV8YS6UNaW8BdOcqzx%2B3Ujt0F8Bcr1GMIMU5CzJHZ%2Brg6IGCYV2PimoyIK6lzIWrxkPTVGmRoqJFCyLTZmeq4MB5f3BVADnbpcQkzStUQMAk0YKBPfzxlhA95NQQe43QBotBECAFFyZHo6dz6CKCizAPFPivzUWqxm2AqIgnwkFvZNn4uczGK3Hah7wpet98UZ85R8aKScIcXYEWpMLkx8fvleHpNjlAWtTsakQa0pVKGcJQqMGUqCHBvfdjp%2FgTP6xwFzg85PdyaH2J4SUowKiw3889e4KBACnT582W5uKTV2uusAdUFlgzBcFQoFGDT35HwW%2B82mhqaenxwwA4WtYfRNnUkMZUqsJpEkn8cXU5yktYw2JjsTCMQDwer0ekt6GhgZPUVGRd3fu7qjqdU9Mj7mlpcVD0tvS0uKxWCyVANB5rS3x8s3BFEUFgTTLtuZndQHLBMSfB6pyZtfqMDQ3NzfqTcJisficTqc3BI%2B8bxh9L8corarM3fnDoIT%2BrACAU%2F7m7MOfHbCEwQDQ2Njo6erqinqTOHfuXNjjiI23%2BystZ8c7smmkWgVJcN%2B%2BfRARfLDhlacEUqVEQ1nm77xPrHjSh%2F%2BDjo3WmN%2Fs%2F6OHEOgIPr2h63tVuq5Dud1ukETWoK3zorkzTiiONn%2FTKlNM4lj24m%2BPf13o2wOVHqGA5MsAXjKPrDaqnMvlQnjTzhy0Nlw0d5oI5p3yN62amrk%2Bve5B5%2BhXgb47WGX52%2BV3NgoFOvQKAGUkkTqcbZy5XC7XHYf4zEFr3aXU7jih5uidPPOtvsmzixZr8VMrHjBHddLsHj%2BZ9Fb%2Fn9a1%2BT%2FJDaXey0IpEzEKkHnU8Jj79%2B%2BPeEwSSimQRGP%2BGz8j5DVFBVKQtjBj6JGlNt%2FD8Y%2BOpMdlTphiEqcB4tqtsVjfjUtLLkx0J%2FdOnjWPTg%2BlEARIEHwaQJVQIYggACC%2Fqxi6rn8ZHL4XETSsf0MU1HOk%2FCFGYgAwskUqY5eBitRxzn7%2Fa0V1EEBwdqkN6jPI7y4xPmHmC5unbWdQRMqP2d86qANOksU6gvmArNQRNClqABnQgYuK0krI%2BwCOAyH3DK%2FvqOXhaf3PAO7mIRjDNV25AAAAAElFTkSuQmCC%29%3B%0Abottom%3A50px%3B%0Aright%3A15px%3B%0A%7D%0A%0A%2Evis%2Dtimeline%20%7B%0A%0A%7D%0A%2Evis%2Dpanel%20%7B%0A%0A%7D%0A%2Evis%2Daxis%20%7B%0A%0A%7D%0A%0A%2Evis%2Dcurrent%2Dtime%20%7B%0Abackground%2Dcolor%3A%20%23FF7F6E%3B%0Awidth%3A%202px%3B%0Az%2Dindex%3A%201%3B%0A%7D%0A%2Evis%2Dcustom%2Dtime%20%7B%0Abackground%2Dcolor%3A%20%236E94FF%3B%0Awidth%3A%202px%3B%0Acursor%3A%20move%3B%0Az%2Dindex%3A%201%3B%0A%7D%0A%2Evis%2Dpanel%2Evis%2Dbackground%2Evis%2Dhorizontal%20%2Evis%2Dgrid%2Evis%2Dhorizontal%20%7B%0Aposition%3A%20absolute%3B%0Awidth%3A%20100%25%3B%0Aheight%3A%200%3B%0Aborder%2Dbottom%3A%201px%20solid%3B%0A%7D%0A%2Evis%2Dpanel%2Evis%2Dbackground%2Evis%2Dhorizontal%20%2Evis%2Dgrid%2Evis%2Dminor%20%7B%0Aborder%2Dcolor%3A%20%23e5e5e5%3B%0A%7D%0A%2Evis%2Dpanel%2Evis%2Dbackground%2Evis%2Dhorizontal%20%2Evis%2Dgrid%2Evis%2Dmajor%20%7B%0Aborder%2Dcolor%3A%20%23bfbfbf%3B%0A%7D%0A%2Evis%2Ddata%2Daxis%20%2Evis%2Dy%2Daxis%2Evis%2Dmajor%20%7B%0Awidth%3A%20100%25%3B%0Aposition%3A%20absolute%3B%0Acolor%3A%20%234d4d4d%3B%0Awhite%2Dspace%3A%20nowrap%3B%0A%7D%0A%2Evis%2Ddata%2Daxis%20%2Evis%2Dy%2Daxis%2Evis%2Dmajor%2Evis%2Dmeasure%20%7B%0Apadding%3A%200%3B%0Amargin%3A%200%3B%0Aborder%3A%200%3B%0Avisibility%3A%20hidden%3B%0Awidth%3A%20auto%3B%0A%7D%0A%2Evis%2Ddata%2Daxis%20%2Evis%2Dy%2Daxis%2Evis%2Dminor%20%7B%0Aposition%3A%20absolute%3B%0Awidth%3A%20100%25%3B%0Acolor%3A%20%23bebebe%3B%0Awhite%2Dspace%3A%20nowrap%3B%0A%7D%0A%2Evis%2Ddata%2Daxis%20%2Evis%2Dy%2Daxis%2Evis%2Dminor%2Evis%2Dmeasure%20%7B%0Apadding%3A%200%3B%0Amargin%3A%200%3B%0Aborder%3A%200%3B%0Avisibility%3A%20hidden%3B%0Awidth%3A%20auto%3B%0A%7D%0A%2Evis%2Ddata%2Daxis%20%2Evis%2Dy%2Daxis%2Evis%2Dtitle%20%7B%0Aposition%3A%20absolute%3B%0Acolor%3A%20%234d4d4d%3B%0Awhite%2Dspace%3A%20nowrap%3B%0Abottom%3A%2020px%3B%0Atext%2Dalign%3A%20center%3B%0A%7D%0A%2Evis%2Ddata%2Daxis%20%2Evis%2Dy%2Daxis%2Evis%2Dtitle%2Evis%2Dmeasure%20%7B%0Apadding%3A%200%3B%0Amargin%3A%200%3B%0Avisibility%3A%20hidden%3B%0Awidth%3A%20auto%3B%0A%7D%0A%2Evis%2Ddata%2Daxis%20%2Evis%2Dy%2Daxis%2Evis%2Dtitle%2Evis%2Dleft%20%7B%0Abottom%3A%200%3B%0A%2Dwebkit%2Dtransform%2Dorigin%3A%20left%20top%3B%0A%2Dmoz%2Dtransform%2Dorigin%3A%20left%20top%3B%0A%2Dms%2Dtransform%2Dorigin%3A%20left%20top%3B%0A%2Do%2Dtransform%2Dorigin%3A%20left%20top%3B%0Atransform%2Dorigin%3A%20left%20bottom%3B%0A%2Dwebkit%2Dtransform%3A%20rotate%28%2D90deg%29%3B%0A%2Dmoz%2Dtransform%3A%20rotate%28%2D90deg%29%3B%0A%2Dms%2Dtransform%3A%20rotate%28%2D90deg%29%3B%0A%2Do%2Dtransform%3A%20rotate%28%2D90deg%29%3B%0Atransform%3A%20rotate%28%2D90deg%29%3B%0A%7D%0A%2Evis%2Ddata%2Daxis%20%2Evis%2Dy%2Daxis%2Evis%2Dtitle%2Evis%2Dright%20%7B%0Abottom%3A%200%3B%0A%2Dwebkit%2Dtransform%2Dorigin%3A%20right%20bottom%3B%0A%2Dmoz%2Dtransform%2Dorigin%3A%20right%20bottom%3B%0A%2Dms%2Dtransform%2Dorigin%3A%20right%20bottom%3B%0A%2Do%2Dtransform%2Dorigin%3A%20right%20bottom%3B%0Atransform%2Dorigin%3A%20right%20bottom%3B%0A%2Dwebkit%2Dtransform%3A%20rotate%2890deg%29%3B%0A%2Dmoz%2Dtransform%3A%20rotate%2890deg%29%3B%0A%2Dms%2Dtransform%3A%20rotate%2890deg%29%3B%0A%2Do%2Dtransform%3A%20rotate%2890deg%29%3B%0Atransform%3A%20rotate%2890deg%29%3B%0A%7D%0A%2Evis%2Dlegend%20%7B%0Abackground%2Dcolor%3A%20rgba%28247%2C%20252%2C%20255%2C%200%2E65%29%3B%0Apadding%3A%205px%3B%0Aborder%3A%201px%20solid%20%23b3b3b3%3B%0Abox%2Dshadow%3A%202px%202px%2010px%20rgba%28154%2C%20154%2C%20154%2C%200%2E55%29%3B%0A%7D%0A%2Evis%2Dlegend%2Dtext%20%7B%0A%0Awhite%2Dspace%3A%20nowrap%3B%0Adisplay%3A%20inline%2Dblock%0A%7D%0A%2Evis%2Ditem%20%7B%0Aposition%3A%20absolute%3B%0Acolor%3A%20%231A1A1A%3B%0Aborder%2Dcolor%3A%20%2397B0F8%3B%0Aborder%2Dwidth%3A%201px%3B%0Abackground%2Dcolor%3A%20%23D5DDF6%3B%0Adisplay%3A%20inline%2Dblock%3B%0A%0A%7D%0A%2Evis%2Ditem%2Evis%2Dselected%20%7B%0Aborder%2Dcolor%3A%20%23FFC200%3B%0Abackground%2Dcolor%3A%20%23FFF785%3B%0A%0Az%2Dindex%3A%202%3B%0A%7D%0A%2Evis%2Deditable%2Evis%2Dselected%20%7B%0Acursor%3A%20move%3B%0A%7D%0A%2Evis%2Ditem%2Evis%2Dpoint%2Evis%2Dselected%20%7B%0Abackground%2Dcolor%3A%20%23FFF785%3B%0A%7D%0A%2Evis%2Ditem%2Evis%2Dbox%20%7B%0Atext%2Dalign%3A%20center%3B%0Aborder%2Dstyle%3A%20solid%3B%0Aborder%2Dradius%3A%202px%3B%0A%7D%0A%2Evis%2Ditem%2Evis%2Dpoint%20%7B%0Abackground%3A%20none%3B%0A%7D%0A%2Evis%2Ditem%2Evis%2Ddot%20%7B%0Aposition%3A%20absolute%3B%0Apadding%3A%200%3B%0Aborder%2Dwidth%3A%204px%3B%0Aborder%2Dstyle%3A%20solid%3B%0Aborder%2Dradius%3A%204px%3B%0A%7D%0A%2Evis%2Ditem%2Evis%2Drange%20%7B%0Aborder%2Dstyle%3A%20solid%3B%0Aborder%2Dradius%3A%202px%3B%0Abox%2Dsizing%3A%20border%2Dbox%3B%0A%7D%0A%2Evis%2Ditem%2Evis%2Dbackground%20%7B%0Aborder%3A%20none%3B%0Abackground%2Dcolor%3A%20rgba%28213%2C%20221%2C%20246%2C%200%2E4%29%3B%0Abox%2Dsizing%3A%20border%2Dbox%3B%0Apadding%3A%200%3B%0Amargin%3A%200%3B%0A%7D%0A%2Evis%2Ditem%20%2Evis%2Ditem%2Doverflow%20%7B%0Aposition%3A%20relative%3B%0Awidth%3A%20100%25%3B%0Aheight%3A%20100%25%3B%0Apadding%3A%200%3B%0Amargin%3A%200%3B%0Aoverflow%3A%20hidden%3B%0A%7D%0A%2Evis%2Ditem%2Evis%2Drange%20%2Evis%2Ditem%2Dcontent%20%7B%0Aposition%3A%20relative%3B%0Adisplay%3A%20inline%2Dblock%3B%0A%7D%0A%2Evis%2Ditem%2Evis%2Dbackground%20%2Evis%2Ditem%2Dcontent%20%7B%0Aposition%3A%20absolute%3B%0Adisplay%3A%20inline%2Dblock%3B%0A%7D%0A%2Evis%2Ditem%2Evis%2Dline%20%7B%0Apadding%3A%200%3B%0Aposition%3A%20absolute%3B%0Awidth%3A%200%3B%0Aborder%2Dleft%2Dwidth%3A%201px%3B%0Aborder%2Dleft%2Dstyle%3A%20solid%3B%0A%7D%0A%2Evis%2Ditem%20%2Evis%2Ditem%2Dcontent%20%7B%0Awhite%2Dspace%3A%20nowrap%3B%0Abox%2Dsizing%3A%20border%2Dbox%3B%0Apadding%3A%205px%3B%0A%7D%0A%2Evis%2Ditem%20%2Evis%2DonUpdateTime%2Dtooltip%20%7B%0Aposition%3A%20absolute%3B%0Abackground%3A%20%234f81bd%3B%0Acolor%3A%20white%3B%0Awidth%3A%20200px%3B%0Atext%2Dalign%3A%20center%3B%0Awhite%2Dspace%3A%20nowrap%3B%0Apadding%3A%205px%3B%0Aborder%2Dradius%3A%201px%3B%0A%7D%0A%2Evis%2Ditem%20%2Evis%2Ddelete%2C%20%2Evis%2Ditem%20%2Evis%2Ddelete%2Drtl%20%7B%0Aposition%3A%20absolute%3B%0Atop%3A%200px%3B%0Awidth%3A%2024px%3B%0Aheight%3A%2024px%3B%0Abox%2Dsizing%3A%20border%2Dbox%3B%0Apadding%3A%200px%205px%3B%0Acursor%3A%20pointer%3B%0A%2Dwebkit%2Dtransition%3A%20background%200%2E2s%20linear%3B%0A%2Dmoz%2Dtransition%3A%20background%200%2E2s%20linear%3B%0A%2Dms%2Dtransition%3A%20background%200%2E2s%20linear%3B%0A%2Do%2Dtransition%3A%20background%200%2E2s%20linear%3B%0Atransition%3A%20background%200%2E2s%20linear%3B%0A%7D%0A%2Evis%2Ditem%20%2Evis%2Ddelete%20%7B%0Aright%3A%20%2D24px%3B%0A%7D%0A%2Evis%2Ditem%20%2Evis%2Ddelete%2Drtl%20%7B%0Aleft%3A%20%2D24px%3B%0A%7D%0A%2Evis%2Ditem%20%2Evis%2Ddelete%3Aafter%2C%20%2Evis%2Ditem%20%2Evis%2Ddelete%2Drtl%3Aafter%20%7B%0Acontent%3A%20%22%5C00D7%22%3B%20%0Acolor%3A%20red%3B%0Afont%2Dfamily%3A%20arial%2C%20sans%2Dserif%3B%0Afont%2Dsize%3A%2022px%3B%0Afont%2Dweight%3A%20bold%3B%0A%2Dwebkit%2Dtransition%3A%20color%200%2E2s%20linear%3B%0A%2Dmoz%2Dtransition%3A%20color%200%2E2s%20linear%3B%0A%2Dms%2Dtransition%3A%20color%200%2E2s%20linear%3B%0A%2Do%2Dtransition%3A%20color%200%2E2s%20linear%3B%0Atransition%3A%20color%200%2E2s%20linear%3B%0A%7D%0A%2Evis%2Ditem%20%2Evis%2Ddelete%3Ahover%2C%20%2Evis%2Ditem%20%2Evis%2Ddelete%2Drtl%3Ahover%20%7B%0Abackground%3A%20red%3B%0A%7D%0A%2Evis%2Ditem%20%2Evis%2Ddelete%3Ahover%3Aafter%2C%20%2Evis%2Ditem%20%2Evis%2Ddelete%2Drtl%3Ahover%3Aafter%20%7B%0Acolor%3A%20white%3B%0A%7D%0A%2Evis%2Ditem%20%2Evis%2Ddrag%2Dcenter%20%7B%0Aposition%3A%20absolute%3B%0Awidth%3A%20100%25%3B%0Aheight%3A%20100%25%3B%0Atop%3A%200%3B%0Aleft%3A%200px%3B%0Acursor%3A%20move%3B%0A%7D%0A%2Evis%2Ditem%2Evis%2Drange%20%2Evis%2Ddrag%2Dleft%20%7B%0Aposition%3A%20absolute%3B%0Awidth%3A%2024px%3B%0Amax%2Dwidth%3A%2020%25%3B%0Amin%2Dwidth%3A%202px%3B%0Aheight%3A%20100%25%3B%0Atop%3A%200%3B%0Aleft%3A%20%2D4px%3B%0Acursor%3A%20w%2Dresize%3B%0A%7D%0A%2Evis%2Ditem%2Evis%2Drange%20%2Evis%2Ddrag%2Dright%20%7B%0Aposition%3A%20absolute%3B%0Awidth%3A%2024px%3B%0Amax%2Dwidth%3A%2020%25%3B%0Amin%2Dwidth%3A%202px%3B%0Aheight%3A%20100%25%3B%0Atop%3A%200%3B%0Aright%3A%20%2D4px%3B%0Acursor%3A%20e%2Dresize%3B%0A%7D%0A%2Evis%2Drange%2Evis%2Ditem%2Evis%2Dreadonly%20%2Evis%2Ddrag%2Dleft%2C%0A%2Evis%2Drange%2Evis%2Ditem%2Evis%2Dreadonly%20%2Evis%2Ddrag%2Dright%20%7B%0Acursor%3A%20auto%3B%0A%7D%0A%2Evis%2Ditemset%20%7B%0Aposition%3A%20relative%3B%0Apadding%3A%200%3B%0Amargin%3A%200%3B%0Abox%2Dsizing%3A%20border%2Dbox%3B%0A%7D%0A%2Evis%2Ditemset%20%2Evis%2Dbackground%2C%0A%2Evis%2Ditemset%20%2Evis%2Dforeground%20%7B%0Aposition%3A%20absolute%3B%0Awidth%3A%20100%25%3B%0Aheight%3A%20100%25%3B%0Aoverflow%3A%20visible%3B%0A%7D%0A%2Evis%2Daxis%20%7B%0Aposition%3A%20absolute%3B%0Awidth%3A%20100%25%3B%0Aheight%3A%200%3B%0Aleft%3A%200%3B%0Az%2Dindex%3A%201%3B%0A%7D%0A%2Evis%2Dforeground%20%2Evis%2Dgroup%20%7B%0Aposition%3A%20relative%3B%0Abox%2Dsizing%3A%20border%2Dbox%3B%0Aborder%2Dbottom%3A%201px%20solid%20%23bfbfbf%3B%0A%7D%0A%2Evis%2Dforeground%20%2Evis%2Dgroup%3Alast%2Dchild%20%7B%0Aborder%2Dbottom%3A%20none%3B%0A%7D%0A%2Evis%2Doverlay%20%7B%0Aposition%3A%20absolute%3B%0Atop%3A%200%3B%0Aleft%3A%200%3B%0Awidth%3A%20100%25%3B%0Aheight%3A%20100%25%3B%0Az%2Dindex%3A%2010%3B%0A%7D%0A%2Evis%2Dlabelset%20%7B%0Aposition%3A%20relative%3B%0Aoverflow%3A%20hidden%3B%0Abox%2Dsizing%3A%20border%2Dbox%3B%0A%7D%0A%2Evis%2Dlabelset%20%2Evis%2Dlabel%20%7B%0Aposition%3A%20relative%3B%0Aleft%3A%200%3B%0Atop%3A%200%3B%0Awidth%3A%20100%25%3B%0Acolor%3A%20%234d4d4d%3B%0Abox%2Dsizing%3A%20border%2Dbox%3B%0A%7D%0A%2Evis%2Dlabelset%20%2Evis%2Dlabel%20%7B%0Aborder%2Dbottom%3A%201px%20solid%20%23bfbfbf%3B%0A%7D%0A%2Evis%2Dlabelset%20%2Evis%2Dlabel%2Edraggable%20%7B%0Acursor%3A%20pointer%3B%0A%7D%0A%2Evis%2Dlabelset%20%2Evis%2Dlabel%3Alast%2Dchild%20%7B%0Aborder%2Dbottom%3A%20none%3B%0A%7D%0A%2Evis%2Dlabelset%20%2Evis%2Dlabel%20%2Evis%2Dinner%20%7B%0Adisplay%3A%20inline%2Dblock%3B%0Apadding%3A%205px%3B%0A%7D%0A%2Evis%2Dlabelset%20%2Evis%2Dlabel%20%2Evis%2Dinner%2Evis%2Dhidden%20%7B%0Apadding%3A%200%3B%0A%7D%0A%2Evis%2Dpanel%20%7B%0Aposition%3A%20absolute%3B%0Apadding%3A%200%3B%0Amargin%3A%200%3B%0Abox%2Dsizing%3A%20border%2Dbox%3B%0A%7D%0A%2Evis%2Dpanel%2Evis%2Dcenter%2C%0A%2Evis%2Dpanel%2Evis%2Dleft%2C%0A%2Evis%2Dpanel%2Evis%2Dright%2C%0A%2Evis%2Dpanel%2Evis%2Dtop%2C%0A%2Evis%2Dpanel%2Evis%2Dbottom%20%7B%0Aborder%3A%201px%20%23bfbfbf%3B%0A%7D%0A%2Evis%2Dpanel%2Evis%2Dcenter%2C%0A%2Evis%2Dpanel%2Evis%2Dleft%2C%0A%2Evis%2Dpanel%2Evis%2Dright%20%7B%0Aborder%2Dtop%2Dstyle%3A%20solid%3B%0Aborder%2Dbottom%2Dstyle%3A%20solid%3B%0Aoverflow%3A%20hidden%3B%0A%7D%0A%2Evis%2Dleft%2Evis%2Dpanel%2Evis%2Dvertical%2Dscroll%2C%20%2Evis%2Dright%2Evis%2Dpanel%2Evis%2Dvertical%2Dscroll%20%7B%0Aheight%3A%20100%25%3B%0Aoverflow%2Dx%3A%20hidden%3B%0Aoverflow%2Dy%3A%20scroll%3B%0A%7D%20%2Evis%2Dleft%2Evis%2Dpanel%2Evis%2Dvertical%2Dscroll%20%7B%0Adirection%3A%20rtl%3B%0A%7D%0A%2Evis%2Dleft%2Evis%2Dpanel%2Evis%2Dvertical%2Dscroll%20%2Evis%2Dcontent%20%7B%0Adirection%3A%20ltr%3B%0A%7D%0A%2Evis%2Dright%2Evis%2Dpanel%2Evis%2Dvertical%2Dscroll%20%7B%0Adirection%3A%20ltr%3B%0A%7D%0A%2Evis%2Dright%2Evis%2Dpanel%2Evis%2Dvertical%2Dscroll%20%2Evis%2Dcontent%20%7B%0Adirection%3A%20rtl%3B%0A%7D%0A%2Evis%2Dpanel%2Evis%2Dcenter%2C%0A%2Evis%2Dpanel%2Evis%2Dtop%2C%0A%2Evis%2Dpanel%2Evis%2Dbottom%20%7B%0Aborder%2Dleft%2Dstyle%3A%20solid%3B%0Aborder%2Dright%2Dstyle%3A%20solid%3B%0A%7D%0A%2Evis%2Dbackground%20%7B%0Aoverflow%3A%20hidden%3B%0A%7D%0A%2Evis%2Dpanel%20%3E%20%2Evis%2Dcontent%20%7B%0Aposition%3A%20relative%3B%0A%7D%0A%2Evis%2Dpanel%20%2Evis%2Dshadow%20%7B%0Aposition%3A%20absolute%3B%0Awidth%3A%20100%25%3B%0Aheight%3A%201px%3B%0Abox%2Dshadow%3A%200%200%2010px%20rgba%280%2C0%2C0%2C0%2E8%29%3B%0A%0A%7D%0A%2Evis%2Dpanel%20%2Evis%2Dshadow%2Evis%2Dtop%20%7B%0Atop%3A%20%2D1px%3B%0Aleft%3A%200%3B%0A%7D%0A%2Evis%2Dpanel%20%2Evis%2Dshadow%2Evis%2Dbottom%20%7B%0Abottom%3A%20%2D1px%3B%0Aleft%3A%200%3B%0A%7D%0A%2Evis%2Dgraph%2Dgroup0%20%7B%0Afill%3A%234f81bd%3B%0Afill%2Dopacity%3A0%3B%0Astroke%2Dwidth%3A2px%3B%0Astroke%3A%20%234f81bd%3B%0A%7D%0A%2Evis%2Dgraph%2Dgroup1%20%7B%0Afill%3A%23f79646%3B%0Afill%2Dopacity%3A0%3B%0Astroke%2Dwidth%3A2px%3B%0Astroke%3A%20%23f79646%3B%0A%7D%0A%2Evis%2Dgraph%2Dgroup2%20%7B%0Afill%3A%20%238c51cf%3B%0Afill%2Dopacity%3A0%3B%0Astroke%2Dwidth%3A2px%3B%0Astroke%3A%20%238c51cf%3B%0A%7D%0A%2Evis%2Dgraph%2Dgroup3%20%7B%0Afill%3A%20%2375c841%3B%0Afill%2Dopacity%3A0%3B%0Astroke%2Dwidth%3A2px%3B%0Astroke%3A%20%2375c841%3B%0A%7D%0A%2Evis%2Dgraph%2Dgroup4%20%7B%0Afill%3A%20%23ff0100%3B%0Afill%2Dopacity%3A0%3B%0Astroke%2Dwidth%3A2px%3B%0Astroke%3A%20%23ff0100%3B%0A%7D%0A%2Evis%2Dgraph%2Dgroup5%20%7B%0Afill%3A%20%2337d8e6%3B%0Afill%2Dopacity%3A0%3B%0Astroke%2Dwidth%3A2px%3B%0Astroke%3A%20%2337d8e6%3B%0A%7D%0A%2Evis%2Dgraph%2Dgroup6%20%7B%0Afill%3A%20%23042662%3B%0Afill%2Dopacity%3A0%3B%0Astroke%2Dwidth%3A2px%3B%0Astroke%3A%20%23042662%3B%0A%7D%0A%2Evis%2Dgraph%2Dgroup7%20%7B%0Afill%3A%2300ff26%3B%0Afill%2Dopacity%3A0%3B%0Astroke%2Dwidth%3A2px%3B%0Astroke%3A%20%2300ff26%3B%0A%7D%0A%2Evis%2Dgraph%2Dgroup8%20%7B%0Afill%3A%23ff00ff%3B%0Afill%2Dopacity%3A0%3B%0Astroke%2Dwidth%3A2px%3B%0Astroke%3A%20%23ff00ff%3B%0A%7D%0A%2Evis%2Dgraph%2Dgroup9%20%7B%0Afill%3A%20%238f3938%3B%0Afill%2Dopacity%3A0%3B%0Astroke%2Dwidth%3A2px%3B%0Astroke%3A%20%238f3938%3B%0A%7D%0A%2Evis%2Dtimeline%20%2Evis%2Dfill%20%7B%0Afill%2Dopacity%3A0%2E1%3B%0Astroke%3A%20none%3B%0A%7D%0A%2Evis%2Dtimeline%20%2Evis%2Dbar%20%7B%0Afill%2Dopacity%3A0%2E5%3B%0Astroke%2Dwidth%3A1px%3B%0A%7D%0A%2Evis%2Dtimeline%20%2Evis%2Dpoint%20%7B%0Astroke%2Dwidth%3A2px%3B%0Afill%2Dopacity%3A1%2E0%3B%0A%7D%0A%2Evis%2Dtimeline%20%2Evis%2Dlegend%2Dbackground%20%7B%0Astroke%2Dwidth%3A1px%3B%0Afill%2Dopacity%3A0%2E9%3B%0Afill%3A%20%23ffffff%3B%0Astroke%3A%20%23c2c2c2%3B%0A%7D%0A%2Evis%2Dtimeline%20%2Evis%2Doutline%20%7B%0Astroke%2Dwidth%3A1px%3B%0Afill%2Dopacity%3A1%3B%0Afill%3A%20%23ffffff%3B%0Astroke%3A%20%23e5e5e5%3B%0A%7D%0A%2Evis%2Dtimeline%20%2Evis%2Dicon%2Dfill%20%7B%0Afill%2Dopacity%3A0%2E3%3B%0Astroke%3A%20none%3B%0A%7D%0A%2Evis%2Dtime%2Daxis%20%7B%0Aposition%3A%20relative%3B%0Aoverflow%3A%20hidden%3B%0A%7D%0A%2Evis%2Dtime%2Daxis%2Evis%2Dforeground%20%7B%0Atop%3A%200%3B%0Aleft%3A%200%3B%0Awidth%3A%20100%25%3B%0A%7D%0A%2Evis%2Dtime%2Daxis%2Evis%2Dbackground%20%7B%0Aposition%3A%20absolute%3B%0Atop%3A%200%3B%0Aleft%3A%200%3B%0Awidth%3A%20100%25%3B%0Aheight%3A%20100%25%3B%0A%7D%0A%2Evis%2Dtime%2Daxis%20%2Evis%2Dtext%20%7B%0Aposition%3A%20absolute%3B%0Acolor%3A%20%234d4d4d%3B%0Apadding%3A%203px%3B%0Aoverflow%3A%20hidden%3B%0Abox%2Dsizing%3A%20border%2Dbox%3B%0Awhite%2Dspace%3A%20nowrap%3B%0A%7D%0A%2Evis%2Dtime%2Daxis%20%2Evis%2Dtext%2Evis%2Dmeasure%20%7B%0Aposition%3A%20absolute%3B%0Apadding%2Dleft%3A%200%3B%0Apadding%2Dright%3A%200%3B%0Amargin%2Dleft%3A%200%3B%0Amargin%2Dright%3A%200%3B%0Avisibility%3A%20hidden%3B%0A%7D%0A%2Evis%2Dtime%2Daxis%20%2Evis%2Dgrid%2Evis%2Dvertical%20%7B%0Aposition%3A%20absolute%3B%0Aborder%2Dleft%3A%201px%20solid%3B%0A%7D%0A%2Evis%2Dtime%2Daxis%20%2Evis%2Dgrid%2Evis%2Dvertical%2Drtl%20%7B%0Aposition%3A%20absolute%3B%0Aborder%2Dright%3A%201px%20solid%3B%0A%7D%0A%2Evis%2Dtime%2Daxis%20%2Evis%2Dgrid%2Evis%2Dminor%20%7B%0Aborder%2Dcolor%3A%20%23e5e5e5%3B%0A%7D%0A%2Evis%2Dtime%2Daxis%20%2Evis%2Dgrid%2Evis%2Dmajor%20%7B%0Aborder%2Dcolor%3A%20%23bfbfbf%3B%0A%7D%0A%2Evis%2Dtimeline%20%7B%0Aposition%3A%20relative%3B%0Aborder%3A%201px%20solid%20%23bfbfbf%3B%0Aoverflow%3A%20hidden%3B%0Apadding%3A%200%3B%0Amargin%3A%200%3B%0Abox%2Dsizing%3A%20border%2Dbox%3B%0A%7D%0A" rel="stylesheet" /> <script src="data:application/x-javascript;base64,LyoqCiAqIHZpcy5qcwogKiBodHRwczovL2dpdGh1Yi5jb20vYWxtZW5kZS92aXMKICoKICogQSBkeW5hbWljLCBicm93c2VyLWJhc2VkIHZpc3VhbGl6YXRpb24gbGlicmFyeS4KICoKICogQHZlcnNpb24gNC4xNy4wCiAqIEBkYXRlICAgIDIwMTYtMTEtMDUKICoKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTYgQWxtZW5kZSBCLlYsIGh0dHA6Ly9hbG1lbmRlLmNvbQogKgogKiBWaXMuanMgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciBib3RoCiAqCiAqICogVGhlIEFwYWNoZSAyLjAgTGljZW5zZQogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBhbmQKICoKICogKiBUaGUgTUlUIExpY2Vuc2UKICogICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqCiAqIFZpcy5qcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCiAqLwoidXNlIHN0cmljdCI7IWZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW10sZSk6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMudmlzPWUoKTp0LnZpcz1lKCl9KHRoaXMsZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShvKXtpZihpW29dKXJldHVybiBpW29dLmV4cG9ydHM7dmFyIG49aVtvXT17ZXhwb3J0czp7fSxpZDpvLGxvYWRlZDohMX07cmV0dXJuIHRbb10uY2FsbChuLmV4cG9ydHMsbixuLmV4cG9ydHMsZSksbi5sb2FkZWQ9ITAsbi5leHBvcnRzfXZhciBpPXt9O3JldHVybiBlLm09dCxlLmM9aSxlLnA9IiIsZSgwKX0oW2Z1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDEpO28uZXh0ZW5kKGUsaSg3KSksby5leHRlbmQoZSxpKDI2KSksby5leHRlbmQoZSxpKDYyKSl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH0sbj1pKDIpLHM9aSg2KTtlLmlzTnVtYmVyPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgTnVtYmVyfHwibnVtYmVyIj09dHlwZW9mIHR9LGUucmVjdXJzaXZlRE9NRGVsZXRlPWZ1bmN0aW9uKHQpe2lmKHQpZm9yKDt0Lmhhc0NoaWxkTm9kZXMoKT09PSEwOyllLnJlY3Vyc2l2ZURPTURlbGV0ZSh0LmZpcnN0Q2hpbGQpLHQucmVtb3ZlQ2hpbGQodC5maXJzdENoaWxkKX0sZS5naXZlUmFuZ2U9ZnVuY3Rpb24odCxlLGksbyl7aWYoZT09dClyZXR1cm4uNTt2YXIgbj0xLyhlLXQpO3JldHVybiBNYXRoLm1heCgwLChvLXQpKm4pfSxlLmlzU3RyaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgU3RyaW5nfHwic3RyaW5nIj09dHlwZW9mIHR9LGUuaXNEYXRlPWZ1bmN0aW9uKHQpe2lmKHQgaW5zdGFuY2VvZiBEYXRlKXJldHVybiEwO2lmKGUuaXNTdHJpbmcodCkpe3ZhciBpPXIuZXhlYyh0KTtpZihpKXJldHVybiEwO2lmKCFpc05hTihEYXRlLnBhcnNlKHQpKSlyZXR1cm4hMH1yZXR1cm4hMX0sZS5yYW5kb21VVUlEPWZ1bmN0aW9uKCl7cmV0dXJuIHMudjQoKX0sZS5hc3NpZ25BbGxLZXlzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShpKSYmIm9iamVjdCIhPT1vKHRbaV0pJiYodFtpXT1lKX0sZS5maWxsSWZEZWZpbmVkPWZ1bmN0aW9uKHQsaSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXTtmb3IodmFyIHMgaW4gdCl2b2lkIDAhPT1pW3NdJiYoIm9iamVjdCIhPT1vKGlbc10pP3ZvaWQgMCE9PWlbc10mJm51bGwhPT1pW3NdfHx2b2lkIDA9PT10W3NdfHxuIT09ITA/dFtzXT1pW3NdOmRlbGV0ZSB0W3NdOiJvYmplY3QiPT09byh0W3NdKSYmZS5maWxsSWZEZWZpbmVkKHRbc10saVtzXSxuKSl9LGUucHJvdG9FeHRlbmQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXt2YXIgbz1hcmd1bWVudHNbaV07Zm9yKHZhciBuIGluIG8pdFtuXT1vW25dfXJldHVybiB0fSxlLmV4dGVuZD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBvPWFyZ3VtZW50c1tpXTtmb3IodmFyIG4gaW4gbylvLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1vW25dKX1yZXR1cm4gdH0sZS5zZWxlY3RpdmVFeHRlbmQ9ZnVuY3Rpb24odCxlLGkpe2lmKCFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBFcnJvcigiQXJyYXkgd2l0aCBwcm9wZXJ0eSBuYW1lcyBleHBlY3RlZCBhcyBmaXJzdCBhcmd1bWVudCIpO2Zvcih2YXIgbz0yO288YXJndW1lbnRzLmxlbmd0aDtvKyspZm9yKHZhciBuPWFyZ3VtZW50c1tvXSxzPTA7czx0Lmxlbmd0aDtzKyspe3ZhciByPXRbc107bi5oYXNPd25Qcm9wZXJ0eShyKSYmKGVbcl09bltyXSl9cmV0dXJuIGV9LGUuc2VsZWN0aXZlRGVlcEV4dGVuZD1mdW5jdGlvbih0LGksbyl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10mJmFyZ3VtZW50c1szXTtpZihBcnJheS5pc0FycmF5KG8pKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5cyBhcmUgbm90IHN1cHBvcnRlZCBieSBkZWVwRXh0ZW5kIik7Zm9yKHZhciBzPTI7czxhcmd1bWVudHMubGVuZ3RoO3MrKylmb3IodmFyIHI9YXJndW1lbnRzW3NdLGE9MDthPHQubGVuZ3RoO2ErKyl7dmFyIGg9dFthXTtpZihyLmhhc093blByb3BlcnR5KGgpKWlmKG9baF0mJm9baF0uY29uc3RydWN0b3I9PT1PYmplY3Qpdm9pZCAwPT09aVtoXSYmKGlbaF09e30pLGlbaF0uY29uc3RydWN0b3I9PT1PYmplY3Q/ZS5kZWVwRXh0ZW5kKGlbaF0sb1toXSwhMSxuKTpudWxsPT09b1toXSYmdm9pZCAwIT09aVtoXSYmbj09PSEwP2RlbGV0ZSBpW2hdOmlbaF09b1toXTtlbHNle2lmKEFycmF5LmlzQXJyYXkob1toXSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXlzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IGRlZXBFeHRlbmQiKTtudWxsPT09b1toXSYmdm9pZCAwIT09aVtoXSYmbj09PSEwP2RlbGV0ZSBpW2hdOmlbaF09b1toXX19cmV0dXJuIGl9LGUuc2VsZWN0aXZlTm90RGVlcEV4dGVuZD1mdW5jdGlvbih0LGksbyl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10mJmFyZ3VtZW50c1szXTtpZihBcnJheS5pc0FycmF5KG8pKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5cyBhcmUgbm90IHN1cHBvcnRlZCBieSBkZWVwRXh0ZW5kIik7Zm9yKHZhciBzIGluIG8paWYoby5oYXNPd25Qcm9wZXJ0eShzKSYmdC5pbmRleE9mKHMpPT0tMSlpZihvW3NdJiZvW3NdLmNvbnN0cnVjdG9yPT09T2JqZWN0KXZvaWQgMD09PWlbc10mJihpW3NdPXt9KSxpW3NdLmNvbnN0cnVjdG9yPT09T2JqZWN0P2UuZGVlcEV4dGVuZChpW3NdLG9bc10pOm51bGw9PT1vW3NdJiZ2b2lkIDAhPT1pW3NdJiZuPT09ITA/ZGVsZXRlIGlbc106aVtzXT1vW3NdO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShvW3NdKSl7aVtzXT1bXTtmb3IodmFyIHI9MDtyPG9bc10ubGVuZ3RoO3IrKylpW3NdLnB1c2gob1tzXVtyXSl9ZWxzZSBudWxsPT09b1tzXSYmdm9pZCAwIT09aVtzXSYmbj09PSEwP2RlbGV0ZSBpW3NdOmlbc109b1tzXTtyZXR1cm4gaX0sZS5kZWVwRXh0ZW5kPWZ1bmN0aW9uKHQsaSxvLG4pe2Zvcih2YXIgcyBpbiBpKWlmKGkuaGFzT3duUHJvcGVydHkocyl8fG89PT0hMClpZihpW3NdJiZpW3NdLmNvbnN0cnVjdG9yPT09T2JqZWN0KXZvaWQgMD09PXRbc10mJih0W3NdPXt9KSx0W3NdLmNvbnN0cnVjdG9yPT09T2JqZWN0P2UuZGVlcEV4dGVuZCh0W3NdLGlbc10sbyk6bnVsbD09PWlbc10mJnZvaWQgMCE9PXRbc10mJm49PT0hMD9kZWxldGUgdFtzXTp0W3NdPWlbc107ZWxzZSBpZihBcnJheS5pc0FycmF5KGlbc10pKXt0W3NdPVtdO2Zvcih2YXIgcj0wO3I8aVtzXS5sZW5ndGg7cisrKXRbc10ucHVzaChpW3NdW3JdKX1lbHNlIG51bGw9PT1pW3NdJiZ2b2lkIDAhPT10W3NdJiZuPT09ITA/ZGVsZXRlIHRbc106dFtzXT1pW3NdO3JldHVybiB0fSxlLmVxdWFsQXJyYXk9ZnVuY3Rpb24odCxlKXtpZih0Lmxlbmd0aCE9ZS5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBpPTAsbz10Lmxlbmd0aDtpPG87aSsrKWlmKHRbaV0hPWVbaV0pcmV0dXJuITE7cmV0dXJuITB9LGUuY29udmVydD1mdW5jdGlvbih0LGkpe3ZhciBvO2lmKHZvaWQgMCE9PXQpe2lmKG51bGw9PT10KXJldHVybiBudWxsO2lmKCFpKXJldHVybiB0O2lmKCJzdHJpbmciIT10eXBlb2YgaSYmIShpIGluc3RhbmNlb2YgU3RyaW5nKSl0aHJvdyBuZXcgRXJyb3IoIlR5cGUgbXVzdCBiZSBhIHN0cmluZyIpO3N3aXRjaChpKXtjYXNlImJvb2xlYW4iOmNhc2UiQm9vbGVhbiI6cmV0dXJuIEJvb2xlYW4odCk7Y2FzZSJudW1iZXIiOmNhc2UiTnVtYmVyIjpyZXR1cm4gaXNOYU4oRGF0ZS5wYXJzZSh0KSk/TnVtYmVyKHQudmFsdWVPZigpKTpuKHQpLnZhbHVlT2YoKTtjYXNlInN0cmluZyI6Y2FzZSJTdHJpbmciOnJldHVybiBTdHJpbmcodCk7Y2FzZSJEYXRlIjppZihlLmlzTnVtYmVyKHQpKXJldHVybiBuZXcgRGF0ZSh0KTtpZih0IGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gbmV3IERhdGUodC52YWx1ZU9mKCkpO2lmKG4uaXNNb21lbnQodCkpcmV0dXJuIG5ldyBEYXRlKHQudmFsdWVPZigpKTtpZihlLmlzU3RyaW5nKHQpKXJldHVybiBvPXIuZXhlYyh0KSxvP25ldyBEYXRlKE51bWJlcihvWzFdKSk6bihuZXcgRGF0ZSh0KSkudG9EYXRlKCk7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY29udmVydCBvYmplY3Qgb2YgdHlwZSAiK2UuZ2V0VHlwZSh0KSsiIHRvIHR5cGUgRGF0ZSIpO2Nhc2UiTW9tZW50IjppZihlLmlzTnVtYmVyKHQpKXJldHVybiBuKHQpO2lmKHQgaW5zdGFuY2VvZiBEYXRlKXJldHVybiBuKHQudmFsdWVPZigpKTtpZihuLmlzTW9tZW50KHQpKXJldHVybiBuKHQpO2lmKGUuaXNTdHJpbmcodCkpcmV0dXJuIG89ci5leGVjKHQpLG4obz9OdW1iZXIob1sxXSk6dCk7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY29udmVydCBvYmplY3Qgb2YgdHlwZSAiK2UuZ2V0VHlwZSh0KSsiIHRvIHR5cGUgRGF0ZSIpO2Nhc2UiSVNPRGF0ZSI6aWYoZS5pc051bWJlcih0KSlyZXR1cm4gbmV3IERhdGUodCk7aWYodCBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIHQudG9JU09TdHJpbmcoKTtpZihuLmlzTW9tZW50KHQpKXJldHVybiB0LnRvRGF0ZSgpLnRvSVNPU3RyaW5nKCk7aWYoZS5pc1N0cmluZyh0KSlyZXR1cm4gbz1yLmV4ZWModCksbz9uZXcgRGF0ZShOdW1iZXIob1sxXSkpLnRvSVNPU3RyaW5nKCk6bih0KS5mb3JtYXQoKTt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBjb252ZXJ0IG9iamVjdCBvZiB0eXBlICIrZS5nZXRUeXBlKHQpKyIgdG8gdHlwZSBJU09EYXRlIik7Y2FzZSJBU1BEYXRlIjppZihlLmlzTnVtYmVyKHQpKXJldHVybiIvRGF0ZSgiK3QrIikvIjtpZih0IGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4iL0RhdGUoIit0LnZhbHVlT2YoKSsiKS8iO2lmKGUuaXNTdHJpbmcodCkpe289ci5leGVjKHQpO3ZhciBzO3JldHVybiBzPW8/bmV3IERhdGUoTnVtYmVyKG9bMV0pKS52YWx1ZU9mKCk6bmV3IERhdGUodCkudmFsdWVPZigpLCIvRGF0ZSgiK3MrIikvIn10aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBjb252ZXJ0IG9iamVjdCBvZiB0eXBlICIrZS5nZXRUeXBlKHQpKyIgdG8gdHlwZSBBU1BEYXRlIik7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gdHlwZSAiJytpKyciJyl9fX07dmFyIHI9L15cLz9EYXRlXCgoXC0/XGQrKS9pO2UuZ2V0VHlwZT1mdW5jdGlvbih0KXt2YXIgZT0idW5kZWZpbmVkIj09dHlwZW9mIHQ/InVuZGVmaW5lZCI6byh0KTtyZXR1cm4ib2JqZWN0Ij09ZT9udWxsPT09dD8ibnVsbCI6dCBpbnN0YW5jZW9mIEJvb2xlYW4/IkJvb2xlYW4iOnQgaW5zdGFuY2VvZiBOdW1iZXI/Ik51bWJlciI6dCBpbnN0YW5jZW9mIFN0cmluZz8iU3RyaW5nIjpBcnJheS5pc0FycmF5KHQpPyJBcnJheSI6dCBpbnN0YW5jZW9mIERhdGU/IkRhdGUiOiJPYmplY3QiOiJudW1iZXIiPT1lPyJOdW1iZXIiOiJib29sZWFuIj09ZT8iQm9vbGVhbiI6InN0cmluZyI9PWU/IlN0cmluZyI6dm9pZCAwPT09ZT8idW5kZWZpbmVkIjplfSxlLmNvcHlBbmRFeHRlbmRBcnJheT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT1bXSxvPTA7bzx0Lmxlbmd0aDtvKyspaS5wdXNoKHRbb10pO3JldHVybiBpLnB1c2goZSksaX0sZS5jb3B5QXJyYXk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLGk9MDtpPHQubGVuZ3RoO2krKyllLnB1c2godFtpXSk7cmV0dXJuIGV9LGUuZ2V0QWJzb2x1dGVMZWZ0PWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnR9LGUuZ2V0QWJzb2x1dGVSaWdodD1mdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodH0sZS5nZXRBYnNvbHV0ZVRvcD1mdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3B9LGUuYWRkQ2xhc3NOYW1lPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5jbGFzc05hbWUuc3BsaXQoIiAiKTtpLmluZGV4T2YoZSk9PS0xJiYoaS5wdXNoKGUpLHQuY2xhc3NOYW1lPWkuam9pbigiICIpKX0sZS5yZW1vdmVDbGFzc05hbWU9ZnVuY3Rpb24odCxlKXt2YXIgaT10LmNsYXNzTmFtZS5zcGxpdCgiICIpLG89aS5pbmRleE9mKGUpO28hPS0xJiYoaS5zcGxpY2UobywxKSx0LmNsYXNzTmFtZT1pLmpvaW4oIiAiKSl9LGUuZm9yRWFjaD1mdW5jdGlvbih0LGUpe3ZhciBpLG87aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IoaT0wLG89dC5sZW5ndGg7aTxvO2krKyllKHRbaV0saSx0KTtlbHNlIGZvcihpIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShpKSYmZSh0W2ldLGksdCl9LGUudG9BcnJheT1mdW5jdGlvbih0KXt2YXIgZT1bXTtmb3IodmFyIGkgaW4gdCl0Lmhhc093blByb3BlcnR5KGkpJiZlLnB1c2godFtpXSk7cmV0dXJuIGV9LGUudXBkYXRlUHJvcGVydHk9ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0W2VdIT09aSYmKHRbZV09aSwhMCl9LGUudGhyb3R0bGU9ZnVuY3Rpb24odCl7dmFyIGU9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7ZXx8KGU9ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7ZT0hMSx0KCl9KSl9fSxlLmFkZEV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24odCxlLGksbyl7dC5hZGRFdmVudExpc3RlbmVyPyh2b2lkIDA9PT1vJiYobz0hMSksIm1vdXNld2hlZWwiPT09ZSYmbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94Iik+PTAmJihlPSJET01Nb3VzZVNjcm9sbCIpLHQuYWRkRXZlbnRMaXN0ZW5lcihlLGksbykpOnQuYXR0YWNoRXZlbnQoIm9uIitlLGkpfSxlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24odCxlLGksbyl7dC5yZW1vdmVFdmVudExpc3RlbmVyPyh2b2lkIDA9PT1vJiYobz0hMSksIm1vdXNld2hlZWwiPT09ZSYmbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94Iik+PTAmJihlPSJET01Nb3VzZVNjcm9sbCIpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLGksbykpOnQuZGV0YWNoRXZlbnQoIm9uIitlLGkpfSxlLnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKHQpe3R8fCh0PXdpbmRvdy5ldmVudCksdC5wcmV2ZW50RGVmYXVsdD90LnByZXZlbnREZWZhdWx0KCk6dC5yZXR1cm5WYWx1ZT0hMX0sZS5nZXRUYXJnZXQ9ZnVuY3Rpb24odCl7dHx8KHQ9d2luZG93LmV2ZW50KTt2YXIgZTtyZXR1cm4gdC50YXJnZXQ/ZT10LnRhcmdldDp0LnNyY0VsZW1lbnQmJihlPXQuc3JjRWxlbWVudCksdm9pZCAwIT1lLm5vZGVUeXBlJiYzPT1lLm5vZGVUeXBlJiYoZT1lLnBhcmVudE5vZGUpLGV9LGUuaGFzUGFyZW50PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPXQ7aTspe2lmKGk9PT1lKXJldHVybiEwO2k9aS5wYXJlbnROb2RlfXJldHVybiExfSxlLm9wdGlvbj17fSxlLm9wdGlvbi5hc0Jvb2xlYW49ZnVuY3Rpb24odCxlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQ9dCgpKSxudWxsIT10PzAhPXQ6ZXx8bnVsbH0sZS5vcHRpb24uYXNOdW1iZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQ9dCgpKSxudWxsIT10P051bWJlcih0KXx8ZXx8bnVsbDplfHxudWxsfSxlLm9wdGlvbi5hc1N0cmluZz1mdW5jdGlvbih0LGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodD10KCkpLG51bGwhPXQ/U3RyaW5nKHQpOmV8fG51bGx9LGUub3B0aW9uLmFzU2l6ZT1mdW5jdGlvbih0LGkpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodD10KCkpLGUuaXNTdHJpbmcodCk/dDplLmlzTnVtYmVyKHQpP3QrInB4IjppfHxudWxsfSxlLm9wdGlvbi5hc0VsZW1lbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQ9dCgpKSx0fHxlfHxudWxsfSxlLmhleFRvUkdCPWZ1bmN0aW9uKHQpe3ZhciBlPS9eIz8oW2EtZlxkXSkoW2EtZlxkXSkoW2EtZlxkXSkkL2k7dD10LnJlcGxhY2UoZSxmdW5jdGlvbih0LGUsaSxvKXtyZXR1cm4gZStlK2kraStvK299KTt2YXIgaT0vXiM/KFthLWZcZF17Mn0pKFthLWZcZF17Mn0pKFthLWZcZF17Mn0pJC9pLmV4ZWModCk7cmV0dXJuIGk/e3I6cGFyc2VJbnQoaVsxXSwxNiksZzpwYXJzZUludChpWzJdLDE2KSxiOnBhcnNlSW50KGlbM10sMTYpfTpudWxsfSxlLm92ZXJyaWRlT3BhY2l0eT1mdW5jdGlvbih0LGkpe2lmKHQuaW5kZXhPZigicmdiYSIpIT0tMSlyZXR1cm4gdDtpZih0LmluZGV4T2YoInJnYiIpIT0tMSl7dmFyIG89dC5zdWJzdHIodC5pbmRleE9mKCIoIikrMSkucmVwbGFjZSgiKSIsIiIpLnNwbGl0KCIsIik7cmV0dXJuInJnYmEoIitvWzBdKyIsIitvWzFdKyIsIitvWzJdKyIsIitpKyIpIn12YXIgbz1lLmhleFRvUkdCKHQpO3JldHVybiBudWxsPT1vP3Q6InJnYmEoIitvLnIrIiwiK28uZysiLCIrby5iKyIsIitpKyIpIn0sZS5SR0JUb0hleD1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIiMiKygoMTw8MjQpKyh0PDwxNikrKGU8PDgpK2kpLnRvU3RyaW5nKDE2KS5zbGljZSgxKX0sZS5wYXJzZUNvbG9yPWZ1bmN0aW9uKHQpe3ZhciBpO2lmKGUuaXNTdHJpbmcodCk9PT0hMCl7aWYoZS5pc1ZhbGlkUkdCKHQpPT09ITApe3ZhciBvPXQuc3Vic3RyKDQpLnN1YnN0cigwLHQubGVuZ3RoLTUpLnNwbGl0KCIsIikubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBwYXJzZUludCh0KX0pO3Q9ZS5SR0JUb0hleChvWzBdLG9bMV0sb1syXSl9aWYoZS5pc1ZhbGlkSGV4KHQpPT09ITApe3ZhciBuPWUuaGV4VG9IU1YodCkscz17aDpuLmgsczouOCpuLnMsdjpNYXRoLm1pbigxLDEuMDIqbi52KX0scj17aDpuLmgsczpNYXRoLm1pbigxLDEuMjUqbi5zKSx2Oi44Km4udn0sYT1lLkhTVlRvSGV4KHIuaCxyLnMsci52KSxoPWUuSFNWVG9IZXgocy5oLHMucyxzLnYpO2k9e2JhY2tncm91bmQ6dCxib3JkZXI6YSxoaWdobGlnaHQ6e2JhY2tncm91bmQ6aCxib3JkZXI6YX0saG92ZXI6e2JhY2tncm91bmQ6aCxib3JkZXI6YX19fWVsc2UgaT17YmFja2dyb3VuZDp0LGJvcmRlcjp0LGhpZ2hsaWdodDp7YmFja2dyb3VuZDp0LGJvcmRlcjp0fSxob3Zlcjp7YmFja2dyb3VuZDp0LGJvcmRlcjp0fX19ZWxzZSBpPXt9LGkuYmFja2dyb3VuZD10LmJhY2tncm91bmR8fHZvaWQgMCxpLmJvcmRlcj10LmJvcmRlcnx8dm9pZCAwLGUuaXNTdHJpbmcodC5oaWdobGlnaHQpP2kuaGlnaGxpZ2h0PXtib3JkZXI6dC5oaWdobGlnaHQsYmFja2dyb3VuZDp0LmhpZ2hsaWdodH06KGkuaGlnaGxpZ2h0PXt9LGkuaGlnaGxpZ2h0LmJhY2tncm91bmQ9dC5oaWdobGlnaHQmJnQuaGlnaGxpZ2h0LmJhY2tncm91bmR8fHZvaWQgMCxpLmhpZ2hsaWdodC5ib3JkZXI9dC5oaWdobGlnaHQmJnQuaGlnaGxpZ2h0LmJvcmRlcnx8dm9pZCAwKSxlLmlzU3RyaW5nKHQuaG92ZXIpP2kuaG92ZXI9e2JvcmRlcjp0LmhvdmVyLGJhY2tncm91bmQ6dC5ob3Zlcn06KGkuaG92ZXI9e30saS5ob3Zlci5iYWNrZ3JvdW5kPXQuaG92ZXImJnQuaG92ZXIuYmFja2dyb3VuZHx8dm9pZCAwLGkuaG92ZXIuYm9yZGVyPXQuaG92ZXImJnQuaG92ZXIuYm9yZGVyfHx2b2lkIDApO3JldHVybiBpfSxlLlJHQlRvSFNWPWZ1bmN0aW9uKHQsZSxpKXt0Lz0yNTUsZS89MjU1LGkvPTI1NTt2YXIgbz1NYXRoLm1pbih0LE1hdGgubWluKGUsaSkpLG49TWF0aC5tYXgodCxNYXRoLm1heChlLGkpKTtpZihvPT1uKXJldHVybntoOjAsczowLHY6b307dmFyIHM9dD09bz9lLWk6aT09bz90LWU6aS10LHI9dD09bz8zOmk9PW8/MTo1LGE9NjAqKHItcy8obi1vKSkvMzYwLGg9KG4tbykvbixkPW47cmV0dXJue2g6YSxzOmgsdjpkfX07dmFyIGE9e3NwbGl0OmZ1bmN0aW9uKHQpe3ZhciBlPXt9O3JldHVybiB0LnNwbGl0KCI7IikuZm9yRWFjaChmdW5jdGlvbih0KXtpZigiIiE9dC50cmltKCkpe3ZhciBpPXQuc3BsaXQoIjoiKSxvPWlbMF0udHJpbSgpLG49aVsxXS50cmltKCk7ZVtvXT1ufX0pLGV9LGpvaW46ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5rZXlzKHQpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZSsiOiAiK3RbZV19KS5qb2luKCI7ICIpfX07ZS5hZGRDc3NUZXh0PWZ1bmN0aW9uKHQsaSl7dmFyIG89YS5zcGxpdCh0LnN0eWxlLmNzc1RleHQpLG49YS5zcGxpdChpKSxzPWUuZXh0ZW5kKG8sbik7dC5zdHlsZS5jc3NUZXh0PWEuam9pbihzKX0sZS5yZW1vdmVDc3NUZXh0PWZ1bmN0aW9uKHQsZSl7dmFyIGk9YS5zcGxpdCh0LnN0eWxlLmNzc1RleHQpLG89YS5zcGxpdChlKTtmb3IodmFyIG4gaW4gbylvLmhhc093blByb3BlcnR5KG4pJiZkZWxldGUgaVtuXTt0LnN0eWxlLmNzc1RleHQ9YS5qb2luKGkpfSxlLkhTVlRvUkdCPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbyxuLHMscj1NYXRoLmZsb29yKDYqdCksYT02KnQtcixoPWkqKDEtZSksZD1pKigxLWEqZSksbD1pKigxLSgxLWEpKmUpO3N3aXRjaChyJTYpe2Nhc2UgMDpvPWksbj1sLHM9aDticmVhaztjYXNlIDE6bz1kLG49aSxzPWg7YnJlYWs7Y2FzZSAyOm89aCxuPWkscz1sO2JyZWFrO2Nhc2UgMzpvPWgsbj1kLHM9aTticmVhaztjYXNlIDQ6bz1sLG49aCxzPWk7YnJlYWs7Y2FzZSA1Om89aSxuPWgscz1kfXJldHVybntyOk1hdGguZmxvb3IoMjU1Km8pLGc6TWF0aC5mbG9vcigyNTUqbiksYjpNYXRoLmZsb29yKDI1NSpzKX19LGUuSFNWVG9IZXg9ZnVuY3Rpb24odCxpLG8pe3ZhciBuPWUuSFNWVG9SR0IodCxpLG8pO3JldHVybiBlLlJHQlRvSGV4KG4ucixuLmcsbi5iKX0sZS5oZXhUb0hTVj1mdW5jdGlvbih0KXt2YXIgaT1lLmhleFRvUkdCKHQpO3JldHVybiBlLlJHQlRvSFNWKGkucixpLmcsaS5iKX0sZS5pc1ZhbGlkSGV4PWZ1bmN0aW9uKHQpe3ZhciBlPS8oXiNbMC05QS1GXXs2fSQpfCheI1swLTlBLUZdezN9JCkvaS50ZXN0KHQpO3JldHVybiBlfSxlLmlzVmFsaWRSR0I9ZnVuY3Rpb24odCl7dD10LnJlcGxhY2UoIiAiLCIiKTt2YXIgZT0vcmdiXCgoXGR7MSwzfSksKFxkezEsM30pLChcZHsxLDN9KVwpL2kudGVzdCh0KTtyZXR1cm4gZX0sZS5pc1ZhbGlkUkdCQT1mdW5jdGlvbih0KXt0PXQucmVwbGFjZSgiICIsIiIpO3ZhciBlPS9yZ2JhXCgoXGR7MSwzfSksKFxkezEsM30pLChcZHsxLDN9KSwoLnsxLDN9KVwpL2kudGVzdCh0KTtyZXR1cm4gZX0sZS5zZWxlY3RpdmVCcmlkZ2VPYmplY3Q9ZnVuY3Rpb24odCxpKXtpZigib2JqZWN0Ij09KCJ1bmRlZmluZWQiPT10eXBlb2YgaT8idW5kZWZpbmVkIjpvKGkpKSl7Zm9yKHZhciBuPU9iamVjdC5jcmVhdGUoaSkscz0wO3M8dC5sZW5ndGg7cysrKWkuaGFzT3duUHJvcGVydHkodFtzXSkmJiJvYmplY3QiPT1vKGlbdFtzXV0pJiYoblt0W3NdXT1lLmJyaWRnZU9iamVjdChpW3Rbc11dKSk7cmV0dXJuIG59cmV0dXJuIG51bGx9LGUuYnJpZGdlT2JqZWN0PWZ1bmN0aW9uKHQpe2lmKCJvYmplY3QiPT0oInVuZGVmaW5lZCI9PXR5cGVvZiB0PyJ1bmRlZmluZWQiOm8odCkpKXt2YXIgaT1PYmplY3QuY3JlYXRlKHQpO2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJiJvYmplY3QiPT1vKHRbbl0pJiYoaVtuXT1lLmJyaWRnZU9iamVjdCh0W25dKSk7cmV0dXJuIGl9cmV0dXJuIG51bGx9LGUuaW5zZXJ0U29ydD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKXtmb3IodmFyIG89dFtpXSxuPWk7bj4wJiZlKG8sdFtuLTFdKTwwO24tLSl0W25dPXRbbi0xXTt0W25dPW99cmV0dXJuIHR9LGUubWVyZ2VPcHRpb25zPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbz0oYXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10mJmFyZ3VtZW50c1szXSxhcmd1bWVudHMubGVuZ3RoPjQmJnZvaWQgMCE9PWFyZ3VtZW50c1s0XT9hcmd1bWVudHNbNF06e30pO2lmKG51bGw9PT1lW2ldKXRbaV09T2JqZWN0LmNyZWF0ZShvW2ldKTtlbHNlIGlmKHZvaWQgMCE9PWVbaV0paWYoImJvb2xlYW4iPT10eXBlb2YgZVtpXSl0W2ldLmVuYWJsZWQ9ZVtpXTtlbHNle3ZvaWQgMD09PWVbaV0uZW5hYmxlZCYmKHRbaV0uZW5hYmxlZD0hMCk7Zm9yKHZhciBuIGluIGVbaV0pZVtpXS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbaV1bbl09ZVtpXVtuXSl9fSxlLmJpbmFyeVNlYXJjaEN1c3RvbT1mdW5jdGlvbih0LGUsaSxvKXtmb3IodmFyIG49MWU0LHM9MCxyPTAsYT10Lmxlbmd0aC0xO3I8PWEmJnM8bjspe3ZhciBoPU1hdGguZmxvb3IoKHIrYSkvMiksZD10W2hdLGw9dm9pZCAwPT09bz9kW2ldOmRbaV1bb10sYz1lKGwpO2lmKDA9PWMpcmV0dXJuIGg7Yz09LTE/cj1oKzE6YT1oLTEscysrfXJldHVybi0xfSxlLmJpbmFyeVNlYXJjaFZhbHVlPWZ1bmN0aW9uKHQsZSxpLG8sbil7Zm9yKHZhciBzLHIsYSxoLGQ9MWU0LGw9MCxjPTAsdT10Lmxlbmd0aC0xLG49dm9pZCAwIT1uP246ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09ZT8wOnQ8ZT8tMToxfTtjPD11JiZsPGQ7KXtpZihoPU1hdGguZmxvb3IoLjUqKHUrYykpLHM9dFtNYXRoLm1heCgwLGgtMSldW2ldLHI9dFtoXVtpXSxhPXRbTWF0aC5taW4odC5sZW5ndGgtMSxoKzEpXVtpXSwwPT1uKHIsZSkpcmV0dXJuIGg7aWYobihzLGUpPDAmJm4ocixlKT4wKXJldHVybiJiZWZvcmUiPT1vP01hdGgubWF4KDAsaC0xKTpoO2lmKG4ocixlKTwwJiZuKGEsZSk+MClyZXR1cm4iYmVmb3JlIj09bz9oOk1hdGgubWluKHQubGVuZ3RoLTEsaCsxKTtuKHIsZSk8MD9jPWgrMTp1PWgtMSxsKyt9cmV0dXJuLTF9LGUuZWFzaW5nRnVuY3Rpb25zPXtsaW5lYXI6ZnVuY3Rpb24odCl7cmV0dXJuIHR9LGVhc2VJblF1YWQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQqdH0sZWFzZU91dFF1YWQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQqKDItdCl9LGVhc2VJbk91dFF1YWQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ8LjU/Mip0KnQ6LTErKDQtMip0KSp0fSxlYXNlSW5DdWJpYzpmdW5jdGlvbih0KXtyZXR1cm4gdCp0KnR9LGVhc2VPdXRDdWJpYzpmdW5jdGlvbih0KXtyZXR1cm4tLXQqdCp0KzF9LGVhc2VJbk91dEN1YmljOmZ1bmN0aW9uKHQpe3JldHVybiB0PC41PzQqdCp0KnQ6KHQtMSkqKDIqdC0yKSooMip0LTIpKzF9LGVhc2VJblF1YXJ0OmZ1bmN0aW9uKHQpe3JldHVybiB0KnQqdCp0fSxlYXNlT3V0UXVhcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIDEtIC0tdCp0KnQqdH0sZWFzZUluT3V0UXVhcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ8LjU/OCp0KnQqdCp0OjEtOCotLXQqdCp0KnR9LGVhc2VJblF1aW50OmZ1bmN0aW9uKHQpe3JldHVybiB0KnQqdCp0KnR9LGVhc2VPdXRRdWludDpmdW5jdGlvbih0KXtyZXR1cm4gMSstLXQqdCp0KnQqdH0sZWFzZUluT3V0UXVpbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ8LjU/MTYqdCp0KnQqdCp0OjErMTYqLS10KnQqdCp0KnR9fSxlLmdldFNjcm9sbEJhcldpZHRoPWZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicCIpO3Quc3R5bGUud2lkdGg9IjEwMCUiLHQuc3R5bGUuaGVpZ2h0PSIyMDBweCI7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGUuc3R5bGUudG9wPSIwcHgiLGUuc3R5bGUubGVmdD0iMHB4IixlLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIsZS5zdHlsZS53aWR0aD0iMjAwcHgiLGUuc3R5bGUuaGVpZ2h0PSIxNTBweCIsZS5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixlLmFwcGVuZENoaWxkKHQpLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGk9dC5vZmZzZXRXaWR0aDtlLnN0eWxlLm92ZXJmbG93PSJzY3JvbGwiO3ZhciBvPXQub2Zmc2V0V2lkdGg7cmV0dXJuIGk9PW8mJihvPWUuY2xpZW50V2lkdGgpLGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSksaS1vfX0sZnVuY3Rpb24odCxlLGkpe3QuZXhwb3J0cz0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93Lm1vbWVudHx8aSgzKX0sZnVuY3Rpb24odCxlLGkpeyhmdW5jdGlvbih0KXshZnVuY3Rpb24oZSxpKXt0LmV4cG9ydHM9aSgpfSh0aGlzLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3JldHVybiBmby5hcHBseShudWxsLGFyZ3VtZW50cyl9ZnVuY3Rpb24gaSh0KXtmbz10fWZ1bmN0aW9uIG8odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBBcnJheXx8IltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBuKHQpe3JldHVybiBudWxsIT10JiYiW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBzKHQpe3ZhciBlO2ZvcihlIGluIHQpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIERhdGV8fCJbb2JqZWN0IERhdGVdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBhKHQsZSl7dmFyIGksbz1bXTtmb3IoaT0wO2k8dC5sZW5ndGg7KytpKW8ucHVzaChlKHRbaV0saSkpO3JldHVybiBvfWZ1bmN0aW9uIGgodCxlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9ZnVuY3Rpb24gZCh0LGUpe2Zvcih2YXIgaSBpbiBlKWgoZSxpKSYmKHRbaV09ZVtpXSk7cmV0dXJuIGgoZSwidG9TdHJpbmciKSYmKHQudG9TdHJpbmc9ZS50b1N0cmluZyksaChlLCJ2YWx1ZU9mIikmJih0LnZhbHVlT2Y9ZS52YWx1ZU9mKSx0fWZ1bmN0aW9uIGwodCxlLGksbyl7cmV0dXJuIGdlKHQsZSxpLG8sITApLnV0YygpfWZ1bmN0aW9uIGMoKXtyZXR1cm57ZW1wdHk6ITEsdW51c2VkVG9rZW5zOltdLHVudXNlZElucHV0OltdLG92ZXJmbG93Oi0yLGNoYXJzTGVmdE92ZXI6MCxudWxsSW5wdXQ6ITEsaW52YWxpZE1vbnRoOm51bGwsaW52YWxpZEZvcm1hdDohMSx1c2VySW52YWxpZGF0ZWQ6ITEsaXNvOiExLHBhcnNlZERhdGVQYXJ0czpbXSxtZXJpZGllbTpudWxsfX1mdW5jdGlvbiB1KHQpe3JldHVybiBudWxsPT10Ll9wZiYmKHQuX3BmPWMoKSksdC5fcGZ9ZnVuY3Rpb24gcCh0KXtpZihudWxsPT10Ll9pc1ZhbGlkKXt2YXIgZT11KHQpLGk9bW8uY2FsbChlLnBhcnNlZERhdGVQYXJ0cyxmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dH0pLG89IWlzTmFOKHQuX2QuZ2V0VGltZSgpKSYmZS5vdmVyZmxvdzwwJiYhZS5lbXB0eSYmIWUuaW52YWxpZE1vbnRoJiYhZS5pbnZhbGlkV2Vla2RheSYmIWUubnVsbElucHV0JiYhZS5pbnZhbGlkRm9ybWF0JiYhZS51c2VySW52YWxpZGF0ZWQmJighZS5tZXJpZGllbXx8ZS5tZXJpZGllbSYmaSk7aWYodC5fc3RyaWN0JiYobz1vJiYwPT09ZS5jaGFyc0xlZnRPdmVyJiYwPT09ZS51bnVzZWRUb2tlbnMubGVuZ3RoJiZ2b2lkIDA9PT1lLmJpZ0hvdXIpLG51bGwhPU9iamVjdC5pc0Zyb3plbiYmT2JqZWN0LmlzRnJvemVuKHQpKXJldHVybiBvO3QuX2lzVmFsaWQ9b31yZXR1cm4gdC5faXNWYWxpZH1mdW5jdGlvbiBmKHQpe3ZhciBlPWwoTmFOKTtyZXR1cm4gbnVsbCE9dD9kKHUoZSksdCk6dShlKS51c2VySW52YWxpZGF0ZWQ9ITAsZX1mdW5jdGlvbiBtKHQpe3JldHVybiB2b2lkIDA9PT10fWZ1bmN0aW9uIHYodCxlKXt2YXIgaSxvLG47aWYobShlLl9pc0FNb21lbnRPYmplY3QpfHwodC5faXNBTW9tZW50T2JqZWN0PWUuX2lzQU1vbWVudE9iamVjdCksbShlLl9pKXx8KHQuX2k9ZS5faSksbShlLl9mKXx8KHQuX2Y9ZS5fZiksbShlLl9sKXx8KHQuX2w9ZS5fbCksbShlLl9zdHJpY3QpfHwodC5fc3RyaWN0PWUuX3N0cmljdCksbShlLl90em0pfHwodC5fdHptPWUuX3R6bSksbShlLl9pc1VUQyl8fCh0Ll9pc1VUQz1lLl9pc1VUQyksbShlLl9vZmZzZXQpfHwodC5fb2Zmc2V0PWUuX29mZnNldCksbShlLl9wZil8fCh0Ll9wZj11KGUpKSxtKGUuX2xvY2FsZSl8fCh0Ll9sb2NhbGU9ZS5fbG9jYWxlKSx2by5sZW5ndGg+MClmb3IoaSBpbiB2bylvPXZvW2ldLG49ZVtvXSxtKG4pfHwodFtvXT1uKTtyZXR1cm4gdH1mdW5jdGlvbiBnKHQpe3YodGhpcyx0KSx0aGlzLl9kPW5ldyBEYXRlKG51bGwhPXQuX2Q/dC5fZC5nZXRUaW1lKCk6TmFOKSxnbz09PSExJiYoZ289ITAsZS51cGRhdGVPZmZzZXQodGhpcyksZ289ITEpfWZ1bmN0aW9uIHkodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBnfHxudWxsIT10JiZudWxsIT10Ll9pc0FNb21lbnRPYmplY3R9ZnVuY3Rpb24gYih0KXtyZXR1cm4gdDwwP01hdGguY2VpbCh0KXx8MDpNYXRoLmZsb29yKHQpfWZ1bmN0aW9uIF8odCl7dmFyIGU9K3QsaT0wO3JldHVybiAwIT09ZSYmaXNGaW5pdGUoZSkmJihpPWIoZSkpLGl9ZnVuY3Rpb24gdyh0LGUsaSl7dmFyIG8sbj1NYXRoLm1pbih0Lmxlbmd0aCxlLmxlbmd0aCkscz1NYXRoLmFicyh0Lmxlbmd0aC1lLmxlbmd0aCkscj0wO2ZvcihvPTA7bzxuO28rKykoaSYmdFtvXSE9PWVbb118fCFpJiZfKHRbb10pIT09XyhlW29dKSkmJnIrKztyZXR1cm4gcitzfWZ1bmN0aW9uIHgodCl7ZS5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3M9PT0hMSYmInVuZGVmaW5lZCIhPXR5cGVvZiBjb25zb2xlJiZjb25zb2xlLndhcm4mJmNvbnNvbGUud2FybigiRGVwcmVjYXRpb24gd2FybmluZzogIit0KX1mdW5jdGlvbiBrKHQsaSl7dmFyIG89ITA7cmV0dXJuIGQoZnVuY3Rpb24oKXtpZihudWxsIT1lLmRlcHJlY2F0aW9uSGFuZGxlciYmZS5kZXByZWNhdGlvbkhhbmRsZXIobnVsbCx0KSxvKXtmb3IodmFyIG4scz1bXSxyPTA7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyl7aWYobj0iIiwib2JqZWN0Ij09dHlwZW9mIGFyZ3VtZW50c1tyXSl7bis9IlxuWyIrcisiXSAiO2Zvcih2YXIgYSBpbiBhcmd1bWVudHNbMF0pbis9YSsiOiAiK2FyZ3VtZW50c1swXVthXSsiLCAiO249bi5zbGljZSgwLC0yKX1lbHNlIG49YXJndW1lbnRzW3JdO3MucHVzaChuKX14KHQrIlxuQXJndW1lbnRzOiAiK0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHMpLmpvaW4oIiIpKyJcbiIrKG5ldyBFcnJvcikuc3RhY2spLG89ITF9cmV0dXJuIGkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxpKX1mdW5jdGlvbiBPKHQsaSl7bnVsbCE9ZS5kZXByZWNhdGlvbkhhbmRsZXImJmUuZGVwcmVjYXRpb25IYW5kbGVyKHQsaSkseW9bdF18fCh4KGkpLHlvW3RdPSEwKX1mdW5jdGlvbiBEKHQpe3JldHVybiB0IGluc3RhbmNlb2YgRnVuY3Rpb258fCJbb2JqZWN0IEZ1bmN0aW9uXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gUyh0KXt2YXIgZSxpO2ZvcihpIGluIHQpZT10W2ldLEQoZSk/dGhpc1tpXT1lOnRoaXNbIl8iK2ldPWU7dGhpcy5fY29uZmlnPXQsdGhpcy5fb3JkaW5hbFBhcnNlTGVuaWVudD1uZXcgUmVnRXhwKHRoaXMuX29yZGluYWxQYXJzZS5zb3VyY2UrInwiKy9cZHsxLDJ9Ly5zb3VyY2UpfWZ1bmN0aW9uIEModCxlKXt2YXIgaSxvPWQoe30sdCk7Zm9yKGkgaW4gZSloKGUsaSkmJihuKHRbaV0pJiZuKGVbaV0pPyhvW2ldPXt9LGQob1tpXSx0W2ldKSxkKG9baV0sZVtpXSkpOm51bGwhPWVbaV0/b1tpXT1lW2ldOmRlbGV0ZSBvW2ldKTtmb3IoaSBpbiB0KWgodCxpKSYmIWgoZSxpKSYmbih0W2ldKSYmKG9baV09ZCh7fSxvW2ldKSk7cmV0dXJuIG99ZnVuY3Rpb24gVCh0KXtudWxsIT10JiZ0aGlzLnNldCh0KX1mdW5jdGlvbiBFKHQsZSxpKXt2YXIgbz10aGlzLl9jYWxlbmRhclt0XXx8dGhpcy5fY2FsZW5kYXIuc2FtZUVsc2U7cmV0dXJuIEQobyk/by5jYWxsKGUsaSk6b31mdW5jdGlvbiBNKHQpe3ZhciBlPXRoaXMuX2xvbmdEYXRlRm9ybWF0W3RdLGk9dGhpcy5fbG9uZ0RhdGVGb3JtYXRbdC50b1VwcGVyQ2FzZSgpXTtyZXR1cm4gZXx8IWk/ZToodGhpcy5fbG9uZ0RhdGVGb3JtYXRbdF09aS5yZXBsYWNlKC9NTU1NfE1NfEREfGRkZGQvZyxmdW5jdGlvbih0KXtyZXR1cm4gdC5zbGljZSgxKX0pLHRoaXMuX2xvbmdEYXRlRm9ybWF0W3RdKX1mdW5jdGlvbiBQKCl7cmV0dXJuIHRoaXMuX2ludmFsaWREYXRlfWZ1bmN0aW9uIEkodCl7cmV0dXJuIHRoaXMuX29yZGluYWwucmVwbGFjZSgiJWQiLHQpfWZ1bmN0aW9uIE4odCxlLGksbyl7dmFyIG49dGhpcy5fcmVsYXRpdmVUaW1lW2ldO3JldHVybiBEKG4pP24odCxlLGksbyk6bi5yZXBsYWNlKC8lZC9pLHQpfWZ1bmN0aW9uIFIodCxlKXt2YXIgaT10aGlzLl9yZWxhdGl2ZVRpbWVbdD4wPyJmdXR1cmUiOiJwYXN0Il07cmV0dXJuIEQoaSk/aShlKTppLnJlcGxhY2UoLyVzL2ksZSl9ZnVuY3Rpb24gTCh0LGUpe3ZhciBpPXQudG9Mb3dlckNhc2UoKTtDb1tpXT1Db1tpKyJzIl09Q29bZV09dH1mdW5jdGlvbiB6KHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9Db1t0XXx8Q29bdC50b0xvd2VyQ2FzZSgpXTp2b2lkIDB9ZnVuY3Rpb24gQSh0KXt2YXIgZSxpLG89e307Zm9yKGkgaW4gdCloKHQsaSkmJihlPXooaSksZSYmKG9bZV09dFtpXSkpO3JldHVybiBvfWZ1bmN0aW9uIEIodCxlKXtUb1t0XT1lfWZ1bmN0aW9uIGoodCl7dmFyIGU9W107Zm9yKHZhciBpIGluIHQpZS5wdXNoKHt1bml0OmkscHJpb3JpdHk6VG9baV19KTtyZXR1cm4gZS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQucHJpb3JpdHktZS5wcmlvcml0eX0pLGV9ZnVuY3Rpb24gRih0LGkpe3JldHVybiBmdW5jdGlvbihvKXtyZXR1cm4gbnVsbCE9bz8oVyh0aGlzLHQsbyksZS51cGRhdGVPZmZzZXQodGhpcyxpKSx0aGlzKTpIKHRoaXMsdCl9fWZ1bmN0aW9uIEgodCxlKXtyZXR1cm4gdC5pc1ZhbGlkKCk/dC5fZFsiZ2V0IisodC5faXNVVEM/IlVUQyI6IiIpK2VdKCk6TmFOfWZ1bmN0aW9uIFcodCxlLGkpe3QuaXNWYWxpZCgpJiZ0Ll9kWyJzZXQiKyh0Ll9pc1VUQz8iVVRDIjoiIikrZV0oaSl9ZnVuY3Rpb24gWSh0KXtyZXR1cm4gdD16KHQpLEQodGhpc1t0XSk/dGhpc1t0XSgpOnRoaXN9ZnVuY3Rpb24gRyh0LGUpe2lmKCJvYmplY3QiPT10eXBlb2YgdCl7dD1BKHQpO2Zvcih2YXIgaT1qKHQpLG89MDtvPGkubGVuZ3RoO28rKyl0aGlzW2lbb10udW5pdF0odFtpW29dLnVuaXRdKX1lbHNlIGlmKHQ9eih0KSxEKHRoaXNbdF0pKXJldHVybiB0aGlzW3RdKGUpO3JldHVybiB0aGlzfWZ1bmN0aW9uIFYodCxlLGkpe3ZhciBvPSIiK01hdGguYWJzKHQpLG49ZS1vLmxlbmd0aCxzPXQ+PTA7cmV0dXJuKHM/aT8iKyI6IiI6Ii0iKStNYXRoLnBvdygxMCxNYXRoLm1heCgwLG4pKS50b1N0cmluZygpLnN1YnN0cigxKStvfWZ1bmN0aW9uIFUodCxlLGksbyl7dmFyIG49bzsic3RyaW5nIj09dHlwZW9mIG8mJihuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbb10oKX0pLHQmJihJb1t0XT1uKSxlJiYoSW9bZVswXV09ZnVuY3Rpb24oKXtyZXR1cm4gVihuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlWzFdLGVbMl0pfSksaSYmKElvW2ldPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm9yZGluYWwobi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdCl9KX1mdW5jdGlvbiBxKHQpe3JldHVybiB0Lm1hdGNoKC9cW1tcc1xTXS8pP3QucmVwbGFjZSgvXlxbfFxdJC9nLCIiKTp0LnJlcGxhY2UoL1xcL2csIiIpfWZ1bmN0aW9uIFgodCl7dmFyIGUsaSxvPXQubWF0Y2goRW8pO2ZvcihlPTAsaT1vLmxlbmd0aDtlPGk7ZSsrKUlvW29bZV1dP29bZV09SW9bb1tlXV06b1tlXT1xKG9bZV0pO3JldHVybiBmdW5jdGlvbihlKXt2YXIgbixzPSIiO2ZvcihuPTA7bjxpO24rKylzKz1vW25daW5zdGFuY2VvZiBGdW5jdGlvbj9vW25dLmNhbGwoZSx0KTpvW25dO3JldHVybiBzfX1mdW5jdGlvbiBaKHQsZSl7cmV0dXJuIHQuaXNWYWxpZCgpPyhlPUsoZSx0LmxvY2FsZURhdGEoKSksUG9bZV09UG9bZV18fFgoZSksUG9bZV0odCkpOnQubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCl9ZnVuY3Rpb24gSyh0LGUpe2Z1bmN0aW9uIGkodCl7cmV0dXJuIGUubG9uZ0RhdGVGb3JtYXQodCl8fHR9dmFyIG89NTtmb3IoTW8ubGFzdEluZGV4PTA7bz49MCYmTW8udGVzdCh0KTspdD10LnJlcGxhY2UoTW8saSksTW8ubGFzdEluZGV4PTAsby09MTtyZXR1cm4gdH1mdW5jdGlvbiBKKHQsZSxpKXtLb1t0XT1EKGUpP2U6ZnVuY3Rpb24odCxvKXtyZXR1cm4gdCYmaT9pOmV9fWZ1bmN0aW9uIFEodCxlKXtyZXR1cm4gaChLbyx0KT9Lb1t0XShlLl9zdHJpY3QsZS5fbG9jYWxlKTpuZXcgUmVnRXhwKCQodCkpfWZ1bmN0aW9uICQodCl7cmV0dXJuIHR0KHQucmVwbGFjZSgiXFwiLCIiKS5yZXBsYWNlKC9cXChcWyl8XFwoXF0pfFxbKFteXF1cW10qKVxdfFxcKC4pL2csZnVuY3Rpb24odCxlLGksbyxuKXtyZXR1cm4gZXx8aXx8b3x8bn0pKX1mdW5jdGlvbiB0dCh0KXtyZXR1cm4gdC5yZXBsYWNlKC9bLVwvXFxeJCorPy4oKXxbXF17fV0vZywiXFwkJiIpfWZ1bmN0aW9uIGV0KHQsZSl7dmFyIGksbz1lO2Zvcigic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksIm51bWJlciI9PXR5cGVvZiBlJiYobz1mdW5jdGlvbih0LGkpe2lbZV09Xyh0KX0pLGk9MDtpPHQubGVuZ3RoO2krKylKb1t0W2ldXT1vfWZ1bmN0aW9uIGl0KHQsZSl7ZXQodCxmdW5jdGlvbih0LGksbyxuKXtvLl93PW8uX3d8fHt9LGUodCxvLl93LG8sbil9KX1mdW5jdGlvbiBvdCh0LGUsaSl7bnVsbCE9ZSYmaChKbyx0KSYmSm9bdF0oZSxpLl9hLGksdCl9ZnVuY3Rpb24gbnQodCxlKXtyZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEModCxlKzEsMCkpLmdldFVUQ0RhdGUoKX1mdW5jdGlvbiBzdCh0LGUpe3JldHVybiB0P28odGhpcy5fbW9udGhzKT90aGlzLl9tb250aHNbdC5tb250aCgpXTp0aGlzLl9tb250aHNbKHRoaXMuX21vbnRocy5pc0Zvcm1hdHx8aG4pLnRlc3QoZSk/ImZvcm1hdCI6InN0YW5kYWxvbmUiXVt0Lm1vbnRoKCldOnRoaXMuX21vbnRoc31mdW5jdGlvbiBydCh0LGUpe3JldHVybiB0P28odGhpcy5fbW9udGhzU2hvcnQpP3RoaXMuX21vbnRoc1Nob3J0W3QubW9udGgoKV06dGhpcy5fbW9udGhzU2hvcnRbaG4udGVzdChlKT8iZm9ybWF0Ijoic3RhbmRhbG9uZSJdW3QubW9udGgoKV06dGhpcy5fbW9udGhzU2hvcnR9ZnVuY3Rpb24gYXQodCxlLGkpe3ZhciBvLG4scyxyPXQudG9Mb2NhbGVMb3dlckNhc2UoKTtpZighdGhpcy5fbW9udGhzUGFyc2UpZm9yKHRoaXMuX21vbnRoc1BhcnNlPVtdLHRoaXMuX2xvbmdNb250aHNQYXJzZT1bXSx0aGlzLl9zaG9ydE1vbnRoc1BhcnNlPVtdLG89MDtvPDEyOysrbylzPWwoWzJlMyxvXSksdGhpcy5fc2hvcnRNb250aHNQYXJzZVtvXT10aGlzLm1vbnRoc1Nob3J0KHMsIiIpLnRvTG9jYWxlTG93ZXJDYXNlKCksdGhpcy5fbG9uZ01vbnRoc1BhcnNlW29dPXRoaXMubW9udGhzKHMsIiIpLnRvTG9jYWxlTG93ZXJDYXNlKCk7cmV0dXJuIGk/Ik1NTSI9PT1lPyhuPV9vLmNhbGwodGhpcy5fc2hvcnRNb250aHNQYXJzZSxyKSxuIT09LTE/bjpudWxsKToobj1fby5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSxyKSxuIT09LTE/bjpudWxsKToiTU1NIj09PWU/KG49X28uY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLHIpLG4hPT0tMT9uOihuPV9vLmNhbGwodGhpcy5fbG9uZ01vbnRoc1BhcnNlLHIpLG4hPT0tMT9uOm51bGwpKToobj1fby5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSxyKSxuIT09LTE/bjoobj1fby5jYWxsKHRoaXMuX3Nob3J0TW9udGhzUGFyc2UsciksbiE9PS0xP246bnVsbCkpfWZ1bmN0aW9uIGh0KHQsZSxpKXt2YXIgbyxuLHM7aWYodGhpcy5fbW9udGhzUGFyc2VFeGFjdClyZXR1cm4gYXQuY2FsbCh0aGlzLHQsZSxpKTtmb3IodGhpcy5fbW9udGhzUGFyc2V8fCh0aGlzLl9tb250aHNQYXJzZT1bXSx0aGlzLl9sb25nTW9udGhzUGFyc2U9W10sdGhpcy5fc2hvcnRNb250aHNQYXJzZT1bXSksbz0wO288MTI7bysrKXtpZihuPWwoWzJlMyxvXSksaSYmIXRoaXMuX2xvbmdNb250aHNQYXJzZVtvXSYmKHRoaXMuX2xvbmdNb250aHNQYXJzZVtvXT1uZXcgUmVnRXhwKCJeIit0aGlzLm1vbnRocyhuLCIiKS5yZXBsYWNlKCIuIiwiIikrIiQiLCJpIiksdGhpcy5fc2hvcnRNb250aHNQYXJzZVtvXT1uZXcgUmVnRXhwKCJeIit0aGlzLm1vbnRoc1Nob3J0KG4sIiIpLnJlcGxhY2UoIi4iLCIiKSsiJCIsImkiKSksaXx8dGhpcy5fbW9udGhzUGFyc2Vbb118fChzPSJeIit0aGlzLm1vbnRocyhuLCIiKSsifF4iK3RoaXMubW9udGhzU2hvcnQobiwiIiksdGhpcy5fbW9udGhzUGFyc2Vbb109bmV3IFJlZ0V4cChzLnJlcGxhY2UoIi4iLCIiKSwiaSIpKSxpJiYiTU1NTSI9PT1lJiZ0aGlzLl9sb25nTW9udGhzUGFyc2Vbb10udGVzdCh0KSlyZXR1cm4gbztpZihpJiYiTU1NIj09PWUmJnRoaXMuX3Nob3J0TW9udGhzUGFyc2Vbb10udGVzdCh0KSlyZXR1cm4gbztpZighaSYmdGhpcy5fbW9udGhzUGFyc2Vbb10udGVzdCh0KSlyZXR1cm4gb319ZnVuY3Rpb24gZHQodCxlKXt2YXIgaTtpZighdC5pc1ZhbGlkKCkpcmV0dXJuIHQ7aWYoInN0cmluZyI9PXR5cGVvZiBlKWlmKC9eXGQrJC8udGVzdChlKSllPV8oZSk7ZWxzZSBpZihlPXQubG9jYWxlRGF0YSgpLm1vbnRoc1BhcnNlKGUpLCJudW1iZXIiIT10eXBlb2YgZSlyZXR1cm4gdDtyZXR1cm4gaT1NYXRoLm1pbih0LmRhdGUoKSxudCh0LnllYXIoKSxlKSksdC5fZFsic2V0IisodC5faXNVVEM/IlVUQyI6IiIpKyJNb250aCJdKGUsaSksdH1mdW5jdGlvbiBsdCh0KXtyZXR1cm4gbnVsbCE9dD8oZHQodGhpcyx0KSxlLnVwZGF0ZU9mZnNldCh0aGlzLCEwKSx0aGlzKTpIKHRoaXMsIk1vbnRoIil9ZnVuY3Rpb24gY3QoKXtyZXR1cm4gbnQodGhpcy55ZWFyKCksdGhpcy5tb250aCgpKX1mdW5jdGlvbiB1dCh0KXtyZXR1cm4gdGhpcy5fbW9udGhzUGFyc2VFeGFjdD8oaCh0aGlzLCJfbW9udGhzUmVnZXgiKXx8ZnQuY2FsbCh0aGlzKSx0P3RoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXg6dGhpcy5fbW9udGhzU2hvcnRSZWdleCk6KGgodGhpcywiX21vbnRoc1Nob3J0UmVnZXgiKXx8KHRoaXMuX21vbnRoc1Nob3J0UmVnZXg9Y24pLHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXgmJnQ/dGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleDp0aGlzLl9tb250aHNTaG9ydFJlZ2V4KX1mdW5jdGlvbiBwdCh0KXtyZXR1cm4gdGhpcy5fbW9udGhzUGFyc2VFeGFjdD8oaCh0aGlzLCJfbW9udGhzUmVnZXgiKXx8ZnQuY2FsbCh0aGlzKSx0P3RoaXMuX21vbnRoc1N0cmljdFJlZ2V4OnRoaXMuX21vbnRoc1JlZ2V4KTooaCh0aGlzLCJfbW9udGhzUmVnZXgiKXx8KHRoaXMuX21vbnRoc1JlZ2V4PXVuKSx0aGlzLl9tb250aHNTdHJpY3RSZWdleCYmdD90aGlzLl9tb250aHNTdHJpY3RSZWdleDp0aGlzLl9tb250aHNSZWdleCl9ZnVuY3Rpb24gZnQoKXtmdW5jdGlvbiB0KHQsZSl7cmV0dXJuIGUubGVuZ3RoLXQubGVuZ3RofXZhciBlLGksbz1bXSxuPVtdLHM9W107Zm9yKGU9MDtlPDEyO2UrKylpPWwoWzJlMyxlXSksby5wdXNoKHRoaXMubW9udGhzU2hvcnQoaSwiIikpLG4ucHVzaCh0aGlzLm1vbnRocyhpLCIiKSkscy5wdXNoKHRoaXMubW9udGhzKGksIiIpKSxzLnB1c2godGhpcy5tb250aHNTaG9ydChpLCIiKSk7Zm9yKG8uc29ydCh0KSxuLnNvcnQodCkscy5zb3J0KHQpLGU9MDtlPDEyO2UrKylvW2VdPXR0KG9bZV0pLG5bZV09dHQobltlXSk7Zm9yKGU9MDtlPDI0O2UrKylzW2VdPXR0KHNbZV0pO3RoaXMuX21vbnRoc1JlZ2V4PW5ldyBSZWdFeHAoIl4oIitzLmpvaW4oInwiKSsiKSIsImkiKSx0aGlzLl9tb250aHNTaG9ydFJlZ2V4PXRoaXMuX21vbnRoc1JlZ2V4LHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4PW5ldyBSZWdFeHAoIl4oIituLmpvaW4oInwiKSsiKSIsImkiKSx0aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4PW5ldyBSZWdFeHAoIl4oIitvLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiBtdCh0KXtyZXR1cm4gdnQodCk/MzY2OjM2NX1mdW5jdGlvbiB2dCh0KXtyZXR1cm4gdCU0PT09MCYmdCUxMDAhPT0wfHx0JTQwMD09PTB9ZnVuY3Rpb24gZ3QoKXtyZXR1cm4gdnQodGhpcy55ZWFyKCkpfWZ1bmN0aW9uIHl0KHQsZSxpLG8sbixzLHIpe3ZhciBhPW5ldyBEYXRlKHQsZSxpLG8sbixzLHIpO3JldHVybiB0PDEwMCYmdD49MCYmaXNGaW5pdGUoYS5nZXRGdWxsWWVhcigpKSYmYS5zZXRGdWxsWWVhcih0KSxhfWZ1bmN0aW9uIGJ0KHQpe3ZhciBlPW5ldyBEYXRlKERhdGUuVVRDLmFwcGx5KG51bGwsYXJndW1lbnRzKSk7cmV0dXJuIHQ8MTAwJiZ0Pj0wJiZpc0Zpbml0ZShlLmdldFVUQ0Z1bGxZZWFyKCkpJiZlLnNldFVUQ0Z1bGxZZWFyKHQpLGV9ZnVuY3Rpb24gX3QodCxlLGkpe3ZhciBvPTcrZS1pLG49KDcrYnQodCwwLG8pLmdldFVUQ0RheSgpLWUpJTc7cmV0dXJuLW4rby0xfWZ1bmN0aW9uIHd0KHQsZSxpLG8sbil7dmFyIHMscixhPSg3K2ktbyklNyxoPV90KHQsbyxuKSxkPTErNyooZS0xKSthK2g7cmV0dXJuIGQ8PTA/KHM9dC0xLHI9bXQocykrZCk6ZD5tdCh0KT8ocz10KzEscj1kLW10KHQpKToocz10LHI9ZCkse3llYXI6cyxkYXlPZlllYXI6cn19ZnVuY3Rpb24geHQodCxlLGkpe3ZhciBvLG4scz1fdCh0LnllYXIoKSxlLGkpLHI9TWF0aC5mbG9vcigodC5kYXlPZlllYXIoKS1zLTEpLzcpKzE7cmV0dXJuIHI8MT8obj10LnllYXIoKS0xLG89citrdChuLGUsaSkpOnI+a3QodC55ZWFyKCksZSxpKT8obz1yLWt0KHQueWVhcigpLGUsaSksbj10LnllYXIoKSsxKToobj10LnllYXIoKSxvPXIpLHt3ZWVrOm8seWVhcjpufX1mdW5jdGlvbiBrdCh0LGUsaSl7dmFyIG89X3QodCxlLGkpLG49X3QodCsxLGUsaSk7cmV0dXJuKG10KHQpLW8rbikvN31mdW5jdGlvbiBPdCh0KXtyZXR1cm4geHQodCx0aGlzLl93ZWVrLmRvdyx0aGlzLl93ZWVrLmRveSkud2Vla31mdW5jdGlvbiBEdCgpe3JldHVybiB0aGlzLl93ZWVrLmRvd31mdW5jdGlvbiBTdCgpe3JldHVybiB0aGlzLl93ZWVrLmRveX1mdW5jdGlvbiBDdCh0KXt2YXIgZT10aGlzLmxvY2FsZURhdGEoKS53ZWVrKHRoaXMpO3JldHVybiBudWxsPT10P2U6dGhpcy5hZGQoNyoodC1lKSwiZCIpfWZ1bmN0aW9uIFR0KHQpe3ZhciBlPXh0KHRoaXMsMSw0KS53ZWVrO3JldHVybiBudWxsPT10P2U6dGhpcy5hZGQoNyoodC1lKSwiZCIpfWZ1bmN0aW9uIEV0KHQsZSl7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0P3Q6aXNOYU4odCk/KHQ9ZS53ZWVrZGF5c1BhcnNlKHQpLCJudW1iZXIiPT10eXBlb2YgdD90Om51bGwpOnBhcnNlSW50KHQsMTApfWZ1bmN0aW9uIE10KHQsZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P2Uud2Vla2RheXNQYXJzZSh0KSU3fHw3OmlzTmFOKHQpP251bGw6dH1mdW5jdGlvbiBQdCh0LGUpe3JldHVybiB0P28odGhpcy5fd2Vla2RheXMpP3RoaXMuX3dlZWtkYXlzW3QuZGF5KCldOnRoaXMuX3dlZWtkYXlzW3RoaXMuX3dlZWtkYXlzLmlzRm9ybWF0LnRlc3QoZSk/ImZvcm1hdCI6InN0YW5kYWxvbmUiXVt0LmRheSgpXTp0aGlzLl93ZWVrZGF5c31mdW5jdGlvbiBJdCh0KXtyZXR1cm4gdD90aGlzLl93ZWVrZGF5c1Nob3J0W3QuZGF5KCldOnRoaXMuX3dlZWtkYXlzU2hvcnR9ZnVuY3Rpb24gTnQodCl7cmV0dXJuIHQ/dGhpcy5fd2Vla2RheXNNaW5bdC5kYXkoKV06dGhpcy5fd2Vla2RheXNNaW59ZnVuY3Rpb24gUnQodCxlLGkpe3ZhciBvLG4scyxyPXQudG9Mb2NhbGVMb3dlckNhc2UoKTtpZighdGhpcy5fd2Vla2RheXNQYXJzZSlmb3IodGhpcy5fd2Vla2RheXNQYXJzZT1bXSx0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2U9W10sdGhpcy5fbWluV2Vla2RheXNQYXJzZT1bXSxvPTA7bzw3OysrbylzPWwoWzJlMywxXSkuZGF5KG8pLHRoaXMuX21pbldlZWtkYXlzUGFyc2Vbb109dGhpcy53ZWVrZGF5c01pbihzLCIiKS50b0xvY2FsZUxvd2VyQ2FzZSgpLHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZVtvXT10aGlzLndlZWtkYXlzU2hvcnQocywiIikudG9Mb2NhbGVMb3dlckNhc2UoKSx0aGlzLl93ZWVrZGF5c1BhcnNlW29dPXRoaXMud2Vla2RheXMocywiIikudG9Mb2NhbGVMb3dlckNhc2UoKTtyZXR1cm4gaT8iZGRkZCI9PT1lPyhuPV9vLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSxyKSxuIT09LTE/bjpudWxsKToiZGRkIj09PWU/KG49X28uY2FsbCh0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UsciksbiE9PS0xP246bnVsbCk6KG49X28uY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLHIpLG4hPT0tMT9uOm51bGwpOiJkZGRkIj09PWU/KG49X28uY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLHIpLG4hPT0tMT9uOihuPV9vLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLHIpLG4hPT0tMT9uOihuPV9vLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSxyKSxuIT09LTE/bjpudWxsKSkpOiJkZGQiPT09ZT8obj1fby5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSxyKSxuIT09LTE/bjoobj1fby5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsciksbiE9PS0xP246KG49X28uY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLHIpLG4hPT0tMT9uOm51bGwpKSk6KG49X28uY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLHIpLG4hPT0tMT9uOihuPV9vLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSxyKSxuIT09LTE/bjoobj1fby5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSxyKSxuIT09LTE/bjpudWxsKSkpfWZ1bmN0aW9uIEx0KHQsZSxpKXt2YXIgbyxuLHM7aWYodGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0KXJldHVybiBSdC5jYWxsKHRoaXMsdCxlLGkpO2Zvcih0aGlzLl93ZWVrZGF5c1BhcnNlfHwodGhpcy5fd2Vla2RheXNQYXJzZT1bXSx0aGlzLl9taW5XZWVrZGF5c1BhcnNlPVtdLHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZT1bXSx0aGlzLl9mdWxsV2Vla2RheXNQYXJzZT1bXSksbz0wO288NztvKyspe2lmKG49bChbMmUzLDFdKS5kYXkobyksaSYmIXRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlW29dJiYodGhpcy5fZnVsbFdlZWtkYXlzUGFyc2Vbb109bmV3IFJlZ0V4cCgiXiIrdGhpcy53ZWVrZGF5cyhuLCIiKS5yZXBsYWNlKCIuIiwiLj8iKSsiJCIsImkiKSx0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2Vbb109bmV3IFJlZ0V4cCgiXiIrdGhpcy53ZWVrZGF5c1Nob3J0KG4sIiIpLnJlcGxhY2UoIi4iLCIuPyIpKyIkIiwiaSIpLHRoaXMuX21pbldlZWtkYXlzUGFyc2Vbb109bmV3IFJlZ0V4cCgiXiIrdGhpcy53ZWVrZGF5c01pbihuLCIiKS5yZXBsYWNlKCIuIiwiLj8iKSsiJCIsImkiKSksdGhpcy5fd2Vla2RheXNQYXJzZVtvXXx8KHM9Il4iK3RoaXMud2Vla2RheXMobiwiIikrInxeIit0aGlzLndlZWtkYXlzU2hvcnQobiwiIikrInxeIit0aGlzLndlZWtkYXlzTWluKG4sIiIpLHRoaXMuX3dlZWtkYXlzUGFyc2Vbb109bmV3IFJlZ0V4cChzLnJlcGxhY2UoIi4iLCIiKSwiaSIpKSxpJiYiZGRkZCI9PT1lJiZ0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtvXS50ZXN0KHQpKXJldHVybiBvO2lmKGkmJiJkZGQiPT09ZSYmdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW29dLnRlc3QodCkpcmV0dXJuIG87aWYoaSYmImRkIj09PWUmJnRoaXMuX21pbldlZWtkYXlzUGFyc2Vbb10udGVzdCh0KSlyZXR1cm4gbztpZighaSYmdGhpcy5fd2Vla2RheXNQYXJzZVtvXS50ZXN0KHQpKXJldHVybiBvfX1mdW5jdGlvbiB6dCh0KXtpZighdGhpcy5pc1ZhbGlkKCkpcmV0dXJuIG51bGwhPXQ/dGhpczpOYU47dmFyIGU9dGhpcy5faXNVVEM/dGhpcy5fZC5nZXRVVENEYXkoKTp0aGlzLl9kLmdldERheSgpO3JldHVybiBudWxsIT10Pyh0PUV0KHQsdGhpcy5sb2NhbGVEYXRhKCkpLHRoaXMuYWRkKHQtZSwiZCIpKTplfWZ1bmN0aW9uIEF0KHQpe2lmKCF0aGlzLmlzVmFsaWQoKSlyZXR1cm4gbnVsbCE9dD90aGlzOk5hTjt2YXIgZT0odGhpcy5kYXkoKSs3LXRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdyklNztyZXR1cm4gbnVsbD09dD9lOnRoaXMuYWRkKHQtZSwiZCIpfWZ1bmN0aW9uIEJ0KHQpe2lmKCF0aGlzLmlzVmFsaWQoKSlyZXR1cm4gbnVsbCE9dD90aGlzOk5hTjtpZihudWxsIT10KXt2YXIgZT1NdCh0LHRoaXMubG9jYWxlRGF0YSgpKTtyZXR1cm4gdGhpcy5kYXkodGhpcy5kYXkoKSU3P2U6ZS03KX1yZXR1cm4gdGhpcy5kYXkoKXx8N31mdW5jdGlvbiBqdCh0KXtyZXR1cm4gdGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0PyhoKHRoaXMsIl93ZWVrZGF5c1JlZ2V4Iil8fFd0LmNhbGwodGhpcyksdD90aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4OnRoaXMuX3dlZWtkYXlzUmVnZXgpOihoKHRoaXMsIl93ZWVrZGF5c1JlZ2V4Iil8fCh0aGlzLl93ZWVrZGF5c1JlZ2V4PXluKSx0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4JiZ0P3RoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXg6dGhpcy5fd2Vla2RheXNSZWdleCl9ZnVuY3Rpb24gRnQodCl7cmV0dXJuIHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdD8oaCh0aGlzLCJfd2Vla2RheXNSZWdleCIpfHxXdC5jYWxsKHRoaXMpLHQ/dGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4OnRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleCk6KGgodGhpcywiX3dlZWtkYXlzU2hvcnRSZWdleCIpfHwodGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4PWJuKSx0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXgmJnQ/dGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4OnRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleCl9ZnVuY3Rpb24gSHQodCl7cmV0dXJuIHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdD8oaCh0aGlzLCJfd2Vla2RheXNSZWdleCIpfHxXdC5jYWxsKHRoaXMpLHQ/dGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleDp0aGlzLl93ZWVrZGF5c01pblJlZ2V4KTooaCh0aGlzLCJfd2Vla2RheXNNaW5SZWdleCIpfHwodGhpcy5fd2Vla2RheXNNaW5SZWdleD1fbiksdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleCYmdD90aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4OnRoaXMuX3dlZWtkYXlzTWluUmVnZXgpfWZ1bmN0aW9uIFd0KCl7ZnVuY3Rpb24gdCh0LGUpe3JldHVybiBlLmxlbmd0aC10Lmxlbmd0aH12YXIgZSxpLG8sbixzLHI9W10sYT1bXSxoPVtdLGQ9W107Zm9yKGU9MDtlPDc7ZSsrKWk9bChbMmUzLDFdKS5kYXkoZSksbz10aGlzLndlZWtkYXlzTWluKGksIiIpLG49dGhpcy53ZWVrZGF5c1Nob3J0KGksIiIpLHM9dGhpcy53ZWVrZGF5cyhpLCIiKSxyLnB1c2gobyksYS5wdXNoKG4pLGgucHVzaChzKSxkLnB1c2gobyksZC5wdXNoKG4pLGQucHVzaChzKTtmb3Ioci5zb3J0KHQpLGEuc29ydCh0KSxoLnNvcnQodCksZC5zb3J0KHQpLGU9MDtlPDc7ZSsrKWFbZV09dHQoYVtlXSksaFtlXT10dChoW2VdKSxkW2VdPXR0KGRbZV0pO3RoaXMuX3dlZWtkYXlzUmVnZXg9bmV3IFJlZ0V4cCgiXigiK2Quam9pbigifCIpKyIpIiwiaSIpLHRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleD10aGlzLl93ZWVrZGF5c1JlZ2V4LHRoaXMuX3dlZWtkYXlzTWluUmVnZXg9dGhpcy5fd2Vla2RheXNSZWdleCx0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4PW5ldyBSZWdFeHAoIl4oIitoLmpvaW4oInwiKSsiKSIsImkiKSx0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXg9bmV3IFJlZ0V4cCgiXigiK2Euam9pbigifCIpKyIpIiwiaSIpLHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXg9bmV3IFJlZ0V4cCgiXigiK3Iuam9pbigifCIpKyIpIiwiaSIpfWZ1bmN0aW9uIFl0KCl7cmV0dXJuIHRoaXMuaG91cnMoKSUxMnx8MTJ9ZnVuY3Rpb24gR3QoKXtyZXR1cm4gdGhpcy5ob3VycygpfHwyNH1mdW5jdGlvbiBWdCh0LGUpe1UodCwwLDAsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkubWVyaWRpZW0odGhpcy5ob3VycygpLHRoaXMubWludXRlcygpLGUpfSl9ZnVuY3Rpb24gVXQodCxlKXtyZXR1cm4gZS5fbWVyaWRpZW1QYXJzZX1mdW5jdGlvbiBxdCh0KXtyZXR1cm4icCI9PT0odCsiIikudG9Mb3dlckNhc2UoKS5jaGFyQXQoMCl9ZnVuY3Rpb24gWHQodCxlLGkpe3JldHVybiB0PjExP2k/InBtIjoiUE0iOmk/ImFtIjoiQU0ifWZ1bmN0aW9uIFp0KHQpe3JldHVybiB0P3QudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCJfIiwiLSIpOnR9ZnVuY3Rpb24gS3QodCl7Zm9yKHZhciBlLGksbyxuLHM9MDtzPHQubGVuZ3RoOyl7Zm9yKG49WnQodFtzXSkuc3BsaXQoIi0iKSxlPW4ubGVuZ3RoLGk9WnQodFtzKzFdKSxpPWk/aS5zcGxpdCgiLSIpOm51bGw7ZT4wOyl7aWYobz1KdChuLnNsaWNlKDAsZSkuam9pbigiLSIpKSlyZXR1cm4gbztpZihpJiZpLmxlbmd0aD49ZSYmdyhuLGksITApPj1lLTEpYnJlYWs7ZS0tfXMrK31yZXR1cm4gbnVsbH1mdW5jdGlvbiBKdChlKXt2YXIgaT1udWxsO2lmKCFEbltlXSYmInVuZGVmaW5lZCIhPXR5cGVvZiB0JiZ0JiZ0LmV4cG9ydHMpdHJ5e2k9d24uX2FiYnIsIWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEVycm9yKCdDYW5ub3QgZmluZCBtb2R1bGUgIi4vbG9jYWxlIicpO3Rocm93IHQuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsdH0oKSxRdChpKX1jYXRjaCh0KXt9cmV0dXJuIERuW2VdfWZ1bmN0aW9uIFF0KHQsZSl7dmFyIGk7cmV0dXJuIHQmJihpPW0oZSk/ZWUodCk6JHQodCxlKSxpJiYod249aSkpLHduLl9hYmJyfWZ1bmN0aW9uICR0KHQsZSl7aWYobnVsbCE9PWUpe3ZhciBpPU9uO3JldHVybiBlLmFiYnI9dCxudWxsIT1Eblt0XT8oTygiZGVmaW5lTG9jYWxlT3ZlcnJpZGUiLCJ1c2UgbW9tZW50LnVwZGF0ZUxvY2FsZShsb2NhbGVOYW1lLCBjb25maWcpIHRvIGNoYW5nZSBhbiBleGlzdGluZyBsb2NhbGUuIG1vbWVudC5kZWZpbmVMb2NhbGUobG9jYWxlTmFtZSwgY29uZmlnKSBzaG91bGQgb25seSBiZSB1c2VkIGZvciBjcmVhdGluZyBhIG5ldyBsb2NhbGUgU2VlIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvZGVmaW5lLWxvY2FsZS8gZm9yIG1vcmUgaW5mby4iKSxpPURuW3RdLl9jb25maWcpOm51bGwhPWUucGFyZW50TG9jYWxlJiYobnVsbCE9RG5bZS5wYXJlbnRMb2NhbGVdP2k9RG5bZS5wYXJlbnRMb2NhbGVdLl9jb25maWc6TygicGFyZW50TG9jYWxlVW5kZWZpbmVkIiwic3BlY2lmaWVkIHBhcmVudExvY2FsZSBpcyBub3QgZGVmaW5lZCB5ZXQuIFNlZSBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL3BhcmVudC1sb2NhbGUvIikpLERuW3RdPW5ldyBUKEMoaSxlKSksUXQodCksRG5bdF19cmV0dXJuIGRlbGV0ZSBEblt0XSxudWxsfWZ1bmN0aW9uIHRlKHQsZSl7aWYobnVsbCE9ZSl7dmFyIGksbz1PbjtudWxsIT1Eblt0XSYmKG89RG5bdF0uX2NvbmZpZyksZT1DKG8sZSksaT1uZXcgVChlKSxpLnBhcmVudExvY2FsZT1Eblt0XSxEblt0XT1pLFF0KHQpfWVsc2UgbnVsbCE9RG5bdF0mJihudWxsIT1Eblt0XS5wYXJlbnRMb2NhbGU/RG5bdF09RG5bdF0ucGFyZW50TG9jYWxlOm51bGwhPURuW3RdJiZkZWxldGUgRG5bdF0pO3JldHVybiBEblt0XX1mdW5jdGlvbiBlZSh0KXt2YXIgZTtpZih0JiZ0Ll9sb2NhbGUmJnQuX2xvY2FsZS5fYWJiciYmKHQ9dC5fbG9jYWxlLl9hYmJyKSwhdClyZXR1cm4gd247aWYoIW8odCkpe2lmKGU9SnQodCkpcmV0dXJuIGU7dD1bdF19cmV0dXJuIEt0KHQpfWZ1bmN0aW9uIGllKCl7cmV0dXJuIGJvKERuKX1mdW5jdGlvbiBvZSh0KXt2YXIgZSxpPXQuX2E7cmV0dXJuIGkmJnUodCkub3ZlcmZsb3c9PT0tMiYmKGU9aVskb108MHx8aVskb10+MTE/JG86aVt0bl08MXx8aVt0bl0+bnQoaVtRb10saVskb10pP3RuOmlbZW5dPDB8fGlbZW5dPjI0fHwyND09PWlbZW5dJiYoMCE9PWlbb25dfHwwIT09aVtubl18fDAhPT1pW3NuXSk/ZW46aVtvbl08MHx8aVtvbl0+NTk/b246aVtubl08MHx8aVtubl0+NTk/bm46aVtzbl08MHx8aVtzbl0+OTk5P3NuOi0xLHUodCkuX292ZXJmbG93RGF5T2ZZZWFyJiYoZTxRb3x8ZT50bikmJihlPXRuKSx1KHQpLl9vdmVyZmxvd1dlZWtzJiZlPT09LTEmJihlPXJuKSx1KHQpLl9vdmVyZmxvd1dlZWtkYXkmJmU9PT0tMSYmKGU9YW4pLHUodCkub3ZlcmZsb3c9ZSksdH1mdW5jdGlvbiBuZSh0KXt2YXIgZSxpLG8sbixzLHIsYT10Ll9pLGg9U24uZXhlYyhhKXx8Q24uZXhlYyhhKTtpZihoKXtmb3IodSh0KS5pc289ITAsZT0wLGk9RW4ubGVuZ3RoO2U8aTtlKyspaWYoRW5bZV1bMV0uZXhlYyhoWzFdKSl7Cm49RW5bZV1bMF0sbz1FbltlXVsyXSE9PSExO2JyZWFrfWlmKG51bGw9PW4pcmV0dXJuIHZvaWQodC5faXNWYWxpZD0hMSk7aWYoaFszXSl7Zm9yKGU9MCxpPU1uLmxlbmd0aDtlPGk7ZSsrKWlmKE1uW2VdWzFdLmV4ZWMoaFszXSkpe3M9KGhbMl18fCIgIikrTW5bZV1bMF07YnJlYWt9aWYobnVsbD09cylyZXR1cm4gdm9pZCh0Ll9pc1ZhbGlkPSExKX1pZighbyYmbnVsbCE9cylyZXR1cm4gdm9pZCh0Ll9pc1ZhbGlkPSExKTtpZihoWzRdKXtpZighVG4uZXhlYyhoWzRdKSlyZXR1cm4gdm9pZCh0Ll9pc1ZhbGlkPSExKTtyPSJaIn10Ll9mPW4rKHN8fCIiKSsocnx8IiIpLGxlKHQpfWVsc2UgdC5faXNWYWxpZD0hMX1mdW5jdGlvbiBzZSh0KXt2YXIgaT1Qbi5leGVjKHQuX2kpO3JldHVybiBudWxsIT09aT92b2lkKHQuX2Q9bmV3IERhdGUoK2lbMV0pKToobmUodCksdm9pZCh0Ll9pc1ZhbGlkPT09ITEmJihkZWxldGUgdC5faXNWYWxpZCxlLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrKHQpKSkpfWZ1bmN0aW9uIHJlKHQsZSxpKXtyZXR1cm4gbnVsbCE9dD90Om51bGwhPWU/ZTppfWZ1bmN0aW9uIGFlKHQpe3ZhciBpPW5ldyBEYXRlKGUubm93KCkpO3JldHVybiB0Ll91c2VVVEM/W2kuZ2V0VVRDRnVsbFllYXIoKSxpLmdldFVUQ01vbnRoKCksaS5nZXRVVENEYXRlKCldOltpLmdldEZ1bGxZZWFyKCksaS5nZXRNb250aCgpLGkuZ2V0RGF0ZSgpXX1mdW5jdGlvbiBoZSh0KXt2YXIgZSxpLG8sbixzPVtdO2lmKCF0Ll9kKXtmb3Iobz1hZSh0KSx0Ll93JiZudWxsPT10Ll9hW3RuXSYmbnVsbD09dC5fYVskb10mJmRlKHQpLHQuX2RheU9mWWVhciYmKG49cmUodC5fYVtRb10sb1tRb10pLHQuX2RheU9mWWVhcj5tdChuKSYmKHUodCkuX292ZXJmbG93RGF5T2ZZZWFyPSEwKSxpPWJ0KG4sMCx0Ll9kYXlPZlllYXIpLHQuX2FbJG9dPWkuZ2V0VVRDTW9udGgoKSx0Ll9hW3RuXT1pLmdldFVUQ0RhdGUoKSksZT0wO2U8MyYmbnVsbD09dC5fYVtlXTsrK2UpdC5fYVtlXT1zW2VdPW9bZV07Zm9yKDtlPDc7ZSsrKXQuX2FbZV09c1tlXT1udWxsPT10Ll9hW2VdPzI9PT1lPzE6MDp0Ll9hW2VdOzI0PT09dC5fYVtlbl0mJjA9PT10Ll9hW29uXSYmMD09PXQuX2Fbbm5dJiYwPT09dC5fYVtzbl0mJih0Ll9uZXh0RGF5PSEwLHQuX2FbZW5dPTApLHQuX2Q9KHQuX3VzZVVUQz9idDp5dCkuYXBwbHkobnVsbCxzKSxudWxsIT10Ll90em0mJnQuX2Quc2V0VVRDTWludXRlcyh0Ll9kLmdldFVUQ01pbnV0ZXMoKS10Ll90em0pLHQuX25leHREYXkmJih0Ll9hW2VuXT0yNCl9fWZ1bmN0aW9uIGRlKHQpe3ZhciBlLGksbyxuLHMscixhLGg7ZT10Ll93LG51bGwhPWUuR0d8fG51bGwhPWUuV3x8bnVsbCE9ZS5FPyhzPTEscj00LGk9cmUoZS5HRyx0Ll9hW1FvXSx4dCh5ZSgpLDEsNCkueWVhciksbz1yZShlLlcsMSksbj1yZShlLkUsMSksKG48MXx8bj43KSYmKGg9ITApKToocz10Ll9sb2NhbGUuX3dlZWsuZG93LHI9dC5fbG9jYWxlLl93ZWVrLmRveSxpPXJlKGUuZ2csdC5fYVtRb10seHQoeWUoKSxzLHIpLnllYXIpLG89cmUoZS53LDEpLG51bGwhPWUuZD8obj1lLmQsKG48MHx8bj42KSYmKGg9ITApKTpudWxsIT1lLmU/KG49ZS5lK3MsKGUuZTwwfHxlLmU+NikmJihoPSEwKSk6bj1zKSxvPDF8fG8+a3QoaSxzLHIpP3UodCkuX292ZXJmbG93V2Vla3M9ITA6bnVsbCE9aD91KHQpLl9vdmVyZmxvd1dlZWtkYXk9ITA6KGE9d3QoaSxvLG4scyxyKSx0Ll9hW1FvXT1hLnllYXIsdC5fZGF5T2ZZZWFyPWEuZGF5T2ZZZWFyKX1mdW5jdGlvbiBsZSh0KXtpZih0Ll9mPT09ZS5JU09fODYwMSlyZXR1cm4gdm9pZCBuZSh0KTt0Ll9hPVtdLHUodCkuZW1wdHk9ITA7dmFyIGksbyxuLHMscixhPSIiK3QuX2ksaD1hLmxlbmd0aCxkPTA7Zm9yKG49Syh0Ll9mLHQuX2xvY2FsZSkubWF0Y2goRW8pfHxbXSxpPTA7aTxuLmxlbmd0aDtpKyspcz1uW2ldLG89KGEubWF0Y2goUShzLHQpKXx8W10pWzBdLG8mJihyPWEuc3Vic3RyKDAsYS5pbmRleE9mKG8pKSxyLmxlbmd0aD4wJiZ1KHQpLnVudXNlZElucHV0LnB1c2gociksYT1hLnNsaWNlKGEuaW5kZXhPZihvKStvLmxlbmd0aCksZCs9by5sZW5ndGgpLElvW3NdPyhvP3UodCkuZW1wdHk9ITE6dSh0KS51bnVzZWRUb2tlbnMucHVzaChzKSxvdChzLG8sdCkpOnQuX3N0cmljdCYmIW8mJnUodCkudW51c2VkVG9rZW5zLnB1c2gocyk7dSh0KS5jaGFyc0xlZnRPdmVyPWgtZCxhLmxlbmd0aD4wJiZ1KHQpLnVudXNlZElucHV0LnB1c2goYSksdC5fYVtlbl08PTEyJiZ1KHQpLmJpZ0hvdXI9PT0hMCYmdC5fYVtlbl0+MCYmKHUodCkuYmlnSG91cj12b2lkIDApLHUodCkucGFyc2VkRGF0ZVBhcnRzPXQuX2Euc2xpY2UoMCksdSh0KS5tZXJpZGllbT10Ll9tZXJpZGllbSx0Ll9hW2VuXT1jZSh0Ll9sb2NhbGUsdC5fYVtlbl0sdC5fbWVyaWRpZW0pLGhlKHQpLG9lKHQpfWZ1bmN0aW9uIGNlKHQsZSxpKXt2YXIgbztyZXR1cm4gbnVsbD09aT9lOm51bGwhPXQubWVyaWRpZW1Ib3VyP3QubWVyaWRpZW1Ib3VyKGUsaSk6bnVsbCE9dC5pc1BNPyhvPXQuaXNQTShpKSxvJiZlPDEyJiYoZSs9MTIpLG98fDEyIT09ZXx8KGU9MCksZSk6ZX1mdW5jdGlvbiB1ZSh0KXt2YXIgZSxpLG8sbixzO2lmKDA9PT10Ll9mLmxlbmd0aClyZXR1cm4gdSh0KS5pbnZhbGlkRm9ybWF0PSEwLHZvaWQodC5fZD1uZXcgRGF0ZShOYU4pKTtmb3Iobj0wO248dC5fZi5sZW5ndGg7bisrKXM9MCxlPXYoe30sdCksbnVsbCE9dC5fdXNlVVRDJiYoZS5fdXNlVVRDPXQuX3VzZVVUQyksZS5fZj10Ll9mW25dLGxlKGUpLHAoZSkmJihzKz11KGUpLmNoYXJzTGVmdE92ZXIscys9MTAqdShlKS51bnVzZWRUb2tlbnMubGVuZ3RoLHUoZSkuc2NvcmU9cywobnVsbD09b3x8czxvKSYmKG89cyxpPWUpKTtkKHQsaXx8ZSl9ZnVuY3Rpb24gcGUodCl7aWYoIXQuX2Qpe3ZhciBlPUEodC5faSk7dC5fYT1hKFtlLnllYXIsZS5tb250aCxlLmRheXx8ZS5kYXRlLGUuaG91cixlLm1pbnV0ZSxlLnNlY29uZCxlLm1pbGxpc2Vjb25kXSxmdW5jdGlvbih0KXtyZXR1cm4gdCYmcGFyc2VJbnQodCwxMCl9KSxoZSh0KX19ZnVuY3Rpb24gZmUodCl7dmFyIGU9bmV3IGcob2UobWUodCkpKTtyZXR1cm4gZS5fbmV4dERheSYmKGUuYWRkKDEsImQiKSxlLl9uZXh0RGF5PXZvaWQgMCksZX1mdW5jdGlvbiBtZSh0KXt2YXIgZT10Ll9pLGk9dC5fZjtyZXR1cm4gdC5fbG9jYWxlPXQuX2xvY2FsZXx8ZWUodC5fbCksbnVsbD09PWV8fHZvaWQgMD09PWkmJiIiPT09ZT9mKHtudWxsSW5wdXQ6ITB9KTooInN0cmluZyI9PXR5cGVvZiBlJiYodC5faT1lPXQuX2xvY2FsZS5wcmVwYXJzZShlKSkseShlKT9uZXcgZyhvZShlKSk6KG8oaSk/dWUodCk6cihlKT90Ll9kPWU6aT9sZSh0KTp2ZSh0KSxwKHQpfHwodC5fZD1udWxsKSx0KSl9ZnVuY3Rpb24gdmUodCl7dmFyIGk9dC5faTt2b2lkIDA9PT1pP3QuX2Q9bmV3IERhdGUoZS5ub3coKSk6cihpKT90Ll9kPW5ldyBEYXRlKGkudmFsdWVPZigpKToic3RyaW5nIj09dHlwZW9mIGk/c2UodCk6byhpKT8odC5fYT1hKGkuc2xpY2UoMCksZnVuY3Rpb24odCl7cmV0dXJuIHBhcnNlSW50KHQsMTApfSksaGUodCkpOiJvYmplY3QiPT10eXBlb2YgaT9wZSh0KToibnVtYmVyIj09dHlwZW9mIGk/dC5fZD1uZXcgRGF0ZShpKTplLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrKHQpfWZ1bmN0aW9uIGdlKHQsZSxpLHIsYSl7dmFyIGg9e307cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgaSYmKHI9aSxpPXZvaWQgMCksKG4odCkmJnModCl8fG8odCkmJjA9PT10Lmxlbmd0aCkmJih0PXZvaWQgMCksaC5faXNBTW9tZW50T2JqZWN0PSEwLGguX3VzZVVUQz1oLl9pc1VUQz1hLGguX2w9aSxoLl9pPXQsaC5fZj1lLGguX3N0cmljdD1yLGZlKGgpfWZ1bmN0aW9uIHllKHQsZSxpLG8pe3JldHVybiBnZSh0LGUsaSxvLCExKX1mdW5jdGlvbiBiZSh0LGUpe3ZhciBpLG47aWYoMT09PWUubGVuZ3RoJiZvKGVbMF0pJiYoZT1lWzBdKSwhZS5sZW5ndGgpcmV0dXJuIHllKCk7Zm9yKGk9ZVswXSxuPTE7bjxlLmxlbmd0aDsrK24pZVtuXS5pc1ZhbGlkKCkmJiFlW25dW3RdKGkpfHwoaT1lW25dKTtyZXR1cm4gaX1mdW5jdGlvbiBfZSgpe3ZhciB0PVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApO3JldHVybiBiZSgiaXNCZWZvcmUiLHQpfWZ1bmN0aW9uIHdlKCl7dmFyIHQ9W10uc2xpY2UuY2FsbChhcmd1bWVudHMsMCk7cmV0dXJuIGJlKCJpc0FmdGVyIix0KX1mdW5jdGlvbiB4ZSh0KXt2YXIgZT1BKHQpLGk9ZS55ZWFyfHwwLG89ZS5xdWFydGVyfHwwLG49ZS5tb250aHx8MCxzPWUud2Vla3x8MCxyPWUuZGF5fHwwLGE9ZS5ob3VyfHwwLGg9ZS5taW51dGV8fDAsZD1lLnNlY29uZHx8MCxsPWUubWlsbGlzZWNvbmR8fDA7dGhpcy5fbWlsbGlzZWNvbmRzPStsKzFlMypkKzZlNCpoKzFlMyphKjYwKjYwLHRoaXMuX2RheXM9K3IrNypzLHRoaXMuX21vbnRocz0rbiszKm8rMTIqaSx0aGlzLl9kYXRhPXt9LHRoaXMuX2xvY2FsZT1lZSgpLHRoaXMuX2J1YmJsZSgpfWZ1bmN0aW9uIGtlKHQpe3JldHVybiB0IGluc3RhbmNlb2YgeGV9ZnVuY3Rpb24gT2UodCl7cmV0dXJuIHQ8MD9NYXRoLnJvdW5kKC0xKnQpKi0xOk1hdGgucm91bmQodCl9ZnVuY3Rpb24gRGUodCxlKXtVKHQsMCwwLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy51dGNPZmZzZXQoKSxpPSIrIjtyZXR1cm4gdDwwJiYodD0tdCxpPSItIiksaStWKH5+KHQvNjApLDIpK2UrVih+fnQlNjAsMil9KX1mdW5jdGlvbiBTZSh0LGUpe3ZhciBpPShlfHwiIikubWF0Y2godCl8fFtdLG89aVtpLmxlbmd0aC0xXXx8W10sbj0obysiIikubWF0Y2goTG4pfHxbIi0iLDAsMF0scz0rKDYwKm5bMV0pK18oblsyXSk7cmV0dXJuIisiPT09blswXT9zOi1zfWZ1bmN0aW9uIENlKHQsaSl7dmFyIG8sbjtyZXR1cm4gaS5faXNVVEM/KG89aS5jbG9uZSgpLG49KHkodCl8fHIodCk/dC52YWx1ZU9mKCk6eWUodCkudmFsdWVPZigpKS1vLnZhbHVlT2YoKSxvLl9kLnNldFRpbWUoby5fZC52YWx1ZU9mKCkrbiksZS51cGRhdGVPZmZzZXQobywhMSksbyk6eWUodCkubG9jYWwoKX1mdW5jdGlvbiBUZSh0KXtyZXR1cm4gMTUqLU1hdGgucm91bmQodC5fZC5nZXRUaW1lem9uZU9mZnNldCgpLzE1KX1mdW5jdGlvbiBFZSh0LGkpe3ZhciBvLG49dGhpcy5fb2Zmc2V0fHwwO3JldHVybiB0aGlzLmlzVmFsaWQoKT9udWxsIT10Pygic3RyaW5nIj09dHlwZW9mIHQ/dD1TZShxbyx0KTpNYXRoLmFicyh0KTwxNiYmKHQqPTYwKSwhdGhpcy5faXNVVEMmJmkmJihvPVRlKHRoaXMpKSx0aGlzLl9vZmZzZXQ9dCx0aGlzLl9pc1VUQz0hMCxudWxsIT1vJiZ0aGlzLmFkZChvLCJtIiksbiE9PXQmJighaXx8dGhpcy5fY2hhbmdlSW5Qcm9ncmVzcz9WZSh0aGlzLEZlKHQtbiwibSIpLDEsITEpOnRoaXMuX2NoYW5nZUluUHJvZ3Jlc3N8fCh0aGlzLl9jaGFuZ2VJblByb2dyZXNzPSEwLGUudXBkYXRlT2Zmc2V0KHRoaXMsITApLHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3M9bnVsbCkpLHRoaXMpOnRoaXMuX2lzVVRDP246VGUodGhpcyk6bnVsbCE9dD90aGlzOk5hTn1mdW5jdGlvbiBNZSh0LGUpe3JldHVybiBudWxsIT10Pygic3RyaW5nIiE9dHlwZW9mIHQmJih0PS10KSx0aGlzLnV0Y09mZnNldCh0LGUpLHRoaXMpOi10aGlzLnV0Y09mZnNldCgpfWZ1bmN0aW9uIFBlKHQpe3JldHVybiB0aGlzLnV0Y09mZnNldCgwLHQpfWZ1bmN0aW9uIEllKHQpe3JldHVybiB0aGlzLl9pc1VUQyYmKHRoaXMudXRjT2Zmc2V0KDAsdCksdGhpcy5faXNVVEM9ITEsdCYmdGhpcy5zdWJ0cmFjdChUZSh0aGlzKSwibSIpKSx0aGlzfWZ1bmN0aW9uIE5lKCl7aWYodGhpcy5fdHptKXRoaXMudXRjT2Zmc2V0KHRoaXMuX3R6bSk7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuX2kpe3ZhciB0PVNlKFVvLHRoaXMuX2kpOzA9PT10P3RoaXMudXRjT2Zmc2V0KDAsITApOnRoaXMudXRjT2Zmc2V0KFNlKFVvLHRoaXMuX2kpKX1yZXR1cm4gdGhpc31mdW5jdGlvbiBSZSh0KXtyZXR1cm4hIXRoaXMuaXNWYWxpZCgpJiYodD10P3llKHQpLnV0Y09mZnNldCgpOjAsKHRoaXMudXRjT2Zmc2V0KCktdCklNjA9PT0wKX1mdW5jdGlvbiBMZSgpe3JldHVybiB0aGlzLnV0Y09mZnNldCgpPnRoaXMuY2xvbmUoKS5tb250aCgwKS51dGNPZmZzZXQoKXx8dGhpcy51dGNPZmZzZXQoKT50aGlzLmNsb25lKCkubW9udGgoNSkudXRjT2Zmc2V0KCl9ZnVuY3Rpb24gemUoKXtpZighbSh0aGlzLl9pc0RTVFNoaWZ0ZWQpKXJldHVybiB0aGlzLl9pc0RTVFNoaWZ0ZWQ7dmFyIHQ9e307aWYodih0LHRoaXMpLHQ9bWUodCksdC5fYSl7dmFyIGU9dC5faXNVVEM/bCh0Ll9hKTp5ZSh0Ll9hKTt0aGlzLl9pc0RTVFNoaWZ0ZWQ9dGhpcy5pc1ZhbGlkKCkmJncodC5fYSxlLnRvQXJyYXkoKSk+MH1lbHNlIHRoaXMuX2lzRFNUU2hpZnRlZD0hMTtyZXR1cm4gdGhpcy5faXNEU1RTaGlmdGVkfWZ1bmN0aW9uIEFlKCl7cmV0dXJuISF0aGlzLmlzVmFsaWQoKSYmIXRoaXMuX2lzVVRDfWZ1bmN0aW9uIEJlKCl7cmV0dXJuISF0aGlzLmlzVmFsaWQoKSYmdGhpcy5faXNVVEN9ZnVuY3Rpb24gamUoKXtyZXR1cm4hIXRoaXMuaXNWYWxpZCgpJiYodGhpcy5faXNVVEMmJjA9PT10aGlzLl9vZmZzZXQpfWZ1bmN0aW9uIEZlKHQsZSl7dmFyIGksbyxuLHM9dCxyPW51bGw7cmV0dXJuIGtlKHQpP3M9e21zOnQuX21pbGxpc2Vjb25kcyxkOnQuX2RheXMsTTp0Ll9tb250aHN9OiJudW1iZXIiPT10eXBlb2YgdD8ocz17fSxlP3NbZV09dDpzLm1pbGxpc2Vjb25kcz10KToocj16bi5leGVjKHQpKT8oaT0iLSI9PT1yWzFdPy0xOjEscz17eTowLGQ6XyhyW3RuXSkqaSxoOl8ocltlbl0pKmksbTpfKHJbb25dKSppLHM6XyhyW25uXSkqaSxtczpfKE9lKDFlMypyW3NuXSkpKml9KToocj1Bbi5leGVjKHQpKT8oaT0iLSI9PT1yWzFdPy0xOjEscz17eTpIZShyWzJdLGkpLE06SGUoclszXSxpKSx3OkhlKHJbNF0saSksZDpIZShyWzVdLGkpLGg6SGUocls2XSxpKSxtOkhlKHJbN10saSksczpIZShyWzhdLGkpfSk6bnVsbD09cz9zPXt9OiJvYmplY3QiPT10eXBlb2YgcyYmKCJmcm9tImluIHN8fCJ0byJpbiBzKSYmKG49WWUoeWUocy5mcm9tKSx5ZShzLnRvKSkscz17fSxzLm1zPW4ubWlsbGlzZWNvbmRzLHMuTT1uLm1vbnRocyksbz1uZXcgeGUocyksa2UodCkmJmgodCwiX2xvY2FsZSIpJiYoby5fbG9jYWxlPXQuX2xvY2FsZSksb31mdW5jdGlvbiBIZSh0LGUpe3ZhciBpPXQmJnBhcnNlRmxvYXQodC5yZXBsYWNlKCIsIiwiLiIpKTtyZXR1cm4oaXNOYU4oaSk/MDppKSplfWZ1bmN0aW9uIFdlKHQsZSl7dmFyIGk9e21pbGxpc2Vjb25kczowLG1vbnRoczowfTtyZXR1cm4gaS5tb250aHM9ZS5tb250aCgpLXQubW9udGgoKSsxMiooZS55ZWFyKCktdC55ZWFyKCkpLHQuY2xvbmUoKS5hZGQoaS5tb250aHMsIk0iKS5pc0FmdGVyKGUpJiYtLWkubW9udGhzLGkubWlsbGlzZWNvbmRzPStlLSt0LmNsb25lKCkuYWRkKGkubW9udGhzLCJNIiksaX1mdW5jdGlvbiBZZSh0LGUpe3ZhciBpO3JldHVybiB0LmlzVmFsaWQoKSYmZS5pc1ZhbGlkKCk/KGU9Q2UoZSx0KSx0LmlzQmVmb3JlKGUpP2k9V2UodCxlKTooaT1XZShlLHQpLGkubWlsbGlzZWNvbmRzPS1pLm1pbGxpc2Vjb25kcyxpLm1vbnRocz0taS5tb250aHMpLGkpOnttaWxsaXNlY29uZHM6MCxtb250aHM6MH19ZnVuY3Rpb24gR2UodCxlKXtyZXR1cm4gZnVuY3Rpb24oaSxvKXt2YXIgbixzO3JldHVybiBudWxsPT09b3x8aXNOYU4oK28pfHwoTyhlLCJtb21lbnQoKS4iK2UrIihwZXJpb2QsIG51bWJlcikgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBtb21lbnQoKS4iK2UrIihudW1iZXIsIHBlcmlvZCkuIFNlZSBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2FkZC1pbnZlcnRlZC1wYXJhbS8gZm9yIG1vcmUgaW5mby4iKSxzPWksaT1vLG89cyksaT0ic3RyaW5nIj09dHlwZW9mIGk/K2k6aSxuPUZlKGksbyksVmUodGhpcyxuLHQpLHRoaXN9fWZ1bmN0aW9uIFZlKHQsaSxvLG4pe3ZhciBzPWkuX21pbGxpc2Vjb25kcyxyPU9lKGkuX2RheXMpLGE9T2UoaS5fbW9udGhzKTt0LmlzVmFsaWQoKSYmKG49bnVsbD09bnx8bixzJiZ0Ll9kLnNldFRpbWUodC5fZC52YWx1ZU9mKCkrcypvKSxyJiZXKHQsIkRhdGUiLEgodCwiRGF0ZSIpK3IqbyksYSYmZHQodCxIKHQsIk1vbnRoIikrYSpvKSxuJiZlLnVwZGF0ZU9mZnNldCh0LHJ8fGEpKX1mdW5jdGlvbiBVZSh0LGUpe3ZhciBpPXQuZGlmZihlLCJkYXlzIiwhMCk7cmV0dXJuIGk8LTY/InNhbWVFbHNlIjppPC0xPyJsYXN0V2VlayI6aTwwPyJsYXN0RGF5IjppPDE/InNhbWVEYXkiOmk8Mj8ibmV4dERheSI6aTw3PyJuZXh0V2VlayI6InNhbWVFbHNlIn1mdW5jdGlvbiBxZSh0LGkpe3ZhciBvPXR8fHllKCksbj1DZShvLHRoaXMpLnN0YXJ0T2YoImRheSIpLHM9ZS5jYWxlbmRhckZvcm1hdCh0aGlzLG4pfHwic2FtZUVsc2UiLHI9aSYmKEQoaVtzXSk/aVtzXS5jYWxsKHRoaXMsbyk6aVtzXSk7cmV0dXJuIHRoaXMuZm9ybWF0KHJ8fHRoaXMubG9jYWxlRGF0YSgpLmNhbGVuZGFyKHMsdGhpcyx5ZShvKSkpfWZ1bmN0aW9uIFhlKCl7cmV0dXJuIG5ldyBnKHRoaXMpfWZ1bmN0aW9uIFplKHQsZSl7dmFyIGk9eSh0KT90OnllKHQpO3JldHVybiEoIXRoaXMuaXNWYWxpZCgpfHwhaS5pc1ZhbGlkKCkpJiYoZT16KG0oZSk/Im1pbGxpc2Vjb25kIjplKSwibWlsbGlzZWNvbmQiPT09ZT90aGlzLnZhbHVlT2YoKT5pLnZhbHVlT2YoKTppLnZhbHVlT2YoKTx0aGlzLmNsb25lKCkuc3RhcnRPZihlKS52YWx1ZU9mKCkpfWZ1bmN0aW9uIEtlKHQsZSl7dmFyIGk9eSh0KT90OnllKHQpO3JldHVybiEoIXRoaXMuaXNWYWxpZCgpfHwhaS5pc1ZhbGlkKCkpJiYoZT16KG0oZSk/Im1pbGxpc2Vjb25kIjplKSwibWlsbGlzZWNvbmQiPT09ZT90aGlzLnZhbHVlT2YoKTxpLnZhbHVlT2YoKTp0aGlzLmNsb25lKCkuZW5kT2YoZSkudmFsdWVPZigpPGkudmFsdWVPZigpKX1mdW5jdGlvbiBKZSh0LGUsaSxvKXtyZXR1cm4gbz1vfHwiKCkiLCgiKCI9PT1vWzBdP3RoaXMuaXNBZnRlcih0LGkpOiF0aGlzLmlzQmVmb3JlKHQsaSkpJiYoIikiPT09b1sxXT90aGlzLmlzQmVmb3JlKGUsaSk6IXRoaXMuaXNBZnRlcihlLGkpKX1mdW5jdGlvbiBRZSh0LGUpe3ZhciBpLG89eSh0KT90OnllKHQpO3JldHVybiEoIXRoaXMuaXNWYWxpZCgpfHwhby5pc1ZhbGlkKCkpJiYoZT16KGV8fCJtaWxsaXNlY29uZCIpLCJtaWxsaXNlY29uZCI9PT1lP3RoaXMudmFsdWVPZigpPT09by52YWx1ZU9mKCk6KGk9by52YWx1ZU9mKCksdGhpcy5jbG9uZSgpLnN0YXJ0T2YoZSkudmFsdWVPZigpPD1pJiZpPD10aGlzLmNsb25lKCkuZW5kT2YoZSkudmFsdWVPZigpKSl9ZnVuY3Rpb24gJGUodCxlKXtyZXR1cm4gdGhpcy5pc1NhbWUodCxlKXx8dGhpcy5pc0FmdGVyKHQsZSl9ZnVuY3Rpb24gdGkodCxlKXtyZXR1cm4gdGhpcy5pc1NhbWUodCxlKXx8dGhpcy5pc0JlZm9yZSh0LGUpfWZ1bmN0aW9uIGVpKHQsZSxpKXt2YXIgbyxuLHMscjtyZXR1cm4gdGhpcy5pc1ZhbGlkKCk/KG89Q2UodCx0aGlzKSxvLmlzVmFsaWQoKT8obj02ZTQqKG8udXRjT2Zmc2V0KCktdGhpcy51dGNPZmZzZXQoKSksZT16KGUpLCJ5ZWFyIj09PWV8fCJtb250aCI9PT1lfHwicXVhcnRlciI9PT1lPyhyPWlpKHRoaXMsbyksInF1YXJ0ZXIiPT09ZT9yLz0zOiJ5ZWFyIj09PWUmJihyLz0xMikpOihzPXRoaXMtbyxyPSJzZWNvbmQiPT09ZT9zLzFlMzoibWludXRlIj09PWU/cy82ZTQ6ImhvdXIiPT09ZT9zLzM2ZTU6ImRheSI9PT1lPyhzLW4pLzg2NGU1OiJ3ZWVrIj09PWU/KHMtbikvNjA0OGU1OnMpLGk/cjpiKHIpKTpOYU4pOk5hTn1mdW5jdGlvbiBpaSh0LGUpe3ZhciBpLG8sbj0xMiooZS55ZWFyKCktdC55ZWFyKCkpKyhlLm1vbnRoKCktdC5tb250aCgpKSxzPXQuY2xvbmUoKS5hZGQobiwibW9udGhzIik7cmV0dXJuIGUtczwwPyhpPXQuY2xvbmUoKS5hZGQobi0xLCJtb250aHMiKSxvPShlLXMpLyhzLWkpKTooaT10LmNsb25lKCkuYWRkKG4rMSwibW9udGhzIiksbz0oZS1zKS8oaS1zKSksLShuK28pfHwwfWZ1bmN0aW9uIG9pKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5sb2NhbGUoImVuIikuZm9ybWF0KCJkZGQgTU1NIEREIFlZWVkgSEg6bW06c3MgW0dNVF1aWiIpfWZ1bmN0aW9uIG5pKCl7dmFyIHQ9dGhpcy5jbG9uZSgpLnV0YygpO3JldHVybiAwPHQueWVhcigpJiZ0LnllYXIoKTw9OTk5OT9EKERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nKT90aGlzLnRvRGF0ZSgpLnRvSVNPU3RyaW5nKCk6Wih0LCJZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTW1pdIik6Wih0LCJZWVlZWVktTU0tRERbVF1ISDptbTpzcy5TU1NbWl0iKX1mdW5jdGlvbiBzaSh0KXt0fHwodD10aGlzLmlzVXRjKCk/ZS5kZWZhdWx0Rm9ybWF0VXRjOmUuZGVmYXVsdEZvcm1hdCk7dmFyIGk9Wih0aGlzLHQpO3JldHVybiB0aGlzLmxvY2FsZURhdGEoKS5wb3N0Zm9ybWF0KGkpfWZ1bmN0aW9uIHJpKHQsZSl7cmV0dXJuIHRoaXMuaXNWYWxpZCgpJiYoeSh0KSYmdC5pc1ZhbGlkKCl8fHllKHQpLmlzVmFsaWQoKSk/RmUoe3RvOnRoaXMsZnJvbTp0fSkubG9jYWxlKHRoaXMubG9jYWxlKCkpLmh1bWFuaXplKCFlKTp0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpfWZ1bmN0aW9uIGFpKHQpe3JldHVybiB0aGlzLmZyb20oeWUoKSx0KX1mdW5jdGlvbiBoaSh0LGUpe3JldHVybiB0aGlzLmlzVmFsaWQoKSYmKHkodCkmJnQuaXNWYWxpZCgpfHx5ZSh0KS5pc1ZhbGlkKCkpP0ZlKHtmcm9tOnRoaXMsdG86dH0pLmxvY2FsZSh0aGlzLmxvY2FsZSgpKS5odW1hbml6ZSghZSk6dGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKX1mdW5jdGlvbiBkaSh0KXtyZXR1cm4gdGhpcy50byh5ZSgpLHQpfWZ1bmN0aW9uIGxpKHQpe3ZhciBlO3JldHVybiB2b2lkIDA9PT10P3RoaXMuX2xvY2FsZS5fYWJicjooZT1lZSh0KSxudWxsIT1lJiYodGhpcy5fbG9jYWxlPWUpLHRoaXMpfWZ1bmN0aW9uIGNpKCl7cmV0dXJuIHRoaXMuX2xvY2FsZX1mdW5jdGlvbiB1aSh0KXtzd2l0Y2godD16KHQpKXtjYXNlInllYXIiOnRoaXMubW9udGgoMCk7Y2FzZSJxdWFydGVyIjpjYXNlIm1vbnRoIjp0aGlzLmRhdGUoMSk7Y2FzZSJ3ZWVrIjpjYXNlImlzb1dlZWsiOmNhc2UiZGF5IjpjYXNlImRhdGUiOnRoaXMuaG91cnMoMCk7Y2FzZSJob3VyIjp0aGlzLm1pbnV0ZXMoMCk7Y2FzZSJtaW51dGUiOnRoaXMuc2Vjb25kcygwKTtjYXNlInNlY29uZCI6dGhpcy5taWxsaXNlY29uZHMoMCl9cmV0dXJuIndlZWsiPT09dCYmdGhpcy53ZWVrZGF5KDApLCJpc29XZWVrIj09PXQmJnRoaXMuaXNvV2Vla2RheSgxKSwicXVhcnRlciI9PT10JiZ0aGlzLm1vbnRoKDMqTWF0aC5mbG9vcih0aGlzLm1vbnRoKCkvMykpLHRoaXN9ZnVuY3Rpb24gcGkodCl7cmV0dXJuIHQ9eih0KSx2b2lkIDA9PT10fHwibWlsbGlzZWNvbmQiPT09dD90aGlzOigiZGF0ZSI9PT10JiYodD0iZGF5IiksdGhpcy5zdGFydE9mKHQpLmFkZCgxLCJpc29XZWVrIj09PXQ/IndlZWsiOnQpLnN1YnRyYWN0KDEsIm1zIikpfWZ1bmN0aW9uIGZpKCl7cmV0dXJuIHRoaXMuX2QudmFsdWVPZigpLTZlNCoodGhpcy5fb2Zmc2V0fHwwKX1mdW5jdGlvbiBtaSgpe3JldHVybiBNYXRoLmZsb29yKHRoaXMudmFsdWVPZigpLzFlMyl9ZnVuY3Rpb24gdmkoKXtyZXR1cm4gbmV3IERhdGUodGhpcy52YWx1ZU9mKCkpfWZ1bmN0aW9uIGdpKCl7dmFyIHQ9dGhpcztyZXR1cm5bdC55ZWFyKCksdC5tb250aCgpLHQuZGF0ZSgpLHQuaG91cigpLHQubWludXRlKCksdC5zZWNvbmQoKSx0Lm1pbGxpc2Vjb25kKCldfWZ1bmN0aW9uIHlpKCl7dmFyIHQ9dGhpcztyZXR1cm57eWVhcnM6dC55ZWFyKCksbW9udGhzOnQubW9udGgoKSxkYXRlOnQuZGF0ZSgpLGhvdXJzOnQuaG91cnMoKSxtaW51dGVzOnQubWludXRlcygpLHNlY29uZHM6dC5zZWNvbmRzKCksbWlsbGlzZWNvbmRzOnQubWlsbGlzZWNvbmRzKCl9fWZ1bmN0aW9uIGJpKCl7cmV0dXJuIHRoaXMuaXNWYWxpZCgpP3RoaXMudG9JU09TdHJpbmcoKTpudWxsfWZ1bmN0aW9uIF9pKCl7cmV0dXJuIHAodGhpcyl9ZnVuY3Rpb24gd2koKXtyZXR1cm4gZCh7fSx1KHRoaXMpKX1mdW5jdGlvbiB4aSgpe3JldHVybiB1KHRoaXMpLm92ZXJmbG93fWZ1bmN0aW9uIGtpKCl7cmV0dXJue2lucHV0OnRoaXMuX2ksZm9ybWF0OnRoaXMuX2YsbG9jYWxlOnRoaXMuX2xvY2FsZSxpc1VUQzp0aGlzLl9pc1VUQyxzdHJpY3Q6dGhpcy5fc3RyaWN0fX1mdW5jdGlvbiBPaSh0LGUpe1UoMCxbdCx0Lmxlbmd0aF0sMCxlKX1mdW5jdGlvbiBEaSh0KXtyZXR1cm4gRWkuY2FsbCh0aGlzLHQsdGhpcy53ZWVrKCksdGhpcy53ZWVrZGF5KCksdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWsuZG93LHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRveSl9ZnVuY3Rpb24gU2kodCl7cmV0dXJuIEVpLmNhbGwodGhpcyx0LHRoaXMuaXNvV2VlaygpLHRoaXMuaXNvV2Vla2RheSgpLDEsNCl9ZnVuY3Rpb24gQ2koKXtyZXR1cm4ga3QodGhpcy55ZWFyKCksMSw0KX1mdW5jdGlvbiBUaSgpe3ZhciB0PXRoaXMubG9jYWxlRGF0YSgpLl93ZWVrO3JldHVybiBrdCh0aGlzLnllYXIoKSx0LmRvdyx0LmRveSl9ZnVuY3Rpb24gRWkodCxlLGksbyxuKXt2YXIgcztyZXR1cm4gbnVsbD09dD94dCh0aGlzLG8sbikueWVhcjoocz1rdCh0LG8sbiksZT5zJiYoZT1zKSxNaS5jYWxsKHRoaXMsdCxlLGksbyxuKSl9ZnVuY3Rpb24gTWkodCxlLGksbyxuKXt2YXIgcz13dCh0LGUsaSxvLG4pLHI9YnQocy55ZWFyLDAscy5kYXlPZlllYXIpO3JldHVybiB0aGlzLnllYXIoci5nZXRVVENGdWxsWWVhcigpKSx0aGlzLm1vbnRoKHIuZ2V0VVRDTW9udGgoKSksdGhpcy5kYXRlKHIuZ2V0VVRDRGF0ZSgpKSx0aGlzfWZ1bmN0aW9uIFBpKHQpe3JldHVybiBudWxsPT10P01hdGguY2VpbCgodGhpcy5tb250aCgpKzEpLzMpOnRoaXMubW9udGgoMyoodC0xKSt0aGlzLm1vbnRoKCklMyl9ZnVuY3Rpb24gSWkodCl7dmFyIGU9TWF0aC5yb3VuZCgodGhpcy5jbG9uZSgpLnN0YXJ0T2YoImRheSIpLXRoaXMuY2xvbmUoKS5zdGFydE9mKCJ5ZWFyIikpLzg2NGU1KSsxO3JldHVybiBudWxsPT10P2U6dGhpcy5hZGQodC1lLCJkIil9ZnVuY3Rpb24gTmkodCxlKXtlW3NuXT1fKDFlMyooIjAuIit0KSl9ZnVuY3Rpb24gUmkoKXtyZXR1cm4gdGhpcy5faXNVVEM/IlVUQyI6IiJ9ZnVuY3Rpb24gTGkoKXtyZXR1cm4gdGhpcy5faXNVVEM/IkNvb3JkaW5hdGVkIFVuaXZlcnNhbCBUaW1lIjoiIn1mdW5jdGlvbiB6aSh0KXtyZXR1cm4geWUoMWUzKnQpfWZ1bmN0aW9uIEFpKCl7cmV0dXJuIHllLmFwcGx5KG51bGwsYXJndW1lbnRzKS5wYXJzZVpvbmUoKX1mdW5jdGlvbiBCaSh0KXtyZXR1cm4gdH1mdW5jdGlvbiBqaSh0LGUsaSxvKXt2YXIgbj1lZSgpLHM9bCgpLnNldChvLGUpO3JldHVybiBuW2ldKHMsdCl9ZnVuY3Rpb24gRmkodCxlLGkpe2lmKCJudW1iZXIiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksdD10fHwiIixudWxsIT1lKXJldHVybiBqaSh0LGUsaSwibW9udGgiKTt2YXIgbyxuPVtdO2ZvcihvPTA7bzwxMjtvKyspbltvXT1qaSh0LG8saSwibW9udGgiKTtyZXR1cm4gbn1mdW5jdGlvbiBIaSh0LGUsaSxvKXsiYm9vbGVhbiI9PXR5cGVvZiB0PygibnVtYmVyIj09dHlwZW9mIGUmJihpPWUsZT12b2lkIDApLGU9ZXx8IiIpOihlPXQsaT1lLHQ9ITEsIm51bWJlciI9PXR5cGVvZiBlJiYoaT1lLGU9dm9pZCAwKSxlPWV8fCIiKTt2YXIgbj1lZSgpLHM9dD9uLl93ZWVrLmRvdzowO2lmKG51bGwhPWkpcmV0dXJuIGppKGUsKGkrcyklNyxvLCJkYXkiKTt2YXIgcixhPVtdO2ZvcihyPTA7cjw3O3IrKylhW3JdPWppKGUsKHIrcyklNyxvLCJkYXkiKTtyZXR1cm4gYX1mdW5jdGlvbiBXaSh0LGUpe3JldHVybiBGaSh0LGUsIm1vbnRocyIpfWZ1bmN0aW9uIFlpKHQsZSl7cmV0dXJuIEZpKHQsZSwibW9udGhzU2hvcnQiKX1mdW5jdGlvbiBHaSh0LGUsaSl7cmV0dXJuIEhpKHQsZSxpLCJ3ZWVrZGF5cyIpfWZ1bmN0aW9uIFZpKHQsZSxpKXtyZXR1cm4gSGkodCxlLGksIndlZWtkYXlzU2hvcnQiKX1mdW5jdGlvbiBVaSh0LGUsaSl7cmV0dXJuIEhpKHQsZSxpLCJ3ZWVrZGF5c01pbiIpfWZ1bmN0aW9uIHFpKCl7dmFyIHQ9dGhpcy5fZGF0YTtyZXR1cm4gdGhpcy5fbWlsbGlzZWNvbmRzPVpuKHRoaXMuX21pbGxpc2Vjb25kcyksdGhpcy5fZGF5cz1abih0aGlzLl9kYXlzKSx0aGlzLl9tb250aHM9Wm4odGhpcy5fbW9udGhzKSx0Lm1pbGxpc2Vjb25kcz1abih0Lm1pbGxpc2Vjb25kcyksdC5zZWNvbmRzPVpuKHQuc2Vjb25kcyksdC5taW51dGVzPVpuKHQubWludXRlcyksdC5ob3Vycz1abih0LmhvdXJzKSx0Lm1vbnRocz1abih0Lm1vbnRocyksdC55ZWFycz1abih0LnllYXJzKSx0aGlzfWZ1bmN0aW9uIFhpKHQsZSxpLG8pe3ZhciBuPUZlKGUsaSk7cmV0dXJuIHQuX21pbGxpc2Vjb25kcys9bypuLl9taWxsaXNlY29uZHMsdC5fZGF5cys9bypuLl9kYXlzLHQuX21vbnRocys9bypuLl9tb250aHMsdC5fYnViYmxlKCl9ZnVuY3Rpb24gWmkodCxlKXtyZXR1cm4gWGkodGhpcyx0LGUsMSl9ZnVuY3Rpb24gS2kodCxlKXtyZXR1cm4gWGkodGhpcyx0LGUsLTEpfWZ1bmN0aW9uIEppKHQpe3JldHVybiB0PDA/TWF0aC5mbG9vcih0KTpNYXRoLmNlaWwodCl9ZnVuY3Rpb24gUWkoKXt2YXIgdCxlLGksbyxuLHM9dGhpcy5fbWlsbGlzZWNvbmRzLHI9dGhpcy5fZGF5cyxhPXRoaXMuX21vbnRocyxoPXRoaXMuX2RhdGE7cmV0dXJuIHM+PTAmJnI+PTAmJmE+PTB8fHM8PTAmJnI8PTAmJmE8PTB8fChzKz04NjRlNSpKaSh0byhhKStyKSxyPTAsYT0wKSxoLm1pbGxpc2Vjb25kcz1zJTFlMyx0PWIocy8xZTMpLGguc2Vjb25kcz10JTYwLGU9Yih0LzYwKSxoLm1pbnV0ZXM9ZSU2MCxpPWIoZS82MCksaC5ob3Vycz1pJTI0LHIrPWIoaS8yNCksbj1iKCRpKHIpKSxhKz1uLHItPUppKHRvKG4pKSxvPWIoYS8xMiksYSU9MTIsaC5kYXlzPXIsaC5tb250aHM9YSxoLnllYXJzPW8sdGhpc31mdW5jdGlvbiAkaSh0KXtyZXR1cm4gNDgwMCp0LzE0NjA5N31mdW5jdGlvbiB0byh0KXtyZXR1cm4gMTQ2MDk3KnQvNDgwMH1mdW5jdGlvbiBlbyh0KXt2YXIgZSxpLG89dGhpcy5fbWlsbGlzZWNvbmRzO2lmKHQ9eih0KSwibW9udGgiPT09dHx8InllYXIiPT09dClyZXR1cm4gZT10aGlzLl9kYXlzK28vODY0ZTUsaT10aGlzLl9tb250aHMrJGkoZSksIm1vbnRoIj09PXQ/aTppLzEyO3N3aXRjaChlPXRoaXMuX2RheXMrTWF0aC5yb3VuZCh0byh0aGlzLl9tb250aHMpKSx0KXtjYXNlIndlZWsiOnJldHVybiBlLzcrby82MDQ4ZTU7Y2FzZSJkYXkiOnJldHVybiBlK28vODY0ZTU7Y2FzZSJob3VyIjpyZXR1cm4gMjQqZStvLzM2ZTU7Y2FzZSJtaW51dGUiOnJldHVybiAxNDQwKmUrby82ZTQ7Y2FzZSJzZWNvbmQiOnJldHVybiA4NjQwMCplK28vMWUzO2Nhc2UibWlsbGlzZWNvbmQiOnJldHVybiBNYXRoLmZsb29yKDg2NGU1KmUpK287ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gdW5pdCAiK3QpfX1mdW5jdGlvbiBpbygpe3JldHVybiB0aGlzLl9taWxsaXNlY29uZHMrODY0ZTUqdGhpcy5fZGF5cyt0aGlzLl9tb250aHMlMTIqMjU5MmU2KzMxNTM2ZTYqXyh0aGlzLl9tb250aHMvMTIpfWZ1bmN0aW9uIG9vKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLmFzKHQpfX1mdW5jdGlvbiBubyh0KXtyZXR1cm4gdD16KHQpLHRoaXNbdCsicyJdKCl9ZnVuY3Rpb24gc28odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGFbdF19fWZ1bmN0aW9uIHJvKCl7cmV0dXJuIGIodGhpcy5kYXlzKCkvNyl9ZnVuY3Rpb24gYW8odCxlLGksbyxuKXtyZXR1cm4gbi5yZWxhdGl2ZVRpbWUoZXx8MSwhIWksdCxvKX1mdW5jdGlvbiBobyh0LGUsaSl7dmFyIG89RmUodCkuYWJzKCksbj1jcyhvLmFzKCJzIikpLHM9Y3Moby5hcygibSIpKSxyPWNzKG8uYXMoImgiKSksYT1jcyhvLmFzKCJkIikpLGg9Y3Moby5hcygiTSIpKSxkPWNzKG8uYXMoInkiKSksbD1uPHVzLnMmJlsicyIsbl18fHM8PTEmJlsibSJdfHxzPHVzLm0mJlsibW0iLHNdfHxyPD0xJiZbImgiXXx8cjx1cy5oJiZbImhoIixyXXx8YTw9MSYmWyJkIl18fGE8dXMuZCYmWyJkZCIsYV18fGg8PTEmJlsiTSJdfHxoPHVzLk0mJlsiTU0iLGhdfHxkPD0xJiZbInkiXXx8WyJ5eSIsZF07cmV0dXJuIGxbMl09ZSxsWzNdPSt0PjAsbFs0XT1pLGFvLmFwcGx5KG51bGwsbCl9ZnVuY3Rpb24gbG8odCl7cmV0dXJuIHZvaWQgMD09PXQ/Y3M6ImZ1bmN0aW9uIj09dHlwZW9mIHQmJihjcz10LCEwKX1mdW5jdGlvbiBjbyh0LGUpe3JldHVybiB2b2lkIDAhPT11c1t0XSYmKHZvaWQgMD09PWU/dXNbdF06KHVzW3RdPWUsITApKX1mdW5jdGlvbiB1byh0KXt2YXIgZT10aGlzLmxvY2FsZURhdGEoKSxpPWhvKHRoaXMsIXQsZSk7cmV0dXJuIHQmJihpPWUucGFzdEZ1dHVyZSgrdGhpcyxpKSksZS5wb3N0Zm9ybWF0KGkpfWZ1bmN0aW9uIHBvKCl7dmFyIHQsZSxpLG89cHModGhpcy5fbWlsbGlzZWNvbmRzKS8xZTMsbj1wcyh0aGlzLl9kYXlzKSxzPXBzKHRoaXMuX21vbnRocyk7dD1iKG8vNjApLGU9Yih0LzYwKSxvJT02MCx0JT02MCxpPWIocy8xMikscyU9MTI7dmFyIHI9aSxhPXMsaD1uLGQ9ZSxsPXQsYz1vLHU9dGhpcy5hc1NlY29uZHMoKTtyZXR1cm4gdT8odTwwPyItIjoiIikrIlAiKyhyP3IrIlkiOiIiKSsoYT9hKyJNIjoiIikrKGg/aCsiRCI6IiIpKyhkfHxsfHxjPyJUIjoiIikrKGQ/ZCsiSCI6IiIpKyhsP2wrIk0iOiIiKSsoYz9jKyJTIjoiIik6IlAwRCJ9dmFyIGZvLG1vO21vPUFycmF5LnByb3RvdHlwZS5zb21lP0FycmF5LnByb3RvdHlwZS5zb21lOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1PYmplY3QodGhpcyksaT1lLmxlbmd0aD4+PjAsbz0wO288aTtvKyspaWYobyBpbiBlJiZ0LmNhbGwodGhpcyxlW29dLG8sZSkpcmV0dXJuITA7cmV0dXJuITF9O3ZhciB2bz1lLm1vbWVudFByb3BlcnRpZXM9W10sZ289ITEseW89e307ZS5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3M9ITEsZS5kZXByZWNhdGlvbkhhbmRsZXI9bnVsbDt2YXIgYm87Ym89T2JqZWN0LmtleXM/T2JqZWN0LmtleXM6ZnVuY3Rpb24odCl7dmFyIGUsaT1bXTtmb3IoZSBpbiB0KWgodCxlKSYmaS5wdXNoKGUpO3JldHVybiBpfTt2YXIgX28sd289e3NhbWVEYXk6IltUb2RheSBhdF0gTFQiLG5leHREYXk6IltUb21vcnJvdyBhdF0gTFQiLG5leHRXZWVrOiJkZGRkIFthdF0gTFQiLGxhc3REYXk6IltZZXN0ZXJkYXkgYXRdIExUIixsYXN0V2VlazoiW0xhc3RdIGRkZGQgW2F0XSBMVCIsc2FtZUVsc2U6IkwifSx4bz17TFRTOiJoOm1tOnNzIEEiLExUOiJoOm1tIEEiLEw6Ik1NL0REL1lZWVkiLExMOiJNTU1NIEQsIFlZWVkiLExMTDoiTU1NTSBELCBZWVlZIGg6bW0gQSIsTExMTDoiZGRkZCwgTU1NTSBELCBZWVlZIGg6bW0gQSJ9LGtvPSJJbnZhbGlkIGRhdGUiLE9vPSIlZCIsRG89L1xkezEsMn0vLFNvPXtmdXR1cmU6ImluICVzIixwYXN0OiIlcyBhZ28iLHM6ImEgZmV3IHNlY29uZHMiLG06ImEgbWludXRlIixtbToiJWQgbWludXRlcyIsaDoiYW4gaG91ciIsaGg6IiVkIGhvdXJzIixkOiJhIGRheSIsZGQ6IiVkIGRheXMiLE06ImEgbW9udGgiLE1NOiIlZCBtb250aHMiLHk6ImEgeWVhciIseXk6IiVkIHllYXJzIn0sQ289e30sVG89e30sRW89LyhcW1teXFtdKlxdKXwoXFwpPyhbSGhdbW0oc3MpP3xNb3xNTT9NP00/fERvfERERG98REQ/RD9EP3xkZGQ/ZD98ZG8/fHdbb3x3XT98V1tvfFddP3xRbz98WVlZWVlZfFlZWVlZfFlZWVl8WVl8Z2coZ2dnPyk/fEdHKEdHRz8pP3xlfEV8YXxBfGhoP3xISD98a2s/fG1tP3xzcz98U3sxLDl9fHh8WHx6ej98Wlo/fC4pL2csTW89LyhcW1teXFtdKlxdKXwoXFwpPyhMVFN8TFR8TEw/TD9MP3xsezEsNH0pL2csUG89e30sSW89e30sTm89L1xkLyxSbz0vXGRcZC8sTG89L1xkezN9Lyx6bz0vXGR7NH0vLEFvPS9bKy1dP1xkezZ9LyxCbz0vXGRcZD8vLGpvPS9cZFxkXGRcZD8vLEZvPS9cZFxkXGRcZFxkXGQ/LyxIbz0vXGR7MSwzfS8sV289L1xkezEsNH0vLFlvPS9bKy1dP1xkezEsNn0vLEdvPS9cZCsvLFZvPS9bKy1dP1xkKy8sVW89L1p8WystXVxkXGQ6P1xkXGQvZ2kscW89L1p8WystXVxkXGQoPzo6P1xkXGQpPy9naSxYbz0vWystXT9cZCsoXC5cZHsxLDN9KT8vLFpvPS9bMC05XSpbJ2Etelx1MDBBMC1cdTA1RkZcdTA3MDAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZdK3xbXHUwNjAwLVx1MDZGRlwvXSsoXHMqP1tcdTA2MDAtXHUwNkZGXSspezEsMn0vaSxLbz17fSxKbz17fSxRbz0wLCRvPTEsdG49Mixlbj0zLG9uPTQsbm49NSxzbj02LHJuPTcsYW49ODtfbz1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9BcnJheS5wcm90b3R5cGUuaW5kZXhPZjpmdW5jdGlvbih0KXt2YXIgZTtmb3IoZT0wO2U8dGhpcy5sZW5ndGg7KytlKWlmKHRoaXNbZV09PT10KXJldHVybiBlO3JldHVybi0xfSxVKCJNIixbIk1NIiwyXSwiTW8iLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubW9udGgoKSsxfSksVSgiTU1NIiwwLDAsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1vbnRoc1Nob3J0KHRoaXMsdCl9KSxVKCJNTU1NIiwwLDAsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1vbnRocyh0aGlzLHQpfSksTCgibW9udGgiLCJNIiksQigibW9udGgiLDgpLEooIk0iLEJvKSxKKCJNTSIsQm8sUm8pLEooIk1NTSIsZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5tb250aHNTaG9ydFJlZ2V4KHQpfSksSigiTU1NTSIsZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5tb250aHNSZWdleCh0KX0pLGV0KFsiTSIsIk1NIl0sZnVuY3Rpb24odCxlKXtlWyRvXT1fKHQpLTF9KSxldChbIk1NTSIsIk1NTU0iXSxmdW5jdGlvbih0LGUsaSxvKXt2YXIgbj1pLl9sb2NhbGUubW9udGhzUGFyc2UodCxvLGkuX3N0cmljdCk7bnVsbCE9bj9lWyRvXT1uOnUoaSkuaW52YWxpZE1vbnRoPXR9KTt2YXIgaG49L0Rbb0RdPyhcW1teXFtcXV0qXF18XHMpK01NTU0/Lyxkbj0iSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlciIuc3BsaXQoIl8iKSxsbj0iSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWMiLnNwbGl0KCJfIiksY249Wm8sdW49Wm87VSgiWSIsMCwwLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy55ZWFyKCk7cmV0dXJuIHQ8PTk5OTk/IiIrdDoiKyIrdH0pLFUoMCxbIllZIiwyXSwwLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWVhcigpJTEwMH0pLFUoMCxbIllZWVkiLDRdLDAsInllYXIiKSxVKDAsWyJZWVlZWSIsNV0sMCwieWVhciIpLFUoMCxbIllZWVlZWSIsNiwhMF0sMCwieWVhciIpLEwoInllYXIiLCJ5IiksQigieWVhciIsMSksSigiWSIsVm8pLEooIllZIixCbyxSbyksSigiWVlZWSIsV28sem8pLEooIllZWVlZIixZbyxBbyksSigiWVlZWVlZIixZbyxBbyksZXQoWyJZWVlZWSIsIllZWVlZWSJdLFFvKSxldCgiWVlZWSIsZnVuY3Rpb24odCxpKXtpW1FvXT0yPT09dC5sZW5ndGg/ZS5wYXJzZVR3b0RpZ2l0WWVhcih0KTpfKHQpfSksZXQoIllZIixmdW5jdGlvbih0LGkpe2lbUW9dPWUucGFyc2VUd29EaWdpdFllYXIodCl9KSxldCgiWSIsZnVuY3Rpb24odCxlKXtlW1FvXT1wYXJzZUludCh0LDEwKX0pLGUucGFyc2VUd29EaWdpdFllYXI9ZnVuY3Rpb24odCl7cmV0dXJuIF8odCkrKF8odCk+Njg/MTkwMDoyZTMpfTt2YXIgcG49RigiRnVsbFllYXIiLCEwKTtVKCJ3IixbInd3IiwyXSwid28iLCJ3ZWVrIiksVSgiVyIsWyJXVyIsMl0sIldvIiwiaXNvV2VlayIpLEwoIndlZWsiLCJ3IiksTCgiaXNvV2VlayIsIlciKSxCKCJ3ZWVrIiw1KSxCKCJpc29XZWVrIiw1KSxKKCJ3IixCbyksSigid3ciLEJvLFJvKSxKKCJXIixCbyksSigiV1ciLEJvLFJvKSxpdChbInciLCJ3dyIsIlciLCJXVyJdLGZ1bmN0aW9uKHQsZSxpLG8pe2Vbby5zdWJzdHIoMCwxKV09Xyh0KX0pO3ZhciBmbj17ZG93OjAsZG95OjZ9O1UoImQiLDAsImRvIiwiZGF5IiksVSgiZGQiLDAsMCxmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXNNaW4odGhpcyx0KX0pLFUoImRkZCIsMCwwLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5c1Nob3J0KHRoaXMsdCl9KSxVKCJkZGRkIiwwLDAsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzKHRoaXMsdCl9KSxVKCJlIiwwLDAsIndlZWtkYXkiKSxVKCJFIiwwLDAsImlzb1dlZWtkYXkiKSxMKCJkYXkiLCJkIiksTCgid2Vla2RheSIsImUiKSxMKCJpc29XZWVrZGF5IiwiRSIpLEIoImRheSIsMTEpLEIoIndlZWtkYXkiLDExKSxCKCJpc29XZWVrZGF5IiwxMSksSigiZCIsQm8pLEooImUiLEJvKSxKKCJFIixCbyksSigiZGQiLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUud2Vla2RheXNNaW5SZWdleCh0KX0pLEooImRkZCIsZnVuY3Rpb24odCxlKXtyZXR1cm4gZS53ZWVrZGF5c1Nob3J0UmVnZXgodCl9KSxKKCJkZGRkIixmdW5jdGlvbih0LGUpe3JldHVybiBlLndlZWtkYXlzUmVnZXgodCl9KSxpdChbImRkIiwiZGRkIiwiZGRkZCJdLGZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuPWkuX2xvY2FsZS53ZWVrZGF5c1BhcnNlKHQsbyxpLl9zdHJpY3QpO251bGwhPW4/ZS5kPW46dShpKS5pbnZhbGlkV2Vla2RheT10fSksaXQoWyJkIiwiZSIsIkUiXSxmdW5jdGlvbih0LGUsaSxvKXtlW29dPV8odCl9KTt2YXIgbW49IlN1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Ii5zcGxpdCgiXyIpLHZuPSJTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQiLnNwbGl0KCJfIiksZ249IlN1X01vX1R1X1dlX1RoX0ZyX1NhIi5zcGxpdCgiXyIpLHluPVpvLGJuPVpvLF9uPVpvO1UoIkgiLFsiSEgiLDJdLDAsImhvdXIiKSxVKCJoIixbImhoIiwyXSwwLFl0KSxVKCJrIixbImtrIiwyXSwwLEd0KSxVKCJobW0iLDAsMCxmdW5jdGlvbigpe3JldHVybiIiK1l0LmFwcGx5KHRoaXMpK1YodGhpcy5taW51dGVzKCksMil9KSxVKCJobW1zcyIsMCwwLGZ1bmN0aW9uKCl7cmV0dXJuIiIrWXQuYXBwbHkodGhpcykrVih0aGlzLm1pbnV0ZXMoKSwyKStWKHRoaXMuc2Vjb25kcygpLDIpfSksVSgiSG1tIiwwLDAsZnVuY3Rpb24oKXtyZXR1cm4iIit0aGlzLmhvdXJzKCkrVih0aGlzLm1pbnV0ZXMoKSwyKX0pLFUoIkhtbXNzIiwwLDAsZnVuY3Rpb24oKXtyZXR1cm4iIit0aGlzLmhvdXJzKCkrVih0aGlzLm1pbnV0ZXMoKSwyKStWKHRoaXMuc2Vjb25kcygpLDIpfSksVnQoImEiLCEwKSxWdCgiQSIsITEpLEwoImhvdXIiLCJoIiksQigiaG91ciIsMTMpLEooImEiLFV0KSxKKCJBIixVdCksSigiSCIsQm8pLEooImgiLEJvKSxKKCJISCIsQm8sUm8pLEooImhoIixCbyxSbyksSigiaG1tIixqbyksSigiaG1tc3MiLEZvKSxKKCJIbW0iLGpvKSxKKCJIbW1zcyIsRm8pLGV0KFsiSCIsIkhIIl0sZW4pLGV0KFsiYSIsIkEiXSxmdW5jdGlvbih0LGUsaSl7aS5faXNQbT1pLl9sb2NhbGUuaXNQTSh0KSxpLl9tZXJpZGllbT10fSksZXQoWyJoIiwiaGgiXSxmdW5jdGlvbih0LGUsaSl7ZVtlbl09Xyh0KSx1KGkpLmJpZ0hvdXI9ITB9KSxldCgiaG1tIixmdW5jdGlvbih0LGUsaSl7dmFyIG89dC5sZW5ndGgtMjtlW2VuXT1fKHQuc3Vic3RyKDAsbykpLGVbb25dPV8odC5zdWJzdHIobykpLHUoaSkuYmlnSG91cj0hMH0pLGV0KCJobW1zcyIsZnVuY3Rpb24odCxlLGkpe3ZhciBvPXQubGVuZ3RoLTQsbj10Lmxlbmd0aC0yO2VbZW5dPV8odC5zdWJzdHIoMCxvKSksZVtvbl09Xyh0LnN1YnN0cihvLDIpKSxlW25uXT1fKHQuc3Vic3RyKG4pKSx1KGkpLmJpZ0hvdXI9ITB9KSxldCgiSG1tIixmdW5jdGlvbih0LGUsaSl7dmFyIG89dC5sZW5ndGgtMjtlW2VuXT1fKHQuc3Vic3RyKDAsbykpLGVbb25dPV8odC5zdWJzdHIobykpfSksZXQoIkhtbXNzIixmdW5jdGlvbih0LGUsaSl7dmFyIG89dC5sZW5ndGgtNCxuPXQubGVuZ3RoLTI7ZVtlbl09Xyh0LnN1YnN0cigwLG8pKSxlW29uXT1fKHQuc3Vic3RyKG8sMikpLGVbbm5dPV8odC5zdWJzdHIobikpfSk7dmFyIHduLHhuPS9bYXBdXC4/bT9cLj8vaSxrbj1GKCJIb3VycyIsITApLE9uPXtjYWxlbmRhcjp3byxsb25nRGF0ZUZvcm1hdDp4byxpbnZhbGlkRGF0ZTprbyxvcmRpbmFsOk9vLG9yZGluYWxQYXJzZTpEbyxyZWxhdGl2ZVRpbWU6U28sbW9udGhzOmRuLG1vbnRoc1Nob3J0OmxuLHdlZWs6Zm4sd2Vla2RheXM6bW4sd2Vla2RheXNNaW46Z24sd2Vla2RheXNTaG9ydDp2bixtZXJpZGllbVBhcnNlOnhufSxEbj17fSxTbj0vXlxzKigoPzpbKy1dXGR7Nn18XGR7NH0pLSg/OlxkXGQtXGRcZHxXXGRcZC1cZHxXXGRcZHxcZFxkXGR8XGRcZCkpKD86KFR8ICkoXGRcZCg/OjpcZFxkKD86OlxkXGQoPzpbLixdXGQrKT8pPyk/KShbXCtcLV1cZFxkKD86Oj9cZFxkKT98XHMqWik/KT8vLENuPS9eXHMqKCg/OlsrLV1cZHs2fXxcZHs0fSkoPzpcZFxkXGRcZHxXXGRcZFxkfFdcZFxkfFxkXGRcZHxcZFxkKSkoPzooVHwgKShcZFxkKD86XGRcZCg/OlxkXGQoPzpbLixdXGQrKT8pPyk/KShbXCtcLV1cZFxkKD86Oj9cZFxkKT98XHMqWik/KT8vLFRuPS9afFsrLV1cZFxkKD86Oj9cZFxkKT8vLEVuPVtbIllZWVlZWS1NTS1ERCIsL1srLV1cZHs2fS1cZFxkLVxkXGQvXSxbIllZWVktTU0tREQiLC9cZHs0fS1cZFxkLVxkXGQvXSxbIkdHR0ctW1ddV1ctRSIsL1xkezR9LVdcZFxkLVxkL10sWyJHR0dHLVtXXVdXIiwvXGR7NH0tV1xkXGQvLCExXSxbIllZWVktREREIiwvXGR7NH0tXGR7M30vXSxbIllZWVktTU0iLC9cZHs0fS1cZFxkLywhMV0sWyJZWVlZWVlNTUREIiwvWystXVxkezEwfS9dLFsiWVlZWU1NREQiLC9cZHs4fS9dLFsiR0dHR1tXXVdXRSIsL1xkezR9V1xkezN9L10sWyJHR0dHW1ddV1ciLC9cZHs0fVdcZHsyfS8sITFdLFsiWVlZWURERCIsL1xkezd9L11dLE1uPVtbIkhIOm1tOnNzLlNTU1MiLC9cZFxkOlxkXGQ6XGRcZFwuXGQrL10sWyJISDptbTpzcyxTU1NTIiwvXGRcZDpcZFxkOlxkXGQsXGQrL10sWyJISDptbTpzcyIsL1xkXGQ6XGRcZDpcZFxkL10sWyJISDptbSIsL1xkXGQ6XGRcZC9dLFsiSEhtbXNzLlNTU1MiLC9cZFxkXGRcZFxkXGRcLlxkKy9dLFsiSEhtbXNzLFNTU1MiLC9cZFxkXGRcZFxkXGQsXGQrL10sWyJISG1tc3MiLC9cZFxkXGRcZFxkXGQvXSxbIkhIbW0iLC9cZFxkXGRcZC9dLFsiSEgiLC9cZFxkL11dLFBuPS9eXC8/RGF0ZVwoKFwtP1xkKykvaTtlLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrPWsoInZhbHVlIHByb3ZpZGVkIGlzIG5vdCBpbiBhIHJlY29nbml6ZWQgSVNPIGZvcm1hdC4gbW9tZW50IGNvbnN0cnVjdGlvbiBmYWxscyBiYWNrIHRvIGpzIERhdGUoKSwgd2hpY2ggaXMgbm90IHJlbGlhYmxlIGFjcm9zcyBhbGwgYnJvd3NlcnMgYW5kIHZlcnNpb25zLiBOb24gSVNPIGRhdGUgZm9ybWF0cyBhcmUgZGlzY291cmFnZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhbiB1cGNvbWluZyBtYWpvciByZWxlYXNlLiBQbGVhc2UgcmVmZXIgdG8gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9qcy1kYXRlLyBmb3IgbW9yZSBpbmZvLiIsZnVuY3Rpb24odCl7dC5fZD1uZXcgRGF0ZSh0Ll9pKyh0Ll91c2VVVEM/IiBVVEMiOiIiKSl9KSxlLklTT184NjAxPWZ1bmN0aW9uKCl7fTt2YXIgSW49aygibW9tZW50KCkubWluIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQubWF4IGluc3RlYWQuIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvbWluLW1heC8iLGZ1bmN0aW9uKCl7dmFyIHQ9eWUuYXBwbHkobnVsbCxhcmd1bWVudHMpO3JldHVybiB0aGlzLmlzVmFsaWQoKSYmdC5pc1ZhbGlkKCk/dDx0aGlzP3RoaXM6dDpmKCl9KSxObj1rKCJtb21lbnQoKS5tYXggaXMgZGVwcmVjYXRlZCwgdXNlIG1vbWVudC5taW4gaW5zdGVhZC4gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9taW4tbWF4LyIsZnVuY3Rpb24oKXt2YXIgdD15ZS5hcHBseShudWxsLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMuaXNWYWxpZCgpJiZ0LmlzVmFsaWQoKT90PnRoaXM/dGhpczp0OmYoKX0pLFJuPWZ1bmN0aW9uKCl7cmV0dXJuIERhdGUubm93P0RhdGUubm93KCk6K25ldyBEYXRlfTtEZSgiWiIsIjoiKSxEZSgiWloiLCIiKSxKKCJaIixxbyksSigiWloiLHFvKSxldChbIloiLCJaWiJdLGZ1bmN0aW9uKHQsZSxpKXtpLl91c2VVVEM9ITAsaS5fdHptPVNlKHFvLHQpfSk7dmFyIExuPS8oW1wrXC1dfFxkXGQpL2dpO2UudXBkYXRlT2Zmc2V0PWZ1bmN0aW9uKCl7fTt2YXIgem49L14oXC0pPyg/OihcZCopWy4gXSk/KFxkKylcOihcZCspKD86XDooXGQrKShcLlxkKik/KT8kLyxBbj0vXigtKT9QKD86KC0/WzAtOSwuXSopWSk/KD86KC0/WzAtOSwuXSopTSk/KD86KC0/WzAtOSwuXSopVyk/KD86KC0/WzAtOSwuXSopRCk/KD86VCg/OigtP1swLTksLl0qKUgpPyg/OigtP1swLTksLl0qKU0pPyg/OigtP1swLTksLl0qKVMpPyk/JC87RmUuZm49eGUucHJvdG90eXBlO3ZhciBCbj1HZSgxLCJhZGQiKSxqbj1HZSgtMSwic3VidHJhY3QiKTtlLmRlZmF1bHRGb3JtYXQ9IllZWVktTU0tRERUSEg6bW06c3NaIixlLmRlZmF1bHRGb3JtYXRVdGM9IllZWVktTU0tRERUSEg6bW06c3NbWl0iO3ZhciBGbj1rKCJtb21lbnQoKS5sYW5nKCkgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlIG1vbWVudCgpLmxvY2FsZURhdGEoKSB0byBnZXQgdGhlIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24uIFVzZSBtb21lbnQoKS5sb2NhbGUoKSB0byBjaGFuZ2UgbGFuZ3VhZ2VzLiIsZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQ/dGhpcy5sb2NhbGVEYXRhKCk6dGhpcy5sb2NhbGUodCl9KTtVKDAsWyJnZyIsMl0sMCxmdW5jdGlvbigpe3JldHVybiB0aGlzLndlZWtZZWFyKCklMTAwfSksVSgwLFsiR0ciLDJdLDAsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc29XZWVrWWVhcigpJTEwMH0pLE9pKCJnZ2dnIiwid2Vla1llYXIiKSxPaSgiZ2dnZ2ciLCJ3ZWVrWWVhciIpLE9pKCJHR0dHIiwiaXNvV2Vla1llYXIiKSxPaSgiR0dHR0ciLCJpc29XZWVrWWVhciIpLEwoIndlZWtZZWFyIiwiZ2ciKSxMKCJpc29XZWVrWWVhciIsIkdHIiksQigid2Vla1llYXIiLDEpLEIoImlzb1dlZWtZZWFyIiwxKSxKKCJHIixWbyksSigiZyIsVm8pLEooIkdHIixCbyxSbyksSigiZ2ciLEJvLFJvKSxKKCJHR0dHIixXbyx6byksSigiZ2dnZyIsV28sem8pLEooIkdHR0dHIixZbyxBbyksSigiZ2dnZ2ciLFlvLEFvKSxpdChbImdnZ2ciLCJnZ2dnZyIsIkdHR0ciLCJHR0dHRyJdLGZ1bmN0aW9uKHQsZSxpLG8pe2Vbby5zdWJzdHIoMCwyKV09Xyh0KX0pLGl0KFsiZ2ciLCJHRyJdLGZ1bmN0aW9uKHQsaSxvLG4pe2lbbl09ZS5wYXJzZVR3b0RpZ2l0WWVhcih0KX0pLFUoIlEiLDAsIlFvIiwicXVhcnRlciIpLEwoInF1YXJ0ZXIiLCJRIiksQigicXVhcnRlciIsNyksSigiUSIsTm8pLGV0KCJRIixmdW5jdGlvbih0LGUpe2VbJG9dPTMqKF8odCktMSl9KSxVKCJEIixbIkREIiwyXSwiRG8iLCJkYXRlIiksTCgiZGF0ZSIsIkQiKSxCKCJkYXRlIiw5KSxKKCJEIixCbyksSigiREQiLEJvLFJvKSxKKCJEbyIsZnVuY3Rpb24odCxlKXtyZXR1cm4gdD9lLl9vcmRpbmFsUGFyc2U6ZS5fb3JkaW5hbFBhcnNlTGVuaWVudH0pLGV0KFsiRCIsIkREIl0sdG4pLGV0KCJEbyIsZnVuY3Rpb24odCxlKXtlW3RuXT1fKHQubWF0Y2goQm8pWzBdLDEwKX0pO3ZhciBIbj1GKCJEYXRlIiwhMCk7VSgiREREIixbIkREREQiLDNdLCJERERvIiwiZGF5T2ZZZWFyIiksTCgiZGF5T2ZZZWFyIiwiREREIiksQigiZGF5T2ZZZWFyIiw0KSxKKCJEREQiLEhvKSxKKCJEREREIixMbyksZXQoWyJEREQiLCJEREREIl0sZnVuY3Rpb24odCxlLGkpe2kuX2RheU9mWWVhcj1fKHQpfSksVSgibSIsWyJtbSIsMl0sMCwibWludXRlIiksTCgibWludXRlIiwibSIpLEIoIm1pbnV0ZSIsMTQpLEooIm0iLEJvKSxKKCJtbSIsQm8sUm8pLGV0KFsibSIsIm1tIl0sb24pO3ZhciBXbj1GKCJNaW51dGVzIiwhMSk7VSgicyIsWyJzcyIsMl0sMCwic2Vjb25kIiksTCgic2Vjb25kIiwicyIpLEIoInNlY29uZCIsMTUpLEooInMiLEJvKSxKKCJzcyIsQm8sUm8pLGV0KFsicyIsInNzIl0sbm4pO3ZhciBZbj1GKCJTZWNvbmRzIiwhMSk7VSgiUyIsMCwwLGZ1bmN0aW9uKCl7cmV0dXJufn4odGhpcy5taWxsaXNlY29uZCgpLzEwMCl9KSxVKDAsWyJTUyIsMl0sMCxmdW5jdGlvbigpe3JldHVybn5+KHRoaXMubWlsbGlzZWNvbmQoKS8xMCl9KSxVKDAsWyJTU1MiLDNdLDAsIm1pbGxpc2Vjb25kIiksVSgwLFsiU1NTUyIsNF0sMCxmdW5jdGlvbigpe3JldHVybiAxMCp0aGlzLm1pbGxpc2Vjb25kKCl9KSxVKDAsWyJTU1NTUyIsNV0sMCxmdW5jdGlvbigpe3JldHVybiAxMDAqdGhpcy5taWxsaXNlY29uZCgpfSksVSgwLFsiU1NTU1NTIiw2XSwwLGZ1bmN0aW9uKCl7cmV0dXJuIDFlMyp0aGlzLm1pbGxpc2Vjb25kKCl9KSxVKDAsWyJTU1NTU1NTIiw3XSwwLGZ1bmN0aW9uKCl7cmV0dXJuIDFlNCp0aGlzLm1pbGxpc2Vjb25kKCl9KSxVKDAsWyJTU1NTU1NTUyIsOF0sMCxmdW5jdGlvbigpe3JldHVybiAxZTUqdGhpcy5taWxsaXNlY29uZCgpfSksVSgwLFsiU1NTU1NTU1NTIiw5XSwwLGZ1bmN0aW9uKCl7cmV0dXJuIDFlNip0aGlzLm1pbGxpc2Vjb25kKCl9KSxMKCJtaWxsaXNlY29uZCIsIm1zIiksQigibWlsbGlzZWNvbmQiLDE2KSxKKCJTIixIbyxObyksSigiU1MiLEhvLFJvKSxKKCJTU1MiLEhvLExvKTt2YXIgR247Zm9yKEduPSJTU1NTIjtHbi5sZW5ndGg8PTk7R24rPSJTIilKKEduLEdvKTtmb3IoR249IlMiO0duLmxlbmd0aDw9OTtHbis9IlMiKWV0KEduLE5pKTt2YXIgVm49RigiTWlsbGlzZWNvbmRzIiwhMSk7VSgieiIsMCwwLCJ6b25lQWJiciIpLFUoInp6IiwwLDAsInpvbmVOYW1lIik7dmFyIFVuPWcucHJvdG90eXBlO1VuLmFkZD1CbixVbi5jYWxlbmRhcj1xZSxVbi5jbG9uZT1YZSxVbi5kaWZmPWVpLFVuLmVuZE9mPXBpLFVuLmZvcm1hdD1zaSxVbi5mcm9tPXJpLFVuLmZyb21Ob3c9YWksVW4udG89aGksVW4udG9Ob3c9ZGksVW4uZ2V0PVksVW4uaW52YWxpZEF0PXhpLFVuLmlzQWZ0ZXI9WmUsVW4uaXNCZWZvcmU9S2UsVW4uaXNCZXR3ZWVuPUplLFVuLmlzU2FtZT1RZSxVbi5pc1NhbWVPckFmdGVyPSRlLFVuLmlzU2FtZU9yQmVmb3JlPXRpLFVuLmlzVmFsaWQ9X2ksVW4ubGFuZz1GbixVbi5sb2NhbGU9bGksVW4ubG9jYWxlRGF0YT1jaSxVbi5tYXg9Tm4sVW4ubWluPUluLFVuLnBhcnNpbmdGbGFncz13aSxVbi5zZXQ9RyxVbi5zdGFydE9mPXVpLFVuLnN1YnRyYWN0PWpuLFVuLnRvQXJyYXk9Z2ksVW4udG9PYmplY3Q9eWksVW4udG9EYXRlPXZpLFVuLnRvSVNPU3RyaW5nPW5pLFVuLnRvSlNPTj1iaSxVbi50b1N0cmluZz1vaSxVbi51bml4PW1pLFVuLnZhbHVlT2Y9ZmksVW4uY3JlYXRpb25EYXRhPWtpLFVuLnllYXI9cG4sVW4uaXNMZWFwWWVhcj1ndCxVbi53ZWVrWWVhcj1EaSxVbi5pc29XZWVrWWVhcj1TaSxVbi5xdWFydGVyPVVuLnF1YXJ0ZXJzPVBpLFVuLm1vbnRoPWx0LFVuLmRheXNJbk1vbnRoPWN0LFVuLndlZWs9VW4ud2Vla3M9Q3QsVW4uaXNvV2Vlaz1Vbi5pc29XZWVrcz1UdCxVbi53ZWVrc0luWWVhcj1UaSxVbi5pc29XZWVrc0luWWVhcj1DaSxVbi5kYXRlPUhuLFVuLmRheT1Vbi5kYXlzPXp0LFVuLndlZWtkYXk9QXQsVW4uaXNvV2Vla2RheT1CdCxVbi5kYXlPZlllYXI9SWksVW4uaG91cj1Vbi5ob3Vycz1rbixVbi5taW51dGU9VW4ubWludXRlcz1XbixVbi5zZWNvbmQ9VW4uc2Vjb25kcz1ZbixVbi5taWxsaXNlY29uZD1Vbi5taWxsaXNlY29uZHM9Vm4sVW4udXRjT2Zmc2V0PUVlLFVuLnV0Yz1QZSxVbi5sb2NhbD1JZSxVbi5wYXJzZVpvbmU9TmUsVW4uaGFzQWxpZ25lZEhvdXJPZmZzZXQ9UmUsVW4uaXNEU1Q9TGUsVW4uaXNMb2NhbD1BZSxVbi5pc1V0Y09mZnNldD1CZSxVbi5pc1V0Yz1qZSxVbi5pc1VUQz1qZSxVbi56b25lQWJicj1SaSxVbi56b25lTmFtZT1MaSxVbi5kYXRlcz1rKCJkYXRlcyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgZGF0ZSBpbnN0ZWFkLiIsSG4pLFVuLm1vbnRocz1rKCJtb250aHMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbnRoIGluc3RlYWQiLGx0KSxVbi55ZWFycz1rKCJ5ZWFycyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgeWVhciBpbnN0ZWFkIixwbiksVW4uem9uZT1rKCJtb21lbnQoKS56b25lIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQoKS51dGNPZmZzZXQgaW5zdGVhZC4gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy96b25lLyIsTWUpLFVuLmlzRFNUU2hpZnRlZD1rKCJpc0RTVFNoaWZ0ZWQgaXMgZGVwcmVjYXRlZC4gU2VlIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvZHN0LXNoaWZ0ZWQvIGZvciBtb3JlIGluZm9ybWF0aW9uIix6ZSk7dmFyIHFuPVVuLFhuPVQucHJvdG90eXBlO1huLmNhbGVuZGFyPUUsWG4ubG9uZ0RhdGVGb3JtYXQ9TSxYbi5pbnZhbGlkRGF0ZT1QLFhuLm9yZGluYWw9SSxYbi5wcmVwYXJzZT1CaSxYbi5wb3N0Zm9ybWF0PUJpLFhuLnJlbGF0aXZlVGltZT1OLFhuLnBhc3RGdXR1cmU9UixYbi5zZXQ9UyxYbi5tb250aHM9c3QsWG4ubW9udGhzU2hvcnQ9cnQsWG4ubW9udGhzUGFyc2U9aHQsWG4ubW9udGhzUmVnZXg9cHQsWG4ubW9udGhzU2hvcnRSZWdleD11dCxYbi53ZWVrPU90LFhuLmZpcnN0RGF5T2ZZZWFyPVN0LFhuLmZpcnN0RGF5T2ZXZWVrPUR0LFhuLndlZWtkYXlzPVB0LFhuLndlZWtkYXlzTWluPU50LFhuLndlZWtkYXlzU2hvcnQ9SXQsWG4ud2Vla2RheXNQYXJzZT1MdCxYbi53ZWVrZGF5c1JlZ2V4PWp0LFhuLndlZWtkYXlzU2hvcnRSZWdleD1GdCxYbi53ZWVrZGF5c01pblJlZ2V4PUh0LFhuLmlzUE09cXQsWG4ubWVyaWRpZW09WHQsUXQoImVuIix7b3JkaW5hbFBhcnNlOi9cZHsxLDJ9KHRofHN0fG5kfHJkKS8sb3JkaW5hbDpmdW5jdGlvbih0KXt2YXIgZT10JTEwLGk9MT09PV8odCUxMDAvMTApPyJ0aCI6MT09PWU/InN0IjoyPT09ZT8ibmQiOjM9PT1lPyJyZCI6InRoIjtyZXR1cm4gdCtpfX0pLGUubGFuZz1rKCJtb21lbnQubGFuZyBpcyBkZXByZWNhdGVkLiBVc2UgbW9tZW50LmxvY2FsZSBpbnN0ZWFkLiIsUXQpLGUubGFuZ0RhdGE9aygibW9tZW50LmxhbmdEYXRhIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb21lbnQubG9jYWxlRGF0YSBpbnN0ZWFkLiIsZWUpO3ZhciBabj1NYXRoLmFicyxLbj1vbygibXMiKSxKbj1vbygicyIpLFFuPW9vKCJtIiksJG49b28oImgiKSx0cz1vbygiZCIpLGVzPW9vKCJ3IiksaXM9b28oIk0iKSxvcz1vbygieSIpLG5zPXNvKCJtaWxsaXNlY29uZHMiKSxzcz1zbygic2Vjb25kcyIpLHJzPXNvKCJtaW51dGVzIiksYXM9c28oImhvdXJzIiksaHM9c28oImRheXMiKSxkcz1zbygibW9udGhzIiksbHM9c28oInllYXJzIiksY3M9TWF0aC5yb3VuZCx1cz17czo0NSxtOjQ1LGg6MjIsZDoyNixNOjExfSxwcz1NYXRoLmFicyxmcz14ZS5wcm90b3R5cGU7ZnMuYWJzPXFpLGZzLmFkZD1aaSxmcy5zdWJ0cmFjdD1LaSxmcy5hcz1lbyxmcy5hc01pbGxpc2Vjb25kcz1Lbixmcy5hc1NlY29uZHM9Sm4sZnMuYXNNaW51dGVzPVFuLGZzLmFzSG91cnM9JG4sZnMuYXNEYXlzPXRzLGZzLmFzV2Vla3M9ZXMsZnMuYXNNb250aHM9aXMsZnMuYXNZZWFycz1vcyxmcy52YWx1ZU9mPWlvLGZzLl9idWJibGU9UWksZnMuZ2V0PW5vLGZzLm1pbGxpc2Vjb25kcz1ucyxmcy5zZWNvbmRzPXNzLGZzLm1pbnV0ZXM9cnMsZnMuaG91cnM9YXMsZnMuZGF5cz1ocyxmcy53ZWVrcz1ybyxmcy5tb250aHM9ZHMsZnMueWVhcnM9bHMsZnMuaHVtYW5pemU9dW8sZnMudG9JU09TdHJpbmc9cG8sZnMudG9TdHJpbmc9cG8sZnMudG9KU09OPXBvLGZzLmxvY2FsZT1saSxmcy5sb2NhbGVEYXRhPWNpLGZzLnRvSXNvU3RyaW5nPWsoInRvSXNvU3RyaW5nKCkgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0b0lTT1N0cmluZygpIGluc3RlYWQgKG5vdGljZSB0aGUgY2FwaXRhbHMpIixwbyksZnMubGFuZz1GbixVKCJYIiwwLDAsInVuaXgiKSxVKCJ4IiwwLDAsInZhbHVlT2YiKSxKKCJ4IixWbyksSigiWCIsWG8pLGV0KCJYIixmdW5jdGlvbih0LGUsaSl7aS5fZD1uZXcgRGF0ZSgxZTMqcGFyc2VGbG9hdCh0LDEwKSl9KSxldCgieCIsZnVuY3Rpb24odCxlLGkpe2kuX2Q9bmV3IERhdGUoXyh0KSl9KSxlLnZlcnNpb249IjIuMTUuMiIsaSh5ZSksZS5mbj1xbixlLm1pbj1fZSxlLm1heD13ZSxlLm5vdz1SbixlLnV0Yz1sLGUudW5peD16aSxlLm1vbnRocz1XaSxlLmlzRGF0ZT1yLGUubG9jYWxlPVF0LGUuaW52YWxpZD1mLGUuZHVyYXRpb249RmUsZS5pc01vbWVudD15LGUud2Vla2RheXM9R2ksZS5wYXJzZVpvbmU9QWksZS5sb2NhbGVEYXRhPWVlLGUuaXNEdXJhdGlvbj1rZSxlLm1vbnRoc1Nob3J0PVlpLGUud2Vla2RheXNNaW49VWksZS5kZWZpbmVMb2NhbGU9JHQsZS51cGRhdGVMb2NhbGU9dGUsZS5sb2NhbGVzPWllLGUud2Vla2RheXNTaG9ydD1WaSxlLm5vcm1hbGl6ZVVuaXRzPXosZS5yZWxhdGl2ZVRpbWVSb3VuZGluZz1sbyxlLnJlbGF0aXZlVGltZVRocmVzaG9sZD1jbyxlLmNhbGVuZGFyRm9ybWF0PVVlLGUucHJvdG90eXBlPXFuO3ZhciBtcz1lO3JldHVybiBtc30pfSkuY2FsbChlLGkoNCkodCkpfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdC53ZWJwYWNrUG9seWZpbGx8fCh0LmRlcHJlY2F0ZT1mdW5jdGlvbigpe30sdC5wYXRocz1bXSx0LmNoaWxkcmVuPVtdLHQud2VicGFja1BvbHlmaWxsPTEpLHR9fSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkodCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrdCsiJy4iKX1pLmtleXM9ZnVuY3Rpb24oKXtyZXR1cm5bXX0saS5yZXNvbHZlPWksdC5leHBvcnRzPWksaS5pZD01fSxmdW5jdGlvbih0LGUpeyhmdW5jdGlvbihlKXtmdW5jdGlvbiBpKHQsZSxpKXt2YXIgbz1lJiZpfHwwLG49MDtmb3IoZT1lfHxbXSx0LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWzAtOWEtZl17Mn0vZyxmdW5jdGlvbih0KXtuPDE2JiYoZVtvK24rK109Y1t0XSl9KTtuPDE2OyllW28rbisrXT0wO3JldHVybiBlfWZ1bmN0aW9uIG8odCxlKXt2YXIgaT1lfHwwLG89bDtyZXR1cm4gb1t0W2krK11dK29bdFtpKytdXStvW3RbaSsrXV0rb1t0W2krK11dKyItIitvW3RbaSsrXV0rb1t0W2krK11dKyItIitvW3RbaSsrXV0rb1t0W2krK11dKyItIitvW3RbaSsrXV0rb1t0W2krK11dKyItIitvW3RbaSsrXV0rb1t0W2krK11dK29bdFtpKytdXStvW3RbaSsrXV0rb1t0W2krK11dK29bdFtpKytdXX1mdW5jdGlvbiBuKHQsZSxpKXt2YXIgbj1lJiZpfHwwLHM9ZXx8W107dD10fHx7fTt2YXIgcj12b2lkIDAhPT10LmNsb2Nrc2VxP3QuY2xvY2tzZXE6bSxhPXZvaWQgMCE9PXQubXNlY3M/dC5tc2VjczoobmV3IERhdGUpLmdldFRpbWUoKSxoPXZvaWQgMCE9PXQubnNlY3M/dC5uc2VjczpnKzEsZD1hLXYrKGgtZykvMWU0O2lmKGQ8MCYmdm9pZCAwPT09dC5jbG9ja3NlcSYmKHI9cisxJjE2MzgzKSwoZDwwfHxhPnYpJiZ2b2lkIDA9PT10Lm5zZWNzJiYoaD0wKSxoPj0xZTQpdGhyb3cgbmV3IEVycm9yKCJ1dWlkLnYxKCk6IENhbid0IGNyZWF0ZSBtb3JlIHRoYW4gMTBNIHV1aWRzL3NlYyIpO3Y9YSxnPWgsbT1yLGErPTEyMjE5MjkyOGU1O3ZhciBsPSgxZTQqKDI2ODQzNTQ1NSZhKStoKSU0Mjk0OTY3Mjk2O3NbbisrXT1sPj4+MjQmMjU1LHNbbisrXT1sPj4+MTYmMjU1LHNbbisrXT1sPj4+OCYyNTUsc1tuKytdPTI1NSZsO3ZhciBjPWEvNDI5NDk2NzI5NioxZTQmMjY4NDM1NDU1O3NbbisrXT1jPj4+OCYyNTUsc1tuKytdPTI1NSZjLHNbbisrXT1jPj4+MjQmMTV8MTYsc1tuKytdPWM+Pj4xNiYyNTUsc1tuKytdPXI+Pj44fDEyOCxzW24rK109MjU1JnI7Zm9yKHZhciB1PXQubm9kZXx8ZixwPTA7cDw2O3ArKylzW24rcF09dVtwXTtyZXR1cm4gZT9lOm8ocyl9ZnVuY3Rpb24gcyh0LGUsaSl7dmFyIG49ZSYmaXx8MDsic3RyaW5nIj09dHlwZW9mIHQmJihlPSJiaW5hcnkiPT10P25ldyBBcnJheSgxNik6bnVsbCwKdD1udWxsKSx0PXR8fHt9O3ZhciBzPXQucmFuZG9tfHwodC5ybmd8fHIpKCk7aWYoc1s2XT0xNSZzWzZdfDY0LHNbOF09NjMmc1s4XXwxMjgsZSlmb3IodmFyIGE9MDthPDE2O2ErKyllW24rYV09c1thXTtyZXR1cm4gZXx8byhzKX12YXIgcixhPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGU/ZTpudWxsO2lmKGEmJmEuY3J5cHRvJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKXt2YXIgaD1uZXcgVWludDhBcnJheSgxNik7cj1mdW5jdGlvbigpe3JldHVybiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGgpLGh9fWlmKCFyKXt2YXIgZD1uZXcgQXJyYXkoMTYpO3I9ZnVuY3Rpb24oKXtmb3IodmFyIHQsZT0wO2U8MTY7ZSsrKTA9PT0oMyZlKSYmKHQ9NDI5NDk2NzI5NipNYXRoLnJhbmRvbSgpKSxkW2VdPXQ+Pj4oKDMmZSk8PDMpJjI1NTtyZXR1cm4gZH19Zm9yKHZhciBsPVtdLGM9e30sdT0wO3U8MjU2O3UrKylsW3VdPSh1KzI1NikudG9TdHJpbmcoMTYpLnN1YnN0cigxKSxjW2xbdV1dPXU7dmFyIHA9cigpLGY9WzF8cFswXSxwWzFdLHBbMl0scFszXSxwWzRdLHBbNV1dLG09MTYzODMmKHBbNl08PDh8cFs3XSksdj0wLGc9MCx5PXM7eS52MT1uLHkudjQ9cyx5LnBhcnNlPWkseS51bnBhcnNlPW8sdC5leHBvcnRzPXl9KS5jYWxsKGUsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKSl9LGZ1bmN0aW9uKHQsZSxpKXtlLnV0aWw9aSgxKSxlLkRPTXV0aWw9aSg4KSxlLkRhdGFTZXQ9aSg5KSxlLkRhdGFWaWV3PWkoMTEpLGUuUXVldWU9aSgxMCksZS5HcmFwaDNkPWkoMTIpLGUuZ3JhcGgzZD17Q2FtZXJhOmkoMTYpLEZpbHRlcjppKDE3KSxQb2ludDJkOmkoMTUpLFBvaW50M2Q6aSgxNCksU2xpZGVyOmkoMTgpLFN0ZXBOdW1iZXI6aSgxOSl9LGUubW9tZW50PWkoMiksZS5IYW1tZXI9aSgyMiksZS5rZXljaGFybT1pKDI1KX0sZnVuY3Rpb24odCxlKXtlLnByZXBhcmVFbGVtZW50cz1mdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdCl0Lmhhc093blByb3BlcnR5KGUpJiYodFtlXS5yZWR1bmRhbnQ9dFtlXS51c2VkLHRbZV0udXNlZD1bXSl9LGUuY2xlYW51cEVsZW1lbnRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoZSkmJnRbZV0ucmVkdW5kYW50KXtmb3IodmFyIGk9MDtpPHRbZV0ucmVkdW5kYW50Lmxlbmd0aDtpKyspdFtlXS5yZWR1bmRhbnRbaV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0W2VdLnJlZHVuZGFudFtpXSk7dFtlXS5yZWR1bmRhbnQ9W119fSxlLnJlc2V0RWxlbWVudHM9ZnVuY3Rpb24odCl7ZS5wcmVwYXJlRWxlbWVudHModCksZS5jbGVhbnVwRWxlbWVudHModCksZS5wcmVwYXJlRWxlbWVudHModCl9LGUuZ2V0U1ZHRWxlbWVudD1mdW5jdGlvbih0LGUsaSl7dmFyIG87cmV0dXJuIGUuaGFzT3duUHJvcGVydHkodCk/ZVt0XS5yZWR1bmRhbnQubGVuZ3RoPjA/KG89ZVt0XS5yZWR1bmRhbnRbMF0sZVt0XS5yZWR1bmRhbnQuc2hpZnQoKSk6KG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdCksaS5hcHBlbmRDaGlsZChvKSk6KG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdCksZVt0XT17dXNlZDpbXSxyZWR1bmRhbnQ6W119LGkuYXBwZW5kQ2hpbGQobykpLGVbdF0udXNlZC5wdXNoKG8pLG99LGUuZ2V0RE9NRWxlbWVudD1mdW5jdGlvbih0LGUsaSxvKXt2YXIgbjtyZXR1cm4gZS5oYXNPd25Qcm9wZXJ0eSh0KT9lW3RdLnJlZHVuZGFudC5sZW5ndGg+MD8obj1lW3RdLnJlZHVuZGFudFswXSxlW3RdLnJlZHVuZGFudC5zaGlmdCgpKToobj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHQpLHZvaWQgMCE9PW8/aS5pbnNlcnRCZWZvcmUobixvKTppLmFwcGVuZENoaWxkKG4pKToobj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHQpLGVbdF09e3VzZWQ6W10scmVkdW5kYW50OltdfSx2b2lkIDAhPT1vP2kuaW5zZXJ0QmVmb3JlKG4sbyk6aS5hcHBlbmRDaGlsZChuKSksZVt0XS51c2VkLnB1c2gobiksbn0sZS5kcmF3UG9pbnQ9ZnVuY3Rpb24odCxpLG8sbixzLHIpe3ZhciBhO2lmKCJjaXJjbGUiPT1vLnN0eWxlPyhhPWUuZ2V0U1ZHRWxlbWVudCgiY2lyY2xlIixuLHMpLGEuc2V0QXR0cmlidXRlTlMobnVsbCwiY3giLHQpLGEuc2V0QXR0cmlidXRlTlMobnVsbCwiY3kiLGkpLGEuc2V0QXR0cmlidXRlTlMobnVsbCwiciIsLjUqby5zaXplKSk6KGE9ZS5nZXRTVkdFbGVtZW50KCJyZWN0IixuLHMpLGEuc2V0QXR0cmlidXRlTlMobnVsbCwieCIsdC0uNSpvLnNpemUpLGEuc2V0QXR0cmlidXRlTlMobnVsbCwieSIsaS0uNSpvLnNpemUpLGEuc2V0QXR0cmlidXRlTlMobnVsbCwid2lkdGgiLG8uc2l6ZSksYS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJoZWlnaHQiLG8uc2l6ZSkpLHZvaWQgMCE9PW8uc3R5bGVzJiZhLnNldEF0dHJpYnV0ZU5TKG51bGwsInN0eWxlIixvLnN0eWxlcyksYS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJjbGFzcyIsby5jbGFzc05hbWUrIiB2aXMtcG9pbnQiKSxyKXt2YXIgaD1lLmdldFNWR0VsZW1lbnQoInRleHQiLG4scyk7ci54T2Zmc2V0JiYodCs9ci54T2Zmc2V0KSxyLnlPZmZzZXQmJihpKz1yLnlPZmZzZXQpLHIuY29udGVudCYmKGgudGV4dENvbnRlbnQ9ci5jb250ZW50KSxyLmNsYXNzTmFtZSYmaC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJjbGFzcyIsci5jbGFzc05hbWUrIiB2aXMtbGFiZWwiKSxoLnNldEF0dHJpYnV0ZU5TKG51bGwsIngiLHQpLGguc2V0QXR0cmlidXRlTlMobnVsbCwieSIsaSl9cmV0dXJuIGF9LGUuZHJhd0Jhcj1mdW5jdGlvbih0LGksbyxuLHMscixhLGgpe2lmKDAhPW4pe248MCYmKG4qPS0xLGktPW4pO3ZhciBkPWUuZ2V0U1ZHRWxlbWVudCgicmVjdCIscixhKTtkLnNldEF0dHJpYnV0ZU5TKG51bGwsIngiLHQtLjUqbyksZC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ5IixpKSxkLnNldEF0dHJpYnV0ZU5TKG51bGwsIndpZHRoIixvKSxkLnNldEF0dHJpYnV0ZU5TKG51bGwsImhlaWdodCIsbiksZC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJjbGFzcyIscyksaCYmZC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJzdHlsZSIsaCl9fX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlKXtpZih0JiYhQXJyYXkuaXNBcnJheSh0KSYmKGU9dCx0PW51bGwpLHRoaXMuX29wdGlvbnM9ZXx8e30sdGhpcy5fZGF0YT17fSx0aGlzLmxlbmd0aD0wLHRoaXMuX2ZpZWxkSWQ9dGhpcy5fb3B0aW9ucy5maWVsZElkfHwiaWQiLHRoaXMuX3R5cGU9e30sdGhpcy5fb3B0aW9ucy50eXBlKWZvcih2YXIgaT1PYmplY3Qua2V5cyh0aGlzLl9vcHRpb25zLnR5cGUpLG89MCxuPWkubGVuZ3RoO288bjtvKyspe3ZhciBzPWlbb10scj10aGlzLl9vcHRpb25zLnR5cGVbc107IkRhdGUiPT1yfHwiSVNPRGF0ZSI9PXJ8fCJBU1BEYXRlIj09cj90aGlzLl90eXBlW3NdPSJEYXRlIjp0aGlzLl90eXBlW3NdPXJ9aWYodGhpcy5fb3B0aW9ucy5jb252ZXJ0KXRocm93IG5ldyBFcnJvcignT3B0aW9uICJjb252ZXJ0IiBpcyBkZXByZWNhdGVkLiBVc2UgInR5cGUiIGluc3RlYWQuJyk7dGhpcy5fc3Vic2NyaWJlcnM9e30sdCYmdGhpcy5hZGQodCksdGhpcy5zZXRPcHRpb25zKGUpfXZhciBuPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSxzPWkoMSkscj1pKDEwKTtvLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe3QmJnZvaWQgMCE9PXQucXVldWUmJih0LnF1ZXVlPT09ITE/dGhpcy5fcXVldWUmJih0aGlzLl9xdWV1ZS5kZXN0cm95KCksZGVsZXRlIHRoaXMuX3F1ZXVlKToodGhpcy5fcXVldWV8fCh0aGlzLl9xdWV1ZT1yLmV4dGVuZCh0aGlzLHtyZXBsYWNlOlsiYWRkIiwidXBkYXRlIiwicmVtb3ZlIl19KSksIm9iamVjdCI9PT1uKHQucXVldWUpJiZ0aGlzLl9xdWV1ZS5zZXRPcHRpb25zKHQucXVldWUpKSl9LG8ucHJvdG90eXBlLm9uPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fc3Vic2NyaWJlcnNbdF07aXx8KGk9W10sdGhpcy5fc3Vic2NyaWJlcnNbdF09aSksaS5wdXNoKHtjYWxsYmFjazplfSl9LG8ucHJvdG90eXBlLnN1YnNjcmliZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiRGF0YVNldC5zdWJzY3JpYmUgaXMgZGVwcmVjYXRlZC4gVXNlIERhdGFTZXQub24gaW5zdGVhZC4iKX0sby5wcm90b3R5cGUub2ZmPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fc3Vic2NyaWJlcnNbdF07aSYmKHRoaXMuX3N1YnNjcmliZXJzW3RdPWkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNhbGxiYWNrIT1lfSkpfSxvLnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiRGF0YVNldC51bnN1YnNjcmliZSBpcyBkZXByZWNhdGVkLiBVc2UgRGF0YVNldC5vZmYgaW5zdGVhZC4iKX0sby5wcm90b3R5cGUuX3RyaWdnZXI9ZnVuY3Rpb24odCxlLGkpe2lmKCIqIj09dCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCB0cmlnZ2VyIGV2ZW50ICoiKTt2YXIgbz1bXTt0IGluIHRoaXMuX3N1YnNjcmliZXJzJiYobz1vLmNvbmNhdCh0aGlzLl9zdWJzY3JpYmVyc1t0XSkpLCIqImluIHRoaXMuX3N1YnNjcmliZXJzJiYobz1vLmNvbmNhdCh0aGlzLl9zdWJzY3JpYmVyc1siKiJdKSk7Zm9yKHZhciBuPTAscz1vLmxlbmd0aDtuPHM7bisrKXt2YXIgcj1vW25dO3IuY2FsbGJhY2smJnIuY2FsbGJhY2sodCxlLGl8fG51bGwpfX0sby5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQsZSl7dmFyIGksbz1bXSxuPXRoaXM7aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IodmFyIHM9MCxyPXQubGVuZ3RoO3M8cjtzKyspaT1uLl9hZGRJdGVtKHRbc10pLG8ucHVzaChpKTtlbHNle2lmKCEodCBpbnN0YW5jZW9mIE9iamVjdCkpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGRhdGFUeXBlIik7aT1uLl9hZGRJdGVtKHQpLG8ucHVzaChpKX1yZXR1cm4gby5sZW5ndGgmJnRoaXMuX3RyaWdnZXIoImFkZCIse2l0ZW1zOm99LGUpLG99LG8ucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0LGUpe3ZhciBpPVtdLG89W10sbj1bXSxyPVtdLGE9dGhpcyxoPWEuX2ZpZWxkSWQsZD1mdW5jdGlvbih0KXt2YXIgZT10W2hdO2lmKGEuX2RhdGFbZV0pe3ZhciBkPXMuZXh0ZW5kKHt9LGEuX2RhdGFbZV0pO2U9YS5fdXBkYXRlSXRlbSh0KSxvLnB1c2goZSksci5wdXNoKHQpLG4ucHVzaChkKX1lbHNlIGU9YS5fYWRkSXRlbSh0KSxpLnB1c2goZSl9O2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKHZhciBsPTAsYz10Lmxlbmd0aDtsPGM7bCsrKXRbbF1pbnN0YW5jZW9mIE9iamVjdD9kKHRbbF0pOmNvbnNvbGUud2FybigiSWdub3JpbmcgaW5wdXQgaXRlbSwgd2hpY2ggaXMgbm90IGFuIG9iamVjdCBhdCBpbmRleCAiK2wpO2Vsc2V7aWYoISh0IGluc3RhbmNlb2YgT2JqZWN0KSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gZGF0YVR5cGUiKTtkKHQpfWlmKGkubGVuZ3RoJiZ0aGlzLl90cmlnZ2VyKCJhZGQiLHtpdGVtczppfSxlKSxvLmxlbmd0aCl7dmFyIHU9e2l0ZW1zOm8sb2xkRGF0YTpuLGRhdGE6cn07dGhpcy5fdHJpZ2dlcigidXBkYXRlIix1LGUpfXJldHVybiBpLmNvbmNhdChvKX0sby5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlLGksbyxuPXRoaXMscj1zLmdldFR5cGUoYXJndW1lbnRzWzBdKTsiU3RyaW5nIj09cnx8Ik51bWJlciI9PXI/KGU9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdKToiQXJyYXkiPT1yPyhpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSk6bz1hcmd1bWVudHNbMF07dmFyIGE7aWYobyYmby5yZXR1cm5UeXBlKXt2YXIgaD1bIkFycmF5IiwiT2JqZWN0Il07YT1oLmluZGV4T2Yoby5yZXR1cm5UeXBlKT09LTE/IkFycmF5IjpvLnJldHVyblR5cGV9ZWxzZSBhPSJBcnJheSI7dmFyIGQsbCxjLHUscCxmPW8mJm8udHlwZXx8dGhpcy5fb3B0aW9ucy50eXBlLG09byYmby5maWx0ZXIsdj1bXTtpZih2b2lkIDAhPWUpZD1uLl9nZXRJdGVtKGUsZiksZCYmbSYmIW0oZCkmJihkPW51bGwpO2Vsc2UgaWYodm9pZCAwIT1pKWZvcih1PTAscD1pLmxlbmd0aDt1PHA7dSsrKWQ9bi5fZ2V0SXRlbShpW3VdLGYpLG0mJiFtKGQpfHx2LnB1c2goZCk7ZWxzZSBmb3IobD1PYmplY3Qua2V5cyh0aGlzLl9kYXRhKSx1PTAscD1sLmxlbmd0aDt1PHA7dSsrKWM9bFt1XSxkPW4uX2dldEl0ZW0oYyxmKSxtJiYhbShkKXx8di5wdXNoKGQpO2lmKG8mJm8ub3JkZXImJnZvaWQgMD09ZSYmdGhpcy5fc29ydCh2LG8ub3JkZXIpLG8mJm8uZmllbGRzKXt2YXIgZz1vLmZpZWxkcztpZih2b2lkIDAhPWUpZD10aGlzLl9maWx0ZXJGaWVsZHMoZCxnKTtlbHNlIGZvcih1PTAscD12Lmxlbmd0aDt1PHA7dSsrKXZbdV09dGhpcy5fZmlsdGVyRmllbGRzKHZbdV0sZyl9aWYoIk9iamVjdCI9PWEpe3ZhciB5LGI9e307Zm9yKHU9MCxwPXYubGVuZ3RoO3U8cDt1KyspeT12W3VdLGJbeS5pZF09eTtyZXR1cm4gYn1yZXR1cm4gdm9pZCAwIT1lP2Q6dn0sby5wcm90b3R5cGUuZ2V0SWRzPWZ1bmN0aW9uKHQpe3ZhciBlLGksbyxuLHMscj10aGlzLl9kYXRhLGE9dCYmdC5maWx0ZXIsaD10JiZ0Lm9yZGVyLGQ9dCYmdC50eXBlfHx0aGlzLl9vcHRpb25zLnR5cGUsbD1PYmplY3Qua2V5cyhyKSxjPVtdO2lmKGEpaWYoaCl7Zm9yKHM9W10sZT0wLGk9bC5sZW5ndGg7ZTxpO2UrKylvPWxbZV0sbj10aGlzLl9nZXRJdGVtKG8sZCksYShuKSYmcy5wdXNoKG4pO2Zvcih0aGlzLl9zb3J0KHMsaCksZT0wLGk9cy5sZW5ndGg7ZTxpO2UrKyljLnB1c2goc1tlXVt0aGlzLl9maWVsZElkXSl9ZWxzZSBmb3IoZT0wLGk9bC5sZW5ndGg7ZTxpO2UrKylvPWxbZV0sbj10aGlzLl9nZXRJdGVtKG8sZCksYShuKSYmYy5wdXNoKG5bdGhpcy5fZmllbGRJZF0pO2Vsc2UgaWYoaCl7Zm9yKHM9W10sZT0wLGk9bC5sZW5ndGg7ZTxpO2UrKylvPWxbZV0scy5wdXNoKHJbb10pO2Zvcih0aGlzLl9zb3J0KHMsaCksZT0wLGk9cy5sZW5ndGg7ZTxpO2UrKyljLnB1c2goc1tlXVt0aGlzLl9maWVsZElkXSl9ZWxzZSBmb3IoZT0wLGk9bC5sZW5ndGg7ZTxpO2UrKylvPWxbZV0sbj1yW29dLGMucHVzaChuW3RoaXMuX2ZpZWxkSWRdKTtyZXR1cm4gY30sby5wcm90b3R5cGUuZ2V0RGF0YVNldD1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxvLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQsZSl7dmFyIGksbyxuLHMscj1lJiZlLmZpbHRlcixhPWUmJmUudHlwZXx8dGhpcy5fb3B0aW9ucy50eXBlLGg9dGhpcy5fZGF0YSxkPU9iamVjdC5rZXlzKGgpO2lmKGUmJmUub3JkZXIpe3ZhciBsPXRoaXMuZ2V0KGUpO2ZvcihpPTAsbz1sLmxlbmd0aDtpPG87aSsrKW49bFtpXSxzPW5bdGhpcy5fZmllbGRJZF0sdChuLHMpfWVsc2UgZm9yKGk9MCxvPWQubGVuZ3RoO2k8bztpKyspcz1kW2ldLG49dGhpcy5fZ2V0SXRlbShzLGEpLHImJiFyKG4pfHx0KG4scyl9LG8ucHJvdG90eXBlLm1hcD1mdW5jdGlvbih0LGUpe3ZhciBpLG8sbixzLHI9ZSYmZS5maWx0ZXIsYT1lJiZlLnR5cGV8fHRoaXMuX29wdGlvbnMudHlwZSxoPVtdLGQ9dGhpcy5fZGF0YSxsPU9iamVjdC5rZXlzKGQpO2ZvcihpPTAsbz1sLmxlbmd0aDtpPG87aSsrKW49bFtpXSxzPXRoaXMuX2dldEl0ZW0obixhKSxyJiYhcihzKXx8aC5wdXNoKHQocyxuKSk7cmV0dXJuIGUmJmUub3JkZXImJnRoaXMuX3NvcnQoaCxlLm9yZGVyKSxofSxvLnByb3RvdHlwZS5fZmlsdGVyRmllbGRzPWZ1bmN0aW9uKHQsZSl7aWYoIXQpcmV0dXJuIHQ7dmFyIGksbyxuPXt9LHM9T2JqZWN0LmtleXModCkscj1zLmxlbmd0aDtpZihBcnJheS5pc0FycmF5KGUpKWZvcihpPTA7aTxyO2krKylvPXNbaV0sZS5pbmRleE9mKG8pIT0tMSYmKG5bb109dFtvXSk7ZWxzZSBmb3IoaT0wO2k8cjtpKyspbz1zW2ldLGUuaGFzT3duUHJvcGVydHkobykmJihuW2Vbb11dPXRbb10pO3JldHVybiBufSxvLnByb3RvdHlwZS5fc29ydD1mdW5jdGlvbih0LGUpe2lmKHMuaXNTdHJpbmcoZSkpe3ZhciBpPWU7dC5zb3J0KGZ1bmN0aW9uKHQsZSl7dmFyIG89dFtpXSxuPWVbaV07cmV0dXJuIG8+bj8xOm88bj8tMTowfSl9ZWxzZXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJPcmRlciBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgYSBzdHJpbmciKTt0LnNvcnQoZSl9fSxvLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCxlKXt2YXIgaSxvLG4scyxyPVtdLGE9W10saD1bXTtmb3IoaD1BcnJheS5pc0FycmF5KHQpP3Q6W3RdLGk9MCxvPWgubGVuZ3RoO2k8bztpKyspcz10aGlzLl9yZW1vdmUoaFtpXSkscyYmKG49c1t0aGlzLl9maWVsZElkXSxuJiYoci5wdXNoKG4pLGEucHVzaChzKSkpO3JldHVybiByLmxlbmd0aCYmdGhpcy5fdHJpZ2dlcigicmVtb3ZlIix7aXRlbXM6cixvbGREYXRhOmF9LGUpLHJ9LG8ucHJvdG90eXBlLl9yZW1vdmU9ZnVuY3Rpb24odCl7dmFyIGUsaTtyZXR1cm4gcy5pc051bWJlcih0KXx8cy5pc1N0cmluZyh0KT9pPXQ6dCBpbnN0YW5jZW9mIE9iamVjdCYmKGk9dFt0aGlzLl9maWVsZElkXSksdm9pZCAwIT09aSYmdGhpcy5fZGF0YVtpXT8oZT10aGlzLl9kYXRhW2ldLGRlbGV0ZSB0aGlzLl9kYXRhW2ldLHRoaXMubGVuZ3RoLS0sZSk6bnVsbH0sby5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24odCl7dmFyIGUsaSxvPU9iamVjdC5rZXlzKHRoaXMuX2RhdGEpLG49W107Zm9yKGU9MCxpPW8ubGVuZ3RoO2U8aTtlKyspbi5wdXNoKHRoaXMuX2RhdGFbb1tlXV0pO3JldHVybiB0aGlzLl9kYXRhPXt9LHRoaXMubGVuZ3RoPTAsdGhpcy5fdHJpZ2dlcigicmVtb3ZlIix7aXRlbXM6byxvbGREYXRhOm59LHQpLG99LG8ucHJvdG90eXBlLm1heD1mdW5jdGlvbih0KXt2YXIgZSxpLG89dGhpcy5fZGF0YSxuPU9iamVjdC5rZXlzKG8pLHM9bnVsbCxyPW51bGw7Zm9yKGU9MCxpPW4ubGVuZ3RoO2U8aTtlKyspe3ZhciBhPW5bZV0saD1vW2FdLGQ9aFt0XTtudWxsIT1kJiYoIXN8fGQ+cikmJihzPWgscj1kKX1yZXR1cm4gc30sby5wcm90b3R5cGUubWluPWZ1bmN0aW9uKHQpe3ZhciBlLGksbz10aGlzLl9kYXRhLG49T2JqZWN0LmtleXMobykscz1udWxsLHI9bnVsbDtmb3IoZT0wLGk9bi5sZW5ndGg7ZTxpO2UrKyl7dmFyIGE9bltlXSxoPW9bYV0sZD1oW3RdO251bGwhPWQmJighc3x8ZDxyKSYmKHM9aCxyPWQpfXJldHVybiBzfSxvLnByb3RvdHlwZS5kaXN0aW5jdD1mdW5jdGlvbih0KXt2YXIgZSxpLG8sbj10aGlzLl9kYXRhLHI9T2JqZWN0LmtleXMobiksYT1bXSxoPXRoaXMuX29wdGlvbnMudHlwZSYmdGhpcy5fb3B0aW9ucy50eXBlW3RdfHxudWxsLGQ9MDtmb3IoZT0wLG89ci5sZW5ndGg7ZTxvO2UrKyl7dmFyIGw9cltlXSxjPW5bbF0sdT1jW3RdLHA9ITE7Zm9yKGk9MDtpPGQ7aSsrKWlmKGFbaV09PXUpe3A9ITA7YnJlYWt9cHx8dm9pZCAwPT09dXx8KGFbZF09dSxkKyspfWlmKGgpZm9yKGU9MCxvPWEubGVuZ3RoO2U8bztlKyspYVtlXT1zLmNvbnZlcnQoYVtlXSxoKTtyZXR1cm4gYX0sby5wcm90b3R5cGUuX2FkZEl0ZW09ZnVuY3Rpb24odCl7dmFyIGU9dFt0aGlzLl9maWVsZElkXTtpZih2b2lkIDAhPWUpe2lmKHRoaXMuX2RhdGFbZV0pdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgYWRkIGl0ZW06IGl0ZW0gd2l0aCBpZCAiK2UrIiBhbHJlYWR5IGV4aXN0cyIpfWVsc2UgZT1zLnJhbmRvbVVVSUQoKSx0W3RoaXMuX2ZpZWxkSWRdPWU7dmFyIGksbyxuPXt9LHI9T2JqZWN0LmtleXModCk7Zm9yKGk9MCxvPXIubGVuZ3RoO2k8bztpKyspe3ZhciBhPXJbaV0saD10aGlzLl90eXBlW2FdO25bYV09cy5jb252ZXJ0KHRbYV0saCl9cmV0dXJuIHRoaXMuX2RhdGFbZV09bix0aGlzLmxlbmd0aCsrLGV9LG8ucHJvdG90eXBlLl9nZXRJdGVtPWZ1bmN0aW9uKHQsZSl7dmFyIGksbyxuLHIsYT10aGlzLl9kYXRhW3RdO2lmKCFhKXJldHVybiBudWxsO3ZhciBoPXt9LGQ9T2JqZWN0LmtleXMoYSk7aWYoZSlmb3Iobj0wLHI9ZC5sZW5ndGg7bjxyO24rKylpPWRbbl0sbz1hW2ldLGhbaV09cy5jb252ZXJ0KG8sZVtpXSk7ZWxzZSBmb3Iobj0wLHI9ZC5sZW5ndGg7bjxyO24rKylpPWRbbl0sbz1hW2ldLGhbaV09bztyZXR1cm4gaH0sby5wcm90b3R5cGUuX3VwZGF0ZUl0ZW09ZnVuY3Rpb24odCl7dmFyIGU9dFt0aGlzLl9maWVsZElkXTtpZih2b2lkIDA9PWUpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgdXBkYXRlIGl0ZW06IGl0ZW0gaGFzIG5vIGlkIChpdGVtOiAiK0pTT04uc3RyaW5naWZ5KHQpKyIpIik7dmFyIGk9dGhpcy5fZGF0YVtlXTtpZighaSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCB1cGRhdGUgaXRlbTogbm8gaXRlbSB3aXRoIGlkICIrZSsiIGZvdW5kIik7Zm9yKHZhciBvPU9iamVjdC5rZXlzKHQpLG49MCxyPW8ubGVuZ3RoO248cjtuKyspe3ZhciBhPW9bbl0saD10aGlzLl90eXBlW2FdO2lbYV09cy5jb252ZXJ0KHRbYV0saCl9cmV0dXJuIGV9LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkodCl7dGhpcy5kZWxheT1udWxsLHRoaXMubWF4PTEvMCx0aGlzLl9xdWV1ZT1bXSx0aGlzLl90aW1lb3V0PW51bGwsdGhpcy5fZXh0ZW5kZWQ9bnVsbCx0aGlzLnNldE9wdGlvbnModCl9aS5wcm90b3R5cGUuc2V0T3B0aW9ucz1mdW5jdGlvbih0KXt0JiYidW5kZWZpbmVkIiE9dHlwZW9mIHQuZGVsYXkmJih0aGlzLmRlbGF5PXQuZGVsYXkpLHQmJiJ1bmRlZmluZWQiIT10eXBlb2YgdC5tYXgmJih0aGlzLm1heD10Lm1heCksdGhpcy5fZmx1c2hJZk5lZWRlZCgpfSxpLmV4dGVuZD1mdW5jdGlvbih0LGUpe3ZhciBvPW5ldyBpKGUpO2lmKHZvaWQgMCE9PXQuZmx1c2gpdGhyb3cgbmV3IEVycm9yKCJUYXJnZXQgb2JqZWN0IGFscmVhZHkgaGFzIGEgcHJvcGVydHkgZmx1c2giKTt0LmZsdXNoPWZ1bmN0aW9uKCl7by5mbHVzaCgpfTt2YXIgbj1be25hbWU6ImZsdXNoIixvcmlnaW5hbDp2b2lkIDB9XTtpZihlJiZlLnJlcGxhY2UpZm9yKHZhciBzPTA7czxlLnJlcGxhY2UubGVuZ3RoO3MrKyl7dmFyIHI9ZS5yZXBsYWNlW3NdO24ucHVzaCh7bmFtZTpyLG9yaWdpbmFsOnRbcl19KSxvLnJlcGxhY2UodCxyKX1yZXR1cm4gby5fZXh0ZW5kZWQ9e29iamVjdDp0LG1ldGhvZHM6bn0sb30saS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe2lmKHRoaXMuZmx1c2goKSx0aGlzLl9leHRlbmRlZCl7Zm9yKHZhciB0PXRoaXMuX2V4dGVuZGVkLm9iamVjdCxlPXRoaXMuX2V4dGVuZGVkLm1ldGhvZHMsaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldO28ub3JpZ2luYWw/dFtvLm5hbWVdPW8ub3JpZ2luYWw6ZGVsZXRlIHRbby5uYW1lXX10aGlzLl9leHRlbmRlZD1udWxsfX0saS5wcm90b3R5cGUucmVwbGFjZT1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMsbz10W2VdO2lmKCFvKXRocm93IG5ldyBFcnJvcigiTWV0aG9kICIrZSsiIHVuZGVmaW5lZCIpO3RbZV09ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV07aS5xdWV1ZSh7YXJnczp0LGZuOm8sY29udGV4dDp0aGlzfSl9fSxpLnByb3RvdHlwZS5xdWV1ZT1mdW5jdGlvbih0KXsiZnVuY3Rpb24iPT10eXBlb2YgdD90aGlzLl9xdWV1ZS5wdXNoKHtmbjp0fSk6dGhpcy5fcXVldWUucHVzaCh0KSx0aGlzLl9mbHVzaElmTmVlZGVkKCl9LGkucHJvdG90eXBlLl9mbHVzaElmTmVlZGVkPWZ1bmN0aW9uKCl7aWYodGhpcy5fcXVldWUubGVuZ3RoPnRoaXMubWF4JiZ0aGlzLmZsdXNoKCksY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpLHRoaXMucXVldWUubGVuZ3RoPjAmJiJudW1iZXIiPT10eXBlb2YgdGhpcy5kZWxheSl7dmFyIHQ9dGhpczt0aGlzLl90aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LmZsdXNoKCl9LHRoaXMuZGVsYXkpfX0saS5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24oKXtmb3IoO3RoaXMuX3F1ZXVlLmxlbmd0aD4wOyl7dmFyIHQ9dGhpcy5fcXVldWUuc2hpZnQoKTt0LmZuLmFwcGx5KHQuY29udGV4dHx8dC5mbix0LmFyZ3N8fFtdKX19LHQuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUpe3RoaXMuX2RhdGE9bnVsbCx0aGlzLl9pZHM9e30sdGhpcy5sZW5ndGg9MCx0aGlzLl9vcHRpb25zPWV8fHt9LHRoaXMuX2ZpZWxkSWQ9ImlkIix0aGlzLl9zdWJzY3JpYmVycz17fTt2YXIgaT10aGlzO3RoaXMubGlzdGVuZXI9ZnVuY3Rpb24oKXtpLl9vbkV2ZW50LmFwcGx5KGksYXJndW1lbnRzKX0sdGhpcy5zZXREYXRhKHQpfXZhciBuPWkoMSkscz1pKDkpO28ucHJvdG90eXBlLnNldERhdGE9ZnVuY3Rpb24odCl7dmFyIGUsaSxvLG4scztpZih0aGlzLl9kYXRhKXtmb3IodGhpcy5fZGF0YS5vZmYmJnRoaXMuX2RhdGEub2ZmKCIqIix0aGlzLmxpc3RlbmVyKSxlPXRoaXMuX2RhdGEuZ2V0SWRzKHtmaWx0ZXI6dGhpcy5fb3B0aW9ucyYmdGhpcy5fb3B0aW9ucy5maWx0ZXJ9KSxzPVtdLG89MCxuPWUubGVuZ3RoO288bjtvKyspcy5wdXNoKHRoaXMuX2RhdGEuX2RhdGFbZVtvXV0pO3RoaXMuX2lkcz17fSx0aGlzLmxlbmd0aD0wLHRoaXMuX3RyaWdnZXIoInJlbW92ZSIse2l0ZW1zOmUsb2xkRGF0YTpzfSl9aWYodGhpcy5fZGF0YT10LHRoaXMuX2RhdGEpe2Zvcih0aGlzLl9maWVsZElkPXRoaXMuX29wdGlvbnMuZmllbGRJZHx8dGhpcy5fZGF0YSYmdGhpcy5fZGF0YS5vcHRpb25zJiZ0aGlzLl9kYXRhLm9wdGlvbnMuZmllbGRJZHx8ImlkIixlPXRoaXMuX2RhdGEuZ2V0SWRzKHtmaWx0ZXI6dGhpcy5fb3B0aW9ucyYmdGhpcy5fb3B0aW9ucy5maWx0ZXJ9KSxvPTAsbj1lLmxlbmd0aDtvPG47bysrKWk9ZVtvXSx0aGlzLl9pZHNbaV09ITA7dGhpcy5sZW5ndGg9ZS5sZW5ndGgsdGhpcy5fdHJpZ2dlcigiYWRkIix7aXRlbXM6ZX0pLHRoaXMuX2RhdGEub24mJnRoaXMuX2RhdGEub24oIioiLHRoaXMubGlzdGVuZXIpfX0sby5wcm90b3R5cGUucmVmcmVzaD1mdW5jdGlvbigpe3ZhciB0LGUsaSxvPXRoaXMuX2RhdGEuZ2V0SWRzKHtmaWx0ZXI6dGhpcy5fb3B0aW9ucyYmdGhpcy5fb3B0aW9ucy5maWx0ZXJ9KSxuPU9iamVjdC5rZXlzKHRoaXMuX2lkcykscz17fSxyPVtdLGE9W10saD1bXTtmb3IoZT0wLGk9by5sZW5ndGg7ZTxpO2UrKyl0PW9bZV0sc1t0XT0hMCx0aGlzLl9pZHNbdF18fChyLnB1c2godCksdGhpcy5faWRzW3RdPSEwKTtmb3IoZT0wLGk9bi5sZW5ndGg7ZTxpO2UrKyl0PW5bZV0sc1t0XXx8KGEucHVzaCh0KSxoLnB1c2godGhpcy5fZGF0YVt0XSksZGVsZXRlIHRoaXMuX2lkc1t0XSk7dGhpcy5sZW5ndGgrPXIubGVuZ3RoLWEubGVuZ3RoLHIubGVuZ3RoJiZ0aGlzLl90cmlnZ2VyKCJhZGQiLHtpdGVtczpyfSksYS5sZW5ndGgmJnRoaXMuX3RyaWdnZXIoInJlbW92ZSIse2l0ZW1zOmEsb2xkRGF0YTpofSl9LG8ucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt2YXIgZSxpLG8scz10aGlzLHI9bi5nZXRUeXBlKGFyZ3VtZW50c1swXSk7IlN0cmluZyI9PXJ8fCJOdW1iZXIiPT1yfHwiQXJyYXkiPT1yPyhlPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXSxvPWFyZ3VtZW50c1syXSk6KGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdKTt2YXIgYT1uLmV4dGVuZCh7fSx0aGlzLl9vcHRpb25zLGkpO3RoaXMuX29wdGlvbnMuZmlsdGVyJiZpJiZpLmZpbHRlciYmKGEuZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBzLl9vcHRpb25zLmZpbHRlcih0KSYmaS5maWx0ZXIodCl9KTt2YXIgaD1bXTtyZXR1cm4gdm9pZCAwIT1lJiZoLnB1c2goZSksaC5wdXNoKGEpLGgucHVzaChvKSx0aGlzLl9kYXRhJiZ0aGlzLl9kYXRhLmdldC5hcHBseSh0aGlzLl9kYXRhLGgpfSxvLnByb3RvdHlwZS5nZXRJZHM9ZnVuY3Rpb24odCl7dmFyIGU7aWYodGhpcy5fZGF0YSl7dmFyIGksbz10aGlzLl9vcHRpb25zLmZpbHRlcjtpPXQmJnQuZmlsdGVyP28/ZnVuY3Rpb24oZSl7cmV0dXJuIG8oZSkmJnQuZmlsdGVyKGUpfTp0LmZpbHRlcjpvLGU9dGhpcy5fZGF0YS5nZXRJZHMoe2ZpbHRlcjppLG9yZGVyOnQmJnQub3JkZXJ9KX1lbHNlIGU9W107cmV0dXJuIGV9LG8ucHJvdG90eXBlLm1hcD1mdW5jdGlvbih0LGUpe3ZhciBpPVtdO2lmKHRoaXMuX2RhdGEpe3ZhciBvLG49dGhpcy5fb3B0aW9ucy5maWx0ZXI7bz1lJiZlLmZpbHRlcj9uP2Z1bmN0aW9uKHQpe3JldHVybiBuKHQpJiZlLmZpbHRlcih0KX06ZS5maWx0ZXI6bixpPXRoaXMuX2RhdGEubWFwKHQse2ZpbHRlcjpvLG9yZGVyOmUmJmUub3JkZXJ9KX1lbHNlIGk9W107cmV0dXJuIGl9LG8ucHJvdG90eXBlLmdldERhdGFTZXQ9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpczt0IGluc3RhbmNlb2YgbzspdD10Ll9kYXRhO3JldHVybiB0fHxudWxsfSxvLnByb3RvdHlwZS5fb25FdmVudD1mdW5jdGlvbih0LGUsaSl7dmFyIG8sbixzLHIsYT1lJiZlLml0ZW1zLGg9W10sZD1bXSxsPVtdLGM9W10sdT1bXSxwPVtdO2lmKGEmJnRoaXMuX2RhdGEpe3N3aXRjaCh0KXtjYXNlImFkZCI6Zm9yKG89MCxuPWEubGVuZ3RoO288bjtvKyspcz1hW29dLHI9dGhpcy5nZXQocyksciYmKHRoaXMuX2lkc1tzXT0hMCxoLnB1c2gocykpO2JyZWFrO2Nhc2UidXBkYXRlIjpmb3Iobz0wLG49YS5sZW5ndGg7bzxuO28rKylzPWFbb10scj10aGlzLmdldChzKSxyP3RoaXMuX2lkc1tzXT8oZC5wdXNoKHMpLHUucHVzaChlLmRhdGFbb10pLGMucHVzaChlLm9sZERhdGFbb10pKToodGhpcy5faWRzW3NdPSEwLGgucHVzaChzKSk6dGhpcy5faWRzW3NdJiYoZGVsZXRlIHRoaXMuX2lkc1tzXSxsLnB1c2gocykscC5wdXNoKGUub2xkRGF0YVtvXSkpO2JyZWFrO2Nhc2UicmVtb3ZlIjpmb3Iobz0wLG49YS5sZW5ndGg7bzxuO28rKylzPWFbb10sdGhpcy5faWRzW3NdJiYoZGVsZXRlIHRoaXMuX2lkc1tzXSxsLnB1c2gocykscC5wdXNoKGUub2xkRGF0YVtvXSkpfXRoaXMubGVuZ3RoKz1oLmxlbmd0aC1sLmxlbmd0aCxoLmxlbmd0aCYmdGhpcy5fdHJpZ2dlcigiYWRkIix7aXRlbXM6aH0saSksZC5sZW5ndGgmJnRoaXMuX3RyaWdnZXIoInVwZGF0ZSIse2l0ZW1zOmQsb2xkRGF0YTpjLGRhdGE6dX0saSksbC5sZW5ndGgmJnRoaXMuX3RyaWdnZXIoInJlbW92ZSIse2l0ZW1zOmwsb2xkRGF0YTpwfSxpKX19LG8ucHJvdG90eXBlLm9uPXMucHJvdG90eXBlLm9uLG8ucHJvdG90eXBlLm9mZj1zLnByb3RvdHlwZS5vZmYsby5wcm90b3R5cGUuX3RyaWdnZXI9cy5wcm90b3R5cGUuX3RyaWdnZXIsby5wcm90b3R5cGUuc3Vic2NyaWJlPW8ucHJvdG90eXBlLm9uLG8ucHJvdG90eXBlLnVuc3Vic2NyaWJlPW8ucHJvdG90eXBlLm9mZix0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGkpe2lmKCEodGhpcyBpbnN0YW5jZW9mIG8pKXRocm93IG5ldyBTeW50YXhFcnJvcigiQ29uc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IG9wZXJhdG9yIik7dGhpcy5jb250YWluZXJFbGVtZW50PXQsdGhpcy5kYXRhVGFibGU9bnVsbCx0aGlzLmRhdGFQb2ludHM9bnVsbCx0aGlzLmNyZWF0ZSgpLHYuc2V0RGVmYXVsdHMoeSx0aGlzKSx0aGlzLmNvbFg9dm9pZCAwLHRoaXMuY29sWT12b2lkIDAsdGhpcy5jb2xaPXZvaWQgMCx0aGlzLmNvbFZhbHVlPXZvaWQgMCx0aGlzLmNvbEZpbHRlcj12b2lkIDAsdGhpcy5zZXRPcHRpb25zKGkpLGUmJnRoaXMuc2V0RGF0YShlKX1mdW5jdGlvbiBuKHQpe3JldHVybiJjbGllbnRYImluIHQ/dC5jbGllbnRYOnQudGFyZ2V0VG91Y2hlc1swXSYmdC50YXJnZXRUb3VjaGVzWzBdLmNsaWVudFh8fDB9ZnVuY3Rpb24gcyh0KXtyZXR1cm4iY2xpZW50WSJpbiB0P3QuY2xpZW50WTp0LnRhcmdldFRvdWNoZXNbMF0mJnQudGFyZ2V0VG91Y2hlc1swXS5jbGllbnRZfHwwfXZhciByPWkoMTMpLGE9aSg5KSxoPWkoMTEpLGQ9aSgxKSxsPWkoMTQpLGM9aSgxNSksdT0oaSgxNiksaSgxNykpLHA9aSgxOCksZj1pKDE5KSxtPWkoMjApLHY9aSgyMSk7by5TVFlMRT12LlNUWUxFO3ZhciBnPXZvaWQgMCx5PXt3aWR0aDoiNDAwcHgiLGhlaWdodDoiNDAwcHgiLGZpbHRlckxhYmVsOiJ0aW1lIixsZWdlbmRMYWJlbDoidmFsdWUiLHhMYWJlbDoieCIseUxhYmVsOiJ5Iix6TGFiZWw6InoiLHhWYWx1ZUxhYmVsOmZ1bmN0aW9uKHQpe3JldHVybiB0fSx5VmFsdWVMYWJlbDpmdW5jdGlvbih0KXtyZXR1cm4gdH0selZhbHVlTGFiZWw6ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHNob3dHcmlkOiEwLHNob3dQZXJzcGVjdGl2ZTohMCxzaG93U2hhZG93OiExLGtlZXBBc3BlY3RSYXRpbzohMCx2ZXJ0aWNhbFJhdGlvOi41LGRvdFNpemVSYXRpbzouMDIsc2hvd0FuaW1hdGlvbkNvbnRyb2xzOmcsYW5pbWF0aW9uSW50ZXJ2YWw6MWUzLGFuaW1hdGlvblByZWxvYWQ6ITEsYW5pbWF0aW9uQXV0b1N0YXJ0OmcsYXhpc0NvbG9yOiIjNEQ0RDREIixncmlkQ29sb3I6IiNEM0QzRDMiLHhDZW50ZXI6IjU1JSIseUNlbnRlcjoiNTAlIixzdHlsZTpvLlNUWUxFLkRPVCx0b29sdGlwOiExLHNob3dMZWdlbmQ6ZyxiYWNrZ3JvdW5kQ29sb3I6ZyxkYXRhQ29sb3I6e2ZpbGw6IiM3REMxRkYiLHN0cm9rZToiIzMyNjdEMiIsc3Ryb2tlV2lkdGg6MX0sY2FtZXJhUG9zaXRpb246e2hvcml6b250YWw6MSx2ZXJ0aWNhbDouNSxkaXN0YW5jZToxLjd9LHhCYXJXaWR0aDpnLHlCYXJXaWR0aDpnLHZhbHVlTWluOmcsdmFsdWVNYXg6Zyx4TWluOmcseE1heDpnLHhTdGVwOmcseU1pbjpnLHlNYXg6Zyx5U3RlcDpnLHpNaW46Zyx6TWF4OmcselN0ZXA6Z307cihvLnByb3RvdHlwZSksby5wcm90b3R5cGUuX3NldFNjYWxlPWZ1bmN0aW9uKCl7dGhpcy5zY2FsZT1uZXcgbCgxL3RoaXMueFJhbmdlLnJhbmdlKCksMS90aGlzLnlSYW5nZS5yYW5nZSgpLDEvdGhpcy56UmFuZ2UucmFuZ2UoKSksdGhpcy5rZWVwQXNwZWN0UmF0aW8mJih0aGlzLnNjYWxlLng8dGhpcy5zY2FsZS55P3RoaXMuc2NhbGUueT10aGlzLnNjYWxlLng6dGhpcy5zY2FsZS54PXRoaXMuc2NhbGUueSksdGhpcy5zY2FsZS56Kj10aGlzLnZlcnRpY2FsUmF0aW8sdm9pZCAwIT09dGhpcy52YWx1ZVJhbmdlJiYodGhpcy5zY2FsZS52YWx1ZT0xL3RoaXMudmFsdWVSYW5nZS5yYW5nZSgpKTt2YXIgdD10aGlzLnhSYW5nZS5jZW50ZXIoKSp0aGlzLnNjYWxlLngsZT10aGlzLnlSYW5nZS5jZW50ZXIoKSp0aGlzLnNjYWxlLnksaT10aGlzLnpSYW5nZS5jZW50ZXIoKSp0aGlzLnNjYWxlLno7dGhpcy5jYW1lcmEuc2V0QXJtTG9jYXRpb24odCxlLGkpfSxvLnByb3RvdHlwZS5fY29udmVydDNEdG8yRD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9jb252ZXJ0UG9pbnRUb1RyYW5zbGF0aW9uKHQpO3JldHVybiB0aGlzLl9jb252ZXJ0VHJhbnNsYXRpb25Ub1NjcmVlbihlKX0sby5wcm90b3R5cGUuX2NvbnZlcnRQb2ludFRvVHJhbnNsYXRpb249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jYW1lcmEuZ2V0Q2FtZXJhTG9jYXRpb24oKSxpPXRoaXMuY2FtZXJhLmdldENhbWVyYVJvdGF0aW9uKCksbz10LngqdGhpcy5zY2FsZS54LG49dC55KnRoaXMuc2NhbGUueSxzPXQueip0aGlzLnNjYWxlLnoscj1lLngsYT1lLnksaD1lLnosZD1NYXRoLnNpbihpLngpLGM9TWF0aC5jb3MoaS54KSx1PU1hdGguc2luKGkueSkscD1NYXRoLmNvcyhpLnkpLGY9TWF0aC5zaW4oaS56KSxtPU1hdGguY29zKGkueiksdj1wKihmKihuLWEpK20qKG8tcikpLXUqKHMtaCksZz1kKihwKihzLWgpK3UqKGYqKG4tYSkrbSooby1yKSkpK2MqKG0qKG4tYSktZiooby1yKSkseT1jKihwKihzLWgpK3UqKGYqKG4tYSkrbSooby1yKSkpLWQqKG0qKG4tYSktZiooby1yKSk7cmV0dXJuIG5ldyBsKHYsZyx5KX0sby5wcm90b3R5cGUuX2NvbnZlcnRUcmFuc2xhdGlvblRvU2NyZWVuPWZ1bmN0aW9uKHQpe3ZhciBlLGksbz10aGlzLmV5ZS54LG49dGhpcy5leWUueSxzPXRoaXMuZXllLnoscj10LngsYT10LnksaD10Lno7cmV0dXJuIHRoaXMuc2hvd1BlcnNwZWN0aXZlPyhlPShyLW8pKihzL2gpLGk9KGEtbikqKHMvaCkpOihlPXIqLShzL3RoaXMuY2FtZXJhLmdldEFybUxlbmd0aCgpKSxpPWEqLShzL3RoaXMuY2FtZXJhLmdldEFybUxlbmd0aCgpKSksbmV3IGModGhpcy5jdXJyZW50WENlbnRlcitlKnRoaXMuZnJhbWUuY2FudmFzLmNsaWVudFdpZHRoLHRoaXMuY3VycmVudFlDZW50ZXItaSp0aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aCl9LG8ucHJvdG90eXBlLl9jYWxjVHJhbnNsYXRpb25zPWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9ITApO2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKXt2YXIgbz10W2ldO28udHJhbnM9dGhpcy5fY29udmVydFBvaW50VG9UcmFuc2xhdGlvbihvLnBvaW50KSxvLnNjcmVlbj10aGlzLl9jb252ZXJ0VHJhbnNsYXRpb25Ub1NjcmVlbihvLnRyYW5zKTt2YXIgbj10aGlzLl9jb252ZXJ0UG9pbnRUb1RyYW5zbGF0aW9uKG8uYm90dG9tKTtvLmRpc3Q9dGhpcy5zaG93UGVyc3BlY3RpdmU/bi5sZW5ndGgoKTotbi56fWlmKGUpe3ZhciBzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZGlzdC10LmRpc3R9O3Quc29ydChzKX19LG8ucHJvdG90eXBlLmdldE51bWJlck9mUm93cz1mdW5jdGlvbih0KXtyZXR1cm4gdC5sZW5ndGh9LG8ucHJvdG90eXBlLmdldE51bWJlck9mQ29sdW1ucz1mdW5jdGlvbih0KXt2YXIgZT0wO2Zvcih2YXIgaSBpbiB0WzBdKXRbMF0uaGFzT3duUHJvcGVydHkoaSkmJmUrKztyZXR1cm4gZX0sby5wcm90b3R5cGUuZ2V0RGlzdGluY3RWYWx1ZXM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9W10sbz0wO288dC5sZW5ndGg7bysrKWkuaW5kZXhPZih0W29dW2VdKT09LTEmJmkucHVzaCh0W29dW2VdKTtyZXR1cm4gaX0sby5wcm90b3R5cGUuZ2V0Q29sdW1uUmFuZ2U9ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9bmV3IG0sbz0wO288dC5sZW5ndGg7bysrKXt2YXIgbj10W29dW2VdO2kuYWRqdXN0KG4pfXJldHVybiBpfSxvLnByb3RvdHlwZS5fY2hlY2tWYWx1ZUZpZWxkPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc3R5bGU9PT1vLlNUWUxFLkJBUkNPTE9SfHx0aGlzLnN0eWxlPT09by5TVFlMRS5CQVJTSVpFfHx0aGlzLnN0eWxlPT09by5TVFlMRS5ET1RDT0xPUnx8dGhpcy5zdHlsZT09PW8uU1RZTEUuRE9UU0laRTtpZihlKXtpZih2b2lkIDA9PT10aGlzLmNvbFZhbHVlKXRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgZGF0YSB0byBoYXZlICBmaWVsZCAnc3R5bGUnICBmb3IgZ3JhcGggc3R5bGUgJyIrdGhpcy5zdHlsZSsiJyIpO2lmKHZvaWQgMD09PXRbMF1bdGhpcy5jb2xWYWx1ZV0pdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBkYXRhIHRvIGhhdmUgIGZpZWxkICciK3RoaXMuY29sVmFsdWUrIicgIGZvciBncmFwaCBzdHlsZSAnIit0aGlzLnN0eWxlKyInIil9fSxvLnByb3RvdHlwZS5fc2V0UmFuZ2VEZWZhdWx0cz1mdW5jdGlvbih0LGUsaSl7dm9pZCAwIT09ZSYmKHQubWluPWUpLHZvaWQgMCE9PWkmJih0Lm1heD1pKSx0Lm1heDw9dC5taW4mJih0Lm1heD10Lm1pbisxKX0sby5wcm90b3R5cGUuX2RhdGFJbml0aWFsaXplPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcztpZih0aGlzLmRhdGFTZXQmJnRoaXMuZGF0YVNldC5vZmYoIioiLHRoaXMuX29uQ2hhbmdlKSx2b2lkIDAhPT10KXtBcnJheS5pc0FycmF5KHQpJiYodD1uZXcgYSh0KSk7dmFyIG47aWYoISh0IGluc3RhbmNlb2YgYXx8dCBpbnN0YW5jZW9mIGgpKXRocm93IG5ldyBFcnJvcigiQXJyYXksIERhdGFTZXQsIG9yIERhdGFWaWV3IGV4cGVjdGVkIik7aWYobj10LmdldCgpLDAhPW4ubGVuZ3RoKXt0aGlzLmRhdGFTZXQ9dCx0aGlzLmRhdGFUYWJsZT1uLHRoaXMuX29uQ2hhbmdlPWZ1bmN0aW9uKCl7aS5zZXREYXRhKGkuZGF0YVNldCl9LHRoaXMuZGF0YVNldC5vbigiKiIsdGhpcy5fb25DaGFuZ2UpLHRoaXMuY29sWD0ieCIsdGhpcy5jb2xZPSJ5Iix0aGlzLmNvbFo9InoiO3ZhciBzPXRoaXMuc3R5bGU9PW8uU1RZTEUuQkFSfHx0aGlzLnN0eWxlPT1vLlNUWUxFLkJBUkNPTE9SfHx0aGlzLnN0eWxlPT1vLlNUWUxFLkJBUlNJWkU7aWYocyl7aWYodm9pZCAwIT09dGhpcy5kZWZhdWx0WEJhcldpZHRoKXRoaXMueEJhcldpZHRoPXRoaXMuZGVmYXVsdFhCYXJXaWR0aDtlbHNle3ZhciByPXRoaXMuZ2V0RGlzdGluY3RWYWx1ZXMobix0aGlzLmNvbFgpO3RoaXMueEJhcldpZHRoPXJbMV0tclswXXx8MX1pZih2b2lkIDAhPT10aGlzLmRlZmF1bHRZQmFyV2lkdGgpdGhpcy55QmFyV2lkdGg9dGhpcy5kZWZhdWx0WUJhcldpZHRoO2Vsc2V7dmFyIGQ9dGhpcy5nZXREaXN0aW5jdFZhbHVlcyhuLHRoaXMuY29sWSk7dGhpcy55QmFyV2lkdGg9ZFsxXS1kWzBdfHwxfX12YXIgbD01LGM9dGhpcy5nZXRDb2x1bW5SYW5nZShuLHRoaXMuY29sWCk7cyYmYy5leHBhbmQodGhpcy54QmFyV2lkdGgvMiksdGhpcy5fc2V0UmFuZ2VEZWZhdWx0cyhjLHRoaXMuZGVmYXVsdFhNaW4sdGhpcy5kZWZhdWx0WE1heCksdGhpcy54UmFuZ2U9Yyx0aGlzLnhTdGVwPXZvaWQgMCE9PXRoaXMuZGVmYXVsdFhTdGVwP3RoaXMuZGVmYXVsdFhTdGVwOmMucmFuZ2UoKS9sO3ZhciBwPXRoaXMuZ2V0Q29sdW1uUmFuZ2Uobix0aGlzLmNvbFkpO3MmJnAuZXhwYW5kKHRoaXMueUJhcldpZHRoLzIpLHRoaXMuX3NldFJhbmdlRGVmYXVsdHMocCx0aGlzLmRlZmF1bHRZTWluLHRoaXMuZGVmYXVsdFlNYXgpLHRoaXMueVJhbmdlPXAsdGhpcy55U3RlcD12b2lkIDAhPT10aGlzLmRlZmF1bHRZU3RlcD90aGlzLmRlZmF1bHRZU3RlcDpwLnJhbmdlKCkvbDt2YXIgZj10aGlzLmdldENvbHVtblJhbmdlKG4sdGhpcy5jb2xaKTtpZih0aGlzLl9zZXRSYW5nZURlZmF1bHRzKGYsdGhpcy5kZWZhdWx0Wk1pbix0aGlzLmRlZmF1bHRaTWF4KSx0aGlzLnpSYW5nZT1mLHRoaXMuelN0ZXA9dm9pZCAwIT09dGhpcy5kZWZhdWx0WlN0ZXA/dGhpcy5kZWZhdWx0WlN0ZXA6Zi5yYW5nZSgpL2wsblswXS5oYXNPd25Qcm9wZXJ0eSgic3R5bGUiKSl7dGhpcy5jb2xWYWx1ZT0ic3R5bGUiO3ZhciBtPXRoaXMuZ2V0Q29sdW1uUmFuZ2Uobix0aGlzLmNvbFZhbHVlKTt0aGlzLl9zZXRSYW5nZURlZmF1bHRzKG0sdGhpcy5kZWZhdWx0VmFsdWVNaW4sdGhpcy5kZWZhdWx0VmFsdWVNYXgpLHRoaXMudmFsdWVSYW5nZT1tfW5bMF0uaGFzT3duUHJvcGVydHkoImZpbHRlciIpJiYodGhpcy5jb2xGaWx0ZXI9ImZpbHRlciIsdm9pZCAwPT09dGhpcy5kYXRhRmlsdGVyJiYodGhpcy5kYXRhRmlsdGVyPW5ldyB1KHQsdGhpcy5jb2xGaWx0ZXIsdGhpcyksdGhpcy5kYXRhRmlsdGVyLnNldE9uTG9hZENhbGxiYWNrKGZ1bmN0aW9uKCl7aS5yZWRyYXcoKX0pKSksdGhpcy5fc2V0U2NhbGUoKX19fSxvLnByb3RvdHlwZS5fZ2V0RGF0YVBvaW50cz1mdW5jdGlvbih0KXt2YXIgZSxpLG4scyxyLGEsaD1bXTtpZih0aGlzLnN0eWxlPT09by5TVFlMRS5HUklEfHx0aGlzLnN0eWxlPT09by5TVFlMRS5TVVJGQUNFKXt2YXIgZD1bXSxjPVtdO2ZvcihuPTA7bjx0aGlzLmdldE51bWJlck9mUm93cyh0KTtuKyspZT10W25dW3RoaXMuY29sWF18fDAsaT10W25dW3RoaXMuY29sWV18fDAsZC5pbmRleE9mKGUpPT09LTEmJmQucHVzaChlKSxjLmluZGV4T2YoaSk9PT0tMSYmYy5wdXNoKGkpO3ZhciB1PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQtZX07ZC5zb3J0KHUpLGMuc29ydCh1KTt2YXIgcD1bXTtmb3Iobj0wO248dC5sZW5ndGg7bisrKXtlPXRbbl1bdGhpcy5jb2xYXXx8MCxpPXRbbl1bdGhpcy5jb2xZXXx8MCxzPXRbbl1bdGhpcy5jb2xaXXx8MDt2YXIgZj1kLmluZGV4T2YoZSksbT1jLmluZGV4T2YoaSk7dm9pZCAwPT09cFtmXSYmKHBbZl09W10pO3ZhciB2PW5ldyBsO3YueD1lLHYueT1pLHYuej1zLHYuZGF0YT10W25dLHI9e30sci5wb2ludD12LHIudHJhbnM9dm9pZCAwLHIuc2NyZWVuPXZvaWQgMCxyLmJvdHRvbT1uZXcgbChlLGksdGhpcy56UmFuZ2UubWluKSxwW2ZdW21dPXIsaC5wdXNoKHIpfWZvcihlPTA7ZTxwLmxlbmd0aDtlKyspZm9yKGk9MDtpPHBbZV0ubGVuZ3RoO2krKylwW2VdW2ldJiYocFtlXVtpXS5wb2ludFJpZ2h0PWU8cC5sZW5ndGgtMT9wW2UrMV1baV06dm9pZCAwLHBbZV1baV0ucG9pbnRUb3A9aTxwW2VdLmxlbmd0aC0xP3BbZV1baSsxXTp2b2lkIDAscFtlXVtpXS5wb2ludENyb3NzPWU8cC5sZW5ndGgtMSYmaTxwW2VdLmxlbmd0aC0xP3BbZSsxXVtpKzFdOnZvaWQgMCl9ZWxzZSBmb3IodGhpcy5fY2hlY2tWYWx1ZUZpZWxkKHQpLG49MDtuPHQubGVuZ3RoO24rKylhPW5ldyBsLGEueD10W25dW3RoaXMuY29sWF18fDAsYS55PXRbbl1bdGhpcy5jb2xZXXx8MCxhLno9dFtuXVt0aGlzLmNvbFpdfHwwLGEuZGF0YT10W25dLHZvaWQgMCE9PXRoaXMuY29sVmFsdWUmJihhLnZhbHVlPXRbbl1bdGhpcy5jb2xWYWx1ZV18fDApLHI9e30sci5wb2ludD1hLHIuYm90dG9tPW5ldyBsKGEueCxhLnksdGhpcy56UmFuZ2UubWluKSxyLnRyYW5zPXZvaWQgMCxyLnNjcmVlbj12b2lkIDAsdGhpcy5zdHlsZT09PW8uU1RZTEUuTElORSYmbj4wJiYoaFtuLTFdLnBvaW50TmV4dD1yKSxoLnB1c2gocik7cmV0dXJuIGh9LG8ucHJvdG90eXBlLmNyZWF0ZT1mdW5jdGlvbigpe2Zvcig7dGhpcy5jb250YWluZXJFbGVtZW50Lmhhc0NoaWxkTm9kZXMoKTspdGhpcy5jb250YWluZXJFbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMuY29udGFpbmVyRWxlbWVudC5maXJzdENoaWxkKTt0aGlzLmZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZnJhbWUuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIix0aGlzLmZyYW1lLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLHRoaXMuZnJhbWUuY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLHRoaXMuZnJhbWUuY2FudmFzLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmZyYW1lLmNhbnZhcyk7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIik7dC5zdHlsZS5jb2xvcj0icmVkIix0LnN0eWxlLmZvbnRXZWlnaHQ9ImJvbGQiLHQuc3R5bGUucGFkZGluZz0iMTBweCIsdC5pbm5lckhUTUw9IkVycm9yOiB5b3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBIVE1MIGNhbnZhcyIsdGhpcy5mcmFtZS5jYW52YXMuYXBwZW5kQ2hpbGQodCksdGhpcy5mcmFtZS5maWx0ZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5mcmFtZS5maWx0ZXIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLmZyYW1lLmZpbHRlci5zdHlsZS5ib3R0b209IjBweCIsdGhpcy5mcmFtZS5maWx0ZXIuc3R5bGUubGVmdD0iMHB4Iix0aGlzLmZyYW1lLmZpbHRlci5zdHlsZS53aWR0aD0iMTAwJSIsdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmZyYW1lLmZpbHRlcik7dmFyIGU9dGhpcyxpPWZ1bmN0aW9uKHQpe2UuX29uTW91c2VEb3duKHQpfSxvPWZ1bmN0aW9uKHQpe2UuX29uVG91Y2hTdGFydCh0KX0sbj1mdW5jdGlvbih0KXtlLl9vbldoZWVsKHQpfSxzPWZ1bmN0aW9uKHQpe2UuX29uVG9vbHRpcCh0KX07ZC5hZGRFdmVudExpc3RlbmVyKHRoaXMuZnJhbWUuY2FudmFzLCJrZXlkb3duIixvbmtleWRvd24pLGQuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLmZyYW1lLmNhbnZhcywibW91c2Vkb3duIixpKSxkLmFkZEV2ZW50TGlzdGVuZXIodGhpcy5mcmFtZS5jYW52YXMsInRvdWNoc3RhcnQiLG8pLGQuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLmZyYW1lLmNhbnZhcywibW91c2V3aGVlbCIsbiksZC5hZGRFdmVudExpc3RlbmVyKHRoaXMuZnJhbWUuY2FudmFzLCJtb3VzZW1vdmUiLHMpLHRoaXMuY29udGFpbmVyRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmZyYW1lKX0sby5wcm90b3R5cGUuc2V0U2l6ZT1mdW5jdGlvbih0LGUpe3RoaXMuZnJhbWUuc3R5bGUud2lkdGg9dCx0aGlzLmZyYW1lLnN0eWxlLmhlaWdodD1lLHRoaXMuX3Jlc2l6ZUNhbnZhcygpfSxvLnByb3RvdHlwZS5fcmVzaXplQ2FudmFzPWZ1bmN0aW9uKCl7dGhpcy5mcmFtZS5jYW52YXMuc3R5bGUud2lkdGg9IjEwMCUiLHRoaXMuZnJhbWUuY2FudmFzLnN0eWxlLmhlaWdodD0iMTAwJSIsdGhpcy5mcmFtZS5jYW52YXMud2lkdGg9dGhpcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgsdGhpcy5mcmFtZS5jYW52YXMuaGVpZ2h0PXRoaXMuZnJhbWUuY2FudmFzLmNsaWVudEhlaWdodCx0aGlzLmZyYW1lLmZpbHRlci5zdHlsZS53aWR0aD10aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aC0yMCsicHgifSxvLnByb3RvdHlwZS5hbmltYXRpb25TdGFydD1mdW5jdGlvbigpe2lmKCF0aGlzLmZyYW1lLmZpbHRlcnx8IXRoaXMuZnJhbWUuZmlsdGVyLnNsaWRlcil0aHJvdyBuZXcgRXJyb3IoIk5vIGFuaW1hdGlvbiBhdmFpbGFibGUiKTt0aGlzLmZyYW1lLmZpbHRlci5zbGlkZXIucGxheSgpfSxvLnByb3RvdHlwZS5hbmltYXRpb25TdG9wPWZ1bmN0aW9uKCl7dGhpcy5mcmFtZS5maWx0ZXImJnRoaXMuZnJhbWUuZmlsdGVyLnNsaWRlciYmdGhpcy5mcmFtZS5maWx0ZXIuc2xpZGVyLnN0b3AoKX0sby5wcm90b3R5cGUuX3Jlc2l6ZUNlbnRlcj1mdW5jdGlvbigpeyIlIj09PXRoaXMueENlbnRlci5jaGFyQXQodGhpcy54Q2VudGVyLmxlbmd0aC0xKT90aGlzLmN1cnJlbnRYQ2VudGVyPXBhcnNlRmxvYXQodGhpcy54Q2VudGVyKS8xMDAqdGhpcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGg6dGhpcy5jdXJyZW50WENlbnRlcj1wYXJzZUZsb2F0KHRoaXMueENlbnRlciksIiUiPT09dGhpcy55Q2VudGVyLmNoYXJBdCh0aGlzLnlDZW50ZXIubGVuZ3RoLTEpP3RoaXMuY3VycmVudFlDZW50ZXI9cGFyc2VGbG9hdCh0aGlzLnlDZW50ZXIpLzEwMCoodGhpcy5mcmFtZS5jYW52YXMuY2xpZW50SGVpZ2h0LXRoaXMuZnJhbWUuZmlsdGVyLmNsaWVudEhlaWdodCk6dGhpcy5jdXJyZW50WUNlbnRlcj1wYXJzZUZsb2F0KHRoaXMueUNlbnRlcil9LG8ucHJvdG90eXBlLmdldENhbWVyYVBvc2l0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jYW1lcmEuZ2V0QXJtUm90YXRpb24oKTtyZXR1cm4gdC5kaXN0YW5jZT10aGlzLmNhbWVyYS5nZXRBcm1MZW5ndGgoKSx0fSxvLnByb3RvdHlwZS5fcmVhZERhdGE9ZnVuY3Rpb24odCl7dGhpcy5fZGF0YUluaXRpYWxpemUodCx0aGlzLnN0eWxlKSx0aGlzLmRhdGFGaWx0ZXI/dGhpcy5kYXRhUG9pbnRzPXRoaXMuZGF0YUZpbHRlci5fZ2V0RGF0YVBvaW50cygpOnRoaXMuZGF0YVBvaW50cz10aGlzLl9nZXREYXRhUG9pbnRzKHRoaXMuZGF0YVRhYmxlKSx0aGlzLl9yZWRyYXdGaWx0ZXIoKX0sby5wcm90b3R5cGUuc2V0RGF0YT1mdW5jdGlvbih0KXt0aGlzLl9yZWFkRGF0YSh0KSx0aGlzLnJlZHJhdygpLHRoaXMuYW5pbWF0aW9uQXV0b1N0YXJ0JiZ0aGlzLmRhdGFGaWx0ZXImJnRoaXMuYW5pbWF0aW9uU3RhcnQoKX0sby5wcm90b3R5cGUuc2V0T3B0aW9ucz1mdW5jdGlvbih0KXt0aGlzLmFuaW1hdGlvblN0b3AoKSx2LnNldE9wdGlvbnModCx0aGlzKSx0aGlzLnNldFBvaW50RHJhd2luZ01ldGhvZCgpLHRoaXMuc2V0U2l6ZSh0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KSx0aGlzLmRhdGFUYWJsZSYmdGhpcy5zZXREYXRhKHRoaXMuZGF0YVRhYmxlKSx0aGlzLmFuaW1hdGlvbkF1dG9TdGFydCYmdGhpcy5kYXRhRmlsdGVyJiZ0aGlzLmFuaW1hdGlvblN0YXJ0KCl9LG8ucHJvdG90eXBlLnNldFBvaW50RHJhd2luZ01ldGhvZD1mdW5jdGlvbigpe3ZhciB0PXZvaWQgMDtzd2l0Y2godGhpcy5zdHlsZSl7Y2FzZSBvLlNUWUxFLkJBUjp0PW8ucHJvdG90eXBlLl9yZWRyYXdCYXJHcmFwaFBvaW50O2JyZWFrO2Nhc2Ugby5TVFlMRS5CQVJDT0xPUjp0PW8ucHJvdG90eXBlLl9yZWRyYXdCYXJDb2xvckdyYXBoUG9pbnQ7YnJlYWs7Y2FzZSBvLlNUWUxFLkJBUlNJWkU6dD1vLnByb3RvdHlwZS5fcmVkcmF3QmFyU2l6ZUdyYXBoUG9pbnQ7YnJlYWs7Y2FzZSBvLlNUWUxFLkRPVDp0PW8ucHJvdG90eXBlLl9yZWRyYXdEb3RHcmFwaFBvaW50O2JyZWFrO2Nhc2Ugby5TVFlMRS5ET1RMSU5FOnQ9by5wcm90b3R5cGUuX3JlZHJhd0RvdExpbmVHcmFwaFBvaW50O2JyZWFrO2Nhc2Ugby5TVFlMRS5ET1RDT0xPUjp0PW8ucHJvdG90eXBlLl9yZWRyYXdEb3RDb2xvckdyYXBoUG9pbnQ7YnJlYWs7Y2FzZSBvLlNUWUxFLkRPVFNJWkU6dD1vLnByb3RvdHlwZS5fcmVkcmF3RG90U2l6ZUdyYXBoUG9pbnQ7YnJlYWs7Y2FzZSBvLlNUWUxFLlNVUkZBQ0U6dD1vLnByb3RvdHlwZS5fcmVkcmF3U3VyZmFjZUdyYXBoUG9pbnQ7YnJlYWs7Y2FzZSBvLlNUWUxFLkdSSUQ6dD1vLnByb3RvdHlwZS5fcmVkcmF3R3JpZEdyYXBoUG9pbnQ7YnJlYWs7Y2FzZSBvLlNUWUxFLkxJTkU6dD1vLnByb3RvdHlwZS5fcmVkcmF3TGluZUdyYXBoUG9pbnQ7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkNhbiBub3QgZGV0ZXJtaW5lIHBvaW50IGRyYXdpbmcgbWV0aG9kIGZvciBncmFwaCBzdHlsZSAnIit0aGlzLnN0eWxlKyInIil9dGhpcy5fcG9pbnREcmF3aW5nTWV0aG9kPXR9LG8ucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe2lmKHZvaWQgMD09PXRoaXMuZGF0YVBvaW50cyl0aHJvdyBuZXcgRXJyb3IoIkdyYXBoIGRhdGEgbm90IGluaXRpYWxpemVkIik7dGhpcy5fcmVzaXplQ2FudmFzKCksdGhpcy5fcmVzaXplQ2VudGVyKCksdGhpcy5fcmVkcmF3U2xpZGVyKCksdGhpcy5fcmVkcmF3Q2xlYXIoKSx0aGlzLl9yZWRyYXdBeGlzKCksdGhpcy5fcmVkcmF3RGF0YUdyYXBoKCksdGhpcy5fcmVkcmF3SW5mbygpLHRoaXMuX3JlZHJhd0xlZ2VuZCgpfSxvLnByb3RvdHlwZS5fZ2V0Q29udGV4dD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZnJhbWUuY2FudmFzLGU9dC5nZXRDb250ZXh0KCIyZCIpO3JldHVybiBlLmxpbmVKb2luPSJyb3VuZCIsZS5saW5lQ2FwPSJyb3VuZCIsZX0sby5wcm90b3R5cGUuX3JlZHJhd0NsZWFyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5mcmFtZS5jYW52YXMsZT10LmdldENvbnRleHQoIjJkIik7ZS5jbGVhclJlY3QoMCwwLHQud2lkdGgsdC5oZWlnaHQpfSxvLnByb3RvdHlwZS5fZG90U2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZyYW1lLmNsaWVudFdpZHRoKnRoaXMuZG90U2l6ZVJhdGlvfSxvLnByb3RvdHlwZS5fZ2V0TGVnZW5kV2lkdGg9ZnVuY3Rpb24oKXt2YXIgdDtpZih0aGlzLnN0eWxlPT09by5TVFlMRS5ET1RTSVpFKXt2YXIgZT10aGlzLl9kb3RTaXplKCk7dD1lLzIrMiplfWVsc2UgdD10aGlzLnN0eWxlPT09by5TVFlMRS5CQVJTSVpFP3RoaXMueEJhcldpZHRoOjIwO3JldHVybiB0fSxvLnByb3RvdHlwZS5fcmVkcmF3TGVnZW5kPWZ1bmN0aW9uKCl7aWYodGhpcy5zaG93TGVnZW5kPT09ITAmJnRoaXMuc3R5bGUhPT1vLlNUWUxFLkxJTkUmJnRoaXMuc3R5bGUhPT1vLlNUWUxFLkJBUlNJWkUpe3ZhciB0PXRoaXMuc3R5bGU9PT1vLlNUWUxFLkJBUlNJWkV8fHRoaXMuc3R5bGU9PT1vLlNUWUxFLkRPVFNJWkUsZT10aGlzLnN0eWxlPT09by5TVFlMRS5ET1RTSVpFfHx0aGlzLnN0eWxlPT09by5TVFlMRS5ET1RDT0xPUnx8dGhpcy5zdHlsZT09PW8uU1RZTEUuQkFSQ09MT1IsaT1NYXRoLm1heCguMjUqdGhpcy5mcmFtZS5jbGllbnRIZWlnaHQsMTAwKSxuPXRoaXMubWFyZ2luLHM9dGhpcy5fZ2V0TGVnZW5kV2lkdGgoKSxyPXRoaXMuZnJhbWUuY2xpZW50V2lkdGgtdGhpcy5tYXJnaW4sYT1yLXMsaD1uK2ksZD10aGlzLl9nZXRDb250ZXh0KCk7aWYoZC5saW5lV2lkdGg9MSxkLmZvbnQ9IjE0cHggYXJpYWwiLHQ9PT0hMSl7dmFyIGwsdT0wLHA9aTtmb3IobD11O2w8cDtsKyspe3ZhciBtPShsLXUpLyhwLXUpLHY9MjQwKm0sZz10aGlzLl9oc3YycmdiKHYsMSwxKTtkLnN0cm9rZVN0eWxlPWcsZC5iZWdpblBhdGgoKSxkLm1vdmVUbyhhLG4rbCksZC5saW5lVG8ocixuK2wpLGQuc3Ryb2tlKCl9ZC5zdHJva2VTdHlsZT10aGlzLmF4aXNDb2xvcixkLnN0cm9rZVJlY3QoYSxuLHMsaSl9ZWxzZXt2YXIgeTtpZih0aGlzLnN0eWxlPT09by5TVFlMRS5ET1RTSVpFKXt2YXIgYj10aGlzLl9kb3RTaXplKCk7eT1iLzJ9ZWxzZSB0aGlzLnN0eWxlPT09by5TVFlMRS5CQVJTSVpFO2Quc3Ryb2tlU3R5bGU9dGhpcy5heGlzQ29sb3IsZC5maWxsU3R5bGU9dGhpcy5kYXRhQ29sb3IuZmlsbCxkLmJlZ2luUGF0aCgpLGQubW92ZVRvKGEsbiksZC5saW5lVG8ocixuKSxkLmxpbmVUbyhyLXMreSxoKSxkLmxpbmVUbyhhLGgpLGQuY2xvc2VQYXRoKCksZC5maWxsKCksZC5zdHJva2UoKX12YXIgXz01LHc9ZT90aGlzLnZhbHVlUmFuZ2UubWluOnRoaXMuelJhbmdlLm1pbix4PWU/dGhpcy52YWx1ZVJhbmdlLm1heDp0aGlzLnpSYW5nZS5tYXgsaz1uZXcgZih3LHgsKHgtdykvNSwhMCk7ay5zdGFydCghMCk7Zm9yKHZhciBsLE8sRDshay5lbmQoKTspbD1oLShrLmdldEN1cnJlbnQoKS13KS8oeC13KSppLE89bmV3IGMoYS1fLGwpLEQ9bmV3IGMoYSxsKSx0aGlzLl9saW5lKGQsTyxEKSxkLnRleHRBbGlnbj0icmlnaHQiLGQudGV4dEJhc2VsaW5lPSJtaWRkbGUiLGQuZmlsbFN0eWxlPXRoaXMuYXhpc0NvbG9yLGQuZmlsbFRleHQoay5nZXRDdXJyZW50KCksYS0yKl8sbCksay5uZXh0KCk7ZC50ZXh0QWxpZ249InJpZ2h0IixkLnRleHRCYXNlbGluZT0idG9wIjt2YXIgUz10aGlzLmxlZ2VuZExhYmVsO2QuZmlsbFRleHQoUyxyLGgrdGhpcy5tYXJnaW4pfX0sby5wcm90b3R5cGUuX3JlZHJhd0ZpbHRlcj1mdW5jdGlvbigpe2lmKHRoaXMuZnJhbWUuZmlsdGVyLmlubmVySFRNTD0iIix0aGlzLmRhdGFGaWx0ZXIpe3ZhciB0PXt2aXNpYmxlOnRoaXMuc2hvd0FuaW1hdGlvbkNvbnRyb2xzfSxlPW5ldyBwKHRoaXMuZnJhbWUuZmlsdGVyLHQpO3RoaXMuZnJhbWUuZmlsdGVyLnNsaWRlcj1lLHRoaXMuZnJhbWUuZmlsdGVyLnN0eWxlLnBhZGRpbmc9IjEwcHgiLGUuc2V0VmFsdWVzKHRoaXMuZGF0YUZpbHRlci52YWx1ZXMpLGUuc2V0UGxheUludGVydmFsKHRoaXMuYW5pbWF0aW9uSW50ZXJ2YWwpO3ZhciBpPXRoaXMsbz1mdW5jdGlvbigpe3ZhciB0PWUuZ2V0SW5kZXgoKTtpLmRhdGFGaWx0ZXIuc2VsZWN0VmFsdWUodCksaS5kYXRhUG9pbnRzPWkuZGF0YUZpbHRlci5fZ2V0RGF0YVBvaW50cygpLGkucmVkcmF3KCl9O2Uuc2V0T25DaGFuZ2VDYWxsYmFjayhvKX1lbHNlIHRoaXMuZnJhbWUuZmlsdGVyLnNsaWRlcj12b2lkIDB9LG8ucHJvdG90eXBlLl9yZWRyYXdTbGlkZXI9ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLmZyYW1lLmZpbHRlci5zbGlkZXImJnRoaXMuZnJhbWUuZmlsdGVyLnNsaWRlci5yZWRyYXcoKX0sby5wcm90b3R5cGUuX3JlZHJhd0luZm89ZnVuY3Rpb24oKXtpZih0aGlzLmRhdGFGaWx0ZXIpe3ZhciB0PXRoaXMuX2dldENvbnRleHQoKTt0LmZvbnQ9IjE0cHggYXJpYWwiLHQubGluZVN0eWxlPSJncmF5Iix0LmZpbGxTdHlsZT0iZ3JheSIsdC50ZXh0QWxpZ249ImxlZnQiLHQudGV4dEJhc2VsaW5lPSJ0b3AiO3ZhciBlPXRoaXMubWFyZ2luLGk9dGhpcy5tYXJnaW47dC5maWxsVGV4dCh0aGlzLmRhdGFGaWx0ZXIuZ2V0TGFiZWwoKSsiOiAiK3RoaXMuZGF0YUZpbHRlci5nZXRTZWxlY3RlZFZhbHVlKCksZSxpKX19LG8ucHJvdG90eXBlLl9saW5lPWZ1bmN0aW9uKHQsZSxpLG8pe3ZvaWQgMCE9PW8mJih0LnN0cm9rZVN0eWxlPW8pLHQuYmVnaW5QYXRoKCksdC5tb3ZlVG8oZS54LGUueSksdC5saW5lVG8oaS54LGkueSksdC5zdHJva2UoKX0sby5wcm90b3R5cGUuZHJhd0F4aXNMYWJlbFg9ZnVuY3Rpb24odCxlLGksbyxuKXt2b2lkIDA9PT1uJiYobj0wKTt2YXIgcz10aGlzLl9jb252ZXJ0M0R0bzJEKGUpO01hdGguY29zKDIqbyk+MD8odC50ZXh0QWxpZ249ImNlbnRlciIsdC50ZXh0QmFzZWxpbmU9InRvcCIscy55Kz1uKTpNYXRoLnNpbigyKm8pPDA/KHQudGV4dEFsaWduPSJyaWdodCIsdC50ZXh0QmFzZWxpbmU9Im1pZGRsZSIpOih0LnRleHRBbGlnbj0ibGVmdCIsdC50ZXh0QmFzZWxpbmU9Im1pZGRsZSIpLHQuZmlsbFN0eWxlPXRoaXMuYXhpc0NvbG9yLHQuZmlsbFRleHQoaSxzLngscy55KX0sby5wcm90b3R5cGUuZHJhd0F4aXNMYWJlbFk9ZnVuY3Rpb24odCxlLGksbyxuKXt2b2lkIDA9PT1uJiYobj0wKTt2YXIgcz10aGlzLl9jb252ZXJ0M0R0bzJEKGUpO01hdGguY29zKDIqbyk8MD8odC50ZXh0QWxpZ249ImNlbnRlciIsdC50ZXh0QmFzZWxpbmU9InRvcCIscy55Kz1uKTpNYXRoLnNpbigyKm8pPjA/KHQudGV4dEFsaWduPSJyaWdodCIsdC50ZXh0QmFzZWxpbmU9Im1pZGRsZSIpOih0LnRleHRBbGlnbj0ibGVmdCIsdC50ZXh0QmFzZWxpbmU9Im1pZGRsZSIpLHQuZmlsbFN0eWxlPXRoaXMuYXhpc0NvbG9yLHQuZmlsbFRleHQoaSxzLngscy55KX0sby5wcm90b3R5cGUuZHJhd0F4aXNMYWJlbFo9ZnVuY3Rpb24odCxlLGksbyl7dm9pZCAwPT09byYmKG89MCk7dmFyIG49dGhpcy5fY29udmVydDNEdG8yRChlKTt0LnRleHRBbGlnbj0icmlnaHQiLHQudGV4dEJhc2VsaW5lPSJtaWRkbGUiLHQuZmlsbFN0eWxlPXRoaXMuYXhpc0NvbG9yLHQuZmlsbFRleHQoaSxuLngtbyxuLnkpfSxvLnByb3RvdHlwZS5fbGluZTNkPWZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuPXRoaXMuX2NvbnZlcnQzRHRvMkQoZSkscz10aGlzLl9jb252ZXJ0M0R0bzJEKGkpO3RoaXMuX2xpbmUodCxuLHMsbyl9LG8ucHJvdG90eXBlLl9yZWRyYXdBeGlzPWZ1bmN0aW9uKCl7dmFyIHQsZSxpLG8sbixzLHIsYSxoLGQsdSxwPXRoaXMuX2dldENvbnRleHQoKTtwLmZvbnQ9MjQvdGhpcy5jYW1lcmEuZ2V0QXJtTGVuZ3RoKCkrInB4IGFyaWFsIjt2YXIgbT0uMDI1L3RoaXMuc2NhbGUueCx2PS4wMjUvdGhpcy5zY2FsZS55LGc9NS90aGlzLmNhbWVyYS5nZXRBcm1MZW5ndGgoKSx5PXRoaXMuY2FtZXJhLmdldEFybVJvdGF0aW9uKCkuaG9yaXpvbnRhbCxiPW5ldyBjKE1hdGguY29zKHkpLE1hdGguc2luKHkpKSxfPXRoaXMueFJhbmdlLHc9dGhpcy55UmFuZ2UseD10aGlzLnpSYW5nZTtmb3IocC5saW5lV2lkdGg9MSxvPXZvaWQgMD09PXRoaXMuZGVmYXVsdFhTdGVwLGk9bmV3IGYoXy5taW4sXy5tYXgsdGhpcy54U3RlcCxvKSxpLnN0YXJ0KCEwKTshaS5lbmQoKTspe3ZhciBrPWkuZ2V0Q3VycmVudCgpO3RoaXMuc2hvd0dyaWQ/KHQ9bmV3IGwoayx3Lm1pbix4Lm1pbiksZT1uZXcgbChrLHcubWF4LHgubWluKSx0aGlzLl9saW5lM2QocCx0LGUsdGhpcy5ncmlkQ29sb3IpKToodD1uZXcgbChrLHcubWluLHgubWluKSxlPW5ldyBsKGssdy5taW4rbSx4Lm1pbiksdGhpcy5fbGluZTNkKHAsdCxlLHRoaXMuYXhpc0NvbG9yKSx0PW5ldyBsKGssdy5tYXgseC5taW4pLGU9bmV3IGwoayx3Lm1heC1tLHgubWluKSx0aGlzLl9saW5lM2QocCx0LGUsdGhpcy5heGlzQ29sb3IpKSxyPWIueD4wP3cubWluOncubWF4O3ZhciBPPW5ldyBsKGsscix4Lm1pbiksRD0iICAiK3RoaXMueFZhbHVlTGFiZWwoaykrIiAgIjt0aGlzLmRyYXdBeGlzTGFiZWxYKHAsTyxELHksZyksaS5uZXh0KCl9Zm9yKHAubGluZVdpZHRoPTEsbz12b2lkIDA9PT10aGlzLmRlZmF1bHRZU3RlcCxpPW5ldyBmKHcubWluLHcubWF4LHRoaXMueVN0ZXAsbyksaS5zdGFydCghMCk7IWkuZW5kKCk7KXt2YXIgUz1pLmdldEN1cnJlbnQoKTt0aGlzLnNob3dHcmlkPyh0PW5ldyBsKF8ubWluLFMseC5taW4pLGU9bmV3IGwoXy5tYXgsUyx4Lm1pbiksdGhpcy5fbGluZTNkKHAsdCxlLHRoaXMuZ3JpZENvbG9yKSk6KHQ9bmV3IGwoXy5taW4sUyx4Lm1pbiksZT1uZXcgbChfLm1pbit2LFMseC5taW4pLHRoaXMuX2xpbmUzZChwLHQsZSx0aGlzLmF4aXNDb2xvciksdD1uZXcgbChfLm1heCxTLHgubWluKSxlPW5ldyBsKF8ubWF4LXYsUyx4Lm1pbiksdGhpcy5fbGluZTNkKHAsdCxlLHRoaXMuYXhpc0NvbG9yKSkscz1iLnk+MD9fLm1pbjpfLm1heCxPPW5ldyBsKHMsUyx4Lm1pbik7dmFyIEQ9IiAgIit0aGlzLnlWYWx1ZUxhYmVsKFMpKyIgICI7dGhpcy5kcmF3QXhpc0xhYmVsWShwLE8sRCx5LGcpLGkubmV4dCgpfWZvcihwLmxpbmVXaWR0aD0xLG89dm9pZCAwPT09dGhpcy5kZWZhdWx0WlN0ZXAsaT1uZXcgZih4Lm1pbix4Lm1heCx0aGlzLnpTdGVwLG8pLAppLnN0YXJ0KCEwKSxzPWIueD4wP18ubWluOl8ubWF4LHI9Yi55PDA/dy5taW46dy5tYXg7IWkuZW5kKCk7KXt2YXIgQz1pLmdldEN1cnJlbnQoKSxUPW5ldyBsKHMscixDKSxFPXRoaXMuX2NvbnZlcnQzRHRvMkQoVCk7ZT1uZXcgYyhFLngtZyxFLnkpLHRoaXMuX2xpbmUocCxFLGUsdGhpcy5heGlzQ29sb3IpO3ZhciBEPXRoaXMuelZhbHVlTGFiZWwoQykrIiAiO3RoaXMuZHJhd0F4aXNMYWJlbFoocCxULEQsNSksaS5uZXh0KCl9cC5saW5lV2lkdGg9MSx0PW5ldyBsKHMscix4Lm1pbiksZT1uZXcgbChzLHIseC5tYXgpLHRoaXMuX2xpbmUzZChwLHQsZSx0aGlzLmF4aXNDb2xvcik7dmFyIE0sUDtwLmxpbmVXaWR0aD0xLE09bmV3IGwoXy5taW4sdy5taW4seC5taW4pLFA9bmV3IGwoXy5tYXgsdy5taW4seC5taW4pLHRoaXMuX2xpbmUzZChwLE0sUCx0aGlzLmF4aXNDb2xvciksTT1uZXcgbChfLm1pbix3Lm1heCx4Lm1pbiksUD1uZXcgbChfLm1heCx3Lm1heCx4Lm1pbiksdGhpcy5fbGluZTNkKHAsTSxQLHRoaXMuYXhpc0NvbG9yKSxwLmxpbmVXaWR0aD0xLHQ9bmV3IGwoXy5taW4sdy5taW4seC5taW4pLGU9bmV3IGwoXy5taW4sdy5tYXgseC5taW4pLHRoaXMuX2xpbmUzZChwLHQsZSx0aGlzLmF4aXNDb2xvciksdD1uZXcgbChfLm1heCx3Lm1pbix4Lm1pbiksZT1uZXcgbChfLm1heCx3Lm1heCx4Lm1pbiksdGhpcy5fbGluZTNkKHAsdCxlLHRoaXMuYXhpc0NvbG9yKTt2YXIgST10aGlzLnhMYWJlbDtJLmxlbmd0aD4wJiYodT0uMS90aGlzLnNjYWxlLnkscz1fLmNlbnRlcigpLzIscj1iLng+MD93Lm1pbi11OncubWF4K3Usbj1uZXcgbChzLHIseC5taW4pLHRoaXMuZHJhd0F4aXNMYWJlbFgocCxuLEkseSkpO3ZhciBOPXRoaXMueUxhYmVsO04ubGVuZ3RoPjAmJihkPS4xL3RoaXMuc2NhbGUueCxzPWIueT4wP18ubWluLWQ6Xy5tYXgrZCxyPXcuY2VudGVyKCkvMixuPW5ldyBsKHMscix4Lm1pbiksdGhpcy5kcmF3QXhpc0xhYmVsWShwLG4sTix5KSk7dmFyIFI9dGhpcy56TGFiZWw7Ui5sZW5ndGg+MCYmKGg9MzAscz1iLng+MD9fLm1pbjpfLm1heCxyPWIueTwwP3cubWluOncubWF4LGE9eC5jZW50ZXIoKS8yLG49bmV3IGwocyxyLGEpLHRoaXMuZHJhd0F4aXNMYWJlbFoocCxuLFIsaCkpfSxvLnByb3RvdHlwZS5faHN2MnJnYj1mdW5jdGlvbih0LGUsaSl7dmFyIG8sbixzLHIsYSxoO3N3aXRjaChyPWkqZSxhPU1hdGguZmxvb3IodC82MCksaD1yKigxLU1hdGguYWJzKHQvNjAlMi0xKSksYSl7Y2FzZSAwOm89cixuPWgscz0wO2JyZWFrO2Nhc2UgMTpvPWgsbj1yLHM9MDticmVhaztjYXNlIDI6bz0wLG49cixzPWg7YnJlYWs7Y2FzZSAzOm89MCxuPWgscz1yO2JyZWFrO2Nhc2UgNDpvPWgsbj0wLHM9cjticmVhaztjYXNlIDU6bz1yLG49MCxzPWg7YnJlYWs7ZGVmYXVsdDpvPTAsbj0wLHM9MH1yZXR1cm4iUkdCKCIrcGFyc2VJbnQoMjU1Km8pKyIsIitwYXJzZUludCgyNTUqbikrIiwiK3BhcnNlSW50KDI1NSpzKSsiKSJ9LG8ucHJvdG90eXBlLl9nZXRTdHJva2VXaWR0aD1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwIT09dD90aGlzLnNob3dQZXJzcGVjdGl2ZT8xLy10LnRyYW5zLnoqdGhpcy5kYXRhQ29sb3Iuc3Ryb2tlV2lkdGg6LSh0aGlzLmV5ZS56L3RoaXMuY2FtZXJhLmdldEFybUxlbmd0aCgpKSp0aGlzLmRhdGFDb2xvci5zdHJva2VXaWR0aDp0aGlzLmRhdGFDb2xvci5zdHJva2VXaWR0aH0sby5wcm90b3R5cGUuX3JlZHJhd0Jhcj1mdW5jdGlvbih0LGUsaSxvLG4scyl7dmFyIHIsYSxoPXRoaXMsZD1lLnBvaW50LGM9dGhpcy56UmFuZ2UubWluLHU9W3twb2ludDpuZXcgbChkLngtaSxkLnktbyxkLnopfSx7cG9pbnQ6bmV3IGwoZC54K2ksZC55LW8sZC56KX0se3BvaW50Om5ldyBsKGQueCtpLGQueStvLGQueil9LHtwb2ludDpuZXcgbChkLngtaSxkLnkrbyxkLnopfV0scD1be3BvaW50Om5ldyBsKGQueC1pLGQueS1vLGMpfSx7cG9pbnQ6bmV3IGwoZC54K2ksZC55LW8sYyl9LHtwb2ludDpuZXcgbChkLngraSxkLnkrbyxjKX0se3BvaW50Om5ldyBsKGQueC1pLGQueStvLGMpfV07dS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Quc2NyZWVuPWguX2NvbnZlcnQzRHRvMkQodC5wb2ludCl9KSxwLmZvckVhY2goZnVuY3Rpb24odCl7dC5zY3JlZW49aC5fY29udmVydDNEdG8yRCh0LnBvaW50KX0pO3ZhciBmPVt7Y29ybmVyczp1LGNlbnRlcjpsLmF2ZyhwWzBdLnBvaW50LHBbMl0ucG9pbnQpfSx7Y29ybmVyczpbdVswXSx1WzFdLHBbMV0scFswXV0sY2VudGVyOmwuYXZnKHBbMV0ucG9pbnQscFswXS5wb2ludCl9LHtjb3JuZXJzOlt1WzFdLHVbMl0scFsyXSxwWzFdXSxjZW50ZXI6bC5hdmcocFsyXS5wb2ludCxwWzFdLnBvaW50KX0se2Nvcm5lcnM6W3VbMl0sdVszXSxwWzNdLHBbMl1dLGNlbnRlcjpsLmF2ZyhwWzNdLnBvaW50LHBbMl0ucG9pbnQpfSx7Y29ybmVyczpbdVszXSx1WzBdLHBbMF0scFszXV0sY2VudGVyOmwuYXZnKHBbMF0ucG9pbnQscFszXS5wb2ludCl9XTtmb3IoZS5zdXJmYWNlcz1mLHI9MDtyPGYubGVuZ3RoO3IrKyl7YT1mW3JdO3ZhciBtPXRoaXMuX2NvbnZlcnRQb2ludFRvVHJhbnNsYXRpb24oYS5jZW50ZXIpO2EuZGlzdD10aGlzLnNob3dQZXJzcGVjdGl2ZT9tLmxlbmd0aCgpOi1tLnp9Zm9yKGYuc29ydChmdW5jdGlvbih0LGUpe3ZhciBpPWUuZGlzdC10LmRpc3Q7cmV0dXJuIGk/aTp0LmNvcm5lcnM9PT11PzE6ZS5jb3JuZXJzPT09dT8tMTowfSksdC5saW5lV2lkdGg9dGhpcy5fZ2V0U3Ryb2tlV2lkdGgoZSksdC5zdHJva2VTdHlsZT1zLHQuZmlsbFN0eWxlPW4scj0yO3I8Zi5sZW5ndGg7cisrKWE9ZltyXSx0aGlzLl9wb2x5Z29uKHQsYS5jb3JuZXJzKX0sby5wcm90b3R5cGUuX3BvbHlnb249ZnVuY3Rpb24odCxlLGksbyl7aWYoIShlLmxlbmd0aDwyKSl7dm9pZCAwIT09aSYmKHQuZmlsbFN0eWxlPWkpLHZvaWQgMCE9PW8mJih0LnN0cm9rZVN0eWxlPW8pLHQuYmVnaW5QYXRoKCksdC5tb3ZlVG8oZVswXS5zY3JlZW4ueCxlWzBdLnNjcmVlbi55KTtmb3IodmFyIG49MTtuPGUubGVuZ3RoOysrbil7dmFyIHM9ZVtuXTt0LmxpbmVUbyhzLnNjcmVlbi54LHMuc2NyZWVuLnkpfXQuY2xvc2VQYXRoKCksdC5maWxsKCksdC5zdHJva2UoKX19LG8ucHJvdG90eXBlLl9kcmF3Q2lyY2xlPWZ1bmN0aW9uKHQsZSxpLG8sbil7dmFyIHM9dGhpcy5fY2FsY1JhZGl1cyhlLG4pO3QubGluZVdpZHRoPXRoaXMuX2dldFN0cm9rZVdpZHRoKGUpLHQuc3Ryb2tlU3R5bGU9byx0LmZpbGxTdHlsZT1pLHQuYmVnaW5QYXRoKCksdC5hcmMoZS5zY3JlZW4ueCxlLnNjcmVlbi55LHMsMCwyKk1hdGguUEksITApLHQuZmlsbCgpLHQuc3Ryb2tlKCl9LG8ucHJvdG90eXBlLl9nZXRDb2xvcnNSZWd1bGFyPWZ1bmN0aW9uKHQpe3ZhciBlPTI0MCooMS0odC5wb2ludC56LXRoaXMuelJhbmdlLm1pbikqdGhpcy5zY2FsZS56L3RoaXMudmVydGljYWxSYXRpbyksaT10aGlzLl9oc3YycmdiKGUsMSwxKSxvPXRoaXMuX2hzdjJyZ2IoZSwxLC44KTtyZXR1cm57ZmlsbDppLGJvcmRlcjpvfX0sby5wcm90b3R5cGUuX2dldENvbG9yc0NvbG9yPWZ1bmN0aW9uKHQpe3ZhciBlPTI0MCooMS0odC5wb2ludC52YWx1ZS10aGlzLnZhbHVlUmFuZ2UubWluKSp0aGlzLnNjYWxlLnZhbHVlKSxpPXRoaXMuX2hzdjJyZ2IoZSwxLDEpLG89dGhpcy5faHN2MnJnYihlLDEsLjgpO3JldHVybntmaWxsOmksYm9yZGVyOm99fSxvLnByb3RvdHlwZS5fZ2V0Q29sb3JzU2l6ZT1mdW5jdGlvbigpe3JldHVybntmaWxsOnRoaXMuZGF0YUNvbG9yLmZpbGwsYm9yZGVyOnRoaXMuZGF0YUNvbG9yLnN0cm9rZX19LG8ucHJvdG90eXBlLl9jYWxjUmFkaXVzPWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9dGhpcy5fZG90U2l6ZSgpKTt2YXIgaTtyZXR1cm4gaT10aGlzLnNob3dQZXJzcGVjdGl2ZT9lLy10LnRyYW5zLno6ZSotKHRoaXMuZXllLnovdGhpcy5jYW1lcmEuZ2V0QXJtTGVuZ3RoKCkpLGk8MCYmKGk9MCksaX0sby5wcm90b3R5cGUuX3JlZHJhd0JhckdyYXBoUG9pbnQ9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnhCYXJXaWR0aC8yLG89dGhpcy55QmFyV2lkdGgvMixuPXRoaXMuX2dldENvbG9yc1JlZ3VsYXIoZSk7dGhpcy5fcmVkcmF3QmFyKHQsZSxpLG8sbi5maWxsLG4uYm9yZGVyKX0sby5wcm90b3R5cGUuX3JlZHJhd0JhckNvbG9yR3JhcGhQb2ludD1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMueEJhcldpZHRoLzIsbz10aGlzLnlCYXJXaWR0aC8yLG49dGhpcy5fZ2V0Q29sb3JzQ29sb3IoZSk7dGhpcy5fcmVkcmF3QmFyKHQsZSxpLG8sbi5maWxsLG4uYm9yZGVyKX0sby5wcm90b3R5cGUuX3JlZHJhd0JhclNpemVHcmFwaFBvaW50PWZ1bmN0aW9uKHQsZSl7dmFyIGk9KGUucG9pbnQudmFsdWUtdGhpcy52YWx1ZVJhbmdlLm1pbikvdGhpcy52YWx1ZVJhbmdlLnJhbmdlKCksbz10aGlzLnhCYXJXaWR0aC8yKiguOCppKy4yKSxuPXRoaXMueUJhcldpZHRoLzIqKC44KmkrLjIpLHM9dGhpcy5fZ2V0Q29sb3JzU2l6ZSgpO3RoaXMuX3JlZHJhd0Jhcih0LGUsbyxuLHMuZmlsbCxzLmJvcmRlcil9LG8ucHJvdG90eXBlLl9yZWRyYXdEb3RHcmFwaFBvaW50PWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fZ2V0Q29sb3JzUmVndWxhcihlKTt0aGlzLl9kcmF3Q2lyY2xlKHQsZSxpLmZpbGwsaS5ib3JkZXIpfSxvLnByb3RvdHlwZS5fcmVkcmF3RG90TGluZUdyYXBoUG9pbnQ9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9jb252ZXJ0M0R0bzJEKGUuYm90dG9tKTt0LmxpbmVXaWR0aD0xLHRoaXMuX2xpbmUodCxpLGUuc2NyZWVuLHRoaXMuZ3JpZENvbG9yKSx0aGlzLl9yZWRyYXdEb3RHcmFwaFBvaW50KHQsZSl9LG8ucHJvdG90eXBlLl9yZWRyYXdEb3RDb2xvckdyYXBoUG9pbnQ9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9nZXRDb2xvcnNDb2xvcihlKTt0aGlzLl9kcmF3Q2lyY2xlKHQsZSxpLmZpbGwsaS5ib3JkZXIpfSxvLnByb3RvdHlwZS5fcmVkcmF3RG90U2l6ZUdyYXBoUG9pbnQ9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9kb3RTaXplKCksbz0oZS5wb2ludC52YWx1ZS10aGlzLnZhbHVlUmFuZ2UubWluKS90aGlzLnZhbHVlUmFuZ2UucmFuZ2UoKSxuPWkvMisyKmkqbyxzPXRoaXMuX2dldENvbG9yc1NpemUoKTt0aGlzLl9kcmF3Q2lyY2xlKHQsZSxzLmZpbGwscy5ib3JkZXIsbil9LG8ucHJvdG90eXBlLl9yZWRyYXdTdXJmYWNlR3JhcGhQb2ludD1mdW5jdGlvbih0LGUpe3ZhciBpPWUucG9pbnRSaWdodCxvPWUucG9pbnRUb3Asbj1lLnBvaW50Q3Jvc3M7aWYodm9pZCAwIT09ZSYmdm9pZCAwIT09aSYmdm9pZCAwIT09byYmdm9pZCAwIT09bil7dmFyIHMscixhPSEwO2lmKHRoaXMuc2hvd0dyYXlCb3R0b218fHRoaXMuc2hvd1NoYWRvdyl7dmFyIGg9bC5zdWJ0cmFjdChuLnRyYW5zLGUudHJhbnMpLGQ9bC5zdWJ0cmFjdChvLnRyYW5zLGkudHJhbnMpLGM9bC5jcm9zc1Byb2R1Y3QoaCxkKSx1PWMubGVuZ3RoKCk7YT1jLno+MH1pZihhKXt2YXIgcCxmPShlLnBvaW50LnoraS5wb2ludC56K28ucG9pbnQueituLnBvaW50LnopLzQsbT0yNDAqKDEtKGYtdGhpcy56UmFuZ2UubWluKSp0aGlzLnNjYWxlLnovdGhpcy52ZXJ0aWNhbFJhdGlvKSx2PTE7dGhpcy5zaG93U2hhZG93PyhwPU1hdGgubWluKDErYy54L3UvMiwxKSxzPXRoaXMuX2hzdjJyZ2IobSx2LHApLHI9cyk6KHA9MSxzPXRoaXMuX2hzdjJyZ2IobSx2LHApLHI9dGhpcy5heGlzQ29sb3IpfWVsc2Ugcz0iZ3JheSIscj10aGlzLmF4aXNDb2xvcjt0LmxpbmVXaWR0aD10aGlzLl9nZXRTdHJva2VXaWR0aChlKTt2YXIgZz1bZSxpLG4sb107dGhpcy5fcG9seWdvbih0LGcscyxyKX19LG8ucHJvdG90eXBlLl9kcmF3R3JpZExpbmU9ZnVuY3Rpb24odCxlLGkpe2lmKHZvaWQgMCE9PWUmJnZvaWQgMCE9PWkpe3ZhciBvPShlLnBvaW50LnoraS5wb2ludC56KS8yLG49MjQwKigxLShvLXRoaXMuelJhbmdlLm1pbikqdGhpcy5zY2FsZS56L3RoaXMudmVydGljYWxSYXRpbyk7dC5saW5lV2lkdGg9Mip0aGlzLl9nZXRTdHJva2VXaWR0aChlKSx0LnN0cm9rZVN0eWxlPXRoaXMuX2hzdjJyZ2IobiwxLDEpLHRoaXMuX2xpbmUodCxlLnNjcmVlbixpLnNjcmVlbil9fSxvLnByb3RvdHlwZS5fcmVkcmF3R3JpZEdyYXBoUG9pbnQ9ZnVuY3Rpb24odCxlKXt0aGlzLl9kcmF3R3JpZExpbmUodCxlLGUucG9pbnRSaWdodCksdGhpcy5fZHJhd0dyaWRMaW5lKHQsZSxlLnBvaW50VG9wKX0sby5wcm90b3R5cGUuX3JlZHJhd0xpbmVHcmFwaFBvaW50PWZ1bmN0aW9uKHQsZSl7dm9pZCAwIT09ZS5wb2ludE5leHQmJih0LmxpbmVXaWR0aD10aGlzLl9nZXRTdHJva2VXaWR0aChlKSx0LnN0cm9rZVN0eWxlPXRoaXMuZGF0YUNvbG9yLnN0cm9rZSx0aGlzLl9saW5lKHQsZS5zY3JlZW4sZS5wb2ludE5leHQuc2NyZWVuKSl9LG8ucHJvdG90eXBlLl9yZWRyYXdEYXRhR3JhcGg9ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuX2dldENvbnRleHQoKTtpZighKHZvaWQgMD09PXRoaXMuZGF0YVBvaW50c3x8dGhpcy5kYXRhUG9pbnRzLmxlbmd0aDw9MCkpZm9yKHRoaXMuX2NhbGNUcmFuc2xhdGlvbnModGhpcy5kYXRhUG9pbnRzKSx0PTA7dDx0aGlzLmRhdGFQb2ludHMubGVuZ3RoO3QrKyl7dmFyIGk9dGhpcy5kYXRhUG9pbnRzW3RdO3RoaXMuX3BvaW50RHJhd2luZ01ldGhvZC5jYWxsKHRoaXMsZSxpKX19LG8ucHJvdG90eXBlLl9vbk1vdXNlRG93bj1mdW5jdGlvbih0KXtpZih0PXR8fHdpbmRvdy5ldmVudCx0aGlzLmxlZnRCdXR0b25Eb3duJiZ0aGlzLl9vbk1vdXNlVXAodCksdGhpcy5sZWZ0QnV0dG9uRG93bj10LndoaWNoPzE9PT10LndoaWNoOjE9PT10LmJ1dHRvbix0aGlzLmxlZnRCdXR0b25Eb3dufHx0aGlzLnRvdWNoRG93bil7dGhpcy5zdGFydE1vdXNlWD1uKHQpLHRoaXMuc3RhcnRNb3VzZVk9cyh0KSx0aGlzLnN0YXJ0U3RhcnQ9bmV3IERhdGUodGhpcy5zdGFydCksdGhpcy5zdGFydEVuZD1uZXcgRGF0ZSh0aGlzLmVuZCksdGhpcy5zdGFydEFybVJvdGF0aW9uPXRoaXMuY2FtZXJhLmdldEFybVJvdGF0aW9uKCksdGhpcy5mcmFtZS5zdHlsZS5jdXJzb3I9Im1vdmUiO3ZhciBlPXRoaXM7dGhpcy5vbm1vdXNlbW92ZT1mdW5jdGlvbih0KXtlLl9vbk1vdXNlTW92ZSh0KX0sdGhpcy5vbm1vdXNldXA9ZnVuY3Rpb24odCl7ZS5fb25Nb3VzZVVwKHQpfSxkLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNlbW92ZSIsZS5vbm1vdXNlbW92ZSksZC5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZXVwIixlLm9ubW91c2V1cCksZC5wcmV2ZW50RGVmYXVsdCh0KX19LG8ucHJvdG90eXBlLl9vbk1vdXNlTW92ZT1mdW5jdGlvbih0KXt0PXR8fHdpbmRvdy5ldmVudDt2YXIgZT1wYXJzZUZsb2F0KG4odCkpLXRoaXMuc3RhcnRNb3VzZVgsaT1wYXJzZUZsb2F0KHModCkpLXRoaXMuc3RhcnRNb3VzZVksbz10aGlzLnN0YXJ0QXJtUm90YXRpb24uaG9yaXpvbnRhbCtlLzIwMCxyPXRoaXMuc3RhcnRBcm1Sb3RhdGlvbi52ZXJ0aWNhbCtpLzIwMCxhPTQsaD1NYXRoLnNpbihhLzM2MCoyKk1hdGguUEkpO01hdGguYWJzKE1hdGguc2luKG8pKTxoJiYobz1NYXRoLnJvdW5kKG8vTWF0aC5QSSkqTWF0aC5QSS0uMDAxKSxNYXRoLmFicyhNYXRoLmNvcyhvKSk8aCYmKG89KE1hdGgucm91bmQoby9NYXRoLlBJLS41KSsuNSkqTWF0aC5QSS0uMDAxKSxNYXRoLmFicyhNYXRoLnNpbihyKSk8aCYmKHI9TWF0aC5yb3VuZChyL01hdGguUEkpKk1hdGguUEkpLE1hdGguYWJzKE1hdGguY29zKHIpKTxoJiYocj0oTWF0aC5yb3VuZChyL01hdGguUEktLjUpKy41KSpNYXRoLlBJKSx0aGlzLmNhbWVyYS5zZXRBcm1Sb3RhdGlvbihvLHIpLHRoaXMucmVkcmF3KCk7dmFyIGw9dGhpcy5nZXRDYW1lcmFQb3NpdGlvbigpO3RoaXMuZW1pdCgiY2FtZXJhUG9zaXRpb25DaGFuZ2UiLGwpLGQucHJldmVudERlZmF1bHQodCl9LG8ucHJvdG90eXBlLl9vbk1vdXNlVXA9ZnVuY3Rpb24odCl7dGhpcy5mcmFtZS5zdHlsZS5jdXJzb3I9ImF1dG8iLHRoaXMubGVmdEJ1dHRvbkRvd249ITEsZC5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLHRoaXMub25tb3VzZW1vdmUpLGQucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsdGhpcy5vbm1vdXNldXApLGQucHJldmVudERlZmF1bHQodCl9LG8ucHJvdG90eXBlLl9vblRvb2x0aXA9ZnVuY3Rpb24odCl7dmFyIGU9MzAwLGk9dGhpcy5mcmFtZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxvPW4odCktaS5sZWZ0LHI9cyh0KS1pLnRvcDtpZih0aGlzLnNob3dUb29sdGlwKXtpZih0aGlzLnRvb2x0aXBUaW1lb3V0JiZjbGVhclRpbWVvdXQodGhpcy50b29sdGlwVGltZW91dCksdGhpcy5sZWZ0QnV0dG9uRG93bilyZXR1cm4gdm9pZCB0aGlzLl9oaWRlVG9vbHRpcCgpO2lmKHRoaXMudG9vbHRpcCYmdGhpcy50b29sdGlwLmRhdGFQb2ludCl7dmFyIGE9dGhpcy5fZGF0YVBvaW50RnJvbVhZKG8scik7YSE9PXRoaXMudG9vbHRpcC5kYXRhUG9pbnQmJihhP3RoaXMuX3Nob3dUb29sdGlwKGEpOnRoaXMuX2hpZGVUb29sdGlwKCkpfWVsc2V7dmFyIGg9dGhpczt0aGlzLnRvb2x0aXBUaW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtoLnRvb2x0aXBUaW1lb3V0PW51bGw7dmFyIHQ9aC5fZGF0YVBvaW50RnJvbVhZKG8scik7dCYmaC5fc2hvd1Rvb2x0aXAodCl9LGUpfX19LG8ucHJvdG90eXBlLl9vblRvdWNoU3RhcnQ9ZnVuY3Rpb24odCl7dGhpcy50b3VjaERvd249ITA7dmFyIGU9dGhpczt0aGlzLm9udG91Y2htb3ZlPWZ1bmN0aW9uKHQpe2UuX29uVG91Y2hNb3ZlKHQpfSx0aGlzLm9udG91Y2hlbmQ9ZnVuY3Rpb24odCl7ZS5fb25Ub3VjaEVuZCh0KX0sZC5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJ0b3VjaG1vdmUiLGUub250b3VjaG1vdmUpLGQuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwidG91Y2hlbmQiLGUub250b3VjaGVuZCksdGhpcy5fb25Nb3VzZURvd24odCl9LG8ucHJvdG90eXBlLl9vblRvdWNoTW92ZT1mdW5jdGlvbih0KXt0aGlzLl9vbk1vdXNlTW92ZSh0KX0sby5wcm90b3R5cGUuX29uVG91Y2hFbmQ9ZnVuY3Rpb24odCl7dGhpcy50b3VjaERvd249ITEsZC5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LCJ0b3VjaG1vdmUiLHRoaXMub250b3VjaG1vdmUpLGQucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwidG91Y2hlbmQiLHRoaXMub250b3VjaGVuZCksdGhpcy5fb25Nb3VzZVVwKHQpfSxvLnByb3RvdHlwZS5fb25XaGVlbD1mdW5jdGlvbih0KXt0fHwodD13aW5kb3cuZXZlbnQpO3ZhciBlPTA7aWYodC53aGVlbERlbHRhP2U9dC53aGVlbERlbHRhLzEyMDp0LmRldGFpbCYmKGU9LXQuZGV0YWlsLzMpLGUpe3ZhciBpPXRoaXMuY2FtZXJhLmdldEFybUxlbmd0aCgpLG89aSooMS1lLzEwKTt0aGlzLmNhbWVyYS5zZXRBcm1MZW5ndGgobyksdGhpcy5yZWRyYXcoKSx0aGlzLl9oaWRlVG9vbHRpcCgpfXZhciBuPXRoaXMuZ2V0Q2FtZXJhUG9zaXRpb24oKTt0aGlzLmVtaXQoImNhbWVyYVBvc2l0aW9uQ2hhbmdlIixuKSxkLnByZXZlbnREZWZhdWx0KHQpfSxvLnByb3RvdHlwZS5faW5zaWRlVHJpYW5nbGU9ZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBpKHQpe3JldHVybiB0PjA/MTp0PDA/LTE6MH12YXIgbz1lWzBdLG49ZVsxXSxzPWVbMl0scj1pKChuLngtby54KSoodC55LW8ueSktKG4ueS1vLnkpKih0Lngtby54KSksYT1pKChzLngtbi54KSoodC55LW4ueSktKHMueS1uLnkpKih0Lngtbi54KSksaD1pKChvLngtcy54KSoodC55LXMueSktKG8ueS1zLnkpKih0Lngtcy54KSk7cmV0dXJuISgwIT1yJiYwIT1hJiZyIT1hfHwwIT1hJiYwIT1oJiZhIT1ofHwwIT1yJiYwIT1oJiZyIT1oKX0sby5wcm90b3R5cGUuX2RhdGFQb2ludEZyb21YWT1mdW5jdGlvbih0LGUpe3ZhciBpLG49MTAwLHM9bnVsbCxyPW51bGwsYT1udWxsLGg9bmV3IGModCxlKTtpZih0aGlzLnN0eWxlPT09by5TVFlMRS5CQVJ8fHRoaXMuc3R5bGU9PT1vLlNUWUxFLkJBUkNPTE9SfHx0aGlzLnN0eWxlPT09by5TVFlMRS5CQVJTSVpFKWZvcihpPXRoaXMuZGF0YVBvaW50cy5sZW5ndGgtMTtpPj0wO2ktLSl7cz10aGlzLmRhdGFQb2ludHNbaV07dmFyIGQ9cy5zdXJmYWNlcztpZihkKWZvcih2YXIgbD1kLmxlbmd0aC0xO2w+PTA7bC0tKXt2YXIgdT1kW2xdLHA9dS5jb3JuZXJzLGY9W3BbMF0uc2NyZWVuLHBbMV0uc2NyZWVuLHBbMl0uc2NyZWVuXSxtPVtwWzJdLnNjcmVlbixwWzNdLnNjcmVlbixwWzBdLnNjcmVlbl07aWYodGhpcy5faW5zaWRlVHJpYW5nbGUoaCxmKXx8dGhpcy5faW5zaWRlVHJpYW5nbGUoaCxtKSlyZXR1cm4gc319ZWxzZSBmb3IoaT0wO2k8dGhpcy5kYXRhUG9pbnRzLmxlbmd0aDtpKyspe3M9dGhpcy5kYXRhUG9pbnRzW2ldO3ZhciB2PXMuc2NyZWVuO2lmKHYpe3ZhciBnPU1hdGguYWJzKHQtdi54KSx5PU1hdGguYWJzKGUtdi55KSxiPU1hdGguc3FydChnKmcreSp5KTsobnVsbD09PWF8fGI8YSkmJmI8biYmKGE9YixyPXMpfX1yZXR1cm4gcn0sby5wcm90b3R5cGUuX3Nob3dUb29sdGlwPWZ1bmN0aW9uKHQpe3ZhciBlLGksbzt0aGlzLnRvb2x0aXA/KGU9dGhpcy50b29sdGlwLmRvbS5jb250ZW50LGk9dGhpcy50b29sdGlwLmRvbS5saW5lLG89dGhpcy50b29sdGlwLmRvbS5kb3QpOihlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLnBhZGRpbmc9IjEwcHgiLGUuc3R5bGUuYm9yZGVyPSIxcHggc29saWQgIzRkNGQ0ZCIsZS5zdHlsZS5jb2xvcj0iIzFhMWExYSIsZS5zdHlsZS5iYWNrZ3JvdW5kPSJyZ2JhKDI1NSwyNTUsMjU1LDAuNykiLGUuc3R5bGUuYm9yZGVyUmFkaXVzPSIycHgiLGUuc3R5bGUuYm94U2hhZG93PSI1cHggNXB4IDEwcHggcmdiYSgxMjgsMTI4LDEyOCwwLjUpIixpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGkuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixpLnN0eWxlLmhlaWdodD0iNDBweCIsaS5zdHlsZS53aWR0aD0iMCIsaS5zdHlsZS5ib3JkZXJMZWZ0PSIxcHggc29saWQgIzRkNGQ0ZCIsbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxvLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsby5zdHlsZS5oZWlnaHQ9IjAiLG8uc3R5bGUud2lkdGg9IjAiLG8uc3R5bGUuYm9yZGVyPSI1cHggc29saWQgIzRkNGQ0ZCIsby5zdHlsZS5ib3JkZXJSYWRpdXM9IjVweCIsdGhpcy50b29sdGlwPXtkYXRhUG9pbnQ6bnVsbCxkb206e2NvbnRlbnQ6ZSxsaW5lOmksZG90Om99fSksdGhpcy5faGlkZVRvb2x0aXAoKSx0aGlzLnRvb2x0aXAuZGF0YVBvaW50PXQsImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuc2hvd1Rvb2x0aXA/ZS5pbm5lckhUTUw9dGhpcy5zaG93VG9vbHRpcCh0LnBvaW50KTplLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQ+Iit0aGlzLnhMYWJlbCsiOjwvdGQ+PHRkPiIrdC5wb2ludC54KyI8L3RkPjwvdHI+PHRyPjx0ZD4iK3RoaXMueUxhYmVsKyI6PC90ZD48dGQ+Iit0LnBvaW50LnkrIjwvdGQ+PC90cj48dHI+PHRkPiIrdGhpcy56TGFiZWwrIjo8L3RkPjx0ZD4iK3QucG9pbnQueisiPC90ZD48L3RyPjwvdGFibGU+IixlLnN0eWxlLmxlZnQ9IjAiLGUuc3R5bGUudG9wPSIwIix0aGlzLmZyYW1lLmFwcGVuZENoaWxkKGUpLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQoaSksdGhpcy5mcmFtZS5hcHBlbmRDaGlsZChvKTt2YXIgbj1lLm9mZnNldFdpZHRoLHM9ZS5vZmZzZXRIZWlnaHQscj1pLm9mZnNldEhlaWdodCxhPW8ub2Zmc2V0V2lkdGgsaD1vLm9mZnNldEhlaWdodCxkPXQuc2NyZWVuLngtbi8yO2Q9TWF0aC5taW4oTWF0aC5tYXgoZCwxMCksdGhpcy5mcmFtZS5jbGllbnRXaWR0aC0xMC1uKSxpLnN0eWxlLmxlZnQ9dC5zY3JlZW4ueCsicHgiLGkuc3R5bGUudG9wPXQuc2NyZWVuLnktcisicHgiLGUuc3R5bGUubGVmdD1kKyJweCIsZS5zdHlsZS50b3A9dC5zY3JlZW4ueS1yLXMrInB4IixvLnN0eWxlLmxlZnQ9dC5zY3JlZW4ueC1hLzIrInB4IixvLnN0eWxlLnRvcD10LnNjcmVlbi55LWgvMisicHgifSxvLnByb3RvdHlwZS5faGlkZVRvb2x0aXA9ZnVuY3Rpb24oKXtpZih0aGlzLnRvb2x0aXApe3RoaXMudG9vbHRpcC5kYXRhUG9pbnQ9bnVsbDtmb3IodmFyIHQgaW4gdGhpcy50b29sdGlwLmRvbSlpZih0aGlzLnRvb2x0aXAuZG9tLmhhc093blByb3BlcnR5KHQpKXt2YXIgZT10aGlzLnRvb2x0aXAuZG9tW3RdO2UmJmUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpfX19LG8ucHJvdG90eXBlLnNldENhbWVyYVBvc2l0aW9uPWZ1bmN0aW9uKHQpe3Yuc2V0Q2FtZXJhUG9zaXRpb24odCx0aGlzKSx0aGlzLnJlZHJhdygpfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBpKHQpe2lmKHQpcmV0dXJuIG8odCl9ZnVuY3Rpb24gbyh0KXtmb3IodmFyIGUgaW4gaS5wcm90b3R5cGUpdFtlXT1pLnByb3RvdHlwZVtlXTtyZXR1cm4gdH10LmV4cG9ydHM9aSxpLnByb3RvdHlwZS5vbj1pLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2NhbGxiYWNrcz10aGlzLl9jYWxsYmFja3N8fHt9LCh0aGlzLl9jYWxsYmFja3NbdF09dGhpcy5fY2FsbGJhY2tzW3RdfHxbXSkucHVzaChlKSx0aGlzfSxpLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gaSgpe28ub2ZmKHQsaSksZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dmFyIG89dGhpcztyZXR1cm4gdGhpcy5fY2FsbGJhY2tzPXRoaXMuX2NhbGxiYWNrc3x8e30saS5mbj1lLHRoaXMub24odCxpKSx0aGlzfSxpLnByb3RvdHlwZS5vZmY9aS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9aS5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWkucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9jYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzfHx7fSwwPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl9jYWxsYmFja3M9e30sdGhpczt2YXIgaT10aGlzLl9jYWxsYmFja3NbdF07aWYoIWkpcmV0dXJuIHRoaXM7aWYoMT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZGVsZXRlIHRoaXMuX2NhbGxiYWNrc1t0XSx0aGlzO2Zvcih2YXIgbyxuPTA7bjxpLmxlbmd0aDtuKyspaWYobz1pW25dLG89PT1lfHxvLmZuPT09ZSl7aS5zcGxpY2UobiwxKTticmVha31yZXR1cm4gdGhpc30saS5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbih0KXt0aGlzLl9jYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzfHx7fTt2YXIgZT1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxpPXRoaXMuX2NhbGxiYWNrc1t0XTtpZihpKXtpPWkuc2xpY2UoMCk7Zm9yKHZhciBvPTAsbj1pLmxlbmd0aDtvPG47KytvKWlbb10uYXBwbHkodGhpcyxlKX1yZXR1cm4gdGhpc30saS5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzfHx7fSx0aGlzLl9jYWxsYmFja3NbdF18fFtdfSxpLnByb3RvdHlwZS5oYXNMaXN0ZW5lcnM9ZnVuY3Rpb24odCl7cmV0dXJuISF0aGlzLmxpc3RlbmVycyh0KS5sZW5ndGh9fSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkodCxlLGkpe3RoaXMueD12b2lkIDAhPT10P3Q6MCx0aGlzLnk9dm9pZCAwIT09ZT9lOjAsdGhpcy56PXZvaWQgMCE9PWk/aTowfWkuc3VidHJhY3Q9ZnVuY3Rpb24odCxlKXt2YXIgbz1uZXcgaTtyZXR1cm4gby54PXQueC1lLngsby55PXQueS1lLnksby56PXQuei1lLnosb30saS5hZGQ9ZnVuY3Rpb24odCxlKXt2YXIgbz1uZXcgaTtyZXR1cm4gby54PXQueCtlLngsby55PXQueStlLnksby56PXQueitlLnosb30saS5hdmc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IGkoKHQueCtlLngpLzIsKHQueStlLnkpLzIsKHQueitlLnopLzIpfSxpLmNyb3NzUHJvZHVjdD1mdW5jdGlvbih0LGUpe3ZhciBvPW5ldyBpO3JldHVybiBvLng9dC55KmUuei10LnoqZS55LG8ueT10LnoqZS54LXQueCplLnosby56PXQueCplLnktdC55KmUueCxvfSxpLnByb3RvdHlwZS5sZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56KX0sdC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gaSh0LGUpe3RoaXMueD12b2lkIDAhPT10P3Q6MCx0aGlzLnk9dm9pZCAwIT09ZT9lOjB9dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKCl7dGhpcy5hcm1Mb2NhdGlvbj1uZXcgbix0aGlzLmFybVJvdGF0aW9uPXt9LHRoaXMuYXJtUm90YXRpb24uaG9yaXpvbnRhbD0wLHRoaXMuYXJtUm90YXRpb24udmVydGljYWw9MCx0aGlzLmFybUxlbmd0aD0xLjcsdGhpcy5jYW1lcmFMb2NhdGlvbj1uZXcgbix0aGlzLmNhbWVyYVJvdGF0aW9uPW5ldyBuKC41Kk1hdGguUEksMCwwKSx0aGlzLmNhbGN1bGF0ZUNhbWVyYU9yaWVudGF0aW9uKCl9dmFyIG49aSgxNCk7by5wcm90b3R5cGUuc2V0QXJtTG9jYXRpb249ZnVuY3Rpb24odCxlLGkpe3RoaXMuYXJtTG9jYXRpb24ueD10LHRoaXMuYXJtTG9jYXRpb24ueT1lLHRoaXMuYXJtTG9jYXRpb24uej1pLHRoaXMuY2FsY3VsYXRlQ2FtZXJhT3JpZW50YXRpb24oKX0sby5wcm90b3R5cGUuc2V0QXJtUm90YXRpb249ZnVuY3Rpb24odCxlKXt2b2lkIDAhPT10JiYodGhpcy5hcm1Sb3RhdGlvbi5ob3Jpem9udGFsPXQpLHZvaWQgMCE9PWUmJih0aGlzLmFybVJvdGF0aW9uLnZlcnRpY2FsPWUsdGhpcy5hcm1Sb3RhdGlvbi52ZXJ0aWNhbDwwJiYodGhpcy5hcm1Sb3RhdGlvbi52ZXJ0aWNhbD0wKSx0aGlzLmFybVJvdGF0aW9uLnZlcnRpY2FsPi41Kk1hdGguUEkmJih0aGlzLmFybVJvdGF0aW9uLnZlcnRpY2FsPS41Kk1hdGguUEkpKSx2b2lkIDA9PT10JiZ2b2lkIDA9PT1lfHx0aGlzLmNhbGN1bGF0ZUNhbWVyYU9yaWVudGF0aW9uKCl9LG8ucHJvdG90eXBlLmdldEFybVJvdGF0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9e307cmV0dXJuIHQuaG9yaXpvbnRhbD10aGlzLmFybVJvdGF0aW9uLmhvcml6b250YWwsdC52ZXJ0aWNhbD10aGlzLmFybVJvdGF0aW9uLnZlcnRpY2FsLHR9LG8ucHJvdG90eXBlLnNldEFybUxlbmd0aD1mdW5jdGlvbih0KXt2b2lkIDAhPT10JiYodGhpcy5hcm1MZW5ndGg9dCx0aGlzLmFybUxlbmd0aDwuNzEmJih0aGlzLmFybUxlbmd0aD0uNzEpLHRoaXMuYXJtTGVuZ3RoPjUmJih0aGlzLmFybUxlbmd0aD01KSx0aGlzLmNhbGN1bGF0ZUNhbWVyYU9yaWVudGF0aW9uKCkpfSxvLnByb3RvdHlwZS5nZXRBcm1MZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcm1MZW5ndGh9LG8ucHJvdG90eXBlLmdldENhbWVyYUxvY2F0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FtZXJhTG9jYXRpb259LG8ucHJvdG90eXBlLmdldENhbWVyYVJvdGF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FtZXJhUm90YXRpb259LG8ucHJvdG90eXBlLmNhbGN1bGF0ZUNhbWVyYU9yaWVudGF0aW9uPWZ1bmN0aW9uKCl7dGhpcy5jYW1lcmFMb2NhdGlvbi54PXRoaXMuYXJtTG9jYXRpb24ueC10aGlzLmFybUxlbmd0aCpNYXRoLnNpbih0aGlzLmFybVJvdGF0aW9uLmhvcml6b250YWwpKk1hdGguY29zKHRoaXMuYXJtUm90YXRpb24udmVydGljYWwpLHRoaXMuY2FtZXJhTG9jYXRpb24ueT10aGlzLmFybUxvY2F0aW9uLnktdGhpcy5hcm1MZW5ndGgqTWF0aC5jb3ModGhpcy5hcm1Sb3RhdGlvbi5ob3Jpem9udGFsKSpNYXRoLmNvcyh0aGlzLmFybVJvdGF0aW9uLnZlcnRpY2FsKSx0aGlzLmNhbWVyYUxvY2F0aW9uLno9dGhpcy5hcm1Mb2NhdGlvbi56K3RoaXMuYXJtTGVuZ3RoKk1hdGguc2luKHRoaXMuYXJtUm90YXRpb24udmVydGljYWwpLHRoaXMuY2FtZXJhUm90YXRpb24ueD1NYXRoLlBJLzItdGhpcy5hcm1Sb3RhdGlvbi52ZXJ0aWNhbCx0aGlzLmNhbWVyYVJvdGF0aW9uLnk9MCx0aGlzLmNhbWVyYVJvdGF0aW9uLno9LXRoaXMuYXJtUm90YXRpb24uaG9yaXpvbnRhbH0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSxpKXt0aGlzLmRhdGE9dCx0aGlzLmNvbHVtbj1lLHRoaXMuZ3JhcGg9aSx0aGlzLmluZGV4PXZvaWQgMCx0aGlzLnZhbHVlPXZvaWQgMCx0aGlzLnZhbHVlcz1pLmdldERpc3RpbmN0VmFsdWVzKHQuZ2V0KCksdGhpcy5jb2x1bW4pLHRoaXMudmFsdWVzLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdD5lPzE6dDxlPy0xOjB9KSx0aGlzLnZhbHVlcy5sZW5ndGg+MCYmdGhpcy5zZWxlY3RWYWx1ZSgwKSx0aGlzLmRhdGFQb2ludHM9W10sdGhpcy5sb2FkZWQ9ITEsdGhpcy5vbkxvYWRDYWxsYmFjaz12b2lkIDAsaS5hbmltYXRpb25QcmVsb2FkPyh0aGlzLmxvYWRlZD0hMSx0aGlzLmxvYWRJbkJhY2tncm91bmQoKSk6dGhpcy5sb2FkZWQ9ITB9dmFyIG49aSgxMSk7by5wcm90b3R5cGUuaXNMb2FkZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb2FkZWR9LG8ucHJvdG90eXBlLmdldExvYWRlZFByb2dyZXNzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMudmFsdWVzLmxlbmd0aCxlPTA7dGhpcy5kYXRhUG9pbnRzW2VdOyllKys7cmV0dXJuIE1hdGgucm91bmQoZS90KjEwMCl9LG8ucHJvdG90eXBlLmdldExhYmVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ3JhcGguZmlsdGVyTGFiZWx9LG8ucHJvdG90eXBlLmdldENvbHVtbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbHVtbn0sby5wcm90b3R5cGUuZ2V0U2VsZWN0ZWRWYWx1ZT1mdW5jdGlvbigpe2lmKHZvaWQgMCE9PXRoaXMuaW5kZXgpcmV0dXJuIHRoaXMudmFsdWVzW3RoaXMuaW5kZXhdfSxvLnByb3RvdHlwZS5nZXRWYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZXN9LG8ucHJvdG90eXBlLmdldFZhbHVlPWZ1bmN0aW9uKHQpe2lmKHQ+PXRoaXMudmFsdWVzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpO3JldHVybiB0aGlzLnZhbHVlc1t0XX0sby5wcm90b3R5cGUuX2dldERhdGFQb2ludHM9ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dCYmKHQ9dGhpcy5pbmRleCksdm9pZCAwPT09dClyZXR1cm5bXTt2YXIgZTtpZih0aGlzLmRhdGFQb2ludHNbdF0pZT10aGlzLmRhdGFQb2ludHNbdF07ZWxzZXt2YXIgaT17fTtpLmNvbHVtbj10aGlzLmNvbHVtbixpLnZhbHVlPXRoaXMudmFsdWVzW3RdO3ZhciBvPW5ldyBuKHRoaXMuZGF0YSx7ZmlsdGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0W2kuY29sdW1uXT09aS52YWx1ZX19KS5nZXQoKTtlPXRoaXMuZ3JhcGguX2dldERhdGFQb2ludHMobyksdGhpcy5kYXRhUG9pbnRzW3RdPWV9cmV0dXJuIGV9LG8ucHJvdG90eXBlLnNldE9uTG9hZENhbGxiYWNrPWZ1bmN0aW9uKHQpe3RoaXMub25Mb2FkQ2FsbGJhY2s9dH0sby5wcm90b3R5cGUuc2VsZWN0VmFsdWU9ZnVuY3Rpb24odCl7aWYodD49dGhpcy52YWx1ZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7dGhpcy5pbmRleD10LHRoaXMudmFsdWU9dGhpcy52YWx1ZXNbdF19LG8ucHJvdG90eXBlLmxvYWRJbkJhY2tncm91bmQ9ZnVuY3Rpb24odCl7dm9pZCAwPT09dCYmKHQ9MCk7dmFyIGU9dGhpcy5ncmFwaC5mcmFtZTtpZih0PHRoaXMudmFsdWVzLmxlbmd0aCl7dGhpcy5fZ2V0RGF0YVBvaW50cyh0KTt2b2lkIDA9PT1lLnByb2dyZXNzJiYoZS5wcm9ncmVzcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSxlLnByb2dyZXNzLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5wcm9ncmVzcy5zdHlsZS5jb2xvcj0iZ3JheSIsZS5hcHBlbmRDaGlsZChlLnByb2dyZXNzKSk7dmFyIGk9dGhpcy5nZXRMb2FkZWRQcm9ncmVzcygpO2UucHJvZ3Jlc3MuaW5uZXJIVE1MPSJMb2FkaW5nIGFuaW1hdGlvbi4uLiAiK2krIiUiLGUucHJvZ3Jlc3Muc3R5bGUuYm90dG9tPSI2MHB4IixlLnByb2dyZXNzLnN0eWxlLmxlZnQ9IjEwcHgiO3ZhciBvPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe28ubG9hZEluQmFja2dyb3VuZCh0KzEpfSwxMCksdGhpcy5sb2FkZWQ9ITF9ZWxzZSB0aGlzLmxvYWRlZD0hMCx2b2lkIDAhPT1lLnByb2dyZXNzJiYoZS5yZW1vdmVDaGlsZChlLnByb2dyZXNzKSxlLnByb2dyZXNzPXZvaWQgMCksdGhpcy5vbkxvYWRDYWxsYmFjayYmdGhpcy5vbkxvYWRDYWxsYmFjaygpfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlKXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBFcnJvcigiTm8gY29udGFpbmVyIGVsZW1lbnQgZGVmaW5lZCIpO2lmKHRoaXMuY29udGFpbmVyPXQsdGhpcy52aXNpYmxlPSFlfHx2b2lkIDA9PWUudmlzaWJsZXx8ZS52aXNpYmxlLHRoaXMudmlzaWJsZSl7dGhpcy5mcmFtZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSx0aGlzLmZyYW1lLnN0eWxlLndpZHRoPSIxMDAlIix0aGlzLmZyYW1lLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5mcmFtZSksdGhpcy5mcmFtZS5wcmV2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIklOUFVUIiksdGhpcy5mcmFtZS5wcmV2LnR5cGU9IkJVVFRPTiIsdGhpcy5mcmFtZS5wcmV2LnZhbHVlPSJQcmV2Iix0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuZnJhbWUucHJldiksdGhpcy5mcmFtZS5wbGF5PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIklOUFVUIiksdGhpcy5mcmFtZS5wbGF5LnR5cGU9IkJVVFRPTiIsdGhpcy5mcmFtZS5wbGF5LnZhbHVlPSJQbGF5Iix0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuZnJhbWUucGxheSksdGhpcy5mcmFtZS5uZXh0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIklOUFVUIiksdGhpcy5mcmFtZS5uZXh0LnR5cGU9IkJVVFRPTiIsdGhpcy5mcmFtZS5uZXh0LnZhbHVlPSJOZXh0Iix0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuZnJhbWUubmV4dCksdGhpcy5mcmFtZS5iYXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiSU5QVVQiKSx0aGlzLmZyYW1lLmJhci50eXBlPSJCVVRUT04iLHRoaXMuZnJhbWUuYmFyLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5mcmFtZS5iYXIuc3R5bGUuYm9yZGVyPSIxcHggc29saWQgcmVkIix0aGlzLmZyYW1lLmJhci5zdHlsZS53aWR0aD0iMTAwcHgiLHRoaXMuZnJhbWUuYmFyLnN0eWxlLmhlaWdodD0iNnB4Iix0aGlzLmZyYW1lLmJhci5zdHlsZS5ib3JkZXJSYWRpdXM9IjJweCIsdGhpcy5mcmFtZS5iYXIuc3R5bGUuTW96Qm9yZGVyUmFkaXVzPSIycHgiLHRoaXMuZnJhbWUuYmFyLnN0eWxlLmJvcmRlcj0iMXB4IHNvbGlkICM3RjdGN0YiLHRoaXMuZnJhbWUuYmFyLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iI0U1RTVFNSIsdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmZyYW1lLmJhciksdGhpcy5mcmFtZS5zbGlkZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJJTlBVVCIpLHRoaXMuZnJhbWUuc2xpZGUudHlwZT0iQlVUVE9OIix0aGlzLmZyYW1lLnNsaWRlLnN0eWxlLm1hcmdpbj0iMHB4Iix0aGlzLmZyYW1lLnNsaWRlLnZhbHVlPSIgIix0aGlzLmZyYW1lLnNsaWRlLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsdGhpcy5mcmFtZS5zbGlkZS5zdHlsZS5sZWZ0PSItMTAwcHgiLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5mcmFtZS5zbGlkZSk7dmFyIGk9dGhpczt0aGlzLmZyYW1lLnNsaWRlLm9ubW91c2Vkb3duPWZ1bmN0aW9uKHQpe2kuX29uTW91c2VEb3duKHQpfSx0aGlzLmZyYW1lLnByZXYub25jbGljaz1mdW5jdGlvbih0KXtpLnByZXYodCl9LHRoaXMuZnJhbWUucGxheS5vbmNsaWNrPWZ1bmN0aW9uKHQpe2kudG9nZ2xlUGxheSh0KX0sdGhpcy5mcmFtZS5uZXh0Lm9uY2xpY2s9ZnVuY3Rpb24odCl7aS5uZXh0KHQpfX10aGlzLm9uQ2hhbmdlQ2FsbGJhY2s9dm9pZCAwLHRoaXMudmFsdWVzPVtdLHRoaXMuaW5kZXg9dm9pZCAwLHRoaXMucGxheVRpbWVvdXQ9dm9pZCAwLHRoaXMucGxheUludGVydmFsPTFlMyx0aGlzLnBsYXlMb29wPSEwfXZhciBuPWkoMSk7by5wcm90b3R5cGUucHJldj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0SW5kZXgoKTt0PjAmJih0LS0sdGhpcy5zZXRJbmRleCh0KSl9LG8ucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldEluZGV4KCk7dDx0aGlzLnZhbHVlcy5sZW5ndGgtMSYmKHQrKyx0aGlzLnNldEluZGV4KHQpKX0sby5wcm90b3R5cGUucGxheU5leHQ9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgRGF0ZSxlPXRoaXMuZ2V0SW5kZXgoKTtlPHRoaXMudmFsdWVzLmxlbmd0aC0xPyhlKyssdGhpcy5zZXRJbmRleChlKSk6dGhpcy5wbGF5TG9vcCYmKGU9MCx0aGlzLnNldEluZGV4KGUpKTt2YXIgaT1uZXcgRGF0ZSxvPWktdCxuPU1hdGgubWF4KHRoaXMucGxheUludGVydmFsLW8sMCkscz10aGlzO3RoaXMucGxheVRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe3MucGxheU5leHQoKX0sbil9LG8ucHJvdG90eXBlLnRvZ2dsZVBsYXk9ZnVuY3Rpb24oKXt2b2lkIDA9PT10aGlzLnBsYXlUaW1lb3V0P3RoaXMucGxheSgpOnRoaXMuc3RvcCgpfSxvLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dGhpcy5wbGF5VGltZW91dHx8KHRoaXMucGxheU5leHQoKSx0aGlzLmZyYW1lJiYodGhpcy5mcmFtZS5wbGF5LnZhbHVlPSJTdG9wIikpfSxvLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbCh0aGlzLnBsYXlUaW1lb3V0KSx0aGlzLnBsYXlUaW1lb3V0PXZvaWQgMCx0aGlzLmZyYW1lJiYodGhpcy5mcmFtZS5wbGF5LnZhbHVlPSJQbGF5Iil9LG8ucHJvdG90eXBlLnNldE9uQ2hhbmdlQ2FsbGJhY2s9ZnVuY3Rpb24odCl7dGhpcy5vbkNoYW5nZUNhbGxiYWNrPXR9LG8ucHJvdG90eXBlLnNldFBsYXlJbnRlcnZhbD1mdW5jdGlvbih0KXt0aGlzLnBsYXlJbnRlcnZhbD10fSxvLnByb3RvdHlwZS5nZXRQbGF5SW50ZXJ2YWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucGxheUludGVydmFsfSxvLnByb3RvdHlwZS5zZXRQbGF5TG9vcD1mdW5jdGlvbih0KXt0aGlzLnBsYXlMb29wPXR9LG8ucHJvdG90eXBlLm9uQ2hhbmdlPWZ1bmN0aW9uKCl7dm9pZCAwIT09dGhpcy5vbkNoYW5nZUNhbGxiYWNrJiZ0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKX0sby5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7aWYodGhpcy5mcmFtZSl7dGhpcy5mcmFtZS5iYXIuc3R5bGUudG9wPXRoaXMuZnJhbWUuY2xpZW50SGVpZ2h0LzItdGhpcy5mcmFtZS5iYXIub2Zmc2V0SGVpZ2h0LzIrInB4Iix0aGlzLmZyYW1lLmJhci5zdHlsZS53aWR0aD10aGlzLmZyYW1lLmNsaWVudFdpZHRoLXRoaXMuZnJhbWUucHJldi5jbGllbnRXaWR0aC10aGlzLmZyYW1lLnBsYXkuY2xpZW50V2lkdGgtdGhpcy5mcmFtZS5uZXh0LmNsaWVudFdpZHRoLTMwKyJweCI7dmFyIHQ9dGhpcy5pbmRleFRvTGVmdCh0aGlzLmluZGV4KTt0aGlzLmZyYW1lLnNsaWRlLnN0eWxlLmxlZnQ9dCsicHgifX0sby5wcm90b3R5cGUuc2V0VmFsdWVzPWZ1bmN0aW9uKHQpe3RoaXMudmFsdWVzPXQsdGhpcy52YWx1ZXMubGVuZ3RoPjA/dGhpcy5zZXRJbmRleCgwKTp0aGlzLmluZGV4PXZvaWQgMH0sby5wcm90b3R5cGUuc2V0SW5kZXg9ZnVuY3Rpb24odCl7aWYoISh0PHRoaXMudmFsdWVzLmxlbmd0aCkpdGhyb3cgbmV3IEVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTt0aGlzLmluZGV4PXQsdGhpcy5yZWRyYXcoKSx0aGlzLm9uQ2hhbmdlKCl9LG8ucHJvdG90eXBlLmdldEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5kZXh9LG8ucHJvdG90eXBlLmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlc1t0aGlzLmluZGV4XX0sby5wcm90b3R5cGUuX29uTW91c2VEb3duPWZ1bmN0aW9uKHQpe3ZhciBlPXQud2hpY2g/MT09PXQud2hpY2g6MT09PXQuYnV0dG9uO2lmKGUpe3RoaXMuc3RhcnRDbGllbnRYPXQuY2xpZW50WCx0aGlzLnN0YXJ0U2xpZGVYPXBhcnNlRmxvYXQodGhpcy5mcmFtZS5zbGlkZS5zdHlsZS5sZWZ0KSx0aGlzLmZyYW1lLnN0eWxlLmN1cnNvcj0ibW92ZSI7dmFyIGk9dGhpczt0aGlzLm9ubW91c2Vtb3ZlPWZ1bmN0aW9uKHQpe2kuX29uTW91c2VNb3ZlKHQpfSx0aGlzLm9ubW91c2V1cD1mdW5jdGlvbih0KXtpLl9vbk1vdXNlVXAodCl9LG4uYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2Vtb3ZlIix0aGlzLm9ubW91c2Vtb3ZlKSxuLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNldXAiLHRoaXMub25tb3VzZXVwKSxuLnByZXZlbnREZWZhdWx0KHQpfX0sby5wcm90b3R5cGUubGVmdFRvSW5kZXg9ZnVuY3Rpb24odCl7dmFyIGU9cGFyc2VGbG9hdCh0aGlzLmZyYW1lLmJhci5zdHlsZS53aWR0aCktdGhpcy5mcmFtZS5zbGlkZS5jbGllbnRXaWR0aC0xMCxpPXQtMyxvPU1hdGgucm91bmQoaS9lKih0aGlzLnZhbHVlcy5sZW5ndGgtMSkpO3JldHVybiBvPDAmJihvPTApLG8+dGhpcy52YWx1ZXMubGVuZ3RoLTEmJihvPXRoaXMudmFsdWVzLmxlbmd0aC0xKSxvfSxvLnByb3RvdHlwZS5pbmRleFRvTGVmdD1mdW5jdGlvbih0KXt2YXIgZT1wYXJzZUZsb2F0KHRoaXMuZnJhbWUuYmFyLnN0eWxlLndpZHRoKS10aGlzLmZyYW1lLnNsaWRlLmNsaWVudFdpZHRoLTEwLGk9dC8odGhpcy52YWx1ZXMubGVuZ3RoLTEpKmUsbz1pKzM7cmV0dXJuIG99LG8ucHJvdG90eXBlLl9vbk1vdXNlTW92ZT1mdW5jdGlvbih0KXt2YXIgZT10LmNsaWVudFgtdGhpcy5zdGFydENsaWVudFgsaT10aGlzLnN0YXJ0U2xpZGVYK2Usbz10aGlzLmxlZnRUb0luZGV4KGkpO3RoaXMuc2V0SW5kZXgobyksbi5wcmV2ZW50RGVmYXVsdCgpfSxvLnByb3RvdHlwZS5fb25Nb3VzZVVwPWZ1bmN0aW9uKHQpe3RoaXMuZnJhbWUuc3R5bGUuY3Vyc29yPSJhdXRvIixuLnJlbW92ZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNlbW92ZSIsdGhpcy5vbm1vdXNlbW92ZSksbi5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZXVwIix0aGlzLm9ubW91c2V1cCksbi5wcmV2ZW50RGVmYXVsdCgpfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBpKHQsZSxpLG8pe3RoaXMuX3N0YXJ0PTAsdGhpcy5fZW5kPTAsdGhpcy5fc3RlcD0xLHRoaXMucHJldHR5U3RlcD0hMCx0aGlzLnByZWNpc2lvbj01LHRoaXMuX2N1cnJlbnQ9MCx0aGlzLnNldFJhbmdlKHQsZSxpLG8pfWkucHJvdG90eXBlLmlzTnVtZXJpYz1mdW5jdGlvbih0KXtyZXR1cm4haXNOYU4ocGFyc2VGbG9hdCh0KSkmJmlzRmluaXRlKHQpfSxpLnByb3RvdHlwZS5zZXRSYW5nZT1mdW5jdGlvbih0LGUsaSxvKXtpZighdGhpcy5pc051bWVyaWModCkpdGhyb3cgbmV3IEVycm9yKCJQYXJhbWV0ZXIgJ3N0YXJ0JyBpcyBub3QgbnVtZXJpYzsgdmFsdWU6ICIrdCk7aWYoIXRoaXMuaXNOdW1lcmljKGUpKXRocm93IG5ldyBFcnJvcigiUGFyYW1ldGVyICdlbmQnIGlzIG5vdCBudW1lcmljOyB2YWx1ZTogIit0KTtpZighdGhpcy5pc051bWVyaWMoaSkpdGhyb3cgbmV3IEVycm9yKCJQYXJhbWV0ZXIgJ3N0ZXAnIGlzIG5vdCBudW1lcmljOyB2YWx1ZTogIit0KTt0aGlzLl9zdGFydD10P3Q6MCx0aGlzLl9lbmQ9ZT9lOjAsdGhpcy5zZXRTdGVwKGksbyl9LGkucHJvdG90eXBlLnNldFN0ZXA9ZnVuY3Rpb24odCxlKXt2b2lkIDA9PT10fHx0PD0wfHwodm9pZCAwIT09ZSYmKHRoaXMucHJldHR5U3RlcD1lKSx0aGlzLnByZXR0eVN0ZXA9PT0hMD90aGlzLl9zdGVwPWkuY2FsY3VsYXRlUHJldHR5U3RlcCh0KTp0aGlzLl9zdGVwPXQpfSxpLmNhbGN1bGF0ZVByZXR0eVN0ZXA9ZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgubG9nKHQpL01hdGguTE4xMH0saT1NYXRoLnBvdygxMCxNYXRoLnJvdW5kKGUodCkpKSxvPTIqTWF0aC5wb3coMTAsTWF0aC5yb3VuZChlKHQvMikpKSxuPTUqTWF0aC5wb3coMTAsTWF0aC5yb3VuZChlKHQvNSkpKSxzPWk7cmV0dXJuIE1hdGguYWJzKG8tdCk8PU1hdGguYWJzKHMtdCkmJihzPW8pLE1hdGguYWJzKG4tdCk8PU1hdGguYWJzKHMtdCkmJihzPW4pLHM8PTAmJihzPTEpLHN9LGkucHJvdG90eXBlLmdldEN1cnJlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gcGFyc2VGbG9hdCh0aGlzLl9jdXJyZW50LnRvUHJlY2lzaW9uKHRoaXMucHJlY2lzaW9uKSl9LGkucHJvdG90eXBlLmdldFN0ZXA9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3RlcH0saS5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24odCl7dm9pZCAwPT09dCYmKHQ9ITEpLHRoaXMuX2N1cnJlbnQ9dGhpcy5fc3RhcnQtdGhpcy5fc3RhcnQldGhpcy5fc3RlcCx0JiZ0aGlzLmdldEN1cnJlbnQoKTx0aGlzLl9zdGFydCYmdGhpcy5uZXh0KCl9LGkucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXt0aGlzLl9jdXJyZW50Kz10aGlzLl9zdGVwfSxpLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY3VycmVudD50aGlzLl9lbmR9LHQuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkoKXt0aGlzLm1pbj12b2lkIDAsdGhpcy5tYXg9dm9pZCAwfWkucHJvdG90eXBlLmFkanVzdD1mdW5jdGlvbih0KXt2b2lkIDAhPT10JiYoKHZvaWQgMD09PXRoaXMubWlufHx0aGlzLm1pbj50KSYmKHRoaXMubWluPXQpLCh2b2lkIDA9PT10aGlzLm1heHx8dGhpcy5tYXg8dCkmJih0aGlzLm1heD10KSl9LGkucHJvdG90eXBlLmNvbWJpbmU9ZnVuY3Rpb24odCl7dGhpcy5hZGQodC5taW4pLHRoaXMuYWRkKHQubWF4KX0saS5wcm90b3R5cGUuZXhwYW5kPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQpe3ZhciBlPXRoaXMubWluLXQsaT10aGlzLm1heCt0O2lmKGU+aSl0aHJvdyBuZXcgRXJyb3IoIlBhc3NlZCBleHBhbnNpb24gdmFsdWUgbWFrZXMgcmFuZ2UgaW52YWxpZCIpO3RoaXMubWluPWUsdGhpcy5tYXg9aX19LGkucHJvdG90eXBlLnJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF4LXRoaXMubWlufSxpLnByb3RvdHlwZS5jZW50ZXI9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5taW4rdGhpcy5tYXgpLzJ9LHQuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtmb3IodmFyIGUgaW4gdClpZih0Lmhhc093blByb3BlcnR5KGUpKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIG4odCl7cmV0dXJuIHZvaWQgMD09PXR8fCIiPT09dD90OnQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKX1mdW5jdGlvbiBzKHQsZSl7cmV0dXJuIHZvaWQgMD09PXR8fCIiPT09dD9lOnQrbihlKX1mdW5jdGlvbiByKHQsZSxpLG8pe3ZhciBuLHI7Zm9yKHZhciBhIGluIGkpbj1pW2FdLHI9cyhvLG4pLGVbcl09dFtuXX1mdW5jdGlvbiBhKHQsZSxpLG8pe3ZhciBuLHI7Zm9yKHZhciBhIGluIGkpbj1pW2FdLHZvaWQgMCE9PXRbbl0mJihyPXMobyxuKSxlW3JdPXRbbl0pfWZ1bmN0aW9uIGgodCxlKXtpZih2b2lkIDA9PT10fHxvKHQpKXRocm93IG5ldyBFcnJvcigiTm8gREVGQVVMVFMgcGFzc2VkIik7aWYodm9pZCAwPT09ZSl0aHJvdyBuZXcgRXJyb3IoIk5vIGRzdCBwYXNzZWQiKTtEPXQscih0LGUsaykscih0LGUsTywiZGVmYXVsdCIpLGwodCxlKSxlLm1hcmdpbj0xMCxlLnNob3dHcmF5Qm90dG9tPSExLGUuc2hvd1Rvb2x0aXA9ITEsZS5leWU9bmV3IF8oMCwwLC0xKX1mdW5jdGlvbiBkKHQsZSl7aWYodm9pZCAwIT09dCl7aWYodm9pZCAwPT09ZSl0aHJvdyBuZXcgRXJyb3IoIk5vIGRzdCBwYXNzZWQiKTtpZih2b2lkIDA9PT1EfHxvKEQpKXRocm93IG5ldyBFcnJvcigiREVGQVVMVFMgbm90IHNldCBmb3IgbW9kdWxlIFNldHRpbmdzIik7YSh0LGUsayksYSh0LGUsTywiZGVmYXVsdCIpLGwodCxlKX19ZnVuY3Rpb24gbCh0LGUpe3ZvaWQgMCE9PXQuYmFja2dyb3VuZENvbG9yJiZtKHQuYmFja2dyb3VuZENvbG9yLGUpLHYodC5kYXRhQ29sb3IsZSksZih0LnN0eWxlLGUpLGModC5zaG93TGVnZW5kLGUpLGcodC5jYW1lcmFQb3NpdGlvbixlKSx2b2lkIDAhPT10LnRvb2x0aXAmJihlLnNob3dUb29sdGlwPXQudG9vbHRpcCl9ZnVuY3Rpb24gYyh0LGUpe2lmKHZvaWQgMD09PXQpe3ZhciBpPXZvaWQgMD09PUQuc2hvd0xlZ2VuZDtpZihpKXt2YXIgbz1lLnN0eWxlPT09dy5ET1RDT0xPUnx8ZS5zdHlsZT09PXcuRE9UU0laRTtlLnNob3dMZWdlbmQ9b319ZWxzZSBlLnNob3dMZWdlbmQ9dH1mdW5jdGlvbiB1KHQpe3ZhciBlPXhbdF07cmV0dXJuIHZvaWQgMD09PWU/LTE6ZX1mdW5jdGlvbiBwKHQpe3ZhciBlPSExO2Zvcih2YXIgaSBpbiB3KWlmKHdbaV09PT10KXtlPSEwO2JyZWFrfXJldHVybiBlfWZ1bmN0aW9uIGYodCxlKXtpZih2b2lkIDAhPT10KXt2YXIgaTtpZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKGk9dSh0KSxpPT09LTEpdGhyb3cgbmV3IEVycm9yKCJTdHlsZSAnIit0KyInIGlzIGludmFsaWQiKX1lbHNle2lmKCFwKHQpKXRocm93IG5ldyBFcnJvcigiU3R5bGUgJyIrdCsiJyBpcyBpbnZhbGlkIik7aT10fWUuc3R5bGU9aX19ZnVuY3Rpb24gbSh0LGUpe3ZhciBpPSJ3aGl0ZSIsbz0iZ3JheSIsbj0xO2lmKCJzdHJpbmciPT10eXBlb2YgdClpPXQsbz0ibm9uZSIsbj0wO2Vsc2V7aWYoIm9iamVjdCIhPT0oInVuZGVmaW5lZCI9PXR5cGVvZiB0PyJ1bmRlZmluZWQiOnkodCkpKXRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgdHlwZSBvZiBiYWNrZ3JvdW5kQ29sb3IiKTt2b2lkIDAhPT10LmZpbGwmJihpPXQuZmlsbCksdm9pZCAwIT09dC5zdHJva2UmJihvPXQuc3Ryb2tlKSx2b2lkIDAhPT10LnN0cm9rZVdpZHRoJiYobj10LnN0cm9rZVdpZHRoKX1lLmZyYW1lLnN0eWxlLmJhY2tncm91bmRDb2xvcj1pLGUuZnJhbWUuc3R5bGUuYm9yZGVyQ29sb3I9byxlLmZyYW1lLnN0eWxlLmJvcmRlcldpZHRoPW4rInB4IixlLmZyYW1lLnN0eWxlLmJvcmRlclN0eWxlPSJzb2xpZCJ9ZnVuY3Rpb24gdih0LGUpe3ZvaWQgMCE9PXQmJih2b2lkIDA9PT1lLmRhdGFDb2xvciYmKGUuZGF0YUNvbG9yPXt9KSwic3RyaW5nIj09dHlwZW9mIHQ/KGUuZGF0YUNvbG9yLmZpbGw9dCxlLmRhdGFDb2xvci5zdHJva2U9dCk6KHQuZmlsbCYmKGUuZGF0YUNvbG9yLmZpbGw9dC5maWxsKSx0LnN0cm9rZSYmKGUuZGF0YUNvbG9yLnN0cm9rZT10LnN0cm9rZSksdm9pZCAwIT09dC5zdHJva2VXaWR0aCYmKGUuZGF0YUNvbG9yLnN0cm9rZVdpZHRoPXQuc3Ryb2tlV2lkdGgpKSl9ZnVuY3Rpb24gZyh0LGUpe3ZhciBpPXQ7dm9pZCAwIT09aSYmKHZvaWQgMD09PWUuY2FtZXJhJiYoZS5jYW1lcmE9bmV3IGIpLGUuY2FtZXJhLnNldEFybVJvdGF0aW9uKGkuaG9yaXpvbnRhbCxpLnZlcnRpY2FsKSxlLmNhbWVyYS5zZXRBcm1MZW5ndGgoaS5kaXN0YW5jZSkpfXZhciB5PSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSxiPWkoMTYpLF89aSgxNCksdz17QkFSOjAsQkFSQ09MT1I6MSxCQVJTSVpFOjIsRE9UOjMsRE9UTElORTo0LERPVENPTE9SOjUsRE9UU0laRTo2LEdSSUQ6NyxMSU5FOjgsU1VSRkFDRTo5fSx4PXtkb3Q6dy5ET1QsImRvdC1saW5lIjp3LkRPVExJTkUsImRvdC1jb2xvciI6dy5ET1RDT0xPUiwiZG90LXNpemUiOncuRE9UU0laRSxsaW5lOncuTElORSxncmlkOncuR1JJRCxzdXJmYWNlOncuU1VSRkFDRSxiYXI6dy5CQVIsImJhci1jb2xvciI6dy5CQVJDT0xPUiwiYmFyLXNpemUiOncuQkFSU0laRX0saz1bIndpZHRoIiwiaGVpZ2h0IiwiZmlsdGVyTGFiZWwiLCJsZWdlbmRMYWJlbCIsInhMYWJlbCIsInlMYWJlbCIsInpMYWJlbCIsInhWYWx1ZUxhYmVsIiwieVZhbHVlTGFiZWwiLCJ6VmFsdWVMYWJlbCIsInNob3dHcmlkIiwic2hvd1BlcnNwZWN0aXZlIiwic2hvd1NoYWRvdyIsImtlZXBBc3BlY3RSYXRpbyIsInZlcnRpY2FsUmF0aW8iLCJkb3RTaXplUmF0aW8iLCJzaG93QW5pbWF0aW9uQ29udHJvbHMiLCJhbmltYXRpb25JbnRlcnZhbCIsImFuaW1hdGlvblByZWxvYWQiLCJhbmltYXRpb25BdXRvU3RhcnQiLCJheGlzQ29sb3IiLCJncmlkQ29sb3IiLCJ4Q2VudGVyIiwieUNlbnRlciJdLE89WyJ4QmFyV2lkdGgiLCJ5QmFyV2lkdGgiLCJ2YWx1ZU1pbiIsInZhbHVlTWF4IiwieE1pbiIsInhNYXgiLCJ4U3RlcCIsInlNaW4iLCJ5TWF4IiwieVN0ZXAiLCJ6TWluIiwiek1heCIsInpTdGVwIl0sRD12b2lkIDA7dC5leHBvcnRzLlNUWUxFPXcsdC5leHBvcnRzLnNldERlZmF1bHRzPWgsdC5leHBvcnRzLnNldE9wdGlvbnM9ZCx0LmV4cG9ydHMuc2V0Q2FtZXJhUG9zaXRpb249Z30sZnVuY3Rpb24odCxlLGkpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93KXt2YXIgbz1pKDIzKSxuPXdpbmRvdy5IYW1tZXJ8fGkoMjQpO3QuZXhwb3J0cz1vKG4se3ByZXZlbnREZWZhdWx0OiJtb3VzZSJ9KX1lbHNlIHQuZXhwb3J0cz1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJoYW1tZXIuanMgaXMgb25seSBhdmFpbGFibGUgaW4gYSBicm93c2VyLCBub3QgaW4gbm9kZS5qcy4iKX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbyxuLHM7IWZ1bmN0aW9uKGkpe249W10sbz1pLHM9ImZ1bmN0aW9uIj09dHlwZW9mIG8/by5hcHBseShlLG4pOm8sISh2b2lkIDAhPT1zJiYodC5leHBvcnRzPXMpKX0oZnVuY3Rpb24oKXt2YXIgdD1udWxsO3JldHVybiBmdW5jdGlvbiBlKGksbyl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gdC5tYXRjaCgvW14gXSsvZyl9ZnVuY3Rpb24gcyhlKXtpZigiaGFtbWVyLmlucHV0IiE9PWUudHlwZSl7aWYoZS5zcmNFdmVudC5faGFuZGxlZHx8KGUuc3JjRXZlbnQuX2hhbmRsZWQ9e30pLGUuc3JjRXZlbnQuX2hhbmRsZWRbZS50eXBlXSlyZXR1cm47ZS5zcmNFdmVudC5faGFuZGxlZFtlLnR5cGVdPSEwfXZhciBpPSExO2Uuc3RvcFByb3BhZ2F0aW9uPWZ1bmN0aW9uKCl7aT0hMH07dmFyIG89ZS5zcmNFdmVudC5zdG9wUHJvcGFnYXRpb24uYmluZChlLnNyY0V2ZW50KTsiZnVuY3Rpb24iPT10eXBlb2YgbyYmKGUuc3JjRXZlbnQuc3RvcFByb3BhZ2F0aW9uPWZ1bmN0aW9uKCl7bygpLGUuc3RvcFByb3BhZ2F0aW9uKCl9KSxlLmZpcnN0VGFyZ2V0PXQ7Zm9yKHZhciBuPXQ7biYmIWk7KXt2YXIgcz1uLmhhbW1lcjtpZihzKWZvcih2YXIgcixhPTA7YTxzLmxlbmd0aDthKyspaWYocj1zW2FdLl9oYW5kbGVyc1tlLnR5cGVdKWZvcih2YXIgaD0wO2g8ci5sZW5ndGgmJiFpO2grKylyW2hdKGUpO249bi5wYXJlbnROb2RlfX12YXIgcj1vfHx7cHJldmVudERlZmF1bHQ6ITF9O2lmKGkuTWFuYWdlcil7dmFyIGE9aSxoPWZ1bmN0aW9uKHQsaSl7dmFyIG89T2JqZWN0LmNyZWF0ZShyKTtyZXR1cm4gaSYmYS5hc3NpZ24obyxpKSxlKG5ldyBhKHQsbyksbyl9O3JldHVybiBhLmFzc2lnbihoLGEpLGguTWFuYWdlcj1mdW5jdGlvbih0LGkpe3ZhciBvPU9iamVjdC5jcmVhdGUocik7cmV0dXJuIGkmJmEuYXNzaWduKG8saSksZShuZXcgYS5NYW5hZ2VyKHQsbyksbyl9LGh9dmFyIGQ9T2JqZWN0LmNyZWF0ZShpKSxsPWkuZWxlbWVudDtyZXR1cm4gbC5oYW1tZXJ8fChsLmhhbW1lcj1bXSksbC5oYW1tZXIucHVzaChkKSxpLm9uKCJoYW1tZXIuaW5wdXQiLGZ1bmN0aW9uKGUpe3IucHJldmVudERlZmF1bHQhPT0hMCYmci5wcmV2ZW50RGVmYXVsdCE9PWUucG9pbnRlclR5cGV8fGUucHJldmVudERlZmF1bHQoKSxlLmlzRmlyc3QmJih0PWUudGFyZ2V0KX0pLGQuX2hhbmRsZXJzPXt9LGQub249ZnVuY3Rpb24odCxlKXtyZXR1cm4gbih0KS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBvPWQuX2hhbmRsZXJzW3RdO298fChkLl9oYW5kbGVyc1t0XT1vPVtdLGkub24odCxzKSksby5wdXNoKGUpfSksZH0sZC5vZmY9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbih0KS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBvPWQuX2hhbmRsZXJzW3RdO28mJihvPWU/by5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQhPT1lfSk6W10sby5sZW5ndGg+MD9kLl9oYW5kbGVyc1t0XT1vOihpLm9mZih0LHMpLGRlbGV0ZSBkLl9oYW5kbGVyc1t0XSkpfSksZH0sZC5lbWl0PWZ1bmN0aW9uKGUsbyl7dD1vLnRhcmdldCxpLmVtaXQoZSxvKX0sZC5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIHQ9aS5lbGVtZW50LmhhbW1lcixlPXQuaW5kZXhPZihkKTtlIT09LTEmJnQuc3BsaWNlKGUsMSksdC5sZW5ndGh8fGRlbGV0ZSBpLmVsZW1lbnQuaGFtbWVyLGQuX2hhbmRsZXJzPXt9LGkuZGVzdHJveSgpfSxkfX0pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG87IWZ1bmN0aW9uKG4scyxyLGEpe2Z1bmN0aW9uIGgodCxlLGkpe3JldHVybiBzZXRUaW1lb3V0KHAodCxpKSxlKX1mdW5jdGlvbiBkKHQsZSxpKXtyZXR1cm4hIUFycmF5LmlzQXJyYXkodCkmJihsKHQsaVtlXSxpKSwhMCl9ZnVuY3Rpb24gbCh0LGUsaSl7dmFyIG87aWYodClpZih0LmZvckVhY2gpdC5mb3JFYWNoKGUsaSk7ZWxzZSBpZih0Lmxlbmd0aCE9PWEpZm9yKG89MDtvPHQubGVuZ3RoOyllLmNhbGwoaSx0W29dLG8sdCksbysrO2Vsc2UgZm9yKG8gaW4gdCl0Lmhhc093blByb3BlcnR5KG8pJiZlLmNhbGwoaSx0W29dLG8sdCl9ZnVuY3Rpb24gYyh0LGUsaSl7dmFyIG89IkRFUFJFQ0FURUQgTUVUSE9EOiAiK2UrIlxuIitpKyIgQVQgXG4iO3JldHVybiBmdW5jdGlvbigpe3ZhciBlPW5ldyBFcnJvcigiZ2V0LXN0YWNrLXRyYWNlIiksaT1lJiZlLnN0YWNrP2Uuc3RhY2sucmVwbGFjZSgvXlteXChdKz9bXG4kXS9nbSwiIikucmVwbGFjZSgvXlxzK2F0XHMrL2dtLCIiKS5yZXBsYWNlKC9eT2JqZWN0Ljxhbm9ueW1vdXM+XHMqXCgvZ20sInthbm9ueW1vdXN9KClAIik6IlVua25vd24gU3RhY2sgVHJhY2UiLHM9bi5jb25zb2xlJiYobi5jb25zb2xlLndhcm58fG4uY29uc29sZS5sb2cpO3JldHVybiBzJiZzLmNhbGwobi5jb25zb2xlLG8saSksdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIHUodCxlLGkpe3ZhciBvLG49ZS5wcm90b3R5cGU7bz10LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4pLG8uY29uc3RydWN0b3I9dCxvLl9zdXBlcj1uLGkmJm10KG8saSl9ZnVuY3Rpb24gcCh0LGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmFwcGx5KGUsYXJndW1lbnRzKX19ZnVuY3Rpb24gZih0LGUpe3JldHVybiB0eXBlb2YgdD09eXQ/dC5hcHBseShlP2VbMF18fGE6YSxlKTp0fWZ1bmN0aW9uIG0odCxlKXtyZXR1cm4gdD09PWE/ZTp0fWZ1bmN0aW9uIHYodCxlLGkpe2woXyhlKSxmdW5jdGlvbihlKXt0LmFkZEV2ZW50TGlzdGVuZXIoZSxpLCExKX0pfWZ1bmN0aW9uIGcodCxlLGkpe2woXyhlKSxmdW5jdGlvbihlKXt0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSxpLCExKX0pfWZ1bmN0aW9uIHkodCxlKXtmb3IoO3Q7KXtpZih0PT1lKXJldHVybiEwO3Q9dC5wYXJlbnROb2RlfXJldHVybiExfWZ1bmN0aW9uIGIodCxlKXtyZXR1cm4gdC5pbmRleE9mKGUpPi0xfWZ1bmN0aW9uIF8odCl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9ccysvZyl9ZnVuY3Rpb24gdyh0LGUsaSl7aWYodC5pbmRleE9mJiYhaSlyZXR1cm4gdC5pbmRleE9mKGUpO2Zvcih2YXIgbz0wO288dC5sZW5ndGg7KXtpZihpJiZ0W29dW2ldPT1lfHwhaSYmdFtvXT09PWUpcmV0dXJuIG87bysrfXJldHVybi0xfWZ1bmN0aW9uIHgodCl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQsMCl9ZnVuY3Rpb24gayh0LGUsaSl7Zm9yKHZhciBvPVtdLG49W10scz0wO3M8dC5sZW5ndGg7KXt2YXIgcj1lP3Rbc11bZV06dFtzXTt3KG4scik8MCYmby5wdXNoKHRbc10pLG5bc109cixzKyt9cmV0dXJuIGkmJihvPWU/by5zb3J0KGZ1bmN0aW9uKHQsaSl7cmV0dXJuIHRbZV0+aVtlXX0pOm8uc29ydCgpKSxvfWZ1bmN0aW9uIE8odCxlKXtmb3IodmFyIGksbyxuPWVbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpLHM9MDtzPHZ0Lmxlbmd0aDspe2lmKGk9dnRbc10sbz1pP2krbjplLG8gaW4gdClyZXR1cm4gbztzKyt9cmV0dXJuIGF9ZnVuY3Rpb24gRCgpe3JldHVybiBPdCsrfWZ1bmN0aW9uIFModCl7dmFyIGU9dC5vd25lckRvY3VtZW50fHx0O3JldHVybiBlLmRlZmF1bHRWaWV3fHxlLnBhcmVudFdpbmRvd3x8bjsKfWZ1bmN0aW9uIEModCxlKXt2YXIgaT10aGlzO3RoaXMubWFuYWdlcj10LHRoaXMuY2FsbGJhY2s9ZSx0aGlzLmVsZW1lbnQ9dC5lbGVtZW50LHRoaXMudGFyZ2V0PXQub3B0aW9ucy5pbnB1dFRhcmdldCx0aGlzLmRvbUhhbmRsZXI9ZnVuY3Rpb24oZSl7Zih0Lm9wdGlvbnMuZW5hYmxlLFt0XSkmJmkuaGFuZGxlcihlKX0sdGhpcy5pbml0KCl9ZnVuY3Rpb24gVCh0KXt2YXIgZSxpPXQub3B0aW9ucy5pbnB1dENsYXNzO3JldHVybiBuZXcoZT1pP2k6Q3Q/VzpUdD9WOlN0P3E6SCkodCxFKX1mdW5jdGlvbiBFKHQsZSxpKXt2YXIgbz1pLnBvaW50ZXJzLmxlbmd0aCxuPWkuY2hhbmdlZFBvaW50ZXJzLmxlbmd0aCxzPWUmUnQmJm8tbj09PTAscj1lJih6dHxBdCkmJm8tbj09PTA7aS5pc0ZpcnN0PSEhcyxpLmlzRmluYWw9ISFyLHMmJih0LnNlc3Npb249e30pLGkuZXZlbnRUeXBlPWUsTSh0LGkpLHQuZW1pdCgiaGFtbWVyLmlucHV0IixpKSx0LnJlY29nbml6ZShpKSx0LnNlc3Npb24ucHJldklucHV0PWl9ZnVuY3Rpb24gTSh0LGUpe3ZhciBpPXQuc2Vzc2lvbixvPWUucG9pbnRlcnMsbj1vLmxlbmd0aDtpLmZpcnN0SW5wdXR8fChpLmZpcnN0SW5wdXQ9TihlKSksbj4xJiYhaS5maXJzdE11bHRpcGxlP2kuZmlyc3RNdWx0aXBsZT1OKGUpOjE9PT1uJiYoaS5maXJzdE11bHRpcGxlPSExKTt2YXIgcz1pLmZpcnN0SW5wdXQscj1pLmZpcnN0TXVsdGlwbGUsYT1yP3IuY2VudGVyOnMuY2VudGVyLGg9ZS5jZW50ZXI9UihvKTtlLnRpbWVTdGFtcD13dCgpLGUuZGVsdGFUaW1lPWUudGltZVN0YW1wLXMudGltZVN0YW1wLGUuYW5nbGU9QihhLGgpLGUuZGlzdGFuY2U9QShhLGgpLFAoaSxlKSxlLm9mZnNldERpcmVjdGlvbj16KGUuZGVsdGFYLGUuZGVsdGFZKTt2YXIgZD1MKGUuZGVsdGFUaW1lLGUuZGVsdGFYLGUuZGVsdGFZKTtlLm92ZXJhbGxWZWxvY2l0eVg9ZC54LGUub3ZlcmFsbFZlbG9jaXR5WT1kLnksZS5vdmVyYWxsVmVsb2NpdHk9X3QoZC54KT5fdChkLnkpP2QueDpkLnksZS5zY2FsZT1yP0Yoci5wb2ludGVycyxvKToxLGUucm90YXRpb249cj9qKHIucG9pbnRlcnMsbyk6MCxlLm1heFBvaW50ZXJzPWkucHJldklucHV0P2UucG9pbnRlcnMubGVuZ3RoPmkucHJldklucHV0Lm1heFBvaW50ZXJzP2UucG9pbnRlcnMubGVuZ3RoOmkucHJldklucHV0Lm1heFBvaW50ZXJzOmUucG9pbnRlcnMubGVuZ3RoLEkoaSxlKTt2YXIgbD10LmVsZW1lbnQ7eShlLnNyY0V2ZW50LnRhcmdldCxsKSYmKGw9ZS5zcmNFdmVudC50YXJnZXQpLGUudGFyZ2V0PWx9ZnVuY3Rpb24gUCh0LGUpe3ZhciBpPWUuY2VudGVyLG89dC5vZmZzZXREZWx0YXx8e30sbj10LnByZXZEZWx0YXx8e30scz10LnByZXZJbnB1dHx8e307ZS5ldmVudFR5cGUhPT1SdCYmcy5ldmVudFR5cGUhPT16dHx8KG49dC5wcmV2RGVsdGE9e3g6cy5kZWx0YVh8fDAseTpzLmRlbHRhWXx8MH0sbz10Lm9mZnNldERlbHRhPXt4OmkueCx5OmkueX0pLGUuZGVsdGFYPW4ueCsoaS54LW8ueCksZS5kZWx0YVk9bi55KyhpLnktby55KX1mdW5jdGlvbiBJKHQsZSl7dmFyIGksbyxuLHMscj10Lmxhc3RJbnRlcnZhbHx8ZSxoPWUudGltZVN0YW1wLXIudGltZVN0YW1wO2lmKGUuZXZlbnRUeXBlIT1BdCYmKGg+TnR8fHIudmVsb2NpdHk9PT1hKSl7dmFyIGQ9ZS5kZWx0YVgtci5kZWx0YVgsbD1lLmRlbHRhWS1yLmRlbHRhWSxjPUwoaCxkLGwpO289Yy54LG49Yy55LGk9X3QoYy54KT5fdChjLnkpP2MueDpjLnkscz16KGQsbCksdC5sYXN0SW50ZXJ2YWw9ZX1lbHNlIGk9ci52ZWxvY2l0eSxvPXIudmVsb2NpdHlYLG49ci52ZWxvY2l0eVkscz1yLmRpcmVjdGlvbjtlLnZlbG9jaXR5PWksZS52ZWxvY2l0eVg9byxlLnZlbG9jaXR5WT1uLGUuZGlyZWN0aW9uPXN9ZnVuY3Rpb24gTih0KXtmb3IodmFyIGU9W10saT0wO2k8dC5wb2ludGVycy5sZW5ndGg7KWVbaV09e2NsaWVudFg6YnQodC5wb2ludGVyc1tpXS5jbGllbnRYKSxjbGllbnRZOmJ0KHQucG9pbnRlcnNbaV0uY2xpZW50WSl9LGkrKztyZXR1cm57dGltZVN0YW1wOnd0KCkscG9pbnRlcnM6ZSxjZW50ZXI6UihlKSxkZWx0YVg6dC5kZWx0YVgsZGVsdGFZOnQuZGVsdGFZfX1mdW5jdGlvbiBSKHQpe3ZhciBlPXQubGVuZ3RoO2lmKDE9PT1lKXJldHVybnt4OmJ0KHRbMF0uY2xpZW50WCkseTpidCh0WzBdLmNsaWVudFkpfTtmb3IodmFyIGk9MCxvPTAsbj0wO248ZTspaSs9dFtuXS5jbGllbnRYLG8rPXRbbl0uY2xpZW50WSxuKys7cmV0dXJue3g6YnQoaS9lKSx5OmJ0KG8vZSl9fWZ1bmN0aW9uIEwodCxlLGkpe3JldHVybnt4OmUvdHx8MCx5OmkvdHx8MH19ZnVuY3Rpb24geih0LGUpe3JldHVybiB0PT09ZT9CdDpfdCh0KT49X3QoZSk/dDwwP2p0OkZ0OmU8MD9IdDpXdH1mdW5jdGlvbiBBKHQsZSxpKXtpfHwoaT1VdCk7dmFyIG89ZVtpWzBdXS10W2lbMF1dLG49ZVtpWzFdXS10W2lbMV1dO3JldHVybiBNYXRoLnNxcnQobypvK24qbil9ZnVuY3Rpb24gQih0LGUsaSl7aXx8KGk9VXQpO3ZhciBvPWVbaVswXV0tdFtpWzBdXSxuPWVbaVsxXV0tdFtpWzFdXTtyZXR1cm4gMTgwKk1hdGguYXRhbjIobixvKS9NYXRoLlBJfWZ1bmN0aW9uIGoodCxlKXtyZXR1cm4gQihlWzFdLGVbMF0scXQpK0IodFsxXSx0WzBdLHF0KX1mdW5jdGlvbiBGKHQsZSl7cmV0dXJuIEEoZVswXSxlWzFdLHF0KS9BKHRbMF0sdFsxXSxxdCl9ZnVuY3Rpb24gSCgpe3RoaXMuZXZFbD1adCx0aGlzLmV2V2luPUt0LHRoaXMucHJlc3NlZD0hMSxDLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBXKCl7dGhpcy5ldkVsPSR0LHRoaXMuZXZXaW49dGUsQy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5zdG9yZT10aGlzLm1hbmFnZXIuc2Vzc2lvbi5wb2ludGVyRXZlbnRzPVtdfWZ1bmN0aW9uIFkoKXt0aGlzLmV2VGFyZ2V0PWllLHRoaXMuZXZXaW49b2UsdGhpcy5zdGFydGVkPSExLEMuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIEcodCxlKXt2YXIgaT14KHQudG91Y2hlcyksbz14KHQuY2hhbmdlZFRvdWNoZXMpO3JldHVybiBlJih6dHxBdCkmJihpPWsoaS5jb25jYXQobyksImlkZW50aWZpZXIiLCEwKSksW2ksb119ZnVuY3Rpb24gVigpe3RoaXMuZXZUYXJnZXQ9c2UsdGhpcy50YXJnZXRJZHM9e30sQy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gVSh0LGUpe3ZhciBpPXgodC50b3VjaGVzKSxvPXRoaXMudGFyZ2V0SWRzO2lmKGUmKFJ0fEx0KSYmMT09PWkubGVuZ3RoKXJldHVybiBvW2lbMF0uaWRlbnRpZmllcl09ITAsW2ksaV07dmFyIG4scyxyPXgodC5jaGFuZ2VkVG91Y2hlcyksYT1bXSxoPXRoaXMudGFyZ2V0O2lmKHM9aS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHkodC50YXJnZXQsaCl9KSxlPT09UnQpZm9yKG49MDtuPHMubGVuZ3RoOylvW3Nbbl0uaWRlbnRpZmllcl09ITAsbisrO2ZvcihuPTA7bjxyLmxlbmd0aDspb1tyW25dLmlkZW50aWZpZXJdJiZhLnB1c2gocltuXSksZSYoenR8QXQpJiZkZWxldGUgb1tyW25dLmlkZW50aWZpZXJdLG4rKztyZXR1cm4gYS5sZW5ndGg/W2socy5jb25jYXQoYSksImlkZW50aWZpZXIiLCEwKSxhXTp2b2lkIDB9ZnVuY3Rpb24gcSgpe0MuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciB0PXAodGhpcy5oYW5kbGVyLHRoaXMpO3RoaXMudG91Y2g9bmV3IFYodGhpcy5tYW5hZ2VyLHQpLHRoaXMubW91c2U9bmV3IEgodGhpcy5tYW5hZ2VyLHQpLHRoaXMucHJpbWFyeVRvdWNoPW51bGwsdGhpcy5sYXN0VG91Y2hlcz1bXX1mdW5jdGlvbiBYKHQsZSl7dCZSdD8odGhpcy5wcmltYXJ5VG91Y2g9ZS5jaGFuZ2VkUG9pbnRlcnNbMF0uaWRlbnRpZmllcixaLmNhbGwodGhpcyxlKSk6dCYoenR8QXQpJiZaLmNhbGwodGhpcyxlKX1mdW5jdGlvbiBaKHQpe3ZhciBlPXQuY2hhbmdlZFBvaW50ZXJzWzBdO2lmKGUuaWRlbnRpZmllcj09PXRoaXMucHJpbWFyeVRvdWNoKXt2YXIgaT17eDplLmNsaWVudFgseTplLmNsaWVudFl9O3RoaXMubGFzdFRvdWNoZXMucHVzaChpKTt2YXIgbz10aGlzLmxhc3RUb3VjaGVzLG49ZnVuY3Rpb24oKXt2YXIgdD1vLmluZGV4T2YoaSk7dD4tMSYmby5zcGxpY2UodCwxKX07c2V0VGltZW91dChuLHJlKX19ZnVuY3Rpb24gSyh0KXtmb3IodmFyIGU9dC5zcmNFdmVudC5jbGllbnRYLGk9dC5zcmNFdmVudC5jbGllbnRZLG89MDtvPHRoaXMubGFzdFRvdWNoZXMubGVuZ3RoO28rKyl7dmFyIG49dGhpcy5sYXN0VG91Y2hlc1tvXSxzPU1hdGguYWJzKGUtbi54KSxyPU1hdGguYWJzKGktbi55KTtpZihzPD1hZSYmcjw9YWUpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gSih0LGUpe3RoaXMubWFuYWdlcj10LHRoaXMuc2V0KGUpfWZ1bmN0aW9uIFEodCl7aWYoYih0LHBlKSlyZXR1cm4gcGU7dmFyIGU9Yih0LGZlKSxpPWIodCxtZSk7cmV0dXJuIGUmJmk/cGU6ZXx8aT9lP2ZlOm1lOmIodCx1ZSk/dWU6Y2V9ZnVuY3Rpb24gJCgpe2lmKCFkZSlyZXR1cm4hMTt2YXIgdD17fSxlPW4uQ1NTJiZuLkNTUy5zdXBwb3J0cztyZXR1cm5bImF1dG8iLCJtYW5pcHVsYXRpb24iLCJwYW4teSIsInBhbi14IiwicGFuLXggcGFuLXkiLCJub25lIl0uZm9yRWFjaChmdW5jdGlvbihpKXt0W2ldPSFlfHxuLkNTUy5zdXBwb3J0cygidG91Y2gtYWN0aW9uIixpKX0pLHR9ZnVuY3Rpb24gdHQodCl7dGhpcy5vcHRpb25zPW10KHt9LHRoaXMuZGVmYXVsdHMsdHx8e30pLHRoaXMuaWQ9RCgpLHRoaXMubWFuYWdlcj1udWxsLHRoaXMub3B0aW9ucy5lbmFibGU9bSh0aGlzLm9wdGlvbnMuZW5hYmxlLCEwKSx0aGlzLnN0YXRlPWdlLHRoaXMuc2ltdWx0YW5lb3VzPXt9LHRoaXMucmVxdWlyZUZhaWw9W119ZnVuY3Rpb24gZXQodCl7cmV0dXJuIHQmeGU/ImNhbmNlbCI6dCZfZT8iZW5kIjp0JmJlPyJtb3ZlIjp0JnllPyJzdGFydCI6IiJ9ZnVuY3Rpb24gaXQodCl7cmV0dXJuIHQ9PVd0PyJkb3duIjp0PT1IdD8idXAiOnQ9PWp0PyJsZWZ0Ijp0PT1GdD8icmlnaHQiOiIifWZ1bmN0aW9uIG90KHQsZSl7dmFyIGk9ZS5tYW5hZ2VyO3JldHVybiBpP2kuZ2V0KHQpOnR9ZnVuY3Rpb24gbnQoKXt0dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gc3QoKXtudC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5wWD1udWxsLHRoaXMucFk9bnVsbH1mdW5jdGlvbiBydCgpe250LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBhdCgpe3R0LmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl90aW1lcj1udWxsLHRoaXMuX2lucHV0PW51bGx9ZnVuY3Rpb24gaHQoKXtudC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gZHQoKXtudC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gbHQoKXt0dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5wVGltZT0hMSx0aGlzLnBDZW50ZXI9ITEsdGhpcy5fdGltZXI9bnVsbCx0aGlzLl9pbnB1dD1udWxsLHRoaXMuY291bnQ9MH1mdW5jdGlvbiBjdCh0LGUpe3JldHVybiBlPWV8fHt9LGUucmVjb2duaXplcnM9bShlLnJlY29nbml6ZXJzLGN0LmRlZmF1bHRzLnByZXNldCksbmV3IHV0KHQsZSl9ZnVuY3Rpb24gdXQodCxlKXt0aGlzLm9wdGlvbnM9bXQoe30sY3QuZGVmYXVsdHMsZXx8e30pLHRoaXMub3B0aW9ucy5pbnB1dFRhcmdldD10aGlzLm9wdGlvbnMuaW5wdXRUYXJnZXR8fHQsdGhpcy5oYW5kbGVycz17fSx0aGlzLnNlc3Npb249e30sdGhpcy5yZWNvZ25pemVycz1bXSx0aGlzLm9sZENzc1Byb3BzPXt9LHRoaXMuZWxlbWVudD10LHRoaXMuaW5wdXQ9VCh0aGlzKSx0aGlzLnRvdWNoQWN0aW9uPW5ldyBKKHRoaXMsdGhpcy5vcHRpb25zLnRvdWNoQWN0aW9uKSxwdCh0aGlzLCEwKSxsKHRoaXMub3B0aW9ucy5yZWNvZ25pemVycyxmdW5jdGlvbih0KXt2YXIgZT10aGlzLmFkZChuZXcgdFswXSh0WzFdKSk7dFsyXSYmZS5yZWNvZ25pemVXaXRoKHRbMl0pLHRbM10mJmUucmVxdWlyZUZhaWx1cmUodFszXSl9LHRoaXMpfWZ1bmN0aW9uIHB0KHQsZSl7dmFyIGk9dC5lbGVtZW50O2lmKGkuc3R5bGUpe3ZhciBvO2wodC5vcHRpb25zLmNzc1Byb3BzLGZ1bmN0aW9uKG4scyl7bz1PKGkuc3R5bGUscyksZT8odC5vbGRDc3NQcm9wc1tvXT1pLnN0eWxlW29dLGkuc3R5bGVbb109bik6aS5zdHlsZVtvXT10Lm9sZENzc1Byb3BzW29dfHwiIn0pLGV8fCh0Lm9sZENzc1Byb3BzPXt9KX19ZnVuY3Rpb24gZnQodCxlKXt2YXIgaT1zLmNyZWF0ZUV2ZW50KCJFdmVudCIpO2kuaW5pdEV2ZW50KHQsITAsITApLGkuZ2VzdHVyZT1lLGUudGFyZ2V0LmRpc3BhdGNoRXZlbnQoaSl9dmFyIG10LHZ0PVsiIiwid2Via2l0IiwiTW96IiwiTVMiLCJtcyIsIm8iXSxndD1zLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHl0PSJmdW5jdGlvbiIsYnQ9TWF0aC5yb3VuZCxfdD1NYXRoLmFicyx3dD1EYXRlLm5vdzttdD0iZnVuY3Rpb24iIT10eXBlb2YgT2JqZWN0LmFzc2lnbj9mdW5jdGlvbih0KXtpZih0PT09YXx8bnVsbD09PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Iik7Zm9yKHZhciBlPU9iamVjdCh0KSxpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIG89YXJndW1lbnRzW2ldO2lmKG8hPT1hJiZudWxsIT09bylmb3IodmFyIG4gaW4gbylvLmhhc093blByb3BlcnR5KG4pJiYoZVtuXT1vW25dKX1yZXR1cm4gZX06T2JqZWN0LmFzc2lnbjt2YXIgeHQ9YyhmdW5jdGlvbih0LGUsaSl7Zm9yKHZhciBvPU9iamVjdC5rZXlzKGUpLG49MDtuPG8ubGVuZ3RoOykoIWl8fGkmJnRbb1tuXV09PT1hKSYmKHRbb1tuXV09ZVtvW25dXSksbisrO3JldHVybiB0fSwiZXh0ZW5kIiwiVXNlIGBhc3NpZ25gLiIpLGt0PWMoZnVuY3Rpb24odCxlKXtyZXR1cm4geHQodCxlLCEwKX0sIm1lcmdlIiwiVXNlIGBhc3NpZ25gLiIpLE90PTEsRHQ9L21vYmlsZXx0YWJsZXR8aXAoYWR8aG9uZXxvZCl8YW5kcm9pZC9pLFN0PSJvbnRvdWNoc3RhcnQiaW4gbixDdD1PKG4sIlBvaW50ZXJFdmVudCIpIT09YSxUdD1TdCYmRHQudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxFdD0idG91Y2giLE10PSJwZW4iLFB0PSJtb3VzZSIsSXQ9ImtpbmVjdCIsTnQ9MjUsUnQ9MSxMdD0yLHp0PTQsQXQ9OCxCdD0xLGp0PTIsRnQ9NCxIdD04LFd0PTE2LFl0PWp0fEZ0LEd0PUh0fFd0LFZ0PVl0fEd0LFV0PVsieCIsInkiXSxxdD1bImNsaWVudFgiLCJjbGllbnRZIl07Qy5wcm90b3R5cGU9e2hhbmRsZXI6ZnVuY3Rpb24oKXt9LGluaXQ6ZnVuY3Rpb24oKXt0aGlzLmV2RWwmJnYodGhpcy5lbGVtZW50LHRoaXMuZXZFbCx0aGlzLmRvbUhhbmRsZXIpLHRoaXMuZXZUYXJnZXQmJnYodGhpcy50YXJnZXQsdGhpcy5ldlRhcmdldCx0aGlzLmRvbUhhbmRsZXIpLHRoaXMuZXZXaW4mJnYoUyh0aGlzLmVsZW1lbnQpLHRoaXMuZXZXaW4sdGhpcy5kb21IYW5kbGVyKX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZXZFbCYmZyh0aGlzLmVsZW1lbnQsdGhpcy5ldkVsLHRoaXMuZG9tSGFuZGxlciksdGhpcy5ldlRhcmdldCYmZyh0aGlzLnRhcmdldCx0aGlzLmV2VGFyZ2V0LHRoaXMuZG9tSGFuZGxlciksdGhpcy5ldldpbiYmZyhTKHRoaXMuZWxlbWVudCksdGhpcy5ldldpbix0aGlzLmRvbUhhbmRsZXIpfX07dmFyIFh0PXttb3VzZWRvd246UnQsbW91c2Vtb3ZlOkx0LG1vdXNldXA6enR9LFp0PSJtb3VzZWRvd24iLEt0PSJtb3VzZW1vdmUgbW91c2V1cCI7dShILEMse2hhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIGU9WHRbdC50eXBlXTtlJlJ0JiYwPT09dC5idXR0b24mJih0aGlzLnByZXNzZWQ9ITApLGUmTHQmJjEhPT10LndoaWNoJiYoZT16dCksdGhpcy5wcmVzc2VkJiYoZSZ6dCYmKHRoaXMucHJlc3NlZD0hMSksdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsZSx7cG9pbnRlcnM6W3RdLGNoYW5nZWRQb2ludGVyczpbdF0scG9pbnRlclR5cGU6UHQsc3JjRXZlbnQ6dH0pKX19KTt2YXIgSnQ9e3BvaW50ZXJkb3duOlJ0LHBvaW50ZXJtb3ZlOkx0LHBvaW50ZXJ1cDp6dCxwb2ludGVyY2FuY2VsOkF0LHBvaW50ZXJvdXQ6QXR9LFF0PXsyOkV0LDM6TXQsNDpQdCw1Okl0fSwkdD0icG9pbnRlcmRvd24iLHRlPSJwb2ludGVybW92ZSBwb2ludGVydXAgcG9pbnRlcmNhbmNlbCI7bi5NU1BvaW50ZXJFdmVudCYmIW4uUG9pbnRlckV2ZW50JiYoJHQ9Ik1TUG9pbnRlckRvd24iLHRlPSJNU1BvaW50ZXJNb3ZlIE1TUG9pbnRlclVwIE1TUG9pbnRlckNhbmNlbCIpLHUoVyxDLHtoYW5kbGVyOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc3RvcmUsaT0hMSxvPXQudHlwZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoIm1zIiwiIiksbj1KdFtvXSxzPVF0W3QucG9pbnRlclR5cGVdfHx0LnBvaW50ZXJUeXBlLHI9cz09RXQsYT13KGUsdC5wb2ludGVySWQsInBvaW50ZXJJZCIpO24mUnQmJigwPT09dC5idXR0b258fHIpP2E8MCYmKGUucHVzaCh0KSxhPWUubGVuZ3RoLTEpOm4mKHp0fEF0KSYmKGk9ITApLGE8MHx8KGVbYV09dCx0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlcixuLHtwb2ludGVyczplLGNoYW5nZWRQb2ludGVyczpbdF0scG9pbnRlclR5cGU6cyxzcmNFdmVudDp0fSksaSYmZS5zcGxpY2UoYSwxKSl9fSk7dmFyIGVlPXt0b3VjaHN0YXJ0OlJ0LHRvdWNobW92ZTpMdCx0b3VjaGVuZDp6dCx0b3VjaGNhbmNlbDpBdH0saWU9InRvdWNoc3RhcnQiLG9lPSJ0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbCI7dShZLEMse2hhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIGU9ZWVbdC50eXBlXTtpZihlPT09UnQmJih0aGlzLnN0YXJ0ZWQ9ITApLHRoaXMuc3RhcnRlZCl7dmFyIGk9Ry5jYWxsKHRoaXMsdCxlKTtlJih6dHxBdCkmJmlbMF0ubGVuZ3RoLWlbMV0ubGVuZ3RoPT09MCYmKHRoaXMuc3RhcnRlZD0hMSksdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsZSx7cG9pbnRlcnM6aVswXSxjaGFuZ2VkUG9pbnRlcnM6aVsxXSxwb2ludGVyVHlwZTpFdCxzcmNFdmVudDp0fSl9fX0pO3ZhciBuZT17dG91Y2hzdGFydDpSdCx0b3VjaG1vdmU6THQsdG91Y2hlbmQ6enQsdG91Y2hjYW5jZWw6QXR9LHNlPSJ0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbCI7dShWLEMse2hhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIGU9bmVbdC50eXBlXSxpPVUuY2FsbCh0aGlzLHQsZSk7aSYmdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsZSx7cG9pbnRlcnM6aVswXSxjaGFuZ2VkUG9pbnRlcnM6aVsxXSxwb2ludGVyVHlwZTpFdCxzcmNFdmVudDp0fSl9fSk7dmFyIHJlPTI1MDAsYWU9MjU7dShxLEMse2hhbmRsZXI6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkucG9pbnRlclR5cGU9PUV0LG49aS5wb2ludGVyVHlwZT09UHQ7aWYoIShuJiZpLnNvdXJjZUNhcGFiaWxpdGllcyYmaS5zb3VyY2VDYXBhYmlsaXRpZXMuZmlyZXNUb3VjaEV2ZW50cykpe2lmKG8pWC5jYWxsKHRoaXMsZSxpKTtlbHNlIGlmKG4mJksuY2FsbCh0aGlzLGkpKXJldHVybjt0aGlzLmNhbGxiYWNrKHQsZSxpKX19LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLnRvdWNoLmRlc3Ryb3koKSx0aGlzLm1vdXNlLmRlc3Ryb3koKX19KTt2YXIgaGU9TyhndC5zdHlsZSwidG91Y2hBY3Rpb24iKSxkZT1oZSE9PWEsbGU9ImNvbXB1dGUiLGNlPSJhdXRvIix1ZT0ibWFuaXB1bGF0aW9uIixwZT0ibm9uZSIsZmU9InBhbi14IixtZT0icGFuLXkiLHZlPSQoKTtKLnByb3RvdHlwZT17c2V0OmZ1bmN0aW9uKHQpe3Q9PWxlJiYodD10aGlzLmNvbXB1dGUoKSksZGUmJnRoaXMubWFuYWdlci5lbGVtZW50LnN0eWxlJiZ2ZVt0XSYmKHRoaXMubWFuYWdlci5lbGVtZW50LnN0eWxlW2hlXT10KSx0aGlzLmFjdGlvbnM9dC50b0xvd2VyQ2FzZSgpLnRyaW0oKX0sdXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5zZXQodGhpcy5tYW5hZ2VyLm9wdGlvbnMudG91Y2hBY3Rpb24pfSxjb21wdXRlOmZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIGwodGhpcy5tYW5hZ2VyLnJlY29nbml6ZXJzLGZ1bmN0aW9uKGUpe2YoZS5vcHRpb25zLmVuYWJsZSxbZV0pJiYodD10LmNvbmNhdChlLmdldFRvdWNoQWN0aW9uKCkpKX0pLFEodC5qb2luKCIgIikpfSxwcmV2ZW50RGVmYXVsdHM6ZnVuY3Rpb24odCl7dmFyIGU9dC5zcmNFdmVudCxpPXQub2Zmc2V0RGlyZWN0aW9uO2lmKHRoaXMubWFuYWdlci5zZXNzaW9uLnByZXZlbnRlZClyZXR1cm4gdm9pZCBlLnByZXZlbnREZWZhdWx0KCk7dmFyIG89dGhpcy5hY3Rpb25zLG49YihvLHBlKSYmIXZlW3BlXSxzPWIobyxtZSkmJiF2ZVttZV0scj1iKG8sZmUpJiYhdmVbZmVdO2lmKG4pe3ZhciBhPTE9PT10LnBvaW50ZXJzLmxlbmd0aCxoPXQuZGlzdGFuY2U8MixkPXQuZGVsdGFUaW1lPDI1MDtpZihhJiZoJiZkKXJldHVybn1yZXR1cm4gciYmcz92b2lkIDA6bnx8cyYmaSZZdHx8ciYmaSZHdD90aGlzLnByZXZlbnRTcmMoZSk6dm9pZCAwfSxwcmV2ZW50U3JjOmZ1bmN0aW9uKHQpe3RoaXMubWFuYWdlci5zZXNzaW9uLnByZXZlbnRlZD0hMCx0LnByZXZlbnREZWZhdWx0KCl9fTt2YXIgZ2U9MSx5ZT0yLGJlPTQsX2U9OCx3ZT1fZSx4ZT0xNixrZT0zMjt0dC5wcm90b3R5cGU9e2RlZmF1bHRzOnt9LHNldDpmdW5jdGlvbih0KXtyZXR1cm4gbXQodGhpcy5vcHRpb25zLHQpLHRoaXMubWFuYWdlciYmdGhpcy5tYW5hZ2VyLnRvdWNoQWN0aW9uLnVwZGF0ZSgpLHRoaXN9LHJlY29nbml6ZVdpdGg6ZnVuY3Rpb24odCl7aWYoZCh0LCJyZWNvZ25pemVXaXRoIix0aGlzKSlyZXR1cm4gdGhpczt2YXIgZT10aGlzLnNpbXVsdGFuZW91cztyZXR1cm4gdD1vdCh0LHRoaXMpLGVbdC5pZF18fChlW3QuaWRdPXQsdC5yZWNvZ25pemVXaXRoKHRoaXMpKSx0aGlzfSxkcm9wUmVjb2duaXplV2l0aDpmdW5jdGlvbih0KXtyZXR1cm4gZCh0LCJkcm9wUmVjb2duaXplV2l0aCIsdGhpcyk/dGhpczoodD1vdCh0LHRoaXMpLGRlbGV0ZSB0aGlzLnNpbXVsdGFuZW91c1t0LmlkXSx0aGlzKX0scmVxdWlyZUZhaWx1cmU6ZnVuY3Rpb24odCl7aWYoZCh0LCJyZXF1aXJlRmFpbHVyZSIsdGhpcykpcmV0dXJuIHRoaXM7dmFyIGU9dGhpcy5yZXF1aXJlRmFpbDtyZXR1cm4gdD1vdCh0LHRoaXMpLHcoZSx0KT09PS0xJiYoZS5wdXNoKHQpLHQucmVxdWlyZUZhaWx1cmUodGhpcykpLHRoaXN9LGRyb3BSZXF1aXJlRmFpbHVyZTpmdW5jdGlvbih0KXtpZihkKHQsImRyb3BSZXF1aXJlRmFpbHVyZSIsdGhpcykpcmV0dXJuIHRoaXM7dD1vdCh0LHRoaXMpO3ZhciBlPXcodGhpcy5yZXF1aXJlRmFpbCx0KTtyZXR1cm4gZT4tMSYmdGhpcy5yZXF1aXJlRmFpbC5zcGxpY2UoZSwxKSx0aGlzfSxoYXNSZXF1aXJlRmFpbHVyZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXF1aXJlRmFpbC5sZW5ndGg+MH0sY2FuUmVjb2duaXplV2l0aDpmdW5jdGlvbih0KXtyZXR1cm4hIXRoaXMuc2ltdWx0YW5lb3VzW3QuaWRdfSxlbWl0OmZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7aS5tYW5hZ2VyLmVtaXQoZSx0KX12YXIgaT10aGlzLG89dGhpcy5zdGF0ZTtvPF9lJiZlKGkub3B0aW9ucy5ldmVudCtldChvKSksZShpLm9wdGlvbnMuZXZlbnQpLHQuYWRkaXRpb25hbEV2ZW50JiZlKHQuYWRkaXRpb25hbEV2ZW50KSxvPj1fZSYmZShpLm9wdGlvbnMuZXZlbnQrZXQobykpfSx0cnlFbWl0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNhbkVtaXQoKT90aGlzLmVtaXQodCk6dm9pZCh0aGlzLnN0YXRlPWtlKX0sY2FuRW1pdDpmdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5yZXF1aXJlRmFpbC5sZW5ndGg7KXtpZighKHRoaXMucmVxdWlyZUZhaWxbdF0uc3RhdGUmKGtlfGdlKSkpcmV0dXJuITE7dCsrfXJldHVybiEwfSxyZWNvZ25pemU6ZnVuY3Rpb24odCl7dmFyIGU9bXQoe30sdCk7cmV0dXJuIGYodGhpcy5vcHRpb25zLmVuYWJsZSxbdGhpcyxlXSk/KHRoaXMuc3RhdGUmKHdlfHhlfGtlKSYmKHRoaXMuc3RhdGU9Z2UpLHRoaXMuc3RhdGU9dGhpcy5wcm9jZXNzKGUpLHZvaWQodGhpcy5zdGF0ZSYoeWV8YmV8X2V8eGUpJiZ0aGlzLnRyeUVtaXQoZSkpKToodGhpcy5yZXNldCgpLHZvaWQodGhpcy5zdGF0ZT1rZSkpfSxwcm9jZXNzOmZ1bmN0aW9uKHQpe30sZ2V0VG91Y2hBY3Rpb246ZnVuY3Rpb24oKXt9LHJlc2V0OmZ1bmN0aW9uKCl7fX0sdShudCx0dCx7ZGVmYXVsdHM6e3BvaW50ZXJzOjF9LGF0dHJUZXN0OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9ucy5wb2ludGVycztyZXR1cm4gMD09PWV8fHQucG9pbnRlcnMubGVuZ3RoPT09ZX0scHJvY2VzczpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnN0YXRlLGk9dC5ldmVudFR5cGUsbz1lJih5ZXxiZSksbj10aGlzLmF0dHJUZXN0KHQpO3JldHVybiBvJiYoaSZBdHx8IW4pP2V8eGU6b3x8bj9pJnp0P2V8X2U6ZSZ5ZT9lfGJlOnllOmtlfX0pLHUoc3QsbnQse2RlZmF1bHRzOntldmVudDoicGFuIix0aHJlc2hvbGQ6MTAscG9pbnRlcnM6MSxkaXJlY3Rpb246VnR9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLmRpcmVjdGlvbixlPVtdO3JldHVybiB0Jll0JiZlLnB1c2gobWUpLHQmR3QmJmUucHVzaChmZSksZX0sZGlyZWN0aW9uVGVzdDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbnMsaT0hMCxvPXQuZGlzdGFuY2Usbj10LmRpcmVjdGlvbixzPXQuZGVsdGFYLHI9dC5kZWx0YVk7cmV0dXJuIG4mZS5kaXJlY3Rpb258fChlLmRpcmVjdGlvbiZZdD8obj0wPT09cz9CdDpzPDA/anQ6RnQsaT1zIT10aGlzLnBYLG89TWF0aC5hYnModC5kZWx0YVgpKToobj0wPT09cj9CdDpyPDA/SHQ6V3QsaT1yIT10aGlzLnBZLG89TWF0aC5hYnModC5kZWx0YVkpKSksdC5kaXJlY3Rpb249bixpJiZvPmUudGhyZXNob2xkJiZuJmUuZGlyZWN0aW9ufSxhdHRyVGVzdDpmdW5jdGlvbih0KXtyZXR1cm4gbnQucHJvdG90eXBlLmF0dHJUZXN0LmNhbGwodGhpcyx0KSYmKHRoaXMuc3RhdGUmeWV8fCEodGhpcy5zdGF0ZSZ5ZSkmJnRoaXMuZGlyZWN0aW9uVGVzdCh0KSl9LGVtaXQ6ZnVuY3Rpb24odCl7dGhpcy5wWD10LmRlbHRhWCx0aGlzLnBZPXQuZGVsdGFZO3ZhciBlPWl0KHQuZGlyZWN0aW9uKTtlJiYodC5hZGRpdGlvbmFsRXZlbnQ9dGhpcy5vcHRpb25zLmV2ZW50K2UpLHRoaXMuX3N1cGVyLmVtaXQuY2FsbCh0aGlzLHQpfX0pLHUocnQsbnQse2RlZmF1bHRzOntldmVudDoicGluY2giLHRocmVzaG9sZDowLHBvaW50ZXJzOjJ9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuW3BlXX0sYXR0clRlc3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3N1cGVyLmF0dHJUZXN0LmNhbGwodGhpcyx0KSYmKE1hdGguYWJzKHQuc2NhbGUtMSk+dGhpcy5vcHRpb25zLnRocmVzaG9sZHx8dGhpcy5zdGF0ZSZ5ZSl9LGVtaXQ6ZnVuY3Rpb24odCl7aWYoMSE9PXQuc2NhbGUpe3ZhciBlPXQuc2NhbGU8MT8iaW4iOiJvdXQiO3QuYWRkaXRpb25hbEV2ZW50PXRoaXMub3B0aW9ucy5ldmVudCtlfXRoaXMuX3N1cGVyLmVtaXQuY2FsbCh0aGlzLHQpfX0pLHUoYXQsdHQse2RlZmF1bHRzOntldmVudDoicHJlc3MiLHBvaW50ZXJzOjEsdGltZToyNTEsdGhyZXNob2xkOjl9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuW2NlXX0scHJvY2VzczpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbnMsaT10LnBvaW50ZXJzLmxlbmd0aD09PWUucG9pbnRlcnMsbz10LmRpc3RhbmNlPGUudGhyZXNob2xkLG49dC5kZWx0YVRpbWU+ZS50aW1lO2lmKHRoaXMuX2lucHV0PXQsIW98fCFpfHx0LmV2ZW50VHlwZSYoenR8QXQpJiYhbil0aGlzLnJlc2V0KCk7ZWxzZSBpZih0LmV2ZW50VHlwZSZSdCl0aGlzLnJlc2V0KCksdGhpcy5fdGltZXI9aChmdW5jdGlvbigpe3RoaXMuc3RhdGU9d2UsdGhpcy50cnlFbWl0KCl9LGUudGltZSx0aGlzKTtlbHNlIGlmKHQuZXZlbnRUeXBlJnp0KXJldHVybiB3ZTtyZXR1cm4ga2V9LHJlc2V0OmZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKX0sZW1pdDpmdW5jdGlvbih0KXt0aGlzLnN0YXRlPT09d2UmJih0JiZ0LmV2ZW50VHlwZSZ6dD90aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQrInVwIix0KToodGhpcy5faW5wdXQudGltZVN0YW1wPXd0KCksdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LHRoaXMuX2lucHV0KSkpfX0pLHUoaHQsbnQse2RlZmF1bHRzOntldmVudDoicm90YXRlIix0aHJlc2hvbGQ6MCxwb2ludGVyczoyfSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe3JldHVybltwZV19LGF0dHJUZXN0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsdCkmJihNYXRoLmFicyh0LnJvdGF0aW9uKT50aGlzLm9wdGlvbnMudGhyZXNob2xkfHx0aGlzLnN0YXRlJnllKX19KSx1KGR0LG50LHtkZWZhdWx0czp7ZXZlbnQ6InN3aXBlIix0aHJlc2hvbGQ6MTAsdmVsb2NpdHk6LjMsZGlyZWN0aW9uOll0fEd0LHBvaW50ZXJzOjF9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHN0LnByb3RvdHlwZS5nZXRUb3VjaEFjdGlvbi5jYWxsKHRoaXMpfSxhdHRyVGVzdDpmdW5jdGlvbih0KXt2YXIgZSxpPXRoaXMub3B0aW9ucy5kaXJlY3Rpb247cmV0dXJuIGkmKFl0fEd0KT9lPXQub3ZlcmFsbFZlbG9jaXR5OmkmWXQ/ZT10Lm92ZXJhbGxWZWxvY2l0eVg6aSZHdCYmKGU9dC5vdmVyYWxsVmVsb2NpdHlZKSx0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsdCkmJmkmdC5vZmZzZXREaXJlY3Rpb24mJnQuZGlzdGFuY2U+dGhpcy5vcHRpb25zLnRocmVzaG9sZCYmdC5tYXhQb2ludGVycz09dGhpcy5vcHRpb25zLnBvaW50ZXJzJiZfdChlKT50aGlzLm9wdGlvbnMudmVsb2NpdHkmJnQuZXZlbnRUeXBlJnp0fSxlbWl0OmZ1bmN0aW9uKHQpe3ZhciBlPWl0KHQub2Zmc2V0RGlyZWN0aW9uKTtlJiZ0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQrZSx0KSx0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQsdCl9fSksdShsdCx0dCx7ZGVmYXVsdHM6e2V2ZW50OiJ0YXAiLHBvaW50ZXJzOjEsdGFwczoxLGludGVydmFsOjMwMCx0aW1lOjI1MCx0aHJlc2hvbGQ6OSxwb3NUaHJlc2hvbGQ6MTB9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuW3VlXX0scHJvY2VzczpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbnMsaT10LnBvaW50ZXJzLmxlbmd0aD09PWUucG9pbnRlcnMsbz10LmRpc3RhbmNlPGUudGhyZXNob2xkLG49dC5kZWx0YVRpbWU8ZS50aW1lO2lmKHRoaXMucmVzZXQoKSx0LmV2ZW50VHlwZSZSdCYmMD09PXRoaXMuY291bnQpcmV0dXJuIHRoaXMuZmFpbFRpbWVvdXQoKTtpZihvJiZuJiZpKXtpZih0LmV2ZW50VHlwZSE9enQpcmV0dXJuIHRoaXMuZmFpbFRpbWVvdXQoKTt2YXIgcz0hdGhpcy5wVGltZXx8dC50aW1lU3RhbXAtdGhpcy5wVGltZTxlLmludGVydmFsLHI9IXRoaXMucENlbnRlcnx8QSh0aGlzLnBDZW50ZXIsdC5jZW50ZXIpPGUucG9zVGhyZXNob2xkO3RoaXMucFRpbWU9dC50aW1lU3RhbXAsdGhpcy5wQ2VudGVyPXQuY2VudGVyLHImJnM/dGhpcy5jb3VudCs9MTp0aGlzLmNvdW50PTEsdGhpcy5faW5wdXQ9dDt2YXIgYT10aGlzLmNvdW50JWUudGFwcztpZigwPT09YSlyZXR1cm4gdGhpcy5oYXNSZXF1aXJlRmFpbHVyZXMoKT8odGhpcy5fdGltZXI9aChmdW5jdGlvbigpe3RoaXMuc3RhdGU9d2UsdGhpcy50cnlFbWl0KCl9LGUuaW50ZXJ2YWwsdGhpcykseWUpOndlfXJldHVybiBrZX0sZmFpbFRpbWVvdXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGltZXI9aChmdW5jdGlvbigpe3RoaXMuc3RhdGU9a2V9LHRoaXMub3B0aW9ucy5pbnRlcnZhbCx0aGlzKSxrZX0scmVzZXQ6ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpfSxlbWl0OmZ1bmN0aW9uKCl7dGhpcy5zdGF0ZT09d2UmJih0aGlzLl9pbnB1dC50YXBDb3VudD10aGlzLmNvdW50LHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCx0aGlzLl9pbnB1dCkpfX0pLGN0LlZFUlNJT049IjIuMC43IixjdC5kZWZhdWx0cz17ZG9tRXZlbnRzOiExLHRvdWNoQWN0aW9uOmxlLGVuYWJsZTohMCxpbnB1dFRhcmdldDpudWxsLGlucHV0Q2xhc3M6bnVsbCxwcmVzZXQ6W1todCx7ZW5hYmxlOiExfV0sW3J0LHtlbmFibGU6ITF9LFsicm90YXRlIl1dLFtkdCx7ZGlyZWN0aW9uOll0fV0sW3N0LHtkaXJlY3Rpb246WXR9LFsic3dpcGUiXV0sW2x0XSxbbHQse2V2ZW50OiJkb3VibGV0YXAiLHRhcHM6Mn0sWyJ0YXAiXV0sW2F0XV0sY3NzUHJvcHM6e3VzZXJTZWxlY3Q6Im5vbmUiLHRvdWNoU2VsZWN0OiJub25lIix0b3VjaENhbGxvdXQ6Im5vbmUiLGNvbnRlbnRab29taW5nOiJub25lIix1c2VyRHJhZzoibm9uZSIsdGFwSGlnaGxpZ2h0Q29sb3I6InJnYmEoMCwwLDAsMCkifX07dmFyIE9lPTEsRGU9Mjt1dC5wcm90b3R5cGU9e3NldDpmdW5jdGlvbih0KXtyZXR1cm4gbXQodGhpcy5vcHRpb25zLHQpLHQudG91Y2hBY3Rpb24mJnRoaXMudG91Y2hBY3Rpb24udXBkYXRlKCksdC5pbnB1dFRhcmdldCYmKHRoaXMuaW5wdXQuZGVzdHJveSgpLHRoaXMuaW5wdXQudGFyZ2V0PXQuaW5wdXRUYXJnZXQsdGhpcy5pbnB1dC5pbml0KCkpLHRoaXN9LHN0b3A6ZnVuY3Rpb24odCl7dGhpcy5zZXNzaW9uLnN0b3BwZWQ9dD9EZTpPZX0scmVjb2duaXplOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc2Vzc2lvbjtpZighZS5zdG9wcGVkKXt0aGlzLnRvdWNoQWN0aW9uLnByZXZlbnREZWZhdWx0cyh0KTt2YXIgaSxvPXRoaXMucmVjb2duaXplcnMsbj1lLmN1clJlY29nbml6ZXI7KCFufHxuJiZuLnN0YXRlJndlKSYmKG49ZS5jdXJSZWNvZ25pemVyPW51bGwpO2Zvcih2YXIgcz0wO3M8by5sZW5ndGg7KWk9b1tzXSxlLnN0b3BwZWQ9PT1EZXx8biYmaSE9biYmIWkuY2FuUmVjb2duaXplV2l0aChuKT9pLnJlc2V0KCk6aS5yZWNvZ25pemUodCksIW4mJmkuc3RhdGUmKHllfGJlfF9lKSYmKG49ZS5jdXJSZWNvZ25pemVyPWkpLHMrK319LGdldDpmdW5jdGlvbih0KXtpZih0IGluc3RhbmNlb2YgdHQpcmV0dXJuIHQ7Zm9yKHZhciBlPXRoaXMucmVjb2duaXplcnMsaT0wO2k8ZS5sZW5ndGg7aSsrKWlmKGVbaV0ub3B0aW9ucy5ldmVudD09dClyZXR1cm4gZVtpXTtyZXR1cm4gbnVsbH0sYWRkOmZ1bmN0aW9uKHQpe2lmKGQodCwiYWRkIix0aGlzKSlyZXR1cm4gdGhpczt2YXIgZT10aGlzLmdldCh0Lm9wdGlvbnMuZXZlbnQpO3JldHVybiBlJiZ0aGlzLnJlbW92ZShlKSx0aGlzLnJlY29nbml6ZXJzLnB1c2godCksdC5tYW5hZ2VyPXRoaXMsdGhpcy50b3VjaEFjdGlvbi51cGRhdGUoKSx0fSxyZW1vdmU6ZnVuY3Rpb24odCl7aWYoZCh0LCJyZW1vdmUiLHRoaXMpKXJldHVybiB0aGlzO2lmKHQ9dGhpcy5nZXQodCkpe3ZhciBlPXRoaXMucmVjb2duaXplcnMsaT13KGUsdCk7aSE9PS0xJiYoZS5zcGxpY2UoaSwxKSx0aGlzLnRvdWNoQWN0aW9uLnVwZGF0ZSgpKX1yZXR1cm4gdGhpc30sb246ZnVuY3Rpb24odCxlKXtpZih0IT09YSYmZSE9PWEpe3ZhciBpPXRoaXMuaGFuZGxlcnM7cmV0dXJuIGwoXyh0KSxmdW5jdGlvbih0KXtpW3RdPWlbdF18fFtdLGlbdF0ucHVzaChlKX0pLHRoaXN9fSxvZmY6ZnVuY3Rpb24odCxlKXtpZih0IT09YSl7dmFyIGk9dGhpcy5oYW5kbGVycztyZXR1cm4gbChfKHQpLGZ1bmN0aW9uKHQpe2U/aVt0XSYmaVt0XS5zcGxpY2UodyhpW3RdLGUpLDEpOmRlbGV0ZSBpW3RdfSksdGhpc319LGVtaXQ6ZnVuY3Rpb24odCxlKXt0aGlzLm9wdGlvbnMuZG9tRXZlbnRzJiZmdCh0LGUpO3ZhciBpPXRoaXMuaGFuZGxlcnNbdF0mJnRoaXMuaGFuZGxlcnNbdF0uc2xpY2UoKTtpZihpJiZpLmxlbmd0aCl7ZS50eXBlPXQsZS5wcmV2ZW50RGVmYXVsdD1mdW5jdGlvbigpe2Uuc3JjRXZlbnQucHJldmVudERlZmF1bHQoKX07Zm9yKHZhciBvPTA7bzxpLmxlbmd0aDspaVtvXShlKSxvKyt9fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50JiZwdCh0aGlzLCExKSx0aGlzLmhhbmRsZXJzPXt9LHRoaXMuc2Vzc2lvbj17fSx0aGlzLmlucHV0LmRlc3Ryb3koKSx0aGlzLmVsZW1lbnQ9bnVsbH19LG10KGN0LHtJTlBVVF9TVEFSVDpSdCxJTlBVVF9NT1ZFOkx0LElOUFVUX0VORDp6dCxJTlBVVF9DQU5DRUw6QXQsU1RBVEVfUE9TU0lCTEU6Z2UsU1RBVEVfQkVHQU46eWUsU1RBVEVfQ0hBTkdFRDpiZSxTVEFURV9FTkRFRDpfZSxTVEFURV9SRUNPR05JWkVEOndlLFNUQVRFX0NBTkNFTExFRDp4ZSxTVEFURV9GQUlMRUQ6a2UsRElSRUNUSU9OX05PTkU6QnQsRElSRUNUSU9OX0xFRlQ6anQsRElSRUNUSU9OX1JJR0hUOkZ0LERJUkVDVElPTl9VUDpIdCxESVJFQ1RJT05fRE9XTjpXdCxESVJFQ1RJT05fSE9SSVpPTlRBTDpZdCxESVJFQ1RJT05fVkVSVElDQUw6R3QsRElSRUNUSU9OX0FMTDpWdCxNYW5hZ2VyOnV0LElucHV0OkMsVG91Y2hBY3Rpb246SixUb3VjaElucHV0OlYsTW91c2VJbnB1dDpILFBvaW50ZXJFdmVudElucHV0OlcsVG91Y2hNb3VzZUlucHV0OnEsU2luZ2xlVG91Y2hJbnB1dDpZLFJlY29nbml6ZXI6dHQsQXR0clJlY29nbml6ZXI6bnQsVGFwOmx0LFBhbjpzdCxTd2lwZTpkdCxQaW5jaDpydCxSb3RhdGU6aHQsUHJlc3M6YXQsb246dixvZmY6ZyxlYWNoOmwsbWVyZ2U6a3QsZXh0ZW5kOnh0LGFzc2lnbjptdCxpbmhlcml0OnUsYmluZEZuOnAscHJlZml4ZWQ6T30pO3ZhciBTZT0idW5kZWZpbmVkIiE9dHlwZW9mIG4/bjoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp7fTtTZS5IYW1tZXI9Y3Qsbz1mdW5jdGlvbigpe3JldHVybiBjdH0uY2FsbChlLGksZSx0KSwhKG8hPT1hJiYodC5leHBvcnRzPW8pKX0od2luZG93LGRvY3VtZW50LCJIYW1tZXIiKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvLG4sczshZnVuY3Rpb24oaSxyKXtuPVtdLG89cixzPSJmdW5jdGlvbiI9PXR5cGVvZiBvP28uYXBwbHkoZSxuKTpvLCEodm9pZCAwIT09cyYmKHQuZXhwb3J0cz1zKSl9KHRoaXMsZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBlLGk9dCYmdC5wcmV2ZW50RGVmYXVsdHx8ITEsbz10JiZ0LmNvbnRhaW5lcnx8d2luZG93LG49e30scz17a2V5ZG93bjp7fSxrZXl1cDp7fX0scj17fTtmb3IoZT05NztlPD0xMjI7ZSsrKXJbU3RyaW5nLmZyb21DaGFyQ29kZShlKV09e2NvZGU6NjUrKGUtOTcpLHNoaWZ0OiExfTtmb3IoZT02NTtlPD05MDtlKyspcltTdHJpbmcuZnJvbUNoYXJDb2RlKGUpXT17Y29kZTplLHNoaWZ0OiEwfTtmb3IoZT0wO2U8PTk7ZSsrKXJbIiIrZV09e2NvZGU6NDgrZSxzaGlmdDohMX07Zm9yKGU9MTtlPD0xMjtlKyspclsiRiIrZV09e2NvZGU6MTExK2Usc2hpZnQ6ITF9O2ZvcihlPTA7ZTw9OTtlKyspclsibnVtIitlXT17Y29kZTo5NitlLHNoaWZ0OiExfTtyWyJudW0qIl09e2NvZGU6MTA2LHNoaWZ0OiExfSxyWyJudW0rIl09e2NvZGU6MTA3LHNoaWZ0OiExfSxyWyJudW0tIl09e2NvZGU6MTA5LHNoaWZ0OiExfSxyWyJudW0vIl09e2NvZGU6MTExLHNoaWZ0OiExfSxyWyJudW0uIl09e2NvZGU6MTEwLHNoaWZ0OiExfSxyLmxlZnQ9e2NvZGU6Mzcsc2hpZnQ6ITF9LHIudXA9e2NvZGU6Mzgsc2hpZnQ6ITF9LHIucmlnaHQ9e2NvZGU6Mzksc2hpZnQ6ITF9LHIuZG93bj17Y29kZTo0MCxzaGlmdDohMX0sci5zcGFjZT17Y29kZTozMixzaGlmdDohMX0sci5lbnRlcj17Y29kZToxMyxzaGlmdDohMX0sci5zaGlmdD17Y29kZToxNixzaGlmdDp2b2lkIDB9LHIuZXNjPXtjb2RlOjI3LHNoaWZ0OiExfSxyLmJhY2tzcGFjZT17Y29kZTo4LHNoaWZ0OiExfSxyLnRhYj17Y29kZTo5LHNoaWZ0OiExfSxyLmN0cmw9e2NvZGU6MTcsc2hpZnQ6ITF9LHIuYWx0PXtjb2RlOjE4LHNoaWZ0OiExfSxyLmRlbGV0ZT17Y29kZTo0NixzaGlmdDohMX0sci5wYWdldXA9e2NvZGU6MzMsc2hpZnQ6ITF9LHIucGFnZWRvd249e2NvZGU6MzQsc2hpZnQ6ITF9LHJbIj0iXT17Y29kZToxODcsc2hpZnQ6ITF9LHJbIi0iXT17Y29kZToxODksc2hpZnQ6ITF9LHJbIl0iXT17Y29kZToyMjEsc2hpZnQ6ITF9LHJbIlsiXT17Y29kZToyMTksc2hpZnQ6ITF9O3ZhciBhPWZ1bmN0aW9uKHQpe2QodCwia2V5ZG93biIpfSxoPWZ1bmN0aW9uKHQpe2QodCwia2V5dXAiKX0sZD1mdW5jdGlvbih0LGUpe2lmKHZvaWQgMCE9PXNbZV1bdC5rZXlDb2RlXSl7Zm9yKHZhciBvPXNbZV1bdC5rZXlDb2RlXSxuPTA7bjxvLmxlbmd0aDtuKyspdm9pZCAwPT09b1tuXS5zaGlmdD9vW25dLmZuKHQpOjE9PW9bbl0uc2hpZnQmJjE9PXQuc2hpZnRLZXk/b1tuXS5mbih0KTowPT1vW25dLnNoaWZ0JiYwPT10LnNoaWZ0S2V5JiZvW25dLmZuKHQpOzE9PWkmJnQucHJldmVudERlZmF1bHQoKX19O3JldHVybiBuLmJpbmQ9ZnVuY3Rpb24odCxlLGkpe2lmKHZvaWQgMD09PWkmJihpPSJrZXlkb3duIiksdm9pZCAwPT09clt0XSl0aHJvdyBuZXcgRXJyb3IoInVuc3VwcG9ydGVkIGtleTogIit0KTt2b2lkIDA9PT1zW2ldW3JbdF0uY29kZV0mJihzW2ldW3JbdF0uY29kZV09W10pLHNbaV1bclt0XS5jb2RlXS5wdXNoKHtmbjplLHNoaWZ0OnJbdF0uc2hpZnR9KX0sbi5iaW5kQWxsPWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9ImtleWRvd24iKTtmb3IodmFyIGkgaW4gcilyLmhhc093blByb3BlcnR5KGkpJiZuLmJpbmQoaSx0LGUpfSxuLmdldEtleT1mdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gcilpZihyLmhhc093blByb3BlcnR5KGUpKXtpZigxPT10LnNoaWZ0S2V5JiYxPT1yW2VdLnNoaWZ0JiZ0LmtleUNvZGU9PXJbZV0uY29kZSlyZXR1cm4gZTtpZigwPT10LnNoaWZ0S2V5JiYwPT1yW2VdLnNoaWZ0JiZ0LmtleUNvZGU9PXJbZV0uY29kZSlyZXR1cm4gZTtpZih0LmtleUNvZGU9PXJbZV0uY29kZSYmInNoaWZ0Ij09ZSlyZXR1cm4gZX1yZXR1cm4idW5rbm93biBrZXksIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIn0sbi51bmJpbmQ9ZnVuY3Rpb24odCxlLGkpe2lmKHZvaWQgMD09PWkmJihpPSJrZXlkb3duIiksdm9pZCAwPT09clt0XSl0aHJvdyBuZXcgRXJyb3IoInVuc3VwcG9ydGVkIGtleTogIit0KTtpZih2b2lkIDAhPT1lKXt2YXIgbz1bXSxuPXNbaV1bclt0XS5jb2RlXTtpZih2b2lkIDAhPT1uKWZvcih2YXIgYT0wO2E8bi5sZW5ndGg7YSsrKW5bYV0uZm49PWUmJm5bYV0uc2hpZnQ9PXJbdF0uc2hpZnR8fG8ucHVzaChzW2ldW3JbdF0uY29kZV1bYV0pO3NbaV1bclt0XS5jb2RlXT1vfWVsc2Ugc1tpXVtyW3RdLmNvZGVdPVtdfSxuLnJlc2V0PWZ1bmN0aW9uKCl7cz17a2V5ZG93bjp7fSxrZXl1cDp7fX19LG4uZGVzdHJveT1mdW5jdGlvbigpe3M9e2tleWRvd246e30sa2V5dXA6e319LG8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsYSwhMCksby5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXl1cCIsaCwhMCl9LG8uYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsYSwhMCksby5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsaCwhMCksbn1yZXR1cm4gdH0pfSxmdW5jdGlvbih0LGUsaSl7ZS51dGlsPWkoMSksZS5ET011dGlsPWkoOCksZS5EYXRhU2V0PWkoOSksZS5EYXRhVmlldz1pKDExKSxlLlF1ZXVlPWkoMTApLGUuVGltZWxpbmU9aSgyNyksZS5HcmFwaDJkPWkoNTIpLGUudGltZWxpbmU9e0NvcmU6aSgzNSksRGF0ZVV0aWw6aSgzNCksUmFuZ2U6aSgzMiksc3RhY2s6aSgzOSksVGltZVN0ZXA6aSgzNyksY29tcG9uZW50czp7aXRlbXM6e0l0ZW06aSg0MSksQmFja2dyb3VuZEl0ZW06aSg0NSksQm94SXRlbTppKDQzKSxQb2ludEl0ZW06aSg0NCksUmFuZ2VJdGVtOmkoNDApfSxCYWNrZ3JvdW5kR3JvdXA6aSg0MiksQ29tcG9uZW50OmkoMzMpLEN1cnJlbnRUaW1lOmkoNTApLEN1c3RvbVRpbWU6aSg0OCksRGF0YUF4aXM6aSg1NCksRGF0YVNjYWxlOmkoNTUpLEdyYXBoR3JvdXA6aSg1NiksR3JvdXA6aSgzOCksSXRlbVNldDppKDM2KSxMZWdlbmQ6aSg2MCksTGluZUdyYXBoOmkoNTMpLFRpbWVBeGlzOmkoNDYpfX0sZS5tb21lbnQ9aSgyKSxlLkhhbW1lcj1pKDIyKSxlLmtleWNoYXJtPWkoMjUpfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZnVuY3Rpb24gbih0LGUsaSxvKXtpZighKHRoaXMgaW5zdGFuY2VvZiBuKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyBvcGVyYXRvciIpO2lmKCEoQXJyYXkuaXNBcnJheShpKXx8aSBpbnN0YW5jZW9mIGN8fGkgaW5zdGFuY2VvZiB1KSYmaSBpbnN0YW5jZW9mIE9iamVjdCl7dmFyIHM9bztvPWksaT1zfXZhciByPXRoaXM7aWYodGhpcy5kZWZhdWx0T3B0aW9ucz17c3RhcnQ6bnVsbCxlbmQ6bnVsbCxhdXRvUmVzaXplOiEwLG9yaWVudGF0aW9uOntheGlzOiJib3R0b20iLGl0ZW06ImJvdHRvbSJ9LG1vbWVudDpkLHdpZHRoOm51bGwsaGVpZ2h0Om51bGwsbWF4SGVpZ2h0Om51bGwsbWluSGVpZ2h0Om51bGx9LHRoaXMub3B0aW9ucz1sLmRlZXBFeHRlbmQoe30sdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5fY3JlYXRlKHQpLCFvfHxvJiYidW5kZWZpbmVkIj09dHlwZW9mIG8ucnRsKXtmb3IodmFyIGEsaD10aGlzLmRvbS5yb290OyFhJiZoOylhPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGgsbnVsbCkuZGlyZWN0aW9uLGg9aC5wYXJlbnRFbGVtZW50O3RoaXMub3B0aW9ucy5ydGw9YSYmInJ0bCI9PWEudG9Mb3dlckNhc2UoKX1lbHNlIHRoaXMub3B0aW9ucy5ydGw9by5ydGw7dGhpcy5jb21wb25lbnRzPVtdLHRoaXMuYm9keT17ZG9tOnRoaXMuZG9tLGRvbVByb3BzOnRoaXMucHJvcHMsZW1pdHRlcjp7b246dGhpcy5vbi5iaW5kKHRoaXMpLG9mZjp0aGlzLm9mZi5iaW5kKHRoaXMpLGVtaXQ6dGhpcy5lbWl0LmJpbmQodGhpcyl9LGhpZGRlbkRhdGVzOltdLHV0aWw6e2dldFNjYWxlOmZ1bmN0aW9uKCl7cmV0dXJuIHIudGltZUF4aXMuc3RlcC5zY2FsZX0sZ2V0U3RlcDpmdW5jdGlvbigpe3JldHVybiByLnRpbWVBeGlzLnN0ZXAuc3RlcH0sdG9TY3JlZW46ci5fdG9TY3JlZW4uYmluZChyKSx0b0dsb2JhbFNjcmVlbjpyLl90b0dsb2JhbFNjcmVlbi5iaW5kKHIpLHRvVGltZTpyLl90b1RpbWUuYmluZChyKSx0b0dsb2JhbFRpbWU6ci5fdG9HbG9iYWxUaW1lLmJpbmQocil9fSx0aGlzLnJhbmdlPW5ldyBwKHRoaXMuYm9keSx0aGlzLm9wdGlvbnMpLHRoaXMuY29tcG9uZW50cy5wdXNoKHRoaXMucmFuZ2UpLHRoaXMuYm9keS5yYW5nZT10aGlzLnJhbmdlLHRoaXMudGltZUF4aXM9bmV3IG0odGhpcy5ib2R5LHRoaXMub3B0aW9ucyksdGhpcy50aW1lQXhpczI9bnVsbCx0aGlzLmNvbXBvbmVudHMucHVzaCh0aGlzLnRpbWVBeGlzKSx0aGlzLmN1cnJlbnRUaW1lPW5ldyB2KHRoaXMuYm9keSx0aGlzLm9wdGlvbnMpLHRoaXMuY29tcG9uZW50cy5wdXNoKHRoaXMuY3VycmVudFRpbWUpLHRoaXMuaXRlbVNldD1uZXcgeSh0aGlzLmJvZHksdGhpcy5vcHRpb25zKSx0aGlzLmNvbXBvbmVudHMucHVzaCh0aGlzLml0ZW1TZXQpLHRoaXMuaXRlbXNEYXRhPW51bGwsdGhpcy5ncm91cHNEYXRhPW51bGwsdGhpcy5vbigidGFwIixmdW5jdGlvbih0KXtyLmVtaXQoImNsaWNrIixyLmdldEV2ZW50UHJvcGVydGllcyh0KSl9KSx0aGlzLm9uKCJkb3VibGV0YXAiLGZ1bmN0aW9uKHQpe3IuZW1pdCgiZG91YmxlQ2xpY2siLHIuZ2V0RXZlbnRQcm9wZXJ0aWVzKHQpKX0pLHRoaXMuZG9tLnJvb3Qub25jb250ZXh0bWVudT1mdW5jdGlvbih0KXtyLmVtaXQoImNvbnRleHRtZW51IixyLmdldEV2ZW50UHJvcGVydGllcyh0KSl9LHRoaXMuZml0RG9uZT0hMSx0aGlzLm9uKCJjaGFuZ2VkIixmdW5jdGlvbigpe2lmKG51bGwhPXRoaXMuaXRlbXNEYXRhJiYhci5maXREb25lKWlmKHIuZml0RG9uZT0hMCx2b2lkIDAhPXIub3B0aW9ucy5zdGFydHx8dm9pZCAwIT1yLm9wdGlvbnMuZW5kKXtpZih2b2lkIDA9PXIub3B0aW9ucy5zdGFydHx8dm9pZCAwPT1yLm9wdGlvbnMuZW5kKXZhciB0PXIuZ2V0SXRlbVJhbmdlKCk7dmFyIGU9dm9pZCAwIT1yLm9wdGlvbnMuc3RhcnQ/ci5vcHRpb25zLnN0YXJ0OnQubWluLGk9dm9pZCAwIT1yLm9wdGlvbnMuZW5kP3Iub3B0aW9ucy5lbmQ6dC5tYXg7ci5zZXRXaW5kb3coZSxpLHthbmltYXRpb246ITF9KX1lbHNlIHIuZml0KHthbmltYXRpb246ITF9KX0pLG8mJnRoaXMuc2V0T3B0aW9ucyhvKSxpJiZ0aGlzLnNldEdyb3VwcyhpKSxlJiZ0aGlzLnNldEl0ZW1zKGUpLHRoaXMuX3JlZHJhdygpfXZhciBzPWkoMjgpLHI9byhzKSxhPWkoMzEpLGg9byhhKSxkPShpKDEzKSxpKDIyKSxpKDIpKSxsPWkoMSksYz1pKDkpLHU9aSgxMSkscD1pKDMyKSxmPWkoMzUpLG09aSg0Niksdj1pKDUwKSxnPWkoNDgpLHk9aSgzNiksYj1pKDMxKS5wcmludFN0eWxlLF89aSg1MSkuYWxsT3B0aW9ucyx3PWkoNTEpLmNvbmZpZ3VyZU9wdGlvbnM7bi5wcm90b3R5cGU9bmV3IGYsbi5wcm90b3R5cGUuX2NyZWF0ZUNvbmZpZ3VyYXRvcj1mdW5jdGlvbigpe3JldHVybiBuZXcgci5kZWZhdWx0KHRoaXMsdGhpcy5kb20uY29udGFpbmVyLHcpfSxuLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24oKXt0aGlzLml0ZW1TZXQmJnRoaXMuaXRlbVNldC5tYXJrRGlydHkoe3JlZnJlc2hJdGVtczohMH0pLHRoaXMuX3JlZHJhdygpfSxuLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe3ZhciBlPWguZGVmYXVsdC52YWxpZGF0ZSh0LF8pO2lmKGU9PT0hMCYmY29uc29sZS5sb2coIiVjRXJyb3JzIGhhdmUgYmVlbiBmb3VuZCBpbiB0aGUgc3VwcGxpZWQgb3B0aW9ucyBvYmplY3QuIixiKSxmLnByb3RvdHlwZS5zZXRPcHRpb25zLmNhbGwodGhpcyx0KSwidHlwZSJpbiB0JiZ0LnR5cGUhPT10aGlzLm9wdGlvbnMudHlwZSl7dGhpcy5vcHRpb25zLnR5cGU9dC50eXBlO3ZhciBpPXRoaXMuaXRlbXNEYXRhO2lmKGkpe3ZhciBvPXRoaXMuZ2V0U2VsZWN0aW9uKCk7dGhpcy5zZXRJdGVtcyhudWxsKSx0aGlzLnNldEl0ZW1zKGkpLHRoaXMuc2V0U2VsZWN0aW9uKG8pfX19LG4ucHJvdG90eXBlLnNldEl0ZW1zPWZ1bmN0aW9uKHQpe3ZhciBlO2U9dD90IGluc3RhbmNlb2YgY3x8dCBpbnN0YW5jZW9mIHU/dDpuZXcgYyh0LHt0eXBlOntzdGFydDoiRGF0ZSIsZW5kOiJEYXRlIn19KTpudWxsLHRoaXMuaXRlbXNEYXRhPWUsdGhpcy5pdGVtU2V0JiZ0aGlzLml0ZW1TZXQuc2V0SXRlbXMoZSl9LG4ucHJvdG90eXBlLnNldEdyb3Vwcz1mdW5jdGlvbih0KXt2YXIgZTtlPXQ/dCBpbnN0YW5jZW9mIGN8fHQgaW5zdGFuY2VvZiB1P3Q6bmV3IGModCk6bnVsbCx0aGlzLmdyb3Vwc0RhdGE9ZSx0aGlzLml0ZW1TZXQuc2V0R3JvdXBzKGUpfSxuLnByb3RvdHlwZS5zZXREYXRhPWZ1bmN0aW9uKHQpe3QmJnQuZ3JvdXBzJiZ0aGlzLnNldEdyb3Vwcyh0Lmdyb3VwcyksdCYmdC5pdGVtcyYmdGhpcy5zZXRJdGVtcyh0Lml0ZW1zKX0sbi5wcm90b3R5cGUuc2V0U2VsZWN0aW9uPWZ1bmN0aW9uKHQsZSl7dGhpcy5pdGVtU2V0JiZ0aGlzLml0ZW1TZXQuc2V0U2VsZWN0aW9uKHQpLGUmJmUuZm9jdXMmJnRoaXMuZm9jdXModCxlKX0sbi5wcm90b3R5cGUuZ2V0U2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlbVNldCYmdGhpcy5pdGVtU2V0LmdldFNlbGVjdGlvbigpfHxbXX0sbi5wcm90b3R5cGUuZm9jdXM9ZnVuY3Rpb24odCxlKXtpZih0aGlzLml0ZW1zRGF0YSYmdm9pZCAwIT10KXt2YXIgaT1BcnJheS5pc0FycmF5KHQpP3Q6W3RdLG89dGhpcy5pdGVtc0RhdGEuZ2V0RGF0YVNldCgpLmdldChpLHt0eXBlOntzdGFydDoiRGF0ZSIsZW5kOiJEYXRlIn19KSxuPW51bGwscz1udWxsO2lmKG8uZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT10LnN0YXJ0LnZhbHVlT2YoKSxpPSJlbmQiaW4gdD90LmVuZC52YWx1ZU9mKCk6dC5zdGFydC52YWx1ZU9mKCk7KG51bGw9PT1ufHxlPG4pJiYobj1lKSwobnVsbD09PXN8fGk+cykmJihzPWkpfSksbnVsbCE9PW4mJm51bGwhPT1zKXt2YXIgcj0obitzKS8yLGE9TWF0aC5tYXgodGhpcy5yYW5nZS5lbmQtdGhpcy5yYW5nZS5zdGFydCwxLjEqKHMtbikpLGg9IWV8fHZvaWQgMD09PWUuYW5pbWF0aW9ufHxlLmFuaW1hdGlvbjt0aGlzLnJhbmdlLnNldFJhbmdlKHItYS8yLHIrYS8yLGgpfX19LG4ucHJvdG90eXBlLmZpdD1mdW5jdGlvbih0KXt2YXIgZSxpPSF0fHx2b2lkIDA9PT10LmFuaW1hdGlvbnx8dC5hbmltYXRpb24sbz10aGlzLml0ZW1zRGF0YSYmdGhpcy5pdGVtc0RhdGEuZ2V0RGF0YVNldCgpOzE9PT1vLmxlbmd0aCYmdm9pZCAwPT09by5nZXQoKVswXS5lbmQ/KGU9dGhpcy5nZXREYXRhUmFuZ2UoKSx0aGlzLm1vdmVUbyhlLm1pbi52YWx1ZU9mKCkse2FuaW1hdGlvbjppfSkpOihlPXRoaXMuZ2V0SXRlbVJhbmdlKCksdGhpcy5yYW5nZS5zZXRSYW5nZShlLm1pbixlLm1heCxpKSl9LG4ucHJvdG90eXBlLmdldEl0ZW1SYW5nZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLmdldERhdGFSYW5nZSgpLGk9bnVsbCE9PWUubWluP2UubWluLnZhbHVlT2YoKTpudWxsLG89bnVsbCE9PWUubWF4P2UubWF4LnZhbHVlT2YoKTpudWxsLG49bnVsbCxzPW51bGw7aWYobnVsbCE9aSYmbnVsbCE9byl7dmFyIHIsYSxoLGQsYzshZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbih0KXtyZXR1cm4gbC5jb252ZXJ0KHQuZGF0YS5zdGFydCwiRGF0ZSIpLnZhbHVlT2YoKX0sdT1mdW5jdGlvbih0KXt2YXIgZT12b2lkIDAhPXQuZGF0YS5lbmQ/dC5kYXRhLmVuZDp0LmRhdGEuc3RhcnQ7cmV0dXJuIGwuY29udmVydChlLCJEYXRlIikudmFsdWVPZigpfTtyPW8taSxyPD0wJiYocj0xMCksYT1yL3QucHJvcHMuY2VudGVyLndpZHRoLGwuZm9yRWFjaCh0Lml0ZW1TZXQuaXRlbXMsZnVuY3Rpb24odCl7dC5zaG93KCksdC5yZXBvc2l0aW9uWCgpO3ZhciByPWUodCksaD11KHQpO2lmKHRoaXMub3B0aW9ucy5ydGwpdmFyIGQ9ci0odC5nZXRXaWR0aFJpZ2h0KCkrMTApKmEsbD1oKyh0LmdldFdpZHRoTGVmdCgpKzEwKSphO2Vsc2UgdmFyIGQ9ci0odC5nZXRXaWR0aExlZnQoKSsxMCkqYSxsPWgrKHQuZ2V0V2lkdGhSaWdodCgpKzEwKSphO2Q8aSYmKGk9ZCxuPXQpLGw+byYmKG89bCxzPXQpfS5iaW5kKHQpKSxuJiZzJiYoaD1uLmdldFdpZHRoTGVmdCgpKzEwLGQ9cy5nZXRXaWR0aFJpZ2h0KCkrMTAsYz10LnByb3BzLmNlbnRlci53aWR0aC1oLWQsYz4wJiYodC5vcHRpb25zLnJ0bD8oaT1lKG4pLWQqci9jLG89dShzKStoKnIvYyk6KGk9ZShuKS1oKnIvYyxvPXUocykrZCpyL2MpKSl9KCl9cmV0dXJue21pbjpudWxsIT1pP25ldyBEYXRlKGkpOm51bGwsbWF4Om51bGwhPW8/bmV3IERhdGUobyk6bnVsbH19LG4ucHJvdG90eXBlLmdldERhdGFSYW5nZT1mdW5jdGlvbigpe3ZhciB0PW51bGwsZT1udWxsLGk9dGhpcy5pdGVtc0RhdGEmJnRoaXMuaXRlbXNEYXRhLmdldERhdGFTZXQoKTtyZXR1cm4gaSYmaS5mb3JFYWNoKGZ1bmN0aW9uKGkpe3ZhciBvPWwuY29udmVydChpLnN0YXJ0LCJEYXRlIikudmFsdWVPZigpLG49bC5jb252ZXJ0KHZvaWQgMCE9aS5lbmQ/aS5lbmQ6aS5zdGFydCwiRGF0ZSIpLnZhbHVlT2YoKTsobnVsbD09PXR8fG88dCkmJih0PW8pLChudWxsPT09ZXx8bj5lKSYmKGU9bil9KSx7bWluOm51bGwhPXQ/bmV3IERhdGUodCk6bnVsbCxtYXg6bnVsbCE9ZT9uZXcgRGF0ZShlKTpudWxsfX0sbi5wcm90b3R5cGUuZ2V0RXZlbnRQcm9wZXJ0aWVzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuY2VudGVyP3QuY2VudGVyLng6dC5jbGllbnRYLGk9dC5jZW50ZXI/dC5jZW50ZXIueTp0LmNsaWVudFk7aWYodGhpcy5vcHRpb25zLnJ0bCl2YXIgbz1sLmdldEFic29sdXRlUmlnaHQodGhpcy5kb20uY2VudGVyQ29udGFpbmVyKS1lO2Vsc2UgdmFyIG89ZS1sLmdldEFic29sdXRlTGVmdCh0aGlzLmRvbS5jZW50ZXJDb250YWluZXIpO3ZhciBuPWktbC5nZXRBYnNvbHV0ZVRvcCh0aGlzLmRvbS5jZW50ZXJDb250YWluZXIpLHM9dGhpcy5pdGVtU2V0Lml0ZW1Gcm9tVGFyZ2V0KHQpLHI9dGhpcy5pdGVtU2V0Lmdyb3VwRnJvbVRhcmdldCh0KSxhPWcuY3VzdG9tVGltZUZyb21UYXJnZXQodCksaD10aGlzLml0ZW1TZXQub3B0aW9ucy5zbmFwfHxudWxsLGQ9dGhpcy5ib2R5LnV0aWwuZ2V0U2NhbGUoKSxjPXRoaXMuYm9keS51dGlsLmdldFN0ZXAoKSx1PXRoaXMuX3RvVGltZShvKSxwPWg/aCh1LGQsYyk6dSxmPWwuZ2V0VGFyZ2V0KHQpLG09bnVsbDtyZXR1cm4gbnVsbCE9cz9tPSJpdGVtIjpudWxsIT1hP209ImN1c3RvbS10aW1lIjpsLmhhc1BhcmVudChmLHRoaXMudGltZUF4aXMuZG9tLmZvcmVncm91bmQpP209ImF4aXMiOnRoaXMudGltZUF4aXMyJiZsLmhhc1BhcmVudChmLHRoaXMudGltZUF4aXMyLmRvbS5mb3JlZ3JvdW5kKT9tPSJheGlzIjpsLmhhc1BhcmVudChmLHRoaXMuaXRlbVNldC5kb20ubGFiZWxTZXQpP209Imdyb3VwLWxhYmVsIjpsLmhhc1BhcmVudChmLHRoaXMuY3VycmVudFRpbWUuYmFyKT9tPSJjdXJyZW50LXRpbWUiOmwuaGFzUGFyZW50KGYsdGhpcy5kb20uY2VudGVyKSYmKG09ImJhY2tncm91bmQiKSx7ZXZlbnQ6dCxpdGVtOnM/cy5pZDpudWxsLGdyb3VwOnI/ci5ncm91cElkOm51bGwsd2hhdDptLHBhZ2VYOnQuc3JjRXZlbnQ/dC5zcmNFdmVudC5wYWdlWDp0LnBhZ2VYLHBhZ2VZOnQuc3JjRXZlbnQ/dC5zcmNFdmVudC5wYWdlWTp0LnBhZ2VZLHg6byx5Om4sdGltZTp1LHNuYXBwZWRUaW1lOnB9fSx0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWZ1bmN0aW9uIG4odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9LHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxvJiZ0KGUsbyksZX19KCksYT1pKDI5KSxoPW8oYSksZD1pKDEpLGw9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsaSxvKXt2YXIgcz1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106MTtuKHRoaXMsdCksdGhpcy5wYXJlbnQ9ZSx0aGlzLmNoYW5nZWRPcHRpb25zPVtdLHRoaXMuY29udGFpbmVyPWksdGhpcy5hbGxvd0NyZWF0aW9uPSExLHRoaXMub3B0aW9ucz17fSx0aGlzLmluaXRpYWxpemVkPSExLHRoaXMucG9wdXBDb3VudGVyPTAsdGhpcy5kZWZhdWx0T3B0aW9ucz17ZW5hYmxlZDohMSxmaWx0ZXI6ITAsY29udGFpbmVyOnZvaWQgMCxzaG93QnV0dG9uOiEwfSxkLmV4dGVuZCh0aGlzLm9wdGlvbnMsdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5jb25maWd1cmVPcHRpb25zPW8sdGhpcy5tb2R1bGVPcHRpb25zPXt9LHRoaXMuZG9tRWxlbWVudHM9W10sdGhpcy5wb3B1cERpdj17fSx0aGlzLnBvcHVwTGltaXQ9NSx0aGlzLnBvcHVwSGlzdG9yeT17fSx0aGlzLmNvbG9yUGlja2VyPW5ldyBoLmRlZmF1bHQocyksdGhpcy53cmFwcGVyPXZvaWQgMH1yZXR1cm4gcih0LFt7a2V5OiJzZXRPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0KXtpZih2b2lkIDAhPT10KXt0aGlzLnBvcHVwSGlzdG9yeT17fSx0aGlzLl9yZW1vdmVQb3B1cCgpO3ZhciBlPSEwOyJzdHJpbmciPT10eXBlb2YgdD90aGlzLm9wdGlvbnMuZmlsdGVyPXQ6dCBpbnN0YW5jZW9mIEFycmF5P3RoaXMub3B0aW9ucy5maWx0ZXI9dC5qb2luKCk6Im9iamVjdCI9PT0oInVuZGVmaW5lZCI9PXR5cGVvZiB0PyJ1bmRlZmluZWQiOnModCkpPyh2b2lkIDAhPT10LmNvbnRhaW5lciYmKHRoaXMub3B0aW9ucy5jb250YWluZXI9dC5jb250YWluZXIpLHZvaWQgMCE9PXQuZmlsdGVyJiYodGhpcy5vcHRpb25zLmZpbHRlcj10LmZpbHRlciksdm9pZCAwIT09dC5zaG93QnV0dG9uJiYodGhpcy5vcHRpb25zLnNob3dCdXR0b249dC5zaG93QnV0dG9uKSx2b2lkIDAhPT10LmVuYWJsZWQmJihlPXQuZW5hYmxlZCkpOiJib29sZWFuIj09dHlwZW9mIHQ/KHRoaXMub3B0aW9ucy5maWx0ZXI9ITAsZT10KToiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHRoaXMub3B0aW9ucy5maWx0ZXI9dCxlPSEwKSx0aGlzLm9wdGlvbnMuZmlsdGVyPT09ITEmJihlPSExKSx0aGlzLm9wdGlvbnMuZW5hYmxlZD1lfXRoaXMuX2NsZWFuKCl9fSx7a2V5OiJzZXRNb2R1bGVPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm1vZHVsZU9wdGlvbnM9dCx0aGlzLm9wdGlvbnMuZW5hYmxlZD09PSEwJiYodGhpcy5fY2xlYW4oKSx2b2lkIDAhPT10aGlzLm9wdGlvbnMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9dGhpcy5vcHRpb25zLmNvbnRhaW5lciksdGhpcy5fY3JlYXRlKCkpfX0se2tleToiX2NyZWF0ZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX2NsZWFuKCksdGhpcy5jaGFuZ2VkT3B0aW9ucz1bXTt2YXIgZT10aGlzLm9wdGlvbnMuZmlsdGVyLGk9MCxvPSExO2Zvcih2YXIgbiBpbiB0aGlzLmNvbmZpZ3VyZU9wdGlvbnMpdGhpcy5jb25maWd1cmVPcHRpb25zLmhhc093blByb3BlcnR5KG4pJiYodGhpcy5hbGxvd0NyZWF0aW9uPSExLG89ITEsImZ1bmN0aW9uIj09dHlwZW9mIGU/KG89ZShuLFtdKSxvPW98fHRoaXMuX2hhbmRsZU9iamVjdCh0aGlzLmNvbmZpZ3VyZU9wdGlvbnNbbl0sW25dLCEwKSk6ZSE9PSEwJiZlLmluZGV4T2Yobik9PT0tMXx8KG89ITApLG8hPT0hMSYmKHRoaXMuYWxsb3dDcmVhdGlvbj0hMCxpPjAmJnRoaXMuX21ha2VJdGVtKFtdKSx0aGlzLl9tYWtlSGVhZGVyKG4pLHRoaXMuX2hhbmRsZU9iamVjdCh0aGlzLmNvbmZpZ3VyZU9wdGlvbnNbbl0sW25dKSksaSsrKTt0aGlzLm9wdGlvbnMuc2hvd0J1dHRvbj09PSEwJiYhZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLmNsYXNzTmFtZT0idmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1idXR0b24iLGUuaW5uZXJIVE1MPSJnZW5lcmF0ZSBvcHRpb25zIixlLm9uY2xpY2s9ZnVuY3Rpb24oKXt0Ll9wcmludE9wdGlvbnMoKX0sZS5vbm1vdXNlb3Zlcj1mdW5jdGlvbigpe2UuY2xhc3NOYW1lPSJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLWJ1dHRvbiBob3ZlciJ9LGUub25tb3VzZW91dD1mdW5jdGlvbigpe2UuY2xhc3NOYW1lPSJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLWJ1dHRvbiJ9LHQub3B0aW9uc0NvbnRhaW5lcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0Lm9wdGlvbnNDb250YWluZXIuY2xhc3NOYW1lPSJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLW9wdGlvbi1jb250YWluZXIiLHQuZG9tRWxlbWVudHMucHVzaCh0Lm9wdGlvbnNDb250YWluZXIpLHQuZG9tRWxlbWVudHMucHVzaChlKX0oKSx0aGlzLl9wdXNoKCl9fSx7a2V5OiJfcHVzaCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLndyYXBwZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy53cmFwcGVyLmNsYXNzTmFtZT0idmlzLWNvbmZpZ3VyYXRpb24td3JhcHBlciIsdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy53cmFwcGVyKTtmb3IodmFyIHQ9MDt0PHRoaXMuZG9tRWxlbWVudHMubGVuZ3RoO3QrKyl0aGlzLndyYXBwZXIuYXBwZW5kQ2hpbGQodGhpcy5kb21FbGVtZW50c1t0XSk7dGhpcy5fc2hvd1BvcHVwSWZOZWVkZWQoKX19LHtrZXk6Il9jbGVhbiIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PHRoaXMuZG9tRWxlbWVudHMubGVuZ3RoO3QrKyl0aGlzLndyYXBwZXIucmVtb3ZlQ2hpbGQodGhpcy5kb21FbGVtZW50c1t0XSk7dm9pZCAwIT09dGhpcy53cmFwcGVyJiYodGhpcy5jb250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy53cmFwcGVyKSwKdGhpcy53cmFwcGVyPXZvaWQgMCksdGhpcy5kb21FbGVtZW50cz1bXSx0aGlzLl9yZW1vdmVQb3B1cCgpfX0se2tleToiX2dldFZhbHVlIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5tb2R1bGVPcHRpb25zLGk9MDtpPHQubGVuZ3RoO2krKyl7aWYodm9pZCAwPT09ZVt0W2ldXSl7ZT12b2lkIDA7YnJlYWt9ZT1lW3RbaV1dfXJldHVybiBlfX0se2tleToiX21ha2VJdGVtIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMsaT10aGlzO2lmKHRoaXMuYWxsb3dDcmVhdGlvbj09PSEwKXt2YXIgbyxuLHIsYT1mdW5jdGlvbigpe3ZhciBzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2ZvcihzLmNsYXNzTmFtZT0idmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1pdGVtIHZpcy1jb25maWctcyIrdC5sZW5ndGgsbz1lLmxlbmd0aCxuPUFycmF5KG8+MT9vLTE6MCkscj0xO3I8bztyKyspbltyLTFdPWVbcl07cmV0dXJuIG4uZm9yRWFjaChmdW5jdGlvbih0KXtzLmFwcGVuZENoaWxkKHQpfSksaS5kb21FbGVtZW50cy5wdXNoKHMpLHt2OmkuZG9tRWxlbWVudHMubGVuZ3RofX0oKTtpZigib2JqZWN0Ij09PSgidW5kZWZpbmVkIj09dHlwZW9mIGE/InVuZGVmaW5lZCI6cyhhKSkpcmV0dXJuIGEudn1yZXR1cm4gMH19LHtrZXk6Il9tYWtlSGVhZGVyIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLmNsYXNzTmFtZT0idmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1oZWFkZXIiLGUuaW5uZXJIVE1MPXQsdGhpcy5fbWFrZUl0ZW0oW10sZSl9fSx7a2V5OiJfbWFrZUxhYmVsIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl0sbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gby5jbGFzc05hbWU9InZpcy1jb25maWd1cmF0aW9uIHZpcy1jb25maWctbGFiZWwgdmlzLWNvbmZpZy1zIitlLmxlbmd0aCxpPT09ITA/by5pbm5lckhUTUw9IjxpPjxiPiIrdCsiOjwvYj48L2k+IjpvLmlubmVySFRNTD10KyI6IixvfX0se2tleToiX21ha2VEcm9wZG93biIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpO28uY2xhc3NOYW1lPSJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLXNlbGVjdCI7dmFyIG49MDt2b2lkIDAhPT1lJiZ0LmluZGV4T2YoZSkhPT0tMSYmKG49dC5pbmRleE9mKGUpKTtmb3IodmFyIHM9MDtzPHQubGVuZ3RoO3MrKyl7dmFyIHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7ci52YWx1ZT10W3NdLHM9PT1uJiYoci5zZWxlY3RlZD0ic2VsZWN0ZWQiKSxyLmlubmVySFRNTD10W3NdLG8uYXBwZW5kQ2hpbGQocil9dmFyIGE9dGhpcztvLm9uY2hhbmdlPWZ1bmN0aW9uKCl7YS5fdXBkYXRlKHRoaXMudmFsdWUsaSl9O3ZhciBoPXRoaXMuX21ha2VMYWJlbChpW2kubGVuZ3RoLTFdLGkpO3RoaXMuX21ha2VJdGVtKGksaCxvKX19LHtrZXk6Il9tYWtlUmFuZ2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz10WzBdLG49dFsxXSxzPXRbMl0scj10WzNdLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTthLmNsYXNzTmFtZT0idmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1yYW5nZSI7dHJ5e2EudHlwZT0icmFuZ2UiLGEubWluPW4sYS5tYXg9c31jYXRjaCh0KXt9YS5zdGVwPXI7dmFyIGg9IiIsZD0wO2lmKHZvaWQgMCE9PWUpe3ZhciBsPTEuMjtlPDAmJmUqbDxuPyhhLm1pbj1NYXRoLmNlaWwoZSpsKSxkPWEubWluLGg9InJhbmdlIGluY3JlYXNlZCIpOmUvbDxuJiYoYS5taW49TWF0aC5jZWlsKGUvbCksZD1hLm1pbixoPSJyYW5nZSBpbmNyZWFzZWQiKSxlKmw+cyYmMSE9PXMmJihhLm1heD1NYXRoLmNlaWwoZSpsKSxkPWEubWF4LGg9InJhbmdlIGluY3JlYXNlZCIpLGEudmFsdWU9ZX1lbHNlIGEudmFsdWU9bzt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2MuY2xhc3NOYW1lPSJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLXJhbmdlaW5wdXQiLGMudmFsdWU9YS52YWx1ZTt2YXIgdT10aGlzO2Eub25jaGFuZ2U9ZnVuY3Rpb24oKXtjLnZhbHVlPXRoaXMudmFsdWUsdS5fdXBkYXRlKE51bWJlcih0aGlzLnZhbHVlKSxpKX0sYS5vbmlucHV0PWZ1bmN0aW9uKCl7Yy52YWx1ZT10aGlzLnZhbHVlfTt2YXIgcD10aGlzLl9tYWtlTGFiZWwoaVtpLmxlbmd0aC0xXSxpKSxmPXRoaXMuX21ha2VJdGVtKGkscCxhLGMpOyIiIT09aCYmdGhpcy5wb3B1cEhpc3RvcnlbZl0hPT1kJiYodGhpcy5wb3B1cEhpc3RvcnlbZl09ZCx0aGlzLl9zZXR1cFBvcHVwKGgsZikpfX0se2tleToiX3NldHVwUG9wdXAiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcztpZih0aGlzLmluaXRpYWxpemVkPT09ITAmJnRoaXMuYWxsb3dDcmVhdGlvbj09PSEwJiZ0aGlzLnBvcHVwQ291bnRlcjx0aGlzLnBvcHVwTGltaXQpe3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO28uaWQ9InZpcy1jb25maWd1cmF0aW9uLXBvcHVwIixvLmNsYXNzTmFtZT0idmlzLWNvbmZpZ3VyYXRpb24tcG9wdXAiLG8uaW5uZXJIVE1MPXQsby5vbmNsaWNrPWZ1bmN0aW9uKCl7aS5fcmVtb3ZlUG9wdXAoKX0sdGhpcy5wb3B1cENvdW50ZXIrPTEsdGhpcy5wb3B1cERpdj17aHRtbDpvLGluZGV4OmV9fX19LHtrZXk6Il9yZW1vdmVQb3B1cCIsdmFsdWU6ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLnBvcHVwRGl2Lmh0bWwmJih0aGlzLnBvcHVwRGl2Lmh0bWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnBvcHVwRGl2Lmh0bWwpLGNsZWFyVGltZW91dCh0aGlzLnBvcHVwRGl2LmhpZGVUaW1lb3V0KSxjbGVhclRpbWVvdXQodGhpcy5wb3B1cERpdi5kZWxldGVUaW1lb3V0KSx0aGlzLnBvcHVwRGl2PXt9KX19LHtrZXk6Il9zaG93UG9wdXBJZk5lZWRlZCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKHZvaWQgMCE9PXRoaXMucG9wdXBEaXYuaHRtbCl7dmFyIGU9dGhpcy5kb21FbGVtZW50c1t0aGlzLnBvcHVwRGl2LmluZGV4XSxpPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dGhpcy5wb3B1cERpdi5odG1sLnN0eWxlLmxlZnQ9aS5sZWZ0KyJweCIsdGhpcy5wb3B1cERpdi5odG1sLnN0eWxlLnRvcD1pLnRvcC0zMCsicHgiLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5wb3B1cERpdi5odG1sKSx0aGlzLnBvcHVwRGl2LmhpZGVUaW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LnBvcHVwRGl2Lmh0bWwuc3R5bGUub3BhY2l0eT0wfSwxNTAwKSx0aGlzLnBvcHVwRGl2LmRlbGV0ZVRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe3QuX3JlbW92ZVBvcHVwKCl9LDE4MDApfX19LHtrZXk6Il9tYWtlQ2hlY2tib3giLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO28udHlwZT0iY2hlY2tib3giLG8uY2xhc3NOYW1lPSJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLWNoZWNrYm94IixvLmNoZWNrZWQ9dCx2b2lkIDAhPT1lJiYoby5jaGVja2VkPWUsZSE9PXQmJigib2JqZWN0Ij09PSgidW5kZWZpbmVkIj09dHlwZW9mIHQ/InVuZGVmaW5lZCI6cyh0KSk/ZSE9PXQuZW5hYmxlZCYmdGhpcy5jaGFuZ2VkT3B0aW9ucy5wdXNoKHtwYXRoOmksdmFsdWU6ZX0pOnRoaXMuY2hhbmdlZE9wdGlvbnMucHVzaCh7cGF0aDppLHZhbHVlOmV9KSkpO3ZhciBuPXRoaXM7by5vbmNoYW5nZT1mdW5jdGlvbigpe24uX3VwZGF0ZSh0aGlzLmNoZWNrZWQsaSl9O3ZhciByPXRoaXMuX21ha2VMYWJlbChpW2kubGVuZ3RoLTFdLGkpO3RoaXMuX21ha2VJdGVtKGkscixvKX19LHtrZXk6Il9tYWtlVGV4dElucHV0Iix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtvLnR5cGU9InRleHQiLG8uY2xhc3NOYW1lPSJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLXRleHQiLG8udmFsdWU9ZSxlIT09dCYmdGhpcy5jaGFuZ2VkT3B0aW9ucy5wdXNoKHtwYXRoOmksdmFsdWU6ZX0pO3ZhciBuPXRoaXM7by5vbmNoYW5nZT1mdW5jdGlvbigpe24uX3VwZGF0ZSh0aGlzLnZhbHVlLGkpfTt2YXIgcz10aGlzLl9tYWtlTGFiZWwoaVtpLmxlbmd0aC0xXSxpKTt0aGlzLl9tYWtlSXRlbShpLHMsbyl9fSx7a2V5OiJfbWFrZUNvbG9yRmllbGQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz10aGlzLG49dFsxXSxzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2U9dm9pZCAwPT09ZT9uOmUsIm5vbmUiIT09ZT8ocy5jbGFzc05hbWU9InZpcy1jb25maWd1cmF0aW9uIHZpcy1jb25maWctY29sb3JCbG9jayIscy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9ZSk6cy5jbGFzc05hbWU9InZpcy1jb25maWd1cmF0aW9uIHZpcy1jb25maWctY29sb3JCbG9jayBub25lIixlPXZvaWQgMD09PWU/bjplLHMub25jbGljaz1mdW5jdGlvbigpe28uX3Nob3dDb2xvclBpY2tlcihlLHMsaSl9O3ZhciByPXRoaXMuX21ha2VMYWJlbChpW2kubGVuZ3RoLTFdLGkpO3RoaXMuX21ha2VJdGVtKGkscixzKX19LHtrZXk6Il9zaG93Q29sb3JQaWNrZXIiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz10aGlzO2Uub25jbGljaz1mdW5jdGlvbigpe30sdGhpcy5jb2xvclBpY2tlci5pbnNlcnRUbyhlKSx0aGlzLmNvbG9yUGlja2VyLnNob3coKSx0aGlzLmNvbG9yUGlja2VyLnNldENvbG9yKHQpLHRoaXMuY29sb3JQaWNrZXIuc2V0VXBkYXRlQ2FsbGJhY2soZnVuY3Rpb24odCl7dmFyIG49InJnYmEoIit0LnIrIiwiK3QuZysiLCIrdC5iKyIsIit0LmErIikiO2Uuc3R5bGUuYmFja2dyb3VuZENvbG9yPW4sby5fdXBkYXRlKG4saSl9KSx0aGlzLmNvbG9yUGlja2VyLnNldENsb3NlQ2FsbGJhY2soZnVuY3Rpb24oKXtlLm9uY2xpY2s9ZnVuY3Rpb24oKXtvLl9zaG93Q29sb3JQaWNrZXIodCxlLGkpfX0pfX0se2tleToiX2hhbmRsZU9iamVjdCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOltdLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXSxvPSExLG49dGhpcy5vcHRpb25zLmZpbHRlcixzPSExO2Zvcih2YXIgciBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkocikpe289ITA7dmFyIGE9dFtyXSxoPWQuY29weUFuZEV4dGVuZEFycmF5KGUscik7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG4mJihvPW4ocixlKSxvPT09ITEmJiEoYSBpbnN0YW5jZW9mIEFycmF5KSYmInN0cmluZyIhPXR5cGVvZiBhJiYiYm9vbGVhbiIhPXR5cGVvZiBhJiZhIGluc3RhbmNlb2YgT2JqZWN0JiYodGhpcy5hbGxvd0NyZWF0aW9uPSExLG89dGhpcy5faGFuZGxlT2JqZWN0KGEsaCwhMCksdGhpcy5hbGxvd0NyZWF0aW9uPWk9PT0hMSkpLG8hPT0hMSl7cz0hMDt2YXIgbD10aGlzLl9nZXRWYWx1ZShoKTtpZihhIGluc3RhbmNlb2YgQXJyYXkpdGhpcy5faGFuZGxlQXJyYXkoYSxsLGgpO2Vsc2UgaWYoInN0cmluZyI9PXR5cGVvZiBhKXRoaXMuX21ha2VUZXh0SW5wdXQoYSxsLGgpO2Vsc2UgaWYoImJvb2xlYW4iPT10eXBlb2YgYSl0aGlzLl9tYWtlQ2hlY2tib3goYSxsLGgpO2Vsc2UgaWYoYSBpbnN0YW5jZW9mIE9iamVjdCl7dmFyIGM9ITA7aWYoZS5pbmRleE9mKCJwaHlzaWNzIikhPT0tMSYmdGhpcy5tb2R1bGVPcHRpb25zLnBoeXNpY3Muc29sdmVyIT09ciYmKGM9ITEpLGM9PT0hMClpZih2b2lkIDAhPT1hLmVuYWJsZWQpe3ZhciB1PWQuY29weUFuZEV4dGVuZEFycmF5KGgsImVuYWJsZWQiKSxwPXRoaXMuX2dldFZhbHVlKHUpO2lmKHA9PT0hMCl7dmFyIGY9dGhpcy5fbWFrZUxhYmVsKHIsaCwhMCk7dGhpcy5fbWFrZUl0ZW0oaCxmKSxzPXRoaXMuX2hhbmRsZU9iamVjdChhLGgpfHxzfWVsc2UgdGhpcy5fbWFrZUNoZWNrYm94KGEscCxoKX1lbHNle3ZhciBtPXRoaXMuX21ha2VMYWJlbChyLGgsITApO3RoaXMuX21ha2VJdGVtKGgsbSkscz10aGlzLl9oYW5kbGVPYmplY3QoYSxoKXx8c319ZWxzZSBjb25zb2xlLmVycm9yKCJkb250IGtub3cgaG93IHRvIGhhbmRsZSIsYSxyLGgpfX1yZXR1cm4gc319LHtrZXk6Il9oYW5kbGVBcnJheSIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpeyJzdHJpbmciPT10eXBlb2YgdFswXSYmImNvbG9yIj09PXRbMF0/KHRoaXMuX21ha2VDb2xvckZpZWxkKHQsZSxpKSx0WzFdIT09ZSYmdGhpcy5jaGFuZ2VkT3B0aW9ucy5wdXNoKHtwYXRoOmksdmFsdWU6ZX0pKToic3RyaW5nIj09dHlwZW9mIHRbMF0/KHRoaXMuX21ha2VEcm9wZG93bih0LGUsaSksdFswXSE9PWUmJnRoaXMuY2hhbmdlZE9wdGlvbnMucHVzaCh7cGF0aDppLHZhbHVlOmV9KSk6Im51bWJlciI9PXR5cGVvZiB0WzBdJiYodGhpcy5fbWFrZVJhbmdlKHQsZSxpKSx0WzBdIT09ZSYmdGhpcy5jaGFuZ2VkT3B0aW9ucy5wdXNoKHtwYXRoOmksdmFsdWU6TnVtYmVyKGUpfSkpfX0se2tleToiX3VwZGF0ZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9jb25zdHJ1Y3RPcHRpb25zKHQsZSk7dGhpcy5wYXJlbnQuYm9keSYmdGhpcy5wYXJlbnQuYm9keS5lbWl0dGVyJiZ0aGlzLnBhcmVudC5ib2R5LmVtaXR0ZXIuZW1pdCYmdGhpcy5wYXJlbnQuYm9keS5lbWl0dGVyLmVtaXQoImNvbmZpZ0NoYW5nZSIsaSksdGhpcy5pbml0aWFsaXplZD0hMCx0aGlzLnBhcmVudC5zZXRPcHRpb25zKGkpfX0se2tleToiX2NvbnN0cnVjdE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LG89aTt0PSJ0cnVlIj09PXR8fHQsdD0iZmFsc2UiIT09dCYmdDtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKykiZ2xvYmFsIiE9PWVbbl0mJih2b2lkIDA9PT1vW2Vbbl1dJiYob1tlW25dXT17fSksbiE9PWUubGVuZ3RoLTE/bz1vW2Vbbl1dOm9bZVtuXV09dCk7cmV0dXJuIGl9fSx7a2V5OiJfcHJpbnRPcHRpb25zIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0T3B0aW9ucygpO3RoaXMub3B0aW9uc0NvbnRhaW5lci5pbm5lckhUTUw9IjxwcmU+dmFyIG9wdGlvbnMgPSAiK0pTT04uc3RyaW5naWZ5KHQsbnVsbCwyKSsiPC9wcmU+In19LHtrZXk6ImdldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXt9LGU9MDtlPHRoaXMuY2hhbmdlZE9wdGlvbnMubGVuZ3RoO2UrKyl0aGlzLl9jb25zdHJ1Y3RPcHRpb25zKHRoaXMuY2hhbmdlZE9wdGlvbnNbZV0udmFsdWUsdGhpcy5jaGFuZ2VkT3B0aW9uc1tlXS5wYXRoLHQpO3JldHVybiB0fX1dKSx0fSgpO2UuZGVmYXVsdD1sfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG8pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG8mJnQoZSxvKSxlfX0oKSxzPWkoMjIpLHI9aSgzMCksYT1pKDEpLGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOjE7byh0aGlzLHQpLHRoaXMucGl4ZWxSYXRpbz1lLHRoaXMuZ2VuZXJhdGVkPSExLHRoaXMuY2VudGVyQ29vcmRpbmF0ZXM9e3g6MTQ0LjUseToxNDQuNX0sdGhpcy5yPTI4OSouNDksdGhpcy5jb2xvcj17cjoyNTUsZzoyNTUsYjoyNTUsYToxfSx0aGlzLmh1ZUNpcmNsZT12b2lkIDAsdGhpcy5pbml0aWFsQ29sb3I9e3I6MjU1LGc6MjU1LGI6MjU1LGE6MX0sdGhpcy5wcmV2aW91c0NvbG9yPXZvaWQgMCx0aGlzLmFwcGxpZWQ9ITEsdGhpcy51cGRhdGVDYWxsYmFjaz1mdW5jdGlvbigpe30sdGhpcy5jbG9zZUNhbGxiYWNrPWZ1bmN0aW9uKCl7fSx0aGlzLl9jcmVhdGUoKX1yZXR1cm4gbih0LFt7a2V5OiJpbnNlcnRUbyIsdmFsdWU6ZnVuY3Rpb24odCl7dm9pZCAwIT09dGhpcy5oYW1tZXImJih0aGlzLmhhbW1lci5kZXN0cm95KCksdGhpcy5oYW1tZXI9dm9pZCAwKSx0aGlzLmNvbnRhaW5lcj10LHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZnJhbWUpLHRoaXMuX2JpbmRIYW1tZXIoKSx0aGlzLl9zZXRTaXplKCl9fSx7a2V5OiJzZXRVcGRhdGVDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJGdW5jdGlvbiBhdHRlbXB0ZWQgdG8gc2V0IGFzIGNvbG9yUGlja2VyIHVwZGF0ZSBjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbi4iKTt0aGlzLnVwZGF0ZUNhbGxiYWNrPXR9fSx7a2V5OiJzZXRDbG9zZUNhbGxiYWNrIix2YWx1ZTpmdW5jdGlvbih0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoIkZ1bmN0aW9uIGF0dGVtcHRlZCB0byBzZXQgYXMgY29sb3JQaWNrZXIgY2xvc2luZyBjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbi4iKTt0aGlzLmNsb3NlQ2FsbGJhY2s9dH19LHtrZXk6Il9pc0NvbG9yU3RyaW5nIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT17YmxhY2s6IiMwMDAwMDAiLG5hdnk6IiMwMDAwODAiLGRhcmtibHVlOiIjMDAwMDhCIixtZWRpdW1ibHVlOiIjMDAwMENEIixibHVlOiIjMDAwMEZGIixkYXJrZ3JlZW46IiMwMDY0MDAiLGdyZWVuOiIjMDA4MDAwIix0ZWFsOiIjMDA4MDgwIixkYXJrY3lhbjoiIzAwOEI4QiIsZGVlcHNreWJsdWU6IiMwMEJGRkYiLGRhcmt0dXJxdW9pc2U6IiMwMENFRDEiLG1lZGl1bXNwcmluZ2dyZWVuOiIjMDBGQTlBIixsaW1lOiIjMDBGRjAwIixzcHJpbmdncmVlbjoiIzAwRkY3RiIsYXF1YToiIzAwRkZGRiIsY3lhbjoiIzAwRkZGRiIsbWlkbmlnaHRibHVlOiIjMTkxOTcwIixkb2RnZXJibHVlOiIjMUU5MEZGIixsaWdodHNlYWdyZWVuOiIjMjBCMkFBIixmb3Jlc3RncmVlbjoiIzIyOEIyMiIsc2VhZ3JlZW46IiMyRThCNTciLGRhcmtzbGF0ZWdyYXk6IiMyRjRGNEYiLGxpbWVncmVlbjoiIzMyQ0QzMiIsbWVkaXVtc2VhZ3JlZW46IiMzQ0IzNzEiLHR1cnF1b2lzZToiIzQwRTBEMCIscm95YWxibHVlOiIjNDE2OUUxIixzdGVlbGJsdWU6IiM0NjgyQjQiLGRhcmtzbGF0ZWJsdWU6IiM0ODNEOEIiLG1lZGl1bXR1cnF1b2lzZToiIzQ4RDFDQyIsaW5kaWdvOiIjNEIwMDgyIixkYXJrb2xpdmVncmVlbjoiIzU1NkIyRiIsY2FkZXRibHVlOiIjNUY5RUEwIixjb3JuZmxvd2VyYmx1ZToiIzY0OTVFRCIsbWVkaXVtYXF1YW1hcmluZToiIzY2Q0RBQSIsZGltZ3JheToiIzY5Njk2OSIsc2xhdGVibHVlOiIjNkE1QUNEIixvbGl2ZWRyYWI6IiM2QjhFMjMiLHNsYXRlZ3JheToiIzcwODA5MCIsbGlnaHRzbGF0ZWdyYXk6IiM3Nzg4OTkiLG1lZGl1bXNsYXRlYmx1ZToiIzdCNjhFRSIsbGF3bmdyZWVuOiIjN0NGQzAwIixjaGFydHJldXNlOiIjN0ZGRjAwIixhcXVhbWFyaW5lOiIjN0ZGRkQ0IixtYXJvb246IiM4MDAwMDAiLHB1cnBsZToiIzgwMDA4MCIsb2xpdmU6IiM4MDgwMDAiLGdyYXk6IiM4MDgwODAiLHNreWJsdWU6IiM4N0NFRUIiLGxpZ2h0c2t5Ymx1ZToiIzg3Q0VGQSIsYmx1ZXZpb2xldDoiIzhBMkJFMiIsZGFya3JlZDoiIzhCMDAwMCIsZGFya21hZ2VudGE6IiM4QjAwOEIiLHNhZGRsZWJyb3duOiIjOEI0NTEzIixkYXJrc2VhZ3JlZW46IiM4RkJDOEYiLGxpZ2h0Z3JlZW46IiM5MEVFOTAiLG1lZGl1bXB1cnBsZToiIzkzNzBEOCIsZGFya3Zpb2xldDoiIzk0MDBEMyIscGFsZWdyZWVuOiIjOThGQjk4IixkYXJrb3JjaGlkOiIjOTkzMkNDIix5ZWxsb3dncmVlbjoiIzlBQ0QzMiIsc2llbm5hOiIjQTA1MjJEIixicm93bjoiI0E1MkEyQSIsZGFya2dyYXk6IiNBOUE5QTkiLGxpZ2h0Ymx1ZToiI0FERDhFNiIsZ3JlZW55ZWxsb3c6IiNBREZGMkYiLHBhbGV0dXJxdW9pc2U6IiNBRkVFRUUiLGxpZ2h0c3RlZWxibHVlOiIjQjBDNERFIixwb3dkZXJibHVlOiIjQjBFMEU2IixmaXJlYnJpY2s6IiNCMjIyMjIiLGRhcmtnb2xkZW5yb2Q6IiNCODg2MEIiLG1lZGl1bW9yY2hpZDoiI0JBNTVEMyIscm9zeWJyb3duOiIjQkM4RjhGIixkYXJra2hha2k6IiNCREI3NkIiLHNpbHZlcjoiI0MwQzBDMCIsbWVkaXVtdmlvbGV0cmVkOiIjQzcxNTg1IixpbmRpYW5yZWQ6IiNDRDVDNUMiLHBlcnU6IiNDRDg1M0YiLGNob2NvbGF0ZToiI0QyNjkxRSIsdGFuOiIjRDJCNDhDIixsaWdodGdyZXk6IiNEM0QzRDMiLHBhbGV2aW9sZXRyZWQ6IiNEODcwOTMiLHRoaXN0bGU6IiNEOEJGRDgiLG9yY2hpZDoiI0RBNzBENiIsZ29sZGVucm9kOiIjREFBNTIwIixjcmltc29uOiIjREMxNDNDIixnYWluc2Jvcm86IiNEQ0RDREMiLHBsdW06IiNEREEwREQiLGJ1cmx5d29vZDoiI0RFQjg4NyIsbGlnaHRjeWFuOiIjRTBGRkZGIixsYXZlbmRlcjoiI0U2RTZGQSIsZGFya3NhbG1vbjoiI0U5OTY3QSIsdmlvbGV0OiIjRUU4MkVFIixwYWxlZ29sZGVucm9kOiIjRUVFOEFBIixsaWdodGNvcmFsOiIjRjA4MDgwIixraGFraToiI0YwRTY4QyIsYWxpY2VibHVlOiIjRjBGOEZGIixob25leWRldzoiI0YwRkZGMCIsYXp1cmU6IiNGMEZGRkYiLHNhbmR5YnJvd246IiNGNEE0NjAiLHdoZWF0OiIjRjVERUIzIixiZWlnZToiI0Y1RjVEQyIsd2hpdGVzbW9rZToiI0Y1RjVGNSIsbWludGNyZWFtOiIjRjVGRkZBIixnaG9zdHdoaXRlOiIjRjhGOEZGIixzYWxtb246IiNGQTgwNzIiLGFudGlxdWV3aGl0ZToiI0ZBRUJENyIsbGluZW46IiNGQUYwRTYiLGxpZ2h0Z29sZGVucm9keWVsbG93OiIjRkFGQUQyIixvbGRsYWNlOiIjRkRGNUU2IixyZWQ6IiNGRjAwMDAiLGZ1Y2hzaWE6IiNGRjAwRkYiLG1hZ2VudGE6IiNGRjAwRkYiLGRlZXBwaW5rOiIjRkYxNDkzIixvcmFuZ2VyZWQ6IiNGRjQ1MDAiLHRvbWF0bzoiI0ZGNjM0NyIsaG90cGluazoiI0ZGNjlCNCIsY29yYWw6IiNGRjdGNTAiLGRhcmtvcmFuZ2U6IiNGRjhDMDAiLGxpZ2h0c2FsbW9uOiIjRkZBMDdBIixvcmFuZ2U6IiNGRkE1MDAiLGxpZ2h0cGluazoiI0ZGQjZDMSIscGluazoiI0ZGQzBDQiIsZ29sZDoiI0ZGRDcwMCIscGVhY2hwdWZmOiIjRkZEQUI5IixuYXZham93aGl0ZToiI0ZGREVBRCIsbW9jY2FzaW46IiNGRkU0QjUiLGJpc3F1ZToiI0ZGRTRDNCIsbWlzdHlyb3NlOiIjRkZFNEUxIixibGFuY2hlZGFsbW9uZDoiI0ZGRUJDRCIscGFwYXlhd2hpcDoiI0ZGRUZENSIsbGF2ZW5kZXJibHVzaDoiI0ZGRjBGNSIsc2Vhc2hlbGw6IiNGRkY1RUUiLGNvcm5zaWxrOiIjRkZGOERDIixsZW1vbmNoaWZmb246IiNGRkZBQ0QiLGZsb3JhbHdoaXRlOiIjRkZGQUYwIixzbm93OiIjRkZGQUZBIix5ZWxsb3c6IiNGRkZGMDAiLGxpZ2h0eWVsbG93OiIjRkZGRkUwIixpdm9yeToiI0ZGRkZGMCIsd2hpdGU6IiNGRkZGRkYifTtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIGVbdF19fSx7a2V5OiJzZXRDb2xvciIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9IShhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSl8fGFyZ3VtZW50c1sxXTtpZigibm9uZSIhPT10KXt2YXIgaT12b2lkIDAsbz10aGlzLl9pc0NvbG9yU3RyaW5nKHQpO2lmKHZvaWQgMCE9PW8mJih0PW8pLGEuaXNTdHJpbmcodCk9PT0hMCl7aWYoYS5pc1ZhbGlkUkdCKHQpPT09ITApe3ZhciBuPXQuc3Vic3RyKDQpLnN1YnN0cigwLHQubGVuZ3RoLTUpLnNwbGl0KCIsIik7aT17cjpuWzBdLGc6blsxXSxiOm5bMl0sYToxfX1lbHNlIGlmKGEuaXNWYWxpZFJHQkEodCk9PT0hMCl7dmFyIHM9dC5zdWJzdHIoNSkuc3Vic3RyKDAsdC5sZW5ndGgtNikuc3BsaXQoIiwiKTtpPXtyOnNbMF0sZzpzWzFdLGI6c1syXSxhOnNbM119fWVsc2UgaWYoYS5pc1ZhbGlkSGV4KHQpPT09ITApe3ZhciByPWEuaGV4VG9SR0IodCk7aT17cjpyLnIsZzpyLmcsYjpyLmIsYToxfX19ZWxzZSBpZih0IGluc3RhbmNlb2YgT2JqZWN0JiZ2b2lkIDAhPT10LnImJnZvaWQgMCE9PXQuZyYmdm9pZCAwIT09dC5iKXt2YXIgaD12b2lkIDAhPT10LmE/dC5hOiIxLjAiO2k9e3I6dC5yLGc6dC5nLGI6dC5iLGE6aH19aWYodm9pZCAwPT09aSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gY29sb3IgcGFzc2VkIHRvIHRoZSBjb2xvclBpY2tlci4gU3VwcG9ydGVkIGFyZSBzdHJpbmdzOiByZ2IsIGhleCwgcmdiYS4gT2JqZWN0OiByZ2IgKHtyOnIsZzpnLGI6YixbYTphXX0pLiBTdXBwbGllZDogIitKU09OLnN0cmluZ2lmeSh0KSk7dGhpcy5fc2V0Q29sb3IoaSxlKX19fSx7a2V5OiJzaG93Iix2YWx1ZTpmdW5jdGlvbigpe3ZvaWQgMCE9PXRoaXMuY2xvc2VDYWxsYmFjayYmKHRoaXMuY2xvc2VDYWxsYmFjaygpLHRoaXMuY2xvc2VDYWxsYmFjaz12b2lkIDApLHRoaXMuYXBwbGllZD0hMSx0aGlzLmZyYW1lLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLl9nZW5lcmF0ZUh1ZUNpcmNsZSgpfX0se2tleToiX2hpZGUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPSEoYXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0pfHxhcmd1bWVudHNbMF07ZT09PSEwJiYodGhpcy5wcmV2aW91c0NvbG9yPWEuZXh0ZW5kKHt9LHRoaXMuY29sb3IpKSx0aGlzLmFwcGxpZWQ9PT0hMCYmdGhpcy51cGRhdGVDYWxsYmFjayh0aGlzLmluaXRpYWxDb2xvciksdGhpcy5mcmFtZS5zdHlsZS5kaXNwbGF5PSJub25lIixzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dm9pZCAwIT09dC5jbG9zZUNhbGxiYWNrJiYodC5jbG9zZUNhbGxiYWNrKCksdC5jbG9zZUNhbGxiYWNrPXZvaWQgMCl9LDApfX0se2tleToiX3NhdmUiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy51cGRhdGVDYWxsYmFjayh0aGlzLmNvbG9yKSx0aGlzLmFwcGxpZWQ9ITEsdGhpcy5faGlkZSgpfX0se2tleToiX2FwcGx5Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuYXBwbGllZD0hMCx0aGlzLnVwZGF0ZUNhbGxiYWNrKHRoaXMuY29sb3IpLHRoaXMuX3VwZGF0ZVBpY2tlcih0aGlzLmNvbG9yKX19LHtrZXk6Il9sb2FkTGFzdCIsdmFsdWU6ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLnByZXZpb3VzQ29sb3I/dGhpcy5zZXRDb2xvcih0aGlzLnByZXZpb3VzQ29sb3IsITEpOmFsZXJ0KCJUaGVyZSBpcyBubyBsYXN0IGNvbG9yIHRvIGxvYWQuLi4iKX19LHtrZXk6Il9zZXRDb2xvciIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9IShhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSl8fGFyZ3VtZW50c1sxXTtlPT09ITAmJih0aGlzLmluaXRpYWxDb2xvcj1hLmV4dGVuZCh7fSx0KSksdGhpcy5jb2xvcj10O3ZhciBpPWEuUkdCVG9IU1YodC5yLHQuZyx0LmIpLG89MipNYXRoLlBJLG49dGhpcy5yKmkucyxzPXRoaXMuY2VudGVyQ29vcmRpbmF0ZXMueCtuKk1hdGguc2luKG8qaS5oKSxyPXRoaXMuY2VudGVyQ29vcmRpbmF0ZXMueStuKk1hdGguY29zKG8qaS5oKTt0aGlzLmNvbG9yUGlja2VyU2VsZWN0b3Iuc3R5bGUubGVmdD1zLS41KnRoaXMuY29sb3JQaWNrZXJTZWxlY3Rvci5jbGllbnRXaWR0aCsicHgiLHRoaXMuY29sb3JQaWNrZXJTZWxlY3Rvci5zdHlsZS50b3A9ci0uNSp0aGlzLmNvbG9yUGlja2VyU2VsZWN0b3IuY2xpZW50SGVpZ2h0KyJweCIsdGhpcy5fdXBkYXRlUGlja2VyKHQpfX0se2tleToiX3NldE9wYWNpdHkiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuY29sb3IuYT10LzEwMCx0aGlzLl91cGRhdGVQaWNrZXIodGhpcy5jb2xvcil9fSx7a2V5OiJfc2V0QnJpZ2h0bmVzcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YS5SR0JUb0hTVih0aGlzLmNvbG9yLnIsdGhpcy5jb2xvci5nLHRoaXMuY29sb3IuYik7ZS52PXQvMTAwO3ZhciBpPWEuSFNWVG9SR0IoZS5oLGUucyxlLnYpO2kuYT10aGlzLmNvbG9yLmEsdGhpcy5jb2xvcj1pLHRoaXMuX3VwZGF0ZVBpY2tlcigpfX0se2tleToiX3VwZGF0ZVBpY2tlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06dGhpcy5jb2xvcixlPWEuUkdCVG9IU1YodC5yLHQuZyx0LmIpLGk9dGhpcy5jb2xvclBpY2tlckNhbnZhcy5nZXRDb250ZXh0KCIyZCIpO3ZvaWQgMD09PXRoaXMucGl4ZWxSYXRpb24mJih0aGlzLnBpeGVsUmF0aW89KHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfHwxKS8oaS53ZWJraXRCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHxpLm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fGkubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHxpLm9CYWNraW5nU3RvcmVQaXhlbFJhdGlvfHxpLmJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fDEpKSxpLnNldFRyYW5zZm9ybSh0aGlzLnBpeGVsUmF0aW8sMCwwLHRoaXMucGl4ZWxSYXRpbywwLDApO3ZhciBvPXRoaXMuY29sb3JQaWNrZXJDYW52YXMuY2xpZW50V2lkdGgsbj10aGlzLmNvbG9yUGlja2VyQ2FudmFzLmNsaWVudEhlaWdodDtpLmNsZWFyUmVjdCgwLDAsbyxuKSxpLnB1dEltYWdlRGF0YSh0aGlzLmh1ZUNpcmNsZSwwLDApLGkuZmlsbFN0eWxlPSJyZ2JhKDAsMCwwLCIrKDEtZS52KSsiKSIsaS5jaXJjbGUodGhpcy5jZW50ZXJDb29yZGluYXRlcy54LHRoaXMuY2VudGVyQ29vcmRpbmF0ZXMueSx0aGlzLnIpLGkuZmlsbCgpLHRoaXMuYnJpZ2h0bmVzc1JhbmdlLnZhbHVlPTEwMCplLnYsdGhpcy5vcGFjaXR5UmFuZ2UudmFsdWU9MTAwKnQuYSx0aGlzLmluaXRpYWxDb2xvckRpdi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9InJnYmEoIit0aGlzLmluaXRpYWxDb2xvci5yKyIsIit0aGlzLmluaXRpYWxDb2xvci5nKyIsIit0aGlzLmluaXRpYWxDb2xvci5iKyIsIit0aGlzLmluaXRpYWxDb2xvci5hKyIpIix0aGlzLm5ld0NvbG9yRGl2LnN0eWxlLmJhY2tncm91bmRDb2xvcj0icmdiYSgiK3RoaXMuY29sb3IucisiLCIrdGhpcy5jb2xvci5nKyIsIit0aGlzLmNvbG9yLmIrIiwiK3RoaXMuY29sb3IuYSsiKSJ9fSx7a2V5OiJfc2V0U2l6ZSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmNvbG9yUGlja2VyQ2FudmFzLnN0eWxlLndpZHRoPSIxMDAlIix0aGlzLmNvbG9yUGlja2VyQ2FudmFzLnN0eWxlLmhlaWdodD0iMTAwJSIsdGhpcy5jb2xvclBpY2tlckNhbnZhcy53aWR0aD0yODkqdGhpcy5waXhlbFJhdGlvLHRoaXMuY29sb3JQaWNrZXJDYW52YXMuaGVpZ2h0PTI4OSp0aGlzLnBpeGVsUmF0aW99fSx7a2V5OiJfY3JlYXRlIix2YWx1ZTpmdW5jdGlvbigpe2lmKHRoaXMuZnJhbWU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5mcmFtZS5jbGFzc05hbWU9InZpcy1jb2xvci1waWNrZXIiLHRoaXMuY29sb3JQaWNrZXJEaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb2xvclBpY2tlclNlbGVjdG9yPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29sb3JQaWNrZXJTZWxlY3Rvci5jbGFzc05hbWU9InZpcy1zZWxlY3RvciIsdGhpcy5jb2xvclBpY2tlckRpdi5hcHBlbmRDaGlsZCh0aGlzLmNvbG9yUGlja2VyU2VsZWN0b3IpLHRoaXMuY29sb3JQaWNrZXJDYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksdGhpcy5jb2xvclBpY2tlckRpdi5hcHBlbmRDaGlsZCh0aGlzLmNvbG9yUGlja2VyQ2FudmFzKSx0aGlzLmNvbG9yUGlja2VyQ2FudmFzLmdldENvbnRleHQpe3ZhciB0PXRoaXMuY29sb3JQaWNrZXJDYW52YXMuZ2V0Q29udGV4dCgiMmQiKTt0aGlzLnBpeGVsUmF0aW89KHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfHwxKS8odC53ZWJraXRCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0Lm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fHQubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0Lm9CYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0LmJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fDEpLHRoaXMuY29sb3JQaWNrZXJDYW52YXMuZ2V0Q29udGV4dCgiMmQiKS5zZXRUcmFuc2Zvcm0odGhpcy5waXhlbFJhdGlvLDAsMCx0aGlzLnBpeGVsUmF0aW8sMCwwKX1lbHNle3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpO2Uuc3R5bGUuY29sb3I9InJlZCIsZS5zdHlsZS5mb250V2VpZ2h0PSJib2xkIixlLnN0eWxlLnBhZGRpbmc9IjEwcHgiLGUuaW5uZXJIVE1MPSJFcnJvcjogeW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgSFRNTCBjYW52YXMiLHRoaXMuY29sb3JQaWNrZXJDYW52YXMuYXBwZW5kQ2hpbGQoZSl9dGhpcy5jb2xvclBpY2tlckRpdi5jbGFzc05hbWU9InZpcy1jb2xvciIsdGhpcy5vcGFjaXR5RGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMub3BhY2l0eURpdi5jbGFzc05hbWU9InZpcy1vcGFjaXR5Iix0aGlzLmJyaWdodG5lc3NEaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5icmlnaHRuZXNzRGl2LmNsYXNzTmFtZT0idmlzLWJyaWdodG5lc3MiLHRoaXMuYXJyb3dEaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5hcnJvd0Rpdi5jbGFzc05hbWU9InZpcy1hcnJvdyIsdGhpcy5vcGFjaXR5UmFuZ2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTt0cnl7dGhpcy5vcGFjaXR5UmFuZ2UudHlwZT0icmFuZ2UiLHRoaXMub3BhY2l0eVJhbmdlLm1pbj0iMCIsdGhpcy5vcGFjaXR5UmFuZ2UubWF4PSIxMDAifWNhdGNoKHQpe310aGlzLm9wYWNpdHlSYW5nZS52YWx1ZT0iMTAwIix0aGlzLm9wYWNpdHlSYW5nZS5jbGFzc05hbWU9InZpcy1yYW5nZSIsdGhpcy5icmlnaHRuZXNzUmFuZ2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTt0cnl7dGhpcy5icmlnaHRuZXNzUmFuZ2UudHlwZT0icmFuZ2UiLHRoaXMuYnJpZ2h0bmVzc1JhbmdlLm1pbj0iMCIsdGhpcy5icmlnaHRuZXNzUmFuZ2UubWF4PSIxMDAifWNhdGNoKHQpe310aGlzLmJyaWdodG5lc3NSYW5nZS52YWx1ZT0iMTAwIix0aGlzLmJyaWdodG5lc3NSYW5nZS5jbGFzc05hbWU9InZpcy1yYW5nZSIsdGhpcy5vcGFjaXR5RGl2LmFwcGVuZENoaWxkKHRoaXMub3BhY2l0eVJhbmdlKSx0aGlzLmJyaWdodG5lc3NEaXYuYXBwZW5kQ2hpbGQodGhpcy5icmlnaHRuZXNzUmFuZ2UpO3ZhciBpPXRoaXM7dGhpcy5vcGFjaXR5UmFuZ2Uub25jaGFuZ2U9ZnVuY3Rpb24oKXtpLl9zZXRPcGFjaXR5KHRoaXMudmFsdWUpfSx0aGlzLm9wYWNpdHlSYW5nZS5vbmlucHV0PWZ1bmN0aW9uKCl7aS5fc2V0T3BhY2l0eSh0aGlzLnZhbHVlKX0sdGhpcy5icmlnaHRuZXNzUmFuZ2Uub25jaGFuZ2U9ZnVuY3Rpb24oKXtpLl9zZXRCcmlnaHRuZXNzKHRoaXMudmFsdWUpfSx0aGlzLmJyaWdodG5lc3NSYW5nZS5vbmlucHV0PWZ1bmN0aW9uKCl7aS5fc2V0QnJpZ2h0bmVzcyh0aGlzLnZhbHVlKX0sdGhpcy5icmlnaHRuZXNzTGFiZWw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5icmlnaHRuZXNzTGFiZWwuY2xhc3NOYW1lPSJ2aXMtbGFiZWwgdmlzLWJyaWdodG5lc3MiLHRoaXMuYnJpZ2h0bmVzc0xhYmVsLmlubmVySFRNTD0iYnJpZ2h0bmVzczoiLHRoaXMub3BhY2l0eUxhYmVsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMub3BhY2l0eUxhYmVsLmNsYXNzTmFtZT0idmlzLWxhYmVsIHZpcy1vcGFjaXR5Iix0aGlzLm9wYWNpdHlMYWJlbC5pbm5lckhUTUw9Im9wYWNpdHk6Iix0aGlzLm5ld0NvbG9yRGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMubmV3Q29sb3JEaXYuY2xhc3NOYW1lPSJ2aXMtbmV3LWNvbG9yIix0aGlzLm5ld0NvbG9yRGl2LmlubmVySFRNTD0ibmV3Iix0aGlzLmluaXRpYWxDb2xvckRpdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmluaXRpYWxDb2xvckRpdi5jbGFzc05hbWU9InZpcy1pbml0aWFsLWNvbG9yIix0aGlzLmluaXRpYWxDb2xvckRpdi5pbm5lckhUTUw9ImluaXRpYWwiLHRoaXMuY2FuY2VsQnV0dG9uPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY2FuY2VsQnV0dG9uLmNsYXNzTmFtZT0idmlzLWJ1dHRvbiB2aXMtY2FuY2VsIix0aGlzLmNhbmNlbEJ1dHRvbi5pbm5lckhUTUw9ImNhbmNlbCIsdGhpcy5jYW5jZWxCdXR0b24ub25jbGljaz10aGlzLl9oaWRlLmJpbmQodGhpcywhMSksdGhpcy5hcHBseUJ1dHRvbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmFwcGx5QnV0dG9uLmNsYXNzTmFtZT0idmlzLWJ1dHRvbiB2aXMtYXBwbHkiLHRoaXMuYXBwbHlCdXR0b24uaW5uZXJIVE1MPSJhcHBseSIsdGhpcy5hcHBseUJ1dHRvbi5vbmNsaWNrPXRoaXMuX2FwcGx5LmJpbmQodGhpcyksdGhpcy5zYXZlQnV0dG9uPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuc2F2ZUJ1dHRvbi5jbGFzc05hbWU9InZpcy1idXR0b24gdmlzLXNhdmUiLHRoaXMuc2F2ZUJ1dHRvbi5pbm5lckhUTUw9InNhdmUiLHRoaXMuc2F2ZUJ1dHRvbi5vbmNsaWNrPXRoaXMuX3NhdmUuYmluZCh0aGlzKSx0aGlzLmxvYWRCdXR0b249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5sb2FkQnV0dG9uLmNsYXNzTmFtZT0idmlzLWJ1dHRvbiB2aXMtbG9hZCIsdGhpcy5sb2FkQnV0dG9uLmlubmVySFRNTD0ibG9hZCBsYXN0Iix0aGlzLmxvYWRCdXR0b24ub25jbGljaz10aGlzLl9sb2FkTGFzdC5iaW5kKHRoaXMpLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5jb2xvclBpY2tlckRpdiksdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmFycm93RGl2KSx0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuYnJpZ2h0bmVzc0xhYmVsKSx0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuYnJpZ2h0bmVzc0RpdiksdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLm9wYWNpdHlMYWJlbCksdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLm9wYWNpdHlEaXYpLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5uZXdDb2xvckRpdiksdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmluaXRpYWxDb2xvckRpdiksdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmNhbmNlbEJ1dHRvbiksdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmFwcGx5QnV0dG9uKSx0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuc2F2ZUJ1dHRvbiksdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmxvYWRCdXR0b24pfX0se2tleToiX2JpbmRIYW1tZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmRyYWc9e30sdGhpcy5waW5jaD17fSx0aGlzLmhhbW1lcj1uZXcgcyh0aGlzLmNvbG9yUGlja2VyQ2FudmFzKSx0aGlzLmhhbW1lci5nZXQoInBpbmNoIikuc2V0KHtlbmFibGU6ITB9KSxyLm9uVG91Y2godGhpcy5oYW1tZXIsZnVuY3Rpb24oZSl7dC5fbW92ZVNlbGVjdG9yKGUpfSksdGhpcy5oYW1tZXIub24oInRhcCIsZnVuY3Rpb24oZSl7dC5fbW92ZVNlbGVjdG9yKGUpfSksdGhpcy5oYW1tZXIub24oInBhbnN0YXJ0IixmdW5jdGlvbihlKXt0Ll9tb3ZlU2VsZWN0b3IoZSl9KSx0aGlzLmhhbW1lci5vbigicGFubW92ZSIsZnVuY3Rpb24oZSl7dC5fbW92ZVNlbGVjdG9yKGUpfSksdGhpcy5oYW1tZXIub24oInBhbmVuZCIsZnVuY3Rpb24oZSl7dC5fbW92ZVNlbGVjdG9yKGUpfSl9fSx7a2V5OiJfZ2VuZXJhdGVIdWVDaXJjbGUiLHZhbHVlOmZ1bmN0aW9uKCl7aWYodGhpcy5nZW5lcmF0ZWQ9PT0hMSl7dmFyIHQ9dGhpcy5jb2xvclBpY2tlckNhbnZhcy5nZXRDb250ZXh0KCIyZCIpO3ZvaWQgMD09PXRoaXMucGl4ZWxSYXRpb24mJih0aGlzLnBpeGVsUmF0aW89KHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfHwxKS8odC53ZWJraXRCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0Lm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fHQubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0Lm9CYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0LmJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fDEpKSx0LnNldFRyYW5zZm9ybSh0aGlzLnBpeGVsUmF0aW8sMCwwLHRoaXMucGl4ZWxSYXRpbywwLDApO3ZhciBlPXRoaXMuY29sb3JQaWNrZXJDYW52YXMuY2xpZW50V2lkdGgsaT10aGlzLmNvbG9yUGlja2VyQ2FudmFzLmNsaWVudEhlaWdodDt0LmNsZWFyUmVjdCgwLDAsZSxpKTt2YXIgbz12b2lkIDAsbj12b2lkIDAscz12b2lkIDAscj12b2lkIDA7dGhpcy5jZW50ZXJDb29yZGluYXRlcz17eDouNSplLHk6LjUqaX0sdGhpcy5yPS40OSplO3ZhciBoPTIqTWF0aC5QSS8zNjAsZD0xLzM2MCxsPTEvdGhpcy5yLGM9dm9pZCAwO2ZvcihzPTA7czwzNjA7cysrKWZvcihyPTA7cjx0aGlzLnI7cisrKW89dGhpcy5jZW50ZXJDb29yZGluYXRlcy54K3IqTWF0aC5zaW4oaCpzKSxuPXRoaXMuY2VudGVyQ29vcmRpbmF0ZXMueStyKk1hdGguY29zKGgqcyksYz1hLkhTVlRvUkdCKHMqZCxyKmwsMSksdC5maWxsU3R5bGU9InJnYigiK2MucisiLCIrYy5nKyIsIitjLmIrIikiLHQuZmlsbFJlY3Qoby0uNSxuLS41LDIsMik7dC5zdHJva2VTdHlsZT0icmdiYSgwLDAsMCwxKSIsdC5jaXJjbGUodGhpcy5jZW50ZXJDb29yZGluYXRlcy54LHRoaXMuY2VudGVyQ29vcmRpbmF0ZXMueSx0aGlzLnIpLHQuc3Ryb2tlKCksdGhpcy5odWVDaXJjbGU9dC5nZXRJbWFnZURhdGEoMCwwLGUsaSl9dGhpcy5nZW5lcmF0ZWQ9ITB9fSx7a2V5OiJfbW92ZVNlbGVjdG9yIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmNvbG9yUGlja2VyRGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGk9dC5jZW50ZXIueC1lLmxlZnQsbz10LmNlbnRlci55LWUudG9wLG49LjUqdGhpcy5jb2xvclBpY2tlckRpdi5jbGllbnRIZWlnaHQscz0uNSp0aGlzLmNvbG9yUGlja2VyRGl2LmNsaWVudFdpZHRoLHI9aS1zLGg9by1uLGQ9TWF0aC5hdGFuMihyLGgpLGw9Ljk4Kk1hdGgubWluKE1hdGguc3FydChyKnIraCpoKSxzKSxjPU1hdGguY29zKGQpKmwrbix1PU1hdGguc2luKGQpKmwrczt0aGlzLmNvbG9yUGlja2VyU2VsZWN0b3Iuc3R5bGUudG9wPWMtLjUqdGhpcy5jb2xvclBpY2tlclNlbGVjdG9yLmNsaWVudEhlaWdodCsicHgiLHRoaXMuY29sb3JQaWNrZXJTZWxlY3Rvci5zdHlsZS5sZWZ0PXUtLjUqdGhpcy5jb2xvclBpY2tlclNlbGVjdG9yLmNsaWVudFdpZHRoKyJweCI7dmFyIHA9ZC8oMipNYXRoLlBJKTtwPXA8MD9wKzE6cDt2YXIgZj1sL3RoaXMucixtPWEuUkdCVG9IU1YodGhpcy5jb2xvci5yLHRoaXMuY29sb3IuZyx0aGlzLmNvbG9yLmIpO20uaD1wLG0ucz1mO3ZhciB2PWEuSFNWVG9SR0IobS5oLG0ucyxtLnYpO3YuYT10aGlzLmNvbG9yLmEsdGhpcy5jb2xvcj12LHRoaXMuaW5pdGlhbENvbG9yRGl2LnN0eWxlLmJhY2tncm91bmRDb2xvcj0icmdiYSgiK3RoaXMuaW5pdGlhbENvbG9yLnIrIiwiK3RoaXMuaW5pdGlhbENvbG9yLmcrIiwiK3RoaXMuaW5pdGlhbENvbG9yLmIrIiwiK3RoaXMuaW5pdGlhbENvbG9yLmErIikiLHRoaXMubmV3Q29sb3JEaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yPSJyZ2JhKCIrdGhpcy5jb2xvci5yKyIsIit0aGlzLmNvbG9yLmcrIiwiK3RoaXMuY29sb3IuYisiLCIrdGhpcy5jb2xvci5hKyIpIn19XSksdH0oKTtlLmRlZmF1bHQ9aH0sZnVuY3Rpb24odCxlLGkpe2koMjIpO2Uub25Ub3VjaD1mdW5jdGlvbih0LGUpe2UuaW5wdXRIYW5kbGVyPWZ1bmN0aW9uKHQpe3QuaXNGaXJzdCYmZSh0KX0sdC5vbigiaGFtbWVyLmlucHV0IixlLmlucHV0SGFuZGxlcil9LGUub25SZWxlYXNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuaW5wdXRIYW5kbGVyPWZ1bmN0aW9uKHQpe3QuaXNGaW5hbCYmZSh0KX0sdC5vbigiaGFtbWVyLmlucHV0IixlLmlucHV0SGFuZGxlcil9LGUub2ZmVG91Y2g9ZnVuY3Rpb24odCxlKXt0Lm9mZigiaGFtbWVyLmlucHV0IixlLmlucHV0SGFuZGxlcil9LGUub2ZmUmVsZWFzZT1lLm9mZlRvdWNoLGUuZGlzYWJsZVByZXZlbnREZWZhdWx0VmVydGljYWxseT1mdW5jdGlvbih0KXt2YXIgZT0icGFuLXkiO3JldHVybiB0LmdldFRvdWNoQWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuW2VdfSx0fX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9LHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxvJiZ0KGUsbyksZX19KCkscj1pKDEpLGE9ITEsaD12b2lkIDAsZD0iYmFja2dyb3VuZDogI0ZGZWVlZTsgY29sb3I6ICNkZDAwMDAiLGw9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7byh0aGlzLHQpfXJldHVybiBzKHQsbnVsbCxbe2tleToidmFsaWRhdGUiLHZhbHVlOmZ1bmN0aW9uKGUsaSxvKXthPSExLGg9aTt2YXIgbj1pO3JldHVybiB2b2lkIDAhPT1vJiYobj1pW29dKSx0LnBhcnNlKGUsbixbXSksYX19LHtrZXk6InBhcnNlIix2YWx1ZTpmdW5jdGlvbihlLGksbyl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmdC5jaGVjayhuLGUsaSxvKX19LHtrZXk6ImNoZWNrIix2YWx1ZTpmdW5jdGlvbihlLGksbyxuKXt2b2lkIDA9PT1vW2VdJiZ2b2lkIDA9PT1vLl9fYW55X18/dC5nZXRTdWdnZXN0aW9uKGUsbyxuKTp2b2lkIDA9PT1vW2VdJiZ2b2lkIDAhPT1vLl9fYW55X18/Im9iamVjdCI9PT10LmdldFR5cGUoaVtlXSkmJnZvaWQgMCE9PW8uX19hbnlfXy5fX3R5cGVfXz90LmNoZWNrRmllbGRzKGUsaSxvLCJfX2FueV9fIixvLl9fYW55X18uX190eXBlX18sbik6dC5jaGVja0ZpZWxkcyhlLGksbywiX19hbnlfXyIsby5fX2FueV9fLG4pOnZvaWQgMCE9PW9bZV0uX190eXBlX18/dC5jaGVja0ZpZWxkcyhlLGksbyxlLG9bZV0uX190eXBlX18sbik6dC5jaGVja0ZpZWxkcyhlLGksbyxlLG9bZV0sbil9fSx7a2V5OiJjaGVja0ZpZWxkcyIsdmFsdWU6ZnVuY3Rpb24oZSxpLG8sbixzLGgpe3ZhciBsPXQuZ2V0VHlwZShpW2VdKSxjPXNbbF07dm9pZCAwIT09Yz8iYXJyYXkiPT09dC5nZXRUeXBlKGMpJiZjLmluZGV4T2YoaVtlXSk9PT0tMT8oY29uc29sZS5sb2coJyVjSW52YWxpZCBvcHRpb24gZGV0ZWN0ZWQgaW4gIicrZSsnIi4gQWxsb3dlZCB2YWx1ZXMgYXJlOicrdC5wcmludChjKSsnIG5vdCAiJytpW2VdKyciLiAnK3QucHJpbnRMb2NhdGlvbihoLGUpLGQpLGE9ITApOiJvYmplY3QiPT09bCYmIl9fYW55X18iIT09biYmKGg9ci5jb3B5QW5kRXh0ZW5kQXJyYXkoaCxlKSx0LnBhcnNlKGlbZV0sb1tuXSxoKSk6dm9pZCAwPT09cy5hbnkmJihjb25zb2xlLmxvZygnJWNJbnZhbGlkIHR5cGUgcmVjZWl2ZWQgZm9yICInK2UrJyIuIEV4cGVjdGVkOiAnK3QucHJpbnQoT2JqZWN0LmtleXMocykpKyIuIFJlY2VpdmVkIFsiK2wrJ10gIicraVtlXSsnIicrdC5wcmludExvY2F0aW9uKGgsZSksZCksYT0hMCl9fSx7a2V5OiJnZXRUeXBlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT0idW5kZWZpbmVkIj09dHlwZW9mIHQ/InVuZGVmaW5lZCI6bih0KTtyZXR1cm4ib2JqZWN0Ij09PWU/bnVsbD09PXQ/Im51bGwiOnQgaW5zdGFuY2VvZiBCb29sZWFuPyJib29sZWFuIjp0IGluc3RhbmNlb2YgTnVtYmVyPyJudW1iZXIiOnQgaW5zdGFuY2VvZiBTdHJpbmc/InN0cmluZyI6QXJyYXkuaXNBcnJheSh0KT8iYXJyYXkiOnQgaW5zdGFuY2VvZiBEYXRlPyJkYXRlIjp2b2lkIDAhPT10Lm5vZGVUeXBlPyJkb20iOnQuX2lzQU1vbWVudE9iamVjdD09PSEwPyJtb21lbnQiOiJvYmplY3QiOiJudW1iZXIiPT09ZT8ibnVtYmVyIjoiYm9vbGVhbiI9PT1lPyJib29sZWFuIjoic3RyaW5nIj09PWU/InN0cmluZyI6dm9pZCAwPT09ZT8idW5kZWZpbmVkIjplfX0se2tleToiZ2V0U3VnZ2VzdGlvbiIsdmFsdWU6ZnVuY3Rpb24oZSxpLG8pe3ZhciBuPXQuZmluZEluT3B0aW9ucyhlLGksbywhMSkscz10LmZpbmRJbk9wdGlvbnMoZSxoLFtdLCEwKSxyPTgsbD00O3ZvaWQgMCE9PW4uaW5kZXhNYXRjaD9jb25zb2xlLmxvZygnJWNVbmtub3duIG9wdGlvbiBkZXRlY3RlZDogIicrZSsnIiBpbiAnK3QucHJpbnRMb2NhdGlvbihuLnBhdGgsZSwiIikrJ1BlcmhhcHMgaXQgd2FzIGluY29tcGxldGU/IERpZCB5b3UgbWVhbjogIicrbi5pbmRleE1hdGNoKyciP1xuXG4nLGQpOnMuZGlzdGFuY2U8PWwmJm4uZGlzdGFuY2U+cy5kaXN0YW5jZT9jb25zb2xlLmxvZygnJWNVbmtub3duIG9wdGlvbiBkZXRlY3RlZDogIicrZSsnIiBpbiAnK3QucHJpbnRMb2NhdGlvbihuLnBhdGgsZSwiIikrIlBlcmhhcHMgaXQgd2FzIG1pc3BsYWNlZD8gTWF0Y2hpbmcgb3B0aW9uIGZvdW5kIGF0OiAiK3QucHJpbnRMb2NhdGlvbihzLnBhdGgscy5jbG9zZXN0TWF0Y2gsIiIpLGQpOm4uZGlzdGFuY2U8PXI/Y29uc29sZS5sb2coJyVjVW5rbm93biBvcHRpb24gZGV0ZWN0ZWQ6ICInK2UrJyIuIERpZCB5b3UgbWVhbiAiJytuLmNsb3Nlc3RNYXRjaCsnIj8nK3QucHJpbnRMb2NhdGlvbihuLnBhdGgsZSksZCk6Y29uc29sZS5sb2coJyVjVW5rbm93biBvcHRpb24gZGV0ZWN0ZWQ6ICInK2UrJyIuIERpZCB5b3UgbWVhbiBvbmUgb2YgdGhlc2U6ICcrdC5wcmludChPYmplY3Qua2V5cyhpKSkrdC5wcmludExvY2F0aW9uKG8sZSksZCksYT0hMH19LHtrZXk6ImZpbmRJbk9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKGUsaSxvKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXSYmYXJndW1lbnRzWzNdLHM9MWU5LGE9IiIsaD1bXSxkPWUudG9Mb3dlckNhc2UoKSxsPXZvaWQgMDtmb3IodmFyIGMgaW4gaSl7dmFyIHU9dm9pZCAwO2lmKHZvaWQgMCE9PWlbY10uX190eXBlX18mJm49PT0hMCl7dmFyIHA9dC5maW5kSW5PcHRpb25zKGUsaVtjXSxyLmNvcHlBbmRFeHRlbmRBcnJheShvLGMpKTtzPnAuZGlzdGFuY2UmJihhPXAuY2xvc2VzdE1hdGNoLGg9cC5wYXRoLHM9cC5kaXN0YW5jZSxsPXAuaW5kZXhNYXRjaCl9ZWxzZSBjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihkKSE9PS0xJiYobD1jKSx1PXQubGV2ZW5zaHRlaW5EaXN0YW5jZShlLGMpLHM+dSYmKGE9YyxoPXIuY29weUFycmF5KG8pLHM9dSl9cmV0dXJue2Nsb3Nlc3RNYXRjaDphLHBhdGg6aCxkaXN0YW5jZTpzLGluZGV4TWF0Y2g6bH19fSx7a2V5OiJwcmludExvY2F0aW9uIix2YWx1ZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06IlByb2JsZW0gdmFsdWUgZm91bmQgYXQ6IFxuIixvPSJcblxuIitpKyJvcHRpb25zID0ge1xuIixuPTA7bjx0Lmxlbmd0aDtuKyspe2Zvcih2YXIgcz0wO3M8bisxO3MrKylvKz0iICAiO28rPXRbbl0rIjoge1xuIn1mb3IodmFyIHI9MDtyPHQubGVuZ3RoKzE7cisrKW8rPSIgICI7bys9ZSsiXG4iO2Zvcih2YXIgYT0wO2E8dC5sZW5ndGgrMTthKyspe2Zvcih2YXIgaD0wO2g8dC5sZW5ndGgtYTtoKyspbys9IiAgIjtvKz0ifVxuIn1yZXR1cm4gbysiXG5cbiJ9fSx7a2V5OiJwcmludCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHQpLnJlcGxhY2UoLyhcIil8KFxbKXwoXF0pfCgsIl9fdHlwZV9fIikvZywiIikucmVwbGFjZSgvKFwsKS9nLCIsICIpfX0se2tleToibGV2ZW5zaHRlaW5EaXN0YW5jZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtpZigwPT09dC5sZW5ndGgpcmV0dXJuIGUubGVuZ3RoO2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gdC5sZW5ndGg7dmFyIGksbz1bXTtmb3IoaT0wO2k8PWUubGVuZ3RoO2krKylvW2ldPVtpXTt2YXIgbjtmb3Iobj0wO248PXQubGVuZ3RoO24rKylvWzBdW25dPW47Zm9yKGk9MTtpPD1lLmxlbmd0aDtpKyspZm9yKG49MTtuPD10Lmxlbmd0aDtuKyspZS5jaGFyQXQoaS0xKT09dC5jaGFyQXQobi0xKT9vW2ldW25dPW9baS0xXVtuLTFdOm9baV1bbl09TWF0aC5taW4ob1tpLTFdW24tMV0rMSxNYXRoLm1pbihvW2ldW24tMV0rMSxvW2ktMV1bbl0rMSkpO3JldHVybiBvW2UubGVuZ3RoXVt0Lmxlbmd0aF19fV0pLHR9KCk7ZS5kZWZhdWx0PWwsZS5wcmludFN0eWxlPWR9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSl7dmFyIGk9YSgpLmhvdXJzKDApLm1pbnV0ZXMoMCkuc2Vjb25kcygwKS5taWxsaXNlY29uZHMoMCk7dGhpcy5zdGFydD1pLmNsb25lKCkuYWRkKC0zLCJkYXlzIikudmFsdWVPZigpLHRoaXMuZW5kPWkuY2xvbmUoKS5hZGQoNCwiZGF5cyIpLnZhbHVlT2YoKSx0aGlzLmJvZHk9dCx0aGlzLmRlbHRhRGlmZmVyZW5jZT0wLHRoaXMuc2NhbGVPZmZzZXQ9MCx0aGlzLnN0YXJ0VG9Gcm9udD0hMSx0aGlzLmVuZFRvRnJvbnQ9ITAsdGhpcy5kZWZhdWx0T3B0aW9ucz17cnRsOiExLHN0YXJ0Om51bGwsZW5kOm51bGwsbW9tZW50OmEsZGlyZWN0aW9uOiJob3Jpem9udGFsIixtb3ZlYWJsZTohMCx6b29tYWJsZTohMCxtaW46bnVsbCxtYXg6bnVsbCx6b29tTWluOjEwLHpvb21NYXg6MzE1MzZlMTB9LHRoaXMub3B0aW9ucz1yLmV4dGVuZCh7fSx0aGlzLmRlZmF1bHRPcHRpb25zKSx0aGlzLnByb3BzPXt0b3VjaDp7fX0sdGhpcy5hbmltYXRpb25UaW1lcj1udWxsLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJwYW5zdGFydCIsdGhpcy5fb25EcmFnU3RhcnQuYmluZCh0aGlzKSksdGhpcy5ib2R5LmVtaXR0ZXIub24oInBhbm1vdmUiLHRoaXMuX29uRHJhZy5iaW5kKHRoaXMpKSx0aGlzLmJvZHkuZW1pdHRlci5vbigicGFuZW5kIix0aGlzLl9vbkRyYWdFbmQuYmluZCh0aGlzKSksdGhpcy5ib2R5LmVtaXR0ZXIub24oIm1vdXNld2hlZWwiLHRoaXMuX29uTW91c2VXaGVlbC5iaW5kKHRoaXMpKSx0aGlzLmJvZHkuZW1pdHRlci5vbigidG91Y2giLHRoaXMuX29uVG91Y2guYmluZCh0aGlzKSksdGhpcy5ib2R5LmVtaXR0ZXIub24oInBpbmNoIix0aGlzLl9vblBpbmNoLmJpbmQodGhpcykpLHRoaXMuc2V0T3B0aW9ucyhlKX1mdW5jdGlvbiBuKHQpe2lmKCJob3Jpem9udGFsIiE9dCYmInZlcnRpY2FsIiE9dCl0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGRpcmVjdGlvbiAiJyt0KyciLiBDaG9vc2UgImhvcml6b250YWwiIG9yICJ2ZXJ0aWNhbCIuJyl9dmFyIHM9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9LHI9aSgxKSxhPShpKDMwKSxpKDIpKSxoPWkoMzMpLGQ9aSgzNCk7by5wcm90b3R5cGU9bmV3IGgsby5wcm90b3R5cGUuc2V0T3B0aW9ucz1mdW5jdGlvbih0KXtpZih0KXt2YXIgZT1bImRpcmVjdGlvbiIsIm1pbiIsIm1heCIsInpvb21NaW4iLCJ6b29tTWF4IiwibW92ZWFibGUiLCJ6b29tYWJsZSIsIm1vbWVudCIsImFjdGl2YXRlIiwiaGlkZGVuRGF0ZXMiLCJ6b29tS2V5IiwicnRsIiwiaG9yaXpvbnRhbFNjcm9sbCJdO3Iuc2VsZWN0aXZlRXh0ZW5kKGUsdGhpcy5vcHRpb25zLHQpLCgic3RhcnQiaW4gdHx8ImVuZCJpbiB0KSYmdGhpcy5zZXRSYW5nZSh0LnN0YXJ0LHQuZW5kKX19LG8ucHJvdG90eXBlLnNldFJhbmdlPWZ1bmN0aW9uKHQsZSxpLG8pe28hPT0hMCYmKG89ITEpO3ZhciBuPXZvaWQgMCE9dD9yLmNvbnZlcnQodCwiRGF0ZSIpLnZhbHVlT2YoKTpudWxsLGE9dm9pZCAwIT1lP3IuY29udmVydChlLCJEYXRlIikudmFsdWVPZigpOm51bGw7aWYodGhpcy5fY2FuY2VsQW5pbWF0aW9uKCksaSl7dmFyIGg9dGhpcyxsPXRoaXMuc3RhcnQsYz10aGlzLmVuZCx1PSJvYmplY3QiPT09KCJ1bmRlZmluZWQiPT10eXBlb2YgaT8idW5kZWZpbmVkIjpzKGkpKSYmImR1cmF0aW9uImluIGk/aS5kdXJhdGlvbjo1MDAscD0ib2JqZWN0Ij09PSgidW5kZWZpbmVkIj09dHlwZW9mIGk/InVuZGVmaW5lZCI6cyhpKSkmJiJlYXNpbmdGdW5jdGlvbiJpbiBpP2kuZWFzaW5nRnVuY3Rpb246ImVhc2VJbk91dFF1YWQiLGY9ci5lYXNpbmdGdW5jdGlvbnNbcF07aWYoIWYpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGVhc2luZyBmdW5jdGlvbiAiK0pTT04uc3RyaW5naWZ5KHApKyIuIENob29zZSBmcm9tOiAiK09iamVjdC5rZXlzKHIuZWFzaW5nRnVuY3Rpb25zKS5qb2luKCIsICIpKTt2YXIgbT0obmV3IERhdGUpLnZhbHVlT2YoKSx2PSExLGc9ZnVuY3Rpb24gdCgpe2lmKCFoLnByb3BzLnRvdWNoLmRyYWdnaW5nKXt2YXIgZT0obmV3IERhdGUpLnZhbHVlT2YoKSxpPWUtbSxzPWYoaS91KSxyPWk+dSxwPXJ8fG51bGw9PT1uP246bCsobi1sKSpzLGc9cnx8bnVsbD09PWE/YTpjKyhhLWMpKnM7eT1oLl9hcHBseVJhbmdlKHAsZyksZC51cGRhdGVIaWRkZW5EYXRlcyhoLm9wdGlvbnMubW9tZW50LGguYm9keSxoLm9wdGlvbnMuaGlkZGVuRGF0ZXMpLHY9dnx8eSx5JiZoLmJvZHkuZW1pdHRlci5lbWl0KCJyYW5nZWNoYW5nZSIse3N0YXJ0Om5ldyBEYXRlKGguc3RhcnQpLGVuZDpuZXcgRGF0ZShoLmVuZCksYnlVc2VyOm99KSxyP3YmJmguYm9keS5lbWl0dGVyLmVtaXQoInJhbmdlY2hhbmdlZCIse3N0YXJ0Om5ldyBEYXRlKGguc3RhcnQpLGVuZDpuZXcgRGF0ZShoLmVuZCksYnlVc2VyOm99KTpoLmFuaW1hdGlvblRpbWVyPXNldFRpbWVvdXQodCwyMCl9fTtyZXR1cm4gZygpfXZhciB5PXRoaXMuX2FwcGx5UmFuZ2UobixhKTtpZihkLnVwZGF0ZUhpZGRlbkRhdGVzKHRoaXMub3B0aW9ucy5tb21lbnQsdGhpcy5ib2R5LHRoaXMub3B0aW9ucy5oaWRkZW5EYXRlcykseSl7dmFyIGI9e3N0YXJ0Om5ldyBEYXRlKHRoaXMuc3RhcnQpLGVuZDpuZXcgRGF0ZSh0aGlzLmVuZCksYnlVc2VyOm99O3RoaXMuYm9keS5lbWl0dGVyLmVtaXQoInJhbmdlY2hhbmdlIixiKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJyYW5nZWNoYW5nZWQiLGIpfX0sby5wcm90b3R5cGUuX2NhbmNlbEFuaW1hdGlvbj1mdW5jdGlvbigpe3RoaXMuYW5pbWF0aW9uVGltZXImJihjbGVhclRpbWVvdXQodGhpcy5hbmltYXRpb25UaW1lciksdGhpcy5hbmltYXRpb25UaW1lcj1udWxsKX0sby5wcm90b3R5cGUuX2FwcGx5UmFuZ2U9ZnVuY3Rpb24odCxlKXt2YXIgaSxvPW51bGwhPXQ/ci5jb252ZXJ0KHQsIkRhdGUiKS52YWx1ZU9mKCk6dGhpcy5zdGFydCxuPW51bGwhPWU/ci5jb252ZXJ0KGUsIkRhdGUiKS52YWx1ZU9mKCk6dGhpcy5lbmQscz1udWxsIT10aGlzLm9wdGlvbnMubWF4P3IuY29udmVydCh0aGlzLm9wdGlvbnMubWF4LCJEYXRlIikudmFsdWVPZigpOm51bGwsYT1udWxsIT10aGlzLm9wdGlvbnMubWluP3IuY29udmVydCh0aGlzLm9wdGlvbnMubWluLCJEYXRlIikudmFsdWVPZigpOm51bGw7aWYoaXNOYU4obyl8fG51bGw9PT1vKXRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdGFydCAiJyt0KyciJyk7aWYoaXNOYU4obil8fG51bGw9PT1uKXRocm93IG5ldyBFcnJvcignSW52YWxpZCBlbmQgIicrZSsnIicpO2lmKG48byYmKG49byksbnVsbCE9PWEmJm88YSYmKGk9YS1vLG8rPWksbis9aSxudWxsIT1zJiZuPnMmJihuPXMpKSxudWxsIT09cyYmbj5zJiYoaT1uLXMsby09aSxuLT1pLG51bGwhPWEmJm88YSYmKG89YSkpLG51bGwhPT10aGlzLm9wdGlvbnMuem9vbU1pbil7dmFyIGg9cGFyc2VGbG9hdCh0aGlzLm9wdGlvbnMuem9vbU1pbik7aDwwJiYoaD0wKSxuLW88aCYmKHRoaXMuZW5kLXRoaXMuc3RhcnQ9PT1oJiZvPnRoaXMuc3RhcnQmJm48dGhpcy5lbmQ/KG89dGhpcy5zdGFydCxuPXRoaXMuZW5kKTooaT1oLShuLW8pLG8tPWkvMixuKz1pLzIpKX1pZihudWxsIT09dGhpcy5vcHRpb25zLnpvb21NYXgpe3ZhciBkPXBhcnNlRmxvYXQodGhpcy5vcHRpb25zLnpvb21NYXgpO2Q8MCYmKGQ9MCksbi1vPmQmJih0aGlzLmVuZC10aGlzLnN0YXJ0PT09ZCYmbzx0aGlzLnN0YXJ0JiZuPnRoaXMuZW5kPyhvPXRoaXMuc3RhcnQsbj10aGlzLmVuZCk6KGk9bi1vLWQsbys9aS8yLG4tPWkvMikpfXZhciBsPXRoaXMuc3RhcnQhPW98fHRoaXMuZW5kIT1uO3JldHVybiBvPj10aGlzLnN0YXJ0JiZvPD10aGlzLmVuZHx8bj49dGhpcy5zdGFydCYmbjw9dGhpcy5lbmR8fHRoaXMuc3RhcnQ+PW8mJnRoaXMuc3RhcnQ8PW58fHRoaXMuZW5kPj1vJiZ0aGlzLmVuZDw9bnx8dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiY2hlY2tSYW5nZWRJdGVtcyIpLHRoaXMuc3RhcnQ9byx0aGlzLmVuZD1uLGx9LG8ucHJvdG90eXBlLmdldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJue3N0YXJ0OnRoaXMuc3RhcnQsZW5kOnRoaXMuZW5kfX0sby5wcm90b3R5cGUuY29udmVyc2lvbj1mdW5jdGlvbih0LGUpe3JldHVybiBvLmNvbnZlcnNpb24odGhpcy5zdGFydCx0aGlzLmVuZCx0LGUpfSxvLmNvbnZlcnNpb249ZnVuY3Rpb24odCxlLGksbyl7cmV0dXJuIHZvaWQgMD09PW8mJihvPTApLDAhPWkmJmUtdCE9MD97b2Zmc2V0OnQsc2NhbGU6aS8oZS10LW8pfTp7b2Zmc2V0OjAsc2NhbGU6MX19LG8ucHJvdG90eXBlLl9vbkRyYWdTdGFydD1mdW5jdGlvbih0KXt0aGlzLmRlbHRhRGlmZmVyZW5jZT0wLHRoaXMucHJldmlvdXNEZWx0YT0wLHRoaXMub3B0aW9ucy5tb3ZlYWJsZSYmdGhpcy5faXNJbnNpZGVSYW5nZSh0KSYmdGhpcy5wcm9wcy50b3VjaC5hbGxvd0RyYWdnaW5nJiYodGhpcy5wcm9wcy50b3VjaC5zdGFydD10aGlzLnN0YXJ0LHRoaXMucHJvcHMudG91Y2guZW5kPXRoaXMuZW5kLHRoaXMucHJvcHMudG91Y2guZHJhZ2dpbmc9ITAsdGhpcy5ib2R5LmRvbS5yb290JiYodGhpcy5ib2R5LmRvbS5yb290LnN0eWxlLmN1cnNvcj0ibW92ZSIpKX0sby5wcm90b3R5cGUuX29uRHJhZz1mdW5jdGlvbih0KXtpZih0JiZ0aGlzLnByb3BzLnRvdWNoLmRyYWdnaW5nJiZ0aGlzLm9wdGlvbnMubW92ZWFibGUmJnRoaXMucHJvcHMudG91Y2guYWxsb3dEcmFnZ2luZyl7dmFyIGU9dGhpcy5vcHRpb25zLmRpcmVjdGlvbjtuKGUpO3ZhciBpPSJob3Jpem9udGFsIj09ZT90LmRlbHRhWDp0LmRlbHRhWTtpLT10aGlzLmRlbHRhRGlmZmVyZW5jZTt2YXIgbz10aGlzLnByb3BzLnRvdWNoLmVuZC10aGlzLnByb3BzLnRvdWNoLnN0YXJ0LHM9ZC5nZXRIaWRkZW5EdXJhdGlvbkJldHdlZW4odGhpcy5ib2R5LmhpZGRlbkRhdGVzLHRoaXMuc3RhcnQsdGhpcy5lbmQpO28tPXM7dmFyIHI9Imhvcml6b250YWwiPT1lP3RoaXMuYm9keS5kb21Qcm9wcy5jZW50ZXIud2lkdGg6dGhpcy5ib2R5LmRvbVByb3BzLmNlbnRlci5oZWlnaHQ7aWYodGhpcy5vcHRpb25zLnJ0bCl2YXIgYT1pL3IqbztlbHNlIHZhciBhPS1pL3Iqbzt2YXIgaD10aGlzLnByb3BzLnRvdWNoLnN0YXJ0K2EsbD10aGlzLnByb3BzLnRvdWNoLmVuZCthLGM9ZC5zbmFwQXdheUZyb21IaWRkZW4odGhpcy5ib2R5LmhpZGRlbkRhdGVzLGgsdGhpcy5wcmV2aW91c0RlbHRhLWksITApLHU9ZC5zbmFwQXdheUZyb21IaWRkZW4odGhpcy5ib2R5LmhpZGRlbkRhdGVzLGwsdGhpcy5wcmV2aW91c0RlbHRhLWksITApO2lmKGMhPWh8fHUhPWwpcmV0dXJuIHRoaXMuZGVsdGFEaWZmZXJlbmNlKz1pLAp0aGlzLnByb3BzLnRvdWNoLnN0YXJ0PWMsdGhpcy5wcm9wcy50b3VjaC5lbmQ9dSx2b2lkIHRoaXMuX29uRHJhZyh0KTt0aGlzLnByZXZpb3VzRGVsdGE9aSx0aGlzLl9hcHBseVJhbmdlKGgsbCk7dmFyIHA9bmV3IERhdGUodGhpcy5zdGFydCksZj1uZXcgRGF0ZSh0aGlzLmVuZCk7dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgicmFuZ2VjaGFuZ2UiLHtzdGFydDpwLGVuZDpmLGJ5VXNlcjohMH0pLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoInBhbm1vdmUiKX19LG8ucHJvdG90eXBlLl9vbkRyYWdFbmQ9ZnVuY3Rpb24odCl7dGhpcy5wcm9wcy50b3VjaC5kcmFnZ2luZyYmdGhpcy5vcHRpb25zLm1vdmVhYmxlJiZ0aGlzLnByb3BzLnRvdWNoLmFsbG93RHJhZ2dpbmcmJih0aGlzLnByb3BzLnRvdWNoLmRyYWdnaW5nPSExLHRoaXMuYm9keS5kb20ucm9vdCYmKHRoaXMuYm9keS5kb20ucm9vdC5zdHlsZS5jdXJzb3I9ImF1dG8iKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJyYW5nZWNoYW5nZWQiLHtzdGFydDpuZXcgRGF0ZSh0aGlzLnN0YXJ0KSxlbmQ6bmV3IERhdGUodGhpcy5lbmQpLGJ5VXNlcjohMH0pKX0sby5wcm90b3R5cGUuX29uTW91c2VXaGVlbD1mdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCk7dmFyIGU9MDtpZih0LndoZWVsRGVsdGE/ZT10LndoZWVsRGVsdGEvMTIwOnQuZGV0YWlsJiYoZT0tdC5kZXRhaWwvMyksdGhpcy5vcHRpb25zLnpvb21LZXkmJiF0W3RoaXMub3B0aW9ucy56b29tS2V5XSYmdGhpcy5vcHRpb25zLnpvb21hYmxlfHwhdGhpcy5vcHRpb25zLnpvb21hYmxlJiZ0aGlzLm9wdGlvbnMubW92ZWFibGUpe2lmKHRoaXMub3B0aW9ucy5ob3Jpem9udGFsU2Nyb2xsKXt2YXIgaT1lKih0aGlzLmVuZC10aGlzLnN0YXJ0KS8yMCxvPXRoaXMuc3RhcnQtaSxuPXRoaXMuZW5kLWk7dGhpcy5zZXRSYW5nZShvLG4pfX1lbHNlIGlmKHRoaXMub3B0aW9ucy56b29tYWJsZSYmdGhpcy5vcHRpb25zLm1vdmVhYmxlJiZ0aGlzLl9pc0luc2lkZVJhbmdlKHQpJiZlKXt2YXIgcztzPWU8MD8xLWUvNToxLygxK2UvNSk7dmFyIHI9dGhpcy5nZXRQb2ludGVyKHt4OnQuY2xpZW50WCx5OnQuY2xpZW50WX0sdGhpcy5ib2R5LmRvbS5jZW50ZXIpLGE9dGhpcy5fcG9pbnRlclRvRGF0ZShyKTt0aGlzLnpvb20ocyxhLGUpfX0sby5wcm90b3R5cGUuX29uVG91Y2g9ZnVuY3Rpb24odCl7dGhpcy5wcm9wcy50b3VjaC5zdGFydD10aGlzLnN0YXJ0LHRoaXMucHJvcHMudG91Y2guZW5kPXRoaXMuZW5kLHRoaXMucHJvcHMudG91Y2guYWxsb3dEcmFnZ2luZz0hMCx0aGlzLnByb3BzLnRvdWNoLmNlbnRlcj1udWxsLHRoaXMuc2NhbGVPZmZzZXQ9MCx0aGlzLmRlbHRhRGlmZmVyZW5jZT0wfSxvLnByb3RvdHlwZS5fb25QaW5jaD1mdW5jdGlvbih0KXtpZih0aGlzLm9wdGlvbnMuem9vbWFibGUmJnRoaXMub3B0aW9ucy5tb3ZlYWJsZSl7dGhpcy5wcm9wcy50b3VjaC5hbGxvd0RyYWdnaW5nPSExLHRoaXMucHJvcHMudG91Y2guY2VudGVyfHwodGhpcy5wcm9wcy50b3VjaC5jZW50ZXI9dGhpcy5nZXRQb2ludGVyKHQuY2VudGVyLHRoaXMuYm9keS5kb20uY2VudGVyKSk7dmFyIGU9MS8odC5zY2FsZSt0aGlzLnNjYWxlT2Zmc2V0KSxpPXRoaXMuX3BvaW50ZXJUb0RhdGUodGhpcy5wcm9wcy50b3VjaC5jZW50ZXIpLG89ZC5nZXRIaWRkZW5EdXJhdGlvbkJldHdlZW4odGhpcy5ib2R5LmhpZGRlbkRhdGVzLHRoaXMuc3RhcnQsdGhpcy5lbmQpLG49ZC5nZXRIaWRkZW5EdXJhdGlvbkJlZm9yZSh0aGlzLm9wdGlvbnMubW9tZW50LHRoaXMuYm9keS5oaWRkZW5EYXRlcyx0aGlzLGkpLHM9by1uLHI9aS1uKyh0aGlzLnByb3BzLnRvdWNoLnN0YXJ0LShpLW4pKSplLGE9aStzKyh0aGlzLnByb3BzLnRvdWNoLmVuZC0oaStzKSkqZTt0aGlzLnN0YXJ0VG9Gcm9udD0xLWU8PTAsdGhpcy5lbmRUb0Zyb250PWUtMTw9MDt2YXIgaD1kLnNuYXBBd2F5RnJvbUhpZGRlbih0aGlzLmJvZHkuaGlkZGVuRGF0ZXMsciwxLWUsITApLGw9ZC5zbmFwQXdheUZyb21IaWRkZW4odGhpcy5ib2R5LmhpZGRlbkRhdGVzLGEsZS0xLCEwKTtoPT1yJiZsPT1hfHwodGhpcy5wcm9wcy50b3VjaC5zdGFydD1oLHRoaXMucHJvcHMudG91Y2guZW5kPWwsdGhpcy5zY2FsZU9mZnNldD0xLXQuc2NhbGUscj1oLGE9bCksdGhpcy5zZXRSYW5nZShyLGEsITEsITApLHRoaXMuc3RhcnRUb0Zyb250PSExLHRoaXMuZW5kVG9Gcm9udD0hMH19LG8ucHJvdG90eXBlLl9pc0luc2lkZVJhbmdlPWZ1bmN0aW9uKHQpe3ZhciBlPXQuY2VudGVyP3QuY2VudGVyLng6dC5jbGllbnRYO2lmKHRoaXMub3B0aW9ucy5ydGwpdmFyIGk9ZS1yLmdldEFic29sdXRlTGVmdCh0aGlzLmJvZHkuZG9tLmNlbnRlckNvbnRhaW5lcik7ZWxzZSB2YXIgaT1yLmdldEFic29sdXRlUmlnaHQodGhpcy5ib2R5LmRvbS5jZW50ZXJDb250YWluZXIpLWU7dmFyIG89dGhpcy5ib2R5LnV0aWwudG9UaW1lKGkpO3JldHVybiBvPj10aGlzLnN0YXJ0JiZvPD10aGlzLmVuZH0sby5wcm90b3R5cGUuX3BvaW50ZXJUb0RhdGU9ZnVuY3Rpb24odCl7dmFyIGUsaT10aGlzLm9wdGlvbnMuZGlyZWN0aW9uO2lmKG4oaSksImhvcml6b250YWwiPT1pKXJldHVybiB0aGlzLmJvZHkudXRpbC50b1RpbWUodC54KS52YWx1ZU9mKCk7dmFyIG89dGhpcy5ib2R5LmRvbVByb3BzLmNlbnRlci5oZWlnaHQ7cmV0dXJuIGU9dGhpcy5jb252ZXJzaW9uKG8pLHQueS9lLnNjYWxlK2Uub2Zmc2V0fSxvLnByb3RvdHlwZS5nZXRQb2ludGVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMub3B0aW9ucy5ydGw/e3g6ci5nZXRBYnNvbHV0ZVJpZ2h0KGUpLXQueCx5OnQueS1yLmdldEFic29sdXRlVG9wKGUpfTp7eDp0Lngtci5nZXRBYnNvbHV0ZUxlZnQoZSkseTp0Lnktci5nZXRBYnNvbHV0ZVRvcChlKX19LG8ucHJvdG90eXBlLnpvb209ZnVuY3Rpb24odCxlLGkpe251bGw9PWUmJihlPSh0aGlzLnN0YXJ0K3RoaXMuZW5kKS8yKTt2YXIgbz1kLmdldEhpZGRlbkR1cmF0aW9uQmV0d2Vlbih0aGlzLmJvZHkuaGlkZGVuRGF0ZXMsdGhpcy5zdGFydCx0aGlzLmVuZCksbj1kLmdldEhpZGRlbkR1cmF0aW9uQmVmb3JlKHRoaXMub3B0aW9ucy5tb21lbnQsdGhpcy5ib2R5LmhpZGRlbkRhdGVzLHRoaXMsZSkscz1vLW4scj1lLW4rKHRoaXMuc3RhcnQtKGUtbikpKnQsYT1lK3MrKHRoaXMuZW5kLShlK3MpKSp0O3RoaXMuc3RhcnRUb0Zyb250PSEoaT4wKSx0aGlzLmVuZFRvRnJvbnQ9ISgtaT4wKTt2YXIgaD1kLnNuYXBBd2F5RnJvbUhpZGRlbih0aGlzLmJvZHkuaGlkZGVuRGF0ZXMscixpLCEwKSxsPWQuc25hcEF3YXlGcm9tSGlkZGVuKHRoaXMuYm9keS5oaWRkZW5EYXRlcyxhLC1pLCEwKTtoPT1yJiZsPT1hfHwocj1oLGE9bCksdGhpcy5zZXRSYW5nZShyLGEsITEsITApLHRoaXMuc3RhcnRUb0Zyb250PSExLHRoaXMuZW5kVG9Gcm9udD0hMH0sby5wcm90b3R5cGUubW92ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmVuZC10aGlzLnN0YXJ0LGk9dGhpcy5zdGFydCtlKnQsbz10aGlzLmVuZCtlKnQ7dGhpcy5zdGFydD1pLHRoaXMuZW5kPW99LG8ucHJvdG90eXBlLm1vdmVUbz1mdW5jdGlvbih0KXt2YXIgZT0odGhpcy5zdGFydCt0aGlzLmVuZCkvMixpPWUtdCxvPXRoaXMuc3RhcnQtaSxuPXRoaXMuZW5kLWk7dGhpcy5zZXRSYW5nZShvLG4pfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlKXt0aGlzLm9wdGlvbnM9bnVsbCx0aGlzLnByb3BzPW51bGx9dmFyIG49aSgxKTtvLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe3QmJm4uZXh0ZW5kKHRoaXMub3B0aW9ucyx0KX0sby5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7cmV0dXJuITF9LG8ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt9LG8ucHJvdG90eXBlLl9pc1Jlc2l6ZWQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLl9wcmV2aW91c1dpZHRoIT09dGhpcy5wcm9wcy53aWR0aHx8dGhpcy5wcm9wcy5fcHJldmlvdXNIZWlnaHQhPT10aGlzLnByb3BzLmhlaWdodDtyZXR1cm4gdGhpcy5wcm9wcy5fcHJldmlvdXNXaWR0aD10aGlzLnByb3BzLndpZHRoLHRoaXMucHJvcHMuX3ByZXZpb3VzSGVpZ2h0PXRoaXMucHJvcHMuaGVpZ2h0LHR9LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUpe2UuY29udmVydEhpZGRlbk9wdGlvbnM9ZnVuY3Rpb24odCxpLG8pe2lmKG8mJiFBcnJheS5pc0FycmF5KG8pKXJldHVybiBlLmNvbnZlcnRIaWRkZW5PcHRpb25zKHQsaSxbb10pO2lmKGkuaGlkZGVuRGF0ZXM9W10sbyYmMT09QXJyYXkuaXNBcnJheShvKSl7Zm9yKHZhciBuPTA7bjxvLmxlbmd0aDtuKyspaWYodm9pZCAwPT09b1tuXS5yZXBlYXQpe3ZhciBzPXt9O3Muc3RhcnQ9dChvW25dLnN0YXJ0KS50b0RhdGUoKS52YWx1ZU9mKCkscy5lbmQ9dChvW25dLmVuZCkudG9EYXRlKCkudmFsdWVPZigpLGkuaGlkZGVuRGF0ZXMucHVzaChzKX1pLmhpZGRlbkRhdGVzLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5zdGFydC1lLnN0YXJ0fSl9fSxlLnVwZGF0ZUhpZGRlbkRhdGVzPWZ1bmN0aW9uKHQsaSxvKXtpZihvJiYhQXJyYXkuaXNBcnJheShvKSlyZXR1cm4gZS51cGRhdGVIaWRkZW5EYXRlcyh0LGksW29dKTtpZihvJiZ2b2lkIDAhPT1pLmRvbVByb3BzLmNlbnRlckNvbnRhaW5lci53aWR0aCl7ZS5jb252ZXJ0SGlkZGVuT3B0aW9ucyh0LGksbyk7Zm9yKHZhciBuPXQoaS5yYW5nZS5zdGFydCkscz10KGkucmFuZ2UuZW5kKSxyPWkucmFuZ2UuZW5kLWkucmFuZ2Uuc3RhcnQsYT1yL2kuZG9tUHJvcHMuY2VudGVyQ29udGFpbmVyLndpZHRoLGg9MDtoPG8ubGVuZ3RoO2grKylpZih2b2lkIDAhPT1vW2hdLnJlcGVhdCl7dmFyIGQ9dChvW2hdLnN0YXJ0KSxsPXQob1toXS5lbmQpO2lmKCJJbnZhbGlkIERhdGUiPT1kLl9kKXRocm93IG5ldyBFcnJvcigiU3VwcGxpZWQgc3RhcnQgZGF0ZSBpcyBub3QgdmFsaWQ6ICIrb1toXS5zdGFydCk7aWYoIkludmFsaWQgRGF0ZSI9PWwuX2QpdGhyb3cgbmV3IEVycm9yKCJTdXBwbGllZCBlbmQgZGF0ZSBpcyBub3QgdmFsaWQ6ICIrb1toXS5lbmQpO3ZhciBjPWwtZDtpZihjPj00KmEpe3ZhciB1PTAscD1zLmNsb25lKCk7c3dpdGNoKG9baF0ucmVwZWF0KXtjYXNlImRhaWx5IjpkLmRheSgpIT1sLmRheSgpJiYodT0xKSxkLmRheU9mWWVhcihuLmRheU9mWWVhcigpKSxkLnllYXIobi55ZWFyKCkpLGQuc3VidHJhY3QoNywiZGF5cyIpLGwuZGF5T2ZZZWFyKG4uZGF5T2ZZZWFyKCkpLGwueWVhcihuLnllYXIoKSksbC5zdWJ0cmFjdCg3LXUsImRheXMiKSxwLmFkZCgxLCJ3ZWVrcyIpO2JyZWFrO2Nhc2Uid2Vla2x5Ijp2YXIgZj1sLmRpZmYoZCwiZGF5cyIpLG09ZC5kYXkoKTtkLmRhdGUobi5kYXRlKCkpLGQubW9udGgobi5tb250aCgpKSxkLnllYXIobi55ZWFyKCkpLGw9ZC5jbG9uZSgpLGQuZGF5KG0pLGwuZGF5KG0pLGwuYWRkKGYsImRheXMiKSxkLnN1YnRyYWN0KDEsIndlZWtzIiksbC5zdWJ0cmFjdCgxLCJ3ZWVrcyIpLHAuYWRkKDEsIndlZWtzIik7YnJlYWs7Y2FzZSJtb250aGx5IjpkLm1vbnRoKCkhPWwubW9udGgoKSYmKHU9MSksZC5tb250aChuLm1vbnRoKCkpLGQueWVhcihuLnllYXIoKSksZC5zdWJ0cmFjdCgxLCJtb250aHMiKSxsLm1vbnRoKG4ubW9udGgoKSksbC55ZWFyKG4ueWVhcigpKSxsLnN1YnRyYWN0KDEsIm1vbnRocyIpLGwuYWRkKHUsIm1vbnRocyIpLHAuYWRkKDEsIm1vbnRocyIpO2JyZWFrO2Nhc2UieWVhcmx5IjpkLnllYXIoKSE9bC55ZWFyKCkmJih1PTEpLGQueWVhcihuLnllYXIoKSksZC5zdWJ0cmFjdCgxLCJ5ZWFycyIpLGwueWVhcihuLnllYXIoKSksbC5zdWJ0cmFjdCgxLCJ5ZWFycyIpLGwuYWRkKHUsInllYXJzIikscC5hZGQoMSwieWVhcnMiKTticmVhaztkZWZhdWx0OnJldHVybiB2b2lkIGNvbnNvbGUubG9nKCJXcm9uZyByZXBlYXQgZm9ybWF0LCBhbGxvd2VkIGFyZTogZGFpbHksIHdlZWtseSwgbW9udGhseSwgeWVhcmx5LiBHaXZlbjoiLG9baF0ucmVwZWF0KX1mb3IoO2Q8cDspc3dpdGNoKGkuaGlkZGVuRGF0ZXMucHVzaCh7c3RhcnQ6ZC52YWx1ZU9mKCksZW5kOmwudmFsdWVPZigpfSksb1toXS5yZXBlYXQpe2Nhc2UiZGFpbHkiOmQuYWRkKDEsImRheXMiKSxsLmFkZCgxLCJkYXlzIik7YnJlYWs7Y2FzZSJ3ZWVrbHkiOmQuYWRkKDEsIndlZWtzIiksbC5hZGQoMSwid2Vla3MiKTticmVhaztjYXNlIm1vbnRobHkiOmQuYWRkKDEsIm1vbnRocyIpLGwuYWRkKDEsIm1vbnRocyIpO2JyZWFrO2Nhc2UieWVhcmx5IjpkLmFkZCgxLCJ5IiksbC5hZGQoMSwieSIpO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIHZvaWQgY29uc29sZS5sb2coIldyb25nIHJlcGVhdCBmb3JtYXQsIGFsbG93ZWQgYXJlOiBkYWlseSwgd2Vla2x5LCBtb250aGx5LCB5ZWFybHkuIEdpdmVuOiIsb1toXS5yZXBlYXQpfWkuaGlkZGVuRGF0ZXMucHVzaCh7c3RhcnQ6ZC52YWx1ZU9mKCksZW5kOmwudmFsdWVPZigpfSl9fWUucmVtb3ZlRHVwbGljYXRlcyhpKTt2YXIgdj1lLmlzSGlkZGVuKGkucmFuZ2Uuc3RhcnQsaS5oaWRkZW5EYXRlcyksZz1lLmlzSGlkZGVuKGkucmFuZ2UuZW5kLGkuaGlkZGVuRGF0ZXMpLHk9aS5yYW5nZS5zdGFydCxiPWkucmFuZ2UuZW5kOzE9PXYuaGlkZGVuJiYoeT0xPT1pLnJhbmdlLnN0YXJ0VG9Gcm9udD92LnN0YXJ0RGF0ZS0xOnYuZW5kRGF0ZSsxKSwxPT1nLmhpZGRlbiYmKGI9MT09aS5yYW5nZS5lbmRUb0Zyb250P2cuc3RhcnREYXRlLTE6Zy5lbmREYXRlKzEpLDEhPXYuaGlkZGVuJiYxIT1nLmhpZGRlbnx8aS5yYW5nZS5fYXBwbHlSYW5nZSh5LGIpfX0sZS5yZW1vdmVEdXBsaWNhdGVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LmhpZGRlbkRhdGVzLGk9W10sbz0wO288ZS5sZW5ndGg7bysrKWZvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKW8hPW4mJjEhPWVbbl0ucmVtb3ZlJiYxIT1lW29dLnJlbW92ZSYmKGVbbl0uc3RhcnQ+PWVbb10uc3RhcnQmJmVbbl0uZW5kPD1lW29dLmVuZD9lW25dLnJlbW92ZT0hMDplW25dLnN0YXJ0Pj1lW29dLnN0YXJ0JiZlW25dLnN0YXJ0PD1lW29dLmVuZD8oZVtvXS5lbmQ9ZVtuXS5lbmQsZVtuXS5yZW1vdmU9ITApOmVbbl0uZW5kPj1lW29dLnN0YXJ0JiZlW25dLmVuZDw9ZVtvXS5lbmQmJihlW29dLnN0YXJ0PWVbbl0uc3RhcnQsZVtuXS5yZW1vdmU9ITApKTtmb3IodmFyIG89MDtvPGUubGVuZ3RoO28rKyllW29dLnJlbW92ZSE9PSEwJiZpLnB1c2goZVtvXSk7dC5oaWRkZW5EYXRlcz1pLHQuaGlkZGVuRGF0ZXMuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiB0LnN0YXJ0LWUuc3RhcnR9KX0sZS5wcmludERhdGVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWNvbnNvbGUubG9nKGUsbmV3IERhdGUodFtlXS5zdGFydCksbmV3IERhdGUodFtlXS5lbmQpLHRbZV0uc3RhcnQsdFtlXS5lbmQsdFtlXS5yZW1vdmUpfSxlLnN0ZXBPdmVySGlkZGVuRGF0ZXM9ZnVuY3Rpb24odCxlLGkpe2Zvcih2YXIgbz0hMSxuPWUuY3VycmVudC52YWx1ZU9mKCkscz0wO3M8ZS5oaWRkZW5EYXRlcy5sZW5ndGg7cysrKXt2YXIgcj1lLmhpZGRlbkRhdGVzW3NdLnN0YXJ0LGE9ZS5oaWRkZW5EYXRlc1tzXS5lbmQ7aWYobj49ciYmbjxhKXtvPSEwO2JyZWFrfX1pZigxPT1vJiZuPGUuX2VuZC52YWx1ZU9mKCkmJm4hPWkpe3ZhciBoPXQoaSksZD10KGEpO2gueWVhcigpIT1kLnllYXIoKT9lLnN3aXRjaGVkWWVhcj0hMDpoLm1vbnRoKCkhPWQubW9udGgoKT9lLnN3aXRjaGVkTW9udGg9ITA6aC5kYXlPZlllYXIoKSE9ZC5kYXlPZlllYXIoKSYmKGUuc3dpdGNoZWREYXk9ITApLGUuY3VycmVudD1kfX0sZS50b1NjcmVlbj1mdW5jdGlvbih0LGksbyl7aWYoMD09dC5ib2R5LmhpZGRlbkRhdGVzLmxlbmd0aCl7dmFyIG49dC5yYW5nZS5jb252ZXJzaW9uKG8pO3JldHVybihpLnZhbHVlT2YoKS1uLm9mZnNldCkqbi5zY2FsZX12YXIgcz1lLmlzSGlkZGVuKGksdC5ib2R5LmhpZGRlbkRhdGVzKTsxPT1zLmhpZGRlbiYmKGk9cy5zdGFydERhdGUpO3ZhciByPWUuZ2V0SGlkZGVuRHVyYXRpb25CZXR3ZWVuKHQuYm9keS5oaWRkZW5EYXRlcyx0LnJhbmdlLnN0YXJ0LHQucmFuZ2UuZW5kKTtpZihpPHQucmFuZ2Uuc3RhcnQpe3ZhciBuPXQucmFuZ2UuY29udmVyc2lvbihvLHIpLGE9ZS5nZXRIaWRkZW5EdXJhdGlvbkJlZm9yZVN0YXJ0KHQuYm9keS5oaWRkZW5EYXRlcyxpLG4ub2Zmc2V0KTtyZXR1cm4gaT10Lm9wdGlvbnMubW9tZW50KGkpLnRvRGF0ZSgpLnZhbHVlT2YoKSxpKz1hLC0obi5vZmZzZXQtaS52YWx1ZU9mKCkpKm4uc2NhbGV9aWYoaT50LnJhbmdlLmVuZCl7dmFyIGg9e3N0YXJ0OnQucmFuZ2Uuc3RhcnQsZW5kOml9O2k9ZS5jb3JyZWN0VGltZUZvckhpZGRlbih0Lm9wdGlvbnMubW9tZW50LHQuYm9keS5oaWRkZW5EYXRlcyxoLGkpO3ZhciBuPXQucmFuZ2UuY29udmVyc2lvbihvLHIpO3JldHVybihpLnZhbHVlT2YoKS1uLm9mZnNldCkqbi5zY2FsZX1pPWUuY29ycmVjdFRpbWVGb3JIaWRkZW4odC5vcHRpb25zLm1vbWVudCx0LmJvZHkuaGlkZGVuRGF0ZXMsdC5yYW5nZSxpKTt2YXIgbj10LnJhbmdlLmNvbnZlcnNpb24obyxyKTtyZXR1cm4oaS52YWx1ZU9mKCktbi5vZmZzZXQpKm4uc2NhbGV9LGUudG9UaW1lPWZ1bmN0aW9uKHQsaSxvKXtpZigwPT10LmJvZHkuaGlkZGVuRGF0ZXMubGVuZ3RoKXt2YXIgbj10LnJhbmdlLmNvbnZlcnNpb24obyk7cmV0dXJuIG5ldyBEYXRlKGkvbi5zY2FsZStuLm9mZnNldCl9dmFyIHM9ZS5nZXRIaWRkZW5EdXJhdGlvbkJldHdlZW4odC5ib2R5LmhpZGRlbkRhdGVzLHQucmFuZ2Uuc3RhcnQsdC5yYW5nZS5lbmQpLHI9dC5yYW5nZS5lbmQtdC5yYW5nZS5zdGFydC1zLGE9cippL28saD1lLmdldEFjY3VtdWxhdGVkSGlkZGVuRHVyYXRpb24odC5ib2R5LmhpZGRlbkRhdGVzLHQucmFuZ2UsYSksZD1uZXcgRGF0ZShoK2ErdC5yYW5nZS5zdGFydCk7cmV0dXJuIGR9LGUuZ2V0SGlkZGVuRHVyYXRpb25CZXR3ZWVuPWZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIG89MCxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBzPXRbbl0uc3RhcnQscj10W25dLmVuZDtzPj1lJiZyPGkmJihvKz1yLXMpfXJldHVybiBvfSxlLmdldEhpZGRlbkR1cmF0aW9uQmVmb3JlU3RhcnQ9ZnVuY3Rpb24odCxlLGkpe2Zvcih2YXIgbz0wLG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHM9dFtuXS5zdGFydCxyPXRbbl0uZW5kO3M+PWUmJnI8PWkmJihvKz1yLXMpfXJldHVybiBvfSxlLmNvcnJlY3RUaW1lRm9ySGlkZGVuPWZ1bmN0aW9uKHQsaSxvLG4pe3JldHVybiBuPXQobikudG9EYXRlKCkudmFsdWVPZigpLG4tPWUuZ2V0SGlkZGVuRHVyYXRpb25CZWZvcmUodCxpLG8sbil9LGUuZ2V0SGlkZGVuRHVyYXRpb25CZWZvcmU9ZnVuY3Rpb24odCxlLGksbyl7dmFyIG49MDtvPXQobykudG9EYXRlKCkudmFsdWVPZigpO2Zvcih2YXIgcz0wO3M8ZS5sZW5ndGg7cysrKXt2YXIgcj1lW3NdLnN0YXJ0LGE9ZVtzXS5lbmQ7cj49aS5zdGFydCYmYTxpLmVuZCYmbz49YSYmKG4rPWEtcil9cmV0dXJuIG59LGUuZ2V0QWNjdW11bGF0ZWRIaWRkZW5EdXJhdGlvbj1mdW5jdGlvbih0LGUsaSl7Zm9yKHZhciBvPTAsbj0wLHM9ZS5zdGFydCxyPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBhPXRbcl0uc3RhcnQsaD10W3JdLmVuZDtpZihhPj1lLnN0YXJ0JiZoPGUuZW5kKXtpZihuKz1hLXMscz1oLG4+PWkpYnJlYWs7bys9aC1hfX1yZXR1cm4gb30sZS5zbmFwQXdheUZyb21IaWRkZW49ZnVuY3Rpb24odCxpLG8sbil7dmFyIHM9ZS5pc0hpZGRlbihpLHQpO3JldHVybiAxPT1zLmhpZGRlbj9vPDA/MT09bj9zLnN0YXJ0RGF0ZS0ocy5lbmREYXRlLWkpLTE6cy5zdGFydERhdGUtMToxPT1uP3MuZW5kRGF0ZSsoaS1zLnN0YXJ0RGF0ZSkrMTpzLmVuZERhdGUrMTppfSxlLmlzSGlkZGVuPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV0uc3RhcnQsbj1lW2ldLmVuZDtpZih0Pj1vJiZ0PG4pcmV0dXJue2hpZGRlbjohMCxzdGFydERhdGU6byxlbmREYXRlOm59fXJldHVybntoaWRkZW46ITEsc3RhcnREYXRlOm8sZW5kRGF0ZTpufX19LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKCl7fXZhciBuPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSxzPWkoMTMpLHI9aSgyMiksYT1pKDMwKSxoPWkoMSksZD0oaSg5KSxpKDExKSxpKDMyKSxpKDM2KSxpKDQ2KSksbD1pKDQ3KSxjPWkoMzQpLHU9aSg0OCk7cyhvLnByb3RvdHlwZSksby5wcm90b3R5cGUuX2NyZWF0ZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpe2lmKHRoaXMuaXNBY3RpdmUoKSYmdGhpcy5lbWl0KCJtb3VzZXdoZWVsIix0KSx0aGlzLm9wdGlvbnMuem9vbUtleSYmIXRbdGhpcy5vcHRpb25zLnpvb21LZXldJiYhdGhpcy5vcHRpb25zLmhvcml6b250YWxTY3JvbGwpe3ZhciBlPTA7dC53aGVlbERlbHRhP2U9dC53aGVlbERlbHRhLzEyMDp0LmRldGFpbCYmKGU9LXQuZGV0YWlsLzMpO3ZhciBpPXRoaXMucHJvcHMuc2Nyb2xsVG9wLG89aSsxMjAqZTt0aGlzLmlzQWN0aXZlKCkmJih0aGlzLl9zZXRTY3JvbGxUb3AobyksdGhpcy5vcHRpb25zLnZlcnRpY2FsU2Nyb2xsJiYodGhpcy5kb20ubGVmdC5wYXJlbnROb2RlLnNjcm9sbFRvcD0tbyx0aGlzLmRvbS5yaWdodC5wYXJlbnROb2RlLnNjcm9sbFRvcD0tbyksdGhpcy5fcmVkcmF3KCksdGhpcy5lbWl0KCJzY3JvbGwiLHQpKSx0LnByZXZlbnREZWZhdWx0KCl9fWZ1bmN0aW9uIGkodCl7aWYocy5vcHRpb25zLnZlcnRpY2FsU2Nyb2xsJiYodC5wcmV2ZW50RGVmYXVsdCgpLHMuaXNBY3RpdmUoKSkpe3ZhciBlPS10LnRhcmdldC5zY3JvbGxUb3A7cy5fc2V0U2Nyb2xsVG9wKGUpLHMuX3JlZHJhdygpLHMuZW1pdCgic2Nyb2xsU2lkZSIsdCl9fWZ1bmN0aW9uIG8odCl7aWYodC5wcmV2ZW50RGVmYXVsdCYmdC5wcmV2ZW50RGVmYXVsdCgpLHQudGFyZ2V0LmNsYXNzTmFtZS5pbmNsdWRlcygidmlzIikmJiFsKXJldHVybiB0LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0PSJtb3ZlIixsPSEwLCExfWZ1bmN0aW9uIG4odCl7dHJ5e3ZhciBlPUpTT04ucGFyc2UodC5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgidGV4dC9wbGFpbiIpKTtpZighZS5jb250ZW50KXJldHVybn1jYXRjaCh0KXtyZXR1cm4hMX1yZXR1cm4gbD0hMSx0LmNlbnRlcj17eDp0LngseTp0Lnl9LHMuaXRlbVNldC5fb25BZGRJdGVtKHQpLCExfXRoaXMuZG9tPXt9LHRoaXMuZG9tLmNvbnRhaW5lcj10LHRoaXMuZG9tLnJvb3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5kb20uYmFja2dyb3VuZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmRvbS5iYWNrZ3JvdW5kVmVydGljYWw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5kb20uYmFja2dyb3VuZEhvcml6b250YWw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5kb20uY2VudGVyQ29udGFpbmVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZG9tLmxlZnRDb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5kb20ucmlnaHRDb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5kb20uY2VudGVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZG9tLmxlZnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5kb20ucmlnaHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5kb20udG9wPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZG9tLmJvdHRvbT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmRvbS5zaGFkb3dUb3A9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5kb20uc2hhZG93Qm90dG9tPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZG9tLnNoYWRvd1RvcExlZnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5kb20uc2hhZG93Qm90dG9tTGVmdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmRvbS5zaGFkb3dUb3BSaWdodD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmRvbS5zaGFkb3dCb3R0b21SaWdodD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmRvbS5yb290LmNsYXNzTmFtZT0idmlzLXRpbWVsaW5lIix0aGlzLmRvbS5iYWNrZ3JvdW5kLmNsYXNzTmFtZT0idmlzLXBhbmVsIHZpcy1iYWNrZ3JvdW5kIix0aGlzLmRvbS5iYWNrZ3JvdW5kVmVydGljYWwuY2xhc3NOYW1lPSJ2aXMtcGFuZWwgdmlzLWJhY2tncm91bmQgdmlzLXZlcnRpY2FsIix0aGlzLmRvbS5iYWNrZ3JvdW5kSG9yaXpvbnRhbC5jbGFzc05hbWU9InZpcy1wYW5lbCB2aXMtYmFja2dyb3VuZCB2aXMtaG9yaXpvbnRhbCIsdGhpcy5kb20uY2VudGVyQ29udGFpbmVyLmNsYXNzTmFtZT0idmlzLXBhbmVsIHZpcy1jZW50ZXIiLHRoaXMuZG9tLmxlZnRDb250YWluZXIuY2xhc3NOYW1lPSJ2aXMtcGFuZWwgdmlzLWxlZnQiLHRoaXMuZG9tLnJpZ2h0Q29udGFpbmVyLmNsYXNzTmFtZT0idmlzLXBhbmVsIHZpcy1yaWdodCIsdGhpcy5kb20udG9wLmNsYXNzTmFtZT0idmlzLXBhbmVsIHZpcy10b3AiLHRoaXMuZG9tLmJvdHRvbS5jbGFzc05hbWU9InZpcy1wYW5lbCB2aXMtYm90dG9tIix0aGlzLmRvbS5sZWZ0LmNsYXNzTmFtZT0idmlzLWNvbnRlbnQiLHRoaXMuZG9tLmNlbnRlci5jbGFzc05hbWU9InZpcy1jb250ZW50Iix0aGlzLmRvbS5yaWdodC5jbGFzc05hbWU9InZpcy1jb250ZW50Iix0aGlzLmRvbS5zaGFkb3dUb3AuY2xhc3NOYW1lPSJ2aXMtc2hhZG93IHZpcy10b3AiLHRoaXMuZG9tLnNoYWRvd0JvdHRvbS5jbGFzc05hbWU9InZpcy1zaGFkb3cgdmlzLWJvdHRvbSIsdGhpcy5kb20uc2hhZG93VG9wTGVmdC5jbGFzc05hbWU9InZpcy1zaGFkb3cgdmlzLXRvcCIsdGhpcy5kb20uc2hhZG93Qm90dG9tTGVmdC5jbGFzc05hbWU9InZpcy1zaGFkb3cgdmlzLWJvdHRvbSIsdGhpcy5kb20uc2hhZG93VG9wUmlnaHQuY2xhc3NOYW1lPSJ2aXMtc2hhZG93IHZpcy10b3AiLHRoaXMuZG9tLnNoYWRvd0JvdHRvbVJpZ2h0LmNsYXNzTmFtZT0idmlzLXNoYWRvdyB2aXMtYm90dG9tIix0aGlzLmRvbS5yb290LmFwcGVuZENoaWxkKHRoaXMuZG9tLmJhY2tncm91bmQpLHRoaXMuZG9tLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5kb20uYmFja2dyb3VuZFZlcnRpY2FsKSx0aGlzLmRvbS5yb290LmFwcGVuZENoaWxkKHRoaXMuZG9tLmJhY2tncm91bmRIb3Jpem9udGFsKSx0aGlzLmRvbS5yb290LmFwcGVuZENoaWxkKHRoaXMuZG9tLmNlbnRlckNvbnRhaW5lciksdGhpcy5kb20ucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5sZWZ0Q29udGFpbmVyKSx0aGlzLmRvbS5yb290LmFwcGVuZENoaWxkKHRoaXMuZG9tLnJpZ2h0Q29udGFpbmVyKSx0aGlzLmRvbS5yb290LmFwcGVuZENoaWxkKHRoaXMuZG9tLnRvcCksdGhpcy5kb20ucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5ib3R0b20pLHRoaXMuZG9tLmNlbnRlckNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmRvbS5jZW50ZXIpLHRoaXMuZG9tLmxlZnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5kb20ubGVmdCksdGhpcy5kb20ucmlnaHRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5kb20ucmlnaHQpLHRoaXMuZG9tLmNlbnRlckNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmRvbS5zaGFkb3dUb3ApLHRoaXMuZG9tLmNlbnRlckNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmRvbS5zaGFkb3dCb3R0b20pLHRoaXMuZG9tLmxlZnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5kb20uc2hhZG93VG9wTGVmdCksdGhpcy5kb20ubGVmdENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmRvbS5zaGFkb3dCb3R0b21MZWZ0KSx0aGlzLmRvbS5yaWdodENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmRvbS5zaGFkb3dUb3BSaWdodCksdGhpcy5kb20ucmlnaHRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5kb20uc2hhZG93Qm90dG9tUmlnaHQpLHRoaXMucHJvcHM9e3Jvb3Q6e30sYmFja2dyb3VuZDp7fSxjZW50ZXJDb250YWluZXI6e30sbGVmdENvbnRhaW5lcjp7fSxyaWdodENvbnRhaW5lcjp7fSxjZW50ZXI6e30sbGVmdDp7fSxyaWdodDp7fSx0b3A6e30sYm90dG9tOnt9LGJvcmRlcjp7fSxzY3JvbGxUb3A6MCxzY3JvbGxUb3BNaW46MH0sdGhpcy5vbigicmFuZ2VjaGFuZ2UiLGZ1bmN0aW9uKCl7dGhpcy5pbml0aWFsRHJhd0RvbmU9PT0hMCYmdGhpcy5fcmVkcmF3KCl9LmJpbmQodGhpcykpLHRoaXMub24oInRvdWNoIix0aGlzLl9vblRvdWNoLmJpbmQodGhpcykpLHRoaXMub24oInBhbm1vdmUiLHRoaXMuX29uRHJhZy5iaW5kKHRoaXMpKTt2YXIgcz10aGlzO3RoaXMub24oIl9jaGFuZ2UiLGZ1bmN0aW9uKHQpe3QmJjE9PXQucXVldWU/cy5fcmVkcmF3VGltZXJ8fChzLl9yZWRyYXdUaW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cy5fcmVkcmF3VGltZXI9bnVsbCxzLl9yZWRyYXcoKX0sMCkpOnMuX3JlZHJhdygpfSksdGhpcy5oYW1tZXI9bmV3IHIodGhpcy5kb20ucm9vdCk7dmFyIGg9dGhpcy5oYW1tZXIuZ2V0KCJwaW5jaCIpLnNldCh7ZW5hYmxlOiEwfSk7YS5kaXNhYmxlUHJldmVudERlZmF1bHRWZXJ0aWNhbGx5KGgpLHRoaXMuaGFtbWVyLmdldCgicGFuIikuc2V0KHt0aHJlc2hvbGQ6NSxkaXJlY3Rpb246ci5ESVJFQ1RJT05fSE9SSVpPTlRBTH0pLHRoaXMubGlzdGVuZXJzPXt9O3ZhciBkPVsidGFwIiwiZG91YmxldGFwIiwicHJlc3MiLCJwaW5jaCIsInBhbiIsInBhbnN0YXJ0IiwicGFubW92ZSIsInBhbmVuZCJdO2QuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbihlKXtzLmlzQWN0aXZlKCkmJnMuZW1pdCh0LGUpfTtzLmhhbW1lci5vbih0LGUpLHMubGlzdGVuZXJzW3RdPWV9KSxhLm9uVG91Y2godGhpcy5oYW1tZXIsZnVuY3Rpb24odCl7cy5lbWl0KCJ0b3VjaCIsdCl9LmJpbmQodGhpcykpLGEub25SZWxlYXNlKHRoaXMuaGFtbWVyLGZ1bmN0aW9uKHQpe3MuZW1pdCgicmVsZWFzZSIsdCl9LmJpbmQodGhpcykpLHRoaXMuZG9tLmNlbnRlckNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyPyh0aGlzLmRvbS5jZW50ZXJDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V3aGVlbCIsZS5iaW5kKHRoaXMpLCExKSx0aGlzLmRvbS5jZW50ZXJDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigiRE9NTW91c2VTY3JvbGwiLGUuYmluZCh0aGlzKSwhMSkpOnRoaXMuZG9tLmNlbnRlckNvbnRhaW5lci5hdHRhY2hFdmVudCgib25tb3VzZXdoZWVsIixlLmJpbmQodGhpcykpLHRoaXMuZG9tLmxlZnQucGFyZW50Tm9kZS5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLGkuYmluZCh0aGlzKSksdGhpcy5kb20ucmlnaHQucGFyZW50Tm9kZS5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLGkuYmluZCh0aGlzKSk7dmFyIGw9ITE7aWYodGhpcy5kb20uY2VudGVyLmFkZEV2ZW50TGlzdGVuZXIoImRyYWdvdmVyIixvLmJpbmQodGhpcyksITEpLHRoaXMuZG9tLmNlbnRlci5hZGRFdmVudExpc3RlbmVyKCJkcm9wIixuLmJpbmQodGhpcyksITEpLHRoaXMuY3VzdG9tVGltZXM9W10sdGhpcy50b3VjaD17fSx0aGlzLnJlZHJhd0NvdW50PTAsdGhpcy5pbml0aWFsRHJhd0RvbmU9ITEsIXQpdGhyb3cgbmV3IEVycm9yKCJObyBjb250YWluZXIgcHJvdmlkZWQiKTt0LmFwcGVuZENoaWxkKHRoaXMuZG9tLnJvb3QpfSxvLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe2lmKHQpe3ZhciBlPVsid2lkdGgiLCJoZWlnaHQiLCJtaW5IZWlnaHQiLCJtYXhIZWlnaHQiLCJhdXRvUmVzaXplIiwic3RhcnQiLCJlbmQiLCJjbGlja1RvVXNlIiwiZGF0YUF0dHJpYnV0ZXMiLCJoaWRkZW5EYXRlcyIsImxvY2FsZSIsImxvY2FsZXMiLCJtb21lbnQiLCJydGwiLCJ6b29tS2V5IiwiaG9yaXpvbnRhbFNjcm9sbCIsInZlcnRpY2FsU2Nyb2xsIl07aWYoaC5zZWxlY3RpdmVFeHRlbmQoZSx0aGlzLm9wdGlvbnMsdCksdGhpcy5vcHRpb25zLnJ0bCYmKHRoaXMuZG9tLmNvbnRhaW5lci5zdHlsZS5kaXJlY3Rpb249InJ0bCIsdGhpcy5kb20uYmFja2dyb3VuZFZlcnRpY2FsLmNsYXNzTmFtZT0idmlzLXBhbmVsIHZpcy1iYWNrZ3JvdW5kIHZpcy12ZXJ0aWNhbC1ydGwiKSx0aGlzLm9wdGlvbnMudmVydGljYWxTY3JvbGwmJih0aGlzLm9wdGlvbnMucnRsP3RoaXMuZG9tLnJpZ2h0Q29udGFpbmVyLmNsYXNzTmFtZT0idmlzLXBhbmVsIHZpcy1yaWdodCB2aXMtdmVydGljYWwtc2Nyb2xsIjp0aGlzLmRvbS5sZWZ0Q29udGFpbmVyLmNsYXNzTmFtZT0idmlzLXBhbmVsIHZpcy1sZWZ0IHZpcy12ZXJ0aWNhbC1zY3JvbGwiKSx0aGlzLm9wdGlvbnMub3JpZW50YXRpb249e2l0ZW06dm9pZCAwLGF4aXM6dm9pZCAwfSwib3JpZW50YXRpb24iaW4gdCYmKCJzdHJpbmciPT10eXBlb2YgdC5vcmllbnRhdGlvbj90aGlzLm9wdGlvbnMub3JpZW50YXRpb249e2l0ZW06dC5vcmllbnRhdGlvbixheGlzOnQub3JpZW50YXRpb259OiJvYmplY3QiPT09bih0Lm9yaWVudGF0aW9uKSYmKCJpdGVtImluIHQub3JpZW50YXRpb24mJih0aGlzLm9wdGlvbnMub3JpZW50YXRpb24uaXRlbT10Lm9yaWVudGF0aW9uLml0ZW0pLCJheGlzImluIHQub3JpZW50YXRpb24mJih0aGlzLm9wdGlvbnMub3JpZW50YXRpb24uYXhpcz10Lm9yaWVudGF0aW9uLmF4aXMpKSksImJvdGgiPT09dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLmF4aXMpe2lmKCF0aGlzLnRpbWVBeGlzMil7dmFyIGk9dGhpcy50aW1lQXhpczI9bmV3IGQodGhpcy5ib2R5KTtpLnNldE9wdGlvbnM9ZnVuY3Rpb24odCl7dmFyIGU9dD9oLmV4dGVuZCh7fSx0KTp7fTtlLm9yaWVudGF0aW9uPSJ0b3AiLGQucHJvdG90eXBlLnNldE9wdGlvbnMuY2FsbChpLGUpfSx0aGlzLmNvbXBvbmVudHMucHVzaChpKX19ZWxzZSBpZih0aGlzLnRpbWVBeGlzMil7dmFyIG89dGhpcy5jb21wb25lbnRzLmluZGV4T2YodGhpcy50aW1lQXhpczIpO28hPT0tMSYmdGhpcy5jb21wb25lbnRzLnNwbGljZShvLDEpLHRoaXMudGltZUF4aXMyLmRlc3Ryb3koKSx0aGlzLnRpbWVBeGlzMj1udWxsfWlmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LmRyYXdQb2ludHMmJih0LmRyYXdQb2ludHM9e29uUmVuZGVyOnQuZHJhd1BvaW50c30pLCJoaWRkZW5EYXRlcyJpbiB0aGlzLm9wdGlvbnMmJmMuY29udmVydEhpZGRlbk9wdGlvbnModGhpcy5vcHRpb25zLm1vbWVudCx0aGlzLmJvZHksdGhpcy5vcHRpb25zLmhpZGRlbkRhdGVzKSwiY2xpY2tUb1VzZSJpbiB0JiYodC5jbGlja1RvVXNlP3RoaXMuYWN0aXZhdG9yfHwodGhpcy5hY3RpdmF0b3I9bmV3IGwodGhpcy5kb20ucm9vdCkpOnRoaXMuYWN0aXZhdG9yJiYodGhpcy5hY3RpdmF0b3IuZGVzdHJveSgpLGRlbGV0ZSB0aGlzLmFjdGl2YXRvcikpLCJzaG93Q3VzdG9tVGltZSJpbiB0KXRocm93IG5ldyBFcnJvcigiT3B0aW9uIGBzaG93Q3VzdG9tVGltZWAgaXMgZGVwcmVjYXRlZC4gQ3JlYXRlIGEgY3VzdG9tIHRpbWUgYmFyIHZpYSB0aW1lbGluZS5hZGRDdXN0b21UaW1lKHRpbWUgWywgaWRdKSIpO3RoaXMuX2luaXRBdXRvUmVzaXplKCl9aWYodGhpcy5jb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUuc2V0T3B0aW9ucyh0KX0pLCJjb25maWd1cmUiaW4gdCl7dGhpcy5jb25maWd1cmF0b3J8fCh0aGlzLmNvbmZpZ3VyYXRvcj10aGlzLl9jcmVhdGVDb25maWd1cmF0b3IoKSksdGhpcy5jb25maWd1cmF0b3Iuc2V0T3B0aW9ucyh0LmNvbmZpZ3VyZSk7dmFyIHM9aC5kZWVwRXh0ZW5kKHt9LHRoaXMub3B0aW9ucyk7dGhpcy5jb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24odCl7aC5kZWVwRXh0ZW5kKHMsdC5vcHRpb25zKX0pLHRoaXMuY29uZmlndXJhdG9yLnNldE1vZHVsZU9wdGlvbnMoe2dsb2JhbDpzfSl9dGhpcy5fb3JpZ1JlZHJhdz90aGlzLl9yZWRyYXcoKToodGhpcy5fb3JpZ1JlZHJhdz10aGlzLl9yZWRyYXcuYmluZCh0aGlzKSx0aGlzLl9yZWRyYXc9aC50aHJvdHRsZSh0aGlzLl9vcmlnUmVkcmF3KSl9LG8ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuYWN0aXZhdG9yfHx0aGlzLmFjdGl2YXRvci5hY3RpdmV9LG8ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLnNldEl0ZW1zKG51bGwpLHRoaXMuc2V0R3JvdXBzKG51bGwpLHRoaXMub2ZmKCksdGhpcy5fc3RvcEF1dG9SZXNpemUoKSx0aGlzLmRvbS5yb290LnBhcmVudE5vZGUmJnRoaXMuZG9tLnJvb3QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRvbS5yb290KSx0aGlzLmRvbT1udWxsLHRoaXMuYWN0aXZhdG9yJiYodGhpcy5hY3RpdmF0b3IuZGVzdHJveSgpLGRlbGV0ZSB0aGlzLmFjdGl2YXRvcik7Zm9yKHZhciB0IGluIHRoaXMubGlzdGVuZXJzKXRoaXMubGlzdGVuZXJzLmhhc093blByb3BlcnR5KHQpJiZkZWxldGUgdGhpcy5saXN0ZW5lcnNbdF07dGhpcy5saXN0ZW5lcnM9bnVsbCx0aGlzLmhhbW1lcj1udWxsLHRoaXMuY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmRlc3Ryb3koKX0pLHRoaXMuYm9keT1udWxsfSxvLnByb3RvdHlwZS5zZXRDdXN0b21UaW1lPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5jdXN0b21UaW1lcy5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIGU9PT10Lm9wdGlvbnMuaWR9KTtpZigwPT09aS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJObyBjdXN0b20gdGltZSBiYXIgZm91bmQgd2l0aCBpZCAiK0pTT04uc3RyaW5naWZ5KGUpKTtpLmxlbmd0aD4wJiZpWzBdLnNldEN1c3RvbVRpbWUodCl9LG8ucHJvdG90eXBlLmdldEN1c3RvbVRpbWU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jdXN0b21UaW1lcy5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUub3B0aW9ucy5pZD09PXR9KTtpZigwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJObyBjdXN0b20gdGltZSBiYXIgZm91bmQgd2l0aCBpZCAiK0pTT04uc3RyaW5naWZ5KHQpKTtyZXR1cm4gZVswXS5nZXRDdXN0b21UaW1lKCl9LG8ucHJvdG90eXBlLnNldEN1c3RvbVRpbWVUaXRsZT1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuY3VzdG9tVGltZXMuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm9wdGlvbnMuaWQ9PT1lfSk7aWYoMD09PWkubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiTm8gY3VzdG9tIHRpbWUgYmFyIGZvdW5kIHdpdGggaWQgIitKU09OLnN0cmluZ2lmeShlKSk7aWYoaS5sZW5ndGg+MClyZXR1cm4gaVswXS5zZXRDdXN0b21UaXRsZSh0KX0sby5wcm90b3R5cGUuZ2V0RXZlbnRQcm9wZXJ0aWVzPWZ1bmN0aW9uKHQpe3JldHVybntldmVudDp0fX0sby5wcm90b3R5cGUuYWRkQ3VzdG9tVGltZT1mdW5jdGlvbih0LGUpe3ZhciBpPXZvaWQgMCE9PXQ/aC5jb252ZXJ0KHQsIkRhdGUiKS52YWx1ZU9mKCk6bmV3IERhdGUsbz10aGlzLmN1c3RvbVRpbWVzLnNvbWUoZnVuY3Rpb24odCl7cmV0dXJuIHQub3B0aW9ucy5pZD09PWV9KTtpZihvKXRocm93IG5ldyBFcnJvcigiQSBjdXN0b20gdGltZSB3aXRoIGlkICIrSlNPTi5zdHJpbmdpZnkoZSkrIiBhbHJlYWR5IGV4aXN0cyIpO3ZhciBuPW5ldyB1KHRoaXMuYm9keSxoLmV4dGVuZCh7fSx0aGlzLm9wdGlvbnMse3RpbWU6aSxpZDplfSkpO3JldHVybiB0aGlzLmN1c3RvbVRpbWVzLnB1c2gobiksdGhpcy5jb21wb25lbnRzLnB1c2gobiksdGhpcy5fcmVkcmF3KCksZX0sby5wcm90b3R5cGUucmVtb3ZlQ3VzdG9tVGltZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmN1c3RvbVRpbWVzLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZS5vcHRpb25zLmlkPT09dH0pO2lmKDA9PT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIk5vIGN1c3RvbSB0aW1lIGJhciBmb3VuZCB3aXRoIGlkICIrSlNPTi5zdHJpbmdpZnkodCkpO2UuZm9yRWFjaChmdW5jdGlvbih0KXt0aGlzLmN1c3RvbVRpbWVzLnNwbGljZSh0aGlzLmN1c3RvbVRpbWVzLmluZGV4T2YodCksMSksdGhpcy5jb21wb25lbnRzLnNwbGljZSh0aGlzLmNvbXBvbmVudHMuaW5kZXhPZih0KSwxKSx0LmRlc3Ryb3koKX0uYmluZCh0aGlzKSl9LG8ucHJvdG90eXBlLmdldFZpc2libGVJdGVtcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZW1TZXQmJnRoaXMuaXRlbVNldC5nZXRWaXNpYmxlSXRlbXMoKXx8W119LG8ucHJvdG90eXBlLmZpdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldERhdGFSYW5nZSgpO2lmKG51bGwhPT1lLm1pbnx8bnVsbCE9PWUubWF4KXt2YXIgaT1lLm1heC1lLm1pbixvPW5ldyBEYXRlKGUubWluLnZhbHVlT2YoKS0uMDEqaSksbj1uZXcgRGF0ZShlLm1heC52YWx1ZU9mKCkrLjAxKmkpLHM9IXR8fHZvaWQgMD09PXQuYW5pbWF0aW9ufHx0LmFuaW1hdGlvbjt0aGlzLnJhbmdlLnNldFJhbmdlKG8sbixzKX19LG8ucHJvdG90eXBlLmdldERhdGFSYW5nZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBhYnN0cmFjdCBtZXRob2QgZ2V0RGF0YVJhbmdlIil9LG8ucHJvdG90eXBlLnNldFdpbmRvdz1mdW5jdGlvbih0LGUsaSl7dmFyIG87aWYoMT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdO289dm9pZCAwPT09bi5hbmltYXRpb258fG4uYW5pbWF0aW9uLHRoaXMucmFuZ2Uuc2V0UmFuZ2Uobi5zdGFydCxuLmVuZCxvKX1lbHNlIG89IWl8fHZvaWQgMD09PWkuYW5pbWF0aW9ufHxpLmFuaW1hdGlvbix0aGlzLnJhbmdlLnNldFJhbmdlKHQsZSxvKX0sby5wcm90b3R5cGUubW92ZVRvPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5yYW5nZS5lbmQtdGhpcy5yYW5nZS5zdGFydCxvPWguY29udmVydCh0LCJEYXRlIikudmFsdWVPZigpLG49by1pLzIscz1vK2kvMixyPSFlfHx2b2lkIDA9PT1lLmFuaW1hdGlvbnx8ZS5hbmltYXRpb247dGhpcy5yYW5nZS5zZXRSYW5nZShuLHMscil9LG8ucHJvdG90eXBlLmdldFdpbmRvdz1mdW5jdGlvbigpe3ZhciB0PXRoaXMucmFuZ2UuZ2V0UmFuZ2UoKTtyZXR1cm57c3RhcnQ6bmV3IERhdGUodC5zdGFydCksZW5kOm5ldyBEYXRlKHQuZW5kKX19LG8ucHJvdG90eXBlLnpvb21Jbj1mdW5jdGlvbih0KXtpZighKCF0fHx0PDB8fHQ+MSkpe3ZhciBlPXRoaXMuZ2V0V2luZG93KCksaT1lLnN0YXJ0LnZhbHVlT2YoKSxvPWUuZW5kLnZhbHVlT2YoKSxuPW8taSxzPW4vKDErdCkscj0obi1zKS8yLGE9aStyLGg9by1yO3RoaXMuc2V0V2luZG93KHtzdGFydDphLGVuZDpofSl9fSxvLnByb3RvdHlwZS56b29tT3V0PWZ1bmN0aW9uKHQpe2lmKCEoIXR8fHQ8MHx8dD4xKSl7dmFyIGU9dGhpcy5nZXRXaW5kb3coKSxpPWUuc3RhcnQudmFsdWVPZigpLG89ZS5lbmQudmFsdWVPZigpLG49by1pLHM9aS1uKnQvMixyPW8rbip0LzI7dGhpcy5zZXRXaW5kb3coe3N0YXJ0OnMsZW5kOnJ9KX19LG8ucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe3RoaXMuX3JlZHJhdygpfSxvLnByb3RvdHlwZS5fcmVkcmF3PWZ1bmN0aW9uKCl7dGhpcy5yZWRyYXdDb3VudCsrO3ZhciB0PSExLGU9dGhpcy5vcHRpb25zLGk9dGhpcy5wcm9wcyxvPXRoaXMuZG9tO2lmKG8mJm8uY29udGFpbmVyJiYwIT1vLnJvb3Qub2Zmc2V0V2lkdGgpe2MudXBkYXRlSGlkZGVuRGF0ZXModGhpcy5vcHRpb25zLm1vbWVudCx0aGlzLmJvZHksdGhpcy5vcHRpb25zLmhpZGRlbkRhdGVzKSwidG9wIj09ZS5vcmllbnRhdGlvbj8oaC5hZGRDbGFzc05hbWUoby5yb290LCJ2aXMtdG9wIiksaC5yZW1vdmVDbGFzc05hbWUoby5yb290LCJ2aXMtYm90dG9tIikpOihoLnJlbW92ZUNsYXNzTmFtZShvLnJvb3QsInZpcy10b3AiKSxoLmFkZENsYXNzTmFtZShvLnJvb3QsInZpcy1ib3R0b20iKSksby5yb290LnN0eWxlLm1heEhlaWdodD1oLm9wdGlvbi5hc1NpemUoZS5tYXhIZWlnaHQsIiIpLG8ucm9vdC5zdHlsZS5taW5IZWlnaHQ9aC5vcHRpb24uYXNTaXplKGUubWluSGVpZ2h0LCIiKSxvLnJvb3Quc3R5bGUud2lkdGg9aC5vcHRpb24uYXNTaXplKGUud2lkdGgsIiIpLGkuYm9yZGVyLmxlZnQ9KG8uY2VudGVyQ29udGFpbmVyLm9mZnNldFdpZHRoLW8uY2VudGVyQ29udGFpbmVyLmNsaWVudFdpZHRoKS8yLGkuYm9yZGVyLnJpZ2h0PWkuYm9yZGVyLmxlZnQsaS5ib3JkZXIudG9wPShvLmNlbnRlckNvbnRhaW5lci5vZmZzZXRIZWlnaHQtby5jZW50ZXJDb250YWluZXIuY2xpZW50SGVpZ2h0KS8yLGkuYm9yZGVyLmJvdHRvbT1pLmJvcmRlci50b3A7dmFyIG49by5yb290Lm9mZnNldEhlaWdodC1vLnJvb3QuY2xpZW50SGVpZ2h0LHM9by5yb290Lm9mZnNldFdpZHRoLW8ucm9vdC5jbGllbnRXaWR0aDswPT09by5jZW50ZXJDb250YWluZXIuY2xpZW50SGVpZ2h0JiYoaS5ib3JkZXIubGVmdD1pLmJvcmRlci50b3AsaS5ib3JkZXIucmlnaHQ9aS5ib3JkZXIubGVmdCksMD09PW8ucm9vdC5jbGllbnRIZWlnaHQmJihzPW4pLGkuY2VudGVyLmhlaWdodD1vLmNlbnRlci5vZmZzZXRIZWlnaHQsaS5sZWZ0LmhlaWdodD1vLmxlZnQub2Zmc2V0SGVpZ2h0LGkucmlnaHQuaGVpZ2h0PW8ucmlnaHQub2Zmc2V0SGVpZ2h0LGkudG9wLmhlaWdodD1vLnRvcC5jbGllbnRIZWlnaHR8fC1pLmJvcmRlci50b3AsaS5ib3R0b20uaGVpZ2h0PW8uYm90dG9tLmNsaWVudEhlaWdodHx8LWkuYm9yZGVyLmJvdHRvbTt2YXIgYT1NYXRoLm1heChpLmxlZnQuaGVpZ2h0LGkuY2VudGVyLmhlaWdodCxpLnJpZ2h0LmhlaWdodCksZD1pLnRvcC5oZWlnaHQrYStpLmJvdHRvbS5oZWlnaHQrbitpLmJvcmRlci50b3AraS5ib3JkZXIuYm90dG9tO28ucm9vdC5zdHlsZS5oZWlnaHQ9aC5vcHRpb24uYXNTaXplKGUuaGVpZ2h0LGQrInB4IiksaS5yb290LmhlaWdodD1vLnJvb3Qub2Zmc2V0SGVpZ2h0LGkuYmFja2dyb3VuZC5oZWlnaHQ9aS5yb290LmhlaWdodC1uO3ZhciBsPWkucm9vdC5oZWlnaHQtaS50b3AuaGVpZ2h0LWkuYm90dG9tLmhlaWdodC1uO2kuY2VudGVyQ29udGFpbmVyLmhlaWdodD1sLGkubGVmdENvbnRhaW5lci5oZWlnaHQ9bCxpLnJpZ2h0Q29udGFpbmVyLmhlaWdodD1pLmxlZnRDb250YWluZXIuaGVpZ2h0LGkucm9vdC53aWR0aD1vLnJvb3Qub2Zmc2V0V2lkdGgsaS5iYWNrZ3JvdW5kLndpZHRoPWkucm9vdC53aWR0aC1zLHRoaXMuaW5pdGlhbERyYXdEb25lfHwoaS5zY3JvbGxiYXJXaWR0aD1oLmdldFNjcm9sbEJhcldpZHRoKCkpLHRoaXMub3B0aW9ucy52ZXJ0aWNhbFNjcm9sbD90aGlzLm9wdGlvbnMucnRsPyhpLmxlZnQud2lkdGg9by5sZWZ0Q29udGFpbmVyLmNsaWVudFdpZHRofHwtaS5ib3JkZXIubGVmdCxpLnJpZ2h0LndpZHRoPW8ucmlnaHRDb250YWluZXIuY2xpZW50V2lkdGgraS5zY3JvbGxiYXJXaWR0aHx8LWkuYm9yZGVyLnJpZ2h0KTooaS5sZWZ0LndpZHRoPW8ubGVmdENvbnRhaW5lci5jbGllbnRXaWR0aCtpLnNjcm9sbGJhcldpZHRofHwtaS5ib3JkZXIubGVmdCxpLnJpZ2h0LndpZHRoPW8ucmlnaHRDb250YWluZXIuY2xpZW50V2lkdGh8fC1pLmJvcmRlci5yaWdodCk6KGkubGVmdC53aWR0aD1vLmxlZnRDb250YWluZXIuY2xpZW50V2lkdGh8fC1pLmJvcmRlci5sZWZ0LGkucmlnaHQud2lkdGg9by5yaWdodENvbnRhaW5lci5jbGllbnRXaWR0aHx8LWkuYm9yZGVyLnJpZ2h0KSxpLmxlZnRDb250YWluZXIud2lkdGg9aS5sZWZ0LndpZHRoLGkucmlnaHRDb250YWluZXIud2lkdGg9aS5yaWdodC53aWR0aDt2YXIgdT1pLnJvb3Qud2lkdGgtaS5sZWZ0LndpZHRoLWkucmlnaHQud2lkdGgtcztpLmNlbnRlci53aWR0aD11LGkuY2VudGVyQ29udGFpbmVyLndpZHRoPXUsaS50b3Aud2lkdGg9dSxpLmJvdHRvbS53aWR0aD11LG8uYmFja2dyb3VuZC5zdHlsZS5oZWlnaHQ9aS5iYWNrZ3JvdW5kLmhlaWdodCsicHgiLG8uYmFja2dyb3VuZFZlcnRpY2FsLnN0eWxlLmhlaWdodD1pLmJhY2tncm91bmQuaGVpZ2h0KyJweCIsby5iYWNrZ3JvdW5kSG9yaXpvbnRhbC5zdHlsZS5oZWlnaHQ9aS5jZW50ZXJDb250YWluZXIuaGVpZ2h0KyJweCIsby5jZW50ZXJDb250YWluZXIuc3R5bGUuaGVpZ2h0PWkuY2VudGVyQ29udGFpbmVyLmhlaWdodCsicHgiLG8ubGVmdENvbnRhaW5lci5zdHlsZS5oZWlnaHQ9aS5sZWZ0Q29udGFpbmVyLmhlaWdodCsicHgiLG8ucmlnaHRDb250YWluZXIuc3R5bGUuaGVpZ2h0PWkucmlnaHRDb250YWluZXIuaGVpZ2h0KyJweCIsby5iYWNrZ3JvdW5kLnN0eWxlLndpZHRoPWkuYmFja2dyb3VuZC53aWR0aCsicHgiLG8uYmFja2dyb3VuZFZlcnRpY2FsLnN0eWxlLndpZHRoPWkuY2VudGVyQ29udGFpbmVyLndpZHRoKyJweCIsby5iYWNrZ3JvdW5kSG9yaXpvbnRhbC5zdHlsZS53aWR0aD1pLmJhY2tncm91bmQud2lkdGgrInB4IixvLmNlbnRlckNvbnRhaW5lci5zdHlsZS53aWR0aD1pLmNlbnRlci53aWR0aCsicHgiLG8udG9wLnN0eWxlLndpZHRoPWkudG9wLndpZHRoKyJweCIsby5ib3R0b20uc3R5bGUud2lkdGg9aS5ib3R0b20ud2lkdGgrInB4IixvLmJhY2tncm91bmQuc3R5bGUubGVmdD0iMCIsby5iYWNrZ3JvdW5kLnN0eWxlLnRvcD0iMCIsby5iYWNrZ3JvdW5kVmVydGljYWwuc3R5bGUubGVmdD1pLmxlZnQud2lkdGgraS5ib3JkZXIubGVmdCsicHgiLG8uYmFja2dyb3VuZFZlcnRpY2FsLnN0eWxlLnRvcD0iMCIsby5iYWNrZ3JvdW5kSG9yaXpvbnRhbC5zdHlsZS5sZWZ0PSIwIixvLmJhY2tncm91bmRIb3Jpem9udGFsLnN0eWxlLnRvcD1pLnRvcC5oZWlnaHQrInB4IixvLmNlbnRlckNvbnRhaW5lci5zdHlsZS5sZWZ0PWkubGVmdC53aWR0aCsicHgiLG8uY2VudGVyQ29udGFpbmVyLnN0eWxlLnRvcD1pLnRvcC5oZWlnaHQrInB4IixvLmxlZnRDb250YWluZXIuc3R5bGUubGVmdD0iMCIsby5sZWZ0Q29udGFpbmVyLnN0eWxlLnRvcD1pLnRvcC5oZWlnaHQrInB4IixvLnJpZ2h0Q29udGFpbmVyLnN0eWxlLmxlZnQ9aS5sZWZ0LndpZHRoK2kuY2VudGVyLndpZHRoKyJweCIsby5yaWdodENvbnRhaW5lci5zdHlsZS50b3A9aS50b3AuaGVpZ2h0KyJweCIsby50b3Auc3R5bGUubGVmdD1pLmxlZnQud2lkdGgrInB4IixvLnRvcC5zdHlsZS50b3A9IjAiLG8uYm90dG9tLnN0eWxlLmxlZnQ9aS5sZWZ0LndpZHRoKyJweCIsby5ib3R0b20uc3R5bGUudG9wPWkudG9wLmhlaWdodCtpLmNlbnRlckNvbnRhaW5lci5oZWlnaHQrInB4Ijt2YXIgcD10aGlzLl91cGRhdGVTY3JvbGxUb3AoKTsidG9wIiE9ZS5vcmllbnRhdGlvbi5pdGVtJiYocCs9TWF0aC5tYXgodGhpcy5wcm9wcy5jZW50ZXJDb250YWluZXIuaGVpZ2h0LXRoaXMucHJvcHMuY2VudGVyLmhlaWdodC10aGlzLnByb3BzLmJvcmRlci50b3AtdGhpcy5wcm9wcy5ib3JkZXIuYm90dG9tLDApKSxvLmNlbnRlci5zdHlsZS5sZWZ0PSIwIixvLmNlbnRlci5zdHlsZS50b3A9cCsicHgiLG8ubGVmdC5zdHlsZS5sZWZ0PSIwIixvLnJpZ2h0LnN0eWxlLmxlZnQ9IjAiO3ZhciBmPTA9PXRoaXMucHJvcHMuc2Nyb2xsVG9wPyJoaWRkZW4iOiIiLG09dGhpcy5wcm9wcy5zY3JvbGxUb3A9PXRoaXMucHJvcHMuc2Nyb2xsVG9wTWluPyJoaWRkZW4iOiIiO28uc2hhZG93VG9wLnN0eWxlLnZpc2liaWxpdHk9ZixvLnNoYWRvd0JvdHRvbS5zdHlsZS52aXNpYmlsaXR5PW0sby5zaGFkb3dUb3BMZWZ0LnN0eWxlLnZpc2liaWxpdHk9ZixvLnNoYWRvd0JvdHRvbUxlZnQuc3R5bGUudmlzaWJpbGl0eT1tLG8uc2hhZG93VG9wUmlnaHQuc3R5bGUudmlzaWJpbGl0eT1mLG8uc2hhZG93Qm90dG9tUmlnaHQuc3R5bGUudmlzaWJpbGl0eT1tLHRoaXMub3B0aW9ucy52ZXJ0aWNhbFNjcm9sbD8oby5zaGFkb3dUb3BSaWdodC5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iLG8uc2hhZG93Qm90dG9tUmlnaHQuc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIixvLnNoYWRvd1RvcExlZnQuc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIixvLnNoYWRvd0JvdHRvbUxlZnQuc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIik6KG8ubGVmdC5zdHlsZS50b3A9cCsicHgiLG8ucmlnaHQuc3R5bGUudG9wPXArInB4Iik7dmFyIHY9dGhpcy5wcm9wcy5jZW50ZXIuaGVpZ2h0PnRoaXMucHJvcHMuY2VudGVyQ29udGFpbmVyLmhlaWdodDt0aGlzLmhhbW1lci5nZXQoInBhbiIpLnNldCh7ZGlyZWN0aW9uOnY/ci5ESVJFQ1RJT05fQUxMOnIuRElSRUNUSU9OX0hPUklaT05UQUx9KSx0aGlzLmNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbihlKXt0PWUucmVkcmF3KCl8fHR9KTt2YXIgZz01O2lmKHQpe2lmKHRoaXMucmVkcmF3Q291bnQ8ZylyZXR1cm4gdm9pZCB0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfY2hhbmdlIik7Y29uc29sZS5sb2coIldBUk5JTkc6IGluZmluaXRlIGxvb3AgaW4gcmVkcmF3PyIpfWVsc2UgdGhpcy5yZWRyYXdDb3VudD0wO3RoaXMuaW5pdGlhbERyYXdEb25lPSEwLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoImNoYW5nZWQiKX19LG8ucHJvdG90eXBlLnJlcGFpbnQ9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkZ1bmN0aW9uIHJlcGFpbnQgaXMgZGVwcmVjYXRlZC4gVXNlIHJlZHJhdyBpbnN0ZWFkLiIpfSxvLnByb3RvdHlwZS5zZXRDdXJyZW50VGltZT1mdW5jdGlvbih0KXtpZighdGhpcy5jdXJyZW50VGltZSl0aHJvdyBuZXcgRXJyb3IoIk9wdGlvbiBzaG93Q3VycmVudFRpbWUgbXVzdCBiZSB0cnVlIik7dGhpcy5jdXJyZW50VGltZS5zZXRDdXJyZW50VGltZSh0KX0sby5wcm90b3R5cGUuZ2V0Q3VycmVudFRpbWU9ZnVuY3Rpb24oKXtpZighdGhpcy5jdXJyZW50VGltZSl0aHJvdyBuZXcgRXJyb3IoIk9wdGlvbiBzaG93Q3VycmVudFRpbWUgbXVzdCBiZSB0cnVlIik7cmV0dXJuIHRoaXMuY3VycmVudFRpbWUuZ2V0Q3VycmVudFRpbWUoKX0sby5wcm90b3R5cGUuX3RvVGltZT1mdW5jdGlvbih0KXtyZXR1cm4gYy50b1RpbWUodGhpcyx0LHRoaXMucHJvcHMuY2VudGVyLndpZHRoKX0sby5wcm90b3R5cGUuX3RvR2xvYmFsVGltZT1mdW5jdGlvbih0KXtyZXR1cm4gYy50b1RpbWUodGhpcyx0LHRoaXMucHJvcHMucm9vdC53aWR0aCl9LG8ucHJvdG90eXBlLl90b1NjcmVlbj1mdW5jdGlvbih0KXtyZXR1cm4gYy50b1NjcmVlbih0aGlzLHQsdGhpcy5wcm9wcy5jZW50ZXIud2lkdGgpfSxvLnByb3RvdHlwZS5fdG9HbG9iYWxTY3JlZW49ZnVuY3Rpb24odCl7cmV0dXJuIGMudG9TY3JlZW4odGhpcyx0LHRoaXMucHJvcHMucm9vdC53aWR0aCl9LG8ucHJvdG90eXBlLl9pbml0QXV0b1Jlc2l6ZT1mdW5jdGlvbigpezE9PXRoaXMub3B0aW9ucy5hdXRvUmVzaXplP3RoaXMuX3N0YXJ0QXV0b1Jlc2l6ZSgpOnRoaXMuX3N0b3BBdXRvUmVzaXplKCl9LG8ucHJvdG90eXBlLl9zdGFydEF1dG9SZXNpemU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX3N0b3BBdXRvUmVzaXplKCksdGhpcy5fb25SZXNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gMSE9dC5vcHRpb25zLmF1dG9SZXNpemU/dm9pZCB0Ll9zdG9wQXV0b1Jlc2l6ZSgpOnZvaWQodC5kb20ucm9vdCYmKHQuZG9tLnJvb3Qub2Zmc2V0V2lkdGg9PXQucHJvcHMubGFzdFdpZHRoJiZ0LmRvbS5yb290Lm9mZnNldEhlaWdodD09dC5wcm9wcy5sYXN0SGVpZ2h0fHwodC5wcm9wcy5sYXN0V2lkdGg9dC5kb20ucm9vdC5vZmZzZXRXaWR0aCx0LnByb3BzLmxhc3RIZWlnaHQ9dC5kb20ucm9vdC5vZmZzZXRIZWlnaHQsdC5ib2R5LmVtaXR0ZXIuZW1pdCgiX2NoYW5nZSIpKSkpfSxoLmFkZEV2ZW50TGlzdGVuZXIod2luZG93LCJyZXNpemUiLHRoaXMuX29uUmVzaXplKSx0LmRvbS5yb290JiYodC5wcm9wcy5sYXN0V2lkdGg9dC5kb20ucm9vdC5vZmZzZXRXaWR0aCx0LnByb3BzLmxhc3RIZWlnaHQ9dC5kb20ucm9vdC5vZmZzZXRIZWlnaHQpLHRoaXMud2F0Y2hUaW1lcj1zZXRJbnRlcnZhbCh0aGlzLl9vblJlc2l6ZSwxZTMpfSxvLnByb3RvdHlwZS5fc3RvcEF1dG9SZXNpemU9ZnVuY3Rpb24oKXt0aGlzLndhdGNoVGltZXImJihjbGVhckludGVydmFsKHRoaXMud2F0Y2hUaW1lciksdGhpcy53YXRjaFRpbWVyPXZvaWQgMCksdGhpcy5fb25SZXNpemUmJihoLnJlbW92ZUV2ZW50TGlzdGVuZXIod2luZG93LCJyZXNpemUiLHRoaXMuX29uUmVzaXplKSx0aGlzLl9vblJlc2l6ZT1udWxsKX0sby5wcm90b3R5cGUuX29uVG91Y2g9ZnVuY3Rpb24odCl7dGhpcy50b3VjaC5hbGxvd0RyYWdnaW5nPSEwLHRoaXMudG91Y2guaW5pdGlhbFNjcm9sbFRvcD10aGlzLnByb3BzLnNjcm9sbFRvcH0sby5wcm90b3R5cGUuX29uUGluY2g9ZnVuY3Rpb24odCl7dGhpcy50b3VjaC5hbGxvd0RyYWdnaW5nPSExfSxvLnByb3RvdHlwZS5fb25EcmFnPWZ1bmN0aW9uKHQpe2lmKHQmJnRoaXMudG91Y2guYWxsb3dEcmFnZ2luZyl7dmFyIGU9dC5kZWx0YVksaT10aGlzLl9nZXRTY3JvbGxUb3AoKSxvPXRoaXMuX3NldFNjcm9sbFRvcCh0aGlzLnRvdWNoLmluaXRpYWxTY3JvbGxUb3ArZSk7dGhpcy5vcHRpb25zLnZlcnRpY2FsU2Nyb2xsJiYodGhpcy5kb20ubGVmdC5wYXJlbnROb2RlLnNjcm9sbFRvcD0tdGhpcy5wcm9wcy5zY3JvbGxUb3AsdGhpcy5kb20ucmlnaHQucGFyZW50Tm9kZS5zY3JvbGxUb3A9LXRoaXMucHJvcHMuc2Nyb2xsVG9wKSxvIT1pJiZ0aGlzLmVtaXQoInZlcnRpY2FsRHJhZyIpfX0sby5wcm90b3R5cGUuX3NldFNjcm9sbFRvcD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wcm9wcy5zY3JvbGxUb3A9dCx0aGlzLl91cGRhdGVTY3JvbGxUb3AoKSx0aGlzLnByb3BzLnNjcm9sbFRvcH0sby5wcm90b3R5cGUuX3VwZGF0ZVNjcm9sbFRvcD1mdW5jdGlvbigpe3ZhciB0PU1hdGgubWluKHRoaXMucHJvcHMuY2VudGVyQ29udGFpbmVyLmhlaWdodC10aGlzLnByb3BzLmNlbnRlci5oZWlnaHQsMCk7cmV0dXJuIHQhPXRoaXMucHJvcHMuc2Nyb2xsVG9wTWluJiYoInRvcCIhPXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5pdGVtJiYodGhpcy5wcm9wcy5zY3JvbGxUb3ArPXQtdGhpcy5wcm9wcy5zY3JvbGxUb3BNaW4pLHRoaXMucHJvcHMuc2Nyb2xsVG9wTWluPXQpLHRoaXMucHJvcHMuc2Nyb2xsVG9wPjAmJih0aGlzLnByb3BzLnNjcm9sbFRvcD0wKSx0aGlzLnByb3BzLnNjcm9sbFRvcDx0JiYodGhpcy5wcm9wcy5zY3JvbGxUb3A9dCksdGhpcy5wcm9wcy5zY3JvbGxUb3B9LG8ucHJvdG90eXBlLl9nZXRTY3JvbGxUb3A9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcm9wcy5zY3JvbGxUb3B9LG8ucHJvdG90eXBlLl9jcmVhdGVDb25maWd1cmF0b3I9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgYWJzdHJhY3QgbWV0aG9kIF9jcmVhdGVDb25maWd1cmF0b3IiKX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSl7dGhpcy5ib2R5PXQsdGhpcy5kZWZhdWx0T3B0aW9ucz17dHlwZTpudWxsLG9yaWVudGF0aW9uOntpdGVtOiJib3R0b20ifSxhbGlnbjoiYXV0byIsc3RhY2s6ITAsZ3JvdXBPcmRlclN3YXA6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPWUub3JkZXI7ZS5vcmRlcj10Lm9yZGVyLHQub3JkZXI9b30sZ3JvdXBPcmRlcjoib3JkZXIiLHNlbGVjdGFibGU6ITAsbXVsdGlzZWxlY3Q6ITEsaXRlbXNBbHdheXNEcmFnZ2FibGU6ITEsZWRpdGFibGU6e3VwZGF0ZVRpbWU6ITEsdXBkYXRlR3JvdXA6ITEsYWRkOiExLHJlbW92ZTohMX0sZ3JvdXBFZGl0YWJsZTp7b3JkZXI6ITEsYWRkOiExLHJlbW92ZTohMX0sc25hcDpkLnNuYXAsb25BZGQ6ZnVuY3Rpb24odCxlKXtlKHQpfSxvblVwZGF0ZTpmdW5jdGlvbih0LGUpe2UodCl9LG9uTW92ZTpmdW5jdGlvbih0LGUpe2UodCl9LG9uUmVtb3ZlOmZ1bmN0aW9uKHQsZSl7ZSh0KX0sb25Nb3Zpbmc6ZnVuY3Rpb24odCxlKXtlKHQpfSxvbkFkZEdyb3VwOmZ1bmN0aW9uKHQsZSl7ZSh0KX0sb25Nb3ZlR3JvdXA6ZnVuY3Rpb24odCxlKXtlKHQpfSxvblJlbW92ZUdyb3VwOmZ1bmN0aW9uKHQsZSl7ZSh0KX0sbWFyZ2luOntpdGVtOntob3Jpem9udGFsOjEwLHZlcnRpY2FsOjEwfSxheGlzOjIwfSx0b29sdGlwT25JdGVtVXBkYXRlVGltZTohMX0sdGhpcy5vcHRpb25zPXIuZXh0ZW5kKHt9LHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMub3B0aW9ucy5ydGw9ZS5ydGwsdGhpcy5pdGVtT3B0aW9ucz17dHlwZTp7c3RhcnQ6IkRhdGUiLGVuZDoiRGF0ZSJ9fSx0aGlzLmNvbnZlcnNpb249e3RvU2NyZWVuOnQudXRpbC50b1NjcmVlbix0b1RpbWU6dC51dGlsLnRvVGltZX0sdGhpcy5kb209e30sdGhpcy5wcm9wcz17fSx0aGlzLmhhbW1lcj1udWxsO3ZhciBpPXRoaXM7dGhpcy5pdGVtc0RhdGE9bnVsbCx0aGlzLmdyb3Vwc0RhdGE9bnVsbCx0aGlzLml0ZW1MaXN0ZW5lcnM9e2FkZDpmdW5jdGlvbih0LGUsbyl7aS5fb25BZGQoZS5pdGVtcyl9LHVwZGF0ZTpmdW5jdGlvbih0LGUsbyl7aS5fb25VcGRhdGUoZS5pdGVtcyl9LHJlbW92ZTpmdW5jdGlvbih0LGUsbyl7aS5fb25SZW1vdmUoZS5pdGVtcyl9fSx0aGlzLmdyb3VwTGlzdGVuZXJzPXthZGQ6ZnVuY3Rpb24odCxlLG8pe2kuX29uQWRkR3JvdXBzKGUuaXRlbXMpfSx1cGRhdGU6ZnVuY3Rpb24odCxlLG8pe2kuX29uVXBkYXRlR3JvdXBzKGUuaXRlbXMpfSxyZW1vdmU6ZnVuY3Rpb24odCxlLG8pe2kuX29uUmVtb3ZlR3JvdXBzKGUuaXRlbXMpfX0sdGhpcy5pdGVtcz17fSx0aGlzLmdyb3Vwcz17fSx0aGlzLmdyb3VwSWRzPVtdLHRoaXMuc2VsZWN0aW9uPVtdLHRoaXMuc3RhY2tEaXJ0eT0hMCx0aGlzLnRvdWNoUGFyYW1zPXt9LHRoaXMuZ3JvdXBUb3VjaFBhcmFtcz17fSx0aGlzLl9jcmVhdGUoKSx0aGlzLnNldE9wdGlvbnMoZSl9dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9LHM9aSgyMikscj1pKDEpLGE9aSg5KSxoPWkoMTEpLGQ9aSgzNyksbD1pKDMzKSxjPWkoMzgpLHU9aSg0MikscD1pKDQzKSxmPWkoNDQpLG09aSg0MCksdj1pKDQ1KSxnPSJfX3VuZ3JvdXBlZF9fIix5PSJfX2JhY2tncm91bmRfXyI7by5wcm90b3R5cGU9bmV3IGwsby50eXBlcz17YmFja2dyb3VuZDp2LGJveDpwLHJhbmdlOm0scG9pbnQ6Zn0sby5wcm90b3R5cGUuX2NyZWF0ZT1mdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3QuY2xhc3NOYW1lPSJ2aXMtaXRlbXNldCIsdFsidGltZWxpbmUtaXRlbXNldCJdPXRoaXMsdGhpcy5kb20uZnJhbWU9dDt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLmNsYXNzTmFtZT0idmlzLWJhY2tncm91bmQiLHQuYXBwZW5kQ2hpbGQoZSksdGhpcy5kb20uYmFja2dyb3VuZD1lO3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2kuY2xhc3NOYW1lPSJ2aXMtZm9yZWdyb3VuZCIsdC5hcHBlbmRDaGlsZChpKSx0aGlzLmRvbS5mb3JlZ3JvdW5kPWk7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7by5jbGFzc05hbWU9InZpcy1heGlzIix0aGlzLmRvbS5heGlzPW87dmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bi5jbGFzc05hbWU9InZpcy1sYWJlbHNldCIsdGhpcy5kb20ubGFiZWxTZXQ9bix0aGlzLl91cGRhdGVVbmdyb3VwZWQoKTt2YXIgcj1uZXcgdSh5LG51bGwsdGhpcyk7ci5zaG93KCksdGhpcy5ncm91cHNbeV09cix0aGlzLmhhbW1lcj1uZXcgcyh0aGlzLmJvZHkuZG9tLmNlbnRlckNvbnRhaW5lciksdGhpcy5oYW1tZXIub24oImhhbW1lci5pbnB1dCIsZnVuY3Rpb24odCl7dC5pc0ZpcnN0JiZ0aGlzLl9vblRvdWNoKHQpfS5iaW5kKHRoaXMpKSx0aGlzLmhhbW1lci5vbigicGFuc3RhcnQiLHRoaXMuX29uRHJhZ1N0YXJ0LmJpbmQodGhpcykpLHRoaXMuaGFtbWVyLm9uKCJwYW5tb3ZlIix0aGlzLl9vbkRyYWcuYmluZCh0aGlzKSksCnRoaXMuaGFtbWVyLm9uKCJwYW5lbmQiLHRoaXMuX29uRHJhZ0VuZC5iaW5kKHRoaXMpKSx0aGlzLmhhbW1lci5nZXQoInBhbiIpLnNldCh7dGhyZXNob2xkOjUsZGlyZWN0aW9uOnMuRElSRUNUSU9OX0hPUklaT05UQUx9KSx0aGlzLmhhbW1lci5vbigidGFwIix0aGlzLl9vblNlbGVjdEl0ZW0uYmluZCh0aGlzKSksdGhpcy5oYW1tZXIub24oInByZXNzIix0aGlzLl9vbk11bHRpU2VsZWN0SXRlbS5iaW5kKHRoaXMpKSx0aGlzLmhhbW1lci5vbigiZG91YmxldGFwIix0aGlzLl9vbkFkZEl0ZW0uYmluZCh0aGlzKSksdGhpcy5vcHRpb25zLnJ0bD90aGlzLmdyb3VwSGFtbWVyPW5ldyBzKHRoaXMuYm9keS5kb20ucmlnaHRDb250YWluZXIpOnRoaXMuZ3JvdXBIYW1tZXI9bmV3IHModGhpcy5ib2R5LmRvbS5sZWZ0Q29udGFpbmVyKSx0aGlzLmdyb3VwSGFtbWVyLm9uKCJwYW5zdGFydCIsdGhpcy5fb25Hcm91cERyYWdTdGFydC5iaW5kKHRoaXMpKSx0aGlzLmdyb3VwSGFtbWVyLm9uKCJwYW5tb3ZlIix0aGlzLl9vbkdyb3VwRHJhZy5iaW5kKHRoaXMpKSx0aGlzLmdyb3VwSGFtbWVyLm9uKCJwYW5lbmQiLHRoaXMuX29uR3JvdXBEcmFnRW5kLmJpbmQodGhpcykpLHRoaXMuZ3JvdXBIYW1tZXIuZ2V0KCJwYW4iKS5zZXQoe3RocmVzaG9sZDo1LGRpcmVjdGlvbjpzLkRJUkVDVElPTl9IT1JJWk9OVEFMfSksdGhpcy5ib2R5LmRvbS5jZW50ZXJDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLl9vbk1vdXNlT3Zlci5iaW5kKHRoaXMpKSx0aGlzLmJvZHkuZG9tLmNlbnRlckNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsdGhpcy5fb25Nb3VzZU91dC5iaW5kKHRoaXMpKSx0aGlzLnNob3coKX0sby5wcm90b3R5cGUuc2V0T3B0aW9ucz1mdW5jdGlvbih0KXtpZih0KXt2YXIgZT1bInR5cGUiLCJydGwiLCJhbGlnbiIsIm9yZGVyIiwic3RhY2siLCJzZWxlY3RhYmxlIiwibXVsdGlzZWxlY3QiLCJpdGVtc0Fsd2F5c0RyYWdnYWJsZSIsIm11bHRpc2VsZWN0UGVyR3JvdXAiLCJncm91cE9yZGVyIiwiZGF0YUF0dHJpYnV0ZXMiLCJ0ZW1wbGF0ZSIsImdyb3VwVGVtcGxhdGUiLCJoaWRlIiwic25hcCIsImdyb3VwT3JkZXJTd2FwIiwidG9vbHRpcE9uSXRlbVVwZGF0ZVRpbWUiXTtyLnNlbGVjdGl2ZUV4dGVuZChlLHRoaXMub3B0aW9ucyx0KSwib3JpZW50YXRpb24iaW4gdCYmKCJzdHJpbmciPT10eXBlb2YgdC5vcmllbnRhdGlvbj90aGlzLm9wdGlvbnMub3JpZW50YXRpb24uaXRlbT0idG9wIj09PXQub3JpZW50YXRpb24/InRvcCI6ImJvdHRvbSI6Im9iamVjdCI9PT1uKHQub3JpZW50YXRpb24pJiYiaXRlbSJpbiB0Lm9yaWVudGF0aW9uJiYodGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLml0ZW09dC5vcmllbnRhdGlvbi5pdGVtKSksIm1hcmdpbiJpbiB0JiYoIm51bWJlciI9PXR5cGVvZiB0Lm1hcmdpbj8odGhpcy5vcHRpb25zLm1hcmdpbi5heGlzPXQubWFyZ2luLHRoaXMub3B0aW9ucy5tYXJnaW4uaXRlbS5ob3Jpem9udGFsPXQubWFyZ2luLHRoaXMub3B0aW9ucy5tYXJnaW4uaXRlbS52ZXJ0aWNhbD10Lm1hcmdpbik6Im9iamVjdCI9PT1uKHQubWFyZ2luKSYmKHIuc2VsZWN0aXZlRXh0ZW5kKFsiYXhpcyJdLHRoaXMub3B0aW9ucy5tYXJnaW4sdC5tYXJnaW4pLCJpdGVtImluIHQubWFyZ2luJiYoIm51bWJlciI9PXR5cGVvZiB0Lm1hcmdpbi5pdGVtPyh0aGlzLm9wdGlvbnMubWFyZ2luLml0ZW0uaG9yaXpvbnRhbD10Lm1hcmdpbi5pdGVtLHRoaXMub3B0aW9ucy5tYXJnaW4uaXRlbS52ZXJ0aWNhbD10Lm1hcmdpbi5pdGVtKToib2JqZWN0Ij09PW4odC5tYXJnaW4uaXRlbSkmJnIuc2VsZWN0aXZlRXh0ZW5kKFsiaG9yaXpvbnRhbCIsInZlcnRpY2FsIl0sdGhpcy5vcHRpb25zLm1hcmdpbi5pdGVtLHQubWFyZ2luLml0ZW0pKSkpLCJlZGl0YWJsZSJpbiB0JiYoImJvb2xlYW4iPT10eXBlb2YgdC5lZGl0YWJsZT8odGhpcy5vcHRpb25zLmVkaXRhYmxlLnVwZGF0ZVRpbWU9dC5lZGl0YWJsZSx0aGlzLm9wdGlvbnMuZWRpdGFibGUudXBkYXRlR3JvdXA9dC5lZGl0YWJsZSx0aGlzLm9wdGlvbnMuZWRpdGFibGUuYWRkPXQuZWRpdGFibGUsdGhpcy5vcHRpb25zLmVkaXRhYmxlLnJlbW92ZT10LmVkaXRhYmxlKToib2JqZWN0Ij09PW4odC5lZGl0YWJsZSkmJnIuc2VsZWN0aXZlRXh0ZW5kKFsidXBkYXRlVGltZSIsInVwZGF0ZUdyb3VwIiwiYWRkIiwicmVtb3ZlIl0sdGhpcy5vcHRpb25zLmVkaXRhYmxlLHQuZWRpdGFibGUpKSwiZ3JvdXBFZGl0YWJsZSJpbiB0JiYoImJvb2xlYW4iPT10eXBlb2YgdC5ncm91cEVkaXRhYmxlPyh0aGlzLm9wdGlvbnMuZ3JvdXBFZGl0YWJsZS5vcmRlcj10Lmdyb3VwRWRpdGFibGUsdGhpcy5vcHRpb25zLmdyb3VwRWRpdGFibGUuYWRkPXQuZ3JvdXBFZGl0YWJsZSx0aGlzLm9wdGlvbnMuZ3JvdXBFZGl0YWJsZS5yZW1vdmU9dC5ncm91cEVkaXRhYmxlKToib2JqZWN0Ij09PW4odC5ncm91cEVkaXRhYmxlKSYmci5zZWxlY3RpdmVFeHRlbmQoWyJvcmRlciIsImFkZCIsInJlbW92ZSJdLHRoaXMub3B0aW9ucy5ncm91cEVkaXRhYmxlLHQuZ3JvdXBFZGl0YWJsZSkpO3ZhciBpPWZ1bmN0aW9uKGUpe3ZhciBpPXRbZV07aWYoaSl7aWYoIShpIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IG5ldyBFcnJvcigib3B0aW9uICIrZSsiIG11c3QgYmUgYSBmdW5jdGlvbiAiK2UrIihpdGVtLCBjYWxsYmFjaykiKTt0aGlzLm9wdGlvbnNbZV09aX19LmJpbmQodGhpcyk7WyJvbkFkZCIsIm9uVXBkYXRlIiwib25SZW1vdmUiLCJvbk1vdmUiLCJvbk1vdmluZyIsIm9uQWRkR3JvdXAiLCJvbk1vdmVHcm91cCIsIm9uUmVtb3ZlR3JvdXAiXS5mb3JFYWNoKGkpLHRoaXMubWFya0RpcnR5KCl9fSxvLnByb3RvdHlwZS5tYXJrRGlydHk9ZnVuY3Rpb24odCl7dGhpcy5ncm91cElkcz1bXSx0aGlzLnN0YWNrRGlydHk9ITAsdCYmdC5yZWZyZXNoSXRlbXMmJnIuZm9yRWFjaCh0aGlzLml0ZW1zLGZ1bmN0aW9uKHQpe3QuZGlydHk9ITAsdC5kaXNwbGF5ZWQmJnQucmVkcmF3KCl9KX0sby5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuaGlkZSgpLHRoaXMuc2V0SXRlbXMobnVsbCksdGhpcy5zZXRHcm91cHMobnVsbCksdGhpcy5oYW1tZXI9bnVsbCx0aGlzLmJvZHk9bnVsbCx0aGlzLmNvbnZlcnNpb249bnVsbH0sby5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe3RoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGUmJnRoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20uZnJhbWUpLHRoaXMuZG9tLmF4aXMucGFyZW50Tm9kZSYmdGhpcy5kb20uYXhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tLmF4aXMpLHRoaXMuZG9tLmxhYmVsU2V0LnBhcmVudE5vZGUmJnRoaXMuZG9tLmxhYmVsU2V0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20ubGFiZWxTZXQpfSxvLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dGhpcy5kb20uZnJhbWUucGFyZW50Tm9kZXx8dGhpcy5ib2R5LmRvbS5jZW50ZXIuYXBwZW5kQ2hpbGQodGhpcy5kb20uZnJhbWUpLHRoaXMuZG9tLmF4aXMucGFyZW50Tm9kZXx8dGhpcy5ib2R5LmRvbS5iYWNrZ3JvdW5kVmVydGljYWwuYXBwZW5kQ2hpbGQodGhpcy5kb20uYXhpcyksdGhpcy5kb20ubGFiZWxTZXQucGFyZW50Tm9kZXx8KHRoaXMub3B0aW9ucy5ydGw/dGhpcy5ib2R5LmRvbS5yaWdodC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5sYWJlbFNldCk6dGhpcy5ib2R5LmRvbS5sZWZ0LmFwcGVuZENoaWxkKHRoaXMuZG9tLmxhYmVsU2V0KSl9LG8ucHJvdG90eXBlLnNldFNlbGVjdGlvbj1mdW5jdGlvbih0KXt2YXIgZSxpLG8sbjtmb3Iodm9pZCAwPT10JiYodD1bXSksQXJyYXkuaXNBcnJheSh0KXx8KHQ9W3RdKSxlPTAsaT10aGlzLnNlbGVjdGlvbi5sZW5ndGg7ZTxpO2UrKylvPXRoaXMuc2VsZWN0aW9uW2VdLG49dGhpcy5pdGVtc1tvXSxuJiZuLnVuc2VsZWN0KCk7Zm9yKHRoaXMuc2VsZWN0aW9uPVtdLGU9MCxpPXQubGVuZ3RoO2U8aTtlKyspbz10W2VdLG49dGhpcy5pdGVtc1tvXSxuJiYodGhpcy5zZWxlY3Rpb24ucHVzaChvKSxuLnNlbGVjdCgpKX0sby5wcm90b3R5cGUuZ2V0U2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9uLmNvbmNhdChbXSl9LG8ucHJvdG90eXBlLmdldFZpc2libGVJdGVtcz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuYm9keS5yYW5nZS5nZXRSYW5nZSgpO2lmKHRoaXMub3B0aW9ucy5ydGwpdmFyIGU9dGhpcy5ib2R5LnV0aWwudG9TY3JlZW4odC5zdGFydCksaT10aGlzLmJvZHkudXRpbC50b1NjcmVlbih0LmVuZCk7ZWxzZSB2YXIgaT10aGlzLmJvZHkudXRpbC50b1NjcmVlbih0LnN0YXJ0KSxlPXRoaXMuYm9keS51dGlsLnRvU2NyZWVuKHQuZW5kKTt2YXIgbz1bXTtmb3IodmFyIG4gaW4gdGhpcy5ncm91cHMpaWYodGhpcy5ncm91cHMuaGFzT3duUHJvcGVydHkobikpZm9yKHZhciBzPXRoaXMuZ3JvdXBzW25dLHI9cy52aXNpYmxlSXRlbXMsYT0wO2E8ci5sZW5ndGg7YSsrKXt2YXIgaD1yW2FdO3RoaXMub3B0aW9ucy5ydGw/aC5yaWdodDxpJiZoLnJpZ2h0K2gud2lkdGg+ZSYmby5wdXNoKGguaWQpOmgubGVmdDxlJiZoLmxlZnQraC53aWR0aD5pJiZvLnB1c2goaC5pZCl9cmV0dXJuIG99LG8ucHJvdG90eXBlLl9kZXNlbGVjdD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5zZWxlY3Rpb24saT0wLG89ZS5sZW5ndGg7aTxvO2krKylpZihlW2ldPT10KXtlLnNwbGljZShpLDEpO2JyZWFrfX0sby5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLm1hcmdpbixlPXRoaXMuYm9keS5yYW5nZSxpPXIub3B0aW9uLmFzU2l6ZSxvPXRoaXMub3B0aW9ucyxuPW8ub3JpZW50YXRpb24uaXRlbSxzPSExLGE9dGhpcy5kb20uZnJhbWU7dGhpcy5wcm9wcy50b3A9dGhpcy5ib2R5LmRvbVByb3BzLnRvcC5oZWlnaHQrdGhpcy5ib2R5LmRvbVByb3BzLmJvcmRlci50b3AsdGhpcy5vcHRpb25zLnJ0bD90aGlzLnByb3BzLnJpZ2h0PXRoaXMuYm9keS5kb21Qcm9wcy5yaWdodC53aWR0aCt0aGlzLmJvZHkuZG9tUHJvcHMuYm9yZGVyLnJpZ2h0OnRoaXMucHJvcHMubGVmdD10aGlzLmJvZHkuZG9tUHJvcHMubGVmdC53aWR0aCt0aGlzLmJvZHkuZG9tUHJvcHMuYm9yZGVyLmxlZnQsYS5jbGFzc05hbWU9InZpcy1pdGVtc2V0IixzPXRoaXMuX29yZGVyR3JvdXBzKCl8fHM7dmFyIGg9ZS5lbmQtZS5zdGFydCxkPWghPXRoaXMubGFzdFZpc2libGVJbnRlcnZhbHx8dGhpcy5wcm9wcy53aWR0aCE9dGhpcy5wcm9wcy5sYXN0V2lkdGg7ZCYmKHRoaXMuc3RhY2tEaXJ0eT0hMCksdGhpcy5sYXN0VmlzaWJsZUludGVydmFsPWgsdGhpcy5wcm9wcy5sYXN0V2lkdGg9dGhpcy5wcm9wcy53aWR0aDt2YXIgbD10aGlzLnN0YWNrRGlydHksYz10aGlzLl9maXJzdEdyb3VwKCksdT17aXRlbTp0Lml0ZW0sYXhpczp0LmF4aXN9LHA9e2l0ZW06dC5pdGVtLGF4aXM6dC5pdGVtLnZlcnRpY2FsLzJ9LGY9MCxtPXQuYXhpcyt0Lml0ZW0udmVydGljYWw7cmV0dXJuIHRoaXMuZ3JvdXBzW3ldLnJlZHJhdyhlLHAsbCksci5mb3JFYWNoKHRoaXMuZ3JvdXBzLGZ1bmN0aW9uKHQpe3ZhciBpPXQ9PWM/dTpwLG89dC5yZWRyYXcoZSxpLGwpO3M9b3x8cyxmKz10LmhlaWdodH0pLGY9TWF0aC5tYXgoZixtKSx0aGlzLnN0YWNrRGlydHk9ITEsYS5zdHlsZS5oZWlnaHQ9aShmKSx0aGlzLnByb3BzLndpZHRoPWEub2Zmc2V0V2lkdGgsdGhpcy5wcm9wcy5oZWlnaHQ9Zix0aGlzLmRvbS5heGlzLnN0eWxlLnRvcD1pKCJ0b3AiPT1uP3RoaXMuYm9keS5kb21Qcm9wcy50b3AuaGVpZ2h0K3RoaXMuYm9keS5kb21Qcm9wcy5ib3JkZXIudG9wOnRoaXMuYm9keS5kb21Qcm9wcy50b3AuaGVpZ2h0K3RoaXMuYm9keS5kb21Qcm9wcy5jZW50ZXJDb250YWluZXIuaGVpZ2h0KSx0aGlzLm9wdGlvbnMucnRsP3RoaXMuZG9tLmF4aXMuc3R5bGUucmlnaHQ9IjAiOnRoaXMuZG9tLmF4aXMuc3R5bGUubGVmdD0iMCIscz10aGlzLl9pc1Jlc2l6ZWQoKXx8c30sby5wcm90b3R5cGUuX2ZpcnN0R3JvdXA9ZnVuY3Rpb24oKXt2YXIgdD0idG9wIj09dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLml0ZW0/MDp0aGlzLmdyb3VwSWRzLmxlbmd0aC0xLGU9dGhpcy5ncm91cElkc1t0XSxpPXRoaXMuZ3JvdXBzW2VdfHx0aGlzLmdyb3Vwc1tnXTtyZXR1cm4gaXx8bnVsbH0sby5wcm90b3R5cGUuX3VwZGF0ZVVuZ3JvdXBlZD1mdW5jdGlvbigpe3ZhciB0LGUsaT10aGlzLmdyb3Vwc1tnXTt0aGlzLmdyb3Vwc1t5XTtpZih0aGlzLmdyb3Vwc0RhdGEpe2lmKGkpe2kuaGlkZSgpLGRlbGV0ZSB0aGlzLmdyb3Vwc1tnXTtmb3IoZSBpbiB0aGlzLml0ZW1zKWlmKHRoaXMuaXRlbXMuaGFzT3duUHJvcGVydHkoZSkpe3Q9dGhpcy5pdGVtc1tlXSx0LnBhcmVudCYmdC5wYXJlbnQucmVtb3ZlKHQpO3ZhciBvPXRoaXMuX2dldEdyb3VwSWQodC5kYXRhKSxuPXRoaXMuZ3JvdXBzW29dO24mJm4uYWRkKHQpfHx0LmhpZGUoKX19fWVsc2UgaWYoIWkpe3ZhciBzPW51bGwscj1udWxsO2k9bmV3IGMocyxyLHRoaXMpLHRoaXMuZ3JvdXBzW2ddPWk7Zm9yKGUgaW4gdGhpcy5pdGVtcyl0aGlzLml0ZW1zLmhhc093blByb3BlcnR5KGUpJiYodD10aGlzLml0ZW1zW2VdLGkuYWRkKHQpKTtpLnNob3coKX19LG8ucHJvdG90eXBlLmdldExhYmVsU2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tLmxhYmVsU2V0fSxvLnByb3RvdHlwZS5zZXRJdGVtcz1mdW5jdGlvbih0KXt2YXIgZSxpPXRoaXMsbz10aGlzLml0ZW1zRGF0YTtpZih0KXtpZighKHQgaW5zdGFuY2VvZiBhfHx0IGluc3RhbmNlb2YgaCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiRGF0YSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIERhdGFTZXQgb3IgRGF0YVZpZXciKTt0aGlzLml0ZW1zRGF0YT10fWVsc2UgdGhpcy5pdGVtc0RhdGE9bnVsbDtpZihvJiYoci5mb3JFYWNoKHRoaXMuaXRlbUxpc3RlbmVycyxmdW5jdGlvbih0LGUpe28ub2ZmKGUsdCl9KSxlPW8uZ2V0SWRzKCksdGhpcy5fb25SZW1vdmUoZSkpLHRoaXMuaXRlbXNEYXRhKXt2YXIgbj10aGlzLmlkO3IuZm9yRWFjaCh0aGlzLml0ZW1MaXN0ZW5lcnMsZnVuY3Rpb24odCxlKXtpLml0ZW1zRGF0YS5vbihlLHQsbil9KSxlPXRoaXMuaXRlbXNEYXRhLmdldElkcygpLHRoaXMuX29uQWRkKGUpLHRoaXMuX3VwZGF0ZVVuZ3JvdXBlZCgpfXRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9jaGFuZ2UiLHtxdWV1ZTohMH0pfSxvLnByb3RvdHlwZS5nZXRJdGVtcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZW1zRGF0YX0sby5wcm90b3R5cGUuc2V0R3JvdXBzPWZ1bmN0aW9uKHQpe3ZhciBlLGk9dGhpcztpZih0aGlzLmdyb3Vwc0RhdGEmJihyLmZvckVhY2godGhpcy5ncm91cExpc3RlbmVycyxmdW5jdGlvbih0LGUpe2kuZ3JvdXBzRGF0YS5vZmYoZSx0KX0pLGU9dGhpcy5ncm91cHNEYXRhLmdldElkcygpLHRoaXMuZ3JvdXBzRGF0YT1udWxsLHRoaXMuX29uUmVtb3ZlR3JvdXBzKGUpKSx0KXtpZighKHQgaW5zdGFuY2VvZiBhfHx0IGluc3RhbmNlb2YgaCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiRGF0YSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIERhdGFTZXQgb3IgRGF0YVZpZXciKTt0aGlzLmdyb3Vwc0RhdGE9dH1lbHNlIHRoaXMuZ3JvdXBzRGF0YT1udWxsO2lmKHRoaXMuZ3JvdXBzRGF0YSl7dmFyIG89dGhpcy5pZDtyLmZvckVhY2godGhpcy5ncm91cExpc3RlbmVycyxmdW5jdGlvbih0LGUpe2kuZ3JvdXBzRGF0YS5vbihlLHQsbyl9KSxlPXRoaXMuZ3JvdXBzRGF0YS5nZXRJZHMoKSx0aGlzLl9vbkFkZEdyb3VwcyhlKX10aGlzLl91cGRhdGVVbmdyb3VwZWQoKSx0aGlzLl9vcmRlcigpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9jaGFuZ2UiLHtxdWV1ZTohMH0pfSxvLnByb3RvdHlwZS5nZXRHcm91cHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ncm91cHNEYXRhfSxvLnByb3RvdHlwZS5yZW1vdmVJdGVtPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaXRlbXNEYXRhLmdldCh0KSxpPXRoaXMuaXRlbXNEYXRhLmdldERhdGFTZXQoKTtlJiZ0aGlzLm9wdGlvbnMub25SZW1vdmUoZSxmdW5jdGlvbihlKXtlJiZpLnJlbW92ZSh0KX0pfSxvLnByb3RvdHlwZS5fZ2V0VHlwZT1mdW5jdGlvbih0KXtyZXR1cm4gdC50eXBlfHx0aGlzLm9wdGlvbnMudHlwZXx8KHQuZW5kPyJyYW5nZSI6ImJveCIpfSxvLnByb3RvdHlwZS5fZ2V0R3JvdXBJZD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9nZXRUeXBlKHQpO3JldHVybiJiYWNrZ3JvdW5kIj09ZSYmdm9pZCAwPT10Lmdyb3VwP3k6dGhpcy5ncm91cHNEYXRhP3QuZ3JvdXA6Z30sby5wcm90b3R5cGUuX29uVXBkYXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBpLG49ZS5pdGVtc0RhdGEuZ2V0KHQsZS5pdGVtT3B0aW9ucykscz1lLml0ZW1zW3RdLHI9bj9lLl9nZXRUeXBlKG4pOm51bGwsYT1vLnR5cGVzW3JdO2lmKHMmJihhJiZzIGluc3RhbmNlb2YgYT9lLl91cGRhdGVJdGVtKHMsbik6KGk9cy5zZWxlY3RlZCxlLl9yZW1vdmVJdGVtKHMpLHM9bnVsbCkpLCFzJiZuKXtpZighYSl0aHJvdyJyYW5nZW92ZXJmbG93Ij09cj9uZXcgVHlwZUVycm9yKCdJdGVtIHR5cGUgInJhbmdlb3ZlcmZsb3ciIGlzIGRlcHJlY2F0ZWQuIFVzZSBjc3Mgc3R5bGluZyBpbnN0ZWFkOiAudmlzLWl0ZW0udmlzLXJhbmdlIC52aXMtaXRlbS1jb250ZW50IHtvdmVyZmxvdzogdmlzaWJsZTt9Jyk6bmV3IFR5cGVFcnJvcignVW5rbm93biBpdGVtIHR5cGUgIicrcisnIicpO3M9bmV3IGEobixlLmNvbnZlcnNpb24sZS5vcHRpb25zKSxzLmlkPXQsZS5fYWRkSXRlbShzKSxpJiYodGhpcy5zZWxlY3Rpb24ucHVzaCh0KSxzLnNlbGVjdCgpKX19LmJpbmQodGhpcykpLHRoaXMuX29yZGVyKCksdGhpcy5zdGFja0RpcnR5PSEwLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9jaGFuZ2UiLHtxdWV1ZTohMH0pfSxvLnByb3RvdHlwZS5fb25BZGQ9by5wcm90b3R5cGUuX29uVXBkYXRlLG8ucHJvdG90eXBlLl9vblJlbW92ZT1mdW5jdGlvbih0KXt2YXIgZT0wLGk9dGhpczt0LmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG89aS5pdGVtc1t0XTtvJiYoZSsrLGkuX3JlbW92ZUl0ZW0obykpfSksZSYmKHRoaXMuX29yZGVyKCksdGhpcy5zdGFja0RpcnR5PSEwLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9jaGFuZ2UiLHtxdWV1ZTohMH0pKX0sby5wcm90b3R5cGUuX29yZGVyPWZ1bmN0aW9uKCl7ci5mb3JFYWNoKHRoaXMuZ3JvdXBzLGZ1bmN0aW9uKHQpe3Qub3JkZXIoKX0pfSxvLnByb3RvdHlwZS5fb25VcGRhdGVHcm91cHM9ZnVuY3Rpb24odCl7dGhpcy5fb25BZGRHcm91cHModCl9LG8ucHJvdG90eXBlLl9vbkFkZEdyb3Vwcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3QuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgaT1lLmdyb3Vwc0RhdGEuZ2V0KHQpLG89ZS5ncm91cHNbdF07aWYobylvLnNldERhdGEoaSk7ZWxzZXtpZih0PT1nfHx0PT15KXRocm93IG5ldyBFcnJvcigiSWxsZWdhbCBncm91cCBpZC4gIit0KyIgaXMgYSByZXNlcnZlZCBpZC4iKTt2YXIgbj1PYmplY3QuY3JlYXRlKGUub3B0aW9ucyk7ci5leHRlbmQobix7aGVpZ2h0Om51bGx9KSxvPW5ldyBjKHQsaSxlKSxlLmdyb3Vwc1t0XT1vO2Zvcih2YXIgcyBpbiBlLml0ZW1zKWlmKGUuaXRlbXMuaGFzT3duUHJvcGVydHkocykpe3ZhciBhPWUuaXRlbXNbc107YS5kYXRhLmdyb3VwPT10JiZvLmFkZChhKX1vLm9yZGVyKCksby5zaG93KCl9fSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX2NoYW5nZSIse3F1ZXVlOiEwfSl9LG8ucHJvdG90eXBlLl9vblJlbW92ZUdyb3Vwcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdyb3Vwczt0LmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGk9ZVt0XTtpJiYoaS5oaWRlKCksZGVsZXRlIGVbdF0pfSksdGhpcy5tYXJrRGlydHkoKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfY2hhbmdlIix7cXVldWU6ITB9KX0sby5wcm90b3R5cGUuX29yZGVyR3JvdXBzPWZ1bmN0aW9uKCl7aWYodGhpcy5ncm91cHNEYXRhKXt2YXIgdD10aGlzLmdyb3Vwc0RhdGEuZ2V0SWRzKHtvcmRlcjp0aGlzLm9wdGlvbnMuZ3JvdXBPcmRlcn0pLGU9IXIuZXF1YWxBcnJheSh0LHRoaXMuZ3JvdXBJZHMpO2lmKGUpe3ZhciBpPXRoaXMuZ3JvdXBzO3QuZm9yRWFjaChmdW5jdGlvbih0KXtpW3RdLmhpZGUoKX0pLHQuZm9yRWFjaChmdW5jdGlvbih0KXtpW3RdLnNob3coKX0pLHRoaXMuZ3JvdXBJZHM9dH1yZXR1cm4gZX1yZXR1cm4hMX0sby5wcm90b3R5cGUuX2FkZEl0ZW09ZnVuY3Rpb24odCl7dGhpcy5pdGVtc1t0LmlkXT10O3ZhciBlPXRoaXMuX2dldEdyb3VwSWQodC5kYXRhKSxpPXRoaXMuZ3JvdXBzW2VdO2kmJmkuYWRkKHQpfSxvLnByb3RvdHlwZS5fdXBkYXRlSXRlbT1mdW5jdGlvbih0LGUpe3ZhciBpPXQuZGF0YS5ncm91cCxvPXQuZGF0YS5zdWJncm91cDtpZih0LnNldERhdGEoZSksaSE9dC5kYXRhLmdyb3VwfHxvIT10LmRhdGEuc3ViZ3JvdXApe3ZhciBuPXRoaXMuZ3JvdXBzW2ldO24mJm4ucmVtb3ZlKHQpO3ZhciBzPXRoaXMuX2dldEdyb3VwSWQodC5kYXRhKSxyPXRoaXMuZ3JvdXBzW3NdO3ImJnIuYWRkKHQpfX0sby5wcm90b3R5cGUuX3JlbW92ZUl0ZW09ZnVuY3Rpb24odCl7dC5oaWRlKCksZGVsZXRlIHRoaXMuaXRlbXNbdC5pZF07dmFyIGU9dGhpcy5zZWxlY3Rpb24uaW5kZXhPZih0LmlkKTtlIT0tMSYmdGhpcy5zZWxlY3Rpb24uc3BsaWNlKGUsMSksdC5wYXJlbnQmJnQucGFyZW50LnJlbW92ZSh0KX0sby5wcm90b3R5cGUuX2NvbnN0cnVjdEJ5RW5kQXJyYXk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLGk9MDtpPHQubGVuZ3RoO2krKyl0W2ldaW5zdGFuY2VvZiBtJiZlLnB1c2godFtpXSk7cmV0dXJuIGV9LG8ucHJvdG90eXBlLl9vblRvdWNoPWZ1bmN0aW9uKHQpe3RoaXMudG91Y2hQYXJhbXMuaXRlbT10aGlzLml0ZW1Gcm9tVGFyZ2V0KHQpLHRoaXMudG91Y2hQYXJhbXMuZHJhZ0xlZnRJdGVtPXQudGFyZ2V0LmRyYWdMZWZ0SXRlbXx8ITEsdGhpcy50b3VjaFBhcmFtcy5kcmFnUmlnaHRJdGVtPXQudGFyZ2V0LmRyYWdSaWdodEl0ZW18fCExLHRoaXMudG91Y2hQYXJhbXMuaXRlbVByb3BzPW51bGx9LG8ucHJvdG90eXBlLl9nZXRHcm91cEluZGV4PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5ncm91cElkcy5sZW5ndGg7ZSsrKWlmKHQ9PXRoaXMuZ3JvdXBJZHNbZV0pcmV0dXJuIGV9LG8ucHJvdG90eXBlLl9vbkRyYWdTdGFydD1mdW5jdGlvbih0KXt2YXIgZSxpPXRoaXMudG91Y2hQYXJhbXMuaXRlbXx8bnVsbCxvPXRoaXM7aWYoaSYmKGkuc2VsZWN0ZWR8fHRoaXMub3B0aW9ucy5pdGVtc0Fsd2F5c0RyYWdnYWJsZSkpe2lmKCF0aGlzLm9wdGlvbnMuZWRpdGFibGUudXBkYXRlVGltZSYmIXRoaXMub3B0aW9ucy5lZGl0YWJsZS51cGRhdGVHcm91cCYmIWkuZWRpdGFibGUpcmV0dXJuO2lmKGkuZWRpdGFibGU9PT0hMSlyZXR1cm47dmFyIG49dGhpcy50b3VjaFBhcmFtcy5kcmFnTGVmdEl0ZW0scz10aGlzLnRvdWNoUGFyYW1zLmRyYWdSaWdodEl0ZW07aWYodGhpcy50b3VjaFBhcmFtcy5pdGVtSXNEcmFnZ2luZz0hMCxuKWU9e2l0ZW06bixpbml0aWFsWDp0LmNlbnRlci54LGRyYWdMZWZ0OiEwLGRhdGE6dGhpcy5fY2xvbmVJdGVtRGF0YShpLmRhdGEpfSx0aGlzLnRvdWNoUGFyYW1zLml0ZW1Qcm9wcz1bZV07ZWxzZSBpZihzKWU9e2l0ZW06cyxpbml0aWFsWDp0LmNlbnRlci54LGRyYWdSaWdodDohMCxkYXRhOnRoaXMuX2Nsb25lSXRlbURhdGEoaS5kYXRhKX0sdGhpcy50b3VjaFBhcmFtcy5pdGVtUHJvcHM9W2VdO2Vsc2V7dGhpcy50b3VjaFBhcmFtcy5zZWxlY3RlZEl0ZW09aTt2YXIgcj10aGlzLl9nZXRHcm91cEluZGV4KGkuZGF0YS5ncm91cCksYT10aGlzLm9wdGlvbnMuaXRlbXNBbHdheXNEcmFnZ2FibGUmJiFpLnNlbGVjdGVkP1tpLmlkXTp0aGlzLmdldFNlbGVjdGlvbigpO3RoaXMudG91Y2hQYXJhbXMuaXRlbVByb3BzPWEubWFwKGZ1bmN0aW9uKGUpe3ZhciBpPW8uaXRlbXNbZV0sbj1vLl9nZXRHcm91cEluZGV4KGkuZGF0YS5ncm91cCk7cmV0dXJue2l0ZW06aSxpbml0aWFsWDp0LmNlbnRlci54LGdyb3VwT2Zmc2V0OnItbixkYXRhOnRoaXMuX2Nsb25lSXRlbURhdGEoaS5kYXRhKX19LmJpbmQodGhpcykpfXQuc3RvcFByb3BhZ2F0aW9uKCl9ZWxzZSB0aGlzLm9wdGlvbnMuZWRpdGFibGUuYWRkJiYodC5zcmNFdmVudC5jdHJsS2V5fHx0LnNyY0V2ZW50Lm1ldGFLZXkpJiZ0aGlzLl9vbkRyYWdTdGFydEFkZEl0ZW0odCl9LG8ucHJvdG90eXBlLl9vbkRyYWdTdGFydEFkZEl0ZW09ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb25zLnNuYXB8fG51bGw7aWYodGhpcy5vcHRpb25zLnJ0bCl2YXIgaT1yLmdldEFic29sdXRlUmlnaHQodGhpcy5kb20uZnJhbWUpLG89aS10LmNlbnRlci54KzEwO2Vsc2UgdmFyIGk9ci5nZXRBYnNvbHV0ZUxlZnQodGhpcy5kb20uZnJhbWUpLG89dC5jZW50ZXIueC1pLTEwO3ZhciBuPXRoaXMuYm9keS51dGlsLnRvVGltZShvKSxzPXRoaXMuYm9keS51dGlsLmdldFNjYWxlKCksYT10aGlzLmJvZHkudXRpbC5nZXRTdGVwKCksaD1lP2UobixzLGEpOm4sZD1oLGw9e3R5cGU6InJhbmdlIixzdGFydDpoLGVuZDpkLGNvbnRlbnQ6Im5ldyBpdGVtIn0sYz1yLnJhbmRvbVVVSUQoKTtsW3RoaXMuaXRlbXNEYXRhLl9maWVsZElkXT1jO3ZhciB1PXRoaXMuZ3JvdXBGcm9tVGFyZ2V0KHQpO3UmJihsLmdyb3VwPXUuZ3JvdXBJZCk7dmFyIHA9bmV3IG0obCx0aGlzLmNvbnZlcnNpb24sdGhpcy5vcHRpb25zKTtwLmlkPWMscC5kYXRhPXRoaXMuX2Nsb25lSXRlbURhdGEobCksdGhpcy5fYWRkSXRlbShwKTt2YXIgZj17aXRlbTpwLGluaXRpYWxYOnQuY2VudGVyLngsZGF0YTpwLmRhdGF9O3RoaXMub3B0aW9ucy5ydGw/Zi5kcmFnTGVmdD0hMDpmLmRyYWdSaWdodD0hMCx0aGlzLnRvdWNoUGFyYW1zLml0ZW1Qcm9wcz1bZl0sdC5zdG9wUHJvcGFnYXRpb24oKX0sby5wcm90b3R5cGUuX29uRHJhZz1mdW5jdGlvbih0KXtpZih0aGlzLnRvdWNoUGFyYW1zLml0ZW1Qcm9wcyl7dC5zdG9wUHJvcGFnYXRpb24oKTt2YXIgZT10aGlzLGk9dGhpcy5vcHRpb25zLnNuYXB8fG51bGw7aWYodGhpcy5vcHRpb25zLnJ0bCl2YXIgbz10aGlzLmJvZHkuZG9tLnJvb3Qub2Zmc2V0TGVmdCt0aGlzLmJvZHkuZG9tUHJvcHMucmlnaHQud2lkdGg7ZWxzZSB2YXIgbz10aGlzLmJvZHkuZG9tLnJvb3Qub2Zmc2V0TGVmdCt0aGlzLmJvZHkuZG9tUHJvcHMubGVmdC53aWR0aDt2YXIgbj10aGlzLmJvZHkudXRpbC5nZXRTY2FsZSgpLHM9dGhpcy5ib2R5LnV0aWwuZ2V0U3RlcCgpLGE9dGhpcy50b3VjaFBhcmFtcy5zZWxlY3RlZEl0ZW0saD1lLm9wdGlvbnMuZWRpdGFibGUudXBkYXRlR3JvdXAsZD1udWxsO2lmKGgmJmEmJnZvaWQgMCE9YS5kYXRhLmdyb3VwKXt2YXIgbD1lLmdyb3VwRnJvbVRhcmdldCh0KTtsJiYoZD10aGlzLl9nZXRHcm91cEluZGV4KGwuZ3JvdXBJZCkpfXRoaXMudG91Y2hQYXJhbXMuaXRlbVByb3BzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGg9ZS5ib2R5LnV0aWwudG9UaW1lKHQuY2VudGVyLngtbyksbD1lLmJvZHkudXRpbC50b1RpbWUoYS5pbml0aWFsWC1vKTtpZih0aGlzLm9wdGlvbnMucnRsKXZhciBjPS0oaC1sKTtlbHNlIHZhciBjPWgtbDt2YXIgdT10aGlzLl9jbG9uZUl0ZW1EYXRhKGEuaXRlbS5kYXRhKTtpZihhLml0ZW0uZWRpdGFibGUhPT0hMSl7dmFyIHA9ZS5vcHRpb25zLmVkaXRhYmxlLnVwZGF0ZVRpbWV8fGEuaXRlbS5lZGl0YWJsZT09PSEwO2lmKHApaWYoYS5kcmFnTGVmdCl7aWYodGhpcy5vcHRpb25zLnJ0bCl7aWYodm9pZCAwIT11LmVuZCl7dmFyIGY9ci5jb252ZXJ0KGEuZGF0YS5lbmQsIkRhdGUiKSxtPW5ldyBEYXRlKGYudmFsdWVPZigpK2MpO3UuZW5kPWk/aShtLG4scyk6bX19ZWxzZSBpZih2b2lkIDAhPXUuc3RhcnQpe3ZhciB2PXIuY29udmVydChhLmRhdGEuc3RhcnQsIkRhdGUiKSxnPW5ldyBEYXRlKHYudmFsdWVPZigpK2MpO3Uuc3RhcnQ9aT9pKGcsbixzKTpnfX1lbHNlIGlmKGEuZHJhZ1JpZ2h0KXtpZih0aGlzLm9wdGlvbnMucnRsKXtpZih2b2lkIDAhPXUuc3RhcnQpe3ZhciB2PXIuY29udmVydChhLmRhdGEuc3RhcnQsIkRhdGUiKSxnPW5ldyBEYXRlKHYudmFsdWVPZigpK2MpO3Uuc3RhcnQ9aT9pKGcsbixzKTpnfX1lbHNlIGlmKHZvaWQgMCE9dS5lbmQpe3ZhciBmPXIuY29udmVydChhLmRhdGEuZW5kLCJEYXRlIiksbT1uZXcgRGF0ZShmLnZhbHVlT2YoKStjKTt1LmVuZD1pP2kobSxuLHMpOm19fWVsc2UgaWYodm9pZCAwIT11LnN0YXJ0KXt2YXIgdj1yLmNvbnZlcnQoYS5kYXRhLnN0YXJ0LCJEYXRlIikudmFsdWVPZigpLGc9bmV3IERhdGUoditjKTtpZih2b2lkIDAhPXUuZW5kKXt2YXIgZj1yLmNvbnZlcnQoYS5kYXRhLmVuZCwiRGF0ZSIpLHk9Zi52YWx1ZU9mKCktdi52YWx1ZU9mKCk7dS5zdGFydD1pP2koZyxuLHMpOmcsdS5lbmQ9bmV3IERhdGUodS5zdGFydC52YWx1ZU9mKCkreSl9ZWxzZSB1LnN0YXJ0PWk/aShnLG4scyk6Z312YXIgYj1lLm9wdGlvbnMuZWRpdGFibGUudXBkYXRlR3JvdXB8fGEuaXRlbS5lZGl0YWJsZT09PSEwO2lmKGImJiFhLmRyYWdMZWZ0JiYhYS5kcmFnUmlnaHQmJm51bGwhPWQmJnZvaWQgMCE9dS5ncm91cCl7dmFyIF89ZC1hLmdyb3VwT2Zmc2V0O189TWF0aC5tYXgoMCxfKSxfPU1hdGgubWluKGUuZ3JvdXBJZHMubGVuZ3RoLTEsXyksdS5ncm91cD1lLmdyb3VwSWRzW19dfXU9dGhpcy5fY2xvbmVJdGVtRGF0YSh1KSxlLm9wdGlvbnMub25Nb3ZpbmcodSxmdW5jdGlvbih0KXt0JiZhLml0ZW0uc2V0RGF0YSh0aGlzLl9jbG9uZUl0ZW1EYXRhKHQsIkRhdGUiKSl9LmJpbmQodGhpcykpfX0uYmluZCh0aGlzKSksdGhpcy5zdGFja0RpcnR5PSEwLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9jaGFuZ2UiKX19LG8ucHJvdG90eXBlLl9tb3ZlVG9Hcm91cD1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuZ3JvdXBzW2VdO2lmKGkmJmkuZ3JvdXBJZCE9dC5kYXRhLmdyb3VwKXt2YXIgbz10LnBhcmVudDtvLnJlbW92ZSh0KSxvLm9yZGVyKCksaS5hZGQodCksaS5vcmRlcigpLHQuZGF0YS5ncm91cD1pLmdyb3VwSWR9fSxvLnByb3RvdHlwZS5fb25EcmFnRW5kPWZ1bmN0aW9uKHQpe2lmKHRoaXMudG91Y2hQYXJhbXMuaXRlbVByb3BzKXt0LnN0b3BQcm9wYWdhdGlvbigpO3ZhciBlPXRoaXMsaT10aGlzLml0ZW1zRGF0YS5nZXREYXRhU2V0KCksbz10aGlzLnRvdWNoUGFyYW1zLml0ZW1Qcm9wczt0aGlzLnRvdWNoUGFyYW1zLml0ZW1Qcm9wcz1udWxsLHRoaXMudG91Y2hQYXJhbXMuaXRlbUlzRHJhZ2dpbmc9ITEsby5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBvPXQuaXRlbS5pZCxuPW51bGwhPWUuaXRlbXNEYXRhLmdldChvLGUuaXRlbU9wdGlvbnMpO2lmKG4pe3ZhciBzPXRoaXMuX2Nsb25lSXRlbURhdGEodC5pdGVtLmRhdGEpO2Uub3B0aW9ucy5vbk1vdmUocyxmdW5jdGlvbihuKXtuPyhuW2kuX2ZpZWxkSWRdPW8saS51cGRhdGUobikpOih0Lml0ZW0uc2V0RGF0YSh0LmRhdGEpLGUuc3RhY2tEaXJ0eT0hMCxlLmJvZHkuZW1pdHRlci5lbWl0KCJfY2hhbmdlIikpfSl9ZWxzZSBlLm9wdGlvbnMub25BZGQodC5pdGVtLmRhdGEsZnVuY3Rpb24oaSl7ZS5fcmVtb3ZlSXRlbSh0Lml0ZW0pLGkmJmUuaXRlbXNEYXRhLmdldERhdGFTZXQoKS5hZGQoaSksZS5zdGFja0RpcnR5PSEwLGUuYm9keS5lbWl0dGVyLmVtaXQoIl9jaGFuZ2UiKX0pfS5iaW5kKHRoaXMpKX19LG8ucHJvdG90eXBlLl9vbkdyb3VwRHJhZ1N0YXJ0PWZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucy5ncm91cEVkaXRhYmxlLm9yZGVyJiYodGhpcy5ncm91cFRvdWNoUGFyYW1zLmdyb3VwPXRoaXMuZ3JvdXBGcm9tVGFyZ2V0KHQpLHRoaXMuZ3JvdXBUb3VjaFBhcmFtcy5ncm91cCYmKHQuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5ncm91cFRvdWNoUGFyYW1zLm9yaWdpbmFsT3JkZXI9dGhpcy5ncm91cHNEYXRhLmdldElkcyh7b3JkZXI6dGhpcy5vcHRpb25zLmdyb3VwT3JkZXJ9KSkpfSxvLnByb3RvdHlwZS5fb25Hcm91cERyYWc9ZnVuY3Rpb24odCl7aWYodGhpcy5vcHRpb25zLmdyb3VwRWRpdGFibGUub3JkZXImJnRoaXMuZ3JvdXBUb3VjaFBhcmFtcy5ncm91cCl7dC5zdG9wUHJvcGFnYXRpb24oKTt2YXIgZT10aGlzLmdyb3VwRnJvbVRhcmdldCh0KTtpZihlJiZlLmhlaWdodCE9dGhpcy5ncm91cFRvdWNoUGFyYW1zLmdyb3VwLmhlaWdodCl7dmFyIGk9ZS50b3A8dGhpcy5ncm91cFRvdWNoUGFyYW1zLmdyb3VwLnRvcCxvPXQuY2VudGVyP3QuY2VudGVyLnk6dC5jbGllbnRZLG49ci5nZXRBYnNvbHV0ZVRvcChlLmRvbS5mb3JlZ3JvdW5kKSxzPXRoaXMuZ3JvdXBUb3VjaFBhcmFtcy5ncm91cC5oZWlnaHQ7aWYoaSl7aWYobitzPG8pcmV0dXJufWVsc2V7dmFyIGE9ZS5oZWlnaHQ7aWYobithLXM+bylyZXR1cm59fWlmKGUmJmUhPXRoaXMuZ3JvdXBUb3VjaFBhcmFtcy5ncm91cCl7dmFyIGg9dGhpcy5ncm91cHNEYXRhLGQ9aC5nZXQoZS5ncm91cElkKSxsPWguZ2V0KHRoaXMuZ3JvdXBUb3VjaFBhcmFtcy5ncm91cC5ncm91cElkKTtsJiZkJiYodGhpcy5vcHRpb25zLmdyb3VwT3JkZXJTd2FwKGwsZCx0aGlzLmdyb3Vwc0RhdGEpLHRoaXMuZ3JvdXBzRGF0YS51cGRhdGUobCksdGhpcy5ncm91cHNEYXRhLnVwZGF0ZShkKSk7dmFyIGM9dGhpcy5ncm91cHNEYXRhLmdldElkcyh7b3JkZXI6dGhpcy5vcHRpb25zLmdyb3VwT3JkZXJ9KTtpZighci5lcXVhbEFycmF5KGMsdGhpcy5ncm91cFRvdWNoUGFyYW1zLm9yaWdpbmFsT3JkZXIpKWZvcih2YXIgaD10aGlzLmdyb3Vwc0RhdGEsdT10aGlzLmdyb3VwVG91Y2hQYXJhbXMub3JpZ2luYWxPcmRlcixwPXRoaXMuZ3JvdXBUb3VjaFBhcmFtcy5ncm91cC5ncm91cElkLGY9TWF0aC5taW4odS5sZW5ndGgsYy5sZW5ndGgpLG09MCx2PTAsZz0wO208Zjspe2Zvcig7bSt2PGYmJm0rZzxmJiZjW20rdl09PXVbbStnXTspbSsrO2lmKG0rdj49ZilicmVhaztpZihjW20rdl0hPXApaWYodVttK2ddIT1wKXt2YXIgeT1jLmluZGV4T2YodVttK2ddKSxiPWguZ2V0KGNbbSt2XSksXz1oLmdldCh1W20rZ10pO3RoaXMub3B0aW9ucy5ncm91cE9yZGVyU3dhcChiLF8saCksaC51cGRhdGUoYiksaC51cGRhdGUoXyk7dmFyIHc9Y1ttK3ZdO2NbbSt2XT11W20rZ10sY1t5XT13LG0rK31lbHNlIGc9MTtlbHNlIHY9MX19fX0sby5wcm90b3R5cGUuX29uR3JvdXBEcmFnRW5kPWZ1bmN0aW9uKHQpe2lmKHRoaXMub3B0aW9ucy5ncm91cEVkaXRhYmxlLm9yZGVyJiZ0aGlzLmdyb3VwVG91Y2hQYXJhbXMuZ3JvdXApe3Quc3RvcFByb3BhZ2F0aW9uKCk7dmFyIGU9dGhpcyxpPWUuZ3JvdXBUb3VjaFBhcmFtcy5ncm91cC5ncm91cElkLG89ZS5ncm91cHNEYXRhLmdldERhdGFTZXQoKSxuPXIuZXh0ZW5kKHt9LG8uZ2V0KGkpKTtlLm9wdGlvbnMub25Nb3ZlR3JvdXAobixmdW5jdGlvbih0KXtpZih0KXRbby5fZmllbGRJZF09aSxvLnVwZGF0ZSh0KTtlbHNle3ZhciBuPW8uZ2V0SWRzKHtvcmRlcjplLm9wdGlvbnMuZ3JvdXBPcmRlcn0pO2lmKCFyLmVxdWFsQXJyYXkobixlLmdyb3VwVG91Y2hQYXJhbXMub3JpZ2luYWxPcmRlcikpZm9yKHZhciBzPWUuZ3JvdXBUb3VjaFBhcmFtcy5vcmlnaW5hbE9yZGVyLGE9TWF0aC5taW4ocy5sZW5ndGgsbi5sZW5ndGgpLGg9MDtoPGE7KXtmb3IoO2g8YSYmbltoXT09c1toXTspaCsrO2lmKGg+PWEpYnJlYWs7dmFyIGQ9bi5pbmRleE9mKHNbaF0pLGw9by5nZXQobltoXSksYz1vLmdldChzW2hdKTtlLm9wdGlvbnMuZ3JvdXBPcmRlclN3YXAobCxjLG8pLGdyb3Vwc0RhdGEudXBkYXRlKGwpLGdyb3Vwc0RhdGEudXBkYXRlKGMpO3ZhciB1PW5baF07bltoXT1zW2hdLG5bZF09dSxoKyt9fX0pLGUuYm9keS5lbWl0dGVyLmVtaXQoImdyb3VwRHJhZ2dlZCIse2dyb3VwSWQ6aX0pfX0sby5wcm90b3R5cGUuX29uU2VsZWN0SXRlbT1mdW5jdGlvbih0KXtpZih0aGlzLm9wdGlvbnMuc2VsZWN0YWJsZSl7dmFyIGU9dC5zcmNFdmVudCYmKHQuc3JjRXZlbnQuY3RybEtleXx8dC5zcmNFdmVudC5tZXRhS2V5KSxpPXQuc3JjRXZlbnQmJnQuc3JjRXZlbnQuc2hpZnRLZXk7aWYoZXx8aSlyZXR1cm4gdm9pZCB0aGlzLl9vbk11bHRpU2VsZWN0SXRlbSh0KTt2YXIgbz10aGlzLmdldFNlbGVjdGlvbigpLG49dGhpcy5pdGVtRnJvbVRhcmdldCh0KSxzPW4/W24uaWRdOltdO3RoaXMuc2V0U2VsZWN0aW9uKHMpO3ZhciByPXRoaXMuZ2V0U2VsZWN0aW9uKCk7KHIubGVuZ3RoPjB8fG8ubGVuZ3RoPjApJiZ0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJzZWxlY3QiLHtpdGVtczpyLGV2ZW50OnR9KX19LG8ucHJvdG90eXBlLl9vbk1vdXNlT3Zlcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLml0ZW1Gcm9tVGFyZ2V0KHQpO2UmJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIml0ZW1vdmVyIix7aXRlbTplLmlkLGV2ZW50OnR9KX0sby5wcm90b3R5cGUuX29uTW91c2VPdXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5pdGVtRnJvbVRhcmdldCh0KTtlJiZ0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJpdGVtb3V0Iix7aXRlbTplLmlkLGV2ZW50OnR9KX0sby5wcm90b3R5cGUuX29uQWRkSXRlbT1mdW5jdGlvbih0KXtpZih0aGlzLm9wdGlvbnMuc2VsZWN0YWJsZSYmdGhpcy5vcHRpb25zLmVkaXRhYmxlLmFkZCl7dmFyIGU9dGhpcyxpPXRoaXMub3B0aW9ucy5zbmFwfHxudWxsLG89dGhpcy5pdGVtRnJvbVRhcmdldCh0KTtpZihvKXt2YXIgbj1lLml0ZW1zRGF0YS5nZXQoby5pZCk7dGhpcy5vcHRpb25zLm9uVXBkYXRlKG4sZnVuY3Rpb24odCl7dCYmZS5pdGVtc0RhdGEuZ2V0RGF0YVNldCgpLnVwZGF0ZSh0KX0pfWVsc2V7aWYodGhpcy5vcHRpb25zLnJ0bCl2YXIgcz1yLmdldEFic29sdXRlUmlnaHQodGhpcy5kb20uZnJhbWUpLGE9cy10LmNlbnRlci54O2Vsc2UgdmFyIHM9ci5nZXRBYnNvbHV0ZUxlZnQodGhpcy5kb20uZnJhbWUpLGE9dC5jZW50ZXIueC1zO3ZhciBoPXRoaXMuYm9keS51dGlsLnRvVGltZShhKSxkPXRoaXMuYm9keS51dGlsLmdldFNjYWxlKCksbD10aGlzLmJvZHkudXRpbC5nZXRTdGVwKCksYz17c3RhcnQ6aT9pKGgsZCxsKTpoLGNvbnRlbnQ6Im5ldyBpdGVtIn07aWYoImRyb3AiPT10LnR5cGUpe3ZhciBuPUpTT04ucGFyc2UodC5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgidGV4dC9wbGFpbiIpKTtpZihjLmNvbnRlbnQ9bi5jb250ZW50LGMudHlwZT1uLnR5cGV8fCJib3giLGNbdGhpcy5pdGVtc0RhdGEuX2ZpZWxkSWRdPW4uaWR8fHIucmFuZG9tVVVJRCgpLCJyYW5nZSI9PW4udHlwZXx8bi5lbmQmJm4uc3RhcnQpaWYobi5lbmQpYy5lbmQ9bmV3IERhdGUoYy5zdGFydC5faSkuZ2V0VGltZSgpK25ldyBEYXRlKG4uZW5kKS5nZXRUaW1lKCktbmV3IERhdGUobi5zdGFydCkuZ2V0VGltZSgpO2Vsc2V7dmFyIHU9dGhpcy5ib2R5LnV0aWwudG9UaW1lKGErdGhpcy5wcm9wcy53aWR0aC81KTtjLmVuZD1pP2kodSxkLGwpOnV9fWVsc2UgaWYoY1t0aGlzLml0ZW1zRGF0YS5fZmllbGRJZF09ci5yYW5kb21VVUlEKCksInJhbmdlIj09PXRoaXMub3B0aW9ucy50eXBlKXt2YXIgdT10aGlzLmJvZHkudXRpbC50b1RpbWUoYSt0aGlzLnByb3BzLndpZHRoLzUpO2MuZW5kPWk/aSh1LGQsbCk6dX12YXIgcD10aGlzLmdyb3VwRnJvbVRhcmdldCh0KTtwJiYoYy5ncm91cD1wLmdyb3VwSWQpLGM9dGhpcy5fY2xvbmVJdGVtRGF0YShjKSx0aGlzLm9wdGlvbnMub25BZGQoYyxmdW5jdGlvbihpKXtpJiYoZS5pdGVtc0RhdGEuZ2V0RGF0YVNldCgpLmFkZChpKSwiZHJvcCI9PXQudHlwZSYmZS5zZXRTZWxlY3Rpb24oW2kuaWRdKSl9KX19fSxvLnByb3RvdHlwZS5fb25NdWx0aVNlbGVjdEl0ZW09ZnVuY3Rpb24odCl7aWYodGhpcy5vcHRpb25zLnNlbGVjdGFibGUpe3ZhciBlPXRoaXMuaXRlbUZyb21UYXJnZXQodCk7aWYoZSl7dmFyIGk9dGhpcy5vcHRpb25zLm11bHRpc2VsZWN0P3RoaXMuZ2V0U2VsZWN0aW9uKCk6W10sbj10LnNyY0V2ZW50JiZ0LnNyY0V2ZW50LnNoaWZ0S2V5fHwhMTtpZihuJiZ0aGlzLm9wdGlvbnMubXVsdGlzZWxlY3Qpe3ZhciBzPXRoaXMuaXRlbXNEYXRhLmdldChlLmlkKS5ncm91cCxyPXZvaWQgMDt0aGlzLm9wdGlvbnMubXVsdGlzZWxlY3RQZXJHcm91cCYmaS5sZW5ndGg+MCYmKHI9dGhpcy5pdGVtc0RhdGEuZ2V0KGlbMF0pLmdyb3VwKSx0aGlzLm9wdGlvbnMubXVsdGlzZWxlY3RQZXJHcm91cCYmdm9pZCAwIT1yJiZyIT1zfHxpLnB1c2goZS5pZCk7dmFyIGE9by5fZ2V0SXRlbVJhbmdlKHRoaXMuaXRlbXNEYXRhLmdldChpLHRoaXMuaXRlbU9wdGlvbnMpKTtpZighdGhpcy5vcHRpb25zLm11bHRpc2VsZWN0UGVyR3JvdXB8fHI9PXMpe2k9W107Zm9yKHZhciBoIGluIHRoaXMuaXRlbXMpaWYodGhpcy5pdGVtcy5oYXNPd25Qcm9wZXJ0eShoKSl7dmFyIGQ9dGhpcy5pdGVtc1toXSxsPWQuZGF0YS5zdGFydCxjPXZvaWQgMCE9PWQuZGF0YS5lbmQ/ZC5kYXRhLmVuZDpsOyEobD49YS5taW4mJmM8PWEubWF4KXx8dGhpcy5vcHRpb25zLm11bHRpc2VsZWN0UGVyR3JvdXAmJnIhPXRoaXMuaXRlbXNEYXRhLmdldChkLmlkKS5ncm91cHx8ZCBpbnN0YW5jZW9mIHZ8fGkucHVzaChkLmlkKX19fWVsc2V7dmFyIHU9aS5pbmRleE9mKGUuaWQpO3U9PS0xP2kucHVzaChlLmlkKTppLnNwbGljZSh1LDEpfXRoaXMuc2V0U2VsZWN0aW9uKGkpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoInNlbGVjdCIse2l0ZW1zOnRoaXMuZ2V0U2VsZWN0aW9uKCksZXZlbnQ6dH0pfX19LG8uX2dldEl0ZW1SYW5nZT1mdW5jdGlvbih0KXt2YXIgZT1udWxsLGk9bnVsbDtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpeyhudWxsPT1pfHx0LnN0YXJ0PGkpJiYoaT10LnN0YXJ0KSx2b2lkIDAhPXQuZW5kPyhudWxsPT1lfHx0LmVuZD5lKSYmKGU9dC5lbmQpOihudWxsPT1lfHx0LnN0YXJ0PmUpJiYoZT10LnN0YXJ0KX0pLHttaW46aSxtYXg6ZX19LG8ucHJvdG90eXBlLml0ZW1Gcm9tVGFyZ2V0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LnRhcmdldDtlOyl7aWYoZS5oYXNPd25Qcm9wZXJ0eSgidGltZWxpbmUtaXRlbSIpKXJldHVybiBlWyJ0aW1lbGluZS1pdGVtIl07ZT1lLnBhcmVudE5vZGV9cmV0dXJuIG51bGx9LG8ucHJvdG90eXBlLmdyb3VwRnJvbVRhcmdldD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5jZW50ZXI/dC5jZW50ZXIueTp0LmNsaWVudFksaT0wO2k8dGhpcy5ncm91cElkcy5sZW5ndGg7aSsrKXt2YXIgbz10aGlzLmdyb3VwSWRzW2ldLG49dGhpcy5ncm91cHNbb10scz1uLmRvbS5mb3JlZ3JvdW5kLGE9ci5nZXRBYnNvbHV0ZVRvcChzKTtpZihlPmEmJmU8YStzLm9mZnNldEhlaWdodClyZXR1cm4gbjtpZigidG9wIj09PXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5pdGVtKXtpZihpPT09dGhpcy5ncm91cElkcy5sZW5ndGgtMSYmZT5hKXJldHVybiBufWVsc2UgaWYoMD09PWkmJmU8YStzLm9mZnNldClyZXR1cm4gbn1yZXR1cm4gbnVsbH0sby5pdGVtU2V0RnJvbVRhcmdldD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC50YXJnZXQ7ZTspe2lmKGUuaGFzT3duUHJvcGVydHkoInRpbWVsaW5lLWl0ZW1zZXQiKSlyZXR1cm4gZVsidGltZWxpbmUtaXRlbXNldCJdO2U9ZS5wYXJlbnROb2RlfXJldHVybiBudWxsfSxvLnByb3RvdHlwZS5fY2xvbmVJdGVtRGF0YT1mdW5jdGlvbih0LGUpe3ZhciBpPXIuZXh0ZW5kKHt9LHQpO3JldHVybiBlfHwoZT10aGlzLml0ZW1zRGF0YS5nZXREYXRhU2V0KCkuX29wdGlvbnMudHlwZSksdm9pZCAwIT1pLnN0YXJ0JiYoaS5zdGFydD1yLmNvbnZlcnQoaS5zdGFydCxlJiZlLnN0YXJ0fHwiRGF0ZSIpKSx2b2lkIDAhPWkuZW5kJiYoaS5lbmQ9ci5jb252ZXJ0KGkuZW5kLGUmJmUuZW5kfHwiRGF0ZSIpKSxpfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGkscyl7dGhpcy5tb21lbnQ9bix0aGlzLmN1cnJlbnQ9dGhpcy5tb21lbnQoKSx0aGlzLl9zdGFydD10aGlzLm1vbWVudCgpLHRoaXMuX2VuZD10aGlzLm1vbWVudCgpLHRoaXMuYXV0b1NjYWxlPSEwLHRoaXMuc2NhbGU9ImRheSIsdGhpcy5zdGVwPTEsdGhpcy5zZXRSYW5nZSh0LGUsaSksdGhpcy5zd2l0Y2hlZERheT0hMSx0aGlzLnN3aXRjaGVkTW9udGg9ITEsdGhpcy5zd2l0Y2hlZFllYXI9ITEsQXJyYXkuaXNBcnJheShzKT90aGlzLmhpZGRlbkRhdGVzPXM6dm9pZCAwIT1zP3RoaXMuaGlkZGVuRGF0ZXM9W3NdOnRoaXMuaGlkZGVuRGF0ZXM9W10sdGhpcy5mb3JtYXQ9by5GT1JNQVR9dmFyIG49aSgyKSxzPWkoMzQpLHI9aSgxKTtvLkZPUk1BVD17bWlub3JMYWJlbHM6e21pbGxpc2Vjb25kOiJTU1MiLHNlY29uZDoicyIsbWludXRlOiJISDptbSIsaG91cjoiSEg6bW0iLHdlZWtkYXk6ImRkZCBEIixkYXk6IkQiLG1vbnRoOiJNTU0iLHllYXI6IllZWVkifSxtYWpvckxhYmVsczp7bWlsbGlzZWNvbmQ6IkhIOm1tOnNzIixzZWNvbmQ6IkQgTU1NTSBISDptbSIsbWludXRlOiJkZGQgRCBNTU1NIixob3VyOiJkZGQgRCBNTU1NIix3ZWVrZGF5OiJNTU1NIFlZWVkiLGRheToiTU1NTSBZWVlZIixtb250aDoiWVlZWSIseWVhcjoiIn19LG8ucHJvdG90eXBlLnNldE1vbWVudD1mdW5jdGlvbih0KXt0aGlzLm1vbWVudD10LHRoaXMuY3VycmVudD10aGlzLm1vbWVudCh0aGlzLmN1cnJlbnQudmFsdWVPZigpKSx0aGlzLl9zdGFydD10aGlzLm1vbWVudCh0aGlzLl9zdGFydC52YWx1ZU9mKCkpLHRoaXMuX2VuZD10aGlzLm1vbWVudCh0aGlzLl9lbmQudmFsdWVPZigpKX0sby5wcm90b3R5cGUuc2V0Rm9ybWF0PWZ1bmN0aW9uKHQpe3ZhciBlPXIuZGVlcEV4dGVuZCh7fSxvLkZPUk1BVCk7dGhpcy5mb3JtYXQ9ci5kZWVwRXh0ZW5kKGUsdCl9LG8ucHJvdG90eXBlLnNldFJhbmdlPWZ1bmN0aW9uKHQsZSxpKXtpZighKHQgaW5zdGFuY2VvZiBEYXRlJiZlIGluc3RhbmNlb2YgRGF0ZSkpdGhyb3ciTm8gbGVnYWwgc3RhcnQgb3IgZW5kIGRhdGUgaW4gbWV0aG9kIHNldFJhbmdlIjt0aGlzLl9zdGFydD12b2lkIDAhPXQ/dGhpcy5tb21lbnQodC52YWx1ZU9mKCkpOm5ldyBEYXRlLHRoaXMuX2VuZD12b2lkIDAhPWU/dGhpcy5tb21lbnQoZS52YWx1ZU9mKCkpOm5ldyBEYXRlLHRoaXMuYXV0b1NjYWxlJiZ0aGlzLnNldE1pbmltdW1TdGVwKGkpfSxvLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbigpe3RoaXMuY3VycmVudD10aGlzLl9zdGFydC5jbG9uZSgpLHRoaXMucm91bmRUb01pbm9yKCl9LG8ucHJvdG90eXBlLnJvdW5kVG9NaW5vcj1mdW5jdGlvbigpe3N3aXRjaCh0aGlzLnNjYWxlKXtjYXNlInllYXIiOnRoaXMuY3VycmVudC55ZWFyKHRoaXMuc3RlcCpNYXRoLmZsb29yKHRoaXMuY3VycmVudC55ZWFyKCkvdGhpcy5zdGVwKSksdGhpcy5jdXJyZW50Lm1vbnRoKDApO2Nhc2UibW9udGgiOnRoaXMuY3VycmVudC5kYXRlKDEpO2Nhc2UiZGF5IjpjYXNlIndlZWtkYXkiOnRoaXMuY3VycmVudC5ob3VycygwKTtjYXNlImhvdXIiOnRoaXMuY3VycmVudC5taW51dGVzKDApO2Nhc2UibWludXRlIjp0aGlzLmN1cnJlbnQuc2Vjb25kcygwKTtjYXNlInNlY29uZCI6dGhpcy5jdXJyZW50Lm1pbGxpc2Vjb25kcygwKX1pZigxIT10aGlzLnN0ZXApc3dpdGNoKHRoaXMuc2NhbGUpe2Nhc2UibWlsbGlzZWNvbmQiOnRoaXMuY3VycmVudC5zdWJ0cmFjdCh0aGlzLmN1cnJlbnQubWlsbGlzZWNvbmRzKCkldGhpcy5zdGVwLCJtaWxsaXNlY29uZHMiKTticmVhaztjYXNlInNlY29uZCI6dGhpcy5jdXJyZW50LnN1YnRyYWN0KHRoaXMuY3VycmVudC5zZWNvbmRzKCkldGhpcy5zdGVwLCJzZWNvbmRzIik7YnJlYWs7Y2FzZSJtaW51dGUiOnRoaXMuY3VycmVudC5zdWJ0cmFjdCh0aGlzLmN1cnJlbnQubWludXRlcygpJXRoaXMuc3RlcCwibWludXRlcyIpO2JyZWFrO2Nhc2UiaG91ciI6dGhpcy5jdXJyZW50LnN1YnRyYWN0KHRoaXMuY3VycmVudC5ob3VycygpJXRoaXMuc3RlcCwiaG91cnMiKTticmVhaztjYXNlIndlZWtkYXkiOmNhc2UiZGF5Ijp0aGlzLmN1cnJlbnQuc3VidHJhY3QoKHRoaXMuY3VycmVudC5kYXRlKCktMSkldGhpcy5zdGVwLCJkYXkiKTticmVhaztjYXNlIm1vbnRoIjp0aGlzLmN1cnJlbnQuc3VidHJhY3QodGhpcy5jdXJyZW50Lm1vbnRoKCkldGhpcy5zdGVwLCJtb250aCIpO2JyZWFrO2Nhc2UieWVhciI6dGhpcy5jdXJyZW50LnN1YnRyYWN0KHRoaXMuY3VycmVudC55ZWFyKCkldGhpcy5zdGVwLCJ5ZWFyIil9fSxvLnByb3RvdHlwZS5oYXNOZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3VycmVudC52YWx1ZU9mKCk8PXRoaXMuX2VuZC52YWx1ZU9mKCl9LG8ucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmN1cnJlbnQudmFsdWVPZigpO2lmKHRoaXMuY3VycmVudC5tb250aCgpPDYpc3dpdGNoKHRoaXMuc2NhbGUpe2Nhc2UibWlsbGlzZWNvbmQiOnRoaXMuY3VycmVudC5hZGQodGhpcy5zdGVwLCJtaWxsaXNlY29uZCIpO2JyZWFrO2Nhc2Uic2Vjb25kIjp0aGlzLmN1cnJlbnQuYWRkKHRoaXMuc3RlcCwic2Vjb25kIik7YnJlYWs7Y2FzZSJtaW51dGUiOnRoaXMuY3VycmVudC5hZGQodGhpcy5zdGVwLCJtaW51dGUiKTticmVhaztjYXNlImhvdXIiOnRoaXMuY3VycmVudC5hZGQodGhpcy5zdGVwLCJob3VyIiksdGhpcy5jdXJyZW50LnN1YnRyYWN0KHRoaXMuY3VycmVudC5ob3VycygpJXRoaXMuc3RlcCwiaG91ciIpO2JyZWFrO2Nhc2Uid2Vla2RheSI6Y2FzZSJkYXkiOnRoaXMuY3VycmVudC5hZGQodGhpcy5zdGVwLCJkYXkiKTticmVhaztjYXNlIm1vbnRoIjp0aGlzLmN1cnJlbnQuYWRkKHRoaXMuc3RlcCwibW9udGgiKTticmVhaztjYXNlInllYXIiOnRoaXMuY3VycmVudC5hZGQodGhpcy5zdGVwLCJ5ZWFyIil9ZWxzZSBzd2l0Y2godGhpcy5zY2FsZSl7Y2FzZSJtaWxsaXNlY29uZCI6dGhpcy5jdXJyZW50LmFkZCh0aGlzLnN0ZXAsIm1pbGxpc2Vjb25kIik7YnJlYWs7Y2FzZSJzZWNvbmQiOnRoaXMuY3VycmVudC5hZGQodGhpcy5zdGVwLCJzZWNvbmQiKTticmVhaztjYXNlIm1pbnV0ZSI6dGhpcy5jdXJyZW50LmFkZCh0aGlzLnN0ZXAsIm1pbnV0ZSIpO2JyZWFrO2Nhc2UiaG91ciI6dGhpcy5jdXJyZW50LmFkZCh0aGlzLnN0ZXAsImhvdXIiKTticmVhaztjYXNlIndlZWtkYXkiOmNhc2UiZGF5Ijp0aGlzLmN1cnJlbnQuYWRkKHRoaXMuc3RlcCwiZGF5Iik7YnJlYWs7Y2FzZSJtb250aCI6dGhpcy5jdXJyZW50LmFkZCh0aGlzLnN0ZXAsIm1vbnRoIik7YnJlYWs7Y2FzZSJ5ZWFyIjp0aGlzLmN1cnJlbnQuYWRkKHRoaXMuc3RlcCwieWVhciIpfWlmKDEhPXRoaXMuc3RlcClzd2l0Y2godGhpcy5zY2FsZSl7Y2FzZSJtaWxsaXNlY29uZCI6dGhpcy5jdXJyZW50Lm1pbGxpc2Vjb25kcygpPHRoaXMuc3RlcCYmdGhpcy5jdXJyZW50Lm1pbGxpc2Vjb25kcygwKTticmVhaztjYXNlInNlY29uZCI6dGhpcy5jdXJyZW50LnNlY29uZHMoKTx0aGlzLnN0ZXAmJnRoaXMuY3VycmVudC5zZWNvbmRzKDApO2JyZWFrO2Nhc2UibWludXRlIjp0aGlzLmN1cnJlbnQubWludXRlcygpPHRoaXMuc3RlcCYmdGhpcy5jdXJyZW50Lm1pbnV0ZXMoMCk7YnJlYWs7Y2FzZSJob3VyIjp0aGlzLmN1cnJlbnQuaG91cnMoKTx0aGlzLnN0ZXAmJnRoaXMuY3VycmVudC5ob3VycygwKTticmVhaztjYXNlIndlZWtkYXkiOmNhc2UiZGF5Ijp0aGlzLmN1cnJlbnQuZGF0ZSgpPHRoaXMuc3RlcCsxJiZ0aGlzLmN1cnJlbnQuZGF0ZSgxKTticmVhaztjYXNlIm1vbnRoIjp0aGlzLmN1cnJlbnQubW9udGgoKTx0aGlzLnN0ZXAmJnRoaXMuY3VycmVudC5tb250aCgwKTticmVhaztjYXNlInllYXIiOn10aGlzLmN1cnJlbnQudmFsdWVPZigpPT10JiYodGhpcy5jdXJyZW50PXRoaXMuX2VuZC5jbG9uZSgpKSx0aGlzLnN3aXRjaGVkRGF5PSExLHRoaXMuc3dpdGNoZWRNb250aD0hMSx0aGlzLnN3aXRjaGVkWWVhcj0hMSxzLnN0ZXBPdmVySGlkZGVuRGF0ZXModGhpcy5tb21lbnQsdGhpcyx0KX0sby5wcm90b3R5cGUuZ2V0Q3VycmVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmN1cnJlbnR9LG8ucHJvdG90eXBlLnNldFNjYWxlPWZ1bmN0aW9uKHQpe3QmJiJzdHJpbmciPT10eXBlb2YgdC5zY2FsZSYmKHRoaXMuc2NhbGU9dC5zY2FsZSx0aGlzLnN0ZXA9dC5zdGVwPjA/dC5zdGVwOjEsdGhpcy5hdXRvU2NhbGU9ITEpfSxvLnByb3RvdHlwZS5zZXRBdXRvU2NhbGU9ZnVuY3Rpb24odCl7dGhpcy5hdXRvU2NhbGU9dH0sby5wcm90b3R5cGUuc2V0TWluaW11bVN0ZXA9ZnVuY3Rpb24odCl7aWYodm9pZCAwIT10KXt2YXIgZT0zMTEwNGU2LGk9MjU5MmU2LG89ODY0ZTUsbj0zNmU1LHM9NmU0LHI9MWUzLGE9MTsxZTMqZT50JiYodGhpcy5zY2FsZT0ieWVhciIsdGhpcy5zdGVwPTFlMyksNTAwKmU+dCYmKHRoaXMuc2NhbGU9InllYXIiLHRoaXMuc3RlcD01MDApLDEwMCplPnQmJih0aGlzLnNjYWxlPSJ5ZWFyIix0aGlzLnN0ZXA9MTAwKSw1MCplPnQmJih0aGlzLnNjYWxlPSJ5ZWFyIix0aGlzLnN0ZXA9NTApLDEwKmU+dCYmKHRoaXMuc2NhbGU9InllYXIiLHRoaXMuc3RlcD0xMCksNSplPnQmJih0aGlzLnNjYWxlPSJ5ZWFyIix0aGlzLnN0ZXA9NSksZT50JiYodGhpcy5zY2FsZT0ieWVhciIsdGhpcy5zdGVwPTEpLDMqaT50JiYodGhpcy5zY2FsZT0ibW9udGgiLHRoaXMuc3RlcD0zKSxpPnQmJih0aGlzLnNjYWxlPSJtb250aCIsdGhpcy5zdGVwPTEpLDUqbz50JiYodGhpcy5zY2FsZT0iZGF5Iix0aGlzLnN0ZXA9NSksMipvPnQmJih0aGlzLnNjYWxlPSJkYXkiLHRoaXMuc3RlcD0yKSxvPnQmJih0aGlzLnNjYWxlPSJkYXkiLHRoaXMuc3RlcD0xKSxvLzI+dCYmKHRoaXMuc2NhbGU9IndlZWtkYXkiLHRoaXMuc3RlcD0xKSw0Km4+dCYmKHRoaXMuc2NhbGU9ImhvdXIiLHRoaXMuc3RlcD00KSxuPnQmJih0aGlzLnNjYWxlPSJob3VyIix0aGlzLnN0ZXA9MSksMTUqcz50JiYodGhpcy5zY2FsZT0ibWludXRlIix0aGlzLnN0ZXA9MTUpLDEwKnM+dCYmKHRoaXMuc2NhbGU9Im1pbnV0ZSIsdGhpcy5zdGVwPTEwKSw1KnM+dCYmKHRoaXMuc2NhbGU9Im1pbnV0ZSIsdGhpcy5zdGVwPTUpLHM+dCYmKHRoaXMuc2NhbGU9Im1pbnV0ZSIsdGhpcy5zdGVwPTEpLDE1KnI+dCYmKHRoaXMuc2NhbGU9InNlY29uZCIsdGhpcy5zdGVwPTE1KSwxMCpyPnQmJih0aGlzLnNjYWxlPSJzZWNvbmQiLHRoaXMuc3RlcD0xMCksNSpyPnQmJih0aGlzLnNjYWxlPSJzZWNvbmQiLHRoaXMuc3RlcD01KSxyPnQmJih0aGlzLnNjYWxlPSJzZWNvbmQiLHRoaXMuc3RlcD0xKSwyMDAqYT50JiYodGhpcy5zY2FsZT0ibWlsbGlzZWNvbmQiLHRoaXMuc3RlcD0yMDApLDEwMCphPnQmJih0aGlzLnNjYWxlPSJtaWxsaXNlY29uZCIsdGhpcy5zdGVwPTEwMCksNTAqYT50JiYodGhpcy5zY2FsZT0ibWlsbGlzZWNvbmQiLHRoaXMuc3RlcD01MCksMTAqYT50JiYodGhpcy5zY2FsZT0ibWlsbGlzZWNvbmQiLHRoaXMuc3RlcD0xMCksNSphPnQmJih0aGlzLnNjYWxlPSJtaWxsaXNlY29uZCIsdGhpcy5zdGVwPTUpLGE+dCYmKHRoaXMuc2NhbGU9Im1pbGxpc2Vjb25kIix0aGlzLnN0ZXA9MSl9fSxvLnNuYXA9ZnVuY3Rpb24odCxlLGkpe3ZhciBvPW4odCk7aWYoInllYXIiPT1lKXt2YXIgcz1vLnllYXIoKStNYXRoLnJvdW5kKG8ubW9udGgoKS8xMik7by55ZWFyKE1hdGgucm91bmQocy9pKSppKSxvLm1vbnRoKDApLG8uZGF0ZSgwKSxvLmhvdXJzKDApLG8ubWludXRlcygwKSxvLnNlY29uZHMoMCksby5taWxsaXNlY29uZHMoMCl9ZWxzZSBpZigibW9udGgiPT1lKW8uZGF0ZSgpPjE1PyhvLmRhdGUoMSksby5hZGQoMSwibW9udGgiKSk6by5kYXRlKDEpLG8uaG91cnMoMCksby5taW51dGVzKDApLG8uc2Vjb25kcygwKSxvLm1pbGxpc2Vjb25kcygwKTtlbHNlIGlmKCJkYXkiPT1lKXtzd2l0Y2goaSl7Y2FzZSA1OmNhc2UgMjpvLmhvdXJzKDI0Kk1hdGgucm91bmQoby5ob3VycygpLzI0KSk7YnJlYWs7ZGVmYXVsdDpvLmhvdXJzKDEyKk1hdGgucm91bmQoby5ob3VycygpLzEyKSl9by5taW51dGVzKDApLG8uc2Vjb25kcygwKSxvLm1pbGxpc2Vjb25kcygwKX1lbHNlIGlmKCJ3ZWVrZGF5Ij09ZSl7c3dpdGNoKGkpe2Nhc2UgNTpjYXNlIDI6by5ob3VycygxMipNYXRoLnJvdW5kKG8uaG91cnMoKS8xMikpO2JyZWFrO2RlZmF1bHQ6by5ob3Vycyg2Kk1hdGgucm91bmQoby5ob3VycygpLzYpKX1vLm1pbnV0ZXMoMCksby5zZWNvbmRzKDApLG8ubWlsbGlzZWNvbmRzKDApfWVsc2UgaWYoImhvdXIiPT1lKXtzd2l0Y2goaSl7Y2FzZSA0Om8ubWludXRlcyg2MCpNYXRoLnJvdW5kKG8ubWludXRlcygpLzYwKSk7YnJlYWs7ZGVmYXVsdDpvLm1pbnV0ZXMoMzAqTWF0aC5yb3VuZChvLm1pbnV0ZXMoKS8zMCkpfW8uc2Vjb25kcygwKSxvLm1pbGxpc2Vjb25kcygwKX1lbHNlIGlmKCJtaW51dGUiPT1lKXtzd2l0Y2goaSl7Y2FzZSAxNTpjYXNlIDEwOm8ubWludXRlcyg1Kk1hdGgucm91bmQoby5taW51dGVzKCkvNSkpLG8uc2Vjb25kcygwKTticmVhaztjYXNlIDU6by5zZWNvbmRzKDYwKk1hdGgucm91bmQoby5zZWNvbmRzKCkvNjApKTticmVhaztkZWZhdWx0Om8uc2Vjb25kcygzMCpNYXRoLnJvdW5kKG8uc2Vjb25kcygpLzMwKSl9by5taWxsaXNlY29uZHMoMCl9ZWxzZSBpZigic2Vjb25kIj09ZSlzd2l0Y2goaSl7Y2FzZSAxNTpjYXNlIDEwOm8uc2Vjb25kcyg1Kk1hdGgucm91bmQoby5zZWNvbmRzKCkvNSkpLG8ubWlsbGlzZWNvbmRzKDApO2JyZWFrO2Nhc2UgNTpvLm1pbGxpc2Vjb25kcygxZTMqTWF0aC5yb3VuZChvLm1pbGxpc2Vjb25kcygpLzFlMykpO2JyZWFrO2RlZmF1bHQ6by5taWxsaXNlY29uZHMoNTAwKk1hdGgucm91bmQoby5taWxsaXNlY29uZHMoKS81MDApKX1lbHNlIGlmKCJtaWxsaXNlY29uZCI9PWUpe3ZhciByPWk+NT9pLzI6MTtvLm1pbGxpc2Vjb25kcyhNYXRoLnJvdW5kKG8ubWlsbGlzZWNvbmRzKCkvcikqcil9cmV0dXJuIG99LG8ucHJvdG90eXBlLmlzTWFqb3I9ZnVuY3Rpb24oKXtpZigxPT10aGlzLnN3aXRjaGVkWWVhcilzd2l0Y2godGhpcy5zY2FsZSl7Y2FzZSJ5ZWFyIjpjYXNlIm1vbnRoIjpjYXNlIndlZWtkYXkiOmNhc2UiZGF5IjpjYXNlImhvdXIiOmNhc2UibWludXRlIjpjYXNlInNlY29uZCI6Y2FzZSJtaWxsaXNlY29uZCI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX1lbHNlIGlmKDE9PXRoaXMuc3dpdGNoZWRNb250aClzd2l0Y2godGhpcy5zY2FsZSl7Y2FzZSJ3ZWVrZGF5IjpjYXNlImRheSI6Y2FzZSJob3VyIjpjYXNlIm1pbnV0ZSI6Y2FzZSJzZWNvbmQiOmNhc2UibWlsbGlzZWNvbmQiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9ZWxzZSBpZigxPT10aGlzLnN3aXRjaGVkRGF5KXN3aXRjaCh0aGlzLnNjYWxlKXtjYXNlIm1pbGxpc2Vjb25kIjpjYXNlInNlY29uZCI6Y2FzZSJtaW51dGUiOmNhc2UiaG91ciI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX12YXIgdD10aGlzLm1vbWVudCh0aGlzLmN1cnJlbnQpO3N3aXRjaCh0aGlzLnNjYWxlKXtjYXNlIm1pbGxpc2Vjb25kIjpyZXR1cm4gMD09dC5taWxsaXNlY29uZHMoKTtjYXNlInNlY29uZCI6cmV0dXJuIDA9PXQuc2Vjb25kcygpO2Nhc2UibWludXRlIjpyZXR1cm4gMD09dC5ob3VycygpJiYwPT10Lm1pbnV0ZXMoKTtjYXNlImhvdXIiOnJldHVybiAwPT10LmhvdXJzKCk7Y2FzZSJ3ZWVrZGF5IjpjYXNlImRheSI6cmV0dXJuIDE9PXQuZGF0ZSgpO2Nhc2UibW9udGgiOnJldHVybiAwPT10Lm1vbnRoKCk7Y2FzZSJ5ZWFyIjpyZXR1cm4hMTtkZWZhdWx0OnJldHVybiExfX0sby5wcm90b3R5cGUuZ2V0TGFiZWxNaW5vcj1mdW5jdGlvbih0KXtpZih2b2lkIDA9PXQmJih0PXRoaXMuY3VycmVudCksImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZm9ybWF0Lm1pbm9yTGFiZWxzKXJldHVybiB0aGlzLmZvcm1hdC5taW5vckxhYmVscyh0LHRoaXMuc2NhbGUsdGhpcy5zdGVwKTt2YXIgZT10aGlzLmZvcm1hdC5taW5vckxhYmVsc1t0aGlzLnNjYWxlXTtyZXR1cm4gZSYmZS5sZW5ndGg+MD90aGlzLm1vbWVudCh0KS5mb3JtYXQoZSk6IiJ9LG8ucHJvdG90eXBlLmdldExhYmVsTWFqb3I9ZnVuY3Rpb24odCl7aWYodm9pZCAwPT10JiYodD10aGlzLmN1cnJlbnQpLCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZvcm1hdC5tYWpvckxhYmVscylyZXR1cm4gdGhpcy5mb3JtYXQubWFqb3JMYWJlbHModCx0aGlzLnNjYWxlLHRoaXMuc3RlcCk7dmFyIGU9dGhpcy5mb3JtYXQubWFqb3JMYWJlbHNbdGhpcy5zY2FsZV07cmV0dXJuIGUmJmUubGVuZ3RoPjA/dGhpcy5tb21lbnQodCkuZm9ybWF0KGUpOiIifSxvLnByb3RvdHlwZS5nZXRDbGFzc05hbWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3JldHVybiB0L2glMj09MD8iIHZpcy1ldmVuIjoiIHZpcy1vZGQifWZ1bmN0aW9uIGUodCl7cmV0dXJuIHQuaXNTYW1lKG5ldyBEYXRlLCJkYXkiKT8iIHZpcy10b2RheSI6dC5pc1NhbWUocygpLmFkZCgxLCJkYXkiKSwiZGF5Iik/IiB2aXMtdG9tb3Jyb3ciOnQuaXNTYW1lKHMoKS5hZGQoLTEsImRheSIpLCJkYXkiKT8iIHZpcy15ZXN0ZXJkYXkiOiIifWZ1bmN0aW9uIGkodCl7cmV0dXJuIHQuaXNTYW1lKG5ldyBEYXRlLCJ3ZWVrIik/IiB2aXMtY3VycmVudC13ZWVrIjoiIn1mdW5jdGlvbiBvKHQpe3JldHVybiB0LmlzU2FtZShuZXcgRGF0ZSwibW9udGgiKT8iIHZpcy1jdXJyZW50LW1vbnRoIjoiIn1mdW5jdGlvbiBuKHQpe3JldHVybiB0LmlzU2FtZShuZXcgRGF0ZSwieWVhciIpPyIgdmlzLWN1cnJlbnQteWVhciI6IiJ9dmFyIHM9dGhpcy5tb21lbnQscj10aGlzLm1vbWVudCh0aGlzLmN1cnJlbnQpLGE9ci5sb2NhbGU/ci5sb2NhbGUoImVuIik6ci5sYW5nKCJlbiIpLGg9dGhpcy5zdGVwO3N3aXRjaCh0aGlzLnNjYWxlKXtjYXNlIm1pbGxpc2Vjb25kIjpyZXR1cm4gZShhKSt0KGEubWlsbGlzZWNvbmRzKCkpLnRyaW0oKTtjYXNlInNlY29uZCI6cmV0dXJuIGUoYSkrdChhLnNlY29uZHMoKSkudHJpbSgpO2Nhc2UibWludXRlIjpyZXR1cm4gZShhKSt0KGEubWludXRlcygpKS50cmltKCk7Y2FzZSJob3VyIjpyZXR1cm4idmlzLWgiK2EuaG91cnMoKSsoND09dGhpcy5zdGVwPyItaCIrKGEuaG91cnMoKSs0KToiIikrZShhKSt0KGEuaG91cnMoKSk7Y2FzZSJ3ZWVrZGF5IjpyZXR1cm4idmlzLSIrYS5mb3JtYXQoImRkZGQiKS50b0xvd2VyQ2FzZSgpK2UoYSkraShhKSt0KGEuZGF0ZSgpKTtjYXNlImRheSI6cmV0dXJuInZpcy1kYXkiK2EuZGF0ZSgpKyIgdmlzLSIrYS5mb3JtYXQoIk1NTU0iKS50b0xvd2VyQ2FzZSgpK2UoYSkrbyhhKSt0aGlzLnN0ZXA8PTI/ZShhKToiIit0aGlzLnN0ZXA8PTI/IiB2aXMtIithLmZvcm1hdCgiZGRkZCIpLnRvTG93ZXJDYXNlKCk6IiIrdChhLmRhdGUoKS0xKTtjYXNlIm1vbnRoIjpyZXR1cm4idmlzLSIrYS5mb3JtYXQoIk1NTU0iKS50b0xvd2VyQ2FzZSgpK28oYSkrdChhLm1vbnRoKCkpO2Nhc2UieWVhciI6dmFyIGQ9YS55ZWFyKCk7cmV0dXJuInZpcy15ZWFyIitkK24oYSkrdChkKTtkZWZhdWx0OnJldHVybiIifX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSxpKXt0aGlzLmdyb3VwSWQ9dCx0aGlzLnN1Ymdyb3Vwcz17fSx0aGlzLnN1Ymdyb3VwSW5kZXg9MCx0aGlzLnN1Ymdyb3VwT3JkZXJlcj1lJiZlLnN1Ymdyb3VwT3JkZXIsdGhpcy5pdGVtU2V0PWksdGhpcy5pc1Zpc2libGU9bnVsbCx0aGlzLmRvbT17fSx0aGlzLnByb3BzPXtsYWJlbDp7d2lkdGg6MCxoZWlnaHQ6MH19LHRoaXMuY2xhc3NOYW1lPW51bGwsdGhpcy5pdGVtcz17fSx0aGlzLnZpc2libGVJdGVtcz1bXSx0aGlzLm9yZGVyZWRJdGVtcz17YnlTdGFydDpbXSxieUVuZDpbXX0sdGhpcy5jaGVja1JhbmdlZEl0ZW1zPSExO3ZhciBvPXRoaXM7dGhpcy5pdGVtU2V0LmJvZHkuZW1pdHRlci5vbigiY2hlY2tSYW5nZWRJdGVtcyIsZnVuY3Rpb24oKXtvLmNoZWNrUmFuZ2VkSXRlbXM9ITB9KSx0aGlzLl9jcmVhdGUoKSx0aGlzLnNldERhdGEoZSl9dmFyIG49aSgxKSxzPWkoMzkpO2koNDApO28ucHJvdG90eXBlLl9jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5pdGVtU2V0Lm9wdGlvbnMuZ3JvdXBFZGl0YWJsZS5vcmRlcj90LmNsYXNzTmFtZT0idmlzLWxhYmVsIGRyYWdnYWJsZSI6dC5jbGFzc05hbWU9InZpcy1sYWJlbCIsdGhpcy5kb20ubGFiZWw9dDt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLmNsYXNzTmFtZT0idmlzLWlubmVyIix0LmFwcGVuZENoaWxkKGUpLHRoaXMuZG9tLmlubmVyPWU7dmFyIGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aS5jbGFzc05hbWU9InZpcy1ncm91cCIsaVsidGltZWxpbmUtZ3JvdXAiXT10aGlzLHRoaXMuZG9tLmZvcmVncm91bmQ9aSx0aGlzLmRvbS5iYWNrZ3JvdW5kPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZG9tLmJhY2tncm91bmQuY2xhc3NOYW1lPSJ2aXMtZ3JvdXAiLHRoaXMuZG9tLmF4aXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5kb20uYXhpcy5jbGFzc05hbWU9InZpcy1ncm91cCIsdGhpcy5kb20ubWFya2VyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZG9tLm1hcmtlci5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iLHRoaXMuZG9tLm1hcmtlci5pbm5lckhUTUw9Ij8iLHRoaXMuZG9tLmJhY2tncm91bmQuYXBwZW5kQ2hpbGQodGhpcy5kb20ubWFya2VyKX0sby5wcm90b3R5cGUuc2V0RGF0YT1mdW5jdGlvbih0KXt2YXIgZSxpO2lmKHRoaXMuaXRlbVNldC5vcHRpb25zJiZ0aGlzLml0ZW1TZXQub3B0aW9ucy5ncm91cFRlbXBsYXRlPyhpPXRoaXMuaXRlbVNldC5vcHRpb25zLmdyb3VwVGVtcGxhdGUuYmluZCh0aGlzKSxlPWkodCx0aGlzLmRvbS5pbm5lcikpOmU9dCYmdC5jb250ZW50LGUgaW5zdGFuY2VvZiBFbGVtZW50KXtmb3IodGhpcy5kb20uaW5uZXIuYXBwZW5kQ2hpbGQoZSk7dGhpcy5kb20uaW5uZXIuZmlyc3RDaGlsZDspdGhpcy5kb20uaW5uZXIucmVtb3ZlQ2hpbGQodGhpcy5kb20uaW5uZXIuZmlyc3RDaGlsZCk7dGhpcy5kb20uaW5uZXIuYXBwZW5kQ2hpbGQoZSl9ZWxzZSBlIGluc3RhbmNlb2YgT2JqZWN0P2kodCx0aGlzLmRvbS5pbm5lcik6dm9pZCAwIT09ZSYmbnVsbCE9PWU/dGhpcy5kb20uaW5uZXIuaW5uZXJIVE1MPWU6dGhpcy5kb20uaW5uZXIuaW5uZXJIVE1MPXRoaXMuZ3JvdXBJZHx8IiI7dGhpcy5kb20ubGFiZWwudGl0bGU9dCYmdC50aXRsZXx8IiIsdGhpcy5kb20uaW5uZXIuZmlyc3RDaGlsZD9uLnJlbW92ZUNsYXNzTmFtZSh0aGlzLmRvbS5pbm5lciwidmlzLWhpZGRlbiIpOm4uYWRkQ2xhc3NOYW1lKHRoaXMuZG9tLmlubmVyLCJ2aXMtaGlkZGVuIik7dmFyIG89dCYmdC5jbGFzc05hbWV8fG51bGw7byE9dGhpcy5jbGFzc05hbWUmJih0aGlzLmNsYXNzTmFtZSYmKG4ucmVtb3ZlQ2xhc3NOYW1lKHRoaXMuZG9tLmxhYmVsLHRoaXMuY2xhc3NOYW1lKSxuLnJlbW92ZUNsYXNzTmFtZSh0aGlzLmRvbS5mb3JlZ3JvdW5kLHRoaXMuY2xhc3NOYW1lKSxuLnJlbW92ZUNsYXNzTmFtZSh0aGlzLmRvbS5iYWNrZ3JvdW5kLHRoaXMuY2xhc3NOYW1lKSxuLnJlbW92ZUNsYXNzTmFtZSh0aGlzLmRvbS5heGlzLHRoaXMuY2xhc3NOYW1lKSksbi5hZGRDbGFzc05hbWUodGhpcy5kb20ubGFiZWwsbyksbi5hZGRDbGFzc05hbWUodGhpcy5kb20uZm9yZWdyb3VuZCxvKSxuLmFkZENsYXNzTmFtZSh0aGlzLmRvbS5iYWNrZ3JvdW5kLG8pLG4uYWRkQ2xhc3NOYW1lKHRoaXMuZG9tLmF4aXMsbyksdGhpcy5jbGFzc05hbWU9byksdGhpcy5zdHlsZSYmKG4ucmVtb3ZlQ3NzVGV4dCh0aGlzLmRvbS5sYWJlbCx0aGlzLnN0eWxlKSx0aGlzLnN0eWxlPW51bGwpLHQmJnQuc3R5bGUmJihuLmFkZENzc1RleHQodGhpcy5kb20ubGFiZWwsdC5zdHlsZSksdGhpcy5zdHlsZT10LnN0eWxlKX0sby5wcm90b3R5cGUuZ2V0TGFiZWxXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnByb3BzLmxhYmVsLndpZHRofSxvLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24odCxlLGkpe3ZhciBvPSExLHI9dGhpcy5kb20ubWFya2VyLmNsaWVudEhlaWdodDtyIT10aGlzLmxhc3RNYXJrZXJIZWlnaHQmJih0aGlzLmxhc3RNYXJrZXJIZWlnaHQ9cixuLmZvckVhY2godGhpcy5pdGVtcyxmdW5jdGlvbih0KXt0LmRpcnR5PSEwLHQuZGlzcGxheWVkJiZ0LnJlZHJhdygpfSksaT0hMCksdGhpcy5fY2FsY3VsYXRlU3ViR3JvdXBIZWlnaHRzKCksdGhpcy5pc1Zpc2libGU9dGhpcy5faXNHcm91cFZpc2libGUodCxlKTt2YXIgYT10aGlzLmRvbS5mb3JlZ3JvdW5kO2lmKHRoaXMudG9wPWEub2Zmc2V0VG9wLHRoaXMucmlnaHQ9YS5vZmZzZXRMZWZ0LHRoaXMud2lkdGg9YS5vZmZzZXRXaWR0aCx0aGlzLmlzVmlzaWJsZT10aGlzLl9pc0dyb3VwVmlzaWJsZSh0LGUpLCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLml0ZW1TZXQub3B0aW9ucy5vcmRlcil7aWYoaSl7dmFyIGg9dGhpcyxkPSExO24uZm9yRWFjaCh0aGlzLml0ZW1zLGZ1bmN0aW9uKHQpe3QuZGlzcGxheWVkfHwodC5yZWRyYXcoKSxoLnZpc2libGVJdGVtcy5wdXNoKHQpKSx0LnJlcG9zaXRpb25YKGQpfSk7dmFyIGw9dGhpcy5vcmRlcmVkSXRlbXMuYnlTdGFydC5zbGljZSgpLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gaC5pdGVtU2V0Lm9wdGlvbnMub3JkZXIodC5kYXRhLGUuZGF0YSl9KTtzLnN0YWNrKGwsZSwhMCl9dGhpcy52aXNpYmxlSXRlbXM9dGhpcy5fdXBkYXRlVmlzaWJsZUl0ZW1zKHRoaXMub3JkZXJlZEl0ZW1zLHRoaXMudmlzaWJsZUl0ZW1zLHQpfWVsc2UgdGhpcy52aXNpYmxlSXRlbXM9dGhpcy5fdXBkYXRlVmlzaWJsZUl0ZW1zKHRoaXMub3JkZXJlZEl0ZW1zLHRoaXMudmlzaWJsZUl0ZW1zLHQpLHRoaXMuaXRlbVNldC5vcHRpb25zLnN0YWNrP3Muc3RhY2sodGhpcy52aXNpYmxlSXRlbXMsZSxpKTpzLm5vc3RhY2sodGhpcy52aXNpYmxlSXRlbXMsZSx0aGlzLnN1Ymdyb3Vwcyk7aWYoIXRoaXMuaXNWaXNpYmxlJiZ0aGlzLmhlaWdodClyZXR1cm4gbz0hMTt2YXIgYz10aGlzLl9jYWxjdWxhdGVIZWlnaHQoZSksYT10aGlzLmRvbS5mb3JlZ3JvdW5kO3RoaXMudG9wPWEub2Zmc2V0VG9wLHRoaXMucmlnaHQ9YS5vZmZzZXRMZWZ0LHRoaXMud2lkdGg9YS5vZmZzZXRXaWR0aCxvPW4udXBkYXRlUHJvcGVydHkodGhpcywiaGVpZ2h0IixjKXx8byxvPW4udXBkYXRlUHJvcGVydHkodGhpcy5wcm9wcy5sYWJlbCwid2lkdGgiLHRoaXMuZG9tLmlubmVyLmNsaWVudFdpZHRoKXx8byxvPW4udXBkYXRlUHJvcGVydHkodGhpcy5wcm9wcy5sYWJlbCwiaGVpZ2h0Iix0aGlzLmRvbS5pbm5lci5jbGllbnRIZWlnaHQpfHxvLHRoaXMuZG9tLmJhY2tncm91bmQuc3R5bGUuaGVpZ2h0PWMrInB4Iix0aGlzLmRvbS5mb3JlZ3JvdW5kLnN0eWxlLmhlaWdodD1jKyJweCIsdGhpcy5kb20ubGFiZWwuc3R5bGUuaGVpZ2h0PWMrInB4Ijtmb3IodmFyIHU9MCxwPXRoaXMudmlzaWJsZUl0ZW1zLmxlbmd0aDt1PHA7dSsrKXt2YXIgZj10aGlzLnZpc2libGVJdGVtc1t1XTtmLnJlcG9zaXRpb25ZKGUpfXJldHVybiBvfSxvLnByb3RvdHlwZS5fY2FsY3VsYXRlU3ViR3JvdXBIZWlnaHRzPWZ1bmN0aW9uKCl7aWYoT2JqZWN0LmtleXModGhpcy5zdWJncm91cHMpLmxlbmd0aD4wKXt2YXIgdD10aGlzO3RoaXMucmVzZXRTdWJncm91cHMoKSxuLmZvckVhY2godGhpcy52aXNpYmxlSXRlbXMsZnVuY3Rpb24oZSl7dm9pZCAwIT09ZS5kYXRhLnN1Ymdyb3VwJiYodC5zdWJncm91cHNbZS5kYXRhLnN1Ymdyb3VwXS5oZWlnaHQ9TWF0aC5tYXgodC5zdWJncm91cHNbZS5kYXRhLnN1Ymdyb3VwXS5oZWlnaHQsZS5oZWlnaHQpLHQuc3ViZ3JvdXBzW2UuZGF0YS5zdWJncm91cF0udmlzaWJsZT0hMCl9KX19LG8ucHJvdG90eXBlLl9pc0dyb3VwVmlzaWJsZT1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMudG9wPD10LmJvZHkuZG9tUHJvcHMuY2VudGVyQ29udGFpbmVyLmhlaWdodC10LmJvZHkuZG9tUHJvcHMuc2Nyb2xsVG9wK2UuYXhpcyYmdGhpcy50b3ArdGhpcy5oZWlnaHQrZS5heGlzPj0tdC5ib2R5LmRvbVByb3BzLnNjcm9sbFRvcDtyZXR1cm4gaX0sby5wcm90b3R5cGUuX2NhbGN1bGF0ZUhlaWdodD1mdW5jdGlvbih0KXt2YXIgZSxpPXRoaXMudmlzaWJsZUl0ZW1zO2lmKGkubGVuZ3RoPjApe3ZhciBvPWlbMF0udG9wLHM9aVswXS50b3AraVswXS5oZWlnaHQ7aWYobi5mb3JFYWNoKGksZnVuY3Rpb24odCl7bz1NYXRoLm1pbihvLHQudG9wKSxzPU1hdGgubWF4KHMsdC50b3ArdC5oZWlnaHQpfSksbz50LmF4aXMpe3ZhciByPW8tdC5heGlzO3MtPXIsbi5mb3JFYWNoKGksZnVuY3Rpb24odCl7dC50b3AtPXJ9KX1lPXMrdC5pdGVtLnZlcnRpY2FsLzJ9ZWxzZSBlPTA7cmV0dXJuIGU9TWF0aC5tYXgoZSx0aGlzLnByb3BzLmxhYmVsLmhlaWdodCl9LG8ucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oKXt0aGlzLmRvbS5sYWJlbC5wYXJlbnROb2RlfHx0aGlzLml0ZW1TZXQuZG9tLmxhYmVsU2V0LmFwcGVuZENoaWxkKHRoaXMuZG9tLmxhYmVsKSx0aGlzLmRvbS5mb3JlZ3JvdW5kLnBhcmVudE5vZGV8fHRoaXMuaXRlbVNldC5kb20uZm9yZWdyb3VuZC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5mb3JlZ3JvdW5kKSx0aGlzLmRvbS5iYWNrZ3JvdW5kLnBhcmVudE5vZGV8fHRoaXMuaXRlbVNldC5kb20uYmFja2dyb3VuZC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5iYWNrZ3JvdW5kKSx0aGlzLmRvbS5heGlzLnBhcmVudE5vZGV8fHRoaXMuaXRlbVNldC5kb20uYXhpcy5hcHBlbmRDaGlsZCh0aGlzLmRvbS5heGlzKX0sby5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZG9tLmxhYmVsO3QucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpO3ZhciBlPXRoaXMuZG9tLmZvcmVncm91bmQ7ZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk7dmFyIGk9dGhpcy5kb20uYmFja2dyb3VuZDtpLnBhcmVudE5vZGUmJmkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChpKTt2YXIgbz10aGlzLmRvbS5heGlzO28ucGFyZW50Tm9kZSYmby5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pfSxvLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7aWYodGhpcy5pdGVtc1t0LmlkXT10LHQuc2V0UGFyZW50KHRoaXMpLHZvaWQgMCE9PXQuZGF0YS5zdWJncm91cCYmKHZvaWQgMD09PXRoaXMuc3ViZ3JvdXBzW3QuZGF0YS5zdWJncm91cF0mJih0aGlzLnN1Ymdyb3Vwc1t0LmRhdGEuc3ViZ3JvdXBdPXtoZWlnaHQ6MCx2aXNpYmxlOiExLGluZGV4OnRoaXMuc3ViZ3JvdXBJbmRleCxpdGVtczpbXX0sdGhpcy5zdWJncm91cEluZGV4KyspLHRoaXMuc3ViZ3JvdXBzW3QuZGF0YS5zdWJncm91cF0uaXRlbXMucHVzaCh0KSksdGhpcy5vcmRlclN1Ymdyb3VwcygpLHRoaXMudmlzaWJsZUl0ZW1zLmluZGV4T2YodCk9PS0xKXt2YXIgZT10aGlzLml0ZW1TZXQuYm9keS5yYW5nZTt0aGlzLl9jaGVja0lmVmlzaWJsZSh0LHRoaXMudmlzaWJsZUl0ZW1zLGUpfX0sby5wcm90b3R5cGUub3JkZXJTdWJncm91cHM9ZnVuY3Rpb24oKXtpZih2b2lkIDAhPT10aGlzLnN1Ymdyb3VwT3JkZXJlcil7dmFyIHQ9W107aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnN1Ymdyb3VwT3JkZXJlcil7Zm9yKHZhciBlIGluIHRoaXMuc3ViZ3JvdXBzKXQucHVzaCh7c3ViZ3JvdXA6ZSxzb3J0RmllbGQ6dGhpcy5zdWJncm91cHNbZV0uaXRlbXNbMF0uZGF0YVt0aGlzLnN1Ymdyb3VwT3JkZXJlcl19KTt0LnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5zb3J0RmllbGQtZS5zb3J0RmllbGR9KX1lbHNlIGlmKCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnN1Ymdyb3VwT3JkZXJlcil7Zm9yKHZhciBlIGluIHRoaXMuc3ViZ3JvdXBzKXQucHVzaCh0aGlzLnN1Ymdyb3Vwc1tlXS5pdGVtc1swXS5kYXRhKTt0LnNvcnQodGhpcy5zdWJncm91cE9yZGVyZXIpfWlmKHQubGVuZ3RoPjApZm9yKHZhciBpPTA7aTx0Lmxlbmd0aDtpKyspdGhpcy5zdWJncm91cHNbdFtpXS5zdWJncm91cF0uaW5kZXg9aX19LG8ucHJvdG90eXBlLnJlc2V0U3ViZ3JvdXBzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuc3ViZ3JvdXBzKXRoaXMuc3ViZ3JvdXBzLmhhc093blByb3BlcnR5KHQpJiYodGhpcy5zdWJncm91cHNbdF0udmlzaWJsZT0hMSl9LG8ucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXtkZWxldGUgdGhpcy5pdGVtc1t0LmlkXSx0LnNldFBhcmVudChudWxsKTt2YXIgZT10aGlzLnZpc2libGVJdGVtcy5pbmRleE9mKHQpO2lmKGUhPS0xJiZ0aGlzLnZpc2libGVJdGVtcy5zcGxpY2UoZSwxKSx2b2lkIDAhPT10LmRhdGEuc3ViZ3JvdXApe3ZhciBpPXRoaXMuc3ViZ3JvdXBzW3QuZGF0YS5zdWJncm91cF07aWYoaSl7dmFyIG89aS5pdGVtcy5pbmRleE9mKHQpO2kuaXRlbXMuc3BsaWNlKG8sMSksaS5pdGVtcy5sZW5ndGh8fChkZWxldGUgdGhpcy5zdWJncm91cHNbdC5kYXRhLnN1Ymdyb3VwXSx0aGlzLnN1Ymdyb3VwSW5kZXgtLSksdGhpcy5vcmRlclN1Ymdyb3VwcygpfX19LG8ucHJvdG90eXBlLnJlbW92ZUZyb21EYXRhU2V0PWZ1bmN0aW9uKHQpe3RoaXMuaXRlbVNldC5yZW1vdmVJdGVtKHQuaWQpfSxvLnByb3RvdHlwZS5vcmRlcj1mdW5jdGlvbigpe2Zvcih2YXIgdD1uLnRvQXJyYXkodGhpcy5pdGVtcyksZT1bXSxpPVtdLG89MDtvPHQubGVuZ3RoO28rKyl2b2lkIDAhPT10W29dLmRhdGEuZW5kJiZpLnB1c2godFtvXSksZS5wdXNoKHRbb10pO3RoaXMub3JkZXJlZEl0ZW1zPXtieVN0YXJ0OmUsYnlFbmQ6aX0scy5vcmRlckJ5U3RhcnQodGhpcy5vcmRlcmVkSXRlbXMuYnlTdGFydCkscy5vcmRlckJ5RW5kKHRoaXMub3JkZXJlZEl0ZW1zLmJ5RW5kKX0sby5wcm90b3R5cGUuX3VwZGF0ZVZpc2libGVJdGVtcz1mdW5jdGlvbih0LGUsaSl7dmFyIG89W10scz17fTtpZighdGhpcy5pc1Zpc2libGUmJiJfX2JhY2tncm91bmRfXyIhPXRoaXMuZ3JvdXBJZCl7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBhPWVbcl07YS5kaXNwbGF5ZWQmJmEuaGlkZSgpfXJldHVybiBvfXZhciBoPShpLmVuZC1pLnN0YXJ0KS80LGQ9aS5zdGFydC1oLGw9aS5lbmQraCxjPWZ1bmN0aW9uKHQpe3JldHVybiB0PGQ/LTE6dDw9bD8wOjF9O2lmKGUubGVuZ3RoPjApZm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspdGhpcy5fY2hlY2tJZlZpc2libGVXaXRoUmVmZXJlbmNlKGVbcl0sbyxzLGkpO3ZhciB1PW4uYmluYXJ5U2VhcmNoQ3VzdG9tKHQuYnlTdGFydCxjLCJkYXRhIiwic3RhcnQiKTtpZih0aGlzLl90cmFjZVZpc2libGUodSx0LmJ5U3RhcnQsbyxzLGZ1bmN0aW9uKHQpe3JldHVybiB0LmRhdGEuc3RhcnQ8ZHx8dC5kYXRhLnN0YXJ0Pmx9KSwxPT10aGlzLmNoZWNrUmFuZ2VkSXRlbXMpZm9yKHRoaXMuY2hlY2tSYW5nZWRJdGVtcz0hMSxyPTA7cjx0LmJ5RW5kLmxlbmd0aDtyKyspdGhpcy5fY2hlY2tJZlZpc2libGVXaXRoUmVmZXJlbmNlKHQuYnlFbmRbcl0sbyxzLGkpO2Vsc2V7dmFyIHA9bi5iaW5hcnlTZWFyY2hDdXN0b20odC5ieUVuZCxjLCJkYXRhIiwiZW5kIik7dGhpcy5fdHJhY2VWaXNpYmxlKHAsdC5ieUVuZCxvLHMsZnVuY3Rpb24odCl7cmV0dXJuIHQuZGF0YS5lbmQ8ZHx8dC5kYXRhLmVuZD5sfSl9Zm9yKHZhciByPTA7cjxvLmxlbmd0aDtyKyspe3ZhciBhPW9bcl07YS5kaXNwbGF5ZWR8fGEuc2hvdygpLGEucmVwb3NpdGlvblgoKX1yZXR1cm4gb30sby5wcm90b3R5cGUuX3RyYWNlVmlzaWJsZT1mdW5jdGlvbih0LGUsaSxvLG4pe2lmKHQhPS0xKXtmb3IodmFyIHM9dDtzPj0wO3MtLSl7dmFyIHI9ZVtzXTtpZihuKHIpKWJyZWFrO3ZvaWQgMD09PW9bci5pZF0mJihvW3IuaWRdPSEwLGkucHVzaChyKSl9Zm9yKHZhciBzPXQrMTtzPGUubGVuZ3RoO3MrKyl7dmFyIHI9ZVtzXTtpZihuKHIpKWJyZWFrO3ZvaWQgMD09PW9bci5pZF0mJihvW3IuaWRdPSEwLGkucHVzaChyKSl9fX0sby5wcm90b3R5cGUuX2NoZWNrSWZWaXNpYmxlPWZ1bmN0aW9uKHQsZSxpKXt0LmlzVmlzaWJsZShpKT8odC5kaXNwbGF5ZWR8fHQuc2hvdygpLHQucmVwb3NpdGlvblgoKSxlLnB1c2godCkpOnQuZGlzcGxheWVkJiZ0LmhpZGUoKX0sby5wcm90b3R5cGUuX2NoZWNrSWZWaXNpYmxlV2l0aFJlZmVyZW5jZT1mdW5jdGlvbih0LGUsaSxvKXt0LmlzVmlzaWJsZShvKT92b2lkIDA9PT1pW3QuaWRdJiYoaVt0LmlkXT0hMCxlLnB1c2godCkpOnQuZGlzcGxheWVkJiZ0LmhpZGUoKX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSl7dmFyIGk9LjAwMTtlLm9yZGVyQnlTdGFydD1mdW5jdGlvbih0KXt0LnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5kYXRhLnN0YXJ0LWUuZGF0YS5zdGFydH0pfSxlLm9yZGVyQnlFbmQ9ZnVuY3Rpb24odCl7dC5zb3J0KGZ1bmN0aW9uKHQsZSl7dmFyIGk9ImVuZCJpbiB0LmRhdGE/dC5kYXRhLmVuZDp0LmRhdGEuc3RhcnQsbz0iZW5kImluIGUuZGF0YT9lLmRhdGEuZW5kOmUuZGF0YS5zdGFydDtyZXR1cm4gaS1vfSl9LGUuc3RhY2s9ZnVuY3Rpb24odCxpLG8pe3ZhciBuLHM7aWYobylmb3Iobj0wLHM9dC5sZW5ndGg7bjxzO24rKyl0W25dLnRvcD1udWxsO2ZvcihuPTAscz10Lmxlbmd0aDtuPHM7bisrKXt2YXIgcj10W25dO2lmKHIuc3RhY2smJm51bGw9PT1yLnRvcCl7ci50b3A9aS5heGlzO2Rve2Zvcih2YXIgYT1udWxsLGg9MCxkPXQubGVuZ3RoO2g8ZDtoKyspe3ZhciBsPXRbaF07aWYobnVsbCE9PWwudG9wJiZsIT09ciYmbC5zdGFjayYmZS5jb2xsaXNpb24ocixsLGkuaXRlbSxsLm9wdGlvbnMucnRsKSl7YT1sO2JyZWFrfX1udWxsIT1hJiYoci50b3A9YS50b3ArYS5oZWlnaHQraS5pdGVtLnZlcnRpY2FsKX13aGlsZShhKX19fSxlLm5vc3RhY2s9ZnVuY3Rpb24odCxlLGkpe3ZhciBvLG4scztmb3Iobz0wLG49dC5sZW5ndGg7bzxuO28rKylpZih2b2lkIDAhPT10W29dLmRhdGEuc3ViZ3JvdXApe3M9ZS5heGlzO2Zvcih2YXIgciBpbiBpKWkuaGFzT3duUHJvcGVydHkocikmJjE9PWlbcl0udmlzaWJsZSYmaVtyXS5pbmRleDxpW3Rbb10uZGF0YS5zdWJncm91cF0uaW5kZXgmJihzKz1pW3JdLmhlaWdodCtlLml0ZW0udmVydGljYWwpO3Rbb10udG9wPXN9ZWxzZSB0W29dLnRvcD1lLmF4aXN9LGUuY29sbGlzaW9uPWZ1bmN0aW9uKHQsZSxvLG4pe3JldHVybiBuP3QucmlnaHQtby5ob3Jpem9udGFsK2k8ZS5yaWdodCtlLndpZHRoJiZ0LnJpZ2h0K3Qud2lkdGgrby5ob3Jpem9udGFsLWk+ZS5yaWdodCYmdC50b3Atby52ZXJ0aWNhbCtpPGUudG9wK2UuaGVpZ2h0JiZ0LnRvcCt0LmhlaWdodCtvLnZlcnRpY2FsLWk+ZS50b3A6dC5sZWZ0LW8uaG9yaXpvbnRhbCtpPGUubGVmdCtlLndpZHRoJiZ0LmxlZnQrdC53aWR0aCtvLmhvcml6b250YWwtaT5lLmxlZnQmJnQudG9wLW8udmVydGljYWwraTxlLnRvcCtlLmhlaWdodCYmdC50b3ArdC5oZWlnaHQrby52ZXJ0aWNhbC1pPmUudG9wfX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGkpe2lmKHRoaXMucHJvcHM9e2NvbnRlbnQ6e3dpZHRoOjB9fSx0aGlzLm92ZXJmbG93PSExLHRoaXMub3B0aW9ucz1pLHQpe2lmKHZvaWQgMD09dC5zdGFydCl0aHJvdyBuZXcgRXJyb3IoJ1Byb3BlcnR5ICJzdGFydCIgbWlzc2luZyBpbiBpdGVtICcrdC5pZCk7aWYodm9pZCAwPT10LmVuZCl0aHJvdyBuZXcgRXJyb3IoJ1Byb3BlcnR5ICJlbmQiIG1pc3NpbmcgaW4gaXRlbSAnK3QuaWQpfW4uY2FsbCh0aGlzLHQsZSxpKX12YXIgbj0oaSgyMiksaSg0MSkpO28ucHJvdG90eXBlPW5ldyBuKG51bGwsbnVsbCxudWxsKSxvLnByb3RvdHlwZS5iYXNlQ2xhc3NOYW1lPSJ2aXMtaXRlbSB2aXMtcmFuZ2UiLG8ucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kYXRhLnN0YXJ0PHQuZW5kJiZ0aGlzLmRhdGEuZW5kPnQuc3RhcnR9LG8ucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZG9tO2lmKHR8fCh0aGlzLmRvbT17fSx0PXRoaXMuZG9tLHQuYm94PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHQuZnJhbWU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdC5mcmFtZS5jbGFzc05hbWU9InZpcy1pdGVtLW92ZXJmbG93Iix0LmJveC5hcHBlbmRDaGlsZCh0LmZyYW1lKSx0LmNvbnRlbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdC5jb250ZW50LmNsYXNzTmFtZT0idmlzLWl0ZW0tY29udGVudCIsdC5mcmFtZS5hcHBlbmRDaGlsZCh0LmNvbnRlbnQpLHQuYm94WyJ0aW1lbGluZS1pdGVtIl09dGhpcyx0aGlzLmRpcnR5PSEwKSwhdGhpcy5wYXJlbnQpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcmVkcmF3IGl0ZW06IG5vIHBhcmVudCBhdHRhY2hlZCIpO2lmKCF0LmJveC5wYXJlbnROb2RlKXt2YXIgZT10aGlzLnBhcmVudC5kb20uZm9yZWdyb3VuZDtpZighZSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCByZWRyYXcgaXRlbTogcGFyZW50IGhhcyBubyBmb3JlZ3JvdW5kIGNvbnRhaW5lciBlbGVtZW50Iik7ZS5hcHBlbmRDaGlsZCh0LmJveCl9aWYodGhpcy5kaXNwbGF5ZWQ9ITAsdGhpcy5kaXJ0eSl7dGhpcy5fdXBkYXRlQ29udGVudHModGhpcy5kb20uY29udGVudCksdGhpcy5fdXBkYXRlVGl0bGUodGhpcy5kb20uYm94KSx0aGlzLl91cGRhdGVEYXRhQXR0cmlidXRlcyh0aGlzLmRvbS5ib3gpLHRoaXMuX3VwZGF0ZVN0eWxlKHRoaXMuZG9tLmJveCk7dmFyIGk9KHRoaXMub3B0aW9ucy5lZGl0YWJsZS51cGRhdGVUaW1lfHx0aGlzLm9wdGlvbnMuZWRpdGFibGUudXBkYXRlR3JvdXB8fHRoaXMuZWRpdGFibGU9PT0hMCkmJnRoaXMuZWRpdGFibGUhPT0hMSxvPSh0aGlzLmRhdGEuY2xhc3NOYW1lPyIgIit0aGlzLmRhdGEuY2xhc3NOYW1lOiIiKSsodGhpcy5zZWxlY3RlZD8iIHZpcy1zZWxlY3RlZCI6IiIpKyhpPyIgdmlzLWVkaXRhYmxlIjoiIHZpcy1yZWFkb25seSIpO3QuYm94LmNsYXNzTmFtZT10aGlzLmJhc2VDbGFzc05hbWUrbyx0aGlzLm92ZXJmbG93PSJoaWRkZW4iIT09d2luZG93LmdldENvbXB1dGVkU3R5bGUodC5mcmFtZSkub3ZlcmZsb3csdGhpcy5kb20uY29udGVudC5zdHlsZS5tYXhXaWR0aD0ibm9uZSIsdGhpcy5wcm9wcy5jb250ZW50LndpZHRoPXRoaXMuZG9tLmNvbnRlbnQub2Zmc2V0V2lkdGgsdGhpcy5oZWlnaHQ9dGhpcy5kb20uYm94Lm9mZnNldEhlaWdodCx0aGlzLmRvbS5jb250ZW50LnN0eWxlLm1heFdpZHRoPSIiLHRoaXMuZGlydHk9ITF9dGhpcy5fcmVwYWludE9uSXRlbVVwZGF0ZVRpbWVUb29sdGlwKHQuYm94KSx0aGlzLl9yZXBhaW50RGVsZXRlQnV0dG9uKHQuYm94KSx0aGlzLl9yZXBhaW50RHJhZ0NlbnRlcigpLHRoaXMuX3JlcGFpbnREcmFnTGVmdCgpLHRoaXMuX3JlcGFpbnREcmFnUmlnaHQoKX0sby5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe3RoaXMuZGlzcGxheWVkfHx0aGlzLnJlZHJhdygpfSxvLnByb3RvdHlwZS5oaWRlPWZ1bmN0aW9uKCl7aWYodGhpcy5kaXNwbGF5ZWQpe3ZhciB0PXRoaXMuZG9tLmJveDt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0aGlzLmRpc3BsYXllZD0hMX19LG8ucHJvdG90eXBlLnJlcG9zaXRpb25YPWZ1bmN0aW9uKHQpe3ZhciBlLGksbz10aGlzLnBhcmVudC53aWR0aCxuPXRoaXMuY29udmVyc2lvbi50b1NjcmVlbih0aGlzLmRhdGEuc3RhcnQpLHM9dGhpcy5jb252ZXJzaW9uLnRvU2NyZWVuKHRoaXMuZGF0YS5lbmQpO3ZvaWQgMCE9PXQmJnQhPT0hMHx8KG48LW8mJihuPS1vKSxzPjIqbyYmKHM9MipvKSk7dmFyIHI9TWF0aC5tYXgocy1uKy41LDEpO3N3aXRjaCh0aGlzLm92ZXJmbG93Pyh0aGlzLm9wdGlvbnMucnRsP3RoaXMucmlnaHQ9bjp0aGlzLmxlZnQ9bix0aGlzLndpZHRoPXIrdGhpcy5wcm9wcy5jb250ZW50LndpZHRoLGk9dGhpcy5wcm9wcy5jb250ZW50LndpZHRoKToodGhpcy5vcHRpb25zLnJ0bD90aGlzLnJpZ2h0PW46dGhpcy5sZWZ0PW4sdGhpcy53aWR0aD1yLGk9TWF0aC5taW4ocy1uLHRoaXMucHJvcHMuY29udGVudC53aWR0aCkpLHRoaXMub3B0aW9ucy5ydGw/dGhpcy5kb20uYm94LnN0eWxlLnJpZ2h0PXRoaXMucmlnaHQrInB4Ijp0aGlzLmRvbS5ib3guc3R5bGUubGVmdD10aGlzLmxlZnQrInB4Iix0aGlzLmRvbS5ib3guc3R5bGUud2lkdGg9cisicHgiLHRoaXMub3B0aW9ucy5hbGlnbil7Y2FzZSJsZWZ0Ijp0aGlzLm9wdGlvbnMucnRsP3RoaXMuZG9tLmNvbnRlbnQuc3R5bGUucmlnaHQ9IjAiOnRoaXMuZG9tLmNvbnRlbnQuc3R5bGUubGVmdD0iMCI7YnJlYWs7Y2FzZSJyaWdodCI6dGhpcy5vcHRpb25zLnJ0bD90aGlzLmRvbS5jb250ZW50LnN0eWxlLnJpZ2h0PU1hdGgubWF4KHItaSwwKSsicHgiOnRoaXMuZG9tLmNvbnRlbnQuc3R5bGUubGVmdD1NYXRoLm1heChyLWksMCkrInB4IjticmVhaztjYXNlImNlbnRlciI6dGhpcy5vcHRpb25zLnJ0bD90aGlzLmRvbS5jb250ZW50LnN0eWxlLnJpZ2h0PU1hdGgubWF4KChyLWkpLzIsMCkrInB4Ijp0aGlzLmRvbS5jb250ZW50LnN0eWxlLmxlZnQ9TWF0aC5tYXgoKHItaSkvMiwwKSsicHgiO2JyZWFrO2RlZmF1bHQ6ZT10aGlzLm92ZXJmbG93P3M+MD9NYXRoLm1heCgtbiwwKTotaTpuPDA/LW46MCx0aGlzLm9wdGlvbnMucnRsP3RoaXMuZG9tLmNvbnRlbnQuc3R5bGUucmlnaHQ9ZSsicHgiOih0aGlzLmRvbS5jb250ZW50LnN0eWxlLmxlZnQ9ZSsicHgiLHRoaXMuZG9tLmNvbnRlbnQuc3R5bGUud2lkdGg9ImNhbGMoMTAwJSAtICIrZSsicHgpIil9fSxvLnByb3RvdHlwZS5yZXBvc2l0aW9uWT1mdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5pdGVtLGU9dGhpcy5kb20uYm94OyJ0b3AiPT10P2Uuc3R5bGUudG9wPXRoaXMudG9wKyJweCI6ZS5zdHlsZS50b3A9dGhpcy5wYXJlbnQuaGVpZ2h0LXRoaXMudG9wLXRoaXMuaGVpZ2h0KyJweCJ9LG8ucHJvdG90eXBlLl9yZXBhaW50RHJhZ0xlZnQ9ZnVuY3Rpb24oKXtpZih0aGlzLnNlbGVjdGVkJiZ0aGlzLm9wdGlvbnMuZWRpdGFibGUudXBkYXRlVGltZSYmIXRoaXMuZG9tLmRyYWdMZWZ0KXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LmNsYXNzTmFtZT0idmlzLWRyYWctbGVmdCIsdC5kcmFnTGVmdEl0ZW09dGhpcyx0aGlzLmRvbS5ib3guYXBwZW5kQ2hpbGQodCksdGhpcy5kb20uZHJhZ0xlZnQ9dH1lbHNlIXRoaXMuc2VsZWN0ZWQmJnRoaXMuZG9tLmRyYWdMZWZ0JiYodGhpcy5kb20uZHJhZ0xlZnQucGFyZW50Tm9kZSYmdGhpcy5kb20uZHJhZ0xlZnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRvbS5kcmFnTGVmdCksdGhpcy5kb20uZHJhZ0xlZnQ9bnVsbCl9LG8ucHJvdG90eXBlLl9yZXBhaW50RHJhZ1JpZ2h0PWZ1bmN0aW9uKCl7aWYodGhpcy5zZWxlY3RlZCYmdGhpcy5vcHRpb25zLmVkaXRhYmxlLnVwZGF0ZVRpbWUmJiF0aGlzLmRvbS5kcmFnUmlnaHQpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3QuY2xhc3NOYW1lPSJ2aXMtZHJhZy1yaWdodCIsdC5kcmFnUmlnaHRJdGVtPXRoaXMsdGhpcy5kb20uYm94LmFwcGVuZENoaWxkKHQpLHRoaXMuZG9tLmRyYWdSaWdodD10fWVsc2UhdGhpcy5zZWxlY3RlZCYmdGhpcy5kb20uZHJhZ1JpZ2h0JiYodGhpcy5kb20uZHJhZ1JpZ2h0LnBhcmVudE5vZGUmJnRoaXMuZG9tLmRyYWdSaWdodC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tLmRyYWdSaWdodCksdGhpcy5kb20uZHJhZ1JpZ2h0PW51bGwpfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGkpe3RoaXMuaWQ9bnVsbCx0aGlzLnBhcmVudD1udWxsLHRoaXMuZGF0YT10LHRoaXMuZG9tPW51bGwsdGhpcy5jb252ZXJzaW9uPWV8fHt9LHRoaXMub3B0aW9ucz1pfHx7fSx0aGlzLnNlbGVjdGVkPSExLHRoaXMuZGlzcGxheWVkPSExLHRoaXMuZGlydHk9ITAsdGhpcy50b3A9bnVsbCx0aGlzLnJpZ2h0PW51bGwsdGhpcy5sZWZ0PW51bGwsdGhpcy53aWR0aD1udWxsLHRoaXMuaGVpZ2h0PW51bGwsdGhpcy5lZGl0YWJsZT1udWxsLHRoaXMuZGF0YSYmdGhpcy5kYXRhLmhhc093blByb3BlcnR5KCJlZGl0YWJsZSIpJiYiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmRhdGEuZWRpdGFibGUmJih0aGlzLmVkaXRhYmxlPXQuZWRpdGFibGUpfXZhciBuPWkoMjIpLHM9aSgxKSxyPWkoMik7by5wcm90b3R5cGUuc3RhY2s9ITAsby5wcm90b3R5cGUuc2VsZWN0PWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZD0hMCx0aGlzLmRpcnR5PSEwLHRoaXMuZGlzcGxheWVkJiZ0aGlzLnJlZHJhdygpfSxvLnByb3RvdHlwZS51bnNlbGVjdD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWQ9ITEsdGhpcy5kaXJ0eT0hMCx0aGlzLmRpc3BsYXllZCYmdGhpcy5yZWRyYXcoKX0sby5wcm90b3R5cGUuc2V0RGF0YT1mdW5jdGlvbih0KXt2YXIgZT12b2lkIDAhPXQuZ3JvdXAmJnRoaXMuZGF0YS5ncm91cCE9dC5ncm91cDtlJiZ0aGlzLnBhcmVudC5pdGVtU2V0Ll9tb3ZlVG9Hcm91cCh0aGlzLHQuZ3JvdXApLHQuaGFzT3duUHJvcGVydHkoImVkaXRhYmxlIikmJiJib29sZWFuIj09dHlwZW9mIHQuZWRpdGFibGUmJih0aGlzLmVkaXRhYmxlPXQuZWRpdGFibGUpLHRoaXMuZGF0YT10LHRoaXMuZGlydHk9ITAsdGhpcy5kaXNwbGF5ZWQmJnRoaXMucmVkcmF3KCl9LG8ucHJvdG90eXBlLnNldFBhcmVudD1mdW5jdGlvbih0KXt0aGlzLmRpc3BsYXllZD8odGhpcy5oaWRlKCksdGhpcy5wYXJlbnQ9dCx0aGlzLnBhcmVudCYmdGhpcy5zaG93KCkpOnRoaXMucGFyZW50PXR9LG8ucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbih0KXtyZXR1cm4hMX0sby5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe3JldHVybiExfSxvLnByb3RvdHlwZS5oaWRlPWZ1bmN0aW9uKCl7cmV0dXJuITF9LG8ucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe30sby5wcm90b3R5cGUucmVwb3NpdGlvblg9ZnVuY3Rpb24oKXt9LG8ucHJvdG90eXBlLnJlcG9zaXRpb25ZPWZ1bmN0aW9uKCl7fSxvLnByb3RvdHlwZS5fcmVwYWludERlbGV0ZUJ1dHRvbj1mdW5jdGlvbih0KXt2YXIgZT0odGhpcy5vcHRpb25zLmVkaXRhYmxlLnJlbW92ZXx8dGhpcy5kYXRhLmVkaXRhYmxlPT09ITApJiZ0aGlzLmRhdGEuZWRpdGFibGUhPT0hMTtpZih0aGlzLnNlbGVjdGVkJiZlJiYhdGhpcy5kb20uZGVsZXRlQnV0dG9uKXt2YXIgaT10aGlzLG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5vcHRpb25zLnJ0bD9vLmNsYXNzTmFtZT0idmlzLWRlbGV0ZS1ydGwiOm8uY2xhc3NOYW1lPSJ2aXMtZGVsZXRlIixvLnRpdGxlPSJEZWxldGUgdGhpcyBpdGVtIixuZXcgbihvKS5vbigidGFwIixmdW5jdGlvbih0KXt0LnN0b3BQcm9wYWdhdGlvbigpLGkucGFyZW50LnJlbW92ZUZyb21EYXRhU2V0KGkpfSksdC5hcHBlbmRDaGlsZChvKSx0aGlzLmRvbS5kZWxldGVCdXR0b249b31lbHNlIXRoaXMuc2VsZWN0ZWQmJnRoaXMuZG9tLmRlbGV0ZUJ1dHRvbiYmKHRoaXMuZG9tLmRlbGV0ZUJ1dHRvbi5wYXJlbnROb2RlJiZ0aGlzLmRvbS5kZWxldGVCdXR0b24ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRvbS5kZWxldGVCdXR0b24pLHRoaXMuZG9tLmRlbGV0ZUJ1dHRvbj1udWxsKX0sby5wcm90b3R5cGUuX3JlcGFpbnRPbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcD1mdW5jdGlvbih0KXtpZih0aGlzLm9wdGlvbnMudG9vbHRpcE9uSXRlbVVwZGF0ZVRpbWUpe3ZhciBlPSh0aGlzLm9wdGlvbnMuZWRpdGFibGUudXBkYXRlVGltZXx8dGhpcy5kYXRhLmVkaXRhYmxlPT09ITApJiZ0aGlzLmRhdGEuZWRpdGFibGUhPT0hMTtpZih0aGlzLnNlbGVjdGVkJiZlJiYhdGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXApe3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2kuY2xhc3NOYW1lPSJ2aXMtb25VcGRhdGVUaW1lLXRvb2x0aXAiLHQuYXBwZW5kQ2hpbGQoaSksdGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXA9aX1lbHNlIXRoaXMuc2VsZWN0ZWQmJnRoaXMuZG9tLm9uSXRlbVVwZGF0ZVRpbWVUb29sdGlwJiYodGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAucGFyZW50Tm9kZSYmdGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRvbS5vbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcCksdGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXA9bnVsbCk7aWYodGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXApe3RoaXMuZG9tLm9uSXRlbVVwZGF0ZVRpbWVUb29sdGlwLnN0eWxlLnZpc2liaWxpdHk9dGhpcy5wYXJlbnQuaXRlbVNldC50b3VjaFBhcmFtcy5pdGVtSXNEcmFnZ2luZz8idmlzaWJsZSI6ImhpZGRlbiIsdGhpcy5vcHRpb25zLnJ0bD90aGlzLmRvbS5vbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcC5zdHlsZS5yaWdodD10aGlzLmRvbS5jb250ZW50LnN0eWxlLnJpZ2h0OnRoaXMuZG9tLm9uSXRlbVVwZGF0ZVRpbWVUb29sdGlwLnN0eWxlLmxlZnQ9dGhpcy5kb20uY29udGVudC5zdHlsZS5sZWZ0O3ZhciBvLG49NTAscz10aGlzLnBhcmVudC5pdGVtU2V0LmJvZHkuZG9tUHJvcHMuc2Nyb2xsVG9wO289InRvcCI9PXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5pdGVtP3RoaXMudG9wOnRoaXMucGFyZW50LmhlaWdodC10aGlzLnRvcC10aGlzLmhlaWdodDt2YXIgYT1vK3RoaXMucGFyZW50LnRvcC1uPC1zO2E/KHRoaXMuZG9tLm9uSXRlbVVwZGF0ZVRpbWVUb29sdGlwLnN0eWxlLmJvdHRvbT0iIix0aGlzLmRvbS5vbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcC5zdHlsZS50b3A9dGhpcy5oZWlnaHQrMisicHgiKToodGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAuc3R5bGUudG9wPSIiLHRoaXMuZG9tLm9uSXRlbVVwZGF0ZVRpbWVUb29sdGlwLnN0eWxlLmJvdHRvbT10aGlzLmhlaWdodCsyKyJweCIpO3ZhciBoLGQ7dGhpcy5vcHRpb25zLnRvb2x0aXBPbkl0ZW1VcGRhdGVUaW1lJiZ0aGlzLm9wdGlvbnMudG9vbHRpcE9uSXRlbVVwZGF0ZVRpbWUudGVtcGxhdGU/KGQ9dGhpcy5vcHRpb25zLnRvb2x0aXBPbkl0ZW1VcGRhdGVUaW1lLnRlbXBsYXRlLmJpbmQodGhpcyksaD1kKHRoaXMuZGF0YSkpOihoPSJzdGFydDogIityKHRoaXMuZGF0YS5zdGFydCkuZm9ybWF0KCJNTS9ERC9ZWVlZIGhoOm1tIiksdGhpcy5kYXRhLmVuZCYmKGgrPSI8YnI+IGVuZDogIityKHRoaXMuZGF0YS5lbmQpLmZvcm1hdCgiTU0vREQvWVlZWSBoaDptbSIpKSksdGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAuaW5uZXJIVE1MPWh9fX0sby5wcm90b3R5cGUuX3VwZGF0ZUNvbnRlbnRzPWZ1bmN0aW9uKHQpe3ZhciBlLGk7aWYodGhpcy5vcHRpb25zLnRlbXBsYXRlKXt2YXIgbz10aGlzLnBhcmVudC5pdGVtU2V0Lml0ZW1zRGF0YS5nZXQodGhpcy5pZCk7aT10aGlzLm9wdGlvbnMudGVtcGxhdGUuYmluZCh0aGlzKSxlPWkobyx0KX1lbHNlIGU9dGhpcy5kYXRhLmNvbnRlbnQ7aWYoZSBpbnN0YW5jZW9mIE9iamVjdCYmIShlIGluc3RhbmNlb2YgRWxlbWVudCkpaShvLHQpO2Vsc2V7dmFyIG49dGhpcy5fY29udGVudFRvU3RyaW5nKHRoaXMuY29udGVudCkhPT10aGlzLl9jb250ZW50VG9TdHJpbmcoZSk7aWYobil7aWYoZSBpbnN0YW5jZW9mIEVsZW1lbnQpdC5pbm5lckhUTUw9IiIsdC5hcHBlbmRDaGlsZChlKTtlbHNlIGlmKHZvaWQgMCE9ZSl0LmlubmVySFRNTD1lO2Vsc2UgaWYoImJhY2tncm91bmQiIT10aGlzLmRhdGEudHlwZXx8dm9pZCAwIT09dGhpcy5kYXRhLmNvbnRlbnQpdGhyb3cgbmV3IEVycm9yKCdQcm9wZXJ0eSAiY29udGVudCIgbWlzc2luZyBpbiBpdGVtICcrdGhpcy5pZCk7dGhpcy5jb250ZW50PWV9fX0sby5wcm90b3R5cGUuX3VwZGF0ZVRpdGxlPWZ1bmN0aW9uKHQpe251bGwhPXRoaXMuZGF0YS50aXRsZT90LnRpdGxlPXRoaXMuZGF0YS50aXRsZXx8IiI6dC5yZW1vdmVBdHRyaWJ1dGUoInZpcy10aXRsZSIpfSxvLnByb3RvdHlwZS5fdXBkYXRlRGF0YUF0dHJpYnV0ZXM9ZnVuY3Rpb24odCl7aWYodGhpcy5vcHRpb25zLmRhdGFBdHRyaWJ1dGVzJiZ0aGlzLm9wdGlvbnMuZGF0YUF0dHJpYnV0ZXMubGVuZ3RoPjApe3ZhciBlPVtdO2lmKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zLmRhdGFBdHRyaWJ1dGVzKSllPXRoaXMub3B0aW9ucy5kYXRhQXR0cmlidXRlcztlbHNle2lmKCJhbGwiIT10aGlzLm9wdGlvbnMuZGF0YUF0dHJpYnV0ZXMpcmV0dXJuO2U9T2JqZWN0LmtleXModGhpcy5kYXRhKX1mb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXSxuPXRoaXMuZGF0YVtvXTtudWxsIT1uP3Quc2V0QXR0cmlidXRlKCJkYXRhLSIrbyxuKTp0LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS0iK28pfX19LG8ucHJvdG90eXBlLl91cGRhdGVTdHlsZT1mdW5jdGlvbih0KXt0aGlzLnN0eWxlJiYocy5yZW1vdmVDc3NUZXh0KHQsdGhpcy5zdHlsZSksdGhpcy5zdHlsZT1udWxsKSx0aGlzLmRhdGEuc3R5bGUmJihzLmFkZENzc1RleHQodCx0aGlzLmRhdGEuc3R5bGUpLHRoaXMuc3R5bGU9dGhpcy5kYXRhLnN0eWxlKX0sby5wcm90b3R5cGUuX2NvbnRlbnRUb1N0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/dDp0JiYib3V0ZXJIVE1MImluIHQ/dC5vdXRlckhUTUw6dH0sby5wcm90b3R5cGUuZ2V0V2lkdGhMZWZ0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LG8ucHJvdG90eXBlLmdldFdpZHRoUmlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sby5wcm90b3R5cGUuX3JlcGFpbnREcmFnQ2VudGVyPWZ1bmN0aW9uKCl7aWYodGhpcy5zZWxlY3RlZCYmdGhpcy5vcHRpb25zLmVkaXRhYmxlLnVwZGF0ZVRpbWUmJiF0aGlzLmRvbS5kcmFnQ2VudGVyKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LmNsYXNzTmFtZT0idmlzLWRyYWctY2VudGVyIix0LmRyYWdDZW50ZXJJdGVtPXRoaXMsdGhpcy5kb20uYm94P3RoaXMuZG9tLmJveC5hcHBlbmRDaGlsZCh0KTp0aGlzLmRvbS5wb2ludCYmdGhpcy5kb20ucG9pbnQuYXBwZW5kQ2hpbGQodCksdGhpcy5kb20uZHJhZ0NlbnRlcj10fWVsc2UhdGhpcy5zZWxlY3RlZCYmdGhpcy5kb20uZHJhZ0NlbnRlciYmKHRoaXMuZG9tLmRyYWdDZW50ZXIucGFyZW50Tm9kZSYmdGhpcy5kb20uZHJhZ0NlbnRlci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tLmRyYWdDZW50ZXIpLHRoaXMuZG9tLmRyYWdDZW50ZXI9bnVsbCl9LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUsaSl7bi5jYWxsKHRoaXMsdCxlLGkpLHRoaXMud2lkdGg9MCx0aGlzLmhlaWdodD0wLHRoaXMudG9wPTAsdGhpcy5sZWZ0PTB9dmFyIG49KGkoMSksaSgzOCkpO28ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpLG8ucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbih0LGUsaSl7dmFyIG89ITE7dGhpcy52aXNpYmxlSXRlbXM9dGhpcy5fdXBkYXRlVmlzaWJsZUl0ZW1zKHRoaXMub3JkZXJlZEl0ZW1zLHRoaXMudmlzaWJsZUl0ZW1zLHQpLHRoaXMud2lkdGg9dGhpcy5kb20uYmFja2dyb3VuZC5vZmZzZXRXaWR0aCx0aGlzLmRvbS5iYWNrZ3JvdW5kLnN0eWxlLmhlaWdodD0iMCI7Zm9yKHZhciBuPTAscz10aGlzLnZpc2libGVJdGVtcy5sZW5ndGg7bjxzO24rKyl7dmFyIHI9dGhpcy52aXNpYmxlSXRlbXNbbl07ci5yZXBvc2l0aW9uWShlKX1yZXR1cm4gb30sby5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe3RoaXMuZG9tLmJhY2tncm91bmQucGFyZW50Tm9kZXx8dGhpcy5pdGVtU2V0LmRvbS5iYWNrZ3JvdW5kLmFwcGVuZENoaWxkKHRoaXMuZG9tLmJhY2tncm91bmQpfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGkpe2lmKHRoaXMucHJvcHM9e2RvdDp7d2lkdGg6MCxoZWlnaHQ6MH0sbGluZTp7d2lkdGg6MCxoZWlnaHQ6MH19LHRoaXMub3B0aW9ucz1pLHQmJnZvaWQgMD09dC5zdGFydCl0aHJvdyBuZXcgRXJyb3IoJ1Byb3BlcnR5ICJzdGFydCIgbWlzc2luZyBpbiBpdGVtICcrdCk7bi5jYWxsKHRoaXMsdCxlLGkpfXZhciBuPWkoNDEpO2koMSk7by5wcm90b3R5cGU9bmV3IG4obnVsbCxudWxsLG51bGwpLG8ucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbih0KXt2YXIgZSxpPXRoaXMub3B0aW9ucy5hbGlnbixvPSh0LmVuZC10LnN0YXJ0KS90LmJvZHkuZG9tLmNlbnRlci5jbGllbnRXaWR0aCxuPXRoaXMud2lkdGgqbztyZXR1cm4gZT0icmlnaHQiPT1pP3RoaXMuZGF0YS5zdGFydC5nZXRUaW1lKCk+dC5zdGFydCYmdGhpcy5kYXRhLnN0YXJ0LmdldFRpbWUoKS1uPHQuZW5kOiJsZWZ0Ij09aT90aGlzLmRhdGEuc3RhcnQuZ2V0VGltZSgpK24+dC5zdGFydCYmdGhpcy5kYXRhLnN0YXJ0LmdldFRpbWUoKTx0LmVuZDp0aGlzLmRhdGEuc3RhcnQuZ2V0VGltZSgpK24vMj50LnN0YXJ0JiZ0aGlzLmRhdGEuc3RhcnQuZ2V0VGltZSgpLW4vMjx0LmVuZH0sby5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kb207aWYodHx8KHRoaXMuZG9tPXt9LHQ9dGhpcy5kb20sdC5ib3g9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIiksdC5jb250ZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLHQuY29udGVudC5jbGFzc05hbWU9InZpcy1pdGVtLWNvbnRlbnQiLHQuYm94LmFwcGVuZENoaWxkKHQuY29udGVudCksdC5saW5lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLHQubGluZS5jbGFzc05hbWU9InZpcy1saW5lIix0LmRvdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSx0LmRvdC5jbGFzc05hbWU9InZpcy1kb3QiLHQuYm94WyJ0aW1lbGluZS1pdGVtIl09dGhpcyx0aGlzLmRpcnR5PSEwKSwhdGhpcy5wYXJlbnQpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcmVkcmF3IGl0ZW06IG5vIHBhcmVudCBhdHRhY2hlZCIpO2lmKCF0LmJveC5wYXJlbnROb2RlKXt2YXIgZT10aGlzLnBhcmVudC5kb20uZm9yZWdyb3VuZDtpZighZSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCByZWRyYXcgaXRlbTogcGFyZW50IGhhcyBubyBmb3JlZ3JvdW5kIGNvbnRhaW5lciBlbGVtZW50Iik7ZS5hcHBlbmRDaGlsZCh0LmJveCl9aWYoIXQubGluZS5wYXJlbnROb2RlKXt2YXIgaT10aGlzLnBhcmVudC5kb20uYmFja2dyb3VuZDtpZighaSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCByZWRyYXcgaXRlbTogcGFyZW50IGhhcyBubyBiYWNrZ3JvdW5kIGNvbnRhaW5lciBlbGVtZW50Iik7aS5hcHBlbmRDaGlsZCh0LmxpbmUpfWlmKCF0LmRvdC5wYXJlbnROb2RlKXt2YXIgbz10aGlzLnBhcmVudC5kb20uYXhpcztpZighaSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCByZWRyYXcgaXRlbTogcGFyZW50IGhhcyBubyBheGlzIGNvbnRhaW5lciBlbGVtZW50Iik7by5hcHBlbmRDaGlsZCh0LmRvdCl9aWYodGhpcy5kaXNwbGF5ZWQ9ITAsdGhpcy5kaXJ0eSl7dGhpcy5fdXBkYXRlQ29udGVudHModGhpcy5kb20uY29udGVudCksdGhpcy5fdXBkYXRlVGl0bGUodGhpcy5kb20uYm94KSx0aGlzLl91cGRhdGVEYXRhQXR0cmlidXRlcyh0aGlzLmRvbS5ib3gpLHRoaXMuX3VwZGF0ZVN0eWxlKHRoaXMuZG9tLmJveCk7dmFyIG49KHRoaXMub3B0aW9ucy5lZGl0YWJsZS51cGRhdGVUaW1lfHx0aGlzLm9wdGlvbnMuZWRpdGFibGUudXBkYXRlR3JvdXB8fHRoaXMuZWRpdGFibGU9PT0hMCkmJnRoaXMuZWRpdGFibGUhPT0hMSxzPSh0aGlzLmRhdGEuY2xhc3NOYW1lPyIgIit0aGlzLmRhdGEuY2xhc3NOYW1lOiIiKSsodGhpcy5zZWxlY3RlZD8iIHZpcy1zZWxlY3RlZCI6IiIpKyhuPyIgdmlzLWVkaXRhYmxlIjoiIHZpcy1yZWFkb25seSIpO3QuYm94LmNsYXNzTmFtZT0idmlzLWl0ZW0gdmlzLWJveCIrcyx0LmxpbmUuY2xhc3NOYW1lPSJ2aXMtaXRlbSB2aXMtbGluZSIrcyx0LmRvdC5jbGFzc05hbWU9InZpcy1pdGVtIHZpcy1kb3QiK3M7dmFyIHI9dC5ib3guc3R5bGUucmlnaHQsYT10LmJveC5zdHlsZS5sZWZ0O3RoaXMub3B0aW9ucy5ydGw/dC5ib3guc3R5bGUucmlnaHQ9IjBweCI6dC5ib3guc3R5bGUubGVmdD0iMHB4Iix0aGlzLnByb3BzLmRvdC5oZWlnaHQ9dC5kb3Qub2Zmc2V0SGVpZ2h0LHRoaXMucHJvcHMuZG90LndpZHRoPXQuZG90Lm9mZnNldFdpZHRoLHRoaXMucHJvcHMubGluZS53aWR0aD10LmxpbmUub2Zmc2V0V2lkdGgsdGhpcy53aWR0aD10LmJveC5vZmZzZXRXaWR0aCx0aGlzLmhlaWdodD10LmJveC5vZmZzZXRIZWlnaHQsdGhpcy5vcHRpb25zLnJ0bD90LmJveC5zdHlsZS5yaWdodD1yOnQuYm94LnN0eWxlLmxlZnQ9YSx0aGlzLmRpcnR5PSExfXRoaXMuX3JlcGFpbnRPbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcCh0LmJveCksdGhpcy5fcmVwYWludERyYWdDZW50ZXIoKSx0aGlzLl9yZXBhaW50RGVsZXRlQnV0dG9uKHQuYm94KX0sby5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe3RoaXMuZGlzcGxheWVkfHx0aGlzLnJlZHJhdygpfSxvLnByb3RvdHlwZS5oaWRlPWZ1bmN0aW9uKCl7aWYodGhpcy5kaXNwbGF5ZWQpe3ZhciB0PXRoaXMuZG9tO3QuYm94LnBhcmVudE5vZGUmJnQuYm94LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodC5ib3gpLHQubGluZS5wYXJlbnROb2RlJiZ0LmxpbmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0LmxpbmUpLHQuZG90LnBhcmVudE5vZGUmJnQuZG90LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodC5kb3QpLHRoaXMuZGlzcGxheWVkPSExfX0sby5wcm90b3R5cGUucmVwb3NpdGlvblg9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvbnZlcnNpb24udG9TY3JlZW4odGhpcy5kYXRhLnN0YXJ0KSxlPXRoaXMub3B0aW9ucy5hbGlnbjsicmlnaHQiPT1lP3RoaXMub3B0aW9ucy5ydGw/KHRoaXMucmlnaHQ9dC10aGlzLndpZHRoLHRoaXMuZG9tLmJveC5zdHlsZS5yaWdodD10aGlzLnJpZ2h0KyJweCIsdGhpcy5kb20ubGluZS5zdHlsZS5yaWdodD10LXRoaXMucHJvcHMubGluZS53aWR0aCsicHgiLHRoaXMuZG9tLmRvdC5zdHlsZS5yaWdodD10LXRoaXMucHJvcHMubGluZS53aWR0aC8yLXRoaXMucHJvcHMuZG90LndpZHRoLzIrInB4Iik6KHRoaXMubGVmdD10LXRoaXMud2lkdGgsdGhpcy5kb20uYm94LnN0eWxlLmxlZnQ9dGhpcy5sZWZ0KyJweCIsdGhpcy5kb20ubGluZS5zdHlsZS5sZWZ0PXQtdGhpcy5wcm9wcy5saW5lLndpZHRoKyJweCIsdGhpcy5kb20uZG90LnN0eWxlLmxlZnQ9dC10aGlzLnByb3BzLmxpbmUud2lkdGgvMi10aGlzLnByb3BzLmRvdC53aWR0aC8yKyJweCIpOiJsZWZ0Ij09ZT90aGlzLm9wdGlvbnMucnRsPyh0aGlzLnJpZ2h0PXQsdGhpcy5kb20uYm94LnN0eWxlLnJpZ2h0PXRoaXMucmlnaHQrInB4Iix0aGlzLmRvbS5saW5lLnN0eWxlLnJpZ2h0PXQrInB4Iix0aGlzLmRvbS5kb3Quc3R5bGUucmlnaHQ9dCt0aGlzLnByb3BzLmxpbmUud2lkdGgvMi10aGlzLnByb3BzLmRvdC53aWR0aC8yKyJweCIpOih0aGlzLmxlZnQ9dCx0aGlzLmRvbS5ib3guc3R5bGUubGVmdD10aGlzLmxlZnQrInB4Iix0aGlzLmRvbS5saW5lLnN0eWxlLmxlZnQ9dCsicHgiLHRoaXMuZG9tLmRvdC5zdHlsZS5sZWZ0PXQrdGhpcy5wcm9wcy5saW5lLndpZHRoLzItdGhpcy5wcm9wcy5kb3Qud2lkdGgvMisicHgiKTp0aGlzLm9wdGlvbnMucnRsPyh0aGlzLnJpZ2h0PXQtdGhpcy53aWR0aC8yLHRoaXMuZG9tLmJveC5zdHlsZS5yaWdodD10aGlzLnJpZ2h0KyJweCIsdGhpcy5kb20ubGluZS5zdHlsZS5yaWdodD10LXRoaXMucHJvcHMubGluZS53aWR0aCsicHgiLHRoaXMuZG9tLmRvdC5zdHlsZS5yaWdodD10LXRoaXMucHJvcHMuZG90LndpZHRoLzIrInB4Iik6KHRoaXMubGVmdD10LXRoaXMud2lkdGgvMix0aGlzLmRvbS5ib3guc3R5bGUubGVmdD10aGlzLmxlZnQrInB4Iix0aGlzLmRvbS5saW5lLnN0eWxlLmxlZnQ9dC10aGlzLnByb3BzLmxpbmUud2lkdGgvMisicHgiLHRoaXMuZG9tLmRvdC5zdHlsZS5sZWZ0PXQtdGhpcy5wcm9wcy5kb3Qud2lkdGgvMisicHgiKX0sby5wcm90b3R5cGUucmVwb3NpdGlvblk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMub3JpZW50YXRpb24uaXRlbSxlPXRoaXMuZG9tLmJveCxpPXRoaXMuZG9tLmxpbmUsbz10aGlzLmRvbS5kb3Q7aWYoInRvcCI9PXQpZS5zdHlsZS50b3A9KHRoaXMudG9wfHwwKSsicHgiLGkuc3R5bGUudG9wPSIwIixpLnN0eWxlLmhlaWdodD10aGlzLnBhcmVudC50b3ArdGhpcy50b3ArMSsicHgiLGkuc3R5bGUuYm90dG9tPSIiO2Vsc2V7dmFyIG49dGhpcy5wYXJlbnQuaXRlbVNldC5wcm9wcy5oZWlnaHQscz1uLXRoaXMucGFyZW50LnRvcC10aGlzLnBhcmVudC5oZWlnaHQrdGhpcy50b3A7ZS5zdHlsZS50b3A9KHRoaXMucGFyZW50LmhlaWdodC10aGlzLnRvcC10aGlzLmhlaWdodHx8MCkrInB4IixpLnN0eWxlLnRvcD1uLXMrInB4IixpLnN0eWxlLmJvdHRvbT0iMCJ9by5zdHlsZS50b3A9LXRoaXMucHJvcHMuZG90LmhlaWdodC8yKyJweCJ9LG8ucHJvdG90eXBlLmdldFdpZHRoTGVmdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLndpZHRoLzJ9LG8ucHJvdG90eXBlLmdldFdpZHRoUmlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53aWR0aC8yfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGkpe2lmKHRoaXMucHJvcHM9e2RvdDp7dG9wOjAsd2lkdGg6MCxoZWlnaHQ6MH0sY29udGVudDp7aGVpZ2h0OjAsbWFyZ2luTGVmdDowLG1hcmdpblJpZ2h0OjB9fSx0aGlzLm9wdGlvbnM9aSx0JiZ2b2lkIDA9PXQuc3RhcnQpdGhyb3cgbmV3IEVycm9yKCdQcm9wZXJ0eSAic3RhcnQiIG1pc3NpbmcgaW4gaXRlbSAnK3QpO24uY2FsbCh0aGlzLHQsZSxpKX12YXIgbj1pKDQxKTtvLnByb3RvdHlwZT1uZXcgbihudWxsLG51bGwsbnVsbCksby5wcm90b3R5cGUuaXNWaXNpYmxlPWZ1bmN0aW9uKHQpe3ZhciBlPSh0LmVuZC10LnN0YXJ0KS90LmJvZHkuZG9tLmNlbnRlci5jbGllbnRXaWR0aCxpPXRoaXMud2lkdGgqZTtyZXR1cm4gdGhpcy5kYXRhLnN0YXJ0LmdldFRpbWUoKStpPnQuc3RhcnQmJnRoaXMuZGF0YS5zdGFydDx0LmVuZH0sby5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kb207aWYodHx8KHRoaXMuZG9tPXt9LHQ9dGhpcy5kb20sdC5wb2ludD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0LmNvbnRlbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdC5jb250ZW50LmNsYXNzTmFtZT0idmlzLWl0ZW0tY29udGVudCIsdC5wb2ludC5hcHBlbmRDaGlsZCh0LmNvbnRlbnQpLHQuZG90PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHQucG9pbnQuYXBwZW5kQ2hpbGQodC5kb3QpLHQucG9pbnRbInRpbWVsaW5lLWl0ZW0iXT10aGlzLHRoaXMuZGlydHk9ITApLCF0aGlzLnBhcmVudCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCByZWRyYXcgaXRlbTogbm8gcGFyZW50IGF0dGFjaGVkIik7aWYoIXQucG9pbnQucGFyZW50Tm9kZSl7dmFyIGU9dGhpcy5wYXJlbnQuZG9tLmZvcmVncm91bmQ7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcmVkcmF3IGl0ZW06IHBhcmVudCBoYXMgbm8gZm9yZWdyb3VuZCBjb250YWluZXIgZWxlbWVudCIpO2UuYXBwZW5kQ2hpbGQodC5wb2ludCl9aWYodGhpcy5kaXNwbGF5ZWQ9ITAsdGhpcy5kaXJ0eSl7dGhpcy5fdXBkYXRlQ29udGVudHModGhpcy5kb20uY29udGVudCksdGhpcy5fdXBkYXRlVGl0bGUodGhpcy5kb20ucG9pbnQpLHRoaXMuX3VwZGF0ZURhdGFBdHRyaWJ1dGVzKHRoaXMuZG9tLnBvaW50KSx0aGlzLl91cGRhdGVTdHlsZSh0aGlzLmRvbS5wb2ludCk7dmFyIGk9KHRoaXMub3B0aW9ucy5lZGl0YWJsZS51cGRhdGVUaW1lfHx0aGlzLm9wdGlvbnMuZWRpdGFibGUudXBkYXRlR3JvdXB8fHRoaXMuZWRpdGFibGU9PT0hMCkmJnRoaXMuZWRpdGFibGUhPT0hMSxvPSh0aGlzLmRhdGEuY2xhc3NOYW1lPyIgIit0aGlzLmRhdGEuY2xhc3NOYW1lOiIiKSsodGhpcy5zZWxlY3RlZD8iIHZpcy1zZWxlY3RlZCI6IiIpKyhpPyIgdmlzLWVkaXRhYmxlIjoiIHZpcy1yZWFkb25seSIpO3QucG9pbnQuY2xhc3NOYW1lPSJ2aXMtaXRlbSB2aXMtcG9pbnQiK28sdC5kb3QuY2xhc3NOYW1lPSJ2aXMtaXRlbSB2aXMtZG90IitvLHRoaXMucHJvcHMuZG90LndpZHRoPXQuZG90Lm9mZnNldFdpZHRoLHRoaXMucHJvcHMuZG90LmhlaWdodD10LmRvdC5vZmZzZXRIZWlnaHQsdGhpcy5wcm9wcy5jb250ZW50LmhlaWdodD10LmNvbnRlbnQub2Zmc2V0SGVpZ2h0LHRoaXMub3B0aW9ucy5ydGw/dC5jb250ZW50LnN0eWxlLm1hcmdpblJpZ2h0PTIqdGhpcy5wcm9wcy5kb3Qud2lkdGgrInB4Ijp0LmNvbnRlbnQuc3R5bGUubWFyZ2luTGVmdD0yKnRoaXMucHJvcHMuZG90LndpZHRoKyJweCIsdGhpcy53aWR0aD10LnBvaW50Lm9mZnNldFdpZHRoLHRoaXMuaGVpZ2h0PXQucG9pbnQub2Zmc2V0SGVpZ2h0LHQuZG90LnN0eWxlLnRvcD0odGhpcy5oZWlnaHQtdGhpcy5wcm9wcy5kb3QuaGVpZ2h0KS8yKyJweCIsdGhpcy5vcHRpb25zLnJ0bD90LmRvdC5zdHlsZS5yaWdodD10aGlzLnByb3BzLmRvdC53aWR0aC8yKyJweCI6dC5kb3Quc3R5bGUubGVmdD10aGlzLnByb3BzLmRvdC53aWR0aC8yKyJweCIsdGhpcy5kaXJ0eT0hMX10aGlzLl9yZXBhaW50T25JdGVtVXBkYXRlVGltZVRvb2x0aXAodC5wb2ludCksdGhpcy5fcmVwYWludERyYWdDZW50ZXIoKSx0aGlzLl9yZXBhaW50RGVsZXRlQnV0dG9uKHQucG9pbnQpfSxvLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5ZWR8fHRoaXMucmVkcmF3KCl9LG8ucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oKXt0aGlzLmRpc3BsYXllZCYmKHRoaXMuZG9tLnBvaW50LnBhcmVudE5vZGUmJnRoaXMuZG9tLnBvaW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20ucG9pbnQpLHRoaXMuZGlzcGxheWVkPSExKX0sby5wcm90b3R5cGUucmVwb3NpdGlvblg9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvbnZlcnNpb24udG9TY3JlZW4odGhpcy5kYXRhLnN0YXJ0KTt0aGlzLm9wdGlvbnMucnRsPyh0aGlzLnJpZ2h0PXQtdGhpcy5wcm9wcy5kb3Qud2lkdGgsdGhpcy5kb20ucG9pbnQuc3R5bGUucmlnaHQ9dGhpcy5yaWdodCsicHgiKToodGhpcy5sZWZ0PXQtdGhpcy5wcm9wcy5kb3Qud2lkdGgsdGhpcy5kb20ucG9pbnQuc3R5bGUubGVmdD10aGlzLmxlZnQrInB4Iil9LG8ucHJvdG90eXBlLnJlcG9zaXRpb25ZPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLml0ZW0sZT10aGlzLmRvbS5wb2ludDsidG9wIj09dD9lLnN0eWxlLnRvcD10aGlzLnRvcCsicHgiOmUuc3R5bGUudG9wPXRoaXMucGFyZW50LmhlaWdodC10aGlzLnRvcC10aGlzLmhlaWdodCsicHgifSxvLnByb3RvdHlwZS5nZXRXaWR0aExlZnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcm9wcy5kb3Qud2lkdGh9LG8ucHJvdG90eXBlLmdldFdpZHRoUmlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcm9wcy5kb3Qud2lkdGh9LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUsaSl7aWYodGhpcy5wcm9wcz17Y29udGVudDp7d2lkdGg6MH19LHRoaXMub3ZlcmZsb3c9ITEsdCl7aWYodm9pZCAwPT10LnN0YXJ0KXRocm93IG5ldyBFcnJvcignUHJvcGVydHkgInN0YXJ0IiBtaXNzaW5nIGluIGl0ZW0gJyt0LmlkKTtpZih2b2lkIDA9PXQuZW5kKXRocm93IG5ldyBFcnJvcignUHJvcGVydHkgImVuZCIgbWlzc2luZyBpbiBpdGVtICcrdC5pZCl9bi5jYWxsKHRoaXMsdCxlLGkpfXZhciBuPShpKDIyKSxpKDQxKSkscz1pKDQyKSxyPWkoNDApO28ucHJvdG90eXBlPW5ldyBuKG51bGwsbnVsbCxudWxsKSxvLnByb3RvdHlwZS5iYXNlQ2xhc3NOYW1lPSJ2aXMtaXRlbSB2aXMtYmFja2dyb3VuZCIsby5wcm90b3R5cGUuc3RhY2s9ITEsby5wcm90b3R5cGUuaXNWaXNpYmxlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRhdGEuc3RhcnQ8dC5lbmQmJnRoaXMuZGF0YS5lbmQ+dC5zdGFydH0sby5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kb207aWYodHx8KHRoaXMuZG9tPXt9LHQ9dGhpcy5kb20sdC5ib3g9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdC5mcmFtZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0LmZyYW1lLmNsYXNzTmFtZT0idmlzLWl0ZW0tb3ZlcmZsb3ciLHQuYm94LmFwcGVuZENoaWxkKHQuZnJhbWUpLHQuY29udGVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0LmNvbnRlbnQuY2xhc3NOYW1lPSJ2aXMtaXRlbS1jb250ZW50Iix0LmZyYW1lLmFwcGVuZENoaWxkKHQuY29udGVudCksdGhpcy5kaXJ0eT0hMCksIXRoaXMucGFyZW50KXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHJlZHJhdyBpdGVtOiBubyBwYXJlbnQgYXR0YWNoZWQiKTtpZighdC5ib3gucGFyZW50Tm9kZSl7dmFyIGU9dGhpcy5wYXJlbnQuZG9tLmJhY2tncm91bmQ7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcmVkcmF3IGl0ZW06IHBhcmVudCBoYXMgbm8gYmFja2dyb3VuZCBjb250YWluZXIgZWxlbWVudCIpO2UuYXBwZW5kQ2hpbGQodC5ib3gpfWlmKHRoaXMuZGlzcGxheWVkPSEwLHRoaXMuZGlydHkpe3RoaXMuX3VwZGF0ZUNvbnRlbnRzKHRoaXMuZG9tLmNvbnRlbnQpLHRoaXMuX3VwZGF0ZVRpdGxlKHRoaXMuZG9tLmNvbnRlbnQpLHRoaXMuX3VwZGF0ZURhdGFBdHRyaWJ1dGVzKHRoaXMuZG9tLmNvbnRlbnQpLHRoaXMuX3VwZGF0ZVN0eWxlKHRoaXMuZG9tLmJveCk7dmFyIGk9KHRoaXMuZGF0YS5jbGFzc05hbWU/IiAiK3RoaXMuZGF0YS5jbGFzc05hbWU6IiIpKyh0aGlzLnNlbGVjdGVkPyIgdmlzLXNlbGVjdGVkIjoiIik7dC5ib3guY2xhc3NOYW1lPXRoaXMuYmFzZUNsYXNzTmFtZStpLHRoaXMub3ZlcmZsb3c9ImhpZGRlbiIhPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0LmNvbnRlbnQpLm92ZXJmbG93LHRoaXMucHJvcHMuY29udGVudC53aWR0aD10aGlzLmRvbS5jb250ZW50Lm9mZnNldFdpZHRoLHRoaXMuaGVpZ2h0PTAsdGhpcy5kaXJ0eT0hMX19LG8ucHJvdG90eXBlLnNob3c9ci5wcm90b3R5cGUuc2hvdyxvLnByb3RvdHlwZS5oaWRlPXIucHJvdG90eXBlLmhpZGUsby5wcm90b3R5cGUucmVwb3NpdGlvblg9ci5wcm90b3R5cGUucmVwb3NpdGlvblgsby5wcm90b3R5cGUucmVwb3NpdGlvblk9ZnVuY3Rpb24odCl7dmFyIGU9InRvcCI9PT10aGlzLm9wdGlvbnMub3JpZW50YXRpb24uaXRlbTt0aGlzLmRvbS5jb250ZW50LnN0eWxlLnRvcD1lPyIiOiIwIix0aGlzLmRvbS5jb250ZW50LnN0eWxlLmJvdHRvbT1lPyIwIjoiIjt2YXIgaTtpZih2b2lkIDAhPT10aGlzLmRhdGEuc3ViZ3JvdXApe3ZhciBvPXRoaXMuZGF0YS5zdWJncm91cCxuPXRoaXMucGFyZW50LnN1Ymdyb3VwcyxyPW5bb10uaW5kZXg7aWYoMT09ZSl7aT10aGlzLnBhcmVudC5zdWJncm91cHNbb10uaGVpZ2h0K3QuaXRlbS52ZXJ0aWNhbCxpKz0wPT1yP3QuYXhpcy0uNSp0Lml0ZW0udmVydGljYWw6MDt2YXIgYT10aGlzLnBhcmVudC50b3A7Zm9yKHZhciBoIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShoKSYmMT09bltoXS52aXNpYmxlJiZuW2hdLmluZGV4PHImJihhKz1uW2hdLmhlaWdodCt0Lml0ZW0udmVydGljYWwpO2ErPTAhPXI/dC5heGlzLS41KnQuaXRlbS52ZXJ0aWNhbDowLHRoaXMuZG9tLmJveC5zdHlsZS50b3A9YSsicHgiLHRoaXMuZG9tLmJveC5zdHlsZS5ib3R0b209IiJ9ZWxzZXt2YXIgYT10aGlzLnBhcmVudC50b3AsZD0wO2Zvcih2YXIgaCBpbiBuKWlmKG4uaGFzT3duUHJvcGVydHkoaCkmJjE9PW5baF0udmlzaWJsZSl7dmFyIGw9bltoXS5oZWlnaHQrdC5pdGVtLnZlcnRpY2FsO2QrPWwsbltoXS5pbmRleD5yJiYoYSs9bCl9aT10aGlzLnBhcmVudC5zdWJncm91cHNbb10uaGVpZ2h0K3QuaXRlbS52ZXJ0aWNhbCx0aGlzLmRvbS5ib3guc3R5bGUudG9wPXRoaXMucGFyZW50LmhlaWdodC1kK2ErInB4Iix0aGlzLmRvbS5ib3guc3R5bGUuYm90dG9tPSIifX1lbHNlIHRoaXMucGFyZW50IGluc3RhbmNlb2Ygcz8oaT1NYXRoLm1heCh0aGlzLnBhcmVudC5oZWlnaHQsdGhpcy5wYXJlbnQuaXRlbVNldC5ib2R5LmRvbVByb3BzLmNlbnRlci5oZWlnaHQsdGhpcy5wYXJlbnQuaXRlbVNldC5ib2R5LmRvbVByb3BzLmNlbnRlckNvbnRhaW5lci5oZWlnaHQpLHRoaXMuZG9tLmJveC5zdHlsZS50b3A9ZT8iMCI6IiIsdGhpcy5kb20uYm94LnN0eWxlLmJvdHRvbT1lPyIiOiIwIik6KGk9dGhpcy5wYXJlbnQuaGVpZ2h0LHRoaXMuZG9tLmJveC5zdHlsZS50b3A9dGhpcy5wYXJlbnQudG9wKyJweCIsdGhpcy5kb20uYm94LnN0eWxlLmJvdHRvbT0iIik7dGhpcy5kb20uYm94LnN0eWxlLmhlaWdodD1pKyJweCJ9LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUpe3RoaXMuZG9tPXtmb3JlZ3JvdW5kOm51bGwsbGluZXM6W10sbWFqb3JUZXh0czpbXSxtaW5vclRleHRzOltdLHJlZHVuZGFudDp7bGluZXM6W10sbWFqb3JUZXh0czpbXSxtaW5vclRleHRzOltdfX0sdGhpcy5wcm9wcz17cmFuZ2U6e3N0YXJ0OjAsZW5kOjAsbWluaW11bVN0ZXA6MH0sbGluZVRvcDowfSx0aGlzLmRlZmF1bHRPcHRpb25zPXtvcmllbnRhdGlvbjp7YXhpczoiYm90dG9tIn0sc2hvd01pbm9yTGFiZWxzOiEwLHNob3dNYWpvckxhYmVsczohMCxtYXhNaW5vckNoYXJzOjcsZm9ybWF0OmEuRk9STUFULG1vbWVudDpkLHRpbWVBeGlzOm51bGx9LHRoaXMub3B0aW9ucz1zLmV4dGVuZCh7fSx0aGlzLmRlZmF1bHRPcHRpb25zKSx0aGlzLmJvZHk9dCx0aGlzLl9jcmVhdGUoKSx0aGlzLnNldE9wdGlvbnMoZSl9dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9LHM9aSgxKSxyPWkoMzMpLGE9aSgzNyksaD1pKDM0KSxkPWkoMik7by5wcm90b3R5cGU9bmV3IHIsby5wcm90b3R5cGUuc2V0T3B0aW9ucz1mdW5jdGlvbih0KXt0JiYocy5zZWxlY3RpdmVFeHRlbmQoWyJzaG93TWlub3JMYWJlbHMiLCJzaG93TWFqb3JMYWJlbHMiLCJtYXhNaW5vckNoYXJzIiwiaGlkZGVuRGF0ZXMiLCJ0aW1lQXhpcyIsIm1vbWVudCIsInJ0bCJdLHRoaXMub3B0aW9ucyx0KSxzLnNlbGVjdGl2ZURlZXBFeHRlbmQoWyJmb3JtYXQiXSx0aGlzLm9wdGlvbnMsdCksIm9yaWVudGF0aW9uImluIHQmJigic3RyaW5nIj09dHlwZW9mIHQub3JpZW50YXRpb24/dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLmF4aXM9dC5vcmllbnRhdGlvbjoib2JqZWN0Ij09PW4odC5vcmllbnRhdGlvbikmJiJheGlzImluIHQub3JpZW50YXRpb24mJih0aGlzLm9wdGlvbnMub3JpZW50YXRpb24uYXhpcz10Lm9yaWVudGF0aW9uLmF4aXMpKSwibG9jYWxlImluIHQmJigiZnVuY3Rpb24iPT10eXBlb2YgZC5sb2NhbGU/ZC5sb2NhbGUodC5sb2NhbGUpOmQubGFuZyh0LmxvY2FsZSkpKX0sby5wcm90b3R5cGUuX2NyZWF0ZT1mdW5jdGlvbigpe3RoaXMuZG9tLmZvcmVncm91bmQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5kb20uYmFja2dyb3VuZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmRvbS5mb3JlZ3JvdW5kLmNsYXNzTmFtZT0idmlzLXRpbWUtYXhpcyB2aXMtZm9yZWdyb3VuZCIsdGhpcy5kb20uYmFja2dyb3VuZC5jbGFzc05hbWU9InZpcy10aW1lLWF4aXMgdmlzLWJhY2tncm91bmQifSxvLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5kb20uZm9yZWdyb3VuZC5wYXJlbnROb2RlJiZ0aGlzLmRvbS5mb3JlZ3JvdW5kLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20uZm9yZWdyb3VuZCksdGhpcy5kb20uYmFja2dyb3VuZC5wYXJlbnROb2RlJiZ0aGlzLmRvbS5iYWNrZ3JvdW5kLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20uYmFja2dyb3VuZCksdGhpcy5ib2R5PW51bGx9LG8ucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHMsZT10aGlzLmRvbS5mb3JlZ3JvdW5kLGk9dGhpcy5kb20uYmFja2dyb3VuZCxvPSJ0b3AiPT10aGlzLm9wdGlvbnMub3JpZW50YXRpb24uYXhpcz90aGlzLmJvZHkuZG9tLnRvcDp0aGlzLmJvZHkuZG9tLmJvdHRvbSxuPWUucGFyZW50Tm9kZSE9PW87CnRoaXMuX2NhbGN1bGF0ZUNoYXJTaXplKCk7dmFyIHM9dGhpcy5vcHRpb25zLnNob3dNaW5vckxhYmVscyYmIm5vbmUiIT09dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLmF4aXMscj10aGlzLm9wdGlvbnMuc2hvd01ham9yTGFiZWxzJiYibm9uZSIhPT10aGlzLm9wdGlvbnMub3JpZW50YXRpb24uYXhpczt0Lm1pbm9yTGFiZWxIZWlnaHQ9cz90Lm1pbm9yQ2hhckhlaWdodDowLHQubWFqb3JMYWJlbEhlaWdodD1yP3QubWFqb3JDaGFySGVpZ2h0OjAsdC5oZWlnaHQ9dC5taW5vckxhYmVsSGVpZ2h0K3QubWFqb3JMYWJlbEhlaWdodCx0LndpZHRoPWUub2Zmc2V0V2lkdGgsdC5taW5vckxpbmVIZWlnaHQ9dGhpcy5ib2R5LmRvbVByb3BzLnJvb3QuaGVpZ2h0LXQubWFqb3JMYWJlbEhlaWdodC0oInRvcCI9PXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5heGlzP3RoaXMuYm9keS5kb21Qcm9wcy5ib3R0b20uaGVpZ2h0OnRoaXMuYm9keS5kb21Qcm9wcy50b3AuaGVpZ2h0KSx0Lm1pbm9yTGluZVdpZHRoPTEsdC5tYWpvckxpbmVIZWlnaHQ9dC5taW5vckxpbmVIZWlnaHQrdC5tYWpvckxhYmVsSGVpZ2h0LHQubWFqb3JMaW5lV2lkdGg9MTt2YXIgYT1lLm5leHRTaWJsaW5nLGg9aS5uZXh0U2libGluZztyZXR1cm4gZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSksaS5wYXJlbnROb2RlJiZpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaSksZS5zdHlsZS5oZWlnaHQ9dGhpcy5wcm9wcy5oZWlnaHQrInB4Iix0aGlzLl9yZXBhaW50TGFiZWxzKCksYT9vLmluc2VydEJlZm9yZShlLGEpOm8uYXBwZW5kQ2hpbGQoZSksaD90aGlzLmJvZHkuZG9tLmJhY2tncm91bmRWZXJ0aWNhbC5pbnNlcnRCZWZvcmUoaSxoKTp0aGlzLmJvZHkuZG9tLmJhY2tncm91bmRWZXJ0aWNhbC5hcHBlbmRDaGlsZChpKSx0aGlzLl9pc1Jlc2l6ZWQoKXx8bn0sby5wcm90b3R5cGUuX3JlcGFpbnRMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMub3JpZW50YXRpb24uYXhpcyxlPXMuY29udmVydCh0aGlzLmJvZHkucmFuZ2Uuc3RhcnQsIk51bWJlciIpLGk9cy5jb252ZXJ0KHRoaXMuYm9keS5yYW5nZS5lbmQsIk51bWJlciIpLG89dGhpcy5ib2R5LnV0aWwudG9UaW1lKCh0aGlzLnByb3BzLm1pbm9yQ2hhcldpZHRofHwxMCkqdGhpcy5vcHRpb25zLm1heE1pbm9yQ2hhcnMpLnZhbHVlT2YoKSxuPW8taC5nZXRIaWRkZW5EdXJhdGlvbkJlZm9yZSh0aGlzLm9wdGlvbnMubW9tZW50LHRoaXMuYm9keS5oaWRkZW5EYXRlcyx0aGlzLmJvZHkucmFuZ2Usbyk7bi09dGhpcy5ib2R5LnV0aWwudG9UaW1lKDApLnZhbHVlT2YoKTt2YXIgcj1uZXcgYShuZXcgRGF0ZShlKSxuZXcgRGF0ZShpKSxuLHRoaXMuYm9keS5oaWRkZW5EYXRlcyk7ci5zZXRNb21lbnQodGhpcy5vcHRpb25zLm1vbWVudCksdGhpcy5vcHRpb25zLmZvcm1hdCYmci5zZXRGb3JtYXQodGhpcy5vcHRpb25zLmZvcm1hdCksdGhpcy5vcHRpb25zLnRpbWVBeGlzJiZyLnNldFNjYWxlKHRoaXMub3B0aW9ucy50aW1lQXhpcyksdGhpcy5zdGVwPXI7dmFyIGQ9dGhpcy5kb207ZC5yZWR1bmRhbnQubGluZXM9ZC5saW5lcyxkLnJlZHVuZGFudC5tYWpvclRleHRzPWQubWFqb3JUZXh0cyxkLnJlZHVuZGFudC5taW5vclRleHRzPWQubWlub3JUZXh0cyxkLmxpbmVzPVtdLGQubWFqb3JUZXh0cz1bXSxkLm1pbm9yVGV4dHM9W107dmFyIGMsdSxwLGYsbSx2LGcseSxiLF8sdz0wLHg9dm9pZCAwLGs9MCxPPTFlMztmb3Ioci5zdGFydCgpLHU9ci5nZXRDdXJyZW50KCksZj10aGlzLmJvZHkudXRpbC50b1NjcmVlbih1KTtyLmhhc05leHQoKSYmazxPOyl7aysrLG09ci5pc01ham9yKCksXz1yLmdldENsYXNzTmFtZSgpLGI9ci5nZXRMYWJlbE1pbm9yKCksYz11LHA9ZixyLm5leHQoKSx1PXIuZ2V0Q3VycmVudCgpLHY9ci5pc01ham9yKCksZj10aGlzLmJvZHkudXRpbC50b1NjcmVlbih1KSxnPXcsdz1mLXA7dmFyIEQ9dz49LjQqZztpZih0aGlzLm9wdGlvbnMuc2hvd01pbm9yTGFiZWxzJiZEKXt2YXIgUz10aGlzLl9yZXBhaW50TWlub3JUZXh0KHAsYix0LF8pO1Muc3R5bGUud2lkdGg9dysicHgifW0mJnRoaXMub3B0aW9ucy5zaG93TWFqb3JMYWJlbHM/KHA+MCYmKHZvaWQgMD09eCYmKHg9cCksUz10aGlzLl9yZXBhaW50TWFqb3JUZXh0KHAsci5nZXRMYWJlbE1ham9yKCksdCxfKSkseT10aGlzLl9yZXBhaW50TWFqb3JMaW5lKHAsdyx0LF8pKTpEP3k9dGhpcy5fcmVwYWludE1pbm9yTGluZShwLHcsdCxfKTp5JiYoeS5zdHlsZS53aWR0aD1wYXJzZUludCh5LnN0eWxlLndpZHRoKSt3KyJweCIpfWlmKGshPT1PfHxsfHwoY29uc29sZS53YXJuKCJTb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB0aGUgVGltZWxpbmUgc2NhbGUuIExpbWl0ZWQgZHJhd2luZyBvZiBncmlkIGxpbmVzIHRvICIrTysiIGxpbmVzLiIpLGw9ITApLHRoaXMub3B0aW9ucy5zaG93TWFqb3JMYWJlbHMpe3ZhciBDPXRoaXMuYm9keS51dGlsLnRvVGltZSgwKSxUPXIuZ2V0TGFiZWxNYWpvcihDKSxFPVQubGVuZ3RoKih0aGlzLnByb3BzLm1ham9yQ2hhcldpZHRofHwxMCkrMTA7KHZvaWQgMD09eHx8RTx4KSYmdGhpcy5fcmVwYWludE1ham9yVGV4dCgwLFQsdCxfKX1zLmZvckVhY2godGhpcy5kb20ucmVkdW5kYW50LGZ1bmN0aW9uKHQpe2Zvcig7dC5sZW5ndGg7KXt2YXIgZT10LnBvcCgpO2UmJmUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpfX0pfSxvLnByb3RvdHlwZS5fcmVwYWludE1pbm9yVGV4dD1mdW5jdGlvbih0LGUsaSxvKXt2YXIgbj10aGlzLmRvbS5yZWR1bmRhbnQubWlub3JUZXh0cy5zaGlmdCgpO2lmKCFuKXt2YXIgcz1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIik7bj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxuLmFwcGVuZENoaWxkKHMpLHRoaXMuZG9tLmZvcmVncm91bmQuYXBwZW5kQ2hpbGQobil9cmV0dXJuIHRoaXMuZG9tLm1pbm9yVGV4dHMucHVzaChuKSxuLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlPWUsbi5zdHlsZS50b3A9InRvcCI9PWk/dGhpcy5wcm9wcy5tYWpvckxhYmVsSGVpZ2h0KyJweCI6IjAiLHRoaXMub3B0aW9ucy5ydGw/KG4uc3R5bGUubGVmdD0iIixuLnN0eWxlLnJpZ2h0PXQrInB4Iik6bi5zdHlsZS5sZWZ0PXQrInB4IixuLmNsYXNzTmFtZT0idmlzLXRleHQgdmlzLW1pbm9yICIrbyxufSxvLnByb3RvdHlwZS5fcmVwYWludE1ham9yVGV4dD1mdW5jdGlvbih0LGUsaSxvKXt2YXIgbj10aGlzLmRvbS5yZWR1bmRhbnQubWFqb3JUZXh0cy5zaGlmdCgpO2lmKCFuKXt2YXIgcz1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlKTtuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLG4uYXBwZW5kQ2hpbGQocyksdGhpcy5kb20uZm9yZWdyb3VuZC5hcHBlbmRDaGlsZChuKX1yZXR1cm4gdGhpcy5kb20ubWFqb3JUZXh0cy5wdXNoKG4pLG4uY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU9ZSxuLmNsYXNzTmFtZT0idmlzLXRleHQgdmlzLW1ham9yICIrbyxuLnN0eWxlLnRvcD0idG9wIj09aT8iMCI6dGhpcy5wcm9wcy5taW5vckxhYmVsSGVpZ2h0KyJweCIsdGhpcy5vcHRpb25zLnJ0bD8obi5zdHlsZS5sZWZ0PSIiLG4uc3R5bGUucmlnaHQ9dCsicHgiKTpuLnN0eWxlLmxlZnQ9dCsicHgiLG59LG8ucHJvdG90eXBlLl9yZXBhaW50TWlub3JMaW5lPWZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuPXRoaXMuZG9tLnJlZHVuZGFudC5saW5lcy5zaGlmdCgpO258fChuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZG9tLmJhY2tncm91bmQuYXBwZW5kQ2hpbGQobikpLHRoaXMuZG9tLmxpbmVzLnB1c2gobik7dmFyIHM9dGhpcy5wcm9wcztyZXR1cm4idG9wIj09aT9uLnN0eWxlLnRvcD1zLm1ham9yTGFiZWxIZWlnaHQrInB4IjpuLnN0eWxlLnRvcD10aGlzLmJvZHkuZG9tUHJvcHMudG9wLmhlaWdodCsicHgiLG4uc3R5bGUuaGVpZ2h0PXMubWlub3JMaW5lSGVpZ2h0KyJweCIsdGhpcy5vcHRpb25zLnJ0bD8obi5zdHlsZS5sZWZ0PSIiLG4uc3R5bGUucmlnaHQ9dC1zLm1pbm9yTGluZVdpZHRoLzIrInB4IixuLmNsYXNzTmFtZT0idmlzLWdyaWQgdmlzLXZlcnRpY2FsLXJ0bCB2aXMtbWlub3IgIitvKToobi5zdHlsZS5sZWZ0PXQtcy5taW5vckxpbmVXaWR0aC8yKyJweCIsbi5jbGFzc05hbWU9InZpcy1ncmlkIHZpcy12ZXJ0aWNhbCB2aXMtbWlub3IgIitvKSxuLnN0eWxlLndpZHRoPWUrInB4IixufSxvLnByb3RvdHlwZS5fcmVwYWludE1ham9yTGluZT1mdW5jdGlvbih0LGUsaSxvKXt2YXIgbj10aGlzLmRvbS5yZWR1bmRhbnQubGluZXMuc2hpZnQoKTtufHwobj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmRvbS5iYWNrZ3JvdW5kLmFwcGVuZENoaWxkKG4pKSx0aGlzLmRvbS5saW5lcy5wdXNoKG4pO3ZhciBzPXRoaXMucHJvcHM7cmV0dXJuInRvcCI9PWk/bi5zdHlsZS50b3A9IjAiOm4uc3R5bGUudG9wPXRoaXMuYm9keS5kb21Qcm9wcy50b3AuaGVpZ2h0KyJweCIsdGhpcy5vcHRpb25zLnJ0bD8obi5zdHlsZS5sZWZ0PSIiLG4uc3R5bGUucmlnaHQ9dC1zLm1ham9yTGluZVdpZHRoLzIrInB4IixuLmNsYXNzTmFtZT0idmlzLWdyaWQgdmlzLXZlcnRpY2FsLXJ0bCB2aXMtbWFqb3IgIitvKToobi5zdHlsZS5sZWZ0PXQtcy5tYWpvckxpbmVXaWR0aC8yKyJweCIsbi5jbGFzc05hbWU9InZpcy1ncmlkIHZpcy12ZXJ0aWNhbCB2aXMtbWFqb3IgIitvKSxuLnN0eWxlLmhlaWdodD1zLm1ham9yTGluZUhlaWdodCsicHgiLG4uc3R5bGUud2lkdGg9ZSsicHgiLG59LG8ucHJvdG90eXBlLl9jYWxjdWxhdGVDaGFyU2l6ZT1mdW5jdGlvbigpe3RoaXMuZG9tLm1lYXN1cmVDaGFyTWlub3J8fCh0aGlzLmRvbS5tZWFzdXJlQ2hhck1pbm9yPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLHRoaXMuZG9tLm1lYXN1cmVDaGFyTWlub3IuY2xhc3NOYW1lPSJ2aXMtdGV4dCB2aXMtbWlub3IgdmlzLW1lYXN1cmUiLHRoaXMuZG9tLm1lYXN1cmVDaGFyTWlub3Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLmRvbS5tZWFzdXJlQ2hhck1pbm9yLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIwIikpLHRoaXMuZG9tLmZvcmVncm91bmQuYXBwZW5kQ2hpbGQodGhpcy5kb20ubWVhc3VyZUNoYXJNaW5vcikpLHRoaXMucHJvcHMubWlub3JDaGFySGVpZ2h0PXRoaXMuZG9tLm1lYXN1cmVDaGFyTWlub3IuY2xpZW50SGVpZ2h0LHRoaXMucHJvcHMubWlub3JDaGFyV2lkdGg9dGhpcy5kb20ubWVhc3VyZUNoYXJNaW5vci5jbGllbnRXaWR0aCx0aGlzLmRvbS5tZWFzdXJlQ2hhck1ham9yfHwodGhpcy5kb20ubWVhc3VyZUNoYXJNYWpvcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSx0aGlzLmRvbS5tZWFzdXJlQ2hhck1ham9yLmNsYXNzTmFtZT0idmlzLXRleHQgdmlzLW1ham9yIHZpcy1tZWFzdXJlIix0aGlzLmRvbS5tZWFzdXJlQ2hhck1ham9yLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5kb20ubWVhc3VyZUNoYXJNYWpvci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiMCIpKSx0aGlzLmRvbS5mb3JlZ3JvdW5kLmFwcGVuZENoaWxkKHRoaXMuZG9tLm1lYXN1cmVDaGFyTWFqb3IpKSx0aGlzLnByb3BzLm1ham9yQ2hhckhlaWdodD10aGlzLmRvbS5tZWFzdXJlQ2hhck1ham9yLmNsaWVudEhlaWdodCx0aGlzLnByb3BzLm1ham9yQ2hhcldpZHRoPXRoaXMuZG9tLm1lYXN1cmVDaGFyTWFqb3IuY2xpZW50V2lkdGh9O3ZhciBsPSExO3QuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXt0aGlzLmFjdGl2ZT0hMSx0aGlzLmRvbT17Y29udGFpbmVyOnR9LHRoaXMuZG9tLm92ZXJsYXk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5kb20ub3ZlcmxheS5jbGFzc05hbWU9InZpcy1vdmVybGF5Iix0aGlzLmRvbS5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5kb20ub3ZlcmxheSksdGhpcy5oYW1tZXI9YSh0aGlzLmRvbS5vdmVybGF5KSx0aGlzLmhhbW1lci5vbigidGFwIix0aGlzLl9vblRhcE92ZXJsYXkuYmluZCh0aGlzKSk7dmFyIGU9dGhpcyxpPVsidGFwIiwiZG91YmxldGFwIiwicHJlc3MiLCJwaW5jaCIsInBhbiIsInBhbnN0YXJ0IiwicGFubW92ZSIsInBhbmVuZCJdO2kuZm9yRWFjaChmdW5jdGlvbih0KXtlLmhhbW1lci5vbih0LGZ1bmN0aW9uKHQpe3Quc3RvcFByb3BhZ2F0aW9uKCl9KX0pLGRvY3VtZW50JiZkb2N1bWVudC5ib2R5JiYodGhpcy5vbkNsaWNrPWZ1bmN0aW9uKGkpe24oaS50YXJnZXQsdCl8fGUuZGVhY3RpdmF0ZSgpfSxkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9uQ2xpY2spKSx2b2lkIDAhPT10aGlzLmtleWNoYXJtJiZ0aGlzLmtleWNoYXJtLmRlc3Ryb3koKSx0aGlzLmtleWNoYXJtPXMoKSx0aGlzLmVzY0xpc3RlbmVyPXRoaXMuZGVhY3RpdmF0ZS5iaW5kKHRoaXMpfWZ1bmN0aW9uIG4odCxlKXtmb3IoO3Q7KXtpZih0PT09ZSlyZXR1cm4hMDt0PXQucGFyZW50Tm9kZX1yZXR1cm4hMX12YXIgcz1pKDI1KSxyPWkoMTMpLGE9aSgyMiksaD1pKDEpO3Ioby5wcm90b3R5cGUpLG8uY3VycmVudD1udWxsLG8ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmRlYWN0aXZhdGUoKSx0aGlzLmRvbS5vdmVybGF5LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20ub3ZlcmxheSksdGhpcy5vbkNsaWNrJiZkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9uQ2xpY2spLHRoaXMuaGFtbWVyLmRlc3Ryb3koKSx0aGlzLmhhbW1lcj1udWxsfSxvLnByb3RvdHlwZS5hY3RpdmF0ZT1mdW5jdGlvbigpe28uY3VycmVudCYmby5jdXJyZW50LmRlYWN0aXZhdGUoKSxvLmN1cnJlbnQ9dGhpcyx0aGlzLmFjdGl2ZT0hMCx0aGlzLmRvbS5vdmVybGF5LnN0eWxlLmRpc3BsYXk9Im5vbmUiLGguYWRkQ2xhc3NOYW1lKHRoaXMuZG9tLmNvbnRhaW5lciwidmlzLWFjdGl2ZSIpLHRoaXMuZW1pdCgiY2hhbmdlIiksdGhpcy5lbWl0KCJhY3RpdmF0ZSIpLHRoaXMua2V5Y2hhcm0uYmluZCgiZXNjIix0aGlzLmVzY0xpc3RlbmVyKX0sby5wcm90b3R5cGUuZGVhY3RpdmF0ZT1mdW5jdGlvbigpe3RoaXMuYWN0aXZlPSExLHRoaXMuZG9tLm92ZXJsYXkuc3R5bGUuZGlzcGxheT0iIixoLnJlbW92ZUNsYXNzTmFtZSh0aGlzLmRvbS5jb250YWluZXIsInZpcy1hY3RpdmUiKSx0aGlzLmtleWNoYXJtLnVuYmluZCgiZXNjIix0aGlzLmVzY0xpc3RlbmVyKSx0aGlzLmVtaXQoImNoYW5nZSIpLHRoaXMuZW1pdCgiZGVhY3RpdmF0ZSIpfSxvLnByb3RvdHlwZS5fb25UYXBPdmVybGF5PWZ1bmN0aW9uKHQpe3RoaXMuYWN0aXZhdGUoKSx0LnN0b3BQcm9wYWdhdGlvbigpfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlKXt0aGlzLmJvZHk9dCx0aGlzLmRlZmF1bHRPcHRpb25zPXttb21lbnQ6YSxsb2NhbGVzOmgsbG9jYWxlOiJlbiIsaWQ6dm9pZCAwLHRpdGxlOnZvaWQgMH0sdGhpcy5vcHRpb25zPXMuZXh0ZW5kKHt9LHRoaXMuZGVmYXVsdE9wdGlvbnMpLGUmJmUudGltZT90aGlzLmN1c3RvbVRpbWU9ZS50aW1lOnRoaXMuY3VzdG9tVGltZT1uZXcgRGF0ZSx0aGlzLmV2ZW50UGFyYW1zPXt9LHRoaXMuc2V0T3B0aW9ucyhlKSx0aGlzLl9jcmVhdGUoKX12YXIgbj1pKDIyKSxzPWkoMSkscj1pKDMzKSxhPWkoMiksaD1pKDQ5KTtvLnByb3RvdHlwZT1uZXcgcixvLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe3QmJnMuc2VsZWN0aXZlRXh0ZW5kKFsibW9tZW50IiwibG9jYWxlIiwibG9jYWxlcyIsImlkIl0sdGhpcy5vcHRpb25zLHQpfSxvLnByb3RvdHlwZS5fY3JlYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dFsiY3VzdG9tLXRpbWUiXT10aGlzLHQuY2xhc3NOYW1lPSJ2aXMtY3VzdG9tLXRpbWUgIisodGhpcy5vcHRpb25zLmlkfHwiIiksdC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHQuc3R5bGUudG9wPSIwcHgiLHQuc3R5bGUuaGVpZ2h0PSIxMDAlIix0aGlzLmJhcj10O3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixlLnN0eWxlLnRvcD0iMHB4IixlLnN0eWxlLmxlZnQ9Ii0xMHB4IixlLnN0eWxlLmhlaWdodD0iMTAwJSIsZS5zdHlsZS53aWR0aD0iMjBweCIsdC5hcHBlbmRDaGlsZChlKSx0aGlzLmhhbW1lcj1uZXcgbihlKSx0aGlzLmhhbW1lci5vbigicGFuc3RhcnQiLHRoaXMuX29uRHJhZ1N0YXJ0LmJpbmQodGhpcykpLHRoaXMuaGFtbWVyLm9uKCJwYW5tb3ZlIix0aGlzLl9vbkRyYWcuYmluZCh0aGlzKSksdGhpcy5oYW1tZXIub24oInBhbmVuZCIsdGhpcy5fb25EcmFnRW5kLmJpbmQodGhpcykpLHRoaXMuaGFtbWVyLmdldCgicGFuIikuc2V0KHt0aHJlc2hvbGQ6NSxkaXJlY3Rpb246bi5ESVJFQ1RJT05fSE9SSVpPTlRBTH0pfSxvLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5oaWRlKCksdGhpcy5oYW1tZXIuZGVzdHJveSgpLHRoaXMuaGFtbWVyPW51bGwsdGhpcy5ib2R5PW51bGx9LG8ucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuYm9keS5kb20uYmFja2dyb3VuZFZlcnRpY2FsO3RoaXMuYmFyLnBhcmVudE5vZGUhPXQmJih0aGlzLmJhci5wYXJlbnROb2RlJiZ0aGlzLmJhci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuYmFyKSx0LmFwcGVuZENoaWxkKHRoaXMuYmFyKSk7dmFyIGU9dGhpcy5ib2R5LnV0aWwudG9TY3JlZW4odGhpcy5jdXN0b21UaW1lKSxpPXRoaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdO2l8fCh0aGlzLndhcm5lZHx8KGNvbnNvbGUubG9nKCJXQVJOSU5HOiBvcHRpb25zLmxvY2FsZXNbJyIrdGhpcy5vcHRpb25zLmxvY2FsZSsiJ10gbm90IGZvdW5kLiBTZWUgaHR0cDovL3Zpc2pzLm9yZy9kb2NzL3RpbWVsaW5lLyNMb2NhbGl6YXRpb24iKSx0aGlzLndhcm5lZD0hMCksaT10aGlzLm9wdGlvbnMubG9jYWxlcy5lbik7dmFyIG89dGhpcy5vcHRpb25zLnRpdGxlO3JldHVybiB2b2lkIDA9PT1vJiYobz1pLnRpbWUrIjogIit0aGlzLm9wdGlvbnMubW9tZW50KHRoaXMuY3VzdG9tVGltZSkuZm9ybWF0KCJkZGRkLCBNTU1NIERvIFlZWVksIEg6bW06c3MiKSxvPW8uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrby5zdWJzdHJpbmcoMSkpLHRoaXMuYmFyLnN0eWxlLmxlZnQ9ZSsicHgiLHRoaXMuYmFyLnRpdGxlPW8sITF9LG8ucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oKXt0aGlzLmJhci5wYXJlbnROb2RlJiZ0aGlzLmJhci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuYmFyKX0sby5wcm90b3R5cGUuc2V0Q3VzdG9tVGltZT1mdW5jdGlvbih0KXt0aGlzLmN1c3RvbVRpbWU9cy5jb252ZXJ0KHQsIkRhdGUiKSx0aGlzLnJlZHJhdygpfSxvLnByb3RvdHlwZS5nZXRDdXN0b21UaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBEYXRlKHRoaXMuY3VzdG9tVGltZS52YWx1ZU9mKCkpfSxvLnByb3RvdHlwZS5zZXRDdXN0b21UaXRsZT1mdW5jdGlvbih0KXt0aGlzLm9wdGlvbnMudGl0bGU9dH0sby5wcm90b3R5cGUuX29uRHJhZ1N0YXJ0PWZ1bmN0aW9uKHQpe3RoaXMuZXZlbnRQYXJhbXMuZHJhZ2dpbmc9ITAsdGhpcy5ldmVudFBhcmFtcy5jdXN0b21UaW1lPXRoaXMuY3VzdG9tVGltZSx0LnN0b3BQcm9wYWdhdGlvbigpfSxvLnByb3RvdHlwZS5fb25EcmFnPWZ1bmN0aW9uKHQpe2lmKHRoaXMuZXZlbnRQYXJhbXMuZHJhZ2dpbmcpe3ZhciBlPXRoaXMuYm9keS51dGlsLnRvU2NyZWVuKHRoaXMuZXZlbnRQYXJhbXMuY3VzdG9tVGltZSkrdC5kZWx0YVgsaT10aGlzLmJvZHkudXRpbC50b1RpbWUoZSk7dGhpcy5zZXRDdXN0b21UaW1lKGkpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoInRpbWVjaGFuZ2UiLHtpZDp0aGlzLm9wdGlvbnMuaWQsdGltZTpuZXcgRGF0ZSh0aGlzLmN1c3RvbVRpbWUudmFsdWVPZigpKX0pLHQuc3RvcFByb3BhZ2F0aW9uKCl9fSxvLnByb3RvdHlwZS5fb25EcmFnRW5kPWZ1bmN0aW9uKHQpe3RoaXMuZXZlbnRQYXJhbXMuZHJhZ2dpbmcmJih0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJ0aW1lY2hhbmdlZCIse2lkOnRoaXMub3B0aW9ucy5pZCx0aW1lOm5ldyBEYXRlKHRoaXMuY3VzdG9tVGltZS52YWx1ZU9mKCkpfSksdC5zdG9wUHJvcGFnYXRpb24oKSl9LG8uY3VzdG9tVGltZUZyb21UYXJnZXQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQudGFyZ2V0O2U7KXtpZihlLmhhc093blByb3BlcnR5KCJjdXN0b20tdGltZSIpKXJldHVybiBlWyJjdXN0b20tdGltZSJdO2U9ZS5wYXJlbnROb2RlfXJldHVybiBudWxsfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlKXtlLmVuPXtjdXJyZW50OiJjdXJyZW50Iix0aW1lOiJ0aW1lIn0sZS5lbl9FTj1lLmVuLGUuZW5fVVM9ZS5lbixlLml0PXtjdXJyZW50OiJhdHR1YWxlIix0aW1lOiJ0ZW1wbyJ9LGUuaXRfSVQ9ZS5pdCxlLml0X0NIPWUuaXQsZS5ubD17Y3VycmVudDoiaHVpZGlnZSIsdGltZToidGlqZCJ9LGUubmxfTkw9ZS5ubCxlLm5sX0JFPWUubmwsZS5kZT17Y3VycmVudDoiQWt0dWVsbGUiLHRpbWU6IlplaXQifSxlLmRlX0RFPWUuZGV9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSl7dGhpcy5ib2R5PXQsdGhpcy5kZWZhdWx0T3B0aW9ucz17cnRsOiExLHNob3dDdXJyZW50VGltZTohMCxtb21lbnQ6cixsb2NhbGVzOmEsbG9jYWxlOiJlbiJ9LHRoaXMub3B0aW9ucz1uLmV4dGVuZCh7fSx0aGlzLmRlZmF1bHRPcHRpb25zKSx0aGlzLm9mZnNldD0wLHRoaXMuX2NyZWF0ZSgpLHRoaXMuc2V0T3B0aW9ucyhlKX12YXIgbj1pKDEpLHM9aSgzMykscj1pKDIpLGE9aSg0OSk7by5wcm90b3R5cGU9bmV3IHMsby5wcm90b3R5cGUuX2NyZWF0ZT1mdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3QuY2xhc3NOYW1lPSJ2aXMtY3VycmVudC10aW1lIix0LnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdC5zdHlsZS50b3A9IjBweCIsdC5zdHlsZS5oZWlnaHQ9IjEwMCUiLHRoaXMuYmFyPXR9LG8ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuc2hvd0N1cnJlbnRUaW1lPSExLHRoaXMucmVkcmF3KCksdGhpcy5ib2R5PW51bGx9LG8ucHJvdG90eXBlLnNldE9wdGlvbnM9ZnVuY3Rpb24odCl7dCYmbi5zZWxlY3RpdmVFeHRlbmQoWyJydGwiLCJzaG93Q3VycmVudFRpbWUiLCJtb21lbnQiLCJsb2NhbGUiLCJsb2NhbGVzIl0sdGhpcy5vcHRpb25zLHQpfSxvLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24oKXtpZih0aGlzLm9wdGlvbnMuc2hvd0N1cnJlbnRUaW1lKXt2YXIgdD10aGlzLmJvZHkuZG9tLmJhY2tncm91bmRWZXJ0aWNhbDt0aGlzLmJhci5wYXJlbnROb2RlIT10JiYodGhpcy5iYXIucGFyZW50Tm9kZSYmdGhpcy5iYXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmJhciksdC5hcHBlbmRDaGlsZCh0aGlzLmJhciksdGhpcy5zdGFydCgpKTt2YXIgZT10aGlzLm9wdGlvbnMubW9tZW50KChuZXcgRGF0ZSkudmFsdWVPZigpK3RoaXMub2Zmc2V0KSxpPXRoaXMuYm9keS51dGlsLnRvU2NyZWVuKGUpLG89dGhpcy5vcHRpb25zLmxvY2FsZXNbdGhpcy5vcHRpb25zLmxvY2FsZV07b3x8KHRoaXMud2FybmVkfHwoY29uc29sZS5sb2coIldBUk5JTkc6IG9wdGlvbnMubG9jYWxlc1snIit0aGlzLm9wdGlvbnMubG9jYWxlKyInXSBub3QgZm91bmQuIFNlZSBodHRwOi8vdmlzanMub3JnL2RvY3MvdGltZWxpbmUvI0xvY2FsaXphdGlvbiIpLHRoaXMud2FybmVkPSEwKSxvPXRoaXMub3B0aW9ucy5sb2NhbGVzLmVuKTt2YXIgbj1vLmN1cnJlbnQrIiAiK28udGltZSsiOiAiK2UuZm9ybWF0KCJkZGRkLCBNTU1NIERvIFlZWVksIEg6bW06c3MiKTtuPW4uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrbi5zdWJzdHJpbmcoMSksdGhpcy5vcHRpb25zLnJ0bD90aGlzLmJhci5zdHlsZS5yaWdodD1pKyJweCI6dGhpcy5iYXIuc3R5bGUubGVmdD1pKyJweCIsdGhpcy5iYXIudGl0bGU9bn1lbHNlIHRoaXMuYmFyLnBhcmVudE5vZGUmJnRoaXMuYmFyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5iYXIpLHRoaXMuc3RvcCgpO3JldHVybiExfSxvLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtlLnN0b3AoKTt2YXIgaT1lLmJvZHkucmFuZ2UuY29udmVyc2lvbihlLmJvZHkuZG9tUHJvcHMuY2VudGVyLndpZHRoKS5zY2FsZSxvPTEvaS8xMDtvPDMwJiYobz0zMCksbz4xZTMmJihvPTFlMyksZS5yZWRyYXcoKSxlLmJvZHkuZW1pdHRlci5lbWl0KCJjdXJyZW50VGltZVRpY2siKSxlLmN1cnJlbnRUaW1lVGltZXI9c2V0VGltZW91dCh0LG8pfXZhciBlPXRoaXM7dCgpfSxvLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKCl7dm9pZCAwIT09dGhpcy5jdXJyZW50VGltZVRpbWVyJiYoY2xlYXJUaW1lb3V0KHRoaXMuY3VycmVudFRpbWVUaW1lciksZGVsZXRlIHRoaXMuY3VycmVudFRpbWVUaW1lcil9LG8ucHJvdG90eXBlLnNldEN1cnJlbnRUaW1lPWZ1bmN0aW9uKHQpe3ZhciBlPW4uY29udmVydCh0LCJEYXRlIikudmFsdWVPZigpLGk9KG5ldyBEYXRlKS52YWx1ZU9mKCk7dGhpcy5vZmZzZXQ9ZS1pLHRoaXMucmVkcmF3KCl9LG8ucHJvdG90eXBlLmdldEN1cnJlbnRUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBEYXRlKChuZXcgRGF0ZSkudmFsdWVPZigpK3RoaXMub2Zmc2V0KX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPSJzdHJpbmciLG89ImJvb2xlYW4iLG49Im51bWJlciIscz0iYXJyYXkiLHI9ImRhdGUiLGE9Im9iamVjdCIsaD0iZG9tIixkPSJtb21lbnQiLGw9ImFueSIsYz17Y29uZmlndXJlOntlbmFibGVkOntib29sZWFuOm99LGZpbHRlcjp7Ym9vbGVhbjpvLGZ1bmN0aW9uOiJmdW5jdGlvbiJ9LGNvbnRhaW5lcjp7ZG9tOmh9LF9fdHlwZV9fOntvYmplY3Q6YSxib29sZWFuOm8sZnVuY3Rpb246ImZ1bmN0aW9uIn19LGFsaWduOntzdHJpbmc6aX0scnRsOntib29sZWFuOm8sdW5kZWZpbmVkOiJ1bmRlZmluZWQifSx2ZXJ0aWNhbFNjcm9sbDp7Ym9vbGVhbjpvLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0saG9yaXpvbnRhbFNjcm9sbDp7Ym9vbGVhbjpvLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sYXV0b1Jlc2l6ZTp7Ym9vbGVhbjpvfSxjbGlja1RvVXNlOntib29sZWFuOm99LGRhdGFBdHRyaWJ1dGVzOntzdHJpbmc6aSxhcnJheTpzfSxlZGl0YWJsZTp7YWRkOntib29sZWFuOm8sdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxyZW1vdmU6e2Jvb2xlYW46byx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LHVwZGF0ZUdyb3VwOntib29sZWFuOm8sdW5kZWZpbmVkOiJ1bmRlZmluZWQifSx1cGRhdGVUaW1lOntib29sZWFuOm8sdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxfX3R5cGVfXzp7Ym9vbGVhbjpvLG9iamVjdDphfX0sZW5kOntudW1iZXI6bixkYXRlOnIsc3RyaW5nOmksbW9tZW50OmR9LGZvcm1hdDp7bWlub3JMYWJlbHM6e21pbGxpc2Vjb25kOntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LHNlY29uZDp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxtaW51dGU6e3N0cmluZzppLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0saG91cjp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSx3ZWVrZGF5OntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LGRheTp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxtb250aDp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSx5ZWFyOntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LF9fdHlwZV9fOntvYmplY3Q6YSxmdW5jdGlvbjoiZnVuY3Rpb24ifX0sbWFqb3JMYWJlbHM6e21pbGxpc2Vjb25kOntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LHNlY29uZDp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxtaW51dGU6e3N0cmluZzppLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0saG91cjp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSx3ZWVrZGF5OntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LGRheTp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxtb250aDp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSx5ZWFyOntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LF9fdHlwZV9fOntvYmplY3Q6YSxmdW5jdGlvbjoiZnVuY3Rpb24ifX0sX190eXBlX186e29iamVjdDphfX0sbW9tZW50OntmdW5jdGlvbjoiZnVuY3Rpb24ifSxncm91cE9yZGVyOntzdHJpbmc6aSxmdW5jdGlvbjoiZnVuY3Rpb24ifSxncm91cEVkaXRhYmxlOnthZGQ6e2Jvb2xlYW46byx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LHJlbW92ZTp7Ym9vbGVhbjpvLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sb3JkZXI6e2Jvb2xlYW46byx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LF9fdHlwZV9fOntib29sZWFuOm8sb2JqZWN0OmF9fSxncm91cE9yZGVyU3dhcDp7ZnVuY3Rpb246ImZ1bmN0aW9uIn0saGVpZ2h0OntzdHJpbmc6aSxudW1iZXI6bn0saGlkZGVuRGF0ZXM6e3N0YXJ0OntkYXRlOnIsbnVtYmVyOm4sc3RyaW5nOmksbW9tZW50OmR9LGVuZDp7ZGF0ZTpyLG51bWJlcjpuLHN0cmluZzppLG1vbWVudDpkfSxyZXBlYXQ6e3N0cmluZzppfSxfX3R5cGVfXzp7b2JqZWN0OmEsYXJyYXk6c319LGl0ZW1zQWx3YXlzRHJhZ2dhYmxlOntib29sZWFuOm99LGxvY2FsZTp7c3RyaW5nOml9LGxvY2FsZXM6e19fYW55X186e2FueTpsfSxfX3R5cGVfXzp7b2JqZWN0OmF9fSxtYXJnaW46e2F4aXM6e251bWJlcjpufSxpdGVtOntob3Jpem9udGFsOntudW1iZXI6bix1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LHZlcnRpY2FsOntudW1iZXI6bix1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LF9fdHlwZV9fOntvYmplY3Q6YSxudW1iZXI6bn19LF9fdHlwZV9fOntvYmplY3Q6YSxudW1iZXI6bn19LG1heDp7ZGF0ZTpyLG51bWJlcjpuLHN0cmluZzppLG1vbWVudDpkfSxtYXhIZWlnaHQ6e251bWJlcjpuLHN0cmluZzppfSxtYXhNaW5vckNoYXJzOntudW1iZXI6bn0sbWluOntkYXRlOnIsbnVtYmVyOm4sc3RyaW5nOmksbW9tZW50OmR9LG1pbkhlaWdodDp7bnVtYmVyOm4sc3RyaW5nOml9LG1vdmVhYmxlOntib29sZWFuOm99LG11bHRpc2VsZWN0Ontib29sZWFuOm99LG11bHRpc2VsZWN0UGVyR3JvdXA6e2Jvb2xlYW46b30sb25BZGQ6e2Z1bmN0aW9uOiJmdW5jdGlvbiJ9LG9uVXBkYXRlOntmdW5jdGlvbjoiZnVuY3Rpb24ifSxvbk1vdmU6e2Z1bmN0aW9uOiJmdW5jdGlvbiJ9LG9uTW92aW5nOntmdW5jdGlvbjoiZnVuY3Rpb24ifSxvblJlbW92ZTp7ZnVuY3Rpb246ImZ1bmN0aW9uIn0sb25BZGRHcm91cDp7ZnVuY3Rpb246ImZ1bmN0aW9uIn0sb25Nb3ZlR3JvdXA6e2Z1bmN0aW9uOiJmdW5jdGlvbiJ9LG9uUmVtb3ZlR3JvdXA6e2Z1bmN0aW9uOiJmdW5jdGlvbiJ9LG9yZGVyOntmdW5jdGlvbjoiZnVuY3Rpb24ifSxvcmllbnRhdGlvbjp7YXhpczp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxpdGVtOntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LF9fdHlwZV9fOntzdHJpbmc6aSxvYmplY3Q6YX19LHNlbGVjdGFibGU6e2Jvb2xlYW46b30sc2hvd0N1cnJlbnRUaW1lOntib29sZWFuOm99LHNob3dNYWpvckxhYmVsczp7Ym9vbGVhbjpvfSxzaG93TWlub3JMYWJlbHM6e2Jvb2xlYW46b30sc3RhY2s6e2Jvb2xlYW46b30sc25hcDp7ZnVuY3Rpb246ImZ1bmN0aW9uIixudWxsOiJudWxsIn0sc3RhcnQ6e2RhdGU6cixudW1iZXI6bixzdHJpbmc6aSxtb21lbnQ6ZH0sdGVtcGxhdGU6e2Z1bmN0aW9uOiJmdW5jdGlvbiJ9LGdyb3VwVGVtcGxhdGU6e2Z1bmN0aW9uOiJmdW5jdGlvbiJ9LHRvb2x0aXBPbkl0ZW1VcGRhdGVUaW1lOnt0ZW1wbGF0ZTp7ZnVuY3Rpb246ImZ1bmN0aW9uIn0sX190eXBlX186e2Jvb2xlYW46byxvYmplY3Q6YX19LHRpbWVBeGlzOntzY2FsZTp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxzdGVwOntudW1iZXI6bix1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LF9fdHlwZV9fOntvYmplY3Q6YX19LHR5cGU6e3N0cmluZzppfSx3aWR0aDp7c3RyaW5nOmksbnVtYmVyOm59LHpvb21hYmxlOntib29sZWFuOm99LHpvb21LZXk6e3N0cmluZzpbImN0cmxLZXkiLCJhbHRLZXkiLCJtZXRhS2V5IiwiIl19LHpvb21NYXg6e251bWJlcjpufSx6b29tTWluOntudW1iZXI6bn0sX190eXBlX186e29iamVjdDphfX0sdT17Z2xvYmFsOnthbGlnbjpbImNlbnRlciIsImxlZnQiLCJyaWdodCJdLGRpcmVjdGlvbjohMSxhdXRvUmVzaXplOiEwLGNsaWNrVG9Vc2U6ITEsZWRpdGFibGU6e2FkZDohMSxyZW1vdmU6ITEsdXBkYXRlR3JvdXA6ITEsdXBkYXRlVGltZTohMX0sZW5kOiIiLGZvcm1hdDp7bWlub3JMYWJlbHM6e21pbGxpc2Vjb25kOiJTU1MiLHNlY29uZDoicyIsbWludXRlOiJISDptbSIsaG91cjoiSEg6bW0iLHdlZWtkYXk6ImRkZCBEIixkYXk6IkQiLG1vbnRoOiJNTU0iLHllYXI6IllZWVkifSxtYWpvckxhYmVsczp7bWlsbGlzZWNvbmQ6IkhIOm1tOnNzIixzZWNvbmQ6IkQgTU1NTSBISDptbSIsbWludXRlOiJkZGQgRCBNTU1NIixob3VyOiJkZGQgRCBNTU1NIix3ZWVrZGF5OiJNTU1NIFlZWVkiLGRheToiTU1NTSBZWVlZIixtb250aDoiWVlZWSIseWVhcjoiIn19LGdyb3Vwc0RyYWdnYWJsZTohMSxoZWlnaHQ6IiIsbG9jYWxlOiIiLG1hcmdpbjp7YXhpczpbMjAsMCwxMDAsMV0saXRlbTp7aG9yaXpvbnRhbDpbMTAsMCwxMDAsMV0sdmVydGljYWw6WzEwLDAsMTAwLDFdfX0sbWF4OiIiLG1heEhlaWdodDoiIixtYXhNaW5vckNoYXJzOls3LDAsMjAsMV0sbWluOiIiLG1pbkhlaWdodDoiIixtb3ZlYWJsZTohMSxtdWx0aXNlbGVjdDohMSxtdWx0aXNlbGVjdFBlckdyb3VwOiExLG9yaWVudGF0aW9uOntheGlzOlsiYm90aCIsImJvdHRvbSIsInRvcCJdLGl0ZW06WyJib3R0b20iLCJ0b3AiXX0sc2VsZWN0YWJsZTohMCxzaG93Q3VycmVudFRpbWU6ITEsc2hvd01ham9yTGFiZWxzOiEwLHNob3dNaW5vckxhYmVsczohMCxzdGFjazohMCxzdGFydDoiIix0b29sdGlwT25JdGVtVXBkYXRlVGltZTohMSx0eXBlOlsiYm94IiwicG9pbnQiLCJyYW5nZSIsImJhY2tncm91bmQiXSx3aWR0aDoiMTAwJSIsem9vbWFibGU6ITAsem9vbUtleTpbImN0cmxLZXkiLCJhbHRLZXkiLCJtZXRhS2V5IiwiIl0sem9vbU1heDpbMzE1MzZlMTAsMTAsMzE1MzZlMTAsMV0sem9vbU1pbjpbMTAsMTAsMzE1MzZlMTAsMV19fTtlLmFsbE9wdGlvbnM9YyxlLmNvbmZpZ3VyZU9wdGlvbnM9dX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWZ1bmN0aW9uIG4odCxlLGksbyl7aWYoIShBcnJheS5pc0FycmF5KGkpfHxpIGluc3RhbmNlb2YgY3x8aSBpbnN0YW5jZW9mIHUpJiZpIGluc3RhbmNlb2YgT2JqZWN0KXt2YXIgbj1vO289aSxpPW59dmFyIHM9dGhpczt0aGlzLmRlZmF1bHRPcHRpb25zPXtzdGFydDpudWxsLGVuZDpudWxsLGF1dG9SZXNpemU6ITAsb3JpZW50YXRpb246e2F4aXM6ImJvdHRvbSIsaXRlbToiYm90dG9tIn0sbW9tZW50OmQsd2lkdGg6bnVsbCxoZWlnaHQ6bnVsbCxtYXhIZWlnaHQ6bnVsbCxtaW5IZWlnaHQ6bnVsbH0sdGhpcy5vcHRpb25zPWwuZGVlcEV4dGVuZCh7fSx0aGlzLmRlZmF1bHRPcHRpb25zKSx0aGlzLl9jcmVhdGUodCksdGhpcy5jb21wb25lbnRzPVtdLHRoaXMuYm9keT17ZG9tOnRoaXMuZG9tLGRvbVByb3BzOnRoaXMucHJvcHMsZW1pdHRlcjp7b246dGhpcy5vbi5iaW5kKHRoaXMpLG9mZjp0aGlzLm9mZi5iaW5kKHRoaXMpLGVtaXQ6dGhpcy5lbWl0LmJpbmQodGhpcyl9LGhpZGRlbkRhdGVzOltdLHV0aWw6e3RvU2NyZWVuOnMuX3RvU2NyZWVuLmJpbmQocyksdG9HbG9iYWxTY3JlZW46cy5fdG9HbG9iYWxTY3JlZW4uYmluZChzKSx0b1RpbWU6cy5fdG9UaW1lLmJpbmQocyksdG9HbG9iYWxUaW1lOnMuX3RvR2xvYmFsVGltZS5iaW5kKHMpfX0sdGhpcy5yYW5nZT1uZXcgcCh0aGlzLmJvZHkpLHRoaXMuY29tcG9uZW50cy5wdXNoKHRoaXMucmFuZ2UpLHRoaXMuYm9keS5yYW5nZT10aGlzLnJhbmdlLHRoaXMudGltZUF4aXM9bmV3IG0odGhpcy5ib2R5KSx0aGlzLmNvbXBvbmVudHMucHVzaCh0aGlzLnRpbWVBeGlzKSx0aGlzLmN1cnJlbnRUaW1lPW5ldyB2KHRoaXMuYm9keSksdGhpcy5jb21wb25lbnRzLnB1c2godGhpcy5jdXJyZW50VGltZSksdGhpcy5saW5lZ3JhcGg9bmV3IHkodGhpcy5ib2R5KSx0aGlzLmNvbXBvbmVudHMucHVzaCh0aGlzLmxpbmVncmFwaCksdGhpcy5pdGVtc0RhdGE9bnVsbCx0aGlzLmdyb3Vwc0RhdGE9bnVsbCx0aGlzLm9uKCJ0YXAiLGZ1bmN0aW9uKHQpe3MuZW1pdCgiY2xpY2siLHMuZ2V0RXZlbnRQcm9wZXJ0aWVzKHQpKX0pLHRoaXMub24oImRvdWJsZXRhcCIsZnVuY3Rpb24odCl7cy5lbWl0KCJkb3VibGVDbGljayIscy5nZXRFdmVudFByb3BlcnRpZXModCkpfSksdGhpcy5kb20ucm9vdC5vbmNvbnRleHRtZW51PWZ1bmN0aW9uKHQpe3MuZW1pdCgiY29udGV4dG1lbnUiLHMuZ2V0RXZlbnRQcm9wZXJ0aWVzKHQpKX0sbyYmdGhpcy5zZXRPcHRpb25zKG8pLGkmJnRoaXMuc2V0R3JvdXBzKGkpLGUmJnRoaXMuc2V0SXRlbXMoZSksdGhpcy5fcmVkcmF3KCl9dmFyIHM9aSgyOCkscj1vKHMpLGE9aSgzMSksaD1vKGEpLGQ9KGkoMTMpLGkoMjIpLGkoMikpLGw9aSgxKSxjPWkoOSksdT1pKDExKSxwPWkoMzIpLGY9aSgzNSksbT1pKDQ2KSx2PWkoNTApLGc9aSg0OCkseT1pKDUzKSxiPWkoMzEpLnByaW50U3R5bGUsXz1pKDYxKS5hbGxPcHRpb25zLHc9aSg2MSkuY29uZmlndXJlT3B0aW9ucztuLnByb3RvdHlwZT1uZXcgZixuLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe3ZhciBlPWguZGVmYXVsdC52YWxpZGF0ZSh0LF8pO2U9PT0hMCYmY29uc29sZS5sb2coIiVjRXJyb3JzIGhhdmUgYmVlbiBmb3VuZCBpbiB0aGUgc3VwcGxpZWQgb3B0aW9ucyBvYmplY3QuIixiKSxmLnByb3RvdHlwZS5zZXRPcHRpb25zLmNhbGwodGhpcyx0KX0sbi5wcm90b3R5cGUuc2V0SXRlbXM9ZnVuY3Rpb24odCl7dmFyIGUsaT1udWxsPT10aGlzLml0ZW1zRGF0YTtpZihlPXQ/dCBpbnN0YW5jZW9mIGN8fHQgaW5zdGFuY2VvZiB1P3Q6bmV3IGModCx7dHlwZTp7c3RhcnQ6IkRhdGUiLGVuZDoiRGF0ZSJ9fSk6bnVsbCx0aGlzLml0ZW1zRGF0YT1lLHRoaXMubGluZWdyYXBoJiZ0aGlzLmxpbmVncmFwaC5zZXRJdGVtcyhlKSxpKWlmKHZvaWQgMCE9dGhpcy5vcHRpb25zLnN0YXJ0fHx2b2lkIDAhPXRoaXMub3B0aW9ucy5lbmQpe3ZhciBvPXZvaWQgMCE9dGhpcy5vcHRpb25zLnN0YXJ0P3RoaXMub3B0aW9ucy5zdGFydDpudWxsLG49dm9pZCAwIT10aGlzLm9wdGlvbnMuZW5kP3RoaXMub3B0aW9ucy5lbmQ6bnVsbDt0aGlzLnNldFdpbmRvdyhvLG4se2FuaW1hdGlvbjohMX0pfWVsc2UgdGhpcy5maXQoe2FuaW1hdGlvbjohMX0pfSxuLnByb3RvdHlwZS5zZXRHcm91cHM9ZnVuY3Rpb24odCl7dmFyIGU7ZT10P3QgaW5zdGFuY2VvZiBjfHx0IGluc3RhbmNlb2YgdT90Om5ldyBjKHQpOm51bGwsdGhpcy5ncm91cHNEYXRhPWUsdGhpcy5saW5lZ3JhcGguc2V0R3JvdXBzKGUpfSxuLnByb3RvdHlwZS5nZXRMZWdlbmQ9ZnVuY3Rpb24odCxlLGkpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0xNSksdm9pZCAwPT09aSYmKGk9MTUpLHZvaWQgMCE9PXRoaXMubGluZWdyYXBoLmdyb3Vwc1t0XT90aGlzLmxpbmVncmFwaC5ncm91cHNbdF0uZ2V0TGVnZW5kKGUsaSk6ImNhbm5vdCBmaW5kIGdyb3VwOiciK3QrIicifSxuLnByb3RvdHlwZS5pc0dyb3VwVmlzaWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwIT09dGhpcy5saW5lZ3JhcGguZ3JvdXBzW3RdJiYodGhpcy5saW5lZ3JhcGguZ3JvdXBzW3RdLnZpc2libGUmJih2b2lkIDA9PT10aGlzLmxpbmVncmFwaC5vcHRpb25zLmdyb3Vwcy52aXNpYmlsaXR5W3RdfHwxPT10aGlzLmxpbmVncmFwaC5vcHRpb25zLmdyb3Vwcy52aXNpYmlsaXR5W3RdKSl9LG4ucHJvdG90eXBlLmdldERhdGFSYW5nZT1mdW5jdGlvbigpe3ZhciB0PW51bGwsZT1udWxsO2Zvcih2YXIgaSBpbiB0aGlzLmxpbmVncmFwaC5ncm91cHMpaWYodGhpcy5saW5lZ3JhcGguZ3JvdXBzLmhhc093blByb3BlcnR5KGkpJiYxPT10aGlzLmxpbmVncmFwaC5ncm91cHNbaV0udmlzaWJsZSlmb3IodmFyIG89MDtvPHRoaXMubGluZWdyYXBoLmdyb3Vwc1tpXS5pdGVtc0RhdGEubGVuZ3RoO28rKyl7dmFyIG49dGhpcy5saW5lZ3JhcGguZ3JvdXBzW2ldLml0ZW1zRGF0YVtvXSxzPWwuY29udmVydChuLngsIkRhdGUiKS52YWx1ZU9mKCk7dD1udWxsPT10P3M6dD5zP3M6dCxlPW51bGw9PWU/czplPHM/czplfXJldHVybnttaW46bnVsbCE9dD9uZXcgRGF0ZSh0KTpudWxsLG1heDpudWxsIT1lP25ldyBEYXRlKGUpOm51bGx9fSxuLnByb3RvdHlwZS5nZXRFdmVudFByb3BlcnRpZXM9ZnVuY3Rpb24odCl7dmFyIGU9dC5jZW50ZXI/dC5jZW50ZXIueDp0LmNsaWVudFgsaT10LmNlbnRlcj90LmNlbnRlci55OnQuY2xpZW50WSxvPWUtbC5nZXRBYnNvbHV0ZUxlZnQodGhpcy5kb20uY2VudGVyQ29udGFpbmVyKSxuPWktbC5nZXRBYnNvbHV0ZVRvcCh0aGlzLmRvbS5jZW50ZXJDb250YWluZXIpLHM9dGhpcy5fdG9UaW1lKG8pLHI9Zy5jdXN0b21UaW1lRnJvbVRhcmdldCh0KSxhPWwuZ2V0VGFyZ2V0KHQpLGg9bnVsbDtsLmhhc1BhcmVudChhLHRoaXMudGltZUF4aXMuZG9tLmZvcmVncm91bmQpP2g9ImF4aXMiOnRoaXMudGltZUF4aXMyJiZsLmhhc1BhcmVudChhLHRoaXMudGltZUF4aXMyLmRvbS5mb3JlZ3JvdW5kKT9oPSJheGlzIjpsLmhhc1BhcmVudChhLHRoaXMubGluZWdyYXBoLnlBeGlzTGVmdC5kb20uZnJhbWUpP2g9ImRhdGEtYXhpcyI6bC5oYXNQYXJlbnQoYSx0aGlzLmxpbmVncmFwaC55QXhpc1JpZ2h0LmRvbS5mcmFtZSk/aD0iZGF0YS1heGlzIjpsLmhhc1BhcmVudChhLHRoaXMubGluZWdyYXBoLmxlZ2VuZExlZnQuZG9tLmZyYW1lKT9oPSJsZWdlbmQiOmwuaGFzUGFyZW50KGEsdGhpcy5saW5lZ3JhcGgubGVnZW5kUmlnaHQuZG9tLmZyYW1lKT9oPSJsZWdlbmQiOm51bGwhPXI/aD0iY3VzdG9tLXRpbWUiOmwuaGFzUGFyZW50KGEsdGhpcy5jdXJyZW50VGltZS5iYXIpP2g9ImN1cnJlbnQtdGltZSI6bC5oYXNQYXJlbnQoYSx0aGlzLmRvbS5jZW50ZXIpJiYoaD0iYmFja2dyb3VuZCIpO3ZhciBkPVtdLGM9dGhpcy5saW5lZ3JhcGgueUF4aXNMZWZ0LHU9dGhpcy5saW5lZ3JhcGgueUF4aXNSaWdodDtyZXR1cm4gYy5oaWRkZW58fGQucHVzaChjLnNjcmVlblRvVmFsdWUobikpLHUuaGlkZGVufHxkLnB1c2godS5zY3JlZW5Ub1ZhbHVlKG4pKSx7ZXZlbnQ6dCx3aGF0OmgscGFnZVg6dC5zcmNFdmVudD90LnNyY0V2ZW50LnBhZ2VYOnQucGFnZVgscGFnZVk6dC5zcmNFdmVudD90LnNyY0V2ZW50LnBhZ2VZOnQucGFnZVkseDpvLHk6bix0aW1lOnMsdmFsdWU6ZH19LG4ucHJvdG90eXBlLl9jcmVhdGVDb25maWd1cmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHIuZGVmYXVsdCh0aGlzLHRoaXMuZG9tLmNvbnRhaW5lcix3KX0sdC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSl7dGhpcy5pZD1zLnJhbmRvbVVVSUQoKSx0aGlzLmJvZHk9dCx0aGlzLmRlZmF1bHRPcHRpb25zPXt5QXhpc09yaWVudGF0aW9uOiJsZWZ0IixkZWZhdWx0R3JvdXA6ImRlZmF1bHQiLHNvcnQ6ITAsc2FtcGxpbmc6ITAsc3RhY2s6ITEsZ3JhcGhIZWlnaHQ6IjQwMHB4IixzaGFkZWQ6e2VuYWJsZWQ6ITEsb3JpZW50YXRpb246ImJvdHRvbSJ9LHN0eWxlOiJsaW5lIixiYXJDaGFydDp7d2lkdGg6NTAsc2lkZUJ5U2lkZTohMSxhbGlnbjoiY2VudGVyIn0saW50ZXJwb2xhdGlvbjp7ZW5hYmxlZDohMCxwYXJhbWV0cml6YXRpb246ImNlbnRyaXBldGFsIixhbHBoYTouNX0sZHJhd1BvaW50czp7ZW5hYmxlZDohMCxzaXplOjYsc3R5bGU6InNxdWFyZSJ9LGRhdGFBeGlzOnt9LGxlZ2VuZDp7fSxncm91cHM6e3Zpc2liaWxpdHk6e319fSx0aGlzLm9wdGlvbnM9cy5leHRlbmQoe30sdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5kb209e30sdGhpcy5wcm9wcz17fSx0aGlzLmhhbW1lcj1udWxsLHRoaXMuZ3JvdXBzPXt9LHRoaXMuYWJvcnRlZEdyYXBoVXBkYXRlPSExLHRoaXMudXBkYXRlU1ZHaGVpZ2h0PSExLHRoaXMudXBkYXRlU1ZHaGVpZ2h0T25SZXNpemU9ITEsdGhpcy5mb3JjZUdyYXBoVXBkYXRlPSEwO3ZhciBpPXRoaXM7dGhpcy5pdGVtc0RhdGE9bnVsbCx0aGlzLmdyb3Vwc0RhdGE9bnVsbCx0aGlzLml0ZW1MaXN0ZW5lcnM9e2FkZDpmdW5jdGlvbih0LGUsbyl7aS5fb25BZGQoZS5pdGVtcyl9LHVwZGF0ZTpmdW5jdGlvbih0LGUsbyl7aS5fb25VcGRhdGUoZS5pdGVtcyl9LHJlbW92ZTpmdW5jdGlvbih0LGUsbyl7aS5fb25SZW1vdmUoZS5pdGVtcyl9fSx0aGlzLmdyb3VwTGlzdGVuZXJzPXthZGQ6ZnVuY3Rpb24odCxlLG8pe2kuX29uQWRkR3JvdXBzKGUuaXRlbXMpfSx1cGRhdGU6ZnVuY3Rpb24odCxlLG8pe2kuX29uVXBkYXRlR3JvdXBzKGUuaXRlbXMpfSxyZW1vdmU6ZnVuY3Rpb24odCxlLG8pe2kuX29uUmVtb3ZlR3JvdXBzKGUuaXRlbXMpfX0sdGhpcy5pdGVtcz17fSx0aGlzLnNlbGVjdGlvbj1bXSx0aGlzLmxhc3RTdGFydD10aGlzLmJvZHkucmFuZ2Uuc3RhcnQsdGhpcy50b3VjaFBhcmFtcz17fSx0aGlzLnN2Z0VsZW1lbnRzPXt9LHRoaXMuc2V0T3B0aW9ucyhlKSx0aGlzLmdyb3Vwc1VzaW5nRGVmYXVsdFN0eWxlcz1bMF0sdGhpcy5ib2R5LmVtaXR0ZXIub24oInJhbmdlY2hhbmdlZCIsZnVuY3Rpb24oKXtpLmxhc3RTdGFydD1pLmJvZHkucmFuZ2Uuc3RhcnQsaS5zdmcuc3R5bGUubGVmdD1zLm9wdGlvbi5hc1NpemUoLWkucHJvcHMud2lkdGgpLGkuZm9yY2VHcmFwaFVwZGF0ZT0hMCxpLnJlZHJhdy5jYWxsKGkpfSksdGhpcy5fY3JlYXRlKCksdGhpcy5mcmFtZXdvcms9e3N2Zzp0aGlzLnN2ZyxzdmdFbGVtZW50czp0aGlzLnN2Z0VsZW1lbnRzLG9wdGlvbnM6dGhpcy5vcHRpb25zLGdyb3Vwczp0aGlzLmdyb3Vwc319dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9LHM9aSgxKSxyPWkoOCksYT1pKDkpLGg9aSgxMSksZD1pKDMzKSxsPWkoNTQpLGM9aSg1NiksdT1pKDYwKSxwPWkoNTcpLGY9aSg1OSksbT1pKDU4KSx2PSJfX3VuZ3JvdXBlZF9fIjtvLnByb3RvdHlwZT1uZXcgZCxvLnByb3RvdHlwZS5fY3JlYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC5jbGFzc05hbWU9InZpcy1saW5lLWdyYXBoIix0aGlzLmRvbS5mcmFtZT10LHRoaXMuc3ZnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJzdmciKSx0aGlzLnN2Zy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLHRoaXMuc3ZnLnN0eWxlLmhlaWdodD0oIiIrdGhpcy5vcHRpb25zLmdyYXBoSGVpZ2h0KS5yZXBsYWNlKCJweCIsIiIpKyJweCIsdGhpcy5zdmcuc3R5bGUuZGlzcGxheT0iYmxvY2siLHQuYXBwZW5kQ2hpbGQodGhpcy5zdmcpLHRoaXMub3B0aW9ucy5kYXRhQXhpcy5vcmllbnRhdGlvbj0ibGVmdCIsdGhpcy55QXhpc0xlZnQ9bmV3IGwodGhpcy5ib2R5LHRoaXMub3B0aW9ucy5kYXRhQXhpcyx0aGlzLnN2Zyx0aGlzLm9wdGlvbnMuZ3JvdXBzKSx0aGlzLm9wdGlvbnMuZGF0YUF4aXMub3JpZW50YXRpb249InJpZ2h0Iix0aGlzLnlBeGlzUmlnaHQ9bmV3IGwodGhpcy5ib2R5LHRoaXMub3B0aW9ucy5kYXRhQXhpcyx0aGlzLnN2Zyx0aGlzLm9wdGlvbnMuZ3JvdXBzKSxkZWxldGUgdGhpcy5vcHRpb25zLmRhdGFBeGlzLm9yaWVudGF0aW9uLHRoaXMubGVnZW5kTGVmdD1uZXcgdSh0aGlzLmJvZHksdGhpcy5vcHRpb25zLmxlZ2VuZCwibGVmdCIsdGhpcy5vcHRpb25zLmdyb3VwcyksdGhpcy5sZWdlbmRSaWdodD1uZXcgdSh0aGlzLmJvZHksdGhpcy5vcHRpb25zLmxlZ2VuZCwicmlnaHQiLHRoaXMub3B0aW9ucy5ncm91cHMpLHRoaXMuc2hvdygpfSxvLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe2lmKHQpe3ZhciBlPVsic2FtcGxpbmciLCJkZWZhdWx0R3JvdXAiLCJzdGFjayIsImhlaWdodCIsImdyYXBoSGVpZ2h0IiwieUF4aXNPcmllbnRhdGlvbiIsInN0eWxlIiwiYmFyQ2hhcnQiLCJkYXRhQXhpcyIsInNvcnQiLCJncm91cHMiXTt2b2lkIDA9PT10LmdyYXBoSGVpZ2h0JiZ2b2lkIDAhPT10LmhlaWdodD8odGhpcy51cGRhdGVTVkdoZWlnaHQ9ITAsdGhpcy51cGRhdGVTVkdoZWlnaHRPblJlc2l6ZT0hMCk6dm9pZCAwIT09dGhpcy5ib2R5LmRvbVByb3BzLmNlbnRlckNvbnRhaW5lci5oZWlnaHQmJnZvaWQgMCE9PXQuZ3JhcGhIZWlnaHQmJnBhcnNlSW50KCh0LmdyYXBoSGVpZ2h0KyIiKS5yZXBsYWNlKCJweCIsIiIpKTx0aGlzLmJvZHkuZG9tUHJvcHMuY2VudGVyQ29udGFpbmVyLmhlaWdodCYmKHRoaXMudXBkYXRlU1ZHaGVpZ2h0PSEwKSxzLnNlbGVjdGl2ZURlZXBFeHRlbmQoZSx0aGlzLm9wdGlvbnMsdCkscy5tZXJnZU9wdGlvbnModGhpcy5vcHRpb25zLHQsImludGVycG9sYXRpb24iKSxzLm1lcmdlT3B0aW9ucyh0aGlzLm9wdGlvbnMsdCwiZHJhd1BvaW50cyIpLHMubWVyZ2VPcHRpb25zKHRoaXMub3B0aW9ucyx0LCJzaGFkZWQiKSxzLm1lcmdlT3B0aW9ucyh0aGlzLm9wdGlvbnMsdCwibGVnZW5kIiksdC5pbnRlcnBvbGF0aW9uJiYib2JqZWN0Ij09bih0LmludGVycG9sYXRpb24pJiZ0LmludGVycG9sYXRpb24ucGFyYW1ldHJpemF0aW9uJiYoInVuaWZvcm0iPT10LmludGVycG9sYXRpb24ucGFyYW1ldHJpemF0aW9uP3RoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmFscGhhPTA6ImNob3JkYWwiPT10LmludGVycG9sYXRpb24ucGFyYW1ldHJpemF0aW9uP3RoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmFscGhhPTE6KHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnBhcmFtZXRyaXphdGlvbj0iY2VudHJpcGV0YWwiLHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmFscGhhPS41KSksdGhpcy55QXhpc0xlZnQmJnZvaWQgMCE9PXQuZGF0YUF4aXMmJih0aGlzLnlBeGlzTGVmdC5zZXRPcHRpb25zKHRoaXMub3B0aW9ucy5kYXRhQXhpcyksdGhpcy55QXhpc1JpZ2h0LnNldE9wdGlvbnModGhpcy5vcHRpb25zLmRhdGFBeGlzKSksdGhpcy5sZWdlbmRMZWZ0JiZ2b2lkIDAhPT10LmxlZ2VuZCYmKHRoaXMubGVnZW5kTGVmdC5zZXRPcHRpb25zKHRoaXMub3B0aW9ucy5sZWdlbmQpLHRoaXMubGVnZW5kUmlnaHQuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMubGVnZW5kKSksdGhpcy5ncm91cHMuaGFzT3duUHJvcGVydHkodikmJnRoaXMuZ3JvdXBzW3ZdLnNldE9wdGlvbnModCl9dGhpcy5kb20uZnJhbWUmJih0aGlzLmZvcmNlR3JhcGhVcGRhdGU9ITAsdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX2NoYW5nZSIse3F1ZXVlOiEwfSkpfSxvLnByb3RvdHlwZS5oaWRlPWZ1bmN0aW9uKCl7dGhpcy5kb20uZnJhbWUucGFyZW50Tm9kZSYmdGhpcy5kb20uZnJhbWUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRvbS5mcmFtZSl9LG8ucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oKXt0aGlzLmRvbS5mcmFtZS5wYXJlbnROb2RlfHx0aGlzLmJvZHkuZG9tLmNlbnRlci5hcHBlbmRDaGlsZCh0aGlzLmRvbS5mcmFtZSl9LG8ucHJvdG90eXBlLnNldEl0ZW1zPWZ1bmN0aW9uKHQpe3ZhciBlLGk9dGhpcyxvPXRoaXMuaXRlbXNEYXRhO2lmKHQpe2lmKCEodCBpbnN0YW5jZW9mIGF8fHQgaW5zdGFuY2VvZiBoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJEYXRhIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgRGF0YVNldCBvciBEYXRhVmlldyIpO3RoaXMuaXRlbXNEYXRhPXR9ZWxzZSB0aGlzLml0ZW1zRGF0YT1udWxsO2lmKG8mJihzLmZvckVhY2godGhpcy5pdGVtTGlzdGVuZXJzLGZ1bmN0aW9uKHQsZSl7by5vZmYoZSx0KX0pLGU9by5nZXRJZHMoKSx0aGlzLl9vblJlbW92ZShlKSksdGhpcy5pdGVtc0RhdGEpe3ZhciBuPXRoaXMuaWQ7cy5mb3JFYWNoKHRoaXMuaXRlbUxpc3RlbmVycyxmdW5jdGlvbih0LGUpe2kuaXRlbXNEYXRhLm9uKGUsdCxuKX0pLGU9dGhpcy5pdGVtc0RhdGEuZ2V0SWRzKCksdGhpcy5fb25BZGQoZSl9fSxvLnByb3RvdHlwZS5zZXRHcm91cHM9ZnVuY3Rpb24odCl7dmFyIGUsaT10aGlzO2lmKHRoaXMuZ3JvdXBzRGF0YSl7cy5mb3JFYWNoKHRoaXMuZ3JvdXBMaXN0ZW5lcnMsZnVuY3Rpb24odCxlKXtpLmdyb3Vwc0RhdGEub2ZmKGUsdCl9KSxlPXRoaXMuZ3JvdXBzRGF0YS5nZXRJZHMoKSx0aGlzLmdyb3Vwc0RhdGE9bnVsbDtmb3IodmFyIG89MDtvPGUubGVuZ3RoO28rKyl0aGlzLl9yZW1vdmVHcm91cChlW29dKX1pZih0KXtpZighKHQgaW5zdGFuY2VvZiBhfHx0IGluc3RhbmNlb2YgaCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiRGF0YSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIERhdGFTZXQgb3IgRGF0YVZpZXciKTt0aGlzLmdyb3Vwc0RhdGE9dH1lbHNlIHRoaXMuZ3JvdXBzRGF0YT1udWxsO2lmKHRoaXMuZ3JvdXBzRGF0YSl7dmFyIG49dGhpcy5pZDtzLmZvckVhY2godGhpcy5ncm91cExpc3RlbmVycyxmdW5jdGlvbih0LGUpe2kuZ3JvdXBzRGF0YS5vbihlLHQsbil9KSxlPXRoaXMuZ3JvdXBzRGF0YS5nZXRJZHMoKSx0aGlzLl9vbkFkZEdyb3VwcyhlKX19LG8ucHJvdG90eXBlLl9vblVwZGF0ZT1mdW5jdGlvbih0KXt0aGlzLl91cGRhdGVBbGxHcm91cERhdGEoKX0sby5wcm90b3R5cGUuX29uQWRkPWZ1bmN0aW9uKHQpe3RoaXMuX29uVXBkYXRlKHQpfSxvLnByb3RvdHlwZS5fb25SZW1vdmU9ZnVuY3Rpb24odCl7dGhpcy5fb25VcGRhdGUodCl9LG8ucHJvdG90eXBlLl9vblVwZGF0ZUdyb3Vwcz1mdW5jdGlvbih0KXt0aGlzLl91cGRhdGVBbGxHcm91cERhdGEoKX0sby5wcm90b3R5cGUuX29uQWRkR3JvdXBzPWZ1bmN0aW9uKHQpe3RoaXMuX29uVXBkYXRlR3JvdXBzKHQpfSxvLnByb3RvdHlwZS5fb25SZW1vdmVHcm91cHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspdGhpcy5fcmVtb3ZlR3JvdXAodFtlXSk7dGhpcy5mb3JjZUdyYXBoVXBkYXRlPSEwLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9jaGFuZ2UiLHtxdWV1ZTohMH0pfSxvLnByb3RvdHlwZS5fcmVtb3ZlR3JvdXA9ZnVuY3Rpb24odCl7dGhpcy5ncm91cHMuaGFzT3duUHJvcGVydHkodCkmJigicmlnaHQiPT10aGlzLmdyb3Vwc1t0XS5vcHRpb25zLnlBeGlzT3JpZW50YXRpb24/KHRoaXMueUF4aXNSaWdodC5yZW1vdmVHcm91cCh0KSx0aGlzLmxlZ2VuZFJpZ2h0LnJlbW92ZUdyb3VwKHQpLHRoaXMubGVnZW5kUmlnaHQucmVkcmF3KCkpOih0aGlzLnlBeGlzTGVmdC5yZW1vdmVHcm91cCh0KSx0aGlzLmxlZ2VuZExlZnQucmVtb3ZlR3JvdXAodCksdGhpcy5sZWdlbmRMZWZ0LnJlZHJhdygpKSxkZWxldGUgdGhpcy5ncm91cHNbdF0pfSxvLnByb3RvdHlwZS5fdXBkYXRlR3JvdXA9ZnVuY3Rpb24odCxlKXt0aGlzLmdyb3Vwcy5oYXNPd25Qcm9wZXJ0eShlKT8odGhpcy5ncm91cHNbZV0udXBkYXRlKHQpLCJyaWdodCI9PXRoaXMuZ3JvdXBzW2VdLm9wdGlvbnMueUF4aXNPcmllbnRhdGlvbj8odGhpcy55QXhpc1JpZ2h0LnVwZGF0ZUdyb3VwKGUsdGhpcy5ncm91cHNbZV0pLHRoaXMubGVnZW5kUmlnaHQudXBkYXRlR3JvdXAoZSx0aGlzLmdyb3Vwc1tlXSksdGhpcy55QXhpc0xlZnQucmVtb3ZlR3JvdXAoZSksdGhpcy5sZWdlbmRMZWZ0LnJlbW92ZUdyb3VwKGUpKToodGhpcy55QXhpc0xlZnQudXBkYXRlR3JvdXAoZSx0aGlzLmdyb3Vwc1tlXSksdGhpcy5sZWdlbmRMZWZ0LnVwZGF0ZUdyb3VwKGUsdGhpcy5ncm91cHNbZV0pLHRoaXMueUF4aXNSaWdodC5yZW1vdmVHcm91cChlKSx0aGlzLmxlZ2VuZFJpZ2h0LnJlbW92ZUdyb3VwKGUpKSk6KHRoaXMuZ3JvdXBzW2VdPW5ldyBjKHQsZSx0aGlzLm9wdGlvbnMsdGhpcy5ncm91cHNVc2luZ0RlZmF1bHRTdHlsZXMpLCJyaWdodCI9PXRoaXMuZ3JvdXBzW2VdLm9wdGlvbnMueUF4aXNPcmllbnRhdGlvbj8odGhpcy55QXhpc1JpZ2h0LmFkZEdyb3VwKGUsdGhpcy5ncm91cHNbZV0pLHRoaXMubGVnZW5kUmlnaHQuYWRkR3JvdXAoZSx0aGlzLmdyb3Vwc1tlXSkpOih0aGlzLnlBeGlzTGVmdC5hZGRHcm91cChlLHRoaXMuZ3JvdXBzW2VdKSx0aGlzLmxlZ2VuZExlZnQuYWRkR3JvdXAoZSx0aGlzLmdyb3Vwc1tlXSkpKSx0aGlzLmxlZ2VuZExlZnQucmVkcmF3KCksdGhpcy5sZWdlbmRSaWdodC5yZWRyYXcoKX0sby5wcm90b3R5cGUuX3VwZGF0ZUFsbEdyb3VwRGF0YT1mdW5jdGlvbigpe2lmKG51bGwhPXRoaXMuaXRlbXNEYXRhKXtmb3IodmFyIHQ9e30sZT10aGlzLml0ZW1zRGF0YS5nZXQoKSxpPXt9LG89MDtvPGUubGVuZ3RoO28rKyl7dmFyIG49ZVtvXSxyPW4uZ3JvdXA7bnVsbCE9PXImJnZvaWQgMCE9PXJ8fChyPXYpLGkuaGFzT3duUHJvcGVydHkocik/aVtyXSsrOmlbcl09MX1mb3IodmFyIG89MDtvPGUubGVuZ3RoO28rKyl7dmFyIG49ZVtvXSxyPW4uZ3JvdXA7bnVsbCE9PXImJnZvaWQgMCE9PXJ8fChyPXYpLHQuaGFzT3duUHJvcGVydHkocil8fCh0W3JdPW5ldyBBcnJheShpW3JdKSk7dmFyIGE9cy5icmlkZ2VPYmplY3Qobik7YS54PXMuY29udmVydChuLngsIkRhdGUiKSxhLm9yZ2luYWxZPW4ueSxhLnk9TnVtYmVyKG4ueSk7dmFyIGg9dFtyXS5sZW5ndGgtaVtyXS0tO3Rbcl1baF09YX1mb3IodmFyIHIgaW4gdGhpcy5ncm91cHMpdGhpcy5ncm91cHMuaGFzT3duUHJvcGVydHkocikmJih0Lmhhc093blByb3BlcnR5KHIpfHwodFtyXT1uZXcgQXJyYXkoMCkpKTtmb3IodmFyIHIgaW4gdClpZih0Lmhhc093blByb3BlcnR5KHIpKWlmKDA9PXRbcl0ubGVuZ3RoKXRoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KHIpJiZ0aGlzLl9yZW1vdmVHcm91cChyKTtlbHNle3ZhciBkPXZvaWQgMDt2b2lkIDAhPXRoaXMuZ3JvdXBzRGF0YSYmKGQ9dGhpcy5ncm91cHNEYXRhLmdldChyKSksdm9pZCAwPT1kJiYoZD17aWQ6cixjb250ZW50OnRoaXMub3B0aW9ucy5kZWZhdWx0R3JvdXArcn0pLHRoaXMuX3VwZGF0ZUdyb3VwKGQsciksdGhpcy5ncm91cHNbcl0uc2V0SXRlbXModFtyXSl9dGhpcy5mb3JjZUdyYXBoVXBkYXRlPSEwLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9jaGFuZ2UiLHtxdWV1ZTohMH0pfX0sby5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7dmFyIHQ9ITE7dGhpcy5wcm9wcy53aWR0aD10aGlzLmRvbS5mcmFtZS5vZmZzZXRXaWR0aCx0aGlzLnByb3BzLmhlaWdodD10aGlzLmJvZHkuZG9tUHJvcHMuY2VudGVyQ29udGFpbmVyLmhlaWdodC10aGlzLmJvZHkuZG9tUHJvcHMuYm9yZGVyLnRvcC10aGlzLmJvZHkuZG9tUHJvcHMuYm9yZGVyLmJvdHRvbSx0PXRoaXMuX2lzUmVzaXplZCgpfHx0O3ZhciBlPXRoaXMuYm9keS5yYW5nZS5lbmQtdGhpcy5ib2R5LnJhbmdlLnN0YXJ0LGk9ZSE9dGhpcy5sYXN0VmlzaWJsZUludGVydmFsO2lmKHRoaXMubGFzdFZpc2libGVJbnRlcnZhbD1lLDE9PXQmJih0aGlzLnN2Zy5zdHlsZS53aWR0aD1zLm9wdGlvbi5hc1NpemUoMyp0aGlzLnByb3BzLndpZHRoKSx0aGlzLnN2Zy5zdHlsZS5sZWZ0PXMub3B0aW9uLmFzU2l6ZSgtdGhpcy5wcm9wcy53aWR0aCksKHRoaXMub3B0aW9ucy5oZWlnaHQrIiIpLmluZGV4T2YoIiUiKT09LTEmJjEhPXRoaXMudXBkYXRlU1ZHaGVpZ2h0T25SZXNpemV8fCh0aGlzLnVwZGF0ZVNWR2hlaWdodD0hMCkpLDE9PXRoaXMudXBkYXRlU1ZHaGVpZ2h0Pyh0aGlzLm9wdGlvbnMuZ3JhcGhIZWlnaHQhPXRoaXMucHJvcHMuaGVpZ2h0KyJweCImJih0aGlzLm9wdGlvbnMuZ3JhcGhIZWlnaHQ9dGhpcy5wcm9wcy5oZWlnaHQrInB4Iix0aGlzLnN2Zy5zdHlsZS5oZWlnaHQ9dGhpcy5wcm9wcy5oZWlnaHQrInB4IiksdGhpcy51cGRhdGVTVkdoZWlnaHQ9ITEpOnRoaXMuc3ZnLnN0eWxlLmhlaWdodD0oIiIrdGhpcy5vcHRpb25zLmdyYXBoSGVpZ2h0KS5yZXBsYWNlKCJweCIsIiIpKyJweCIsMT09dHx8MT09aXx8MT09dGhpcy5hYm9ydGVkR3JhcGhVcGRhdGV8fDE9PXRoaXMuZm9yY2VHcmFwaFVwZGF0ZSl0PXRoaXMuX3VwZGF0ZUdyYXBoKCl8fHQsdGhpcy5mb3JjZUdyYXBoVXBkYXRlPSExO2Vsc2UgaWYoMCE9dGhpcy5sYXN0U3RhcnQpe3ZhciBvPXRoaXMuYm9keS5yYW5nZS5zdGFydC10aGlzLmxhc3RTdGFydCxuPXRoaXMuYm9keS5yYW5nZS5lbmQtdGhpcy5ib2R5LnJhbmdlLnN0YXJ0O2lmKDAhPXRoaXMucHJvcHMud2lkdGgpe3ZhciByPXRoaXMucHJvcHMud2lkdGgvbixhPW8qcjt0aGlzLnN2Zy5zdHlsZS5sZWZ0PS10aGlzLnByb3BzLndpZHRoLWErInB4In19cmV0dXJuIHRoaXMubGVnZW5kTGVmdC5yZWRyYXcoKSx0aGlzLmxlZ2VuZFJpZ2h0LnJlZHJhdygpLHR9LG8ucHJvdG90eXBlLl9nZXRTb3J0ZWRHcm91cElkcz1mdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzLmdyb3VwcylpZih0aGlzLmdyb3Vwcy5oYXNPd25Qcm9wZXJ0eShlKSl7dmFyIGk9dGhpcy5ncm91cHNbZV07MSE9aS52aXNpYmxlfHx2b2lkIDAhPT10aGlzLm9wdGlvbnMuZ3JvdXBzLnZpc2liaWxpdHlbZV0mJjEhPXRoaXMub3B0aW9ucy5ncm91cHMudmlzaWJpbGl0eVtlXXx8dC5wdXNoKHtpZDplLHpJbmRleDppLm9wdGlvbnMuekluZGV4fSl9cy5pbnNlcnRTb3J0KHQsZnVuY3Rpb24odCxlKXt2YXIgaT10LnpJbmRleCxvPWUuekluZGV4O3JldHVybiB2b2lkIDA9PT1pJiYoaT0wKSx2b2lkIDA9PT1vJiYobz0wKSxpPT1vPzA6aTxvPy0xOjF9KTtmb3IodmFyIG89bmV3IEFycmF5KHQubGVuZ3RoKSxuPTA7bjx0Lmxlbmd0aDtuKyspb1tuXT10W25dLmlkO3JldHVybiBvfSxvLnByb3RvdHlwZS5fdXBkYXRlR3JhcGg9ZnVuY3Rpb24oKXtpZihyLnByZXBhcmVFbGVtZW50cyh0aGlzLnN2Z0VsZW1lbnRzKSwwIT10aGlzLnByb3BzLndpZHRoJiZudWxsIT10aGlzLml0ZW1zRGF0YSl7dmFyIHQsZSxpPXt9LG89ITEsbj10aGlzLmJvZHkudXRpbC50b0dsb2JhbFRpbWUoLXRoaXMuYm9keS5kb21Qcm9wcy5yb290LndpZHRoKSxzPXRoaXMuYm9keS51dGlsLnRvR2xvYmFsVGltZSgyKnRoaXMuYm9keS5kb21Qcm9wcy5yb290LndpZHRoKSxhPXRoaXMuX2dldFNvcnRlZEdyb3VwSWRzKCk7aWYoYS5sZW5ndGg+MCl7dmFyIGg9e307Zm9yKHRoaXMuX2dldFJlbGV2YW50RGF0YShhLGgsbixzKSx0aGlzLl9hcHBseVNhbXBsaW5nKGEsaCksZT0wO2U8YS5sZW5ndGg7ZSsrKXRoaXMuX2NvbnZlcnRYY29vcmRpbmF0ZXMoaFthW2VdXSk7aWYodGhpcy5fZ2V0WVJhbmdlcyhhLGgsaSksbz10aGlzLl91cGRhdGVZQXhpcyhhLGkpLDE9PW8pcmV0dXJuIHIuY2xlYW51cEVsZW1lbnRzKHRoaXMuc3ZnRWxlbWVudHMpLHRoaXMuYWJvcnRlZEdyYXBoVXBkYXRlPSEwLCEwO3RoaXMuYWJvcnRlZEdyYXBoVXBkYXRlPSExO3ZhciBkPXZvaWQgMDtmb3IoZT0wO2U8YS5sZW5ndGg7ZSsrKXQ9dGhpcy5ncm91cHNbYVtlXV0sdGhpcy5vcHRpb25zLnN0YWNrPT09ITAmJiJsaW5lIj09PXRoaXMub3B0aW9ucy5zdHlsZSYmKHZvaWQgMCE9dC5vcHRpb25zLmV4Y2x1ZGVGcm9tU3RhY2tpbmcmJnQub3B0aW9ucy5leGNsdWRlRnJvbVN0YWNraW5nfHwodm9pZCAwIT1kJiYodGhpcy5fc3RhY2soaFt0LmlkXSxoW2QuaWRdKSwxPT10Lm9wdGlvbnMuc2hhZGVkLmVuYWJsZWQmJiJncm91cCIhPT10Lm9wdGlvbnMuc2hhZGVkLm9yaWVudGF0aW9uJiYoInRvcCI9PXQub3B0aW9ucy5zaGFkZWQub3JpZW50YXRpb24mJiJncm91cCIhPT1kLm9wdGlvbnMuc2hhZGVkLm9yaWVudGF0aW9uPyhkLm9wdGlvbnMuc2hhZGVkLm9yaWVudGF0aW9uPSJncm91cCIsCmQub3B0aW9ucy5zaGFkZWQuZ3JvdXBJZD10LmlkKToodC5vcHRpb25zLnNoYWRlZC5vcmllbnRhdGlvbj0iZ3JvdXAiLHQub3B0aW9ucy5zaGFkZWQuZ3JvdXBJZD1kLmlkKSkpLGQ9dCkpLHRoaXMuX2NvbnZlcnRZY29vcmRpbmF0ZXMoaFthW2VdXSx0KTt2YXIgbD17fTtmb3IoZT0wO2U8YS5sZW5ndGg7ZSsrKWlmKHQ9dGhpcy5ncm91cHNbYVtlXV0sImxpbmUiPT09dC5vcHRpb25zLnN0eWxlJiYxPT10Lm9wdGlvbnMuc2hhZGVkLmVuYWJsZWQpe3ZhciBjPWhbYVtlXV07aWYobnVsbD09Y3x8MD09Yy5sZW5ndGgpY29udGludWU7aWYobC5oYXNPd25Qcm9wZXJ0eShhW2VdKXx8KGxbYVtlXV09Zi5jYWxjUGF0aChjLHQpKSwiZ3JvdXAiPT09dC5vcHRpb25zLnNoYWRlZC5vcmllbnRhdGlvbil7dmFyIHU9dC5vcHRpb25zLnNoYWRlZC5ncm91cElkO2lmKGEuaW5kZXhPZih1KT09PS0xKXtjb25zb2xlLmxvZyh0LmlkKyI6IFVua25vd24gc2hhZGluZyBncm91cCB0YXJnZXQgZ2l2ZW46Iit1KTtjb250aW51ZX1sLmhhc093blByb3BlcnR5KHUpfHwobFt1XT1mLmNhbGNQYXRoKGhbdV0sdGhpcy5ncm91cHNbdV0pKSxmLmRyYXdTaGFkaW5nKGxbYVtlXV0sdCxsW3VdLHRoaXMuZnJhbWV3b3JrKX1lbHNlIGYuZHJhd1NoYWRpbmcobFthW2VdXSx0LHZvaWQgMCx0aGlzLmZyYW1ld29yayl9Zm9yKHAuZHJhdyhhLGgsdGhpcy5mcmFtZXdvcmspLGU9MDtlPGEubGVuZ3RoO2UrKylpZih0PXRoaXMuZ3JvdXBzW2FbZV1dLGhbYVtlXV0ubGVuZ3RoPjApc3dpdGNoKHQub3B0aW9ucy5zdHlsZSl7Y2FzZSJsaW5lIjpsLmhhc093blByb3BlcnR5KGFbZV0pfHwobFthW2VdXT1mLmNhbGNQYXRoKGhbYVtlXV0sdCkpLGYuZHJhdyhsW2FbZV1dLHQsdGhpcy5mcmFtZXdvcmspO2Nhc2UicG9pbnQiOmNhc2UicG9pbnRzIjoicG9pbnQiIT10Lm9wdGlvbnMuc3R5bGUmJiJwb2ludHMiIT10Lm9wdGlvbnMuc3R5bGUmJjEhPXQub3B0aW9ucy5kcmF3UG9pbnRzLmVuYWJsZWR8fG0uZHJhdyhoW2FbZV1dLHQsdGhpcy5mcmFtZXdvcmspO2JyZWFrO2Nhc2UiYmFyIjp9fX1yZXR1cm4gci5jbGVhbnVwRWxlbWVudHModGhpcy5zdmdFbGVtZW50cyksITF9LG8ucHJvdG90eXBlLl9zdGFjaz1mdW5jdGlvbih0LGUpe3ZhciBpLG8sbixzLHI7aT0wO2Zvcih2YXIgYT0wO2E8dC5sZW5ndGg7YSsrKXtzPXZvaWQgMCxyPXZvaWQgMDtmb3IodmFyIGg9aTtoPGUubGVuZ3RoO2grKyl7aWYoZVtoXS54PT09dFthXS54KXtzPWVbaF0scj1lW2hdLGk9aDticmVha31pZihlW2hdLng+dFthXS54KXtyPWVbaF0scz0wPT1oP3I6ZVtoLTFdLGk9aDticmVha319dm9pZCAwPT09ciYmKHM9ZVtlLmxlbmd0aC0xXSxyPWVbZS5sZW5ndGgtMV0pLG89ci54LXMueCxuPXIueS1zLnksMD09bz90W2FdLnk9dFthXS5vcmdpbmFsWStyLnk6dFthXS55PXRbYV0ub3JnaW5hbFkrbi9vKih0W2FdLngtcy54KStzLnl9fSxvLnByb3RvdHlwZS5fZ2V0UmVsZXZhbnREYXRhPWZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuLHIsYSxoO2lmKHQubGVuZ3RoPjApZm9yKHI9MDtyPHQubGVuZ3RoO3IrKyl7bj10aGlzLmdyb3Vwc1t0W3JdXTt2YXIgZD1uLmdldEl0ZW1zKCk7aWYoMT09bi5vcHRpb25zLnNvcnQpe3ZhciBsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZ2V0VGltZSgpPT1lLmdldFRpbWUoKT8wOnQ8ZT8tMToxfSxjPU1hdGgubWF4KDAscy5iaW5hcnlTZWFyY2hWYWx1ZShkLGksIngiLCJiZWZvcmUiLGwpKSx1PU1hdGgubWluKGQubGVuZ3RoLHMuYmluYXJ5U2VhcmNoVmFsdWUoZCxvLCJ4IiwiYWZ0ZXIiLGwpKzEpO3U8PTAmJih1PWQubGVuZ3RoKTt2YXIgcD1uZXcgQXJyYXkodS1jKTtmb3IoYT1jO2E8dTthKyspaD1uLml0ZW1zRGF0YVthXSxwW2EtY109aDtlW3Rbcl1dPXB9ZWxzZSBlW3Rbcl1dPW4uaXRlbXNEYXRhfX0sby5wcm90b3R5cGUuX2FwcGx5U2FtcGxpbmc9ZnVuY3Rpb24odCxlKXt2YXIgaTtpZih0Lmxlbmd0aD4wKWZvcih2YXIgbz0wO288dC5sZW5ndGg7bysrKWlmKGk9dGhpcy5ncm91cHNbdFtvXV0sMT09aS5vcHRpb25zLnNhbXBsaW5nKXt2YXIgbj1lW3Rbb11dO2lmKG4ubGVuZ3RoPjApe3ZhciBzPTEscj1uLmxlbmd0aCxhPXRoaXMuYm9keS51dGlsLnRvR2xvYmFsU2NyZWVuKG5bbi5sZW5ndGgtMV0ueCktdGhpcy5ib2R5LnV0aWwudG9HbG9iYWxTY3JlZW4oblswXS54KSxoPXIvYTtzPU1hdGgubWluKE1hdGguY2VpbCguMipyKSxNYXRoLm1heCgxLE1hdGgucm91bmQoaCkpKTtmb3IodmFyIGQ9bmV3IEFycmF5KHIpLGw9MDtsPHI7bCs9cyl7dmFyIGM9TWF0aC5yb3VuZChsL3MpO2RbY109bltsXX1lW3Rbb11dPWQuc3BsaWNlKDAsTWF0aC5yb3VuZChyL3MpKX19fSxvLnByb3RvdHlwZS5fZ2V0WVJhbmdlcz1mdW5jdGlvbih0LGUsaSl7dmFyIG8sbixzLHIsYT1bXSxoPVtdO2lmKHQubGVuZ3RoPjApe2ZvcihzPTA7czx0Lmxlbmd0aDtzKyspbz1lW3Rbc11dLHI9dGhpcy5ncm91cHNbdFtzXV0ub3B0aW9ucyxvLmxlbmd0aD4wJiYobj10aGlzLmdyb3Vwc1t0W3NdXSxyLnN0YWNrPT09ITAmJiJiYXIiPT09ci5zdHlsZT8ibGVmdCI9PT1yLnlBeGlzT3JpZW50YXRpb24/YT1hLmNvbmNhdChuLmdldEl0ZW1zKCkpOmg9aC5jb25jYXQobi5nZXRJdGVtcygpKTppW3Rbc11dPW4uZ2V0WVJhbmdlKG8sdFtzXSkpO3AuZ2V0U3RhY2tlZFlSYW5nZShhLGksdCwiX19iYXJTdGFja0xlZnQiLCJsZWZ0IikscC5nZXRTdGFja2VkWVJhbmdlKGgsaSx0LCJfX2JhclN0YWNrUmlnaHQiLCJyaWdodCIpfX0sby5wcm90b3R5cGUuX3VwZGF0ZVlBeGlzPWZ1bmN0aW9uKHQsZSl7dmFyIGksbyxuPSExLHM9ITEscj0hMSxhPTFlOSxoPTFlOSxkPS0xZTksbD0tMWU5O2lmKHQubGVuZ3RoPjApe2Zvcih2YXIgYz0wO2M8dC5sZW5ndGg7YysrKXt2YXIgdT10aGlzLmdyb3Vwc1t0W2NdXTt1JiYicmlnaHQiIT11Lm9wdGlvbnMueUF4aXNPcmllbnRhdGlvbj8ocz0hMCxhPTFlOSxkPS0xZTkpOnUmJnUub3B0aW9ucy55QXhpc09yaWVudGF0aW9uJiYocj0hMCxoPTFlOSxsPS0xZTkpfWZvcih2YXIgYz0wO2M8dC5sZW5ndGg7YysrKWUuaGFzT3duUHJvcGVydHkodFtjXSkmJmVbdFtjXV0uaWdub3JlIT09ITAmJihpPWVbdFtjXV0ubWluLG89ZVt0W2NdXS5tYXgsInJpZ2h0IiE9ZVt0W2NdXS55QXhpc09yaWVudGF0aW9uPyhzPSEwLGE9YT5pP2k6YSxkPWQ8bz9vOmQpOihyPSEwLGg9aD5pP2k6aCxsPWw8bz9vOmwpKTsxPT1zJiZ0aGlzLnlBeGlzTGVmdC5zZXRSYW5nZShhLGQpLDE9PXImJnRoaXMueUF4aXNSaWdodC5zZXRSYW5nZShoLGwpfW49dGhpcy5fdG9nZ2xlQXhpc1Zpc2libGl0eShzLHRoaXMueUF4aXNMZWZ0KXx8bixuPXRoaXMuX3RvZ2dsZUF4aXNWaXNpYmxpdHkocix0aGlzLnlBeGlzUmlnaHQpfHxuLDE9PXImJjE9PXM/KHRoaXMueUF4aXNMZWZ0LmRyYXdJY29ucz0hMCx0aGlzLnlBeGlzUmlnaHQuZHJhd0ljb25zPSEwKToodGhpcy55QXhpc0xlZnQuZHJhd0ljb25zPSExLHRoaXMueUF4aXNSaWdodC5kcmF3SWNvbnM9ITEpLHRoaXMueUF4aXNSaWdodC5tYXN0ZXI9IXMsdGhpcy55QXhpc1JpZ2h0Lm1hc3RlckF4aXM9dGhpcy55QXhpc0xlZnQsMD09dGhpcy55QXhpc1JpZ2h0Lm1hc3Rlcj8oMT09cj90aGlzLnlBeGlzTGVmdC5saW5lT2Zmc2V0PXRoaXMueUF4aXNSaWdodC53aWR0aDp0aGlzLnlBeGlzTGVmdC5saW5lT2Zmc2V0PTAsbj10aGlzLnlBeGlzTGVmdC5yZWRyYXcoKXx8bixuPXRoaXMueUF4aXNSaWdodC5yZWRyYXcoKXx8bik6bj10aGlzLnlBeGlzUmlnaHQucmVkcmF3KCl8fG47Zm9yKHZhciBwPVsiX19iYXJTdGFja0xlZnQiLCJfX2JhclN0YWNrUmlnaHQiLCJfX2xpbmVTdGFja0xlZnQiLCJfX2xpbmVTdGFja1JpZ2h0Il0sYz0wO2M8cC5sZW5ndGg7YysrKXQuaW5kZXhPZihwW2NdKSE9LTEmJnQuc3BsaWNlKHQuaW5kZXhPZihwW2NdKSwxKTtyZXR1cm4gbn0sby5wcm90b3R5cGUuX3RvZ2dsZUF4aXNWaXNpYmxpdHk9ZnVuY3Rpb24odCxlKXt2YXIgaT0hMTtyZXR1cm4gMD09dD9lLmRvbS5mcmFtZS5wYXJlbnROb2RlJiYwPT1lLmhpZGRlbiYmKGUuaGlkZSgpLGk9ITApOmUuZG9tLmZyYW1lLnBhcmVudE5vZGV8fDEhPWUuaGlkZGVufHwoZS5zaG93KCksaT0hMCksaX0sby5wcm90b3R5cGUuX2NvbnZlcnRYY29vcmRpbmF0ZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuYm9keS51dGlsLnRvU2NyZWVuLGk9MDtpPHQubGVuZ3RoO2krKyl0W2ldLnNjcmVlbl94PWUodFtpXS54KSt0aGlzLnByb3BzLndpZHRoLHRbaV0uc2NyZWVuX3k9dFtpXS55fSxvLnByb3RvdHlwZS5fY29udmVydFljb29yZGluYXRlcz1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMueUF4aXNMZWZ0LG89TnVtYmVyKHRoaXMuc3ZnLnN0eWxlLmhlaWdodC5yZXBsYWNlKCJweCIsIiIpKTsicmlnaHQiPT1lLm9wdGlvbnMueUF4aXNPcmllbnRhdGlvbiYmKGk9dGhpcy55QXhpc1JpZ2h0KTtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl0W25dLnNjcmVlbl95PU1hdGgucm91bmQoaS5jb252ZXJ0VmFsdWUodFtuXS55KSk7ZS5zZXRaZXJvUG9zaXRpb24oTWF0aC5taW4obyxpLmNvbnZlcnRWYWx1ZSgwKSkpfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGksbyl7dGhpcy5pZD1uLnJhbmRvbVVVSUQoKSx0aGlzLmJvZHk9dCx0aGlzLmRlZmF1bHRPcHRpb25zPXtvcmllbnRhdGlvbjoibGVmdCIsc2hvd01pbm9yTGFiZWxzOiEwLHNob3dNYWpvckxhYmVsczohMCxpY29uczohMSxtYWpvckxpbmVzT2Zmc2V0OjcsbWlub3JMaW5lc09mZnNldDo0LGxhYmVsT2Zmc2V0WDoxMCxsYWJlbE9mZnNldFk6MixpY29uV2lkdGg6MjAsd2lkdGg6IjQwcHgiLHZpc2libGU6ITAsYWxpZ25aZXJvczohMCxsZWZ0OntyYW5nZTp7bWluOnZvaWQgMCxtYXg6dm9pZCAwfSxmb3JtYXQ6ZnVuY3Rpb24odCl7cmV0dXJuIiIrcGFyc2VGbG9hdCh0LnRvUHJlY2lzaW9uKDMpKX0sdGl0bGU6e3RleHQ6dm9pZCAwLHN0eWxlOnZvaWQgMH19LHJpZ2h0OntyYW5nZTp7bWluOnZvaWQgMCxtYXg6dm9pZCAwfSxmb3JtYXQ6ZnVuY3Rpb24odCl7cmV0dXJuIiIrcGFyc2VGbG9hdCh0LnRvUHJlY2lzaW9uKDMpKX0sdGl0bGU6e3RleHQ6dm9pZCAwLHN0eWxlOnZvaWQgMH19fSx0aGlzLmxpbmVncmFwaE9wdGlvbnM9byx0aGlzLmxpbmVncmFwaFNWRz1pLHRoaXMucHJvcHM9e30sdGhpcy5ET01lbGVtZW50cz17bGluZXM6e30sbGFiZWxzOnt9LHRpdGxlOnt9fSx0aGlzLmRvbT17fSx0aGlzLnNjYWxlPXZvaWQgMCx0aGlzLnJhbmdlPXtzdGFydDowLGVuZDowfSx0aGlzLm9wdGlvbnM9bi5leHRlbmQoe30sdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5jb252ZXJzaW9uRmFjdG9yPTEsdGhpcy5zZXRPcHRpb25zKGUpLHRoaXMud2lkdGg9TnVtYmVyKCgiIit0aGlzLm9wdGlvbnMud2lkdGgpLnJlcGxhY2UoInB4IiwiIikpLHRoaXMubWluV2lkdGg9dGhpcy53aWR0aCx0aGlzLmhlaWdodD10aGlzLmxpbmVncmFwaFNWRy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQsdGhpcy5oaWRkZW49ITEsdGhpcy5zdGVwUGl4ZWxzPTI1LHRoaXMuemVyb0Nyb3NzaW5nPS0xLHRoaXMuYW1vdW50T2ZTdGVwcz0tMSx0aGlzLmxpbmVPZmZzZXQ9MCx0aGlzLm1hc3Rlcj0hMCx0aGlzLm1hc3RlckF4aXM9bnVsbCx0aGlzLnN2Z0VsZW1lbnRzPXt9LHRoaXMuaWNvbnNSZW1vdmVkPSExLHRoaXMuZ3JvdXBzPXt9LHRoaXMuYW1vdW50T2ZHcm91cHM9MCx0aGlzLl9jcmVhdGUoKSx0aGlzLmZyYW1ld29yaz17c3ZnOnRoaXMuc3ZnLHN2Z0VsZW1lbnRzOnRoaXMuc3ZnRWxlbWVudHMsb3B0aW9uczp0aGlzLm9wdGlvbnMsZ3JvdXBzOnRoaXMuZ3JvdXBzfTt2YXIgcz10aGlzO3RoaXMuYm9keS5lbWl0dGVyLm9uKCJ2ZXJ0aWNhbERyYWciLGZ1bmN0aW9uKCl7cy5kb20ubGluZUNvbnRhaW5lci5zdHlsZS50b3A9cy5ib2R5LmRvbVByb3BzLnNjcm9sbFRvcCsicHgifSl9dmFyIG49aSgxKSxzPWkoOCkscj1pKDMzKSxhPWkoNTUpO28ucHJvdG90eXBlPW5ldyByLG8ucHJvdG90eXBlLmFkZEdyb3VwPWZ1bmN0aW9uKHQsZSl7dGhpcy5ncm91cHMuaGFzT3duUHJvcGVydHkodCl8fCh0aGlzLmdyb3Vwc1t0XT1lKSx0aGlzLmFtb3VudE9mR3JvdXBzKz0xfSxvLnByb3RvdHlwZS51cGRhdGVHcm91cD1mdW5jdGlvbih0LGUpe3RoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KHQpfHwodGhpcy5hbW91bnRPZkdyb3Vwcys9MSksdGhpcy5ncm91cHNbdF09ZX0sby5wcm90b3R5cGUucmVtb3ZlR3JvdXA9ZnVuY3Rpb24odCl7dGhpcy5ncm91cHMuaGFzT3duUHJvcGVydHkodCkmJihkZWxldGUgdGhpcy5ncm91cHNbdF0sdGhpcy5hbW91bnRPZkdyb3Vwcy09MSl9LG8ucHJvdG90eXBlLnNldE9wdGlvbnM9ZnVuY3Rpb24odCl7aWYodCl7dmFyIGU9ITE7dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uIT10Lm9yaWVudGF0aW9uJiZ2b2lkIDAhPT10Lm9yaWVudGF0aW9uJiYoZT0hMCk7dmFyIGk9WyJvcmllbnRhdGlvbiIsInNob3dNaW5vckxhYmVscyIsInNob3dNYWpvckxhYmVscyIsImljb25zIiwibWFqb3JMaW5lc09mZnNldCIsIm1pbm9yTGluZXNPZmZzZXQiLCJsYWJlbE9mZnNldFgiLCJsYWJlbE9mZnNldFkiLCJpY29uV2lkdGgiLCJ3aWR0aCIsInZpc2libGUiLCJsZWZ0IiwicmlnaHQiLCJhbGlnblplcm9zIl07bi5zZWxlY3RpdmVEZWVwRXh0ZW5kKGksdGhpcy5vcHRpb25zLHQpLHRoaXMubWluV2lkdGg9TnVtYmVyKCgiIit0aGlzLm9wdGlvbnMud2lkdGgpLnJlcGxhY2UoInB4IiwiIikpLGU9PT0hMCYmdGhpcy5kb20uZnJhbWUmJih0aGlzLmhpZGUoKSx0aGlzLnNob3coKSl9fSxvLnByb3RvdHlwZS5fY3JlYXRlPWZ1bmN0aW9uKCl7dGhpcy5kb20uZnJhbWU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5kb20uZnJhbWUuc3R5bGUud2lkdGg9dGhpcy5vcHRpb25zLndpZHRoLHRoaXMuZG9tLmZyYW1lLnN0eWxlLmhlaWdodD10aGlzLmhlaWdodCx0aGlzLmRvbS5saW5lQ29udGFpbmVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZG9tLmxpbmVDb250YWluZXIuc3R5bGUud2lkdGg9IjEwMCUiLHRoaXMuZG9tLmxpbmVDb250YWluZXIuc3R5bGUuaGVpZ2h0PXRoaXMuaGVpZ2h0LHRoaXMuZG9tLmxpbmVDb250YWluZXIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIix0aGlzLnN2Zz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwic3ZnIiksdGhpcy5zdmcuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnN2Zy5zdHlsZS50b3A9IjBweCIsdGhpcy5zdmcuc3R5bGUuaGVpZ2h0PSIxMDAlIix0aGlzLnN2Zy5zdHlsZS53aWR0aD0iMTAwJSIsdGhpcy5zdmcuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuZG9tLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuc3ZnKX0sby5wcm90b3R5cGUuX3JlZHJhd0dyb3VwSWNvbnM9ZnVuY3Rpb24oKXtzLnByZXBhcmVFbGVtZW50cyh0aGlzLnN2Z0VsZW1lbnRzKTt2YXIgdCxlPXRoaXMub3B0aW9ucy5pY29uV2lkdGgsaT0xNSxvPTQsbj1vKy41Kmk7dD0ibGVmdCI9PT10aGlzLm9wdGlvbnMub3JpZW50YXRpb24/bzp0aGlzLndpZHRoLWUtbzt2YXIgcj1PYmplY3Qua2V5cyh0aGlzLmdyb3Vwcyk7ci5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8ZT8tMToxfSk7Zm9yKHZhciBhPTA7YTxyLmxlbmd0aDthKyspe3ZhciBoPXJbYV07dGhpcy5ncm91cHNbaF0udmlzaWJsZSE9PSEwfHx2b2lkIDAhPT10aGlzLmxpbmVncmFwaE9wdGlvbnMudmlzaWJpbGl0eVtoXSYmdGhpcy5saW5lZ3JhcGhPcHRpb25zLnZpc2liaWxpdHlbaF0hPT0hMHx8KHRoaXMuZ3JvdXBzW2hdLmdldExlZ2VuZChlLGksdGhpcy5mcmFtZXdvcmssdCxuKSxuKz1pK28pfXMuY2xlYW51cEVsZW1lbnRzKHRoaXMuc3ZnRWxlbWVudHMpLHRoaXMuaWNvbnNSZW1vdmVkPSExfSxvLnByb3RvdHlwZS5fY2xlYW51cEljb25zPWZ1bmN0aW9uKCl7dGhpcy5pY29uc1JlbW92ZWQ9PT0hMSYmKHMucHJlcGFyZUVsZW1lbnRzKHRoaXMuc3ZnRWxlbWVudHMpLHMuY2xlYW51cEVsZW1lbnRzKHRoaXMuc3ZnRWxlbWVudHMpLHRoaXMuaWNvbnNSZW1vdmVkPSEwKX0sby5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe3RoaXMuaGlkZGVuPSExLHRoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGV8fCgibGVmdCI9PT10aGlzLm9wdGlvbnMub3JpZW50YXRpb24/dGhpcy5ib2R5LmRvbS5sZWZ0LmFwcGVuZENoaWxkKHRoaXMuZG9tLmZyYW1lKTp0aGlzLmJvZHkuZG9tLnJpZ2h0LmFwcGVuZENoaWxkKHRoaXMuZG9tLmZyYW1lKSksdGhpcy5kb20ubGluZUNvbnRhaW5lci5wYXJlbnROb2RlfHx0aGlzLmJvZHkuZG9tLmJhY2tncm91bmRIb3Jpem9udGFsLmFwcGVuZENoaWxkKHRoaXMuZG9tLmxpbmVDb250YWluZXIpfSxvLnByb3RvdHlwZS5oaWRlPWZ1bmN0aW9uKCl7dGhpcy5oaWRkZW49ITAsdGhpcy5kb20uZnJhbWUucGFyZW50Tm9kZSYmdGhpcy5kb20uZnJhbWUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRvbS5mcmFtZSksdGhpcy5kb20ubGluZUNvbnRhaW5lci5wYXJlbnROb2RlJiZ0aGlzLmRvbS5saW5lQ29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20ubGluZUNvbnRhaW5lcil9LG8ucHJvdG90eXBlLnNldFJhbmdlPWZ1bmN0aW9uKHQsZSl7dGhpcy5yYW5nZS5zdGFydD10LHRoaXMucmFuZ2UuZW5kPWV9LG8ucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe3ZhciB0PSExLGU9MDt0aGlzLmRvbS5saW5lQ29udGFpbmVyLnN0eWxlLnRvcD10aGlzLmJvZHkuZG9tUHJvcHMuc2Nyb2xsVG9wKyJweCI7Zm9yKHZhciBpIGluIHRoaXMuZ3JvdXBzKXRoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KGkpJiYodGhpcy5ncm91cHNbaV0udmlzaWJsZSE9PSEwfHx2b2lkIDAhPT10aGlzLmxpbmVncmFwaE9wdGlvbnMudmlzaWJpbGl0eVtpXSYmdGhpcy5saW5lZ3JhcGhPcHRpb25zLnZpc2liaWxpdHlbaV0hPT0hMHx8ZSsrKTtpZigwPT09dGhpcy5hbW91bnRPZkdyb3Vwc3x8MD09PWUpdGhpcy5oaWRlKCk7ZWxzZXt0aGlzLnNob3coKSx0aGlzLmhlaWdodD1OdW1iZXIodGhpcy5saW5lZ3JhcGhTVkcuc3R5bGUuaGVpZ2h0LnJlcGxhY2UoInB4IiwiIikpLHRoaXMuZG9tLmxpbmVDb250YWluZXIuc3R5bGUuaGVpZ2h0PXRoaXMuaGVpZ2h0KyJweCIsdGhpcy53aWR0aD10aGlzLm9wdGlvbnMudmlzaWJsZT09PSEwP051bWJlcigoIiIrdGhpcy5vcHRpb25zLndpZHRoKS5yZXBsYWNlKCJweCIsIiIpKTowO3ZhciBvPXRoaXMucHJvcHMsbj10aGlzLmRvbS5mcmFtZTtuLmNsYXNzTmFtZT0idmlzLWRhdGEtYXhpcyIsdGhpcy5fY2FsY3VsYXRlQ2hhclNpemUoKTt2YXIgcz10aGlzLm9wdGlvbnMub3JpZW50YXRpb24scj10aGlzLm9wdGlvbnMuc2hvd01pbm9yTGFiZWxzLGE9dGhpcy5vcHRpb25zLnNob3dNYWpvckxhYmVscztvLm1pbm9yTGFiZWxIZWlnaHQ9cj9vLm1pbm9yQ2hhckhlaWdodDowLG8ubWFqb3JMYWJlbEhlaWdodD1hP28ubWFqb3JDaGFySGVpZ2h0OjAsby5taW5vckxpbmVXaWR0aD10aGlzLmJvZHkuZG9tLmJhY2tncm91bmRIb3Jpem9udGFsLm9mZnNldFdpZHRoLXRoaXMubGluZU9mZnNldC10aGlzLndpZHRoKzIqdGhpcy5vcHRpb25zLm1pbm9yTGluZXNPZmZzZXQsby5taW5vckxpbmVIZWlnaHQ9MSxvLm1ham9yTGluZVdpZHRoPXRoaXMuYm9keS5kb20uYmFja2dyb3VuZEhvcml6b250YWwub2Zmc2V0V2lkdGgtdGhpcy5saW5lT2Zmc2V0LXRoaXMud2lkdGgrMip0aGlzLm9wdGlvbnMubWFqb3JMaW5lc09mZnNldCxvLm1ham9yTGluZUhlaWdodD0xLCJsZWZ0Ij09PXM/KG4uc3R5bGUudG9wPSIwIixuLnN0eWxlLmxlZnQ9IjAiLG4uc3R5bGUuYm90dG9tPSIiLG4uc3R5bGUud2lkdGg9dGhpcy53aWR0aCsicHgiLG4uc3R5bGUuaGVpZ2h0PXRoaXMuaGVpZ2h0KyJweCIsdGhpcy5wcm9wcy53aWR0aD10aGlzLmJvZHkuZG9tUHJvcHMubGVmdC53aWR0aCx0aGlzLnByb3BzLmhlaWdodD10aGlzLmJvZHkuZG9tUHJvcHMubGVmdC5oZWlnaHQpOihuLnN0eWxlLnRvcD0iIixuLnN0eWxlLmJvdHRvbT0iMCIsbi5zdHlsZS5sZWZ0PSIwIixuLnN0eWxlLndpZHRoPXRoaXMud2lkdGgrInB4IixuLnN0eWxlLmhlaWdodD10aGlzLmhlaWdodCsicHgiLHRoaXMucHJvcHMud2lkdGg9dGhpcy5ib2R5LmRvbVByb3BzLnJpZ2h0LndpZHRoLHRoaXMucHJvcHMuaGVpZ2h0PXRoaXMuYm9keS5kb21Qcm9wcy5yaWdodC5oZWlnaHQpLHQ9dGhpcy5fcmVkcmF3TGFiZWxzKCksdD10aGlzLl9pc1Jlc2l6ZWQoKXx8dCx0aGlzLm9wdGlvbnMuaWNvbnM9PT0hMD90aGlzLl9yZWRyYXdHcm91cEljb25zKCk6dGhpcy5fY2xlYW51cEljb25zKCksdGhpcy5fcmVkcmF3VGl0bGUocyl9cmV0dXJuIHR9LG8ucHJvdG90eXBlLl9yZWRyYXdMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9ITE7cy5wcmVwYXJlRWxlbWVudHModGhpcy5ET01lbGVtZW50cy5saW5lcykscy5wcmVwYXJlRWxlbWVudHModGhpcy5ET01lbGVtZW50cy5sYWJlbHMpO3ZhciBpPXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbixvPXZvaWQgMCE9dGhpcy5vcHRpb25zW2ldLnJhbmdlP3RoaXMub3B0aW9uc1tpXS5yYW5nZTp7fSxuPSEwO3ZvaWQgMCE9by5tYXgmJih0aGlzLnJhbmdlLmVuZD1vLm1heCxuPSExKTt2YXIgcj0hMDt2b2lkIDAhPW8ubWluJiYodGhpcy5yYW5nZS5zdGFydD1vLm1pbixyPSExKSx0aGlzLnNjYWxlPW5ldyBhKHRoaXMucmFuZ2Uuc3RhcnQsdGhpcy5yYW5nZS5lbmQscixuLHRoaXMuZG9tLmZyYW1lLm9mZnNldEhlaWdodCx0aGlzLnByb3BzLm1ham9yQ2hhckhlaWdodCx0aGlzLm9wdGlvbnMuYWxpZ25aZXJvcyx0aGlzLm9wdGlvbnNbaV0uZm9ybWF0KSx0aGlzLm1hc3Rlcj09PSExJiZ2b2lkIDAhPXRoaXMubWFzdGVyQXhpcyYmdGhpcy5zY2FsZS5mb2xsb3dTY2FsZSh0aGlzLm1hc3RlckF4aXMuc2NhbGUpLHRoaXMubWF4TGFiZWxTaXplPTA7dmFyIGg9dGhpcy5zY2FsZS5nZXRMaW5lcygpO2guZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgbz1lLnksbj1lLm1ham9yO3Qub3B0aW9ucy5zaG93TWlub3JMYWJlbHMmJm49PT0hMSYmdC5fcmVkcmF3TGFiZWwoby0yLGUudmFsLGksInZpcy15LWF4aXMgdmlzLW1pbm9yIix0LnByb3BzLm1pbm9yQ2hhckhlaWdodCksbiYmbz49MCYmdC5fcmVkcmF3TGFiZWwoby0yLGUudmFsLGksInZpcy15LWF4aXMgdmlzLW1ham9yIix0LnByb3BzLm1ham9yQ2hhckhlaWdodCksdC5tYXN0ZXI9PT0hMCYmKG4/dC5fcmVkcmF3TGluZShvLGksInZpcy1ncmlkIHZpcy1ob3Jpem9udGFsIHZpcy1tYWpvciIsdC5vcHRpb25zLm1ham9yTGluZXNPZmZzZXQsdC5wcm9wcy5tYWpvckxpbmVXaWR0aCk6dC5fcmVkcmF3TGluZShvLGksInZpcy1ncmlkIHZpcy1ob3Jpem9udGFsIHZpcy1taW5vciIsdC5vcHRpb25zLm1pbm9yTGluZXNPZmZzZXQsdC5wcm9wcy5taW5vckxpbmVXaWR0aCkpfSk7dmFyIGQ9MDt2b2lkIDAhPT10aGlzLm9wdGlvbnNbaV0udGl0bGUmJnZvaWQgMCE9PXRoaXMub3B0aW9uc1tpXS50aXRsZS50ZXh0JiYoZD10aGlzLnByb3BzLnRpdGxlQ2hhckhlaWdodCk7dmFyIGw9dGhpcy5vcHRpb25zLmljb25zPT09ITA/TWF0aC5tYXgodGhpcy5vcHRpb25zLmljb25XaWR0aCxkKSt0aGlzLm9wdGlvbnMubGFiZWxPZmZzZXRYKzE1OmQrdGhpcy5vcHRpb25zLmxhYmVsT2Zmc2V0WCsxNTtyZXR1cm4gdGhpcy5tYXhMYWJlbFNpemU+dGhpcy53aWR0aC1sJiZ0aGlzLm9wdGlvbnMudmlzaWJsZT09PSEwPyh0aGlzLndpZHRoPXRoaXMubWF4TGFiZWxTaXplK2wsdGhpcy5vcHRpb25zLndpZHRoPXRoaXMud2lkdGgrInB4IixzLmNsZWFudXBFbGVtZW50cyh0aGlzLkRPTWVsZW1lbnRzLmxpbmVzKSxzLmNsZWFudXBFbGVtZW50cyh0aGlzLkRPTWVsZW1lbnRzLmxhYmVscyksdGhpcy5yZWRyYXcoKSxlPSEwKTp0aGlzLm1heExhYmVsU2l6ZTx0aGlzLndpZHRoLWwmJnRoaXMub3B0aW9ucy52aXNpYmxlPT09ITAmJnRoaXMud2lkdGg+dGhpcy5taW5XaWR0aD8odGhpcy53aWR0aD1NYXRoLm1heCh0aGlzLm1pbldpZHRoLHRoaXMubWF4TGFiZWxTaXplK2wpLHRoaXMub3B0aW9ucy53aWR0aD10aGlzLndpZHRoKyJweCIscy5jbGVhbnVwRWxlbWVudHModGhpcy5ET01lbGVtZW50cy5saW5lcykscy5jbGVhbnVwRWxlbWVudHModGhpcy5ET01lbGVtZW50cy5sYWJlbHMpLHRoaXMucmVkcmF3KCksZT0hMCk6KHMuY2xlYW51cEVsZW1lbnRzKHRoaXMuRE9NZWxlbWVudHMubGluZXMpLHMuY2xlYW51cEVsZW1lbnRzKHRoaXMuRE9NZWxlbWVudHMubGFiZWxzKSxlPSExKSxlfSxvLnByb3RvdHlwZS5jb252ZXJ0VmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc2NhbGUuY29udmVydFZhbHVlKHQpfSxvLnByb3RvdHlwZS5zY3JlZW5Ub1ZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNjYWxlLnNjcmVlblRvVmFsdWUodCl9LG8ucHJvdG90eXBlLl9yZWRyYXdMYWJlbD1mdW5jdGlvbih0LGUsaSxvLG4pe3ZhciByPXMuZ2V0RE9NRWxlbWVudCgiZGl2Iix0aGlzLkRPTWVsZW1lbnRzLmxhYmVscyx0aGlzLmRvbS5mcmFtZSk7ci5jbGFzc05hbWU9byxyLmlubmVySFRNTD1lLCJsZWZ0Ij09PWk/KHIuc3R5bGUubGVmdD0iLSIrdGhpcy5vcHRpb25zLmxhYmVsT2Zmc2V0WCsicHgiLHIuc3R5bGUudGV4dEFsaWduPSJyaWdodCIpOihyLnN0eWxlLnJpZ2h0PSItIit0aGlzLm9wdGlvbnMubGFiZWxPZmZzZXRYKyJweCIsci5zdHlsZS50ZXh0QWxpZ249ImxlZnQiKSxyLnN0eWxlLnRvcD10LS41Km4rdGhpcy5vcHRpb25zLmxhYmVsT2Zmc2V0WSsicHgiLGUrPSIiO3ZhciBhPU1hdGgubWF4KHRoaXMucHJvcHMubWFqb3JDaGFyV2lkdGgsdGhpcy5wcm9wcy5taW5vckNoYXJXaWR0aCk7dGhpcy5tYXhMYWJlbFNpemU8ZS5sZW5ndGgqYSYmKHRoaXMubWF4TGFiZWxTaXplPWUubGVuZ3RoKmEpfSxvLnByb3RvdHlwZS5fcmVkcmF3TGluZT1mdW5jdGlvbih0LGUsaSxvLG4pe2lmKHRoaXMubWFzdGVyPT09ITApe3ZhciByPXMuZ2V0RE9NRWxlbWVudCgiZGl2Iix0aGlzLkRPTWVsZW1lbnRzLmxpbmVzLHRoaXMuZG9tLmxpbmVDb250YWluZXIpO3IuY2xhc3NOYW1lPWksci5pbm5lckhUTUw9IiIsImxlZnQiPT09ZT9yLnN0eWxlLmxlZnQ9dGhpcy53aWR0aC1vKyJweCI6ci5zdHlsZS5yaWdodD10aGlzLndpZHRoLW8rInB4IixyLnN0eWxlLndpZHRoPW4rInB4IixyLnN0eWxlLnRvcD10KyJweCJ9fSxvLnByb3RvdHlwZS5fcmVkcmF3VGl0bGU9ZnVuY3Rpb24odCl7aWYocy5wcmVwYXJlRWxlbWVudHModGhpcy5ET01lbGVtZW50cy50aXRsZSksdm9pZCAwIT09dGhpcy5vcHRpb25zW3RdLnRpdGxlJiZ2b2lkIDAhPT10aGlzLm9wdGlvbnNbdF0udGl0bGUudGV4dCl7dmFyIGU9cy5nZXRET01FbGVtZW50KCJkaXYiLHRoaXMuRE9NZWxlbWVudHMudGl0bGUsdGhpcy5kb20uZnJhbWUpO2UuY2xhc3NOYW1lPSJ2aXMteS1heGlzIHZpcy10aXRsZSB2aXMtIit0LGUuaW5uZXJIVE1MPXRoaXMub3B0aW9uc1t0XS50aXRsZS50ZXh0LHZvaWQgMCE9PXRoaXMub3B0aW9uc1t0XS50aXRsZS5zdHlsZSYmbi5hZGRDc3NUZXh0KGUsdGhpcy5vcHRpb25zW3RdLnRpdGxlLnN0eWxlKSwibGVmdCI9PT10P2Uuc3R5bGUubGVmdD10aGlzLnByb3BzLnRpdGxlQ2hhckhlaWdodCsicHgiOmUuc3R5bGUucmlnaHQ9dGhpcy5wcm9wcy50aXRsZUNoYXJIZWlnaHQrInB4IixlLnN0eWxlLndpZHRoPXRoaXMuaGVpZ2h0KyJweCJ9cy5jbGVhbnVwRWxlbWVudHModGhpcy5ET01lbGVtZW50cy50aXRsZSl9LG8ucHJvdG90eXBlLl9jYWxjdWxhdGVDaGFyU2l6ZT1mdW5jdGlvbigpe2lmKCEoIm1pbm9yQ2hhckhlaWdodCJpbiB0aGlzLnByb3BzKSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIjAiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2UuY2xhc3NOYW1lPSJ2aXMteS1heGlzIHZpcy1taW5vciB2aXMtbWVhc3VyZSIsZS5hcHBlbmRDaGlsZCh0KSx0aGlzLmRvbS5mcmFtZS5hcHBlbmRDaGlsZChlKSx0aGlzLnByb3BzLm1pbm9yQ2hhckhlaWdodD1lLmNsaWVudEhlaWdodCx0aGlzLnByb3BzLm1pbm9yQ2hhcldpZHRoPWUuY2xpZW50V2lkdGgsdGhpcy5kb20uZnJhbWUucmVtb3ZlQ2hpbGQoZSl9aWYoISgibWFqb3JDaGFySGVpZ2h0ImluIHRoaXMucHJvcHMpKXt2YXIgaT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiMCIpLG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7by5jbGFzc05hbWU9InZpcy15LWF4aXMgdmlzLW1ham9yIHZpcy1tZWFzdXJlIixvLmFwcGVuZENoaWxkKGkpLHRoaXMuZG9tLmZyYW1lLmFwcGVuZENoaWxkKG8pLHRoaXMucHJvcHMubWFqb3JDaGFySGVpZ2h0PW8uY2xpZW50SGVpZ2h0LHRoaXMucHJvcHMubWFqb3JDaGFyV2lkdGg9by5jbGllbnRXaWR0aCx0aGlzLmRvbS5mcmFtZS5yZW1vdmVDaGlsZChvKX1pZighKCJ0aXRsZUNoYXJIZWlnaHQiaW4gdGhpcy5wcm9wcykpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIwIikscz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtzLmNsYXNzTmFtZT0idmlzLXktYXhpcyB2aXMtdGl0bGUgdmlzLW1lYXN1cmUiLHMuYXBwZW5kQ2hpbGQobiksdGhpcy5kb20uZnJhbWUuYXBwZW5kQ2hpbGQocyksdGhpcy5wcm9wcy50aXRsZUNoYXJIZWlnaHQ9cy5jbGllbnRIZWlnaHQsdGhpcy5wcm9wcy50aXRsZUNoYXJXaWR0aD1zLmNsaWVudFdpZHRoLHRoaXMuZG9tLmZyYW1lLnJlbW92ZUNoaWxkKHMpfX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gaSh0LGUsaSxvLG4scyl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD42JiZ2b2lkIDAhPT1hcmd1bWVudHNbNl0mJmFyZ3VtZW50c1s2XSxhPWFyZ3VtZW50cy5sZW5ndGg+NyYmdm9pZCAwIT09YXJndW1lbnRzWzddJiZhcmd1bWVudHNbN107aWYodGhpcy5tYWpvclN0ZXBzPVsxLDIsNSwxMF0sdGhpcy5taW5vclN0ZXBzPVsuMjUsLjUsMSwyXSx0aGlzLmN1c3RvbUxpbmVzPW51bGwsdGhpcy5jb250YWluZXJIZWlnaHQ9bix0aGlzLm1ham9yQ2hhckhlaWdodD1zLHRoaXMuX3N0YXJ0PXQsdGhpcy5fZW5kPWUsdGhpcy5zY2FsZT0xLHRoaXMubWlub3JTdGVwSWR4PS0xLHRoaXMubWFnbml0dWRlZmFjdG9yPTEsdGhpcy5kZXRlcm1pbmVTY2FsZSgpLHRoaXMuemVyb0FsaWduPXIsdGhpcy5hdXRvU2NhbGVTdGFydD1pLHRoaXMuYXV0b1NjYWxlRW5kPW8sdGhpcy5mb3JtYXR0aW5nRnVuY3Rpb249YSxpfHxvKXt2YXIgaD10aGlzLGQ9ZnVuY3Rpb24odCl7dmFyIGU9dC10JShoLm1hZ25pdHVkZWZhY3RvcipoLm1pbm9yU3RlcHNbaC5taW5vclN0ZXBJZHhdKTtyZXR1cm4gdCUoaC5tYWduaXR1ZGVmYWN0b3IqaC5taW5vclN0ZXBzW2gubWlub3JTdGVwSWR4XSk+LjUqKGgubWFnbml0dWRlZmFjdG9yKmgubWlub3JTdGVwc1toLm1pbm9yU3RlcElkeF0pP2UraC5tYWduaXR1ZGVmYWN0b3IqaC5taW5vclN0ZXBzW2gubWlub3JTdGVwSWR4XTplfTtpJiYodGhpcy5fc3RhcnQtPTIqdGhpcy5tYWduaXR1ZGVmYWN0b3IqdGhpcy5taW5vclN0ZXBzW3RoaXMubWlub3JTdGVwSWR4XSx0aGlzLl9zdGFydD1kKHRoaXMuX3N0YXJ0KSksbyYmKHRoaXMuX2VuZCs9dGhpcy5tYWduaXR1ZGVmYWN0b3IqdGhpcy5taW5vclN0ZXBzW3RoaXMubWlub3JTdGVwSWR4XSx0aGlzLl9lbmQ9ZCh0aGlzLl9lbmQpKSx0aGlzLmRldGVybWluZVNjYWxlKCl9fWkucHJvdG90eXBlLnNldENoYXJIZWlnaHQ9ZnVuY3Rpb24odCl7dGhpcy5tYWpvckNoYXJIZWlnaHQ9dH0saS5wcm90b3R5cGUuc2V0SGVpZ2h0PWZ1bmN0aW9uKHQpe3RoaXMuY29udGFpbmVySGVpZ2h0PXR9LGkucHJvdG90eXBlLmRldGVybWluZVNjYWxlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZW5kLXRoaXMuX3N0YXJ0O3RoaXMuc2NhbGU9dGhpcy5jb250YWluZXJIZWlnaHQvdDt2YXIgZT10aGlzLm1ham9yQ2hhckhlaWdodC90aGlzLnNjYWxlLGk9dD4wP01hdGgucm91bmQoTWF0aC5sb2codCkvTWF0aC5MTjEwKTowO3RoaXMubWlub3JTdGVwSWR4PS0xLHRoaXMubWFnbml0dWRlZmFjdG9yPU1hdGgucG93KDEwLGkpO3ZhciBvPTA7aTwwJiYobz1pKTtmb3IodmFyIG49ITEscz1vO01hdGguYWJzKHMpPD1NYXRoLmFicyhpKTtzKyspe3RoaXMubWFnbml0dWRlZmFjdG9yPU1hdGgucG93KDEwLHMpO2Zvcih2YXIgcj0wO3I8dGhpcy5taW5vclN0ZXBzLmxlbmd0aDtyKyspe3ZhciBhPXRoaXMubWFnbml0dWRlZmFjdG9yKnRoaXMubWlub3JTdGVwc1tyXTtpZihhPj1lKXtuPSEwLHRoaXMubWlub3JTdGVwSWR4PXI7YnJlYWt9fWlmKG49PT0hMClicmVha319LGkucHJvdG90eXBlLmlzX21ham9yPWZ1bmN0aW9uKHQpe3JldHVybiB0JSh0aGlzLm1hZ25pdHVkZWZhY3Rvcip0aGlzLm1ham9yU3RlcHNbdGhpcy5taW5vclN0ZXBJZHhdKT09PTB9LGkucHJvdG90eXBlLmdldFN0ZXA9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYWduaXR1ZGVmYWN0b3IqdGhpcy5taW5vclN0ZXBzW3RoaXMubWlub3JTdGVwSWR4XX0saS5wcm90b3R5cGUuZ2V0Rmlyc3RNYWpvcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubWFnbml0dWRlZmFjdG9yKnRoaXMubWFqb3JTdGVwc1t0aGlzLm1pbm9yU3RlcElkeF07cmV0dXJuIHRoaXMuY29udmVydFZhbHVlKHRoaXMuX3N0YXJ0Kyh0LXRoaXMuX3N0YXJ0JXQpJXQpfSxpLnByb3RvdHlwZS5mb3JtYXRWYWx1ZT1mdW5jdGlvbih0KXt2YXIgZT10LnRvUHJlY2lzaW9uKDUpO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZvcm1hdHRpbmdGdW5jdGlvbiYmKGU9dGhpcy5mb3JtYXR0aW5nRnVuY3Rpb24odCkpLCJudW1iZXIiPT10eXBlb2YgZT8iIitlOiJzdHJpbmciPT10eXBlb2YgZT9lOnQudG9QcmVjaXNpb24oNSl9LGkucHJvdG90eXBlLmdldExpbmVzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9dGhpcy5nZXRTdGVwKCksaT0oZS10aGlzLl9zdGFydCVlKSVlLG89dGhpcy5fc3RhcnQraTt0aGlzLl9lbmQtbz4xZS01O28rPWUpbyE9dGhpcy5fc3RhcnQmJnQucHVzaCh7bWFqb3I6dGhpcy5pc19tYWpvcihvKSx5OnRoaXMuY29udmVydFZhbHVlKG8pLHZhbDp0aGlzLmZvcm1hdFZhbHVlKG8pfSk7cmV0dXJuIHR9LGkucHJvdG90eXBlLmZvbGxvd1NjYWxlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubWlub3JTdGVwSWR4LGk9dGhpcy5fc3RhcnQsbz10aGlzLl9lbmQsbj10aGlzLHM9ZnVuY3Rpb24oKXtuLm1hZ25pdHVkZWZhY3Rvcio9Mn0scj1mdW5jdGlvbigpe24ubWFnbml0dWRlZmFjdG9yLz0yfTt0Lm1pbm9yU3RlcElkeDw9MSYmdGhpcy5taW5vclN0ZXBJZHg8PTF8fHQubWlub3JTdGVwSWR4PjEmJnRoaXMubWlub3JTdGVwSWR4PjF8fCh0Lm1pbm9yU3RlcElkeDx0aGlzLm1pbm9yU3RlcElkeD8odGhpcy5taW5vclN0ZXBJZHg9MSwyPT1lP3MoKToocygpLHMoKSkpOih0aGlzLm1pbm9yU3RlcElkeD0yLDE9PWU/cigpOihyKCkscigpKSkpO2Zvcih2YXIgYT0odC5nZXRMaW5lcygpLHQuY29udmVydFZhbHVlKDApKSxoPXQuZ2V0U3RlcCgpKnQuc2NhbGUsZD0hMSxsPTA7IWQmJmwrKzw1Oyl7dGhpcy5zY2FsZT1oLyh0aGlzLm1pbm9yU3RlcHNbdGhpcy5taW5vclN0ZXBJZHhdKnRoaXMubWFnbml0dWRlZmFjdG9yKTt2YXIgYz10aGlzLmNvbnRhaW5lckhlaWdodC90aGlzLnNjYWxlO3RoaXMuX3N0YXJ0PWksdGhpcy5fZW5kPXRoaXMuX3N0YXJ0K2M7dmFyIHU9dGhpcy5fZW5kKnRoaXMuc2NhbGUscD10aGlzLm1hZ25pdHVkZWZhY3Rvcip0aGlzLm1ham9yU3RlcHNbdGhpcy5taW5vclN0ZXBJZHhdLGY9dGhpcy5nZXRGaXJzdE1ham9yKCktdC5nZXRGaXJzdE1ham9yKCk7aWYodGhpcy56ZXJvQWxpZ24pe3ZhciBtPWEtdTt0aGlzLl9lbmQrPW0vdGhpcy5zY2FsZSx0aGlzLl9zdGFydD10aGlzLl9lbmQtY31lbHNlIHRoaXMuYXV0b1NjYWxlU3RhcnQ/KHRoaXMuX3N0YXJ0LT1mL3RoaXMuc2NhbGUsdGhpcy5fZW5kPXRoaXMuX3N0YXJ0K2MpOih0aGlzLl9zdGFydCs9cC1mL3RoaXMuc2NhbGUsdGhpcy5fZW5kPXRoaXMuX3N0YXJ0K2MpO2lmKCF0aGlzLmF1dG9TY2FsZUVuZCYmdGhpcy5fZW5kPm8rMWUtNSlyKCksZD0hMTtlbHNle2lmKCF0aGlzLmF1dG9TY2FsZVN0YXJ0JiZ0aGlzLl9zdGFydDxpLTFlLTUpe2lmKCEodGhpcy56ZXJvQWxpZ24mJmk+PTApKXtyKCksZD0hMTtjb250aW51ZX1jb25zb2xlLndhcm4oIkNhbid0IGFkaGVyZSB0byBnaXZlbiAnbWluJyByYW5nZSwgZHVlIHRvIHplcm9hbGlnbiIpfXRoaXMuYXV0b1NjYWxlU3RhcnQmJnRoaXMuYXV0b1NjYWxlRW5kJiZjPG8taT8ocygpLGQ9ITEpOmQ9ITB9fX0saS5wcm90b3R5cGUuY29udmVydFZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNvbnRhaW5lckhlaWdodC0odC10aGlzLl9zdGFydCkqdGhpcy5zY2FsZX0saS5wcm90b3R5cGUuc2NyZWVuVG9WYWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4odGhpcy5jb250YWluZXJIZWlnaHQtdCkvdGhpcy5zY2FsZSt0aGlzLl9zdGFydH0sdC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSxpLG8pe3RoaXMuaWQ9ZTt2YXIgbj1bInNhbXBsaW5nIiwic3R5bGUiLCJzb3J0IiwieUF4aXNPcmllbnRhdGlvbiIsImJhckNoYXJ0IiwiZHJhd1BvaW50cyIsInNoYWRlZCIsImludGVycG9sYXRpb24iLCJ6SW5kZXgiLCJleGNsdWRlRnJvbVN0YWNraW5nIiwiZXhjbHVkZUZyb21MZWdlbmQiXTt0aGlzLm9wdGlvbnM9cy5zZWxlY3RpdmVCcmlkZ2VPYmplY3QobixpKSx0aGlzLnVzaW5nRGVmYXVsdFN0eWxlPXZvaWQgMD09PXQuY2xhc3NOYW1lLHRoaXMuZ3JvdXBzVXNpbmdEZWZhdWx0U3R5bGVzPW8sdGhpcy56ZXJvUG9zaXRpb249MCx0aGlzLnVwZGF0ZSh0KSwxPT10aGlzLnVzaW5nRGVmYXVsdFN0eWxlJiYodGhpcy5ncm91cHNVc2luZ0RlZmF1bHRTdHlsZXNbMF0rPTEpLHRoaXMuaXRlbXNEYXRhPVtdLHRoaXMudmlzaWJsZT12b2lkIDA9PT10LnZpc2libGV8fHQudmlzaWJsZX12YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH0scz1pKDEpLHI9KGkoOCksaSg1NykpLGE9aSg1OSksaD1pKDU4KTtvLnByb3RvdHlwZS5zZXRJdGVtcz1mdW5jdGlvbih0KXtudWxsIT10Pyh0aGlzLml0ZW1zRGF0YT10LDE9PXRoaXMub3B0aW9ucy5zb3J0JiZzLmluc2VydFNvcnQodGhpcy5pdGVtc0RhdGEsZnVuY3Rpb24odCxlKXtyZXR1cm4gdC54PmUueD8xOi0xfSkpOnRoaXMuaXRlbXNEYXRhPVtdfSxvLnByb3RvdHlwZS5nZXRJdGVtcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZW1zRGF0YX0sby5wcm90b3R5cGUuc2V0WmVyb1Bvc2l0aW9uPWZ1bmN0aW9uKHQpe3RoaXMuemVyb1Bvc2l0aW9uPXR9LG8ucHJvdG90eXBlLnNldE9wdGlvbnM9ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09dCl7dmFyIGU9WyJzYW1wbGluZyIsInN0eWxlIiwic29ydCIsInlBeGlzT3JpZW50YXRpb24iLCJiYXJDaGFydCIsInpJbmRleCIsImV4Y2x1ZGVGcm9tU3RhY2tpbmciLCJleGNsdWRlRnJvbUxlZ2VuZCJdO3Muc2VsZWN0aXZlRGVlcEV4dGVuZChlLHRoaXMub3B0aW9ucyx0KSwiZnVuY3Rpb24iPT10eXBlb2YgdC5kcmF3UG9pbnRzJiYodC5kcmF3UG9pbnRzPXtvblJlbmRlcjp0LmRyYXdQb2ludHN9KSxzLm1lcmdlT3B0aW9ucyh0aGlzLm9wdGlvbnMsdCwiaW50ZXJwb2xhdGlvbiIpLHMubWVyZ2VPcHRpb25zKHRoaXMub3B0aW9ucyx0LCJkcmF3UG9pbnRzIikscy5tZXJnZU9wdGlvbnModGhpcy5vcHRpb25zLHQsInNoYWRlZCIpLHQuaW50ZXJwb2xhdGlvbiYmIm9iamVjdCI9PW4odC5pbnRlcnBvbGF0aW9uKSYmdC5pbnRlcnBvbGF0aW9uLnBhcmFtZXRyaXphdGlvbiYmKCJ1bmlmb3JtIj09dC5pbnRlcnBvbGF0aW9uLnBhcmFtZXRyaXphdGlvbj90aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5hbHBoYT0wOiJjaG9yZGFsIj09dC5pbnRlcnBvbGF0aW9uLnBhcmFtZXRyaXphdGlvbj90aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5hbHBoYT0xOih0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5wYXJhbWV0cml6YXRpb249ImNlbnRyaXBldGFsIix0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5hbHBoYT0uNSkpfX0sby5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQpe3RoaXMuZ3JvdXA9dCx0aGlzLmNvbnRlbnQ9dC5jb250ZW50fHwiZ3JhcGgiLHRoaXMuY2xhc3NOYW1lPXQuY2xhc3NOYW1lfHx0aGlzLmNsYXNzTmFtZXx8InZpcy1ncmFwaC1ncm91cCIrdGhpcy5ncm91cHNVc2luZ0RlZmF1bHRTdHlsZXNbMF0lMTAsdGhpcy52aXNpYmxlPXZvaWQgMD09PXQudmlzaWJsZXx8dC52aXNpYmxlLHRoaXMuc3R5bGU9dC5zdHlsZSx0aGlzLnNldE9wdGlvbnModC5vcHRpb25zKX0sby5wcm90b3R5cGUuZ2V0TGVnZW5kPWZ1bmN0aW9uKHQsZSxpLG8sbil7aWYodm9pZCAwPT1pfHxudWxsPT1pKXt2YXIgcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwic3ZnIik7aT17c3ZnOnMsc3ZnRWxlbWVudHM6e30sb3B0aW9uczp0aGlzLm9wdGlvbnMsZ3JvdXBzOlt0aGlzXX19c3dpdGNoKHZvaWQgMCE9byYmbnVsbCE9b3x8KG89MCksdm9pZCAwIT1uJiZudWxsIT1ufHwobj0uNSplKSx0aGlzLm9wdGlvbnMuc3R5bGUpe2Nhc2UibGluZSI6YS5kcmF3SWNvbih0aGlzLG8sbix0LGUsaSk7YnJlYWs7Y2FzZSJwb2ludHMiOmNhc2UicG9pbnQiOmguZHJhd0ljb24odGhpcyxvLG4sdCxlLGkpO2JyZWFrO2Nhc2UiYmFyIjpyLmRyYXdJY29uKHRoaXMsbyxuLHQsZSxpKX1yZXR1cm57aWNvbjppLnN2ZyxsYWJlbDp0aGlzLmNvbnRlbnQsb3JpZW50YXRpb246dGhpcy5vcHRpb25zLnlBeGlzT3JpZW50YXRpb259fSxvLnByb3RvdHlwZS5nZXRZUmFuZ2U9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRbMF0ueSxpPXRbMF0ueSxvPTA7bzx0Lmxlbmd0aDtvKyspZT1lPnRbb10ueT90W29dLnk6ZSxpPWk8dFtvXS55P3Rbb10ueTppO3JldHVybnttaW46ZSxtYXg6aSx5QXhpc09yaWVudGF0aW9uOnRoaXMub3B0aW9ucy55QXhpc09yaWVudGF0aW9ufX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSl7fXZhciBuPWkoOCkscz1pKDU4KTtvLmRyYXdJY29uPWZ1bmN0aW9uKHQsZSxpLG8scyxyKXt2YXIgYT0uNSpzLGg9bi5nZXRTVkdFbGVtZW50KCJyZWN0IixyLnN2Z0VsZW1lbnRzLHIuc3ZnKTtoLnNldEF0dHJpYnV0ZU5TKG51bGwsIngiLGUpLGguc2V0QXR0cmlidXRlTlMobnVsbCwieSIsaS1hKSxoLnNldEF0dHJpYnV0ZU5TKG51bGwsIndpZHRoIixvKSxoLnNldEF0dHJpYnV0ZU5TKG51bGwsImhlaWdodCIsMiphKSxoLnNldEF0dHJpYnV0ZU5TKG51bGwsImNsYXNzIiwidmlzLW91dGxpbmUiKTt2YXIgZD1NYXRoLnJvdW5kKC4zKm8pLGw9dC5vcHRpb25zLmJhckNoYXJ0LndpZHRoLGM9bC9kLHU9TWF0aC5yb3VuZCguNCpzKSxwPU1hdGgucm91bmQoLjc1KnMpLGY9TWF0aC5yb3VuZCgoby0yKmQpLzMpO2lmKG4uZHJhd0JhcihlKy41KmQrZixpK2EtdS0xLGQsdSx0LmNsYXNzTmFtZSsiIHZpcy1iYXIiLHIuc3ZnRWxlbWVudHMsci5zdmcsdC5zdHlsZSksbi5kcmF3QmFyKGUrMS41KmQrZisyLGkrYS1wLTEsZCxwLHQuY2xhc3NOYW1lKyIgdmlzLWJhciIsci5zdmdFbGVtZW50cyxyLnN2Zyx0LnN0eWxlKSwxPT10Lm9wdGlvbnMuZHJhd1BvaW50cy5lbmFibGVkKXt2YXIgbT17c3R5bGU6dC5vcHRpb25zLmRyYXdQb2ludHMuc3R5bGUsc3R5bGVzOnQub3B0aW9ucy5kcmF3UG9pbnRzLnN0eWxlcyxzaXplOnQub3B0aW9ucy5kcmF3UG9pbnRzLnNpemUvYyxjbGFzc05hbWU6dC5jbGFzc05hbWV9O24uZHJhd1BvaW50KGUrLjUqZCtmLGkrYS11LTEsbSxyLnN2Z0VsZW1lbnRzLHIuc3ZnKSxuLmRyYXdQb2ludChlKzEuNSpkK2YrMixpK2EtcC0xLG0sci5zdmdFbGVtZW50cyxyLnN2Zyl9fSxvLmRyYXc9ZnVuY3Rpb24odCxlLGkpe3ZhciByLGEsaCxkLGwsYyx1PVtdLHA9e30sZj0wO2ZvcihsPTA7bDx0Lmxlbmd0aDtsKyspaWYoZD1pLmdyb3Vwc1t0W2xdXSwiYmFyIj09PWQub3B0aW9ucy5zdHlsZSYmZC52aXNpYmxlPT09ITAmJih2b2lkIDA9PT1pLm9wdGlvbnMuZ3JvdXBzLnZpc2liaWxpdHlbdFtsXV18fGkub3B0aW9ucy5ncm91cHMudmlzaWJpbGl0eVt0W2xdXT09PSEwKSlmb3IoYz0wO2M8ZVt0W2xdXS5sZW5ndGg7YysrKXUucHVzaCh7c2NyZWVuX3g6ZVt0W2xdXVtjXS5zY3JlZW5feCxzY3JlZW5feTplW3RbbF1dW2NdLnNjcmVlbl95LHg6ZVt0W2xdXVtjXS54LHk6ZVt0W2xdXVtjXS55LGdyb3VwSWQ6dFtsXSxsYWJlbDplW3RbbF1dW2NdLmxhYmVsfSksZis9MTtpZigwIT09Zilmb3IodS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuc2NyZWVuX3g9PT1lLnNjcmVlbl94P3QuZ3JvdXBJZDxlLmdyb3VwSWQ/LTE6MTp0LnNjcmVlbl94LWUuc2NyZWVuX3h9KSxvLl9nZXREYXRhSW50ZXJzZWN0aW9ucyhwLHUpLGw9MDtsPHUubGVuZ3RoO2wrKyl7ZD1pLmdyb3Vwc1t1W2xdLmdyb3VwSWRdO3ZhciBtPXZvaWQgMCE9ZC5vcHRpb25zLmJhckNoYXJ0Lm1pbldpZHRoP2Qub3B0aW9ucy5iYXJDaGFydC5taW5XaWR0aDouMSpkLm9wdGlvbnMuYmFyQ2hhcnQud2lkdGg7YT11W2xdLnNjcmVlbl94O3ZhciB2PTA7aWYodm9pZCAwPT09cFthXSlsKzE8dS5sZW5ndGgmJihyPU1hdGguYWJzKHVbbCsxXS5zY3JlZW5feC1hKSksaD1vLl9nZXRTYWZlRHJhd0RhdGEocixkLG0pO2Vsc2V7dmFyIGc9bCsocFthXS5hbW91bnQtcFthXS5yZXNvbHZlZCk7bC0ocFthXS5yZXNvbHZlZCsxKTtnPHUubGVuZ3RoJiYocj1NYXRoLmFicyh1W2ddLnNjcmVlbl94LWEpKSxoPW8uX2dldFNhZmVEcmF3RGF0YShyLGQsbSkscFthXS5yZXNvbHZlZCs9MSxkLm9wdGlvbnMuc3RhY2s9PT0hMCYmZC5vcHRpb25zLmV4Y2x1ZGVGcm9tU3RhY2tpbmchPT0hMD91W2xdLnNjcmVlbl95PGQuemVyb1Bvc2l0aW9uPyh2PXBbYV0uYWNjdW11bGF0ZWROZWdhdGl2ZSxwW2FdLmFjY3VtdWxhdGVkTmVnYXRpdmUrPWQuemVyb1Bvc2l0aW9uLXVbbF0uc2NyZWVuX3kpOih2PXBbYV0uYWNjdW11bGF0ZWRQb3NpdGl2ZSxwW2FdLmFjY3VtdWxhdGVkUG9zaXRpdmUrPWQuemVyb1Bvc2l0aW9uLXVbbF0uc2NyZWVuX3kpOmQub3B0aW9ucy5iYXJDaGFydC5zaWRlQnlTaWRlPT09ITAmJihoLndpZHRoPWgud2lkdGgvcFthXS5hbW91bnQsaC5vZmZzZXQrPXBbYV0ucmVzb2x2ZWQqaC53aWR0aC0uNSpoLndpZHRoKihwW2FdLmFtb3VudCsxKSl9aWYobi5kcmF3QmFyKHVbbF0uc2NyZWVuX3graC5vZmZzZXQsdVtsXS5zY3JlZW5feS12LGgud2lkdGgsZC56ZXJvUG9zaXRpb24tdVtsXS5zY3JlZW5feSxkLmNsYXNzTmFtZSsiIHZpcy1iYXIiLGkuc3ZnRWxlbWVudHMsaS5zdmcsZC5zdHlsZSksZC5vcHRpb25zLmRyYXdQb2ludHMuZW5hYmxlZD09PSEwKXt2YXIgeT17c2NyZWVuX3g6dVtsXS5zY3JlZW5feCxzY3JlZW5feTp1W2xdLnNjcmVlbl95LXYseDp1W2xdLngseTp1W2xdLnksZ3JvdXBJZDp1W2xdLmdyb3VwSWQsbGFiZWw6dVtsXS5sYWJlbH07cy5kcmF3KFt5XSxkLGksaC5vZmZzZXQpfX19LG8uX2dldERhdGFJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpLG89MDtvPGUubGVuZ3RoO28rKylvKzE8ZS5sZW5ndGgmJihpPU1hdGguYWJzKGVbbysxXS5zY3JlZW5feC1lW29dLnNjcmVlbl94KSksbz4wJiYoaT1NYXRoLm1pbihpLE1hdGguYWJzKGVbby0xXS5zY3JlZW5feC1lW29dLnNjcmVlbl94KSkpLDA9PT1pJiYodm9pZCAwPT09dFtlW29dLnNjcmVlbl94XSYmKHRbZVtvXS5zY3JlZW5feF09e2Ftb3VudDowLHJlc29sdmVkOjAsYWNjdW11bGF0ZWRQb3NpdGl2ZTowLGFjY3VtdWxhdGVkTmVnYXRpdmU6MH0pLHRbZVtvXS5zY3JlZW5feF0uYW1vdW50Kz0xKX0sby5fZ2V0U2FmZURyYXdEYXRhPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbyxuO3JldHVybiB0PGUub3B0aW9ucy5iYXJDaGFydC53aWR0aCYmdD4wPyhvPXQ8aT9pOnQsbj0wLCJsZWZ0Ij09PWUub3B0aW9ucy5iYXJDaGFydC5hbGlnbj9uLT0uNSp0OiJyaWdodCI9PT1lLm9wdGlvbnMuYmFyQ2hhcnQuYWxpZ24mJihuKz0uNSp0KSk6KG89ZS5vcHRpb25zLmJhckNoYXJ0LndpZHRoLG49MCwibGVmdCI9PT1lLm9wdGlvbnMuYmFyQ2hhcnQuYWxpZ24/bi09LjUqZS5vcHRpb25zLmJhckNoYXJ0LndpZHRoOiJyaWdodCI9PT1lLm9wdGlvbnMuYmFyQ2hhcnQuYWxpZ24mJihuKz0uNSplLm9wdGlvbnMuYmFyQ2hhcnQud2lkdGgpKSx7d2lkdGg6byxvZmZzZXQ6bn19LG8uZ2V0U3RhY2tlZFlSYW5nZT1mdW5jdGlvbih0LGUsaSxuLHMpe2lmKHQubGVuZ3RoPjApe3Quc29ydChmdW5jdGlvbih0LGUpe3JldHVybiB0LnNjcmVlbl94PT09ZS5zY3JlZW5feD90Lmdyb3VwSWQ8ZS5ncm91cElkPy0xOjE6dC5zY3JlZW5feC1lLnNjcmVlbl94fSk7dmFyIHI9e307by5fZ2V0RGF0YUludGVyc2VjdGlvbnMocix0KSxlW25dPW8uX2dldFN0YWNrZWRZUmFuZ2Uocix0KSxlW25dLnlBeGlzT3JpZW50YXRpb249cyxpLnB1c2gobil9fSxvLl9nZXRTdGFja2VkWVJhbmdlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpLG89ZVswXS5zY3JlZW5feSxuPWVbMF0uc2NyZWVuX3kscz0wO3M8ZS5sZW5ndGg7cysrKWk9ZVtzXS5zY3JlZW5feCx2b2lkIDA9PT10W2ldPyhvPW8+ZVtzXS5zY3JlZW5feT9lW3NdLnNjcmVlbl95Om8sbj1uPGVbc10uc2NyZWVuX3k/ZVtzXS5zY3JlZW5feTpuKTplW3NdLnNjcmVlbl95PDA/dFtpXS5hY2N1bXVsYXRlZE5lZ2F0aXZlKz1lW3NdLnNjcmVlbl95OnRbaV0uYWNjdW11bGF0ZWRQb3NpdGl2ZSs9ZVtzXS5zY3JlZW5feTtmb3IodmFyIHIgaW4gdCl0Lmhhc093blByb3BlcnR5KHIpJiYobz1vPnRbcl0uYWNjdW11bGF0ZWROZWdhdGl2ZT90W3JdLmFjY3VtdWxhdGVkTmVnYXRpdmU6byxvPW8+dFtyXS5hY2N1bXVsYXRlZFBvc2l0aXZlP3Rbcl0uYWNjdW11bGF0ZWRQb3NpdGl2ZTpvLG49bjx0W3JdLmFjY3VtdWxhdGVkTmVnYXRpdmU/dFtyXS5hY2N1bXVsYXRlZE5lZ2F0aXZlOm4sbj1uPHRbcl0uYWNjdW11bGF0ZWRQb3NpdGl2ZT90W3JdLmFjY3VtdWxhdGVkUG9zaXRpdmU6bik7cmV0dXJue21pbjpvLG1heDpufX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSl7fWZ1bmN0aW9uIG4odCxlKXtyZXR1cm4gZT0idW5kZWZpbmVkIj09dHlwZW9mIGU/e306ZSx7c3R5bGU6ZS5zdHlsZXx8dC5vcHRpb25zLmRyYXdQb2ludHMuc3R5bGUsc3R5bGVzOmUuc3R5bGVzfHx0Lm9wdGlvbnMuZHJhd1BvaW50cy5zdHlsZXMsc2l6ZTplLnNpemV8fHQub3B0aW9ucy5kcmF3UG9pbnRzLnNpemUsY2xhc3NOYW1lOmUuY2xhc3NOYW1lfHx0LmNsYXNzTmFtZX19ZnVuY3Rpb24gcyh0LGUpe3ZhciBpPXZvaWQgMDtyZXR1cm4gdC5vcHRpb25zJiZ0Lm9wdGlvbnMuZHJhd1BvaW50cyYmdC5vcHRpb25zLmRyYXdQb2ludHMub25SZW5kZXImJiJmdW5jdGlvbiI9PXR5cGVvZiB0Lm9wdGlvbnMuZHJhd1BvaW50cy5vblJlbmRlciYmKGk9dC5vcHRpb25zLmRyYXdQb2ludHMub25SZW5kZXIpLGUuZ3JvdXAub3B0aW9ucyYmZS5ncm91cC5vcHRpb25zLmRyYXdQb2ludHMmJmUuZ3JvdXAub3B0aW9ucy5kcmF3UG9pbnRzLm9uUmVuZGVyJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5ncm91cC5vcHRpb25zLmRyYXdQb2ludHMub25SZW5kZXImJihpPWUuZ3JvdXAub3B0aW9ucy5kcmF3UG9pbnRzLm9uUmVuZGVyKSxpfXZhciByPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSxhPWkoOCk7by5kcmF3PWZ1bmN0aW9uKHQsZSxpLG8pe289b3x8MDtmb3IodmFyIGg9cyhpLGUpLGQ9MDtkPHQubGVuZ3RoO2QrKylpZihoKXt2YXIgbD1oKHRbZF0sZSk7bCE9PSEwJiYib2JqZWN0IiE9PSgidW5kZWZpbmVkIj09dHlwZW9mIGw/InVuZGVmaW5lZCI6cihsKSl8fGEuZHJhd1BvaW50KHRbZF0uc2NyZWVuX3grbyx0W2RdLnNjcmVlbl95LG4oZSxsKSxpLnN2Z0VsZW1lbnRzLGkuc3ZnLHRbZF0ubGFiZWwpfWVsc2UgYS5kcmF3UG9pbnQodFtkXS5zY3JlZW5feCtvLHRbZF0uc2NyZWVuX3ksbihlKSxpLnN2Z0VsZW1lbnRzLGkuc3ZnLHRbZF0ubGFiZWwpfSxvLmRyYXdJY29uPWZ1bmN0aW9uKHQsZSxpLG8scyxyKXt2YXIgaD0uNSpzLGQ9YS5nZXRTVkdFbGVtZW50KCJyZWN0IixyLnN2Z0VsZW1lbnRzLHIuc3ZnKTtkLnNldEF0dHJpYnV0ZU5TKG51bGwsIngiLGUpLGQuc2V0QXR0cmlidXRlTlMobnVsbCwieSIsaS1oKSxkLnNldEF0dHJpYnV0ZU5TKG51bGwsIndpZHRoIixvKSxkLnNldEF0dHJpYnV0ZU5TKG51bGwsImhlaWdodCIsMipoKSxkLnNldEF0dHJpYnV0ZU5TKG51bGwsImNsYXNzIiwidmlzLW91dGxpbmUiKSxhLmRyYXdQb2ludChlKy41Km8saSxuKHQpLHIuc3ZnRWxlbWVudHMsci5zdmcpfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlKXt9dmFyIG49aSg4KTtvLmNhbGNQYXRoPWZ1bmN0aW9uKHQsZSl7aWYobnVsbCE9dCYmdC5sZW5ndGg+MCl7dmFyIGk9W107cmV0dXJuIGk9MT09ZS5vcHRpb25zLmludGVycG9sYXRpb24uZW5hYmxlZD9vLl9jYXRtdWxsUm9tKHQsZSk6by5fbGluZWFyKHQpfX0sby5kcmF3SWNvbj1mdW5jdGlvbih0LGUsaSxvLHMscil7dmFyIGEsaCxkPS41KnMsbD1uLmdldFNWR0VsZW1lbnQoInJlY3QiLHIuc3ZnRWxlbWVudHMsci5zdmcpO2lmKGwuc2V0QXR0cmlidXRlTlMobnVsbCwieCIsZSksbC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ5IixpLWQpLGwuc2V0QXR0cmlidXRlTlMobnVsbCwid2lkdGgiLG8pLGwuc2V0QXR0cmlidXRlTlMobnVsbCwiaGVpZ2h0IiwyKmQpLGwuc2V0QXR0cmlidXRlTlMobnVsbCwiY2xhc3MiLCJ2aXMtb3V0bGluZSIpLGE9bi5nZXRTVkdFbGVtZW50KCJwYXRoIixyLnN2Z0VsZW1lbnRzLHIuc3ZnKSxhLnNldEF0dHJpYnV0ZU5TKG51bGwsImNsYXNzIix0LmNsYXNzTmFtZSksdm9pZCAwIT09dC5zdHlsZSYmYS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJzdHlsZSIsdC5zdHlsZSksYS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJkIiwiTSIrZSsiLCIraSsiIEwiKyhlK28pKyIsIitpKSwxPT10Lm9wdGlvbnMuc2hhZGVkLmVuYWJsZWQmJihoPW4uZ2V0U1ZHRWxlbWVudCgicGF0aCIsci5zdmdFbGVtZW50cyxyLnN2ZyksInRvcCI9PXQub3B0aW9ucy5zaGFkZWQub3JpZW50YXRpb24/aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJkIiwiTSIrZSsiLCAiKyhpLWQpKyJMIitlKyIsIitpKyIgTCIrKGUrbykrIiwiK2krIiBMIisoZStvKSsiLCIrKGktZCkpOmguc2V0QXR0cmlidXRlTlMobnVsbCwiZCIsIk0iK2UrIiwiK2krIiBMIitlKyIsIisoaStkKSsiIEwiKyhlK28pKyIsIisoaStkKSsiTCIrKGUrbykrIiwiK2kpLGguc2V0QXR0cmlidXRlTlMobnVsbCwiY2xhc3MiLHQuY2xhc3NOYW1lKyIgdmlzLWljb24tZmlsbCIpLHZvaWQgMCE9PXQub3B0aW9ucy5zaGFkZWQuc3R5bGUmJiIiIT09dC5vcHRpb25zLnNoYWRlZC5zdHlsZSYmaC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJzdHlsZSIsdC5vcHRpb25zLnNoYWRlZC5zdHlsZSkpLDE9PXQub3B0aW9ucy5kcmF3UG9pbnRzLmVuYWJsZWQpe3ZhciBjPXtzdHlsZTp0Lm9wdGlvbnMuZHJhd1BvaW50cy5zdHlsZSxzdHlsZXM6dC5vcHRpb25zLmRyYXdQb2ludHMuc3R5bGVzLHNpemU6dC5vcHRpb25zLmRyYXdQb2ludHMuc2l6ZSxjbGFzc05hbWU6dC5jbGFzc05hbWV9O24uZHJhd1BvaW50KGUrLjUqbyxpLGMsci5zdmdFbGVtZW50cyxyLnN2Zyl9fSxvLmRyYXdTaGFkaW5nPWZ1bmN0aW9uKHQsZSxpLG8pe2lmKDE9PWUub3B0aW9ucy5zaGFkZWQuZW5hYmxlZCl7dmFyIHM9TnVtYmVyKG8uc3ZnLnN0eWxlLmhlaWdodC5yZXBsYWNlKCJweCIsIiIpKSxyPW4uZ2V0U1ZHRWxlbWVudCgicGF0aCIsby5zdmdFbGVtZW50cyxvLnN2ZyksYT0iTCI7MT09ZS5vcHRpb25zLmludGVycG9sYXRpb24uZW5hYmxlZCYmKGE9IkMiKTt2YXIgaCxkPTA7ZD0idG9wIj09ZS5vcHRpb25zLnNoYWRlZC5vcmllbnRhdGlvbj8wOiJib3R0b20iPT1lLm9wdGlvbnMuc2hhZGVkLm9yaWVudGF0aW9uP3M6TWF0aC5taW4oTWF0aC5tYXgoMCxlLnplcm9Qb3NpdGlvbikscyksaD0iZ3JvdXAiPT1lLm9wdGlvbnMuc2hhZGVkLm9yaWVudGF0aW9uJiZudWxsIT1pJiZ2b2lkIDAhPWk/Ik0iK3RbMF1bMF0rIiwiK3RbMF1bMV0rIiAiK3RoaXMuc2VyaWFsaXplUGF0aCh0LGEsITEpKyIgTCIraVtpLmxlbmd0aC0xXVswXSsiLCIraVtpLmxlbmd0aC0xXVsxXSsiICIrdGhpcy5zZXJpYWxpemVQYXRoKGksYSwhMCkraVswXVswXSsiLCIraVswXVsxXSsiIFoiOiJNIit0WzBdWzBdKyIsIit0WzBdWzFdKyIgIit0aGlzLnNlcmlhbGl6ZVBhdGgodCxhLCExKSsiIFYiK2QrIiBIIit0WzBdWzBdKyIgWiIsci5zZXRBdHRyaWJ1dGVOUyhudWxsLCJjbGFzcyIsZS5jbGFzc05hbWUrIiB2aXMtZmlsbCIpLHZvaWQgMCE9PWUub3B0aW9ucy5zaGFkZWQuc3R5bGUmJnIuc2V0QXR0cmlidXRlTlMobnVsbCwic3R5bGUiLGUub3B0aW9ucy5zaGFkZWQuc3R5bGUpLHIuc2V0QXR0cmlidXRlTlMobnVsbCwiZCIsaCl9fSxvLmRyYXc9ZnVuY3Rpb24odCxlLGkpe2lmKG51bGwhPXQmJnZvaWQgMCE9dCl7dmFyIG89bi5nZXRTVkdFbGVtZW50KCJwYXRoIixpLnN2Z0VsZW1lbnRzLGkuc3ZnKTtvLnNldEF0dHJpYnV0ZU5TKG51bGwsImNsYXNzIixlLmNsYXNzTmFtZSksdm9pZCAwIT09ZS5zdHlsZSYmby5zZXRBdHRyaWJ1dGVOUyhudWxsLCJzdHlsZSIsZS5zdHlsZSk7dmFyIHM9IkwiOzE9PWUub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmVuYWJsZWQmJihzPSJDIiksby5zZXRBdHRyaWJ1dGVOUyhudWxsLCJkIiwiTSIrdFswXVswXSsiLCIrdFswXVsxXSsiICIrdGhpcy5zZXJpYWxpemVQYXRoKHQscywhMSkpfX0sby5zZXJpYWxpemVQYXRoPWZ1bmN0aW9uKHQsZSxpKXtpZih0Lmxlbmd0aDwyKXJldHVybiIiO3ZhciBvPWU7aWYoaSlmb3IodmFyIG49dC5sZW5ndGgtMjtuPjA7bi0tKW8rPXRbbl1bMF0rIiwiK3Rbbl1bMV0rIiAiO2Vsc2UgZm9yKHZhciBuPTE7bjx0Lmxlbmd0aDtuKyspbys9dFtuXVswXSsiLCIrdFtuXVsxXSsiICI7cmV0dXJuIG99LG8uX2NhdG11bGxSb21Vbmlmb3JtPWZ1bmN0aW9uKHQpe3ZhciBlLGksbyxuLHMscixhPVtdO2EucHVzaChbTWF0aC5yb3VuZCh0WzBdLnNjcmVlbl94KSxNYXRoLnJvdW5kKHRbMF0uc2NyZWVuX3kpXSk7Zm9yKHZhciBoPTEvNixkPXQubGVuZ3RoLGw9MDtsPGQtMTtsKyspZT0wPT1sP3RbMF06dFtsLTFdLGk9dFtsXSxvPXRbbCsxXSxuPWwrMjxkP3RbbCsyXTpvLHM9e3NjcmVlbl94OigtZS5zY3JlZW5feCs2Kmkuc2NyZWVuX3grby5zY3JlZW5feCkqaCxzY3JlZW5feTooLWUuc2NyZWVuX3krNippLnNjcmVlbl95K28uc2NyZWVuX3kpKmh9LHI9e3NjcmVlbl94OihpLnNjcmVlbl94KzYqby5zY3JlZW5feC1uLnNjcmVlbl94KSpoLHNjcmVlbl95OihpLnNjcmVlbl95KzYqby5zY3JlZW5feS1uLnNjcmVlbl95KSpofSxhLnB1c2goW3Muc2NyZWVuX3gscy5zY3JlZW5feV0pLGEucHVzaChbci5zY3JlZW5feCxyLnNjcmVlbl95XSksYS5wdXNoKFtvLnNjcmVlbl94LG8uc2NyZWVuX3ldKTtyZXR1cm4gYX0sby5fY2F0bXVsbFJvbT1mdW5jdGlvbih0LGUpe3ZhciBpPWUub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmFscGhhO2lmKDA9PWl8fHZvaWQgMD09PWkpcmV0dXJuIHRoaXMuX2NhdG11bGxSb21Vbmlmb3JtKHQpO3ZhciBvLG4scyxyLGEsaCxkLGwsYyx1LHAsZixtLHYsZyx5LGIsXyx3LHg9W107eC5wdXNoKFtNYXRoLnJvdW5kKHRbMF0uc2NyZWVuX3gpLE1hdGgucm91bmQodFswXS5zY3JlZW5feSldKTtmb3IodmFyIGs9dC5sZW5ndGgsTz0wO088ay0xO08rKylvPTA9PU8/dFswXTp0W08tMV0sbj10W09dLHM9dFtPKzFdLHI9TysyPGs/dFtPKzJdOnMsZD1NYXRoLnNxcnQoTWF0aC5wb3coby5zY3JlZW5feC1uLnNjcmVlbl94LDIpK01hdGgucG93KG8uc2NyZWVuX3ktbi5zY3JlZW5feSwyKSksbD1NYXRoLnNxcnQoTWF0aC5wb3cobi5zY3JlZW5feC1zLnNjcmVlbl94LDIpK01hdGgucG93KG4uc2NyZWVuX3ktcy5zY3JlZW5feSwyKSksYz1NYXRoLnNxcnQoTWF0aC5wb3cocy5zY3JlZW5feC1yLnNjcmVlbl94LDIpK01hdGgucG93KHMuc2NyZWVuX3ktci5zY3JlZW5feSwyKSksdj1NYXRoLnBvdyhjLGkpLHk9TWF0aC5wb3coYywyKmkpLGc9TWF0aC5wb3cobCxpKSxiPU1hdGgucG93KGwsMippKSx3PU1hdGgucG93KGQsaSksXz1NYXRoLnBvdyhkLDIqaSksdT0yKl8rMyp3KmcrYixwPTIqeSszKnYqZytiLGY9Myp3Kih3K2cpLGY+MCYmKGY9MS9mKSxtPTMqdiooditnKSxtPjAmJihtPTEvbSksYT17c2NyZWVuX3g6KC1iKm8uc2NyZWVuX3grdSpuLnNjcmVlbl94K18qcy5zY3JlZW5feCkqZixzY3JlZW5feTooLWIqby5zY3JlZW5feSt1Km4uc2NyZWVuX3krXypzLnNjcmVlbl95KSpmfSxoPXtzY3JlZW5feDooeSpuLnNjcmVlbl94K3Aqcy5zY3JlZW5feC1iKnIuc2NyZWVuX3gpKm0sc2NyZWVuX3k6KHkqbi5zY3JlZW5feStwKnMuc2NyZWVuX3ktYipyLnNjcmVlbl95KSptfSwwPT1hLnNjcmVlbl94JiYwPT1hLnNjcmVlbl95JiYoYT1uKSwwPT1oLnNjcmVlbl94JiYwPT1oLnNjcmVlbl95JiYoaD1zKSx4LnB1c2goW2Euc2NyZWVuX3gsYS5zY3JlZW5feV0pLHgucHVzaChbaC5zY3JlZW5feCxoLnNjcmVlbl95XSkseC5wdXNoKFtzLnNjcmVlbl94LHMuc2NyZWVuX3ldKTtyZXR1cm4geH0sby5fbGluZWFyPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxpPTA7aTx0Lmxlbmd0aDtpKyspZS5wdXNoKFt0W2ldLnNjcmVlbl94LHRbaV0uc2NyZWVuX3ldKTtyZXR1cm4gZX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSxpLG8pe3RoaXMuYm9keT10LHRoaXMuZGVmYXVsdE9wdGlvbnM9e2VuYWJsZWQ6ITEsaWNvbnM6ITAsaWNvblNpemU6MjAsaWNvblNwYWNpbmc6NixsZWZ0Ont2aXNpYmxlOiEwLHBvc2l0aW9uOiJ0b3AtbGVmdCJ9LHJpZ2h0Ont2aXNpYmxlOiEwLHBvc2l0aW9uOiJ0b3AtcmlnaHQifX0sdGhpcy5zaWRlPWksdGhpcy5vcHRpb25zPW4uZXh0ZW5kKHt9LHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMubGluZWdyYXBoT3B0aW9ucz1vLHRoaXMuc3ZnRWxlbWVudHM9e30sdGhpcy5kb209e30sdGhpcy5ncm91cHM9e30sdGhpcy5hbW91bnRPZkdyb3Vwcz0wLHRoaXMuX2NyZWF0ZSgpLHRoaXMuZnJhbWV3b3JrPXtzdmc6dGhpcy5zdmcsc3ZnRWxlbWVudHM6dGhpcy5zdmdFbGVtZW50cyxvcHRpb25zOnRoaXMub3B0aW9ucyxncm91cHM6dGhpcy5ncm91cHN9LHRoaXMuc2V0T3B0aW9ucyhlKX12YXIgbj1pKDEpLHM9aSg4KSxyPWkoMzMpO28ucHJvdG90eXBlPW5ldyByLG8ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5ncm91cHM9e30sdGhpcy5hbW91bnRPZkdyb3Vwcz0wfSxvLnByb3RvdHlwZS5hZGRHcm91cD1mdW5jdGlvbih0LGUpezEhPWUub3B0aW9ucy5leGNsdWRlRnJvbUxlZ2VuZCYmKHRoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KHQpfHwodGhpcy5ncm91cHNbdF09ZSksdGhpcy5hbW91bnRPZkdyb3Vwcys9MSl9LG8ucHJvdG90eXBlLnVwZGF0ZUdyb3VwPWZ1bmN0aW9uKHQsZSl7CnRoaXMuZ3JvdXBzW3RdPWV9LG8ucHJvdG90eXBlLnJlbW92ZUdyb3VwPWZ1bmN0aW9uKHQpe3RoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KHQpJiYoZGVsZXRlIHRoaXMuZ3JvdXBzW3RdLHRoaXMuYW1vdW50T2ZHcm91cHMtPTEpfSxvLnByb3RvdHlwZS5fY3JlYXRlPWZ1bmN0aW9uKCl7dGhpcy5kb20uZnJhbWU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5kb20uZnJhbWUuY2xhc3NOYW1lPSJ2aXMtbGVnZW5kIix0aGlzLmRvbS5mcmFtZS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZG9tLmZyYW1lLnN0eWxlLnRvcD0iMTBweCIsdGhpcy5kb20uZnJhbWUuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuZG9tLnRleHRBcmVhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZG9tLnRleHRBcmVhLmNsYXNzTmFtZT0idmlzLWxlZ2VuZC10ZXh0Iix0aGlzLmRvbS50ZXh0QXJlYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLHRoaXMuZG9tLnRleHRBcmVhLnN0eWxlLnRvcD0iMHB4Iix0aGlzLnN2Zz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwic3ZnIiksdGhpcy5zdmcuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnN2Zy5zdHlsZS50b3A9IjBweCIsdGhpcy5zdmcuc3R5bGUud2lkdGg9dGhpcy5vcHRpb25zLmljb25TaXplKzUrInB4Iix0aGlzLnN2Zy5zdHlsZS5oZWlnaHQ9IjEwMCUiLHRoaXMuZG9tLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuc3ZnKSx0aGlzLmRvbS5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmRvbS50ZXh0QXJlYSl9LG8ucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oKXt0aGlzLmRvbS5mcmFtZS5wYXJlbnROb2RlJiZ0aGlzLmRvbS5mcmFtZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tLmZyYW1lKX0sby5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe3RoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGV8fHRoaXMuYm9keS5kb20uY2VudGVyLmFwcGVuZENoaWxkKHRoaXMuZG9tLmZyYW1lKX0sby5wcm90b3R5cGUuc2V0T3B0aW9ucz1mdW5jdGlvbih0KXt2YXIgZT1bImVuYWJsZWQiLCJvcmllbnRhdGlvbiIsImljb25zIiwibGVmdCIsInJpZ2h0Il07bi5zZWxlY3RpdmVEZWVwRXh0ZW5kKGUsdGhpcy5vcHRpb25zLHQpfSxvLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24oKXt2YXIgdD0wLGU9T2JqZWN0LmtleXModGhpcy5ncm91cHMpO2Uuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiB0PGU/LTE6MX0pO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldOzEhPXRoaXMuZ3JvdXBzW29dLnZpc2libGV8fHZvaWQgMCE9PXRoaXMubGluZWdyYXBoT3B0aW9ucy52aXNpYmlsaXR5W29dJiYxIT10aGlzLmxpbmVncmFwaE9wdGlvbnMudmlzaWJpbGl0eVtvXXx8dCsrfWlmKDA9PXRoaXMub3B0aW9uc1t0aGlzLnNpZGVdLnZpc2libGV8fDA9PXRoaXMuYW1vdW50T2ZHcm91cHN8fDA9PXRoaXMub3B0aW9ucy5lbmFibGVkfHwwPT10KXRoaXMuaGlkZSgpO2Vsc2V7aWYodGhpcy5zaG93KCksInRvcC1sZWZ0Ij09dGhpcy5vcHRpb25zW3RoaXMuc2lkZV0ucG9zaXRpb258fCJib3R0b20tbGVmdCI9PXRoaXMub3B0aW9uc1t0aGlzLnNpZGVdLnBvc2l0aW9uPyh0aGlzLmRvbS5mcmFtZS5zdHlsZS5sZWZ0PSI0cHgiLHRoaXMuZG9tLmZyYW1lLnN0eWxlLnRleHRBbGlnbj0ibGVmdCIsdGhpcy5kb20udGV4dEFyZWEuc3R5bGUudGV4dEFsaWduPSJsZWZ0Iix0aGlzLmRvbS50ZXh0QXJlYS5zdHlsZS5sZWZ0PXRoaXMub3B0aW9ucy5pY29uU2l6ZSsxNSsicHgiLHRoaXMuZG9tLnRleHRBcmVhLnN0eWxlLnJpZ2h0PSIiLHRoaXMuc3ZnLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5zdmcuc3R5bGUucmlnaHQ9IiIpOih0aGlzLmRvbS5mcmFtZS5zdHlsZS5yaWdodD0iNHB4Iix0aGlzLmRvbS5mcmFtZS5zdHlsZS50ZXh0QWxpZ249InJpZ2h0Iix0aGlzLmRvbS50ZXh0QXJlYS5zdHlsZS50ZXh0QWxpZ249InJpZ2h0Iix0aGlzLmRvbS50ZXh0QXJlYS5zdHlsZS5yaWdodD10aGlzLm9wdGlvbnMuaWNvblNpemUrMTUrInB4Iix0aGlzLmRvbS50ZXh0QXJlYS5zdHlsZS5sZWZ0PSIiLHRoaXMuc3ZnLnN0eWxlLnJpZ2h0PSIwcHgiLHRoaXMuc3ZnLnN0eWxlLmxlZnQ9IiIpLCJ0b3AtbGVmdCI9PXRoaXMub3B0aW9uc1t0aGlzLnNpZGVdLnBvc2l0aW9ufHwidG9wLXJpZ2h0Ij09dGhpcy5vcHRpb25zW3RoaXMuc2lkZV0ucG9zaXRpb24pdGhpcy5kb20uZnJhbWUuc3R5bGUudG9wPTQtTnVtYmVyKHRoaXMuYm9keS5kb20uY2VudGVyLnN0eWxlLnRvcC5yZXBsYWNlKCJweCIsIiIpKSsicHgiLHRoaXMuZG9tLmZyYW1lLnN0eWxlLmJvdHRvbT0iIjtlbHNle3ZhciBuPXRoaXMuYm9keS5kb21Qcm9wcy5jZW50ZXIuaGVpZ2h0LXRoaXMuYm9keS5kb21Qcm9wcy5jZW50ZXJDb250YWluZXIuaGVpZ2h0O3RoaXMuZG9tLmZyYW1lLnN0eWxlLmJvdHRvbT00K24rTnVtYmVyKHRoaXMuYm9keS5kb20uY2VudGVyLnN0eWxlLnRvcC5yZXBsYWNlKCJweCIsIiIpKSsicHgiLHRoaXMuZG9tLmZyYW1lLnN0eWxlLnRvcD0iIn0wPT10aGlzLm9wdGlvbnMuaWNvbnM/KHRoaXMuZG9tLmZyYW1lLnN0eWxlLndpZHRoPXRoaXMuZG9tLnRleHRBcmVhLm9mZnNldFdpZHRoKzEwKyJweCIsdGhpcy5kb20udGV4dEFyZWEuc3R5bGUucmlnaHQ9IiIsdGhpcy5kb20udGV4dEFyZWEuc3R5bGUubGVmdD0iIix0aGlzLnN2Zy5zdHlsZS53aWR0aD0iMHB4Iik6KHRoaXMuZG9tLmZyYW1lLnN0eWxlLndpZHRoPXRoaXMub3B0aW9ucy5pY29uU2l6ZSsxNSt0aGlzLmRvbS50ZXh0QXJlYS5vZmZzZXRXaWR0aCsxMCsicHgiLHRoaXMuZHJhd0xlZ2VuZEljb25zKCkpO2Zvcih2YXIgcz0iIixpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07MSE9dGhpcy5ncm91cHNbb10udmlzaWJsZXx8dm9pZCAwIT09dGhpcy5saW5lZ3JhcGhPcHRpb25zLnZpc2liaWxpdHlbb10mJjEhPXRoaXMubGluZWdyYXBoT3B0aW9ucy52aXNpYmlsaXR5W29dfHwocys9dGhpcy5ncm91cHNbb10uY29udGVudCsiPGJyIC8+Iil9dGhpcy5kb20udGV4dEFyZWEuaW5uZXJIVE1MPXMsdGhpcy5kb20udGV4dEFyZWEuc3R5bGUubGluZUhlaWdodD0uNzUqdGhpcy5vcHRpb25zLmljb25TaXplK3RoaXMub3B0aW9ucy5pY29uU3BhY2luZysicHgifX0sby5wcm90b3R5cGUuZHJhd0xlZ2VuZEljb25zPWZ1bmN0aW9uKCl7aWYodGhpcy5kb20uZnJhbWUucGFyZW50Tm9kZSl7dmFyIHQ9T2JqZWN0LmtleXModGhpcy5ncm91cHMpO3Quc29ydChmdW5jdGlvbih0LGUpe3JldHVybiB0PGU/LTE6MX0pLHMucmVzZXRFbGVtZW50cyh0aGlzLnN2Z0VsZW1lbnRzKTt2YXIgZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmRvbS5mcmFtZSkucGFkZGluZ1RvcCxpPU51bWJlcihlLnJlcGxhY2UoInB4IiwiIikpLG89aSxuPXRoaXMub3B0aW9ucy5pY29uU2l6ZSxyPS43NSp0aGlzLm9wdGlvbnMuaWNvblNpemUsYT1pKy41KnIrMzt0aGlzLnN2Zy5zdHlsZS53aWR0aD1uKzUraSsicHgiO2Zvcih2YXIgaD0wO2g8dC5sZW5ndGg7aCsrKXt2YXIgZD10W2hdOzEhPXRoaXMuZ3JvdXBzW2RdLnZpc2libGV8fHZvaWQgMCE9PXRoaXMubGluZWdyYXBoT3B0aW9ucy52aXNpYmlsaXR5W2RdJiYxIT10aGlzLmxpbmVncmFwaE9wdGlvbnMudmlzaWJpbGl0eVtkXXx8KHRoaXMuZ3JvdXBzW2RdLmdldExlZ2VuZChuLHIsdGhpcy5mcmFtZXdvcmssbyxhKSxhKz1yK3RoaXMub3B0aW9ucy5pY29uU3BhY2luZyl9fX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPSJzdHJpbmciLG89ImJvb2xlYW4iLG49Im51bWJlciIscz0iYXJyYXkiLHI9ImRhdGUiLGE9Im9iamVjdCIsaD0iZG9tIixkPSJtb21lbnQiLGw9ImFueSIsYz17Y29uZmlndXJlOntlbmFibGVkOntib29sZWFuOm99LGZpbHRlcjp7Ym9vbGVhbjpvLGZ1bmN0aW9uOiJmdW5jdGlvbiJ9LGNvbnRhaW5lcjp7ZG9tOmh9LF9fdHlwZV9fOntvYmplY3Q6YSxib29sZWFuOm8sZnVuY3Rpb246ImZ1bmN0aW9uIn19LHlBeGlzT3JpZW50YXRpb246e3N0cmluZzpbImxlZnQiLCJyaWdodCJdfSxkZWZhdWx0R3JvdXA6e3N0cmluZzppfSxzb3J0Ontib29sZWFuOm99LHNhbXBsaW5nOntib29sZWFuOm99LHN0YWNrOntib29sZWFuOm99LGdyYXBoSGVpZ2h0OntzdHJpbmc6aSxudW1iZXI6bn0sc2hhZGVkOntlbmFibGVkOntib29sZWFuOm99LG9yaWVudGF0aW9uOntzdHJpbmc6WyJib3R0b20iLCJ0b3AiLCJ6ZXJvIiwiZ3JvdXAiXX0sZ3JvdXBJZDp7b2JqZWN0OmF9LF9fdHlwZV9fOntib29sZWFuOm8sb2JqZWN0OmF9fSxzdHlsZTp7c3RyaW5nOlsibGluZSIsImJhciIsInBvaW50cyJdfSxiYXJDaGFydDp7d2lkdGg6e251bWJlcjpufSxtaW5XaWR0aDp7bnVtYmVyOm59LHNpZGVCeVNpZGU6e2Jvb2xlYW46b30sYWxpZ246e3N0cmluZzpbImxlZnQiLCJjZW50ZXIiLCJyaWdodCJdfSxfX3R5cGVfXzp7b2JqZWN0OmF9fSxpbnRlcnBvbGF0aW9uOntlbmFibGVkOntib29sZWFuOm99LHBhcmFtZXRyaXphdGlvbjp7c3RyaW5nOlsiY2VudHJpcGV0YWwiLCJjaG9yZGFsIiwidW5pZm9ybSJdfSxhbHBoYTp7bnVtYmVyOm59LF9fdHlwZV9fOntvYmplY3Q6YSxib29sZWFuOm99fSxkcmF3UG9pbnRzOntlbmFibGVkOntib29sZWFuOm99LG9uUmVuZGVyOntmdW5jdGlvbjoiZnVuY3Rpb24ifSxzaXplOntudW1iZXI6bn0sc3R5bGU6e3N0cmluZzpbInNxdWFyZSIsImNpcmNsZSJdfSxfX3R5cGVfXzp7b2JqZWN0OmEsYm9vbGVhbjpvLGZ1bmN0aW9uOiJmdW5jdGlvbiJ9fSxkYXRhQXhpczp7c2hvd01pbm9yTGFiZWxzOntib29sZWFuOm99LHNob3dNYWpvckxhYmVsczp7Ym9vbGVhbjpvfSxpY29uczp7Ym9vbGVhbjpvfSx3aWR0aDp7c3RyaW5nOmksbnVtYmVyOm59LHZpc2libGU6e2Jvb2xlYW46b30sYWxpZ25aZXJvczp7Ym9vbGVhbjpvfSxsZWZ0OntyYW5nZTp7bWluOntudW1iZXI6bn0sbWF4OntudW1iZXI6bn0sX190eXBlX186e29iamVjdDphfX0sZm9ybWF0OntmdW5jdGlvbjoiZnVuY3Rpb24ifSx0aXRsZTp7dGV4dDp7c3RyaW5nOmksbnVtYmVyOm59LHN0eWxlOntzdHJpbmc6aX0sX190eXBlX186e29iamVjdDphfX0sX190eXBlX186e29iamVjdDphfX0scmlnaHQ6e3JhbmdlOnttaW46e251bWJlcjpufSxtYXg6e251bWJlcjpufSxfX3R5cGVfXzp7b2JqZWN0OmF9fSxmb3JtYXQ6e2Z1bmN0aW9uOiJmdW5jdGlvbiJ9LHRpdGxlOnt0ZXh0OntzdHJpbmc6aSxudW1iZXI6bn0sc3R5bGU6e3N0cmluZzppfSxfX3R5cGVfXzp7b2JqZWN0OmF9fSxfX3R5cGVfXzp7b2JqZWN0OmF9fSxfX3R5cGVfXzp7b2JqZWN0OmF9fSxsZWdlbmQ6e2VuYWJsZWQ6e2Jvb2xlYW46b30saWNvbnM6e2Jvb2xlYW46b30sbGVmdDp7dmlzaWJsZTp7Ym9vbGVhbjpvfSxwb3NpdGlvbjp7c3RyaW5nOlsidG9wLXJpZ2h0IiwiYm90dG9tLXJpZ2h0IiwidG9wLWxlZnQiLCJib3R0b20tbGVmdCJdfSxfX3R5cGVfXzp7b2JqZWN0OmF9fSxyaWdodDp7dmlzaWJsZTp7Ym9vbGVhbjpvfSxwb3NpdGlvbjp7c3RyaW5nOlsidG9wLXJpZ2h0IiwiYm90dG9tLXJpZ2h0IiwidG9wLWxlZnQiLCJib3R0b20tbGVmdCJdfSxfX3R5cGVfXzp7b2JqZWN0OmF9fSxfX3R5cGVfXzp7b2JqZWN0OmEsYm9vbGVhbjpvfX0sZ3JvdXBzOnt2aXNpYmlsaXR5Onthbnk6bH0sX190eXBlX186e29iamVjdDphfX0sYXV0b1Jlc2l6ZTp7Ym9vbGVhbjpvfSxjbGlja1RvVXNlOntib29sZWFuOm99LGVuZDp7bnVtYmVyOm4sZGF0ZTpyLHN0cmluZzppLG1vbWVudDpkfSxmb3JtYXQ6e21pbm9yTGFiZWxzOnttaWxsaXNlY29uZDp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxzZWNvbmQ6e3N0cmluZzppLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sbWludXRlOntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LGhvdXI6e3N0cmluZzppLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sd2Vla2RheTp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxkYXk6e3N0cmluZzppLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sbW9udGg6e3N0cmluZzppLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0seWVhcjp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxfX3R5cGVfXzp7b2JqZWN0OmF9fSxtYWpvckxhYmVsczp7bWlsbGlzZWNvbmQ6e3N0cmluZzppLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sc2Vjb25kOntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LG1pbnV0ZTp7c3RyaW5nOmksdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxob3VyOntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LHdlZWtkYXk6e3N0cmluZzppLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sZGF5OntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LG1vbnRoOntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LHllYXI6e3N0cmluZzppLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sX190eXBlX186e29iamVjdDphfX0sX190eXBlX186e29iamVjdDphfX0sbW9tZW50OntmdW5jdGlvbjoiZnVuY3Rpb24ifSxoZWlnaHQ6e3N0cmluZzppLG51bWJlcjpufSxoaWRkZW5EYXRlczp7c3RhcnQ6e2RhdGU6cixudW1iZXI6bixzdHJpbmc6aSxtb21lbnQ6ZH0sZW5kOntkYXRlOnIsbnVtYmVyOm4sc3RyaW5nOmksbW9tZW50OmR9LHJlcGVhdDp7c3RyaW5nOml9LF9fdHlwZV9fOntvYmplY3Q6YSxhcnJheTpzfX0sbG9jYWxlOntzdHJpbmc6aX0sbG9jYWxlczp7X19hbnlfXzp7YW55Omx9LF9fdHlwZV9fOntvYmplY3Q6YX19LG1heDp7ZGF0ZTpyLG51bWJlcjpuLHN0cmluZzppLG1vbWVudDpkfSxtYXhIZWlnaHQ6e251bWJlcjpuLHN0cmluZzppfSxtYXhNaW5vckNoYXJzOntudW1iZXI6bn0sbWluOntkYXRlOnIsbnVtYmVyOm4sc3RyaW5nOmksbW9tZW50OmR9LG1pbkhlaWdodDp7bnVtYmVyOm4sc3RyaW5nOml9LG1vdmVhYmxlOntib29sZWFuOm99LG11bHRpc2VsZWN0Ontib29sZWFuOm99LG9yaWVudGF0aW9uOntzdHJpbmc6aX0sc2hvd0N1cnJlbnRUaW1lOntib29sZWFuOm99LHNob3dNYWpvckxhYmVsczp7Ym9vbGVhbjpvfSxzaG93TWlub3JMYWJlbHM6e2Jvb2xlYW46b30sc3RhcnQ6e2RhdGU6cixudW1iZXI6bixzdHJpbmc6aSxtb21lbnQ6ZH0sdGltZUF4aXM6e3NjYWxlOntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LHN0ZXA6e251bWJlcjpuLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sX190eXBlX186e29iamVjdDphfX0sd2lkdGg6e3N0cmluZzppLG51bWJlcjpufSx6b29tYWJsZTp7Ym9vbGVhbjpvfSx6b29tS2V5OntzdHJpbmc6WyJjdHJsS2V5IiwiYWx0S2V5IiwibWV0YUtleSIsIiJdfSx6b29tTWF4OntudW1iZXI6bn0sem9vbU1pbjp7bnVtYmVyOm59LHpJbmRleDp7bnVtYmVyOm59LF9fdHlwZV9fOntvYmplY3Q6YX19LHU9e2dsb2JhbDp7c29ydDohMCxzYW1wbGluZzohMCxzdGFjazohMSxzaGFkZWQ6e2VuYWJsZWQ6ITEsb3JpZW50YXRpb246WyJ6ZXJvIiwidG9wIiwiYm90dG9tIiwiZ3JvdXAiXX0sc3R5bGU6WyJsaW5lIiwiYmFyIiwicG9pbnRzIl0sYmFyQ2hhcnQ6e3dpZHRoOls1MCw1LDEwMCw1XSxtaW5XaWR0aDpbNTAsNSwxMDAsNV0sc2lkZUJ5U2lkZTohMSxhbGlnbjpbImxlZnQiLCJjZW50ZXIiLCJyaWdodCJdfSxpbnRlcnBvbGF0aW9uOntlbmFibGVkOiEwLHBhcmFtZXRyaXphdGlvbjpbImNlbnRyaXBldGFsIiwiY2hvcmRhbCIsInVuaWZvcm0iXX0sZHJhd1BvaW50czp7ZW5hYmxlZDohMCxzaXplOls2LDIsMzAsMV0sc3R5bGU6WyJzcXVhcmUiLCJjaXJjbGUiXX0sZGF0YUF4aXM6e3Nob3dNaW5vckxhYmVsczohMCxzaG93TWFqb3JMYWJlbHM6ITAsaWNvbnM6ITEsd2lkdGg6WzQwLDAsMjAwLDFdLHZpc2libGU6ITAsYWxpZ25aZXJvczohMCxsZWZ0Ont0aXRsZTp7dGV4dDoiIixzdHlsZToiIn19LHJpZ2h0Ont0aXRsZTp7dGV4dDoiIixzdHlsZToiIn19fSxsZWdlbmQ6e2VuYWJsZWQ6ITEsaWNvbnM6ITAsbGVmdDp7dmlzaWJsZTohMCxwb3NpdGlvbjpbInRvcC1yaWdodCIsImJvdHRvbS1yaWdodCIsInRvcC1sZWZ0IiwiYm90dG9tLWxlZnQiXX0scmlnaHQ6e3Zpc2libGU6ITAscG9zaXRpb246WyJ0b3AtcmlnaHQiLCJib3R0b20tcmlnaHQiLCJ0b3AtbGVmdCIsImJvdHRvbS1sZWZ0Il19fSxhdXRvUmVzaXplOiEwLGNsaWNrVG9Vc2U6ITEsZW5kOiIiLGZvcm1hdDp7bWlub3JMYWJlbHM6e21pbGxpc2Vjb25kOiJTU1MiLHNlY29uZDoicyIsbWludXRlOiJISDptbSIsaG91cjoiSEg6bW0iLHdlZWtkYXk6ImRkZCBEIixkYXk6IkQiLG1vbnRoOiJNTU0iLHllYXI6IllZWVkifSxtYWpvckxhYmVsczp7bWlsbGlzZWNvbmQ6IkhIOm1tOnNzIixzZWNvbmQ6IkQgTU1NTSBISDptbSIsbWludXRlOiJkZGQgRCBNTU1NIixob3VyOiJkZGQgRCBNTU1NIix3ZWVrZGF5OiJNTU1NIFlZWVkiLGRheToiTU1NTSBZWVlZIixtb250aDoiWVlZWSIseWVhcjoiIn19LGhlaWdodDoiIixsb2NhbGU6IiIsbWF4OiIiLG1heEhlaWdodDoiIixtYXhNaW5vckNoYXJzOls3LDAsMjAsMV0sbWluOiIiLG1pbkhlaWdodDoiIixtb3ZlYWJsZTohMCxvcmllbnRhdGlvbjpbImJvdGgiLCJib3R0b20iLCJ0b3AiXSxzaG93Q3VycmVudFRpbWU6ITEsc2hvd01ham9yTGFiZWxzOiEwLHNob3dNaW5vckxhYmVsczohMCxzdGFydDoiIix3aWR0aDoiMTAwJSIsem9vbWFibGU6ITAsem9vbUtleTpbImN0cmxLZXkiLCJhbHRLZXkiLCJtZXRhS2V5IiwiIl0sem9vbU1heDpbMzE1MzZlMTAsMTAsMzE1MzZlMTAsMV0sem9vbU1pbjpbMTAsMTAsMzE1MzZlMTAsMV0sekluZGV4OjB9fTtlLmFsbE9wdGlvbnM9YyxlLmNvbmZpZ3VyZU9wdGlvbnM9dX0sZnVuY3Rpb24odCxlLGkpe2UudXRpbD1pKDEpLGUuRE9NdXRpbD1pKDgpLGUuRGF0YVNldD1pKDkpLGUuRGF0YVZpZXc9aSgxMSksZS5RdWV1ZT1pKDEwKSxlLk5ldHdvcms9aSg2MyksZS5uZXR3b3JrPXtJbWFnZXM6aSg2NCksZG90cGFyc2VyOmkoMTIwKSxnZXBoaVBhcnNlcjppKDEyMSksYWxsT3B0aW9uczppKDExNil9LGUubmV0d29yay5jb252ZXJ0RG90PWZ1bmN0aW9uKHQpe3JldHVybiBlLm5ldHdvcmsuZG90cGFyc2VyLkRPVFRvR3JhcGgodCl9LGUubmV0d29yay5jb252ZXJ0R2VwaGk9ZnVuY3Rpb24odCxpKXtyZXR1cm4gZS5uZXR3b3JrLmdlcGhpUGFyc2VyLnBhcnNlR2VwaGkodCxpKX0sZS5tb21lbnQ9aSgyKSxlLkhhbW1lcj1pKDIyKSxlLmtleWNoYXJtPWkoMjUpfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZnVuY3Rpb24gbih0LGUsaSl7dmFyIG89dGhpcztpZighKHRoaXMgaW5zdGFuY2VvZiBuKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyBvcGVyYXRvciIpO3RoaXMub3B0aW9ucz17fSx0aGlzLmRlZmF1bHRPcHRpb25zPXtsb2NhbGU6ImVuIixsb2NhbGVzOlksY2xpY2tUb1VzZTohMX0sai5leHRlbmQodGhpcy5vcHRpb25zLHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMuYm9keT17Y29udGFpbmVyOnQsbm9kZXM6e30sbm9kZUluZGljZXM6W10sZWRnZXM6e30sZWRnZUluZGljZXM6W10sZW1pdHRlcjp7b246dGhpcy5vbi5iaW5kKHRoaXMpLG9mZjp0aGlzLm9mZi5iaW5kKHRoaXMpLGVtaXQ6dGhpcy5lbWl0LmJpbmQodGhpcyksb25jZTp0aGlzLm9uY2UuYmluZCh0aGlzKX0sZXZlbnRMaXN0ZW5lcnM6e29uVGFwOmZ1bmN0aW9uKCl7fSxvblRvdWNoOmZ1bmN0aW9uKCl7fSxvbkRvdWJsZVRhcDpmdW5jdGlvbigpe30sb25Ib2xkOmZ1bmN0aW9uKCl7fSxvbkRyYWdTdGFydDpmdW5jdGlvbigpe30sb25EcmFnOmZ1bmN0aW9uKCl7fSxvbkRyYWdFbmQ6ZnVuY3Rpb24oKXt9LG9uTW91c2VXaGVlbDpmdW5jdGlvbigpe30sb25QaW5jaDpmdW5jdGlvbigpe30sb25Nb3VzZU1vdmU6ZnVuY3Rpb24oKXt9LG9uUmVsZWFzZTpmdW5jdGlvbigpe30sb25Db250ZXh0OmZ1bmN0aW9uKCl7fX0sZGF0YTp7bm9kZXM6bnVsbCxlZGdlczpudWxsfSxmdW5jdGlvbnM6e2NyZWF0ZU5vZGU6ZnVuY3Rpb24oKXt9LGNyZWF0ZUVkZ2U6ZnVuY3Rpb24oKXt9LGdldFBvaW50ZXI6ZnVuY3Rpb24oKXt9fSxtb2R1bGVzOnt9LHZpZXc6e3NjYWxlOjEsdHJhbnNsYXRpb246e3g6MCx5OjB9fX0sdGhpcy5iaW5kRXZlbnRMaXN0ZW5lcnMoKSx0aGlzLmltYWdlcz1uZXcgci5kZWZhdWx0KGZ1bmN0aW9uKCl7cmV0dXJuIG8uYm9keS5lbWl0dGVyLmVtaXQoIl9yZXF1ZXN0UmVkcmF3Iil9KSx0aGlzLmdyb3Vwcz1uZXcgaC5kZWZhdWx0LHRoaXMuY2FudmFzPW5ldyBfLmRlZmF1bHQodGhpcy5ib2R5KSx0aGlzLnNlbGVjdGlvbkhhbmRsZXI9bmV3IFMuZGVmYXVsdCh0aGlzLmJvZHksdGhpcy5jYW52YXMpLHRoaXMuaW50ZXJhY3Rpb25IYW5kbGVyPW5ldyBPLmRlZmF1bHQodGhpcy5ib2R5LHRoaXMuY2FudmFzLHRoaXMuc2VsZWN0aW9uSGFuZGxlciksdGhpcy52aWV3PW5ldyB4LmRlZmF1bHQodGhpcy5ib2R5LHRoaXMuY2FudmFzKSx0aGlzLnJlbmRlcmVyPW5ldyB5LmRlZmF1bHQodGhpcy5ib2R5LHRoaXMuY2FudmFzKSx0aGlzLnBoeXNpY3M9bmV3IGYuZGVmYXVsdCh0aGlzLmJvZHkpLHRoaXMubGF5b3V0RW5naW5lPW5ldyBULmRlZmF1bHQodGhpcy5ib2R5KSx0aGlzLmNsdXN0ZXJpbmc9bmV3IHYuZGVmYXVsdCh0aGlzLmJvZHkpLHRoaXMubWFuaXB1bGF0aW9uPW5ldyBNLmRlZmF1bHQodGhpcy5ib2R5LHRoaXMuY2FudmFzLHRoaXMuc2VsZWN0aW9uSGFuZGxlciksdGhpcy5ub2Rlc0hhbmRsZXI9bmV3IGwuZGVmYXVsdCh0aGlzLmJvZHksdGhpcy5pbWFnZXMsdGhpcy5ncm91cHMsdGhpcy5sYXlvdXRFbmdpbmUpLHRoaXMuZWRnZXNIYW5kbGVyPW5ldyB1LmRlZmF1bHQodGhpcy5ib2R5LHRoaXMuaW1hZ2VzLHRoaXMuZ3JvdXBzKSx0aGlzLmJvZHkubW9kdWxlcy5rYW1hZGFLYXdhaT1uZXcgQS5kZWZhdWx0KHRoaXMuYm9keSwxNTAsLjA1KSx0aGlzLmJvZHkubW9kdWxlcy5jbHVzdGVyaW5nPXRoaXMuY2x1c3RlcmluZyx0aGlzLmNhbnZhcy5fY3JlYXRlKCksdGhpcy5zZXRPcHRpb25zKGkpLHRoaXMuc2V0RGF0YShlKX12YXIgcz1pKDY0KSxyPW8ocyksYT1pKDY1KSxoPW8oYSksZD1pKDY2KSxsPW8oZCksYz1pKDg2KSx1PW8oYykscD1pKDk1KSxmPW8ocCksbT1pKDEwNCksdj1vKG0pLGc9aSgxMDcpLHk9byhnKSxiPWkoMTA4KSxfPW8oYiksdz1pKDEwOSkseD1vKHcpLGs9aSgxMTApLE89byhrKSxEPWkoMTEzKSxTPW8oRCksQz1pKDExNCksVD1vKEMpLEU9aSgxMTUpLE09byhFKSxQPWkoMjgpLEk9byhQKSxOPWkoMzEpLFI9byhOKSxMPWkoMTE2KSx6PWkoMTE3KSxBPW8oeik7aSgxMTkpO3ZhciBCPWkoMTMpLGo9aSgxKSxGPShpKDkpLGkoMTEpLGkoMTIwKSksSD1pKDEyMSksVz1pKDQ3KSxZPWkoMTIyKTtCKG4ucHJvdG90eXBlKSxuLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYodm9pZCAwIT09dCl7dmFyIGk9Ui5kZWZhdWx0LnZhbGlkYXRlKHQsTC5hbGxPcHRpb25zKTtpPT09ITAmJmNvbnNvbGUubG9nKCIlY0Vycm9ycyBoYXZlIGJlZW4gZm91bmQgaW4gdGhlIHN1cHBsaWVkIG9wdGlvbnMgb2JqZWN0LiIsTi5wcmludFN0eWxlKTt2YXIgbz1bImxvY2FsZSIsImxvY2FsZXMiLCJjbGlja1RvVXNlIl07aWYoai5zZWxlY3RpdmVEZWVwRXh0ZW5kKG8sdGhpcy5vcHRpb25zLHQpLHQ9dGhpcy5sYXlvdXRFbmdpbmUuc2V0T3B0aW9ucyh0LmxheW91dCx0KSx0aGlzLmNhbnZhcy5zZXRPcHRpb25zKHQpLHRoaXMuZ3JvdXBzLnNldE9wdGlvbnModC5ncm91cHMpLHRoaXMubm9kZXNIYW5kbGVyLnNldE9wdGlvbnModC5ub2RlcyksdGhpcy5lZGdlc0hhbmRsZXIuc2V0T3B0aW9ucyh0LmVkZ2VzKSx0aGlzLnBoeXNpY3Muc2V0T3B0aW9ucyh0LnBoeXNpY3MpLHRoaXMubWFuaXB1bGF0aW9uLnNldE9wdGlvbnModC5tYW5pcHVsYXRpb24sdCx0aGlzLm9wdGlvbnMpLHRoaXMuaW50ZXJhY3Rpb25IYW5kbGVyLnNldE9wdGlvbnModC5pbnRlcmFjdGlvbiksdGhpcy5yZW5kZXJlci5zZXRPcHRpb25zKHQuaW50ZXJhY3Rpb24pLHRoaXMuc2VsZWN0aW9uSGFuZGxlci5zZXRPcHRpb25zKHQuaW50ZXJhY3Rpb24pLHZvaWQgMCE9PXQuZ3JvdXBzJiZ0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJyZWZyZXNoTm9kZXMiKSwiY29uZmlndXJlImluIHQmJih0aGlzLmNvbmZpZ3VyYXRvcnx8KHRoaXMuY29uZmlndXJhdG9yPW5ldyBJLmRlZmF1bHQodGhpcyx0aGlzLmJvZHkuY29udGFpbmVyLEwuY29uZmlndXJlT3B0aW9ucyx0aGlzLmNhbnZhcy5waXhlbFJhdGlvKSksdGhpcy5jb25maWd1cmF0b3Iuc2V0T3B0aW9ucyh0LmNvbmZpZ3VyZSkpLHRoaXMuY29uZmlndXJhdG9yJiZ0aGlzLmNvbmZpZ3VyYXRvci5vcHRpb25zLmVuYWJsZWQ9PT0hMCl7dmFyIG49e25vZGVzOnt9LGVkZ2VzOnt9LGxheW91dDp7fSxpbnRlcmFjdGlvbjp7fSxtYW5pcHVsYXRpb246e30scGh5c2ljczp7fSxnbG9iYWw6e319O2ouZGVlcEV4dGVuZChuLm5vZGVzLHRoaXMubm9kZXNIYW5kbGVyLm9wdGlvbnMpLGouZGVlcEV4dGVuZChuLmVkZ2VzLHRoaXMuZWRnZXNIYW5kbGVyLm9wdGlvbnMpLGouZGVlcEV4dGVuZChuLmxheW91dCx0aGlzLmxheW91dEVuZ2luZS5vcHRpb25zKSxqLmRlZXBFeHRlbmQobi5pbnRlcmFjdGlvbix0aGlzLnNlbGVjdGlvbkhhbmRsZXIub3B0aW9ucyksai5kZWVwRXh0ZW5kKG4uaW50ZXJhY3Rpb24sdGhpcy5yZW5kZXJlci5vcHRpb25zKSxqLmRlZXBFeHRlbmQobi5pbnRlcmFjdGlvbix0aGlzLmludGVyYWN0aW9uSGFuZGxlci5vcHRpb25zKSxqLmRlZXBFeHRlbmQobi5tYW5pcHVsYXRpb24sdGhpcy5tYW5pcHVsYXRpb24ub3B0aW9ucyksai5kZWVwRXh0ZW5kKG4ucGh5c2ljcyx0aGlzLnBoeXNpY3Mub3B0aW9ucyksai5kZWVwRXh0ZW5kKG4uZ2xvYmFsLHRoaXMuY2FudmFzLm9wdGlvbnMpLGouZGVlcEV4dGVuZChuLmdsb2JhbCx0aGlzLm9wdGlvbnMpLHRoaXMuY29uZmlndXJhdG9yLnNldE1vZHVsZU9wdGlvbnMobil9dm9pZCAwIT09dC5jbGlja1RvVXNlP3QuY2xpY2tUb1VzZT09PSEwP3ZvaWQgMD09PXRoaXMuYWN0aXZhdG9yJiYodGhpcy5hY3RpdmF0b3I9bmV3IFcodGhpcy5jYW52YXMuZnJhbWUpLHRoaXMuYWN0aXZhdG9yLm9uKCJjaGFuZ2UiLGZ1bmN0aW9uKCl7ZS5ib2R5LmVtaXR0ZXIuZW1pdCgiYWN0aXZhdGUiKX0pKToodm9pZCAwIT09dGhpcy5hY3RpdmF0b3ImJih0aGlzLmFjdGl2YXRvci5kZXN0cm95KCksZGVsZXRlIHRoaXMuYWN0aXZhdG9yKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJhY3RpdmF0ZSIpKTp0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJhY3RpdmF0ZSIpLHRoaXMuY2FudmFzLnNldFNpemUoKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJzdGFydFNpbXVsYXRpb24iKX19LG4ucHJvdG90eXBlLl91cGRhdGVWaXNpYmxlSW5kaWNlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuYm9keS5ub2RlcyxlPXRoaXMuYm9keS5lZGdlczt0aGlzLmJvZHkubm9kZUluZGljZXM9W10sdGhpcy5ib2R5LmVkZ2VJbmRpY2VzPVtdO2Zvcih2YXIgaSBpbiB0KXQuaGFzT3duUHJvcGVydHkoaSkmJnRbaV0ub3B0aW9ucy5oaWRkZW49PT0hMSYmdGhpcy5ib2R5Lm5vZGVJbmRpY2VzLnB1c2godFtpXS5pZCk7Zm9yKHZhciBvIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShvKSYmZVtvXS5vcHRpb25zLmhpZGRlbj09PSExJiZ0aGlzLmJvZHkuZWRnZUluZGljZXMucHVzaChlW29dLmlkKX0sbi5wcm90b3R5cGUuYmluZEV2ZW50TGlzdGVuZXJzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmJvZHkuZW1pdHRlci5vbigiX2RhdGFDaGFuZ2VkIixmdW5jdGlvbigpe3QuX3VwZGF0ZVZpc2libGVJbmRpY2VzKCksdC5ib2R5LmVtaXR0ZXIuZW1pdCgiX3JlcXVlc3RSZWRyYXciKSx0LmJvZHkuZW1pdHRlci5lbWl0KCJfZGF0YVVwZGF0ZWQiKX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJfZGF0YVVwZGF0ZWQiLGZ1bmN0aW9uKCl7dC5fdXBkYXRlVmFsdWVSYW5nZSh0LmJvZHkubm9kZXMpLHQuX3VwZGF0ZVZhbHVlUmFuZ2UodC5ib2R5LmVkZ2VzKSx0LmJvZHkuZW1pdHRlci5lbWl0KCJzdGFydFNpbXVsYXRpb24iKSx0LmJvZHkuZW1pdHRlci5lbWl0KCJfcmVxdWVzdFJlZHJhdyIpfSl9LG4ucHJvdG90eXBlLnNldERhdGE9ZnVuY3Rpb24odCl7aWYodGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgicmVzZXRQaHlzaWNzIiksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX3Jlc2V0RGF0YSIpLHRoaXMuc2VsZWN0aW9uSGFuZGxlci51bnNlbGVjdEFsbCgpLHQmJnQuZG90JiYodC5ub2Rlc3x8dC5lZGdlcykpdGhyb3cgbmV3IFN5bnRheEVycm9yKCdEYXRhIG11c3QgY29udGFpbiBlaXRoZXIgcGFyYW1ldGVyICJkb3QiIG9yICBwYXJhbWV0ZXIgcGFpciAibm9kZXMiIGFuZCAiZWRnZXMiLCBidXQgbm90IGJvdGguJyk7aWYodGhpcy5zZXRPcHRpb25zKHQmJnQub3B0aW9ucyksdCYmdC5kb3Qpe2NvbnNvbGUubG9nKCJUaGUgZG90IHByb3BlcnR5IGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdGhlIHN0YXRpYyBjb252ZXJ0RG90IG1ldGhvZCB0byBjb252ZXJ0IERPVCBpbnRvIHZpcy5uZXR3b3JrIGZvcm1hdCBhbmQgdXNlIHRoZSBub3JtYWwgZGF0YSBmb3JtYXQgd2l0aCBub2RlcyBhbmQgZWRnZXMuIFRoaXMgY29udmVydGVyIGlzIHVzZWQgbGlrZSB0aGlzOiB2YXIgZGF0YSA9IHZpcy5uZXR3b3JrLmNvbnZlcnREb3QoZG90U3RyaW5nKTsiKTt2YXIgZT1GLkRPVFRvR3JhcGgodC5kb3QpO3JldHVybiB2b2lkIHRoaXMuc2V0RGF0YShlKX1pZih0JiZ0LmdlcGhpKXtjb25zb2xlLmxvZygiVGhlIGdlcGhpIHByb3BlcnR5IGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdGhlIHN0YXRpYyBjb252ZXJ0R2VwaGkgbWV0aG9kIHRvIGNvbnZlcnQgZ2VwaGkgaW50byB2aXMubmV0d29yayBmb3JtYXQgYW5kIHVzZSB0aGUgbm9ybWFsIGRhdGEgZm9ybWF0IHdpdGggbm9kZXMgYW5kIGVkZ2VzLiBUaGlzIGNvbnZlcnRlciBpcyB1c2VkIGxpa2UgdGhpczogdmFyIGRhdGEgPSB2aXMubmV0d29yay5jb252ZXJ0R2VwaGkoZ2VwaGlKc29uKTsiKTt2YXIgaT1ILnBhcnNlR2VwaGkodC5nZXBoaSk7cmV0dXJuIHZvaWQgdGhpcy5zZXREYXRhKGkpfXRoaXMubm9kZXNIYW5kbGVyLnNldERhdGEodCYmdC5ub2RlcywhMCksdGhpcy5lZGdlc0hhbmRsZXIuc2V0RGF0YSh0JiZ0LmVkZ2VzLCEwKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfZGF0YUNoYW5nZWQiKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfZGF0YUxvYWRlZCIpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoImluaXRQaHlzaWNzIil9LG4ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJkZXN0cm95IiksdGhpcy5ib2R5LmVtaXR0ZXIub2ZmKCksdGhpcy5vZmYoKSxkZWxldGUgdGhpcy5ncm91cHMsZGVsZXRlIHRoaXMuY2FudmFzLGRlbGV0ZSB0aGlzLnNlbGVjdGlvbkhhbmRsZXIsZGVsZXRlIHRoaXMuaW50ZXJhY3Rpb25IYW5kbGVyLGRlbGV0ZSB0aGlzLnZpZXcsZGVsZXRlIHRoaXMucmVuZGVyZXIsZGVsZXRlIHRoaXMucGh5c2ljcyxkZWxldGUgdGhpcy5sYXlvdXRFbmdpbmUsZGVsZXRlIHRoaXMuY2x1c3RlcmluZyxkZWxldGUgdGhpcy5tYW5pcHVsYXRpb24sZGVsZXRlIHRoaXMubm9kZXNIYW5kbGVyLGRlbGV0ZSB0aGlzLmVkZ2VzSGFuZGxlcixkZWxldGUgdGhpcy5jb25maWd1cmF0b3IsZGVsZXRlIHRoaXMuaW1hZ2VzO2Zvcih2YXIgdCBpbiB0aGlzLmJvZHkubm9kZXMpZGVsZXRlIHRoaXMuYm9keS5ub2Rlc1t0XTtmb3IodmFyIGUgaW4gdGhpcy5ib2R5LmVkZ2VzKWRlbGV0ZSB0aGlzLmJvZHkuZWRnZXNbZV07ai5yZWN1cnNpdmVET01EZWxldGUodGhpcy5ib2R5LmNvbnRhaW5lcil9LG4ucHJvdG90eXBlLl91cGRhdGVWYWx1ZVJhbmdlPWZ1bmN0aW9uKHQpe3ZhciBlLGk9dm9pZCAwLG89dm9pZCAwLG49MDtmb3IoZSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoZSkpe3ZhciBzPXRbZV0uZ2V0VmFsdWUoKTt2b2lkIDAhPT1zJiYoaT12b2lkIDA9PT1pP3M6TWF0aC5taW4ocyxpKSxvPXZvaWQgMD09PW8/czpNYXRoLm1heChzLG8pLG4rPXMpfWlmKHZvaWQgMCE9PWkmJnZvaWQgMCE9PW8pZm9yKGUgaW4gdCl0Lmhhc093blByb3BlcnR5KGUpJiZ0W2VdLnNldFZhbHVlUmFuZ2UoaSxvLG4pfSxuLnByb3RvdHlwZS5pc0FjdGl2ZT1mdW5jdGlvbigpe3JldHVybiF0aGlzLmFjdGl2YXRvcnx8dGhpcy5hY3RpdmF0b3IuYWN0aXZlfSxuLnByb3RvdHlwZS5zZXRTaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FudmFzLnNldFNpemUuYXBwbHkodGhpcy5jYW52YXMsYXJndW1lbnRzKX0sbi5wcm90b3R5cGUuY2FudmFzVG9ET009ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW52YXMuY2FudmFzVG9ET00uYXBwbHkodGhpcy5jYW52YXMsYXJndW1lbnRzKX0sbi5wcm90b3R5cGUuRE9NdG9DYW52YXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW52YXMuRE9NdG9DYW52YXMuYXBwbHkodGhpcy5jYW52YXMsYXJndW1lbnRzKX0sbi5wcm90b3R5cGUuZmluZE5vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbHVzdGVyaW5nLmZpbmROb2RlLmFwcGx5KHRoaXMuY2x1c3RlcmluZyxhcmd1bWVudHMpfSxuLnByb3RvdHlwZS5pc0NsdXN0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbHVzdGVyaW5nLmlzQ2x1c3Rlci5hcHBseSh0aGlzLmNsdXN0ZXJpbmcsYXJndW1lbnRzKX0sbi5wcm90b3R5cGUub3BlbkNsdXN0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbHVzdGVyaW5nLm9wZW5DbHVzdGVyLmFwcGx5KHRoaXMuY2x1c3RlcmluZyxhcmd1bWVudHMpfSxuLnByb3RvdHlwZS5jbHVzdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2x1c3RlcmluZy5jbHVzdGVyLmFwcGx5KHRoaXMuY2x1c3RlcmluZyxhcmd1bWVudHMpfSxuLnByb3RvdHlwZS5nZXROb2Rlc0luQ2x1c3Rlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNsdXN0ZXJpbmcuZ2V0Tm9kZXNJbkNsdXN0ZXIuYXBwbHkodGhpcy5jbHVzdGVyaW5nLGFyZ3VtZW50cyl9LG4ucHJvdG90eXBlLmNsdXN0ZXJCeUNvbm5lY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbHVzdGVyaW5nLmNsdXN0ZXJCeUNvbm5lY3Rpb24uYXBwbHkodGhpcy5jbHVzdGVyaW5nLGFyZ3VtZW50cyl9LG4ucHJvdG90eXBlLmNsdXN0ZXJCeUh1YnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbHVzdGVyaW5nLmNsdXN0ZXJCeUh1YnNpemUuYXBwbHkodGhpcy5jbHVzdGVyaW5nLGFyZ3VtZW50cyl9LG4ucHJvdG90eXBlLmNsdXN0ZXJPdXRsaWVycz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNsdXN0ZXJpbmcuY2x1c3Rlck91dGxpZXJzLmFwcGx5KHRoaXMuY2x1c3RlcmluZyxhcmd1bWVudHMpfSxuLnByb3RvdHlwZS5nZXRTZWVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5b3V0RW5naW5lLmdldFNlZWQuYXBwbHkodGhpcy5sYXlvdXRFbmdpbmUsYXJndW1lbnRzKX0sbi5wcm90b3R5cGUuZW5hYmxlRWRpdE1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYW5pcHVsYXRpb24uZW5hYmxlRWRpdE1vZGUuYXBwbHkodGhpcy5tYW5pcHVsYXRpb24sYXJndW1lbnRzKX0sbi5wcm90b3R5cGUuZGlzYWJsZUVkaXRNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFuaXB1bGF0aW9uLmRpc2FibGVFZGl0TW9kZS5hcHBseSh0aGlzLm1hbmlwdWxhdGlvbixhcmd1bWVudHMpfSxuLnByb3RvdHlwZS5hZGROb2RlTW9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1hbmlwdWxhdGlvbi5hZGROb2RlTW9kZS5hcHBseSh0aGlzLm1hbmlwdWxhdGlvbixhcmd1bWVudHMpfSxuLnByb3RvdHlwZS5lZGl0Tm9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1hbmlwdWxhdGlvbi5lZGl0Tm9kZS5hcHBseSh0aGlzLm1hbmlwdWxhdGlvbixhcmd1bWVudHMpfSxuLnByb3RvdHlwZS5lZGl0Tm9kZU1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS5sb2coIkRlcHJlY2F0ZWQ6IFBsZWFzZSB1c2UgZWRpdE5vZGUgaW5zdGVhZCBvZiBlZGl0Tm9kZU1vZGUuIiksdGhpcy5tYW5pcHVsYXRpb24uZWRpdE5vZGUuYXBwbHkodGhpcy5tYW5pcHVsYXRpb24sYXJndW1lbnRzKX0sbi5wcm90b3R5cGUuYWRkRWRnZU1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYW5pcHVsYXRpb24uYWRkRWRnZU1vZGUuYXBwbHkodGhpcy5tYW5pcHVsYXRpb24sYXJndW1lbnRzKX0sbi5wcm90b3R5cGUuZWRpdEVkZ2VNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFuaXB1bGF0aW9uLmVkaXRFZGdlTW9kZS5hcHBseSh0aGlzLm1hbmlwdWxhdGlvbixhcmd1bWVudHMpfSxuLnByb3RvdHlwZS5kZWxldGVTZWxlY3RlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1hbmlwdWxhdGlvbi5kZWxldGVTZWxlY3RlZC5hcHBseSh0aGlzLm1hbmlwdWxhdGlvbixhcmd1bWVudHMpfSxuLnByb3RvdHlwZS5nZXRQb3NpdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2Rlc0hhbmRsZXIuZ2V0UG9zaXRpb25zLmFwcGx5KHRoaXMubm9kZXNIYW5kbGVyLGFyZ3VtZW50cyl9LG4ucHJvdG90eXBlLnN0b3JlUG9zaXRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZXNIYW5kbGVyLnN0b3JlUG9zaXRpb25zLmFwcGx5KHRoaXMubm9kZXNIYW5kbGVyLGFyZ3VtZW50cyl9LG4ucHJvdG90eXBlLm1vdmVOb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZXNIYW5kbGVyLm1vdmVOb2RlLmFwcGx5KHRoaXMubm9kZXNIYW5kbGVyLGFyZ3VtZW50cyl9LG4ucHJvdG90eXBlLmdldEJvdW5kaW5nQm94PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZXNIYW5kbGVyLmdldEJvdW5kaW5nQm94LmFwcGx5KHRoaXMubm9kZXNIYW5kbGVyLGFyZ3VtZW50cyl9LG4ucHJvdG90eXBlLmdldENvbm5lY3RlZE5vZGVzPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10aGlzLmJvZHkubm9kZXNbdF0/dGhpcy5ub2Rlc0hhbmRsZXIuZ2V0Q29ubmVjdGVkTm9kZXMuYXBwbHkodGhpcy5ub2Rlc0hhbmRsZXIsYXJndW1lbnRzKTp0aGlzLmVkZ2VzSGFuZGxlci5nZXRDb25uZWN0ZWROb2Rlcy5hcHBseSh0aGlzLmVkZ2VzSGFuZGxlcixhcmd1bWVudHMpfSxuLnByb3RvdHlwZS5nZXRDb25uZWN0ZWRFZGdlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGVzSGFuZGxlci5nZXRDb25uZWN0ZWRFZGdlcy5hcHBseSh0aGlzLm5vZGVzSGFuZGxlcixhcmd1bWVudHMpfSxuLnByb3RvdHlwZS5zdGFydFNpbXVsYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5waHlzaWNzLnN0YXJ0U2ltdWxhdGlvbi5hcHBseSh0aGlzLnBoeXNpY3MsYXJndW1lbnRzKX0sbi5wcm90b3R5cGUuc3RvcFNpbXVsYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5waHlzaWNzLnN0b3BTaW11bGF0aW9uLmFwcGx5KHRoaXMucGh5c2ljcyxhcmd1bWVudHMpfSxuLnByb3RvdHlwZS5zdGFiaWxpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5waHlzaWNzLnN0YWJpbGl6ZS5hcHBseSh0aGlzLnBoeXNpY3MsYXJndW1lbnRzKX0sbi5wcm90b3R5cGUuZ2V0U2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9uSGFuZGxlci5nZXRTZWxlY3Rpb24uYXBwbHkodGhpcy5zZWxlY3Rpb25IYW5kbGVyLGFyZ3VtZW50cyl9LG4ucHJvdG90eXBlLnNldFNlbGVjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGlvbkhhbmRsZXIuc2V0U2VsZWN0aW9uLmFwcGx5KHRoaXMuc2VsZWN0aW9uSGFuZGxlcixhcmd1bWVudHMpfSxuLnByb3RvdHlwZS5nZXRTZWxlY3RlZE5vZGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9uSGFuZGxlci5nZXRTZWxlY3RlZE5vZGVzLmFwcGx5KHRoaXMuc2VsZWN0aW9uSGFuZGxlcixhcmd1bWVudHMpfSxuLnByb3RvdHlwZS5nZXRTZWxlY3RlZEVkZ2VzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9uSGFuZGxlci5nZXRTZWxlY3RlZEVkZ2VzLmFwcGx5KHRoaXMuc2VsZWN0aW9uSGFuZGxlcixhcmd1bWVudHMpfSxuLnByb3RvdHlwZS5nZXROb2RlQXQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnNlbGVjdGlvbkhhbmRsZXIuZ2V0Tm9kZUF0LmFwcGx5KHRoaXMuc2VsZWN0aW9uSGFuZGxlcixhcmd1bWVudHMpO3JldHVybiB2b2lkIDAhPT10JiZ2b2lkIDAhPT10LmlkP3QuaWQ6dH0sbi5wcm90b3R5cGUuZ2V0RWRnZUF0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldEVkZ2VBdC5hcHBseSh0aGlzLnNlbGVjdGlvbkhhbmRsZXIsYXJndW1lbnRzKTtyZXR1cm4gdm9pZCAwIT09dCYmdm9pZCAwIT09dC5pZD90LmlkOnR9LG4ucHJvdG90eXBlLnNlbGVjdE5vZGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9uSGFuZGxlci5zZWxlY3ROb2Rlcy5hcHBseSh0aGlzLnNlbGVjdGlvbkhhbmRsZXIsYXJndW1lbnRzKX0sbi5wcm90b3R5cGUuc2VsZWN0RWRnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb25IYW5kbGVyLnNlbGVjdEVkZ2VzLmFwcGx5KHRoaXMuc2VsZWN0aW9uSGFuZGxlcixhcmd1bWVudHMpfSxuLnByb3RvdHlwZS51bnNlbGVjdEFsbD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uSGFuZGxlci51bnNlbGVjdEFsbC5hcHBseSh0aGlzLnNlbGVjdGlvbkhhbmRsZXIsYXJndW1lbnRzKSx0aGlzLnJlZHJhdygpfSxuLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5yZWRyYXcuYXBwbHkodGhpcy5yZW5kZXJlcixhcmd1bWVudHMpfSxuLnByb3RvdHlwZS5nZXRTY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZXcuZ2V0U2NhbGUuYXBwbHkodGhpcy52aWV3LGFyZ3VtZW50cyl9LG4ucHJvdG90eXBlLmdldFZpZXdQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZXcuZ2V0Vmlld1Bvc2l0aW9uLmFwcGx5KHRoaXMudmlldyxhcmd1bWVudHMpfSxuLnByb3RvdHlwZS5maXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWV3LmZpdC5hcHBseSh0aGlzLnZpZXcsYXJndW1lbnRzKX0sbi5wcm90b3R5cGUubW92ZVRvPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlldy5tb3ZlVG8uYXBwbHkodGhpcy52aWV3LGFyZ3VtZW50cyl9LG4ucHJvdG90eXBlLmZvY3VzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlldy5mb2N1cy5hcHBseSh0aGlzLnZpZXcsYXJndW1lbnRzKX0sbi5wcm90b3R5cGUucmVsZWFzZU5vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWV3LnJlbGVhc2VOb2RlLmFwcGx5KHRoaXMudmlldyxhcmd1bWVudHMpfSxuLnByb3RvdHlwZS5nZXRPcHRpb25zRnJvbUNvbmZpZ3VyYXRvcj1mdW5jdGlvbigpe3ZhciB0PXt9O3JldHVybiB0aGlzLmNvbmZpZ3VyYXRvciYmKHQ9dGhpcy5jb25maWd1cmF0b3IuZ2V0T3B0aW9ucy5hcHBseSh0aGlzLmNvbmZpZ3VyYXRvcikpLHR9LHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxvJiZ0KGUsbyksZX19KCksbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7aSh0aGlzLHQpLHRoaXMuaW1hZ2VzPXt9LHRoaXMuaW1hZ2VCcm9rZW49e30sdGhpcy5jYWxsYmFjaz1lfXJldHVybiBvKHQsW3trZXk6Il9hZGRJbWFnZVRvQ2FjaGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7MD09PWUud2lkdGgmJihkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpLGUud2lkdGg9ZS5vZmZzZXRXaWR0aCxlLmhlaWdodD1lLm9mZnNldEhlaWdodCxkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpKSx0aGlzLmltYWdlc1t0XT1lfX0se2tleToiX3RyeWxvYWRCcm9rZW5VcmwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz10aGlzO3ZvaWQgMCE9PXQmJnZvaWQgMCE9PWUmJnZvaWQgMCE9PWkmJihpLm9uZXJyb3I9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJDb3VsZCBub3QgbG9hZCBicm9rZW5JbWFnZToiLGUpLG8uX2FkZEltYWdlVG9DYWNoZSh0LG5ldyBJbWFnZSl9LGkuc3JjPWUpfX0se2tleToiX3JlZHJhd1dpdGhJbWFnZSIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5jYWxsYmFjayYmdGhpcy5jYWxsYmFjayh0KX19LHtrZXk6ImxvYWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz10aGlzLG49dGhpcy5pbWFnZXNbdF07aWYobilyZXR1cm4gbjt2YXIgcz1uZXcgSW1hZ2U7cmV0dXJuIHMub25sb2FkPWZ1bmN0aW9uKCl7by5fYWRkSW1hZ2VUb0NhY2hlKHQscyksby5fcmVkcmF3V2l0aEltYWdlKHMpfSxzLm9uZXJyb3I9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJDb3VsZCBub3QgbG9hZCBpbWFnZToiLHQpLG8uX3RyeWxvYWRCcm9rZW5VcmwodCxlLHMpfSxzLnNyYz10LHN9fV0pLHR9KCk7ZS5kZWZhdWx0PW59LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBvJiYoby53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsby5rZXksbyl9fXJldHVybiBmdW5jdGlvbihlLGksbyl7cmV0dXJuIGkmJnQoZS5wcm90b3R5cGUsaSksbyYmdChlLG8pLGV9fSgpLHM9aSgxKSxyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe28odGhpcyx0KSx0aGlzLmNsZWFyKCksdGhpcy5kZWZhdWx0SW5kZXg9MCx0aGlzLmdyb3Vwc0FycmF5PVtdLHRoaXMuZ3JvdXBJbmRleD0wLHRoaXMuZGVmYXVsdEdyb3Vwcz1be2JvcmRlcjoiIzJCN0NFOSIsYmFja2dyb3VuZDoiIzk3QzJGQyIsaGlnaGxpZ2h0Ontib3JkZXI6IiMyQjdDRTkiLGJhY2tncm91bmQ6IiNEMkU1RkYifSxob3Zlcjp7Ym9yZGVyOiIjMkI3Q0U5IixiYWNrZ3JvdW5kOiIjRDJFNUZGIn19LHtib3JkZXI6IiNGRkE1MDAiLGJhY2tncm91bmQ6IiNGRkZGMDAiLGhpZ2hsaWdodDp7Ym9yZGVyOiIjRkZBNTAwIixiYWNrZ3JvdW5kOiIjRkZGRkEzIn0saG92ZXI6e2JvcmRlcjoiI0ZGQTUwMCIsYmFja2dyb3VuZDoiI0ZGRkZBMyJ9fSx7Ym9yZGVyOiIjRkEwQTEwIixiYWNrZ3JvdW5kOiIjRkI3RTgxIixoaWdobGlnaHQ6e2JvcmRlcjoiI0ZBMEExMCIsYmFja2dyb3VuZDoiI0ZGQUZCMSJ9LGhvdmVyOntib3JkZXI6IiNGQTBBMTAiLGJhY2tncm91bmQ6IiNGRkFGQjEifX0se2JvcmRlcjoiIzQxQTkwNiIsYmFja2dyb3VuZDoiIzdCRTE0MSIsaGlnaGxpZ2h0Ontib3JkZXI6IiM0MUE5MDYiLGJhY2tncm91bmQ6IiNBMUVDNzYifSxob3Zlcjp7Ym9yZGVyOiIjNDFBOTA2IixiYWNrZ3JvdW5kOiIjQTFFQzc2In19LHtib3JkZXI6IiNFMTI5RjAiLGJhY2tncm91bmQ6IiNFQjdERjQiLGhpZ2hsaWdodDp7Ym9yZGVyOiIjRTEyOUYwIixiYWNrZ3JvdW5kOiIjRjBCM0Y1In0saG92ZXI6e2JvcmRlcjoiI0UxMjlGMCIsYmFja2dyb3VuZDoiI0YwQjNGNSJ9fSx7Ym9yZGVyOiIjN0MyOUYwIixiYWNrZ3JvdW5kOiIjQUQ4NUU0IixoaWdobGlnaHQ6e2JvcmRlcjoiIzdDMjlGMCIsYmFja2dyb3VuZDoiI0QzQkRGMCJ9LGhvdmVyOntib3JkZXI6IiM3QzI5RjAiLGJhY2tncm91bmQ6IiNEM0JERjAifX0se2JvcmRlcjoiI0MzN0YwMCIsYmFja2dyb3VuZDoiI0ZGQTgwNyIsaGlnaGxpZ2h0Ontib3JkZXI6IiNDMzdGMDAiLGJhY2tncm91bmQ6IiNGRkNBNjYifSxob3Zlcjp7Ym9yZGVyOiIjQzM3RjAwIixiYWNrZ3JvdW5kOiIjRkZDQTY2In19LHtib3JkZXI6IiM0MjIwRkIiLGJhY2tncm91bmQ6IiM2RTZFRkQiLGhpZ2hsaWdodDp7Ym9yZGVyOiIjNDIyMEZCIixiYWNrZ3JvdW5kOiIjOUI5QkZEIn0saG92ZXI6e2JvcmRlcjoiIzQyMjBGQiIsYmFja2dyb3VuZDoiIzlCOUJGRCJ9fSx7Ym9yZGVyOiIjRkQ1QTc3IixiYWNrZ3JvdW5kOiIjRkZDMENCIixoaWdobGlnaHQ6e2JvcmRlcjoiI0ZENUE3NyIsYmFja2dyb3VuZDoiI0ZGRDFEOSJ9LGhvdmVyOntib3JkZXI6IiNGRDVBNzciLGJhY2tncm91bmQ6IiNGRkQxRDkifX0se2JvcmRlcjoiIzRBRDYzQSIsYmFja2dyb3VuZDoiI0MyRkFCQyIsaGlnaGxpZ2h0Ontib3JkZXI6IiM0QUQ2M0EiLGJhY2tncm91bmQ6IiNFNkZGRTMifSxob3Zlcjp7Ym9yZGVyOiIjNEFENjNBIixiYWNrZ3JvdW5kOiIjRTZGRkUzIn19LHtib3JkZXI6IiM5OTAwMDAiLGJhY2tncm91bmQ6IiNFRTAwMDAiLGhpZ2hsaWdodDp7Ym9yZGVyOiIjQkIwMDAwIixiYWNrZ3JvdW5kOiIjRkYzMzMzIn0saG92ZXI6e2JvcmRlcjoiI0JCMDAwMCIsYmFja2dyb3VuZDoiI0ZGMzMzMyJ9fSx7Ym9yZGVyOiIjRkY2MDAwIixiYWNrZ3JvdW5kOiIjRkY2MDAwIixoaWdobGlnaHQ6e2JvcmRlcjoiI0ZGNjAwMCIsYmFja2dyb3VuZDoiI0ZGNjAwMCJ9LGhvdmVyOntib3JkZXI6IiNGRjYwMDAiLGJhY2tncm91bmQ6IiNGRjYwMDAifX0se2JvcmRlcjoiIzk3QzJGQyIsYmFja2dyb3VuZDoiIzJCN0NFOSIsaGlnaGxpZ2h0Ontib3JkZXI6IiNEMkU1RkYiLGJhY2tncm91bmQ6IiMyQjdDRTkifSxob3Zlcjp7Ym9yZGVyOiIjRDJFNUZGIixiYWNrZ3JvdW5kOiIjMkI3Q0U5In19LHtib3JkZXI6IiMzOTk2MDUiLGJhY2tncm91bmQ6IiMyNTVDMDMiLGhpZ2hsaWdodDp7Ym9yZGVyOiIjMzk5NjA1IixiYWNrZ3JvdW5kOiIjMjU1QzAzIn0saG92ZXI6e2JvcmRlcjoiIzM5OTYwNSIsYmFja2dyb3VuZDoiIzI1NUMwMyJ9fSx7Ym9yZGVyOiIjQjcwMDU0IixiYWNrZ3JvdW5kOiIjRkYwMDdFIixoaWdobGlnaHQ6e2JvcmRlcjoiI0I3MDA1NCIsYmFja2dyb3VuZDoiI0ZGMDA3RSJ9LGhvdmVyOntib3JkZXI6IiNCNzAwNTQiLGJhY2tncm91bmQ6IiNGRjAwN0UifX0se2JvcmRlcjoiI0FEODVFNCIsYmFja2dyb3VuZDoiIzdDMjlGMCIsaGlnaGxpZ2h0Ontib3JkZXI6IiNEM0JERjAiLGJhY2tncm91bmQ6IiM3QzI5RjAifSxob3Zlcjp7Ym9yZGVyOiIjRDNCREYwIixiYWNrZ3JvdW5kOiIjN0MyOUYwIn19LHtib3JkZXI6IiM0NTU3RkEiLGJhY2tncm91bmQ6IiMwMDBFQTEiLGhpZ2hsaWdodDp7Ym9yZGVyOiIjNkU2RUZEIixiYWNrZ3JvdW5kOiIjMDAwRUExIn0saG92ZXI6e2JvcmRlcjoiIzZFNkVGRCIsYmFja2dyb3VuZDoiIzAwMEVBMSJ9fSx7Ym9yZGVyOiIjRkZDMENCIixiYWNrZ3JvdW5kOiIjRkQ1QTc3IixoaWdobGlnaHQ6e2JvcmRlcjoiI0ZGRDFEOSIsYmFja2dyb3VuZDoiI0ZENUE3NyJ9LGhvdmVyOntib3JkZXI6IiNGRkQxRDkiLGJhY2tncm91bmQ6IiNGRDVBNzcifX0se2JvcmRlcjoiI0MyRkFCQyIsYmFja2dyb3VuZDoiIzc0RDY2QSIsaGlnaGxpZ2h0Ontib3JkZXI6IiNFNkZGRTMiLGJhY2tncm91bmQ6IiM3NEQ2NkEifSxob3Zlcjp7Ym9yZGVyOiIjRTZGRkUzIixiYWNrZ3JvdW5kOiIjNzRENjZBIn19LHtib3JkZXI6IiNFRTAwMDAiLGJhY2tncm91bmQ6IiM5OTAwMDAiLGhpZ2hsaWdodDp7Ym9yZGVyOiIjRkYzMzMzIixiYWNrZ3JvdW5kOiIjQkIwMDAwIn0saG92ZXI6e2JvcmRlcjoiI0ZGMzMzMyIsYmFja2dyb3VuZDoiI0JCMDAwMCJ9fV0sdGhpcy5vcHRpb25zPXt9LHRoaXMuZGVmYXVsdE9wdGlvbnM9e3VzZURlZmF1bHRHcm91cHM6ITB9LHMuZXh0ZW5kKHRoaXMub3B0aW9ucyx0aGlzLmRlZmF1bHRPcHRpb25zKX1yZXR1cm4gbih0LFt7a2V5OiJzZXRPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1bInVzZURlZmF1bHRHcm91cHMiXTtpZih2b2lkIDAhPT10KWZvcih2YXIgaSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoaSkmJmUuaW5kZXhPZihpKT09PS0xKXt2YXIgbz10W2ldO3RoaXMuYWRkKGksbyl9fX0se2tleToiY2xlYXIiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5ncm91cHM9e30sdGhpcy5ncm91cHNBcnJheT1bXX19LHtrZXk6ImdldCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ncm91cHNbdF07aWYodm9pZCAwPT09ZSlpZih0aGlzLm9wdGlvbnMudXNlRGVmYXVsdEdyb3Vwcz09PSExJiZ0aGlzLmdyb3Vwc0FycmF5Lmxlbmd0aD4wKXt2YXIgaT10aGlzLmdyb3VwSW5kZXgldGhpcy5ncm91cHNBcnJheS5sZW5ndGg7dGhpcy5ncm91cEluZGV4KyssZT17fSxlLmNvbG9yPXRoaXMuZ3JvdXBzW3RoaXMuZ3JvdXBzQXJyYXlbaV1dLHRoaXMuZ3JvdXBzW3RdPWV9ZWxzZXt2YXIgbz10aGlzLmRlZmF1bHRJbmRleCV0aGlzLmRlZmF1bHRHcm91cHMubGVuZ3RoO3RoaXMuZGVmYXVsdEluZGV4KyssZT17fSxlLmNvbG9yPXRoaXMuZGVmYXVsdEdyb3Vwc1tvXSx0aGlzLmdyb3Vwc1t0XT1lfXJldHVybiBlfX0se2tleToiYWRkIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmdyb3Vwc1t0XT1lLHRoaXMuZ3JvdXBzQXJyYXkucHVzaCh0KSxlfX1dKSx0fSgpO2UuZGVmYXVsdD1yfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG8pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG8mJnQoZSxvKSxlfX0oKSxyPWkoNjcpLGE9byhyKSxoPWkoNjgpLGQ9byhoKSxsPWkoMSksYz1pKDkpLHU9aSgxMSkscD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxpLG8scyl7dmFyIHI9dGhpcztuKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5pbWFnZXM9aSx0aGlzLmdyb3Vwcz1vLHRoaXMubGF5b3V0RW5naW5lPXMsdGhpcy5ib2R5LmZ1bmN0aW9ucy5jcmVhdGVOb2RlPXRoaXMuY3JlYXRlLmJpbmQodGhpcyksdGhpcy5ub2Rlc0xpc3RlbmVycz17YWRkOmZ1bmN0aW9uKHQsZSl7ci5hZGQoZS5pdGVtcyl9LHVwZGF0ZTpmdW5jdGlvbih0LGUpe3IudXBkYXRlKGUuaXRlbXMsZS5kYXRhKX0scmVtb3ZlOmZ1bmN0aW9uKHQsZSl7ci5yZW1vdmUoZS5pdGVtcyl9fSx0aGlzLm9wdGlvbnM9e30sdGhpcy5kZWZhdWx0T3B0aW9ucz17Ym9yZGVyV2lkdGg6MSxib3JkZXJXaWR0aFNlbGVjdGVkOjIsYnJva2VuSW1hZ2U6dm9pZCAwLGNvbG9yOntib3JkZXI6IiMyQjdDRTkiLGJhY2tncm91bmQ6IiM5N0MyRkMiLGhpZ2hsaWdodDp7Ym9yZGVyOiIjMkI3Q0U5IixiYWNrZ3JvdW5kOiIjRDJFNUZGIn0saG92ZXI6e2JvcmRlcjoiIzJCN0NFOSIsYmFja2dyb3VuZDoiI0QyRTVGRiJ9fSxmaXhlZDp7eDohMSx5OiExfSxmb250Ontjb2xvcjoiIzM0MzQzNCIsc2l6ZToxNCxmYWNlOiJhcmlhbCIsYmFja2dyb3VuZDoibm9uZSIsc3Ryb2tlV2lkdGg6MCxzdHJva2VDb2xvcjoiI2ZmZmZmZiIsYWxpZ246ImNlbnRlciJ9LGdyb3VwOnZvaWQgMCxoaWRkZW46ITEsaWNvbjp7ZmFjZToiRm9udEF3ZXNvbWUiLGNvZGU6dm9pZCAwLHNpemU6NTAsY29sb3I6IiMyQjdDRTkifSxpbWFnZTp2b2lkIDAsbGFiZWw6dm9pZCAwLGxhYmVsSGlnaGxpZ2h0Qm9sZDohMCxsZXZlbDp2b2lkIDAsbWFzczoxLHBoeXNpY3M6ITAsc2NhbGluZzp7bWluOjEwLG1heDozMCxsYWJlbDp7ZW5hYmxlZDohMSxtaW46MTQsbWF4OjMwLG1heFZpc2libGU6MzAsZHJhd1RocmVzaG9sZDo1fSxjdXN0b21TY2FsaW5nRnVuY3Rpb246ZnVuY3Rpb24odCxlLGksbyl7aWYoZT09PXQpcmV0dXJuLjU7dmFyIG49MS8oZS10KTtyZXR1cm4gTWF0aC5tYXgoMCwoby10KSpuKX19LHNoYWRvdzp7ZW5hYmxlZDohMSxjb2xvcjoicmdiYSgwLDAsMCwwLjUpIixzaXplOjEwLHg6NSx5OjV9LHNoYXBlOiJlbGxpcHNlIixzaGFwZVByb3BlcnRpZXM6e2JvcmRlckRhc2hlczohMSxib3JkZXJSYWRpdXM6NixpbnRlcnBvbGF0aW9uOiEwLHVzZUltYWdlU2l6ZTohMSx1c2VCb3JkZXJXaXRoSW1hZ2U6ITF9LHNpemU6MjUsdGl0bGU6dm9pZCAwLHZhbHVlOnZvaWQgMCx4OnZvaWQgMCx5OnZvaWQgMH0sbC5leHRlbmQodGhpcy5vcHRpb25zLHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMuYmluZEV2ZW50TGlzdGVuZXJzKCl9cmV0dXJuIHModCxbe2tleToiYmluZEV2ZW50TGlzdGVuZXJzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5ib2R5LmVtaXR0ZXIub24oInJlZnJlc2hOb2RlcyIsdGhpcy5yZWZyZXNoLmJpbmQodGhpcykpLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJyZWZyZXNoIix0aGlzLnJlZnJlc2guYmluZCh0aGlzKSksdGhpcy5ib2R5LmVtaXR0ZXIub24oImRlc3Ryb3kiLGZ1bmN0aW9uKCl7bC5mb3JFYWNoKHQubm9kZXNMaXN0ZW5lcnMsZnVuY3Rpb24oZSxpKXt0LmJvZHkuZGF0YS5ub2RlcyYmdC5ib2R5LmRhdGEubm9kZXMub2ZmKGksZSl9KSxkZWxldGUgdC5ib2R5LmZ1bmN0aW9ucy5jcmVhdGVOb2RlLGRlbGV0ZSB0Lm5vZGVzTGlzdGVuZXJzLmFkZCxkZWxldGUgdC5ub2Rlc0xpc3RlbmVycy51cGRhdGUsZGVsZXRlIHQubm9kZXNMaXN0ZW5lcnMucmVtb3ZlLGRlbGV0ZSB0Lm5vZGVzTGlzdGVuZXJzfSl9fSx7a2V5OiJzZXRPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0KXtpZih2b2lkIDAhPT10KXtpZihhLmRlZmF1bHQucGFyc2VPcHRpb25zKHRoaXMub3B0aW9ucyx0KSx2b2lkIDAhPT10LnNoYXBlKWZvcih2YXIgZSBpbiB0aGlzLmJvZHkubm9kZXMpdGhpcy5ib2R5Lm5vZGVzLmhhc093blByb3BlcnR5KGUpJiZ0aGlzLmJvZHkubm9kZXNbZV0udXBkYXRlU2hhcGUoKTtpZih2b2lkIDAhPT10LmZvbnQpe2QuZGVmYXVsdC5wYXJzZU9wdGlvbnModGhpcy5vcHRpb25zLmZvbnQsdCk7Zm9yKHZhciBpIGluIHRoaXMuYm9keS5ub2Rlcyl0aGlzLmJvZHkubm9kZXMuaGFzT3duUHJvcGVydHkoaSkmJih0aGlzLmJvZHkubm9kZXNbaV0udXBkYXRlTGFiZWxNb2R1bGUoKSx0aGlzLmJvZHkubm9kZXNbaV0uX3Jlc2V0KCkpfWlmKHZvaWQgMCE9PXQuc2l6ZSlmb3IodmFyIG8gaW4gdGhpcy5ib2R5Lm5vZGVzKXRoaXMuYm9keS5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShvKSYmdGhpcy5ib2R5Lm5vZGVzW29dLl9yZXNldCgpO3ZvaWQgMD09PXQuaGlkZGVuJiZ2b2lkIDA9PT10LnBoeXNpY3N8fHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9kYXRhQ2hhbmdlZCIpfX19LHtrZXk6InNldERhdGEiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsaT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdLG89dGhpcy5ib2R5LmRhdGEubm9kZXM7aWYodCBpbnN0YW5jZW9mIGN8fHQgaW5zdGFuY2VvZiB1KXRoaXMuYm9keS5kYXRhLm5vZGVzPXQ7ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpKXRoaXMuYm9keS5kYXRhLm5vZGVzPW5ldyBjLHRoaXMuYm9keS5kYXRhLm5vZGVzLmFkZCh0KTtlbHNle2lmKHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgb3IgRGF0YVNldCBleHBlY3RlZCIpO3RoaXMuYm9keS5kYXRhLm5vZGVzPW5ldyBjfW8mJmwuZm9yRWFjaCh0aGlzLm5vZGVzTGlzdGVuZXJzLGZ1bmN0aW9uKHQsZSl7by5vZmYoZSx0KX0pLHRoaXMuYm9keS5ub2Rlcz17fSx0aGlzLmJvZHkuZGF0YS5ub2RlcyYmIWZ1bmN0aW9uKCl7dmFyIHQ9ZTtsLmZvckVhY2goZS5ub2Rlc0xpc3RlbmVycyxmdW5jdGlvbihlLGkpe3QuYm9keS5kYXRhLm5vZGVzLm9uKGksZSl9KTt2YXIgaT1lLmJvZHkuZGF0YS5ub2Rlcy5nZXRJZHMoKTtlLmFkZChpLCEwKX0oKSxpPT09ITEmJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9kYXRhQ2hhbmdlZCIpfX0se2tleToiYWRkIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSxpPXZvaWQgMCxvPVtdLG49MDtuPHQubGVuZ3RoO24rKyl7aT10W25dO3ZhciBzPXRoaXMuYm9keS5kYXRhLm5vZGVzLmdldChpKSxyPXRoaXMuY3JlYXRlKHMpO28ucHVzaChyKSx0aGlzLmJvZHkubm9kZXNbaV09cn10aGlzLmxheW91dEVuZ2luZS5wb3NpdGlvbkluaXRpYWxseShvKSxlPT09ITEmJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9kYXRhQ2hhbmdlZCIpfX0se2tleToidXBkYXRlIix2YWx1ZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaT10aGlzLmJvZHkubm9kZXMsbz0hMSxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBzPXRbbl0scj1pW3NdLGE9ZVtuXTt2b2lkIDAhPT1yP289ci5zZXRPcHRpb25zKGEpOihvPSEwLHI9dGhpcy5jcmVhdGUoYSksaVtzXT1yKX1vPT09ITA/dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX2RhdGFDaGFuZ2VkIik6dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX2RhdGFVcGRhdGVkIil9fSx7a2V5OiJyZW1vdmUiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmJvZHkubm9kZXMsaT0wO2k8dC5sZW5ndGg7aSsrKXt2YXIgbz10W2ldO2RlbGV0ZSBlW29dfXRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9kYXRhQ2hhbmdlZCIpfX0se2tleToiY3JlYXRlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06YS5kZWZhdWx0O3JldHVybiBuZXcgZSh0LHRoaXMuYm9keSx0aGlzLmltYWdlcyx0aGlzLmdyb3Vwcyx0aGlzLm9wdGlvbnMpfX0se2tleToicmVmcmVzaCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdLGU9dGhpcy5ib2R5Lm5vZGVzO2Zvcih2YXIgaSBpbiBlKXt2YXIgbz12b2lkIDA7ZS5oYXNPd25Qcm9wZXJ0eShpKSYmKG89ZVtpXSk7dmFyIG49dGhpcy5ib2R5LmRhdGEubm9kZXMuX2RhdGFbaV07dm9pZCAwIT09byYmdm9pZCAwIT09biYmKHQ9PT0hMCYmby5zZXRPcHRpb25zKHt4Om51bGwseTpudWxsfSksby5zZXRPcHRpb25zKHtmaXhlZDohMX0pLG8uc2V0T3B0aW9ucyhuKSl9fX0se2tleToiZ2V0UG9zaXRpb25zIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT17fTtpZih2b2lkIDAhPT10KXtpZihBcnJheS5pc0FycmF5KHQpPT09ITApe2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKWlmKHZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1t0W2ldXSl7dmFyIG89dGhpcy5ib2R5Lm5vZGVzW3RbaV1dO2VbdFtpXV09e3g6TWF0aC5yb3VuZChvLngpLHk6TWF0aC5yb3VuZChvLnkpfX19ZWxzZSBpZih2b2lkIDAhPT10aGlzLmJvZHkubm9kZXNbdF0pe3ZhciBuPXRoaXMuYm9keS5ub2Rlc1t0XTtlW3RdPXt4Ok1hdGgucm91bmQobi54KSx5Ok1hdGgucm91bmQobi55KQp9fX1lbHNlIGZvcih2YXIgcz0wO3M8dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLmxlbmd0aDtzKyspe3ZhciByPXRoaXMuYm9keS5ub2Rlc1t0aGlzLmJvZHkubm9kZUluZGljZXNbc11dO2VbdGhpcy5ib2R5Lm5vZGVJbmRpY2VzW3NdXT17eDpNYXRoLnJvdW5kKHIueCkseTpNYXRoLnJvdW5kKHIueSl9fXJldHVybiBlfX0se2tleToic3RvcmVQb3NpdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9W10sZT10aGlzLmJvZHkuZGF0YS5ub2Rlcy5nZXREYXRhU2V0KCk7Zm9yKHZhciBpIGluIGUuX2RhdGEpaWYoZS5fZGF0YS5oYXNPd25Qcm9wZXJ0eShpKSl7dmFyIG89dGhpcy5ib2R5Lm5vZGVzW2ldO2UuX2RhdGFbaV0ueD09TWF0aC5yb3VuZChvLngpJiZlLl9kYXRhW2ldLnk9PU1hdGgucm91bmQoby55KXx8dC5wdXNoKHtpZDpvLmlkLHg6TWF0aC5yb3VuZChvLngpLHk6TWF0aC5yb3VuZChvLnkpfSl9ZS51cGRhdGUodCl9fSx7a2V5OiJnZXRCb3VuZGluZ0JveCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09dGhpcy5ib2R5Lm5vZGVzW3RdKXJldHVybiB0aGlzLmJvZHkubm9kZXNbdF0uc2hhcGUuYm91bmRpbmdCb3h9fSx7a2V5OiJnZXRDb25uZWN0ZWROb2RlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9W107aWYodm9pZCAwIT09dGhpcy5ib2R5Lm5vZGVzW3RdKWZvcih2YXIgaT10aGlzLmJvZHkubm9kZXNbdF0sbz17fSxuPTA7bjxpLmVkZ2VzLmxlbmd0aDtuKyspe3ZhciBzPWkuZWRnZXNbbl07cy50b0lkPT1pLmlkP3ZvaWQgMD09PW9bcy5mcm9tSWRdJiYoZS5wdXNoKHMuZnJvbUlkKSxvW3MuZnJvbUlkXT0hMCk6cy5mcm9tSWQ9PWkuaWQmJnZvaWQgMD09PW9bcy50b0lkXSYmKGUucHVzaChzLnRvSWQpLG9bcy50b0lkXT0hMCl9cmV0dXJuIGV9fSx7a2V5OiJnZXRDb25uZWN0ZWRFZGdlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9W107aWYodm9pZCAwIT09dGhpcy5ib2R5Lm5vZGVzW3RdKWZvcih2YXIgaT10aGlzLmJvZHkubm9kZXNbdF0sbz0wO288aS5lZGdlcy5sZW5ndGg7bysrKWUucHVzaChpLmVkZ2VzW29dLmlkKTtlbHNlIGNvbnNvbGUubG9nKCJOb2RlSWQgcHJvdmlkZWQgZm9yIGdldENvbm5lY3RlZEVkZ2VzIGRvZXMgbm90IGV4aXN0LiBQcm92aWRlZDogIix0KTtyZXR1cm4gZX19LHtrZXk6Im1vdmVOb2RlIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dmFyIG89dGhpczt2b2lkIDAhPT10aGlzLmJvZHkubm9kZXNbdF0/KHRoaXMuYm9keS5ub2Rlc1t0XS54PU51bWJlcihlKSx0aGlzLmJvZHkubm9kZXNbdF0ueT1OdW1iZXIoaSksc2V0VGltZW91dChmdW5jdGlvbigpe28uYm9keS5lbWl0dGVyLmVtaXQoInN0YXJ0U2ltdWxhdGlvbiIpfSwwKSk6Y29uc29sZS5sb2coIk5vZGUgaWQgc3VwcGxpZWQgdG8gbW92ZU5vZGUgZG9lcyBub3QgZXhpc3QuIFByb3ZpZGVkOiAiLHQpfX1dKSx0fSgpO2UuZGVmYXVsdD1wfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG8pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG8mJnQoZSxvKSxlfX0oKSxyPWkoNjgpLGE9byhyKSxoPWkoNjkpLGQ9byhoKSxsPWkoNzEpLGM9byhsKSx1PWkoNzMpLHA9byh1KSxmPWkoNzQpLG09byhmKSx2PWkoNzUpLGc9byh2KSx5PWkoNzcpLGI9byh5KSxfPWkoNzgpLHc9byhfKSx4PWkoNzkpLGs9byh4KSxPPWkoODApLEQ9byhPKSxTPWkoODEpLEM9byhTKSxUPWkoODIpLEU9byhUKSxNPWkoODMpLFA9byhNKSxJPWkoODQpLE49byhJKSxSPWkoODUpLEw9byhSKSx6PWkoMzEpLEE9KG8oeiksaSgxKSksQj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxpLG8scyxyKXtuKHRoaXMsdCksdGhpcy5vcHRpb25zPUEuYnJpZGdlT2JqZWN0KHIpLHRoaXMuZ2xvYmFsT3B0aW9ucz1yLHRoaXMuYm9keT1pLHRoaXMuZWRnZXM9W10sdGhpcy5pZD12b2lkIDAsdGhpcy5pbWFnZWxpc3Q9byx0aGlzLmdyb3VwbGlzdD1zLHRoaXMueD12b2lkIDAsdGhpcy55PXZvaWQgMCx0aGlzLmJhc2VTaXplPXRoaXMub3B0aW9ucy5zaXplLHRoaXMuYmFzZUZvbnRTaXplPXRoaXMub3B0aW9ucy5mb250LnNpemUsdGhpcy5wcmVkZWZpbmVkUG9zaXRpb249ITEsdGhpcy5zZWxlY3RlZD0hMSx0aGlzLmhvdmVyPSExLHRoaXMubGFiZWxNb2R1bGU9bmV3IGEuZGVmYXVsdCh0aGlzLmJvZHksdGhpcy5vcHRpb25zLCExKSx0aGlzLnNldE9wdGlvbnMoZSl9cmV0dXJuIHModCxbe2tleToiYXR0YWNoRWRnZSIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5lZGdlcy5pbmRleE9mKHQpPT09LTEmJnRoaXMuZWRnZXMucHVzaCh0KX19LHtrZXk6ImRldGFjaEVkZ2UiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZWRnZXMuaW5kZXhPZih0KTtlIT0tMSYmdGhpcy5lZGdlcy5zcGxpY2UoZSwxKX19LHtrZXk6InNldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBpPXRoaXMub3B0aW9ucy5zaGFwZTtpZihlKXtpZih2b2lkIDAhPT1lLmlkJiYodGhpcy5pZD1lLmlkKSx2b2lkIDA9PT10aGlzLmlkKXRocm93Ik5vZGUgbXVzdCBoYXZlIGFuIGlkIjtpZih2b2lkIDAhPT1lLngmJihudWxsPT09ZS54Pyh0aGlzLng9dm9pZCAwLHRoaXMucHJlZGVmaW5lZFBvc2l0aW9uPSExKToodGhpcy54PXBhcnNlSW50KGUueCksdGhpcy5wcmVkZWZpbmVkUG9zaXRpb249ITApKSx2b2lkIDAhPT1lLnkmJihudWxsPT09ZS55Pyh0aGlzLnk9dm9pZCAwLHRoaXMucHJlZGVmaW5lZFBvc2l0aW9uPSExKToodGhpcy55PXBhcnNlSW50KGUueSksdGhpcy5wcmVkZWZpbmVkUG9zaXRpb249ITApKSx2b2lkIDAhPT1lLnNpemUmJih0aGlzLmJhc2VTaXplPWUuc2l6ZSksdm9pZCAwIT09ZS52YWx1ZSYmKGUudmFsdWU9cGFyc2VGbG9hdChlLnZhbHVlKSksIm51bWJlciI9PXR5cGVvZiBlLmdyb3VwfHwic3RyaW5nIj09dHlwZW9mIGUuZ3JvdXAmJiIiIT1lLmdyb3VwKXt2YXIgbz10aGlzLmdyb3VwbGlzdC5nZXQoZS5ncm91cCk7QS5kZWVwRXh0ZW5kKHRoaXMub3B0aW9ucyxvKSx0aGlzLm9wdGlvbnMuY29sb3I9QS5wYXJzZUNvbG9yKHRoaXMub3B0aW9ucy5jb2xvcil9aWYodC5wYXJzZU9wdGlvbnModGhpcy5vcHRpb25zLGUsITAsdGhpcy5nbG9iYWxPcHRpb25zKSx2b2lkIDAhPT10aGlzLm9wdGlvbnMuaW1hZ2Upe2lmKCF0aGlzLmltYWdlbGlzdCl0aHJvdyJObyBpbWFnZWxpc3QgcHJvdmlkZWQiO3RoaXMuaW1hZ2VPYmo9dGhpcy5pbWFnZWxpc3QubG9hZCh0aGlzLm9wdGlvbnMuaW1hZ2UsdGhpcy5vcHRpb25zLmJyb2tlbkltYWdlLHRoaXMuaWQpfXJldHVybiB0aGlzLnVwZGF0ZUxhYmVsTW9kdWxlKCksdGhpcy51cGRhdGVTaGFwZShpKSx2b2lkIDAhPT1lLmhpZGRlbnx8dm9pZCAwIT09ZS5waHlzaWNzfX19LHtrZXk6InVwZGF0ZUxhYmVsTW9kdWxlIix2YWx1ZTpmdW5jdGlvbigpe3ZvaWQgMCE9PXRoaXMub3B0aW9ucy5sYWJlbCYmbnVsbCE9PXRoaXMub3B0aW9ucy5sYWJlbHx8KHRoaXMub3B0aW9ucy5sYWJlbD0iIiksdGhpcy5sYWJlbE1vZHVsZS5zZXRPcHRpb25zKHRoaXMub3B0aW9ucywhMCksdm9pZCAwIT09dGhpcy5sYWJlbE1vZHVsZS5iYXNlU2l6ZSYmKHRoaXMuYmFzZUZvbnRTaXplPXRoaXMubGFiZWxNb2R1bGUuYmFzZVNpemUpfX0se2tleToidXBkYXRlU2hhcGUiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHQ9PT10aGlzLm9wdGlvbnMuc2hhcGUmJnRoaXMuc2hhcGUpdGhpcy5zaGFwZS5zZXRPcHRpb25zKHRoaXMub3B0aW9ucyx0aGlzLmltYWdlT2JqKTtlbHNlIHN3aXRjaCh0aGlzLm9wdGlvbnMuc2hhcGUpe2Nhc2UiYm94Ijp0aGlzLnNoYXBlPW5ldyBkLmRlZmF1bHQodGhpcy5vcHRpb25zLHRoaXMuYm9keSx0aGlzLmxhYmVsTW9kdWxlKTticmVhaztjYXNlImNpcmNsZSI6dGhpcy5zaGFwZT1uZXcgYy5kZWZhdWx0KHRoaXMub3B0aW9ucyx0aGlzLmJvZHksdGhpcy5sYWJlbE1vZHVsZSk7YnJlYWs7Y2FzZSJjaXJjdWxhckltYWdlIjp0aGlzLnNoYXBlPW5ldyBwLmRlZmF1bHQodGhpcy5vcHRpb25zLHRoaXMuYm9keSx0aGlzLmxhYmVsTW9kdWxlLHRoaXMuaW1hZ2VPYmopO2JyZWFrO2Nhc2UiZGF0YWJhc2UiOnRoaXMuc2hhcGU9bmV3IG0uZGVmYXVsdCh0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpO2JyZWFrO2Nhc2UiZGlhbW9uZCI6dGhpcy5zaGFwZT1uZXcgZy5kZWZhdWx0KHRoaXMub3B0aW9ucyx0aGlzLmJvZHksdGhpcy5sYWJlbE1vZHVsZSk7YnJlYWs7Y2FzZSJkb3QiOnRoaXMuc2hhcGU9bmV3IGIuZGVmYXVsdCh0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpO2JyZWFrO2Nhc2UiZWxsaXBzZSI6dGhpcy5zaGFwZT1uZXcgdy5kZWZhdWx0KHRoaXMub3B0aW9ucyx0aGlzLmJvZHksdGhpcy5sYWJlbE1vZHVsZSk7YnJlYWs7Y2FzZSJpY29uIjp0aGlzLnNoYXBlPW5ldyBrLmRlZmF1bHQodGhpcy5vcHRpb25zLHRoaXMuYm9keSx0aGlzLmxhYmVsTW9kdWxlKTticmVhaztjYXNlImltYWdlIjp0aGlzLnNoYXBlPW5ldyBELmRlZmF1bHQodGhpcy5vcHRpb25zLHRoaXMuYm9keSx0aGlzLmxhYmVsTW9kdWxlLHRoaXMuaW1hZ2VPYmopO2JyZWFrO2Nhc2Uic3F1YXJlIjp0aGlzLnNoYXBlPW5ldyBDLmRlZmF1bHQodGhpcy5vcHRpb25zLHRoaXMuYm9keSx0aGlzLmxhYmVsTW9kdWxlKTticmVhaztjYXNlInN0YXIiOnRoaXMuc2hhcGU9bmV3IEUuZGVmYXVsdCh0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpO2JyZWFrO2Nhc2UidGV4dCI6dGhpcy5zaGFwZT1uZXcgUC5kZWZhdWx0KHRoaXMub3B0aW9ucyx0aGlzLmJvZHksdGhpcy5sYWJlbE1vZHVsZSk7YnJlYWs7Y2FzZSJ0cmlhbmdsZSI6dGhpcy5zaGFwZT1uZXcgTi5kZWZhdWx0KHRoaXMub3B0aW9ucyx0aGlzLmJvZHksdGhpcy5sYWJlbE1vZHVsZSk7YnJlYWs7Y2FzZSJ0cmlhbmdsZURvd24iOnRoaXMuc2hhcGU9bmV3IEwuZGVmYXVsdCh0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpO2JyZWFrO2RlZmF1bHQ6dGhpcy5zaGFwZT1uZXcgdy5kZWZhdWx0KHRoaXMub3B0aW9ucyx0aGlzLmJvZHksdGhpcy5sYWJlbE1vZHVsZSl9dGhpcy5fcmVzZXQoKX19LHtrZXk6InNlbGVjdCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkPSEwLHRoaXMuX3Jlc2V0KCl9fSx7a2V5OiJ1bnNlbGVjdCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkPSExLHRoaXMuX3Jlc2V0KCl9fSx7a2V5OiJfcmVzZXQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5zaGFwZS53aWR0aD12b2lkIDAsdGhpcy5zaGFwZS5oZWlnaHQ9dm9pZCAwfX0se2tleToiZ2V0VGl0bGUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy50aXRsZX19LHtrZXk6ImRpc3RhbmNlVG9Cb3JkZXIiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuc2hhcGUuZGlzdGFuY2VUb0JvcmRlcih0LGUpfX0se2tleToiaXNGaXhlZCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLmZpeGVkLngmJnRoaXMub3B0aW9ucy5maXhlZC55fX0se2tleToiaXNTZWxlY3RlZCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3RlZH19LHtrZXk6ImdldFZhbHVlIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudmFsdWV9fSx7a2V5OiJzZXRWYWx1ZVJhbmdlIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7aWYodm9pZCAwIT09dGhpcy5vcHRpb25zLnZhbHVlKXt2YXIgbz10aGlzLm9wdGlvbnMuc2NhbGluZy5jdXN0b21TY2FsaW5nRnVuY3Rpb24odCxlLGksdGhpcy5vcHRpb25zLnZhbHVlKSxuPXRoaXMub3B0aW9ucy5zY2FsaW5nLm1heC10aGlzLm9wdGlvbnMuc2NhbGluZy5taW47aWYodGhpcy5vcHRpb25zLnNjYWxpbmcubGFiZWwuZW5hYmxlZD09PSEwKXt2YXIgcz10aGlzLm9wdGlvbnMuc2NhbGluZy5sYWJlbC5tYXgtdGhpcy5vcHRpb25zLnNjYWxpbmcubGFiZWwubWluO3RoaXMub3B0aW9ucy5mb250LnNpemU9dGhpcy5vcHRpb25zLnNjYWxpbmcubGFiZWwubWluK28qc310aGlzLm9wdGlvbnMuc2l6ZT10aGlzLm9wdGlvbnMuc2NhbGluZy5taW4rbypufWVsc2UgdGhpcy5vcHRpb25zLnNpemU9dGhpcy5iYXNlU2l6ZSx0aGlzLm9wdGlvbnMuZm9udC5zaXplPXRoaXMuYmFzZUZvbnRTaXplO3RoaXMudXBkYXRlTGFiZWxNb2R1bGUoKX19LHtrZXk6ImRyYXciLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuc2hhcGUuZHJhdyh0LHRoaXMueCx0aGlzLnksdGhpcy5zZWxlY3RlZCx0aGlzLmhvdmVyKX19LHtrZXk6InVwZGF0ZUJvdW5kaW5nQm94Iix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLnNoYXBlLnVwZGF0ZUJvdW5kaW5nQm94KHRoaXMueCx0aGlzLnksdCl9fSx7a2V5OiJyZXNpemUiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuc2hhcGUucmVzaXplKHQsdGhpcy5zZWxlY3RlZCl9fSx7a2V5OiJpc092ZXJsYXBwaW5nV2l0aCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc2hhcGUubGVmdDx0LnJpZ2h0JiZ0aGlzLnNoYXBlLmxlZnQrdGhpcy5zaGFwZS53aWR0aD50LmxlZnQmJnRoaXMuc2hhcGUudG9wPHQuYm90dG9tJiZ0aGlzLnNoYXBlLnRvcCt0aGlzLnNoYXBlLmhlaWdodD50LnRvcH19LHtrZXk6ImlzQm91bmRpbmdCb3hPdmVybGFwcGluZ1dpdGgiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNoYXBlLmJvdW5kaW5nQm94LmxlZnQ8dC5yaWdodCYmdGhpcy5zaGFwZS5ib3VuZGluZ0JveC5yaWdodD50LmxlZnQmJnRoaXMuc2hhcGUuYm91bmRpbmdCb3gudG9wPHQuYm90dG9tJiZ0aGlzLnNoYXBlLmJvdW5kaW5nQm94LmJvdHRvbT50LnRvcH19XSxbe2tleToicGFyc2VPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl0sbz1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106e30sbj1bImNvbG9yIiwiZm9udCIsImZpeGVkIiwic2hhZG93Il07aWYoQS5zZWxlY3RpdmVOb3REZWVwRXh0ZW5kKG4sdCxlLGkpLEEubWVyZ2VPcHRpb25zKHQsZSwic2hhZG93IixpLG8pLHZvaWQgMCE9PWUuY29sb3ImJm51bGwhPT1lLmNvbG9yKXt2YXIgcz1BLnBhcnNlQ29sb3IoZS5jb2xvcik7QS5maWxsSWZEZWZpbmVkKHQuY29sb3Iscyl9ZWxzZSBpPT09ITAmJm51bGw9PT1lLmNvbG9yJiYodC5jb2xvcj1BLmJyaWRnZU9iamVjdChvLmNvbG9yKSk7dm9pZCAwIT09ZS5maXhlZCYmbnVsbCE9PWUuZml4ZWQmJigiYm9vbGVhbiI9PXR5cGVvZiBlLmZpeGVkPyh0LmZpeGVkLng9ZS5maXhlZCx0LmZpeGVkLnk9ZS5maXhlZCk6KHZvaWQgMCE9PWUuZml4ZWQueCYmImJvb2xlYW4iPT10eXBlb2YgZS5maXhlZC54JiYodC5maXhlZC54PWUuZml4ZWQueCksdm9pZCAwIT09ZS5maXhlZC55JiYiYm9vbGVhbiI9PXR5cGVvZiBlLmZpeGVkLnkmJih0LmZpeGVkLnk9ZS5maXhlZC55KSkpLHZvaWQgMCE9PWUuZm9udCYmbnVsbCE9PWUuZm9udD9hLmRlZmF1bHQucGFyc2VPcHRpb25zKHQuZm9udCxlKTppPT09ITAmJm51bGw9PT1lLmZvbnQmJih0LmZvbnQ9QS5icmlkZ2VPYmplY3Qoby5mb250KSksdm9pZCAwIT09ZS5zY2FsaW5nJiZBLm1lcmdlT3B0aW9ucyh0LnNjYWxpbmcsZS5zY2FsaW5nLCJsYWJlbCIsaSxvLnNjYWxpbmcpfX1dKSx0fSgpO2UuZGVmYXVsdD1CfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt2YXIgaT1bXSxvPSEwLG49ITEscz12b2lkIDA7dHJ5e2Zvcih2YXIgcixhPXRbU3ltYm9sLml0ZXJhdG9yXSgpOyEobz0ocj1hLm5leHQoKSkuZG9uZSkmJihpLnB1c2goci52YWx1ZSksIWV8fGkubGVuZ3RoIT09ZSk7bz0hMCk7fWNhdGNoKHQpe249ITAscz10fWZpbmFsbHl7dHJ5eyFvJiZhLnJldHVybiYmYS5yZXR1cm4oKX1maW5hbGx5e2lmKG4pdGhyb3cgc319cmV0dXJuIGl9cmV0dXJuIGZ1bmN0aW9uKGUsaSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gZTtpZihTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGUpKXJldHVybiB0KGUsaSk7dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZSIpfX0oKSxzPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSxyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBvJiYoby53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsby5rZXksbyl9fXJldHVybiBmdW5jdGlvbihlLGksbyl7cmV0dXJuIGkmJnQoZS5wcm90b3R5cGUsaSksbyYmdChlLG8pLGV9fSgpLGE9aSgxKSxoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGkpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl07byh0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMucG9pbnRUb1NlbGY9ITEsdGhpcy5iYXNlU2l6ZT12b2lkIDAsdGhpcy5mb250T3B0aW9ucz17fSx0aGlzLnNldE9wdGlvbnMoaSksdGhpcy5zaXplPXt0b3A6MCxsZWZ0OjAsd2lkdGg6MCxoZWlnaHQ6MCx5TGluZTowfSx0aGlzLmlzRWRnZUxhYmVsPW59cmV0dXJuIHIodCxbe2tleToic2V0T3B0aW9ucyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXTt0aGlzLm5vZGVPcHRpb25zPWUsdGhpcy5mb250T3B0aW9ucz1hLmRlZXBFeHRlbmQoe30sZS5mb250LCEwKSx2b2lkIDAhPT1lLmxhYmVsJiYodGhpcy5sYWJlbERpcnR5PSEwKSx2b2lkIDAhPT1lLmZvbnQmJih0LnBhcnNlT3B0aW9ucyh0aGlzLmZvbnRPcHRpb25zLGUsaSksInN0cmluZyI9PXR5cGVvZiBlLmZvbnQ/dGhpcy5iYXNlU2l6ZT10aGlzLmZvbnRPcHRpb25zLnNpemU6Im9iamVjdCI9PT1zKGUuZm9udCkmJnZvaWQgMCE9PWUuZm9udC5zaXplJiYodGhpcy5iYXNlU2l6ZT1lLmZvbnQuc2l6ZSkpfX0se2tleToiZHJhdyIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOiJtaWRkbGUiO2lmKHZvaWQgMCE9PXRoaXMubm9kZU9wdGlvbnMubGFiZWwpe3ZhciBzPXRoaXMuZm9udE9wdGlvbnMuc2l6ZSp0aGlzLmJvZHkudmlldy5zY2FsZTt0aGlzLm5vZGVPcHRpb25zLmxhYmVsJiZzPHRoaXMubm9kZU9wdGlvbnMuc2NhbGluZy5sYWJlbC5kcmF3VGhyZXNob2xkLTF8fCh0aGlzLmNhbGN1bGF0ZUxhYmVsU2l6ZSh0LG8sZSxpLG4pLHRoaXMuX2RyYXdCYWNrZ3JvdW5kKHQpLHRoaXMuX2RyYXdUZXh0KHQsbyxlLGksbikpfX19LHtrZXk6Il9kcmF3QmFja2dyb3VuZCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09dGhpcy5mb250T3B0aW9ucy5iYWNrZ3JvdW5kJiYibm9uZSIhPT10aGlzLmZvbnRPcHRpb25zLmJhY2tncm91bmQpe3QuZmlsbFN0eWxlPXRoaXMuZm9udE9wdGlvbnMuYmFja2dyb3VuZDt2YXIgZT0yO2lmKHRoaXMuaXNFZGdlTGFiZWwpc3dpdGNoKHRoaXMuZm9udE9wdGlvbnMuYWxpZ24pe2Nhc2UibWlkZGxlIjp0LmZpbGxSZWN0KC41Ki10aGlzLnNpemUud2lkdGgsLjUqLXRoaXMuc2l6ZS5oZWlnaHQsdGhpcy5zaXplLndpZHRoLHRoaXMuc2l6ZS5oZWlnaHQpO2JyZWFrO2Nhc2UidG9wIjp0LmZpbGxSZWN0KC41Ki10aGlzLnNpemUud2lkdGgsLSh0aGlzLnNpemUuaGVpZ2h0K2UpLHRoaXMuc2l6ZS53aWR0aCx0aGlzLnNpemUuaGVpZ2h0KTticmVhaztjYXNlImJvdHRvbSI6dC5maWxsUmVjdCguNSotdGhpcy5zaXplLndpZHRoLGUsdGhpcy5zaXplLndpZHRoLHRoaXMuc2l6ZS5oZWlnaHQpO2JyZWFrO2RlZmF1bHQ6dC5maWxsUmVjdCh0aGlzLnNpemUubGVmdCx0aGlzLnNpemUudG9wLS41KmUsdGhpcy5zaXplLndpZHRoLHRoaXMuc2l6ZS5oZWlnaHQpfWVsc2UgdC5maWxsUmVjdCh0aGlzLnNpemUubGVmdCx0aGlzLnNpemUudG9wLS41KmUsdGhpcy5zaXplLndpZHRoLHRoaXMuc2l6ZS5oZWlnaHQpfX19LHtrZXk6Il9kcmF3VGV4dCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyl7dmFyIHM9YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOiJtaWRkbGUiLHI9dGhpcy5mb250T3B0aW9ucy5zaXplLGE9cip0aGlzLmJvZHkudmlldy5zY2FsZTthPj10aGlzLm5vZGVPcHRpb25zLnNjYWxpbmcubGFiZWwubWF4VmlzaWJsZSYmKHI9TnVtYmVyKHRoaXMubm9kZU9wdGlvbnMuc2NhbGluZy5sYWJlbC5tYXhWaXNpYmxlKS90aGlzLmJvZHkudmlldy5zY2FsZSk7dmFyIGg9dGhpcy5zaXplLnlMaW5lLGQ9dGhpcy5fZ2V0Q29sb3IoYSksbD1uKGQsMiksYz1sWzBdLHU9bFsxXSxwPXRoaXMuX3NldEFsaWdubWVudCh0LGksaCxzKSxmPW4ocCwyKTtpPWZbMF0saD1mWzFdLHQuZm9udD0oZSYmdGhpcy5ub2RlT3B0aW9ucy5sYWJlbEhpZ2hsaWdodEJvbGQ/ImJvbGQgIjoiIikrcisicHggIit0aGlzLmZvbnRPcHRpb25zLmZhY2UsdC5maWxsU3R5bGU9Yyx0aGlzLmlzRWRnZUxhYmVsfHwibGVmdCIhPT10aGlzLmZvbnRPcHRpb25zLmFsaWduP3QudGV4dEFsaWduPSJjZW50ZXIiOih0LnRleHRBbGlnbj10aGlzLmZvbnRPcHRpb25zLmFsaWduLGktPS41KnRoaXMuc2l6ZS53aWR0aCksdGhpcy5mb250T3B0aW9ucy5zdHJva2VXaWR0aD4wJiYodC5saW5lV2lkdGg9dGhpcy5mb250T3B0aW9ucy5zdHJva2VXaWR0aCx0LnN0cm9rZVN0eWxlPXUsdC5saW5lSm9pbj0icm91bmQiKTtmb3IodmFyIG09MDttPHRoaXMubGluZUNvdW50O20rKyl0aGlzLmZvbnRPcHRpb25zLnN0cm9rZVdpZHRoPjAmJnQuc3Ryb2tlVGV4dCh0aGlzLmxpbmVzW21dLGksaCksdC5maWxsVGV4dCh0aGlzLmxpbmVzW21dLGksaCksaCs9cn19LHtrZXk6Il9zZXRBbGlnbm1lbnQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8pe2lmKHRoaXMuaXNFZGdlTGFiZWwmJiJob3Jpem9udGFsIiE9PXRoaXMuZm9udE9wdGlvbnMuYWxpZ24mJnRoaXMucG9pbnRUb1NlbGY9PT0hMSl7ZT0wLGk9MDt2YXIgbj0yOyJ0b3AiPT09dGhpcy5mb250T3B0aW9ucy5hbGlnbj8odC50ZXh0QmFzZWxpbmU9ImFscGhhYmV0aWMiLGktPTIqbik6ImJvdHRvbSI9PT10aGlzLmZvbnRPcHRpb25zLmFsaWduPyh0LnRleHRCYXNlbGluZT0iaGFuZ2luZyIsaSs9MipuKTp0LnRleHRCYXNlbGluZT0ibWlkZGxlIn1lbHNlIHQudGV4dEJhc2VsaW5lPW87cmV0dXJuW2UsaV19fSx7a2V5OiJfZ2V0Q29sb3IiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZm9udE9wdGlvbnMuY29sb3J8fCIjMDAwMDAwIixpPXRoaXMuZm9udE9wdGlvbnMuc3Ryb2tlQ29sb3J8fCIjZmZmZmZmIjtpZih0PD10aGlzLm5vZGVPcHRpb25zLnNjYWxpbmcubGFiZWwuZHJhd1RocmVzaG9sZCl7dmFyIG89TWF0aC5tYXgoMCxNYXRoLm1pbigxLDEtKHRoaXMubm9kZU9wdGlvbnMuc2NhbGluZy5sYWJlbC5kcmF3VGhyZXNob2xkLXQpKSk7ZT1hLm92ZXJyaWRlT3BhY2l0eShlLG8pLGk9YS5vdmVycmlkZU9wYWNpdHkoaSxvKX1yZXR1cm5bZSxpXX19LHtrZXk6ImdldFRleHRTaXplIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdLGk9e3dpZHRoOnRoaXMuX3Byb2Nlc3NMYWJlbCh0LGUpLGhlaWdodDp0aGlzLmZvbnRPcHRpb25zLnNpemUqdGhpcy5saW5lQ291bnQsbGluZUNvdW50OnRoaXMubGluZUNvdW50fTtyZXR1cm4gaX19LHtrZXk6ImNhbGN1bGF0ZUxhYmVsU2l6ZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06MCxvPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTowLG49YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOiJtaWRkbGUiO3RoaXMubGFiZWxEaXJ0eT09PSEwJiYodGhpcy5zaXplLndpZHRoPXRoaXMuX3Byb2Nlc3NMYWJlbCh0LGUpKSx0aGlzLnNpemUuaGVpZ2h0PXRoaXMuZm9udE9wdGlvbnMuc2l6ZSp0aGlzLmxpbmVDb3VudCx0aGlzLnNpemUubGVmdD1pLS41KnRoaXMuc2l6ZS53aWR0aCx0aGlzLnNpemUudG9wPW8tLjUqdGhpcy5zaXplLmhlaWdodCx0aGlzLnNpemUueUxpbmU9bysuNSooMS10aGlzLmxpbmVDb3VudCkqdGhpcy5mb250T3B0aW9ucy5zaXplLCJoYW5naW5nIj09PW4mJih0aGlzLnNpemUudG9wKz0uNSp0aGlzLmZvbnRPcHRpb25zLnNpemUsdGhpcy5zaXplLnRvcCs9NCx0aGlzLnNpemUueUxpbmUrPTQpLHRoaXMubGFiZWxEaXJ0eT0hMX19LHtrZXk6Il9wcm9jZXNzTGFiZWwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9MCxvPVsiIl0sbj0wO2lmKHZvaWQgMCE9PXRoaXMubm9kZU9wdGlvbnMubGFiZWwpe289U3RyaW5nKHRoaXMubm9kZU9wdGlvbnMubGFiZWwpLnNwbGl0KCJcbiIpLG49by5sZW5ndGgsdC5mb250PShlJiZ0aGlzLm5vZGVPcHRpb25zLmxhYmVsSGlnaGxpZ2h0Qm9sZD8iYm9sZCAiOiIiKSt0aGlzLmZvbnRPcHRpb25zLnNpemUrInB4ICIrdGhpcy5mb250T3B0aW9ucy5mYWNlLGk9dC5tZWFzdXJlVGV4dChvWzBdKS53aWR0aDtmb3IodmFyIHM9MTtzPG47cysrKXt2YXIgcj10Lm1lYXN1cmVUZXh0KG9bc10pLndpZHRoO2k9cj5pP3I6aX19cmV0dXJuIHRoaXMubGluZXM9byx0aGlzLmxpbmVDb3VudD1uLGl9fV0sW3trZXk6InBhcnNlT3B0aW9ucyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdO2lmKCJzdHJpbmciPT10eXBlb2YgZS5mb250KXt2YXIgbz1lLmZvbnQuc3BsaXQoIiAiKTt0LnNpemU9b1swXS5yZXBsYWNlKCJweCIsIiIpLHQuZmFjZT1vWzFdLHQuY29sb3I9b1syXX1lbHNlIm9iamVjdCI9PT1zKGUuZm9udCkmJmEuZmlsbElmRGVmaW5lZCh0LGUuZm9udCxpKTt0LnNpemU9TnVtYmVyKHQuc2l6ZSl9fV0pLHR9KCk7ZS5kZWZhdWx0PWh9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1mdW5jdGlvbiBuKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gcyh0LGUpe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIWV8fCJvYmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU/dDplfWZ1bmN0aW9uIHIodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiBlKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LGUpOnQuX19wcm90b19fPWUpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG8pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG8mJnQoZSxvKSxlfX0oKSxoPWkoNzApLGQ9byhoKSxsPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG8pe3JldHVybiBuKHRoaXMsZSkscyh0aGlzLChlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpKS5jYWxsKHRoaXMsdCxpLG8pKX1yZXR1cm4gcihlLHQpLGEoZSxbe2tleToicmVzaXplIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKHZvaWQgMD09PXRoaXMud2lkdGgpe3ZhciBpPTUsbz10aGlzLmxhYmVsTW9kdWxlLmdldFRleHRTaXplKHQsZSk7dGhpcy53aWR0aD1vLndpZHRoKzIqaSx0aGlzLmhlaWdodD1vLmhlaWdodCsyKmksdGhpcy5yYWRpdXM9LjUqdGhpcy53aWR0aH19fSx7a2V5OiJkcmF3Iix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4pe3RoaXMucmVzaXplKHQsbyksdGhpcy5sZWZ0PWUtdGhpcy53aWR0aC8yLHRoaXMudG9wPWktdGhpcy5oZWlnaHQvMjt2YXIgcz10aGlzLm9wdGlvbnMuYm9yZGVyV2lkdGgscj10aGlzLm9wdGlvbnMuYm9yZGVyV2lkdGhTZWxlY3RlZHx8Mip0aGlzLm9wdGlvbnMuYm9yZGVyV2lkdGg7dC5zdHJva2VTdHlsZT1vP3RoaXMub3B0aW9ucy5jb2xvci5oaWdobGlnaHQuYm9yZGVyOm4/dGhpcy5vcHRpb25zLmNvbG9yLmhvdmVyLmJvcmRlcjp0aGlzLm9wdGlvbnMuY29sb3IuYm9yZGVyLHQubGluZVdpZHRoPW8/cjpzLHQubGluZVdpZHRoLz10aGlzLmJvZHkudmlldy5zY2FsZSx0LmxpbmVXaWR0aD1NYXRoLm1pbih0aGlzLndpZHRoLHQubGluZVdpZHRoKSx0LmZpbGxTdHlsZT1vP3RoaXMub3B0aW9ucy5jb2xvci5oaWdobGlnaHQuYmFja2dyb3VuZDpuP3RoaXMub3B0aW9ucy5jb2xvci5ob3Zlci5iYWNrZ3JvdW5kOnRoaXMub3B0aW9ucy5jb2xvci5iYWNrZ3JvdW5kO3ZhciBhPXRoaXMub3B0aW9ucy5zaGFwZVByb3BlcnRpZXMuYm9yZGVyUmFkaXVzO3Qucm91bmRSZWN0KHRoaXMubGVmdCx0aGlzLnRvcCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0LGEpLHRoaXMuZW5hYmxlU2hhZG93KHQpLHQuZmlsbCgpLHRoaXMuZGlzYWJsZVNoYWRvdyh0KSx0LnNhdmUoKSxzPjAmJih0aGlzLmVuYWJsZUJvcmRlckRhc2hlcyh0KSx0LnN0cm9rZSgpLHRoaXMuZGlzYWJsZUJvcmRlckRhc2hlcyh0KSksdC5yZXN0b3JlKCksdGhpcy51cGRhdGVCb3VuZGluZ0JveChlLGksdCxvKSx0aGlzLmxhYmVsTW9kdWxlLmRyYXcodCxlLGksbyl9fSx7a2V5OiJ1cGRhdGVCb3VuZGluZ0JveCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyl7dGhpcy5yZXNpemUoaSxvKSx0aGlzLmxlZnQ9dC0uNSp0aGlzLndpZHRoLHRoaXMudG9wPWUtLjUqdGhpcy5oZWlnaHQ7dmFyIG49dGhpcy5vcHRpb25zLnNoYXBlUHJvcGVydGllcy5ib3JkZXJSYWRpdXM7dGhpcy5ib3VuZGluZ0JveC5sZWZ0PXRoaXMubGVmdC1uLHRoaXMuYm91bmRpbmdCb3gudG9wPXRoaXMudG9wLW4sdGhpcy5ib3VuZGluZ0JveC5ib3R0b209dGhpcy50b3ArdGhpcy5oZWlnaHQrbix0aGlzLmJvdW5kaW5nQm94LnJpZ2h0PXRoaXMubGVmdCt0aGlzLndpZHRoK259fSx7a2V5OiJkaXN0YW5jZVRvQm9yZGVyIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMucmVzaXplKHQpO3ZhciBpPXRoaXMub3B0aW9ucy5ib3JkZXJXaWR0aDtyZXR1cm4gTWF0aC5taW4oTWF0aC5hYnModGhpcy53aWR0aC8yL01hdGguY29zKGUpKSxNYXRoLmFicyh0aGlzLmhlaWdodC8yL01hdGguc2luKGUpKSkraX19XSksZX0oZC5kZWZhdWx0KTtlLmRlZmF1bHQ9bH0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBpKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBvJiYoby53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsby5rZXksbyl9fXJldHVybiBmdW5jdGlvbihlLGksbyl7cmV0dXJuIGkmJnQoZS5wcm90b3R5cGUsaSksbyYmdChlLG8pLGV9fSgpLG49ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsbyxuKXtpKHRoaXMsdCksdGhpcy5ib2R5PW8sdGhpcy5sYWJlbE1vZHVsZT1uLHRoaXMuc2V0T3B0aW9ucyhlKSx0aGlzLnRvcD12b2lkIDAsdGhpcy5sZWZ0PXZvaWQgMCx0aGlzLmhlaWdodD12b2lkIDAsdGhpcy53aWR0aD12b2lkIDAsdGhpcy5yYWRpdXM9dm9pZCAwLHRoaXMuYm91bmRpbmdCb3g9e3RvcDowLGxlZnQ6MCxyaWdodDowLGJvdHRvbTowfX1yZXR1cm4gbyh0LFt7a2V5OiJzZXRPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnM9dH19LHtrZXk6Il9kaXN0YW5jZVRvQm9yZGVyIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMub3B0aW9ucy5ib3JkZXJXaWR0aDtyZXR1cm4gdGhpcy5yZXNpemUodCksTWF0aC5taW4oTWF0aC5hYnModGhpcy53aWR0aC8yL01hdGguY29zKGUpKSxNYXRoLmFicyh0aGlzLmhlaWdodC8yL01hdGguc2luKGUpKSkraX19LHtrZXk6ImVuYWJsZVNoYWRvdyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLnNoYWRvdy5lbmFibGVkPT09ITAmJih0LnNoYWRvd0NvbG9yPXRoaXMub3B0aW9ucy5zaGFkb3cuY29sb3IsdC5zaGFkb3dCbHVyPXRoaXMub3B0aW9ucy5zaGFkb3cuc2l6ZSx0LnNoYWRvd09mZnNldFg9dGhpcy5vcHRpb25zLnNoYWRvdy54LHQuc2hhZG93T2Zmc2V0WT10aGlzLm9wdGlvbnMuc2hhZG93LnkpfX0se2tleToiZGlzYWJsZVNoYWRvdyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLnNoYWRvdy5lbmFibGVkPT09ITAmJih0LnNoYWRvd0NvbG9yPSJyZ2JhKDAsMCwwLDApIix0LnNoYWRvd0JsdXI9MCx0LnNoYWRvd09mZnNldFg9MCx0LnNoYWRvd09mZnNldFk9MCl9fSx7a2V5OiJlbmFibGVCb3JkZXJEYXNoZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHRoaXMub3B0aW9ucy5zaGFwZVByb3BlcnRpZXMuYm9yZGVyRGFzaGVzIT09ITEpaWYodm9pZCAwIT09dC5zZXRMaW5lRGFzaCl7dmFyIGU9dGhpcy5vcHRpb25zLnNoYXBlUHJvcGVydGllcy5ib3JkZXJEYXNoZXM7ZT09PSEwJiYoZT1bNSwxNV0pLHQuc2V0TGluZURhc2goZSl9ZWxzZSBjb25zb2xlLndhcm4oInNldExpbmVEYXNoIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyLiBUaGUgZGFzaGVkIGJvcmRlcnMgY2Fubm90IGJlIHVzZWQuIiksdGhpcy5vcHRpb25zLnNoYXBlUHJvcGVydGllcy5ib3JkZXJEYXNoZXM9ITF9fSx7a2V5OiJkaXNhYmxlQm9yZGVyRGFzaGVzIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnMuc2hhcGVQcm9wZXJ0aWVzLmJvcmRlckRhc2hlcyE9PSExJiYodm9pZCAwIT09dC5zZXRMaW5lRGFzaD90LnNldExpbmVEYXNoKFswXSk6KGNvbnNvbGUud2Fybigic2V0TGluZURhc2ggaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXIuIFRoZSBkYXNoZWQgYm9yZGVycyBjYW5ub3QgYmUgdXNlZC4iKSx0aGlzLm9wdGlvbnMuc2hhcGVQcm9wZXJ0aWVzLmJvcmRlckRhc2hlcz0hMSkpfX1dKSx0fSgpO2UuZGVmYXVsdD1ufSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIHModCxlKXtpZighdCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiFlfHwib2JqZWN0IiE9dHlwZW9mIGUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlP3Q6ZX1mdW5jdGlvbiByKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgZSk7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxlKTp0Ll9fcHJvdG9fXz1lKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxvJiZ0KGUsbyksZX19KCksaD1pKDcyKSxkPW8oaCksbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4gbih0aGlzLGUpLHModGhpcywoZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuIHIoZSx0KSxhKGUsW3trZXk6InJlc2l6ZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtpZih2b2lkIDA9PT10aGlzLndpZHRoKXt2YXIgaT01LG89dGhpcy5sYWJlbE1vZHVsZS5nZXRUZXh0U2l6ZSh0LGUpLG49TWF0aC5tYXgoby53aWR0aCxvLmhlaWdodCkrMippO3RoaXMub3B0aW9ucy5zaXplPW4vMix0aGlzLndpZHRoPW4sdGhpcy5oZWlnaHQ9bix0aGlzLnJhZGl1cz0uNSp0aGlzLndpZHRofX19LHtrZXk6ImRyYXciLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbil7dGhpcy5yZXNpemUodCxvKSx0aGlzLmxlZnQ9ZS10aGlzLndpZHRoLzIsdGhpcy50b3A9aS10aGlzLmhlaWdodC8yLHRoaXMuX2RyYXdSYXdDaXJjbGUodCxlLGksbyxuLHRoaXMub3B0aW9ucy5zaXplKSx0aGlzLmJvdW5kaW5nQm94LnRvcD1pLXRoaXMub3B0aW9ucy5zaXplLHRoaXMuYm91bmRpbmdCb3gubGVmdD1lLXRoaXMub3B0aW9ucy5zaXplLHRoaXMuYm91bmRpbmdCb3gucmlnaHQ9ZSt0aGlzLm9wdGlvbnMuc2l6ZSx0aGlzLmJvdW5kaW5nQm94LmJvdHRvbT1pK3RoaXMub3B0aW9ucy5zaXplLHRoaXMudXBkYXRlQm91bmRpbmdCb3goZSxpKSx0aGlzLmxhYmVsTW9kdWxlLmRyYXcodCxlLGksbyl9fSx7a2V5OiJ1cGRhdGVCb3VuZGluZ0JveCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0aGlzLmJvdW5kaW5nQm94LnRvcD1lLXRoaXMub3B0aW9ucy5zaXplLHRoaXMuYm91bmRpbmdCb3gubGVmdD10LXRoaXMub3B0aW9ucy5zaXplLHRoaXMuYm91bmRpbmdCb3gucmlnaHQ9dCt0aGlzLm9wdGlvbnMuc2l6ZSx0aGlzLmJvdW5kaW5nQm94LmJvdHRvbT1lK3RoaXMub3B0aW9ucy5zaXplfX0se2tleToiZGlzdGFuY2VUb0JvcmRlciIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5yZXNpemUodCksLjUqdGhpcy53aWR0aH19XSksZX0oZC5kZWZhdWx0KTtlLmRlZmF1bHQ9bH0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWZ1bmN0aW9uIG4odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBzKHQsZSl7aWYoIXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hZXx8Im9iamVjdCIhPXR5cGVvZiBlJiYiZnVuY3Rpb24iIT10eXBlb2YgZT90OmV9ZnVuY3Rpb24gcih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIGUpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHQsZSk6dC5fX3Byb3RvX189ZSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBvJiYoby53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsby5rZXksbyl9fXJldHVybiBmdW5jdGlvbihlLGksbyl7cmV0dXJuIGkmJnQoZS5wcm90b3R5cGUsaSksbyYmdChlLG8pLGV9fSgpLGg9aSg3MCksZD1vKGgpLGw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyl7bih0aGlzLGUpO3ZhciByPXModGhpcywoZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKSkuY2FsbCh0aGlzLHQsaSxvKSk7cmV0dXJuIHIubGFiZWxPZmZzZXQ9MCxyLmltYWdlTG9hZGVkPSExLHJ9cmV0dXJuIHIoZSx0KSxhKGUsW3trZXk6InNldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5vcHRpb25zPXQsZSYmKHRoaXMuaW1hZ2VPYmo9ZSl9fSx7a2V5OiJfcmVzaXplSW1hZ2UiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9ITE7aWYodGhpcy5pbWFnZU9iai53aWR0aCYmdGhpcy5pbWFnZU9iai5oZWlnaHQ/dGhpcy5pbWFnZUxvYWRlZD09PSExJiYodGhpcy5pbWFnZUxvYWRlZD0hMCx0PSEwKTp0aGlzLmltYWdlTG9hZGVkPSExLCF0aGlzLndpZHRofHwhdGhpcy5oZWlnaHR8fHQ9PT0hMCl7dmFyIGUsaSxvO3RoaXMuaW1hZ2VPYmoud2lkdGgmJnRoaXMuaW1hZ2VPYmouaGVpZ2h0JiYoZT0wLGk9MCksdGhpcy5vcHRpb25zLnNoYXBlUHJvcGVydGllcy51c2VJbWFnZVNpemU9PT0hMT90aGlzLmltYWdlT2JqLndpZHRoPnRoaXMuaW1hZ2VPYmouaGVpZ2h0PyhvPXRoaXMuaW1hZ2VPYmoud2lkdGgvdGhpcy5pbWFnZU9iai5oZWlnaHQsZT0yKnRoaXMub3B0aW9ucy5zaXplKm98fHRoaXMuaW1hZ2VPYmoud2lkdGgsaT0yKnRoaXMub3B0aW9ucy5zaXplfHx0aGlzLmltYWdlT2JqLmhlaWdodCk6KG89dGhpcy5pbWFnZU9iai53aWR0aCYmdGhpcy5pbWFnZU9iai5oZWlnaHQ/dGhpcy5pbWFnZU9iai5oZWlnaHQvdGhpcy5pbWFnZU9iai53aWR0aDoxLGU9Mip0aGlzLm9wdGlvbnMuc2l6ZSxpPTIqdGhpcy5vcHRpb25zLnNpemUqbyk6KGU9dGhpcy5pbWFnZU9iai53aWR0aCxpPXRoaXMuaW1hZ2VPYmouaGVpZ2h0KSx0aGlzLndpZHRoPWUsdGhpcy5oZWlnaHQ9aSx0aGlzLnJhZGl1cz0uNSp0aGlzLndpZHRofX19LHtrZXk6Il9kcmF3UmF3Q2lyY2xlIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7dmFyIHI9dGhpcy5vcHRpb25zLmJvcmRlcldpZHRoLGE9dGhpcy5vcHRpb25zLmJvcmRlcldpZHRoU2VsZWN0ZWR8fDIqdGhpcy5vcHRpb25zLmJvcmRlcldpZHRoLGg9KG8/YTpyKS90aGlzLmJvZHkudmlldy5zY2FsZTt0LmxpbmVXaWR0aD1NYXRoLm1pbih0aGlzLndpZHRoLGgpLHQuc3Ryb2tlU3R5bGU9bz90aGlzLm9wdGlvbnMuY29sb3IuaGlnaGxpZ2h0LmJvcmRlcjpuP3RoaXMub3B0aW9ucy5jb2xvci5ob3Zlci5ib3JkZXI6dGhpcy5vcHRpb25zLmNvbG9yLmJvcmRlcix0LmZpbGxTdHlsZT1vP3RoaXMub3B0aW9ucy5jb2xvci5oaWdobGlnaHQuYmFja2dyb3VuZDpuP3RoaXMub3B0aW9ucy5jb2xvci5ob3Zlci5iYWNrZ3JvdW5kOnRoaXMub3B0aW9ucy5jb2xvci5iYWNrZ3JvdW5kLHQuY2lyY2xlKGUsaSxzKSx0aGlzLmVuYWJsZVNoYWRvdyh0KSx0LmZpbGwoKSx0aGlzLmRpc2FibGVTaGFkb3codCksdC5zYXZlKCksaD4wJiYodGhpcy5lbmFibGVCb3JkZXJEYXNoZXModCksdC5zdHJva2UoKSx0aGlzLmRpc2FibGVCb3JkZXJEYXNoZXModCkpLHQucmVzdG9yZSgpfX0se2tleToiX2RyYXdJbWFnZUF0UG9zaXRpb24iLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKDAhPXRoaXMuaW1hZ2VPYmoud2lkdGgpe3QuZ2xvYmFsQWxwaGE9MSx0aGlzLmVuYWJsZVNoYWRvdyh0KTt2YXIgZT10aGlzLmltYWdlT2JqLndpZHRoL3RoaXMud2lkdGgvdGhpcy5ib2R5LnZpZXcuc2NhbGU7aWYoZT4yJiZ0aGlzLm9wdGlvbnMuc2hhcGVQcm9wZXJ0aWVzLmludGVycG9sYXRpb249PT0hMCl7dmFyIGk9dGhpcy5pbWFnZU9iai53aWR0aCxvPXRoaXMuaW1hZ2VPYmouaGVpZ2h0LG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7bi53aWR0aD1pLG4uaGVpZ2h0PWk7dmFyIHM9bi5nZXRDb250ZXh0KCIyZCIpO2UqPS41LGkqPS41LG8qPS41LHMuZHJhd0ltYWdlKHRoaXMuaW1hZ2VPYmosMCwwLGksbyk7Zm9yKHZhciByPTAsYT0xO2U+MiYmYTw0OylzLmRyYXdJbWFnZShuLHIsMCxpLG8scitpLDAsaS8yLG8vMikscis9aSxlKj0uNSxpKj0uNSxvKj0uNSxhKz0xO3QuZHJhd0ltYWdlKG4sciwwLGksbyx0aGlzLmxlZnQsdGhpcy50b3AsdGhpcy53aWR0aCx0aGlzLmhlaWdodCl9ZWxzZSB0LmRyYXdJbWFnZSh0aGlzLmltYWdlT2JqLHRoaXMubGVmdCx0aGlzLnRvcCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KTt0aGlzLmRpc2FibGVTaGFkb3codCl9fX0se2tleToiX2RyYXdJbWFnZUxhYmVsIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvKXt2YXIgbixzPTA7aWYodm9pZCAwIT09dGhpcy5oZWlnaHQpe3M9LjUqdGhpcy5oZWlnaHQ7dmFyIHI9dGhpcy5sYWJlbE1vZHVsZS5nZXRUZXh0U2l6ZSh0KTtyLmxpbmVDb3VudD49MSYmKHMrPXIuaGVpZ2h0LzIpfW49aStzLHRoaXMub3B0aW9ucy5sYWJlbCYmKHRoaXMubGFiZWxPZmZzZXQ9cyksdGhpcy5sYWJlbE1vZHVsZS5kcmF3KHQsZSxuLG8sImhhbmdpbmciKX19XSksZX0oZC5kZWZhdWx0KTtlLmRlZmF1bHQ9bH0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWZ1bmN0aW9uIG4odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBzKHQsZSl7aWYoIXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hZXx8Im9iamVjdCIhPXR5cGVvZiBlJiYiZnVuY3Rpb24iIT10eXBlb2YgZT90OmV9ZnVuY3Rpb24gcih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIGUpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHQsZSk6dC5fX3Byb3RvX189ZSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBvJiYoby53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsby5rZXksbyl9fXJldHVybiBmdW5jdGlvbihlLGksbyl7cmV0dXJuIGkmJnQoZS5wcm90b3R5cGUsaSksbyYmdChlLG8pLGV9fSgpLGg9aSg3MiksZD1vKGgpLGw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyxyKXtuKHRoaXMsZSk7dmFyIGE9cyh0aGlzLChlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpKS5jYWxsKHRoaXMsdCxpLG8pKTtyZXR1cm4gYS5pbWFnZU9iaj1yLGEuX3N3YXBUb0ltYWdlUmVzaXplV2hlbkltYWdlTG9hZGVkPSEwLGF9cmV0dXJuIHIoZSx0KSxhKGUsW3trZXk6InJlc2l6ZSIsdmFsdWU6ZnVuY3Rpb24oKXtpZih2b2lkIDA9PT10aGlzLmltYWdlT2JqLnNyY3x8dm9pZCAwPT09dGhpcy5pbWFnZU9iai53aWR0aHx8dm9pZCAwPT09dGhpcy5pbWFnZU9iai5oZWlnaHQpe2lmKCF0aGlzLndpZHRoKXt2YXIgdD0yKnRoaXMub3B0aW9ucy5zaXplO3RoaXMud2lkdGg9dCx0aGlzLmhlaWdodD10LHRoaXMuX3N3YXBUb0ltYWdlUmVzaXplV2hlbkltYWdlTG9hZGVkPSEwLHRoaXMucmFkaXVzPS41KnRoaXMud2lkdGh9fWVsc2UgdGhpcy5fc3dhcFRvSW1hZ2VSZXNpemVXaGVuSW1hZ2VMb2FkZWQmJih0aGlzLndpZHRoPXZvaWQgMCx0aGlzLmhlaWdodD12b2lkIDAsdGhpcy5fc3dhcFRvSW1hZ2VSZXNpemVXaGVuSW1hZ2VMb2FkZWQ9ITEpLHRoaXMuX3Jlc2l6ZUltYWdlKCl9fSx7a2V5OiJkcmF3Iix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4pe3RoaXMucmVzaXplKCksdGhpcy5sZWZ0PWUtdGhpcy53aWR0aC8yLHRoaXMudG9wPWktdGhpcy5oZWlnaHQvMjt2YXIgcz1NYXRoLm1pbiguNSp0aGlzLmhlaWdodCwuNSp0aGlzLndpZHRoKTt0aGlzLl9kcmF3UmF3Q2lyY2xlKHQsZSxpLG8sbixzKSx0LnNhdmUoKSx0LmNsaXAoKSx0aGlzLl9kcmF3SW1hZ2VBdFBvc2l0aW9uKHQpLHQucmVzdG9yZSgpLHRoaXMuX2RyYXdJbWFnZUxhYmVsKHQsZSxpLG8pLHRoaXMudXBkYXRlQm91bmRpbmdCb3goZSxpKX19LHtrZXk6InVwZGF0ZUJvdW5kaW5nQm94Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMuYm91bmRpbmdCb3gudG9wPWUtdGhpcy5vcHRpb25zLnNpemUsdGhpcy5ib3VuZGluZ0JveC5sZWZ0PXQtdGhpcy5vcHRpb25zLnNpemUsdGhpcy5ib3VuZGluZ0JveC5yaWdodD10K3RoaXMub3B0aW9ucy5zaXplLHRoaXMuYm91bmRpbmdCb3guYm90dG9tPWUrdGhpcy5vcHRpb25zLnNpemUsdGhpcy5ib3VuZGluZ0JveC5sZWZ0PU1hdGgubWluKHRoaXMuYm91bmRpbmdCb3gubGVmdCx0aGlzLmxhYmVsTW9kdWxlLnNpemUubGVmdCksdGhpcy5ib3VuZGluZ0JveC5yaWdodD1NYXRoLm1heCh0aGlzLmJvdW5kaW5nQm94LnJpZ2h0LHRoaXMubGFiZWxNb2R1bGUuc2l6ZS5sZWZ0K3RoaXMubGFiZWxNb2R1bGUuc2l6ZS53aWR0aCksdGhpcy5ib3VuZGluZ0JveC5ib3R0b209TWF0aC5tYXgodGhpcy5ib3VuZGluZ0JveC5ib3R0b20sdGhpcy5ib3VuZGluZ0JveC5ib3R0b20rdGhpcy5sYWJlbE9mZnNldCl9fSx7a2V5OiJkaXN0YW5jZVRvQm9yZGVyIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnJlc2l6ZSh0KSwuNSp0aGlzLndpZHRofX1dKSxlfShkLmRlZmF1bHQpO2UuZGVmYXVsdD1sfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIHModCxlKXtpZighdCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiFlfHwib2JqZWN0IiE9dHlwZW9mIGUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlP3Q6ZX1mdW5jdGlvbiByKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgZSk7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxlKTp0Ll9fcHJvdG9fXz1lKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxvJiZ0KGUsbyksZX19KCksaD1pKDcwKSxkPW8oaCksbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4gbih0aGlzLGUpLHModGhpcywoZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuIHIoZSx0KSxhKGUsW3trZXk6InJlc2l6ZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtpZih2b2lkIDA9PT10aGlzLndpZHRoKXt2YXIgaT01LG89dGhpcy5sYWJlbE1vZHVsZS5nZXRUZXh0U2l6ZSh0LGUpLG49by53aWR0aCsyKmk7dGhpcy53aWR0aD1uLHRoaXMuaGVpZ2h0PW4sdGhpcy5yYWRpdXM9LjUqdGhpcy53aWR0aH19fSx7a2V5OiJkcmF3Iix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4pe3RoaXMucmVzaXplKHQsbyksdGhpcy5sZWZ0PWUtdGhpcy53aWR0aC8yLHRoaXMudG9wPWktdGhpcy5oZWlnaHQvMjt2YXIgcz10aGlzLm9wdGlvbnMuYm9yZGVyV2lkdGgscj10aGlzLm9wdGlvbnMuYm9yZGVyV2lkdGhTZWxlY3RlZHx8Mip0aGlzLm9wdGlvbnMuYm9yZGVyV2lkdGgsYT0obz9yOnMpL3RoaXMuYm9keS52aWV3LnNjYWxlO3QubGluZVdpZHRoPU1hdGgubWluKHRoaXMud2lkdGgsYSksdC5zdHJva2VTdHlsZT1vP3RoaXMub3B0aW9ucy5jb2xvci5oaWdobGlnaHQuYm9yZGVyOm4/dGhpcy5vcHRpb25zLmNvbG9yLmhvdmVyLmJvcmRlcjp0aGlzLm9wdGlvbnMuY29sb3IuYm9yZGVyLHQuZmlsbFN0eWxlPW8/dGhpcy5vcHRpb25zLmNvbG9yLmhpZ2hsaWdodC5iYWNrZ3JvdW5kOm4/dGhpcy5vcHRpb25zLmNvbG9yLmhvdmVyLmJhY2tncm91bmQ6dGhpcy5vcHRpb25zLmNvbG9yLmJhY2tncm91bmQsdC5kYXRhYmFzZShlLXRoaXMud2lkdGgvMixpLS41KnRoaXMuaGVpZ2h0LHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpLHRoaXMuZW5hYmxlU2hhZG93KHQpLHQuZmlsbCgpLHRoaXMuZGlzYWJsZVNoYWRvdyh0KSx0LnNhdmUoKSxhPjAmJih0aGlzLmVuYWJsZUJvcmRlckRhc2hlcyh0KSx0LnN0cm9rZSgpLHRoaXMuZGlzYWJsZUJvcmRlckRhc2hlcyh0KSksdC5yZXN0b3JlKCksdGhpcy51cGRhdGVCb3VuZGluZ0JveChlLGksdCxvKSx0aGlzLmxhYmVsTW9kdWxlLmRyYXcodCxlLGksbyl9fSx7a2V5OiJ1cGRhdGVCb3VuZGluZ0JveCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyl7dGhpcy5yZXNpemUoaSxvKSx0aGlzLmxlZnQ9dC0uNSp0aGlzLndpZHRoLHRoaXMudG9wPWUtLjUqdGhpcy5oZWlnaHQsdGhpcy5ib3VuZGluZ0JveC5sZWZ0PXRoaXMubGVmdCx0aGlzLmJvdW5kaW5nQm94LnRvcD10aGlzLnRvcCx0aGlzLmJvdW5kaW5nQm94LmJvdHRvbT10aGlzLnRvcCt0aGlzLmhlaWdodCx0aGlzLmJvdW5kaW5nQm94LnJpZ2h0PXRoaXMubGVmdCt0aGlzLndpZHRofX0se2tleToiZGlzdGFuY2VUb0JvcmRlciIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZGlzdGFuY2VUb0JvcmRlcih0LGUpfX1dKSxlfShkLmRlZmF1bHQpO2UuZGVmYXVsdD1sfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIHModCxlKXtpZighdCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiFlfHwib2JqZWN0IiE9dHlwZW9mIGUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlP3Q6ZX1mdW5jdGlvbiByKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgZSk7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxlKTp0Ll9fcHJvdG9fXz1lKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxvJiZ0KGUsbyksZX19KCksaD1pKDc2KSxkPW8oaCksbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4gbih0aGlzLGUpLHModGhpcywoZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuIHIoZSx0KSxhKGUsW3trZXk6InJlc2l6ZSIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5fcmVzaXplU2hhcGUoKX19LHtrZXk6ImRyYXciLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbil7dGhpcy5fZHJhd1NoYXBlKHQsImRpYW1vbmQiLDQsZSxpLG8sbil9fSx7a2V5OiJkaXN0YW5jZVRvQm9yZGVyIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9kaXN0YW5jZVRvQm9yZGVyKHQsZSl9fV0pLGV9KGQuZGVmYXVsdCk7ZS5kZWZhdWx0PWx9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1mdW5jdGlvbiBuKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gcyh0LGUpe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIWV8fCJvYmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU/dDplfWZ1bmN0aW9uIHIodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiBlKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LGUpOnQuX19wcm90b19fPWUpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG8pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG8mJnQoZSxvKSxlfX0oKSxoPWkoNzApLGQ9byhoKSxsPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG8pe3JldHVybiBuKHRoaXMsZSkscyh0aGlzLChlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpKS5jYWxsKHRoaXMsdCxpLG8pKX1yZXR1cm4gcihlLHQpLGEoZSxbe2tleToiX3Jlc2l6ZVNoYXBlIix2YWx1ZTpmdW5jdGlvbigpe2lmKHZvaWQgMD09PXRoaXMud2lkdGgpe3ZhciB0PTIqdGhpcy5vcHRpb25zLnNpemU7dGhpcy53aWR0aD10LHRoaXMuaGVpZ2h0PXQsdGhpcy5yYWRpdXM9LjUqdGhpcy53aWR0aH19fSx7a2V5OiJfZHJhd1NoYXBlIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyxyKXt0aGlzLl9yZXNpemVTaGFwZSgpLHRoaXMubGVmdD1vLXRoaXMud2lkdGgvMix0aGlzLnRvcD1uLXRoaXMuaGVpZ2h0LzI7dmFyIGE9dGhpcy5vcHRpb25zLmJvcmRlcldpZHRoLGg9dGhpcy5vcHRpb25zLmJvcmRlcldpZHRoU2VsZWN0ZWR8fDIqdGhpcy5vcHRpb25zLmJvcmRlcldpZHRoLGQ9KHM/aDphKS90aGlzLmJvZHkudmlldy5zY2FsZTtpZih0LmxpbmVXaWR0aD1NYXRoLm1pbih0aGlzLndpZHRoLGQpLHQuc3Ryb2tlU3R5bGU9cz90aGlzLm9wdGlvbnMuY29sb3IuaGlnaGxpZ2h0LmJvcmRlcjpyP3RoaXMub3B0aW9ucy5jb2xvci5ob3Zlci5ib3JkZXI6dGhpcy5vcHRpb25zLmNvbG9yLmJvcmRlcix0LmZpbGxTdHlsZT1zP3RoaXMub3B0aW9ucy5jb2xvci5oaWdobGlnaHQuYmFja2dyb3VuZDpyP3RoaXMub3B0aW9ucy5jb2xvci5ob3Zlci5iYWNrZ3JvdW5kOnRoaXMub3B0aW9ucy5jb2xvci5iYWNrZ3JvdW5kLHRbZV0obyxuLHRoaXMub3B0aW9ucy5zaXplKSx0aGlzLmVuYWJsZVNoYWRvdyh0KSx0LmZpbGwoKSx0aGlzLmRpc2FibGVTaGFkb3codCksdC5zYXZlKCksZD4wJiYodGhpcy5lbmFibGVCb3JkZXJEYXNoZXModCksCnQuc3Ryb2tlKCksdGhpcy5kaXNhYmxlQm9yZGVyRGFzaGVzKHQpKSx0LnJlc3RvcmUoKSx2b2lkIDAhPT10aGlzLm9wdGlvbnMubGFiZWwpe3ZhciBsPW4rLjUqdGhpcy5oZWlnaHQrMzt0aGlzLmxhYmVsTW9kdWxlLmRyYXcodCxvLGwscywiaGFuZ2luZyIpfXRoaXMudXBkYXRlQm91bmRpbmdCb3gobyxuKX19LHtrZXk6InVwZGF0ZUJvdW5kaW5nQm94Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMuYm91bmRpbmdCb3gudG9wPWUtdGhpcy5vcHRpb25zLnNpemUsdGhpcy5ib3VuZGluZ0JveC5sZWZ0PXQtdGhpcy5vcHRpb25zLnNpemUsdGhpcy5ib3VuZGluZ0JveC5yaWdodD10K3RoaXMub3B0aW9ucy5zaXplLHRoaXMuYm91bmRpbmdCb3guYm90dG9tPWUrdGhpcy5vcHRpb25zLnNpemUsdm9pZCAwIT09dGhpcy5vcHRpb25zLmxhYmVsJiZ0aGlzLmxhYmVsTW9kdWxlLnNpemUud2lkdGg+MCYmKHRoaXMuYm91bmRpbmdCb3gubGVmdD1NYXRoLm1pbih0aGlzLmJvdW5kaW5nQm94LmxlZnQsdGhpcy5sYWJlbE1vZHVsZS5zaXplLmxlZnQpLHRoaXMuYm91bmRpbmdCb3gucmlnaHQ9TWF0aC5tYXgodGhpcy5ib3VuZGluZ0JveC5yaWdodCx0aGlzLmxhYmVsTW9kdWxlLnNpemUubGVmdCt0aGlzLmxhYmVsTW9kdWxlLnNpemUud2lkdGgpLHRoaXMuYm91bmRpbmdCb3guYm90dG9tPU1hdGgubWF4KHRoaXMuYm91bmRpbmdCb3guYm90dG9tLHRoaXMuYm91bmRpbmdCb3guYm90dG9tK3RoaXMubGFiZWxNb2R1bGUuc2l6ZS5oZWlnaHQrMykpfX1dKSxlfShkLmRlZmF1bHQpO2UuZGVmYXVsdD1sfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIHModCxlKXtpZighdCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiFlfHwib2JqZWN0IiE9dHlwZW9mIGUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlP3Q6ZX1mdW5jdGlvbiByKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgZSk7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxlKTp0Ll9fcHJvdG9fXz1lKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxvJiZ0KGUsbyksZX19KCksaD1pKDc2KSxkPW8oaCksbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4gbih0aGlzLGUpLHModGhpcywoZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuIHIoZSx0KSxhKGUsW3trZXk6InJlc2l6ZSIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5fcmVzaXplU2hhcGUoKX19LHtrZXk6ImRyYXciLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbil7dGhpcy5fZHJhd1NoYXBlKHQsImNpcmNsZSIsMixlLGksbyxuKX19LHtrZXk6ImRpc3RhbmNlVG9Cb3JkZXIiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucmVzaXplKHQpLHRoaXMub3B0aW9ucy5zaXplfX1dKSxlfShkLmRlZmF1bHQpO2UuZGVmYXVsdD1sfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIHModCxlKXtpZighdCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiFlfHwib2JqZWN0IiE9dHlwZW9mIGUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlP3Q6ZX1mdW5jdGlvbiByKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgZSk7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxlKTp0Ll9fcHJvdG9fXz1lKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxvJiZ0KGUsbyksZX19KCksaD1pKDcwKSxkPW8oaCksbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4gbih0aGlzLGUpLHModGhpcywoZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuIHIoZSx0KSxhKGUsW3trZXk6InJlc2l6ZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtpZih2b2lkIDA9PT10aGlzLndpZHRoKXt2YXIgaT10aGlzLmxhYmVsTW9kdWxlLmdldFRleHRTaXplKHQsZSk7dGhpcy5oZWlnaHQ9MippLmhlaWdodCx0aGlzLndpZHRoPWkud2lkdGgrdGhpcy5oZWlnaHQsdGhpcy5yYWRpdXM9LjUqdGhpcy53aWR0aH19fSx7a2V5OiJkcmF3Iix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4pe3RoaXMucmVzaXplKHQsbyksdGhpcy5sZWZ0PWUtLjUqdGhpcy53aWR0aCx0aGlzLnRvcD1pLS41KnRoaXMuaGVpZ2h0O3ZhciBzPXRoaXMub3B0aW9ucy5ib3JkZXJXaWR0aCxyPXRoaXMub3B0aW9ucy5ib3JkZXJXaWR0aFNlbGVjdGVkfHwyKnRoaXMub3B0aW9ucy5ib3JkZXJXaWR0aCxhPShvP3I6cykvdGhpcy5ib2R5LnZpZXcuc2NhbGU7dC5saW5lV2lkdGg9TWF0aC5taW4odGhpcy53aWR0aCxhKSx0LnN0cm9rZVN0eWxlPW8/dGhpcy5vcHRpb25zLmNvbG9yLmhpZ2hsaWdodC5ib3JkZXI6bj90aGlzLm9wdGlvbnMuY29sb3IuaG92ZXIuYm9yZGVyOnRoaXMub3B0aW9ucy5jb2xvci5ib3JkZXIsdC5maWxsU3R5bGU9bz90aGlzLm9wdGlvbnMuY29sb3IuaGlnaGxpZ2h0LmJhY2tncm91bmQ6bj90aGlzLm9wdGlvbnMuY29sb3IuaG92ZXIuYmFja2dyb3VuZDp0aGlzLm9wdGlvbnMuY29sb3IuYmFja2dyb3VuZCx0LmVsbGlwc2UodGhpcy5sZWZ0LHRoaXMudG9wLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpLHRoaXMuZW5hYmxlU2hhZG93KHQpLHQuZmlsbCgpLHRoaXMuZGlzYWJsZVNoYWRvdyh0KSx0LnNhdmUoKSxhPjAmJih0aGlzLmVuYWJsZUJvcmRlckRhc2hlcyh0KSx0LnN0cm9rZSgpLHRoaXMuZGlzYWJsZUJvcmRlckRhc2hlcyh0KSksdC5yZXN0b3JlKCksdGhpcy51cGRhdGVCb3VuZGluZ0JveChlLGksdCxvKSx0aGlzLmxhYmVsTW9kdWxlLmRyYXcodCxlLGksbyl9fSx7a2V5OiJ1cGRhdGVCb3VuZGluZ0JveCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyl7dGhpcy5yZXNpemUoaSxvKSx0aGlzLmxlZnQ9dC0uNSp0aGlzLndpZHRoLHRoaXMudG9wPWUtLjUqdGhpcy5oZWlnaHQsdGhpcy5ib3VuZGluZ0JveC5sZWZ0PXRoaXMubGVmdCx0aGlzLmJvdW5kaW5nQm94LnRvcD10aGlzLnRvcCx0aGlzLmJvdW5kaW5nQm94LmJvdHRvbT10aGlzLnRvcCt0aGlzLmhlaWdodCx0aGlzLmJvdW5kaW5nQm94LnJpZ2h0PXRoaXMubGVmdCt0aGlzLndpZHRofX0se2tleToiZGlzdGFuY2VUb0JvcmRlciIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0aGlzLnJlc2l6ZSh0KTt2YXIgaT0uNSp0aGlzLndpZHRoLG89LjUqdGhpcy5oZWlnaHQsbj1NYXRoLnNpbihlKSppLHM9TWF0aC5jb3MoZSkqbztyZXR1cm4gaSpvL01hdGguc3FydChuKm4rcypzKX19XSksZX0oZC5kZWZhdWx0KTtlLmRlZmF1bHQ9bH0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWZ1bmN0aW9uIG4odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBzKHQsZSl7aWYoIXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hZXx8Im9iamVjdCIhPXR5cGVvZiBlJiYiZnVuY3Rpb24iIT10eXBlb2YgZT90OmV9ZnVuY3Rpb24gcih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIGUpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHQsZSk6dC5fX3Byb3RvX189ZSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBvJiYoby53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsby5rZXksbyl9fXJldHVybiBmdW5jdGlvbihlLGksbyl7cmV0dXJuIGkmJnQoZS5wcm90b3R5cGUsaSksbyYmdChlLG8pLGV9fSgpLGg9aSg3MCksZD1vKGgpLGw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyl7cmV0dXJuIG4odGhpcyxlKSxzKHRoaXMsKGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSkpLmNhbGwodGhpcyx0LGksbykpfXJldHVybiByKGUsdCksYShlLFt7a2V5OiJyZXNpemUiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXRoaXMud2lkdGgpe3ZhciBlPTUsaT17d2lkdGg6TnVtYmVyKHRoaXMub3B0aW9ucy5pY29uLnNpemUpLGhlaWdodDpOdW1iZXIodGhpcy5vcHRpb25zLmljb24uc2l6ZSl9O3RoaXMud2lkdGg9aS53aWR0aCsyKmUsdGhpcy5oZWlnaHQ9aS5oZWlnaHQrMiplLHRoaXMucmFkaXVzPS41KnRoaXMud2lkdGh9fX0se2tleToiZHJhdyIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuKXtpZih0aGlzLnJlc2l6ZSh0KSx0aGlzLm9wdGlvbnMuaWNvbi5zaXplPXRoaXMub3B0aW9ucy5pY29uLnNpemV8fDUwLHRoaXMubGVmdD1lLS41KnRoaXMud2lkdGgsdGhpcy50b3A9aS0uNSp0aGlzLmhlaWdodCx0aGlzLl9pY29uKHQsZSxpLG8pLHZvaWQgMCE9PXRoaXMub3B0aW9ucy5sYWJlbCl7dmFyIHM9NTt0aGlzLmxhYmVsTW9kdWxlLmRyYXcodCxlLGkrLjUqdGhpcy5oZWlnaHQrcyxvKX10aGlzLnVwZGF0ZUJvdW5kaW5nQm94KGUsaSl9fSx7a2V5OiJ1cGRhdGVCb3VuZGluZ0JveCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtpZih0aGlzLmJvdW5kaW5nQm94LnRvcD1lLS41KnRoaXMub3B0aW9ucy5pY29uLnNpemUsdGhpcy5ib3VuZGluZ0JveC5sZWZ0PXQtLjUqdGhpcy5vcHRpb25zLmljb24uc2l6ZSx0aGlzLmJvdW5kaW5nQm94LnJpZ2h0PXQrLjUqdGhpcy5vcHRpb25zLmljb24uc2l6ZSx0aGlzLmJvdW5kaW5nQm94LmJvdHRvbT1lKy41KnRoaXMub3B0aW9ucy5pY29uLnNpemUsdm9pZCAwIT09dGhpcy5vcHRpb25zLmxhYmVsJiZ0aGlzLmxhYmVsTW9kdWxlLnNpemUud2lkdGg+MCl7dmFyIGk9NTt0aGlzLmJvdW5kaW5nQm94LmxlZnQ9TWF0aC5taW4odGhpcy5ib3VuZGluZ0JveC5sZWZ0LHRoaXMubGFiZWxNb2R1bGUuc2l6ZS5sZWZ0KSx0aGlzLmJvdW5kaW5nQm94LnJpZ2h0PU1hdGgubWF4KHRoaXMuYm91bmRpbmdCb3gucmlnaHQsdGhpcy5sYWJlbE1vZHVsZS5zaXplLmxlZnQrdGhpcy5sYWJlbE1vZHVsZS5zaXplLndpZHRoKSx0aGlzLmJvdW5kaW5nQm94LmJvdHRvbT1NYXRoLm1heCh0aGlzLmJvdW5kaW5nQm94LmJvdHRvbSx0aGlzLmJvdW5kaW5nQm94LmJvdHRvbSt0aGlzLmxhYmVsTW9kdWxlLnNpemUuaGVpZ2h0K2kpfX19LHtrZXk6Il9pY29uIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvKXt2YXIgbj1OdW1iZXIodGhpcy5vcHRpb25zLmljb24uc2l6ZSk7dm9pZCAwIT09dGhpcy5vcHRpb25zLmljb24uY29kZT8odC5mb250PShvPyJib2xkICI6IiIpK24rInB4ICIrdGhpcy5vcHRpb25zLmljb24uZmFjZSx0LmZpbGxTdHlsZT10aGlzLm9wdGlvbnMuaWNvbi5jb2xvcnx8ImJsYWNrIix0LnRleHRBbGlnbj0iY2VudGVyIix0LnRleHRCYXNlbGluZT0ibWlkZGxlIix0aGlzLmVuYWJsZVNoYWRvdyh0KSx0LmZpbGxUZXh0KHRoaXMub3B0aW9ucy5pY29uLmNvZGUsZSxpKSx0aGlzLmRpc2FibGVTaGFkb3codCkpOmNvbnNvbGUuZXJyb3IoIldoZW4gdXNpbmcgdGhlIGljb24gc2hhcGUsIHlvdSBuZWVkIHRvIGRlZmluZSB0aGUgY29kZSBpbiB0aGUgaWNvbiBvcHRpb25zIG9iamVjdC4gVGhpcyBjYW4gYmUgZG9uZSBwZXIgbm9kZSBvciBnbG9iYWxseS4iKX19LHtrZXk6ImRpc3RhbmNlVG9Cb3JkZXIiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2Rpc3RhbmNlVG9Cb3JkZXIodCxlKX19XSksZX0oZC5kZWZhdWx0KTtlLmRlZmF1bHQ9bH0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWZ1bmN0aW9uIG4odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBzKHQsZSl7aWYoIXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hZXx8Im9iamVjdCIhPXR5cGVvZiBlJiYiZnVuY3Rpb24iIT10eXBlb2YgZT90OmV9ZnVuY3Rpb24gcih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIGUpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHQsZSk6dC5fX3Byb3RvX189ZSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBvJiYoby53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsby5rZXksbyl9fXJldHVybiBmdW5jdGlvbihlLGksbyl7cmV0dXJuIGkmJnQoZS5wcm90b3R5cGUsaSksbyYmdChlLG8pLGV9fSgpLGg9aSg3MiksZD1vKGgpLGw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyxyKXtuKHRoaXMsZSk7dmFyIGE9cyh0aGlzLChlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpKS5jYWxsKHRoaXMsdCxpLG8pKTtyZXR1cm4gYS5pbWFnZU9iaj1yLGF9cmV0dXJuIHIoZSx0KSxhKGUsW3trZXk6InJlc2l6ZSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLl9yZXNpemVJbWFnZSgpfX0se2tleToiZHJhdyIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuKXtpZih0aGlzLnJlc2l6ZSgpLHRoaXMubGVmdD1lLXRoaXMud2lkdGgvMix0aGlzLnRvcD1pLXRoaXMuaGVpZ2h0LzIsdGhpcy5vcHRpb25zLnNoYXBlUHJvcGVydGllcy51c2VCb3JkZXJXaXRoSW1hZ2U9PT0hMCl7dmFyIHM9dGhpcy5vcHRpb25zLmJvcmRlcldpZHRoLHI9dGhpcy5vcHRpb25zLmJvcmRlcldpZHRoU2VsZWN0ZWR8fDIqdGhpcy5vcHRpb25zLmJvcmRlcldpZHRoLGE9KG8/cjpzKS90aGlzLmJvZHkudmlldy5zY2FsZTt0LmxpbmVXaWR0aD1NYXRoLm1pbih0aGlzLndpZHRoLGEpLHQuYmVnaW5QYXRoKCksdC5zdHJva2VTdHlsZT1vP3RoaXMub3B0aW9ucy5jb2xvci5oaWdobGlnaHQuYm9yZGVyOm4/dGhpcy5vcHRpb25zLmNvbG9yLmhvdmVyLmJvcmRlcjp0aGlzLm9wdGlvbnMuY29sb3IuYm9yZGVyLHQuZmlsbFN0eWxlPW8/dGhpcy5vcHRpb25zLmNvbG9yLmhpZ2hsaWdodC5iYWNrZ3JvdW5kOm4/dGhpcy5vcHRpb25zLmNvbG9yLmhvdmVyLmJhY2tncm91bmQ6dGhpcy5vcHRpb25zLmNvbG9yLmJhY2tncm91bmQsdC5yZWN0KHRoaXMubGVmdC0uNSp0LmxpbmVXaWR0aCx0aGlzLnRvcC0uNSp0LmxpbmVXaWR0aCx0aGlzLndpZHRoK3QubGluZVdpZHRoLHRoaXMuaGVpZ2h0K3QubGluZVdpZHRoKSx0LmZpbGwoKSx0LnNhdmUoKSxhPjAmJih0aGlzLmVuYWJsZUJvcmRlckRhc2hlcyh0KSx0LnN0cm9rZSgpLHRoaXMuZGlzYWJsZUJvcmRlckRhc2hlcyh0KSksdC5yZXN0b3JlKCksdC5jbG9zZVBhdGgoKX10aGlzLl9kcmF3SW1hZ2VBdFBvc2l0aW9uKHQpLHRoaXMuX2RyYXdJbWFnZUxhYmVsKHQsZSxpLG98fG4pLHRoaXMudXBkYXRlQm91bmRpbmdCb3goZSxpKX19LHtrZXk6InVwZGF0ZUJvdW5kaW5nQm94Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMucmVzaXplKCksdGhpcy5sZWZ0PXQtdGhpcy53aWR0aC8yLHRoaXMudG9wPWUtdGhpcy5oZWlnaHQvMix0aGlzLmJvdW5kaW5nQm94LnRvcD10aGlzLnRvcCx0aGlzLmJvdW5kaW5nQm94LmxlZnQ9dGhpcy5sZWZ0LHRoaXMuYm91bmRpbmdCb3gucmlnaHQ9dGhpcy5sZWZ0K3RoaXMud2lkdGgsdGhpcy5ib3VuZGluZ0JveC5ib3R0b209dGhpcy50b3ArdGhpcy5oZWlnaHQsdm9pZCAwIT09dGhpcy5vcHRpb25zLmxhYmVsJiZ0aGlzLmxhYmVsTW9kdWxlLnNpemUud2lkdGg+MCYmKHRoaXMuYm91bmRpbmdCb3gubGVmdD1NYXRoLm1pbih0aGlzLmJvdW5kaW5nQm94LmxlZnQsdGhpcy5sYWJlbE1vZHVsZS5zaXplLmxlZnQpLHRoaXMuYm91bmRpbmdCb3gucmlnaHQ9TWF0aC5tYXgodGhpcy5ib3VuZGluZ0JveC5yaWdodCx0aGlzLmxhYmVsTW9kdWxlLnNpemUubGVmdCt0aGlzLmxhYmVsTW9kdWxlLnNpemUud2lkdGgpLHRoaXMuYm91bmRpbmdCb3guYm90dG9tPU1hdGgubWF4KHRoaXMuYm91bmRpbmdCb3guYm90dG9tLHRoaXMuYm91bmRpbmdCb3guYm90dG9tK3RoaXMubGFiZWxPZmZzZXQpKX19LHtrZXk6ImRpc3RhbmNlVG9Cb3JkZXIiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2Rpc3RhbmNlVG9Cb3JkZXIodCxlKX19XSksZX0oZC5kZWZhdWx0KTtlLmRlZmF1bHQ9bH0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWZ1bmN0aW9uIG4odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBzKHQsZSl7aWYoIXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hZXx8Im9iamVjdCIhPXR5cGVvZiBlJiYiZnVuY3Rpb24iIT10eXBlb2YgZT90OmV9ZnVuY3Rpb24gcih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIGUpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHQsZSk6dC5fX3Byb3RvX189ZSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBvJiYoby53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsby5rZXksbyl9fXJldHVybiBmdW5jdGlvbihlLGksbyl7cmV0dXJuIGkmJnQoZS5wcm90b3R5cGUsaSksbyYmdChlLG8pLGV9fSgpLGg9aSg3NiksZD1vKGgpLGw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyl7cmV0dXJuIG4odGhpcyxlKSxzKHRoaXMsKGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSkpLmNhbGwodGhpcyx0LGksbykpfXJldHVybiByKGUsdCksYShlLFt7a2V5OiJyZXNpemUiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5fcmVzaXplU2hhcGUoKX19LHtrZXk6ImRyYXciLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbil7dGhpcy5fZHJhd1NoYXBlKHQsInNxdWFyZSIsMixlLGksbyxuKX19LHtrZXk6ImRpc3RhbmNlVG9Cb3JkZXIiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2Rpc3RhbmNlVG9Cb3JkZXIodCxlKX19XSksZX0oZC5kZWZhdWx0KTtlLmRlZmF1bHQ9bH0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWZ1bmN0aW9uIG4odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBzKHQsZSl7aWYoIXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hZXx8Im9iamVjdCIhPXR5cGVvZiBlJiYiZnVuY3Rpb24iIT10eXBlb2YgZT90OmV9ZnVuY3Rpb24gcih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIGUpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHQsZSk6dC5fX3Byb3RvX189ZSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBvJiYoby53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsby5rZXksbyl9fXJldHVybiBmdW5jdGlvbihlLGksbyl7cmV0dXJuIGkmJnQoZS5wcm90b3R5cGUsaSksbyYmdChlLG8pLGV9fSgpLGg9aSg3NiksZD1vKGgpLGw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyl7cmV0dXJuIG4odGhpcyxlKSxzKHRoaXMsKGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSkpLmNhbGwodGhpcyx0LGksbykpfXJldHVybiByKGUsdCksYShlLFt7a2V5OiJyZXNpemUiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuX3Jlc2l6ZVNoYXBlKCl9fSx7a2V5OiJkcmF3Iix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4pe3RoaXMuX2RyYXdTaGFwZSh0LCJzdGFyIiw0LGUsaSxvLG4pfX0se2tleToiZGlzdGFuY2VUb0JvcmRlciIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZGlzdGFuY2VUb0JvcmRlcih0LGUpfX1dKSxlfShkLmRlZmF1bHQpO2UuZGVmYXVsdD1sfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIHModCxlKXtpZighdCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiFlfHwib2JqZWN0IiE9dHlwZW9mIGUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlP3Q6ZX1mdW5jdGlvbiByKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgZSk7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxlKTp0Ll9fcHJvdG9fXz1lKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxvJiZ0KGUsbyksZX19KCksaD1pKDcwKSxkPW8oaCksbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4gbih0aGlzLGUpLHModGhpcywoZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuIHIoZSx0KSxhKGUsW3trZXk6InJlc2l6ZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtpZih2b2lkIDA9PT10aGlzLndpZHRoKXt2YXIgaT01LG89dGhpcy5sYWJlbE1vZHVsZS5nZXRUZXh0U2l6ZSh0LGUpO3RoaXMud2lkdGg9by53aWR0aCsyKmksdGhpcy5oZWlnaHQ9by5oZWlnaHQrMippLHRoaXMucmFkaXVzPS41KnRoaXMud2lkdGh9fX0se2tleToiZHJhdyIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuKXt0aGlzLnJlc2l6ZSh0LG98fG4pLHRoaXMubGVmdD1lLXRoaXMud2lkdGgvMix0aGlzLnRvcD1pLXRoaXMuaGVpZ2h0LzIsdGhpcy5lbmFibGVTaGFkb3codCksdGhpcy5sYWJlbE1vZHVsZS5kcmF3KHQsZSxpLG98fG4pLHRoaXMuZGlzYWJsZVNoYWRvdyh0KSx0aGlzLnVwZGF0ZUJvdW5kaW5nQm94KGUsaSx0LG8pfX0se2tleToidXBkYXRlQm91bmRpbmdCb3giLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8pe3RoaXMucmVzaXplKGksbyksdGhpcy5sZWZ0PXQtdGhpcy53aWR0aC8yLHRoaXMudG9wPWUtdGhpcy5oZWlnaHQvMix0aGlzLmJvdW5kaW5nQm94LnRvcD10aGlzLnRvcCx0aGlzLmJvdW5kaW5nQm94LmxlZnQ9dGhpcy5sZWZ0LHRoaXMuYm91bmRpbmdCb3gucmlnaHQ9dGhpcy5sZWZ0K3RoaXMud2lkdGgsdGhpcy5ib3VuZGluZ0JveC5ib3R0b209dGhpcy50b3ArdGhpcy5oZWlnaHR9fSx7a2V5OiJkaXN0YW5jZVRvQm9yZGVyIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9kaXN0YW5jZVRvQm9yZGVyKHQsZSl9fV0pLGV9KGQuZGVmYXVsdCk7ZS5kZWZhdWx0PWx9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1mdW5jdGlvbiBuKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gcyh0LGUpe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIWV8fCJvYmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU/dDplfWZ1bmN0aW9uIHIodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiBlKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LGUpOnQuX19wcm90b19fPWUpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG8pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG8mJnQoZSxvKSxlfX0oKSxoPWkoNzYpLGQ9byhoKSxsPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG8pe3JldHVybiBuKHRoaXMsZSkscyh0aGlzLChlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpKS5jYWxsKHRoaXMsdCxpLG8pKX1yZXR1cm4gcihlLHQpLGEoZSxbe2tleToicmVzaXplIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLl9yZXNpemVTaGFwZSgpfX0se2tleToiZHJhdyIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuKXt0aGlzLl9kcmF3U2hhcGUodCwidHJpYW5nbGUiLDMsZSxpLG8sbil9fSx7a2V5OiJkaXN0YW5jZVRvQm9yZGVyIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9kaXN0YW5jZVRvQm9yZGVyKHQsZSl9fV0pLGV9KGQuZGVmYXVsdCk7ZS5kZWZhdWx0PWx9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1mdW5jdGlvbiBuKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gcyh0LGUpe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIWV8fCJvYmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU/dDplfWZ1bmN0aW9uIHIodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiBlKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LGUpOnQuX19wcm90b19fPWUpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG8pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG8mJnQoZSxvKSxlfX0oKSxoPWkoNzYpLGQ9byhoKSxsPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG8pe3JldHVybiBuKHRoaXMsZSkscyh0aGlzLChlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpKS5jYWxsKHRoaXMsdCxpLG8pKX1yZXR1cm4gcihlLHQpLGEoZSxbe2tleToicmVzaXplIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLl9yZXNpemVTaGFwZSgpfX0se2tleToiZHJhdyIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuKXt0aGlzLl9kcmF3U2hhcGUodCwidHJpYW5nbGVEb3duIiwzLGUsaSxvLG4pfX0se2tleToiZGlzdGFuY2VUb0JvcmRlciIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZGlzdGFuY2VUb0JvcmRlcih0LGUpfX1dKSxlfShkLmRlZmF1bHQpO2UuZGVmYXVsdD1sfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG8pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG8mJnQoZSxvKSxlfX0oKSxyPWkoODcpLGE9byhyKSxoPWkoNjgpLGQ9byhoKSxsPWkoMSksYz1pKDkpLHU9aSgxMSkscD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxpLG8pe3ZhciBzPXRoaXM7bih0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMuaW1hZ2VzPWksdGhpcy5ncm91cHM9byx0aGlzLmJvZHkuZnVuY3Rpb25zLmNyZWF0ZUVkZ2U9dGhpcy5jcmVhdGUuYmluZCh0aGlzKSx0aGlzLmVkZ2VzTGlzdGVuZXJzPXthZGQ6ZnVuY3Rpb24odCxlKXtzLmFkZChlLml0ZW1zKX0sdXBkYXRlOmZ1bmN0aW9uKHQsZSl7cy51cGRhdGUoZS5pdGVtcyl9LHJlbW92ZTpmdW5jdGlvbih0LGUpe3MucmVtb3ZlKGUuaXRlbXMpfX0sdGhpcy5vcHRpb25zPXt9LHRoaXMuZGVmYXVsdE9wdGlvbnM9e2Fycm93czp7dG86e2VuYWJsZWQ6ITEsc2NhbGVGYWN0b3I6MSx0eXBlOiJhcnJvdyJ9LG1pZGRsZTp7ZW5hYmxlZDohMSxzY2FsZUZhY3RvcjoxLHR5cGU6ImFycm93In0sZnJvbTp7ZW5hYmxlZDohMSxzY2FsZUZhY3RvcjoxLHR5cGU6ImFycm93In19LGFycm93U3RyaWtldGhyb3VnaDohMCxjb2xvcjp7Y29sb3I6IiM4NDg0ODQiLGhpZ2hsaWdodDoiIzg0ODQ4NCIsaG92ZXI6IiM4NDg0ODQiLGluaGVyaXQ6ImZyb20iLG9wYWNpdHk6MX0sZGFzaGVzOiExLGZvbnQ6e2NvbG9yOiIjMzQzNDM0IixzaXplOjE0LGZhY2U6ImFyaWFsIixiYWNrZ3JvdW5kOiJub25lIixzdHJva2VXaWR0aDoyLHN0cm9rZUNvbG9yOiIjZmZmZmZmIixhbGlnbjoiaG9yaXpvbnRhbCJ9LGhpZGRlbjohMSxob3ZlcldpZHRoOjEuNSxsYWJlbDp2b2lkIDAsbGFiZWxIaWdobGlnaHRCb2xkOiEwLGxlbmd0aDp2b2lkIDAscGh5c2ljczohMCxzY2FsaW5nOnttaW46MSxtYXg6MTUsbGFiZWw6e2VuYWJsZWQ6ITAsbWluOjE0LG1heDozMCxtYXhWaXNpYmxlOjMwLGRyYXdUaHJlc2hvbGQ6NX0sY3VzdG9tU2NhbGluZ0Z1bmN0aW9uOmZ1bmN0aW9uKHQsZSxpLG8pe2lmKGU9PT10KXJldHVybi41O3ZhciBuPTEvKGUtdCk7cmV0dXJuIE1hdGgubWF4KDAsKG8tdCkqbil9fSxzZWxlY3Rpb25XaWR0aDoxLjUsc2VsZlJlZmVyZW5jZVNpemU6MjAsc2hhZG93OntlbmFibGVkOiExLGNvbG9yOiJyZ2JhKDAsMCwwLDAuNSkiLHNpemU6MTAseDo1LHk6NX0sc21vb3RoOntlbmFibGVkOiEwLHR5cGU6ImR5bmFtaWMiLGZvcmNlRGlyZWN0aW9uOiJub25lIixyb3VuZG5lc3M6LjV9LHRpdGxlOnZvaWQgMCx3aWR0aDoxLHZhbHVlOnZvaWQgMH0sbC5leHRlbmQodGhpcy5vcHRpb25zLHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMuYmluZEV2ZW50TGlzdGVuZXJzKCl9cmV0dXJuIHModCxbe2tleToiYmluZEV2ZW50TGlzdGVuZXJzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5ib2R5LmVtaXR0ZXIub24oIl9mb3JjZURpc2FibGVEeW5hbWljQ3VydmVzIixmdW5jdGlvbihlKXsiZHluYW1pYyI9PT1lJiYoZT0iY29udGludW91cyIpO3ZhciBpPSExO2Zvcih2YXIgbyBpbiB0LmJvZHkuZWRnZXMpaWYodC5ib2R5LmVkZ2VzLmhhc093blByb3BlcnR5KG8pKXt2YXIgbj10LmJvZHkuZWRnZXNbb10scz10LmJvZHkuZGF0YS5lZGdlcy5fZGF0YVtvXTtpZih2b2lkIDAhPT1zKXt2YXIgcj1zLnNtb290aDt2b2lkIDAhPT1yJiZyLmVuYWJsZWQ9PT0hMCYmImR5bmFtaWMiPT09ci50eXBlJiYodm9pZCAwPT09ZT9uLnNldE9wdGlvbnMoe3Ntb290aDohMX0pOm4uc2V0T3B0aW9ucyh7c21vb3RoOnt0eXBlOmV9fSksaT0hMCl9fWk9PT0hMCYmdC5ib2R5LmVtaXR0ZXIuZW1pdCgiX2RhdGFDaGFuZ2VkIil9KSx0aGlzLmJvZHkuZW1pdHRlci5vbigiX2RhdGFVcGRhdGVkIixmdW5jdGlvbigpe3QucmVjb25uZWN0RWRnZXMoKSx0Lm1hcmtBbGxFZGdlc0FzRGlydHkoKX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJyZWZyZXNoRWRnZXMiLHRoaXMucmVmcmVzaC5iaW5kKHRoaXMpKSx0aGlzLmJvZHkuZW1pdHRlci5vbigicmVmcmVzaCIsdGhpcy5yZWZyZXNoLmJpbmQodGhpcykpLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJkZXN0cm95IixmdW5jdGlvbigpe2wuZm9yRWFjaCh0LmVkZ2VzTGlzdGVuZXJzLGZ1bmN0aW9uKGUsaSl7dC5ib2R5LmRhdGEuZWRnZXMmJnQuYm9keS5kYXRhLmVkZ2VzLm9mZihpLGUpfSksZGVsZXRlIHQuYm9keS5mdW5jdGlvbnMuY3JlYXRlRWRnZSxkZWxldGUgdC5lZGdlc0xpc3RlbmVycy5hZGQsZGVsZXRlIHQuZWRnZXNMaXN0ZW5lcnMudXBkYXRlLGRlbGV0ZSB0LmVkZ2VzTGlzdGVuZXJzLnJlbW92ZSxkZWxldGUgdC5lZGdlc0xpc3RlbmVyc30pfX0se2tleToic2V0T3B0aW9ucyIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09dCl7YS5kZWZhdWx0LnBhcnNlT3B0aW9ucyh0aGlzLm9wdGlvbnMsdCksdm9pZCAwIT09dC5jb2xvciYmdGhpcy5tYXJrQWxsRWRnZXNBc0RpcnR5KCk7dmFyIGU9ITE7aWYodm9pZCAwIT09dC5zbW9vdGgpZm9yKHZhciBpIGluIHRoaXMuYm9keS5lZGdlcyl0aGlzLmJvZHkuZWRnZXMuaGFzT3duUHJvcGVydHkoaSkmJihlPXRoaXMuYm9keS5lZGdlc1tpXS51cGRhdGVFZGdlVHlwZSgpfHxlKTtpZih2b2lkIDAhPT10LmZvbnQpe2QuZGVmYXVsdC5wYXJzZU9wdGlvbnModGhpcy5vcHRpb25zLmZvbnQsdCk7Zm9yKHZhciBvIGluIHRoaXMuYm9keS5lZGdlcyl0aGlzLmJvZHkuZWRnZXMuaGFzT3duUHJvcGVydHkobykmJnRoaXMuYm9keS5lZGdlc1tvXS51cGRhdGVMYWJlbE1vZHVsZSgpfXZvaWQgMD09PXQuaGlkZGVuJiZ2b2lkIDA9PT10LnBoeXNpY3MmJmUhPT0hMHx8dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX2RhdGFDaGFuZ2VkIil9fX0se2tleToic2V0RGF0YSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxpPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV0sbz10aGlzLmJvZHkuZGF0YS5lZGdlcztpZih0IGluc3RhbmNlb2YgY3x8dCBpbnN0YW5jZW9mIHUpdGhpcy5ib2R5LmRhdGEuZWRnZXM9dDtlbHNlIGlmKEFycmF5LmlzQXJyYXkodCkpdGhpcy5ib2R5LmRhdGEuZWRnZXM9bmV3IGMsdGhpcy5ib2R5LmRhdGEuZWRnZXMuYWRkKHQpO2Vsc2V7aWYodCl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcnJheSBvciBEYXRhU2V0IGV4cGVjdGVkIik7dGhpcy5ib2R5LmRhdGEuZWRnZXM9bmV3IGN9aWYobyYmbC5mb3JFYWNoKHRoaXMuZWRnZXNMaXN0ZW5lcnMsZnVuY3Rpb24odCxlKXtvLm9mZihlLHQpfSksdGhpcy5ib2R5LmVkZ2VzPXt9LHRoaXMuYm9keS5kYXRhLmVkZ2VzKXtsLmZvckVhY2godGhpcy5lZGdlc0xpc3RlbmVycyxmdW5jdGlvbih0LGkpe2UuYm9keS5kYXRhLmVkZ2VzLm9uKGksdCl9KTt2YXIgbj10aGlzLmJvZHkuZGF0YS5lZGdlcy5nZXRJZHMoKTt0aGlzLmFkZChuLCEwKX1pPT09ITEmJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9kYXRhQ2hhbmdlZCIpfX0se2tleToiYWRkIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSxpPXRoaXMuYm9keS5lZGdlcyxvPXRoaXMuYm9keS5kYXRhLmVkZ2VzLG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHM9dFtuXSxyPWlbc107ciYmci5kaXNjb25uZWN0KCk7dmFyIGE9by5nZXQocyx7c2hvd0ludGVybmFsSWRzOiEwfSk7aVtzXT10aGlzLmNyZWF0ZShhKX1lPT09ITEmJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9kYXRhQ2hhbmdlZCIpfX0se2tleToidXBkYXRlIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5ib2R5LmVkZ2VzLGk9dGhpcy5ib2R5LmRhdGEuZWRnZXMsbz0hMSxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBzPXRbbl0scj1pLmdldChzKSxhPWVbc107dm9pZCAwIT09YT8oYS5kaXNjb25uZWN0KCksbz1hLnNldE9wdGlvbnMocil8fG8sYS5jb25uZWN0KCkpOih0aGlzLmJvZHkuZWRnZXNbc109dGhpcy5jcmVhdGUociksbz0hMCl9bz09PSEwP3RoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9kYXRhQ2hhbmdlZCIpOnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9kYXRhVXBkYXRlZCIpfX0se2tleToicmVtb3ZlIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5ib2R5LmVkZ2VzLGk9MDtpPHQubGVuZ3RoO2krKyl7dmFyIG89dFtpXSxuPWVbb107dm9pZCAwIT09biYmKG4uY2xlYW51cCgpLG4uZGlzY29ubmVjdCgpLGRlbGV0ZSBlW29dKX10aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfZGF0YUNoYW5nZWQiKX19LHtrZXk6InJlZnJlc2giLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5ib2R5LmVkZ2VzO2Zvcih2YXIgZSBpbiB0KXt2YXIgaT12b2lkIDA7dC5oYXNPd25Qcm9wZXJ0eShlKSYmKGk9dFtlXSk7dmFyIG89dGhpcy5ib2R5LmRhdGEuZWRnZXMuX2RhdGFbZV07dm9pZCAwIT09aSYmdm9pZCAwIT09byYmaS5zZXRPcHRpb25zKG8pfX19LHtrZXk6ImNyZWF0ZSIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBhLmRlZmF1bHQodCx0aGlzLmJvZHksdGhpcy5vcHRpb25zKX19LHtrZXk6Im1hcmtBbGxFZGdlc0FzRGlydHkiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuYm9keS5lZGdlcyl0aGlzLmJvZHkuZWRnZXNbdF0uZWRnZVR5cGUuY29sb3JEaXJ0eT0hMH19LHtrZXk6InJlY29ubmVjdEVkZ2VzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5ib2R5Lm5vZGVzLGk9dGhpcy5ib2R5LmVkZ2VzO2Zvcih0IGluIGUpZS5oYXNPd25Qcm9wZXJ0eSh0KSYmKGVbdF0uZWRnZXM9W10pO2Zvcih0IGluIGkpaWYoaS5oYXNPd25Qcm9wZXJ0eSh0KSl7dmFyIG89aVt0XTtvLmZyb209bnVsbCxvLnRvPW51bGwsby5jb25uZWN0KCl9fX0se2tleToiZ2V0Q29ubmVjdGVkTm9kZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPVtdO2lmKHZvaWQgMCE9PXRoaXMuYm9keS5lZGdlc1t0XSl7dmFyIGk9dGhpcy5ib2R5LmVkZ2VzW3RdO2kuZnJvbUlkJiZlLnB1c2goaS5mcm9tSWQpLGkudG9JZCYmZS5wdXNoKGkudG9JZCl9cmV0dXJuIGV9fV0pLHR9KCk7ZS5kZWZhdWx0PXB9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1mdW5jdGlvbiBuKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSxyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBvJiYoby53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsby5rZXksbyl9fXJldHVybiBmdW5jdGlvbihlLGksbyl7cmV0dXJuIGkmJnQoZS5wcm90b3R5cGUsaSksbyYmdChlLG8pLGV9fSgpLGE9aSg2OCksaD1vKGEpLGQ9aSg4OCksbD1vKGQpLGM9aSg5MiksdT1vKGMpLHA9aSg5MyksZj1vKHApLG09aSg5NCksdj1vKG0pLGc9aSgxKSx5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGksbyl7aWYobih0aGlzLHQpLHZvaWQgMD09PWkpdGhyb3ciTm8gYm9keSBwcm92aWRlZCI7dGhpcy5vcHRpb25zPWcuYnJpZGdlT2JqZWN0KG8pLHRoaXMuZ2xvYmFsT3B0aW9ucz1vLHRoaXMuYm9keT1pLHRoaXMuaWQ9dm9pZCAwLHRoaXMuZnJvbUlkPXZvaWQgMCx0aGlzLnRvSWQ9dm9pZCAwLHRoaXMuc2VsZWN0ZWQ9ITEsdGhpcy5ob3Zlcj0hMSx0aGlzLmxhYmVsRGlydHk9ITAsdGhpcy5jb2xvckRpcnR5PSEwLHRoaXMuYmFzZVdpZHRoPXRoaXMub3B0aW9ucy53aWR0aCx0aGlzLmJhc2VGb250U2l6ZT10aGlzLm9wdGlvbnMuZm9udC5zaXplLHRoaXMuZnJvbT12b2lkIDAsdGhpcy50bz12b2lkIDAsdGhpcy5lZGdlVHlwZT12b2lkIDAsdGhpcy5jb25uZWN0ZWQ9ITEsdGhpcy5sYWJlbE1vZHVsZT1uZXcgaC5kZWZhdWx0KHRoaXMuYm9keSx0aGlzLm9wdGlvbnMsITApLHRoaXMuc2V0T3B0aW9ucyhlKX1yZXR1cm4gcih0LFt7a2V5OiJzZXRPcHRpb25zIix2YWx1ZTpmdW5jdGlvbihlKXtpZihlKXt0aGlzLmNvbG9yRGlydHk9ITAsdC5wYXJzZU9wdGlvbnModGhpcy5vcHRpb25zLGUsITAsdGhpcy5nbG9iYWxPcHRpb25zKSx2b2lkIDAhPT1lLmlkJiYodGhpcy5pZD1lLmlkKSx2b2lkIDAhPT1lLmZyb20mJih0aGlzLmZyb21JZD1lLmZyb20pLHZvaWQgMCE9PWUudG8mJih0aGlzLnRvSWQ9ZS50byksdm9pZCAwIT09ZS50aXRsZSYmKHRoaXMudGl0bGU9ZS50aXRsZSksdm9pZCAwIT09ZS52YWx1ZSYmKGUudmFsdWU9cGFyc2VGbG9hdChlLnZhbHVlKSksdGhpcy51cGRhdGVMYWJlbE1vZHVsZSgpO3ZhciBpPXRoaXMudXBkYXRlRWRnZVR5cGUoKTtyZXR1cm4gdGhpcy5fc2V0SW50ZXJhY3Rpb25XaWR0aHMoKSx0aGlzLmNvbm5lY3QoKSx2b2lkIDA9PT1lLmhpZGRlbiYmdm9pZCAwPT09ZS5waHlzaWNzfHwoaT0hMCksaX19fSx7a2V5OiJ1cGRhdGVMYWJlbE1vZHVsZSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmxhYmVsTW9kdWxlLnNldE9wdGlvbnModGhpcy5vcHRpb25zLCEwKSx2b2lkIDAhPT10aGlzLmxhYmVsTW9kdWxlLmJhc2VTaXplJiYodGhpcy5iYXNlRm9udFNpemU9dGhpcy5sYWJlbE1vZHVsZS5iYXNlU2l6ZSl9fSx7a2V5OiJ1cGRhdGVFZGdlVHlwZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0hMSxlPSEwLGk9dGhpcy5vcHRpb25zLnNtb290aDtyZXR1cm4gdm9pZCAwIT09dGhpcy5lZGdlVHlwZSYmKHRoaXMuZWRnZVR5cGUgaW5zdGFuY2VvZiB1LmRlZmF1bHQmJmkuZW5hYmxlZD09PSEwJiYiZHluYW1pYyI9PT1pLnR5cGUmJihlPSExKSx0aGlzLmVkZ2VUeXBlIGluc3RhbmNlb2YgbC5kZWZhdWx0JiZpLmVuYWJsZWQ9PT0hMCYmImN1YmljQmV6aWVyIj09PWkudHlwZSYmKGU9ITEpLHRoaXMuZWRnZVR5cGUgaW5zdGFuY2VvZiBmLmRlZmF1bHQmJmkuZW5hYmxlZD09PSEwJiYiZHluYW1pYyIhPT1pLnR5cGUmJiJjdWJpY0JlemllciIhPT1pLnR5cGUmJihlPSExKSx0aGlzLmVkZ2VUeXBlIGluc3RhbmNlb2Ygdi5kZWZhdWx0JiZpLmVuYWJsZWQ9PT0hMSYmKGU9ITEpLGU9PT0hMCYmKHQ9dGhpcy5jbGVhbnVwKCkpKSxlPT09ITA/dGhpcy5vcHRpb25zLnNtb290aC5lbmFibGVkPT09ITA/ImR5bmFtaWMiPT09dGhpcy5vcHRpb25zLnNtb290aC50eXBlPyh0PSEwLHRoaXMuZWRnZVR5cGU9bmV3IHUuZGVmYXVsdCh0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpKToiY3ViaWNCZXppZXIiPT09dGhpcy5vcHRpb25zLnNtb290aC50eXBlP3RoaXMuZWRnZVR5cGU9bmV3IGwuZGVmYXVsdCh0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpOnRoaXMuZWRnZVR5cGU9bmV3IGYuZGVmYXVsdCh0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpOnRoaXMuZWRnZVR5cGU9bmV3IHYuZGVmYXVsdCh0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpOnRoaXMuZWRnZVR5cGUuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMpLHR9fSx7a2V5OiJjb25uZWN0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuZGlzY29ubmVjdCgpLHRoaXMuZnJvbT10aGlzLmJvZHkubm9kZXNbdGhpcy5mcm9tSWRdfHx2b2lkIDAsdGhpcy50bz10aGlzLmJvZHkubm9kZXNbdGhpcy50b0lkXXx8dm9pZCAwLHRoaXMuY29ubmVjdGVkPXZvaWQgMCE9PXRoaXMuZnJvbSYmdm9pZCAwIT09dGhpcy50byx0aGlzLmNvbm5lY3RlZD09PSEwPyh0aGlzLmZyb20uYXR0YWNoRWRnZSh0aGlzKSx0aGlzLnRvLmF0dGFjaEVkZ2UodGhpcykpOih0aGlzLmZyb20mJnRoaXMuZnJvbS5kZXRhY2hFZGdlKHRoaXMpLHRoaXMudG8mJnRoaXMudG8uZGV0YWNoRWRnZSh0aGlzKSksdGhpcy5lZGdlVHlwZS5jb25uZWN0KCl9fSx7a2V5OiJkaXNjb25uZWN0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuZnJvbSYmKHRoaXMuZnJvbS5kZXRhY2hFZGdlKHRoaXMpLHRoaXMuZnJvbT12b2lkIDApLHRoaXMudG8mJih0aGlzLnRvLmRldGFjaEVkZ2UodGhpcyksdGhpcy50bz12b2lkIDApLHRoaXMuY29ubmVjdGVkPSExfX0se2tleToiZ2V0VGl0bGUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGl0bGV9fSx7a2V5OiJpc1NlbGVjdGVkIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGVkfX0se2tleToiZ2V0VmFsdWUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy52YWx1ZX19LHtrZXk6InNldFZhbHVlUmFuZ2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXtpZih2b2lkIDAhPT10aGlzLm9wdGlvbnMudmFsdWUpe3ZhciBvPXRoaXMub3B0aW9ucy5zY2FsaW5nLmN1c3RvbVNjYWxpbmdGdW5jdGlvbih0LGUsaSx0aGlzLm9wdGlvbnMudmFsdWUpLG49dGhpcy5vcHRpb25zLnNjYWxpbmcubWF4LXRoaXMub3B0aW9ucy5zY2FsaW5nLm1pbjtpZih0aGlzLm9wdGlvbnMuc2NhbGluZy5sYWJlbC5lbmFibGVkPT09ITApe3ZhciBzPXRoaXMub3B0aW9ucy5zY2FsaW5nLmxhYmVsLm1heC10aGlzLm9wdGlvbnMuc2NhbGluZy5sYWJlbC5taW47dGhpcy5vcHRpb25zLmZvbnQuc2l6ZT10aGlzLm9wdGlvbnMuc2NhbGluZy5sYWJlbC5taW4rbypzfXRoaXMub3B0aW9ucy53aWR0aD10aGlzLm9wdGlvbnMuc2NhbGluZy5taW4rbypufWVsc2UgdGhpcy5vcHRpb25zLndpZHRoPXRoaXMuYmFzZVdpZHRoLHRoaXMub3B0aW9ucy5mb250LnNpemU9dGhpcy5iYXNlRm9udFNpemU7dGhpcy5fc2V0SW50ZXJhY3Rpb25XaWR0aHMoKSx0aGlzLnVwZGF0ZUxhYmVsTW9kdWxlKCl9fSx7a2V5OiJfc2V0SW50ZXJhY3Rpb25XaWR0aHMiLHZhbHVlOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMub3B0aW9ucy5ob3ZlcldpZHRoP3RoaXMuZWRnZVR5cGUuaG92ZXJXaWR0aD10aGlzLm9wdGlvbnMuaG92ZXJXaWR0aCh0aGlzLm9wdGlvbnMud2lkdGgpOnRoaXMuZWRnZVR5cGUuaG92ZXJXaWR0aD10aGlzLm9wdGlvbnMuaG92ZXJXaWR0aCt0aGlzLm9wdGlvbnMud2lkdGgsImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMub3B0aW9ucy5zZWxlY3Rpb25XaWR0aD90aGlzLmVkZ2VUeXBlLnNlbGVjdGlvbldpZHRoPXRoaXMub3B0aW9ucy5zZWxlY3Rpb25XaWR0aCh0aGlzLm9wdGlvbnMud2lkdGgpOnRoaXMuZWRnZVR5cGUuc2VsZWN0aW9uV2lkdGg9dGhpcy5vcHRpb25zLnNlbGVjdGlvbldpZHRoK3RoaXMub3B0aW9ucy53aWR0aH19LHtrZXk6ImRyYXciLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZWRnZVR5cGUuZ2V0VmlhTm9kZSgpLGk9e307dGhpcy5lZGdlVHlwZS5mcm9tUG9pbnQ9dGhpcy5lZGdlVHlwZS5mcm9tLHRoaXMuZWRnZVR5cGUudG9Qb2ludD10aGlzLmVkZ2VUeXBlLnRvLHRoaXMub3B0aW9ucy5hcnJvd3MuZnJvbS5lbmFibGVkPT09ITAmJihpLmZyb209dGhpcy5lZGdlVHlwZS5nZXRBcnJvd0RhdGEodCwiZnJvbSIsZSx0aGlzLnNlbGVjdGVkLHRoaXMuaG92ZXIpLHRoaXMub3B0aW9ucy5hcnJvd1N0cmlrZXRocm91Z2g9PT0hMSYmKHRoaXMuZWRnZVR5cGUuZnJvbVBvaW50PWkuZnJvbS5jb3JlKSksdGhpcy5vcHRpb25zLmFycm93cy50by5lbmFibGVkPT09ITAmJihpLnRvPXRoaXMuZWRnZVR5cGUuZ2V0QXJyb3dEYXRhKHQsInRvIixlLHRoaXMuc2VsZWN0ZWQsdGhpcy5ob3ZlciksdGhpcy5vcHRpb25zLmFycm93U3RyaWtldGhyb3VnaD09PSExJiYodGhpcy5lZGdlVHlwZS50b1BvaW50PWkudG8uY29yZSkpLHRoaXMub3B0aW9ucy5hcnJvd3MubWlkZGxlLmVuYWJsZWQ9PT0hMCYmKGkubWlkZGxlPXRoaXMuZWRnZVR5cGUuZ2V0QXJyb3dEYXRhKHQsIm1pZGRsZSIsZSx0aGlzLnNlbGVjdGVkLHRoaXMuaG92ZXIpKSx0aGlzLmVkZ2VUeXBlLmRyYXdMaW5lKHQsdGhpcy5zZWxlY3RlZCx0aGlzLmhvdmVyLGUpLHRoaXMuZHJhd0Fycm93cyh0LGkpLHRoaXMuZHJhd0xhYmVsKHQsZSl9fSx7a2V5OiJkcmF3QXJyb3dzIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMub3B0aW9ucy5hcnJvd3MuZnJvbS5lbmFibGVkPT09ITAmJnRoaXMuZWRnZVR5cGUuZHJhd0Fycm93SGVhZCh0LHRoaXMuc2VsZWN0ZWQsdGhpcy5ob3ZlcixlLmZyb20pLHRoaXMub3B0aW9ucy5hcnJvd3MubWlkZGxlLmVuYWJsZWQ9PT0hMCYmdGhpcy5lZGdlVHlwZS5kcmF3QXJyb3dIZWFkKHQsdGhpcy5zZWxlY3RlZCx0aGlzLmhvdmVyLGUubWlkZGxlKSx0aGlzLm9wdGlvbnMuYXJyb3dzLnRvLmVuYWJsZWQ9PT0hMCYmdGhpcy5lZGdlVHlwZS5kcmF3QXJyb3dIZWFkKHQsdGhpcy5zZWxlY3RlZCx0aGlzLmhvdmVyLGUudG8pfX0se2tleToiZHJhd0xhYmVsIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKHZvaWQgMCE9PXRoaXMub3B0aW9ucy5sYWJlbCl7dmFyIGk9dGhpcy5mcm9tLG89dGhpcy50byxuPXRoaXMuZnJvbS5zZWxlY3RlZHx8dGhpcy50by5zZWxlY3RlZHx8dGhpcy5zZWxlY3RlZDtpZihpLmlkIT1vLmlkKXt0aGlzLmxhYmVsTW9kdWxlLnBvaW50VG9TZWxmPSExO3ZhciBzPXRoaXMuZWRnZVR5cGUuZ2V0UG9pbnQoLjUsZSk7dC5zYXZlKCksImhvcml6b250YWwiIT09dGhpcy5vcHRpb25zLmZvbnQuYWxpZ24mJih0aGlzLmxhYmVsTW9kdWxlLmNhbGN1bGF0ZUxhYmVsU2l6ZSh0LG4scy54LHMueSksdC50cmFuc2xhdGUocy54LHRoaXMubGFiZWxNb2R1bGUuc2l6ZS55TGluZSksdGhpcy5fcm90YXRlRm9yTGFiZWxBbGlnbm1lbnQodCkpLHRoaXMubGFiZWxNb2R1bGUuZHJhdyh0LHMueCxzLnksbiksdC5yZXN0b3JlKCl9ZWxzZXt0aGlzLmxhYmVsTW9kdWxlLnBvaW50VG9TZWxmPSEwO3ZhciByLGEsaD10aGlzLm9wdGlvbnMuc2VsZlJlZmVyZW5jZVNpemU7aS5zaGFwZS53aWR0aD5pLnNoYXBlLmhlaWdodD8ocj1pLngrLjUqaS5zaGFwZS53aWR0aCxhPWkueS1oKToocj1pLngraCxhPWkueS0uNSppLnNoYXBlLmhlaWdodCkscz10aGlzLl9wb2ludE9uQ2lyY2xlKHIsYSxoLC4xMjUpLHRoaXMubGFiZWxNb2R1bGUuZHJhdyh0LHMueCxzLnksbil9fX19LHtrZXk6ImlzT3ZlcmxhcHBpbmdXaXRoIix2YWx1ZTpmdW5jdGlvbih0KXtpZih0aGlzLmNvbm5lY3RlZCl7dmFyIGU9MTAsaT10aGlzLmZyb20ueCxvPXRoaXMuZnJvbS55LG49dGhpcy50by54LHM9dGhpcy50by55LHI9dC5sZWZ0LGE9dC50b3AsaD10aGlzLmVkZ2VUeXBlLmdldERpc3RhbmNlVG9FZGdlKGksbyxuLHMscixhKTtyZXR1cm4gaDxlfXJldHVybiExfX0se2tleToiX3JvdGF0ZUZvckxhYmVsQWxpZ25tZW50Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmZyb20ueS10aGlzLnRvLnksaT10aGlzLmZyb20ueC10aGlzLnRvLngsbz1NYXRoLmF0YW4yKGUsaSk7KG88LTEmJmk8MHx8bz4wJiZpPDApJiYobys9TWF0aC5QSSksdC5yb3RhdGUobyl9fSx7a2V5OiJfcG9pbnRPbkNpcmNsZSIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyl7dmFyIG49MipvKk1hdGguUEk7cmV0dXJue3g6dCtpKk1hdGguY29zKG4pLHk6ZS1pKk1hdGguc2luKG4pfX19LHtrZXk6InNlbGVjdCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkPSEwfX0se2tleToidW5zZWxlY3QiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZD0hMX19LHtrZXk6ImNsZWFudXAiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZVR5cGUuY2xlYW51cCgpfX1dLFt7a2V5OiJwYXJzZU9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXSxvPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fSxuPVsiYXJyb3dTdHJpa2V0aHJvdWdoIiwiaWQiLCJmcm9tIiwiaGlkZGVuIiwiaG92ZXJXaWR0aCIsImxhYmVsIiwibGFiZWxIaWdobGlnaHRCb2xkIiwibGVuZ3RoIiwibGluZSIsIm9wYWNpdHkiLCJwaHlzaWNzIiwic2NhbGluZyIsInNlbGVjdGlvbldpZHRoIiwic2VsZlJlZmVyZW5jZVNpemUiLCJ0byIsInRpdGxlIiwidmFsdWUiLCJ3aWR0aCJdO2lmKGcuc2VsZWN0aXZlRGVlcEV4dGVuZChuLHQsZSxpKSxnLm1lcmdlT3B0aW9ucyh0LGUsInNtb290aCIsaSxvKSxnLm1lcmdlT3B0aW9ucyh0LGUsInNoYWRvdyIsaSxvKSx2b2lkIDAhPT1lLmRhc2hlcyYmbnVsbCE9PWUuZGFzaGVzP3QuZGFzaGVzPWUuZGFzaGVzOmk9PT0hMCYmbnVsbD09PWUuZGFzaGVzJiYodC5kYXNoZXM9T2JqZWN0LmNyZWF0ZShvLmRhc2hlcykpLHZvaWQgMCE9PWUuc2NhbGluZyYmbnVsbCE9PWUuc2NhbGluZz8odm9pZCAwIT09ZS5zY2FsaW5nLm1pbiYmKHQuc2NhbGluZy5taW49ZS5zY2FsaW5nLm1pbiksdm9pZCAwIT09ZS5zY2FsaW5nLm1heCYmKHQuc2NhbGluZy5tYXg9ZS5zY2FsaW5nLm1heCksZy5tZXJnZU9wdGlvbnModC5zY2FsaW5nLGUuc2NhbGluZywibGFiZWwiLGksby5zY2FsaW5nKSk6aT09PSEwJiZudWxsPT09ZS5zY2FsaW5nJiYodC5zY2FsaW5nPU9iamVjdC5jcmVhdGUoby5zY2FsaW5nKSksdm9pZCAwIT09ZS5hcnJvd3MmJm51bGwhPT1lLmFycm93cylpZigic3RyaW5nIj09dHlwZW9mIGUuYXJyb3dzKXt2YXIgcj1lLmFycm93cy50b0xvd2VyQ2FzZSgpO3QuYXJyb3dzLnRvLmVuYWJsZWQ9ci5pbmRleE9mKCJ0byIpIT0tMSx0LmFycm93cy5taWRkbGUuZW5hYmxlZD1yLmluZGV4T2YoIm1pZGRsZSIpIT0tMSx0LmFycm93cy5mcm9tLmVuYWJsZWQ9ci5pbmRleE9mKCJmcm9tIikhPS0xfWVsc2V7aWYoIm9iamVjdCIhPT1zKGUuYXJyb3dzKSl0aHJvdyBuZXcgRXJyb3IoIlRoZSBhcnJvdyBuZXdPcHRpb25zIGNhbiBvbmx5IGJlIGFuIG9iamVjdCBvciBhIHN0cmluZy4gUmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24uIFlvdSB1c2VkOiIrSlNPTi5zdHJpbmdpZnkoZS5hcnJvd3MpKTtnLm1lcmdlT3B0aW9ucyh0LmFycm93cyxlLmFycm93cywidG8iLGksby5hcnJvd3MpLGcubWVyZ2VPcHRpb25zKHQuYXJyb3dzLGUuYXJyb3dzLCJtaWRkbGUiLGksby5hcnJvd3MpLGcubWVyZ2VPcHRpb25zKHQuYXJyb3dzLGUuYXJyb3dzLCJmcm9tIixpLG8uYXJyb3dzKX1lbHNlIGk9PT0hMCYmbnVsbD09PWUuYXJyb3dzJiYodC5hcnJvd3M9T2JqZWN0LmNyZWF0ZShvLmFycm93cykpO2lmKHZvaWQgMCE9PWUuY29sb3ImJm51bGwhPT1lLmNvbG9yKWlmKHQuY29sb3I9Zy5kZWVwRXh0ZW5kKHt9LHQuY29sb3IsITApLGcuaXNTdHJpbmcoZS5jb2xvcikpdC5jb2xvci5jb2xvcj1lLmNvbG9yLHQuY29sb3IuaGlnaGxpZ2h0PWUuY29sb3IsdC5jb2xvci5ob3Zlcj1lLmNvbG9yLHQuY29sb3IuaW5oZXJpdD0hMTtlbHNle3ZhciBhPSExO3ZvaWQgMCE9PWUuY29sb3IuY29sb3ImJih0LmNvbG9yLmNvbG9yPWUuY29sb3IuY29sb3IsYT0hMCksdm9pZCAwIT09ZS5jb2xvci5oaWdobGlnaHQmJih0LmNvbG9yLmhpZ2hsaWdodD1lLmNvbG9yLmhpZ2hsaWdodCxhPSEwKSx2b2lkIDAhPT1lLmNvbG9yLmhvdmVyJiYodC5jb2xvci5ob3Zlcj1lLmNvbG9yLmhvdmVyLGE9ITApLHZvaWQgMCE9PWUuY29sb3IuaW5oZXJpdCYmKHQuY29sb3IuaW5oZXJpdD1lLmNvbG9yLmluaGVyaXQpLHZvaWQgMCE9PWUuY29sb3Iub3BhY2l0eSYmKHQuY29sb3Iub3BhY2l0eT1NYXRoLm1pbigxLE1hdGgubWF4KDAsZS5jb2xvci5vcGFjaXR5KSkpLHZvaWQgMD09PWUuY29sb3IuaW5oZXJpdCYmYT09PSEwJiYodC5jb2xvci5pbmhlcml0PSExKX1lbHNlIGk9PT0hMCYmbnVsbD09PWUuY29sb3ImJih0LmNvbG9yPWcuYnJpZGdlT2JqZWN0KG8uY29sb3IpKTt2b2lkIDAhPT1lLmZvbnQmJm51bGwhPT1lLmZvbnQ/aC5kZWZhdWx0LnBhcnNlT3B0aW9ucyh0LmZvbnQsZSk6aT09PSEwJiZudWxsPT09ZS5mb250JiYodC5mb250PWcuYnJpZGdlT2JqZWN0KG8uZm9udCkpfX1dKSx0fSgpO2UuZGVmYXVsdD15fSxmdW5jdGlvbih0LGUsaSl7CmZ1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWZ1bmN0aW9uIG4odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBzKHQsZSl7aWYoIXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hZXx8Im9iamVjdCIhPXR5cGVvZiBlJiYiZnVuY3Rpb24iIT10eXBlb2YgZT90OmV9ZnVuY3Rpb24gcih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIGUpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHQsZSk6dC5fX3Byb3RvX189ZSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3ZhciBpPVtdLG89ITAsbj0hMSxzPXZvaWQgMDt0cnl7Zm9yKHZhciByLGE9dFtTeW1ib2wuaXRlcmF0b3JdKCk7IShvPShyPWEubmV4dCgpKS5kb25lKSYmKGkucHVzaChyLnZhbHVlKSwhZXx8aS5sZW5ndGghPT1lKTtvPSEwKTt9Y2F0Y2godCl7bj0hMCxzPXR9ZmluYWxseXt0cnl7IW8mJmEucmV0dXJuJiZhLnJldHVybigpfWZpbmFsbHl7aWYobil0aHJvdyBzfX1yZXR1cm4gaX1yZXR1cm4gZnVuY3Rpb24oZSxpKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlO2lmKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpcmV0dXJuIHQoZSxpKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlIil9fSgpLGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxvJiZ0KGUsbyksZX19KCksZD1pKDg5KSxsPW8oZCksYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4gbih0aGlzLGUpLHModGhpcywoZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuIHIoZSx0KSxoKGUsW3trZXk6Il9saW5lIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPWVbMF0sbz1lWzFdO3QuYmVnaW5QYXRoKCksdC5tb3ZlVG8odGhpcy5mcm9tUG9pbnQueCx0aGlzLmZyb21Qb2ludC55KSx2b2lkIDA9PT1lfHx2b2lkIDA9PT1pLng/dC5saW5lVG8odGhpcy50b1BvaW50LngsdGhpcy50b1BvaW50LnkpOnQuYmV6aWVyQ3VydmVUbyhpLngsaS55LG8ueCxvLnksdGhpcy50b1BvaW50LngsdGhpcy50b1BvaW50LnkpLHRoaXMuZW5hYmxlU2hhZG93KHQpLHQuc3Ryb2tlKCksdGhpcy5kaXNhYmxlU2hhZG93KHQpfX0se2tleToiX2dldFZpYUNvb3JkaW5hdGVzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZnJvbS54LXRoaXMudG8ueCxlPXRoaXMuZnJvbS55LXRoaXMudG8ueSxpPXZvaWQgMCxvPXZvaWQgMCxuPXZvaWQgMCxzPXZvaWQgMCxyPXRoaXMub3B0aW9ucy5zbW9vdGgucm91bmRuZXNzO3JldHVybihNYXRoLmFicyh0KT5NYXRoLmFicyhlKXx8dGhpcy5vcHRpb25zLnNtb290aC5mb3JjZURpcmVjdGlvbj09PSEwfHwiaG9yaXpvbnRhbCI9PT10aGlzLm9wdGlvbnMuc21vb3RoLmZvcmNlRGlyZWN0aW9uKSYmInZlcnRpY2FsIiE9PXRoaXMub3B0aW9ucy5zbW9vdGguZm9yY2VEaXJlY3Rpb24/KG89dGhpcy5mcm9tLnkscz10aGlzLnRvLnksaT10aGlzLmZyb20ueC1yKnQsbj10aGlzLnRvLngrcip0KToobz10aGlzLmZyb20ueS1yKmUscz10aGlzLnRvLnkrciplLGk9dGhpcy5mcm9tLngsbj10aGlzLnRvLngpLFt7eDppLHk6b30se3g6bix5OnN9XX19LHtrZXk6ImdldFZpYU5vZGUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFZpYUNvb3JkaW5hdGVzKCl9fSx7a2V5OiJfZmluZEJvcmRlclBvc2l0aW9uIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9maW5kQm9yZGVyUG9zaXRpb25CZXppZXIodCxlKX19LHtrZXk6Il9nZXREaXN0YW5jZVRvRWRnZSIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuLHMpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+NiYmdm9pZCAwIT09YXJndW1lbnRzWzZdP2FyZ3VtZW50c1s2XTp0aGlzLl9nZXRWaWFDb29yZGluYXRlcygpLGg9YShyLDIpLGQ9aFswXSxsPWhbMV07cmV0dXJuIHRoaXMuX2dldERpc3RhbmNlVG9CZXppZXJFZGdlKHQsZSxpLG8sbixzLGQsbCl9fSx7a2V5OiJnZXRQb2ludCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnRoaXMuX2dldFZpYUNvb3JkaW5hdGVzKCksaT1hKGUsMiksbz1pWzBdLG49aVsxXSxzPXQscj1bXTtyWzBdPU1hdGgucG93KDEtcywzKSxyWzFdPTMqcypNYXRoLnBvdygxLXMsMiksclsyXT0zKk1hdGgucG93KHMsMikqKDEtcyksclszXT1NYXRoLnBvdyhzLDMpO3ZhciBoPXJbMF0qdGhpcy5mcm9tUG9pbnQueCtyWzFdKm8ueCtyWzJdKm4ueCtyWzNdKnRoaXMudG9Qb2ludC54LGQ9clswXSp0aGlzLmZyb21Qb2ludC55K3JbMV0qby55K3JbMl0qbi55K3JbM10qdGhpcy50b1BvaW50Lnk7cmV0dXJue3g6aCx5OmR9fX1dKSxlfShsLmRlZmF1bHQpO2UuZGVmYXVsdD1jfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIHModCxlKXtpZighdCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiFlfHwib2JqZWN0IiE9dHlwZW9mIGUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlP3Q6ZX1mdW5jdGlvbiByKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgZSk7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxlKTp0Ll9fcHJvdG9fXz1lKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxvJiZ0KGUsbyksZX19KCksaD1pKDkwKSxkPW8oaCksbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4gbih0aGlzLGUpLHModGhpcywoZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuIHIoZSx0KSxhKGUsW3trZXk6Il9nZXREaXN0YW5jZVRvQmV6aWVyRWRnZSIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuLHMscixhKXt2YXIgaD0xZTksZD12b2lkIDAsbD12b2lkIDAsYz12b2lkIDAsdT12b2lkIDAscD12b2lkIDAsZj10LG09ZSx2PVswLDAsMCwwXTtmb3IobD0xO2w8MTA7bCsrKWM9LjEqbCx2WzBdPU1hdGgucG93KDEtYywzKSx2WzFdPTMqYypNYXRoLnBvdygxLWMsMiksdlsyXT0zKk1hdGgucG93KGMsMikqKDEtYyksdlszXT1NYXRoLnBvdyhjLDMpLHU9dlswXSp0K3ZbMV0qci54K3ZbMl0qYS54K3ZbM10qaSxwPXZbMF0qZSt2WzFdKnIueSt2WzJdKmEueSt2WzNdKm8sbD4wJiYoZD10aGlzLl9nZXREaXN0YW5jZVRvTGluZShmLG0sdSxwLG4scyksaD1kPGg/ZDpoKSxmPXUsbT1wO3JldHVybiBofX1dKSxlfShkLmRlZmF1bHQpO2UuZGVmYXVsdD1sfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIHModCxlKXtpZighdCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiFlfHwib2JqZWN0IiE9dHlwZW9mIGUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlP3Q6ZX1mdW5jdGlvbiByKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgZSk7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxlKTp0Ll9fcHJvdG9fXz1lKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxvJiZ0KGUsbyksZX19KCksaD1pKDkxKSxkPW8oaCksbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4gbih0aGlzLGUpLHModGhpcywoZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuIHIoZSx0KSxhKGUsW3trZXk6Il9maW5kQm9yZGVyUG9zaXRpb25CZXppZXIiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGksbyxuLHMscixhPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp0aGlzLl9nZXRWaWFDb29yZGluYXRlcygpLGg9MTAsZD0wLGw9MCxjPTEsdT0uMixwPXRoaXMudG8sZj0hMTtmb3IodC5pZD09PXRoaXMuZnJvbS5pZCYmKHA9dGhpcy5mcm9tLGY9ITApO2w8PWMmJmQ8aDspe3ZhciBtPS41KihsK2MpO2lmKGk9dGhpcy5nZXRQb2ludChtLGEpLG89TWF0aC5hdGFuMihwLnktaS55LHAueC1pLngpLG49cC5kaXN0YW5jZVRvQm9yZGVyKGUsbykscz1NYXRoLnNxcnQoTWF0aC5wb3coaS54LXAueCwyKStNYXRoLnBvdyhpLnktcC55LDIpKSxyPW4tcyxNYXRoLmFicyhyKTx1KWJyZWFrO3I8MD9mPT09ITE/bD1tOmM9bTpmPT09ITE/Yz1tOmw9bSxkKyt9cmV0dXJuIGkudD1tLGl9fSx7a2V5OiJfZ2V0RGlzdGFuY2VUb0JlemllckVkZ2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzLHIpe3ZhciBhPTFlOSxoPXZvaWQgMCxkPXZvaWQgMCxsPXZvaWQgMCxjPXZvaWQgMCx1PXZvaWQgMCxwPXQsZj1lO2ZvcihkPTE7ZDwxMDtkKyspbD0uMSpkLGM9TWF0aC5wb3coMS1sLDIpKnQrMipsKigxLWwpKnIueCtNYXRoLnBvdyhsLDIpKmksdT1NYXRoLnBvdygxLWwsMikqZSsyKmwqKDEtbCkqci55K01hdGgucG93KGwsMikqbyxkPjAmJihoPXRoaXMuX2dldERpc3RhbmNlVG9MaW5lKHAsZixjLHUsbixzKSxhPWg8YT9oOmEpLHA9YyxmPXU7cmV0dXJuIGF9fV0pLGV9KGQuZGVmYXVsdCk7ZS5kZWZhdWx0PWx9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3ZhciBpPVtdLG89ITAsbj0hMSxzPXZvaWQgMDt0cnl7Zm9yKHZhciByLGE9dFtTeW1ib2wuaXRlcmF0b3JdKCk7IShvPShyPWEubmV4dCgpKS5kb25lKSYmKGkucHVzaChyLnZhbHVlKSwhZXx8aS5sZW5ndGghPT1lKTtvPSEwKTt9Y2F0Y2godCl7bj0hMCxzPXR9ZmluYWxseXt0cnl7IW8mJmEucmV0dXJuJiZhLnJldHVybigpfWZpbmFsbHl7aWYobil0aHJvdyBzfX1yZXR1cm4gaX1yZXR1cm4gZnVuY3Rpb24oZSxpKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlO2lmKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpcmV0dXJuIHQoZSxpKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlIil9fSgpLHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxvJiZ0KGUsbyksZX19KCkscj1pKDEpLGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsaSxuKXtvKHRoaXMsdCksdGhpcy5ib2R5PWksdGhpcy5sYWJlbE1vZHVsZT1uLHRoaXMub3B0aW9ucz17fSx0aGlzLnNldE9wdGlvbnMoZSksdGhpcy5jb2xvckRpcnR5PSEwLHRoaXMuY29sb3I9e30sdGhpcy5zZWxlY3Rpb25XaWR0aD0yLHRoaXMuaG92ZXJXaWR0aD0xLjUsdGhpcy5mcm9tUG9pbnQ9dGhpcy5mcm9tLHRoaXMudG9Qb2ludD10aGlzLnRvfXJldHVybiBzKHQsW3trZXk6ImNvbm5lY3QiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5mcm9tPXRoaXMuYm9keS5ub2Rlc1t0aGlzLm9wdGlvbnMuZnJvbV0sdGhpcy50bz10aGlzLmJvZHkubm9kZXNbdGhpcy5vcHRpb25zLnRvXX19LHtrZXk6ImNsZWFudXAiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuITF9fSx7a2V5OiJzZXRPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnM9dCx0aGlzLmZyb209dGhpcy5ib2R5Lm5vZGVzW3RoaXMub3B0aW9ucy5mcm9tXSx0aGlzLnRvPXRoaXMuYm9keS5ub2Rlc1t0aGlzLm9wdGlvbnMudG9dLHRoaXMuaWQ9dGhpcy5vcHRpb25zLmlkfX0se2tleToiZHJhd0xpbmUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8pe3Quc3Ryb2tlU3R5bGU9dGhpcy5nZXRDb2xvcih0LGUsaSksdC5saW5lV2lkdGg9dGhpcy5nZXRMaW5lV2lkdGgoZSxpKSx0aGlzLm9wdGlvbnMuZGFzaGVzIT09ITE/dGhpcy5fZHJhd0Rhc2hlZExpbmUodCxvKTp0aGlzLl9kcmF3TGluZSh0LG8pfX0se2tleToiX2RyYXdMaW5lIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvKXtpZih0aGlzLmZyb20hPXRoaXMudG8pdGhpcy5fbGluZSh0LGUsaSxvKTtlbHNle3ZhciBzPXRoaXMuX2dldENpcmNsZURhdGEodCkscj1uKHMsMyksYT1yWzBdLGg9clsxXSxkPXJbMl07dGhpcy5fY2lyY2xlKHQsYSxoLGQpfX19LHtrZXk6Il9kcmF3RGFzaGVkTGluZSIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyl7dC5saW5lQ2FwPSJyb3VuZCI7dmFyIHM9WzUsNV07aWYoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMuZGFzaGVzKT09PSEwJiYocz10aGlzLm9wdGlvbnMuZGFzaGVzKSx2b2lkIDAhPT10LnNldExpbmVEYXNoKXtpZih0LnNhdmUoKSx0LnNldExpbmVEYXNoKHMpLHQubGluZURhc2hPZmZzZXQ9MCx0aGlzLmZyb20hPXRoaXMudG8pdGhpcy5fbGluZSh0LGUpO2Vsc2V7dmFyIHI9dGhpcy5fZ2V0Q2lyY2xlRGF0YSh0KSxhPW4ociwzKSxoPWFbMF0sZD1hWzFdLGw9YVsyXTt0aGlzLl9jaXJjbGUodCxoLGQsbCl9dC5zZXRMaW5lRGFzaChbMF0pLHQubGluZURhc2hPZmZzZXQ9MCx0LnJlc3RvcmUoKX1lbHNle2lmKHRoaXMuZnJvbSE9dGhpcy50byl0LmRhc2hlZExpbmUodGhpcy5mcm9tLngsdGhpcy5mcm9tLnksdGhpcy50by54LHRoaXMudG8ueSxzKTtlbHNle3ZhciBjPXRoaXMuX2dldENpcmNsZURhdGEodCksdT1uKGMsMykscD11WzBdLGY9dVsxXSxtPXVbMl07dGhpcy5fY2lyY2xlKHQscCxmLG0pfXRoaXMuZW5hYmxlU2hhZG93KHQpLHQuc3Ryb2tlKCksdGhpcy5kaXNhYmxlU2hhZG93KHQpfX19LHtrZXk6ImZpbmRCb3JkZXJQb3NpdGlvbiIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0aGlzLmZyb20hPXRoaXMudG8/dGhpcy5fZmluZEJvcmRlclBvc2l0aW9uKHQsZSxpKTp0aGlzLl9maW5kQm9yZGVyUG9zaXRpb25DaXJjbGUodCxlLGkpfX0se2tleToiZmluZEJvcmRlclBvc2l0aW9ucyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9e30saT17fTtpZih0aGlzLmZyb20hPXRoaXMudG8pZT10aGlzLl9maW5kQm9yZGVyUG9zaXRpb24odGhpcy5mcm9tLHQpLGk9dGhpcy5fZmluZEJvcmRlclBvc2l0aW9uKHRoaXMudG8sdCk7ZWxzZXt2YXIgbz10aGlzLl9nZXRDaXJjbGVEYXRhKHQpLHM9bihvLDMpLHI9c1swXSxhPXNbMV07c1syXTtlPXRoaXMuX2ZpbmRCb3JkZXJQb3NpdGlvbkNpcmNsZSh0aGlzLmZyb20sdCx7eDpyLHk6YSxsb3c6LjI1LGhpZ2g6LjYsZGlyZWN0aW9uOi0xfSksaT10aGlzLl9maW5kQm9yZGVyUG9zaXRpb25DaXJjbGUodGhpcy5mcm9tLHQse3g6cix5OmEsbG93Oi42LGhpZ2g6LjgsZGlyZWN0aW9uOjF9KX1yZXR1cm57ZnJvbTplLHRvOml9fX0se2tleToiX2dldENpcmNsZURhdGEiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMCxpPXZvaWQgMCxvPXRoaXMuZnJvbSxuPXRoaXMub3B0aW9ucy5zZWxmUmVmZXJlbmNlU2l6ZTtyZXR1cm4gdm9pZCAwIT09dCYmdm9pZCAwPT09by5zaGFwZS53aWR0aCYmby5zaGFwZS5yZXNpemUodCksby5zaGFwZS53aWR0aD5vLnNoYXBlLmhlaWdodD8oZT1vLngrLjUqby5zaGFwZS53aWR0aCxpPW8ueS1uKTooZT1vLngrbixpPW8ueS0uNSpvLnNoYXBlLmhlaWdodCksW2UsaSxuXX19LHtrZXk6Il9wb2ludE9uQ2lyY2xlIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvKXt2YXIgbj0yKm8qTWF0aC5QSTtyZXR1cm57eDp0K2kqTWF0aC5jb3MobikseTplLWkqTWF0aC5zaW4obil9fX0se2tleToiX2ZpbmRCb3JkZXJQb3NpdGlvbkNpcmNsZSIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe2Zvcih2YXIgbz1pLngsbj1pLnkscz1pLmxvdyxyPWkuaGlnaCxhPWkuZGlyZWN0aW9uLGg9MTAsZD0wLGw9dGhpcy5vcHRpb25zLnNlbGZSZWZlcmVuY2VTaXplLGM9dm9pZCAwLHU9dm9pZCAwLHA9dm9pZCAwLGY9dm9pZCAwLG09dm9pZCAwLHY9LjA1LGc9LjUqKHMrcik7czw9ciYmZDxoJiYoZz0uNSoocytyKSxjPXRoaXMuX3BvaW50T25DaXJjbGUobyxuLGwsZyksdT1NYXRoLmF0YW4yKHQueS1jLnksdC54LWMueCkscD10LmRpc3RhbmNlVG9Cb3JkZXIoZSx1KSxmPU1hdGguc3FydChNYXRoLnBvdyhjLngtdC54LDIpK01hdGgucG93KGMueS10LnksMikpLG09cC1mLCEoTWF0aC5hYnMobSk8dikpOyltPjA/YT4wP3M9ZzpyPWc6YT4wP3I9ZzpzPWcsZCsrO3JldHVybiBjLnQ9ZyxjfX0se2tleToiZ2V0TGluZVdpZHRoIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0PT09ITA/TWF0aC5tYXgodGhpcy5zZWxlY3Rpb25XaWR0aCwuMy90aGlzLmJvZHkudmlldy5zY2FsZSk6ZT09PSEwP01hdGgubWF4KHRoaXMuaG92ZXJXaWR0aCwuMy90aGlzLmJvZHkudmlldy5zY2FsZSk6TWF0aC5tYXgodGhpcy5vcHRpb25zLndpZHRoLC4zL3RoaXMuYm9keS52aWV3LnNjYWxlKX19LHtrZXk6ImdldENvbG9yIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dmFyIG89dGhpcy5vcHRpb25zLmNvbG9yO2lmKG8uaW5oZXJpdCE9PSExKXtpZigiYm90aCI9PT1vLmluaGVyaXQmJnRoaXMuZnJvbS5pZCE9PXRoaXMudG8uaWQpe3ZhciBuPXQuY3JlYXRlTGluZWFyR3JhZGllbnQodGhpcy5mcm9tLngsdGhpcy5mcm9tLnksdGhpcy50by54LHRoaXMudG8ueSkscz12b2lkIDAsYT12b2lkIDA7cmV0dXJuIHM9dGhpcy5mcm9tLm9wdGlvbnMuY29sb3IuaGlnaGxpZ2h0LmJvcmRlcixhPXRoaXMudG8ub3B0aW9ucy5jb2xvci5oaWdobGlnaHQuYm9yZGVyLHRoaXMuZnJvbS5zZWxlY3RlZD09PSExJiZ0aGlzLnRvLnNlbGVjdGVkPT09ITE/KHM9ci5vdmVycmlkZU9wYWNpdHkodGhpcy5mcm9tLm9wdGlvbnMuY29sb3IuYm9yZGVyLHRoaXMub3B0aW9ucy5jb2xvci5vcGFjaXR5KSxhPXIub3ZlcnJpZGVPcGFjaXR5KHRoaXMudG8ub3B0aW9ucy5jb2xvci5ib3JkZXIsdGhpcy5vcHRpb25zLmNvbG9yLm9wYWNpdHkpKTp0aGlzLmZyb20uc2VsZWN0ZWQ9PT0hMCYmdGhpcy50by5zZWxlY3RlZD09PSExP2E9dGhpcy50by5vcHRpb25zLmNvbG9yLmJvcmRlcjp0aGlzLmZyb20uc2VsZWN0ZWQ9PT0hMSYmdGhpcy50by5zZWxlY3RlZD09PSEwJiYocz10aGlzLmZyb20ub3B0aW9ucy5jb2xvci5ib3JkZXIpLG4uYWRkQ29sb3JTdG9wKDAscyksbi5hZGRDb2xvclN0b3AoMSxhKSxufXRoaXMuY29sb3JEaXJ0eT09PSEwJiYoInRvIj09PW8uaW5oZXJpdD8odGhpcy5jb2xvci5oaWdobGlnaHQ9dGhpcy50by5vcHRpb25zLmNvbG9yLmhpZ2hsaWdodC5ib3JkZXIsdGhpcy5jb2xvci5ob3Zlcj10aGlzLnRvLm9wdGlvbnMuY29sb3IuaG92ZXIuYm9yZGVyLHRoaXMuY29sb3IuY29sb3I9ci5vdmVycmlkZU9wYWNpdHkodGhpcy50by5vcHRpb25zLmNvbG9yLmJvcmRlcixvLm9wYWNpdHkpKToodGhpcy5jb2xvci5oaWdobGlnaHQ9dGhpcy5mcm9tLm9wdGlvbnMuY29sb3IuaGlnaGxpZ2h0LmJvcmRlcix0aGlzLmNvbG9yLmhvdmVyPXRoaXMuZnJvbS5vcHRpb25zLmNvbG9yLmhvdmVyLmJvcmRlcix0aGlzLmNvbG9yLmNvbG9yPXIub3ZlcnJpZGVPcGFjaXR5KHRoaXMuZnJvbS5vcHRpb25zLmNvbG9yLmJvcmRlcixvLm9wYWNpdHkpKSl9ZWxzZSB0aGlzLmNvbG9yRGlydHk9PT0hMCYmKHRoaXMuY29sb3IuaGlnaGxpZ2h0PW8uaGlnaGxpZ2h0LHRoaXMuY29sb3IuaG92ZXI9by5ob3Zlcix0aGlzLmNvbG9yLmNvbG9yPXIub3ZlcnJpZGVPcGFjaXR5KG8uY29sb3Isby5vcGFjaXR5KSk7cmV0dXJuIHRoaXMuY29sb3JEaXJ0eT0hMSxlPT09ITA/dGhpcy5jb2xvci5oaWdobGlnaHQ6aT09PSEwP3RoaXMuY29sb3IuaG92ZXI6dGhpcy5jb2xvci5jb2xvcn19LHtrZXk6Il9jaXJjbGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8pe3RoaXMuZW5hYmxlU2hhZG93KHQpLHQuYmVnaW5QYXRoKCksdC5hcmMoZSxpLG8sMCwyKk1hdGguUEksITEpLHQuc3Ryb2tlKCksdGhpcy5kaXNhYmxlU2hhZG93KHQpfX0se2tleToiZ2V0RGlzdGFuY2VUb0VkZ2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8scyxyLGEpe3ZhciBoPTA7aWYodGhpcy5mcm9tIT10aGlzLnRvKWg9dGhpcy5fZ2V0RGlzdGFuY2VUb0VkZ2UodCxlLGksbyxzLHIsYSk7ZWxzZXt2YXIgZD10aGlzLl9nZXRDaXJjbGVEYXRhKCksbD1uKGQsMyksYz1sWzBdLHU9bFsxXSxwPWxbMl0sZj1jLXMsbT11LXI7aD1NYXRoLmFicyhNYXRoLnNxcnQoZipmK20qbSktcCl9cmV0dXJuIHRoaXMubGFiZWxNb2R1bGUuc2l6ZS5sZWZ0PHMmJnRoaXMubGFiZWxNb2R1bGUuc2l6ZS5sZWZ0K3RoaXMubGFiZWxNb2R1bGUuc2l6ZS53aWR0aD5zJiZ0aGlzLmxhYmVsTW9kdWxlLnNpemUudG9wPHImJnRoaXMubGFiZWxNb2R1bGUuc2l6ZS50b3ArdGhpcy5sYWJlbE1vZHVsZS5zaXplLmhlaWdodD5yPzA6aH19LHtrZXk6Il9nZXREaXN0YW5jZVRvTGluZSIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuLHMpe3ZhciByPWktdCxhPW8tZSxoPXIqcithKmEsZD0oKG4tdCkqcisocy1lKSphKS9oO2Q+MT9kPTE6ZDwwJiYoZD0wKTt2YXIgbD10K2QqcixjPWUrZCphLHU9bC1uLHA9Yy1zO3JldHVybiBNYXRoLnNxcnQodSp1K3AqcCl9fSx7a2V5OiJnZXRBcnJvd0RhdGEiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8scyl7dmFyIHI9dm9pZCAwLGE9dm9pZCAwLGg9dm9pZCAwLGQ9dm9pZCAwLGw9dm9pZCAwLGM9dm9pZCAwLHU9dm9pZCAwLHA9dGhpcy5nZXRMaW5lV2lkdGgobyxzKTtpZigiZnJvbSI9PT1lPyhoPXRoaXMuZnJvbSxkPXRoaXMudG8sbD0uMSxjPXRoaXMub3B0aW9ucy5hcnJvd3MuZnJvbS5zY2FsZUZhY3Rvcix1PXRoaXMub3B0aW9ucy5hcnJvd3MuZnJvbS50eXBlKToidG8iPT09ZT8oaD10aGlzLnRvLGQ9dGhpcy5mcm9tLGw9LS4xLGM9dGhpcy5vcHRpb25zLmFycm93cy50by5zY2FsZUZhY3Rvcix1PXRoaXMub3B0aW9ucy5hcnJvd3MudG8udHlwZSk6KGg9dGhpcy50byxkPXRoaXMuZnJvbSxjPXRoaXMub3B0aW9ucy5hcnJvd3MubWlkZGxlLnNjYWxlRmFjdG9yLHU9dGhpcy5vcHRpb25zLmFycm93cy5taWRkbGUudHlwZSksaCE9ZClpZigibWlkZGxlIiE9PWUpaWYodGhpcy5vcHRpb25zLnNtb290aC5lbmFibGVkPT09ITApe2E9dGhpcy5maW5kQm9yZGVyUG9zaXRpb24oaCx0LHt2aWE6aX0pO3ZhciBmPXRoaXMuZ2V0UG9pbnQoTWF0aC5tYXgoMCxNYXRoLm1pbigxLGEudCtsKSksaSk7cj1NYXRoLmF0YW4yKGEueS1mLnksYS54LWYueCl9ZWxzZSByPU1hdGguYXRhbjIoaC55LWQueSxoLngtZC54KSxhPXRoaXMuZmluZEJvcmRlclBvc2l0aW9uKGgsdCk7ZWxzZSByPU1hdGguYXRhbjIoaC55LWQueSxoLngtZC54KSxhPXRoaXMuZ2V0UG9pbnQoLjUsaSk7ZWxzZXt2YXIgbT10aGlzLl9nZXRDaXJjbGVEYXRhKHQpLHY9bihtLDMpLGc9dlswXSx5PXZbMV0sYj12WzJdOyJmcm9tIj09PWU/KGE9dGhpcy5maW5kQm9yZGVyUG9zaXRpb24odGhpcy5mcm9tLHQse3g6Zyx5OnksbG93Oi4yNSxoaWdoOi42LGRpcmVjdGlvbjotMX0pLHI9YS50Ki0yKk1hdGguUEkrMS41Kk1hdGguUEkrLjEqTWF0aC5QSSk6InRvIj09PWU/KGE9dGhpcy5maW5kQm9yZGVyUG9zaXRpb24odGhpcy5mcm9tLHQse3g6Zyx5OnksbG93Oi42LGhpZ2g6MSxkaXJlY3Rpb246MX0pLHI9YS50Ki0yKk1hdGguUEkrMS41Kk1hdGguUEktMS4xKk1hdGguUEkpOihhPXRoaXMuX3BvaW50T25DaXJjbGUoZyx5LGIsLjE3NSkscj0zLjkyNjk5MDgxNjk4NzI0MTQpfXZhciBfPTE1KmMrMypwLHc9YS54LS45Kl8qTWF0aC5jb3MocikseD1hLnktLjkqXypNYXRoLnNpbihyKSxrPXt4OncseTp4fTtyZXR1cm57cG9pbnQ6YSxjb3JlOmssYW5nbGU6cixsZW5ndGg6Xyx0eXBlOnV9fX0se2tleToiZHJhd0Fycm93SGVhZCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyl7dC5zdHJva2VTdHlsZT10aGlzLmdldENvbG9yKHQsZSxpKSx0LmZpbGxTdHlsZT10LnN0cm9rZVN0eWxlLHQubGluZVdpZHRoPXRoaXMuZ2V0TGluZVdpZHRoKGUsaSksby50eXBlJiYiY2lyY2xlIj09PW8udHlwZS50b0xvd2VyQ2FzZSgpP3QuY2lyY2xlRW5kcG9pbnQoby5wb2ludC54LG8ucG9pbnQueSxvLmFuZ2xlLG8ubGVuZ3RoKTp0LmFycm93RW5kcG9pbnQoby5wb2ludC54LG8ucG9pbnQueSxvLmFuZ2xlLG8ubGVuZ3RoKSx0aGlzLmVuYWJsZVNoYWRvdyh0KSx0LmZpbGwoKSx0aGlzLmRpc2FibGVTaGFkb3codCl9fSx7a2V5OiJlbmFibGVTaGFkb3ciLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucy5zaGFkb3cuZW5hYmxlZD09PSEwJiYodC5zaGFkb3dDb2xvcj10aGlzLm9wdGlvbnMuc2hhZG93LmNvbG9yLHQuc2hhZG93Qmx1cj10aGlzLm9wdGlvbnMuc2hhZG93LnNpemUsdC5zaGFkb3dPZmZzZXRYPXRoaXMub3B0aW9ucy5zaGFkb3cueCx0LnNoYWRvd09mZnNldFk9dGhpcy5vcHRpb25zLnNoYWRvdy55KX19LHtrZXk6ImRpc2FibGVTaGFkb3ciLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucy5zaGFkb3cuZW5hYmxlZD09PSEwJiYodC5zaGFkb3dDb2xvcj0icmdiYSgwLDAsMCwwKSIsdC5zaGFkb3dCbHVyPTAsdC5zaGFkb3dPZmZzZXRYPTAsdC5zaGFkb3dPZmZzZXRZPTApfX1dKSx0fSgpO2UuZGVmYXVsdD1hfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIHModCxlKXtpZighdCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiFlfHwib2JqZWN0IiE9dHlwZW9mIGUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlP3Q6ZX1mdW5jdGlvbiByKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgZSk7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxlKTp0Ll9fcHJvdG9fXz1lKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dmFyIGk9W10sbz0hMCxuPSExLHM9dm9pZCAwO3RyeXtmb3IodmFyIHIsYT10W1N5bWJvbC5pdGVyYXRvcl0oKTshKG89KHI9YS5uZXh0KCkpLmRvbmUpJiYoaS5wdXNoKHIudmFsdWUpLCFlfHxpLmxlbmd0aCE9PWUpO289ITApO31jYXRjaCh0KXtuPSEwLHM9dH1maW5hbGx5e3RyeXshbyYmYS5yZXR1cm4mJmEucmV0dXJuKCl9ZmluYWxseXtpZihuKXRocm93IHN9fXJldHVybiBpfXJldHVybiBmdW5jdGlvbihlLGkpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGU7aWYoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChlKSlyZXR1cm4gdChlLGkpO3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UiKX19KCksaD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG8pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG8mJnQoZSxvKSxlfX0oKSxkPWkoOTApLGw9byhkKSxjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG8pe24odGhpcyxlKTt2YXIgcj1zKHRoaXMsKGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSkpLmNhbGwodGhpcyx0LGksbykpO3JldHVybiByLl9ib3VuZEZ1bmN0aW9uPWZ1bmN0aW9uKCl7ci5wb3NpdGlvbkJlemllck5vZGUoKX0sci5ib2R5LmVtaXR0ZXIub24oIl9yZXBvc2l0aW9uQmV6aWVyTm9kZXMiLHIuX2JvdW5kRnVuY3Rpb24pLHJ9cmV0dXJuIHIoZSx0KSxoKGUsW3trZXk6InNldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPSExO3RoaXMub3B0aW9ucy5waHlzaWNzIT09dC5waHlzaWNzJiYoZT0hMCksdGhpcy5vcHRpb25zPXQsdGhpcy5pZD10aGlzLm9wdGlvbnMuaWQsdGhpcy5mcm9tPXRoaXMuYm9keS5ub2Rlc1t0aGlzLm9wdGlvbnMuZnJvbV0sdGhpcy50bz10aGlzLmJvZHkubm9kZXNbdGhpcy5vcHRpb25zLnRvXSx0aGlzLnNldHVwU3VwcG9ydE5vZGUoKSx0aGlzLmNvbm5lY3QoKSxlPT09ITAmJih0aGlzLnZpYS5zZXRPcHRpb25zKHtwaHlzaWNzOnRoaXMub3B0aW9ucy5waHlzaWNzfSksdGhpcy5wb3NpdGlvbkJlemllck5vZGUoKSl9fSx7a2V5OiJjb25uZWN0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuZnJvbT10aGlzLmJvZHkubm9kZXNbdGhpcy5vcHRpb25zLmZyb21dLHRoaXMudG89dGhpcy5ib2R5Lm5vZGVzW3RoaXMub3B0aW9ucy50b10sdm9pZCAwPT09dGhpcy5mcm9tfHx2b2lkIDA9PT10aGlzLnRvfHx0aGlzLm9wdGlvbnMucGh5c2ljcz09PSExP3RoaXMudmlhLnNldE9wdGlvbnMoe3BoeXNpY3M6ITF9KTp0aGlzLmZyb20uaWQ9PT10aGlzLnRvLmlkP3RoaXMudmlhLnNldE9wdGlvbnMoe3BoeXNpY3M6ITF9KTp0aGlzLnZpYS5zZXRPcHRpb25zKHtwaHlzaWNzOiEwfSl9fSx7a2V5OiJjbGVhbnVwIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJvZHkuZW1pdHRlci5vZmYoIl9yZXBvc2l0aW9uQmV6aWVyTm9kZXMiLHRoaXMuX2JvdW5kRnVuY3Rpb24pLHZvaWQgMCE9PXRoaXMudmlhJiYoZGVsZXRlIHRoaXMuYm9keS5ub2Rlc1t0aGlzLnZpYS5pZF0sdGhpcy52aWE9dm9pZCAwLCEwKX19LHtrZXk6InNldHVwU3VwcG9ydE5vZGUiLHZhbHVlOmZ1bmN0aW9uKCl7aWYodm9pZCAwPT09dGhpcy52aWEpe3ZhciB0PSJlZGdlSWQ6Iit0aGlzLmlkLGU9dGhpcy5ib2R5LmZ1bmN0aW9ucy5jcmVhdGVOb2RlKHtpZDp0LHNoYXBlOiJjaXJjbGUiLHBoeXNpY3M6ITAsaGlkZGVuOiEwfSk7dGhpcy5ib2R5Lm5vZGVzW3RdPWUsdGhpcy52aWE9ZSx0aGlzLnZpYS5wYXJlbnRFZGdlSWQ9dGhpcy5pZCx0aGlzLnBvc2l0aW9uQmV6aWVyTm9kZSgpfX19LHtrZXk6InBvc2l0aW9uQmV6aWVyTm9kZSIsdmFsdWU6ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLnZpYSYmdm9pZCAwIT09dGhpcy5mcm9tJiZ2b2lkIDAhPT10aGlzLnRvPyh0aGlzLnZpYS54PS41Kih0aGlzLmZyb20ueCt0aGlzLnRvLngpLHRoaXMudmlhLnk9LjUqKHRoaXMuZnJvbS55K3RoaXMudG8ueSkpOnZvaWQgMCE9PXRoaXMudmlhJiYodGhpcy52aWEueD0wLHRoaXMudmlhLnk9MCl9fSx7a2V5OiJfbGluZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0LmJlZ2luUGF0aCgpLHQubW92ZVRvKHRoaXMuZnJvbVBvaW50LngsdGhpcy5mcm9tUG9pbnQueSksdm9pZCAwPT09ZS54P3QubGluZVRvKHRoaXMudG9Qb2ludC54LHRoaXMudG9Qb2ludC55KTp0LnF1YWRyYXRpY0N1cnZlVG8oZS54LGUueSx0aGlzLnRvUG9pbnQueCx0aGlzLnRvUG9pbnQueSksdGhpcy5lbmFibGVTaGFkb3codCksdC5zdHJva2UoKSx0aGlzLmRpc2FibGVTaGFkb3codCl9fSx7a2V5OiJnZXRWaWFOb2RlIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpYX19LHtrZXk6ImdldFBvaW50Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06dGhpcy52aWEsaT10LG89dm9pZCAwLG49dm9pZCAwO2lmKHRoaXMuZnJvbT09PXRoaXMudG8pe3ZhciBzPXRoaXMuX2dldENpcmNsZURhdGEodGhpcy5mcm9tKSxyPWEocywzKSxoPXJbMF0sZD1yWzFdLGw9clsyXSxjPTIqTWF0aC5QSSooMS1pKTtvPWgrbCpNYXRoLnNpbihjKSxuPWQrbC1sKigxLU1hdGguY29zKGMpKX1lbHNlIG89TWF0aC5wb3coMS1pLDIpKnRoaXMuZnJvbVBvaW50LngrMippKigxLWkpKmUueCtNYXRoLnBvdyhpLDIpKnRoaXMudG9Qb2ludC54LG49TWF0aC5wb3coMS1pLDIpKnRoaXMuZnJvbVBvaW50LnkrMippKigxLWkpKmUueStNYXRoLnBvdyhpLDIpKnRoaXMudG9Qb2ludC55O3JldHVybnt4Om8seTpufX19LHtrZXk6Il9maW5kQm9yZGVyUG9zaXRpb24iLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2ZpbmRCb3JkZXJQb3NpdGlvbkJlemllcih0LGUsdGhpcy52aWEpfX0se2tleToiX2dldERpc3RhbmNlVG9FZGdlIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7cmV0dXJuIHRoaXMuX2dldERpc3RhbmNlVG9CZXppZXJFZGdlKHQsZSxpLG8sbixzLHRoaXMudmlhKX19XSksZX0obC5kZWZhdWx0KTtlLmRlZmF1bHQ9Y30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWZ1bmN0aW9uIG4odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBzKHQsZSl7aWYoIXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hZXx8Im9iamVjdCIhPXR5cGVvZiBlJiYiZnVuY3Rpb24iIT10eXBlb2YgZT90OmV9ZnVuY3Rpb24gcih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIGUpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHQsZSk6dC5fX3Byb3RvX189ZSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBvJiYoby53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsby5rZXksbyl9fXJldHVybiBmdW5jdGlvbihlLGksbyl7cmV0dXJuIGkmJnQoZS5wcm90b3R5cGUsaSksbyYmdChlLG8pLGV9fSgpLGg9aSg5MCksZD1vKGgpLGw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyl7cmV0dXJuIG4odGhpcyxlKSxzKHRoaXMsKGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSkpLmNhbGwodGhpcyx0LGksbykpfXJldHVybiByKGUsdCksYShlLFt7a2V5OiJfbGluZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0LmJlZ2luUGF0aCgpLHQubW92ZVRvKHRoaXMuZnJvbVBvaW50LngsdGhpcy5mcm9tUG9pbnQueSksdm9pZCAwPT09ZS54P3QubGluZVRvKHRoaXMudG9Qb2ludC54LHRoaXMudG9Qb2ludC55KTp0LnF1YWRyYXRpY0N1cnZlVG8oZS54LGUueSx0aGlzLnRvUG9pbnQueCx0aGlzLnRvUG9pbnQueSksdGhpcy5lbmFibGVTaGFkb3codCksdC5zdHJva2UoKSx0aGlzLmRpc2FibGVTaGFkb3codCl9fSx7a2V5OiJnZXRWaWFOb2RlIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXRWaWFDb29yZGluYXRlcygpfX0se2tleToiX2dldFZpYUNvb3JkaW5hdGVzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXZvaWQgMCxlPXZvaWQgMCxpPXRoaXMub3B0aW9ucy5zbW9vdGgucm91bmRuZXNzLG89dGhpcy5vcHRpb25zLnNtb290aC50eXBlLG49TWF0aC5hYnModGhpcy5mcm9tLngtdGhpcy50by54KSxzPU1hdGguYWJzKHRoaXMuZnJvbS55LXRoaXMudG8ueSk7aWYoImRpc2NyZXRlIj09PW98fCJkaWFnb25hbENyb3NzIj09PW8pTWF0aC5hYnModGhpcy5mcm9tLngtdGhpcy50by54KTw9TWF0aC5hYnModGhpcy5mcm9tLnktdGhpcy50by55KT8odGhpcy5mcm9tLnk+PXRoaXMudG8ueT90aGlzLmZyb20ueDw9dGhpcy50by54Pyh0PXRoaXMuZnJvbS54K2kqcyxlPXRoaXMuZnJvbS55LWkqcyk6dGhpcy5mcm9tLng+dGhpcy50by54JiYodD10aGlzLmZyb20ueC1pKnMsZT10aGlzLmZyb20ueS1pKnMpOnRoaXMuZnJvbS55PHRoaXMudG8ueSYmKHRoaXMuZnJvbS54PD10aGlzLnRvLng/KHQ9dGhpcy5mcm9tLngraSpzLGU9dGhpcy5mcm9tLnkraSpzKTp0aGlzLmZyb20ueD50aGlzLnRvLngmJih0PXRoaXMuZnJvbS54LWkqcyxlPXRoaXMuZnJvbS55K2kqcykpLCJkaXNjcmV0ZSI9PT1vJiYodD1uPGkqcz90aGlzLmZyb20ueDp0KSk6TWF0aC5hYnModGhpcy5mcm9tLngtdGhpcy50by54KT5NYXRoLmFicyh0aGlzLmZyb20ueS10aGlzLnRvLnkpJiYodGhpcy5mcm9tLnk+PXRoaXMudG8ueT90aGlzLmZyb20ueDw9dGhpcy50by54Pyh0PXRoaXMuZnJvbS54K2kqbixlPXRoaXMuZnJvbS55LWkqbik6dGhpcy5mcm9tLng+dGhpcy50by54JiYodD10aGlzLmZyb20ueC1pKm4sZT10aGlzLmZyb20ueS1pKm4pOnRoaXMuZnJvbS55PHRoaXMudG8ueSYmKHRoaXMuZnJvbS54PD10aGlzLnRvLng/KHQ9dGhpcy5mcm9tLngraSpuLGU9dGhpcy5mcm9tLnkraSpuKTp0aGlzLmZyb20ueD50aGlzLnRvLngmJih0PXRoaXMuZnJvbS54LWkqbixlPXRoaXMuZnJvbS55K2kqbikpLCJkaXNjcmV0ZSI9PT1vJiYoZT1zPGkqbj90aGlzLmZyb20ueTplKSk7ZWxzZSBpZigic3RyYWlnaHRDcm9zcyI9PT1vKU1hdGguYWJzKHRoaXMuZnJvbS54LXRoaXMudG8ueCk8PU1hdGguYWJzKHRoaXMuZnJvbS55LXRoaXMudG8ueSk/KHQ9dGhpcy5mcm9tLngsZT10aGlzLmZyb20ueTx0aGlzLnRvLnk/dGhpcy50by55LSgxLWkpKnM6dGhpcy50by55KygxLWkpKnMpOk1hdGguYWJzKHRoaXMuZnJvbS54LXRoaXMudG8ueCk+TWF0aC5hYnModGhpcy5mcm9tLnktdGhpcy50by55KSYmKHQ9dGhpcy5mcm9tLng8dGhpcy50by54P3RoaXMudG8ueC0oMS1pKSpuOnRoaXMudG8ueCsoMS1pKSpuLGU9dGhpcy5mcm9tLnkpO2Vsc2UgaWYoImhvcml6b250YWwiPT09byl0PXRoaXMuZnJvbS54PHRoaXMudG8ueD90aGlzLnRvLngtKDEtaSkqbjp0aGlzLnRvLngrKDEtaSkqbixlPXRoaXMuZnJvbS55O2Vsc2UgaWYoInZlcnRpY2FsIj09PW8pdD10aGlzLmZyb20ueCxlPXRoaXMuZnJvbS55PHRoaXMudG8ueT90aGlzLnRvLnktKDEtaSkqczp0aGlzLnRvLnkrKDEtaSkqcztlbHNlIGlmKCJjdXJ2ZWRDVyI9PT1vKXtuPXRoaXMudG8ueC10aGlzLmZyb20ueCxzPXRoaXMuZnJvbS55LXRoaXMudG8ueTt2YXIgcj1NYXRoLnNxcnQobipuK3MqcyksYT1NYXRoLlBJLGg9TWF0aC5hdGFuMihzLG4pLGQ9KGgrKC41KmkrLjUpKmEpJSgyKmEpO3Q9dGhpcy5mcm9tLngrKC41KmkrLjUpKnIqTWF0aC5zaW4oZCksZT10aGlzLmZyb20ueSsoLjUqaSsuNSkqcipNYXRoLmNvcyhkKX1lbHNlIGlmKCJjdXJ2ZWRDQ1ciPT09byl7bj10aGlzLnRvLngtdGhpcy5mcm9tLngscz10aGlzLmZyb20ueS10aGlzLnRvLnk7dmFyIGw9TWF0aC5zcXJ0KG4qbitzKnMpLGM9TWF0aC5QSSx1PU1hdGguYXRhbjIocyxuKSxwPSh1KyguNSotaSsuNSkqYyklKDIqYyk7dD10aGlzLmZyb20ueCsoLjUqaSsuNSkqbCpNYXRoLnNpbihwKSxlPXRoaXMuZnJvbS55KyguNSppKy41KSpsKk1hdGguY29zKHApfWVsc2UgTWF0aC5hYnModGhpcy5mcm9tLngtdGhpcy50by54KTw9TWF0aC5hYnModGhpcy5mcm9tLnktdGhpcy50by55KT90aGlzLmZyb20ueT49dGhpcy50by55P3RoaXMuZnJvbS54PD10aGlzLnRvLng/KHQ9dGhpcy5mcm9tLngraSpzLGU9dGhpcy5mcm9tLnktaSpzLHQ9dGhpcy50by54PHQ/dGhpcy50by54OnQpOnRoaXMuZnJvbS54PnRoaXMudG8ueCYmKHQ9dGhpcy5mcm9tLngtaSpzLGU9dGhpcy5mcm9tLnktaSpzLHQ9dGhpcy50by54PnQ/dGhpcy50by54OnQpOnRoaXMuZnJvbS55PHRoaXMudG8ueSYmKHRoaXMuZnJvbS54PD10aGlzLnRvLng/KHQ9dGhpcy5mcm9tLngraSpzLGU9dGhpcy5mcm9tLnkraSpzLHQ9dGhpcy50by54PHQ/dGhpcy50by54OnQpOnRoaXMuZnJvbS54PnRoaXMudG8ueCYmKHQ9dGhpcy5mcm9tLngtaSpzLGU9dGhpcy5mcm9tLnkraSpzLHQ9dGhpcy50by54PnQ/dGhpcy50by54OnQpKTpNYXRoLmFicyh0aGlzLmZyb20ueC10aGlzLnRvLngpPk1hdGguYWJzKHRoaXMuZnJvbS55LXRoaXMudG8ueSkmJih0aGlzLmZyb20ueT49dGhpcy50by55P3RoaXMuZnJvbS54PD10aGlzLnRvLng/KHQ9dGhpcy5mcm9tLngraSpuLGU9dGhpcy5mcm9tLnktaSpuLGU9dGhpcy50by55PmU/dGhpcy50by55OmUpOnRoaXMuZnJvbS54PnRoaXMudG8ueCYmKHQ9dGhpcy5mcm9tLngtaSpuLGU9dGhpcy5mcm9tLnktaSpuLGU9dGhpcy50by55PmU/dGhpcy50by55OmUpOnRoaXMuZnJvbS55PHRoaXMudG8ueSYmKHRoaXMuZnJvbS54PD10aGlzLnRvLng/KHQ9dGhpcy5mcm9tLngraSpuLGU9dGhpcy5mcm9tLnkraSpuLGU9dGhpcy50by55PGU/dGhpcy50by55OmUpOnRoaXMuZnJvbS54PnRoaXMudG8ueCYmKHQ9dGhpcy5mcm9tLngtaSpuLGU9dGhpcy5mcm9tLnkraSpuLGU9dGhpcy50by55PGU/dGhpcy50by55OmUpKSk7cmV0dXJue3g6dCx5OmV9fX0se2tleToiX2ZpbmRCb3JkZXJQb3NpdGlvbiIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e307cmV0dXJuIHRoaXMuX2ZpbmRCb3JkZXJQb3NpdGlvbkJlemllcih0LGUsaS52aWEpfX0se2tleToiX2dldERpc3RhbmNlVG9FZGdlIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD42JiZ2b2lkIDAhPT1hcmd1bWVudHNbNl0/YXJndW1lbnRzWzZdOnRoaXMuX2dldFZpYUNvb3JkaW5hdGVzKCk7cmV0dXJuIHRoaXMuX2dldERpc3RhbmNlVG9CZXppZXJFZGdlKHQsZSxpLG8sbixzLHIpfX0se2tleToiZ2V0UG9pbnQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp0aGlzLl9nZXRWaWFDb29yZGluYXRlcygpLGk9dCxvPU1hdGgucG93KDEtaSwyKSp0aGlzLmZyb21Qb2ludC54KzIqaSooMS1pKSplLngrTWF0aC5wb3coaSwyKSp0aGlzLnRvUG9pbnQueCxuPU1hdGgucG93KDEtaSwyKSp0aGlzLmZyb21Qb2ludC55KzIqaSooMS1pKSplLnkrTWF0aC5wb3coaSwyKSp0aGlzLnRvUG9pbnQueTtyZXR1cm57eDpvLHk6bn19fV0pLGV9KGQuZGVmYXVsdCk7ZS5kZWZhdWx0PWx9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1mdW5jdGlvbiBuKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gcyh0LGUpe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIWV8fCJvYmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU/dDplfWZ1bmN0aW9uIHIodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiBlKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LGUpOnQuX19wcm90b19fPWUpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG8pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG8mJnQoZSxvKSxlfX0oKSxoPWkoOTEpLGQ9byhoKSxsPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG8pe3JldHVybiBuKHRoaXMsZSkscyh0aGlzLChlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpKS5jYWxsKHRoaXMsdCxpLG8pKX1yZXR1cm4gcihlLHQpLGEoZSxbe2tleToiX2xpbmUiLHZhbHVlOmZ1bmN0aW9uKHQpe3QuYmVnaW5QYXRoKCksdC5tb3ZlVG8odGhpcy5mcm9tUG9pbnQueCx0aGlzLmZyb21Qb2ludC55KSx0LmxpbmVUbyh0aGlzLnRvUG9pbnQueCx0aGlzLnRvUG9pbnQueSksdGhpcy5lbmFibGVTaGFkb3codCksdC5zdHJva2UoKSx0aGlzLmRpc2FibGVTaGFkb3codCl9fSx7a2V5OiJnZXRWaWFOb2RlIix2YWx1ZTpmdW5jdGlvbigpe319LHtrZXk6ImdldFBvaW50Iix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm57eDooMS10KSp0aGlzLmZyb21Qb2ludC54K3QqdGhpcy50b1BvaW50LngseTooMS10KSp0aGlzLmZyb21Qb2ludC55K3QqdGhpcy50b1BvaW50Lnl9fX0se2tleToiX2ZpbmRCb3JkZXJQb3NpdGlvbiIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnRvLG89dGhpcy5mcm9tO3QuaWQ9PT10aGlzLmZyb20uaWQmJihpPXRoaXMuZnJvbSxvPXRoaXMudG8pO3ZhciBuPU1hdGguYXRhbjIoaS55LW8ueSxpLngtby54KSxzPWkueC1vLngscj1pLnktby55LGE9TWF0aC5zcXJ0KHMqcytyKnIpLGg9dC5kaXN0YW5jZVRvQm9yZGVyKGUsbiksZD0oYS1oKS9hLGw9e307cmV0dXJuIGwueD0oMS1kKSpvLngrZCppLngsbC55PSgxLWQpKm8ueStkKmkueSxsfX0se2tleToiX2dldERpc3RhbmNlVG9FZGdlIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7cmV0dXJuIHRoaXMuX2dldERpc3RhbmNlVG9MaW5lKHQsZSxpLG8sbixzKX19XSksZX0oZC5kZWZhdWx0KTtlLmRlZmF1bHQ9bH0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWZ1bmN0aW9uIG4odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxvJiZ0KGUsbyksZX19KCkscj1pKDk2KSxhPW8ociksaD1pKDk3KSxkPW8oaCksbD1pKDk4KSxjPW8obCksdT1pKDk5KSxwPW8odSksZj1pKDEwMCksbT1vKGYpLHY9aSgxMDEpLGc9byh2KSx5PWkoMTAyKSxiPW8oeSksXz1pKDEwMyksdz1vKF8pLHg9aSgxKSxrPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXtuKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5waHlzaWNzQm9keT17cGh5c2ljc05vZGVJbmRpY2VzOltdLHBoeXNpY3NFZGdlSW5kaWNlczpbXSxmb3JjZXM6e30sdmVsb2NpdGllczp7fX0sdGhpcy5waHlzaWNzRW5hYmxlZD0hMCx0aGlzLnNpbXVsYXRpb25JbnRlcnZhbD0xZTMvNjAsdGhpcy5yZXF1aXJlc1RpbWVvdXQ9ITAsdGhpcy5wcmV2aW91c1N0YXRlcz17fSx0aGlzLnJlZmVyZW5jZVN0YXRlPXt9LHRoaXMuZnJlZXplQ2FjaGU9e30sdGhpcy5yZW5kZXJUaW1lcj12b2lkIDAsdGhpcy5hZGFwdGl2ZVRpbWVzdGVwPSExLHRoaXMuYWRhcHRpdmVUaW1lc3RlcEVuYWJsZWQ9ITEsdGhpcy5hZGFwdGl2ZUNvdW50ZXI9MCx0aGlzLmFkYXB0aXZlSW50ZXJ2YWw9Myx0aGlzLnN0YWJpbGl6ZWQ9ITEsdGhpcy5zdGFydGVkU3RhYmlsaXphdGlvbj0hMSx0aGlzLnN0YWJpbGl6YXRpb25JdGVyYXRpb25zPTAsdGhpcy5yZWFkeT0hMSx0aGlzLm9wdGlvbnM9e30sdGhpcy5kZWZhdWx0T3B0aW9ucz17ZW5hYmxlZDohMCxiYXJuZXNIdXQ6e3RoZXRhOi41LGdyYXZpdGF0aW9uYWxDb25zdGFudDotMmUzLGNlbnRyYWxHcmF2aXR5Oi4zLHNwcmluZ0xlbmd0aDo5NSxzcHJpbmdDb25zdGFudDouMDQsZGFtcGluZzouMDksYXZvaWRPdmVybGFwOjB9LGZvcmNlQXRsYXMyQmFzZWQ6e3RoZXRhOi41LGdyYXZpdGF0aW9uYWxDb25zdGFudDotNTAsY2VudHJhbEdyYXZpdHk6LjAxLHNwcmluZ0NvbnN0YW50Oi4wOCxzcHJpbmdMZW5ndGg6MTAwLGRhbXBpbmc6LjQsYXZvaWRPdmVybGFwOjB9LHJlcHVsc2lvbjp7Y2VudHJhbEdyYXZpdHk6LjIsc3ByaW5nTGVuZ3RoOjIwMCxzcHJpbmdDb25zdGFudDouMDUsbm9kZURpc3RhbmNlOjEwMCxkYW1waW5nOi4wOSxhdm9pZE92ZXJsYXA6MH0saGllcmFyY2hpY2FsUmVwdWxzaW9uOntjZW50cmFsR3Jhdml0eTowLHNwcmluZ0xlbmd0aDoxMDAsc3ByaW5nQ29uc3RhbnQ6LjAxLG5vZGVEaXN0YW5jZToxMjAsZGFtcGluZzouMDl9LG1heFZlbG9jaXR5OjUwLG1pblZlbG9jaXR5Oi43NSxzb2x2ZXI6ImJhcm5lc0h1dCIsc3RhYmlsaXphdGlvbjp7ZW5hYmxlZDohMCxpdGVyYXRpb25zOjFlMyx1cGRhdGVJbnRlcnZhbDo1MCxvbmx5RHluYW1pY0VkZ2VzOiExLGZpdDohMH0sdGltZXN0ZXA6LjUsYWRhcHRpdmVUaW1lc3RlcDohMH0seC5leHRlbmQodGhpcy5vcHRpb25zLHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMudGltZXN0ZXA9LjUsdGhpcy5sYXlvdXRGYWlsZWQ9ITEsdGhpcy5iaW5kRXZlbnRMaXN0ZW5lcnMoKX1yZXR1cm4gcyh0LFt7a2V5OiJiaW5kRXZlbnRMaXN0ZW5lcnMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmJvZHkuZW1pdHRlci5vbigiaW5pdFBoeXNpY3MiLGZ1bmN0aW9uKCl7dC5pbml0UGh5c2ljcygpfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oIl9sYXlvdXRGYWlsZWQiLGZ1bmN0aW9uKCl7dC5sYXlvdXRGYWlsZWQ9ITB9KSx0aGlzLmJvZHkuZW1pdHRlci5vbigicmVzZXRQaHlzaWNzIixmdW5jdGlvbigpe3Quc3RvcFNpbXVsYXRpb24oKSx0LnJlYWR5PSExfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oImRpc2FibGVQaHlzaWNzIixmdW5jdGlvbigpe3QucGh5c2ljc0VuYWJsZWQ9ITEsdC5zdG9wU2ltdWxhdGlvbigpfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oInJlc3RvcmVQaHlzaWNzIixmdW5jdGlvbigpe3Quc2V0T3B0aW9ucyh0Lm9wdGlvbnMpLHQucmVhZHk9PT0hMCYmdC5zdGFydFNpbXVsYXRpb24oKX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJzdGFydFNpbXVsYXRpb24iLGZ1bmN0aW9uKCl7dC5yZWFkeT09PSEwJiZ0LnN0YXJ0U2ltdWxhdGlvbigpfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oInN0b3BTaW11bGF0aW9uIixmdW5jdGlvbigpe3Quc3RvcFNpbXVsYXRpb24oKX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJkZXN0cm95IixmdW5jdGlvbigpe3Quc3RvcFNpbXVsYXRpb24oITEpLHQuYm9keS5lbWl0dGVyLm9mZigpfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oIl9kYXRhQ2hhbmdlZCIsZnVuY3Rpb24oKXt0LnVwZGF0ZVBoeXNpY3NEYXRhKCl9KX19LHtrZXk6InNldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZvaWQgMCE9PXQmJih0PT09ITE/KHRoaXMub3B0aW9ucy5lbmFibGVkPSExLHRoaXMucGh5c2ljc0VuYWJsZWQ9ITEsdGhpcy5zdG9wU2ltdWxhdGlvbigpKToodGhpcy5waHlzaWNzRW5hYmxlZD0hMCx4LnNlbGVjdGl2ZU5vdERlZXBFeHRlbmQoWyJzdGFiaWxpemF0aW9uIl0sdGhpcy5vcHRpb25zLHQpLHgubWVyZ2VPcHRpb25zKHRoaXMub3B0aW9ucyx0LCJzdGFiaWxpemF0aW9uIiksdm9pZCAwPT09dC5lbmFibGVkJiYodGhpcy5vcHRpb25zLmVuYWJsZWQ9ITApLHRoaXMub3B0aW9ucy5lbmFibGVkPT09ITEmJih0aGlzLnBoeXNpY3NFbmFibGVkPSExLHRoaXMuc3RvcFNpbXVsYXRpb24oKSksdGhpcy50aW1lc3RlcD10aGlzLm9wdGlvbnMudGltZXN0ZXApKSx0aGlzLmluaXQoKX19LHtrZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ7ImZvcmNlQXRsYXMyQmFzZWQiPT09dGhpcy5vcHRpb25zLnNvbHZlcj8odD10aGlzLm9wdGlvbnMuZm9yY2VBdGxhczJCYXNlZCx0aGlzLm5vZGVzU29sdmVyPW5ldyBiLmRlZmF1bHQodGhpcy5ib2R5LHRoaXMucGh5c2ljc0JvZHksdCksdGhpcy5lZGdlc1NvbHZlcj1uZXcgcC5kZWZhdWx0KHRoaXMuYm9keSx0aGlzLnBoeXNpY3NCb2R5LHQpLHRoaXMuZ3Jhdml0eVNvbHZlcj1uZXcgdy5kZWZhdWx0KHRoaXMuYm9keSx0aGlzLnBoeXNpY3NCb2R5LHQpKToicmVwdWxzaW9uIj09PXRoaXMub3B0aW9ucy5zb2x2ZXI/KHQ9dGhpcy5vcHRpb25zLnJlcHVsc2lvbix0aGlzLm5vZGVzU29sdmVyPW5ldyBkLmRlZmF1bHQodGhpcy5ib2R5LHRoaXMucGh5c2ljc0JvZHksdCksdGhpcy5lZGdlc1NvbHZlcj1uZXcgcC5kZWZhdWx0KHRoaXMuYm9keSx0aGlzLnBoeXNpY3NCb2R5LHQpLHRoaXMuZ3Jhdml0eVNvbHZlcj1uZXcgZy5kZWZhdWx0KHRoaXMuYm9keSx0aGlzLnBoeXNpY3NCb2R5LHQpKToiaGllcmFyY2hpY2FsUmVwdWxzaW9uIj09PXRoaXMub3B0aW9ucy5zb2x2ZXI/KHQ9dGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbFJlcHVsc2lvbix0aGlzLm5vZGVzU29sdmVyPW5ldyBjLmRlZmF1bHQodGhpcy5ib2R5LHRoaXMucGh5c2ljc0JvZHksdCksdGhpcy5lZGdlc1NvbHZlcj1uZXcgbS5kZWZhdWx0KHRoaXMuYm9keSx0aGlzLnBoeXNpY3NCb2R5LHQpLHRoaXMuZ3Jhdml0eVNvbHZlcj1uZXcgZy5kZWZhdWx0KHRoaXMuYm9keSx0aGlzLnBoeXNpY3NCb2R5LHQpKToodD10aGlzLm9wdGlvbnMuYmFybmVzSHV0LHRoaXMubm9kZXNTb2x2ZXI9bmV3IGEuZGVmYXVsdCh0aGlzLmJvZHksdGhpcy5waHlzaWNzQm9keSx0KSx0aGlzLmVkZ2VzU29sdmVyPW5ldyBwLmRlZmF1bHQodGhpcy5ib2R5LHRoaXMucGh5c2ljc0JvZHksdCksdGhpcy5ncmF2aXR5U29sdmVyPW5ldyBnLmRlZmF1bHQodGhpcy5ib2R5LHRoaXMucGh5c2ljc0JvZHksdCkpLHRoaXMubW9kZWxPcHRpb25zPXR9fSx7a2V5OiJpbml0UGh5c2ljcyIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnBoeXNpY3NFbmFibGVkPT09ITAmJnRoaXMub3B0aW9ucy5lbmFibGVkPT09ITA/dGhpcy5vcHRpb25zLnN0YWJpbGl6YXRpb24uZW5hYmxlZD09PSEwP3RoaXMuc3RhYmlsaXplKCk6KHRoaXMuc3RhYmlsaXplZD0hMSx0aGlzLnJlYWR5PSEwLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoImZpdCIse30sdGhpcy5sYXlvdXRGYWlsZWQpLHRoaXMuc3RhcnRTaW11bGF0aW9uKCkpOih0aGlzLnJlYWR5PSEwLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoImZpdCIpKX19LHtrZXk6InN0YXJ0U2ltdWxhdGlvbiIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnBoeXNpY3NFbmFibGVkPT09ITAmJnRoaXMub3B0aW9ucy5lbmFibGVkPT09ITA/KHRoaXMuc3RhYmlsaXplZD0hMSx0aGlzLmFkYXB0aXZlVGltZXN0ZXA9ITEsdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX3Jlc2l6ZU5vZGVzIiksdm9pZCAwPT09dGhpcy52aWV3RnVuY3Rpb24mJih0aGlzLnZpZXdGdW5jdGlvbj10aGlzLnNpbXVsYXRpb25TdGVwLmJpbmQodGhpcyksdGhpcy5ib2R5LmVtaXR0ZXIub24oImluaXRSZWRyYXciLHRoaXMudmlld0Z1bmN0aW9uKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfc3RhcnRSZW5kZXJpbmciKSkpOnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9yZWRyYXciKX19LHtrZXk6InN0b3BTaW11bGF0aW9uIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PSEoYXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0pfHxhcmd1bWVudHNbMF07dGhpcy5zdGFiaWxpemVkPSEwLHQ9PT0hMCYmdGhpcy5fZW1pdFN0YWJpbGl6ZWQoKSx2b2lkIDAhPT10aGlzLnZpZXdGdW5jdGlvbiYmKHRoaXMuYm9keS5lbWl0dGVyLm9mZigiaW5pdFJlZHJhdyIsdGhpcy52aWV3RnVuY3Rpb24pLHRoaXMudmlld0Z1bmN0aW9uPXZvaWQgMCx0PT09ITAmJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9zdG9wUmVuZGVyaW5nIikpfX0se2tleToic2ltdWxhdGlvblN0ZXAiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9RGF0ZS5ub3coKTt0aGlzLnBoeXNpY3NUaWNrKCk7dmFyIGU9RGF0ZS5ub3coKS10OyhlPC40KnRoaXMuc2ltdWxhdGlvbkludGVydmFsfHx0aGlzLnJ1bkRvdWJsZVNwZWVkPT09ITApJiZ0aGlzLnN0YWJpbGl6ZWQ9PT0hMSYmKHRoaXMucGh5c2ljc1RpY2soKSx0aGlzLnJ1bkRvdWJsZVNwZWVkPSEwKSx0aGlzLnN0YWJpbGl6ZWQ9PT0hMCYmdGhpcy5zdG9wU2ltdWxhdGlvbigpfX0se2tleToiX2VtaXRTdGFiaWxpemVkIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06dGhpcy5zdGFiaWxpemF0aW9uSXRlcmF0aW9uczsodGhpcy5zdGFiaWxpemF0aW9uSXRlcmF0aW9ucz4xfHx0aGlzLnN0YXJ0ZWRTdGFiaWxpemF0aW9uPT09ITApJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5ib2R5LmVtaXR0ZXIuZW1pdCgic3RhYmlsaXplZCIse2l0ZXJhdGlvbnM6ZX0pLHQuc3RhcnRlZFN0YWJpbGl6YXRpb249ITEsdC5zdGFiaWxpemF0aW9uSXRlcmF0aW9ucz0wfSwwKX19LHtrZXk6InBoeXNpY3NUaWNrIix2YWx1ZTpmdW5jdGlvbigpe2lmKHRoaXMuc3RhcnRlZFN0YWJpbGl6YXRpb249PT0hMSYmKHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoInN0YXJ0U3RhYmlsaXppbmciKSx0aGlzLnN0YXJ0ZWRTdGFiaWxpemF0aW9uPSEwKSx0aGlzLnN0YWJpbGl6ZWQ9PT0hMSl7aWYodGhpcy5hZGFwdGl2ZVRpbWVzdGVwPT09ITAmJnRoaXMuYWRhcHRpdmVUaW1lc3RlcEVuYWJsZWQ9PT0hMCl7dmFyIHQ9MS4yO3RoaXMuYWRhcHRpdmVDb3VudGVyJXRoaXMuYWRhcHRpdmVJbnRlcnZhbD09PTA/KHRoaXMudGltZXN0ZXA9Mip0aGlzLnRpbWVzdGVwLHRoaXMuY2FsY3VsYXRlRm9yY2VzKCksdGhpcy5tb3ZlTm9kZXMoKSx0aGlzLnJldmVydCgpLHRoaXMudGltZXN0ZXA9LjUqdGhpcy50aW1lc3RlcCx0aGlzLmNhbGN1bGF0ZUZvcmNlcygpLHRoaXMubW92ZU5vZGVzKCksdGhpcy5jYWxjdWxhdGVGb3JjZXMoKSx0aGlzLm1vdmVOb2RlcygpLHRoaXMuX2V2YWx1YXRlU3RlcFF1YWxpdHkoKT09PSEwP3RoaXMudGltZXN0ZXA9dCp0aGlzLnRpbWVzdGVwOnRoaXMudGltZXN0ZXAvdDx0aGlzLm9wdGlvbnMudGltZXN0ZXA/dGhpcy50aW1lc3RlcD10aGlzLm9wdGlvbnMudGltZXN0ZXA6KHRoaXMuYWRhcHRpdmVDb3VudGVyPS0xLHRoaXMudGltZXN0ZXA9TWF0aC5tYXgodGhpcy5vcHRpb25zLnRpbWVzdGVwLHRoaXMudGltZXN0ZXAvdCkpKToodGhpcy5jYWxjdWxhdGVGb3JjZXMoKSx0aGlzLm1vdmVOb2RlcygpKSx0aGlzLmFkYXB0aXZlQ291bnRlcis9MX1lbHNlIHRoaXMudGltZXN0ZXA9dGhpcy5vcHRpb25zLnRpbWVzdGVwLAp0aGlzLmNhbGN1bGF0ZUZvcmNlcygpLHRoaXMubW92ZU5vZGVzKCk7dGhpcy5zdGFiaWxpemVkPT09ITAmJnRoaXMucmV2ZXJ0KCksdGhpcy5zdGFiaWxpemF0aW9uSXRlcmF0aW9ucysrfX19LHtrZXk6InVwZGF0ZVBoeXNpY3NEYXRhIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMucGh5c2ljc0JvZHkuZm9yY2VzPXt9LHRoaXMucGh5c2ljc0JvZHkucGh5c2ljc05vZGVJbmRpY2VzPVtdLHRoaXMucGh5c2ljc0JvZHkucGh5c2ljc0VkZ2VJbmRpY2VzPVtdO3ZhciB0PXRoaXMuYm9keS5ub2RlcyxlPXRoaXMuYm9keS5lZGdlcztmb3IodmFyIGkgaW4gdCl0Lmhhc093blByb3BlcnR5KGkpJiZ0W2ldLm9wdGlvbnMucGh5c2ljcz09PSEwJiZ0aGlzLnBoeXNpY3NCb2R5LnBoeXNpY3NOb2RlSW5kaWNlcy5wdXNoKHRbaV0uaWQpO2Zvcih2YXIgbyBpbiBlKWUuaGFzT3duUHJvcGVydHkobykmJmVbb10ub3B0aW9ucy5waHlzaWNzPT09ITAmJnRoaXMucGh5c2ljc0JvZHkucGh5c2ljc0VkZ2VJbmRpY2VzLnB1c2goZVtvXS5pZCk7Zm9yKHZhciBuPTA7bjx0aGlzLnBoeXNpY3NCb2R5LnBoeXNpY3NOb2RlSW5kaWNlcy5sZW5ndGg7bisrKXt2YXIgcz10aGlzLnBoeXNpY3NCb2R5LnBoeXNpY3NOb2RlSW5kaWNlc1tuXTt0aGlzLnBoeXNpY3NCb2R5LmZvcmNlc1tzXT17eDowLHk6MH0sdm9pZCAwPT09dGhpcy5waHlzaWNzQm9keS52ZWxvY2l0aWVzW3NdJiYodGhpcy5waHlzaWNzQm9keS52ZWxvY2l0aWVzW3NdPXt4OjAseTowfSl9Zm9yKHZhciByIGluIHRoaXMucGh5c2ljc0JvZHkudmVsb2NpdGllcyl2b2lkIDA9PT10W3JdJiZkZWxldGUgdGhpcy5waHlzaWNzQm9keS52ZWxvY2l0aWVzW3JdfX0se2tleToicmV2ZXJ0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PU9iamVjdC5rZXlzKHRoaXMucHJldmlvdXNTdGF0ZXMpLGU9dGhpcy5ib2R5Lm5vZGVzLGk9dGhpcy5waHlzaWNzQm9keS52ZWxvY2l0aWVzO3RoaXMucmVmZXJlbmNlU3RhdGU9e307Zm9yKHZhciBvPTA7bzx0Lmxlbmd0aDtvKyspe3ZhciBuPXRbb107dm9pZCAwIT09ZVtuXT9lW25dLm9wdGlvbnMucGh5c2ljcz09PSEwJiYodGhpcy5yZWZlcmVuY2VTdGF0ZVtuXT17cG9zaXRpb25zOnt4OmVbbl0ueCx5OmVbbl0ueX19LGlbbl0ueD10aGlzLnByZXZpb3VzU3RhdGVzW25dLnZ4LGlbbl0ueT10aGlzLnByZXZpb3VzU3RhdGVzW25dLnZ5LGVbbl0ueD10aGlzLnByZXZpb3VzU3RhdGVzW25dLngsZVtuXS55PXRoaXMucHJldmlvdXNTdGF0ZXNbbl0ueSk6ZGVsZXRlIHRoaXMucHJldmlvdXNTdGF0ZXNbbl19fX0se2tleToiX2V2YWx1YXRlU3RlcFF1YWxpdHkiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dm9pZCAwLGU9dm9pZCAwLGk9dm9pZCAwLG89dGhpcy5ib2R5Lm5vZGVzLG49dGhpcy5yZWZlcmVuY2VTdGF0ZSxzPS4zO2Zvcih2YXIgciBpbiB0aGlzLnJlZmVyZW5jZVN0YXRlKWlmKHRoaXMucmVmZXJlbmNlU3RhdGUuaGFzT3duUHJvcGVydHkocikmJnZvaWQgMCE9PW9bcl0mJih0PW9bcl0ueC1uW3JdLnBvc2l0aW9ucy54LGU9b1tyXS55LW5bcl0ucG9zaXRpb25zLnksaT1NYXRoLnNxcnQoTWF0aC5wb3codCwyKStNYXRoLnBvdyhlLDIpKSxpPnMpKXJldHVybiExO3JldHVybiEwfX0se2tleToibW92ZU5vZGVzIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnBoeXNpY3NCb2R5LnBoeXNpY3NOb2RlSW5kaWNlcyxlPXRoaXMub3B0aW9ucy5tYXhWZWxvY2l0eT90aGlzLm9wdGlvbnMubWF4VmVsb2NpdHk6MWU5LGk9MCxvPTAsbj01LHM9MDtzPHQubGVuZ3RoO3MrKyl7dmFyIHI9dFtzXSxhPXRoaXMuX3BlcmZvcm1TdGVwKHIsZSk7aT1NYXRoLm1heChpLGEpLG8rPWF9dGhpcy5hZGFwdGl2ZVRpbWVzdGVwRW5hYmxlZD1vL3QubGVuZ3RoPG4sdGhpcy5zdGFiaWxpemVkPWk8dGhpcy5vcHRpb25zLm1pblZlbG9jaXR5fX0se2tleToiX3BlcmZvcm1TdGVwIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuYm9keS5ub2Rlc1t0XSxvPXRoaXMudGltZXN0ZXAsbj10aGlzLnBoeXNpY3NCb2R5LmZvcmNlcyxzPXRoaXMucGh5c2ljc0JvZHkudmVsb2NpdGllcztpZih0aGlzLnByZXZpb3VzU3RhdGVzW3RdPXt4OmkueCx5OmkueSx2eDpzW3RdLngsdnk6c1t0XS55fSxpLm9wdGlvbnMuZml4ZWQueD09PSExKXt2YXIgcj10aGlzLm1vZGVsT3B0aW9ucy5kYW1waW5nKnNbdF0ueCxhPShuW3RdLngtcikvaS5vcHRpb25zLm1hc3M7c1t0XS54Kz1hKm8sc1t0XS54PU1hdGguYWJzKHNbdF0ueCk+ZT9zW3RdLng+MD9lOi1lOnNbdF0ueCxpLngrPXNbdF0ueCpvfWVsc2Ugblt0XS54PTAsc1t0XS54PTA7aWYoaS5vcHRpb25zLmZpeGVkLnk9PT0hMSl7dmFyIGg9dGhpcy5tb2RlbE9wdGlvbnMuZGFtcGluZypzW3RdLnksZD0oblt0XS55LWgpL2kub3B0aW9ucy5tYXNzO3NbdF0ueSs9ZCpvLHNbdF0ueT1NYXRoLmFicyhzW3RdLnkpPmU/c1t0XS55PjA/ZTotZTpzW3RdLnksaS55Kz1zW3RdLnkqb31lbHNlIG5bdF0ueT0wLHNbdF0ueT0wO3ZhciBsPU1hdGguc3FydChNYXRoLnBvdyhzW3RdLngsMikrTWF0aC5wb3coc1t0XS55LDIpKTtyZXR1cm4gbH19LHtrZXk6ImNhbGN1bGF0ZUZvcmNlcyIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmdyYXZpdHlTb2x2ZXIuc29sdmUoKSx0aGlzLm5vZGVzU29sdmVyLnNvbHZlKCksdGhpcy5lZGdlc1NvbHZlci5zb2x2ZSgpfX0se2tleToiX2ZyZWV6ZU5vZGVzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYm9keS5ub2Rlcztmb3IodmFyIGUgaW4gdCl0Lmhhc093blByb3BlcnR5KGUpJiZ0W2VdLngmJnRbZV0ueSYmKHRoaXMuZnJlZXplQ2FjaGVbZV09e3g6dFtlXS5vcHRpb25zLmZpeGVkLngseTp0W2VdLm9wdGlvbnMuZml4ZWQueX0sdFtlXS5vcHRpb25zLmZpeGVkLng9ITAsdFtlXS5vcHRpb25zLmZpeGVkLnk9ITApfX0se2tleToiX3Jlc3RvcmVGcm96ZW5Ob2RlcyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJvZHkubm9kZXM7Zm9yKHZhciBlIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShlKSYmdm9pZCAwIT09dGhpcy5mcmVlemVDYWNoZVtlXSYmKHRbZV0ub3B0aW9ucy5maXhlZC54PXRoaXMuZnJlZXplQ2FjaGVbZV0ueCx0W2VdLm9wdGlvbnMuZml4ZWQueT10aGlzLmZyZWV6ZUNhY2hlW2VdLnkpO3RoaXMuZnJlZXplQ2FjaGU9e319fSx7a2V5OiJzdGFiaWxpemUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp0aGlzLm9wdGlvbnMuc3RhYmlsaXphdGlvbi5pdGVyYXRpb25zO3JldHVybiJudW1iZXIiIT10eXBlb2YgZSYmKGNvbnNvbGUubG9nKCJUaGUgc3RhYmlsaXplIG1ldGhvZCBuZWVkcyBhIG51bWVyaWMgYW1vdW50IG9mIGl0ZXJhdGlvbnMuIFN3aXRjaGluZyB0byBkZWZhdWx0OiAiLHRoaXMub3B0aW9ucy5zdGFiaWxpemF0aW9uLml0ZXJhdGlvbnMpLGU9dGhpcy5vcHRpb25zLnN0YWJpbGl6YXRpb24uaXRlcmF0aW9ucyksMD09PXRoaXMucGh5c2ljc0JvZHkucGh5c2ljc05vZGVJbmRpY2VzLmxlbmd0aD92b2lkKHRoaXMucmVhZHk9ITApOih0aGlzLmFkYXB0aXZlVGltZXN0ZXA9dGhpcy5vcHRpb25zLmFkYXB0aXZlVGltZXN0ZXAsdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX3Jlc2l6ZU5vZGVzIiksdGhpcy5zdG9wU2ltdWxhdGlvbigpLHRoaXMuc3RhYmlsaXplZD0hMSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfYmxvY2tSZWRyYXciKSx0aGlzLnRhcmdldEl0ZXJhdGlvbnM9ZSx0aGlzLm9wdGlvbnMuc3RhYmlsaXphdGlvbi5vbmx5RHluYW1pY0VkZ2VzPT09ITAmJnRoaXMuX2ZyZWV6ZU5vZGVzKCksdGhpcy5zdGFiaWxpemF0aW9uSXRlcmF0aW9ucz0wLHZvaWQgc2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiB0Ll9zdGFiaWxpemF0aW9uQmF0Y2goKX0sMCkpfX0se2tleToiX3N0YWJpbGl6YXRpb25CYXRjaCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnN0YXJ0ZWRTdGFiaWxpemF0aW9uPT09ITEmJih0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJzdGFydFN0YWJpbGl6aW5nIiksdGhpcy5zdGFydGVkU3RhYmlsaXphdGlvbj0hMCk7Zm9yKHZhciB0PTA7dGhpcy5zdGFiaWxpemVkPT09ITEmJnQ8dGhpcy5vcHRpb25zLnN0YWJpbGl6YXRpb24udXBkYXRlSW50ZXJ2YWwmJnRoaXMuc3RhYmlsaXphdGlvbkl0ZXJhdGlvbnM8dGhpcy50YXJnZXRJdGVyYXRpb25zOyl0aGlzLnBoeXNpY3NUaWNrKCksdCsrO3RoaXMuc3RhYmlsaXplZD09PSExJiZ0aGlzLnN0YWJpbGl6YXRpb25JdGVyYXRpb25zPHRoaXMudGFyZ2V0SXRlcmF0aW9ucz8odGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgic3RhYmlsaXphdGlvblByb2dyZXNzIix7aXRlcmF0aW9uczp0aGlzLnN0YWJpbGl6YXRpb25JdGVyYXRpb25zLHRvdGFsOnRoaXMudGFyZ2V0SXRlcmF0aW9uc30pLHNldFRpbWVvdXQodGhpcy5fc3RhYmlsaXphdGlvbkJhdGNoLmJpbmQodGhpcyksMCkpOnRoaXMuX2ZpbmFsaXplU3RhYmlsaXphdGlvbigpfX0se2tleToiX2ZpbmFsaXplU3RhYmlsaXphdGlvbiIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfYWxsb3dSZWRyYXciKSx0aGlzLm9wdGlvbnMuc3RhYmlsaXphdGlvbi5maXQ9PT0hMCYmdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiZml0IiksdGhpcy5vcHRpb25zLnN0YWJpbGl6YXRpb24ub25seUR5bmFtaWNFZGdlcz09PSEwJiZ0aGlzLl9yZXN0b3JlRnJvemVuTm9kZXMoKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJzdGFiaWxpemF0aW9uSXRlcmF0aW9uc0RvbmUiKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfcmVxdWVzdFJlZHJhdyIpLHRoaXMuc3RhYmlsaXplZD09PSEwP3RoaXMuX2VtaXRTdGFiaWxpemVkKCk6dGhpcy5zdGFydFNpbXVsYXRpb24oKSx0aGlzLnJlYWR5PSEwfX0se2tleToiX2RyYXdGb3JjZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5waHlzaWNzQm9keS5waHlzaWNzTm9kZUluZGljZXMubGVuZ3RoO2UrKyl7dmFyIGk9dGhpcy5ib2R5Lm5vZGVzW3RoaXMucGh5c2ljc0JvZHkucGh5c2ljc05vZGVJbmRpY2VzW2VdXSxvPXRoaXMucGh5c2ljc0JvZHkuZm9yY2VzW3RoaXMucGh5c2ljc0JvZHkucGh5c2ljc05vZGVJbmRpY2VzW2VdXSxuPTIwLHM9LjAzLHI9TWF0aC5zcXJ0KE1hdGgucG93KG8ueCwyKStNYXRoLnBvdyhvLngsMikpLGE9TWF0aC5taW4oTWF0aC5tYXgoNSxyKSwxNSksaD0zKmEsZD14LkhTVlRvSGV4KCgxODAtMTgwKk1hdGgubWluKDEsTWF0aC5tYXgoMCxzKnIpKSkvMzYwLDEsMSk7dC5saW5lV2lkdGg9YSx0LnN0cm9rZVN0eWxlPWQsdC5iZWdpblBhdGgoKSx0Lm1vdmVUbyhpLngsaS55KSx0LmxpbmVUbyhpLngrbipvLngsaS55K24qby55KSx0LnN0cm9rZSgpO3ZhciBsPU1hdGguYXRhbjIoby55LG8ueCk7dC5maWxsU3R5bGU9ZCx0LmFycm93RW5kcG9pbnQoaS54K24qby54K01hdGguY29zKGwpKmgsaS55K24qby55K01hdGguc2luKGwpKmgsbCxoKSx0LmZpbGwoKX19fV0pLHR9KCk7ZS5kZWZhdWx0PWt9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gaSh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG8pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG8mJnQoZSxvKSxlfX0oKSxuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLG8sbil7aSh0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMucGh5c2ljc0JvZHk9byx0aGlzLmJhcm5lc0h1dFRyZWUsdGhpcy5zZXRPcHRpb25zKG4pLHRoaXMucmFuZG9tU2VlZD01fXJldHVybiBvKHQsW3trZXk6InNldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucz10LHRoaXMudGhldGFJbnZlcnNlZD0xL3RoaXMub3B0aW9ucy50aGV0YSx0aGlzLm92ZXJsYXBBdm9pZGFuY2VGYWN0b3I9MS1NYXRoLm1heCgwLE1hdGgubWluKDEsdGhpcy5vcHRpb25zLmF2b2lkT3ZlcmxhcCkpfX0se2tleToic2VlZGVkUmFuZG9tIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PTFlNCpNYXRoLnNpbih0aGlzLnJhbmRvbVNlZWQrKyk7cmV0dXJuIHQtTWF0aC5mbG9vcih0KX19LHtrZXk6InNvbHZlIix2YWx1ZTpmdW5jdGlvbigpe2lmKDAhPT10aGlzLm9wdGlvbnMuZ3Jhdml0YXRpb25hbENvbnN0YW50JiZ0aGlzLnBoeXNpY3NCb2R5LnBoeXNpY3NOb2RlSW5kaWNlcy5sZW5ndGg+MCl7dmFyIHQ9dm9pZCAwLGU9dGhpcy5ib2R5Lm5vZGVzLGk9dGhpcy5waHlzaWNzQm9keS5waHlzaWNzTm9kZUluZGljZXMsbz1pLmxlbmd0aCxuPXRoaXMuX2Zvcm1CYXJuZXNIdXRUcmVlKGUsaSk7dGhpcy5iYXJuZXNIdXRUcmVlPW47Zm9yKHZhciBzPTA7czxvO3MrKyl0PWVbaVtzXV0sdC5vcHRpb25zLm1hc3M+MCYmKHRoaXMuX2dldEZvcmNlQ29udHJpYnV0aW9uKG4ucm9vdC5jaGlsZHJlbi5OVyx0KSx0aGlzLl9nZXRGb3JjZUNvbnRyaWJ1dGlvbihuLnJvb3QuY2hpbGRyZW4uTkUsdCksdGhpcy5fZ2V0Rm9yY2VDb250cmlidXRpb24obi5yb290LmNoaWxkcmVuLlNXLHQpLHRoaXMuX2dldEZvcmNlQ29udHJpYnV0aW9uKG4ucm9vdC5jaGlsZHJlbi5TRSx0KSl9fX0se2tleToiX2dldEZvcmNlQ29udHJpYnV0aW9uIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKHQuY2hpbGRyZW5Db3VudD4wKXt2YXIgaT12b2lkIDAsbz12b2lkIDAsbj12b2lkIDA7aT10LmNlbnRlck9mTWFzcy54LWUueCxvPXQuY2VudGVyT2ZNYXNzLnktZS55LG49TWF0aC5zcXJ0KGkqaStvKm8pLG4qdC5jYWxjU2l6ZT50aGlzLnRoZXRhSW52ZXJzZWQ/dGhpcy5fY2FsY3VsYXRlRm9yY2VzKG4saSxvLGUsdCk6ND09PXQuY2hpbGRyZW5Db3VudD8odGhpcy5fZ2V0Rm9yY2VDb250cmlidXRpb24odC5jaGlsZHJlbi5OVyxlKSx0aGlzLl9nZXRGb3JjZUNvbnRyaWJ1dGlvbih0LmNoaWxkcmVuLk5FLGUpLHRoaXMuX2dldEZvcmNlQ29udHJpYnV0aW9uKHQuY2hpbGRyZW4uU1csZSksdGhpcy5fZ2V0Rm9yY2VDb250cmlidXRpb24odC5jaGlsZHJlbi5TRSxlKSk6dC5jaGlsZHJlbi5kYXRhLmlkIT1lLmlkJiZ0aGlzLl9jYWxjdWxhdGVGb3JjZXMobixpLG8sZSx0KX19fSx7a2V5OiJfY2FsY3VsYXRlRm9yY2VzIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4pezA9PT10JiYodD0uMSxlPXQpLHRoaXMub3ZlcmxhcEF2b2lkYW5jZUZhY3RvcjwxJiZvLnNoYXBlLnJhZGl1cyYmKHQ9TWF0aC5tYXgoLjErdGhpcy5vdmVybGFwQXZvaWRhbmNlRmFjdG9yKm8uc2hhcGUucmFkaXVzLHQtby5zaGFwZS5yYWRpdXMpKTt2YXIgcz10aGlzLm9wdGlvbnMuZ3Jhdml0YXRpb25hbENvbnN0YW50Km4ubWFzcypvLm9wdGlvbnMubWFzcy9NYXRoLnBvdyh0LDMpLHI9ZSpzLGE9aSpzO3RoaXMucGh5c2ljc0JvZHkuZm9yY2VzW28uaWRdLngrPXIsdGhpcy5waHlzaWNzQm9keS5mb3JjZXNbby5pZF0ueSs9YX19LHtrZXk6Il9mb3JtQmFybmVzSHV0VHJlZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9dm9pZCAwLG89ZS5sZW5ndGgsbj10W2VbMF1dLngscz10W2VbMF1dLnkscj10W2VbMF1dLngsYT10W2VbMF1dLnksaD0xO2g8bztoKyspe3ZhciBkPXRbZVtoXV0ueCxsPXRbZVtoXV0ueTt0W2VbaF1dLm9wdGlvbnMubWFzcz4wJiYoZDxuJiYobj1kKSxkPnImJihyPWQpLGw8cyYmKHM9bCksbD5hJiYoYT1sKSl9dmFyIGM9TWF0aC5hYnMoci1uKS1NYXRoLmFicyhhLXMpO2M+MD8ocy09LjUqYyxhKz0uNSpjKToobis9LjUqYyxyLT0uNSpjKTt2YXIgdT0xZS01LHA9TWF0aC5tYXgodSxNYXRoLmFicyhyLW4pKSxmPS41KnAsbT0uNSoobityKSx2PS41KihzK2EpLGc9e3Jvb3Q6e2NlbnRlck9mTWFzczp7eDowLHk6MH0sbWFzczowLHJhbmdlOnttaW5YOm0tZixtYXhYOm0rZixtaW5ZOnYtZixtYXhZOnYrZn0sc2l6ZTpwLGNhbGNTaXplOjEvcCxjaGlsZHJlbjp7ZGF0YTpudWxsfSxtYXhXaWR0aDowLGxldmVsOjAsY2hpbGRyZW5Db3VudDo0fX07dGhpcy5fc3BsaXRCcmFuY2goZy5yb290KTtmb3IodmFyIHk9MDt5PG87eSsrKWk9dFtlW3ldXSxpLm9wdGlvbnMubWFzcz4wJiZ0aGlzLl9wbGFjZUluVHJlZShnLnJvb3QsaSk7cmV0dXJuIGd9fSx7a2V5OiJfdXBkYXRlQnJhbmNoTWFzcyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10Lm1hc3MrZS5vcHRpb25zLm1hc3Msbz0xL2k7dC5jZW50ZXJPZk1hc3MueD10LmNlbnRlck9mTWFzcy54KnQubWFzcytlLngqZS5vcHRpb25zLm1hc3MsdC5jZW50ZXJPZk1hc3MueCo9byx0LmNlbnRlck9mTWFzcy55PXQuY2VudGVyT2ZNYXNzLnkqdC5tYXNzK2UueSplLm9wdGlvbnMubWFzcyx0LmNlbnRlck9mTWFzcy55Kj1vLHQubWFzcz1pO3ZhciBuPU1hdGgubWF4KE1hdGgubWF4KGUuaGVpZ2h0LGUucmFkaXVzKSxlLndpZHRoKTt0Lm1heFdpZHRoPXQubWF4V2lkdGg8bj9uOnQubWF4V2lkdGh9fSx7a2V5OiJfcGxhY2VJblRyZWUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXsxPT1pJiZ2b2lkIDAhPT1pfHx0aGlzLl91cGRhdGVCcmFuY2hNYXNzKHQsZSksdC5jaGlsZHJlbi5OVy5yYW5nZS5tYXhYPmUueD90LmNoaWxkcmVuLk5XLnJhbmdlLm1heFk+ZS55P3RoaXMuX3BsYWNlSW5SZWdpb24odCxlLCJOVyIpOnRoaXMuX3BsYWNlSW5SZWdpb24odCxlLCJTVyIpOnQuY2hpbGRyZW4uTlcucmFuZ2UubWF4WT5lLnk/dGhpcy5fcGxhY2VJblJlZ2lvbih0LGUsIk5FIik6dGhpcy5fcGxhY2VJblJlZ2lvbih0LGUsIlNFIil9fSx7a2V5OiJfcGxhY2VJblJlZ2lvbiIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3N3aXRjaCh0LmNoaWxkcmVuW2ldLmNoaWxkcmVuQ291bnQpe2Nhc2UgMDp0LmNoaWxkcmVuW2ldLmNoaWxkcmVuLmRhdGE9ZSx0LmNoaWxkcmVuW2ldLmNoaWxkcmVuQ291bnQ9MSx0aGlzLl91cGRhdGVCcmFuY2hNYXNzKHQuY2hpbGRyZW5baV0sZSk7YnJlYWs7Y2FzZSAxOnQuY2hpbGRyZW5baV0uY2hpbGRyZW4uZGF0YS54PT09ZS54JiZ0LmNoaWxkcmVuW2ldLmNoaWxkcmVuLmRhdGEueT09PWUueT8oZS54Kz10aGlzLnNlZWRlZFJhbmRvbSgpLGUueSs9dGhpcy5zZWVkZWRSYW5kb20oKSk6KHRoaXMuX3NwbGl0QnJhbmNoKHQuY2hpbGRyZW5baV0pLHRoaXMuX3BsYWNlSW5UcmVlKHQuY2hpbGRyZW5baV0sZSkpO2JyZWFrO2Nhc2UgNDp0aGlzLl9wbGFjZUluVHJlZSh0LmNoaWxkcmVuW2ldLGUpfX19LHtrZXk6Il9zcGxpdEJyYW5jaCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9bnVsbDsxPT09dC5jaGlsZHJlbkNvdW50JiYoZT10LmNoaWxkcmVuLmRhdGEsdC5tYXNzPTAsdC5jZW50ZXJPZk1hc3MueD0wLHQuY2VudGVyT2ZNYXNzLnk9MCksdC5jaGlsZHJlbkNvdW50PTQsdC5jaGlsZHJlbi5kYXRhPW51bGwsdGhpcy5faW5zZXJ0UmVnaW9uKHQsIk5XIiksdGhpcy5faW5zZXJ0UmVnaW9uKHQsIk5FIiksdGhpcy5faW5zZXJ0UmVnaW9uKHQsIlNXIiksdGhpcy5faW5zZXJ0UmVnaW9uKHQsIlNFIiksbnVsbCE9ZSYmdGhpcy5fcGxhY2VJblRyZWUodCxlKX19LHtrZXk6Il9pbnNlcnRSZWdpb24iLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dm9pZCAwLG89dm9pZCAwLG49dm9pZCAwLHM9dm9pZCAwLHI9LjUqdC5zaXplO3N3aXRjaChlKXtjYXNlIk5XIjppPXQucmFuZ2UubWluWCxvPXQucmFuZ2UubWluWCtyLG49dC5yYW5nZS5taW5ZLHM9dC5yYW5nZS5taW5ZK3I7YnJlYWs7Y2FzZSJORSI6aT10LnJhbmdlLm1pblgrcixvPXQucmFuZ2UubWF4WCxuPXQucmFuZ2UubWluWSxzPXQucmFuZ2UubWluWStyO2JyZWFrO2Nhc2UiU1ciOmk9dC5yYW5nZS5taW5YLG89dC5yYW5nZS5taW5YK3Isbj10LnJhbmdlLm1pblkrcixzPXQucmFuZ2UubWF4WTticmVhaztjYXNlIlNFIjppPXQucmFuZ2UubWluWCtyLG89dC5yYW5nZS5tYXhYLG49dC5yYW5nZS5taW5ZK3Iscz10LnJhbmdlLm1heFl9dC5jaGlsZHJlbltlXT17Y2VudGVyT2ZNYXNzOnt4OjAseTowfSxtYXNzOjAscmFuZ2U6e21pblg6aSxtYXhYOm8sbWluWTpuLG1heFk6c30sc2l6ZTouNSp0LnNpemUsY2FsY1NpemU6Mip0LmNhbGNTaXplLGNoaWxkcmVuOntkYXRhOm51bGx9LG1heFdpZHRoOjAsbGV2ZWw6dC5sZXZlbCsxLGNoaWxkcmVuQ291bnQ6MH19fSx7a2V5OiJfZGVidWciLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dm9pZCAwIT09dGhpcy5iYXJuZXNIdXRUcmVlJiYodC5saW5lV2lkdGg9MSx0aGlzLl9kcmF3QnJhbmNoKHRoaXMuYmFybmVzSHV0VHJlZS5yb290LHQsZSkpfX0se2tleToiX2RyYXdCcmFuY2giLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2b2lkIDA9PT1pJiYoaT0iI0ZGMDAwMCIpLDQ9PT10LmNoaWxkcmVuQ291bnQmJih0aGlzLl9kcmF3QnJhbmNoKHQuY2hpbGRyZW4uTlcsZSksdGhpcy5fZHJhd0JyYW5jaCh0LmNoaWxkcmVuLk5FLGUpLHRoaXMuX2RyYXdCcmFuY2godC5jaGlsZHJlbi5TRSxlKSx0aGlzLl9kcmF3QnJhbmNoKHQuY2hpbGRyZW4uU1csZSkpLGUuc3Ryb2tlU3R5bGU9aSxlLmJlZ2luUGF0aCgpLGUubW92ZVRvKHQucmFuZ2UubWluWCx0LnJhbmdlLm1pblkpLGUubGluZVRvKHQucmFuZ2UubWF4WCx0LnJhbmdlLm1pblkpLGUuc3Ryb2tlKCksZS5iZWdpblBhdGgoKSxlLm1vdmVUbyh0LnJhbmdlLm1heFgsdC5yYW5nZS5taW5ZKSxlLmxpbmVUbyh0LnJhbmdlLm1heFgsdC5yYW5nZS5tYXhZKSxlLnN0cm9rZSgpLGUuYmVnaW5QYXRoKCksZS5tb3ZlVG8odC5yYW5nZS5tYXhYLHQucmFuZ2UubWF4WSksZS5saW5lVG8odC5yYW5nZS5taW5YLHQucmFuZ2UubWF4WSksZS5zdHJva2UoKSxlLmJlZ2luUGF0aCgpLGUubW92ZVRvKHQucmFuZ2UubWluWCx0LnJhbmdlLm1heFkpLGUubGluZVRvKHQucmFuZ2UubWluWCx0LnJhbmdlLm1pblkpLGUuc3Ryb2tlKCl9fV0pLHR9KCk7ZS5kZWZhdWx0PW59LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gaSh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG8pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG8mJnQoZSxvKSxlfX0oKSxuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLG8sbil7aSh0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMucGh5c2ljc0JvZHk9byx0aGlzLnNldE9wdGlvbnMobil9cmV0dXJuIG8odCxbe2tleToic2V0T3B0aW9ucyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zPXR9fSx7a2V5OiJzb2x2ZSIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQsZSxpLG8sbixzLHIsYSxoPXRoaXMuYm9keS5ub2RlcyxkPXRoaXMucGh5c2ljc0JvZHkucGh5c2ljc05vZGVJbmRpY2VzLGw9dGhpcy5waHlzaWNzQm9keS5mb3JjZXMsYz10aGlzLm9wdGlvbnMubm9kZURpc3RhbmNlLHU9LTIvMy9jLHA9NC8zLGY9MDtmPGQubGVuZ3RoLTE7ZisrKXtyPWhbZFtmXV07Zm9yKHZhciBtPWYrMTttPGQubGVuZ3RoO20rKylhPWhbZFttXV0sdD1hLngtci54LGU9YS55LXIueSxpPU1hdGguc3FydCh0KnQrZSplKSwwPT09aSYmKGk9LjEqTWF0aC5yYW5kb20oKSx0PWkpLGk8MipjJiYocz1pPC41KmM/MTp1KmkrcCxzLz1pLG89dCpzLG49ZSpzLGxbci5pZF0ueC09byxsW3IuaWRdLnktPW4sbFthLmlkXS54Kz1vLGxbYS5pZF0ueSs9bil9fX1dKSx0fSgpO2UuZGVmYXVsdD1ufSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxvJiZ0KGUsbyksZX19KCksbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxvLG4pe2kodGhpcyx0KSx0aGlzLmJvZHk9ZSx0aGlzLnBoeXNpY3NCb2R5PW8sdGhpcy5zZXRPcHRpb25zKG4pfXJldHVybiBvKHQsW3trZXk6InNldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucz10fX0se2tleToic29sdmUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQsZSxpLG8sbixzLHIsYSxoLGQsbD10aGlzLmJvZHkubm9kZXMsYz10aGlzLnBoeXNpY3NCb2R5LnBoeXNpY3NOb2RlSW5kaWNlcyx1PXRoaXMucGh5c2ljc0JvZHkuZm9yY2VzLHA9dGhpcy5vcHRpb25zLm5vZGVEaXN0YW5jZTtmb3IoaD0wO2g8Yy5sZW5ndGgtMTtoKyspZm9yKHI9bFtjW2hdXSxkPWgrMTtkPGMubGVuZ3RoO2QrKylpZihhPWxbY1tkXV0sci5sZXZlbD09PWEubGV2ZWwpe3Q9YS54LXIueCxlPWEueS1yLnksaT1NYXRoLnNxcnQodCp0K2UqZSk7dmFyIGY9LjA1O3M9aTxwPy1NYXRoLnBvdyhmKmksMikrTWF0aC5wb3coZipwLDIpOjAsMD09PWk/aT0uMDE6cy89aSxvPXQqcyxuPWUqcyx1W3IuaWRdLngtPW8sdVtyLmlkXS55LT1uLHVbYS5pZF0ueCs9byx1W2EuaWRdLnkrPW59fX1dKSx0fSgpO2UuZGVmYXVsdD1ufSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxvJiZ0KGUsbyksZX19KCksbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxvLG4pe2kodGhpcyx0KSx0aGlzLmJvZHk9ZSx0aGlzLnBoeXNpY3NCb2R5PW8sdGhpcy5zZXRPcHRpb25zKG4pfXJldHVybiBvKHQsW3trZXk6InNldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucz10fX0se2tleToic29sdmUiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXZvaWQgMCxlPXZvaWQgMCxpPXRoaXMucGh5c2ljc0JvZHkucGh5c2ljc0VkZ2VJbmRpY2VzLG89dGhpcy5ib2R5LmVkZ2VzLG49dm9pZCAwLHM9dm9pZCAwLHI9dm9pZCAwLGE9MDthPGkubGVuZ3RoO2ErKyllPW9baVthXV0sZS5jb25uZWN0ZWQ9PT0hMCYmZS50b0lkIT09ZS5mcm9tSWQmJnZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1tlLnRvSWRdJiZ2b2lkIDAhPT10aGlzLmJvZHkubm9kZXNbZS5mcm9tSWRdJiYodm9pZCAwIT09ZS5lZGdlVHlwZS52aWE/KHQ9dm9pZCAwPT09ZS5vcHRpb25zLmxlbmd0aD90aGlzLm9wdGlvbnMuc3ByaW5nTGVuZ3RoOmUub3B0aW9ucy5sZW5ndGgsbj1lLnRvLHM9ZS5lZGdlVHlwZS52aWEscj1lLmZyb20sdGhpcy5fY2FsY3VsYXRlU3ByaW5nRm9yY2UobixzLC41KnQpLHRoaXMuX2NhbGN1bGF0ZVNwcmluZ0ZvcmNlKHMsciwuNSp0KSk6KHQ9dm9pZCAwPT09ZS5vcHRpb25zLmxlbmd0aD8xLjUqdGhpcy5vcHRpb25zLnNwcmluZ0xlbmd0aDplLm9wdGlvbnMubGVuZ3RoLHRoaXMuX2NhbGN1bGF0ZVNwcmluZ0ZvcmNlKGUuZnJvbSxlLnRvLHQpKSl9fSx7a2V5OiJfY2FsY3VsYXRlU3ByaW5nRm9yY2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz10LngtZS54LG49dC55LWUueSxzPU1hdGgubWF4KE1hdGguc3FydChvKm8rbipuKSwuMDEpLHI9dGhpcy5vcHRpb25zLnNwcmluZ0NvbnN0YW50KihpLXMpL3MsYT1vKnIsaD1uKnI7dm9pZCAwIT09dGhpcy5waHlzaWNzQm9keS5mb3JjZXNbdC5pZF0mJih0aGlzLnBoeXNpY3NCb2R5LmZvcmNlc1t0LmlkXS54Kz1hLHRoaXMucGh5c2ljc0JvZHkuZm9yY2VzW3QuaWRdLnkrPWgpLHZvaWQgMCE9PXRoaXMucGh5c2ljc0JvZHkuZm9yY2VzW2UuaWRdJiYodGhpcy5waHlzaWNzQm9keS5mb3JjZXNbZS5pZF0ueC09YSx0aGlzLnBoeXNpY3NCb2R5LmZvcmNlc1tlLmlkXS55LT1oKX19XSksdH0oKTtlLmRlZmF1bHQ9bn0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBpKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBvJiYoby53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsby5rZXksbyl9fXJldHVybiBmdW5jdGlvbihlLGksbyl7cmV0dXJuIGkmJnQoZS5wcm90b3R5cGUsaSksbyYmdChlLG8pLGV9fSgpLG49ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsbyxuKXtpKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5waHlzaWNzQm9keT1vLHRoaXMuc2V0T3B0aW9ucyhuKX1yZXR1cm4gbyh0LFt7a2V5OiJzZXRPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnM9dH19LHtrZXk6InNvbHZlIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdCxlLGksbyxuLHMscixhLGg9dGhpcy5ib2R5LmVkZ2VzLGQ9LjUsbD10aGlzLnBoeXNpY3NCb2R5LnBoeXNpY3NFZGdlSW5kaWNlcyxjPXRoaXMucGh5c2ljc0JvZHkucGh5c2ljc05vZGVJbmRpY2VzLHU9dGhpcy5waHlzaWNzQm9keS5mb3JjZXMscD0wO3A8Yy5sZW5ndGg7cCsrKXt2YXIgZj1jW3BdO3VbZl0uc3ByaW5nRng9MCx1W2ZdLnNwcmluZ0Z5PTB9Zm9yKHZhciBtPTA7bTxsLmxlbmd0aDttKyspZT1oW2xbbV1dLGUuY29ubmVjdGVkPT09ITAmJih0PXZvaWQgMD09PWUub3B0aW9ucy5sZW5ndGg/dGhpcy5vcHRpb25zLnNwcmluZ0xlbmd0aDplLm9wdGlvbnMubGVuZ3RoLGk9ZS5mcm9tLngtZS50by54LG89ZS5mcm9tLnktZS50by55LGE9TWF0aC5zcXJ0KGkqaStvKm8pLGE9MD09PWE/LjAxOmEscj10aGlzLm9wdGlvbnMuc3ByaW5nQ29uc3RhbnQqKHQtYSkvYSxuPWkqcixzPW8qcixlLnRvLmxldmVsIT1lLmZyb20ubGV2ZWw/KHZvaWQgMCE9PXVbZS50b0lkXSYmKHVbZS50b0lkXS5zcHJpbmdGeC09bix1W2UudG9JZF0uc3ByaW5nRnktPXMpLHZvaWQgMCE9PXVbZS5mcm9tSWRdJiYodVtlLmZyb21JZF0uc3ByaW5nRngrPW4sdVtlLmZyb21JZF0uc3ByaW5nRnkrPXMpKToodm9pZCAwIT09dVtlLnRvSWRdJiYodVtlLnRvSWRdLngtPWQqbix1W2UudG9JZF0ueS09ZCpzKSx2b2lkIDAhPT11W2UuZnJvbUlkXSYmKHVbZS5mcm9tSWRdLngrPWQqbix1W2UuZnJvbUlkXS55Kz1kKnMpKSk7Zm9yKHZhciB2LGcscj0xLHk9MDt5PGMubGVuZ3RoO3krKyl7dmFyIGI9Y1t5XTt2PU1hdGgubWluKHIsTWF0aC5tYXgoLXIsdVtiXS5zcHJpbmdGeCkpLGc9TWF0aC5taW4ocixNYXRoLm1heCgtcix1W2JdLnNwcmluZ0Z5KSksdVtiXS54Kz12LHVbYl0ueSs9Z31mb3IodmFyIF89MCx3PTAseD0wO3g8Yy5sZW5ndGg7eCsrKXt2YXIgaz1jW3hdO18rPXVba10ueCx3Kz11W2tdLnl9Zm9yKHZhciBPPV8vYy5sZW5ndGgsRD13L2MubGVuZ3RoLFM9MDtTPGMubGVuZ3RoO1MrKyl7dmFyIEM9Y1tTXTt1W0NdLngtPU8sdVtDXS55LT1EfX19XSksdH0oKTtlLmRlZmF1bHQ9bn0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBpKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBvJiYoby53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsby5rZXksbyl9fXJldHVybiBmdW5jdGlvbihlLGksbyl7cmV0dXJuIGkmJnQoZS5wcm90b3R5cGUsaSksbyYmdChlLG8pLGV9fSgpLG49ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsbyxuKXtpKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5waHlzaWNzQm9keT1vLHRoaXMuc2V0T3B0aW9ucyhuKX1yZXR1cm4gbyh0LFt7a2V5OiJzZXRPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnM9dH19LHtrZXk6InNvbHZlIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD12b2lkIDAsZT12b2lkIDAsaT12b2lkIDAsbz12b2lkIDAsbj10aGlzLmJvZHkubm9kZXMscz10aGlzLnBoeXNpY3NCb2R5LnBoeXNpY3NOb2RlSW5kaWNlcyxyPXRoaXMucGh5c2ljc0JvZHkuZm9yY2VzLGE9MDthPHMubGVuZ3RoO2ErKyl7dmFyIGg9c1thXTtvPW5baF0sdD0tby54LGU9LW8ueSxpPU1hdGguc3FydCh0KnQrZSplKSx0aGlzLl9jYWxjdWxhdGVGb3JjZXMoaSx0LGUscixvKX19fSx7a2V5OiJfY2FsY3VsYXRlRm9yY2VzIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4pe3ZhciBzPTA9PT10PzA6dGhpcy5vcHRpb25zLmNlbnRyYWxHcmF2aXR5L3Q7b1tuLmlkXS54PWUqcyxvW24uaWRdLnk9aSpzfX1dKSx0fSgpO2UuZGVmYXVsdD1ufSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIHModCxlKXtpZighdCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiFlfHwib2JqZWN0IiE9dHlwZW9mIGUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlP3Q6ZX1mdW5jdGlvbiByKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgZSk7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxlKTp0Ll9fcHJvdG9fXz1lKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxvJiZ0KGUsbyksZX19KCksaD1pKDk2KSxkPW8oaCksbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4gbih0aGlzLGUpLHModGhpcywoZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuIHIoZSx0KSxhKGUsW3trZXk6Il9jYWxjdWxhdGVGb3JjZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbil7MD09PXQmJih0PS4xKk1hdGgucmFuZG9tKCksZT10KSx0aGlzLm92ZXJsYXBBdm9pZGFuY2VGYWN0b3I8MSYmby5zaGFwZS5yYWRpdXMmJih0PU1hdGgubWF4KC4xK3RoaXMub3ZlcmxhcEF2b2lkYW5jZUZhY3RvcipvLnNoYXBlLnJhZGl1cyx0LW8uc2hhcGUucmFkaXVzKSk7dmFyIHM9by5lZGdlcy5sZW5ndGgrMSxyPXRoaXMub3B0aW9ucy5ncmF2aXRhdGlvbmFsQ29uc3RhbnQqbi5tYXNzKm8ub3B0aW9ucy5tYXNzKnMvTWF0aC5wb3codCwyKSxhPWUqcixoPWkqcjt0aGlzLnBoeXNpY3NCb2R5LmZvcmNlc1tvLmlkXS54Kz1hLHRoaXMucGh5c2ljc0JvZHkuZm9yY2VzW28uaWRdLnkrPWh9fV0pLGV9KGQuZGVmYXVsdCk7ZS5kZWZhdWx0PWx9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1mdW5jdGlvbiBuKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gcyh0LGUpe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIWV8fCJvYmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU/dDplfWZ1bmN0aW9uIHIodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiBlKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LGUpOnQuX19wcm90b19fPWUpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG8pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG8mJnQoZSxvKSxlfX0oKSxoPWkoMTAxKSxkPW8oaCksbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4gbih0aGlzLGUpLHModGhpcywoZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuIHIoZSx0KSxhKGUsW3trZXk6Il9jYWxjdWxhdGVGb3JjZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbil7aWYodD4wKXt2YXIgcz1uLmVkZ2VzLmxlbmd0aCsxLHI9dGhpcy5vcHRpb25zLmNlbnRyYWxHcmF2aXR5KnMqbi5vcHRpb25zLm1hc3M7b1tuLmlkXS54PWUqcixvW24uaWRdLnk9aSpyfX19XSksZX0oZC5kZWZhdWx0KTtlLmRlZmF1bHQ9bH0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWZ1bmN0aW9uIG4odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9LHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxvJiZ0KGUsbyksZX19KCksYT1pKDEwNSksaD1vKGEpLGQ9aSgxMDYpLGw9byhkKSxjPWkoMSksdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7dmFyIGk9dGhpcztuKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5jbHVzdGVyZWROb2Rlcz17fSx0aGlzLmNsdXN0ZXJlZEVkZ2VzPXt9LHRoaXMub3B0aW9ucz17fSx0aGlzLmRlZmF1bHRPcHRpb25zPXt9LGMuZXh0ZW5kKHRoaXMub3B0aW9ucyx0aGlzLmRlZmF1bHRPcHRpb25zKSx0aGlzLmJvZHkuZW1pdHRlci5vbigiX3Jlc2V0RGF0YSIsZnVuY3Rpb24oKXtpLmNsdXN0ZXJlZE5vZGVzPXt9LGkuY2x1c3RlcmVkRWRnZXM9e319KX1yZXR1cm4gcih0LFt7a2V5OiJjbHVzdGVyQnlIdWJzaXplIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZvaWQgMD09PXQ/dD10aGlzLl9nZXRIdWJTaXplKCk6Im9iamVjdCI9PT0oInVuZGVmaW5lZCI9PXR5cGVvZiB0PyJ1bmRlZmluZWQiOnModCkpJiYoZT10aGlzLl9jaGVja09wdGlvbnModCksdD10aGlzLl9nZXRIdWJTaXplKCkpO2Zvcih2YXIgaT1bXSxvPTA7bzx0aGlzLmJvZHkubm9kZUluZGljZXMubGVuZ3RoO28rKyl7dmFyIG49dGhpcy5ib2R5Lm5vZGVzW3RoaXMuYm9keS5ub2RlSW5kaWNlc1tvXV07bi5lZGdlcy5sZW5ndGg+PXQmJmkucHVzaChuLmlkKX1mb3IodmFyIHI9MDtyPGkubGVuZ3RoO3IrKyl0aGlzLmNsdXN0ZXJCeUNvbm5lY3Rpb24oaVtyXSxlLCEwKTt0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfZGF0YUNoYW5nZWQiKX19LHtrZXk6ImNsdXN0ZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9LGU9IShhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSl8fGFyZ3VtZW50c1sxXTtpZih2b2lkIDA9PT10LmpvaW5Db25kaXRpb24pdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY2FsbCBjbHVzdGVyQnlOb2RlRGF0YSB3aXRob3V0IGEgam9pbkNvbmRpdGlvbiBmdW5jdGlvbiBpbiB0aGUgb3B0aW9ucy4iKTt0PXRoaXMuX2NoZWNrT3B0aW9ucyh0KTtmb3IodmFyIGk9e30sbz17fSxuPTA7bjx0aGlzLmJvZHkubm9kZUluZGljZXMubGVuZ3RoO24rKyl7dmFyIHM9dGhpcy5ib2R5Lm5vZGVJbmRpY2VzW25dLHI9dGhpcy5ib2R5Lm5vZGVzW3NdLGE9aC5kZWZhdWx0LmNsb25lT3B0aW9ucyhyKTtpZih0LmpvaW5Db25kaXRpb24oYSk9PT0hMCl7aVtzXT10aGlzLmJvZHkubm9kZXNbc107Zm9yKHZhciBkPTA7ZDxyLmVkZ2VzLmxlbmd0aDtkKyspe3ZhciBsPXIuZWRnZXNbZF07dm9pZCAwPT09dGhpcy5jbHVzdGVyZWRFZGdlc1tsLmlkXSYmKG9bbC5pZF09bCl9fX10aGlzLl9jbHVzdGVyKGksbyx0LGUpfX0se2tleToiY2x1c3RlckJ5RWRnZUNvdW50Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPSEoYXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0pfHxhcmd1bWVudHNbMl07ZT10aGlzLl9jaGVja09wdGlvbnMoZSk7Zm9yKHZhciBvPVtdLG49e30scz12b2lkIDAscj12b2lkIDAsYT12b2lkIDAsZD12b2lkIDAsbD12b2lkIDAsYz0wO2M8dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLmxlbmd0aDtjKyspe3ZhciB1PXt9LHA9e307aWYoZD10aGlzLmJvZHkubm9kZUluZGljZXNbY10sdm9pZCAwPT09bltkXSl7bD0wLGE9dGhpcy5ib2R5Lm5vZGVzW2RdLHI9W107Zm9yKHZhciBmPTA7ZjxhLmVkZ2VzLmxlbmd0aDtmKyspcz1hLmVkZ2VzW2ZdLHZvaWQgMD09PXRoaXMuY2x1c3RlcmVkRWRnZXNbcy5pZF0mJihzLnRvSWQhPT1zLmZyb21JZCYmbCsrLHIucHVzaChzKSk7aWYobD09PXQpe2Zvcih2YXIgbT0hMCx2PTA7djxyLmxlbmd0aDt2Kyspe3M9clt2XTt2YXIgZz10aGlzLl9nZXRDb25uZWN0ZWRJZChzLGQpO2lmKHZvaWQgMD09PWUuam9pbkNvbmRpdGlvbilwW3MuaWRdPXMsdVtkXT10aGlzLmJvZHkubm9kZXNbZF0sdVtnXT10aGlzLmJvZHkubm9kZXNbZ10sbltkXT0hMDtlbHNle3ZhciB5PWguZGVmYXVsdC5jbG9uZU9wdGlvbnModGhpcy5ib2R5Lm5vZGVzW2RdKTtpZihlLmpvaW5Db25kaXRpb24oeSkhPT0hMCl7bT0hMTticmVha31wW3MuaWRdPXMsdVtkXT10aGlzLmJvZHkubm9kZXNbZF0sbltkXT0hMH19T2JqZWN0LmtleXModSkubGVuZ3RoPjAmJk9iamVjdC5rZXlzKHApLmxlbmd0aD4wJiZtPT09ITAmJm8ucHVzaCh7bm9kZXM6dSxlZGdlczpwfSl9fX1mb3IodmFyIGI9MDtiPG8ubGVuZ3RoO2IrKyl0aGlzLl9jbHVzdGVyKG9bYl0ubm9kZXMsb1tiXS5lZGdlcyxlLCExKTtpPT09ITAmJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9kYXRhQ2hhbmdlZCIpfX0se2tleToiY2x1c3Rlck91dGxpZXJzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT0hKGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdKXx8YXJndW1lbnRzWzFdO3RoaXMuY2x1c3RlckJ5RWRnZUNvdW50KDEsdCxlKX19LHtrZXk6ImNsdXN0ZXJCcmlkZ2VzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT0hKGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdKXx8YXJndW1lbnRzWzFdO3RoaXMuY2x1c3RlckJ5RWRnZUNvdW50KDIsdCxlKX19LHtrZXk6ImNsdXN0ZXJCeUNvbm5lY3Rpb24iLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9IShhcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSl8fGFyZ3VtZW50c1syXTtpZih2b2lkIDA9PT10KXRocm93IG5ldyBFcnJvcigiTm8gbm9kZUlkIHN1cHBsaWVkIHRvIGNsdXN0ZXJCeUNvbm5lY3Rpb24hIik7aWYodm9pZCAwPT09dGhpcy5ib2R5Lm5vZGVzW3RdKXRocm93IG5ldyBFcnJvcigiVGhlIG5vZGVJZCBnaXZlbiB0byBjbHVzdGVyQnlDb25uZWN0aW9uIGRvZXMgbm90IGV4aXN0ISIpO3ZhciBvPXRoaXMuYm9keS5ub2Rlc1t0XTtlPXRoaXMuX2NoZWNrT3B0aW9ucyhlLG8pLHZvaWQgMD09PWUuY2x1c3Rlck5vZGVQcm9wZXJ0aWVzLngmJihlLmNsdXN0ZXJOb2RlUHJvcGVydGllcy54PW8ueCksdm9pZCAwPT09ZS5jbHVzdGVyTm9kZVByb3BlcnRpZXMueSYmKGUuY2x1c3Rlck5vZGVQcm9wZXJ0aWVzLnk9by55KSx2b2lkIDA9PT1lLmNsdXN0ZXJOb2RlUHJvcGVydGllcy5maXhlZCYmKGUuY2x1c3Rlck5vZGVQcm9wZXJ0aWVzLmZpeGVkPXt9LGUuY2x1c3Rlck5vZGVQcm9wZXJ0aWVzLmZpeGVkLng9by5vcHRpb25zLmZpeGVkLngsZS5jbHVzdGVyTm9kZVByb3BlcnRpZXMuZml4ZWQueT1vLm9wdGlvbnMuZml4ZWQueSk7dmFyIG49e30scz17fSxyPW8uaWQsYT1oLmRlZmF1bHQuY2xvbmVPcHRpb25zKG8pO25bcl09bztmb3IodmFyIGQ9MDtkPG8uZWRnZXMubGVuZ3RoO2QrKyl7dmFyIGw9by5lZGdlc1tkXTtpZih2b2lkIDA9PT10aGlzLmNsdXN0ZXJlZEVkZ2VzW2wuaWRdKXt2YXIgYz10aGlzLl9nZXRDb25uZWN0ZWRJZChsLHIpO2lmKHZvaWQgMD09PXRoaXMuY2x1c3RlcmVkTm9kZXNbY10paWYoYyE9PXIpaWYodm9pZCAwPT09ZS5qb2luQ29uZGl0aW9uKXNbbC5pZF09bCxuW2NdPXRoaXMuYm9keS5ub2Rlc1tjXTtlbHNle3ZhciB1PWguZGVmYXVsdC5jbG9uZU9wdGlvbnModGhpcy5ib2R5Lm5vZGVzW2NdKTtlLmpvaW5Db25kaXRpb24oYSx1KT09PSEwJiYoc1tsLmlkXT1sLG5bY109dGhpcy5ib2R5Lm5vZGVzW2NdKX1lbHNlIHNbbC5pZF09bH19dmFyIHA9T2JqZWN0LmtleXMobikubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBuW3RdLmlkfSk7Zm9yKGYgaW4gbilmb3IodmFyIGY9bltmXSxtPTA7bTxmLmVkZ2VzLmxlbmd0aDttKyspe3ZhciB2PWYuZWRnZXNbbV07cC5pbmRleE9mKHRoaXMuX2dldENvbm5lY3RlZElkKHYsZi5pZCkpPi0xJiYoc1t2LmlkXT12KX10aGlzLl9jbHVzdGVyKG4scyxlLGkpfX0se2tleToiX2NyZWF0ZUNsdXN0ZXJFZGdlcyIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyl7Zm9yKHZhciBuPXZvaWQgMCxzPXZvaWQgMCxyPXZvaWQgMCxhPXZvaWQgMCxkPXZvaWQgMCxsPXZvaWQgMCx1PU9iamVjdC5rZXlzKHQpLHA9W10sZj0wO2Y8dS5sZW5ndGg7ZisrKXtzPXVbZl0scj10W3NdO2Zvcih2YXIgbT0wO208ci5lZGdlcy5sZW5ndGg7bSsrKW49ci5lZGdlc1ttXSx2b2lkIDA9PT10aGlzLmNsdXN0ZXJlZEVkZ2VzW24uaWRdJiYobi50b0lkPT1uLmZyb21JZD9lW24uaWRdPW46bi50b0lkPT1zPyhhPWkuaWQsZD1uLmZyb21JZCxsPWQpOihhPW4udG9JZCxkPWkuaWQsbD1hKSx2b2lkIDA9PT10W2xdJiZwLnB1c2goe2VkZ2U6bixmcm9tSWQ6ZCx0b0lkOmF9KSl9Zm9yKHZhciB2PTA7djxwLmxlbmd0aDt2Kyspe3ZhciBnPXBbdl0uZWRnZSx5PWguZGVmYXVsdC5jbG9uZU9wdGlvbnMoZywiZWRnZSIpO2MuZGVlcEV4dGVuZCh5LG8pLHkuZnJvbT1wW3ZdLmZyb21JZCx5LnRvPXBbdl0udG9JZCx5LmlkPSJjbHVzdGVyRWRnZToiK2MucmFuZG9tVVVJRCgpO3ZhciBiPXRoaXMuYm9keS5mdW5jdGlvbnMuY3JlYXRlRWRnZSh5KTtiLmNsdXN0ZXJpbmdFZGdlUmVwbGFjaW5nSWQ9Zy5pZCx0aGlzLmJvZHkuZWRnZXNbZy5pZF0uZWRnZVJlcGxhY2VkQnlJZD1iLmlkLHRoaXMuYm9keS5lZGdlc1tiLmlkXT1iLGIuY29ubmVjdCgpLHRoaXMuX2JhY2t1cEVkZ2VPcHRpb25zKGcpLGcuc2V0T3B0aW9ucyh7cGh5c2ljczohMSxoaWRkZW46ITB9KX19fSx7a2V5OiJfY2hlY2tPcHRpb25zIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTtyZXR1cm4gdm9pZCAwPT09dC5jbHVzdGVyRWRnZVByb3BlcnRpZXMmJih0LmNsdXN0ZXJFZGdlUHJvcGVydGllcz17fSksdm9pZCAwPT09dC5jbHVzdGVyTm9kZVByb3BlcnRpZXMmJih0LmNsdXN0ZXJOb2RlUHJvcGVydGllcz17fSksdH19LHtrZXk6Il9jbHVzdGVyIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dmFyIG89IShhcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXSl8fGFyZ3VtZW50c1szXTtpZigwIT1PYmplY3Qua2V5cyh0KS5sZW5ndGgmJigxIT1PYmplY3Qua2V5cyh0KS5sZW5ndGh8fDE9PWkuY2x1c3Rlck5vZGVQcm9wZXJ0aWVzLmFsbG93U2luZ2xlTm9kZUNsdXN0ZXIpKXtmb3IodmFyIG4gaW4gdClpZih0Lmhhc093blByb3BlcnR5KG4pJiZ2b2lkIDAhPT10aGlzLmNsdXN0ZXJlZE5vZGVzW25dKXJldHVybjt2YXIgcz1jLmRlZXBFeHRlbmQoe30saS5jbHVzdGVyTm9kZVByb3BlcnRpZXMpO2lmKHZvaWQgMCE9PWkucHJvY2Vzc1Byb3BlcnRpZXMpe3ZhciByPVtdO2Zvcih2YXIgYSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBkPWguZGVmYXVsdC5jbG9uZU9wdGlvbnModFthXSk7ci5wdXNoKGQpfXZhciB1PVtdO2Zvcih2YXIgcCBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkocCkmJiJjbHVzdGVyRWRnZToiIT09cC5zdWJzdHIoMCwxMikpe3ZhciBmPWguZGVmYXVsdC5jbG9uZU9wdGlvbnMoZVtwXSwiZWRnZSIpO3UucHVzaChmKX1pZihzPWkucHJvY2Vzc1Byb3BlcnRpZXMocyxyLHUpLCFzKXRocm93IG5ldyBFcnJvcigiVGhlIHByb2Nlc3NQcm9wZXJ0aWVzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBwcm9wZXJ0aWVzISIpfXZvaWQgMD09PXMuaWQmJihzLmlkPSJjbHVzdGVyOiIrYy5yYW5kb21VVUlEKCkpO3ZhciBtPXMuaWQ7dm9pZCAwPT09cy5sYWJlbCYmKHMubGFiZWw9ImNsdXN0ZXIiKTt2YXIgdj12b2lkIDA7dm9pZCAwPT09cy54JiYodj10aGlzLl9nZXRDbHVzdGVyUG9zaXRpb24odCkscy54PXYueCksdm9pZCAwPT09cy55JiYodm9pZCAwPT09diYmKHY9dGhpcy5fZ2V0Q2x1c3RlclBvc2l0aW9uKHQpKSxzLnk9di55KSxzLmlkPW07dmFyIGc9dGhpcy5ib2R5LmZ1bmN0aW9ucy5jcmVhdGVOb2RlKHMsbC5kZWZhdWx0KTtnLmlzQ2x1c3Rlcj0hMCxnLmNvbnRhaW5lZE5vZGVzPXQsZy5jb250YWluZWRFZGdlcz1lLGcuY2x1c3RlckVkZ2VQcm9wZXJ0aWVzPWkuY2x1c3RlckVkZ2VQcm9wZXJ0aWVzLHRoaXMuYm9keS5ub2Rlc1tzLmlkXT1nLHRoaXMuX2NyZWF0ZUNsdXN0ZXJFZGdlcyh0LGUscyxpLmNsdXN0ZXJFZGdlUHJvcGVydGllcyk7Zm9yKHZhciB5IGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eSh5KSYmdm9pZCAwIT09dGhpcy5ib2R5LmVkZ2VzW3ldKXt2YXIgYj10aGlzLmJvZHkuZWRnZXNbeV07dGhpcy5fYmFja3VwRWRnZU9wdGlvbnMoYiksYi5zZXRPcHRpb25zKHtwaHlzaWNzOiExLGhpZGRlbjohMH0pfWZvcih2YXIgXyBpbiB0KXQuaGFzT3duUHJvcGVydHkoXykmJih0aGlzLmNsdXN0ZXJlZE5vZGVzW19dPXtjbHVzdGVySWQ6cy5pZCxub2RlOnRoaXMuYm9keS5ub2Rlc1tfXX0sdGhpcy5ib2R5Lm5vZGVzW19dLnNldE9wdGlvbnMoe2hpZGRlbjohMCxwaHlzaWNzOiExfSkpO3MuaWQ9dm9pZCAwLG89PT0hMCYmdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX2RhdGFDaGFuZ2VkIil9fX0se2tleToiX2JhY2t1cEVkZ2VPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0KXt2b2lkIDA9PT10aGlzLmNsdXN0ZXJlZEVkZ2VzW3QuaWRdJiYodGhpcy5jbHVzdGVyZWRFZGdlc1t0LmlkXT17cGh5c2ljczp0Lm9wdGlvbnMucGh5c2ljcyxoaWRkZW46dC5vcHRpb25zLmhpZGRlbn0pfX0se2tleToiX3Jlc3RvcmVFZGdlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmNsdXN0ZXJlZEVkZ2VzW3QuaWRdO3ZvaWQgMCE9PWUmJih0LnNldE9wdGlvbnMoe3BoeXNpY3M6ZS5waHlzaWNzLGhpZGRlbjplLmhpZGRlbn0pLGRlbGV0ZSB0aGlzLmNsdXN0ZXJlZEVkZ2VzW3QuaWRdKX19LHtrZXk6ImlzQ2x1c3RlciIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1t0XT90aGlzLmJvZHkubm9kZXNbdF0uaXNDbHVzdGVyPT09ITA6KGNvbnNvbGUubG9nKCJOb2RlIGRvZXMgbm90IGV4aXN0LiIpLCExKX19LHtrZXk6Il9nZXRDbHVzdGVyUG9zaXRpb24iLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1PYmplY3Qua2V5cyh0KSxpPXRbZVswXV0ueCxvPXRbZVswXV0ueCxuPXRbZVswXV0ueSxzPXRbZVswXV0ueSxyPXZvaWQgMCxhPTE7YTxlLmxlbmd0aDthKyspcj10W2VbYV1dLGk9ci54PGk/ci54Omksbz1yLng+bz9yLng6byxuPXIueTxuP3IueTpuLHM9ci55PnM/ci55OnM7cmV0dXJue3g6LjUqKGkrbykseTouNSoobitzKX19fSx7a2V5OiJvcGVuQ2x1c3RlciIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT0hKGFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdKXx8YXJndW1lbnRzWzJdO2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IEVycm9yKCJObyBjbHVzdGVyTm9kZUlkIHN1cHBsaWVkIHRvIG9wZW5DbHVzdGVyLiIpO2lmKHZvaWQgMD09PXRoaXMuYm9keS5ub2Rlc1t0XSl0aHJvdyBuZXcgRXJyb3IoIlRoZSBjbHVzdGVyTm9kZUlkIHN1cHBsaWVkIHRvIG9wZW5DbHVzdGVyIGRvZXMgbm90IGV4aXN0LiIpO2lmKHZvaWQgMD09PXRoaXMuYm9keS5ub2Rlc1t0XS5jb250YWluZWROb2RlcylyZXR1cm4gdm9pZCBjb25zb2xlLmxvZygiVGhlIG5vZGU6Iit0KyIgaXMgbm90IGEgY2x1c3Rlci4iKTt2YXIgbz10aGlzLmJvZHkubm9kZXNbdF0sbj1vLmNvbnRhaW5lZE5vZGVzLHM9by5jb250YWluZWRFZGdlcztpZih2b2lkIDAhPT1lJiZ2b2lkIDAhPT1lLnJlbGVhc2VGdW5jdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGUucmVsZWFzZUZ1bmN0aW9uKXt2YXIgcj17fSxhPXt4Om8ueCx5Om8ueX07Zm9yKHZhciBkIGluIG4paWYobi5oYXNPd25Qcm9wZXJ0eShkKSl7dmFyIGw9dGhpcy5ib2R5Lm5vZGVzW2RdO3JbZF09e3g6bC54LHk6bC55fX12YXIgdT1lLnJlbGVhc2VGdW5jdGlvbihhLHIpO2Zvcih2YXIgcCBpbiBuKWlmKG4uaGFzT3duUHJvcGVydHkocCkpe3ZhciBmPXRoaXMuYm9keS5ub2Rlc1twXTt2b2lkIDAhPT11W3BdJiYoZi54PXZvaWQgMD09PXVbcF0ueD9vLng6dVtwXS54LGYueT12b2lkIDA9PT11W3BdLnk/by55OnVbcF0ueSl9fWVsc2UgZm9yKHZhciBtIGluIG4paWYobi5oYXNPd25Qcm9wZXJ0eShtKSl7dmFyIHY9dGhpcy5ib2R5Lm5vZGVzW21dO3Y9blttXSx2Lm9wdGlvbnMuZml4ZWQueD09PSExJiYodi54PW8ueCksdi5vcHRpb25zLmZpeGVkLnk9PT0hMSYmKHYueT1vLnkpfWZvcih2YXIgZyBpbiBuKWlmKG4uaGFzT3duUHJvcGVydHkoZykpe3ZhciB5PXRoaXMuYm9keS5ub2Rlc1tnXTt5LnZ4PW8udngseS52eT1vLnZ5LHkuc2V0T3B0aW9ucyh7aGlkZGVuOiExLHBoeXNpY3M6ITB9KSxkZWxldGUgdGhpcy5jbHVzdGVyZWROb2Rlc1tnXX1mb3IodmFyIGI9W10sXz0wO188by5lZGdlcy5sZW5ndGg7XysrKWIucHVzaChvLmVkZ2VzW19dKTtmb3IodmFyIHc9MDt3PGIubGVuZ3RoO3crKyl7dmFyIHg9Ylt3XSxrPXRoaXMuX2dldENvbm5lY3RlZElkKHgsdCk7aWYodm9pZCAwIT09dGhpcy5jbHVzdGVyZWROb2Rlc1trXSl7dmFyIE89dGhpcy5ib2R5Lm5vZGVzW3RoaXMuY2x1c3RlcmVkTm9kZXNba10uY2x1c3RlcklkXSxEPXRoaXMuYm9keS5lZGdlc1t4LmNsdXN0ZXJpbmdFZGdlUmVwbGFjaW5nSWRdO2lmKHZvaWQgMCE9PUQpe08uY29udGFpbmVkRWRnZXNbRC5pZF09RCxkZWxldGUgc1tELmlkXTt2YXIgUz1ELmZyb21JZCxDPUQudG9JZDtELnRvSWQ9PWs/Qz10aGlzLmNsdXN0ZXJlZE5vZGVzW2tdLmNsdXN0ZXJJZDpTPXRoaXMuY2x1c3RlcmVkTm9kZXNba10uY2x1c3RlcklkO3ZhciBUPWguZGVmYXVsdC5jbG9uZU9wdGlvbnMoRCwiZWRnZSIpO2MuZGVlcEV4dGVuZChULE8uY2x1c3RlckVkZ2VQcm9wZXJ0aWVzKTt2YXIgRT0iY2x1c3RlckVkZ2U6IitjLnJhbmRvbVVVSUQoKTtjLmRlZXBFeHRlbmQoVCx7ZnJvbTpTLHRvOkMsaGlkZGVuOiExLHBoeXNpY3M6ITAsaWQ6RX0pO3ZhciBNPXRoaXMuYm9keS5mdW5jdGlvbnMuY3JlYXRlRWRnZShUKTtNLmNsdXN0ZXJpbmdFZGdlUmVwbGFjaW5nSWQ9RC5pZCx0aGlzLmJvZHkuZWRnZXNbRV09TSx0aGlzLmJvZHkuZWRnZXNbRV0uY29ubmVjdCgpfX1lbHNle3ZhciBQPXRoaXMuYm9keS5lZGdlc1t4LmNsdXN0ZXJpbmdFZGdlUmVwbGFjaW5nSWRdO3ZvaWQgMCE9PVAmJnRoaXMuX3Jlc3RvcmVFZGdlKFApfXguY2xlYW51cCgpLHguZGlzY29ubmVjdCgpLGRlbGV0ZSB0aGlzLmJvZHkuZWRnZXNbeC5pZF19Zm9yKHZhciBJIGluIHMpcy5oYXNPd25Qcm9wZXJ0eShJKSYmdGhpcy5fcmVzdG9yZUVkZ2Uoc1tJXSk7ZGVsZXRlIHRoaXMuYm9keS5ub2Rlc1t0XSxpPT09ITAmJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9kYXRhQ2hhbmdlZCIpfX0se2tleToiZ2V0Tm9kZXNJbkNsdXN0ZXIiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPVtdO2lmKHRoaXMuaXNDbHVzdGVyKHQpPT09ITApe3ZhciBpPXRoaXMuYm9keS5ub2Rlc1t0XS5jb250YWluZWROb2Rlcztmb3IodmFyIG8gaW4gaSlpLmhhc093blByb3BlcnR5KG8pJiZlLnB1c2godGhpcy5ib2R5Lm5vZGVzW29dLmlkKX1yZXR1cm4gZX19LHtrZXk6ImZpbmROb2RlIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT0xMDAsbz0wO3ZvaWQgMCE9PXRoaXMuY2x1c3RlcmVkTm9kZXNbdF0mJm88aTspZS5wdXNoKHRoaXMuYm9keS5ub2Rlc1t0XS5pZCksdD10aGlzLmNsdXN0ZXJlZE5vZGVzW3RdLmNsdXN0ZXJJZCxvKys7cmV0dXJuIGUucHVzaCh0aGlzLmJvZHkubm9kZXNbdF0uaWQpLGUucmV2ZXJzZSgpLGV9fSx7a2V5OiJ1cGRhdGVDbHVzdGVyZWROb2RlIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IEVycm9yKCJObyBjbHVzdGVyZWROb2RlSWQgc3VwcGxpZWQgdG8gdXBkYXRlQ2x1c3RlcmVkTm9kZS4iKTtpZih2b2lkIDA9PT1lKXRocm93IG5ldyBFcnJvcigiTm8gbmV3T3B0aW9ucyBzdXBwbGllZCB0byB1cGRhdGVDbHVzdGVyZWROb2RlLiIpO2lmKHZvaWQgMD09PXRoaXMuYm9keS5ub2Rlc1t0XSl0aHJvdyBuZXcgRXJyb3IoIlRoZSBjbHVzdGVyZWROb2RlSWQgc3VwcGxpZWQgdG8gdXBkYXRlQ2x1c3RlcmVkTm9kZSBkb2VzIG5vdCBleGlzdC4iKTt0aGlzLmJvZHkubm9kZXNbdF0uc2V0T3B0aW9ucyhlKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfZGF0YUNoYW5nZWQiKX19LHtrZXk6InVwZGF0ZUVkZ2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgRXJyb3IoIk5vIHN0YXJ0RWRnZUlkIHN1cHBsaWVkIHRvIHVwZGF0ZUVkZ2UuIik7aWYodm9pZCAwPT09ZSl0aHJvdyBuZXcgRXJyb3IoIk5vIG5ld09wdGlvbnMgc3VwcGxpZWQgdG8gdXBkYXRlRWRnZS4iKTtpZih2b2lkIDA9PT10aGlzLmJvZHkuZWRnZXNbdF0pdGhyb3cgbmV3IEVycm9yKCJUaGUgc3RhcnRFZGdlSWQgc3VwcGxpZWQgdG8gdXBkYXRlRWRnZSBkb2VzIG5vdCBleGlzdC4iKTtmb3IodmFyIGk9dGhpcy5nZXRDbHVzdGVyZWRFZGdlcyh0KSxvPTA7bzxpLmxlbmd0aDtvKyspe3ZhciBuPXRoaXMuYm9keS5lZGdlc1tpW29dXTtuLnNldE9wdGlvbnMoZSl9dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX2RhdGFDaGFuZ2VkIil9fSx7a2V5OiJnZXRDbHVzdGVyZWRFZGdlcyIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLGk9MTAwLG89MDt2b2lkIDAhPT10JiZ2b2lkIDAhPT10aGlzLmJvZHkuZWRnZXNbdF0mJm88aTspZS5wdXNoKHRoaXMuYm9keS5lZGdlc1t0XS5pZCksdD10aGlzLmJvZHkuZWRnZXNbdF0uZWRnZVJlcGxhY2VkQnlJZCxvKys7cmV0dXJuIGUucmV2ZXJzZSgpLGV9fSx7a2V5OiJnZXRCYXNlRWRnZSIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQsaT0xMDAsbz0wO3ZvaWQgMCE9PXQmJnZvaWQgMCE9PXRoaXMuYm9keS5lZGdlc1t0XSYmbzxpOyl0PXRoaXMuYm9keS5lZGdlc1t0XS5jbHVzdGVyaW5nRWRnZVJlcGxhY2luZ0lkLG8rKyx2b2lkIDAhPT10JiYoZT10KTtyZXR1cm4gZX19LHtrZXk6Il9nZXRDb25uZWN0ZWRJZCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50b0lkIT1lP3QudG9JZDp0LmZyb21JZCE9ZT90LmZyb21JZDp0LmZyb21JZH19LHtrZXk6Il9nZXRIdWJTaXplIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD0wLGU9MCxpPTAsbz0wLG49MDtuPHRoaXMuYm9keS5ub2RlSW5kaWNlcy5sZW5ndGg7bisrKXt2YXIgcz10aGlzLmJvZHkubm9kZXNbdGhpcy5ib2R5Lm5vZGVJbmRpY2VzW25dXTtzLmVkZ2VzLmxlbmd0aD5vJiYobz1zLmVkZ2VzLmxlbmd0aCksdCs9cy5lZGdlcy5sZW5ndGgsCmUrPU1hdGgucG93KHMuZWRnZXMubGVuZ3RoLDIpLGkrPTF9dC89aSxlLz1pO3ZhciByPWUtTWF0aC5wb3codCwyKSxhPU1hdGguc3FydChyKSxoPU1hdGguZmxvb3IodCsyKmEpO3JldHVybiBoPm8mJihoPW8pLGh9fV0pLHR9KCk7ZS5kZWZhdWx0PXV9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBvJiYoby53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsby5rZXksbyl9fXJldHVybiBmdW5jdGlvbihlLGksbyl7cmV0dXJuIGkmJnQoZS5wcm90b3R5cGUsaSksbyYmdChlLG8pLGV9fSgpLHM9aSgxKSxyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe28odGhpcyx0KX1yZXR1cm4gbih0LG51bGwsW3trZXk6ImdldFJhbmdlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZSxpPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpbXSxvPTFlOSxuPS0xZTkscz0xZTkscj0tMWU5O2lmKGkubGVuZ3RoPjApZm9yKHZhciBhPTA7YTxpLmxlbmd0aDthKyspZT10W2lbYV1dLHM+ZS5zaGFwZS5ib3VuZGluZ0JveC5sZWZ0JiYocz1lLnNoYXBlLmJvdW5kaW5nQm94LmxlZnQpLHI8ZS5zaGFwZS5ib3VuZGluZ0JveC5yaWdodCYmKHI9ZS5zaGFwZS5ib3VuZGluZ0JveC5yaWdodCksbz5lLnNoYXBlLmJvdW5kaW5nQm94LnRvcCYmKG89ZS5zaGFwZS5ib3VuZGluZ0JveC50b3ApLG48ZS5zaGFwZS5ib3VuZGluZ0JveC5ib3R0b20mJihuPWUuc2hhcGUuYm91bmRpbmdCb3guYm90dG9tKTtyZXR1cm4gMWU5PT09cyYmcj09PS0xZTkmJjFlOT09PW8mJm49PT0tMWU5JiYobz0wLG49MCxzPTAscj0wKSx7bWluWDpzLG1heFg6cixtaW5ZOm8sbWF4WTpufX19LHtrZXk6ImdldFJhbmdlQ29yZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGUsaT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06W10sbz0xZTksbj0tMWU5LHM9MWU5LHI9LTFlOTtpZihpLmxlbmd0aD4wKWZvcih2YXIgYT0wO2E8aS5sZW5ndGg7YSsrKWU9dFtpW2FdXSxzPmUueCYmKHM9ZS54KSxyPGUueCYmKHI9ZS54KSxvPmUueSYmKG89ZS55KSxuPGUueSYmKG49ZS55KTtyZXR1cm4gMWU5PT09cyYmcj09PS0xZTkmJjFlOT09PW8mJm49PT0tMWU5JiYobz0wLG49MCxzPTAscj0wKSx7bWluWDpzLG1heFg6cixtaW5ZOm8sbWF4WTpufX19LHtrZXk6ImZpbmRDZW50ZXIiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybnt4Oi41Kih0Lm1heFgrdC5taW5YKSx5Oi41Kih0Lm1heFkrdC5taW5ZKX19fSx7a2V5OiJjbG9uZU9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9e307cmV0dXJuIHZvaWQgMD09PWV8fCJub2RlIj09PWU/KHMuZGVlcEV4dGVuZChpLHQub3B0aW9ucywhMCksaS54PXQueCxpLnk9dC55LGkuYW1vdW50T2ZDb25uZWN0aW9ucz10LmVkZ2VzLmxlbmd0aCk6cy5kZWVwRXh0ZW5kKGksdC5vcHRpb25zLCEwKSxpfX1dKSx0fSgpO2UuZGVmYXVsdD1yfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIHModCxlKXtpZighdCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiFlfHwib2JqZWN0IiE9dHlwZW9mIGUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlP3Q6ZX1mdW5jdGlvbiByKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgZSk7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxlKTp0Ll9fcHJvdG9fXz1lKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGE9aSg2NyksaD1vKGEpLGQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyxyLGEpe24odGhpcyxlKTt2YXIgaD1zKHRoaXMsKGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSkpLmNhbGwodGhpcyx0LGksbyxyLGEpKTtyZXR1cm4gaC5pc0NsdXN0ZXI9ITAsaC5jb250YWluZWROb2Rlcz17fSxoLmNvbnRhaW5lZEVkZ2VzPXt9LGh9cmV0dXJuIHIoZSx0KSxlfShoLmRlZmF1bHQpO2UuZGVmYXVsdD1kfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG8pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG8mJnQoZSxvKSxlfX0oKTsidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmKHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lKTt2YXIgcz1pKDEpLHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsaSl7byh0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMuY2FudmFzPWksdGhpcy5yZWRyYXdSZXF1ZXN0ZWQ9ITEsdGhpcy5yZW5kZXJUaW1lcj12b2lkIDAsdGhpcy5yZXF1aXJlc1RpbWVvdXQ9ITAsdGhpcy5yZW5kZXJpbmdBY3RpdmU9ITEsdGhpcy5yZW5kZXJSZXF1ZXN0cz0wLHRoaXMucGl4ZWxSYXRpbz12b2lkIDAsdGhpcy5hbGxvd1JlZHJhdz0hMCx0aGlzLmRyYWdnaW5nPSExLHRoaXMub3B0aW9ucz17fSx0aGlzLmRlZmF1bHRPcHRpb25zPXtoaWRlRWRnZXNPbkRyYWc6ITEsaGlkZU5vZGVzT25EcmFnOiExfSxzLmV4dGVuZCh0aGlzLm9wdGlvbnMsdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5fZGV0ZXJtaW5lQnJvd3Nlck1ldGhvZCgpLHRoaXMuYmluZEV2ZW50TGlzdGVuZXJzKCl9cmV0dXJuIG4odCxbe2tleToiYmluZEV2ZW50TGlzdGVuZXJzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5ib2R5LmVtaXR0ZXIub24oImRyYWdTdGFydCIsZnVuY3Rpb24oKXt0LmRyYWdnaW5nPSEwfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oImRyYWdFbmQiLGZ1bmN0aW9uKCl7cmV0dXJuIHQuZHJhZ2dpbmc9ITF9KSx0aGlzLmJvZHkuZW1pdHRlci5vbigiX3Jlc2l6ZU5vZGVzIixmdW5jdGlvbigpe3JldHVybiB0Ll9yZXNpemVOb2RlcygpfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oIl9yZWRyYXciLGZ1bmN0aW9uKCl7dC5yZW5kZXJpbmdBY3RpdmU9PT0hMSYmdC5fcmVkcmF3KCl9KSx0aGlzLmJvZHkuZW1pdHRlci5vbigiX2Jsb2NrUmVkcmF3IixmdW5jdGlvbigpe3QuYWxsb3dSZWRyYXc9ITF9KSx0aGlzLmJvZHkuZW1pdHRlci5vbigiX2FsbG93UmVkcmF3IixmdW5jdGlvbigpe3QuYWxsb3dSZWRyYXc9ITAsdC5yZWRyYXdSZXF1ZXN0ZWQ9ITF9KSx0aGlzLmJvZHkuZW1pdHRlci5vbigiX3JlcXVlc3RSZWRyYXciLHRoaXMuX3JlcXVlc3RSZWRyYXcuYmluZCh0aGlzKSksdGhpcy5ib2R5LmVtaXR0ZXIub24oIl9zdGFydFJlbmRlcmluZyIsZnVuY3Rpb24oKXt0LnJlbmRlclJlcXVlc3RzKz0xLHQucmVuZGVyaW5nQWN0aXZlPSEwLHQuX3N0YXJ0UmVuZGVyaW5nKCl9KSx0aGlzLmJvZHkuZW1pdHRlci5vbigiX3N0b3BSZW5kZXJpbmciLGZ1bmN0aW9uKCl7dC5yZW5kZXJSZXF1ZXN0cy09MSx0LnJlbmRlcmluZ0FjdGl2ZT10LnJlbmRlclJlcXVlc3RzPjAsdC5yZW5kZXJUaW1lcj12b2lkIDB9KSx0aGlzLmJvZHkuZW1pdHRlci5vbigiZGVzdHJveSIsZnVuY3Rpb24oKXt0LnJlbmRlclJlcXVlc3RzPTAsdC5hbGxvd1JlZHJhdz0hMSx0LnJlbmRlcmluZ0FjdGl2ZT0hMSx0LnJlcXVpcmVzVGltZW91dD09PSEwP2NsZWFyVGltZW91dCh0LnJlbmRlclRpbWVyKTpjYW5jZWxBbmltYXRpb25GcmFtZSh0LnJlbmRlclRpbWVyKSx0LmJvZHkuZW1pdHRlci5vZmYoKX0pfX0se2tleToic2V0T3B0aW9ucyIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09dCl7dmFyIGU9WyJoaWRlRWRnZXNPbkRyYWciLCJoaWRlTm9kZXNPbkRyYWciXTtzLnNlbGVjdGl2ZURlZXBFeHRlbmQoZSx0aGlzLm9wdGlvbnMsdCl9fX0se2tleToiX3N0YXJ0UmVuZGVyaW5nIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMucmVuZGVyaW5nQWN0aXZlPT09ITAmJnZvaWQgMD09PXRoaXMucmVuZGVyVGltZXImJih0aGlzLnJlcXVpcmVzVGltZW91dD09PSEwP3RoaXMucmVuZGVyVGltZXI9d2luZG93LnNldFRpbWVvdXQodGhpcy5fcmVuZGVyU3RlcC5iaW5kKHRoaXMpLHRoaXMuc2ltdWxhdGlvbkludGVydmFsKTp0aGlzLnJlbmRlclRpbWVyPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5fcmVuZGVyU3RlcC5iaW5kKHRoaXMpKSl9fSx7a2V5OiJfcmVuZGVyU3RlcCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmluZ0FjdGl2ZT09PSEwJiYodGhpcy5yZW5kZXJUaW1lcj12b2lkIDAsdGhpcy5yZXF1aXJlc1RpbWVvdXQ9PT0hMCYmdGhpcy5fc3RhcnRSZW5kZXJpbmcoKSx0aGlzLl9yZWRyYXcoKSx0aGlzLnJlcXVpcmVzVGltZW91dD09PSExJiZ0aGlzLl9zdGFydFJlbmRlcmluZygpKX19LHtrZXk6InJlZHJhdyIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJzZXRTaXplIiksdGhpcy5fcmVkcmF3KCl9fSx7a2V5OiJfcmVxdWVzdFJlZHJhdyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMucmVkcmF3UmVxdWVzdGVkIT09ITAmJnRoaXMucmVuZGVyaW5nQWN0aXZlPT09ITEmJnRoaXMuYWxsb3dSZWRyYXc9PT0hMCYmKHRoaXMucmVkcmF3UmVxdWVzdGVkPSEwLHRoaXMucmVxdWlyZXNUaW1lb3V0PT09ITA/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0Ll9yZWRyYXcoITEpfSwwKTp3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7dC5fcmVkcmF3KCExKX0pKX19LHtrZXk6Il9yZWRyYXciLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXTtpZih0aGlzLmFsbG93UmVkcmF3PT09ITApe3RoaXMuYm9keS5lbWl0dGVyLmVtaXQoImluaXRSZWRyYXciKSx0aGlzLnJlZHJhd1JlcXVlc3RlZD0hMTt2YXIgZT10aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMuZ2V0Q29udGV4dCgiMmQiKTswIT09dGhpcy5jYW52YXMuZnJhbWUuY2FudmFzLndpZHRoJiYwIT09dGhpcy5jYW52YXMuZnJhbWUuY2FudmFzLmhlaWdodHx8dGhpcy5jYW52YXMuc2V0U2l6ZSgpLHRoaXMucGl4ZWxSYXRpbz0od2luZG93LmRldmljZVBpeGVsUmF0aW98fDEpLyhlLndlYmtpdEJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fGUubW96QmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8ZS5tc0JhY2tpbmdTdG9yZVBpeGVsUmF0aW98fGUub0JhY2tpbmdTdG9yZVBpeGVsUmF0aW98fGUuYmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8MSksZS5zZXRUcmFuc2Zvcm0odGhpcy5waXhlbFJhdGlvLDAsMCx0aGlzLnBpeGVsUmF0aW8sMCwwKTt2YXIgaT10aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgsbz10aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMuY2xpZW50SGVpZ2h0O2lmKGUuY2xlYXJSZWN0KDAsMCxpLG8pLDA9PT10aGlzLmNhbnZhcy5mcmFtZS5jbGllbnRXaWR0aClyZXR1cm47ZS5zYXZlKCksZS50cmFuc2xhdGUodGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb24ueCx0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi55KSxlLnNjYWxlKHRoaXMuYm9keS52aWV3LnNjYWxlLHRoaXMuYm9keS52aWV3LnNjYWxlKSxlLmJlZ2luUGF0aCgpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoImJlZm9yZURyYXdpbmciLGUpLGUuY2xvc2VQYXRoKCksdD09PSExJiYodGhpcy5kcmFnZ2luZz09PSExfHx0aGlzLmRyYWdnaW5nPT09ITAmJnRoaXMub3B0aW9ucy5oaWRlRWRnZXNPbkRyYWc9PT0hMSkmJnRoaXMuX2RyYXdFZGdlcyhlKSwodGhpcy5kcmFnZ2luZz09PSExfHx0aGlzLmRyYWdnaW5nPT09ITAmJnRoaXMub3B0aW9ucy5oaWRlTm9kZXNPbkRyYWc9PT0hMSkmJnRoaXMuX2RyYXdOb2RlcyhlLHQpLGUuYmVnaW5QYXRoKCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiYWZ0ZXJEcmF3aW5nIixlKSxlLmNsb3NlUGF0aCgpLGUucmVzdG9yZSgpLHQ9PT0hMCYmZS5jbGVhclJlY3QoMCwwLGksbyl9fX0se2tleToiX3Jlc2l6ZU5vZGVzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5nZXRDb250ZXh0KCIyZCIpO3ZvaWQgMD09PXRoaXMucGl4ZWxSYXRpbyYmKHRoaXMucGl4ZWxSYXRpbz0od2luZG93LmRldmljZVBpeGVsUmF0aW98fDEpLyh0LndlYmtpdEJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fHQubW96QmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8dC5tc0JhY2tpbmdTdG9yZVBpeGVsUmF0aW98fHQub0JhY2tpbmdTdG9yZVBpeGVsUmF0aW98fHQuYmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8MSkpLHQuc2V0VHJhbnNmb3JtKHRoaXMucGl4ZWxSYXRpbywwLDAsdGhpcy5waXhlbFJhdGlvLDAsMCksdC5zYXZlKCksdC50cmFuc2xhdGUodGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb24ueCx0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi55KSx0LnNjYWxlKHRoaXMuYm9keS52aWV3LnNjYWxlLHRoaXMuYm9keS52aWV3LnNjYWxlKTt2YXIgZT10aGlzLmJvZHkubm9kZXMsaT12b2lkIDA7Zm9yKHZhciBvIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShvKSYmKGk9ZVtvXSxpLnJlc2l6ZSh0KSxpLnVwZGF0ZUJvdW5kaW5nQm94KHQsaS5zZWxlY3RlZCkpO3QucmVzdG9yZSgpfX0se2tleToiX2RyYXdOb2RlcyIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV0saT10aGlzLmJvZHkubm9kZXMsbz10aGlzLmJvZHkubm9kZUluZGljZXMsbj12b2lkIDAscz1bXSxyPTIwLGE9dGhpcy5jYW52YXMuRE9NdG9DYW52YXMoe3g6LXIseTotcn0pLGg9dGhpcy5jYW52YXMuRE9NdG9DYW52YXMoe3g6dGhpcy5jYW52YXMuZnJhbWUuY2FudmFzLmNsaWVudFdpZHRoK3IseTp0aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMuY2xpZW50SGVpZ2h0K3J9KSxkPXt0b3A6YS55LGxlZnQ6YS54LGJvdHRvbTpoLnkscmlnaHQ6aC54fSxsPTA7bDxvLmxlbmd0aDtsKyspbj1pW29bbF1dLG4uaXNTZWxlY3RlZCgpP3MucHVzaChvW2xdKTplPT09ITA/bi5kcmF3KHQpOm4uaXNCb3VuZGluZ0JveE92ZXJsYXBwaW5nV2l0aChkKT09PSEwP24uZHJhdyh0KTpuLnVwZGF0ZUJvdW5kaW5nQm94KHQsbi5zZWxlY3RlZCk7Zm9yKHZhciBjPTA7YzxzLmxlbmd0aDtjKyspbj1pW3NbY11dLG4uZHJhdyh0KX19LHtrZXk6Il9kcmF3RWRnZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmJvZHkuZWRnZXMsaT10aGlzLmJvZHkuZWRnZUluZGljZXMsbz12b2lkIDAsbj0wO248aS5sZW5ndGg7bisrKW89ZVtpW25dXSxvLmNvbm5lY3RlZD09PSEwJiZvLmRyYXcodCl9fSx7a2V5OiJfZGV0ZXJtaW5lQnJvd3Nlck1ldGhvZCIsdmFsdWU6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyl7dmFyIHQ9bmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO3RoaXMucmVxdWlyZXNUaW1lb3V0PSExLHQuaW5kZXhPZigibXNpZSA5LjAiKSE9LTE/dGhpcy5yZXF1aXJlc1RpbWVvdXQ9ITA6dC5pbmRleE9mKCJzYWZhcmkiKSE9LTEmJnQuaW5kZXhPZigiY2hyb21lIik8PS0xJiYodGhpcy5yZXF1aXJlc1RpbWVvdXQ9ITApfWVsc2UgdGhpcy5yZXF1aXJlc1RpbWVvdXQ9ITB9fV0pLHR9KCk7ZS5kZWZhdWx0PXJ9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBvJiYoby53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsby5rZXksbyl9fXJldHVybiBmdW5jdGlvbihlLGksbyl7cmV0dXJuIGkmJnQoZS5wcm90b3R5cGUsaSksbyYmdChlLG8pLGV9fSgpLHM9aSgyMikscj1pKDMwKSxhPWkoMSksaD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7byh0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMucGl4ZWxSYXRpbz0xLHRoaXMucmVzaXplVGltZXI9dm9pZCAwLHRoaXMucmVzaXplRnVuY3Rpb249dGhpcy5fb25SZXNpemUuYmluZCh0aGlzKSx0aGlzLmNhbWVyYVN0YXRlPXt9LHRoaXMuaW5pdGlhbGl6ZWQ9ITEsdGhpcy5jYW52YXNWaWV3Q2VudGVyPXt9LHRoaXMub3B0aW9ucz17fSx0aGlzLmRlZmF1bHRPcHRpb25zPXthdXRvUmVzaXplOiEwLGhlaWdodDoiMTAwJSIsd2lkdGg6IjEwMCUifSxhLmV4dGVuZCh0aGlzLm9wdGlvbnMsdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5iaW5kRXZlbnRMaXN0ZW5lcnMoKX1yZXR1cm4gbih0LFt7a2V5OiJiaW5kRXZlbnRMaXN0ZW5lcnMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmJvZHkuZW1pdHRlci5vbmNlKCJyZXNpemUiLGZ1bmN0aW9uKGUpezAhPT1lLndpZHRoJiYodC5ib2R5LnZpZXcudHJhbnNsYXRpb24ueD0uNSplLndpZHRoKSwwIT09ZS5oZWlnaHQmJih0LmJvZHkudmlldy50cmFuc2xhdGlvbi55PS41KmUuaGVpZ2h0KX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJzZXRTaXplIix0aGlzLnNldFNpemUuYmluZCh0aGlzKSksdGhpcy5ib2R5LmVtaXR0ZXIub24oImRlc3Ryb3kiLGZ1bmN0aW9uKCl7dC5oYW1tZXJGcmFtZS5kZXN0cm95KCksdC5oYW1tZXIuZGVzdHJveSgpLHQuX2NsZWFuVXAoKX0pfX0se2tleToic2V0T3B0aW9ucyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZih2b2lkIDAhPT10KXt2YXIgaT1bIndpZHRoIiwiaGVpZ2h0IiwiYXV0b1Jlc2l6ZSJdO2Euc2VsZWN0aXZlRGVlcEV4dGVuZChpLHRoaXMub3B0aW9ucyx0KX10aGlzLm9wdGlvbnMuYXV0b1Jlc2l6ZT09PSEwJiYodGhpcy5fY2xlYW5VcCgpLHRoaXMucmVzaXplVGltZXI9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgdD1lLnNldFNpemUoKTt0PT09ITAmJmUuYm9keS5lbWl0dGVyLmVtaXQoIl9yZXF1ZXN0UmVkcmF3Iil9LDFlMyksdGhpcy5yZXNpemVGdW5jdGlvbj10aGlzLl9vblJlc2l6ZS5iaW5kKHRoaXMpLGEuYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csInJlc2l6ZSIsdGhpcy5yZXNpemVGdW5jdGlvbikpfX0se2tleToiX2NsZWFuVXAiLHZhbHVlOmZ1bmN0aW9uKCl7dm9pZCAwIT09dGhpcy5yZXNpemVUaW1lciYmY2xlYXJJbnRlcnZhbCh0aGlzLnJlc2l6ZVRpbWVyKSxhLnJlbW92ZUV2ZW50TGlzdGVuZXIod2luZG93LCJyZXNpemUiLHRoaXMucmVzaXplRnVuY3Rpb24pLHRoaXMucmVzaXplRnVuY3Rpb249dm9pZCAwfX0se2tleToiX29uUmVzaXplIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuc2V0U2l6ZSgpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9yZWRyYXciKX19LHtrZXk6Il9nZXRDYW1lcmFTdGF0ZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06dGhpcy5waXhlbFJhdGlvO3RoaXMuaW5pdGlhbGl6ZWQ9PT0hMCYmKHRoaXMuY2FtZXJhU3RhdGUucHJldmlvdXNXaWR0aD10aGlzLmZyYW1lLmNhbnZhcy53aWR0aC90LHRoaXMuY2FtZXJhU3RhdGUucHJldmlvdXNIZWlnaHQ9dGhpcy5mcmFtZS5jYW52YXMuaGVpZ2h0L3QsdGhpcy5jYW1lcmFTdGF0ZS5zY2FsZT10aGlzLmJvZHkudmlldy5zY2FsZSx0aGlzLmNhbWVyYVN0YXRlLnBvc2l0aW9uPXRoaXMuRE9NdG9DYW52YXMoe3g6LjUqdGhpcy5mcmFtZS5jYW52YXMud2lkdGgvdCx5Oi41KnRoaXMuZnJhbWUuY2FudmFzLmhlaWdodC90fSkpfX0se2tleToiX3NldENhbWVyYVN0YXRlIix2YWx1ZTpmdW5jdGlvbigpe2lmKHZvaWQgMCE9PXRoaXMuY2FtZXJhU3RhdGUuc2NhbGUmJjAhPT10aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aCYmMCE9PXRoaXMuZnJhbWUuY2FudmFzLmNsaWVudEhlaWdodCYmMCE9PXRoaXMucGl4ZWxSYXRpbyYmdGhpcy5jYW1lcmFTdGF0ZS5wcmV2aW91c1dpZHRoPjApe3ZhciB0PXRoaXMuZnJhbWUuY2FudmFzLndpZHRoL3RoaXMucGl4ZWxSYXRpby90aGlzLmNhbWVyYVN0YXRlLnByZXZpb3VzV2lkdGgsZT10aGlzLmZyYW1lLmNhbnZhcy5oZWlnaHQvdGhpcy5waXhlbFJhdGlvL3RoaXMuY2FtZXJhU3RhdGUucHJldmlvdXNIZWlnaHQsaT10aGlzLmNhbWVyYVN0YXRlLnNjYWxlOzEhPXQmJjEhPWU/aT0uNSp0aGlzLmNhbWVyYVN0YXRlLnNjYWxlKih0K2UpOjEhPXQ/aT10aGlzLmNhbWVyYVN0YXRlLnNjYWxlKnQ6MSE9ZSYmKGk9dGhpcy5jYW1lcmFTdGF0ZS5zY2FsZSplKSx0aGlzLmJvZHkudmlldy5zY2FsZT1pO3ZhciBvPXRoaXMuRE9NdG9DYW52YXMoe3g6LjUqdGhpcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgseTouNSp0aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRIZWlnaHR9KSxuPXt4Om8ueC10aGlzLmNhbWVyYVN0YXRlLnBvc2l0aW9uLngseTpvLnktdGhpcy5jYW1lcmFTdGF0ZS5wb3NpdGlvbi55fTt0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi54Kz1uLngqdGhpcy5ib2R5LnZpZXcuc2NhbGUsdGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb24ueSs9bi55KnRoaXMuYm9keS52aWV3LnNjYWxlfX19LHtrZXk6Il9wcmVwYXJlVmFsdWUiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdCsicHgiO2lmKCJzdHJpbmciPT10eXBlb2YgdCl7aWYodC5pbmRleE9mKCIlIikhPT0tMXx8dC5pbmRleE9mKCJweCIpIT09LTEpcmV0dXJuIHQ7aWYodC5pbmRleE9mKCIlIik9PT0tMSlyZXR1cm4gdCsicHgifXRocm93IG5ldyBFcnJvcigiQ291bGQgbm90IHVzZSB0aGUgdmFsdWUgc3VwcGxpZWQgZm9yIHdpZHRoIG9yIGhlaWdodDoiK3QpfX0se2tleToiX2NyZWF0ZSIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IoO3RoaXMuYm9keS5jb250YWluZXIuaGFzQ2hpbGROb2RlcygpOyl0aGlzLmJvZHkuY29udGFpbmVyLnJlbW92ZUNoaWxkKHRoaXMuYm9keS5jb250YWluZXIuZmlyc3RDaGlsZCk7aWYodGhpcy5mcmFtZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmZyYW1lLmNsYXNzTmFtZT0idmlzLW5ldHdvcmsiLHRoaXMuZnJhbWUuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIix0aGlzLmZyYW1lLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLHRoaXMuZnJhbWUudGFiSW5kZXg9OTAwLHRoaXMuZnJhbWUuY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLHRoaXMuZnJhbWUuY2FudmFzLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmZyYW1lLmNhbnZhcyksdGhpcy5mcmFtZS5jYW52YXMuZ2V0Q29udGV4dCl7dmFyIHQ9dGhpcy5mcmFtZS5jYW52YXMuZ2V0Q29udGV4dCgiMmQiKTt0aGlzLnBpeGVsUmF0aW89KHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfHwxKS8odC53ZWJraXRCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0Lm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fHQubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0Lm9CYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0LmJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fDEpLHRoaXMuZnJhbWUuY2FudmFzLmdldENvbnRleHQoIjJkIikuc2V0VHJhbnNmb3JtKHRoaXMucGl4ZWxSYXRpbywwLDAsdGhpcy5waXhlbFJhdGlvLDAsMCl9ZWxzZXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKTtlLnN0eWxlLmNvbG9yPSJyZWQiLGUuc3R5bGUuZm9udFdlaWdodD0iYm9sZCIsZS5zdHlsZS5wYWRkaW5nPSIxMHB4IixlLmlubmVySFRNTD0iRXJyb3I6IHlvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IEhUTUwgY2FudmFzIix0aGlzLmZyYW1lLmNhbnZhcy5hcHBlbmRDaGlsZChlKX10aGlzLmJvZHkuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZnJhbWUpLHRoaXMuYm9keS52aWV3LnNjYWxlPTEsdGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb249e3g6LjUqdGhpcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgseTouNSp0aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRIZWlnaHR9LHRoaXMuX2JpbmRIYW1tZXIoKX19LHtrZXk6Il9iaW5kSGFtbWVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dm9pZCAwIT09dGhpcy5oYW1tZXImJnRoaXMuaGFtbWVyLmRlc3Ryb3koKSx0aGlzLmRyYWc9e30sdGhpcy5waW5jaD17fSx0aGlzLmhhbW1lcj1uZXcgcyh0aGlzLmZyYW1lLmNhbnZhcyksdGhpcy5oYW1tZXIuZ2V0KCJwaW5jaCIpLnNldCh7ZW5hYmxlOiEwfSksdGhpcy5oYW1tZXIuZ2V0KCJwYW4iKS5zZXQoe3RocmVzaG9sZDo1LGRpcmVjdGlvbjpzLkRJUkVDVElPTl9BTEx9KSxyLm9uVG91Y2godGhpcy5oYW1tZXIsZnVuY3Rpb24oZSl7dC5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uVG91Y2goZSl9KSx0aGlzLmhhbW1lci5vbigidGFwIixmdW5jdGlvbihlKXt0LmJvZHkuZXZlbnRMaXN0ZW5lcnMub25UYXAoZSl9KSx0aGlzLmhhbW1lci5vbigiZG91YmxldGFwIixmdW5jdGlvbihlKXt0LmJvZHkuZXZlbnRMaXN0ZW5lcnMub25Eb3VibGVUYXAoZSl9KSx0aGlzLmhhbW1lci5vbigicHJlc3MiLGZ1bmN0aW9uKGUpe3QuYm9keS5ldmVudExpc3RlbmVycy5vbkhvbGQoZSl9KSx0aGlzLmhhbW1lci5vbigicGFuc3RhcnQiLGZ1bmN0aW9uKGUpe3QuYm9keS5ldmVudExpc3RlbmVycy5vbkRyYWdTdGFydChlKX0pLHRoaXMuaGFtbWVyLm9uKCJwYW5tb3ZlIixmdW5jdGlvbihlKXt0LmJvZHkuZXZlbnRMaXN0ZW5lcnMub25EcmFnKGUpfSksdGhpcy5oYW1tZXIub24oInBhbmVuZCIsZnVuY3Rpb24oZSl7dC5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uRHJhZ0VuZChlKX0pLHRoaXMuaGFtbWVyLm9uKCJwaW5jaCIsZnVuY3Rpb24oZSl7dC5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uUGluY2goZSl9KSx0aGlzLmZyYW1lLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXdoZWVsIixmdW5jdGlvbihlKXt0LmJvZHkuZXZlbnRMaXN0ZW5lcnMub25Nb3VzZVdoZWVsKGUpfSksdGhpcy5mcmFtZS5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigiRE9NTW91c2VTY3JvbGwiLGZ1bmN0aW9uKGUpe3QuYm9keS5ldmVudExpc3RlbmVycy5vbk1vdXNlV2hlZWwoZSl9KSx0aGlzLmZyYW1lLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLGZ1bmN0aW9uKGUpe3QuYm9keS5ldmVudExpc3RlbmVycy5vbk1vdXNlTW92ZShlKX0pLHRoaXMuZnJhbWUuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IixmdW5jdGlvbihlKXt0LmJvZHkuZXZlbnRMaXN0ZW5lcnMub25Db250ZXh0KGUpfSksdGhpcy5oYW1tZXJGcmFtZT1uZXcgcyh0aGlzLmZyYW1lKSxyLm9uUmVsZWFzZSh0aGlzLmhhbW1lckZyYW1lLGZ1bmN0aW9uKGUpe3QuYm9keS5ldmVudExpc3RlbmVycy5vblJlbGVhc2UoZSl9KX19LHtrZXk6InNldFNpemUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnRoaXMub3B0aW9ucy53aWR0aCxlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp0aGlzLm9wdGlvbnMuaGVpZ2h0O3Q9dGhpcy5fcHJlcGFyZVZhbHVlKHQpLGU9dGhpcy5fcHJlcGFyZVZhbHVlKGUpO3ZhciBpPSExLG89dGhpcy5mcmFtZS5jYW52YXMud2lkdGgsbj10aGlzLmZyYW1lLmNhbnZhcy5oZWlnaHQscz10aGlzLmZyYW1lLmNhbnZhcy5nZXRDb250ZXh0KCIyZCIpLHI9dGhpcy5waXhlbFJhdGlvO3JldHVybiB0aGlzLnBpeGVsUmF0aW89KHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfHwxKS8ocy53ZWJraXRCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHxzLm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fHMubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHxzLm9CYWNraW5nU3RvcmVQaXhlbFJhdGlvfHxzLmJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fDEpLHQhPXRoaXMub3B0aW9ucy53aWR0aHx8ZSE9dGhpcy5vcHRpb25zLmhlaWdodHx8dGhpcy5mcmFtZS5zdHlsZS53aWR0aCE9dHx8dGhpcy5mcmFtZS5zdHlsZS5oZWlnaHQhPWU/KHRoaXMuX2dldENhbWVyYVN0YXRlKHIpLHRoaXMuZnJhbWUuc3R5bGUud2lkdGg9dCx0aGlzLmZyYW1lLnN0eWxlLmhlaWdodD1lLHRoaXMuZnJhbWUuY2FudmFzLnN0eWxlLndpZHRoPSIxMDAlIix0aGlzLmZyYW1lLmNhbnZhcy5zdHlsZS5oZWlnaHQ9IjEwMCUiLHRoaXMuZnJhbWUuY2FudmFzLndpZHRoPU1hdGgucm91bmQodGhpcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgqdGhpcy5waXhlbFJhdGlvKSx0aGlzLmZyYW1lLmNhbnZhcy5oZWlnaHQ9TWF0aC5yb3VuZCh0aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRIZWlnaHQqdGhpcy5waXhlbFJhdGlvKSx0aGlzLm9wdGlvbnMud2lkdGg9dCx0aGlzLm9wdGlvbnMuaGVpZ2h0PWUsdGhpcy5jYW52YXNWaWV3Q2VudGVyPXt4Oi41KnRoaXMuZnJhbWUuY2xpZW50V2lkdGgseTouNSp0aGlzLmZyYW1lLmNsaWVudEhlaWdodH0saT0hMCk6KHRoaXMuZnJhbWUuY2FudmFzLndpZHRoPT1NYXRoLnJvdW5kKHRoaXMuZnJhbWUuY2FudmFzLmNsaWVudFdpZHRoKnRoaXMucGl4ZWxSYXRpbykmJnRoaXMuZnJhbWUuY2FudmFzLmhlaWdodD09TWF0aC5yb3VuZCh0aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRIZWlnaHQqdGhpcy5waXhlbFJhdGlvKXx8dGhpcy5fZ2V0Q2FtZXJhU3RhdGUociksdGhpcy5mcmFtZS5jYW52YXMud2lkdGghPU1hdGgucm91bmQodGhpcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgqdGhpcy5waXhlbFJhdGlvKSYmKHRoaXMuZnJhbWUuY2FudmFzLndpZHRoPU1hdGgucm91bmQodGhpcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgqdGhpcy5waXhlbFJhdGlvKSxpPSEwKSx0aGlzLmZyYW1lLmNhbnZhcy5oZWlnaHQhPU1hdGgucm91bmQodGhpcy5mcmFtZS5jYW52YXMuY2xpZW50SGVpZ2h0KnRoaXMucGl4ZWxSYXRpbykmJih0aGlzLmZyYW1lLmNhbnZhcy5oZWlnaHQ9TWF0aC5yb3VuZCh0aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRIZWlnaHQqdGhpcy5waXhlbFJhdGlvKSxpPSEwKSksaT09PSEwJiYodGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgicmVzaXplIix7d2lkdGg6TWF0aC5yb3VuZCh0aGlzLmZyYW1lLmNhbnZhcy53aWR0aC90aGlzLnBpeGVsUmF0aW8pLGhlaWdodDpNYXRoLnJvdW5kKHRoaXMuZnJhbWUuY2FudmFzLmhlaWdodC90aGlzLnBpeGVsUmF0aW8pLG9sZFdpZHRoOk1hdGgucm91bmQoby90aGlzLnBpeGVsUmF0aW8pLG9sZEhlaWdodDpNYXRoLnJvdW5kKG4vdGhpcy5waXhlbFJhdGlvKX0pLHRoaXMuX3NldENhbWVyYVN0YXRlKCkpLHRoaXMuaW5pdGlhbGl6ZWQ9ITAsaX19LHtrZXk6Il9YY29udmVydERPTXRvQ2FudmFzIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi54KS90aGlzLmJvZHkudmlldy5zY2FsZX19LHtrZXk6Il9YY29udmVydENhbnZhc1RvRE9NIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdCp0aGlzLmJvZHkudmlldy5zY2FsZSt0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi54fX0se2tleToiX1ljb252ZXJ0RE9NdG9DYW52YXMiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybih0LXRoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uLnkpL3RoaXMuYm9keS52aWV3LnNjYWxlfX0se2tleToiX1ljb252ZXJ0Q2FudmFzVG9ET00iLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuYm9keS52aWV3LnNjYWxlK3RoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uLnl9fSx7a2V5OiJjYW52YXNUb0RPTSIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJue3g6dGhpcy5fWGNvbnZlcnRDYW52YXNUb0RPTSh0LngpLHk6dGhpcy5fWWNvbnZlcnRDYW52YXNUb0RPTSh0LnkpfX19LHtrZXk6IkRPTXRvQ2FudmFzIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm57eDp0aGlzLl9YY29udmVydERPTXRvQ2FudmFzKHQueCkseTp0aGlzLl9ZY29udmVydERPTXRvQ2FudmFzKHQueSl9fX1dKSx0fSgpO2UuZGVmYXVsdD1ofSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG8pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG8mJnQoZSxvKSxlfX0oKSxyPWkoMTA1KSxhPW8ociksaD1pKDEpLGQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsaSl7dmFyIG89dGhpcztuKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5jYW52YXM9aSx0aGlzLmFuaW1hdGlvblNwZWVkPTEvdGhpcy5yZW5kZXJSZWZyZXNoUmF0ZSx0aGlzLmFuaW1hdGlvbkVhc2luZ0Z1bmN0aW9uPSJlYXNlSW5PdXRRdWludCIsdGhpcy5lYXNpbmdUaW1lPTAsdGhpcy5zb3VyY2VTY2FsZT0wLHRoaXMudGFyZ2V0U2NhbGU9MCx0aGlzLnNvdXJjZVRyYW5zbGF0aW9uPTAsdGhpcy50YXJnZXRUcmFuc2xhdGlvbj0wLHRoaXMubG9ja2VkT25Ob2RlSWQ9dm9pZCAwLHRoaXMubG9ja2VkT25Ob2RlT2Zmc2V0PXZvaWQgMCx0aGlzLnRvdWNoVGltZT0wLHRoaXMudmlld0Z1bmN0aW9uPXZvaWQgMCx0aGlzLmJvZHkuZW1pdHRlci5vbigiZml0Iix0aGlzLmZpdC5iaW5kKHRoaXMpKSx0aGlzLmJvZHkuZW1pdHRlci5vbigiYW5pbWF0aW9uRmluaXNoZWQiLGZ1bmN0aW9uKCl7by5ib2R5LmVtaXR0ZXIuZW1pdCgiX3N0b3BSZW5kZXJpbmciKX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJ1bmxvY2tOb2RlIix0aGlzLnJlbGVhc2VOb2RlLmJpbmQodGhpcykpfXJldHVybiBzKHQsW3trZXk6InNldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O3RoaXMub3B0aW9ucz10fX0se2tleToiZml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7bm9kZXM6W119LGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSxpPXZvaWQgMCxvPXZvaWQgMDtpZih2b2lkIDAhPT10Lm5vZGVzJiYwIT09dC5ub2Rlcy5sZW5ndGh8fCh0Lm5vZGVzPXRoaXMuYm9keS5ub2RlSW5kaWNlcyksZT09PSEwKXt2YXIgbj0wO2Zvcih2YXIgcyBpbiB0aGlzLmJvZHkubm9kZXMpaWYodGhpcy5ib2R5Lm5vZGVzLmhhc093blByb3BlcnR5KHMpKXt2YXIgcj10aGlzLmJvZHkubm9kZXNbc107ci5wcmVkZWZpbmVkUG9zaXRpb249PT0hMCYmKG4rPTEpfWlmKG4+LjUqdGhpcy5ib2R5Lm5vZGVJbmRpY2VzLmxlbmd0aClyZXR1cm4gdm9pZCB0aGlzLmZpdCh0LCExKTtpPWEuZGVmYXVsdC5nZXRSYW5nZSh0aGlzLmJvZHkubm9kZXMsdC5ub2Rlcyk7dmFyIGg9dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLmxlbmd0aDtvPTEyLjY2Mi8oaCs3LjQxNDcpKy4wOTY0ODIyO3ZhciBkPU1hdGgubWluKHRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aC82MDAsdGhpcy5jYW52YXMuZnJhbWUuY2FudmFzLmNsaWVudEhlaWdodC82MDApO28qPWR9ZWxzZXt0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfcmVzaXplTm9kZXMiKSxpPWEuZGVmYXVsdC5nZXRSYW5nZSh0aGlzLmJvZHkubm9kZXMsdC5ub2Rlcyk7dmFyIGw9MS4xKk1hdGguYWJzKGkubWF4WC1pLm1pblgpLGM9MS4xKk1hdGguYWJzKGkubWF4WS1pLm1pblkpLHU9dGhpcy5jYW52YXMuZnJhbWUuY2FudmFzLmNsaWVudFdpZHRoL2wscD10aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMuY2xpZW50SGVpZ2h0L2M7bz11PD1wP3U6cH1vPjE/bz0xOjA9PT1vJiYobz0xKTt2YXIgZj1hLmRlZmF1bHQuZmluZENlbnRlcihpKSxtPXtwb3NpdGlvbjpmLHNjYWxlOm8sYW5pbWF0aW9uOnQuYW5pbWF0aW9ufTt0aGlzLm1vdmVUbyhtKX19LHtrZXk6ImZvY3VzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYodm9pZCAwIT09dGhpcy5ib2R5Lm5vZGVzW3RdKXt2YXIgaT17eDp0aGlzLmJvZHkubm9kZXNbdF0ueCx5OnRoaXMuYm9keS5ub2Rlc1t0XS55fTtlLnBvc2l0aW9uPWksZS5sb2NrZWRPbk5vZGU9dCx0aGlzLm1vdmVUbyhlKX1lbHNlIGNvbnNvbGUubG9nKCJOb2RlOiAiK3QrIiBjYW5ub3QgYmUgZm91bmQuIil9fSx7a2V5OiJtb3ZlVG8iLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10P3ZvaWQodD17fSk6KHZvaWQgMD09PXQub2Zmc2V0JiYodC5vZmZzZXQ9e3g6MCx5OjB9KSx2b2lkIDA9PT10Lm9mZnNldC54JiYodC5vZmZzZXQueD0wKSx2b2lkIDA9PT10Lm9mZnNldC55JiYodC5vZmZzZXQueT0wKSx2b2lkIDA9PT10LnNjYWxlJiYodC5zY2FsZT10aGlzLmJvZHkudmlldy5zY2FsZSksdm9pZCAwPT09dC5wb3NpdGlvbiYmKHQucG9zaXRpb249dGhpcy5nZXRWaWV3UG9zaXRpb24oKSksdm9pZCAwPT09dC5hbmltYXRpb24mJih0LmFuaW1hdGlvbj17ZHVyYXRpb246MH0pLHQuYW5pbWF0aW9uPT09ITEmJih0LmFuaW1hdGlvbj17ZHVyYXRpb246MH0pLHQuYW5pbWF0aW9uPT09ITAmJih0LmFuaW1hdGlvbj17fSksdm9pZCAwPT09dC5hbmltYXRpb24uZHVyYXRpb24mJih0LmFuaW1hdGlvbi5kdXJhdGlvbj0xZTMpLHZvaWQgMD09PXQuYW5pbWF0aW9uLmVhc2luZ0Z1bmN0aW9uJiYodC5hbmltYXRpb24uZWFzaW5nRnVuY3Rpb249ImVhc2VJbk91dFF1YWQiKSx2b2lkIHRoaXMuYW5pbWF0ZVZpZXcodCkpfX0se2tleToiYW5pbWF0ZVZpZXciLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQpe3RoaXMuYW5pbWF0aW9uRWFzaW5nRnVuY3Rpb249dC5hbmltYXRpb24uZWFzaW5nRnVuY3Rpb24sdGhpcy5yZWxlYXNlTm9kZSgpLHQubG9ja2VkPT09ITAmJih0aGlzLmxvY2tlZE9uTm9kZUlkPXQubG9ja2VkT25Ob2RlLHRoaXMubG9ja2VkT25Ob2RlT2Zmc2V0PXQub2Zmc2V0KSwwIT10aGlzLmVhc2luZ1RpbWUmJnRoaXMuX3RyYW5zaXRpb25SZWRyYXcoITApLHRoaXMuc291cmNlU2NhbGU9dGhpcy5ib2R5LnZpZXcuc2NhbGUsdGhpcy5zb3VyY2VUcmFuc2xhdGlvbj10aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbix0aGlzLnRhcmdldFNjYWxlPXQuc2NhbGUsdGhpcy5ib2R5LnZpZXcuc2NhbGU9dGhpcy50YXJnZXRTY2FsZTt2YXIgZT10aGlzLmNhbnZhcy5ET010b0NhbnZhcyh7eDouNSp0aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgseTouNSp0aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMuY2xpZW50SGVpZ2h0fSksaT17eDplLngtdC5wb3NpdGlvbi54LHk6ZS55LXQucG9zaXRpb24ueX07dGhpcy50YXJnZXRUcmFuc2xhdGlvbj17eDp0aGlzLnNvdXJjZVRyYW5zbGF0aW9uLngraS54KnRoaXMudGFyZ2V0U2NhbGUrdC5vZmZzZXQueCx5OnRoaXMuc291cmNlVHJhbnNsYXRpb24ueStpLnkqdGhpcy50YXJnZXRTY2FsZSt0Lm9mZnNldC55fSwwPT09dC5hbmltYXRpb24uZHVyYXRpb24/dm9pZCAwIT10aGlzLmxvY2tlZE9uTm9kZUlkPyh0aGlzLnZpZXdGdW5jdGlvbj10aGlzLl9sb2NrZWRSZWRyYXcuYmluZCh0aGlzKSx0aGlzLmJvZHkuZW1pdHRlci5vbigiaW5pdFJlZHJhdyIsdGhpcy52aWV3RnVuY3Rpb24pKToodGhpcy5ib2R5LnZpZXcuc2NhbGU9dGhpcy50YXJnZXRTY2FsZSx0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbj10aGlzLnRhcmdldFRyYW5zbGF0aW9uLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9yZXF1ZXN0UmVkcmF3IikpOih0aGlzLmFuaW1hdGlvblNwZWVkPTEvKDYwKnQuYW5pbWF0aW9uLmR1cmF0aW9uKi4wMDEpfHwxLzYwLHRoaXMuYW5pbWF0aW9uRWFzaW5nRnVuY3Rpb249dC5hbmltYXRpb24uZWFzaW5nRnVuY3Rpb24sdGhpcy52aWV3RnVuY3Rpb249dGhpcy5fdHJhbnNpdGlvblJlZHJhdy5iaW5kKHRoaXMpLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJpbml0UmVkcmF3Iix0aGlzLnZpZXdGdW5jdGlvbiksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX3N0YXJ0UmVuZGVyaW5nIikpfX19LHtrZXk6Il9sb2NrZWRSZWRyYXciLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9e3g6dGhpcy5ib2R5Lm5vZGVzW3RoaXMubG9ja2VkT25Ob2RlSWRdLngseTp0aGlzLmJvZHkubm9kZXNbdGhpcy5sb2NrZWRPbk5vZGVJZF0ueX0sZT10aGlzLmNhbnZhcy5ET010b0NhbnZhcyh7eDouNSp0aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgseTouNSp0aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMuY2xpZW50SGVpZ2h0fSksaT17eDplLngtdC54LHk6ZS55LXQueX0sbz10aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbixuPXt4Om8ueCtpLngqdGhpcy5ib2R5LnZpZXcuc2NhbGUrdGhpcy5sb2NrZWRPbk5vZGVPZmZzZXQueCx5Om8ueStpLnkqdGhpcy5ib2R5LnZpZXcuc2NhbGUrdGhpcy5sb2NrZWRPbk5vZGVPZmZzZXQueX07dGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb249bn19LHtrZXk6InJlbGVhc2VOb2RlIix2YWx1ZTpmdW5jdGlvbigpe3ZvaWQgMCE9PXRoaXMubG9ja2VkT25Ob2RlSWQmJnZvaWQgMCE9PXRoaXMudmlld0Z1bmN0aW9uJiYodGhpcy5ib2R5LmVtaXR0ZXIub2ZmKCJpbml0UmVkcmF3Iix0aGlzLnZpZXdGdW5jdGlvbiksdGhpcy5sb2NrZWRPbk5vZGVJZD12b2lkIDAsdGhpcy5sb2NrZWRPbk5vZGVPZmZzZXQ9dm9pZCAwKX19LHtrZXk6Il90cmFuc2l0aW9uUmVkcmF3Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF07dGhpcy5lYXNpbmdUaW1lKz10aGlzLmFuaW1hdGlvblNwZWVkLHRoaXMuZWFzaW5nVGltZT10PT09ITA/MTp0aGlzLmVhc2luZ1RpbWU7dmFyIGU9aC5lYXNpbmdGdW5jdGlvbnNbdGhpcy5hbmltYXRpb25FYXNpbmdGdW5jdGlvbl0odGhpcy5lYXNpbmdUaW1lKTt0aGlzLmJvZHkudmlldy5zY2FsZT10aGlzLnNvdXJjZVNjYWxlKyh0aGlzLnRhcmdldFNjYWxlLXRoaXMuc291cmNlU2NhbGUpKmUsdGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb249e3g6dGhpcy5zb3VyY2VUcmFuc2xhdGlvbi54Kyh0aGlzLnRhcmdldFRyYW5zbGF0aW9uLngtdGhpcy5zb3VyY2VUcmFuc2xhdGlvbi54KSplLHk6dGhpcy5zb3VyY2VUcmFuc2xhdGlvbi55Kyh0aGlzLnRhcmdldFRyYW5zbGF0aW9uLnktdGhpcy5zb3VyY2VUcmFuc2xhdGlvbi55KSplfSx0aGlzLmVhc2luZ1RpbWU+PTEmJih0aGlzLmJvZHkuZW1pdHRlci5vZmYoImluaXRSZWRyYXciLHRoaXMudmlld0Z1bmN0aW9uKSx0aGlzLmVhc2luZ1RpbWU9MCx2b2lkIDAhPXRoaXMubG9ja2VkT25Ob2RlSWQmJih0aGlzLnZpZXdGdW5jdGlvbj10aGlzLl9sb2NrZWRSZWRyYXcuYmluZCh0aGlzKSx0aGlzLmJvZHkuZW1pdHRlci5vbigiaW5pdFJlZHJhdyIsdGhpcy52aWV3RnVuY3Rpb24pKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJhbmltYXRpb25GaW5pc2hlZCIpKX19LHtrZXk6ImdldFNjYWxlIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJvZHkudmlldy5zY2FsZX19LHtrZXk6ImdldFZpZXdQb3NpdGlvbiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW52YXMuRE9NdG9DYW52YXMoe3g6LjUqdGhpcy5jYW52YXMuZnJhbWUuY2FudmFzLmNsaWVudFdpZHRoLHk6LjUqdGhpcy5jYW52YXMuZnJhbWUuY2FudmFzLmNsaWVudEhlaWdodH0pfX1dKSx0fSgpO2UuZGVmYXVsdD1kfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG8pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG8mJnQoZSxvKSxlfX0oKSxyPWkoMTExKSxhPW8ociksaD1pKDExMiksZD1vKGgpLGw9aSgxKSxjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGksbyl7bih0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMuY2FudmFzPWksdGhpcy5zZWxlY3Rpb25IYW5kbGVyPW8sdGhpcy5uYXZpZ2F0aW9uSGFuZGxlcj1uZXcgYS5kZWZhdWx0KGUsaSksdGhpcy5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uVGFwPXRoaXMub25UYXAuYmluZCh0aGlzKSx0aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnMub25Ub3VjaD10aGlzLm9uVG91Y2guYmluZCh0aGlzKSx0aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnMub25Eb3VibGVUYXA9dGhpcy5vbkRvdWJsZVRhcC5iaW5kKHRoaXMpLHRoaXMuYm9keS5ldmVudExpc3RlbmVycy5vbkhvbGQ9dGhpcy5vbkhvbGQuYmluZCh0aGlzKSx0aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnMub25EcmFnU3RhcnQ9dGhpcy5vbkRyYWdTdGFydC5iaW5kKHRoaXMpLHRoaXMuYm9keS5ldmVudExpc3RlbmVycy5vbkRyYWc9dGhpcy5vbkRyYWcuYmluZCh0aGlzKSx0aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnMub25EcmFnRW5kPXRoaXMub25EcmFnRW5kLmJpbmQodGhpcyksdGhpcy5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uTW91c2VXaGVlbD10aGlzLm9uTW91c2VXaGVlbC5iaW5kKHRoaXMpLHRoaXMuYm9keS5ldmVudExpc3RlbmVycy5vblBpbmNoPXRoaXMub25QaW5jaC5iaW5kKHRoaXMpLHRoaXMuYm9keS5ldmVudExpc3RlbmVycy5vbk1vdXNlTW92ZT10aGlzLm9uTW91c2VNb3ZlLmJpbmQodGhpcyksdGhpcy5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uUmVsZWFzZT10aGlzLm9uUmVsZWFzZS5iaW5kKHRoaXMpLHRoaXMuYm9keS5ldmVudExpc3RlbmVycy5vbkNvbnRleHQ9dGhpcy5vbkNvbnRleHQuYmluZCh0aGlzKSx0aGlzLnRvdWNoVGltZT0wLHRoaXMuZHJhZz17fSx0aGlzLnBpbmNoPXt9LHRoaXMucG9wdXA9dm9pZCAwLHRoaXMucG9wdXBPYmo9dm9pZCAwLHRoaXMucG9wdXBUaW1lcj12b2lkIDAsdGhpcy5ib2R5LmZ1bmN0aW9ucy5nZXRQb2ludGVyPXRoaXMuZ2V0UG9pbnRlci5iaW5kKHRoaXMpLHRoaXMub3B0aW9ucz17fSx0aGlzLmRlZmF1bHRPcHRpb25zPXtkcmFnTm9kZXM6ITAsZHJhZ1ZpZXc6ITAsaG92ZXI6ITEsa2V5Ym9hcmQ6e2VuYWJsZWQ6ITEsc3BlZWQ6e3g6MTAseToxMCx6b29tOi4wMn0sYmluZFRvV2luZG93OiEwfSxuYXZpZ2F0aW9uQnV0dG9uczohMSx0b29sdGlwRGVsYXk6MzAwLHpvb21WaWV3OiEwfSxsLmV4dGVuZCh0aGlzLm9wdGlvbnMsdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5iaW5kRXZlbnRMaXN0ZW5lcnMoKX1yZXR1cm4gcyh0LFt7a2V5OiJiaW5kRXZlbnRMaXN0ZW5lcnMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmJvZHkuZW1pdHRlci5vbigiZGVzdHJveSIsZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodC5wb3B1cFRpbWVyKSxkZWxldGUgdC5ib2R5LmZ1bmN0aW9ucy5nZXRQb2ludGVyfSl9fSx7a2V5OiJzZXRPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0KXtpZih2b2lkIDAhPT10KXt2YXIgZT1bImhpZGVFZGdlc09uRHJhZyIsImhpZGVOb2Rlc09uRHJhZyIsImtleWJvYXJkIiwibXVsdGlzZWxlY3QiLCJzZWxlY3RhYmxlIiwic2VsZWN0Q29ubmVjdGVkRWRnZXMiXTtsLnNlbGVjdGl2ZU5vdERlZXBFeHRlbmQoZSx0aGlzLm9wdGlvbnMsdCksbC5tZXJnZU9wdGlvbnModGhpcy5vcHRpb25zLHQsImtleWJvYXJkIiksdC50b29sdGlwJiYobC5leHRlbmQodGhpcy5vcHRpb25zLnRvb2x0aXAsdC50b29sdGlwKSx0LnRvb2x0aXAuY29sb3ImJih0aGlzLm9wdGlvbnMudG9vbHRpcC5jb2xvcj1sLnBhcnNlQ29sb3IodC50b29sdGlwLmNvbG9yKSkpfXRoaXMubmF2aWdhdGlvbkhhbmRsZXIuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMpfX0se2tleToiZ2V0UG9pbnRlciIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJue3g6dC54LWwuZ2V0QWJzb2x1dGVMZWZ0KHRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcykseTp0LnktbC5nZXRBYnNvbHV0ZVRvcCh0aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMpfX19LHtrZXk6Im9uVG91Y2giLHZhbHVlOmZ1bmN0aW9uKHQpeyhuZXcgRGF0ZSkudmFsdWVPZigpLXRoaXMudG91Y2hUaW1lPjUwJiYodGhpcy5kcmFnLnBvaW50ZXI9dGhpcy5nZXRQb2ludGVyKHQuY2VudGVyKSx0aGlzLmRyYWcucGluY2hlZD0hMSx0aGlzLnBpbmNoLnNjYWxlPXRoaXMuYm9keS52aWV3LnNjYWxlLHRoaXMudG91Y2hUaW1lPShuZXcgRGF0ZSkudmFsdWVPZigpKX19LHtrZXk6Im9uVGFwIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldFBvaW50ZXIodC5jZW50ZXIpLGk9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLm9wdGlvbnMubXVsdGlzZWxlY3QmJih0LmNoYW5nZWRQb2ludGVyc1swXS5jdHJsS2V5fHx0LmNoYW5nZWRQb2ludGVyc1swXS5tZXRhS2V5KTt0aGlzLmNoZWNrU2VsZWN0aW9uQ2hhbmdlcyhlLHQsaSksdGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoImNsaWNrIix0LGUpfX0se2tleToib25Eb3VibGVUYXAiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0UG9pbnRlcih0LmNlbnRlcik7dGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoImRvdWJsZUNsaWNrIix0LGUpfX0se2tleToib25Ib2xkIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldFBvaW50ZXIodC5jZW50ZXIpLGk9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLm9wdGlvbnMubXVsdGlzZWxlY3Q7dGhpcy5jaGVja1NlbGVjdGlvbkNoYW5nZXMoZSx0LGkpLHRoaXMuc2VsZWN0aW9uSGFuZGxlci5fZ2VuZXJhdGVDbGlja0V2ZW50KCJjbGljayIsdCxlKSx0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudCgiaG9sZCIsdCxlKX19LHtrZXk6Im9uUmVsZWFzZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoKG5ldyBEYXRlKS52YWx1ZU9mKCktdGhpcy50b3VjaFRpbWU+MTApe3ZhciBlPXRoaXMuZ2V0UG9pbnRlcih0LmNlbnRlcik7dGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoInJlbGVhc2UiLHQsZSksdGhpcy50b3VjaFRpbWU9KG5ldyBEYXRlKS52YWx1ZU9mKCl9fX0se2tleToib25Db250ZXh0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldFBvaW50ZXIoe3g6dC5jbGllbnRYLHk6dC5jbGllbnRZfSk7dGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoIm9uY29udGV4dCIsdCxlKX19LHtrZXk6ImNoZWNrU2VsZWN0aW9uQ2hhbmdlcyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdLG89dGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZXRTZWxlY3RlZEVkZ2VDb3VudCgpLG49dGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZXRTZWxlY3RlZE5vZGVDb3VudCgpLHM9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldFNlbGVjdGlvbigpLHI9dm9pZCAwO3I9aT09PSEwP3RoaXMuc2VsZWN0aW9uSGFuZGxlci5zZWxlY3RBZGRpdGlvbmFsT25Qb2ludCh0KTp0aGlzLnNlbGVjdGlvbkhhbmRsZXIuc2VsZWN0T25Qb2ludCh0KTt2YXIgYT10aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dldFNlbGVjdGVkRWRnZUNvdW50KCksaD10aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dldFNlbGVjdGVkTm9kZUNvdW50KCksZD10aGlzLnNlbGVjdGlvbkhhbmRsZXIuZ2V0U2VsZWN0aW9uKCksbD10aGlzLl9kZXRlcm1pbmVJZkRpZmZlcmVudChzLGQpLGM9bC5ub2Rlc0NoYW5nZWQsdT1sLmVkZ2VzQ2hhbmdlZCxwPSExO2gtbj4wPyh0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudCgic2VsZWN0Tm9kZSIsZSx0KSxyPSEwLHA9ITApOmM9PT0hMCYmaD4wPyh0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudCgiZGVzZWxlY3ROb2RlIixlLHQscyksdGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoInNlbGVjdE5vZGUiLGUsdCkscD0hMCxyPSEwKTpoLW48MCYmKHRoaXMuc2VsZWN0aW9uSGFuZGxlci5fZ2VuZXJhdGVDbGlja0V2ZW50KCJkZXNlbGVjdE5vZGUiLGUsdCxzKSxyPSEwKSxhLW8+MCYmcD09PSExPyh0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudCgic2VsZWN0RWRnZSIsZSx0KSxyPSEwKTphPjAmJnU9PT0hMD8odGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoImRlc2VsZWN0RWRnZSIsZSx0LHMpLHRoaXMuc2VsZWN0aW9uSGFuZGxlci5fZ2VuZXJhdGVDbGlja0V2ZW50KCJzZWxlY3RFZGdlIixlLHQpLHI9ITApOmEtbzwwJiYodGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoImRlc2VsZWN0RWRnZSIsZSx0LHMpLHI9ITApLHI9PT0hMCYmdGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoInNlbGVjdCIsZSx0KX19LHtrZXk6Il9kZXRlcm1pbmVJZkRpZmZlcmVudCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9ITEsbz0hMSxuPTA7bjx0Lm5vZGVzLmxlbmd0aDtuKyspZS5ub2Rlcy5pbmRleE9mKHQubm9kZXNbbl0pPT09LTEmJihpPSEwKTtmb3IodmFyIHM9MDtzPGUubm9kZXMubGVuZ3RoO3MrKyl0Lm5vZGVzLmluZGV4T2YodC5ub2Rlc1tzXSk9PT0tMSYmKGk9ITApO2Zvcih2YXIgcj0wO3I8dC5lZGdlcy5sZW5ndGg7cisrKWUuZWRnZXMuaW5kZXhPZih0LmVkZ2VzW3JdKT09PS0xJiYobz0hMCk7Zm9yKHZhciBhPTA7YTxlLmVkZ2VzLmxlbmd0aDthKyspdC5lZGdlcy5pbmRleE9mKHQuZWRnZXNbYV0pPT09LTEmJihvPSEwKTtyZXR1cm57bm9kZXNDaGFuZ2VkOmksZWRnZXNDaGFuZ2VkOm99fX0se2tleToib25EcmFnU3RhcnQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZvaWQgMD09PXRoaXMuZHJhZy5wb2ludGVyJiZ0aGlzLm9uVG91Y2godCk7dmFyIGU9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldE5vZGVBdCh0aGlzLmRyYWcucG9pbnRlcik7aWYodGhpcy5kcmFnLmRyYWdnaW5nPSEwLHRoaXMuZHJhZy5zZWxlY3Rpb249W10sdGhpcy5kcmFnLnRyYW5zbGF0aW9uPWwuZXh0ZW5kKHt9LHRoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uKSx0aGlzLmRyYWcubm9kZUlkPXZvaWQgMCx2b2lkIDAhPT1lJiZ0aGlzLm9wdGlvbnMuZHJhZ05vZGVzPT09ITApe3RoaXMuZHJhZy5ub2RlSWQ9ZS5pZCxlLmlzU2VsZWN0ZWQoKT09PSExJiYodGhpcy5zZWxlY3Rpb25IYW5kbGVyLnVuc2VsZWN0QWxsKCksdGhpcy5zZWxlY3Rpb25IYW5kbGVyLnNlbGVjdE9iamVjdChlKSksdGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoImRyYWdTdGFydCIsdCx0aGlzLmRyYWcucG9pbnRlcik7dmFyIGk9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLnNlbGVjdGlvbk9iai5ub2Rlcztmb3IodmFyIG8gaW4gaSlpZihpLmhhc093blByb3BlcnR5KG8pKXt2YXIgbj1pW29dLHM9e2lkOm4uaWQsbm9kZTpuLHg6bi54LHk6bi55LHhGaXhlZDpuLm9wdGlvbnMuZml4ZWQueCx5Rml4ZWQ6bi5vcHRpb25zLmZpeGVkLnl9O24ub3B0aW9ucy5maXhlZC54PSEwLG4ub3B0aW9ucy5maXhlZC55PSEwLHRoaXMuZHJhZy5zZWxlY3Rpb24ucHVzaChzKX19ZWxzZSB0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudCgiZHJhZ1N0YXJ0Iix0LHRoaXMuZHJhZy5wb2ludGVyLHZvaWQgMCwhMCl9fSx7a2V5OiJvbkRyYWciLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYodGhpcy5kcmFnLnBpbmNoZWQhPT0hMCl7dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgidW5sb2NrTm9kZSIpO3ZhciBpPXRoaXMuZ2V0UG9pbnRlcih0LmNlbnRlciksbz10aGlzLmRyYWcuc2VsZWN0aW9uO2lmKG8mJm8ubGVuZ3RoJiZ0aGlzLm9wdGlvbnMuZHJhZ05vZGVzPT09ITApIWZ1bmN0aW9uKCl7ZS5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoImRyYWdnaW5nIix0LGkpO3ZhciBuPWkueC1lLmRyYWcucG9pbnRlci54LHM9aS55LWUuZHJhZy5wb2ludGVyLnk7by5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBpPXQubm9kZTt0LnhGaXhlZD09PSExJiYoaS54PWUuY2FudmFzLl9YY29udmVydERPTXRvQ2FudmFzKGUuY2FudmFzLl9YY29udmVydENhbnZhc1RvRE9NKHQueCkrbikpLHQueUZpeGVkPT09ITEmJihpLnk9ZS5jYW52YXMuX1ljb252ZXJ0RE9NdG9DYW52YXMoZS5jYW52YXMuX1ljb252ZXJ0Q2FudmFzVG9ET00odC55KStzKSl9KSxlLmJvZHkuZW1pdHRlci5lbWl0KCJzdGFydFNpbXVsYXRpb24iKX0oKTtlbHNlIGlmKHRoaXMub3B0aW9ucy5kcmFnVmlldz09PSEwKXtpZih0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudCgiZHJhZ2dpbmciLHQsaSx2b2lkIDAsITApLHZvaWQgMD09PXRoaXMuZHJhZy5wb2ludGVyKXJldHVybiB2b2lkIHRoaXMub25EcmFnU3RhcnQodCk7dmFyIG49aS54LXRoaXMuZHJhZy5wb2ludGVyLngscz1pLnktdGhpcy5kcmFnLnBvaW50ZXIueTt0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbj17eDp0aGlzLmRyYWcudHJhbnNsYXRpb24ueCtuLHk6dGhpcy5kcmFnLnRyYW5zbGF0aW9uLnkrc30sdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX3JlZHJhdyIpfX19fSx7a2V5OiJvbkRyYWdFbmQiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuZHJhZy5kcmFnZ2luZz0hMTt2YXIgZT10aGlzLmRyYWcuc2VsZWN0aW9uO2UmJmUubGVuZ3RoPyhlLmZvckVhY2goZnVuY3Rpb24odCl7dC5ub2RlLm9wdGlvbnMuZml4ZWQueD10LnhGaXhlZCx0Lm5vZGUub3B0aW9ucy5maXhlZC55PXQueUZpeGVkfSksdGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoImRyYWdFbmQiLHQsdGhpcy5nZXRQb2ludGVyKHQuY2VudGVyKSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgic3RhcnRTaW11bGF0aW9uIikpOih0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudCgiZHJhZ0VuZCIsdCx0aGlzLmdldFBvaW50ZXIodC5jZW50ZXIpLHZvaWQgMCwhMCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX3JlcXVlc3RSZWRyYXciKSl9fSx7a2V5OiJvblBpbmNoIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldFBvaW50ZXIodC5jZW50ZXIpO3RoaXMuZHJhZy5waW5jaGVkPSEwLHZvaWQgMD09PXRoaXMucGluY2guc2NhbGUmJih0aGlzLnBpbmNoLnNjYWxlPTEpO3ZhciBpPXRoaXMucGluY2guc2NhbGUqdC5zY2FsZTt0aGlzLnpvb20oaSxlKX19LHtrZXk6Inpvb20iLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYodGhpcy5vcHRpb25zLnpvb21WaWV3PT09ITApe3ZhciBpPXRoaXMuYm9keS52aWV3LnNjYWxlO3Q8MWUtNSYmKHQ9MWUtNSksdD4xMCYmKHQ9MTApO3ZhciBvPXZvaWQgMDt2b2lkIDAhPT10aGlzLmRyYWcmJnRoaXMuZHJhZy5kcmFnZ2luZz09PSEwJiYobz10aGlzLmNhbnZhcy5ET010b0NhbnZhcyh0aGlzLmRyYWcucG9pbnRlcikpO3ZhciBuPXRoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uLHM9dC9pLHI9KDEtcykqZS54K24ueCpzLGE9KDEtcykqZS55K24ueSpzO2lmKHRoaXMuYm9keS52aWV3LnNjYWxlPXQsdGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb249e3g6cix5OmF9LHZvaWQgMCE9byl7dmFyIGg9dGhpcy5jYW52YXMuY2FudmFzVG9ET00obyk7dGhpcy5kcmFnLnBvaW50ZXIueD1oLngsdGhpcy5kcmFnLnBvaW50ZXIueT1oLnl9dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX3JlcXVlc3RSZWRyYXciKSxpPHQ/dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiem9vbSIse2RpcmVjdGlvbjoiKyIsc2NhbGU6dGhpcy5ib2R5LnZpZXcuc2NhbGV9KTp0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJ6b29tIix7ZGlyZWN0aW9uOiItIixzY2FsZTp0aGlzLmJvZHkudmlldy5zY2FsZX0pfX19LHtrZXk6Im9uTW91c2VXaGVlbCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodGhpcy5vcHRpb25zLnpvb21WaWV3PT09ITApe3ZhciBlPTA7aWYodC53aGVlbERlbHRhP2U9dC53aGVlbERlbHRhLzEyMDp0LmRldGFpbCYmKGU9LXQuZGV0YWlsLzMpLDAhPT1lKXt2YXIgaT10aGlzLmJvZHkudmlldy5zY2FsZSxvPWUvMTA7ZTwwJiYoby89MS1vKSxpKj0xK287dmFyIG49dGhpcy5nZXRQb2ludGVyKHt4OnQuY2xpZW50WCx5OnQuY2xpZW50WX0pO3RoaXMuem9vbShpLG4pfXQucHJldmVudERlZmF1bHQoKX19fSx7a2V5OiJvbk1vdXNlTW92ZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxpPXRoaXMuZ2V0UG9pbnRlcih7eDp0LmNsaWVudFgseTp0LmNsaWVudFl9KSxvPSExO2lmKHZvaWQgMCE9PXRoaXMucG9wdXAmJih0aGlzLnBvcHVwLmhpZGRlbj09PSExJiZ0aGlzLl9jaGVja0hpZGVQb3B1cChpKSx0aGlzLnBvcHVwLmhpZGRlbj09PSExJiYobz0hMCwKdGhpcy5wb3B1cC5zZXRQb3NpdGlvbihpLngrMyxpLnktNSksdGhpcy5wb3B1cC5zaG93KCkpKSx0aGlzLm9wdGlvbnMua2V5Ym9hcmQuYmluZFRvV2luZG93PT09ITEmJnRoaXMub3B0aW9ucy5rZXlib2FyZC5lbmFibGVkPT09ITAmJnRoaXMuY2FudmFzLmZyYW1lLmZvY3VzKCksbz09PSExJiYodm9pZCAwIT09dGhpcy5wb3B1cFRpbWVyJiYoY2xlYXJJbnRlcnZhbCh0aGlzLnBvcHVwVGltZXIpLHRoaXMucG9wdXBUaW1lcj12b2lkIDApLHRoaXMuZHJhZy5kcmFnZ2luZ3x8KHRoaXMucG9wdXBUaW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIGUuX2NoZWNrU2hvd1BvcHVwKGkpfSx0aGlzLm9wdGlvbnMudG9vbHRpcERlbGF5KSkpLHRoaXMub3B0aW9ucy5ob3Zlcj09PSEwKXt2YXIgbj10aGlzLnNlbGVjdGlvbkhhbmRsZXIuZ2V0Tm9kZUF0KGkpO3ZvaWQgMD09PW4mJihuPXRoaXMuc2VsZWN0aW9uSGFuZGxlci5nZXRFZGdlQXQoaSkpLHRoaXMuc2VsZWN0aW9uSGFuZGxlci5ob3Zlck9iamVjdChuKX19fSx7a2V5OiJfY2hlY2tTaG93UG9wdXAiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY2FudmFzLl9YY29udmVydERPTXRvQ2FudmFzKHQueCksaT10aGlzLmNhbnZhcy5fWWNvbnZlcnRET010b0NhbnZhcyh0LnkpLG89e2xlZnQ6ZSx0b3A6aSxyaWdodDplLGJvdHRvbTppfSxuPXZvaWQgMD09PXRoaXMucG9wdXBPYmo/dm9pZCAwOnRoaXMucG9wdXBPYmouaWQscz0hMSxyPSJub2RlIjtpZih2b2lkIDA9PT10aGlzLnBvcHVwT2JqKXtmb3IodmFyIGE9dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLGg9dGhpcy5ib2R5Lm5vZGVzLGw9dm9pZCAwLGM9W10sdT0wO3U8YS5sZW5ndGg7dSsrKWw9aFthW3VdXSxsLmlzT3ZlcmxhcHBpbmdXaXRoKG8pPT09ITAmJnZvaWQgMCE9PWwuZ2V0VGl0bGUoKSYmYy5wdXNoKGFbdV0pO2MubGVuZ3RoPjAmJih0aGlzLnBvcHVwT2JqPWhbY1tjLmxlbmd0aC0xXV0scz0hMCl9aWYodm9pZCAwPT09dGhpcy5wb3B1cE9iaiYmcz09PSExKXtmb3IodmFyIHA9dGhpcy5ib2R5LmVkZ2VJbmRpY2VzLGY9dGhpcy5ib2R5LmVkZ2VzLG09dm9pZCAwLHY9W10sZz0wO2c8cC5sZW5ndGg7ZysrKW09ZltwW2ddXSxtLmlzT3ZlcmxhcHBpbmdXaXRoKG8pPT09ITAmJm0uY29ubmVjdGVkPT09ITAmJnZvaWQgMCE9PW0uZ2V0VGl0bGUoKSYmdi5wdXNoKHBbZ10pO3YubGVuZ3RoPjAmJih0aGlzLnBvcHVwT2JqPWZbdlt2Lmxlbmd0aC0xXV0scj0iZWRnZSIpfXZvaWQgMCE9PXRoaXMucG9wdXBPYmo/dGhpcy5wb3B1cE9iai5pZCE9PW4mJih2b2lkIDA9PT10aGlzLnBvcHVwJiYodGhpcy5wb3B1cD1uZXcgZC5kZWZhdWx0KHRoaXMuY2FudmFzLmZyYW1lKSksdGhpcy5wb3B1cC5wb3B1cFRhcmdldFR5cGU9cix0aGlzLnBvcHVwLnBvcHVwVGFyZ2V0SWQ9dGhpcy5wb3B1cE9iai5pZCx0aGlzLnBvcHVwLnNldFBvc2l0aW9uKHQueCszLHQueS01KSx0aGlzLnBvcHVwLnNldFRleHQodGhpcy5wb3B1cE9iai5nZXRUaXRsZSgpKSx0aGlzLnBvcHVwLnNob3coKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJzaG93UG9wdXAiLHRoaXMucG9wdXBPYmouaWQpKTp2b2lkIDAhPT10aGlzLnBvcHVwJiYodGhpcy5wb3B1cC5oaWRlKCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiaGlkZVBvcHVwIikpfX0se2tleToiX2NoZWNrSGlkZVBvcHVwIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnNlbGVjdGlvbkhhbmRsZXIuX3BvaW50ZXJUb1Bvc2l0aW9uT2JqZWN0KHQpLGk9ITE7aWYoIm5vZGUiPT09dGhpcy5wb3B1cC5wb3B1cFRhcmdldFR5cGUpe2lmKHZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1t0aGlzLnBvcHVwLnBvcHVwVGFyZ2V0SWRdJiYoaT10aGlzLmJvZHkubm9kZXNbdGhpcy5wb3B1cC5wb3B1cFRhcmdldElkXS5pc092ZXJsYXBwaW5nV2l0aChlKSxpPT09ITApKXt2YXIgbz10aGlzLnNlbGVjdGlvbkhhbmRsZXIuZ2V0Tm9kZUF0KHQpO2k9by5pZD09PXRoaXMucG9wdXAucG9wdXBUYXJnZXRJZH19ZWxzZSB2b2lkIDA9PT10aGlzLnNlbGVjdGlvbkhhbmRsZXIuZ2V0Tm9kZUF0KHQpJiZ2b2lkIDAhPT10aGlzLmJvZHkuZWRnZXNbdGhpcy5wb3B1cC5wb3B1cFRhcmdldElkXSYmKGk9dGhpcy5ib2R5LmVkZ2VzW3RoaXMucG9wdXAucG9wdXBUYXJnZXRJZF0uaXNPdmVybGFwcGluZ1dpdGgoZSkpO2k9PT0hMSYmKHRoaXMucG9wdXBPYmo9dm9pZCAwLHRoaXMucG9wdXAuaGlkZSgpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoImhpZGVQb3B1cCIpKX19XSksdH0oKTtlLmRlZmF1bHQ9Y30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxvJiZ0KGUsbyksZX19KCkscz0oaSgxKSxpKDIyKSkscj1pKDMwKSxhPWkoMjUpLGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsaSl7dmFyIG49dGhpcztvKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5jYW52YXM9aSx0aGlzLmljb25zQ3JlYXRlZD0hMSx0aGlzLm5hdmlnYXRpb25IYW1tZXJzPVtdLHRoaXMuYm91bmRGdW5jdGlvbnM9e30sdGhpcy50b3VjaFRpbWU9MCx0aGlzLmFjdGl2YXRlZD0hMSx0aGlzLmJvZHkuZW1pdHRlci5vbigiYWN0aXZhdGUiLGZ1bmN0aW9uKCl7bi5hY3RpdmF0ZWQ9ITAsbi5jb25maWd1cmVLZXlib2FyZEJpbmRpbmdzKCl9KSx0aGlzLmJvZHkuZW1pdHRlci5vbigiZGVhY3RpdmF0ZSIsZnVuY3Rpb24oKXtuLmFjdGl2YXRlZD0hMSxuLmNvbmZpZ3VyZUtleWJvYXJkQmluZGluZ3MoKX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJkZXN0cm95IixmdW5jdGlvbigpe3ZvaWQgMCE9PW4ua2V5Y2hhcm0mJm4ua2V5Y2hhcm0uZGVzdHJveSgpfSksdGhpcy5vcHRpb25zPXt9fXJldHVybiBuKHQsW3trZXk6InNldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZvaWQgMCE9PXQmJih0aGlzLm9wdGlvbnM9dCx0aGlzLmNyZWF0ZSgpKX19LHtrZXk6ImNyZWF0ZSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMubmF2aWdhdGlvbkJ1dHRvbnM9PT0hMD90aGlzLmljb25zQ3JlYXRlZD09PSExJiZ0aGlzLmxvYWROYXZpZ2F0aW9uRWxlbWVudHMoKTp0aGlzLmljb25zQ3JlYXRlZD09PSEwJiZ0aGlzLmNsZWFuTmF2aWdhdGlvbigpLHRoaXMuY29uZmlndXJlS2V5Ym9hcmRCaW5kaW5ncygpfX0se2tleToiY2xlYW5OYXZpZ2F0aW9uIix2YWx1ZTpmdW5jdGlvbigpe2lmKDAhPXRoaXMubmF2aWdhdGlvbkhhbW1lcnMubGVuZ3RoKXtmb3IodmFyIHQ9MDt0PHRoaXMubmF2aWdhdGlvbkhhbW1lcnMubGVuZ3RoO3QrKyl0aGlzLm5hdmlnYXRpb25IYW1tZXJzW3RdLmRlc3Ryb3koKTt0aGlzLm5hdmlnYXRpb25IYW1tZXJzPVtdfXRoaXMubmF2aWdhdGlvbkRPTSYmdGhpcy5uYXZpZ2F0aW9uRE9NLndyYXBwZXImJnRoaXMubmF2aWdhdGlvbkRPTS53cmFwcGVyLnBhcmVudE5vZGUmJnRoaXMubmF2aWdhdGlvbkRPTS53cmFwcGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5uYXZpZ2F0aW9uRE9NLndyYXBwZXIpLHRoaXMuaWNvbnNDcmVhdGVkPSExfX0se2tleToibG9hZE5hdmlnYXRpb25FbGVtZW50cyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuY2xlYW5OYXZpZ2F0aW9uKCksdGhpcy5uYXZpZ2F0aW9uRE9NPXt9O3ZhciBlPVsidXAiLCJkb3duIiwibGVmdCIsInJpZ2h0Iiwiem9vbUluIiwiem9vbU91dCIsInpvb21FeHRlbmRzIl0saT1bIl9tb3ZlVXAiLCJfbW92ZURvd24iLCJfbW92ZUxlZnQiLCJfbW92ZVJpZ2h0IiwiX3pvb21JbiIsIl96b29tT3V0IiwiX2ZpdCJdO3RoaXMubmF2aWdhdGlvbkRPTS53cmFwcGVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMubmF2aWdhdGlvbkRPTS53cmFwcGVyLmNsYXNzTmFtZT0idmlzLW5hdmlnYXRpb24iLHRoaXMuY2FudmFzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMubmF2aWdhdGlvbkRPTS53cmFwcGVyKTtmb3IodmFyIG89MDtvPGUubGVuZ3RoO28rKyl7dGhpcy5uYXZpZ2F0aW9uRE9NW2Vbb11dPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMubmF2aWdhdGlvbkRPTVtlW29dXS5jbGFzc05hbWU9InZpcy1idXR0b24gdmlzLSIrZVtvXSx0aGlzLm5hdmlnYXRpb25ET00ud3JhcHBlci5hcHBlbmRDaGlsZCh0aGlzLm5hdmlnYXRpb25ET01bZVtvXV0pO3ZhciBuPW5ldyBzKHRoaXMubmF2aWdhdGlvbkRPTVtlW29dXSk7Il9maXQiPT09aVtvXT9yLm9uVG91Y2gobix0aGlzLl9maXQuYmluZCh0aGlzKSk6ci5vblRvdWNoKG4sdGhpcy5iaW5kVG9SZWRyYXcuYmluZCh0aGlzLGlbb10pKSx0aGlzLm5hdmlnYXRpb25IYW1tZXJzLnB1c2gobil9dmFyIGE9bmV3IHModGhpcy5jYW52YXMuZnJhbWUpO3Iub25SZWxlYXNlKGEsZnVuY3Rpb24oKXt0Ll9zdG9wTW92ZW1lbnQoKX0pLHRoaXMubmF2aWdhdGlvbkhhbW1lcnMucHVzaChhKSx0aGlzLmljb25zQ3JlYXRlZD0hMH19LHtrZXk6ImJpbmRUb1JlZHJhdyIsdmFsdWU6ZnVuY3Rpb24odCl7dm9pZCAwPT09dGhpcy5ib3VuZEZ1bmN0aW9uc1t0XSYmKHRoaXMuYm91bmRGdW5jdGlvbnNbdF09dGhpc1t0XS5iaW5kKHRoaXMpLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJpbml0UmVkcmF3Iix0aGlzLmJvdW5kRnVuY3Rpb25zW3RdKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfc3RhcnRSZW5kZXJpbmciKSl9fSx7a2V5OiJ1bmJpbmRGcm9tUmVkcmF3Iix2YWx1ZTpmdW5jdGlvbih0KXt2b2lkIDAhPT10aGlzLmJvdW5kRnVuY3Rpb25zW3RdJiYodGhpcy5ib2R5LmVtaXR0ZXIub2ZmKCJpbml0UmVkcmF3Iix0aGlzLmJvdW5kRnVuY3Rpb25zW3RdKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfc3RvcFJlbmRlcmluZyIpLGRlbGV0ZSB0aGlzLmJvdW5kRnVuY3Rpb25zW3RdKX19LHtrZXk6Il9maXQiLHZhbHVlOmZ1bmN0aW9uKCl7KG5ldyBEYXRlKS52YWx1ZU9mKCktdGhpcy50b3VjaFRpbWU+NzAwJiYodGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiZml0Iix7ZHVyYXRpb246NzAwfSksdGhpcy50b3VjaFRpbWU9KG5ldyBEYXRlKS52YWx1ZU9mKCkpfX0se2tleToiX3N0b3BNb3ZlbWVudCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5ib3VuZEZ1bmN0aW9ucyl0aGlzLmJvdW5kRnVuY3Rpb25zLmhhc093blByb3BlcnR5KHQpJiYodGhpcy5ib2R5LmVtaXR0ZXIub2ZmKCJpbml0UmVkcmF3Iix0aGlzLmJvdW5kRnVuY3Rpb25zW3RdKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfc3RvcFJlbmRlcmluZyIpKTt0aGlzLmJvdW5kRnVuY3Rpb25zPXt9fX0se2tleToiX21vdmVVcCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi55Kz10aGlzLm9wdGlvbnMua2V5Ym9hcmQuc3BlZWQueX19LHtrZXk6Il9tb3ZlRG93biIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi55LT10aGlzLm9wdGlvbnMua2V5Ym9hcmQuc3BlZWQueX19LHtrZXk6Il9tb3ZlTGVmdCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi54Kz10aGlzLm9wdGlvbnMua2V5Ym9hcmQuc3BlZWQueH19LHtrZXk6Il9tb3ZlUmlnaHQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb24ueC09dGhpcy5vcHRpb25zLmtleWJvYXJkLnNwZWVkLnh9fSx7a2V5OiJfem9vbUluIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYm9keS52aWV3LnNjYWxlLGU9dGhpcy5ib2R5LnZpZXcuc2NhbGUqKDErdGhpcy5vcHRpb25zLmtleWJvYXJkLnNwZWVkLnpvb20pLGk9dGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb24sbz1lL3Qsbj0oMS1vKSp0aGlzLmNhbnZhcy5jYW52YXNWaWV3Q2VudGVyLngraS54Km8scz0oMS1vKSp0aGlzLmNhbnZhcy5jYW52YXNWaWV3Q2VudGVyLnkraS55Km87dGhpcy5ib2R5LnZpZXcuc2NhbGU9ZSx0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbj17eDpuLHk6c30sdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiem9vbSIse2RpcmVjdGlvbjoiKyIsc2NhbGU6dGhpcy5ib2R5LnZpZXcuc2NhbGV9KX19LHtrZXk6Il96b29tT3V0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYm9keS52aWV3LnNjYWxlLGU9dGhpcy5ib2R5LnZpZXcuc2NhbGUvKDErdGhpcy5vcHRpb25zLmtleWJvYXJkLnNwZWVkLnpvb20pLGk9dGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb24sbz1lL3Qsbj0oMS1vKSp0aGlzLmNhbnZhcy5jYW52YXNWaWV3Q2VudGVyLngraS54Km8scz0oMS1vKSp0aGlzLmNhbnZhcy5jYW52YXNWaWV3Q2VudGVyLnkraS55Km87dGhpcy5ib2R5LnZpZXcuc2NhbGU9ZSx0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbj17eDpuLHk6c30sdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiem9vbSIse2RpcmVjdGlvbjoiLSIsc2NhbGU6dGhpcy5ib2R5LnZpZXcuc2NhbGV9KX19LHtrZXk6ImNvbmZpZ3VyZUtleWJvYXJkQmluZGluZ3MiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt2b2lkIDAhPT10aGlzLmtleWNoYXJtJiZ0aGlzLmtleWNoYXJtLmRlc3Ryb3koKSx0aGlzLm9wdGlvbnMua2V5Ym9hcmQuZW5hYmxlZD09PSEwJiYodGhpcy5vcHRpb25zLmtleWJvYXJkLmJpbmRUb1dpbmRvdz09PSEwP3RoaXMua2V5Y2hhcm09YSh7Y29udGFpbmVyOndpbmRvdyxwcmV2ZW50RGVmYXVsdDohMH0pOnRoaXMua2V5Y2hhcm09YSh7Y29udGFpbmVyOnRoaXMuY2FudmFzLmZyYW1lLHByZXZlbnREZWZhdWx0OiEwfSksdGhpcy5rZXljaGFybS5yZXNldCgpLHRoaXMuYWN0aXZhdGVkPT09ITAmJih0aGlzLmtleWNoYXJtLmJpbmQoInVwIixmdW5jdGlvbigpe3QuYmluZFRvUmVkcmF3KCJfbW92ZVVwIil9LCJrZXlkb3duIiksdGhpcy5rZXljaGFybS5iaW5kKCJkb3duIixmdW5jdGlvbigpe3QuYmluZFRvUmVkcmF3KCJfbW92ZURvd24iKX0sImtleWRvd24iKSx0aGlzLmtleWNoYXJtLmJpbmQoImxlZnQiLGZ1bmN0aW9uKCl7dC5iaW5kVG9SZWRyYXcoIl9tb3ZlTGVmdCIpfSwia2V5ZG93biIpLHRoaXMua2V5Y2hhcm0uYmluZCgicmlnaHQiLGZ1bmN0aW9uKCl7dC5iaW5kVG9SZWRyYXcoIl9tb3ZlUmlnaHQiKX0sImtleWRvd24iKSx0aGlzLmtleWNoYXJtLmJpbmQoIj0iLGZ1bmN0aW9uKCl7dC5iaW5kVG9SZWRyYXcoIl96b29tSW4iKX0sImtleWRvd24iKSx0aGlzLmtleWNoYXJtLmJpbmQoIm51bSsiLGZ1bmN0aW9uKCl7dC5iaW5kVG9SZWRyYXcoIl96b29tSW4iKX0sImtleWRvd24iKSx0aGlzLmtleWNoYXJtLmJpbmQoIm51bS0iLGZ1bmN0aW9uKCl7dC5iaW5kVG9SZWRyYXcoIl96b29tT3V0Iil9LCJrZXlkb3duIiksdGhpcy5rZXljaGFybS5iaW5kKCItIixmdW5jdGlvbigpe3QuYmluZFRvUmVkcmF3KCJfem9vbU91dCIpfSwia2V5ZG93biIpLHRoaXMua2V5Y2hhcm0uYmluZCgiWyIsZnVuY3Rpb24oKXt0LmJpbmRUb1JlZHJhdygiX3pvb21PdXQiKX0sImtleWRvd24iKSx0aGlzLmtleWNoYXJtLmJpbmQoIl0iLGZ1bmN0aW9uKCl7dC5iaW5kVG9SZWRyYXcoIl96b29tSW4iKX0sImtleWRvd24iKSx0aGlzLmtleWNoYXJtLmJpbmQoInBhZ2V1cCIsZnVuY3Rpb24oKXt0LmJpbmRUb1JlZHJhdygiX3pvb21JbiIpfSwia2V5ZG93biIpLHRoaXMua2V5Y2hhcm0uYmluZCgicGFnZWRvd24iLGZ1bmN0aW9uKCl7dC5iaW5kVG9SZWRyYXcoIl96b29tT3V0Iil9LCJrZXlkb3duIiksdGhpcy5rZXljaGFybS5iaW5kKCJ1cCIsZnVuY3Rpb24oKXt0LnVuYmluZEZyb21SZWRyYXcoIl9tb3ZlVXAiKX0sImtleXVwIiksdGhpcy5rZXljaGFybS5iaW5kKCJkb3duIixmdW5jdGlvbigpe3QudW5iaW5kRnJvbVJlZHJhdygiX21vdmVEb3duIil9LCJrZXl1cCIpLHRoaXMua2V5Y2hhcm0uYmluZCgibGVmdCIsZnVuY3Rpb24oKXt0LnVuYmluZEZyb21SZWRyYXcoIl9tb3ZlTGVmdCIpfSwia2V5dXAiKSx0aGlzLmtleWNoYXJtLmJpbmQoInJpZ2h0IixmdW5jdGlvbigpe3QudW5iaW5kRnJvbVJlZHJhdygiX21vdmVSaWdodCIpfSwia2V5dXAiKSx0aGlzLmtleWNoYXJtLmJpbmQoIj0iLGZ1bmN0aW9uKCl7dC51bmJpbmRGcm9tUmVkcmF3KCJfem9vbUluIil9LCJrZXl1cCIpLHRoaXMua2V5Y2hhcm0uYmluZCgibnVtKyIsZnVuY3Rpb24oKXt0LnVuYmluZEZyb21SZWRyYXcoIl96b29tSW4iKX0sImtleXVwIiksdGhpcy5rZXljaGFybS5iaW5kKCJudW0tIixmdW5jdGlvbigpe3QudW5iaW5kRnJvbVJlZHJhdygiX3pvb21PdXQiKX0sImtleXVwIiksdGhpcy5rZXljaGFybS5iaW5kKCItIixmdW5jdGlvbigpe3QudW5iaW5kRnJvbVJlZHJhdygiX3pvb21PdXQiKX0sImtleXVwIiksdGhpcy5rZXljaGFybS5iaW5kKCJbIixmdW5jdGlvbigpe3QudW5iaW5kRnJvbVJlZHJhdygiX3pvb21PdXQiKX0sImtleXVwIiksdGhpcy5rZXljaGFybS5iaW5kKCJdIixmdW5jdGlvbigpe3QudW5iaW5kRnJvbVJlZHJhdygiX3pvb21JbiIpfSwia2V5dXAiKSx0aGlzLmtleWNoYXJtLmJpbmQoInBhZ2V1cCIsZnVuY3Rpb24oKXt0LnVuYmluZEZyb21SZWRyYXcoIl96b29tSW4iKX0sImtleXVwIiksdGhpcy5rZXljaGFybS5iaW5kKCJwYWdlZG93biIsZnVuY3Rpb24oKXt0LnVuYmluZEZyb21SZWRyYXcoIl96b29tT3V0Iil9LCJrZXl1cCIpKSl9fV0pLHR9KCk7ZS5kZWZhdWx0PWh9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gaSh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX1yZXR1cm4gZnVuY3Rpb24oZSxpLG8pe3JldHVybiBpJiZ0KGUucHJvdG90eXBlLGkpLG8mJnQoZSxvKSxlfX0oKSxuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXtpKHRoaXMsdCksdGhpcy5jb250YWluZXI9ZSx0aGlzLng9MCx0aGlzLnk9MCx0aGlzLnBhZGRpbmc9NSx0aGlzLmhpZGRlbj0hMSx0aGlzLmZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZnJhbWUuY2xhc3NOYW1lPSJ2aXMtbmV0d29yay10b29sdGlwIix0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmZyYW1lKX1yZXR1cm4gbyh0LFt7a2V5OiJzZXRQb3NpdGlvbiIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0aGlzLng9cGFyc2VJbnQodCksdGhpcy55PXBhcnNlSW50KGUpfX0se2tleToic2V0VGV4dCIsdmFsdWU6ZnVuY3Rpb24odCl7dCBpbnN0YW5jZW9mIEVsZW1lbnQ/KHRoaXMuZnJhbWUuaW5uZXJIVE1MPSIiLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodCkpOnRoaXMuZnJhbWUuaW5uZXJIVE1MPXR9fSx7a2V5OiJzaG93Iix2YWx1ZTpmdW5jdGlvbih0KXtpZih2b2lkIDA9PT10JiYodD0hMCksdD09PSEwKXt2YXIgZT10aGlzLmZyYW1lLmNsaWVudEhlaWdodCxpPXRoaXMuZnJhbWUuY2xpZW50V2lkdGgsbz10aGlzLmZyYW1lLnBhcmVudE5vZGUuY2xpZW50SGVpZ2h0LG49dGhpcy5mcmFtZS5wYXJlbnROb2RlLmNsaWVudFdpZHRoLHM9dGhpcy55LWU7cytlK3RoaXMucGFkZGluZz5vJiYocz1vLWUtdGhpcy5wYWRkaW5nKSxzPHRoaXMucGFkZGluZyYmKHM9dGhpcy5wYWRkaW5nKTt2YXIgcj10aGlzLng7citpK3RoaXMucGFkZGluZz5uJiYocj1uLWktdGhpcy5wYWRkaW5nKSxyPHRoaXMucGFkZGluZyYmKHI9dGhpcy5wYWRkaW5nKSx0aGlzLmZyYW1lLnN0eWxlLmxlZnQ9cisicHgiLHRoaXMuZnJhbWUuc3R5bGUudG9wPXMrInB4Iix0aGlzLmZyYW1lLnN0eWxlLnZpc2liaWxpdHk9InZpc2libGUiLHRoaXMuaGlkZGVuPSExfWVsc2UgdGhpcy5oaWRlKCl9fSx7a2V5OiJoaWRlIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuaGlkZGVuPSEwLHRoaXMuZnJhbWUuc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn19XSksdH0oKTtlLmRlZmF1bHQ9bn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWZ1bmN0aW9uIG4odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxvJiZ0KGUsbyksZX19KCkscj1pKDY3KSxhPW8ociksaD1pKDg3KSxkPW8oaCksbD1pKDEpLGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsaSl7dmFyIG89dGhpcztuKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5jYW52YXM9aSx0aGlzLnNlbGVjdGlvbk9iaj17bm9kZXM6W10sZWRnZXM6W119LHRoaXMuaG92ZXJPYmo9e25vZGVzOnt9LGVkZ2VzOnt9fSx0aGlzLm9wdGlvbnM9e30sdGhpcy5kZWZhdWx0T3B0aW9ucz17bXVsdGlzZWxlY3Q6ITEsc2VsZWN0YWJsZTohMCxzZWxlY3RDb25uZWN0ZWRFZGdlczohMCxob3ZlckNvbm5lY3RlZEVkZ2VzOiEwfSxsLmV4dGVuZCh0aGlzLm9wdGlvbnMsdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5ib2R5LmVtaXR0ZXIub24oIl9kYXRhQ2hhbmdlZCIsZnVuY3Rpb24oKXtvLnVwZGF0ZVNlbGVjdGlvbigpfSl9cmV0dXJuIHModCxbe2tleToic2V0T3B0aW9ucyIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09dCl7dmFyIGU9WyJtdWx0aXNlbGVjdCIsImhvdmVyQ29ubmVjdGVkRWRnZXMiLCJzZWxlY3RhYmxlIiwic2VsZWN0Q29ubmVjdGVkRWRnZXMiXTtsLnNlbGVjdGl2ZURlZXBFeHRlbmQoZSx0aGlzLm9wdGlvbnMsdCl9fX0se2tleToic2VsZWN0T25Qb2ludCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9ITE7aWYodGhpcy5vcHRpb25zLnNlbGVjdGFibGU9PT0hMCl7dmFyIGk9dGhpcy5nZXROb2RlQXQodCl8fHRoaXMuZ2V0RWRnZUF0KHQpO3RoaXMudW5zZWxlY3RBbGwoKSx2b2lkIDAhPT1pJiYoZT10aGlzLnNlbGVjdE9iamVjdChpKSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX3JlcXVlc3RSZWRyYXciKX1yZXR1cm4gZX19LHtrZXk6InNlbGVjdEFkZGl0aW9uYWxPblBvaW50Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT0hMTtpZih0aGlzLm9wdGlvbnMuc2VsZWN0YWJsZT09PSEwKXt2YXIgaT10aGlzLmdldE5vZGVBdCh0KXx8dGhpcy5nZXRFZGdlQXQodCk7dm9pZCAwIT09aSYmKGU9ITAsaS5pc1NlbGVjdGVkKCk9PT0hMD90aGlzLmRlc2VsZWN0T2JqZWN0KGkpOnRoaXMuc2VsZWN0T2JqZWN0KGkpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9yZXF1ZXN0UmVkcmF3IikpfXJldHVybiBlfX0se2tleToiX2dlbmVyYXRlQ2xpY2tFdmVudCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0mJmFyZ3VtZW50c1s0XSxzPXZvaWQgMDtzPW49PT0hMD97bm9kZXM6W10sZWRnZXM6W119OnRoaXMuZ2V0U2VsZWN0aW9uKCkscy5wb2ludGVyPXtET006e3g6aS54LHk6aS55fSxjYW52YXM6dGhpcy5jYW52YXMuRE9NdG9DYW52YXMoaSl9LHMuZXZlbnQ9ZSx2b2lkIDAhPT1vJiYocy5wcmV2aW91c1NlbGVjdGlvbj1vKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KHQscyl9fSx7a2V5OiJzZWxlY3RPYmplY3QiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp0aGlzLm9wdGlvbnMuc2VsZWN0Q29ubmVjdGVkRWRnZXM7cmV0dXJuIHZvaWQgMCE9PXQmJih0IGluc3RhbmNlb2YgYS5kZWZhdWx0JiZlPT09ITAmJnRoaXMuX3NlbGVjdENvbm5lY3RlZEVkZ2VzKHQpLHQuc2VsZWN0KCksdGhpcy5fYWRkVG9TZWxlY3Rpb24odCksITApfX0se2tleToiZGVzZWxlY3RPYmplY3QiLHZhbHVlOmZ1bmN0aW9uKHQpe3QuaXNTZWxlY3RlZCgpPT09ITAmJih0LnNlbGVjdGVkPSExLHRoaXMuX3JlbW92ZUZyb21TZWxlY3Rpb24odCkpfX0se2tleToiX2dldEFsbE5vZGVzT3ZlcmxhcHBpbmdXaXRoIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT10aGlzLmJvZHkubm9kZXMsbz0wO288dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLmxlbmd0aDtvKyspe3ZhciBuPXRoaXMuYm9keS5ub2RlSW5kaWNlc1tvXTtpW25dLmlzT3ZlcmxhcHBpbmdXaXRoKHQpJiZlLnB1c2gobil9cmV0dXJuIGV9fSx7a2V5OiJfcG9pbnRlclRvUG9zaXRpb25PYmplY3QiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY2FudmFzLkRPTXRvQ2FudmFzKHQpO3JldHVybntsZWZ0OmUueC0xLHRvcDplLnkrMSxyaWdodDplLngrMSxib3R0b206ZS55LTF9fX0se2tleToiZ2V0Tm9kZUF0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT0hKGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdKXx8YXJndW1lbnRzWzFdLGk9dGhpcy5fcG9pbnRlclRvUG9zaXRpb25PYmplY3QodCksbz10aGlzLl9nZXRBbGxOb2Rlc092ZXJsYXBwaW5nV2l0aChpKTtyZXR1cm4gby5sZW5ndGg+MD9lPT09ITA/dGhpcy5ib2R5Lm5vZGVzW29bby5sZW5ndGgtMV1dOm9bby5sZW5ndGgtMV06dm9pZCAwfX0se2tleToiX2dldEVkZ2VzT3ZlcmxhcHBpbmdXaXRoIix2YWx1ZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaT10aGlzLmJvZHkuZWRnZXMsbz0wO288dGhpcy5ib2R5LmVkZ2VJbmRpY2VzLmxlbmd0aDtvKyspe3ZhciBuPXRoaXMuYm9keS5lZGdlSW5kaWNlc1tvXTtpW25dLmlzT3ZlcmxhcHBpbmdXaXRoKHQpJiZlLnB1c2gobil9fX0se2tleToiX2dldEFsbEVkZ2VzT3ZlcmxhcHBpbmdXaXRoIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gdGhpcy5fZ2V0RWRnZXNPdmVybGFwcGluZ1dpdGgodCxlKSxlfX0se2tleToiZ2V0RWRnZUF0Iix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9IShhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSl8fGFyZ3VtZW50c1sxXSxpPXRoaXMuY2FudmFzLkRPTXRvQ2FudmFzKHQpLG89MTAsbj1udWxsLHM9dGhpcy5ib2R5LmVkZ2VzLHI9MDtyPHRoaXMuYm9keS5lZGdlSW5kaWNlcy5sZW5ndGg7cisrKXt2YXIgYT10aGlzLmJvZHkuZWRnZUluZGljZXNbcl0saD1zW2FdO2lmKGguY29ubmVjdGVkKXt2YXIgZD1oLmZyb20ueCxsPWguZnJvbS55LGM9aC50by54LHU9aC50by55LHA9aC5lZGdlVHlwZS5nZXREaXN0YW5jZVRvRWRnZShkLGwsYyx1LGkueCxpLnkpO3A8byYmKG49YSxvPXApfX1yZXR1cm4gbj9lPT09ITA/dGhpcy5ib2R5LmVkZ2VzW25dOm46dm9pZCAwfX0se2tleToiX2FkZFRvU2VsZWN0aW9uIix2YWx1ZTpmdW5jdGlvbih0KXt0IGluc3RhbmNlb2YgYS5kZWZhdWx0P3RoaXMuc2VsZWN0aW9uT2JqLm5vZGVzW3QuaWRdPXQ6dGhpcy5zZWxlY3Rpb25PYmouZWRnZXNbdC5pZF09dH19LHtrZXk6Il9hZGRUb0hvdmVyIix2YWx1ZTpmdW5jdGlvbih0KXt0IGluc3RhbmNlb2YgYS5kZWZhdWx0P3RoaXMuaG92ZXJPYmoubm9kZXNbdC5pZF09dDp0aGlzLmhvdmVyT2JqLmVkZ2VzW3QuaWRdPXR9fSx7a2V5OiJfcmVtb3ZlRnJvbVNlbGVjdGlvbiIsdmFsdWU6ZnVuY3Rpb24odCl7dCBpbnN0YW5jZW9mIGEuZGVmYXVsdD8oZGVsZXRlIHRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzW3QuaWRdLHRoaXMuX3Vuc2VsZWN0Q29ubmVjdGVkRWRnZXModCkpOmRlbGV0ZSB0aGlzLnNlbGVjdGlvbk9iai5lZGdlc1t0LmlkXX19LHtrZXk6InVuc2VsZWN0QWxsIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcyl0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcy5oYXNPd25Qcm9wZXJ0eSh0KSYmdGhpcy5zZWxlY3Rpb25PYmoubm9kZXNbdF0udW5zZWxlY3QoKTtmb3IodmFyIGUgaW4gdGhpcy5zZWxlY3Rpb25PYmouZWRnZXMpdGhpcy5zZWxlY3Rpb25PYmouZWRnZXMuaGFzT3duUHJvcGVydHkoZSkmJnRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzW2VdLnVuc2VsZWN0KCk7dGhpcy5zZWxlY3Rpb25PYmo9e25vZGVzOnt9LGVkZ2VzOnt9fX19LHtrZXk6Il9nZXRTZWxlY3RlZE5vZGVDb3VudCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0wO2Zvcih2YXIgZSBpbiB0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcyl0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShlKSYmKHQrPTEpO3JldHVybiB0fX0se2tleToiX2dldFNlbGVjdGVkTm9kZSIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5zZWxlY3Rpb25PYmoubm9kZXMpaWYodGhpcy5zZWxlY3Rpb25PYmoubm9kZXMuaGFzT3duUHJvcGVydHkodCkpcmV0dXJuIHRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzW3RdfX0se2tleToiX2dldFNlbGVjdGVkRWRnZSIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5zZWxlY3Rpb25PYmouZWRnZXMpaWYodGhpcy5zZWxlY3Rpb25PYmouZWRnZXMuaGFzT3duUHJvcGVydHkodCkpcmV0dXJuIHRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzW3RdfX0se2tleToiX2dldFNlbGVjdGVkRWRnZUNvdW50Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PTA7Zm9yKHZhciBlIGluIHRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzKXRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzLmhhc093blByb3BlcnR5KGUpJiYodCs9MSk7cmV0dXJuIHR9fSx7a2V5OiJfZ2V0U2VsZWN0ZWRPYmplY3RDb3VudCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0wO2Zvcih2YXIgZSBpbiB0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcyl0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShlKSYmKHQrPTEpO2Zvcih2YXIgaSBpbiB0aGlzLnNlbGVjdGlvbk9iai5lZGdlcyl0aGlzLnNlbGVjdGlvbk9iai5lZGdlcy5oYXNPd25Qcm9wZXJ0eShpKSYmKHQrPTEpO3JldHVybiB0fX0se2tleToiX3NlbGVjdGlvbklzRW1wdHkiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzKWlmKHRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzLmhhc093blByb3BlcnR5KHQpKXJldHVybiExO2Zvcih2YXIgZSBpbiB0aGlzLnNlbGVjdGlvbk9iai5lZGdlcylpZih0aGlzLnNlbGVjdGlvbk9iai5lZGdlcy5oYXNPd25Qcm9wZXJ0eShlKSlyZXR1cm4hMTtyZXR1cm4hMH19LHtrZXk6Il9jbHVzdGVySW5TZWxlY3Rpb24iLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzKWlmKHRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzLmhhc093blByb3BlcnR5KHQpJiZ0aGlzLnNlbGVjdGlvbk9iai5ub2Rlc1t0XS5jbHVzdGVyU2l6ZT4xKXJldHVybiEwO3JldHVybiExfX0se2tleToiX3NlbGVjdENvbm5lY3RlZEVkZ2VzIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQuZWRnZXMubGVuZ3RoO2UrKyl7dmFyIGk9dC5lZGdlc1tlXTtpLnNlbGVjdCgpLHRoaXMuX2FkZFRvU2VsZWN0aW9uKGkpfX19LHtrZXk6Il9ob3ZlckNvbm5lY3RlZEVkZ2VzIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQuZWRnZXMubGVuZ3RoO2UrKyl7dmFyIGk9dC5lZGdlc1tlXTtpLmhvdmVyPSEwLHRoaXMuX2FkZFRvSG92ZXIoaSl9fX0se2tleToiX3Vuc2VsZWN0Q29ubmVjdGVkRWRnZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5lZGdlcy5sZW5ndGg7ZSsrKXt2YXIgaT10LmVkZ2VzW2VdO2kudW5zZWxlY3QoKSx0aGlzLl9yZW1vdmVGcm9tU2VsZWN0aW9uKGkpfX19LHtrZXk6ImJsdXJPYmplY3QiLHZhbHVlOmZ1bmN0aW9uKHQpe3QuaG92ZXI9PT0hMCYmKHQuaG92ZXI9ITEsdCBpbnN0YW5jZW9mIGEuZGVmYXVsdD90aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJibHVyTm9kZSIse25vZGU6dC5pZH0pOnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoImJsdXJFZGdlIix7ZWRnZTp0LmlkfSkpfX0se2tleToiaG92ZXJPYmplY3QiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPSExO2Zvcih2YXIgaSBpbiB0aGlzLmhvdmVyT2JqLm5vZGVzKXRoaXMuaG92ZXJPYmoubm9kZXMuaGFzT3duUHJvcGVydHkoaSkmJih2b2lkIDA9PT10fHx0IGluc3RhbmNlb2YgYS5kZWZhdWx0JiZ0LmlkIT1pfHx0IGluc3RhbmNlb2YgZC5kZWZhdWx0KSYmKHRoaXMuYmx1ck9iamVjdCh0aGlzLmhvdmVyT2JqLm5vZGVzW2ldKSxkZWxldGUgdGhpcy5ob3Zlck9iai5ub2Rlc1tpXSxlPSEwKTtmb3IodmFyIG8gaW4gdGhpcy5ob3Zlck9iai5lZGdlcyl0aGlzLmhvdmVyT2JqLmVkZ2VzLmhhc093blByb3BlcnR5KG8pJiYoZT09PSEwPyh0aGlzLmhvdmVyT2JqLmVkZ2VzW29dLmhvdmVyPSExLGRlbGV0ZSB0aGlzLmhvdmVyT2JqLmVkZ2VzW29dKToodm9pZCAwPT09dHx8dCBpbnN0YW5jZW9mIGQuZGVmYXVsdCkmJih0aGlzLmJsdXJPYmplY3QodGhpcy5ob3Zlck9iai5lZGdlc1tvXSksZGVsZXRlIHRoaXMuaG92ZXJPYmouZWRnZXNbb10sZT0hMCkpO3ZvaWQgMCE9PXQmJih0LmhvdmVyPT09ITEmJih0LmhvdmVyPSEwLHRoaXMuX2FkZFRvSG92ZXIodCksZT0hMCx0IGluc3RhbmNlb2YgYS5kZWZhdWx0P3RoaXMuYm9keS5lbWl0dGVyLmVtaXQoImhvdmVyTm9kZSIse25vZGU6dC5pZH0pOnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoImhvdmVyRWRnZSIse2VkZ2U6dC5pZH0pKSx0IGluc3RhbmNlb2YgYS5kZWZhdWx0JiZ0aGlzLm9wdGlvbnMuaG92ZXJDb25uZWN0ZWRFZGdlcz09PSEwJiZ0aGlzLl9ob3ZlckNvbm5lY3RlZEVkZ2VzKHQpKSxlPT09ITAmJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9yZXF1ZXN0UmVkcmF3Iil9fSx7a2V5OiJnZXRTZWxlY3Rpb24iLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRTZWxlY3RlZE5vZGVzKCksZT10aGlzLmdldFNlbGVjdGVkRWRnZXMoKTtyZXR1cm57bm9kZXM6dCxlZGdlczplfX19LHtrZXk6ImdldFNlbGVjdGVkTm9kZXMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9W107aWYodGhpcy5vcHRpb25zLnNlbGVjdGFibGU9PT0hMClmb3IodmFyIGUgaW4gdGhpcy5zZWxlY3Rpb25PYmoubm9kZXMpdGhpcy5zZWxlY3Rpb25PYmoubm9kZXMuaGFzT3duUHJvcGVydHkoZSkmJnQucHVzaCh0aGlzLnNlbGVjdGlvbk9iai5ub2Rlc1tlXS5pZCk7cmV0dXJuIHR9fSx7a2V5OiJnZXRTZWxlY3RlZEVkZ2VzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PVtdO2lmKHRoaXMub3B0aW9ucy5zZWxlY3RhYmxlPT09ITApZm9yKHZhciBlIGluIHRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzKXRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzLmhhc093blByb3BlcnR5KGUpJiZ0LnB1c2godGhpcy5zZWxlY3Rpb25PYmouZWRnZXNbZV0uaWQpO3JldHVybiB0fX0se2tleToic2V0U2VsZWN0aW9uIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e30saT12b2lkIDAsbz12b2lkIDA7aWYoIXR8fCF0Lm5vZGVzJiYhdC5lZGdlcyl0aHJvdyJTZWxlY3Rpb24gbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCBub2RlcyBhbmQvb3IgZWRnZXMgcHJvcGVydGllcyI7aWYoKGUudW5zZWxlY3RBbGx8fHZvaWQgMD09PWUudW5zZWxlY3RBbGwpJiZ0aGlzLnVuc2VsZWN0QWxsKCksdC5ub2Rlcylmb3IoaT0wO2k8dC5ub2Rlcy5sZW5ndGg7aSsrKXtvPXQubm9kZXNbaV07dmFyIG49dGhpcy5ib2R5Lm5vZGVzW29dO2lmKCFuKXRocm93IG5ldyBSYW5nZUVycm9yKCdOb2RlIHdpdGggaWQgIicrbysnIiBub3QgZm91bmQnKTt0aGlzLnNlbGVjdE9iamVjdChuLGUuaGlnaGxpZ2h0RWRnZXMpfWlmKHQuZWRnZXMpZm9yKGk9MDtpPHQuZWRnZXMubGVuZ3RoO2krKyl7bz10LmVkZ2VzW2ldO3ZhciBzPXRoaXMuYm9keS5lZGdlc1tvXTtpZighcyl0aHJvdyBuZXcgUmFuZ2VFcnJvcignRWRnZSB3aXRoIGlkICInK28rJyIgbm90IGZvdW5kJyk7dGhpcy5zZWxlY3RPYmplY3Qocyl9dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX3JlcXVlc3RSZWRyYXciKX19LHtrZXk6InNlbGVjdE5vZGVzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT0hKGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdKXx8YXJndW1lbnRzWzFdO2lmKCF0fHx2b2lkIDA9PT10Lmxlbmd0aCl0aHJvdyJTZWxlY3Rpb24gbXVzdCBiZSBhbiBhcnJheSB3aXRoIGlkcyI7dGhpcy5zZXRTZWxlY3Rpb24oe25vZGVzOnR9LHtoaWdobGlnaHRFZGdlczplfSl9fSx7a2V5OiJzZWxlY3RFZGdlcyIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXR8fHZvaWQgMD09PXQubGVuZ3RoKXRocm93IlNlbGVjdGlvbiBtdXN0IGJlIGFuIGFycmF5IHdpdGggaWRzIjt0aGlzLnNldFNlbGVjdGlvbih7ZWRnZXM6dH0pfX0se2tleToidXBkYXRlU2VsZWN0aW9uIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcyl0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcy5oYXNPd25Qcm9wZXJ0eSh0KSYmKHRoaXMuYm9keS5ub2Rlcy5oYXNPd25Qcm9wZXJ0eSh0KXx8ZGVsZXRlIHRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzW3RdKTtmb3IodmFyIGUgaW4gdGhpcy5zZWxlY3Rpb25PYmouZWRnZXMpdGhpcy5zZWxlY3Rpb25PYmouZWRnZXMuaGFzT3duUHJvcGVydHkoZSkmJih0aGlzLmJvZHkuZWRnZXMuaGFzT3duUHJvcGVydHkoZSl8fGRlbGV0ZSB0aGlzLnNlbGVjdGlvbk9iai5lZGdlc1tlXSl9fV0pLHR9KCk7ZS5kZWZhdWx0PWN9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1mdW5jdGlvbiBuKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3ZhciBpPVtdLG89ITAsbj0hMSxzPXZvaWQgMDt0cnl7Zm9yKHZhciByLGE9dFtTeW1ib2wuaXRlcmF0b3JdKCk7IShvPShyPWEubmV4dCgpKS5kb25lKSYmKGkucHVzaChyLnZhbHVlKSwhZXx8aS5sZW5ndGghPT1lKTtvPSEwKTt9Y2F0Y2godCl7bj0hMCxzPXR9ZmluYWxseXt0cnl7IW8mJmEucmV0dXJuJiZhLnJldHVybigpfWZpbmFsbHl7aWYobil0aHJvdyBzfX1yZXR1cm4gaX1yZXR1cm4gZnVuY3Rpb24oZSxpKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlO2lmKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpcmV0dXJuIHQoZSxpKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlIil9fSgpLHI9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9LGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxvJiZ0KGUsbyksZX19KCksaD1pKDEwNSksZD1vKGgpLGw9aSgxKSxjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXtuKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5pbml0aWFsUmFuZG9tU2VlZD1NYXRoLnJvdW5kKDFlNipNYXRoLnJhbmRvbSgpKSx0aGlzLnJhbmRvbVNlZWQ9dGhpcy5pbml0aWFsUmFuZG9tU2VlZCx0aGlzLnNldFBoeXNpY3M9ITEsdGhpcy5vcHRpb25zPXt9LHRoaXMub3B0aW9uc0JhY2t1cD17cGh5c2ljczp7fX0sdGhpcy5kZWZhdWx0T3B0aW9ucz17cmFuZG9tU2VlZDp2b2lkIDAsaW1wcm92ZWRMYXlvdXQ6ITAsaGllcmFyY2hpY2FsOntlbmFibGVkOiExLGxldmVsU2VwYXJhdGlvbjoxNTAsbm9kZVNwYWNpbmc6MTAwLHRyZWVTcGFjaW5nOjIwMCxibG9ja1NoaWZ0aW5nOiEwLGVkZ2VNaW5pbWl6YXRpb246ITAscGFyZW50Q2VudHJhbGl6YXRpb246ITAsZGlyZWN0aW9uOiJVRCIsc29ydE1ldGhvZDoiaHVic2l6ZSJ9fSxsLmV4dGVuZCh0aGlzLm9wdGlvbnMsdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5iaW5kRXZlbnRMaXN0ZW5lcnMoKX1yZXR1cm4gYSh0LFt7a2V5OiJiaW5kRXZlbnRMaXN0ZW5lcnMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmJvZHkuZW1pdHRlci5vbigiX2RhdGFDaGFuZ2VkIixmdW5jdGlvbigpe3Quc2V0dXBIaWVyYXJjaGljYWxMYXlvdXQoKX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJfZGF0YUxvYWRlZCIsZnVuY3Rpb24oKXt0LmxheW91dE5ldHdvcmsoKX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKCJfcmVzZXRIaWVyYXJjaGljYWxMYXlvdXQiLGZ1bmN0aW9uKCl7dC5zZXR1cEhpZXJhcmNoaWNhbExheW91dCgpfSl9fSx7a2V5OiJzZXRPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKHZvaWQgMCE9PXQpe3ZhciBpPXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwuZW5hYmxlZDtpZihsLnNlbGVjdGl2ZURlZXBFeHRlbmQoWyJyYW5kb21TZWVkIiwiaW1wcm92ZWRMYXlvdXQiXSx0aGlzLm9wdGlvbnMsdCksbC5tZXJnZU9wdGlvbnModGhpcy5vcHRpb25zLHQsImhpZXJhcmNoaWNhbCIpLHZvaWQgMCE9PXQucmFuZG9tU2VlZCYmKHRoaXMuaW5pdGlhbFJhbmRvbVNlZWQ9dC5yYW5kb21TZWVkKSx0aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLmVuYWJsZWQ9PT0hMClyZXR1cm4gaT09PSEwJiZ0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJyZWZyZXNoIiwhMCksIlJMIj09PXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwuZGlyZWN0aW9ufHwiRFUiPT09dGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5kaXJlY3Rpb24/dGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5sZXZlbFNlcGFyYXRpb24+MCYmKHRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwubGV2ZWxTZXBhcmF0aW9uKj0tMSk6dGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5sZXZlbFNlcGFyYXRpb248MCYmKHRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwubGV2ZWxTZXBhcmF0aW9uKj0tMSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX3Jlc2V0SGllcmFyY2hpY2FsTGF5b3V0IiksdGhpcy5hZGFwdEFsbE9wdGlvbnNGb3JIaWVyYXJjaGljYWxMYXlvdXQoZSk7aWYoaT09PSEwKXJldHVybiB0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJyZWZyZXNoIiksbC5kZWVwRXh0ZW5kKGUsdGhpcy5vcHRpb25zQmFja3VwKX1yZXR1cm4gZX19LHtrZXk6ImFkYXB0QWxsT3B0aW9uc0ZvckhpZXJhcmNoaWNhbExheW91dCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5lbmFibGVkPT09ITApe3ZvaWQgMD09PXQucGh5c2ljc3x8dC5waHlzaWNzPT09ITA/KHQucGh5c2ljcz17ZW5hYmxlZDp2b2lkIDA9PT10aGlzLm9wdGlvbnNCYWNrdXAucGh5c2ljcy5lbmFibGVkfHx0aGlzLm9wdGlvbnNCYWNrdXAucGh5c2ljcy5lbmFibGVkLHNvbHZlcjoiaGllcmFyY2hpY2FsUmVwdWxzaW9uIn0sdGhpcy5vcHRpb25zQmFja3VwLnBoeXNpY3MuZW5hYmxlZD12b2lkIDA9PT10aGlzLm9wdGlvbnNCYWNrdXAucGh5c2ljcy5lbmFibGVkfHx0aGlzLm9wdGlvbnNCYWNrdXAucGh5c2ljcy5lbmFibGVkLHRoaXMub3B0aW9uc0JhY2t1cC5waHlzaWNzLnNvbHZlcj10aGlzLm9wdGlvbnNCYWNrdXAucGh5c2ljcy5zb2x2ZXJ8fCJiYXJuZXNIdXQiKToib2JqZWN0Ij09PXIodC5waHlzaWNzKT8odGhpcy5vcHRpb25zQmFja3VwLnBoeXNpY3MuZW5hYmxlZD12b2lkIDA9PT10LnBoeXNpY3MuZW5hYmxlZHx8dC5waHlzaWNzLmVuYWJsZWQsdGhpcy5vcHRpb25zQmFja3VwLnBoeXNpY3Muc29sdmVyPXQucGh5c2ljcy5zb2x2ZXJ8fCJiYXJuZXNIdXQiLHQucGh5c2ljcy5zb2x2ZXI9ImhpZXJhcmNoaWNhbFJlcHVsc2lvbiIpOnQucGh5c2ljcyE9PSExJiYodGhpcy5vcHRpb25zQmFja3VwLnBoeXNpY3Muc29sdmVyPSJiYXJuZXNIdXQiLHQucGh5c2ljcz17c29sdmVyOiJoaWVyYXJjaGljYWxSZXB1bHNpb24ifSk7dmFyIGU9Imhvcml6b250YWwiOyJSTCIhPT10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLmRpcmVjdGlvbiYmIkxSIiE9PXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwuZGlyZWN0aW9ufHwoZT0idmVydGljYWwiKSx2b2lkIDA9PT10LmVkZ2VzPyh0aGlzLm9wdGlvbnNCYWNrdXAuZWRnZXM9e3Ntb290aDp7ZW5hYmxlZDohMCx0eXBlOiJkeW5hbWljIn19LHQuZWRnZXM9e3Ntb290aDohMX0pOnZvaWQgMD09PXQuZWRnZXMuc21vb3RoPyh0aGlzLm9wdGlvbnNCYWNrdXAuZWRnZXM9e3Ntb290aDp7ZW5hYmxlZDohMCx0eXBlOiJkeW5hbWljIn19LHQuZWRnZXMuc21vb3RoPSExKToiYm9vbGVhbiI9PXR5cGVvZiB0LmVkZ2VzLnNtb290aD8odGhpcy5vcHRpb25zQmFja3VwLmVkZ2VzPXtzbW9vdGg6dC5lZGdlcy5zbW9vdGh9LHQuZWRnZXMuc21vb3RoPXtlbmFibGVkOnQuZWRnZXMuc21vb3RoLHR5cGU6ZX0pOih2b2lkIDAhPT10LmVkZ2VzLnNtb290aC50eXBlJiYiZHluYW1pYyIhPT10LmVkZ2VzLnNtb290aC50eXBlJiYoZT10LmVkZ2VzLnNtb290aC50eXBlKSx0aGlzLm9wdGlvbnNCYWNrdXAuZWRnZXM9e3Ntb290aDp2b2lkIDA9PT10LmVkZ2VzLnNtb290aC5lbmFibGVkfHx0LmVkZ2VzLnNtb290aC5lbmFibGVkLHR5cGU6dm9pZCAwPT09dC5lZGdlcy5zbW9vdGgudHlwZT8iZHluYW1pYyI6dC5lZGdlcy5zbW9vdGgudHlwZSxyb3VuZG5lc3M6dm9pZCAwPT09dC5lZGdlcy5zbW9vdGgucm91bmRuZXNzPy41OnQuZWRnZXMuc21vb3RoLnJvdW5kbmVzcyxmb3JjZURpcmVjdGlvbjp2b2lkIDAhPT10LmVkZ2VzLnNtb290aC5mb3JjZURpcmVjdGlvbiYmdC5lZGdlcy5zbW9vdGguZm9yY2VEaXJlY3Rpb259LHQuZWRnZXMuc21vb3RoPXtlbmFibGVkOnZvaWQgMD09PXQuZWRnZXMuc21vb3RoLmVuYWJsZWR8fHQuZWRnZXMuc21vb3RoLmVuYWJsZWQsdHlwZTplLHJvdW5kbmVzczp2b2lkIDA9PT10LmVkZ2VzLnNtb290aC5yb3VuZG5lc3M/LjU6dC5lZGdlcy5zbW9vdGgucm91bmRuZXNzLGZvcmNlRGlyZWN0aW9uOnZvaWQgMCE9PXQuZWRnZXMuc21vb3RoLmZvcmNlRGlyZWN0aW9uJiZ0LmVkZ2VzLnNtb290aC5mb3JjZURpcmVjdGlvbn0pLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9mb3JjZURpc2FibGVEeW5hbWljQ3VydmVzIixlKX1yZXR1cm4gdH19LHtrZXk6InNlZWRlZFJhbmRvbSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0xZTQqTWF0aC5zaW4odGhpcy5yYW5kb21TZWVkKyspO3JldHVybiB0LU1hdGguZmxvb3IodCl9fSx7a2V5OiJwb3NpdGlvbkluaXRpYWxseSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5lbmFibGVkIT09ITApe3RoaXMucmFuZG9tU2VlZD10aGlzLmluaXRpYWxSYW5kb21TZWVkO2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKXt2YXIgaT10W2VdLG89MSp0Lmxlbmd0aCsxMCxuPTIqTWF0aC5QSSp0aGlzLnNlZWRlZFJhbmRvbSgpO3ZvaWQgMD09PWkueCYmKGkueD1vKk1hdGguY29zKG4pKSx2b2lkIDA9PT1pLnkmJihpLnk9bypNYXRoLnNpbihuKSl9fX19LHtrZXk6ImxheW91dE5ldHdvcmsiLHZhbHVlOmZ1bmN0aW9uKCl7aWYodGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5lbmFibGVkIT09ITAmJnRoaXMub3B0aW9ucy5pbXByb3ZlZExheW91dD09PSEwKXtmb3IodmFyIHQ9MCxlPTA7ZTx0aGlzLmJvZHkubm9kZUluZGljZXMubGVuZ3RoO2UrKyl7dmFyIGk9dGhpcy5ib2R5Lm5vZGVzW3RoaXMuYm9keS5ub2RlSW5kaWNlc1tlXV07aS5wcmVkZWZpbmVkUG9zaXRpb249PT0hMCYmKHQrPTEpfWlmKHQ8LjUqdGhpcy5ib2R5Lm5vZGVJbmRpY2VzLmxlbmd0aCl7dmFyIG89MTAsbj0wLHM9MTAwO2lmKHRoaXMuYm9keS5ub2RlSW5kaWNlcy5sZW5ndGg+cyl7Zm9yKHZhciByPXRoaXMuYm9keS5ub2RlSW5kaWNlcy5sZW5ndGg7dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLmxlbmd0aD5zOyl7bis9MTt2YXIgYT10aGlzLmJvZHkubm9kZUluZGljZXMubGVuZ3RoO24lMz09PTA/dGhpcy5ib2R5Lm1vZHVsZXMuY2x1c3RlcmluZy5jbHVzdGVyQnJpZGdlcygpOnRoaXMuYm9keS5tb2R1bGVzLmNsdXN0ZXJpbmcuY2x1c3Rlck91dGxpZXJzKCk7dmFyIGg9dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLmxlbmd0aDtpZihhPT1oJiZuJTMhPT0wfHxuPm8pcmV0dXJuIHRoaXMuX2RlY2x1c3RlckFsbCgpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9sYXlvdXRGYWlsZWQiKSx2b2lkIGNvbnNvbGUuaW5mbygiVGhpcyBuZXR3b3JrIGNvdWxkIG5vdCBiZSBwb3NpdGlvbmVkIGJ5IHRoaXMgdmVyc2lvbiBvZiB0aGUgaW1wcm92ZWQgbGF5b3V0IGFsZ29yaXRobS4gUGxlYXNlIGRpc2FibGUgaW1wcm92ZWRMYXlvdXQgZm9yIGJldHRlciBwZXJmb3JtYW5jZS4iKX10aGlzLmJvZHkubW9kdWxlcy5rYW1hZGFLYXdhaS5zZXRPcHRpb25zKHtzcHJpbmdMZW5ndGg6TWF0aC5tYXgoMTUwLDIqcil9KX10aGlzLmJvZHkubW9kdWxlcy5rYW1hZGFLYXdhaS5zb2x2ZSh0aGlzLmJvZHkubm9kZUluZGljZXMsdGhpcy5ib2R5LmVkZ2VJbmRpY2VzLCEwKSx0aGlzLl9zaGlmdFRvQ2VudGVyKCk7Zm9yKHZhciBkPTcwLGw9MDtsPHRoaXMuYm9keS5ub2RlSW5kaWNlcy5sZW5ndGg7bCsrKXRoaXMuYm9keS5ub2Rlc1t0aGlzLmJvZHkubm9kZUluZGljZXNbbF1dLnByZWRlZmluZWRQb3NpdGlvbj09PSExJiYodGhpcy5ib2R5Lm5vZGVzW3RoaXMuYm9keS5ub2RlSW5kaWNlc1tsXV0ueCs9KC41LXRoaXMuc2VlZGVkUmFuZG9tKCkpKmQsdGhpcy5ib2R5Lm5vZGVzW3RoaXMuYm9keS5ub2RlSW5kaWNlc1tsXV0ueSs9KC41LXRoaXMuc2VlZGVkUmFuZG9tKCkpKmQpO3RoaXMuX2RlY2x1c3RlckFsbCgpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9yZXBvc2l0aW9uQmV6aWVyTm9kZXMiKX19fX0se2tleToiX3NoaWZ0VG9DZW50ZXIiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PWQuZGVmYXVsdC5nZXRSYW5nZUNvcmUodGhpcy5ib2R5Lm5vZGVzLHRoaXMuYm9keS5ub2RlSW5kaWNlcyksZT1kLmRlZmF1bHQuZmluZENlbnRlcih0KSxpPTA7aTx0aGlzLmJvZHkubm9kZUluZGljZXMubGVuZ3RoO2krKyl0aGlzLmJvZHkubm9kZXNbdGhpcy5ib2R5Lm5vZGVJbmRpY2VzW2ldXS54LT1lLngsdGhpcy5ib2R5Lm5vZGVzW3RoaXMuYm9keS5ub2RlSW5kaWNlc1tpXV0ueS09ZS55fX0se2tleToiX2RlY2x1c3RlckFsbCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9ITA7dD09PSEwOyl7dD0hMTtmb3IodmFyIGU9MDtlPHRoaXMuYm9keS5ub2RlSW5kaWNlcy5sZW5ndGg7ZSsrKXRoaXMuYm9keS5ub2Rlc1t0aGlzLmJvZHkubm9kZUluZGljZXNbZV1dLmlzQ2x1c3Rlcj09PSEwJiYodD0hMCx0aGlzLmJvZHkubW9kdWxlcy5jbHVzdGVyaW5nLm9wZW5DbHVzdGVyKHRoaXMuYm9keS5ub2RlSW5kaWNlc1tlXSx7fSwhMSkpO3Q9PT0hMCYmdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX2RhdGFDaGFuZ2VkIil9fX0se2tleToiZ2V0U2VlZCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbml0aWFsUmFuZG9tU2VlZH19LHtrZXk6InNldHVwSGllcmFyY2hpY2FsTGF5b3V0Iix2YWx1ZTpmdW5jdGlvbigpe2lmKHRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwuZW5hYmxlZD09PSEwJiZ0aGlzLmJvZHkubm9kZUluZGljZXMubGVuZ3RoPjApe3ZhciB0PXZvaWQgMCxlPXZvaWQgMCxpPSExLG89ITAsbj0hMTt0aGlzLmhpZXJhcmNoaWNhbExldmVscz17fSx0aGlzLmxhc3ROb2RlT25MZXZlbD17fSx0aGlzLmhpZXJhcmNoaWNhbENoaWxkcmVuUmVmZXJlbmNlPXt9LHRoaXMuaGllcmFyY2hpY2FsUGFyZW50UmVmZXJlbmNlPXt9LHRoaXMuaGllcmFyY2hpY2FsVHJlZXM9e30sdGhpcy50cmVlSW5kZXg9LTEsdGhpcy5kaXN0cmlidXRpb25PcmRlcmluZz17fSx0aGlzLmRpc3RyaWJ1dGlvbkluZGV4PXt9LHRoaXMuZGlzdHJpYnV0aW9uT3JkZXJpbmdQcmVzZW5jZT17fTtmb3IoZSBpbiB0aGlzLmJvZHkubm9kZXMpdGhpcy5ib2R5Lm5vZGVzLmhhc093blByb3BlcnR5KGUpJiYodD10aGlzLmJvZHkubm9kZXNbZV0sdm9pZCAwPT09dC5vcHRpb25zLngmJnZvaWQgMD09PXQub3B0aW9ucy55JiYobz0hMSksdm9pZCAwIT09dC5vcHRpb25zLmxldmVsPyhpPSEwLHRoaXMuaGllcmFyY2hpY2FsTGV2ZWxzW2VdPXQub3B0aW9ucy5sZXZlbCk6bj0hMCk7aWYobj09PSEwJiZpPT09ITApdGhyb3cgbmV3IEVycm9yKCJUbyB1c2UgdGhlIGhpZXJhcmNoaWNhbCBsYXlvdXQsIG5vZGVzIHJlcXVpcmUgZWl0aGVyIG5vIHByZWRlZmluZWQgbGV2ZWxzIG9yIGxldmVscyBoYXZlIHRvIGJlIGRlZmluZWQgZm9yIGFsbCBub2Rlcy4iKTtuPT09ITAmJigiaHVic2l6ZSI9PT10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLnNvcnRNZXRob2Q/dGhpcy5fZGV0ZXJtaW5lTGV2ZWxzQnlIdWJzaXplKCk6ImRpcmVjdGVkIj09PXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwuc29ydE1ldGhvZD90aGlzLl9kZXRlcm1pbmVMZXZlbHNEaXJlY3RlZCgpOiJjdXN0b20iPT09dGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5zb3J0TWV0aG9kJiZ0aGlzLl9kZXRlcm1pbmVMZXZlbHNDdXN0b21DYWxsYmFjaygpKTtmb3IodmFyIHMgaW4gdGhpcy5ib2R5Lm5vZGVzKXRoaXMuYm9keS5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShzKSYmdm9pZCAwPT09dGhpcy5oaWVyYXJjaGljYWxMZXZlbHNbc10mJih0aGlzLmhpZXJhcmNoaWNhbExldmVsc1tzXT0wKTt2YXIgcj10aGlzLl9nZXREaXN0cmlidXRpb24oKTt0aGlzLl9nZW5lcmF0ZU1hcCgpLHRoaXMuX3BsYWNlTm9kZXNCeUhpZXJhcmNoeShyKSx0aGlzLl9jb25kZW5zZUhpZXJhcmNoeSgpLHRoaXMuX3NoaWZ0VG9DZW50ZXIoKX19fSx7a2V5OiJfY29uZGVuc2VIaWVyYXJjaHkiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPSExLGk9e30sbz1mdW5jdGlvbigpe2Zvcih2YXIgZT1hKCksaT0wO2k8ZS5sZW5ndGgtMTtpKyspe3ZhciBvPWVbaV0ubWF4LWVbaSsxXS5taW47bihpKzEsbyt0Lm9wdGlvbnMuaGllcmFyY2hpY2FsLnRyZWVTcGFjaW5nKX19LG49ZnVuY3Rpb24oZSxpKXtmb3IodmFyIG8gaW4gdC5oaWVyYXJjaGljYWxUcmVlcylpZih0LmhpZXJhcmNoaWNhbFRyZWVzLmhhc093blByb3BlcnR5KG8pJiZ0LmhpZXJhcmNoaWNhbFRyZWVzW29dPT09ZSl7dmFyIG49dC5ib2R5Lm5vZGVzW29dLHM9dC5fZ2V0UG9zaXRpb25Gb3JIaWVyYXJjaHkobik7dC5fc2V0UG9zaXRpb25Gb3JIaWVyYXJjaHkobixzK2ksdm9pZCAwLCEwKX19LHI9ZnVuY3Rpb24oZSl7dmFyIGk9MWU5LG89LTFlOTtmb3IodmFyIG4gaW4gdC5oaWVyYXJjaGljYWxUcmVlcylpZih0LmhpZXJhcmNoaWNhbFRyZWVzLmhhc093blByb3BlcnR5KG4pJiZ0LmhpZXJhcmNoaWNhbFRyZWVzW25dPT09ZSl7dmFyIHM9dC5fZ2V0UG9zaXRpb25Gb3JIaWVyYXJjaHkodC5ib2R5Lm5vZGVzW25dKTtpPU1hdGgubWluKHMsaSksbz1NYXRoLm1heChzLG8pfXJldHVybnttaW46aSxtYXg6b319LGE9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10saT0wO2k8PXQudHJlZUluZGV4O2krKyllLnB1c2gocihpKSk7cmV0dXJuIGV9LGg9ZnVuY3Rpb24gZShpLG8pe2lmKG9baS5pZF09ITAsdC5oaWVyYXJjaGljYWxDaGlsZHJlblJlZmVyZW5jZVtpLmlkXSl7dmFyIG49dC5oaWVyYXJjaGljYWxDaGlsZHJlblJlZmVyZW5jZVtpLmlkXTtpZihuLmxlbmd0aD4wKWZvcih2YXIgcz0wO3M8bi5sZW5ndGg7cysrKWUodC5ib2R5Lm5vZGVzW25bc11dLG8pfX0sZD1mdW5jdGlvbihlKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MWU5LG89MWU5LG49MWU5LHI9MWU5LGE9LTFlOTtmb3IodmFyIGggaW4gZSlpZihlLmhhc093blByb3BlcnR5KGgpKXt2YXIgZD10LmJvZHkubm9kZXNbaF0sbD10LmhpZXJhcmNoaWNhbExldmVsc1tkLmlkXSxjPXQuX2dldFBvc2l0aW9uRm9ySGllcmFyY2h5KGQpLHU9dC5fZ2V0U3BhY2VBcm91bmROb2RlKGQsZSkscD1zKHUsMiksZj1wWzBdLG09cFsxXTtvPU1hdGgubWluKGYsbyksbj1NYXRoLm1pbihtLG4pLGw8PWkmJihyPU1hdGgubWluKGMsciksYT1NYXRoLm1heChjLGEpKX1yZXR1cm5bcixhLG8sbl19LGw9ZnVuY3Rpb24gZShpKXt2YXIgbz10LmhpZXJhcmNoaWNhbExldmVsc1tpXTtpZih0LmhpZXJhcmNoaWNhbENoaWxkcmVuUmVmZXJlbmNlW2ldKXt2YXIgbj10LmhpZXJhcmNoaWNhbENoaWxkcmVuUmVmZXJlbmNlW2ldO2lmKG4ubGVuZ3RoPjApZm9yKHZhciBzPTA7czxuLmxlbmd0aDtzKyspbz1NYXRoLm1heChvLGUobltzXSkpfXJldHVybiBvfSxjPWZ1bmN0aW9uKHQsZSl7dmFyIGk9bCh0LmlkKSxvPWwoZS5pZCk7cmV0dXJuIE1hdGgubWluKGksbyl9LHU9ZnVuY3Rpb24oZSxpKXt2YXIgbz10LmhpZXJhcmNoaWNhbFBhcmVudFJlZmVyZW5jZVtlLmlkXSxuPXQuaGllcmFyY2hpY2FsUGFyZW50UmVmZXJlbmNlW2kuaWRdO2lmKHZvaWQgMD09PW98fHZvaWQgMD09PW4pcmV0dXJuITE7Zm9yKHZhciBzPTA7czxvLmxlbmd0aDtzKyspZm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKyspaWYob1tzXT09bltyXSlyZXR1cm4hMDtyZXR1cm4hMX0scD1mdW5jdGlvbihlLGksbyl7Zm9yKHZhciBuPTA7bjxpLmxlbmd0aDtuKyspe3ZhciBzPWlbbl0scj10LmRpc3RyaWJ1dGlvbk9yZGVyaW5nW3NdO2lmKHIubGVuZ3RoPjEpZm9yKHZhciBhPTA7YTxyLmxlbmd0aC0xO2ErKyl1KHJbYV0sclthKzFdKT09PSEwJiZ0LmhpZXJhcmNoaWNhbFRyZWVzW3JbYV0uaWRdPT09dC5oaWVyYXJjaGljYWxUcmVlc1tyW2ErMV0uaWRdJiZlKHJbYV0sclthKzFdLG8pfX0sZj1mdW5jdGlvbihpLG8pe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl0scj10Ll9nZXRQb3NpdGlvbkZvckhpZXJhcmNoeShpKSxhPXQuX2dldFBvc2l0aW9uRm9ySGllcmFyY2h5KG8pLGw9TWF0aC5hYnMoYS1yKTtpZihsPnQub3B0aW9ucy5oaWVyYXJjaGljYWwubm9kZVNwYWNpbmcpe3ZhciB1PXt9O3VbaS5pZF09ITA7dmFyIHA9e307cFtvLmlkXT0hMCxoKGksdSksaChvLHApO3ZhciBmPWMoaSxvKSxtPWQodSxmKSx2PXMobSw0KSxnPSh2WzBdLHZbMV0pLHk9KHZbMl0sdlszXSxkKHAsZikpLGI9cyh5LDQpLF89YlswXSx3PShiWzFdLGJbMl0pLHg9KGJbM10sTWF0aC5hYnMoZy1fKSk7aWYoeD50Lm9wdGlvbnMuaGllcmFyY2hpY2FsLm5vZGVTcGFjaW5nKXt2YXIgaz1nLV8rdC5vcHRpb25zLmhpZXJhcmNoaWNhbC5ub2RlU3BhY2luZztrPC13K3Qub3B0aW9ucy5oaWVyYXJjaGljYWwubm9kZVNwYWNpbmcmJihrPS13K3Qub3B0aW9ucy5oaWVyYXJjaGljYWwubm9kZVNwYWNpbmcpLGs8MCYmKHQuX3NoaWZ0QmxvY2soby5pZCxrKSxlPSEwLG49PT0hMCYmdC5fY2VudGVyUGFyZW50KG8pKX19fSxtPWZ1bmN0aW9uKG8sbil7Zm9yKHZhciByPW4uaWQsYT1uLmVkZ2VzLGw9dC5oaWVyYXJjaGljYWxMZXZlbHNbbi5pZF0sYz10Lm9wdGlvbnMuaGllcmFyY2hpY2FsLmxldmVsU2VwYXJhdGlvbip0Lm9wdGlvbnMuaGllcmFyY2hpY2FsLmxldmVsU2VwYXJhdGlvbix1PXt9LHA9W10sZj0wO2Y8YS5sZW5ndGg7ZisrKXt2YXIgbT1hW2ZdO2lmKG0udG9JZCE9bS5mcm9tSWQpe3ZhciB2PW0udG9JZD09cj9tLmZyb206bS50bzt1W2FbZl0uaWRdPXYsdC5oaWVyYXJjaGljYWxMZXZlbHNbdi5pZF08bCYmcC5wdXNoKG0pfX12YXIgZz1mdW5jdGlvbihlLGkpe2Zvcih2YXIgbz0wLG49MDtuPGkubGVuZ3RoO24rKylpZih2b2lkIDAhPT11W2lbbl0uaWRdKXt2YXIgcz10Ll9nZXRQb3NpdGlvbkZvckhpZXJhcmNoeSh1W2lbbl0uaWRdKS1lO28rPXMvTWF0aC5zcXJ0KHMqcytjKX1yZXR1cm4gb30seT1mdW5jdGlvbihlLGkpe2Zvcih2YXIgbz0wLG49MDtuPGkubGVuZ3RoO24rKylpZih2b2lkIDAhPT11W2lbbl0uaWRdKXt2YXIgcz10Ll9nZXRQb3NpdGlvbkZvckhpZXJhcmNoeSh1W2lbbl0uaWRdKS1lO28tPWMqTWF0aC5wb3cocypzK2MsLTEuNSl9cmV0dXJuIG99LGI9ZnVuY3Rpb24oZSxpKXtmb3IodmFyIG89dC5fZ2V0UG9zaXRpb25Gb3JIaWVyYXJjaHkobikscz17fSxyPTA7cjxlO3IrKyl7dmFyIGE9ZyhvLGkpLGg9eShvLGkpLGQ9NDAsbD1NYXRoLm1heCgtZCxNYXRoLm1pbihkLE1hdGgucm91bmQoYS9oKSkpO2lmKG8tPWwsdm9pZCAwIT09c1tvXSlicmVhaztzW29dPXJ9cmV0dXJuIG99LF89ZnVuY3Rpb24obyl7dmFyIHI9dC5fZ2V0UG9zaXRpb25Gb3JIaWVyYXJjaHkobik7aWYodm9pZCAwPT09aVtuLmlkXSl7dmFyIGE9e307YVtuLmlkXT0hMCxoKG4sYSksaVtuLmlkXT1hfXZhciBsPWQoaVtuLmlkXSksYz1zKGwsNCksdT0oY1swXSxjWzFdLGNbMl0pLHA9Y1szXSxmPW8tcixtPTA7Zj4wP209TWF0aC5taW4oZixwLXQub3B0aW9ucy5oaWVyYXJjaGljYWwubm9kZVNwYWNpbmcpOmY8MCYmKG09LU1hdGgubWluKC1mLHUtdC5vcHRpb25zLmhpZXJhcmNoaWNhbC5ub2RlU3BhY2luZykpLDAhPW0mJih0Ll9zaGlmdEJsb2NrKG4uaWQsbSksZT0hMCl9LHc9ZnVuY3Rpb24oaSl7dmFyIG89dC5fZ2V0UG9zaXRpb25Gb3JIaWVyYXJjaHkobikscj10Ll9nZXRTcGFjZUFyb3VuZE5vZGUobiksYT1zKHIsMiksaD1hWzBdLGQ9YVsxXSxsPWktbyxjPW87bD4wP2M9TWF0aC5taW4obysoZC10Lm9wdGlvbnMuaGllcmFyY2hpY2FsLm5vZGVTcGFjaW5nKSxpKTpsPDAmJihjPU1hdGgubWF4KG8tKGgtdC5vcHRpb25zLmhpZXJhcmNoaWNhbC5ub2RlU3BhY2luZyksaSkpLGMhPT1vJiYodC5fc2V0UG9zaXRpb25Gb3JIaWVyYXJjaHkobixjLHZvaWQgMCwhMCksZT0hMCl9LHg9YihvLHApO18oeCkseD1iKG8sYSksdyh4KX0sdj1mdW5jdGlvbihpKXt2YXIgbz1PYmplY3Qua2V5cyh0LmRpc3RyaWJ1dGlvbk9yZGVyaW5nKTtvPW8ucmV2ZXJzZSgpO2Zvcih2YXIgbj0wO248aTtuKyspe2U9ITE7Zm9yKHZhciBzPTA7czxvLmxlbmd0aDtzKyspZm9yKHZhciByPW9bc10sYT10LmRpc3RyaWJ1dGlvbk9yZGVyaW5nW3JdLGg9MDtoPGEubGVuZ3RoO2grKyltKDFlMyxhW2hdKTtpZihlIT09ITApYnJlYWt9fSxnPWZ1bmN0aW9uKGkpe3ZhciBvPU9iamVjdC5rZXlzKHQuZGlzdHJpYnV0aW9uT3JkZXJpbmcpOwpvPW8ucmV2ZXJzZSgpO2Zvcih2YXIgbj0wO248aSYmKGU9ITEscChmLG8sITApLGU9PT0hMCk7bisrKTt9LHk9ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdC5ib2R5Lm5vZGVzKXQuYm9keS5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShlKSYmdC5fY2VudGVyUGFyZW50KHQuYm9keS5ub2Rlc1tlXSl9LGI9ZnVuY3Rpb24oKXt2YXIgZT1PYmplY3Qua2V5cyh0LmRpc3RyaWJ1dGlvbk9yZGVyaW5nKTtlPWUucmV2ZXJzZSgpO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKWZvcih2YXIgbz1lW2ldLG49dC5kaXN0cmlidXRpb25PcmRlcmluZ1tvXSxzPTA7czxuLmxlbmd0aDtzKyspdC5fY2VudGVyUGFyZW50KG5bc10pfTt0aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLmJsb2NrU2hpZnRpbmc9PT0hMCYmKGcoNSkseSgpKSx0aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLmVkZ2VNaW5pbWl6YXRpb249PT0hMCYmdigyMCksdGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5wYXJlbnRDZW50cmFsaXphdGlvbj09PSEwJiZiKCksbygpfX0se2tleToiX2dldFNwYWNlQXJvdW5kTm9kZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT0hMDt2b2lkIDA9PT1lJiYoaT0hMSk7dmFyIG89dGhpcy5oaWVyYXJjaGljYWxMZXZlbHNbdC5pZF07aWYodm9pZCAwIT09byl7dmFyIG49dGhpcy5kaXN0cmlidXRpb25JbmRleFt0LmlkXSxzPXRoaXMuX2dldFBvc2l0aW9uRm9ySGllcmFyY2h5KHQpLHI9MWU5LGE9MWU5O2lmKDAhPT1uKXt2YXIgaD10aGlzLmRpc3RyaWJ1dGlvbk9yZGVyaW5nW29dW24tMV07aWYoaT09PSEwJiZ2b2lkIDA9PT1lW2guaWRdfHxpPT09ITEpe3ZhciBkPXRoaXMuX2dldFBvc2l0aW9uRm9ySGllcmFyY2h5KGgpO3I9cy1kfX1pZihuIT10aGlzLmRpc3RyaWJ1dGlvbk9yZGVyaW5nW29dLmxlbmd0aC0xKXt2YXIgbD10aGlzLmRpc3RyaWJ1dGlvbk9yZGVyaW5nW29dW24rMV07aWYoaT09PSEwJiZ2b2lkIDA9PT1lW2wuaWRdfHxpPT09ITEpe3ZhciBjPXRoaXMuX2dldFBvc2l0aW9uRm9ySGllcmFyY2h5KGwpO2E9TWF0aC5taW4oYSxjLXMpfX1yZXR1cm5bcixhXX1yZXR1cm5bMCwwXX19LHtrZXk6Il9jZW50ZXJQYXJlbnQiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHRoaXMuaGllcmFyY2hpY2FsUGFyZW50UmVmZXJlbmNlW3QuaWRdKWZvcih2YXIgZT10aGlzLmhpZXJhcmNoaWNhbFBhcmVudFJlZmVyZW5jZVt0LmlkXSxpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV0sbj10aGlzLmJvZHkubm9kZXNbb107aWYodGhpcy5oaWVyYXJjaGljYWxDaGlsZHJlblJlZmVyZW5jZVtvXSl7dmFyIHI9MWU5LGE9LTFlOSxoPXRoaXMuaGllcmFyY2hpY2FsQ2hpbGRyZW5SZWZlcmVuY2Vbb107aWYoaC5sZW5ndGg+MClmb3IodmFyIGQ9MDtkPGgubGVuZ3RoO2QrKyl7dmFyIGw9dGhpcy5ib2R5Lm5vZGVzW2hbZF1dO3I9TWF0aC5taW4ocix0aGlzLl9nZXRQb3NpdGlvbkZvckhpZXJhcmNoeShsKSksYT1NYXRoLm1heChhLHRoaXMuX2dldFBvc2l0aW9uRm9ySGllcmFyY2h5KGwpKX12YXIgYz10aGlzLl9nZXRQb3NpdGlvbkZvckhpZXJhcmNoeShuKSx1PXRoaXMuX2dldFNwYWNlQXJvdW5kTm9kZShuKSxwPXModSwyKSxmPXBbMF0sbT1wWzFdLHY9LjUqKHIrYSksZz1jLXY7KGc8MCYmTWF0aC5hYnMoZyk8bS10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLm5vZGVTcGFjaW5nfHxnPjAmJk1hdGguYWJzKGcpPGYtdGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5ub2RlU3BhY2luZykmJnRoaXMuX3NldFBvc2l0aW9uRm9ySGllcmFyY2h5KG4sdix2b2lkIDAsITApfX19fSx7a2V5OiJfcGxhY2VOb2Rlc0J5SGllcmFyY2h5Iix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLnBvc2l0aW9uZWROb2Rlcz17fTtmb3IodmFyIGUgaW4gdClpZih0Lmhhc093blByb3BlcnR5KGUpKXt2YXIgaT1PYmplY3Qua2V5cyh0W2VdKTtpPXRoaXMuX2luZGV4QXJyYXlUb05vZGVzKGkpLHRoaXMuX3NvcnROb2RlQXJyYXkoaSk7Zm9yKHZhciBvPTAsbj0wO248aS5sZW5ndGg7bisrKXt2YXIgcz1pW25dO2lmKHZvaWQgMD09PXRoaXMucG9zaXRpb25lZE5vZGVzW3MuaWRdKXt2YXIgcj10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLm5vZGVTcGFjaW5nKm87bz4wJiYocj10aGlzLl9nZXRQb3NpdGlvbkZvckhpZXJhcmNoeShpW24tMV0pK3RoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwubm9kZVNwYWNpbmcpLHRoaXMuX3NldFBvc2l0aW9uRm9ySGllcmFyY2h5KHMscixlKSx0aGlzLl92YWxpZGF0YVBvc2l0aW9uQW5kQ29udGludWUocyxlLHIpLG8rK319fX19LHtrZXk6Il9wbGFjZUJyYW5jaE5vZGVzIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKHZvaWQgMCE9PXRoaXMuaGllcmFyY2hpY2FsQ2hpbGRyZW5SZWZlcmVuY2VbdF0pe2Zvcih2YXIgaT1bXSxvPTA7bzx0aGlzLmhpZXJhcmNoaWNhbENoaWxkcmVuUmVmZXJlbmNlW3RdLmxlbmd0aDtvKyspaS5wdXNoKHRoaXMuYm9keS5ub2Rlc1t0aGlzLmhpZXJhcmNoaWNhbENoaWxkcmVuUmVmZXJlbmNlW3RdW29dXSk7dGhpcy5fc29ydE5vZGVBcnJheShpKTtmb3IodmFyIG49MDtuPGkubGVuZ3RoO24rKyl7dmFyIHM9aVtuXSxyPXRoaXMuaGllcmFyY2hpY2FsTGV2ZWxzW3MuaWRdO2lmKCEocj5lJiZ2b2lkIDA9PT10aGlzLnBvc2l0aW9uZWROb2Rlc1tzLmlkXSkpcmV0dXJuO3ZhciBhPXZvaWQgMDthPTA9PT1uP3RoaXMuX2dldFBvc2l0aW9uRm9ySGllcmFyY2h5KHRoaXMuYm9keS5ub2Rlc1t0XSk6dGhpcy5fZ2V0UG9zaXRpb25Gb3JIaWVyYXJjaHkoaVtuLTFdKSt0aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLm5vZGVTcGFjaW5nLHRoaXMuX3NldFBvc2l0aW9uRm9ySGllcmFyY2h5KHMsYSxyKSx0aGlzLl92YWxpZGF0YVBvc2l0aW9uQW5kQ29udGludWUocyxyLGEpfWZvcih2YXIgaD0xZTksZD0tMWU5LGw9MDtsPGkubGVuZ3RoO2wrKyl7dmFyIGM9aVtsXS5pZDtoPU1hdGgubWluKGgsdGhpcy5fZ2V0UG9zaXRpb25Gb3JIaWVyYXJjaHkodGhpcy5ib2R5Lm5vZGVzW2NdKSksZD1NYXRoLm1heChkLHRoaXMuX2dldFBvc2l0aW9uRm9ySGllcmFyY2h5KHRoaXMuYm9keS5ub2Rlc1tjXSkpfXRoaXMuX3NldFBvc2l0aW9uRm9ySGllcmFyY2h5KHRoaXMuYm9keS5ub2Rlc1t0XSwuNSooaCtkKSxlKX19fSx7a2V5OiJfdmFsaWRhdGFQb3NpdGlvbkFuZENvbnRpbnVlIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7aWYodm9pZCAwIT09dGhpcy5sYXN0Tm9kZU9uTGV2ZWxbZV0pe3ZhciBvPXRoaXMuX2dldFBvc2l0aW9uRm9ySGllcmFyY2h5KHRoaXMuYm9keS5ub2Rlc1t0aGlzLmxhc3ROb2RlT25MZXZlbFtlXV0pO2lmKGktbzx0aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLm5vZGVTcGFjaW5nKXt2YXIgbj1vK3RoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwubm9kZVNwYWNpbmctaSxzPXRoaXMuX2ZpbmRDb21tb25QYXJlbnQodGhpcy5sYXN0Tm9kZU9uTGV2ZWxbZV0sdC5pZCk7dGhpcy5fc2hpZnRCbG9jayhzLndpdGhDaGlsZCxuKX19dGhpcy5sYXN0Tm9kZU9uTGV2ZWxbZV09dC5pZCx0aGlzLnBvc2l0aW9uZWROb2Rlc1t0LmlkXT0hMCx0aGlzLl9wbGFjZUJyYW5jaE5vZGVzKHQuaWQsZSl9fSx7a2V5OiJfaW5kZXhBcnJheVRvTm9kZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxpPTA7aTx0Lmxlbmd0aDtpKyspZS5wdXNoKHRoaXMuYm9keS5ub2Rlc1t0W2ldXSk7cmV0dXJuIGV9fSx7a2V5OiJfZ2V0RGlzdHJpYnV0aW9uIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXt9LGU9dm9pZCAwLGk9dm9pZCAwO2ZvcihlIGluIHRoaXMuYm9keS5ub2RlcylpZih0aGlzLmJvZHkubm9kZXMuaGFzT3duUHJvcGVydHkoZSkpe2k9dGhpcy5ib2R5Lm5vZGVzW2VdO3ZhciBvPXZvaWQgMD09PXRoaXMuaGllcmFyY2hpY2FsTGV2ZWxzW2VdPzA6dGhpcy5oaWVyYXJjaGljYWxMZXZlbHNbZV07IlVEIj09PXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwuZGlyZWN0aW9ufHwiRFUiPT09dGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5kaXJlY3Rpb24/KGkueT10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLmxldmVsU2VwYXJhdGlvbipvLGkub3B0aW9ucy5maXhlZC55PSEwKTooaS54PXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwubGV2ZWxTZXBhcmF0aW9uKm8saS5vcHRpb25zLmZpeGVkLng9ITApLHZvaWQgMD09PXRbb10mJih0W29dPXt9KSx0W29dW2VdPWl9cmV0dXJuIHR9fSx7a2V5OiJfZ2V0SHViU2l6ZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0wO2Zvcih2YXIgZSBpbiB0aGlzLmJvZHkubm9kZXMpaWYodGhpcy5ib2R5Lm5vZGVzLmhhc093blByb3BlcnR5KGUpKXt2YXIgaT10aGlzLmJvZHkubm9kZXNbZV07dm9pZCAwPT09dGhpcy5oaWVyYXJjaGljYWxMZXZlbHNbZV0mJih0PWkuZWRnZXMubGVuZ3RoPHQ/dDppLmVkZ2VzLmxlbmd0aCl9cmV0dXJuIHR9fSx7a2V5OiJfZGV0ZXJtaW5lTGV2ZWxzQnlIdWJzaXplIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLGU9MSxpPWZ1bmN0aW9uKGUsaSl7dm9pZCAwPT09dC5oaWVyYXJjaGljYWxMZXZlbHNbaS5pZF0mJih2b2lkIDA9PT10LmhpZXJhcmNoaWNhbExldmVsc1tlLmlkXSYmKHQuaGllcmFyY2hpY2FsTGV2ZWxzW2UuaWRdPTApLHQuaGllcmFyY2hpY2FsTGV2ZWxzW2kuaWRdPXQuaGllcmFyY2hpY2FsTGV2ZWxzW2UuaWRdKzEpfTtlPjAmJihlPXRoaXMuX2dldEh1YlNpemUoKSwwIT09ZSk7KWZvcih2YXIgbyBpbiB0aGlzLmJvZHkubm9kZXMpaWYodGhpcy5ib2R5Lm5vZGVzLmhhc093blByb3BlcnR5KG8pKXt2YXIgbj10aGlzLmJvZHkubm9kZXNbb107bi5lZGdlcy5sZW5ndGg9PT1lJiZ0aGlzLl9jcmF3bE5ldHdvcmsoaSxvKX19fSx7a2V5OiJfZGV0ZXJtaW5lTGV2ZWxzQ3VzdG9tQ2FsbGJhY2siLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPTFlNSxpPWZ1bmN0aW9uKHQsZSxpKXt9LG89ZnVuY3Rpb24obyxuLHMpe3ZhciByPXQuaGllcmFyY2hpY2FsTGV2ZWxzW28uaWRdO3ZvaWQgMD09PXImJih0LmhpZXJhcmNoaWNhbExldmVsc1tvLmlkXT1lKTt2YXIgYT1pKGQuZGVmYXVsdC5jbG9uZU9wdGlvbnMobywibm9kZSIpLGQuZGVmYXVsdC5jbG9uZU9wdGlvbnMobiwibm9kZSIpLGQuZGVmYXVsdC5jbG9uZU9wdGlvbnMocywiZWRnZSIpKTt0LmhpZXJhcmNoaWNhbExldmVsc1tuLmlkXT10LmhpZXJhcmNoaWNhbExldmVsc1tvLmlkXSthfTt0aGlzLl9jcmF3bE5ldHdvcmsobyksdGhpcy5fc2V0TWluTGV2ZWxUb1plcm8oKX19LHtrZXk6Il9kZXRlcm1pbmVMZXZlbHNEaXJlY3RlZCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9MWU0LGk9ZnVuY3Rpb24oaSxvLG4pe3ZhciBzPXQuaGllcmFyY2hpY2FsTGV2ZWxzW2kuaWRdO3ZvaWQgMD09PXMmJih0LmhpZXJhcmNoaWNhbExldmVsc1tpLmlkXT1lKSxuLnRvSWQ9PW8uaWQ/dC5oaWVyYXJjaGljYWxMZXZlbHNbby5pZF09dC5oaWVyYXJjaGljYWxMZXZlbHNbaS5pZF0rMTp0LmhpZXJhcmNoaWNhbExldmVsc1tvLmlkXT10LmhpZXJhcmNoaWNhbExldmVsc1tpLmlkXS0xfTt0aGlzLl9jcmF3bE5ldHdvcmsoaSksdGhpcy5fc2V0TWluTGV2ZWxUb1plcm8oKX19LHtrZXk6Il9zZXRNaW5MZXZlbFRvWmVybyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0xZTk7Zm9yKHZhciBlIGluIHRoaXMuYm9keS5ub2Rlcyl0aGlzLmJvZHkubm9kZXMuaGFzT3duUHJvcGVydHkoZSkmJnZvaWQgMCE9PXRoaXMuaGllcmFyY2hpY2FsTGV2ZWxzW2VdJiYodD1NYXRoLm1pbih0aGlzLmhpZXJhcmNoaWNhbExldmVsc1tlXSx0KSk7Zm9yKHZhciBpIGluIHRoaXMuYm9keS5ub2Rlcyl0aGlzLmJvZHkubm9kZXMuaGFzT3duUHJvcGVydHkoaSkmJnZvaWQgMCE9PXRoaXMuaGllcmFyY2hpY2FsTGV2ZWxzW2ldJiYodGhpcy5oaWVyYXJjaGljYWxMZXZlbHNbaV0tPXQpfX0se2tleToiX2dlbmVyYXRlTWFwIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1mdW5jdGlvbihlLGkpe2lmKHQuaGllcmFyY2hpY2FsTGV2ZWxzW2kuaWRdPnQuaGllcmFyY2hpY2FsTGV2ZWxzW2UuaWRdKXt2YXIgbz1lLmlkLG49aS5pZDt2b2lkIDA9PT10LmhpZXJhcmNoaWNhbENoaWxkcmVuUmVmZXJlbmNlW29dJiYodC5oaWVyYXJjaGljYWxDaGlsZHJlblJlZmVyZW5jZVtvXT1bXSksdC5oaWVyYXJjaGljYWxDaGlsZHJlblJlZmVyZW5jZVtvXS5wdXNoKG4pLHZvaWQgMD09PXQuaGllcmFyY2hpY2FsUGFyZW50UmVmZXJlbmNlW25dJiYodC5oaWVyYXJjaGljYWxQYXJlbnRSZWZlcmVuY2Vbbl09W10pLHQuaGllcmFyY2hpY2FsUGFyZW50UmVmZXJlbmNlW25dLnB1c2gobyl9fTt0aGlzLl9jcmF3bE5ldHdvcmsoZSl9fSx7a2V5OiJfY3Jhd2xOZXR3b3JrIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06ZnVuY3Rpb24oKXt9LGk9YXJndW1lbnRzWzFdLG89e30sbj0wLHM9ZnVuY3Rpb24gaShuLHMpe2lmKHZvaWQgMD09PW9bbi5pZF0pe3ZvaWQgMD09PXQuaGllcmFyY2hpY2FsVHJlZXNbbi5pZF0mJih0LmhpZXJhcmNoaWNhbFRyZWVzW24uaWRdPXMsdC50cmVlSW5kZXg9TWF0aC5tYXgocyx0LnRyZWVJbmRleCkpLG9bbi5pZF09ITA7Zm9yKHZhciByPXZvaWQgMCxhPTA7YTxuLmVkZ2VzLmxlbmd0aDthKyspbi5lZGdlc1thXS5jb25uZWN0ZWQ9PT0hMCYmKHI9bi5lZGdlc1thXS50b0lkPT09bi5pZD9uLmVkZ2VzW2FdLmZyb206bi5lZGdlc1thXS50byxuLmlkIT09ci5pZCYmKGUobixyLG4uZWRnZXNbYV0pLGkocixzKSkpfX07aWYodm9pZCAwPT09aSlmb3IodmFyIHI9MDtyPHRoaXMuYm9keS5ub2RlSW5kaWNlcy5sZW5ndGg7cisrKXt2YXIgYT10aGlzLmJvZHkubm9kZXNbdGhpcy5ib2R5Lm5vZGVJbmRpY2VzW3JdXTt2b2lkIDA9PT1vW2EuaWRdJiYocyhhLG4pLG4rPTEpfWVsc2V7dmFyIGg9dGhpcy5ib2R5Lm5vZGVzW2ldO2lmKHZvaWQgMD09PWgpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiTm9kZSBub3QgZm91bmQ6IixpKTtzKGgpfX19LHtrZXk6Il9zaGlmdEJsb2NrIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKCJVRCI9PT10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLmRpcmVjdGlvbnx8IkRVIj09PXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwuZGlyZWN0aW9uP3RoaXMuYm9keS5ub2Rlc1t0XS54Kz1lOnRoaXMuYm9keS5ub2Rlc1t0XS55Kz1lLHZvaWQgMCE9PXRoaXMuaGllcmFyY2hpY2FsQ2hpbGRyZW5SZWZlcmVuY2VbdF0pZm9yKHZhciBpPTA7aTx0aGlzLmhpZXJhcmNoaWNhbENoaWxkcmVuUmVmZXJlbmNlW3RdLmxlbmd0aDtpKyspdGhpcy5fc2hpZnRCbG9jayh0aGlzLmhpZXJhcmNoaWNhbENoaWxkcmVuUmVmZXJlbmNlW3RdW2ldLGUpfX0se2tleToiX2ZpbmRDb21tb25QYXJlbnQiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcyxvPXt9LG49ZnVuY3Rpb24gdChlLG8pe2lmKHZvaWQgMCE9PWkuaGllcmFyY2hpY2FsUGFyZW50UmVmZXJlbmNlW29dKWZvcih2YXIgbj0wO248aS5oaWVyYXJjaGljYWxQYXJlbnRSZWZlcmVuY2Vbb10ubGVuZ3RoO24rKyl7dmFyIHM9aS5oaWVyYXJjaGljYWxQYXJlbnRSZWZlcmVuY2Vbb11bbl07ZVtzXT0hMCx0KGUscyl9fSxzPWZ1bmN0aW9uIHQoZSxvKXtpZih2b2lkIDAhPT1pLmhpZXJhcmNoaWNhbFBhcmVudFJlZmVyZW5jZVtvXSlmb3IodmFyIG49MDtuPGkuaGllcmFyY2hpY2FsUGFyZW50UmVmZXJlbmNlW29dLmxlbmd0aDtuKyspe3ZhciBzPWkuaGllcmFyY2hpY2FsUGFyZW50UmVmZXJlbmNlW29dW25dO2lmKHZvaWQgMCE9PWVbc10pcmV0dXJue2ZvdW5kUGFyZW50OnMsd2l0aENoaWxkOm99O3ZhciByPXQoZSxzKTtpZihudWxsIT09ci5mb3VuZFBhcmVudClyZXR1cm4gcn1yZXR1cm57Zm91bmRQYXJlbnQ6bnVsbCx3aXRoQ2hpbGQ6b319O3JldHVybiBuKG8sdCkscyhvLGUpfX0se2tleToiX3NldFBvc2l0aW9uRm9ySGllcmFyY2h5Iix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dmFyIG89YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10mJmFyZ3VtZW50c1szXTtvIT09ITAmJih2b2lkIDA9PT10aGlzLmRpc3RyaWJ1dGlvbk9yZGVyaW5nW2ldJiYodGhpcy5kaXN0cmlidXRpb25PcmRlcmluZ1tpXT1bXSx0aGlzLmRpc3RyaWJ1dGlvbk9yZGVyaW5nUHJlc2VuY2VbaV09e30pLHZvaWQgMD09PXRoaXMuZGlzdHJpYnV0aW9uT3JkZXJpbmdQcmVzZW5jZVtpXVt0LmlkXSYmKHRoaXMuZGlzdHJpYnV0aW9uT3JkZXJpbmdbaV0ucHVzaCh0KSx0aGlzLmRpc3RyaWJ1dGlvbkluZGV4W3QuaWRdPXRoaXMuZGlzdHJpYnV0aW9uT3JkZXJpbmdbaV0ubGVuZ3RoLTEpLHRoaXMuZGlzdHJpYnV0aW9uT3JkZXJpbmdQcmVzZW5jZVtpXVt0LmlkXT0hMCksIlVEIj09PXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwuZGlyZWN0aW9ufHwiRFUiPT09dGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5kaXJlY3Rpb24/dC54PWU6dC55PWV9fSx7a2V5OiJfZ2V0UG9zaXRpb25Gb3JIaWVyYXJjaHkiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiJVRCI9PT10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLmRpcmVjdGlvbnx8IkRVIj09PXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwuZGlyZWN0aW9uP3QueDp0Lnl9fSx7a2V5OiJfc29ydE5vZGVBcnJheSIsdmFsdWU6ZnVuY3Rpb24odCl7dC5sZW5ndGg+MSYmKCJVRCI9PT10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLmRpcmVjdGlvbnx8IkRVIj09PXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwuZGlyZWN0aW9uP3Quc29ydChmdW5jdGlvbih0LGUpe3JldHVybiB0LngtZS54fSk6dC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQueS1lLnl9KSl9fV0pLHR9KCk7ZS5kZWZhdWx0PWN9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBvJiYoby53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsby5rZXksbyl9fXJldHVybiBmdW5jdGlvbihlLGksbyl7cmV0dXJuIGkmJnQoZS5wcm90b3R5cGUsaSksbyYmdChlLG8pLGV9fSgpLHM9aSgxKSxyPWkoMjIpLGE9aSgzMCksaD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxpLG4pe3ZhciByPXRoaXM7byh0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMuY2FudmFzPWksdGhpcy5zZWxlY3Rpb25IYW5kbGVyPW4sdGhpcy5lZGl0TW9kZT0hMSx0aGlzLm1hbmlwdWxhdGlvbkRpdj12b2lkIDAsdGhpcy5lZGl0TW9kZURpdj12b2lkIDAsdGhpcy5jbG9zZURpdj12b2lkIDAsdGhpcy5tYW5pcHVsYXRpb25IYW1tZXJzPVtdLHRoaXMudGVtcG9yYXJ5VUlGdW5jdGlvbnM9e30sdGhpcy50ZW1wb3JhcnlFdmVudEZ1bmN0aW9ucz1bXSx0aGlzLnRvdWNoVGltZT0wLHRoaXMudGVtcG9yYXJ5SWRzPXtub2RlczpbXSxlZGdlczpbXX0sdGhpcy5ndWlFbmFibGVkPSExLHRoaXMuaW5Nb2RlPSExLHRoaXMuc2VsZWN0ZWRDb250cm9sTm9kZT12b2lkIDAsdGhpcy5vcHRpb25zPXt9LHRoaXMuZGVmYXVsdE9wdGlvbnM9e2VuYWJsZWQ6ITEsaW5pdGlhbGx5QWN0aXZlOiExLGFkZE5vZGU6ITAsYWRkRWRnZTohMCxlZGl0Tm9kZTp2b2lkIDAsZWRpdEVkZ2U6ITAsZGVsZXRlTm9kZTohMCxkZWxldGVFZGdlOiEwLGNvbnRyb2xOb2RlU3R5bGU6e3NoYXBlOiJkb3QiLHNpemU6Nixjb2xvcjp7YmFja2dyb3VuZDoiI2ZmMDAwMCIsYm9yZGVyOiIjM2MzYzNjIixoaWdobGlnaHQ6e2JhY2tncm91bmQ6IiMwN2Y5NjgiLGJvcmRlcjoiIzNjM2MzYyJ9fSxib3JkZXJXaWR0aDoyLGJvcmRlcldpZHRoU2VsZWN0ZWQ6Mn19LHMuZXh0ZW5kKHRoaXMub3B0aW9ucyx0aGlzLmRlZmF1bHRPcHRpb25zKSx0aGlzLmJvZHkuZW1pdHRlci5vbigiZGVzdHJveSIsZnVuY3Rpb24oKXtyLl9jbGVhbigpfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oIl9kYXRhQ2hhbmdlZCIsdGhpcy5fcmVzdG9yZS5iaW5kKHRoaXMpKSx0aGlzLmJvZHkuZW1pdHRlci5vbigiX3Jlc2V0RGF0YSIsdGhpcy5fcmVzdG9yZS5iaW5kKHRoaXMpKX1yZXR1cm4gbih0LFt7a2V5OiJfcmVzdG9yZSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmluTW9kZSE9PSExJiYodGhpcy5vcHRpb25zLmluaXRpYWxseUFjdGl2ZT09PSEwP3RoaXMuZW5hYmxlRWRpdE1vZGUoKTp0aGlzLmRpc2FibGVFZGl0TW9kZSgpKX19LHtrZXk6InNldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2b2lkIDAhPT1lJiYodm9pZCAwIT09ZS5sb2NhbGU/dGhpcy5vcHRpb25zLmxvY2FsZT1lLmxvY2FsZTp0aGlzLm9wdGlvbnMubG9jYWxlPWkubG9jYWxlLHZvaWQgMCE9PWUubG9jYWxlcz90aGlzLm9wdGlvbnMubG9jYWxlcz1lLmxvY2FsZXM6dGhpcy5vcHRpb25zLmxvY2FsZXM9aS5sb2NhbGVzKSx2b2lkIDAhPT10JiYoImJvb2xlYW4iPT10eXBlb2YgdD90aGlzLm9wdGlvbnMuZW5hYmxlZD10Oih0aGlzLm9wdGlvbnMuZW5hYmxlZD0hMCxzLmRlZXBFeHRlbmQodGhpcy5vcHRpb25zLHQpKSx0aGlzLm9wdGlvbnMuaW5pdGlhbGx5QWN0aXZlPT09ITAmJih0aGlzLmVkaXRNb2RlPSEwKSx0aGlzLl9zZXR1cCgpKX19LHtrZXk6InRvZ2dsZUVkaXRNb2RlIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuZWRpdE1vZGU9PT0hMD90aGlzLmRpc2FibGVFZGl0TW9kZSgpOnRoaXMuZW5hYmxlRWRpdE1vZGUoKX19LHtrZXk6ImVuYWJsZUVkaXRNb2RlIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuZWRpdE1vZGU9ITAsdGhpcy5fY2xlYW4oKSx0aGlzLmd1aUVuYWJsZWQ9PT0hMCYmKHRoaXMubWFuaXB1bGF0aW9uRGl2LnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLmNsb3NlRGl2LnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLmVkaXRNb2RlRGl2LnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMuc2hvd01hbmlwdWxhdG9yVG9vbGJhcigpKX19LHtrZXk6ImRpc2FibGVFZGl0TW9kZSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmVkaXRNb2RlPSExLHRoaXMuX2NsZWFuKCksdGhpcy5ndWlFbmFibGVkPT09ITAmJih0aGlzLm1hbmlwdWxhdGlvbkRpdi5zdHlsZS5kaXNwbGF5PSJub25lIix0aGlzLmNsb3NlRGl2LnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMuZWRpdE1vZGVEaXYuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuX2NyZWF0ZUVkaXRCdXR0b24oKSl9fSx7a2V5OiJzaG93TWFuaXB1bGF0b3JUb29sYmFyIix2YWx1ZTpmdW5jdGlvbigpe2lmKHRoaXMuX2NsZWFuKCksdGhpcy5tYW5pcHVsYXRpb25ET009e30sdGhpcy5ndWlFbmFibGVkPT09ITApe3RoaXMuZWRpdE1vZGU9ITAsdGhpcy5tYW5pcHVsYXRpb25EaXYuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuY2xvc2VEaXYuc3R5bGUuZGlzcGxheT0iYmxvY2siO3ZhciB0PXRoaXMuc2VsZWN0aW9uSGFuZGxlci5fZ2V0U2VsZWN0ZWROb2RlQ291bnQoKSxlPXRoaXMuc2VsZWN0aW9uSGFuZGxlci5fZ2V0U2VsZWN0ZWRFZGdlQ291bnQoKSxpPXQrZSxvPXRoaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdLG49ITE7dGhpcy5vcHRpb25zLmFkZE5vZGUhPT0hMSYmKHRoaXMuX2NyZWF0ZUFkZE5vZGVCdXR0b24obyksbj0hMCksdGhpcy5vcHRpb25zLmFkZEVkZ2UhPT0hMSYmKG49PT0hMD90aGlzLl9jcmVhdGVTZXBlcmF0b3IoMSk6bj0hMCx0aGlzLl9jcmVhdGVBZGRFZGdlQnV0dG9uKG8pKSwxPT09dCYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMub3B0aW9ucy5lZGl0Tm9kZT8obj09PSEwP3RoaXMuX2NyZWF0ZVNlcGVyYXRvcigyKTpuPSEwLHRoaXMuX2NyZWF0ZUVkaXROb2RlQnV0dG9uKG8pKToxPT09ZSYmMD09PXQmJnRoaXMub3B0aW9ucy5lZGl0RWRnZSE9PSExJiYobj09PSEwP3RoaXMuX2NyZWF0ZVNlcGVyYXRvcigzKTpuPSEwLHRoaXMuX2NyZWF0ZUVkaXRFZGdlQnV0dG9uKG8pKSwwIT09aSYmKHQ+MCYmdGhpcy5vcHRpb25zLmRlbGV0ZU5vZGUhPT0hMT8obj09PSEwJiZ0aGlzLl9jcmVhdGVTZXBlcmF0b3IoNCksdGhpcy5fY3JlYXRlRGVsZXRlQnV0dG9uKG8pKTowPT09dCYmdGhpcy5vcHRpb25zLmRlbGV0ZUVkZ2UhPT0hMSYmKG49PT0hMCYmdGhpcy5fY3JlYXRlU2VwZXJhdG9yKDQpLHRoaXMuX2NyZWF0ZURlbGV0ZUJ1dHRvbihvKSkpLHRoaXMuX2JpbmRIYW1tZXJUb0Rpdih0aGlzLmNsb3NlRGl2LHRoaXMudG9nZ2xlRWRpdE1vZGUuYmluZCh0aGlzKSksdGhpcy5fdGVtcG9yYXJ5QmluZEV2ZW50KCJzZWxlY3QiLHRoaXMuc2hvd01hbmlwdWxhdG9yVG9vbGJhci5iaW5kKHRoaXMpKX10aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJfcmVkcmF3Iil9fSx7a2V5OiJhZGROb2RlTW9kZSIsdmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlzLmVkaXRNb2RlIT09ITAmJnRoaXMuZW5hYmxlRWRpdE1vZGUoKSx0aGlzLl9jbGVhbigpLHRoaXMuaW5Nb2RlPSJhZGROb2RlIix0aGlzLmd1aUVuYWJsZWQ9PT0hMCl7dmFyIHQ9dGhpcy5vcHRpb25zLmxvY2FsZXNbdGhpcy5vcHRpb25zLmxvY2FsZV07dGhpcy5tYW5pcHVsYXRpb25ET009e30sdGhpcy5fY3JlYXRlQmFja0J1dHRvbih0KSx0aGlzLl9jcmVhdGVTZXBlcmF0b3IoKSx0aGlzLl9jcmVhdGVEZXNjcmlwdGlvbih0LmFkZERlc2NyaXB0aW9ufHx0aGlzLm9wdGlvbnMubG9jYWxlcy5lbi5hZGREZXNjcmlwdGlvbiksdGhpcy5fYmluZEhhbW1lclRvRGl2KHRoaXMuY2xvc2VEaXYsdGhpcy50b2dnbGVFZGl0TW9kZS5iaW5kKHRoaXMpKX10aGlzLl90ZW1wb3JhcnlCaW5kRXZlbnQoImNsaWNrIix0aGlzLl9wZXJmb3JtQWRkTm9kZS5iaW5kKHRoaXMpKX19LHtrZXk6ImVkaXROb2RlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5lZGl0TW9kZSE9PSEwJiZ0aGlzLmVuYWJsZUVkaXRNb2RlKCksdGhpcy5fY2xlYW4oKTt2YXIgZT10aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dldFNlbGVjdGVkTm9kZSgpO2lmKHZvaWQgMCE9PWUpe2lmKHRoaXMuaW5Nb2RlPSJlZGl0Tm9kZSIsImZ1bmN0aW9uIiE9dHlwZW9mIHRoaXMub3B0aW9ucy5lZGl0Tm9kZSl0aHJvdyBuZXcgRXJyb3IoIk5vIGZ1bmN0aW9uIGhhcyBiZWVuIGNvbmZpZ3VyZWQgdG8gaGFuZGxlIHRoZSBlZGl0aW5nIG9mIG5vZGVzLiIpO2lmKGUuaXNDbHVzdGVyIT09ITApe3ZhciBpPXMuZGVlcEV4dGVuZCh7fSxlLm9wdGlvbnMsITEpO2lmKGkueD1lLngsaS55PWUueSwyIT09dGhpcy5vcHRpb25zLmVkaXROb2RlLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlRoZSBmdW5jdGlvbiBmb3IgZWRpdCBkb2VzIG5vdCBzdXBwb3J0IHR3byBhcmd1bWVudHMgKGRhdGEsIGNhbGxiYWNrKSIpO3RoaXMub3B0aW9ucy5lZGl0Tm9kZShpLGZ1bmN0aW9uKGUpe251bGwhPT1lJiZ2b2lkIDAhPT1lJiYiZWRpdE5vZGUiPT09dC5pbk1vZGUmJnQuYm9keS5kYXRhLm5vZGVzLmdldERhdGFTZXQoKS51cGRhdGUoZSksdC5zaG93TWFuaXB1bGF0b3JUb29sYmFyKCl9KX1lbHNlIGFsZXJ0KHRoaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdLmVkaXRDbHVzdGVyRXJyb3J8fHRoaXMub3B0aW9ucy5sb2NhbGVzLmVuLmVkaXRDbHVzdGVyRXJyb3IpfWVsc2UgdGhpcy5zaG93TWFuaXB1bGF0b3JUb29sYmFyKCl9fSx7a2V5OiJhZGRFZGdlTW9kZSIsdmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlzLmVkaXRNb2RlIT09ITAmJnRoaXMuZW5hYmxlRWRpdE1vZGUoKSx0aGlzLl9jbGVhbigpLHRoaXMuaW5Nb2RlPSJhZGRFZGdlIix0aGlzLmd1aUVuYWJsZWQ9PT0hMCl7dmFyIHQ9dGhpcy5vcHRpb25zLmxvY2FsZXNbdGhpcy5vcHRpb25zLmxvY2FsZV07dGhpcy5tYW5pcHVsYXRpb25ET009e30sdGhpcy5fY3JlYXRlQmFja0J1dHRvbih0KSx0aGlzLl9jcmVhdGVTZXBlcmF0b3IoKSx0aGlzLl9jcmVhdGVEZXNjcmlwdGlvbih0LmVkZ2VEZXNjcmlwdGlvbnx8dGhpcy5vcHRpb25zLmxvY2FsZXMuZW4uZWRnZURlc2NyaXB0aW9uKSx0aGlzLl9iaW5kSGFtbWVyVG9EaXYodGhpcy5jbG9zZURpdix0aGlzLnRvZ2dsZUVkaXRNb2RlLmJpbmQodGhpcykpfXRoaXMuX3RlbXBvcmFyeUJpbmRVSSgib25Ub3VjaCIsdGhpcy5faGFuZGxlQ29ubmVjdC5iaW5kKHRoaXMpKSx0aGlzLl90ZW1wb3JhcnlCaW5kVUkoIm9uRHJhZ0VuZCIsdGhpcy5fZmluaXNoQ29ubmVjdC5iaW5kKHRoaXMpKSx0aGlzLl90ZW1wb3JhcnlCaW5kVUkoIm9uRHJhZyIsdGhpcy5fZHJhZ0NvbnRyb2xOb2RlLmJpbmQodGhpcykpLHRoaXMuX3RlbXBvcmFyeUJpbmRVSSgib25SZWxlYXNlIix0aGlzLl9maW5pc2hDb25uZWN0LmJpbmQodGhpcykpLHRoaXMuX3RlbXBvcmFyeUJpbmRVSSgib25EcmFnU3RhcnQiLGZ1bmN0aW9uKCl7fSksdGhpcy5fdGVtcG9yYXJ5QmluZFVJKCJvbkhvbGQiLGZ1bmN0aW9uKCl7fSl9fSx7a2V5OiJlZGl0RWRnZU1vZGUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZih0aGlzLmVkaXRNb2RlIT09ITAmJnRoaXMuZW5hYmxlRWRpdE1vZGUoKSx0aGlzLl9jbGVhbigpLHRoaXMuaW5Nb2RlPSJlZGl0RWRnZSIsdGhpcy5ndWlFbmFibGVkPT09ITApe3ZhciBlPXRoaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdO3RoaXMubWFuaXB1bGF0aW9uRE9NPXt9LHRoaXMuX2NyZWF0ZUJhY2tCdXR0b24oZSksdGhpcy5fY3JlYXRlU2VwZXJhdG9yKCksdGhpcy5fY3JlYXRlRGVzY3JpcHRpb24oZS5lZGl0RWRnZURlc2NyaXB0aW9ufHx0aGlzLm9wdGlvbnMubG9jYWxlcy5lbi5lZGl0RWRnZURlc2NyaXB0aW9uKSx0aGlzLl9iaW5kSGFtbWVyVG9EaXYodGhpcy5jbG9zZURpdix0aGlzLnRvZ2dsZUVkaXRNb2RlLmJpbmQodGhpcykpfXRoaXMuZWRnZUJlaW5nRWRpdGVkSWQ9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldFNlbGVjdGVkRWRnZXMoKVswXSx2b2lkIDAhPT10aGlzLmVkZ2VCZWluZ0VkaXRlZElkPyFmdW5jdGlvbigpe3ZhciBlPXQuYm9keS5lZGdlc1t0LmVkZ2VCZWluZ0VkaXRlZElkXSxpPXQuX2dldE5ld1RhcmdldE5vZGUoZS5mcm9tLngsZS5mcm9tLnkpLG89dC5fZ2V0TmV3VGFyZ2V0Tm9kZShlLnRvLngsZS50by55KTt0LnRlbXBvcmFyeUlkcy5ub2Rlcy5wdXNoKGkuaWQpLHQudGVtcG9yYXJ5SWRzLm5vZGVzLnB1c2goby5pZCksdC5ib2R5Lm5vZGVzW2kuaWRdPWksdC5ib2R5Lm5vZGVJbmRpY2VzLnB1c2goaS5pZCksdC5ib2R5Lm5vZGVzW28uaWRdPW8sdC5ib2R5Lm5vZGVJbmRpY2VzLnB1c2goby5pZCksdC5fdGVtcG9yYXJ5QmluZFVJKCJvblRvdWNoIix0Ll9jb250cm9sTm9kZVRvdWNoLmJpbmQodCkpLHQuX3RlbXBvcmFyeUJpbmRVSSgib25UYXAiLGZ1bmN0aW9uKCl7fSksdC5fdGVtcG9yYXJ5QmluZFVJKCJvbkhvbGQiLGZ1bmN0aW9uKCl7fSksdC5fdGVtcG9yYXJ5QmluZFVJKCJvbkRyYWdTdGFydCIsdC5fY29udHJvbE5vZGVEcmFnU3RhcnQuYmluZCh0KSksdC5fdGVtcG9yYXJ5QmluZFVJKCJvbkRyYWciLHQuX2NvbnRyb2xOb2RlRHJhZy5iaW5kKHQpKSx0Ll90ZW1wb3JhcnlCaW5kVUkoIm9uRHJhZ0VuZCIsdC5fY29udHJvbE5vZGVEcmFnRW5kLmJpbmQodCkpLHQuX3RlbXBvcmFyeUJpbmRVSSgib25Nb3VzZU1vdmUiLGZ1bmN0aW9uKCl7fSksdC5fdGVtcG9yYXJ5QmluZEV2ZW50KCJiZWZvcmVEcmF3aW5nIixmdW5jdGlvbih0KXt2YXIgbj1lLmVkZ2VUeXBlLmZpbmRCb3JkZXJQb3NpdGlvbnModCk7aS5zZWxlY3RlZD09PSExJiYoaS54PW4uZnJvbS54LGkueT1uLmZyb20ueSksby5zZWxlY3RlZD09PSExJiYoby54PW4udG8ueCxvLnk9bi50by55KX0pLHQuYm9keS5lbWl0dGVyLmVtaXQoIl9yZWRyYXciKX0oKTp0aGlzLnNob3dNYW5pcHVsYXRvclRvb2xiYXIoKX19LHtrZXk6ImRlbGV0ZVNlbGVjdGVkIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5lZGl0TW9kZSE9PSEwJiZ0aGlzLmVuYWJsZUVkaXRNb2RlKCksdGhpcy5fY2xlYW4oKSx0aGlzLmluTW9kZT0iZGVsZXRlIjt2YXIgZT10aGlzLnNlbGVjdGlvbkhhbmRsZXIuZ2V0U2VsZWN0ZWROb2RlcygpLGk9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldFNlbGVjdGVkRWRnZXMoKSxvPXZvaWQgMDtpZihlLmxlbmd0aD4wKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylpZih0aGlzLmJvZHkubm9kZXNbZVtuXV0uaXNDbHVzdGVyPT09ITApcmV0dXJuIHZvaWQgYWxlcnQodGhpcy5vcHRpb25zLmxvY2FsZXNbdGhpcy5vcHRpb25zLmxvY2FsZV0uZGVsZXRlQ2x1c3RlckVycm9yfHx0aGlzLm9wdGlvbnMubG9jYWxlcy5lbi5kZWxldGVDbHVzdGVyRXJyb3IpOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLm9wdGlvbnMuZGVsZXRlTm9kZSYmKG89dGhpcy5vcHRpb25zLmRlbGV0ZU5vZGUpfWVsc2UgaS5sZW5ndGg+MCYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMub3B0aW9ucy5kZWxldGVFZGdlJiYobz10aGlzLm9wdGlvbnMuZGVsZXRlRWRnZSk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG8pe3ZhciBzPXtub2RlczplLGVkZ2VzOml9O2lmKDIhPT1vLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlRoZSBmdW5jdGlvbiBmb3IgZGVsZXRlIGRvZXMgbm90IHN1cHBvcnQgdHdvIGFyZ3VtZW50cyAoZGF0YSwgY2FsbGJhY2spIik7byhzLGZ1bmN0aW9uKGUpe251bGwhPT1lJiZ2b2lkIDAhPT1lJiYiZGVsZXRlIj09PXQuaW5Nb2RlPyh0LmJvZHkuZGF0YS5lZGdlcy5nZXREYXRhU2V0KCkucmVtb3ZlKGUuZWRnZXMpLHQuYm9keS5kYXRhLm5vZGVzLmdldERhdGFTZXQoKS5yZW1vdmUoZS5ub2RlcyksdC5ib2R5LmVtaXR0ZXIuZW1pdCgic3RhcnRTaW11bGF0aW9uIiksdC5zaG93TWFuaXB1bGF0b3JUb29sYmFyKCkpOih0LmJvZHkuZW1pdHRlci5lbWl0KCJzdGFydFNpbXVsYXRpb24iKSx0LnNob3dNYW5pcHVsYXRvclRvb2xiYXIoKSl9KX1lbHNlIHRoaXMuYm9keS5kYXRhLmVkZ2VzLmdldERhdGFTZXQoKS5yZW1vdmUoaSksdGhpcy5ib2R5LmRhdGEubm9kZXMuZ2V0RGF0YVNldCgpLnJlbW92ZShlKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJzdGFydFNpbXVsYXRpb24iKSx0aGlzLnNob3dNYW5pcHVsYXRvclRvb2xiYXIoKX19LHtrZXk6Il9zZXR1cCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuZW5hYmxlZD09PSEwPyh0aGlzLmd1aUVuYWJsZWQ9ITAsdGhpcy5fY3JlYXRlV3JhcHBlcnMoKSx0aGlzLmVkaXRNb2RlPT09ITE/dGhpcy5fY3JlYXRlRWRpdEJ1dHRvbigpOnRoaXMuc2hvd01hbmlwdWxhdG9yVG9vbGJhcigpKToodGhpcy5fcmVtb3ZlTWFuaXB1bGF0aW9uRE9NKCksdGhpcy5ndWlFbmFibGVkPSExKX19LHtrZXk6Il9jcmVhdGVXcmFwcGVycyIsdmFsdWU6ZnVuY3Rpb24oKXt2b2lkIDA9PT10aGlzLm1hbmlwdWxhdGlvbkRpdiYmKHRoaXMubWFuaXB1bGF0aW9uRGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMubWFuaXB1bGF0aW9uRGl2LmNsYXNzTmFtZT0idmlzLW1hbmlwdWxhdGlvbiIsdGhpcy5lZGl0TW9kZT09PSEwP3RoaXMubWFuaXB1bGF0aW9uRGl2LnN0eWxlLmRpc3BsYXk9ImJsb2NrIjp0aGlzLm1hbmlwdWxhdGlvbkRpdi5zdHlsZS5kaXNwbGF5PSJub25lIix0aGlzLmNhbnZhcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLm1hbmlwdWxhdGlvbkRpdikpLHZvaWQgMD09PXRoaXMuZWRpdE1vZGVEaXYmJih0aGlzLmVkaXRNb2RlRGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZWRpdE1vZGVEaXYuY2xhc3NOYW1lPSJ2aXMtZWRpdC1tb2RlIix0aGlzLmVkaXRNb2RlPT09ITA/dGhpcy5lZGl0TW9kZURpdi5zdHlsZS5kaXNwbGF5PSJub25lIjp0aGlzLmVkaXRNb2RlRGl2LnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLmNhbnZhcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmVkaXRNb2RlRGl2KSksdm9pZCAwPT09dGhpcy5jbG9zZURpdiYmKHRoaXMuY2xvc2VEaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jbG9zZURpdi5jbGFzc05hbWU9InZpcy1jbG9zZSIsdGhpcy5jbG9zZURpdi5zdHlsZS5kaXNwbGF5PXRoaXMubWFuaXB1bGF0aW9uRGl2LnN0eWxlLmRpc3BsYXksdGhpcy5jYW52YXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5jbG9zZURpdikpfX0se2tleToiX2dldE5ld1RhcmdldE5vZGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9cy5kZWVwRXh0ZW5kKHt9LHRoaXMub3B0aW9ucy5jb250cm9sTm9kZVN0eWxlKTtpLmlkPSJ0YXJnZXROb2RlIitzLnJhbmRvbVVVSUQoKSxpLmhpZGRlbj0hMSxpLnBoeXNpY3M9ITEsaS54PXQsaS55PWU7dmFyIG89dGhpcy5ib2R5LmZ1bmN0aW9ucy5jcmVhdGVOb2RlKGkpO3JldHVybiBvLnNoYXBlLmJvdW5kaW5nQm94PXtsZWZ0OnQscmlnaHQ6dCx0b3A6ZSxib3R0b206ZX0sb319LHtrZXk6Il9jcmVhdGVFZGl0QnV0dG9uIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuX2NsZWFuKCksdGhpcy5tYW5pcHVsYXRpb25ET009e30scy5yZWN1cnNpdmVET01EZWxldGUodGhpcy5lZGl0TW9kZURpdik7dmFyIHQ9dGhpcy5vcHRpb25zLmxvY2FsZXNbdGhpcy5vcHRpb25zLmxvY2FsZV0sZT10aGlzLl9jcmVhdGVCdXR0b24oImVkaXRNb2RlIiwidmlzLWJ1dHRvbiB2aXMtZWRpdCB2aXMtZWRpdC1tb2RlIix0LmVkaXR8fHRoaXMub3B0aW9ucy5sb2NhbGVzLmVuLmVkaXQpO3RoaXMuZWRpdE1vZGVEaXYuYXBwZW5kQ2hpbGQoZSksdGhpcy5fYmluZEhhbW1lclRvRGl2KGUsdGhpcy50b2dnbGVFZGl0TW9kZS5iaW5kKHRoaXMpKX19LHtrZXk6Il9jbGVhbiIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmluTW9kZT0hMSx0aGlzLmd1aUVuYWJsZWQ9PT0hMCYmKHMucmVjdXJzaXZlRE9NRGVsZXRlKHRoaXMuZWRpdE1vZGVEaXYpLHMucmVjdXJzaXZlRE9NRGVsZXRlKHRoaXMubWFuaXB1bGF0aW9uRGl2KSx0aGlzLl9jbGVhbk1hbmlwdWxhdG9ySGFtbWVycygpKSx0aGlzLl9jbGVhbnVwVGVtcG9yYXJ5Tm9kZXNBbmRFZGdlcygpLHRoaXMuX3VuYmluZFRlbXBvcmFyeVVJcygpLHRoaXMuX3VuYmluZFRlbXBvcmFyeUV2ZW50cygpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoInJlc3RvcmVQaHlzaWNzIil9fSx7a2V5OiJfY2xlYW5NYW5pcHVsYXRvckhhbW1lcnMiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoMCE9dGhpcy5tYW5pcHVsYXRpb25IYW1tZXJzLmxlbmd0aCl7Zm9yKHZhciB0PTA7dDx0aGlzLm1hbmlwdWxhdGlvbkhhbW1lcnMubGVuZ3RoO3QrKyl0aGlzLm1hbmlwdWxhdGlvbkhhbW1lcnNbdF0uZGVzdHJveSgpO3RoaXMubWFuaXB1bGF0aW9uSGFtbWVycz1bXX19fSx7a2V5OiJfcmVtb3ZlTWFuaXB1bGF0aW9uRE9NIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuX2NsZWFuKCkscy5yZWN1cnNpdmVET01EZWxldGUodGhpcy5tYW5pcHVsYXRpb25EaXYpLHMucmVjdXJzaXZlRE9NRGVsZXRlKHRoaXMuZWRpdE1vZGVEaXYpLHMucmVjdXJzaXZlRE9NRGVsZXRlKHRoaXMuY2xvc2VEaXYpLHRoaXMubWFuaXB1bGF0aW9uRGl2JiZ0aGlzLmNhbnZhcy5mcmFtZS5yZW1vdmVDaGlsZCh0aGlzLm1hbmlwdWxhdGlvbkRpdiksdGhpcy5lZGl0TW9kZURpdiYmdGhpcy5jYW52YXMuZnJhbWUucmVtb3ZlQ2hpbGQodGhpcy5lZGl0TW9kZURpdiksdGhpcy5jbG9zZURpdiYmdGhpcy5jYW52YXMuZnJhbWUucmVtb3ZlQ2hpbGQodGhpcy5jbG9zZURpdiksdGhpcy5tYW5pcHVsYXRpb25EaXY9dm9pZCAwLHRoaXMuZWRpdE1vZGVEaXY9dm9pZCAwLHRoaXMuY2xvc2VEaXY9dm9pZCAwfX0se2tleToiX2NyZWF0ZVNlcGVyYXRvciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06MTt0aGlzLm1hbmlwdWxhdGlvbkRPTVsic2VwZXJhdG9yTGluZURpdiIrdF09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5tYW5pcHVsYXRpb25ET01bInNlcGVyYXRvckxpbmVEaXYiK3RdLmNsYXNzTmFtZT0idmlzLXNlcGFyYXRvci1saW5lIix0aGlzLm1hbmlwdWxhdGlvbkRpdi5hcHBlbmRDaGlsZCh0aGlzLm1hbmlwdWxhdGlvbkRPTVsic2VwZXJhdG9yTGluZURpdiIrdF0pfX0se2tleToiX2NyZWF0ZUFkZE5vZGVCdXR0b24iLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2NyZWF0ZUJ1dHRvbigiYWRkTm9kZSIsInZpcy1idXR0b24gdmlzLWFkZCIsdC5hZGROb2RlfHx0aGlzLm9wdGlvbnMubG9jYWxlcy5lbi5hZGROb2RlKTt0aGlzLm1hbmlwdWxhdGlvbkRpdi5hcHBlbmRDaGlsZChlKSx0aGlzLl9iaW5kSGFtbWVyVG9EaXYoZSx0aGlzLmFkZE5vZGVNb2RlLmJpbmQodGhpcykpfX0se2tleToiX2NyZWF0ZUFkZEVkZ2VCdXR0b24iLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2NyZWF0ZUJ1dHRvbigiYWRkRWRnZSIsInZpcy1idXR0b24gdmlzLWNvbm5lY3QiLHQuYWRkRWRnZXx8dGhpcy5vcHRpb25zLmxvY2FsZXMuZW4uYWRkRWRnZSk7dGhpcy5tYW5pcHVsYXRpb25EaXYuYXBwZW5kQ2hpbGQoZSksdGhpcy5fYmluZEhhbW1lclRvRGl2KGUsdGhpcy5hZGRFZGdlTW9kZS5iaW5kKHRoaXMpKX19LHtrZXk6Il9jcmVhdGVFZGl0Tm9kZUJ1dHRvbiIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fY3JlYXRlQnV0dG9uKCJlZGl0Tm9kZSIsInZpcy1idXR0b24gdmlzLWVkaXQiLHQuZWRpdE5vZGV8fHRoaXMub3B0aW9ucy5sb2NhbGVzLmVuLmVkaXROb2RlKTt0aGlzLm1hbmlwdWxhdGlvbkRpdi5hcHBlbmRDaGlsZChlKSx0aGlzLl9iaW5kSGFtbWVyVG9EaXYoZSx0aGlzLmVkaXROb2RlLmJpbmQodGhpcykpfX0se2tleToiX2NyZWF0ZUVkaXRFZGdlQnV0dG9uIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9jcmVhdGVCdXR0b24oImVkaXRFZGdlIiwidmlzLWJ1dHRvbiB2aXMtZWRpdCIsdC5lZGl0RWRnZXx8dGhpcy5vcHRpb25zLmxvY2FsZXMuZW4uZWRpdEVkZ2UpO3RoaXMubWFuaXB1bGF0aW9uRGl2LmFwcGVuZENoaWxkKGUpLHRoaXMuX2JpbmRIYW1tZXJUb0RpdihlLHRoaXMuZWRpdEVkZ2VNb2RlLmJpbmQodGhpcykpfX0se2tleToiX2NyZWF0ZURlbGV0ZUJ1dHRvbiIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodGhpcy5vcHRpb25zLnJ0bCl2YXIgZT0idmlzLWJ1dHRvbiB2aXMtZGVsZXRlLXJ0bCI7ZWxzZSB2YXIgZT0idmlzLWJ1dHRvbiB2aXMtZGVsZXRlIjt2YXIgaT10aGlzLl9jcmVhdGVCdXR0b24oImRlbGV0ZSIsZSx0LmRlbHx8dGhpcy5vcHRpb25zLmxvY2FsZXMuZW4uZGVsKTt0aGlzLm1hbmlwdWxhdGlvbkRpdi5hcHBlbmRDaGlsZChpKSx0aGlzLl9iaW5kSGFtbWVyVG9EaXYoaSx0aGlzLmRlbGV0ZVNlbGVjdGVkLmJpbmQodGhpcykpfX0se2tleToiX2NyZWF0ZUJhY2tCdXR0b24iLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2NyZWF0ZUJ1dHRvbigiYmFjayIsInZpcy1idXR0b24gdmlzLWJhY2siLHQuYmFja3x8dGhpcy5vcHRpb25zLmxvY2FsZXMuZW4uYmFjayk7dGhpcy5tYW5pcHVsYXRpb25EaXYuYXBwZW5kQ2hpbGQoZSksdGhpcy5fYmluZEhhbW1lclRvRGl2KGUsdGhpcy5zaG93TWFuaXB1bGF0b3JUb29sYmFyLmJpbmQodGhpcykpfX0se2tleToiX2NyZWF0ZUJ1dHRvbiIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXToidmlzLWxhYmVsIjtyZXR1cm4gdGhpcy5tYW5pcHVsYXRpb25ET01bdCsiRGl2Il09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5tYW5pcHVsYXRpb25ET01bdCsiRGl2Il0uY2xhc3NOYW1lPWUsdGhpcy5tYW5pcHVsYXRpb25ET01bdCsiTGFiZWwiXT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLm1hbmlwdWxhdGlvbkRPTVt0KyJMYWJlbCJdLmNsYXNzTmFtZT1vLHRoaXMubWFuaXB1bGF0aW9uRE9NW3QrIkxhYmVsIl0uaW5uZXJIVE1MPWksdGhpcy5tYW5pcHVsYXRpb25ET01bdCsiRGl2Il0uYXBwZW5kQ2hpbGQodGhpcy5tYW5pcHVsYXRpb25ET01bdCsiTGFiZWwiXSksdGhpcy5tYW5pcHVsYXRpb25ET01bdCsiRGl2Il19fSx7a2V5OiJfY3JlYXRlRGVzY3JpcHRpb24iLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMubWFuaXB1bGF0aW9uRGl2LmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZUJ1dHRvbigiZGVzY3JpcHRpb24iLCJ2aXMtYnV0dG9uIHZpcy1ub25lIix0KSl9fSx7a2V5OiJfdGVtcG9yYXJ5QmluZEV2ZW50Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMudGVtcG9yYXJ5RXZlbnRGdW5jdGlvbnMucHVzaCh7ZXZlbnQ6dCxib3VuZEZ1bmN0aW9uOmV9KSx0aGlzLmJvZHkuZW1pdHRlci5vbih0LGUpfX0se2tleToiX3RlbXBvcmFyeUJpbmRVSSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtpZih2b2lkIDA9PT10aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnNbdF0pdGhyb3cgbmV3IEVycm9yKCJUaGlzIFVJIGZ1bmN0aW9uIGRvZXMgbm90IGV4aXN0LiBUeXBvPyBZb3UgdHJpZWQ6ICIrdCsiIHBvc3NpYmxlIGFyZTogIitKU09OLnN0cmluZ2lmeShPYmplY3Qua2V5cyh0aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnMpKSk7dGhpcy50ZW1wb3JhcnlVSUZ1bmN0aW9uc1t0XT10aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnNbdF0sdGhpcy5ib2R5LmV2ZW50TGlzdGVuZXJzW3RdPWV9fSx7a2V5OiJfdW5iaW5kVGVtcG9yYXJ5VUlzIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLnRlbXBvcmFyeVVJRnVuY3Rpb25zKXRoaXMudGVtcG9yYXJ5VUlGdW5jdGlvbnMuaGFzT3duUHJvcGVydHkodCkmJih0aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnNbdF09dGhpcy50ZW1wb3JhcnlVSUZ1bmN0aW9uc1t0XSxkZWxldGUgdGhpcy50ZW1wb3JhcnlVSUZ1bmN0aW9uc1t0XSk7dGhpcy50ZW1wb3JhcnlVSUZ1bmN0aW9ucz17fX19LHtrZXk6Il91bmJpbmRUZW1wb3JhcnlFdmVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLnRlbXBvcmFyeUV2ZW50RnVuY3Rpb25zLmxlbmd0aDt0Kyspe3ZhciBlPXRoaXMudGVtcG9yYXJ5RXZlbnRGdW5jdGlvbnNbdF0uZXZlbnQsaT10aGlzLnRlbXBvcmFyeUV2ZW50RnVuY3Rpb25zW3RdLmJvdW5kRnVuY3Rpb247dGhpcy5ib2R5LmVtaXR0ZXIub2ZmKGUsaSl9dGhpcy50ZW1wb3JhcnlFdmVudEZ1bmN0aW9ucz1bXX19LHtrZXk6Il9iaW5kSGFtbWVyVG9EaXYiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9bmV3IHIodCx7fSk7YS5vblRvdWNoKGksZSksdGhpcy5tYW5pcHVsYXRpb25IYW1tZXJzLnB1c2goaSl9fSx7a2V5OiJfY2xlYW51cFRlbXBvcmFyeU5vZGVzQW5kRWRnZXMiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLnRlbXBvcmFyeUlkcy5lZGdlcy5sZW5ndGg7dCsrKXt0aGlzLmJvZHkuZWRnZXNbdGhpcy50ZW1wb3JhcnlJZHMuZWRnZXNbdF1dLmRpc2Nvbm5lY3QoKSxkZWxldGUgdGhpcy5ib2R5LmVkZ2VzW3RoaXMudGVtcG9yYXJ5SWRzLmVkZ2VzW3RdXTt2YXIgZT10aGlzLmJvZHkuZWRnZUluZGljZXMuaW5kZXhPZih0aGlzLnRlbXBvcmFyeUlkcy5lZGdlc1t0XSk7ZSE9PS0xJiZ0aGlzLmJvZHkuZWRnZUluZGljZXMuc3BsaWNlKGUsMSl9Zm9yKHZhciBpPTA7aTx0aGlzLnRlbXBvcmFyeUlkcy5ub2Rlcy5sZW5ndGg7aSsrKXtkZWxldGUgdGhpcy5ib2R5Lm5vZGVzW3RoaXMudGVtcG9yYXJ5SWRzLm5vZGVzW2ldXTt2YXIgbz10aGlzLmJvZHkubm9kZUluZGljZXMuaW5kZXhPZih0aGlzLnRlbXBvcmFyeUlkcy5ub2Rlc1tpXSk7byE9PS0xJiZ0aGlzLmJvZHkubm9kZUluZGljZXMuc3BsaWNlKG8sMSl9dGhpcy50ZW1wb3JhcnlJZHM9e25vZGVzOltdLGVkZ2VzOltdfX19LHtrZXk6Il9jb250cm9sTm9kZVRvdWNoIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLnNlbGVjdGlvbkhhbmRsZXIudW5zZWxlY3RBbGwoKSx0aGlzLmxhc3RUb3VjaD10aGlzLmJvZHkuZnVuY3Rpb25zLmdldFBvaW50ZXIodC5jZW50ZXIpLHRoaXMubGFzdFRvdWNoLnRyYW5zbGF0aW9uPXMuZXh0ZW5kKHt9LHRoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uKX19LHtrZXk6Il9jb250cm9sTm9kZURyYWdTdGFydCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5sYXN0VG91Y2gsaT10aGlzLnNlbGVjdGlvbkhhbmRsZXIuX3BvaW50ZXJUb1Bvc2l0aW9uT2JqZWN0KGUpLG89dGhpcy5ib2R5Lm5vZGVzW3RoaXMudGVtcG9yYXJ5SWRzLm5vZGVzWzBdXSxuPXRoaXMuYm9keS5ub2Rlc1t0aGlzLnRlbXBvcmFyeUlkcy5ub2Rlc1sxXV0scz10aGlzLmJvZHkuZWRnZXNbdGhpcy5lZGdlQmVpbmdFZGl0ZWRJZF07dGhpcy5zZWxlY3RlZENvbnRyb2xOb2RlPXZvaWQgMDt2YXIgcj1vLmlzT3ZlcmxhcHBpbmdXaXRoKGkpLGE9bi5pc092ZXJsYXBwaW5nV2l0aChpKTtyPT09ITA/KHRoaXMuc2VsZWN0ZWRDb250cm9sTm9kZT1vLHMuZWRnZVR5cGUuZnJvbT1vKTphPT09ITAmJih0aGlzLnNlbGVjdGVkQ29udHJvbE5vZGU9bixzLmVkZ2VUeXBlLnRvPW4pLHZvaWQgMCE9PXRoaXMuc2VsZWN0ZWRDb250cm9sTm9kZSYmdGhpcy5zZWxlY3Rpb25IYW5kbGVyLnNlbGVjdE9iamVjdCh0aGlzLnNlbGVjdGVkQ29udHJvbE5vZGUpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9yZWRyYXciKX19LHtrZXk6Il9jb250cm9sTm9kZURyYWciLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuYm9keS5lbWl0dGVyLmVtaXQoImRpc2FibGVQaHlzaWNzIik7dmFyIGU9dGhpcy5ib2R5LmZ1bmN0aW9ucy5nZXRQb2ludGVyKHQuY2VudGVyKSxpPXRoaXMuY2FudmFzLkRPTXRvQ2FudmFzKGUpO2lmKHZvaWQgMCE9PXRoaXMuc2VsZWN0ZWRDb250cm9sTm9kZSl0aGlzLnNlbGVjdGVkQ29udHJvbE5vZGUueD1pLngsdGhpcy5zZWxlY3RlZENvbnRyb2xOb2RlLnk9aS55O2Vsc2V7dmFyIG89ZS54LXRoaXMubGFzdFRvdWNoLngsbj1lLnktdGhpcy5sYXN0VG91Y2gueTt0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbj17eDp0aGlzLmxhc3RUb3VjaC50cmFuc2xhdGlvbi54K28seTp0aGlzLmxhc3RUb3VjaC50cmFuc2xhdGlvbi55K259fXRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9yZWRyYXciKX19LHtrZXk6Il9jb250cm9sTm9kZURyYWdFbmQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYm9keS5mdW5jdGlvbnMuZ2V0UG9pbnRlcih0LmNlbnRlciksaT10aGlzLnNlbGVjdGlvbkhhbmRsZXIuX3BvaW50ZXJUb1Bvc2l0aW9uT2JqZWN0KGUpLG89dGhpcy5ib2R5LmVkZ2VzW3RoaXMuZWRnZUJlaW5nRWRpdGVkSWRdO2lmKHZvaWQgMCE9PXRoaXMuc2VsZWN0ZWRDb250cm9sTm9kZSl7dGhpcy5zZWxlY3Rpb25IYW5kbGVyLnVuc2VsZWN0QWxsKCk7Zm9yKHZhciBuPXRoaXMuc2VsZWN0aW9uSGFuZGxlci5fZ2V0QWxsTm9kZXNPdmVybGFwcGluZ1dpdGgoaSkscz12b2lkIDAscj1uLmxlbmd0aC0xO3I+PTA7ci0tKWlmKG5bcl0hPT10aGlzLnNlbGVjdGVkQ29udHJvbE5vZGUuaWQpe3M9dGhpcy5ib2R5Lm5vZGVzW25bcl1dO2JyZWFrfWlmKHZvaWQgMCE9PXMmJnZvaWQgMCE9PXRoaXMuc2VsZWN0ZWRDb250cm9sTm9kZSlpZihzLmlzQ2x1c3Rlcj09PSEwKWFsZXJ0KHRoaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdLmNyZWF0ZUVkZ2VFcnJvcnx8dGhpcy5vcHRpb25zLmxvY2FsZXMuZW4uY3JlYXRlRWRnZUVycm9yKTtlbHNle3ZhciBhPXRoaXMuYm9keS5ub2Rlc1t0aGlzLnRlbXBvcmFyeUlkcy5ub2Rlc1swXV07dGhpcy5zZWxlY3RlZENvbnRyb2xOb2RlLmlkPT09YS5pZD90aGlzLl9wZXJmb3JtRWRpdEVkZ2Uocy5pZCxvLnRvLmlkKTp0aGlzLl9wZXJmb3JtRWRpdEVkZ2Uoby5mcm9tLmlkLHMuaWQpfWVsc2Ugby51cGRhdGVFZGdlVHlwZSgpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoInJlc3RvcmVQaHlzaWNzIik7dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX3JlZHJhdyIpfX19LHtrZXk6Il9oYW5kbGVDb25uZWN0Iix2YWx1ZTpmdW5jdGlvbih0KXtpZigobmV3IERhdGUpLnZhbHVlT2YoKS10aGlzLnRvdWNoVGltZT4xMDApe3RoaXMubGFzdFRvdWNoPXRoaXMuYm9keS5mdW5jdGlvbnMuZ2V0UG9pbnRlcih0LmNlbnRlciksdGhpcy5sYXN0VG91Y2gudHJhbnNsYXRpb249cy5leHRlbmQoe30sdGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb24pO3ZhciBlPXRoaXMubGFzdFRvdWNoLGk9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldE5vZGVBdChlKTtpZih2b2lkIDAhPT1pKWlmKGkuaXNDbHVzdGVyPT09ITApYWxlcnQodGhpcy5vcHRpb25zLmxvY2FsZXNbdGhpcy5vcHRpb25zLmxvY2FsZV0uY3JlYXRlRWRnZUVycm9yfHx0aGlzLm9wdGlvbnMubG9jYWxlcy5lbi5jcmVhdGVFZGdlRXJyb3IpO2Vsc2V7dmFyIG89dGhpcy5fZ2V0TmV3VGFyZ2V0Tm9kZShpLngsaS55KTt0aGlzLmJvZHkubm9kZXNbby5pZF09byx0aGlzLmJvZHkubm9kZUluZGljZXMucHVzaChvLmlkKTt2YXIgbj10aGlzLmJvZHkuZnVuY3Rpb25zLmNyZWF0ZUVkZ2Uoe2lkOiJjb25uZWN0aW9uRWRnZSIrcy5yYW5kb21VVUlEKCksZnJvbTppLmlkLHRvOm8uaWQscGh5c2ljczohMSxzbW9vdGg6e2VuYWJsZWQ6ITAsdHlwZToiY29udGludW91cyIscm91bmRuZXNzOi41fX0pO3RoaXMuYm9keS5lZGdlc1tuLmlkXT1uLHRoaXMuYm9keS5lZGdlSW5kaWNlcy5wdXNoKG4uaWQpLHRoaXMudGVtcG9yYXJ5SWRzLm5vZGVzLnB1c2goby5pZCksdGhpcy50ZW1wb3JhcnlJZHMuZWRnZXMucHVzaChuLmlkKX10aGlzLnRvdWNoVGltZT0obmV3IERhdGUpLnZhbHVlT2YoKX19fSx7a2V5OiJfZHJhZ0NvbnRyb2xOb2RlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmJvZHkuZnVuY3Rpb25zLmdldFBvaW50ZXIodC5jZW50ZXIpO2lmKHZvaWQgMCE9PXRoaXMudGVtcG9yYXJ5SWRzLm5vZGVzWzBdKXt2YXIgaT10aGlzLmJvZHkubm9kZXNbdGhpcy50ZW1wb3JhcnlJZHMubm9kZXNbMF1dO2kueD10aGlzLmNhbnZhcy5fWGNvbnZlcnRET010b0NhbnZhcyhlLngpLGkueT10aGlzLmNhbnZhcy5fWWNvbnZlcnRET010b0NhbnZhcyhlLnkpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoIl9yZWRyYXciKX1lbHNle3ZhciBvPWUueC10aGlzLmxhc3RUb3VjaC54LG49ZS55LXRoaXMubGFzdFRvdWNoLnk7dGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb249e3g6dGhpcy5sYXN0VG91Y2gudHJhbnNsYXRpb24ueCtvLHk6dGhpcy5sYXN0VG91Y2gudHJhbnNsYXRpb24ueStufX19fSx7a2V5OiJfZmluaXNoQ29ubmVjdCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ib2R5LmZ1bmN0aW9ucy5nZXRQb2ludGVyKHQuY2VudGVyKSxpPXRoaXMuc2VsZWN0aW9uSGFuZGxlci5fcG9pbnRlclRvUG9zaXRpb25PYmplY3QoZSksbz12b2lkIDA7dm9pZCAwIT09dGhpcy50ZW1wb3JhcnlJZHMuZWRnZXNbMF0mJihvPXRoaXMuYm9keS5lZGdlc1t0aGlzLnRlbXBvcmFyeUlkcy5lZGdlc1swXV0uZnJvbUlkKTtmb3IodmFyIG49dGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZXRBbGxOb2Rlc092ZXJsYXBwaW5nV2l0aChpKSxzPXZvaWQgMCxyPW4ubGVuZ3RoLTE7cj49MDtyLS0paWYodGhpcy50ZW1wb3JhcnlJZHMubm9kZXMuaW5kZXhPZihuW3JdKT09PS0xKXtzPXRoaXMuYm9keS5ub2Rlc1tuW3JdXTticmVha310aGlzLl9jbGVhbnVwVGVtcG9yYXJ5Tm9kZXNBbmRFZGdlcygpLHZvaWQgMCE9PXMmJihzLmlzQ2x1c3Rlcj09PSEwP2FsZXJ0KHRoaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdLmNyZWF0ZUVkZ2VFcnJvcnx8dGhpcy5vcHRpb25zLmxvY2FsZXMuZW4uY3JlYXRlRWRnZUVycm9yKTp2b2lkIDAhPT10aGlzLmJvZHkubm9kZXNbb10mJnZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1tzLmlkXSYmdGhpcy5fcGVyZm9ybUFkZEVkZ2UobyxzLmlkKSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgiX3JlZHJhdyIpfX0se2tleToiX3BlcmZvcm1BZGROb2RlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLGk9e2lkOnMucmFuZG9tVVVJRCgpLHg6dC5wb2ludGVyLmNhbnZhcy54LHk6dC5wb2ludGVyLmNhbnZhcy55LGxhYmVsOiJuZXcifTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5vcHRpb25zLmFkZE5vZGUpe2lmKDIhPT10aGlzLm9wdGlvbnMuYWRkTm9kZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJUaGUgZnVuY3Rpb24gZm9yIGFkZCBkb2VzIG5vdCBzdXBwb3J0IHR3byBhcmd1bWVudHMgKGRhdGEsY2FsbGJhY2spIik7dGhpcy5vcHRpb25zLmFkZE5vZGUoaSxmdW5jdGlvbih0KXtudWxsIT09dCYmdm9pZCAwIT09dCYmImFkZE5vZGUiPT09ZS5pbk1vZGUmJihlLmJvZHkuZGF0YS5ub2Rlcy5nZXREYXRhU2V0KCkuYWRkKHQpLGUuc2hvd01hbmlwdWxhdG9yVG9vbGJhcigpKX0pfWVsc2UgdGhpcy5ib2R5LmRhdGEubm9kZXMuZ2V0RGF0YVNldCgpLmFkZChpKSx0aGlzLnNob3dNYW5pcHVsYXRvclRvb2xiYXIoKX19LHtrZXk6Il9wZXJmb3JtQWRkRWRnZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLG89e2Zyb206dCx0bzplfTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5vcHRpb25zLmFkZEVkZ2Upe2lmKDIhPT10aGlzLm9wdGlvbnMuYWRkRWRnZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJUaGUgZnVuY3Rpb24gZm9yIGNvbm5lY3QgZG9lcyBub3Qgc3VwcG9ydCB0d28gYXJndW1lbnRzIChkYXRhLGNhbGxiYWNrKSIpO3RoaXMub3B0aW9ucy5hZGRFZGdlKG8sZnVuY3Rpb24odCl7bnVsbCE9PXQmJnZvaWQgMCE9PXQmJiJhZGRFZGdlIj09PWkuaW5Nb2RlJiYoaS5ib2R5LmRhdGEuZWRnZXMuZ2V0RGF0YVNldCgpLmFkZCh0KSxpLnNlbGVjdGlvbkhhbmRsZXIudW5zZWxlY3RBbGwoKSxpLnNob3dNYW5pcHVsYXRvclRvb2xiYXIoKSl9KX1lbHNlIHRoaXMuYm9keS5kYXRhLmVkZ2VzLmdldERhdGFTZXQoKS5hZGQobyksdGhpcy5zZWxlY3Rpb25IYW5kbGVyLnVuc2VsZWN0QWxsKCksdGhpcy5zaG93TWFuaXB1bGF0b3JUb29sYmFyKCl9fSx7a2V5OiJfcGVyZm9ybUVkaXRFZGdlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMsbz17aWQ6dGhpcy5lZGdlQmVpbmdFZGl0ZWRJZCxmcm9tOnQsdG86ZX07aWYoImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMub3B0aW9ucy5lZGl0RWRnZSl7aWYoMiE9PXRoaXMub3B0aW9ucy5lZGl0RWRnZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJUaGUgZnVuY3Rpb24gZm9yIGVkaXQgZG9lcyBub3Qgc3VwcG9ydCB0d28gYXJndW1lbnRzIChkYXRhLCBjYWxsYmFjaykiKTt0aGlzLm9wdGlvbnMuZWRpdEVkZ2UobyxmdW5jdGlvbih0KXtudWxsPT09dHx8dm9pZCAwPT09dHx8ImVkaXRFZGdlIiE9PWkuaW5Nb2RlPyhpLmJvZHkuZWRnZXNbby5pZF0udXBkYXRlRWRnZVR5cGUoKSxpLmJvZHkuZW1pdHRlci5lbWl0KCJfcmVkcmF3IikpOihpLmJvZHkuZGF0YS5lZGdlcy5nZXREYXRhU2V0KCkudXBkYXRlKHQpLGkuc2VsZWN0aW9uSGFuZGxlci51bnNlbGVjdEFsbCgpLGkuc2hvd01hbmlwdWxhdG9yVG9vbGJhcigpKX0pfWVsc2UgdGhpcy5ib2R5LmRhdGEuZWRnZXMuZ2V0RGF0YVNldCgpLnVwZGF0ZShvKSx0aGlzLnNlbGVjdGlvbkhhbmRsZXIudW5zZWxlY3RBbGwoKSx0aGlzLnNob3dNYW5pcHVsYXRvclRvb2xiYXIoKX19XSksdH0oKTtlLmRlZmF1bHQ9aH0sZnVuY3Rpb24odCxlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGk9InN0cmluZyIsbz0iYm9vbGVhbiIsbj0ibnVtYmVyIixzPSJhcnJheSIscj0ib2JqZWN0IixhPSJkb20iLGg9ImFueSIsZD17Y29uZmlndXJlOntlbmFibGVkOntib29sZWFuOm99LGZpbHRlcjp7Ym9vbGVhbjpvLHN0cmluZzppLGFycmF5OnMsZnVuY3Rpb246ImZ1bmN0aW9uIn0sY29udGFpbmVyOntkb206YX0sc2hvd0J1dHRvbjp7Ym9vbGVhbjpvfSxfX3R5cGVfXzp7b2JqZWN0OnIsYm9vbGVhbjpvLHN0cmluZzppLGFycmF5OnMsZnVuY3Rpb246ImZ1bmN0aW9uIn19LGVkZ2VzOnthcnJvd3M6e3RvOntlbmFibGVkOntib29sZWFuOm99LHNjYWxlRmFjdG9yOntudW1iZXI6bn0sdHlwZTp7c3RyaW5nOlsiYXJyb3ciLCJjaXJjbGUiXX0sX190eXBlX186e29iamVjdDpyLGJvb2xlYW46b319LG1pZGRsZTp7ZW5hYmxlZDp7Ym9vbGVhbjpvfSxzY2FsZUZhY3Rvcjp7bnVtYmVyOm59LHR5cGU6e3N0cmluZzpbImFycm93IiwiY2lyY2xlIl19LF9fdHlwZV9fOntvYmplY3Q6cixib29sZWFuOm99fSxmcm9tOntlbmFibGVkOntib29sZWFuOm99LHNjYWxlRmFjdG9yOntudW1iZXI6bn0sdHlwZTp7c3RyaW5nOlsiYXJyb3ciLCJjaXJjbGUiXX0sX190eXBlX186e29iamVjdDpyLGJvb2xlYW46b319LF9fdHlwZV9fOntzdHJpbmc6WyJmcm9tIiwidG8iLCJtaWRkbGUiXSxvYmplY3Q6cn19LGFycm93U3RyaWtldGhyb3VnaDp7Ym9vbGVhbjpvfSxjb2xvcjp7Y29sb3I6e3N0cmluZzppfSxoaWdobGlnaHQ6e3N0cmluZzppfSxob3Zlcjp7c3RyaW5nOml9LGluaGVyaXQ6e3N0cmluZzpbImZyb20iLCJ0byIsImJvdGgiXSxib29sZWFuOm99LG9wYWNpdHk6e251bWJlcjpufSxfX3R5cGVfXzp7b2JqZWN0OnIsc3RyaW5nOml9fSxkYXNoZXM6e2Jvb2xlYW46byxhcnJheTpzfSxmb250Ontjb2xvcjp7c3RyaW5nOml9LHNpemU6e251bWJlcjpufSxmYWNlOntzdHJpbmc6aX0sYmFja2dyb3VuZDp7c3RyaW5nOml9LHN0cm9rZVdpZHRoOntudW1iZXI6bn0sc3Ryb2tlQ29sb3I6e3N0cmluZzppfSxhbGlnbjp7c3RyaW5nOlsiaG9yaXpvbnRhbCIsInRvcCIsIm1pZGRsZSIsImJvdHRvbSJdfSxfX3R5cGVfXzp7b2JqZWN0OnIsc3RyaW5nOml9fSxoaWRkZW46e2Jvb2xlYW46b30saG92ZXJXaWR0aDp7ZnVuY3Rpb246ImZ1bmN0aW9uIixudW1iZXI6bn0sbGFiZWw6e3N0cmluZzppLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sbGFiZWxIaWdobGlnaHRCb2xkOntib29sZWFuOm99LGxlbmd0aDp7bnVtYmVyOm4sdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxwaHlzaWNzOntib29sZWFuOm99LHNjYWxpbmc6e21pbjp7bnVtYmVyOm59LG1heDp7bnVtYmVyOm59LGxhYmVsOntlbmFibGVkOntib29sZWFuOm99LG1pbjp7bnVtYmVyOm59LG1heDp7bnVtYmVyOm59LG1heFZpc2libGU6e251bWJlcjpufSxkcmF3VGhyZXNob2xkOntudW1iZXI6bn0sX190eXBlX186e29iamVjdDpyLGJvb2xlYW46b319LGN1c3RvbVNjYWxpbmdGdW5jdGlvbjp7ZnVuY3Rpb246ImZ1bmN0aW9uIn0sX190eXBlX186e29iamVjdDpyfX0sc2VsZWN0aW9uV2lkdGg6e2Z1bmN0aW9uOiJmdW5jdGlvbiIsbnVtYmVyOm59LHNlbGZSZWZlcmVuY2VTaXplOntudW1iZXI6bn0sc2hhZG93OntlbmFibGVkOntib29sZWFuOm99LGNvbG9yOntzdHJpbmc6aX0sc2l6ZTp7bnVtYmVyOm59LHg6e251bWJlcjpufSx5OntudW1iZXI6bn0sX190eXBlX186e29iamVjdDpyLGJvb2xlYW46b319LHNtb290aDp7ZW5hYmxlZDp7Ym9vbGVhbjpvfSx0eXBlOntzdHJpbmc6WyJkeW5hbWljIiwiY29udGludW91cyIsImRpc2NyZXRlIiwiZGlhZ29uYWxDcm9zcyIsInN0cmFpZ2h0Q3Jvc3MiLCJob3Jpem9udGFsIiwidmVydGljYWwiLCJjdXJ2ZWRDVyIsImN1cnZlZENDVyIsImN1YmljQmV6aWVyIl19LHJvdW5kbmVzczp7bnVtYmVyOm59LGZvcmNlRGlyZWN0aW9uOntzdHJpbmc6WyJob3Jpem9udGFsIiwidmVydGljYWwiLCJub25lIl0sYm9vbGVhbjpvfSxfX3R5cGVfXzp7b2JqZWN0OnIsYm9vbGVhbjpvfX0sdGl0bGU6e3N0cmluZzppLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sd2lkdGg6e251bWJlcjpufSx2YWx1ZTp7bnVtYmVyOm4sdW5kZWZpbmVkOiJ1bmRlZmluZWQifSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxncm91cHM6e3VzZURlZmF1bHRHcm91cHM6e2Jvb2xlYW46b30sX19hbnlfXzoiZ2V0IGZyb20gbm9kZXMsIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYmVsb3ciLApfX3R5cGVfXzp7b2JqZWN0OnJ9fSxpbnRlcmFjdGlvbjp7ZHJhZ05vZGVzOntib29sZWFuOm99LGRyYWdWaWV3Ontib29sZWFuOm99LGhpZGVFZGdlc09uRHJhZzp7Ym9vbGVhbjpvfSxoaWRlTm9kZXNPbkRyYWc6e2Jvb2xlYW46b30saG92ZXI6e2Jvb2xlYW46b30sa2V5Ym9hcmQ6e2VuYWJsZWQ6e2Jvb2xlYW46b30sc3BlZWQ6e3g6e251bWJlcjpufSx5OntudW1iZXI6bn0sem9vbTp7bnVtYmVyOm59LF9fdHlwZV9fOntvYmplY3Q6cn19LGJpbmRUb1dpbmRvdzp7Ym9vbGVhbjpvfSxfX3R5cGVfXzp7b2JqZWN0OnIsYm9vbGVhbjpvfX0sbXVsdGlzZWxlY3Q6e2Jvb2xlYW46b30sbmF2aWdhdGlvbkJ1dHRvbnM6e2Jvb2xlYW46b30sc2VsZWN0YWJsZTp7Ym9vbGVhbjpvfSxzZWxlY3RDb25uZWN0ZWRFZGdlczp7Ym9vbGVhbjpvfSxob3ZlckNvbm5lY3RlZEVkZ2VzOntib29sZWFuOm99LHRvb2x0aXBEZWxheTp7bnVtYmVyOm59LHpvb21WaWV3Ontib29sZWFuOm99LF9fdHlwZV9fOntvYmplY3Q6cn19LGxheW91dDp7cmFuZG9tU2VlZDp7dW5kZWZpbmVkOiJ1bmRlZmluZWQiLG51bWJlcjpufSxpbXByb3ZlZExheW91dDp7Ym9vbGVhbjpvfSxoaWVyYXJjaGljYWw6e2VuYWJsZWQ6e2Jvb2xlYW46b30sbGV2ZWxTZXBhcmF0aW9uOntudW1iZXI6bn0sbm9kZVNwYWNpbmc6e251bWJlcjpufSx0cmVlU3BhY2luZzp7bnVtYmVyOm59LGJsb2NrU2hpZnRpbmc6e2Jvb2xlYW46b30sZWRnZU1pbmltaXphdGlvbjp7Ym9vbGVhbjpvfSxwYXJlbnRDZW50cmFsaXphdGlvbjp7Ym9vbGVhbjpvfSxkaXJlY3Rpb246e3N0cmluZzpbIlVEIiwiRFUiLCJMUiIsIlJMIl19LHNvcnRNZXRob2Q6e3N0cmluZzpbImh1YnNpemUiLCJkaXJlY3RlZCJdfSxfX3R5cGVfXzp7b2JqZWN0OnIsYm9vbGVhbjpvfX0sX190eXBlX186e29iamVjdDpyfX0sbWFuaXB1bGF0aW9uOntlbmFibGVkOntib29sZWFuOm99LGluaXRpYWxseUFjdGl2ZTp7Ym9vbGVhbjpvfSxhZGROb2RlOntib29sZWFuOm8sZnVuY3Rpb246ImZ1bmN0aW9uIn0sYWRkRWRnZTp7Ym9vbGVhbjpvLGZ1bmN0aW9uOiJmdW5jdGlvbiJ9LGVkaXROb2RlOntmdW5jdGlvbjoiZnVuY3Rpb24ifSxlZGl0RWRnZTp7Ym9vbGVhbjpvLGZ1bmN0aW9uOiJmdW5jdGlvbiJ9LGRlbGV0ZU5vZGU6e2Jvb2xlYW46byxmdW5jdGlvbjoiZnVuY3Rpb24ifSxkZWxldGVFZGdlOntib29sZWFuOm8sZnVuY3Rpb246ImZ1bmN0aW9uIn0sY29udHJvbE5vZGVTdHlsZToiZ2V0IGZyb20gbm9kZXMsIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYmVsb3ciLF9fdHlwZV9fOntvYmplY3Q6cixib29sZWFuOm99fSxub2Rlczp7Ym9yZGVyV2lkdGg6e251bWJlcjpufSxib3JkZXJXaWR0aFNlbGVjdGVkOntudW1iZXI6bix1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LGJyb2tlbkltYWdlOntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LGNvbG9yOntib3JkZXI6e3N0cmluZzppfSxiYWNrZ3JvdW5kOntzdHJpbmc6aX0saGlnaGxpZ2h0Ontib3JkZXI6e3N0cmluZzppfSxiYWNrZ3JvdW5kOntzdHJpbmc6aX0sX190eXBlX186e29iamVjdDpyLHN0cmluZzppfX0saG92ZXI6e2JvcmRlcjp7c3RyaW5nOml9LGJhY2tncm91bmQ6e3N0cmluZzppfSxfX3R5cGVfXzp7b2JqZWN0OnIsc3RyaW5nOml9fSxfX3R5cGVfXzp7b2JqZWN0OnIsc3RyaW5nOml9fSxmaXhlZDp7eDp7Ym9vbGVhbjpvfSx5Ontib29sZWFuOm99LF9fdHlwZV9fOntvYmplY3Q6cixib29sZWFuOm99fSxmb250OnthbGlnbjp7c3RyaW5nOml9LGNvbG9yOntzdHJpbmc6aX0sc2l6ZTp7bnVtYmVyOm59LGZhY2U6e3N0cmluZzppfSxiYWNrZ3JvdW5kOntzdHJpbmc6aX0sc3Ryb2tlV2lkdGg6e251bWJlcjpufSxzdHJva2VDb2xvcjp7c3RyaW5nOml9LF9fdHlwZV9fOntvYmplY3Q6cixzdHJpbmc6aX19LGdyb3VwOntzdHJpbmc6aSxudW1iZXI6bix1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LGhpZGRlbjp7Ym9vbGVhbjpvfSxpY29uOntmYWNlOntzdHJpbmc6aX0sY29kZTp7c3RyaW5nOml9LHNpemU6e251bWJlcjpufSxjb2xvcjp7c3RyaW5nOml9LF9fdHlwZV9fOntvYmplY3Q6cn19LGlkOntzdHJpbmc6aSxudW1iZXI6bn0saW1hZ2U6e3N0cmluZzppLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sbGFiZWw6e3N0cmluZzppLHVuZGVmaW5lZDoidW5kZWZpbmVkIn0sbGFiZWxIaWdobGlnaHRCb2xkOntib29sZWFuOm99LGxldmVsOntudW1iZXI6bix1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LG1hc3M6e251bWJlcjpufSxwaHlzaWNzOntib29sZWFuOm99LHNjYWxpbmc6e21pbjp7bnVtYmVyOm59LG1heDp7bnVtYmVyOm59LGxhYmVsOntlbmFibGVkOntib29sZWFuOm99LG1pbjp7bnVtYmVyOm59LG1heDp7bnVtYmVyOm59LG1heFZpc2libGU6e251bWJlcjpufSxkcmF3VGhyZXNob2xkOntudW1iZXI6bn0sX190eXBlX186e29iamVjdDpyLGJvb2xlYW46b319LGN1c3RvbVNjYWxpbmdGdW5jdGlvbjp7ZnVuY3Rpb246ImZ1bmN0aW9uIn0sX190eXBlX186e29iamVjdDpyfX0sc2hhZG93OntlbmFibGVkOntib29sZWFuOm99LGNvbG9yOntzdHJpbmc6aX0sc2l6ZTp7bnVtYmVyOm59LHg6e251bWJlcjpufSx5OntudW1iZXI6bn0sX190eXBlX186e29iamVjdDpyLGJvb2xlYW46b319LHNoYXBlOntzdHJpbmc6WyJlbGxpcHNlIiwiY2lyY2xlIiwiZGF0YWJhc2UiLCJib3giLCJ0ZXh0IiwiaW1hZ2UiLCJjaXJjdWxhckltYWdlIiwiZGlhbW9uZCIsImRvdCIsInN0YXIiLCJ0cmlhbmdsZSIsInRyaWFuZ2xlRG93biIsInNxdWFyZSIsImljb24iXX0sc2hhcGVQcm9wZXJ0aWVzOntib3JkZXJEYXNoZXM6e2Jvb2xlYW46byxhcnJheTpzfSxib3JkZXJSYWRpdXM6e251bWJlcjpufSxpbnRlcnBvbGF0aW9uOntib29sZWFuOm99LHVzZUltYWdlU2l6ZTp7Ym9vbGVhbjpvfSx1c2VCb3JkZXJXaXRoSW1hZ2U6e2Jvb2xlYW46b30sX190eXBlX186e29iamVjdDpyfX0sc2l6ZTp7bnVtYmVyOm59LHRpdGxlOntzdHJpbmc6aSx1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LHZhbHVlOntudW1iZXI6bix1bmRlZmluZWQ6InVuZGVmaW5lZCJ9LHg6e251bWJlcjpufSx5OntudW1iZXI6bn0sX190eXBlX186e29iamVjdDpyfX0scGh5c2ljczp7ZW5hYmxlZDp7Ym9vbGVhbjpvfSxiYXJuZXNIdXQ6e2dyYXZpdGF0aW9uYWxDb25zdGFudDp7bnVtYmVyOm59LGNlbnRyYWxHcmF2aXR5OntudW1iZXI6bn0sc3ByaW5nTGVuZ3RoOntudW1iZXI6bn0sc3ByaW5nQ29uc3RhbnQ6e251bWJlcjpufSxkYW1waW5nOntudW1iZXI6bn0sYXZvaWRPdmVybGFwOntudW1iZXI6bn0sX190eXBlX186e29iamVjdDpyfX0sZm9yY2VBdGxhczJCYXNlZDp7Z3Jhdml0YXRpb25hbENvbnN0YW50OntudW1iZXI6bn0sY2VudHJhbEdyYXZpdHk6e251bWJlcjpufSxzcHJpbmdMZW5ndGg6e251bWJlcjpufSxzcHJpbmdDb25zdGFudDp7bnVtYmVyOm59LGRhbXBpbmc6e251bWJlcjpufSxhdm9pZE92ZXJsYXA6e251bWJlcjpufSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxyZXB1bHNpb246e2NlbnRyYWxHcmF2aXR5OntudW1iZXI6bn0sc3ByaW5nTGVuZ3RoOntudW1iZXI6bn0sc3ByaW5nQ29uc3RhbnQ6e251bWJlcjpufSxub2RlRGlzdGFuY2U6e251bWJlcjpufSxkYW1waW5nOntudW1iZXI6bn0sX190eXBlX186e29iamVjdDpyfX0saGllcmFyY2hpY2FsUmVwdWxzaW9uOntjZW50cmFsR3Jhdml0eTp7bnVtYmVyOm59LHNwcmluZ0xlbmd0aDp7bnVtYmVyOm59LHNwcmluZ0NvbnN0YW50OntudW1iZXI6bn0sbm9kZURpc3RhbmNlOntudW1iZXI6bn0sZGFtcGluZzp7bnVtYmVyOm59LF9fdHlwZV9fOntvYmplY3Q6cn19LG1heFZlbG9jaXR5OntudW1iZXI6bn0sbWluVmVsb2NpdHk6e251bWJlcjpufSxzb2x2ZXI6e3N0cmluZzpbImJhcm5lc0h1dCIsInJlcHVsc2lvbiIsImhpZXJhcmNoaWNhbFJlcHVsc2lvbiIsImZvcmNlQXRsYXMyQmFzZWQiXX0sc3RhYmlsaXphdGlvbjp7ZW5hYmxlZDp7Ym9vbGVhbjpvfSxpdGVyYXRpb25zOntudW1iZXI6bn0sdXBkYXRlSW50ZXJ2YWw6e251bWJlcjpufSxvbmx5RHluYW1pY0VkZ2VzOntib29sZWFuOm99LGZpdDp7Ym9vbGVhbjpvfSxfX3R5cGVfXzp7b2JqZWN0OnIsYm9vbGVhbjpvfX0sdGltZXN0ZXA6e251bWJlcjpufSxhZGFwdGl2ZVRpbWVzdGVwOntib29sZWFuOm99LF9fdHlwZV9fOntvYmplY3Q6cixib29sZWFuOm99fSxhdXRvUmVzaXplOntib29sZWFuOm99LGNsaWNrVG9Vc2U6e2Jvb2xlYW46b30sbG9jYWxlOntzdHJpbmc6aX0sbG9jYWxlczp7X19hbnlfXzp7YW55Omh9LF9fdHlwZV9fOntvYmplY3Q6cn19LGhlaWdodDp7c3RyaW5nOml9LHdpZHRoOntzdHJpbmc6aX0sX190eXBlX186e29iamVjdDpyfX07ZC5ncm91cHMuX19hbnlfXz1kLm5vZGVzLGQubWFuaXB1bGF0aW9uLmNvbnRyb2xOb2RlU3R5bGU9ZC5ub2Rlczt2YXIgbD17bm9kZXM6e2JvcmRlcldpZHRoOlsxLDAsMTAsMV0sYm9yZGVyV2lkdGhTZWxlY3RlZDpbMiwwLDEwLDFdLGNvbG9yOntib3JkZXI6WyJjb2xvciIsIiMyQjdDRTkiXSxiYWNrZ3JvdW5kOlsiY29sb3IiLCIjOTdDMkZDIl0saGlnaGxpZ2h0Ontib3JkZXI6WyJjb2xvciIsIiMyQjdDRTkiXSxiYWNrZ3JvdW5kOlsiY29sb3IiLCIjRDJFNUZGIl19LGhvdmVyOntib3JkZXI6WyJjb2xvciIsIiMyQjdDRTkiXSxiYWNrZ3JvdW5kOlsiY29sb3IiLCIjRDJFNUZGIl19fSxmaXhlZDp7eDohMSx5OiExfSxmb250Ontjb2xvcjpbImNvbG9yIiwiIzM0MzQzNCJdLHNpemU6WzE0LDAsMTAwLDFdLGZhY2U6WyJhcmlhbCIsInZlcmRhbmEiLCJ0YWhvbWEiXSxiYWNrZ3JvdW5kOlsiY29sb3IiLCJub25lIl0sc3Ryb2tlV2lkdGg6WzAsMCw1MCwxXSxzdHJva2VDb2xvcjpbImNvbG9yIiwiI2ZmZmZmZiJdfSxoaWRkZW46ITEsbGFiZWxIaWdobGlnaHRCb2xkOiEwLHBoeXNpY3M6ITAsc2NhbGluZzp7bWluOlsxMCwwLDIwMCwxXSxtYXg6WzMwLDAsMjAwLDFdLGxhYmVsOntlbmFibGVkOiExLG1pbjpbMTQsMCwyMDAsMV0sbWF4OlszMCwwLDIwMCwxXSxtYXhWaXNpYmxlOlszMCwwLDIwMCwxXSxkcmF3VGhyZXNob2xkOls1LDAsMjAsMV19fSxzaGFkb3c6e2VuYWJsZWQ6ITEsY29sb3I6InJnYmEoMCwwLDAsMC41KSIsc2l6ZTpbMTAsMCwyMCwxXSx4Ols1LC0zMCwzMCwxXSx5Ols1LC0zMCwzMCwxXX0sc2hhcGU6WyJlbGxpcHNlIiwiYm94IiwiY2lyY2xlIiwiZGF0YWJhc2UiLCJkaWFtb25kIiwiZG90Iiwic3F1YXJlIiwic3RhciIsInRleHQiLCJ0cmlhbmdsZSIsInRyaWFuZ2xlRG93biJdLHNoYXBlUHJvcGVydGllczp7Ym9yZGVyRGFzaGVzOiExLGJvcmRlclJhZGl1czpbNiwwLDIwLDFdLGludGVycG9sYXRpb246ITAsdXNlSW1hZ2VTaXplOiExfSxzaXplOlsyNSwwLDIwMCwxXX0sZWRnZXM6e2Fycm93czp7dG86e2VuYWJsZWQ6ITEsc2NhbGVGYWN0b3I6WzEsMCwzLC4wNV0sdHlwZToiYXJyb3cifSxtaWRkbGU6e2VuYWJsZWQ6ITEsc2NhbGVGYWN0b3I6WzEsMCwzLC4wNV0sdHlwZToiYXJyb3cifSxmcm9tOntlbmFibGVkOiExLHNjYWxlRmFjdG9yOlsxLDAsMywuMDVdLHR5cGU6ImFycm93In19LGFycm93U3RyaWtldGhyb3VnaDohMCxjb2xvcjp7Y29sb3I6WyJjb2xvciIsIiM4NDg0ODQiXSxoaWdobGlnaHQ6WyJjb2xvciIsIiM4NDg0ODQiXSxob3ZlcjpbImNvbG9yIiwiIzg0ODQ4NCJdLGluaGVyaXQ6WyJmcm9tIiwidG8iLCJib3RoIiwhMCwhMV0sb3BhY2l0eTpbMSwwLDEsLjA1XX0sZGFzaGVzOiExLGZvbnQ6e2NvbG9yOlsiY29sb3IiLCIjMzQzNDM0Il0sc2l6ZTpbMTQsMCwxMDAsMV0sZmFjZTpbImFyaWFsIiwidmVyZGFuYSIsInRhaG9tYSJdLGJhY2tncm91bmQ6WyJjb2xvciIsIm5vbmUiXSxzdHJva2VXaWR0aDpbMiwwLDUwLDFdLHN0cm9rZUNvbG9yOlsiY29sb3IiLCIjZmZmZmZmIl0sYWxpZ246WyJob3Jpem9udGFsIiwidG9wIiwibWlkZGxlIiwiYm90dG9tIl19LGhpZGRlbjohMSxob3ZlcldpZHRoOlsxLjUsMCw1LC4xXSxsYWJlbEhpZ2hsaWdodEJvbGQ6ITAscGh5c2ljczohMCxzY2FsaW5nOnttaW46WzEsMCwxMDAsMV0sbWF4OlsxNSwwLDEwMCwxXSxsYWJlbDp7ZW5hYmxlZDohMCxtaW46WzE0LDAsMjAwLDFdLG1heDpbMzAsMCwyMDAsMV0sbWF4VmlzaWJsZTpbMzAsMCwyMDAsMV0sZHJhd1RocmVzaG9sZDpbNSwwLDIwLDFdfX0sc2VsZWN0aW9uV2lkdGg6WzEuNSwwLDUsLjFdLHNlbGZSZWZlcmVuY2VTaXplOlsyMCwwLDIwMCwxXSxzaGFkb3c6e2VuYWJsZWQ6ITEsY29sb3I6InJnYmEoMCwwLDAsMC41KSIsc2l6ZTpbMTAsMCwyMCwxXSx4Ols1LC0zMCwzMCwxXSx5Ols1LC0zMCwzMCwxXX0sc21vb3RoOntlbmFibGVkOiEwLHR5cGU6WyJkeW5hbWljIiwiY29udGludW91cyIsImRpc2NyZXRlIiwiZGlhZ29uYWxDcm9zcyIsInN0cmFpZ2h0Q3Jvc3MiLCJob3Jpem9udGFsIiwidmVydGljYWwiLCJjdXJ2ZWRDVyIsImN1cnZlZENDVyIsImN1YmljQmV6aWVyIl0sZm9yY2VEaXJlY3Rpb246WyJob3Jpem9udGFsIiwidmVydGljYWwiLCJub25lIl0scm91bmRuZXNzOlsuNSwwLDEsLjA1XX0sd2lkdGg6WzEsMCwzMCwxXX0sbGF5b3V0OntoaWVyYXJjaGljYWw6e2VuYWJsZWQ6ITEsbGV2ZWxTZXBhcmF0aW9uOlsxNTAsMjAsNTAwLDVdLG5vZGVTcGFjaW5nOlsxMDAsMjAsNTAwLDVdLHRyZWVTcGFjaW5nOlsyMDAsMjAsNTAwLDVdLGJsb2NrU2hpZnRpbmc6ITAsZWRnZU1pbmltaXphdGlvbjohMCxwYXJlbnRDZW50cmFsaXphdGlvbjohMCxkaXJlY3Rpb246WyJVRCIsIkRVIiwiTFIiLCJSTCJdLHNvcnRNZXRob2Q6WyJodWJzaXplIiwiZGlyZWN0ZWQiXX19LGludGVyYWN0aW9uOntkcmFnTm9kZXM6ITAsZHJhZ1ZpZXc6ITAsaGlkZUVkZ2VzT25EcmFnOiExLGhpZGVOb2Rlc09uRHJhZzohMSxob3ZlcjohMSxrZXlib2FyZDp7ZW5hYmxlZDohMSxzcGVlZDp7eDpbMTAsMCw0MCwxXSx5OlsxMCwwLDQwLDFdLHpvb206Wy4wMiwwLC4xLC4wMDVdfSxiaW5kVG9XaW5kb3c6ITB9LG11bHRpc2VsZWN0OiExLG5hdmlnYXRpb25CdXR0b25zOiExLHNlbGVjdGFibGU6ITAsc2VsZWN0Q29ubmVjdGVkRWRnZXM6ITAsaG92ZXJDb25uZWN0ZWRFZGdlczohMCx0b29sdGlwRGVsYXk6WzMwMCwwLDFlMywyNV0sem9vbVZpZXc6ITB9LG1hbmlwdWxhdGlvbjp7ZW5hYmxlZDohMSxpbml0aWFsbHlBY3RpdmU6ITF9LHBoeXNpY3M6e2VuYWJsZWQ6ITAsYmFybmVzSHV0OntncmF2aXRhdGlvbmFsQ29uc3RhbnQ6Wy0yZTMsLTNlNCwwLDUwXSxjZW50cmFsR3Jhdml0eTpbLjMsMCwxMCwuMDVdLHNwcmluZ0xlbmd0aDpbOTUsMCw1MDAsNV0sc3ByaW5nQ29uc3RhbnQ6Wy4wNCwwLDEuMiwuMDA1XSxkYW1waW5nOlsuMDksMCwxLC4wMV0sYXZvaWRPdmVybGFwOlswLDAsMSwuMDFdfSxmb3JjZUF0bGFzMkJhc2VkOntncmF2aXRhdGlvbmFsQ29uc3RhbnQ6Wy01MCwtNTAwLDAsMV0sY2VudHJhbEdyYXZpdHk6Wy4wMSwwLDEsLjAwNV0sc3ByaW5nTGVuZ3RoOls5NSwwLDUwMCw1XSxzcHJpbmdDb25zdGFudDpbLjA4LDAsMS4yLC4wMDVdLGRhbXBpbmc6Wy40LDAsMSwuMDFdLGF2b2lkT3ZlcmxhcDpbMCwwLDEsLjAxXX0scmVwdWxzaW9uOntjZW50cmFsR3Jhdml0eTpbLjIsMCwxMCwuMDVdLHNwcmluZ0xlbmd0aDpbMjAwLDAsNTAwLDVdLHNwcmluZ0NvbnN0YW50OlsuMDUsMCwxLjIsLjAwNV0sbm9kZURpc3RhbmNlOlsxMDAsMCw1MDAsNV0sZGFtcGluZzpbLjA5LDAsMSwuMDFdfSxoaWVyYXJjaGljYWxSZXB1bHNpb246e2NlbnRyYWxHcmF2aXR5OlsuMiwwLDEwLC4wNV0sc3ByaW5nTGVuZ3RoOlsxMDAsMCw1MDAsNV0sc3ByaW5nQ29uc3RhbnQ6Wy4wMSwwLDEuMiwuMDA1XSxub2RlRGlzdGFuY2U6WzEyMCwwLDUwMCw1XSxkYW1waW5nOlsuMDksMCwxLC4wMV19LG1heFZlbG9jaXR5Ols1MCwwLDE1MCwxXSxtaW5WZWxvY2l0eTpbLjEsLjAxLC41LC4wMV0sc29sdmVyOlsiYmFybmVzSHV0IiwiZm9yY2VBdGxhczJCYXNlZCIsInJlcHVsc2lvbiIsImhpZXJhcmNoaWNhbFJlcHVsc2lvbiJdLHRpbWVzdGVwOlsuNSwuMDEsMSwuMDFdfX07ZS5hbGxPcHRpb25zPWQsZS5jb25maWd1cmVPcHRpb25zPWx9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1mdW5jdGlvbiBuKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3ZhciBpPVtdLG89ITAsbj0hMSxzPXZvaWQgMDt0cnl7Zm9yKHZhciByLGE9dFtTeW1ib2wuaXRlcmF0b3JdKCk7IShvPShyPWEubmV4dCgpKS5kb25lKSYmKGkucHVzaChyLnZhbHVlKSwhZXx8aS5sZW5ndGghPT1lKTtvPSEwKTt9Y2F0Y2godCl7bj0hMCxzPXR9ZmluYWxseXt0cnl7IW8mJmEucmV0dXJuJiZhLnJldHVybigpfWZpbmFsbHl7aWYobil0aHJvdyBzfX1yZXR1cm4gaX1yZXR1cm4gZnVuY3Rpb24oZSxpKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlO2lmKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpcmV0dXJuIHQoZSxpKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlIil9fSgpLHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxvJiZ0KGUsbyksZX19KCksYT1pKDExOCksaD1vKGEpLGQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsaSxvKXtuKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5zcHJpbmdMZW5ndGg9aSx0aGlzLnNwcmluZ0NvbnN0YW50PW8sdGhpcy5kaXN0YW5jZVNvbHZlcj1uZXcgaC5kZWZhdWx0fXJldHVybiByKHQsW3trZXk6InNldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3QmJih0LnNwcmluZ0xlbmd0aCYmKHRoaXMuc3ByaW5nTGVuZ3RoPXQuc3ByaW5nTGVuZ3RoKSx0LnNwcmluZ0NvbnN0YW50JiYodGhpcy5zcHJpbmdDb25zdGFudD10LnNwcmluZ0NvbnN0YW50KSl9fSx7a2V5OiJzb2x2ZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdLG89dGhpcy5kaXN0YW5jZVNvbHZlci5nZXREaXN0YW5jZXModGhpcy5ib2R5LHQsZSk7dGhpcy5fY3JlYXRlTF9tYXRyaXgobyksdGhpcy5fY3JlYXRlS19tYXRyaXgobyk7Zm9yKHZhciBuPS4wMSxyPTEsYT0wLGg9TWF0aC5tYXgoMWUzLE1hdGgubWluKDEwKnRoaXMuYm9keS5ub2RlSW5kaWNlcy5sZW5ndGgsNmUzKSksZD01LGw9MWU5LGM9MCx1PTAscD0wLGY9MCxtPTA7bD5uJiZhPGg7KXthKz0xO3ZhciB2PXRoaXMuX2dldEhpZ2hlc3RFbmVyZ3lOb2RlKGkpLGc9cyh2LDQpO2ZvcihjPWdbMF0sbD1nWzFdLHU9Z1syXSxwPWdbM10sZj1sLG09MDtmPnImJm08ZDspe20rPTEsdGhpcy5fbW92ZU5vZGUoYyx1LHApO3ZhciB5PXRoaXMuX2dldEVuZXJneShjKSxiPXMoeSwzKTtmPWJbMF0sdT1iWzFdLHA9YlsyXX19fX0se2tleToiX2dldEhpZ2hlc3RFbmVyZ3lOb2RlIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLGk9dGhpcy5ib2R5Lm5vZGVzLG89MCxuPWVbMF0scj0wLGE9MCxoPTA7aDxlLmxlbmd0aDtoKyspe3ZhciBkPWVbaF07aWYoaVtkXS5wcmVkZWZpbmVkUG9zaXRpb249PT0hMXx8aVtkXS5pc0NsdXN0ZXI9PT0hMCYmdD09PSEwfHxpW2RdLm9wdGlvbnMuZml4ZWQueD09PSEwfHxpW2RdLm9wdGlvbnMuZml4ZWQueT09PSEwKXt2YXIgbD10aGlzLl9nZXRFbmVyZ3koZCksYz1zKGwsMyksdT1jWzBdLHA9Y1sxXSxmPWNbMl07bzx1JiYobz11LG49ZCxyPXAsYT1mKX19cmV0dXJuW24sbyxyLGFdfX0se2tleToiX2dldEVuZXJneSIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuYm9keS5ub2RlSW5kaWNlcyxpPXRoaXMuYm9keS5ub2RlcyxvPWlbdF0ueCxuPWlbdF0ueSxzPTAscj0wLGE9MDthPGUubGVuZ3RoO2ErKyl7dmFyIGg9ZVthXTtpZihoIT09dCl7dmFyIGQ9aVtoXS54LGw9aVtoXS55LGM9MS9NYXRoLnNxcnQoTWF0aC5wb3coby1kLDIpK01hdGgucG93KG4tbCwyKSk7cys9dGhpcy5LX21hdHJpeFt0XVtoXSooby1kLXRoaXMuTF9tYXRyaXhbdF1baF0qKG8tZCkqYykscis9dGhpcy5LX21hdHJpeFt0XVtoXSoobi1sLXRoaXMuTF9tYXRyaXhbdF1baF0qKG4tbCkqYyl9fXZhciB1PU1hdGguc3FydChNYXRoLnBvdyhzLDIpK01hdGgucG93KHIsMikpO3JldHVyblt1LHMscl19fSx7a2V5OiJfbW92ZU5vZGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIG89dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLG49dGhpcy5ib2R5Lm5vZGVzLHM9MCxyPTAsYT0wLGg9blt0XS54LGQ9blt0XS55LGw9MDtsPG8ubGVuZ3RoO2wrKyl7dmFyIGM9b1tsXTtpZihjIT09dCl7dmFyIHU9bltjXS54LHA9bltjXS55LGY9MS9NYXRoLnBvdyhNYXRoLnBvdyhoLXUsMikrTWF0aC5wb3coZC1wLDIpLDEuNSk7cys9dGhpcy5LX21hdHJpeFt0XVtjXSooMS10aGlzLkxfbWF0cml4W3RdW2NdKk1hdGgucG93KGQtcCwyKSpmKSxyKz10aGlzLktfbWF0cml4W3RdW2NdKih0aGlzLkxfbWF0cml4W3RdW2NdKihoLXUpKihkLXApKmYpLGErPXRoaXMuS19tYXRyaXhbdF1bY10qKDEtdGhpcy5MX21hdHJpeFt0XVtjXSpNYXRoLnBvdyhoLXUsMikqZil9fXZhciBtPXMsdj1yLGc9ZSx5PWEsYj1pLF89KGcvbStiL3YpLyh2L20teS92KSx3PS0odipfK2cpL207blt0XS54Kz13LG5bdF0ueSs9X319LHtrZXk6Il9jcmVhdGVMX21hdHJpeCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLGk9dGhpcy5zcHJpbmdMZW5ndGg7dGhpcy5MX21hdHJpeD1bXTtmb3IodmFyIG89MDtvPGUubGVuZ3RoO28rKyl7dGhpcy5MX21hdHJpeFtlW29dXT17fTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0aGlzLkxfbWF0cml4W2Vbb11dW2Vbbl1dPWkqdFtlW29dXVtlW25dXX19fSx7a2V5OiJfY3JlYXRlS19tYXRyaXgiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYm9keS5ub2RlSW5kaWNlcyxpPXRoaXMuc3ByaW5nQ29uc3RhbnQ7dGhpcy5LX21hdHJpeD1bXTtmb3IodmFyIG89MDtvPGUubGVuZ3RoO28rKyl7dGhpcy5LX21hdHJpeFtlW29dXT17fTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0aGlzLktfbWF0cml4W2Vbb11dW2Vbbl1dPWkqTWF0aC5wb3codFtlW29dXVtlW25dXSwtMil9fX1dKSx0fSgpO2UuZGVmYXVsdD1kfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLmtleSxvKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxvJiZ0KGUsbyksZX19KCksbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtpKHRoaXMsdCl9cmV0dXJuIG8odCxbe2tleToiZ2V0RGlzdGFuY2VzIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7Zm9yKHZhciBvPXt9LG49dC5lZGdlcyxzPTA7czxlLmxlbmd0aDtzKyspe29bZVtzXV09e30sb1tlW3NdXT17fTtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKylvW2Vbc11dW2Vbcl1dPXM9PXI/MDoxZTksb1tlW3NdXVtlW3JdXT1zPT1yPzA6MWU5fWZvcih2YXIgYT0wO2E8aS5sZW5ndGg7YSsrKXt2YXIgaD1uW2lbYV1dO2guY29ubmVjdGVkPT09ITAmJnZvaWQgMCE9PW9baC5mcm9tSWRdJiZ2b2lkIDAhPT1vW2gudG9JZF0mJihvW2guZnJvbUlkXVtoLnRvSWRdPTEsb1toLnRvSWRdW2guZnJvbUlkXT0xKX1mb3IodmFyIGQ9ZS5sZW5ndGgsbD0wO2w8ZDtsKyspZm9yKHZhciBjPTA7YzxkLTE7YysrKWZvcih2YXIgdT1jKzE7dTxkO3UrKylvW2VbY11dW2VbdV1dPU1hdGgubWluKG9bZVtjXV1bZVt1XV0sb1tlW2NdXVtlW2xdXStvW2VbbF1dW2VbdV1dKSxvW2VbdV1dW2VbY11dPW9bZVtjXV1bZVt1XV07cmV0dXJuIG99fV0pLHR9KCk7ZS5kZWZhdWx0PW59LGZ1bmN0aW9uKHQsZSl7InVuZGVmaW5lZCIhPXR5cGVvZiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQmJihDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQucHJvdG90eXBlLmNpcmNsZT1mdW5jdGlvbih0LGUsaSl7dGhpcy5iZWdpblBhdGgoKSx0aGlzLmFyYyh0LGUsaSwwLDIqTWF0aC5QSSwhMSksdGhpcy5jbG9zZVBhdGgoKX0sQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELnByb3RvdHlwZS5zcXVhcmU9ZnVuY3Rpb24odCxlLGkpe3RoaXMuYmVnaW5QYXRoKCksdGhpcy5yZWN0KHQtaSxlLWksMippLDIqaSksdGhpcy5jbG9zZVBhdGgoKX0sQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELnByb3RvdHlwZS50cmlhbmdsZT1mdW5jdGlvbih0LGUsaSl7dGhpcy5iZWdpblBhdGgoKSxpKj0xLjE1LGUrPS4yNzUqaTt2YXIgbz0yKmksbj1vLzIscz1NYXRoLnNxcnQoMykvNipvLHI9TWF0aC5zcXJ0KG8qby1uKm4pO3RoaXMubW92ZVRvKHQsZS0oci1zKSksdGhpcy5saW5lVG8odCtuLGUrcyksdGhpcy5saW5lVG8odC1uLGUrcyksdGhpcy5saW5lVG8odCxlLShyLXMpKSx0aGlzLmNsb3NlUGF0aCgpfSxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQucHJvdG90eXBlLnRyaWFuZ2xlRG93bj1mdW5jdGlvbih0LGUsaSl7dGhpcy5iZWdpblBhdGgoKSxpKj0xLjE1LGUtPS4yNzUqaTt2YXIgbz0yKmksbj1vLzIscz1NYXRoLnNxcnQoMykvNipvLHI9TWF0aC5zcXJ0KG8qby1uKm4pO3RoaXMubW92ZVRvKHQsZSsoci1zKSksdGhpcy5saW5lVG8odCtuLGUtcyksdGhpcy5saW5lVG8odC1uLGUtcyksdGhpcy5saW5lVG8odCxlKyhyLXMpKSx0aGlzLmNsb3NlUGF0aCgpfSxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQucHJvdG90eXBlLnN0YXI9ZnVuY3Rpb24odCxlLGkpe3RoaXMuYmVnaW5QYXRoKCksaSo9LjgyLGUrPS4xKmk7Zm9yKHZhciBvPTA7bzwxMDtvKyspe3ZhciBuPW8lMj09PTA/MS4zKmk6LjUqaTt0aGlzLmxpbmVUbyh0K24qTWF0aC5zaW4oMipvKk1hdGguUEkvMTApLGUtbipNYXRoLmNvcygyKm8qTWF0aC5QSS8xMCkpfXRoaXMuY2xvc2VQYXRoKCl9LENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5wcm90b3R5cGUuZGlhbW9uZD1mdW5jdGlvbih0LGUsaSl7dGhpcy5iZWdpblBhdGgoKSx0aGlzLmxpbmVUbyh0LGUraSksdGhpcy5saW5lVG8odCtpLGUpLHRoaXMubGluZVRvKHQsZS1pKSx0aGlzLmxpbmVUbyh0LWksZSksdGhpcy5jbG9zZVBhdGgoKX0sQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELnByb3RvdHlwZS5yb3VuZFJlY3Q9ZnVuY3Rpb24odCxlLGksbyxuKXt2YXIgcz1NYXRoLlBJLzE4MDtpLTIqbjwwJiYobj1pLzIpLG8tMipuPDAmJihuPW8vMiksdGhpcy5iZWdpblBhdGgoKSx0aGlzLm1vdmVUbyh0K24sZSksdGhpcy5saW5lVG8odCtpLW4sZSksdGhpcy5hcmModCtpLW4sZStuLG4sMjcwKnMsMzYwKnMsITEpLHRoaXMubGluZVRvKHQraSxlK28tbiksdGhpcy5hcmModCtpLW4sZStvLW4sbiwwLDkwKnMsITEpLHRoaXMubGluZVRvKHQrbixlK28pLHRoaXMuYXJjKHQrbixlK28tbixuLDkwKnMsMTgwKnMsITEpLHRoaXMubGluZVRvKHQsZStuKSx0aGlzLmFyYyh0K24sZStuLG4sMTgwKnMsMjcwKnMsITEpLHRoaXMuY2xvc2VQYXRoKCl9LENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5wcm90b3R5cGUuZWxsaXBzZT1mdW5jdGlvbih0LGUsaSxvKXt2YXIgbj0uNTUyMjg0OCxzPWkvMipuLHI9by8yKm4sYT10K2ksaD1lK28sZD10K2kvMixsPWUrby8yO3RoaXMuYmVnaW5QYXRoKCksdGhpcy5tb3ZlVG8odCxsKSx0aGlzLmJlemllckN1cnZlVG8odCxsLXIsZC1zLGUsZCxlKSx0aGlzLmJlemllckN1cnZlVG8oZCtzLGUsYSxsLXIsYSxsKSx0aGlzLmJlemllckN1cnZlVG8oYSxsK3IsZCtzLGgsZCxoKSx0aGlzLmJlemllckN1cnZlVG8oZC1zLGgsdCxsK3IsdCxsKSx0aGlzLmNsb3NlUGF0aCgpfSxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQucHJvdG90eXBlLmRhdGFiYXNlPWZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuPTEvMyxzPWkscj1vKm4sYT0uNTUyMjg0OCxoPXMvMiphLGQ9ci8yKmEsbD10K3MsYz1lK3IsdT10K3MvMixwPWUrci8yLGY9ZSsoby1yLzIpLG09ZStvO3RoaXMuYmVnaW5QYXRoKCksdGhpcy5tb3ZlVG8obCxwKSx0aGlzLmJlemllckN1cnZlVG8obCxwK2QsdStoLGMsdSxjKSx0aGlzLmJlemllckN1cnZlVG8odS1oLGMsdCxwK2QsdCxwKSx0aGlzLmJlemllckN1cnZlVG8odCxwLWQsdS1oLGUsdSxlKSx0aGlzLmJlemllckN1cnZlVG8odStoLGUsbCxwLWQsbCxwKSx0aGlzLmxpbmVUbyhsLGYpLHRoaXMuYmV6aWVyQ3VydmVUbyhsLGYrZCx1K2gsbSx1LG0pLHRoaXMuYmV6aWVyQ3VydmVUbyh1LWgsbSx0LGYrZCx0LGYpLHRoaXMubGluZVRvKHQscCl9LENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5wcm90b3R5cGUuYXJyb3dFbmRwb2ludD1mdW5jdGlvbih0LGUsaSxvKXt2YXIgbj10LW8qTWF0aC5jb3MoaSkscz1lLW8qTWF0aC5zaW4oaSkscj10LS45Km8qTWF0aC5jb3MoaSksYT1lLS45Km8qTWF0aC5zaW4oaSksaD1uK28vMypNYXRoLmNvcyhpKy41Kk1hdGguUEkpLGQ9cytvLzMqTWF0aC5zaW4oaSsuNSpNYXRoLlBJKSxsPW4rby8zKk1hdGguY29zKGktLjUqTWF0aC5QSSksYz1zK28vMypNYXRoLnNpbihpLS41Kk1hdGguUEkpO3RoaXMuYmVnaW5QYXRoKCksdGhpcy5tb3ZlVG8odCxlKSx0aGlzLmxpbmVUbyhoLGQpLHRoaXMubGluZVRvKHIsYSksdGhpcy5saW5lVG8obCxjKSx0aGlzLmNsb3NlUGF0aCgpfSxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQucHJvdG90eXBlLmNpcmNsZUVuZHBvaW50PWZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuPS40Km8scz10LW4qTWF0aC5jb3MoaSkscj1lLW4qTWF0aC5zaW4oaSk7dGhpcy5jaXJjbGUocyxyLG4pfSxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQucHJvdG90eXBlLmRhc2hlZExpbmU9ZnVuY3Rpb24odCxlLGksbyxuKXt0aGlzLmJlZ2luUGF0aCgpLHRoaXMubW92ZVRvKHQsZSk7Zm9yKHZhciBzPW4ubGVuZ3RoLHI9aS10LGE9by1lLGg9YS9yLGQ9TWF0aC5zcXJ0KHIqcithKmEpLGw9MCxjPSEwLHU9MCxwPW5bMF07ZD49LjE7KXA9bltsKyslc10scD5kJiYocD1kKSx1PU1hdGguc3FydChwKnAvKDEraCpoKSksdT1yPDA/LXU6dSx0Kz11LGUrPWgqdSxjPT09ITA/dGhpcy5saW5lVG8odCxlKTp0aGlzLm1vdmVUbyh0LGUpLGQtPXAsYz0hY30pfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkodCl7cmV0dXJuIFA9dCxwKCl9ZnVuY3Rpb24gbygpe0k9MCxOPVAuY2hhckF0KDApfWZ1bmN0aW9uIG4oKXtJKyssTj1QLmNoYXJBdChJKX1mdW5jdGlvbiBzKCl7cmV0dXJuIFAuY2hhckF0KEkrMSl9ZnVuY3Rpb24gcih0KXtyZXR1cm4gei50ZXN0KHQpfWZ1bmN0aW9uIGEodCxlKXtpZih0fHwodD17fSksZSlmb3IodmFyIGkgaW4gZSllLmhhc093blByb3BlcnR5KGkpJiYodFtpXT1lW2ldKTtyZXR1cm4gdH1mdW5jdGlvbiBoKHQsZSxpKXtmb3IodmFyIG89ZS5zcGxpdCgiLiIpLG49dDtvLmxlbmd0aDspe3ZhciBzPW8uc2hpZnQoKTtvLmxlbmd0aD8obltzXXx8KG5bc109e30pLG49bltzXSk6bltzXT1pfX1mdW5jdGlvbiBkKHQsZSl7Zm9yKHZhciBpLG8sbj1udWxsLHM9W3RdLHI9dDtyLnBhcmVudDspcy5wdXNoKHIucGFyZW50KSxyPXIucGFyZW50O2lmKHIubm9kZXMpZm9yKGk9MCxvPXIubm9kZXMubGVuZ3RoO2k8bztpKyspaWYoZS5pZD09PXIubm9kZXNbaV0uaWQpe249ci5ub2Rlc1tpXTticmVha31mb3Iobnx8KG49e2lkOmUuaWR9LHQubm9kZSYmKG4uYXR0cj1hKG4uYXR0cix0Lm5vZGUpKSksaT1zLmxlbmd0aC0xO2k+PTA7aS0tKXt2YXIgaD1zW2ldO2gubm9kZXN8fChoLm5vZGVzPVtdKSxoLm5vZGVzLmluZGV4T2Yobik9PT0tMSYmaC5ub2Rlcy5wdXNoKG4pfWUuYXR0ciYmKG4uYXR0cj1hKG4uYXR0cixlLmF0dHIpKX1mdW5jdGlvbiBsKHQsZSl7aWYodC5lZGdlc3x8KHQuZWRnZXM9W10pLHQuZWRnZXMucHVzaChlKSx0LmVkZ2Upe3ZhciBpPWEoe30sdC5lZGdlKTtlLmF0dHI9YShpLGUuYXR0cil9fWZ1bmN0aW9uIGModCxlLGksbyxuKXt2YXIgcz17ZnJvbTplLHRvOmksdHlwZTpvfTtyZXR1cm4gdC5lZGdlJiYocy5hdHRyPWEoe30sdC5lZGdlKSkscy5hdHRyPWEocy5hdHRyfHx7fSxuKSxzfWZ1bmN0aW9uIHUoKXtmb3IoTD1FLk5VTEwsUj0iIjsiICI9PT1OfHwiXHQiPT09Tnx8IlxuIj09PU58fCJcciI9PT1OOyluKCk7ZG97dmFyIHQ9ITE7aWYoIiMiPT09Til7Zm9yKHZhciBlPUktMTsiICI9PT1QLmNoYXJBdChlKXx8Ilx0Ij09PVAuY2hhckF0KGUpOyllLS07aWYoIlxuIj09PVAuY2hhckF0KGUpfHwiIj09PVAuY2hhckF0KGUpKXtmb3IoOyIiIT1OJiYiXG4iIT1OOyluKCk7dD0hMH19aWYoIi8iPT09TiYmIi8iPT09cygpKXtmb3IoOyIiIT1OJiYiXG4iIT1OOyluKCk7dD0hMH1pZigiLyI9PT1OJiYiKiI9PT1zKCkpe2Zvcig7IiIhPU47KXtpZigiKiI9PT1OJiYiLyI9PT1zKCkpe24oKSxuKCk7YnJlYWt9bigpfXQ9ITB9Zm9yKDsiICI9PT1OfHwiXHQiPT09Tnx8IlxuIj09PU58fCJcciI9PT1OOyluKCl9d2hpbGUodCk7aWYoIiI9PT1OKXJldHVybiB2b2lkKEw9RS5ERUxJTUlURVIpO3ZhciBpPU4rcygpO2lmKE1baV0pcmV0dXJuIEw9RS5ERUxJTUlURVIsUj1pLG4oKSx2b2lkIG4oKTtpZihNW05dKXJldHVybiBMPUUuREVMSU1JVEVSLFI9Tix2b2lkIG4oKTtpZihyKE4pfHwiLSI9PT1OKXtmb3IoUis9TixuKCk7cihOKTspUis9TixuKCk7cmV0dXJuImZhbHNlIj09PVI/Uj0hMToidHJ1ZSI9PT1SP1I9ITA6aXNOYU4oTnVtYmVyKFIpKXx8KFI9TnVtYmVyKFIpKSx2b2lkKEw9RS5JREVOVElGSUVSKX1pZignIic9PT1OKXtmb3IobigpOyIiIT1OJiYoJyInIT1OfHwnIic9PT1OJiYnIic9PT1zKCkpOylSKz1OLCciJz09PU4mJm4oKSxuKCk7aWYoJyInIT1OKXRocm93IHcoJ0VuZCBvZiBzdHJpbmcgIiBleHBlY3RlZCcpO3JldHVybiBuKCksdm9pZChMPUUuSURFTlRJRklFUil9Zm9yKEw9RS5VTktOT1dOOyIiIT1OOylSKz1OLG4oKTt0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1N5bnRheCBlcnJvciBpbiBwYXJ0ICInK3goUiwzMCkrJyInKX1mdW5jdGlvbiBwKCl7dmFyIHQ9e307aWYobygpLHUoKSwic3RyaWN0Ij09PVImJih0LnN0cmljdD0hMCx1KCkpLCJncmFwaCIhPT1SJiYiZGlncmFwaCIhPT1SfHwodC50eXBlPVIsdSgpKSxMPT09RS5JREVOVElGSUVSJiYodC5pZD1SLHUoKSksInsiIT1SKXRocm93IHcoIkFuZ2xlIGJyYWNrZXQgeyBleHBlY3RlZCIpO2lmKHUoKSxmKHQpLCJ9IiE9Uil0aHJvdyB3KCJBbmdsZSBicmFja2V0IH0gZXhwZWN0ZWQiKTtpZih1KCksIiIhPT1SKXRocm93IHcoIkVuZCBvZiBmaWxlIGV4cGVjdGVkIik7cmV0dXJuIHUoKSxkZWxldGUgdC5ub2RlLGRlbGV0ZSB0LmVkZ2UsZGVsZXRlIHQuZ3JhcGgsdH1mdW5jdGlvbiBmKHQpe2Zvcig7IiIhPT1SJiYifSIhPVI7KW0odCksIjsiPT09UiYmdSgpfWZ1bmN0aW9uIG0odCl7dmFyIGU9dih0KTtpZihlKXJldHVybiB2b2lkIGIodCxlKTt2YXIgaT1nKHQpO2lmKCFpKXtpZihMIT1FLklERU5USUZJRVIpdGhyb3cgdygiSWRlbnRpZmllciBleHBlY3RlZCIpO3ZhciBvPVI7aWYodSgpLCI9Ij09PVIpe2lmKHUoKSxMIT1FLklERU5USUZJRVIpdGhyb3cgdygiSWRlbnRpZmllciBleHBlY3RlZCIpO3Rbb109Uix1KCl9ZWxzZSB5KHQsbyl9fWZ1bmN0aW9uIHYodCl7dmFyIGU9bnVsbDtpZigic3ViZ3JhcGgiPT09UiYmKGU9e30sZS50eXBlPSJzdWJncmFwaCIsdSgpLEw9PT1FLklERU5USUZJRVImJihlLmlkPVIsdSgpKSksInsiPT09Uil7aWYodSgpLGV8fChlPXt9KSxlLnBhcmVudD10LGUubm9kZT10Lm5vZGUsZS5lZGdlPXQuZWRnZSxlLmdyYXBoPXQuZ3JhcGgsZihlKSwifSIhPVIpdGhyb3cgdygiQW5nbGUgYnJhY2tldCB9IGV4cGVjdGVkIik7dSgpLGRlbGV0ZSBlLm5vZGUsZGVsZXRlIGUuZWRnZSxkZWxldGUgZS5ncmFwaCxkZWxldGUgZS5wYXJlbnQsdC5zdWJncmFwaHN8fCh0LnN1YmdyYXBocz1bXSksdC5zdWJncmFwaHMucHVzaChlKX1yZXR1cm4gZX1mdW5jdGlvbiBnKHQpe3JldHVybiJub2RlIj09PVI/KHUoKSx0Lm5vZGU9XygpLCJub2RlIik6ImVkZ2UiPT09Uj8odSgpLHQuZWRnZT1fKCksImVkZ2UiKToiZ3JhcGgiPT09Uj8odSgpLHQuZ3JhcGg9XygpLCJncmFwaCIpOm51bGx9ZnVuY3Rpb24geSh0LGUpe3ZhciBpPXtpZDplfSxvPV8oKTtvJiYoaS5hdHRyPW8pLGQodCxpKSxiKHQsZSl9ZnVuY3Rpb24gYih0LGUpe2Zvcig7Ii0+Ij09PVJ8fCItLSI9PT1SOyl7dmFyIGksbz1SO3UoKTt2YXIgbj12KHQpO2lmKG4paT1uO2Vsc2V7aWYoTCE9RS5JREVOVElGSUVSKXRocm93IHcoIklkZW50aWZpZXIgb3Igc3ViZ3JhcGggZXhwZWN0ZWQiKTtpPVIsZCh0LHtpZDppfSksdSgpfXZhciBzPV8oKSxyPWModCxlLGksbyxzKTtsKHQsciksZT1pfX1mdW5jdGlvbiBfKCl7Zm9yKHZhciB0PW51bGw7IlsiPT09Ujspe2Zvcih1KCksdD17fTsiIiE9PVImJiJdIiE9Ujspe2lmKEwhPUUuSURFTlRJRklFUil0aHJvdyB3KCJBdHRyaWJ1dGUgbmFtZSBleHBlY3RlZCIpO3ZhciBlPVI7aWYodSgpLCI9IiE9Uil0aHJvdyB3KCJFcXVhbCBzaWduID0gZXhwZWN0ZWQiKTtpZih1KCksTCE9RS5JREVOVElGSUVSKXRocm93IHcoIkF0dHJpYnV0ZSB2YWx1ZSBleHBlY3RlZCIpO3ZhciBpPVI7aCh0LGUsaSksdSgpLCIsIj09UiYmdSgpfWlmKCJdIiE9Uil0aHJvdyB3KCJCcmFja2V0IF0gZXhwZWN0ZWQiKTt1KCl9cmV0dXJuIHR9ZnVuY3Rpb24gdyh0KXtyZXR1cm4gbmV3IFN5bnRheEVycm9yKHQrJywgZ290ICInK3goUiwzMCkrJyIgKGNoYXIgJytJKyIpIil9ZnVuY3Rpb24geCh0LGUpe3JldHVybiB0Lmxlbmd0aDw9ZT90OnQuc3Vic3RyKDAsMjcpKyIuLi4ifWZ1bmN0aW9uIGsodCxlLGkpe0FycmF5LmlzQXJyYXkodCk/dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe0FycmF5LmlzQXJyYXkoZSk/ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2kodCxlKX0pOmkodCxlKX0pOkFycmF5LmlzQXJyYXkoZSk/ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2kodCxlKX0pOmkodCxlKX1mdW5jdGlvbiBPKHQsZSxpKXtmb3IodmFyIG89ZS5zcGxpdCgiLiIpLG49by5wb3AoKSxzPXQscj0wO3I8by5sZW5ndGg7cisrKXt2YXIgYT1vW3JdO2EgaW4gc3x8KHNbYV09e30pLHM9c1thXX1yZXR1cm4gc1tuXT1pLHR9ZnVuY3Rpb24gRCh0LGUpe3ZhciBpPXt9O2Zvcih2YXIgbyBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkobykpe3ZhciBuPWVbb107QXJyYXkuaXNBcnJheShuKT9uLmZvckVhY2goZnVuY3Rpb24oZSl7TyhpLGUsdFtvXSl9KToic3RyaW5nIj09dHlwZW9mIG4/TyhpLG4sdFtvXSk6TyhpLG8sdFtvXSl9cmV0dXJuIGl9ZnVuY3Rpb24gUyh0KXt2YXIgZT1pKHQpLG89e25vZGVzOltdLGVkZ2VzOltdLG9wdGlvbnM6e319O2lmKGUubm9kZXMmJmUubm9kZXMuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT17aWQ6dC5pZCxsYWJlbDpTdHJpbmcodC5sYWJlbHx8dC5pZCl9O2EoZSxEKHQuYXR0cixDKSksZS5pbWFnZSYmKGUuc2hhcGU9ImltYWdlIiksby5ub2Rlcy5wdXNoKGUpfSksZS5lZGdlcyl7dmFyIG49ZnVuY3Rpb24odCl7dmFyIGU9e2Zyb206dC5mcm9tLHRvOnQudG99O3JldHVybiBhKGUsRCh0LmF0dHIsVCkpLGUuYXJyb3dzPSItPiI9PT10LnR5cGU/InRvIjp2b2lkIDAsZX07ZS5lZGdlcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlLGk7ZT10LmZyb20gaW5zdGFuY2VvZiBPYmplY3Q/dC5mcm9tLm5vZGVzOntpZDp0LmZyb219LGk9dC50byBpbnN0YW5jZW9mIE9iamVjdD90LnRvLm5vZGVzOntpZDp0LnRvfSx0LmZyb20gaW5zdGFuY2VvZiBPYmplY3QmJnQuZnJvbS5lZGdlcyYmdC5mcm9tLmVkZ2VzLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9bih0KTtvLmVkZ2VzLnB1c2goZSl9KSxrKGUsaSxmdW5jdGlvbihlLGkpe3ZhciBzPWMobyxlLmlkLGkuaWQsdC50eXBlLHQuYXR0cikscj1uKHMpO28uZWRnZXMucHVzaChyKX0pLHQudG8gaW5zdGFuY2VvZiBPYmplY3QmJnQudG8uZWRnZXMmJnQudG8uZWRnZXMuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT1uKHQpO28uZWRnZXMucHVzaChlKX0pfSl9cmV0dXJuIGUuYXR0ciYmKG8ub3B0aW9ucz1lLmF0dHIpLG99dmFyIEM9e2ZvbnRzaXplOiJmb250LnNpemUiLGZvbnRjb2xvcjoiZm9udC5jb2xvciIsbGFiZWxmb250Y29sb3I6ImZvbnQuY29sb3IiLGZvbnRuYW1lOiJmb250LmZhY2UiLGNvbG9yOlsiY29sb3IuYm9yZGVyIiwiY29sb3IuYmFja2dyb3VuZCJdLGZpbGxjb2xvcjoiY29sb3IuYmFja2dyb3VuZCIsdG9vbHRpcDoidGl0bGUiLGxhYmVsdG9vbHRpcDoidGl0bGUifSxUPU9iamVjdC5jcmVhdGUoQyk7VC5jb2xvcj0iY29sb3IuY29sb3IiO3ZhciBFPXtOVUxMOjAsREVMSU1JVEVSOjEsSURFTlRJRklFUjoyLFVOS05PV046M30sTT17InsiOiEwLCJ9IjohMCwiWyI6ITAsIl0iOiEwLCI7IjohMCwiPSI6ITAsIiwiOiEwLCItPiI6ITAsIi0tIjohMH0sUD0iIixJPTAsTj0iIixSPSIiLEw9RS5OVUxMLHo9L1thLXpBLVpfMC05LjojXS87ZS5wYXJzZURPVD1pLGUuRE9UVG9HcmFwaD1TfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkodCxlKXt2YXIgaT1bXSxvPVtdLG49e2VkZ2VzOntpbmhlcml0Q29sb3I6ITF9LG5vZGVzOntmaXhlZDohMSxwYXJzZUNvbG9yOiExfX07dm9pZCAwIT09ZSYmKHZvaWQgMCE9PWUuZml4ZWQmJihuLm5vZGVzLmZpeGVkPWUuZml4ZWQpLHZvaWQgMCE9PWUucGFyc2VDb2xvciYmKG4ubm9kZXMucGFyc2VDb2xvcj1lLnBhcnNlQ29sb3IpLHZvaWQgMCE9PWUuaW5oZXJpdENvbG9yJiYobi5lZGdlcy5pbmhlcml0Q29sb3I9ZS5pbmhlcml0Q29sb3IpKTtmb3IodmFyIHM9dC5lZGdlcyxyPXQubm9kZXMsYT0wO2E8cy5sZW5ndGg7YSsrKXt2YXIgaD17fSxkPXNbYV07aC5pZD1kLmlkLGguZnJvbT1kLnNvdXJjZSxoLnRvPWQudGFyZ2V0LGguYXR0cmlidXRlcz1kLmF0dHJpYnV0ZXMsaC5sYWJlbD1kLmxhYmVsLGgudGl0bGU9dm9pZCAwIT09ZC5hdHRyaWJ1dGVzP2QuYXR0cmlidXRlcy50aXRsZTp2b2lkIDAsIkRpcmVjdGVkIj09PWQudHlwZSYmKGguYXJyb3dzPSJ0byIpLGQuY29sb3ImJm4uaW5oZXJpdENvbG9yPT09ITEmJihoLmNvbG9yPWQuY29sb3IpLGkucHVzaChoKX1mb3IodmFyIGE9MDthPHIubGVuZ3RoO2ErKyl7dmFyIGw9e30sYz1yW2FdO2wuaWQ9Yy5pZCxsLmF0dHJpYnV0ZXM9Yy5hdHRyaWJ1dGVzLGwudGl0bGU9Yy50aXRsZSxsLng9Yy54LGwueT1jLnksbC5sYWJlbD1jLmxhYmVsLGwudGl0bGU9dm9pZCAwIT09Yy5hdHRyaWJ1dGVzP2MuYXR0cmlidXRlcy50aXRsZTp2b2lkIDAsbi5ub2Rlcy5wYXJzZUNvbG9yPT09ITA/bC5jb2xvcj1jLmNvbG9yOmwuY29sb3I9dm9pZCAwIT09Yy5jb2xvcj97YmFja2dyb3VuZDpjLmNvbG9yLGJvcmRlcjpjLmNvbG9yLGhpZ2hsaWdodDp7YmFja2dyb3VuZDpjLmNvbG9yLGJvcmRlcjpjLmNvbG9yfSxob3Zlcjp7YmFja2dyb3VuZDpjLmNvbG9yLGJvcmRlcjpjLmNvbG9yfX06dm9pZCAwLGwuc2l6ZT1jLnNpemUsbC5maXhlZD1uLm5vZGVzLmZpeGVkJiZ2b2lkIDAhPT1jLngmJnZvaWQgMCE9PWMueSxvLnB1c2gobCl9cmV0dXJue25vZGVzOm8sZWRnZXM6aX19ZS5wYXJzZUdlcGhpPWl9LGZ1bmN0aW9uKHQsZSl7ZS5lbj17ZWRpdDoiRWRpdCIsZGVsOiJEZWxldGUgc2VsZWN0ZWQiLGJhY2s6IkJhY2siLGFkZE5vZGU6IkFkZCBOb2RlIixhZGRFZGdlOiJBZGQgRWRnZSIsZWRpdE5vZGU6IkVkaXQgTm9kZSIsZWRpdEVkZ2U6IkVkaXQgRWRnZSIsYWRkRGVzY3JpcHRpb246IkNsaWNrIGluIGFuIGVtcHR5IHNwYWNlIHRvIHBsYWNlIGEgbmV3IG5vZGUuIixlZGdlRGVzY3JpcHRpb246IkNsaWNrIG9uIGEgbm9kZSBhbmQgZHJhZyB0aGUgZWRnZSB0byBhbm90aGVyIG5vZGUgdG8gY29ubmVjdCB0aGVtLiIsZWRpdEVkZ2VEZXNjcmlwdGlvbjoiQ2xpY2sgb24gdGhlIGNvbnRyb2wgcG9pbnRzIGFuZCBkcmFnIHRoZW0gdG8gYSBub2RlIHRvIGNvbm5lY3QgdG8gaXQuIixjcmVhdGVFZGdlRXJyb3I6IkNhbm5vdCBsaW5rIGVkZ2VzIHRvIGEgY2x1c3Rlci4iLGRlbGV0ZUNsdXN0ZXJFcnJvcjoiQ2x1c3RlcnMgY2Fubm90IGJlIGRlbGV0ZWQuIixlZGl0Q2x1c3RlckVycm9yOiJDbHVzdGVycyBjYW5ub3QgYmUgZWRpdGVkLiJ9LGUuZW5fRU49ZS5lbixlLmVuX1VTPWUuZW4sZS5kZT17ZWRpdDoiRWRpdGllcmVuIixkZWw6IkzDtnNjaGUgQXVzd2FobCIsYmFjazoiWnVyw7xjayIsYWRkTm9kZToiS25vdGVuIGhpbnp1ZsO8Z2VuIixhZGRFZGdlOiJLYW50ZSBoaW56dWbDvGdlbiIsZWRpdE5vZGU6Iktub3RlbiBlZGl0aWVyZW4iLGVkaXRFZGdlOiJLYW50ZSBlZGl0aWVyZW4iLGFkZERlc2NyaXB0aW9uOiJLbGlja2UgYXVmIGVpbmUgZnJlaWUgU3RlbGxlLCB1bSBlaW5lbiBuZXVlbiBLbm90ZW4genUgcGxhemllcmVuLiIsZWRnZURlc2NyaXB0aW9uOiJLbGlja2UgYXVmIGVpbmVuIEtub3RlbiB1bmQgemllaGUgZGllIEthbnRlIHp1IGVpbmVtIGFuZGVyZW4gS25vdGVuLCB1bSBkaWVzZSB6dSB2ZXJiaW5kZW4uIixlZGl0RWRnZURlc2NyaXB0aW9uOiJLbGlja2UgYXVmIGRpZSBWZXJiaW5kdW5nc3B1bmt0ZSB1bmQgemllaGUgZGllc2UgYXVmIGVpbmVuIEtub3RlbiwgdW0gc2llIHp1IHZlcmJpbmRlbi4iLGNyZWF0ZUVkZ2VFcnJvcjoiRXMgaXN0IG5pY2h0IG3DtmdsaWNoLCBLYW50ZW4gbWl0IENsdXN0ZXJuIHp1IHZlcmJpbmRlbi4iLGRlbGV0ZUNsdXN0ZXJFcnJvcjoiQ2x1c3RlciBrw7ZubmVuIG5pY2h0IGdlbMO2c2NodCB3ZXJkZW4uIixlZGl0Q2x1c3RlckVycm9yOiJDbHVzdGVyIGvDtm5uZW4gbmljaHQgZWRpdGllcnQgd2VyZGVuLiJ9LGUuZGVfREU9ZS5kZSxlLmVzPXtlZGl0OiJFZGl0YXIiLGRlbDoiRWxpbWluYXIgc2VsZWNjacOzbiIsYmFjazoiw4F0cmFzIixhZGROb2RlOiJBw7FhZGlyIG5vZG8iLGFkZEVkZ2U6IkHDsWFkaXIgYXJpc3RhIixlZGl0Tm9kZToiRWRpdGFyIG5vZG8iLGVkaXRFZGdlOiJFZGl0YXIgYXJpc3RhIixhZGREZXNjcmlwdGlvbjoiSGFnYSBjbGljIGVuIHVuIGx1Z2FyIHZhY8OtbyBwYXJhIGNvbG9jYXIgdW4gbnVldm8gbm9kby4iLGVkZ2VEZXNjcmlwdGlvbjoiSGFnYSBjbGljIGVuIHVuIG5vZG8geSBhcnJhc3RyZSBsYSBhcmlzdGEgaGFjaWEgb3RybyBub2RvIHBhcmEgY29uZWN0YXJsb3MuIixlZGl0RWRnZURlc2NyaXB0aW9uOiJIYWdhIGNsaWMgZW4gdW4gcHVudG8gZGUgY29udHJvbCB5IGFycmFzdHJlbG8gYSB1biBub2RvIHBhcmEgY29uZWN0YXJsby4iLGNyZWF0ZUVkZ2VFcnJvcjoiTm8gc2UgcHVlZGUgY29uZWN0YXIgdW5hIGFyaXN0YSBhIHVuIGdydXBvLiIsZGVsZXRlQ2x1c3RlckVycm9yOiJObyBlcyBwb3NpYmxlIGVsaW1pbmFyIGdydXBvcy4iLGVkaXRDbHVzdGVyRXJyb3I6Ik5vIGVzIHBvc2libGUgZWRpdGFyIGdydXBvcy4ifSxlLmVzX0VTPWUuZXMsZS5pdD17ZWRpdDoiTW9kaWZpY2EiLGRlbDoiQ2FuY2VsbGEgbGEgc2VsZXppb25lIixiYWNrOiJJbmRpZXRybyIsYWRkTm9kZToiQWdnaXVuZ2kgdW4gbm9kbyIsYWRkRWRnZToiQWdnaXVuZ2kgdW4gdmVydGljZSIsZWRpdE5vZGU6Ik1vZGlmaWNhIGlsIG5vZG8iLGVkaXRFZGdlOiJNb2RpZmljYSBpbCB2ZXJ0aWNlIixhZGREZXNjcmlwdGlvbjoiQ2xpY2NhIHBlciBhZ2dpdW5nZXJlIHVuIG51b3ZvIG5vZG8iLGVkZ2VEZXNjcmlwdGlvbjoiQ2xpY2NhIHN1IHVuIG5vZG8gZSB0cmFzY2luYWxvIGFkIHVuIGFsdHJvIG5vZG8gcGVyIGNvbm5ldHRlcmxpLiIsZWRpdEVkZ2VEZXNjcmlwdGlvbjoiQ2xpY2NhIHN1aSBQdW50aSBkaSBjb250cm9sbG8gZSB0cmFzY2luYWxpIGFkIHVuIG5vZG8gcGVyIGNvbm5ldHRlcmxpLiIsY3JlYXRlRWRnZUVycm9yOiJOb24gc2kgcG9zc29ubyBjb2xsZWdhcmUgdmVydGljaSBhZCB1biBjbHVzdGVyIixkZWxldGVDbHVzdGVyRXJyb3I6IkkgY2x1c3RlciBub24gcG9zc29ubyBlc3NlcmUgY2FuY2VsbGF0aSIsZWRpdENsdXN0ZXJFcnJvcjoiSSBjbHVzdGVycyBub24gcG9zc29ubyBlc3NlcmUgbW9kaWZpY2F0aS4ifSxlLml0X0lUPWUuaXQsZS5ubD17ZWRpdDoiV2lqemlnZW4iLGRlbDoiU2VsZWN0aWUgdmVyd2lqZGVyZW4iLGJhY2s6IlRlcnVnIixhZGROb2RlOiJOb2RlIHRvZXZvZWdlbiIsYWRkRWRnZToiTGluayB0b2V2b2VnZW4iLGVkaXROb2RlOiJOb2RlIHdpanppZ2VuIixlZGl0RWRnZToiTGluayB3aWp6aWdlbiIsYWRkRGVzY3JpcHRpb246IktsaWsgb3AgZWVuIGxlZWcgZ2ViaWVkIG9tIGVlbiBuaWV1d2Ugbm9kZSB0ZSBtYWtlbi4iLGVkZ2VEZXNjcmlwdGlvbjoiS2xpayBvcCBlZW4gbm9kZSBlbiBzbGVlcCBkZSBsaW5rIG5hYXIgZWVuIGFuZGVyZSBub2RlIG9tIHplIHRlIHZlcmJpbmRlbi4iLGVkaXRFZGdlRGVzY3JpcHRpb246IktsaWsgb3AgZGUgdmVyYmluZGluZ3NwdW50ZW4gZW4gc2xlZXAgemUgbmFhciBlZW4gbm9kZSBvbSBkYWFybWVlIHRlIHZlcmJpbmRlbi4iLGNyZWF0ZUVkZ2VFcnJvcjoiS2FuIGdlZW4gbGluayBtYWtlbiBuYWFyIGVlbiBjbHVzdGVyLiIsZGVsZXRlQ2x1c3RlckVycm9yOiJDbHVzdGVycyBrdW5uZW4gbmlldCB3b3JkZW4gdmVyd2lqZGVyZC4iLGVkaXRDbHVzdGVyRXJyb3I6IkNsdXN0ZXJzIGt1bm5lbiBuaWV0IHdvcmRlbiBhYW5nZXBhc3QuIn0sZS5ubF9OTD1lLm5sLGUubmxfQkU9ZS5ubCxlWyJwdC1iciJdPXtlZGl0OiJFZGl0YXIiLGRlbDoiUmVtb3ZlciBzZWxlY2lvbmFkbyIsYmFjazoiVm9sdGFyIixhZGROb2RlOiJBZGljaW9uYXIgbsOzIixhZGRFZGdlOiJBZGljaW9uYXIgYXJlc3RhIixlZGl0Tm9kZToiRWRpdGFyIG7DsyIsZWRpdEVkZ2U6IkVkaXRhciBhcmVzdGEiLGFkZERlc2NyaXB0aW9uOiJDbGlxdWUgZW0gdW0gZXNwYcOnbyBlbSBicmFuY28gcGFyYSBhZGljaW9uYXIgdW0gbm92byBuw7MiLGVkZ2VEZXNjcmlwdGlvbjoiQ2xpcXVlIGVtIHVtIG7DsyBlIGFycmFzdGUgYSBhcmVzdGEgYXTDqSBvdXRybyBuw7MgcGFyYSBjb25lY3TDoS1sb3MiLGVkaXRFZGdlRGVzY3JpcHRpb246IkNsaXF1ZSBub3MgcG9udG9zIGRlIGNvbnRyb2xlIGUgb3MgYXJyYXN0ZSBwYXJhIHVtIG7DsyBwYXJhIGNvbmVjdMOhLWxvcyIsY3JlYXRlRWRnZUVycm9yOiJOw6NvIGZvaSBwb3Nzw612ZWwgbGlua2FyIGFyZXN0YXMgYSB1bSBjbHVzdGVyLiIsZGVsZXRlQ2x1c3RlckVycm9yOiJDbHVzdGVycyBuw6NvIHB1ZGVyYW0gc2VyIHJlbW92aWRvcy4iLGVkaXRDbHVzdGVyRXJyb3I6IkNsdXN0ZXJzIG7Do28gcHVkZXJhbSBzZXIgZWRpdGFkb3MuIn0sZVsicHQtQlIiXT1lWyJwdC1iciJdLGUucHRfQlI9ZVsicHQtYnIiXSxlLnB0X2JyPWVbInB0LWJyIl0sZS5ydT17ZWRpdDoi0KDQtdC00LDQutGC0LjRgNC+0LLQsNGC0YwiLGRlbDoi0KPQtNCw0LvQuNGC0Ywg0LLRi9Cx0YDQsNC90L3QvtC1IixiYWNrOiLQndCw0LfQsNC0IixhZGROb2RlOiLQlNC+0LHQsNCy0LjRgtGMINGD0LfQtdC7IixhZGRFZGdlOiLQlNC+0LHQsNCy0LjRgtGMINGA0LXQsdGA0L4iLGVkaXROb2RlOiLQoNC10LTQsNC60YLQuNGA0L7QstCw0YLRjCDRg9C30LXQuyIsZWRpdEVkZ2U6ItCg0LXQtNCw0LrRgtC40YDQvtCy0LDRgtGMINGA0LXQsdGA0L4iLGFkZERlc2NyaXB0aW9uOiLQmtC70LjQutC90LjRgtC1INCyINGB0LLQvtCx0L7QtNC90L7QtSDQvNC10YHRgtC+LCDRh9GC0L7QsdGLINC00L7QsdCw0LLQuNGC0Ywg0L3QvtCy0YvQuSDRg9C30LXQuy4iLGVkZ2VEZXNjcmlwdGlvbjoi0JrQu9C40LrQvdC40YLQtSDQvdCwINGD0LfQtdC7INC4INC/0YDQvtGC0Y/QvdC40YLQtSDRgNC10LHRgNC+INC6INC00YDRg9Cz0L7QvNGDINGD0LfQu9GDLCDRh9GC0L7QsdGLINGB0L7QtdC00LjQvdC40YLRjCDQuNGFLiIsZWRpdEVkZ2VEZXNjcmlwdGlvbjoi0JrQu9C40LrQvdC40YLQtSDQvdCwINC60L7QvdGC0YDQvtC70YzQvdGL0LUg0YLQvtGH0LrQuCDQuCDQv9C10YDQtdGC0LDRidC40YLQtSDQuNGFINCyINGD0LfQtdC7LCDRh9GC0L7QsdGLINC/0L7QtNC60LvRjtGH0LjRgtGM0YHRjyDQuiDQvdC10LzRgy4iLGNyZWF0ZUVkZ2VFcnJvcjoi0J3QtdCy0L7Qt9C80L7QttC90L4g0YHQvtC10LTQuNC90LjRgtGMINGA0LXQsdGA0LAg0LIg0LrQu9Cw0YHRgtC10YAuIixkZWxldGVDbHVzdGVyRXJyb3I6ItCa0LvQsNGB0YLQtdGA0Ysg0L3QtSDQvNC+0LPRg9GCINCx0YvRgtGMINGD0LTQsNC70LXQvdGLIixlZGl0Q2x1c3RlckVycm9yOiLQmtC70LDRgdGC0LXRgNGLINC90LXQtNC+0YHRgtGD0L/QvdGLINC00LvRjyDRgNC10LTQsNC60YLQuNGA0L7QstCw0L3QuNGPLiJ9LGUucnVfUlU9ZS5ydX1dKX0pOwovLyMgc291cmNlTWFwcGluZ1VSTD12aXMubWFwCg=="></script> <script src="data:application/x-javascript;base64,Ly8gQWRkIHNoaW0gZm9yIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kKCkgZnJvbToKLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9GdW5jdGlvbi9iaW5kI0NvbXBhdGliaWxpdHkKLy8gZm9yIGZpeCBzb21lIFJTdHVkaW8gdmlld2VyIGJ1ZyAoRGVza3RvcCAvIHdpbmRvd3MpCmlmICghRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQpIHsKICBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uIChvVGhpcykgewogICAgaWYgKHR5cGVvZiB0aGlzICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgIC8vIGNsb3Nlc3QgdGhpbmcgcG9zc2libGUgdG8gdGhlIEVDTUFTY3JpcHQgNSBpbnRlcm5hbCBJc0NhbGxhYmxlIGZ1bmN0aW9uCiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kIC0gd2hhdCBpcyB0cnlpbmcgdG8gYmUgYm91bmQgaXMgbm90IGNhbGxhYmxlIik7CiAgICB9CiAgICAKICAgIHZhciBhQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSksCiAgICBmVG9CaW5kID0gdGhpcywKICAgIGZOT1AgPSBmdW5jdGlvbiAoKSB7fSwKICAgIGZCb3VuZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIGZUb0JpbmQuYXBwbHkodGhpcyBpbnN0YW5jZW9mIGZOT1AgJiYgb1RoaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogb1RoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFBcmdzLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7CiAgICB9OwogICAgCiAgICBmTk9QLnByb3RvdHlwZSA9IHRoaXMucHJvdG90eXBlOwogICAgZkJvdW5kLnByb3RvdHlwZSA9IG5ldyBmTk9QKCk7CiAgICAKICAgIHJldHVybiBmQm91bmQ7CiAgfTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBmdW5jdGlvbnMgdG8gcmVzZXQgZWRnZXMgYWZ0ZXIgaGFyZCB0byByZWFkCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIGZvciBlZGdlcwpmdW5jdGlvbiByZXNldEVkZ2VzKGVkZ2VzLCBoaWRlQ29sb3IpewogIHZhciBlZGdlc0hhcmRUb1JlYWQgPSBlZGdlcy5nZXQoewogICAgZmllbGRzOiBbJ2lkJywgJ2NvbG9yJ10sCiAgICBmaWx0ZXI6IGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgIHJldHVybiBpdGVtLmNvbG9yID09PSBoaWRlQ29sb3I7CiAgICB9LAogICAgcmV0dXJuVHlwZSA6J0FycmF5JwogIH0pOwogICAgICAgICAgICAKICAvLyBhbGwgaW4gZGVncmVlIG5vZGVzIGdldCB0aGVpciBvd24gY29sb3IgYW5kIHRoZWlyIGxhYmVsIGJhY2sKICBmb3IgKGkgPSAwOyBpIDwgZWRnZXNIYXJkVG9SZWFkLmxlbmd0aDsgaSsrKSB7CiAgICAgIGVkZ2VzSGFyZFRvUmVhZFtpXS5jb2xvciA9IG51bGw7CiAgfQogIGVkZ2VzLnVwZGF0ZShlZGdlc0hhcmRUb1JlYWQpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIGZ1bmN0aW9ucyB0byByZXNldCBub2RlcyBhZnRlciBoYXJkIHRvIHJlYWQKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gZm9yIGNsYXNzaWMgbm9kZQpmdW5jdGlvbiBzaW1wbGVSZXNldE5vZGUobm9kZSl7CiAgLy8gZ2V0IGJhY2sgY29sb3IKICBpZiAobm9kZS5oaWRkZW5Db2xvciAhPT0gdW5kZWZpbmVkKSB7CiAgICBub2RlLmNvbG9yID0gbm9kZS5oaWRkZW5Db2xvcjsKICAgIG5vZGUuaGlkZGVuQ29sb3IgPSB1bmRlZmluZWQ7CiAgfWVsc2V7CiAgICBub2RlLmNvbG9yID0gdW5kZWZpbmVkOwogIH0KfQoKLy8gZm9yIGljb24gbm9kZQpmdW5jdGlvbiBzaW1wbGVJY29uUmVzZXROb2RlKG5vZGUsIGdyb3VwX2NvbG9yKXsKICBpZihub2RlLmljb25EZWZpbmVkKXsgLy8gaWNvbiBkZWZpbmVkIGluIGluZGl2aWR1YWwgbm9kZSBkYXRhCiAgICBpZiAobm9kZS5oaWRkZW5Db2xvciAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIG5vZGUuaWNvbi5jb2xvciA9IG5vZGUuaGlkZGVuQ29sb3I7CiAgICAgIG5vZGUuaGlkZGVuQ29sb3IgPSB1bmRlZmluZWQ7CiAgICB9IGVsc2UgewoJICAvLyBidXQgY29sb3IgaW4gZ3JvdXAKICAgICAgaWYoZ3JvdXBfY29sb3IpewogICAgICAgIGRlbGV0ZSBub2RlLmljb24uY29sb3I7CiAgICAgIH1lbHNleyAvLyBlbHNlIHNldCBkZWZhdWx0IGNvbG9yCiAgICAgICAgbm9kZS5pY29uLmNvbG9yID0gIiMyQjdDRTkiOwogICAgICB9CiAgICB9CiAgfWVsc2V7IAogIC8vIGp1c3QgYSBncm91cCBkZWZpbml0aW9uLCBzbyBkZWxldGUgaW5kaXZpZHVhbCBpbmZvcm1hdGlvbgogICAgZGVsZXRlIG5vZGUuaWNvbjsKICB9CiAgLy8gZ2V0IGJhY2sgY29sb3IKICBpZiAobm9kZS5oaWRkZW5Db2xvckZvckxhYmVsICE9PSB1bmRlZmluZWQpIHsKICAgIG5vZGUuY29sb3IgPSBub2RlLmhpZGRlbkNvbG9yRm9yTGFiZWw7CiAgICBub2RlLmhpZGRlbkNvbG9yRm9yTGFiZWwgPSB1bmRlZmluZWQ7CiAgfWVsc2V7CiAgICBub2RlLmNvbG9yID0gdW5kZWZpbmVkOwogIH0KfQoKLy8gZm9yIGltYWdlIG5vZGUKZnVuY3Rpb24gc2ltcGxlSW1hZ2VSZXNldE5vZGUobm9kZSwgdHlwZSl7CiAgLy8gZ2V0IGJhY2sgY29sb3IKICBpZiAobm9kZS5oaWRkZW5Db2xvciAhPT0gdW5kZWZpbmVkKSB7CiAgICBub2RlLmNvbG9yID0gbm9kZS5oaWRkZW5Db2xvcjsKICAgIG5vZGUuaGlkZGVuQ29sb3IgPSB1bmRlZmluZWQ7CiAgfWVsc2V7CiAgICBub2RlLmNvbG9yID0gdW5kZWZpbmVkOwogIH0KICAvLyBhbmQgc2V0IHNoYXBlIGFzIGltYWdlL2NpcmN1bGFySW1hZ2UKICBub2RlLnNoYXBlID0gdHlwZTsKfQoKLy8gR2xvYmFsIGZ1bmN0aW9uIHRvIHJlc2V0IG9uZSBub2RlCmZ1bmN0aW9uIHJlc2V0T25lTm9kZShub2RlLCBncm91cHMsIG9wdGlvbnMpewogIGlmKG5vZGUuaXNIYXJkVG9SZWFkICE9PSB1bmRlZmluZWQpeyAvLyB3ZSBoYXZlIHRvIHJlc2V0IHRoaXMgbm9kZQogICAgaWYobm9kZS5pc0hhcmRUb1JlYWQpewogICAgICB2YXIgZmluYWxfc2hhcGU7CiAgICAgIHZhciBzaGFwZV9ncm91cCA9IGZhbHNlOwogICAgICB2YXIgaXNfZ3JvdXAgPSBmYWxzZTsKCSAgLy8gaGF2ZSBhIGdyb3VwIGluZm9ybWF0aW9uICYgYSBzaGFwZSBkZWZpbmVkIGluIGdyb3VwID8KICAgICAgaWYobm9kZS5ncm91cCAhPT0gdW5kZWZpbmVkKXsKICAgICAgICBpZihncm91cHMuZ3JvdXBzW25vZGUuZ3JvdXBdICE9PSB1bmRlZmluZWQpewogICAgICAgICAgaXNfZ3JvdXAgPSB0cnVlOwogICAgICAgICAgaWYoZ3JvdXBzLmdyb3Vwc1tub2RlLmdyb3VwXS5zaGFwZSAhPT0gdW5kZWZpbmVkKXsKICAgICAgICAgICAgc2hhcGVfZ3JvdXAgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvLyBoYXZlIGEgZ2xvYmFsIHNoYXBlIGluIG5vZGVzIG9wdGlvbnMgPwogICAgICB2YXIgc2hhcGVfb3B0aW9ucyA9IGZhbHNlOwogICAgICBpZihvcHRpb25zLm5vZGVzICE9PSB1bmRlZmluZWQpewogICAgICAgIGlmKG9wdGlvbnMubm9kZXMuc2hhcGUgIT09IHVuZGVmaW5lZCl7CiAgICAgICAgICBzaGFwZV9vcHRpb25zID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gc2V0IGZpbmFsIHNoYXBlIChpbmRpdmlkdWFsID4gZ3JvdXAgPiBnbG9iYWwpCiAgICAgIGlmKG5vZGUuaGlkZGVuSW1hZ2UgIT09IHVuZGVmaW5lZCl7CiAgICAgICAgZmluYWxfc2hhcGUgPSBub2RlLmhpZGRlbkltYWdlOwogICAgICB9IGVsc2UgaWYobm9kZS5zaGFwZSAhPT0gdW5kZWZpbmVkKXsKICAgICAgICBmaW5hbF9zaGFwZSA9IG5vZGUuc2hhcGU7CiAgICAgIH0gZWxzZSBpZihzaGFwZV9ncm91cCl7CiAgICAgICAgZmluYWxfc2hhcGUgPSBncm91cHMuZ3JvdXBzW25vZGUuZ3JvdXBdLnNoYXBlOwogICAgICB9IGVsc2UgaWYoc2hhcGVfb3B0aW9ucyl7CiAgICAgICAgZmluYWxfc2hhcGUgPSBvcHRpb25zLm5vZGVzLnNoYXBlOwogICAgICB9CiAgICAgIC8vIGFuZCBjYWxsIGdvb2QgcmVzZXQgZnVuY3Rpb24KICAgICAgaWYoZmluYWxfc2hhcGUgPT09ICJpY29uIil7CiAgICAgICAgZ3JvdXBfY29sb3IgPSBmYWxzZTsKICAgICAgICBpZihpc19ncm91cCl7IC8vIGhhdmUgaWNvbiBjb2xvciBpbiBncm91cCA/CiAgICAgICAgICBpZihncm91cHMuZ3JvdXBzW25vZGUuZ3JvdXBdLmljb24pewogICAgICAgICAgICBpZihncm91cHMuZ3JvdXBzW25vZGUuZ3JvdXBdLmljb24uY29sb3IpewogICAgICAgICAgICAgIGdyb3VwX2NvbG9yID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzaW1wbGVJY29uUmVzZXROb2RlKG5vZGUsIGdyb3VwX2NvbG9yKTsKICAgICAgfSBlbHNlIGlmKGZpbmFsX3NoYXBlID09PSAiaW1hZ2UiKXsKICAgICAgICBzaW1wbGVJbWFnZVJlc2V0Tm9kZShub2RlLCAiaW1hZ2UiKTsKICAgICAgfSBlbHNlIGlmKGZpbmFsX3NoYXBlID09PSAiY2lyY3VsYXJJbWFnZSIpewogICAgICAgIHNpbXBsZUltYWdlUmVzZXROb2RlKG5vZGUsICJjaXJjdWxhckltYWdlIik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2ltcGxlUmVzZXROb2RlKG5vZGUpOwogICAgICB9CgkgIC8vIGZpbmFsbHksIGdldCBiYWNrIGxhYmVsCiAgICAgIGlmIChub2RlLmhpZGRlbkxhYmVsICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBub2RlLmxhYmVsID0gbm9kZS5oaWRkZW5MYWJlbDsKICAgICAgICBub2RlLmhpZGRlbkxhYmVsID0gdW5kZWZpbmVkOwogICAgICB9CiAgICAgIG5vZGUuaXNIYXJkVG9SZWFkID0gZmFsc2U7CiAgICB9CiAgfQp9CgovLyBHbG9iYWwgZnVuY3Rpb24gdG8gcmVzZXQgYWxsIG5vZGUKZnVuY3Rpb24gcmVzZXRBbGxOb2RlcyhhbGxOb2RlcywgdXBkYXRlLCBub2RlcywgZ3JvdXBzLCBvcHRpb25zKXsKICB2YXIgdXBkYXRlQXJyYXkgPSBbXTsKICBmb3IgKHZhciBub2RlSWQgaW4gYWxsTm9kZXMpIHsKICAgIHJlc2V0T25lTm9kZShhbGxOb2Rlc1tub2RlSWRdLCBncm91cHMsIG9wdGlvbnMpOwoJLy8gcmVzZXQgY29vcmRpbmF0ZXMKICAgIGFsbE5vZGVzW25vZGVJZF0ueCA9IHVuZGVmaW5lZDsKICAgIGFsbE5vZGVzW25vZGVJZF0ueSA9IHVuZGVmaW5lZDsKICAgIGlmIChhbGxOb2Rlcy5oYXNPd25Qcm9wZXJ0eShub2RlSWQpICYmIHVwZGF0ZSkgewogICAgICB1cGRhdGVBcnJheS5wdXNoKGFsbE5vZGVzW25vZGVJZF0pOwogICAgfQogIH0KICBpZih1cGRhdGUpewogICAgbm9kZXMudXBkYXRlKHVwZGF0ZUFycmF5KTsKICB9Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gZnVuY3Rpb25zIHRvIHNldCBub2RlcyBhcyBoYXJkIHRvIHJlYWQKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gZm9yIGNsYXNzaWMgbm9kZQpmdW5jdGlvbiBzaW1wbGVOb2RlQXNIYXJkVG9SZWFkKG5vZGUsIGhpZGVDb2xvcjEsIGhpZGVDb2xvcjIpewogIC8vIHNhdmluZyBjb2xvciBpbmZvcm1hdGlvbiAoaWYgd2UgaGF2ZSkKICBpZiAobm9kZS5oaWRkZW5Db2xvciA9PT0gdW5kZWZpbmVkICYgbm9kZS5jb2xvciAhPT0gaGlkZUNvbG9yMSAmIG5vZGUuY29sb3IgIT09IGhpZGVDb2xvcjIpIHsKICAgIG5vZGUuaGlkZGVuQ29sb3IgPSBub2RlLmNvbG9yOwogIH0KICAvLyBzZXQgImhhcmQgdG8gcmVhZCIgY29sb3IKICBub2RlLmNvbG9yID0gaGlkZUNvbG9yMTsKICAvLyByZXNldCBhbmQgc2F2ZSBsYWJlbAogIGlmIChub2RlLmhpZGRlbkxhYmVsID09PSB1bmRlZmluZWQpIHsKICAgIG5vZGUuaGlkZGVuTGFiZWwgPSBub2RlLmxhYmVsOwogICAgbm9kZS5sYWJlbCA9IHVuZGVmaW5lZDsKICB9Cn0KCi8vIGZvciBpY29uIG5vZGUKZnVuY3Rpb24gaWNvbnNOb2RlQXNIYXJkVG9SZWFkKG5vZGUsIGhpZGVDb2xvcjEsIGhpZGVDb2xvcjIpewogIC8vIGluZGl2aWR1YWwgaW5mb3JtYXRpb24KICBpZihub2RlLmljb24gIT09IHVuZGVmaW5lZCl7CiAgICBub2RlLmljb25EZWZpbmVkID0gdHJ1ZTsKCS8vIHNhdmluZyBjb2xvciBpbmZvcm1hdGlvbiAoaWYgd2UgaGF2ZSkKICAgIGlmIChub2RlLmhpZGRlbkNvbG9yID09PSB1bmRlZmluZWQgJiBub2RlLmNvbG9yICE9PSBoaWRlQ29sb3IxICYgbm9kZS5jb2xvciAhPT0gaGlkZUNvbG9yMikgewogICAgICBub2RlLmhpZGRlbkNvbG9yID0gbm9kZS5pY29uLmNvbG9yOwogICAgfQogIH0gZWxzZSB7IC8vIGluZm9ybWF0aW9uIGluIGdyb3VwIDogaGF2ZSB0byBhcyBpbmRpdmlkdWFsCiAgICBub2RlLmljb24gPSB7fTsKICAgIG5vZGUuaWNvbkRlZmluZWQgPSBmYWxzZTsKICB9CiAgLy8gc2V0ICJoYXJkIHRvIHJlYWQiIGNvbG9yCiAgbm9kZS5pY29uLmNvbG9yID0gaGlkZUNvbG9yMTsKICAvLyBmb3IgZWRnZXMuLi4uc2F2aW5nIGNvbG9yIGluZm9ybWF0aW9uIChpZiB3ZSBoYXZlKQogIGlmIChub2RlLmhpZGRlbkNvbG9yRm9yTGFiZWwgPT09IHVuZGVmaW5lZCAmIG5vZGUuY29sb3IgIT09IGhpZGVDb2xvcjEgJiBub2RlLmNvbG9yICE9PSBoaWRlQ29sb3IyKSB7CiAgICBub2RlLmhpZGRlbkNvbG9yRm9yTGFiZWwgPSBub2RlLmNvbG9yOwogIH0KICAvLyBzZXQgImhhcmQgdG8gcmVhZCIgY29sb3IKICBub2RlLmNvbG9yID0gaGlkZUNvbG9yMTsKICAvLyByZXNldCBhbmQgc2F2ZSBsYWJlbAogIGlmIChub2RlLmhpZGRlbkxhYmVsID09PSB1bmRlZmluZWQpIHsKICAgIG5vZGUuaGlkZGVuTGFiZWwgPSBub2RlLmxhYmVsOwogICAgbm9kZS5sYWJlbCA9IHVuZGVmaW5lZDsKICB9Cn0KCi8vIGZvciBpbWFnZSBub2RlCmZ1bmN0aW9uIGltYWdlTm9kZUFzSGFyZFRvUmVhZChub2RlLCB0eXBlLCBoaWRlQ29sb3IxLCBoaWRlQ29sb3IyKXsKICAvLyBzYXZpbmcgY29sb3IgaW5mb3JtYXRpb24gKGlmIHdlIGhhdmUpCiAgaWYgKG5vZGUuaGlkZGVuQ29sb3IgPT09IHVuZGVmaW5lZCAmIG5vZGUuY29sb3IgIT09IGhpZGVDb2xvcjEgJiBub2RlLmNvbG9yICE9PSBoaWRlQ29sb3IyKSB7CiAgICBub2RlLmhpZGRlbkNvbG9yID0gbm9kZS5jb2xvcjsKICB9CiAgLy8gc2V0ICJoYXJkIHRvIHJlYWQiIGNvbG9yCiAgbm9kZS5jb2xvciA9IGhpZGVDb2xvcjE7CiAgLy8gcmVzZXQgYW5kIHNhdmUgbGFiZWwKICBpZiAobm9kZS5oaWRkZW5MYWJlbCA9PT0gdW5kZWZpbmVkKSB7CiAgICBub2RlLmhpZGRlbkxhYmVsID0gbm9kZS5sYWJlbDsKICAgIG5vZGUubGFiZWwgPSB1bmRlZmluZWQ7CiAgfQogIC8vIGtlZXAgc2hhcGUgaW5mb3JtYXRpb24sIGFuZCBzZXQgYSBuZXcKICBpZih0eXBlID09PSAiaW1hZ2UiKXsKICAgIG5vZGUuaGlkZGVuSW1hZ2UgPSB0eXBlOwogICAgbm9kZS5zaGFwZSA9ICJzcXVhcmUiOwogIH1lbHNlIGlmKHR5cGUgPT09ICJjaXJjdWxhckltYWdlIil7CiAgICBub2RlLmhpZGRlbkltYWdlID0gdHlwZTsKICAgIG5vZGUuc2hhcGUgPSAiZG90IjsKICB9Cn0KCi8vIEdsb2JhbCBmdW5jdGlvbiB0byBzZXQgb25lIG5vZGUgYXMgaGFyZCB0byByZWFkCmZ1bmN0aW9uIG5vZGVBc0hhcmRUb1JlYWQobm9kZSwgZ3JvdXBzLCBvcHRpb25zLCBoaWRlQ29sb3IxLCBoaWRlQ29sb3IyKXsKICB2YXIgZmluYWxfc2hhcGU7CiAgdmFyIHNoYXBlX2dyb3VwID0gZmFsc2U7CiAgLy8gaGF2ZSBhIGdyb3VwIGluZm9ybWF0aW9uICYgYSBzaGFwZSBkZWZpbmVkIGluIGdyb3VwID8KICBpZihub2RlLmdyb3VwICE9PSB1bmRlZmluZWQpewogICAgaWYoZ3JvdXBzLmdyb3Vwc1tub2RlLmdyb3VwXSAhPT0gdW5kZWZpbmVkKXsKICAgICAgaWYoZ3JvdXBzLmdyb3Vwc1tub2RlLmdyb3VwXS5zaGFwZSAhPT0gdW5kZWZpbmVkKXsKICAgICAgICBzaGFwZV9ncm91cCA9IHRydWU7CiAgICAgIH0KICAgIH0KICB9CiAgLy8gaGF2ZSBhIGdyb3VwIGluZm9ybWF0aW9uICYgYSBzaGFwZSBkZWZpbmVkIGluIGdyb3VwID8KICB2YXIgc2hhcGVfb3B0aW9ucyA9IGZhbHNlOwogIGlmKG9wdGlvbnMubm9kZXMgIT09IHVuZGVmaW5lZCl7CiAgICBpZihvcHRpb25zLm5vZGVzLnNoYXBlICE9PSB1bmRlZmluZWQpewogICAgICBzaGFwZV9vcHRpb25zID0gdHJ1ZTsKICAgIH0KICB9CiAgLy8gc2V0IGZpbmFsIHNoYXBlIChpbmRpdmlkdWFsID4gZ3JvdXAgPiBnbG9iYWwpCiAgaWYobm9kZS5zaGFwZSAhPT0gdW5kZWZpbmVkKXsKICAgIGZpbmFsX3NoYXBlID0gbm9kZS5zaGFwZTsKICB9IGVsc2UgaWYoc2hhcGVfZ3JvdXApewogICAgZmluYWxfc2hhcGUgPSBncm91cHMuZ3JvdXBzW25vZGUuZ3JvdXBdLnNoYXBlOwogIH0gZWxzZSBpZihzaGFwZV9vcHRpb25zKXsKICAgIGZpbmFsX3NoYXBlID0gb3B0aW9ucy5ub2Rlcy5zaGFwZTsKICB9CiAgLy8gYW5kIGNhbGwgZ29vZCBmdW5jdGlvbgogIGlmKGZpbmFsX3NoYXBlID09PSAiaWNvbiIpewogICAgaWNvbnNOb2RlQXNIYXJkVG9SZWFkKG5vZGUsIGhpZGVDb2xvcjEsIGhpZGVDb2xvcjIpOwogIH0gZWxzZSBpZihmaW5hbF9zaGFwZSA9PT0gImltYWdlIil7CiAgICBpbWFnZU5vZGVBc0hhcmRUb1JlYWQobm9kZSwgImltYWdlIiwgaGlkZUNvbG9yMSwgaGlkZUNvbG9yMik7CiAgfSBlbHNlIGlmKGZpbmFsX3NoYXBlID09PSAiY2lyY3VsYXJJbWFnZSIpewogICAgaW1hZ2VOb2RlQXNIYXJkVG9SZWFkKG5vZGUsICJjaXJjdWxhckltYWdlIiwgaGlkZUNvbG9yMSwgaGlkZUNvbG9yMik7CiAgfSBlbHNlIHsKICAgIHNpbXBsZU5vZGVBc0hhcmRUb1JlYWQobm9kZSwgaGlkZUNvbG9yMSwgaGlkZUNvbG9yMik7CiAgfQogIC8vIGZpbmFsbHkgc2V0IGlzSGFyZFRvUmVhZAogIG5vZGUuaXNIYXJkVG9SZWFkID0gdHJ1ZTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFJldnJpdGUgSFRNTFdpZGdldHMuZGF0YWZyYW1lVG9EMygpIGZvciBwYXNzaW5nIGN1c3RvbQovLyBwcm9wZXJ0aWVzIGRpcmVjdGx5IGluIGRhdGEuZnJhbWUgKGNvbG9yLmJhY2tncm91bmQpIGZvciBleGFtcGxlCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpmdW5jdGlvbiB2aXNOZXR3b3JrZGF0YWZyYW1lVG9EMyhkZiwgdHlwZSkgewoKICAvLyB2YXJpYWJsZXMgd2UgaGF2ZSBzcGVjaWFsbHkgdG8gY29udHJvbAogIHZhciBub2Rlc2N0cmwgPSBbImNvbG9yIiwgImZpeGVkIiwgImZvbnQiLCAiaWNvbiIsICJzaGFkb3ciLCAic2NhbGluZyIsICJzaGFwZVByb3BlcnRpZXMiXTsKICB2YXIgZWRnZXNjdHJsID0gWyJjb2xvciIsICJmb250IiwgImFycm93cyIsICJzaGFkb3ciLCAic21vb3RoIiwgInNjYWxpbmciXTsKICAKICB2YXIgbmFtZXMgPSBbXTsKICB2YXIgY29sbmFtZXMgPSBbXTsKICB2YXIgbGVuZ3RoOwogIHZhciB0b2N0cmw7CiAgdmFyIGN0cmxuYW1lOwogIAogIGZvciAodmFyIG5hbWUgaW4gZGYpIHsKICAgIGlmIChkZi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkKICAgICAgY29sbmFtZXMucHVzaChuYW1lKTsKICAgICAgY3RybG5hbWUgPSBuYW1lLnNwbGl0KCIuIik7CiAgICAgIGlmKGN0cmxuYW1lLmxlbmd0aCA9PT0gMSl7CiAgICAgICAgbmFtZXMucHVzaCggbmV3IEFycmF5KG5hbWUpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZih0eXBlID09PSAibm9kZXMiKXsKICAgICAgICAgdG9jdHJsID0gaW5kZXhPZi5jYWxsKG5vZGVzY3RybCwgY3RybG5hbWVbMF0sIHRydWUpOwogICAgICAgIH0gZWxzZSBpZih0eXBlID09PSAiZWRnZXMiKXsKICAgICAgICAgdG9jdHJsID0gaW5kZXhPZi5jYWxsKGVkZ2VzY3RybCwgY3RybG5hbWVbMF0sIHRydWUpOwogICAgICAgIH0KICAgICAgICBpZih0b2N0cmwgPiAtMSl7CiAgICAgICAgICBuYW1lcy5wdXNoKGN0cmxuYW1lKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmFtZXMucHVzaChuZXcgQXJyYXkobmFtZSkpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodHlwZW9mKGRmW25hbWVdKSAhPT0gIm9iamVjdCIgfHwgdHlwZW9mKGRmW25hbWVdLmxlbmd0aCkgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMiKTsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YobGVuZ3RoKSAhPT0gInVuZGVmaW5lZCIgJiYgbGVuZ3RoICE9PSBkZltuYW1lXS5sZW5ndGgpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxsIGZpZWxkcyBtdXN0IGJlIGFycmF5cyBvZiB0aGUgc2FtZSBsZW5ndGgiKTsKICAgICAgfQogICAgICBsZW5ndGggPSBkZltuYW1lXS5sZW5ndGg7CiAgfQoKICB2YXIgcmVzdWx0cyA9IFtdOwogIHZhciBpdGVtOwogICAgZm9yICh2YXIgcm93ID0gMDsgcm93IDwgbGVuZ3RoOyByb3crKykgewogICAgICBpdGVtID0ge307CiAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG5hbWVzLmxlbmd0aDsgY29sKyspIHsKICAgICAgICBpZihkZltjb2xuYW1lc1tjb2xdXVtyb3ddICE9PSBudWxsKXsKICAgICAgICAgIGlmKG5hbWVzW2NvbF0ubGVuZ3RoID09PSAxKXsKICAgICAgICAgICAgaWYobmFtZXNbY29sXVswXSA9PT0gImRhc2hlcyIpewogICAgICAgICAgICAgIGl0ZW1bbmFtZXNbY29sXV0gPSBldmFsKGRmW2NvbG5hbWVzW2NvbF1dW3Jvd10pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGl0ZW1bbmFtZXNbY29sXV0gPSBkZltjb2xuYW1lc1tjb2xdXVtyb3ddOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYobmFtZXNbY29sXS5sZW5ndGggPT09IDIpewogICAgICAgICAgICBpZihpdGVtW25hbWVzW2NvbF1bMF1dID09PSB1bmRlZmluZWQpewogICAgICAgICAgICAgIGl0ZW1bbmFtZXNbY29sXVswXV0gPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZihuYW1lc1tjb2xdWzBdID09PSAiaWNvbiIgJiYgbmFtZXNbY29sXVsxXSA9PT0gImNvZGUiKXsKICAgICAgICAgICAgICBpdGVtW25hbWVzW2NvbF1bMF1dW25hbWVzW2NvbF1bMV1dID0gSlNPTi5wYXJzZSggJyInKydcXHUnICsgZGZbY29sbmFtZXNbY29sXV1bcm93XSArICciJyk7CiAgICAgICAgICAgIH0gZWxzZSBpZihuYW1lc1tjb2xdWzBdID09PSAiaWNvbiIgJiYgbmFtZXNbY29sXVsxXSA9PT0gImNvbG9yIil7CiAgICAgICAgICAgICAgaXRlbS5jb2xvciA9IGRmW2NvbG5hbWVzW2NvbF1dW3Jvd107CiAgICAgICAgICAgICAgaXRlbVtuYW1lc1tjb2xdWzBdXVtuYW1lc1tjb2xdWzFdXSA9IGRmW2NvbG5hbWVzW2NvbF1dW3Jvd107CiAgICAgICAgICAgIH0gZWxzZXsKICAgICAgICAgICAgICBpdGVtW25hbWVzW2NvbF1bMF1dW25hbWVzW2NvbF1bMV1dID0gZGZbY29sbmFtZXNbY29sXV1bcm93XTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmKG5hbWVzW2NvbF0ubGVuZ3RoID09PSAzKXsKICAgICAgICAgICAgaWYoaXRlbVtuYW1lc1tjb2xdWzBdXSA9PT0gdW5kZWZpbmVkKXsKICAgICAgICAgICAgICBpdGVtW25hbWVzW2NvbF1bMF1dID0ge307CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoaXRlbVtuYW1lc1tjb2xdWzBdXVtuYW1lc1tjb2xdWzFdXSA9PT0gdW5kZWZpbmVkKXsKICAgICAgICAgICAgICBpdGVtW25hbWVzW2NvbF1bMF1dW25hbWVzW2NvbF1bMV1dID0ge307CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaXRlbVtuYW1lc1tjb2xdWzBdXVtuYW1lc1tjb2xdWzFdXVtuYW1lc1tjb2xdWzJdXSA9IGRmW2NvbG5hbWVzW2NvbF1dW3Jvd107CiAgICAgICAgICB9IGVsc2UgaWYobmFtZXNbY29sXS5sZW5ndGggPT09IDQpewogICAgICAgICAgICBpZihpdGVtW25hbWVzW2NvbF1bMF1dID09PSB1bmRlZmluZWQpewogICAgICAgICAgICAgIGl0ZW1bbmFtZXNbY29sXVswXV0gPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZihpdGVtW25hbWVzW2NvbF1bMF1dW25hbWVzW2NvbF1bMV1dID09PSB1bmRlZmluZWQpewogICAgICAgICAgICAgIGl0ZW1bbmFtZXNbY29sXVswXV1bbmFtZXNbY29sXVsxXV0gPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZihpdGVtW25hbWVzW2NvbF1bMF1dW25hbWVzW2NvbF1bMV1dW25hbWVzW2NvbF1bMl1dID09PSB1bmRlZmluZWQpewogICAgICAgICAgICAgIGl0ZW1bbmFtZXNbY29sXVswXV1bbmFtZXNbY29sXVsxXV1bbmFtZXNbY29sXVsyXV0gPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpdGVtW25hbWVzW2NvbF1bMF1dW25hbWVzW2NvbF1bMV1dW25hbWVzW2NvbF1bMl1dW25hbWVzW2NvbF1bM11dID0gZGZbY29sbmFtZXNbY29sXV1bcm93XTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmVzdWx0cy5wdXNoKGl0ZW0pOwogICAgfQogIHJldHVybiByZXN1bHRzOwp9CiAKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFNvbWUgdXRpbHMgZnVuY3Rpb25zCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKLy8gY2xvbmUgYW4gb2JqZWN0CmZ1bmN0aW9uIGNsb25lKG9iaikgewogICAgaWYob2JqID09PSBudWxsIHx8IHR5cGVvZihvYmopICE9ICdvYmplY3QnKQogICAgICAgIHJldHVybiBvYmo7ICAgIAogICAgdmFyIHRlbXAgPSBuZXcgb2JqLmNvbnN0cnVjdG9yKCk7IAogICAgZm9yKHZhciBrZXkgaW4gb2JqKQogICAgICAgIHRlbXBba2V5XSA9IGNsb25lKG9ialtrZXldKTsgICAgCiAgICByZXR1cm4gdGVtcDsKfQovLyB1cGRhdGUgYSBsaXN0CmZ1bmN0aW9uIHVwZGF0ZShzb3VyY2UsIHRhcmdldCkgewoJT2JqZWN0LmtleXModGFyZ2V0KS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7CgkJaWYgKHR5cGVvZiB0YXJnZXRba10gPT09ICdvYmplY3QnKSB7CgkJCXNvdXJjZVtrXSA9IHNvdXJjZVtrXSB8fCB7fTsKCQkJdXBkYXRlKHNvdXJjZVtrXSwgdGFyZ2V0W2tdKTsKCQl9IGVsc2UgewoJCQlzb3VyY2Vba10gPSB0YXJnZXRba107CgkJfQoJfSk7Cn0KLy8gZm9yIGZpbmQgZWxlbWVudApmdW5jdGlvbiBpbmRleE9mKG5lZWRsZSwgc3RyKSB7CiAgICAgICAgaW5kZXhPZiA9IGZ1bmN0aW9uKG5lZWRsZSwgc3RyKSB7CiAgICAgICAgICAgIHZhciBpID0gLTEsIGluZGV4ID0gLTE7CiAgICAgICAgICAgIGlmKHN0cil7CiAgICAgICAgICAgICAgICAgIG5lZWRsZSA9ICcnK25lZWRsZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpc1tpXTsKICAgICAgICAgICAgICAgIGlmKHN0cil7CiAgICAgICAgICAgICAgICAgIHZhbCA9ICcnK3ZhbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmKHZhbCA9PT0gbmVlZGxlKSB7CiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBpbmRleDsKICAgICAgICB9OwogICAgcmV0dXJuIGluZGV4T2YuY2FsbCh0aGlzLCBuZWVkbGUsIHN0cik7Cn07Ci8vIHJlc2V0IGEgaHRtbCBsaXN0CmZ1bmN0aW9uIHJlc2V0TGlzdChsaXN0X25hbWUsIGlkLCBzaGlueV9pbnB1dF9uYW1lKSB7CiAgdmFyIGxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChsaXN0X25hbWUgKyBpZCk7CiAgbGlzdC52YWx1ZSA9ICIiOwogIGlmICh3aW5kb3cuU2hpbnkpewogICAgU2hpbnkub25JbnB1dENoYW5nZShpZCArICdfJyArIHNoaW55X2lucHV0X25hbWUsICIiKTsKICB9Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBBbGwgYXZhaWxhYmxlIGZ1bmN0aW9ucy9tZXRob2RzIHdpdGggdmlzTmV0d29ya1Byb3h5Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAppZiAoSFRNTFdpZGdldHMuc2hpbnlNb2RlKXsKICAKCiAgLy8gZXZlbnQgbWV0aG9kCiAgU2hpbnkuYWRkQ3VzdG9tTWVzc2FnZUhhbmRsZXIoJ3Zpc1NoaW55RXZlbnRzJywgZnVuY3Rpb24oZGF0YSl7CiAgICAgIC8vIGdldCBjb250YWluZXIgaWQKICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdyYXBoIitkYXRhLmlkKTsKICAgICAgaWYoZWwpewogICAgICAgIHZhciBuZXR3b3JrID0gZWwuY2hhcnQ7CiAgICAgICAgCiAgICAgICAgaWYoZGF0YS50eXBlID09PSAib25jZSIpewogICAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEuZXZlbnRzKSB7CiAgICAgICAgICAgIGV2YWwoJ25ldHdvcmsub25jZSgiJyArIGtleSArICciLCcgKyBkYXRhLmV2ZW50c1trZXldICsgJyknKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYoZGF0YS50eXBlID09PSAib24iKXsKICAgICAgICAgIGZvciAodmFyIGtleSBpbiBkYXRhLmV2ZW50cykgewogICAgICAgICAgICBldmFsKCduZXR3b3JrLm9uKCInICsga2V5ICsgJyIsJyArIGRhdGEuZXZlbnRzW2tleV0gKyAnKScpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZihkYXRhLnR5cGUgPT09ICJvZmYiKXsKICAgICAgICAgIGZvciAodmFyIGtleSBpbiBkYXRhLmV2ZW50cykgewogICAgICAgICAgICBldmFsKCduZXR3b3JrLm9mZigiJyArIGtleSArICciKScpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogIH0pOwogIAogIC8vIG1vdmVOb2RlIG1ldGhvZAogIFNoaW55LmFkZEN1c3RvbU1lc3NhZ2VIYW5kbGVyKCd2aXNTaGlueU1vdmVOb2RlJywgZnVuY3Rpb24oZGF0YSl7CiAgICAgIC8vIGdldCBjb250YWluZXIgaWQKICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdyYXBoIitkYXRhLmlkKTsKICAgICAgaWYoZWwpewogICAgICAgIHZhciBuZXR3b3JrID0gZWwuY2hhcnQ7CiAgICAgICAgbmV0d29yay5tb3ZlTm9kZShkYXRhLm5vZGVJZCwgZGF0YS54LCBkYXRhLnkpOwogICAgICB9CiAgfSk7CiAgCiAgLy8gdW5zZWxlY3RBbGwgbWV0aG9kCiAgU2hpbnkuYWRkQ3VzdG9tTWVzc2FnZUhhbmRsZXIoJ3Zpc1NoaW55VW5zZWxlY3RBbGwnLCBmdW5jdGlvbihkYXRhKXsKICAgICAgLy8gZ2V0IGNvbnRhaW5lciBpZAogICAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ3JhcGgiK2RhdGEuaWQpOwogICAgICBpZihlbCl7CiAgICAgICAgdmFyIG5ldHdvcmsgPSBlbC5jaGFydDsKICAgICAgICAKICAgICAgICAvLyByZXNldCBzZWxlY3Rpb24KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibm9kZVNlbGVjdCIrZGF0YS5pZCkudmFsdWUgPSAiIjsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibm9kZVNlbGVjdCIrZGF0YS5pZCkub25jaGFuZ2UoKTsKICAgICAgICAKICAgICAgICBpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkYXRhLmlkKS5zZWxlY3RBY3RpdmUgPT09IHRydWUpewogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VsZWN0ZWRCeSIrZGF0YS5pZCkudmFsdWUgPSAiIjsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlbGVjdGVkQnkiK2RhdGEuaWQpLm9uY2hhbmdlKCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIG5ldHdvcmsudW5zZWxlY3RBbGwoKTsKICAgICAgfQogIH0pOwogIAogIC8vIHVwZGF0ZU9wdGlvbnMgaW4gdGhlIG5ldHdvcmsKICBTaGlueS5hZGRDdXN0b21NZXNzYWdlSGFuZGxlcigndmlzU2hpbnlPcHRpb25zJywgZnVuY3Rpb24oZGF0YSl7CiAgICAgIC8vIGdldCBjb250YWluZXIgaWQKICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdyYXBoIitkYXRhLmlkKTsKICAgICAgaWYoZWwpewogICAgICAgIHZhciBuZXR3b3JrID0gZWwuY2hhcnQ7CiAgICAgICAgdmFyIG9wdGlvbnMgPSBlbC5vcHRpb25zOwogICAgICAgIHVwZGF0ZShvcHRpb25zLCBkYXRhLm9wdGlvbnMpOwogICAgICAgIG5ldHdvcmsuc2V0T3B0aW9ucyhvcHRpb25zKTsKICAgICAgfQogIH0pOwogIAogIC8vIHNldERhdGEgdGhlIG5ldHdvcmsKICBTaGlueS5hZGRDdXN0b21NZXNzYWdlSGFuZGxlcigndmlzU2hpbnlTZXREYXRhJywgZnVuY3Rpb24oZGF0YSl7CiAgICAgIC8vIGdldCBjb250YWluZXIgaWQKICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdyYXBoIitkYXRhLmlkKTsKICAgICAgaWYoZWwpewogICAgICAgIHZhciBuZXR3b3JrID0gZWwuY2hhcnQ7CiAgICAgICAgdmFyIG5ld25vZGVzID0gbmV3IHZpcy5EYXRhU2V0KCk7CiAgICAgICAgdmFyIG5ld2VkZ2VzID0gbmV3IHZpcy5EYXRhU2V0KCk7CgkJCiAgICAgICAgbmV3bm9kZXMuYWRkKHZpc05ldHdvcmtkYXRhZnJhbWVUb0QzKGRhdGEubm9kZXMsICJub2RlcyIpKTsKICAgICAgICBuZXdlZGdlcy5hZGQodmlzTmV0d29ya2RhdGFmcmFtZVRvRDMoZGF0YS5lZGdlcywgImVkZ2VzIikpOwogICAgICAgIHZhciBuZXdkYXRhID0gewogICAgICAgICAgbm9kZXM6IG5ld25vZGVzLAogICAgICAgICAgZWRnZXM6IG5ld2VkZ2VzCiAgICAgICAgfTsKICAgICAgICBuZXR3b3JrLnNldERhdGEobmV3ZGF0YSk7CiAgICAgIH0KICB9KTsKICAKICAvLyBmaXQgdG8gYSBzcGVjaWZpYyBub2RlCiAgU2hpbnkuYWRkQ3VzdG9tTWVzc2FnZUhhbmRsZXIoJ3Zpc1NoaW55Rml0JywgZnVuY3Rpb24oZGF0YSl7CiAgICAvLyBnZXQgY29udGFpbmVyIGlkCiAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ3JhcGgiK2RhdGEuaWQpOwogICAgaWYoZWwpewogICAgICAgIHZhciBuZXR3b3JrID0gZWwuY2hhcnQ7CiAgICAgICAgbmV0d29yay5maXQoZGF0YS5vcHRpb25zKTsKICAgICAgfQogIH0pOwogIAogIC8vIGZvY3VzIG9uIGEgbm9kZSBpbiB0aGUgbmV0d29yawogIFNoaW55LmFkZEN1c3RvbU1lc3NhZ2VIYW5kbGVyKCd2aXNTaGlueUZvY3VzJywgZnVuY3Rpb24oZGF0YSl7CiAgICAgIC8vIGdldCBjb250YWluZXIgaWQKICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdyYXBoIitkYXRhLmlkKTsKICAgICAgaWYoZWwpewogICAgICAgIHZhciBuZXR3b3JrID0gZWwuY2hhcnQ7CiAgICAgICAgbmV0d29yay5mb2N1cyhkYXRhLmZvY3VzSWQsIGRhdGEub3B0aW9ucyk7CiAgICAgIH0KICB9KTsKICAKICAvLyBzdGFiaWxpemUgdGhlIG5ldHdvcmsKICBTaGlueS5hZGRDdXN0b21NZXNzYWdlSGFuZGxlcigndmlzU2hpbnlTdGFiaWxpemUnLCBmdW5jdGlvbihkYXRhKXsKICAgICAgLy8gZ2V0IGNvbnRhaW5lciBpZAogICAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ3JhcGgiK2RhdGEuaWQpOwogICAgICBpZihlbCl7CiAgICAgICAgdmFyIG5ldHdvcmsgPSBlbC5jaGFydDsKICAgICAgICBuZXR3b3JrLnN0YWJpbGl6ZShkYXRhLm9wdGlvbnMpOwogICAgICB9CiAgfSk7CiAgCiAgLy8gc3RhcnRTaW11bGF0aW9uIG9uIG5ldHdvcmsKICBTaGlueS5hZGRDdXN0b21NZXNzYWdlSGFuZGxlcigndmlzU2hpbnlTdGFydFNpbXVsYXRpb24nLCBmdW5jdGlvbihkYXRhKXsKICAgICAgLy8gZ2V0IGNvbnRhaW5lciBpZAogICAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ3JhcGgiK2RhdGEuaWQpOwogICAgICBpZihlbCl7CiAgICAgICAgdmFyIG5ldHdvcmsgPSBlbC5jaGFydDsKICAgICAgICBuZXR3b3JrLnN0YXJ0U2ltdWxhdGlvbigpOwogICAgICB9CiAgfSk7CiAgCiAgLy8gc3RvcFNpbXVsYXRpb24gb24gbmV0d29yawogIFNoaW55LmFkZEN1c3RvbU1lc3NhZ2VIYW5kbGVyKCd2aXNTaGlueVN0b3BTaW11bGF0aW9uJywgZnVuY3Rpb24oZGF0YSl7CiAgICAgIC8vIGdldCBjb250YWluZXIgaWQKICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdyYXBoIitkYXRhLmlkKTsKICAgICAgaWYoZWwpewogICAgICAgIHZhciBuZXR3b3JrID0gZWwuY2hhcnQ7CiAgICAgICAgbmV0d29yay5zdG9wU2ltdWxhdGlvbigpOwogICAgICB9CiAgfSk7CiAgCiAgLy8gZ2V0IHBvc2l0aW9ucyBvZiB0aGUgbmV0d29yawogIFNoaW55LmFkZEN1c3RvbU1lc3NhZ2VIYW5kbGVyKCd2aXNTaGlueUdldFBvc2l0aW9ucycsIGZ1bmN0aW9uKGRhdGEpewogICAgICAvLyBnZXQgY29udGFpbmVyIGlkCiAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZGF0YS5pZCk7CiAgICAgIGlmKGVsKXsKICAgICAgICB2YXIgbmV0d29yayA9IGVsLmNoYXJ0OwogICAgICAgIHZhciBwb3M7CiAgICAgICAgCiAgICAgICAgaWYoZGF0YS5ub2RlcyAhPT0gdW5kZWZpbmVkKXsKICAgICAgICAgIHBvcyA9IG5ldHdvcmsuZ2V0UG9zaXRpb25zKGRhdGEubm9kZXMpOwogICAgICAgIH1lbHNlewogICAgICAgICAgcG9zID0gbmV0d29yay5nZXRQb3NpdGlvbnMoKTsKICAgICAgICB9CgkJLy8gcmV0dXJuIHBvc2l0aW9ucyBpbiBzaGlueQogICAgICAgIFNoaW55Lm9uSW5wdXRDaGFuZ2UoZGF0YS5pbnB1dCwgcG9zKTsKICAgICAgfQogIH0pOwogIAogIC8vIGdldCBlZGdlcyBkYXRhCiAgU2hpbnkuYWRkQ3VzdG9tTWVzc2FnZUhhbmRsZXIoJ3Zpc1NoaW55R2V0RWRnZXMnLCBmdW5jdGlvbihkYXRhKXsKICAgICAgLy8gZ2V0IGNvbnRhaW5lciBpZAogICAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ3JhcGgiK2RhdGEuaWQpOwogICAgICBpZihlbCl7CiAgICAgICAgdmFyIGN1cnJlbnRfZWRnZXMgPSBlbC5lZGdlcy5nZXREYXRhU2V0KCk7CiAgICAgICAgLy8gcmV0dXJuIGRhdGEgaW4gc2hpbnkKICAgICAgICBTaGlueS5vbklucHV0Q2hhbmdlKGRhdGEuaW5wdXQsIGN1cnJlbnRfZWRnZXMuX2RhdGEpOwogICAgICB9CiAgfSk7CiAgCiAgLy8gZ2V0IG5vZGVzIGRhdGEKICBTaGlueS5hZGRDdXN0b21NZXNzYWdlSGFuZGxlcigndmlzU2hpbnlHZXROb2RlcycsIGZ1bmN0aW9uKGRhdGEpewogICAgICAvLyBnZXQgY29udGFpbmVyIGlkCiAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZGF0YS5pZCk7CiAgICAgIGlmKGVsKXsKICAgICAgICBpZihkYXRhLmFkZENvb3JkaW5hdGVzKXsKICAgICAgICAgIGVsLmNoYXJ0LnN0b3JlUG9zaXRpb25zKCk7CiAgICAgICAgfQogICAgICAgIHZhciBjdXJyZW50X25vZGVzID0gZWwubm9kZXMuZ2V0RGF0YVNldCgpOwogICAgICAgIC8vIHJldHVybiBkYXRhIGluIHNoaW55CiAgICAgICAgU2hpbnkub25JbnB1dENoYW5nZShkYXRhLmlucHV0LCBjdXJyZW50X25vZGVzLl9kYXRhKTsKICAgICAgfQogIH0pOwogIAogIC8vIFJlZHJhdyB0aGUgbmV0d29yawogIFNoaW55LmFkZEN1c3RvbU1lc3NhZ2VIYW5kbGVyKCd2aXNTaGlueVJlZHJhdycsIGZ1bmN0aW9uKGRhdGEpewogICAgICAvLyBnZXQgY29udGFpbmVyIGlkCiAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZGF0YS5pZCk7CiAgICAgIGlmKGVsKXsKICAgICAgICB2YXIgbmV0d29yayA9IGVsLmNoYXJ0OwogICAgICAgIG5ldHdvcmsucmVkcmF3KCk7CiAgICAgIH0KICB9KTsKICAKCiAgLy8gc2VsZWN0IG5vZGVzCiAgU2hpbnkuYWRkQ3VzdG9tTWVzc2FnZUhhbmRsZXIoJ3Zpc1NoaW55U2VsZWN0Tm9kZXMnLCBmdW5jdGlvbihkYXRhKXsKICAgICAgLy8gZ2V0IGNvbnRhaW5lciBpZAogICAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ3JhcGgiK2RhdGEuaWQpOwogICAgICBpZihlbCl7CiAgICAgICAgdmFyIG5ldHdvcmsgPSBlbC5jaGFydDsKICAgICAgICBpZihkYXRhLnNlbGlkICE9PSBudWxsKXsKICAgICAgICAgIG5ldHdvcmsuc2VsZWN0Tm9kZXMoZGF0YS5zZWxpZCwgZGF0YS5oaWdobGlnaHRFZGdlcyk7CiAgICAgICAgICBpZihkYXRhLmNsaWNrRXZlbnQpewogICAgICAgICAgICBlbC5teWNsaWNrKHtub2RlcyA6IGRhdGEuc2VsaWR9KTsKICAgICAgICAgIH0KICAgICAgICB9ZWxzZXsKICAgICAgICAgIGlmKGRhdGEuY2xpY2tFdmVudCl7CiAgICAgICAgICAgIGVsLm15Y2xpY2soe25vZGVzIDogW119KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICB9KTsKICAKICAvLyBzZWxlY3QgZWRnZXMKICBTaGlueS5hZGRDdXN0b21NZXNzYWdlSGFuZGxlcigndmlzU2hpbnlTZWxlY3RFZGdlcycsIGZ1bmN0aW9uKGRhdGEpewogICAgICAvLyBnZXQgY29udGFpbmVyIGlkCiAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZGF0YS5pZCk7CiAgICAgIGlmKGVsKXsKICAgICAgICB2YXIgbmV0d29yayA9IGVsLmNoYXJ0OwogICAgICAgIGlmKGRhdGEuc2VsaWQgIT09IG51bGwpewogICAgICAgICAgbmV0d29yay5zZWxlY3RFZGdlcyhkYXRhLnNlbGlkKTsKICAgICAgICB9CiAgICAgIH0KICB9KTsKICAKICAvLyBzZXQgc2VsZWN0aW9uCiAgU2hpbnkuYWRkQ3VzdG9tTWVzc2FnZUhhbmRsZXIoJ3Zpc1NoaW55U2V0U2VsZWN0aW9uJywgZnVuY3Rpb24oZGF0YSl7CiAgICAgIC8vIGdldCBjb250YWluZXIgaWQKICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdyYXBoIitkYXRhLmlkKTsKICAgICAgaWYoZWwpewogICAgICAgIHZhciBuZXR3b3JrID0gZWwuY2hhcnQ7CiAgICAgICAgaWYoZGF0YS5zZWxlY3Rpb24ubm9kZXMgIT09IG51bGwgfHwgZGF0YS5zZWxlY3Rpb24uZWRnZXMgIT09IG51bGwpewogICAgICAgICAgbmV0d29yay5zZXRTZWxlY3Rpb24oZGF0YS5zZWxlY3Rpb24sIGRhdGEub3B0aW9ucyk7CiAgICAgICAgfQogICAgICAgIGlmKGRhdGEuY2xpY2tFdmVudCl7CiAgICAgICAgICBpZihkYXRhLnNlbGVjdGlvbi5ub2RlcyAhPT0gbnVsbCl7CiAgICAgICAgICAgIGVsLm15Y2xpY2soe25vZGVzIDogZGF0YS5zZWxlY3Rpb24ubm9kZXN9KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgZWwubXljbGljayh7bm9kZXMgOiBbXX0pOyAKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICB9KTsKICAKICBmdW5jdGlvbiB1cGRhdGVWaXNPcHRpb25zKGRhdGEpewogICAgICAgIC8vIGdldCBjb250YWluZXIgaWQKICAgICAgICB2YXIgZ3JhcGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ3JhcGgiK2RhdGEuaWQpOwogICAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRhdGEuaWQpOwogICAgICAgIHZhciBkb19sb29wX2J5ID0gZmFsc2U7CiAgICAgICAgdmFyIGRvX2xvb3BfaWQgPSBmYWxzZTsKICAgICAgICB2YXIgb3B0aW9uOwogICAgICAgIHZhciBvcHRpb24yOwogICAgICAgIHZhciBzZWxlY3RMaXN0MjsKICAgICAgICB2YXIgc2VsZWN0TGlzdDsKICAgICAgICB2YXIgcmVzZXQgPSBmYWxzZTsKICAgICAgICAKICAgICAgICBpZihncmFwaCl7CgogICAgICAgICAgaWYoZGF0YS5vcHRpb25zLmhpZ2hsaWdodCAhPT0gdW5kZWZpbmVkKXsKICAgICAgICAgICAgaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmhpZ2hsaWdodCAmJiAhZGF0YS5vcHRpb25zLmhpZ2hsaWdodC5lbmFibGVkKXsKICAgICAgICAgICAgICAvLyBuZWVkIHJlc2V0IG5vZGVzCiAgICAgICAgICAgICAgaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmhpZ2hsaWdodEFjdGl2ZSA9PT0gdHJ1ZSl7CiAgICAgICAgICAgICAgICByZXNldCA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHQgPSBkYXRhLm9wdGlvbnMuaGlnaGxpZ2h0LmVuYWJsZWQ7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5kZWdyZWUgPSBkYXRhLm9wdGlvbnMuaGlnaGxpZ2h0LmRlZ3JlZTsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmhvdmVyTmVhcmVzdCA9IGRhdGEub3B0aW9ucy5oaWdobGlnaHQuaG92ZXJOZWFyZXN0OwogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaGlnaGxpZ2h0Q29sb3IgPSBkYXRhLm9wdGlvbnMuaGlnaGxpZ2h0LmhpZGVDb2xvcjsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmhpZ2hsaWdodEFsZ29yaXRobSA9IGRhdGEub3B0aW9ucy5oaWdobGlnaHQuYWxnb3JpdGhtOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIGluaXQgc2VsZWN0aW9uCiAgICAgICAgICBpZihkYXRhLm9wdGlvbnMuYnlzZWxlY3Rpb24gIT09IHVuZGVmaW5lZCl7CiAgICAgICAgICAgIGlmKGRhdGEub3B0aW9ucy5ieXNlbGVjdGlvbi5zZWxlY3RlZCAhPT0gdW5kZWZpbmVkKXsKICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VsZWN0ZWRCeSIrZGF0YS5pZCkudmFsdWUgPSBkYXRhLm9wdGlvbnMuYnlzZWxlY3Rpb24uc2VsZWN0ZWQ7CiAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlbGVjdGVkQnkiK2RhdGEuaWQpLm9uY2hhbmdlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoZGF0YS5vcHRpb25zLmJ5c2VsZWN0aW9uLmhpZGVDb2xvcil7CiAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmJ5c2VsZWN0aW9uQ29sb3IgPSBkYXRhLm9wdGlvbnMuYnlzZWxlY3Rpb24uaGlkZUNvbG9yOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGlmKGRhdGEub3B0aW9ucy5pZHNlbGVjdGlvbiAhPT0gdW5kZWZpbmVkKXsKICAgICAgICAgICAgaWYoZGF0YS5vcHRpb25zLmlkc2VsZWN0aW9uLmVuYWJsZWQgPT09IHRydWUgJiYgZGF0YS5vcHRpb25zLmlkc2VsZWN0aW9uLnNlbGVjdGVkICE9PSB1bmRlZmluZWQpewogICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJub2RlU2VsZWN0IitkYXRhLmlkKS52YWx1ZSA9IGRhdGEub3B0aW9ucy5pZHNlbGVjdGlvbi5zZWxlY3RlZDsKICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibm9kZVNlbGVjdCIrZGF0YS5pZCkub25jaGFuZ2UoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBpZihyZXNldCl7CiAgICAgICAgICAgIC8vY29uc29sZS5pbmZvKCJyZXNldCBub2RlcyIpOwogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibm9kZVNlbGVjdCIrZGF0YS5pZCkudmFsdWUgPSAiIjsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5vZGVTZWxlY3QiK2RhdGEuaWQpLm9uY2hhbmdlKCk7CiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGVsLnVwZGF0ZU5vZGVzID0gdHJ1ZTsKICAgICAgICAgIAogICAgICAgICAgaWYoZGF0YS5vcHRpb25zLmJ5c2VsZWN0aW9uICE9PSB1bmRlZmluZWQpewogICAgICAgICAgICBzZWxlY3RMaXN0MiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWxlY3RlZEJ5IitkYXRhLmlkKQogICAgICAgICAgICBzZWxlY3RMaXN0Mi5vcHRpb25zLmxlbmd0aCA9IDA7CiAgICAgICAgICAgIGlmKGRhdGEub3B0aW9ucy5ieXNlbGVjdGlvbi5lbmFibGVkID09PSB0cnVlKXsKICAgICAgICAgICAgICBvcHRpb24yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7CiAgICAgICAgICAgICAgb3B0aW9uMi52YWx1ZSA9ICIiOwogICAgICAgICAgICAgIG9wdGlvbjIudGV4dCA9ICJTZWxlY3QgYnkgIiArIGRhdGEub3B0aW9ucy5ieXNlbGVjdGlvbi52YXJpYWJsZTsKICAgICAgICAgICAgICBzZWxlY3RMaXN0Mi5hcHBlbmRDaGlsZChvcHRpb24yKTsKICAgICAgCiAgICAgICAgICAgICAgaWYoZGF0YS5vcHRpb25zLmJ5c2VsZWN0aW9uLnZhbHVlcyAhPT0gdW5kZWZpbmVkKXsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5vcHRpb25zLmJ5c2VsZWN0aW9uLnZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICBvcHRpb24yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7CiAgICAgICAgICAgICAgICAgIG9wdGlvbjIudmFsdWUgPSBkYXRhLm9wdGlvbnMuYnlzZWxlY3Rpb24udmFsdWVzW2ldOwogICAgICAgICAgICAgICAgICBvcHRpb24yLnRleHQgPSBkYXRhLm9wdGlvbnMuYnlzZWxlY3Rpb24udmFsdWVzW2ldOwogICAgICAgICAgICAgICAgICBzZWxlY3RMaXN0Mi5hcHBlbmRDaGlsZChvcHRpb24yKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIGRvX2xvb3BfYnkgPSB0cnVlOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgZWwuYnlzZWxlY3Rpb25fdmFyaWFibGUgPSBkYXRhLm9wdGlvbnMuYnlzZWxlY3Rpb24udmFyaWFibGU7CiAgICAgICAgICAgICAgZWwuYnlzZWxlY3Rpb25fbXVsdGlwbGUgPSBkYXRhLm9wdGlvbnMuYnlzZWxlY3Rpb24ubXVsdGlwbGU7CiAgICAgICAgICAgICAgc2VsZWN0TGlzdDIuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUnOwogICAgICAgICAgICAgIGlmKGRhdGEub3B0aW9ucy5ieXNlbGVjdGlvbi5zdHlsZSAhPT0gdW5kZWZpbmVkKXsKICAgICAgICAgICAgICAgIHNlbGVjdExpc3QyLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBkYXRhLm9wdGlvbnMuYnlzZWxlY3Rpb24uc3R5bGUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbC5ieXNlbGVjdGlvbiA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc2VsZWN0TGlzdDIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICBlbC5ieXNlbGVjdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgIC8vIHJlc2V0IHNlbGVjdGlvbgogICAgICAgICAgICAgIGlmKGVsLnNlbGVjdEFjdGl2ZSA9PT0gdHJ1ZSl7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VsZWN0ZWRCeSIrZGF0YS5pZCkudmFsdWUgPSAiIjsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWxlY3RlZEJ5IitkYXRhLmlkKS5vbmNoYW5nZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIC8vIHJlc2V0IHNlbGVjdGlvbgogICAgICAgICAgICBpZihlbC5zZWxlY3RBY3RpdmUgPT09IHRydWUpewogICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWxlY3RlZEJ5IitkYXRhLmlkKS52YWx1ZSA9ICIiOwogICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWxlY3RlZEJ5IitkYXRhLmlkKS5vbmNoYW5nZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGlmKGRhdGEub3B0aW9ucy5pZHNlbGVjdGlvbiAhPT0gdW5kZWZpbmVkKXsKICAgICAgICAgICAgc2VsZWN0TGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJub2RlU2VsZWN0IitkYXRhLmlkKQogICAgICAgICAgICBzZWxlY3RMaXN0Lm9wdGlvbnMubGVuZ3RoID0gMDsKICAgICAgICAgICAgaWYoZGF0YS5vcHRpb25zLmlkc2VsZWN0aW9uLmVuYWJsZWQgPT09IHRydWUpewogICAgICAgICAgICAgIG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpOwogICAgICAgICAgICAgIG9wdGlvbi52YWx1ZSA9ICIiOwogICAgICAgICAgICAgIG9wdGlvbi50ZXh0ID0gIlNlbGVjdCBieSBpZCI7CiAgICAgICAgICAgICAgc2VsZWN0TGlzdC5hcHBlbmRDaGlsZChvcHRpb24pOwogICAgICAgICAgICAgIHNlbGVjdExpc3Quc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUnOwogICAgICAgICAgICAgIGlmKGRhdGEub3B0aW9ucy5pZHNlbGVjdGlvbi5zdHlsZSAhPT0gdW5kZWZpbmVkKXsKICAgICAgICAgICAgICAgIHNlbGVjdExpc3Quc2V0QXR0cmlidXRlKCdzdHlsZScsIGRhdGEub3B0aW9ucy5pZHNlbGVjdGlvbi5zdHlsZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsLmlkc2VsZWN0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgICBkb19sb29wX2lkID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzZWxlY3RMaXN0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgICAgZWwuaWRzZWxlY3Rpb24gPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBpZihkb19sb29wX2J5IHx8IGRvX2xvb3BfaWQpewogICAgICAgICAgICAgIHZhciBhbGxOb2RlcyA9IGdyYXBoLm5vZGVzLmdldCh7cmV0dXJuVHlwZToiT2JqZWN0In0pOwogICAgICAgICAgICAgIHZhciBieXNlbGVjdGlvbl92YWx1ZXMgPSBbXTsKICAgICAgICAgICAgICBmb3IgKHZhciBub2RlSWQgaW4gYWxsTm9kZXMpIHsKICAgICAgICAgICAgICAgIGlmKGRvX2xvb3BfYnkpewogICAgICAgICAgICAgICAgICB2YXIgY3VycmVudF9zZWxfdmFsdWUgPSBhbGxOb2Rlc1tub2RlSWRdW2RhdGEub3B0aW9ucy5ieXNlbGVjdGlvbi52YXJpYWJsZV07CiAgICAgICAgICAgICAgICAgIGlmKGRhdGEub3B0aW9ucy5ieXNlbGVjdGlvbi5tdWx0aXBsZSl7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9zZWxfdmFsdWUgPSBjdXJyZW50X3NlbF92YWx1ZS5zcGxpdCgiLCIpLm1hcChGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCwgU3RyaW5nLnByb3RvdHlwZS50cmltKTsKICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9zZWxfdmFsdWUgPSBbY3VycmVudF9zZWxfdmFsdWVdOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGZvcih2YXIgaW5kX2MgaW4gY3VycmVudF9zZWxfdmFsdWUpewogICAgICAgICAgICAgICAgICAgIGlmKGluZGV4T2YuY2FsbChieXNlbGVjdGlvbl92YWx1ZXMsIGN1cnJlbnRfc2VsX3ZhbHVlW2luZF9jXSwgZmFsc2UpID09PSAtMSl7CiAgICAgICAgICAgICAgICAgICAgICBvcHRpb24yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7CiAgICAgICAgICAgICAgICAgICAgICBvcHRpb24yLnZhbHVlID0gY3VycmVudF9zZWxfdmFsdWVbaW5kX2NdOwogICAgICAgICAgICAgICAgICAgICAgb3B0aW9uMi50ZXh0ID0gY3VycmVudF9zZWxfdmFsdWVbaW5kX2NdOwogICAgICAgICAgICAgICAgICAgICAgc2VsZWN0TGlzdDIuYXBwZW5kQ2hpbGQob3B0aW9uMik7CiAgICAgICAgICAgICAgICAgICAgICBieXNlbGVjdGlvbl92YWx1ZXMucHVzaChjdXJyZW50X3NlbF92YWx1ZVtpbmRfY10pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYoZG9fbG9vcF9pZCl7CiAgICAgICAgICAgICAgICAgIHZhciBhZGRpZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgIGlmKGRhdGEub3B0aW9ucy5pZHNlbGVjdGlvbi52YWx1ZXMgIT09IHVuZGVmaW5lZCl7CiAgICAgICAgICAgICAgICAgICAgaWYoaW5kZXhPZi5jYWxsKGRhdGEub3B0aW9ucy5pZHNlbGVjdGlvbi52YWx1ZXMsIGFsbE5vZGVzW25vZGVJZF0uaWQsIGZhbHNlKSA9PT0gLTEpewogICAgICAgICAgICAgICAgICAgICAgYWRkaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYoYWRkaWQpewogICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpOwogICAgICAgICAgICAgICAgICAgIG9wdGlvbi52YWx1ZSA9IGFsbE5vZGVzW25vZGVJZF0uaWQ7CiAgICAgICAgICAgICAgICAgIGlmKGFsbE5vZGVzW25vZGVJZF0ubGFiZWwgJiYgZGF0YS5vcHRpb25zLmlkc2VsZWN0aW9uLnVzZUxhYmVscyl7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9uLnRleHQgPSBhbGxOb2Rlc1tub2RlSWRdLmxhYmVsOwogICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICBvcHRpb24udGV4dCA9IGFsbE5vZGVzW25vZGVJZF0uaWQ7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc2VsZWN0TGlzdC5hcHBlbmRDaGlsZChvcHRpb24pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSAKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH07CiAgICAgIAogIFNoaW55LmFkZEN1c3RvbU1lc3NhZ2VIYW5kbGVyKCd2aXNTaGlueUN1c3RvbU9wdGlvbnMnLCB1cGRhdGVWaXNPcHRpb25zKTsKICAKICAgIC8vIHVkcGF0ZSBub2RlcyBkYXRhCiAgU2hpbnkuYWRkQ3VzdG9tTWVzc2FnZUhhbmRsZXIoJ3Zpc1NoaW55VXBkYXRlTm9kZXMnLCBmdW5jdGlvbihkYXRhKXsKICAgICAgLy8gZ2V0IGNvbnRhaW5lciBpZAogICAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ3JhcGgiK2RhdGEuaWQpOwogICAgICB2YXIgbWFpbl9lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRhdGEuaWQpOwogICAgICAKICAgICAgaWYoZWwpewogICAgICAgIC8vIGdldCAmIHRyYW5zZm9ybSBub2RlcyBvYmplY3QKICAgICAgICB2YXIgdG1wbm9kZXMgPSB2aXNOZXR3b3JrZGF0YWZyYW1lVG9EMyhkYXRhLm5vZGVzLCAibm9kZXMiKTsKICAgICAgICAKICAgICAgICAvLyByZXNldCBzb21lIHBhcmFtZXRlcnMgLyBkYXRhIGJlZm9yZQogICAgICAgIGlmIChtYWluX2VsLnNlbGVjdEFjdGl2ZSA9PT0gdHJ1ZSB8IG1haW5fZWwuaGlnaGxpZ2h0QWN0aXZlID09PSB0cnVlKSB7CiAgICAgICAgICAvL3Jlc2V0IG5vZGVzCiAgICAgICAgICB2YXIgYWxsTm9kZXMgPSBlbC5ub2Rlcy5nZXQoe3JldHVyblR5cGU6Ik9iamVjdCJ9KTsKICAgICAgICAgIHJlc2V0QWxsTm9kZXMoYWxsTm9kZXMsIHRydWUsIGVsLm5vZGVzLCBlbC5jaGFydC5ncm91cHMsIGVsLm9wdGlvbnMpOwogICAgICAgICAgCiAgICAgICAgICBpZiAobWFpbl9lbC5zZWxlY3RBY3RpdmUgPT09IHRydWUpewogICAgICAgICAgICBtYWluX2VsLnNlbGVjdEFjdGl2ZSA9IGZhbHNlOwogICAgICAgICAgICByZXNldExpc3QoJ3NlbGVjdGVkQnknLCBkYXRhLmlkLCAnc2VsZWN0ZWRCeScpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG1haW5fZWwuaGlnaGxpZ2h0QWN0aXZlID09PSB0cnVlKXsKICAgICAgICAgICAgbWFpbl9lbC5oaWdobGlnaHRBY3RpdmUgPSBmYWxzZTsKICAgICAgICAgICAgcmVzZXRMaXN0KCdub2RlU2VsZWN0JywgZGF0YS5pZCwgJ3NlbGVjdGVkJyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIHVwZGF0ZSBub2RlcwogICAgICAgIGVsLm5vZGVzLnVwZGF0ZSh0bXBub2Rlcyk7CiAgICAgICAgbWFpbl9lbC51cGRhdGVOb2RlcyA9IHRydWU7CiAgICAgICAgCiAgICAgICAgLy8gdXBkYXRlIG9wdGlvbnMgPwogICAgICAgIGlmKGRhdGEudXBkYXRlT3B0aW9ucyl7CiAgICAgICAgICB2YXIgZGF0YU9wdGlvbnMgPSB7fTsKICAgICAgICAgIGRhdGFPcHRpb25zLm9wdGlvbnMgPSB7fTsKICAgICAgICAKICAgICAgICAgIHZhciB1cGRhdGVPcHRzID0gZmFsc2U7CiAgICAgICAgICBpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibm9kZVNlbGVjdCIrZGF0YS5pZCkuc3R5bGUuZGlzcGxheSA9PT0gJ2lubGluZScpewogICAgICAgICAgICB1cGRhdGVPcHRzID0gdHJ1ZTsKICAgICAgICAgICAgZGF0YU9wdGlvbnMuaWQgID0gZGF0YS5pZDsKICAgICAgICAgICAgZGF0YU9wdGlvbnMub3B0aW9ucy5pZHNlbGVjdGlvbiA9IHtlbmFibGVkIDogdHJ1ZX07CiAgICAgICAgICB9CiAgICAKICAgICAgICAgIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWxlY3RlZEJ5IitkYXRhLmlkKS5zdHlsZS5kaXNwbGF5ID09PSAnaW5saW5lJyl7CiAgICAgICAgICAgIHVwZGF0ZU9wdHMgPSB0cnVlOwogICAgICAgICAgICBkYXRhT3B0aW9ucy5pZCAgPSBkYXRhLmlkOwogICAgICAgICAgICBkYXRhT3B0aW9ucy5vcHRpb25zLmJ5c2VsZWN0aW9uID0ge2VuYWJsZWQgOiB0cnVlLCB2YXJpYWJsZSA6IG1haW5fZWwuYnlzZWxlY3Rpb25fdmFyaWFibGUsIG11bHRpcGxlIDogbWFpbl9lbC5ieXNlbGVjdGlvbl9tdWx0aXBsZX07CiAgICAgICAgICB9CiAgICAgICAgCiAgICAgICAgICBpZih1cGRhdGVPcHRzKXsKICAgICAgICAgICAgdXBkYXRlVmlzT3B0aW9ucyhkYXRhT3B0aW9ucyk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgfQogIH0pOwoKICAvLyB1ZHBhdGUgZWRnZXMgZGF0YQogIFNoaW55LmFkZEN1c3RvbU1lc3NhZ2VIYW5kbGVyKCd2aXNTaGlueVVwZGF0ZUVkZ2VzJywgZnVuY3Rpb24oZGF0YSl7CiAgICAgIC8vIGdldCBjb250YWluZXIgaWQKICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdyYXBoIitkYXRhLmlkKTsKICAgICAgaWYoZWwpewogICAgICAgIC8vIGdldCBlZGdlcyBvYmplY3QKICAgICAgICB2YXIgdG1wZWRnZXMgPSB2aXNOZXR3b3JrZGF0YWZyYW1lVG9EMyhkYXRhLmVkZ2VzLCAiZWRnZXMiKTsKICAgICAgICBlbC5lZGdlcy51cGRhdGUodG1wZWRnZXMpOwogICAgICB9CiAgfSk7CiAgCiAgLy8gcmVtb3ZlIG5vZGVzCiAgU2hpbnkuYWRkQ3VzdG9tTWVzc2FnZUhhbmRsZXIoJ3Zpc1NoaW55UmVtb3ZlTm9kZXMnLCBmdW5jdGlvbihkYXRhKXsKICAgICAgLy8gZ2V0IGNvbnRhaW5lciBpZAogICAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ3JhcGgiK2RhdGEuaWQpOwogICAgICB2YXIgbWFpbl9lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRhdGEuaWQpOwogICAgICBpZihlbCl7CiAgICAgICAgLy8gcmVzZXQgc29tZSBwYXJhbWV0ZXJzIC8gZGF0ZSBiZWZvcmUKICAgICAgICBpZiAobWFpbl9lbC5zZWxlY3RBY3RpdmUgPT09IHRydWUgfCBtYWluX2VsLmhpZ2hsaWdodEFjdGl2ZSA9PT0gdHJ1ZSkgewogICAgICAgICAgLy9yZXNldCBub2RlcwogICAgICAgICAgdmFyIGFsbE5vZGVzID0gZWwubm9kZXMuZ2V0KHtyZXR1cm5UeXBlOiJPYmplY3QifSk7CiAgICAgICAgICByZXNldEFsbE5vZGVzKGFsbE5vZGVzLCB0cnVlLCBlbC5ub2RlcywgZWwuY2hhcnQuZ3JvdXBzLCBlbC5vcHRpb25zKTsKICAgICAgICAgIAogICAgICAgICAgaWYgKG1haW5fZWwuc2VsZWN0QWN0aXZlID09PSB0cnVlKXsKICAgICAgICAgICAgbWFpbl9lbC5zZWxlY3RBY3RpdmUgPSBmYWxzZTsKICAgICAgICAgICAgcmVzZXRMaXN0KCdzZWxlY3RlZEJ5JywgZGF0YS5pZCwgJ3NlbGVjdGVkQnknKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChtYWluX2VsLmhpZ2hsaWdodEFjdGl2ZSA9PT0gdHJ1ZSl7CiAgICAgICAgICAgIG1haW5fZWwuaGlnaGxpZ2h0QWN0aXZlID0gZmFsc2U7CiAgICAgICAgICAgIHJlc2V0TGlzdCgnbm9kZVNlbGVjdCcsIGRhdGEuaWQsICdzZWxlY3RlZCcpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyByZW1vdmUgbm9kZXMKICAgICAgICBlbC5ub2Rlcy5yZW1vdmUoZGF0YS5ybWlkKTsKICAgICAgICBtYWluX2VsLnVwZGF0ZU5vZGVzID0gdHJ1ZTsKICAgICAgICAKICAgICAgICAvLyB1cGRhdGUgb3B0aW9ucyA/CiAgICAgICAgaWYoZGF0YS51cGRhdGVPcHRpb25zKXsKICAgICAgICAgIHZhciBkYXRhT3B0aW9ucyA9IHt9OwogICAgICAgICAgZGF0YU9wdGlvbnMub3B0aW9ucyA9IHt9OwogICAgICAgIAogICAgICAgICAgdmFyIHVwZGF0ZU9wdHMgPSBmYWxzZTsKICAgICAgICAgIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJub2RlU2VsZWN0IitkYXRhLmlkKS5zdHlsZS5kaXNwbGF5ID09PSAnaW5saW5lJyl7CiAgICAgICAgICAgIHVwZGF0ZU9wdHMgPSB0cnVlOwogICAgICAgICAgICBkYXRhT3B0aW9ucy5pZCAgPSBkYXRhLmlkOwogICAgICAgICAgICBkYXRhT3B0aW9ucy5vcHRpb25zLmlkc2VsZWN0aW9uID0ge2VuYWJsZWQgOiB0cnVlfTsKICAgICAgICAgIH0KICAgIAogICAgICAgICAgaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlbGVjdGVkQnkiK2RhdGEuaWQpLnN0eWxlLmRpc3BsYXkgPT09ICdpbmxpbmUnKXsKICAgICAgICAgICAgdXBkYXRlT3B0cyA9IHRydWU7CiAgICAgICAgICAgIGRhdGFPcHRpb25zLmlkICA9IGRhdGEuaWQ7CiAgICAgICAgICAgIGRhdGFPcHRpb25zLm9wdGlvbnMuYnlzZWxlY3Rpb24gPSB7ZW5hYmxlZCA6IHRydWUsIHZhcmlhYmxlIDogbWFpbl9lbC5ieXNlbGVjdGlvbl92YXJpYWJsZSwgbXVsdGlwbGUgOiBtYWluX2VsLmJ5c2VsZWN0aW9uX211bHRpcGxlfTsKICAgICAgICAgIH0KICAgICAgICAKICAgICAgICAgIGlmKHVwZGF0ZU9wdHMpewogICAgICAgICAgICB1cGRhdGVWaXNPcHRpb25zKGRhdGFPcHRpb25zKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICB9KTsKICAKICAvLyByZW1vdmUgZWRnZXMKICBTaGlueS5hZGRDdXN0b21NZXNzYWdlSGFuZGxlcigndmlzU2hpbnlSZW1vdmVFZGdlcycsIGZ1bmN0aW9uKGRhdGEpewogICAgICAvLyBnZXQgY29udGFpbmVyIGlkCiAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZGF0YS5pZCk7CiAgICAgIGlmKGVsKXsKICAgICAgICBlbC5lZGdlcy5yZW1vdmUoZGF0YS5ybWlkKTsKICAgICAgfQogIH0pOwogIAp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gSFRNTFdpZGdldHMud2lkZ2V0IERlZmluaXRpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCkhUTUxXaWRnZXRzLndpZGdldCh7CiAgCiAgbmFtZTogJ3Zpc05ldHdvcmsnLAogIAogIHR5cGU6ICdvdXRwdXQnLAogIAogIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICByZXR1cm4gewogICAgfTsKICB9LAogIAogIHJlbmRlclZhbHVlOiBmdW5jdGlvbihlbCwgeCwgaW5zdGFuY2UpIHsKICAgIHZhciBkYXRhOwogICAgdmFyIG5vZGVzOwogICAgdmFyIGVkZ2VzOwoKICAgIC8vIGhpZ2hsaWdodCBuZWFyZXN0IHZhcmlhYmxlcyAmIHNlbGVjdGVkQnkKICAgIHZhciBhbGxOb2RlczsKICAgIHZhciBub2Rlc0RhdGFzZXQ7CiAgICAKICAgIC8vIGNsdXN0ZXJnaW4gYnkgem9vbSB2YXJpYWJsZXMKICAgIHZhciBjbHVzdGVySW5kZXggPSAwOwogICAgdmFyIGNsdXN0ZXJzID0gW107CiAgICB2YXIgbGFzdENsdXN0ZXJab29tTGV2ZWwgPSAwOwogICAgdmFyIGNsdXN0ZXJGYWN0b3I7CiAgICB2YXIgY3RybHdhaXQgPSAwOwogICAgCiAgICAvLyBsZWdlbmQgY29udHJvbAogICAgdmFyIGFkZGxlZ2VuZCA9IGZhbHNlOwoKICAgIC8vIGNsZWFyIGVsLmlkIChmb3Igc2hpbnkuLi4pCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaW5uZXJIVE1MID0gIiI7ICAKICAgIAogICAgLy8gc2hhcmVkIGNvbnRyb2wgd2l0aCBwcm94eSBmdW5jdGlvbiAoaXMgdGhlcmUgYSBiZXR0ZXIgd2F5ID8pCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaGlnaGxpZ2h0QWN0aXZlID0gZmFsc2U7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuc2VsZWN0QWN0aXZlID0gZmFsc2U7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkudXBkYXRlTm9kZXMgPSBmYWxzZTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5pZHNlbGVjdGlvbiA9IHguaWRzZWxlY3Rpb24uZW5hYmxlZDsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5ieXNlbGVjdGlvbiA9IHguYnlzZWxlY3Rpb24uZW5hYmxlZDsKICAgIAogICAgaWYoeC5oaWdobGlnaHQgIT09IHVuZGVmaW5lZCl7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHQgPSB4LmhpZ2hsaWdodC5lbmFibGVkOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaGlnaGxpZ2h0Q29sb3IgPSB4LmhpZ2hsaWdodC5oaWRlQ29sb3I7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5ob3Zlck5lYXJlc3QgPSB4LmhpZ2hsaWdodC5ob3Zlck5lYXJlc3Q7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5kZWdyZWUgPSB4LmhpZ2hsaWdodC5kZWdyZWU7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHRBbGdvcml0aG0gPSB4LmhpZ2hsaWdodC5hbGdvcml0aG07CiAgICB9IGVsc2UgewogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaGlnaGxpZ2h0ID0gZmFsc2U7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5ob3Zlck5lYXJlc3QgPSBmYWxzZTsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmhpZ2hsaWdodENvbG9yID0gJ3JnYmEoMjAwLDIwMCwyMDAsMC41KSc7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5kZWdyZWUgPSAxOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaGlnaGxpZ2h0QWxnb3JpdGhtID0gImFsbCI7CiAgICB9CgogICAgaWYoeC5ieXNlbGVjdGlvbi5lbmFibGVkKXsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmJ5c2VsZWN0aW9uQ29sb3IgPSB4LmJ5c2VsZWN0aW9uLmhpZGVDb2xvcjsKICAgIH0gZWxzZSB7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5ieXNlbGVjdGlvbkNvbG9yID0gJ3JnYmEoMjAwLDIwMCwyMDAsMC41KSc7CiAgICB9CiAgICAKICAgIHZhciBjaGFuZ2VJbnB1dCA9IGZ1bmN0aW9uKGlkLCBkYXRhKSB7CiAgICAgICAgICAgIFNoaW55Lm9uSW5wdXRDaGFuZ2UoZWwuaWQgKyAnXycgKyBpZCwgZGF0YSk7CiAgICB9OwogICAgICAgICAgCiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioKICAgIC8vdGl0bGUKICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgaWYoeC5tYWluICE9PSBudWxsKXsKICAgICAgdmFyIGRpdl90aXRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICBkaXZfdGl0bGUuaW5uZXJIVE1MID0geC5tYWluLnRleHQ7CiAgICAgIGRpdl90aXRsZS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgIHgubWFpbi5zdHlsZSk7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5hcHBlbmRDaGlsZChkaXZfdGl0bGUpOyAgCiAgICB9CiAgICAKICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgLy9zdWJ0aXRsZQogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBpZih4LnN1Ym1haW4gIT09IG51bGwpewogICAgICB2YXIgZGl2X3N1YnRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIGRpdl9zdWJ0aXRsZS5pbm5lckhUTUwgPSB4LnN1Ym1haW4udGV4dDsKICAgICAgZGl2X3N1YnRpdGxlLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAgeC5zdWJtYWluLnN0eWxlKTsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmFwcGVuZENoaWxkKGRpdl9zdWJ0aXRsZSk7ICAKICAgIH0KIAogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAvL2lkc2VsZWN0aW9uCiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioKICAgIGZ1bmN0aW9uIG9uSWRDaGFuZ2UoaWQsIGluaXQpIHsKICAgICAgaWYoaWQgPT09ICIiKXsKICAgICAgICBpbnN0YW5jZS5uZXR3b3JrLnNlbGVjdE5vZGVzKFtdKTsKICAgICAgfWVsc2V7CiAgICAgICAgaW5zdGFuY2UubmV0d29yay5zZWxlY3ROb2RlcyhbaWRdKTsKICAgICAgfQogICAgICBpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaGlnaGxpZ2h0KXsKICAgICAgICBuZWlnaGJvdXJob29kSGlnaGxpZ2h0KGluc3RhbmNlLm5ldHdvcmsuZ2V0U2VsZWN0aW9uKCkubm9kZXMsICJjbGljayIsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHRBbGdvcml0aG0pOwogICAgICB9ZWxzZXsKICAgICAgICBpZihpbml0KXsKICAgICAgICAgIHNlbGVjdE5vZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm9kZVNlbGVjdCcrZWwuaWQpOwogICAgICAgICAgaWYoeC5pZHNlbGVjdGlvbi52YWx1ZXMgIT09IHVuZGVmaW5lZCl7CiAgICAgICAgICAgIGlmKGluZGV4T2YuY2FsbCh4Lmlkc2VsZWN0aW9uLnZhbHVlcywgaWQsIHRydWUpID4gLTEpewogICAgICAgICAgICAgIHNlbGVjdE5vZGUudmFsdWUgPSBpZDsKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgc2VsZWN0Tm9kZS52YWx1ZSA9ICIiOwogICAgICAgICAgICB9CiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgc2VsZWN0Tm9kZS52YWx1ZSA9IGlkOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAod2luZG93LlNoaW55KXsKICAgICAgICBjaGFuZ2VJbnB1dCgnc2VsZWN0ZWQnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibm9kZVNlbGVjdCIrZWwuaWQpLnZhbHVlKTsKICAgICAgfQogICAgICBpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuYnlzZWxlY3Rpb24pewogICAgICAgIHJlc2V0TGlzdCgnc2VsZWN0ZWRCeScsIGVsLmlkLCAnc2VsZWN0ZWRCeScpOwogICAgICB9CiAgICB9CiAgICAgIAogICAgLy8gaWQgbm9kZXMgc2VsZWN0aW9uIDogYWRkIGEgbGlzdCBvbiB0b3AgbGVmdAogICAgLy8gYWN0dWFsbHkgb25seSB3aXRoIG5vZGVzICsgZWRnZXMgZGF0YSAobm90IGRvdCBhbmQgZ2VwaGkpCiAgICB2YXIgaWRMaXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iik7CiAgICBpZExpc3Quc2V0QXR0cmlidXRlKCdjbGFzcycsICdkcm9wZG93bicpOwogICAgaWRMaXN0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICBpZExpc3QuaWQgPSAibm9kZVNlbGVjdCIrZWwuaWQ7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuYXBwZW5kQ2hpbGQoaWRMaXN0KTsKICAgICAgCiAgICBpZExpc3Qub25jaGFuZ2UgPSAgZnVuY3Rpb24oKXsKICAgICAgaWYoaW5zdGFuY2UubmV0d29yayl7CiAgICAgICAgb25JZENoYW5nZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibm9kZVNlbGVjdCIrZWwuaWQpLnZhbHVlLCBmYWxzZSk7CiAgICAgIH0KICAgIH07CiAgICAgIAogICAgdmFyIGhyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaHIiKTsKICAgIGhyLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnaGVpZ2h0OjBweDsgdmlzaWJpbGl0eTpoaWRkZW47IG1hcmdpbi1ib3R0b206LTFweDsnKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5hcHBlbmRDaGlsZChocik7ICAKICAgICAgCiAgICBpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaWRzZWxlY3Rpb24peyAgCiAgICAgIHZhciBvcHRpb247CiAgICAgIC8vQ3JlYXRlIGFuZCBhcHBlbmQgc2VsZWN0IGxpc3QKICAgICAgdmFyIHNlbG5vZGVzID0gdmlzTmV0d29ya2RhdGFmcmFtZVRvRDMoeC5ub2RlcywgIm5vZGVzIik7CiAgICAgIAogICAgICB2YXIgc2VsZWN0TGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJub2RlU2VsZWN0IitlbC5pZCkKICAgICAgc2VsZWN0TGlzdC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgeC5pZHNlbGVjdGlvbi5zdHlsZSk7CiAgICAgIHNlbGVjdExpc3Quc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUnOwogICAgICAKICAgICAgb3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7CiAgICAgIG9wdGlvbi52YWx1ZSA9ICIiOwogICAgICBvcHRpb24udGV4dCA9ICJTZWxlY3QgYnkgaWQiOwogICAgICBzZWxlY3RMaXN0LmFwcGVuZENoaWxkKG9wdGlvbik7CiAgICAgIAogICAgICB2YXIgYWRkaWQ7CiAgICAgIC8vQ3JlYXRlIGFuZCBhcHBlbmQgdGhlIG9wdGlvbnMKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxub2Rlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGFkZGlkID0gdHJ1ZTsKICAgICAgICBpZih4Lmlkc2VsZWN0aW9uLnZhbHVlcyAhPT0gdW5kZWZpbmVkKXsKICAgICAgICAgIGlmKGluZGV4T2YuY2FsbCh4Lmlkc2VsZWN0aW9uLnZhbHVlcywgc2Vsbm9kZXNbaV0uaWQsIGZhbHNlKSA9PT0gLTEpewogICAgICAgICAgICBhZGRpZCA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZihhZGRpZCl7CiAgICAgICAgICBvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKTsKICAgICAgICAgIG9wdGlvbi52YWx1ZSA9IHNlbG5vZGVzW2ldLmlkOwogICAgICAgICAgaWYoc2Vsbm9kZXNbaV0ubGFiZWwgJiYgeC5pZHNlbGVjdGlvbi51c2VMYWJlbHMpewogICAgICAgICAgICBvcHRpb24udGV4dCA9IHNlbG5vZGVzW2ldLmxhYmVsOwogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIG9wdGlvbi50ZXh0ID0gc2Vsbm9kZXNbaV0uaWQ7CiAgICAgICAgICB9CiAgICAgICAgICBzZWxlY3RMaXN0LmFwcGVuZENoaWxkKG9wdGlvbik7CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBpZiAod2luZG93LlNoaW55KXsKICAgICAgICBjaGFuZ2VJbnB1dCgnc2VsZWN0ZWQnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibm9kZVNlbGVjdCIrZWwuaWQpLnZhbHVlKTsKICAgICAgfQogICAgfQogICAgCiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioKICAgIC8vc2VsZWN0ZWRCeQogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBmdW5jdGlvbiBvbkJ5Q2hhbmdlKHZhbHVlKSB7CiAgICAgICAgaWYoaW5zdGFuY2UubmV0d29yayl7CiAgICAgICAgICBzZWxlY3RlZEhpZ2hsaWdodCh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGlmICh3aW5kb3cuU2hpbnkpewogICAgICAgICAgY2hhbmdlSW5wdXQoJ3NlbGVjdGVkQnknLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5pZHNlbGVjdGlvbil7CiAgICAgICAgICByZXNldExpc3QoJ25vZGVTZWxlY3QnLCBlbC5pZCwgJ3NlbGVjdGVkJyk7CiAgICAgICAgfQogICAgfQogICAgCiAgICAvLyBzZWxlY3RlZEJ5IDogYWRkIGEgbGlzdCBvbiB0b3AgbGVmdAogICAgLy8gYWN0dWFsbHkgb25seSB3aXRoIG5vZGVzICsgZWRnZXMgZGF0YSAobm90IGRvdCBhbmQgZ2VwaGkpCiAgICAvL0NyZWF0ZSBhbmQgYXBwZW5kIHNlbGVjdCBsaXN0CiAgICB2YXIgYnlMaXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iik7CiAgICBieUxpc3Quc2V0QXR0cmlidXRlKCdjbGFzcycsICdkcm9wZG93bicpOwogICAgYnlMaXN0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICBieUxpc3QuaWQgPSAic2VsZWN0ZWRCeSIrZWwuaWQ7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuYXBwZW5kQ2hpbGQoYnlMaXN0KTsKCiAgICBieUxpc3Qub25jaGFuZ2UgPSAgZnVuY3Rpb24oKXsKICAgICAgb25CeUNoYW5nZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VsZWN0ZWRCeSIrZWwuaWQpLnZhbHVlKTsKICAgIH07CiAgICAgIAogICAgCiAgICBpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuYnlzZWxlY3Rpb24pewoKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmJ5c2VsZWN0aW9uX3ZhbHVlcyA9IHguYnlzZWxlY3Rpb24udmFsdWVzOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuYnlzZWxlY3Rpb25fdmFyaWFibGUgPSB4LmJ5c2VsZWN0aW9uLnZhcmlhYmxlOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuYnlzZWxlY3Rpb25fbXVsdGlwbGUgPSB4LmJ5c2VsZWN0aW9uLm11bHRpcGxlOwogICAgICB2YXIgb3B0aW9uMjsKICAgICAgCiAgICAgIC8vQ3JlYXRlIGFuZCBhcHBlbmQgc2VsZWN0IGxpc3QKICAgICAgdmFyIHNlbGVjdExpc3QyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlbGVjdGVkQnkiK2VsLmlkKTsKICAgICAgc2VsZWN0TGlzdDIuc2V0QXR0cmlidXRlKCdzdHlsZScsIHguYnlzZWxlY3Rpb24uc3R5bGUpOwogICAgICBzZWxlY3RMaXN0Mi5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZSc7CiAgICAgIAogICAgICBvcHRpb24yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7CiAgICAgIG9wdGlvbjIudmFsdWUgPSAiIjsKICAgICAgb3B0aW9uMi50ZXh0ID0gIlNlbGVjdCBieSAiICsgeC5ieXNlbGVjdGlvbi52YXJpYWJsZTsKICAgICAgc2VsZWN0TGlzdDIuYXBwZW5kQ2hpbGQob3B0aW9uMik7CiAgICAgIAogICAgICAvL0NyZWF0ZSBhbmQgYXBwZW5kIHRoZSBvcHRpb25zCiAgICAgIGZvciAodmFyIGkyID0gMDsgaTIgPCB4LmJ5c2VsZWN0aW9uLnZhbHVlcy5sZW5ndGg7IGkyKyspIHsKICAgICAgICBvcHRpb24yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7CiAgICAgICAgb3B0aW9uMi52YWx1ZSA9IHguYnlzZWxlY3Rpb24udmFsdWVzW2kyXTsKICAgICAgICBvcHRpb24yLnRleHQgPSB4LmJ5c2VsZWN0aW9uLnZhbHVlc1tpMl07CiAgICAgICAgc2VsZWN0TGlzdDIuYXBwZW5kQ2hpbGQob3B0aW9uMik7CiAgICAgIH0KICAgICAgCiAgICAgIGlmICh3aW5kb3cuU2hpbnkpewogICAgICAgIGNoYW5nZUlucHV0KCdzZWxlY3RlZEJ5JywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlbGVjdGVkQnkiK2VsLmlkKS52YWx1ZSk7CiAgICAgIH0KICAgIH0KICAgIAogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAvLyBwcmUtdHJlYXRtZW50IGZvciBpY29ucyAodW5pY29kZSkKICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgaWYoeC5vcHRpb25zLmdyb3Vwcyl7CiAgICAgIGZvciAodmFyIGdyIGluIHgub3B0aW9ucy5ncm91cHMpewogICAgICAgIGlmKHgub3B0aW9ucy5ncm91cHNbZ3JdLmljb24pewogICAgICAgICAgaWYoeC5vcHRpb25zLmdyb3Vwc1tncl0uaWNvbi5jb2RlKXsKICAgICAgICAgICAgeC5vcHRpb25zLmdyb3Vwc1tncl0uaWNvbi5jb2RlID0gSlNPTi5wYXJzZSggJyInKydcXHUnICsgeC5vcHRpb25zLmdyb3Vwc1tncl0uaWNvbi5jb2RlICsgJyInKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmKHgub3B0aW9ucy5ncm91cHNbZ3JdLmljb24uY29sb3IpewogICAgICAgICAgICB4Lm9wdGlvbnMuZ3JvdXBzW2dyXS5jb2xvciA9IHgub3B0aW9ucy5ncm91cHNbZ3JdLmljb24uY29sb3I7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAKICAgIGlmKHgub3B0aW9ucy5ub2Rlcy5pY29uKXsKICAgICAgICBpZih4Lm9wdGlvbnMubm9kZXMuaWNvbi5jb2RlKXsKICAgICAgICAgIHgub3B0aW9ucy5ub2Rlcy5pY29uLmNvZGUgPSBKU09OLnBhcnNlKCAnIicrJ1xcdScgKyB4Lm9wdGlvbnMubm9kZXMuaWNvbi5jb2RlICsgJyInKTsKICAgICAgICB9CiAgICAgICAgaWYoeC5vcHRpb25zLm5vZGVzLmljb24uY29sb3IpewogICAgICAgICAgeC5vcHRpb25zLm5vZGVzLmNvbG9yID0geC5vcHRpb25zLm5vZGVzLmljb24uY29sb3I7CiAgICAgICAgfQogICAgfQogICAgCiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioKICAgIC8vcGFnZSBzdHJ1Y3R1cmUKICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgCiAgICAvLyBkaXZpZGUgcGFnZQogICAgdmFyIG1haW5kaXYgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBtYWluZGl2LmlkID0gIm1haW5kaXYiK2VsLmlkOwogICAgbWFpbmRpdi5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2hlaWdodDo5NSUnKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5hcHBlbmRDaGlsZChtYWluZGl2KTsKICAgIAogICAgdmFyIGdyYXBoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBncmFwaC5pZCA9ICJncmFwaCIrZWwuaWQ7CiAgICAKICAgIGlmKHgubGVnZW5kICE9PSB1bmRlZmluZWQpewogICAgICBpZigoeC5ncm91cHMgJiYgeC5sZWdlbmQudXNlR3JvdXBzKSB8fCAoeC5sZWdlbmQubm9kZXMgIT09IHVuZGVmaW5lZCkgfHwgKHgubGVnZW5kLmVkZ2VzICE9PSB1bmRlZmluZWQpKXsKICAgICAgICBhZGRsZWdlbmQgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICAKICAgIC8vbGVnZW5kCiAgICBpZihhZGRsZWdlbmQpewogICAgICB2YXIgbGVnZW5kd2lkdGggPSB4LmxlZ2VuZC53aWR0aCoxMDA7CiAgICAgIHZhciBsZWdlbmQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgCiAgICAgIHZhciBwb3MgPSB4LmxlZ2VuZC5wb3NpdGlvbjsKICAgICAgdmFyIHBvczIgPSAicmlnaHQiOwogICAgICBpZihwb3MgPT0gInJpZ2h0Iil7CiAgICAgICAgcG9zMiA9ICJsZWZ0IjsKICAgICAgfQogICAgICAKICAgICAgbGVnZW5kLmlkID0gImxlZ2VuZCIrZWwuaWQ7CiAgICAgIGxlZ2VuZC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Zsb2F0OicgKyBwb3MgKyAnOyB3aWR0aDonK2xlZ2VuZHdpZHRoKyclO2hlaWdodDoxMDAlJyk7CiAgICAgIAogICAgICAvL2xlZ2VuZCB0aXRsZQogICAgICBpZih4LmxlZ2VuZC5tYWluICE9PSB1bmRlZmluZWQpewogICAgICAgIHZhciBsZWdlbmRfdGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICBsZWdlbmRfdGl0bGUuaW5uZXJIVE1MID0geC5sZWdlbmQubWFpbi50ZXh0OwogICAgICAgIGxlZ2VuZF90aXRsZS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgIHgubGVnZW5kLm1haW4uc3R5bGUpOwogICAgICAgIGxlZ2VuZC5hcHBlbmRDaGlsZChsZWdlbmRfdGl0bGUpOyAgCiAgICAgICAgCiAgICAgICAgbGVnZW5kLmlkID0gImxlZ2VuZF9tYWluIitlbC5pZDsKICAgICAgICB2YXIgbGVnZW5kX25ldHdvcmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICBsZWdlbmRfbmV0d29yay5pZCA9ICJsZWdlbmQiK2VsLmlkOwogICAgICAgIGxlZ2VuZF9uZXR3b3JrLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnaGVpZ2h0OjEwMCUnKTsKICAgICAgICBsZWdlbmQuYXBwZW5kQ2hpbGQobGVnZW5kX25ldHdvcmspOyAKICAgICAgfQogICAgICAKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1haW5kaXYiK2VsLmlkKS5hcHBlbmRDaGlsZChsZWdlbmQpOwogICAgICBncmFwaC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Zsb2F0OicgKyBwb3MyICsgJzsgd2lkdGg6JysoMTAwLWxlZ2VuZHdpZHRoKSsnJTtoZWlnaHQ6MTAwJScpOwogICAgfWVsc2V7CiAgICAgIGdyYXBoLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZmxvYXQ6cmlnaHQ7IHdpZHRoOjEwMCU7aGVpZ2h0OjEwMCUnKTsKICAgIH0KICAgIAogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1haW5kaXYiK2VsLmlkKS5hcHBlbmRDaGlsZChncmFwaCk7CiAgICAKICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgLy9sZWdlbmQgZGVmaW5pdGlvbgogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBpZihhZGRsZWdlbmQpewogICAgICAKICAgICAgdmFyIGxlZ2VuZG5vZGVzID0gbmV3IHZpcy5EYXRhU2V0KCk7CiAgICAgIHZhciBsZWdlbmRlZGdlcyA9IG51bGw7CiAgICAgIHZhciBkYXRhbGVnZW5kOwogICAgICB2YXIgdG1wbm9kZXM7CiAgICAgIAogICAgICAvLyBzZXQgc29tZSBvcHRpb25zCiAgICAgIHZhciBvcHRpb25zbGVnZW5kID0gewogICAgICAgIGludGVyYWN0aW9uOnsKICAgICAgICAgIGRyYWdOb2RlczogZmFsc2UsCiAgICAgICAgICBkcmFnVmlldzogZmFsc2UsCiAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSwKICAgICAgICAgIHpvb21WaWV3OiBmYWxzZQogICAgICAgIH0sCiAgICAgICAgcGh5c2ljczp7CiAgICAgICAgICBzdGFiaWxpemF0aW9uOiBmYWxzZQogICAgICAgIH0KICAgICAgfTsKICAgICAgCiAgICAgIGZ1bmN0aW9uIHJhbmdlKHN0YXJ0LCBsZW5ndGgsIHN0ZXAsIHJlcCl7CiAgICAgICAgdmFyIGE9W10sIGI9c3RhcnQ7CiAgICAgICAgd2hpbGUoYS5sZW5ndGggPCBsZW5ndGgpewogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXA7IGkrKyl7CiAgICAgICAgICAgIGEucHVzaChiKTsKICAgICAgICAgICAgaWYoYS5sZW5ndGggPT09IGxlbmd0aCl7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGIrPXN0ZXA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhOwogICAgICB9OwogICAgICAKICAgICAgdmFyIG15bmV0d29yayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsZWdlbmQnK2VsLmlkKTsKICAgICAgdmFyIGx4ID0gbXluZXR3b3JrLmNsaWVudFdpZHRoIC8gMiArIDUwOwogICAgICB2YXIgbHkgPSBteW5ldHdvcmsuY2xpZW50SGVpZ2h0IC8gMiArIDUwOwogICAgICB2YXIgZWRnZV9seSA9IGx5OwogICAgICB2YXIgbmNvbCA9IHgubGVnZW5kLm5jb2w7CiAgICAgIHZhciBzdGVwX3ggPSB4LmxlZ2VuZC5zdGVwWDsKICAgICAgdmFyIHN0ZXBfeSA9IHgubGVnZW5kLnN0ZXBZOwogICAgICB2YXIgdG1wX2x5OwogICAgICB2YXIgdG1wX2x4ID0gbHg7CiAgICAgIHZhciB0bXBfbHgyOwogICAgICB2YXIgYWxsX3RtcF95ID0gW107CiAgICAgIGlmKHRtcF9seCA9PT0gMCl7CiAgICAgICAgdG1wX2x4ID0gMQogICAgICB9CiAgICAgIAogICAgICAvLyBjb25zdHJ1Y3Qgbm9kZXMgZGF0YSBpZiBuZWVkZWQKICAgICAgaWYoeC5sZWdlbmQubm9kZXMgIT09IHVuZGVmaW5lZCl7CiAgICAgICAgaWYoeC5sZWdlbmQubm9kZXNUb0RhdGFmcmFtZSl7IC8vIGRhdGEgaW4gZGF0YS5mcmFtZQogICAgICAgICAgdG1wbm9kZXMgPSB2aXNOZXR3b3JrZGF0YWZyYW1lVG9EMyh4LmxlZ2VuZC5ub2RlcywgIm5vZGVzIikKICAgICAgICB9IGVsc2UgeyAvLyBkYXRhIGluIGxpc3QKICAgICAgICAgIHRtcG5vZGVzID0geC5sZWdlbmQubm9kZXM7CiAgICAgICAgfQogICAgICAgIC8vIG9ubHkgb25lIGVsZW1lbnQgICAKICAgICAgICBpZih0bXBub2Rlcy5sZW5ndGggPT09IHVuZGVmaW5lZCl7CiAgICAgICAgICB0bXBub2RlcyA9IG5ldyBBcnJheSh0bXBub2Rlcyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICAvLyBhcnJheSBvZiB5IHBvc2l0aW9uIAogICAgICBpZih4Lmdyb3VwcyAmJiB4LmxlZ2VuZC51c2VHcm91cHMgJiYgeC5sZWdlbmQubm9kZXMgIT09IHVuZGVmaW5lZCl7CiAgICAgICAgYWxsX3RtcF95ID0gcmFuZ2UobHksIHguZ3JvdXBzLmxlbmd0aCArIHRtcG5vZGVzLmxlbmd0aCwgc3RlcF95LCBuY29sKTsKICAgICAgfSBlbHNlIGlmKHguZ3JvdXBzICYmIHgubGVnZW5kLnVzZUdyb3VwcyAmJiB4LmxlZ2VuZC5ub2RlcyA9PT0gdW5kZWZpbmVkKXsKICAgICAgICBhbGxfdG1wX3kgPSByYW5nZShseSwgeC5ncm91cHMubGVuZ3RoLCBzdGVwX3ksIG5jb2wpOwogICAgICB9IGVsc2UgaWYoeC5sZWdlbmQudXNlR3JvdXBzID09PSBmYWxzZSAmJiB4LmxlZ2VuZC5ub2RlcyAhPT0gdW5kZWZpbmVkKXsKICAgICAgICBhbGxfdG1wX3kgPSByYW5nZShseSwgdG1wbm9kZXMubGVuZ3RoLCBzdGVwX3ksIG5jb2wpOwogICAgICB9CiAgICAgIAogICAgICAvLyB3YW50IHRvIHZpZXcgZ3JvdXBzIGluIGxlZ2VuZAogICAgICBpZih4Lmdyb3VwcyAmJiB4LmxlZ2VuZC51c2VHcm91cHMpewogICAgICAgIC8vIGNyZWF0ZSBkYXRhCiAgICAgICAgZm9yICh2YXIgZzEgPSAwOyBnMSA8IHguZ3JvdXBzLmxlbmd0aDsgZzErKyl7CiAgICAgICAgICAKICAgICAgICAgIGlmKGcxID09PSAwKXsKICAgICAgICAgICAgdG1wX2x4ID0gbHg7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0bXBfbHggPSBseCArIGcxJW5jb2wgKiBzdGVwX3g7CiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHRtcF9seSA9IGFsbF90bXBfeVtnMV07CiAgICAgICAgICBpZih0bXBfbHkgPT09IDApewogICAgICAgICAgICB0bXBfbHkgPSAxCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGxlZ2VuZG5vZGVzLmFkZCh7aWQ6IG51bGwsIHggOiB0bXBfbHgsIHkgOiB0bXBfbHksIGxhYmVsOiB4Lmdyb3Vwc1tnMV0sIGdyb3VwOiB4Lmdyb3Vwc1tnMV0sIHZhbHVlOiAxLCBtYXNzOjB9KTsKICAgICAgICAgIGVkZ2VfbHkgPSB0bXBfbHk7CiAgICAgICAgfQogICAgICAgIC8vIGNvbnRyb2wgaWNvbiBzaXplCiAgICAgICAgaWYoeC5vcHRpb25zLmdyb3Vwcyl7CiAgICAgICAgICBvcHRpb25zbGVnZW5kLmdyb3VwcyA9IGNsb25lKHgub3B0aW9ucy5ncm91cHMpOwogICAgICAgICAgZm9yICh2YXIgZ3JwIGluIG9wdGlvbnNsZWdlbmQuZ3JvdXBzKSB7CiAgICAgICAgICAgIGlmKG9wdGlvbnNsZWdlbmQuZ3JvdXBzW2dycF0uc2hhcGUgPT09ICJpY29uIil7CiAgICAgICAgICAgICAgb3B0aW9uc2xlZ2VuZC5ncm91cHNbZ3JwXS5pY29uLnNpemUgPSA1MDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvLyB3YW50IHRvIGFkZCBjdXN0b20gbm9kZXMKICAgICAgaWYoeC5sZWdlbmQubm9kZXMgIT09IHVuZGVmaW5lZCl7CiAgICAgICAgCiAgICAgICAgLy8gY29udHJvbCBpY29uCiAgICAgICAgZm9yICh2YXIgbmQgaW4gdG1wbm9kZXMpewogICAgICAgICAgaWYodG1wbm9kZXNbbmRdLmljb24gICYmICF4LmxlZ2VuZC5ub2Rlc1RvRGF0YWZyYW1lKXsKICAgICAgICAgICAgdG1wbm9kZXNbbmRdLmljb24uY29kZSA9IEpTT04ucGFyc2UoICciJysnXFx1JyArIHRtcG5vZGVzW25kXS5pY29uLmNvZGUgKyAnIicpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBncm91cCBjb250cm9sIGZvciB5CiAgICAgICAgdmFyIGFkZF9ncl95ID0gMDsKICAgICAgICBpZih4Lmdyb3VwcyAmJiB4LmxlZ2VuZC51c2VHcm91cHMpewogICAgICAgICAgYWRkX2dyX3kgPSB4Lmdyb3Vwcy5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIC8vIHNldCBjb29yZGluYXRlcwogICAgICAgIGZvciAodmFyIGcgPSAwOyBnIDwgdG1wbm9kZXMubGVuZ3RoOyBnKyspewogICAgICAgICAgaWYoKGcrbGVnZW5kbm9kZXMubGVuZ3RoKSA9PT0gMCl7CiAgICAgICAgICAgIHRtcF9seCA9IGx4OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdG1wX2x4ID0gbHggKyAoZytsZWdlbmRub2Rlcy5sZW5ndGgpJW5jb2wgKiBzdGVwX3g7CiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHRtcF9seSA9IGFsbF90bXBfeVthZGRfZ3JfeSArIGddOwogICAgICAgICAgaWYodG1wX2x4ID09PSAwKXsKICAgICAgICAgICAgdG1wX2x4ID0gMQogICAgICAgICAgfQogICAgICAgICAgaWYodG1wX2x5ID09PSAwKXsKICAgICAgICAgICAgdG1wX2x5ID0gMQogICAgICAgICAgfQogICAgICAgICAgdG1wbm9kZXNbZ10ueCA9IHRtcF9seDsKICAgICAgICAgIHRtcG5vZGVzW2ddLnkgPSB0bXBfbHk7CiAgICAgICAgICAKICAgICAgICAgIGlmKHRtcG5vZGVzW2ddLnZhbHVlID09PSB1bmRlZmluZWQgJiYgdG1wbm9kZXNbZ10uc2l6ZSA9PT0gdW5kZWZpbmVkKXsKICAgICAgICAgICAgdG1wbm9kZXNbZ10udmFsdWUgPSAxOwogICAgICAgICAgfQogICAgICAgICAgaWYodG1wbm9kZXNbZ10uaWQgIT09IHVuZGVmaW5lZCl7CiAgICAgICAgICAgIHRtcG5vZGVzW2ddLmlkID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIHRtcG5vZGVzW2ddLm1hc3MgPSAwOwogICAgICAgICAgZWRnZV9seSA9IHRtcF9seTsKICAgICAgICB9CiAgICAgICAgbGVnZW5kbm9kZXMuYWRkKHRtcG5vZGVzKTsKICAgICAgfQogICAgICAvLyB3YW50IHRvIGFkZCBjdXN0b20gZWRnZXMKICAgICAgaWYoeC5sZWdlbmQuZWRnZXMgIT09IHVuZGVmaW5lZCl7CiAgICAgICAgaWYoeC5sZWdlbmQuZWRnZXNUb0RhdGFmcmFtZSl7IC8vIGRhdGEgaW4gZGF0YS5mcmFtZQogICAgICAgICAgbGVnZW5kZWRnZXMgPSB2aXNOZXR3b3JrZGF0YWZyYW1lVG9EMyh4LmxlZ2VuZC5lZGdlcywgImVkZ2VzIikKICAgICAgICB9IGVsc2UgeyAgLy8gZGF0YSBpbiBsaXN0CiAgICAgICAgICBsZWdlbmRlZGdlcyA9IHgubGVnZW5kLmVkZ2VzOwogICAgICAgIH0KICAgICAgICAvLyBvbmx5IG9uZSBlbGVtZW50IAogICAgICAgIGlmKGxlZ2VuZGVkZ2VzLmxlbmd0aCA9PT0gdW5kZWZpbmVkKXsKICAgICAgICAgIGxlZ2VuZGVkZ2VzID0gbmV3IEFycmF5KGxlZ2VuZGVkZ2VzKTsKICAgICAgICB9CgogICAgICAgIC8vIHNldCBjb29yZGluYXRlcyBhbmQgb3B0aW9ucwogICAgICAgIGZvciAodmFyIGVkZyA9IDA7IGVkZyA8IChsZWdlbmRlZGdlcy5sZW5ndGgpOyBlZGcrKyl7CiAgICAgICAgICAKICAgICAgICAgIGxlZ2VuZGVkZ2VzW2VkZ10uZnJvbSA9IGVkZyoyKzE7CiAgICAgICAgICBsZWdlbmRlZGdlc1tlZGddLnRvID0gZWRnKjIrMjsKICAgICAgICAgIGxlZ2VuZGVkZ2VzW2VkZ10ucGh5c2ljcyA9IGZhbHNlOwogICAgICAgICAgbGVnZW5kZWRnZXNbZWRnXS5zbW9vdGggPSBmYWxzZTsKICAgICAgICAgIGxlZ2VuZGVkZ2VzW2VkZ10udmFsdWUgPSB1bmRlZmluZWQ7CgogICAgICAgICAgaWYobGVnZW5kZWRnZXNbZWRnXS5hcnJvd3MgPT09IHVuZGVmaW5lZCl7CiAgICAgICAgICAgIGxlZ2VuZGVkZ2VzW2VkZ10uYXJyb3dzID0gJ3RvJzsKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgaWYobGVnZW5kZWRnZXNbZWRnXS53aWR0aCA9PT0gdW5kZWZpbmVkKXsKICAgICAgICAgICAgbGVnZW5kZWRnZXNbZWRnXS53aWR0aCA9IDE7CiAgICAgICAgICB9CgogICAgICAgICAgdG1wX2x5ID0gZWRnZV9seSArIChlZGcrMSkqc3RlcF95OwogICAgICAgICAgaWYodG1wX2x5ID09PSAwKXsKICAgICAgICAgICAgdG1wX2x5ID0gMQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBpZihuY29sID09PSAxKXsKICAgICAgICAgICAgdG1wX2x4ID0gbHggLSBteW5ldHdvcmsuY2xpZW50V2lkdGgvMzsKICAgICAgICAgICAgdG1wX2x4MiA9IGx4ICsgbXluZXR3b3JrLmNsaWVudFdpZHRoLzM7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0bXBfbHggPSBseDsKICAgICAgICAgICAgdG1wX2x4MiA9IGx4ICsgKG5jb2wtMSkgKiBzdGVwX3g7CiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGlmKHRtcF9seCA9PT0gMCl7CiAgICAgICAgICAgIHRtcF9seCA9IDEKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgaWYodG1wX2x4MiA9PT0gMCl7CiAgICAgICAgICAgIHRtcF9seDIgPSAxCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGxlZ2VuZG5vZGVzLmFkZCh7aWQ6IGVkZyoyKzEsIHggOiB0bXBfbHgsIHkgOiB0bXBfbHksIHNpemUgOiAwLjAwMDEsIGhpZGRlbiA6IGZhbHNlLCBzaGFwZSA6ICJzcXVhcmUiLCBtYXNzOjB9KTsKICAgICAgICAgIGxlZ2VuZG5vZGVzLmFkZCh7aWQ6IGVkZyoyKzIsIHggOiB0bXBfbHgyLCB5IDogdG1wX2x5LCBzaXplIDogMC4wMDAxLCBoaWRkZW4gOiBmYWxzZSwgc2hhcGUgOiAic3F1YXJlIiwgbWFzczowfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICAvLyByZW5kZXIgbGVnZW5kIG5ldHdvcmsKICAgICAgZGF0YWxlZ2VuZCA9IHsKICAgICAgICBub2RlczogbGVnZW5kbm9kZXMsIAogICAgICAgIGVkZ2VzOiBsZWdlbmRlZGdlcyAgICAgICAKICAgICAgfTsKCiAgICAgIGluc3RhbmNlLmxlZ2VuZCA9IG5ldyB2aXMuTmV0d29yayhkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibGVnZW5kIitlbC5pZCksIGRhdGFsZWdlbmQsIG9wdGlvbnNsZWdlbmQpOwogICAgfQogICAgCiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioKICAgIC8vIE1haW4gTmV0d29yayByZW5kZXJpbmcKICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgaWYoeC5ub2Rlcyl7CiAgICAgIAogICAgICAvLyBuZXR3b3JrCiAgICAgIG5vZGVzID0gbmV3IHZpcy5EYXRhU2V0KCk7CiAgICAgIGVkZ2VzID0gbmV3IHZpcy5EYXRhU2V0KCk7CiAgICAgIAogICAgICB2YXIgdG1wbm9kZXM7CiAgICAgIGlmKHgubm9kZXNUb0RhdGFmcmFtZSl7IC8vIGRhdGEgaW4gZGF0YS5mcmFtZQogICAgICAgIHRtcG5vZGVzID0gdmlzTmV0d29ya2RhdGFmcmFtZVRvRDMoeC5ub2RlcywgIm5vZGVzIikKICAgICAgfSBlbHNlIHsgLy8gZGF0YSBpbiBsaXN0CiAgICAgICAgdG1wbm9kZXMgPSB4Lm5vZGVzOwogICAgICB9CiAgICAgIC8vIG9ubHkgb25lIGVsZW1lbnQgICAKICAgICAgaWYodG1wbm9kZXMubGVuZ3RoID09PSB1bmRlZmluZWQpewogICAgICAgIHRtcG5vZGVzID0gbmV3IEFycmF5KHRtcG5vZGVzKTsKICAgICAgfQogICAgICAgIAogICAgICAvLyB1cGRhdGUgY29vcmRpbmF0ZXMgaWYgaWdyYXBoCiAgICAgIGlmKHguaWdyYXBobGF5b3V0ICE9PSB1bmRlZmluZWQpewogICAgICAgIC8vIHRvIGltcHJvdmVkCiAgICAgICAgdmFyIHpvb21MZXZlbCA9IC0yMzIuNjIyMzQ5IC8gKHRtcG5vZGVzLmxlbmd0aCArIDkxLjE2NTkxOSkgICsyLjUxNjg2MTsKICAgICAgICB2YXIgaWdjbGllbnRXaWR0aCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZWwuaWQpLmNsaWVudFdpZHRoOwogICAgICAgIHZhciBzY2FsZXggPSAxMDA7CiAgICAgICAgdmFyIHNjYWxleSA9IDEwMDsKICAgICAgICAKICAgICAgICAvLyBjdXJyZW50IGRpdiB2aXNpYmxlZAogICAgICAgIGlmKGlnY2xpZW50V2lkdGggIT09IDApewogICAgICAgICAgdmFyIGZhY3RvciA9IGlnY2xpZW50V2lkdGggLyAxODkwOwogICAgICAgICAgem9vbUxldmVsID0gem9vbUxldmVsL2ZhY3RvcjsKICAgICAgICAgIHZhciBzY2FsZXggPSAoaWdjbGllbnRXaWR0aCAvIDIpICogem9vbUxldmVsOwogICAgICAgICAgdmFyIHNjYWxleSA9IHNjYWxleDsKICAgICAgICAgIGlmKHguaWdyYXBobGF5b3V0LnR5cGUgIT09ICJzcXVhcmUiKXsKICAgICAgICAgICAgc2NhbGV5ID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZWwuaWQpLmNsaWVudEhlaWdodCAvIDIpICogem9vbUxldmVsOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBjdXJyZW50IGRpdiBub3QgdmlzaWJsZWQuLi4uCiAgICAgICAgICBpZ2NsaWVudFdpZHRoID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLnN0eWxlLndpZHRoKTsKICAgICAgICAgIGlmKGlnY2xpZW50V2lkdGggIT09IDApewogICAgICAgICAgICB2YXIgZmFjdG9yID0gaWdjbGllbnRXaWR0aCAvIDE4OTA7CiAgICAgICAgICAgIHpvb21MZXZlbCA9IHpvb21MZXZlbC9mYWN0b3I7CiAgICAgICAgICAgIHZhciBzY2FsZXggPSAoaWdjbGllbnRXaWR0aCAvIDIpICogem9vbUxldmVsOwogICAgICAgICAgICB2YXIgc2NhbGV5ID0gc2NhbGV4OwogICAgICAgICAgICBpZih4LmlncmFwaGxheW91dC50eXBlICE9PSAic3F1YXJlIil7CiAgICAgICAgICAgICAgc2NhbGV5ID0gKHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5zdHlsZS5oZWlnaHQpIC8gMikgKiB6b29tTGV2ZWw7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZm9yICh2YXIgbmQgaW4gdG1wbm9kZXMpIHsKICAgICAgICAgIHRtcG5vZGVzW25kXS54ID0gdG1wbm9kZXNbbmRdLnggKiBzY2FsZXg7CiAgICAgICAgICB0bXBub2Rlc1tuZF0ueSA9IHRtcG5vZGVzW25kXS55ICogc2NhbGV5OwogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgbm9kZXMuYWRkKHRtcG5vZGVzKTsKICAgICAgCiAgICAgIHZhciB0bXBlZGdlczsKICAgICAgaWYoeC5lZGdlc1RvRGF0YWZyYW1lKXsgLy8gZGF0YSBpbiBkYXRhLmZyYW1lCiAgICAgICAgdG1wZWRnZXMgPSB2aXNOZXR3b3JrZGF0YWZyYW1lVG9EMyh4LmVkZ2VzLCAiZWRnZXMiKQogICAgICB9IGVsc2UgeyAvLyBkYXRhIGluIGxpc3QKICAgICAgICB0bXBlZGdlcyA9IHguZWRnZXM7CiAgICAgIH0KICAgICAgLy8gb25seSBvbmUgZWxlbWVudCAgIAogICAgICBpZih0bXBlZGdlcy5sZW5ndGggPT09IHVuZGVmaW5lZCl7CiAgICAgICAgdG1wZWRnZXMgPSBuZXcgQXJyYXkodG1wZWRnZXMpOwogICAgICB9CiAgICAgIGVkZ2VzLmFkZCh0bXBlZGdlcyk7CgogICAgICAvLyByZXNldCB0bXBub2RlcwogICAgICB0bXBub2RlcyA9IG51bGw7CiAgICAgIAogICAgICBkYXRhID0gewogICAgICAgIG5vZGVzOiBub2RlcywKICAgICAgICBlZGdlczogZWRnZXMKICAgICAgfTsKICAgICAgCiAgICAgIC8vc2F2ZSBkYXRhIGZvciByZS11c2UgYW5kIHVwZGF0ZQogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ3JhcGgiK2VsLmlkKS5ub2RlcyA9IG5vZGVzOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ3JhcGgiK2VsLmlkKS5lZGdlcyA9IGVkZ2VzOwoKICAgIH1lbHNlIGlmKHguZG90KXsKICAgICAgZGF0YSA9IHsKICAgICAgICBkb3Q6IHguZG90CiAgICAgIH07CiAgICB9ZWxzZSBpZih4LmdlcGhpKXsKICAgICAgZGF0YSA9IHsKICAgICAgICBnZXBoaTogeC5nZXBoaQogICAgICB9OwogICAgfSAKICAgIAogICAgdmFyIG9wdGlvbnMgPSB4Lm9wdGlvbnM7CgogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAvL21hbmlwdWxhdGlvbgogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBpZih4Lm9wdGlvbnMubWFuaXB1bGF0aW9uLmVuYWJsZWQpewoKICAgICAgdmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKICAgICAgc3R5bGUudHlwZSA9ICd0ZXh0L2Nzcyc7CiAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHguZGF0YWNzcykpOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKHN0eWxlKTsKCiAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgZGl2LmlkID0gJ25ldHdvcmstcG9wVXAnOwoKICAgICAgZGl2LmlubmVySFRNTCA9ICc8c3BhbiBpZD0ib3BlcmF0aW9uIj5ub2RlPC9zcGFuPiA8YnI+XAogICAgICA8dGFibGUgc3R5bGU9Im1hcmdpbjphdXRvOyI+PHRyPlwKICAgICAgPHRkPmlkPC90ZD48dGQ+PGlucHV0IGlkPSJub2RlLWlkIiB2YWx1ZT0ibmV3IHZhbHVlIiBkaXNhYmxlZCA9IHRydWU+PC90ZD5cCiAgICAgIDwvdHI+XAogICAgICA8dHI+XAogICAgICA8dGQ+bGFiZWw8L3RkPjx0ZD48aW5wdXQgaWQ9Im5vZGUtbGFiZWwiIHZhbHVlPSJuZXcgdmFsdWUiPiA8L3RkPlwKICAgICAgPC90cj48L3RhYmxlPlwKICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9InNhdmUiIGlkPSJzYXZlQnV0dG9uIj48L2J1dHRvbj5cCiAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJjYW5jZWwiIGlkPSJjYW5jZWxCdXR0b24iPjwvYnV0dG9uPic7CgogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuYXBwZW5kQ2hpbGQoZGl2KTsKCiAgICAgIG9wdGlvbnMubWFuaXB1bGF0aW9uLmFkZE5vZGUgPSBmdW5jdGlvbihkYXRhLCBjYWxsYmFjaykgewogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcGVyYXRpb24nKS5pbm5lckhUTUwgPSAiQWRkIE5vZGUiOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub2RlLWlkJykudmFsdWUgPSBkYXRhLmlkOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub2RlLWxhYmVsJykudmFsdWUgPSBkYXRhLmxhYmVsOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYXZlQnV0dG9uJykub25jbGljayA9IHNhdmVOb2RlLmJpbmQodGhpcywgZGF0YSwgY2FsbGJhY2ssICJhZGROb2RlIik7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbmNlbEJ1dHRvbicpLm9uY2xpY2sgPSBjbGVhclBvcFVwLmJpbmQoKTsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmV0d29yay1wb3BVcCcpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICB9OwoKICAgICAgb3B0aW9ucy5tYW5pcHVsYXRpb24uZWRpdE5vZGUgPSBmdW5jdGlvbihkYXRhLCBjYWxsYmFjaykgewogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcGVyYXRpb24nKS5pbm5lckhUTUwgPSAiRWRpdCBOb2RlIjsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm9kZS1pZCcpLnZhbHVlID0gZGF0YS5pZDsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm9kZS1sYWJlbCcpLnZhbHVlID0gZGF0YS5sYWJlbDsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2F2ZUJ1dHRvbicpLm9uY2xpY2sgPSBzYXZlTm9kZS5iaW5kKHRoaXMsIGRhdGEsIGNhbGxiYWNrLCAiZWRpdE5vZGUiKTsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FuY2VsQnV0dG9uJykub25jbGljayA9IGNhbmNlbEVkaXQuYmluZCh0aGlzLGNhbGxiYWNrKTsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmV0d29yay1wb3BVcCcpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICB9OwoKICAgICAgb3B0aW9ucy5tYW5pcHVsYXRpb24uZGVsZXRlTm9kZSA9IGZ1bmN0aW9uKGRhdGEsIGNhbGxiYWNrKSB7CiAgICAgICAgICB2YXIgciA9IGNvbmZpcm0oIkRvIHlvdSB3YW50IHRvIGRlbGV0ZSAiICsgZGF0YS5ub2Rlcy5sZW5ndGggKyAiIG5vZGUocykgYW5kICIgKyBkYXRhLmVkZ2VzLmxlbmd0aCArICIgZWRnZXMgPyIpOwogICAgICAgICAgaWYgKHIgPT09IHRydWUpIHsKICAgICAgICAgICAgZGVsZXRlU3ViR3JhcGgoZGF0YSwgY2FsbGJhY2spOwogICAgICAgICAgfQogICAgICB9OwoKICAgICAgb3B0aW9ucy5tYW5pcHVsYXRpb24uZGVsZXRlRWRnZSA9IGZ1bmN0aW9uKGRhdGEsIGNhbGxiYWNrKSB7CiAgICAgICAgICB2YXIgciA9IGNvbmZpcm0oIkRvIHlvdSB3YW50IHRvIGRlbGV0ZSAiICsgZGF0YS5lZGdlcy5sZW5ndGggKyAiIGVkZ2VzID8iKTsKICAgICAgICAgIGlmIChyID09PSB0cnVlKSB7CiAgICAgICAgICAgIGRlbGV0ZVN1YkdyYXBoKGRhdGEsIGNhbGxiYWNrKTsKICAgICAgICAgIH0KICAgICAgfTsKCiAgICAgIG9wdGlvbnMubWFuaXB1bGF0aW9uLmFkZEVkZ2UgPSBmdW5jdGlvbihkYXRhLCBjYWxsYmFjaykgewogICAgICAgIGlmIChkYXRhLmZyb20gPT0gZGF0YS50bykgewogICAgICAgICAgdmFyIHIgPSBjb25maXJtKCJEbyB5b3Ugd2FudCB0byBjb25uZWN0IHRoZSBub2RlIHRvIGl0c2VsZj8iKTsKICAgICAgICAgIGlmIChyID09PSB0cnVlKSB7CiAgICAgICAgICAgIHNhdmVFZGdlKGRhdGEsIGNhbGxiYWNrLCAiYWRkRWRnZSIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHNhdmVFZGdlKGRhdGEsIGNhbGxiYWNrLCAiYWRkRWRnZSIpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgCiAgICAgIG9wdGlvbnMubWFuaXB1bGF0aW9uLmVkaXRFZGdlID0gZnVuY3Rpb24oZGF0YSwgY2FsbGJhY2spIHsKICAgICAgICBpZiAoZGF0YS5mcm9tID09IGRhdGEudG8pIHsKICAgICAgICAgIHZhciByID0gY29uZmlybSgiRG8geW91IHdhbnQgdG8gY29ubmVjdCB0aGUgbm9kZSB0byBpdHNlbGY/Iik7CiAgICAgICAgICBpZiAociA9PT0gdHJ1ZSkgewogICAgICAgICAgICBzYXZlRWRnZShkYXRhLCBjYWxsYmFjaywgImVkaXRFZGdlIik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgc2F2ZUVkZ2UoZGF0YSwgY2FsbGJhY2ssICJlZGl0RWRnZSIpOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KICAgIAogICAgLy8gY3JlYXRlIG5ldHdvcmsKICAgIGluc3RhbmNlLm5ldHdvcmsgPSBuZXcgdmlzLk5ldHdvcmsoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdyYXBoIitlbC5pZCksIGRhdGEsIG9wdGlvbnMpOwogICAgCiAgICAvLy8vLy8vLy8KICAgIC8vIHBvcHVwCiAgICAvLy8vLy8vLy8KICAgIAogICAgLy8gVGVtcG9yYXJ5IHZhcmlhYmxlcyB0byBob2xkIG1vdXNlIHgteSBwb3MucwogICAgdmFyIHRlbXBYID0gMAogICAgdmFyIHRlbXBZID0gMAoKICAgIC8vIE1haW4gZnVuY3Rpb24gdG8gcmV0cmlldmUgbW91c2UgeC15IHBvcy5zCiAgICBmdW5jdGlvbiBnZXRNb3VzZVhZKGUpIHsKICAgICAgdGVtcFggPSBlLmNsaWVudFgKICAgICAgdGVtcFkgPSBlLmNsaWVudFkKICAgICAgLy8gY2F0Y2ggcG9zc2libGUgbmVnYXRpdmUgdmFsdWVzIGluIE5TCiAgICAgIGlmICh0ZW1wWCA8IDApe3RlbXBYID0gMH0KICAgICAgaWYgKHRlbXBZIDwgMCl7dGVtcFkgPSAwfQogICAgfQoKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGdldE1vdXNlWFkpOwoKICAgLy90aGlzLmJvZHkuZW1pdHRlci5lbWl0KCJzaG93UG9wdXAiLHtpZDp0aGlzLnBvcHVwT2JqLmlkLHg6dC54KzMseTp0LnktNX0pKQoKICAgIC8vIHBvcHVwIGZvciB0aXRsZQogICAgdmFyIHBvcHVwU3RhdGUgPSBmYWxzZTsKICAgIHZhciBwb3B1cFRpbWVvdXQgPSBudWxsOwogICAgdmFyIHZpc3BvcHVwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICB2YXIgcG9wdXBTdHlsZSA9ICdwb3NpdGlvbjogZml4ZWQ7dmlzaWJpbGl0eTpoaWRkZW47cGFkZGluZzogNXB4O3doaXRlLXNwYWNlOiBub3dyYXA7Zm9udC1mYW1pbHk6IHZlcmRhbmE7Zm9udC1zaXplOjE0cHg7Zm9udC1jb2xvcjojMDAwMDAwO2JhY2tncm91bmQtY29sb3I6ICNmNWY0ZWQ7LW1vei1ib3JkZXItcmFkaXVzOiAzcHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOiAzcHg7Ym9yZGVyLXJhZGl1czogM3B4O2JvcmRlcjogMXB4IHNvbGlkICM4MDgwNzQ7Ym94LXNoYWRvdzogM3B4IDNweCAxMHB4IHJnYmEoMCwgMCwgMCwgMC4yKScKICAgIGlmKHgudG9vbHRpcFN0eWxlICE9PSB1bmRlZmluZWQpewogICAgICBwb3B1cFN0eWxlID0geC50b29sdGlwU3R5bGUKICAgIH0KICAgIHZhciBwb3B1cFN0YXkgPSAzMDA7CiAgICBpZih4LnRvb2x0aXBTdGF5ICE9PSB1bmRlZmluZWQpewogICAgICBwb3B1cFN0YXkgPSB4LnRvb2x0aXBTdGF5CiAgICB9CiAgICB2aXNwb3B1cC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgcG9wdXBTdHlsZSkKICAgIAogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdyYXBoIitlbC5pZCkuYXBwZW5kQ2hpbGQodmlzcG9wdXApOwogICAgCiAgICAvLyBhZGQgc29tZSBldmVudCBsaXN0ZW5lcnMgdG8gYXZvaWQgaXQgZGlzYXBwZWFyaW5nIHdoZW4gdGhlIG1vdXNlIGlmIG92ZXIgaXQuCiAgICB2aXNwb3B1cC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKHBvcHVwVGltZW91dCAhPT0gbnVsbCkgewogICAgICAgIGNsZWFyVGltZW91dChwb3B1cFRpbWVvdXQpOwogICAgICAgIHBvcHVwVGltZW91dCA9IG51bGw7CiAgICAgIH0KICAgIH0pOwogIAogICAgLy8gc2V0IHRoZSB0aW1lb3V0IHdoZW4gdGhlIG1vdXNlIGxlYXZlcyBpdC4KICAgIHZpc3BvcHVwLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JyxmdW5jdGlvbiAoKSB7CiAgICAgIGlmIChwb3B1cFRpbWVvdXQgPT09IG51bGwpIHsKICAgICAgICBteUhpZGVQb3B1cCgxMDApOwogICAgICB9CiAgICB9KTsKICAgIAogICAgLy8gdXNlIHRoZSBwb3B1cCBldmVudCB0byBzaG93CiAgICBpbnN0YW5jZS5uZXR3b3JrLm9uKCJzaG93UG9wdXAiLCBmdW5jdGlvbihwYXJhbXMpIHsKICAgICAgcG9wdXBTdGF0ZSA9IHRydWU7ICAKICAgICAgbXlTaG93UG9wdXAocGFyYW1zKTsKICAgIH0pCiAgCiAgICAvLyB1c2UgdGhlIGhpZGUgZXZlbnQgdG8gaGlkZSBpdAogICAgaW5zdGFuY2UubmV0d29yay5vbigiaGlkZVBvcHVwIiwgZnVuY3Rpb24ocGFyYW1zKSB7CiAgICAgIC8vIGF2b2lkIGRvdWJsZSBmaXJpbmcgb2YgdGhpcyBldmVudCwgYnVnIGluIDQuMi4wCiAgICAgIGlmIChwb3B1cFN0YXRlID09PSB0cnVlKSB7CiAgICAgICAgcG9wdXBTdGF0ZSA9IGZhbHNlOwogICAgICAgIG15SGlkZVBvcHVwKHBvcHVwU3RheSk7CiAgICAgIH0KICAgIH0pCiAgCiAgICAvLyBoaWRpbmcgdGhlIHBvcHVwIHRocm91Z2ggY3NzIGFuZCBhIHRpbWVvdXQKICAgIGZ1bmN0aW9uIG15SGlkZVBvcHVwKGRlbGF5KSB7CiAgICAgIHBvcHVwVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7dmlzcG9wdXAuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO30sIGRlbGF5KTsKICAgIH0KICAKICAgIC8vIHNob3dpbmcgdGhlIHBvcHVwCiAgICBmdW5jdGlvbiBteVNob3dQb3B1cChpZCkgewogICAgICAvLyBnZXQgdGhlIGRhdGEgZnJvbSB0aGUgdmlzLkRhdGFTZXQKICAgICAgCiAgICAgIHZhciBub2RlRGF0YSA9IG5vZGVzLmdldChbaWRdKTsKICAgICAgCiAgICAgIGlmKG5vZGVEYXRhWzBdICE9PSBudWxsICYmIG5vZGVEYXRhWzBdICE9PSB1bmRlZmluZWQpewogICAgICAgIAogICAgICAgIHZpc3BvcHVwLmlubmVySFRNTCA9IG5vZGVEYXRhWzBdLnRpdGxlOwogICAgICAgIC8qCiAgICAgICAgLy8gZ2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgbm9kZQogICAgICAgIHZhciBwb3NDYW52YXMgPSBpbnN0YW5jZS5uZXR3b3JrLmdldFBvc2l0aW9ucyhbaWRdKVtpZF07CiAgICAgICAgLy8gY29udmVydCBjb29yZGluYXRlcyB0byB0aGUgRE9NIHNwYWNlCiAgICAgICAgdmFyIHBvc0RPTSA9IGluc3RhbmNlLm5ldHdvcmsuY2FudmFzVG9ET00ocG9zQ2FudmFzKTsKICAgICAgCiAgICAgICAgdmFyIGhlaWdodCA9IHZpc3BvcHVwLmNsaWVudEhlaWdodDsKICAgICAgICB2YXIgd2lkdGggPSB2aXNwb3B1cC5jbGllbnRXaWR0aDsKICAgICAgICB2YXIgbWF4SGVpZ2h0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdyYXBoIitlbC5pZCkuY2xpZW50SGVpZ2h0OwogICAgICAgIHZhciBtYXhXaWR0aCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZWwuaWQpLmNsaWVudFdpZHRoOwogICAgICAgIHZhciBwYWRkaW5nID0gNTsKICAgICAgICAKICAgICAgICB2YXIgdG9wID0gcGFyYW1zLnkgLSBoZWlnaHQ7CiAgICAgICAgaWYgKHRvcCArIGhlaWdodCArIHBhZGRpbmcgPiBtYXhIZWlnaHQpIHsKICAgICAgICAgIHRvcCA9IG1heEhlaWdodCAtIGhlaWdodCAtIHBhZGRpbmc7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICh0b3AgPCBwYWRkaW5nKSB7CiAgICAgICAgICB0b3AgPSBwYWRkaW5nOwogICAgICAgIH0KCiAgICAgICAgdmFyIGxlZnQgPSBwYXJhbXMueDsKICAgICAgICBpZiAobGVmdCArIHdpZHRoICsgcGFkZGluZyA+IG1heFdpZHRoKSB7CiAgICAgICAgICBsZWZ0ID0gbWF4V2lkdGggLSB3aWR0aCAtIHBhZGRpbmc7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmIChsZWZ0IDwgcGFkZGluZykgewogICAgICAgICAgbGVmdCA9IHBhZGRpbmc7CiAgICAgICAgfSovCgogICAgICAgIC8vIHNob3cgYW5kIHBsYWNlIHRoZSB0b29sdGlwLgogICAgICAgIHZpc3BvcHVwLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7CiAgICAgICAgdmlzcG9wdXAuc3R5bGUudG9wID0gdGVtcFkgLSAyMCArICAicHgiOwogICAgICAgIHZpc3BvcHVwLnN0eWxlLmxlZnQgPSB0ZW1wWCArIDUgKyAicHgiOwogICAgICAgIAogICAgICB9IGVsc2UgewogICAgICAgICAvLyBzbyBpdCdzIHBlcmhhcHMgYSBlZGdlID8KICAgICAgICB2YXIgZWRnZURhdGEgPSBlZGdlcy5nZXQoW2lkXSk7CiAgICAgICAgaWYoZWRnZURhdGFbMF0gIT09IG51bGwgJiYgZWRnZURhdGFbMF0gIT09IHVuZGVmaW5lZCl7CiAgICAgICAgICB2aXNwb3B1cC5pbm5lckhUTUwgPSBlZGdlRGF0YVswXS50aXRsZTsKICAgICAgICAgIC8vIHNob3cgYW5kIHBsYWNlIHRoZSB0b29sdGlwLgogICAgICAgICAgdmlzcG9wdXAuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJzsKICAgICAgICAgIHZpc3BvcHVwLnN0eWxlLnRvcCA9IHRlbXBZIC0gMjAgKyAgInB4IjsKICAgICAgICAgIHZpc3BvcHVwLnN0eWxlLmxlZnQgPSB0ZW1wWCArIDUgKyAicHgiOwogICAgICAgIH0KICAgICAgfQogICAgfQogIAogICAgLy9zYXZlIGRhdGEgZm9yIHJlLXVzZSBhbmQgdXBkYXRlCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ3JhcGgiK2VsLmlkKS5jaGFydCA9IGluc3RhbmNlLm5ldHdvcms7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ3JhcGgiK2VsLmlkKS5vcHRpb25zID0gb3B0aW9uczsKCiAgICAvLyBhZGQgRXZlbnRzCiAgICAvLyBjb250cm9sIHRvIHB1dCB0aGlzIGV2ZW50IGR1ZSB0byBoaWdobGlnaHROZWFyZXN0CiAgICB2YXIgaXNfY2xpY2tfZXZlbnQgPSBmYWxzZTsKICAgIHZhciBpc19ob3Zlck5vZGVfZXZlbnQgPSBmYWxzZTsKICAgIHZhciBpc19ibHVyTm9kZV9ldmVudCA9IGZhbHNlOwogICAgaWYoeC5ldmVudHMgIT09IHVuZGVmaW5lZCl7CiAgICAgIGZvciAodmFyIGtleSBpbiB4LmV2ZW50cykgewogICAgICAgIGlmKGtleSA9PT0gImNsaWNrIil7CiAgICAgICAgICBpc19jbGlja19ldmVudCA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmKGtleSA9PT0gImhvdmVyTm9kZSIpewogICAgICAgICAgaXNfaG92ZXJOb2RlX2V2ZW50ID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYoa2V5ID09PSAiYmx1ck5vZGUiKXsKICAgICAgICAgIGlzX2JsdXJOb2RlX2V2ZW50ID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW5zdGFuY2UubmV0d29yay5vbihrZXksIHguZXZlbnRzW2tleV0pOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGlmKHguT25jZUV2ZW50cyAhPT0gdW5kZWZpbmVkKXsKICAgICAgZm9yICh2YXIga2V5IGluIHguT25jZUV2ZW50cykgewogICAgICAgICAgaW5zdGFuY2UubmV0d29yay5vbmNlKGtleSwgeC5PbmNlRXZlbnRzW2tleV0pOwogICAgICB9CiAgICB9CiAgICAKICAgIGlmKHguUmVzZXRFdmVudHMgIT09IHVuZGVmaW5lZCl7CiAgICAgIGZvciAodmFyIGtleSBpbiB4LlJlc2V0RXZlbnRzKSB7CiAgICAgICAgICBpbnN0YW5jZS5uZXR3b3JrLm9mZihrZXkpOwogICAgICB9CiAgICB9CiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioKICAgIC8vIFNlbGVjdGVkIEhpZ2hsaWdodAogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqCiAgCiAgICBmdW5jdGlvbiBzZWxlY3RlZEhpZ2hsaWdodCh2YWx1ZSkgewogICAgICAvLyBuZWVkIHRvIHVwZGF0ZSBub2RlcyBiZWZvcmUgPwogICAgICBpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkudXBkYXRlTm9kZXMpewogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS51cGRhdGVOb2RlcyA9IGZhbHNlOwogICAgICAgIGFsbE5vZGVzID0gbm9kZXNEYXRhc2V0LmdldCh7cmV0dXJuVHlwZToiT2JqZWN0In0pOwogICAgICAgIAogICAgICB9CiAgICAgIC8vIGdldCB2YXJpYWJsZQogICAgICB2YXIgc2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmJ5c2VsZWN0aW9uX3ZhcmlhYmxlOwogICAgICAvLyBuZWVkIHRvIG1ha2UgYW4gdXBkYXRlPwogICAgICB2YXIgdXBkYXRlID0gIShkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuc2VsZWN0QWN0aXZlID09PSBmYWxzZSAmIHZhbHVlID09PSAiIik7CgogICAgICBpZiAodmFsdWUgIT09ICIiKSB7CiAgICAgICAgdmFyIHVwZGF0ZUFycmF5ID0gW107CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLnNlbGVjdEFjdGl2ZSA9IHRydWU7CiAgICAgICAgCiAgICAgICAgLy8gbWFyayBhbGwgbm9kZXMgYXMgaGFyZCB0byByZWFkLgogICAgICAgIGZvciAodmFyIG5vZGVJZCBpbiBhbGxOb2RlcykgewogICAgICAgICAgdmFyIHZhbHVlX2luID0gZmFsc2U7CiAgICAgICAgICAvLyB1bmlxdWUgc2VsZWN0aW9uCiAgICAgICAgICBpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuYnlzZWxlY3Rpb25fbXVsdGlwbGUgPT09IGZhbHNlKXsKICAgICAgICAgICAgaWYoc2VsID09ICJsYWJlbCIpewogICAgICAgICAgICAgIHZhbHVlX2luID0gKChhbGxOb2Rlc1tub2RlSWRdWyJsYWJlbCJdICsgIiIpID09PSB2YWx1ZSkgfHwgKChhbGxOb2Rlc1tub2RlSWRdWyJoaWRkZW5MYWJlbCJdICsgIiIpID09PSB2YWx1ZSk7CiAgICAgICAgICAgIH1lbHNlIGlmKHNlbCA9PSAiY29sb3IiKXsKICAgICAgICAgICAgICB2YWx1ZV9pbiA9ICgoYWxsTm9kZXNbbm9kZUlkXVsiY29sb3IiXSArICIiKSA9PT0gdmFsdWUpIHx8ICgoYWxsTm9kZXNbbm9kZUlkXVsiaGlkZGVuQ29sb3IiXSArICIiKSA9PT0gdmFsdWUpOwogICAgICAgICAgICB9ZWxzZSB7CiAgICAgICAgICAgICAgdmFsdWVfaW4gPSAoYWxsTm9kZXNbbm9kZUlkXVtzZWxdICsgIiIpID09PSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfWVsc2V7IC8vIG11bHRpcGxlIHNlbGVjdGlvbgogICAgICAgICAgICBpZihzZWwgPT0gImxhYmVsIil7CiAgICAgICAgICAgICAgdmFyIGN1cnJlbnRfdmFsdWUgPSBhbGxOb2Rlc1tub2RlSWRdWyJsYWJlbCJdICsgIiI7CiAgICAgICAgICAgICAgdmFyIHZhbHVlX3NwbGl0ID0gY3VycmVudF92YWx1ZS5zcGxpdCgiLCIpLm1hcChGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCwgU3RyaW5nLnByb3RvdHlwZS50cmltKTsKICAgICAgICAgICAgICB2YXIgY3VycmVudF92YWx1ZTIgPSBhbGxOb2Rlc1tub2RlSWRdWyJoaWRkZW5MYWJlbCJdICsgIiI7CiAgICAgICAgICAgICAgdmFyIHZhbHVlX3NwbGl0MiA9IGN1cnJlbnRfdmFsdWUuc3BsaXQoIiwiKS5tYXAoRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwsIFN0cmluZy5wcm90b3R5cGUudHJpbSk7CiAgICAgICAgICAgICAgdmFsdWVfaW4gPSAodmFsdWVfc3BsaXQuaW5kZXhPZih2YWx1ZSkgIT09IC0xKSB8fCAodmFsdWVfc3BsaXQyLmluZGV4T2YodmFsdWUpICE9PSAtMSk7CiAgICAgICAgICAgIH1lbHNlIGlmKHNlbCA9PSAiY29sb3IiKXsKICAgICAgICAgICAgICB2YXIgY3VycmVudF92YWx1ZSA9IGFsbE5vZGVzW25vZGVJZF1bImNvbG9yIl0gKyAiIjsKICAgICAgICAgICAgICB2YXIgdmFsdWVfc3BsaXQgPSBjdXJyZW50X3ZhbHVlLnNwbGl0KCIsIikubWFwKEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsLCBTdHJpbmcucHJvdG90eXBlLnRyaW0pOwogICAgICAgICAgICAgIHZhciBjdXJyZW50X3ZhbHVlMiA9IGFsbE5vZGVzW25vZGVJZF1bImhpZGRlbkNvbG9yIl0gKyAiIjsKICAgICAgICAgICAgICB2YXIgdmFsdWVfc3BsaXQyID0gY3VycmVudF92YWx1ZS5zcGxpdCgiLCIpLm1hcChGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCwgU3RyaW5nLnByb3RvdHlwZS50cmltKTsKICAgICAgICAgICAgICB2YWx1ZV9pbiA9ICh2YWx1ZV9zcGxpdC5pbmRleE9mKHZhbHVlKSAhPT0gLTEpIHx8ICh2YWx1ZV9zcGxpdDIuaW5kZXhPZih2YWx1ZSkgIT09IC0xKTsKICAgICAgICAgICAgfWVsc2UgewogICAgICAgICAgICAgIHZhciBjdXJyZW50X3ZhbHVlID0gYWxsTm9kZXNbbm9kZUlkXVtzZWxdICsgIiI7CiAgICAgICAgICAgICAgdmFyIHZhbHVlX3NwbGl0ID0gY3VycmVudF92YWx1ZS5zcGxpdCgiLCIpLm1hcChGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCwgU3RyaW5nLnByb3RvdHlwZS50cmltKTsKICAgICAgICAgICAgICB2YWx1ZV9pbiA9IHZhbHVlX3NwbGl0LmluZGV4T2YodmFsdWUpICE9PSAtMTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYodmFsdWVfaW4gPT09IGZhbHNlKXsgLy8gbm90IGluIHNlbGVjdGlvbiwgc28gYXMgaGFyZCB0byByZWFkCiAgICAgICAgICAgIG5vZGVBc0hhcmRUb1JlYWQoYWxsTm9kZXNbbm9kZUlkXSwgaW5zdGFuY2UubmV0d29yay5ncm91cHMsIG9wdGlvbnMsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5ieXNlbGVjdGlvbkNvbG9yLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaGlnaGxpZ2h0Q29sb3IpOwogICAgICAgICAgfSBlbHNlIHsgLy8gaW4gc2VsZWN0aW9uLCBzbyByZXNldCBpZiBuZWVkZWQKICAgICAgICAgICAgcmVzZXRPbmVOb2RlKGFsbE5vZGVzW25vZGVJZF0sIGluc3RhbmNlLm5ldHdvcmsuZ3JvdXBzLCBvcHRpb25zKTsKICAgICAgICAgIH0KICAgICAgICAgIGFsbE5vZGVzW25vZGVJZF0ueCA9IHVuZGVmaW5lZDsKICAgICAgICAgIGFsbE5vZGVzW25vZGVJZF0ueSA9IHVuZGVmaW5lZDsKICAgICAgICAgIC8vIHVwZGF0ZSBkYXRhCiAgICAgICAgICBpZiAoYWxsTm9kZXMuaGFzT3duUHJvcGVydHkobm9kZUlkKSAmJiB1cGRhdGUpIHsKICAgICAgICAgICAgdXBkYXRlQXJyYXkucHVzaChhbGxOb2Rlc1tub2RlSWRdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYodXBkYXRlKXsKICAgICAgICAgIG5vZGVzRGF0YXNldC51cGRhdGUodXBkYXRlQXJyYXkpOwogICAgICAgIH0KICAgICAgfQogICAgICBlbHNlIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuc2VsZWN0QWN0aXZlID09PSB0cnVlKSB7CiAgICAgICAgLy9yZXNldCBub2RlcwogICAgICAgIHJlc2V0QWxsTm9kZXMoYWxsTm9kZXMsIHVwZGF0ZSwgbm9kZXNEYXRhc2V0LCBpbnN0YW5jZS5uZXR3b3JrLmdyb3Vwcywgb3B0aW9ucykKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuc2VsZWN0QWN0aXZlID0gZmFsc2UKICAgICAgfQogICAgfSAKICAKICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgLy9IaWdobGlnaHQKICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgdmFyIGlzX2hvdmVyZWQgPSBmYWxzZTsKICAgIHZhciBpc19jbGlja2VkID0gZmFsc2U7CiAgICAKICAgIC8vdW5pcXVlIGVsZW1lbnQgaW4gYXJyYXkKICAgIGZ1bmN0aW9uIHVuaXF1ZUFycmF5KGFyciwgZXhjbHVkZV9jbHVzdGVyKSB7CiAgICAgIHZhciBhID0gW107CiAgICAgIGZvciAodmFyIGk9MCwgbD1hcnIubGVuZ3RoOyBpPGw7IGkrKyl7CiAgICAgICAgaWYgKGEuaW5kZXhPZihhcnJbaV0pID09PSAtMSAmJiBhcnJbaV0gIT09ICcnKXsKICAgICAgICAgIGlmKGV4Y2x1ZGVfY2x1c3RlciA9PT0gZmFsc2UpewogICAgICAgICAgICBhLnB1c2goYXJyW2ldKTsKICAgICAgICAgIH0gZWxzZSBpZihpbnN0YW5jZS5uZXR3b3JrLmlzQ2x1c3RlcihhcnJbaV0pID09PSBmYWxzZSl7CiAgICAgICAgICAgIGEucHVzaChhcnJbaV0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gYTsKICAgIH0KCiAgICBmdW5jdGlvbiBuZWlnaGJvdXJob29kSGlnaGxpZ2h0KHBhcmFtcywgYWN0aW9uX3R5cGUsIGFsZ29yaXRobSkgewoKICAgICAgdmFyIHNlbGVjdE5vZGU7CiAgICAgIC8vIG5lZWQgdG8gdXBkYXRlIG5vZGVzIGJlZm9yZSA/CiAgICAgIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS51cGRhdGVOb2Rlcyl7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLnVwZGF0ZU5vZGVzID0gZmFsc2U7CiAgICAgICAgYWxsTm9kZXMgPSBub2Rlc0RhdGFzZXQuZ2V0KHtyZXR1cm5UeXBlOiJPYmplY3QifSk7CiAgICAgIH07CiAgICAgIAogICAgICAvLyB1cGRhdGUgCiAgICAgIHZhciB1cGRhdGUgPSAhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHRBY3RpdmUgPT09IGZhbHNlICYgcGFyYW1zLmxlbmd0aCA9PT0gMCkgfCAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLnNlbGVjdEFjdGl2ZSA9PT0gdHJ1ZSAmIHBhcmFtcy5sZW5ndGggPT09IDApOwoKICAgICAgaWYoIShhY3Rpb25fdHlwZSA9PSAiaG92ZXIiICYmIGlzX2NsaWNrZWQpKXsKICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCA+IDApIHsKICAgICAgICAKICAgICAgICAgIHZhciB1cGRhdGVBcnJheSA9IFtdOwogICAgICAgICAgaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmlkc2VsZWN0aW9uKXsKICAgICAgICAgICAgc2VsZWN0Tm9kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub2RlU2VsZWN0JytlbC5pZCk7CiAgICAgICAgICAgIGlmKHguaWRzZWxlY3Rpb24udmFsdWVzICE9PSB1bmRlZmluZWQpewogICAgICAgICAgICAgIGlmKGluZGV4T2YuY2FsbCh4Lmlkc2VsZWN0aW9uLnZhbHVlcywgcGFyYW1zWzBdLCB0cnVlKSA+IC0xKXsKICAgICAgICAgICAgICAgIHNlbGVjdE5vZGUudmFsdWUgPSBwYXJhbXNbMF07CiAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICBzZWxlY3ROb2RlLnZhbHVlID0gIiI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICBzZWxlY3ROb2RlLnZhbHVlID0gcGFyYW1zWzBdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh3aW5kb3cuU2hpbnkpewogICAgICAgICAgICAgIGNoYW5nZUlucHV0KCdzZWxlY3RlZCcsIHNlbGVjdE5vZGUudmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHRBY3RpdmUgPSB0cnVlOwogICAgICAgICAgdmFyIGksajsKICAgICAgICAgIHZhciBzZWxlY3RlZE5vZGUgPSBwYXJhbXNbMF07CiAgICAgICAgICB2YXIgZGVncmVlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5kZWdyZWU7CiAgICAgICAgICAKICAgICAgICAgIC8vIG1hcmsgYWxsIG5vZGVzIGFzIGhhcmQgdG8gcmVhZC4KICAgICAgICAgIGZvciAodmFyIG5vZGVJZCBpbiBhbGxOb2RlcykgewogICAgICAgICAgICBub2RlQXNIYXJkVG9SZWFkKGFsbE5vZGVzW25vZGVJZF0sIGluc3RhbmNlLm5ldHdvcmsuZ3JvdXBzLCBvcHRpb25zLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaGlnaGxpZ2h0Q29sb3IsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5ieXNlbGVjdGlvbkNvbG9yKTsKICAgICAgICAgICAgYWxsTm9kZXNbbm9kZUlkXS54ID0gdW5kZWZpbmVkOwogICAgICAgICAgICBhbGxOb2Rlc1tub2RlSWRdLnkgPSB1bmRlZmluZWQ7CiAgICAgICAgICB9CiAgICAgICAgICBpZihhbGdvcml0aG0gPT09ICJhbGwiKXsKICAgICAgICAgICAgaWYoZGVncmVlcyA+IDApewogICAgICAgICAgICAgIHZhciBjb25uZWN0ZWROb2RlcyA9IHVuaXF1ZUFycmF5KGluc3RhbmNlLm5ldHdvcmsuZ2V0Q29ubmVjdGVkTm9kZXMoc2VsZWN0ZWROb2RlKSwgdHJ1ZSk7CiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgIHZhciBjb25uZWN0ZWROb2RlcyA9IFtzZWxlY3RlZE5vZGVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgYWxsQ29ubmVjdGVkTm9kZXMgPSBbXTsKICAgICAgICAgICAgLy8gZ2V0IHRoZSBub2RlcyB0byBjb2xvcgogICAgICAgICAgICBpZihkZWdyZWVzID49IDIpewogICAgICAgICAgICAgIGZvciAoaSA9IDI7IGkgPD0gZGVncmVlczsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNfY29ubmVjdGVkTm9kZXMgPSBjb25uZWN0ZWROb2RlczsKICAgICAgICAgICAgICAgIHZhciBjdXJyZW50bGVuZ3RoID0gY29ubmVjdGVkTm9kZXMubGVuZ3RoOwogICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGN1cnJlbnRsZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICBjb25uZWN0ZWROb2RlcyA9IHVuaXF1ZUFycmF5KGNvbm5lY3RlZE5vZGVzLmNvbmNhdChpbnN0YW5jZS5uZXR3b3JrLmdldENvbm5lY3RlZE5vZGVzKGNvbm5lY3RlZE5vZGVzW2pdKSksIHRydWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGNvbm5lY3RlZE5vZGVzLmxlbmd0aCA9PT0gcHJldmlvdXNfY29ubmVjdGVkTm9kZXMubGVuZ3RoKSB7IGJyZWFrOyB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIG5vZGVzIHRvIGp1c3QgbGFiZWwKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNvbm5lY3RlZE5vZGVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICBhbGxDb25uZWN0ZWROb2RlcyA9IGFsbENvbm5lY3RlZE5vZGVzLmNvbmNhdChpbnN0YW5jZS5uZXR3b3JrLmdldENvbm5lY3RlZE5vZGVzKGNvbm5lY3RlZE5vZGVzW2pdKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGFsbENvbm5lY3RlZE5vZGVzID0gdW5pcXVlQXJyYXkoYWxsQ29ubmVjdGVkTm9kZXMsIHRydWUpOwoKICAgICAgICAgICAgLy8gYWxsIGhpZ2hlciBkZWdyZWUgbm9kZXMgZ2V0IGEgZGlmZmVyZW50IGNvbG9yIGFuZCB0aGVpciBsYWJlbCBiYWNrCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhbGxDb25uZWN0ZWROb2Rlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGlmIChhbGxOb2Rlc1thbGxDb25uZWN0ZWROb2Rlc1tpXV0uaGlkZGVuTGFiZWwgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgYWxsTm9kZXNbYWxsQ29ubmVjdGVkTm9kZXNbaV1dLmxhYmVsID0gYWxsTm9kZXNbYWxsQ29ubmVjdGVkTm9kZXNbaV1dLmhpZGRlbkxhYmVsOwogICAgICAgICAgICAgICAgYWxsTm9kZXNbYWxsQ29ubmVjdGVkTm9kZXNbaV1dLmhpZGRlbkxhYmVsID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBhbGwgaW4gZGVncmVlIG5vZGVzIGdldCB0aGVpciBvd24gY29sb3IgYW5kIHRoZWlyIGxhYmVsIGJhY2sKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbm5lY3RlZE5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgcmVzZXRPbmVOb2RlKGFsbE5vZGVzW2Nvbm5lY3RlZE5vZGVzW2ldXSwgaW5zdGFuY2UubmV0d29yay5ncm91cHMsIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIHRoZSBtYWluIG5vZGUgZ2V0cyBpdHMgb3duIGNvbG9yIGFuZCBpdHMgbGFiZWwgYmFjay4KICAgICAgICAgICAgcmVzZXRPbmVOb2RlKGFsbE5vZGVzW3NlbGVjdGVkTm9kZV0sIGluc3RhbmNlLm5ldHdvcmsuZ3JvdXBzLCBvcHRpb25zKTsKICAgICAgICAgICAgCiAgICAgICAgICB9IGVsc2UgaWYoYWxnb3JpdGhtID09PSAiaGllcmFyY2hpY2FsIil7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBmaXJzdCByZXNldEVkZ2VzCiAgICAgICAgICAgIHJlc2V0RWRnZXMoZWRnZXMsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHRDb2xvcik7CiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgZGVncmVlX2Zyb20gPSBkZWdyZWVzLmZyb207CiAgICAgICAgICAgIHZhciBkZWdyZWVfdG8gPSBkZWdyZWVzLnRvOwogICAgICAgICAgICBkZWdyZWVzID0gTWF0aC5tYXgoZGVncmVlX2Zyb20sIGRlZ3JlZV90byk7CiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgYWxsQ29ubmVjdGVkTm9kZXMgPSBbXTsKICAgICAgICAgICAgdmFyIGN1cnJlbnRDb25uZWN0ZWRGcm9tTm9kZXMgPSBbXTsKICAgICAgICAgICAgdmFyIGN1cnJlbnRDb25uZWN0ZWRUb05vZGVzID0gW107CiAgICAgICAgICAgIHZhciBjb25uZWN0ZWRGcm9tTm9kZXMgPSBbXTsKICAgICAgICAgICAgdmFyIGNvbm5lY3RlZFRvTm9kZXMgPSBbXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKGRlZ3JlZV9mcm9tID4gMCl7CiAgICAgICAgICAgICAgY29ubmVjdGVkRnJvbU5vZGVzID0gZWRnZXMuZ2V0KHsKICAgICAgICAgICAgICAgIGZpZWxkczogWydmcm9tJ10sCiAgICAgICAgICAgICAgICBmaWx0ZXI6IGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnRvID09IHNlbGVjdGVkTm9kZTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICByZXR1cm5UeXBlIDonQXJyYXknCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKGRlZ3JlZV90byA+IDApewogICAgICAgICAgICAgIGNvbm5lY3RlZFRvTm9kZXMgPSBlZGdlcy5nZXQoewogICAgICAgICAgICAgICAgZmllbGRzOiBbJ3RvJ10sCiAgICAgICAgICAgICAgICBmaWx0ZXI6IGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmZyb20gPT0gc2VsZWN0ZWROb2RlOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJldHVyblR5cGUgOidBcnJheScKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY29ubmVjdGVkRnJvbU5vZGVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICBhbGxDb25uZWN0ZWROb2RlcyA9IGFsbENvbm5lY3RlZE5vZGVzLmNvbmNhdChjb25uZWN0ZWRGcm9tTm9kZXNbal0uZnJvbSk7CiAgICAgICAgICAgICAgICBjdXJyZW50Q29ubmVjdGVkRnJvbU5vZGVzID0gY3VycmVudENvbm5lY3RlZEZyb21Ob2Rlcy5jb25jYXQoY29ubmVjdGVkRnJvbU5vZGVzW2pdLmZyb20pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY29ubmVjdGVkVG9Ob2Rlcy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgYWxsQ29ubmVjdGVkTm9kZXMgPSBhbGxDb25uZWN0ZWROb2Rlcy5jb25jYXQoY29ubmVjdGVkVG9Ob2Rlc1tqXS50byk7CiAgICAgICAgICAgICAgICBjdXJyZW50Q29ubmVjdGVkVG9Ob2RlcyA9IGN1cnJlbnRDb25uZWN0ZWRUb05vZGVzLmNvbmNhdChjb25uZWN0ZWRUb05vZGVzW2pdLnRvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYoZGVncmVlcyA+IDEpewogICAgICAgICAgICAgIGZvciAoaSA9IDI7IGkgPD0gZGVncmVlczsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZihjdXJyZW50Q29ubmVjdGVkRnJvbU5vZGVzLmxlbmd0aCA+IDAgJiYgZGVncmVlcyA8PSBkZWdyZWVfZnJvbSl7CiAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZEZyb21Ob2RlcyA9IGVkZ2VzLmdldCh7CiAgICAgICAgICAgICAgICAgICAgZmllbGRzOiBbJ2Zyb20nXSwKICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6IGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXhPZi5jYWxsKGN1cnJlbnRDb25uZWN0ZWRGcm9tTm9kZXMsIGl0ZW0udG8sIHRydWUpID4gLTE7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlIDonQXJyYXknCiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmKGN1cnJlbnRDb25uZWN0ZWRUb05vZGVzLmxlbmd0aCA+IDAgJiYgZGVncmVlcyA8PSBkZWdyZWVfdG8pewogICAgICAgICAgICAgICAgICBjb25uZWN0ZWRUb05vZGVzID0gZWRnZXMuZ2V0KHsKICAgICAgICAgICAgICAgICAgICBmaWVsZHM6IFsndG8nXSwKICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6IGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXhPZi5jYWxsKGN1cnJlbnRDb25uZWN0ZWRUb05vZGVzLCBpdGVtLmZyb20sIHRydWUpID4gLTE7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlIDonQXJyYXknCiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBjdXJyZW50Q29ubmVjdGVkRnJvbU5vZGVzID0gW107CiAgICAgICAgICAgICAgICBjdXJyZW50Q29ubmVjdGVkVG9Ob2RlcyA9IFtdOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY29ubmVjdGVkRnJvbU5vZGVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgYWxsQ29ubmVjdGVkTm9kZXMgPSBhbGxDb25uZWN0ZWROb2Rlcy5jb25jYXQoY29ubmVjdGVkRnJvbU5vZGVzW2pdLmZyb20pOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb25uZWN0ZWRGcm9tTm9kZXMgPSBjdXJyZW50Q29ubmVjdGVkRnJvbU5vZGVzLmNvbmNhdChjb25uZWN0ZWRGcm9tTm9kZXNbal0uZnJvbSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb25uZWN0ZWRUb05vZGVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgYWxsQ29ubmVjdGVkTm9kZXMgPSBhbGxDb25uZWN0ZWROb2Rlcy5jb25jYXQoY29ubmVjdGVkVG9Ob2Rlc1tqXS50byk7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbm5lY3RlZFRvTm9kZXMgPSBjdXJyZW50Q29ubmVjdGVkVG9Ob2Rlcy5jb25jYXQoY29ubmVjdGVkVG9Ob2Rlc1tqXS50byk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Q29ubmVjdGVkVG9Ob2Rlcy5sZW5ndGggPT09IDAgJiYgIGN1cnJlbnRDb25uZWN0ZWRGcm9tTm9kZXMubGVuZ3RoID09PSAwKSB7IGJyZWFrOyB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBhbGxDb25uZWN0ZWROb2RlcyA9IHVuaXF1ZUFycmF5KGFsbENvbm5lY3RlZE5vZGVzLCB0cnVlKS5jb25jYXQoW3NlbGVjdGVkTm9kZV0pOwoKICAgICAgICAgICAgdmFyIG5vZGVzV2l0aExhYmVsID0gW107CiAgICAgICAgICAgIGlmKGRlZ3JlZXMgPiAwKXsKICAgICAgICAgICAgICAvLyBub2RlcyB0byBqdXN0IGxhYmVsCiAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGN1cnJlbnRDb25uZWN0ZWRUb05vZGVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgIG5vZGVzV2l0aExhYmVsID0gbm9kZXNXaXRoTGFiZWwuY29uY2F0KGluc3RhbmNlLm5ldHdvcmsuZ2V0Q29ubmVjdGVkTm9kZXMoY3VycmVudENvbm5lY3RlZFRvTm9kZXNbal0pKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGN1cnJlbnRDb25uZWN0ZWRGcm9tTm9kZXMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgbm9kZXNXaXRoTGFiZWwgPSBub2Rlc1dpdGhMYWJlbC5jb25jYXQoaW5zdGFuY2UubmV0d29yay5nZXRDb25uZWN0ZWROb2RlcyhjdXJyZW50Q29ubmVjdGVkRnJvbU5vZGVzW2pdKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG5vZGVzV2l0aExhYmVsID0gdW5pcXVlQXJyYXkobm9kZXNXaXRoTGFiZWwsIHRydWUpOwogICAgICAgICAgICB9IGVsc2V7CiAgICAgICAgICAgICAgbm9kZXNXaXRoTGFiZWwgPSBjdXJyZW50Q29ubmVjdGVkVG9Ob2RlczsKICAgICAgICAgICAgICBub2Rlc1dpdGhMYWJlbCA9IG5vZGVzV2l0aExhYmVsLmNvbmNhdChjdXJyZW50Q29ubmVjdGVkRnJvbU5vZGVzKTsKICAgICAgICAgICAgICBub2Rlc1dpdGhMYWJlbCA9IHVuaXF1ZUFycmF5KG5vZGVzV2l0aExhYmVsLCB0cnVlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWxsIGhpZ2hlciBkZWdyZWUgbm9kZXMgZ2V0IGEgZGlmZmVyZW50IGNvbG9yIGFuZCB0aGVpciBsYWJlbCBiYWNrCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBub2Rlc1dpdGhMYWJlbC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGlmIChhbGxOb2Rlc1tub2Rlc1dpdGhMYWJlbFtpXV0uaGlkZGVuTGFiZWwgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgYWxsTm9kZXNbbm9kZXNXaXRoTGFiZWxbaV1dLmxhYmVsID0gYWxsTm9kZXNbbm9kZXNXaXRoTGFiZWxbaV1dLmhpZGRlbkxhYmVsOwogICAgICAgICAgICAgICAgYWxsTm9kZXNbbm9kZXNXaXRoTGFiZWxbaV1dLmhpZGRlbkxhYmVsID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAvLyBhbGwgaW4gZGVncmVlIG5vZGVzIGdldCB0aGVpciBvd24gY29sb3IgYW5kIHRoZWlyIGxhYmVsIGJhY2sKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFsbENvbm5lY3RlZE5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgcmVzZXRPbmVOb2RlKGFsbE5vZGVzW2FsbENvbm5lY3RlZE5vZGVzW2ldXSwgaW5zdGFuY2UubmV0d29yay5ncm91cHMsIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBzZXQgc29tIGVkZ2VzIGFzIGhhcmQgdG8gcmVhZAogICAgICAgICAgICB2YXIgZWRnZXNIYXJkVG9SZWFkID0gZWRnZXMuZ2V0KHsKICAgICAgICAgICAgICBmaWVsZHM6IFsnaWQnLCAnY29sb3InXSwKICAgICAgICAgICAgICBmaWx0ZXI6IGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKChpbmRleE9mLmNhbGwoYWxsQ29ubmVjdGVkTm9kZXMsIGl0ZW0uZnJvbSwgdHJ1ZSkgPT09IC0xKSAmJiAoaW5kZXhPZi5jYWxsKGFsbENvbm5lY3RlZE5vZGVzLCBpdGVtLnRvLCB0cnVlKSA+IC0xKSkgfHwgKChpbmRleE9mLmNhbGwoYWxsQ29ubmVjdGVkTm9kZXMsIGl0ZW0uZnJvbSwgdHJ1ZSkgPiAtMSkgJiYgKGluZGV4T2YuY2FsbChhbGxDb25uZWN0ZWROb2RlcywgaXRlbS50bywgdHJ1ZSkgPT09IC0xKSkgOwogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgcmV0dXJuVHlwZSA6J0FycmF5JwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGFsbCBpbiBkZWdyZWUgbm9kZXMgZ2V0IHRoZWlyIG93biBjb2xvciBhbmQgdGhlaXIgbGFiZWwgYmFjawogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZWRnZXNIYXJkVG9SZWFkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgZWRnZXNIYXJkVG9SZWFkW2ldLmNvbG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmhpZ2hsaWdodENvbG9yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBlZGdlcy51cGRhdGUoZWRnZXNIYXJkVG9SZWFkKTsKICAgICAgICAgICAgCiAgICAgICAgICB9CgogICAgICAgICAgaWYodXBkYXRlKXsKICAgICAgICAgICAgaWYoIShhY3Rpb25fdHlwZSA9PSAiaG92ZXIiKSl7CiAgICAgICAgICAgICAgIGlzX2NsaWNrZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIHRyYW5zZm9ybSB0aGUgb2JqZWN0IGludG8gYW4gYXJyYXkKICAgICAgICAgICAgdmFyIHVwZGF0ZUFycmF5ID0gW107CiAgICAgICAgICAgIGZvciAobm9kZUlkIGluIGFsbE5vZGVzKSB7CiAgICAgICAgICAgICAgaWYgKGFsbE5vZGVzLmhhc093blByb3BlcnR5KG5vZGVJZCkpIHsKICAgICAgICAgICAgICAgIHVwZGF0ZUFycmF5LnB1c2goYWxsTm9kZXNbbm9kZUlkXSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG5vZGVzRGF0YXNldC51cGRhdGUodXBkYXRlQXJyYXkpOwogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGlzX2NsaWNrZWQgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmhpZ2hsaWdodEFjdGl2ZSA9PT0gdHJ1ZSB8IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5zZWxlY3RBY3RpdmUgPT09IHRydWUpIHsKICAgICAgICAgIC8vIHJlc2V0IG5vZGVTZWxlY3QgbGlzdCBpZiBhY3RpdmVkCiAgICAgICAgICBpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaWRzZWxlY3Rpb24pewogICAgICAgICAgICByZXNldExpc3QoIm5vZGVTZWxlY3QiLCBlbC5pZCwgJ3NlbGVjdGVkJyk7CiAgICAgICAgICB9CiAgICAgICAgICAvL3Jlc2V0IG5vZGVzCiAgICAgICAgICByZXNldEFsbE5vZGVzKGFsbE5vZGVzLCB1cGRhdGUsIG5vZGVzRGF0YXNldCwgaW5zdGFuY2UubmV0d29yay5ncm91cHMsIG9wdGlvbnMpCiAgICAgICAgICBpZihhbGdvcml0aG0gPT09ICJoaWVyYXJjaGljYWwiKXsKICAgICAgICAgICAgLy8gcmVzZXRFZGdlcwogICAgICAgICAgICByZXNldEVkZ2VzKGVkZ2VzLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaGlnaGxpZ2h0Q29sb3IpOwogICAgICAgICAgfQogICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmhpZ2hsaWdodEFjdGl2ZSA9IGZhbHNlOwogICAgICAgICAgaXNfY2xpY2tlZCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyByZXNldCBzZWxlY3RlZEJ5IGxpc3QgaWYgYWN0aXZlZAogICAgICBpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuYnlzZWxlY3Rpb24pewogICAgICAgIHJlc2V0TGlzdCgic2VsZWN0ZWRCeSIsIGVsLmlkLCAnc2VsZWN0ZWRCeScpOwogICAgICB9CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIG9uQ2xpY2tJRFNlbGVjdGlvbihzZWxlY3RlZEl0ZW1zKSB7CiAgICAgIHZhciBzZWxlY3ROb2RlOwogICAgICBpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaWRzZWxlY3Rpb24pewogICAgICAgIGlmIChzZWxlY3RlZEl0ZW1zLm5vZGVzLmxlbmd0aCAhPT0gMCkgewogICAgICAgICAgc2VsZWN0Tm9kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub2RlU2VsZWN0JytlbC5pZCk7CiAgICAgICAgICBpZih4Lmlkc2VsZWN0aW9uLnZhbHVlcyAhPT0gdW5kZWZpbmVkKXsKICAgICAgICAgICAgaWYoaW5kZXhPZi5jYWxsKHguaWRzZWxlY3Rpb24udmFsdWVzLCBzZWxlY3RlZEl0ZW1zLm5vZGVzWzBdLCB0cnVlKSA+IC0xKXsKICAgICAgICAgICAgICBzZWxlY3ROb2RlLnZhbHVlID0gc2VsZWN0ZWRJdGVtcy5ub2RlczsKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgc2VsZWN0Tm9kZS52YWx1ZSA9ICIiOwogICAgICAgICAgICB9CiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgc2VsZWN0Tm9kZS52YWx1ZSA9IHNlbGVjdGVkSXRlbXMubm9kZXM7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAod2luZG93LlNoaW55KXsKICAgICAgICAgICAgY2hhbmdlSW5wdXQoJ3NlbGVjdGVkJywgc2VsZWN0Tm9kZS52YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfWVsc2V7CiAgICAgICAgICByZXNldExpc3QoIm5vZGVTZWxlY3QiLCBlbC5pZCwgJ3NlbGVjdGVkJyk7CiAgICAgICAgfSAKICAgICAgfQogICAgICBpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuYnlzZWxlY3Rpb24pewogICAgICAgIC8vIHJlc2V0IHNlbGVjdGVkQnkgbGlzdCBpZiBhY3RpdmVkCiAgICAgICAgaWYgKHNlbGVjdGVkSXRlbXMubm9kZXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICByZXNldExpc3QoInNlbGVjdGVkQnkiLCBlbC5pZCwgJ3NlbGVjdGVkQnknKTsKICAgICAgICAgIHNlbGVjdGVkSGlnaGxpZ2h0KCIiKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIAogICAgLy8gZ2V0IGEgY29weSBvZiBub2RlcyBmb3IgYWxsIGhpZ2hsaWdodCAvIHNlbGVjdGlvbiBwcm9jZXNzCiAgICBub2Rlc0RhdGFzZXQgPSBub2RlczsgCiAgICBpZigoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmJ5c2VsZWN0aW9uIHx8IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHQpICYmIHgubm9kZXMpewogICAgICBhbGxOb2RlcyA9IG5vZGVzRGF0YXNldC5nZXQoe3JldHVyblR5cGU6Ik9iamVjdCJ9KTsKICAgIH0KCiAgICAvLyBzaGFyZWQgY2xpY2sgZnVuY3Rpb24gKHNlbGVjdGVkTm9kZXMpCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ3JhcGgiK2VsLmlkKS5teWNsaWNrID0gZnVuY3Rpb24ocGFyYW1zKXsKICAgICAgaWYoaW5zdGFuY2UubmV0d29yay5pc0NsdXN0ZXIocGFyYW1zLm5vZGVzKSA9PT0gZmFsc2UpewogICAgICAgIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHQgJiYgeC5ub2Rlcyl7CiAgICAgICAgICBuZWlnaGJvdXJob29kSGlnaGxpZ2h0KHBhcmFtcy5ub2RlcywgImNsaWNrIiwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmhpZ2hsaWdodEFsZ29yaXRobSk7CiAgICAgICAgfWVsc2UgaWYoKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5pZHNlbGVjdGlvbiB8fCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuYnlzZWxlY3Rpb24pICYmIHgubm9kZXMpewogICAgICAgICAgb25DbGlja0lEU2VsZWN0aW9uKHBhcmFtcykKICAgICAgICB9IAogICAgICAgIGlmKGlzX2NsaWNrX2V2ZW50KXsKICAgICAgICAgIHguZXZlbnRzWyJjbGljayJdKHBhcmFtcyk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgCiAgICAvLyBTZXQgZXZlbnQgaW4gcmVsYXRpb24gd2l0aCBoaWdobGlnaHROZWFyZXN0ICAgICAgCiAgICBpbnN0YW5jZS5uZXR3b3JrLm9uKCJjbGljayIsIGZ1bmN0aW9uKHBhcmFtcyl7CiAgICAgIGlmKGluc3RhbmNlLm5ldHdvcmsuaXNDbHVzdGVyKHBhcmFtcy5ub2RlcykgPT09IGZhbHNlKXsKICAgICAgICBpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaGlnaGxpZ2h0ICYmIHgubm9kZXMpewogICAgICAgICAgbmVpZ2hib3VyaG9vZEhpZ2hsaWdodChwYXJhbXMubm9kZXMsICJjbGljayIsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5oaWdobGlnaHRBbGdvcml0aG0pOwogICAgICAgIH1lbHNlIGlmKChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaWRzZWxlY3Rpb24gfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmJ5c2VsZWN0aW9uKSAmJiB4Lm5vZGVzKXsKICAgICAgICAgIG9uQ2xpY2tJRFNlbGVjdGlvbihwYXJhbXMpCiAgICAgICAgfSAKICAgICAgICBpZihpc19jbGlja19ldmVudCl7CiAgICAgICAgICB4LmV2ZW50c1siY2xpY2siXShwYXJhbXMpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICAKICAgIGluc3RhbmNlLm5ldHdvcmsub24oImhvdmVyTm9kZSIsIGZ1bmN0aW9uKHBhcmFtcyl7CiAgICAgIGlmKGluc3RhbmNlLm5ldHdvcmsuaXNDbHVzdGVyKHBhcmFtcy5ub2RlcykgPT09IGZhbHNlKXsKICAgICAgICBpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaG92ZXJOZWFyZXN0ICYmIHgubm9kZXMpewogICAgICAgICAgbmVpZ2hib3VyaG9vZEhpZ2hsaWdodChbcGFyYW1zLm5vZGVdLCAiaG92ZXIiLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaGlnaGxpZ2h0QWxnb3JpdGhtKTsKICAgICAgICB9IAogICAgICAgIGlmKGlzX2hvdmVyTm9kZV9ldmVudCl7CiAgICAgICAgICB4LmV2ZW50c1siaG92ZXJOb2RlIl0ocGFyYW1zKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwoKICAgIGluc3RhbmNlLm5ldHdvcmsub24oImJsdXJOb2RlIiwgZnVuY3Rpb24ocGFyYW1zKXsKICAgICAgaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWwuaWQpLmhvdmVyTmVhcmVzdCAmJiB4Lm5vZGVzKXsKICAgICAgICBuZWlnaGJvdXJob29kSGlnaGxpZ2h0KFtdLCAiaG92ZXIiLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuaGlnaGxpZ2h0QWxnb3JpdGhtKTsKICAgICAgfSAgICAgIAogICAgICBpZihpc19ibHVyTm9kZV9ldmVudCl7CiAgICAgICAgeC5ldmVudHNbImJsdXJOb2RlIl0ocGFyYW1zKTsKICAgICAgfQogICAgfSk7CiAgICAKICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgLy9mb290ZXIKICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgaWYoeC5mb290ZXIgIT09IG51bGwpewogICAgICB2YXIgZGl2X2Zvb3RlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICBkaXZfZm9vdGVyLmlubmVySFRNTCA9IHguZm9vdGVyLnRleHQ7CiAgICAgIGRpdl9mb290ZXIuc2V0QXR0cmlidXRlKCdzdHlsZScsICB4LmZvb3Rlci5zdHlsZSk7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJncmFwaCIrZWwuaWQpLmFwcGVuZENoaWxkKGRpdl9mb290ZXIpOyAgCiAgICB9CiAgICAKICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgLy8gZXhwb3J0CiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioKICAgIGlmKHguZXhwb3J0ICE9PSB1bmRlZmluZWQpewogICAgICAKICAgICAgdmFyIGRvd25sb2FkZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIGRvd25sb2FkZGl2LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZmxvYXQ6cmlnaHQ7IHdpZHRoOjEwMCUnKTsKICAgICAgCiAgICAgIHZhciBkb3dubG9hZGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOwogICAgICBkb3dubG9hZGJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgeC5leHBvcnQuY3NzKTsKICAgICAgZG93bmxvYWRidXR0b24uaWQgPSAiZG93bmxvYWQiK2VsLmlkOwogICAgICBkb3dubG9hZGJ1dHRvbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh4LmV4cG9ydC5sYWJlbCkpOyAKICAgICAgZG93bmxvYWRkaXYuYXBwZW5kQ2hpbGQoZG93bmxvYWRidXR0b24pOwogICAgICAKICAgICAgdmFyIGhyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaHIiKTsKICAgICAgaHIuc2V0QXR0cmlidXRlKCdzdHlsZScsICdoZWlnaHQ6NXB4OyB2aXNpYmlsaXR5OmhpZGRlbjsgbWFyZ2luLWJvdHRvbTotMXB4OycpOwogICAgICBkb3dubG9hZGRpdi5hcHBlbmRDaGlsZChocik7ICAKICAgICAgCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtYWluZGl2IitlbC5pZCkuYXBwZW5kQ2hpbGQoZG93bmxvYWRkaXYpOwogICAgICAKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImRvd25sb2FkIitlbC5pZCkub25jbGljayA9IGZ1bmN0aW9uKCkgewoKICAgICAgLy8gaGVpZ2h0IGNvbnRyb2wgZm9yIGV4cG9ydAogICAgICB2YXIgYWRkSGVpZ2h0RXhwb3J0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdyYXBoIiArIGVsLmlkKS5vZmZzZXRIZWlnaHQgKyBpZExpc3Qub2Zmc2V0SGVpZ2h0ICsgYnlMaXN0Lm9mZnNldEhlaWdodCArIGRvd25sb2FkZGl2Lm9mZnNldEhlaWdodDsKICAgICAgaWYoeC5tYWluICE9PSBudWxsKXsKICAgICAgICBhZGRIZWlnaHRFeHBvcnQgPSBhZGRIZWlnaHRFeHBvcnQgKyBkaXZfdGl0bGUub2Zmc2V0SGVpZ2h0OwogICAgICB9CiAgICAgIGlmKHguc3VibWFpbiAhPT0gbnVsbCl7CiAgICAgICAgYWRkSGVpZ2h0RXhwb3J0ID0gYWRkSGVpZ2h0RXhwb3J0ICsgZGl2X3N1YnRpdGxlLm9mZnNldEhlaWdodDsKICAgICAgfQogICAgICBpZih4LmZvb3RlciAhPT0gbnVsbCl7CiAgICAgICAgYWRkSGVpZ2h0RXhwb3J0ID0gYWRkSGVpZ2h0RXhwb3J0ICsgZGl2X2Zvb3Rlci5vZmZzZXRIZWlnaHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWRkSGVpZ2h0RXhwb3J0ID0gYWRkSGVpZ2h0RXhwb3J0ICsgMTU7CiAgICAgIH0KCiAgICAgIGlmKHguZXhwb3J0LnR5cGUgIT09ICJwZGYiKXsKICAgICAgICBodG1sMmNhbnZhcyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCksIHsKICAgICAgICAgIGJhY2tncm91bmQ6IHguZXhwb3J0LmJhY2tncm91bmQsCiAgICAgICAgICBoZWlnaHQgOiBhZGRIZWlnaHRFeHBvcnQsCiAgICAgICAgICBvbnJlbmRlcmVkOiBmdW5jdGlvbihjYW52YXMpIHsKICAgICAgICAgICAgY2FudmFzLnRvQmxvYkhEKGZ1bmN0aW9uKGJsb2IpIHsKICAgICAgICAgICAgICBzYXZlQXMoYmxvYiwgeC5leHBvcnQubmFtZSk7CiAgICAgICAgICAgIH0sICJpbWFnZS8iK3guZXhwb3J0LnR5cGUpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIGh0bWwyY2FudmFzKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKSwgewogICAgICAgICAgYmFja2dyb3VuZDogeC5leHBvcnQuYmFja2dyb3VuZCwKICAgICAgICAgIGhlaWdodCA6IGFkZEhlaWdodEV4cG9ydCwKICAgICAgICAgIG9ucmVuZGVyZWQ6IGZ1bmN0aW9uKGNhbnZhcykgewogICAgICAgICAgICB2YXIgbXlJbWFnZSA9IGNhbnZhcy50b0RhdGFVUkwoImltYWdlL3BuZyIsIDEuMCk7CiAgICAgICAgICAgIC8vdmFyIGltZ1dpZHRoID0gKGNhbnZhcy53aWR0aCAqIDI1LjQpIC8gMjQ7CiAgICAgICAgICAgIC8vdmFyIGltZ0hlaWdodCA9IChjYW52YXMuaGVpZ2h0ICogMjUuNCkgLyAyNDsgCiAgICAgICAgICAgIHZhciB0YWJsZSA9IG5ldyBqc1BERignbCcsICdwdCcsIFtjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHRdKTsKICAgICAgICAgICAgdGFibGUuYWRkSW1hZ2UobXlJbWFnZSwgJ0pQRUcnLCAwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpOwogICAgICAgICAgICB0YWJsZS5zYXZlKHguZXhwb3J0Lm5hbWUpOwogICAgICAgICAgfSAKICAgICAgICB9KTsKICAgICAgfQoKICAgICAgfTsKICAgIH0KCiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioKICAgIC8vIGRhdGFNYW5pcHVsYXRpb24KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgZnVuY3Rpb24gY2xlYXJQb3BVcCgpIHsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NhdmVCdXR0b24nKS5vbmNsaWNrID0gbnVsbDsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbmNlbEJ1dHRvbicpLm9uY2xpY2sgPSBudWxsOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmV0d29yay1wb3BVcCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICB9CgogICAgZnVuY3Rpb24gc2F2ZU5vZGUoZGF0YSwgY2FsbGJhY2ssIGNtZCkgewogICAgICBkYXRhLmlkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vZGUtaWQnKS52YWx1ZTsKICAgICAgZGF0YS5sYWJlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub2RlLWxhYmVsJykudmFsdWU7CiAgICAgIGlmICh3aW5kb3cuU2hpbnkpewogICAgICAgIHZhciBvYmogPSB7Y21kOiBjbWQsIGlkOiBkYXRhLmlkLCBsYWJlbDogZGF0YS5sYWJlbH0KICAgICAgICBTaGlueS5vbklucHV0Q2hhbmdlKGVsLmlkICsgJ19ncmFwaENoYW5nZScsIG9iaik7CiAgICAgIH0KICAgICAgY2xlYXJQb3BVcCgpOwogICAgICBjYWxsYmFjayhkYXRhKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzYXZlRWRnZShkYXRhLCBjYWxsYmFjaywgY21kKSB7CiAgICAgIGNhbGxiYWNrKGRhdGEpOyAvL211c3QgYmUgZmlyc3QgY2FsbGVkIGZvciBlZ2RlIGlkICEKICAgICAgaWYgKHdpbmRvdy5TaGlueSl7CiAgICAgICAgdmFyIG9iaiA9IHtjbWQ6IGNtZCwgaWQ6IGRhdGEuaWQsIGZyb206IGRhdGEuZnJvbSwgdG86IGRhdGEudG99OwogICAgICAgIFNoaW55Lm9uSW5wdXRDaGFuZ2UoZWwuaWQgKyAnX2dyYXBoQ2hhbmdlJywgb2JqKTsKICAgICAgfQogICAgICAKICAgIH0KCiAgICBmdW5jdGlvbiBkZWxldGVTdWJHcmFwaChkYXRhLCBjYWxsYmFjaykgewogICAgICBpZiAod2luZG93LlNoaW55KXsKICAgICAgICB2YXIgb2JqID0ge2NtZDogImRlbGV0ZUVsZW1lbnRzIiwgbm9kZXM6IGRhdGEubm9kZXMsIGVkZ2VzOiBkYXRhLmVkZ2VzfQogICAgICAgIFNoaW55Lm9uSW5wdXRDaGFuZ2UoZWwuaWQgKyAnX2dyYXBoQ2hhbmdlJywgb2JqKTsKICAgICAgfQogICAgICBjYWxsYmFjayhkYXRhKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjYW5jZWxFZGl0KGNhbGxiYWNrKSB7CiAgICAgIGNsZWFyUG9wVXAoKTsKICAgICAgY2FsbGJhY2sobnVsbCk7CiAgICB9CiAgICAKICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgLy8gQ0xVU1RFUklORwogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBpZih4LmNsdXN0ZXJpbmdHcm91cCB8fCB4LmNsdXN0ZXJpbmdDb2xvciB8fCB4LmNsdXN0ZXJpbmdIdWJzaXplIHx8IHguY2x1c3RlcmluZ0Nvbm5lY3Rpb24pewogICAgICAKICAgICAgdmFyIGNsdXN0ZXJidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwogICAgICBjbHVzdGVyYnV0dG9uLmlkID0gImJhY2tidG4iK2VsLmlkOwogICAgICBjbHVzdGVyYnV0dG9uLnNldEF0dHJpYnV0ZSgndHlwZScsICdidXR0b24nKTsgIAogICAgICBjbHVzdGVyYnV0dG9uLnNldEF0dHJpYnV0ZSgndmFsdWUnLCAnUmVpbml0aWFsaXplIGNsdXN0ZXJpbmcnKTsgCiAgICAgIGNsdXN0ZXJidXR0b24uc2V0QXR0cmlidXRlKCdzdHlsZScsICdiYWNrZ3JvdW5kLWNvbG9yOiNGRkZGRkY7Ym9yZGVyOiBub25lJyk7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5hcHBlbmRDaGlsZChjbHVzdGVyYnV0dG9uKTsKICAgICAgCiAgICAgIGNsdXN0ZXJidXR0b24ub25jbGljayA9ICBmdW5jdGlvbigpewogICAgICAgIGluc3RhbmNlLm5ldHdvcmsuc2V0RGF0YShkYXRhKTsKICAgICAgICBpZih4LmNsdXN0ZXJpbmdDb2xvcil7CiAgICAgICAgICBjbHVzdGVyQnlDb2xvcigpOwogICAgICAgIH0KICAgICAgICBpZih4LmNsdXN0ZXJpbmdHcm91cCl7CiAgICAgICAgICBjbHVzdGVyQnlHcm91cCgpOwogICAgICAgIH0KICAgICAgICBpZih4LmNsdXN0ZXJpbmdIdWJzaXplKXsKICAgICAgICAgIGNsdXN0ZXJCeUh1YnNpemUoKTsKICAgICAgICB9CiAgICAgICAgaWYoeC5jbHVzdGVyaW5nQ29ubmVjdGlvbil7CiAgICAgICAgICBjbHVzdGVyQnlDb25uZWN0aW9uKCk7CiAgICAgICAgfQogICAgICAgIGluc3RhbmNlLm5ldHdvcmsuZml0KCk7CiAgICAgIH0KICAgIH0KICAgIAogICAgaWYoeC5jbHVzdGVyaW5nR3JvdXAgfHwgeC5jbHVzdGVyaW5nQ29sb3IgfHwgeC5jbHVzdGVyaW5nT3V0bGllcnMgfHwgeC5jbHVzdGVyaW5nSHVic2l6ZSB8fCB4LmNsdXN0ZXJpbmdDb25uZWN0aW9uKXsKICAgICAgLy8gaWYgd2UgY2xpY2sgb24gYSBub2RlLCB3ZSB3YW50IHRvIG9wZW4gaXQgdXAhCiAgICAgIGluc3RhbmNlLm5ldHdvcmsub24oImRvdWJsZUNsaWNrIiwgZnVuY3Rpb24gKHBhcmFtcykgewogICAgICAgIGlmIChwYXJhbXMubm9kZXMubGVuZ3RoID09IDEpIHsKICAgICAgICAgIGlmIChpbnN0YW5jZS5uZXR3b3JrLmlzQ2x1c3RlcihwYXJhbXMubm9kZXNbMF0pID09IHRydWUpIHsKICAgICAgICAgICAgaW5zdGFuY2UubmV0d29yay5vcGVuQ2x1c3RlcihwYXJhbXMubm9kZXNbMF0sIHtyZWxlYXNlRnVuY3Rpb24gOiBmdW5jdGlvbihjbHVzdGVyUG9zaXRpb24sIGNvbnRhaW5lZE5vZGVzUG9zaXRpb25zKSB7CiAgICAgICAgICAgICAgLy9jb25zb2xlLmluZm8oY2x1c3RlclBvc2l0aW9uKQogICAgICAgICAgICAgIC8vY29uc29sZS5pbmZvKGNvbnRhaW5lZE5vZGVzUG9zaXRpb25zKQogICAgICAgICAgICAgIC8vdmFyIG5ld1Bvc2l0aW9ucyA9IHt9OwogICAgICAgICAgICAgIC8vIGNsdXN0ZXJQb3NpdGlvbiA9IHt4OmNsdXN0ZXJYLCB5OmNsdXN0ZXJZfTsKICAgICAgICAgICAgICAvLyBjb250YWluZWROb2Rlc1Bvc2l0aW9ucyA9IHtub2RlSWQ6e3g6bm9kZVgseTpub2RlWX0sIG5vZGVJZDIuLi4ufQogICAgICAgICAgICAgIC8vbmV3UG9zaXRpb25zW25vZGVJZF0gPSB7eDpuZXdQb3NYLCB5Om5ld1Bvc1l9OwogICAgICAgICAgICAgIHJldHVybiBjb250YWluZWROb2Rlc1Bvc2l0aW9uczsKICAgICAgICAgICAgfX0pOwogICAgICAgICAgICBpbnN0YW5jZS5uZXR3b3JrLmZpdCgpCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgLy9jbHVzdGVyaW5nIENvbm5lY3Rpb24KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgaWYoeC5jbHVzdGVyaW5nQ29ubmVjdGlvbil7CiAgICAgIAogICAgICBmdW5jdGlvbiBjbHVzdGVyQnlDb25uZWN0aW9uKCkgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeC5jbHVzdGVyaW5nQ29ubmVjdGlvbi5ub2Rlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgaW5zdGFuY2UubmV0d29yay5jbHVzdGVyQnlDb25uZWN0aW9uKHguY2x1c3RlcmluZ0Nvbm5lY3Rpb24ubm9kZXNbaV0pCiAgICAgICAgfQogICAgICB9CiAgICAgIGNsdXN0ZXJCeUNvbm5lY3Rpb24oKTsKICAgIH0KICAgIAogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAvL2NsdXN0ZXJpbmcgaHVic2l6ZQogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBpZih4LmNsdXN0ZXJpbmdIdWJzaXplKXsKICAgICAgCiAgICAgIGZ1bmN0aW9uIGNsdXN0ZXJCeUh1YnNpemUoKSB7CiAgICAgICAgdmFyIGNsdXN0ZXJPcHRpb25zQnlEYXRhID0gewogICAgICAgICAgcHJvY2Vzc1Byb3BlcnRpZXM6IGZ1bmN0aW9uKGNsdXN0ZXJPcHRpb25zLCBjaGlsZE5vZGVzKSB7CiAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgLy90b3RhbE1hc3MgKz0gY2hpbGROb2Rlc1tpXS5tYXNzOwogICAgICAgICAgICAgICAgICAgICAgaWYoaSA9PT0gMCl7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vY2x1c3Rlck9wdGlvbnMuc2hhcGUgPSAgY2hpbGROb2Rlc1tpXS5zaGFwZTsKICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3Rlck9wdGlvbnMuY29sb3IgPSAgY2hpbGROb2Rlc1tpXS5jb2xvci5iYWNrZ3JvdW5kOwogICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYoY2hpbGROb2Rlc1tpXS5zaGFwZSAhPT0gY2x1c3Rlck9wdGlvbnMuc2hhcGUpewogICAgICAgICAgICAgICAgICAgICAgICAgIC8vY2x1c3Rlck9wdGlvbnMuc2hhcGUgPSAnZGF0YWJhc2UnOwogICAgICAgICAgICAgICAgICAgICAgICAvL30KICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2hpbGROb2Rlc1tpXS5jb2xvci5iYWNrZ3JvdW5kICE9PSBjbHVzdGVyT3B0aW9ucy5jb2xvcil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3Rlck9wdGlvbnMuY29sb3IgPSAnZ3JleSc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICBjbHVzdGVyT3B0aW9ucy5sYWJlbCA9ICJbIiArIGNoaWxkTm9kZXMubGVuZ3RoICsgIl0iOwogICAgICAgICAgICByZXR1cm4gY2x1c3Rlck9wdGlvbnM7CiAgICAgICAgICB9LAogICAgICAgICAgY2x1c3Rlck5vZGVQcm9wZXJ0aWVzOiB7Ym9yZGVyV2lkdGg6Mywgc2hhcGU6J2JveCcsIGZvbnQ6e3NpemU6MzB9fQogICAgICAgIH0KICAgICAgICBpZih4LmNsdXN0ZXJpbmdIdWJzaXplLnNpemUgPiAwKXsKICAgICAgICAgIGluc3RhbmNlLm5ldHdvcmsuY2x1c3RlckJ5SHVic2l6ZSh4LmNsdXN0ZXJpbmdIdWJzaXplLnNpemUsIGNsdXN0ZXJPcHRpb25zQnlEYXRhKTsKICAgICAgICB9ZWxzZXsKICAgICAgICAgIGluc3RhbmNlLm5ldHdvcmsuY2x1c3RlckJ5SHVic2l6ZSh1bmRlZmluZWQsIGNsdXN0ZXJPcHRpb25zQnlEYXRhKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGNsdXN0ZXJCeUh1YnNpemUoKTsKICAgIH0KICAgIAogICAgaWYoeC5jbHVzdGVyaW5nQ29sb3IpewogICAgICAKICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgLy9jbHVzdGVyaW5nIGNvbG9yCiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioKICAgIGZ1bmN0aW9uIGNsdXN0ZXJCeUNvbG9yKCkgewogICAgICAgIHZhciBjb2xvcnMgPSB4LmNsdXN0ZXJpbmdDb2xvci5jb2xvcnMKICAgICAgICB2YXIgY2x1c3Rlck9wdGlvbnNCeURhdGE7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciBjb2xvciA9IGNvbG9yc1tpXTsKICAgICAgICAgIGNsdXN0ZXJPcHRpb25zQnlEYXRhID0gewogICAgICAgICAgICAgIGpvaW5Db25kaXRpb246IGZ1bmN0aW9uIChjaGlsZE9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkT3B0aW9ucy5jb2xvci5iYWNrZ3JvdW5kID09IGNvbG9yOyAvLyB0aGUgY29sb3IgaXMgZnVsbHkgZGVmaW5lZCBpbiB0aGUgbm9kZS4KICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIHByb2Nlc3NQcm9wZXJ0aWVzOiBmdW5jdGlvbiAoY2x1c3Rlck9wdGlvbnMsIGNoaWxkTm9kZXMsIGNoaWxkRWRnZXMpIHsKICAgICAgICAgICAgICAgICAgdmFyIHRvdGFsTWFzcyA9IDA7CiAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgdG90YWxNYXNzICs9IGNoaWxkTm9kZXNbaV0ubWFzczsKICAgICAgICAgICAgICAgICAgICAgIGlmKHguY2x1c3RlcmluZ0NvbG9yLmZvcmNlID09PSBmYWxzZSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGkgPT09IDApewogICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJPcHRpb25zLnNoYXBlID0gIGNoaWxkTm9kZXNbaV0uc2hhcGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNoaWxkTm9kZXNbaV0uc2hhcGUgIT09IGNsdXN0ZXJPcHRpb25zLnNoYXBlKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJPcHRpb25zLnNoYXBlID0geC5jbHVzdGVyaW5nQ29sb3Iuc2hhcGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyT3B0aW9ucy5zaGFwZSA9IHguY2x1c3RlcmluZ0NvbG9yLnNoYXBlOwogICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBjbHVzdGVyT3B0aW9ucy52YWx1ZSA9IHRvdGFsTWFzczsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsdXN0ZXJPcHRpb25zOwogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgY2x1c3Rlck5vZGVQcm9wZXJ0aWVzOiB7aWQ6ICdjbHVzdGVyOicgKyBjb2xvciwgYm9yZGVyV2lkdGg6IDMsIGNvbG9yOmNvbG9yLCBsYWJlbDogeC5jbHVzdGVyaW5nQ29sb3IubGFiZWwgKyBjb2xvcn0KICAgICAgICAgIH0KICAgICAgICAgIGluc3RhbmNlLm5ldHdvcmsuY2x1c3RlcihjbHVzdGVyT3B0aW9uc0J5RGF0YSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBjbHVzdGVyQnlDb2xvcigpOwogICAgfQoKICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgLy9jbHVzdGVyaW5nIGdyb3VwcwogICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBpZih4LmNsdXN0ZXJpbmdHcm91cCl7CiAgICAgIAogICAgICBmdW5jdGlvbiBjbHVzdGVyQnlHcm91cCgpIHsKICAgICAgICB2YXIgZ3JvdXBzID0geC5jbHVzdGVyaW5nR3JvdXAuZ3JvdXBzOwogICAgICAgIHZhciBjbHVzdGVyT3B0aW9uc0J5RGF0YTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIGdyb3VwID0gZ3JvdXBzW2ldOwogICAgICAgICAgY2x1c3Rlck9wdGlvbnNCeURhdGEgPSB7CiAgICAgICAgICAgICAgam9pbkNvbmRpdGlvbjogZnVuY3Rpb24gKGNoaWxkT3B0aW9ucykgewogICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRPcHRpb25zLmdyb3VwID09IGdyb3VwOyAvLwogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgcHJvY2Vzc1Byb3BlcnRpZXM6IGZ1bmN0aW9uIChjbHVzdGVyT3B0aW9ucywgY2hpbGROb2RlcywgY2hpbGRFZGdlcykgewogICAgICAgICAgICAgICAgLy9jb25zb2xlLmluZm8oY2x1c3Rlck9wdGlvbnMpOwogICAgICAgICAgICAgICAgICB2YXIgdG90YWxNYXNzID0gMDsKICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICB0b3RhbE1hc3MgKz0gY2hpbGROb2Rlc1tpXS5tYXNzOwogICAgICAgICAgICAgICAgICAgICAgaWYoeC5jbHVzdGVyaW5nR3JvdXAuZm9yY2UgPT09IGZhbHNlKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoaSA9PT0gMCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3Rlck9wdGlvbnMuc2hhcGUgPSAgY2hpbGROb2Rlc1tpXS5zaGFwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyT3B0aW9ucy5jb2xvciA9ICBjaGlsZE5vZGVzW2ldLmNvbG9yLmJhY2tncm91bmQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNoaWxkTm9kZXNbaV0uc2hhcGUgIT09IGNsdXN0ZXJPcHRpb25zLnNoYXBlKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJPcHRpb25zLnNoYXBlID0geC5jbHVzdGVyaW5nR3JvdXAuc2hhcGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNoaWxkTm9kZXNbaV0uY29sb3IuYmFja2dyb3VuZCAhPT0gY2x1c3Rlck9wdGlvbnMuY29sb3IpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3Rlck9wdGlvbnMuY29sb3IgPSB4LmNsdXN0ZXJpbmdHcm91cC5jb2xvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJPcHRpb25zLnNoYXBlID0geC5jbHVzdGVyaW5nR3JvdXAuc2hhcGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJPcHRpb25zLmNvbG9yID0geC5jbHVzdGVyaW5nR3JvdXAuY29sb3I7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgY2x1c3Rlck9wdGlvbnMudmFsdWUgPSB0b3RhbE1hc3M7CiAgICAgICAgICAgICAgICAgIHJldHVybiBjbHVzdGVyT3B0aW9uczsKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIGNsdXN0ZXJOb2RlUHJvcGVydGllczoge2lkOiAnY2x1c3RlcjonICsgZ3JvdXAsIGJvcmRlcldpZHRoOiAzLCBsYWJlbDp4LmNsdXN0ZXJpbmdHcm91cC5sYWJlbCArIGdyb3VwfQogICAgICAgICAgfQogICAgICAgICAgaW5zdGFuY2UubmV0d29yay5jbHVzdGVyKGNsdXN0ZXJPcHRpb25zQnlEYXRhKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY2x1c3RlckJ5R3JvdXAoKTsKICAgIH0KICAKICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgLy9jbHVzdGVyaW5nIGJ5IHpvb20KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgaWYoeC5jbHVzdGVyaW5nT3V0bGllcnMpewogICAgICAKICAgICAgY2x1c3RlckZhY3RvciA9IHguY2x1c3RlcmluZ091dGxpZXJzLmNsdXN0ZXJGYWN0b3I7CiAgICAgIAogICAgICAvLyBzZXQgdGhlIGZpcnN0IGluaXRpYWwgem9vbSBsZXZlbAogICAgICBpbnN0YW5jZS5uZXR3b3JrLm9uKCdpbml0UmVkcmF3JywgZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKGxhc3RDbHVzdGVyWm9vbUxldmVsID09PSAwKSB7CiAgICAgICAgICBsYXN0Q2x1c3Rlclpvb21MZXZlbCA9IGluc3RhbmNlLm5ldHdvcmsuZ2V0U2NhbGUoKTsKICAgICAgICB9CiAgICAgIH0pOwoKICAgICAgLy8gd2UgdXNlIHRoZSB6b29tIGV2ZW50IGZvciBvdXIgY2x1c3RlcmluZwogICAgICBpbnN0YW5jZS5uZXR3b3JrLm9uKCd6b29tJywgZnVuY3Rpb24gKHBhcmFtcykgewogICAgICAgIGlmKGN0cmx3YWl0ID09PSAwKXsKICAgICAgICBpZiAocGFyYW1zLmRpcmVjdGlvbiA9PSAnLScpIHsKICAgICAgICAgIGlmIChwYXJhbXMuc2NhbGUgPCBsYXN0Q2x1c3Rlclpvb21MZXZlbCpjbHVzdGVyRmFjdG9yKSB7CiAgICAgICAgICAgIG1ha2VDbHVzdGVycyhwYXJhbXMuc2NhbGUpOwogICAgICAgICAgICBsYXN0Q2x1c3Rlclpvb21MZXZlbCA9IHBhcmFtcy5zY2FsZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBvcGVuQ2x1c3RlcnMocGFyYW1zLnNjYWxlKTsKICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KCiAgICAvLyBtYWtlIHRoZSBjbHVzdGVycwogICAgZnVuY3Rpb24gbWFrZUNsdXN0ZXJzKHNjYWxlKSB7CiAgICAgICAgY3RybHdhaXQgPSAxOwogICAgICAgIHZhciBjbHVzdGVyT3B0aW9uc0J5RGF0YSA9IHsKICAgICAgICAgICAgcHJvY2Vzc1Byb3BlcnRpZXM6IGZ1bmN0aW9uIChjbHVzdGVyT3B0aW9ucywgY2hpbGROb2RlcykgewogICAgICAgICAgICAgICAgY2x1c3RlckluZGV4ID0gY2x1c3RlckluZGV4ICsgMTsKICAgICAgICAgICAgICAgIHZhciBjaGlsZHJlbkNvdW50ID0gMDsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuQ291bnQgKz0gY2hpbGROb2Rlc1tpXS5jaGlsZHJlbkNvdW50IHx8IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbHVzdGVyT3B0aW9ucy5jaGlsZHJlbkNvdW50ID0gY2hpbGRyZW5Db3VudDsKICAgICAgICAgICAgICAgIGNsdXN0ZXJPcHRpb25zLmxhYmVsID0gIiMgIiArIGNoaWxkcmVuQ291bnQgKyAiIjsKICAgICAgICAgICAgICAgIGNsdXN0ZXJPcHRpb25zLmZvbnQgPSB7c2l6ZTogY2hpbGRyZW5Db3VudCo1KzMwfQogICAgICAgICAgICAgICAgY2x1c3Rlck9wdGlvbnMuaWQgPSAnY2x1c3RlcjonICsgY2x1c3RlckluZGV4OwogICAgICAgICAgICAgICAgY2x1c3RlcnMucHVzaCh7aWQ6J2NsdXN0ZXI6JyArIGNsdXN0ZXJJbmRleCwgc2NhbGU6c2NhbGV9KTsKICAgICAgICAgICAgICAgIHJldHVybiBjbHVzdGVyT3B0aW9uczsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY2x1c3Rlck5vZGVQcm9wZXJ0aWVzOiB7Ym9yZGVyV2lkdGg6IDMsIHNoYXBlOiAnZGF0YWJhc2UnLCBmb250OiB7c2l6ZTogMzB9fQogICAgICAgIH0KICAgICAgICBpbnN0YW5jZS5uZXR3b3JrLmNsdXN0ZXJPdXRsaWVycyhjbHVzdGVyT3B0aW9uc0J5RGF0YSk7CiAgICAgICAgaWYgKHguY2x1c3RlcmluZ091dGxpZXJzLnN0YWJpbGl6ZSkgewogICAgICAgICAgICBpbnN0YW5jZS5uZXR3b3JrLnN0YWJpbGl6ZSgpOwogICAgICAgIH07CiAgICAgICAgY3RybHdhaXQgPSAwOwogICAgfQoKICAgIC8vIG9wZW4gdGhlbSBiYWNrIHVwIQogICAgZnVuY3Rpb24gb3BlbkNsdXN0ZXJzKHNjYWxlKSB7CiAgICAgICAgY3RybHdhaXQgPSAxOwogICAgICAgIHZhciBuZXdDbHVzdGVycyA9IFtdOwogICAgICAgIHZhciBkZWNsdXN0ZXJlZCA9IGZhbHNlOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKGNsdXN0ZXJzW2ldLnNjYWxlIDwgc2NhbGUpIHsKICAgICAgICAgICAgICAgIGluc3RhbmNlLm5ldHdvcmsub3BlbkNsdXN0ZXIoY2x1c3RlcnNbaV0uaWQpOwogICAgICAgICAgICAgICAgbGFzdENsdXN0ZXJab29tTGV2ZWwgPSBzY2FsZTsKICAgICAgICAgICAgICAgIGRlY2x1c3RlcmVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG5ld0NsdXN0ZXJzLnB1c2goY2x1c3RlcnNbaV0pCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2x1c3RlcnMgPSBuZXdDbHVzdGVyczsKICAgICAgICBpZiAoeC5jbHVzdGVyaW5nT3V0bGllcnMuc3RhYmlsaXplKSB7CiAgICAgICAgICAgIGluc3RhbmNlLm5ldHdvcmsuc3RhYmlsaXplKCk7CiAgICAgICAgfTsKICAgICAgICBjdHJsd2FpdCA9IDA7CiAgICB9CiAgICAKICAgIC8vKioqKioqKioqKioqKioqKioqCiAgICAvLyBpbml0IHNlbGVjdGlvbgogICAgLy8qKioqKioqKioqKioqKioqKioKICAgIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKS5pZHNlbGVjdGlvbiAmJiB4Lm5vZGVzICYmIHguaWRzZWxlY3Rpb24uc2VsZWN0ZWQgIT09IHVuZGVmaW5lZCl7IAogICAgICBvbklkQ2hhbmdlKCcnKyB4Lmlkc2VsZWN0aW9uLnNlbGVjdGVkLCB0cnVlKTsKICAgIH0KICAgICAgCiAgICBpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbC5pZCkuYnlzZWxlY3Rpb24gJiYgeC5ub2RlcyAmJiB4LmJ5c2VsZWN0aW9uLnNlbGVjdGVkICE9PSB1bmRlZmluZWQpeyAKICAgICAgb25CeUNoYW5nZSh4LmJ5c2VsZWN0aW9uLnNlbGVjdGVkKTsKICAgICAgc2VsZWN0Tm9kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWxlY3RlZEJ5JytlbC5pZCk7CiAgICAgIHNlbGVjdE5vZGUudmFsdWUgPSB4LmJ5c2VsZWN0aW9uLnNlbGVjdGVkOwogICAgfQogICAgCiAgICAvLyB0cnkgdG8gZml4IGljb25zIGxvYWRpbmcgY3NzIGJ1Zy4uLgogICAgZnVuY3Rpb24gaWNvbnNSZWRyYXcoKSB7CiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICBpZihpbnN0YW5jZS5uZXR3b3JrKQogICAgICAgICAgaW5zdGFuY2UubmV0d29yay5yZWRyYXcoKTsKICAgICAgICBpZihpbnN0YW5jZS5sZWdlbmQpCiAgICAgICAgICBpbnN0YW5jZS5sZWdlbmQucmVkcmF3KCk7CiAgICAgIH0sIDIwMCk7CiAgICB9CiAgICBpZih4Lmljb25zUmVkcmF3ICE9PSB1bmRlZmluZWQpewogICAgICBpZih4Lmljb25zUmVkcmF3KXsKICAgICAgICBpbnN0YW5jZS5uZXR3b3JrLm9uY2UoInN0YWJpbGl6ZWQiLCBmdW5jdGlvbigpe2ljb25zUmVkcmF3KCk7fSkKICAgICAgfQogICAgfQogICAgCiAgICAvKmNvbnNvbGUuaW5mbygiY2xpZW50V2lkdGgiKTsKICAgIGNvbnNvbGUuaW5mbyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ3JhcGgiK2VsLmlkKS5jbGllbnRXaWR0aCk7CgogICAgY29uc29sZS5pbmZvKCJjbGllbnRIZWlnaHQiKTsKICAgIGNvbnNvbGUuaW5mbyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ3JhcGgiK2VsLmlkKS5jbGllbnRIZWlnaHQpOwoKICAgIGNvbnNvbGUuaW5mbyhpbnN0YW5jZS5uZXR3b3JrKTsKICAgIGNvbnNvbGUuaW5mbyhpbnN0YW5jZS5uZXR3b3JrLmdldFNjYWxlKCkpOyovCiAgfSwgCiAgCiAgcmVzaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCwgaW5zdGFuY2UpIHsKICAgICAgaWYoaW5zdGFuY2UubmV0d29yaykKICAgICAgICBpbnN0YW5jZS5uZXR3b3JrLmZpdCgpOwogICAgICBpZihpbnN0YW5jZS5sZWdlbmQpCiAgICAgICAgaW5zdGFuY2UubGVnZW5kLmZpdCgpOwogIH0KICAKfSk7Cg=="></script> </head> <body style="background-color:white;"> <div id="htmlwidget-e3b7469a0afb82813c59" class="sankeyNetwork html-widget" style="width:960px;height:500px;"> </div> <script type="application/json" data-for="htmlwidget-e3b7469a0afb82813c59">{"x":{"links":{"source":[0,1,2,3,4,0,1,2,3,4,0,1,2,3,4,0,1,2,3,4,0,1,2,3,4,0,1,2,3,4,0,1,2,3,4,0,1,2,3,4,13,13,13,13,13],"target":[5,5,5,5,5,6,6,6,6,6,7,7,7,7,7,8,8,8,8,8,9,9,9,9,9,10,10,10,10,10,11,11,11,11,11,12,12,12,12,12,0,1,2,3,4],"value":[210,96,84,205,146,466,1081,2100,2949,2598,408,1560,3240,3575,4282,261,978,2591,3357,5071,170,648,1775,1989,3589,69,286,1235,870,2606,17,186,789,616,2047,9,71,268,230,1212,1610,4906,12082,13791,21551]},"nodes":{"name":["Fair","Good","Very Good","Premium","Ideal","I1","SI2","SI1","VS2","VS1","VVS2","VVS1","IF","dia_tbl"],"group":["Fair","Good","Very Good","Premium","Ideal","I1","SI2","SI1","VS2","VS1","VVS2","VVS1","IF","dia_tbl"]},"options":{"NodeID":"name","NodeGroup":"name","LinkGroup":null,"colourScale":"d3.scaleOrdinal(d3.schemeCategory20);","fontSize":7,"fontFamily":null,"nodeWidth":15,"nodePadding":10,"units":"","margin":{"top":null,"right":null,"bottom":null,"left":null},"iterations":32,"sinksRight":true}},"evals":[],"jsHooks":[]}</script> <div id="htmlwidget-91ddc921034bc8c7d8a7" class="visNetwork html-widget" style="width:960px;height:500px;"> </div> <script type="application/json" data-for="htmlwidget-91ddc921034bc8c7d8a7">{"x":{"nodes":{"id":[0,1,2,3,4,5,6,7,8,9,10,11,12,13],"label":["Fair","Good","Very Good","Premium","Ideal","I1","SI2","SI1","VS2","VS1","VVS2","VVS1","IF","dia_tbl"],"value":[1610,4906,12082,13791,21551,741,9194,13065,12258,8171,5066,3655,1790,53940]},"edges":{"from":[0,1,2,3,4,0,1,2,3,4,0,1,2,3,4,0,1,2,3,4,0,1,2,3,4,0,1,2,3,4,0,1,2,3,4,0,1,2,3,4,13,13,13,13,13],"to":[5,5,5,5,5,6,6,6,6,6,7,7,7,7,7,8,8,8,8,8,9,9,9,9,9,10,10,10,10,10,11,11,11,11,11,12,12,12,12,12,0,1,2,3,4],"value":[210,96,84,205,146,466,1081,2100,2949,2598,408,1560,3240,3575,4282,261,978,2591,3357,5071,170,648,1775,1989,3589,69,286,1235,870,2606,17,186,789,616,2047,9,71,268,230,1212,1610,4906,12082,13791,21551]},"nodesToDataframe":true,"edgesToDataframe":true,"options":{"width":"100%","height":"100%","nodes":{"shape":"dot"},"manipulation":{"enabled":false}},"groups":null,"width":null,"height":null,"idselection":{"enabled":false},"byselection":{"enabled":false},"main":null,"submain":null,"footer":null},"evals":[],"jsHooks":[]}</script> </body> </html>