Skip to content

Instantly share code, notes, and snippets.

@timelyportfolio
Last active February 4, 2018 23:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save timelyportfolio/952886953bbfa2698cae0d1aadbdc341 to your computer and use it in GitHub Desktop.
Save timelyportfolio/952886953bbfa2698cae0d1aadbdc341 to your computer and use it in GitHub Desktop.
semiotic in R
license: mit

# devtools::install_bitbucket("timelyportfolio/remiotic")
library(remiotic)
library(magrittr)

XYFrame(
  data = iris,
  xAccessor = "Petal.Length",
  xExtent = c(0, max(iris$Petal.Length)),
  yAccessor = "Petal.Width",
  yExtent = c(0, max(iris$Petal.Width)),
  title = "Semiotic Using Frames API",
  margin = list(top = 60, right = 20, bottom = 40, left = 50)
) %>%
  rem_points() %>%
  rem_axes(orient = "bottom") %>%
  rem_axes(orient = "left")
This file has been truncated, but you can view the full file.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEFkZCBhIG1ldGhvZCB0byBkZWxlZ2F0b3IgdGhhdCwgd2hlbiBpbnZva2VkLCBjYWxscwogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbgogIC8vIHRoZSBkZWxlZ2F0ZWUsIGJ1dCB0aGVyZSB3YXMgb25lIG9uIGRlbGVnYXRvciBiZWZvcmUKICAvLyBkZWxlZ2F0ZU1ldGhvZCB3YXMgY2FsbGVkLCB0aGVuIHRoZSBvcmlnaW5hbCB2ZXJzaW9uCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gdmFyIGEgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ExJyk7IH0KICAvLyAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYTInKTsgfQogIC8vIH07CiAgLy8gdmFyIGIgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2IxJyk7IH0KICAvLyB9OwogIC8vIGRlbGVnYXRlTWV0aG9kKGEsIGIsICJtZXRob2QxIik7CiAgLy8gZGVsZWdhdGVNZXRob2QoYSwgYiwgIm1ldGhvZDIiKTsKICAvLyBhLm1ldGhvZDEoKTsKICAvLyBhLm1ldGhvZDIoKTsKICAvLwogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4KICBmdW5jdGlvbiBkZWxlZ2F0ZU1ldGhvZChkZWxlZ2F0b3IsIGRlbGVnYXRlZSwgbWV0aG9kTmFtZSkgewogICAgdmFyIGluaGVyaXRlZCA9IGRlbGVnYXRvclttZXRob2ROYW1lXTsKICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdGFyZ2V0ID0gZGVsZWdhdGVlOwogICAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGVlW21ldGhvZE5hbWVdOwoKICAgICAgLy8gVGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0IG9uIHRoZSBkZWxlZ2F0ZWUuIEluc3RlYWQsCiAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBvbiB0aGUgZGVsZWdhdG9yLCBpZiBpdCBleGlzdHMuCiAgICAgIGlmICghbWV0aG9kKSB7CiAgICAgICAgdGFyZ2V0ID0gZGVsZWdhdG9yOwogICAgICAgIG1ldGhvZCA9IGluaGVyaXRlZDsKICAgICAgfQoKICAgICAgaWYgKG1ldGhvZCkgewogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gSW1wbGVtZW50IGEgdmFndWUgZmFjc2ltaWxpZSBvZiBqUXVlcnkncyBkYXRhIG1ldGhvZAogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICByZXR1cm4gZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV07CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgewogICAgICBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXSA9IHZhbHVlOwogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGVsZW1lbnREYXRhOiAiICsKICAgICAgICBhcmd1bWVudHMubGVuZ3RoKTsKICAgIH0KICB9CgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleAogIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCAiXFwkJiIpOwogIH0KCiAgZnVuY3Rpb24gaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkgewogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOwogICAgcmV0dXJuIHJlLnRlc3QoZWwuY2xhc3NOYW1lKTsKICB9CgogIC8vIGVsZW1lbnRzIC0gYXJyYXkgKG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBvZiBIVE1MIGVsZW1lbnRzCiAgLy8gY2xhc3NOYW1lIC0gY2xhc3MgbmFtZSB0byB0ZXN0IGZvcgogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsKICAvLyAgIGlmIGZhbHNlLCBvbmx5IHJldHVybiBlbGVtZW50cyAqd2l0aG91dCogZ2l2ZW4gY2xhc3NOYW1lCiAgZnVuY3Rpb24gZmlsdGVyQnlDbGFzcyhlbGVtZW50cywgY2xhc3NOYW1lLCBpbmNsdWRlKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaGFzQ2xhc3MoZWxlbWVudHNbaV0sIGNsYXNzTmFtZSkgPT0gaW5jbHVkZSkKICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQoKICBmdW5jdGlvbiBvbihvYmosIGV2ZW50TmFtZSwgZnVuYykgewogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgZmFsc2UpOwogICAgfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpIHsKICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvZmYob2JqLCBldmVudE5hbWUsIGZ1bmMpIHsKICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7CiAgICBlbHNlIGlmIChvYmouZGV0YWNoRXZlbnQpIHsKICAgICAgb2JqLmRldGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aAogIC8vIHRoZSAicGFkZGluZyIgQ1NTIHByb3BlcnR5CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3BhZGRpbmcKICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7CiAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgIHZhbHVlID0gW3ZhbHVlXTsKICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMF0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzBdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzNdfTsKICAgIH0KICB9CgogIC8vIENvbnZlcnQgYW4gdW5wYWNrZWQgcGFkZGluZyBvYmplY3QgdG8gYSBDU1MgdmFsdWUKICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgewogICAgcmV0dXJuIHBhZGRpbmdPYmoudG9wICsgInB4ICIgKyBwYWRkaW5nT2JqLnJpZ2h0ICsgInB4ICIgKyBwYWRkaW5nT2JqLmJvdHRvbSArICJweCAiICsgcGFkZGluZ09iai5sZWZ0ICsgInB4IjsKICB9CgogIC8vIE1ha2VzIGEgbnVtYmVyIHN1aXRhYmxlIGZvciBDU1MKICBmdW5jdGlvbiBweCh4KSB7CiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIHggKyAicHgiOwogICAgZWxzZQogICAgICByZXR1cm4geDsKICB9CgogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuCiAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIgbnVsbCwgb3IgYW4gb2JqZWN0IHdpdGggZmlsbCwgcGFkZGluZywKICAvLyBkZWZhdWx0V2lkdGgsIGRlZmF1bHRIZWlnaHQgZmllbGRzLgogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgewogICAgdmFyIHNpemluZ0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vaHRtbHdpZGdldC1zaXppbmcnXSIpOwogICAgaWYgKCFzaXppbmdFbCkKICAgICAgcmV0dXJuIG51bGw7CiAgICB2YXIgc3AgPSBKU09OLnBhcnNlKHNpemluZ0VsLnRleHRDb250ZW50IHx8IHNpemluZ0VsLnRleHQgfHwgInt9Iik7CiAgICBpZiAodmlld2VyTW9kZSkgewogICAgICByZXR1cm4gc3Audmlld2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHNwLmJyb3dzZXI7CiAgICB9CiAgfQoKICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLgogIC8vICAgRWFjaCBlbGVtZW50IG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdGhhdCB5aWVsZHMgYQogIC8vICAgZnVuY3Rpb24uIE9yLCBjYW4gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICJjb2RlIiBhbmQgImRhdGEiCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nCiAgLy8gICBvZiBKUyB0aGF0J3MgYW4gZXhwciB0aGF0IHlpZWxkcyBhIGZ1bmN0aW9uLCBhbmQgImRhdGEiIHNob3VsZCBiZQogIC8vICAgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBhZGRlZCBhcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHdoZW4gdGhhdAogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLgogIC8vIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgInRoaXMiIGZvciBlYWNoIGZ1bmN0aW9uCiAgLy8gICBleGVjdXRpb24uCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlCiAgLy8gICBzYW1lIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zLikKICBmdW5jdGlvbiBldmFsQW5kUnVuKHRhc2tzLCB0YXJnZXQsIGFyZ3MpIHsKICAgIGlmICh0YXNrcykgewogICAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgdmFyIHRoZXNlQXJncyA9IGFyZ3M7CiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHRoZXNlQXJncyA9IHRoZXNlQXJncy5jb25jYXQoW3Rhc2suZGF0YV0pOwogICAgICAgICAgdGFzayA9IHRhc2suY29kZTsKICAgICAgICB9CiAgICAgICAgdmFyIHRhc2tGdW5jID0gZXZhbCgiKCIgKyB0YXNrICsgIikiKTsKICAgICAgICBpZiAodHlwZW9mKHRhc2tGdW5jKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOwogICAgICAgIH0KICAgICAgICB0YXNrRnVuYy5hcHBseSh0YXJnZXQsIHRoZXNlQXJncyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdFNpemluZyhlbCkgewogICAgdmFyIHNpemluZyA9IHNpemluZ1BvbGljeShlbCk7CiAgICBpZiAoIXNpemluZykKICAgICAgcmV0dXJuOwoKICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsKICAgIGlmICghY2VsKQogICAgICByZXR1cm47CgogICAgaWYgKHR5cGVvZihzaXppbmcucGFkZGluZykgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luID0gIjAiOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOwogICAgfQoKICAgIGlmIChzaXppbmcuZmlsbCkgewogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIGlmIChjZWwpIHsKICAgICAgICBjZWwuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgIHZhciBwYWQgPSB1bnBhY2tQYWRkaW5nKHNpemluZy5wYWRkaW5nKTsKICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLnJpZ2h0ID0gcGFkLnJpZ2h0ICsgInB4IjsKICAgICAgICBjZWwuc3R5bGUuYm90dG9tID0gcGFkLmJvdHRvbSArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7CiAgICAgICAgZWwuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwKICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY2VsLm9mZnNldEhlaWdodDsgfQogICAgICB9OwoKICAgIH0gZWxzZSB7CiAgICAgIGVsLnN0eWxlLndpZHRoID0gcHgoc2l6aW5nLndpZHRoKTsKICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LAogICAgICAgIGdldEhlaWdodDogZnVuY3Rpb24oKSB7IHJldHVybiBlbC5vZmZzZXRIZWlnaHQ7IH0KICAgICAgfTsKICAgIH0KICB9CgogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzCiAgdmFyIGRlZmF1bHRzID0gewogICAgZmluZDogZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7CiAgICB9LAogICAgcmVuZGVyRXJyb3I6IGZ1bmN0aW9uKGVsLCBlcnIpIHsKICAgICAgdmFyICRlbCA9ICQoZWwpOwoKICAgICAgdGhpcy5jbGVhckVycm9yKGVsKTsKCiAgICAgIC8vIEFkZCBhbGwgdGhlc2UgZXJyb3IgY2xhc3NlcywgYXMgU2hpbnkgZG9lcwogICAgICB2YXIgZXJyQ2xhc3MgPSAic2hpbnktb3V0cHV0LWVycm9yIjsKICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7CiAgICAgICAgLy8gdXNlIHRoZSBjbGFzc2VzIG9mIHRoZSBlcnJvciBjb25kaXRpb24gYXMgQ1NTIGNsYXNzIG5hbWVzCiAgICAgICAgZXJyQ2xhc3MgPSBlcnJDbGFzcyArICIgIiArICQubWFwKGFzQXJyYXkoZXJyLnR5cGUpLCBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOwogICAgICAgIH0pLmpvaW4oIiAiKTsKICAgICAgfQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7CgogICAgICAvLyBJcyBlbCBpbmxpbmUgb3IgYmxvY2s/IElmIGlubGluZSBvciBpbmxpbmUtYmxvY2ssIGp1c3QgZGlzcGxheTpub25lIGl0CiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLgogICAgICB2YXIgZGlzcGxheSA9ICRlbC5jc3MoImRpc3BsYXkiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgZGlzcGxheSk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICAkZWwuaGlkZSgpOwogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsKICAgICAgICAgIHZhciBlcnJvclNwYW4gPSAkKCI8c3Bhbj4iKS5hZGRDbGFzcyhlcnJDbGFzcyk7CiAgICAgICAgICBlcnJvclNwYW4udGV4dChlcnIubWVzc2FnZSk7CiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIikgewogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlCiAgICAgICAgLy8gZWwsIGFuZCBwb3NpdGlvbiB0aGUgZXJyb3IgdG8gYmUgb24gdG9wIG9mIHRoZSBlbC4KICAgICAgICAvLyBNYXJrIGl0IHdpdGggYSB1bmlxdWUgSUQgYW5kIENTUyBjbGFzcyBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGxhdGVyLgogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSAiIikgewogICAgICAgICAgdmFyIGVycm9yRGl2ID0gJCgiPGRpdj4iKS5hZGRDbGFzcyhlcnJDbGFzcykuY3NzKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpCiAgICAgICAgICAgIC8vIHNldHRpbmcgd2lkdGggY2FuIHB1c2ggb3V0IHRoZSBwYWdlIHNpemUsIGZvcmNpbmcgb3RoZXJ3aXNlCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3IKICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgdG8gc2hyaW5rOyBzbyB1c2UgbWF4LXdpZHRoIGluc3RlYWQKICAgICAgICAgICAgLmNzcygibWF4V2lkdGgiLCBlbC5vZmZzZXRXaWR0aCkKICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgIGVycm9yRGl2LnRleHQoZXJyLm1lc3NhZ2UpOwogICAgICAgICAgJGVsLmFmdGVyKGVycm9yRGl2KTsKCiAgICAgICAgICAvLyBSZWFsbHkgZHVtYiB3YXkgdG8ga2VlcCB0aGUgc2l6ZS9wb3NpdGlvbiBvZiB0aGUgZXJyb3IgaW4gc3luYyB3aXRoCiAgICAgICAgICAvLyB0aGUgcGFyZW50IGVsZW1lbnQgYXMgdGhlIHdpbmRvdyBpcyByZXNpemVkIG9yIHdoYXRldmVyLgogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghZXJyb3JEaXZbMF0ucGFyZW50RWxlbWVudCkgewogICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50SWQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvckRpdgogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgICAuY3NzKCJsZWZ0IiwgZWwub2Zmc2V0TGVmdCkKICAgICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICB9LCA1MDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGNsZWFyRXJyb3I6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIHZhciAkZWwgPSAkKGVsKTsKICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgbnVsbCk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICBpZiAoZGlzcGxheSkKICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsKICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOwogICAgICB9IGVsc2UgaWYgKGRpc3BsYXkgPT09ICJibG9jayIpewogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOwogICAgICAgICQoZWwubmV4dFNpYmxpbmcpLmZpbHRlcigiLmh0bWx3aWRnZXRzLWVycm9yIikucmVtb3ZlKCk7CiAgICAgIH0KICAgIH0sCiAgICBzaXppbmc6IHt9CiAgfTsKCiAgLy8gQ2FsbGVkIGJ5IHdpZGdldCBiaW5kaW5ncyB0byByZWdpc3RlciBhIG5ldyB0eXBlIG9mIHdpZGdldC4gVGhlIGRlZmluaXRpb24KICAvLyBvYmplY3QgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlCiAgLy8gICB1c2VkIGJ5IGRlZmF1bHQgYXMgdGhlIENTUyBjbGFzc25hbWUgdG8gbG9vayBmb3IuCiAgLy8gLSBpbml0aWFsaXplIChvcHRpb25hbCkgLSBBIGZ1bmN0aW9uKGVsKSB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uY2UgcGVyCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkCiAgLy8gICB2YWx1ZSB0byByZW5kZXJWYWx1ZS4KICAvLyAtIHJlbmRlclZhbHVlIChyZXF1aXJlZCkgLSBBIGZ1bmN0aW9uKGVsLCBkYXRhLCBpbml0VmFsdWUpIHRoYXQgd2lsbCBiZQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXIKICAvLyAgIGVsZW1lbnQ7IFNoaW55IGFwcHMgd2lsbCBjYXVzZSB0aGlzIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBwZXIKICAvLyAgIGVsZW1lbnQsIGFzIHRoZSBkYXRhIGNoYW5nZXMuCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsKICAgIGlmICghZGVmaW5pdGlvbi5uYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIG5hbWUiKTsKICAgIH0KICAgIGlmICghZGVmaW5pdGlvbi50eXBlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHR5cGUiKTsKICAgIH0KICAgIC8vIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgb3V0cHV0IHdpZGdldHMKICAgIGlmIChkZWZpbml0aW9uLnR5cGUgIT09ICJvdXRwdXQiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsKICAgIH0KICAgIC8vIFRPRE86IFZlcmlmeSB0aGF0IC5uYW1lIGlzIGEgdmFsaWQgQ1NTIGNsYXNzbmFtZQoKICAgIC8vIFN1cHBvcnQgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb25zLiBPbGQtc3R5bGUgY2xhc3MtYm91bmQKICAgIC8vIGRlZmluaXRpb25zIGhhdmUgb25lIHdpZGdldCAib2JqZWN0IiBwZXIgd2lkZ2V0IHBlciB0eXBlL2NsYXNzIG9mCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cwogICAgLy8gdGFrZSBlbCBhbmQgaW5zdGFuY2UgYXJndW1lbnRzLCBiZWNhdXNlIHRoZSB3aWRnZXQgb2JqZWN0IGNhbid0CiAgICAvLyBzdG9yZSB0aGVtLiBOZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0CiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0CiAgICAvLyBwcm92aWRlIHJlbmRlclZhbHVlIG9yIHJlc2l6ZSBtZXRob2RzIGF0IGFsbCwganVzdCB0aGUgc2luZ2xlIG1ldGhvZAogICAgLy8gICBmYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4KICAgIC8vIFRoaXMgZW5hYmxlcyBhIGZhciBtb3JlIG5hdHVyYWwgcHJvZ3JhbW1pbmcgc3R5bGUgZm9yIHRoZSB3aWRnZXQKICAgIC8vIGF1dGhvciwgd2hvIGNhbiBzdG9yZSBwZXItaW5zdGFuY2Ugc3RhdGUgdXNpbmcgZWl0aGVyIE9PLXN0eWxlCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzCiAgICAvLyBpcyBpbiBjb250cmFzdCB0byB3aGF0IGNhbiBvbmx5IGJlIGNhbGxlZCBDLXN0eWxlIHBzZXVkby1PTyB3aGljaCBpcwogICAgLy8gd2hhdCB3ZSByZXF1aXJlZCBiZWZvcmUpLgogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgewogICAgICBkZWZpbml0aW9uID0gY3JlYXRlTGVnYWN5RGVmaW5pdGlvbkFkYXB0ZXIoZGVmaW5pdGlvbik7CiAgICB9CgogICAgaWYgKCFkZWZpbml0aW9uLnJlbmRlclZhbHVlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHJlbmRlclZhbHVlIGZ1bmN0aW9uIik7CiAgICB9CgogICAgLy8gRm9yIHN0YXRpYyByZW5kZXJpbmcgKG5vbi1TaGlueSksIHVzZSBhIHNpbXBsZSB3aWRnZXQgcmVnaXN0cmF0aW9uCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28KICAgIC8vIGNvbnRhaW4gc3RhdGljIHdpZGdldHMuCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLgogICAgdmFyIHN0YXRpY0JpbmRpbmcgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKICAgIG92ZXJyaWRlTWV0aG9kKHN0YXRpY0JpbmRpbmcsICJmaW5kIiwgZnVuY3Rpb24oc3VwZXJmdW5jKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgewogICAgICAgIHZhciByZXN1bHRzID0gc3VwZXJmdW5jKHNjb3BlKTsKICAgICAgICAvLyBGaWx0ZXIgb3V0IFNoaW55IG91dHB1dHMsIHdlIG9ubHkgd2FudCB0aGUgc3RhdGljIGtpbmQKICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOwogICAgICB9OwogICAgfSk7CiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOwoKICAgIGlmIChzaGlueU1vZGUpIHsKICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4KICAgICAgLy8gVGhlIGRlZmluaXRpb24gaXRzZWxmIHdpbGwgbm90IGJlIHRoZSBvdXRwdXQgYmluZGluZywgaW5zdGVhZAogICAgICAvLyB3ZSB3aWxsIG1ha2UgYW4gb3V0cHV0IGJpbmRpbmcgb2JqZWN0IHRoYXQgZGVsZWdhdGVzIHRvIHRoZQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kCiAgICAgIC8vIG5hbWUgKHJlbmRlclZhbHVlKSBmb3IgaHRtbHdpZGdldHMgZGVmaW5pdGlvbiBhbmQgU2hpbnkgYmluZGluZ3MKICAgICAgLy8gYnV0IHRoZXkgYWN0dWFsbHkgaGF2ZSBxdWl0ZSBkaWZmZXJlbnQgc2VtYW50aWNzICh0aGUgU2hpbnkKICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0CiAgICAgIC8vIHN0cmlwcyBvZmYgYmVmb3JlIGNhbGxpbmcgaHRtbHdpZGdldHMgcmVuZGVyVmFsdWUpLiBXZSBjYW4ndAogICAgICAvLyBqdXN0IGlnbm9yZSB0aGUgZGlmZmVyZW5jZSBiZWNhdXNlIGluIHNvbWUgd2lkZ2V0cyBpdCdzIGhlbHBmdWwKICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZgogICAgICAvLyB3ZSdyZSBub3QgZGVsZWdhdGluZywgdGhlbiB0aGF0IGNhbGwgd2lsbCBnbyB0byB0aGUgU2hpbnkKICAgICAgLy8gdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBodG1sd2lkZ2V0cyB2ZXJzaW9uLgoKICAgICAgLy8gTWVyZ2UgZGVmYXVsdHMgd2l0aCBkZWZpbml0aW9uLCB3aXRob3V0IG11dGF0aW5nIGVpdGhlci4KICAgICAgdmFyIGJpbmRpbmdEZWYgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKCiAgICAgIC8vIFRoaXMgb2JqZWN0IHdpbGwgYmUgb3VyIGFjdHVhbCBTaGlueSBiaW5kaW5nLgogICAgICB2YXIgc2hpbnlCaW5kaW5nID0gbmV3IFNoaW55Lk91dHB1dEJpbmRpbmcoKTsKCiAgICAgIC8vIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgd2UnbGwgd2FudCB0byBzaW1wbHkgdXNlIHRoZSBiaW5kaW5nRGVmJ3MKICAgICAgLy8gdmVyc2lvbiBvZiBtZXRob2RzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0bwogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwKICAgICAgLy8gbWV0aG9kcyBpbiB0aGUgZnV0dXJlLCBhbmQgd2Ugd2FudCB0aGVtIHRvIGJlIG92ZXJyaWRlYWJsZSBieQogICAgICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcgZGVmaW5pdGlvbnMsIHRoZW4gd2UnbGwgbmVlZCB0byBhZGQgdGhlbSB0byB0aGlzCiAgICAgIC8vIGxpc3QuCiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImdldElkIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgIm9uVmFsdWVDaGFuZ2UiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgInJlbmRlckVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImNsZWFyRXJyb3IiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7CgogICAgICAvLyBUaGUgZmluZCwgcmVuZGVyVmFsdWUsIGFuZCByZXNpemUgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIGJlY2F1c2Ugd2UKICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4KCiAgICAgIHNoaW55QmluZGluZy5maW5kID0gZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7CgogICAgICAgIC8vIE9ubHkgcmV0dXJuIGVsZW1lbnRzIHRoYXQgYXJlIFNoaW55IG91dHB1dHMsIG5vdCBzdGF0aWMgb25lcwogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7CgogICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3aGF0ZXZlciBjYXVzZWQgU2hpbnkgdG8gdGhpbmsgdGhlcmUgbWlnaHQgYmUKICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuCiAgICAgICAgLy8gU2luY2UgdGhlcmUgbWlnaHQgYmUgbG90cyBvZiBkaWZmZXJlbnQgaHRtbHdpZGdldHMgYmluZGluZ3MsIHdlCiAgICAgICAgLy8gc2NoZWR1bGUgZXhlY3V0aW9uIGZvciBsYXRlci0tbm8gbmVlZCB0byBzdGF0aWNSZW5kZXIgbXVsdGlwbGUKICAgICAgICAvLyB0aW1lcy4KICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggIT09IGR5bmFtaWNSZXN1bHRzLmxlbmd0aCkKICAgICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyKCk7CgogICAgICAgIHJldHVybiBkeW5hbWljUmVzdWx0czsKICAgICAgfTsKCiAgICAgIC8vIFdyYXAgcmVuZGVyVmFsdWUgdG8gaGFuZGxlIGluaXRpYWxpemF0aW9uLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGlzbid0CiAgICAgIC8vIHN1cHBvcnRlZCBuYXRpdmVseSBieSBTaGlueSBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCgogICAgICBzaGlueUJpbmRpbmcucmVuZGVyVmFsdWUgPSBmdW5jdGlvbihlbCwgZGF0YSkgewogICAgICAgIFNoaW55LnJlbmRlckRlcGVuZGVuY2llcyhkYXRhLmRlcHMpOwogICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgZGF0YS5ldmFscyAmJiBpIDwgZGF0YS5ldmFscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1tpXSk7CiAgICAgICAgfQogICAgICAgIGlmICghYmluZGluZ0RlZi5yZW5kZXJPbk51bGxWYWx1ZSkgewogICAgICAgICAgaWYgKGRhdGEueCA9PT0gbnVsbCkgewogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7CiAgICAgICAgICBpbml0U2l6aW5nKGVsKTsKCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7CiAgICAgICAgICBpZiAoYmluZGluZ0RlZi5pbml0aWFsaXplKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBiaW5kaW5nRGVmLmluaXRpYWxpemUoZWwsIGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICAgIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiLCByZXN1bHQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBiaW5kaW5nRGVmLnJlbmRlclZhbHVlKGVsLCBkYXRhLngsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7CiAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7CiAgICAgIH07CgogICAgICAvLyBPbmx5IG92ZXJyaWRlIHJlc2l6ZSBpZiBiaW5kaW5nRGVmIGltcGxlbWVudHMgaXQKICAgICAgaWYgKGJpbmRpbmdEZWYucmVzaXplKSB7CiAgICAgICAgc2hpbnlCaW5kaW5nLnJlc2l6ZSA9IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgICAvLyBTaGlueSBjYW4gY2FsbCByZXNpemUgYmVmb3JlIGluaXRpYWxpemUvcmVuZGVyVmFsdWUgaGF2ZSBiZWVuCiAgICAgICAgICAvLyBjYWxsZWQsIHdoaWNoIGRvZXNuJ3QgbWFrZSBzZW5zZSBmb3Igd2lkZ2V0cy4KICAgICAgICAgIGlmIChlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIikpIHsKICAgICAgICAgICAgYmluZGluZ0RlZi5yZXNpemUoZWwsIHdpZHRoLCBoZWlnaHQsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgU2hpbnkub3V0cHV0QmluZGluZ3MucmVnaXN0ZXIoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLm5hbWUpOwogICAgfQogIH07CgogIHZhciBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogIGZ1bmN0aW9uIHNjaGVkdWxlU3RhdGljUmVuZGVyKCkgewogICAgaWYgKCFzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQpIHsKICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsKICAgICAgfSwgMSk7CiAgICB9CiAgfQoKICAvLyBSZW5kZXIgc3RhdGljIHdpZGdldHMgYWZ0ZXIgdGhlIGRvY3VtZW50IGZpbmlzaGVzIGxvYWRpbmcKICAvLyBTdGF0aWNhbGx5IHJlbmRlciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgb2YgdGhpcyB3aWRnZXQncyBjbGFzcwogIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIgPSBmdW5jdGlvbigpIHsKICAgIHZhciBiaW5kaW5ncyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgZm9yRWFjaChiaW5kaW5ncywgZnVuY3Rpb24oYmluZGluZykgewogICAgICB2YXIgbWF0Y2hlcyA9IGJpbmRpbmcuZmluZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOwogICAgICBmb3JFYWNoKG1hdGNoZXMsIGZ1bmN0aW9uKGVsKSB7CiAgICAgICAgdmFyIHNpemVPYmogPSBpbml0U2l6aW5nKGVsLCBiaW5kaW5nKTsKCiAgICAgICAgaWYgKGhhc0NsYXNzKGVsLCAiaHRtbC13aWRnZXQtc3RhdGljLWJvdW5kIikpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lICsgIiBodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiOwoKICAgICAgICB2YXIgaW5pdFJlc3VsdDsKICAgICAgICBpZiAoYmluZGluZy5pbml0aWFsaXplKSB7CiAgICAgICAgICBpbml0UmVzdWx0ID0gYmluZGluZy5pbml0aWFsaXplKGVsLAogICAgICAgICAgICBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0CiAgICAgICAgICApOwogICAgICAgICAgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIsIGluaXRSZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGJpbmRpbmcucmVzaXplKSB7CiAgICAgICAgICB2YXIgbGFzdFNpemUgPSB7fTsKICAgICAgICAgIHZhciByZXNpemVIYW5kbGVyID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICB2YXIgc2l6ZSA9IHsKICAgICAgICAgICAgICB3OiBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgICAgaDogc2l6ZU9iaiA/IHNpemVPYmouZ2V0SGVpZ2h0KCkgOiBlbC5vZmZzZXRIZWlnaHQKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHNpemUudyA9PT0gMCAmJiBzaXplLmggPT09IDApCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBpZiAoc2l6ZS53ID09PSBsYXN0U2l6ZS53ICYmIHNpemUuaCA9PT0gbGFzdFNpemUuaCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGxhc3RTaXplID0gc2l6ZTsKICAgICAgICAgICAgYmluZGluZy5yZXNpemUoZWwsIHNpemUudywgc2l6ZS5oLCBpbml0UmVzdWx0KTsKICAgICAgICAgIH07CgogICAgICAgICAgb24od2luZG93LCAicmVzaXplIiwgcmVzaXplSGFuZGxlcik7CgogICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIGNhc2VzIHdoZXJlIHdlJ3JlIHJ1bm5pbmcgaW4gYSBTaGlueQogICAgICAgICAgLy8gYXBwLCBidXQgdGhlIHdpZGdldCBpdHNlbGYgaXMgbm90IGEgU2hpbnkgb3V0cHV0LCBidXQKICAgICAgICAgIC8vIHJhdGhlciBhIHNpbXBsZSBzdGF0aWMgd2lkZ2V0LiBPbmUgZXhhbXBsZSBvZiB0aGlzIGlzCiAgICAgICAgICAvLyBhbiBybWFya2Rvd24gZG9jdW1lbnQgdGhhdCBoYXMgcnVudGltZTpzaGlueSBhbmQgd2lkZ2V0CiAgICAgICAgICAvLyB0aGF0IGlzbid0IGluIGEgcmVuZGVyIGZ1bmN0aW9uLiBTaGlueSBvbmx5IGtub3dzIHRvCiAgICAgICAgICAvLyBjYWxsIHJlc2l6ZSBoYW5kbGVycyBmb3IgU2hpbnkgb3V0cHV0cywgbm90IGZvciBzdGF0aWMKICAgICAgICAgIC8vIHdpZGdldHMsIHNvIHdlIGRvIGl0IG91cnNlbHZlcy4KICAgICAgICAgIGlmICh3aW5kb3cualF1ZXJ5KSB7CiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKAogICAgICAgICAgICAgICJzaG93bi5odG1sd2lkZ2V0cyBzaG93bi5icy50YWIuaHRtbHdpZGdldHMgc2hvd24uYnMuY29sbGFwc2UuaHRtbHdpZGdldHMiLAogICAgICAgICAgICAgIHJlc2l6ZUhhbmRsZXIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgd2luZG93LmpRdWVyeShkb2N1bWVudCkub24oCiAgICAgICAgICAgICAgImhpZGRlbi5odG1sd2lkZ2V0cyBoaWRkZW4uYnMudGFiLmh0bWx3aWRnZXRzIGhpZGRlbi5icy5jb2xsYXBzZS5odG1sd2lkZ2V0cyIsCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcgogICAgICAgICAgICApOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgc3BlY2lmaWMgY2FzZSBvZiBpb3NsaWRlcywgd2hpY2gKICAgICAgICAgIC8vIGZsaXBzIHNsaWRlcyBiZXR3ZWVuIGRpc3BsYXk6bm9uZSBhbmQgZGlzcGxheTpibG9jay4KICAgICAgICAgIC8vIElkZWFsbHkgd2Ugd291bGQgbm90IGhhdmUgdG8gaGF2ZSBpb3NsaWRlLXNwZWNpZmljIGNvZGUKICAgICAgICAgIC8vIGhlcmUsIGJ1dCByYXRoZXIgaGF2ZSBpb3NsaWRlcyByYWlzZSBhIGdlbmVyaWMgZXZlbnQsCiAgICAgICAgICAvLyBidXQgdGhlIHJtYXJrZG93biBwYWNrYWdlIGp1c3Qgd2VudCB0byBDUkFOIHNvIHRoZQogICAgICAgICAgLy8gd2luZG93IHRvIGdldHRpbmcgdGhhdCBmaXhlZCBtYXkgYmUgbG9uZy4KICAgICAgICAgIGlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikgewogICAgICAgICAgICAvLyBJdCdzIE9LIHRvIGxpbWl0IHRoaXMgdG8gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIKICAgICAgICAgICAgLy8gYnJvd3NlcnMgYmVjYXVzZSBpb3NsaWRlcyBpdHNlbGYgb25seSBzdXBwb3J0cwogICAgICAgICAgICAvLyBzdWNoIGJyb3dzZXJzLgogICAgICAgICAgICBvbihkb2N1bWVudCwgInNsaWRlZW50ZXIiLCByZXNpemVIYW5kbGVyKTsKICAgICAgICAgICAgb24oZG9jdW1lbnQsICJzbGlkZWxlYXZlIiwgcmVzaXplSGFuZGxlcik7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgc2NyaXB0RGF0YSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtkYXRhLWZvcj0nIiArIGVsLmlkICsgIiddW3R5cGU9J2FwcGxpY2F0aW9uL2pzb24nXSIpOwogICAgICAgIGlmIChzY3JpcHREYXRhKSB7CiAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2Uoc2NyaXB0RGF0YS50ZXh0Q29udGVudCB8fCBzY3JpcHREYXRhLnRleHQpOwogICAgICAgICAgLy8gUmVzb2x2ZSBzdHJpbmdzIG1hcmtlZCBhcyBqYXZhc2NyaXB0IGxpdGVyYWxzIHRvIG9iamVjdHMKICAgICAgICAgIGlmICghKGRhdGEuZXZhbHMgaW5zdGFuY2VvZiBBcnJheSkpIGRhdGEuZXZhbHMgPSBbZGF0YS5ldmFsc107CiAgICAgICAgICBmb3IgKHZhciBrID0gMDsgZGF0YS5ldmFscyAmJiBrIDwgZGF0YS5ldmFscy5sZW5ndGg7IGsrKykgewogICAgICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIoZGF0YS54LCBkYXRhLmV2YWxzW2tdKTsKICAgICAgICAgIH0KICAgICAgICAgIGJpbmRpbmcucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgaW5pdFJlc3VsdCk7CiAgICAgICAgICBldmFsQW5kUnVuKGRhdGEuanNIb29rcy5yZW5kZXIsIGluaXRSZXN1bHQsIFtlbCwgZGF0YS54XSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwoKICAgIGludm9rZVBvc3RSZW5kZXJIYW5kbGVycygpOwogIH0KCiAgLy8gV2FpdCB1bnRpbCBhZnRlciB0aGUgZG9jdW1lbnQgaGFzIGxvYWRlZCB0byByZW5kZXIgdGhlIHdpZGdldHMuCiAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigpIHsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlKTsKICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgfSwgZmFsc2UpOwogIH0gZWxzZSBpZiAoZG9jdW1lbnQuYXR0YWNoRXZlbnQpIHsKICAgIGRvY3VtZW50LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBmdW5jdGlvbigpIHsKICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIpIHsKICAgICAgICBkb2N1bWVudC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgYXJndW1lbnRzLmNhbGxlZSk7CiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgICB9CiAgICB9KTsKICB9CgoKICB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0QXR0YWNobWVudFVybCA9IGZ1bmN0aW9uKGRlcG5hbWUsIGtleSkgewogICAgLy8gSWYgbm8ga2V5LCBkZWZhdWx0IHRvIHRoZSBmaXJzdCBpdGVtCiAgICBpZiAodHlwZW9mKGtleSkgPT09ICJ1bmRlZmluZWQiKQogICAgICBrZXkgPSAxOwoKICAgIHZhciBsaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGVwbmFtZSArICItIiArIGtleSArICItYXR0YWNobWVudCIpOwogICAgaWYgKCFsaW5rKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiQXR0YWNobWVudCAiICsgZGVwbmFtZSArICIvIiArIGtleSArICIgbm90IGZvdW5kIGluIGRvY3VtZW50Iik7CiAgICB9CiAgICByZXR1cm4gbGluay5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKICB9OwoKICB3aW5kb3cuSFRNTFdpZGdldHMuZGF0YWZyYW1lVG9EMyA9IGZ1bmN0aW9uKGRmKSB7CiAgICB2YXIgbmFtZXMgPSBbXTsKICAgIHZhciBsZW5ndGg7CiAgICBmb3IgKHZhciBuYW1lIGluIGRmKSB7CiAgICAgICAgaWYgKGRmLmhhc093blByb3BlcnR5KG5hbWUpKQogICAgICAgICAgICBuYW1lcy5wdXNoKG5hbWUpOwogICAgICAgIGlmICh0eXBlb2YoZGZbbmFtZV0pICE9PSAib2JqZWN0IiB8fCB0eXBlb2YoZGZbbmFtZV0ubGVuZ3RoKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIik7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YobGVuZ3RoKSAhPT0gInVuZGVmaW5lZCIgJiYgbGVuZ3RoICE9PSBkZltuYW1lXS5sZW5ndGgpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIG9mIHRoZSBzYW1lIGxlbmd0aCIpOwogICAgICAgIH0KICAgICAgICBsZW5ndGggPSBkZltuYW1lXS5sZW5ndGg7CiAgICB9CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgdmFyIGl0ZW07CiAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCBsZW5ndGg7IHJvdysrKSB7CiAgICAgICAgaXRlbSA9IHt9OwogICAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG5hbWVzLmxlbmd0aDsgY29sKyspIHsKICAgICAgICAgICAgaXRlbVtuYW1lc1tjb2xdXSA9IGRmW25hbWVzW2NvbF1dW3Jvd107CiAgICAgICAgfQogICAgICAgIHJlc3VsdHMucHVzaChpdGVtKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIHdpbmRvdy5IVE1MV2lkZ2V0cy50cmFuc3Bvc2VBcnJheTJEID0gZnVuY3Rpb24oYXJyYXkpIHsKICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFycmF5OwogICAgICB2YXIgbmV3QXJyYXkgPSBhcnJheVswXS5tYXAoZnVuY3Rpb24oY29sLCBpKSB7CiAgICAgICAgICByZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uKHJvdykgewogICAgICAgICAgICAgIHJldHVybiByb3dbaV0KICAgICAgICAgIH0pCiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3QXJyYXk7CiAgfTsKICAvLyBTcGxpdCB2YWx1ZSBhdCBzcGxpdENoYXIsIGJ1dCBhbGxvdyBzcGxpdENoYXIgdG8gYmUgZXNjYXBlZAogIC8vIHVzaW5nIGVzY2FwZUNoYXIuIEFueSBvdGhlciBjaGFyYWN0ZXJzIGVzY2FwZWQgYnkgZXNjYXBlQ2hhcgogIC8vIHdpbGwgYmUgaW5jbHVkZWQgYXMgdXN1YWwgKGluY2x1ZGluZyBlc2NhcGVDaGFyIGl0c2VsZikuCiAgZnVuY3Rpb24gc3BsaXRXaXRoRXNjYXBlKHZhbHVlLCBzcGxpdENoYXIsIGVzY2FwZUNoYXIpIHsKICAgIHZhciByZXN1bHRzID0gW107CiAgICB2YXIgZXNjYXBlTW9kZSA9IGZhbHNlOwogICAgdmFyIGN1cnJlbnRSZXN1bHQgPSAiIjsKICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IHZhbHVlLmxlbmd0aDsgcG9zKyspIHsKICAgICAgaWYgKCFlc2NhcGVNb2RlKSB7CiAgICAgICAgaWYgKHZhbHVlW3Bvc10gPT09IHNwbGl0Q2hhcikgewogICAgICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOwogICAgICAgICAgY3VycmVudFJlc3VsdCA9ICIiOwogICAgICAgIH0gZWxzZSBpZiAodmFsdWVbcG9zXSA9PT0gZXNjYXBlQ2hhcikgewogICAgICAgICAgZXNjYXBlTW9kZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGN1cnJlbnRSZXN1bHQgKz0gdmFsdWVbcG9zXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOwogICAgICAgIGVzY2FwZU1vZGUgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgaWYgKGN1cnJlbnRSZXN1bHQgIT09ICIiKSB7CiAgICAgIHJlc3VsdHMucHVzaChjdXJyZW50UmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH0KICAvLyBGdW5jdGlvbiBhdXRob3JlZCBieSBZaWh1aS9KSiBBbGxhaXJlCiAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyID0gZnVuY3Rpb24obywgbWVtYmVyKSB7CiAgICB2YXIgcGFydHMgPSBzcGxpdFdpdGhFc2NhcGUobWVtYmVyLCAnLicsICdcXCcpOwogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBwYXJ0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsKICAgICAgLy8gcGFydCBtYXkgYmUgYSBjaGFyYWN0ZXIgb3IgJ251bWVyaWMnIG1lbWJlciBuYW1lCiAgICAgIGlmIChvICE9PSBudWxsICYmIHR5cGVvZiBvID09PSAib2JqZWN0IiAmJiBwYXJ0IGluIG8pIHsKICAgICAgICBpZiAoaSA9PSAobCAtIDEpKSB7IC8vIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIHRoZW4gZXZhbHVsYXRlCiAgICAgICAgICBpZiAodHlwZW9mIG9bcGFydF0gPT09ICJzdHJpbmciKQogICAgICAgICAgICBvW3BhcnRdID0gZXZhbCgiKCIgKyBvW3BhcnRdICsgIikiKTsKICAgICAgICB9IGVsc2UgeyAvLyBvdGhlcndpc2UgY29udGludWUgdG8gbmV4dCBlbWJlZGRlZCBvYmplY3QKICAgICAgICAgIG8gPSBvW3BhcnRdOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH07CgogIC8vIFJldHJpZXZlIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlIChpLmUuIHRoZSByZXR1cm4gdmFsdWUgb2YgYW4KICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQogIC8vIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50LCBvciBudWxsIGlmIG5vbmUuCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlID0gZnVuY3Rpb24oZWwpIHsKICAgIHJldHVybiBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0Iik7CiAgfTsKCiAgLy8gRmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHNjb3BlIHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsCiAgLy8gYW5kIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZgogIC8vIGFuIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pCiAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoYXQgZWxlbWVudCwgaWYgYW55LiBJZiBubyBlbGVtZW50IG1hdGNoZXMgdGhlCiAgLy8gc2VsZWN0b3IsIG9yIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IGhhcyBubyBIVE1MV2lkZ2V0CiAgLy8gaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGl0LCB0aGVuIG51bGwgaXMgcmV0dXJuZWQuCiAgLy8KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmQgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgc2VsZWN0b3IgPSBzY29wZTsKICAgICAgc2NvcGUgPSBkb2N1bWVudDsKICAgIH0KCiAgICB2YXIgZWwgPSBzY29wZS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgIGlmIChlbCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2UoZWwpOwogICAgfQogIH07CgogIC8vIEZpbmRzIGFsbCBlbGVtZW50cyBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IsIGFuZAogIC8vIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2VzIChpLmUuIHRoZSByZXR1cm4gdmFsdWVzIG9mCiAgLy8gYW4gSFRNTFdpZGdldCBiaW5kaW5nJ3MgaW5pdGlhbGl6ZSgpIG9yIGZhY3RvcnkoKSBmdW5jdGlvbikKICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnRzLCBpbiBhbiBhcnJheS4gSWYgZWxlbWVudHMgdGhhdAogIC8vIG1hdGNoIHRoZSBzZWxlY3RvciBkb24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgSFRNTFdpZGdldAogIC8vIGluc3RhbmNlLCB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBjb250YWluIG51bGxzLgogIC8vCiAgLy8gVGhlIHNjb3BlIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCBhbmQgZGVmYXVsdHMgdG8gd2luZG93LmRvY3VtZW50LgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5maW5kQWxsID0gZnVuY3Rpb24oc2NvcGUsIHNlbGVjdG9yKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgIHNlbGVjdG9yID0gc2NvcGU7CiAgICAgIHNjb3BlID0gZG9jdW1lbnQ7CiAgICB9CgogICAgdmFyIG5vZGVzID0gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewogICAgICByZXN1bHRzLnB1c2god2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlKG5vZGVzW2ldKSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICB2YXIgcG9zdFJlbmRlckhhbmRsZXJzID0gW107CiAgZnVuY3Rpb24gaW52b2tlUG9zdFJlbmRlckhhbmRsZXJzKCkgewogICAgd2hpbGUgKHBvc3RSZW5kZXJIYW5kbGVycy5sZW5ndGgpIHsKICAgICAgdmFyIGhhbmRsZXIgPSBwb3N0UmVuZGVySGFuZGxlcnMuc2hpZnQoKTsKICAgICAgaWYgKGhhbmRsZXIpIHsKICAgICAgICBoYW5kbGVyKCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFJlZ2lzdGVyIHRoZSBnaXZlbiBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBpbnZva2VkIGFmdGVyIHRoZQogIC8vIG5leHQgdGltZSBzdGF0aWMgd2lkZ2V0cyBhcmUgcmVuZGVyZWQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmFkZFBvc3RSZW5kZXJIYW5kbGVyID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIHBvc3RSZW5kZXJIYW5kbGVycy5wdXNoKGNhbGxiYWNrKTsKICB9OwoKICAvLyBUYWtlcyBhIG5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9uLCBhbmQgcmV0dXJucyBhbgogIC8vIG9sZC1zdHlsZSBjbGFzcy1ib3VuZCBkZWZpbml0aW9uLiBUaGlzIHNhdmVzIHVzIGZyb20gaGF2aW5nCiAgLy8gdG8gcmV3cml0ZSBhbGwgdGhlIGxvZ2ljIGluIHRoaXMgZmlsZSB0byBhY2NvbW9kYXRlIGJvdGgKICAvLyB0eXBlcyBvZiBkZWZpbml0aW9ucy4KICBmdW5jdGlvbiBjcmVhdGVMZWdhY3lEZWZpbml0aW9uQWRhcHRlcihkZWZuKSB7CiAgICB2YXIgcmVzdWx0ID0gewogICAgICBuYW1lOiBkZWZuLm5hbWUsCiAgICAgIHR5cGU6IGRlZm4udHlwZSwKICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICByZXR1cm4gZGVmbi5mYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgfSwKICAgICAgcmVuZGVyVmFsdWU6IGZ1bmN0aW9uKGVsLCB4LCBpbnN0YW5jZSkgewogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZW5kZXJWYWx1ZSh4KTsKICAgICAgfSwKICAgICAgcmVzaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCwgaW5zdGFuY2UpIHsKICAgICAgICByZXR1cm4gaW5zdGFuY2UucmVzaXplKHdpZHRoLCBoZWlnaHQpOwogICAgICB9CiAgICB9OwoKICAgIGlmIChkZWZuLmZpbmQpCiAgICAgIHJlc3VsdC5maW5kID0gZGVmbi5maW5kOwogICAgaWYgKGRlZm4ucmVuZGVyRXJyb3IpCiAgICAgIHJlc3VsdC5yZW5kZXJFcnJvciA9IGRlZm4ucmVuZGVyRXJyb3I7CiAgICBpZiAoZGVmbi5jbGVhckVycm9yKQogICAgICByZXN1bHQuY2xlYXJFcnJvciA9IGRlZm4uY2xlYXJFcnJvcjsKCiAgICByZXR1cm4gcmVzdWx0OwogIH0KfSkoKTsKCg=="></script>
<script src="data:application/x-javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsNCg0KICBuYW1lOiAncmVtaW90aWMnLA0KDQogIHR5cGU6ICdvdXRwdXQnLA0KDQogIGZhY3Rvcnk6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7DQoNCiAgICAvLyBUT0RPOiBkZWZpbmUgc2hhcmVkIHZhcmlhYmxlcyBmb3IgdGhpcyBpbnN0YW5jZQ0KDQogICAgcmV0dXJuIHsNCg0KICAgICAgcmVuZGVyVmFsdWU6IGZ1bmN0aW9uKHgpIHsNCg0KICAgICAgICB2YXIgd2lkdGggPSBlbC5vZmZzZXRXaWR0aA0KICAgICAgICB2YXIgaGVpZ2h0ID0gZWwub2Zmc2V0SGVpZ2h0DQoNCiAgICAgICAgLy8gaWYgeC5kYXRhIGlzIGFycmF5IGFzc3VtZSBpdCBpcyBpbiBwcm9wZXIgZm9ybQ0KICAgICAgICAvLyAgIGFzIGFuIGFycmF5IG9mIG9iamVjdHMgb3IgYXJyYXkgb2YgYXJyYXlzDQogICAgICAgIGlmKEFycmF5LmlzQXJyYXkoeC5kYXRhKSkgew0KICAgICAgICAgIHgucHJvcHNbeC5wcm9wcy5zaGFwZV0gPSB4LmRhdGENCiAgICAgICAgfSBlbHNlIHsgIC8vIGlmIG5vdCB0cmFuc2Zvcm0gY29sdW1ucyBpbnRvIHJvd3MNCiAgICAgICAgICB2YXIgZGF0YSA9IEhUTUxXaWRnZXRzLmRhdGFmcmFtZVRvRDMoeC5kYXRhKQ0KICAgICAgICAgIGlmKCFBcnJheS5pc0FycmF5KHgucHJvcHMuc2hhcGUpKSB7eC5wcm9wcy5zaGFwZSA9IFt4LnByb3BzLnNoYXBlXX0NCiAgICAgICAgICB4LnByb3BzLnNoYXBlLmZvckVhY2goZnVuY3Rpb24oc2hwKSB7DQogICAgICAgICAgICB4LnByb3BzW3NocF0gPSBkYXRhDQogICAgICAgICAgfSkNCiAgICAgICAgfQ0KDQogICAgICAgIHgucHJvcHMuc2l6ZSA9IFt3aWR0aCwgaGVpZ2h0XQ0KDQogICAgICAgIHZhciBmcmFtZSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoDQogICAgICAgICAgU2VtaW90aWNbeC5mcmFtZV0sDQogICAgICAgICAgeC5wcm9wcw0KICAgICAgICApDQoNCiAgICAgICAgUmVhY3RET00ucmVuZGVyKA0KICAgICAgICAgIGZyYW1lLA0KICAgICAgICAgIGVsDQogICAgICAgICkNCg0KICAgICAgfSwNCg0KICAgICAgcmVzaXplOiBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KSB7DQoNCiAgICAgICAgLy8gVE9ETzogY29kZSB0byByZS1yZW5kZXIgdGhlIHdpZGdldCB3aXRoIGEgbmV3IHNpemUNCg0KICAgICAgfQ0KDQogICAgfTsNCiAgfQ0KfSk7DQo="></script>
<script src="data:application/x-javascript;base64,LyoqCiAqIGNvcmUtanMgMi41LjEKICogaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMKICogTGljZW5zZTogaHR0cDovL3JvY2subWl0LWxpY2Vuc2Uub3JnCiAqIMKpIDIwMTcgRGVuaXMgUHVzaGthcmV2CiAqLwohZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0IjshZnVuY3Rpb24odCl7ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhyKXtpZihuW3JdKXJldHVybiBuW3JdLmV4cG9ydHM7dmFyIGU9bltyXT17aTpyLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIHRbcl0uY2FsbChlLmV4cG9ydHMsZSxlLmV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyksZS5sPSEwLGUuZXhwb3J0c312YXIgbj17fTtfX3dlYnBhY2tfcmVxdWlyZV9fLm09dCxfX3dlYnBhY2tfcmVxdWlyZV9fLmM9bixfX3dlYnBhY2tfcmVxdWlyZV9fLmQ9ZnVuY3Rpb24odCxuLHIpe19fd2VicGFja19yZXF1aXJlX18ubyh0LG4pfHxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxfX3dlYnBhY2tfcmVxdWlyZV9fLm49ZnVuY3Rpb24odCl7dmFyIG49dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uIGdldERlZmF1bHQoKXtyZXR1cm4gdFsiZGVmYXVsdCJdfTpmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCl7cmV0dXJuIHR9O3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobiwiYSIsbiksbn0sX193ZWJwYWNrX3JlcXVpcmVfXy5vPWZ1bmN0aW9uKHQsbil7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG4pfSxfX3dlYnBhY2tfcmVxdWlyZV9fLnA9IiIsX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnM9MTIzKX0oW2Z1bmN0aW9uKHQsbixlKXt2YXIgaT1lKDIpLG89ZSgyOCksdT1lKDEyKSxjPWUoMTMpLGY9ZSgxOCksYT1mdW5jdGlvbih0LG4sZSl7dmFyIHMsbCxoLHAsdj10JmEuRixnPXQmYS5HLHk9dCZhLlMsZD10JmEuUCxfPXQmYS5CLFM9Zz9pOnk/aVtuXXx8KGlbbl09e30pOihpW25dfHx7fSkucHJvdG90eXBlLGI9Zz9vOm9bbl18fChvW25dPXt9KSxtPWIucHJvdG90eXBlfHwoYi5wcm90b3R5cGU9e30pO2cmJihlPW4pO2ZvcihzIGluIGUpaD0oKGw9IXYmJlMmJlNbc10hPT1yKT9TOmUpW3NdLHA9XyYmbD9mKGgsaSk6ZCYmImZ1bmN0aW9uIj09dHlwZW9mIGg/ZihGdW5jdGlvbi5jYWxsLGgpOmgsUyYmYyhTLHMsaCx0JmEuVSksYltzXSE9aCYmdShiLHMscCksZCYmbVtzXSE9aCYmKG1bc109aCl9O2kuY29yZT1vLGEuRj0xLGEuRz0yLGEuUz00LGEuUD04LGEuQj0xNixhLlc9MzIsYS5VPTY0LGEuUj0xMjgsdC5leHBvcnRzPWF9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDQpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZighZSh0KSl0aHJvdyBUeXBlRXJyb3IodCsiIGlzIG5vdCBhbiBvYmplY3QhIik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LHIpe3ZhciBlPXQuZXhwb3J0cz0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93Lk1hdGg9PU1hdGg/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZiYmc2VsZi5NYXRoPT1NYXRoP3NlbGY6RnVuY3Rpb24oInJldHVybiB0aGlzIikoKTsibnVtYmVyIj09dHlwZW9mIG4mJihuPWUpfSxmdW5jdGlvbih0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbih0KXt0cnl7cmV0dXJuISF0KCl9Y2F0Y2gobil7cmV0dXJuITB9fX0sZnVuY3Rpb24odCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0P251bGwhPT10OiJmdW5jdGlvbiI9PXR5cGVvZiB0fX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoNDkpKCJ3a3MiKSxpPXIoMzIpLG89cigyKS5TeW1ib2wsdT0iZnVuY3Rpb24iPT10eXBlb2YgbzsodC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfHwoZVt0XT11JiZvW3RdfHwodT9vOmkpKCJTeW1ib2wuIit0KSl9KS5zdG9yZT1lfSxmdW5jdGlvbih0LG4scil7dC5leHBvcnRzPSFyKDMpKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmF9KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMSksaT1yKDg5KSxvPXIoMjEpLHU9T2JqZWN0LmRlZmluZVByb3BlcnR5O24uZj1yKDYpP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eSh0LG4scil7aWYoZSh0KSxuPW8obiwhMCksZShyKSxpKXRyeXtyZXR1cm4gdSh0LG4scil9Y2F0Y2goYyl7fWlmKCJnZXQiaW4gcnx8InNldCJpbiByKXRocm93IFR5cGVFcnJvcigiQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhIik7cmV0dXJuInZhbHVlImluIHImJih0W25dPXIudmFsdWUpLHR9fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigyMyksaT1NYXRoLm1pbjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+MD9pKGUodCksOTAwNzE5OTI1NDc0MDk5MSk6MH19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDIyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdChlKHQpKX19LGZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IFR5cGVFcnJvcih0KyIgaXMgbm90IGEgZnVuY3Rpb24hIik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LG4pe3ZhciByPXt9Lmhhc093blByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbih0LG4pe3JldHVybiByLmNhbGwodCxuKX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDcpLGk9cigzMSk7dC5leHBvcnRzPXIoNik/ZnVuY3Rpb24odCxuLHIpe3JldHVybiBlLmYodCxuLGkoMSxyKSl9OmZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdFtuXT1yLHR9fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigyKSxpPXIoMTIpLG89cigxMSksdT1yKDMyKSgic3JjIiksYz1GdW5jdGlvbi50b1N0cmluZyxmPSgiIitjKS5zcGxpdCgidG9TdHJpbmciKTtyKDI4KS5pbnNwZWN0U291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiBjLmNhbGwodCl9LCh0LmV4cG9ydHM9ZnVuY3Rpb24odCxuLHIsYyl7dmFyIGE9ImZ1bmN0aW9uIj09dHlwZW9mIHI7YSYmKG8ociwibmFtZSIpfHxpKHIsIm5hbWUiLG4pKSx0W25dIT09ciYmKGEmJihvKHIsdSl8fGkocix1LHRbbl0/IiIrdFtuXTpmLmpvaW4oU3RyaW5nKG4pKSkpLHQ9PT1lP3Rbbl09cjpjP3Rbbl0/dFtuXT1yOmkodCxuLHIpOihkZWxldGUgdFtuXSxpKHQsbixyKSkpfSkoRnVuY3Rpb24ucHJvdG90eXBlLCJ0b1N0cmluZyIsZnVuY3Rpb24gdG9TdHJpbmcoKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdGhpcyYmdGhpc1t1XXx8Yy5jYWxsKHRoaXMpfSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApLGk9cigzKSxvPXIoMjIpLHU9LyIvZyxjPWZ1bmN0aW9uKHQsbixyLGUpe3ZhciBpPVN0cmluZyhvKHQpKSxjPSI8IituO3JldHVybiIiIT09ciYmKGMrPSIgIityKyc9IicrU3RyaW5nKGUpLnJlcGxhY2UodSwiJnF1b3Q7IikrJyInKSxjKyI+IitpKyI8LyIrbisiPiJ9O3QuZXhwb3J0cz1mdW5jdGlvbih0LG4pe3ZhciByPXt9O3JbdF09bihjKSxlKGUuUCtlLkYqaShmdW5jdGlvbigpe3ZhciBuPSIiW3RdKCciJyk7cmV0dXJuIG4hPT1uLnRvTG93ZXJDYXNlKCl8fG4uc3BsaXQoJyInKS5sZW5ndGg+M30pLCJTdHJpbmciLHIpfX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoNDYpLGk9cigyMik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBlKGkodCkpfX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoNDcpLGk9cigzMSksbz1yKDE1KSx1PXIoMjEpLGM9cigxMSksZj1yKDg5KSxhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7bi5mPXIoNik/YTpmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKXtpZih0PW8odCksbj11KG4sITApLGYpdHJ5e3JldHVybiBhKHQsbil9Y2F0Y2gocil7fWlmKGModCxuKSlyZXR1cm4gaSghZS5mLmNhbGwodCxuKSx0W25dKX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDExKSxpPXIoOSksbz1yKDY1KSgiSUVfUFJPVE8iKSx1PU9iamVjdC5wcm90b3R5cGU7dC5leHBvcnRzPU9iamVjdC5nZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24odCl7cmV0dXJuIHQ9aSh0KSxlKHQsbyk/dFtvXToiZnVuY3Rpb24iPT10eXBlb2YgdC5jb25zdHJ1Y3RvciYmdCBpbnN0YW5jZW9mIHQuY29uc3RydWN0b3I/dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGU6dCBpbnN0YW5jZW9mIE9iamVjdD91Om51bGx9fSxmdW5jdGlvbih0LG4sZSl7dmFyIGk9ZSgxMCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsbixlKXtpZihpKHQpLG49PT1yKXJldHVybiB0O3N3aXRjaChlKXtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiB0LmNhbGwobixyKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbihyLGUpe3JldHVybiB0LmNhbGwobixyLGUpfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKHIsZSxpKXtyZXR1cm4gdC5jYWxsKG4scixlLGkpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShuLGFyZ3VtZW50cyl9fX0sZnVuY3Rpb24odCxuKXt2YXIgcj17fS50b1N0cmluZzt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIuY2FsbCh0KS5zbGljZSg4LC0xKX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDMpO3QuZXhwb3J0cz1mdW5jdGlvbih0LG4pe3JldHVybiEhdCYmZShmdW5jdGlvbigpe24/dC5jYWxsKG51bGwsZnVuY3Rpb24oKXt9LDEpOnQuY2FsbChudWxsKX0pfX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoNCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsbil7aWYoIWUodCkpcmV0dXJuIHQ7dmFyIHIsaTtpZihuJiYiZnVuY3Rpb24iPT10eXBlb2Yocj10LnRvU3RyaW5nKSYmIWUoaT1yLmNhbGwodCkpKXJldHVybiBpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZihyPXQudmFsdWVPZikmJiFlKGk9ci5jYWxsKHQpKSlyZXR1cm4gaTtpZighbiYmImZ1bmN0aW9uIj09dHlwZW9mKHI9dC50b1N0cmluZykmJiFlKGk9ci5jYWxsKHQpKSlyZXR1cm4gaTt0aHJvdyBUeXBlRXJyb3IoIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZSIpfX0sZnVuY3Rpb24odCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYodD09cil0aHJvdyBUeXBlRXJyb3IoIkNhbid0IGNhbGwgbWV0aG9kIG9uICAiK3QpO3JldHVybiB0fX0sZnVuY3Rpb24odCxuKXt2YXIgcj1NYXRoLmNlaWwsZT1NYXRoLmZsb29yO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gaXNOYU4odD0rdCk/MDoodD4wP2U6cikodCl9fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKSxpPXIoMjgpLG89cigzKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxuKXt2YXIgcj0oaS5PYmplY3R8fHt9KVt0XXx8T2JqZWN0W3RdLHU9e307dVt0XT1uKHIpLGUoZS5TK2UuRipvKGZ1bmN0aW9uKCl7cigxKX0pLCJPYmplY3QiLHUpfX0sZnVuY3Rpb24odCxuLGUpe3ZhciBpPWUoMTgpLG89ZSg0NiksdT1lKDkpLGM9ZSg4KSxmPWUoODIpO3QuZXhwb3J0cz1mdW5jdGlvbih0LG4pe3ZhciBlPTE9PXQsYT0yPT10LHM9Mz09dCxsPTQ9PXQsaD02PT10LHA9NT09dHx8aCx2PW58fGY7cmV0dXJuIGZ1bmN0aW9uKG4sZixnKXtmb3IodmFyIHksZCxfPXUobiksUz1vKF8pLGI9aShmLGcsMyksbT1jKFMubGVuZ3RoKSx4PTAsdz1lP3YobixtKTphP3YobiwwKTpyO20+eDt4KyspaWYoKHB8fHggaW4gUykmJih5PVNbeF0sZD1iKHkseCxfKSx0KSlpZihlKXdbeF09ZDtlbHNlIGlmKGQpc3dpdGNoKHQpe2Nhc2UgMzpyZXR1cm4hMDtjYXNlIDU6cmV0dXJuIHk7Y2FzZSA2OnJldHVybiB4O2Nhc2UgMjp3LnB1c2goeSl9ZWxzZSBpZihsKXJldHVybiExO3JldHVybiBoPy0xOnN8fGw/bDp3fX19LGZ1bmN0aW9uKHQsbixlKXtpZihlKDYpKXt2YXIgaT1lKDMzKSxvPWUoMiksdT1lKDMpLGM9ZSgwKSxmPWUoNTkpLGE9ZSg4OCkscz1lKDE4KSxsPWUoMzkpLGg9ZSgzMSkscD1lKDEyKSx2PWUoNDEpLGc9ZSgyMykseT1lKDgpLGQ9ZSgxMTYpLF89ZSgzNSksUz1lKDIxKSxiPWUoMTEpLG09ZSg0OCkseD1lKDQpLHc9ZSg5KSxFPWUoNzkpLE89ZSgzNiksUD1lKDE3KSxNPWUoMzcpLmYsST1lKDgxKSxGPWUoMzIpLEE9ZSg1KSxrPWUoMjUpLE49ZSg1MCksaj1lKDU3KSxSPWUoODQpLFQ9ZSg0NCksTD1lKDU0KSxEPWUoMzgpLFc9ZSg4MyksQz1lKDEwNSksVT1lKDcpLEc9ZSgxNiksQj1VLmYsVj1HLmYsej1vLlJhbmdlRXJyb3IscT1vLlR5cGVFcnJvcixLPW8uVWludDhBcnJheSxKPUFycmF5LnByb3RvdHlwZSxZPWEuQXJyYXlCdWZmZXIsSD1hLkRhdGFWaWV3LFg9aygwKSxaPWsoMiksJD1rKDMpLFE9ayg0KSx0dD1rKDUpLG50PWsoNikscnQ9TighMCksZXQ9TighMSksaXQ9Ui52YWx1ZXMsb3Q9Ui5rZXlzLHV0PVIuZW50cmllcyxjdD1KLmxhc3RJbmRleE9mLGZ0PUoucmVkdWNlLGF0PUoucmVkdWNlUmlnaHQsc3Q9Si5qb2luLGx0PUouc29ydCxodD1KLnNsaWNlLHB0PUoudG9TdHJpbmcsdnQ9Si50b0xvY2FsZVN0cmluZyxndD1BKCJpdGVyYXRvciIpLHl0PUEoInRvU3RyaW5nVGFnIiksZHQ9RigidHlwZWRfY29uc3RydWN0b3IiKSxfdD1GKCJkZWZfY29uc3RydWN0b3IiKSxTdD1mLkNPTlNUUixidD1mLlRZUEVELG10PWYuVklFVyx4dD1rKDEsZnVuY3Rpb24odCxuKXtyZXR1cm4gTXQoaih0LHRbX3RdKSxuKX0pLHd0PXUoZnVuY3Rpb24oKXtyZXR1cm4gMT09PW5ldyBLKG5ldyBVaW50MTZBcnJheShbMV0pLmJ1ZmZlcilbMF19KSxFdD0hIUsmJiEhSy5wcm90b3R5cGUuc2V0JiZ1KGZ1bmN0aW9uKCl7bmV3IEsoMSkuc2V0KHt9KX0pLE90PWZ1bmN0aW9uKHQsbil7dmFyIHI9Zyh0KTtpZihyPDB8fHIlbil0aHJvdyB6KCJXcm9uZyBvZmZzZXQhIik7cmV0dXJuIHJ9LFB0PWZ1bmN0aW9uKHQpe2lmKHgodCkmJmJ0IGluIHQpcmV0dXJuIHQ7dGhyb3cgcSh0KyIgaXMgbm90IGEgdHlwZWQgYXJyYXkhIil9LE10PWZ1bmN0aW9uKHQsbil7aWYoISh4KHQpJiZkdCBpbiB0KSl0aHJvdyBxKCJJdCBpcyBub3QgYSB0eXBlZCBhcnJheSBjb25zdHJ1Y3RvciEiKTtyZXR1cm4gbmV3IHQobil9LEl0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIEZ0KGoodCx0W190XSksbil9LEZ0PWZ1bmN0aW9uKHQsbil7Zm9yKHZhciByPTAsZT1uLmxlbmd0aCxpPU10KHQsZSk7ZT5yOylpW3JdPW5bcisrXTtyZXR1cm4gaX0sQXQ9ZnVuY3Rpb24odCxuLHIpe0IodCxuLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZFtyXX19KX0sa3Q9ZnVuY3Rpb24gZnJvbSh0KXt2YXIgbixlLGksbyx1LGMsZj13KHQpLGE9YXJndW1lbnRzLmxlbmd0aCxsPWE+MT9hcmd1bWVudHNbMV06cixoPWwhPT1yLHA9SShmKTtpZihwIT1yJiYhRShwKSl7Zm9yKGM9cC5jYWxsKGYpLGk9W10sbj0wOyEodT1jLm5leHQoKSkuZG9uZTtuKyspaS5wdXNoKHUudmFsdWUpO2Y9aX1mb3IoaCYmYT4yJiYobD1zKGwsYXJndW1lbnRzWzJdLDIpKSxuPTAsZT15KGYubGVuZ3RoKSxvPU10KHRoaXMsZSk7ZT5uO24rKylvW25dPWg/bChmW25dLG4pOmZbbl07cmV0dXJuIG99LE50PWZ1bmN0aW9uIG9mKCl7Zm9yKHZhciB0PTAsbj1hcmd1bWVudHMubGVuZ3RoLHI9TXQodGhpcyxuKTtuPnQ7KXJbdF09YXJndW1lbnRzW3QrK107cmV0dXJuIHJ9LGp0PSEhSyYmdShmdW5jdGlvbigpe3Z0LmNhbGwobmV3IEsoMSkpfSksUnQ9ZnVuY3Rpb24gdG9Mb2NhbGVTdHJpbmcoKXtyZXR1cm4gdnQuYXBwbHkoanQ/aHQuY2FsbChQdCh0aGlzKSk6UHQodGhpcyksYXJndW1lbnRzKX0sVHQ9e2NvcHlXaXRoaW46ZnVuY3Rpb24gY29weVdpdGhpbih0LG4pe3JldHVybiBDLmNhbGwoUHQodGhpcyksdCxuLGFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06cil9LGV2ZXJ5OmZ1bmN0aW9uIGV2ZXJ5KHQpe3JldHVybiBRKFB0KHRoaXMpLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTpyKX0sZmlsbDpmdW5jdGlvbiBmaWxsKHQpe3JldHVybiBXLmFwcGx5KFB0KHRoaXMpLGFyZ3VtZW50cyl9LGZpbHRlcjpmdW5jdGlvbiBmaWx0ZXIodCl7cmV0dXJuIEl0KHRoaXMsWihQdCh0aGlzKSx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06cikpfSxmaW5kOmZ1bmN0aW9uIGZpbmQodCl7cmV0dXJuIHR0KFB0KHRoaXMpLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTpyKX0sZmluZEluZGV4OmZ1bmN0aW9uIGZpbmRJbmRleCh0KXtyZXR1cm4gbnQoUHQodGhpcyksdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnIpfSxmb3JFYWNoOmZ1bmN0aW9uIGZvckVhY2godCl7WChQdCh0aGlzKSx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06cil9LGluZGV4T2Y6ZnVuY3Rpb24gaW5kZXhPZih0KXtyZXR1cm4gZXQoUHQodGhpcyksdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnIpfSxpbmNsdWRlczpmdW5jdGlvbiBpbmNsdWRlcyh0KXtyZXR1cm4gcnQoUHQodGhpcyksdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnIpfSxqb2luOmZ1bmN0aW9uIGpvaW4odCl7cmV0dXJuIHN0LmFwcGx5KFB0KHRoaXMpLGFyZ3VtZW50cyl9LGxhc3RJbmRleE9mOmZ1bmN0aW9uIGxhc3RJbmRleE9mKHQpe3JldHVybiBjdC5hcHBseShQdCh0aGlzKSxhcmd1bWVudHMpfSxtYXA6ZnVuY3Rpb24gbWFwKHQpe3JldHVybiB4dChQdCh0aGlzKSx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06cil9LHJlZHVjZTpmdW5jdGlvbiByZWR1Y2UodCl7cmV0dXJuIGZ0LmFwcGx5KFB0KHRoaXMpLGFyZ3VtZW50cyl9LHJlZHVjZVJpZ2h0OmZ1bmN0aW9uIHJlZHVjZVJpZ2h0KHQpe3JldHVybiBhdC5hcHBseShQdCh0aGlzKSxhcmd1bWVudHMpfSxyZXZlcnNlOmZ1bmN0aW9uIHJldmVyc2UoKXtmb3IodmFyIHQsbj10aGlzLHI9UHQobikubGVuZ3RoLGU9TWF0aC5mbG9vcihyLzIpLGk9MDtpPGU7KXQ9bltpXSxuW2krK109blstLXJdLG5bcl09dDtyZXR1cm4gbn0sc29tZTpmdW5jdGlvbiBzb21lKHQpe3JldHVybiAkKFB0KHRoaXMpLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTpyKX0sc29ydDpmdW5jdGlvbiBzb3J0KHQpe3JldHVybiBsdC5jYWxsKFB0KHRoaXMpLHQpfSxzdWJhcnJheTpmdW5jdGlvbiBzdWJhcnJheSh0LG4pe3ZhciBlPVB0KHRoaXMpLGk9ZS5sZW5ndGgsbz1fKHQsaSk7cmV0dXJuIG5ldyhqKGUsZVtfdF0pKShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQrbyplLkJZVEVTX1BFUl9FTEVNRU5ULHkoKG49PT1yP2k6XyhuLGkpKS1vKSl9fSxMdD1mdW5jdGlvbiBzbGljZSh0LG4pe3JldHVybiBJdCh0aGlzLGh0LmNhbGwoUHQodGhpcyksdCxuKSl9LER0PWZ1bmN0aW9uIHNldCh0KXtQdCh0aGlzKTt2YXIgbj1PdChhcmd1bWVudHNbMV0sMSkscj10aGlzLmxlbmd0aCxlPXcodCksaT15KGUubGVuZ3RoKSxvPTA7aWYoaStuPnIpdGhyb3cgeigiV3JvbmcgbGVuZ3RoISIpO2Zvcig7bzxpOyl0aGlzW24rb109ZVtvKytdfSxXdD17ZW50cmllczpmdW5jdGlvbiBlbnRyaWVzKCl7cmV0dXJuIHV0LmNhbGwoUHQodGhpcykpfSxrZXlzOmZ1bmN0aW9uIGtleXMoKXtyZXR1cm4gb3QuY2FsbChQdCh0aGlzKSl9LHZhbHVlczpmdW5jdGlvbiB2YWx1ZXMoKXtyZXR1cm4gaXQuY2FsbChQdCh0aGlzKSl9fSxDdD1mdW5jdGlvbih0LG4pe3JldHVybiB4KHQpJiZ0W2J0XSYmInN5bWJvbCIhPXR5cGVvZiBuJiZuIGluIHQmJlN0cmluZygrbik9PVN0cmluZyhuKX0sVXQ9ZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsbil7cmV0dXJuIEN0KHQsbj1TKG4sITApKT9oKDIsdFtuXSk6Vih0LG4pfSxHdD1mdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eSh0LG4scil7cmV0dXJuIShDdCh0LG49UyhuLCEwKSkmJngocikmJmIociwidmFsdWUiKSl8fGIociwiZ2V0Iil8fGIociwic2V0Iil8fHIuY29uZmlndXJhYmxlfHxiKHIsIndyaXRhYmxlIikmJiFyLndyaXRhYmxlfHxiKHIsImVudW1lcmFibGUiKSYmIXIuZW51bWVyYWJsZT9CKHQsbixyKToodFtuXT1yLnZhbHVlLHQpfTtTdHx8KEcuZj1VdCxVLmY9R3QpLGMoYy5TK2MuRiohU3QsIk9iamVjdCIse2dldE93blByb3BlcnR5RGVzY3JpcHRvcjpVdCxkZWZpbmVQcm9wZXJ0eTpHdH0pLHUoZnVuY3Rpb24oKXtwdC5jYWxsKHt9KX0pJiYocHQ9dnQ9ZnVuY3Rpb24gdG9TdHJpbmcoKXtyZXR1cm4gc3QuY2FsbCh0aGlzKX0pO3ZhciBCdD12KHt9LFR0KTt2KEJ0LFd0KSxwKEJ0LGd0LFd0LnZhbHVlcyksdihCdCx7c2xpY2U6THQsc2V0OkR0LGNvbnN0cnVjdG9yOmZ1bmN0aW9uKCl7fSx0b1N0cmluZzpwdCx0b0xvY2FsZVN0cmluZzpSdH0pLEF0KEJ0LCJidWZmZXIiLCJiIiksQXQoQnQsImJ5dGVPZmZzZXQiLCJvIiksQXQoQnQsImJ5dGVMZW5ndGgiLCJsIiksQXQoQnQsImxlbmd0aCIsImUiKSxCKEJ0LHl0LHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tidF19fSksdC5leHBvcnRzPWZ1bmN0aW9uKHQsbixlLGEpe3ZhciBzPXQrKChhPSEhYSk/IkNsYW1wZWQiOiIiKSsiQXJyYXkiLGg9ImdldCIrdCx2PSJzZXQiK3QsZz1vW3NdLF89Z3x8e30sUz1nJiZQKGcpLGI9IWd8fCFmLkFCVix3PXt9LEU9ZyYmZy5wcm90b3R5cGUsST1mdW5jdGlvbih0LHIpe3ZhciBlPXQuX2Q7cmV0dXJuIGUudltoXShyKm4rZS5vLHd0KX0sRj1mdW5jdGlvbih0LHIsZSl7dmFyIGk9dC5fZDthJiYoZT0oZT1NYXRoLnJvdW5kKGUpKTwwPzA6ZT4yNTU/MjU1OjI1NSZlKSxpLnZbdl0ocipuK2kubyxlLHd0KX0sQT1mdW5jdGlvbih0LG4pe0IodCxuLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSSh0aGlzLG4pfSxzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIEYodGhpcyxuLHQpfSxlbnVtZXJhYmxlOiEwfSl9O2I/KGc9ZShmdW5jdGlvbih0LGUsaSxvKXtsKHQsZyxzLCJfZCIpO3ZhciB1LGMsZixhLGg9MCx2PTA7aWYoeChlKSl7aWYoIShlIGluc3RhbmNlb2YgWXx8IkFycmF5QnVmZmVyIj09KGE9bShlKSl8fCJTaGFyZWRBcnJheUJ1ZmZlciI9PWEpKXJldHVybiBidCBpbiBlP0Z0KGcsZSk6a3QuY2FsbChnLGUpO3U9ZSx2PU90KGksbik7dmFyIF89ZS5ieXRlTGVuZ3RoO2lmKG89PT1yKXtpZihfJW4pdGhyb3cgeigiV3JvbmcgbGVuZ3RoISIpO2lmKChjPV8tdik8MCl0aHJvdyB6KCJXcm9uZyBsZW5ndGghIil9ZWxzZSBpZigoYz15KG8pKm4pK3Y+Xyl0aHJvdyB6KCJXcm9uZyBsZW5ndGghIik7Zj1jL259ZWxzZSBmPWQoZSksdT1uZXcgWShjPWYqbik7Zm9yKHAodCwiX2QiLHtiOnUsbzp2LGw6YyxlOmYsdjpuZXcgSCh1KX0pO2g8ZjspQSh0LGgrKyl9KSxFPWcucHJvdG90eXBlPU8oQnQpLHAoRSwiY29uc3RydWN0b3IiLGcpKTp1KGZ1bmN0aW9uKCl7ZygxKX0pJiZ1KGZ1bmN0aW9uKCl7bmV3IGcoLTEpfSkmJkwoZnVuY3Rpb24odCl7bmV3IGcsbmV3IGcobnVsbCksbmV3IGcoMS41KSxuZXcgZyh0KX0sITApfHwoZz1lKGZ1bmN0aW9uKHQsZSxpLG8pe2wodCxnLHMpO3ZhciB1O3JldHVybiB4KGUpP2UgaW5zdGFuY2VvZiBZfHwiQXJyYXlCdWZmZXIiPT0odT1tKGUpKXx8IlNoYXJlZEFycmF5QnVmZmVyIj09dT9vIT09cj9uZXcgXyhlLE90KGksbiksbyk6aSE9PXI/bmV3IF8oZSxPdChpLG4pKTpuZXcgXyhlKTpidCBpbiBlP0Z0KGcsZSk6a3QuY2FsbChnLGUpOm5ldyBfKGQoZSkpfSksWChTIT09RnVuY3Rpb24ucHJvdG90eXBlP00oXykuY29uY2F0KE0oUykpOk0oXyksZnVuY3Rpb24odCl7dCBpbiBnfHxwKGcsdCxfW3RdKX0pLGcucHJvdG90eXBlPUUsaXx8KEUuY29uc3RydWN0b3I9ZykpO3ZhciBrPUVbZ3RdLE49ISFrJiYoInZhbHVlcyI9PWsubmFtZXx8ay5uYW1lPT1yKSxqPVd0LnZhbHVlcztwKGcsZHQsITApLHAoRSxidCxzKSxwKEUsbXQsITApLHAoRSxfdCxnKSwoYT9uZXcgZygxKVt5dF09PXM6eXQgaW4gRSl8fEIoRSx5dCx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHN9fSksd1tzXT1nLGMoYy5HK2MuVytjLkYqKGchPV8pLHcpLGMoYy5TLHMse0JZVEVTX1BFUl9FTEVNRU5UOm59KSxjKGMuUytjLkYqdShmdW5jdGlvbigpe18ub2YuY2FsbChnLDEpfSkscyx7ZnJvbTprdCxvZjpOdH0pLCJCWVRFU19QRVJfRUxFTUVOVCJpbiBFfHxwKEUsIkJZVEVTX1BFUl9FTEVNRU5UIixuKSxjKGMuUCxzLFR0KSxEKHMpLGMoYy5QK2MuRipFdCxzLHtzZXQ6RHR9KSxjKGMuUCtjLkYqIU4scyxXdCksaXx8RS50b1N0cmluZz09cHR8fChFLnRvU3RyaW5nPXB0KSxjKGMuUCtjLkYqdShmdW5jdGlvbigpe25ldyBnKDEpLnNsaWNlKCl9KSxzLHtzbGljZTpMdH0pLGMoYy5QK2MuRioodShmdW5jdGlvbigpe3JldHVyblsxLDJdLnRvTG9jYWxlU3RyaW5nKCkhPW5ldyBnKFsxLDJdKS50b0xvY2FsZVN0cmluZygpfSl8fCF1KGZ1bmN0aW9uKCl7RS50b0xvY2FsZVN0cmluZy5jYWxsKFsxLDJdKX0pKSxzLHt0b0xvY2FsZVN0cmluZzpSdH0pLFRbc109Tj9rOmosaXx8Tnx8cChFLGd0LGopfX1lbHNlIHQuZXhwb3J0cz1mdW5jdGlvbigpe319LGZ1bmN0aW9uKHQsbixlKXt2YXIgaT1lKDExMCksbz1lKDApLHU9ZSg0OSkoIm1ldGFkYXRhIiksYz11LnN0b3JlfHwodS5zdG9yZT1uZXcoZSgxMTMpKSksZj1mdW5jdGlvbih0LG4sZSl7dmFyIG89Yy5nZXQodCk7aWYoIW8pe2lmKCFlKXJldHVybiByO2Muc2V0KHQsbz1uZXcgaSl9dmFyIHU9by5nZXQobik7aWYoIXUpe2lmKCFlKXJldHVybiByO28uc2V0KG4sdT1uZXcgaSl9cmV0dXJuIHV9O3QuZXhwb3J0cz17c3RvcmU6YyxtYXA6ZixoYXM6ZnVuY3Rpb24odCxuLGUpe3ZhciBpPWYobixlLCExKTtyZXR1cm4gaSE9PXImJmkuaGFzKHQpfSxnZXQ6ZnVuY3Rpb24odCxuLGUpe3ZhciBpPWYobixlLCExKTtyZXR1cm4gaT09PXI/cjppLmdldCh0KX0sc2V0OmZ1bmN0aW9uKHQsbixyLGUpe2YocixlLCEwKS5zZXQodCxuKX0sa2V5czpmdW5jdGlvbih0LG4pe3ZhciByPWYodCxuLCExKSxlPVtdO3JldHVybiByJiZyLmZvckVhY2goZnVuY3Rpb24odCxuKXtlLnB1c2gobil9KSxlfSxrZXk6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1yfHwic3ltYm9sIj09dHlwZW9mIHQ/dDpTdHJpbmcodCl9LGV4cDpmdW5jdGlvbih0KXtvKG8uUywiUmVmbGVjdCIsdCl9fX0sZnVuY3Rpb24obixyKXt2YXIgZT1uLmV4cG9ydHM9e3ZlcnNpb246IjIuNS4xIn07Im51bWJlciI9PXR5cGVvZiB0JiYodD1lKX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMzIpKCJtZXRhIiksaT1yKDQpLG89cigxMSksdT1yKDcpLmYsYz0wLGY9T2JqZWN0LmlzRXh0ZW5zaWJsZXx8ZnVuY3Rpb24oKXtyZXR1cm4hMH0sYT0hcigzKShmdW5jdGlvbigpe3JldHVybiBmKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpfSkscz1mdW5jdGlvbih0KXt1KHQsZSx7dmFsdWU6e2k6Ik8iKyArK2Msdzp7fX19KX0sbD10LmV4cG9ydHM9e0tFWTplLE5FRUQ6ITEsZmFzdEtleTpmdW5jdGlvbih0LG4pe2lmKCFpKHQpKXJldHVybiJzeW1ib2wiPT10eXBlb2YgdD90Oigic3RyaW5nIj09dHlwZW9mIHQ/IlMiOiJQIikrdDtpZighbyh0LGUpKXtpZighZih0KSlyZXR1cm4iRiI7aWYoIW4pcmV0dXJuIkUiO3ModCl9cmV0dXJuIHRbZV0uaX0sZ2V0V2VhazpmdW5jdGlvbih0LG4pe2lmKCFvKHQsZSkpe2lmKCFmKHQpKXJldHVybiEwO2lmKCFuKXJldHVybiExO3ModCl9cmV0dXJuIHRbZV0ud30sb25GcmVlemU6ZnVuY3Rpb24odCl7cmV0dXJuIGEmJmwuTkVFRCYmZih0KSYmIW8odCxlKSYmcyh0KSx0fX19LGZ1bmN0aW9uKHQsbixlKXt2YXIgaT1lKDUpKCJ1bnNjb3BhYmxlcyIpLG89QXJyYXkucHJvdG90eXBlO29baV09PXImJmUoMTIpKG8saSx7fSksdC5leHBvcnRzPWZ1bmN0aW9uKHQpe29baV1bdF09ITB9fSxmdW5jdGlvbih0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbih0LG4pe3JldHVybntlbnVtZXJhYmxlOiEoMSZ0KSxjb25maWd1cmFibGU6ISgyJnQpLHdyaXRhYmxlOiEoNCZ0KSx2YWx1ZTpufX19LGZ1bmN0aW9uKHQsbil7dmFyIGU9MCxpPU1hdGgucmFuZG9tKCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiJTeW1ib2woIi5jb25jYXQodD09PXI/IiI6dCwiKV8iLCgrK2UraSkudG9TdHJpbmcoMzYpKX19LGZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPSExfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cig5MSksaT1yKDY2KTt0LmV4cG9ydHM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uIGtleXModCl7cmV0dXJuIGUodCxpKX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDIzKSxpPU1hdGgubWF4LG89TWF0aC5taW47dC5leHBvcnRzPWZ1bmN0aW9uKHQsbil7cmV0dXJuKHQ9ZSh0KSk8MD9pKHQrbiwwKTpvKHQsbil9fSxmdW5jdGlvbih0LG4sZSl7dmFyIGk9ZSgxKSxvPWUoOTIpLHU9ZSg2NiksYz1lKDY1KSgiSUVfUFJPVE8iKSxmPWZ1bmN0aW9uKCl7fSxhPWZ1bmN0aW9uKCl7dmFyIHQsbj1lKDYzKSgiaWZyYW1lIikscj11Lmxlbmd0aDtmb3Iobi5zdHlsZS5kaXNwbGF5PSJub25lIixlKDY3KS5hcHBlbmRDaGlsZChuKSxuLnNyYz0iamF2YXNjcmlwdDoiLCh0PW4uY29udGVudFdpbmRvdy5kb2N1bWVudCkub3BlbigpLHQud3JpdGUoIjxzY3JpcHQ+ZG9jdW1lbnQuRj1PYmplY3Q8XC9zY3JpcHQ+IiksdC5jbG9zZSgpLGE9dC5GO3ItLTspZGVsZXRlIGEucHJvdG90eXBlW3Vbcl1dO3JldHVybiBhKCl9O3QuZXhwb3J0cz1PYmplY3QuY3JlYXRlfHxmdW5jdGlvbiBjcmVhdGUodCxuKXt2YXIgZTtyZXR1cm4gbnVsbCE9PXQ/KGYucHJvdG90eXBlPWkodCksZT1uZXcgZixmLnByb3RvdHlwZT1udWxsLGVbY109dCk6ZT1hKCksbj09PXI/ZTpvKGUsbil9fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cig5MSksaT1yKDY2KS5jb25jYXQoImxlbmd0aCIsInByb3RvdHlwZSIpO24uZj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc3x8ZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyh0KXtyZXR1cm4gZSh0LGkpfX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMiksaT1yKDcpLG89cig2KSx1PXIoNSkoInNwZWNpZXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIG49ZVt0XTtvJiZuJiYhblt1XSYmaS5mKG4sdSx7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzfX0pfX0sZnVuY3Rpb24odCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxuLGUsaSl7aWYoISh0IGluc3RhbmNlb2Ygbil8fGkhPT1yJiZpIGluIHQpdGhyb3cgVHlwZUVycm9yKGUrIjogaW5jb3JyZWN0IGludm9jYXRpb24hIik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigxOCksaT1yKDEwMyksbz1yKDc5KSx1PXIoMSksYz1yKDgpLGY9cig4MSksYT17fSxzPXt9OyhuPXQuZXhwb3J0cz1mdW5jdGlvbih0LG4scixsLGgpe3ZhciBwLHYsZyx5LGQ9aD9mdW5jdGlvbigpe3JldHVybiB0fTpmKHQpLF89ZShyLGwsbj8yOjEpLFM9MDtpZigiZnVuY3Rpb24iIT10eXBlb2YgZCl0aHJvdyBUeXBlRXJyb3IodCsiIGlzIG5vdCBpdGVyYWJsZSEiKTtpZihvKGQpKXtmb3IocD1jKHQubGVuZ3RoKTtwPlM7UysrKWlmKCh5PW4/Xyh1KHY9dFtTXSlbMF0sdlsxXSk6Xyh0W1NdKSk9PT1hfHx5PT09cylyZXR1cm4geX1lbHNlIGZvcihnPWQuY2FsbCh0KTshKHY9Zy5uZXh0KCkpLmRvbmU7KWlmKCh5PWkoZyxfLHYudmFsdWUsbikpPT09YXx8eT09PXMpcmV0dXJuIHl9KS5CUkVBSz1hLG4uUkVUVVJOPXN9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDEzKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxuLHIpe2Zvcih2YXIgaSBpbiBuKWUodCxpLG5baV0scik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cig3KS5mLGk9cigxMSksbz1yKDUpKCJ0b1N0cmluZ1RhZyIpO3QuZXhwb3J0cz1mdW5jdGlvbih0LG4scil7dCYmIWkodD1yP3Q6dC5wcm90b3R5cGUsbykmJmUodCxvLHtjb25maWd1cmFibGU6ITAsdmFsdWU6bn0pfX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCksaT1yKDIyKSxvPXIoMyksdT1yKDcwKSxjPSJbIit1KyJdIixmPVJlZ0V4cCgiXiIrYytjKyIqIiksYT1SZWdFeHAoYytjKyIqJCIpLHM9ZnVuY3Rpb24odCxuLHIpe3ZhciBpPXt9LGM9byhmdW5jdGlvbigpe3JldHVybiEhdVt0XSgpfHwi4oCLwoUiIT0i4oCLwoUiW3RdKCl9KSxmPWlbdF09Yz9uKGwpOnVbdF07ciYmKGlbcl09ZiksZShlLlArZS5GKmMsIlN0cmluZyIsaSl9LGw9cy50cmltPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHQ9U3RyaW5nKGkodCkpLDEmbiYmKHQ9dC5yZXBsYWNlKGYsIiIpKSwyJm4mJih0PXQucmVwbGFjZShhLCIiKSksdH07dC5leHBvcnRzPXN9LGZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPXt9fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cig0KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxuKXtpZighZSh0KXx8dC5fdCE9PW4pdGhyb3cgVHlwZUVycm9yKCJJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICIrbisiIHJlcXVpcmVkISIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMTkpO3QuZXhwb3J0cz1PYmplY3QoInoiKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKT9PYmplY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIlN0cmluZyI9PWUodCk/dC5zcGxpdCgiIik6T2JqZWN0KHQpfX0sZnVuY3Rpb24odCxuKXtuLmY9e30ucHJvcGVydHlJc0VudW1lcmFibGV9LGZ1bmN0aW9uKHQsbixlKXt2YXIgaT1lKDE5KSxvPWUoNSkoInRvU3RyaW5nVGFnIiksdT0iQXJndW1lbnRzIj09aShmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpLGM9ZnVuY3Rpb24odCxuKXt0cnl7cmV0dXJuIHRbbl19Y2F0Y2gocil7fX07dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBuLGUsZjtyZXR1cm4gdD09PXI/IlVuZGVmaW5lZCI6bnVsbD09PXQ/Ik51bGwiOiJzdHJpbmciPT10eXBlb2YoZT1jKG49T2JqZWN0KHQpLG8pKT9lOnU/aShuKToiT2JqZWN0Ij09KGY9aShuKSkmJiJmdW5jdGlvbiI9PXR5cGVvZiBuLmNhbGxlZT8iQXJndW1lbnRzIjpmfX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMiksaT1lWyJfX2NvcmUtanNfc2hhcmVkX18iXXx8KGVbIl9fY29yZS1qc19zaGFyZWRfXyJdPXt9KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGlbdF18fChpW3RdPXt9KX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDE1KSxpPXIoOCksbz1yKDM1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4scix1KXt2YXIgYyxmPWUobiksYT1pKGYubGVuZ3RoKSxzPW8odSxhKTtpZih0JiZyIT1yKXtmb3IoO2E+czspaWYoKGM9ZltzKytdKSE9YylyZXR1cm4hMH1lbHNlIGZvcig7YT5zO3MrKylpZigodHx8cyBpbiBmKSYmZltzXT09PXIpcmV0dXJuIHR8fHN8fDA7cmV0dXJuIXQmJi0xfX19LGZ1bmN0aW9uKHQsbil7bi5mPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHN9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDE5KTt0LmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24gaXNBcnJheSh0KXtyZXR1cm4iQXJyYXkiPT1lKHQpfX0sZnVuY3Rpb24odCxuLGUpe3ZhciBpPWUoNCksbz1lKDE5KSx1PWUoNSkoIm1hdGNoIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBuO3JldHVybiBpKHQpJiYoKG49dFt1XSkhPT1yPyEhbjoiUmVnRXhwIj09byh0KSl9fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cig1KSgiaXRlcmF0b3IiKSxpPSExO3RyeXt2YXIgbz1bN11bZV0oKTtvWyJyZXR1cm4iXT1mdW5jdGlvbigpe2k9ITB9LEFycmF5LmZyb20obyxmdW5jdGlvbigpe3Rocm93IDJ9KX1jYXRjaCh1KXt9dC5leHBvcnRzPWZ1bmN0aW9uKHQsbil7aWYoIW4mJiFpKXJldHVybiExO3ZhciByPSExO3RyeXt2YXIgbz1bN10sYz1vW2VdKCk7Yy5uZXh0PWZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6cj0hMH19LG9bZV09ZnVuY3Rpb24oKXtyZXR1cm4gY30sdChvKX1jYXRjaCh1KXt9cmV0dXJuIHJ9fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigxKTt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLG49IiI7cmV0dXJuIHQuZ2xvYmFsJiYobis9ImciKSx0Lmlnbm9yZUNhc2UmJihuKz0iaSIpLHQubXVsdGlsaW5lJiYobis9Im0iKSx0LnVuaWNvZGUmJihuKz0idSIpLHQuc3RpY2t5JiYobis9InkiKSxufX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMTIpLGk9cigxMyksbz1yKDMpLHU9cigyMiksYz1yKDUpO3QuZXhwb3J0cz1mdW5jdGlvbih0LG4scil7dmFyIGY9Yyh0KSxhPXIodSxmLCIiW3RdKSxzPWFbMF0sbD1hWzFdO28oZnVuY3Rpb24oKXt2YXIgbj17fTtyZXR1cm4gbltmXT1mdW5jdGlvbigpe3JldHVybiA3fSw3IT0iIlt0XShuKX0pJiYoaShTdHJpbmcucHJvdG90eXBlLHQscyksZShSZWdFeHAucHJvdG90eXBlLGYsMj09bj9mdW5jdGlvbih0LG4pe3JldHVybiBsLmNhbGwodCx0aGlzLG4pfTpmdW5jdGlvbih0KXtyZXR1cm4gbC5jYWxsKHQsdGhpcyl9KSl9fSxmdW5jdGlvbih0LG4sZSl7dmFyIGk9ZSgxKSxvPWUoMTApLHU9ZSg1KSgic3BlY2llcyIpO3QuZXhwb3J0cz1mdW5jdGlvbih0LG4pe3ZhciBlLGM9aSh0KS5jb25zdHJ1Y3RvcjtyZXR1cm4gYz09PXJ8fChlPWkoYylbdV0pPT1yP246byhlKX19LGZ1bmN0aW9uKHQsbixlKXt2YXIgaT1lKDIpLG89ZSgwKSx1PWUoMTMpLGM9ZSg0MSksZj1lKDI5KSxhPWUoNDApLHM9ZSgzOSksbD1lKDQpLGg9ZSgzKSxwPWUoNTQpLHY9ZSg0MiksZz1lKDY5KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxuLGUseSxkLF8pe3ZhciBTPWlbdF0sYj1TLG09ZD8ic2V0IjoiYWRkIix4PWImJmIucHJvdG90eXBlLHc9e30sRT1mdW5jdGlvbih0KXt2YXIgbj14W3RdO3UoeCx0LCJkZWxldGUiPT10P2Z1bmN0aW9uKHQpe3JldHVybiEoXyYmIWwodCkpJiZuLmNhbGwodGhpcywwPT09dD8wOnQpfToiaGFzIj09dD9mdW5jdGlvbiBoYXModCl7cmV0dXJuIShfJiYhbCh0KSkmJm4uY2FsbCh0aGlzLDA9PT10PzA6dCl9OiJnZXQiPT10P2Z1bmN0aW9uIGdldCh0KXtyZXR1cm4gXyYmIWwodCk/cjpuLmNhbGwodGhpcywwPT09dD8wOnQpfToiYWRkIj09dD9mdW5jdGlvbiBhZGQodCl7cmV0dXJuIG4uY2FsbCh0aGlzLDA9PT10PzA6dCksdGhpc306ZnVuY3Rpb24gc2V0KHQscil7cmV0dXJuIG4uY2FsbCh0aGlzLDA9PT10PzA6dCxyKSx0aGlzfSl9O2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiJiYoX3x8eC5mb3JFYWNoJiYhaChmdW5jdGlvbigpeyhuZXcgYikuZW50cmllcygpLm5leHQoKX0pKSl7dmFyIE89bmV3IGIsUD1PW21dKF8/e306LTAsMSkhPU8sTT1oKGZ1bmN0aW9uKCl7Ty5oYXMoMSl9KSxJPXAoZnVuY3Rpb24odCl7bmV3IGIodCl9KSxGPSFfJiZoKGZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBiLG49NTtuLS07KXRbbV0obixuKTtyZXR1cm4hdC5oYXMoLTApfSk7SXx8KChiPW4oZnVuY3Rpb24obixlKXtzKG4sYix0KTt2YXIgaT1nKG5ldyBTLG4sYik7cmV0dXJuIGUhPXImJmEoZSxkLGlbbV0saSksaX0pKS5wcm90b3R5cGU9eCx4LmNvbnN0cnVjdG9yPWIpLChNfHxGKSYmKEUoImRlbGV0ZSIpLEUoImhhcyIpLGQmJkUoImdldCIpKSwoRnx8UCkmJkUobSksXyYmeC5jbGVhciYmZGVsZXRlIHguY2xlYXJ9ZWxzZSBiPXkuZ2V0Q29uc3RydWN0b3Iobix0LGQsbSksYyhiLnByb3RvdHlwZSxlKSxmLk5FRUQ9ITA7cmV0dXJuIHYoYix0KSx3W3RdPWIsbyhvLkcrby5XK28uRiooYiE9UyksdyksX3x8eS5zZXRTdHJvbmcoYix0LGQpLGJ9fSxmdW5jdGlvbih0LG4scil7Zm9yKHZhciBlLGk9cigyKSxvPXIoMTIpLHU9cigzMiksYz11KCJ0eXBlZF9hcnJheSIpLGY9dSgidmlldyIpLGE9ISghaS5BcnJheUJ1ZmZlcnx8IWkuRGF0YVZpZXcpLHM9YSxsPTAsaD0iSW50OEFycmF5LFVpbnQ4QXJyYXksVWludDhDbGFtcGVkQXJyYXksSW50MTZBcnJheSxVaW50MTZBcnJheSxJbnQzMkFycmF5LFVpbnQzMkFycmF5LEZsb2F0MzJBcnJheSxGbG9hdDY0QXJyYXkiLnNwbGl0KCIsIik7bDw5OykoZT1pW2hbbCsrXV0pPyhvKGUucHJvdG90eXBlLGMsITApLG8oZS5wcm90b3R5cGUsZiwhMCkpOnM9ITE7dC5leHBvcnRzPXtBQlY6YSxDT05TVFI6cyxUWVBFRDpjLFZJRVc6Zn19LGZ1bmN0aW9uKHQsbixyKXt0LmV4cG9ydHM9cigzMyl8fCFyKDMpKGZ1bmN0aW9uKCl7dmFyIHQ9TWF0aC5yYW5kb20oKTtfX2RlZmluZVNldHRlcl9fLmNhbGwobnVsbCx0LGZ1bmN0aW9uKCl7fSksZGVsZXRlIHIoMilbdF19KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2UoZS5TLHQse29mOmZ1bmN0aW9uIG9mKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbj1BcnJheSh0KTt0LS07KW5bdF09YXJndW1lbnRzW3RdO3JldHVybiBuZXcgdGhpcyhuKX19KX19LGZ1bmN0aW9uKHQsbixlKXt2YXIgaT1lKDApLG89ZSgxMCksdT1lKDE4KSxjPWUoNDApO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpKGkuUyx0LHtmcm9tOmZ1bmN0aW9uIGZyb20odCl7dmFyIG4sZSxpLGYsYT1hcmd1bWVudHNbMV07cmV0dXJuIG8odGhpcyksKG49YSE9PXIpJiZvKGEpLHQ9PXI/bmV3IHRoaXM6KGU9W10sbj8oaT0wLGY9dShhLGFyZ3VtZW50c1syXSwyKSxjKHQsITEsZnVuY3Rpb24odCl7ZS5wdXNoKGYodCxpKyspKX0pKTpjKHQsITEsZS5wdXNoLGUpLG5ldyB0aGlzKGUpKX19KX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDQpLGk9cigyKS5kb2N1bWVudCxvPWUoaSkmJmUoaS5jcmVhdGVFbGVtZW50KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG8/aS5jcmVhdGVFbGVtZW50KHQpOnt9fX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMiksaT1yKDI4KSxvPXIoMzMpLHU9cig5MCksYz1yKDcpLmY7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBuPWkuU3ltYm9sfHwoaS5TeW1ib2w9bz97fTplLlN5bWJvbHx8e30pOyJfIj09dC5jaGFyQXQoMCl8fHQgaW4gbnx8YyhuLHQse3ZhbHVlOnUuZih0KX0pfX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoNDkpKCJrZXlzIiksaT1yKDMyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGVbdF18fChlW3RdPWkodCkpfX0sZnVuY3Rpb24odCxuKXt0LmV4cG9ydHM9ImNvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZiIuc3BsaXQoIiwiKX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMikuZG9jdW1lbnQ7dC5leHBvcnRzPWUmJmUuZG9jdW1lbnRFbGVtZW50fSxmdW5jdGlvbih0LG4sZSl7dmFyIGk9ZSg0KSxvPWUoMSksdT1mdW5jdGlvbih0LG4pe2lmKG8odCksIWkobikmJm51bGwhPT1uKXRocm93IFR5cGVFcnJvcihuKyI6IGNhbid0IHNldCBhcyBwcm90b3R5cGUhIil9O3QuZXhwb3J0cz17c2V0Ok9iamVjdC5zZXRQcm90b3R5cGVPZnx8KCJfX3Byb3RvX18iaW57fT9mdW5jdGlvbih0LG4scil7dHJ5eyhyPWUoMTgpKEZ1bmN0aW9uLmNhbGwsZSgxNikuZihPYmplY3QucHJvdG90eXBlLCJfX3Byb3RvX18iKS5zZXQsMikpKHQsW10pLG49ISh0IGluc3RhbmNlb2YgQXJyYXkpfWNhdGNoKGkpe249ITB9cmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKHQsZSl7cmV0dXJuIHUodCxlKSxuP3QuX19wcm90b19fPWU6cih0LGUpLHR9fSh7fSwhMSk6ciksY2hlY2s6dX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDQpLGk9cig2OCkuc2V0O3QuZXhwb3J0cz1mdW5jdGlvbih0LG4scil7dmFyIG8sdT1uLmNvbnN0cnVjdG9yO3JldHVybiB1IT09ciYmImZ1bmN0aW9uIj09dHlwZW9mIHUmJihvPXUucHJvdG90eXBlKSE9PXIucHJvdG90eXBlJiZlKG8pJiZpJiZpKHQsbyksdH19LGZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPSJcdFxuXHgwQlxmXHIgwqDhmoDhoI7igIDigIHigILigIPigITigIXigIbigIfigIjigInigIrigK/igZ/jgIBcdTIwMjhcdTIwMjlcdWZlZmYifSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigyMyksaT1yKDIyKTt0LmV4cG9ydHM9ZnVuY3Rpb24gcmVwZWF0KHQpe3ZhciBuPVN0cmluZyhpKHRoaXMpKSxyPSIiLG89ZSh0KTtpZihvPDB8fG89PUluZmluaXR5KXRocm93IFJhbmdlRXJyb3IoIkNvdW50IGNhbid0IGJlIG5lZ2F0aXZlIik7Zm9yKDtvPjA7KG8+Pj49MSkmJihuKz1uKSkxJm8mJihyKz1uKTtyZXR1cm4gcn19LGZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPU1hdGguc2lnbnx8ZnVuY3Rpb24gc2lnbih0KXtyZXR1cm4gMD09KHQ9K3QpfHx0IT10P3Q6dDwwPy0xOjF9fSxmdW5jdGlvbih0LG4pe3ZhciByPU1hdGguZXhwbTE7dC5leHBvcnRzPSFyfHxyKDEwKT4yMjAyNS40NjU3OTQ4MDY3MTh8fHIoMTApPDIyMDI1LjQ2NTc5NDgwNjcxOHx8LTJlLTE3IT1yKC0yZS0xNyk/ZnVuY3Rpb24gZXhwbTEodCl7cmV0dXJuIDA9PSh0PSt0KT90OnQ+LTFlLTYmJnQ8MWUtNj90K3QqdC8yOk1hdGguZXhwKHQpLTF9OnJ9LGZ1bmN0aW9uKHQsbixlKXt2YXIgaT1lKDIzKSxvPWUoMjIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgdSxjLGY9U3RyaW5nKG8obikpLGE9aShlKSxzPWYubGVuZ3RoO3JldHVybiBhPDB8fGE+PXM/dD8iIjpyOih1PWYuY2hhckNvZGVBdChhKSk8NTUyOTZ8fHU+NTYzMTl8fGErMT09PXN8fChjPWYuY2hhckNvZGVBdChhKzEpKTw1NjMyMHx8Yz41NzM0Mz90P2YuY2hhckF0KGEpOnU6dD9mLnNsaWNlKGEsYSsyKTpjLTU2MzIwKyh1LTU1Mjk2PDwxMCkrNjU1MzZ9fX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoNTMpLGk9cigyMik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsbixyKXtpZihlKG4pKXRocm93IFR5cGVFcnJvcigiU3RyaW5nIyIrcisiIGRvZXNuJ3QgYWNjZXB0IHJlZ2V4ISIpO3JldHVybiBTdHJpbmcoaSh0KSl9fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cig1KSgibWF0Y2giKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIG49Ly4vO3RyeXsiLy4vIlt0XShuKX1jYXRjaChyKXt0cnl7cmV0dXJuIG5bZV09ITEsISIvLi8iW3RdKG4pfWNhdGNoKGkpe319cmV0dXJuITB9fSxmdW5jdGlvbih0LG4sZSl7dmFyIGk9ZSgzMyksbz1lKDApLHU9ZSgxMyksYz1lKDEyKSxmPWUoMTEpLGE9ZSg0NCkscz1lKDc4KSxsPWUoNDIpLGg9ZSgxNykscD1lKDUpKCJpdGVyYXRvciIpLHY9IShbXS5rZXlzJiYibmV4dCJpbltdLmtleXMoKSksZz1mdW5jdGlvbigpe3JldHVybiB0aGlzfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxuLGUseSxkLF8sUyl7cyhlLG4seSk7dmFyIGIsbSx4LHc9ZnVuY3Rpb24odCl7aWYoIXYmJnQgaW4gTSlyZXR1cm4gTVt0XTtzd2l0Y2godCl7Y2FzZSJrZXlzIjpyZXR1cm4gZnVuY3Rpb24ga2V5cygpe3JldHVybiBuZXcgZSh0aGlzLHQpfTtjYXNlInZhbHVlcyI6cmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpe3JldHVybiBuZXcgZSh0aGlzLHQpfX1yZXR1cm4gZnVuY3Rpb24gZW50cmllcygpe3JldHVybiBuZXcgZSh0aGlzLHQpfX0sRT1uKyIgSXRlcmF0b3IiLE89InZhbHVlcyI9PWQsUD0hMSxNPXQucHJvdG90eXBlLEk9TVtwXXx8TVsiQEBpdGVyYXRvciJdfHxkJiZNW2RdLEY9SXx8dyhkKSxBPWQ/Tz93KCJlbnRyaWVzIik6RjpyLGs9IkFycmF5Ij09bj9NLmVudHJpZXN8fEk6STtpZihrJiYoeD1oKGsuY2FsbChuZXcgdCkpKSE9PU9iamVjdC5wcm90b3R5cGUmJngubmV4dCYmKGwoeCxFLCEwKSxpfHxmKHgscCl8fGMoeCxwLGcpKSxPJiZJJiYidmFsdWVzIiE9PUkubmFtZSYmKFA9ITAsRj1mdW5jdGlvbiB2YWx1ZXMoKXtyZXR1cm4gSS5jYWxsKHRoaXMpfSksaSYmIVN8fCF2JiYhUCYmTVtwXXx8YyhNLHAsRiksYVtuXT1GLGFbRV09ZyxkKWlmKGI9e3ZhbHVlczpPP0Y6dygidmFsdWVzIiksa2V5czpfP0Y6dygia2V5cyIpLGVudHJpZXM6QX0sUylmb3IobSBpbiBiKW0gaW4gTXx8dShNLG0sYlttXSk7ZWxzZSBvKG8uUCtvLkYqKHZ8fFApLG4sYik7cmV0dXJuIGJ9fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigzNiksaT1yKDMxKSxvPXIoNDIpLHU9e307cigxMikodSxyKDUpKCJpdGVyYXRvciIpLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSx0LmV4cG9ydHM9ZnVuY3Rpb24odCxuLHIpe3QucHJvdG90eXBlPWUodSx7bmV4dDppKDEscil9KSxvKHQsbisiIEl0ZXJhdG9yIil9fSxmdW5jdGlvbih0LG4sZSl7dmFyIGk9ZSg0NCksbz1lKDUpKCJpdGVyYXRvciIpLHU9QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdCE9PXImJihpLkFycmF5PT09dHx8dVtvXT09PXQpfX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoNyksaT1yKDMxKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxuLHIpe24gaW4gdD9lLmYodCxuLGkoMCxyKSk6dFtuXT1yfX0sZnVuY3Rpb24odCxuLGUpe3ZhciBpPWUoNDgpLG89ZSg1KSgiaXRlcmF0b3IiKSx1PWUoNDQpO3QuZXhwb3J0cz1lKDI4KS5nZXRJdGVyYXRvck1ldGhvZD1mdW5jdGlvbih0KXtpZih0IT1yKXJldHVybiB0W29dfHx0WyJAQGl0ZXJhdG9yIl18fHVbaSh0KV19fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigyMDcpO3QuZXhwb3J0cz1mdW5jdGlvbih0LG4pe3JldHVybiBuZXcoZSh0KSkobil9fSxmdW5jdGlvbih0LG4sZSl7dmFyIGk9ZSg5KSxvPWUoMzUpLHU9ZSg4KTt0LmV4cG9ydHM9ZnVuY3Rpb24gZmlsbCh0KXtmb3IodmFyIG49aSh0aGlzKSxlPXUobi5sZW5ndGgpLGM9YXJndW1lbnRzLmxlbmd0aCxmPW8oYz4xP2FyZ3VtZW50c1sxXTpyLGUpLGE9Yz4yP2FyZ3VtZW50c1syXTpyLHM9YT09PXI/ZTpvKGEsZSk7cz5mOyluW2YrK109dDtyZXR1cm4gbn19LGZ1bmN0aW9uKHQsbixlKXt2YXIgaT1lKDMwKSxvPWUoMTA2KSx1PWUoNDQpLGM9ZSgxNSk7dC5leHBvcnRzPWUoNzcpKEFycmF5LCJBcnJheSIsZnVuY3Rpb24odCxuKXt0aGlzLl90PWModCksdGhpcy5faT0wLHRoaXMuX2s9bn0sZnVuY3Rpb24oKXt2YXIgdD10aGlzLl90LG49dGhpcy5fayxlPXRoaXMuX2krKztyZXR1cm4hdHx8ZT49dC5sZW5ndGg/KHRoaXMuX3Q9cixvKDEpKToia2V5cyI9PW4/bygwLGUpOiJ2YWx1ZXMiPT1uP28oMCx0W2VdKTpvKDAsW2UsdFtlXV0pfSwidmFsdWVzIiksdS5Bcmd1bWVudHM9dS5BcnJheSxpKCJrZXlzIiksaSgidmFsdWVzIiksaSgiZW50cmllcyIpfSxmdW5jdGlvbih0LG4scil7dmFyIGUsaSxvLHU9cigxOCksYz1yKDk2KSxmPXIoNjcpLGE9cig2Mykscz1yKDIpLGw9cy5wcm9jZXNzLGg9cy5zZXRJbW1lZGlhdGUscD1zLmNsZWFySW1tZWRpYXRlLHY9cy5NZXNzYWdlQ2hhbm5lbCxnPXMuRGlzcGF0Y2gseT0wLGQ9e30sXz1mdW5jdGlvbigpe3ZhciB0PSt0aGlzO2lmKGQuaGFzT3duUHJvcGVydHkodCkpe3ZhciBuPWRbdF07ZGVsZXRlIGRbdF0sbigpfX0sUz1mdW5jdGlvbih0KXtfLmNhbGwodC5kYXRhKX07aCYmcHx8KGg9ZnVuY3Rpb24gc2V0SW1tZWRpYXRlKHQpe2Zvcih2YXIgbj1bXSxyPTE7YXJndW1lbnRzLmxlbmd0aD5yOyluLnB1c2goYXJndW1lbnRzW3IrK10pO3JldHVybiBkWysreV09ZnVuY3Rpb24oKXtjKCJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RnVuY3Rpb24odCksbil9LGUoeSkseX0scD1mdW5jdGlvbiBjbGVhckltbWVkaWF0ZSh0KXtkZWxldGUgZFt0XX0sInByb2Nlc3MiPT1yKDE5KShsKT9lPWZ1bmN0aW9uKHQpe2wubmV4dFRpY2sodShfLHQsMSkpfTpnJiZnLm5vdz9lPWZ1bmN0aW9uKHQpe2cubm93KHUoXyx0LDEpKX06dj8obz0oaT1uZXcgdikucG9ydDIsaS5wb3J0MS5vbm1lc3NhZ2U9UyxlPXUoby5wb3N0TWVzc2FnZSxvLDEpKTpzLmFkZEV2ZW50TGlzdGVuZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBwb3N0TWVzc2FnZSYmIXMuaW1wb3J0U2NyaXB0cz8oZT1mdW5jdGlvbih0KXtzLnBvc3RNZXNzYWdlKHQrIiIsIioiKX0scy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixTLCExKSk6ZT0ib25yZWFkeXN0YXRlY2hhbmdlImluIGEoInNjcmlwdCIpP2Z1bmN0aW9uKHQpe2YuYXBwZW5kQ2hpbGQoYSgic2NyaXB0IikpLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2YucmVtb3ZlQ2hpbGQodGhpcyksXy5jYWxsKHQpfX06ZnVuY3Rpb24odCl7c2V0VGltZW91dCh1KF8sdCwxKSwwKX0pLHQuZXhwb3J0cz17c2V0OmgsY2xlYXI6cH19LGZ1bmN0aW9uKHQsbixlKXt2YXIgaT1lKDIpLG89ZSg4NSkuc2V0LHU9aS5NdXRhdGlvbk9ic2VydmVyfHxpLldlYktpdE11dGF0aW9uT2JzZXJ2ZXIsYz1pLnByb2Nlc3MsZj1pLlByb21pc2UsYT0icHJvY2VzcyI9PWUoMTkpKGMpO3QuZXhwb3J0cz1mdW5jdGlvbigpe3ZhciB0LG4sZSxzPWZ1bmN0aW9uKCl7dmFyIGksbztmb3IoYSYmKGk9Yy5kb21haW4pJiZpLmV4aXQoKTt0Oyl7bz10LmZuLHQ9dC5uZXh0O3RyeXtvKCl9Y2F0Y2godSl7dGhyb3cgdD9lKCk6bj1yLHV9fW49cixpJiZpLmVudGVyKCl9O2lmKGEpZT1mdW5jdGlvbigpe2MubmV4dFRpY2socyl9O2Vsc2UgaWYodSl7dmFyIGw9ITAsaD1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIik7bmV3IHUocykub2JzZXJ2ZShoLHtjaGFyYWN0ZXJEYXRhOiEwfSksZT1mdW5jdGlvbigpe2guZGF0YT1sPSFsfX1lbHNlIGlmKGYmJmYucmVzb2x2ZSl7dmFyIHA9Zi5yZXNvbHZlKCk7ZT1mdW5jdGlvbigpe3AudGhlbihzKX19ZWxzZSBlPWZ1bmN0aW9uKCl7by5jYWxsKGkscyl9O3JldHVybiBmdW5jdGlvbihpKXt2YXIgbz17Zm46aSxuZXh0OnJ9O24mJihuLm5leHQ9byksdHx8KHQ9byxlKCkpLG49b319fSxmdW5jdGlvbih0LG4sZSl7ZnVuY3Rpb24gUHJvbWlzZUNhcGFiaWxpdHkodCl7dmFyIG4sZTt0aGlzLnByb21pc2U9bmV3IHQoZnVuY3Rpb24odCxpKXtpZihuIT09cnx8ZSE9PXIpdGhyb3cgVHlwZUVycm9yKCJCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvciIpO249dCxlPWl9KSx0aGlzLnJlc29sdmU9aShuKSx0aGlzLnJlamVjdD1pKGUpfXZhciBpPWUoMTApO3QuZXhwb3J0cy5mPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgUHJvbWlzZUNhcGFiaWxpdHkodCl9fSxmdW5jdGlvbih0LG4sZSl7ZnVuY3Rpb24gcGFja0lFRUU3NTQodCxuLHIpe3ZhciBlLGksbyx1PUFycmF5KHIpLGM9OCpyLW4tMSxmPSgxPDxjKS0xLGE9Zj4+MSxzPTIzPT09bj9JKDIsLTI0KS1JKDIsLTc3KTowLGw9MCxoPXQ8MHx8MD09PXQmJjEvdDwwPzE6MDtmb3IoKHQ9TSh0KSkhPXR8fHQ9PT1PPyhpPXQhPXQ/MTowLGU9Zik6KGU9RihBKHQpL2spLHQqKG89SSgyLC1lKSk8MSYmKGUtLSxvKj0yKSwodCs9ZSthPj0xP3MvbzpzKkkoMiwxLWEpKSpvPj0yJiYoZSsrLG8vPTIpLGUrYT49Zj8oaT0wLGU9Zik6ZSthPj0xPyhpPSh0Km8tMSkqSSgyLG4pLGUrPWEpOihpPXQqSSgyLGEtMSkqSSgyLG4pLGU9MCkpO24+PTg7dVtsKytdPTI1NSZpLGkvPTI1NixuLT04KTtmb3IoZT1lPDxufGksYys9bjtjPjA7dVtsKytdPTI1NSZlLGUvPTI1NixjLT04KTtyZXR1cm4gdVstLWxdfD0xMjgqaCx1fWZ1bmN0aW9uIHVucGFja0lFRUU3NTQodCxuLHIpe3ZhciBlLGk9OCpyLW4tMSxvPSgxPDxpKS0xLHU9bz4+MSxjPWktNyxmPXItMSxhPXRbZi0tXSxzPTEyNyZhO2ZvcihhPj49NztjPjA7cz0yNTYqcyt0W2ZdLGYtLSxjLT04KTtmb3IoZT1zJigxPDwtYyktMSxzPj49LWMsYys9bjtjPjA7ZT0yNTYqZSt0W2ZdLGYtLSxjLT04KTtpZigwPT09cylzPTEtdTtlbHNle2lmKHM9PT1vKXJldHVybiBlP05hTjphPy1POk87ZSs9SSgyLG4pLHMtPXV9cmV0dXJuKGE/LTE6MSkqZSpJKDIscy1uKX1mdW5jdGlvbiB1bnBhY2tJMzIodCl7cmV0dXJuIHRbM108PDI0fHRbMl08PDE2fHRbMV08PDh8dFswXX1mdW5jdGlvbiBwYWNrSTgodCl7cmV0dXJuWzI1NSZ0XX1mdW5jdGlvbiBwYWNrSTE2KHQpe3JldHVyblsyNTUmdCx0Pj44JjI1NV19ZnVuY3Rpb24gcGFja0kzMih0KXtyZXR1cm5bMjU1JnQsdD4+OCYyNTUsdD4+MTYmMjU1LHQ+PjI0JjI1NV19ZnVuY3Rpb24gcGFja0Y2NCh0KXtyZXR1cm4gcGFja0lFRUU3NTQodCw1Miw4KX1mdW5jdGlvbiBwYWNrRjMyKHQpe3JldHVybiBwYWNrSUVFRTc1NCh0LDIzLDQpfWZ1bmN0aW9uIGFkZEdldHRlcih0LG4scil7eSh0W1NdLG4se2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzW3JdfX0pfWZ1bmN0aW9uIGdldCh0LG4scixlKXt2YXIgaT12KCtyKTtpZihpK24+dFtqXSl0aHJvdyBFKGIpO3ZhciBvPXRbTl0uX2IsdT1pK3RbUl0sYz1vLnNsaWNlKHUsdStuKTtyZXR1cm4gZT9jOmMucmV2ZXJzZSgpfWZ1bmN0aW9uIHNldCh0LG4scixlLGksbyl7dmFyIHU9digrcik7aWYodStuPnRbal0pdGhyb3cgRShiKTtmb3IodmFyIGM9dFtOXS5fYixmPXUrdFtSXSxhPWUoK2kpLHM9MDtzPG47cysrKWNbZitzXT1hW28/czpuLXMtMV19dmFyIGk9ZSgyKSxvPWUoNiksdT1lKDMzKSxjPWUoNTkpLGY9ZSgxMiksYT1lKDQxKSxzPWUoMyksbD1lKDM5KSxoPWUoMjMpLHA9ZSg4KSx2PWUoMTE2KSxnPWUoMzcpLmYseT1lKDcpLmYsZD1lKDgzKSxfPWUoNDIpLFM9InByb3RvdHlwZSIsYj0iV3JvbmcgaW5kZXghIixtPWkuQXJyYXlCdWZmZXIseD1pLkRhdGFWaWV3LHc9aS5NYXRoLEU9aS5SYW5nZUVycm9yLE89aS5JbmZpbml0eSxQPW0sTT13LmFicyxJPXcucG93LEY9dy5mbG9vcixBPXcubG9nLGs9dy5MTjIsTj1vPyJfYiI6ImJ1ZmZlciIsaj1vPyJfbCI6ImJ5dGVMZW5ndGgiLFI9bz8iX28iOiJieXRlT2Zmc2V0IjtpZihjLkFCVil7aWYoIXMoZnVuY3Rpb24oKXttKDEpfSl8fCFzKGZ1bmN0aW9uKCl7bmV3IG0oLTEpfSl8fHMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG0sbmV3IG0oMS41KSxuZXcgbShOYU4pLCJBcnJheUJ1ZmZlciIhPW0ubmFtZX0pKXtmb3IodmFyIFQsTD0obT1mdW5jdGlvbiBBcnJheUJ1ZmZlcih0KXtyZXR1cm4gbCh0aGlzLG0pLG5ldyBQKHYodCkpfSlbU109UFtTXSxEPWcoUCksVz0wO0QubGVuZ3RoPlc7KShUPURbVysrXSlpbiBtfHxmKG0sVCxQW1RdKTt1fHwoTC5jb25zdHJ1Y3Rvcj1tKX12YXIgQz1uZXcgeChuZXcgbSgyKSksVT14W1NdLnNldEludDg7Qy5zZXRJbnQ4KDAsMjE0NzQ4MzY0OCksQy5zZXRJbnQ4KDEsMjE0NzQ4MzY0OSksIUMuZ2V0SW50OCgwKSYmQy5nZXRJbnQ4KDEpfHxhKHhbU10se3NldEludDg6ZnVuY3Rpb24gc2V0SW50OCh0LG4pe1UuY2FsbCh0aGlzLHQsbjw8MjQ+PjI0KX0sc2V0VWludDg6ZnVuY3Rpb24gc2V0VWludDgodCxuKXtVLmNhbGwodGhpcyx0LG48PDI0Pj4yNCl9fSwhMCl9ZWxzZSBtPWZ1bmN0aW9uIEFycmF5QnVmZmVyKHQpe2wodGhpcyxtLCJBcnJheUJ1ZmZlciIpO3ZhciBuPXYodCk7dGhpcy5fYj1kLmNhbGwoQXJyYXkobiksMCksdGhpc1tqXT1ufSx4PWZ1bmN0aW9uIERhdGFWaWV3KHQsbixlKXtsKHRoaXMseCwiRGF0YVZpZXciKSxsKHQsbSwiRGF0YVZpZXciKTt2YXIgaT10W2pdLG89aChuKTtpZihvPDB8fG8+aSl0aHJvdyBFKCJXcm9uZyBvZmZzZXQhIik7aWYoZT1lPT09cj9pLW86cChlKSxvK2U+aSl0aHJvdyBFKCJXcm9uZyBsZW5ndGghIik7dGhpc1tOXT10LHRoaXNbUl09byx0aGlzW2pdPWV9LG8mJihhZGRHZXR0ZXIobSwiYnl0ZUxlbmd0aCIsIl9sIiksYWRkR2V0dGVyKHgsImJ1ZmZlciIsIl9iIiksYWRkR2V0dGVyKHgsImJ5dGVMZW5ndGgiLCJfbCIpLGFkZEdldHRlcih4LCJieXRlT2Zmc2V0IiwiX28iKSksYSh4W1NdLHtnZXRJbnQ4OmZ1bmN0aW9uIGdldEludDgodCl7cmV0dXJuIGdldCh0aGlzLDEsdClbMF08PDI0Pj4yNH0sZ2V0VWludDg6ZnVuY3Rpb24gZ2V0VWludDgodCl7cmV0dXJuIGdldCh0aGlzLDEsdClbMF19LGdldEludDE2OmZ1bmN0aW9uIGdldEludDE2KHQpe3ZhciBuPWdldCh0aGlzLDIsdCxhcmd1bWVudHNbMV0pO3JldHVybihuWzFdPDw4fG5bMF0pPDwxNj4+MTZ9LGdldFVpbnQxNjpmdW5jdGlvbiBnZXRVaW50MTYodCl7dmFyIG49Z2V0KHRoaXMsMix0LGFyZ3VtZW50c1sxXSk7cmV0dXJuIG5bMV08PDh8blswXX0sZ2V0SW50MzI6ZnVuY3Rpb24gZ2V0SW50MzIodCl7cmV0dXJuIHVucGFja0kzMihnZXQodGhpcyw0LHQsYXJndW1lbnRzWzFdKSl9LGdldFVpbnQzMjpmdW5jdGlvbiBnZXRVaW50MzIodCl7cmV0dXJuIHVucGFja0kzMihnZXQodGhpcyw0LHQsYXJndW1lbnRzWzFdKSk+Pj4wfSxnZXRGbG9hdDMyOmZ1bmN0aW9uIGdldEZsb2F0MzIodCl7cmV0dXJuIHVucGFja0lFRUU3NTQoZ2V0KHRoaXMsNCx0LGFyZ3VtZW50c1sxXSksMjMsNCl9LGdldEZsb2F0NjQ6ZnVuY3Rpb24gZ2V0RmxvYXQ2NCh0KXtyZXR1cm4gdW5wYWNrSUVFRTc1NChnZXQodGhpcyw4LHQsYXJndW1lbnRzWzFdKSw1Miw4KX0sc2V0SW50ODpmdW5jdGlvbiBzZXRJbnQ4KHQsbil7c2V0KHRoaXMsMSx0LHBhY2tJOCxuKX0sc2V0VWludDg6ZnVuY3Rpb24gc2V0VWludDgodCxuKXtzZXQodGhpcywxLHQscGFja0k4LG4pfSxzZXRJbnQxNjpmdW5jdGlvbiBzZXRJbnQxNih0LG4pe3NldCh0aGlzLDIsdCxwYWNrSTE2LG4sYXJndW1lbnRzWzJdKX0sc2V0VWludDE2OmZ1bmN0aW9uIHNldFVpbnQxNih0LG4pe3NldCh0aGlzLDIsdCxwYWNrSTE2LG4sYXJndW1lbnRzWzJdKX0sc2V0SW50MzI6ZnVuY3Rpb24gc2V0SW50MzIodCxuKXtzZXQodGhpcyw0LHQscGFja0kzMixuLGFyZ3VtZW50c1syXSl9LHNldFVpbnQzMjpmdW5jdGlvbiBzZXRVaW50MzIodCxuKXtzZXQodGhpcyw0LHQscGFja0kzMixuLGFyZ3VtZW50c1syXSl9LHNldEZsb2F0MzI6ZnVuY3Rpb24gc2V0RmxvYXQzMih0LG4pe3NldCh0aGlzLDQsdCxwYWNrRjMyLG4sYXJndW1lbnRzWzJdKX0sc2V0RmxvYXQ2NDpmdW5jdGlvbiBzZXRGbG9hdDY0KHQsbil7c2V0KHRoaXMsOCx0LHBhY2tGNjQsbixhcmd1bWVudHNbMl0pfX0pO18obSwiQXJyYXlCdWZmZXIiKSxfKHgsIkRhdGFWaWV3IiksZih4W1NdLGMuVklFVywhMCksbi5BcnJheUJ1ZmZlcj1tLG4uRGF0YVZpZXc9eH0sZnVuY3Rpb24odCxuLHIpe3QuZXhwb3J0cz0hcig2KSYmIXIoMykoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KHIoNjMpKCJkaXYiKSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmF9KX0sZnVuY3Rpb24odCxuLHIpe24uZj1yKDUpfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigxMSksaT1yKDE1KSxvPXIoNTApKCExKSx1PXIoNjUpKCJJRV9QUk9UTyIpO3QuZXhwb3J0cz1mdW5jdGlvbih0LG4pe3ZhciByLGM9aSh0KSxmPTAsYT1bXTtmb3IociBpbiBjKXIhPXUmJmUoYyxyKSYmYS5wdXNoKHIpO2Zvcig7bi5sZW5ndGg+ZjspZShjLHI9bltmKytdKSYmKH5vKGEscil8fGEucHVzaChyKSk7cmV0dXJuIGF9fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cig3KSxpPXIoMSksbz1yKDM0KTt0LmV4cG9ydHM9cig2KT9PYmplY3QuZGVmaW5lUHJvcGVydGllczpmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHQsbil7aSh0KTtmb3IodmFyIHIsdT1vKG4pLGM9dS5sZW5ndGgsZj0wO2M+ZjspZS5mKHQscj11W2YrK10sbltyXSk7cmV0dXJuIHR9fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigxNSksaT1yKDM3KS5mLG89e30udG9TdHJpbmcsdT0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93JiZPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcz9PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpOltdLGM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiBpKHQpfWNhdGNoKG4pe3JldHVybiB1LnNsaWNlKCl9fTt0LmV4cG9ydHMuZj1mdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKHQpe3JldHVybiB1JiYiW29iamVjdCBXaW5kb3ddIj09by5jYWxsKHQpP2ModCk6aShlKHQpKX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDM0KSxpPXIoNTEpLG89cig0NyksdT1yKDkpLGM9cig0NiksZj1PYmplY3QuYXNzaWduO3QuZXhwb3J0cz0hZnx8cigzKShmdW5jdGlvbigpe3ZhciB0PXt9LG49e30scj1TeW1ib2woKSxlPSJhYmNkZWZnaGlqa2xtbm9wcXJzdCI7cmV0dXJuIHRbcl09NyxlLnNwbGl0KCIiKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe25bdF09dH0pLDchPWYoe30sdClbcl18fE9iamVjdC5rZXlzKGYoe30sbikpLmpvaW4oIiIpIT1lfSk/ZnVuY3Rpb24gYXNzaWduKHQsbil7Zm9yKHZhciByPXUodCksZj1hcmd1bWVudHMubGVuZ3RoLGE9MSxzPWkuZixsPW8uZjtmPmE7KWZvcih2YXIgaCxwPWMoYXJndW1lbnRzW2ErK10pLHY9cz9lKHApLmNvbmNhdChzKHApKTplKHApLGc9di5sZW5ndGgseT0wO2c+eTspbC5jYWxsKHAsaD12W3krK10pJiYocltoXT1wW2hdKTtyZXR1cm4gcn06Zn0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMTApLGk9cig0KSxvPXIoOTYpLHU9W10uc2xpY2UsYz17fSxmPWZ1bmN0aW9uKHQsbixyKXtpZighKG4gaW4gYykpe2Zvcih2YXIgZT1bXSxpPTA7aTxuO2krKyllW2ldPSJhWyIraSsiXSIKO2Nbbl09RnVuY3Rpb24oIkYsYSIsInJldHVybiBuZXcgRigiK2Uuam9pbigiLCIpKyIpIil9cmV0dXJuIGNbbl0odCxyKX07dC5leHBvcnRzPUZ1bmN0aW9uLmJpbmR8fGZ1bmN0aW9uIGJpbmQodCl7dmFyIG49ZSh0aGlzKSxyPXUuY2FsbChhcmd1bWVudHMsMSksYz1mdW5jdGlvbigpe3ZhciBlPXIuY29uY2F0KHUuY2FsbChhcmd1bWVudHMpKTtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGM/ZihuLGUubGVuZ3RoLGUpOm8obixlLHQpfTtyZXR1cm4gaShuLnByb3RvdHlwZSkmJihjLnByb3RvdHlwZT1uLnByb3RvdHlwZSksY319LGZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKHQsbixlKXt2YXIgaT1lPT09cjtzd2l0Y2gobi5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gaT90KCk6dC5jYWxsKGUpO2Nhc2UgMTpyZXR1cm4gaT90KG5bMF0pOnQuY2FsbChlLG5bMF0pO2Nhc2UgMjpyZXR1cm4gaT90KG5bMF0sblsxXSk6dC5jYWxsKGUsblswXSxuWzFdKTtjYXNlIDM6cmV0dXJuIGk/dChuWzBdLG5bMV0sblsyXSk6dC5jYWxsKGUsblswXSxuWzFdLG5bMl0pO2Nhc2UgNDpyZXR1cm4gaT90KG5bMF0sblsxXSxuWzJdLG5bM10pOnQuY2FsbChlLG5bMF0sblsxXSxuWzJdLG5bM10pfXJldHVybiB0LmFwcGx5KGUsbil9fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigxOSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsbil7aWYoIm51bWJlciIhPXR5cGVvZiB0JiYiTnVtYmVyIiE9ZSh0KSl0aHJvdyBUeXBlRXJyb3Iobik7cmV0dXJuK3R9fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cig0KSxpPU1hdGguZmxvb3I7dC5leHBvcnRzPWZ1bmN0aW9uIGlzSW50ZWdlcih0KXtyZXR1cm4hZSh0KSYmaXNGaW5pdGUodCkmJmkodCk9PT10fX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMikucGFyc2VGbG9hdCxpPXIoNDMpLnRyaW07dC5leHBvcnRzPTEvZShyKDcwKSsiLTAiKSE9LUluZmluaXR5P2Z1bmN0aW9uIHBhcnNlRmxvYXQodCl7dmFyIG49aShTdHJpbmcodCksMykscj1lKG4pO3JldHVybiAwPT09ciYmIi0iPT1uLmNoYXJBdCgwKT8tMDpyfTplfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigyKS5wYXJzZUludCxpPXIoNDMpLnRyaW0sbz1yKDcwKSx1PS9eWy0rXT8wW3hYXS87dC5leHBvcnRzPTghPT1lKG8rIjA4Iil8fDIyIT09ZShvKyIweDE2Iik/ZnVuY3Rpb24gcGFyc2VJbnQodCxuKXt2YXIgcj1pKFN0cmluZyh0KSwzKTtyZXR1cm4gZShyLG4+Pj4wfHwodS50ZXN0KHIpPzE2OjEwKSl9OmV9LGZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPU1hdGgubG9nMXB8fGZ1bmN0aW9uIGxvZzFwKHQpe3JldHVybih0PSt0KT4tMWUtOCYmdDwxZS04P3QtdCp0LzI6TWF0aC5sb2coMSt0KX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDcyKSxpPU1hdGgucG93LG89aSgyLC01MiksdT1pKDIsLTIzKSxjPWkoMiwxMjcpKigyLXUpLGY9aSgyLC0xMjYpLGE9ZnVuY3Rpb24odCl7cmV0dXJuIHQrMS9vLTEvb307dC5leHBvcnRzPU1hdGguZnJvdW5kfHxmdW5jdGlvbiBmcm91bmQodCl7dmFyIG4scixpPU1hdGguYWJzKHQpLHM9ZSh0KTtyZXR1cm4gaTxmP3MqYShpL2YvdSkqZip1OihuPSgxK3UvbykqaSwocj1uLShuLWkpKT5jfHxyIT1yP3MqSW5maW5pdHk6cypyKX19LGZ1bmN0aW9uKHQsbixlKXt2YXIgaT1lKDEpO3QuZXhwb3J0cz1mdW5jdGlvbih0LG4sZSxvKXt0cnl7cmV0dXJuIG8/bihpKGUpWzBdLGVbMV0pOm4oZSl9Y2F0Y2goYyl7dmFyIHU9dFsicmV0dXJuIl07dGhyb3cgdSE9PXImJmkodS5jYWxsKHQpKSxjfX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDEwKSxpPXIoOSksbz1yKDQ2KSx1PXIoOCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsbixyLGMsZil7ZShuKTt2YXIgYT1pKHQpLHM9byhhKSxsPXUoYS5sZW5ndGgpLGg9Zj9sLTE6MCxwPWY/LTE6MTtpZihyPDIpZm9yKDs7KXtpZihoIGluIHMpe2M9c1toXSxoKz1wO2JyZWFrfWlmKGgrPXAsZj9oPDA6bDw9aCl0aHJvdyBUeXBlRXJyb3IoIlJlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUiKX1mb3IoO2Y/aD49MDpsPmg7aCs9cCloIGluIHMmJihjPW4oYyxzW2hdLGgsYSkpO3JldHVybiBjfX0sZnVuY3Rpb24odCxuLGUpe3ZhciBpPWUoOSksbz1lKDM1KSx1PWUoOCk7dC5leHBvcnRzPVtdLmNvcHlXaXRoaW58fGZ1bmN0aW9uIGNvcHlXaXRoaW4odCxuKXt2YXIgZT1pKHRoaXMpLGM9dShlLmxlbmd0aCksZj1vKHQsYyksYT1vKG4sYykscz1hcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnIsbD1NYXRoLm1pbigocz09PXI/YzpvKHMsYykpLWEsYy1mKSxoPTE7Zm9yKGE8ZiYmZjxhK2wmJihoPS0xLGErPWwtMSxmKz1sLTEpO2wtLSA+MDspYSBpbiBlP2VbZl09ZVthXTpkZWxldGUgZVtmXSxmKz1oLGErPWg7cmV0dXJuIGV9fSxmdW5jdGlvbih0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbih0LG4pe3JldHVybnt2YWx1ZTpuLGRvbmU6ISF0fX19LGZ1bmN0aW9uKHQsbixyKXtyKDYpJiYiZyIhPS8uL2cuZmxhZ3MmJnIoNykuZihSZWdFeHAucHJvdG90eXBlLCJmbGFncyIse2NvbmZpZ3VyYWJsZTohMCxnZXQ6cig1NSl9KX0sZnVuY3Rpb24odCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybntlOiExLHY6dCgpfX1jYXRjaChuKXtyZXR1cm57ZTohMCx2Om59fX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDEpLGk9cig0KSxvPXIoODcpO3QuZXhwb3J0cz1mdW5jdGlvbih0LG4pe2lmKGUodCksaShuKSYmbi5jb25zdHJ1Y3Rvcj09PXQpcmV0dXJuIG47dmFyIHI9by5mKHQpO3JldHVybigwLHIucmVzb2x2ZSkobiksci5wcm9taXNlfX0sZnVuY3Rpb24odCxuLGUpe3ZhciBpPWUoMTExKSxvPWUoNDUpO3QuZXhwb3J0cz1lKDU4KSgiTWFwIixmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gTWFwKCl7cmV0dXJuIHQodGhpcyxhcmd1bWVudHMubGVuZ3RoPjA/YXJndW1lbnRzWzBdOnIpfX0se2dldDpmdW5jdGlvbiBnZXQodCl7dmFyIG49aS5nZXRFbnRyeShvKHRoaXMsIk1hcCIpLHQpO3JldHVybiBuJiZuLnZ9LHNldDpmdW5jdGlvbiBzZXQodCxuKXtyZXR1cm4gaS5kZWYobyh0aGlzLCJNYXAiKSwwPT09dD8wOnQsbil9fSxpLCEwKX0sZnVuY3Rpb24odCxuLGUpe3ZhciBpPWUoNykuZixvPWUoMzYpLHU9ZSg0MSksYz1lKDE4KSxmPWUoMzkpLGE9ZSg0MCkscz1lKDc3KSxsPWUoMTA2KSxoPWUoMzgpLHA9ZSg2KSx2PWUoMjkpLmZhc3RLZXksZz1lKDQ1KSx5PXA/Il9zIjoic2l6ZSIsZD1mdW5jdGlvbih0LG4pe3ZhciByLGU9dihuKTtpZigiRiIhPT1lKXJldHVybiB0Ll9pW2VdO2ZvcihyPXQuX2Y7cjtyPXIubilpZihyLms9PW4pcmV0dXJuIHJ9O3QuZXhwb3J0cz17Z2V0Q29uc3RydWN0b3I6ZnVuY3Rpb24odCxuLGUscyl7dmFyIGw9dChmdW5jdGlvbih0LGkpe2YodCxsLG4sIl9pIiksdC5fdD1uLHQuX2k9byhudWxsKSx0Ll9mPXIsdC5fbD1yLHRbeV09MCxpIT1yJiZhKGksZSx0W3NdLHQpfSk7cmV0dXJuIHUobC5wcm90b3R5cGUse2NsZWFyOmZ1bmN0aW9uIGNsZWFyKCl7Zm9yKHZhciB0PWcodGhpcyxuKSxlPXQuX2ksaT10Ll9mO2k7aT1pLm4paS5yPSEwLGkucCYmKGkucD1pLnAubj1yKSxkZWxldGUgZVtpLmldO3QuX2Y9dC5fbD1yLHRbeV09MH0sImRlbGV0ZSI6ZnVuY3Rpb24odCl7dmFyIHI9Zyh0aGlzLG4pLGU9ZChyLHQpO2lmKGUpe3ZhciBpPWUubixvPWUucDtkZWxldGUgci5faVtlLmldLGUucj0hMCxvJiYoby5uPWkpLGkmJihpLnA9byksci5fZj09ZSYmKHIuX2Y9aSksci5fbD09ZSYmKHIuX2w9byksclt5XS0tfXJldHVybiEhZX0sZm9yRWFjaDpmdW5jdGlvbiBmb3JFYWNoKHQpe2codGhpcyxuKTtmb3IodmFyIGUsaT1jKHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTpyLDMpO2U9ZT9lLm46dGhpcy5fZjspZm9yKGkoZS52LGUuayx0aGlzKTtlJiZlLnI7KWU9ZS5wfSxoYXM6ZnVuY3Rpb24gaGFzKHQpe3JldHVybiEhZChnKHRoaXMsbiksdCl9fSkscCYmaShsLnByb3RvdHlwZSwic2l6ZSIse2dldDpmdW5jdGlvbigpe3JldHVybiBnKHRoaXMsbilbeV19fSksbH0sZGVmOmZ1bmN0aW9uKHQsbixlKXt2YXIgaSxvLHU9ZCh0LG4pO3JldHVybiB1P3Uudj1lOih0Ll9sPXU9e2k6bz12KG4sITApLGs6bix2OmUscDppPXQuX2wsbjpyLHI6ITF9LHQuX2Z8fCh0Ll9mPXUpLGkmJihpLm49dSksdFt5XSsrLCJGIiE9PW8mJih0Ll9pW29dPXUpKSx0fSxnZXRFbnRyeTpkLHNldFN0cm9uZzpmdW5jdGlvbih0LG4sZSl7cyh0LG4sZnVuY3Rpb24odCxlKXt0aGlzLl90PWcodCxuKSx0aGlzLl9rPWUsdGhpcy5fbD1yfSxmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLG49dC5fayxlPXQuX2w7ZSYmZS5yOyllPWUucDtyZXR1cm4gdC5fdCYmKHQuX2w9ZT1lP2Uubjp0Ll90Ll9mKT8ia2V5cyI9PW4/bCgwLGUuayk6InZhbHVlcyI9PW4/bCgwLGUudik6bCgwLFtlLmssZS52XSk6KHQuX3Q9cixsKDEpKX0sZT8iZW50cmllcyI6InZhbHVlcyIsIWUsITApLGgobil9fX0sZnVuY3Rpb24odCxuLGUpe3ZhciBpPWUoMTExKSxvPWUoNDUpO3QuZXhwb3J0cz1lKDU4KSgiU2V0IixmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gU2V0KCl7cmV0dXJuIHQodGhpcyxhcmd1bWVudHMubGVuZ3RoPjA/YXJndW1lbnRzWzBdOnIpfX0se2FkZDpmdW5jdGlvbiBhZGQodCl7cmV0dXJuIGkuZGVmKG8odGhpcywiU2V0IiksdD0wPT09dD8wOnQsdCl9fSxpKX0sZnVuY3Rpb24odCxuLGUpe3ZhciBpLG89ZSgyNSkoMCksdT1lKDEzKSxjPWUoMjkpLGY9ZSg5NCksYT1lKDExNCkscz1lKDQpLGw9ZSgzKSxoPWUoNDUpLHA9Yy5nZXRXZWFrLHY9T2JqZWN0LmlzRXh0ZW5zaWJsZSxnPWEudWZzdG9yZSx5PXt9LGQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIFdlYWtNYXAoKXtyZXR1cm4gdCh0aGlzLGFyZ3VtZW50cy5sZW5ndGg+MD9hcmd1bWVudHNbMF06cil9fSxfPXtnZXQ6ZnVuY3Rpb24gZ2V0KHQpe2lmKHModCkpe3ZhciBuPXAodCk7cmV0dXJuITA9PT1uP2coaCh0aGlzLCJXZWFrTWFwIikpLmdldCh0KTpuP25bdGhpcy5faV06cn19LHNldDpmdW5jdGlvbiBzZXQodCxuKXtyZXR1cm4gYS5kZWYoaCh0aGlzLCJXZWFrTWFwIiksdCxuKX19LFM9dC5leHBvcnRzPWUoNTgpKCJXZWFrTWFwIixkLF8sYSwhMCwhMCk7bChmdW5jdGlvbigpe3JldHVybiA3IT0obmV3IFMpLnNldCgoT2JqZWN0LmZyZWV6ZXx8T2JqZWN0KSh5KSw3KS5nZXQoeSl9KSYmKGYoKGk9YS5nZXRDb25zdHJ1Y3RvcihkLCJXZWFrTWFwIikpLnByb3RvdHlwZSxfKSxjLk5FRUQ9ITAsbyhbImRlbGV0ZSIsImhhcyIsImdldCIsInNldCJdLGZ1bmN0aW9uKHQpe3ZhciBuPVMucHJvdG90eXBlLHI9blt0XTt1KG4sdCxmdW5jdGlvbihuLGUpe2lmKHMobikmJiF2KG4pKXt0aGlzLl9mfHwodGhpcy5fZj1uZXcgaSk7dmFyIG89dGhpcy5fZlt0XShuLGUpO3JldHVybiJzZXQiPT10P3RoaXM6b31yZXR1cm4gci5jYWxsKHRoaXMsbixlKX0pfSkpfSxmdW5jdGlvbih0LG4sZSl7dmFyIGk9ZSg0MSksbz1lKDI5KS5nZXRXZWFrLHU9ZSgxKSxjPWUoNCksZj1lKDM5KSxhPWUoNDApLHM9ZSgyNSksbD1lKDExKSxoPWUoNDUpLHA9cyg1KSx2PXMoNiksZz0wLHk9ZnVuY3Rpb24odCl7cmV0dXJuIHQuX2x8fCh0Ll9sPW5ldyBkKX0sZD1mdW5jdGlvbigpe3RoaXMuYT1bXX0sXz1mdW5jdGlvbih0LG4pe3JldHVybiBwKHQuYSxmdW5jdGlvbih0KXtyZXR1cm4gdFswXT09PW59KX07ZC5wcm90b3R5cGU9e2dldDpmdW5jdGlvbih0KXt2YXIgbj1fKHRoaXMsdCk7aWYobilyZXR1cm4gblsxXX0saGFzOmZ1bmN0aW9uKHQpe3JldHVybiEhXyh0aGlzLHQpfSxzZXQ6ZnVuY3Rpb24odCxuKXt2YXIgcj1fKHRoaXMsdCk7cj9yWzFdPW46dGhpcy5hLnB1c2goW3Qsbl0pfSwiZGVsZXRlIjpmdW5jdGlvbih0KXt2YXIgbj12KHRoaXMuYSxmdW5jdGlvbihuKXtyZXR1cm4gblswXT09PXR9KTtyZXR1cm5+biYmdGhpcy5hLnNwbGljZShuLDEpLCEhfm59fSx0LmV4cG9ydHM9e2dldENvbnN0cnVjdG9yOmZ1bmN0aW9uKHQsbixlLHUpe3ZhciBzPXQoZnVuY3Rpb24odCxpKXtmKHQscyxuLCJfaSIpLHQuX3Q9bix0Ll9pPWcrKyx0Ll9sPXIsaSE9ciYmYShpLGUsdFt1XSx0KX0pO3JldHVybiBpKHMucHJvdG90eXBlLHsiZGVsZXRlIjpmdW5jdGlvbih0KXtpZighYyh0KSlyZXR1cm4hMTt2YXIgcj1vKHQpO3JldHVybiEwPT09cj95KGgodGhpcyxuKSlbImRlbGV0ZSJdKHQpOnImJmwocix0aGlzLl9pKSYmZGVsZXRlIHJbdGhpcy5faV19LGhhczpmdW5jdGlvbiBoYXModCl7aWYoIWModCkpcmV0dXJuITE7dmFyIHI9byh0KTtyZXR1cm4hMD09PXI/eShoKHRoaXMsbikpLmhhcyh0KTpyJiZsKHIsdGhpcy5faSl9fSksc30sZGVmOmZ1bmN0aW9uKHQsbixyKXt2YXIgZT1vKHUobiksITApO3JldHVybiEwPT09ZT95KHQpLnNldChuLHIpOmVbdC5faV09cix0fSx1ZnN0b3JlOnl9fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigzNyksaT1yKDUxKSxvPXIoMSksdT1yKDIpLlJlZmxlY3Q7dC5leHBvcnRzPXUmJnUub3duS2V5c3x8ZnVuY3Rpb24gb3duS2V5cyh0KXt2YXIgbj1lLmYobyh0KSkscj1pLmY7cmV0dXJuIHI/bi5jb25jYXQocih0KSk6bn19LGZ1bmN0aW9uKHQsbixlKXt2YXIgaT1lKDIzKSxvPWUoOCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHQ9PT1yKXJldHVybiAwO3ZhciBuPWkodCksZT1vKG4pO2lmKG4hPT1lKXRocm93IFJhbmdlRXJyb3IoIldyb25nIGxlbmd0aCEiKTtyZXR1cm4gZX19LGZ1bmN0aW9uKHQsbixlKXtmdW5jdGlvbiBmbGF0dGVuSW50b0FycmF5KHQsbixlLGEscyxsLGgscCl7Zm9yKHZhciB2LGcseT1zLGQ9MCxfPSEhaCYmYyhoLHAsMyk7ZDxhOyl7aWYoZCBpbiBlKXtpZih2PV8/XyhlW2RdLGQsbik6ZVtkXSxnPSExLG8odikmJihnPShnPXZbZl0pIT09cj8hIWc6aSh2KSksZyYmbD4wKXk9ZmxhdHRlbkludG9BcnJheSh0LG4sdix1KHYubGVuZ3RoKSx5LGwtMSktMTtlbHNle2lmKHk+PTkwMDcxOTkyNTQ3NDA5OTEpdGhyb3cgVHlwZUVycm9yKCk7dFt5XT12fXkrK31kKyt9cmV0dXJuIHl9dmFyIGk9ZSg1Miksbz1lKDQpLHU9ZSg4KSxjPWUoMTgpLGY9ZSg1KSgiaXNDb25jYXRTcHJlYWRhYmxlIik7dC5leHBvcnRzPWZsYXR0ZW5JbnRvQXJyYXl9LGZ1bmN0aW9uKHQsbixlKXt2YXIgaT1lKDgpLG89ZSg3MSksdT1lKDIyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxuLGUsYyl7dmFyIGY9U3RyaW5nKHUodCkpLGE9Zi5sZW5ndGgscz1lPT09cj8iICI6U3RyaW5nKGUpLGw9aShuKTtpZihsPD1hfHwiIj09cylyZXR1cm4gZjt2YXIgaD1sLWEscD1vLmNhbGwocyxNYXRoLmNlaWwoaC9zLmxlbmd0aCkpO3JldHVybiBwLmxlbmd0aD5oJiYocD1wLnNsaWNlKDAsaCkpLGM/cCtmOmYrcH19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDM0KSxpPXIoMTUpLG89cig0NykuZjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe2Zvcih2YXIgcix1PWkobiksYz1lKHUpLGY9Yy5sZW5ndGgsYT0wLHM9W107Zj5hOylvLmNhbGwodSxyPWNbYSsrXSkmJnMucHVzaCh0P1tyLHVbcl1dOnVbcl0pO3JldHVybiBzfX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDQ4KSxpPXIoMTIxKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIHRvSlNPTigpe2lmKGUodGhpcykhPXQpdGhyb3cgVHlwZUVycm9yKHQrIiN0b0pTT04gaXNuJ3QgZ2VuZXJpYyIpO3JldHVybiBpKHRoaXMpfX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDQwKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxuKXt2YXIgcj1bXTtyZXR1cm4gZSh0LCExLHIucHVzaCxyLG4pLHJ9fSxmdW5jdGlvbih0LG4pe3QuZXhwb3J0cz1NYXRoLnNjYWxlfHxmdW5jdGlvbiBzY2FsZSh0LG4scixlLGkpe3JldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aHx8dCE9dHx8biE9bnx8ciE9cnx8ZSE9ZXx8aSE9aT9OYU46dD09PUluZmluaXR5fHx0PT09LUluZmluaXR5P3Q6KHQtbikqKGktZSkvKHItbikrZX19LGZ1bmN0aW9uKHQsbixyKXtyKDEyNCkscigxMjYpLHIoMTI3KSxyKDEyOCkscigxMjkpLHIoMTMwKSxyKDEzMSkscigxMzIpLHIoMTMzKSxyKDEzNCkscigxMzUpLHIoMTM2KSxyKDEzNykscigxMzgpLHIoMTM5KSxyKDE0MCkscigxNDIpLHIoMTQzKSxyKDE0NCkscigxNDUpLHIoMTQ2KSxyKDE0NykscigxNDgpLHIoMTQ5KSxyKDE1MCkscigxNTEpLHIoMTUyKSxyKDE1MykscigxNTQpLHIoMTU1KSxyKDE1NikscigxNTcpLHIoMTU4KSxyKDE1OSkscigxNjApLHIoMTYxKSxyKDE2MikscigxNjMpLHIoMTY0KSxyKDE2NSkscigxNjYpLHIoMTY3KSxyKDE2OCkscigxNjkpLHIoMTcwKSxyKDE3MSkscigxNzIpLHIoMTczKSxyKDE3NCkscigxNzUpLHIoMTc2KSxyKDE3NykscigxNzgpLHIoMTc5KSxyKDE4MCkscigxODEpLHIoMTgyKSxyKDE4MykscigxODQpLHIoMTg1KSxyKDE4NikscigxODcpLHIoMTg4KSxyKDE4OSkscigxOTApLHIoMTkxKSxyKDE5MikscigxOTMpLHIoMTk0KSxyKDE5NSkscigxOTYpLHIoMTk3KSxyKDE5OCkscigxOTkpLHIoMjAwKSxyKDIwMSkscigyMDIpLHIoMjAzKSxyKDIwNCkscigyMDUpLHIoMjA2KSxyKDIwOCkscigyMDkpLHIoMjEwKSxyKDIxMSkscigyMTIpLHIoMjEzKSxyKDIxNCkscigyMTUpLHIoMjE2KSxyKDIxNykscigyMTgpLHIoMjE5KSxyKDg0KSxyKDIyMCkscigyMjEpLHIoMjIyKSxyKDEwNykscigyMjMpLHIoMjI0KSxyKDIyNSkscigyMjYpLHIoMjI3KSxyKDExMCkscigxMTIpLHIoMTEzKSxyKDIyOCkscigyMjkpLHIoMjMwKSxyKDIzMSkscigyMzIpLHIoMjMzKSxyKDIzNCkscigyMzUpLHIoMjM2KSxyKDIzNykscigyMzgpLHIoMjM5KSxyKDI0MCkscigyNDEpLHIoMjQyKSxyKDI0MykscigyNDQpLHIoMjQ1KSxyKDI0NykscigyNDgpLHIoMjUwKSxyKDI1MSkscigyNTIpLHIoMjUzKSxyKDI1NCkscigyNTUpLHIoMjU2KSxyKDI1NykscigyNTgpLHIoMjU5KSxyKDI2MCkscigyNjEpLHIoMjYyKSxyKDI2MykscigyNjQpLHIoMjY1KSxyKDI2NikscigyNjcpLHIoMjY4KSxyKDI2OSkscigyNzApLHIoMjcxKSxyKDI3MikscigyNzMpLHIoMjc0KSxyKDI3NSkscigyNzYpLHIoMjc3KSxyKDI3OCkscigyNzkpLHIoMjgwKSxyKDI4MSkscigyODIpLHIoMjgzKSxyKDI4NCkscigyODUpLHIoMjg2KSxyKDI4NykscigyODgpLHIoMjg5KSxyKDI5MCkscigyOTEpLHIoMjkyKSxyKDI5MykscigyOTQpLHIoMjk1KSxyKDI5NikscigyOTcpLHIoMjk4KSxyKDI5OSkscigzMDApLHIoMzAxKSxyKDMwMikscigzMDMpLHIoMzA0KSxyKDMwNSkscigzMDYpLHIoMzA3KSxyKDMwOCkscigzMDkpLHIoMzEwKSxyKDMxMSkscigzMTIpLHIoMzEzKSxyKDMxNCkscigzMTUpLHIoMzE2KSxyKDMxNykscigzMTgpLHQuZXhwb3J0cz1yKDMxOSl9LGZ1bmN0aW9uKHQsbixlKXt2YXIgaT1lKDIpLG89ZSgxMSksdT1lKDYpLGM9ZSgwKSxmPWUoMTMpLGE9ZSgyOSkuS0VZLHM9ZSgzKSxsPWUoNDkpLGg9ZSg0MikscD1lKDMyKSx2PWUoNSksZz1lKDkwKSx5PWUoNjQpLGQ9ZSgxMjUpLF89ZSg1MiksUz1lKDEpLGI9ZSgxNSksbT1lKDIxKSx4PWUoMzEpLHc9ZSgzNiksRT1lKDkzKSxPPWUoMTYpLFA9ZSg3KSxNPWUoMzQpLEk9Ty5mLEY9UC5mLEE9RS5mLGs9aS5TeW1ib2wsTj1pLkpTT04saj1OJiZOLnN0cmluZ2lmeSxSPXYoIl9oaWRkZW4iKSxUPXYoInRvUHJpbWl0aXZlIiksTD17fS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxEPWwoInN5bWJvbC1yZWdpc3RyeSIpLFc9bCgic3ltYm9scyIpLEM9bCgib3Atc3ltYm9scyIpLFU9T2JqZWN0LnByb3RvdHlwZSxHPSJmdW5jdGlvbiI9PXR5cGVvZiBrLEI9aS5RT2JqZWN0LFY9IUJ8fCFCLnByb3RvdHlwZXx8IUIucHJvdG90eXBlLmZpbmRDaGlsZCx6PXUmJnMoZnVuY3Rpb24oKXtyZXR1cm4gNyE9dyhGKHt9LCJhIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEYodGhpcywiYSIse3ZhbHVlOjd9KS5hfX0pKS5hfSk/ZnVuY3Rpb24odCxuLHIpe3ZhciBlPUkoVSxuKTtlJiZkZWxldGUgVVtuXSxGKHQsbixyKSxlJiZ0IT09VSYmRihVLG4sZSl9OkYscT1mdW5jdGlvbih0KXt2YXIgbj1XW3RdPXcoay5wcm90b3R5cGUpO3JldHVybiBuLl9rPXQsbn0sSz1HJiYic3ltYm9sIj09dHlwZW9mIGsuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIGt9LEo9ZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkodCxuLHIpe3JldHVybiB0PT09VSYmSihDLG4sciksUyh0KSxuPW0obiwhMCksUyhyKSxvKFcsbik/KHIuZW51bWVyYWJsZT8obyh0LFIpJiZ0W1JdW25dJiYodFtSXVtuXT0hMSkscj13KHIse2VudW1lcmFibGU6eCgwLCExKX0pKToobyh0LFIpfHxGKHQsUix4KDEse30pKSx0W1JdW25dPSEwKSx6KHQsbixyKSk6Rih0LG4scil9LFk9ZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0LG4pe1ModCk7Zm9yKHZhciByLGU9ZChuPWIobikpLGk9MCxvPWUubGVuZ3RoO28+aTspSih0LHI9ZVtpKytdLG5bcl0pO3JldHVybiB0fSxIPWZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKHQpe3ZhciBuPUwuY2FsbCh0aGlzLHQ9bSh0LCEwKSk7cmV0dXJuISh0aGlzPT09VSYmbyhXLHQpJiYhbyhDLHQpKSYmKCEobnx8IW8odGhpcyx0KXx8IW8oVyx0KXx8byh0aGlzLFIpJiZ0aGlzW1JdW3RdKXx8bil9LFg9ZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsbil7aWYodD1iKHQpLG49bShuLCEwKSx0IT09VXx8IW8oVyxuKXx8byhDLG4pKXt2YXIgcj1JKHQsbik7cmV0dXJuIXJ8fCFvKFcsbil8fG8odCxSKSYmdFtSXVtuXXx8KHIuZW51bWVyYWJsZT0hMCkscn19LFo9ZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyh0KXtmb3IodmFyIG4scj1BKGIodCkpLGU9W10saT0wO3IubGVuZ3RoPmk7KW8oVyxuPXJbaSsrXSl8fG49PVJ8fG49PWF8fGUucHVzaChuKTtyZXR1cm4gZX0sJD1mdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHModCl7Zm9yKHZhciBuLHI9dD09PVUsZT1BKHI/QzpiKHQpKSxpPVtdLHU9MDtlLmxlbmd0aD51OykhbyhXLG49ZVt1KytdKXx8ciYmIW8oVSxuKXx8aS5wdXNoKFdbbl0pO3JldHVybiBpfTtHfHwoZigoaz1mdW5jdGlvbiBTeW1ib2woKXtpZih0aGlzIGluc3RhbmNlb2Ygayl0aHJvdyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciEiKTt2YXIgdD1wKGFyZ3VtZW50cy5sZW5ndGg+MD9hcmd1bWVudHNbMF06ciksbj1mdW5jdGlvbihyKXt0aGlzPT09VSYmbi5jYWxsKEMsciksbyh0aGlzLFIpJiZvKHRoaXNbUl0sdCkmJih0aGlzW1JdW3RdPSExKSx6KHRoaXMsdCx4KDEscikpfTtyZXR1cm4gdSYmViYmeihVLHQse2NvbmZpZ3VyYWJsZTohMCxzZXQ6bn0pLHEodCl9KS5wcm90b3R5cGUsInRvU3RyaW5nIixmdW5jdGlvbiB0b1N0cmluZygpe3JldHVybiB0aGlzLl9rfSksTy5mPVgsUC5mPUosZSgzNykuZj1FLmY9WixlKDQ3KS5mPUgsZSg1MSkuZj0kLHUmJiFlKDMzKSYmZihVLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsSCwhMCksZy5mPWZ1bmN0aW9uKHQpe3JldHVybiBxKHYodCkpfSksYyhjLkcrYy5XK2MuRiohRyx7U3ltYm9sOmt9KTtmb3IodmFyIFE9Imhhc0luc3RhbmNlLGlzQ29uY2F0U3ByZWFkYWJsZSxpdGVyYXRvcixtYXRjaCxyZXBsYWNlLHNlYXJjaCxzcGVjaWVzLHNwbGl0LHRvUHJpbWl0aXZlLHRvU3RyaW5nVGFnLHVuc2NvcGFibGVzIi5zcGxpdCgiLCIpLHR0PTA7US5sZW5ndGg+dHQ7KXYoUVt0dCsrXSk7Zm9yKHZhciBudD1NKHYuc3RvcmUpLHJ0PTA7bnQubGVuZ3RoPnJ0Oyl5KG50W3J0KytdKTtjKGMuUytjLkYqIUcsIlN5bWJvbCIseyJmb3IiOmZ1bmN0aW9uKHQpe3JldHVybiBvKEQsdCs9IiIpP0RbdF06RFt0XT1rKHQpfSxrZXlGb3I6ZnVuY3Rpb24ga2V5Rm9yKHQpe2lmKCFLKHQpKXRocm93IFR5cGVFcnJvcih0KyIgaXMgbm90IGEgc3ltYm9sISIpO2Zvcih2YXIgbiBpbiBEKWlmKERbbl09PT10KXJldHVybiBufSx1c2VTZXR0ZXI6ZnVuY3Rpb24oKXtWPSEwfSx1c2VTaW1wbGU6ZnVuY3Rpb24oKXtWPSExfX0pLGMoYy5TK2MuRiohRywiT2JqZWN0Iix7Y3JlYXRlOmZ1bmN0aW9uIGNyZWF0ZSh0LG4pe3JldHVybiBuPT09cj93KHQpOlkodyh0KSxuKX0sZGVmaW5lUHJvcGVydHk6SixkZWZpbmVQcm9wZXJ0aWVzOlksZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOlgsZ2V0T3duUHJvcGVydHlOYW1lczpaLGdldE93blByb3BlcnR5U3ltYm9sczokfSksTiYmYyhjLlMrYy5GKighR3x8cyhmdW5jdGlvbigpe3ZhciB0PWsoKTtyZXR1cm4iW251bGxdIiE9aihbdF0pfHwie30iIT1qKHthOnR9KXx8Int9IiE9aihPYmplY3QodCkpfSkpLCJKU09OIix7c3RyaW5naWZ5OmZ1bmN0aW9uIHN0cmluZ2lmeSh0KXtpZih0IT09ciYmIUsodCkpe2Zvcih2YXIgbixlLGk9W3RdLG89MTthcmd1bWVudHMubGVuZ3RoPm87KWkucHVzaChhcmd1bWVudHNbbysrXSk7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mKG49aVsxXSkmJihlPW4pLCFlJiZfKG4pfHwobj1mdW5jdGlvbih0LG4pe2lmKGUmJihuPWUuY2FsbCh0aGlzLHQsbikpLCFLKG4pKXJldHVybiBufSksaVsxXT1uLGouYXBwbHkoTixpKX19fSksay5wcm90b3R5cGVbVF18fGUoMTIpKGsucHJvdG90eXBlLFQsay5wcm90b3R5cGUudmFsdWVPZiksaChrLCJTeW1ib2wiKSxoKE1hdGgsIk1hdGgiLCEwKSxoKGkuSlNPTiwiSlNPTiIsITApfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigzNCksaT1yKDUxKSxvPXIoNDcpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgbj1lKHQpLHI9aS5mO2lmKHIpZm9yKHZhciB1LGM9cih0KSxmPW8uZixhPTA7Yy5sZW5ndGg+YTspZi5jYWxsKHQsdT1jW2ErK10pJiZuLnB1c2godSk7cmV0dXJuIG59fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKTtlKGUuUytlLkYqIXIoNiksIk9iamVjdCIse2RlZmluZVByb3BlcnR5OnIoNykuZn0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKTtlKGUuUytlLkYqIXIoNiksIk9iamVjdCIse2RlZmluZVByb3BlcnRpZXM6cig5Mil9KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMTUpLGk9cigxNikuZjtyKDI0KSgiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIixmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKXtyZXR1cm4gaShlKHQpLG4pfX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKTtlKGUuUywiT2JqZWN0Iix7Y3JlYXRlOnIoMzYpfSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDkpLGk9cigxNyk7cigyNCkoImdldFByb3RvdHlwZU9mIixmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZih0KXtyZXR1cm4gaShlKHQpKX19KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoOSksaT1yKDM0KTtyKDI0KSgia2V5cyIsZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24ga2V5cyh0KXtyZXR1cm4gaShlKHQpKX19KX0sZnVuY3Rpb24odCxuLHIpe3IoMjQpKCJnZXRPd25Qcm9wZXJ0eU5hbWVzIixmdW5jdGlvbigpe3JldHVybiByKDkzKS5mfSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDQpLGk9cigyOSkub25GcmVlemU7cigyNCkoImZyZWV6ZSIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIGZyZWV6ZShuKXtyZXR1cm4gdCYmZShuKT90KGkobikpOm59fSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDQpLGk9cigyOSkub25GcmVlemU7cigyNCkoInNlYWwiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBzZWFsKG4pe3JldHVybiB0JiZlKG4pP3QoaShuKSk6bn19KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoNCksaT1yKDI5KS5vbkZyZWV6ZTtyKDI0KSgicHJldmVudEV4dGVuc2lvbnMiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyhuKXtyZXR1cm4gdCYmZShuKT90KGkobikpOm59fSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDQpO3IoMjQpKCJpc0Zyb3plbiIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIGlzRnJvemVuKG4pe3JldHVybiFlKG4pfHwhIXQmJnQobil9fSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDQpO3IoMjQpKCJpc1NlYWxlZCIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIGlzU2VhbGVkKG4pe3JldHVybiFlKG4pfHwhIXQmJnQobil9fSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDQpO3IoMjQpKCJpc0V4dGVuc2libGUiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBpc0V4dGVuc2libGUobil7cmV0dXJuISFlKG4pJiYoIXR8fHQobikpfX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKTtlKGUuUytlLkYsIk9iamVjdCIse2Fzc2lnbjpyKDk0KX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKTtlKGUuUywiT2JqZWN0Iix7aXM6cigxNDEpfSl9LGZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPU9iamVjdC5pc3x8ZnVuY3Rpb24gaXModCxuKXtyZXR1cm4gdD09PW4/MCE9PXR8fDEvdD09MS9uOnQhPXQmJm4hPW59fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKTtlKGUuUywiT2JqZWN0Iix7c2V0UHJvdG90eXBlT2Y6cig2OCkuc2V0fSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDQ4KSxpPXt9O2lbcig1KSgidG9TdHJpbmdUYWciKV09InoiLGkrIiIhPSJbb2JqZWN0IHpdIiYmcigxMykoT2JqZWN0LnByb3RvdHlwZSwidG9TdHJpbmciLGZ1bmN0aW9uIHRvU3RyaW5nKCl7cmV0dXJuIltvYmplY3QgIitlKHRoaXMpKyJdIn0sITApfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKTtlKGUuUCwiRnVuY3Rpb24iLHtiaW5kOnIoOTUpfSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDcpLmYsaT1GdW5jdGlvbi5wcm90b3R5cGUsbz0vXlxzKmZ1bmN0aW9uIChbXiAoXSopLzsibmFtZSJpbiBpfHxyKDYpJiZlKGksIm5hbWUiLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7dHJ5e3JldHVybigiIit0aGlzKS5tYXRjaChvKVsxXX1jYXRjaCh0KXtyZXR1cm4iIn19fSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDQpLGk9cigxNyksbz1yKDUpKCJoYXNJbnN0YW5jZSIpLHU9RnVuY3Rpb24ucHJvdG90eXBlO28gaW4gdXx8cig3KS5mKHUsbyx7dmFsdWU6ZnVuY3Rpb24odCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHRoaXN8fCFlKHQpKXJldHVybiExO2lmKCFlKHRoaXMucHJvdG90eXBlKSlyZXR1cm4gdCBpbnN0YW5jZW9mIHRoaXM7Zm9yKDt0PWkodCk7KWlmKHRoaXMucHJvdG90eXBlPT09dClyZXR1cm4hMDtyZXR1cm4hMX19KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMiksaT1yKDExKSxvPXIoMTkpLHU9cig2OSksYz1yKDIxKSxmPXIoMyksYT1yKDM3KS5mLHM9cigxNikuZixsPXIoNykuZixoPXIoNDMpLnRyaW0scD1lLk51bWJlcix2PXAsZz1wLnByb3RvdHlwZSx5PSJOdW1iZXIiPT1vKHIoMzYpKGcpKSxkPSJ0cmltImluIFN0cmluZy5wcm90b3R5cGUsXz1mdW5jdGlvbih0KXt2YXIgbj1jKHQsITEpO2lmKCJzdHJpbmciPT10eXBlb2YgbiYmbi5sZW5ndGg+Mil7dmFyIHIsZSxpLG89KG49ZD9uLnRyaW0oKTpoKG4sMykpLmNoYXJDb2RlQXQoMCk7aWYoNDM9PT1vfHw0NT09PW8pe2lmKDg4PT09KHI9bi5jaGFyQ29kZUF0KDIpKXx8MTIwPT09cilyZXR1cm4gTmFOfWVsc2UgaWYoNDg9PT1vKXtzd2l0Y2gobi5jaGFyQ29kZUF0KDEpKXtjYXNlIDY2OmNhc2UgOTg6ZT0yLGk9NDk7YnJlYWs7Y2FzZSA3OTpjYXNlIDExMTplPTgsaT01NTticmVhaztkZWZhdWx0OnJldHVybitufWZvcih2YXIgdSxmPW4uc2xpY2UoMiksYT0wLHM9Zi5sZW5ndGg7YTxzO2ErKylpZigodT1mLmNoYXJDb2RlQXQoYSkpPDQ4fHx1PmkpcmV0dXJuIE5hTjtyZXR1cm4gcGFyc2VJbnQoZixlKX19cmV0dXJuK259O2lmKCFwKCIgMG8xIil8fCFwKCIwYjEiKXx8cCgiKzB4MSIpKXtwPWZ1bmN0aW9uIE51bWJlcih0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPDE/MDp0LHI9dGhpcztyZXR1cm4gciBpbnN0YW5jZW9mIHAmJih5P2YoZnVuY3Rpb24oKXtnLnZhbHVlT2YuY2FsbChyKX0pOiJOdW1iZXIiIT1vKHIpKT91KG5ldyB2KF8obikpLHIscCk6XyhuKX07Zm9yKHZhciBTLGI9cig2KT9hKHYpOiJNQVhfVkFMVUUsTUlOX1ZBTFVFLE5hTixORUdBVElWRV9JTkZJTklUWSxQT1NJVElWRV9JTkZJTklUWSxFUFNJTE9OLGlzRmluaXRlLGlzSW50ZWdlcixpc05hTixpc1NhZmVJbnRlZ2VyLE1BWF9TQUZFX0lOVEVHRVIsTUlOX1NBRkVfSU5URUdFUixwYXJzZUZsb2F0LHBhcnNlSW50LGlzSW50ZWdlciIuc3BsaXQoIiwiKSxtPTA7Yi5sZW5ndGg+bTttKyspaSh2LFM9YlttXSkmJiFpKHAsUykmJmwocCxTLHModixTKSk7cC5wcm90b3R5cGU9ZyxnLmNvbnN0cnVjdG9yPXAscigxMykoZSwiTnVtYmVyIixwKX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApLGk9cigyMyksbz1yKDk3KSx1PXIoNzEpLGM9MS4udG9GaXhlZCxmPU1hdGguZmxvb3IsYT1bMCwwLDAsMCwwLDBdLHM9Ik51bWJlci50b0ZpeGVkOiBpbmNvcnJlY3QgaW52b2NhdGlvbiEiLGw9ZnVuY3Rpb24odCxuKXtmb3IodmFyIHI9LTEsZT1uOysrcjw2OyllKz10KmFbcl0sYVtyXT1lJTFlNyxlPWYoZS8xZTcpfSxoPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj02LHI9MDstLW4+PTA7KXIrPWFbbl0sYVtuXT1mKHIvdCkscj1yJXQqMWU3fSxwPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTYsbj0iIjstLXQ+PTA7KWlmKCIiIT09bnx8MD09PXR8fDAhPT1hW3RdKXt2YXIgcj1TdHJpbmcoYVt0XSk7bj0iIj09PW4/cjpuK3UuY2FsbCgiMCIsNy1yLmxlbmd0aCkrcn1yZXR1cm4gbn0sdj1mdW5jdGlvbih0LG4scil7cmV0dXJuIDA9PT1uP3I6biUyPT0xP3YodCxuLTEscip0KTp2KHQqdCxuLzIscil9LGc9ZnVuY3Rpb24odCl7Zm9yKHZhciBuPTAscj10O3I+PTQwOTY7KW4rPTEyLHIvPTQwOTY7Zm9yKDtyPj0yOyluKz0xLHIvPTI7cmV0dXJuIG59O2UoZS5QK2UuRiooISFjJiYoIjAuMDAwIiE9PThlLTUudG9GaXhlZCgzKXx8IjEiIT09LjkudG9GaXhlZCgwKXx8IjEuMjUiIT09MS4yNTUudG9GaXhlZCgyKXx8IjEwMDAwMDAwMDAwMDAwMDAxMjgiIT09KDB4ZGUwYjZiM2E3NjQwMDgwKS50b0ZpeGVkKDApKXx8IXIoMykoZnVuY3Rpb24oKXtjLmNhbGwoe30pfSkpLCJOdW1iZXIiLHt0b0ZpeGVkOmZ1bmN0aW9uIHRvRml4ZWQodCl7dmFyIG4scixlLGMsZj1vKHRoaXMscyksYT1pKHQpLHk9IiIsZD0iMCI7aWYoYTwwfHxhPjIwKXRocm93IFJhbmdlRXJyb3Iocyk7aWYoZiE9ZilyZXR1cm4iTmFOIjtpZihmPD0tMWUyMXx8Zj49MWUyMSlyZXR1cm4gU3RyaW5nKGYpO2lmKGY8MCYmKHk9Ii0iLGY9LWYpLGY+MWUtMjEpaWYobj1nKGYqdigyLDY5LDEpKS02OSxyPW48MD9mKnYoMiwtbiwxKTpmL3YoMixuLDEpLHIqPTQ1MDM1OTk2MjczNzA0OTYsKG49NTItbik+MCl7Zm9yKGwoMCxyKSxlPWE7ZT49NzspbCgxZTcsMCksZS09Nztmb3IobCh2KDEwLGUsMSksMCksZT1uLTE7ZT49MjM7KWgoMTw8MjMpLGUtPTIzO2goMTw8ZSksbCgxLDEpLGgoMiksZD1wKCl9ZWxzZSBsKDAsciksbCgxPDwtbiwwKSxkPXAoKSt1LmNhbGwoIjAiLGEpO3JldHVybiBkPWE+MD95KygoYz1kLmxlbmd0aCk8PWE/IjAuIit1LmNhbGwoIjAiLGEtYykrZDpkLnNsaWNlKDAsYy1hKSsiLiIrZC5zbGljZShjLWEpKTp5K2R9fSl9LGZ1bmN0aW9uKHQsbixlKXt2YXIgaT1lKDApLG89ZSgzKSx1PWUoOTcpLGM9MS4udG9QcmVjaXNpb247aShpLlAraS5GKihvKGZ1bmN0aW9uKCl7cmV0dXJuIjEiIT09Yy5jYWxsKDEscil9KXx8IW8oZnVuY3Rpb24oKXtjLmNhbGwoe30pfSkpLCJOdW1iZXIiLHt0b1ByZWNpc2lvbjpmdW5jdGlvbiB0b1ByZWNpc2lvbih0KXt2YXIgbj11KHRoaXMsIk51bWJlciN0b1ByZWNpc2lvbjogaW5jb3JyZWN0IGludm9jYXRpb24hIik7cmV0dXJuIHQ9PT1yP2MuY2FsbChuKTpjLmNhbGwobix0KX19KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCk7ZShlLlMsIk51bWJlciIse0VQU0lMT046TWF0aC5wb3coMiwtNTIpfSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApLGk9cigyKS5pc0Zpbml0ZTtlKGUuUywiTnVtYmVyIix7aXNGaW5pdGU6ZnVuY3Rpb24gaXNGaW5pdGUodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZpKHQpfX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKTtlKGUuUywiTnVtYmVyIix7aXNJbnRlZ2VyOnIoOTgpfSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApO2UoZS5TLCJOdW1iZXIiLHtpc05hTjpmdW5jdGlvbiBpc05hTih0KXtyZXR1cm4gdCE9dH19KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCksaT1yKDk4KSxvPU1hdGguYWJzO2UoZS5TLCJOdW1iZXIiLHtpc1NhZmVJbnRlZ2VyOmZ1bmN0aW9uIGlzU2FmZUludGVnZXIodCl7cmV0dXJuIGkodCkmJm8odCk8PTkwMDcxOTkyNTQ3NDA5OTF9fSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApO2UoZS5TLCJOdW1iZXIiLHtNQVhfU0FGRV9JTlRFR0VSOjkwMDcxOTkyNTQ3NDA5OTF9KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCk7ZShlLlMsIk51bWJlciIse01JTl9TQUZFX0lOVEVHRVI6LTkwMDcxOTkyNTQ3NDA5OTF9KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCksaT1yKDk5KTtlKGUuUytlLkYqKE51bWJlci5wYXJzZUZsb2F0IT1pKSwiTnVtYmVyIix7cGFyc2VGbG9hdDppfSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApLGk9cigxMDApO2UoZS5TK2UuRiooTnVtYmVyLnBhcnNlSW50IT1pKSwiTnVtYmVyIix7cGFyc2VJbnQ6aX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKSxpPXIoMTAwKTtlKGUuRytlLkYqKHBhcnNlSW50IT1pKSx7cGFyc2VJbnQ6aX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKSxpPXIoOTkpO2UoZS5HK2UuRioocGFyc2VGbG9hdCE9aSkse3BhcnNlRmxvYXQ6aX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKSxpPXIoMTAxKSxvPU1hdGguc3FydCx1PU1hdGguYWNvc2g7ZShlLlMrZS5GKiEodSYmNzEwPT1NYXRoLmZsb29yKHUoTnVtYmVyLk1BWF9WQUxVRSkpJiZ1KEluZmluaXR5KT09SW5maW5pdHkpLCJNYXRoIix7YWNvc2g6ZnVuY3Rpb24gYWNvc2godCl7cmV0dXJuKHQ9K3QpPDE/TmFOOnQ+OTQ5MDYyNjUuNjI0MjUxNTY/TWF0aC5sb2codCkrTWF0aC5MTjI6aSh0LTErbyh0LTEpKm8odCsxKSl9fSl9LGZ1bmN0aW9uKHQsbixyKXtmdW5jdGlvbiBhc2luaCh0KXtyZXR1cm4gaXNGaW5pdGUodD0rdCkmJjAhPXQ/dDwwPy1hc2luaCgtdCk6TWF0aC5sb2codCtNYXRoLnNxcnQodCp0KzEpKTp0fXZhciBlPXIoMCksaT1NYXRoLmFzaW5oO2UoZS5TK2UuRiohKGkmJjEvaSgwKT4wKSwiTWF0aCIse2FzaW5oOmFzaW5ofSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApLGk9TWF0aC5hdGFuaDtlKGUuUytlLkYqIShpJiYxL2koLTApPDApLCJNYXRoIix7YXRhbmg6ZnVuY3Rpb24gYXRhbmgodCl7cmV0dXJuIDA9PSh0PSt0KT90Ok1hdGgubG9nKCgxK3QpLygxLXQpKS8yfX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKSxpPXIoNzIpO2UoZS5TLCJNYXRoIix7Y2JydDpmdW5jdGlvbiBjYnJ0KHQpe3JldHVybiBpKHQ9K3QpKk1hdGgucG93KE1hdGguYWJzKHQpLDEvMyl9fSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApO2UoZS5TLCJNYXRoIix7Y2x6MzI6ZnVuY3Rpb24gY2x6MzIodCl7cmV0dXJuKHQ+Pj49MCk/MzEtTWF0aC5mbG9vcihNYXRoLmxvZyh0Ky41KSpNYXRoLkxPRzJFKTozMn19KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCksaT1NYXRoLmV4cDtlKGUuUywiTWF0aCIse2Nvc2g6ZnVuY3Rpb24gY29zaCh0KXtyZXR1cm4oaSh0PSt0KStpKC10KSkvMn19KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCksaT1yKDczKTtlKGUuUytlLkYqKGkhPU1hdGguZXhwbTEpLCJNYXRoIix7ZXhwbTE6aX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKTtlKGUuUywiTWF0aCIse2Zyb3VuZDpyKDEwMil9KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCksaT1NYXRoLmFicztlKGUuUywiTWF0aCIse2h5cG90OmZ1bmN0aW9uIGh5cG90KHQsbil7Zm9yKHZhciByLGUsbz0wLHU9MCxjPWFyZ3VtZW50cy5sZW5ndGgsZj0wO3U8YzspZjwocj1pKGFyZ3VtZW50c1t1KytdKSk/KG89byooZT1mL3IpKmUrMSxmPXIpOm8rPXI+MD8oZT1yL2YpKmU6cjtyZXR1cm4gZj09PUluZmluaXR5P0luZmluaXR5OmYqTWF0aC5zcXJ0KG8pfX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKSxpPU1hdGguaW11bDtlKGUuUytlLkYqcigzKShmdW5jdGlvbigpe3JldHVybi01IT1pKDQyOTQ5NjcyOTUsNSl8fDIhPWkubGVuZ3RofSksIk1hdGgiLHtpbXVsOmZ1bmN0aW9uIGltdWwodCxuKXt2YXIgcj0rdCxlPStuLGk9NjU1MzUmcixvPTY1NTM1JmU7cmV0dXJuIDB8aSpvKygoNjU1MzUmcj4+PjE2KSpvK2kqKDY1NTM1JmU+Pj4xNik8PDE2Pj4+MCl9fSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApO2UoZS5TLCJNYXRoIix7bG9nMTA6ZnVuY3Rpb24gbG9nMTAodCl7cmV0dXJuIE1hdGgubG9nKHQpKk1hdGguTE9HMTBFfX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKTtlKGUuUywiTWF0aCIse2xvZzFwOnIoMTAxKX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKTtlKGUuUywiTWF0aCIse2xvZzI6ZnVuY3Rpb24gbG9nMih0KXtyZXR1cm4gTWF0aC5sb2codCkvTWF0aC5MTjJ9fSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApO2UoZS5TLCJNYXRoIix7c2lnbjpyKDcyKX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKSxpPXIoNzMpLG89TWF0aC5leHA7ZShlLlMrZS5GKnIoMykoZnVuY3Rpb24oKXtyZXR1cm4tMmUtMTchPSFNYXRoLnNpbmgoLTJlLTE3KX0pLCJNYXRoIix7c2luaDpmdW5jdGlvbiBzaW5oKHQpe3JldHVybiBNYXRoLmFicyh0PSt0KTwxPyhpKHQpLWkoLXQpKS8yOihvKHQtMSktbygtdC0xKSkqKE1hdGguRS8yKX19KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCksaT1yKDczKSxvPU1hdGguZXhwO2UoZS5TLCJNYXRoIix7dGFuaDpmdW5jdGlvbiB0YW5oKHQpe3ZhciBuPWkodD0rdCkscj1pKC10KTtyZXR1cm4gbj09SW5maW5pdHk/MTpyPT1JbmZpbml0eT8tMToobi1yKS8obyh0KStvKC10KSl9fSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApO2UoZS5TLCJNYXRoIix7dHJ1bmM6ZnVuY3Rpb24gdHJ1bmModCl7cmV0dXJuKHQ+MD9NYXRoLmZsb29yOk1hdGguY2VpbCkodCl9fSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApLGk9cigzNSksbz1TdHJpbmcuZnJvbUNoYXJDb2RlLHU9U3RyaW5nLmZyb21Db2RlUG9pbnQ7ZShlLlMrZS5GKighIXUmJjEhPXUubGVuZ3RoKSwiU3RyaW5nIix7ZnJvbUNvZGVQb2ludDpmdW5jdGlvbiBmcm9tQ29kZVBvaW50KHQpe2Zvcih2YXIgbixyPVtdLGU9YXJndW1lbnRzLmxlbmd0aCx1PTA7ZT51Oyl7aWYobj0rYXJndW1lbnRzW3UrK10saShuLDExMTQxMTEpIT09bil0aHJvdyBSYW5nZUVycm9yKG4rIiBpcyBub3QgYSB2YWxpZCBjb2RlIHBvaW50Iik7ci5wdXNoKG48NjU1MzY/byhuKTpvKDU1Mjk2Kygobi09NjU1MzYpPj4xMCksbiUxMDI0KzU2MzIwKSl9cmV0dXJuIHIuam9pbigiIil9fSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApLGk9cigxNSksbz1yKDgpO2UoZS5TLCJTdHJpbmciLHtyYXc6ZnVuY3Rpb24gcmF3KHQpe2Zvcih2YXIgbj1pKHQucmF3KSxyPW8obi5sZW5ndGgpLGU9YXJndW1lbnRzLmxlbmd0aCx1PVtdLGM9MDtyPmM7KXUucHVzaChTdHJpbmcobltjKytdKSksYzxlJiZ1LnB1c2goU3RyaW5nKGFyZ3VtZW50c1tjXSkpO3JldHVybiB1LmpvaW4oIiIpfX0pfSxmdW5jdGlvbih0LG4scil7cig0MykoInRyaW0iLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiB0cmltKCl7cmV0dXJuIHQodGhpcywzKX19KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCksaT1yKDc0KSghMSk7ZShlLlAsIlN0cmluZyIse2NvZGVQb2ludEF0OmZ1bmN0aW9uIGNvZGVQb2ludEF0KHQpe3JldHVybiBpKHRoaXMsdCl9fSl9LGZ1bmN0aW9uKHQsbixlKXt2YXIgaT1lKDApLG89ZSg4KSx1PWUoNzUpLGM9IiIuZW5kc1dpdGg7aShpLlAraS5GKmUoNzYpKCJlbmRzV2l0aCIpLCJTdHJpbmciLHtlbmRzV2l0aDpmdW5jdGlvbiBlbmRzV2l0aCh0KXt2YXIgbj11KHRoaXMsdCwiZW5kc1dpdGgiKSxlPWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06cixpPW8obi5sZW5ndGgpLGY9ZT09PXI/aTpNYXRoLm1pbihvKGUpLGkpLGE9U3RyaW5nKHQpO3JldHVybiBjP2MuY2FsbChuLGEsZik6bi5zbGljZShmLWEubGVuZ3RoLGYpPT09YX19KX0sZnVuY3Rpb24odCxuLGUpe3ZhciBpPWUoMCksbz1lKDc1KTtpKGkuUCtpLkYqZSg3NikoImluY2x1ZGVzIiksIlN0cmluZyIse2luY2x1ZGVzOmZ1bmN0aW9uIGluY2x1ZGVzKHQpe3JldHVybiEhfm8odGhpcyx0LCJpbmNsdWRlcyIpLmluZGV4T2YodCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnIpfX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKTtlKGUuUCwiU3RyaW5nIix7cmVwZWF0OnIoNzEpfSl9LGZ1bmN0aW9uKHQsbixlKXt2YXIgaT1lKDApLG89ZSg4KSx1PWUoNzUpLGM9IiIuc3RhcnRzV2l0aDtpKGkuUCtpLkYqZSg3NikoInN0YXJ0c1dpdGgiKSwiU3RyaW5nIix7c3RhcnRzV2l0aDpmdW5jdGlvbiBzdGFydHNXaXRoKHQpe3ZhciBuPXUodGhpcyx0LCJzdGFydHNXaXRoIiksZT1vKE1hdGgubWluKGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06cixuLmxlbmd0aCkpLGk9U3RyaW5nKHQpO3JldHVybiBjP2MuY2FsbChuLGksZSk6bi5zbGljZShlLGUraS5sZW5ndGgpPT09aX19KX0sZnVuY3Rpb24odCxuLGUpe3ZhciBpPWUoNzQpKCEwKTtlKDc3KShTdHJpbmcsIlN0cmluZyIsZnVuY3Rpb24odCl7dGhpcy5fdD1TdHJpbmcodCksdGhpcy5faT0wfSxmdW5jdGlvbigpe3ZhciB0LG49dGhpcy5fdCxlPXRoaXMuX2k7cmV0dXJuIGU+PW4ubGVuZ3RoP3t2YWx1ZTpyLGRvbmU6ITB9Oih0PWkobixlKSx0aGlzLl9pKz10Lmxlbmd0aCx7dmFsdWU6dCxkb25lOiExfSl9KX0sZnVuY3Rpb24odCxuLHIpe3IoMTQpKCJhbmNob3IiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBhbmNob3Iobil7cmV0dXJuIHQodGhpcywiYSIsIm5hbWUiLG4pfX0pfSxmdW5jdGlvbih0LG4scil7cigxNCkoImJpZyIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIGJpZygpe3JldHVybiB0KHRoaXMsImJpZyIsIiIsIiIpfX0pfSxmdW5jdGlvbih0LG4scil7cigxNCkoImJsaW5rIixmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gYmxpbmsoKXtyZXR1cm4gdCh0aGlzLCJibGluayIsIiIsIiIpfX0pfSxmdW5jdGlvbih0LG4scil7cigxNCkoImJvbGQiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBib2xkKCl7cmV0dXJuIHQodGhpcywiYiIsIiIsIiIpfX0pfSxmdW5jdGlvbih0LG4scil7cigxNCkoImZpeGVkIixmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gZml4ZWQoKXtyZXR1cm4gdCh0aGlzLCJ0dCIsIiIsIiIpfX0pfSxmdW5jdGlvbih0LG4scil7cigxNCkoImZvbnRjb2xvciIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIGZvbnRjb2xvcihuKXtyZXR1cm4gdCh0aGlzLCJmb250IiwiY29sb3IiLG4pfX0pfSxmdW5jdGlvbih0LG4scil7cigxNCkoImZvbnRzaXplIixmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gZm9udHNpemUobil7cmV0dXJuIHQodGhpcywiZm9udCIsInNpemUiLG4pfX0pfSxmdW5jdGlvbih0LG4scil7cigxNCkoIml0YWxpY3MiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBpdGFsaWNzKCl7cmV0dXJuIHQodGhpcywiaSIsIiIsIiIpfX0pfSxmdW5jdGlvbih0LG4scil7cigxNCkoImxpbmsiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBsaW5rKG4pe3JldHVybiB0KHRoaXMsImEiLCJocmVmIixuKX19KX0sZnVuY3Rpb24odCxuLHIpe3IoMTQpKCJzbWFsbCIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIHNtYWxsKCl7cmV0dXJuIHQodGhpcywic21hbGwiLCIiLCIiKX19KX0sZnVuY3Rpb24odCxuLHIpe3IoMTQpKCJzdHJpa2UiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBzdHJpa2UoKXtyZXR1cm4gdCh0aGlzLCJzdHJpa2UiLCIiLCIiKX19KX0sZnVuY3Rpb24odCxuLHIpe3IoMTQpKCJzdWIiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBzdWIoKXtyZXR1cm4gdCh0aGlzLCJzdWIiLCIiLCIiKX19KX0sZnVuY3Rpb24odCxuLHIpe3IoMTQpKCJzdXAiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBzdXAoKXtyZXR1cm4gdCh0aGlzLCJzdXAiLCIiLCIiKX19KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCk7ZShlLlMsIkFycmF5Iix7aXNBcnJheTpyKDUyKX0pfSxmdW5jdGlvbih0LG4sZSl7dmFyIGk9ZSgxOCksbz1lKDApLHU9ZSg5KSxjPWUoMTAzKSxmPWUoNzkpLGE9ZSg4KSxzPWUoODApLGw9ZSg4MSk7byhvLlMrby5GKiFlKDU0KShmdW5jdGlvbih0KXtBcnJheS5mcm9tKHQpfSksIkFycmF5Iix7ZnJvbTpmdW5jdGlvbiBmcm9tKHQpe3ZhciBuLGUsbyxoLHA9dSh0KSx2PSJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzP3RoaXM6QXJyYXksZz1hcmd1bWVudHMubGVuZ3RoLHk9Zz4xP2FyZ3VtZW50c1sxXTpyLGQ9eSE9PXIsXz0wLFM9bChwKTtpZihkJiYoeT1pKHksZz4yP2FyZ3VtZW50c1syXTpyLDIpKSxTPT1yfHx2PT1BcnJheSYmZihTKSlmb3IoZT1uZXcgdihuPWEocC5sZW5ndGgpKTtuPl87XysrKXMoZSxfLGQ/eShwW19dLF8pOnBbX10pO2Vsc2UgZm9yKGg9Uy5jYWxsKHApLGU9bmV3IHY7IShvPWgubmV4dCgpKS5kb25lO18rKylzKGUsXyxkP2MoaCx5LFtvLnZhbHVlLF9dLCEwKTpvLnZhbHVlKTtyZXR1cm4gZS5sZW5ndGg9XyxlfX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKSxpPXIoODApO2UoZS5TK2UuRipyKDMpKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gRigpe31yZXR1cm4hKEFycmF5Lm9mLmNhbGwoRilpbnN0YW5jZW9mIEYpfSksIkFycmF5Iix7b2Y6ZnVuY3Rpb24gb2YoKXtmb3IodmFyIHQ9MCxuPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcoImZ1bmN0aW9uIj09dHlwZW9mIHRoaXM/dGhpczpBcnJheSkobik7bj50OylpKHIsdCxhcmd1bWVudHNbdCsrXSk7cmV0dXJuIHIubGVuZ3RoPW4scn19KX0sZnVuY3Rpb24odCxuLGUpe3ZhciBpPWUoMCksbz1lKDE1KSx1PVtdLmpvaW47aShpLlAraS5GKihlKDQ2KSE9T2JqZWN0fHwhZSgyMCkodSkpLCJBcnJheSIse2pvaW46ZnVuY3Rpb24gam9pbih0KXtyZXR1cm4gdS5jYWxsKG8odGhpcyksdD09PXI/IiwiOnQpfX0pfSxmdW5jdGlvbih0LG4sZSl7dmFyIGk9ZSgwKSxvPWUoNjcpLHU9ZSgxOSksYz1lKDM1KSxmPWUoOCksYT1bXS5zbGljZTtpKGkuUCtpLkYqZSgzKShmdW5jdGlvbigpe28mJmEuY2FsbChvKX0pLCJBcnJheSIse3NsaWNlOmZ1bmN0aW9uIHNsaWNlKHQsbil7dmFyIGU9Zih0aGlzLmxlbmd0aCksaT11KHRoaXMpO2lmKG49bj09PXI/ZTpuLCJBcnJheSI9PWkpcmV0dXJuIGEuY2FsbCh0aGlzLHQsbik7Zm9yKHZhciBvPWModCxlKSxzPWMobixlKSxsPWYocy1vKSxoPUFycmF5KGwpLHA9MDtwPGw7cCsrKWhbcF09IlN0cmluZyI9PWk/dGhpcy5jaGFyQXQobytwKTp0aGlzW28rcF07cmV0dXJuIGh9fSl9LGZ1bmN0aW9uKHQsbixlKXt2YXIgaT1lKDApLG89ZSgxMCksdT1lKDkpLGM9ZSgzKSxmPVtdLnNvcnQsYT1bMSwyLDNdO2koaS5QK2kuRiooYyhmdW5jdGlvbigpe2Euc29ydChyKX0pfHwhYyhmdW5jdGlvbigpe2Euc29ydChudWxsKX0pfHwhZSgyMCkoZikpLCJBcnJheSIse3NvcnQ6ZnVuY3Rpb24gc29ydCh0KXtyZXR1cm4gdD09PXI/Zi5jYWxsKHUodGhpcykpOmYuY2FsbCh1KHRoaXMpLG8odCkpfX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKSxpPXIoMjUpKDApLG89cigyMCkoW10uZm9yRWFjaCwhMCk7ZShlLlArZS5GKiFvLCJBcnJheSIse2ZvckVhY2g6ZnVuY3Rpb24gZm9yRWFjaCh0KXtyZXR1cm4gaSh0aGlzLHQsYXJndW1lbnRzWzFdKX19KX0sZnVuY3Rpb24odCxuLGUpe3ZhciBpPWUoNCksbz1lKDUyKSx1PWUoNSkoInNwZWNpZXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIG47cmV0dXJuIG8odCkmJigiZnVuY3Rpb24iIT10eXBlb2Yobj10LmNvbnN0cnVjdG9yKXx8biE9PUFycmF5JiYhbyhuLnByb3RvdHlwZSl8fChuPXIpLGkobikmJm51bGw9PT0obj1uW3VdKSYmKG49cikpLG49PT1yP0FycmF5Om59fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKSxpPXIoMjUpKDEpO2UoZS5QK2UuRiohcigyMCkoW10ubWFwLCEwKSwiQXJyYXkiLHttYXA6ZnVuY3Rpb24gbWFwKHQpe3JldHVybiBpKHRoaXMsdCxhcmd1bWVudHNbMV0pfX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKSxpPXIoMjUpKDIpO2UoZS5QK2UuRiohcigyMCkoW10uZmlsdGVyLCEwKSwiQXJyYXkiLHtmaWx0ZXI6ZnVuY3Rpb24gZmlsdGVyKHQpe3JldHVybiBpKHRoaXMsdCxhcmd1bWVudHNbMV0pfX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKSxpPXIoMjUpKDMpO2UoZS5QK2UuRiohcigyMCkoW10uc29tZSwhMCksIkFycmF5Iix7c29tZTpmdW5jdGlvbiBzb21lKHQpe3JldHVybiBpKHRoaXMsdCxhcmd1bWVudHNbMV0pfX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKSxpPXIoMjUpKDQpO2UoZS5QK2UuRiohcigyMCkoW10uZXZlcnksITApLCJBcnJheSIse2V2ZXJ5OmZ1bmN0aW9uIGV2ZXJ5KHQpe3JldHVybiBpKHRoaXMsdCxhcmd1bWVudHNbMV0pfX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKSxpPXIoMTA0KTtlKGUuUCtlLkYqIXIoMjApKFtdLnJlZHVjZSwhMCksIkFycmF5Iix7cmVkdWNlOmZ1bmN0aW9uIHJlZHVjZSh0KXtyZXR1cm4gaSh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aCxhcmd1bWVudHNbMV0sITEpfX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKSxpPXIoMTA0KTtlKGUuUCtlLkYqIXIoMjApKFtdLnJlZHVjZVJpZ2h0LCEwKSwiQXJyYXkiLHtyZWR1Y2VSaWdodDpmdW5jdGlvbiByZWR1Y2VSaWdodCh0KXtyZXR1cm4gaSh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aCxhcmd1bWVudHNbMV0sITApfX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKSxpPXIoNTApKCExKSxvPVtdLmluZGV4T2YsdT0hIW8mJjEvWzFdLmluZGV4T2YoMSwtMCk8MDtlKGUuUCtlLkYqKHV8fCFyKDIwKShvKSksIkFycmF5Iix7aW5kZXhPZjpmdW5jdGlvbiBpbmRleE9mKHQpe3JldHVybiB1P28uYXBwbHkodGhpcyxhcmd1bWVudHMpfHwwOmkodGhpcyx0LGFyZ3VtZW50c1sxXSl9fSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApLGk9cigxNSksbz1yKDIzKSx1PXIoOCksYz1bXS5sYXN0SW5kZXhPZixmPSEhYyYmMS9bMV0ubGFzdEluZGV4T2YoMSwtMCk8MDtlKGUuUCtlLkYqKGZ8fCFyKDIwKShjKSksIkFycmF5Iix7bGFzdEluZGV4T2Y6ZnVuY3Rpb24gbGFzdEluZGV4T2YodCl7aWYoZilyZXR1cm4gYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fDA7dmFyIG49aSh0aGlzKSxyPXUobi5sZW5ndGgpLGU9ci0xO2Zvcihhcmd1bWVudHMubGVuZ3RoPjEmJihlPU1hdGgubWluKGUsbyhhcmd1bWVudHNbMV0pKSksZTwwJiYoZT1yK2UpO2U+PTA7ZS0tKWlmKGUgaW4gbiYmbltlXT09PXQpcmV0dXJuIGV8fDA7cmV0dXJuLTF9fSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApO2UoZS5QLCJBcnJheSIse2NvcHlXaXRoaW46cigxMDUpfSkscigzMCkoImNvcHlXaXRoaW4iKX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCk7ZShlLlAsIkFycmF5Iix7ZmlsbDpyKDgzKX0pLHIoMzApKCJmaWxsIil9LGZ1bmN0aW9uKHQsbixlKXt2YXIgaT1lKDApLG89ZSgyNSkoNSksdT0hMDsiZmluZCJpbltdJiZBcnJheSgxKS5maW5kKGZ1bmN0aW9uKCl7dT0hMX0pLGkoaS5QK2kuRip1LCJBcnJheSIse2ZpbmQ6ZnVuY3Rpb24gZmluZCh0KXtyZXR1cm4gbyh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTpyKX19KSxlKDMwKSgiZmluZCIpfSxmdW5jdGlvbih0LG4sZSl7dmFyIGk9ZSgwKSxvPWUoMjUpKDYpLHU9ImZpbmRJbmRleCIsYz0hMDt1IGluW10mJkFycmF5KDEpW3VdKGZ1bmN0aW9uKCl7Yz0hMX0pLGkoaS5QK2kuRipjLCJBcnJheSIse2ZpbmRJbmRleDpmdW5jdGlvbiBmaW5kSW5kZXgodCl7cmV0dXJuIG8odGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06cil9fSksZSgzMCkodSl9LGZ1bmN0aW9uKHQsbixyKXtyKDM4KSgiQXJyYXkiKX0sZnVuY3Rpb24odCxuLGUpe3ZhciBpPWUoMiksbz1lKDY5KSx1PWUoNykuZixjPWUoMzcpLmYsZj1lKDUzKSxhPWUoNTUpLHM9aS5SZWdFeHAsbD1zLGg9cy5wcm90b3R5cGUscD0vYS9nLHY9L2EvZyxnPW5ldyBzKHApIT09cDtpZihlKDYpJiYoIWd8fGUoMykoZnVuY3Rpb24oKXtyZXR1cm4gdltlKDUpKCJtYXRjaCIpXT0hMSxzKHApIT1wfHxzKHYpPT12fHwiL2EvaSIhPXMocCwiaSIpfSkpKXtzPWZ1bmN0aW9uIFJlZ0V4cCh0LG4pe3ZhciBlPXRoaXMgaW5zdGFuY2VvZiBzLGk9Zih0KSx1PW49PT1yO3JldHVybiFlJiZpJiZ0LmNvbnN0cnVjdG9yPT09cyYmdT90Om8oZz9uZXcgbChpJiYhdT90LnNvdXJjZTp0LG4pOmwoKGk9dCBpbnN0YW5jZW9mIHMpP3Quc291cmNlOnQsaSYmdT9hLmNhbGwodCk6biksZT90aGlzOmgscyl9O2Zvcih2YXIgeT1jKGwpLGQ9MDt5Lmxlbmd0aD5kOykhZnVuY3Rpb24odCl7dCBpbiBzfHx1KHMsdCx7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBsW3RdfSxzZXQ6ZnVuY3Rpb24obil7bFt0XT1ufX0pfSh5W2QrK10pO2guY29uc3RydWN0b3I9cyxzLnByb3RvdHlwZT1oLGUoMTMpKGksIlJlZ0V4cCIscyl9ZSgzOCkoIlJlZ0V4cCIpfSxmdW5jdGlvbih0LG4sZSl7ZSgxMDcpO3ZhciBpPWUoMSksbz1lKDU1KSx1PWUoNiksYz0vLi8udG9TdHJpbmcsZj1mdW5jdGlvbih0KXtlKDEzKShSZWdFeHAucHJvdG90eXBlLCJ0b1N0cmluZyIsdCwhMCl9O2UoMykoZnVuY3Rpb24oKXtyZXR1cm4iL2EvYiIhPWMuY2FsbCh7c291cmNlOiJhIixmbGFnczoiYiJ9KX0pP2YoZnVuY3Rpb24gdG9TdHJpbmcoKXt2YXIgdD1pKHRoaXMpO3JldHVybiIvIi5jb25jYXQodC5zb3VyY2UsIi8iLCJmbGFncyJpbiB0P3QuZmxhZ3M6IXUmJnQgaW5zdGFuY2VvZiBSZWdFeHA/by5jYWxsKHQpOnIpfSk6InRvU3RyaW5nIiE9Yy5uYW1lJiZmKGZ1bmN0aW9uIHRvU3RyaW5nKCl7cmV0dXJuIGMuY2FsbCh0aGlzKX0pfSxmdW5jdGlvbih0LG4sZSl7ZSg1NikoIm1hdGNoIiwxLGZ1bmN0aW9uKHQsbixlKXtyZXR1cm5bZnVuY3Rpb24gbWF0Y2goZSl7dmFyIGk9dCh0aGlzKSxvPWU9PXI/cjplW25dO3JldHVybiBvIT09cj9vLmNhbGwoZSxpKTpuZXcgUmVnRXhwKGUpW25dKFN0cmluZyhpKSl9LGVdfSl9LGZ1bmN0aW9uKHQsbixlKXtlKDU2KSgicmVwbGFjZSIsMixmdW5jdGlvbih0LG4sZSl7cmV0dXJuW2Z1bmN0aW9uIHJlcGxhY2UoaSxvKXt2YXIgdT10KHRoaXMpLGM9aT09cj9yOmlbbl07cmV0dXJuIGMhPT1yP2MuY2FsbChpLHUsbyk6ZS5jYWxsKFN0cmluZyh1KSxpLG8pfSxlXX0pfSxmdW5jdGlvbih0LG4sZSl7ZSg1NikoInNlYXJjaCIsMSxmdW5jdGlvbih0LG4sZSl7cmV0dXJuW2Z1bmN0aW9uIHNlYXJjaChlKXt2YXIgaT10KHRoaXMpLG89ZT09cj9yOmVbbl07cmV0dXJuIG8hPT1yP28uY2FsbChlLGkpOm5ldyBSZWdFeHAoZSlbbl0oU3RyaW5nKGkpKX0sZV19KX0sZnVuY3Rpb24odCxuLGUpe2UoNTYpKCJzcGxpdCIsMixmdW5jdGlvbih0LG4saSl7dmFyIG89ZSg1MyksdT1pLGM9W10ucHVzaCxmPSJsZW5ndGgiO2lmKCJjIj09ImFiYmMiLnNwbGl0KC8oYikqLylbMV18fDQhPSJ0ZXN0Ii5zcGxpdCgvKD86KS8sLTEpW2ZdfHwyIT0iYWIiLnNwbGl0KC8oPzphYikqLylbZl18fDQhPSIuIi5zcGxpdCgvKC4/KSguPykvKVtmXXx8Ii4iLnNwbGl0KC8oKSgpLylbZl0+MXx8IiIuc3BsaXQoLy4/LylbZl0pe3ZhciBhPS8oKT8/Ly5leGVjKCIiKVsxXT09PXI7aT1mdW5jdGlvbih0LG4pe3ZhciBlPVN0cmluZyh0aGlzKTtpZih0PT09ciYmMD09PW4pcmV0dXJuW107aWYoIW8odCkpcmV0dXJuIHUuY2FsbChlLHQsbik7dmFyIGkscyxsLGgscCx2PVtdLGc9KHQuaWdub3JlQ2FzZT8iaSI6IiIpKyh0Lm11bHRpbGluZT8ibSI6IiIpKyh0LnVuaWNvZGU/InUiOiIiKSsodC5zdGlja3k/InkiOiIiKSx5PTAsZD1uPT09cj80Mjk0OTY3Mjk1Om4+Pj4wLF89bmV3IFJlZ0V4cCh0LnNvdXJjZSxnKyJnIik7Zm9yKGF8fChpPW5ldyBSZWdFeHAoIl4iK18uc291cmNlKyIkKD8hXFxzKSIsZykpOyhzPV8uZXhlYyhlKSkmJiEoKGw9cy5pbmRleCtzWzBdW2ZdKT55JiYodi5wdXNoKGUuc2xpY2UoeSxzLmluZGV4KSksIWEmJnNbZl0+MSYmc1swXS5yZXBsYWNlKGksZnVuY3Rpb24oKXtmb3IocD0xO3A8YXJndW1lbnRzW2ZdLTI7cCsrKWFyZ3VtZW50c1twXT09PXImJihzW3BdPXIpfSksc1tmXT4xJiZzLmluZGV4PGVbZl0mJmMuYXBwbHkodixzLnNsaWNlKDEpKSxoPXNbMF1bZl0seT1sLHZbZl0+PWQpKTspXy5sYXN0SW5kZXg9PT1zLmluZGV4JiZfLmxhc3RJbmRleCsrO3JldHVybiB5PT09ZVtmXT8haCYmXy50ZXN0KCIiKXx8di5wdXNoKCIiKTp2LnB1c2goZS5zbGljZSh5KSksdltmXT5kP3Yuc2xpY2UoMCxkKTp2fX1lbHNlIjAiLnNwbGl0KHIsMClbZl0mJihpPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHQ9PT1yJiYwPT09bj9bXTp1LmNhbGwodGhpcyx0LG4pfSk7cmV0dXJuW2Z1bmN0aW9uIHNwbGl0KGUsbyl7dmFyIHU9dCh0aGlzKSxjPWU9PXI/cjplW25dO3JldHVybiBjIT09cj9jLmNhbGwoZSx1LG8pOmkuY2FsbChTdHJpbmcodSksZSxvKX0saV19KX0sZnVuY3Rpb24odCxuLGUpe3ZhciBpLG8sdSxjLGY9ZSgzMyksYT1lKDIpLHM9ZSgxOCksbD1lKDQ4KSxoPWUoMCkscD1lKDQpLHY9ZSgxMCksZz1lKDM5KSx5PWUoNDApLGQ9ZSg1NyksXz1lKDg1KS5zZXQsUz1lKDg2KSgpLGI9ZSg4NyksbT1lKDEwOCkseD1lKDEwOSksdz1hLlR5cGVFcnJvcixFPWEucHJvY2VzcyxPPWEuUHJvbWlzZSxQPSJwcm9jZXNzIj09bChFKSxNPWZ1bmN0aW9uKCl7fSxJPW89Yi5mLEY9ISFmdW5jdGlvbigpe3RyeXt2YXIgdD1PLnJlc29sdmUoMSksbj0odC5jb25zdHJ1Y3Rvcj17fSlbZSg1KSgic3BlY2llcyIpXT1mdW5jdGlvbih0KXt0KE0sTSl9O3JldHVybihQfHwiZnVuY3Rpb24iPT10eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50KSYmdC50aGVuKE0paW5zdGFuY2VvZiBufWNhdGNoKHIpe319KCksQT1mdW5jdGlvbih0KXt2YXIgbjtyZXR1cm4hKCFwKHQpfHwiZnVuY3Rpb24iIT10eXBlb2Yobj10LnRoZW4pKSYmbn0saz1mdW5jdGlvbih0LG4pe2lmKCF0Ll9uKXt0Ll9uPSEwO3ZhciByPXQuX2M7UyhmdW5jdGlvbigpe2Zvcih2YXIgZT10Ll92LGk9MT09dC5fcyxvPTA7ci5sZW5ndGg+bzspIWZ1bmN0aW9uKG4pe3ZhciByLG8sdT1pP24ub2s6bi5mYWlsLGM9bi5yZXNvbHZlLGY9bi5yZWplY3QsYT1uLmRvbWFpbjt0cnl7dT8oaXx8KDI9PXQuX2gmJlIodCksdC5faD0xKSwhMD09PXU/cj1lOihhJiZhLmVudGVyKCkscj11KGUpLGEmJmEuZXhpdCgpKSxyPT09bi5wcm9taXNlP2YodygiUHJvbWlzZS1jaGFpbiBjeWNsZSIpKToobz1BKHIpKT9vLmNhbGwocixjLGYpOmMocikpOmYoZSl9Y2F0Y2gocyl7ZihzKX19KHJbbysrXSk7dC5fYz1bXSx0Ll9uPSExLG4mJiF0Ll9oJiZOKHQpfSl9fSxOPWZ1bmN0aW9uKHQpe18uY2FsbChhLGZ1bmN0aW9uKCl7dmFyIG4sZSxpLG89dC5fdix1PWoodCk7aWYodSYmKG49bShmdW5jdGlvbigpe1A/RS5lbWl0KCJ1bmhhbmRsZWRSZWplY3Rpb24iLG8sdCk6KGU9YS5vbnVuaGFuZGxlZHJlamVjdGlvbik/ZSh7cHJvbWlzZTp0LHJlYXNvbjpvfSk6KGk9YS5jb25zb2xlKSYmaS5lcnJvciYmaS5lcnJvcigiVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIixvKX0pLHQuX2g9UHx8aih0KT8yOjEpLHQuX2E9ciwKdSYmbi5lKXRocm93IG4udn0pfSxqPWZ1bmN0aW9uKHQpe2lmKDE9PXQuX2gpcmV0dXJuITE7Zm9yKHZhciBuLHI9dC5fYXx8dC5fYyxlPTA7ci5sZW5ndGg+ZTspaWYoKG49cltlKytdKS5mYWlsfHwhaihuLnByb21pc2UpKXJldHVybiExO3JldHVybiEwfSxSPWZ1bmN0aW9uKHQpe18uY2FsbChhLGZ1bmN0aW9uKCl7dmFyIG47UD9FLmVtaXQoInJlamVjdGlvbkhhbmRsZWQiLHQpOihuPWEub25yZWplY3Rpb25oYW5kbGVkKSYmbih7cHJvbWlzZTp0LHJlYXNvbjp0Ll92fSl9KX0sVD1mdW5jdGlvbih0KXt2YXIgbj10aGlzO24uX2R8fChuLl9kPSEwLChuPW4uX3d8fG4pLl92PXQsbi5fcz0yLG4uX2F8fChuLl9hPW4uX2Muc2xpY2UoKSksayhuLCEwKSl9LEw9ZnVuY3Rpb24odCl7dmFyIG4scj10aGlzO2lmKCFyLl9kKXtyLl9kPSEwLHI9ci5fd3x8cjt0cnl7aWYocj09PXQpdGhyb3cgdygiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGYiKTsobj1BKHQpKT9TKGZ1bmN0aW9uKCl7dmFyIGU9e193OnIsX2Q6ITF9O3RyeXtuLmNhbGwodCxzKEwsZSwxKSxzKFQsZSwxKSl9Y2F0Y2goaSl7VC5jYWxsKGUsaSl9fSk6KHIuX3Y9dCxyLl9zPTEsayhyLCExKSl9Y2F0Y2goZSl7VC5jYWxsKHtfdzpyLF9kOiExfSxlKX19fTtGfHwoTz1mdW5jdGlvbiBQcm9taXNlKHQpe2codGhpcyxPLCJQcm9taXNlIiwiX2giKSx2KHQpLGkuY2FsbCh0aGlzKTt0cnl7dChzKEwsdGhpcywxKSxzKFQsdGhpcywxKSl9Y2F0Y2gobil7VC5jYWxsKHRoaXMsbil9fSwoaT1mdW5jdGlvbiBQcm9taXNlKHQpe3RoaXMuX2M9W10sdGhpcy5fYT1yLHRoaXMuX3M9MCx0aGlzLl9kPSExLHRoaXMuX3Y9cix0aGlzLl9oPTAsdGhpcy5fbj0hMX0pLnByb3RvdHlwZT1lKDQxKShPLnByb3RvdHlwZSx7dGhlbjpmdW5jdGlvbiB0aGVuKHQsbil7dmFyIGU9SShkKHRoaXMsTykpO3JldHVybiBlLm9rPSJmdW5jdGlvbiIhPXR5cGVvZiB0fHx0LGUuZmFpbD0iZnVuY3Rpb24iPT10eXBlb2YgbiYmbixlLmRvbWFpbj1QP0UuZG9tYWluOnIsdGhpcy5fYy5wdXNoKGUpLHRoaXMuX2EmJnRoaXMuX2EucHVzaChlKSx0aGlzLl9zJiZrKHRoaXMsITEpLGUucHJvbWlzZX0sImNhdGNoIjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aGVuKHIsdCl9fSksdT1mdW5jdGlvbigpe3ZhciB0PW5ldyBpO3RoaXMucHJvbWlzZT10LHRoaXMucmVzb2x2ZT1zKEwsdCwxKSx0aGlzLnJlamVjdD1zKFQsdCwxKX0sYi5mPUk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1PfHx0PT09Yz9uZXcgdSh0KTpvKHQpfSksaChoLkcraC5XK2guRiohRix7UHJvbWlzZTpPfSksZSg0MikoTywiUHJvbWlzZSIpLGUoMzgpKCJQcm9taXNlIiksYz1lKDI4KS5Qcm9taXNlLGgoaC5TK2guRiohRiwiUHJvbWlzZSIse3JlamVjdDpmdW5jdGlvbiByZWplY3QodCl7dmFyIG49SSh0aGlzKTtyZXR1cm4oMCxuLnJlamVjdCkodCksbi5wcm9taXNlfX0pLGgoaC5TK2guRiooZnx8IUYpLCJQcm9taXNlIix7cmVzb2x2ZTpmdW5jdGlvbiByZXNvbHZlKHQpe3JldHVybiB4KGYmJnRoaXM9PT1jP086dGhpcyx0KX19KSxoKGguUytoLkYqIShGJiZlKDU0KShmdW5jdGlvbih0KXtPLmFsbCh0KVsiY2F0Y2giXShNKX0pKSwiUHJvbWlzZSIse2FsbDpmdW5jdGlvbiBhbGwodCl7dmFyIG49dGhpcyxlPUkobiksaT1lLnJlc29sdmUsbz1lLnJlamVjdCx1PW0oZnVuY3Rpb24oKXt2YXIgZT1bXSx1PTAsYz0xO3kodCwhMSxmdW5jdGlvbih0KXt2YXIgZj11KyssYT0hMTtlLnB1c2gociksYysrLG4ucmVzb2x2ZSh0KS50aGVuKGZ1bmN0aW9uKHQpe2F8fChhPSEwLGVbZl09dCwtLWN8fGkoZSkpfSxvKX0pLC0tY3x8aShlKX0pO3JldHVybiB1LmUmJm8odS52KSxlLnByb21pc2V9LHJhY2U6ZnVuY3Rpb24gcmFjZSh0KXt2YXIgbj10aGlzLHI9SShuKSxlPXIucmVqZWN0LGk9bShmdW5jdGlvbigpe3kodCwhMSxmdW5jdGlvbih0KXtuLnJlc29sdmUodCkudGhlbihyLnJlc29sdmUsZSl9KX0pO3JldHVybiBpLmUmJmUoaS52KSxyLnByb21pc2V9fSl9LGZ1bmN0aW9uKHQsbixlKXt2YXIgaT1lKDExNCksbz1lKDQ1KTtlKDU4KSgiV2Vha1NldCIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIFdlYWtTZXQoKXtyZXR1cm4gdCh0aGlzLGFyZ3VtZW50cy5sZW5ndGg+MD9hcmd1bWVudHNbMF06cil9fSx7YWRkOmZ1bmN0aW9uIGFkZCh0KXtyZXR1cm4gaS5kZWYobyh0aGlzLCJXZWFrU2V0IiksdCwhMCl9fSxpLCExLCEwKX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCksaT1yKDEwKSxvPXIoMSksdT0ocigyKS5SZWZsZWN0fHx7fSkuYXBwbHksYz1GdW5jdGlvbi5hcHBseTtlKGUuUytlLkYqIXIoMykoZnVuY3Rpb24oKXt1KGZ1bmN0aW9uKCl7fSl9KSwiUmVmbGVjdCIse2FwcGx5OmZ1bmN0aW9uIGFwcGx5KHQsbixyKXt2YXIgZT1pKHQpLGY9byhyKTtyZXR1cm4gdT91KGUsbixmKTpjLmNhbGwoZSxuLGYpfX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKSxpPXIoMzYpLG89cigxMCksdT1yKDEpLGM9cig0KSxmPXIoMyksYT1yKDk1KSxzPShyKDIpLlJlZmxlY3R8fHt9KS5jb25zdHJ1Y3QsbD1mKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gRigpe31yZXR1cm4hKHMoZnVuY3Rpb24oKXt9LFtdLEYpaW5zdGFuY2VvZiBGKX0pLGg9IWYoZnVuY3Rpb24oKXtzKGZ1bmN0aW9uKCl7fSl9KTtlKGUuUytlLkYqKGx8fGgpLCJSZWZsZWN0Iix7Y29uc3RydWN0OmZ1bmN0aW9uIGNvbnN0cnVjdCh0LG4pe28odCksdShuKTt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPDM/dDpvKGFyZ3VtZW50c1syXSk7aWYoaCYmIWwpcmV0dXJuIHModCxuLHIpO2lmKHQ9PXIpe3N3aXRjaChuLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBuZXcgdDtjYXNlIDE6cmV0dXJuIG5ldyB0KG5bMF0pO2Nhc2UgMjpyZXR1cm4gbmV3IHQoblswXSxuWzFdKTtjYXNlIDM6cmV0dXJuIG5ldyB0KG5bMF0sblsxXSxuWzJdKTtjYXNlIDQ6cmV0dXJuIG5ldyB0KG5bMF0sblsxXSxuWzJdLG5bM10pfXZhciBlPVtudWxsXTtyZXR1cm4gZS5wdXNoLmFwcGx5KGUsbiksbmV3KGEuYXBwbHkodCxlKSl9dmFyIGY9ci5wcm90b3R5cGUscD1pKGMoZik/ZjpPYmplY3QucHJvdG90eXBlKSx2PUZ1bmN0aW9uLmFwcGx5LmNhbGwodCxwLG4pO3JldHVybiBjKHYpP3Y6cH19KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoNyksaT1yKDApLG89cigxKSx1PXIoMjEpO2koaS5TK2kuRipyKDMpKGZ1bmN0aW9uKCl7UmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShlLmYoe30sMSx7dmFsdWU6MX0pLDEse3ZhbHVlOjJ9KX0pLCJSZWZsZWN0Iix7ZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkodCxuLHIpe28odCksbj11KG4sITApLG8ocik7dHJ5e3JldHVybiBlLmYodCxuLHIpLCEwfWNhdGNoKGkpe3JldHVybiExfX19KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCksaT1yKDE2KS5mLG89cigxKTtlKGUuUywiUmVmbGVjdCIse2RlbGV0ZVByb3BlcnR5OmZ1bmN0aW9uIGRlbGV0ZVByb3BlcnR5KHQsbil7dmFyIHI9aShvKHQpLG4pO3JldHVybiEociYmIXIuY29uZmlndXJhYmxlKSYmZGVsZXRlIHRbbl19fSl9LGZ1bmN0aW9uKHQsbixlKXt2YXIgaT1lKDApLG89ZSgxKSx1PWZ1bmN0aW9uKHQpe3RoaXMuX3Q9byh0KSx0aGlzLl9pPTA7dmFyIG4scj10aGlzLl9rPVtdO2ZvcihuIGluIHQpci5wdXNoKG4pfTtlKDc4KSh1LCJPYmplY3QiLGZ1bmN0aW9uKCl7dmFyIHQsbj10aGlzLGU9bi5faztkb3tpZihuLl9pPj1lLmxlbmd0aClyZXR1cm57dmFsdWU6cixkb25lOiEwfX13aGlsZSghKCh0PWVbbi5faSsrXSlpbiBuLl90KSk7cmV0dXJue3ZhbHVlOnQsZG9uZTohMX19KSxpKGkuUywiUmVmbGVjdCIse2VudW1lcmF0ZTpmdW5jdGlvbiBlbnVtZXJhdGUodCl7cmV0dXJuIG5ldyB1KHQpfX0pfSxmdW5jdGlvbih0LG4sZSl7ZnVuY3Rpb24gZ2V0KHQsbil7dmFyIGUsYyxzPWFyZ3VtZW50cy5sZW5ndGg8Mz90OmFyZ3VtZW50c1syXTtyZXR1cm4gYSh0KT09PXM/dFtuXTooZT1pLmYodCxuKSk/dShlLCJ2YWx1ZSIpP2UudmFsdWU6ZS5nZXQhPT1yP2UuZ2V0LmNhbGwocyk6cjpmKGM9byh0KSk/Z2V0KGMsbixzKTp2b2lkIDB9dmFyIGk9ZSgxNiksbz1lKDE3KSx1PWUoMTEpLGM9ZSgwKSxmPWUoNCksYT1lKDEpO2MoYy5TLCJSZWZsZWN0Iix7Z2V0OmdldH0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigxNiksaT1yKDApLG89cigxKTtpKGkuUywiUmVmbGVjdCIse2dldE93blByb3BlcnR5RGVzY3JpcHRvcjpmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKXtyZXR1cm4gZS5mKG8odCksbil9fSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApLGk9cigxNyksbz1yKDEpO2UoZS5TLCJSZWZsZWN0Iix7Z2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24gZ2V0UHJvdG90eXBlT2YodCl7cmV0dXJuIGkobyh0KSl9fSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApO2UoZS5TLCJSZWZsZWN0Iix7aGFzOmZ1bmN0aW9uIGhhcyh0LG4pe3JldHVybiBuIGluIHR9fSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApLGk9cigxKSxvPU9iamVjdC5pc0V4dGVuc2libGU7ZShlLlMsIlJlZmxlY3QiLHtpc0V4dGVuc2libGU6ZnVuY3Rpb24gaXNFeHRlbnNpYmxlKHQpe3JldHVybiBpKHQpLCFvfHxvKHQpfX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKTtlKGUuUywiUmVmbGVjdCIse293bktleXM6cigxMTUpfSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApLGk9cigxKSxvPU9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucztlKGUuUywiUmVmbGVjdCIse3ByZXZlbnRFeHRlbnNpb25zOmZ1bmN0aW9uIHByZXZlbnRFeHRlbnNpb25zKHQpe2kodCk7dHJ5e3JldHVybiBvJiZvKHQpLCEwfWNhdGNoKG4pe3JldHVybiExfX19KX0sZnVuY3Rpb24odCxuLGUpe2Z1bmN0aW9uIHNldCh0LG4sZSl7dmFyIGYsaCxwPWFyZ3VtZW50cy5sZW5ndGg8ND90OmFyZ3VtZW50c1szXSx2PW8uZihzKHQpLG4pO2lmKCF2KXtpZihsKGg9dSh0KSkpcmV0dXJuIHNldChoLG4sZSxwKTt2PWEoMCl9cmV0dXJuIGModiwidmFsdWUiKT8hKCExPT09di53cml0YWJsZXx8IWwocCkpJiYoZj1vLmYocCxuKXx8YSgwKSxmLnZhbHVlPWUsaS5mKHAsbixmKSwhMCk6di5zZXQhPT1yJiYodi5zZXQuY2FsbChwLGUpLCEwKX12YXIgaT1lKDcpLG89ZSgxNiksdT1lKDE3KSxjPWUoMTEpLGY9ZSgwKSxhPWUoMzEpLHM9ZSgxKSxsPWUoNCk7ZihmLlMsIlJlZmxlY3QiLHtzZXQ6c2V0fSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApLGk9cig2OCk7aSYmZShlLlMsIlJlZmxlY3QiLHtzZXRQcm90b3R5cGVPZjpmdW5jdGlvbiBzZXRQcm90b3R5cGVPZih0LG4pe2kuY2hlY2sodCxuKTt0cnl7cmV0dXJuIGkuc2V0KHQsbiksITB9Y2F0Y2gocil7cmV0dXJuITF9fX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKTtlKGUuUywiRGF0ZSIse25vdzpmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKSxpPXIoOSksbz1yKDIxKTtlKGUuUCtlLkYqcigzKShmdW5jdGlvbigpe3JldHVybiBudWxsIT09bmV3IERhdGUoTmFOKS50b0pTT04oKXx8MSE9PURhdGUucHJvdG90eXBlLnRvSlNPTi5jYWxsKHt0b0lTT1N0cmluZzpmdW5jdGlvbigpe3JldHVybiAxfX0pfSksIkRhdGUiLHt0b0pTT046ZnVuY3Rpb24gdG9KU09OKHQpe3ZhciBuPWkodGhpcykscj1vKG4pO3JldHVybiJudW1iZXIiIT10eXBlb2Ygcnx8aXNGaW5pdGUocik/bi50b0lTT1N0cmluZygpOm51bGx9fSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApLGk9cigyNDYpO2UoZS5QK2UuRiooRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmchPT1pKSwiRGF0ZSIse3RvSVNPU3RyaW5nOml9KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMyksaT1EYXRlLnByb3RvdHlwZS5nZXRUaW1lLG89RGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcsdT1mdW5jdGlvbih0KXtyZXR1cm4gdD45P3Q6IjAiK3R9O3QuZXhwb3J0cz1lKGZ1bmN0aW9uKCl7cmV0dXJuIjAzODUtMDctMjVUMDc6MDY6MzkuOTk5WiIhPW8uY2FsbChuZXcgRGF0ZSgtNWUxMy0xKSl9KXx8IWUoZnVuY3Rpb24oKXtvLmNhbGwobmV3IERhdGUoTmFOKSl9KT9mdW5jdGlvbiB0b0lTT1N0cmluZygpe2lmKCFpc0Zpbml0ZShpLmNhbGwodGhpcykpKXRocm93IFJhbmdlRXJyb3IoIkludmFsaWQgdGltZSB2YWx1ZSIpO3ZhciB0PXRoaXMsbj10LmdldFVUQ0Z1bGxZZWFyKCkscj10LmdldFVUQ01pbGxpc2Vjb25kcygpLGU9bjwwPyItIjpuPjk5OTk/IisiOiIiO3JldHVybiBlKygiMDAwMDAiK01hdGguYWJzKG4pKS5zbGljZShlPy02Oi00KSsiLSIrdSh0LmdldFVUQ01vbnRoKCkrMSkrIi0iK3UodC5nZXRVVENEYXRlKCkpKyJUIit1KHQuZ2V0VVRDSG91cnMoKSkrIjoiK3UodC5nZXRVVENNaW51dGVzKCkpKyI6Iit1KHQuZ2V0VVRDU2Vjb25kcygpKSsiLiIrKHI+OTk/cjoiMCIrdShyKSkrIloifTpvfSxmdW5jdGlvbih0LG4scil7dmFyIGU9RGF0ZS5wcm90b3R5cGUsaT1lLnRvU3RyaW5nLG89ZS5nZXRUaW1lO25ldyBEYXRlKE5hTikrIiIhPSJJbnZhbGlkIERhdGUiJiZyKDEzKShlLCJ0b1N0cmluZyIsZnVuY3Rpb24gdG9TdHJpbmcoKXt2YXIgdD1vLmNhbGwodGhpcyk7cmV0dXJuIHQ9PT10P2kuY2FsbCh0aGlzKToiSW52YWxpZCBEYXRlIn0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cig1KSgidG9QcmltaXRpdmUiKSxpPURhdGUucHJvdG90eXBlO2UgaW4gaXx8cigxMikoaSxlLHIoMjQ5KSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDEpLGk9cigyMSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciIT09dCYmIm51bWJlciIhPT10JiYiZGVmYXVsdCIhPT10KXRocm93IFR5cGVFcnJvcigiSW5jb3JyZWN0IGhpbnQiKTtyZXR1cm4gaShlKHRoaXMpLCJudW1iZXIiIT10KX19LGZ1bmN0aW9uKHQsbixlKXt2YXIgaT1lKDApLG89ZSg1OSksdT1lKDg4KSxjPWUoMSksZj1lKDM1KSxhPWUoOCkscz1lKDQpLGw9ZSgyKS5BcnJheUJ1ZmZlcixoPWUoNTcpLHA9dS5BcnJheUJ1ZmZlcix2PXUuRGF0YVZpZXcsZz1vLkFCViYmbC5pc1ZpZXcseT1wLnByb3RvdHlwZS5zbGljZSxkPW8uVklFVztpKGkuRytpLlcraS5GKihsIT09cCkse0FycmF5QnVmZmVyOnB9KSxpKGkuUytpLkYqIW8uQ09OU1RSLCJBcnJheUJ1ZmZlciIse2lzVmlldzpmdW5jdGlvbiBpc1ZpZXcodCl7cmV0dXJuIGcmJmcodCl8fHModCkmJmQgaW4gdH19KSxpKGkuUCtpLlUraS5GKmUoMykoZnVuY3Rpb24oKXtyZXR1cm4hbmV3IHAoMikuc2xpY2UoMSxyKS5ieXRlTGVuZ3RofSksIkFycmF5QnVmZmVyIix7c2xpY2U6ZnVuY3Rpb24gc2xpY2UodCxuKXtpZih5IT09ciYmbj09PXIpcmV0dXJuIHkuY2FsbChjKHRoaXMpLHQpO2Zvcih2YXIgZT1jKHRoaXMpLmJ5dGVMZW5ndGgsaT1mKHQsZSksbz1mKG49PT1yP2U6bixlKSx1PW5ldyhoKHRoaXMscCkpKGEoby1pKSkscz1uZXcgdih0aGlzKSxsPW5ldyB2KHUpLGc9MDtpPG87KWwuc2V0VWludDgoZysrLHMuZ2V0VWludDgoaSsrKSk7cmV0dXJuIHV9fSksZSgzOCkoIkFycmF5QnVmZmVyIil9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApO2UoZS5HK2UuVytlLkYqIXIoNTkpLkFCVix7RGF0YVZpZXc6cig4OCkuRGF0YVZpZXd9KX0sZnVuY3Rpb24odCxuLHIpe3IoMjYpKCJJbnQ4IiwxLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBJbnQ4QXJyYXkobixyLGUpe3JldHVybiB0KHRoaXMsbixyLGUpfX0pfSxmdW5jdGlvbih0LG4scil7cigyNikoIlVpbnQ4IiwxLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBVaW50OEFycmF5KG4scixlKXtyZXR1cm4gdCh0aGlzLG4scixlKX19KX0sZnVuY3Rpb24odCxuLHIpe3IoMjYpKCJVaW50OCIsMSxmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gVWludDhDbGFtcGVkQXJyYXkobixyLGUpe3JldHVybiB0KHRoaXMsbixyLGUpfX0sITApfSxmdW5jdGlvbih0LG4scil7cigyNikoIkludDE2IiwyLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBJbnQxNkFycmF5KG4scixlKXtyZXR1cm4gdCh0aGlzLG4scixlKX19KX0sZnVuY3Rpb24odCxuLHIpe3IoMjYpKCJVaW50MTYiLDIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIFVpbnQxNkFycmF5KG4scixlKXtyZXR1cm4gdCh0aGlzLG4scixlKX19KX0sZnVuY3Rpb24odCxuLHIpe3IoMjYpKCJJbnQzMiIsNCxmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gSW50MzJBcnJheShuLHIsZSl7cmV0dXJuIHQodGhpcyxuLHIsZSl9fSl9LGZ1bmN0aW9uKHQsbixyKXtyKDI2KSgiVWludDMyIiw0LGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBVaW50MzJBcnJheShuLHIsZSl7cmV0dXJuIHQodGhpcyxuLHIsZSl9fSl9LGZ1bmN0aW9uKHQsbixyKXtyKDI2KSgiRmxvYXQzMiIsNCxmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gRmxvYXQzMkFycmF5KG4scixlKXtyZXR1cm4gdCh0aGlzLG4scixlKX19KX0sZnVuY3Rpb24odCxuLHIpe3IoMjYpKCJGbG9hdDY0Iiw4LGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBGbG9hdDY0QXJyYXkobixyLGUpe3JldHVybiB0KHRoaXMsbixyLGUpfX0pfSxmdW5jdGlvbih0LG4sZSl7dmFyIGk9ZSgwKSxvPWUoNTApKCEwKTtpKGkuUCwiQXJyYXkiLHtpbmNsdWRlczpmdW5jdGlvbiBpbmNsdWRlcyh0KXtyZXR1cm4gbyh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTpyKX19KSxlKDMwKSgiaW5jbHVkZXMiKX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCksaT1yKDExNyksbz1yKDkpLHU9cig4KSxjPXIoMTApLGY9cig4Mik7ZShlLlAsIkFycmF5Iix7ZmxhdE1hcDpmdW5jdGlvbiBmbGF0TWFwKHQpe3ZhciBuLHIsZT1vKHRoaXMpO3JldHVybiBjKHQpLG49dShlLmxlbmd0aCkscj1mKGUsMCksaShyLGUsZSxuLDAsMSx0LGFyZ3VtZW50c1sxXSkscn19KSxyKDMwKSgiZmxhdE1hcCIpfSxmdW5jdGlvbih0LG4sZSl7dmFyIGk9ZSgwKSxvPWUoMTE3KSx1PWUoOSksYz1lKDgpLGY9ZSgyMyksYT1lKDgyKTtpKGkuUCwiQXJyYXkiLHtmbGF0dGVuOmZ1bmN0aW9uIGZsYXR0ZW4oKXt2YXIgdD1hcmd1bWVudHNbMF0sbj11KHRoaXMpLGU9YyhuLmxlbmd0aCksaT1hKG4sMCk7cmV0dXJuIG8oaSxuLG4sZSwwLHQ9PT1yPzE6Zih0KSksaX19KSxlKDMwKSgiZmxhdHRlbiIpfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKSxpPXIoNzQpKCEwKTtlKGUuUCwiU3RyaW5nIix7YXQ6ZnVuY3Rpb24gYXQodCl7cmV0dXJuIGkodGhpcyx0KX19KX0sZnVuY3Rpb24odCxuLGUpe3ZhciBpPWUoMCksbz1lKDExOCk7aShpLlAsIlN0cmluZyIse3BhZFN0YXJ0OmZ1bmN0aW9uIHBhZFN0YXJ0KHQpe3JldHVybiBvKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnIsITApfX0pfSxmdW5jdGlvbih0LG4sZSl7dmFyIGk9ZSgwKSxvPWUoMTE4KTtpKGkuUCwiU3RyaW5nIix7cGFkRW5kOmZ1bmN0aW9uIHBhZEVuZCh0KXtyZXR1cm4gbyh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTpyLCExKX19KX0sZnVuY3Rpb24odCxuLHIpe3IoNDMpKCJ0cmltTGVmdCIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIHRyaW1MZWZ0KCl7cmV0dXJuIHQodGhpcywxKX19LCJ0cmltU3RhcnQiKX0sZnVuY3Rpb24odCxuLHIpe3IoNDMpKCJ0cmltUmlnaHQiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiB0cmltUmlnaHQoKXtyZXR1cm4gdCh0aGlzLDIpfX0sInRyaW1FbmQiKX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCksaT1yKDIyKSxvPXIoOCksdT1yKDUzKSxjPXIoNTUpLGY9UmVnRXhwLnByb3RvdHlwZSxhPWZ1bmN0aW9uKHQsbil7dGhpcy5fcj10LHRoaXMuX3M9bn07cig3OCkoYSwiUmVnRXhwIFN0cmluZyIsZnVuY3Rpb24gbmV4dCgpe3ZhciB0PXRoaXMuX3IuZXhlYyh0aGlzLl9zKTtyZXR1cm57dmFsdWU6dCxkb25lOm51bGw9PT10fX0pLGUoZS5QLCJTdHJpbmciLHttYXRjaEFsbDpmdW5jdGlvbiBtYXRjaEFsbCh0KXtpZihpKHRoaXMpLCF1KHQpKXRocm93IFR5cGVFcnJvcih0KyIgaXMgbm90IGEgcmVnZXhwISIpO3ZhciBuPVN0cmluZyh0aGlzKSxyPSJmbGFncyJpbiBmP1N0cmluZyh0LmZsYWdzKTpjLmNhbGwodCksZT1uZXcgUmVnRXhwKHQuc291cmNlLH5yLmluZGV4T2YoImciKT9yOiJnIityKTtyZXR1cm4gZS5sYXN0SW5kZXg9byh0Lmxhc3RJbmRleCksbmV3IGEoZSxuKX19KX0sZnVuY3Rpb24odCxuLHIpe3IoNjQpKCJhc3luY0l0ZXJhdG9yIil9LGZ1bmN0aW9uKHQsbixyKXtyKDY0KSgib2JzZXJ2YWJsZSIpfSxmdW5jdGlvbih0LG4sZSl7dmFyIGk9ZSgwKSxvPWUoMTE1KSx1PWUoMTUpLGM9ZSgxNiksZj1lKDgwKTtpKGkuUywiT2JqZWN0Iix7Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yczpmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpe2Zvcih2YXIgbixlLGk9dSh0KSxhPWMuZixzPW8oaSksbD17fSxoPTA7cy5sZW5ndGg+aDspKGU9YShpLG49c1toKytdKSkhPT1yJiZmKGwsbixlKTtyZXR1cm4gbH19KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCksaT1yKDExOSkoITEpO2UoZS5TLCJPYmplY3QiLHt2YWx1ZXM6ZnVuY3Rpb24gdmFsdWVzKHQpe3JldHVybiBpKHQpfX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKSxpPXIoMTE5KSghMCk7ZShlLlMsIk9iamVjdCIse2VudHJpZXM6ZnVuY3Rpb24gZW50cmllcyh0KXtyZXR1cm4gaSh0KX19KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCksaT1yKDkpLG89cigxMCksdT1yKDcpO3IoNikmJmUoZS5QK3IoNjApLCJPYmplY3QiLHtfX2RlZmluZUdldHRlcl9fOmZ1bmN0aW9uIF9fZGVmaW5lR2V0dGVyX18odCxuKXt1LmYoaSh0aGlzKSx0LHtnZXQ6byhuKSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pfX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKSxpPXIoOSksbz1yKDEwKSx1PXIoNyk7cig2KSYmZShlLlArcig2MCksIk9iamVjdCIse19fZGVmaW5lU2V0dGVyX186ZnVuY3Rpb24gX19kZWZpbmVTZXR0ZXJfXyh0LG4pe3UuZihpKHRoaXMpLHQse3NldDpvKG4pLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9fSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApLGk9cig5KSxvPXIoMjEpLHU9cigxNyksYz1yKDE2KS5mO3IoNikmJmUoZS5QK3IoNjApLCJPYmplY3QiLHtfX2xvb2t1cEdldHRlcl9fOmZ1bmN0aW9uIF9fbG9va3VwR2V0dGVyX18odCl7dmFyIG4scj1pKHRoaXMpLGU9byh0LCEwKTtkb3tpZihuPWMocixlKSlyZXR1cm4gbi5nZXR9d2hpbGUocj11KHIpKX19KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCksaT1yKDkpLG89cigyMSksdT1yKDE3KSxjPXIoMTYpLmY7cig2KSYmZShlLlArcig2MCksIk9iamVjdCIse19fbG9va3VwU2V0dGVyX186ZnVuY3Rpb24gX19sb29rdXBTZXR0ZXJfXyh0KXt2YXIgbixyPWkodGhpcyksZT1vKHQsITApO2Rve2lmKG49YyhyLGUpKXJldHVybiBuLnNldH13aGlsZShyPXUocikpfX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKTtlKGUuUCtlLlIsIk1hcCIse3RvSlNPTjpyKDEyMCkoIk1hcCIpfSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApO2UoZS5QK2UuUiwiU2V0Iix7dG9KU09OOnIoMTIwKSgiU2V0Iil9KX0sZnVuY3Rpb24odCxuLHIpe3IoNjEpKCJNYXAiKX0sZnVuY3Rpb24odCxuLHIpe3IoNjEpKCJTZXQiKX0sZnVuY3Rpb24odCxuLHIpe3IoNjEpKCJXZWFrTWFwIil9LGZ1bmN0aW9uKHQsbixyKXtyKDYxKSgiV2Vha1NldCIpfSxmdW5jdGlvbih0LG4scil7cig2MikoIk1hcCIpfSxmdW5jdGlvbih0LG4scil7cig2MikoIlNldCIpfSxmdW5jdGlvbih0LG4scil7cig2MikoIldlYWtNYXAiKX0sZnVuY3Rpb24odCxuLHIpe3IoNjIpKCJXZWFrU2V0Iil9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApO2UoZS5HLHtnbG9iYWw6cigyKX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKTtlKGUuUywiU3lzdGVtIix7Z2xvYmFsOnIoMil9KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCksaT1yKDE5KTtlKGUuUywiRXJyb3IiLHtpc0Vycm9yOmZ1bmN0aW9uIGlzRXJyb3IodCl7cmV0dXJuIkVycm9yIj09PWkodCl9fSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApO2UoZS5TLCJNYXRoIix7Y2xhbXA6ZnVuY3Rpb24gY2xhbXAodCxuLHIpe3JldHVybiBNYXRoLm1pbihyLE1hdGgubWF4KG4sdCkpfX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKTtlKGUuUywiTWF0aCIse0RFR19QRVJfUkFEOk1hdGguUEkvMTgwfSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApLGk9MTgwL01hdGguUEk7ZShlLlMsIk1hdGgiLHtkZWdyZWVzOmZ1bmN0aW9uIGRlZ3JlZXModCl7cmV0dXJuIHQqaX19KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCksaT1yKDEyMiksbz1yKDEwMik7ZShlLlMsIk1hdGgiLHtmc2NhbGU6ZnVuY3Rpb24gZnNjYWxlKHQsbixyLGUsdSl7cmV0dXJuIG8oaSh0LG4scixlLHUpKX19KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCk7ZShlLlMsIk1hdGgiLHtpYWRkaDpmdW5jdGlvbiBpYWRkaCh0LG4scixlKXt2YXIgaT10Pj4+MCxvPXI+Pj4wO3JldHVybihuPj4+MCkrKGU+Pj4wKSsoKGkmb3woaXxvKSZ+KGkrbz4+PjApKT4+PjMxKXwwfX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKTtlKGUuUywiTWF0aCIse2lzdWJoOmZ1bmN0aW9uIGlzdWJoKHQsbixyLGUpe3ZhciBpPXQ+Pj4wLG89cj4+PjA7cmV0dXJuKG4+Pj4wKS0oZT4+PjApLSgofmkmb3x+KGlebykmaS1vPj4+MCk+Pj4zMSl8MH19KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCk7ZShlLlMsIk1hdGgiLHtpbXVsaDpmdW5jdGlvbiBpbXVsaCh0LG4pe3ZhciByPSt0LGU9K24saT02NTUzNSZyLG89NjU1MzUmZSx1PXI+PjE2LGM9ZT4+MTYsZj0odSpvPj4+MCkrKGkqbz4+PjE2KTtyZXR1cm4gdSpjKyhmPj4xNikrKChpKmM+Pj4wKSsoNjU1MzUmZik+PjE2KX19KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCk7ZShlLlMsIk1hdGgiLHtSQURfUEVSX0RFRzoxODAvTWF0aC5QSX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKSxpPU1hdGguUEkvMTgwO2UoZS5TLCJNYXRoIix7cmFkaWFuczpmdW5jdGlvbiByYWRpYW5zKHQpe3JldHVybiB0Kml9fSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApO2UoZS5TLCJNYXRoIix7c2NhbGU6cigxMjIpfSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDApO2UoZS5TLCJNYXRoIix7dW11bGg6ZnVuY3Rpb24gdW11bGgodCxuKXt2YXIgcj0rdCxlPStuLGk9NjU1MzUmcixvPTY1NTM1JmUsdT1yPj4+MTYsYz1lPj4+MTYsZj0odSpvPj4+MCkrKGkqbz4+PjE2KTtyZXR1cm4gdSpjKyhmPj4+MTYpKygoaSpjPj4+MCkrKDY1NTM1JmYpPj4+MTYpfX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKTtlKGUuUywiTWF0aCIse3NpZ25iaXQ6ZnVuY3Rpb24gc2lnbmJpdCh0KXtyZXR1cm4odD0rdCkhPXQ/dDowPT10PzEvdD09SW5maW5pdHk6dD4wfX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigwKSxpPXIoMjgpLG89cigyKSx1PXIoNTcpLGM9cigxMDkpO2UoZS5QK2UuUiwiUHJvbWlzZSIseyJmaW5hbGx5IjpmdW5jdGlvbih0KXt2YXIgbj11KHRoaXMsaS5Qcm9taXNlfHxvLlByb21pc2UpLHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ7cmV0dXJuIHRoaXMudGhlbihyP2Z1bmN0aW9uKHIpe3JldHVybiBjKG4sdCgpKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KX06dCxyP2Z1bmN0aW9uKHIpe3JldHVybiBjKG4sdCgpKS50aGVuKGZ1bmN0aW9uKCl7dGhyb3cgcn0pfTp0KX19KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCksaT1yKDg3KSxvPXIoMTA4KTtlKGUuUywiUHJvbWlzZSIseyJ0cnkiOmZ1bmN0aW9uKHQpe3ZhciBuPWkuZih0aGlzKSxyPW8odCk7cmV0dXJuKHIuZT9uLnJlamVjdDpuLnJlc29sdmUpKHIudiksbi5wcm9taXNlfX0pfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigyNyksaT1yKDEpLG89ZS5rZXksdT1lLnNldDtlLmV4cCh7ZGVmaW5lTWV0YWRhdGE6ZnVuY3Rpb24gZGVmaW5lTWV0YWRhdGEodCxuLHIsZSl7dSh0LG4saShyKSxvKGUpKX19KX0sZnVuY3Rpb24odCxuLGUpe3ZhciBpPWUoMjcpLG89ZSgxKSx1PWkua2V5LGM9aS5tYXAsZj1pLnN0b3JlO2kuZXhwKHtkZWxldGVNZXRhZGF0YTpmdW5jdGlvbiBkZWxldGVNZXRhZGF0YSh0LG4pe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg8Mz9yOnUoYXJndW1lbnRzWzJdKSxpPWMobyhuKSxlLCExKTtpZihpPT09cnx8IWlbImRlbGV0ZSJdKHQpKXJldHVybiExO2lmKGkuc2l6ZSlyZXR1cm4hMDt2YXIgYT1mLmdldChuKTtyZXR1cm4gYVsiZGVsZXRlIl0oZSksISFhLnNpemV8fGZbImRlbGV0ZSJdKG4pfX0pfSxmdW5jdGlvbih0LG4sZSl7dmFyIGk9ZSgyNyksbz1lKDEpLHU9ZSgxNyksYz1pLmhhcyxmPWkuZ2V0LGE9aS5rZXkscz1mdW5jdGlvbih0LG4sZSl7aWYoYyh0LG4sZSkpcmV0dXJuIGYodCxuLGUpO3ZhciBpPXUobik7cmV0dXJuIG51bGwhPT1pP3ModCxpLGUpOnJ9O2kuZXhwKHtnZXRNZXRhZGF0YTpmdW5jdGlvbiBnZXRNZXRhZGF0YSh0LG4pe3JldHVybiBzKHQsbyhuKSxhcmd1bWVudHMubGVuZ3RoPDM/cjphKGFyZ3VtZW50c1syXSkpfX0pfSxmdW5jdGlvbih0LG4sZSl7dmFyIGk9ZSgxMTIpLG89ZSgxMjEpLHU9ZSgyNyksYz1lKDEpLGY9ZSgxNyksYT11LmtleXMscz11LmtleSxsPWZ1bmN0aW9uKHQsbil7dmFyIHI9YSh0LG4pLGU9Zih0KTtpZihudWxsPT09ZSlyZXR1cm4gcjt2YXIgdT1sKGUsbik7cmV0dXJuIHUubGVuZ3RoP3IubGVuZ3RoP28obmV3IGkoci5jb25jYXQodSkpKTp1OnJ9O3UuZXhwKHtnZXRNZXRhZGF0YUtleXM6ZnVuY3Rpb24gZ2V0TWV0YWRhdGFLZXlzKHQpe3JldHVybiBsKGModCksYXJndW1lbnRzLmxlbmd0aDwyP3I6cyhhcmd1bWVudHNbMV0pKX19KX0sZnVuY3Rpb24odCxuLGUpe3ZhciBpPWUoMjcpLG89ZSgxKSx1PWkuZ2V0LGM9aS5rZXk7aS5leHAoe2dldE93bk1ldGFkYXRhOmZ1bmN0aW9uIGdldE93bk1ldGFkYXRhKHQsbil7cmV0dXJuIHUodCxvKG4pLGFyZ3VtZW50cy5sZW5ndGg8Mz9yOmMoYXJndW1lbnRzWzJdKSl9fSl9LGZ1bmN0aW9uKHQsbixlKXt2YXIgaT1lKDI3KSxvPWUoMSksdT1pLmtleXMsYz1pLmtleTtpLmV4cCh7Z2V0T3duTWV0YWRhdGFLZXlzOmZ1bmN0aW9uIGdldE93bk1ldGFkYXRhS2V5cyh0KXtyZXR1cm4gdShvKHQpLGFyZ3VtZW50cy5sZW5ndGg8Mj9yOmMoYXJndW1lbnRzWzFdKSl9fSl9LGZ1bmN0aW9uKHQsbixlKXt2YXIgaT1lKDI3KSxvPWUoMSksdT1lKDE3KSxjPWkuaGFzLGY9aS5rZXksYT1mdW5jdGlvbih0LG4scil7aWYoYyh0LG4scikpcmV0dXJuITA7dmFyIGU9dShuKTtyZXR1cm4gbnVsbCE9PWUmJmEodCxlLHIpfTtpLmV4cCh7aGFzTWV0YWRhdGE6ZnVuY3Rpb24gaGFzTWV0YWRhdGEodCxuKXtyZXR1cm4gYSh0LG8obiksYXJndW1lbnRzLmxlbmd0aDwzP3I6Zihhcmd1bWVudHNbMl0pKX19KX0sZnVuY3Rpb24odCxuLGUpe3ZhciBpPWUoMjcpLG89ZSgxKSx1PWkuaGFzLGM9aS5rZXk7aS5leHAoe2hhc093bk1ldGFkYXRhOmZ1bmN0aW9uIGhhc093bk1ldGFkYXRhKHQsbil7cmV0dXJuIHUodCxvKG4pLGFyZ3VtZW50cy5sZW5ndGg8Mz9yOmMoYXJndW1lbnRzWzJdKSl9fSl9LGZ1bmN0aW9uKHQsbixlKXt2YXIgaT1lKDI3KSxvPWUoMSksdT1lKDEwKSxjPWkua2V5LGY9aS5zZXQ7aS5leHAoe21ldGFkYXRhOmZ1bmN0aW9uIG1ldGFkYXRhKHQsbil7cmV0dXJuIGZ1bmN0aW9uIGRlY29yYXRvcihlLGkpe2YodCxuLChpIT09cj9vOnUpKGUpLGMoaSkpfX19KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCksaT1yKDg2KSgpLG89cigyKS5wcm9jZXNzLHU9InByb2Nlc3MiPT1yKDE5KShvKTtlKGUuRyx7YXNhcDpmdW5jdGlvbiBhc2FwKHQpe3ZhciBuPXUmJm8uZG9tYWluO2kobj9uLmJpbmQodCk6dCl9fSl9LGZ1bmN0aW9uKHQsbixlKXt2YXIgaT1lKDApLG89ZSgyKSx1PWUoMjgpLGM9ZSg4NikoKSxmPWUoNSkoIm9ic2VydmFibGUiKSxhPWUoMTApLHM9ZSgxKSxsPWUoMzkpLGg9ZSg0MSkscD1lKDEyKSx2PWUoNDApLGc9di5SRVRVUk4seT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9yOmEodCl9LGQ9ZnVuY3Rpb24odCl7dmFyIG49dC5fYztuJiYodC5fYz1yLG4oKSl9LF89ZnVuY3Rpb24odCl7cmV0dXJuIHQuX289PT1yfSxTPWZ1bmN0aW9uKHQpe18odCl8fCh0Ll9vPXIsZCh0KSl9LGI9ZnVuY3Rpb24odCxuKXtzKHQpLHRoaXMuX2M9cix0aGlzLl9vPXQsdD1uZXcgbSh0aGlzKTt0cnl7dmFyIGU9bih0KSxpPWU7bnVsbCE9ZSYmKCJmdW5jdGlvbiI9PXR5cGVvZiBlLnVuc3Vic2NyaWJlP2U9ZnVuY3Rpb24oKXtpLnVuc3Vic2NyaWJlKCl9OmEoZSksdGhpcy5fYz1lKX1jYXRjaChvKXtyZXR1cm4gdm9pZCB0LmVycm9yKG8pfV8odGhpcykmJmQodGhpcyl9O2IucHJvdG90eXBlPWgoe30se3Vuc3Vic2NyaWJlOmZ1bmN0aW9uIHVuc3Vic2NyaWJlKCl7Uyh0aGlzKX19KTt2YXIgbT1mdW5jdGlvbih0KXt0aGlzLl9zPXR9O20ucHJvdG90eXBlPWgoe30se25leHQ6ZnVuY3Rpb24gbmV4dCh0KXt2YXIgbj10aGlzLl9zO2lmKCFfKG4pKXt2YXIgcj1uLl9vO3RyeXt2YXIgZT15KHIubmV4dCk7aWYoZSlyZXR1cm4gZS5jYWxsKHIsdCl9Y2F0Y2goaSl7dHJ5e1Mobil9ZmluYWxseXt0aHJvdyBpfX19fSxlcnJvcjpmdW5jdGlvbiBlcnJvcih0KXt2YXIgbj10aGlzLl9zO2lmKF8obikpdGhyb3cgdDt2YXIgZT1uLl9vO24uX289cjt0cnl7dmFyIGk9eShlLmVycm9yKTtpZighaSl0aHJvdyB0O3Q9aS5jYWxsKGUsdCl9Y2F0Y2gobyl7dHJ5e2Qobil9ZmluYWxseXt0aHJvdyBvfX1yZXR1cm4gZChuKSx0fSxjb21wbGV0ZTpmdW5jdGlvbiBjb21wbGV0ZSh0KXt2YXIgbj10aGlzLl9zO2lmKCFfKG4pKXt2YXIgZT1uLl9vO24uX289cjt0cnl7dmFyIGk9eShlLmNvbXBsZXRlKTt0PWk/aS5jYWxsKGUsdCk6cn1jYXRjaChvKXt0cnl7ZChuKX1maW5hbGx5e3Rocm93IG99fXJldHVybiBkKG4pLHR9fX0pO3ZhciB4PWZ1bmN0aW9uIE9ic2VydmFibGUodCl7bCh0aGlzLHgsIk9ic2VydmFibGUiLCJfZiIpLl9mPWEodCl9O2goeC5wcm90b3R5cGUse3N1YnNjcmliZTpmdW5jdGlvbiBzdWJzY3JpYmUodCl7cmV0dXJuIG5ldyBiKHQsdGhpcy5fZil9LGZvckVhY2g6ZnVuY3Rpb24gZm9yRWFjaCh0KXt2YXIgbj10aGlzO3JldHVybiBuZXcodS5Qcm9taXNlfHxvLlByb21pc2UpKGZ1bmN0aW9uKHIsZSl7YSh0KTt2YXIgaT1uLnN1YnNjcmliZSh7bmV4dDpmdW5jdGlvbihuKXt0cnl7cmV0dXJuIHQobil9Y2F0Y2gocil7ZShyKSxpLnVuc3Vic2NyaWJlKCl9fSxlcnJvcjplLGNvbXBsZXRlOnJ9KX0pfX0pLGgoeCx7ZnJvbTpmdW5jdGlvbiBmcm9tKHQpe3ZhciBuPSJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzP3RoaXM6eCxyPXkocyh0KVtmXSk7aWYocil7dmFyIGU9cyhyLmNhbGwodCkpO3JldHVybiBlLmNvbnN0cnVjdG9yPT09bj9lOm5ldyBuKGZ1bmN0aW9uKHQpe3JldHVybiBlLnN1YnNjcmliZSh0KX0pfXJldHVybiBuZXcgbihmdW5jdGlvbihuKXt2YXIgcj0hMTtyZXR1cm4gYyhmdW5jdGlvbigpe2lmKCFyKXt0cnl7aWYodih0LCExLGZ1bmN0aW9uKHQpe2lmKG4ubmV4dCh0KSxyKXJldHVybiBnfSk9PT1nKXJldHVybn1jYXRjaChlKXtpZihyKXRocm93IGU7cmV0dXJuIHZvaWQgbi5lcnJvcihlKX1uLmNvbXBsZXRlKCl9fSksZnVuY3Rpb24oKXtyPSEwfX0pfSxvZjpmdW5jdGlvbiBvZigpe2Zvcih2YXIgdD0wLG49YXJndW1lbnRzLmxlbmd0aCxyPUFycmF5KG4pO3Q8bjspclt0XT1hcmd1bWVudHNbdCsrXTtyZXR1cm4gbmV3KCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzP3RoaXM6eCkoZnVuY3Rpb24odCl7dmFyIG49ITE7cmV0dXJuIGMoZnVuY3Rpb24oKXtpZighbil7Zm9yKHZhciBlPTA7ZTxyLmxlbmd0aDsrK2UpaWYodC5uZXh0KHJbZV0pLG4pcmV0dXJuO3QuY29tcGxldGUoKX19KSxmdW5jdGlvbigpe249ITB9fSl9fSkscCh4LnByb3RvdHlwZSxmLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxpKGkuRyx7T2JzZXJ2YWJsZTp4fSksZSgzOCkoIk9ic2VydmFibGUiKX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMCksaT1yKDg1KTtlKGUuRytlLkIse3NldEltbWVkaWF0ZTppLnNldCxjbGVhckltbWVkaWF0ZTppLmNsZWFyfSl9LGZ1bmN0aW9uKHQsbixyKXtmb3IodmFyIGU9cig4NCksaT1yKDM0KSxvPXIoMTMpLHU9cigyKSxjPXIoMTIpLGY9cig0NCksYT1yKDUpLHM9YSgiaXRlcmF0b3IiKSxsPWEoInRvU3RyaW5nVGFnIiksaD1mLkFycmF5LHA9e0NTU1J1bGVMaXN0OiEwLENTU1N0eWxlRGVjbGFyYXRpb246ITEsQ1NTVmFsdWVMaXN0OiExLENsaWVudFJlY3RMaXN0OiExLERPTVJlY3RMaXN0OiExLERPTVN0cmluZ0xpc3Q6ITEsRE9NVG9rZW5MaXN0OiEwLERhdGFUcmFuc2Zlckl0ZW1MaXN0OiExLEZpbGVMaXN0OiExLEhUTUxBbGxDb2xsZWN0aW9uOiExLEhUTUxDb2xsZWN0aW9uOiExLEhUTUxGb3JtRWxlbWVudDohMSxIVE1MU2VsZWN0RWxlbWVudDohMSxNZWRpYUxpc3Q6ITAsTWltZVR5cGVBcnJheTohMSxOYW1lZE5vZGVNYXA6ITEsTm9kZUxpc3Q6ITAsUGFpbnRSZXF1ZXN0TGlzdDohMSxQbHVnaW46ITEsUGx1Z2luQXJyYXk6ITEsU1ZHTGVuZ3RoTGlzdDohMSxTVkdOdW1iZXJMaXN0OiExLFNWR1BhdGhTZWdMaXN0OiExLFNWR1BvaW50TGlzdDohMSxTVkdTdHJpbmdMaXN0OiExLFNWR1RyYW5zZm9ybUxpc3Q6ITEsU291cmNlQnVmZmVyTGlzdDohMSxTdHlsZVNoZWV0TGlzdDohMCxUZXh0VHJhY2tDdWVMaXN0OiExLFRleHRUcmFja0xpc3Q6ITEsVG91Y2hMaXN0OiExfSx2PWkocCksZz0wO2c8di5sZW5ndGg7ZysrKXt2YXIgeSxkPXZbZ10sXz1wW2RdLFM9dVtkXSxiPVMmJlMucHJvdG90eXBlO2lmKGImJihiW3NdfHxjKGIscyxoKSxiW2xdfHxjKGIsbCxkKSxmW2RdPWgsXykpZm9yKHkgaW4gZSliW3ldfHxvKGIseSxlW3ldLCEwKX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDIpLGk9cigwKSxvPWUubmF2aWdhdG9yLHU9W10uc2xpY2UsYz0hIW8mJi9NU0lFIC5cLi8udGVzdChvLnVzZXJBZ2VudCksZj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obixyKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjIsaT0hIWUmJnUuY2FsbChhcmd1bWVudHMsMik7cmV0dXJuIHQoZT9mdW5jdGlvbigpeygiZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkZ1bmN0aW9uKG4pKS5hcHBseSh0aGlzLGkpfTpuLHIpfX07aShpLkcraS5CK2kuRipjLHtzZXRUaW1lb3V0OmYoZS5zZXRUaW1lb3V0KSxzZXRJbnRlcnZhbDpmKGUuc2V0SW50ZXJ2YWwpfSl9XSksInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPXQ6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoZnVuY3Rpb24oKXtyZXR1cm4gdH0pOm4uY29yZT10fSgxLDEpOwovLyMgc291cmNlTWFwcGluZ1VSTD1zaGltLm1pbi5qcy5tYXA="></script>
<script src="data:application/x-javascript;base64,LyoqIEBsaWNlbnNlIFJlYWN0IHYxNi4xLjEKICogcmVhY3QucHJvZHVjdGlvbi5taW4uanMKICoKICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqLwondXNlIHN0cmljdCc7KGZ1bmN0aW9uKHAsbCl7Im9iamVjdCI9PT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPWwoKToiZnVuY3Rpb24iPT09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUobCk6cC5SZWFjdD1sKCl9KSh0aGlzLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcChhKXtmb3IodmFyIGI9YXJndW1lbnRzLmxlbmd0aC0xLGM9Ik1pbmlmaWVkIFJlYWN0IGVycm9yICMiK2ErIjsgdmlzaXQgaHR0cDovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL2Vycm9yLWRlY29kZXIuaHRtbD9pbnZhcmlhbnRceDNkIithLGU9MDtlPGI7ZSsrKWMrPSJceDI2YXJnc1tdXHgzZCIrZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3VtZW50c1tlKzFdKTtiPUVycm9yKGMrIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuIik7CmIubmFtZT0iSW52YXJpYW50IFZpb2xhdGlvbiI7Yi5mcmFtZXNUb1BvcD0xO3Rocm93IGI7fWZ1bmN0aW9uIGwoYSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGF9fWZ1bmN0aW9uIG4oYSxiLGMpe3RoaXMucHJvcHM9YTt0aGlzLmNvbnRleHQ9Yjt0aGlzLnJlZnM9djt0aGlzLnVwZGF0ZXI9Y3x8d31mdW5jdGlvbiB4KGEsYixjKXt0aGlzLnByb3BzPWE7dGhpcy5jb250ZXh0PWI7dGhpcy5yZWZzPXY7dGhpcy51cGRhdGVyPWN8fHd9ZnVuY3Rpb24geSgpe31mdW5jdGlvbiB6KGEsYixjKXt0aGlzLnByb3BzPWE7dGhpcy5jb250ZXh0PWI7dGhpcy5yZWZzPXY7dGhpcy51cGRhdGVyPWN8fHd9ZnVuY3Rpb24gRihhLGIsYyl7dmFyIGUsZj17fSxkPW51bGwsaD1udWxsO2lmKG51bGwhPWIpZm9yKGUgaW4gdm9pZCAwIT09Yi5yZWYmJihoPWIucmVmKSx2b2lkIDAhPT1iLmtleSYmKGQ9IiIrYi5rZXkpLGIpRy5jYWxsKGIsZSkmJiFILmhhc093blByb3BlcnR5KGUpJiYoZltlXT1iW2VdKTsKdmFyIGc9YXJndW1lbnRzLmxlbmd0aC0yO2lmKDE9PT1nKWYuY2hpbGRyZW49YztlbHNlIGlmKDE8Zyl7Zm9yKHZhciBrPUFycmF5KGcpLG09MDttPGc7bSsrKWtbbV09YXJndW1lbnRzW20rMl07Zi5jaGlsZHJlbj1rfWlmKGEmJmEuZGVmYXVsdFByb3BzKWZvcihlIGluIGc9YS5kZWZhdWx0UHJvcHMsZyl2b2lkIDA9PT1mW2VdJiYoZltlXT1nW2VdKTtyZXR1cm57JCR0eXBlb2Y6cix0eXBlOmEsa2V5OmQscmVmOmgscHJvcHM6Zixfb3duZXI6QS5jdXJyZW50fX1mdW5jdGlvbiBCKGEpe3JldHVybiJvYmplY3QiPT09dHlwZW9mIGEmJm51bGwhPT1hJiZhLiQkdHlwZW9mPT09cn1mdW5jdGlvbiBPKGEpe3ZhciBiPXsiXHgzZCI6Ilx4M2QwIiwiOiI6Ilx4M2QyIn07cmV0dXJuIiQiKygiIithKS5yZXBsYWNlKC9bPTpdL2csZnVuY3Rpb24oYSl7cmV0dXJuIGJbYV19KX1mdW5jdGlvbiBJKGEsYixjLGUpe2lmKHQubGVuZ3RoKXt2YXIgZj10LnBvcCgpO2YucmVzdWx0PWE7Zi5rZXlQcmVmaXg9CmI7Zi5mdW5jPWM7Zi5jb250ZXh0PWU7Zi5jb3VudD0wO3JldHVybiBmfXJldHVybntyZXN1bHQ6YSxrZXlQcmVmaXg6YixmdW5jOmMsY29udGV4dDplLGNvdW50OjB9fWZ1bmN0aW9uIEooYSl7YS5yZXN1bHQ9bnVsbDthLmtleVByZWZpeD1udWxsO2EuZnVuYz1udWxsO2EuY29udGV4dD1udWxsO2EuY291bnQ9MDsxMD50Lmxlbmd0aCYmdC5wdXNoKGEpfWZ1bmN0aW9uIHEoYSxiLGMsZSl7dmFyIGY9dHlwZW9mIGE7aWYoInVuZGVmaW5lZCI9PT1mfHwiYm9vbGVhbiI9PT1mKWE9bnVsbDtpZihudWxsPT09YXx8InN0cmluZyI9PT1mfHwibnVtYmVyIj09PWZ8fCJvYmplY3QiPT09ZiYmYS4kJHR5cGVvZj09PVB8fCJvYmplY3QiPT09ZiYmYS4kJHR5cGVvZj09PVEpcmV0dXJuIGMoZSxhLCIiPT09Yj8iLiIrQyhhLDApOmIpLDE7dmFyIGQ9MDtiPSIiPT09Yj8iLiI6YisiOiI7aWYoQXJyYXkuaXNBcnJheShhKSlmb3IodmFyIGg9MDtoPGEubGVuZ3RoO2grKyl7Zj1hW2hdO3ZhciBnPQpiK0MoZixoKTtkKz1xKGYsZyxjLGUpfWVsc2UgaWYoZz1LJiZhW0tdfHxhWyJAQGl0ZXJhdG9yIl0sImZ1bmN0aW9uIj09PXR5cGVvZiBnKWZvcihhPWcuY2FsbChhKSxoPTA7IShmPWEubmV4dCgpKS5kb25lOylmPWYudmFsdWUsZz1iK0MoZixoKyspLGQrPXEoZixnLGMsZSk7ZWxzZSJvYmplY3QiPT09ZiYmKGM9IiIrYSxwKCIzMSIsIltvYmplY3QgT2JqZWN0XSI9PT1jPyJvYmplY3Qgd2l0aCBrZXlzIHsiK09iamVjdC5rZXlzKGEpLmpvaW4oIiwgIikrIn0iOmMsIiIpKTtyZXR1cm4gZH1mdW5jdGlvbiBDKGEsYil7cmV0dXJuIm9iamVjdCI9PT10eXBlb2YgYSYmbnVsbCE9PWEmJm51bGwhPWEua2V5P08oYS5rZXkpOmIudG9TdHJpbmcoMzYpfWZ1bmN0aW9uIFIoYSxiLGMpe2EuZnVuYy5jYWxsKGEuY29udGV4dCxiLGEuY291bnQrKyl9ZnVuY3Rpb24gUyhhLGIsYyl7dmFyIGU9YS5yZXN1bHQsZj1hLmtleVByZWZpeDthPWEuZnVuYy5jYWxsKGEuY29udGV4dCxiLGEuY291bnQrKyk7CkFycmF5LmlzQXJyYXkoYSk/RChhLGUsYyxFLnRoYXRSZXR1cm5zQXJndW1lbnQpOm51bGwhPWEmJihCKGEpJiYoYj1mKyghYS5rZXl8fGImJmIua2V5PT09YS5rZXk/IiI6KCIiK2Eua2V5KS5yZXBsYWNlKEwsIiRceDI2LyIpKyIvIikrYyxhPXskJHR5cGVvZjpyLHR5cGU6YS50eXBlLGtleTpiLHJlZjphLnJlZixwcm9wczphLnByb3BzLF9vd25lcjphLl9vd25lcn0pLGUucHVzaChhKSl9ZnVuY3Rpb24gRChhLGIsYyxlLGYpe3ZhciBkPSIiO251bGwhPWMmJihkPSgiIitjKS5yZXBsYWNlKEwsIiRceDI2LyIpKyIvIik7Yj1JKGIsZCxlLGYpO251bGw9PWF8fHEoYSwiIixTLGIpO0ooYil9dmFyIE09T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxUPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksVT1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLHU9ZnVuY3Rpb24oKXt0cnl7aWYoIU9iamVjdC5hc3NpZ24pcmV0dXJuITE7dmFyIGE9bmV3IFN0cmluZygiYWJjIik7CmFbNV09ImRlIjtpZigiNSI9PT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhKVswXSlyZXR1cm4hMTt2YXIgYj17fTtmb3IoYT0wOzEwPmE7YSsrKWJbIl8iK1N0cmluZy5mcm9tQ2hhckNvZGUoYSldPWE7aWYoIjAxMjM0NTY3ODkiIT09T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYikubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBiW2FdfSkuam9pbigiIikpcmV0dXJuITE7dmFyIGM9e307ImFiY2RlZmdoaWprbG1ub3BxcnN0Ii5zcGxpdCgiIikuZm9yRWFjaChmdW5jdGlvbihhKXtjW2FdPWF9KTtyZXR1cm4iYWJjZGVmZ2hpamtsbW5vcHFyc3QiIT09T2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSxjKSkuam9pbigiIik/ITE6ITB9Y2F0Y2goZSl7cmV0dXJuITF9fSgpP09iamVjdC5hc3NpZ246ZnVuY3Rpb24oYSxiKXtpZihudWxsPT09YXx8dm9pZCAwPT09YSl0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QuYXNzaWduIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCIpOwp2YXIgYz1PYmplY3QoYSk7Zm9yKHZhciBlLGY9MTtmPGFyZ3VtZW50cy5sZW5ndGg7ZisrKXt2YXIgZD1PYmplY3QoYXJndW1lbnRzW2ZdKTtmb3IodmFyIGggaW4gZClULmNhbGwoZCxoKSYmKGNbaF09ZFtoXSk7aWYoTSl7ZT1NKGQpO2Zvcih2YXIgZz0wO2c8ZS5sZW5ndGg7ZysrKVUuY2FsbChkLGVbZ10pJiYoY1tlW2ddXT1kW2VbZ11dKX19cmV0dXJuIGN9LHY9e30sZD1mdW5jdGlvbigpe307ZC50aGF0UmV0dXJucz1sO2QudGhhdFJldHVybnNGYWxzZT1sKCExKTtkLnRoYXRSZXR1cm5zVHJ1ZT1sKCEwKTtkLnRoYXRSZXR1cm5zTnVsbD1sKG51bGwpO2QudGhhdFJldHVybnNUaGlzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O2QudGhhdFJldHVybnNBcmd1bWVudD1mdW5jdGlvbihhKXtyZXR1cm4gYX07dmFyIEU9ZCx3PXtpc01vdW50ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuITF9LGVucXVldWVGb3JjZVVwZGF0ZTpmdW5jdGlvbihhLGIsYyl7fSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKGEsCmIsYyxlKXt9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbihhLGIsYyxlKXt9fTtuLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PXt9O24ucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKGEsYil7Im9iamVjdCIhPT10eXBlb2YgYSYmImZ1bmN0aW9uIiE9PXR5cGVvZiBhJiZudWxsIT1hP3AoIjg1Iik6dm9pZCAwO3RoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcyxhLGIsInNldFN0YXRlIil9O24ucHJvdG90eXBlLmZvcmNlVXBkYXRlPWZ1bmN0aW9uKGEpe3RoaXMudXBkYXRlci5lbnF1ZXVlRm9yY2VVcGRhdGUodGhpcyxhLCJmb3JjZVVwZGF0ZSIpfTt5LnByb3RvdHlwZT1uLnByb3RvdHlwZTtkPXgucHJvdG90eXBlPW5ldyB5O2QuY29uc3RydWN0b3I9eDt1KGQsbi5wcm90b3R5cGUpO2QuaXNQdXJlUmVhY3RDb21wb25lbnQ9ITA7ZD16LnByb3RvdHlwZT1uZXcgeTtkLmNvbnN0cnVjdG9yPXo7dShkLG4ucHJvdG90eXBlKTtkLnVuc3RhYmxlX2lzQXN5bmNSZWFjdENvbXBvbmVudD0KITA7ZC5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbn07dmFyIEE9e2N1cnJlbnQ6bnVsbH0sRz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHI9ImZ1bmN0aW9uIj09PXR5cGVvZiBTeW1ib2wmJlN5bWJvbFsiZm9yIl0mJlN5bWJvbFsiZm9yIl0oInJlYWN0LmVsZW1lbnQiKXx8NjAxMDMsSD17a2V5OiEwLHJlZjohMCxfX3NlbGY6ITAsX19zb3VyY2U6ITB9LEs9ImZ1bmN0aW9uIj09PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvcixQPSJmdW5jdGlvbiI9PT10eXBlb2YgU3ltYm9sJiZTeW1ib2xbImZvciJdJiZTeW1ib2xbImZvciJdKCJyZWFjdC5lbGVtZW50Iil8fDYwMTAzLFE9ImZ1bmN0aW9uIj09PXR5cGVvZiBTeW1ib2wmJlN5bWJvbFsiZm9yIl0mJlN5bWJvbFsiZm9yIl0oInJlYWN0LnBvcnRhbCIpfHw2MDEwNixMPS9cLysvZyx0PVtdOyJmdW5jdGlvbiI9PT10eXBlb2YgU3ltYm9sJiZTeW1ib2xbImZvciJdJiZTeW1ib2xbImZvciJdKCJyZWFjdC5mcmFnbWVudCIpOwpkPXtDaGlsZHJlbjp7bWFwOmZ1bmN0aW9uKGEsYixjKXtpZihudWxsPT1hKXJldHVybiBhO3ZhciBlPVtdO0QoYSxlLG51bGwsYixjKTtyZXR1cm4gZX0sZm9yRWFjaDpmdW5jdGlvbihhLGIsYyl7aWYobnVsbD09YSlyZXR1cm4gYTtiPUkobnVsbCxudWxsLGIsYyk7bnVsbD09YXx8cShhLCIiLFIsYik7SihiKX0sY291bnQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09YT8wOnEoYSwiIixFLnRoYXRSZXR1cm5zTnVsbCxudWxsKX0sdG9BcnJheTpmdW5jdGlvbihhKXt2YXIgYj1bXTtEKGEsYixudWxsLEUudGhhdFJldHVybnNBcmd1bWVudCk7cmV0dXJuIGJ9LG9ubHk6ZnVuY3Rpb24oYSl7QihhKT92b2lkIDA6cCgiMTQzIik7cmV0dXJuIGF9fSxDb21wb25lbnQ6bixQdXJlQ29tcG9uZW50OngsdW5zdGFibGVfQXN5bmNDb21wb25lbnQ6eixjcmVhdGVFbGVtZW50OkYsY2xvbmVFbGVtZW50OmZ1bmN0aW9uKGEsYixjKXt2YXIgZT11KHt9LGEucHJvcHMpLGQ9YS5rZXksbD1hLnJlZiwKaD1hLl9vd25lcjtpZihudWxsIT1iKXt2b2lkIDAhPT1iLnJlZiYmKGw9Yi5yZWYsaD1BLmN1cnJlbnQpO3ZvaWQgMCE9PWIua2V5JiYoZD0iIitiLmtleSk7aWYoYS50eXBlJiZhLnR5cGUuZGVmYXVsdFByb3BzKXZhciBnPWEudHlwZS5kZWZhdWx0UHJvcHM7Zm9yKGsgaW4gYilHLmNhbGwoYixrKSYmIUguaGFzT3duUHJvcGVydHkoaykmJihlW2tdPXZvaWQgMD09PWJba10mJnZvaWQgMCE9PWc/Z1trXTpiW2tdKX12YXIgaz1hcmd1bWVudHMubGVuZ3RoLTI7aWYoMT09PWspZS5jaGlsZHJlbj1jO2Vsc2UgaWYoMTxrKXtnPUFycmF5KGspO2Zvcih2YXIgbT0wO208azttKyspZ1ttXT1hcmd1bWVudHNbbSsyXTtlLmNoaWxkcmVuPWd9cmV0dXJueyQkdHlwZW9mOnIsdHlwZTphLnR5cGUsa2V5OmQscmVmOmwscHJvcHM6ZSxfb3duZXI6aH19LGNyZWF0ZUZhY3Rvcnk6ZnVuY3Rpb24oYSl7dmFyIGI9Ri5iaW5kKG51bGwsYSk7Yi50eXBlPWE7cmV0dXJuIGJ9LGlzVmFsaWRFbGVtZW50OkIsCnZlcnNpb246IjE2LjEuMSIsX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ6e1JlYWN0Q3VycmVudE93bmVyOkEsYXNzaWduOnV9fTt2YXIgTj1PYmplY3QuZnJlZXplKHtkZWZhdWx0OmR9KTtkPU4mJmR8fE47cmV0dXJuIGRbImRlZmF1bHQiXT9kWyJkZWZhdWx0Il06ZH0pOwo="></script>
<script src="data:application/x-javascript;base64,LyoqIEBsaWNlbnNlIFJlYWN0IHYxNi4xLjEKICogcmVhY3QtZG9tLnByb2R1Y3Rpb24ubWluLmpzCiAqCiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgogKgogKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLgogKi8KLyoKIE1vZGVybml6ciAzLjAuMHByZSAoQ3VzdG9tIEJ1aWxkKSB8IE1JVAoqLwondXNlIHN0cmljdCc7KGZ1bmN0aW9uKGVhLGwpeyJvYmplY3QiPT09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1sKHJlcXVpcmUoInJlYWN0IikpOiJmdW5jdGlvbiI9PT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbInJlYWN0Il0sbCk6ZWEuUmVhY3RET009bChlYS5SZWFjdCl9KSh0aGlzLGZ1bmN0aW9uKGVhKXtmdW5jdGlvbiBsKGEpe2Zvcih2YXIgYj1hcmd1bWVudHMubGVuZ3RoLTEsYz0iTWluaWZpZWQgUmVhY3QgZXJyb3IgIyIrYSsiOyB2aXNpdCBodHRwOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvZXJyb3ItZGVjb2Rlci5odG1sP2ludmFyaWFudFx4M2QiK2EsZD0wO2Q8YjtkKyspYys9Ilx4MjZhcmdzW11ceDNkIitlbmNvZGVVUklDb21wb25lbnQoYXJndW1lbnRzW2QrMV0pO2I9RXJyb3IoYysiIGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4iKTsKYi5uYW1lPSJJbnZhcmlhbnQgVmlvbGF0aW9uIjtiLmZyYW1lc1RvUG9wPTE7dGhyb3cgYjt9ZnVuY3Rpb24gb2EoYSxiKXtyZXR1cm4oYSZiKT09PWJ9ZnVuY3Rpb24gUWMoYSxiKXtpZihSYy5oYXNPd25Qcm9wZXJ0eShhKXx8MjxhLmxlbmd0aCYmKCJvIj09PWFbMF18fCJPIj09PWFbMF0pJiYoIm4iPT09YVsxXXx8Ik4iPT09YVsxXSkpcmV0dXJuITE7aWYobnVsbD09PWIpcmV0dXJuITA7c3dpdGNoKHR5cGVvZiBiKXtjYXNlICJib29sZWFuIjpyZXR1cm4gUmMuaGFzT3duUHJvcGVydHkoYSk/YT0hMDooYj1KYihhKSk/YT1iLmhhc0Jvb2xlYW5WYWx1ZXx8Yi5oYXNTdHJpbmdCb29sZWFuVmFsdWV8fGIuaGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZTooYT1hLnRvTG93ZXJDYXNlKCkuc2xpY2UoMCw1KSxhPSJkYXRhLSI9PT1hfHwiYXJpYS0iPT09YSksYTtjYXNlICJ1bmRlZmluZWQiOmNhc2UgIm51bWJlciI6Y2FzZSAic3RyaW5nIjpjYXNlICJvYmplY3QiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fQpmdW5jdGlvbiBKYihhKXtyZXR1cm4gZWIuaGFzT3duUHJvcGVydHkoYSk/ZWJbYV06bnVsbH1mdW5jdGlvbiBTYygpe2lmKGZiKWZvcih2YXIgYSBpbiBwYSl7dmFyIGI9cGFbYV0sYz1mYi5pbmRleE9mKGEpOy0xPGM/dm9pZCAwOmwoIjk2IixhKTtpZighcWFbY10pe2IuZXh0cmFjdEV2ZW50cz92b2lkIDA6bCgiOTciLGEpO3FhW2NdPWI7Yz1iLmV2ZW50VHlwZXM7Zm9yKHZhciBkIGluIGMpe3ZhciBlPXZvaWQgMDt2YXIgZj1jW2RdLGc9YixrPWQ7S2IuaGFzT3duUHJvcGVydHkoayk/bCgiOTkiLGspOnZvaWQgMDtLYltrXT1mO3ZhciBoPWYucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM7aWYoaCl7Zm9yKGUgaW4gaCloLmhhc093blByb3BlcnR5KGUpJiZUYyhoW2VdLGcsayk7ZT0hMH1lbHNlIGYucmVnaXN0cmF0aW9uTmFtZT8oVGMoZi5yZWdpc3RyYXRpb25OYW1lLGcsayksZT0hMCk6ZT0hMTtlP3ZvaWQgMDpsKCI5OCIsZCxhKX19fX1mdW5jdGlvbiBUYyhhLGIsYyl7cmFbYV0/CmwoIjEwMCIsYSk6dm9pZCAwO3JhW2FdPWI7Z2JbYV09Yi5ldmVudFR5cGVzW2NdLmRlcGVuZGVuY2llc31mdW5jdGlvbiBVYyhhKXtmYj9sKCIxMDEiKTp2b2lkIDA7ZmI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSk7U2MoKX1mdW5jdGlvbiBWYyhhKXt2YXIgYj0hMSxjO2ZvcihjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSl7dmFyIGQ9YVtjXTtwYS5oYXNPd25Qcm9wZXJ0eShjKSYmcGFbY109PT1kfHwocGFbY10/bCgiMTAyIixjKTp2b2lkIDAscGFbY109ZCxiPSEwKX1iJiZTYygpfWZ1bmN0aW9uIGhiKGEpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBhfX1mdW5jdGlvbiBXYyhhLGIsYyxkKXtiPWEudHlwZXx8InVua25vd24tZXZlbnQiO2EuY3VycmVudFRhcmdldD1YYyhkKTt1Lmludm9rZUd1YXJkZWRDYWxsYmFja0FuZENhdGNoRmlyc3RFcnJvcihiLGMsdm9pZCAwLGEpO2EuY3VycmVudFRhcmdldD1udWxsfWZ1bmN0aW9uIHhhKGEsYil7bnVsbD09Yj9sKCIzMCIpOgp2b2lkIDA7aWYobnVsbD09YSlyZXR1cm4gYjtpZihBcnJheS5pc0FycmF5KGEpKXtpZihBcnJheS5pc0FycmF5KGIpKXJldHVybiBhLnB1c2guYXBwbHkoYSxiKSxhO2EucHVzaChiKTtyZXR1cm4gYX1yZXR1cm4gQXJyYXkuaXNBcnJheShiKT9bYV0uY29uY2F0KGIpOlthLGJdfWZ1bmN0aW9uIGZhKGEsYixjKXtBcnJheS5pc0FycmF5KGEpP2EuZm9yRWFjaChiLGMpOmEmJmIuY2FsbChjLGEpfWZ1bmN0aW9uIExiKGEsYil7dmFyIGM9YS5zdGF0ZU5vZGU7aWYoIWMpcmV0dXJuIG51bGw7dmFyIGQ9TWIoYyk7aWYoIWQpcmV0dXJuIG51bGw7Yz1kW2JdO2E6c3dpdGNoKGIpe2Nhc2UgIm9uQ2xpY2siOmNhc2UgIm9uQ2xpY2tDYXB0dXJlIjpjYXNlICJvbkRvdWJsZUNsaWNrIjpjYXNlICJvbkRvdWJsZUNsaWNrQ2FwdHVyZSI6Y2FzZSAib25Nb3VzZURvd24iOmNhc2UgIm9uTW91c2VEb3duQ2FwdHVyZSI6Y2FzZSAib25Nb3VzZU1vdmUiOmNhc2UgIm9uTW91c2VNb3ZlQ2FwdHVyZSI6Y2FzZSAib25Nb3VzZVVwIjpjYXNlICJvbk1vdXNlVXBDYXB0dXJlIjooZD0KIWQuZGlzYWJsZWQpfHwoYT1hLnR5cGUsZD0hKCJidXR0b24iPT09YXx8ImlucHV0Ij09PWF8fCJzZWxlY3QiPT09YXx8InRleHRhcmVhIj09PWEpKTthPSFkO2JyZWFrIGE7ZGVmYXVsdDphPSExfWlmKGEpcmV0dXJuIG51bGw7YyYmImZ1bmN0aW9uIiE9PXR5cGVvZiBjP2woIjIzMSIsYix0eXBlb2YgYyk6dm9pZCAwO3JldHVybiBjfWZ1bmN0aW9uIFljKGEsYixjLGQpe2Zvcih2YXIgZSxmPTA7ZjxxYS5sZW5ndGg7ZisrKXt2YXIgZz1xYVtmXTtnJiYoZz1nLmV4dHJhY3RFdmVudHMoYSxiLGMsZCkpJiYoZT14YShlLGcpKX1yZXR1cm4gZX1mdW5jdGlvbiBOYihhKXthJiYoc2E9eGEoc2EsYSkpfWZ1bmN0aW9uIE9iKGEpe3ZhciBiPXNhO3NhPW51bGw7YT9mYShiLFNlKTpmYShiLFRlKTtzYT9sKCI5NSIpOnZvaWQgMDt1LnJldGhyb3dDYXVnaHRFcnJvcigpfWZ1bmN0aW9uIFkoYSl7aWYoYVtQXSlyZXR1cm4gYVtQXTtmb3IodmFyIGI9W107IWFbUF07KWlmKGIucHVzaChhKSxhLnBhcmVudE5vZGUpYT0KYS5wYXJlbnROb2RlO2Vsc2UgcmV0dXJuIG51bGw7dmFyIGM9dm9pZCAwLGQ9YVtQXTtpZig1PT09ZC50YWd8fDY9PT1kLnRhZylyZXR1cm4gZDtmb3IoO2EmJihkPWFbUF0pO2E9Yi5wb3AoKSljPWQ7cmV0dXJuIGN9ZnVuY3Rpb24geWEoYSl7aWYoNT09PWEudGFnfHw2PT09YS50YWcpcmV0dXJuIGEuc3RhdGVOb2RlO2woIjMzIil9ZnVuY3Rpb24gWmMoYSl7cmV0dXJuIGFbaGFdfHxudWxsfWZ1bmN0aW9uIFQoYSl7ZG8gYT1hWyJyZXR1cm4iXTt3aGlsZShhJiY1IT09YS50YWcpO3JldHVybiBhP2E6bnVsbH1mdW5jdGlvbiAkYyhhLGIsYyl7Zm9yKHZhciBkPVtdO2E7KWQucHVzaChhKSxhPVQoYSk7Zm9yKGE9ZC5sZW5ndGg7MDxhLS07KWIoZFthXSwiY2FwdHVyZWQiLGMpO2ZvcihhPTA7YTxkLmxlbmd0aDthKyspYihkW2FdLCJidWJibGVkIixjKX1mdW5jdGlvbiBhZChhLGIsYyl7aWYoYj1MYihhLGMuZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXNbYl0pKWMuX2Rpc3BhdGNoTGlzdGVuZXJzPQp4YShjLl9kaXNwYXRjaExpc3RlbmVycyxiKSxjLl9kaXNwYXRjaEluc3RhbmNlcz14YShjLl9kaXNwYXRjaEluc3RhbmNlcyxhKX1mdW5jdGlvbiBVZShhKXthJiZhLmRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzJiYkYyhhLl90YXJnZXRJbnN0LGFkLGEpfWZ1bmN0aW9uIFZlKGEpe2lmKGEmJmEuZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMpe3ZhciBiPWEuX3RhcmdldEluc3Q7Yj1iP1QoYik6bnVsbDskYyhiLGFkLGEpfX1mdW5jdGlvbiBQYihhLGIsYyl7YSYmYyYmYy5kaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lJiYoYj1MYihhLGMuZGlzcGF0Y2hDb25maWcucmVnaXN0cmF0aW9uTmFtZSkpJiYoYy5fZGlzcGF0Y2hMaXN0ZW5lcnM9eGEoYy5fZGlzcGF0Y2hMaXN0ZW5lcnMsYiksYy5fZGlzcGF0Y2hJbnN0YW5jZXM9eGEoYy5fZGlzcGF0Y2hJbnN0YW5jZXMsYSkpfWZ1bmN0aW9uIFdlKGEpe2EmJmEuZGlzcGF0Y2hDb25maWcucmVnaXN0cmF0aW9uTmFtZSYmClBiKGEuX3RhcmdldEluc3QsbnVsbCxhKX1mdW5jdGlvbiB6YShhKXtmYShhLFVlKX1mdW5jdGlvbiBiZChhLGIsYyxkKXtpZihjJiZkKWE6e3ZhciBlPWM7Zm9yKHZhciBmPWQsZz0wLGs9ZTtrO2s9VChrKSlnKys7az0wO2Zvcih2YXIgaD1mO2g7aD1UKGgpKWsrKztmb3IoOzA8Zy1rOyllPVQoZSksZy0tO2Zvcig7MDxrLWc7KWY9VChmKSxrLS07Zm9yKDtnLS07KXtpZihlPT09Znx8ZT09PWYuYWx0ZXJuYXRlKWJyZWFrIGE7ZT1UKGUpO2Y9VChmKX1lPW51bGx9ZWxzZSBlPW51bGw7Zj1lO2ZvcihlPVtdO2MmJmMhPT1mOyl7Zz1jLmFsdGVybmF0ZTtpZihudWxsIT09ZyYmZz09PWYpYnJlYWs7ZS5wdXNoKGMpO2M9VChjKX1mb3IoYz1bXTtkJiZkIT09Zjspe2c9ZC5hbHRlcm5hdGU7aWYobnVsbCE9PWcmJmc9PT1mKWJyZWFrO2MucHVzaChkKTtkPVQoZCl9Zm9yKGQ9MDtkPGUubGVuZ3RoO2QrKylQYihlW2RdLCJidWJibGVkIixhKTtmb3IoYT1jLmxlbmd0aDswPGEtLTspUGIoY1thXSwKImNhcHR1cmVkIixiKX1mdW5jdGlvbiBjZCgpeyFRYiYmSC5jYW5Vc2VET00mJihRYj0idGV4dENvbnRlbnQiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50PyJ0ZXh0Q29udGVudCI6ImlubmVyVGV4dCIpO3JldHVybiBRYn1mdW5jdGlvbiBkZCgpe2lmKEcuX2ZhbGxiYWNrVGV4dClyZXR1cm4gRy5fZmFsbGJhY2tUZXh0O3ZhciBhLGI9Ry5fc3RhcnRUZXh0LGM9Yi5sZW5ndGgsZCxlPWVkKCksZj1lLmxlbmd0aDtmb3IoYT0wO2E8YyYmYlthXT09PWVbYV07YSsrKTt2YXIgZz1jLWE7Zm9yKGQ9MTtkPD1nJiZiW2MtZF09PT1lW2YtZF07ZCsrKTtHLl9mYWxsYmFja1RleHQ9ZS5zbGljZShhLDE8ZD8xLWQ6dm9pZCAwKTtyZXR1cm4gRy5fZmFsbGJhY2tUZXh0fWZ1bmN0aW9uIGVkKCl7cmV0dXJuInZhbHVlImluIEcuX3Jvb3Q/Ry5fcm9vdC52YWx1ZTpHLl9yb290W2NkKCldfWZ1bmN0aW9uIG4oYSxiLGMsZCl7dGhpcy5kaXNwYXRjaENvbmZpZz1hO3RoaXMuX3RhcmdldEluc3Q9CmI7dGhpcy5uYXRpdmVFdmVudD1jO2E9dGhpcy5jb25zdHJ1Y3Rvci5JbnRlcmZhY2U7Zm9yKHZhciBlIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShlKSYmKChiPWFbZV0pP3RoaXNbZV09YihjKToidGFyZ2V0Ij09PWU/dGhpcy50YXJnZXQ9ZDp0aGlzW2VdPWNbZV0pO3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPShudWxsIT1jLmRlZmF1bHRQcmV2ZW50ZWQ/Yy5kZWZhdWx0UHJldmVudGVkOiExPT09Yy5yZXR1cm5WYWx1ZSk/RS50aGF0UmV0dXJuc1RydWU6RS50aGF0UmV0dXJuc0ZhbHNlO3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9RS50aGF0UmV0dXJuc0ZhbHNlO3JldHVybiB0aGlzfWZ1bmN0aW9uIFhlKGEsYixjLGQpe2lmKHRoaXMuZXZlbnRQb29sLmxlbmd0aCl7dmFyIGU9dGhpcy5ldmVudFBvb2wucG9wKCk7dGhpcy5jYWxsKGUsYSxiLGMsZCk7cmV0dXJuIGV9cmV0dXJuIG5ldyB0aGlzKGEsYixjLGQpfWZ1bmN0aW9uIFllKGEpe2EgaW5zdGFuY2VvZiB0aGlzP3ZvaWQgMDoKbCgiMjIzIik7YS5kZXN0cnVjdG9yKCk7MTA+dGhpcy5ldmVudFBvb2wubGVuZ3RoJiZ0aGlzLmV2ZW50UG9vbC5wdXNoKGEpfWZ1bmN0aW9uIGZkKGEpe2EuZXZlbnRQb29sPVtdO2EuZ2V0UG9vbGVkPVhlO2EucmVsZWFzZT1ZZX1mdW5jdGlvbiBnZChhLGIsYyxkKXtyZXR1cm4gbi5jYWxsKHRoaXMsYSxiLGMsZCl9ZnVuY3Rpb24gaGQoYSxiLGMsZCl7cmV0dXJuIG4uY2FsbCh0aGlzLGEsYixjLGQpfWZ1bmN0aW9uIFplKCl7dmFyIGE9d2luZG93Lm9wZXJhO3JldHVybiJvYmplY3QiPT09dHlwZW9mIGEmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS52ZXJzaW9uJiYxMj49cGFyc2VJbnQoYS52ZXJzaW9uKCksMTApfWZ1bmN0aW9uIGlkKGEsYil7c3dpdGNoKGEpe2Nhc2UgInRvcEtleVVwIjpyZXR1cm4tMSE9PSRlLmluZGV4T2YoYi5rZXlDb2RlKTtjYXNlICJ0b3BLZXlEb3duIjpyZXR1cm4gMjI5IT09Yi5rZXlDb2RlO2Nhc2UgInRvcEtleVByZXNzIjpjYXNlICJ0b3BNb3VzZURvd24iOmNhc2UgInRvcEJsdXIiOnJldHVybiEwOwpkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBqZChhKXthPWEuZGV0YWlsO3JldHVybiJvYmplY3QiPT09dHlwZW9mIGEmJiJkYXRhImluIGE/YS5kYXRhOm51bGx9ZnVuY3Rpb24gYWYoYSxiKXtzd2l0Y2goYSl7Y2FzZSAidG9wQ29tcG9zaXRpb25FbmQiOnJldHVybiBqZChiKTtjYXNlICJ0b3BLZXlQcmVzcyI6aWYoMzIhPT1iLndoaWNoKXJldHVybiBudWxsO2tkPSEwO3JldHVybiBsZDtjYXNlICJ0b3BUZXh0SW5wdXQiOnJldHVybiBhPWIuZGF0YSxhPT09bGQmJmtkP251bGw6YTtkZWZhdWx0OnJldHVybiBudWxsfX1mdW5jdGlvbiBiZihhLGIpe2lmKEFhKXJldHVybiJ0b3BDb21wb3NpdGlvbkVuZCI9PT1hfHwhUmImJmlkKGEsYik/KGE9ZGQoKSxHLl9yb290PW51bGwsRy5fc3RhcnRUZXh0PW51bGwsRy5fZmFsbGJhY2tUZXh0PW51bGwsQWE9ITEsYSk6bnVsbDtzd2l0Y2goYSl7Y2FzZSAidG9wUGFzdGUiOnJldHVybiBudWxsO2Nhc2UgInRvcEtleVByZXNzIjppZighKGIuY3RybEtleXx8CmIuYWx0S2V5fHxiLm1ldGFLZXkpfHxiLmN0cmxLZXkmJmIuYWx0S2V5KXtpZihiLmNoYXImJjE8Yi5jaGFyLmxlbmd0aClyZXR1cm4gYi5jaGFyO2lmKGIud2hpY2gpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYi53aGljaCl9cmV0dXJuIG51bGw7Y2FzZSAidG9wQ29tcG9zaXRpb25FbmQiOnJldHVybiBtZD9udWxsOmIuZGF0YTtkZWZhdWx0OnJldHVybiBudWxsfX1mdW5jdGlvbiBuZChhKXtpZihhPW9kKGEpKXtpYiYmImZ1bmN0aW9uIj09PXR5cGVvZiBpYi5yZXN0b3JlQ29udHJvbGxlZFN0YXRlP3ZvaWQgMDpsKCIxOTQiKTt2YXIgYj1NYihhLnN0YXRlTm9kZSk7aWIucmVzdG9yZUNvbnRyb2xsZWRTdGF0ZShhLnN0YXRlTm9kZSxhLnR5cGUsYil9fWZ1bmN0aW9uIHBkKGEpe0RhP2lhP2lhLnB1c2goYSk6aWE9W2FdOkRhPWF9ZnVuY3Rpb24gcWQoKXtpZihEYSl7dmFyIGE9RGEsYj1pYTtpYT1EYT1udWxsO25kKGEpO2lmKGIpZm9yKGE9MDthPGIubGVuZ3RoO2ErKyluZChiW2FdKX19CmZ1bmN0aW9uIFNiKGEsYil7aWYoVGIpcmV0dXJuIFViKGEsYik7VGI9ITA7dHJ5e3JldHVybiBVYihhLGIpfWZpbmFsbHl7VGI9ITEscWQoKX19ZnVuY3Rpb24gcmQoYSl7dmFyIGI9YSYmYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1iPyEhY2ZbYS50eXBlXToidGV4dGFyZWEiPT09Yj8hMDohMX1mdW5jdGlvbiBWYihhKXthPWEudGFyZ2V0fHxhLnNyY0VsZW1lbnR8fHdpbmRvdzthLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50JiYoYT1hLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KTtyZXR1cm4gMz09PWEubm9kZVR5cGU/YS5wYXJlbnROb2RlOmF9ZnVuY3Rpb24gRWEoYSxiKXtpZighSC5jYW5Vc2VET018fGImJiEoImFkZEV2ZW50TGlzdGVuZXIiaW4gZG9jdW1lbnQpKXJldHVybiExO2I9Im9uIithO3ZhciBjPWIgaW4gZG9jdW1lbnQ7Y3x8KGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYy5zZXRBdHRyaWJ1dGUoYiwicmV0dXJuOyIpLApjPSJmdW5jdGlvbiI9PT10eXBlb2YgY1tiXSk7IWMmJnNkJiYid2hlZWwiPT09YSYmKGM9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZSgiRXZlbnRzLndoZWVsIiwiMy4wIikpO3JldHVybiBjfWZ1bmN0aW9uIHRkKGEpe3ZhciBiPWEudHlwZTtyZXR1cm4oYT1hLm5vZGVOYW1lKSYmImlucHV0Ij09PWEudG9Mb3dlckNhc2UoKSYmKCJjaGVja2JveCI9PT1ifHwicmFkaW8iPT09Yil9ZnVuY3Rpb24gZGYoYSl7dmFyIGI9dGQoYSk/ImNoZWNrZWQiOiJ2YWx1ZSIsYz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGEuY29uc3RydWN0b3IucHJvdG90eXBlLGIpLGQ9IiIrYVtiXTtpZighYS5oYXNPd25Qcm9wZXJ0eShiKSYmImZ1bmN0aW9uIj09PXR5cGVvZiBjLmdldCYmImZ1bmN0aW9uIj09PXR5cGVvZiBjLnNldClyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYix7ZW51bWVyYWJsZTpjLmVudW1lcmFibGUsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBjLmdldC5jYWxsKHRoaXMpfSwKc2V0OmZ1bmN0aW9uKGEpe2Q9IiIrYTtjLnNldC5jYWxsKHRoaXMsYSl9fSkse2dldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGR9LHNldFZhbHVlOmZ1bmN0aW9uKGEpe2Q9IiIrYX0sc3RvcFRyYWNraW5nOmZ1bmN0aW9uKCl7YS5fdmFsdWVUcmFja2VyPW51bGw7ZGVsZXRlIGFbYl19fX1mdW5jdGlvbiBqYihhKXthLl92YWx1ZVRyYWNrZXJ8fChhLl92YWx1ZVRyYWNrZXI9ZGYoYSkpfWZ1bmN0aW9uIHVkKGEpe2lmKCFhKXJldHVybiExO3ZhciBiPWEuX3ZhbHVlVHJhY2tlcjtpZighYilyZXR1cm4hMDt2YXIgYz1iLmdldFZhbHVlKCk7dmFyIGQ9IiI7YSYmKGQ9dGQoYSk/YS5jaGVja2VkPyJ0cnVlIjoiZmFsc2UiOmEudmFsdWUpO2E9ZDtyZXR1cm4gYSE9PWM/KGIuc2V0VmFsdWUoYSksITApOiExfWZ1bmN0aW9uIHZkKGEsYixjKXthPW4uZ2V0UG9vbGVkKHdkLmNoYW5nZSxhLGIsYyk7YS50eXBlPSJjaGFuZ2UiO3BkKGMpO3phKGEpO3JldHVybiBhfWZ1bmN0aW9uIGVmKGEpe05iKGEpOwpPYighMSl9ZnVuY3Rpb24ga2IoYSl7dmFyIGI9eWEoYSk7aWYodWQoYikpcmV0dXJuIGF9ZnVuY3Rpb24gZmYoYSxiKXtpZigidG9wQ2hhbmdlIj09PWEpcmV0dXJuIGJ9ZnVuY3Rpb24geGQoKXtLYSYmKEthLmRldGFjaEV2ZW50KCJvbnByb3BlcnR5Y2hhbmdlIix5ZCksTGE9S2E9bnVsbCl9ZnVuY3Rpb24geWQoYSl7InZhbHVlIj09PWEucHJvcGVydHlOYW1lJiZrYihMYSkmJihhPXZkKExhLGEsVmIoYSkpLFNiKGVmLGEpKX1mdW5jdGlvbiBnZihhLGIsYyl7InRvcEZvY3VzIj09PWE/KHhkKCksS2E9YixMYT1jLEthLmF0dGFjaEV2ZW50KCJvbnByb3BlcnR5Y2hhbmdlIix5ZCkpOiJ0b3BCbHVyIj09PWEmJnhkKCl9ZnVuY3Rpb24gaGYoYSxiKXtpZigidG9wU2VsZWN0aW9uQ2hhbmdlIj09PWF8fCJ0b3BLZXlVcCI9PT1hfHwidG9wS2V5RG93biI9PT1hKXJldHVybiBrYihMYSl9ZnVuY3Rpb24gamYoYSxiKXtpZigidG9wQ2xpY2siPT09YSlyZXR1cm4ga2IoYil9ZnVuY3Rpb24ga2YoYSwKYil7aWYoInRvcElucHV0Ij09PWF8fCJ0b3BDaGFuZ2UiPT09YSlyZXR1cm4ga2IoYil9ZnVuY3Rpb24gamEoYSxiLGMsZCl7cmV0dXJuIG4uY2FsbCh0aGlzLGEsYixjLGQpfWZ1bmN0aW9uIGxmKGEpe3ZhciBiPXRoaXMubmF0aXZlRXZlbnQ7cmV0dXJuIGIuZ2V0TW9kaWZpZXJTdGF0ZT9iLmdldE1vZGlmaWVyU3RhdGUoYSk6KGE9bWZbYV0pPyEhYlthXTohMX1mdW5jdGlvbiBXYihhKXtyZXR1cm4gbGZ9ZnVuY3Rpb24gVShhLGIsYyxkKXtyZXR1cm4gbi5jYWxsKHRoaXMsYSxiLGMsZCl9ZnVuY3Rpb24gTWEoYSl7YT1hLnR5cGU7cmV0dXJuInN0cmluZyI9PT10eXBlb2YgYT9hOiJmdW5jdGlvbiI9PT10eXBlb2YgYT9hLmRpc3BsYXlOYW1lfHxhLm5hbWU6bnVsbH1mdW5jdGlvbiBOYShhKXt2YXIgYj1hO2lmKGEuYWx0ZXJuYXRlKWZvcig7YlsicmV0dXJuIl07KWI9YlsicmV0dXJuIl07ZWxzZXtpZigwIT09KGIuZWZmZWN0VGFnJjIpKXJldHVybiAxO2Zvcig7YlsicmV0dXJuIl07KWlmKGI9CmJbInJldHVybiJdLDAhPT0oYi5lZmZlY3RUYWcmMikpcmV0dXJuIDF9cmV0dXJuIDM9PT1iLnRhZz8yOjN9ZnVuY3Rpb24gbmYoYSl7cmV0dXJuKGE9YS5fcmVhY3RJbnRlcm5hbEZpYmVyKT8yPT09TmEoYSk6ITF9ZnVuY3Rpb24gemQoYSl7MiE9PU5hKGEpP2woIjE4OCIpOnZvaWQgMH1mdW5jdGlvbiBBZChhKXt2YXIgYj1hLmFsdGVybmF0ZTtpZighYilyZXR1cm4gYj1OYShhKSwzPT09Yj9sKCIxODgiKTp2b2lkIDAsMT09PWI/bnVsbDphO2Zvcih2YXIgYz1hLGQ9Yjs7KXt2YXIgZT1jWyJyZXR1cm4iXSxmPWU/ZS5hbHRlcm5hdGU6bnVsbDtpZighZXx8IWYpYnJlYWs7aWYoZS5jaGlsZD09PWYuY2hpbGQpe2Zvcih2YXIgZz1lLmNoaWxkO2c7KXtpZihnPT09YylyZXR1cm4gemQoZSksYTtpZihnPT09ZClyZXR1cm4gemQoZSksYjtnPWcuc2libGluZ31sKCIxODgiKX1pZihjWyJyZXR1cm4iXSE9PWRbInJldHVybiJdKWM9ZSxkPWY7ZWxzZXtnPSExO2Zvcih2YXIgaz1lLmNoaWxkO2s7KXtpZihrPT09CmMpe2c9ITA7Yz1lO2Q9ZjticmVha31pZihrPT09ZCl7Zz0hMDtkPWU7Yz1mO2JyZWFrfWs9ay5zaWJsaW5nfWlmKCFnKXtmb3Ioaz1mLmNoaWxkO2s7KXtpZihrPT09Yyl7Zz0hMDtjPWY7ZD1lO2JyZWFrfWlmKGs9PT1kKXtnPSEwO2Q9ZjtjPWU7YnJlYWt9az1rLnNpYmxpbmd9Zz92b2lkIDA6bCgiMTg5Iil9fWMuYWx0ZXJuYXRlIT09ZD9sKCIxOTAiKTp2b2lkIDB9MyE9PWMudGFnP2woIjE4OCIpOnZvaWQgMDtyZXR1cm4gYy5zdGF0ZU5vZGUuY3VycmVudD09PWM/YTpifWZ1bmN0aW9uIG9mKGEpe2E9QWQoYSk7aWYoIWEpcmV0dXJuIG51bGw7Zm9yKHZhciBiPWE7Oyl7aWYoNT09PWIudGFnfHw2PT09Yi50YWcpcmV0dXJuIGI7aWYoYi5jaGlsZCliLmNoaWxkWyJyZXR1cm4iXT1iLGI9Yi5jaGlsZDtlbHNle2lmKGI9PT1hKWJyZWFrO2Zvcig7IWIuc2libGluZzspe2lmKCFiWyJyZXR1cm4iXXx8YlsicmV0dXJuIl09PT1hKXJldHVybiBudWxsO2I9YlsicmV0dXJuIl19Yi5zaWJsaW5nWyJyZXR1cm4iXT0KYlsicmV0dXJuIl07Yj1iLnNpYmxpbmd9fXJldHVybiBudWxsfWZ1bmN0aW9uIHBmKGEpe2E9QWQoYSk7aWYoIWEpcmV0dXJuIG51bGw7Zm9yKHZhciBiPWE7Oyl7aWYoNT09PWIudGFnfHw2PT09Yi50YWcpcmV0dXJuIGI7aWYoYi5jaGlsZCYmNCE9PWIudGFnKWIuY2hpbGRbInJldHVybiJdPWIsYj1iLmNoaWxkO2Vsc2V7aWYoYj09PWEpYnJlYWs7Zm9yKDshYi5zaWJsaW5nOyl7aWYoIWJbInJldHVybiJdfHxiWyJyZXR1cm4iXT09PWEpcmV0dXJuIG51bGw7Yj1iWyJyZXR1cm4iXX1iLnNpYmxpbmdbInJldHVybiJdPWJbInJldHVybiJdO2I9Yi5zaWJsaW5nfX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBxZihhKXt2YXIgYj1hLnRhcmdldEluc3Q7ZG97aWYoIWIpe2EuYW5jZXN0b3JzLnB1c2goYik7YnJlYWt9dmFyIGM7Zm9yKGM9YjtjWyJyZXR1cm4iXTspYz1jWyJyZXR1cm4iXTtjPTMhPT1jLnRhZz9udWxsOmMuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87aWYoIWMpYnJlYWs7YS5hbmNlc3RvcnMucHVzaChiKTsKYj1ZKGMpfXdoaWxlKGIpO2ZvcihjPTA7YzxhLmFuY2VzdG9ycy5sZW5ndGg7YysrKWI9YS5hbmNlc3RvcnNbY10sbGIoYS50b3BMZXZlbFR5cGUsYixhLm5hdGl2ZUV2ZW50LFZiKGEubmF0aXZlRXZlbnQpKX1mdW5jdGlvbiBYYihhKXtPYT0hIWF9ZnVuY3Rpb24gcChhLGIsYyl7cmV0dXJuIGM/QmQubGlzdGVuKGMsYixZYi5iaW5kKG51bGwsYSkpOm51bGx9ZnVuY3Rpb24gVihhLGIsYyl7cmV0dXJuIGM/QmQuY2FwdHVyZShjLGIsWWIuYmluZChudWxsLGEpKTpudWxsfWZ1bmN0aW9uIFliKGEsYil7aWYoT2Epe3ZhciBjPVZiKGIpO2M9WShjKTtudWxsPT09Y3x8Im51bWJlciIhPT10eXBlb2YgYy50YWd8fDI9PT1OYShjKXx8KGM9bnVsbCk7aWYobWIubGVuZ3RoKXt2YXIgZD1tYi5wb3AoKTtkLnRvcExldmVsVHlwZT1hO2QubmF0aXZlRXZlbnQ9YjtkLnRhcmdldEluc3Q9YzthPWR9ZWxzZSBhPXt0b3BMZXZlbFR5cGU6YSxuYXRpdmVFdmVudDpiLHRhcmdldEluc3Q6YyxhbmNlc3RvcnM6W119Owp0cnl7U2IocWYsYSl9ZmluYWxseXthLnRvcExldmVsVHlwZT1udWxsLGEubmF0aXZlRXZlbnQ9bnVsbCxhLnRhcmdldEluc3Q9bnVsbCxhLmFuY2VzdG9ycy5sZW5ndGg9MCwxMD5tYi5sZW5ndGgmJm1iLnB1c2goYSl9fX1mdW5jdGlvbiBuYihhLGIpe3ZhciBjPXt9O2NbYS50b0xvd2VyQ2FzZSgpXT1iLnRvTG93ZXJDYXNlKCk7Y1siV2Via2l0IithXT0id2Via2l0IitiO2NbIk1veiIrYV09Im1veiIrYjtjWyJtcyIrYV09Ik1TIitiO2NbIk8iK2FdPSJvIitiLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGN9ZnVuY3Rpb24gb2IoYSl7aWYoWmJbYV0pcmV0dXJuIFpiW2FdO2lmKCFaW2FdKXJldHVybiBhO3ZhciBiPVpbYV0sYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykmJmMgaW4gQ2QpcmV0dXJuIFpiW2FdPWJbY107cmV0dXJuIiJ9ZnVuY3Rpb24gRGQoYSl7T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEscGIpfHwoYVtwYl09cmYrKyxFZFthW3BiXV09Cnt9KTtyZXR1cm4gRWRbYVtwYl1dfWZ1bmN0aW9uIEZkKGEsYil7cmV0dXJuIGE9PT1iPzAhPT1hfHwwIT09Ynx8MS9hPT09MS9iOmEhPT1hJiZiIT09Yn1mdW5jdGlvbiBHZChhLGIpe3JldHVybiBhJiZiP2E9PT1iPyEwOkhkKGEpPyExOkhkKGIpP0dkKGEsYi5wYXJlbnROb2RlKToiY29udGFpbnMiaW4gYT9hLmNvbnRhaW5zKGIpOmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNik6ITE6ITF9ZnVuY3Rpb24gSWQoYSl7Zm9yKDthJiZhLmZpcnN0Q2hpbGQ7KWE9YS5maXJzdENoaWxkO3JldHVybiBhfWZ1bmN0aW9uIEpkKGEsYil7dmFyIGM9SWQoYSk7YT0wO2Zvcih2YXIgZDtjOyl7aWYoMz09PWMubm9kZVR5cGUpe2Q9YStjLnRleHRDb250ZW50Lmxlbmd0aDtpZihhPD1iJiZkPj1iKXJldHVybntub2RlOmMsb2Zmc2V0OmItYX07YT1kfWE6e2Zvcig7Yzspe2lmKGMubmV4dFNpYmxpbmcpe2M9Yy5uZXh0U2libGluZzticmVhayBhfWM9CmMucGFyZW50Tm9kZX1jPXZvaWQgMH1jPUlkKGMpfX1mdW5jdGlvbiAkYihhKXt2YXIgYj1hJiZhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGImJigiaW5wdXQiPT09YiYmInRleHQiPT09YS50eXBlfHwidGV4dGFyZWEiPT09Ynx8InRydWUiPT09YS5jb250ZW50RWRpdGFibGUpfWZ1bmN0aW9uIEtkKGEsYil7aWYoYWN8fG51bGw9PWthfHxrYSE9PWJjKCkpcmV0dXJuIG51bGw7dmFyIGM9a2E7InNlbGVjdGlvblN0YXJ0ImluIGMmJiRiKGMpP2M9e3N0YXJ0OmMuc2VsZWN0aW9uU3RhcnQsZW5kOmMuc2VsZWN0aW9uRW5kfTp3aW5kb3cuZ2V0U2VsZWN0aW9uPyhjPXdpbmRvdy5nZXRTZWxlY3Rpb24oKSxjPXthbmNob3JOb2RlOmMuYW5jaG9yTm9kZSxhbmNob3JPZmZzZXQ6Yy5hbmNob3JPZmZzZXQsZm9jdXNOb2RlOmMuZm9jdXNOb2RlLGZvY3VzT2Zmc2V0OmMuZm9jdXNPZmZzZXR9KTpjPXZvaWQgMDtyZXR1cm4gUGEmJmNjKFBhLGMpP251bGw6KFBhPQpjLGE9bi5nZXRQb29sZWQoTGQuc2VsZWN0LGRjLGEsYiksYS50eXBlPSJzZWxlY3QiLGEudGFyZ2V0PWthLHphKGEpLGEpfWZ1bmN0aW9uIE1kKGEsYixjLGQpe3JldHVybiBuLmNhbGwodGhpcyxhLGIsYyxkKX1mdW5jdGlvbiBOZChhLGIsYyxkKXtyZXR1cm4gbi5jYWxsKHRoaXMsYSxiLGMsZCl9ZnVuY3Rpb24gT2QoYSxiLGMsZCl7cmV0dXJuIG4uY2FsbCh0aGlzLGEsYixjLGQpfWZ1bmN0aW9uIHFiKGEpe3ZhciBiPWEua2V5Q29kZTsiY2hhckNvZGUiaW4gYT8oYT1hLmNoYXJDb2RlLDA9PT1hJiYxMz09PWImJihhPTEzKSk6YT1iO3JldHVybiAzMjw9YXx8MTM9PT1hP2E6MH1mdW5jdGlvbiBQZChhLGIsYyxkKXtyZXR1cm4gbi5jYWxsKHRoaXMsYSxiLGMsZCl9ZnVuY3Rpb24gUWQoYSxiLGMsZCl7cmV0dXJuIG4uY2FsbCh0aGlzLGEsYixjLGQpfWZ1bmN0aW9uIFJkKGEsYixjLGQpe3JldHVybiBuLmNhbGwodGhpcyxhLGIsYyxkKX1mdW5jdGlvbiBTZChhLGIsYyxkKXtyZXR1cm4gbi5jYWxsKHRoaXMsCmEsYixjLGQpfWZ1bmN0aW9uIFRkKGEsYixjLGQpe3JldHVybiBuLmNhbGwodGhpcyxhLGIsYyxkKX1mdW5jdGlvbiBJKGEsYil7MD50YXx8KGEuY3VycmVudD1yYlt0YV0scmJbdGFdPW51bGwsdGEtLSl9ZnVuY3Rpb24gTihhLGIsYyl7dGErKztyYlt0YV09YS5jdXJyZW50O2EuY3VycmVudD1ifWZ1bmN0aW9uIFFhKGEpe3JldHVybiBSYShhKT9zYjpsYS5jdXJyZW50fWZ1bmN0aW9uIFNhKGEsYil7dmFyIGM9YS50eXBlLmNvbnRleHRUeXBlcztpZighYylyZXR1cm4gbWE7dmFyIGQ9YS5zdGF0ZU5vZGU7aWYoZCYmZC5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PT09YilyZXR1cm4gZC5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dDt2YXIgZT17fSxmO2ZvcihmIGluIGMpZVtmXT1iW2ZdO2QmJihhPWEuc3RhdGVOb2RlLGEuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dD1iLGEuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ9CmUpO3JldHVybiBlfWZ1bmN0aW9uIFJhKGEpe3JldHVybiAyPT09YS50YWcmJm51bGwhPWEudHlwZS5jaGlsZENvbnRleHRUeXBlc31mdW5jdGlvbiBVZChhKXtSYShhKSYmKEkoSixhKSxJKGxhLGEpKX1mdW5jdGlvbiBWZChhLGIsYyl7bnVsbCE9bGEuY3Vyc29yP2woIjE2OCIpOnZvaWQgMDtOKGxhLGIsYSk7TihKLGMsYSl9ZnVuY3Rpb24gV2QoYSxiKXt2YXIgYz1hLnN0YXRlTm9kZSxkPWEudHlwZS5jaGlsZENvbnRleHRUeXBlcztpZigiZnVuY3Rpb24iIT09dHlwZW9mIGMuZ2V0Q2hpbGRDb250ZXh0KXJldHVybiBiO2M9Yy5nZXRDaGlsZENvbnRleHQoKTtmb3IodmFyIGUgaW4gYyllIGluIGQ/dm9pZCAwOmwoIjEwOCIsTWEoYSl8fCJVbmtub3duIixlKTtyZXR1cm4gQih7fSxiLGMpfWZ1bmN0aW9uIHRiKGEpe2lmKCFSYShhKSlyZXR1cm4hMTt2YXIgYj1hLnN0YXRlTm9kZTtiPWImJmIuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHR8fG1hO3NiPQpsYS5jdXJyZW50O04obGEsYixhKTtOKEosSi5jdXJyZW50LGEpO3JldHVybiEwfWZ1bmN0aW9uIFhkKGEsYil7dmFyIGM9YS5zdGF0ZU5vZGU7Yz92b2lkIDA6bCgiMTY5Iik7aWYoYil7dmFyIGQ9V2QoYSxzYik7Yy5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dD1kO0koSixhKTtJKGxhLGEpO04obGEsZCxhKX1lbHNlIEkoSixhKTtOKEosYixhKX1mdW5jdGlvbiBRKGEsYixjKXt0aGlzLnRhZz1hO3RoaXMua2V5PWI7dGhpcy5zdGF0ZU5vZGU9dGhpcy50eXBlPW51bGw7dGhpcy5zaWJsaW5nPXRoaXMuY2hpbGQ9dGhpc1sicmV0dXJuIl09bnVsbDt0aGlzLmluZGV4PTA7dGhpcy5tZW1vaXplZFN0YXRlPXRoaXMudXBkYXRlUXVldWU9dGhpcy5tZW1vaXplZFByb3BzPXRoaXMucGVuZGluZ1Byb3BzPXRoaXMucmVmPW51bGw7dGhpcy5pbnRlcm5hbENvbnRleHRUYWc9Yzt0aGlzLmVmZmVjdFRhZz0wO3RoaXMubGFzdEVmZmVjdD10aGlzLmZpcnN0RWZmZWN0PQp0aGlzLm5leHRFZmZlY3Q9bnVsbDt0aGlzLmV4cGlyYXRpb25UaW1lPTA7dGhpcy5hbHRlcm5hdGU9bnVsbH1mdW5jdGlvbiB1YihhLGIsYyl7dmFyIGQ9YS5hbHRlcm5hdGU7bnVsbD09PWQ/KGQ9bmV3IFEoYS50YWcsYS5rZXksYS5pbnRlcm5hbENvbnRleHRUYWcpLGQudHlwZT1hLnR5cGUsZC5zdGF0ZU5vZGU9YS5zdGF0ZU5vZGUsZC5hbHRlcm5hdGU9YSxhLmFsdGVybmF0ZT1kKTooZC5lZmZlY3RUYWc9MCxkLm5leHRFZmZlY3Q9bnVsbCxkLmZpcnN0RWZmZWN0PW51bGwsZC5sYXN0RWZmZWN0PW51bGwpO2QuZXhwaXJhdGlvblRpbWU9YztkLnBlbmRpbmdQcm9wcz1iO2QuY2hpbGQ9YS5jaGlsZDtkLm1lbW9pemVkUHJvcHM9YS5tZW1vaXplZFByb3BzO2QubWVtb2l6ZWRTdGF0ZT1hLm1lbW9pemVkU3RhdGU7ZC51cGRhdGVRdWV1ZT1hLnVwZGF0ZVF1ZXVlO2Quc2libGluZz1hLnNpYmxpbmc7ZC5pbmRleD1hLmluZGV4O2QucmVmPWEucmVmO3JldHVybiBkfWZ1bmN0aW9uIGVjKGEsCmIsYyl7dmFyIGQ9dm9pZCAwLGU9YS50eXBlLGY9YS5rZXk7ImZ1bmN0aW9uIj09PXR5cGVvZiBlPyhkPWUucHJvdG90eXBlJiZlLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50P25ldyBRKDIsZixiKTpuZXcgUSgwLGYsYiksZC50eXBlPWUsZC5wZW5kaW5nUHJvcHM9YS5wcm9wcyk6InN0cmluZyI9PT10eXBlb2YgZT8oZD1uZXcgUSg1LGYsYiksZC50eXBlPWUsZC5wZW5kaW5nUHJvcHM9YS5wcm9wcyk6Im9iamVjdCI9PT10eXBlb2YgZSYmbnVsbCE9PWUmJiJudW1iZXIiPT09dHlwZW9mIGUudGFnPyhkPWUsZC5wZW5kaW5nUHJvcHM9YS5wcm9wcyk6bCgiMTMwIixudWxsPT1lP2U6dHlwZW9mIGUsIiIpO2QuZXhwaXJhdGlvblRpbWU9YztyZXR1cm4gZH1mdW5jdGlvbiB2YihhLGIsYyxkKXtiPW5ldyBRKDEwLGQsYik7Yi5wZW5kaW5nUHJvcHM9YTtiLmV4cGlyYXRpb25UaW1lPWM7cmV0dXJuIGJ9ZnVuY3Rpb24gZmMoYSxiLGMpe2I9bmV3IFEoNixudWxsLGIpO2IucGVuZGluZ1Byb3BzPQphO2IuZXhwaXJhdGlvblRpbWU9YztyZXR1cm4gYn1mdW5jdGlvbiBnYyhhLGIsYyl7Yj1uZXcgUSg3LGEua2V5LGIpO2IudHlwZT1hLmhhbmRsZXI7Yi5wZW5kaW5nUHJvcHM9YTtiLmV4cGlyYXRpb25UaW1lPWM7cmV0dXJuIGJ9ZnVuY3Rpb24gaGMoYSxiLGMpe2E9bmV3IFEoOSxudWxsLGIpO2EuZXhwaXJhdGlvblRpbWU9YztyZXR1cm4gYX1mdW5jdGlvbiBpYyhhLGIsYyl7Yj1uZXcgUSg0LGEua2V5LGIpO2IucGVuZGluZ1Byb3BzPWEuY2hpbGRyZW58fFtdO2IuZXhwaXJhdGlvblRpbWU9YztiLnN0YXRlTm9kZT17Y29udGFpbmVySW5mbzphLmNvbnRhaW5lckluZm8scGVuZGluZ0NoaWxkcmVuOm51bGwsaW1wbGVtZW50YXRpb246YS5pbXBsZW1lbnRhdGlvbn07cmV0dXJuIGJ9ZnVuY3Rpb24gWWQoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3RyeXtyZXR1cm4gYShiKX1jYXRjaChjKXt9fX1mdW5jdGlvbiBzZihhKXtpZigidW5kZWZpbmVkIj09PXR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18pcmV0dXJuITE7CnZhciBiPV9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztpZihiLmlzRGlzYWJsZWR8fCFiLnN1cHBvcnRzRmliZXIpcmV0dXJuITA7dHJ5e3ZhciBjPWIuaW5qZWN0KGEpO2pjPVlkKGZ1bmN0aW9uKGEpe3JldHVybiBiLm9uQ29tbWl0RmliZXJSb290KGMsYSl9KTtrYz1ZZChmdW5jdGlvbihhKXtyZXR1cm4gYi5vbkNvbW1pdEZpYmVyVW5tb3VudChjLGEpfSl9Y2F0Y2goZCl7fXJldHVybiEwfWZ1bmN0aW9uIFpkKGEpeyJmdW5jdGlvbiI9PT10eXBlb2YgamMmJmpjKGEpfWZ1bmN0aW9uICRkKGEpeyJmdW5jdGlvbiI9PT10eXBlb2Yga2MmJmtjKGEpfWZ1bmN0aW9uIGFlKGEpe3JldHVybntiYXNlU3RhdGU6YSxleHBpcmF0aW9uVGltZTowLGZpcnN0Om51bGwsbGFzdDpudWxsLGNhbGxiYWNrTGlzdDpudWxsLGhhc0ZvcmNlVXBkYXRlOiExLGlzSW5pdGlhbGl6ZWQ6ITF9fWZ1bmN0aW9uIHdiKGEsYil7bnVsbD09PWEubGFzdD9hLmZpcnN0PWEubGFzdD1iOihhLmxhc3QubmV4dD0KYixhLmxhc3Q9Yik7aWYoMD09PWEuZXhwaXJhdGlvblRpbWV8fGEuZXhwaXJhdGlvblRpbWU+Yi5leHBpcmF0aW9uVGltZSlhLmV4cGlyYXRpb25UaW1lPWIuZXhwaXJhdGlvblRpbWV9ZnVuY3Rpb24geGIoYSxiKXt2YXIgYz1hLmFsdGVybmF0ZSxkPWEudXBkYXRlUXVldWU7bnVsbD09PWQmJihkPWEudXBkYXRlUXVldWU9YWUobnVsbCkpO251bGwhPT1jPyhhPWMudXBkYXRlUXVldWUsbnVsbD09PWEmJihhPWMudXBkYXRlUXVldWU9YWUobnVsbCkpKTphPW51bGw7YT1hIT09ZD9hOm51bGw7bnVsbD09PWE/d2IoZCxiKTpudWxsPT09ZC5sYXN0fHxudWxsPT09YS5sYXN0Pyh3YihkLGIpLHdiKGEsYikpOih3YihkLGIpLGEubGFzdD1iKX1mdW5jdGlvbiBiZShhLGIsYyxkKXthPWEucGFydGlhbFN0YXRlO3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgYT9hLmNhbGwoYixjLGQpOmF9ZnVuY3Rpb24gbGMoYSxiLGMsZCxlLGYpe251bGwhPT1hJiZhLnVwZGF0ZVF1ZXVlPT09YyYmKGM9CmIudXBkYXRlUXVldWU9e2Jhc2VTdGF0ZTpjLmJhc2VTdGF0ZSxleHBpcmF0aW9uVGltZTpjLmV4cGlyYXRpb25UaW1lLGZpcnN0OmMuZmlyc3QsbGFzdDpjLmxhc3QsaXNJbml0aWFsaXplZDpjLmlzSW5pdGlhbGl6ZWQsY2FsbGJhY2tMaXN0Om51bGwsaGFzRm9yY2VVcGRhdGU6ITF9KTtjLmV4cGlyYXRpb25UaW1lPTA7Yy5pc0luaXRpYWxpemVkP2E9Yy5iYXNlU3RhdGU6KGE9Yy5iYXNlU3RhdGU9Yi5tZW1vaXplZFN0YXRlLGMuaXNJbml0aWFsaXplZD0hMCk7Zm9yKHZhciBnPSEwLGs9Yy5maXJzdCxoPSExO251bGwhPT1rOyl7dmFyIGw9ay5leHBpcmF0aW9uVGltZTtpZihsPmYpe3ZhciBBPWMuZXhwaXJhdGlvblRpbWU7aWYoMD09PUF8fEE+bCljLmV4cGlyYXRpb25UaW1lPWw7aHx8KGg9ITAsYy5iYXNlU3RhdGU9YSl9ZWxzZXtofHwoYy5maXJzdD1rLm5leHQsbnVsbD09PWMuZmlyc3QmJihjLmxhc3Q9bnVsbCkpO2lmKGsuaXNSZXBsYWNlKWE9YmUoayxkLGEsZSksZz0hMDsKZWxzZSBpZihsPWJlKGssZCxhLGUpKWE9Zz9CKHt9LGEsbCk6QihhLGwpLGc9ITE7ay5pc0ZvcmNlZCYmKGMuaGFzRm9yY2VVcGRhdGU9ITApO251bGwhPT1rLmNhbGxiYWNrJiYobD1jLmNhbGxiYWNrTGlzdCxudWxsPT09bCYmKGw9Yy5jYWxsYmFja0xpc3Q9W10pLGwucHVzaChrKSl9az1rLm5leHR9bnVsbCE9PWMuY2FsbGJhY2tMaXN0P2IuZWZmZWN0VGFnfD0zMjpudWxsIT09Yy5maXJzdHx8Yy5oYXNGb3JjZVVwZGF0ZXx8KGIudXBkYXRlUXVldWU9bnVsbCk7aHx8KGMuYmFzZVN0YXRlPWEpO3JldHVybiBhfWZ1bmN0aW9uIGNlKGEsYil7dmFyIGM9YS5jYWxsYmFja0xpc3Q7aWYobnVsbCE9PWMpZm9yKGEuY2FsbGJhY2tMaXN0PW51bGwsYT0wO2E8Yy5sZW5ndGg7YSsrKXt2YXIgZD1jW2FdLGU9ZC5jYWxsYmFjaztkLmNhbGxiYWNrPW51bGw7ImZ1bmN0aW9uIiE9PXR5cGVvZiBlP2woIjE5MSIsZSk6dm9pZCAwO2UuY2FsbChiKX19ZnVuY3Rpb24gdGYoYSxiLGMpe3ZhciBkPQozPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106bnVsbDtyZXR1cm57JCR0eXBlb2Y6VGEsa2V5Om51bGw9PWQ/bnVsbDoiIitkLGNoaWxkcmVuOmEsY29udGFpbmVySW5mbzpiLGltcGxlbWVudGF0aW9uOmN9fWZ1bmN0aW9uIFVhKGEpe2lmKG51bGw9PT1hfHwidW5kZWZpbmVkIj09PXR5cGVvZiBhKXJldHVybiBudWxsO2E9ZGUmJmFbZGVdfHxhWyJAQGl0ZXJhdG9yIl07cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiBhP2E6bnVsbH1mdW5jdGlvbiBWYShhLGIpe3ZhciBjPWIucmVmO2lmKG51bGwhPT1jJiYiZnVuY3Rpb24iIT09dHlwZW9mIGMpe2lmKGIuX293bmVyKXtiPWIuX293bmVyO3ZhciBkPXZvaWQgMDtiJiYoMiE9PWIudGFnP2woIjExMCIpOnZvaWQgMCxkPWIuc3RhdGVOb2RlKTtkP3ZvaWQgMDpsKCIxNDciLGMpO3ZhciBlPSIiK2M7aWYobnVsbCE9PWEmJm51bGwhPT1hLnJlZiYmYS5yZWYuX3N0cmluZ1JlZj09PWUpcmV0dXJuIGEucmVmOwphPWZ1bmN0aW9uKGEpe3ZhciBiPWQucmVmcz09PW1hP2QucmVmcz17fTpkLnJlZnM7bnVsbD09PWE/ZGVsZXRlIGJbZV06YltlXT1hfTthLl9zdHJpbmdSZWY9ZTtyZXR1cm4gYX0ic3RyaW5nIiE9PXR5cGVvZiBjP2woIjE0OCIpOnZvaWQgMDtiLl9vd25lcj92b2lkIDA6bCgiMTQ5IixjKX1yZXR1cm4gY31mdW5jdGlvbiB5YihhLGIpeyJ0ZXh0YXJlYSIhPT1hLnR5cGUmJmwoIjMxIiwiW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChiKT8ib2JqZWN0IHdpdGgga2V5cyB7IitPYmplY3Qua2V5cyhiKS5qb2luKCIsICIpKyJ9IjpiLCIiKX1mdW5jdGlvbiBtYyhhLGIpe2Z1bmN0aW9uIGMoYyxkKXtpZihiKXtpZighYSl7aWYobnVsbD09PWQuYWx0ZXJuYXRlKXJldHVybjtkPWQuYWx0ZXJuYXRlfXZhciBxPWMubGFzdEVmZmVjdDtudWxsIT09cT8ocS5uZXh0RWZmZWN0PWQsYy5sYXN0RWZmZWN0PWQpOmMuZmlyc3RFZmZlY3Q9Yy5sYXN0RWZmZWN0PQpkO2QubmV4dEVmZmVjdD1udWxsO2QuZWZmZWN0VGFnPTh9fWZ1bmN0aW9uIGQoYSxkKXtpZighYilyZXR1cm4gbnVsbDtmb3IoO251bGwhPT1kOyljKGEsZCksZD1kLnNpYmxpbmc7cmV0dXJuIG51bGx9ZnVuY3Rpb24gZShhLGIpe2ZvcihhPW5ldyBNYXA7bnVsbCE9PWI7KW51bGwhPT1iLmtleT9hLnNldChiLmtleSxiKTphLnNldChiLmluZGV4LGIpLGI9Yi5zaWJsaW5nO3JldHVybiBhfWZ1bmN0aW9uIGYoYixjLGQpe2lmKGEpcmV0dXJuIGI9dWIoYixjLGQpLGIuaW5kZXg9MCxiLnNpYmxpbmc9bnVsbCxiO2IuZXhwaXJhdGlvblRpbWU9ZDtiLmVmZmVjdFRhZz0wO2IuaW5kZXg9MDtiLnNpYmxpbmc9bnVsbDtiLnBlbmRpbmdQcm9wcz1jO3JldHVybiBifWZ1bmN0aW9uIGcoYSxjLGQpe2EuaW5kZXg9ZDtpZighYilyZXR1cm4gYztkPWEuYWx0ZXJuYXRlO2lmKG51bGwhPT1kKXJldHVybiBkPWQuaW5kZXgsZDxjPyhhLmVmZmVjdFRhZz0yLGMpOmQ7YS5lZmZlY3RUYWc9MjtyZXR1cm4gY30KZnVuY3Rpb24gayhhKXtiJiZudWxsPT09YS5hbHRlcm5hdGUmJihhLmVmZmVjdFRhZz0yKTtyZXR1cm4gYX1mdW5jdGlvbiBoKGEsYixjLGQpe2lmKG51bGw9PT1ifHw2IT09Yi50YWcpcmV0dXJuIGI9ZmMoYyxhLmludGVybmFsQ29udGV4dFRhZyxkKSxiWyJyZXR1cm4iXT1hLGI7Yj1mKGIsYyxkKTtiWyJyZXR1cm4iXT1hO3JldHVybiBifWZ1bmN0aW9uIEZhKGEsYixjLGQpe2lmKG51bGwhPT1iJiZiLnR5cGU9PT1jLnR5cGUpcmV0dXJuIGQ9ZihiLGMucHJvcHMsZCksZC5yZWY9VmEoYixjKSxkWyJyZXR1cm4iXT1hLGQ7ZD1lYyhjLGEuaW50ZXJuYWxDb250ZXh0VGFnLGQpO2QucmVmPVZhKGIsYyk7ZFsicmV0dXJuIl09YTtyZXR1cm4gZH1mdW5jdGlvbiBBKGEsYixjLGQpe2lmKG51bGw9PT1ifHw3IT09Yi50YWcpcmV0dXJuIGI9Z2MoYyxhLmludGVybmFsQ29udGV4dFRhZyxkKSxiWyJyZXR1cm4iXT1hLGI7Yj1mKGIsYyxkKTtiWyJyZXR1cm4iXT1hO3JldHVybiBifWZ1bmN0aW9uIEQoYSwKYixjLGQpe2lmKG51bGw9PT1ifHw5IT09Yi50YWcpcmV0dXJuIGI9aGMoYyxhLmludGVybmFsQ29udGV4dFRhZyxkKSxiLnR5cGU9Yy52YWx1ZSxiWyJyZXR1cm4iXT1hLGI7Yj1mKGIsbnVsbCxkKTtiLnR5cGU9Yy52YWx1ZTtiWyJyZXR1cm4iXT1hO3JldHVybiBifWZ1bmN0aW9uIHQoYSxiLGMsZCl7aWYobnVsbD09PWJ8fDQhPT1iLnRhZ3x8Yi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyE9PWMuY29udGFpbmVySW5mb3x8Yi5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24hPT1jLmltcGxlbWVudGF0aW9uKXJldHVybiBiPWljKGMsYS5pbnRlcm5hbENvbnRleHRUYWcsZCksYlsicmV0dXJuIl09YSxiO2I9ZihiLGMuY2hpbGRyZW58fFtdLGQpO2JbInJldHVybiJdPWE7cmV0dXJuIGJ9ZnVuY3Rpb24gSyhhLGIsYyxkLGUpe2lmKG51bGw9PT1ifHwxMCE9PWIudGFnKXJldHVybiBiPXZiKGMsYS5pbnRlcm5hbENvbnRleHRUYWcsZCxlKSxiWyJyZXR1cm4iXT1hLGI7Yj1mKGIsYyxkKTtiWyJyZXR1cm4iXT0KYTtyZXR1cm4gYn1mdW5jdGlvbiBMKGEsYixjKXtpZigic3RyaW5nIj09PXR5cGVvZiBifHwibnVtYmVyIj09PXR5cGVvZiBiKXJldHVybiBiPWZjKCIiK2IsYS5pbnRlcm5hbENvbnRleHRUYWcsYyksYlsicmV0dXJuIl09YSxiO2lmKCJvYmplY3QiPT09dHlwZW9mIGImJm51bGwhPT1iKXtzd2l0Y2goYi4kJHR5cGVvZil7Y2FzZSBXYTppZihiLnR5cGU9PT11YSlyZXR1cm4gYj12YihiLnByb3BzLmNoaWxkcmVuLGEuaW50ZXJuYWxDb250ZXh0VGFnLGMsYi5rZXkpLGJbInJldHVybiJdPWEsYjtjPWVjKGIsYS5pbnRlcm5hbENvbnRleHRUYWcsYyk7Yy5yZWY9VmEobnVsbCxiKTtjWyJyZXR1cm4iXT1hO3JldHVybiBjO2Nhc2UgWGE6cmV0dXJuIGI9Z2MoYixhLmludGVybmFsQ29udGV4dFRhZyxjKSxiWyJyZXR1cm4iXT1hLGI7Y2FzZSBZYTpyZXR1cm4gYz1oYyhiLGEuaW50ZXJuYWxDb250ZXh0VGFnLGMpLGMudHlwZT1iLnZhbHVlLGNbInJldHVybiJdPWEsYztjYXNlIFRhOnJldHVybiBiPQppYyhiLGEuaW50ZXJuYWxDb250ZXh0VGFnLGMpLGJbInJldHVybiJdPWEsYn1pZih6YihiKXx8VWEoYikpcmV0dXJuIGI9dmIoYixhLmludGVybmFsQ29udGV4dFRhZyxjLG51bGwpLGJbInJldHVybiJdPWEsYjt5YihhLGIpfXJldHVybiBudWxsfWZ1bmN0aW9uIGFhKGEsYixjLGQpe3ZhciBlPW51bGwhPT1iP2Iua2V5Om51bGw7aWYoInN0cmluZyI9PT10eXBlb2YgY3x8Im51bWJlciI9PT10eXBlb2YgYylyZXR1cm4gbnVsbCE9PWU/bnVsbDpoKGEsYiwiIitjLGQpO2lmKCJvYmplY3QiPT09dHlwZW9mIGMmJm51bGwhPT1jKXtzd2l0Y2goYy4kJHR5cGVvZil7Y2FzZSBXYTpyZXR1cm4gYy5rZXk9PT1lP2MudHlwZT09PXVhP0soYSxiLGMucHJvcHMuY2hpbGRyZW4sZCxlKTpGYShhLGIsYyxkKTpudWxsO2Nhc2UgWGE6cmV0dXJuIGMua2V5PT09ZT9BKGEsYixjLGQpOm51bGw7Y2FzZSBZYTpyZXR1cm4gbnVsbD09PWU/RChhLGIsYyxkKTpudWxsO2Nhc2UgVGE6cmV0dXJuIGMua2V5PT09CmU/dChhLGIsYyxkKTpudWxsfWlmKHpiKGMpfHxVYShjKSlyZXR1cm4gbnVsbCE9PWU/bnVsbDpLKGEsYixjLGQsbnVsbCk7eWIoYSxjKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBlZShhLGIsYyxkLGUpe2lmKCJzdHJpbmciPT09dHlwZW9mIGR8fCJudW1iZXIiPT09dHlwZW9mIGQpcmV0dXJuIGE9YS5nZXQoYyl8fG51bGwsaChiLGEsIiIrZCxlKTtpZigib2JqZWN0Ij09PXR5cGVvZiBkJiZudWxsIT09ZCl7c3dpdGNoKGQuJCR0eXBlb2Ype2Nhc2UgV2E6cmV0dXJuIGE9YS5nZXQobnVsbD09PWQua2V5P2M6ZC5rZXkpfHxudWxsLGQudHlwZT09PXVhP0soYixhLGQucHJvcHMuY2hpbGRyZW4sZSxkLmtleSk6RmEoYixhLGQsZSk7Y2FzZSBYYTpyZXR1cm4gYT1hLmdldChudWxsPT09ZC5rZXk/YzpkLmtleSl8fG51bGwsQShiLGEsZCxlKTtjYXNlIFlhOnJldHVybiBhPWEuZ2V0KGMpfHxudWxsLEQoYixhLGQsZSk7Y2FzZSBUYTpyZXR1cm4gYT1hLmdldChudWxsPT09ZC5rZXk/YzpkLmtleSl8fApudWxsLHQoYixhLGQsZSl9aWYoemIoZCl8fFVhKGQpKXJldHVybiBhPWEuZ2V0KGMpfHxudWxsLEsoYixhLGQsZSxudWxsKTt5YihiLGQpfXJldHVybiBudWxsfWZ1bmN0aW9uIHAoYSxmLHksayl7Zm9yKHZhciBxPW51bGwsaD1udWxsLG09Zix2PWY9MCxsPW51bGw7bnVsbCE9PW0mJnY8eS5sZW5ndGg7disrKXttLmluZGV4PnY/KGw9bSxtPW51bGwpOmw9bS5zaWJsaW5nO3ZhciB4PWFhKGEsbSx5W3ZdLGspO2lmKG51bGw9PT14KXtudWxsPT09bSYmKG09bCk7YnJlYWt9YiYmbSYmbnVsbD09PXguYWx0ZXJuYXRlJiZjKGEsbSk7Zj1nKHgsZix2KTtudWxsPT09aD9xPXg6aC5zaWJsaW5nPXg7aD14O209bH1pZih2PT09eS5sZW5ndGgpcmV0dXJuIGQoYSxtKSxxO2lmKG51bGw9PT1tKXtmb3IoO3Y8eS5sZW5ndGg7disrKWlmKG09TChhLHlbdl0saykpZj1nKG0sZix2KSxudWxsPT09aD9xPW06aC5zaWJsaW5nPW0saD1tO3JldHVybiBxfWZvcihtPWUoYSxtKTt2PHkubGVuZ3RoO3YrKylpZihsPQplZShtLGEsdix5W3ZdLGspKXtpZihiJiZudWxsIT09bC5hbHRlcm5hdGUpbVsiZGVsZXRlIl0obnVsbD09PWwua2V5P3Y6bC5rZXkpO2Y9ZyhsLGYsdik7bnVsbD09PWg/cT1sOmguc2libGluZz1sO2g9bH1iJiZtLmZvckVhY2goZnVuY3Rpb24oYil7cmV0dXJuIGMoYSxiKX0pO3JldHVybiBxfWZ1bmN0aW9uIG4oYSxmLHksayl7dmFyIHE9VWEoeSk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBxP2woIjE1MCIpOnZvaWQgMDt5PXEuY2FsbCh5KTtudWxsPT15P2woIjE1MSIpOnZvaWQgMDtmb3IodmFyIGg9cT1udWxsLG09Zix2PWY9MCxGYT1udWxsLHg9eS5uZXh0KCk7bnVsbCE9PW0mJiF4LmRvbmU7disrLHg9eS5uZXh0KCkpe20uaW5kZXg+dj8oRmE9bSxtPW51bGwpOkZhPW0uc2libGluZzt2YXIgej1hYShhLG0seC52YWx1ZSxrKTtpZihudWxsPT09eil7bXx8KG09RmEpO2JyZWFrfWImJm0mJm51bGw9PT16LmFsdGVybmF0ZSYmYyhhLG0pO2Y9Zyh6LGYsdik7bnVsbD09PWg/cT16Omguc2libGluZz0KejtoPXo7bT1GYX1pZih4LmRvbmUpcmV0dXJuIGQoYSxtKSxxO2lmKG51bGw9PT1tKXtmb3IoOyF4LmRvbmU7disrLHg9eS5uZXh0KCkpeD1MKGEseC52YWx1ZSxrKSxudWxsIT09eCYmKGY9Zyh4LGYsdiksbnVsbD09PWg/cT14Omguc2libGluZz14LGg9eCk7cmV0dXJuIHF9Zm9yKG09ZShhLG0pOyF4LmRvbmU7disrLHg9eS5uZXh0KCkpaWYoeD1lZShtLGEsdix4LnZhbHVlLGspLG51bGwhPT14KXtpZihiJiZudWxsIT09eC5hbHRlcm5hdGUpbVsiZGVsZXRlIl0obnVsbD09PXgua2V5P3Y6eC5rZXkpO2Y9Zyh4LGYsdik7bnVsbD09PWg/cT14Omguc2libGluZz14O2g9eH1iJiZtLmZvckVhY2goZnVuY3Rpb24oYil7cmV0dXJuIGMoYSxiKX0pO3JldHVybiBxfXJldHVybiBmdW5jdGlvbihhLGIsZSxnKXt2YXIgaD0ib2JqZWN0Ij09PXR5cGVvZiBlJiZudWxsIT09ZTtpZihoKXN3aXRjaChlLiQkdHlwZW9mKXtjYXNlIFdhOmE6e3ZhciBxPWUua2V5O2ZvcihoPWI7bnVsbCE9PWg7KXtpZihoLmtleT09PQpxKWlmKDEwPT09aC50YWc/ZS50eXBlPT09dWE6aC50eXBlPT09ZS50eXBlKXtkKGEsaC5zaWJsaW5nKTtiPWYoaCxlLnR5cGU9PT11YT9lLnByb3BzLmNoaWxkcmVuOmUucHJvcHMsZyk7Yi5yZWY9VmEoaCxlKTtiWyJyZXR1cm4iXT1hO2E9YjticmVhayBhfWVsc2V7ZChhLGgpO2JyZWFrfWVsc2UgYyhhLGgpO2g9aC5zaWJsaW5nfWUudHlwZT09PXVhPyhlPXZiKGUucHJvcHMuY2hpbGRyZW4sYS5pbnRlcm5hbENvbnRleHRUYWcsZyxlLmtleSksZVsicmV0dXJuIl09YSxhPWUpOihnPWVjKGUsYS5pbnRlcm5hbENvbnRleHRUYWcsZyksZy5yZWY9VmEoYixlKSxnWyJyZXR1cm4iXT1hLGE9Zyl9cmV0dXJuIGsoYSk7Y2FzZSBYYTphOntmb3IoaD1lLmtleTtudWxsIT09Yjspe2lmKGIua2V5PT09aClpZig3PT09Yi50YWcpe2QoYSxiLnNpYmxpbmcpO2U9ZihiLGUsZyk7ZVsicmV0dXJuIl09YTthPWU7YnJlYWsgYX1lbHNle2QoYSxiKTticmVha31lbHNlIGMoYSxiKTtiPWIuc2libGluZ31lPQpnYyhlLGEuaW50ZXJuYWxDb250ZXh0VGFnLGcpO2VbInJldHVybiJdPWE7YT1lfXJldHVybiBrKGEpO2Nhc2UgWWE6YTp7aWYobnVsbCE9PWIpaWYoOT09PWIudGFnKXtkKGEsYi5zaWJsaW5nKTtiPWYoYixudWxsLGcpO2IudHlwZT1lLnZhbHVlO2JbInJldHVybiJdPWE7YT1iO2JyZWFrIGF9ZWxzZSBkKGEsYik7Yj1oYyhlLGEuaW50ZXJuYWxDb250ZXh0VGFnLGcpO2IudHlwZT1lLnZhbHVlO2JbInJldHVybiJdPWE7YT1ifXJldHVybiBrKGEpO2Nhc2UgVGE6YTp7Zm9yKGg9ZS5rZXk7bnVsbCE9PWI7KXtpZihiLmtleT09PWgpaWYoND09PWIudGFnJiZiLnN0YXRlTm9kZS5jb250YWluZXJJbmZvPT09ZS5jb250YWluZXJJbmZvJiZiLnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbj09PWUuaW1wbGVtZW50YXRpb24pe2QoYSxiLnNpYmxpbmcpO2U9ZihiLGUuY2hpbGRyZW58fFtdLGcpO2VbInJldHVybiJdPWE7YT1lO2JyZWFrIGF9ZWxzZXtkKGEsYik7YnJlYWt9ZWxzZSBjKGEsYik7CmI9Yi5zaWJsaW5nfWU9aWMoZSxhLmludGVybmFsQ29udGV4dFRhZyxnKTtlWyJyZXR1cm4iXT1hO2E9ZX1yZXR1cm4gayhhKX1pZigic3RyaW5nIj09PXR5cGVvZiBlfHwibnVtYmVyIj09PXR5cGVvZiBlKXJldHVybiBlPSIiK2UsbnVsbCE9PWImJjY9PT1iLnRhZz8oZChhLGIuc2libGluZyksZT1mKGIsZSxnKSk6KGQoYSxiKSxlPWZjKGUsYS5pbnRlcm5hbENvbnRleHRUYWcsZykpLGVbInJldHVybiJdPWEsYT1lLGsoYSk7aWYoemIoZSkpcmV0dXJuIHAoYSxiLGUsZyk7aWYoVWEoZSkpcmV0dXJuIG4oYSxiLGUsZyk7aCYmeWIoYSxlKTtpZigidW5kZWZpbmVkIj09PXR5cGVvZiBlKXN3aXRjaChhLnRhZyl7Y2FzZSAyOmNhc2UgMTplPWEudHlwZSxsKCIxNTIiLGUuZGlzcGxheU5hbWV8fGUubmFtZXx8IkNvbXBvbmVudCIpfXJldHVybiBkKGEsYil9fWZ1bmN0aW9uIHZmKGEpe2lmKGZlLmhhc093blByb3BlcnR5KGEpKXJldHVybiEwO2lmKGdlLmhhc093blByb3BlcnR5KGEpKXJldHVybiExOwppZih3Zi50ZXN0KGEpKXJldHVybiBmZVthXT0hMDtnZVthXT0hMDtyZXR1cm4hMX1mdW5jdGlvbiBuYyhhLGIsYyl7dmFyIGQ9SmIoYik7aWYoZCYmUWMoYixjKSl7dmFyIGU9ZC5tdXRhdGlvbk1ldGhvZDtlP2UoYSxjKTpudWxsPT1jfHxkLmhhc0Jvb2xlYW5WYWx1ZSYmIWN8fGQuaGFzTnVtZXJpY1ZhbHVlJiZpc05hTihjKXx8ZC5oYXNQb3NpdGl2ZU51bWVyaWNWYWx1ZSYmMT5jfHxkLmhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWUmJiExPT09Yz9oZShhLGIpOmQubXVzdFVzZVByb3BlcnR5P2FbZC5wcm9wZXJ0eU5hbWVdPWM6KGI9ZC5hdHRyaWJ1dGVOYW1lLChlPWQuYXR0cmlidXRlTmFtZXNwYWNlKT9hLnNldEF0dHJpYnV0ZU5TKGUsYiwiIitjKTpkLmhhc0Jvb2xlYW5WYWx1ZXx8ZC5oYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlJiYhMD09PWM/YS5zZXRBdHRyaWJ1dGUoYiwiIik6YS5zZXRBdHRyaWJ1dGUoYiwiIitjKSl9ZWxzZSBvYyhhLGIsUWMoYixjKT9jOm51bGwpfWZ1bmN0aW9uIG9jKGEsCmIsYyl7dmYoYikmJihudWxsPT1jP2EucmVtb3ZlQXR0cmlidXRlKGIpOmEuc2V0QXR0cmlidXRlKGIsIiIrYykpfWZ1bmN0aW9uIGhlKGEsYil7dmFyIGM9SmIoYik7Yz8oYj1jLm11dGF0aW9uTWV0aG9kKT9iKGEsdm9pZCAwKTpjLm11c3RVc2VQcm9wZXJ0eT9hW2MucHJvcGVydHlOYW1lXT1jLmhhc0Jvb2xlYW5WYWx1ZT8hMToiIjphLnJlbW92ZUF0dHJpYnV0ZShjLmF0dHJpYnV0ZU5hbWUpOmEucmVtb3ZlQXR0cmlidXRlKGIpfWZ1bmN0aW9uIHBjKGEsYil7dmFyIGM9Yi52YWx1ZSxkPWIuY2hlY2tlZDtyZXR1cm4gQih7dHlwZTp2b2lkIDAsc3RlcDp2b2lkIDAsbWluOnZvaWQgMCxtYXg6dm9pZCAwfSxiLHtkZWZhdWx0Q2hlY2tlZDp2b2lkIDAsZGVmYXVsdFZhbHVlOnZvaWQgMCx2YWx1ZTpudWxsIT1jP2M6YS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSxjaGVja2VkOm51bGwhPWQ/ZDphLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWR9KX1mdW5jdGlvbiBpZShhLApiKXt2YXIgYz1iLmRlZmF1bHRWYWx1ZTthLl93cmFwcGVyU3RhdGU9e2luaXRpYWxDaGVja2VkOm51bGwhPWIuY2hlY2tlZD9iLmNoZWNrZWQ6Yi5kZWZhdWx0Q2hlY2tlZCxpbml0aWFsVmFsdWU6bnVsbCE9Yi52YWx1ZT9iLnZhbHVlOmMsY29udHJvbGxlZDoiY2hlY2tib3giPT09Yi50eXBlfHwicmFkaW8iPT09Yi50eXBlP251bGwhPWIuY2hlY2tlZDpudWxsIT1iLnZhbHVlfX1mdW5jdGlvbiBxYyhhLGIpe3ZhciBjPWIuY2hlY2tlZDtudWxsIT1jJiZuYyhhLCJjaGVja2VkIixjfHwhMSk7Yz1iLnZhbHVlO2lmKG51bGwhPWMpaWYoMD09PWMmJiIiPT09YS52YWx1ZSlhLnZhbHVlPSIwIjtlbHNlIGlmKCJudW1iZXIiPT09Yi50eXBlKXtpZihiPXBhcnNlRmxvYXQoYS52YWx1ZSl8fDAsYyE9Ynx8Yz09YiYmYS52YWx1ZSE9YylhLnZhbHVlPSIiK2N9ZWxzZSBhLnZhbHVlIT09IiIrYyYmKGEudmFsdWU9IiIrYyk7ZWxzZSBudWxsPT1iLnZhbHVlJiZudWxsIT1iLmRlZmF1bHRWYWx1ZSYmCmEuZGVmYXVsdFZhbHVlIT09IiIrYi5kZWZhdWx0VmFsdWUmJihhLmRlZmF1bHRWYWx1ZT0iIitiLmRlZmF1bHRWYWx1ZSksbnVsbD09Yi5jaGVja2VkJiZudWxsIT1iLmRlZmF1bHRDaGVja2VkJiYoYS5kZWZhdWx0Q2hlY2tlZD0hIWIuZGVmYXVsdENoZWNrZWQpfWZ1bmN0aW9uIGplKGEsYil7c3dpdGNoKGIudHlwZSl7Y2FzZSAic3VibWl0IjpjYXNlICJyZXNldCI6YnJlYWs7Y2FzZSAiY29sb3IiOmNhc2UgImRhdGUiOmNhc2UgImRhdGV0aW1lIjpjYXNlICJkYXRldGltZS1sb2NhbCI6Y2FzZSAibW9udGgiOmNhc2UgInRpbWUiOmNhc2UgIndlZWsiOmEudmFsdWU9IiI7YS52YWx1ZT1hLmRlZmF1bHRWYWx1ZTticmVhaztkZWZhdWx0OmEudmFsdWU9YS52YWx1ZX1iPWEubmFtZTsiIiE9PWImJihhLm5hbWU9IiIpO2EuZGVmYXVsdENoZWNrZWQ9IWEuZGVmYXVsdENoZWNrZWQ7YS5kZWZhdWx0Q2hlY2tlZD0hYS5kZWZhdWx0Q2hlY2tlZDsiIiE9PWImJihhLm5hbWU9Yil9ZnVuY3Rpb24geGYoYSl7dmFyIGI9CiIiO2VhLkNoaWxkcmVuLmZvckVhY2goYSxmdW5jdGlvbihhKXtudWxsPT1hfHwic3RyaW5nIiE9PXR5cGVvZiBhJiYibnVtYmVyIiE9PXR5cGVvZiBhfHwoYis9YSl9KTtyZXR1cm4gYn1mdW5jdGlvbiByYyhhLGIpe2E9Qih7Y2hpbGRyZW46dm9pZCAwfSxiKTtpZihiPXhmKGIuY2hpbGRyZW4pKWEuY2hpbGRyZW49YjtyZXR1cm4gYX1mdW5jdGlvbiBXKGEsYixjLGQpe2E9YS5vcHRpb25zO2lmKGIpe2I9e307Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspYlsiJCIrY1tlXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyllPWIuaGFzT3duUHJvcGVydHkoIiQiK2FbY10udmFsdWUpLGFbY10uc2VsZWN0ZWQhPT1lJiYoYVtjXS5zZWxlY3RlZD1lKSxlJiZkJiYoYVtjXS5kZWZhdWx0U2VsZWN0ZWQ9ITApfWVsc2V7Yz0iIitjO2I9bnVsbDtmb3IoZT0wO2U8YS5sZW5ndGg7ZSsrKXtpZihhW2VdLnZhbHVlPT09Yyl7YVtlXS5zZWxlY3RlZD0hMDtkJiYoYVtlXS5kZWZhdWx0U2VsZWN0ZWQ9CiEwKTtyZXR1cm59bnVsbCE9PWJ8fGFbZV0uZGlzYWJsZWR8fChiPWFbZV0pfW51bGwhPT1iJiYoYi5zZWxlY3RlZD0hMCl9fWZ1bmN0aW9uIGtlKGEsYil7dmFyIGM9Yi52YWx1ZTthLl93cmFwcGVyU3RhdGU9e2luaXRpYWxWYWx1ZTpudWxsIT1jP2M6Yi5kZWZhdWx0VmFsdWUsd2FzTXVsdGlwbGU6ISFiLm11bHRpcGxlfX1mdW5jdGlvbiBzYyhhLGIpe251bGwhPWIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw/bCgiOTEiKTp2b2lkIDA7cmV0dXJuIEIoe30sYix7dmFsdWU6dm9pZCAwLGRlZmF1bHRWYWx1ZTp2b2lkIDAsY2hpbGRyZW46IiIrYS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZX0pfWZ1bmN0aW9uIGxlKGEsYil7dmFyIGM9Yi52YWx1ZSxkPWM7bnVsbD09YyYmKGM9Yi5kZWZhdWx0VmFsdWUsYj1iLmNoaWxkcmVuLG51bGwhPWImJihudWxsIT1jP2woIjkyIik6dm9pZCAwLEFycmF5LmlzQXJyYXkoYikmJigxPj1iLmxlbmd0aD92b2lkIDA6bCgiOTMiKSxiPWJbMF0pLApjPSIiK2IpLG51bGw9PWMmJihjPSIiKSxkPWMpO2EuX3dyYXBwZXJTdGF0ZT17aW5pdGlhbFZhbHVlOiIiK2R9fWZ1bmN0aW9uIG1lKGEsYil7dmFyIGM9Yi52YWx1ZTtudWxsIT1jJiYoYz0iIitjLGMhPT1hLnZhbHVlJiYoYS52YWx1ZT1jKSxudWxsPT1iLmRlZmF1bHRWYWx1ZSYmKGEuZGVmYXVsdFZhbHVlPWMpKTtudWxsIT1iLmRlZmF1bHRWYWx1ZSYmKGEuZGVmYXVsdFZhbHVlPWIuZGVmYXVsdFZhbHVlKX1mdW5jdGlvbiBuZShhKXtzd2l0Y2goYSl7Y2FzZSAic3ZnIjpyZXR1cm4iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciO2Nhc2UgIm1hdGgiOnJldHVybiJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MIjtkZWZhdWx0OnJldHVybiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIn19ZnVuY3Rpb24gdGMoYSxiKXtyZXR1cm4gbnVsbD09YXx8Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPT09YT9uZShiKToiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPT09CmEmJiJmb3JlaWduT2JqZWN0Ij09PWI/Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOmF9ZnVuY3Rpb24gb2UoYSxiLGMpe2E9YS5zdHlsZTtmb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpKXtjPTA9PT1kLmluZGV4T2YoIi0tIik7dmFyIGU9ZDt2YXIgZj1iW2RdO2U9bnVsbD09Znx8ImJvb2xlYW4iPT09dHlwZW9mIGZ8fCIiPT09Zj8iIjpjfHwibnVtYmVyIiE9PXR5cGVvZiBmfHwwPT09Znx8WmEuaGFzT3duUHJvcGVydHkoZSkmJlphW2VdPygiIitmKS50cmltKCk6ZisicHgiOyJmbG9hdCI9PT1kJiYoZD0iY3NzRmxvYXQiKTtjP2Euc2V0UHJvcGVydHkoZCxlKTphW2RdPWV9fWZ1bmN0aW9uIHVjKGEsYixjKXtiJiYoeWZbYV0mJihudWxsIT1iLmNoaWxkcmVufHxudWxsIT1iLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MP2woIjEzNyIsYSxjKCkpOnZvaWQgMCksbnVsbCE9Yi5kYW5nZXJvdXNseVNldElubmVySFRNTCYmKG51bGwhPWIuY2hpbGRyZW4/bCgiNjAiKToKdm9pZCAwLCJvYmplY3QiPT09dHlwZW9mIGIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwmJiJfX2h0bWwiaW4gYi5kYW5nZXJvdXNseVNldElubmVySFRNTD92b2lkIDA6bCgiNjEiKSksbnVsbCE9Yi5zdHlsZSYmIm9iamVjdCIhPT10eXBlb2YgYi5zdHlsZT9sKCI2MiIsYygpKTp2b2lkIDApfWZ1bmN0aW9uIHZjKGEsYil7aWYoLTE9PT1hLmluZGV4T2YoIi0iKSlyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBiLmlzO3N3aXRjaChhKXtjYXNlICJhbm5vdGF0aW9uLXhtbCI6Y2FzZSAiY29sb3ItcHJvZmlsZSI6Y2FzZSAiZm9udC1mYWNlIjpjYXNlICJmb250LWZhY2Utc3JjIjpjYXNlICJmb250LWZhY2UtdXJpIjpjYXNlICJmb250LWZhY2UtZm9ybWF0IjpjYXNlICJmb250LWZhY2UtbmFtZSI6Y2FzZSAibWlzc2luZy1nbHlwaCI6cmV0dXJuITE7ZGVmYXVsdDpyZXR1cm4hMH19ZnVuY3Rpb24gYmEoYSxiKXthPTk9PT1hLm5vZGVUeXBlfHwxMT09PWEubm9kZVR5cGU/YTphLm93bmVyRG9jdW1lbnQ7CnZhciBjPURkKGEpO2I9Z2JbYl07Zm9yKHZhciBkPTA7ZDxiLmxlbmd0aDtkKyspe3ZhciBlPWJbZF07Yy5oYXNPd25Qcm9wZXJ0eShlKSYmY1tlXXx8KCJ0b3BXaGVlbCI9PT1lP0VhKCJ3aGVlbCIpP3AoInRvcFdoZWVsIiwid2hlZWwiLGEpOkVhKCJtb3VzZXdoZWVsIik/cCgidG9wV2hlZWwiLCJtb3VzZXdoZWVsIixhKTpwKCJ0b3BXaGVlbCIsIkRPTU1vdXNlU2Nyb2xsIixhKToidG9wU2Nyb2xsIj09PWU/VigidG9wU2Nyb2xsIiwic2Nyb2xsIixhKToidG9wRm9jdXMiPT09ZXx8InRvcEJsdXIiPT09ZT8oVigidG9wRm9jdXMiLCJmb2N1cyIsYSksVigidG9wQmx1ciIsImJsdXIiLGEpLGMudG9wQmx1cj0hMCxjLnRvcEZvY3VzPSEwKToidG9wQ2FuY2VsIj09PWU/KEVhKCJjYW5jZWwiLCEwKSYmVigidG9wQ2FuY2VsIiwiY2FuY2VsIixhKSxjLnRvcENhbmNlbD0hMCk6InRvcENsb3NlIj09PWU/KEVhKCJjbG9zZSIsITApJiZWKCJ0b3BDbG9zZSIsImNsb3NlIixhKSxjLnRvcENsb3NlPQohMCk6cGUuaGFzT3duUHJvcGVydHkoZSkmJnAoZSxwZVtlXSxhKSxjW2VdPSEwKX19ZnVuY3Rpb24gcWUoYSxiLGMsZCl7Yz05PT09Yy5ub2RlVHlwZT9jOmMub3duZXJEb2N1bWVudDsiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI9PT1kJiYoZD1uZShhKSk7Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPT09ZD8ic2NyaXB0Ij09PWE/KGE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxhLmlubmVySFRNTD0iXHgzY3NjcmlwdFx4M2VceDNjL3NjcmlwdFx4M2UiLGE9YS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpKTphPSJzdHJpbmciPT09dHlwZW9mIGIuaXM/Yy5jcmVhdGVFbGVtZW50KGEse2lzOmIuaXN9KTpjLmNyZWF0ZUVsZW1lbnQoYSk6YT1jLmNyZWF0ZUVsZW1lbnROUyhkLGEpO3JldHVybiBhfWZ1bmN0aW9uIHJlKGEsYil7cmV0dXJuKDk9PT1iLm5vZGVUeXBlP2I6Yi5vd25lckRvY3VtZW50KS5jcmVhdGVUZXh0Tm9kZShhKX1mdW5jdGlvbiBzZShhLGIsYywKZCl7dmFyIGU9dmMoYixjKTtzd2l0Y2goYil7Y2FzZSAiaWZyYW1lIjpjYXNlICJvYmplY3QiOnAoInRvcExvYWQiLCJsb2FkIixhKTt2YXIgZj1jO2JyZWFrO2Nhc2UgInZpZGVvIjpjYXNlICJhdWRpbyI6Zm9yKGYgaW4gUilSLmhhc093blByb3BlcnR5KGYpJiZwKGYsUltmXSxhKTtmPWM7YnJlYWs7Y2FzZSAic291cmNlIjpwKCJ0b3BFcnJvciIsImVycm9yIixhKTtmPWM7YnJlYWs7Y2FzZSAiaW1nIjpjYXNlICJpbWFnZSI6cCgidG9wRXJyb3IiLCJlcnJvciIsYSk7cCgidG9wTG9hZCIsImxvYWQiLGEpO2Y9YzticmVhaztjYXNlICJmb3JtIjpwKCJ0b3BSZXNldCIsInJlc2V0IixhKTtwKCJ0b3BTdWJtaXQiLCJzdWJtaXQiLGEpO2Y9YzticmVhaztjYXNlICJkZXRhaWxzIjpwKCJ0b3BUb2dnbGUiLCJ0b2dnbGUiLGEpO2Y9YzticmVhaztjYXNlICJpbnB1dCI6aWUoYSxjKTtmPXBjKGEsYyk7cCgidG9wSW52YWxpZCIsImludmFsaWQiLGEpO2JhKGQsIm9uQ2hhbmdlIik7YnJlYWs7CmNhc2UgIm9wdGlvbiI6Zj1yYyhhLGMpO2JyZWFrO2Nhc2UgInNlbGVjdCI6a2UoYSxjKTtmPUIoe30sYyx7dmFsdWU6dm9pZCAwfSk7cCgidG9wSW52YWxpZCIsImludmFsaWQiLGEpO2JhKGQsIm9uQ2hhbmdlIik7YnJlYWs7Y2FzZSAidGV4dGFyZWEiOmxlKGEsYyk7Zj1zYyhhLGMpO3AoInRvcEludmFsaWQiLCJpbnZhbGlkIixhKTtiYShkLCJvbkNoYW5nZSIpO2JyZWFrO2RlZmF1bHQ6Zj1jfXVjKGIsZiwkYSk7dmFyIGc9ZixrO2ZvcihrIGluIGcpaWYoZy5oYXNPd25Qcm9wZXJ0eShrKSl7dmFyIGg9Z1trXTsic3R5bGUiPT09az9vZShhLGgsJGEpOiJkYW5nZXJvdXNseVNldElubmVySFRNTCI9PT1rPyhoPWg/aC5fX2h0bWw6dm9pZCAwLG51bGwhPWgmJndjKGEsaCkpOiJjaGlsZHJlbiI9PT1rPyJzdHJpbmciPT09dHlwZW9mIGg/KCJ0ZXh0YXJlYSIhPT1ifHwiIiE9PWgpJiZ4YyhhLGgpOiJudW1iZXIiPT09dHlwZW9mIGgmJnhjKGEsIiIraCk6InN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyIhPT0KayYmInN1cHByZXNzSHlkcmF0aW9uV2FybmluZyIhPT1rJiYiYXV0b0ZvY3VzIiE9PWsmJihyYS5oYXNPd25Qcm9wZXJ0eShrKT9udWxsIT1oJiZiYShkLGspOmU/b2MoYSxrLGgpOm51bGwhPWgmJm5jKGEsayxoKSl9c3dpdGNoKGIpe2Nhc2UgImlucHV0IjpqYihhKTtqZShhLGMpO2JyZWFrO2Nhc2UgInRleHRhcmVhIjpqYihhKTtjPWEudGV4dENvbnRlbnQ7Yz09PWEuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUmJihhLnZhbHVlPWMpO2JyZWFrO2Nhc2UgIm9wdGlvbiI6bnVsbCE9Yy52YWx1ZSYmYS5zZXRBdHRyaWJ1dGUoInZhbHVlIixjLnZhbHVlKTticmVhaztjYXNlICJzZWxlY3QiOmEubXVsdGlwbGU9ISFjLm11bHRpcGxlO2I9Yy52YWx1ZTtudWxsIT1iP1coYSwhIWMubXVsdGlwbGUsYiwhMSk6bnVsbCE9Yy5kZWZhdWx0VmFsdWUmJlcoYSwhIWMubXVsdGlwbGUsYy5kZWZhdWx0VmFsdWUsITApO2JyZWFrO2RlZmF1bHQ6ImZ1bmN0aW9uIj09PXR5cGVvZiBmLm9uQ2xpY2smJgooYS5vbmNsaWNrPUUpfX1mdW5jdGlvbiB0ZShhLGIsYyxkLGUpe3ZhciBmPW51bGw7c3dpdGNoKGIpe2Nhc2UgImlucHV0IjpjPXBjKGEsYyk7ZD1wYyhhLGQpO2Y9W107YnJlYWs7Y2FzZSAib3B0aW9uIjpjPXJjKGEsYyk7ZD1yYyhhLGQpO2Y9W107YnJlYWs7Y2FzZSAic2VsZWN0IjpjPUIoe30sYyx7dmFsdWU6dm9pZCAwfSk7ZD1CKHt9LGQse3ZhbHVlOnZvaWQgMH0pO2Y9W107YnJlYWs7Y2FzZSAidGV4dGFyZWEiOmM9c2MoYSxjKTtkPXNjKGEsZCk7Zj1bXTticmVhaztkZWZhdWx0OiJmdW5jdGlvbiIhPT10eXBlb2YgYy5vbkNsaWNrJiYiZnVuY3Rpb24iPT09dHlwZW9mIGQub25DbGljayYmKGEub25jbGljaz1FKX11YyhiLGQsJGEpO3ZhciBnLGs7YT1udWxsO2ZvcihnIGluIGMpaWYoIWQuaGFzT3duUHJvcGVydHkoZykmJmMuaGFzT3duUHJvcGVydHkoZykmJm51bGwhPWNbZ10paWYoInN0eWxlIj09PWcpZm9yKGsgaW4gYj1jW2ddLGIpYi5oYXNPd25Qcm9wZXJ0eShrKSYmCihhfHwoYT17fSksYVtrXT0iIik7ZWxzZSJkYW5nZXJvdXNseVNldElubmVySFRNTCIhPT1nJiYiY2hpbGRyZW4iIT09ZyYmInN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyIhPT1nJiYic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIiE9PWcmJiJhdXRvRm9jdXMiIT09ZyYmKHJhLmhhc093blByb3BlcnR5KGcpP2Z8fChmPVtdKTooZj1mfHxbXSkucHVzaChnLG51bGwpKTtmb3IoZyBpbiBkKXt2YXIgaD1kW2ddO2I9bnVsbCE9Yz9jW2ddOnZvaWQgMDtpZihkLmhhc093blByb3BlcnR5KGcpJiZoIT09YiYmKG51bGwhPWh8fG51bGwhPWIpKWlmKCJzdHlsZSI9PT1nKWlmKGIpe2ZvcihrIGluIGIpIWIuaGFzT3duUHJvcGVydHkoayl8fGgmJmguaGFzT3duUHJvcGVydHkoayl8fChhfHwoYT17fSksYVtrXT0iIik7Zm9yKGsgaW4gaCloLmhhc093blByb3BlcnR5KGspJiZiW2tdIT09aFtrXSYmKGF8fChhPXt9KSxhW2tdPWhba10pfWVsc2UgYXx8KGZ8fChmPVtdKSxmLnB1c2goZywKYSkpLGE9aDtlbHNlImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIj09PWc/KGg9aD9oLl9faHRtbDp2b2lkIDAsYj1iP2IuX19odG1sOnZvaWQgMCxudWxsIT1oJiZiIT09aCYmKGY9Znx8W10pLnB1c2goZywiIitoKSk6ImNoaWxkcmVuIj09PWc/Yj09PWh8fCJzdHJpbmciIT09dHlwZW9mIGgmJiJudW1iZXIiIT09dHlwZW9mIGh8fChmPWZ8fFtdKS5wdXNoKGcsIiIraCk6InN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyIhPT1nJiYic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIiE9PWcmJihyYS5oYXNPd25Qcm9wZXJ0eShnKT8obnVsbCE9aCYmYmEoZSxnKSxmfHxiPT09aHx8KGY9W10pKTooZj1mfHxbXSkucHVzaChnLGgpKX1hJiYoZj1mfHxbXSkucHVzaCgic3R5bGUiLGEpO3JldHVybiBmfWZ1bmN0aW9uIHVlKGEsYixjLGQsZSl7dmMoYyxkKTtkPXZjKGMsZSk7Zm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKz0yKXt2YXIgZz1iW2ZdLGs9YltmKzFdOyJzdHlsZSI9PT1nP29lKGEsCmssJGEpOiJkYW5nZXJvdXNseVNldElubmVySFRNTCI9PT1nP3djKGEsayk6ImNoaWxkcmVuIj09PWc/eGMoYSxrKTpkP251bGwhPWs/b2MoYSxnLGspOmEucmVtb3ZlQXR0cmlidXRlKGcpOm51bGwhPWs/bmMoYSxnLGspOmhlKGEsZyl9c3dpdGNoKGMpe2Nhc2UgImlucHV0IjpxYyhhLGUpO3VkKGEpO2JyZWFrO2Nhc2UgInRleHRhcmVhIjptZShhLGUpO2JyZWFrO2Nhc2UgInNlbGVjdCI6YS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZT12b2lkIDAsYj1hLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGUsYS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlPSEhZS5tdWx0aXBsZSxjPWUudmFsdWUsbnVsbCE9Yz9XKGEsISFlLm11bHRpcGxlLGMsITEpOmIhPT0hIWUubXVsdGlwbGUmJihudWxsIT1lLmRlZmF1bHRWYWx1ZT9XKGEsISFlLm11bHRpcGxlLGUuZGVmYXVsdFZhbHVlLCEwKTpXKGEsISFlLm11bHRpcGxlLGUubXVsdGlwbGU/W106IiIsITEpKX19ZnVuY3Rpb24gdmUoYSxiLApjLGQsZSl7c3dpdGNoKGIpe2Nhc2UgImlmcmFtZSI6Y2FzZSAib2JqZWN0IjpwKCJ0b3BMb2FkIiwibG9hZCIsYSk7YnJlYWs7Y2FzZSAidmlkZW8iOmNhc2UgImF1ZGlvIjpmb3IodmFyIGYgaW4gUilSLmhhc093blByb3BlcnR5KGYpJiZwKGYsUltmXSxhKTticmVhaztjYXNlICJzb3VyY2UiOnAoInRvcEVycm9yIiwiZXJyb3IiLGEpO2JyZWFrO2Nhc2UgImltZyI6Y2FzZSAiaW1hZ2UiOnAoInRvcEVycm9yIiwiZXJyb3IiLGEpO3AoInRvcExvYWQiLCJsb2FkIixhKTticmVhaztjYXNlICJmb3JtIjpwKCJ0b3BSZXNldCIsInJlc2V0IixhKTtwKCJ0b3BTdWJtaXQiLCJzdWJtaXQiLGEpO2JyZWFrO2Nhc2UgImRldGFpbHMiOnAoInRvcFRvZ2dsZSIsInRvZ2dsZSIsYSk7YnJlYWs7Y2FzZSAiaW5wdXQiOmllKGEsYyk7cCgidG9wSW52YWxpZCIsImludmFsaWQiLGEpO2JhKGUsIm9uQ2hhbmdlIik7YnJlYWs7Y2FzZSAic2VsZWN0IjprZShhLGMpO3AoInRvcEludmFsaWQiLCJpbnZhbGlkIiwKYSk7YmEoZSwib25DaGFuZ2UiKTticmVhaztjYXNlICJ0ZXh0YXJlYSI6bGUoYSxjKSxwKCJ0b3BJbnZhbGlkIiwiaW52YWxpZCIsYSksYmEoZSwib25DaGFuZ2UiKX11YyhiLGMsJGEpO2Q9bnVsbDtmb3IodmFyIGcgaW4gYyljLmhhc093blByb3BlcnR5KGcpJiYoZj1jW2ddLCJjaGlsZHJlbiI9PT1nPyJzdHJpbmciPT09dHlwZW9mIGY/YS50ZXh0Q29udGVudCE9PWYmJihkPVsiY2hpbGRyZW4iLGZdKToibnVtYmVyIj09PXR5cGVvZiBmJiZhLnRleHRDb250ZW50IT09IiIrZiYmKGQ9WyJjaGlsZHJlbiIsIiIrZl0pOnJhLmhhc093blByb3BlcnR5KGcpJiZudWxsIT1mJiZiYShlLGcpKTtzd2l0Y2goYil7Y2FzZSAiaW5wdXQiOmpiKGEpO2plKGEsYyk7YnJlYWs7Y2FzZSAidGV4dGFyZWEiOmpiKGEpO2I9YS50ZXh0Q29udGVudDtiPT09YS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSYmKGEudmFsdWU9Yik7YnJlYWs7Y2FzZSAic2VsZWN0IjpjYXNlICJvcHRpb24iOmJyZWFrOwpkZWZhdWx0OiJmdW5jdGlvbiI9PT10eXBlb2YgYy5vbkNsaWNrJiYoYS5vbmNsaWNrPUUpfXJldHVybiBkfWZ1bmN0aW9uIHdlKGEsYil7cmV0dXJuIGEubm9kZVZhbHVlIT09Yn1mdW5jdGlvbiB5YyhhKXtyZXR1cm4hKCFhfHwxIT09YS5ub2RlVHlwZSYmOSE9PWEubm9kZVR5cGUmJjExIT09YS5ub2RlVHlwZSYmKDghPT1hLm5vZGVUeXBlfHwiIHJlYWN0LW1vdW50LXBvaW50LXVuc3RhYmxlICIhPT1hLm5vZGVWYWx1ZSkpfWZ1bmN0aW9uIHpmKGEpe2E9YT85PT09YS5ub2RlVHlwZT9hLmRvY3VtZW50RWxlbWVudDphLmZpcnN0Q2hpbGQ6bnVsbDtyZXR1cm4hKCFhfHwxIT09YS5ub2RlVHlwZXx8IWEuaGFzQXR0cmlidXRlKCJkYXRhLXJlYWN0cm9vdCIpKX1mdW5jdGlvbiBBYihhLGIsYyxkLGUpe3ljKGMpP3ZvaWQgMDpsKCIyMDAiKTt2YXIgZj1jLl9yZWFjdFJvb3RDb250YWluZXI7aWYoZilGLnVwZGF0ZUNvbnRhaW5lcihiLGYsYSxlKTtlbHNle2Q9ZHx8emYoYyk7aWYoIWQpZm9yKGY9CnZvaWQgMDtmPWMubGFzdENoaWxkOyljLnJlbW92ZUNoaWxkKGYpO3ZhciBnPUYuY3JlYXRlQ29udGFpbmVyKGMsZCk7Zj1jLl9yZWFjdFJvb3RDb250YWluZXI9ZztGLnVuYmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24oKXtGLnVwZGF0ZUNvbnRhaW5lcihiLGcsYSxlKX0pfXJldHVybiBGLmdldFB1YmxpY1Jvb3RJbnN0YW5jZShmKX1mdW5jdGlvbiB4ZShhLGIpe3ZhciBjPTI8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsO3ljKGIpP3ZvaWQgMDpsKCIyMDAiKTtyZXR1cm4gdGYoYSxiLG51bGwsYyl9ZnVuY3Rpb24geWUoYSxiKXt0aGlzLl9yZWFjdFJvb3RDb250YWluZXI9Ri5jcmVhdGVDb250YWluZXIoYSxiKX1lYT92b2lkIDA6bCgiMjI3Iik7dmFyIFJjPXtjaGlsZHJlbjohMCxkYW5nZXJvdXNseVNldElubmVySFRNTDohMCxkZWZhdWx0VmFsdWU6ITAsZGVmYXVsdENoZWNrZWQ6ITAsaW5uZXJIVE1MOiEwLHN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZzohMCwKc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nOiEwLHN0eWxlOiEwfSx6ZT17TVVTVF9VU0VfUFJPUEVSVFk6MSxIQVNfQk9PTEVBTl9WQUxVRTo0LEhBU19OVU1FUklDX1ZBTFVFOjgsSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUU6MjQsSEFTX09WRVJMT0FERURfQk9PTEVBTl9WQUxVRTozMixIQVNfU1RSSU5HX0JPT0xFQU5fVkFMVUU6NjQsaW5qZWN0RE9NUHJvcGVydHlDb25maWc6ZnVuY3Rpb24oYSl7dmFyIGI9emUsYz1hLlByb3BlcnRpZXN8fHt9LGQ9YS5ET01BdHRyaWJ1dGVOYW1lc3BhY2VzfHx7fSxlPWEuRE9NQXR0cmlidXRlTmFtZXN8fHt9O2E9YS5ET01NdXRhdGlvbk1ldGhvZHN8fHt9O2Zvcih2YXIgZiBpbiBjKXtlYi5oYXNPd25Qcm9wZXJ0eShmKT9sKCI0OCIsZik6dm9pZCAwO3ZhciBnPWYudG9Mb3dlckNhc2UoKSxrPWNbZl07Zz17YXR0cmlidXRlTmFtZTpnLGF0dHJpYnV0ZU5hbWVzcGFjZTpudWxsLHByb3BlcnR5TmFtZTpmLG11dGF0aW9uTWV0aG9kOm51bGwsCm11c3RVc2VQcm9wZXJ0eTpvYShrLGIuTVVTVF9VU0VfUFJPUEVSVFkpLGhhc0Jvb2xlYW5WYWx1ZTpvYShrLGIuSEFTX0JPT0xFQU5fVkFMVUUpLGhhc051bWVyaWNWYWx1ZTpvYShrLGIuSEFTX05VTUVSSUNfVkFMVUUpLGhhc1Bvc2l0aXZlTnVtZXJpY1ZhbHVlOm9hKGssYi5IQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRSksaGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZTpvYShrLGIuSEFTX09WRVJMT0FERURfQk9PTEVBTl9WQUxVRSksaGFzU3RyaW5nQm9vbGVhblZhbHVlOm9hKGssYi5IQVNfU1RSSU5HX0JPT0xFQU5fVkFMVUUpfTsxPj1nLmhhc0Jvb2xlYW5WYWx1ZStnLmhhc051bWVyaWNWYWx1ZStnLmhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWU/dm9pZCAwOmwoIjUwIixmKTtlLmhhc093blByb3BlcnR5KGYpJiYoZy5hdHRyaWJ1dGVOYW1lPWVbZl0pO2QuaGFzT3duUHJvcGVydHkoZikmJihnLmF0dHJpYnV0ZU5hbWVzcGFjZT1kW2ZdKTthLmhhc093blByb3BlcnR5KGYpJiYKKGcubXV0YXRpb25NZXRob2Q9YVtmXSk7ZWJbZl09Z319fSxlYj17fSxYPXplLEJiPVguTVVTVF9VU0VfUFJPUEVSVFksdz1YLkhBU19CT09MRUFOX1ZBTFVFLEFlPVguSEFTX05VTUVSSUNfVkFMVUUsQ2I9WC5IQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRSxCZT1YLkhBU19PVkVSTE9BREVEX0JPT0xFQU5fVkFMVUUsRGI9WC5IQVNfU1RSSU5HX0JPT0xFQU5fVkFMVUUsQWY9e1Byb3BlcnRpZXM6e2FsbG93RnVsbFNjcmVlbjp3LGFzeW5jOncsYXV0b0ZvY3VzOncsYXV0b1BsYXk6dyxjYXB0dXJlOkJlLGNoZWNrZWQ6QmJ8dyxjb2xzOkNiLGNvbnRlbnRFZGl0YWJsZTpEYixjb250cm9sczp3LCJkZWZhdWx0Ijp3LGRlZmVyOncsZGlzYWJsZWQ6dyxkb3dubG9hZDpCZSxkcmFnZ2FibGU6RGIsZm9ybU5vVmFsaWRhdGU6dyxoaWRkZW46dyxsb29wOncsbXVsdGlwbGU6QmJ8dyxtdXRlZDpCYnx3LG5vVmFsaWRhdGU6dyxvcGVuOncscGxheXNJbmxpbmU6dyxyZWFkT25seTp3LHJlcXVpcmVkOncsCnJldmVyc2VkOncscm93czpDYixyb3dTcGFuOkFlLHNjb3BlZDp3LHNlYW1sZXNzOncsc2VsZWN0ZWQ6QmJ8dyxzaXplOkNiLHN0YXJ0OkFlLHNwYW46Q2Isc3BlbGxDaGVjazpEYixzdHlsZTowLHRhYkluZGV4OjAsaXRlbVNjb3BlOncsYWNjZXB0Q2hhcnNldDowLGNsYXNzTmFtZTowLGh0bWxGb3I6MCxodHRwRXF1aXY6MCx2YWx1ZTpEYn0sRE9NQXR0cmlidXRlTmFtZXM6e2FjY2VwdENoYXJzZXQ6ImFjY2VwdC1jaGFyc2V0IixjbGFzc05hbWU6ImNsYXNzIixodG1sRm9yOiJmb3IiLGh0dHBFcXVpdjoiaHR0cC1lcXVpdiJ9LERPTU11dGF0aW9uTWV0aG9kczp7dmFsdWU6ZnVuY3Rpb24oYSxiKXtpZihudWxsPT1iKXJldHVybiBhLnJlbW92ZUF0dHJpYnV0ZSgidmFsdWUiKTsibnVtYmVyIiE9PWEudHlwZXx8ITE9PT1hLmhhc0F0dHJpYnV0ZSgidmFsdWUiKT9hLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiK2IpOmEudmFsaWRpdHkmJiFhLnZhbGlkaXR5LmJhZElucHV0JiZhLm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PQphJiZhLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiK2IpfX19LHpjPVguSEFTX1NUUklOR19CT09MRUFOX1ZBTFVFLEFjPXtQcm9wZXJ0aWVzOnthdXRvUmV2ZXJzZTp6YyxleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkOnpjLHByZXNlcnZlQWxwaGE6emN9LERPTUF0dHJpYnV0ZU5hbWVzOnthdXRvUmV2ZXJzZToiYXV0b1JldmVyc2UiLGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQ6ImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQiLHByZXNlcnZlQWxwaGE6InByZXNlcnZlQWxwaGEifSxET01BdHRyaWJ1dGVOYW1lc3BhY2VzOnt4bGlua0FjdHVhdGU6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhsaW5rQXJjcm9sZToiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIseGxpbmtIcmVmOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIix4bGlua1JvbGU6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhsaW5rU2hvdzoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsCnhsaW5rVGl0bGU6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhsaW5rVHlwZToiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIseG1sQmFzZToiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxMYW5nOiJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLHhtbFNwYWNlOiJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UifX0sQmY9L1tcLVw6XShbYS16XSkvZyxDZj1mdW5jdGlvbihhKXtyZXR1cm4gYVsxXS50b1VwcGVyQ2FzZSgpfTsiYWNjZW50LWhlaWdodCBhbGlnbm1lbnQtYmFzZWxpbmUgYXJhYmljLWZvcm0gYmFzZWxpbmUtc2hpZnQgY2FwLWhlaWdodCBjbGlwLXBhdGggY2xpcC1ydWxlIGNvbG9yLWludGVycG9sYXRpb24gY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzIGNvbG9yLXByb2ZpbGUgY29sb3ItcmVuZGVyaW5nIGRvbWluYW50LWJhc2VsaW5lIGVuYWJsZS1iYWNrZ3JvdW5kIGZpbGwtb3BhY2l0eSBmaWxsLXJ1bGUgZmxvb2QtY29sb3IgZmxvb2Qtb3BhY2l0eSBmb250LWZhbWlseSBmb250LXNpemUgZm9udC1zaXplLWFkanVzdCBmb250LXN0cmV0Y2ggZm9udC1zdHlsZSBmb250LXZhcmlhbnQgZm9udC13ZWlnaHQgZ2x5cGgtbmFtZSBnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIGdseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsIGhvcml6LWFkdi14IGhvcml6LW9yaWdpbi14IGltYWdlLXJlbmRlcmluZyBsZXR0ZXItc3BhY2luZyBsaWdodGluZy1jb2xvciBtYXJrZXItZW5kIG1hcmtlci1taWQgbWFya2VyLXN0YXJ0IG92ZXJsaW5lLXBvc2l0aW9uIG92ZXJsaW5lLXRoaWNrbmVzcyBwYWludC1vcmRlciBwYW5vc2UtMSBwb2ludGVyLWV2ZW50cyByZW5kZXJpbmctaW50ZW50IHNoYXBlLXJlbmRlcmluZyBzdG9wLWNvbG9yIHN0b3Atb3BhY2l0eSBzdHJpa2V0aHJvdWdoLXBvc2l0aW9uIHN0cmlrZXRocm91Z2gtdGhpY2tuZXNzIHN0cm9rZS1kYXNoYXJyYXkgc3Ryb2tlLWRhc2hvZmZzZXQgc3Ryb2tlLWxpbmVjYXAgc3Ryb2tlLWxpbmVqb2luIHN0cm9rZS1taXRlcmxpbWl0IHN0cm9rZS1vcGFjaXR5IHN0cm9rZS13aWR0aCB0ZXh0LWFuY2hvciB0ZXh0LWRlY29yYXRpb24gdGV4dC1yZW5kZXJpbmcgdW5kZXJsaW5lLXBvc2l0aW9uIHVuZGVybGluZS10aGlja25lc3MgdW5pY29kZS1iaWRpIHVuaWNvZGUtcmFuZ2UgdW5pdHMtcGVyLWVtIHYtYWxwaGFiZXRpYyB2LWhhbmdpbmcgdi1pZGVvZ3JhcGhpYyB2LW1hdGhlbWF0aWNhbCB2ZWN0b3ItZWZmZWN0IHZlcnQtYWR2LXkgdmVydC1vcmlnaW4teCB2ZXJ0LW9yaWdpbi15IHdvcmQtc3BhY2luZyB3cml0aW5nLW1vZGUgeC1oZWlnaHQgeGxpbms6YWN0dWF0ZSB4bGluazphcmNyb2xlIHhsaW5rOmhyZWYgeGxpbms6cm9sZSB4bGluazpzaG93IHhsaW5rOnRpdGxlIHhsaW5rOnR5cGUgeG1sOmJhc2UgeG1sbnM6eGxpbmsgeG1sOmxhbmcgeG1sOnNwYWNlIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9CmEucmVwbGFjZShCZixDZik7QWMuUHJvcGVydGllc1tiXT0wO0FjLkRPTUF0dHJpYnV0ZU5hbWVzW2JdPWF9KTtYLmluamVjdERPTVByb3BlcnR5Q29uZmlnKEFmKTtYLmluamVjdERPTVByb3BlcnR5Q29uZmlnKEFjKTt2YXIgdT17X2NhdWdodEVycm9yOm51bGwsX2hhc0NhdWdodEVycm9yOiExLF9yZXRocm93RXJyb3I6bnVsbCxfaGFzUmV0aHJvd0Vycm9yOiExLGluamVjdGlvbjp7aW5qZWN0RXJyb3JVdGlsczpmdW5jdGlvbihhKXsiZnVuY3Rpb24iIT09dHlwZW9mIGEuaW52b2tlR3VhcmRlZENhbGxiYWNrP2woIjE5NyIpOnZvaWQgMDtDZT1hLmludm9rZUd1YXJkZWRDYWxsYmFja319LGludm9rZUd1YXJkZWRDYWxsYmFjazpmdW5jdGlvbihhLGIsYyxkLGUsZixnLGssaCl7Q2UuYXBwbHkodSxhcmd1bWVudHMpfSxpbnZva2VHdWFyZGVkQ2FsbGJhY2tBbmRDYXRjaEZpcnN0RXJyb3I6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxrLGgpe3UuaW52b2tlR3VhcmRlZENhbGxiYWNrLmFwcGx5KHRoaXMsCmFyZ3VtZW50cyk7aWYodS5oYXNDYXVnaHRFcnJvcigpKXt2YXIgbD11LmNsZWFyQ2F1Z2h0RXJyb3IoKTt1Ll9oYXNSZXRocm93RXJyb3J8fCh1Ll9oYXNSZXRocm93RXJyb3I9ITAsdS5fcmV0aHJvd0Vycm9yPWwpfX0scmV0aHJvd0NhdWdodEVycm9yOmZ1bmN0aW9uKCl7cmV0dXJuIERmLmFwcGx5KHUsYXJndW1lbnRzKX0saGFzQ2F1Z2h0RXJyb3I6ZnVuY3Rpb24oKXtyZXR1cm4gdS5faGFzQ2F1Z2h0RXJyb3J9LGNsZWFyQ2F1Z2h0RXJyb3I6ZnVuY3Rpb24oKXtpZih1Ll9oYXNDYXVnaHRFcnJvcil7dmFyIGE9dS5fY2F1Z2h0RXJyb3I7dS5fY2F1Z2h0RXJyb3I9bnVsbDt1Ll9oYXNDYXVnaHRFcnJvcj0hMTtyZXR1cm4gYX1sKCIxOTgiKX19LENlPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsayxoKXt1Ll9oYXNDYXVnaHRFcnJvcj0hMTt1Ll9jYXVnaHRFcnJvcj1udWxsO3ZhciBsPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywzKTt0cnl7Yi5hcHBseShjLApsKX1jYXRjaChBKXt1Ll9jYXVnaHRFcnJvcj1BLHUuX2hhc0NhdWdodEVycm9yPSEwfX0sRGY9ZnVuY3Rpb24oKXtpZih1Ll9oYXNSZXRocm93RXJyb3Ipe3ZhciBhPXUuX3JldGhyb3dFcnJvcjt1Ll9yZXRocm93RXJyb3I9bnVsbDt1Ll9oYXNSZXRocm93RXJyb3I9ITE7dGhyb3cgYTt9fSxmYj1udWxsLHBhPXt9LHFhPVtdLEtiPXt9LHJhPXt9LGdiPXt9LEVmPU9iamVjdC5mcmVlemUoe3BsdWdpbnM6cWEsZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzOktiLHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzOnJhLHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXM6Z2IscG9zc2libGVSZWdpc3RyYXRpb25OYW1lczpudWxsLGluamVjdEV2ZW50UGx1Z2luT3JkZXI6VWMsaW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lOlZjfSksdmE9ZnVuY3Rpb24oKXt9O3ZhLnRoYXRSZXR1cm5zPWhiO3ZhLnRoYXRSZXR1cm5zRmFsc2U9aGIoITEpO3ZhLnRoYXRSZXR1cm5zVHJ1ZT1oYighMCk7dmEudGhhdFJldHVybnNOdWxsPQpoYihudWxsKTt2YS50aGF0UmV0dXJuc1RoaXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307dmEudGhhdFJldHVybnNBcmd1bWVudD1mdW5jdGlvbihhKXtyZXR1cm4gYX07dmFyIEU9dmEsTWI9bnVsbCxvZD1udWxsLFhjPW51bGwsc2E9bnVsbCxEZT1mdW5jdGlvbihhLGIpe2lmKGEpe3ZhciBjPWEuX2Rpc3BhdGNoTGlzdGVuZXJzLGQ9YS5fZGlzcGF0Y2hJbnN0YW5jZXM7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGU9MDtlPGMubGVuZ3RoJiYhYS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpO2UrKylXYyhhLGIsY1tlXSxkW2VdKTtlbHNlIGMmJldjKGEsYixjLGQpO2EuX2Rpc3BhdGNoTGlzdGVuZXJzPW51bGw7YS5fZGlzcGF0Y2hJbnN0YW5jZXM9bnVsbDthLmlzUGVyc2lzdGVudCgpfHxhLmNvbnN0cnVjdG9yLnJlbGVhc2UoYSl9fSxTZT1mdW5jdGlvbihhKXtyZXR1cm4gRGUoYSwhMCl9LFRlPWZ1bmN0aW9uKGEpe3JldHVybiBEZShhLCExKX0sQmM9e2luamVjdEV2ZW50UGx1Z2luT3JkZXI6VWMsCmluamVjdEV2ZW50UGx1Z2luc0J5TmFtZTpWY30sRmY9T2JqZWN0LmZyZWV6ZSh7aW5qZWN0aW9uOkJjLGdldExpc3RlbmVyOkxiLGV4dHJhY3RFdmVudHM6WWMsZW5xdWV1ZUV2ZW50czpOYixwcm9jZXNzRXZlbnRRdWV1ZTpPYn0pLEVlPU1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpLFA9Il9fcmVhY3RJbnRlcm5hbEluc3RhbmNlJCIrRWUsaGE9Il9fcmVhY3RFdmVudEhhbmRsZXJzJCIrRWUsRmU9T2JqZWN0LmZyZWV6ZSh7cHJlY2FjaGVGaWJlck5vZGU6ZnVuY3Rpb24oYSxiKXtiW1BdPWF9LGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlOlksZ2V0SW5zdGFuY2VGcm9tTm9kZTpmdW5jdGlvbihhKXthPWFbUF07cmV0dXJuIWF8fDUhPT1hLnRhZyYmNiE9PWEudGFnP251bGw6YX0sZ2V0Tm9kZUZyb21JbnN0YW5jZTp5YSxnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlOlpjLHVwZGF0ZUZpYmVyUHJvcHM6ZnVuY3Rpb24oYSxiKXthW2hhXT1ifX0pLEdmPU9iamVjdC5mcmVlemUoe2FjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXM6emEsCmFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXNTa2lwVGFyZ2V0OmZ1bmN0aW9uKGEpe2ZhKGEsVmUpfSxhY2N1bXVsYXRlRW50ZXJMZWF2ZURpc3BhdGNoZXM6YmQsYWNjdW11bGF0ZURpcmVjdERpc3BhdGNoZXM6ZnVuY3Rpb24oYSl7ZmEoYSxXZSl9fSksRWI9ISgidW5kZWZpbmVkIj09PXR5cGVvZiB3aW5kb3d8fCF3aW5kb3cuZG9jdW1lbnR8fCF3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCksSD17Y2FuVXNlRE9NOkViLGNhblVzZVdvcmtlcnM6InVuZGVmaW5lZCIhPT10eXBlb2YgV29ya2VyLGNhblVzZUV2ZW50TGlzdGVuZXJzOkViJiYhKCF3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciYmIXdpbmRvdy5hdHRhY2hFdmVudCksY2FuVXNlVmlld3BvcnQ6RWImJiEhd2luZG93LnNjcmVlbixpc0luV29ya2VyOiFFYn0sUWI9bnVsbCxHPXtfcm9vdDpudWxsLF9zdGFydFRleHQ6bnVsbCxfZmFsbGJhY2tUZXh0Om51bGx9LEI9ZWEuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQuYXNzaWduLApHZT0iZGlzcGF0Y2hDb25maWcgX3RhcmdldEluc3QgbmF0aXZlRXZlbnQgaXNEZWZhdWx0UHJldmVudGVkIGlzUHJvcGFnYXRpb25TdG9wcGVkIF9kaXNwYXRjaExpc3RlbmVycyBfZGlzcGF0Y2hJbnN0YW5jZXMiLnNwbGl0KCIgIiksSGY9e3R5cGU6bnVsbCx0YXJnZXQ6bnVsbCxjdXJyZW50VGFyZ2V0OkUudGhhdFJldHVybnNOdWxsLGV2ZW50UGhhc2U6bnVsbCxidWJibGVzOm51bGwsY2FuY2VsYWJsZTpudWxsLHRpbWVTdGFtcDpmdW5jdGlvbihhKXtyZXR1cm4gYS50aW1lU3RhbXB8fERhdGUubm93KCl9LGRlZmF1bHRQcmV2ZW50ZWQ6bnVsbCxpc1RydXN0ZWQ6bnVsbH07QihuLnByb3RvdHlwZSx7cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITA7dmFyIGE9dGhpcy5uYXRpdmVFdmVudDthJiYoYS5wcmV2ZW50RGVmYXVsdD9hLnByZXZlbnREZWZhdWx0KCk6InVua25vd24iIT09dHlwZW9mIGEucmV0dXJuVmFsdWUmJihhLnJldHVyblZhbHVlPQohMSksdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9RS50aGF0UmV0dXJuc1RydWUpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm5hdGl2ZUV2ZW50O2EmJihhLnN0b3BQcm9wYWdhdGlvbj9hLnN0b3BQcm9wYWdhdGlvbigpOiJ1bmtub3duIiE9PXR5cGVvZiBhLmNhbmNlbEJ1YmJsZSYmKGEuY2FuY2VsQnViYmxlPSEwKSx0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPUUudGhhdFJldHVybnNUcnVlKX0scGVyc2lzdDpmdW5jdGlvbigpe3RoaXMuaXNQZXJzaXN0ZW50PUUudGhhdFJldHVybnNUcnVlfSxpc1BlcnNpc3RlbnQ6RS50aGF0UmV0dXJuc0ZhbHNlLGRlc3RydWN0b3I6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNvbnN0cnVjdG9yLkludGVyZmFjZSxiO2ZvcihiIGluIGEpdGhpc1tiXT1udWxsO2ZvcihhPTA7YTxHZS5sZW5ndGg7YSsrKXRoaXNbR2VbYV1dPW51bGx9fSk7bi5JbnRlcmZhY2U9SGY7bi5hdWdtZW50Q2xhc3M9ZnVuY3Rpb24oYSxiKXt2YXIgYz0KZnVuY3Rpb24oKXt9O2MucHJvdG90eXBlPXRoaXMucHJvdG90eXBlO2M9bmV3IGM7QihjLGEucHJvdG90eXBlKTthLnByb3RvdHlwZT1jO2EucHJvdG90eXBlLmNvbnN0cnVjdG9yPWE7YS5JbnRlcmZhY2U9Qih7fSx0aGlzLkludGVyZmFjZSxiKTthLmF1Z21lbnRDbGFzcz10aGlzLmF1Z21lbnRDbGFzcztmZChhKX07ZmQobik7bi5hdWdtZW50Q2xhc3MoZ2Qse2RhdGE6bnVsbH0pO24uYXVnbWVudENsYXNzKGhkLHtkYXRhOm51bGx9KTt2YXIgJGU9WzksMTMsMjcsMzJdLFJiPUguY2FuVXNlRE9NJiYiQ29tcG9zaXRpb25FdmVudCJpbiB3aW5kb3csYWI9bnVsbDtILmNhblVzZURPTSYmImRvY3VtZW50TW9kZSJpbiBkb2N1bWVudCYmKGFiPWRvY3VtZW50LmRvY3VtZW50TW9kZSk7dmFyIElmPUguY2FuVXNlRE9NJiYiVGV4dEV2ZW50ImluIHdpbmRvdyYmIWFiJiYhWmUoKSxtZD1ILmNhblVzZURPTSYmKCFSYnx8YWImJjg8YWImJjExPj1hYiksbGQ9U3RyaW5nLmZyb21DaGFyQ29kZSgzMiksCmNhPXtiZWZvcmVJbnB1dDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Im9uQmVmb3JlSW5wdXQiLGNhcHR1cmVkOiJvbkJlZm9yZUlucHV0Q2FwdHVyZSJ9LGRlcGVuZGVuY2llczpbInRvcENvbXBvc2l0aW9uRW5kIiwidG9wS2V5UHJlc3MiLCJ0b3BUZXh0SW5wdXQiLCJ0b3BQYXN0ZSJdfSxjb21wb3NpdGlvbkVuZDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Im9uQ29tcG9zaXRpb25FbmQiLGNhcHR1cmVkOiJvbkNvbXBvc2l0aW9uRW5kQ2FwdHVyZSJ9LGRlcGVuZGVuY2llczoidG9wQmx1ciB0b3BDb21wb3NpdGlvbkVuZCB0b3BLZXlEb3duIHRvcEtleVByZXNzIHRvcEtleVVwIHRvcE1vdXNlRG93biIuc3BsaXQoIiAiKX0sY29tcG9zaXRpb25TdGFydDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Im9uQ29tcG9zaXRpb25TdGFydCIsY2FwdHVyZWQ6Im9uQ29tcG9zaXRpb25TdGFydENhcHR1cmUifSxkZXBlbmRlbmNpZXM6InRvcEJsdXIgdG9wQ29tcG9zaXRpb25TdGFydCB0b3BLZXlEb3duIHRvcEtleVByZXNzIHRvcEtleVVwIHRvcE1vdXNlRG93biIuc3BsaXQoIiAiKX0sCmNvbXBvc2l0aW9uVXBkYXRlOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDoib25Db21wb3NpdGlvblVwZGF0ZSIsY2FwdHVyZWQ6Im9uQ29tcG9zaXRpb25VcGRhdGVDYXB0dXJlIn0sZGVwZW5kZW5jaWVzOiJ0b3BCbHVyIHRvcENvbXBvc2l0aW9uVXBkYXRlIHRvcEtleURvd24gdG9wS2V5UHJlc3MgdG9wS2V5VXAgdG9wTW91c2VEb3duIi5zcGxpdCgiICIpfX0sa2Q9ITEsQWE9ITEsSmY9e2V2ZW50VHlwZXM6Y2EsZXh0cmFjdEV2ZW50czpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZTtpZihSYiliOntzd2l0Y2goYSl7Y2FzZSAidG9wQ29tcG9zaXRpb25TdGFydCI6dmFyIGY9Y2EuY29tcG9zaXRpb25TdGFydDticmVhayBiO2Nhc2UgInRvcENvbXBvc2l0aW9uRW5kIjpmPWNhLmNvbXBvc2l0aW9uRW5kO2JyZWFrIGI7Y2FzZSAidG9wQ29tcG9zaXRpb25VcGRhdGUiOmY9Y2EuY29tcG9zaXRpb25VcGRhdGU7YnJlYWsgYn1mPXZvaWQgMH1lbHNlIEFhP2lkKGEsYykmJgooZj1jYS5jb21wb3NpdGlvbkVuZCk6InRvcEtleURvd24iPT09YSYmMjI5PT09Yy5rZXlDb2RlJiYoZj1jYS5jb21wb3NpdGlvblN0YXJ0KTtmPyhtZCYmKEFhfHxmIT09Y2EuY29tcG9zaXRpb25TdGFydD9mPT09Y2EuY29tcG9zaXRpb25FbmQmJkFhJiYoZT1kZCgpKTooRy5fcm9vdD1kLEcuX3N0YXJ0VGV4dD1lZCgpLEFhPSEwKSksZj1nZC5nZXRQb29sZWQoZixiLGMsZCksZT9mLmRhdGE9ZTooZT1qZChjKSxudWxsIT09ZSYmKGYuZGF0YT1lKSksemEoZiksZT1mKTplPW51bGw7KGE9SWY/YWYoYSxjKTpiZihhLGMpKT8oYj1oZC5nZXRQb29sZWQoY2EuYmVmb3JlSW5wdXQsYixjLGQpLGIuZGF0YT1hLHphKGIpKTpiPW51bGw7cmV0dXJuW2UsYl19fSxpYj1udWxsLERhPW51bGwsaWE9bnVsbCxIZT17aW5qZWN0RmliZXJDb250cm9sbGVkSG9zdENvbXBvbmVudDpmdW5jdGlvbihhKXtpYj1hfX0sS2Y9T2JqZWN0LmZyZWV6ZSh7aW5qZWN0aW9uOkhlLGVucXVldWVTdGF0ZVJlc3RvcmU6cGQsCnJlc3RvcmVTdGF0ZUlmTmVlZGVkOnFkfSksVWI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYShiKX0sVGI9ITEsY2Y9e2NvbG9yOiEwLGRhdGU6ITAsZGF0ZXRpbWU6ITAsImRhdGV0aW1lLWxvY2FsIjohMCxlbWFpbDohMCxtb250aDohMCxudW1iZXI6ITAscGFzc3dvcmQ6ITAscmFuZ2U6ITAsc2VhcmNoOiEwLHRlbDohMCx0ZXh0OiEwLHRpbWU6ITAsdXJsOiEwLHdlZWs6ITB9LHNkO0guY2FuVXNlRE9NJiYoc2Q9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24mJmRvY3VtZW50LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUmJiEwIT09ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZSgiIiwiIikpO3ZhciB3ZD17Y2hhbmdlOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDoib25DaGFuZ2UiLGNhcHR1cmVkOiJvbkNoYW5nZUNhcHR1cmUifSxkZXBlbmRlbmNpZXM6InRvcEJsdXIgdG9wQ2hhbmdlIHRvcENsaWNrIHRvcEZvY3VzIHRvcElucHV0IHRvcEtleURvd24gdG9wS2V5VXAgdG9wU2VsZWN0aW9uQ2hhbmdlIi5zcGxpdCgiICIpfX0sCkthPW51bGwsTGE9bnVsbCxDYz0hMTtILmNhblVzZURPTSYmKENjPUVhKCJpbnB1dCIpJiYoIWRvY3VtZW50LmRvY3VtZW50TW9kZXx8OTxkb2N1bWVudC5kb2N1bWVudE1vZGUpKTt2YXIgTGY9e2V2ZW50VHlwZXM6d2QsX2lzSW5wdXRFdmVudFN1cHBvcnRlZDpDYyxleHRyYWN0RXZlbnRzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWI/eWEoYik6d2luZG93LGY9ZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKCJzZWxlY3QiPT09Znx8ImlucHV0Ij09PWYmJiJmaWxlIj09PWUudHlwZSl2YXIgZz1mZjtlbHNlIGlmKHJkKGUpKWlmKENjKWc9a2Y7ZWxzZXtnPWhmO3ZhciBrPWdmfWVsc2UgZj1lLm5vZGVOYW1lLCFmfHwiaW5wdXQiIT09Zi50b0xvd2VyQ2FzZSgpfHwiY2hlY2tib3giIT09ZS50eXBlJiYicmFkaW8iIT09ZS50eXBlfHwoZz1qZik7aWYoZyYmKGc9ZyhhLGIpKSlyZXR1cm4gdmQoZyxjLGQpO2smJmsoYSxlLGIpOyJ0b3BCbHVyIj09PWEmJm51bGwhPQpiJiYoYT1iLl93cmFwcGVyU3RhdGV8fGUuX3dyYXBwZXJTdGF0ZSkmJmEuY29udHJvbGxlZCYmIm51bWJlciI9PT1lLnR5cGUmJihhPSIiK2UudmFsdWUsZS5nZXRBdHRyaWJ1dGUoInZhbHVlIikhPT1hJiZlLnNldEF0dHJpYnV0ZSgidmFsdWUiLGEpKX19O24uYXVnbWVudENsYXNzKGphLHt2aWV3Om51bGwsZGV0YWlsOm51bGx9KTt2YXIgbWY9e0FsdDoiYWx0S2V5IixDb250cm9sOiJjdHJsS2V5IixNZXRhOiJtZXRhS2V5IixTaGlmdDoic2hpZnRLZXkifTtqYS5hdWdtZW50Q2xhc3MoVSx7c2NyZWVuWDpudWxsLHNjcmVlblk6bnVsbCxjbGllbnRYOm51bGwsY2xpZW50WTpudWxsLHBhZ2VYOm51bGwscGFnZVk6bnVsbCxjdHJsS2V5Om51bGwsc2hpZnRLZXk6bnVsbCxhbHRLZXk6bnVsbCxtZXRhS2V5Om51bGwsZ2V0TW9kaWZpZXJTdGF0ZTpXYixidXR0b246bnVsbCxidXR0b25zOm51bGwscmVsYXRlZFRhcmdldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZWxhdGVkVGFyZ2V0fHwKKGEuZnJvbUVsZW1lbnQ9PT1hLnNyY0VsZW1lbnQ/YS50b0VsZW1lbnQ6YS5mcm9tRWxlbWVudCl9fSk7dmFyIERjPXttb3VzZUVudGVyOntyZWdpc3RyYXRpb25OYW1lOiJvbk1vdXNlRW50ZXIiLGRlcGVuZGVuY2llczpbInRvcE1vdXNlT3V0IiwidG9wTW91c2VPdmVyIl19LG1vdXNlTGVhdmU6e3JlZ2lzdHJhdGlvbk5hbWU6Im9uTW91c2VMZWF2ZSIsZGVwZW5kZW5jaWVzOlsidG9wTW91c2VPdXQiLCJ0b3BNb3VzZU92ZXIiXX19LE1mPXtldmVudFR5cGVzOkRjLGV4dHJhY3RFdmVudHM6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoInRvcE1vdXNlT3ZlciI9PT1hJiYoYy5yZWxhdGVkVGFyZ2V0fHxjLmZyb21FbGVtZW50KXx8InRvcE1vdXNlT3V0IiE9PWEmJiJ0b3BNb3VzZU92ZXIiIT09YSlyZXR1cm4gbnVsbDt2YXIgZT1kLndpbmRvdz09PWQ/ZDooZT1kLm93bmVyRG9jdW1lbnQpP2UuZGVmYXVsdFZpZXd8fGUucGFyZW50V2luZG93OndpbmRvdzsidG9wTW91c2VPdXQiPT09YT8oYT0KYixiPShiPWMucmVsYXRlZFRhcmdldHx8Yy50b0VsZW1lbnQpP1koYik6bnVsbCk6YT1udWxsO2lmKGE9PT1iKXJldHVybiBudWxsO3ZhciBmPW51bGw9PWE/ZTp5YShhKTtlPW51bGw9PWI/ZTp5YShiKTt2YXIgZz1VLmdldFBvb2xlZChEYy5tb3VzZUxlYXZlLGEsYyxkKTtnLnR5cGU9Im1vdXNlbGVhdmUiO2cudGFyZ2V0PWY7Zy5yZWxhdGVkVGFyZ2V0PWU7Yz1VLmdldFBvb2xlZChEYy5tb3VzZUVudGVyLGIsYyxkKTtjLnR5cGU9Im1vdXNlZW50ZXIiO2MudGFyZ2V0PWU7Yy5yZWxhdGVkVGFyZ2V0PWY7YmQoZyxjLGEsYik7cmV0dXJuW2csY119fSxiYj1lYS5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRC5SZWFjdEN1cnJlbnRPd25lcixCZD17bGlzdGVuOmZ1bmN0aW9uKGEsYixjKXtpZihhLmFkZEV2ZW50TGlzdGVuZXIpcmV0dXJuIGEuYWRkRXZlbnRMaXN0ZW5lcihiLGMsITEpLHtyZW1vdmU6ZnVuY3Rpb24oKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoYiwKYywhMSl9fTtpZihhLmF0dGFjaEV2ZW50KXJldHVybiBhLmF0dGFjaEV2ZW50KCJvbiIrYixjKSx7cmVtb3ZlOmZ1bmN0aW9uKCl7YS5kZXRhY2hFdmVudCgib24iK2IsYyl9fX0sY2FwdHVyZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGEuYWRkRXZlbnRMaXN0ZW5lcj8oYS5hZGRFdmVudExpc3RlbmVyKGIsYywhMCkse3JlbW92ZTpmdW5jdGlvbigpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITApfX0pOntyZW1vdmU6RX19LHJlZ2lzdGVyRGVmYXVsdDpmdW5jdGlvbigpe319LG1iPVtdLE9hPSEwLGxiPXZvaWQgMCxOZj1PYmplY3QuZnJlZXplKHtnZXQgX2VuYWJsZWQoKXtyZXR1cm4gT2F9LGdldCBfaGFuZGxlVG9wTGV2ZWwoKXtyZXR1cm4gbGJ9LHNldEhhbmRsZVRvcExldmVsOmZ1bmN0aW9uKGEpe2xiPWF9LHNldEVuYWJsZWQ6WGIsaXNFbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIE9hfSx0cmFwQnViYmxlZEV2ZW50OnAsdHJhcENhcHR1cmVkRXZlbnQ6VixkaXNwYXRjaEV2ZW50OllifSksClo9e2FuaW1hdGlvbmVuZDpuYigiQW5pbWF0aW9uIiwiQW5pbWF0aW9uRW5kIiksYW5pbWF0aW9uaXRlcmF0aW9uOm5iKCJBbmltYXRpb24iLCJBbmltYXRpb25JdGVyYXRpb24iKSxhbmltYXRpb25zdGFydDpuYigiQW5pbWF0aW9uIiwiQW5pbWF0aW9uU3RhcnQiKSx0cmFuc2l0aW9uZW5kOm5iKCJUcmFuc2l0aW9uIiwiVHJhbnNpdGlvbkVuZCIpfSxaYj17fSxDZD17fTtILmNhblVzZURPTSYmKENkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLCJBbmltYXRpb25FdmVudCJpbiB3aW5kb3d8fChkZWxldGUgWi5hbmltYXRpb25lbmQuYW5pbWF0aW9uLGRlbGV0ZSBaLmFuaW1hdGlvbml0ZXJhdGlvbi5hbmltYXRpb24sZGVsZXRlIFouYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uKSwiVHJhbnNpdGlvbkV2ZW50ImluIHdpbmRvd3x8ZGVsZXRlIFoudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uKTt2YXIgcGU9e3RvcEFib3J0OiJhYm9ydCIsdG9wQW5pbWF0aW9uRW5kOm9iKCJhbmltYXRpb25lbmQiKXx8CiJhbmltYXRpb25lbmQiLHRvcEFuaW1hdGlvbkl0ZXJhdGlvbjpvYigiYW5pbWF0aW9uaXRlcmF0aW9uIil8fCJhbmltYXRpb25pdGVyYXRpb24iLHRvcEFuaW1hdGlvblN0YXJ0Om9iKCJhbmltYXRpb25zdGFydCIpfHwiYW5pbWF0aW9uc3RhcnQiLHRvcEJsdXI6ImJsdXIiLHRvcENhbmNlbDoiY2FuY2VsIix0b3BDYW5QbGF5OiJjYW5wbGF5Iix0b3BDYW5QbGF5VGhyb3VnaDoiY2FucGxheXRocm91Z2giLHRvcENoYW5nZToiY2hhbmdlIix0b3BDbGljazoiY2xpY2siLHRvcENsb3NlOiJjbG9zZSIsdG9wQ29tcG9zaXRpb25FbmQ6ImNvbXBvc2l0aW9uZW5kIix0b3BDb21wb3NpdGlvblN0YXJ0OiJjb21wb3NpdGlvbnN0YXJ0Iix0b3BDb21wb3NpdGlvblVwZGF0ZToiY29tcG9zaXRpb251cGRhdGUiLHRvcENvbnRleHRNZW51OiJjb250ZXh0bWVudSIsdG9wQ29weToiY29weSIsdG9wQ3V0OiJjdXQiLHRvcERvdWJsZUNsaWNrOiJkYmxjbGljayIsdG9wRHJhZzoiZHJhZyIsdG9wRHJhZ0VuZDoiZHJhZ2VuZCIsCnRvcERyYWdFbnRlcjoiZHJhZ2VudGVyIix0b3BEcmFnRXhpdDoiZHJhZ2V4aXQiLHRvcERyYWdMZWF2ZToiZHJhZ2xlYXZlIix0b3BEcmFnT3ZlcjoiZHJhZ292ZXIiLHRvcERyYWdTdGFydDoiZHJhZ3N0YXJ0Iix0b3BEcm9wOiJkcm9wIix0b3BEdXJhdGlvbkNoYW5nZToiZHVyYXRpb25jaGFuZ2UiLHRvcEVtcHRpZWQ6ImVtcHRpZWQiLHRvcEVuY3J5cHRlZDoiZW5jcnlwdGVkIix0b3BFbmRlZDoiZW5kZWQiLHRvcEVycm9yOiJlcnJvciIsdG9wRm9jdXM6ImZvY3VzIix0b3BJbnB1dDoiaW5wdXQiLHRvcEtleURvd246ImtleWRvd24iLHRvcEtleVByZXNzOiJrZXlwcmVzcyIsdG9wS2V5VXA6ImtleXVwIix0b3BMb2FkZWREYXRhOiJsb2FkZWRkYXRhIix0b3BMb2FkOiJsb2FkIix0b3BMb2FkZWRNZXRhZGF0YToibG9hZGVkbWV0YWRhdGEiLHRvcExvYWRTdGFydDoibG9hZHN0YXJ0Iix0b3BNb3VzZURvd246Im1vdXNlZG93biIsdG9wTW91c2VNb3ZlOiJtb3VzZW1vdmUiLHRvcE1vdXNlT3V0OiJtb3VzZW91dCIsCnRvcE1vdXNlT3ZlcjoibW91c2VvdmVyIix0b3BNb3VzZVVwOiJtb3VzZXVwIix0b3BQYXN0ZToicGFzdGUiLHRvcFBhdXNlOiJwYXVzZSIsdG9wUGxheToicGxheSIsdG9wUGxheWluZzoicGxheWluZyIsdG9wUHJvZ3Jlc3M6InByb2dyZXNzIix0b3BSYXRlQ2hhbmdlOiJyYXRlY2hhbmdlIix0b3BTY3JvbGw6InNjcm9sbCIsdG9wU2Vla2VkOiJzZWVrZWQiLHRvcFNlZWtpbmc6InNlZWtpbmciLHRvcFNlbGVjdGlvbkNoYW5nZToic2VsZWN0aW9uY2hhbmdlIix0b3BTdGFsbGVkOiJzdGFsbGVkIix0b3BTdXNwZW5kOiJzdXNwZW5kIix0b3BUZXh0SW5wdXQ6InRleHRJbnB1dCIsdG9wVGltZVVwZGF0ZToidGltZXVwZGF0ZSIsdG9wVG9nZ2xlOiJ0b2dnbGUiLHRvcFRvdWNoQ2FuY2VsOiJ0b3VjaGNhbmNlbCIsdG9wVG91Y2hFbmQ6InRvdWNoZW5kIix0b3BUb3VjaE1vdmU6InRvdWNobW92ZSIsdG9wVG91Y2hTdGFydDoidG91Y2hzdGFydCIsdG9wVHJhbnNpdGlvbkVuZDpvYigidHJhbnNpdGlvbmVuZCIpfHwKInRyYW5zaXRpb25lbmQiLHRvcFZvbHVtZUNoYW5nZToidm9sdW1lY2hhbmdlIix0b3BXYWl0aW5nOiJ3YWl0aW5nIix0b3BXaGVlbDoid2hlZWwifSxFZD17fSxyZj0wLHBiPSJfcmVhY3RMaXN0ZW5lcnNJRCIrKCIiK01hdGgucmFuZG9tKCkpLnNsaWNlKDIpLGJjPWZ1bmN0aW9uKGEpe2E9YXx8KCJ1bmRlZmluZWQiIT09dHlwZW9mIGRvY3VtZW50P2RvY3VtZW50OnZvaWQgMCk7aWYoInVuZGVmaW5lZCI9PT10eXBlb2YgYSlyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIGEuYWN0aXZlRWxlbWVudHx8YS5ib2R5fWNhdGNoKGIpe3JldHVybiBhLmJvZHl9fSxPZj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGNjPWZ1bmN0aW9uKGEsYil7aWYoRmQoYSxiKSlyZXR1cm4hMDtpZigib2JqZWN0IiE9PXR5cGVvZiBhfHxudWxsPT09YXx8Im9iamVjdCIhPT10eXBlb2YgYnx8bnVsbD09PWIpcmV0dXJuITE7dmFyIGM9T2JqZWN0LmtleXMoYSksZD1PYmplY3Qua2V5cyhiKTtpZihjLmxlbmd0aCE9PQpkLmxlbmd0aClyZXR1cm4hMTtmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCsrKWlmKCFPZi5jYWxsKGIsY1tkXSl8fCFGZChhW2NbZF1dLGJbY1tkXV0pKXJldHVybiExO3JldHVybiEwfSxIZD1mdW5jdGlvbihhKXt2YXIgYj0oYT9hLm93bmVyRG9jdW1lbnR8fGE6ZG9jdW1lbnQpLmRlZmF1bHRWaWV3fHx3aW5kb3c7cmV0dXJuISEoYSYmKCJmdW5jdGlvbiI9PT10eXBlb2YgYi5Ob2RlP2EgaW5zdGFuY2VvZiBiLk5vZGU6Im9iamVjdCI9PT10eXBlb2YgYSYmIm51bWJlciI9PT10eXBlb2YgYS5ub2RlVHlwZSYmInN0cmluZyI9PT10eXBlb2YgYS5ub2RlTmFtZSkpJiYzPT1hLm5vZGVUeXBlfSxQZj1ILmNhblVzZURPTSYmImRvY3VtZW50TW9kZSJpbiBkb2N1bWVudCYmMTE+PWRvY3VtZW50LmRvY3VtZW50TW9kZSxMZD17c2VsZWN0OntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDoib25TZWxlY3QiLGNhcHR1cmVkOiJvblNlbGVjdENhcHR1cmUifSxkZXBlbmRlbmNpZXM6InRvcEJsdXIgdG9wQ29udGV4dE1lbnUgdG9wRm9jdXMgdG9wS2V5RG93biB0b3BLZXlVcCB0b3BNb3VzZURvd24gdG9wTW91c2VVcCB0b3BTZWxlY3Rpb25DaGFuZ2UiLnNwbGl0KCIgIil9fSwKa2E9bnVsbCxkYz1udWxsLFBhPW51bGwsYWM9ITEsUWY9e2V2ZW50VHlwZXM6TGQsZXh0cmFjdEV2ZW50czpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1kLndpbmRvdz09PWQ/ZC5kb2N1bWVudDo5PT09ZC5ub2RlVHlwZT9kOmQub3duZXJEb2N1bWVudCxmO2lmKCEoZj0hZSkpe2E6e2U9RGQoZSk7Zj1nYi5vblNlbGVjdDtmb3IodmFyIGc9MDtnPGYubGVuZ3RoO2crKyl7dmFyIGs9ZltnXTtpZighZS5oYXNPd25Qcm9wZXJ0eShrKXx8IWVba10pe2U9ITE7YnJlYWsgYX19ZT0hMH1mPSFlfWlmKGYpcmV0dXJuIG51bGw7ZT1iP3lhKGIpOndpbmRvdztzd2l0Y2goYSl7Y2FzZSAidG9wRm9jdXMiOmlmKHJkKGUpfHwidHJ1ZSI9PT1lLmNvbnRlbnRFZGl0YWJsZSlrYT1lLGRjPWIsUGE9bnVsbDticmVhaztjYXNlICJ0b3BCbHVyIjpQYT1kYz1rYT1udWxsO2JyZWFrO2Nhc2UgInRvcE1vdXNlRG93biI6YWM9ITA7YnJlYWs7Y2FzZSAidG9wQ29udGV4dE1lbnUiOmNhc2UgInRvcE1vdXNlVXAiOnJldHVybiBhYz0KITEsS2QoYyxkKTtjYXNlICJ0b3BTZWxlY3Rpb25DaGFuZ2UiOmlmKFBmKWJyZWFrO2Nhc2UgInRvcEtleURvd24iOmNhc2UgInRvcEtleVVwIjpyZXR1cm4gS2QoYyxkKX1yZXR1cm4gbnVsbH19O24uYXVnbWVudENsYXNzKE1kLHthbmltYXRpb25OYW1lOm51bGwsZWxhcHNlZFRpbWU6bnVsbCxwc2V1ZG9FbGVtZW50Om51bGx9KTtuLmF1Z21lbnRDbGFzcyhOZCx7Y2xpcGJvYXJkRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4iY2xpcGJvYXJkRGF0YSJpbiBhP2EuY2xpcGJvYXJkRGF0YTp3aW5kb3cuY2xpcGJvYXJkRGF0YX19KTtqYS5hdWdtZW50Q2xhc3MoT2Qse3JlbGF0ZWRUYXJnZXQ6bnVsbH0pO3ZhciBSZj17RXNjOiJFc2NhcGUiLFNwYWNlYmFyOiIgIixMZWZ0OiJBcnJvd0xlZnQiLFVwOiJBcnJvd1VwIixSaWdodDoiQXJyb3dSaWdodCIsRG93bjoiQXJyb3dEb3duIixEZWw6IkRlbGV0ZSIsV2luOiJPUyIsTWVudToiQ29udGV4dE1lbnUiLEFwcHM6IkNvbnRleHRNZW51IixTY3JvbGw6IlNjcm9sbExvY2siLApNb3pQcmludGFibGVLZXk6IlVuaWRlbnRpZmllZCJ9LFNmPXs4OiJCYWNrc3BhY2UiLDk6IlRhYiIsMTI6IkNsZWFyIiwxMzoiRW50ZXIiLDE2OiJTaGlmdCIsMTc6IkNvbnRyb2wiLDE4OiJBbHQiLDE5OiJQYXVzZSIsMjA6IkNhcHNMb2NrIiwyNzoiRXNjYXBlIiwzMjoiICIsMzM6IlBhZ2VVcCIsMzQ6IlBhZ2VEb3duIiwzNToiRW5kIiwzNjoiSG9tZSIsMzc6IkFycm93TGVmdCIsMzg6IkFycm93VXAiLDM5OiJBcnJvd1JpZ2h0Iiw0MDoiQXJyb3dEb3duIiw0NToiSW5zZXJ0Iiw0NjoiRGVsZXRlIiwxMTI6IkYxIiwxMTM6IkYyIiwxMTQ6IkYzIiwxMTU6IkY0IiwxMTY6IkY1IiwxMTc6IkY2IiwxMTg6IkY3IiwxMTk6IkY4IiwxMjA6IkY5IiwxMjE6IkYxMCIsMTIyOiJGMTEiLDEyMzoiRjEyIiwxNDQ6Ik51bUxvY2siLDE0NToiU2Nyb2xsTG9jayIsMjI0OiJNZXRhIn07amEuYXVnbWVudENsYXNzKFBkLHtrZXk6ZnVuY3Rpb24oYSl7aWYoYS5rZXkpe3ZhciBiPVJmW2Eua2V5XXx8CmEua2V5O2lmKCJVbmlkZW50aWZpZWQiIT09YilyZXR1cm4gYn1yZXR1cm4ia2V5cHJlc3MiPT09YS50eXBlPyhhPXFiKGEpLDEzPT09YT8iRW50ZXIiOlN0cmluZy5mcm9tQ2hhckNvZGUoYSkpOiJrZXlkb3duIj09PWEudHlwZXx8ImtleXVwIj09PWEudHlwZT9TZlthLmtleUNvZGVdfHwiVW5pZGVudGlmaWVkIjoiIn0sbG9jYXRpb246bnVsbCxjdHJsS2V5Om51bGwsc2hpZnRLZXk6bnVsbCxhbHRLZXk6bnVsbCxtZXRhS2V5Om51bGwscmVwZWF0Om51bGwsbG9jYWxlOm51bGwsZ2V0TW9kaWZpZXJTdGF0ZTpXYixjaGFyQ29kZTpmdW5jdGlvbihhKXtyZXR1cm4ia2V5cHJlc3MiPT09YS50eXBlP3FiKGEpOjB9LGtleUNvZGU6ZnVuY3Rpb24oYSl7cmV0dXJuImtleWRvd24iPT09YS50eXBlfHwia2V5dXAiPT09YS50eXBlP2Eua2V5Q29kZTowfSx3aGljaDpmdW5jdGlvbihhKXtyZXR1cm4ia2V5cHJlc3MiPT09YS50eXBlP3FiKGEpOiJrZXlkb3duIj09PWEudHlwZXx8ImtleXVwIj09PQphLnR5cGU/YS5rZXlDb2RlOjB9fSk7VS5hdWdtZW50Q2xhc3MoUWQse2RhdGFUcmFuc2ZlcjpudWxsfSk7amEuYXVnbWVudENsYXNzKFJkLHt0b3VjaGVzOm51bGwsdGFyZ2V0VG91Y2hlczpudWxsLGNoYW5nZWRUb3VjaGVzOm51bGwsYWx0S2V5Om51bGwsbWV0YUtleTpudWxsLGN0cmxLZXk6bnVsbCxzaGlmdEtleTpudWxsLGdldE1vZGlmaWVyU3RhdGU6V2J9KTtuLmF1Z21lbnRDbGFzcyhTZCx7cHJvcGVydHlOYW1lOm51bGwsZWxhcHNlZFRpbWU6bnVsbCxwc2V1ZG9FbGVtZW50Om51bGx9KTtVLmF1Z21lbnRDbGFzcyhUZCx7ZGVsdGFYOmZ1bmN0aW9uKGEpe3JldHVybiJkZWx0YVgiaW4gYT9hLmRlbHRhWDoid2hlZWxEZWx0YVgiaW4gYT8tYS53aGVlbERlbHRhWDowfSxkZWx0YVk6ZnVuY3Rpb24oYSl7cmV0dXJuImRlbHRhWSJpbiBhP2EuZGVsdGFZOiJ3aGVlbERlbHRhWSJpbiBhPy1hLndoZWVsRGVsdGFZOiJ3aGVlbERlbHRhImluIGE/LWEud2hlZWxEZWx0YTowfSxkZWx0YVo6bnVsbCwKZGVsdGFNb2RlOm51bGx9KTt2YXIgSWU9e30sSmU9e307ImFib3J0IGFuaW1hdGlvbkVuZCBhbmltYXRpb25JdGVyYXRpb24gYW5pbWF0aW9uU3RhcnQgYmx1ciBjYW5jZWwgY2FuUGxheSBjYW5QbGF5VGhyb3VnaCBjbGljayBjbG9zZSBjb250ZXh0TWVudSBjb3B5IGN1dCBkb3VibGVDbGljayBkcmFnIGRyYWdFbmQgZHJhZ0VudGVyIGRyYWdFeGl0IGRyYWdMZWF2ZSBkcmFnT3ZlciBkcmFnU3RhcnQgZHJvcCBkdXJhdGlvbkNoYW5nZSBlbXB0aWVkIGVuY3J5cHRlZCBlbmRlZCBlcnJvciBmb2N1cyBpbnB1dCBpbnZhbGlkIGtleURvd24ga2V5UHJlc3Mga2V5VXAgbG9hZCBsb2FkZWREYXRhIGxvYWRlZE1ldGFkYXRhIGxvYWRTdGFydCBtb3VzZURvd24gbW91c2VNb3ZlIG1vdXNlT3V0IG1vdXNlT3ZlciBtb3VzZVVwIHBhc3RlIHBhdXNlIHBsYXkgcGxheWluZyBwcm9ncmVzcyByYXRlQ2hhbmdlIHJlc2V0IHNjcm9sbCBzZWVrZWQgc2Vla2luZyBzdGFsbGVkIHN1Ym1pdCBzdXNwZW5kIHRpbWVVcGRhdGUgdG9nZ2xlIHRvdWNoQ2FuY2VsIHRvdWNoRW5kIHRvdWNoTW92ZSB0b3VjaFN0YXJ0IHRyYW5zaXRpb25FbmQgdm9sdW1lQ2hhbmdlIHdhaXRpbmcgd2hlZWwiLnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj0KYVswXS50b1VwcGVyQ2FzZSgpK2Euc2xpY2UoMSksYz0ib24iK2I7Yj0idG9wIitiO2M9e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOmMsY2FwdHVyZWQ6YysiQ2FwdHVyZSJ9LGRlcGVuZGVuY2llczpbYl19O0llW2FdPWM7SmVbYl09Y30pO3ZhciBUZj17ZXZlbnRUeXBlczpJZSxleHRyYWN0RXZlbnRzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPUplW2FdO2lmKCFlKXJldHVybiBudWxsO3N3aXRjaChhKXtjYXNlICJ0b3BLZXlQcmVzcyI6aWYoMD09PXFiKGMpKXJldHVybiBudWxsO2Nhc2UgInRvcEtleURvd24iOmNhc2UgInRvcEtleVVwIjphPVBkO2JyZWFrO2Nhc2UgInRvcEJsdXIiOmNhc2UgInRvcEZvY3VzIjphPU9kO2JyZWFrO2Nhc2UgInRvcENsaWNrIjppZigyPT09Yy5idXR0b24pcmV0dXJuIG51bGw7Y2FzZSAidG9wRG91YmxlQ2xpY2siOmNhc2UgInRvcE1vdXNlRG93biI6Y2FzZSAidG9wTW91c2VNb3ZlIjpjYXNlICJ0b3BNb3VzZVVwIjpjYXNlICJ0b3BNb3VzZU91dCI6Y2FzZSAidG9wTW91c2VPdmVyIjpjYXNlICJ0b3BDb250ZXh0TWVudSI6YT0KVTticmVhaztjYXNlICJ0b3BEcmFnIjpjYXNlICJ0b3BEcmFnRW5kIjpjYXNlICJ0b3BEcmFnRW50ZXIiOmNhc2UgInRvcERyYWdFeGl0IjpjYXNlICJ0b3BEcmFnTGVhdmUiOmNhc2UgInRvcERyYWdPdmVyIjpjYXNlICJ0b3BEcmFnU3RhcnQiOmNhc2UgInRvcERyb3AiOmE9UWQ7YnJlYWs7Y2FzZSAidG9wVG91Y2hDYW5jZWwiOmNhc2UgInRvcFRvdWNoRW5kIjpjYXNlICJ0b3BUb3VjaE1vdmUiOmNhc2UgInRvcFRvdWNoU3RhcnQiOmE9UmQ7YnJlYWs7Y2FzZSAidG9wQW5pbWF0aW9uRW5kIjpjYXNlICJ0b3BBbmltYXRpb25JdGVyYXRpb24iOmNhc2UgInRvcEFuaW1hdGlvblN0YXJ0IjphPU1kO2JyZWFrO2Nhc2UgInRvcFRyYW5zaXRpb25FbmQiOmE9U2Q7YnJlYWs7Y2FzZSAidG9wU2Nyb2xsIjphPWphO2JyZWFrO2Nhc2UgInRvcFdoZWVsIjphPVRkO2JyZWFrO2Nhc2UgInRvcENvcHkiOmNhc2UgInRvcEN1dCI6Y2FzZSAidG9wUGFzdGUiOmE9TmQ7YnJlYWs7ZGVmYXVsdDphPQpufWI9YS5nZXRQb29sZWQoZSxiLGMsZCk7emEoYik7cmV0dXJuIGJ9fTtsYj1mdW5jdGlvbihhLGIsYyxkKXthPVljKGEsYixjLGQpO05iKGEpO09iKCExKX07QmMuaW5qZWN0RXZlbnRQbHVnaW5PcmRlcigiUmVzcG9uZGVyRXZlbnRQbHVnaW4gU2ltcGxlRXZlbnRQbHVnaW4gVGFwRXZlbnRQbHVnaW4gRW50ZXJMZWF2ZUV2ZW50UGx1Z2luIENoYW5nZUV2ZW50UGx1Z2luIFNlbGVjdEV2ZW50UGx1Z2luIEJlZm9yZUlucHV0RXZlbnRQbHVnaW4iLnNwbGl0KCIgIikpOyhmdW5jdGlvbihhKXtNYj1hLmdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGU7b2Q9YS5nZXRJbnN0YW5jZUZyb21Ob2RlO1hjPWEuZ2V0Tm9kZUZyb21JbnN0YW5jZX0pKEZlKTtCYy5pbmplY3RFdmVudFBsdWdpbnNCeU5hbWUoe1NpbXBsZUV2ZW50UGx1Z2luOlRmLEVudGVyTGVhdmVFdmVudFBsdWdpbjpNZixDaGFuZ2VFdmVudFBsdWdpbjpMZixTZWxlY3RFdmVudFBsdWdpbjpRZixCZWZvcmVJbnB1dEV2ZW50UGx1Z2luOkpmfSk7CnZhciBtYT17fSxyYj1bXSx0YT0tMTtuZXcgU2V0O3ZhciBsYT17Y3VycmVudDptYX0sSj17Y3VycmVudDohMX0sc2I9bWEsamM9bnVsbCxrYz1udWxsLFVmPWZ1bmN0aW9uKGEsYixjLGQpe2Z1bmN0aW9uIGUoYSxiKXtiLnVwZGF0ZXI9ZjthLnN0YXRlTm9kZT1iO2IuX3JlYWN0SW50ZXJuYWxGaWJlcj1hfXZhciBmPXtpc01vdW50ZWQ6bmYsZW5xdWV1ZVNldFN0YXRlOmZ1bmN0aW9uKGMsZCxlKXtjPWMuX3JlYWN0SW50ZXJuYWxGaWJlcjtlPXZvaWQgMD09PWU/bnVsbDplO3ZhciBmPWIoYyk7eGIoYyx7ZXhwaXJhdGlvblRpbWU6ZixwYXJ0aWFsU3RhdGU6ZCxjYWxsYmFjazplLGlzUmVwbGFjZTohMSxpc0ZvcmNlZDohMSxuZXh0Q2FsbGJhY2s6bnVsbCxuZXh0Om51bGx9KTthKGMsZil9LGVucXVldWVSZXBsYWNlU3RhdGU6ZnVuY3Rpb24oYyxkLGUpe2M9Yy5fcmVhY3RJbnRlcm5hbEZpYmVyO2U9dm9pZCAwPT09ZT9udWxsOmU7dmFyIGY9YihjKTt4YihjLHtleHBpcmF0aW9uVGltZTpmLApwYXJ0aWFsU3RhdGU6ZCxjYWxsYmFjazplLGlzUmVwbGFjZTohMCxpc0ZvcmNlZDohMSxuZXh0Q2FsbGJhY2s6bnVsbCxuZXh0Om51bGx9KTthKGMsZil9LGVucXVldWVGb3JjZVVwZGF0ZTpmdW5jdGlvbihjLGQpe2M9Yy5fcmVhY3RJbnRlcm5hbEZpYmVyO2Q9dm9pZCAwPT09ZD9udWxsOmQ7dmFyIGU9YihjKTt4YihjLHtleHBpcmF0aW9uVGltZTplLHBhcnRpYWxTdGF0ZTpudWxsLGNhbGxiYWNrOmQsaXNSZXBsYWNlOiExLGlzRm9yY2VkOiEwLG5leHRDYWxsYmFjazpudWxsLG5leHQ6bnVsbH0pO2EoYyxlKX19O3JldHVybnthZG9wdENsYXNzSW5zdGFuY2U6ZSxjb25zdHJ1Y3RDbGFzc0luc3RhbmNlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS50eXBlLGQ9UWEoYSksZj0yPT09YS50YWcmJm51bGwhPWEudHlwZS5jb250ZXh0VHlwZXMsZz1mP1NhKGEsZCk6bWE7Yj1uZXcgYyhiLGcpO2UoYSxiKTtmJiYoYT1hLnN0YXRlTm9kZSxhLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9CmQsYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dD1nKTtyZXR1cm4gYn0sbW91bnRDbGFzc0luc3RhbmNlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5hbHRlcm5hdGUsZD1hLnN0YXRlTm9kZSxlPWQuc3RhdGV8fG51bGwsZz1hLnBlbmRpbmdQcm9wcztnP3ZvaWQgMDpsKCIxNTgiKTt2YXIgaz1RYShhKTtkLnByb3BzPWc7ZC5zdGF0ZT1hLm1lbW9pemVkU3RhdGU9ZTtkLnJlZnM9bWE7ZC5jb250ZXh0PVNhKGEsayk7bnVsbCE9YS50eXBlJiZudWxsIT1hLnR5cGUucHJvdG90eXBlJiYhMD09PWEudHlwZS5wcm90b3R5cGUudW5zdGFibGVfaXNBc3luY1JlYWN0Q29tcG9uZW50JiYoYS5pbnRlcm5hbENvbnRleHRUYWd8PTEpOyJmdW5jdGlvbiI9PT10eXBlb2YgZC5jb21wb25lbnRXaWxsTW91bnQmJihlPWQuc3RhdGUsZC5jb21wb25lbnRXaWxsTW91bnQoKSxlIT09ZC5zdGF0ZSYmZi5lbnF1ZXVlUmVwbGFjZVN0YXRlKGQsZC5zdGF0ZSxudWxsKSxlPWEudXBkYXRlUXVldWUsCm51bGwhPT1lJiYoZC5zdGF0ZT1sYyhjLGEsZSxkLGcsYikpKTsiZnVuY3Rpb24iPT09dHlwZW9mIGQuY29tcG9uZW50RGlkTW91bnQmJihhLmVmZmVjdFRhZ3w9NCl9LHVwZGF0ZUNsYXNzSW5zdGFuY2U6ZnVuY3Rpb24oYSxiLGUpe3ZhciBnPWIuc3RhdGVOb2RlO2cucHJvcHM9Yi5tZW1vaXplZFByb3BzO2cuc3RhdGU9Yi5tZW1vaXplZFN0YXRlO3ZhciBrPWIubWVtb2l6ZWRQcm9wcyxoPWIucGVuZGluZ1Byb3BzO2h8fChoPWssbnVsbD09aD9sKCIxNTkiKTp2b2lkIDApO3ZhciB0PWcuY29udGV4dCxLPVFhKGIpO0s9U2EoYixLKTsiZnVuY3Rpb24iIT09dHlwZW9mIGcuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc3x8az09PWgmJnQ9PT1LfHwodD1nLnN0YXRlLGcuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhoLEspLGcuc3RhdGUhPT10JiZmLmVucXVldWVSZXBsYWNlU3RhdGUoZyxnLnN0YXRlLG51bGwpKTt0PWIubWVtb2l6ZWRTdGF0ZTtlPW51bGwhPT1iLnVwZGF0ZVF1ZXVlPwpsYyhhLGIsYi51cGRhdGVRdWV1ZSxnLGgsZSk6dDtpZighKGshPT1ofHx0IT09ZXx8Si5jdXJyZW50fHxudWxsIT09Yi51cGRhdGVRdWV1ZSYmYi51cGRhdGVRdWV1ZS5oYXNGb3JjZVVwZGF0ZSkpcmV0dXJuImZ1bmN0aW9uIiE9PXR5cGVvZiBnLmNvbXBvbmVudERpZFVwZGF0ZXx8az09PWEubWVtb2l6ZWRQcm9wcyYmdD09PWEubWVtb2l6ZWRTdGF0ZXx8KGIuZWZmZWN0VGFnfD00KSwhMTt2YXIgTD1oO2lmKG51bGw9PT1rfHxudWxsIT09Yi51cGRhdGVRdWV1ZSYmYi51cGRhdGVRdWV1ZS5oYXNGb3JjZVVwZGF0ZSlMPSEwO2Vsc2V7dmFyIGFhPWIuc3RhdGVOb2RlLHA9Yi50eXBlO0w9ImZ1bmN0aW9uIj09PXR5cGVvZiBhYS5zaG91bGRDb21wb25lbnRVcGRhdGU/YWEuc2hvdWxkQ29tcG9uZW50VXBkYXRlKEwsZSxLKTpwLnByb3RvdHlwZSYmcC5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQ/IWNjKGssTCl8fCFjYyh0LGUpOiEwfUw/KCJmdW5jdGlvbiI9PT10eXBlb2YgZy5jb21wb25lbnRXaWxsVXBkYXRlJiYKZy5jb21wb25lbnRXaWxsVXBkYXRlKGgsZSxLKSwiZnVuY3Rpb24iPT09dHlwZW9mIGcuY29tcG9uZW50RGlkVXBkYXRlJiYoYi5lZmZlY3RUYWd8PTQpKTooImZ1bmN0aW9uIiE9PXR5cGVvZiBnLmNvbXBvbmVudERpZFVwZGF0ZXx8az09PWEubWVtb2l6ZWRQcm9wcyYmdD09PWEubWVtb2l6ZWRTdGF0ZXx8KGIuZWZmZWN0VGFnfD00KSxjKGIsaCksZChiLGUpKTtnLnByb3BzPWg7Zy5zdGF0ZT1lO2cuY29udGV4dD1LO3JldHVybiBMfX19LFRhPSJmdW5jdGlvbiI9PT10eXBlb2YgU3ltYm9sJiZTeW1ib2xbImZvciJdJiZTeW1ib2xbImZvciJdKCJyZWFjdC5wb3J0YWwiKXx8NjAxMDYsemI9QXJyYXkuaXNBcnJheSxkZT0iZnVuY3Rpb24iPT09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgU3ltYm9sJiZTeW1ib2xbImZvciJdKXt2YXIgV2E9U3ltYm9sWyJmb3IiXSgicmVhY3QuZWxlbWVudCIpO3ZhciBYYT1TeW1ib2xbImZvciJdKCJyZWFjdC5jYWxsIik7CnZhciBZYT1TeW1ib2xbImZvciJdKCJyZWFjdC5yZXR1cm4iKTt2YXIgdWE9U3ltYm9sWyJmb3IiXSgicmVhY3QuZnJhZ21lbnQiKX1lbHNlIFdhPTYwMTAzLFhhPTYwMTA0LFlhPTYwMTA1LHVhPTYwMTA3O3ZhciBFYz1tYyghMCwhMCksRmM9bWMoITEsITApLEdjPW1jKCExLCExKSxWZj1mdW5jdGlvbihhLGIsYyxkLGUpe2Z1bmN0aW9uIGYoYSxiLGMpe2coYSxiLGMsYi5leHBpcmF0aW9uVGltZSl9ZnVuY3Rpb24gZyhhLGIsYyxkKXtiLmNoaWxkPW51bGw9PT1hP0djKGIsYi5jaGlsZCxjLGQpOmEuY2hpbGQ9PT1iLmNoaWxkP0VjKGIsYi5jaGlsZCxjLGQpOkZjKGIsYi5jaGlsZCxjLGQpfWZ1bmN0aW9uIGsoYSxiKXt2YXIgYz1iLnJlZjtudWxsPT09Y3x8YSYmYS5yZWY9PT1jfHwoYi5lZmZlY3RUYWd8PTEyOCl9ZnVuY3Rpb24gaChhLGIsYyxkKXtrKGEsYik7aWYoIWMpcmV0dXJuIGQmJlhkKGIsITEpLEEoYSxiKTtjPWIuc3RhdGVOb2RlO2JiLmN1cnJlbnQ9Yjt2YXIgZT1jLnJlbmRlcigpOwpiLmVmZmVjdFRhZ3w9MTtmKGEsYixlKTtiLm1lbW9pemVkU3RhdGU9Yy5zdGF0ZTtiLm1lbW9pemVkUHJvcHM9Yy5wcm9wcztkJiZYZChiLCEwKTtyZXR1cm4gYi5jaGlsZH1mdW5jdGlvbiBwKGEpe3ZhciBiPWEuc3RhdGVOb2RlO2IucGVuZGluZ0NvbnRleHQ/VmQoYSxiLnBlbmRpbmdDb250ZXh0LGIucGVuZGluZ0NvbnRleHQhPT1iLmNvbnRleHQpOmIuY29udGV4dCYmVmQoYSxiLmNvbnRleHQsITEpO24oYSxiLmNvbnRhaW5lckluZm8pfWZ1bmN0aW9uIEEoYSxiKXtudWxsIT09YSYmYi5jaGlsZCE9PWEuY2hpbGQ/bCgiMTUzIik6dm9pZCAwO2lmKG51bGwhPT1iLmNoaWxkKXthPWIuY2hpbGQ7dmFyIGM9dWIoYSxhLnBlbmRpbmdQcm9wcyxhLmV4cGlyYXRpb25UaW1lKTtiLmNoaWxkPWM7Zm9yKGNbInJldHVybiJdPWI7bnVsbCE9PWEuc2libGluZzspYT1hLnNpYmxpbmcsYz1jLnNpYmxpbmc9dWIoYSxhLnBlbmRpbmdQcm9wcyxhLmV4cGlyYXRpb25UaW1lKSxjWyJyZXR1cm4iXT0KYjtjLnNpYmxpbmc9bnVsbH1yZXR1cm4gYi5jaGlsZH1mdW5jdGlvbiBEKGEsYil7c3dpdGNoKGIudGFnKXtjYXNlIDM6cChiKTticmVhaztjYXNlIDI6dGIoYik7YnJlYWs7Y2FzZSA0Om4oYixiLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKX1yZXR1cm4gbnVsbH12YXIgdD1hLnNob3VsZFNldFRleHRDb250ZW50LEs9YS51c2VTeW5jU2NoZWR1bGluZyxMPWEuc2hvdWxkRGVwcmlvcml0aXplU3VidHJlZSxhYT1iLnB1c2hIb3N0Q29udGV4dCxuPWIucHVzaEhvc3RDb250YWluZXIsdz1jLmVudGVySHlkcmF0aW9uU3RhdGUsdT1jLnJlc2V0SHlkcmF0aW9uU3RhdGUsdj1jLnRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlO2E9VWYoZCxlLGZ1bmN0aW9uKGEsYil7YS5tZW1vaXplZFByb3BzPWJ9LGZ1bmN0aW9uKGEsYil7YS5tZW1vaXplZFN0YXRlPWJ9KTt2YXIgcT1hLmFkb3B0Q2xhc3NJbnN0YW5jZSx5PWEuY29uc3RydWN0Q2xhc3NJbnN0YW5jZSx6PWEubW91bnRDbGFzc0luc3RhbmNlLAp1Zj1hLnVwZGF0ZUNsYXNzSW5zdGFuY2U7cmV0dXJue2JlZ2luV29yazpmdW5jdGlvbihhLGIsYyl7aWYoMD09PWIuZXhwaXJhdGlvblRpbWV8fGIuZXhwaXJhdGlvblRpbWU+YylyZXR1cm4gRChhLGIpO3N3aXRjaChiLnRhZyl7Y2FzZSAwOm51bGwhPT1hP2woIjE1NSIpOnZvaWQgMDt2YXIgZD1iLnR5cGUsZT1iLnBlbmRpbmdQcm9wcyxnPVFhKGIpO2c9U2EoYixnKTtkPWQoZSxnKTtiLmVmZmVjdFRhZ3w9MTsib2JqZWN0Ij09PXR5cGVvZiBkJiZudWxsIT09ZCYmImZ1bmN0aW9uIj09PXR5cGVvZiBkLnJlbmRlcj8oYi50YWc9MixlPXRiKGIpLHEoYixkKSx6KGIsYyksYj1oKGEsYiwhMCxlKSk6KGIudGFnPTEsZihhLGIsZCksYi5tZW1vaXplZFByb3BzPWUsYj1iLmNoaWxkKTtyZXR1cm4gYjtjYXNlIDE6YTp7ZT1iLnR5cGU7Yz1iLnBlbmRpbmdQcm9wcztkPWIubWVtb2l6ZWRQcm9wcztpZihKLmN1cnJlbnQpbnVsbD09PWMmJihjPWQpO2Vsc2UgaWYobnVsbD09PWN8fGQ9PT0KYyl7Yj1BKGEsYik7YnJlYWsgYX1kPVFhKGIpO2Q9U2EoYixkKTtlPWUoYyxkKTtiLmVmZmVjdFRhZ3w9MTtmKGEsYixlKTtiLm1lbW9pemVkUHJvcHM9YztiPWIuY2hpbGR9cmV0dXJuIGI7Y2FzZSAyOnJldHVybiBlPXRiKGIpLGQ9dm9pZCAwLG51bGw9PT1hP2Iuc3RhdGVOb2RlP2woIjE1MyIpOih5KGIsYi5wZW5kaW5nUHJvcHMpLHooYixjKSxkPSEwKTpkPXVmKGEsYixjKSxoKGEsYixkLGUpO2Nhc2UgMzpyZXR1cm4gcChiKSxlPWIudXBkYXRlUXVldWUsbnVsbCE9PWU/KGQ9Yi5tZW1vaXplZFN0YXRlLGU9bGMoYSxiLGUsbnVsbCxudWxsLGMpLGQ9PT1lPyh1KCksYj1BKGEsYikpOihkPWUuZWxlbWVudCxnPWIuc3RhdGVOb2RlLChudWxsPT09YXx8bnVsbD09PWEuY2hpbGQpJiZnLmh5ZHJhdGUmJncoYik/KGIuZWZmZWN0VGFnfD0yLGIuY2hpbGQ9R2MoYixiLmNoaWxkLGQsYykpOih1KCksZihhLGIsZCkpLGIubWVtb2l6ZWRTdGF0ZT1lLGI9Yi5jaGlsZCkpOih1KCksYj1BKGEsCmIpKSxiO2Nhc2UgNTphYShiKTtudWxsPT09YSYmdihiKTtlPWIudHlwZTt2YXIgbT1iLm1lbW9pemVkUHJvcHM7ZD1iLnBlbmRpbmdQcm9wcztudWxsPT09ZCYmKGQ9bSxudWxsPT09ZD9sKCIxNTQiKTp2b2lkIDApO2c9bnVsbCE9PWE/YS5tZW1vaXplZFByb3BzOm51bGw7Si5jdXJyZW50fHxudWxsIT09ZCYmbSE9PWQ/KG09ZC5jaGlsZHJlbix0KGUsZCk/bT1udWxsOmcmJnQoZSxnKSYmKGIuZWZmZWN0VGFnfD0xNiksayhhLGIpLDIxNDc0ODM2NDchPT1jJiYhSyYmTChlLGQpPyhiLmV4cGlyYXRpb25UaW1lPTIxNDc0ODM2NDcsYj1udWxsKTooZihhLGIsbSksYi5tZW1vaXplZFByb3BzPWQsYj1iLmNoaWxkKSk6Yj1BKGEsYik7cmV0dXJuIGI7Y2FzZSA2OnJldHVybiBudWxsPT09YSYmdihiKSxhPWIucGVuZGluZ1Byb3BzLG51bGw9PT1hJiYoYT1iLm1lbW9pemVkUHJvcHMpLGIubWVtb2l6ZWRQcm9wcz1hLG51bGw7Y2FzZSA4OmIudGFnPTc7Y2FzZSA3OmU9Yi5wZW5kaW5nUHJvcHM7CmlmKEouY3VycmVudCludWxsPT09ZSYmKGU9YSYmYS5tZW1vaXplZFByb3BzLG51bGw9PT1lP2woIjE1NCIpOnZvaWQgMCk7ZWxzZSBpZihudWxsPT09ZXx8Yi5tZW1vaXplZFByb3BzPT09ZSllPWIubWVtb2l6ZWRQcm9wcztkPWUuY2hpbGRyZW47Yi5zdGF0ZU5vZGU9bnVsbD09PWE/R2MoYixiLnN0YXRlTm9kZSxkLGMpOmEuY2hpbGQ9PT1iLmNoaWxkP0VjKGIsYi5zdGF0ZU5vZGUsZCxjKTpGYyhiLGIuc3RhdGVOb2RlLGQsYyk7Yi5tZW1vaXplZFByb3BzPWU7cmV0dXJuIGIuc3RhdGVOb2RlO2Nhc2UgOTpyZXR1cm4gbnVsbDtjYXNlIDQ6YTp7bihiLGIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO2U9Yi5wZW5kaW5nUHJvcHM7aWYoSi5jdXJyZW50KW51bGw9PT1lJiYoZT1hJiZhLm1lbW9pemVkUHJvcHMsbnVsbD09ZT9sKCIxNTQiKTp2b2lkIDApO2Vsc2UgaWYobnVsbD09PWV8fGIubWVtb2l6ZWRQcm9wcz09PWUpe2I9QShhLGIpO2JyZWFrIGF9bnVsbD09PWE/Yi5jaGlsZD0KRmMoYixiLmNoaWxkLGUsYyk6ZihhLGIsZSk7Yi5tZW1vaXplZFByb3BzPWU7Yj1iLmNoaWxkfXJldHVybiBiO2Nhc2UgMTA6YTp7Yz1iLnBlbmRpbmdQcm9wcztpZihKLmN1cnJlbnQpbnVsbD09PWMmJihjPWIubWVtb2l6ZWRQcm9wcyk7ZWxzZSBpZihudWxsPT09Y3x8Yi5tZW1vaXplZFByb3BzPT09Yyl7Yj1BKGEsYik7YnJlYWsgYX1mKGEsYixjKTtiLm1lbW9pemVkUHJvcHM9YztiPWIuY2hpbGR9cmV0dXJuIGI7ZGVmYXVsdDpsKCIxNTYiKX19LGJlZ2luRmFpbGVkV29yazpmdW5jdGlvbihhLGIsYyl7c3dpdGNoKGIudGFnKXtjYXNlIDI6dGIoYik7YnJlYWs7Y2FzZSAzOnAoYik7YnJlYWs7ZGVmYXVsdDpsKCIxNTciKX1iLmVmZmVjdFRhZ3w9NjQ7bnVsbD09PWE/Yi5jaGlsZD1udWxsOmIuY2hpbGQhPT1hLmNoaWxkJiYoYi5jaGlsZD1hLmNoaWxkKTtpZigwPT09Yi5leHBpcmF0aW9uVGltZXx8Yi5leHBpcmF0aW9uVGltZT5jKXJldHVybiBEKGEsYik7Yi5maXJzdEVmZmVjdD0KbnVsbDtiLmxhc3RFZmZlY3Q9bnVsbDtnKGEsYixudWxsLGMpOzI9PT1iLnRhZyYmKGE9Yi5zdGF0ZU5vZGUsYi5tZW1vaXplZFByb3BzPWEucHJvcHMsYi5tZW1vaXplZFN0YXRlPWEuc3RhdGUpO3JldHVybiBiLmNoaWxkfX19LFdmPWZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe2EuZWZmZWN0VGFnfD00fXZhciBlPWEuY3JlYXRlSW5zdGFuY2UsZj1hLmNyZWF0ZVRleHRJbnN0YW5jZSxnPWEuYXBwZW5kSW5pdGlhbENoaWxkLGs9YS5maW5hbGl6ZUluaXRpYWxDaGlsZHJlbixoPWEucHJlcGFyZVVwZGF0ZSxwPWEucGVyc2lzdGVuY2UsQT1iLmdldFJvb3RIb3N0Q29udGFpbmVyLEQ9Yi5wb3BIb3N0Q29udGV4dCx0PWIuZ2V0SG9zdENvbnRleHQsbj1iLnBvcEhvc3RDb250YWluZXIsTD1jLnByZXBhcmVUb0h5ZHJhdGVIb3N0SW5zdGFuY2UsYWE9Yy5wcmVwYXJlVG9IeWRyYXRlSG9zdFRleHRJbnN0YW5jZSx1PWMucG9wSHlkcmF0aW9uU3RhdGUsdz12b2lkIDAsQj12b2lkIDAsCnY9dm9pZCAwO2EubXV0YXRpb24/KHc9ZnVuY3Rpb24oYSl7fSxCPWZ1bmN0aW9uKGEsYixjLGUsZixnLGspeyhiLnVwZGF0ZVF1ZXVlPWMpJiZkKGIpfSx2PWZ1bmN0aW9uKGEsYixjLGUpe2MhPT1lJiZkKGIpfSk6cD9sKCIyMzUiKTpsKCIyMzYiKTtyZXR1cm57Y29tcGxldGVXb3JrOmZ1bmN0aW9uKGEsYixjKXt2YXIgcT1iLnBlbmRpbmdQcm9wcztpZihudWxsPT09cSlxPWIubWVtb2l6ZWRQcm9wcztlbHNlIGlmKDIxNDc0ODM2NDchPT1iLmV4cGlyYXRpb25UaW1lfHwyMTQ3NDgzNjQ3PT09YyliLnBlbmRpbmdQcm9wcz1udWxsO3N3aXRjaChiLnRhZyl7Y2FzZSAxOnJldHVybiBudWxsO2Nhc2UgMjpyZXR1cm4gVWQoYiksbnVsbDtjYXNlIDM6bihiKTtJKEosYik7SShsYSxiKTtxPWIuc3RhdGVOb2RlO3EucGVuZGluZ0NvbnRleHQmJihxLmNvbnRleHQ9cS5wZW5kaW5nQ29udGV4dCxxLnBlbmRpbmdDb250ZXh0PW51bGwpO2lmKG51bGw9PT1hfHxudWxsPT09YS5jaGlsZCl1KGIpLApiLmVmZmVjdFRhZyY9LTM7dyhiKTtyZXR1cm4gbnVsbDtjYXNlIDU6RChiKTtjPUEoKTt2YXIgeT1iLnR5cGU7aWYobnVsbCE9PWEmJm51bGwhPWIuc3RhdGVOb2RlKXt2YXIgbT1hLm1lbW9pemVkUHJvcHMsej1iLnN0YXRlTm9kZSxwPXQoKTt6PWgoeix5LG0scSxjLHApO0IoYSxiLHoseSxtLHEsYyk7YS5yZWYhPT1iLnJlZiYmKGIuZWZmZWN0VGFnfD0xMjgpfWVsc2V7aWYoIXEpcmV0dXJuIG51bGw9PT1iLnN0YXRlTm9kZT9sKCIxNjYiKTp2b2lkIDAsbnVsbDthPXQoKTtpZih1KGIpKUwoYixjLGEpJiZkKGIpO2Vsc2V7YT1lKHkscSxjLGEsYik7YTpmb3IobT1iLmNoaWxkO251bGwhPT1tOyl7aWYoNT09PW0udGFnfHw2PT09bS50YWcpZyhhLG0uc3RhdGVOb2RlKTtlbHNlIGlmKDQhPT1tLnRhZyYmbnVsbCE9PW0uY2hpbGQpe20uY2hpbGRbInJldHVybiJdPW07bT1tLmNoaWxkO2NvbnRpbnVlfWlmKG09PT1iKWJyZWFrO2Zvcig7bnVsbD09PW0uc2libGluZzspe2lmKG51bGw9PT0KbVsicmV0dXJuIl18fG1bInJldHVybiJdPT09YilicmVhayBhO209bVsicmV0dXJuIl19bS5zaWJsaW5nWyJyZXR1cm4iXT1tWyJyZXR1cm4iXTttPW0uc2libGluZ31rKGEseSxxLGMpJiZkKGIpO2Iuc3RhdGVOb2RlPWF9bnVsbCE9PWIucmVmJiYoYi5lZmZlY3RUYWd8PTEyOCl9cmV0dXJuIG51bGw7Y2FzZSA2OmlmKGEmJm51bGwhPWIuc3RhdGVOb2RlKXYoYSxiLGEubWVtb2l6ZWRQcm9wcyxxKTtlbHNle2lmKCJzdHJpbmciIT09dHlwZW9mIHEpcmV0dXJuIG51bGw9PT1iLnN0YXRlTm9kZT9sKCIxNjYiKTp2b2lkIDAsbnVsbDthPUEoKTtjPXQoKTt1KGIpP2FhKGIpJiZkKGIpOmIuc3RhdGVOb2RlPWYocSxhLGMsYil9cmV0dXJuIG51bGw7Y2FzZSA3OihxPWIubWVtb2l6ZWRQcm9wcyk/dm9pZCAwOmwoIjE2NSIpO2IudGFnPTg7eT1bXTthOmZvcigobT1iLnN0YXRlTm9kZSkmJihtWyJyZXR1cm4iXT1iKTtudWxsIT09bTspe2lmKDU9PT1tLnRhZ3x8Nj09PW0udGFnfHw0PT09Cm0udGFnKWwoIjI0NyIpO2Vsc2UgaWYoOT09PW0udGFnKXkucHVzaChtLnR5cGUpO2Vsc2UgaWYobnVsbCE9PW0uY2hpbGQpe20uY2hpbGRbInJldHVybiJdPW07bT1tLmNoaWxkO2NvbnRpbnVlfWZvcig7bnVsbD09PW0uc2libGluZzspe2lmKG51bGw9PT1tWyJyZXR1cm4iXXx8bVsicmV0dXJuIl09PT1iKWJyZWFrIGE7bT1tWyJyZXR1cm4iXX1tLnNpYmxpbmdbInJldHVybiJdPW1bInJldHVybiJdO209bS5zaWJsaW5nfW09cS5oYW5kbGVyO3E9bShxLnByb3BzLHkpO2IuY2hpbGQ9RWMoYixudWxsIT09YT9hLmNoaWxkOm51bGwscSxjKTtyZXR1cm4gYi5jaGlsZDtjYXNlIDg6cmV0dXJuIGIudGFnPTcsbnVsbDtjYXNlIDk6cmV0dXJuIG51bGw7Y2FzZSAxMDpyZXR1cm4gbnVsbDtjYXNlIDQ6cmV0dXJuIG4oYiksdyhiKSxudWxsO2Nhc2UgMDpsKCIxNjciKTtkZWZhdWx0OmwoIjE1NiIpfX19fSxYZj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSl7dmFyIGM9YS5yZWY7aWYobnVsbCE9PQpjKXRyeXtjKG51bGwpfWNhdGNoKHkpe2IoYSx5KX19ZnVuY3Rpb24gZChhKXsiZnVuY3Rpb24iPT09dHlwZW9mICRkJiYkZChhKTtzd2l0Y2goYS50YWcpe2Nhc2UgMjpjKGEpO3ZhciBkPWEuc3RhdGVOb2RlO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgZC5jb21wb25lbnRXaWxsVW5tb3VudCl0cnl7ZC5wcm9wcz1hLm1lbW9pemVkUHJvcHMsZC5zdGF0ZT1hLm1lbW9pemVkU3RhdGUsZC5jb21wb25lbnRXaWxsVW5tb3VudCgpfWNhdGNoKHkpe2IoYSx5KX1icmVhaztjYXNlIDU6YyhhKTticmVhaztjYXNlIDc6ZShhLnN0YXRlTm9kZSk7YnJlYWs7Y2FzZSA0OmgmJmcoYSl9fWZ1bmN0aW9uIGUoYSl7Zm9yKHZhciBiPWE7OylpZihkKGIpLG51bGw9PT1iLmNoaWxkfHxoJiY0PT09Yi50YWcpe2lmKGI9PT1hKWJyZWFrO2Zvcig7bnVsbD09PWIuc2libGluZzspe2lmKG51bGw9PT1iWyJyZXR1cm4iXXx8YlsicmV0dXJuIl09PT1hKXJldHVybjtiPWJbInJldHVybiJdfWIuc2libGluZ1sicmV0dXJuIl09CmJbInJldHVybiJdO2I9Yi5zaWJsaW5nfWVsc2UgYi5jaGlsZFsicmV0dXJuIl09YixiPWIuY2hpbGR9ZnVuY3Rpb24gZihhKXtyZXR1cm4gNT09PWEudGFnfHwzPT09YS50YWd8fDQ9PT1hLnRhZ31mdW5jdGlvbiBnKGEpe2Zvcih2YXIgYj1hLGM9ITEsZj12b2lkIDAsZz12b2lkIDA7Oyl7aWYoIWMpe2M9YlsicmV0dXJuIl07YTpmb3IoOzspe251bGw9PT1jP2woIjE2MCIpOnZvaWQgMDtzd2l0Y2goYy50YWcpe2Nhc2UgNTpmPWMuc3RhdGVOb2RlO2c9ITE7YnJlYWsgYTtjYXNlIDM6Zj1jLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO2c9ITA7YnJlYWsgYTtjYXNlIDQ6Zj1jLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO2c9ITA7YnJlYWsgYX1jPWNbInJldHVybiJdfWM9ITB9aWYoNT09PWIudGFnfHw2PT09Yi50YWcpZShiKSxnP0IoZixiLnN0YXRlTm9kZSk6dyhmLGIuc3RhdGVOb2RlKTtlbHNlIGlmKDQ9PT1iLnRhZz9mPWIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm86ZChiKSxudWxsIT09CmIuY2hpbGQpe2IuY2hpbGRbInJldHVybiJdPWI7Yj1iLmNoaWxkO2NvbnRpbnVlfWlmKGI9PT1hKWJyZWFrO2Zvcig7bnVsbD09PWIuc2libGluZzspe2lmKG51bGw9PT1iWyJyZXR1cm4iXXx8YlsicmV0dXJuIl09PT1hKXJldHVybjtiPWJbInJldHVybiJdOzQ9PT1iLnRhZyYmKGM9ITEpfWIuc2libGluZ1sicmV0dXJuIl09YlsicmV0dXJuIl07Yj1iLnNpYmxpbmd9fXZhciBrPWEuZ2V0UHVibGljSW5zdGFuY2UsaD1hLm11dGF0aW9uO2E9YS5wZXJzaXN0ZW5jZTtofHwoYT9sKCIyMzUiKTpsKCIyMzYiKSk7dmFyIHA9aC5jb21taXRNb3VudCxBPWguY29tbWl0VXBkYXRlLEQ9aC5yZXNldFRleHRDb250ZW50LHQ9aC5jb21taXRUZXh0VXBkYXRlLG49aC5hcHBlbmRDaGlsZCxMPWguYXBwZW5kQ2hpbGRUb0NvbnRhaW5lcixhYT1oLmluc2VydEJlZm9yZSx1PWguaW5zZXJ0SW5Db250YWluZXJCZWZvcmUsdz1oLnJlbW92ZUNoaWxkLEI9aC5yZW1vdmVDaGlsZEZyb21Db250YWluZXI7CnJldHVybntjb21taXRSZXNldFRleHRDb250ZW50OmZ1bmN0aW9uKGEpe0QoYS5zdGF0ZU5vZGUpfSxjb21taXRQbGFjZW1lbnQ6ZnVuY3Rpb24oYSl7YTp7Zm9yKHZhciBiPWFbInJldHVybiJdO251bGwhPT1iOyl7aWYoZihiKSl7dmFyIGM9YjticmVhayBhfWI9YlsicmV0dXJuIl19bCgiMTYwIik7Yz12b2lkIDB9dmFyIGQ9Yj12b2lkIDA7c3dpdGNoKGMudGFnKXtjYXNlIDU6Yj1jLnN0YXRlTm9kZTtkPSExO2JyZWFrO2Nhc2UgMzpiPWMuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87ZD0hMDticmVhaztjYXNlIDQ6Yj1jLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO2Q9ITA7YnJlYWs7ZGVmYXVsdDpsKCIxNjEiKX1jLmVmZmVjdFRhZyYxNiYmKEQoYiksYy5lZmZlY3RUYWcmPS0xNyk7YTpiOmZvcihjPWE7Oyl7Zm9yKDtudWxsPT09Yy5zaWJsaW5nOyl7aWYobnVsbD09PWNbInJldHVybiJdfHxmKGNbInJldHVybiJdKSl7Yz1udWxsO2JyZWFrIGF9Yz1jWyJyZXR1cm4iXX1jLnNpYmxpbmdbInJldHVybiJdPQpjWyJyZXR1cm4iXTtmb3IoYz1jLnNpYmxpbmc7NSE9PWMudGFnJiY2IT09Yy50YWc7KXtpZihjLmVmZmVjdFRhZyYyKWNvbnRpbnVlIGI7aWYobnVsbD09PWMuY2hpbGR8fDQ9PT1jLnRhZyljb250aW51ZSBiO2Vsc2UgYy5jaGlsZFsicmV0dXJuIl09YyxjPWMuY2hpbGR9aWYoIShjLmVmZmVjdFRhZyYyKSl7Yz1jLnN0YXRlTm9kZTticmVhayBhfX1mb3IodmFyIGU9YTs7KXtpZig1PT09ZS50YWd8fDY9PT1lLnRhZyljP2Q/dShiLGUuc3RhdGVOb2RlLGMpOmFhKGIsZS5zdGF0ZU5vZGUsYyk6ZD9MKGIsZS5zdGF0ZU5vZGUpOm4oYixlLnN0YXRlTm9kZSk7ZWxzZSBpZig0IT09ZS50YWcmJm51bGwhPT1lLmNoaWxkKXtlLmNoaWxkWyJyZXR1cm4iXT1lO2U9ZS5jaGlsZDtjb250aW51ZX1pZihlPT09YSlicmVhaztmb3IoO251bGw9PT1lLnNpYmxpbmc7KXtpZihudWxsPT09ZVsicmV0dXJuIl18fGVbInJldHVybiJdPT09YSlyZXR1cm47ZT1lWyJyZXR1cm4iXX1lLnNpYmxpbmdbInJldHVybiJdPQplWyJyZXR1cm4iXTtlPWUuc2libGluZ319LGNvbW1pdERlbGV0aW9uOmZ1bmN0aW9uKGEpe2coYSk7YVsicmV0dXJuIl09bnVsbDthLmNoaWxkPW51bGw7YS5hbHRlcm5hdGUmJihhLmFsdGVybmF0ZS5jaGlsZD1udWxsLGEuYWx0ZXJuYXRlWyJyZXR1cm4iXT1udWxsKX0sY29tbWl0V29yazpmdW5jdGlvbihhLGIpe3N3aXRjaChiLnRhZyl7Y2FzZSAyOmJyZWFrO2Nhc2UgNTp2YXIgYz1iLnN0YXRlTm9kZTtpZihudWxsIT1jKXt2YXIgZD1iLm1lbW9pemVkUHJvcHM7YT1udWxsIT09YT9hLm1lbW9pemVkUHJvcHM6ZDt2YXIgZT1iLnR5cGUsZj1iLnVwZGF0ZVF1ZXVlO2IudXBkYXRlUXVldWU9bnVsbDtudWxsIT09ZiYmQShjLGYsZSxhLGQsYil9YnJlYWs7Y2FzZSA2Om51bGw9PT1iLnN0YXRlTm9kZT9sKCIxNjIiKTp2b2lkIDA7Yz1iLm1lbW9pemVkUHJvcHM7dChiLnN0YXRlTm9kZSxudWxsIT09YT9hLm1lbW9pemVkUHJvcHM6YyxjKTticmVhaztjYXNlIDM6YnJlYWs7ZGVmYXVsdDpsKCIxNjMiKX19LApjb21taXRMaWZlQ3ljbGVzOmZ1bmN0aW9uKGEsYil7c3dpdGNoKGIudGFnKXtjYXNlIDI6dmFyIGM9Yi5zdGF0ZU5vZGU7aWYoYi5lZmZlY3RUYWcmNClpZihudWxsPT09YSljLnByb3BzPWIubWVtb2l6ZWRQcm9wcyxjLnN0YXRlPWIubWVtb2l6ZWRTdGF0ZSxjLmNvbXBvbmVudERpZE1vdW50KCk7ZWxzZXt2YXIgZD1hLm1lbW9pemVkUHJvcHM7YT1hLm1lbW9pemVkU3RhdGU7Yy5wcm9wcz1iLm1lbW9pemVkUHJvcHM7Yy5zdGF0ZT1iLm1lbW9pemVkU3RhdGU7Yy5jb21wb25lbnREaWRVcGRhdGUoZCxhKX1iPWIudXBkYXRlUXVldWU7bnVsbCE9PWImJmNlKGIsYyk7YnJlYWs7Y2FzZSAzOmM9Yi51cGRhdGVRdWV1ZTtudWxsIT09YyYmY2UoYyxudWxsIT09Yi5jaGlsZD9iLmNoaWxkLnN0YXRlTm9kZTpudWxsKTticmVhaztjYXNlIDU6Yz1iLnN0YXRlTm9kZTtudWxsPT09YSYmYi5lZmZlY3RUYWcmNCYmcChjLGIudHlwZSxiLm1lbW9pemVkUHJvcHMsYik7YnJlYWs7Y2FzZSA2OmJyZWFrOwpjYXNlIDQ6YnJlYWs7ZGVmYXVsdDpsKCIxNjMiKX19LGNvbW1pdEF0dGFjaFJlZjpmdW5jdGlvbihhKXt2YXIgYj1hLnJlZjtpZihudWxsIT09Yil7dmFyIGM9YS5zdGF0ZU5vZGU7c3dpdGNoKGEudGFnKXtjYXNlIDU6YihrKGMpKTticmVhaztkZWZhdWx0OmIoYyl9fX0sY29tbWl0RGV0YWNoUmVmOmZ1bmN0aW9uKGEpe2E9YS5yZWY7bnVsbCE9PWEmJmEobnVsbCl9fX0sZGE9e30sWWY9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXthPT09ZGE/bCgiMTc0Iik6dm9pZCAwO3JldHVybiBhfXZhciBjPWEuZ2V0Q2hpbGRIb3N0Q29udGV4dCxkPWEuZ2V0Um9vdEhvc3RDb250ZXh0LGU9e2N1cnJlbnQ6ZGF9LGY9e2N1cnJlbnQ6ZGF9LGc9e2N1cnJlbnQ6ZGF9O3JldHVybntnZXRIb3N0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybiBiKGUuY3VycmVudCl9LGdldFJvb3RIb3N0Q29udGFpbmVyOmZ1bmN0aW9uKCl7cmV0dXJuIGIoZy5jdXJyZW50KX0scG9wSG9zdENvbnRhaW5lcjpmdW5jdGlvbihhKXtJKGUsCmEpO0koZixhKTtJKGcsYSl9LHBvcEhvc3RDb250ZXh0OmZ1bmN0aW9uKGEpe2YuY3VycmVudD09PWEmJihJKGUsYSksSShmLGEpKX0scHVzaEhvc3RDb250YWluZXI6ZnVuY3Rpb24oYSxiKXtOKGcsYixhKTtiPWQoYik7TihmLGEsYSk7TihlLGIsYSl9LHB1c2hIb3N0Q29udGV4dDpmdW5jdGlvbihhKXt2YXIgZD1iKGcuY3VycmVudCksaz1iKGUuY3VycmVudCk7ZD1jKGssYS50eXBlLGQpO2shPT1kJiYoTihmLGEsYSksTihlLGQsYSkpfSxyZXNldEhvc3RDb250YWluZXI6ZnVuY3Rpb24oKXtlLmN1cnJlbnQ9ZGE7Zy5jdXJyZW50PWRhfX19LFpmPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz1uZXcgUSg1LG51bGwsMCk7Yy50eXBlPSJERUxFVEVEIjtjLnN0YXRlTm9kZT1iO2NbInJldHVybiJdPWE7Yy5lZmZlY3RUYWc9ODtudWxsIT09YS5sYXN0RWZmZWN0PyhhLmxhc3RFZmZlY3QubmV4dEVmZmVjdD1jLGEubGFzdEVmZmVjdD1jKTphLmZpcnN0RWZmZWN0PWEubGFzdEVmZmVjdD0KY31mdW5jdGlvbiBjKGEsYil7c3dpdGNoKGEudGFnKXtjYXNlIDU6cmV0dXJuIGI9ZihiLGEudHlwZSxhLnBlbmRpbmdQcm9wcyksbnVsbCE9PWI/KGEuc3RhdGVOb2RlPWIsITApOiExO2Nhc2UgNjpyZXR1cm4gYj1nKGIsYS5wZW5kaW5nUHJvcHMpLG51bGwhPT1iPyhhLnN0YXRlTm9kZT1iLCEwKTohMTtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBkKGEpe2ZvcihhPWFbInJldHVybiJdO251bGwhPT1hJiY1IT09YS50YWcmJjMhPT1hLnRhZzspYT1hWyJyZXR1cm4iXTtEPWF9dmFyIGU9YS5zaG91bGRTZXRUZXh0Q29udGVudDthPWEuaHlkcmF0aW9uO2lmKCFhKXJldHVybntlbnRlckh5ZHJhdGlvblN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHJlc2V0SHlkcmF0aW9uU3RhdGU6ZnVuY3Rpb24oKXt9LHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlOmZ1bmN0aW9uKCl7fSxwcmVwYXJlVG9IeWRyYXRlSG9zdEluc3RhbmNlOmZ1bmN0aW9uKCl7bCgiMTc1Iil9LHByZXBhcmVUb0h5ZHJhdGVIb3N0VGV4dEluc3RhbmNlOmZ1bmN0aW9uKCl7bCgiMTc2Iil9LApwb3BIeWRyYXRpb25TdGF0ZTpmdW5jdGlvbihhKXtyZXR1cm4hMX19O3ZhciBmPWEuY2FuSHlkcmF0ZUluc3RhbmNlLGc9YS5jYW5IeWRyYXRlVGV4dEluc3RhbmNlLGs9YS5nZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcsaD1hLmdldEZpcnN0SHlkcmF0YWJsZUNoaWxkLHA9YS5oeWRyYXRlSW5zdGFuY2UsQT1hLmh5ZHJhdGVUZXh0SW5zdGFuY2UsRD1udWxsLHQ9bnVsbCxuPSExO3JldHVybntlbnRlckh5ZHJhdGlvblN0YXRlOmZ1bmN0aW9uKGEpe3Q9aChhLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtEPWE7cmV0dXJuIG49ITB9LHJlc2V0SHlkcmF0aW9uU3RhdGU6ZnVuY3Rpb24oKXt0PUQ9bnVsbDtuPSExfSx0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZTpmdW5jdGlvbihhKXtpZihuKXt2YXIgZD10O2lmKGQpe2lmKCFjKGEsZCkpe2Q9ayhkKTtpZighZHx8IWMoYSxkKSl7YS5lZmZlY3RUYWd8PTI7bj0hMTtEPWE7cmV0dXJufWIoRCx0KX1EPWE7dD1oKGQpfWVsc2UgYS5lZmZlY3RUYWd8PQoyLG49ITEsRD1hfX0scHJlcGFyZVRvSHlkcmF0ZUhvc3RJbnN0YW5jZTpmdW5jdGlvbihhLGIsYyl7Yj1wKGEuc3RhdGVOb2RlLGEudHlwZSxhLm1lbW9pemVkUHJvcHMsYixjLGEpO2EudXBkYXRlUXVldWU9YjtyZXR1cm4gbnVsbCE9PWI/ITA6ITF9LHByZXBhcmVUb0h5ZHJhdGVIb3N0VGV4dEluc3RhbmNlOmZ1bmN0aW9uKGEpe3JldHVybiBBKGEuc3RhdGVOb2RlLGEubWVtb2l6ZWRQcm9wcyxhKX0scG9wSHlkcmF0aW9uU3RhdGU6ZnVuY3Rpb24oYSl7aWYoYSE9PUQpcmV0dXJuITE7aWYoIW4pcmV0dXJuIGQoYSksbj0hMCwhMTt2YXIgYz1hLnR5cGU7aWYoNSE9PWEudGFnfHwiaGVhZCIhPT1jJiYiYm9keSIhPT1jJiYhZShjLGEubWVtb2l6ZWRQcm9wcykpZm9yKGM9dDtjOyliKGEsYyksYz1rKGMpO2QoYSk7dD1EP2soYS5zdGF0ZU5vZGUpOm51bGw7cmV0dXJuITB9fX0sYWc9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXtaPUdhPSEwO3ZhciBiPWEuc3RhdGVOb2RlO2IuY3VycmVudD09PQphP2woIjE3NyIpOnZvaWQgMDtiLmlzUmVhZHlGb3JDb21taXQ9ITE7YmIuY3VycmVudD1udWxsO2lmKDE8YS5lZmZlY3RUYWcpaWYobnVsbCE9PWEubGFzdEVmZmVjdCl7YS5sYXN0RWZmZWN0Lm5leHRFZmZlY3Q9YTt2YXIgYz1hLmZpcnN0RWZmZWN0fWVsc2UgYz1hO2Vsc2UgYz1hLmZpcnN0RWZmZWN0O3lhKCk7Zm9yKHI9YztudWxsIT09cjspe3ZhciBkPSExLGU9dm9pZCAwO3RyeXtmb3IoO251bGwhPT1yOyl7dmFyIGY9ci5lZmZlY3RUYWc7ZiYxNiYmYmEocik7aWYoZiYxMjgpe3ZhciBnPXIuYWx0ZXJuYXRlO251bGwhPT1nJiZ2YShnKX1zd2l0Y2goZiYtMjQyKXtjYXNlIDI6WChyKTtyLmVmZmVjdFRhZyY9LTM7YnJlYWs7Y2FzZSA2Olgocik7ci5lZmZlY3RUYWcmPS0zO2VhKHIuYWx0ZXJuYXRlLHIpO2JyZWFrO2Nhc2UgNDplYShyLmFsdGVybmF0ZSxyKTticmVhaztjYXNlIDg6a2E9ITAsY2Eociksa2E9ITF9cj1yLm5leHRFZmZlY3R9fWNhdGNoKEljKXtkPSEwLGU9SWN9ZCYmCihudWxsPT09cj9sKCIxNzgiKTp2b2lkIDAsayhyLGUpLG51bGwhPT1yJiYocj1yLm5leHRFZmZlY3QpKX16YSgpO2IuY3VycmVudD1hO2ZvcihyPWM7bnVsbCE9PXI7KXtjPSExO2Q9dm9pZCAwO3RyeXtmb3IoO251bGwhPT1yOyl7dmFyIGg9ci5lZmZlY3RUYWc7aCYzNiYmcmEoci5hbHRlcm5hdGUscik7aCYxMjgmJnVhKHIpO2lmKGgmNjQpc3dpdGNoKGU9cixmPXZvaWQgMCxudWxsIT09UyYmKGY9Uy5nZXQoZSksU1siZGVsZXRlIl0oZSksbnVsbD09ZiYmbnVsbCE9PWUuYWx0ZXJuYXRlJiYoZT1lLmFsdGVybmF0ZSxmPVMuZ2V0KGUpLFNbImRlbGV0ZSJdKGUpKSksbnVsbD09Zj9sKCIxODQiKTp2b2lkIDAsZS50YWcpe2Nhc2UgMjplLnN0YXRlTm9kZS5jb21wb25lbnREaWRDYXRjaChmLmVycm9yLHtjb21wb25lbnRTdGFjazpmLmNvbXBvbmVudFN0YWNrfSk7YnJlYWs7Y2FzZSAzOm51bGw9PT1uYSYmKG5hPWYuZXJyb3IpO2JyZWFrO2RlZmF1bHQ6bCgiMTU3Iil9dmFyIGNiPQpyLm5leHRFZmZlY3Q7ci5uZXh0RWZmZWN0PW51bGw7cj1jYn19Y2F0Y2goSWMpe2M9ITAsZD1JY31jJiYobnVsbD09PXI/bCgiMTc4Iik6dm9pZCAwLGsocixkKSxudWxsIT09ciYmKHI9ci5uZXh0RWZmZWN0KSl9R2E9Wj0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIFpkJiZaZChhLnN0YXRlTm9kZSk7d2EmJih3YS5mb3JFYWNoKHcpLHdhPW51bGwpO251bGwhPT1uYSYmKGE9bmEsbmE9bnVsbCx5KGEpKTtiPWIuY3VycmVudC5leHBpcmF0aW9uVGltZTswPT09YiYmKEhhPVM9bnVsbCk7cmV0dXJuIGJ9ZnVuY3Rpb24gYyhhKXtmb3IoOzspe3ZhciBiPVQoYS5hbHRlcm5hdGUsYSxNKSxjPWFbInJldHVybiJdLGQ9YS5zaWJsaW5nO3ZhciBlPWE7aWYoMjE0NzQ4MzY0Nz09PU18fDIxNDc0ODM2NDchPT1lLmV4cGlyYXRpb25UaW1lKXtpZigyIT09ZS50YWcmJjMhPT1lLnRhZyl2YXIgZj0wO2Vsc2UgZj1lLnVwZGF0ZVF1ZXVlLGY9bnVsbD09PWY/MDpmLmV4cGlyYXRpb25UaW1lO2Zvcih2YXIgZz0KZS5jaGlsZDtudWxsIT09ZzspMCE9PWcuZXhwaXJhdGlvblRpbWUmJigwPT09Znx8Zj5nLmV4cGlyYXRpb25UaW1lKSYmKGY9Zy5leHBpcmF0aW9uVGltZSksZz1nLnNpYmxpbmc7ZS5leHBpcmF0aW9uVGltZT1mfWlmKG51bGwhPT1iKXJldHVybiBiO251bGwhPT1jJiYobnVsbD09PWMuZmlyc3RFZmZlY3QmJihjLmZpcnN0RWZmZWN0PWEuZmlyc3RFZmZlY3QpLG51bGwhPT1hLmxhc3RFZmZlY3QmJihudWxsIT09Yy5sYXN0RWZmZWN0JiYoYy5sYXN0RWZmZWN0Lm5leHRFZmZlY3Q9YS5maXJzdEVmZmVjdCksYy5sYXN0RWZmZWN0PWEubGFzdEVmZmVjdCksMTxhLmVmZmVjdFRhZyYmKG51bGwhPT1jLmxhc3RFZmZlY3Q/Yy5sYXN0RWZmZWN0Lm5leHRFZmZlY3Q9YTpjLmZpcnN0RWZmZWN0PWEsYy5sYXN0RWZmZWN0PWEpKTtpZihudWxsIT09ZClyZXR1cm4gZDtpZihudWxsIT09YylhPWM7ZWxzZXthLnN0YXRlTm9kZS5pc1JlYWR5Rm9yQ29tbWl0PSEwO2JyZWFrfX1yZXR1cm4gbnVsbH0KZnVuY3Rpb24gZChhKXt2YXIgYj14KGEuYWx0ZXJuYXRlLGEsTSk7bnVsbD09PWImJihiPWMoYSkpO2JiLmN1cnJlbnQ9bnVsbDtyZXR1cm4gYn1mdW5jdGlvbiBlKGEpe3ZhciBiPVEoYS5hbHRlcm5hdGUsYSxNKTtudWxsPT09YiYmKGI9YyhhKSk7YmIuY3VycmVudD1udWxsO3JldHVybiBifWZ1bmN0aW9uIGYoYSl7aWYobnVsbCE9PVMpe2lmKCEoMD09PU18fE0+YSkpaWYoTTw9amEpZm9yKDtudWxsIT09QzspQz1oKEMpP2UoQyk6ZChDKTtlbHNlIGZvcig7bnVsbCE9PUMmJiFxKCk7KUM9aChDKT9lKEMpOmQoQyl9ZWxzZSBpZighKDA9PT1NfHxNPmEpKWlmKE08PWphKWZvcig7bnVsbCE9PUM7KUM9ZChDKTtlbHNlIGZvcig7bnVsbCE9PUMmJiFxKCk7KUM9ZChDKX1mdW5jdGlvbiBnKGEsYil7R2E/bCgiMjQzIik6dm9pZCAwO0dhPSEwO2EuaXNSZWFkeUZvckNvbW1pdD0hMTtpZihhIT09VXx8YiE9PU18fG51bGw9PT1DKXtmb3IoOy0xPHRhOylyYlt0YV09bnVsbCx0YS0tO3NiPQptYTtsYS5jdXJyZW50PW1hO0ouY3VycmVudD0hMTtQKCk7VT1hO009YjtDPXViKFUuY3VycmVudCxudWxsLGIpfXZhciBjPSExLGQ9bnVsbDt0cnl7ZihiKX1jYXRjaChIYyl7Yz0hMCxkPUhjfWZvcig7Yzspe2lmKFYpe25hPWQ7YnJlYWt9dmFyIGc9QztpZihudWxsPT09ZylWPSEwO2Vsc2V7dmFyIGg9ayhnLGQpO251bGw9PT1oP2woIjE4MyIpOnZvaWQgMDtpZighVil7dHJ5e2M9aDtkPWI7Zm9yKGg9YztudWxsIT09Zzspe3N3aXRjaChnLnRhZyl7Y2FzZSAyOlVkKGcpO2JyZWFrO2Nhc2UgNTptKGcpO2JyZWFrO2Nhc2UgMzpJKGcpO2JyZWFrO2Nhc2UgNDpJKGcpfWlmKGc9PT1ofHxnLmFsdGVybmF0ZT09PWgpYnJlYWs7Zz1nWyJyZXR1cm4iXX1DPWUoYyk7ZihkKX1jYXRjaChIYyl7Yz0hMDtkPUhjO2NvbnRpbnVlfWJyZWFrfX19Yj1uYTtWPUdhPSExO25hPW51bGw7bnVsbCE9PWImJnkoYik7cmV0dXJuIGEuaXNSZWFkeUZvckNvbW1pdD9hLmN1cnJlbnQuYWx0ZXJuYXRlOm51bGx9CmZ1bmN0aW9uIGsoYSxiKXt2YXIgYz1iYi5jdXJyZW50PW51bGwsZD0hMSxlPSExLGY9bnVsbDtpZigzPT09YS50YWcpYz1hLG4oYSkmJihWPSEwKTtlbHNlIGZvcih2YXIgZz1hWyJyZXR1cm4iXTtudWxsIT09ZyYmbnVsbD09PWM7KXsyPT09Zy50YWc/ImZ1bmN0aW9uIj09PXR5cGVvZiBnLnN0YXRlTm9kZS5jb21wb25lbnREaWRDYXRjaCYmKGQ9ITAsZj1NYShnKSxjPWcsZT0hMCk6Mz09PWcudGFnJiYoYz1nKTtpZihuKGcpKXtpZihrYXx8bnVsbCE9PXdhJiYod2EuaGFzKGcpfHxudWxsIT09Zy5hbHRlcm5hdGUmJndhLmhhcyhnLmFsdGVybmF0ZSkpKXJldHVybiBudWxsO2M9bnVsbDtlPSExfWc9Z1sicmV0dXJuIl19aWYobnVsbCE9PWMpe251bGw9PT1IYSYmKEhhPW5ldyBTZXQpO0hhLmFkZChjKTt2YXIgaD0iIjtnPWE7ZG97YTpzd2l0Y2goZy50YWcpe2Nhc2UgMDpjYXNlIDE6Y2FzZSAyOmNhc2UgNTp2YXIgaz1nLl9kZWJ1Z093bmVyLGw9Zy5fZGVidWdTb3VyY2U7dmFyIG09Ck1hKGcpO3ZhciBjYj1udWxsO2smJihjYj1NYShrKSk7az1sO209IlxuICAgIGluICIrKG18fCJVbmtub3duIikrKGs/IiAoYXQgIitrLmZpbGVOYW1lLnJlcGxhY2UoL14uKltcXFwvXS8sIiIpKyI6IitrLmxpbmVOdW1iZXIrIikiOmNiPyIgKGNyZWF0ZWQgYnkgIitjYisiKSI6IiIpO2JyZWFrIGE7ZGVmYXVsdDptPSIifWgrPW07Zz1nWyJyZXR1cm4iXX13aGlsZShnKTtnPWg7YT1NYShhKTtudWxsPT09UyYmKFM9bmV3IE1hcCk7Yj17Y29tcG9uZW50TmFtZTphLGNvbXBvbmVudFN0YWNrOmcsZXJyb3I6YixlcnJvckJvdW5kYXJ5OmQ/Yy5zdGF0ZU5vZGU6bnVsbCxlcnJvckJvdW5kYXJ5Rm91bmQ6ZCxlcnJvckJvdW5kYXJ5TmFtZTpmLHdpbGxSZXRyeTplfTtTLnNldChjLGIpO3RyeXtjb25zb2xlLmVycm9yKGIuZXJyb3IpfWNhdGNoKCRmKXtjb25zb2xlLmVycm9yKCRmKX1aPyhudWxsPT09d2EmJih3YT1uZXcgU2V0KSx3YS5hZGQoYykpOncoYyk7cmV0dXJuIGN9bnVsbD09PQpuYSYmKG5hPWIpO3JldHVybiBudWxsfWZ1bmN0aW9uIGgoYSl7cmV0dXJuIG51bGwhPT1TJiYoUy5oYXMoYSl8fG51bGwhPT1hLmFsdGVybmF0ZSYmUy5oYXMoYS5hbHRlcm5hdGUpKX1mdW5jdGlvbiBuKGEpe3JldHVybiBudWxsIT09SGEmJihIYS5oYXMoYSl8fG51bGwhPT1hLmFsdGVybmF0ZSYmSGEuaGFzKGEuYWx0ZXJuYXRlKSl9ZnVuY3Rpb24gQSgpe3JldHVybiAyMCooKChCKCkrMTAwKS8yMHwwKSsxKX1mdW5jdGlvbiBwKGEpe3JldHVybiAwIT09QmE/QmE6R2E/Wj8xOk06IXhhfHxhLmludGVybmFsQ29udGV4dFRhZyYxP0EoKToxfWZ1bmN0aW9uIHQoYSxiKXtyZXR1cm4gdShhLGIsITEpfWZ1bmN0aW9uIHUoYSxiLGMpe2Zvcig7bnVsbCE9PWE7KXtpZigwPT09YS5leHBpcmF0aW9uVGltZXx8YS5leHBpcmF0aW9uVGltZT5iKWEuZXhwaXJhdGlvblRpbWU9YjtudWxsIT09YS5hbHRlcm5hdGUmJigwPT09YS5hbHRlcm5hdGUuZXhwaXJhdGlvblRpbWV8fGEuYWx0ZXJuYXRlLmV4cGlyYXRpb25UaW1lPgpiKSYmKGEuYWx0ZXJuYXRlLmV4cGlyYXRpb25UaW1lPWIpO2lmKG51bGw9PT1hWyJyZXR1cm4iXSlpZigzPT09YS50YWcpe2M9YS5zdGF0ZU5vZGU7IUdhJiZjPT09VSYmYjw9TSYmKEM9VT1udWxsLE09MCk7dmFyIGQ9YjtpYT5EYSYmbCgiMTg1Iik7aWYobnVsbD09PWMubmV4dFNjaGVkdWxlZFJvb3QpYy5yZW1haW5pbmdFeHBpcmF0aW9uVGltZT1kLG51bGw9PT1PPyhJYT1PPWMsYy5uZXh0U2NoZWR1bGVkUm9vdD1jKTooTz1PLm5leHRTY2hlZHVsZWRSb290PWMsTy5uZXh0U2NoZWR1bGVkUm9vdD1JYSk7ZWxzZXt2YXIgZT1jLnJlbWFpbmluZ0V4cGlyYXRpb25UaW1lO2lmKDA9PT1lfHxkPGUpYy5yZW1haW5pbmdFeHBpcmF0aW9uVGltZT1kfVJ8fChDYT9oYSYmdihjLDEpOjE9PT1kP0UoMSxudWxsKTpXfHwoVz0hMCxwYShHKSkpfWVsc2UgYnJlYWs7YT1hWyJyZXR1cm4iXX19ZnVuY3Rpb24gdyhhKXt1KGEsMSwhMCl9ZnVuY3Rpb24gQigpe3JldHVybiBqYT0oKG9hKCktQWEpLwoxMHwwKSsyfWZ1bmN0aW9uIEYoKXt2YXIgYT0wLGI9bnVsbDtpZihudWxsIT09Tylmb3IodmFyIGM9TyxkPUlhO251bGwhPT1kOyl7dmFyIGU9ZC5yZW1haW5pbmdFeHBpcmF0aW9uVGltZTtpZigwPT09ZSl7bnVsbD09PWN8fG51bGw9PT1PP2woIjI0NCIpOnZvaWQgMDtpZihkPT09ZC5uZXh0U2NoZWR1bGVkUm9vdCl7SWE9Tz1kLm5leHRTY2hlZHVsZWRSb290PW51bGw7YnJlYWt9ZWxzZSBpZihkPT09SWEpSWE9ZT1kLm5leHRTY2hlZHVsZWRSb290LE8ubmV4dFNjaGVkdWxlZFJvb3Q9ZSxkLm5leHRTY2hlZHVsZWRSb290PW51bGw7ZWxzZSBpZihkPT09Tyl7Tz1jO08ubmV4dFNjaGVkdWxlZFJvb3Q9SWE7ZC5uZXh0U2NoZWR1bGVkUm9vdD1udWxsO2JyZWFrfWVsc2UgYy5uZXh0U2NoZWR1bGVkUm9vdD1kLm5leHRTY2hlZHVsZWRSb290LGQubmV4dFNjaGVkdWxlZFJvb3Q9bnVsbDtkPWMubmV4dFNjaGVkdWxlZFJvb3R9ZWxzZXtpZigwPT09YXx8ZTxhKWE9ZSxiPWQ7aWYoZD09PQpPKWJyZWFrO2M9ZDtkPWQubmV4dFNjaGVkdWxlZFJvb3R9fWM9SmE7bnVsbCE9PWMmJmM9PT1iP2lhKys6aWE9MDtKYT1iO2RhPWF9ZnVuY3Rpb24gRyhhKXtFKDAsYSl9ZnVuY3Rpb24gRShhLGIpe1k9Yjtmb3IoRigpO251bGwhPT1KYSYmMCE9PWRhJiYoMD09PWF8fGRhPD1hKSYmIXFhOyl2KEphLGRhKSxGKCk7bnVsbCE9PVkmJihXPSExKTtudWxsPT09SmF8fFd8fChXPSEwLHBhKEcpKTtZPW51bGw7cWE9ITE7aWE9MDtpZihmYSl0aHJvdyBhPXNhLHNhPW51bGwsZmE9ITEsYTt9ZnVuY3Rpb24gdihhLGMpe1I/bCgiMjQ1Iik6dm9pZCAwO1I9ITA7aWYoYzw9QigpKXt2YXIgZD1hLmZpbmlzaGVkV29yaztudWxsIT09ZD8oYS5maW5pc2hlZFdvcms9bnVsbCxhLnJlbWFpbmluZ0V4cGlyYXRpb25UaW1lPWIoZCkpOihhLmZpbmlzaGVkV29yaz1udWxsLGQ9ZyhhLGMpLG51bGwhPT1kJiYoYS5yZW1haW5pbmdFeHBpcmF0aW9uVGltZT1iKGQpKSl9ZWxzZSBkPWEuZmluaXNoZWRXb3JrLApudWxsIT09ZD8oYS5maW5pc2hlZFdvcms9bnVsbCxhLnJlbWFpbmluZ0V4cGlyYXRpb25UaW1lPWIoZCkpOihhLmZpbmlzaGVkV29yaz1udWxsLGQ9ZyhhLGMpLG51bGwhPT1kJiYocSgpP2EuZmluaXNoZWRXb3JrPWQ6YS5yZW1haW5pbmdFeHBpcmF0aW9uVGltZT1iKGQpKSk7Uj0hMX1mdW5jdGlvbiBxKCl7cmV0dXJuIG51bGw9PT1ZfHxZLnRpbWVSZW1haW5pbmcoKT5FYT8hMTpxYT0hMH1mdW5jdGlvbiB5KGEpe251bGw9PT1KYT9sKCIyNDYiKTp2b2lkIDA7SmEucmVtYWluaW5nRXhwaXJhdGlvblRpbWU9MDtmYXx8KGZhPSEwLHNhPWEpfXZhciB6PVlmKGEpLEg9WmYoYSksST16LnBvcEhvc3RDb250YWluZXIsbT16LnBvcEhvc3RDb250ZXh0LFA9ei5yZXNldEhvc3RDb250YWluZXIsTj1WZihhLHosSCx0LHApLHg9Ti5iZWdpbldvcmssUT1OLmJlZ2luRmFpbGVkV29yayxUPVdmKGEseixIKS5jb21wbGV0ZVdvcms7ej1YZihhLGspO3ZhciBiYT16LmNvbW1pdFJlc2V0VGV4dENvbnRlbnQsClg9ei5jb21taXRQbGFjZW1lbnQsY2E9ei5jb21taXREZWxldGlvbixlYT16LmNvbW1pdFdvcmsscmE9ei5jb21taXRMaWZlQ3ljbGVzLHVhPXouY29tbWl0QXR0YWNoUmVmLHZhPXouY29tbWl0RGV0YWNoUmVmLG9hPWEubm93LHBhPWEuc2NoZWR1bGVEZWZlcnJlZENhbGxiYWNrLHhhPWEudXNlU3luY1NjaGVkdWxpbmcseWE9YS5wcmVwYXJlRm9yQ29tbWl0LHphPWEucmVzZXRBZnRlckNvbW1pdCxBYT1vYSgpLGphPTIsQmE9MCxHYT0hMSxDPW51bGwsVT1udWxsLE09MCxyPW51bGwsUz1udWxsLEhhPW51bGwsd2E9bnVsbCxuYT1udWxsLFY9ITEsWj0hMSxrYT0hMSxJYT1udWxsLE89bnVsbCxXPSExLFI9ITEsSmE9bnVsbCxkYT0wLHFhPSExLGZhPSExLHNhPW51bGwsWT1udWxsLENhPSExLGhhPSExLERhPTFFMyxpYT0wLEVhPTE7cmV0dXJue2NvbXB1dGVBc3luY0V4cGlyYXRpb246QSxjb21wdXRlRXhwaXJhdGlvbkZvckZpYmVyOnAsc2NoZWR1bGVXb3JrOnQsYmF0Y2hlZFVwZGF0ZXM6ZnVuY3Rpb24oYSwKYil7dmFyIGM9Q2E7Q2E9ITA7dHJ5e3JldHVybiBhKGIpfWZpbmFsbHl7KENhPWMpfHxSfHxFKDEsbnVsbCl9fSx1bmJhdGNoZWRVcGRhdGVzOmZ1bmN0aW9uKGEpe2lmKENhJiYhaGEpe2hhPSEwO3RyeXtyZXR1cm4gYSgpfWZpbmFsbHl7aGE9ITF9fXJldHVybiBhKCl9LGZsdXNoU3luYzpmdW5jdGlvbihhKXt2YXIgYj1DYTtDYT0hMDt0cnl7YTp7dmFyIGM9QmE7QmE9MTt0cnl7dmFyIGQ9YSgpO2JyZWFrIGF9ZmluYWxseXtCYT1jfWQ9dm9pZCAwfXJldHVybiBkfWZpbmFsbHl7Q2E9YixSP2woIjE4NyIpOnZvaWQgMCxFKDEsbnVsbCl9fSxkZWZlcnJlZFVwZGF0ZXM6ZnVuY3Rpb24oYSl7dmFyIGI9QmE7QmE9QSgpO3RyeXtyZXR1cm4gYSgpfWZpbmFsbHl7QmE9Yn19fX0sS2U9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXthPW9mKGEpO3JldHVybiBudWxsPT09YT9udWxsOmEuc3RhdGVOb2RlfXZhciBjPWEuZ2V0UHVibGljSW5zdGFuY2U7YT1hZyhhKTt2YXIgZD1hLmNvbXB1dGVBc3luY0V4cGlyYXRpb24sCmU9YS5jb21wdXRlRXhwaXJhdGlvbkZvckZpYmVyLGY9YS5zY2hlZHVsZVdvcms7cmV0dXJue2NyZWF0ZUNvbnRhaW5lcjpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBRKDMsbnVsbCwwKTthPXtjdXJyZW50OmMsY29udGFpbmVySW5mbzphLHBlbmRpbmdDaGlsZHJlbjpudWxsLHJlbWFpbmluZ0V4cGlyYXRpb25UaW1lOjAsaXNSZWFkeUZvckNvbW1pdDohMSxmaW5pc2hlZFdvcms6bnVsbCxjb250ZXh0Om51bGwscGVuZGluZ0NvbnRleHQ6bnVsbCxoeWRyYXRlOmIsbmV4dFNjaGVkdWxlZFJvb3Q6bnVsbH07cmV0dXJuIGMuc3RhdGVOb2RlPWF9LHVwZGF0ZUNvbnRhaW5lcjpmdW5jdGlvbihhLGIsYyxuKXt2YXIgZz1iLmN1cnJlbnQ7aWYoYyl7Yz1jLl9yZWFjdEludGVybmFsRmliZXI7dmFyIGg7Yjp7Mj09PU5hKGMpJiYyPT09Yy50YWc/dm9pZCAwOmwoIjE3MCIpO2ZvcihoPWM7MyE9PWgudGFnOyl7aWYoUmEoaCkpe2g9aC5zdGF0ZU5vZGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQ7CmJyZWFrIGJ9KGg9aFsicmV0dXJuIl0pP3ZvaWQgMDpsKCIxNzEiKX1oPWguc3RhdGVOb2RlLmNvbnRleHR9Yz1SYShjKT9XZChjLGgpOmh9ZWxzZSBjPW1hO251bGw9PT1iLmNvbnRleHQ/Yi5jb250ZXh0PWM6Yi5wZW5kaW5nQ29udGV4dD1jO2I9bjtiPXZvaWQgMD09PWI/bnVsbDpiO249bnVsbCE9YSYmbnVsbCE9YS50eXBlJiZudWxsIT1hLnR5cGUucHJvdG90eXBlJiYhMD09PWEudHlwZS5wcm90b3R5cGUudW5zdGFibGVfaXNBc3luY1JlYWN0Q29tcG9uZW50P2QoKTplKGcpO3hiKGcse2V4cGlyYXRpb25UaW1lOm4scGFydGlhbFN0YXRlOntlbGVtZW50OmF9LGNhbGxiYWNrOmIsaXNSZXBsYWNlOiExLGlzRm9yY2VkOiExLG5leHRDYWxsYmFjazpudWxsLG5leHQ6bnVsbH0pO2YoZyxuKX0sYmF0Y2hlZFVwZGF0ZXM6YS5iYXRjaGVkVXBkYXRlcyx1bmJhdGNoZWRVcGRhdGVzOmEudW5iYXRjaGVkVXBkYXRlcyxkZWZlcnJlZFVwZGF0ZXM6YS5kZWZlcnJlZFVwZGF0ZXMsZmx1c2hTeW5jOmEuZmx1c2hTeW5jLApnZXRQdWJsaWNSb290SW5zdGFuY2U6ZnVuY3Rpb24oYSl7YT1hLmN1cnJlbnQ7aWYoIWEuY2hpbGQpcmV0dXJuIG51bGw7c3dpdGNoKGEuY2hpbGQudGFnKXtjYXNlIDU6cmV0dXJuIGMoYS5jaGlsZC5zdGF0ZU5vZGUpO2RlZmF1bHQ6cmV0dXJuIGEuY2hpbGQuc3RhdGVOb2RlfX0sZmluZEhvc3RJbnN0YW5jZTpiLGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzOmZ1bmN0aW9uKGEpe2E9cGYoYSk7cmV0dXJuIG51bGw9PT1hP251bGw6YS5zdGF0ZU5vZGV9LGluamVjdEludG9EZXZUb29sczpmdW5jdGlvbihhKXt2YXIgYz1hLmZpbmRGaWJlckJ5SG9zdEluc3RhbmNlO3JldHVybiBzZihCKHt9LGEse2ZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyOmZ1bmN0aW9uKGEpe3JldHVybiBiKGEpfSxmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTpmdW5jdGlvbihhKXtyZXR1cm4gYz9jKGEpOm51bGx9fSkpfX19LExlPU9iamVjdC5mcmVlemUoe2RlZmF1bHQ6S2V9KSxKYz1MZSYmS2V8fExlLGJnPQpKY1siZGVmYXVsdCJdP0pjWyJkZWZhdWx0Il06SmMsTWU9Im9iamVjdCI9PT10eXBlb2YgcGVyZm9ybWFuY2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgcGVyZm9ybWFuY2Uubm93LE5lPXZvaWQgMDtOZT1NZT9mdW5jdGlvbigpe3JldHVybiBwZXJmb3JtYW5jZS5ub3coKX06ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKX07dmFyIEZiPXZvaWQgMDtpZihILmNhblVzZURPTSlpZigiZnVuY3Rpb24iIT09dHlwZW9mIHJlcXVlc3RJZGxlQ2FsbGJhY2spe3ZhciBLYz1udWxsLExjPSExLE1jPSExLEdiPTAsSGI9MzMsZGI9MzM7dmFyIGNnPU1lP3t0aW1lUmVtYWluaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIEdiLXBlcmZvcm1hbmNlLm5vdygpfX06e3RpbWVSZW1haW5pbmc6ZnVuY3Rpb24oKXtyZXR1cm4gR2ItRGF0ZS5ub3coKX19O3ZhciBPZT0iX19yZWFjdElkbGVDYWxsYmFjayQiK01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwKZnVuY3Rpb24oYSl7YS5zb3VyY2U9PT13aW5kb3cmJmEuZGF0YT09PU9lJiYoTGM9ITEsYT1LYyxLYz1udWxsLG51bGwhPT1hJiZhKGNnKSl9LCExKTt2YXIgZGc9ZnVuY3Rpb24oYSl7TWM9ITE7dmFyIGI9YS1HYitkYjtiPGRiJiZIYjxkYj8oOD5iJiYoYj04KSxkYj1iPEhiP0hiOmIpOkhiPWI7R2I9YStkYjtMY3x8KExjPSEwLHdpbmRvdy5wb3N0TWVzc2FnZShPZSwiKiIpKX07RmI9ZnVuY3Rpb24oYSl7S2M9YTtNY3x8KE1jPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShkZykpO3JldHVybiAwfX1lbHNlIEZiPXJlcXVlc3RJZGxlQ2FsbGJhY2s7ZWxzZSBGYj1mdW5jdGlvbihhKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YSh7dGltZVJlbWFpbmluZzpmdW5jdGlvbigpe3JldHVybiBJbmZpbml0eX19KX0pO3JldHVybiAwfTt2YXIgd2Y9L15bOkEtWl9hLXpcdTAwQzAtXHUwMEQ2XHUwMEQ4LVx1MDBGNlx1MDBGOC1cdTAyRkZcdTAzNzAtXHUwMzdEXHUwMzdGLVx1MUZGRlx1MjAwQy1cdTIwMERcdTIwNzAtXHUyMThGXHUyQzAwLVx1MkZFRlx1MzAwMS1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZGRF1bOkEtWl9hLXpcdTAwQzAtXHUwMEQ2XHUwMEQ4LVx1MDBGNlx1MDBGOC1cdTAyRkZcdTAzNzAtXHUwMzdEXHUwMzdGLVx1MUZGRlx1MjAwQy1cdTIwMERcdTIwNzAtXHUyMThGXHUyQzAwLVx1MkZFRlx1MzAwMS1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZGRFwtLjAtOVx1MDBCN1x1MDMwMC1cdTAzNkZcdTIwM0YtXHUyMDQwXSokLywKZ2U9e30sZmU9e30sSWI9dm9pZCAwLHdjPWZ1bmN0aW9uKGEpe3JldHVybiJ1bmRlZmluZWQiIT09dHlwZW9mIE1TQXBwJiZNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbj9mdW5jdGlvbihiLGMsZCxlKXtNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbihmdW5jdGlvbigpe3JldHVybiBhKGIsYyxkLGUpfSl9OmF9KGZ1bmN0aW9uKGEsYil7aWYoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiE9PWEubmFtZXNwYWNlVVJJfHwiaW5uZXJIVE1MImluIGEpYS5pbm5lckhUTUw9YjtlbHNle0liPUlifHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtJYi5pbm5lckhUTUw9Ilx4M2NzdmdceDNlIitiKyJceDNjL3N2Z1x4M2UiO2ZvcihiPUliLmZpcnN0Q2hpbGQ7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWEuYXBwZW5kQ2hpbGQoYi5maXJzdENoaWxkKX19KSxlZz0vWyInJjw+XS8sUGU9ZnVuY3Rpb24oYSwKYil7aWYoYil7dmFyIGM9YS5maXJzdENoaWxkO2lmKGMmJmM9PT1hLmxhc3RDaGlsZCYmMz09PWMubm9kZVR5cGUpe2Mubm9kZVZhbHVlPWI7cmV0dXJufX1hLnRleHRDb250ZW50PWJ9O0guY2FuVXNlRE9NJiYoInRleHRDb250ZW50ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8KFBlPWZ1bmN0aW9uKGEsYil7aWYoMz09PWEubm9kZVR5cGUpYS5ub2RlVmFsdWU9YjtlbHNle2lmKCJib29sZWFuIj09PXR5cGVvZiBifHwibnVtYmVyIj09PXR5cGVvZiBiKWI9IiIrYjtlbHNle2I9IiIrYjt2YXIgYz1lZy5leGVjKGIpO2lmKGMpe3ZhciBkPSIiLGUsZj0wO2ZvcihlPWMuaW5kZXg7ZTxiLmxlbmd0aDtlKyspe3N3aXRjaChiLmNoYXJDb2RlQXQoZSkpe2Nhc2UgMzQ6Yz0iXHgyNnF1b3Q7IjticmVhaztjYXNlIDM4OmM9Ilx4MjZhbXA7IjticmVhaztjYXNlIDM5OmM9Ilx4MjYjeDI3OyI7YnJlYWs7Y2FzZSA2MDpjPSJceDI2bHQ7IjticmVhaztjYXNlIDYyOmM9Ilx4MjZndDsiOwpicmVhaztkZWZhdWx0OmNvbnRpbnVlfWYhPT1lJiYoZCs9Yi5zdWJzdHJpbmcoZixlKSk7Zj1lKzE7ZCs9Y31iPWYhPT1lP2QrYi5zdWJzdHJpbmcoZixlKTpkfX13YyhhLGIpfX0pKTt2YXIgeGM9UGUsWmE9e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGJvcmRlckltYWdlT3V0c2V0OiEwLGJvcmRlckltYWdlU2xpY2U6ITAsYm9yZGVySW1hZ2VXaWR0aDohMCxib3hGbGV4OiEwLGJveEZsZXhHcm91cDohMCxib3hPcmRpbmFsR3JvdXA6ITAsY29sdW1uQ291bnQ6ITAsY29sdW1uczohMCxmbGV4OiEwLGZsZXhHcm93OiEwLGZsZXhQb3NpdGl2ZTohMCxmbGV4U2hyaW5rOiEwLGZsZXhOZWdhdGl2ZTohMCxmbGV4T3JkZXI6ITAsZ3JpZFJvdzohMCxncmlkUm93RW5kOiEwLGdyaWRSb3dTcGFuOiEwLGdyaWRSb3dTdGFydDohMCxncmlkQ29sdW1uOiEwLGdyaWRDb2x1bW5FbmQ6ITAsZ3JpZENvbHVtblNwYW46ITAsZ3JpZENvbHVtblN0YXJ0OiEwLGZvbnRXZWlnaHQ6ITAsbGluZUNsYW1wOiEwLApsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx0YWJTaXplOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMCxmaWxsT3BhY2l0eTohMCxmbG9vZE9wYWNpdHk6ITAsc3RvcE9wYWNpdHk6ITAsc3Ryb2tlRGFzaGFycmF5OiEwLHN0cm9rZURhc2hvZmZzZXQ6ITAsc3Ryb2tlTWl0ZXJsaW1pdDohMCxzdHJva2VPcGFjaXR5OiEwLHN0cm9rZVdpZHRoOiEwfSxmZz1bIldlYmtpdCIsIm1zIiwiTW96IiwiTyJdO09iamVjdC5rZXlzKFphKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2ZnLmZvckVhY2goZnVuY3Rpb24oYil7Yj1iK2EuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYS5zdWJzdHJpbmcoMSk7WmFbYl09WmFbYV19KX0pO3ZhciB5Zj1CKHttZW51aXRlbTohMH0se2FyZWE6ITAsYmFzZTohMCxicjohMCxjb2w6ITAsZW1iZWQ6ITAsaHI6ITAsaW1nOiEwLGlucHV0OiEwLGtleWdlbjohMCxsaW5rOiEwLG1ldGE6ITAscGFyYW06ITAsc291cmNlOiEwLHRyYWNrOiEwLAp3YnI6ITB9KSwkYT1FLnRoYXRSZXR1cm5zKCIiKSxSPXt0b3BBYm9ydDoiYWJvcnQiLHRvcENhblBsYXk6ImNhbnBsYXkiLHRvcENhblBsYXlUaHJvdWdoOiJjYW5wbGF5dGhyb3VnaCIsdG9wRHVyYXRpb25DaGFuZ2U6ImR1cmF0aW9uY2hhbmdlIix0b3BFbXB0aWVkOiJlbXB0aWVkIix0b3BFbmNyeXB0ZWQ6ImVuY3J5cHRlZCIsdG9wRW5kZWQ6ImVuZGVkIix0b3BFcnJvcjoiZXJyb3IiLHRvcExvYWRlZERhdGE6ImxvYWRlZGRhdGEiLHRvcExvYWRlZE1ldGFkYXRhOiJsb2FkZWRtZXRhZGF0YSIsdG9wTG9hZFN0YXJ0OiJsb2Fkc3RhcnQiLHRvcFBhdXNlOiJwYXVzZSIsdG9wUGxheToicGxheSIsdG9wUGxheWluZzoicGxheWluZyIsdG9wUHJvZ3Jlc3M6InByb2dyZXNzIix0b3BSYXRlQ2hhbmdlOiJyYXRlY2hhbmdlIix0b3BTZWVrZWQ6InNlZWtlZCIsdG9wU2Vla2luZzoic2Vla2luZyIsdG9wU3RhbGxlZDoic3RhbGxlZCIsdG9wU3VzcGVuZDoic3VzcGVuZCIsdG9wVGltZVVwZGF0ZToidGltZXVwZGF0ZSIsCnRvcFZvbHVtZUNoYW5nZToidm9sdW1lY2hhbmdlIix0b3BXYWl0aW5nOiJ3YWl0aW5nIn0sZ2c9T2JqZWN0LmZyZWV6ZSh7Y3JlYXRlRWxlbWVudDpxZSxjcmVhdGVUZXh0Tm9kZTpyZSxzZXRJbml0aWFsUHJvcGVydGllczpzZSxkaWZmUHJvcGVydGllczp0ZSx1cGRhdGVQcm9wZXJ0aWVzOnVlLGRpZmZIeWRyYXRlZFByb3BlcnRpZXM6dmUsZGlmZkh5ZHJhdGVkVGV4dDp3ZSx3YXJuRm9yVW5tYXRjaGVkVGV4dDpmdW5jdGlvbihhLGIpe30sd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlRWxlbWVudDpmdW5jdGlvbihhLGIpe30sd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlVGV4dDpmdW5jdGlvbihhLGIpe30sd2FybkZvckluc2VydGVkSHlkcmF0ZWRFbGVtZW50OmZ1bmN0aW9uKGEsYixjKXt9LHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dDpmdW5jdGlvbihhLGIpe30scmVzdG9yZUNvbnRyb2xsZWRTdGF0ZTpmdW5jdGlvbihhLGIsYyl7c3dpdGNoKGIpe2Nhc2UgImlucHV0IjpxYyhhLApjKTtiPWMubmFtZTtpZigicmFkaW8iPT09Yy50eXBlJiZudWxsIT1iKXtmb3IoYz1hO2MucGFyZW50Tm9kZTspYz1jLnBhcmVudE5vZGU7Yz1jLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W25hbWVceDNkIitKU09OLnN0cmluZ2lmeSgiIitiKSsnXVt0eXBlXHgzZCJyYWRpbyJdJyk7Zm9yKGI9MDtiPGMubGVuZ3RoO2IrKyl7dmFyIGQ9Y1tiXTtpZihkIT09YSYmZC5mb3JtPT09YS5mb3JtKXt2YXIgZT1aYyhkKTtlP3ZvaWQgMDpsKCI5MCIpO3FjKGQsZSl9fX1icmVhaztjYXNlICJ0ZXh0YXJlYSI6bWUoYSxjKTticmVhaztjYXNlICJzZWxlY3QiOmI9Yy52YWx1ZSxudWxsIT1iJiZXKGEsISFjLm11bHRpcGxlLGIsITEpfX19KTtIZS5pbmplY3RGaWJlckNvbnRyb2xsZWRIb3N0Q29tcG9uZW50KGdnKTt2YXIgTmM9bnVsbCxPYz1udWxsLEY9Ymcoe2dldFJvb3RIb3N0Q29udGV4dDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVUeXBlO3N3aXRjaChiKXtjYXNlIDk6Y2FzZSAxMTphPShhPQphLmRvY3VtZW50RWxlbWVudCk/YS5uYW1lc3BhY2VVUkk6dGMobnVsbCwiIik7YnJlYWs7ZGVmYXVsdDpiPTg9PT1iP2EucGFyZW50Tm9kZTphLGE9Yi5uYW1lc3BhY2VVUkl8fG51bGwsYj1iLnRhZ05hbWUsYT10YyhhLGIpfXJldHVybiBhfSxnZXRDaGlsZEhvc3RDb250ZXh0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRjKGEsYil9LGdldFB1YmxpY0luc3RhbmNlOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxwcmVwYXJlRm9yQ29tbWl0OmZ1bmN0aW9uKCl7TmM9T2E7dmFyIGE9YmMoKTtpZigkYihhKSl7aWYoInNlbGVjdGlvblN0YXJ0ImluIGEpdmFyIGI9e3N0YXJ0OmEuc2VsZWN0aW9uU3RhcnQsZW5kOmEuc2VsZWN0aW9uRW5kfTtlbHNlIGE6e3ZhciBjPXdpbmRvdy5nZXRTZWxlY3Rpb24mJndpbmRvdy5nZXRTZWxlY3Rpb24oKTtpZihjJiYwIT09Yy5yYW5nZUNvdW50KXtiPWMuYW5jaG9yTm9kZTt2YXIgZD1jLmFuY2hvck9mZnNldCxlPWMuZm9jdXNOb2RlO2M9Yy5mb2N1c09mZnNldDsKdHJ5e2Iubm9kZVR5cGUsZS5ub2RlVHlwZX1jYXRjaChLKXtiPW51bGw7YnJlYWsgYX12YXIgZj0wLGc9LTEsaz0tMSxoPTAsbD0wLG49YSxwPW51bGw7Yjpmb3IoOzspe2Zvcih2YXIgdDs7KXtuIT09Ynx8MCE9PWQmJjMhPT1uLm5vZGVUeXBlfHwoZz1mK2QpO24hPT1lfHwwIT09YyYmMyE9PW4ubm9kZVR5cGV8fChrPWYrYyk7Mz09PW4ubm9kZVR5cGUmJihmKz1uLm5vZGVWYWx1ZS5sZW5ndGgpO2lmKG51bGw9PT0odD1uLmZpcnN0Q2hpbGQpKWJyZWFrO3A9bjtuPXR9Zm9yKDs7KXtpZihuPT09YSlicmVhayBiO3A9PT1iJiYrK2g9PT1kJiYoZz1mKTtwPT09ZSYmKytsPT09YyYmKGs9Zik7aWYobnVsbCE9PSh0PW4ubmV4dFNpYmxpbmcpKWJyZWFrO249cDtwPW4ucGFyZW50Tm9kZX1uPXR9Yj0tMT09PWd8fC0xPT09az9udWxsOntzdGFydDpnLGVuZDprfX1lbHNlIGI9bnVsbH1iPWJ8fHtzdGFydDowLGVuZDowfX1lbHNlIGI9bnVsbDtPYz17Zm9jdXNlZEVsZW06YSxzZWxlY3Rpb25SYW5nZTpifTsKWGIoITEpfSxyZXNldEFmdGVyQ29tbWl0OmZ1bmN0aW9uKCl7dmFyIGE9T2MsYj1iYygpLGM9YS5mb2N1c2VkRWxlbSxkPWEuc2VsZWN0aW9uUmFuZ2U7aWYoYiE9PWMmJkdkKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxjKSl7aWYoJGIoYykpaWYoYj1kLnN0YXJ0LGE9ZC5lbmQsdm9pZCAwPT09YSYmKGE9YiksInNlbGVjdGlvblN0YXJ0ImluIGMpYy5zZWxlY3Rpb25TdGFydD1iLGMuc2VsZWN0aW9uRW5kPU1hdGgubWluKGEsYy52YWx1ZS5sZW5ndGgpO2Vsc2UgaWYod2luZG93LmdldFNlbGVjdGlvbil7Yj13aW5kb3cuZ2V0U2VsZWN0aW9uKCk7dmFyIGU9Y1tjZCgpXS5sZW5ndGg7YT1NYXRoLm1pbihkLnN0YXJ0LGUpO2Q9dm9pZCAwPT09ZC5lbmQ/YTpNYXRoLm1pbihkLmVuZCxlKTshYi5leHRlbmQmJmE+ZCYmKGU9ZCxkPWEsYT1lKTtlPUpkKGMsYSk7dmFyIGY9SmQoYyxkKTtpZihlJiZmJiYoMSE9PWIucmFuZ2VDb3VudHx8Yi5hbmNob3JOb2RlIT09ZS5ub2RlfHxiLmFuY2hvck9mZnNldCE9PQplLm9mZnNldHx8Yi5mb2N1c05vZGUhPT1mLm5vZGV8fGIuZm9jdXNPZmZzZXQhPT1mLm9mZnNldCkpe3ZhciBnPWRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7Zy5zZXRTdGFydChlLm5vZGUsZS5vZmZzZXQpO2IucmVtb3ZlQWxsUmFuZ2VzKCk7YT5kPyhiLmFkZFJhbmdlKGcpLGIuZXh0ZW5kKGYubm9kZSxmLm9mZnNldCkpOihnLnNldEVuZChmLm5vZGUsZi5vZmZzZXQpLGIuYWRkUmFuZ2UoZykpfX1iPVtdO2ZvcihhPWM7YT1hLnBhcmVudE5vZGU7KTE9PT1hLm5vZGVUeXBlJiZiLnB1c2goe2VsZW1lbnQ6YSxsZWZ0OmEuc2Nyb2xsTGVmdCx0b3A6YS5zY3JvbGxUb3B9KTt0cnl7Yy5mb2N1cygpfWNhdGNoKGspe31mb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWE9YltjXSxhLmVsZW1lbnQuc2Nyb2xsTGVmdD1hLmxlZnQsYS5lbGVtZW50LnNjcm9sbFRvcD1hLnRvcH1PYz1udWxsO1hiKE5jKTtOYz1udWxsfSxjcmVhdGVJbnN0YW5jZTpmdW5jdGlvbihhLGIsYyxkLGUpe2E9cWUoYSxiLGMsCmQpO2FbUF09ZTthW2hhXT1iO3JldHVybiBhfSxhcHBlbmRJbml0aWFsQ2hpbGQ6ZnVuY3Rpb24oYSxiKXthLmFwcGVuZENoaWxkKGIpfSxmaW5hbGl6ZUluaXRpYWxDaGlsZHJlbjpmdW5jdGlvbihhLGIsYyxkKXtzZShhLGIsYyxkKTthOntzd2l0Y2goYil7Y2FzZSAiYnV0dG9uIjpjYXNlICJpbnB1dCI6Y2FzZSAic2VsZWN0IjpjYXNlICJ0ZXh0YXJlYSI6YT0hIWMuYXV0b0ZvY3VzO2JyZWFrIGF9YT0hMX1yZXR1cm4gYX0scHJlcGFyZVVwZGF0ZTpmdW5jdGlvbihhLGIsYyxkLGUsZil7cmV0dXJuIHRlKGEsYixjLGQsZSl9LHNob3VsZFNldFRleHRDb250ZW50OmZ1bmN0aW9uKGEsYil7cmV0dXJuInRleHRhcmVhIj09PWF8fCJzdHJpbmciPT09dHlwZW9mIGIuY2hpbGRyZW58fCJudW1iZXIiPT09dHlwZW9mIGIuY2hpbGRyZW58fCJvYmplY3QiPT09dHlwZW9mIGIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwmJm51bGwhPT1iLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MJiYic3RyaW5nIj09PQp0eXBlb2YgYi5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWx9LHNob3VsZERlcHJpb3JpdGl6ZVN1YnRyZWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWIuaGlkZGVufSxjcmVhdGVUZXh0SW5zdGFuY2U6ZnVuY3Rpb24oYSxiLGMsZCl7YT1yZShhLGIpO2FbUF09ZDtyZXR1cm4gYX0sbm93Ok5lLG11dGF0aW9uOntjb21taXRNb3VudDpmdW5jdGlvbihhLGIsYyxkKXthLmZvY3VzKCl9LGNvbW1pdFVwZGF0ZTpmdW5jdGlvbihhLGIsYyxkLGUsZil7YVtoYV09ZTt1ZShhLGIsYyxkLGUpfSxyZXNldFRleHRDb250ZW50OmZ1bmN0aW9uKGEpe2EudGV4dENvbnRlbnQ9IiJ9LGNvbW1pdFRleHRVcGRhdGU6ZnVuY3Rpb24oYSxiLGMpe2Eubm9kZVZhbHVlPWN9LGFwcGVuZENoaWxkOmZ1bmN0aW9uKGEsYil7YS5hcHBlbmRDaGlsZChiKX0sYXBwZW5kQ2hpbGRUb0NvbnRhaW5lcjpmdW5jdGlvbihhLGIpezg9PT1hLm5vZGVUeXBlP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYixhKToKYS5hcHBlbmRDaGlsZChiKX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKGEsYixjKXthLmluc2VydEJlZm9yZShiLGMpfSxpbnNlcnRJbkNvbnRhaW5lckJlZm9yZTpmdW5jdGlvbihhLGIsYyl7OD09PWEubm9kZVR5cGU/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShiLGMpOmEuaW5zZXJ0QmVmb3JlKGIsYyl9LHJlbW92ZUNoaWxkOmZ1bmN0aW9uKGEsYil7YS5yZW1vdmVDaGlsZChiKX0scmVtb3ZlQ2hpbGRGcm9tQ29udGFpbmVyOmZ1bmN0aW9uKGEsYil7OD09PWEubm9kZVR5cGU/YS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpOmEucmVtb3ZlQ2hpbGQoYil9fSxoeWRyYXRpb246e2Nhbkh5ZHJhdGVJbnN0YW5jZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIDEhPT1hLm5vZGVUeXBlfHxiLnRvTG93ZXJDYXNlKCkhPT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/bnVsbDphfSxjYW5IeWRyYXRlVGV4dEluc3RhbmNlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIiI9PT1ifHwzIT09YS5ub2RlVHlwZT8KbnVsbDphfSxnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmc6ZnVuY3Rpb24oYSl7Zm9yKGE9YS5uZXh0U2libGluZzthJiYxIT09YS5ub2RlVHlwZSYmMyE9PWEubm9kZVR5cGU7KWE9YS5uZXh0U2libGluZztyZXR1cm4gYX0sZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQ6ZnVuY3Rpb24oYSl7Zm9yKGE9YS5maXJzdENoaWxkO2EmJjEhPT1hLm5vZGVUeXBlJiYzIT09YS5ub2RlVHlwZTspYT1hLm5leHRTaWJsaW5nO3JldHVybiBhfSxoeWRyYXRlSW5zdGFuY2U6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2FbUF09ZjthW2hhXT1jO3JldHVybiB2ZShhLGIsYyxlLGQpfSxoeWRyYXRlVGV4dEluc3RhbmNlOmZ1bmN0aW9uKGEsYixjKXthW1BdPWM7cmV0dXJuIHdlKGEsYil9LGRpZE5vdE1hdGNoSHlkcmF0ZWRDb250YWluZXJUZXh0SW5zdGFuY2U6ZnVuY3Rpb24oYSxiLGMpe30sZGlkTm90TWF0Y2hIeWRyYXRlZFRleHRJbnN0YW5jZTpmdW5jdGlvbihhLGIsYyxkLGUpe30sZGlkTm90SHlkcmF0ZUNvbnRhaW5lckluc3RhbmNlOmZ1bmN0aW9uKGEsCmIpe30sZGlkTm90SHlkcmF0ZUluc3RhbmNlOmZ1bmN0aW9uKGEsYixjLGQpe30sZGlkTm90RmluZEh5ZHJhdGFibGVDb250YWluZXJJbnN0YW5jZTpmdW5jdGlvbihhLGIsYyl7fSxkaWROb3RGaW5kSHlkcmF0YWJsZUNvbnRhaW5lclRleHRJbnN0YW5jZTpmdW5jdGlvbihhLGIpe30sZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZTpmdW5jdGlvbihhLGIsYyxkLGUpe30sZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2U6ZnVuY3Rpb24oYSxiLGMsZCl7fX0sc2NoZWR1bGVEZWZlcnJlZENhbGxiYWNrOkZiLHVzZVN5bmNTY2hlZHVsaW5nOiEwfSk7VWI9Ri5iYXRjaGVkVXBkYXRlczt5ZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKGEsYil7Ri51cGRhdGVDb250YWluZXIoYSx0aGlzLl9yZWFjdFJvb3RDb250YWluZXIsbnVsbCxiKX07eWUucHJvdG90eXBlLnVubW91bnQ9ZnVuY3Rpb24oYSl7Ri51cGRhdGVDb250YWluZXIobnVsbCx0aGlzLl9yZWFjdFJvb3RDb250YWluZXIsCm51bGwsYSl9O3ZhciBRZT17Y3JlYXRlUG9ydGFsOnhlLGZpbmRET01Ob2RlOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpcmV0dXJuIG51bGw7aWYoMT09PWEubm9kZVR5cGUpcmV0dXJuIGE7dmFyIGI9YS5fcmVhY3RJbnRlcm5hbEZpYmVyO2lmKGIpcmV0dXJuIEYuZmluZEhvc3RJbnN0YW5jZShiKTsiZnVuY3Rpb24iPT09dHlwZW9mIGEucmVuZGVyP2woIjE4OCIpOmwoIjIxMyIsT2JqZWN0LmtleXMoYSkpfSxoeWRyYXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gQWIobnVsbCxhLGIsITAsYyl9LHJlbmRlcjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEFiKG51bGwsYSxiLCExLGMpfSx1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcjpmdW5jdGlvbihhLGIsYyxkKXtudWxsPT1hfHx2b2lkIDA9PT1hLl9yZWFjdEludGVybmFsRmliZXI/bCgiMzgiKTp2b2lkIDA7cmV0dXJuIEFiKGEsYixjLCExLGQpfSx1bm1vdW50Q29tcG9uZW50QXROb2RlOmZ1bmN0aW9uKGEpe3ljKGEpPwp2b2lkIDA6bCgiNDAiKTtyZXR1cm4gYS5fcmVhY3RSb290Q29udGFpbmVyPyhGLnVuYmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24oKXtBYihudWxsLG51bGwsYSwhMSxmdW5jdGlvbigpe2EuX3JlYWN0Um9vdENvbnRhaW5lcj1udWxsfSl9KSwhMCk6ITF9LHVuc3RhYmxlX2NyZWF0ZVBvcnRhbDp4ZSx1bnN0YWJsZV9iYXRjaGVkVXBkYXRlczpTYix1bnN0YWJsZV9kZWZlcnJlZFVwZGF0ZXM6Ri5kZWZlcnJlZFVwZGF0ZXMsZmx1c2hTeW5jOkYuZmx1c2hTeW5jLF9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEOntFdmVudFBsdWdpbkh1YjpGZixFdmVudFBsdWdpblJlZ2lzdHJ5OkVmLEV2ZW50UHJvcGFnYXRvcnM6R2YsUmVhY3RDb250cm9sbGVkQ29tcG9uZW50OktmLFJlYWN0RE9NQ29tcG9uZW50VHJlZTpGZSxSZWFjdERPTUV2ZW50TGlzdGVuZXI6TmZ9fTtGLmluamVjdEludG9EZXZUb29scyh7ZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6WSwKYnVuZGxlVHlwZTowLHZlcnNpb246IjE2LjEuMSIscmVuZGVyZXJQYWNrYWdlTmFtZToicmVhY3QtZG9tIn0pO3ZhciBSZT1PYmplY3QuZnJlZXplKHtkZWZhdWx0OlFlfSksUGM9UmUmJlFlfHxSZTtyZXR1cm4gUGNbImRlZmF1bHQiXT9QY1siZGVmYXVsdCJdOlBjfSk7Cg=="></script>
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKGdsb2JhbCxmYWN0b3J5KXt0eXBlb2YgZXhwb3J0cz09PSJvYmplY3QiJiZ0eXBlb2YgbW9kdWxlIT09InVuZGVmaW5lZCI/ZmFjdG9yeShleHBvcnRzLHJlcXVpcmUoInJlYWN0IikscmVxdWlyZSgicmVhY3QtZG9tIikpOnR5cGVvZiBkZWZpbmU9PT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kP2RlZmluZShbImV4cG9ydHMiLCJyZWFjdCIsInJlYWN0LWRvbSJdLGZhY3RvcnkpOmZhY3RvcnkoZ2xvYmFsLlNlbWlvdGljPXt9LGdsb2JhbC5SZWFjdCxnbG9iYWwuUmVhY3RET00pfSkodGhpcyxmdW5jdGlvbihleHBvcnRzLFJlYWN0LHJlYWN0RG9tKXsidXNlIHN0cmljdCI7dmFyIGNvbnN0YW50PWZ1bmN0aW9uKHgpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB4fX07dmFyIGppZ2dsZT1mdW5jdGlvbigpe3JldHVybihNYXRoLnJhbmRvbSgpLS41KSoxZS02fTt2YXIgdHJlZV9hZGQ9ZnVuY3Rpb24oZCl7dmFyIHg9K3RoaXMuX3guY2FsbChudWxsLGQpLHk9K3RoaXMuX3kuY2FsbChudWxsLGQpO3JldHVybiBhZGQodGhpcy5jb3Zlcih4LHkpLHgseSxkKX07ZnVuY3Rpb24gYWRkKHRyZWUseCx5LGQpe2lmKGlzTmFOKHgpfHxpc05hTih5KSlyZXR1cm4gdHJlZTt2YXIgcGFyZW50LG5vZGU9dHJlZS5fcm9vdCxsZWFmPXtkYXRhOmR9LHgwPXRyZWUuX3gwLHkwPXRyZWUuX3kwLHgxPXRyZWUuX3gxLHkxPXRyZWUuX3kxLHhtLHltLHhwLHlwLHJpZ2h0LGJvdHRvbSxpLGo7aWYoIW5vZGUpcmV0dXJuIHRyZWUuX3Jvb3Q9bGVhZix0cmVlO3doaWxlKG5vZGUubGVuZ3RoKXtpZihyaWdodD14Pj0oeG09KHgwK3gxKS8yKSl4MD14bTtlbHNlIHgxPXhtO2lmKGJvdHRvbT15Pj0oeW09KHkwK3kxKS8yKSl5MD15bTtlbHNlIHkxPXltO2lmKHBhcmVudD1ub2RlLCEobm9kZT1ub2RlW2k9Ym90dG9tPDwxfHJpZ2h0XSkpcmV0dXJuIHBhcmVudFtpXT1sZWFmLHRyZWV9eHA9K3RyZWUuX3guY2FsbChudWxsLG5vZGUuZGF0YSk7eXA9K3RyZWUuX3kuY2FsbChudWxsLG5vZGUuZGF0YSk7aWYoeD09PXhwJiZ5PT09eXApcmV0dXJuIGxlYWYubmV4dD1ub2RlLHBhcmVudD9wYXJlbnRbaV09bGVhZjp0cmVlLl9yb290PWxlYWYsdHJlZTtkb3twYXJlbnQ9cGFyZW50P3BhcmVudFtpXT1uZXcgQXJyYXkoNCk6dHJlZS5fcm9vdD1uZXcgQXJyYXkoNCk7aWYocmlnaHQ9eD49KHhtPSh4MCt4MSkvMikpeDA9eG07ZWxzZSB4MT14bTtpZihib3R0b209eT49KHltPSh5MCt5MSkvMikpeTA9eW07ZWxzZSB5MT15bX13aGlsZSgoaT1ib3R0b208PDF8cmlnaHQpPT09KGo9KHlwPj15bSk8PDF8eHA+PXhtKSk7cmV0dXJuIHBhcmVudFtqXT1ub2RlLHBhcmVudFtpXT1sZWFmLHRyZWV9ZnVuY3Rpb24gYWRkQWxsKGRhdGEpe3ZhciBkLGksbj1kYXRhLmxlbmd0aCx4LHkseHo9bmV3IEFycmF5KG4pLHl6PW5ldyBBcnJheShuKSx4MD1JbmZpbml0eSx5MD1JbmZpbml0eSx4MT0tSW5maW5pdHkseTE9LUluZmluaXR5O2ZvcihpPTA7aTxuOysraSl7aWYoaXNOYU4oeD0rdGhpcy5feC5jYWxsKG51bGwsZD1kYXRhW2ldKSl8fGlzTmFOKHk9K3RoaXMuX3kuY2FsbChudWxsLGQpKSljb250aW51ZTt4eltpXT14O3l6W2ldPXk7aWYoeDx4MCl4MD14O2lmKHg+eDEpeDE9eDtpZih5PHkwKXkwPXk7aWYoeT55MSl5MT15fWlmKHgxPHgwKXgwPXRoaXMuX3gwLHgxPXRoaXMuX3gxO2lmKHkxPHkwKXkwPXRoaXMuX3kwLHkxPXRoaXMuX3kxO3RoaXMuY292ZXIoeDAseTApLmNvdmVyKHgxLHkxKTtmb3IoaT0wO2k8bjsrK2kpe2FkZCh0aGlzLHh6W2ldLHl6W2ldLGRhdGFbaV0pfXJldHVybiB0aGlzfXZhciB0cmVlX2NvdmVyPWZ1bmN0aW9uKHgseSl7aWYoaXNOYU4oeD0reCl8fGlzTmFOKHk9K3kpKXJldHVybiB0aGlzO3ZhciB4MD10aGlzLl94MCx5MD10aGlzLl95MCx4MT10aGlzLl94MSx5MT10aGlzLl95MTtpZihpc05hTih4MCkpe3gxPSh4MD1NYXRoLmZsb29yKHgpKSsxO3kxPSh5MD1NYXRoLmZsb29yKHkpKSsxfWVsc2UgaWYoeDA+eHx8eD54MXx8eTA+eXx8eT55MSl7dmFyIHo9eDEteDAsbm9kZT10aGlzLl9yb290LHBhcmVudCxpO3N3aXRjaChpPSh5PCh5MCt5MSkvMik8PDF8eDwoeDAreDEpLzIpe2Nhc2UgMDp7ZG97cGFyZW50PW5ldyBBcnJheSg0KSxwYXJlbnRbaV09bm9kZSxub2RlPXBhcmVudH13aGlsZSh6Kj0yLHgxPXgwK3oseTE9eTAreix4PngxfHx5PnkxKTticmVha31jYXNlIDE6e2Rve3BhcmVudD1uZXcgQXJyYXkoNCkscGFyZW50W2ldPW5vZGUsbm9kZT1wYXJlbnR9d2hpbGUoeio9Mix4MD14MS16LHkxPXkwK3oseDA+eHx8eT55MSk7YnJlYWt9Y2FzZSAyOntkb3twYXJlbnQ9bmV3IEFycmF5KDQpLHBhcmVudFtpXT1ub2RlLG5vZGU9cGFyZW50fXdoaWxlKHoqPTIseDE9eDAreix5MD15MS16LHg+eDF8fHkwPnkpO2JyZWFrfWNhc2UgMzp7ZG97cGFyZW50PW5ldyBBcnJheSg0KSxwYXJlbnRbaV09bm9kZSxub2RlPXBhcmVudH13aGlsZSh6Kj0yLHgwPXgxLXoseTA9eTEteix4MD54fHx5MD55KTticmVha319aWYodGhpcy5fcm9vdCYmdGhpcy5fcm9vdC5sZW5ndGgpdGhpcy5fcm9vdD1ub2RlfWVsc2UgcmV0dXJuIHRoaXM7dGhpcy5feDA9eDA7dGhpcy5feTA9eTA7dGhpcy5feDE9eDE7dGhpcy5feTE9eTE7cmV0dXJuIHRoaXN9O3ZhciB0cmVlX2RhdGE9ZnVuY3Rpb24oKXt2YXIgZGF0YT1bXTt0aGlzLnZpc2l0KGZ1bmN0aW9uKG5vZGUpe2lmKCFub2RlLmxlbmd0aClkb3tkYXRhLnB1c2gobm9kZS5kYXRhKX13aGlsZShub2RlPW5vZGUubmV4dCl9KTtyZXR1cm4gZGF0YX07dmFyIHRyZWVfZXh0ZW50PWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuY292ZXIoK19bMF1bMF0sK19bMF1bMV0pLmNvdmVyKCtfWzFdWzBdLCtfWzFdWzFdKTppc05hTih0aGlzLl94MCk/dW5kZWZpbmVkOltbdGhpcy5feDAsdGhpcy5feTBdLFt0aGlzLl94MSx0aGlzLl95MV1dfTt2YXIgUXVhZD1mdW5jdGlvbihub2RlLHgwLHkwLHgxLHkxKXt0aGlzLm5vZGU9bm9kZTt0aGlzLngwPXgwO3RoaXMueTA9eTA7dGhpcy54MT14MTt0aGlzLnkxPXkxfTt2YXIgdHJlZV9maW5kPWZ1bmN0aW9uKHgseSxyYWRpdXMpe3ZhciBkYXRhLHgwPXRoaXMuX3gwLHkwPXRoaXMuX3kwLHgxLHkxLHgyLHkyLHgzPXRoaXMuX3gxLHkzPXRoaXMuX3kxLHF1YWRzPVtdLG5vZGU9dGhpcy5fcm9vdCxxLGk7aWYobm9kZSlxdWFkcy5wdXNoKG5ldyBRdWFkKG5vZGUseDAseTAseDMseTMpKTtpZihyYWRpdXM9PW51bGwpcmFkaXVzPUluZmluaXR5O2Vsc2V7eDA9eC1yYWRpdXMseTA9eS1yYWRpdXM7eDM9eCtyYWRpdXMseTM9eStyYWRpdXM7cmFkaXVzKj1yYWRpdXN9d2hpbGUocT1xdWFkcy5wb3AoKSl7aWYoIShub2RlPXEubm9kZSl8fCh4MT1xLngwKT54M3x8KHkxPXEueTApPnkzfHwoeDI9cS54MSk8eDB8fCh5Mj1xLnkxKTx5MCljb250aW51ZTtpZihub2RlLmxlbmd0aCl7dmFyIHhtPSh4MSt4MikvMix5bT0oeTEreTIpLzI7cXVhZHMucHVzaChuZXcgUXVhZChub2RlWzNdLHhtLHltLHgyLHkyKSxuZXcgUXVhZChub2RlWzJdLHgxLHltLHhtLHkyKSxuZXcgUXVhZChub2RlWzFdLHhtLHkxLHgyLHltKSxuZXcgUXVhZChub2RlWzBdLHgxLHkxLHhtLHltKSk7aWYoaT0oeT49eW0pPDwxfHg+PXhtKXtxPXF1YWRzW3F1YWRzLmxlbmd0aC0xXTtxdWFkc1txdWFkcy5sZW5ndGgtMV09cXVhZHNbcXVhZHMubGVuZ3RoLTEtaV07cXVhZHNbcXVhZHMubGVuZ3RoLTEtaV09cX19ZWxzZXt2YXIgZHg9eC0rdGhpcy5feC5jYWxsKG51bGwsbm9kZS5kYXRhKSxkeT15LSt0aGlzLl95LmNhbGwobnVsbCxub2RlLmRhdGEpLGQyPWR4KmR4K2R5KmR5O2lmKGQyPHJhZGl1cyl7dmFyIGQ9TWF0aC5zcXJ0KHJhZGl1cz1kMik7eDA9eC1kLHkwPXktZDt4Mz14K2QseTM9eStkO2RhdGE9bm9kZS5kYXRhfX19cmV0dXJuIGRhdGF9O3ZhciB0cmVlX3JlbW92ZT1mdW5jdGlvbihkKXtpZihpc05hTih4PSt0aGlzLl94LmNhbGwobnVsbCxkKSl8fGlzTmFOKHk9K3RoaXMuX3kuY2FsbChudWxsLGQpKSlyZXR1cm4gdGhpczt2YXIgcGFyZW50LG5vZGU9dGhpcy5fcm9vdCxyZXRhaW5lcixwcmV2aW91cyxuZXh0LHgwPXRoaXMuX3gwLHkwPXRoaXMuX3kwLHgxPXRoaXMuX3gxLHkxPXRoaXMuX3kxLHgseSx4bSx5bSxyaWdodCxib3R0b20saSxqO2lmKCFub2RlKXJldHVybiB0aGlzO2lmKG5vZGUubGVuZ3RoKXdoaWxlKHRydWUpe2lmKHJpZ2h0PXg+PSh4bT0oeDAreDEpLzIpKXgwPXhtO2Vsc2UgeDE9eG07aWYoYm90dG9tPXk+PSh5bT0oeTAreTEpLzIpKXkwPXltO2Vsc2UgeTE9eW07aWYoIShwYXJlbnQ9bm9kZSxub2RlPW5vZGVbaT1ib3R0b208PDF8cmlnaHRdKSlyZXR1cm4gdGhpcztpZighbm9kZS5sZW5ndGgpYnJlYWs7aWYocGFyZW50W2krMSYzXXx8cGFyZW50W2krMiYzXXx8cGFyZW50W2krMyYzXSlyZXRhaW5lcj1wYXJlbnQsaj1pfXdoaWxlKG5vZGUuZGF0YSE9PWQpe2lmKCEocHJldmlvdXM9bm9kZSxub2RlPW5vZGUubmV4dCkpcmV0dXJuIHRoaXN9aWYobmV4dD1ub2RlLm5leHQpZGVsZXRlIG5vZGUubmV4dDtpZihwcmV2aW91cylyZXR1cm4gbmV4dD9wcmV2aW91cy5uZXh0PW5leHQ6ZGVsZXRlIHByZXZpb3VzLm5leHQsdGhpcztpZighcGFyZW50KXJldHVybiB0aGlzLl9yb290PW5leHQsdGhpcztuZXh0P3BhcmVudFtpXT1uZXh0OmRlbGV0ZSBwYXJlbnRbaV07aWYoKG5vZGU9cGFyZW50WzBdfHxwYXJlbnRbMV18fHBhcmVudFsyXXx8cGFyZW50WzNdKSYmbm9kZT09PShwYXJlbnRbM118fHBhcmVudFsyXXx8cGFyZW50WzFdfHxwYXJlbnRbMF0pJiYhbm9kZS5sZW5ndGgpe2lmKHJldGFpbmVyKXJldGFpbmVyW2pdPW5vZGU7ZWxzZSB0aGlzLl9yb290PW5vZGV9cmV0dXJuIHRoaXN9O2Z1bmN0aW9uIHJlbW92ZUFsbChkYXRhKXtmb3IodmFyIGk9MCxuPWRhdGEubGVuZ3RoO2k8bjsrK2kpe3RoaXMucmVtb3ZlKGRhdGFbaV0pfXJldHVybiB0aGlzfXZhciB0cmVlX3Jvb3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcm9vdH07dmFyIHRyZWVfc2l6ZT1mdW5jdGlvbigpe3ZhciBzaXplPTA7dGhpcy52aXNpdChmdW5jdGlvbihub2RlKXtpZighbm9kZS5sZW5ndGgpZG97KytzaXplfXdoaWxlKG5vZGU9bm9kZS5uZXh0KX0pO3JldHVybiBzaXplfTt2YXIgdHJlZV92aXNpdD1mdW5jdGlvbihjYWxsYmFjayl7dmFyIHF1YWRzPVtdLHEsbm9kZT10aGlzLl9yb290LGNoaWxkLHgwLHkwLHgxLHkxO2lmKG5vZGUpcXVhZHMucHVzaChuZXcgUXVhZChub2RlLHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSk7d2hpbGUocT1xdWFkcy5wb3AoKSl7aWYoIWNhbGxiYWNrKG5vZGU9cS5ub2RlLHgwPXEueDAseTA9cS55MCx4MT1xLngxLHkxPXEueTEpJiZub2RlLmxlbmd0aCl7dmFyIHhtPSh4MCt4MSkvMix5bT0oeTAreTEpLzI7aWYoY2hpbGQ9bm9kZVszXSlxdWFkcy5wdXNoKG5ldyBRdWFkKGNoaWxkLHhtLHltLHgxLHkxKSk7aWYoY2hpbGQ9bm9kZVsyXSlxdWFkcy5wdXNoKG5ldyBRdWFkKGNoaWxkLHgwLHltLHhtLHkxKSk7aWYoY2hpbGQ9bm9kZVsxXSlxdWFkcy5wdXNoKG5ldyBRdWFkKGNoaWxkLHhtLHkwLHgxLHltKSk7aWYoY2hpbGQ9bm9kZVswXSlxdWFkcy5wdXNoKG5ldyBRdWFkKGNoaWxkLHgwLHkwLHhtLHltKSl9fXJldHVybiB0aGlzfTt2YXIgdHJlZV92aXNpdEFmdGVyPWZ1bmN0aW9uKGNhbGxiYWNrKXt2YXIgcXVhZHM9W10sbmV4dD1bXSxxO2lmKHRoaXMuX3Jvb3QpcXVhZHMucHVzaChuZXcgUXVhZCh0aGlzLl9yb290LHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSk7d2hpbGUocT1xdWFkcy5wb3AoKSl7dmFyIG5vZGU9cS5ub2RlO2lmKG5vZGUubGVuZ3RoKXt2YXIgY2hpbGQseDA9cS54MCx5MD1xLnkwLHgxPXEueDEseTE9cS55MSx4bT0oeDAreDEpLzIseW09KHkwK3kxKS8yO2lmKGNoaWxkPW5vZGVbMF0pcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCx4MCx5MCx4bSx5bSkpO2lmKGNoaWxkPW5vZGVbMV0pcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCx4bSx5MCx4MSx5bSkpO2lmKGNoaWxkPW5vZGVbMl0pcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCx4MCx5bSx4bSx5MSkpO2lmKGNoaWxkPW5vZGVbM10pcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCx4bSx5bSx4MSx5MSkpfW5leHQucHVzaChxKX13aGlsZShxPW5leHQucG9wKCkpe2NhbGxiYWNrKHEubm9kZSxxLngwLHEueTAscS54MSxxLnkxKX1yZXR1cm4gdGhpc307ZnVuY3Rpb24gZGVmYXVsdFgoZCl7cmV0dXJuIGRbMF19dmFyIHRyZWVfeD1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5feD1fLHRoaXMpOnRoaXMuX3h9O2Z1bmN0aW9uIGRlZmF1bHRZKGQpe3JldHVybiBkWzFdfXZhciB0cmVlX3k9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3k9Xyx0aGlzKTp0aGlzLl95fTtmdW5jdGlvbiBxdWFkdHJlZShub2Rlcyx4LHkpe3ZhciB0cmVlPW5ldyBRdWFkdHJlZSh4PT1udWxsP2RlZmF1bHRYOngseT09bnVsbD9kZWZhdWx0WTp5LE5hTixOYU4sTmFOLE5hTik7cmV0dXJuIG5vZGVzPT1udWxsP3RyZWU6dHJlZS5hZGRBbGwobm9kZXMpfWZ1bmN0aW9uIFF1YWR0cmVlKHgseSx4MCx5MCx4MSx5MSl7dGhpcy5feD14O3RoaXMuX3k9eTt0aGlzLl94MD14MDt0aGlzLl95MD15MDt0aGlzLl94MT14MTt0aGlzLl95MT15MTt0aGlzLl9yb290PXVuZGVmaW5lZH1mdW5jdGlvbiBsZWFmX2NvcHkobGVhZil7dmFyIGNvcHk9e2RhdGE6bGVhZi5kYXRhfSxuZXh0PWNvcHk7d2hpbGUobGVhZj1sZWFmLm5leHQpe25leHQ9bmV4dC5uZXh0PXtkYXRhOmxlYWYuZGF0YX19cmV0dXJuIGNvcHl9dmFyIHRyZWVQcm90bz1xdWFkdHJlZS5wcm90b3R5cGU9UXVhZHRyZWUucHJvdG90eXBlO3RyZWVQcm90by5jb3B5PWZ1bmN0aW9uKCl7dmFyIGNvcHk9bmV3IFF1YWR0cmVlKHRoaXMuX3gsdGhpcy5feSx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSksbm9kZT10aGlzLl9yb290LG5vZGVzLGNoaWxkO2lmKCFub2RlKXJldHVybiBjb3B5O2lmKCFub2RlLmxlbmd0aClyZXR1cm4gY29weS5fcm9vdD1sZWFmX2NvcHkobm9kZSksY29weTtub2Rlcz1be3NvdXJjZTpub2RlLHRhcmdldDpjb3B5Ll9yb290PW5ldyBBcnJheSg0KX1dO3doaWxlKG5vZGU9bm9kZXMucG9wKCkpe2Zvcih2YXIgaT0wO2k8NDsrK2kpe2lmKGNoaWxkPW5vZGUuc291cmNlW2ldKXtpZihjaGlsZC5sZW5ndGgpbm9kZXMucHVzaCh7c291cmNlOmNoaWxkLHRhcmdldDpub2RlLnRhcmdldFtpXT1uZXcgQXJyYXkoNCl9KTtlbHNlIG5vZGUudGFyZ2V0W2ldPWxlYWZfY29weShjaGlsZCl9fX1yZXR1cm4gY29weX07dHJlZVByb3RvLmFkZD10cmVlX2FkZDt0cmVlUHJvdG8uYWRkQWxsPWFkZEFsbDt0cmVlUHJvdG8uY292ZXI9dHJlZV9jb3Zlcjt0cmVlUHJvdG8uZGF0YT10cmVlX2RhdGE7dHJlZVByb3RvLmV4dGVudD10cmVlX2V4dGVudDt0cmVlUHJvdG8uZmluZD10cmVlX2ZpbmQ7dHJlZVByb3RvLnJlbW92ZT10cmVlX3JlbW92ZTt0cmVlUHJvdG8ucmVtb3ZlQWxsPXJlbW92ZUFsbDt0cmVlUHJvdG8ucm9vdD10cmVlX3Jvb3Q7dHJlZVByb3RvLnNpemU9dHJlZV9zaXplO3RyZWVQcm90by52aXNpdD10cmVlX3Zpc2l0O3RyZWVQcm90by52aXNpdEFmdGVyPXRyZWVfdmlzaXRBZnRlcjt0cmVlUHJvdG8ueD10cmVlX3g7dHJlZVByb3RvLnk9dHJlZV95O2Z1bmN0aW9uIHgoZCl7cmV0dXJuIGQueCtkLnZ4fWZ1bmN0aW9uIHkoZCl7cmV0dXJuIGQueStkLnZ5fXZhciBmb3JjZUNvbGxpZGU9ZnVuY3Rpb24ocmFkaXVzKXt2YXIgbm9kZXMscmFkaWksc3RyZW5ndGg9MSxpdGVyYXRpb25zPTE7aWYodHlwZW9mIHJhZGl1cyE9PSJmdW5jdGlvbiIpcmFkaXVzPWNvbnN0YW50KHJhZGl1cz09bnVsbD8xOityYWRpdXMpO2Z1bmN0aW9uIGZvcmNlKCl7dmFyIGksbj1ub2Rlcy5sZW5ndGgsdHJlZSxub2RlLHhpLHlpLHJpLHJpMjtmb3IodmFyIGs9MDtrPGl0ZXJhdGlvbnM7KytrKXt0cmVlPXF1YWR0cmVlKG5vZGVzLHgseSkudmlzaXRBZnRlcihwcmVwYXJlKTtmb3IoaT0wO2k8bjsrK2kpe25vZGU9bm9kZXNbaV07cmk9cmFkaWlbaV0scmkyPXJpKnJpO3hpPW5vZGUueCtub2RlLnZ4O3lpPW5vZGUueStub2RlLnZ5O3RyZWUudmlzaXQoYXBwbHkpfX1mdW5jdGlvbiBhcHBseShxdWFkLHgwLHkwLHgxLHkxKXt2YXIgZGF0YT1xdWFkLmRhdGEscmo9cXVhZC5yLHI9cmkrcmo7aWYoZGF0YSl7aWYoZGF0YS5pbmRleD5pKXt2YXIgeD14aS1kYXRhLngtZGF0YS52eCx5PXlpLWRhdGEueS1kYXRhLnZ5LGw9eCp4K3kqeTtpZihsPHIqcil7aWYoeD09PTApeD1qaWdnbGUoKSxsKz14Kng7aWYoeT09PTApeT1qaWdnbGUoKSxsKz15Knk7bD0oci0obD1NYXRoLnNxcnQobCkpKS9sKnN0cmVuZ3RoO25vZGUudngrPSh4Kj1sKSoocj0ocmoqPXJqKS8ocmkyK3JqKSk7bm9kZS52eSs9KHkqPWwpKnI7ZGF0YS52eC09eCoocj0xLXIpO2RhdGEudnktPXkqcn19cmV0dXJufXJldHVybiB4MD54aStyfHx4MTx4aS1yfHx5MD55aStyfHx5MTx5aS1yfX1mdW5jdGlvbiBwcmVwYXJlKHF1YWQpe2lmKHF1YWQuZGF0YSlyZXR1cm4gcXVhZC5yPXJhZGlpW3F1YWQuZGF0YS5pbmRleF07Zm9yKHZhciBpPXF1YWQucj0wO2k8NDsrK2kpe2lmKHF1YWRbaV0mJnF1YWRbaV0ucj5xdWFkLnIpe3F1YWQucj1xdWFkW2ldLnJ9fX1mb3JjZS5pbml0aWFsaXplPWZ1bmN0aW9uKF8pe3ZhciBpLG49KG5vZGVzPV8pLmxlbmd0aDtyYWRpaT1uZXcgQXJyYXkobik7Zm9yKGk9MDtpPG47KytpKXtyYWRpaVtpXT0rcmFkaXVzKG5vZGVzW2ldLGksbm9kZXMpfX07Zm9yY2UuaXRlcmF0aW9ucz1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaXRlcmF0aW9ucz0rXyxmb3JjZSk6aXRlcmF0aW9uc307Zm9yY2Uuc3RyZW5ndGg9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHN0cmVuZ3RoPStfLGZvcmNlKTpzdHJlbmd0aH07Zm9yY2UucmFkaXVzPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyYWRpdXM9dHlwZW9mIF89PT0iZnVuY3Rpb24iP186Y29uc3RhbnQoK18pLGZvcmNlKTpyYWRpdXN9O3JldHVybiBmb3JjZX07dmFyIHByZWZpeD0iJCI7ZnVuY3Rpb24gTWFwJDEoKXt9TWFwJDEucHJvdG90eXBlPW1hcC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk1hcCQxLGhhczpmdW5jdGlvbiBoYXMoa2V5KXtyZXR1cm4gcHJlZml4K2tleSBpbiB0aGlzfSxnZXQ6ZnVuY3Rpb24gZ2V0KGtleSl7cmV0dXJuIHRoaXNbcHJlZml4K2tleV19LHNldDpmdW5jdGlvbiBzZXQoa2V5LHZhbHVlKXt0aGlzW3ByZWZpeCtrZXldPXZhbHVlO3JldHVybiB0aGlzfSxyZW1vdmU6ZnVuY3Rpb24gcmVtb3ZlKGtleSl7dmFyIHByb3BlcnR5PXByZWZpeCtrZXk7cmV0dXJuIHByb3BlcnR5IGluIHRoaXMmJmRlbGV0ZSB0aGlzW3Byb3BlcnR5XX0sY2xlYXI6ZnVuY3Rpb24gY2xlYXIoKXtmb3IodmFyIHByb3BlcnR5IGluIHRoaXMpe2lmKHByb3BlcnR5WzBdPT09cHJlZml4KWRlbGV0ZSB0aGlzW3Byb3BlcnR5XX19LGtleXM6ZnVuY3Rpb24ga2V5cygpe3ZhciBrZXlzPVtdO2Zvcih2YXIgcHJvcGVydHkgaW4gdGhpcyl7aWYocHJvcGVydHlbMF09PT1wcmVmaXgpa2V5cy5wdXNoKHByb3BlcnR5LnNsaWNlKDEpKX1yZXR1cm4ga2V5c30sdmFsdWVzOmZ1bmN0aW9uIHZhbHVlcygpe3ZhciB2YWx1ZXM9W107Zm9yKHZhciBwcm9wZXJ0eSBpbiB0aGlzKXtpZihwcm9wZXJ0eVswXT09PXByZWZpeCl2YWx1ZXMucHVzaCh0aGlzW3Byb3BlcnR5XSl9cmV0dXJuIHZhbHVlc30sZW50cmllczpmdW5jdGlvbiBlbnRyaWVzKCl7dmFyIGVudHJpZXM9W107Zm9yKHZhciBwcm9wZXJ0eSBpbiB0aGlzKXtpZihwcm9wZXJ0eVswXT09PXByZWZpeCllbnRyaWVzLnB1c2goe2tleTpwcm9wZXJ0eS5zbGljZSgxKSx2YWx1ZTp0aGlzW3Byb3BlcnR5XX0pfXJldHVybiBlbnRyaWVzfSxzaXplOmZ1bmN0aW9uIHNpemUoKXt2YXIgc2l6ZT0wO2Zvcih2YXIgcHJvcGVydHkgaW4gdGhpcyl7aWYocHJvcGVydHlbMF09PT1wcmVmaXgpKytzaXplfXJldHVybiBzaXplfSxlbXB0eTpmdW5jdGlvbiBlbXB0eSgpe2Zvcih2YXIgcHJvcGVydHkgaW4gdGhpcyl7aWYocHJvcGVydHlbMF09PT1wcmVmaXgpcmV0dXJuIGZhbHNlfXJldHVybiB0cnVlfSxlYWNoOmZ1bmN0aW9uIGVhY2goZil7Zm9yKHZhciBwcm9wZXJ0eSBpbiB0aGlzKXtpZihwcm9wZXJ0eVswXT09PXByZWZpeClmKHRoaXNbcHJvcGVydHldLHByb3BlcnR5LnNsaWNlKDEpLHRoaXMpfX19O2Z1bmN0aW9uIG1hcChvYmplY3QsZil7dmFyIG1hcD1uZXcgTWFwJDE7aWYob2JqZWN0IGluc3RhbmNlb2YgTWFwJDEpb2JqZWN0LmVhY2goZnVuY3Rpb24odmFsdWUsa2V5KXttYXAuc2V0KGtleSx2YWx1ZSl9KTtlbHNlIGlmKEFycmF5LmlzQXJyYXkob2JqZWN0KSl7dmFyIGk9LTEsbj1vYmplY3QubGVuZ3RoLG87aWYoZj09bnVsbCl3aGlsZSgrK2k8bil7bWFwLnNldChpLG9iamVjdFtpXSl9ZWxzZSB3aGlsZSgrK2k8bil7bWFwLnNldChmKG89b2JqZWN0W2ldLGksb2JqZWN0KSxvKX19ZWxzZSBpZihvYmplY3QpZm9yKHZhciBrZXkgaW4gb2JqZWN0KXttYXAuc2V0KGtleSxvYmplY3Rba2V5XSl9cmV0dXJuIG1hcH12YXIgbmVzdD1mdW5jdGlvbigpe3ZhciBrZXlzPVtdLF9zb3J0S2V5cz1bXSxfc29ydFZhbHVlcyxfcm9sbHVwLG5lc3Q7ZnVuY3Rpb24gYXBwbHkoYXJyYXksZGVwdGgsY3JlYXRlUmVzdWx0LHNldFJlc3VsdCl7aWYoZGVwdGg+PWtleXMubGVuZ3RoKXJldHVybiBfcm9sbHVwIT1udWxsP19yb2xsdXAoYXJyYXkpOl9zb3J0VmFsdWVzIT1udWxsP2FycmF5LnNvcnQoX3NvcnRWYWx1ZXMpOmFycmF5O3ZhciBpPS0xLG49YXJyYXkubGVuZ3RoLGtleT1rZXlzW2RlcHRoKytdLGtleVZhbHVlLHZhbHVlLHZhbHVlc0J5S2V5PW1hcCgpLHZhbHVlcyxyZXN1bHQ9Y3JlYXRlUmVzdWx0KCk7d2hpbGUoKytpPG4pe2lmKHZhbHVlcz12YWx1ZXNCeUtleS5nZXQoa2V5VmFsdWU9a2V5KHZhbHVlPWFycmF5W2ldKSsiIikpe3ZhbHVlcy5wdXNoKHZhbHVlKX1lbHNle3ZhbHVlc0J5S2V5LnNldChrZXlWYWx1ZSxbdmFsdWVdKX19dmFsdWVzQnlLZXkuZWFjaChmdW5jdGlvbih2YWx1ZXMsa2V5KXtzZXRSZXN1bHQocmVzdWx0LGtleSxhcHBseSh2YWx1ZXMsZGVwdGgsY3JlYXRlUmVzdWx0LHNldFJlc3VsdCkpfSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBfZW50cmllcyhtYXAkJDEsZGVwdGgpe2lmKCsrZGVwdGg+a2V5cy5sZW5ndGgpcmV0dXJuIG1hcCQkMTt2YXIgYXJyYXksc29ydEtleT1fc29ydEtleXNbZGVwdGgtMV07aWYoX3JvbGx1cCE9bnVsbCYmZGVwdGg+PWtleXMubGVuZ3RoKWFycmF5PW1hcCQkMS5lbnRyaWVzKCk7ZWxzZSBhcnJheT1bXSxtYXAkJDEuZWFjaChmdW5jdGlvbih2LGspe2FycmF5LnB1c2goe2tleTprLHZhbHVlczpfZW50cmllcyh2LGRlcHRoKX0pfSk7cmV0dXJuIHNvcnRLZXkhPW51bGw/YXJyYXkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBzb3J0S2V5KGEua2V5LGIua2V5KX0pOmFycmF5fXJldHVybiBuZXN0PXtvYmplY3Q6ZnVuY3Rpb24gb2JqZWN0KGFycmF5KXtyZXR1cm4gYXBwbHkoYXJyYXksMCxjcmVhdGVPYmplY3Qsc2V0T2JqZWN0KX0sbWFwOmZ1bmN0aW9uIG1hcCQkMShhcnJheSl7cmV0dXJuIGFwcGx5KGFycmF5LDAsY3JlYXRlTWFwLHNldE1hcCl9LGVudHJpZXM6ZnVuY3Rpb24gZW50cmllcyhhcnJheSl7cmV0dXJuIF9lbnRyaWVzKGFwcGx5KGFycmF5LDAsY3JlYXRlTWFwLHNldE1hcCksMCl9LGtleTpmdW5jdGlvbiBrZXkoZCl7a2V5cy5wdXNoKGQpO3JldHVybiBuZXN0fSxzb3J0S2V5czpmdW5jdGlvbiBzb3J0S2V5cyhvcmRlcil7X3NvcnRLZXlzW2tleXMubGVuZ3RoLTFdPW9yZGVyO3JldHVybiBuZXN0fSxzb3J0VmFsdWVzOmZ1bmN0aW9uIHNvcnRWYWx1ZXMob3JkZXIpe19zb3J0VmFsdWVzPW9yZGVyO3JldHVybiBuZXN0fSxyb2xsdXA6ZnVuY3Rpb24gcm9sbHVwKGYpe19yb2xsdXA9ZjtyZXR1cm4gbmVzdH19fTtmdW5jdGlvbiBjcmVhdGVPYmplY3QoKXtyZXR1cm57fX1mdW5jdGlvbiBzZXRPYmplY3Qob2JqZWN0LGtleSx2YWx1ZSl7b2JqZWN0W2tleV09dmFsdWV9ZnVuY3Rpb24gY3JlYXRlTWFwKCl7cmV0dXJuIG1hcCgpfWZ1bmN0aW9uIHNldE1hcChtYXAkJDEsa2V5LHZhbHVlKXttYXAkJDEuc2V0KGtleSx2YWx1ZSl9ZnVuY3Rpb24gU2V0KCl7fXZhciBwcm90bz1tYXAucHJvdG90eXBlO1NldC5wcm90b3R5cGU9c2V0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6U2V0LGhhczpwcm90by5oYXMsYWRkOmZ1bmN0aW9uIGFkZCh2YWx1ZSl7dmFsdWUrPSIiO3RoaXNbcHJlZml4K3ZhbHVlXT12YWx1ZTtyZXR1cm4gdGhpc30scmVtb3ZlOnByb3RvLnJlbW92ZSxjbGVhcjpwcm90by5jbGVhcix2YWx1ZXM6cHJvdG8ua2V5cyxzaXplOnByb3RvLnNpemUsZW1wdHk6cHJvdG8uZW1wdHksZWFjaDpwcm90by5lYWNofTtmdW5jdGlvbiBzZXQob2JqZWN0LGYpe3ZhciBzZXQ9bmV3IFNldDtpZihvYmplY3QgaW5zdGFuY2VvZiBTZXQpb2JqZWN0LmVhY2goZnVuY3Rpb24odmFsdWUpe3NldC5hZGQodmFsdWUpfSk7ZWxzZSBpZihvYmplY3Qpe3ZhciBpPS0xLG49b2JqZWN0Lmxlbmd0aDtpZihmPT1udWxsKXdoaWxlKCsraTxuKXtzZXQuYWRkKG9iamVjdFtpXSl9ZWxzZSB3aGlsZSgrK2k8bil7c2V0LmFkZChmKG9iamVjdFtpXSxpLG9iamVjdCkpfX1yZXR1cm4gc2V0fXZhciBfdHlwZW9mPXR5cGVvZiBTeW1ib2w9PT0iZnVuY3Rpb24iJiZ0eXBlb2YgU3ltYm9sLml0ZXJhdG9yPT09InN5bWJvbCI/ZnVuY3Rpb24ob2JqKXtyZXR1cm4gdHlwZW9mIG9ian06ZnVuY3Rpb24ob2JqKXtyZXR1cm4gb2JqJiZ0eXBlb2YgU3ltYm9sPT09ImZ1bmN0aW9uIiYmb2JqLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZvYmohPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBvYmp9O3ZhciBjbGFzc0NhbGxDaGVjaz1mdW5jdGlvbihpbnN0YW5jZSxDb25zdHJ1Y3Rvcil7aWYoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9fTt2YXIgY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCxwcm9wcyl7Zm9yKHZhciBpPTA7aTxwcm9wcy5sZW5ndGg7aSsrKXt2YXIgZGVzY3JpcHRvcj1wcm9wc1tpXTtkZXNjcmlwdG9yLmVudW1lcmFibGU9ZGVzY3JpcHRvci5lbnVtZXJhYmxlfHxmYWxzZTtkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZT10cnVlO2lmKCJ2YWx1ZSJpbiBkZXNjcmlwdG9yKWRlc2NyaXB0b3Iud3JpdGFibGU9dHJ1ZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LGRlc2NyaXB0b3Iua2V5LGRlc2NyaXB0b3IpfX1yZXR1cm4gZnVuY3Rpb24oQ29uc3RydWN0b3IscHJvdG9Qcm9wcyxzdGF0aWNQcm9wcyl7aWYocHJvdG9Qcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSxwcm90b1Byb3BzKTtpZihzdGF0aWNQcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLHN0YXRpY1Byb3BzKTtyZXR1cm4gQ29uc3RydWN0b3J9fSgpO3ZhciBkZWZpbmVQcm9wZXJ0eT1mdW5jdGlvbihvYmosa2V5LHZhbHVlKXtpZihrZXkgaW4gb2JqKXtPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLGtleSx7dmFsdWU6dmFsdWUsZW51bWVyYWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlLHdyaXRhYmxlOnRydWV9KX1lbHNle29ialtrZXldPXZhbHVlfXJldHVybiBvYmp9O3ZhciBfZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XX19fXJldHVybiB0YXJnZXR9O3ZhciBpbmhlcml0cz1mdW5jdGlvbihzdWJDbGFzcyxzdXBlckNsYXNzKXtpZih0eXBlb2Ygc3VwZXJDbGFzcyE9PSJmdW5jdGlvbiImJnN1cGVyQ2xhc3MhPT1udWxsKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHN1cGVyQ2xhc3MpfXN1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MmJnN1cGVyQ2xhc3MucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6c3ViQ2xhc3MsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfX0pO2lmKHN1cGVyQ2xhc3MpT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcyxzdXBlckNsYXNzKTpzdWJDbGFzcy5fX3Byb3RvX189c3VwZXJDbGFzc307dmFyIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm49ZnVuY3Rpb24oc2VsZixjYWxsKXtpZighc2VsZil7dGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKX1yZXR1cm4gY2FsbCYmKHR5cGVvZiBjYWxsPT09Im9iamVjdCJ8fHR5cGVvZiBjYWxsPT09ImZ1bmN0aW9uIik/Y2FsbDpzZWxmfTt2YXIgc2xpY2VkVG9BcnJheT1mdW5jdGlvbigpe2Z1bmN0aW9uIHNsaWNlSXRlcmF0b3IoYXJyLGkpe3ZhciBfYXJyPVtdO3ZhciBfbj10cnVlO3ZhciBfZD1mYWxzZTt2YXIgX2U9dW5kZWZpbmVkO3RyeXtmb3IodmFyIF9pPWFycltTeW1ib2wuaXRlcmF0b3JdKCksX3M7IShfbj0oX3M9X2kubmV4dCgpKS5kb25lKTtfbj10cnVlKXtfYXJyLnB1c2goX3MudmFsdWUpO2lmKGkmJl9hcnIubGVuZ3RoPT09aSlicmVha319Y2F0Y2goZXJyKXtfZD10cnVlO19lPWVycn1maW5hbGx5e3RyeXtpZighX24mJl9pWyJyZXR1cm4iXSlfaVsicmV0dXJuIl0oKX1maW5hbGx5e2lmKF9kKXRocm93IF9lfX1yZXR1cm4gX2Fycn1yZXR1cm4gZnVuY3Rpb24oYXJyLGkpe2lmKEFycmF5LmlzQXJyYXkoYXJyKSl7cmV0dXJuIGFycn1lbHNlIGlmKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSl7cmV0dXJuIHNsaWNlSXRlcmF0b3IoYXJyLGkpfWVsc2V7dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZSIpfX19KCk7dmFyIHRvQ29uc3VtYWJsZUFycmF5PWZ1bmN0aW9uKGFycil7aWYoQXJyYXkuaXNBcnJheShhcnIpKXtmb3IodmFyIGk9MCxhcnIyPUFycmF5KGFyci5sZW5ndGgpO2k8YXJyLmxlbmd0aDtpKyspYXJyMltpXT1hcnJbaV07cmV0dXJuIGFycjJ9ZWxzZXtyZXR1cm4gQXJyYXkuZnJvbShhcnIpfX07ZnVuY3Rpb24gaW5kZXgkMShkLGkpe3JldHVybiBpfXZhciBmb3JjZUxpbms9ZnVuY3Rpb24obGlua3Mpe3ZhciBpZD1pbmRleCQxLHN0cmVuZ3RoPWRlZmF1bHRTdHJlbmd0aCxzdHJlbmd0aHMsZGlzdGFuY2U9Y29uc3RhbnQoMzApLGRpc3RhbmNlcyxub2Rlcyxjb3VudCxiaWFzLGl0ZXJhdGlvbnM9MTtpZihsaW5rcz09bnVsbClsaW5rcz1bXTtmdW5jdGlvbiBkZWZhdWx0U3RyZW5ndGgobGluayl7cmV0dXJuIDEvTWF0aC5taW4oY291bnRbbGluay5zb3VyY2UuaW5kZXhdLGNvdW50W2xpbmsudGFyZ2V0LmluZGV4XSl9ZnVuY3Rpb24gZm9yY2UoYWxwaGEpe2Zvcih2YXIgaz0wLG49bGlua3MubGVuZ3RoO2s8aXRlcmF0aW9uczsrK2spe2Zvcih2YXIgaT0wLGxpbmssc291cmNlLHRhcmdldCx4LHksbCxiO2k8bjsrK2kpe2xpbms9bGlua3NbaV0sc291cmNlPWxpbmsuc291cmNlLHRhcmdldD1saW5rLnRhcmdldDt4PXRhcmdldC54K3RhcmdldC52eC1zb3VyY2UueC1zb3VyY2Uudnh8fGppZ2dsZSgpO3k9dGFyZ2V0LnkrdGFyZ2V0LnZ5LXNvdXJjZS55LXNvdXJjZS52eXx8amlnZ2xlKCk7bD1NYXRoLnNxcnQoeCp4K3kqeSk7bD0obC1kaXN0YW5jZXNbaV0pL2wqYWxwaGEqc3RyZW5ndGhzW2ldO3gqPWwseSo9bDt0YXJnZXQudngtPXgqKGI9Ymlhc1tpXSk7dGFyZ2V0LnZ5LT15KmI7c291cmNlLnZ4Kz14KihiPTEtYik7c291cmNlLnZ5Kz15KmJ9fX1mdW5jdGlvbiBpbml0aWFsaXplKCl7aWYoIW5vZGVzKXJldHVybjt2YXIgaSxuPW5vZGVzLmxlbmd0aCxtPWxpbmtzLmxlbmd0aCxub2RlQnlJZD1tYXAobm9kZXMsaWQpLGxpbms7Zm9yKGk9MCxjb3VudD1uZXcgQXJyYXkobik7aTxuOysraSl7Y291bnRbaV09MH1mb3IoaT0wO2k8bTsrK2kpe2xpbms9bGlua3NbaV0sbGluay5pbmRleD1pO2lmKF90eXBlb2YobGluay5zb3VyY2UpIT09Im9iamVjdCIpbGluay5zb3VyY2U9bm9kZUJ5SWQuZ2V0KGxpbmsuc291cmNlKTtpZihfdHlwZW9mKGxpbmsudGFyZ2V0KSE9PSJvYmplY3QiKWxpbmsudGFyZ2V0PW5vZGVCeUlkLmdldChsaW5rLnRhcmdldCk7Kytjb3VudFtsaW5rLnNvdXJjZS5pbmRleF0sKytjb3VudFtsaW5rLnRhcmdldC5pbmRleF19Zm9yKGk9MCxiaWFzPW5ldyBBcnJheShtKTtpPG07KytpKXtsaW5rPWxpbmtzW2ldLGJpYXNbaV09Y291bnRbbGluay5zb3VyY2UuaW5kZXhdLyhjb3VudFtsaW5rLnNvdXJjZS5pbmRleF0rY291bnRbbGluay50YXJnZXQuaW5kZXhdKX1zdHJlbmd0aHM9bmV3IEFycmF5KG0pLGluaXRpYWxpemVTdHJlbmd0aCgpO2Rpc3RhbmNlcz1uZXcgQXJyYXkobSksaW5pdGlhbGl6ZURpc3RhbmNlKCl9ZnVuY3Rpb24gaW5pdGlhbGl6ZVN0cmVuZ3RoKCl7aWYoIW5vZGVzKXJldHVybjtmb3IodmFyIGk9MCxuPWxpbmtzLmxlbmd0aDtpPG47KytpKXtzdHJlbmd0aHNbaV09K3N0cmVuZ3RoKGxpbmtzW2ldLGksbGlua3MpfX1mdW5jdGlvbiBpbml0aWFsaXplRGlzdGFuY2UoKXtpZighbm9kZXMpcmV0dXJuO2Zvcih2YXIgaT0wLG49bGlua3MubGVuZ3RoO2k8bjsrK2kpe2Rpc3RhbmNlc1tpXT0rZGlzdGFuY2UobGlua3NbaV0saSxsaW5rcyl9fWZvcmNlLmluaXRpYWxpemU9ZnVuY3Rpb24oXyl7bm9kZXM9Xztpbml0aWFsaXplKCl9O2ZvcmNlLmxpbmtzPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsaW5rcz1fLGluaXRpYWxpemUoKSxmb3JjZSk6bGlua3N9O2ZvcmNlLmlkPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpZD1fLGZvcmNlKTppZH07Zm9yY2UuaXRlcmF0aW9ucz1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaXRlcmF0aW9ucz0rXyxmb3JjZSk6aXRlcmF0aW9uc307Zm9yY2Uuc3RyZW5ndGg9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHN0cmVuZ3RoPXR5cGVvZiBfPT09ImZ1bmN0aW9uIj9fOmNvbnN0YW50KCtfKSxpbml0aWFsaXplU3RyZW5ndGgoKSxmb3JjZSk6c3RyZW5ndGh9O2ZvcmNlLmRpc3RhbmNlPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkaXN0YW5jZT10eXBlb2YgXz09PSJmdW5jdGlvbiI/Xzpjb25zdGFudCgrXyksaW5pdGlhbGl6ZURpc3RhbmNlKCksZm9yY2UpOmRpc3RhbmNlfTtyZXR1cm4gZm9yY2V9O3ZhciBub29wPXt2YWx1ZTpmdW5jdGlvbiB2YWx1ZSgpe319O2Z1bmN0aW9uIGRpc3BhdGNoKCl7Zm9yKHZhciBpPTAsbj1hcmd1bWVudHMubGVuZ3RoLF89e30sdDtpPG47KytpKXtpZighKHQ9YXJndW1lbnRzW2ldKyIiKXx8dCBpbiBfKXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiK3QpO19bdF09W119cmV0dXJuIG5ldyBEaXNwYXRjaChfKX1mdW5jdGlvbiBEaXNwYXRjaChfKXt0aGlzLl89X31mdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMsdHlwZXMpe3JldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcChmdW5jdGlvbih0KXt2YXIgbmFtZT0iIixpPXQuaW5kZXhPZigiLiIpO2lmKGk+PTApbmFtZT10LnNsaWNlKGkrMSksdD10LnNsaWNlKDAsaSk7aWYodCYmIXR5cGVzLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO3JldHVybnt0eXBlOnQsbmFtZTpuYW1lfX0pfURpc3BhdGNoLnByb3RvdHlwZT1kaXNwYXRjaC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkRpc3BhdGNoLG9uOmZ1bmN0aW9uIG9uKHR5cGVuYW1lLGNhbGxiYWNrKXt2YXIgXz10aGlzLl8sVD1wYXJzZVR5cGVuYW1lcyh0eXBlbmFtZSsiIixfKSx0LGk9LTEsbj1ULmxlbmd0aDtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3doaWxlKCsraTxuKXtpZigodD0odHlwZW5hbWU9VFtpXSkudHlwZSkmJih0PWdldCQxKF9bdF0sdHlwZW5hbWUubmFtZSkpKXJldHVybiB0fXJldHVybn1pZihjYWxsYmFjayE9bnVsbCYmdHlwZW9mIGNhbGxiYWNrIT09ImZ1bmN0aW9uIil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrY2FsbGJhY2spO3doaWxlKCsraTxuKXtpZih0PSh0eXBlbmFtZT1UW2ldKS50eXBlKV9bdF09c2V0JDMoX1t0XSx0eXBlbmFtZS5uYW1lLGNhbGxiYWNrKTtlbHNlIGlmKGNhbGxiYWNrPT1udWxsKWZvcih0IGluIF8pe19bdF09c2V0JDMoX1t0XSx0eXBlbmFtZS5uYW1lLG51bGwpfX1yZXR1cm4gdGhpc30sY29weTpmdW5jdGlvbiBjb3B5KCl7dmFyIGNvcHk9e30sXz10aGlzLl87Zm9yKHZhciB0IGluIF8pe2NvcHlbdF09X1t0XS5zbGljZSgpfXJldHVybiBuZXcgRGlzcGF0Y2goY29weSl9LGNhbGw6ZnVuY3Rpb24gY2FsbCh0eXBlLHRoYXQpe2lmKChuPWFyZ3VtZW50cy5sZW5ndGgtMik+MClmb3IodmFyIGFyZ3M9bmV3IEFycmF5KG4pLGk9MCxuLHQ7aTxuOysraSl7YXJnc1tpXT1hcmd1bWVudHNbaSsyXX1pZighdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3R5cGUpO2Zvcih0PXRoaXMuX1t0eXBlXSxpPTAsbj10Lmxlbmd0aDtpPG47KytpKXt0W2ldLnZhbHVlLmFwcGx5KHRoYXQsYXJncyl9fSxhcHBseTpmdW5jdGlvbiBhcHBseSh0eXBlLHRoYXQsYXJncyl7aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0eXBlKTtmb3IodmFyIHQ9dGhpcy5fW3R5cGVdLGk9MCxuPXQubGVuZ3RoO2k8bjsrK2kpe3RbaV0udmFsdWUuYXBwbHkodGhhdCxhcmdzKX19fTtmdW5jdGlvbiBnZXQkMSh0eXBlLG5hbWUpe2Zvcih2YXIgaT0wLG49dHlwZS5sZW5ndGgsYztpPG47KytpKXtpZigoYz10eXBlW2ldKS5uYW1lPT09bmFtZSl7cmV0dXJuIGMudmFsdWV9fX1mdW5jdGlvbiBzZXQkMyh0eXBlLG5hbWUsY2FsbGJhY2spe2Zvcih2YXIgaT0wLG49dHlwZS5sZW5ndGg7aTxuOysraSl7aWYodHlwZVtpXS5uYW1lPT09bmFtZSl7dHlwZVtpXT1ub29wLHR5cGU9dHlwZS5zbGljZSgwLGkpLmNvbmNhdCh0eXBlLnNsaWNlKGkrMSkpO2JyZWFrfX1pZihjYWxsYmFjayE9bnVsbCl0eXBlLnB1c2goe25hbWU6bmFtZSx2YWx1ZTpjYWxsYmFja30pO3JldHVybiB0eXBlfXZhciBmcmFtZT0wO3ZhciB0aW1lb3V0PTA7dmFyIGludGVydmFsPTA7dmFyIHBva2VEZWxheT0xZTM7dmFyIHRhc2tIZWFkO3ZhciB0YXNrVGFpbDt2YXIgY2xvY2tMYXN0PTA7dmFyIGNsb2NrTm93PTA7dmFyIGNsb2NrU2tldz0wO3ZhciBjbG9jaz0odHlwZW9mIHBlcmZvcm1hbmNlPT09InVuZGVmaW5lZCI/InVuZGVmaW5lZCI6X3R5cGVvZihwZXJmb3JtYW5jZSkpPT09Im9iamVjdCImJnBlcmZvcm1hbmNlLm5vdz9wZXJmb3JtYW5jZTpEYXRlO3ZhciBzZXRGcmFtZT0odHlwZW9mIHdpbmRvdz09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2Yod2luZG93KSk9PT0ib2JqZWN0IiYmd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KTpmdW5jdGlvbihmKXtzZXRUaW1lb3V0KGYsMTcpfTtmdW5jdGlvbiBub3coKXtyZXR1cm4gY2xvY2tOb3d8fChzZXRGcmFtZShjbGVhck5vdyksY2xvY2tOb3c9Y2xvY2subm93KCkrY2xvY2tTa2V3KX1mdW5jdGlvbiBjbGVhck5vdygpe2Nsb2NrTm93PTB9ZnVuY3Rpb24gVGltZXIoKXt0aGlzLl9jYWxsPXRoaXMuX3RpbWU9dGhpcy5fbmV4dD1udWxsfVRpbWVyLnByb3RvdHlwZT10aW1lci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlRpbWVyLHJlc3RhcnQ6ZnVuY3Rpb24gcmVzdGFydChjYWxsYmFjayxkZWxheSx0aW1lKXtpZih0eXBlb2YgY2FsbGJhY2shPT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uIik7dGltZT0odGltZT09bnVsbD9ub3coKTordGltZSkrKGRlbGF5PT1udWxsPzA6K2RlbGF5KTtpZighdGhpcy5fbmV4dCYmdGFza1RhaWwhPT10aGlzKXtpZih0YXNrVGFpbCl0YXNrVGFpbC5fbmV4dD10aGlzO2Vsc2UgdGFza0hlYWQ9dGhpczt0YXNrVGFpbD10aGlzfXRoaXMuX2NhbGw9Y2FsbGJhY2s7dGhpcy5fdGltZT10aW1lO3NsZWVwKCl9LHN0b3A6ZnVuY3Rpb24gc3RvcCgpe2lmKHRoaXMuX2NhbGwpe3RoaXMuX2NhbGw9bnVsbDt0aGlzLl90aW1lPUluZmluaXR5O3NsZWVwKCl9fX07ZnVuY3Rpb24gdGltZXIoY2FsbGJhY2ssZGVsYXksdGltZSl7dmFyIHQ9bmV3IFRpbWVyO3QucmVzdGFydChjYWxsYmFjayxkZWxheSx0aW1lKTtyZXR1cm4gdH1mdW5jdGlvbiB0aW1lckZsdXNoKCl7bm93KCk7KytmcmFtZTt2YXIgdD10YXNrSGVhZCxlO3doaWxlKHQpe2lmKChlPWNsb2NrTm93LXQuX3RpbWUpPj0wKXQuX2NhbGwuY2FsbChudWxsLGUpO3Q9dC5fbmV4dH0tLWZyYW1lfWZ1bmN0aW9uIHdha2UoKXtjbG9ja05vdz0oY2xvY2tMYXN0PWNsb2NrLm5vdygpKStjbG9ja1NrZXc7ZnJhbWU9dGltZW91dD0wO3RyeXt0aW1lckZsdXNoKCl9ZmluYWxseXtmcmFtZT0wO25hcCgpO2Nsb2NrTm93PTB9fWZ1bmN0aW9uIHBva2UoKXt2YXIgbm93PWNsb2NrLm5vdygpLGRlbGF5PW5vdy1jbG9ja0xhc3Q7aWYoZGVsYXk+cG9rZURlbGF5KWNsb2NrU2tldy09ZGVsYXksY2xvY2tMYXN0PW5vd31mdW5jdGlvbiBuYXAoKXt2YXIgdDAsdDE9dGFza0hlYWQsdDIsdGltZT1JbmZpbml0eTt3aGlsZSh0MSl7aWYodDEuX2NhbGwpe2lmKHRpbWU+dDEuX3RpbWUpdGltZT10MS5fdGltZTt0MD10MSx0MT10MS5fbmV4dH1lbHNle3QyPXQxLl9uZXh0LHQxLl9uZXh0PW51bGw7dDE9dDA/dDAuX25leHQ9dDI6dGFza0hlYWQ9dDJ9fXRhc2tUYWlsPXQwO3NsZWVwKHRpbWUpfWZ1bmN0aW9uIHNsZWVwKHRpbWUpe2lmKGZyYW1lKXJldHVybjtpZih0aW1lb3V0KXRpbWVvdXQ9Y2xlYXJUaW1lb3V0KHRpbWVvdXQpO3ZhciBkZWxheT10aW1lLWNsb2NrTm93O2lmKGRlbGF5PjI0KXtpZih0aW1lPEluZmluaXR5KXRpbWVvdXQ9c2V0VGltZW91dCh3YWtlLHRpbWUtY2xvY2subm93KCktY2xvY2tTa2V3KTtpZihpbnRlcnZhbClpbnRlcnZhbD1jbGVhckludGVydmFsKGludGVydmFsKX1lbHNle2lmKCFpbnRlcnZhbCljbG9ja0xhc3Q9Y2xvY2subm93KCksaW50ZXJ2YWw9c2V0SW50ZXJ2YWwocG9rZSxwb2tlRGVsYXkpO2ZyYW1lPTEsc2V0RnJhbWUod2FrZSl9fXZhciB0aW1lb3V0JDE9ZnVuY3Rpb24oY2FsbGJhY2ssZGVsYXksdGltZSl7dmFyIHQ9bmV3IFRpbWVyO2RlbGF5PWRlbGF5PT1udWxsPzA6K2RlbGF5O3QucmVzdGFydChmdW5jdGlvbihlbGFwc2VkKXt0LnN0b3AoKTtjYWxsYmFjayhlbGFwc2VkK2RlbGF5KX0sZGVsYXksdGltZSk7cmV0dXJuIHR9O2Z1bmN0aW9uIHgkMShkKXtyZXR1cm4gZC54fWZ1bmN0aW9uIHkkMShkKXtyZXR1cm4gZC55fXZhciBpbml0aWFsUmFkaXVzPTEwO3ZhciBpbml0aWFsQW5nbGU9TWF0aC5QSSooMy1NYXRoLnNxcnQoNSkpO2Z1bmN0aW9uIF9kZWZhdWx0KF9ub2Rlcyl7dmFyIHNpbXVsYXRpb24sX2FscGhhPTEsX2FscGhhTWluPS4wMDEsX2FscGhhRGVjYXk9MS1NYXRoLnBvdyhfYWxwaGFNaW4sMS8zMDApLF9hbHBoYVRhcmdldD0wLF92ZWxvY2l0eURlY2F5PS42LGZvcmNlcz1tYXAoKSxzdGVwcGVyPXRpbWVyKHN0ZXApLGV2ZW50PWRpc3BhdGNoKCJ0aWNrIiwiZW5kIik7aWYoX25vZGVzPT1udWxsKV9ub2Rlcz1bXTtmdW5jdGlvbiBzdGVwKCl7dGljaygpO2V2ZW50LmNhbGwoInRpY2siLHNpbXVsYXRpb24pO2lmKF9hbHBoYTxfYWxwaGFNaW4pe3N0ZXBwZXIuc3RvcCgpO2V2ZW50LmNhbGwoImVuZCIsc2ltdWxhdGlvbil9fWZ1bmN0aW9uIHRpY2soKXt2YXIgaSxuPV9ub2Rlcy5sZW5ndGgsbm9kZTtfYWxwaGErPShfYWxwaGFUYXJnZXQtX2FscGhhKSpfYWxwaGFEZWNheTtmb3JjZXMuZWFjaChmdW5jdGlvbihmb3JjZSl7Zm9yY2UoX2FscGhhKX0pO2ZvcihpPTA7aTxuOysraSl7bm9kZT1fbm9kZXNbaV07aWYobm9kZS5meD09bnVsbClub2RlLngrPW5vZGUudngqPV92ZWxvY2l0eURlY2F5O2Vsc2Ugbm9kZS54PW5vZGUuZngsbm9kZS52eD0wO2lmKG5vZGUuZnk9PW51bGwpbm9kZS55Kz1ub2RlLnZ5Kj1fdmVsb2NpdHlEZWNheTtlbHNlIG5vZGUueT1ub2RlLmZ5LG5vZGUudnk9MH19ZnVuY3Rpb24gaW5pdGlhbGl6ZU5vZGVzKCl7Zm9yKHZhciBpPTAsbj1fbm9kZXMubGVuZ3RoLG5vZGU7aTxuOysraSl7bm9kZT1fbm9kZXNbaV0sbm9kZS5pbmRleD1pO2lmKGlzTmFOKG5vZGUueCl8fGlzTmFOKG5vZGUueSkpe3ZhciByYWRpdXM9aW5pdGlhbFJhZGl1cypNYXRoLnNxcnQoaSksYW5nbGU9aSppbml0aWFsQW5nbGU7bm9kZS54PXJhZGl1cypNYXRoLmNvcyhhbmdsZSk7bm9kZS55PXJhZGl1cypNYXRoLnNpbihhbmdsZSl9aWYoaXNOYU4obm9kZS52eCl8fGlzTmFOKG5vZGUudnkpKXtub2RlLnZ4PW5vZGUudnk9MH19fWZ1bmN0aW9uIGluaXRpYWxpemVGb3JjZShmb3JjZSl7aWYoZm9yY2UuaW5pdGlhbGl6ZSlmb3JjZS5pbml0aWFsaXplKF9ub2Rlcyk7cmV0dXJuIGZvcmNlfWluaXRpYWxpemVOb2RlcygpO3JldHVybiBzaW11bGF0aW9uPXt0aWNrOnRpY2sscmVzdGFydDpmdW5jdGlvbiByZXN0YXJ0KCl7cmV0dXJuIHN0ZXBwZXIucmVzdGFydChzdGVwKSxzaW11bGF0aW9ufSxzdG9wOmZ1bmN0aW9uIHN0b3AoKXtyZXR1cm4gc3RlcHBlci5zdG9wKCksc2ltdWxhdGlvbn0sbm9kZXM6ZnVuY3Rpb24gbm9kZXMoXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KF9ub2Rlcz1fLGluaXRpYWxpemVOb2RlcygpLGZvcmNlcy5lYWNoKGluaXRpYWxpemVGb3JjZSksc2ltdWxhdGlvbik6X25vZGVzfSxhbHBoYTpmdW5jdGlvbiBhbHBoYShfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oX2FscGhhPStfLHNpbXVsYXRpb24pOl9hbHBoYX0sYWxwaGFNaW46ZnVuY3Rpb24gYWxwaGFNaW4oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KF9hbHBoYU1pbj0rXyxzaW11bGF0aW9uKTpfYWxwaGFNaW59LGFscGhhRGVjYXk6ZnVuY3Rpb24gYWxwaGFEZWNheShfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oX2FscGhhRGVjYXk9K18sc2ltdWxhdGlvbik6K19hbHBoYURlY2F5fSxhbHBoYVRhcmdldDpmdW5jdGlvbiBhbHBoYVRhcmdldChfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oX2FscGhhVGFyZ2V0PStfLHNpbXVsYXRpb24pOl9hbHBoYVRhcmdldH0sdmVsb2NpdHlEZWNheTpmdW5jdGlvbiB2ZWxvY2l0eURlY2F5KF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhfdmVsb2NpdHlEZWNheT0xLV8sc2ltdWxhdGlvbik6MS1fdmVsb2NpdHlEZWNheX0sZm9yY2U6ZnVuY3Rpb24gZm9yY2UobmFtZSxfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xPyhfPT1udWxsP2ZvcmNlcy5yZW1vdmUobmFtZSk6Zm9yY2VzLnNldChuYW1lLGluaXRpYWxpemVGb3JjZShfKSksc2ltdWxhdGlvbik6Zm9yY2VzLmdldChuYW1lKX0sZmluZDpmdW5jdGlvbiBmaW5kKHgseSxyYWRpdXMpe3ZhciBpPTAsbj1fbm9kZXMubGVuZ3RoLGR4LGR5LGQyLG5vZGUsY2xvc2VzdDtpZihyYWRpdXM9PW51bGwpcmFkaXVzPUluZmluaXR5O2Vsc2UgcmFkaXVzKj1yYWRpdXM7Zm9yKGk9MDtpPG47KytpKXtub2RlPV9ub2Rlc1tpXTtkeD14LW5vZGUueDtkeT15LW5vZGUueTtkMj1keCpkeCtkeSpkeTtpZihkMjxyYWRpdXMpY2xvc2VzdD1ub2RlLHJhZGl1cz1kMn1yZXR1cm4gY2xvc2VzdH0sb246ZnVuY3Rpb24gb24obmFtZSxfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xPyhldmVudC5vbihuYW1lLF8pLHNpbXVsYXRpb24pOmV2ZW50Lm9uKG5hbWUpfX19dmFyIGZvcmNlTWFueUJvZHk9ZnVuY3Rpb24oKXt2YXIgbm9kZXMsbm9kZSxhbHBoYSxzdHJlbmd0aD1jb25zdGFudCgtMzApLHN0cmVuZ3RocyxkaXN0YW5jZU1pbjI9MSxkaXN0YW5jZU1heDI9SW5maW5pdHksdGhldGEyPS44MTtmdW5jdGlvbiBmb3JjZShfKXt2YXIgaSxuPW5vZGVzLmxlbmd0aCx0cmVlPXF1YWR0cmVlKG5vZGVzLHgkMSx5JDEpLnZpc2l0QWZ0ZXIoYWNjdW11bGF0ZSk7Zm9yKGFscGhhPV8saT0wO2k8bjsrK2kpe25vZGU9bm9kZXNbaV0sdHJlZS52aXNpdChhcHBseSl9fWZ1bmN0aW9uIGluaXRpYWxpemUoKXtpZighbm9kZXMpcmV0dXJuO3ZhciBpLG49bm9kZXMubGVuZ3RoO3N0cmVuZ3Rocz1uZXcgQXJyYXkobik7Zm9yKGk9MDtpPG47KytpKXtzdHJlbmd0aHNbaV09K3N0cmVuZ3RoKG5vZGVzW2ldLGksbm9kZXMpfX1mdW5jdGlvbiBhY2N1bXVsYXRlKHF1YWQpe3ZhciBzdHJlbmd0aD0wLHEsYyx4LHksaTtpZihxdWFkLmxlbmd0aCl7Zm9yKHg9eT1pPTA7aTw0OysraSl7aWYoKHE9cXVhZFtpXSkmJihjPXEudmFsdWUpKXtzdHJlbmd0aCs9Yyx4Kz1jKnEueCx5Kz1jKnEueX19cXVhZC54PXgvc3RyZW5ndGg7cXVhZC55PXkvc3RyZW5ndGh9ZWxzZXtxPXF1YWQ7cS54PXEuZGF0YS54O3EueT1xLmRhdGEueTtkb3tzdHJlbmd0aCs9c3RyZW5ndGhzW3EuZGF0YS5pbmRleF19d2hpbGUocT1xLm5leHQpfXF1YWQudmFsdWU9c3RyZW5ndGh9ZnVuY3Rpb24gYXBwbHkocXVhZCx4MSxfLHgyKXtpZighcXVhZC52YWx1ZSlyZXR1cm4gdHJ1ZTt2YXIgeD1xdWFkLngtbm9kZS54LHk9cXVhZC55LW5vZGUueSx3PXgyLXgxLGw9eCp4K3kqeTtpZih3KncvdGhldGEyPGwpe2lmKGw8ZGlzdGFuY2VNYXgyKXtpZih4PT09MCl4PWppZ2dsZSgpLGwrPXgqeDtpZih5PT09MCl5PWppZ2dsZSgpLGwrPXkqeTtpZihsPGRpc3RhbmNlTWluMilsPU1hdGguc3FydChkaXN0YW5jZU1pbjIqbCk7bm9kZS52eCs9eCpxdWFkLnZhbHVlKmFscGhhL2w7bm9kZS52eSs9eSpxdWFkLnZhbHVlKmFscGhhL2x9cmV0dXJuIHRydWV9ZWxzZSBpZihxdWFkLmxlbmd0aHx8bD49ZGlzdGFuY2VNYXgyKXJldHVybjtpZihxdWFkLmRhdGEhPT1ub2RlfHxxdWFkLm5leHQpe2lmKHg9PT0wKXg9amlnZ2xlKCksbCs9eCp4O2lmKHk9PT0wKXk9amlnZ2xlKCksbCs9eSp5O2lmKGw8ZGlzdGFuY2VNaW4yKWw9TWF0aC5zcXJ0KGRpc3RhbmNlTWluMipsKX1kb3tpZihxdWFkLmRhdGEhPT1ub2RlKXt3PXN0cmVuZ3Roc1txdWFkLmRhdGEuaW5kZXhdKmFscGhhL2w7bm9kZS52eCs9eCp3O25vZGUudnkrPXkqd319d2hpbGUocXVhZD1xdWFkLm5leHQpfWZvcmNlLmluaXRpYWxpemU9ZnVuY3Rpb24oXyl7bm9kZXM9Xztpbml0aWFsaXplKCl9O2ZvcmNlLnN0cmVuZ3RoPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzdHJlbmd0aD10eXBlb2YgXz09PSJmdW5jdGlvbiI/Xzpjb25zdGFudCgrXyksaW5pdGlhbGl6ZSgpLGZvcmNlKTpzdHJlbmd0aH07Zm9yY2UuZGlzdGFuY2VNaW49ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGRpc3RhbmNlTWluMj1fKl8sZm9yY2UpOk1hdGguc3FydChkaXN0YW5jZU1pbjIpfTtmb3JjZS5kaXN0YW5jZU1heD1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZGlzdGFuY2VNYXgyPV8qXyxmb3JjZSk6TWF0aC5zcXJ0KGRpc3RhbmNlTWF4Mil9O2ZvcmNlLnRoZXRhPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGV0YTI9XypfLGZvcmNlKTpNYXRoLnNxcnQodGhldGEyKX07cmV0dXJuIGZvcmNlfTt2YXIgZm9yY2VYPWZ1bmN0aW9uKHgpe3ZhciBzdHJlbmd0aD1jb25zdGFudCguMSksbm9kZXMsc3RyZW5ndGhzLHh6O2lmKHR5cGVvZiB4IT09ImZ1bmN0aW9uIil4PWNvbnN0YW50KHg9PW51bGw/MDoreCk7ZnVuY3Rpb24gZm9yY2UoYWxwaGEpe2Zvcih2YXIgaT0wLG49bm9kZXMubGVuZ3RoLG5vZGU7aTxuOysraSl7bm9kZT1ub2Rlc1tpXSxub2RlLnZ4Kz0oeHpbaV0tbm9kZS54KSpzdHJlbmd0aHNbaV0qYWxwaGF9fWZ1bmN0aW9uIGluaXRpYWxpemUoKXtpZighbm9kZXMpcmV0dXJuO3ZhciBpLG49bm9kZXMubGVuZ3RoO3N0cmVuZ3Rocz1uZXcgQXJyYXkobik7eHo9bmV3IEFycmF5KG4pO2ZvcihpPTA7aTxuOysraSl7c3RyZW5ndGhzW2ldPWlzTmFOKHh6W2ldPSt4KG5vZGVzW2ldLGksbm9kZXMpKT8wOitzdHJlbmd0aChub2Rlc1tpXSxpLG5vZGVzKX19Zm9yY2UuaW5pdGlhbGl6ZT1mdW5jdGlvbihfKXtub2Rlcz1fO2luaXRpYWxpemUoKX07Zm9yY2Uuc3RyZW5ndGg9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHN0cmVuZ3RoPXR5cGVvZiBfPT09ImZ1bmN0aW9uIj9fOmNvbnN0YW50KCtfKSxpbml0aWFsaXplKCksZm9yY2UpOnN0cmVuZ3RofTtmb3JjZS54PWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PXR5cGVvZiBfPT09ImZ1bmN0aW9uIj9fOmNvbnN0YW50KCtfKSxpbml0aWFsaXplKCksZm9yY2UpOnh9O3JldHVybiBmb3JjZX07dmFyIGZvcmNlWT1mdW5jdGlvbih5KXt2YXIgc3RyZW5ndGg9Y29uc3RhbnQoLjEpLG5vZGVzLHN0cmVuZ3Rocyx5ejtpZih0eXBlb2YgeSE9PSJmdW5jdGlvbiIpeT1jb25zdGFudCh5PT1udWxsPzA6K3kpO2Z1bmN0aW9uIGZvcmNlKGFscGhhKXtmb3IodmFyIGk9MCxuPW5vZGVzLmxlbmd0aCxub2RlO2k8bjsrK2kpe25vZGU9bm9kZXNbaV0sbm9kZS52eSs9KHl6W2ldLW5vZGUueSkqc3RyZW5ndGhzW2ldKmFscGhhfX1mdW5jdGlvbiBpbml0aWFsaXplKCl7aWYoIW5vZGVzKXJldHVybjt2YXIgaSxuPW5vZGVzLmxlbmd0aDtzdHJlbmd0aHM9bmV3IEFycmF5KG4pO3l6PW5ldyBBcnJheShuKTtmb3IoaT0wO2k8bjsrK2kpe3N0cmVuZ3Roc1tpXT1pc05hTih5eltpXT0reShub2Rlc1tpXSxpLG5vZGVzKSk/MDorc3RyZW5ndGgobm9kZXNbaV0saSxub2Rlcyl9fWZvcmNlLmluaXRpYWxpemU9ZnVuY3Rpb24oXyl7bm9kZXM9Xztpbml0aWFsaXplKCl9O2ZvcmNlLnN0cmVuZ3RoPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzdHJlbmd0aD10eXBlb2YgXz09PSJmdW5jdGlvbiI/Xzpjb25zdGFudCgrXyksaW5pdGlhbGl6ZSgpLGZvcmNlKTpzdHJlbmd0aH07Zm9yY2UueT1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT10eXBlb2YgXz09PSJmdW5jdGlvbiI/Xzpjb25zdGFudCgrXyksaW5pdGlhbGl6ZSgpLGZvcmNlKTp5fTtyZXR1cm4gZm9yY2V9O3ZhciBsYWJlbGVyPWZ1bmN0aW9uKCl7dmFyIGxhYj1bXSxhbmM9W10sdz0xLGg9MSxsYWJlbGVyPXt9O3ZhciBtYXhfbW92ZT01LG1heF9hbmdsZT0uNTt2YXIgd19sZW49LjIsd19pbnRlcj0xLHdfbGFiMj0zMCx3X2xhYl9hbmM9MzAsd19vcmllbnQ9Mzt2YXIgdXNlcl9lbmVyZ3k9ZmFsc2U7dmFyIHVzZXJfZGVmaW5lZF9lbmVyZ3k9dm9pZCAwO3ZhciBlbmVyZ3k9ZnVuY3Rpb24gZW5lcmd5KGluZGV4KXt2YXIgbT1sYWIubGVuZ3RoLGVuZXI9MCxkeD1sYWJbaW5kZXhdLngtYW5jW2luZGV4XS54LGR5PWFuY1tpbmRleF0ueS1sYWJbaW5kZXhdLnksZGlzdD1NYXRoLnNxcnQoZHgqZHgrZHkqZHkpO2lmKGRpc3Q+MCllbmVyKz1kaXN0KndfbGVuO2R4Lz1kaXN0O2R5Lz1kaXN0O2lmKGR4PjAmJmR5PjApe2VuZXIrPTAqd19vcmllbnR9ZWxzZSBpZihkeDwwJiZkeT4wKXtlbmVyKz0xKndfb3JpZW50fWVsc2UgaWYoZHg8MCYmZHk8MCl7ZW5lcis9Mip3X29yaWVudH1lbHNle2VuZXIrPTMqd19vcmllbnR9dmFyIHgyMT1sYWJbaW5kZXhdLngseTIxPWxhYltpbmRleF0ueS1sYWJbaW5kZXhdLmhlaWdodCsyLHgyMj1sYWJbaW5kZXhdLngrbGFiW2luZGV4XS53aWR0aCx5MjI9bGFiW2luZGV4XS55KzI7dmFyIHgxMT12b2lkIDAseDEyPXZvaWQgMCx5MTE9dm9pZCAwLHkxMj12b2lkIDAseF9vdmVybGFwPXZvaWQgMCx5X292ZXJsYXA9dm9pZCAwLG92ZXJsYXBfYXJlYT12b2lkIDA7Zm9yKHZhciBpPTA7aTxtO2krKyl7aWYoaSE9PWluZGV4KXt2YXIgX292ZXJsYXA9aW50ZXJzZWN0KGFuY1tpbmRleF0ueCxsYWJbaW5kZXhdLngsYW5jW2ldLngsbGFiW2ldLngsYW5jW2luZGV4XS55LGxhYltpbmRleF0ueSxhbmNbaV0ueSxsYWJbaV0ueSk7aWYoX292ZXJsYXApZW5lcis9d19pbnRlcjt4MTE9bGFiW2ldLng7eTExPWxhYltpXS55LWxhYltpXS5oZWlnaHQrMjt4MTI9bGFiW2ldLngrbGFiW2ldLndpZHRoO3kxMj1sYWJbaV0ueSsyO3hfb3ZlcmxhcD1NYXRoLm1heCgwLE1hdGgubWluKHgxMix4MjIpLU1hdGgubWF4KHgxMSx4MjEpKTt5X292ZXJsYXA9TWF0aC5tYXgoMCxNYXRoLm1pbih5MTIseTIyKS1NYXRoLm1heCh5MTEseTIxKSk7b3ZlcmxhcF9hcmVhPXhfb3ZlcmxhcCp5X292ZXJsYXA7ZW5lcis9b3ZlcmxhcF9hcmVhKndfbGFiMn14MTE9YW5jW2ldLngtYW5jW2ldLnI7eTExPWFuY1tpXS55LWFuY1tpXS5yO3gxMj1hbmNbaV0ueCthbmNbaV0ucjt5MTI9YW5jW2ldLnkrYW5jW2ldLnI7eF9vdmVybGFwPU1hdGgubWF4KDAsTWF0aC5taW4oeDEyLHgyMiktTWF0aC5tYXgoeDExLHgyMSkpO3lfb3ZlcmxhcD1NYXRoLm1heCgwLE1hdGgubWluKHkxMix5MjIpLU1hdGgubWF4KHkxMSx5MjEpKTtvdmVybGFwX2FyZWE9eF9vdmVybGFwKnlfb3ZlcmxhcDtlbmVyKz1vdmVybGFwX2FyZWEqd19sYWJfYW5jfXJldHVybiBlbmVyfTt2YXIgbWNtb3ZlPWZ1bmN0aW9uIG1jbW92ZShjdXJyVCl7dmFyIGk9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxhYi5sZW5ndGgpO3ZhciB4X29sZD1sYWJbaV0ueDt2YXIgeV9vbGQ9bGFiW2ldLnk7dmFyIG9sZF9lbmVyZ3k9dm9pZCAwO2lmKHVzZXJfZW5lcmd5KXtvbGRfZW5lcmd5PXVzZXJfZGVmaW5lZF9lbmVyZ3koaSxsYWIsYW5jKX1lbHNle29sZF9lbmVyZ3k9ZW5lcmd5KGkpfWxhYltpXS54Kz0oTWF0aC5yYW5kb20oKS0uNSkqbWF4X21vdmU7bGFiW2ldLnkrPShNYXRoLnJhbmRvbSgpLS41KSptYXhfbW92ZTtpZihsYWJbaV0ueD53KWxhYltpXS54PXhfb2xkO2lmKGxhYltpXS54PDApbGFiW2ldLng9eF9vbGQ7aWYobGFiW2ldLnk+aClsYWJbaV0ueT15X29sZDtpZihsYWJbaV0ueTwwKWxhYltpXS55PXlfb2xkO3ZhciBuZXdfZW5lcmd5PXZvaWQgMDtpZih1c2VyX2VuZXJneSl7bmV3X2VuZXJneT11c2VyX2RlZmluZWRfZW5lcmd5KGksbGFiLGFuYyl9ZWxzZXtuZXdfZW5lcmd5PWVuZXJneShpKX12YXIgZGVsdGFfZW5lcmd5PW5ld19lbmVyZ3ktb2xkX2VuZXJneTtpZihNYXRoLnJhbmRvbSgpPE1hdGguZXhwKC1kZWx0YV9lbmVyZ3kvY3VyclQpKXt9ZWxzZXtsYWJbaV0ueD14X29sZDtsYWJbaV0ueT15X29sZH19O3ZhciBtY3JvdGF0ZT1mdW5jdGlvbiBtY3JvdGF0ZShjdXJyVCl7dmFyIGk9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxhYi5sZW5ndGgpO3ZhciB4X29sZD1sYWJbaV0ueDt2YXIgeV9vbGQ9bGFiW2ldLnk7dmFyIG9sZF9lbmVyZ3k9dm9pZCAwO2lmKHVzZXJfZW5lcmd5KXtvbGRfZW5lcmd5PXVzZXJfZGVmaW5lZF9lbmVyZ3koaSxsYWIsYW5jKX1lbHNle29sZF9lbmVyZ3k9ZW5lcmd5KGkpfXZhciBhbmdsZT0oTWF0aC5yYW5kb20oKS0uNSkqbWF4X2FuZ2xlO3ZhciBzPU1hdGguc2luKGFuZ2xlKTt2YXIgYz1NYXRoLmNvcyhhbmdsZSk7bGFiW2ldLngtPWFuY1tpXS54O2xhYltpXS55LT1hbmNbaV0ueTt2YXIgeF9uZXc9bGFiW2ldLngqYy1sYWJbaV0ueSpzLHlfbmV3PWxhYltpXS54KnMrbGFiW2ldLnkqYztsYWJbaV0ueD14X25ldythbmNbaV0ueDtsYWJbaV0ueT15X25ldythbmNbaV0ueTtpZihsYWJbaV0ueD53KWxhYltpXS54PXhfb2xkO2lmKGxhYltpXS54PDApbGFiW2ldLng9eF9vbGQ7aWYobGFiW2ldLnk+aClsYWJbaV0ueT15X29sZDtpZihsYWJbaV0ueTwwKWxhYltpXS55PXlfb2xkO3ZhciBuZXdfZW5lcmd5PXZvaWQgMDtpZih1c2VyX2VuZXJneSl7bmV3X2VuZXJneT11c2VyX2RlZmluZWRfZW5lcmd5KGksbGFiLGFuYyl9ZWxzZXtuZXdfZW5lcmd5PWVuZXJneShpKX12YXIgZGVsdGFfZW5lcmd5PW5ld19lbmVyZ3ktb2xkX2VuZXJneTtpZihNYXRoLnJhbmRvbSgpPE1hdGguZXhwKC1kZWx0YV9lbmVyZ3kvY3VyclQpKXt9ZWxzZXtsYWJbaV0ueD14X29sZDtsYWJbaV0ueT15X29sZH19O3ZhciBpbnRlcnNlY3Q9ZnVuY3Rpb24gaW50ZXJzZWN0KHgxLHgyLHgzLHg0LHkxLHkyLHkzLHk0KXt2YXIgbXVhPXZvaWQgMCxtdWI9dm9pZCAwO3ZhciBkZW5vbT12b2lkIDAsbnVtZXJhPXZvaWQgMCxudW1lcmI9dm9pZCAwO2Rlbm9tPSh5NC15MykqKHgyLXgxKS0oeDQteDMpKih5Mi15MSk7bnVtZXJhPSh4NC14MykqKHkxLXkzKS0oeTQteTMpKih4MS14Myk7bnVtZXJiPSh4Mi14MSkqKHkxLXkzKS0oeTIteTEpKih4MS14Myk7bXVhPW51bWVyYS9kZW5vbTttdWI9bnVtZXJiL2Rlbm9tO2lmKCEobXVhPDB8fG11YT4xfHxtdWI8MHx8bXViPjEpKXtyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9O3ZhciBjb29saW5nX3NjaGVkdWxlPWZ1bmN0aW9uIGNvb2xpbmdfc2NoZWR1bGUoY3VyclQsaW5pdGlhbFQsbnN3ZWVwcyl7cmV0dXJuIGN1cnJULWluaXRpYWxUL25zd2VlcHN9O2xhYmVsZXIuc3RhcnQ9ZnVuY3Rpb24obnN3ZWVwcyl7dmFyIG09bGFiLmxlbmd0aCxjdXJyVD0xLGluaXRpYWxUPTE7Zm9yKHZhciBpPTA7aTxuc3dlZXBzO2krKyl7Zm9yKHZhciBqPTA7ajxtO2orKyl7aWYoTWF0aC5yYW5kb20oKTwuNSl7bWNtb3ZlKGN1cnJUKX1lbHNle21jcm90YXRlKGN1cnJUKX19Y3VyclQ9Y29vbGluZ19zY2hlZHVsZShjdXJyVCxpbml0aWFsVCxuc3dlZXBzKX19O2xhYmVsZXIud2lkdGg9ZnVuY3Rpb24oeCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHc7dz14O3JldHVybiBsYWJlbGVyfTtsYWJlbGVyLmhlaWdodD1mdW5jdGlvbih4KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gaDtoPXg7cmV0dXJuIGxhYmVsZXJ9O2xhYmVsZXIubGFiZWw9ZnVuY3Rpb24oeCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGxhYjtsYWI9eDtyZXR1cm4gbGFiZWxlcn07bGFiZWxlci5hbmNob3I9ZnVuY3Rpb24oeCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGFuYzthbmM9eDtyZXR1cm4gbGFiZWxlcn07bGFiZWxlci5hbHRfZW5lcmd5PWZ1bmN0aW9uKHgpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBlbmVyZ3k7dXNlcl9kZWZpbmVkX2VuZXJneT14O3VzZXJfZW5lcmd5PXRydWU7cmV0dXJuIGxhYmVsZXJ9O2xhYmVsZXIuYWx0X3NjaGVkdWxlPWZ1bmN0aW9uKHgpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBjb29saW5nX3NjaGVkdWxlO3JldHVybiBsYWJlbGVyfTtyZXR1cm4gbGFiZWxlcn07dmFyIGJhc2ljUG9pbnRTaXplRnVuY3Rpb249ZnVuY3Rpb24gYmFzaWNQb2ludFNpemVGdW5jdGlvbigpe3JldHVybiA1fTt2YXIgYmFzaWNMYWJlbFNpemVGdW5jdGlvbj1mdW5jdGlvbiBiYXNpY0xhYmVsU2l6ZUZ1bmN0aW9uKG5vdGVEYXRhLGNoYXJhY3RlcldpZHRoLGxpbmVIZWlnaHQscGFkZGluZyl7dmFyIHRleHQ9bm90ZURhdGEubm90ZS5sYWJlbHx8bm90ZURhdGEubm90ZS50aXRsZTt2YXIgdGV4dExlbmd0aD10ZXh0Lmxlbmd0aDt2YXIgd3JhcD1ub3RlRGF0YS5ub3RlLndyYXB8fDEyMDt2YXIgd2lkdGg9TWF0aC5taW4od3JhcCx0ZXh0TGVuZ3RoKmNoYXJhY3RlcldpZHRoKStwYWRkaW5nKjI7dmFyIGhlaWdodD1NYXRoLmNlaWwodGV4dExlbmd0aCpjaGFyYWN0ZXJXaWR0aC8xMjApKmxpbmVIZWlnaHQrcGFkZGluZyoyO3JldHVyblt3aWR0aCxoZWlnaHRdfTtmdW5jdGlvbiBidW1wQW5ub3RhdGlvbnMoYWRqdXN0YWJsZU5vdGVzLHByb3BzLHByb2Nlc3Nvcil7dmFyIHNpemU9cHJvcHMuc2l6ZSxwcm9wc1BvaW50U2l6ZUZ1bmN0aW9uPXByb3BzLnBvaW50U2l6ZUZ1bmN0aW9uLHByb3BzTGFiZWxTaXplRnVuY3Rpb249cHJvcHMubGFiZWxTaXplRnVuY3Rpb247dmFyIF9wcm9jZXNzb3IkcGFkZGluZz1wcm9jZXNzb3IucGFkZGluZyxwYWRkaW5nPV9wcm9jZXNzb3IkcGFkZGluZz09PXVuZGVmaW5lZD8xOl9wcm9jZXNzb3IkcGFkZGluZyxfcHJvY2Vzc29yJGNoYXJhY3Rlclc9cHJvY2Vzc29yLmNoYXJhY3RlcldpZHRoLGNoYXJhY3RlcldpZHRoPV9wcm9jZXNzb3IkY2hhcmFjdGVyVz09PXVuZGVmaW5lZD84Ol9wcm9jZXNzb3IkY2hhcmFjdGVyVyxfcHJvY2Vzc29yJGxpbmVIZWlnaHQ9cHJvY2Vzc29yLmxpbmVIZWlnaHQsbGluZUhlaWdodD1fcHJvY2Vzc29yJGxpbmVIZWlnaHQ9PT11bmRlZmluZWQ/MjA6X3Byb2Nlc3NvciRsaW5lSGVpZ2h0LF9wcm9jZXNzb3IkaXRlcmF0aW9ucz1wcm9jZXNzb3IuaXRlcmF0aW9ucyxpdGVyYXRpb25zPV9wcm9jZXNzb3IkaXRlcmF0aW9ucz09PXVuZGVmaW5lZD81MDA6X3Byb2Nlc3NvciRpdGVyYXRpb25zLF9wcm9jZXNzb3IkcG9pbnRTaXplRj1wcm9jZXNzb3IucG9pbnRTaXplRnVuY3Rpb24scG9pbnRTaXplRnVuY3Rpb249X3Byb2Nlc3NvciRwb2ludFNpemVGPT09dW5kZWZpbmVkP3Byb3BzUG9pbnRTaXplRnVuY3Rpb258fGJhc2ljUG9pbnRTaXplRnVuY3Rpb246X3Byb2Nlc3NvciRwb2ludFNpemVGLF9wcm9jZXNzb3IkbGFiZWxTaXplRj1wcm9jZXNzb3IubGFiZWxTaXplRnVuY3Rpb24sbGFiZWxTaXplRnVuY3Rpb249X3Byb2Nlc3NvciRsYWJlbFNpemVGPT09dW5kZWZpbmVkP3Byb3BzTGFiZWxTaXplRnVuY3Rpb258fGJhc2ljTGFiZWxTaXplRnVuY3Rpb246X3Byb2Nlc3NvciRsYWJlbFNpemVGO3ZhciBsYWJlbHM9YWRqdXN0YWJsZU5vdGVzLm1hcChmdW5jdGlvbihkLGkpe3ZhciBhbmNob3JYPWQucHJvcHMubm90ZURhdGEueCsoZC5wcm9wcy5ub3RlRGF0YS5keCE9PXVuZGVmaW5lZD9kLnByb3BzLm5vdGVEYXRhLmR4OihpJTMtMSkqLTEwKTt2YXIgYW5jaG9yWT1kLnByb3BzLm5vdGVEYXRhLnkrKGQucHJvcHMubm90ZURhdGEuZHkhPT11bmRlZmluZWQ/ZC5wcm9wcy5ub3RlRGF0YS5keTooaSUzLTEpKjEwKTt2YXIgX2xhYmVsU2l6ZUZ1bmN0aW9uPWxhYmVsU2l6ZUZ1bmN0aW9uKGQucHJvcHMubm90ZURhdGEsY2hhcmFjdGVyV2lkdGgsbGluZUhlaWdodCxwYWRkaW5nKSxfbGFiZWxTaXplRnVuY3Rpb24yPXNsaWNlZFRvQXJyYXkoX2xhYmVsU2l6ZUZ1bmN0aW9uLDIpLGxhYmVsV2lkdGg9X2xhYmVsU2l6ZUZ1bmN0aW9uMlswXSxsYWJlbEhlaWdodD1fbGFiZWxTaXplRnVuY3Rpb24yWzFdO3JldHVybnt4OmFuY2hvclgseTphbmNob3JZLGFib3ZlOmFuY2hvclk8ZC5wcm9wcy5ub3RlRGF0YS55LGxlZnQ6YW5jaG9yWDxkLnByb3BzLm5vdGVEYXRhLngsd2lkdGg6bGFiZWxXaWR0aCxoZWlnaHQ6bGFiZWxIZWlnaHQsdHlwZToibGFiZWwiLG5hbWU6IiIsb3JpZ2luYWxOb3RlOmR9fSk7dmFyIHBvaW50cz1hZGp1c3RhYmxlTm90ZXMubWFwKGZ1bmN0aW9uKGQpe3JldHVybnt4OmQucHJvcHMubm90ZURhdGEueCx5OmQucHJvcHMubm90ZURhdGEueSxmeDpkLnByb3BzLm5vdGVEYXRhLngsZnk6ZC5wcm9wcy5ub3RlRGF0YS55LHI6cG9pbnRTaXplRnVuY3Rpb24oZC5wcm9wcy5ub3RlRGF0YSksdHlwZToicG9pbnQiLG9yaWdpbmFsTm90ZTpkfX0pO3ZhciBsYWJlbHNBbmRQb2ludHM9W10uY29uY2F0KHRvQ29uc3VtYWJsZUFycmF5KGxhYmVscyksdG9Db25zdW1hYmxlQXJyYXkocG9pbnRzKSk7dmFyIG5ld0xhYmVscz1sYWJlbGVyKCkubGFiZWwobGFiZWxzKS5hbmNob3IocG9pbnRzKS53aWR0aChzaXplWzBdKS5oZWlnaHQoc2l6ZVsxXSkuc3RhcnQoaXRlcmF0aW9ucyk7bGFiZWxzLmZvckVhY2goZnVuY3Rpb24oZCl7aWYoZC50eXBlPT09ImxhYmVsIil7dmFyIGFkanVzdGVkPWFkanVzdGVkWFkoZC5vcmlnaW5hbE5vdGUucHJvcHMubm90ZURhdGEsZCxwYWRkaW5nKTtkLm9yaWdpbmFsTm90ZS5wcm9wcy5ub3RlRGF0YS5ueD1hZGp1c3RlZFswXTtkLm9yaWdpbmFsTm90ZS5wcm9wcy5ub3RlRGF0YS5ueT1hZGp1c3RlZFsxXX19KTtyZXR1cm4gYWRqdXN0YWJsZU5vdGVzfWZ1bmN0aW9uIGFkanVzdGVkWFkobm90ZSxjYWxjdWxhdGVkLHBhZGRpbmcpe2lmKG5vdGUueT5jYWxjdWxhdGVkLnkpe3JldHVybltjYWxjdWxhdGVkLngrY2FsY3VsYXRlZC53aWR0aC8yLGNhbGN1bGF0ZWQueS1jYWxjdWxhdGVkLmhlaWdodF19cmV0dXJuW2NhbGN1bGF0ZWQueCtjYWxjdWxhdGVkLndpZHRoLzIsY2FsY3VsYXRlZC55XX12YXIgY29tbW9uanNHbG9iYWw9dHlwZW9mIHdpbmRvdyE9PSJ1bmRlZmluZWQiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsIT09InVuZGVmaW5lZCI/Z2xvYmFsOnR5cGVvZiBzZWxmIT09InVuZGVmaW5lZCI/c2VsZjp7fTtmdW5jdGlvbiB1bndyYXBFeHBvcnRzKHgpe3JldHVybiB4JiZ4Ll9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCJkZWZhdWx0Iik/eFsiZGVmYXVsdCJdOnh9ZnVuY3Rpb24gY3JlYXRlQ29tbW9uanNNb2R1bGUoZm4sbW9kdWxlKXtyZXR1cm4gbW9kdWxlPXtleHBvcnRzOnt9fSxmbihtb2R1bGUsbW9kdWxlLmV4cG9ydHMpLG1vZHVsZS5leHBvcnRzfWZ1bmN0aW9uIG1ha2VFbXB0eUZ1bmN0aW9uKGFyZyl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ319dmFyIGVtcHR5RnVuY3Rpb249ZnVuY3Rpb24gZW1wdHlGdW5jdGlvbigpe307ZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJucz1tYWtlRW1wdHlGdW5jdGlvbjtlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zRmFsc2U9bWFrZUVtcHR5RnVuY3Rpb24oZmFsc2UpO2VtcHR5RnVuY3Rpb24udGhhdFJldHVybnNUcnVlPW1ha2VFbXB0eUZ1bmN0aW9uKHRydWUpO2VtcHR5RnVuY3Rpb24udGhhdFJldHVybnNOdWxsPW1ha2VFbXB0eUZ1bmN0aW9uKG51bGwpO2VtcHR5RnVuY3Rpb24udGhhdFJldHVybnNUaGlzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O2VtcHR5RnVuY3Rpb24udGhhdFJldHVybnNBcmd1bWVudD1mdW5jdGlvbihhcmcpe3JldHVybiBhcmd9O3ZhciBlbXB0eUZ1bmN0aW9uXzE9ZW1wdHlGdW5jdGlvbjtmdW5jdGlvbiBpbnZhcmlhbnQoY29uZGl0aW9uLGZvcm1hdCxhLGIsYyxkLGUsZil7aWYoIWNvbmRpdGlvbil7dmFyIGVycm9yO2lmKGZvcm1hdD09PXVuZGVmaW5lZCl7ZXJyb3I9bmV3IEVycm9yKCJNaW5pZmllZCBleGNlcHRpb24gb2NjdXJyZWQ7IHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCAiKyJmb3IgdGhlIGZ1bGwgZXJyb3IgbWVzc2FnZSBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLiIpfWVsc2V7dmFyIGFyZ3M9W2EsYixjLGQsZSxmXTt2YXIgYXJnSW5kZXg9MDtlcnJvcj1uZXcgRXJyb3IoZm9ybWF0LnJlcGxhY2UoLyVzL2csZnVuY3Rpb24oKXtyZXR1cm4gYXJnc1thcmdJbmRleCsrXX0pKTtlcnJvci5uYW1lPSJJbnZhcmlhbnQgVmlvbGF0aW9uIn1lcnJvci5mcmFtZXNUb1BvcD0xO3Rocm93IGVycm9yfX12YXIgaW52YXJpYW50XzE9aW52YXJpYW50O3ZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sczt2YXIgaGFzT3duUHJvcGVydHk9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgcHJvcElzRW51bWVyYWJsZT1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO2Z1bmN0aW9uIHRvT2JqZWN0KHZhbCl7aWYodmFsPT09bnVsbHx8dmFsPT09dW5kZWZpbmVkKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QuYXNzaWduIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCIpfXJldHVybiBPYmplY3QodmFsKX1mdW5jdGlvbiBzaG91bGRVc2VOYXRpdmUoKXt0cnl7aWYoIU9iamVjdC5hc3NpZ24pe3JldHVybiBmYWxzZX12YXIgdGVzdDE9bmV3IFN0cmluZygiYWJjIik7dGVzdDFbNV09ImRlIjtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MSlbMF09PT0iNSIpe3JldHVybiBmYWxzZX12YXIgdGVzdDI9e307Zm9yKHZhciBpPTA7aTwxMDtpKyspe3Rlc3QyWyJfIitTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXT1pfXZhciBvcmRlcjI9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDIpLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gdGVzdDJbbl19KTtpZihvcmRlcjIuam9pbigiIikhPT0iMDEyMzQ1Njc4OSIpe3JldHVybiBmYWxzZX12YXIgdGVzdDM9e307ImFiY2RlZmdoaWprbG1ub3BxcnN0Ii5zcGxpdCgiIikuZm9yRWFjaChmdW5jdGlvbihsZXR0ZXIpe3Rlc3QzW2xldHRlcl09bGV0dGVyfSk7aWYoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSx0ZXN0MykpLmpvaW4oIiIpIT09ImFiY2RlZmdoaWprbG1ub3BxcnN0Iil7cmV0dXJuIGZhbHNlfXJldHVybiB0cnVlfWNhdGNoKGVycil7cmV0dXJuIGZhbHNlfX12YXIgb2JqZWN0QXNzaWduPXNob3VsZFVzZU5hdGl2ZSgpP09iamVjdC5hc3NpZ246ZnVuY3Rpb24odGFyZ2V0LHNvdXJjZSl7dmFyIGZyb207dmFyIHRvPXRvT2JqZWN0KHRhcmdldCk7dmFyIHN5bWJvbHM7Zm9yKHZhciBzPTE7czxhcmd1bWVudHMubGVuZ3RoO3MrKyl7ZnJvbT1PYmplY3QoYXJndW1lbnRzW3NdKTtmb3IodmFyIGtleSBpbiBmcm9tKXtpZihoYXNPd25Qcm9wZXJ0eS5jYWxsKGZyb20sa2V5KSl7dG9ba2V5XT1mcm9tW2tleV19fWlmKGdldE93blByb3BlcnR5U3ltYm9scyl7c3ltYm9scz1nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJvbSk7Zm9yKHZhciBpPTA7aTxzeW1ib2xzLmxlbmd0aDtpKyspe2lmKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLHN5bWJvbHNbaV0pKXt0b1tzeW1ib2xzW2ldXT1mcm9tW3N5bWJvbHNbaV1dfX19fXJldHVybiB0b307dmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0PSJTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCI7dmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0XzE9UmVhY3RQcm9wVHlwZXNTZWNyZXQ7dmFyIGZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcz1mdW5jdGlvbiBmYWN0b3J5V2l0aFRocm93aW5nU2hpbXMoKXtmdW5jdGlvbiBzaGltKHByb3BzLHByb3BOYW1lLGNvbXBvbmVudE5hbWUsbG9jYXRpb24scHJvcEZ1bGxOYW1lLHNlY3JldCl7aWYoc2VjcmV0PT09UmVhY3RQcm9wVHlwZXNTZWNyZXRfMSl7cmV0dXJufWludmFyaWFudF8xKGZhbHNlLCJDYWxsaW5nIFByb3BUeXBlcyB2YWxpZGF0b3JzIGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiAiKyJVc2UgUHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzKCkgdG8gY2FsbCB0aGVtLiAiKyJSZWFkIG1vcmUgYXQgaHR0cDovL2ZiLm1lL3VzZS1jaGVjay1wcm9wLXR5cGVzIil9c2hpbS5pc1JlcXVpcmVkPXNoaW07ZnVuY3Rpb24gZ2V0U2hpbSgpe3JldHVybiBzaGltfXZhciBSZWFjdFByb3BUeXBlcz17YXJyYXk6c2hpbSxib29sOnNoaW0sZnVuYzpzaGltLG51bWJlcjpzaGltLG9iamVjdDpzaGltLHN0cmluZzpzaGltLHN5bWJvbDpzaGltLGFueTpzaGltLGFycmF5T2Y6Z2V0U2hpbSxlbGVtZW50OnNoaW0saW5zdGFuY2VPZjpnZXRTaGltLG5vZGU6c2hpbSxvYmplY3RPZjpnZXRTaGltLG9uZU9mOmdldFNoaW0sb25lT2ZUeXBlOmdldFNoaW0sc2hhcGU6Z2V0U2hpbSxleGFjdDpnZXRTaGltfTtSZWFjdFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcz1lbXB0eUZ1bmN0aW9uXzE7UmVhY3RQcm9wVHlwZXMuUHJvcFR5cGVzPVJlYWN0UHJvcFR5cGVzO3JldHVybiBSZWFjdFByb3BUeXBlc307dmFyIHByb3BUeXBlcz1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihtb2R1bGUpe3ttb2R1bGUuZXhwb3J0cz1mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMoKX19KTt2YXIgdHlwZUhhc2g9e2ZpbGw6ZnVuY3Rpb24gZmlsbChzdHlsZSl7cmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoInJlY3QiLHtzdHlsZTpzdHlsZSx3aWR0aDoyMCxoZWlnaHQ6MjB9KX0sbGluZTpmdW5jdGlvbiBsaW5lKHN0eWxlKXtyZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCgibGluZSIse3N0eWxlOnN0eWxlLHgxOjAseTE6MCx4MjoyMCx5MjoyMH0pfX07dmFyIExlZ2VuZD1mdW5jdGlvbihfUmVhY3QkQ29tcG9uZW50KXtpbmhlcml0cyhMZWdlbmQsX1JlYWN0JENvbXBvbmVudCk7ZnVuY3Rpb24gTGVnZW5kKCl7Y2xhc3NDYWxsQ2hlY2sodGhpcyxMZWdlbmQpO3JldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKExlZ2VuZC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihMZWdlbmQpKS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfWNyZWF0ZUNsYXNzKExlZ2VuZCxbe2tleToicmVuZGVyTGVnZW5kR3JvdXAiLHZhbHVlOmZ1bmN0aW9uIHJlbmRlckxlZ2VuZEdyb3VwKGxlZ2VuZEdyb3VwKXt2YXIgX2xlZ2VuZEdyb3VwJHR5cGU9bGVnZW5kR3JvdXAudHlwZSx0eXBlPV9sZWdlbmRHcm91cCR0eXBlPT09dW5kZWZpbmVkPyJmaWxsIjpfbGVnZW5kR3JvdXAkdHlwZSxzdHlsZUZuPWxlZ2VuZEdyb3VwLnN0eWxlRm4saXRlbXM9bGVnZW5kR3JvdXAuaXRlbXM7dmFyIHJlbmRlcmVkSXRlbXM9W107dmFyIGl0ZW1PZmZzZXQ9MDtpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0saSl7dmFyIFR5cGU9dHlwZUhhc2hbdHlwZV07dmFyIHJlbmRlcmVkVHlwZT12b2lkIDA7aWYoVHlwZSl7dmFyIHN0eWxlPXN0eWxlRm4oaXRlbSxpKTtyZW5kZXJlZFR5cGU9VHlwZShzdHlsZSl9ZWxzZXtyZW5kZXJlZFR5cGU9dHlwZShpdGVtKX1yZW5kZXJlZEl0ZW1zLnB1c2goUmVhY3QuY3JlYXRlRWxlbWVudCgiZyIse2tleToibGVnZW5kLWl0ZW0tIitpLHRyYW5zZm9ybToidHJhbnNsYXRlKDAsIitpdGVtT2Zmc2V0KyIpIn0scmVuZGVyZWRUeXBlLFJlYWN0LmNyZWF0ZUVsZW1lbnQoInRleHQiLHt5OjE1LHg6MzB9LGl0ZW0ubGFiZWwpKSk7aXRlbU9mZnNldCs9MjV9KTtyZXR1cm4gcmVuZGVyZWRJdGVtc319LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyKCl7dmFyIF90aGlzMj10aGlzO3ZhciBfcHJvcHM9dGhpcy5wcm9wcyxsZWdlbmRHcm91cHM9X3Byb3BzLmxlZ2VuZEdyb3VwcyxfcHJvcHMkdGl0bGU9X3Byb3BzLnRpdGxlLHRpdGxlPV9wcm9wcyR0aXRsZT09PXVuZGVmaW5lZD8iTGVnZW5kIjpfcHJvcHMkdGl0bGUsX3Byb3BzJHdpZHRoPV9wcm9wcy53aWR0aCx3aWR0aD1fcHJvcHMkd2lkdGg9PT11bmRlZmluZWQ/MTAwOl9wcm9wcyR3aWR0aDt2YXIgb2Zmc2V0PTMwO3ZhciByZW5kZXJlZEdyb3Vwcz1bXTtsZWdlbmRHcm91cHMuZm9yRWFjaChmdW5jdGlvbihsLGkpe29mZnNldCs9NTtyZW5kZXJlZEdyb3Vwcy5wdXNoKFJlYWN0LmNyZWF0ZUVsZW1lbnQoImxpbmUiLHtrZXk6ImxlZ2VuZC10b3AtbGluZSBsZWdlbmQtc3ltYm9sLSIraSxzdHJva2U6ImdyYXkiLHgxOjAseTE6b2Zmc2V0LHgyOndpZHRoLHkyOm9mZnNldH0pKTtvZmZzZXQrPTEwO2lmKGwubGFiZWwpe29mZnNldCs9MjA7cmVuZGVyZWRHcm91cHMucHVzaChSZWFjdC5jcmVhdGVFbGVtZW50KCJ0ZXh0Iix7a2V5OiJsZWdlbmQtdGV4dC0iK2kseTpvZmZzZXQsY2xhc3NOYW1lOiJsZWdlbmQtZ3JvdXAtbGFiZWwifSxsLmxhYmVsKSk7b2Zmc2V0Kz0xMH1yZW5kZXJlZEdyb3Vwcy5wdXNoKFJlYWN0LmNyZWF0ZUVsZW1lbnQoImciLHtrZXk6ImxlZ2VuZC1ncm91cC0iK2ksY2xhc3NOYW1lOiJsZWdlbmQtaXRlbSIsdHJhbnNmb3JtOiJ0cmFuc2xhdGUoMCwiK29mZnNldCsiKSJ9LF90aGlzMi5yZW5kZXJMZWdlbmRHcm91cChsKSkpO29mZnNldCs9bC5pdGVtcy5sZW5ndGgqMjUrMTB9KTtyZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCgiZyIsbnVsbCxSZWFjdC5jcmVhdGVFbGVtZW50KCJ0ZXh0Iix7Y2xhc3NOYW1lOiJsZWdlbmQtdGl0bGUiLHk6MjAseDp3aWR0aC8yLHRleHRBbmNob3I6Im1pZGRsZSJ9LHRpdGxlKSxyZW5kZXJlZEdyb3Vwcyl9fV0pO3JldHVybiBMZWdlbmR9KFJlYWN0LkNvbXBvbmVudCk7TGVnZW5kLnByb3BUeXBlcz17dGl0bGU6cHJvcFR5cGVzLnN0cmluZyx3aWR0aDpwcm9wVHlwZXMubnVtYmVyLGxlZ2VuZEdyb3Vwczpwcm9wVHlwZXMuYXJyYXl9O3ZhciBDb25uZWN0b3JfMT1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTp0cnVlfSk7dmFyIF9leHRlbmRzJCQxPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHRhcmdldCl7Zm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIHNvdXJjZT1hcmd1bWVudHNbaV07Zm9yKHZhciBrZXkgaW4gc291cmNlKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkpe3RhcmdldFtrZXldPXNvdXJjZVtrZXldfX19cmV0dXJuIHRhcmdldH07dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoInZhbHVlImluIGRlc2NyaXB0b3IpZGVzY3JpcHRvci53cml0YWJsZT10cnVlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsZGVzY3JpcHRvci5rZXksZGVzY3JpcHRvcil9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcn19KCk7dmFyIF9yZWFjdDI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChSZWFjdCk7ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmope3JldHVybiBvYmomJm9iai5fX2VzTW9kdWxlP29iajp7ZGVmYXVsdDpvYmp9fWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSxDb25zdHJ1Y3Rvcil7aWYoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsY2FsbCl7aWYoIXNlbGYpe3Rocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIil9cmV0dXJuIGNhbGwmJigodHlwZW9mIGNhbGw9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKGNhbGwpKT09PSJvYmplY3QifHx0eXBlb2YgY2FsbD09PSJmdW5jdGlvbiIpP2NhbGw6c2VsZn1mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT0iZnVuY3Rpb24iJiZzdXBlckNsYXNzIT09bnVsbCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiKyh0eXBlb2Ygc3VwZXJDbGFzcz09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2Yoc3VwZXJDbGFzcykpKX1zdWJDbGFzcy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzJiZzdXBlckNsYXNzLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnN1YkNsYXNzLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX19KTtpZihzdXBlckNsYXNzKU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3Msc3VwZXJDbGFzcyk6c3ViQ2xhc3MuX19wcm90b19fPXN1cGVyQ2xhc3N9dmFyIENvbm5lY3Rvcj1mdW5jdGlvbihfUmVhY3QkQ29tcG9uZW50KXtfaW5oZXJpdHMoQ29ubmVjdG9yLF9SZWFjdCRDb21wb25lbnQpO2Z1bmN0aW9uIENvbm5lY3Rvcigpe19jbGFzc0NhbGxDaGVjayh0aGlzLENvbm5lY3Rvcik7cmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKENvbm5lY3Rvci5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihDb25uZWN0b3IpKS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfV9jcmVhdGVDbGFzcyhDb25uZWN0b3IsW3trZXk6ImdldENvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uIGdldENvbXBvbmVudHMoKXt9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3ZhciBfcHJvcHM9dGhpcy5wcm9wcyxjb2xvcj1fcHJvcHMuY29sb3IsZHg9X3Byb3BzLmR4LGR5PV9wcm9wcy5keSxjdXN0b21JRD1fcHJvcHMuY3VzdG9tSUQ7aWYoZHg9PT0wJiZkeT09PTApe3JldHVybiBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZyIse2NsYXNzTmFtZToiYW5ub3RhdGlvbi1jb25uZWN0b3IifSl9dmFyIGQ9dGhpcy5nZXRDb21wb25lbnRzKHRoaXMucHJvcHMpfHxbXTt2YXIgY2xlYW5lZFByb3BzPU9iamVjdC5hc3NpZ24oe30sdGhpcy5wcm9wcyk7ZGVsZXRlIGNsZWFuZWRQcm9wcy5jaGlsZHJlbjt2YXIgY2hpbGRyZW5XaXRoUHJvcHM9X3JlYWN0Mi5kZWZhdWx0LkNoaWxkcmVuLm1hcCh0aGlzLnByb3BzLmNoaWxkcmVuLGZ1bmN0aW9uKGNoaWxkKXtyZXR1cm4gX3JlYWN0Mi5kZWZhdWx0LmNsb25lRWxlbWVudChjaGlsZCxfZXh0ZW5kcyQkMSh7fSxjbGVhbmVkUHJvcHMsY2hpbGQucHJvcHMse3NjYWxlOmNsZWFuZWRQcm9wcy5lbmRTY2FsZXx8Y2hpbGQucHJvcHMuZW5kU2NhbGUsbGluZURhdGE6ZC5jb21wb25lbnRzWzBdLmRhdGF9KSl9KTtyZXR1cm4gX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImciLF9leHRlbmRzJCQxKHtjbGFzc05hbWU6ImFubm90YXRpb24tY29ubmVjdG9yIn0sdGhpcy5wcm9wcy5nQXR0cnMpLGQuY29tcG9uZW50cyYmZC5jb21wb25lbnRzLm1hcChmdW5jdGlvbihjLGkpe3ZhciBhdHRycz17fTtpZighYylyZXR1cm4gbnVsbDtPYmplY3Qua2V5cyhjLmF0dHJzKS5mb3JFYWNoKGZ1bmN0aW9uKGspe2lmKGMuYXR0cnNba10mJmshPT0idGV4dCIpe2F0dHJzW2sucmVwbGFjZSgvLShbYS16XSkvZyxmdW5jdGlvbihnKXtyZXR1cm4gZ1sxXS50b1VwcGVyQ2FzZSgpfSldPWMuYXR0cnNba119fSk7cmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGMudHlwZSxfZXh0ZW5kcyQkMSh7bWFzazpjdXN0b21JRD8idXJsKCMiK2N1c3RvbUlEKyIpIjp1bmRlZmluZWQsa2V5OmksY2xhc3NOYW1lOmMuY2xhc3NOYW1lLGZpbGw6Im5vbmUiLHN0cm9rZTpjb2xvcn0sYXR0cnMpLGMuYXR0cnMudGV4dCl9KSxjaGlsZHJlbldpdGhQcm9wcyl9fV0pO3JldHVybiBDb25uZWN0b3J9KF9yZWFjdDIuZGVmYXVsdC5Db21wb25lbnQpO2V4cG9ydHMuZGVmYXVsdD1Db25uZWN0b3J9KTt1bndyYXBFeHBvcnRzKENvbm5lY3Rvcl8xKTt2YXIgcGk9TWF0aC5QSTt2YXIgdGF1PTIqcGk7dmFyIGVwc2lsb249MWUtNjt2YXIgdGF1RXBzaWxvbj10YXUtZXBzaWxvbjtmdW5jdGlvbiBQYXRoKCl7dGhpcy5feDA9dGhpcy5feTA9dGhpcy5feDE9dGhpcy5feTE9bnVsbDt0aGlzLl89IiJ9ZnVuY3Rpb24gcGF0aCgpe3JldHVybiBuZXcgUGF0aH1QYXRoLnByb3RvdHlwZT1wYXRoLnByb3RvdHlwZT17Y29uc3RydWN0b3I6UGF0aCxtb3ZlVG86ZnVuY3Rpb24gbW92ZVRvKHgseSl7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt4KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPSt5KX0sY2xvc2VQYXRoOmZ1bmN0aW9uIGNsb3NlUGF0aCgpe2lmKHRoaXMuX3gxIT09bnVsbCl7dGhpcy5feDE9dGhpcy5feDAsdGhpcy5feTE9dGhpcy5feTA7dGhpcy5fKz0iWiJ9fSxsaW5lVG86ZnVuY3Rpb24gbGluZVRvKHgseSl7dGhpcy5fKz0iTCIrKHRoaXMuX3gxPSt4KSsiLCIrKHRoaXMuX3kxPSt5KX0scXVhZHJhdGljQ3VydmVUbzpmdW5jdGlvbiBxdWFkcmF0aWNDdXJ2ZVRvKHgxLHkxLHgseSl7dGhpcy5fKz0iUSIrICt4MSsiLCIrICt5MSsiLCIrKHRoaXMuX3gxPSt4KSsiLCIrKHRoaXMuX3kxPSt5KX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbiBiZXppZXJDdXJ2ZVRvKHgxLHkxLHgyLHkyLHgseSl7dGhpcy5fKz0iQyIrICt4MSsiLCIrICt5MSsiLCIrICt4MisiLCIrICt5MisiLCIrKHRoaXMuX3gxPSt4KSsiLCIrKHRoaXMuX3kxPSt5KX0sYXJjVG86ZnVuY3Rpb24gYXJjVG8oeDEseTEseDIseTIscil7eDE9K3gxLHkxPSt5MSx4Mj0reDIseTI9K3kyLHI9K3I7dmFyIHgwPXRoaXMuX3gxLHkwPXRoaXMuX3kxLHgyMT14Mi14MSx5MjE9eTIteTEseDAxPXgwLXgxLHkwMT15MC15MSxsMDFfMj14MDEqeDAxK3kwMSp5MDE7aWYocjwwKXRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzOiAiK3IpO2lmKHRoaXMuX3gxPT09bnVsbCl7dGhpcy5fKz0iTSIrKHRoaXMuX3gxPXgxKSsiLCIrKHRoaXMuX3kxPXkxKX1lbHNlIGlmKCEobDAxXzI+ZXBzaWxvbikpe31lbHNlIGlmKCEoTWF0aC5hYnMoeTAxKngyMS15MjEqeDAxKT5lcHNpbG9uKXx8IXIpe3RoaXMuXys9IkwiKyh0aGlzLl94MT14MSkrIiwiKyh0aGlzLl95MT15MSl9ZWxzZXt2YXIgeDIwPXgyLXgwLHkyMD15Mi15MCxsMjFfMj14MjEqeDIxK3kyMSp5MjEsbDIwXzI9eDIwKngyMCt5MjAqeTIwLGwyMT1NYXRoLnNxcnQobDIxXzIpLGwwMT1NYXRoLnNxcnQobDAxXzIpLGw9cipNYXRoLnRhbigocGktTWF0aC5hY29zKChsMjFfMitsMDFfMi1sMjBfMikvKDIqbDIxKmwwMSkpKS8yKSx0MDE9bC9sMDEsdDIxPWwvbDIxO2lmKE1hdGguYWJzKHQwMS0xKT5lcHNpbG9uKXt0aGlzLl8rPSJMIisoeDErdDAxKngwMSkrIiwiKyh5MSt0MDEqeTAxKX10aGlzLl8rPSJBIityKyIsIityKyIsMCwwLCIrICsoeTAxKngyMD54MDEqeTIwKSsiLCIrKHRoaXMuX3gxPXgxK3QyMSp4MjEpKyIsIisodGhpcy5feTE9eTErdDIxKnkyMSl9fSxhcmM6ZnVuY3Rpb24gYXJjKHgseSxyLGEwLGExLGNjdyl7eD0reCx5PSt5LHI9K3I7dmFyIGR4PXIqTWF0aC5jb3MoYTApLGR5PXIqTWF0aC5zaW4oYTApLHgwPXgrZHgseTA9eStkeSxjdz0xXmNjdyxkYT1jY3c/YTAtYTE6YTEtYTA7aWYocjwwKXRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzOiAiK3IpO2lmKHRoaXMuX3gxPT09bnVsbCl7dGhpcy5fKz0iTSIreDArIiwiK3kwfWVsc2UgaWYoTWF0aC5hYnModGhpcy5feDEteDApPmVwc2lsb258fE1hdGguYWJzKHRoaXMuX3kxLXkwKT5lcHNpbG9uKXt0aGlzLl8rPSJMIit4MCsiLCIreTB9aWYoIXIpcmV0dXJuO2lmKGRhPDApZGE9ZGEldGF1K3RhdTtpZihkYT50YXVFcHNpbG9uKXt0aGlzLl8rPSJBIityKyIsIityKyIsMCwxLCIrY3crIiwiKyh4LWR4KSsiLCIrKHktZHkpKyJBIityKyIsIityKyIsMCwxLCIrY3crIiwiKyh0aGlzLl94MT14MCkrIiwiKyh0aGlzLl95MT15MCl9ZWxzZSBpZihkYT5lcHNpbG9uKXt0aGlzLl8rPSJBIityKyIsIityKyIsMCwiKyArKGRhPj1waSkrIiwiK2N3KyIsIisodGhpcy5feDE9eCtyKk1hdGguY29zKGExKSkrIiwiKyh0aGlzLl95MT15K3IqTWF0aC5zaW4oYTEpKX19LHJlY3Q6ZnVuY3Rpb24gcmVjdCh4LHksdyxoKXt0aGlzLl8rPSJNIisodGhpcy5feDA9dGhpcy5feDE9K3gpKyIsIisodGhpcy5feTA9dGhpcy5feTE9K3kpKyJoIisgK3crInYiKyAraCsiaCIrLXcrIloifSx0b1N0cmluZzpmdW5jdGlvbiB0b1N0cmluZygpe3JldHVybiB0aGlzLl99fTt2YXIgY29uc3RhbnQkMT1mdW5jdGlvbih4KXtyZXR1cm4gZnVuY3Rpb24gY29uc3RhbnQoKXtyZXR1cm4geH19O3ZhciBlcHNpbG9uJDE9MWUtMTI7dmFyIHBpJDE9TWF0aC5QSTt2YXIgaGFsZlBpPXBpJDEvMjt2YXIgdGF1JDE9MipwaSQxO2Z1bmN0aW9uIGFyY0lubmVyUmFkaXVzKGQpe3JldHVybiBkLmlubmVyUmFkaXVzfWZ1bmN0aW9uIGFyY091dGVyUmFkaXVzKGQpe3JldHVybiBkLm91dGVyUmFkaXVzfWZ1bmN0aW9uIGFyY1N0YXJ0QW5nbGUoZCl7cmV0dXJuIGQuc3RhcnRBbmdsZX1mdW5jdGlvbiBhcmNFbmRBbmdsZShkKXtyZXR1cm4gZC5lbmRBbmdsZX1mdW5jdGlvbiBhcmNQYWRBbmdsZShkKXtyZXR1cm4gZCYmZC5wYWRBbmdsZX1mdW5jdGlvbiBhc2luKHgpe3JldHVybiB4Pj0xP2hhbGZQaTp4PD0tMT8taGFsZlBpOk1hdGguYXNpbih4KX1mdW5jdGlvbiBpbnRlcnNlY3QoeDAseTAseDEseTEseDIseTIseDMseTMpe3ZhciB4MTA9eDEteDAseTEwPXkxLXkwLHgzMj14My14Mix5MzI9eTMteTIsdD0oeDMyKih5MC15MikteTMyKih4MC14MikpLyh5MzIqeDEwLXgzMip5MTApO3JldHVyblt4MCt0KngxMCx5MCt0KnkxMF19ZnVuY3Rpb24gY29ybmVyVGFuZ2VudHMoeDAseTAseDEseTEscjEscmMsY3cpe3ZhciB4MDE9eDAteDEseTAxPXkwLXkxLGxvPShjdz9yYzotcmMpL01hdGguc3FydCh4MDEqeDAxK3kwMSp5MDEpLG94PWxvKnkwMSxveT0tbG8qeDAxLHgxMT14MCtveCx5MTE9eTArb3kseDEwPXgxK294LHkxMD15MStveSx4MDA9KHgxMSt4MTApLzIseTAwPSh5MTEreTEwKS8yLGR4PXgxMC14MTEsZHk9eTEwLXkxMSxkMj1keCpkeCtkeSpkeSxyPXIxLXJjLEQ9eDExKnkxMC14MTAqeTExLGQ9KGR5PDA/LTE6MSkqTWF0aC5zcXJ0KE1hdGgubWF4KDAscipyKmQyLUQqRCkpLGN4MD0oRCpkeS1keCpkKS9kMixjeTA9KC1EKmR4LWR5KmQpL2QyLGN4MT0oRCpkeStkeCpkKS9kMixjeTE9KC1EKmR4K2R5KmQpL2QyLGR4MD1jeDAteDAwLGR5MD1jeTAteTAwLGR4MT1jeDEteDAwLGR5MT1jeTEteTAwO2lmKGR4MCpkeDArZHkwKmR5MD5keDEqZHgxK2R5MSpkeTEpY3gwPWN4MSxjeTA9Y3kxO3JldHVybntjeDpjeDAsY3k6Y3kwLHgwMTotb3gseTAxOi1veSx4MTE6Y3gwKihyMS9yLTEpLHkxMTpjeTAqKHIxL3ItMSl9fXZhciBhcmM9ZnVuY3Rpb24oKXt2YXIgaW5uZXJSYWRpdXM9YXJjSW5uZXJSYWRpdXMsb3V0ZXJSYWRpdXM9YXJjT3V0ZXJSYWRpdXMsY29ybmVyUmFkaXVzPWNvbnN0YW50JDEoMCkscGFkUmFkaXVzPW51bGwsc3RhcnRBbmdsZT1hcmNTdGFydEFuZ2xlLGVuZEFuZ2xlPWFyY0VuZEFuZ2xlLHBhZEFuZ2xlPWFyY1BhZEFuZ2xlLGNvbnRleHQ9bnVsbDtmdW5jdGlvbiBhcmMoKXt2YXIgYnVmZmVyLHIscjA9K2lubmVyUmFkaXVzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyMT0rb3V0ZXJSYWRpdXMuYXBwbHkodGhpcyxhcmd1bWVudHMpLGEwPXN0YXJ0QW5nbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpLWhhbGZQaSxhMT1lbmRBbmdsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyktaGFsZlBpLGRhPU1hdGguYWJzKGExLWEwKSxjdz1hMT5hMDtpZighY29udGV4dCljb250ZXh0PWJ1ZmZlcj1wYXRoKCk7aWYocjE8cjApcj1yMSxyMT1yMCxyMD1yO2lmKCEocjE+ZXBzaWxvbiQxKSljb250ZXh0Lm1vdmVUbygwLDApO2Vsc2UgaWYoZGE+dGF1JDEtZXBzaWxvbiQxKXtjb250ZXh0Lm1vdmVUbyhyMSpNYXRoLmNvcyhhMCkscjEqTWF0aC5zaW4oYTApKTtjb250ZXh0LmFyYygwLDAscjEsYTAsYTEsIWN3KTtpZihyMD5lcHNpbG9uJDEpe2NvbnRleHQubW92ZVRvKHIwKk1hdGguY29zKGExKSxyMCpNYXRoLnNpbihhMSkpO2NvbnRleHQuYXJjKDAsMCxyMCxhMSxhMCxjdyl9fWVsc2V7dmFyIGEwMT1hMCxhMTE9YTEsYTAwPWEwLGExMD1hMSxkYTA9ZGEsZGExPWRhLGFwPXBhZEFuZ2xlLmFwcGx5KHRoaXMsYXJndW1lbnRzKS8yLHJwPWFwPmVwc2lsb24kMSYmKHBhZFJhZGl1cz8rcGFkUmFkaXVzLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpNYXRoLnNxcnQocjAqcjArcjEqcjEpKSxyYz1NYXRoLm1pbihNYXRoLmFicyhyMS1yMCkvMiwrY29ybmVyUmFkaXVzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkscmMwPXJjLHJjMT1yYyx0MCx0MTtpZihycD5lcHNpbG9uJDEpe3ZhciBwMD1hc2luKHJwL3IwKk1hdGguc2luKGFwKSkscDE9YXNpbihycC9yMSpNYXRoLnNpbihhcCkpO2lmKChkYTAtPXAwKjIpPmVwc2lsb24kMSlwMCo9Y3c/MTotMSxhMDArPXAwLGExMC09cDA7ZWxzZSBkYTA9MCxhMDA9YTEwPShhMCthMSkvMjtpZigoZGExLT1wMSoyKT5lcHNpbG9uJDEpcDEqPWN3PzE6LTEsYTAxKz1wMSxhMTEtPXAxO2Vsc2UgZGExPTAsYTAxPWExMT0oYTArYTEpLzJ9dmFyIHgwMT1yMSpNYXRoLmNvcyhhMDEpLHkwMT1yMSpNYXRoLnNpbihhMDEpLHgxMD1yMCpNYXRoLmNvcyhhMTApLHkxMD1yMCpNYXRoLnNpbihhMTApO2lmKHJjPmVwc2lsb24kMSl7dmFyIHgxMT1yMSpNYXRoLmNvcyhhMTEpLHkxMT1yMSpNYXRoLnNpbihhMTEpLHgwMD1yMCpNYXRoLmNvcyhhMDApLHkwMD1yMCpNYXRoLnNpbihhMDApO2lmKGRhPHBpJDEpe3ZhciBvYz1kYTA+ZXBzaWxvbiQxP2ludGVyc2VjdCh4MDEseTAxLHgwMCx5MDAseDExLHkxMSx4MTAseTEwKTpbeDEwLHkxMF0sYXg9eDAxLW9jWzBdLGF5PXkwMS1vY1sxXSxieD14MTEtb2NbMF0sYnk9eTExLW9jWzFdLGtjPTEvTWF0aC5zaW4oTWF0aC5hY29zKChheCpieCtheSpieSkvKE1hdGguc3FydChheCpheCtheSpheSkqTWF0aC5zcXJ0KGJ4KmJ4K2J5KmJ5KSkpLzIpLGxjPU1hdGguc3FydChvY1swXSpvY1swXStvY1sxXSpvY1sxXSk7cmMwPU1hdGgubWluKHJjLChyMC1sYykvKGtjLTEpKTtyYzE9TWF0aC5taW4ocmMsKHIxLWxjKS8oa2MrMSkpfX1pZighKGRhMT5lcHNpbG9uJDEpKWNvbnRleHQubW92ZVRvKHgwMSx5MDEpO2Vsc2UgaWYocmMxPmVwc2lsb24kMSl7dDA9Y29ybmVyVGFuZ2VudHMoeDAwLHkwMCx4MDEseTAxLHIxLHJjMSxjdyk7dDE9Y29ybmVyVGFuZ2VudHMoeDExLHkxMSx4MTAseTEwLHIxLHJjMSxjdyk7Y29udGV4dC5tb3ZlVG8odDAuY3grdDAueDAxLHQwLmN5K3QwLnkwMSk7aWYocmMxPHJjKWNvbnRleHQuYXJjKHQwLmN4LHQwLmN5LHJjMSxNYXRoLmF0YW4yKHQwLnkwMSx0MC54MDEpLE1hdGguYXRhbjIodDEueTAxLHQxLngwMSksIWN3KTtlbHNle2NvbnRleHQuYXJjKHQwLmN4LHQwLmN5LHJjMSxNYXRoLmF0YW4yKHQwLnkwMSx0MC54MDEpLE1hdGguYXRhbjIodDAueTExLHQwLngxMSksIWN3KTtjb250ZXh0LmFyYygwLDAscjEsTWF0aC5hdGFuMih0MC5jeSt0MC55MTEsdDAuY3grdDAueDExKSxNYXRoLmF0YW4yKHQxLmN5K3QxLnkxMSx0MS5jeCt0MS54MTEpLCFjdyk7Y29udGV4dC5hcmModDEuY3gsdDEuY3kscmMxLE1hdGguYXRhbjIodDEueTExLHQxLngxMSksTWF0aC5hdGFuMih0MS55MDEsdDEueDAxKSwhY3cpfX1lbHNlIGNvbnRleHQubW92ZVRvKHgwMSx5MDEpLGNvbnRleHQuYXJjKDAsMCxyMSxhMDEsYTExLCFjdyk7aWYoIShyMD5lcHNpbG9uJDEpfHwhKGRhMD5lcHNpbG9uJDEpKWNvbnRleHQubGluZVRvKHgxMCx5MTApO2Vsc2UgaWYocmMwPmVwc2lsb24kMSl7dDA9Y29ybmVyVGFuZ2VudHMoeDEwLHkxMCx4MTEseTExLHIwLC1yYzAsY3cpO3QxPWNvcm5lclRhbmdlbnRzKHgwMSx5MDEseDAwLHkwMCxyMCwtcmMwLGN3KTtjb250ZXh0LmxpbmVUbyh0MC5jeCt0MC54MDEsdDAuY3krdDAueTAxKTtpZihyYzA8cmMpY29udGV4dC5hcmModDAuY3gsdDAuY3kscmMwLE1hdGguYXRhbjIodDAueTAxLHQwLngwMSksTWF0aC5hdGFuMih0MS55MDEsdDEueDAxKSwhY3cpO2Vsc2V7Y29udGV4dC5hcmModDAuY3gsdDAuY3kscmMwLE1hdGguYXRhbjIodDAueTAxLHQwLngwMSksTWF0aC5hdGFuMih0MC55MTEsdDAueDExKSwhY3cpO2NvbnRleHQuYXJjKDAsMCxyMCxNYXRoLmF0YW4yKHQwLmN5K3QwLnkxMSx0MC5jeCt0MC54MTEpLE1hdGguYXRhbjIodDEuY3krdDEueTExLHQxLmN4K3QxLngxMSksY3cpO2NvbnRleHQuYXJjKHQxLmN4LHQxLmN5LHJjMCxNYXRoLmF0YW4yKHQxLnkxMSx0MS54MTEpLE1hdGguYXRhbjIodDEueTAxLHQxLngwMSksIWN3KX19ZWxzZSBjb250ZXh0LmFyYygwLDAscjAsYTEwLGEwMCxjdyl9Y29udGV4dC5jbG9zZVBhdGgoKTtpZihidWZmZXIpcmV0dXJuIGNvbnRleHQ9bnVsbCxidWZmZXIrIiJ8fG51bGx9YXJjLmNlbnRyb2lkPWZ1bmN0aW9uKCl7dmFyIHI9KCtpbm5lclJhZGl1cy5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtvdXRlclJhZGl1cy5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzIsYT0oK3N0YXJ0QW5nbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKyArZW5kQW5nbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKS8yLXBpJDEvMjtyZXR1cm5bTWF0aC5jb3MoYSkqcixNYXRoLnNpbihhKSpyXX07YXJjLmlubmVyUmFkaXVzPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpbm5lclJhZGl1cz10eXBlb2YgXz09PSJmdW5jdGlvbiI/Xzpjb25zdGFudCQxKCtfKSxhcmMpOmlubmVyUmFkaXVzfTthcmMub3V0ZXJSYWRpdXM9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG91dGVyUmFkaXVzPXR5cGVvZiBfPT09ImZ1bmN0aW9uIj9fOmNvbnN0YW50JDEoK18pLGFyYyk6b3V0ZXJSYWRpdXN9O2FyYy5jb3JuZXJSYWRpdXM9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGNvcm5lclJhZGl1cz10eXBlb2YgXz09PSJmdW5jdGlvbiI/Xzpjb25zdGFudCQxKCtfKSxhcmMpOmNvcm5lclJhZGl1c307YXJjLnBhZFJhZGl1cz1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocGFkUmFkaXVzPV89PW51bGw/bnVsbDp0eXBlb2YgXz09PSJmdW5jdGlvbiI/Xzpjb25zdGFudCQxKCtfKSxhcmMpOnBhZFJhZGl1c307YXJjLnN0YXJ0QW5nbGU9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHN0YXJ0QW5nbGU9dHlwZW9mIF89PT0iZnVuY3Rpb24iP186Y29uc3RhbnQkMSgrXyksYXJjKTpzdGFydEFuZ2xlfTthcmMuZW5kQW5nbGU9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGVuZEFuZ2xlPXR5cGVvZiBfPT09ImZ1bmN0aW9uIj9fOmNvbnN0YW50JDEoK18pLGFyYyk6ZW5kQW5nbGV9O2FyYy5wYWRBbmdsZT1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocGFkQW5nbGU9dHlwZW9mIF89PT0iZnVuY3Rpb24iP186Y29uc3RhbnQkMSgrXyksYXJjKTpwYWRBbmdsZX07YXJjLmNvbnRleHQ9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGNvbnRleHQ9Xz09bnVsbD9udWxsOl8sYXJjKTpjb250ZXh0fTtyZXR1cm4gYXJjfTtmdW5jdGlvbiBMaW5lYXIoY29udGV4dCl7dGhpcy5fY29udGV4dD1jb250ZXh0fUxpbmVhci5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbiBhcmVhU3RhcnQoKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24gYXJlYUVuZCgpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24gbGluZVN0YXJ0KCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbiBsaW5lRW5kKCl7aWYodGhpcy5fbGluZXx8dGhpcy5fbGluZSE9PTAmJnRoaXMuX3BvaW50PT09MSl0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO3RoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbiBwb2ludCh4LHkpe3g9K3gseT0reTtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO3RoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8oeCx5KTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LHkpO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2RlZmF1bHQ6dGhpcy5fY29udGV4dC5saW5lVG8oeCx5KTticmVha319fTt2YXIgY3VydmVMaW5lYXI9ZnVuY3Rpb24oY29udGV4dCl7cmV0dXJuIG5ldyBMaW5lYXIoY29udGV4dCl9O2Z1bmN0aW9uIHgkMihwKXtyZXR1cm4gcFswXX1mdW5jdGlvbiB5JDIocCl7cmV0dXJuIHBbMV19dmFyIGxpbmU9ZnVuY3Rpb24oKXt2YXIgeCQkMT14JDIseSQkMT15JDIsZGVmaW5lZD1jb25zdGFudCQxKHRydWUpLGNvbnRleHQ9bnVsbCxjdXJ2ZT1jdXJ2ZUxpbmVhcixvdXRwdXQ9bnVsbDtmdW5jdGlvbiBsaW5lKGRhdGEpe3ZhciBpLG49ZGF0YS5sZW5ndGgsZCxkZWZpbmVkMD1mYWxzZSxidWZmZXI7aWYoY29udGV4dD09bnVsbClvdXRwdXQ9Y3VydmUoYnVmZmVyPXBhdGgoKSk7Zm9yKGk9MDtpPD1uOysraSl7aWYoIShpPG4mJmRlZmluZWQoZD1kYXRhW2ldLGksZGF0YSkpPT09ZGVmaW5lZDApe2lmKGRlZmluZWQwPSFkZWZpbmVkMClvdXRwdXQubGluZVN0YXJ0KCk7ZWxzZSBvdXRwdXQubGluZUVuZCgpfWlmKGRlZmluZWQwKW91dHB1dC5wb2ludCgreCQkMShkLGksZGF0YSksK3kkJDEoZCxpLGRhdGEpKX1pZihidWZmZXIpcmV0dXJuIG91dHB1dD1udWxsLGJ1ZmZlcisiInx8bnVsbH1saW5lLng9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHgkJDE9dHlwZW9mIF89PT0iZnVuY3Rpb24iP186Y29uc3RhbnQkMSgrXyksbGluZSk6eCQkMX07bGluZS55PWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5JCQxPXR5cGVvZiBfPT09ImZ1bmN0aW9uIj9fOmNvbnN0YW50JDEoK18pLGxpbmUpOnkkJDF9O2xpbmUuZGVmaW5lZD1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZGVmaW5lZD10eXBlb2YgXz09PSJmdW5jdGlvbiI/Xzpjb25zdGFudCQxKCEhXyksbGluZSk6ZGVmaW5lZH07bGluZS5jdXJ2ZT1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oY3VydmU9Xyxjb250ZXh0IT1udWxsJiYob3V0cHV0PWN1cnZlKGNvbnRleHQpKSxsaW5lKTpjdXJ2ZX07bGluZS5jb250ZXh0PWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhfPT1udWxsP2NvbnRleHQ9b3V0cHV0PW51bGw6b3V0cHV0PWN1cnZlKGNvbnRleHQ9XyksbGluZSk6Y29udGV4dH07cmV0dXJuIGxpbmV9O3ZhciBhcmVhPWZ1bmN0aW9uKCl7dmFyIHgwPXgkMix4MT1udWxsLHkwPWNvbnN0YW50JDEoMCkseTE9eSQyLGRlZmluZWQ9Y29uc3RhbnQkMSh0cnVlKSxjb250ZXh0PW51bGwsY3VydmU9Y3VydmVMaW5lYXIsb3V0cHV0PW51bGw7ZnVuY3Rpb24gYXJlYShkYXRhKXt2YXIgaSxqLGssbj1kYXRhLmxlbmd0aCxkLGRlZmluZWQwPWZhbHNlLGJ1ZmZlcix4MHo9bmV3IEFycmF5KG4pLHkwej1uZXcgQXJyYXkobik7aWYoY29udGV4dD09bnVsbClvdXRwdXQ9Y3VydmUoYnVmZmVyPXBhdGgoKSk7Zm9yKGk9MDtpPD1uOysraSl7aWYoIShpPG4mJmRlZmluZWQoZD1kYXRhW2ldLGksZGF0YSkpPT09ZGVmaW5lZDApe2lmKGRlZmluZWQwPSFkZWZpbmVkMCl7aj1pO291dHB1dC5hcmVhU3RhcnQoKTtvdXRwdXQubGluZVN0YXJ0KCl9ZWxzZXtvdXRwdXQubGluZUVuZCgpO291dHB1dC5saW5lU3RhcnQoKTtmb3Ioaz1pLTE7az49ajstLWspe291dHB1dC5wb2ludCh4MHpba10seTB6W2tdKX1vdXRwdXQubGluZUVuZCgpO291dHB1dC5hcmVhRW5kKCl9fWlmKGRlZmluZWQwKXt4MHpbaV09K3gwKGQsaSxkYXRhKSx5MHpbaV09K3kwKGQsaSxkYXRhKTtvdXRwdXQucG9pbnQoeDE/K3gxKGQsaSxkYXRhKTp4MHpbaV0seTE/K3kxKGQsaSxkYXRhKTp5MHpbaV0pfX1pZihidWZmZXIpcmV0dXJuIG91dHB1dD1udWxsLGJ1ZmZlcisiInx8bnVsbH1mdW5jdGlvbiBhcmVhbGluZSgpe3JldHVybiBsaW5lKCkuZGVmaW5lZChkZWZpbmVkKS5jdXJ2ZShjdXJ2ZSkuY29udGV4dChjb250ZXh0KX1hcmVhLng9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHgwPXR5cGVvZiBfPT09ImZ1bmN0aW9uIj9fOmNvbnN0YW50JDEoK18pLHgxPW51bGwsYXJlYSk6eDB9O2FyZWEueDA9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHgwPXR5cGVvZiBfPT09ImZ1bmN0aW9uIj9fOmNvbnN0YW50JDEoK18pLGFyZWEpOngwfTthcmVhLngxPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4MT1fPT1udWxsP251bGw6dHlwZW9mIF89PT0iZnVuY3Rpb24iP186Y29uc3RhbnQkMSgrXyksYXJlYSk6eDF9O2FyZWEueT1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeTA9dHlwZW9mIF89PT0iZnVuY3Rpb24iP186Y29uc3RhbnQkMSgrXykseTE9bnVsbCxhcmVhKTp5MH07YXJlYS55MD1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeTA9dHlwZW9mIF89PT0iZnVuY3Rpb24iP186Y29uc3RhbnQkMSgrXyksYXJlYSk6eTB9O2FyZWEueTE9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHkxPV89PW51bGw/bnVsbDp0eXBlb2YgXz09PSJmdW5jdGlvbiI/Xzpjb25zdGFudCQxKCtfKSxhcmVhKTp5MX07YXJlYS5saW5lWDA9YXJlYS5saW5lWTA9ZnVuY3Rpb24oKXtyZXR1cm4gYXJlYWxpbmUoKS54KHgwKS55KHkwKX07YXJlYS5saW5lWTE9ZnVuY3Rpb24oKXtyZXR1cm4gYXJlYWxpbmUoKS54KHgwKS55KHkxKX07YXJlYS5saW5lWDE9ZnVuY3Rpb24oKXtyZXR1cm4gYXJlYWxpbmUoKS54KHgxKS55KHkwKX07YXJlYS5kZWZpbmVkPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkZWZpbmVkPXR5cGVvZiBfPT09ImZ1bmN0aW9uIj9fOmNvbnN0YW50JDEoISFfKSxhcmVhKTpkZWZpbmVkfTthcmVhLmN1cnZlPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjdXJ2ZT1fLGNvbnRleHQhPW51bGwmJihvdXRwdXQ9Y3VydmUoY29udGV4dCkpLGFyZWEpOmN1cnZlfTthcmVhLmNvbnRleHQ9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KF89PW51bGw/Y29udGV4dD1vdXRwdXQ9bnVsbDpvdXRwdXQ9Y3VydmUoY29udGV4dD1fKSxhcmVhKTpjb250ZXh0fTtyZXR1cm4gYXJlYX07dmFyIGRlc2NlbmRpbmc9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYjxhPy0xOmI+YT8xOmI+PWE/MDpOYU59O3ZhciBpZGVudGl0eT1mdW5jdGlvbihkKXtyZXR1cm4gZH07dmFyIHBpZT1mdW5jdGlvbigpe3ZhciB2YWx1ZT1pZGVudGl0eSxzb3J0VmFsdWVzPWRlc2NlbmRpbmcsc29ydD1udWxsLHN0YXJ0QW5nbGU9Y29uc3RhbnQkMSgwKSxlbmRBbmdsZT1jb25zdGFudCQxKHRhdSQxKSxwYWRBbmdsZT1jb25zdGFudCQxKDApO2Z1bmN0aW9uIHBpZShkYXRhKXt2YXIgaSxuPWRhdGEubGVuZ3RoLGosayxzdW09MCxpbmRleD1uZXcgQXJyYXkobiksYXJjcz1uZXcgQXJyYXkobiksYTA9K3N0YXJ0QW5nbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpLGRhPU1hdGgubWluKHRhdSQxLE1hdGgubWF4KC10YXUkMSxlbmRBbmdsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyktYTApKSxhMSxwPU1hdGgubWluKE1hdGguYWJzKGRhKS9uLHBhZEFuZ2xlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkscGE9cCooZGE8MD8tMToxKSx2O2ZvcihpPTA7aTxuOysraSl7aWYoKHY9YXJjc1tpbmRleFtpXT1pXT0rdmFsdWUoZGF0YVtpXSxpLGRhdGEpKT4wKXtzdW0rPXZ9fWlmKHNvcnRWYWx1ZXMhPW51bGwpaW5kZXguc29ydChmdW5jdGlvbihpLGope3JldHVybiBzb3J0VmFsdWVzKGFyY3NbaV0sYXJjc1tqXSl9KTtlbHNlIGlmKHNvcnQhPW51bGwpaW5kZXguc29ydChmdW5jdGlvbihpLGope3JldHVybiBzb3J0KGRhdGFbaV0sZGF0YVtqXSl9KTtmb3IoaT0wLGs9c3VtPyhkYS1uKnBhKS9zdW06MDtpPG47KytpLGEwPWExKXtqPWluZGV4W2ldLHY9YXJjc1tqXSxhMT1hMCsodj4wP3YqazowKStwYSxhcmNzW2pdPXtkYXRhOmRhdGFbal0saW5kZXg6aSx2YWx1ZTp2LHN0YXJ0QW5nbGU6YTAsZW5kQW5nbGU6YTEscGFkQW5nbGU6cH19cmV0dXJuIGFyY3N9cGllLnZhbHVlPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh2YWx1ZT10eXBlb2YgXz09PSJmdW5jdGlvbiI/Xzpjb25zdGFudCQxKCtfKSxwaWUpOnZhbHVlfTtwaWUuc29ydFZhbHVlcz1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oc29ydFZhbHVlcz1fLHNvcnQ9bnVsbCxwaWUpOnNvcnRWYWx1ZXN9O3BpZS5zb3J0PWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzb3J0PV8sc29ydFZhbHVlcz1udWxsLHBpZSk6c29ydH07cGllLnN0YXJ0QW5nbGU9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHN0YXJ0QW5nbGU9dHlwZW9mIF89PT0iZnVuY3Rpb24iP186Y29uc3RhbnQkMSgrXykscGllKTpzdGFydEFuZ2xlfTtwaWUuZW5kQW5nbGU9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGVuZEFuZ2xlPXR5cGVvZiBfPT09ImZ1bmN0aW9uIj9fOmNvbnN0YW50JDEoK18pLHBpZSk6ZW5kQW5nbGV9O3BpZS5wYWRBbmdsZT1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocGFkQW5nbGU9dHlwZW9mIF89PT0iZnVuY3Rpb24iP186Y29uc3RhbnQkMSgrXykscGllKTpwYWRBbmdsZX07cmV0dXJuIHBpZX07dmFyIGN1cnZlUmFkaWFsTGluZWFyPWN1cnZlUmFkaWFsKGN1cnZlTGluZWFyKTtmdW5jdGlvbiBSYWRpYWwoY3VydmUpe3RoaXMuX2N1cnZlPWN1cnZlfVJhZGlhbC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbiBhcmVhU3RhcnQoKXt0aGlzLl9jdXJ2ZS5hcmVhU3RhcnQoKX0sYXJlYUVuZDpmdW5jdGlvbiBhcmVhRW5kKCl7dGhpcy5fY3VydmUuYXJlYUVuZCgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24gbGluZVN0YXJ0KCl7dGhpcy5fY3VydmUubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24gbGluZUVuZCgpe3RoaXMuX2N1cnZlLmxpbmVFbmQoKX0scG9pbnQ6ZnVuY3Rpb24gcG9pbnQoYSxyKXt0aGlzLl9jdXJ2ZS5wb2ludChyKk1hdGguc2luKGEpLHIqLU1hdGguY29zKGEpKX19O2Z1bmN0aW9uIGN1cnZlUmFkaWFsKGN1cnZlKXtmdW5jdGlvbiByYWRpYWwoY29udGV4dCl7cmV0dXJuIG5ldyBSYWRpYWwoY3VydmUoY29udGV4dCkpfXJhZGlhbC5fY3VydmU9Y3VydmU7cmV0dXJuIHJhZGlhbH1mdW5jdGlvbiByYWRpYWxMaW5lKGwpe3ZhciBjPWwuY3VydmU7bC5hbmdsZT1sLngsZGVsZXRlIGwueDtsLnJhZGl1cz1sLnksZGVsZXRlIGwueTtsLmN1cnZlPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2MoY3VydmVSYWRpYWwoXykpOmMoKS5fY3VydmV9O3JldHVybiBsfXZhciByYWRpYWxMaW5lJDE9ZnVuY3Rpb24oKXtyZXR1cm4gcmFkaWFsTGluZShsaW5lKCkuY3VydmUoY3VydmVSYWRpYWxMaW5lYXIpKX07dmFyIHJhZGlhbEFyZWE9ZnVuY3Rpb24oKXt2YXIgYT1hcmVhKCkuY3VydmUoY3VydmVSYWRpYWxMaW5lYXIpLGM9YS5jdXJ2ZSx4MD1hLmxpbmVYMCx4MT1hLmxpbmVYMSx5MD1hLmxpbmVZMCx5MT1hLmxpbmVZMTthLmFuZ2xlPWEueCxkZWxldGUgYS54O2Euc3RhcnRBbmdsZT1hLngwLGRlbGV0ZSBhLngwO2EuZW5kQW5nbGU9YS54MSxkZWxldGUgYS54MTthLnJhZGl1cz1hLnksZGVsZXRlIGEueTthLmlubmVyUmFkaXVzPWEueTAsZGVsZXRlIGEueTA7YS5vdXRlclJhZGl1cz1hLnkxLGRlbGV0ZSBhLnkxO2EubGluZVN0YXJ0QW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gcmFkaWFsTGluZSh4MCgpKX0sZGVsZXRlIGEubGluZVgwO2EubGluZUVuZEFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIHJhZGlhbExpbmUoeDEoKSl9LGRlbGV0ZSBhLmxpbmVYMTthLmxpbmVJbm5lclJhZGl1cz1mdW5jdGlvbigpe3JldHVybiByYWRpYWxMaW5lKHkwKCkpfSxkZWxldGUgYS5saW5lWTA7YS5saW5lT3V0ZXJSYWRpdXM9ZnVuY3Rpb24oKXtyZXR1cm4gcmFkaWFsTGluZSh5MSgpKX0sZGVsZXRlIGEubGluZVkxO2EuY3VydmU9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/YyhjdXJ2ZVJhZGlhbChfKSk6YygpLl9jdXJ2ZX07cmV0dXJuIGF9O3ZhciBjaXJjbGU9e2RyYXc6ZnVuY3Rpb24gZHJhdyhjb250ZXh0LHNpemUpe3ZhciByPU1hdGguc3FydChzaXplL3BpJDEpO2NvbnRleHQubW92ZVRvKHIsMCk7Y29udGV4dC5hcmMoMCwwLHIsMCx0YXUkMSl9fTt2YXIgY3Jvc3M9e2RyYXc6ZnVuY3Rpb24gZHJhdyhjb250ZXh0LHNpemUpe3ZhciByPU1hdGguc3FydChzaXplLzUpLzI7Y29udGV4dC5tb3ZlVG8oLTMqciwtcik7Y29udGV4dC5saW5lVG8oLXIsLXIpO2NvbnRleHQubGluZVRvKC1yLC0zKnIpO2NvbnRleHQubGluZVRvKHIsLTMqcik7Y29udGV4dC5saW5lVG8ociwtcik7Y29udGV4dC5saW5lVG8oMypyLC1yKTtjb250ZXh0LmxpbmVUbygzKnIscik7Y29udGV4dC5saW5lVG8ocixyKTtjb250ZXh0LmxpbmVUbyhyLDMqcik7Y29udGV4dC5saW5lVG8oLXIsMypyKTtjb250ZXh0LmxpbmVUbygtcixyKTtjb250ZXh0LmxpbmVUbygtMypyLHIpO2NvbnRleHQuY2xvc2VQYXRoKCl9fTt2YXIgdGFuMzA9TWF0aC5zcXJ0KDEvMyk7dmFyIHRhbjMwXzI9dGFuMzAqMjt2YXIgZGlhbW9uZD17ZHJhdzpmdW5jdGlvbiBkcmF3KGNvbnRleHQsc2l6ZSl7dmFyIHk9TWF0aC5zcXJ0KHNpemUvdGFuMzBfMikseD15KnRhbjMwO2NvbnRleHQubW92ZVRvKDAsLXkpO2NvbnRleHQubGluZVRvKHgsMCk7Y29udGV4dC5saW5lVG8oMCx5KTtjb250ZXh0LmxpbmVUbygteCwwKTtjb250ZXh0LmNsb3NlUGF0aCgpfX07dmFyIGthPS44OTA4MTMwOTE1MjkyODUyO3ZhciBrcj1NYXRoLnNpbihwaSQxLzEwKS9NYXRoLnNpbig3KnBpJDEvMTApO3ZhciBreD1NYXRoLnNpbih0YXUkMS8xMCkqa3I7dmFyIGt5PS1NYXRoLmNvcyh0YXUkMS8xMCkqa3I7dmFyIHN0YXI9e2RyYXc6ZnVuY3Rpb24gZHJhdyhjb250ZXh0LHNpemUpe3ZhciByPU1hdGguc3FydChzaXplKmthKSx4PWt4KnIseT1reSpyO2NvbnRleHQubW92ZVRvKDAsLXIpO2NvbnRleHQubGluZVRvKHgseSk7Zm9yKHZhciBpPTE7aTw1OysraSl7dmFyIGE9dGF1JDEqaS81LGM9TWF0aC5jb3MoYSkscz1NYXRoLnNpbihhKTtjb250ZXh0LmxpbmVUbyhzKnIsLWMqcik7Y29udGV4dC5saW5lVG8oYyp4LXMqeSxzKngrYyp5KX1jb250ZXh0LmNsb3NlUGF0aCgpfX07dmFyIHNxdWFyZT17ZHJhdzpmdW5jdGlvbiBkcmF3KGNvbnRleHQsc2l6ZSl7dmFyIHc9TWF0aC5zcXJ0KHNpemUpLHg9LXcvMjtjb250ZXh0LnJlY3QoeCx4LHcsdyl9fTt2YXIgc3FydDM9TWF0aC5zcXJ0KDMpO3ZhciB0cmlhbmdsZT17ZHJhdzpmdW5jdGlvbiBkcmF3KGNvbnRleHQsc2l6ZSl7dmFyIHk9LU1hdGguc3FydChzaXplLyhzcXJ0MyozKSk7Y29udGV4dC5tb3ZlVG8oMCx5KjIpO2NvbnRleHQubGluZVRvKC1zcXJ0Myp5LC15KTtjb250ZXh0LmxpbmVUbyhzcXJ0Myp5LC15KTtjb250ZXh0LmNsb3NlUGF0aCgpfX07dmFyIGM9LS41O3ZhciBzPU1hdGguc3FydCgzKS8yO3ZhciBrPTEvTWF0aC5zcXJ0KDEyKTt2YXIgYT0oay8yKzEpKjM7dmFyIHd5ZT17ZHJhdzpmdW5jdGlvbiBkcmF3KGNvbnRleHQsc2l6ZSl7dmFyIHI9TWF0aC5zcXJ0KHNpemUvYSkseDA9ci8yLHkwPXIqayx4MT14MCx5MT1yKmsrcix4Mj0teDEseTI9eTE7Y29udGV4dC5tb3ZlVG8oeDAseTApO2NvbnRleHQubGluZVRvKHgxLHkxKTtjb250ZXh0LmxpbmVUbyh4Mix5Mik7Y29udGV4dC5saW5lVG8oYyp4MC1zKnkwLHMqeDArYyp5MCk7Y29udGV4dC5saW5lVG8oYyp4MS1zKnkxLHMqeDErYyp5MSk7Y29udGV4dC5saW5lVG8oYyp4Mi1zKnkyLHMqeDIrYyp5Mik7Y29udGV4dC5saW5lVG8oYyp4MCtzKnkwLGMqeTAtcyp4MCk7Y29udGV4dC5saW5lVG8oYyp4MStzKnkxLGMqeTEtcyp4MSk7Y29udGV4dC5saW5lVG8oYyp4MitzKnkyLGMqeTItcyp4Mik7Y29udGV4dC5jbG9zZVBhdGgoKX19O3ZhciBzeW1ib2xzPVtjaXJjbGUsY3Jvc3MsZGlhbW9uZCxzcXVhcmUsc3Rhcix0cmlhbmdsZSx3eWVdO3ZhciBzeW1ib2w9ZnVuY3Rpb24oKXt2YXIgdHlwZT1jb25zdGFudCQxKGNpcmNsZSksc2l6ZT1jb25zdGFudCQxKDY0KSxjb250ZXh0PW51bGw7ZnVuY3Rpb24gc3ltYm9sKCl7dmFyIGJ1ZmZlcjtpZighY29udGV4dCljb250ZXh0PWJ1ZmZlcj1wYXRoKCk7dHlwZS5hcHBseSh0aGlzLGFyZ3VtZW50cykuZHJhdyhjb250ZXh0LCtzaXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKSk7aWYoYnVmZmVyKXJldHVybiBjb250ZXh0PW51bGwsYnVmZmVyKyIifHxudWxsfXN5bWJvbC50eXBlPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0eXBlPXR5cGVvZiBfPT09ImZ1bmN0aW9uIj9fOmNvbnN0YW50JDEoXyksc3ltYm9sKTp0eXBlfTtzeW1ib2wuc2l6ZT1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oc2l6ZT10eXBlb2YgXz09PSJmdW5jdGlvbiI/Xzpjb25zdGFudCQxKCtfKSxzeW1ib2wpOnNpemV9O3N5bWJvbC5jb250ZXh0PWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjb250ZXh0PV89PW51bGw/bnVsbDpfLHN5bWJvbCk6Y29udGV4dH07cmV0dXJuIHN5bWJvbH07dmFyIG5vb3AkMT1mdW5jdGlvbigpe307ZnVuY3Rpb24gX3BvaW50KHRoYXQseCx5KXt0aGF0Ll9jb250ZXh0LmJlemllckN1cnZlVG8oKDIqdGhhdC5feDArdGhhdC5feDEpLzMsKDIqdGhhdC5feTArdGhhdC5feTEpLzMsKHRoYXQuX3gwKzIqdGhhdC5feDEpLzMsKHRoYXQuX3kwKzIqdGhhdC5feTEpLzMsKHRoYXQuX3gwKzQqdGhhdC5feDEreCkvNiwodGhhdC5feTArNCp0aGF0Ll95MSt5KS82KX1mdW5jdGlvbiBCYXNpcyhjb250ZXh0KXt0aGlzLl9jb250ZXh0PWNvbnRleHR9QmFzaXMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24gYXJlYVN0YXJ0KCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uIGFyZWFFbmQoKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uIGxpbmVTdGFydCgpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3kwPXRoaXMuX3kxPU5hTjt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uIGxpbmVFbmQoKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMzpfcG9pbnQodGhpcyx0aGlzLl94MSx0aGlzLl95MSk7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLHRoaXMuX3kxKTticmVha31pZih0aGlzLl9saW5lfHx0aGlzLl9saW5lIT09MCYmdGhpcy5fcG9pbnQ9PT0xKXRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7dGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uIHBvaW50KHgseSl7eD0reCx5PSt5O3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7dGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh4LHkpOnRoaXMuX2NvbnRleHQubW92ZVRvKHgseSk7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7dGhpcy5fY29udGV4dC5saW5lVG8oKDUqdGhpcy5feDArdGhpcy5feDEpLzYsKDUqdGhpcy5feTArdGhpcy5feTEpLzYpO2RlZmF1bHQ6X3BvaW50KHRoaXMseCx5KTticmVha310aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT14O3RoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXl9fTt2YXIgYmFzaXM9ZnVuY3Rpb24oY29udGV4dCl7cmV0dXJuIG5ldyBCYXNpcyhjb250ZXh0KX07ZnVuY3Rpb24gQmFzaXNDbG9zZWQoY29udGV4dCl7dGhpcy5fY29udGV4dD1jb250ZXh0fUJhc2lzQ2xvc2VkLnByb3RvdHlwZT17YXJlYVN0YXJ0Om5vb3AkMSxhcmVhRW5kOm5vb3AkMSxsaW5lU3RhcnQ6ZnVuY3Rpb24gbGluZVN0YXJ0KCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9TmFOO3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24gbGluZUVuZCgpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAxOnt0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95Mik7dGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVha31jYXNlIDI6e3RoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MisyKnRoaXMuX3gzKS8zLCh0aGlzLl95MisyKnRoaXMuX3kzKS8zKTt0aGlzLl9jb250ZXh0LmxpbmVUbygodGhpcy5feDMrMip0aGlzLl94MikvMywodGhpcy5feTMrMip0aGlzLl95MikvMyk7dGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVha31jYXNlIDM6e3RoaXMucG9pbnQodGhpcy5feDIsdGhpcy5feTIpO3RoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpO3RoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpO2JyZWFrfX19LHBvaW50OmZ1bmN0aW9uIHBvaW50JCQxKHgseSl7eD0reCx5PSt5O3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7dGhpcy5feDI9eCx0aGlzLl95Mj15O2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO3RoaXMuX3gzPXgsdGhpcy5feTM9eTticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Mzt0aGlzLl94ND14LHRoaXMuX3k0PXk7dGhpcy5fY29udGV4dC5tb3ZlVG8oKHRoaXMuX3gwKzQqdGhpcy5feDEreCkvNiwodGhpcy5feTArNCp0aGlzLl95MSt5KS82KTticmVhaztkZWZhdWx0Ol9wb2ludCh0aGlzLHgseSk7YnJlYWt9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9eDt0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT15fX07dmFyIGJhc2lzQ2xvc2VkPWZ1bmN0aW9uKGNvbnRleHQpe3JldHVybiBuZXcgQmFzaXNDbG9zZWQoY29udGV4dCl9O2Z1bmN0aW9uIEJhc2lzT3Blbihjb250ZXh0KXt0aGlzLl9jb250ZXh0PWNvbnRleHR9QmFzaXNPcGVuLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uIGFyZWFTdGFydCgpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbiBhcmVhRW5kKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbiBsaW5lU3RhcnQoKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT1OYU47dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbiBsaW5lRW5kKCl7aWYodGhpcy5fbGluZXx8dGhpcy5fbGluZSE9PTAmJnRoaXMuX3BvaW50PT09Myl0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO3RoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbiBwb2ludCQkMSh4LHkpe3g9K3gseT0reTtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO3ZhciB4MD0odGhpcy5feDArNCp0aGlzLl94MSt4KS82LHkwPSh0aGlzLl95MCs0KnRoaXMuX3kxK3kpLzY7dGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh4MCx5MCk6dGhpcy5fY29udGV4dC5tb3ZlVG8oeDAseTApO2JyZWFrO2Nhc2UgMzp0aGlzLl9wb2ludD00O2RlZmF1bHQ6X3BvaW50KHRoaXMseCx5KTticmVha310aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT14O3RoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXl9fTt2YXIgYmFzaXNPcGVuPWZ1bmN0aW9uKGNvbnRleHQpe3JldHVybiBuZXcgQmFzaXNPcGVuKGNvbnRleHQpfTtmdW5jdGlvbiBCdW5kbGUoY29udGV4dCxiZXRhKXt0aGlzLl9iYXNpcz1uZXcgQmFzaXMoY29udGV4dCk7dGhpcy5fYmV0YT1iZXRhfUJ1bmRsZS5wcm90b3R5cGU9e2xpbmVTdGFydDpmdW5jdGlvbiBsaW5lU3RhcnQoKXt0aGlzLl94PVtdO3RoaXMuX3k9W107dGhpcy5fYmFzaXMubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24gbGluZUVuZCgpe3ZhciB4PXRoaXMuX3gseT10aGlzLl95LGo9eC5sZW5ndGgtMTtpZihqPjApe3ZhciB4MD14WzBdLHkwPXlbMF0sZHg9eFtqXS14MCxkeT15W2pdLXkwLGk9LTEsdDt3aGlsZSgrK2k8PWope3Q9aS9qO3RoaXMuX2Jhc2lzLnBvaW50KHRoaXMuX2JldGEqeFtpXSsoMS10aGlzLl9iZXRhKSooeDArdCpkeCksdGhpcy5fYmV0YSp5W2ldKygxLXRoaXMuX2JldGEpKih5MCt0KmR5KSl9fXRoaXMuX3g9dGhpcy5feT1udWxsO3RoaXMuX2Jhc2lzLmxpbmVFbmQoKX0scG9pbnQ6ZnVuY3Rpb24gcG9pbnQoeCx5KXt0aGlzLl94LnB1c2goK3gpO3RoaXMuX3kucHVzaCgreSl9fTt2YXIgYnVuZGxlPWZ1bmN0aW9uIGN1c3RvbShiZXRhKXtmdW5jdGlvbiBidW5kbGUoY29udGV4dCl7cmV0dXJuIGJldGE9PT0xP25ldyBCYXNpcyhjb250ZXh0KTpuZXcgQnVuZGxlKGNvbnRleHQsYmV0YSl9YnVuZGxlLmJldGE9ZnVuY3Rpb24oYmV0YSl7cmV0dXJuIGN1c3RvbSgrYmV0YSl9O3JldHVybiBidW5kbGV9KC44NSk7ZnVuY3Rpb24gX3BvaW50JDEodGhhdCx4LHkpe3RoYXQuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyh0aGF0Ll94MSt0aGF0Ll9rKih0aGF0Ll94Mi10aGF0Ll94MCksdGhhdC5feTErdGhhdC5fayoodGhhdC5feTItdGhhdC5feTApLHRoYXQuX3gyK3RoYXQuX2sqKHRoYXQuX3gxLXgpLHRoYXQuX3kyK3RoYXQuX2sqKHRoYXQuX3kxLXkpLHRoYXQuX3gyLHRoYXQuX3kyKX1mdW5jdGlvbiBDYXJkaW5hbChjb250ZXh0LHRlbnNpb24pe3RoaXMuX2NvbnRleHQ9Y29udGV4dDt0aGlzLl9rPSgxLXRlbnNpb24pLzZ9Q2FyZGluYWwucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24gYXJlYVN0YXJ0KCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uIGFyZWFFbmQoKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uIGxpbmVTdGFydCgpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTjt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uIGxpbmVFbmQoKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOl9wb2ludCQxKHRoaXMsdGhpcy5feDEsdGhpcy5feTEpO2JyZWFrfWlmKHRoaXMuX2xpbmV8fHRoaXMuX2xpbmUhPT0wJiZ0aGlzLl9wb2ludD09PTEpdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTt0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24gcG9pbnQoeCx5KXt4PSt4LHk9K3k7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTt0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHgseSk6dGhpcy5fY29udGV4dC5tb3ZlVG8oeCx5KTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mjt0aGlzLl94MT14LHRoaXMuX3kxPXk7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7ZGVmYXVsdDpfcG9pbnQkMSh0aGlzLHgseSk7YnJlYWt9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9eDt0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj15fX07dmFyIGNhcmRpbmFsPWZ1bmN0aW9uIGN1c3RvbSh0ZW5zaW9uKXtmdW5jdGlvbiBjYXJkaW5hbChjb250ZXh0KXtyZXR1cm4gbmV3IENhcmRpbmFsKGNvbnRleHQsdGVuc2lvbil9Y2FyZGluYWwudGVuc2lvbj1mdW5jdGlvbih0ZW5zaW9uKXtyZXR1cm4gY3VzdG9tKCt0ZW5zaW9uKX07cmV0dXJuIGNhcmRpbmFsfSgwKTtmdW5jdGlvbiBDYXJkaW5hbENsb3NlZChjb250ZXh0LHRlbnNpb24pe3RoaXMuX2NvbnRleHQ9Y29udGV4dDt0aGlzLl9rPSgxLXRlbnNpb24pLzZ9Q2FyZGluYWxDbG9zZWQucHJvdG90eXBlPXthcmVhU3RhcnQ6bm9vcCQxLGFyZWFFbmQ6bm9vcCQxLGxpbmVTdGFydDpmdW5jdGlvbiBsaW5lU3RhcnQoKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl94Mz10aGlzLl94ND10aGlzLl94NT10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj10aGlzLl95Mz10aGlzLl95ND10aGlzLl95NT1OYU47dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbiBsaW5lRW5kKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6e3RoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gzLHRoaXMuX3kzKTt0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrfWNhc2UgMjp7dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpO3RoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWt9Y2FzZSAzOnt0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKTt0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KTt0aGlzLnBvaW50KHRoaXMuX3g1LHRoaXMuX3k1KTticmVha319fSxwb2ludDpmdW5jdGlvbiBwb2ludCQkMSh4LHkpe3g9K3gseT0reTtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO3RoaXMuX3gzPXgsdGhpcy5feTM9eTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mjt0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94ND14LHRoaXMuX3k0PXkpO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO3RoaXMuX3g1PXgsdGhpcy5feTU9eTticmVhaztkZWZhdWx0Ol9wb2ludCQxKHRoaXMseCx5KTticmVha310aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj14O3RoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPXl9fTt2YXIgY2FyZGluYWxDbG9zZWQ9ZnVuY3Rpb24gY3VzdG9tKHRlbnNpb24pe2Z1bmN0aW9uIGNhcmRpbmFsJCQxKGNvbnRleHQpe3JldHVybiBuZXcgQ2FyZGluYWxDbG9zZWQoY29udGV4dCx0ZW5zaW9uKX1jYXJkaW5hbCQkMS50ZW5zaW9uPWZ1bmN0aW9uKHRlbnNpb24pe3JldHVybiBjdXN0b20oK3RlbnNpb24pfTtyZXR1cm4gY2FyZGluYWwkJDF9KDApO2Z1bmN0aW9uIENhcmRpbmFsT3Blbihjb250ZXh0LHRlbnNpb24pe3RoaXMuX2NvbnRleHQ9Y29udGV4dDt0aGlzLl9rPSgxLXRlbnNpb24pLzZ9Q2FyZGluYWxPcGVuLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uIGFyZWFTdGFydCgpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbiBhcmVhRW5kKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbiBsaW5lU3RhcnQoKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU47dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbiBsaW5lRW5kKCl7aWYodGhpcy5fbGluZXx8dGhpcy5fbGluZSE9PTAmJnRoaXMuX3BvaW50PT09Myl0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO3RoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbiBwb2ludCQkMSh4LHkpe3g9K3gseT0reTtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO3RoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5fcG9pbnQ9NDtkZWZhdWx0Ol9wb2ludCQxKHRoaXMseCx5KTticmVha310aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj14O3RoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPXl9fTt2YXIgY2FyZGluYWxPcGVuPWZ1bmN0aW9uIGN1c3RvbSh0ZW5zaW9uKXtmdW5jdGlvbiBjYXJkaW5hbCQkMShjb250ZXh0KXtyZXR1cm4gbmV3IENhcmRpbmFsT3Blbihjb250ZXh0LHRlbnNpb24pfWNhcmRpbmFsJCQxLnRlbnNpb249ZnVuY3Rpb24odGVuc2lvbil7cmV0dXJuIGN1c3RvbSgrdGVuc2lvbil9O3JldHVybiBjYXJkaW5hbCQkMX0oMCk7ZnVuY3Rpb24gX3BvaW50JDIodGhhdCx4LHkpe3ZhciB4MT10aGF0Ll94MSx5MT10aGF0Ll95MSx4Mj10aGF0Ll94Mix5Mj10aGF0Ll95MjtpZih0aGF0Ll9sMDFfYT5lcHNpbG9uJDEpe3ZhciBhPTIqdGhhdC5fbDAxXzJhKzMqdGhhdC5fbDAxX2EqdGhhdC5fbDEyX2ErdGhhdC5fbDEyXzJhLG49Myp0aGF0Ll9sMDFfYSoodGhhdC5fbDAxX2ErdGhhdC5fbDEyX2EpO3gxPSh4MSphLXRoYXQuX3gwKnRoYXQuX2wxMl8yYSt0aGF0Ll94Mip0aGF0Ll9sMDFfMmEpL247eTE9KHkxKmEtdGhhdC5feTAqdGhhdC5fbDEyXzJhK3RoYXQuX3kyKnRoYXQuX2wwMV8yYSkvbn1pZih0aGF0Ll9sMjNfYT5lcHNpbG9uJDEpe3ZhciBiPTIqdGhhdC5fbDIzXzJhKzMqdGhhdC5fbDIzX2EqdGhhdC5fbDEyX2ErdGhhdC5fbDEyXzJhLG09Myp0aGF0Ll9sMjNfYSoodGhhdC5fbDIzX2ErdGhhdC5fbDEyX2EpO3gyPSh4MipiK3RoYXQuX3gxKnRoYXQuX2wyM18yYS14KnRoYXQuX2wxMl8yYSkvbTt5Mj0oeTIqYit0aGF0Ll95MSp0aGF0Ll9sMjNfMmEteSp0aGF0Ll9sMTJfMmEpL219dGhhdC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHgxLHkxLHgyLHkyLHRoYXQuX3gyLHRoYXQuX3kyKX1mdW5jdGlvbiBDYXRtdWxsUm9tKGNvbnRleHQsYWxwaGEpe3RoaXMuX2NvbnRleHQ9Y29udGV4dDt0aGlzLl9hbHBoYT1hbHBoYX1DYXRtdWxsUm9tLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uIGFyZWFTdGFydCgpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbiBhcmVhRW5kKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbiBsaW5lU3RhcnQoKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU47dGhpcy5fbDAxX2E9dGhpcy5fbDEyX2E9dGhpcy5fbDIzX2E9dGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmE9dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbiBsaW5lRW5kKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gyLHRoaXMuX3kyKTticmVha31pZih0aGlzLl9saW5lfHx0aGlzLl9saW5lIT09MCYmdGhpcy5fcG9pbnQ9PT0xKXRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7dGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uIHBvaW50KHgseSl7eD0reCx5PSt5O2lmKHRoaXMuX3BvaW50KXt2YXIgeDIzPXRoaXMuX3gyLXgseTIzPXRoaXMuX3kyLXk7dGhpcy5fbDIzX2E9TWF0aC5zcXJ0KHRoaXMuX2wyM18yYT1NYXRoLnBvdyh4MjMqeDIzK3kyMyp5MjMsdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO3RoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8oeCx5KTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LHkpO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO2RlZmF1bHQ6X3BvaW50JDIodGhpcyx4LHkpO2JyZWFrfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hO3RoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYTt0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj14O3RoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPXl9fTt2YXIgY3VydmVDYXRtdWxsUm9tPWZ1bmN0aW9uIGN1c3RvbShhbHBoYSl7ZnVuY3Rpb24gY2F0bXVsbFJvbShjb250ZXh0KXtyZXR1cm4gYWxwaGE/bmV3IENhdG11bGxSb20oY29udGV4dCxhbHBoYSk6bmV3IENhcmRpbmFsKGNvbnRleHQsMCl9Y2F0bXVsbFJvbS5hbHBoYT1mdW5jdGlvbihhbHBoYSl7cmV0dXJuIGN1c3RvbSgrYWxwaGEpfTtyZXR1cm4gY2F0bXVsbFJvbX0oLjUpO2Z1bmN0aW9uIENhdG11bGxSb21DbG9zZWQoY29udGV4dCxhbHBoYSl7dGhpcy5fY29udGV4dD1jb250ZXh0O3RoaXMuX2FscGhhPWFscGhhfUNhdG11bGxSb21DbG9zZWQucHJvdG90eXBlPXthcmVhU3RhcnQ6bm9vcCQxLGFyZWFFbmQ6bm9vcCQxLGxpbmVTdGFydDpmdW5jdGlvbiBsaW5lU3RhcnQoKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl94Mz10aGlzLl94ND10aGlzLl94NT10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj10aGlzLl95Mz10aGlzLl95ND10aGlzLl95NT1OYU47dGhpcy5fbDAxX2E9dGhpcy5fbDEyX2E9dGhpcy5fbDIzX2E9dGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmE9dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbiBsaW5lRW5kKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6e3RoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gzLHRoaXMuX3kzKTt0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrfWNhc2UgMjp7dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpO3RoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWt9Y2FzZSAzOnt0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKTt0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KTt0aGlzLnBvaW50KHRoaXMuX3g1LHRoaXMuX3k1KTticmVha319fSxwb2ludDpmdW5jdGlvbiBwb2ludCQkMSh4LHkpe3g9K3gseT0reTtpZih0aGlzLl9wb2ludCl7dmFyIHgyMz10aGlzLl94Mi14LHkyMz10aGlzLl95Mi15O3RoaXMuX2wyM19hPU1hdGguc3FydCh0aGlzLl9sMjNfMmE9TWF0aC5wb3coeDIzKngyMyt5MjMqeTIzLHRoaXMuX2FscGhhKSl9c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTt0aGlzLl94Mz14LHRoaXMuX3kzPXk7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDQ9eCx0aGlzLl95ND15KTticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Mzt0aGlzLl94NT14LHRoaXMuX3k1PXk7YnJlYWs7ZGVmYXVsdDpfcG9pbnQkMih0aGlzLHgseSk7YnJlYWt9dGhpcy5fbDAxX2E9dGhpcy5fbDEyX2EsdGhpcy5fbDEyX2E9dGhpcy5fbDIzX2E7dGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYSx0aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhO3RoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXg7dGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9eX19O3ZhciBjYXRtdWxsUm9tQ2xvc2VkPWZ1bmN0aW9uIGN1c3RvbShhbHBoYSl7ZnVuY3Rpb24gY2F0bXVsbFJvbShjb250ZXh0KXtyZXR1cm4gYWxwaGE/bmV3IENhdG11bGxSb21DbG9zZWQoY29udGV4dCxhbHBoYSk6bmV3IENhcmRpbmFsQ2xvc2VkKGNvbnRleHQsMCl9Y2F0bXVsbFJvbS5hbHBoYT1mdW5jdGlvbihhbHBoYSl7cmV0dXJuIGN1c3RvbSgrYWxwaGEpfTtyZXR1cm4gY2F0bXVsbFJvbX0oLjUpO2Z1bmN0aW9uIENhdG11bGxSb21PcGVuKGNvbnRleHQsYWxwaGEpe3RoaXMuX2NvbnRleHQ9Y29udGV4dDt0aGlzLl9hbHBoYT1hbHBoYX1DYXRtdWxsUm9tT3Blbi5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbiBhcmVhU3RhcnQoKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24gYXJlYUVuZCgpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24gbGluZVN0YXJ0KCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOO3RoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24gbGluZUVuZCgpe2lmKHRoaXMuX2xpbmV8fHRoaXMuX2xpbmUhPT0wJiZ0aGlzLl9wb2ludD09PTMpdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTt0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24gcG9pbnQkJDEoeCx5KXt4PSt4LHk9K3k7aWYodGhpcy5fcG9pbnQpe3ZhciB4MjM9dGhpcy5feDIteCx5MjM9dGhpcy5feTIteTt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KHgyMyp4MjMreTIzKnkyMyx0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7dGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Mix0aGlzLl95Mik6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzp0aGlzLl9wb2ludD00O2RlZmF1bHQ6X3BvaW50JDIodGhpcyx4LHkpO2JyZWFrfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hO3RoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYTt0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj14O3RoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPXl9fTt2YXIgY2F0bXVsbFJvbU9wZW49ZnVuY3Rpb24gY3VzdG9tKGFscGhhKXtmdW5jdGlvbiBjYXRtdWxsUm9tKGNvbnRleHQpe3JldHVybiBhbHBoYT9uZXcgQ2F0bXVsbFJvbU9wZW4oY29udGV4dCxhbHBoYSk6bmV3IENhcmRpbmFsT3Blbihjb250ZXh0LDApfWNhdG11bGxSb20uYWxwaGE9ZnVuY3Rpb24oYWxwaGEpe3JldHVybiBjdXN0b20oK2FscGhhKX07cmV0dXJuIGNhdG11bGxSb219KC41KTtmdW5jdGlvbiBMaW5lYXJDbG9zZWQoY29udGV4dCl7dGhpcy5fY29udGV4dD1jb250ZXh0fUxpbmVhckNsb3NlZC5wcm90b3R5cGU9e2FyZWFTdGFydDpub29wJDEsYXJlYUVuZDpub29wJDEsbGluZVN0YXJ0OmZ1bmN0aW9uIGxpbmVTdGFydCgpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24gbGluZUVuZCgpe2lmKHRoaXMuX3BvaW50KXRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCl9LHBvaW50OmZ1bmN0aW9uIHBvaW50KHgseSl7eD0reCx5PSt5O2lmKHRoaXMuX3BvaW50KXRoaXMuX2NvbnRleHQubGluZVRvKHgseSk7ZWxzZSB0aGlzLl9wb2ludD0xLHRoaXMuX2NvbnRleHQubW92ZVRvKHgseSl9fTt2YXIgY3VydmVMaW5lYXJDbG9zZWQ9ZnVuY3Rpb24oY29udGV4dCl7cmV0dXJuIG5ldyBMaW5lYXJDbG9zZWQoY29udGV4dCl9O2Z1bmN0aW9uIHNpZ24oeCl7cmV0dXJuIHg8MD8tMToxfWZ1bmN0aW9uIHNsb3BlMyh0aGF0LHgyLHkyKXt2YXIgaDA9dGhhdC5feDEtdGhhdC5feDAsaDE9eDItdGhhdC5feDEsczA9KHRoYXQuX3kxLXRoYXQuX3kwKS8oaDB8fGgxPDAmJi0wKSxzMT0oeTItdGhhdC5feTEpLyhoMXx8aDA8MCYmLTApLHA9KHMwKmgxK3MxKmgwKS8oaDAraDEpO3JldHVybihzaWduKHMwKStzaWduKHMxKSkqTWF0aC5taW4oTWF0aC5hYnMoczApLE1hdGguYWJzKHMxKSwuNSpNYXRoLmFicyhwKSl8fDB9ZnVuY3Rpb24gc2xvcGUyKHRoYXQsdCl7dmFyIGg9dGhhdC5feDEtdGhhdC5feDA7cmV0dXJuIGg/KDMqKHRoYXQuX3kxLXRoYXQuX3kwKS9oLXQpLzI6dH1mdW5jdGlvbiBfcG9pbnQkMyh0aGF0LHQwLHQxKXt2YXIgeDA9dGhhdC5feDAseTA9dGhhdC5feTAseDE9dGhhdC5feDEseTE9dGhhdC5feTEsZHg9KHgxLXgwKS8zO3RoYXQuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyh4MCtkeCx5MCtkeCp0MCx4MS1keCx5MS1keCp0MSx4MSx5MSl9ZnVuY3Rpb24gTW9ub3RvbmVYKGNvbnRleHQpe3RoaXMuX2NvbnRleHQ9Y29udGV4dH1Nb25vdG9uZVgucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24gYXJlYVN0YXJ0KCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uIGFyZWFFbmQoKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uIGxpbmVTdGFydCgpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3QwPU5hTjt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uIGxpbmVFbmQoKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSx0aGlzLl95MSk7YnJlYWs7Y2FzZSAzOl9wb2ludCQzKHRoaXMsdGhpcy5fdDAsc2xvcGUyKHRoaXMsdGhpcy5fdDApKTticmVha31pZih0aGlzLl9saW5lfHx0aGlzLl9saW5lIT09MCYmdGhpcy5fcG9pbnQ9PT0xKXRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7dGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uIHBvaW50KHgseSl7dmFyIHQxPU5hTjt4PSt4LHk9K3k7aWYoeD09PXRoaXMuX3gxJiZ5PT09dGhpcy5feTEpcmV0dXJuO3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7dGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh4LHkpOnRoaXMuX2NvbnRleHQubW92ZVRvKHgseSk7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7X3BvaW50JDModGhpcyxzbG9wZTIodGhpcyx0MT1zbG9wZTModGhpcyx4LHkpKSx0MSk7YnJlYWs7ZGVmYXVsdDpfcG9pbnQkMyh0aGlzLHRoaXMuX3QwLHQxPXNsb3BlMyh0aGlzLHgseSkpO2JyZWFrfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXg7dGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9eTt0aGlzLl90MD10MX19O2Z1bmN0aW9uIE1vbm90b25lWShjb250ZXh0KXt0aGlzLl9jb250ZXh0PW5ldyBSZWZsZWN0Q29udGV4dChjb250ZXh0KX0oTW9ub3RvbmVZLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE1vbm90b25lWC5wcm90b3R5cGUpKS5wb2ludD1mdW5jdGlvbih4LHkpe01vbm90b25lWC5wcm90b3R5cGUucG9pbnQuY2FsbCh0aGlzLHkseCl9O2Z1bmN0aW9uIFJlZmxlY3RDb250ZXh0KGNvbnRleHQpe3RoaXMuX2NvbnRleHQ9Y29udGV4dH1SZWZsZWN0Q29udGV4dC5wcm90b3R5cGU9e21vdmVUbzpmdW5jdGlvbiBtb3ZlVG8oeCx5KXt0aGlzLl9jb250ZXh0Lm1vdmVUbyh5LHgpfSxjbG9zZVBhdGg6ZnVuY3Rpb24gY2xvc2VQYXRoKCl7dGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKX0sbGluZVRvOmZ1bmN0aW9uIGxpbmVUbyh4LHkpe3RoaXMuX2NvbnRleHQubGluZVRvKHkseCl9LGJlemllckN1cnZlVG86ZnVuY3Rpb24gYmV6aWVyQ3VydmVUbyh4MSx5MSx4Mix5Mix4LHkpe3RoaXMuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyh5MSx4MSx5Mix4Mix5LHgpfX07ZnVuY3Rpb24gbW9ub3RvbmVYKGNvbnRleHQpe3JldHVybiBuZXcgTW9ub3RvbmVYKGNvbnRleHQpfWZ1bmN0aW9uIG1vbm90b25lWShjb250ZXh0KXtyZXR1cm4gbmV3IE1vbm90b25lWShjb250ZXh0KX1mdW5jdGlvbiBOYXR1cmFsKGNvbnRleHQpe3RoaXMuX2NvbnRleHQ9Y29udGV4dH1OYXR1cmFsLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uIGFyZWFTdGFydCgpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbiBhcmVhRW5kKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbiBsaW5lU3RhcnQoKXt0aGlzLl94PVtdO3RoaXMuX3k9W119LGxpbmVFbmQ6ZnVuY3Rpb24gbGluZUVuZCgpe3ZhciB4PXRoaXMuX3gseT10aGlzLl95LG49eC5sZW5ndGg7aWYobil7dGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh4WzBdLHlbMF0pOnRoaXMuX2NvbnRleHQubW92ZVRvKHhbMF0seVswXSk7aWYobj09PTIpe3RoaXMuX2NvbnRleHQubGluZVRvKHhbMV0seVsxXSl9ZWxzZXt2YXIgcHg9Y29udHJvbFBvaW50cyh4KSxweT1jb250cm9sUG9pbnRzKHkpO2Zvcih2YXIgaTA9MCxpMT0xO2kxPG47KytpMCwrK2kxKXt0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8ocHhbMF1baTBdLHB5WzBdW2kwXSxweFsxXVtpMF0scHlbMV1baTBdLHhbaTFdLHlbaTFdKX19fWlmKHRoaXMuX2xpbmV8fHRoaXMuX2xpbmUhPT0wJiZuPT09MSl0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO3RoaXMuX2xpbmU9MS10aGlzLl9saW5lO3RoaXMuX3g9dGhpcy5feT1udWxsfSxwb2ludDpmdW5jdGlvbiBwb2ludCh4LHkpe3RoaXMuX3gucHVzaCgreCk7dGhpcy5feS5wdXNoKCt5KX19O2Z1bmN0aW9uIGNvbnRyb2xQb2ludHMoeCl7dmFyIGksbj14Lmxlbmd0aC0xLG0sYT1uZXcgQXJyYXkobiksYj1uZXcgQXJyYXkobikscj1uZXcgQXJyYXkobik7YVswXT0wLGJbMF09MixyWzBdPXhbMF0rMip4WzFdO2ZvcihpPTE7aTxuLTE7KytpKXthW2ldPTEsYltpXT00LHJbaV09NCp4W2ldKzIqeFtpKzFdfWFbbi0xXT0yLGJbbi0xXT03LHJbbi0xXT04Knhbbi0xXSt4W25dO2ZvcihpPTE7aTxuOysraSl7bT1hW2ldL2JbaS0xXSxiW2ldLT1tLHJbaV0tPW0qcltpLTFdfWFbbi0xXT1yW24tMV0vYltuLTFdO2ZvcihpPW4tMjtpPj0wOy0taSl7YVtpXT0ocltpXS1hW2krMV0pL2JbaV19YltuLTFdPSh4W25dK2Fbbi0xXSkvMjtmb3IoaT0wO2k8bi0xOysraSl7YltpXT0yKnhbaSsxXS1hW2krMV19cmV0dXJuW2EsYl19dmFyIG5hdHVyYWw9ZnVuY3Rpb24oY29udGV4dCl7cmV0dXJuIG5ldyBOYXR1cmFsKGNvbnRleHQpfTtmdW5jdGlvbiBTdGVwKGNvbnRleHQsdCl7dGhpcy5fY29udGV4dD1jb250ZXh0O3RoaXMuX3Q9dH1TdGVwLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uIGFyZWFTdGFydCgpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbiBhcmVhRW5kKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbiBsaW5lU3RhcnQoKXt0aGlzLl94PXRoaXMuX3k9TmFOO3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24gbGluZUVuZCgpe2lmKDA8dGhpcy5fdCYmdGhpcy5fdDwxJiZ0aGlzLl9wb2ludD09PTIpdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCx0aGlzLl95KTtpZih0aGlzLl9saW5lfHx0aGlzLl9saW5lIT09MCYmdGhpcy5fcG9pbnQ9PT0xKXRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7aWYodGhpcy5fbGluZT49MCl0aGlzLl90PTEtdGhpcy5fdCx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24gcG9pbnQoeCx5KXt4PSt4LHk9K3k7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTt0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHgseSk6dGhpcy5fY29udGV4dC5tb3ZlVG8oeCx5KTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OntpZih0aGlzLl90PD0wKXt0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94LHkpO3RoaXMuX2NvbnRleHQubGluZVRvKHgseSl9ZWxzZXt2YXIgeDE9dGhpcy5feCooMS10aGlzLl90KSt4KnRoaXMuX3Q7dGhpcy5fY29udGV4dC5saW5lVG8oeDEsdGhpcy5feSk7dGhpcy5fY29udGV4dC5saW5lVG8oeDEseSl9YnJlYWt9fXRoaXMuX3g9eCx0aGlzLl95PXl9fTt2YXIgc3RlcD1mdW5jdGlvbihjb250ZXh0KXtyZXR1cm4gbmV3IFN0ZXAoY29udGV4dCwuNSl9O2Z1bmN0aW9uIHN0ZXBCZWZvcmUoY29udGV4dCl7cmV0dXJuIG5ldyBTdGVwKGNvbnRleHQsMCl9ZnVuY3Rpb24gc3RlcEFmdGVyKGNvbnRleHQpe3JldHVybiBuZXcgU3RlcChjb250ZXh0LDEpfXZhciBzbGljZT1BcnJheS5wcm90b3R5cGUuc2xpY2U7dmFyIG5vbmU9ZnVuY3Rpb24oc2VyaWVzLG9yZGVyKXtpZighKChuPXNlcmllcy5sZW5ndGgpPjEpKXJldHVybjtmb3IodmFyIGk9MSxzMCxzMT1zZXJpZXNbb3JkZXJbMF1dLG4sbT1zMS5sZW5ndGg7aTxuOysraSl7czA9czEsczE9c2VyaWVzW29yZGVyW2ldXTtmb3IodmFyIGo9MDtqPG07KytqKXtzMVtqXVsxXSs9czFbal1bMF09aXNOYU4oczBbal1bMV0pP3MwW2pdWzBdOnMwW2pdWzFdfX19O3ZhciBub25lJDE9ZnVuY3Rpb24oc2VyaWVzKXt2YXIgbj1zZXJpZXMubGVuZ3RoLG89bmV3IEFycmF5KG4pO3doaWxlKC0tbj49MCl7b1tuXT1ufXJldHVybiBvfTtmdW5jdGlvbiBzdGFja1ZhbHVlKGQsa2V5KXtyZXR1cm4gZFtrZXldfXZhciBzdGFjaz1mdW5jdGlvbigpe3ZhciBrZXlzPWNvbnN0YW50JDEoW10pLG9yZGVyPW5vbmUkMSxvZmZzZXQ9bm9uZSx2YWx1ZT1zdGFja1ZhbHVlO2Z1bmN0aW9uIHN0YWNrKGRhdGEpe3ZhciBrej1rZXlzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxpLG09ZGF0YS5sZW5ndGgsbj1rei5sZW5ndGgsc3o9bmV3IEFycmF5KG4pLG96O2ZvcihpPTA7aTxuOysraSl7Zm9yKHZhciBraT1reltpXSxzaT1zeltpXT1uZXcgQXJyYXkobSksaj0wLHNpajtqPG07KytqKXtzaVtqXT1zaWo9WzAsK3ZhbHVlKGRhdGFbal0sa2ksaixkYXRhKV07c2lqLmRhdGE9ZGF0YVtqXX1zaS5rZXk9a2l9Zm9yKGk9MCxvej1vcmRlcihzeik7aTxuOysraSl7c3pbb3pbaV1dLmluZGV4PWl9b2Zmc2V0KHN6LG96KTtyZXR1cm4gc3p9c3RhY2sua2V5cz1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oa2V5cz10eXBlb2YgXz09PSJmdW5jdGlvbiI/Xzpjb25zdGFudCQxKHNsaWNlLmNhbGwoXykpLHN0YWNrKTprZXlzfTtzdGFjay52YWx1ZT1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odmFsdWU9dHlwZW9mIF89PT0iZnVuY3Rpb24iP186Y29uc3RhbnQkMSgrXyksc3RhY2spOnZhbHVlfTtzdGFjay5vcmRlcj1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ob3JkZXI9Xz09bnVsbD9ub25lJDE6dHlwZW9mIF89PT0iZnVuY3Rpb24iP186Y29uc3RhbnQkMShzbGljZS5jYWxsKF8pKSxzdGFjayk6b3JkZXJ9O3N0YWNrLm9mZnNldD1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ob2Zmc2V0PV89PW51bGw/bm9uZTpfLHN0YWNrKTpvZmZzZXR9O3JldHVybiBzdGFja307dmFyIGV4cGFuZD1mdW5jdGlvbihzZXJpZXMsb3JkZXIpe2lmKCEoKG49c2VyaWVzLmxlbmd0aCk+MCkpcmV0dXJuO2Zvcih2YXIgaSxuLGo9MCxtPXNlcmllc1swXS5sZW5ndGgseTtqPG07KytqKXtmb3IoeT1pPTA7aTxuOysraSl7eSs9c2VyaWVzW2ldW2pdWzFdfHwwfWlmKHkpZm9yKGk9MDtpPG47KytpKXtzZXJpZXNbaV1bal1bMV0vPXl9fW5vbmUoc2VyaWVzLG9yZGVyKX07dmFyIHNpbGhvdWV0dGU9ZnVuY3Rpb24oc2VyaWVzLG9yZGVyKXtpZighKChuPXNlcmllcy5sZW5ndGgpPjApKXJldHVybjtmb3IodmFyIGo9MCxzMD1zZXJpZXNbb3JkZXJbMF1dLG4sbT1zMC5sZW5ndGg7ajxtOysrail7Zm9yKHZhciBpPTAseT0wO2k8bjsrK2kpe3krPXNlcmllc1tpXVtqXVsxXXx8MH1zMFtqXVsxXSs9czBbal1bMF09LXkvMn1ub25lKHNlcmllcyxvcmRlcil9O3ZhciB3aWdnbGU9ZnVuY3Rpb24oc2VyaWVzLG9yZGVyKXtpZighKChuPXNlcmllcy5sZW5ndGgpPjApfHwhKChtPShzMD1zZXJpZXNbb3JkZXJbMF1dKS5sZW5ndGgpPjApKXJldHVybjtmb3IodmFyIHk9MCxqPTEsczAsbSxuO2o8bTsrK2ope2Zvcih2YXIgaT0wLHMxPTAsczI9MDtpPG47KytpKXt2YXIgc2k9c2VyaWVzW29yZGVyW2ldXSxzaWowPXNpW2pdWzFdfHwwLHNpajE9c2lbai0xXVsxXXx8MCxzMz0oc2lqMC1zaWoxKS8yO2Zvcih2YXIgaz0wO2s8aTsrK2spe3ZhciBzaz1zZXJpZXNbb3JkZXJba11dLHNrajA9c2tbal1bMV18fDAsc2tqMT1za1tqLTFdWzFdfHwwO3MzKz1za2owLXNrajF9czErPXNpajAsczIrPXMzKnNpajB9czBbai0xXVsxXSs9czBbai0xXVswXT15O2lmKHMxKXktPXMyL3MxfXMwW2otMV1bMV0rPXMwW2otMV1bMF09eTtub25lKHNlcmllcyxvcmRlcil9O3ZhciBhc2NlbmRpbmc9ZnVuY3Rpb24oc2VyaWVzKXt2YXIgc3Vtcz1zZXJpZXMubWFwKHN1bSk7cmV0dXJuIG5vbmUkMShzZXJpZXMpLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gc3Vtc1thXS1zdW1zW2JdfSl9O2Z1bmN0aW9uIHN1bShzZXJpZXMpe3ZhciBzPTAsaT0tMSxuPXNlcmllcy5sZW5ndGgsdjt3aGlsZSgrK2k8bil7aWYodj0rc2VyaWVzW2ldWzFdKXMrPXZ9cmV0dXJuIHN9dmFyIGRlc2NlbmRpbmckMT1mdW5jdGlvbihzZXJpZXMpe3JldHVybiBhc2NlbmRpbmcoc2VyaWVzKS5yZXZlcnNlKCl9O3ZhciBpbnNpZGVPdXQ9ZnVuY3Rpb24oc2VyaWVzKXt2YXIgbj1zZXJpZXMubGVuZ3RoLGksaixzdW1zPXNlcmllcy5tYXAoc3VtKSxvcmRlcj1ub25lJDEoc2VyaWVzKS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIHN1bXNbYl0tc3Vtc1thXX0pLHRvcD0wLGJvdHRvbT0wLHRvcHM9W10sYm90dG9tcz1bXTtmb3IoaT0wO2k8bjsrK2kpe2o9b3JkZXJbaV07aWYodG9wPGJvdHRvbSl7dG9wKz1zdW1zW2pdO3RvcHMucHVzaChqKX1lbHNle2JvdHRvbSs9c3Vtc1tqXTtib3R0b21zLnB1c2goail9fXJldHVybiBib3R0b21zLnJldmVyc2UoKS5jb25jYXQodG9wcyl9O3ZhciByZXZlcnNlPWZ1bmN0aW9uKHNlcmllcyl7cmV0dXJuIG5vbmUkMShzZXJpZXMpLnJldmVyc2UoKX07dmFyIGQzU2hhcGU9T2JqZWN0LmZyZWV6ZSh7YXJjOmFyYyxhcmVhOmFyZWEsbGluZTpsaW5lLHBpZTpwaWUscmFkaWFsQXJlYTpyYWRpYWxBcmVhLHJhZGlhbExpbmU6cmFkaWFsTGluZSQxLHN5bWJvbDpzeW1ib2wsc3ltYm9sczpzeW1ib2xzLHN5bWJvbENpcmNsZTpjaXJjbGUsc3ltYm9sQ3Jvc3M6Y3Jvc3Msc3ltYm9sRGlhbW9uZDpkaWFtb25kLHN5bWJvbFNxdWFyZTpzcXVhcmUsc3ltYm9sU3RhcjpzdGFyLHN5bWJvbFRyaWFuZ2xlOnRyaWFuZ2xlLHN5bWJvbFd5ZTp3eWUsY3VydmVCYXNpc0Nsb3NlZDpiYXNpc0Nsb3NlZCxjdXJ2ZUJhc2lzT3BlbjpiYXNpc09wZW4sY3VydmVCYXNpczpiYXNpcyxjdXJ2ZUJ1bmRsZTpidW5kbGUsY3VydmVDYXJkaW5hbENsb3NlZDpjYXJkaW5hbENsb3NlZCxjdXJ2ZUNhcmRpbmFsT3BlbjpjYXJkaW5hbE9wZW4sY3VydmVDYXJkaW5hbDpjYXJkaW5hbCxjdXJ2ZUNhdG11bGxSb21DbG9zZWQ6Y2F0bXVsbFJvbUNsb3NlZCxjdXJ2ZUNhdG11bGxSb21PcGVuOmNhdG11bGxSb21PcGVuLGN1cnZlQ2F0bXVsbFJvbTpjdXJ2ZUNhdG11bGxSb20sY3VydmVMaW5lYXJDbG9zZWQ6Y3VydmVMaW5lYXJDbG9zZWQsY3VydmVMaW5lYXI6Y3VydmVMaW5lYXIsY3VydmVNb25vdG9uZVg6bW9ub3RvbmVYLGN1cnZlTW9ub3RvbmVZOm1vbm90b25lWSxjdXJ2ZU5hdHVyYWw6bmF0dXJhbCxjdXJ2ZVN0ZXA6c3RlcCxjdXJ2ZVN0ZXBBZnRlcjpzdGVwQWZ0ZXIsY3VydmVTdGVwQmVmb3JlOnN0ZXBCZWZvcmUsc3RhY2s6c3RhY2ssc3RhY2tPZmZzZXRFeHBhbmQ6ZXhwYW5kLHN0YWNrT2Zmc2V0Tm9uZTpub25lLHN0YWNrT2Zmc2V0U2lsaG91ZXR0ZTpzaWxob3VldHRlLHN0YWNrT2Zmc2V0V2lnZ2xlOndpZ2dsZSxzdGFja09yZGVyQXNjZW5kaW5nOmFzY2VuZGluZyxzdGFja09yZGVyRGVzY2VuZGluZzpkZXNjZW5kaW5nJDEsc3RhY2tPcmRlckluc2lkZU91dDppbnNpZGVPdXQsc3RhY2tPcmRlck5vbmU6bm9uZSQxLHN0YWNrT3JkZXJSZXZlcnNlOnJldmVyc2V9KTt2YXIgQnVpbGRlcj1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTp0cnVlfSk7ZXhwb3J0cy5hcmNCdWlsZGVyPWV4cG9ydHMucGF0aEJ1aWxkZXI9ZXhwb3J0cy5saW5lQnVpbGRlcj11bmRlZmluZWQ7dmFyIGxpbmVCdWlsZGVyPWV4cG9ydHMubGluZUJ1aWxkZXI9ZnVuY3Rpb24gbGluZUJ1aWxkZXIoX3JlZil7dmFyIGRhdGE9X3JlZi5kYXRhLF9yZWYkY3VydmU9X3JlZi5jdXJ2ZSxjdXJ2ZT1fcmVmJGN1cnZlPT09dW5kZWZpbmVkP2QzU2hhcGUuY3VydmVMaW5lYXI6X3JlZiRjdXJ2ZSxjYW52YXNDb250ZXh0PV9yZWYuY2FudmFzQ29udGV4dCxjbGFzc05hbWU9X3JlZi5jbGFzc05hbWUsY2xhc3NJRD1fcmVmLmNsYXNzSUQ7dmFyIGxpbmVHZW49KDAsZDNTaGFwZS5saW5lKSgpLmN1cnZlKGN1cnZlKTt2YXIgYnVpbGRlcj17dHlwZToicGF0aCIsY2xhc3NOYW1lOmNsYXNzTmFtZSxjbGFzc0lEOmNsYXNzSUQsZGF0YTpkYXRhfTtpZihjYW52YXNDb250ZXh0KXtsaW5lR2VuLmNvbnRleHQoY2FudmFzQ29udGV4dCk7YnVpbGRlci5wYXRoTWV0aG9kcz1saW5lR2VufWVsc2V7YnVpbGRlci5hdHRycz17ZDpsaW5lR2VuKGRhdGEpfX1yZXR1cm4gYnVpbGRlcn07dmFyIHBhdGhCdWlsZGVyPWV4cG9ydHMucGF0aEJ1aWxkZXI9ZnVuY3Rpb24gcGF0aEJ1aWxkZXIoX3JlZjIpe3ZhciBkPV9yZWYyLmQsX3JlZjIkY3VydmU9X3JlZjIuY3VydmUsY3VydmU9X3JlZjIkY3VydmU9PT11bmRlZmluZWQ/ZDNTaGFwZS5jdXJ2ZUxpbmVhcjpfcmVmMiRjdXJ2ZSxjYW52YXNDb250ZXh0PV9yZWYyLmNhbnZhc0NvbnRleHQsY2xhc3NOYW1lPV9yZWYyLmNsYXNzTmFtZSxjbGFzc0lEPV9yZWYyLmNsYXNzSUQ7dmFyIGxpbmVHZW49KDAsZDNTaGFwZS5saW5lKSgpLmN1cnZlKGN1cnZlKTt2YXIgYnVpbGRlcj17dHlwZToicGF0aCIsY2xhc3NOYW1lOmNsYXNzTmFtZSxjbGFzc0lEOmNsYXNzSUR9O2lmKGNhbnZhc0NvbnRleHQpe2xpbmVHZW4uY29udGV4dChjYW52YXNDb250ZXh0KX1lbHNle2J1aWxkZXIuYXR0cnM9e2Q6ZH19cmV0dXJuIGJ1aWxkZXJ9O3ZhciBhcmNCdWlsZGVyPWV4cG9ydHMuYXJjQnVpbGRlcj1mdW5jdGlvbiBhcmNCdWlsZGVyKF9yZWYzKXt2YXIgZGF0YT1fcmVmMy5kYXRhLGNhbnZhc0NvbnRleHQ9X3JlZjMuY2FudmFzQ29udGV4dCxjbGFzc05hbWU9X3JlZjMuY2xhc3NOYW1lLGNsYXNzSUQ9X3JlZjMuY2xhc3NJRDt2YXIgYnVpbGRlcj17dHlwZToicGF0aCIsY2xhc3NOYW1lOmNsYXNzTmFtZSxjbGFzc0lEOmNsYXNzSUQsZGF0YTpkYXRhfTt2YXIgYXJjU2hhcGU9KDAsZDNTaGFwZS5hcmMpKCkuaW5uZXJSYWRpdXMoZGF0YS5pbm5lclJhZGl1c3x8MCkub3V0ZXJSYWRpdXMoZGF0YS5vdXRlclJhZGl1c3x8ZGF0YS5yYWRpdXN8fDIpLnN0YXJ0QW5nbGUoZGF0YS5zdGFydEFuZ2xlfHwwKS5lbmRBbmdsZShkYXRhLmVuZEFuZ2xlfHwyKk1hdGguUEkpO2lmKGNhbnZhc0NvbnRleHQpe2FyY1NoYXBlLmNvbnRleHQoY2FudmFzQ29udGV4dCl9ZWxzZXtidWlsZGVyLmF0dHJzPXtkOmFyY1NoYXBlKCl9fXJldHVybiBidWlsZGVyfX0pO3Vud3JhcEV4cG9ydHMoQnVpbGRlcik7dmFyIEJ1aWxkZXJfMT1CdWlsZGVyLmFyY0J1aWxkZXI7dmFyIEJ1aWxkZXJfMj1CdWlsZGVyLnBhdGhCdWlsZGVyO3ZhciBCdWlsZGVyXzM9QnVpbGRlci5saW5lQnVpbGRlcjt2YXIgdHlwZUxpbmU9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCJfX2VzTW9kdWxlIix7dmFsdWU6dHJ1ZX0pO2V4cG9ydHMubGluZVNldHVwPXVuZGVmaW5lZDt2YXIgbGluZVNldHVwPWV4cG9ydHMubGluZVNldHVwPWZ1bmN0aW9uIGxpbmVTZXR1cChfcmVmKXt2YXIgZHg9X3JlZi5keCxkeT1fcmVmLmR5LHJhZGl1cz1fcmVmLnJhZGl1cyxvdXRlclJhZGl1cz1fcmVmLm91dGVyUmFkaXVzLHJhZGl1c1BhZGRpbmc9X3JlZi5yYWRpdXNQYWRkaW5nLHdpZHRoPV9yZWYud2lkdGgsaGVpZ2h0PV9yZWYuaGVpZ2h0O3ZhciB4MT0wLHgyPWR4LHkxPTAseTI9ZHk7aWYob3V0ZXJSYWRpdXN8fHJhZGl1cyl7dmFyIGg9TWF0aC5zcXJ0KCh4MS14MikqKHgxLXgyKSsoeTEteTIpKih5MS15MikpO3ZhciBhbmdsZT1NYXRoLmFzaW4oLXkyL2gpO3ZhciByPShvdXRlclJhZGl1c3x8cmFkaXVzKSsocmFkaXVzUGFkZGluZ3x8MCk7eDE9TWF0aC5hYnMoTWF0aC5jb3MoYW5nbGUpKnIpKih4MjwwPy0xOjEpO3kxPU1hdGguYWJzKE1hdGguc2luKGFuZ2xlKSpyKSooeTI8MD8tMToxKX1pZih3aWR0aCYmaGVpZ2h0KXtpZih3aWR0aD4wJiZkeD4wfHx3aWR0aDwwJiZkeDwwKXtpZihNYXRoLmFicyh3aWR0aCk+TWF0aC5hYnMoZHgpKXgxPXdpZHRoLzI7ZWxzZSB4MT13aWR0aH1pZihoZWlnaHQ+MCYmZHk+MHx8aGVpZ2h0PDAmJmR5PDApe2lmKE1hdGguYWJzKGhlaWdodCk+TWF0aC5hYnMoZHkpKXkxPWhlaWdodC8yO2Vsc2UgeTE9aGVpZ2h0fWlmKHgxPT09d2lkdGgvMiYmeTE9PT1oZWlnaHQvMil7eDE9eDI7eTE9eTJ9fXJldHVybltbeDEseTFdLFt4Mix5Ml1dfTtleHBvcnRzLmRlZmF1bHQ9ZnVuY3Rpb24oY29ubmVjdG9yRGF0YSl7dmFyIGRhdGE9bGluZVNldHVwKGNvbm5lY3RvckRhdGEpO3JldHVybntjb21wb25lbnRzOlsoMCxCdWlsZGVyLmxpbmVCdWlsZGVyKSh7ZGF0YTpkYXRhLGNsYXNzTmFtZToiY29ubmVjdG9yIn0pXX19fSk7dW53cmFwRXhwb3J0cyh0eXBlTGluZSk7dmFyIHR5cGVMaW5lXzE9dHlwZUxpbmUubGluZVNldHVwO3ZhciB0eXBlQ3VydmU9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCJfX2VzTW9kdWxlIix7dmFsdWU6dHJ1ZX0pO2Z1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpe2lmKEFycmF5LmlzQXJyYXkoYXJyKSl7Zm9yKHZhciBpPTAsYXJyMj1BcnJheShhcnIubGVuZ3RoKTtpPGFyci5sZW5ndGg7aSsrKXthcnIyW2ldPWFycltpXX1yZXR1cm4gYXJyMn1lbHNle3JldHVybiBBcnJheS5mcm9tKGFycil9fXZhciBjcmVhdGVQb2ludHM9ZnVuY3Rpb24gY3JlYXRlUG9pbnRzKG9mZnNldCl7dmFyIGFuY2hvcnM9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOjI7dmFyIGRpZmY9e3g6b2Zmc2V0LngvKGFuY2hvcnMrMSkseTpvZmZzZXQueS8oYW5jaG9ycysxKX07dmFyIHA9W107dmFyIGk9MTtmb3IoO2k8PWFuY2hvcnM7aSsrKXtwLnB1c2goW2RpZmYueCppK2klMioyMCxkaWZmLnkqaS1pJTIqMjBdKX1yZXR1cm4gcH07ZXhwb3J0cy5kZWZhdWx0PWZ1bmN0aW9uKF9yZWYpe3ZhciBjdXJ2ZT1fcmVmLmN1cnZlLHBvaW50cz1fcmVmLnBvaW50cyx4PV9yZWYueCx5PV9yZWYueSxkeD1fcmVmLmR4LGR5PV9yZWYuZHkscmFkaXVzPV9yZWYucmFkaXVzLG91dGVyUmFkaXVzPV9yZWYub3V0ZXJSYWRpdXMsd2lkdGg9X3JlZi53aWR0aCxoZWlnaHQ9X3JlZi5oZWlnaHQ7aWYoIXBvaW50c3x8dHlwZW9mIHBvaW50cz09PSJudW1iZXIiKXtwb2ludHM9Y3JlYXRlUG9pbnRzKHt4OmR4LHk6ZHl9LHBvaW50cyl9aWYoIWN1cnZlKXtjdXJ2ZT1kM1NoYXBlLmN1cnZlQ2F0bXVsbFJvbX12YXIgaGFuZGxlcz1bXTt2YXIgZGF0YT0oMCx0eXBlTGluZS5saW5lU2V0dXApKHt4OngseTp5LGR4OmR4LGR5OmR5LHJhZGl1czpyYWRpdXMsb3V0ZXJSYWRpdXM6b3V0ZXJSYWRpdXMsd2lkdGg6d2lkdGgsaGVpZ2h0OmhlaWdodH0pO2RhdGE9W2RhdGFbMF1dLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocG9pbnRzKSxbZGF0YVsxXV0pO3ZhciBjb21wb25lbnRzPVsoMCxCdWlsZGVyLmxpbmVCdWlsZGVyKSh7ZGF0YTpkYXRhLGN1cnZlOmN1cnZlLGNsYXNzTmFtZToiY29ubmVjdG9yIn0pXTtyZXR1cm57Y29tcG9uZW50czpjb21wb25lbnRzLGhhbmRsZXM6aGFuZGxlc319fSk7dW53cmFwRXhwb3J0cyh0eXBlQ3VydmUpO3ZhciBDb25uZWN0b3JDdXJ2ZV8xPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywiX19lc01vZHVsZSIse3ZhbHVlOnRydWV9KTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQscHJvcHMpe2Zvcih2YXIgaT0wO2k8cHJvcHMubGVuZ3RoO2krKyl7dmFyIGRlc2NyaXB0b3I9cHJvcHNbaV07ZGVzY3JpcHRvci5lbnVtZXJhYmxlPWRlc2NyaXB0b3IuZW51bWVyYWJsZXx8ZmFsc2U7ZGVzY3JpcHRvci5jb25maWd1cmFibGU9dHJ1ZTtpZigidmFsdWUiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKX19cmV0dXJuIGZ1bmN0aW9uKENvbnN0cnVjdG9yLHByb3RvUHJvcHMsc3RhdGljUHJvcHMpe2lmKHByb3RvUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUscHJvdG9Qcm9wcyk7aWYoc3RhdGljUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3RvcixzdGF0aWNQcm9wcyk7cmV0dXJuIENvbnN0cnVjdG9yfX0oKTt2YXIgX3JlYWN0Mj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KFJlYWN0KTt2YXIgX3R5cGVDdXJ2ZTI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdCh0eXBlQ3VydmUpO3ZhciBfQ29ubmVjdG9yMz1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KENvbm5lY3Rvcl8xKTtmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iail7cmV0dXJuIG9iaiYmb2JqLl9fZXNNb2R1bGU/b2JqOntkZWZhdWx0Om9ian19ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLENvbnN0cnVjdG9yKXtpZighKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX19ZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZixjYWxsKXtpZighc2VsZil7dGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKX1yZXR1cm4gY2FsbCYmKCh0eXBlb2YgY2FsbD09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2YoY2FsbCkpPT09Im9iamVjdCJ8fHR5cGVvZiBjYWxsPT09ImZ1bmN0aW9uIik/Y2FsbDpzZWxmfWZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcyxzdXBlckNsYXNzKXtpZih0eXBlb2Ygc3VwZXJDbGFzcyE9PSJmdW5jdGlvbiImJnN1cGVyQ2xhc3MhPT1udWxsKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrKHR5cGVvZiBzdXBlckNsYXNzPT09InVuZGVmaW5lZCI/InVuZGVmaW5lZCI6X3R5cGVvZihzdXBlckNsYXNzKSkpfXN1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MmJnN1cGVyQ2xhc3MucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6c3ViQ2xhc3MsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfX0pO2lmKHN1cGVyQ2xhc3MpT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcyxzdXBlckNsYXNzKTpzdWJDbGFzcy5fX3Byb3RvX189c3VwZXJDbGFzc312YXIgQ29ubmVjdG9yQ3VydmU9ZnVuY3Rpb24oX0Nvbm5lY3Rvcil7X2luaGVyaXRzKENvbm5lY3RvckN1cnZlLF9Db25uZWN0b3IpO2Z1bmN0aW9uIENvbm5lY3RvckN1cnZlKCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsQ29ubmVjdG9yQ3VydmUpO3JldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLChDb25uZWN0b3JDdXJ2ZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihDb25uZWN0b3JDdXJ2ZSkpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9X2NyZWF0ZUNsYXNzKENvbm5lY3RvckN1cnZlLFt7a2V5OiJnZXRDb21wb25lbnRzIix2YWx1ZTpmdW5jdGlvbiBnZXRDb21wb25lbnRzKF9yZWYpe3ZhciBjdXJ2ZT1fcmVmLmN1cnZlLHBvaW50cz1fcmVmLnBvaW50cyx4PV9yZWYueCx5PV9yZWYueSxkeD1fcmVmLmR4LGR5PV9yZWYuZHkscmFkaXVzPV9yZWYucmFkaXVzLG91dGVyUmFkaXVzPV9yZWYub3V0ZXJSYWRpdXMsd2lkdGg9X3JlZi53aWR0aCxoZWlnaHQ9X3JlZi5oZWlnaHQ7cmV0dXJuKDAsX3R5cGVDdXJ2ZTIuZGVmYXVsdCkoe2N1cnZlOmN1cnZlLHBvaW50czpwb2ludHMseDp4LHk6eSxkeDpkeCxkeTpkeSxyYWRpdXM6cmFkaXVzLG91dGVyUmFkaXVzOm91dGVyUmFkaXVzLHdpZHRoOndpZHRoLGhlaWdodDpoZWlnaHR9KX19XSk7cmV0dXJuIENvbm5lY3RvckN1cnZlfShfQ29ubmVjdG9yMy5kZWZhdWx0KTtleHBvcnRzLmRlZmF1bHQ9Q29ubmVjdG9yQ3VydmV9KTt1bndyYXBFeHBvcnRzKENvbm5lY3RvckN1cnZlXzEpO3ZhciB0eXBlRWxib3c9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCJfX2VzTW9kdWxlIix7dmFsdWU6dHJ1ZX0pO2V4cG9ydHMuZGVmYXVsdD1mdW5jdGlvbihfcmVmKXt2YXIgZHg9X3JlZi5keCxkeT1fcmVmLmR5LHJhZGl1cz1fcmVmLnJhZGl1cyxvdXRlclJhZGl1cz1fcmVmLm91dGVyUmFkaXVzLHJhZGl1c1BhZGRpbmc9X3JlZi5yYWRpdXNQYWRkaW5nLHdpZHRoPV9yZWYud2lkdGgsaGVpZ2h0PV9yZWYuaGVpZ2h0O3ZhciB4MT0wLHgyPWR4LHkxPTAseTI9ZHk7aWYod2lkdGgmJmhlaWdodCl7aWYod2lkdGg+MCYmZHg+MHx8d2lkdGg8MCYmZHg8MCl7aWYoTWF0aC5hYnMod2lkdGgpPk1hdGguYWJzKGR4KSl4MT13aWR0aC8yO2Vsc2UgeDE9d2lkdGh9aWYoaGVpZ2h0PjAmJmR5PjB8fGhlaWdodDwwJiZkeTwwKXtpZihNYXRoLmFicyhoZWlnaHQpPk1hdGguYWJzKGR5KSl5MT1oZWlnaHQvMjtlbHNlIHkxPWhlaWdodH1pZih4MT09PXdpZHRoLzImJnkxPT09aGVpZ2h0LzIpe3gxPXgyO3kxPXkyfX12YXIgZGF0YT1bW3gxLHkxXSxbeDIseTJdXTt2YXIgZGlmZlk9eTIteTE7dmFyIGRpZmZYPXgyLXgxO3ZhciB4ZT14Mjt2YXIgeWU9eTI7dmFyIG9wcG9zaXRlPXkyPHkxJiZ4Mj54MXx8eDI8eDEmJnkyPnkxPy0xOjE7aWYoTWF0aC5hYnMoZGlmZlgpPE1hdGguYWJzKGRpZmZZKSl7eGU9eDI7eWU9eTErZGlmZlgqb3Bwb3NpdGV9ZWxzZXt5ZT15Mjt4ZT14MStkaWZmWSpvcHBvc2l0ZX1pZihvdXRlclJhZGl1c3x8cmFkaXVzKXt2YXIgcj0ob3V0ZXJSYWRpdXN8fHJhZGl1cykrKHJhZGl1c1BhZGRpbmd8fDApO3ZhciBsZW5ndGg9ci9NYXRoLnNxcnQoMik7aWYoTWF0aC5hYnMoZGlmZlgpPmxlbmd0aCYmTWF0aC5hYnMoZGlmZlkpPmxlbmd0aCl7eDE9bGVuZ3RoKih4MjwwPy0xOjEpO3kxPWxlbmd0aCooeTI8MD8tMToxKTtkYXRhPVtbeDEseTFdLFt4ZSx5ZV0sW3gyLHkyXV19ZWxzZSBpZihNYXRoLmFicyhkaWZmWCk+TWF0aC5hYnMoZGlmZlkpKXt2YXIgYW5nbGU9TWF0aC5hc2luKC15Mi9yKTt4MT1NYXRoLmFicyhNYXRoLmNvcyhhbmdsZSkqcikqKHgyPDA/LTE6MSk7ZGF0YT1bW3gxLHkyXSxbeDIseTJdXX1lbHNle3ZhciBfYW5nbGU9TWF0aC5hY29zKHgyL3IpO3kxPU1hdGguYWJzKE1hdGguc2luKF9hbmdsZSkqcikqKHkyPDA/LTE6MSk7ZGF0YT1bW3gyLHkxXSxbeDIseTJdXX19ZWxzZXtkYXRhPVtbeDEseTFdLFt4ZSx5ZV0sW3gyLHkyXV19cmV0dXJue2NvbXBvbmVudHM6WygwLEJ1aWxkZXIubGluZUJ1aWxkZXIpKHtkYXRhOmRhdGEsY2xhc3NOYW1lOiJjb25uZWN0b3IifSldfX19KTt1bndyYXBFeHBvcnRzKHR5cGVFbGJvdyk7dmFyIENvbm5lY3RvckVsYm93XzE9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCJfX2VzTW9kdWxlIix7dmFsdWU6dHJ1ZX0pO3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCxwcm9wcyl7Zm9yKHZhciBpPTA7aTxwcm9wcy5sZW5ndGg7aSsrKXt2YXIgZGVzY3JpcHRvcj1wcm9wc1tpXTtkZXNjcmlwdG9yLmVudW1lcmFibGU9ZGVzY3JpcHRvci5lbnVtZXJhYmxlfHxmYWxzZTtkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZT10cnVlO2lmKCJ2YWx1ZSJpbiBkZXNjcmlwdG9yKWRlc2NyaXB0b3Iud3JpdGFibGU9dHJ1ZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LGRlc2NyaXB0b3Iua2V5LGRlc2NyaXB0b3IpfX1yZXR1cm4gZnVuY3Rpb24oQ29uc3RydWN0b3IscHJvdG9Qcm9wcyxzdGF0aWNQcm9wcyl7aWYocHJvdG9Qcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSxwcm90b1Byb3BzKTtpZihzdGF0aWNQcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLHN0YXRpY1Byb3BzKTtyZXR1cm4gQ29uc3RydWN0b3J9fSgpO3ZhciBfcmVhY3QyPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoUmVhY3QpO3ZhciBfdHlwZUVsYm93Mj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KHR5cGVFbGJvdyk7dmFyIF9Db25uZWN0b3IzPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoQ29ubmVjdG9yXzEpO2Z1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKXtyZXR1cm4gb2JqJiZvYmouX19lc01vZHVsZT9vYmo6e2RlZmF1bHQ6b2JqfX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpfXJldHVybiBjYWxsJiYoKHR5cGVvZiBjYWxsPT09InVuZGVmaW5lZCI/InVuZGVmaW5lZCI6X3R5cGVvZihjYWxsKSk9PT0ib2JqZWN0Inx8dHlwZW9mIGNhbGw9PT0iZnVuY3Rpb24iKT9jYWxsOnNlbGZ9ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLHN1cGVyQ2xhc3Mpe2lmKHR5cGVvZiBzdXBlckNsYXNzIT09ImZ1bmN0aW9uIiYmc3VwZXJDbGFzcyE9PW51bGwpe3Rocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIisodHlwZW9mIHN1cGVyQ2xhc3M9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKHN1cGVyQ2xhc3MpKSl9c3ViQ2xhc3MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyYmc3VwZXJDbGFzcy5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpzdWJDbGFzcyxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9fSk7aWYoc3VwZXJDbGFzcylPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLHN1cGVyQ2xhc3MpOnN1YkNsYXNzLl9fcHJvdG9fXz1zdXBlckNsYXNzfXZhciBDb25uZWN0b3JFbGJvdz1mdW5jdGlvbihfQ29ubmVjdG9yKXtfaW5oZXJpdHMoQ29ubmVjdG9yRWxib3csX0Nvbm5lY3Rvcik7ZnVuY3Rpb24gQ29ubmVjdG9yRWxib3coKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxDb25uZWN0b3JFbGJvdyk7cmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKENvbm5lY3RvckVsYm93Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKENvbm5lY3RvckVsYm93KSkuYXBwbHkodGhpcyxhcmd1bWVudHMpKX1fY3JlYXRlQ2xhc3MoQ29ubmVjdG9yRWxib3csW3trZXk6ImdldENvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uIGdldENvbXBvbmVudHMoX3JlZil7dmFyIHg9X3JlZi54LHk9X3JlZi55LGR5PV9yZWYuZHksZHg9X3JlZi5keCxyYWRpdXM9X3JlZi5yYWRpdXMscmFkaXVzUGFkZGluZz1fcmVmLnJhZGl1c1BhZGRpbmcsb3V0ZXJSYWRpdXM9X3JlZi5vdXRlclJhZGl1cyx3aWR0aD1fcmVmLndpZHRoLGhlaWdodD1fcmVmLmhlaWdodDtyZXR1cm4oMCxfdHlwZUVsYm93Mi5kZWZhdWx0KSh7eDp4LHk6eSxkeDpkeCxkeTpkeSxyYWRpdXM6cmFkaXVzLHJhZGl1c1BhZGRpbmc6cmFkaXVzUGFkZGluZyxvdXRlclJhZGl1czpvdXRlclJhZGl1cyx3aWR0aDp3aWR0aCxoZWlnaHQ6aGVpZ2h0fSl9fV0pO3JldHVybiBDb25uZWN0b3JFbGJvd30oX0Nvbm5lY3RvcjMuZGVmYXVsdCk7ZXhwb3J0cy5kZWZhdWx0PUNvbm5lY3RvckVsYm93fSk7dW53cmFwRXhwb3J0cyhDb25uZWN0b3JFbGJvd18xKTt2YXIgQ29ubmVjdG9yTGluZV8xPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywiX19lc01vZHVsZSIse3ZhbHVlOnRydWV9KTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQscHJvcHMpe2Zvcih2YXIgaT0wO2k8cHJvcHMubGVuZ3RoO2krKyl7dmFyIGRlc2NyaXB0b3I9cHJvcHNbaV07ZGVzY3JpcHRvci5lbnVtZXJhYmxlPWRlc2NyaXB0b3IuZW51bWVyYWJsZXx8ZmFsc2U7ZGVzY3JpcHRvci5jb25maWd1cmFibGU9dHJ1ZTtpZigidmFsdWUiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKX19cmV0dXJuIGZ1bmN0aW9uKENvbnN0cnVjdG9yLHByb3RvUHJvcHMsc3RhdGljUHJvcHMpe2lmKHByb3RvUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUscHJvdG9Qcm9wcyk7aWYoc3RhdGljUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3RvcixzdGF0aWNQcm9wcyk7cmV0dXJuIENvbnN0cnVjdG9yfX0oKTt2YXIgX3JlYWN0Mj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KFJlYWN0KTt2YXIgX3R5cGVMaW5lMj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KHR5cGVMaW5lKTt2YXIgX0Nvbm5lY3RvcjM9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChDb25uZWN0b3JfMSk7ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmope3JldHVybiBvYmomJm9iai5fX2VzTW9kdWxlP29iajp7ZGVmYXVsdDpvYmp9fWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSxDb25zdHJ1Y3Rvcil7aWYoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsY2FsbCl7aWYoIXNlbGYpe3Rocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIil9cmV0dXJuIGNhbGwmJigodHlwZW9mIGNhbGw9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKGNhbGwpKT09PSJvYmplY3QifHx0eXBlb2YgY2FsbD09PSJmdW5jdGlvbiIpP2NhbGw6c2VsZn1mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT0iZnVuY3Rpb24iJiZzdXBlckNsYXNzIT09bnVsbCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiKyh0eXBlb2Ygc3VwZXJDbGFzcz09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2Yoc3VwZXJDbGFzcykpKX1zdWJDbGFzcy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzJiZzdXBlckNsYXNzLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnN1YkNsYXNzLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX19KTtpZihzdXBlckNsYXNzKU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3Msc3VwZXJDbGFzcyk6c3ViQ2xhc3MuX19wcm90b19fPXN1cGVyQ2xhc3N9dmFyIENvbm5lY3RvckxpbmU9ZnVuY3Rpb24oX0Nvbm5lY3Rvcil7X2luaGVyaXRzKENvbm5lY3RvckxpbmUsX0Nvbm5lY3Rvcik7ZnVuY3Rpb24gQ29ubmVjdG9yTGluZSgpe19jbGFzc0NhbGxDaGVjayh0aGlzLENvbm5lY3RvckxpbmUpO3JldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLChDb25uZWN0b3JMaW5lLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKENvbm5lY3RvckxpbmUpKS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfV9jcmVhdGVDbGFzcyhDb25uZWN0b3JMaW5lLFt7a2V5OiJnZXRDb21wb25lbnRzIix2YWx1ZTpmdW5jdGlvbiBnZXRDb21wb25lbnRzKF9yZWYpe3ZhciB4PV9yZWYueCx5PV9yZWYueSxkeT1fcmVmLmR5LGR4PV9yZWYuZHgscmFkaXVzPV9yZWYucmFkaXVzLG91dGVyUmFkaXVzPV9yZWYub3V0ZXJSYWRpdXMsd2lkdGg9X3JlZi53aWR0aCxoZWlnaHQ9X3JlZi5oZWlnaHQ7cmV0dXJuKDAsX3R5cGVMaW5lMi5kZWZhdWx0KSh7eDp4LHk6eSxkeDpkeCxkeTpkeSxyYWRpdXM6cmFkaXVzLG91dGVyUmFkaXVzOm91dGVyUmFkaXVzLHdpZHRoOndpZHRoLGhlaWdodDpoZWlnaHR9KX19XSk7cmV0dXJuIENvbm5lY3RvckxpbmV9KF9Db25uZWN0b3IzLmRlZmF1bHQpO2V4cG9ydHMuZGVmYXVsdD1Db25uZWN0b3JMaW5lfSk7dW53cmFwRXhwb3J0cyhDb25uZWN0b3JMaW5lXzEpO3ZhciBlbmREb3Q9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCJfX2VzTW9kdWxlIix7dmFsdWU6dHJ1ZX0pO2V4cG9ydHMuZGVmYXVsdD1mdW5jdGlvbihfcmVmKXt2YXIgbGluZURhdGE9X3JlZi5saW5lRGF0YSxfcmVmJHNjYWxlPV9yZWYuc2NhbGUsc2NhbGU9X3JlZiRzY2FsZT09PXVuZGVmaW5lZD8xOl9yZWYkc2NhbGU7dmFyIGRvdD0oMCxCdWlsZGVyLmFyY0J1aWxkZXIpKHtjbGFzc05hbWU6ImNvbm5lY3Rvci1lbmQgY29ubmVjdG9yLWRvdCIsY2xhc3NJRDoiY29ubmVjdG9yLWVuZCIsZGF0YTp7cmFkaXVzOjMqTWF0aC5zcXJ0KHNjYWxlKX19KTtkb3QuYXR0cnMudHJhbnNmb3JtPSJ0cmFuc2xhdGUoIitsaW5lRGF0YVswXVswXSsiLCAiK2xpbmVEYXRhWzBdWzFdKyIpIjtyZXR1cm57Y29tcG9uZW50czpbZG90XX19fSk7dW53cmFwRXhwb3J0cyhlbmREb3QpO3ZhciBDb25uZWN0b3JFbmRfMT1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTp0cnVlfSk7dmFyIF9leHRlbmRzJCQxPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHRhcmdldCl7Zm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIHNvdXJjZT1hcmd1bWVudHNbaV07Zm9yKHZhciBrZXkgaW4gc291cmNlKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkpe3RhcmdldFtrZXldPXNvdXJjZVtrZXldfX19cmV0dXJuIHRhcmdldH07dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoInZhbHVlImluIGRlc2NyaXB0b3IpZGVzY3JpcHRvci53cml0YWJsZT10cnVlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsZGVzY3JpcHRvci5rZXksZGVzY3JpcHRvcil9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcn19KCk7dmFyIF9yZWFjdDI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChSZWFjdCk7ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmope3JldHVybiBvYmomJm9iai5fX2VzTW9kdWxlP29iajp7ZGVmYXVsdDpvYmp9fWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSxDb25zdHJ1Y3Rvcil7aWYoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsY2FsbCl7aWYoIXNlbGYpe3Rocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIil9cmV0dXJuIGNhbGwmJigodHlwZW9mIGNhbGw9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKGNhbGwpKT09PSJvYmplY3QifHx0eXBlb2YgY2FsbD09PSJmdW5jdGlvbiIpP2NhbGw6c2VsZn1mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT0iZnVuY3Rpb24iJiZzdXBlckNsYXNzIT09bnVsbCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiKyh0eXBlb2Ygc3VwZXJDbGFzcz09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2Yoc3VwZXJDbGFzcykpKX1zdWJDbGFzcy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzJiZzdXBlckNsYXNzLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnN1YkNsYXNzLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX19KTtpZihzdXBlckNsYXNzKU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3Msc3VwZXJDbGFzcyk6c3ViQ2xhc3MuX19wcm90b19fPXN1cGVyQ2xhc3N9dmFyIENvbm5lY3RvckVuZD1mdW5jdGlvbihfUmVhY3QkQ29tcG9uZW50KXtfaW5oZXJpdHMoQ29ubmVjdG9yRW5kLF9SZWFjdCRDb21wb25lbnQpO2Z1bmN0aW9uIENvbm5lY3RvckVuZCgpe19jbGFzc0NhbGxDaGVjayh0aGlzLENvbm5lY3RvckVuZCk7cmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKENvbm5lY3RvckVuZC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihDb25uZWN0b3JFbmQpKS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfV9jcmVhdGVDbGFzcyhDb25uZWN0b3JFbmQsW3trZXk6ImdldENvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uIGdldENvbXBvbmVudHMoKXt9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3ZhciBjb2xvcj10aGlzLnByb3BzLmNvbG9yO3ZhciBkPXRoaXMuZ2V0Q29tcG9uZW50cyh0aGlzLnByb3BzKXx8W107dmFyIGM9ZC5jb21wb25lbnRzWzBdO3JldHVybiBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChjLnR5cGUsX2V4dGVuZHMkJDEoe2NsYXNzTmFtZTpjLmNsYXNzTmFtZX0sYy5hdHRycyx7ZmlsbDpjb2xvcn0pKX19XSk7cmV0dXJuIENvbm5lY3RvckVuZH0oX3JlYWN0Mi5kZWZhdWx0LkNvbXBvbmVudCk7ZXhwb3J0cy5kZWZhdWx0PUNvbm5lY3RvckVuZH0pO3Vud3JhcEV4cG9ydHMoQ29ubmVjdG9yRW5kXzEpO3ZhciBDb25uZWN0b3JFbmREb3RfMT1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTp0cnVlfSk7dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoInZhbHVlImluIGRlc2NyaXB0b3IpZGVzY3JpcHRvci53cml0YWJsZT10cnVlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsZGVzY3JpcHRvci5rZXksZGVzY3JpcHRvcil9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcn19KCk7dmFyIF9yZWFjdDI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChSZWFjdCk7dmFyIF9lbmREb3QyPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoZW5kRG90KTt2YXIgX0Nvbm5lY3RvckVuZDM9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChDb25uZWN0b3JFbmRfMSk7dmFyIF9wcm9wVHlwZXMyPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQocHJvcFR5cGVzKTtmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iail7cmV0dXJuIG9iaiYmb2JqLl9fZXNNb2R1bGU/b2JqOntkZWZhdWx0Om9ian19ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLENvbnN0cnVjdG9yKXtpZighKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX19ZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZixjYWxsKXtpZighc2VsZil7dGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKX1yZXR1cm4gY2FsbCYmKCh0eXBlb2YgY2FsbD09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2YoY2FsbCkpPT09Im9iamVjdCJ8fHR5cGVvZiBjYWxsPT09ImZ1bmN0aW9uIik/Y2FsbDpzZWxmfWZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcyxzdXBlckNsYXNzKXtpZih0eXBlb2Ygc3VwZXJDbGFzcyE9PSJmdW5jdGlvbiImJnN1cGVyQ2xhc3MhPT1udWxsKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrKHR5cGVvZiBzdXBlckNsYXNzPT09InVuZGVmaW5lZCI/InVuZGVmaW5lZCI6X3R5cGVvZihzdXBlckNsYXNzKSkpfXN1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MmJnN1cGVyQ2xhc3MucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6c3ViQ2xhc3MsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfX0pO2lmKHN1cGVyQ2xhc3MpT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcyxzdXBlckNsYXNzKTpzdWJDbGFzcy5fX3Byb3RvX189c3VwZXJDbGFzc312YXIgQ29ubmVjdG9yRW5kRG90PWZ1bmN0aW9uKF9Db25uZWN0b3JFbmQpe19pbmhlcml0cyhDb25uZWN0b3JFbmREb3QsX0Nvbm5lY3RvckVuZCk7ZnVuY3Rpb24gQ29ubmVjdG9yRW5kRG90KCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsQ29ubmVjdG9yRW5kRG90KTtyZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywoQ29ubmVjdG9yRW5kRG90Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKENvbm5lY3RvckVuZERvdCkpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9X2NyZWF0ZUNsYXNzKENvbm5lY3RvckVuZERvdCxbe2tleToiZ2V0Q29tcG9uZW50cyIsdmFsdWU6ZnVuY3Rpb24gZ2V0Q29tcG9uZW50cyhfcmVmKXt2YXIgeD1fcmVmLngseT1fcmVmLnksZHk9X3JlZi5keSxkeD1fcmVmLmR4LGxpbmVEYXRhPV9yZWYubGluZURhdGEsc2NhbGU9X3JlZi5zY2FsZTtyZXR1cm4oMCxfZW5kRG90Mi5kZWZhdWx0KSh7eDp4LHk6eSxkeDpkeCxkeTpkeSxsaW5lRGF0YTpsaW5lRGF0YSxzY2FsZTpzY2FsZX0pfX1dKTtyZXR1cm4gQ29ubmVjdG9yRW5kRG90fShfQ29ubmVjdG9yRW5kMy5kZWZhdWx0KTtleHBvcnRzLmRlZmF1bHQ9Q29ubmVjdG9yRW5kRG90O0Nvbm5lY3RvckVuZERvdC5wcm9wVHlwZXM9e3g6X3Byb3BUeXBlczIuZGVmYXVsdC5udW1iZXIseTpfcHJvcFR5cGVzMi5kZWZhdWx0Lm51bWJlcixkeDpfcHJvcFR5cGVzMi5kZWZhdWx0Lm51bWJlcixkeTpfcHJvcFR5cGVzMi5kZWZhdWx0Lm51bWJlcixzY2FsZTpfcHJvcFR5cGVzMi5kZWZhdWx0Lm51bWJlcixsaW5lRGF0YTpfcHJvcFR5cGVzMi5kZWZhdWx0LmFycmF5fX0pO3Vud3JhcEV4cG9ydHMoQ29ubmVjdG9yRW5kRG90XzEpO3ZhciBlbmRBcnJvdz1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTp0cnVlfSk7ZXhwb3J0cy5kZWZhdWx0PWZ1bmN0aW9uKF9yZWYpe3ZhciBkeD1fcmVmLmR4LGR5PV9yZWYuZHksc3RhcnQ9X3JlZi5zdGFydCxlbmQ9X3JlZi5lbmQsX3JlZiRzY2FsZT1fcmVmLnNjYWxlLHNjYWxlPV9yZWYkc2NhbGU9PT11bmRlZmluZWQ/MTpfcmVmJHNjYWxlO2lmKCFzdGFydCl7c3RhcnQ9W2R4LGR5XX1lbHNle3N0YXJ0PVstZW5kWzBdK3N0YXJ0WzBdLC1lbmRbMV0rc3RhcnRbMV1dfWlmKCFlbmQpe2VuZD1bMCwwXX12YXIgeDE9ZW5kWzBdLHkxPWVuZFsxXTt2YXIgc2l6ZT0xMCpzY2FsZTt2YXIgYW5nbGVPZmZzZXQ9MTYvMTgwKk1hdGguUEk7dmFyIGFuZ2xlPU1hdGguYXRhbihzdGFydFsxXS9zdGFydFswXSk7aWYoc3RhcnRbMF08MCl7YW5nbGUrPU1hdGguUEl9dmFyIGRhdGE9W1t4MSx5MV0sW01hdGguY29zKGFuZ2xlK2FuZ2xlT2Zmc2V0KSpzaXplK3gxLE1hdGguc2luKGFuZ2xlK2FuZ2xlT2Zmc2V0KSpzaXplK3kxXSxbTWF0aC5jb3MoYW5nbGUtYW5nbGVPZmZzZXQpKnNpemUreDEsTWF0aC5zaW4oYW5nbGUtYW5nbGVPZmZzZXQpKnNpemUreTFdLFt4MSx5MV1dO3JldHVybntjb21wb25lbnRzOlsoMCxCdWlsZGVyLmxpbmVCdWlsZGVyKSh7ZGF0YTpkYXRhLGNsYXNzTmFtZToiY29ubmVjdG9yLWVuZCBjb25uZWN0b3ItYXJyb3ciLGNsYXNzSUQ6ImNvbm5lY3Rvci1lbmQifSldfX19KTt1bndyYXBFeHBvcnRzKGVuZEFycm93KTt2YXIgQ29ubmVjdG9yRW5kQXJyb3dfMT1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTp0cnVlfSk7dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoInZhbHVlImluIGRlc2NyaXB0b3IpZGVzY3JpcHRvci53cml0YWJsZT10cnVlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsZGVzY3JpcHRvci5rZXksZGVzY3JpcHRvcil9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcn19KCk7dmFyIF9yZWFjdDI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChSZWFjdCk7dmFyIF9lbmRBcnJvdzI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChlbmRBcnJvdyk7dmFyIF9Db25uZWN0b3JFbmQzPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoQ29ubmVjdG9yRW5kXzEpO3ZhciBfcHJvcFR5cGVzMj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KHByb3BUeXBlcyk7ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmope3JldHVybiBvYmomJm9iai5fX2VzTW9kdWxlP29iajp7ZGVmYXVsdDpvYmp9fWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSxDb25zdHJ1Y3Rvcil7aWYoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsY2FsbCl7aWYoIXNlbGYpe3Rocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIil9cmV0dXJuIGNhbGwmJigodHlwZW9mIGNhbGw9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKGNhbGwpKT09PSJvYmplY3QifHx0eXBlb2YgY2FsbD09PSJmdW5jdGlvbiIpP2NhbGw6c2VsZn1mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT0iZnVuY3Rpb24iJiZzdXBlckNsYXNzIT09bnVsbCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiKyh0eXBlb2Ygc3VwZXJDbGFzcz09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2Yoc3VwZXJDbGFzcykpKX1zdWJDbGFzcy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzJiZzdXBlckNsYXNzLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnN1YkNsYXNzLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX19KTtpZihzdXBlckNsYXNzKU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3Msc3VwZXJDbGFzcyk6c3ViQ2xhc3MuX19wcm90b19fPXN1cGVyQ2xhc3N9dmFyIENvbm5lY3RvckVuZEFycm93PWZ1bmN0aW9uKF9Db25uZWN0b3JFbmQpe19pbmhlcml0cyhDb25uZWN0b3JFbmRBcnJvdyxfQ29ubmVjdG9yRW5kKTtmdW5jdGlvbiBDb25uZWN0b3JFbmRBcnJvdygpe19jbGFzc0NhbGxDaGVjayh0aGlzLENvbm5lY3RvckVuZEFycm93KTtyZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywoQ29ubmVjdG9yRW5kQXJyb3cuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ29ubmVjdG9yRW5kQXJyb3cpKS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfV9jcmVhdGVDbGFzcyhDb25uZWN0b3JFbmRBcnJvdyxbe2tleToiZ2V0Q29tcG9uZW50cyIsdmFsdWU6ZnVuY3Rpb24gZ2V0Q29tcG9uZW50cyhfcmVmKXt2YXIgeD1fcmVmLngseT1fcmVmLnksZHk9X3JlZi5keSxkeD1fcmVmLmR4LGxpbmVEYXRhPV9yZWYubGluZURhdGEsc2NhbGU9X3JlZi5zY2FsZTt2YXIgc3RhcnQ9bGluZURhdGFbMV07dmFyIGVuZD1saW5lRGF0YVswXTt2YXIgZGlzdGFuY2U9TWF0aC5zcXJ0KE1hdGgucG93KHN0YXJ0WzBdLWVuZFswXSwyKStNYXRoLnBvdyhzdGFydFsxXS1lbmRbMV0sMikpO2lmKGRpc3RhbmNlPDUmJmxpbmVEYXRhWzJdKXtzdGFydD1saW5lRGF0YVsyXX1yZXR1cm4oMCxfZW5kQXJyb3cyLmRlZmF1bHQpKHt4OngseTp5LGR4OmR4LGR5OmR5LHN0YXJ0OnN0YXJ0LGVuZDplbmQsc2NhbGU6c2NhbGV9KX19XSk7cmV0dXJuIENvbm5lY3RvckVuZEFycm93fShfQ29ubmVjdG9yRW5kMy5kZWZhdWx0KTtleHBvcnRzLmRlZmF1bHQ9Q29ubmVjdG9yRW5kQXJyb3c7Q29ubmVjdG9yRW5kQXJyb3cucHJvcFR5cGVzPXt4Ol9wcm9wVHlwZXMyLmRlZmF1bHQubnVtYmVyLHk6X3Byb3BUeXBlczIuZGVmYXVsdC5udW1iZXIsZHg6X3Byb3BUeXBlczIuZGVmYXVsdC5udW1iZXIsZHk6X3Byb3BUeXBlczIuZGVmYXVsdC5udW1iZXIsc2NhbGU6X3Byb3BUeXBlczIuZGVmYXVsdC5udW1iZXIsbGluZURhdGE6X3Byb3BUeXBlczIuZGVmYXVsdC5hcnJheX19KTt1bndyYXBFeHBvcnRzKENvbm5lY3RvckVuZEFycm93XzEpO3ZhciByZWFjdERyYWdnYWJsZT1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsZmFjdG9yeSl7bW9kdWxlLmV4cG9ydHM9ZmFjdG9yeShyZWFjdERvbSxSZWFjdCl9KShjb21tb25qc0dsb2JhbCxmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzRfXyxfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzZfXyl7cmV0dXJuIGZ1bmN0aW9uKG1vZHVsZXMpe3ZhciBpbnN0YWxsZWRNb2R1bGVzPXt9O2Z1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpe2lmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKXtyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0c312YXIgbW9kdWxlPWluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdPXtpOm1vZHVsZUlkLGw6ZmFsc2UsZXhwb3J0czp7fX07bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cyxtb2R1bGUsbW9kdWxlLmV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk7bW9kdWxlLmw9dHJ1ZTtyZXR1cm4gbW9kdWxlLmV4cG9ydHN9X193ZWJwYWNrX3JlcXVpcmVfXy5tPW1vZHVsZXM7X193ZWJwYWNrX3JlcXVpcmVfXy5jPWluc3RhbGxlZE1vZHVsZXM7X193ZWJwYWNrX3JlcXVpcmVfXy5kPWZ1bmN0aW9uKGV4cG9ydHMsbmFtZSxnZXR0ZXIpe2lmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cyxuYW1lKSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsbmFtZSx7Y29uZmlndXJhYmxlOmZhbHNlLGVudW1lcmFibGU6dHJ1ZSxnZXQ6Z2V0dGVyfSl9fTtfX3dlYnBhY2tfcmVxdWlyZV9fLm49ZnVuY3Rpb24obW9kdWxlKXt2YXIgZ2V0dGVyPW1vZHVsZSYmbW9kdWxlLl9fZXNNb2R1bGU/ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpe3JldHVybiBtb2R1bGVbImRlZmF1bHQiXX06ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpe3JldHVybiBtb2R1bGV9O19fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsImEiLGdldHRlcik7cmV0dXJuIGdldHRlcn07X193ZWJwYWNrX3JlcXVpcmVfXy5vPWZ1bmN0aW9uKG9iamVjdCxwcm9wZXJ0eSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QscHJvcGVydHkpfTtfX3dlYnBhY2tfcmVxdWlyZV9fLnA9IiI7cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zPTEyKX0oW2Z1bmN0aW9uKG1vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pe09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCJfX2VzTW9kdWxlIix7dmFsdWU6dHJ1ZX0pO2V4cG9ydHMuZmluZEluQXJyYXk9ZmluZEluQXJyYXk7ZXhwb3J0cy5pc0Z1bmN0aW9uPWlzRnVuY3Rpb247ZXhwb3J0cy5pc051bT1pc051bTtleHBvcnRzLmludD1pbnQ7ZXhwb3J0cy5kb250U2V0TWU9ZG9udFNldE1lO2Z1bmN0aW9uIGZpbmRJbkFycmF5KGFycmF5LGNhbGxiYWNrKXtmb3IodmFyIGk9MCxsZW5ndGg9YXJyYXkubGVuZ3RoO2k8bGVuZ3RoO2krKyl7aWYoY2FsbGJhY2suYXBwbHkoY2FsbGJhY2ssW2FycmF5W2ldLGksYXJyYXldKSlyZXR1cm4gYXJyYXlbaV19fWZ1bmN0aW9uIGlzRnVuY3Rpb24oZnVuYyl7cmV0dXJuIHR5cGVvZiBmdW5jPT09ImZ1bmN0aW9uInx8T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGZ1bmMpPT09IltvYmplY3QgRnVuY3Rpb25dIn1mdW5jdGlvbiBpc051bShudW0pe3JldHVybiB0eXBlb2YgbnVtPT09Im51bWJlciImJiFpc05hTihudW0pfWZ1bmN0aW9uIGludChhKXtyZXR1cm4gcGFyc2VJbnQoYSwxMCl9ZnVuY3Rpb24gZG9udFNldE1lKHByb3BzLHByb3BOYW1lLGNvbXBvbmVudE5hbWUpe2lmKHByb3BzW3Byb3BOYW1lXSl7cmV0dXJuIG5ldyBFcnJvcigiSW52YWxpZCBwcm9wICIrcHJvcE5hbWUrIiBwYXNzZWQgdG8gIitjb21wb25lbnROYW1lKyIgLSBkbyBub3Qgc2V0IHRoaXMsIHNldCBpdCBvbiB0aGUgY2hpbGQuIil9fX0sZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7ZnVuY3Rpb24gbWFrZUVtcHR5RnVuY3Rpb24oYXJnKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYXJnfX12YXIgZW1wdHlGdW5jdGlvbj1mdW5jdGlvbiBlbXB0eUZ1bmN0aW9uKCl7fTtlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zPW1ha2VFbXB0eUZ1bmN0aW9uO2VtcHR5RnVuY3Rpb24udGhhdFJldHVybnNGYWxzZT1tYWtlRW1wdHlGdW5jdGlvbihmYWxzZSk7ZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc1RydWU9bWFrZUVtcHR5RnVuY3Rpb24odHJ1ZSk7ZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc051bGw9bWFrZUVtcHR5RnVuY3Rpb24obnVsbCk7ZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc1RoaXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307ZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc0FyZ3VtZW50PWZ1bmN0aW9uKGFyZyl7cmV0dXJuIGFyZ307bW9kdWxlLmV4cG9ydHM9ZW1wdHlGdW5jdGlvbn0sZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7dmFyIHZhbGlkYXRlRm9ybWF0PWZ1bmN0aW9uIHZhbGlkYXRlRm9ybWF0KGZvcm1hdCl7fTtpZihPYmplY3Qoe0RSQUdHQUJMRV9ERUJVRzp1bmRlZmluZWR9KS5OT0RFX0VOViE9PSJwcm9kdWN0aW9uIil7dmFsaWRhdGVGb3JtYXQ9ZnVuY3Rpb24gdmFsaWRhdGVGb3JtYXQoZm9ybWF0KXtpZihmb3JtYXQ9PT11bmRlZmluZWQpe3Rocm93IG5ldyBFcnJvcigiaW52YXJpYW50IHJlcXVpcmVzIGFuIGVycm9yIG1lc3NhZ2UgYXJndW1lbnQiKX19fWZ1bmN0aW9uIGludmFyaWFudChjb25kaXRpb24sZm9ybWF0LGEsYixjLGQsZSxmKXt2YWxpZGF0ZUZvcm1hdChmb3JtYXQpO2lmKCFjb25kaXRpb24pe3ZhciBlcnJvcjtpZihmb3JtYXQ9PT11bmRlZmluZWQpe2Vycm9yPW5ldyBFcnJvcigiTWluaWZpZWQgZXhjZXB0aW9uIG9jY3VycmVkOyB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgIisiZm9yIHRoZSBmdWxsIGVycm9yIG1lc3NhZ2UgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4iKX1lbHNle3ZhciBhcmdzPVthLGIsYyxkLGUsZl07dmFyIGFyZ0luZGV4PTA7ZXJyb3I9bmV3IEVycm9yKGZvcm1hdC5yZXBsYWNlKC8lcy9nLGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3NbYXJnSW5kZXgrK119KSk7ZXJyb3IubmFtZT0iSW52YXJpYW50IFZpb2xhdGlvbiJ9ZXJyb3IuZnJhbWVzVG9Qb3A9MTt0aHJvdyBlcnJvcn19bW9kdWxlLmV4cG9ydHM9aW52YXJpYW50fSxmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQ9IlNFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEIjttb2R1bGUuZXhwb3J0cz1SZWFjdFByb3BUeXBlc1NlY3JldH0sZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPV9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfNF9ffSxmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywiX19lc01vZHVsZSIse3ZhbHVlOnRydWV9KTt2YXIgX2V4dGVuZHMkJDE9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odGFyZ2V0KXtmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXt2YXIgc291cmNlPWFyZ3VtZW50c1tpXTtmb3IodmFyIGtleSBpbiBzb3VyY2Upe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2Usa2V5KSl7dGFyZ2V0W2tleV09c291cmNlW2tleV19fX1yZXR1cm4gdGFyZ2V0fTtleHBvcnRzLm1hdGNoZXNTZWxlY3Rvcj1tYXRjaGVzU2VsZWN0b3I7ZXhwb3J0cy5tYXRjaGVzU2VsZWN0b3JBbmRQYXJlbnRzVG89bWF0Y2hlc1NlbGVjdG9yQW5kUGFyZW50c1RvO2V4cG9ydHMuYWRkRXZlbnQ9YWRkRXZlbnQ7ZXhwb3J0cy5yZW1vdmVFdmVudD1yZW1vdmVFdmVudDtleHBvcnRzLm91dGVySGVpZ2h0PW91dGVySGVpZ2h0O2V4cG9ydHMub3V0ZXJXaWR0aD1vdXRlcldpZHRoO2V4cG9ydHMuaW5uZXJIZWlnaHQ9aW5uZXJIZWlnaHQ7ZXhwb3J0cy5pbm5lcldpZHRoPWlubmVyV2lkdGg7ZXhwb3J0cy5vZmZzZXRYWUZyb21QYXJlbnQ9b2Zmc2V0WFlGcm9tUGFyZW50O2V4cG9ydHMuY3JlYXRlQ1NTVHJhbnNmb3JtPWNyZWF0ZUNTU1RyYW5zZm9ybTtleHBvcnRzLmNyZWF0ZVNWR1RyYW5zZm9ybT1jcmVhdGVTVkdUcmFuc2Zvcm07ZXhwb3J0cy5nZXRUb3VjaD1nZXRUb3VjaDtleHBvcnRzLmdldFRvdWNoSWRlbnRpZmllcj1nZXRUb3VjaElkZW50aWZpZXI7ZXhwb3J0cy5hZGRVc2VyU2VsZWN0U3R5bGVzPWFkZFVzZXJTZWxlY3RTdHlsZXM7ZXhwb3J0cy5yZW1vdmVVc2VyU2VsZWN0U3R5bGVzPXJlbW92ZVVzZXJTZWxlY3RTdHlsZXM7ZXhwb3J0cy5zdHlsZUhhY2tzPXN0eWxlSGFja3M7ZXhwb3J0cy5hZGRDbGFzc05hbWU9YWRkQ2xhc3NOYW1lO2V4cG9ydHMucmVtb3ZlQ2xhc3NOYW1lPXJlbW92ZUNsYXNzTmFtZTt2YXIgX3NoaW1zPV9fd2VicGFja19yZXF1aXJlX18oMCk7dmFyIF9nZXRQcmVmaXg9X193ZWJwYWNrX3JlcXVpcmVfXygxOCk7dmFyIF9nZXRQcmVmaXgyPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2dldFByZWZpeCk7ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmope3JldHVybiBvYmomJm9iai5fX2VzTW9kdWxlP29iajp7ZGVmYXVsdDpvYmp9fWZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosa2V5LHZhbHVlKXtpZihrZXkgaW4gb2JqKXtPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLGtleSx7dmFsdWU6dmFsdWUsZW51bWVyYWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlLHdyaXRhYmxlOnRydWV9KX1lbHNle29ialtrZXldPXZhbHVlfXJldHVybiBvYmp9dmFyIG1hdGNoZXNTZWxlY3RvckZ1bmM9IiI7ZnVuY3Rpb24gbWF0Y2hlc1NlbGVjdG9yKGVsLHNlbGVjdG9yKXtpZighbWF0Y2hlc1NlbGVjdG9yRnVuYyl7bWF0Y2hlc1NlbGVjdG9yRnVuYz0oMCxfc2hpbXMuZmluZEluQXJyYXkpKFsibWF0Y2hlcyIsIndlYmtpdE1hdGNoZXNTZWxlY3RvciIsIm1vek1hdGNoZXNTZWxlY3RvciIsIm1zTWF0Y2hlc1NlbGVjdG9yIiwib01hdGNoZXNTZWxlY3RvciJdLGZ1bmN0aW9uKG1ldGhvZCl7cmV0dXJuKDAsX3NoaW1zLmlzRnVuY3Rpb24pKGVsW21ldGhvZF0pfSl9cmV0dXJuIGVsW21hdGNoZXNTZWxlY3RvckZ1bmNdLmNhbGwoZWwsc2VsZWN0b3IpfWZ1bmN0aW9uIG1hdGNoZXNTZWxlY3RvckFuZFBhcmVudHNUbyhlbCxzZWxlY3RvcixiYXNlTm9kZSl7dmFyIG5vZGU9ZWw7ZG97aWYobWF0Y2hlc1NlbGVjdG9yKG5vZGUsc2VsZWN0b3IpKXJldHVybiB0cnVlO2lmKG5vZGU9PT1iYXNlTm9kZSlyZXR1cm4gZmFsc2U7bm9kZT1ub2RlLnBhcmVudE5vZGV9d2hpbGUobm9kZSk7cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIGFkZEV2ZW50KGVsLGV2ZW50LGhhbmRsZXIpe2lmKCFlbCl7cmV0dXJufWlmKGVsLmF0dGFjaEV2ZW50KXtlbC5hdHRhY2hFdmVudCgib24iK2V2ZW50LGhhbmRsZXIpfWVsc2UgaWYoZWwuYWRkRXZlbnRMaXN0ZW5lcil7ZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudCxoYW5kbGVyLHRydWUpfWVsc2V7ZWxbIm9uIitldmVudF09aGFuZGxlcn19ZnVuY3Rpb24gcmVtb3ZlRXZlbnQoZWwsZXZlbnQsaGFuZGxlcil7aWYoIWVsKXtyZXR1cm59aWYoZWwuZGV0YWNoRXZlbnQpe2VsLmRldGFjaEV2ZW50KCJvbiIrZXZlbnQsaGFuZGxlcil9ZWxzZSBpZihlbC5yZW1vdmVFdmVudExpc3RlbmVyKXtlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LGhhbmRsZXIsdHJ1ZSl9ZWxzZXtlbFsib24iK2V2ZW50XT1udWxsfX1mdW5jdGlvbiBvdXRlckhlaWdodChub2RlKXt2YXIgaGVpZ2h0PW5vZGUuY2xpZW50SGVpZ2h0O3ZhciBjb21wdXRlZFN0eWxlPW5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpO2hlaWdodCs9KDAsX3NoaW1zLmludCkoY29tcHV0ZWRTdHlsZS5ib3JkZXJUb3BXaWR0aCk7aGVpZ2h0Kz0oMCxfc2hpbXMuaW50KShjb21wdXRlZFN0eWxlLmJvcmRlckJvdHRvbVdpZHRoKTtyZXR1cm4gaGVpZ2h0fWZ1bmN0aW9uIG91dGVyV2lkdGgobm9kZSl7dmFyIHdpZHRoPW5vZGUuY2xpZW50V2lkdGg7dmFyIGNvbXB1dGVkU3R5bGU9bm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUobm9kZSk7d2lkdGgrPSgwLF9zaGltcy5pbnQpKGNvbXB1dGVkU3R5bGUuYm9yZGVyTGVmdFdpZHRoKTt3aWR0aCs9KDAsX3NoaW1zLmludCkoY29tcHV0ZWRTdHlsZS5ib3JkZXJSaWdodFdpZHRoKTtyZXR1cm4gd2lkdGh9ZnVuY3Rpb24gaW5uZXJIZWlnaHQobm9kZSl7dmFyIGhlaWdodD1ub2RlLmNsaWVudEhlaWdodDt2YXIgY29tcHV0ZWRTdHlsZT1ub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtoZWlnaHQtPSgwLF9zaGltcy5pbnQpKGNvbXB1dGVkU3R5bGUucGFkZGluZ1RvcCk7aGVpZ2h0LT0oMCxfc2hpbXMuaW50KShjb21wdXRlZFN0eWxlLnBhZGRpbmdCb3R0b20pO3JldHVybiBoZWlnaHR9ZnVuY3Rpb24gaW5uZXJXaWR0aChub2RlKXt2YXIgd2lkdGg9bm9kZS5jbGllbnRXaWR0aDt2YXIgY29tcHV0ZWRTdHlsZT1ub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTt3aWR0aC09KDAsX3NoaW1zLmludCkoY29tcHV0ZWRTdHlsZS5wYWRkaW5nTGVmdCk7d2lkdGgtPSgwLF9zaGltcy5pbnQpKGNvbXB1dGVkU3R5bGUucGFkZGluZ1JpZ2h0KTtyZXR1cm4gd2lkdGh9ZnVuY3Rpb24gb2Zmc2V0WFlGcm9tUGFyZW50KGV2dCxvZmZzZXRQYXJlbnQpe3ZhciBpc0JvZHk9b2Zmc2V0UGFyZW50PT09b2Zmc2V0UGFyZW50Lm93bmVyRG9jdW1lbnQuYm9keTt2YXIgb2Zmc2V0UGFyZW50UmVjdD1pc0JvZHk/e2xlZnQ6MCx0b3A6MH06b2Zmc2V0UGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3ZhciB4PWV2dC5jbGllbnRYK29mZnNldFBhcmVudC5zY3JvbGxMZWZ0LW9mZnNldFBhcmVudFJlY3QubGVmdDt2YXIgeT1ldnQuY2xpZW50WStvZmZzZXRQYXJlbnQuc2Nyb2xsVG9wLW9mZnNldFBhcmVudFJlY3QudG9wO3JldHVybnt4OngseTp5fX1mdW5jdGlvbiBjcmVhdGVDU1NUcmFuc2Zvcm0oX3JlZil7dmFyIHg9X3JlZi54LHk9X3JlZi55O3JldHVybiBfZGVmaW5lUHJvcGVydHkoe30sKDAsX2dldFByZWZpeC5icm93c2VyUHJlZml4VG9LZXkpKCJ0cmFuc2Zvcm0iLF9nZXRQcmVmaXgyLmRlZmF1bHQpLCJ0cmFuc2xhdGUoIit4KyJweCwiK3krInB4KSIpfWZ1bmN0aW9uIGNyZWF0ZVNWR1RyYW5zZm9ybShfcmVmMyl7dmFyIHg9X3JlZjMueCx5PV9yZWYzLnk7cmV0dXJuInRyYW5zbGF0ZSgiK3grIiwiK3krIikifWZ1bmN0aW9uIGdldFRvdWNoKGUsaWRlbnRpZmllcil7cmV0dXJuIGUudGFyZ2V0VG91Y2hlcyYmKDAsX3NoaW1zLmZpbmRJbkFycmF5KShlLnRhcmdldFRvdWNoZXMsZnVuY3Rpb24odCl7cmV0dXJuIGlkZW50aWZpZXI9PT10LmlkZW50aWZpZXJ9KXx8ZS5jaGFuZ2VkVG91Y2hlcyYmKDAsX3NoaW1zLmZpbmRJbkFycmF5KShlLmNoYW5nZWRUb3VjaGVzLGZ1bmN0aW9uKHQpe3JldHVybiBpZGVudGlmaWVyPT09dC5pZGVudGlmaWVyfSl9ZnVuY3Rpb24gZ2V0VG91Y2hJZGVudGlmaWVyKGUpe2lmKGUudGFyZ2V0VG91Y2hlcyYmZS50YXJnZXRUb3VjaGVzWzBdKXJldHVybiBlLnRhcmdldFRvdWNoZXNbMF0uaWRlbnRpZmllcjtpZihlLmNoYW5nZWRUb3VjaGVzJiZlLmNoYW5nZWRUb3VjaGVzWzBdKXJldHVybiBlLmNoYW5nZWRUb3VjaGVzWzBdLmlkZW50aWZpZXJ9ZnVuY3Rpb24gYWRkVXNlclNlbGVjdFN0eWxlcyhkb2Mpe3ZhciBzdHlsZUVsPWRvYy5nZXRFbGVtZW50QnlJZCgicmVhY3QtZHJhZ2dhYmxlLXN0eWxlLWVsIik7aWYoIXN0eWxlRWwpe3N0eWxlRWw9ZG9jLmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7c3R5bGVFbC50eXBlPSJ0ZXh0L2NzcyI7c3R5bGVFbC5pZD0icmVhY3QtZHJhZ2dhYmxlLXN0eWxlLWVsIjtzdHlsZUVsLmlubmVySFRNTD0iLnJlYWN0LWRyYWdnYWJsZS10cmFuc3BhcmVudC1zZWxlY3Rpb24gKjo6LW1vei1zZWxlY3Rpb24ge2JhY2tncm91bmQ6IHRyYW5zcGFyZW50O31cbiI7c3R5bGVFbC5pbm5lckhUTUwrPSIucmVhY3QtZHJhZ2dhYmxlLXRyYW5zcGFyZW50LXNlbGVjdGlvbiAqOjpzZWxlY3Rpb24ge2JhY2tncm91bmQ6IHRyYW5zcGFyZW50O31cbiI7ZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQoc3R5bGVFbCl9aWYoZG9jLmJvZHkpYWRkQ2xhc3NOYW1lKGRvYy5ib2R5LCJyZWFjdC1kcmFnZ2FibGUtdHJhbnNwYXJlbnQtc2VsZWN0aW9uIil9ZnVuY3Rpb24gcmVtb3ZlVXNlclNlbGVjdFN0eWxlcyhkb2Mpe2lmKGRvYy5ib2R5KXJlbW92ZUNsYXNzTmFtZShkb2MuYm9keSwicmVhY3QtZHJhZ2dhYmxlLXRyYW5zcGFyZW50LXNlbGVjdGlvbiIpO3dpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKX1mdW5jdGlvbiBzdHlsZUhhY2tzKCl7dmFyIGNoaWxkU3R5bGU9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzBdOnt9O3JldHVybiBfZXh0ZW5kcyQkMSh7dG91Y2hBY3Rpb246Im5vbmUifSxjaGlsZFN0eWxlKX1mdW5jdGlvbiBhZGRDbGFzc05hbWUoZWwsY2xhc3NOYW1lKXtpZihlbC5jbGFzc0xpc3Qpe2VsLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKX1lbHNle2lmKCFlbC5jbGFzc05hbWUubWF0Y2gobmV3IFJlZ0V4cCgiKD86XnxcXHMpIitjbGFzc05hbWUrIig/IVxcUykiKSkpe2VsLmNsYXNzTmFtZSs9IiAiK2NsYXNzTmFtZX19fWZ1bmN0aW9uIHJlbW92ZUNsYXNzTmFtZShlbCxjbGFzc05hbWUpe2lmKGVsLmNsYXNzTGlzdCl7ZWwuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpfWVsc2V7ZWwuY2xhc3NOYW1lPWVsLmNsYXNzTmFtZS5yZXBsYWNlKG5ldyBSZWdFeHAoIig/Ol58XFxzKSIrY2xhc3NOYW1lKyIoPyFcXFMpIiwiZyIpLCIiKX19fSxmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9X19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV82X199LGZ1bmN0aW9uKG1vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pe2lmKE9iamVjdCh7RFJBR0dBQkxFX0RFQlVHOnVuZGVmaW5lZH0pLk5PREVfRU5WIT09InByb2R1Y3Rpb24iKXt2YXIgUkVBQ1RfRUxFTUVOVF9UWVBFPXR5cGVvZiBTeW1ib2w9PT0iZnVuY3Rpb24iJiZTeW1ib2wuZm9yJiZTeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50Iil8fDYwMTAzO3ZhciBpc1ZhbGlkRWxlbWVudD1mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudChvYmplY3Qpe3JldHVybih0eXBlb2Ygb2JqZWN0PT09InVuZGVmaW5lZCI/InVuZGVmaW5lZCI6X3R5cGVvZihvYmplY3QpKT09PSJvYmplY3QiJiZvYmplY3QhPT1udWxsJiZvYmplY3QuJCR0eXBlb2Y9PT1SRUFDVF9FTEVNRU5UX1RZUEV9O3ZhciB0aHJvd09uRGlyZWN0QWNjZXNzPXRydWU7bW9kdWxlLmV4cG9ydHM9X193ZWJwYWNrX3JlcXVpcmVfXygxNCkoaXNWYWxpZEVsZW1lbnQsdGhyb3dPbkRpcmVjdEFjY2Vzcyl9ZWxzZXttb2R1bGUuZXhwb3J0cz1fX3dlYnBhY2tfcmVxdWlyZV9fKDE2KSgpfX0sZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7dmFyIGVtcHR5RnVuY3Rpb249X193ZWJwYWNrX3JlcXVpcmVfXygxKTt2YXIgd2FybmluZz1lbXB0eUZ1bmN0aW9uO2lmKE9iamVjdCh7RFJBR0dBQkxFX0RFQlVHOnVuZGVmaW5lZH0pLk5PREVfRU5WIT09InByb2R1Y3Rpb24iKXt2YXIgcHJpbnRXYXJuaW5nPWZ1bmN0aW9uIHByaW50V2FybmluZyhmb3JtYXQpe2Zvcih2YXIgX2xlbj1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkoX2xlbj4xP19sZW4tMTowKSxfa2V5PTE7X2tleTxfbGVuO19rZXkrKyl7YXJnc1tfa2V5LTFdPWFyZ3VtZW50c1tfa2V5XX12YXIgYXJnSW5kZXg9MDt2YXIgbWVzc2FnZT0iV2FybmluZzogIitmb3JtYXQucmVwbGFjZSgvJXMvZyxmdW5jdGlvbigpe3JldHVybiBhcmdzW2FyZ0luZGV4KytdfSk7aWYodHlwZW9mIGNvbnNvbGUhPT0idW5kZWZpbmVkIil7Y29uc29sZS5lcnJvcihtZXNzYWdlKX10cnl7dGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpfWNhdGNoKHgpe319O3dhcm5pbmc9ZnVuY3Rpb24gd2FybmluZyhjb25kaXRpb24sZm9ybWF0KXtpZihmb3JtYXQ9PT11bmRlZmluZWQpe3Rocm93IG5ldyBFcnJvcigiYHdhcm5pbmcoY29uZGl0aW9uLCBmb3JtYXQsIC4uLmFyZ3MpYCByZXF1aXJlcyBhIHdhcm5pbmcgIisibWVzc2FnZSBhcmd1bWVudCIpfWlmKGZvcm1hdC5pbmRleE9mKCJGYWlsZWQgQ29tcG9zaXRlIHByb3BUeXBlOiAiKT09PTApe3JldHVybn1pZighY29uZGl0aW9uKXtmb3IodmFyIF9sZW4yPWFyZ3VtZW50cy5sZW5ndGgsYXJncz1BcnJheShfbGVuMj4yP19sZW4yLTI6MCksX2tleTI9Mjtfa2V5MjxfbGVuMjtfa2V5MisrKXthcmdzW19rZXkyLTJdPWFyZ3VtZW50c1tfa2V5Ml19cHJpbnRXYXJuaW5nLmFwcGx5KHVuZGVmaW5lZCxbZm9ybWF0XS5jb25jYXQoYXJncykpfX19bW9kdWxlLmV4cG9ydHM9d2FybmluZ30sZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTp0cnVlfSk7ZXhwb3J0cy5nZXRCb3VuZFBvc2l0aW9uPWdldEJvdW5kUG9zaXRpb247ZXhwb3J0cy5zbmFwVG9HcmlkPXNuYXBUb0dyaWQ7ZXhwb3J0cy5jYW5EcmFnWD1jYW5EcmFnWDtleHBvcnRzLmNhbkRyYWdZPWNhbkRyYWdZO2V4cG9ydHMuZ2V0Q29udHJvbFBvc2l0aW9uPWdldENvbnRyb2xQb3NpdGlvbjtleHBvcnRzLmNyZWF0ZUNvcmVEYXRhPWNyZWF0ZUNvcmVEYXRhO2V4cG9ydHMuY3JlYXRlRHJhZ2dhYmxlRGF0YT1jcmVhdGVEcmFnZ2FibGVEYXRhO3ZhciBfc2hpbXM9X193ZWJwYWNrX3JlcXVpcmVfXygwKTt2YXIgX3JlYWN0RG9tPV9fd2VicGFja19yZXF1aXJlX18oNCk7dmFyIF9yZWFjdERvbTI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3REb20pO3ZhciBfZG9tRm5zPV9fd2VicGFja19yZXF1aXJlX18oNSk7ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmope3JldHVybiBvYmomJm9iai5fX2VzTW9kdWxlP29iajp7ZGVmYXVsdDpvYmp9fWZ1bmN0aW9uIGdldEJvdW5kUG9zaXRpb24oZHJhZ2dhYmxlLHgseSl7aWYoIWRyYWdnYWJsZS5wcm9wcy5ib3VuZHMpcmV0dXJuW3gseV07dmFyIGJvdW5kcz1kcmFnZ2FibGUucHJvcHMuYm91bmRzO2JvdW5kcz10eXBlb2YgYm91bmRzPT09InN0cmluZyI/Ym91bmRzOmNsb25lQm91bmRzKGJvdW5kcyk7dmFyIG5vZGU9ZmluZERPTU5vZGUoZHJhZ2dhYmxlKTtpZih0eXBlb2YgYm91bmRzPT09InN0cmluZyIpe3ZhciBvd25lckRvY3VtZW50PW5vZGUub3duZXJEb2N1bWVudDt2YXIgb3duZXJXaW5kb3c9b3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldzt2YXIgYm91bmROb2RlPXZvaWQgMDtpZihib3VuZHM9PT0icGFyZW50Iil7Ym91bmROb2RlPW5vZGUucGFyZW50Tm9kZX1lbHNle2JvdW5kTm9kZT1vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYm91bmRzKX1pZighKGJvdW5kTm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSl7dGhyb3cgbmV3IEVycm9yKCdCb3VuZHMgc2VsZWN0b3IgIicrYm91bmRzKyciIGNvdWxkIG5vdCBmaW5kIGFuIGVsZW1lbnQuJyl9dmFyIG5vZGVTdHlsZT1vd25lcldpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpO3ZhciBib3VuZE5vZGVTdHlsZT1vd25lcldpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGJvdW5kTm9kZSk7Ym91bmRzPXtsZWZ0Oi1ub2RlLm9mZnNldExlZnQrKDAsX3NoaW1zLmludCkoYm91bmROb2RlU3R5bGUucGFkZGluZ0xlZnQpKygwLF9zaGltcy5pbnQpKG5vZGVTdHlsZS5tYXJnaW5MZWZ0KSx0b3A6LW5vZGUub2Zmc2V0VG9wKygwLF9zaGltcy5pbnQpKGJvdW5kTm9kZVN0eWxlLnBhZGRpbmdUb3ApKygwLF9zaGltcy5pbnQpKG5vZGVTdHlsZS5tYXJnaW5Ub3ApLHJpZ2h0OigwLF9kb21GbnMuaW5uZXJXaWR0aCkoYm91bmROb2RlKS0oMCxfZG9tRm5zLm91dGVyV2lkdGgpKG5vZGUpLW5vZGUub2Zmc2V0TGVmdCsoMCxfc2hpbXMuaW50KShib3VuZE5vZGVTdHlsZS5wYWRkaW5nUmlnaHQpLSgwLF9zaGltcy5pbnQpKG5vZGVTdHlsZS5tYXJnaW5SaWdodCksYm90dG9tOigwLF9kb21GbnMuaW5uZXJIZWlnaHQpKGJvdW5kTm9kZSktKDAsX2RvbUZucy5vdXRlckhlaWdodCkobm9kZSktbm9kZS5vZmZzZXRUb3ArKDAsX3NoaW1zLmludCkoYm91bmROb2RlU3R5bGUucGFkZGluZ0JvdHRvbSktKDAsX3NoaW1zLmludCkobm9kZVN0eWxlLm1hcmdpbkJvdHRvbSl9fWlmKCgwLF9zaGltcy5pc051bSkoYm91bmRzLnJpZ2h0KSl4PU1hdGgubWluKHgsYm91bmRzLnJpZ2h0KTtpZigoMCxfc2hpbXMuaXNOdW0pKGJvdW5kcy5ib3R0b20pKXk9TWF0aC5taW4oeSxib3VuZHMuYm90dG9tKTtpZigoMCxfc2hpbXMuaXNOdW0pKGJvdW5kcy5sZWZ0KSl4PU1hdGgubWF4KHgsYm91bmRzLmxlZnQpO2lmKCgwLF9zaGltcy5pc051bSkoYm91bmRzLnRvcCkpeT1NYXRoLm1heCh5LGJvdW5kcy50b3ApO3JldHVyblt4LHldfWZ1bmN0aW9uIHNuYXBUb0dyaWQoZ3JpZCxwZW5kaW5nWCxwZW5kaW5nWSl7dmFyIHg9TWF0aC5yb3VuZChwZW5kaW5nWC9ncmlkWzBdKSpncmlkWzBdO3ZhciB5PU1hdGgucm91bmQocGVuZGluZ1kvZ3JpZFsxXSkqZ3JpZFsxXTtyZXR1cm5beCx5XX1mdW5jdGlvbiBjYW5EcmFnWChkcmFnZ2FibGUpe3JldHVybiBkcmFnZ2FibGUucHJvcHMuYXhpcz09PSJib3RoInx8ZHJhZ2dhYmxlLnByb3BzLmF4aXM9PT0ieCJ9ZnVuY3Rpb24gY2FuRHJhZ1koZHJhZ2dhYmxlKXtyZXR1cm4gZHJhZ2dhYmxlLnByb3BzLmF4aXM9PT0iYm90aCJ8fGRyYWdnYWJsZS5wcm9wcy5heGlzPT09InkifWZ1bmN0aW9uIGdldENvbnRyb2xQb3NpdGlvbihlLHRvdWNoSWRlbnRpZmllcixkcmFnZ2FibGVDb3JlKXt2YXIgdG91Y2hPYmo9dHlwZW9mIHRvdWNoSWRlbnRpZmllcj09PSJudW1iZXIiPygwLF9kb21GbnMuZ2V0VG91Y2gpKGUsdG91Y2hJZGVudGlmaWVyKTpudWxsO2lmKHR5cGVvZiB0b3VjaElkZW50aWZpZXI9PT0ibnVtYmVyIiYmIXRvdWNoT2JqKXJldHVybiBudWxsO3ZhciBub2RlPWZpbmRET01Ob2RlKGRyYWdnYWJsZUNvcmUpO3ZhciBvZmZzZXRQYXJlbnQ9ZHJhZ2dhYmxlQ29yZS5wcm9wcy5vZmZzZXRQYXJlbnR8fG5vZGUub2Zmc2V0UGFyZW50fHxub2RlLm93bmVyRG9jdW1lbnQuYm9keTtyZXR1cm4oMCxfZG9tRm5zLm9mZnNldFhZRnJvbVBhcmVudCkodG91Y2hPYmp8fGUsb2Zmc2V0UGFyZW50KX1mdW5jdGlvbiBjcmVhdGVDb3JlRGF0YShkcmFnZ2FibGUseCx5KXt2YXIgc3RhdGU9ZHJhZ2dhYmxlLnN0YXRlO3ZhciBpc1N0YXJ0PSEoMCxfc2hpbXMuaXNOdW0pKHN0YXRlLmxhc3RYKTt2YXIgbm9kZT1maW5kRE9NTm9kZShkcmFnZ2FibGUpO2lmKGlzU3RhcnQpe3JldHVybntub2RlOm5vZGUsZGVsdGFYOjAsZGVsdGFZOjAsbGFzdFg6eCxsYXN0WTp5LHg6eCx5Onl9fWVsc2V7cmV0dXJue25vZGU6bm9kZSxkZWx0YVg6eC1zdGF0ZS5sYXN0WCxkZWx0YVk6eS1zdGF0ZS5sYXN0WSxsYXN0WDpzdGF0ZS5sYXN0WCxsYXN0WTpzdGF0ZS5sYXN0WSx4OngseTp5fX19ZnVuY3Rpb24gY3JlYXRlRHJhZ2dhYmxlRGF0YShkcmFnZ2FibGUsY29yZURhdGEpe3JldHVybntub2RlOmNvcmVEYXRhLm5vZGUseDpkcmFnZ2FibGUuc3RhdGUueCtjb3JlRGF0YS5kZWx0YVgseTpkcmFnZ2FibGUuc3RhdGUueStjb3JlRGF0YS5kZWx0YVksZGVsdGFYOmNvcmVEYXRhLmRlbHRhWCxkZWx0YVk6Y29yZURhdGEuZGVsdGFZLGxhc3RYOmRyYWdnYWJsZS5zdGF0ZS54LGxhc3RZOmRyYWdnYWJsZS5zdGF0ZS55fX1mdW5jdGlvbiBjbG9uZUJvdW5kcyhib3VuZHMpe3JldHVybntsZWZ0OmJvdW5kcy5sZWZ0LHRvcDpib3VuZHMudG9wLHJpZ2h0OmJvdW5kcy5yaWdodCxib3R0b206Ym91bmRzLmJvdHRvbX19ZnVuY3Rpb24gZmluZERPTU5vZGUoZHJhZ2dhYmxlKXt2YXIgbm9kZT1fcmVhY3REb20yLmRlZmF1bHQuZmluZERPTU5vZGUoZHJhZ2dhYmxlKTtpZighbm9kZSl7dGhyb3cgbmV3IEVycm9yKCI8RHJhZ2dhYmxlQ29yZT46IFVubW91bnRlZCBkdXJpbmcgZXZlbnQhIil9cmV0dXJuIG5vZGV9fSxmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsoZnVuY3Rpb24ocHJvY2Vzcyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTp0cnVlfSk7dmFyIF9zbGljZWRUb0FycmF5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gc2xpY2VJdGVyYXRvcihhcnIsaSl7dmFyIF9hcnI9W107dmFyIF9uPXRydWU7dmFyIF9kPWZhbHNlO3ZhciBfZT11bmRlZmluZWQ7dHJ5e2Zvcih2YXIgX2k9YXJyW1N5bWJvbC5pdGVyYXRvcl0oKSxfczshKF9uPShfcz1faS5uZXh0KCkpLmRvbmUpO19uPXRydWUpe19hcnIucHVzaChfcy52YWx1ZSk7aWYoaSYmX2Fyci5sZW5ndGg9PT1pKWJyZWFrfX1jYXRjaChlcnIpe19kPXRydWU7X2U9ZXJyfWZpbmFsbHl7dHJ5e2lmKCFfbiYmX2lbInJldHVybiJdKV9pWyJyZXR1cm4iXSgpfWZpbmFsbHl7aWYoX2QpdGhyb3cgX2V9fXJldHVybiBfYXJyfXJldHVybiBmdW5jdGlvbihhcnIsaSl7aWYoQXJyYXkuaXNBcnJheShhcnIpKXtyZXR1cm4gYXJyfWVsc2UgaWYoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKXtyZXR1cm4gc2xpY2VJdGVyYXRvcihhcnIsaSl9ZWxzZXt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlIil9fX0oKTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQscHJvcHMpe2Zvcih2YXIgaT0wO2k8cHJvcHMubGVuZ3RoO2krKyl7dmFyIGRlc2NyaXB0b3I9cHJvcHNbaV07ZGVzY3JpcHRvci5lbnVtZXJhYmxlPWRlc2NyaXB0b3IuZW51bWVyYWJsZXx8ZmFsc2U7ZGVzY3JpcHRvci5jb25maWd1cmFibGU9dHJ1ZTtpZigidmFsdWUiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKX19cmV0dXJuIGZ1bmN0aW9uKENvbnN0cnVjdG9yLHByb3RvUHJvcHMsc3RhdGljUHJvcHMpe2lmKHByb3RvUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUscHJvdG9Qcm9wcyk7aWYoc3RhdGljUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3RvcixzdGF0aWNQcm9wcyk7cmV0dXJuIENvbnN0cnVjdG9yfX0oKTt2YXIgX3JlYWN0PV9fd2VicGFja19yZXF1aXJlX18oNik7dmFyIF9yZWFjdDI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO3ZhciBfcHJvcFR5cGVzPV9fd2VicGFja19yZXF1aXJlX18oNyk7dmFyIF9wcm9wVHlwZXMyPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7dmFyIF9yZWFjdERvbT1fX3dlYnBhY2tfcmVxdWlyZV9fKDQpO3ZhciBfcmVhY3REb20yPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0RG9tKTt2YXIgX2RvbUZucz1fX3dlYnBhY2tfcmVxdWlyZV9fKDUpO3ZhciBfcG9zaXRpb25GbnM9X193ZWJwYWNrX3JlcXVpcmVfXyg5KTt2YXIgX3NoaW1zPV9fd2VicGFja19yZXF1aXJlX18oMCk7dmFyIF9sb2c9X193ZWJwYWNrX3JlcXVpcmVfXygxMSk7dmFyIF9sb2cyPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2xvZyk7ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmope3JldHVybiBvYmomJm9iai5fX2VzTW9kdWxlP29iajp7ZGVmYXVsdDpvYmp9fWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSxDb25zdHJ1Y3Rvcil7aWYoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsY2FsbCl7aWYoIXNlbGYpe3Rocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIil9cmV0dXJuIGNhbGwmJigodHlwZW9mIGNhbGw9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKGNhbGwpKT09PSJvYmplY3QifHx0eXBlb2YgY2FsbD09PSJmdW5jdGlvbiIpP2NhbGw6c2VsZn1mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT0iZnVuY3Rpb24iJiZzdXBlckNsYXNzIT09bnVsbCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiKyh0eXBlb2Ygc3VwZXJDbGFzcz09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2Yoc3VwZXJDbGFzcykpKX1zdWJDbGFzcy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzJiZzdXBlckNsYXNzLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnN1YkNsYXNzLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX19KTtpZihzdXBlckNsYXNzKU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3Msc3VwZXJDbGFzcyk6c3ViQ2xhc3MuX19wcm90b19fPXN1cGVyQ2xhc3N9dmFyIGV2ZW50c0Zvcj17dG91Y2g6e3N0YXJ0OiJ0b3VjaHN0YXJ0Iixtb3ZlOiJ0b3VjaG1vdmUiLHN0b3A6InRvdWNoZW5kIn0sbW91c2U6e3N0YXJ0OiJtb3VzZWRvd24iLG1vdmU6Im1vdXNlbW92ZSIsc3RvcDoibW91c2V1cCJ9fTt2YXIgZHJhZ0V2ZW50Rm9yPWV2ZW50c0Zvci5tb3VzZTt2YXIgRHJhZ2dhYmxlQ29yZT1mdW5jdGlvbihfUmVhY3QkQ29tcG9uZW50KXtfaW5oZXJpdHMoRHJhZ2dhYmxlQ29yZSxfUmVhY3QkQ29tcG9uZW50KTtmdW5jdGlvbiBEcmFnZ2FibGVDb3JlKCl7dmFyIF9yZWY7dmFyIF90ZW1wLF90aGlzLF9yZXQ7X2NsYXNzQ2FsbENoZWNrKHRoaXMsRHJhZ2dhYmxlQ29yZSk7Zm9yKHZhciBfbGVuPWFyZ3VtZW50cy5sZW5ndGgsYXJncz1BcnJheShfbGVuKSxfa2V5PTA7X2tleTxfbGVuO19rZXkrKyl7YXJnc1tfa2V5XT1hcmd1bWVudHNbX2tleV19cmV0dXJuIF9yZXQ9KF90ZW1wPShfdGhpcz1fcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLChfcmVmPURyYWdnYWJsZUNvcmUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoRHJhZ2dhYmxlQ29yZSkpLmNhbGwuYXBwbHkoX3JlZixbdGhpc10uY29uY2F0KGFyZ3MpKSksX3RoaXMpLF90aGlzLnN0YXRlPXtkcmFnZ2luZzpmYWxzZSxsYXN0WDpOYU4sbGFzdFk6TmFOLHRvdWNoSWRlbnRpZmllcjpudWxsfSxfdGhpcy5oYW5kbGVEcmFnU3RhcnQ9ZnVuY3Rpb24oZSl7X3RoaXMucHJvcHMub25Nb3VzZURvd24oZSk7aWYoIV90aGlzLnByb3BzLmFsbG93QW55Q2xpY2smJnR5cGVvZiBlLmJ1dHRvbj09PSJudW1iZXIiJiZlLmJ1dHRvbiE9PTApcmV0dXJuIGZhbHNlO3ZhciB0aGlzTm9kZT1fcmVhY3REb20yLmRlZmF1bHQuZmluZERPTU5vZGUoX3RoaXMpO2lmKCF0aGlzTm9kZXx8IXRoaXNOb2RlLm93bmVyRG9jdW1lbnR8fCF0aGlzTm9kZS5vd25lckRvY3VtZW50LmJvZHkpe3Rocm93IG5ldyBFcnJvcigiPERyYWdnYWJsZUNvcmU+IG5vdCBtb3VudGVkIG9uIERyYWdTdGFydCEiKX12YXIgb3duZXJEb2N1bWVudD10aGlzTm9kZS5vd25lckRvY3VtZW50O2lmKF90aGlzLnByb3BzLmRpc2FibGVkfHwhKGUudGFyZ2V0IGluc3RhbmNlb2Ygb3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5Ob2RlKXx8X3RoaXMucHJvcHMuaGFuZGxlJiYhKDAsX2RvbUZucy5tYXRjaGVzU2VsZWN0b3JBbmRQYXJlbnRzVG8pKGUudGFyZ2V0LF90aGlzLnByb3BzLmhhbmRsZSx0aGlzTm9kZSl8fF90aGlzLnByb3BzLmNhbmNlbCYmKDAsX2RvbUZucy5tYXRjaGVzU2VsZWN0b3JBbmRQYXJlbnRzVG8pKGUudGFyZ2V0LF90aGlzLnByb3BzLmNhbmNlbCx0aGlzTm9kZSkpe3JldHVybn12YXIgdG91Y2hJZGVudGlmaWVyPSgwLF9kb21GbnMuZ2V0VG91Y2hJZGVudGlmaWVyKShlKTtfdGhpcy5zZXRTdGF0ZSh7dG91Y2hJZGVudGlmaWVyOnRvdWNoSWRlbnRpZmllcn0pO3ZhciBwb3NpdGlvbj0oMCxfcG9zaXRpb25GbnMuZ2V0Q29udHJvbFBvc2l0aW9uKShlLHRvdWNoSWRlbnRpZmllcixfdGhpcyk7aWYocG9zaXRpb249PW51bGwpcmV0dXJuO3ZhciB4PXBvc2l0aW9uLngseT1wb3NpdGlvbi55O3ZhciBjb3JlRXZlbnQ9KDAsX3Bvc2l0aW9uRm5zLmNyZWF0ZUNvcmVEYXRhKShfdGhpcyx4LHkpOygwLF9sb2cyLmRlZmF1bHQpKCJEcmFnZ2FibGVDb3JlOiBoYW5kbGVEcmFnU3RhcnQ6ICVqIixjb3JlRXZlbnQpOygwLF9sb2cyLmRlZmF1bHQpKCJjYWxsaW5nIixfdGhpcy5wcm9wcy5vblN0YXJ0KTt2YXIgc2hvdWxkVXBkYXRlPV90aGlzLnByb3BzLm9uU3RhcnQoZSxjb3JlRXZlbnQpO2lmKHNob3VsZFVwZGF0ZT09PWZhbHNlKXJldHVybjtpZihfdGhpcy5wcm9wcy5lbmFibGVVc2VyU2VsZWN0SGFjaykoMCxfZG9tRm5zLmFkZFVzZXJTZWxlY3RTdHlsZXMpKG93bmVyRG9jdW1lbnQpO190aGlzLnNldFN0YXRlKHtkcmFnZ2luZzp0cnVlLGxhc3RYOngsbGFzdFk6eX0pOygwLF9kb21GbnMuYWRkRXZlbnQpKG93bmVyRG9jdW1lbnQsZHJhZ0V2ZW50Rm9yLm1vdmUsX3RoaXMuaGFuZGxlRHJhZyk7KDAsX2RvbUZucy5hZGRFdmVudCkob3duZXJEb2N1bWVudCxkcmFnRXZlbnRGb3Iuc3RvcCxfdGhpcy5oYW5kbGVEcmFnU3RvcCl9LF90aGlzLmhhbmRsZURyYWc9ZnVuY3Rpb24oZSl7aWYoZS50eXBlPT09InRvdWNobW92ZSIpZS5wcmV2ZW50RGVmYXVsdCgpO3ZhciBwb3NpdGlvbj0oMCxfcG9zaXRpb25GbnMuZ2V0Q29udHJvbFBvc2l0aW9uKShlLF90aGlzLnN0YXRlLnRvdWNoSWRlbnRpZmllcixfdGhpcyk7aWYocG9zaXRpb249PW51bGwpcmV0dXJuO3ZhciB4PXBvc2l0aW9uLngseT1wb3NpdGlvbi55O2lmKEFycmF5LmlzQXJyYXkoX3RoaXMucHJvcHMuZ3JpZCkpe3ZhciBfZGVsdGFYPXgtX3RoaXMuc3RhdGUubGFzdFgsX2RlbHRhWT15LV90aGlzLnN0YXRlLmxhc3RZO3ZhciBfc25hcFRvR3JpZD0oMCxfcG9zaXRpb25GbnMuc25hcFRvR3JpZCkoX3RoaXMucHJvcHMuZ3JpZCxfZGVsdGFYLF9kZWx0YVkpO3ZhciBfc25hcFRvR3JpZDI9X3NsaWNlZFRvQXJyYXkoX3NuYXBUb0dyaWQsMik7X2RlbHRhWD1fc25hcFRvR3JpZDJbMF07X2RlbHRhWT1fc25hcFRvR3JpZDJbMV07aWYoIV9kZWx0YVgmJiFfZGVsdGFZKXJldHVybjt4PV90aGlzLnN0YXRlLmxhc3RYK19kZWx0YVgseT1fdGhpcy5zdGF0ZS5sYXN0WStfZGVsdGFZfXZhciBjb3JlRXZlbnQ9KDAsX3Bvc2l0aW9uRm5zLmNyZWF0ZUNvcmVEYXRhKShfdGhpcyx4LHkpOygwLF9sb2cyLmRlZmF1bHQpKCJEcmFnZ2FibGVDb3JlOiBoYW5kbGVEcmFnOiAlaiIsY29yZUV2ZW50KTt2YXIgc2hvdWxkVXBkYXRlPV90aGlzLnByb3BzLm9uRHJhZyhlLGNvcmVFdmVudCk7aWYoc2hvdWxkVXBkYXRlPT09ZmFsc2Upe3RyeXtfdGhpcy5oYW5kbGVEcmFnU3RvcChuZXcgTW91c2VFdmVudCgibW91c2V1cCIpKX1jYXRjaChlcnIpe3ZhciBldmVudD1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtldmVudC5pbml0TW91c2VFdmVudCgibW91c2V1cCIsdHJ1ZSx0cnVlLHdpbmRvdywwLDAsMCwwLDAsZmFsc2UsZmFsc2UsZmFsc2UsZmFsc2UsMCxudWxsKTtfdGhpcy5oYW5kbGVEcmFnU3RvcChldmVudCl9cmV0dXJufV90aGlzLnNldFN0YXRlKHtsYXN0WDp4LGxhc3RZOnl9KX0sX3RoaXMuaGFuZGxlRHJhZ1N0b3A9ZnVuY3Rpb24oZSl7aWYoIV90aGlzLnN0YXRlLmRyYWdnaW5nKXJldHVybjt2YXIgcG9zaXRpb249KDAsX3Bvc2l0aW9uRm5zLmdldENvbnRyb2xQb3NpdGlvbikoZSxfdGhpcy5zdGF0ZS50b3VjaElkZW50aWZpZXIsX3RoaXMpO2lmKHBvc2l0aW9uPT1udWxsKXJldHVybjt2YXIgeD1wb3NpdGlvbi54LHk9cG9zaXRpb24ueTt2YXIgY29yZUV2ZW50PSgwLF9wb3NpdGlvbkZucy5jcmVhdGVDb3JlRGF0YSkoX3RoaXMseCx5KTt2YXIgdGhpc05vZGU9X3JlYWN0RG9tMi5kZWZhdWx0LmZpbmRET01Ob2RlKF90aGlzKTtpZih0aGlzTm9kZSl7aWYoX3RoaXMucHJvcHMuZW5hYmxlVXNlclNlbGVjdEhhY2spKDAsX2RvbUZucy5yZW1vdmVVc2VyU2VsZWN0U3R5bGVzKSh0aGlzTm9kZS5vd25lckRvY3VtZW50KX0oMCxfbG9nMi5kZWZhdWx0KSgiRHJhZ2dhYmxlQ29yZTogaGFuZGxlRHJhZ1N0b3A6ICVqIixjb3JlRXZlbnQpO190aGlzLnNldFN0YXRlKHtkcmFnZ2luZzpmYWxzZSxsYXN0WDpOYU4sbGFzdFk6TmFOfSk7X3RoaXMucHJvcHMub25TdG9wKGUsY29yZUV2ZW50KTtpZih0aGlzTm9kZSl7KDAsX2xvZzIuZGVmYXVsdCkoIkRyYWdnYWJsZUNvcmU6IFJlbW92aW5nIGhhbmRsZXJzIik7KDAsX2RvbUZucy5yZW1vdmVFdmVudCkodGhpc05vZGUub3duZXJEb2N1bWVudCxkcmFnRXZlbnRGb3IubW92ZSxfdGhpcy5oYW5kbGVEcmFnKTsoMCxfZG9tRm5zLnJlbW92ZUV2ZW50KSh0aGlzTm9kZS5vd25lckRvY3VtZW50LGRyYWdFdmVudEZvci5zdG9wLF90aGlzLmhhbmRsZURyYWdTdG9wKX19LF90aGlzLm9uTW91c2VEb3duPWZ1bmN0aW9uKGUpe2RyYWdFdmVudEZvcj1ldmVudHNGb3IubW91c2U7cmV0dXJuIF90aGlzLmhhbmRsZURyYWdTdGFydChlKX0sX3RoaXMub25Nb3VzZVVwPWZ1bmN0aW9uKGUpe2RyYWdFdmVudEZvcj1ldmVudHNGb3IubW91c2U7cmV0dXJuIF90aGlzLmhhbmRsZURyYWdTdG9wKGUpfSxfdGhpcy5vblRvdWNoU3RhcnQ9ZnVuY3Rpb24oZSl7ZHJhZ0V2ZW50Rm9yPWV2ZW50c0Zvci50b3VjaDtyZXR1cm4gX3RoaXMuaGFuZGxlRHJhZ1N0YXJ0KGUpfSxfdGhpcy5vblRvdWNoRW5kPWZ1bmN0aW9uKGUpe2RyYWdFdmVudEZvcj1ldmVudHNGb3IudG91Y2g7cmV0dXJuIF90aGlzLmhhbmRsZURyYWdTdG9wKGUpfSxfdGVtcCksX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsX3JldCl9X2NyZWF0ZUNsYXNzKERyYWdnYWJsZUNvcmUsW3trZXk6ImNvbXBvbmVudFdpbGxVbm1vdW50Iix2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpe3ZhciB0aGlzTm9kZT1fcmVhY3REb20yLmRlZmF1bHQuZmluZERPTU5vZGUodGhpcyk7aWYodGhpc05vZGUpe3ZhciBvd25lckRvY3VtZW50PXRoaXNOb2RlLm93bmVyRG9jdW1lbnQ7KDAsX2RvbUZucy5yZW1vdmVFdmVudCkob3duZXJEb2N1bWVudCxldmVudHNGb3IubW91c2UubW92ZSx0aGlzLmhhbmRsZURyYWcpOygwLF9kb21GbnMucmVtb3ZlRXZlbnQpKG93bmVyRG9jdW1lbnQsZXZlbnRzRm9yLnRvdWNoLm1vdmUsdGhpcy5oYW5kbGVEcmFnKTsoMCxfZG9tRm5zLnJlbW92ZUV2ZW50KShvd25lckRvY3VtZW50LGV2ZW50c0Zvci5tb3VzZS5zdG9wLHRoaXMuaGFuZGxlRHJhZ1N0b3ApOygwLF9kb21GbnMucmVtb3ZlRXZlbnQpKG93bmVyRG9jdW1lbnQsZXZlbnRzRm9yLnRvdWNoLnN0b3AsdGhpcy5oYW5kbGVEcmFnU3RvcCk7aWYodGhpcy5wcm9wcy5lbmFibGVVc2VyU2VsZWN0SGFjaykoMCxfZG9tRm5zLnJlbW92ZVVzZXJTZWxlY3RTdHlsZXMpKG93bmVyRG9jdW1lbnQpfX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyKCl7cmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jbG9uZUVsZW1lbnQoX3JlYWN0Mi5kZWZhdWx0LkNoaWxkcmVuLm9ubHkodGhpcy5wcm9wcy5jaGlsZHJlbikse3N0eWxlOigwLF9kb21GbnMuc3R5bGVIYWNrcykodGhpcy5wcm9wcy5jaGlsZHJlbi5wcm9wcy5zdHlsZSksb25Nb3VzZURvd246dGhpcy5vbk1vdXNlRG93bixvblRvdWNoU3RhcnQ6dGhpcy5vblRvdWNoU3RhcnQsb25Nb3VzZVVwOnRoaXMub25Nb3VzZVVwLG9uVG91Y2hFbmQ6dGhpcy5vblRvdWNoRW5kfSl9fV0pO3JldHVybiBEcmFnZ2FibGVDb3JlfShfcmVhY3QyLmRlZmF1bHQuQ29tcG9uZW50KTtEcmFnZ2FibGVDb3JlLmRpc3BsYXlOYW1lPSJEcmFnZ2FibGVDb3JlIjtEcmFnZ2FibGVDb3JlLnByb3BUeXBlcz17YWxsb3dBbnlDbGljazpfcHJvcFR5cGVzMi5kZWZhdWx0LmJvb2wsZGlzYWJsZWQ6X3Byb3BUeXBlczIuZGVmYXVsdC5ib29sLGVuYWJsZVVzZXJTZWxlY3RIYWNrOl9wcm9wVHlwZXMyLmRlZmF1bHQuYm9vbCxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24gb2Zmc2V0UGFyZW50KHByb3BzLHByb3BOYW1lKXtpZihwcm9jZXNzLmJyb3dzZXImJnByb3BzW3Byb3BOYW1lXSYmcHJvcHNbcHJvcE5hbWVdLm5vZGVUeXBlIT09MSl7dGhyb3cgbmV3IEVycm9yKCJEcmFnZ2FibGUncyBvZmZzZXRQYXJlbnQgbXVzdCBiZSBhIERPTSBOb2RlLiIpfX0sZ3JpZDpfcHJvcFR5cGVzMi5kZWZhdWx0LmFycmF5T2YoX3Byb3BUeXBlczIuZGVmYXVsdC5udW1iZXIpLGhhbmRsZTpfcHJvcFR5cGVzMi5kZWZhdWx0LnN0cmluZyxjYW5jZWw6X3Byb3BUeXBlczIuZGVmYXVsdC5zdHJpbmcsb25TdGFydDpfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMsb25EcmFnOl9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxvblN0b3A6X3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jLG9uTW91c2VEb3duOl9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxjbGFzc05hbWU6X3NoaW1zLmRvbnRTZXRNZSxzdHlsZTpfc2hpbXMuZG9udFNldE1lLHRyYW5zZm9ybTpfc2hpbXMuZG9udFNldE1lfTtEcmFnZ2FibGVDb3JlLmRlZmF1bHRQcm9wcz17YWxsb3dBbnlDbGljazpmYWxzZSxjYW5jZWw6bnVsbCxkaXNhYmxlZDpmYWxzZSxlbmFibGVVc2VyU2VsZWN0SGFjazp0cnVlLG9mZnNldFBhcmVudDpudWxsLGhhbmRsZTpudWxsLGdyaWQ6bnVsbCx0cmFuc2Zvcm06bnVsbCxvblN0YXJ0OmZ1bmN0aW9uIG9uU3RhcnQoKXt9LG9uRHJhZzpmdW5jdGlvbiBvbkRyYWcoKXt9LG9uU3RvcDpmdW5jdGlvbiBvblN0b3AoKXt9LG9uTW91c2VEb3duOmZ1bmN0aW9uIG9uTW91c2VEb3duKCl7fX07ZXhwb3J0cy5kZWZhdWx0PURyYWdnYWJsZUNvcmV9KS5jYWxsKGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXygxOSkpfSxmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywiX19lc01vZHVsZSIse3ZhbHVlOnRydWV9KTtleHBvcnRzLmRlZmF1bHQ9bG9nO2Z1bmN0aW9uIGxvZygpe3ZhciBfY29uc29sZTtpZih1bmRlZmluZWQpKF9jb25zb2xlPWNvbnNvbGUpLmxvZy5hcHBseShfY29uc29sZSxhcmd1bWVudHMpfX0sZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7dmFyIERyYWdnYWJsZT1fX3dlYnBhY2tfcmVxdWlyZV9fKDEzKS5kZWZhdWx0O21vZHVsZS5leHBvcnRzPURyYWdnYWJsZTttb2R1bGUuZXhwb3J0cy5kZWZhdWx0PURyYWdnYWJsZTttb2R1bGUuZXhwb3J0cy5EcmFnZ2FibGVDb3JlPV9fd2VicGFja19yZXF1aXJlX18oMTApLmRlZmF1bHR9LGZ1bmN0aW9uKG1vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pe09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCJfX2VzTW9kdWxlIix7dmFsdWU6dHJ1ZX0pO3ZhciBfZXh0ZW5kcyQkMT1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XX19fXJldHVybiB0YXJnZXR9O3ZhciBfc2xpY2VkVG9BcnJheT1mdW5jdGlvbigpe2Z1bmN0aW9uIHNsaWNlSXRlcmF0b3IoYXJyLGkpe3ZhciBfYXJyPVtdO3ZhciBfbj10cnVlO3ZhciBfZD1mYWxzZTt2YXIgX2U9dW5kZWZpbmVkO3RyeXtmb3IodmFyIF9pPWFycltTeW1ib2wuaXRlcmF0b3JdKCksX3M7IShfbj0oX3M9X2kubmV4dCgpKS5kb25lKTtfbj10cnVlKXtfYXJyLnB1c2goX3MudmFsdWUpO2lmKGkmJl9hcnIubGVuZ3RoPT09aSlicmVha319Y2F0Y2goZXJyKXtfZD10cnVlO19lPWVycn1maW5hbGx5e3RyeXtpZighX24mJl9pWyJyZXR1cm4iXSlfaVsicmV0dXJuIl0oKX1maW5hbGx5e2lmKF9kKXRocm93IF9lfX1yZXR1cm4gX2Fycn1yZXR1cm4gZnVuY3Rpb24oYXJyLGkpe2lmKEFycmF5LmlzQXJyYXkoYXJyKSl7cmV0dXJuIGFycn1lbHNlIGlmKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSl7cmV0dXJuIHNsaWNlSXRlcmF0b3IoYXJyLGkpfWVsc2V7dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZSIpfX19KCk7dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoInZhbHVlImluIGRlc2NyaXB0b3IpZGVzY3JpcHRvci53cml0YWJsZT10cnVlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsZGVzY3JpcHRvci5rZXksZGVzY3JpcHRvcil9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcn19KCk7dmFyIF9yZWFjdD1fX3dlYnBhY2tfcmVxdWlyZV9fKDYpO3ZhciBfcmVhY3QyPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTt2YXIgX3Byb3BUeXBlcz1fX3dlYnBhY2tfcmVxdWlyZV9fKDcpO3ZhciBfcHJvcFR5cGVzMj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO3ZhciBfcmVhY3REb209X193ZWJwYWNrX3JlcXVpcmVfXyg0KTt2YXIgX3JlYWN0RG9tMj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdERvbSk7dmFyIF9jbGFzc25hbWVzPV9fd2VicGFja19yZXF1aXJlX18oMTcpO3ZhciBfY2xhc3NuYW1lczI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7dmFyIF9kb21GbnM9X193ZWJwYWNrX3JlcXVpcmVfXyg1KTt2YXIgX3Bvc2l0aW9uRm5zPV9fd2VicGFja19yZXF1aXJlX18oOSk7dmFyIF9zaGltcz1fX3dlYnBhY2tfcmVxdWlyZV9fKDApO3ZhciBfRHJhZ2dhYmxlQ29yZT1fX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTt2YXIgX0RyYWdnYWJsZUNvcmUyPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0RyYWdnYWJsZUNvcmUpO3ZhciBfbG9nPV9fd2VicGFja19yZXF1aXJlX18oMTEpO3ZhciBfbG9nMj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9sb2cpO2Z1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKXtyZXR1cm4gb2JqJiZvYmouX19lc01vZHVsZT9vYmo6e2RlZmF1bHQ6b2JqfX1mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLGtleSx2YWx1ZSl7aWYoa2V5IGluIG9iail7T2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaixrZXkse3ZhbHVlOnZhbHVlLGVudW1lcmFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZSx3cml0YWJsZTp0cnVlfSl9ZWxzZXtvYmpba2V5XT12YWx1ZX1yZXR1cm4gb2JqfWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSxDb25zdHJ1Y3Rvcil7aWYoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsY2FsbCl7aWYoIXNlbGYpe3Rocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIil9cmV0dXJuIGNhbGwmJigodHlwZW9mIGNhbGw9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKGNhbGwpKT09PSJvYmplY3QifHx0eXBlb2YgY2FsbD09PSJmdW5jdGlvbiIpP2NhbGw6c2VsZn1mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT0iZnVuY3Rpb24iJiZzdXBlckNsYXNzIT09bnVsbCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiKyh0eXBlb2Ygc3VwZXJDbGFzcz09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2Yoc3VwZXJDbGFzcykpKX1zdWJDbGFzcy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzJiZzdXBlckNsYXNzLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnN1YkNsYXNzLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX19KTtpZihzdXBlckNsYXNzKU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3Msc3VwZXJDbGFzcyk6c3ViQ2xhc3MuX19wcm90b19fPXN1cGVyQ2xhc3N9dmFyIERyYWdnYWJsZT1mdW5jdGlvbihfUmVhY3QkQ29tcG9uZW50KXtfaW5oZXJpdHMoRHJhZ2dhYmxlLF9SZWFjdCRDb21wb25lbnQpO2Z1bmN0aW9uIERyYWdnYWJsZShwcm9wcyl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsRHJhZ2dhYmxlKTt2YXIgX3RoaXM9X3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywoRHJhZ2dhYmxlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKERyYWdnYWJsZSkpLmNhbGwodGhpcyxwcm9wcykpO190aGlzLm9uRHJhZ1N0YXJ0PWZ1bmN0aW9uKGUsY29yZURhdGEpeygwLF9sb2cyLmRlZmF1bHQpKCJEcmFnZ2FibGU6IG9uRHJhZ1N0YXJ0OiAlaiIsY29yZURhdGEpO3ZhciBzaG91bGRTdGFydD1fdGhpcy5wcm9wcy5vblN0YXJ0KGUsKDAsX3Bvc2l0aW9uRm5zLmNyZWF0ZURyYWdnYWJsZURhdGEpKF90aGlzLGNvcmVEYXRhKSk7aWYoc2hvdWxkU3RhcnQ9PT1mYWxzZSlyZXR1cm4gZmFsc2U7X3RoaXMuc2V0U3RhdGUoe2RyYWdnaW5nOnRydWUsZHJhZ2dlZDp0cnVlfSl9O190aGlzLm9uRHJhZz1mdW5jdGlvbihlLGNvcmVEYXRhKXtpZighX3RoaXMuc3RhdGUuZHJhZ2dpbmcpcmV0dXJuIGZhbHNlOygwLF9sb2cyLmRlZmF1bHQpKCJEcmFnZ2FibGU6IG9uRHJhZzogJWoiLGNvcmVEYXRhKTt2YXIgdWlEYXRhPSgwLF9wb3NpdGlvbkZucy5jcmVhdGVEcmFnZ2FibGVEYXRhKShfdGhpcyxjb3JlRGF0YSk7dmFyIG5ld1N0YXRlPXt4OnVpRGF0YS54LHk6dWlEYXRhLnl9O2lmKF90aGlzLnByb3BzLmJvdW5kcyl7dmFyIF94PW5ld1N0YXRlLngsX3k9bmV3U3RhdGUueTtuZXdTdGF0ZS54Kz1fdGhpcy5zdGF0ZS5zbGFja1g7bmV3U3RhdGUueSs9X3RoaXMuc3RhdGUuc2xhY2tZO3ZhciBfZ2V0Qm91bmRQb3NpdGlvbj0oMCxfcG9zaXRpb25GbnMuZ2V0Qm91bmRQb3NpdGlvbikoX3RoaXMsbmV3U3RhdGUueCxuZXdTdGF0ZS55KTt2YXIgX2dldEJvdW5kUG9zaXRpb24yPV9zbGljZWRUb0FycmF5KF9nZXRCb3VuZFBvc2l0aW9uLDIpO25ld1N0YXRlLng9X2dldEJvdW5kUG9zaXRpb24yWzBdO25ld1N0YXRlLnk9X2dldEJvdW5kUG9zaXRpb24yWzFdO25ld1N0YXRlLnNsYWNrWD1fdGhpcy5zdGF0ZS5zbGFja1grKF94LW5ld1N0YXRlLngpO25ld1N0YXRlLnNsYWNrWT1fdGhpcy5zdGF0ZS5zbGFja1krKF95LW5ld1N0YXRlLnkpO3VpRGF0YS54PW5ld1N0YXRlLng7dWlEYXRhLnk9bmV3U3RhdGUueTt1aURhdGEuZGVsdGFYPW5ld1N0YXRlLngtX3RoaXMuc3RhdGUueDt1aURhdGEuZGVsdGFZPW5ld1N0YXRlLnktX3RoaXMuc3RhdGUueX12YXIgc2hvdWxkVXBkYXRlPV90aGlzLnByb3BzLm9uRHJhZyhlLHVpRGF0YSk7aWYoc2hvdWxkVXBkYXRlPT09ZmFsc2UpcmV0dXJuIGZhbHNlO190aGlzLnNldFN0YXRlKG5ld1N0YXRlKX07X3RoaXMub25EcmFnU3RvcD1mdW5jdGlvbihlLGNvcmVEYXRhKXtpZighX3RoaXMuc3RhdGUuZHJhZ2dpbmcpcmV0dXJuIGZhbHNlO3ZhciBzaG91bGRTdG9wPV90aGlzLnByb3BzLm9uU3RvcChlLCgwLF9wb3NpdGlvbkZucy5jcmVhdGVEcmFnZ2FibGVEYXRhKShfdGhpcyxjb3JlRGF0YSkpO2lmKHNob3VsZFN0b3A9PT1mYWxzZSlyZXR1cm4gZmFsc2U7KDAsX2xvZzIuZGVmYXVsdCkoIkRyYWdnYWJsZTogb25EcmFnU3RvcDogJWoiLGNvcmVEYXRhKTt2YXIgbmV3U3RhdGU9e2RyYWdnaW5nOmZhbHNlLHNsYWNrWDowLHNsYWNrWTowfTt2YXIgY29udHJvbGxlZD1Cb29sZWFuKF90aGlzLnByb3BzLnBvc2l0aW9uKTtpZihjb250cm9sbGVkKXt2YXIgX3RoaXMkcHJvcHMkcG9zaXRpb249X3RoaXMucHJvcHMucG9zaXRpb24sX3gyPV90aGlzJHByb3BzJHBvc2l0aW9uLngsX3kyPV90aGlzJHByb3BzJHBvc2l0aW9uLnk7bmV3U3RhdGUueD1feDI7bmV3U3RhdGUueT1feTJ9X3RoaXMuc2V0U3RhdGUobmV3U3RhdGUpfTtfdGhpcy5zdGF0ZT17ZHJhZ2dpbmc6ZmFsc2UsZHJhZ2dlZDpmYWxzZSx4OnByb3BzLnBvc2l0aW9uP3Byb3BzLnBvc2l0aW9uLng6cHJvcHMuZGVmYXVsdFBvc2l0aW9uLngseTpwcm9wcy5wb3NpdGlvbj9wcm9wcy5wb3NpdGlvbi55OnByb3BzLmRlZmF1bHRQb3NpdGlvbi55LHNsYWNrWDowLHNsYWNrWTowLGlzRWxlbWVudFNWRzpmYWxzZX07cmV0dXJuIF90aGlzfV9jcmVhdGVDbGFzcyhEcmFnZ2FibGUsW3trZXk6ImNvbXBvbmVudFdpbGxNb3VudCIsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50V2lsbE1vdW50KCl7aWYodGhpcy5wcm9wcy5wb3NpdGlvbiYmISh0aGlzLnByb3BzLm9uRHJhZ3x8dGhpcy5wcm9wcy5vblN0b3ApKXtjb25zb2xlLndhcm4oIkEgYHBvc2l0aW9uYCB3YXMgYXBwbGllZCB0byB0aGlzIDxEcmFnZ2FibGU+LCB3aXRob3V0IGRyYWcgaGFuZGxlcnMuIFRoaXMgd2lsbCBtYWtlIHRoaXMgIisiY29tcG9uZW50IGVmZmVjdGl2ZWx5IHVuZHJhZ2dhYmxlLiBQbGVhc2UgYXR0YWNoIGBvbkRyYWdgIG9yIGBvblN0b3BgIGhhbmRsZXJzIHNvIHlvdSBjYW4gYWRqdXN0IHRoZSAiKyJgcG9zaXRpb25gIG9mIHRoaXMgZWxlbWVudC4iKX19fSx7a2V5OiJjb21wb25lbnREaWRNb3VudCIsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKXtpZih0eXBlb2Ygd2luZG93LlNWR0VsZW1lbnQhPT0idW5kZWZpbmVkIiYmX3JlYWN0RG9tMi5kZWZhdWx0LmZpbmRET01Ob2RlKHRoaXMpaW5zdGFuY2VvZiB3aW5kb3cuU1ZHRWxlbWVudCl7dGhpcy5zZXRTdGF0ZSh7aXNFbGVtZW50U1ZHOnRydWV9KX19fSx7a2V5OiJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIix2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcyl7aWYobmV4dFByb3BzLnBvc2l0aW9uJiYoIXRoaXMucHJvcHMucG9zaXRpb258fG5leHRQcm9wcy5wb3NpdGlvbi54IT09dGhpcy5wcm9wcy5wb3NpdGlvbi54fHxuZXh0UHJvcHMucG9zaXRpb24ueSE9PXRoaXMucHJvcHMucG9zaXRpb24ueSkpe3RoaXMuc2V0U3RhdGUoe3g6bmV4dFByb3BzLnBvc2l0aW9uLngseTpuZXh0UHJvcHMucG9zaXRpb24ueX0pfX19LHtrZXk6ImNvbXBvbmVudFdpbGxVbm1vdW50Iix2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpe3RoaXMuc2V0U3RhdGUoe2RyYWdnaW5nOmZhbHNlfSl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3ZhciBfY2xhc3NOYW1lczt2YXIgc3R5bGU9e30sc3ZnVHJhbnNmb3JtPW51bGw7dmFyIGNvbnRyb2xsZWQ9Qm9vbGVhbih0aGlzLnByb3BzLnBvc2l0aW9uKTt2YXIgZHJhZ2dhYmxlPSFjb250cm9sbGVkfHx0aGlzLnN0YXRlLmRyYWdnaW5nO3ZhciBwb3NpdGlvbj10aGlzLnByb3BzLnBvc2l0aW9ufHx0aGlzLnByb3BzLmRlZmF1bHRQb3NpdGlvbjt2YXIgdHJhbnNmb3JtT3B0cz17eDooMCxfcG9zaXRpb25GbnMuY2FuRHJhZ1gpKHRoaXMpJiZkcmFnZ2FibGU/dGhpcy5zdGF0ZS54OnBvc2l0aW9uLngseTooMCxfcG9zaXRpb25GbnMuY2FuRHJhZ1kpKHRoaXMpJiZkcmFnZ2FibGU/dGhpcy5zdGF0ZS55OnBvc2l0aW9uLnl9O2lmKHRoaXMuc3RhdGUuaXNFbGVtZW50U1ZHKXtzdmdUcmFuc2Zvcm09KDAsX2RvbUZucy5jcmVhdGVTVkdUcmFuc2Zvcm0pKHRyYW5zZm9ybU9wdHMpfWVsc2V7c3R5bGU9KDAsX2RvbUZucy5jcmVhdGVDU1NUcmFuc2Zvcm0pKHRyYW5zZm9ybU9wdHMpfXZhciBfcHJvcHM9dGhpcy5wcm9wcyxkZWZhdWx0Q2xhc3NOYW1lPV9wcm9wcy5kZWZhdWx0Q2xhc3NOYW1lLGRlZmF1bHRDbGFzc05hbWVEcmFnZ2luZz1fcHJvcHMuZGVmYXVsdENsYXNzTmFtZURyYWdnaW5nLGRlZmF1bHRDbGFzc05hbWVEcmFnZ2VkPV9wcm9wcy5kZWZhdWx0Q2xhc3NOYW1lRHJhZ2dlZDt2YXIgY2xhc3NOYW1lPSgwLF9jbGFzc25hbWVzMi5kZWZhdWx0KSh0aGlzLnByb3BzLmNoaWxkcmVuLnByb3BzLmNsYXNzTmFtZXx8IiIsZGVmYXVsdENsYXNzTmFtZSwoX2NsYXNzTmFtZXM9e30sX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzLGRlZmF1bHRDbGFzc05hbWVEcmFnZ2luZyx0aGlzLnN0YXRlLmRyYWdnaW5nKSxfZGVmaW5lUHJvcGVydHkoX2NsYXNzTmFtZXMsZGVmYXVsdENsYXNzTmFtZURyYWdnZWQsdGhpcy5zdGF0ZS5kcmFnZ2VkKSxfY2xhc3NOYW1lcykpO3JldHVybiBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChfRHJhZ2dhYmxlQ29yZTIuZGVmYXVsdCxfZXh0ZW5kcyQkMSh7fSx0aGlzLnByb3BzLHtvblN0YXJ0OnRoaXMub25EcmFnU3RhcnQsb25EcmFnOnRoaXMub25EcmFnLG9uU3RvcDp0aGlzLm9uRHJhZ1N0b3B9KSxfcmVhY3QyLmRlZmF1bHQuY2xvbmVFbGVtZW50KF9yZWFjdDIuZGVmYXVsdC5DaGlsZHJlbi5vbmx5KHRoaXMucHJvcHMuY2hpbGRyZW4pLHtjbGFzc05hbWU6Y2xhc3NOYW1lLHN0eWxlOl9leHRlbmRzJCQxKHt9LHRoaXMucHJvcHMuY2hpbGRyZW4ucHJvcHMuc3R5bGUsc3R5bGUpLHRyYW5zZm9ybTpzdmdUcmFuc2Zvcm19KSl9fV0pO3JldHVybiBEcmFnZ2FibGV9KF9yZWFjdDIuZGVmYXVsdC5Db21wb25lbnQpO0RyYWdnYWJsZS5kaXNwbGF5TmFtZT0iRHJhZ2dhYmxlIjtEcmFnZ2FibGUucHJvcFR5cGVzPV9leHRlbmRzJCQxKHt9LF9EcmFnZ2FibGVDb3JlMi5kZWZhdWx0LnByb3BUeXBlcyx7YXhpczpfcHJvcFR5cGVzMi5kZWZhdWx0Lm9uZU9mKFsiYm90aCIsIngiLCJ5Iiwibm9uZSJdKSxib3VuZHM6X3Byb3BUeXBlczIuZGVmYXVsdC5vbmVPZlR5cGUoW19wcm9wVHlwZXMyLmRlZmF1bHQuc2hhcGUoe2xlZnQ6X3Byb3BUeXBlczIuZGVmYXVsdC5udW1iZXIscmlnaHQ6X3Byb3BUeXBlczIuZGVmYXVsdC5udW1iZXIsdG9wOl9wcm9wVHlwZXMyLmRlZmF1bHQubnVtYmVyLGJvdHRvbTpfcHJvcFR5cGVzMi5kZWZhdWx0Lm51bWJlcn0pLF9wcm9wVHlwZXMyLmRlZmF1bHQuc3RyaW5nLF9wcm9wVHlwZXMyLmRlZmF1bHQub25lT2YoW2ZhbHNlXSldKSxkZWZhdWx0Q2xhc3NOYW1lOl9wcm9wVHlwZXMyLmRlZmF1bHQuc3RyaW5nLGRlZmF1bHRDbGFzc05hbWVEcmFnZ2luZzpfcHJvcFR5cGVzMi5kZWZhdWx0LnN0cmluZyxkZWZhdWx0Q2xhc3NOYW1lRHJhZ2dlZDpfcHJvcFR5cGVzMi5kZWZhdWx0LnN0cmluZyxkZWZhdWx0UG9zaXRpb246X3Byb3BUeXBlczIuZGVmYXVsdC5zaGFwZSh7eDpfcHJvcFR5cGVzMi5kZWZhdWx0Lm51bWJlcix5Ol9wcm9wVHlwZXMyLmRlZmF1bHQubnVtYmVyfSkscG9zaXRpb246X3Byb3BUeXBlczIuZGVmYXVsdC5zaGFwZSh7eDpfcHJvcFR5cGVzMi5kZWZhdWx0Lm51bWJlcix5Ol9wcm9wVHlwZXMyLmRlZmF1bHQubnVtYmVyfSksY2xhc3NOYW1lOl9zaGltcy5kb250U2V0TWUsc3R5bGU6X3NoaW1zLmRvbnRTZXRNZSx0cmFuc2Zvcm06X3NoaW1zLmRvbnRTZXRNZX0pO0RyYWdnYWJsZS5kZWZhdWx0UHJvcHM9X2V4dGVuZHMkJDEoe30sX0RyYWdnYWJsZUNvcmUyLmRlZmF1bHQuZGVmYXVsdFByb3BzLHtheGlzOiJib3RoIixib3VuZHM6ZmFsc2UsZGVmYXVsdENsYXNzTmFtZToicmVhY3QtZHJhZ2dhYmxlIixkZWZhdWx0Q2xhc3NOYW1lRHJhZ2dpbmc6InJlYWN0LWRyYWdnYWJsZS1kcmFnZ2luZyIsZGVmYXVsdENsYXNzTmFtZURyYWdnZWQ6InJlYWN0LWRyYWdnYWJsZS1kcmFnZ2VkIixkZWZhdWx0UG9zaXRpb246e3g6MCx5OjB9LHBvc2l0aW9uOm51bGx9KTtleHBvcnRzLmRlZmF1bHQ9RHJhZ2dhYmxlfSxmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgZW1wdHlGdW5jdGlvbj1fX3dlYnBhY2tfcmVxdWlyZV9fKDEpO3ZhciBpbnZhcmlhbnQ9X193ZWJwYWNrX3JlcXVpcmVfXygyKTt2YXIgd2FybmluZz1fX3dlYnBhY2tfcmVxdWlyZV9fKDgpO3ZhciBSZWFjdFByb3BUeXBlc1NlY3JldD1fX3dlYnBhY2tfcmVxdWlyZV9fKDMpO3ZhciBjaGVja1Byb3BUeXBlcz1fX3dlYnBhY2tfcmVxdWlyZV9fKDE1KTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihpc1ZhbGlkRWxlbWVudCx0aHJvd09uRGlyZWN0QWNjZXNzKXt2YXIgSVRFUkFUT1JfU1lNQk9MPXR5cGVvZiBTeW1ib2w9PT0iZnVuY3Rpb24iJiZTeW1ib2wuaXRlcmF0b3I7dmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MPSJAQGl0ZXJhdG9yIjtmdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpe3ZhciBpdGVyYXRvckZuPW1heWJlSXRlcmFibGUmJihJVEVSQVRPUl9TWU1CT0wmJm1heWJlSXRlcmFibGVbSVRFUkFUT1JfU1lNQk9MXXx8bWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF0pO2lmKHR5cGVvZiBpdGVyYXRvckZuPT09ImZ1bmN0aW9uIil7cmV0dXJuIGl0ZXJhdG9yRm59fXZhciBBTk9OWU1PVVM9Ijw8YW5vbnltb3VzPj4iO3ZhciBSZWFjdFByb3BUeXBlcz17YXJyYXk6Y3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoImFycmF5IiksYm9vbDpjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcigiYm9vbGVhbiIpLGZ1bmM6Y3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoImZ1bmN0aW9uIiksbnVtYmVyOmNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCJudW1iZXIiKSxvYmplY3Q6Y3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoIm9iamVjdCIpLHN0cmluZzpjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcigic3RyaW5nIiksc3ltYm9sOmNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCJzeW1ib2wiKSxhbnk6Y3JlYXRlQW55VHlwZUNoZWNrZXIoKSxhcnJheU9mOmNyZWF0ZUFycmF5T2ZUeXBlQ2hlY2tlcixlbGVtZW50OmNyZWF0ZUVsZW1lbnRUeXBlQ2hlY2tlcigpLGluc3RhbmNlT2Y6Y3JlYXRlSW5zdGFuY2VUeXBlQ2hlY2tlcixub2RlOmNyZWF0ZU5vZGVDaGVja2VyKCksb2JqZWN0T2Y6Y3JlYXRlT2JqZWN0T2ZUeXBlQ2hlY2tlcixvbmVPZjpjcmVhdGVFbnVtVHlwZUNoZWNrZXIsb25lT2ZUeXBlOmNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIsc2hhcGU6Y3JlYXRlU2hhcGVUeXBlQ2hlY2tlcn07ZnVuY3Rpb24gaXMoeCx5KXtpZih4PT09eSl7cmV0dXJuIHghPT0wfHwxL3g9PT0xL3l9ZWxzZXtyZXR1cm4geCE9PXgmJnkhPT15fX1mdW5jdGlvbiBQcm9wVHlwZUVycm9yKG1lc3NhZ2Upe3RoaXMubWVzc2FnZT1tZXNzYWdlO3RoaXMuc3RhY2s9IiJ9UHJvcFR5cGVFcnJvci5wcm90b3R5cGU9RXJyb3IucHJvdG90eXBlO2Z1bmN0aW9uIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKXtpZihPYmplY3Qoe0RSQUdHQUJMRV9ERUJVRzp1bmRlZmluZWR9KS5OT0RFX0VOViE9PSJwcm9kdWN0aW9uIil7dmFyIG1hbnVhbFByb3BUeXBlQ2FsbENhY2hlPXt9O3ZhciBtYW51YWxQcm9wVHlwZVdhcm5pbmdDb3VudD0wfWZ1bmN0aW9uIGNoZWNrVHlwZShpc1JlcXVpcmVkLHByb3BzLHByb3BOYW1lLGNvbXBvbmVudE5hbWUsbG9jYXRpb24scHJvcEZ1bGxOYW1lLHNlY3JldCl7Y29tcG9uZW50TmFtZT1jb21wb25lbnROYW1lfHxBTk9OWU1PVVM7cHJvcEZ1bGxOYW1lPXByb3BGdWxsTmFtZXx8cHJvcE5hbWU7aWYoc2VjcmV0IT09UmVhY3RQcm9wVHlwZXNTZWNyZXQpe2lmKHRocm93T25EaXJlY3RBY2Nlc3Mpe2ludmFyaWFudChmYWxzZSwiQ2FsbGluZyBQcm9wVHlwZXMgdmFsaWRhdG9ycyBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gIisiVXNlIGBQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoKWAgdG8gY2FsbCB0aGVtLiAiKyJSZWFkIG1vcmUgYXQgaHR0cDovL2ZiLm1lL3VzZS1jaGVjay1wcm9wLXR5cGVzIil9ZWxzZSBpZihPYmplY3Qoe0RSQUdHQUJMRV9ERUJVRzp1bmRlZmluZWR9KS5OT0RFX0VOViE9PSJwcm9kdWN0aW9uIiYmdHlwZW9mIGNvbnNvbGUhPT0idW5kZWZpbmVkIil7dmFyIGNhY2hlS2V5PWNvbXBvbmVudE5hbWUrIjoiK3Byb3BOYW1lO2lmKCFtYW51YWxQcm9wVHlwZUNhbGxDYWNoZVtjYWNoZUtleV0mJm1hbnVhbFByb3BUeXBlV2FybmluZ0NvdW50PDMpe3dhcm5pbmcoZmFsc2UsIllvdSBhcmUgbWFudWFsbHkgY2FsbGluZyBhIFJlYWN0LlByb3BUeXBlcyB2YWxpZGF0aW9uICIrImZ1bmN0aW9uIGZvciB0aGUgYCVzYCBwcm9wIG9uIGAlc2AuIFRoaXMgaXMgZGVwcmVjYXRlZCAiKyJhbmQgd2lsbCB0aHJvdyBpbiB0aGUgc3RhbmRhbG9uZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gIisiWW91IG1heSBiZSBzZWVpbmcgdGhpcyB3YXJuaW5nIGR1ZSB0byBhIHRoaXJkLXBhcnR5IFByb3BUeXBlcyAiKyJsaWJyYXJ5LiBTZWUgaHR0cHM6Ly9mYi5tZS9yZWFjdC13YXJuaW5nLWRvbnQtY2FsbC1wcm9wdHlwZXMgIisiZm9yIGRldGFpbHMuIixwcm9wRnVsbE5hbWUsY29tcG9uZW50TmFtZSk7bWFudWFsUHJvcFR5cGVDYWxsQ2FjaGVbY2FjaGVLZXldPXRydWU7bWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQrK319fWlmKHByb3BzW3Byb3BOYW1lXT09bnVsbCl7aWYoaXNSZXF1aXJlZCl7aWYocHJvcHNbcHJvcE5hbWVdPT09bnVsbCl7cmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCJUaGUgIitsb2NhdGlvbisiIGAiK3Byb3BGdWxsTmFtZSsiYCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQgIisoImluIGAiK2NvbXBvbmVudE5hbWUrImAsIGJ1dCBpdHMgdmFsdWUgaXMgYG51bGxgLiIpKX1yZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoIlRoZSAiK2xvY2F0aW9uKyIgYCIrcHJvcEZ1bGxOYW1lKyJgIGlzIG1hcmtlZCBhcyByZXF1aXJlZCBpbiAiKygiYCIrY29tcG9uZW50TmFtZSsiYCwgYnV0IGl0cyB2YWx1ZSBpcyBgdW5kZWZpbmVkYC4iKSl9cmV0dXJuIG51bGx9ZWxzZXtyZXR1cm4gdmFsaWRhdGUocHJvcHMscHJvcE5hbWUsY29tcG9uZW50TmFtZSxsb2NhdGlvbixwcm9wRnVsbE5hbWUpfX12YXIgY2hhaW5lZENoZWNrVHlwZT1jaGVja1R5cGUuYmluZChudWxsLGZhbHNlKTtjaGFpbmVkQ2hlY2tUeXBlLmlzUmVxdWlyZWQ9Y2hlY2tUeXBlLmJpbmQobnVsbCx0cnVlKTtyZXR1cm4gY2hhaW5lZENoZWNrVHlwZX1mdW5jdGlvbiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcihleHBlY3RlZFR5cGUpe2Z1bmN0aW9uIHZhbGlkYXRlKHByb3BzLHByb3BOYW1lLGNvbXBvbmVudE5hbWUsbG9jYXRpb24scHJvcEZ1bGxOYW1lLHNlY3JldCl7dmFyIHByb3BWYWx1ZT1wcm9wc1twcm9wTmFtZV07dmFyIHByb3BUeXBlPWdldFByb3BUeXBlKHByb3BWYWx1ZSk7aWYocHJvcFR5cGUhPT1leHBlY3RlZFR5cGUpe3ZhciBwcmVjaXNlVHlwZT1nZXRQcmVjaXNlVHlwZShwcm9wVmFsdWUpO3JldHVybiBuZXcgUHJvcFR5cGVFcnJvcigiSW52YWxpZCAiK2xvY2F0aW9uKyIgYCIrcHJvcEZ1bGxOYW1lKyJgIG9mIHR5cGUgIisoImAiK3ByZWNpc2VUeXBlKyJgIHN1cHBsaWVkIHRvIGAiK2NvbXBvbmVudE5hbWUrImAsIGV4cGVjdGVkICIpKygiYCIrZXhwZWN0ZWRUeXBlKyJgLiIpKX1yZXR1cm4gbnVsbH1yZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpfWZ1bmN0aW9uIGNyZWF0ZUFueVR5cGVDaGVja2VyKCl7cmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNOdWxsKX1mdW5jdGlvbiBjcmVhdGVBcnJheU9mVHlwZUNoZWNrZXIodHlwZUNoZWNrZXIpe2Z1bmN0aW9uIHZhbGlkYXRlKHByb3BzLHByb3BOYW1lLGNvbXBvbmVudE5hbWUsbG9jYXRpb24scHJvcEZ1bGxOYW1lKXtpZih0eXBlb2YgdHlwZUNoZWNrZXIhPT0iZnVuY3Rpb24iKXtyZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoIlByb3BlcnR5IGAiK3Byb3BGdWxsTmFtZSsiYCBvZiBjb21wb25lbnQgYCIrY29tcG9uZW50TmFtZSsiYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgYXJyYXlPZi4iKX12YXIgcHJvcFZhbHVlPXByb3BzW3Byb3BOYW1lXTtpZighQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKXt2YXIgcHJvcFR5cGU9Z2V0UHJvcFR5cGUocHJvcFZhbHVlKTtyZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoIkludmFsaWQgIitsb2NhdGlvbisiIGAiK3Byb3BGdWxsTmFtZSsiYCBvZiB0eXBlICIrKCJgIitwcm9wVHlwZSsiYCBzdXBwbGllZCB0byBgIitjb21wb25lbnROYW1lKyJgLCBleHBlY3RlZCBhbiBhcnJheS4iKSl9Zm9yKHZhciBpPTA7aTxwcm9wVmFsdWUubGVuZ3RoO2krKyl7dmFyIGVycm9yPXR5cGVDaGVja2VyKHByb3BWYWx1ZSxpLGNvbXBvbmVudE5hbWUsbG9jYXRpb24scHJvcEZ1bGxOYW1lKyJbIitpKyJdIixSZWFjdFByb3BUeXBlc1NlY3JldCk7aWYoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcil7cmV0dXJuIGVycm9yfX1yZXR1cm4gbnVsbH1yZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpfWZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRUeXBlQ2hlY2tlcigpe2Z1bmN0aW9uIHZhbGlkYXRlKHByb3BzLHByb3BOYW1lLGNvbXBvbmVudE5hbWUsbG9jYXRpb24scHJvcEZ1bGxOYW1lKXt2YXIgcHJvcFZhbHVlPXByb3BzW3Byb3BOYW1lXTtpZighaXNWYWxpZEVsZW1lbnQocHJvcFZhbHVlKSl7dmFyIHByb3BUeXBlPWdldFByb3BUeXBlKHByb3BWYWx1ZSk7cmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCJJbnZhbGlkICIrbG9jYXRpb24rIiBgIitwcm9wRnVsbE5hbWUrImAgb2YgdHlwZSAiKygiYCIrcHJvcFR5cGUrImAgc3VwcGxpZWQgdG8gYCIrY29tcG9uZW50TmFtZSsiYCwgZXhwZWN0ZWQgYSBzaW5nbGUgUmVhY3RFbGVtZW50LiIpKX1yZXR1cm4gbnVsbH1yZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpfWZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlVHlwZUNoZWNrZXIoZXhwZWN0ZWRDbGFzcyl7ZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMscHJvcE5hbWUsY29tcG9uZW50TmFtZSxsb2NhdGlvbixwcm9wRnVsbE5hbWUpe2lmKCEocHJvcHNbcHJvcE5hbWVdaW5zdGFuY2VvZiBleHBlY3RlZENsYXNzKSl7dmFyIGV4cGVjdGVkQ2xhc3NOYW1lPWV4cGVjdGVkQ2xhc3MubmFtZXx8QU5PTllNT1VTO3ZhciBhY3R1YWxDbGFzc05hbWU9Z2V0Q2xhc3NOYW1lKHByb3BzW3Byb3BOYW1lXSk7cmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCJJbnZhbGlkICIrbG9jYXRpb24rIiBgIitwcm9wRnVsbE5hbWUrImAgb2YgdHlwZSAiKygiYCIrYWN0dWFsQ2xhc3NOYW1lKyJgIHN1cHBsaWVkIHRvIGAiK2NvbXBvbmVudE5hbWUrImAsIGV4cGVjdGVkICIpKygiaW5zdGFuY2Ugb2YgYCIrZXhwZWN0ZWRDbGFzc05hbWUrImAuIikpfXJldHVybiBudWxsfXJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSl9ZnVuY3Rpb24gY3JlYXRlRW51bVR5cGVDaGVja2VyKGV4cGVjdGVkVmFsdWVzKXtpZighQXJyYXkuaXNBcnJheShleHBlY3RlZFZhbHVlcykpe09iamVjdCh7RFJBR0dBQkxFX0RFQlVHOnVuZGVmaW5lZH0pLk5PREVfRU5WIT09InByb2R1Y3Rpb24iP3dhcm5pbmcoZmFsc2UsIkludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2YsIGV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGFycmF5LiIpOnZvaWQgMDtyZXR1cm4gZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc051bGx9ZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMscHJvcE5hbWUsY29tcG9uZW50TmFtZSxsb2NhdGlvbixwcm9wRnVsbE5hbWUpe3ZhciBwcm9wVmFsdWU9cHJvcHNbcHJvcE5hbWVdO2Zvcih2YXIgaT0wO2k8ZXhwZWN0ZWRWYWx1ZXMubGVuZ3RoO2krKyl7aWYoaXMocHJvcFZhbHVlLGV4cGVjdGVkVmFsdWVzW2ldKSl7cmV0dXJuIG51bGx9fXZhciB2YWx1ZXNTdHJpbmc9SlNPTi5zdHJpbmdpZnkoZXhwZWN0ZWRWYWx1ZXMpO3JldHVybiBuZXcgUHJvcFR5cGVFcnJvcigiSW52YWxpZCAiK2xvY2F0aW9uKyIgYCIrcHJvcEZ1bGxOYW1lKyJgIG9mIHZhbHVlIGAiK3Byb3BWYWx1ZSsiYCAiKygic3VwcGxpZWQgdG8gYCIrY29tcG9uZW50TmFtZSsiYCwgZXhwZWN0ZWQgb25lIG9mICIrdmFsdWVzU3RyaW5nKyIuIikpfXJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSl9ZnVuY3Rpb24gY3JlYXRlT2JqZWN0T2ZUeXBlQ2hlY2tlcih0eXBlQ2hlY2tlcil7ZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMscHJvcE5hbWUsY29tcG9uZW50TmFtZSxsb2NhdGlvbixwcm9wRnVsbE5hbWUpe2lmKHR5cGVvZiB0eXBlQ2hlY2tlciE9PSJmdW5jdGlvbiIpe3JldHVybiBuZXcgUHJvcFR5cGVFcnJvcigiUHJvcGVydHkgYCIrcHJvcEZ1bGxOYW1lKyJgIG9mIGNvbXBvbmVudCBgIitjb21wb25lbnROYW1lKyJgIGhhcyBpbnZhbGlkIFByb3BUeXBlIG5vdGF0aW9uIGluc2lkZSBvYmplY3RPZi4iKX12YXIgcHJvcFZhbHVlPXByb3BzW3Byb3BOYW1lXTt2YXIgcHJvcFR5cGU9Z2V0UHJvcFR5cGUocHJvcFZhbHVlKTtpZihwcm9wVHlwZSE9PSJvYmplY3QiKXtyZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoIkludmFsaWQgIitsb2NhdGlvbisiIGAiK3Byb3BGdWxsTmFtZSsiYCBvZiB0eXBlICIrKCJgIitwcm9wVHlwZSsiYCBzdXBwbGllZCB0byBgIitjb21wb25lbnROYW1lKyJgLCBleHBlY3RlZCBhbiBvYmplY3QuIikpfWZvcih2YXIga2V5IGluIHByb3BWYWx1ZSl7aWYocHJvcFZhbHVlLmhhc093blByb3BlcnR5KGtleSkpe3ZhciBlcnJvcj10eXBlQ2hlY2tlcihwcm9wVmFsdWUsa2V5LGNvbXBvbmVudE5hbWUsbG9jYXRpb24scHJvcEZ1bGxOYW1lKyIuIitrZXksUmVhY3RQcm9wVHlwZXNTZWNyZXQpO2lmKGVycm9yIGluc3RhbmNlb2YgRXJyb3Ipe3JldHVybiBlcnJvcn19fXJldHVybiBudWxsfXJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSl9ZnVuY3Rpb24gY3JlYXRlVW5pb25UeXBlQ2hlY2tlcihhcnJheU9mVHlwZUNoZWNrZXJzKXtpZighQXJyYXkuaXNBcnJheShhcnJheU9mVHlwZUNoZWNrZXJzKSl7T2JqZWN0KHtEUkFHR0FCTEVfREVCVUc6dW5kZWZpbmVkfSkuTk9ERV9FTlYhPT0icHJvZHVjdGlvbiI/d2FybmluZyhmYWxzZSwiSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZlR5cGUsIGV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGFycmF5LiIpOnZvaWQgMDtyZXR1cm4gZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc051bGx9Zm9yKHZhciBpPTA7aTxhcnJheU9mVHlwZUNoZWNrZXJzLmxlbmd0aDtpKyspe3ZhciBjaGVja2VyPWFycmF5T2ZUeXBlQ2hlY2tlcnNbaV07aWYodHlwZW9mIGNoZWNrZXIhPT0iZnVuY3Rpb24iKXt3YXJuaW5nKGZhbHNlLCJJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWQgdG8gb25lT2ZUeXBlLiBFeHBlY3RlZCBhbiBhcnJheSBvZiBjaGVjayBmdW5jdGlvbnMsIGJ1dCAiKyJyZWNlaXZlZCAlcyBhdCBpbmRleCAlcy4iLGdldFBvc3RmaXhGb3JUeXBlV2FybmluZyhjaGVja2VyKSxpKTtyZXR1cm4gZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc051bGx9fWZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLHByb3BOYW1lLGNvbXBvbmVudE5hbWUsbG9jYXRpb24scHJvcEZ1bGxOYW1lKXtmb3IodmFyIGk9MDtpPGFycmF5T2ZUeXBlQ2hlY2tlcnMubGVuZ3RoO2krKyl7dmFyIGNoZWNrZXI9YXJyYXlPZlR5cGVDaGVja2Vyc1tpXTtpZihjaGVja2VyKHByb3BzLHByb3BOYW1lLGNvbXBvbmVudE5hbWUsbG9jYXRpb24scHJvcEZ1bGxOYW1lLFJlYWN0UHJvcFR5cGVzU2VjcmV0KT09bnVsbCl7cmV0dXJuIG51bGx9fXJldHVybiBuZXcgUHJvcFR5cGVFcnJvcigiSW52YWxpZCAiK2xvY2F0aW9uKyIgYCIrcHJvcEZ1bGxOYW1lKyJgIHN1cHBsaWVkIHRvICIrKCJgIitjb21wb25lbnROYW1lKyJgLiIpKX1yZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpfWZ1bmN0aW9uIGNyZWF0ZU5vZGVDaGVja2VyKCl7ZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMscHJvcE5hbWUsY29tcG9uZW50TmFtZSxsb2NhdGlvbixwcm9wRnVsbE5hbWUpe2lmKCFpc05vZGUocHJvcHNbcHJvcE5hbWVdKSl7cmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCJJbnZhbGlkICIrbG9jYXRpb24rIiBgIitwcm9wRnVsbE5hbWUrImAgc3VwcGxpZWQgdG8gIisoImAiK2NvbXBvbmVudE5hbWUrImAsIGV4cGVjdGVkIGEgUmVhY3ROb2RlLiIpKX1yZXR1cm4gbnVsbH1yZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpfWZ1bmN0aW9uIGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXIoc2hhcGVUeXBlcyl7ZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMscHJvcE5hbWUsY29tcG9uZW50TmFtZSxsb2NhdGlvbixwcm9wRnVsbE5hbWUpe3ZhciBwcm9wVmFsdWU9cHJvcHNbcHJvcE5hbWVdO3ZhciBwcm9wVHlwZT1nZXRQcm9wVHlwZShwcm9wVmFsdWUpO2lmKHByb3BUeXBlIT09Im9iamVjdCIpe3JldHVybiBuZXcgUHJvcFR5cGVFcnJvcigiSW52YWxpZCAiK2xvY2F0aW9uKyIgYCIrcHJvcEZ1bGxOYW1lKyJgIG9mIHR5cGUgYCIrcHJvcFR5cGUrImAgIisoInN1cHBsaWVkIHRvIGAiK2NvbXBvbmVudE5hbWUrImAsIGV4cGVjdGVkIGBvYmplY3RgLiIpKX1mb3IodmFyIGtleSBpbiBzaGFwZVR5cGVzKXt2YXIgY2hlY2tlcj1zaGFwZVR5cGVzW2tleV07aWYoIWNoZWNrZXIpe2NvbnRpbnVlfXZhciBlcnJvcj1jaGVja2VyKHByb3BWYWx1ZSxrZXksY29tcG9uZW50TmFtZSxsb2NhdGlvbixwcm9wRnVsbE5hbWUrIi4iK2tleSxSZWFjdFByb3BUeXBlc1NlY3JldCk7aWYoZXJyb3Ipe3JldHVybiBlcnJvcn19cmV0dXJuIG51bGx9cmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKX1mdW5jdGlvbiBpc05vZGUocHJvcFZhbHVlKXtzd2l0Y2godHlwZW9mIHByb3BWYWx1ZT09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2YocHJvcFZhbHVlKSl7Y2FzZSJudW1iZXIiOmNhc2Uic3RyaW5nIjpjYXNlInVuZGVmaW5lZCI6cmV0dXJuIHRydWU7Y2FzZSJib29sZWFuIjpyZXR1cm4hcHJvcFZhbHVlO2Nhc2Uib2JqZWN0IjppZihBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpe3JldHVybiBwcm9wVmFsdWUuZXZlcnkoaXNOb2RlKX1pZihwcm9wVmFsdWU9PT1udWxsfHxpc1ZhbGlkRWxlbWVudChwcm9wVmFsdWUpKXtyZXR1cm4gdHJ1ZX12YXIgaXRlcmF0b3JGbj1nZXRJdGVyYXRvckZuKHByb3BWYWx1ZSk7aWYoaXRlcmF0b3JGbil7dmFyIGl0ZXJhdG9yPWl0ZXJhdG9yRm4uY2FsbChwcm9wVmFsdWUpO3ZhciBzdGVwO2lmKGl0ZXJhdG9yRm4hPT1wcm9wVmFsdWUuZW50cmllcyl7d2hpbGUoIShzdGVwPWl0ZXJhdG9yLm5leHQoKSkuZG9uZSl7aWYoIWlzTm9kZShzdGVwLnZhbHVlKSl7cmV0dXJuIGZhbHNlfX19ZWxzZXt3aGlsZSghKHN0ZXA9aXRlcmF0b3IubmV4dCgpKS5kb25lKXt2YXIgZW50cnk9c3RlcC52YWx1ZTtpZihlbnRyeSl7aWYoIWlzTm9kZShlbnRyeVsxXSkpe3JldHVybiBmYWxzZX19fX19ZWxzZXtyZXR1cm4gZmFsc2V9cmV0dXJuIHRydWU7ZGVmYXVsdDpyZXR1cm4gZmFsc2V9fWZ1bmN0aW9uIGlzU3ltYm9sKHByb3BUeXBlLHByb3BWYWx1ZSl7aWYocHJvcFR5cGU9PT0ic3ltYm9sIil7cmV0dXJuIHRydWV9aWYocHJvcFZhbHVlWyJAQHRvU3RyaW5nVGFnIl09PT0iU3ltYm9sIil7cmV0dXJuIHRydWV9aWYodHlwZW9mIFN5bWJvbD09PSJmdW5jdGlvbiImJnByb3BWYWx1ZSBpbnN0YW5jZW9mIFN5bWJvbCl7cmV0dXJuIHRydWV9cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIGdldFByb3BUeXBlKHByb3BWYWx1ZSl7dmFyIHByb3BUeXBlPXR5cGVvZiBwcm9wVmFsdWU9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKHByb3BWYWx1ZSk7aWYoQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKXtyZXR1cm4iYXJyYXkifWlmKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCl7cmV0dXJuIm9iamVjdCJ9aWYoaXNTeW1ib2wocHJvcFR5cGUscHJvcFZhbHVlKSl7cmV0dXJuInN5bWJvbCJ9cmV0dXJuIHByb3BUeXBlfWZ1bmN0aW9uIGdldFByZWNpc2VUeXBlKHByb3BWYWx1ZSl7aWYodHlwZW9mIHByb3BWYWx1ZT09PSJ1bmRlZmluZWQifHxwcm9wVmFsdWU9PT1udWxsKXtyZXR1cm4iIitwcm9wVmFsdWV9dmFyIHByb3BUeXBlPWdldFByb3BUeXBlKHByb3BWYWx1ZSk7aWYocHJvcFR5cGU9PT0ib2JqZWN0Iil7aWYocHJvcFZhbHVlIGluc3RhbmNlb2YgRGF0ZSl7cmV0dXJuImRhdGUifWVsc2UgaWYocHJvcFZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKXtyZXR1cm4icmVnZXhwIn19cmV0dXJuIHByb3BUeXBlfWZ1bmN0aW9uIGdldFBvc3RmaXhGb3JUeXBlV2FybmluZyh2YWx1ZSl7dmFyIHR5cGU9Z2V0UHJlY2lzZVR5cGUodmFsdWUpO3N3aXRjaCh0eXBlKXtjYXNlImFycmF5IjpjYXNlIm9iamVjdCI6cmV0dXJuImFuICIrdHlwZTtjYXNlImJvb2xlYW4iOmNhc2UiZGF0ZSI6Y2FzZSJyZWdleHAiOnJldHVybiJhICIrdHlwZTtkZWZhdWx0OnJldHVybiB0eXBlfX1mdW5jdGlvbiBnZXRDbGFzc05hbWUocHJvcFZhbHVlKXtpZighcHJvcFZhbHVlLmNvbnN0cnVjdG9yfHwhcHJvcFZhbHVlLmNvbnN0cnVjdG9yLm5hbWUpe3JldHVybiBBTk9OWU1PVVN9cmV0dXJuIHByb3BWYWx1ZS5jb25zdHJ1Y3Rvci5uYW1lfVJlYWN0UHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzPWNoZWNrUHJvcFR5cGVzO1JlYWN0UHJvcFR5cGVzLlByb3BUeXBlcz1SZWFjdFByb3BUeXBlcztyZXR1cm4gUmVhY3RQcm9wVHlwZXN9fSxmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXtpZihPYmplY3Qoe0RSQUdHQUJMRV9ERUJVRzp1bmRlZmluZWR9KS5OT0RFX0VOViE9PSJwcm9kdWN0aW9uIil7dmFyIGludmFyaWFudD1fX3dlYnBhY2tfcmVxdWlyZV9fKDIpO3ZhciB3YXJuaW5nPV9fd2VicGFja19yZXF1aXJlX18oOCk7dmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0PV9fd2VicGFja19yZXF1aXJlX18oMyk7dmFyIGxvZ2dlZFR5cGVGYWlsdXJlcz17fX1mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsdmFsdWVzLGxvY2F0aW9uLGNvbXBvbmVudE5hbWUsZ2V0U3RhY2spe2lmKE9iamVjdCh7RFJBR0dBQkxFX0RFQlVHOnVuZGVmaW5lZH0pLk5PREVfRU5WIT09InByb2R1Y3Rpb24iKXtmb3IodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3Mpe2lmKHR5cGVTcGVjcy5oYXNPd25Qcm9wZXJ0eSh0eXBlU3BlY05hbWUpKXt2YXIgZXJyb3I7dHJ5e2ludmFyaWFudCh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV09PT0iZnVuY3Rpb24iLCIlczogJXMgdHlwZSBgJXNgIGlzIGludmFsaWQ7IGl0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tICIrIlJlYWN0LlByb3BUeXBlcy4iLGNvbXBvbmVudE5hbWV8fCJSZWFjdCBjbGFzcyIsbG9jYXRpb24sdHlwZVNwZWNOYW1lKTtlcnJvcj10eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsdHlwZVNwZWNOYW1lLGNvbXBvbmVudE5hbWUsbG9jYXRpb24sbnVsbCxSZWFjdFByb3BUeXBlc1NlY3JldCl9Y2F0Y2goZXgpe2Vycm9yPWV4fXdhcm5pbmcoIWVycm9yfHxlcnJvciBpbnN0YW5jZW9mIEVycm9yLCIlczogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICVzIGAlc2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAiKyJmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAlcy4gIisiWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgIisiY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAiKyJzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuIixjb21wb25lbnROYW1lfHwiUmVhY3QgY2xhc3MiLGxvY2F0aW9uLHR5cGVTcGVjTmFtZSx0eXBlb2YgZXJyb3I9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKGVycm9yKSk7aWYoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciYmIShlcnJvci5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpe2xvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvci5tZXNzYWdlXT10cnVlO3ZhciBzdGFjaz1nZXRTdGFjaz9nZXRTdGFjaygpOiIiO3dhcm5pbmcoZmFsc2UsIkZhaWxlZCAlcyB0eXBlOiAlcyVzIixsb2NhdGlvbixlcnJvci5tZXNzYWdlLHN0YWNrIT1udWxsP3N0YWNrOiIiKX19fX19bW9kdWxlLmV4cG9ydHM9Y2hlY2tQcm9wVHlwZXN9LGZ1bmN0aW9uKG1vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pe3ZhciBlbXB0eUZ1bmN0aW9uPV9fd2VicGFja19yZXF1aXJlX18oMSk7dmFyIGludmFyaWFudD1fX3dlYnBhY2tfcmVxdWlyZV9fKDIpO3ZhciBSZWFjdFByb3BUeXBlc1NlY3JldD1fX3dlYnBhY2tfcmVxdWlyZV9fKDMpO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gc2hpbShwcm9wcyxwcm9wTmFtZSxjb21wb25lbnROYW1lLGxvY2F0aW9uLHByb3BGdWxsTmFtZSxzZWNyZXQpe2lmKHNlY3JldD09PVJlYWN0UHJvcFR5cGVzU2VjcmV0KXtyZXR1cm59aW52YXJpYW50KGZhbHNlLCJDYWxsaW5nIFByb3BUeXBlcyB2YWxpZGF0b3JzIGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiAiKyJVc2UgUHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzKCkgdG8gY2FsbCB0aGVtLiAiKyJSZWFkIG1vcmUgYXQgaHR0cDovL2ZiLm1lL3VzZS1jaGVjay1wcm9wLXR5cGVzIil9c2hpbS5pc1JlcXVpcmVkPXNoaW07ZnVuY3Rpb24gZ2V0U2hpbSgpe3JldHVybiBzaGltfXZhciBSZWFjdFByb3BUeXBlcz17YXJyYXk6c2hpbSxib29sOnNoaW0sZnVuYzpzaGltLG51bWJlcjpzaGltLG9iamVjdDpzaGltLHN0cmluZzpzaGltLHN5bWJvbDpzaGltLGFueTpzaGltLGFycmF5T2Y6Z2V0U2hpbSxlbGVtZW50OnNoaW0saW5zdGFuY2VPZjpnZXRTaGltLG5vZGU6c2hpbSxvYmplY3RPZjpnZXRTaGltLG9uZU9mOmdldFNoaW0sb25lT2ZUeXBlOmdldFNoaW0sc2hhcGU6Z2V0U2hpbX07UmVhY3RQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXM9ZW1wdHlGdW5jdGlvbjtSZWFjdFByb3BUeXBlcy5Qcm9wVHlwZXM9UmVhY3RQcm9wVHlwZXM7cmV0dXJuIFJlYWN0UHJvcFR5cGVzfX0sZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7dmFyIF9fV0VCUEFDS19BTURfREVGSU5FX0FSUkFZX18sX19XRUJQQUNLX0FNRF9ERUZJTkVfUkVTVUxUX187KGZ1bmN0aW9uKCl7dmFyIGhhc093bj17fS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBjbGFzc05hbWVzKCl7dmFyIGNsYXNzZXM9W107Zm9yKHZhciBpPTA7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIGFyZz1hcmd1bWVudHNbaV07aWYoIWFyZyljb250aW51ZTt2YXIgYXJnVHlwZT10eXBlb2YgYXJnPT09InVuZGVmaW5lZCI/InVuZGVmaW5lZCI6X3R5cGVvZihhcmcpO2lmKGFyZ1R5cGU9PT0ic3RyaW5nInx8YXJnVHlwZT09PSJudW1iZXIiKXtjbGFzc2VzLnB1c2goYXJnKX1lbHNlIGlmKEFycmF5LmlzQXJyYXkoYXJnKSl7Y2xhc3Nlcy5wdXNoKGNsYXNzTmFtZXMuYXBwbHkobnVsbCxhcmcpKX1lbHNlIGlmKGFyZ1R5cGU9PT0ib2JqZWN0Iil7Zm9yKHZhciBrZXkgaW4gYXJnKXtpZihoYXNPd24uY2FsbChhcmcsa2V5KSYmYXJnW2tleV0pe2NsYXNzZXMucHVzaChrZXkpfX19fXJldHVybiBjbGFzc2VzLmpvaW4oIiAiKX1pZih0eXBlb2YgbW9kdWxlIT09InVuZGVmaW5lZCImJm1vZHVsZS5leHBvcnRzKXttb2R1bGUuZXhwb3J0cz1jbGFzc05hbWVzfWVsc2V7IShfX1dFQlBBQ0tfQU1EX0RFRklORV9BUlJBWV9fPVtdLF9fV0VCUEFDS19BTURfREVGSU5FX1JFU1VMVF9fPWZ1bmN0aW9uKCl7cmV0dXJuIGNsYXNzTmFtZXN9LmFwcGx5KGV4cG9ydHMsX19XRUJQQUNLX0FNRF9ERUZJTkVfQVJSQVlfXyksX19XRUJQQUNLX0FNRF9ERUZJTkVfUkVTVUxUX18hPT11bmRlZmluZWQmJihtb2R1bGUuZXhwb3J0cz1fX1dFQlBBQ0tfQU1EX0RFRklORV9SRVNVTFRfXykpfX0pKCl9LGZ1bmN0aW9uKG1vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pe09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCJfX2VzTW9kdWxlIix7dmFsdWU6dHJ1ZX0pO2V4cG9ydHMuZ2V0UHJlZml4PWdldFByZWZpeDtleHBvcnRzLmJyb3dzZXJQcmVmaXhUb0tleT1icm93c2VyUHJlZml4VG9LZXk7ZXhwb3J0cy5icm93c2VyUHJlZml4VG9TdHlsZT1icm93c2VyUHJlZml4VG9TdHlsZTt2YXIgcHJlZml4ZXM9WyJNb3oiLCJXZWJraXQiLCJPIiwibXMiXTtmdW5jdGlvbiBnZXRQcmVmaXgoKXt2YXIgcHJvcD1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMF06InRyYW5zZm9ybSI7aWYodHlwZW9mIHdpbmRvdz09PSJ1bmRlZmluZWQifHx0eXBlb2Ygd2luZG93LmRvY3VtZW50PT09InVuZGVmaW5lZCIpcmV0dXJuIiI7dmFyIHN0eWxlPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGU7aWYocHJvcCBpbiBzdHlsZSlyZXR1cm4iIjtmb3IodmFyIGk9MDtpPHByZWZpeGVzLmxlbmd0aDtpKyspe2lmKGJyb3dzZXJQcmVmaXhUb0tleShwcm9wLHByZWZpeGVzW2ldKWluIHN0eWxlKXJldHVybiBwcmVmaXhlc1tpXX1yZXR1cm4iIn1mdW5jdGlvbiBicm93c2VyUHJlZml4VG9LZXkocHJvcCxwcmVmaXgpe3JldHVybiBwcmVmaXg/IiIrcHJlZml4K2tlYmFiVG9UaXRsZUNhc2UocHJvcCk6cHJvcH1mdW5jdGlvbiBicm93c2VyUHJlZml4VG9TdHlsZShwcm9wLHByZWZpeCl7cmV0dXJuIHByZWZpeD8iLSIrcHJlZml4LnRvTG93ZXJDYXNlKCkrIi0iK3Byb3A6cHJvcH1mdW5jdGlvbiBrZWJhYlRvVGl0bGVDYXNlKHN0cil7dmFyIG91dD0iIjt2YXIgc2hvdWxkQ2FwaXRhbGl6ZT10cnVlO2Zvcih2YXIgaT0wO2k8c3RyLmxlbmd0aDtpKyspe2lmKHNob3VsZENhcGl0YWxpemUpe291dCs9c3RyW2ldLnRvVXBwZXJDYXNlKCk7c2hvdWxkQ2FwaXRhbGl6ZT1mYWxzZX1lbHNlIGlmKHN0cltpXT09PSItIil7c2hvdWxkQ2FwaXRhbGl6ZT10cnVlfWVsc2V7b3V0Kz1zdHJbaV19fXJldHVybiBvdXR9ZXhwb3J0cy5kZWZhdWx0PWdldFByZWZpeCgpfSxmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7dmFyIHByb2Nlc3M9bW9kdWxlLmV4cG9ydHM9e307dmFyIGNhY2hlZFNldFRpbWVvdXQ7dmFyIGNhY2hlZENsZWFyVGltZW91dDtmdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCl7dGhyb3cgbmV3IEVycm9yKCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCgpe3Rocm93IG5ldyBFcnJvcigiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9KGZ1bmN0aW9uKCl7dHJ5e2lmKHR5cGVvZiBzZXRUaW1lb3V0PT09ImZ1bmN0aW9uIil7Y2FjaGVkU2V0VGltZW91dD1zZXRUaW1lb3V0fWVsc2V7Y2FjaGVkU2V0VGltZW91dD1kZWZhdWx0U2V0VGltb3V0fX1jYXRjaChlKXtjYWNoZWRTZXRUaW1lb3V0PWRlZmF1bHRTZXRUaW1vdXR9dHJ5e2lmKHR5cGVvZiBjbGVhclRpbWVvdXQ9PT0iZnVuY3Rpb24iKXtjYWNoZWRDbGVhclRpbWVvdXQ9Y2xlYXJUaW1lb3V0fWVsc2V7Y2FjaGVkQ2xlYXJUaW1lb3V0PWRlZmF1bHRDbGVhclRpbWVvdXR9fWNhdGNoKGUpe2NhY2hlZENsZWFyVGltZW91dD1kZWZhdWx0Q2xlYXJUaW1lb3V0fX0pKCk7ZnVuY3Rpb24gcnVuVGltZW91dChmdW4pe2lmKGNhY2hlZFNldFRpbWVvdXQ9PT1zZXRUaW1lb3V0KXtyZXR1cm4gc2V0VGltZW91dChmdW4sMCl9aWYoKGNhY2hlZFNldFRpbWVvdXQ9PT1kZWZhdWx0U2V0VGltb3V0fHwhY2FjaGVkU2V0VGltZW91dCkmJnNldFRpbWVvdXQpe2NhY2hlZFNldFRpbWVvdXQ9c2V0VGltZW91dDtyZXR1cm4gc2V0VGltZW91dChmdW4sMCl9dHJ5e3JldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwwKX1jYXRjaChlKXt0cnl7cmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLGZ1biwwKX1jYXRjaChlKXtyZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsZnVuLDApfX19ZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcil7aWYoY2FjaGVkQ2xlYXJUaW1lb3V0PT09Y2xlYXJUaW1lb3V0KXtyZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcil9aWYoKGNhY2hlZENsZWFyVGltZW91dD09PWRlZmF1bHRDbGVhclRpbWVvdXR8fCFjYWNoZWRDbGVhclRpbWVvdXQpJiZjbGVhclRpbWVvdXQpe2NhY2hlZENsZWFyVGltZW91dD1jbGVhclRpbWVvdXQ7cmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpfXRyeXtyZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcil9Y2F0Y2goZSl7dHJ5e3JldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLG1hcmtlcil9Y2F0Y2goZSl7cmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsbWFya2VyKX19fXZhciBxdWV1ZT1bXTt2YXIgZHJhaW5pbmc9ZmFsc2U7dmFyIGN1cnJlbnRRdWV1ZTt2YXIgcXVldWVJbmRleD0tMTtmdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKXtpZighZHJhaW5pbmd8fCFjdXJyZW50UXVldWUpe3JldHVybn1kcmFpbmluZz1mYWxzZTtpZihjdXJyZW50UXVldWUubGVuZ3RoKXtxdWV1ZT1jdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKX1lbHNle3F1ZXVlSW5kZXg9LTF9aWYocXVldWUubGVuZ3RoKXtkcmFpblF1ZXVlKCl9fWZ1bmN0aW9uIGRyYWluUXVldWUoKXtpZihkcmFpbmluZyl7cmV0dXJufXZhciB0aW1lb3V0PXJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtkcmFpbmluZz10cnVlO3ZhciBsZW49cXVldWUubGVuZ3RoO3doaWxlKGxlbil7Y3VycmVudFF1ZXVlPXF1ZXVlO3F1ZXVlPVtdO3doaWxlKCsrcXVldWVJbmRleDxsZW4pe2lmKGN1cnJlbnRRdWV1ZSl7Y3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpfX1xdWV1ZUluZGV4PS0xO2xlbj1xdWV1ZS5sZW5ndGh9Y3VycmVudFF1ZXVlPW51bGw7ZHJhaW5pbmc9ZmFsc2U7cnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpfXByb2Nlc3MubmV4dFRpY2s9ZnVuY3Rpb24oZnVuKXt2YXIgYXJncz1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe2FyZ3NbaS0xXT1hcmd1bWVudHNbaV19fXF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLGFyZ3MpKTtpZihxdWV1ZS5sZW5ndGg9PT0xJiYhZHJhaW5pbmcpe3J1blRpbWVvdXQoZHJhaW5RdWV1ZSl9fTtmdW5jdGlvbiBJdGVtKGZ1bixhcnJheSl7dGhpcy5mdW49ZnVuO3RoaXMuYXJyYXk9YXJyYXl9SXRlbS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX07cHJvY2Vzcy50aXRsZT0iYnJvd3NlciI7cHJvY2Vzcy5icm93c2VyPXRydWU7cHJvY2Vzcy5lbnY9e307cHJvY2Vzcy5hcmd2PVtdO3Byb2Nlc3MudmVyc2lvbj0iIjtwcm9jZXNzLnZlcnNpb25zPXt9O2Z1bmN0aW9uIG5vb3AoKXt9cHJvY2Vzcy5vbj1ub29wO3Byb2Nlc3MuYWRkTGlzdGVuZXI9bm9vcDtwcm9jZXNzLm9uY2U9bm9vcDtwcm9jZXNzLm9mZj1ub29wO3Byb2Nlc3MucmVtb3ZlTGlzdGVuZXI9bm9vcDtwcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycz1ub29wO3Byb2Nlc3MuZW1pdD1ub29wO3Byb2Nlc3MucHJlcGVuZExpc3RlbmVyPW5vb3A7cHJvY2Vzcy5wcmVwZW5kT25jZUxpc3RlbmVyPW5vb3A7cHJvY2Vzcy5saXN0ZW5lcnM9ZnVuY3Rpb24obmFtZSl7cmV0dXJuW119O3Byb2Nlc3MuYmluZGluZz1mdW5jdGlvbihuYW1lKXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkIil9O3Byb2Nlc3MuY3dkPWZ1bmN0aW9uKCl7cmV0dXJuIi8ifTtwcm9jZXNzLmNoZGlyPWZ1bmN0aW9uKGRpcil7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQiKX07cHJvY2Vzcy51bWFzaz1mdW5jdGlvbigpe3JldHVybiAwfX1dKX0pfSk7dW53cmFwRXhwb3J0cyhyZWFjdERyYWdnYWJsZSk7dmFyIEhhbmRsZV8xPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywiX19lc01vZHVsZSIse3ZhbHVlOnRydWV9KTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQscHJvcHMpe2Zvcih2YXIgaT0wO2k8cHJvcHMubGVuZ3RoO2krKyl7dmFyIGRlc2NyaXB0b3I9cHJvcHNbaV07ZGVzY3JpcHRvci5lbnVtZXJhYmxlPWRlc2NyaXB0b3IuZW51bWVyYWJsZXx8ZmFsc2U7ZGVzY3JpcHRvci5jb25maWd1cmFibGU9dHJ1ZTtpZigidmFsdWUiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKX19cmV0dXJuIGZ1bmN0aW9uKENvbnN0cnVjdG9yLHByb3RvUHJvcHMsc3RhdGljUHJvcHMpe2lmKHByb3RvUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUscHJvdG9Qcm9wcyk7aWYoc3RhdGljUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3RvcixzdGF0aWNQcm9wcyk7cmV0dXJuIENvbnN0cnVjdG9yfX0oKTt2YXIgX3JlYWN0Mj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KFJlYWN0KTt2YXIgX3Byb3BUeXBlczI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChwcm9wVHlwZXMpO2Z1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKXtyZXR1cm4gb2JqJiZvYmouX19lc01vZHVsZT9vYmo6e2RlZmF1bHQ6b2JqfX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpfXJldHVybiBjYWxsJiYoKHR5cGVvZiBjYWxsPT09InVuZGVmaW5lZCI/InVuZGVmaW5lZCI6X3R5cGVvZihjYWxsKSk9PT0ib2JqZWN0Inx8dHlwZW9mIGNhbGw9PT0iZnVuY3Rpb24iKT9jYWxsOnNlbGZ9ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLHN1cGVyQ2xhc3Mpe2lmKHR5cGVvZiBzdXBlckNsYXNzIT09ImZ1bmN0aW9uIiYmc3VwZXJDbGFzcyE9PW51bGwpe3Rocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIisodHlwZW9mIHN1cGVyQ2xhc3M9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKHN1cGVyQ2xhc3MpKSl9c3ViQ2xhc3MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyYmc3VwZXJDbGFzcy5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpzdWJDbGFzcyxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9fSk7aWYoc3VwZXJDbGFzcylPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLHN1cGVyQ2xhc3MpOnN1YkNsYXNzLl9fcHJvdG9fXz1zdXBlckNsYXNzfXZhciBIYW5kbGU9ZnVuY3Rpb24oX1JlYWN0JENvbXBvbmVudCl7X2luaGVyaXRzKEhhbmRsZSxfUmVhY3QkQ29tcG9uZW50KTtmdW5jdGlvbiBIYW5kbGUoKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxIYW5kbGUpO3JldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLChIYW5kbGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoSGFuZGxlKSkuYXBwbHkodGhpcyxhcmd1bWVudHMpKX1fY3JlYXRlQ2xhc3MoSGFuZGxlLFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3ZhciBfcHJvcHM9dGhpcy5wcm9wcyxfcHJvcHMkeD1fcHJvcHMueCx4PV9wcm9wcyR4PT09dW5kZWZpbmVkPzA6X3Byb3BzJHgsX3Byb3BzJHk9X3Byb3BzLnkseT1fcHJvcHMkeT09PXVuZGVmaW5lZD8wOl9wcm9wcyR5LF9wcm9wcyRyPV9wcm9wcy5yLHI9X3Byb3BzJHI9PT11bmRlZmluZWQ/MTA6X3Byb3BzJHIsaGFuZGxlU3RhcnQ9X3Byb3BzLmhhbmRsZVN0YXJ0LGhhbmRsZURyYWc9X3Byb3BzLmhhbmRsZURyYWcsaGFuZGxlU3RvcD1fcHJvcHMuaGFuZGxlU3RvcCxvZmZzZXRQYXJlbnQ9X3Byb3BzLm9mZnNldFBhcmVudDtyZXR1cm4gX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQocmVhY3REcmFnZ2FibGUuRHJhZ2dhYmxlQ29yZSx7aGFuZGxlOiIuaGFuZGxlIixkZWZhdWx0UG9zaXRpb246e3g6MCx5OjB9LHBvc2l0aW9uOm51bGwsb25TdGFydDpoYW5kbGVTdGFydCxvbkRyYWc6aGFuZGxlRHJhZyxvblN0b3A6aGFuZGxlU3RvcCxvZmZzZXRQYXJlbnQ6b2Zmc2V0UGFyZW50LGRlZmF1bHRDbGFzc05hbWVEcmFnZ2luZzoiZHJhZ2dpbmcifSxfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiY2lyY2xlIix7Y2xhc3NOYW1lOiJoYW5kbGUiLGN4OngsY3k6eSxyOnIsc3Ryb2tlRGFzaGFycmF5OiI1IixzdHJva2U6ImdyZXkiLGZpbGw6IndoaXRlIixmaWxsT3BhY2l0eTowfSkpfX1dKTtyZXR1cm4gSGFuZGxlfShfcmVhY3QyLmRlZmF1bHQuQ29tcG9uZW50KTtleHBvcnRzLmRlZmF1bHQ9SGFuZGxlO0hhbmRsZS5wcm9wVHlwZXM9e3g6X3Byb3BUeXBlczIuZGVmYXVsdC5udW1iZXIseTpfcHJvcFR5cGVzMi5kZWZhdWx0Lm51bWJlcixyOl9wcm9wVHlwZXMyLmRlZmF1bHQubnVtYmVyLGhhbmRsZVN0YXJ0Ol9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxoYW5kbGVTdG9wOl9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxoYW5kbGVEcmFnOl9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuY319KTt1bndyYXBFeHBvcnRzKEhhbmRsZV8xKTt2YXIgU3ViamVjdF8xPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywiX19lc01vZHVsZSIse3ZhbHVlOnRydWV9KTt2YXIgX2V4dGVuZHMkJDE9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odGFyZ2V0KXtmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXt2YXIgc291cmNlPWFyZ3VtZW50c1tpXTtmb3IodmFyIGtleSBpbiBzb3VyY2Upe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2Usa2V5KSl7dGFyZ2V0W2tleV09c291cmNlW2tleV19fX1yZXR1cm4gdGFyZ2V0fTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQscHJvcHMpe2Zvcih2YXIgaT0wO2k8cHJvcHMubGVuZ3RoO2krKyl7dmFyIGRlc2NyaXB0b3I9cHJvcHNbaV07ZGVzY3JpcHRvci5lbnVtZXJhYmxlPWRlc2NyaXB0b3IuZW51bWVyYWJsZXx8ZmFsc2U7ZGVzY3JpcHRvci5jb25maWd1cmFibGU9dHJ1ZTtpZigidmFsdWUiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKX19cmV0dXJuIGZ1bmN0aW9uKENvbnN0cnVjdG9yLHByb3RvUHJvcHMsc3RhdGljUHJvcHMpe2lmKHByb3RvUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUscHJvdG9Qcm9wcyk7aWYoc3RhdGljUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3RvcixzdGF0aWNQcm9wcyk7cmV0dXJuIENvbnN0cnVjdG9yfX0oKTt2YXIgX3JlYWN0Mj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KFJlYWN0KTt2YXIgX0hhbmRsZTI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChIYW5kbGVfMSk7ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmope3JldHVybiBvYmomJm9iai5fX2VzTW9kdWxlP29iajp7ZGVmYXVsdDpvYmp9fWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSxDb25zdHJ1Y3Rvcil7aWYoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsY2FsbCl7aWYoIXNlbGYpe3Rocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIil9cmV0dXJuIGNhbGwmJigodHlwZW9mIGNhbGw9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKGNhbGwpKT09PSJvYmplY3QifHx0eXBlb2YgY2FsbD09PSJmdW5jdGlvbiIpP2NhbGw6c2VsZn1mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT0iZnVuY3Rpb24iJiZzdXBlckNsYXNzIT09bnVsbCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiKyh0eXBlb2Ygc3VwZXJDbGFzcz09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2Yoc3VwZXJDbGFzcykpKX1zdWJDbGFzcy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzJiZzdXBlckNsYXNzLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnN1YkNsYXNzLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX19KTtpZihzdXBlckNsYXNzKU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3Msc3VwZXJDbGFzcyk6c3ViQ2xhc3MuX19wcm90b19fPXN1cGVyQ2xhc3N9dmFyIFN1YmplY3Q9ZnVuY3Rpb24oX1JlYWN0JENvbXBvbmVudCl7X2luaGVyaXRzKFN1YmplY3QsX1JlYWN0JENvbXBvbmVudCk7ZnVuY3Rpb24gU3ViamVjdCgpe19jbGFzc0NhbGxDaGVjayh0aGlzLFN1YmplY3QpO3JldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLChTdWJqZWN0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKFN1YmplY3QpKS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfV9jcmVhdGVDbGFzcyhTdWJqZWN0LFt7a2V5OiJnZXRDb21wb25lbnRzIix2YWx1ZTpmdW5jdGlvbiBnZXRDb21wb25lbnRzKCl7fX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbiByZW5kZXIoKXt2YXIgX3RoaXMyPXRoaXM7dmFyIF9wcm9wcz10aGlzLnByb3BzLGVkaXRNb2RlPV9wcm9wcy5lZGl0TW9kZSxjb2xvcj1fcHJvcHMuY29sb3I7dmFyIGQ9dGhpcy5nZXRDb21wb25lbnRzKHRoaXMucHJvcHMpfHx7fTt2YXIgaGFuZGxlcz12b2lkIDA7aWYoZWRpdE1vZGUpe2hhbmRsZXM9W19yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF9IYW5kbGUyLmRlZmF1bHQse2tleToic3ViamVjdC1oYW5kbGUiLGhhbmRsZVN0YXJ0OnRoaXMucHJvcHMuZHJhZ1N0YXJ0LGhhbmRsZVN0b3A6dGhpcy5wcm9wcy5kcmFnRW5kLGhhbmRsZURyYWc6dGhpcy5wcm9wcy5kcmFnU3ViamVjdH0pXTtpZihkLmhhbmRsZXMpe2hhbmRsZXM9aGFuZGxlcy5jb25jYXQoZC5oYW5kbGVzLm1hcChmdW5jdGlvbihoLGkpe3JldHVybiBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChfSGFuZGxlMi5kZWZhdWx0LHtrZXk6InN1YmplY3RoYW5kbGUtIitpLGhhbmRsZVN0YXJ0Ol90aGlzMi5wcm9wcy5kcmFnU3RhcnQsaGFuZGxlU3RvcDpfdGhpczIucHJvcHMuZHJhZ0VuZCx4OmgueCx5OmgueSxvZmZzZXRQYXJlbnQ6aC5vZmZzZXRQYXJlbnQmJl90aGlzMi5zdWJqZWN0LGhhbmRsZURyYWc6ZnVuY3Rpb24gaGFuZGxlRHJhZyhlLGRhdGEpe190aGlzMi5wcm9wcy5kcmFnU3ViamVjdFNldHRpbmdzKGUsZC5oYW5kbGVGdW5jdGlvbihoLGRhdGEpKX19KX0pKX19cmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJnIixfZXh0ZW5kcyQkMSh7Y2xhc3NOYW1lOiJhbm5vdGF0aW9uLXN1YmplY3QifSx0aGlzLnByb3BzLmdBdHRycyx7cmVmOmZ1bmN0aW9uIHJlZihzdWJqZWN0KXtfdGhpczIuc3ViamVjdD1zdWJqZWN0fX0pLGQuY29tcG9uZW50cyYmZC5jb21wb25lbnRzLm1hcChmdW5jdGlvbihjLGkpe3ZhciBhdHRycz17fTtpZighYylyZXR1cm4gbnVsbDtPYmplY3Qua2V5cyhjLmF0dHJzKS5mb3JFYWNoKGZ1bmN0aW9uKGspe2lmKGMuYXR0cnNba10mJmshPT0idGV4dCIpe2F0dHJzW2sucmVwbGFjZSgvLShbYS16XSkvZyxmdW5jdGlvbihnKXtyZXR1cm4gZ1sxXS50b1VwcGVyQ2FzZSgpfSldPWMuYXR0cnNba119fSk7cmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGMudHlwZSxfZXh0ZW5kcyQkMSh7a2V5OmksY2xhc3NOYW1lOmMuY2xhc3NOYW1lLGZpbGw6Im5vbmUiLHN0cm9rZTpjb2xvcn0sYXR0cnMpLGMuYXR0cnMudGV4dCl9KSxoYW5kbGVzKX19XSk7cmV0dXJuIFN1YmplY3R9KF9yZWFjdDIuZGVmYXVsdC5Db21wb25lbnQpO2V4cG9ydHMuZGVmYXVsdD1TdWJqZWN0fSk7dW53cmFwRXhwb3J0cyhTdWJqZWN0XzEpO3ZhciBiYWRnZT1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTp0cnVlfSk7ZXhwb3J0cy5kZWZhdWx0PWZ1bmN0aW9uKF9yZWYpe3ZhciBfcmVmJHJhZGl1cz1fcmVmLnJhZGl1cyxyYWRpdXM9X3JlZiRyYWRpdXM9PT11bmRlZmluZWQ/MTQ6X3JlZiRyYWRpdXMsbGVmdFJpZ2h0PV9yZWYubGVmdFJpZ2h0LHRvcEJvdHRvbT1fcmVmLnRvcEJvdHRvbSx0ZXh0PV9yZWYudGV4dCxjb2xvcj1fcmVmLmNvbG9yLGVkaXRNb2RlPV9yZWYuZWRpdE1vZGU7dmFyIGhhbmRsZXM9W107dmFyIGNvbXBvbmVudHM9W107dmFyIGlubmVyUmFkaXVzPXJhZGl1cyouNzt2YXIgeD0wO3ZhciB5PTA7dmFyIG5vdENvcm5lck9mZnNldD1NYXRoLnNxcnQoMikqcmFkaXVzO3ZhciBwbGFjZW1lbnQ9e3hsZWZ0Y29ybmVyOi1yYWRpdXMseHJpZ2h0Y29ybmVyOnJhZGl1cyx5dG9wY29ybmVyOi1yYWRpdXMseWJvdHRvbWNvcm5lcjpyYWRpdXMseGxlZnQ6LW5vdENvcm5lck9mZnNldCx4cmlnaHQ6bm90Q29ybmVyT2Zmc2V0LHl0b3A6LW5vdENvcm5lck9mZnNldCx5Ym90dG9tOm5vdENvcm5lck9mZnNldH07aWYobGVmdFJpZ2h0JiYhdG9wQm90dG9tKXt4PXBsYWNlbWVudFsieCIrbGVmdFJpZ2h0XX1lbHNlIGlmKHRvcEJvdHRvbSYmIWxlZnRSaWdodCl7eT1wbGFjZW1lbnRbInkiK3RvcEJvdHRvbV19ZWxzZSBpZihsZWZ0UmlnaHQmJnRvcEJvdHRvbSl7eD1wbGFjZW1lbnRbIngiK2xlZnRSaWdodCsiY29ybmVyIl07eT1wbGFjZW1lbnRbInkiK3RvcEJvdHRvbSsiY29ybmVyIl19dmFyIHRyYW5zZm9ybT0idHJhbnNsYXRlKCIreCsiLCAiK3krIikiO3ZhciBjaXJjbGViZz0oMCxCdWlsZGVyLmFyY0J1aWxkZXIpKHtjbGFzc05hbWU6InN1YmplY3QiLGRhdGE6e3JhZGl1czpyYWRpdXN9fSk7Y2lyY2xlYmcuYXR0cnMudHJhbnNmb3JtPXRyYW5zZm9ybTtjaXJjbGViZy5hdHRycy5maWxsPWNvbG9yO2NpcmNsZWJnLmF0dHJzWyJzdHJva2UtbGluZWNhcCJdPSJyb3VuZCI7Y2lyY2xlYmcuYXR0cnNbInN0cm9rZS13aWR0aCJdPSIzcHgiO3ZhciBjaXJjbGU9KDAsQnVpbGRlci5hcmNCdWlsZGVyKSh7Y2xhc3NOYW1lOiJzdWJqZWN0LXJpbmciLGRhdGE6e291dGVyUmFkaXVzOnJhZGl1cyxpbm5lclJhZGl1czppbm5lclJhZGl1c319KTtjaXJjbGUuYXR0cnMudHJhbnNmb3JtPXRyYW5zZm9ybTtjaXJjbGUuYXR0cnNbInN0cm9rZS13aWR0aCJdPSIzcHgiO2NpcmNsZS5hdHRycy5maWxsPSJ3aGl0ZSI7dmFyIHBvaW50ZXI9dm9pZCAwO2lmKHgmJnl8fCF4JiYheSl7cG9pbnRlcj0oMCxCdWlsZGVyLmxpbmVCdWlsZGVyKSh7Y2xhc3NOYW1lOiJzdWJqZWN0LXBvaW50ZXIiLGRhdGE6W1swLDBdLFt4fHwwLDBdLFswLHl8fDBdLFswLDBdXX0pfWVsc2UgaWYoeHx8eSl7dmFyIG5vdENvcm5lclBvaW50ZXJYWT1mdW5jdGlvbiBub3RDb3JuZXJQb2ludGVyWFkodil7dmFyIHNpZ249YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOjE7cmV0dXJuIHYmJnYvTWF0aC5zcXJ0KDIpL01hdGguc3FydCgyKXx8c2lnbipyYWRpdXMvTWF0aC5zcXJ0KDIpfTtwb2ludGVyPSgwLEJ1aWxkZXIubGluZUJ1aWxkZXIpKHtjbGFzc05hbWU6InN1YmplY3QtcG9pbnRlciIsZGF0YTpbWzAsMF0sW25vdENvcm5lclBvaW50ZXJYWSh4KSxub3RDb3JuZXJQb2ludGVyWFkoeSldLFtub3RDb3JuZXJQb2ludGVyWFkoeCwtMSksbm90Q29ybmVyUG9pbnRlclhZKHksLTEpXSxbMCwwXV19KX1pZihwb2ludGVyKXtwb2ludGVyLmF0dHJzLmZpbGw9Y29sb3I7cG9pbnRlci5hdHRyc1sic3Ryb2tlLWxpbmVjYXAiXT0icm91bmQiO3BvaW50ZXIuYXR0cnNbInN0cm9rZS13aWR0aCJdPSIzcHgiO2NvbXBvbmVudHMucHVzaChwb2ludGVyKX1pZihlZGl0TW9kZSl7dmFyIGJIYW5kbGVzPXt4OngqMix5OnkqMixvZmZzZXRQYXJlbnQ6dHJ1ZX07aWYoIWJIYW5kbGVzLngmJiFiSGFuZGxlcy55KXtiSGFuZGxlcy55PS1yYWRpdXN9aGFuZGxlcz1bYkhhbmRsZXNdfXZhciB0ZXh0Tm9kZT12b2lkIDA7aWYodGV4dCl7dGV4dE5vZGU9e3R5cGU6InRleHQiLGNsYXNzTmFtZToiYmFkZ2UtdGV4dCIsYXR0cnM6e2ZpbGw6IndoaXRlIixzdHJva2U6Im5vbmUiLCJmb250LXNpemUiOiIuN2VtIix0ZXh0OnRleHQsInRleHQtYW5jaG9yIjoibWlkZGxlIixkeToiLjI1ZW0iLHg6eCx5Onl9fX1jb21wb25lbnRzLnB1c2goY2lyY2xlYmcpO2NvbXBvbmVudHMucHVzaChjaXJjbGUpO2NvbXBvbmVudHMucHVzaCh0ZXh0Tm9kZSk7cmV0dXJue2NvbXBvbmVudHM6Y29tcG9uZW50cyxoYW5kbGVzOmhhbmRsZXN9fX0pO3Vud3JhcEV4cG9ydHMoYmFkZ2UpO3ZhciBTdWJqZWN0QmFkZ2VfMT1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTp0cnVlfSk7dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoInZhbHVlImluIGRlc2NyaXB0b3IpZGVzY3JpcHRvci53cml0YWJsZT10cnVlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsZGVzY3JpcHRvci5rZXksZGVzY3JpcHRvcil9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcn19KCk7dmFyIF9yZWFjdDI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChSZWFjdCk7dmFyIF9iYWRnZTI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChiYWRnZSk7dmFyIF9TdWJqZWN0Mz1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KFN1YmplY3RfMSk7dmFyIF9wcm9wVHlwZXMyPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQocHJvcFR5cGVzKTtmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iail7cmV0dXJuIG9iaiYmb2JqLl9fZXNNb2R1bGU/b2JqOntkZWZhdWx0Om9ian19ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLENvbnN0cnVjdG9yKXtpZighKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX19ZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZixjYWxsKXtpZighc2VsZil7dGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKX1yZXR1cm4gY2FsbCYmKCh0eXBlb2YgY2FsbD09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2YoY2FsbCkpPT09Im9iamVjdCJ8fHR5cGVvZiBjYWxsPT09ImZ1bmN0aW9uIik/Y2FsbDpzZWxmfWZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcyxzdXBlckNsYXNzKXtpZih0eXBlb2Ygc3VwZXJDbGFzcyE9PSJmdW5jdGlvbiImJnN1cGVyQ2xhc3MhPT1udWxsKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrKHR5cGVvZiBzdXBlckNsYXNzPT09InVuZGVmaW5lZCI/InVuZGVmaW5lZCI6X3R5cGVvZihzdXBlckNsYXNzKSkpfXN1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MmJnN1cGVyQ2xhc3MucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6c3ViQ2xhc3MsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfX0pO2lmKHN1cGVyQ2xhc3MpT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcyxzdXBlckNsYXNzKTpzdWJDbGFzcy5fX3Byb3RvX189c3VwZXJDbGFzc312YXIgU3ViamVjdEJhZGdlPWZ1bmN0aW9uKF9TdWJqZWN0JCQxKXtfaW5oZXJpdHMoU3ViamVjdEJhZGdlLF9TdWJqZWN0JCQxKTtmdW5jdGlvbiBTdWJqZWN0QmFkZ2UoKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxTdWJqZWN0QmFkZ2UpO3JldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLChTdWJqZWN0QmFkZ2UuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoU3ViamVjdEJhZGdlKSkuYXBwbHkodGhpcyxhcmd1bWVudHMpKX1fY3JlYXRlQ2xhc3MoU3ViamVjdEJhZGdlLFt7a2V5OiJnZXRDb21wb25lbnRzIix2YWx1ZTpmdW5jdGlvbiBnZXRDb21wb25lbnRzKF9yZWYpe3ZhciBsZWZ0UmlnaHQ9X3JlZi5sZWZ0UmlnaHQsdG9wQm90dG9tPV9yZWYudG9wQm90dG9tLHRleHQ9X3JlZi50ZXh0LGVkaXRNb2RlPV9yZWYuZWRpdE1vZGUsY29sb3I9X3JlZi5jb2xvcixyYWRpdXM9X3JlZi5yYWRpdXM7dmFyIGNvbXBvbmVudHM9KDAsX2JhZGdlMi5kZWZhdWx0KSh7bGVmdFJpZ2h0OmxlZnRSaWdodCx0b3BCb3R0b206dG9wQm90dG9tLHRleHQ6dGV4dCxlZGl0TW9kZTplZGl0TW9kZSxjb2xvcjpjb2xvcixyYWRpdXM6cmFkaXVzfSk7Y29tcG9uZW50cy5oYW5kbGVLZXlzPXtsZWZ0UmlnaHQ6bGVmdFJpZ2h0LHRvcEJvdHRvbTp0b3BCb3R0b219O2NvbXBvbmVudHMuaGFuZGxlRnVuY3Rpb249ZnVuY3Rpb24oaCxkYXRhKXt2YXIgbHI9ZGF0YS54PC1yYWRpdXMqMj8ibGVmdCI6ZGF0YS54PnJhZGl1cyoyPyJyaWdodCI6dW5kZWZpbmVkO3ZhciB0Yj1kYXRhLnk8LXJhZGl1cyoyPyJ0b3AiOmRhdGEueT5yYWRpdXMqMj8iYm90dG9tIjp1bmRlZmluZWQ7cmV0dXJue2xlZnRSaWdodDpscix0b3BCb3R0b206dGJ9fTtyZXR1cm4gY29tcG9uZW50c319XSk7cmV0dXJuIFN1YmplY3RCYWRnZX0oX1N1YmplY3QzLmRlZmF1bHQpO2V4cG9ydHMuZGVmYXVsdD1TdWJqZWN0QmFkZ2U7U3ViamVjdEJhZGdlLnByb3BUeXBlcz17bGVmdFJpZ2h0Ol9wcm9wVHlwZXMyLmRlZmF1bHQub25lT2YoWyJsZWZ0IiwicmlnaHQiXSksdG9wQm90dG9tOl9wcm9wVHlwZXMyLmRlZmF1bHQub25lT2YoWyJ0b3AiLCJib3R0b20iXSksdGV4dDpfcHJvcFR5cGVzMi5kZWZhdWx0Lm9uZU9mVHlwZShbX3Byb3BUeXBlczIuZGVmYXVsdC5zdHJpbmcsX3Byb3BUeXBlczIuZGVmYXVsdC5udW1iZXJdKSxjb2xvcjpfcHJvcFR5cGVzMi5kZWZhdWx0LnN0cmluZyxlZGl0TW9kZTpfcHJvcFR5cGVzMi5kZWZhdWx0LmJvb2x9fSk7dW53cmFwRXhwb3J0cyhTdWJqZWN0QmFkZ2VfMSk7dmFyIGNpcmNsZSQxPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywiX19lc01vZHVsZSIse3ZhbHVlOnRydWV9KTtleHBvcnRzLmNpcmNsZUhhbmRsZXM9dW5kZWZpbmVkO3ZhciBjaXJjbGVIYW5kbGVzPWV4cG9ydHMuY2lyY2xlSGFuZGxlcz1mdW5jdGlvbiBjaXJjbGVIYW5kbGVzKF9yZWYpe3ZhciBfcmVmJGN4PV9yZWYuY3gsY3g9X3JlZiRjeD09PXVuZGVmaW5lZD8wOl9yZWYkY3gsX3JlZiRjeT1fcmVmLmN5LGN5PV9yZWYkY3k9PT11bmRlZmluZWQ/MDpfcmVmJGN5LHIxPV9yZWYucjEscjI9X3JlZi5yMixwYWRkaW5nPV9yZWYucGFkZGluZzt2YXIgaD17bW92ZTp7eDpjeCx5OmN5fX07aWYocjEhPT11bmRlZmluZWQpe2gucjE9e3g6Y3grcjEvTWF0aC5zcXJ0KDIpLHk6Y3krcjEvTWF0aC5zcXJ0KDIpfX1pZihyMiE9PXVuZGVmaW5lZCl7aC5yMj17eDpjeCtyMi9NYXRoLnNxcnQoMikseTpjeStyMi9NYXRoLnNxcnQoMil9fWlmKHBhZGRpbmchPT11bmRlZmluZWQpe2gucGFkZGluZz17eDpjeCtyMStwYWRkaW5nLHk6Y3l9fXJldHVybiBofTtleHBvcnRzLmRlZmF1bHQ9ZnVuY3Rpb24oX3JlZjIpe3ZhciByYWRpdXM9X3JlZjIucmFkaXVzLHJhZGl1c1BhZGRpbmc9X3JlZjIucmFkaXVzUGFkZGluZyxvdXRlclJhZGl1cz1fcmVmMi5vdXRlclJhZGl1cyxpbm5lclJhZGl1cz1fcmVmMi5pbm5lclJhZGl1cyxlZGl0TW9kZT1fcmVmMi5lZGl0TW9kZTt2YXIgaGFuZGxlcz1bXTt2YXIgYz0oMCxCdWlsZGVyLmFyY0J1aWxkZXIpKHtkYXRhOntyYWRpdXM6cmFkaXVzLG91dGVyUmFkaXVzOm91dGVyUmFkaXVzLGlubmVyUmFkaXVzOmlubmVyUmFkaXVzfSxjbGFzc05hbWU6InN1YmplY3QifSk7aWYoZWRpdE1vZGUpe3ZhciBoPWNpcmNsZUhhbmRsZXMoe3IxOmMuZGF0YS5vdXRlclJhZGl1c3x8Yy5kYXRhLnJhZGl1cyxyMjpjLmRhdGEuaW5uZXJSYWRpdXMscGFkZGluZzpyYWRpdXNQYWRkaW5nfSk7dmFyIGNIYW5kbGVzPVt7eDpoLnIxLngseTpoLnIxLnksa2V5OmMuZGF0YS5vdXRlclJhZGl1cz8ib3V0ZXJSYWRpdXMiOiJyYWRpdXMifV07aWYoaW5uZXJSYWRpdXMpe2NIYW5kbGVzLnB1c2goe3g6aC5yMi54LHk6aC5yMi55LGtleToiaW5uZXJSYWRpdXMifSl9aGFuZGxlcz1jSGFuZGxlc31jLmF0dHJzWyJmaWxsLW9wYWNpdHkiXT0wO3JldHVybntjb21wb25lbnRzOltjXSxoYW5kbGVzOmhhbmRsZXN9fX0pO3Vud3JhcEV4cG9ydHMoY2lyY2xlJDEpO3ZhciBjaXJjbGVfMT1jaXJjbGUkMS5jaXJjbGVIYW5kbGVzO3ZhciBTdWJqZWN0Q2lyY2xlXzE9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCJfX2VzTW9kdWxlIix7dmFsdWU6dHJ1ZX0pO3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCxwcm9wcyl7Zm9yKHZhciBpPTA7aTxwcm9wcy5sZW5ndGg7aSsrKXt2YXIgZGVzY3JpcHRvcj1wcm9wc1tpXTtkZXNjcmlwdG9yLmVudW1lcmFibGU9ZGVzY3JpcHRvci5lbnVtZXJhYmxlfHxmYWxzZTtkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZT10cnVlO2lmKCJ2YWx1ZSJpbiBkZXNjcmlwdG9yKWRlc2NyaXB0b3Iud3JpdGFibGU9dHJ1ZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LGRlc2NyaXB0b3Iua2V5LGRlc2NyaXB0b3IpfX1yZXR1cm4gZnVuY3Rpb24oQ29uc3RydWN0b3IscHJvdG9Qcm9wcyxzdGF0aWNQcm9wcyl7aWYocHJvdG9Qcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSxwcm90b1Byb3BzKTtpZihzdGF0aWNQcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLHN0YXRpY1Byb3BzKTtyZXR1cm4gQ29uc3RydWN0b3J9fSgpO3ZhciBfcmVhY3QyPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoUmVhY3QpO3ZhciBfY2lyY2xlMj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KGNpcmNsZSQxKTt2YXIgX1N1YmplY3QzPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoU3ViamVjdF8xKTt2YXIgX3Byb3BUeXBlczI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChwcm9wVHlwZXMpO2Z1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKXtyZXR1cm4gb2JqJiZvYmouX19lc01vZHVsZT9vYmo6e2RlZmF1bHQ6b2JqfX1mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLGtleSx2YWx1ZSl7aWYoa2V5IGluIG9iail7T2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaixrZXkse3ZhbHVlOnZhbHVlLGVudW1lcmFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZSx3cml0YWJsZTp0cnVlfSl9ZWxzZXtvYmpba2V5XT12YWx1ZX1yZXR1cm4gb2JqfWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSxDb25zdHJ1Y3Rvcil7aWYoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsY2FsbCl7aWYoIXNlbGYpe3Rocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIil9cmV0dXJuIGNhbGwmJigodHlwZW9mIGNhbGw9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKGNhbGwpKT09PSJvYmplY3QifHx0eXBlb2YgY2FsbD09PSJmdW5jdGlvbiIpP2NhbGw6c2VsZn1mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT0iZnVuY3Rpb24iJiZzdXBlckNsYXNzIT09bnVsbCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiKyh0eXBlb2Ygc3VwZXJDbGFzcz09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2Yoc3VwZXJDbGFzcykpKX1zdWJDbGFzcy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzJiZzdXBlckNsYXNzLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnN1YkNsYXNzLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX19KTtpZihzdXBlckNsYXNzKU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3Msc3VwZXJDbGFzcyk6c3ViQ2xhc3MuX19wcm90b19fPXN1cGVyQ2xhc3N9dmFyIFN1YmplY3RDaXJjbGU9ZnVuY3Rpb24oX1N1YmplY3Qpe19pbmhlcml0cyhTdWJqZWN0Q2lyY2xlLF9TdWJqZWN0KTtmdW5jdGlvbiBTdWJqZWN0Q2lyY2xlKCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsU3ViamVjdENpcmNsZSk7cmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKFN1YmplY3RDaXJjbGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoU3ViamVjdENpcmNsZSkpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9X2NyZWF0ZUNsYXNzKFN1YmplY3RDaXJjbGUsW3trZXk6ImdldENvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uIGdldENvbXBvbmVudHMoX3JlZil7dmFyIF9yZWYkcmFkaXVzPV9yZWYucmFkaXVzLHJhZGl1cz1fcmVmJHJhZGl1cz09PXVuZGVmaW5lZD8yMDpfcmVmJHJhZGl1cyxpbm5lclJhZGl1cz1fcmVmLmlubmVyUmFkaXVzLG91dGVyUmFkaXVzPV9yZWYub3V0ZXJSYWRpdXMscmFkaXVzUGFkZGluZz1fcmVmLnJhZGl1c1BhZGRpbmcsZWRpdE1vZGU9X3JlZi5lZGl0TW9kZTt2YXIgY29tcG9uZW50cz0oMCxfY2lyY2xlMi5kZWZhdWx0KSh7cmFkaXVzOnJhZGl1cyxyYWRpdXNQYWRkaW5nOnJhZGl1c1BhZGRpbmcsaW5uZXJSYWRpdXM6aW5uZXJSYWRpdXMsb3V0ZXJSYWRpdXM6b3V0ZXJSYWRpdXMsZWRpdE1vZGU6ZWRpdE1vZGV9KTtjb21wb25lbnRzLmhhbmRsZUtleXM9e3JhZGl1czpyYWRpdXMsaW5uZXJSYWRpdXM6aW5uZXJSYWRpdXMsb3V0ZXJSYWRpdXM6b3V0ZXJSYWRpdXN9O2NvbXBvbmVudHMuaGFuZGxlRnVuY3Rpb249ZnVuY3Rpb24oaCxkYXRhKXtyZXR1cm4gX2RlZmluZVByb3BlcnR5KHt9LGgua2V5LGNvbXBvbmVudHMuaGFuZGxlS2V5c1toLmtleV0rZGF0YS5kZWx0YVgqTWF0aC5zcXJ0KDIpKX07cmV0dXJuIGNvbXBvbmVudHN9fV0pO3JldHVybiBTdWJqZWN0Q2lyY2xlfShfU3ViamVjdDMuZGVmYXVsdCk7ZXhwb3J0cy5kZWZhdWx0PVN1YmplY3RDaXJjbGU7U3ViamVjdENpcmNsZS5wcm9wVHlwZXM9e3JhZGl1czpfcHJvcFR5cGVzMi5kZWZhdWx0Lm51bWJlcixpbm5lclJhZGl1czpfcHJvcFR5cGVzMi5kZWZhdWx0Lm51bWJlcixvdXRlclJhZGl1czpfcHJvcFR5cGVzMi5kZWZhdWx0Lm51bWJlcixyYWRpdXNQYWRkaW5nOl9wcm9wVHlwZXMyLmRlZmF1bHQubnVtYmVyLGVkaXRNb2RlOl9wcm9wVHlwZXMyLmRlZmF1bHQuYm9vbH19KTt1bndyYXBFeHBvcnRzKFN1YmplY3RDaXJjbGVfMSk7dmFyIHJlY3Q9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCJfX2VzTW9kdWxlIix7dmFsdWU6dHJ1ZX0pO2V4cG9ydHMuZGVmYXVsdD1mdW5jdGlvbihfcmVmKXt2YXIgX3JlZiR3aWR0aD1fcmVmLndpZHRoLHdpZHRoPV9yZWYkd2lkdGg9PT11bmRlZmluZWQ/MTAwOl9yZWYkd2lkdGgsX3JlZiRoZWlnaHQ9X3JlZi5oZWlnaHQsaGVpZ2h0PV9yZWYkaGVpZ2h0PT09dW5kZWZpbmVkPzEwMDpfcmVmJGhlaWdodCxlZGl0TW9kZT1fcmVmLmVkaXRNb2RlO3ZhciBoYW5kbGVzPVtdO3ZhciBkYXRhPVtbMCwwXSxbd2lkdGgsMF0sW3dpZHRoLGhlaWdodF0sWzAsaGVpZ2h0XSxbMCwwXV07dmFyIHJlY3Q9KDAsQnVpbGRlci5saW5lQnVpbGRlcikoe2RhdGE6ZGF0YSxjbGFzc05hbWU6InN1YmplY3QifSk7aWYoZWRpdE1vZGUpe2hhbmRsZXM9W3t4OndpZHRoLHk6aGVpZ2h0LzIsa2V5OiJ3aWR0aCJ9LHt4OndpZHRoLzIseTpoZWlnaHQsa2V5OiJoZWlnaHQifV19cmVjdC5hdHRyc1siZmlsbC1vcGFjaXR5Il09LjE7cmV0dXJue2NvbXBvbmVudHM6W3JlY3RdLGhhbmRsZXM6aGFuZGxlc319fSk7dW53cmFwRXhwb3J0cyhyZWN0KTt2YXIgU3ViamVjdFJlY3RfMT1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTp0cnVlfSk7dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoInZhbHVlImluIGRlc2NyaXB0b3IpZGVzY3JpcHRvci53cml0YWJsZT10cnVlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsZGVzY3JpcHRvci5rZXksZGVzY3JpcHRvcil9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcn19KCk7dmFyIF9yZWFjdDI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChSZWFjdCk7dmFyIF9yZWN0Mj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlY3QpO3ZhciBfU3ViamVjdDM9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChTdWJqZWN0XzEpO3ZhciBfcHJvcFR5cGVzMj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KHByb3BUeXBlcyk7ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmope3JldHVybiBvYmomJm9iai5fX2VzTW9kdWxlP29iajp7ZGVmYXVsdDpvYmp9fWZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosa2V5LHZhbHVlKXtpZihrZXkgaW4gb2JqKXtPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLGtleSx7dmFsdWU6dmFsdWUsZW51bWVyYWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlLHdyaXRhYmxlOnRydWV9KX1lbHNle29ialtrZXldPXZhbHVlfXJldHVybiBvYmp9ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLENvbnN0cnVjdG9yKXtpZighKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX19ZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZixjYWxsKXtpZighc2VsZil7dGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKX1yZXR1cm4gY2FsbCYmKCh0eXBlb2YgY2FsbD09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2YoY2FsbCkpPT09Im9iamVjdCJ8fHR5cGVvZiBjYWxsPT09ImZ1bmN0aW9uIik/Y2FsbDpzZWxmfWZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcyxzdXBlckNsYXNzKXtpZih0eXBlb2Ygc3VwZXJDbGFzcyE9PSJmdW5jdGlvbiImJnN1cGVyQ2xhc3MhPT1udWxsKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrKHR5cGVvZiBzdXBlckNsYXNzPT09InVuZGVmaW5lZCI/InVuZGVmaW5lZCI6X3R5cGVvZihzdXBlckNsYXNzKSkpfXN1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MmJnN1cGVyQ2xhc3MucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6c3ViQ2xhc3MsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfX0pO2lmKHN1cGVyQ2xhc3MpT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcyxzdXBlckNsYXNzKTpzdWJDbGFzcy5fX3Byb3RvX189c3VwZXJDbGFzc312YXIgU3ViamVjdFJlY3Q9ZnVuY3Rpb24oX1N1YmplY3Qpe19pbmhlcml0cyhTdWJqZWN0UmVjdCxfU3ViamVjdCk7ZnVuY3Rpb24gU3ViamVjdFJlY3QoKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxTdWJqZWN0UmVjdCk7cmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKFN1YmplY3RSZWN0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKFN1YmplY3RSZWN0KSkuYXBwbHkodGhpcyxhcmd1bWVudHMpKX1fY3JlYXRlQ2xhc3MoU3ViamVjdFJlY3QsW3trZXk6ImdldENvbXBvbmVudHMiLHZhbHVlOmZ1bmN0aW9uIGdldENvbXBvbmVudHMoX3JlZil7dmFyIF9yZWYkd2lkdGg9X3JlZi53aWR0aCx3aWR0aD1fcmVmJHdpZHRoPT09dW5kZWZpbmVkPzEwMDpfcmVmJHdpZHRoLF9yZWYkaGVpZ2h0PV9yZWYuaGVpZ2h0LGhlaWdodD1fcmVmJGhlaWdodD09PXVuZGVmaW5lZD8xMDA6X3JlZiRoZWlnaHQsZWRpdE1vZGU9X3JlZi5lZGl0TW9kZTt2YXIgY29tcG9uZW50cz0oMCxfcmVjdDIuZGVmYXVsdCkoe3dpZHRoOndpZHRoLGhlaWdodDpoZWlnaHQsZWRpdE1vZGU6ZWRpdE1vZGV9KTtjb21wb25lbnRzLmhhbmRsZUtleXM9e3dpZHRoOndpZHRoLGhlaWdodDpoZWlnaHR9O2NvbXBvbmVudHMuaGFuZGxlRnVuY3Rpb249ZnVuY3Rpb24oaCxkYXRhKXtyZXR1cm4gX2RlZmluZVByb3BlcnR5KHt9LGgua2V5LGgua2V5PT09IndpZHRoIj93aWR0aCtkYXRhLmRlbHRhWDpoZWlnaHQrZGF0YS5kZWx0YVkpfTtyZXR1cm4gY29tcG9uZW50c319XSk7cmV0dXJuIFN1YmplY3RSZWN0fShfU3ViamVjdDMuZGVmYXVsdCk7ZXhwb3J0cy5kZWZhdWx0PVN1YmplY3RSZWN0O1N1YmplY3RSZWN0LnByb3BUeXBlcz17d2lkdGg6X3Byb3BUeXBlczIuZGVmYXVsdC5udW1iZXIsaGVpZ2h0Ol9wcm9wVHlwZXMyLmRlZmF1bHQubnVtYmVyLGVkaXRNb2RlOl9wcm9wVHlwZXMyLmRlZmF1bHQuYm9vbH19KTt1bndyYXBFeHBvcnRzKFN1YmplY3RSZWN0XzEpO3ZhciB0aHJlc2hvbGQ9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCJfX2VzTW9kdWxlIix7dmFsdWU6dHJ1ZX0pO2V4cG9ydHMuZGVmYXVsdD1mdW5jdGlvbihfcmVmKXt2YXIgeDE9X3JlZi54MSx4Mj1fcmVmLngyLHkxPV9yZWYueTEseTI9X3JlZi55Mix4PV9yZWYueCx5PV9yZWYueTt4MT0oeDEhPT11bmRlZmluZWQ/eDE6eCkteDt4Mj0oeDIhPT11bmRlZmluZWQ/eDI6eCkteDt5MT0oeTEhPT11bmRlZmluZWQ/eTE6eSkteTt5Mj0oeTIhPT11bmRlZmluZWQ/eTI6eSkteTt2YXIgZGF0YT1bW3gxLHkxXSxbeDIseTJdXTtyZXR1cm57Y29tcG9uZW50czpbKDAsQnVpbGRlci5saW5lQnVpbGRlcikoe2RhdGE6ZGF0YSxjbGFzc05hbWU6InN1YmplY3QifSldfX19KTt1bndyYXBFeHBvcnRzKHRocmVzaG9sZCk7dmFyIFN1YmplY3RUaHJlc2hvbGRfMT1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTp0cnVlfSk7dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoInZhbHVlImluIGRlc2NyaXB0b3IpZGVzY3JpcHRvci53cml0YWJsZT10cnVlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsZGVzY3JpcHRvci5rZXksZGVzY3JpcHRvcil9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcn19KCk7dmFyIF9yZWFjdDI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChSZWFjdCk7dmFyIF90aHJlc2hvbGQyPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQodGhyZXNob2xkKTt2YXIgX1N1YmplY3QzPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoU3ViamVjdF8xKTt2YXIgX3Byb3BUeXBlczI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChwcm9wVHlwZXMpO2Z1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKXtyZXR1cm4gb2JqJiZvYmouX19lc01vZHVsZT9vYmo6e2RlZmF1bHQ6b2JqfX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpfXJldHVybiBjYWxsJiYoKHR5cGVvZiBjYWxsPT09InVuZGVmaW5lZCI/InVuZGVmaW5lZCI6X3R5cGVvZihjYWxsKSk9PT0ib2JqZWN0Inx8dHlwZW9mIGNhbGw9PT0iZnVuY3Rpb24iKT9jYWxsOnNlbGZ9ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLHN1cGVyQ2xhc3Mpe2lmKHR5cGVvZiBzdXBlckNsYXNzIT09ImZ1bmN0aW9uIiYmc3VwZXJDbGFzcyE9PW51bGwpe3Rocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIisodHlwZW9mIHN1cGVyQ2xhc3M9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKHN1cGVyQ2xhc3MpKSl9c3ViQ2xhc3MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyYmc3VwZXJDbGFzcy5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpzdWJDbGFzcyxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9fSk7aWYoc3VwZXJDbGFzcylPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLHN1cGVyQ2xhc3MpOnN1YkNsYXNzLl9fcHJvdG9fXz1zdXBlckNsYXNzfXZhciBTdWJqZWN0VGhyZXNob2xkPWZ1bmN0aW9uKF9TdWJqZWN0KXtfaW5oZXJpdHMoU3ViamVjdFRocmVzaG9sZCxfU3ViamVjdCk7ZnVuY3Rpb24gU3ViamVjdFRocmVzaG9sZCgpe19jbGFzc0NhbGxDaGVjayh0aGlzLFN1YmplY3RUaHJlc2hvbGQpO3JldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLChTdWJqZWN0VGhyZXNob2xkLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKFN1YmplY3RUaHJlc2hvbGQpKS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfV9jcmVhdGVDbGFzcyhTdWJqZWN0VGhyZXNob2xkLFt7a2V5OiJnZXRDb21wb25lbnRzIix2YWx1ZTpmdW5jdGlvbiBnZXRDb21wb25lbnRzKF9yZWYpe3ZhciB4MT1fcmVmLngxLHgyPV9yZWYueDIseTE9X3JlZi55MSx5Mj1fcmVmLnkyLHg9X3JlZi54LHk9X3JlZi55LGVkaXRNb2RlPV9yZWYuZWRpdE1vZGU7cmV0dXJuKDAsX3RocmVzaG9sZDIuZGVmYXVsdCkoe3gxOngxLHgyOngyLHkxOnkxLHkyOnkyLHg6eCx5OnksZWRpdE1vZGU6ZWRpdE1vZGV9KX19XSk7cmV0dXJuIFN1YmplY3RUaHJlc2hvbGR9KF9TdWJqZWN0My5kZWZhdWx0KTtleHBvcnRzLmRlZmF1bHQ9U3ViamVjdFRocmVzaG9sZDtTdWJqZWN0VGhyZXNob2xkLnByb3BUeXBlcz17eDpfcHJvcFR5cGVzMi5kZWZhdWx0Lm51bWJlcix4MTpfcHJvcFR5cGVzMi5kZWZhdWx0Lm51bWJlcix4MjpfcHJvcFR5cGVzMi5kZWZhdWx0Lm51bWJlcix5Ol9wcm9wVHlwZXMyLmRlZmF1bHQubnVtYmVyLHkxOl9wcm9wVHlwZXMyLmRlZmF1bHQubnVtYmVyLHkyOl9wcm9wVHlwZXMyLmRlZmF1bHQubnVtYmVyLGVkaXRNb2RlOl9wcm9wVHlwZXMyLmRlZmF1bHQuYm9vbH19KTt1bndyYXBFeHBvcnRzKFN1YmplY3RUaHJlc2hvbGRfMSk7dmFyIGJyYWNrZXQ9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCJfX2VzTW9kdWxlIix7dmFsdWU6dHJ1ZX0pO2Z1bmN0aW9uIG1ha2VDdXJseUJyYWNlKHgxLHkxLHgyLHkyLHcscSl7dmFyIGR4PXgxLXgyO3ZhciBkeT15MS15Mjt2YXIgbGVuPU1hdGguc3FydChkeCpkeCtkeSpkeSk7ZHg9ZHgvbGVuO2R5PWR5L2xlbjt2YXIgcXgxPXgxK3EqdypkeTt2YXIgcXkxPXkxLXEqdypkeDt2YXIgcXgyPXgxLS4yNSpsZW4qZHgrKDEtcSkqdypkeTt2YXIgcXkyPXkxLS4yNSpsZW4qZHktKDEtcSkqdypkeDt2YXIgdHgxPXgxLS41KmxlbipkeCt3KmR5O3ZhciB0eTE9eTEtLjUqbGVuKmR5LXcqZHg7dmFyIHF4Mz14MitxKncqZHk7dmFyIHF5Mz15Mi1xKncqZHg7dmFyIHF4ND14MS0uNzUqbGVuKmR4KygxLXEpKncqZHk7dmFyIHF5ND15MS0uNzUqbGVuKmR5LSgxLXEpKncqZHg7cmV0dXJuIk0gIit4MSsiICIreTErIiBRICIrcXgxKyIgIitxeTErIiAiK3F4MisiICIrcXkyKyIgVCAiK3R4MSsiICIrdHkxKyIgTSAiK3gyKyIgIit5MisiIFEgIitxeDMrIiAiK3F5MysiICIrcXg0KyIgIitxeTQrIiBUICIrdHgxKyIgIit0eTF9ZXhwb3J0cy5kZWZhdWx0PWZ1bmN0aW9uKF9yZWYpe3ZhciBoZWlnaHQ9X3JlZi5oZWlnaHQsd2lkdGg9X3JlZi53aWR0aCxkZXB0aD1fcmVmLmRlcHRoLHR5cGU9X3JlZi50eXBlLGVkaXRNb2RlPV9yZWYuZWRpdE1vZGU7dmFyIGhhbmRsZXM9W107dmFyIGRhdGE9dm9pZCAwO3ZhciBicmFja2V0PXZvaWQgMDtpZih0eXBlPT09InNxdWFyZSIpe2lmKGhlaWdodCl7ZGF0YT1bWzAsMF0sW2RlcHRoLDBdLFtkZXB0aCxoZWlnaHRdLFswLGhlaWdodF1dfWVsc2UgaWYod2lkdGgpe2RhdGE9W1swLDBdLFswLGRlcHRoXSxbd2lkdGgsZGVwdGhdLFt3aWR0aCwwXV19YnJhY2tldD0oMCxCdWlsZGVyLmxpbmVCdWlsZGVyKSh7ZGF0YTpkYXRhLGNsYXNzTmFtZToic3ViamVjdCJ9KX1lbHNlIGlmKHR5cGU9PT0iY3VybHkiKXticmFja2V0PSgwLEJ1aWxkZXIucGF0aEJ1aWxkZXIpKHtkOm1ha2VDdXJseUJyYWNlKDAsMCx3aWR0aHx8MCxoZWlnaHR8fDAsaGVpZ2h0JiZoZWlnaHQ+MHx8d2lkdGgmJndpZHRoPDA/LWRlcHRoOmRlcHRoLC41NSksY2xhc3NOYW1lOiJzdWJqZWN0In0pfWlmKGVkaXRNb2RlKXtoYW5kbGVzPVt7eDpoZWlnaHQ/ZGVwdGg6d2lkdGgvMix5OmhlaWdodD9oZWlnaHQvMjpkZXB0aCxrZXk6ImRlcHRoIix0eXBlOmhlaWdodD8iWCI6IlkifSx7eDp3aWR0aHx8MCx5OmhlaWdodHx8MCxrZXk6aGVpZ2h0PyJoZWlnaHQiOiJ3aWR0aCJ9XX1icmFja2V0LmF0dHJzWyJmaWxsLW9wYWNpdHkiXT0uMTtyZXR1cm57Y29tcG9uZW50czpbYnJhY2tldF0saGFuZGxlczpoYW5kbGVzfX19KTt1bndyYXBFeHBvcnRzKGJyYWNrZXQpO3ZhciBTdWJqZWN0QnJhY2tldF8xPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywiX19lc01vZHVsZSIse3ZhbHVlOnRydWV9KTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQscHJvcHMpe2Zvcih2YXIgaT0wO2k8cHJvcHMubGVuZ3RoO2krKyl7dmFyIGRlc2NyaXB0b3I9cHJvcHNbaV07ZGVzY3JpcHRvci5lbnVtZXJhYmxlPWRlc2NyaXB0b3IuZW51bWVyYWJsZXx8ZmFsc2U7ZGVzY3JpcHRvci5jb25maWd1cmFibGU9dHJ1ZTtpZigidmFsdWUiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKX19cmV0dXJuIGZ1bmN0aW9uKENvbnN0cnVjdG9yLHByb3RvUHJvcHMsc3RhdGljUHJvcHMpe2lmKHByb3RvUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUscHJvdG9Qcm9wcyk7aWYoc3RhdGljUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3RvcixzdGF0aWNQcm9wcyk7cmV0dXJuIENvbnN0cnVjdG9yfX0oKTt2YXIgX3JlYWN0Mj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KFJlYWN0KTt2YXIgX2JyYWNrZXQyPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoYnJhY2tldCk7dmFyIF9TdWJqZWN0Mz1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KFN1YmplY3RfMSk7dmFyIF9wcm9wVHlwZXMyPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQocHJvcFR5cGVzKTtmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iail7cmV0dXJuIG9iaiYmb2JqLl9fZXNNb2R1bGU/b2JqOntkZWZhdWx0Om9ian19ZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaixrZXksdmFsdWUpe2lmKGtleSBpbiBvYmope09iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosa2V5LHt2YWx1ZTp2YWx1ZSxlbnVtZXJhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWUsd3JpdGFibGU6dHJ1ZX0pfWVsc2V7b2JqW2tleV09dmFsdWV9cmV0dXJuIG9ian1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpfXJldHVybiBjYWxsJiYoKHR5cGVvZiBjYWxsPT09InVuZGVmaW5lZCI/InVuZGVmaW5lZCI6X3R5cGVvZihjYWxsKSk9PT0ib2JqZWN0Inx8dHlwZW9mIGNhbGw9PT0iZnVuY3Rpb24iKT9jYWxsOnNlbGZ9ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLHN1cGVyQ2xhc3Mpe2lmKHR5cGVvZiBzdXBlckNsYXNzIT09ImZ1bmN0aW9uIiYmc3VwZXJDbGFzcyE9PW51bGwpe3Rocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIisodHlwZW9mIHN1cGVyQ2xhc3M9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKHN1cGVyQ2xhc3MpKSl9c3ViQ2xhc3MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyYmc3VwZXJDbGFzcy5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpzdWJDbGFzcyxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9fSk7aWYoc3VwZXJDbGFzcylPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLHN1cGVyQ2xhc3MpOnN1YkNsYXNzLl9fcHJvdG9fXz1zdXBlckNsYXNzfXZhciBTdWJqZWN0QnJhY2tldD1mdW5jdGlvbihfU3ViamVjdCl7X2luaGVyaXRzKFN1YmplY3RCcmFja2V0LF9TdWJqZWN0KTtmdW5jdGlvbiBTdWJqZWN0QnJhY2tldCgpe19jbGFzc0NhbGxDaGVjayh0aGlzLFN1YmplY3RCcmFja2V0KTtyZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywoU3ViamVjdEJyYWNrZXQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoU3ViamVjdEJyYWNrZXQpKS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfV9jcmVhdGVDbGFzcyhTdWJqZWN0QnJhY2tldCxbe2tleToiZ2V0Q29tcG9uZW50cyIsdmFsdWU6ZnVuY3Rpb24gZ2V0Q29tcG9uZW50cyhfcmVmKXt2YXIgaGVpZ2h0PV9yZWYuaGVpZ2h0LHdpZHRoPV9yZWYud2lkdGgsX3JlZiRkZXB0aD1fcmVmLmRlcHRoLGRlcHRoPV9yZWYkZGVwdGg9PT11bmRlZmluZWQ/MjA6X3JlZiRkZXB0aCxfcmVmJHR5cGU9X3JlZi50eXBlLHR5cGU9X3JlZiR0eXBlPT09dW5kZWZpbmVkPyJzcXVhcmUiOl9yZWYkdHlwZSxlZGl0TW9kZT1fcmVmLmVkaXRNb2RlO3ZhciBjb21wb25lbnRzPSgwLF9icmFja2V0Mi5kZWZhdWx0KSh7aGVpZ2h0OmhlaWdodCx3aWR0aDp3aWR0aCxkZXB0aDpkZXB0aCx0eXBlOnR5cGUsZWRpdE1vZGU6ZWRpdE1vZGV9KTt2YXIgaGFuZGxlS2V5cz17aGVpZ2h0OmhlaWdodCx3aWR0aDp3aWR0aCxkZXB0aDpkZXB0aH07Y29tcG9uZW50cy5oYW5kbGVGdW5jdGlvbj1mdW5jdGlvbihoLGRhdGEpe2lmKGgua2V5PT09ImRlcHRoIil7cmV0dXJue2RlcHRoOmRlcHRoK2RhdGFbImRlbHRhIitoLnR5cGVdfX1lbHNle3JldHVybiBfZGVmaW5lUHJvcGVydHkoe30saC5rZXksaGFuZGxlS2V5c1toLmtleV0rZGF0YVtoLmtleT09PSJ3aWR0aCI/ImRlbHRhWCI6ImRlbHRhWSJdKX19O3JldHVybiBjb21wb25lbnRzfX1dKTtyZXR1cm4gU3ViamVjdEJyYWNrZXR9KF9TdWJqZWN0My5kZWZhdWx0KTtleHBvcnRzLmRlZmF1bHQ9U3ViamVjdEJyYWNrZXQ7U3ViamVjdEJyYWNrZXQucHJvcFR5cGVzPXt3aWR0aDpfcHJvcFR5cGVzMi5kZWZhdWx0Lm51bWJlcixoZWlnaHQ6X3Byb3BUeXBlczIuZGVmYXVsdC5udW1iZXIsZGVwdGg6X3Byb3BUeXBlczIuZGVmYXVsdC5udW1iZXIsZWRpdE1vZGU6X3Byb3BUeXBlczIuZGVmYXVsdC5ib29sfX0pO3Vud3JhcEV4cG9ydHMoU3ViamVjdEJyYWNrZXRfMSk7dmFyIFN1YmplY3RDdXN0b21fMT1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTp0cnVlfSk7dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoInZhbHVlImluIGRlc2NyaXB0b3IpZGVzY3JpcHRvci53cml0YWJsZT10cnVlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsZGVzY3JpcHRvci5rZXksZGVzY3JpcHRvcil9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcn19KCk7dmFyIF9yZWFjdDI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChSZWFjdCk7dmFyIF9TdWJqZWN0Mz1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KFN1YmplY3RfMSk7dmFyIF9wcm9wVHlwZXMyPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQocHJvcFR5cGVzKTt2YXIgX0hhbmRsZTI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChIYW5kbGVfMSk7ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmope3JldHVybiBvYmomJm9iai5fX2VzTW9kdWxlP29iajp7ZGVmYXVsdDpvYmp9fWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSxDb25zdHJ1Y3Rvcil7aWYoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsY2FsbCl7aWYoIXNlbGYpe3Rocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIil9cmV0dXJuIGNhbGwmJigodHlwZW9mIGNhbGw9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKGNhbGwpKT09PSJvYmplY3QifHx0eXBlb2YgY2FsbD09PSJmdW5jdGlvbiIpP2NhbGw6c2VsZn1mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT0iZnVuY3Rpb24iJiZzdXBlckNsYXNzIT09bnVsbCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiKyh0eXBlb2Ygc3VwZXJDbGFzcz09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2Yoc3VwZXJDbGFzcykpKX1zdWJDbGFzcy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzJiZzdXBlckNsYXNzLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnN1YkNsYXNzLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX19KTtpZihzdXBlckNsYXNzKU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3Msc3VwZXJDbGFzcyk6c3ViQ2xhc3MuX19wcm90b19fPXN1cGVyQ2xhc3N9dmFyIFN1YmplY3RDdXN0b209ZnVuY3Rpb24oX1N1YmplY3Qpe19pbmhlcml0cyhTdWJqZWN0Q3VzdG9tLF9TdWJqZWN0KTtmdW5jdGlvbiBTdWJqZWN0Q3VzdG9tKCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsU3ViamVjdEN1c3RvbSk7cmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKFN1YmplY3RDdXN0b20uX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoU3ViamVjdEN1c3RvbSkpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9X2NyZWF0ZUNsYXNzKFN1YmplY3RDdXN0b20sW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyKCl7dmFyIF9wcm9wcz10aGlzLnByb3BzLF9wcm9wcyRjdXN0b209X3Byb3BzLmN1c3RvbSxjdXN0b209X3Byb3BzJGN1c3RvbT09PXVuZGVmaW5lZD8iTTAsMCI6X3Byb3BzJGN1c3RvbSxjdXN0b21JRD1fcHJvcHMuY3VzdG9tSUQsZWRpdE1vZGU9X3Byb3BzLmVkaXRNb2RlLHRyYW5zZm9ybT1fcHJvcHMudHJhbnNmb3JtO3ZhciBoYW5kbGVzPXZvaWQgMDtpZihlZGl0TW9kZSl7aGFuZGxlcz1fcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChfSGFuZGxlMi5kZWZhdWx0LHtoYW5kbGVTdGFydDp0aGlzLnByb3BzLm9uRHJhZ1N0YXJ0LGhhbmRsZVN0b3A6dGhpcy5wcm9wcy5vbkRyYWdFbmQsaGFuZGxlRHJhZzp0aGlzLnByb3BzLmRyYWdTdWJqZWN0fSl9cmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJnIix7Y2xhc3NOYW1lOiJhbm5vdGF0aW9uLXN1YmplY3QifSxfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZyIse3RyYW5zZm9ybTp0cmFuc2Zvcm19LHR5cGVvZiBjdXN0b209PT0ic3RyaW5nIj9fcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgicGF0aCIse2Q6Y3VzdG9tLHBvaW50ZXJFdmVudHM6Im5vbmUifSk6X3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImciLHtwb2ludGVyRXZlbnRzOiJub25lIn0sY3VzdG9tKSxfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgibWFzayIse2lkOmN1c3RvbUlELHBvaW50ZXJFdmVudHM6Im5vbmUifSxfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZyIse3RyYW5zZm9ybTp0cmFuc2Zvcm19LF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJyZWN0Iix7eDoiLTEwMCUiLHk6Ii0xMDAlIixoZWlnaHQ6IjIwMCUiLHdpZHRoOiIyMDAlIixmaWxsOiJ3aGl0ZSIscG9pbnRlckV2ZW50czoibm9uZSJ9KSx0eXBlb2YgY3VzdG9tPT09InN0cmluZyI/X3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtkOmN1c3RvbSxmaWxsOiJibGFjayIscG9pbnRlckV2ZW50czoibm9uZSJ9KTpfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZyIse2ZpbGw6ImJsYWNrIixwb2ludGVyRXZlbnRzOiJub25lIn0sY3VzdG9tLm1hcChmdW5jdGlvbihjLGkpe3JldHVybiBfcmVhY3QyLmRlZmF1bHQuY2xvbmVFbGVtZW50KGMsT2JqZWN0LmFzc2lnbih7fSxjLnByb3BzLHtmaWxsOiJibGFjayIsb3BhY2l0eToxLGtleToiY3VzdG9tU3ViamVjdC0iK2l9KSl9KSksIn0iKSkpLGhhbmRsZXMpfX1dKTtyZXR1cm4gU3ViamVjdEN1c3RvbX0oX1N1YmplY3QzLmRlZmF1bHQpO2V4cG9ydHMuZGVmYXVsdD1TdWJqZWN0Q3VzdG9tO1N1YmplY3RDdXN0b20ucHJvcFR5cGVzPXtlZGl0TW9kZTpfcHJvcFR5cGVzMi5kZWZhdWx0LmJvb2x9fSk7dW53cmFwRXhwb3J0cyhTdWJqZWN0Q3VzdG9tXzEpO3ZhciBhbGlnbm1lbnQ9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCJfX2VzTW9kdWxlIix7dmFsdWU6dHJ1ZX0pO3ZhciBsZWZ0UmlnaHREeW5hbWljPWV4cG9ydHMubGVmdFJpZ2h0RHluYW1pYz1mdW5jdGlvbiBsZWZ0UmlnaHREeW5hbWljKGFsaWduLHkpe2lmKCFhbGlnbnx8YWxpZ249PT0iZHluYW1pYyJ8fGFsaWduPT09ImxlZnQifHxhbGlnbj09PSJyaWdodCIpe2lmKHk8MCl7YWxpZ249InRvcCJ9ZWxzZXthbGlnbj0iYm90dG9tIn19cmV0dXJuIGFsaWdufTt2YXIgdG9wQm90dG9tRHluYW1pYz1leHBvcnRzLnRvcEJvdHRvbUR5bmFtaWM9ZnVuY3Rpb24gdG9wQm90dG9tRHluYW1pYyhhbGlnbix4KXtpZighYWxpZ258fGFsaWduPT09ImR5bmFtaWMifHxhbGlnbj09PSJ0b3AifHxhbGlnbj09PSJib3R0b20iKXtpZih4PDApe2FsaWduPSJyaWdodCJ9ZWxzZXthbGlnbj0ibGVmdCJ9fXJldHVybiBhbGlnbn07dmFyIG9yaWVudGF0aW9uVG9wQm90dG9tPVsidG9wQm90dG9tIiwidG9wIiwiYm90dG9tIl07dmFyIG9yaWVudGF0aW9uTGVmdFJpZ2h0PVsibGVmdFJpZ2h0IiwibGVmdCIsInJpZ2h0Il07ZXhwb3J0cy5kZWZhdWx0PWZ1bmN0aW9uKF9yZWYpe3ZhciBfcmVmJHBhZGRpbmc9X3JlZi5wYWRkaW5nLHBhZGRpbmc9X3JlZiRwYWRkaW5nPT09dW5kZWZpbmVkPzA6X3JlZiRwYWRkaW5nLF9yZWYkYmJveD1fcmVmLmJib3gsYmJveD1fcmVmJGJib3g9PT11bmRlZmluZWQ/e3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MH06X3JlZiRiYm94LGFsaWduPV9yZWYuYWxpZ24sb3JpZW50YXRpb249X3JlZi5vcmllbnRhdGlvbixfcmVmJG9mZnNldD1fcmVmLm9mZnNldCxvZmZzZXQ9X3JlZiRvZmZzZXQ9PT11bmRlZmluZWQ/e3g6MCx5OjB9Ol9yZWYkb2Zmc2V0O3ZhciB4PS1iYm94Lng7dmFyIHk9LWJib3gueTtpZihvcmllbnRhdGlvblRvcEJvdHRvbS5pbmRleE9mKG9yaWVudGF0aW9uKSE9PS0xKXthbGlnbj10b3BCb3R0b21EeW5hbWljKGFsaWduLG9mZnNldC54KTtpZihvZmZzZXQueTwwJiZvcmllbnRhdGlvbj09PSJ0b3BCb3R0b20ifHxvcmllbnRhdGlvbj09PSJ0b3AiKXt5LT1iYm94LmhlaWdodCtwYWRkaW5nfWVsc2V7eSs9cGFkZGluZ31pZihhbGlnbj09PSJtaWRkbGUiKXt4LT1iYm94LndpZHRoLzJ9ZWxzZSBpZihhbGlnbj09PSJyaWdodCIpe3gtPWJib3gud2lkdGh9fWVsc2UgaWYob3JpZW50YXRpb25MZWZ0UmlnaHQuaW5kZXhPZihvcmllbnRhdGlvbikhPT0tMSl7YWxpZ249bGVmdFJpZ2h0RHluYW1pYyhhbGlnbixvZmZzZXQueSk7aWYob2Zmc2V0Lng8MCYmb3JpZW50YXRpb249PT0ibGVmdFJpZ2h0Inx8b3JpZW50YXRpb249PT0ibGVmdCIpe3gtPWJib3gud2lkdGgrcGFkZGluZ31lbHNle3grPXBhZGRpbmd9aWYoYWxpZ249PT0ibWlkZGxlIil7eS09YmJveC5oZWlnaHQvMn1lbHNlIGlmKGFsaWduPT09InRvcCIpe3ktPWJib3guaGVpZ2h0fX1yZXR1cm57eDp4LHk6eX19fSk7dW53cmFwRXhwb3J0cyhhbGlnbm1lbnQpO3ZhciBhbGlnbm1lbnRfMT1hbGlnbm1lbnQubGVmdFJpZ2h0RHluYW1pYzt2YXIgYWxpZ25tZW50XzI9YWxpZ25tZW50LnRvcEJvdHRvbUR5bmFtaWM7dmFyIGxpbmVUeXBlVmVydGljYWw9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCJfX2VzTW9kdWxlIix7dmFsdWU6dHJ1ZX0pO2V4cG9ydHMuZGVmYXVsdD1mdW5jdGlvbihfcmVmKXt2YXIgYWxpZ249X3JlZi5hbGlnbixfcmVmJHg9X3JlZi54LHg9X3JlZiR4PT09dW5kZWZpbmVkPzA6X3JlZiR4LF9yZWYkeT1fcmVmLnkseT1fcmVmJHk9PT11bmRlZmluZWQ/MDpfcmVmJHksYmJveD1fcmVmLmJib3gsb2Zmc2V0PV9yZWYub2Zmc2V0O2FsaWduPSgwLGFsaWdubWVudC5sZWZ0UmlnaHREeW5hbWljKShhbGlnbixvZmZzZXQueSk7aWYoYWxpZ249PT0idG9wIil7eS09YmJveC5oZWlnaHR9ZWxzZSBpZihhbGlnbj09PSJtaWRkbGUiKXt5LT1iYm94LmhlaWdodC8yfXZhciBkYXRhPVtbeCx5XSxbeCx5K2Jib3guaGVpZ2h0XV07cmV0dXJue2NvbXBvbmVudHM6WygwLEJ1aWxkZXIubGluZUJ1aWxkZXIpKHtkYXRhOmRhdGEsY2xhc3NOYW1lOiJub3RlLWxpbmUifSldfX19KTt1bndyYXBFeHBvcnRzKGxpbmVUeXBlVmVydGljYWwpO3ZhciBsaW5lVHlwZUhvcml6b250YWw9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCJfX2VzTW9kdWxlIix7dmFsdWU6dHJ1ZX0pO2V4cG9ydHMuZGVmYXVsdD1mdW5jdGlvbihfcmVmKXt2YXIgYWxpZ249X3JlZi5hbGlnbixfcmVmJHg9X3JlZi54LHg9X3JlZiR4PT09dW5kZWZpbmVkPzA6X3JlZiR4LF9yZWYkeT1fcmVmLnkseT1fcmVmJHk9PT11bmRlZmluZWQ/MDpfcmVmJHksb2Zmc2V0PV9yZWYub2Zmc2V0LGJib3g9X3JlZi5iYm94O2FsaWduPSgwLGFsaWdubWVudC50b3BCb3R0b21EeW5hbWljKShhbGlnbixvZmZzZXQueCk7aWYoYWxpZ249PT0icmlnaHQiKXt4LT1iYm94LndpZHRofWVsc2UgaWYoYWxpZ249PT0ibWlkZGxlIil7eC09YmJveC53aWR0aC8yfXZhciBkYXRhPVtbeCx5XSxbeCtiYm94LndpZHRoLHldXTtyZXR1cm57Y29tcG9uZW50czpbKDAsQnVpbGRlci5saW5lQnVpbGRlcikoe2RhdGE6ZGF0YSxjbGFzc05hbWU6Im5vdGUtbGluZSJ9KV19fX0pO3Vud3JhcEV4cG9ydHMobGluZVR5cGVIb3Jpem9udGFsKTt2YXIgTm90ZV8xPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywiX19lc01vZHVsZSIse3ZhbHVlOnRydWV9KTt2YXIgX2V4dGVuZHMkJDE9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odGFyZ2V0KXtmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXt2YXIgc291cmNlPWFyZ3VtZW50c1tpXTtmb3IodmFyIGtleSBpbiBzb3VyY2Upe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2Usa2V5KSl7dGFyZ2V0W2tleV09c291cmNlW2tleV19fX1yZXR1cm4gdGFyZ2V0fTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQscHJvcHMpe2Zvcih2YXIgaT0wO2k8cHJvcHMubGVuZ3RoO2krKyl7dmFyIGRlc2NyaXB0b3I9cHJvcHNbaV07ZGVzY3JpcHRvci5lbnVtZXJhYmxlPWRlc2NyaXB0b3IuZW51bWVyYWJsZXx8ZmFsc2U7ZGVzY3JpcHRvci5jb25maWd1cmFibGU9dHJ1ZTtpZigidmFsdWUiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKX19cmV0dXJuIGZ1bmN0aW9uKENvbnN0cnVjdG9yLHByb3RvUHJvcHMsc3RhdGljUHJvcHMpe2lmKHByb3RvUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUscHJvdG9Qcm9wcyk7aWYoc3RhdGljUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3RvcixzdGF0aWNQcm9wcyk7cmV0dXJuIENvbnN0cnVjdG9yfX0oKTt2YXIgX3JlYWN0Mj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KFJlYWN0KTt2YXIgX2FsaWdubWVudDU9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChhbGlnbm1lbnQpO3ZhciBfSGFuZGxlMj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KEhhbmRsZV8xKTt2YXIgX2xpbmVUeXBlVmVydGljYWwyPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQobGluZVR5cGVWZXJ0aWNhbCk7dmFyIF9saW5lVHlwZUhvcml6b250YWwyPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQobGluZVR5cGVIb3Jpem9udGFsKTt2YXIgX3Byb3BUeXBlczI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChwcm9wVHlwZXMpO2Z1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKXtyZXR1cm4gb2JqJiZvYmouX19lc01vZHVsZT9vYmo6e2RlZmF1bHQ6b2JqfX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpfXJldHVybiBjYWxsJiYoKHR5cGVvZiBjYWxsPT09InVuZGVmaW5lZCI/InVuZGVmaW5lZCI6X3R5cGVvZihjYWxsKSk9PT0ib2JqZWN0Inx8dHlwZW9mIGNhbGw9PT0iZnVuY3Rpb24iKT9jYWxsOnNlbGZ9ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLHN1cGVyQ2xhc3Mpe2lmKHR5cGVvZiBzdXBlckNsYXNzIT09ImZ1bmN0aW9uIiYmc3VwZXJDbGFzcyE9PW51bGwpe3Rocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIisodHlwZW9mIHN1cGVyQ2xhc3M9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKHN1cGVyQ2xhc3MpKSl9c3ViQ2xhc3MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyYmc3VwZXJDbGFzcy5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpzdWJDbGFzcyxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9fSk7aWYoc3VwZXJDbGFzcylPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLHN1cGVyQ2xhc3MpOnN1YkNsYXNzLl9fcHJvdG9fXz1zdXBlckNsYXNzfXZhciBnZXRPdXRlckJCb3g9ZnVuY3Rpb24gZ2V0T3V0ZXJCQm94KCl7Zm9yKHZhciBfbGVuPWFyZ3VtZW50cy5sZW5ndGgsZG9tTm9kZXM9QXJyYXkoX2xlbiksX2tleT0wO19rZXk8X2xlbjtfa2V5Kyspe2RvbU5vZGVzW19rZXldPWFyZ3VtZW50c1tfa2V5XX1yZXR1cm5bXS5jb25jYXQoZG9tTm9kZXMpLnJlZHVjZShmdW5jdGlvbihwLGMpe2lmKGMpe3ZhciBiYm94PWMuZ2V0QkJveCgpO3AueD1NYXRoLm1pbihwLngsYmJveC54KTtwLnk9TWF0aC5taW4ocC55LGJib3gueSk7cC53aWR0aD1NYXRoLm1heChwLndpZHRoLGJib3gud2lkdGgpO3ZhciB5T2Zmc2V0PWMmJmMuYXR0cmlidXRlcyYmYy5hdHRyaWJ1dGVzLnk7cC5oZWlnaHQ9TWF0aC5tYXgocC5oZWlnaHQsKHlPZmZzZXQmJnBhcnNlRmxvYXQoeU9mZnNldC52YWx1ZSl8fDApK2Jib3guaGVpZ2h0KX1yZXR1cm4gcH0se3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MH0pfTt2YXIgTm90ZT1mdW5jdGlvbihfUmVhY3QkQ29tcG9uZW50KXtfaW5oZXJpdHMoTm90ZSxfUmVhY3QkQ29tcG9uZW50KTtmdW5jdGlvbiBOb3RlKHByb3BzKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxOb3RlKTt2YXIgX3RoaXM9X3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywoTm90ZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihOb3RlKSkuY2FsbCh0aGlzLHByb3BzKSk7X3RoaXMuc3RhdGU9e3RyYW5zbGF0ZVg6MCx0cmFuc2xhdGVZOjAsbGFiZWxPZmZzZXQ6MCxjaGFuZ2VkOjAsYmJveDp7d2lkdGg6MCxoZWlnaHQ6MCx4OjAseTowfX07X3RoaXMudXBkYXRlVGV4dD1fdGhpcy51cGRhdGVUZXh0LmJpbmQoX3RoaXMpO3JldHVybiBfdGhpc31fY3JlYXRlQ2xhc3MoTm90ZSxbe2tleToiY29tcG9uZW50RGlkTW91bnQiLHZhbHVlOmZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCl7dGhpcy51cGRhdGVUZXh0KHRoaXMucHJvcHMpfX0se2tleToiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpe2lmKG5leHRQcm9wcy50aXRsZSE9PXRoaXMucHJvcHMudGl0bGV8fG5leHRQcm9wcy5sYWJlbCE9PXRoaXMucHJvcHMubGFiZWx8fG5leHRQcm9wcy53cmFwIT09dGhpcy5wcm9wcy53cmFwKXt0aGlzLnVwZGF0ZVRleHQobmV4dFByb3BzKX1pZihuZXh0UHJvcHMuZWRpdE1vZGUmJihuZXh0UHJvcHMuYWxpZ249PT0iZHluYW1pYyJ8fCFuZXh0UHJvcHMuYWxpZ24pKXt0aGlzLnVwZGF0ZVRleHQobmV4dFByb3BzKX19fSx7a2V5OiJ1cGRhdGVUZXh0Iix2YWx1ZTpmdW5jdGlvbiB1cGRhdGVUZXh0KF9yZWYpe3ZhciBfdGhpczI9dGhpczt2YXIgb3JpZW50YXRpb249X3JlZi5vcmllbnRhdGlvbixwYWRkaW5nPV9yZWYucGFkZGluZyxhbGlnbj1fcmVmLmFsaWduLGxpbmVUeXBlPV9yZWYubGluZVR5cGUsbGFiZWw9X3JlZi5sYWJlbCx0aXRsZT1fcmVmLnRpdGxlLHdyYXA9X3JlZi53cmFwLHdyYXBTcGxpdHRlcj1fcmVmLndyYXBTcGxpdHRlcixkeD1fcmVmLmR4LGR5PV9yZWYuZHk7dmFyIG5ld1N0YXRlPXt0aXRsZVdyYXBwZWQ6bnVsbCxsYWJlbFdyYXBwZWQ6bnVsbH07bmV3U3RhdGUuY2hhbmdlZD10aGlzLnN0YXRlLmNoYW5nZWQrMTtpZih0aXRsZSl7bmV3U3RhdGUudGl0bGVXcmFwcGVkPXRoaXMucmVmcy50aXRsZSYmdGhpcy53cmFwVGV4dCh0aGlzLnJlZnMudGl0bGUsbmV3U3RhdGUuY2hhbmdlZCx0aXRsZSx3cmFwLHdyYXBTcGxpdHRlcil9aWYobGFiZWwpbmV3U3RhdGUubGFiZWxXcmFwcGVkPXRoaXMucmVmcy5sYWJlbCYmdGhpcy53cmFwVGV4dCh0aGlzLnJlZnMubGFiZWwsbmV3U3RhdGUuY2hhbmdlZCxsYWJlbCx3cmFwLHdyYXBTcGxpdHRlcik7dGhpcy5zZXRTdGF0ZShuZXdTdGF0ZSxmdW5jdGlvbigpe3ZhciBzZXRMYWJlbD1mdW5jdGlvbiBzZXRMYWJlbCgpe3ZhciBiYm94PWdldE91dGVyQkJveChfdGhpczIucmVmcy50aXRsZSxfdGhpczIucmVmcy5sYWJlbCk7dmFyIG5vdGVQYXJhbXM9e3BhZGRpbmc6cGFkZGluZyxiYm94OmJib3gsb2Zmc2V0Ont4OmR4LHk6ZHl9LG9yaWVudGF0aW9uOm9yaWVudGF0aW9uLGFsaWduOmFsaWdufTtpZihsaW5lVHlwZT09PSJ2ZXJ0aWNhbCIpbm90ZVBhcmFtcy5vcmllbnRhdGlvbj0ibGVmdFJpZ2h0IjtlbHNlIGlmKGxpbmVUeXBlPT09Imhvcml6b250YWwiKW5vdGVQYXJhbXMub3JpZW50YXRpb249InRvcEJvdHRvbSI7dmFyIF9hbGlnbm1lbnQkJDE9KDAsX2FsaWdubWVudDUuZGVmYXVsdCkobm90ZVBhcmFtcykseD1fYWxpZ25tZW50JCQxLngseT1fYWxpZ25tZW50JCQxLnk7X3RoaXMyLnNldFN0YXRlKHt0cmFuc2xhdGVYOngsdHJhbnNsYXRlWTp5LGJib3g6YmJveH0pfTtfdGhpczIuc2V0U3RhdGUoe2xhYmVsT2Zmc2V0OnRpdGxlJiZfdGhpczIucmVmcy50aXRsZS5nZXRCQm94KCkuaGVpZ2h0fHwwfSxzZXRMYWJlbCl9KX19LHtrZXk6IndyYXBUZXh0Iix2YWx1ZTpmdW5jdGlvbiB3cmFwVGV4dCh0ZXh0UmVmLGtleSx0ZXh0LHdpZHRoLHdyYXBTcGxpdHRlcil7dmFyIGluaXRpYWxBdHRycz17eDowLGR5OiIxLjJlbSJ9O3ZhciB3b3Jkcz10ZXh0LnNwbGl0KHdyYXBTcGxpdHRlcnx8L1sgXHRcclxuXSsvKS5yZXZlcnNlKCkuZmlsdGVyKGZ1bmN0aW9uKHcpe3JldHVybiB3IT09IiJ9KTt2YXIgd29yZD12b2lkIDAsbGluZT1bXTt2YXIgdHNwYW5zPVtdO3doaWxlKHdvcmQ9d29yZHMucG9wKCkpe2xpbmUucHVzaCh3b3JkKTt0ZXh0UmVmLmxhc3RDaGlsZC50ZXh0Q29udGVudD1saW5lLmpvaW4oIiAiKTt2YXIgbGVuZ3RoPXRleHRSZWYubGFzdENoaWxkLmdldENvbXB1dGVkVGV4dExlbmd0aCgpO3RleHRSZWYubGFzdENoaWxkLnRleHRDb250ZW50PSIiO2lmKGxlbmd0aD53aWR0aCYmbGluZS5sZW5ndGg+MSl7bGluZS5wb3AoKTt0c3BhbnMucHVzaChfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgidHNwYW4iLF9leHRlbmRzJCQxKHtrZXk6dHNwYW5zLmxlbmd0aCt0ZXh0fSxpbml0aWFsQXR0cnMpLGxpbmUuam9pbigiICIpKSk7bGluZT1bd29yZF19fWlmKGxpbmUubGVuZ3RoIT09MCl7dHNwYW5zLnB1c2goX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInRzcGFuIixfZXh0ZW5kcyQkMSh7a2V5OnRzcGFucy5sZW5ndGgrdGV4dH0saW5pdGlhbEF0dHJzKSxsaW5lLmpvaW4oIiAiKSkpfXJldHVybiBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgidHNwYW4iLF9leHRlbmRzJCQxKHt9LGluaXRpYWxBdHRycyx7a2V5OmtleSt0ZXh0fSksdHNwYW5zKX19LHtrZXk6ImNvbXBvbmVudERpZFVwZGF0ZSIsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcyl7dmFyIF9wcm9wcz10aGlzLnByb3BzLG9yaWVudGF0aW9uPV9wcm9wcy5vcmllbnRhdGlvbixwYWRkaW5nPV9wcm9wcy5wYWRkaW5nLGFsaWduPV9wcm9wcy5hbGlnbixkeD1fcHJvcHMuZHgsZHk9X3Byb3BzLmR5LGxpbmVUeXBlPV9wcm9wcy5saW5lVHlwZTtpZih0aGlzLnN0YXRlLmJib3gud2lkdGgmJihwcmV2UHJvcHMuZHghPT10aGlzLnByb3BzLmR4fHxwcmV2UHJvcHMuZHkhPT10aGlzLnByb3BzLmR5KSYmKHRoaXMucmVmcy50aXRsZXx8dGhpcy5yZWZzLmxhYmVsKSl7dmFyIGJib3g9Z2V0T3V0ZXJCQm94KHRoaXMucmVmcy50aXRsZSx0aGlzLnJlZnMubGFiZWwpO3ZhciBub3RlUGFyYW1zPXtwYWRkaW5nOnBhZGRpbmcsYmJveDpiYm94LG9mZnNldDp7eDpkeCx5OmR5fSxvcmllbnRhdGlvbjpvcmllbnRhdGlvbixhbGlnbjphbGlnbn07aWYobGluZVR5cGU9PT0idmVydGljYWwiKW5vdGVQYXJhbXMub3JpZW50YXRpb249ImxlZnRSaWdodCI7ZWxzZSBpZihsaW5lVHlwZT09PSJob3Jpem9udGFsIilub3RlUGFyYW1zLm9yaWVudGF0aW9uPSJ0b3BCb3R0b20iO3ZhciBfYWxpZ25tZW50Mj0oMCxfYWxpZ25tZW50NS5kZWZhdWx0KShub3RlUGFyYW1zKSx4PV9hbGlnbm1lbnQyLngseT1fYWxpZ25tZW50Mi55O3ZhciB1cGRhdGVzPXtiYm94OmJib3h9O2lmKHRoaXMuc3RhdGUudHJhbnNsYXRlWCE9PXgpdXBkYXRlcy50cmFuc2xhdGVYPXg7aWYodGhpcy5zdGF0ZS50cmFuc2xhdGVZIT09eSl1cGRhdGVzLnRyYW5zbGF0ZVk9eTtpZih1cGRhdGVzLnRyYW5zbGF0ZVghPT11bmRlZmluZWR8fHVwZGF0ZXMudHJhbnNsYXRlWSE9PXVuZGVmaW5lZCl7dGhpcy5zZXRTdGF0ZSh1cGRhdGVzKX19ZWxzZSBpZih0aGlzLnN0YXRlLmFsaWduIT09cHJldlByb3BzLmFsaWdufHx0aGlzLnByb3BzLm9yaWVudGF0aW9uIT09cHJldlByb3BzLm9yaWVudGF0aW9ufHx0aGlzLnByb3BzLnBhZGRpbmchPT1wcmV2UHJvcHMucGFkZGluZyl7dmFyIF9ub3RlUGFyYW1zPXtwYWRkaW5nOnBhZGRpbmcsYmJveDp0aGlzLnN0YXRlLmJib3gsb2Zmc2V0Ont4OmR4LHk6ZHl9LG9yaWVudGF0aW9uOm9yaWVudGF0aW9uLGFsaWduOmFsaWdufTtpZihsaW5lVHlwZT09PSJ2ZXJ0aWNhbCIpX25vdGVQYXJhbXMub3JpZW50YXRpb249ImxlZnRSaWdodCI7ZWxzZSBpZihsaW5lVHlwZT09PSJob3Jpem9udGFsIilfbm90ZVBhcmFtcy5vcmllbnRhdGlvbj0idG9wQm90dG9tIjt2YXIgX2FsaWdubWVudDM9KDAsX2FsaWdubWVudDUuZGVmYXVsdCkoX25vdGVQYXJhbXMpLF94PV9hbGlnbm1lbnQzLngsX3k9X2FsaWdubWVudDMueTt2YXIgX3VwZGF0ZXM9e307aWYodGhpcy5zdGF0ZS50cmFuc2xhdGVYIT09X3gpX3VwZGF0ZXMudHJhbnNsYXRlWD1feDtpZih0aGlzLnN0YXRlLnRyYW5zbGF0ZVkhPT1feSlfdXBkYXRlcy50cmFuc2xhdGVZPV95O2lmKF91cGRhdGVzLnRyYW5zbGF0ZVghPT11bmRlZmluZWR8fF91cGRhdGVzLnRyYW5zbGF0ZVkhPT11bmRlZmluZWQpe3RoaXMuc2V0U3RhdGUoX3VwZGF0ZXMpfX19fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3ZhciBfcHJvcHMyPXRoaXMucHJvcHMsZHg9X3Byb3BzMi5keCxkeT1fcHJvcHMyLmR5LHRpdGxlPV9wcm9wczIudGl0bGUsbGFiZWw9X3Byb3BzMi5sYWJlbCxhbGlnbj1fcHJvcHMyLmFsaWduLGVkaXRNb2RlPV9wcm9wczIuZWRpdE1vZGUsbGluZVR5cGU9X3Byb3BzMi5saW5lVHlwZSxjb2xvcj1fcHJvcHMyLmNvbG9yLHRpdGxlQ29sb3I9X3Byb3BzMi50aXRsZUNvbG9yLGxhYmVsQ29sb3I9X3Byb3BzMi5sYWJlbENvbG9yO3ZhciBub3RlVGl0bGU9dm9pZCAwLG5vdGVUZXh0PXZvaWQgMCxub3RlTGluZVR5cGU9dm9pZCAwO2lmKHRpdGxlKXtub3RlVGl0bGU9X3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInRleHQiLHtyZWY6InRpdGxlIixjbGFzc05hbWU6ImFubm90YXRpb24tbm90ZS10aXRsZSIsZm9udFdlaWdodDoiYm9sZCIsa2V5OiJ0aXRsZSIsZmlsbDp0aXRsZUNvbG9yfHxjb2xvcn0sdGhpcy5zdGF0ZS50aXRsZVdyYXBwZWR8fF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJ0c3BhbiIse3g6MCxkeToiLjhlbSJ9LHRpdGxlKSl9aWYobGFiZWwpe25vdGVUZXh0PV9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJ0ZXh0Iix7cmVmOiJsYWJlbCIsY2xhc3NOYW1lOiJhbm5vdGF0aW9uLW5vdGUtbGFiZWwiLHk6dGhpcy5zdGF0ZS5sYWJlbE9mZnNldCoxLjEsa2V5OiJsYWJlbCIsZmlsbDpsYWJlbENvbG9yfHxjb2xvcn0sdGhpcy5zdGF0ZS5sYWJlbFdyYXBwZWR8fF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJ0c3BhbiIse3g6MCxkeToiLjhlbSJ9LGxhYmVsKSl9aWYobGluZVR5cGUmJnRoaXMuc3RhdGUuYmJveC53aWR0aCl7dmFyIG5vdGVQYXJhbXM9e2Jib3g6dGhpcy5zdGF0ZS5iYm94LGFsaWduOmFsaWduLG9mZnNldDp7eDpkeCx5OmR5fX07dmFyIG5vdGVDb21wb25lbnQ9KGxpbmVUeXBlPT09InZlcnRpY2FsIiYmKDAsX2xpbmVUeXBlVmVydGljYWwyLmRlZmF1bHQpKG5vdGVQYXJhbXMpfHxsaW5lVHlwZT09PSJob3Jpem9udGFsIiYmKDAsX2xpbmVUeXBlSG9yaXpvbnRhbDIuZGVmYXVsdCkobm90ZVBhcmFtcykpLmNvbXBvbmVudHNbMF07bm90ZUxpbmVUeXBlPV9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG5vdGVDb21wb25lbnQudHlwZSxfZXh0ZW5kcyQkMSh7Y2xhc3NOYW1lOm5vdGVDb21wb25lbnQuY2xhc3NOYW1lfSxub3RlQ29tcG9uZW50LmF0dHJzLHtzdHJva2U6Y29sb3J9KSl9dmFyIGhhbmRsZT12b2lkIDA7aWYoZWRpdE1vZGUpe2hhbmRsZT1fcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChfSGFuZGxlMi5kZWZhdWx0LHtoYW5kbGVTdGFydDp0aGlzLnByb3BzLmRyYWdTdGFydCxoYW5kbGVTdG9wOnRoaXMucHJvcHMuZHJhZ0VuZCxoYW5kbGVEcmFnOnRoaXMucHJvcHMuZHJhZ05vdGV9KX1yZXR1cm4gX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImciLF9leHRlbmRzJCQxKHt0cmFuc2Zvcm06InRyYW5zbGF0ZSgiK2R4KyIsICIrZHkrIikiLGNsYXNzTmFtZToiYW5ub3RhdGlvbi1ub3RlIn0sdGhpcy5wcm9wcy5nUHJvcHMpLF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJnIix7Y2xhc3NOYW1lOiJhbm5vdGF0aW9uLW5vdGUtY29udGVudCIsdHJhbnNmb3JtOiJ0cmFuc2xhdGUoIit0aGlzLnN0YXRlLnRyYW5zbGF0ZVgrIixcbiAgICAgICAgICAiK3RoaXMuc3RhdGUudHJhbnNsYXRlWSsiKSIscmVmOiJub3RlIn0sX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInJlY3QiLHtjbGFzc05hbWU6ImFubm90YXRpb24tbm90ZS1iZyIsd2lkdGg6dGhpcy5zdGF0ZS5iYm94LndpZHRoLGhlaWdodDp0aGlzLnN0YXRlLmJib3guaGVpZ2h0LHN0cm9rZToibm9uZSIsZmlsbDoid2hpdGUiLGZpbGxPcGFjaXR5OiIwIn0pLG5vdGVUaXRsZSxub3RlVGV4dCksbm90ZUxpbmVUeXBlLGhhbmRsZSl9fV0pO3JldHVybiBOb3RlfShfcmVhY3QyLmRlZmF1bHQuQ29tcG9uZW50KTtleHBvcnRzLmRlZmF1bHQ9Tm90ZTtOb3RlLmRlZmF1bHRQcm9wcz17d3JhcDoxMjAsYWxpZ246ImR5bmFtaWMiLG9yaWVudGF0aW9uOiJ0b3BCb3R0b20iLHBhZGRpbmc6M307Tm90ZS5wcm9wVHlwZXM9e2R4Ol9wcm9wVHlwZXMyLmRlZmF1bHQubnVtYmVyLGR5Ol9wcm9wVHlwZXMyLmRlZmF1bHQubnVtYmVyLHRpdGxlOl9wcm9wVHlwZXMyLmRlZmF1bHQuc3RyaW5nLGxhYmVsOl9wcm9wVHlwZXMyLmRlZmF1bHQuc3RyaW5nLG9yaWVudGF0aW9uOl9wcm9wVHlwZXMyLmRlZmF1bHQub25lT2YoWyJsZWZ0UmlnaHQiLCJ0b3BCb3R0b20iXSkscGFkZGluZzpfcHJvcFR5cGVzMi5kZWZhdWx0Lm51bWJlcixhbGlnbjpfcHJvcFR5cGVzMi5kZWZhdWx0Lm9uZU9mKFsibGVmdCIsInJpZ2h0IiwibWlkZGxlIiwidG9wIiwiYm90dG9tIiwiZHluYW1pYyJdKSxlZGl0TW9kZTpfcHJvcFR5cGVzMi5kZWZhdWx0LmJvb2wsbGluZVR5cGU6X3Byb3BUeXBlczIuZGVmYXVsdC5vbmVPZihbInZlcnRpY2FsIiwiaG9yaXpvbnRhbCJdKSxjb2xvcjpfcHJvcFR5cGVzMi5kZWZhdWx0LnN0cmluZyx0aXRsZUNvbG9yOl9wcm9wVHlwZXMyLmRlZmF1bHQuc3RyaW5nLGxhYmVsQ29sb3I6X3Byb3BUeXBlczIuZGVmYXVsdC5zdHJpbmd9fSk7dW53cmFwRXhwb3J0cyhOb3RlXzEpO3ZhciBCcmFja2V0Tm90ZV8xPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywiX19lc01vZHVsZSIse3ZhbHVlOnRydWV9KTt2YXIgX2V4dGVuZHM9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odGFyZ2V0KXtmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXt2YXIgc291cmNlPWFyZ3VtZW50c1tpXTtmb3IodmFyIGtleSBpbiBzb3VyY2Upe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2Usa2V5KSl7dGFyZ2V0W2tleV09c291cmNlW2tleV19fX1yZXR1cm4gdGFyZ2V0fTtleHBvcnRzLmRlZmF1bHQ9QnJhY2tldE5vdGU7dmFyIF9yZWFjdDI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChSZWFjdCk7dmFyIF9Ob3RlMj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KE5vdGVfMSk7ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmope3JldHVybiBvYmomJm9iai5fX2VzTW9kdWxlP29iajp7ZGVmYXVsdDpvYmp9fWZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhvYmosa2V5cyl7dmFyIHRhcmdldD17fTtmb3IodmFyIGkgaW4gb2JqKXtpZihrZXlzLmluZGV4T2YoaSk+PTApY29udGludWU7aWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosaSkpY29udGludWU7dGFyZ2V0W2ldPW9ialtpXX1yZXR1cm4gdGFyZ2V0fWZ1bmN0aW9uIEJyYWNrZXROb3RlKF9yZWYpe3ZhciB3aWR0aD1fcmVmLndpZHRoLGhlaWdodD1fcmVmLmhlaWdodCxkZXB0aD1fcmVmLmRlcHRoLHJlc3Q9X29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYsWyJ3aWR0aCIsImhlaWdodCIsImRlcHRoIl0pO3ZhciBkeD1yZXN0LmR4LG9yaWVudGF0aW9uPXZvaWQgMCxhbGlnbj0ibWlkZGxlIixkeT1yZXN0LmR5O2lmKGhlaWdodCl7aWYoIWR5KWR5PWhlaWdodC8yO2lmKCFkeClkeD1kZXB0aDtvcmllbnRhdGlvbj0ibGVmdFJpZ2h0In1lbHNlIGlmKHdpZHRoKXtpZighZHgpZHg9d2lkdGgvMjtpZighZHkpZHk9ZGVwdGg7b3JpZW50YXRpb249InRvcEJvdHRvbSJ9cmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF9Ob3RlMi5kZWZhdWx0LF9leHRlbmRzKHthbGlnbjphbGlnbixvcmllbnRhdGlvbjpvcmllbnRhdGlvbixwYWRkaW5nOjEwfSxyZXN0LHtlZGl0TW9kZTpmYWxzZSxkeDpkeCxkeTpkeX0pKX19KTt1bndyYXBFeHBvcnRzKEJyYWNrZXROb3RlXzEpO3ZhciBjbGFzc25hbWVzPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKG1vZHVsZSl7KGZ1bmN0aW9uKCl7dmFyIGhhc093bj17fS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBjbGFzc05hbWVzKCl7dmFyIGNsYXNzZXM9W107Zm9yKHZhciBpPTA7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIGFyZz1hcmd1bWVudHNbaV07aWYoIWFyZyljb250aW51ZTt2YXIgYXJnVHlwZT10eXBlb2YgYXJnPT09InVuZGVmaW5lZCI/InVuZGVmaW5lZCI6X3R5cGVvZihhcmcpO2lmKGFyZ1R5cGU9PT0ic3RyaW5nInx8YXJnVHlwZT09PSJudW1iZXIiKXtjbGFzc2VzLnB1c2goYXJnKX1lbHNlIGlmKEFycmF5LmlzQXJyYXkoYXJnKSl7Y2xhc3Nlcy5wdXNoKGNsYXNzTmFtZXMuYXBwbHkobnVsbCxhcmcpKX1lbHNlIGlmKGFyZ1R5cGU9PT0ib2JqZWN0Iil7Zm9yKHZhciBrZXkgaW4gYXJnKXtpZihoYXNPd24uY2FsbChhcmcsa2V5KSYmYXJnW2tleV0pe2NsYXNzZXMucHVzaChrZXkpfX19fXJldHVybiBjbGFzc2VzLmpvaW4oIiAiKX1pZigib2JqZWN0IiE9PSJ1bmRlZmluZWQiJiZtb2R1bGUuZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9Y2xhc3NOYW1lc31lbHNlIGlmKHR5cGVvZiB1bmRlZmluZWQ9PT0iZnVuY3Rpb24iJiZfdHlwZW9mKHVuZGVmaW5lZC5hbWQpPT09Im9iamVjdCImJnVuZGVmaW5lZC5hbWQpe3VuZGVmaW5lZCgiY2xhc3NuYW1lcyIsW10sZnVuY3Rpb24oKXtyZXR1cm4gY2xhc3NOYW1lc30pfWVsc2V7d2luZG93LmNsYXNzTmFtZXM9Y2xhc3NOYW1lc319KSgpfSk7dmFyIEFubm90YXRpb25fMT1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTp0cnVlfSk7dmFyIF9leHRlbmRzJCQxPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHRhcmdldCl7Zm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIHNvdXJjZT1hcmd1bWVudHNbaV07Zm9yKHZhciBrZXkgaW4gc291cmNlKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkpe3RhcmdldFtrZXldPXNvdXJjZVtrZXldfX19cmV0dXJuIHRhcmdldH07dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoInZhbHVlImluIGRlc2NyaXB0b3IpZGVzY3JpcHRvci53cml0YWJsZT10cnVlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsZGVzY3JpcHRvci5rZXksZGVzY3JpcHRvcil9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcn19KCk7dmFyIF9yZWFjdDI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChSZWFjdCk7dmFyIF9jbGFzc25hbWVzMj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KGNsYXNzbmFtZXMpO3ZhciBfcHJvcFR5cGVzMj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KHByb3BUeXBlcyk7ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmope3JldHVybiBvYmomJm9iai5fX2VzTW9kdWxlP29iajp7ZGVmYXVsdDpvYmp9fWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSxDb25zdHJ1Y3Rvcil7aWYoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsY2FsbCl7aWYoIXNlbGYpe3Rocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIil9cmV0dXJuIGNhbGwmJigodHlwZW9mIGNhbGw9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKGNhbGwpKT09PSJvYmplY3QifHx0eXBlb2YgY2FsbD09PSJmdW5jdGlvbiIpP2NhbGw6c2VsZn1mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT0iZnVuY3Rpb24iJiZzdXBlckNsYXNzIT09bnVsbCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiKyh0eXBlb2Ygc3VwZXJDbGFzcz09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2Yoc3VwZXJDbGFzcykpKX1zdWJDbGFzcy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzJiZzdXBlckNsYXNzLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnN1YkNsYXNzLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX19KTtpZihzdXBlckNsYXNzKU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3Msc3VwZXJDbGFzcyk6c3ViQ2xhc3MuX19wcm90b19fPXN1cGVyQ2xhc3N9dmFyIEFubm90YXRpb249ZnVuY3Rpb24oX1JlYWN0JENvbXBvbmVudCl7X2luaGVyaXRzKEFubm90YXRpb24sX1JlYWN0JENvbXBvbmVudCk7ZnVuY3Rpb24gQW5ub3RhdGlvbigpe19jbGFzc0NhbGxDaGVjayh0aGlzLEFubm90YXRpb24pO3JldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLChBbm5vdGF0aW9uLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKEFubm90YXRpb24pKS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfV9jcmVhdGVDbGFzcyhBbm5vdGF0aW9uLFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3ZhciBfcHJvcHM9dGhpcy5wcm9wcyx4PV9wcm9wcy54LHk9X3Byb3BzLnksbng9X3Byb3BzLm54LG55PV9wcm9wcy5ueSxldmVudHM9X3Byb3BzLmV2ZW50czt2YXIgY2xlYW5lZFByb3BzPU9iamVjdC5hc3NpZ24oe30sdGhpcy5wcm9wcyk7ZGVsZXRlIGNsZWFuZWRQcm9wcy5jaGlsZHJlbjtpZihueCE9PXVuZGVmaW5lZCljbGVhbmVkUHJvcHMuZHg9bngteDtpZihueSE9PXVuZGVmaW5lZCljbGVhbmVkUHJvcHMuZHk9bnkteTt2YXIgY2hpbGRyZW5XaXRoUHJvcHM9X3JlYWN0Mi5kZWZhdWx0LkNoaWxkcmVuLnRvQXJyYXkodGhpcy5wcm9wcy5jaGlsZHJlbikubWFwKGZ1bmN0aW9uKGNoaWxkKXtyZXR1cm4gX3JlYWN0Mi5kZWZhdWx0LmNsb25lRWxlbWVudChjaGlsZCxfZXh0ZW5kcyQkMSh7fSxjbGVhbmVkUHJvcHMsY2hpbGQucHJvcHMpKX0pO3JldHVybiBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZyIsX2V4dGVuZHMkJDEoe2NsYXNzTmFtZTooMCxfY2xhc3NuYW1lczIuZGVmYXVsdCkoImFubm90YXRpb24iLHRoaXMucHJvcHMuY2xhc3NOYW1lKSx0cmFuc2Zvcm06InRyYW5zbGF0ZSgiK3grIiwgIit5KyIpIn0sZXZlbnRzKSxjaGlsZHJlbldpdGhQcm9wcyl9fV0pO3JldHVybiBBbm5vdGF0aW9ufShfcmVhY3QyLmRlZmF1bHQuQ29tcG9uZW50KTtleHBvcnRzLmRlZmF1bHQ9QW5ub3RhdGlvbjtBbm5vdGF0aW9uLmRlZmF1bHRQcm9wcz17eDowLHk6MCxkeDowLGR5OjAsY29sb3I6ImdyZXkifTtBbm5vdGF0aW9uLnByb3BUeXBlcz17eDpfcHJvcFR5cGVzMi5kZWZhdWx0Lm51bWJlcix5Ol9wcm9wVHlwZXMyLmRlZmF1bHQubnVtYmVyLGR4Ol9wcm9wVHlwZXMyLmRlZmF1bHQubnVtYmVyLGR5Ol9wcm9wVHlwZXMyLmRlZmF1bHQubnVtYmVyLGNvbG9yOl9wcm9wVHlwZXMyLmRlZmF1bHQuc3RyaW5nLGVkaXRNb2RlOl9wcm9wVHlwZXMyLmRlZmF1bHQuYm9vbCxldmVudHM6X3Byb3BUeXBlczIuZGVmYXVsdC5vYmplY3R9fSk7dW53cmFwRXhwb3J0cyhBbm5vdGF0aW9uXzEpO3ZhciBFZGl0YWJsZUFubm90YXRpb25fMT1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTp0cnVlfSk7dmFyIF9leHRlbmRzJCQxPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHRhcmdldCl7Zm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIHNvdXJjZT1hcmd1bWVudHNbaV07Zm9yKHZhciBrZXkgaW4gc291cmNlKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkpe3RhcmdldFtrZXldPXNvdXJjZVtrZXldfX19cmV0dXJuIHRhcmdldH07dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoInZhbHVlImluIGRlc2NyaXB0b3IpZGVzY3JpcHRvci53cml0YWJsZT10cnVlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsZGVzY3JpcHRvci5rZXksZGVzY3JpcHRvcil9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcn19KCk7dmFyIF9yZWFjdDI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChSZWFjdCk7dmFyIF9Bbm5vdGF0aW9uMj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KEFubm90YXRpb25fMSk7dmFyIF9jbGFzc25hbWVzMj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KGNsYXNzbmFtZXMpO2Z1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKXtyZXR1cm4gb2JqJiZvYmouX19lc01vZHVsZT9vYmo6e2RlZmF1bHQ6b2JqfX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpfXJldHVybiBjYWxsJiYoKHR5cGVvZiBjYWxsPT09InVuZGVmaW5lZCI/InVuZGVmaW5lZCI6X3R5cGVvZihjYWxsKSk9PT0ib2JqZWN0Inx8dHlwZW9mIGNhbGw9PT0iZnVuY3Rpb24iKT9jYWxsOnNlbGZ9ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLHN1cGVyQ2xhc3Mpe2lmKHR5cGVvZiBzdXBlckNsYXNzIT09ImZ1bmN0aW9uIiYmc3VwZXJDbGFzcyE9PW51bGwpe3Rocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIisodHlwZW9mIHN1cGVyQ2xhc3M9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKHN1cGVyQ2xhc3MpKSl9c3ViQ2xhc3MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyYmc3VwZXJDbGFzcy5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpzdWJDbGFzcyxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9fSk7aWYoc3VwZXJDbGFzcylPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLHN1cGVyQ2xhc3MpOnN1YkNsYXNzLl9fcHJvdG9fXz1zdXBlckNsYXNzfXZhciBFZGl0YWJsZUFubm90YXRpb249ZnVuY3Rpb24oX1JlYWN0JENvbXBvbmVudCl7X2luaGVyaXRzKEVkaXRhYmxlQW5ub3RhdGlvbixfUmVhY3QkQ29tcG9uZW50KTtmdW5jdGlvbiBFZGl0YWJsZUFubm90YXRpb24oKXt2YXIgX3JlZjt2YXIgX3RlbXAsX3RoaXMsX3JldDtfY2xhc3NDYWxsQ2hlY2sodGhpcyxFZGl0YWJsZUFubm90YXRpb24pO2Zvcih2YXIgX2xlbj1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkoX2xlbiksX2tleT0wO19rZXk8X2xlbjtfa2V5Kyspe2FyZ3NbX2tleV09YXJndW1lbnRzW19rZXldfXJldHVybiBfcmV0PShfdGVtcD0oX3RoaXM9X3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywoX3JlZj1FZGl0YWJsZUFubm90YXRpb24uX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoRWRpdGFibGVBbm5vdGF0aW9uKSkuY2FsbC5hcHBseShfcmVmLFt0aGlzXS5jb25jYXQoYXJncykpKSxfdGhpcyksX3RoaXMuc3RhdGU9e3g6MCx5OjAsZHg6MCxkeTowfSxfdGVtcCksX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsX3JldCl9X2NyZWF0ZUNsYXNzKEVkaXRhYmxlQW5ub3RhdGlvbixbe2tleToiY29tcG9uZW50V2lsbE1vdW50Iix2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnRXaWxsTW91bnQoKXt0aGlzLnNldFN0YXRlKHt4OnRoaXMucHJvcHMueCx5OnRoaXMucHJvcHMueSxkeDp0aGlzLnByb3BzLmR4LGR5OnRoaXMucHJvcHMuZHl9KX19LHtrZXk6ImdldERhdGEiLHZhbHVlOmZ1bmN0aW9uIGdldERhdGEoKXtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSx0aGlzLnByb3BzLHRoaXMuc3RhdGUpfX0se2tleToiZHJhZ0VuZCIsdmFsdWU6ZnVuY3Rpb24gZHJhZ0VuZCgpe2lmKHRoaXMucHJvcHMub25EcmFnRW5kKXt0aGlzLnByb3BzLm9uRHJhZ0VuZCh0aGlzLmdldERhdGEoKSl9fX0se2tleToiZHJhZ1N0YXJ0Iix2YWx1ZTpmdW5jdGlvbiBkcmFnU3RhcnQoKXtpZih0aGlzLnByb3BzLm9uRHJhZ1N0YXJ0KXt0aGlzLnByb3BzLm9uRHJhZ1N0YXJ0KHRoaXMuZ2V0RGF0YSgpKX19fSx7a2V5OiJkcmFnU3ViamVjdCIsdmFsdWU6ZnVuY3Rpb24gZHJhZ1N1YmplY3QoZXZlbnQsZGF0YSl7dmFyIF90aGlzMj10aGlzO3RoaXMuc2V0U3RhdGUoe3g6dGhpcy5zdGF0ZS54K2RhdGEuZGVsdGFYLHk6dGhpcy5zdGF0ZS55K2RhdGEuZGVsdGFZfSxmdW5jdGlvbigpe2lmKF90aGlzMi5wcm9wcy5vbkRyYWcpX3RoaXMyLnByb3BzLm9uRHJhZyhfdGhpczIuZ2V0RGF0YSgpKX0pfX0se2tleToiZHJhZ1N1YmplY3RTZXR0aW5ncyIsdmFsdWU6ZnVuY3Rpb24gZHJhZ1N1YmplY3RTZXR0aW5ncyhldmVudCxkYXRhKXt2YXIgX3RoaXMzPXRoaXM7dGhpcy5zZXRTdGF0ZShkYXRhLGZ1bmN0aW9uKCl7aWYoX3RoaXMzLnByb3BzLm9uRHJhZylfdGhpczMucHJvcHMub25EcmFnKF90aGlzMy5nZXREYXRhKCkpfSl9fSx7a2V5OiJkcmFnTm90ZSIsdmFsdWU6ZnVuY3Rpb24gZHJhZ05vdGUoZXZlbnQsZGF0YSl7dmFyIF90aGlzND10aGlzO3RoaXMuc2V0U3RhdGUoe2R4OnRoaXMuc3RhdGUuZHgrZGF0YS5kZWx0YVgsZHk6dGhpcy5zdGF0ZS5keStkYXRhLmRlbHRhWX0sZnVuY3Rpb24oKXtpZihfdGhpczQucHJvcHMub25EcmFnKV90aGlzNC5wcm9wcy5vbkRyYWcoX3RoaXM0LmdldERhdGEoKSl9KX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyKCl7dmFyIGNsZWFuZWRQcm9wcz1PYmplY3QuYXNzaWduKHt9LHRoaXMucHJvcHMsX2V4dGVuZHMkJDEoe30sdGhpcy5zdGF0ZSx7ZHJhZ1N1YmplY3Q6dGhpcy5kcmFnU3ViamVjdC5iaW5kKHRoaXMpLGRyYWdOb3RlOnRoaXMuZHJhZ05vdGUuYmluZCh0aGlzKSxkcmFnU3ViamVjdFNldHRpbmdzOnRoaXMuZHJhZ1N1YmplY3RTZXR0aW5ncy5iaW5kKHRoaXMpLGRyYWdFbmQ6dGhpcy5kcmFnRW5kLmJpbmQodGhpcyksZHJhZ1N0YXJ0OnRoaXMuZHJhZ1N0YXJ0LmJpbmQodGhpcyksZWRpdE1vZGU6dHJ1ZSxjbGFzc05hbWU6KDAsX2NsYXNzbmFtZXMyLmRlZmF1bHQpKHRoaXMucHJvcHMuY2xhc3NOYW1lLCJlZGl0YWJsZSIpfSkpO3JldHVybiBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChfQW5ub3RhdGlvbjIuZGVmYXVsdCxjbGVhbmVkUHJvcHMpfX1dKTtyZXR1cm4gRWRpdGFibGVBbm5vdGF0aW9ufShfcmVhY3QyLmRlZmF1bHQuQ29tcG9uZW50KTtleHBvcnRzLmRlZmF1bHQ9RWRpdGFibGVBbm5vdGF0aW9ufSk7dW53cmFwRXhwb3J0cyhFZGl0YWJsZUFubm90YXRpb25fMSk7dmFyIFR5cGVzPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywiX19lc01vZHVsZSIse3ZhbHVlOnRydWV9KTt2YXIgX2V4dGVuZHM9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odGFyZ2V0KXtmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXt2YXIgc291cmNlPWFyZ3VtZW50c1tpXTtmb3IodmFyIGtleSBpbiBzb3VyY2Upe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2Usa2V5KSl7dGFyZ2V0W2tleV09c291cmNlW2tleV19fX1yZXR1cm4gdGFyZ2V0fTtleHBvcnRzLkFubm90YXRpb25MYWJlbD1Bbm5vdGF0aW9uTGFiZWw7ZXhwb3J0cy5Bbm5vdGF0aW9uQ2FsbG91dD1Bbm5vdGF0aW9uQ2FsbG91dDtleHBvcnRzLkFubm90YXRpb25DYWxsb3V0RWxib3c9QW5ub3RhdGlvbkNhbGxvdXRFbGJvdztleHBvcnRzLkFubm90YXRpb25DYWxsb3V0Q3VydmU9QW5ub3RhdGlvbkNhbGxvdXRDdXJ2ZTtleHBvcnRzLkFubm90YXRpb25DYWxsb3V0Q2lyY2xlPUFubm90YXRpb25DYWxsb3V0Q2lyY2xlO2V4cG9ydHMuQW5ub3RhdGlvbkNhbGxvdXRSZWN0PUFubm90YXRpb25DYWxsb3V0UmVjdDtleHBvcnRzLkFubm90YXRpb25YWVRocmVzaG9sZD1Bbm5vdGF0aW9uWFlUaHJlc2hvbGQ7ZXhwb3J0cy5Bbm5vdGF0aW9uQmFkZ2U9QW5ub3RhdGlvbkJhZGdlO2V4cG9ydHMuQW5ub3RhdGlvbkJyYWNrZXQ9QW5ub3RhdGlvbkJyYWNrZXQ7ZXhwb3J0cy5Bbm5vdGF0aW9uQ2FsbG91dEN1c3RvbT1Bbm5vdGF0aW9uQ2FsbG91dEN1c3RvbTt2YXIgX3JlYWN0Mj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KFJlYWN0KTt2YXIgX0Fubm90YXRpb24yPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoQW5ub3RhdGlvbl8xKTt2YXIgX0VkaXRhYmxlQW5ub3RhdGlvbjI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChFZGl0YWJsZUFubm90YXRpb25fMSk7dmFyIF9Db25uZWN0b3JMaW5lMj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KENvbm5lY3RvckxpbmVfMSk7dmFyIF9Db25uZWN0b3JFbGJvdzI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChDb25uZWN0b3JFbGJvd18xKTt2YXIgX0Nvbm5lY3RvckN1cnZlMj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KENvbm5lY3RvckN1cnZlXzEpO3ZhciBfQ29ubmVjdG9yRW5kRG90Mj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KENvbm5lY3RvckVuZERvdF8xKTt2YXIgX0Nvbm5lY3RvckVuZEFycm93Mj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KENvbm5lY3RvckVuZEFycm93XzEpO3ZhciBfU3ViamVjdDI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChTdWJqZWN0XzEpO3ZhciBfU3ViamVjdENpcmNsZTI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChTdWJqZWN0Q2lyY2xlXzEpO3ZhciBfU3ViamVjdEJhZGdlMj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KFN1YmplY3RCYWRnZV8xKTt2YXIgX1N1YmplY3RCcmFja2V0Mj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KFN1YmplY3RCcmFja2V0XzEpO3ZhciBfQnJhY2tldE5vdGUyPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoQnJhY2tldE5vdGVfMSk7dmFyIF9TdWJqZWN0UmVjdDI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChTdWJqZWN0UmVjdF8xKTt2YXIgX1N1YmplY3RUaHJlc2hvbGQyPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoU3ViamVjdFRocmVzaG9sZF8xKTt2YXIgX1N1YmplY3RDdXN0b20yPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoU3ViamVjdEN1c3RvbV8xKTt2YXIgX05vdGUyPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoTm90ZV8xKTt2YXIgX2NsYXNzbmFtZXMyPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoY2xhc3NuYW1lcyk7ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmope3JldHVybiBvYmomJm9iai5fX2VzTW9kdWxlP29iajp7ZGVmYXVsdDpvYmp9fXZhciBnZXRBbm5vdGF0aW9uVHlwZT1mdW5jdGlvbiBnZXRBbm5vdGF0aW9uVHlwZShlZGl0TW9kZSl7cmV0dXJuIGVkaXRNb2RlP19FZGl0YWJsZUFubm90YXRpb24yLmRlZmF1bHQ6X0Fubm90YXRpb24yLmRlZmF1bHR9O3ZhciBhbm5vdGF0aW9uTWFwcGVyPWZ1bmN0aW9uIGFubm90YXRpb25NYXBwZXIocHJvcHMsQ29ubmVjdG9yKXt2YXIgTm90ZURlZmF1bHRQcm9wcz1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMl06e307dmFyIFN1YmplY3Q9YXJndW1lbnRzLmxlbmd0aD4zJiZhcmd1bWVudHNbM10hPT11bmRlZmluZWQ/YXJndW1lbnRzWzNdOl9TdWJqZWN0Mi5kZWZhdWx0O3ZhciBTdWJqZWN0RGVmYXVsdFByb3BzPWFyZ3VtZW50cy5sZW5ndGg+NCYmYXJndW1lbnRzWzRdIT09dW5kZWZpbmVkP2FyZ3VtZW50c1s0XTp7fTt2YXIgTm90ZVR5cGU9YXJndW1lbnRzLmxlbmd0aD41JiZhcmd1bWVudHNbNV0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzVdOl9Ob3RlMi5kZWZhdWx0O3ZhciBfcHJvcHMkZGlzYWJsZT1wcm9wcy5kaXNhYmxlLGRpc2FibGU9X3Byb3BzJGRpc2FibGU9PT11bmRlZmluZWQ/W106X3Byb3BzJGRpc2FibGUsY29ubmVjdG9yPXByb3BzLmNvbm5lY3Rvcixub3RlPXByb3BzLm5vdGUsc3ViamVjdD1wcm9wcy5zdWJqZWN0LHg9cHJvcHMueCx5PXByb3BzLnksZHg9cHJvcHMuZHgsZHk9cHJvcHMuZHksbng9cHJvcHMubngsbnk9cHJvcHMubnksY29sb3I9cHJvcHMuY29sb3IsY2xhc3NOYW1lPXByb3BzLmNsYXNzTmFtZSxvbkRyYWc9cHJvcHMub25EcmFnLG9uRHJhZ1N0YXJ0PXByb3BzLm9uRHJhZ1N0YXJ0LG9uRHJhZ0VuZD1wcm9wcy5vbkRyYWdFbmQsZWRpdE1vZGU9cHJvcHMuZWRpdE1vZGUsZXZlbnRzPXByb3BzLmV2ZW50czt2YXIgQ09OTkVDVE9SUz17dHlwZTp7Y3VydmU6X0Nvbm5lY3RvckN1cnZlMi5kZWZhdWx0LGxpbmU6X0Nvbm5lY3RvckxpbmUyLmRlZmF1bHQsZWxib3c6X0Nvbm5lY3RvckVsYm93Mi5kZWZhdWx0fSxlbmQ6e2RvdDpfQ29ubmVjdG9yRW5kRG90Mi5kZWZhdWx0LGFycm93Ol9Db25uZWN0b3JFbmRBcnJvdzIuZGVmYXVsdH19O3ZhciBDb25uZWN0b3JUeXBlPXZvaWQgMCxDb25uZWN0b3JFbmRUeXBlPXZvaWQgMDtpZihkaXNhYmxlLmluZGV4T2YoImNvbm5lY3RvciIpPT09LTEpe0Nvbm5lY3RvclR5cGU9Y29ubmVjdG9yJiZDT05ORUNUT1JTLnR5cGVbY29ubmVjdG9yLnR5cGVdfHxDb25uZWN0b3I7Q29ubmVjdG9yRW5kVHlwZT1jb25uZWN0b3ImJkNPTk5FQ1RPUlMuZW5kW2Nvbm5lY3Rvci5lbmRdfXZhciBBbm5vdGF0aW9uVHlwZT1nZXRBbm5vdGF0aW9uVHlwZShwcm9wcy5lZGl0TW9kZSk7cmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEFubm90YXRpb25UeXBlLF9leHRlbmRzKHt4OngseTp5LGR4OmR4LGR5OmR5LG54Om54LG55Om55LGNvbG9yOmNvbG9yLGNsYXNzTmFtZTpjbGFzc05hbWUsb25EcmFnOm9uRHJhZyxvbkRyYWdTdGFydDpvbkRyYWdTdGFydCxvbkRyYWdFbmQ6b25EcmFnRW5kLGVkaXRNb2RlOmVkaXRNb2RlfSxTdWJqZWN0RGVmYXVsdFByb3BzLHN1YmplY3Qse2V2ZW50czpldmVudHN9KSxDb25uZWN0b3JUeXBlJiZfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChDb25uZWN0b3JUeXBlLGNvbm5lY3RvcixDb25uZWN0b3JFbmRUeXBlJiZfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChDb25uZWN0b3JFbmRUeXBlLG51bGwpKSxTdWJqZWN0JiZkaXNhYmxlLmluZGV4T2YoInN1YmplY3QiKT09PS0xJiZfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChTdWJqZWN0LG51bGwpLG5vdGUmJmRpc2FibGUuaW5kZXhPZigibm90ZSIpPT09LTEmJl9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KE5vdGVUeXBlLF9leHRlbmRzKHt9LE5vdGVEZWZhdWx0UHJvcHMsbm90ZSkpKX07ZnVuY3Rpb24gQW5ub3RhdGlvbkxhYmVsKHByb3BzKXt2YXIgY2xhc3NOYW1lPSgwLF9jbGFzc25hbWVzMi5kZWZhdWx0KSgibGFiZWwiLHByb3BzLmNsYXNzTmFtZSk7cmV0dXJuIGFubm90YXRpb25NYXBwZXIoX2V4dGVuZHMoe30scHJvcHMse2NsYXNzTmFtZTpjbGFzc05hbWV9KSxfQ29ubmVjdG9yTGluZTIuZGVmYXVsdCx7YWxpZ246Im1pZGRsZSJ9KX1mdW5jdGlvbiBBbm5vdGF0aW9uQ2FsbG91dChwcm9wcyl7dmFyIGNsYXNzTmFtZT0oMCxfY2xhc3NuYW1lczIuZGVmYXVsdCkoImNhbGxvdXQiLHByb3BzLmNsYXNzTmFtZSk7cmV0dXJuIGFubm90YXRpb25NYXBwZXIoX2V4dGVuZHMoe30scHJvcHMse2NsYXNzTmFtZTpjbGFzc05hbWV9KSxfQ29ubmVjdG9yTGluZTIuZGVmYXVsdCx7bGluZVR5cGU6Imhvcml6b250YWwifSl9ZnVuY3Rpb24gQW5ub3RhdGlvbkNhbGxvdXRFbGJvdyhwcm9wcyl7dmFyIGNsYXNzTmFtZT0oMCxfY2xhc3NuYW1lczIuZGVmYXVsdCkoImNhbGxvdXQgZWxib3ciLHByb3BzLmNsYXNzTmFtZSk7cmV0dXJuIGFubm90YXRpb25NYXBwZXIoX2V4dGVuZHMoe30scHJvcHMse2NsYXNzTmFtZTpjbGFzc05hbWV9KSxfQ29ubmVjdG9yRWxib3cyLmRlZmF1bHQse2xpbmVUeXBlOiJob3Jpem9udGFsIn0pfWZ1bmN0aW9uIEFubm90YXRpb25DYWxsb3V0Q3VydmUocHJvcHMpe3ZhciBjbGFzc05hbWU9KDAsX2NsYXNzbmFtZXMyLmRlZmF1bHQpKCJjYWxsb3V0IGN1cnZlIixwcm9wcy5jbGFzc05hbWUpO3JldHVybiBhbm5vdGF0aW9uTWFwcGVyKF9leHRlbmRzKHt9LHByb3BzLHtjbGFzc05hbWU6Y2xhc3NOYW1lfSksX0Nvbm5lY3RvckN1cnZlMi5kZWZhdWx0LHtsaW5lVHlwZToiaG9yaXpvbnRhbCJ9KX1mdW5jdGlvbiBBbm5vdGF0aW9uQ2FsbG91dENpcmNsZShwcm9wcyl7dmFyIGNsYXNzTmFtZT0oMCxfY2xhc3NuYW1lczIuZGVmYXVsdCkoImNhbGxvdXQgY2lyY2xlIixwcm9wcy5jbGFzc05hbWUpO3JldHVybiBhbm5vdGF0aW9uTWFwcGVyKF9leHRlbmRzKHt9LHByb3BzLHtjbGFzc05hbWU6Y2xhc3NOYW1lfSksX0Nvbm5lY3RvckVsYm93Mi5kZWZhdWx0LHtsaW5lVHlwZToiaG9yaXpvbnRhbCJ9LF9TdWJqZWN0Q2lyY2xlMi5kZWZhdWx0LHtyYWRpdXM6MjB9KX1mdW5jdGlvbiBBbm5vdGF0aW9uQ2FsbG91dFJlY3QocHJvcHMpe3ZhciBjbGFzc05hbWU9KDAsX2NsYXNzbmFtZXMyLmRlZmF1bHQpKCJjYWxsb3V0IHJlY3QiLHByb3BzLmNsYXNzTmFtZSk7cmV0dXJuIGFubm90YXRpb25NYXBwZXIoX2V4dGVuZHMoe30scHJvcHMse2NsYXNzTmFtZTpjbGFzc05hbWV9KSxfQ29ubmVjdG9yRWxib3cyLmRlZmF1bHQse2xpbmVUeXBlOiJob3Jpem9udGFsIn0sX1N1YmplY3RSZWN0Mi5kZWZhdWx0LHt3aWR0aDoxMDAsaGVpZ2h0OjEwMH0pfWZ1bmN0aW9uIEFubm90YXRpb25YWVRocmVzaG9sZChwcm9wcyl7dmFyIGNsYXNzTmFtZT0oMCxfY2xhc3NuYW1lczIuZGVmYXVsdCkoImNhbGxvdXQgeHl0aHJlc2hvbGQiLHByb3BzLmNsYXNzTmFtZSk7cmV0dXJuIGFubm90YXRpb25NYXBwZXIoX2V4dGVuZHMoe30scHJvcHMse2NsYXNzTmFtZTpjbGFzc05hbWV9KSxfQ29ubmVjdG9yRWxib3cyLmRlZmF1bHQse2xpbmVUeXBlOiJob3Jpem9udGFsIn0sX1N1YmplY3RUaHJlc2hvbGQyLmRlZmF1bHQpfWZ1bmN0aW9uIEFubm90YXRpb25CYWRnZShwcm9wcyl7dmFyIGNsYXNzTmFtZT0oMCxfY2xhc3NuYW1lczIuZGVmYXVsdCkoImJhZGdlIixwcm9wcy5jbGFzc05hbWUpO3JldHVybiBhbm5vdGF0aW9uTWFwcGVyKF9leHRlbmRzKHtkaXNhYmxlOlsiY29ubmVjdG9yIiwibm90ZSJdfSxwcm9wcyx7Y2xhc3NOYW1lOmNsYXNzTmFtZX0pLG51bGwsbnVsbCxfU3ViamVjdEJhZGdlMi5kZWZhdWx0KX1mdW5jdGlvbiBBbm5vdGF0aW9uQnJhY2tldChwcm9wcyl7dmFyIGNsYXNzTmFtZT0oMCxfY2xhc3NuYW1lczIuZGVmYXVsdCkoImJyYWNrZXQiLHByb3BzLmNsYXNzTmFtZSk7cmV0dXJuIGFubm90YXRpb25NYXBwZXIoX2V4dGVuZHMoe2Rpc2FibGU6WyJjb25uZWN0b3IiXX0scHJvcHMse2NsYXNzTmFtZTpjbGFzc05hbWV9KSxudWxsLG51bGwsX1N1YmplY3RCcmFja2V0Mi5kZWZhdWx0LHtkZXB0aDoyMH0sX0JyYWNrZXROb3RlMi5kZWZhdWx0KX1mdW5jdGlvbiBBbm5vdGF0aW9uQ2FsbG91dEN1c3RvbShwcm9wcyl7dmFyIGNsYXNzTmFtZT0oMCxfY2xhc3NuYW1lczIuZGVmYXVsdCkoImNhbGxvdXQgY3VzdG9tIixwcm9wcy5jbGFzc05hbWUpO3JldHVybiBhbm5vdGF0aW9uTWFwcGVyKF9leHRlbmRzKHt9LHByb3BzLHtjbGFzc05hbWU6Y2xhc3NOYW1lfSksX0Nvbm5lY3RvckVsYm93Mi5kZWZhdWx0LHtsaW5lVHlwZToiaG9yaXpvbnRhbCJ9LF9TdWJqZWN0Q3VzdG9tMi5kZWZhdWx0KX19KTt1bndyYXBFeHBvcnRzKFR5cGVzKTt2YXIgVHlwZXNfMT1UeXBlcy5Bbm5vdGF0aW9uTGFiZWw7dmFyIFR5cGVzXzI9VHlwZXMuQW5ub3RhdGlvbkNhbGxvdXQ7dmFyIFR5cGVzXzM9VHlwZXMuQW5ub3RhdGlvbkNhbGxvdXRFbGJvdzt2YXIgVHlwZXNfND1UeXBlcy5Bbm5vdGF0aW9uQ2FsbG91dEN1cnZlO3ZhciBUeXBlc181PVR5cGVzLkFubm90YXRpb25DYWxsb3V0Q2lyY2xlO3ZhciBUeXBlc182PVR5cGVzLkFubm90YXRpb25DYWxsb3V0UmVjdDt2YXIgVHlwZXNfNz1UeXBlcy5Bbm5vdGF0aW9uWFlUaHJlc2hvbGQ7dmFyIFR5cGVzXzg9VHlwZXMuQW5ub3RhdGlvbkJhZGdlO3ZhciBUeXBlc185PVR5cGVzLkFubm90YXRpb25CcmFja2V0O3ZhciBUeXBlc18xMD1UeXBlcy5Bbm5vdGF0aW9uQ2FsbG91dEN1c3RvbTt2YXIgbGliPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywiX19lc01vZHVsZSIse3ZhbHVlOnRydWV9KTtleHBvcnRzLkFubm90YXRpb25DYWxsb3V0Q3VzdG9tPWV4cG9ydHMuQW5ub3RhdGlvbkJyYWNrZXQ9ZXhwb3J0cy5Bbm5vdGF0aW9uQmFkZ2U9ZXhwb3J0cy5Bbm5vdGF0aW9uWFlUaHJlc2hvbGQ9ZXhwb3J0cy5Bbm5vdGF0aW9uQ2FsbG91dFJlY3Q9ZXhwb3J0cy5Bbm5vdGF0aW9uQ2FsbG91dEVsYm93PWV4cG9ydHMuQW5ub3RhdGlvbkNhbGxvdXRDdXJ2ZT1leHBvcnRzLkFubm90YXRpb25DYWxsb3V0Q2lyY2xlPWV4cG9ydHMuQW5ub3RhdGlvbkNhbGxvdXQ9ZXhwb3J0cy5Bbm5vdGF0aW9uTGFiZWw9ZXhwb3J0cy5FZGl0YWJsZUFubm90YXRpb249ZXhwb3J0cy5Bbm5vdGF0aW9uPWV4cG9ydHMuQnJhY2tldE5vdGU9ZXhwb3J0cy5Ob3RlPWV4cG9ydHMuU3ViamVjdEN1c3RvbT1leHBvcnRzLlN1YmplY3RCcmFja2V0PWV4cG9ydHMuU3ViamVjdFRocmVzaG9sZD1leHBvcnRzLlN1YmplY3RSZWN0PWV4cG9ydHMuU3ViamVjdENpcmNsZT1leHBvcnRzLlN1YmplY3RCYWRnZT1leHBvcnRzLlN1YmplY3Q9ZXhwb3J0cy5Db25uZWN0b3JFbmRBcnJvdz1leHBvcnRzLkNvbm5lY3RvckVuZERvdD1leHBvcnRzLkNvbm5lY3RvckxpbmU9ZXhwb3J0cy5Db25uZWN0b3JFbGJvdz1leHBvcnRzLkNvbm5lY3RvckN1cnZlPWV4cG9ydHMuQ29ubmVjdG9yPXVuZGVmaW5lZDt2YXIgX0Nvbm5lY3RvcjIkJDE9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChDb25uZWN0b3JfMSk7dmFyIF9Db25uZWN0b3JDdXJ2ZTI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChDb25uZWN0b3JDdXJ2ZV8xKTt2YXIgX0Nvbm5lY3RvckVsYm93Mj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KENvbm5lY3RvckVsYm93XzEpO3ZhciBfQ29ubmVjdG9yTGluZTI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChDb25uZWN0b3JMaW5lXzEpO3ZhciBfQ29ubmVjdG9yRW5kRG90Mj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KENvbm5lY3RvckVuZERvdF8xKTt2YXIgX0Nvbm5lY3RvckVuZEFycm93Mj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KENvbm5lY3RvckVuZEFycm93XzEpO3ZhciBfU3ViamVjdDI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChTdWJqZWN0XzEpO3ZhciBfU3ViamVjdEJhZGdlMj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KFN1YmplY3RCYWRnZV8xKTt2YXIgX1N1YmplY3RDaXJjbGUyPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoU3ViamVjdENpcmNsZV8xKTt2YXIgX1N1YmplY3RSZWN0Mj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KFN1YmplY3RSZWN0XzEpO3ZhciBfU3ViamVjdFRocmVzaG9sZDI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChTdWJqZWN0VGhyZXNob2xkXzEpO3ZhciBfU3ViamVjdEJyYWNrZXQyPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoU3ViamVjdEJyYWNrZXRfMSk7dmFyIF9TdWJqZWN0Q3VzdG9tMj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KFN1YmplY3RDdXN0b21fMSk7dmFyIF9Ob3RlMj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KE5vdGVfMSk7dmFyIF9CcmFja2V0Tm90ZTI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChCcmFja2V0Tm90ZV8xKTt2YXIgX0Fubm90YXRpb24yPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoQW5ub3RhdGlvbl8xKTt2YXIgX0VkaXRhYmxlQW5ub3RhdGlvbjI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChFZGl0YWJsZUFubm90YXRpb25fMSk7ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmope3JldHVybiBvYmomJm9iai5fX2VzTW9kdWxlP29iajp7ZGVmYXVsdDpvYmp9fWV4cG9ydHMuQ29ubmVjdG9yPV9Db25uZWN0b3IyJCQxLmRlZmF1bHQ7ZXhwb3J0cy5Db25uZWN0b3JDdXJ2ZT1fQ29ubmVjdG9yQ3VydmUyLmRlZmF1bHQ7ZXhwb3J0cy5Db25uZWN0b3JFbGJvdz1fQ29ubmVjdG9yRWxib3cyLmRlZmF1bHQ7ZXhwb3J0cy5Db25uZWN0b3JMaW5lPV9Db25uZWN0b3JMaW5lMi5kZWZhdWx0O2V4cG9ydHMuQ29ubmVjdG9yRW5kRG90PV9Db25uZWN0b3JFbmREb3QyLmRlZmF1bHQ7ZXhwb3J0cy5Db25uZWN0b3JFbmRBcnJvdz1fQ29ubmVjdG9yRW5kQXJyb3cyLmRlZmF1bHQ7ZXhwb3J0cy5TdWJqZWN0PV9TdWJqZWN0Mi5kZWZhdWx0O2V4cG9ydHMuU3ViamVjdEJhZGdlPV9TdWJqZWN0QmFkZ2UyLmRlZmF1bHQ7ZXhwb3J0cy5TdWJqZWN0Q2lyY2xlPV9TdWJqZWN0Q2lyY2xlMi5kZWZhdWx0O2V4cG9ydHMuU3ViamVjdFJlY3Q9X1N1YmplY3RSZWN0Mi5kZWZhdWx0O2V4cG9ydHMuU3ViamVjdFRocmVzaG9sZD1fU3ViamVjdFRocmVzaG9sZDIuZGVmYXVsdDtleHBvcnRzLlN1YmplY3RCcmFja2V0PV9TdWJqZWN0QnJhY2tldDIuZGVmYXVsdDtleHBvcnRzLlN1YmplY3RDdXN0b209X1N1YmplY3RDdXN0b20yLmRlZmF1bHQ7ZXhwb3J0cy5Ob3RlPV9Ob3RlMi5kZWZhdWx0O2V4cG9ydHMuQnJhY2tldE5vdGU9X0JyYWNrZXROb3RlMi5kZWZhdWx0O2V4cG9ydHMuQW5ub3RhdGlvbj1fQW5ub3RhdGlvbjIuZGVmYXVsdDtleHBvcnRzLkVkaXRhYmxlQW5ub3RhdGlvbj1fRWRpdGFibGVBbm5vdGF0aW9uMi5kZWZhdWx0O2V4cG9ydHMuQW5ub3RhdGlvbkxhYmVsPVR5cGVzLkFubm90YXRpb25MYWJlbDtleHBvcnRzLkFubm90YXRpb25DYWxsb3V0PVR5cGVzLkFubm90YXRpb25DYWxsb3V0O2V4cG9ydHMuQW5ub3RhdGlvbkNhbGxvdXRDaXJjbGU9VHlwZXMuQW5ub3RhdGlvbkNhbGxvdXRDaXJjbGU7ZXhwb3J0cy5Bbm5vdGF0aW9uQ2FsbG91dEN1cnZlPVR5cGVzLkFubm90YXRpb25DYWxsb3V0Q3VydmU7ZXhwb3J0cy5Bbm5vdGF0aW9uQ2FsbG91dEVsYm93PVR5cGVzLkFubm90YXRpb25DYWxsb3V0RWxib3c7ZXhwb3J0cy5Bbm5vdGF0aW9uQ2FsbG91dFJlY3Q9VHlwZXMuQW5ub3RhdGlvbkNhbGxvdXRSZWN0O2V4cG9ydHMuQW5ub3RhdGlvblhZVGhyZXNob2xkPVR5cGVzLkFubm90YXRpb25YWVRocmVzaG9sZDtleHBvcnRzLkFubm90YXRpb25CYWRnZT1UeXBlcy5Bbm5vdGF0aW9uQmFkZ2U7ZXhwb3J0cy5Bbm5vdGF0aW9uQnJhY2tldD1UeXBlcy5Bbm5vdGF0aW9uQnJhY2tldDtleHBvcnRzLkFubm90YXRpb25DYWxsb3V0Q3VzdG9tPVR5cGVzLkFubm90YXRpb25DYWxsb3V0Q3VzdG9tO2V4cG9ydHMuZGVmYXVsdD17Q29ubmVjdG9yOl9Db25uZWN0b3IyJCQxLmRlZmF1bHQsQ29ubmVjdG9yQ3VydmU6X0Nvbm5lY3RvckN1cnZlMi5kZWZhdWx0LENvbm5lY3RvckVsYm93Ol9Db25uZWN0b3JFbGJvdzIuZGVmYXVsdCxDb25uZWN0b3JMaW5lOl9Db25uZWN0b3JMaW5lMi5kZWZhdWx0LENvbm5lY3RvckVuZERvdDpfQ29ubmVjdG9yRW5kRG90Mi5kZWZhdWx0LENvbm5lY3RvckVuZEFycm93Ol9Db25uZWN0b3JFbmRBcnJvdzIuZGVmYXVsdCxTdWJqZWN0Ol9TdWJqZWN0Mi5kZWZhdWx0LFN1YmplY3RCYWRnZTpfU3ViamVjdEJhZGdlMi5kZWZhdWx0LFN1YmplY3RDaXJjbGU6X1N1YmplY3RDaXJjbGUyLmRlZmF1bHQsU3ViamVjdFJlY3Q6X1N1YmplY3RSZWN0Mi5kZWZhdWx0LFN1YmplY3RUaHJlc2hvbGQ6X1N1YmplY3RUaHJlc2hvbGQyLmRlZmF1bHQsU3ViamVjdEJyYWNrZXQ6X1N1YmplY3RCcmFja2V0Mi5kZWZhdWx0LFN1YmplY3RDdXN0b206X1N1YmplY3RDdXN0b20yLmRlZmF1bHQsTm90ZTpfTm90ZTIuZGVmYXVsdCxCcmFja2V0Tm90ZTpfQnJhY2tldE5vdGUyLmRlZmF1bHQsQW5ub3RhdGlvbjpfQW5ub3RhdGlvbjIuZGVmYXVsdCxFZGl0YWJsZUFubm90YXRpb246X0VkaXRhYmxlQW5ub3RhdGlvbjIuZGVmYXVsdCxBbm5vdGF0aW9uTGFiZWw6VHlwZXMuQW5ub3RhdGlvbkxhYmVsLEFubm90YXRpb25DYWxsb3V0OlR5cGVzLkFubm90YXRpb25DYWxsb3V0LEFubm90YXRpb25DYWxsb3V0Q2lyY2xlOlR5cGVzLkFubm90YXRpb25DYWxsb3V0Q2lyY2xlLEFubm90YXRpb25DYWxsb3V0Q3VydmU6VHlwZXMuQW5ub3RhdGlvbkNhbGxvdXRDdXJ2ZSxBbm5vdGF0aW9uQ2FsbG91dEVsYm93OlR5cGVzLkFubm90YXRpb25DYWxsb3V0RWxib3csQW5ub3RhdGlvbkNhbGxvdXRSZWN0OlR5cGVzLkFubm90YXRpb25DYWxsb3V0UmVjdCxBbm5vdGF0aW9uWFlUaHJlc2hvbGQ6VHlwZXMuQW5ub3RhdGlvblhZVGhyZXNob2xkLEFubm90YXRpb25CYWRnZTpUeXBlcy5Bbm5vdGF0aW9uQmFkZ2UsQW5ub3RhdGlvbkJyYWNrZXQ6VHlwZXMuQW5ub3RhdGlvbkJyYWNrZXQsQW5ub3RhdGlvbkNhbGxvdXRDdXN0b206VHlwZXMuQW5ub3RhdGlvbkNhbGxvdXRDdXN0b219fSk7dW53cmFwRXhwb3J0cyhsaWIpO3ZhciBsaWJfMT1saWIuQW5ub3RhdGlvbkNhbGxvdXRDdXN0b207dmFyIGxpYl8yPWxpYi5Bbm5vdGF0aW9uQnJhY2tldDt2YXIgbGliXzM9bGliLkFubm90YXRpb25CYWRnZTt2YXIgbGliXzQ9bGliLkFubm90YXRpb25YWVRocmVzaG9sZDt2YXIgbGliXzU9bGliLkFubm90YXRpb25DYWxsb3V0UmVjdDt2YXIgbGliXzY9bGliLkFubm90YXRpb25DYWxsb3V0RWxib3c7dmFyIGxpYl83PWxpYi5Bbm5vdGF0aW9uQ2FsbG91dEN1cnZlO3ZhciBsaWJfOD1saWIuQW5ub3RhdGlvbkNhbGxvdXRDaXJjbGU7dmFyIGxpYl85PWxpYi5Bbm5vdGF0aW9uQ2FsbG91dDt2YXIgbGliXzEwPWxpYi5Bbm5vdGF0aW9uTGFiZWw7dmFyIGxpYl8xMT1saWIuRWRpdGFibGVBbm5vdGF0aW9uO3ZhciBsaWJfMTI9bGliLkFubm90YXRpb247dmFyIGxpYl8xMz1saWIuQnJhY2tldE5vdGU7dmFyIGxpYl8xND1saWIuTm90ZTt2YXIgbGliXzE1PWxpYi5TdWJqZWN0Q3VzdG9tO3ZhciBsaWJfMTY9bGliLlN1YmplY3RCcmFja2V0O3ZhciBsaWJfMTc9bGliLlN1YmplY3RUaHJlc2hvbGQ7dmFyIGxpYl8xOD1saWIuU3ViamVjdFJlY3Q7dmFyIGxpYl8xOT1saWIuU3ViamVjdENpcmNsZTt2YXIgbGliXzIwPWxpYi5TdWJqZWN0QmFkZ2U7dmFyIGxpYl8yMT1saWIuU3ViamVjdDt2YXIgbGliXzIyPWxpYi5Db25uZWN0b3JFbmRBcnJvdzt2YXIgbGliXzIzPWxpYi5Db25uZWN0b3JFbmREb3Q7dmFyIGxpYl8yND1saWIuQ29ubmVjdG9yTGluZTt2YXIgbGliXzI1PWxpYi5Db25uZWN0b3JFbGJvdzt2YXIgbGliXzI2PWxpYi5Db25uZWN0b3JDdXJ2ZTt2YXIgbGliXzI3PWxpYi5Db25uZWN0b3I7dmFyIFNlbWlvdGljQW5ub3RhdGlvbj1mdW5jdGlvbihfUmVhY3QkQ29tcG9uZW50KXtpbmhlcml0cyhTZW1pb3RpY0Fubm90YXRpb24sX1JlYWN0JENvbXBvbmVudCk7ZnVuY3Rpb24gU2VtaW90aWNBbm5vdGF0aW9uKCl7Y2xhc3NDYWxsQ2hlY2sodGhpcyxTZW1pb3RpY0Fubm90YXRpb24pO3JldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKFNlbWlvdGljQW5ub3RhdGlvbi5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihTZW1pb3RpY0Fubm90YXRpb24pKS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfWNyZWF0ZUNsYXNzKFNlbWlvdGljQW5ub3RhdGlvbixbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbiByZW5kZXIoKXt2YXIgbm90ZURhdGE9dGhpcy5wcm9wcy5ub3RlRGF0YTt2YXIgc2NyZWVuQ29vcmRpbmF0ZXM9bm90ZURhdGEuc2NyZWVuQ29vcmRpbmF0ZXM7bm90ZURhdGEudHlwZT10eXBlb2Ygbm90ZURhdGEudHlwZT09PSJmdW5jdGlvbiI/bm90ZURhdGEudHlwZTpsaWJfMTA7dmFyIGV2ZW50TGlzdGVuZXJzPW5vdGVEYXRhLmV2ZW50TGlzdGVuZXJzfHx7fTtpZihub3RlRGF0YS5jb29yZGluYXRlcyYmc2NyZWVuQ29vcmRpbmF0ZXMpe3ZhciBzZXROWD1ub3RlRGF0YS5ueHx8c2NyZWVuQ29vcmRpbmF0ZXNbMF1bMF0rbm90ZURhdGEuZHg7dmFyIHNldE5ZPW5vdGVEYXRhLm55fHxzY3JlZW5Db29yZGluYXRlc1swXVsxXStub3RlRGF0YS5keTt2YXIgbm90ZXM9c2NyZWVuQ29vcmRpbmF0ZXMubWFwKGZ1bmN0aW9uKGQsaSl7dmFyIHN1YmplY3ROb3RlPU9iamVjdC5hc3NpZ24oe30sbm90ZURhdGEse25vdGU6aT09PTA/bm90ZURhdGEubm90ZTp7bGFiZWw6IiJ9LHg6ZFswXSx5OmRbMV0sbng6c2V0Tlgsbnk6c2V0Tll9KTtyZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChub3RlRGF0YS50eXBlLF9leHRlbmRzKHtrZXk6Im11bHRpLWFubm90YXRpb24tIitpfSxzdWJqZWN0Tm90ZSkpfSk7cmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoImciLHtldmVudHM6ZXZlbnRMaXN0ZW5lcnN9LG5vdGVzKX1yZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChub3RlRGF0YS50eXBlLF9leHRlbmRzKHtldmVudHM6ZXZlbnRMaXN0ZW5lcnN9LG5vdGVEYXRhKSl9fV0pO3JldHVybiBTZW1pb3RpY0Fubm90YXRpb259KFJlYWN0LkNvbXBvbmVudCk7U2VtaW90aWNBbm5vdGF0aW9uLnByb3BUeXBlcz17bm90ZURhdGE6cHJvcFR5cGVzLm9iamVjdH07dmFyIGxhYmVsbGFfbWluPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXshZnVuY3Rpb24odCxlKXttb2R1bGUuZXhwb3J0cz1lKCl9KGNvbW1vbmpzR2xvYmFsLGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobil7aWYocltuXSlyZXR1cm4gcltuXS5leHBvcnRzO3ZhciBpPXJbbl09e2V4cG9ydHM6e30saWQ6bixsb2FkZWQ6ITF9O3JldHVybiB0W25dLmNhbGwoaS5leHBvcnRzLGksaS5leHBvcnRzLGUpLGkubG9hZGVkPSEwLGkuZXhwb3J0c312YXIgcj17fTtyZXR1cm4gZS5tPXQsZS5jPXIsZS5wPSIiLGUoMCl9KFtmdW5jdGlvbih0LGUscil7dC5leHBvcnRzPXtOb2RlOnIoMSksRm9yY2U6cigyKSxEaXN0cmlidXRvcjpyKDMpLFJlbmRlcmVyOnIoMTApfX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9dmFyIG49ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBuPWVbcl07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG4mJihuLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLmtleSxuKX19cmV0dXJuIGZ1bmN0aW9uKGUscixuKXtyZXR1cm4gciYmdChlLnByb3RvdHlwZSxyKSxuJiZ0KGUsbiksZX19KCksaT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuLGkpe3IodGhpcyx0KSx0aGlzLmlkZWFsUG9zPWUsdGhpcy5jdXJyZW50UG9zPWUsdGhpcy53aWR0aD1uLHRoaXMuZGF0YT1pLHRoaXMubGF5ZXJJbmRleD0wfXJldHVybiBuKHQsW3trZXk6ImRpc3RhbmNlRnJvbSIsdmFsdWU6ZnVuY3Rpb24gdmFsdWUodCl7dmFyIGU9dGhpcy53aWR0aC8yLHI9dC53aWR0aC8yO3JldHVybiBNYXRoLm1heCh0aGlzLmN1cnJlbnRQb3MtZSx0LmN1cnJlbnRQb3MtciktTWF0aC5taW4odGhpcy5jdXJyZW50UG9zK2UsdC5jdXJyZW50UG9zK3IpfX0se2tleToibW92ZVRvSWRlYWxQb3NpdGlvbiIsdmFsdWU6ZnVuY3Rpb24gdmFsdWUoKXtyZXR1cm4gdGhpcy5jdXJyZW50UG9zPXRoaXMuaWRlYWxQb3MsdGhpc319LHtrZXk6ImRpc3BsYWNlbWVudCIsdmFsdWU6ZnVuY3Rpb24gdmFsdWUoKXtyZXR1cm4gdGhpcy5pZGVhbFBvcy10aGlzLmN1cnJlbnRQb3N9fSx7a2V5OiJvdmVybGFwV2l0aE5vZGUiLHZhbHVlOmZ1bmN0aW9uIHZhbHVlKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowO3JldHVybiB0aGlzLmRpc3RhbmNlRnJvbSh0KS1lPDB9fSx7a2V5OiJvdmVybGFwV2l0aFBvaW50Iix2YWx1ZTpmdW5jdGlvbiB2YWx1ZSh0KXt2YXIgZT10aGlzLndpZHRoLzI7cmV0dXJuIHQ+PXRoaXMuY3VycmVudFBvcy1lJiZ0PD10aGlzLmN1cnJlbnRQb3MrZX19LHtrZXk6InBvc2l0aW9uQmVmb3JlIix2YWx1ZTpmdW5jdGlvbiB2YWx1ZSh0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MDtyZXR1cm4gdC5jdXJyZW50TGVmdCgpLXRoaXMud2lkdGgvMi1lfX0se2tleToicG9zaXRpb25BZnRlciIsdmFsdWU6ZnVuY3Rpb24gdmFsdWUodCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjA7cmV0dXJuIHQuY3VycmVudFJpZ2h0KCkrdGhpcy53aWR0aC8yK2V9fSx7a2V5OiJjdXJyZW50UmlnaHQiLHZhbHVlOmZ1bmN0aW9uIHZhbHVlKCl7cmV0dXJuIHRoaXMuY3VycmVudFBvcyt0aGlzLndpZHRoLzJ9fSx7a2V5OiJjdXJyZW50TGVmdCIsdmFsdWU6ZnVuY3Rpb24gdmFsdWUoKXtyZXR1cm4gdGhpcy5jdXJyZW50UG9zLXRoaXMud2lkdGgvMn19LHtrZXk6ImlkZWFsUmlnaHQiLHZhbHVlOmZ1bmN0aW9uIHZhbHVlKCl7cmV0dXJuIHRoaXMuaWRlYWxQb3MrdGhpcy53aWR0aC8yfX0se2tleToiaWRlYWxMZWZ0Iix2YWx1ZTpmdW5jdGlvbiB2YWx1ZSgpe3JldHVybiB0aGlzLmlkZWFsUG9zLXRoaXMud2lkdGgvMn19LHtrZXk6ImNyZWF0ZVN0dWIiLHZhbHVlOmZ1bmN0aW9uIHZhbHVlKGUpe3ZhciByPW5ldyB0KHRoaXMuaWRlYWxQb3MsZSx0aGlzLmRhdGEpO3JldHVybiByLmN1cnJlbnRQb3M9dGhpcy5jdXJyZW50UG9zLHIuY2hpbGQ9dGhpcyx0aGlzLnBhcmVudD1yLHJ9fSx7a2V5OiJyZW1vdmVTdHViIix2YWx1ZTpmdW5jdGlvbiB2YWx1ZSgpe3JldHVybiB0aGlzLnBhcmVudCYmKHRoaXMucGFyZW50LmNoaWxkPW51bGwsdGhpcy5wYXJlbnQ9bnVsbCksdGhpc319LHtrZXk6ImlzU3R1YiIsdmFsdWU6ZnVuY3Rpb24gdmFsdWUoKXtyZXR1cm4hIXRoaXMuY2hpbGR9fSx7a2V5OiJnZXRQYXRoVG9Sb290Iix2YWx1ZTpmdW5jdGlvbiB2YWx1ZSgpe2Zvcih2YXIgdD1bXSxlPXRoaXM7ZTspe3QucHVzaChlKSxlPWUucGFyZW50fXJldHVybiB0fX0se2tleToiZ2V0UGF0aEZyb21Sb290Iix2YWx1ZTpmdW5jdGlvbiB2YWx1ZSgpe3JldHVybiB0aGlzLmdldFBhdGhUb1Jvb3QoKS5yZXZlcnNlKCl9fSx7a2V5OiJnZXRQYXRoVG9Sb290TGVuZ3RoIix2YWx1ZTpmdW5jdGlvbiB2YWx1ZSgpe2Zvcih2YXIgdD0wLGU9dGhpcztlOyl7dmFyIHI9ZS5wYXJlbnQ/ZS5wYXJlbnQuY3VycmVudFBvczplLmlkZWFsUG9zO3QrPU1hdGguYWJzKGUuY3VycmVudFBvcy1yKSxlPWUucGFyZW50fXJldHVybiB0fX0se2tleToiZ2V0Um9vdCIsdmFsdWU6ZnVuY3Rpb24gdmFsdWUoKXtmb3IodmFyIHQ9dGhpcyxlPXRoaXM7ZTspe3Q9ZSxlPWUucGFyZW50fXJldHVybiB0fX0se2tleToiZ2V0TGF5ZXJJbmRleCIsdmFsdWU6ZnVuY3Rpb24gdmFsdWUoKXtyZXR1cm4gdGhpcy5sYXllckluZGV4fX0se2tleToiY2xvbmUiLHZhbHVlOmZ1bmN0aW9uIHZhbHVlKCl7dmFyIGU9bmV3IHQodGhpcy5pZGVhbFBvcyx0aGlzLndpZHRoLHRoaXMuZGF0YSk7cmV0dXJuIGUuY3VycmVudFBvcz10aGlzLmN1cnJlbnRQb3MsZS5sYXllckluZGV4PXRoaXMubGF5ZXJJbmRleCxlfX1dKSx0fSgpO3QuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUscil7dmFyIG49cigzKSxpPXIoNCksbz1yKDgpLHM9e25vZGVTcGFjaW5nOjMsbWluUG9zOjAsbWF4UG9zOm51bGwsYWxnb3JpdGhtOiJvdmVybGFwIixyZW1vdmVPdmVybGFwOiEwLGRlbnNpdHk6Ljg1LHN0dWJXaWR0aDoxfSx1PWZ1bmN0aW9uIHUodCl7dmFyIGU9e30scj1pLmV4dGVuZCh7fSxzKSx1PW5ldyBuLGE9W10sYz1udWxsO3JldHVybiBlLm5vZGVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQsYz1bdC5jb25jYXQoKV0sZSk6YX0sZS5nZXRMYXllcnM9ZnVuY3Rpb24oKXtyZXR1cm4gY30sZS5vcHRpb25zPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiByO3I9aS5leHRlbmQocix0KTt2YXIgbz1pLnBpY2socixPYmplY3Qua2V5cyhuLkRFRkFVTFRfT1BUSU9OUykpO3JldHVybiBpLmlzRGVmaW5lZChyLm1pblBvcykmJmkuaXNEZWZpbmVkKHIubWF4UG9zKT9vLmxheWVyV2lkdGg9ci5tYXhQb3Mtci5taW5Qb3M6by5sYXllcldpZHRoPW51bGwsdS5vcHRpb25zKG8pLGV9LGUub3B0aW9ucyh0KSxlLmNvbXB1dGU9ZnVuY3Rpb24oKXt2YXIgdD1pLnBpY2socixPYmplY3Qua2V5cyhvLkRFRkFVTFRfT1BUSU9OUykpO3JldHVybiBhLmZvckVhY2goZnVuY3Rpb24odCl7dC5yZW1vdmVTdHViKCl9KSxjPXUuZGlzdHJpYnV0ZShhKSxjLm1hcChmdW5jdGlvbihlLG4pe2UuZm9yRWFjaChmdW5jdGlvbih0KXt0LmxheWVySW5kZXg9bn0pLHIucmVtb3ZlT3ZlcmxhcCYmbyhlLHQpfSksZX0sZS5zdGFydD1mdW5jdGlvbigpe2NvbnNvbGUubG9nKCJbd2FybmluZ10gZm9yY2Uuc3RhcnQoKSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGZvcmNlLmNvbXB1dGUoKSBpbnN0ZWFkLiIpfSxlfTt1LkRFRkFVTFRfT1BUSU9OUz1zLHQuZXhwb3J0cz11fSxmdW5jdGlvbih0LGUscil7dmFyIG49cig0KSxpPXIoNiksbz17YWxnb3JpdGhtOiJvdmVybGFwIixsYXllcldpZHRoOjFlMyxkZW5zaXR5Oi43NSxub2RlU3BhY2luZzozLHN0dWJXaWR0aDoxfSxzPWZ1bmN0aW9uIHModCl7dmFyIGU9e307dD1uLmV4dGVuZCh7fSxvLHQpLGUub3B0aW9ucz1mdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLmV4dGVuZCh0LHIpLGUpOnR9LGUuY29tcHV0ZVJlcXVpcmVkV2lkdGg9ZnVuY3Rpb24oZSl7cmV0dXJuIG4uc3VtKGUsZnVuY3Rpb24oZSl7cmV0dXJuIGUud2lkdGgrdC5ub2RlU3BhY2luZ30pLXQubm9kZVNwYWNpbmd9LGUubWF4V2lkdGhQZXJMYXllcj1mdW5jdGlvbigpe3JldHVybiB0LmRlbnNpdHkqdC5sYXllcldpZHRofSxlLm5lZWRUb1NwbGl0PWZ1bmN0aW9uKHQpe3JldHVybiBlLmVzdGltYXRlUmVxdWlyZWRMYXllcnModCk+MX0sZS5lc3RpbWF0ZVJlcXVpcmVkTGF5ZXJzPWZ1bmN0aW9uKHIpe3JldHVybiB0LmxheWVyV2lkdGg/TWF0aC5jZWlsKGUuY29tcHV0ZVJlcXVpcmVkV2lkdGgocikvZS5tYXhXaWR0aFBlckxheWVyKCkpOjF9O3ZhciByPXtzaW1wbGU6ZnVuY3Rpb24gc2ltcGxlKHIpe2Zvcih2YXIgbj1lLmVzdGltYXRlUmVxdWlyZWRMYXllcnMociksaT1bXSxvPTA7bzxuO28rKyl7aS5wdXNoKFtdKX1yZXR1cm4gci5mb3JFYWNoKGZ1bmN0aW9uKGUscil7dmFyIG89ciVuO2lbb10ucHVzaChlKTtmb3IodmFyIHM9ZSx1PW8tMTt1Pj0wO3UtLSl7cz1zLmNyZWF0ZVN0dWIodC5zdHViV2lkdGgpLGlbdV0ucHVzaChzKX19KSxpfSxyb3VuZFJvYmluOmZ1bmN0aW9uIHJvdW5kUm9iaW4odCl7dmFyIGU9W107cmV0dXJuIGV9LG92ZXJsYXA6ZnVuY3Rpb24gb3ZlcmxhcChyKXtmb3IodmFyIG49W10saT1lLm1heFdpZHRoUGVyTGF5ZXIoKSxvPXIuY29uY2F0KCkscz1lLmNvbXB1dGVSZXF1aXJlZFdpZHRoKG8pO3M+aTspe2UuY291bnRJZGVhbE92ZXJsYXBzKG8pO3ZhciB1PW8uY29uY2F0KCksYT1zO2ZvcihvPVtdO3UubGVuZ3RoPjImJmE+aTspe3Uuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBlLm92ZXJsYXBDb3VudC10Lm92ZXJsYXBDb3VudH0pO3ZhciBjPXUuc2hpZnQoKTthLT1jLndpZHRoLGErPXQuc3R1YldpZHRoLGMub3ZlcmxhcHMuZm9yRWFjaChmdW5jdGlvbih0KXt0Lm92ZXJsYXBDb3VudC0tfSksby5wdXNoKGMpfW4ucHVzaCh1KSxzPWUuY29tcHV0ZVJlcXVpcmVkV2lkdGgobyl9by5sZW5ndGg+MCYmbi5wdXNoKG8pO2Zvcih2YXIgaD1uLmxlbmd0aC0xO2g+PTE7aC0tKXtmb3IodmFyIGw9bltoXSxmPTA7ZjxsLmxlbmd0aDtmKyspe3ZhciBwPWxbZl07aWYoIXAuaXNTdHViKCkpZm9yKHZhciBkPXAsdj1oLTE7dj49MDt2LS0pe2Q9ZC5jcmVhdGVTdHViKHQuc3R1YldpZHRoKSxuW3ZdLnB1c2goZCl9fX1yZXR1cm4gbn19O3JldHVybiBlLmNvdW50SWRlYWxPdmVybGFwcz1mdW5jdGlvbihlKXt2YXIgcj1uZXcgaSh0LmxheWVyV2lkdGgvMik7cmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbih0KXtyLmFkZChbdC5pZGVhbExlZnQoKSx0LmlkZWFsUmlnaHQoKSx0XSl9KSxlLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9ci5zZWFyY2godC5pZGVhbExlZnQoKSx0LmlkZWFsUmlnaHQoKSk7dC5vdmVybGFwcz1lLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5kYXRhWzJdfSksdC5vdmVybGFwQ291bnQ9ZS5sZW5ndGh9KSxlfSxlLmRpc3RyaWJ1dGU9ZnVuY3Rpb24oaSl7aWYoIWl8fDA9PT1pLmxlbmd0aClyZXR1cm5bXTtpZigibm9uZSI9PXQuYWxnb3JpdGhtfHwhbi5pc0RlZmluZWQodC5hbGdvcml0aG0pKXJldHVybltpXTtpZighZS5uZWVkVG9TcGxpdChpKSlyZXR1cm5baV07dmFyIG89aS5jb25jYXQoKS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuaWRlYWxQb3MtZS5pZGVhbFBvc30pO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LmFsZ29yaXRobSlyZXR1cm4gdC5hbGdvcml0aG0obyx0KTtpZihyLmhhc093blByb3BlcnR5KHQuYWxnb3JpdGhtKSlyZXR1cm4gclt0LmFsZ29yaXRobV0obyk7dGhyb3ciVW5rbm93biBhbGdvcml0aG06ICIrdC5hbGdvcml0aG19LGV9O3MuREVGQVVMVF9PUFRJT05TPW8sdC5leHBvcnRzPXN9LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj17aXNEZWZpbmVkOmZ1bmN0aW9uIGlzRGVmaW5lZCh0KXtyZXR1cm4gbnVsbCE9PXQmJnZvaWQgMCE9PXR9LGxhc3Q6ZnVuY3Rpb24gbGFzdCh0KXtyZXR1cm4gdC5sZW5ndGg+MD90W3QubGVuZ3RoLTFdOm51bGx9LHBpY2s6ZnVuY3Rpb24gcGljayh0LGUpe3JldHVybiBlLnJlZHVjZShmdW5jdGlvbihlLHIpe3JldHVybiBlW3JdPXRbcl0sZX0se30pfSxzdW06ZnVuY3Rpb24gc3VtKHQsZSl7cmV0dXJuIHQubWFwKGUpLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiB0K2V9LDApfX07bi5leHRlbmQ9cig1KSx0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlKXt2YXIgcj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09X3R5cGVvZihTeW1ib2wuaXRlcmF0b3IpP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdD09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2YodCl9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdD09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2YodCl9LG49T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxpPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsbz1mdW5jdGlvbiBvKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBBcnJheS5pc0FycmF5P0FycmF5LmlzQXJyYXkodCk6IltvYmplY3QgQXJyYXldIj09PWkuY2FsbCh0KX0scz1mdW5jdGlvbiBzKHQpe2lmKCF0fHwiW29iamVjdCBPYmplY3RdIiE9PWkuY2FsbCh0KSlyZXR1cm4hMTt2YXIgZT1uLmNhbGwodCwiY29uc3RydWN0b3IiKSxyPXQuY29uc3RydWN0b3ImJnQuY29uc3RydWN0b3IucHJvdG90eXBlJiZuLmNhbGwodC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsImlzUHJvdG90eXBlT2YiKTtpZih0LmNvbnN0cnVjdG9yJiYhZSYmIXIpcmV0dXJuITE7dmFyIG87Zm9yKG8gaW4gdCl7fXJldHVybiB2b2lkIDA9PT1vfHxuLmNhbGwodCxvKX07dC5leHBvcnRzPWZ1bmN0aW9uIHUoKXt2YXIgdCxlLG4saSxhLGMsaD1hcmd1bWVudHNbMF0sbD0xLGY9YXJndW1lbnRzLmxlbmd0aCxwPSExO2ZvcigiYm9vbGVhbiI9PXR5cGVvZiBoPyhwPWgsaD1hcmd1bWVudHNbMV18fHt9LGw9Mik6KCJvYmplY3QiIT09KCJ1bmRlZmluZWQiPT10eXBlb2YgaD8idW5kZWZpbmVkIjpyKGgpKSYmImZ1bmN0aW9uIiE9dHlwZW9mIGh8fG51bGw9PWgpJiYoaD17fSk7bDxmOysrbCl7aWYodD1hcmd1bWVudHNbbF0sbnVsbCE9dClmb3IoZSBpbiB0KXtuPWhbZV0saT10W2VdLGghPT1pJiYocCYmaSYmKHMoaSl8fChhPW8oaSkpKT8oYT8oYT0hMSxjPW4mJm8obik/bjpbXSk6Yz1uJiZzKG4pP246e30saFtlXT11KHAsYyxpKSk6dm9pZCAwIT09aSYmKGhbZV09aSkpfX1yZXR1cm4gaH19LGZ1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSl7aWYoZXx8KGU9e30pLHRoaXMuc3RhcnRLZXk9ZS5zdGFydEtleXx8MCx0aGlzLmVuZEtleT1lLmVuZEtleXx8MSx0aGlzLmludGVydmFsSGFzaD17fSx0aGlzLnBvaW50VHJlZT1uZXcgYyh7Y29tcGFyZTpmdW5jdGlvbiBjb21wYXJlKHQsZSl7aWYobnVsbD09dClyZXR1cm4tMTtpZihudWxsPT1lKXJldHVybiAxO3ZhciByPXRbMF0tZVswXTtyZXR1cm4gcj4wPzE6MD09cj8wOi0xfX0pLHRoaXMuX2F1dG9JbmNyZW1lbnQ9MCwhdHx8Im51bWJlciIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcigieW91IG11c3Qgc3BlY2lmeSBjZW50ZXIgaW5kZXggYXMgdGhlIDJuZCBhcmd1bWVudC4iKTt0aGlzLnJvb3Q9bmV3IHUodCx0aGlzKX1mdW5jdGlvbiBpKHQsZSl7cmV0dXJuIGUuZW5kPHQuaWR4Pyh0LmxlZnR8fCh0LmxlZnQ9bmV3IHUoZS5zdGFydCtlLmVuZD4+MSx0aGlzKSksaS5jYWxsKHRoaXMsdC5sZWZ0LGUpKTp0LmlkeDxlLnN0YXJ0Pyh0LnJpZ2h0fHwodC5yaWdodD1uZXcgdShlLnN0YXJ0K2UuZW5kPj4xLHRoaXMpKSxpLmNhbGwodGhpcyx0LnJpZ2h0LGUpKTp0Lmluc2VydChlKX1mdW5jdGlvbiBvKHQsZSxyKXtpZih0KXJldHVybiBlPHQuaWR4Pyh0LnN0YXJ0cy5ldmVyeShmdW5jdGlvbih0KXt2YXIgbj10LnN0YXJ0PD1lO3JldHVybiBuJiZyLnB1c2godC5yZXN1bHQoKSksbn0pLG8uY2FsbCh0aGlzLHQubGVmdCxlLHIpKTplPnQuaWR4Pyh0LmVuZHMuZXZlcnkoZnVuY3Rpb24odCl7dmFyIG49dC5lbmQ+PWU7cmV0dXJuIG4mJnIucHVzaCh0LnJlc3VsdCgpKSxufSksby5jYWxsKHRoaXMsdC5yaWdodCxlLHIpKTp2b2lkIHQuc3RhcnRzLm1hcChmdW5jdGlvbih0KXtyLnB1c2godC5yZXN1bHQoKSl9KX1mdW5jdGlvbiBzKHQsZSxyKXtpZihlLXQ8PTApdGhyb3cgbmV3IEVycm9yKCJlbmQgbXVzdCBiZSBncmVhdGVyIHRoYW4gc3RhcnQuIHN0YXJ0OiAiK3QrIiwgZW5kOiAiK2UpO3ZhciBuPXt9LGk9W107by5jYWxsKHRoaXMsdGhpcy5yb290LHQrZT4+MSxpLCEwKSxpLmZvckVhY2goZnVuY3Rpb24odCl7blt0LmlkXT0hMH0pO2Zvcih2YXIgcz10aGlzLnBvaW50VHJlZS5ic2VhcmNoKFt0LG51bGxdKSx1PXRoaXMucG9pbnRUcmVlO3M+PTAmJnVbc11bMF09PXQ7KXtzLS19dmFyIGE9dGhpcy5wb2ludFRyZWUuYnNlYXJjaChbZSxudWxsXSk7aWYoYT49MCl7Zm9yKHZhciBjPXUubGVuZ3RoLTE7YTw9YyYmdVthXVswXTw9ZTspe2ErK311LnNsaWNlKHMrMSxhKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPXRbMV07bltlXT0hMH0sdGhpcyksT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihuKXt2YXIgaT10aGlzLmludGVydmFsSGFzaFtuXTtyLnB1c2goaS5yZXN1bHQodCxlKSl9LHRoaXMpfX1mdW5jdGlvbiB1KHQpe3RoaXMuaWR4PXQsdGhpcy5zdGFydHM9bmV3IGMoe2NvbXBhcmU6ZnVuY3Rpb24gY29tcGFyZSh0LGUpe2lmKG51bGw9PXQpcmV0dXJuLTE7aWYobnVsbD09ZSlyZXR1cm4gMTt2YXIgcj10LnN0YXJ0LWUuc3RhcnQ7cmV0dXJuIHI+MD8xOjA9PXI/MDotMX19KSx0aGlzLmVuZHM9bmV3IGMoe2NvbXBhcmU6ZnVuY3Rpb24gY29tcGFyZSh0LGUpe2lmKG51bGw9PXQpcmV0dXJuLTE7aWYobnVsbD09ZSlyZXR1cm4gMTt2YXIgcj10LmVuZC1lLmVuZDtyZXR1cm4gcjwwPzE6MD09cj8wOi0xfX0pfWZ1bmN0aW9uIGEodCxlLHIsbil7aWYodGhpcy5pZD1lLHRoaXMuc3RhcnQ9dFtyXSx0aGlzLmVuZD10W25dLHRoaXMuZGF0YT10LCJudW1iZXIiIT10eXBlb2YgdGhpcy5zdGFydHx8Im51bWJlciIhPXR5cGVvZiB0aGlzLmVuZCl0aHJvdyBuZXcgRXJyb3IoInN0YXJ0LCBlbmQgbXVzdCBiZSBudW1iZXIuIHN0YXJ0OiAiK3RoaXMuc3RhcnQrIiwgZW5kOiAiK3RoaXMuZW5kKTtpZih0aGlzLnN0YXJ0Pj10aGlzLmVuZCl0aHJvdyBuZXcgRXJyb3IoInN0YXJ0IG11c3QgYmUgc21hbGxlciB0aGFuIGVuZC4gc3RhcnQ6ICIrdGhpcy5zdGFydCsiLCBlbmQ6ICIrdGhpcy5lbmQpfXZhciBjPXIoNyk7bi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5pbnRlcnZhbEhhc2hbZV0pdGhyb3cgbmV3IEVycm9yKCJpZCAiK2UrIiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuIik7aWYodm9pZCAwPT1lKXtmb3IoO3RoaXMuaW50ZXJ2YWxIYXNoW3RoaXMuX2F1dG9JbmNyZW1lbnRdOyl7dGhpcy5fYXV0b0luY3JlbWVudCsrfWU9dGhpcy5fYXV0b0luY3JlbWVudH12YXIgcj1uZXcgYSh0LGUsdGhpcy5zdGFydEtleSx0aGlzLmVuZEtleSk7dGhpcy5wb2ludFRyZWUuaW5zZXJ0KFtyLnN0YXJ0LGVdKSx0aGlzLnBvaW50VHJlZS5pbnNlcnQoW3IuZW5kLGVdKSx0aGlzLmludGVydmFsSGFzaFtlXT1yLHRoaXMuX2F1dG9JbmNyZW1lbnQrKyxpLmNhbGwodGhpcyx0aGlzLnJvb3Qscil9LG4ucHJvdG90eXBlLnNlYXJjaD1mdW5jdGlvbih0LGUpe3ZhciByPVtdO2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IodCsiOiBpbnZhbGlkIGlucHV0Iik7aWYodm9pZCAwPT1lKW8uY2FsbCh0aGlzLHRoaXMucm9vdCx0LHIpO2Vsc2V7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcih0KyIsIitlKyI6IGludmFsaWQgaW5wdXQiKTtzLmNhbGwodGhpcyx0LGUscil9cmV0dXJuIHJ9LG4ucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXt9LHUucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0KXt0aGlzLnN0YXJ0cy5pbnNlcnQodCksdGhpcy5lbmRzLmluc2VydCh0KX0sYS5wcm90b3R5cGUucmVzdWx0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9e2lkOnRoaXMuaWQsZGF0YTp0aGlzLmRhdGF9O2lmKCJudW1iZXIiPT10eXBlb2YgdCYmIm51bWJlciI9PXR5cGVvZiBlKXt2YXIgbj1NYXRoLm1heCh0aGlzLnN0YXJ0LHQpLGk9TWF0aC5taW4odGhpcy5lbmQsZSksbz1pLW47ci5yYXRlMT1vLyhlLXQpLHIucmF0ZTI9by8odGhpcy5lbmQtdGhpcy5zdGFydCl9cmV0dXJuIHJ9LHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUpe3ZhciByPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT1fdHlwZW9mKFN5bWJvbC5pdGVyYXRvcik/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0PT09InVuZGVmaW5lZCI/InVuZGVmaW5lZCI6X3R5cGVvZih0KX06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0PT09InVuZGVmaW5lZCI/InVuZGVmaW5lZCI6X3R5cGVvZih0KX0sbj1mdW5jdGlvbiBpKCl7dmFyIHQ9bnVsbCxlPXt9LG49YXJndW1lbnRzO1siMCIsIjEiXS5mb3JFYWNoKGZ1bmN0aW9uKGkpe3ZhciBvPW5baV07QXJyYXkuaXNBcnJheShvKT90PW86byYmIm9iamVjdCI9PSgidW5kZWZpbmVkIj09dHlwZW9mIG8/InVuZGVmaW5lZCI6cihvKSkmJihlPW8pfSksImZ1bmN0aW9uIj09dHlwZW9mIGUuZmlsdGVyJiYodGhpcy5fZmlsdGVyPWUuZmlsdGVyKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5jb21wYXJlP3RoaXMuX2NvbXBhcmU9ZS5jb21wYXJlOiJzdHJpbmciPT10eXBlb2YgZS5jb21wYXJlJiZpLmNvbXBhcmVzW2UuY29tcGFyZV0mJih0aGlzLl9jb21wYXJlPWkuY29tcGFyZXNbZS5jb21wYXJlXSksdGhpcy5fdW5pcXVlPSEhZS51bmlxdWUsZS5yZXN1bWUmJnQ/dC5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7dGhpcy5wdXNoKHQpfSx0aGlzKTp0JiZ0aGlzLmluc2VydC5hcHBseSh0aGlzLHQpfTtuLmNyZWF0ZT1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgbih0LGUpfSxuLnByb3RvdHlwZT1uZXcgQXJyYXksbi5wcm90b3R5cGUuY29uc3RydWN0b3I9QXJyYXkucHJvdG90eXBlLmNvbnN0cnVjdG9yLG4ucHJvdG90eXBlLmluc2VydE9uZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmJzZWFyY2godCk7cmV0dXJuKCF0aGlzLl91bmlxdWV8fG51bGw9PXRoaXMua2V5KHQsZSkpJiYhIXRoaXMuX2ZpbHRlcih0LGUpJiYodGhpcy5zcGxpY2UoZSsxLDAsdCksZSsxKX0sbi5wcm90b3R5cGUuaW5zZXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChhcmd1bWVudHMsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW5zZXJ0T25lKHQpfSx0aGlzKX0sbi5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNwbGljZSh0LDEpLHRoaXN9LG4ucHJvdG90eXBlLmJzZWFyY2g9ZnVuY3Rpb24odCl7aWYoIXRoaXMubGVuZ3RoKXJldHVybi0xO2Zvcih2YXIgZSxyPTAsbj10aGlzLmxlbmd0aDtuLXI+MTspe2U9TWF0aC5mbG9vcigocituKS8yKTt2YXIgaT10aGlzW2VdLG89dGhpcy5fY29tcGFyZSh0LGkpO2lmKDA9PW8pcmV0dXJuIGU7bz4wP3I9ZTpuPWV9cmV0dXJuIDA9PXImJnRoaXMuX2NvbXBhcmUodGhpc1swXSx0KT4wPy0xOnJ9LG4ucHJvdG90eXBlLmtleT1mdW5jdGlvbih0LGUpe251bGw9PWUmJihlPXRoaXMuYnNlYXJjaCh0KSk7dmFyIHI9ZTtpZihyPT0tMXx8dGhpcy5fY29tcGFyZSh0aGlzW3JdLHQpPDApcmV0dXJuIHIrMTx0aGlzLmxlbmd0aCYmMD09dGhpcy5fY29tcGFyZSh0aGlzW3IrMV0sdCk/cisxOm51bGw7Zm9yKDtyPj0xJiYwPT10aGlzLl9jb21wYXJlKHRoaXNbci0xXSx0KTspe3ItLX1yZXR1cm4gcn0sbi5wcm90b3R5cGUua2V5cz1mdW5jdGlvbih0LGUpe3ZhciByPVtdO251bGw9PWUmJihlPXRoaXMuYnNlYXJjaCh0KSk7Zm9yKHZhciBuPWU7bj49MCYmMD09dGhpcy5fY29tcGFyZSh0aGlzW25dLHQpOyl7ci5wdXNoKG4pLG4tLX12YXIgaT10aGlzLmxlbmd0aDtmb3Iobj1lKzE7bjxpJiYwPT10aGlzLl9jb21wYXJlKHRoaXNbbl0sdCk7KXtyLnB1c2gobiksbisrfXJldHVybiByLmxlbmd0aD9yOm51bGx9LG4ucHJvdG90eXBlLnVuaXF1ZT1mdW5jdGlvbih0KXtpZih0KXJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbih0LGUpe3JldHVybiAwPT1lfHwwIT10aGlzLl9jb21wYXJlKHRoaXNbZS0xXSx0KX0sdGhpcyk7dmFyIGU9MDtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odCxyKXtyZXR1cm4gMD09cnx8MCE9dGhpcy5fY29tcGFyZSh0aGlzW3ItMV0sdCk/bnVsbDpyLWUrK30sdGhpcykuZm9yRWFjaChmdW5jdGlvbih0KXtudWxsIT10JiZ0aGlzLnJlbW92ZSh0KX0sdGhpcyksdGhpc30sbi5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNsaWNlKCl9LG4ucHJvdG90eXBlLl9maWx0ZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4hMH0sbi5jb21wYXJlcz17bnVtYmVyOmZ1bmN0aW9uIG51bWJlcih0LGUpe3ZhciByPXQtZTtyZXR1cm4gcj4wPzE6MD09cj8wOi0xfSxzdHJpbmc6ZnVuY3Rpb24gc3RyaW5nKHQsZSl7cmV0dXJuIHQ+ZT8xOnQ9PWU/MDotMX19LG4ucHJvdG90eXBlLl9jb21wYXJlPW4uY29tcGFyZXMuc3RyaW5nLHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0KXt2YXIgZT1uZXcgcy5WYXJpYWJsZSh0LnRhcmdldFBvcyk7cmV0dXJuIGUubm9kZT10LGV9ZnVuY3Rpb24gaSh0LGUpe2lmKHQubGVuZ3RoPjApe2U9by5leHRlbmQodSxlKSx0LmZvckVhY2goZnVuY3Rpb24odCxlKXt0LnRhcmdldFBvcz10LnBhcmVudD90LnBhcmVudC5jdXJyZW50UG9zOnQuaWRlYWxQb3MsdC5pbmRleD1lfSk7Zm9yKHZhciByPXQuY29uY2F0KCkuc29ydChmdW5jdGlvbih0LGUpe3ZhciByPXQudGFyZ2V0UG9zLWUudGFyZ2V0UG9zO2lmKDAhPT1yKXJldHVybiByO3ZhciBuPXQuaXNTdHViKCktZS5pc1N0dWIoKTtyZXR1cm4gMCE9PW4/bjp0LmluZGV4LWUuaW5kZXh9KS5tYXAobiksaT1bXSxhPTE7YTxyLmxlbmd0aDthKyspe3ZhciBjPXJbYS0xXSxoPXJbYV0sbD12b2lkIDA7bD1jLm5vZGUuaXNTdHViKCkmJmgubm9kZS5pc1N0dWIoKT8oYy5ub2RlLndpZHRoK2gubm9kZS53aWR0aCkvMitlLmxpbmVTcGFjaW5nOihjLm5vZGUud2lkdGgraC5ub2RlLndpZHRoKS8yK2Uubm9kZVNwYWNpbmcsaS5wdXNoKG5ldyBzLkNvbnN0cmFpbnQoYyxoLGwpKX1pZihvLmlzRGVmaW5lZChlLm1pblBvcykpe3ZhciBmPW5ldyBzLlZhcmlhYmxlKGUubWluUG9zLDFlMTApLHA9clswXTtpLnB1c2gobmV3IHMuQ29uc3RyYWludChmLHAscC5ub2RlLndpZHRoLzIpKSxyLnVuc2hpZnQoZil9aWYoby5pc0RlZmluZWQoZS5tYXhQb3MpKXt2YXIgZD1uZXcgcy5WYXJpYWJsZShlLm1heFBvcywxZTEwKSx2PW8ubGFzdChyKTtpLnB1c2gobmV3IHMuQ29uc3RyYWludCh2LGQsdi5ub2RlLndpZHRoLzIpKSxyLnB1c2goZCl9bmV3IHMuU29sdmVyKHIsaSkuc29sdmUoKSxyLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdC5ub2RlfSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm5vZGUuY3VycmVudFBvcz1NYXRoLnJvdW5kKHQucG9zaXRpb24oKSksdH0pfXJldHVybiB0fXZhciBvPXIoNCkscz1yKDkpLHU9e2xpbmVTcGFjaW5nOjIsbm9kZVNwYWNpbmc6MyxtaW5Qb3M6MCxtYXhQb3M6bnVsbH07aS5ERUZBVUxUX09QVElPTlM9dSx0LmV4cG9ydHM9aX0sZnVuY3Rpb24odCxlKXt2YXIgcj17fSxuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLnNjYWxlPXQsdGhpcy5BQj0wLHRoaXMuQUQ9MCx0aGlzLkEyPTB9cmV0dXJuIHQucHJvdG90eXBlLmFkZFZhcmlhYmxlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc2NhbGUvdC5zY2FsZSxyPXQub2Zmc2V0L3Quc2NhbGUsbj10LndlaWdodDt0aGlzLkFCKz1uKmUqcix0aGlzLkFEKz1uKmUqdC5kZXNpcmVkUG9zaXRpb24sdGhpcy5BMis9biplKmV9LHQucHJvdG90eXBlLmdldFBvc249ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5BRC10aGlzLkFCKS90aGlzLkEyfSx0fSgpO3IuUG9zaXRpb25TdGF0cz1uO3ZhciBpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUscixuKXt2b2lkIDA9PT1uJiYobj0hMSksdGhpcy5sZWZ0PXQsdGhpcy5yaWdodD1lLHRoaXMuZ2FwPXIsdGhpcy5lcXVhbGl0eT1uLHRoaXMuYWN0aXZlPSExLHRoaXMudW5zYXRpc2ZpYWJsZT0hMSx0aGlzLmxlZnQ9dCx0aGlzLnJpZ2h0PWUsdGhpcy5nYXA9cix0aGlzLmVxdWFsaXR5PW59cmV0dXJuIHQucHJvdG90eXBlLnNsYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5zYXRpc2ZpYWJsZT9OdW1iZXIuTUFYX1ZBTFVFOnRoaXMucmlnaHQuc2NhbGUqdGhpcy5yaWdodC5wb3NpdGlvbigpLXRoaXMuZ2FwLXRoaXMubGVmdC5zY2FsZSp0aGlzLmxlZnQucG9zaXRpb24oKX0sdH0oKTtyLkNvbnN0cmFpbnQ9aTt2YXIgbz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLHIpe3ZvaWQgMD09PWUmJihlPTEpLHZvaWQgMD09PXImJihyPTEpLHRoaXMuZGVzaXJlZFBvc2l0aW9uPXQsdGhpcy53ZWlnaHQ9ZSx0aGlzLnNjYWxlPXIsdGhpcy5vZmZzZXQ9MH1yZXR1cm4gdC5wcm90b3R5cGUuZGZkdj1mdW5jdGlvbigpe3JldHVybiAyKnRoaXMud2VpZ2h0Kih0aGlzLnBvc2l0aW9uKCktdGhpcy5kZXNpcmVkUG9zaXRpb24pfSx0LnByb3RvdHlwZS5wb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybih0aGlzLmJsb2NrLnBzLnNjYWxlKnRoaXMuYmxvY2sucG9zbit0aGlzLm9mZnNldCkvdGhpcy5zY2FsZX0sdC5wcm90b3R5cGUudmlzaXROZWlnaGJvdXJzPWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZnVuY3Rpb24gcihfcixuKXtyZXR1cm4gX3IuYWN0aXZlJiZ0IT09biYmZShfcixuKX07dGhpcy5jT3V0LmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIHIodCx0LnJpZ2h0KX0pLHRoaXMuY0luLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIHIodCx0LmxlZnQpfSl9LHR9KCk7ci5WYXJpYWJsZT1vO3ZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLnZhcnM9W10sdC5vZmZzZXQ9MCx0aGlzLnBzPW5ldyBuKHQuc2NhbGUpLHRoaXMuYWRkVmFyaWFibGUodCl9cmV0dXJuIHQucHJvdG90eXBlLmFkZFZhcmlhYmxlPWZ1bmN0aW9uKHQpe3QuYmxvY2s9dGhpcyx0aGlzLnZhcnMucHVzaCh0KSx0aGlzLnBzLmFkZFZhcmlhYmxlKHQpLHRoaXMucG9zbj10aGlzLnBzLmdldFBvc24oKX0sdC5wcm90b3R5cGUudXBkYXRlV2VpZ2h0ZWRQb3NpdGlvbj1mdW5jdGlvbigpe3RoaXMucHMuQUI9dGhpcy5wcy5BRD10aGlzLnBzLkEyPTA7Zm9yKHZhciB0PTAsZT10aGlzLnZhcnMubGVuZ3RoO3Q8ZTsrK3Qpe3RoaXMucHMuYWRkVmFyaWFibGUodGhpcy52YXJzW3RdKX10aGlzLnBvc249dGhpcy5wcy5nZXRQb3NuKCl9LHQucHJvdG90eXBlLmNvbXB1dGVfbG09ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMsaT10LmRmZHYoKTtyZXR1cm4gdC52aXNpdE5laWdoYm91cnMoZSxmdW5jdGlvbihlLG8pe3ZhciBzPW4uY29tcHV0ZV9sbShvLHQscik7bz09PWUucmlnaHQ/KGkrPXMqZS5sZWZ0LnNjYWxlLGUubG09cyk6KGkrPXMqZS5yaWdodC5zY2FsZSxlLmxtPS1zKSxyKGUpfSksaS90LnNjYWxlfSx0LnByb3RvdHlwZS5wb3B1bGF0ZVNwbGl0QmxvY2s9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzO3QudmlzaXROZWlnaGJvdXJzKGUsZnVuY3Rpb24oZSxuKXtuLm9mZnNldD10Lm9mZnNldCsobj09PWUucmlnaHQ/ZS5nYXA6LWUuZ2FwKSxyLmFkZFZhcmlhYmxlKG4pLHIucG9wdWxhdGVTcGxpdEJsb2NrKG4sdCl9KX0sdC5wcm90b3R5cGUudHJhdmVyc2U9ZnVuY3Rpb24odCxlLHIsbil7dmFyIGk9dGhpczt2b2lkIDA9PT1yJiYocj10aGlzLnZhcnNbMF0pLHZvaWQgMD09PW4mJihuPW51bGwpLHIudmlzaXROZWlnaGJvdXJzKG4sZnVuY3Rpb24obixvKXtlLnB1c2godChuKSksaS50cmF2ZXJzZSh0LGUsbyxyKX0pfSx0LnByb3RvdHlwZS5maW5kTWluTE09ZnVuY3Rpb24oKXt2YXIgdD1udWxsO3JldHVybiB0aGlzLmNvbXB1dGVfbG0odGhpcy52YXJzWzBdLG51bGwsZnVuY3Rpb24oZSl7IWUuZXF1YWxpdHkmJihudWxsPT09dHx8ZS5sbTx0LmxtKSYmKHQ9ZSl9KSx0fSx0LnByb3RvdHlwZS5maW5kTWluTE1CZXR3ZWVuPWZ1bmN0aW9uKHQsZSl7dGhpcy5jb21wdXRlX2xtKHQsbnVsbCxmdW5jdGlvbigpe30pO3ZhciByPW51bGw7cmV0dXJuIHRoaXMuZmluZFBhdGgodCxudWxsLGUsZnVuY3Rpb24odCxlKXshdC5lcXVhbGl0eSYmdC5yaWdodD09PWUmJihudWxsPT09cnx8dC5sbTxyLmxtKSYmKHI9dCl9KSxyfSx0LnByb3RvdHlwZS5maW5kUGF0aD1mdW5jdGlvbih0LGUscixuKXt2YXIgaT10aGlzLG89ITE7cmV0dXJuIHQudmlzaXROZWlnaGJvdXJzKGUsZnVuY3Rpb24oZSxzKXtvfHxzIT09ciYmIWkuZmluZFBhdGgocyx0LHIsbil8fChvPSEwLG4oZSxzKSl9KSxvfSx0LnByb3RvdHlwZS5pc0FjdGl2ZURpcmVjdGVkUGF0aEJldHdlZW49ZnVuY3Rpb24odCxlKXtpZih0PT09ZSlyZXR1cm4hMDtmb3IodmFyIHI9dC5jT3V0Lmxlbmd0aDtyLS07KXt2YXIgbj10LmNPdXRbcl07aWYobi5hY3RpdmUmJnRoaXMuaXNBY3RpdmVEaXJlY3RlZFBhdGhCZXR3ZWVuKG4ucmlnaHQsZSkpcmV0dXJuITB9cmV0dXJuITF9LHQuc3BsaXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuYWN0aXZlPSExLFt0LmNyZWF0ZVNwbGl0QmxvY2soZS5sZWZ0KSx0LmNyZWF0ZVNwbGl0QmxvY2soZS5yaWdodCldfSx0LmNyZWF0ZVNwbGl0QmxvY2s9ZnVuY3Rpb24oZSl7dmFyIHI9bmV3IHQoZSk7cmV0dXJuIHIucG9wdWxhdGVTcGxpdEJsb2NrKGUsbnVsbCkscn0sdC5wcm90b3R5cGUuc3BsaXRCZXR3ZWVuPWZ1bmN0aW9uKGUscil7dmFyIG49dGhpcy5maW5kTWluTE1CZXR3ZWVuKGUscik7aWYobnVsbCE9PW4pe3ZhciBpPXQuc3BsaXQobik7cmV0dXJue2NvbnN0cmFpbnQ6bixsYjppWzBdLHJiOmlbMV19fXJldHVybiBudWxsfSx0LnByb3RvdHlwZS5tZXJnZUFjcm9zcz1mdW5jdGlvbih0LGUscil7ZS5hY3RpdmU9ITA7Zm9yKHZhciBuPTAsaT10LnZhcnMubGVuZ3RoO248aTsrK24pe3ZhciBvPXQudmFyc1tuXTtvLm9mZnNldCs9cix0aGlzLmFkZFZhcmlhYmxlKG8pfXRoaXMucG9zbj10aGlzLnBzLmdldFBvc24oKX0sdC5wcm90b3R5cGUuY29zdD1mdW5jdGlvbigpe2Zvcih2YXIgdD0wLGU9dGhpcy52YXJzLmxlbmd0aDtlLS07KXt2YXIgcj10aGlzLnZhcnNbZV0sbj1yLnBvc2l0aW9uKCktci5kZXNpcmVkUG9zaXRpb247dCs9bipuKnIud2VpZ2h0fXJldHVybiB0fSx0fSgpO3IuQmxvY2s9czt2YXIgdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy52cz10O3ZhciBlPXQubGVuZ3RoO2Zvcih0aGlzLmxpc3Q9bmV3IEFycmF5KGUpO2UtLTspe3ZhciByPW5ldyBzKHRbZV0pO3RoaXMubGlzdFtlXT1yLHIuYmxvY2tJbmQ9ZX19cmV0dXJuIHQucHJvdG90eXBlLmNvc3Q9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPXRoaXMubGlzdC5sZW5ndGg7ZS0tOyl7dCs9dGhpcy5saXN0W2VdLmNvc3QoKX1yZXR1cm4gdH0sdC5wcm90b3R5cGUuaW5zZXJ0PWZ1bmN0aW9uKHQpe3QuYmxvY2tJbmQ9dGhpcy5saXN0Lmxlbmd0aCx0aGlzLmxpc3QucHVzaCh0KX0sdC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubGlzdC5sZW5ndGgtMSxyPXRoaXMubGlzdFtlXTt0aGlzLmxpc3QubGVuZ3RoPWUsdCE9PXImJih0aGlzLmxpc3RbdC5ibG9ja0luZF09cixyLmJsb2NrSW5kPXQuYmxvY2tJbmQpfSx0LnByb3RvdHlwZS5tZXJnZT1mdW5jdGlvbih0KXt2YXIgZT10LmxlZnQuYmxvY2sscj10LnJpZ2h0LmJsb2NrLG49dC5yaWdodC5vZmZzZXQtdC5sZWZ0Lm9mZnNldC10LmdhcDtlLnZhcnMubGVuZ3RoPHIudmFycy5sZW5ndGg/KHIubWVyZ2VBY3Jvc3MoZSx0LG4pLHRoaXMucmVtb3ZlKGUpKTooZS5tZXJnZUFjcm9zcyhyLHQsLW4pLHRoaXMucmVtb3ZlKHIpKX0sdC5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0KXt0aGlzLmxpc3QuZm9yRWFjaCh0KX0sdC5wcm90b3R5cGUudXBkYXRlQmxvY2tQb3NpdGlvbnM9ZnVuY3Rpb24oKXt0aGlzLmxpc3QuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gdC51cGRhdGVXZWlnaHRlZFBvc2l0aW9uKCl9KX0sdC5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0aGlzLnVwZGF0ZUJsb2NrUG9zaXRpb25zKCksdGhpcy5saXN0LmZvckVhY2goZnVuY3Rpb24ocil7dmFyIG49ci5maW5kTWluTE0oKTtudWxsIT09biYmbi5sbTxhLkxBR1JBTkdJQU5fVE9MRVJBTkNFJiYocj1uLmxlZnQuYmxvY2sscy5zcGxpdChuKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBlLmluc2VydCh0KX0pLGUucmVtb3ZlKHIpLHQucHVzaChuKSl9KX0sdH0oKTtyLkJsb2Nrcz11O3ZhciBhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3RoaXMudnM9dCx0aGlzLmNzPWUsdGhpcy52cz10LHQuZm9yRWFjaChmdW5jdGlvbih0KXt0LmNJbj1bXSx0LmNPdXQ9W119KSx0aGlzLmNzPWUsZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QubGVmdC5jT3V0LnB1c2godCksdC5yaWdodC5jSW4ucHVzaCh0KX0pLHRoaXMuaW5hY3RpdmU9ZS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQuYWN0aXZlPSExLHR9KSx0aGlzLmJzPW51bGx9cmV0dXJuIHQucHJvdG90eXBlLmNvc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5icy5jb3N0KCl9LHQucHJvdG90eXBlLnNldFN0YXJ0aW5nUG9zaXRpb25zPWZ1bmN0aW9uKHQpe3RoaXMuaW5hY3RpdmU9dGhpcy5jcy5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQuYWN0aXZlPSExLHR9KSx0aGlzLmJzPW5ldyB1KHRoaXMudnMpLHRoaXMuYnMuZm9yRWFjaChmdW5jdGlvbihlLHIpe3JldHVybiBlLnBvc249dFtyXX0pfSx0LnByb3RvdHlwZS5zZXREZXNpcmVkUG9zaXRpb25zPWZ1bmN0aW9uKHQpe3RoaXMudnMuZm9yRWFjaChmdW5jdGlvbihlLHIpe3JldHVybiBlLmRlc2lyZWRQb3NpdGlvbj10W3JdfSl9LHQucHJvdG90eXBlLm1vc3RWaW9sYXRlZD1mdW5jdGlvbigpe2Zvcih2YXIgZT1OdW1iZXIuTUFYX1ZBTFVFLHI9bnVsbCxuPXRoaXMuaW5hY3RpdmUsaT1uLmxlbmd0aCxvPWkscz0wO3M8aTsrK3Mpe3ZhciB1PW5bc107aWYoIXUudW5zYXRpc2ZpYWJsZSl7dmFyIGE9dS5zbGFjaygpO2lmKCh1LmVxdWFsaXR5fHxhPGUpJiYoZT1hLHI9dSxvPXMsdS5lcXVhbGl0eSkpYnJlYWt9fXJldHVybiBvIT09aSYmKGU8dC5aRVJPX1VQUEVSQk9VTkQmJiFyLmFjdGl2ZXx8ci5lcXVhbGl0eSkmJihuW29dPW5baS0xXSxuLmxlbmd0aD1pLTEpLHJ9LHQucHJvdG90eXBlLnNhdGlzZnk9ZnVuY3Rpb24oKXtudWxsPT10aGlzLmJzJiYodGhpcy5icz1uZXcgdSh0aGlzLnZzKSksdGhpcy5icy5zcGxpdCh0aGlzLmluYWN0aXZlKTtmb3IodmFyIGU9bnVsbDsoZT10aGlzLm1vc3RWaW9sYXRlZCgpKSYmKGUuZXF1YWxpdHl8fGUuc2xhY2soKTx0LlpFUk9fVVBQRVJCT1VORCYmIWUuYWN0aXZlKTspe3ZhciByPWUubGVmdC5ibG9jayxuPWUucmlnaHQuYmxvY2s7aWYociE9PW4pdGhpcy5icy5tZXJnZShlKTtlbHNle2lmKHIuaXNBY3RpdmVEaXJlY3RlZFBhdGhCZXR3ZWVuKGUucmlnaHQsZS5sZWZ0KSl7ZS51bnNhdGlzZmlhYmxlPSEwO2NvbnRpbnVlfXZhciBpPXIuc3BsaXRCZXR3ZWVuKGUubGVmdCxlLnJpZ2h0KTtpZihudWxsPT09aSl7ZS51bnNhdGlzZmlhYmxlPSEwO2NvbnRpbnVlfXRoaXMuYnMuaW5zZXJ0KGkubGIpLHRoaXMuYnMuaW5zZXJ0KGkucmIpLHRoaXMuYnMucmVtb3ZlKHIpLHRoaXMuaW5hY3RpdmUucHVzaChpLmNvbnN0cmFpbnQpLGUuc2xhY2soKT49MD90aGlzLmluYWN0aXZlLnB1c2goZSk6dGhpcy5icy5tZXJnZShlKX19fSx0LnByb3RvdHlwZS5zb2x2ZT1mdW5jdGlvbigpe3RoaXMuc2F0aXNmeSgpO2Zvcih2YXIgdD1OdW1iZXIuTUFYX1ZBTFVFLGU9dGhpcy5icy5jb3N0KCk7TWF0aC5hYnModC1lKT4xZS00Oyl7dGhpcy5zYXRpc2Z5KCksdD1lLGU9dGhpcy5icy5jb3N0KCl9cmV0dXJuIGV9LHQuTEFHUkFOR0lBTl9UT0xFUkFOQ0U9LTFlLTQsdC5aRVJPX1VQUEVSQk9VTkQ9LTFlLTEwLHR9KCk7ci5Tb2x2ZXI9YSx0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCl7dGhpcy5vcHRpb25zPWMuZXh0ZW5kKHtsYXllckdhcDo2MCxub2RlSGVpZ2h0OjEwLGRpcmVjdGlvbjoiZG93biJ9LHQpfWZ1bmN0aW9uIGkodCl7cmV0dXJuIkwgIit0LmpvaW4oIiAiKX1mdW5jdGlvbiBvKHQpe3JldHVybiJNICIrdC5qb2luKCIgIil9ZnVuY3Rpb24gcyh0LGUscil7cmV0dXJuIkMgIit0LmpvaW4oIiAiKSsiICIrZS5qb2luKCIgIikrIiAiK3Iuam9pbigiICIpfWZ1bmN0aW9uIHUodCxlKXt2YXIgcj0odFsxXStlWzFdKS8yO3JldHVybiBzKFt0WzBdLHJdLFtlWzBdLHJdLGUpfWZ1bmN0aW9uIGEodCxlKXt2YXIgcj0odFswXStlWzBdKS8yO3JldHVybiBzKFtyLHRbMV1dLFtyLGVbMV1dLGUpfXZhciBjPXIoNCk7bi5saW5lVG89aSxuLm1vdmVUbz1vLG4uY3VydmVUbz1zLG4udkN1cnZlQmV0d2Vlbj11LG4uaEN1cnZlQmV0d2Vlbj1hLG4ucHJvdG90eXBlLmdldFdheXBvaW50cz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbnMscj1lLmRpcmVjdGlvbixuPXQuZ2V0UGF0aEZyb21Sb290KCksaT1lLm5vZGVIZWlnaHQrZS5sYXllckdhcDtyZXR1cm4ibGVmdCI9PT1yP1tbWzAsblswXS5pZGVhbFBvc11dXS5jb25jYXQobi5tYXAoZnVuY3Rpb24odCxyKXt2YXIgbj1pKihyKzEpKi0xO3JldHVybltbbitlLm5vZGVIZWlnaHQsdC5jdXJyZW50UG9zXSxbbix0LmN1cnJlbnRQb3NdXX0pKToicmlnaHQiPT09cj9bW1swLG5bMF0uaWRlYWxQb3NdXV0uY29uY2F0KG4ubWFwKGZ1bmN0aW9uKHQscil7dmFyIG49aSoocisxKTtyZXR1cm5bW24tZS5ub2RlSGVpZ2h0LHQuY3VycmVudFBvc10sW24sdC5jdXJyZW50UG9zXV19KSk6InVwIj09PXI/W1tbblswXS5pZGVhbFBvcywwXV1dLmNvbmNhdChuLm1hcChmdW5jdGlvbih0LHIpe3ZhciBuPWkqKHIrMSkqLTE7cmV0dXJuW1t0LmN1cnJlbnRQb3MsbitlLm5vZGVIZWlnaHRdLFt0LmN1cnJlbnRQb3Msbl1dfSkpOltbW25bMF0uaWRlYWxQb3MsMF1dXS5jb25jYXQobi5tYXAoZnVuY3Rpb24odCxyKXt2YXIgbj1pKihyKzEpO3JldHVybltbdC5jdXJyZW50UG9zLG4tZS5ub2RlSGVpZ2h0XSxbdC5jdXJyZW50UG9zLG5dXX0pKX0sbi5wcm90b3R5cGUubGF5b3V0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9ucyxyPWUubGF5ZXJHYXArZS5ub2RlSGVpZ2h0O3N3aXRjaChlLmRpcmVjdGlvbil7Y2FzZSJsZWZ0Ijp0LmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49dC5nZXRMYXllckluZGV4KCkqcitlLmxheWVyR2FwO3QueD0tbi1lLm5vZGVIZWlnaHQsdC55PXQuY3VycmVudFBvcyx0LmR4PWUubm9kZUhlaWdodCx0LmR5PXQud2lkdGh9KTticmVhaztjYXNlInJpZ2h0Ijp0LmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49dC5nZXRMYXllckluZGV4KCkqcitlLmxheWVyR2FwO3QueD1uLHQueT10LmN1cnJlbnRQb3MsdC5keD1lLm5vZGVIZWlnaHQsdC5keT10LndpZHRofSk7YnJlYWs7Y2FzZSJ1cCI6dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBuPXQuZ2V0TGF5ZXJJbmRleCgpKnIrZS5sYXllckdhcDt0Lng9dC5jdXJyZW50UG9zLHQueT0tbi1lLm5vZGVIZWlnaHQsdC5keD10LndpZHRoLHQuZHk9ZS5ub2RlSGVpZ2h0fSk7YnJlYWs7ZGVmYXVsdDpjYXNlImRvd24iOnQuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgbj10LmdldExheWVySW5kZXgoKSpyK2UubGF5ZXJHYXA7dC54PXQuY3VycmVudFBvcyx0Lnk9bix0LmR4PXQud2lkdGgsdC5keT1lLm5vZGVIZWlnaHR9KX1yZXR1cm4gdH0sbi5wcm90b3R5cGUuZ2VuZXJhdGVQYXRoPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9ucyxyPWUuZGlyZWN0aW9uLG49dGhpcy5nZXRXYXlwb2ludHModCxyKSxzPVtvKG5bMF1bMF0pXTtyZXR1cm4ibGVmdCI9PT1yfHwicmlnaHQiPT09cj9uLnJlZHVjZShmdW5jdGlvbih0LGUscil7cmV0dXJuIHMucHVzaChhKHRbdC5sZW5ndGgtMV0sZVswXSkpLHI8bi5sZW5ndGgtMSYmcy5wdXNoKGkoZVsxXSkpLGV9KTpuLnJlZHVjZShmdW5jdGlvbih0LGUscil7cmV0dXJuIHMucHVzaCh1KHRbdC5sZW5ndGgtMV0sZVswXSkpLHI8bi5sZW5ndGgtMSYmcy5wdXNoKGkoZVsxXSkpLGV9KSxzLmpvaW4oIiAiKX0sdC5leHBvcnRzPW59XSl9KX0pO3ZhciBsYWJlbGxhX21pbl8xPWxhYmVsbGFfbWluLmxhYmVsbGE7dmFyIFNwYW5PckRpdj1mdW5jdGlvbihwcm9wcyl7dmFyIHN0eWxlPXByb3BzLnN0eWxlLGNsYXNzTmFtZT1wcm9wcy5jbGFzc05hbWUsY2hpbGRyZW49cHJvcHMuY2hpbGRyZW47aWYocHJvcHMuc3Bhbil7cmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Y2xhc3NOYW1lLHN0eWxlOl9leHRlbmRzKHtkaXNwbGF5OiJibG9jayJ9LHN0eWxlKX0sY2hpbGRyZW4pfXJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Y2xhc3NOYW1lLHN0eWxlOnN0eWxlfSxjaGlsZHJlbil9O2Z1bmN0aW9uIGFkanVzdGVkQW5ub3RhdGlvbktleU1hcHBlcihkKXtyZXR1cm4gZC5wcm9wcy5ub3RlRGF0YS5pZHx8ZC5wcm9wcy5ub3RlRGF0YS54KyItIitkLnByb3BzLm5vdGVEYXRhLnl9ZnVuY3Rpb24gbm90ZURhdGFXaWR0aChub3RlRGF0YSl7dmFyIGNoYXJXaWR0aD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMV06ODt2YXIgd3JhcD1ub3RlRGF0YS5ub3RlJiZub3RlRGF0YS5ub3RlLndyYXB8fDEyMDtyZXR1cm4gTWF0aC5taW4od3JhcCxub3RlRGF0YS5ub3RlLmxhYmVsLmxlbmd0aCpjaGFyV2lkdGgpfWZ1bmN0aW9uIG5vdGVEYXRhSGVpZ2h0KG5vdGVEYXRhKXt2YXIgY2hhcldpZHRoPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dW5kZWZpbmVkP2FyZ3VtZW50c1sxXTo4O3ZhciBsaW5lSGVpZ2h0PWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dW5kZWZpbmVkP2FyZ3VtZW50c1syXToyMDt2YXIgd3JhcD1ub3RlRGF0YS5ub3RlJiZub3RlRGF0YS5ub3RlLndyYXB8fDEyMDt2YXIgdGV4dD1ub3RlRGF0YS5ub3RlLmxhYmVsfHxub3RlRGF0YS5ub3RlLnRpdGxlfHwiIjtyZXR1cm4gTWF0aC5jZWlsKHRleHQubGVuZ3RoKmNoYXJXaWR0aC93cmFwKSpsaW5lSGVpZ2h0Kyhub3RlRGF0YS5ub3RlLmxhYmVsJiZub3RlRGF0YS5ub3RlLnRpdGxlP2xpbmVIZWlnaHQ6MCl9ZnVuY3Rpb24gb2JqZWN0U3RyaW5nS2V5KG9iamVjdCl7dmFyIGZpbmFsS2V5PSIiO09iamVjdC5rZXlzKG9iamVjdCkuZm9yRWFjaChmdW5jdGlvbihrZXkpe2ZpbmFsS2V5Kz0hb2JqZWN0W2tleV18fCFvYmplY3Rba2V5XS50b1N0cmluZz9vYmplY3Rba2V5XTpvYmplY3Rba2V5XS50b1N0cmluZygpfSk7cmV0dXJuIGZpbmFsS2V5fXZhciBBbm5vdGF0aW9uTGF5ZXI9ZnVuY3Rpb24oX1JlYWN0JENvbXBvbmVudCl7aW5oZXJpdHMoQW5ub3RhdGlvbkxheWVyLF9SZWFjdCRDb21wb25lbnQpO2Z1bmN0aW9uIEFubm90YXRpb25MYXllcihwcm9wcyl7Y2xhc3NDYWxsQ2hlY2sodGhpcyxBbm5vdGF0aW9uTGF5ZXIpO3ZhciBfdGhpcz1wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKEFubm90YXRpb25MYXllci5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihBbm5vdGF0aW9uTGF5ZXIpKS5jYWxsKHRoaXMscHJvcHMpKTtfdGhpcy5nZW5lcmF0ZVNWR0Fubm90YXRpb25zPV90aGlzLmdlbmVyYXRlU1ZHQW5ub3RhdGlvbnMuYmluZChfdGhpcyk7X3RoaXMuZ2VuZXJhdGVIVE1MQW5ub3RhdGlvbnM9X3RoaXMuZ2VuZXJhdGVIVE1MQW5ub3RhdGlvbnMuYmluZChfdGhpcyk7X3RoaXMuc3RhdGU9e2ZvbnQ6dW5kZWZpbmVkLHN2Z0Fubm90YXRpb25zOltdLGh0bWxBbm5vdGF0aW9uczpbXSxhZGp1c3RlZEFubm90YXRpb25zOjAsYWRqdXN0ZWRBbm5vdGF0aW9uc0tleToiIixhZGp1c3RlZEFubm90YXRpb25zRGF0YVZlcnNpb246IiJ9O3JldHVybiBfdGhpc31jcmVhdGVDbGFzcyhBbm5vdGF0aW9uTGF5ZXIsW3trZXk6ImdlbmVyYXRlU1ZHQW5ub3RhdGlvbnMiLHZhbHVlOmZ1bmN0aW9uIGdlbmVyYXRlU1ZHQW5ub3RhdGlvbnMocHJvcHMsYW5ub3RhdGlvbnMpe3ZhciByZW5kZXJlZEFubm90YXRpb25zPWFubm90YXRpb25zLm1hcChmdW5jdGlvbihkLGkpe3JldHVybiBwcm9wcy5zdmdBbm5vdGF0aW9uUnVsZShkLGkscHJvcHMpfSkuZmlsdGVyKGZ1bmN0aW9uKGQpe3JldHVybiBkIT09bnVsbCYmZCE9PXVuZGVmaW5lZH0pO3JldHVybiByZW5kZXJlZEFubm90YXRpb25zfX0se2tleToiZ2VuZXJhdGVIVE1MQW5ub3RhdGlvbnMiLHZhbHVlOmZ1bmN0aW9uIGdlbmVyYXRlSFRNTEFubm90YXRpb25zKHByb3BzLGFubm90YXRpb25zKXt2YXIgcmVuZGVyZWRBbm5vdGF0aW9ucz1hbm5vdGF0aW9ucy5tYXAoZnVuY3Rpb24oZCxpKXtyZXR1cm4gcHJvcHMuaHRtbEFubm90YXRpb25SdWxlKGQsaSxwcm9wcyl9KS5maWx0ZXIoZnVuY3Rpb24oZCl7cmV0dXJuIGQhPT1udWxsJiZkIT09dW5kZWZpbmVkfSk7cmV0dXJuIHJlbmRlcmVkQW5ub3RhdGlvbnN9fSx7a2V5OiJwcm9jZXNzQW5ub3RhdGlvbnMiLHZhbHVlOmZ1bmN0aW9uIHByb2Nlc3NBbm5vdGF0aW9ucyhhZGp1c3RhYmxlQW5ub3RhdGlvbnMsYW5ub3RhdGlvblByb2Nlc3Nvcixwcm9wcyl7aWYoYW5ub3RhdGlvblByb2Nlc3Nvci50eXBlPT09ZmFsc2Upe3JldHVybiBhZGp1c3RhYmxlQW5ub3RhdGlvbnN9dmFyIF9wcm9wcyRtYXJnaW49cHJvcHMubWFyZ2luLG1hcmdpbj1fcHJvcHMkbWFyZ2luPT09dW5kZWZpbmVkP3t0b3A6MCxib3R0b206MCxsZWZ0OjAscmlnaHQ6MH06X3Byb3BzJG1hcmdpbixzaXplPXByb3BzLnNpemUsYXhlcz1wcm9wcy5heGVzO21hcmdpbj10eXBlb2YgbWFyZ2luPT09Im51bWJlciI/e3RvcDptYXJnaW4sbGVmdDptYXJnaW4scmlnaHQ6bWFyZ2luLGJvdHRvbTptYXJnaW59Om1hcmdpbjt2YXIgX2Fubm90YXRpb25Qcm9jZXNzb3IkPWFubm90YXRpb25Qcm9jZXNzb3IucGFkZGluZyxwYWRkaW5nPV9hbm5vdGF0aW9uUHJvY2Vzc29yJD09PXVuZGVmaW5lZD8yOl9hbm5vdGF0aW9uUHJvY2Vzc29yJDtpZihhbm5vdGF0aW9uUHJvY2Vzc29yLnR5cGU9PT0iYnVtcCIpe3ZhciBhZGp1c3RlZEFubm90YXRpb25zPWJ1bXBBbm5vdGF0aW9ucyhhZGp1c3RhYmxlQW5ub3RhdGlvbnMscHJvcHMsYW5ub3RhdGlvblByb2Nlc3Nvcik7cmV0dXJuIGFkanVzdGVkQW5ub3RhdGlvbnN9ZWxzZSBpZihhbm5vdGF0aW9uUHJvY2Vzc29yLnR5cGU9PT0ibWFyZ2luYWxpYSIpe3ZhciBmaW5hbE9yaWVudGF0aW9uPSFhbm5vdGF0aW9uUHJvY2Vzc29yLm9yaWVudHx8YW5ub3RhdGlvblByb2Nlc3Nvci5vcmllbnQ9PT0ibmVhcmVzdCI/WyJsZWZ0IiwicmlnaHQiLCJ0b3AiLCJib3R0b20iXTpBcnJheS5pc0FycmF5KGFubm90YXRpb25Qcm9jZXNzb3Iub3JpZW50KT9hbm5vdGF0aW9uUHJvY2Vzc29yLm9yaWVudDpbYW5ub3RhdGlvblByb2Nlc3Nvci5vcmllbnRdO3ZhciBsZWZ0T249ZmluYWxPcmllbnRhdGlvbi5maW5kKGZ1bmN0aW9uKGQpe3JldHVybiBkPT09ImxlZnQifSk7dmFyIHJpZ2h0T249ZmluYWxPcmllbnRhdGlvbi5maW5kKGZ1bmN0aW9uKGQpe3JldHVybiBkPT09InJpZ2h0In0pO3ZhciB0b3BPbj1maW5hbE9yaWVudGF0aW9uLmZpbmQoZnVuY3Rpb24oZCl7cmV0dXJuIGQ9PT0idG9wIn0pO3ZhciBib3R0b21Pbj1maW5hbE9yaWVudGF0aW9uLmZpbmQoZnVuY3Rpb24oZCl7cmV0dXJuIGQ9PT0iYm90dG9tIn0pO3ZhciBsZWZ0Tm9kZXM9W107dmFyIHJpZ2h0Tm9kZXM9W107dmFyIHRvcE5vZGVzPVtdO3ZhciBib3R0b21Ob2Rlcz1bXTthZGp1c3RhYmxlQW5ub3RhdGlvbnMuZm9yRWFjaChmdW5jdGlvbihhTm90ZSl7dmFyIG5vdGVEYXRhPWFOb3RlLnByb3BzLm5vdGVEYXRhO3ZhciBsZWZ0RGlzdD1sZWZ0T24/bm90ZURhdGEueDpJbmZpbml0eTt2YXIgcmlnaHREaXN0PXJpZ2h0T24/NzAwLW5vdGVEYXRhLng6SW5maW5pdHk7dmFyIHRvcERpc3Q9dG9wT24/bm90ZURhdGEueTpJbmZpbml0eTt2YXIgYm90dG9tRGlzdD1ib3R0b21Pbj83MDAtbm90ZURhdGEueTpJbmZpbml0eTt2YXIgbWluRGlzdD1NYXRoLm1pbihsZWZ0RGlzdCxyaWdodERpc3QsdG9wRGlzdCxib3R0b21EaXN0KTtpZihsZWZ0RGlzdD09PW1pbkRpc3Qpe2xlZnROb2Rlcy5wdXNoKGFOb3RlKX1lbHNlIGlmKHJpZ2h0RGlzdD09PW1pbkRpc3Qpe3JpZ2h0Tm9kZXMucHVzaChhTm90ZSl9ZWxzZSBpZih0b3BEaXN0PT09bWluRGlzdCl7dG9wTm9kZXMucHVzaChhTm90ZSl9ZWxzZXtib3R0b21Ob2Rlcy5wdXNoKGFOb3RlKX19KTt2YXIgbGVmdEZvcmNlPW5ldyBsYWJlbGxhX21pbi5Gb3JjZSh7bWluUG9zOjAsbWF4UG9zOmJvdHRvbU9uP3NpemVbMV0tbWFyZ2luLmJvdHRvbTpzaXplWzFdfSkubm9kZXMobGVmdE5vZGVzLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gbmV3IGxhYmVsbGFfbWluLk5vZGUoZC5wcm9wcy5ub3RlRGF0YS55LG5vdGVEYXRhSGVpZ2h0KGQucHJvcHMubm90ZURhdGEsYW5ub3RhdGlvblByb2Nlc3Nvci5jaGFyYWN0ZXJXaWR0aCxhbm5vdGF0aW9uUHJvY2Vzc29yLmxpbmVIZWlnaHQpK3BhZGRpbmcpfSkpLmNvbXB1dGUoKTt2YXIgcmlnaHRGb3JjZT1uZXcgbGFiZWxsYV9taW4uRm9yY2Uoe21pblBvczp0b3BPbj9tYXJnaW4udG9wOjAsbWF4UG9zOnNpemVbMV19KS5ub2RlcyhyaWdodE5vZGVzLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gbmV3IGxhYmVsbGFfbWluLk5vZGUoZC5wcm9wcy5ub3RlRGF0YS55LG5vdGVEYXRhSGVpZ2h0KGQucHJvcHMubm90ZURhdGEsYW5ub3RhdGlvblByb2Nlc3Nvci5jaGFyYWN0ZXJXaWR0aCxhbm5vdGF0aW9uUHJvY2Vzc29yLmxpbmVIZWlnaHQpK3BhZGRpbmcpfSkpLmNvbXB1dGUoKTt2YXIgdG9wRm9yY2U9bmV3IGxhYmVsbGFfbWluLkZvcmNlKHttaW5Qb3M6bGVmdE9uP21hcmdpbi5sZWZ0OjAsbWF4UG9zOnNpemVbMF19KS5ub2Rlcyh0b3BOb2Rlcy5tYXAoZnVuY3Rpb24oZCl7cmV0dXJuIG5ldyBsYWJlbGxhX21pbi5Ob2RlKGQucHJvcHMubm90ZURhdGEueCxub3RlRGF0YVdpZHRoKGQucHJvcHMubm90ZURhdGEsYW5ub3RhdGlvblByb2Nlc3Nvci5jaGFyYWN0ZXJXaWR0aCkrcGFkZGluZyl9KSkuY29tcHV0ZSgpO3ZhciBib3R0b21Gb3JjZT1uZXcgbGFiZWxsYV9taW4uRm9yY2Uoe21pblBvczowLG1heFBvczpyaWdodE9uP3NpemVbMF0tbWFyZ2luLnJpZ2h0OnNpemVbMF19KS5ub2Rlcyhib3R0b21Ob2Rlcy5tYXAoZnVuY3Rpb24oZCl7cmV0dXJuIG5ldyBsYWJlbGxhX21pbi5Ob2RlKGQucHJvcHMubm90ZURhdGEueCxub3RlRGF0YVdpZHRoKGQucHJvcHMubm90ZURhdGEsYW5ub3RhdGlvblByb2Nlc3Nvci5jaGFyYWN0ZXJXaWR0aCkrcGFkZGluZyl9KSkuY29tcHV0ZSgpO3ZhciBib3R0b21PZmZzZXQ9TWF0aC5tYXguYXBwbHkoTWF0aCx0b0NvbnN1bWFibGVBcnJheShib3R0b21Ob2Rlcy5tYXAoZnVuY3Rpb24oZCl7cmV0dXJuIG5vdGVEYXRhSGVpZ2h0KGQucHJvcHMubm90ZURhdGEsYW5ub3RhdGlvblByb2Nlc3Nvci5jaGFyYWN0ZXJXaWR0aCxhbm5vdGF0aW9uUHJvY2Vzc29yLmxpbmVIZWlnaHQpK3BhZGRpbmd9KSkpO3ZhciB0b3BPZmZzZXQ9TWF0aC5tYXguYXBwbHkoTWF0aCx0b0NvbnN1bWFibGVBcnJheSh0b3BOb2Rlcy5tYXAoZnVuY3Rpb24oZCl7cmV0dXJuIG5vdGVEYXRhSGVpZ2h0KGQucHJvcHMubm90ZURhdGEsYW5ub3RhdGlvblByb2Nlc3Nvci5jaGFyYWN0ZXJXaWR0aCxhbm5vdGF0aW9uUHJvY2Vzc29yLmxpbmVIZWlnaHQpK3BhZGRpbmd9KSkpO3ZhciBsZWZ0T2Zmc2V0PU1hdGgubWF4LmFwcGx5KE1hdGgsdG9Db25zdW1hYmxlQXJyYXkobGVmdE5vZGVzLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gbm90ZURhdGFXaWR0aChkLnByb3BzLm5vdGVEYXRhLGFubm90YXRpb25Qcm9jZXNzb3IuY2hhcmFjdGVyV2lkdGgpK3BhZGRpbmd9KSkpO3ZhciByaWdodE9mZnNldD1NYXRoLm1heC5hcHBseShNYXRoLHRvQ29uc3VtYWJsZUFycmF5KHJpZ2h0Tm9kZXMubWFwKGZ1bmN0aW9uKGQpe3JldHVybiBub3RlRGF0YVdpZHRoKGQucHJvcHMubm90ZURhdGEsYW5ub3RhdGlvblByb2Nlc3Nvci5jaGFyYWN0ZXJXaWR0aCkrcGFkZGluZ30pKSk7dmFyIGxlZnRTb3J0ZWROb2Rlcz1sZWZ0Rm9yY2Uubm9kZXMoKTt2YXIgcmlnaHRTb3J0ZWROb2Rlcz1yaWdodEZvcmNlLm5vZGVzKCk7dmFyIHRvcFNvcnRlZE5vZGVzPXRvcEZvcmNlLm5vZGVzKCk7dmFyIGJvdHRvbVNvcnRlZE5vZGVzPWJvdHRvbUZvcmNlLm5vZGVzKCk7bGVmdE5vZGVzLmZvckVhY2goZnVuY3Rpb24obm90ZSxpKXtub3RlLnByb3BzLm5vdGVEYXRhLm55PWxlZnRTb3J0ZWROb2Rlc1tpXS5jdXJyZW50UG9zO25vdGUucHJvcHMubm90ZURhdGEubng9bWFyZ2luLmxlZnQtbGVmdFNvcnRlZE5vZGVzW2ldLmxheWVySW5kZXgqbGVmdE9mZnNldC01O2lmKG5vdGUucHJvcHMubm90ZURhdGEubm90ZSl7bm90ZS5wcm9wcy5ub3RlRGF0YS5ub3RlLm9yaWVudGF0aW9uPSJsZWZ0UmlnaHQiO25vdGUucHJvcHMubm90ZURhdGEubm90ZS5hbGlnbj0ibWlkZGxlIn19KTtyaWdodE5vZGVzLmZvckVhY2goZnVuY3Rpb24obm90ZSxpKXtub3RlLnByb3BzLm5vdGVEYXRhLm55PXJpZ2h0U29ydGVkTm9kZXNbaV0uY3VycmVudFBvcztub3RlLnByb3BzLm5vdGVEYXRhLm54PXNpemVbMF0tbWFyZ2luLnJpZ2h0K3JpZ2h0U29ydGVkTm9kZXNbaV0ubGF5ZXJJbmRleCpyaWdodE9mZnNldCs1O2lmKG5vdGUucHJvcHMubm90ZURhdGEubm90ZSl7bm90ZS5wcm9wcy5ub3RlRGF0YS5ub3RlLm9yaWVudGF0aW9uPSJsZWZ0UmlnaHQiO25vdGUucHJvcHMubm90ZURhdGEubm90ZS5hbGlnbj0ibWlkZGxlIn19KTt0b3BOb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKG5vdGUsaSl7bm90ZS5wcm9wcy5ub3RlRGF0YS5ueD10b3BTb3J0ZWROb2Rlc1tpXS5jdXJyZW50UG9zO25vdGUucHJvcHMubm90ZURhdGEubnk9bWFyZ2luLnRvcC10b3BTb3J0ZWROb2Rlc1tpXS5sYXllckluZGV4KnRvcE9mZnNldC01fSk7Ym90dG9tTm9kZXMuZm9yRWFjaChmdW5jdGlvbihub3RlLGkpe25vdGUucHJvcHMubm90ZURhdGEubng9Ym90dG9tU29ydGVkTm9kZXNbaV0uY3VycmVudFBvcztub3RlLnByb3BzLm5vdGVEYXRhLm55PXNpemVbMV0tbWFyZ2luLmJvdHRvbStib3R0b21Tb3J0ZWROb2Rlc1tpXS5sYXllckluZGV4KmJvdHRvbU9mZnNldCs1fSk7cmV0dXJuIGFkanVzdGFibGVBbm5vdGF0aW9uc31yZXR1cm4gYWRqdXN0YWJsZUFubm90YXRpb25zO2NvbnNvbGUuZXJyb3IoIlVua25vd24gYW5ub3RhdGlvbiBoYW5kbGluZyBmdW5jdGlvbjogTXVzdCBiZSBvZiBhIHN0cmluZyAnYnVtcCcgb3IgJ21hcmdpbmFsaWEnIG9yIGEgYW4gb2JqZWN0IHdpdGggdHlwZSBvZiB0aG9zZSBzdHJpbmdzIG9yIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhZGp1c3RhYmxlIGFubm90YXRpb25zIGFuZCByZXR1cm5zIGFkanVzdGVkIGFubm90YXRpb25zIil9fSx7a2V5OiJjcmVhdGVBbm5vdGF0aW9ucyIsdmFsdWU6ZnVuY3Rpb24gY3JlYXRlQW5ub3RhdGlvbnMocHJvcHMpe3ZhciByZW5kZXJlZFNWR0Fubm90YXRpb25zPXRoaXMuc3RhdGUuc3ZnQW5ub3RhdGlvbnMscmVuZGVyZWRIVE1MQW5ub3RhdGlvbnM9W10sYWRqdXN0ZWRBbm5vdGF0aW9ucz10aGlzLnN0YXRlLmFkanVzdGVkQW5ub3RhdGlvbnMsYWRqdXN0YWJsZUFubm90YXRpb25zS2V5PXRoaXMuc3RhdGUuYWRqdXN0ZWRBbm5vdGF0aW9uc0tleSxhZGp1c3RlZEFubm90YXRpb25zS2V5PXRoaXMuc3RhdGUuYWRqdXN0ZWRBbm5vdGF0aW9uc0tleSxhZGp1c3RlZEFubm90YXRpb25zRGF0YVZlcnNpb249dGhpcy5zdGF0ZS5hZGp1c3RlZEFubm90YXRpb25zRGF0YVZlcnNpb247dmFyIGFubm90YXRpb25zPXByb3BzLmFubm90YXRpb25zLF9wcm9wcyRhbm5vdGF0aW9uSGFuZD1wcm9wcy5hbm5vdGF0aW9uSGFuZGxpbmcsYW5ub3RhdGlvbkhhbmRsaW5nPV9wcm9wcyRhbm5vdGF0aW9uSGFuZD09PXVuZGVmaW5lZD9mYWxzZTpfcHJvcHMkYW5ub3RhdGlvbkhhbmQ7dmFyIGFubm90YXRpb25Qcm9jZXNzb3I9KHR5cGVvZiBhbm5vdGF0aW9uSGFuZGxpbmc9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKGFubm90YXRpb25IYW5kbGluZykpIT09Im9iamVjdCI/e3R5cGU6YW5ub3RhdGlvbkhhbmRsaW5nfTphbm5vdGF0aW9uSGFuZGxpbmc7dmFyIF9hbm5vdGF0aW9uUHJvY2Vzc29yJDI9YW5ub3RhdGlvblByb2Nlc3Nvci5kYXRhVmVyc2lvbixkYXRhVmVyc2lvbj1fYW5ub3RhdGlvblByb2Nlc3NvciQyPT09dW5kZWZpbmVkPyIiOl9hbm5vdGF0aW9uUHJvY2Vzc29yJDI7aWYodGhpcy5wcm9wcy5zdmdBbm5vdGF0aW9uUnVsZSl7dmFyIGluaXRpYWxTVkdBbm5vdGF0aW9ucz10aGlzLmdlbmVyYXRlU1ZHQW5ub3RhdGlvbnMocHJvcHMsYW5ub3RhdGlvbnMpO3ZhciBhZGp1c3RhYmxlQW5ub3RhdGlvbnM9aW5pdGlhbFNWR0Fubm90YXRpb25zLmZpbHRlcihmdW5jdGlvbihkKXtyZXR1cm4gZC5wcm9wcyYmZC5wcm9wcy5ub3RlRGF0YSYmIWQucHJvcHMubm90ZURhdGEuZml4ZWRQb3NpdGlvbn0pO3ZhciBmaXhlZEFubm90YXRpb25zPWluaXRpYWxTVkdBbm5vdGF0aW9ucy5maWx0ZXIoZnVuY3Rpb24oZCl7cmV0dXJuIWQucHJvcHN8fCFkLnByb3BzLm5vdGVEYXRhfHxkLnByb3BzLm5vdGVEYXRhLmZpeGVkUG9zaXRpb259KTthZGp1c3RhYmxlQW5ub3RhdGlvbnNLZXk9YWRqdXN0YWJsZUFubm90YXRpb25zLm1hcChhZGp1c3RlZEFubm90YXRpb25LZXlNYXBwZXIpLmpvaW4oIiwiKStvYmplY3RTdHJpbmdLZXkoT2JqZWN0LmFzc2lnbihhbm5vdGF0aW9uUHJvY2Vzc29yLHtwb2ludDpwcm9wcy5wb2ludFNpemVGdW5jdGlvbixsYWJlbDpwcm9wcy5sYWJlbFNpemVGdW5jdGlvbn0pKTtpZihhbm5vdGF0aW9uUHJvY2Vzc29yLnR5cGU9PT1mYWxzZSl7YWRqdXN0ZWRBbm5vdGF0aW9ucz1hZGp1c3RhYmxlQW5ub3RhdGlvbnN9aWYoYWRqdXN0ZWRBbm5vdGF0aW9ucy5sZW5ndGghPT1hZGp1c3RhYmxlQW5ub3RhdGlvbnMubGVuZ3RofHxhZGp1c3RlZEFubm90YXRpb25zS2V5IT09YWRqdXN0YWJsZUFubm90YXRpb25zS2V5fHxhZGp1c3RlZEFubm90YXRpb25zRGF0YVZlcnNpb24hPT1kYXRhVmVyc2lvbil7YWRqdXN0ZWRBbm5vdGF0aW9ucz10aGlzLnByb2Nlc3NBbm5vdGF0aW9ucyhhZGp1c3RhYmxlQW5ub3RhdGlvbnMsYW5ub3RhdGlvblByb2Nlc3Nvcixwcm9wcyl9ZWxzZXthZGp1c3RlZEFubm90YXRpb25zPWFkanVzdGVkQW5ub3RhdGlvbnMubWFwKGZ1bmN0aW9uKGQsaSl7dmFyIG5ld05vdGVEYXRhPU9iamVjdC5hc3NpZ24oYWRqdXN0YWJsZUFubm90YXRpb25zW2ldLnByb3BzLm5vdGVEYXRhLHtueDpkLnByb3BzLm5vdGVEYXRhLm54LG55OmQucHJvcHMubm90ZURhdGEubnksbm90ZTpkLnByb3BzLm5vdGVEYXRhLm5vdGV9KTtyZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTZW1pb3RpY0Fubm90YXRpb24se2tleTpkLmtleSxub3RlRGF0YTpuZXdOb3RlRGF0YX0pfSl9cmVuZGVyZWRTVkdBbm5vdGF0aW9ucz1bXS5jb25jYXQodG9Db25zdW1hYmxlQXJyYXkoYWRqdXN0ZWRBbm5vdGF0aW9ucyksdG9Db25zdW1hYmxlQXJyYXkoZml4ZWRBbm5vdGF0aW9ucykpfWlmKHRoaXMucHJvcHMuaHRtbEFubm90YXRpb25SdWxlKXtyZW5kZXJlZEhUTUxBbm5vdGF0aW9ucz10aGlzLmdlbmVyYXRlSFRNTEFubm90YXRpb25zKHByb3BzLGFubm90YXRpb25zKX10aGlzLnNldFN0YXRlKHtzdmdBbm5vdGF0aW9uczpyZW5kZXJlZFNWR0Fubm90YXRpb25zLGh0bWxBbm5vdGF0aW9uczpyZW5kZXJlZEhUTUxBbm5vdGF0aW9ucyxhZGp1c3RlZEFubm90YXRpb25zOmFkanVzdGVkQW5ub3RhdGlvbnMsYWRqdXN0ZWRBbm5vdGF0aW9uc0tleTphZGp1c3RhYmxlQW5ub3RhdGlvbnNLZXksYWRqdXN0ZWRBbm5vdGF0aW9uc0RhdGFWZXJzaW9uOmRhdGFWZXJzaW9ufSl9fSx7a2V5OiJjb21wb25lbnRXaWxsTW91bnQiLHZhbHVlOmZ1bmN0aW9uIGNvbXBvbmVudFdpbGxNb3VudCgpe3RoaXMuY3JlYXRlQW5ub3RhdGlvbnModGhpcy5wcm9wcyl9fSx7a2V5OiJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIix2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcyl7dGhpcy5jcmVhdGVBbm5vdGF0aW9ucyhuZXh0UHJvcHMpfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbiByZW5kZXIoKXt2YXIgX3N0YXRlPXRoaXMuc3RhdGUsc3ZnQW5ub3RhdGlvbnM9X3N0YXRlLnN2Z0Fubm90YXRpb25zLGh0bWxBbm5vdGF0aW9ucz1fc3RhdGUuaHRtbEFubm90YXRpb25zO3ZhciBfcHJvcHM9dGhpcy5wcm9wcyx1c2VTcGFucz1fcHJvcHMudXNlU3BhbnMsbGVnZW5kU2V0dGluZ3M9X3Byb3BzLmxlZ2VuZFNldHRpbmdzO3ZhciByZW5kZXJlZExlZ2VuZD12b2lkIDA7aWYobGVnZW5kU2V0dGluZ3Mpe3ZhciBfbGVnZW5kU2V0dGluZ3Mkd2lkdGg9bGVnZW5kU2V0dGluZ3Mud2lkdGgsd2lkdGg9X2xlZ2VuZFNldHRpbmdzJHdpZHRoPT09dW5kZWZpbmVkPzEwMDpfbGVnZW5kU2V0dGluZ3Mkd2lkdGg7dmFyIHBvc2l0aW9uSGFzaD17bGVmdDpbMTUsMTVdLHJpZ2h0Olt0aGlzLnByb3BzLnNpemVbMF0td2lkdGgtMTUsMTVdfTt2YXIgX2xlZ2VuZFNldHRpbmdzJHBvc2l0PWxlZ2VuZFNldHRpbmdzLnBvc2l0aW9uLHBvc2l0aW9uPV9sZWdlbmRTZXR0aW5ncyRwb3NpdD09PXVuZGVmaW5lZD8icmlnaHQiOl9sZWdlbmRTZXR0aW5ncyRwb3NpdCxfbGVnZW5kU2V0dGluZ3MkdGl0bGU9bGVnZW5kU2V0dGluZ3MudGl0bGUsdGl0bGU9X2xlZ2VuZFNldHRpbmdzJHRpdGxlPT09dW5kZWZpbmVkPyJMZWdlbmQiOl9sZWdlbmRTZXR0aW5ncyR0aXRsZTt2YXIgbGVnZW5kUG9zaXRpb249cG9zaXRpb25IYXNoW3Bvc2l0aW9uXXx8cG9zaXRpb247cmVuZGVyZWRMZWdlbmQ9UmVhY3QuY3JlYXRlRWxlbWVudCgiZyIse3RyYW5zZm9ybToidHJhbnNsYXRlKCIrbGVnZW5kUG9zaXRpb24rIikifSxSZWFjdC5jcmVhdGVFbGVtZW50KExlZ2VuZCxfZXh0ZW5kcyh7fSxsZWdlbmRTZXR0aW5ncyx7dGl0bGU6dGl0bGUscG9zaXRpb246cG9zaXRpb259KSkpfXZhciBzdmdTdHlsZT17YmFja2dyb3VuZDoibm9uZSIscG9pbnRlckV2ZW50czoibm9uZSJ9O2lmKHVzZVNwYW5zKXtzdmdTdHlsZS5vdmVyZmxvdz0idmlzaWJsZSJ9cmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3Bhbk9yRGl2LHtzcGFuOnVzZVNwYW5zLGNsYXNzTmFtZToiYW5ub3RhdGlvbi1sYXllciIsc3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIscG9pbnRlckV2ZW50czoibm9uZSIsYmFja2dyb3VuZDoibm9uZSJ9fSx1c2VTcGFucz9udWxsOlJlYWN0LmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiYW5ub3RhdGlvbi1sYXllci1odG1sIixzdHlsZTp7YmFja2dyb3VuZDoibm9uZSIscG9pbnRlckV2ZW50czoibm9uZSIscG9zaXRpb246ImFic29sdXRlIixoZWlnaHQ6dGhpcy5wcm9wcy5zaXplWzFdKyJweCIsd2lkdGg6dGhpcy5wcm9wcy5zaXplWzBdKyJweCJ9fSxodG1sQW5ub3RhdGlvbnMpLFJlYWN0LmNyZWF0ZUVsZW1lbnQoInN2ZyIse2NsYXNzTmFtZToiYW5ub3RhdGlvbi1sYXllci1zdmciLGhlaWdodDp0aGlzLnByb3BzLnNpemVbMV0sd2lkdGg6dGhpcy5wcm9wcy5zaXplWzBdLHN0eWxlOnN2Z1N0eWxlfSxyZW5kZXJlZExlZ2VuZCxzdmdBbm5vdGF0aW9ucykpfX1dKTtyZXR1cm4gQW5ub3RhdGlvbkxheWVyfShSZWFjdC5Db21wb25lbnQpO0Fubm90YXRpb25MYXllci5wcm9wVHlwZXM9e3NjYWxlOnByb3BUeXBlcy5mdW5jLG9yaWVudDpwcm9wVHlwZXMuc3RyaW5nLHRpdGxlOnByb3BUeXBlcy5zdHJpbmcsZm9ybWF0OnByb3BUeXBlcy5zdHJpbmcsdmFsdWVzOnByb3BUeXBlcy5hcnJheSxwcm9wZXJ0aWVzOnByb3BUeXBlcy5vYmplY3QscG9zaXRpb246cHJvcFR5cGVzLmFycmF5fTt2YXIgYXNjZW5kaW5nJDE9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYTxiPy0xOmE+Yj8xOmE+PWI/MDpOYU59O3ZhciBiaXNlY3Rvcj1mdW5jdGlvbihjb21wYXJlKXtpZihjb21wYXJlLmxlbmd0aD09PTEpY29tcGFyZT1hc2NlbmRpbmdDb21wYXJhdG9yKGNvbXBhcmUpO3JldHVybntsZWZ0OmZ1bmN0aW9uIGxlZnQoYSx4LGxvLGhpKXtpZihsbz09bnVsbClsbz0wO2lmKGhpPT1udWxsKWhpPWEubGVuZ3RoO3doaWxlKGxvPGhpKXt2YXIgbWlkPWxvK2hpPj4+MTtpZihjb21wYXJlKGFbbWlkXSx4KTwwKWxvPW1pZCsxO2Vsc2UgaGk9bWlkfXJldHVybiBsb30scmlnaHQ6ZnVuY3Rpb24gcmlnaHQoYSx4LGxvLGhpKXtpZihsbz09bnVsbClsbz0wO2lmKGhpPT1udWxsKWhpPWEubGVuZ3RoO3doaWxlKGxvPGhpKXt2YXIgbWlkPWxvK2hpPj4+MTtpZihjb21wYXJlKGFbbWlkXSx4KT4wKWhpPW1pZDtlbHNlIGxvPW1pZCsxfXJldHVybiBsb319fTtmdW5jdGlvbiBhc2NlbmRpbmdDb21wYXJhdG9yKGYpe3JldHVybiBmdW5jdGlvbihkLHgpe3JldHVybiBhc2NlbmRpbmckMShmKGQpLHgpfX12YXIgYXNjZW5kaW5nQmlzZWN0PWJpc2VjdG9yKGFzY2VuZGluZyQxKTt2YXIgYmlzZWN0UmlnaHQ9YXNjZW5kaW5nQmlzZWN0LnJpZ2h0O3ZhciBudW1iZXI9ZnVuY3Rpb24oeCl7cmV0dXJuIHg9PT1udWxsP05hTjoreH07dmFyIGV4dGVudD1mdW5jdGlvbih2YWx1ZXMsdmFsdWVvZil7dmFyIG49dmFsdWVzLmxlbmd0aCxpPS0xLHZhbHVlLG1pbixtYXg7aWYodmFsdWVvZj09bnVsbCl7d2hpbGUoKytpPG4pe2lmKCh2YWx1ZT12YWx1ZXNbaV0pIT1udWxsJiZ2YWx1ZT49dmFsdWUpe21pbj1tYXg9dmFsdWU7d2hpbGUoKytpPG4pe2lmKCh2YWx1ZT12YWx1ZXNbaV0pIT1udWxsKXtpZihtaW4+dmFsdWUpbWluPXZhbHVlO2lmKG1heDx2YWx1ZSltYXg9dmFsdWV9fX19fWVsc2V7d2hpbGUoKytpPG4pe2lmKCh2YWx1ZT12YWx1ZW9mKHZhbHVlc1tpXSxpLHZhbHVlcykpIT1udWxsJiZ2YWx1ZT49dmFsdWUpe21pbj1tYXg9dmFsdWU7d2hpbGUoKytpPG4pe2lmKCh2YWx1ZT12YWx1ZW9mKHZhbHVlc1tpXSxpLHZhbHVlcykpIT1udWxsKXtpZihtaW4+dmFsdWUpbWluPXZhbHVlO2lmKG1heDx2YWx1ZSltYXg9dmFsdWV9fX19fXJldHVyblttaW4sbWF4XX07dmFyIGFycmF5PUFycmF5LnByb3RvdHlwZTt2YXIgc2xpY2UkMT1hcnJheS5zbGljZTt2YXIgY29uc3RhbnQkMj1mdW5jdGlvbih4KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4geH19O3ZhciBpZGVudGl0eSQxPWZ1bmN0aW9uKHgpe3JldHVybiB4fTt2YXIgcmFuZ2U9ZnVuY3Rpb24oc3RhcnQsc3RvcCxzdGVwKXtzdGFydD0rc3RhcnQsc3RvcD0rc3RvcCxzdGVwPShuPWFyZ3VtZW50cy5sZW5ndGgpPDI/KHN0b3A9c3RhcnQsc3RhcnQ9MCwxKTpuPDM/MTorc3RlcDt2YXIgaT0tMSxuPU1hdGgubWF4KDAsTWF0aC5jZWlsKChzdG9wLXN0YXJ0KS9zdGVwKSl8MCxyYW5nZT1uZXcgQXJyYXkobik7d2hpbGUoKytpPG4pe3JhbmdlW2ldPXN0YXJ0K2kqc3RlcH1yZXR1cm4gcmFuZ2V9O3ZhciBlMTA9TWF0aC5zcXJ0KDUwKTt2YXIgZTU9TWF0aC5zcXJ0KDEwKTt2YXIgZTI9TWF0aC5zcXJ0KDIpO3ZhciB0aWNrcz1mdW5jdGlvbihzdGFydCxzdG9wLGNvdW50KXt2YXIgcmV2ZXJzZT1zdG9wPHN0YXJ0LGk9LTEsbix0aWNrcyxzdGVwO2lmKHJldmVyc2Upbj1zdGFydCxzdGFydD1zdG9wLHN0b3A9bjtpZigoc3RlcD10aWNrSW5jcmVtZW50KHN0YXJ0LHN0b3AsY291bnQpKT09PTB8fCFpc0Zpbml0ZShzdGVwKSlyZXR1cm5bXTtpZihzdGVwPjApe3N0YXJ0PU1hdGguY2VpbChzdGFydC9zdGVwKTtzdG9wPU1hdGguZmxvb3Ioc3RvcC9zdGVwKTt0aWNrcz1uZXcgQXJyYXkobj1NYXRoLmNlaWwoc3RvcC1zdGFydCsxKSk7d2hpbGUoKytpPG4pe3RpY2tzW2ldPShzdGFydCtpKSpzdGVwfX1lbHNle3N0YXJ0PU1hdGguZmxvb3Ioc3RhcnQqc3RlcCk7c3RvcD1NYXRoLmNlaWwoc3RvcCpzdGVwKTt0aWNrcz1uZXcgQXJyYXkobj1NYXRoLmNlaWwoc3RhcnQtc3RvcCsxKSk7d2hpbGUoKytpPG4pe3RpY2tzW2ldPShzdGFydC1pKS9zdGVwfX1pZihyZXZlcnNlKXRpY2tzLnJldmVyc2UoKTtyZXR1cm4gdGlja3N9O2Z1bmN0aW9uIHRpY2tJbmNyZW1lbnQoc3RhcnQsc3RvcCxjb3VudCl7dmFyIHN0ZXA9KHN0b3Atc3RhcnQpL01hdGgubWF4KDAsY291bnQpLHBvd2VyPU1hdGguZmxvb3IoTWF0aC5sb2coc3RlcCkvTWF0aC5MTjEwKSxlcnJvcj1zdGVwL01hdGgucG93KDEwLHBvd2VyKTtyZXR1cm4gcG93ZXI+PTA/KGVycm9yPj1lMTA/MTA6ZXJyb3I+PWU1PzU6ZXJyb3I+PWUyPzI6MSkqTWF0aC5wb3coMTAscG93ZXIpOi1NYXRoLnBvdygxMCwtcG93ZXIpLyhlcnJvcj49ZTEwPzEwOmVycm9yPj1lNT81OmVycm9yPj1lMj8yOjEpfWZ1bmN0aW9uIHRpY2tTdGVwKHN0YXJ0LHN0b3AsY291bnQpe3ZhciBzdGVwMD1NYXRoLmFicyhzdG9wLXN0YXJ0KS9NYXRoLm1heCgwLGNvdW50KSxzdGVwMT1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nKHN0ZXAwKS9NYXRoLkxOMTApKSxlcnJvcj1zdGVwMC9zdGVwMTtpZihlcnJvcj49ZTEwKXN0ZXAxKj0xMDtlbHNlIGlmKGVycm9yPj1lNSlzdGVwMSo9NTtlbHNlIGlmKGVycm9yPj1lMilzdGVwMSo9MjtyZXR1cm4gc3RvcDxzdGFydD8tc3RlcDE6c3RlcDF9dmFyIHRocmVzaG9sZFN0dXJnZXM9ZnVuY3Rpb24odmFsdWVzKXtyZXR1cm4gTWF0aC5jZWlsKE1hdGgubG9nKHZhbHVlcy5sZW5ndGgpL01hdGguTE4yKSsxfTt2YXIgaGlzdG9ncmFtPWZ1bmN0aW9uKCl7dmFyIHZhbHVlPWlkZW50aXR5JDEsZG9tYWluPWV4dGVudCx0aHJlc2hvbGQ9dGhyZXNob2xkU3R1cmdlcztmdW5jdGlvbiBoaXN0b2dyYW0oZGF0YSl7dmFyIGksbj1kYXRhLmxlbmd0aCx4LHZhbHVlcz1uZXcgQXJyYXkobik7Zm9yKGk9MDtpPG47KytpKXt2YWx1ZXNbaV09dmFsdWUoZGF0YVtpXSxpLGRhdGEpfXZhciB4ej1kb21haW4odmFsdWVzKSx4MD14elswXSx4MT14elsxXSx0ej10aHJlc2hvbGQodmFsdWVzLHgwLHgxKTtpZighQXJyYXkuaXNBcnJheSh0eikpe3R6PXRpY2tTdGVwKHgwLHgxLHR6KTt0ej1yYW5nZShNYXRoLmNlaWwoeDAvdHopKnR6LE1hdGguZmxvb3IoeDEvdHopKnR6LHR6KX12YXIgbT10ei5sZW5ndGg7d2hpbGUodHpbMF08PXgwKXt0ei5zaGlmdCgpLC0tbX13aGlsZSh0elttLTFdPngxKXt0ei5wb3AoKSwtLW19dmFyIGJpbnM9bmV3IEFycmF5KG0rMSksYmluO2ZvcihpPTA7aTw9bTsrK2kpe2Jpbj1iaW5zW2ldPVtdO2Jpbi54MD1pPjA/dHpbaS0xXTp4MDtiaW4ueDE9aTxtP3R6W2ldOngxfWZvcihpPTA7aTxuOysraSl7eD12YWx1ZXNbaV07aWYoeDA8PXgmJng8PXgxKXtiaW5zW2Jpc2VjdFJpZ2h0KHR6LHgsMCxtKV0ucHVzaChkYXRhW2ldKX19cmV0dXJuIGJpbnN9aGlzdG9ncmFtLnZhbHVlPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh2YWx1ZT10eXBlb2YgXz09PSJmdW5jdGlvbiI/Xzpjb25zdGFudCQyKF8pLGhpc3RvZ3JhbSk6dmFsdWV9O2hpc3RvZ3JhbS5kb21haW49ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGRvbWFpbj10eXBlb2YgXz09PSJmdW5jdGlvbiI/Xzpjb25zdGFudCQyKFtfWzBdLF9bMV1dKSxoaXN0b2dyYW0pOmRvbWFpbn07aGlzdG9ncmFtLnRocmVzaG9sZHM9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRocmVzaG9sZD10eXBlb2YgXz09PSJmdW5jdGlvbiI/XzpBcnJheS5pc0FycmF5KF8pP2NvbnN0YW50JDIoc2xpY2UkMS5jYWxsKF8pKTpjb25zdGFudCQyKF8pLGhpc3RvZ3JhbSk6dGhyZXNob2xkfTtyZXR1cm4gaGlzdG9ncmFtfTt2YXIgcXVhbnRpbGU9ZnVuY3Rpb24odmFsdWVzLHAsdmFsdWVvZil7aWYodmFsdWVvZj09bnVsbCl2YWx1ZW9mPW51bWJlcjtpZighKG49dmFsdWVzLmxlbmd0aCkpcmV0dXJuO2lmKChwPStwKTw9MHx8bjwyKXJldHVybit2YWx1ZW9mKHZhbHVlc1swXSwwLHZhbHVlcyk7aWYocD49MSlyZXR1cm4rdmFsdWVvZih2YWx1ZXNbbi0xXSxuLTEsdmFsdWVzKTt2YXIgbixpPShuLTEpKnAsaTA9TWF0aC5mbG9vcihpKSx2YWx1ZTA9K3ZhbHVlb2YodmFsdWVzW2kwXSxpMCx2YWx1ZXMpLHZhbHVlMT0rdmFsdWVvZih2YWx1ZXNbaTArMV0saTArMSx2YWx1ZXMpO3JldHVybiB2YWx1ZTArKHZhbHVlMS12YWx1ZTApKihpLWkwKX07dmFyIG1heD1mdW5jdGlvbih2YWx1ZXMsdmFsdWVvZil7dmFyIG49dmFsdWVzLmxlbmd0aCxpPS0xLHZhbHVlLG1heDtpZih2YWx1ZW9mPT1udWxsKXt3aGlsZSgrK2k8bil7aWYoKHZhbHVlPXZhbHVlc1tpXSkhPW51bGwmJnZhbHVlPj12YWx1ZSl7bWF4PXZhbHVlO3doaWxlKCsraTxuKXtpZigodmFsdWU9dmFsdWVzW2ldKSE9bnVsbCYmdmFsdWU+bWF4KXttYXg9dmFsdWV9fX19fWVsc2V7d2hpbGUoKytpPG4pe2lmKCh2YWx1ZT12YWx1ZW9mKHZhbHVlc1tpXSxpLHZhbHVlcykpIT1udWxsJiZ2YWx1ZT49dmFsdWUpe21heD12YWx1ZTt3aGlsZSgrK2k8bil7aWYoKHZhbHVlPXZhbHVlb2YodmFsdWVzW2ldLGksdmFsdWVzKSkhPW51bGwmJnZhbHVlPm1heCl7bWF4PXZhbHVlfX19fX1yZXR1cm4gbWF4fTt2YXIgbWluPWZ1bmN0aW9uKHZhbHVlcyx2YWx1ZW9mKXt2YXIgbj12YWx1ZXMubGVuZ3RoLGk9LTEsdmFsdWUsbWluO2lmKHZhbHVlb2Y9PW51bGwpe3doaWxlKCsraTxuKXtpZigodmFsdWU9dmFsdWVzW2ldKSE9bnVsbCYmdmFsdWU+PXZhbHVlKXttaW49dmFsdWU7d2hpbGUoKytpPG4pe2lmKCh2YWx1ZT12YWx1ZXNbaV0pIT1udWxsJiZtaW4+dmFsdWUpe21pbj12YWx1ZX19fX19ZWxzZXt3aGlsZSgrK2k8bil7aWYoKHZhbHVlPXZhbHVlb2YodmFsdWVzW2ldLGksdmFsdWVzKSkhPW51bGwmJnZhbHVlPj12YWx1ZSl7bWluPXZhbHVlO3doaWxlKCsraTxuKXtpZigodmFsdWU9dmFsdWVvZih2YWx1ZXNbaV0saSx2YWx1ZXMpKSE9bnVsbCYmbWluPnZhbHVlKXttaW49dmFsdWV9fX19fXJldHVybiBtaW59O3ZhciBzdW0kMT1mdW5jdGlvbih2YWx1ZXMsdmFsdWVvZil7dmFyIG49dmFsdWVzLmxlbmd0aCxpPS0xLHZhbHVlLHN1bT0wO2lmKHZhbHVlb2Y9PW51bGwpe3doaWxlKCsraTxuKXtpZih2YWx1ZT0rdmFsdWVzW2ldKXN1bSs9dmFsdWV9fWVsc2V7d2hpbGUoKytpPG4pe2lmKHZhbHVlPSt2YWx1ZW9mKHZhbHVlc1tpXSxpLHZhbHVlcykpc3VtKz12YWx1ZX19cmV0dXJuIHN1bX07dmFyIE1BWF9TQUZFX0lOVEVHRVI9OTAwNzE5OTI1NDc0MDk5MTt2YXIgYXJnc1RhZz0iW29iamVjdCBBcmd1bWVudHNdIjt2YXIgZnVuY1RhZz0iW29iamVjdCBGdW5jdGlvbl0iO3ZhciBnZW5UYWc9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIjt2YXIgZnJlZUdsb2JhbD1fdHlwZW9mKGNvbW1vbmpzR2xvYmFsKT09Im9iamVjdCImJmNvbW1vbmpzR2xvYmFsJiZjb21tb25qc0dsb2JhbC5PYmplY3Q9PT1PYmplY3QmJmNvbW1vbmpzR2xvYmFsO3ZhciBmcmVlU2VsZj0odHlwZW9mIHNlbGY9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKHNlbGYpKT09Im9iamVjdCImJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmO3ZhciByb290PWZyZWVHbG9iYWx8fGZyZWVTZWxmfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpO2Z1bmN0aW9uIGFycmF5UHVzaChhcnJheSx2YWx1ZXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9dmFsdWVzLmxlbmd0aCxvZmZzZXQ9YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXthcnJheVtvZmZzZXQraW5kZXhdPXZhbHVlc1tpbmRleF19cmV0dXJuIGFycmF5fXZhciBvYmplY3RQcm90bz1PYmplY3QucHJvdG90eXBlO3ZhciBoYXNPd25Qcm9wZXJ0eSQxPW9iamVjdFByb3RvLmhhc093blByb3BlcnR5O3ZhciBvYmplY3RUb1N0cmluZz1vYmplY3RQcm90by50b1N0cmluZzt2YXIgX1N5bWJvbD1yb290LlN5bWJvbDt2YXIgcHJvcGVydHlJc0VudW1lcmFibGU9b2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGU7dmFyIHNwcmVhZGFibGVTeW1ib2w9X1N5bWJvbD9fU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZTp1bmRlZmluZWQ7ZnVuY3Rpb24gYmFzZUZsYXR0ZW4oYXJyYXksZGVwdGgscHJlZGljYXRlLGlzU3RyaWN0LHJlc3VsdCl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGg7cHJlZGljYXRlfHwocHJlZGljYXRlPWlzRmxhdHRlbmFibGUpO3Jlc3VsdHx8KHJlc3VsdD1bXSk7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF07aWYoZGVwdGg+MCYmcHJlZGljYXRlKHZhbHVlKSl7aWYoZGVwdGg+MSl7YmFzZUZsYXR0ZW4odmFsdWUsZGVwdGgtMSxwcmVkaWNhdGUsaXNTdHJpY3QscmVzdWx0KX1lbHNle2FycmF5UHVzaChyZXN1bHQsdmFsdWUpfX1lbHNlIGlmKCFpc1N0cmljdCl7cmVzdWx0W3Jlc3VsdC5sZW5ndGhdPXZhbHVlfX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpe3JldHVybiBpc0FycmF5KHZhbHVlKXx8aXNBcmd1bWVudHModmFsdWUpfHwhIShzcHJlYWRhYmxlU3ltYm9sJiZ2YWx1ZSYmdmFsdWVbc3ByZWFkYWJsZVN5bWJvbF0pfWZ1bmN0aW9uIGZsYXR0ZW4oYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXk/YXJyYXkubGVuZ3RoOjA7cmV0dXJuIGxlbmd0aD9iYXNlRmxhdHRlbihhcnJheSwxKTpbXX1mdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSl7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSYmaGFzT3duUHJvcGVydHkkMS5jYWxsKHZhbHVlLCJjYWxsZWUiKSYmKCFwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlLCJjYWxsZWUiKXx8b2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk9PWFyZ3NUYWcpfXZhciBpc0FycmF5PUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpe3JldHVybiB2YWx1ZSE9bnVsbCYmaXNMZW5ndGgodmFsdWUubGVuZ3RoKSYmIWlzRnVuY3Rpb24odmFsdWUpfWZ1bmN0aW9uIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmaXNBcnJheUxpa2UodmFsdWUpfWZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpe3ZhciB0YWc9aXNPYmplY3QodmFsdWUpP29iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpOiIiO3JldHVybiB0YWc9PWZ1bmNUYWd8fHRhZz09Z2VuVGFnfWZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKXtyZXR1cm4gdHlwZW9mIHZhbHVlPT0ibnVtYmVyIiYmdmFsdWU+LTEmJnZhbHVlJTE9PTAmJnZhbHVlPD1NQVhfU0FGRV9JTlRFR0VSfWZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKXt2YXIgdHlwZT10eXBlb2YgdmFsdWU9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKHZhbHVlKTtyZXR1cm4hIXZhbHVlJiYodHlwZT09Im9iamVjdCJ8fHR5cGU9PSJmdW5jdGlvbiIpfWZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSl7cmV0dXJuISF2YWx1ZSYmKHR5cGVvZiB2YWx1ZT09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2YodmFsdWUpKT09Im9iamVjdCJ9dmFyIGxvZGFzaF9mbGF0dGVuPWZsYXR0ZW47dmFyIExBUkdFX0FSUkFZX1NJWkU9MjAwO3ZhciBIQVNIX1VOREVGSU5FRD0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI7dmFyIElORklOSVRZPTEvMDt2YXIgZnVuY1RhZyQxPSJbb2JqZWN0IEZ1bmN0aW9uXSI7dmFyIGdlblRhZyQxPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSI7dmFyIHJlUmVnRXhwQ2hhcj0vW1xcXiQuKis/KClbXF17fXxdL2c7dmFyIHJlSXNIb3N0Q3Rvcj0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLzt2YXIgZnJlZUdsb2JhbCQxPV90eXBlb2YoY29tbW9uanNHbG9iYWwpPT0ib2JqZWN0IiYmY29tbW9uanNHbG9iYWwmJmNvbW1vbmpzR2xvYmFsLk9iamVjdD09PU9iamVjdCYmY29tbW9uanNHbG9iYWw7dmFyIGZyZWVTZWxmJDE9KHR5cGVvZiBzZWxmPT09InVuZGVmaW5lZCI/InVuZGVmaW5lZCI6X3R5cGVvZihzZWxmKSk9PSJvYmplY3QiJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZjt2YXIgcm9vdCQxPWZyZWVHbG9iYWwkMXx8ZnJlZVNlbGYkMXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKTtmdW5jdGlvbiBhcnJheUluY2x1ZGVzKGFycmF5LHZhbHVlKXt2YXIgbGVuZ3RoPWFycmF5P2FycmF5Lmxlbmd0aDowO3JldHVybiEhbGVuZ3RoJiZiYXNlSW5kZXhPZihhcnJheSx2YWx1ZSwwKT4tMX1mdW5jdGlvbiBhcnJheUluY2x1ZGVzV2l0aChhcnJheSx2YWx1ZSxjb21wYXJhdG9yKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5P2FycmF5Lmxlbmd0aDowO3doaWxlKCsraW5kZXg8bGVuZ3RoKXtpZihjb21wYXJhdG9yKHZhbHVlLGFycmF5W2luZGV4XSkpe3JldHVybiB0cnVlfX1yZXR1cm4gZmFsc2V9ZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSxwcmVkaWNhdGUsZnJvbUluZGV4LGZyb21SaWdodCl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGgsaW5kZXg9ZnJvbUluZGV4Kyhmcm9tUmlnaHQ/MTotMSk7d2hpbGUoZnJvbVJpZ2h0P2luZGV4LS06KytpbmRleDxsZW5ndGgpe2lmKHByZWRpY2F0ZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpKXtyZXR1cm4gaW5kZXh9fXJldHVybi0xfWZ1bmN0aW9uIGJhc2VJbmRleE9mKGFycmF5LHZhbHVlLGZyb21JbmRleCl7aWYodmFsdWUhPT12YWx1ZSl7cmV0dXJuIGJhc2VGaW5kSW5kZXgoYXJyYXksYmFzZUlzTmFOLGZyb21JbmRleCl9dmFyIGluZGV4PWZyb21JbmRleC0xLGxlbmd0aD1hcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe2lmKGFycmF5W2luZGV4XT09PXZhbHVlKXtyZXR1cm4gaW5kZXh9fXJldHVybi0xfWZ1bmN0aW9uIGJhc2VJc05hTih2YWx1ZSl7cmV0dXJuIHZhbHVlIT09dmFsdWV9ZnVuY3Rpb24gY2FjaGVIYXMoY2FjaGUsa2V5KXtyZXR1cm4gY2FjaGUuaGFzKGtleSl9ZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LGtleSl7cmV0dXJuIG9iamVjdD09bnVsbD91bmRlZmluZWQ6b2JqZWN0W2tleV19ZnVuY3Rpb24gaXNIb3N0T2JqZWN0KHZhbHVlKXt2YXIgcmVzdWx0PWZhbHNlO2lmKHZhbHVlIT1udWxsJiZ0eXBlb2YgdmFsdWUudG9TdHJpbmchPSJmdW5jdGlvbiIpe3RyeXtyZXN1bHQ9ISEodmFsdWUrIiIpfWNhdGNoKGUpe319cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBzZXRUb0FycmF5KHNldCl7dmFyIGluZGV4PS0xLHJlc3VsdD1BcnJheShzZXQuc2l6ZSk7c2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUpe3Jlc3VsdFsrK2luZGV4XT12YWx1ZX0pO3JldHVybiByZXN1bHR9dmFyIGFycmF5UHJvdG89QXJyYXkucHJvdG90eXBlO3ZhciBmdW5jUHJvdG89RnVuY3Rpb24ucHJvdG90eXBlO3ZhciBvYmplY3RQcm90byQxPU9iamVjdC5wcm90b3R5cGU7dmFyIGNvcmVKc0RhdGE9cm9vdCQxWyJfX2NvcmUtanNfc2hhcmVkX18iXTt2YXIgbWFza1NyY0tleT1mdW5jdGlvbigpe3ZhciB1aWQ9L1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhJiZjb3JlSnNEYXRhLmtleXMmJmNvcmVKc0RhdGEua2V5cy5JRV9QUk9UT3x8IiIpO3JldHVybiB1aWQ/IlN5bWJvbChzcmMpXzEuIit1aWQ6IiJ9KCk7dmFyIGZ1bmNUb1N0cmluZz1mdW5jUHJvdG8udG9TdHJpbmc7dmFyIGhhc093blByb3BlcnR5JDI9b2JqZWN0UHJvdG8kMS5oYXNPd25Qcm9wZXJ0eTt2YXIgb2JqZWN0VG9TdHJpbmckMT1vYmplY3RQcm90byQxLnRvU3RyaW5nO3ZhciByZUlzTmF0aXZlPVJlZ0V4cCgiXiIrZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkkMikucmVwbGFjZShyZVJlZ0V4cENoYXIsIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7dmFyIHNwbGljZT1hcnJheVByb3RvLnNwbGljZTt2YXIgTWFwJDI9Z2V0TmF0aXZlKHJvb3QkMSwiTWFwIik7dmFyIFNldCQxPWdldE5hdGl2ZShyb290JDEsIlNldCIpO3ZhciBuYXRpdmVDcmVhdGU9Z2V0TmF0aXZlKE9iamVjdCwiY3JlYXRlIik7ZnVuY3Rpb24gSGFzaChlbnRyaWVzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWVudHJpZXM/ZW50cmllcy5sZW5ndGg6MDt0aGlzLmNsZWFyKCk7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBlbnRyeT1lbnRyaWVzW2luZGV4XTt0aGlzLnNldChlbnRyeVswXSxlbnRyeVsxXSl9fWZ1bmN0aW9uIGhhc2hDbGVhcigpe3RoaXMuX19kYXRhX189bmF0aXZlQ3JlYXRlP25hdGl2ZUNyZWF0ZShudWxsKTp7fX1mdW5jdGlvbiBoYXNoRGVsZXRlKGtleSl7cmV0dXJuIHRoaXMuaGFzKGtleSkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleV19ZnVuY3Rpb24gaGFzaEdldChrZXkpe3ZhciBkYXRhPXRoaXMuX19kYXRhX187aWYobmF0aXZlQ3JlYXRlKXt2YXIgcmVzdWx0PWRhdGFba2V5XTtyZXR1cm4gcmVzdWx0PT09SEFTSF9VTkRFRklORUQ/dW5kZWZpbmVkOnJlc3VsdH1yZXR1cm4gaGFzT3duUHJvcGVydHkkMi5jYWxsKGRhdGEsa2V5KT9kYXRhW2tleV06dW5kZWZpbmVkfWZ1bmN0aW9uIGhhc2hIYXMoa2V5KXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fO3JldHVybiBuYXRpdmVDcmVhdGU/ZGF0YVtrZXldIT09dW5kZWZpbmVkOmhhc093blByb3BlcnR5JDIuY2FsbChkYXRhLGtleSl9ZnVuY3Rpb24gaGFzaFNldChrZXksdmFsdWUpe3ZhciBkYXRhPXRoaXMuX19kYXRhX187ZGF0YVtrZXldPW5hdGl2ZUNyZWF0ZSYmdmFsdWU9PT11bmRlZmluZWQ/SEFTSF9VTkRFRklORUQ6dmFsdWU7cmV0dXJuIHRoaXN9SGFzaC5wcm90b3R5cGUuY2xlYXI9aGFzaENsZWFyO0hhc2gucHJvdG90eXBlWyJkZWxldGUiXT1oYXNoRGVsZXRlO0hhc2gucHJvdG90eXBlLmdldD1oYXNoR2V0O0hhc2gucHJvdG90eXBlLmhhcz1oYXNoSGFzO0hhc2gucHJvdG90eXBlLnNldD1oYXNoU2V0O2Z1bmN0aW9uIExpc3RDYWNoZShlbnRyaWVzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWVudHJpZXM/ZW50cmllcy5sZW5ndGg6MDt0aGlzLmNsZWFyKCk7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBlbnRyeT1lbnRyaWVzW2luZGV4XTt0aGlzLnNldChlbnRyeVswXSxlbnRyeVsxXSl9fWZ1bmN0aW9uIGxpc3RDYWNoZUNsZWFyKCl7dGhpcy5fX2RhdGFfXz1bXX1mdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5KXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fLGluZGV4PWFzc29jSW5kZXhPZihkYXRhLGtleSk7aWYoaW5kZXg8MCl7cmV0dXJuIGZhbHNlfXZhciBsYXN0SW5kZXg9ZGF0YS5sZW5ndGgtMTtpZihpbmRleD09bGFzdEluZGV4KXtkYXRhLnBvcCgpfWVsc2V7c3BsaWNlLmNhbGwoZGF0YSxpbmRleCwxKX1yZXR1cm4gdHJ1ZX1mdW5jdGlvbiBsaXN0Q2FjaGVHZXQoa2V5KXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fLGluZGV4PWFzc29jSW5kZXhPZihkYXRhLGtleSk7cmV0dXJuIGluZGV4PDA/dW5kZWZpbmVkOmRhdGFbaW5kZXhdWzFdfWZ1bmN0aW9uIGxpc3RDYWNoZUhhcyhrZXkpe3JldHVybiBhc3NvY0luZGV4T2YodGhpcy5fX2RhdGFfXyxrZXkpPi0xfWZ1bmN0aW9uIGxpc3RDYWNoZVNldChrZXksdmFsdWUpe3ZhciBkYXRhPXRoaXMuX19kYXRhX18saW5kZXg9YXNzb2NJbmRleE9mKGRhdGEsa2V5KTtpZihpbmRleDwwKXtkYXRhLnB1c2goW2tleSx2YWx1ZV0pfWVsc2V7ZGF0YVtpbmRleF1bMV09dmFsdWV9cmV0dXJuIHRoaXN9TGlzdENhY2hlLnByb3RvdHlwZS5jbGVhcj1saXN0Q2FjaGVDbGVhcjtMaXN0Q2FjaGUucHJvdG90eXBlWyJkZWxldGUiXT1saXN0Q2FjaGVEZWxldGU7TGlzdENhY2hlLnByb3RvdHlwZS5nZXQ9bGlzdENhY2hlR2V0O0xpc3RDYWNoZS5wcm90b3R5cGUuaGFzPWxpc3RDYWNoZUhhcztMaXN0Q2FjaGUucHJvdG90eXBlLnNldD1saXN0Q2FjaGVTZXQ7ZnVuY3Rpb24gTWFwQ2FjaGUoZW50cmllcyl7dmFyIGluZGV4PS0xLGxlbmd0aD1lbnRyaWVzP2VudHJpZXMubGVuZ3RoOjA7dGhpcy5jbGVhcigpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgZW50cnk9ZW50cmllc1tpbmRleF07dGhpcy5zZXQoZW50cnlbMF0sZW50cnlbMV0pfX1mdW5jdGlvbiBtYXBDYWNoZUNsZWFyKCl7dGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgSGFzaCxtYXA6bmV3KE1hcCQyfHxMaXN0Q2FjaGUpLHN0cmluZzpuZXcgSGFzaH19ZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KXtyZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLGtleSlbImRlbGV0ZSJdKGtleSl9ZnVuY3Rpb24gbWFwQ2FjaGVHZXQoa2V5KXtyZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLGtleSkuZ2V0KGtleSl9ZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KXtyZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLGtleSkuaGFzKGtleSl9ZnVuY3Rpb24gbWFwQ2FjaGVTZXQoa2V5LHZhbHVlKXtnZXRNYXBEYXRhKHRoaXMsa2V5KS5zZXQoa2V5LHZhbHVlKTtyZXR1cm4gdGhpc31NYXBDYWNoZS5wcm90b3R5cGUuY2xlYXI9bWFwQ2FjaGVDbGVhcjtNYXBDYWNoZS5wcm90b3R5cGVbImRlbGV0ZSJdPW1hcENhY2hlRGVsZXRlO01hcENhY2hlLnByb3RvdHlwZS5nZXQ9bWFwQ2FjaGVHZXQ7TWFwQ2FjaGUucHJvdG90eXBlLmhhcz1tYXBDYWNoZUhhcztNYXBDYWNoZS5wcm90b3R5cGUuc2V0PW1hcENhY2hlU2V0O2Z1bmN0aW9uIFNldENhY2hlKHZhbHVlcyl7dmFyIGluZGV4PS0xLGxlbmd0aD12YWx1ZXM/dmFsdWVzLmxlbmd0aDowO3RoaXMuX19kYXRhX189bmV3IE1hcENhY2hlO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt0aGlzLmFkZCh2YWx1ZXNbaW5kZXhdKX19ZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpe3RoaXMuX19kYXRhX18uc2V0KHZhbHVlLEhBU0hfVU5ERUZJTkVEKTtyZXR1cm4gdGhpc31mdW5jdGlvbiBzZXRDYWNoZUhhcyh2YWx1ZSl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHZhbHVlKX1TZXRDYWNoZS5wcm90b3R5cGUuYWRkPVNldENhY2hlLnByb3RvdHlwZS5wdXNoPXNldENhY2hlQWRkO1NldENhY2hlLnByb3RvdHlwZS5oYXM9c2V0Q2FjaGVIYXM7ZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LGtleSl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7d2hpbGUobGVuZ3RoLS0pe2lmKGVxKGFycmF5W2xlbmd0aF1bMF0sa2V5KSl7cmV0dXJuIGxlbmd0aH19cmV0dXJuLTF9ZnVuY3Rpb24gYmFzZUlzTmF0aXZlKHZhbHVlKXtpZighaXNPYmplY3QkMSh2YWx1ZSl8fGlzTWFza2VkKHZhbHVlKSl7cmV0dXJuIGZhbHNlfXZhciBwYXR0ZXJuPWlzRnVuY3Rpb24kMSh2YWx1ZSl8fGlzSG9zdE9iamVjdCh2YWx1ZSk/cmVJc05hdGl2ZTpyZUlzSG9zdEN0b3I7cmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpfWZ1bmN0aW9uIGJhc2VVbmlxKGFycmF5LGl0ZXJhdGVlLGNvbXBhcmF0b3Ipe3ZhciBpbmRleD0tMSxpbmNsdWRlcz1hcnJheUluY2x1ZGVzLGxlbmd0aD1hcnJheS5sZW5ndGgsaXNDb21tb249dHJ1ZSxyZXN1bHQ9W10sc2Vlbj1yZXN1bHQ7aWYoY29tcGFyYXRvcil7aXNDb21tb249ZmFsc2U7aW5jbHVkZXM9YXJyYXlJbmNsdWRlc1dpdGh9ZWxzZSBpZihsZW5ndGg+PUxBUkdFX0FSUkFZX1NJWkUpe3ZhciBzZXQ9aXRlcmF0ZWU/bnVsbDpjcmVhdGVTZXQoYXJyYXkpO2lmKHNldCl7cmV0dXJuIHNldFRvQXJyYXkoc2V0KX1pc0NvbW1vbj1mYWxzZTtpbmNsdWRlcz1jYWNoZUhhcztzZWVuPW5ldyBTZXRDYWNoZX1lbHNle3NlZW49aXRlcmF0ZWU/W106cmVzdWx0fW91dGVyOndoaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdLGNvbXB1dGVkPWl0ZXJhdGVlP2l0ZXJhdGVlKHZhbHVlKTp2YWx1ZTt2YWx1ZT1jb21wYXJhdG9yfHx2YWx1ZSE9PTA/dmFsdWU6MDtpZihpc0NvbW1vbiYmY29tcHV0ZWQ9PT1jb21wdXRlZCl7dmFyIHNlZW5JbmRleD1zZWVuLmxlbmd0aDt3aGlsZShzZWVuSW5kZXgtLSl7aWYoc2VlbltzZWVuSW5kZXhdPT09Y29tcHV0ZWQpe2NvbnRpbnVlIG91dGVyfX1pZihpdGVyYXRlZSl7c2Vlbi5wdXNoKGNvbXB1dGVkKX1yZXN1bHQucHVzaCh2YWx1ZSl9ZWxzZSBpZighaW5jbHVkZXMoc2Vlbixjb21wdXRlZCxjb21wYXJhdG9yKSl7aWYoc2VlbiE9PXJlc3VsdCl7c2Vlbi5wdXNoKGNvbXB1dGVkKX1yZXN1bHQucHVzaCh2YWx1ZSl9fXJldHVybiByZXN1bHR9dmFyIGNyZWF0ZVNldD0hKFNldCQxJiYxL3NldFRvQXJyYXkobmV3IFNldCQxKFssLTBdKSlbMV09PUlORklOSVRZKT9ub29wJDI6ZnVuY3Rpb24odmFsdWVzKXtyZXR1cm4gbmV3IFNldCQxKHZhbHVlcyl9O2Z1bmN0aW9uIGdldE1hcERhdGEobWFwLGtleSl7dmFyIGRhdGE9bWFwLl9fZGF0YV9fO3JldHVybiBpc0tleWFibGUoa2V5KT9kYXRhW3R5cGVvZiBrZXk9PSJzdHJpbmciPyJzdHJpbmciOiJoYXNoIl06ZGF0YS5tYXB9ZnVuY3Rpb24gZ2V0TmF0aXZlKG9iamVjdCxrZXkpe3ZhciB2YWx1ZT1nZXRWYWx1ZShvYmplY3Qsa2V5KTtyZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKT92YWx1ZTp1bmRlZmluZWR9ZnVuY3Rpb24gaXNLZXlhYmxlKHZhbHVlKXt2YXIgdHlwZT10eXBlb2YgdmFsdWU9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKHZhbHVlKTtyZXR1cm4gdHlwZT09InN0cmluZyJ8fHR5cGU9PSJudW1iZXIifHx0eXBlPT0ic3ltYm9sInx8dHlwZT09ImJvb2xlYW4iP3ZhbHVlIT09Il9fcHJvdG9fXyI6dmFsdWU9PT1udWxsfWZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpe3JldHVybiEhbWFza1NyY0tleSYmbWFza1NyY0tleSBpbiBmdW5jfWZ1bmN0aW9uIHRvU291cmNlKGZ1bmMpe2lmKGZ1bmMhPW51bGwpe3RyeXtyZXR1cm4gZnVuY1RvU3RyaW5nLmNhbGwoZnVuYyl9Y2F0Y2goZSl7fXRyeXtyZXR1cm4gZnVuYysiIn1jYXRjaChlKXt9fXJldHVybiIifWZ1bmN0aW9uIHVuaXEoYXJyYXkpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VVbmlxKGFycmF5KTpbXX1mdW5jdGlvbiBlcSh2YWx1ZSxvdGhlcil7cmV0dXJuIHZhbHVlPT09b3RoZXJ8fHZhbHVlIT09dmFsdWUmJm90aGVyIT09b3RoZXJ9ZnVuY3Rpb24gaXNGdW5jdGlvbiQxKHZhbHVlKXt2YXIgdGFnPWlzT2JqZWN0JDEodmFsdWUpP29iamVjdFRvU3RyaW5nJDEuY2FsbCh2YWx1ZSk6IiI7cmV0dXJuIHRhZz09ZnVuY1RhZyQxfHx0YWc9PWdlblRhZyQxfWZ1bmN0aW9uIGlzT2JqZWN0JDEodmFsdWUpe3ZhciB0eXBlPXR5cGVvZiB2YWx1ZT09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2YodmFsdWUpO3JldHVybiEhdmFsdWUmJih0eXBlPT0ib2JqZWN0Inx8dHlwZT09ImZ1bmN0aW9uIil9ZnVuY3Rpb24gbm9vcCQyKCl7fXZhciBsb2Rhc2hfdW5pcT11bmlxO3ZhciBkYXRlc0ZvclVuaXF1ZT1mdW5jdGlvbiBkYXRlc0ZvclVuaXF1ZShkKXtyZXR1cm4gZCBpbnN0YW5jZW9mIERhdGU/ZC50b1N0cmluZygpOmR9O3ZhciBwcm9qZWN0QXJlYURhdGE9ZnVuY3Rpb24gcHJvamVjdEFyZWFEYXRhKF9yZWYpe3ZhciBkYXRhPV9yZWYuZGF0YSxhcmVhRGF0YUFjY2Vzc29yPV9yZWYuYXJlYURhdGFBY2Nlc3Nvcixwcm9qZWN0aW9uPV9yZWYucHJvamVjdGlvbix4QWNjZXNzb3I9X3JlZi54QWNjZXNzb3IseUFjY2Vzc29yPV9yZWYueUFjY2Vzc29yO3Byb2plY3Rpb249cHJvamVjdGlvbj9wcm9qZWN0aW9uOmZ1bmN0aW9uKGQpe3JldHVybiBhcmVhRGF0YUFjY2Vzc29yKGQpLm1hcChmdW5jdGlvbihwLHEpe3JldHVyblt4QWNjZXNzb3IocCxxKSx5QWNjZXNzb3IocCxxKV19KX07ZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2QuX3h5ZkNvb3JkaW5hdGVzPXByb2plY3Rpb24oZCl9KTtyZXR1cm4gZGF0YX07dmFyIHByb2plY3RMaW5lRGF0YT1mdW5jdGlvbiBwcm9qZWN0TGluZURhdGEoX3JlZjIpe3ZhciBkYXRhPV9yZWYyLmRhdGEsbGluZURhdGFBY2Nlc3Nvcj1fcmVmMi5saW5lRGF0YUFjY2Vzc29yLHhQcm9wPV9yZWYyLnhQcm9wLHlQcm9wPV9yZWYyLnlQcm9wLHlQcm9wVG9wPV9yZWYyLnlQcm9wVG9wLHlQcm9wQm90dG9tPV9yZWYyLnlQcm9wQm90dG9tLHhBY2Nlc3Nvcj1fcmVmMi54QWNjZXNzb3IseUFjY2Vzc29yPV9yZWYyLnlBY2Nlc3NvcjtpZighQXJyYXkuaXNBcnJheShkYXRhKSl7ZGF0YT1bZGF0YV19cmV0dXJuIGRhdGEubWFwKGZ1bmN0aW9uKGQsaSl7dmFyIG9yaWdpbmFsTGluZURhdGE9T2JqZWN0LmFzc2lnbih7fSxkKTtvcmlnaW5hbExpbmVEYXRhLmRhdGE9bGluZURhdGFBY2Nlc3NvcihkKS5tYXAoZnVuY3Rpb24ocCxxKXt2YXIgb3JpZ2luYWxDb29yZHM9T2JqZWN0LmFzc2lnbih7fSxwKTtvcmlnaW5hbENvb3Jkc1t4UHJvcF09eEFjY2Vzc29yKHAscSk7b3JpZ2luYWxDb29yZHNbeVByb3BdPXlBY2Nlc3NvcihwLHEpO29yaWdpbmFsQ29vcmRzW3lQcm9wVG9wXT1vcmlnaW5hbENvb3Jkc1t5UHJvcF07b3JpZ2luYWxDb29yZHNbeVByb3BCb3R0b21dPW9yaWdpbmFsQ29vcmRzW3lQcm9wXTtyZXR1cm4gb3JpZ2luYWxDb29yZHN9KTtvcmlnaW5hbExpbmVEYXRhLmtleT1vcmlnaW5hbExpbmVEYXRhLmtleXx8aTtyZXR1cm4gb3JpZ2luYWxMaW5lRGF0YX0pfTt2YXIgZGlmZmVyZW5jZUxpbmU9ZnVuY3Rpb24gZGlmZmVyZW5jZUxpbmUoX3JlZjMpe3ZhciBkYXRhPV9yZWYzLmRhdGEseVByb3A9X3JlZjMueVByb3AseVByb3BUb3A9X3JlZjMueVByb3BUb3AseVByb3BCb3R0b209X3JlZjMueVByb3BCb3R0b207ZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKGwsaSl7bC5kYXRhLmZvckVhY2goZnVuY3Rpb24ocG9pbnQscSl7dmFyIG90aGVyTGluZT1pPT09MD8xOjA7aWYocG9pbnRbeVByb3BdPmRhdGFbb3RoZXJMaW5lXS5kYXRhW3FdW3lQcm9wXSl7cG9pbnRbeVByb3BCb3R0b21dPWRhdGFbb3RoZXJMaW5lXS5kYXRhW3FdW3lQcm9wXTtwb2ludFt5UHJvcFRvcF09cG9pbnRbeVByb3BdfWVsc2V7cG9pbnRbeVByb3BUb3BdPXBvaW50W3lQcm9wXTtwb2ludFt5UHJvcEJvdHRvbV09cG9pbnRbeVByb3BdfX0pfSk7cmV0dXJuIGRhdGF9O3ZhciBzdGFja2VkQXJlYT1mdW5jdGlvbiBzdGFja2VkQXJlYShfcmVmNCl7dmFyIF9yZWY0JHR5cGU9X3JlZjQudHlwZSx0eXBlPV9yZWY0JHR5cGU9PT11bmRlZmluZWQ/InN0YWNrZWRhcmVhIjpfcmVmNCR0eXBlLGRhdGE9X3JlZjQuZGF0YSx4UHJvcD1fcmVmNC54UHJvcCx5UHJvcD1fcmVmNC55UHJvcCx5UHJvcE1pZGRsZT1fcmVmNC55UHJvcE1pZGRsZSxzb3J0PV9yZWY0LnNvcnQseVByb3BUb3A9X3JlZjQueVByb3BUb3AseVByb3BCb3R0b209X3JlZjQueVByb3BCb3R0b207dmFyIHVuaXFYVmFsdWVzPWxvZGFzaF91bmlxKGxvZGFzaF9mbGF0dGVuKGRhdGEubWFwKGZ1bmN0aW9uKGQpe3JldHVybiBkLmRhdGEubWFwKGZ1bmN0aW9uKHApe3JldHVybiBkYXRlc0ZvclVuaXF1ZShwW3hQcm9wXSl9KX0pKSk7dmFyIHN0YWNrU29ydD1mdW5jdGlvbiBzdGFja1NvcnQoYSxiKXtyZXR1cm4gc3VtJDEoYi5kYXRhLm1hcChmdW5jdGlvbihwKXtyZXR1cm4gcFt5UHJvcF19KSktc3VtJDEoYS5kYXRhLm1hcChmdW5jdGlvbihwKXtyZXR1cm4gcFt5UHJvcF19KSl9O2lmKHR5cGU9PT0ic3RhY2tlZHBlcmNlbnQtaW52ZXJ0Inx8dHlwZT09PSJzdGFja2VkYXJlYS1pbnZlcnQiKXtzdGFja1NvcnQ9ZnVuY3Rpb24gc3RhY2tTb3J0KGEsYil7cmV0dXJuIHN1bSQxKGEuZGF0YS5tYXAoZnVuY3Rpb24ocCl7cmV0dXJuIHBbeVByb3BdfSkpLXN1bSQxKGIuZGF0YS5tYXAoZnVuY3Rpb24ocCl7cmV0dXJuIHBbeVByb3BdfSkpfX1zb3J0PXNvcnQ9PT11bmRlZmluZWQ/c3RhY2tTb3J0OnNvcnQ7aWYoc29ydCE9PW51bGwpe2RhdGE9ZGF0YS5zb3J0KHNvcnQpfXVuaXFYVmFsdWVzLmZvckVhY2goZnVuY3Rpb24oeFZhbHVlKXt2YXIgbmVnYXRpdmVPZmZzZXQ9MDt2YXIgcG9zaXRpdmVPZmZzZXQ9MDt2YXIgc3RlcFZhbHVlcz1sb2Rhc2hfZmxhdHRlbihkYXRhLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gZC5kYXRhLmZpbHRlcihmdW5jdGlvbihwKXtyZXR1cm4gZGF0ZXNGb3JVbmlxdWUocFt4UHJvcF0pPT09eFZhbHVlfSl9KSk7dmFyIHBvc2l0aXZlU3RlcFRvdGFsPXN1bSQxKHN0ZXBWYWx1ZXMubWFwKGZ1bmN0aW9uKGQpe3JldHVybiBkW3lQcm9wXT4wP2RbeVByb3BdOjB9KSk7dmFyIG5lZ2F0aXZlU3RlcFRvdGFsPXN1bSQxKHN0ZXBWYWx1ZXMubWFwKGZ1bmN0aW9uKGQpe3JldHVybiBkW3lQcm9wXTwwP2RbeVByb3BdOjB9KSk7c3RlcFZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKGwpe2lmKGxbeVByb3BdPDApe2lmKHR5cGU9PT0ic3RhY2tlZHBlcmNlbnQifHx0eXBlPT09InN0YWNrZWRwZXJjZW50LWludmVydCIpe3ZhciBhZGp1c3RtZW50PW5lZ2F0aXZlU3RlcFRvdGFsPj0wPzA6bFt5UHJvcF0vbmVnYXRpdmVTdGVwVG90YWw7bFt5UHJvcEJvdHRvbV09bmVnYXRpdmVTdGVwVG90YWw9PT0wPzA6LShuZWdhdGl2ZU9mZnNldC9uZWdhdGl2ZVN0ZXBUb3RhbCk7bFt5UHJvcFRvcF09bFt5UHJvcEJvdHRvbV0tYWRqdXN0bWVudDtsW3lQcm9wTWlkZGxlXT1sW3lQcm9wQm90dG9tXS1hZGp1c3RtZW50LzJ9ZWxzZXtsW3lQcm9wQm90dG9tXT1uZWdhdGl2ZU9mZnNldDtsW3lQcm9wVG9wXT1uZWdhdGl2ZU9mZnNldCtsW3lQcm9wXTtsW3lQcm9wTWlkZGxlXT1uZWdhdGl2ZU9mZnNldCtsW3lQcm9wXS8yfW5lZ2F0aXZlT2Zmc2V0Kz1sW3lQcm9wXX1lbHNle2lmKHR5cGU9PT0ic3RhY2tlZHBlcmNlbnQifHx0eXBlPT09InN0YWNrZWRwZXJjZW50LWludmVydCIpe3ZhciBfYWRqdXN0bWVudD1wb3NpdGl2ZVN0ZXBUb3RhbDw9MD8wOmxbeVByb3BdL3Bvc2l0aXZlU3RlcFRvdGFsO2xbeVByb3BCb3R0b21dPXBvc2l0aXZlU3RlcFRvdGFsPT09MD8wOnBvc2l0aXZlT2Zmc2V0L3Bvc2l0aXZlU3RlcFRvdGFsO2xbeVByb3BUb3BdPWxbeVByb3BCb3R0b21dK19hZGp1c3RtZW50O2xbeVByb3BNaWRkbGVdPWxbeVByb3BCb3R0b21dK19hZGp1c3RtZW50LzJ9ZWxzZXtsW3lQcm9wQm90dG9tXT1wb3NpdGl2ZU9mZnNldDtsW3lQcm9wVG9wXT1wb3NpdGl2ZU9mZnNldCtsW3lQcm9wXTtsW3lQcm9wTWlkZGxlXT1wb3NpdGl2ZU9mZnNldCtsW3lQcm9wXS8yfXBvc2l0aXZlT2Zmc2V0Kz1sW3lQcm9wXX19KX0pO3JldHVybiBkYXRhfTt2YXIgbGluZUNoYXJ0PWZ1bmN0aW9uIGxpbmVDaGFydChfcmVmNSl7dmFyIGRhdGE9X3JlZjUuZGF0YSx5MT1fcmVmNS55MSx5UHJvcFRvcD1fcmVmNS55UHJvcFRvcCx5UHJvcE1pZGRsZT1fcmVmNS55UHJvcE1pZGRsZSx5UHJvcEJvdHRvbT1fcmVmNS55UHJvcEJvdHRvbTtpZih5MSl7ZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2QuZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKHApe3BbeVByb3BCb3R0b21dPXkxKHApO3BbeVByb3BNaWRkbGVdPXBbeVByb3BCb3R0b21dK3BbeVByb3BUb3BdLzJ9KX0pfXJldHVybiBkYXRhfTt2YXIgYnVtcENoYXJ0PWZ1bmN0aW9uIGJ1bXBDaGFydChfcmVmNil7dmFyIF9yZWY2JHR5cGU9X3JlZjYudHlwZSx0eXBlPV9yZWY2JHR5cGU9PT11bmRlZmluZWQ/ImJ1bXBsaW5lIjpfcmVmNiR0eXBlLGRhdGE9X3JlZjYuZGF0YSx4UHJvcD1fcmVmNi54UHJvcCx5UHJvcD1fcmVmNi55UHJvcCx5UHJvcE1pZGRsZT1fcmVmNi55UHJvcE1pZGRsZSx5UHJvcFRvcD1fcmVmNi55UHJvcFRvcCx5UHJvcEJvdHRvbT1fcmVmNi55UHJvcEJvdHRvbTt2YXIgdW5pcVhWYWx1ZXM9bG9kYXNoX3VuaXEobG9kYXNoX2ZsYXR0ZW4oZGF0YS5tYXAoZnVuY3Rpb24oZCl7cmV0dXJuIGQuZGF0YS5tYXAoZnVuY3Rpb24ocCl7cmV0dXJuIGRhdGVzRm9yVW5pcXVlKHBbeFByb3BdKX0pfSkpKTt2YXIgYnVtcFNvcnQ9ZnVuY3Rpb24gYnVtcFNvcnQoYSxiKXtpZihhW3lQcm9wXT5iW3lQcm9wXSl7cmV0dXJuIDF9aWYoYVt5UHJvcF08Ylt5UHJvcF0pe3JldHVybi0xfXJldHVybi0xfTtpZih0eXBlPT09ImJ1bXBhcmVhLWludmVydCJ8fHR5cGU9PT0iYnVtcGxpbmUtaW52ZXJ0Iil7YnVtcFNvcnQ9ZnVuY3Rpb24gYnVtcFNvcnQoYSxiKXtpZihhW3lQcm9wXTxiW3lQcm9wXSl7cmV0dXJuIDF9aWYoYVt5UHJvcF0+Ylt5UHJvcF0pe3JldHVybi0xfXJldHVybi0xfX11bmlxWFZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKHhWYWx1ZSl7dmFyIG5lZ2F0aXZlT2Zmc2V0PTA7dmFyIHBvc2l0aXZlT2Zmc2V0PTA7bG9kYXNoX2ZsYXR0ZW4oZGF0YS5tYXAoZnVuY3Rpb24oZCl7cmV0dXJuIGQuZGF0YS5maWx0ZXIoZnVuY3Rpb24ocCl7cmV0dXJuIGRhdGVzRm9yVW5pcXVlKHBbeFByb3BdKT09PXhWYWx1ZX0pfSkpLnNvcnQoYnVtcFNvcnQpLmZvckVhY2goZnVuY3Rpb24obCxyYW5rKXtsLl9YWUZyYW1lUmFuaz1yYW5rO2lmKHR5cGU9PT0iYnVtcGFyZWEifHx0eXBlPT09ImJ1bXBhcmVhLWludmVydCIpe2lmKGxbeVByb3BdPDApe2xbeVByb3BUb3BdPW5lZ2F0aXZlT2Zmc2V0K2xbeVByb3BdO2xbeVByb3BNaWRkbGVdPW5lZ2F0aXZlT2Zmc2V0K2xbeVByb3BdLzI7bFt5UHJvcEJvdHRvbV09bmVnYXRpdmVPZmZzZXQ7bmVnYXRpdmVPZmZzZXQrPWxbeVByb3BdfWVsc2V7bFt5UHJvcFRvcF09cG9zaXRpdmVPZmZzZXQrbFt5UHJvcF07bFt5UHJvcE1pZGRsZV09cG9zaXRpdmVPZmZzZXQrbFt5UHJvcF0vMjtsW3lQcm9wQm90dG9tXT1wb3NpdGl2ZU9mZnNldDtwb3NpdGl2ZU9mZnNldCs9bFt5UHJvcF19fWVsc2V7bFt5UHJvcF09cmFuaztsW3lQcm9wVG9wXT1yYW5rO2xbeVByb3BCb3R0b21dPXJhbmt9fSl9KTtyZXR1cm4gZGF0YX07dmFyIGRpdmlkZWRMaW5lPWZ1bmN0aW9uIGRpdmlkZWRMaW5lKHBhcmFtZXRlcnMscG9pbnRzKXt2YXIgc2VhcmNoSXRlcmF0aW9ucz1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMl06MTA7dmFyIGN1cnJlbnRQYXJhbWV0ZXJzPXBhcmFtZXRlcnMocG9pbnRzWzBdLDApO3ZhciBjdXJyZW50UG9pbnRzQXJyYXk9W107dmFyIGRpdmlkZWRMaW5lc0RhdGE9W3trZXk6Y3VycmVudFBhcmFtZXRlcnMscG9pbnRzOmN1cnJlbnRQb2ludHNBcnJheX1dO3BvaW50cy5mb3JFYWNoKGZ1bmN0aW9uKHBvaW50LHBvaW50SSl7dmFyIG5ld1BhcmFtZXRlcnM9cGFyYW1ldGVycyhwb2ludCxwb2ludEkpO3ZhciBtYXRjaGluZ1BhcmFtcz1uZXdQYXJhbWV0ZXJzPT09Y3VycmVudFBhcmFtZXRlcnM7dmFyIHN0cmluZ05ld1BhcmFtcz1KU09OLnN0cmluZ2lmeShuZXdQYXJhbWV0ZXJzKTt2YXIgc3RyaW5nQ3VycmVudFBhcmFtcz1KU09OLnN0cmluZ2lmeShjdXJyZW50UGFyYW1ldGVycyk7aWYoKHR5cGVvZiBjdXJyZW50UGFyYW1ldGVycz09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2YoY3VycmVudFBhcmFtZXRlcnMpKT09PSJvYmplY3QiKXttYXRjaGluZ1BhcmFtcz1zdHJpbmdOZXdQYXJhbXM9PT1zdHJpbmdDdXJyZW50UGFyYW1zfWlmKG1hdGNoaW5nUGFyYW1zKXtjdXJyZW50UG9pbnRzQXJyYXkucHVzaChwb2ludCl9ZWxzZXt2YXIgbGFzdFBvaW50PWN1cnJlbnRQb2ludHNBcnJheVtjdXJyZW50UG9pbnRzQXJyYXkubGVuZ3RoLTFdO3ZhciBwb2ludEE9bGFzdFBvaW50O3ZhciBwb2ludEI9cG9pbnQ7dmFyIHN0cmluZ0JQYXJhbXM9c3RyaW5nTmV3UGFyYW1zO3ZhciB4PTA7d2hpbGUoeDxzZWFyY2hJdGVyYXRpb25zJiZzdHJpbmdOZXdQYXJhbXM9PT1zdHJpbmdCUGFyYW1zKXt2YXIga2V5cz1PYmplY3Qua2V5cyhwb2ludEEpO3ZhciBmaW5kUG9pbnRzPXNpbXBsZVNlYXJjaEZ1bmN0aW9uKHtwb2ludEE6cG9pbnRBLHBvaW50Qjpwb2ludEIsY3VycmVudFBhcmFtZXRlcnM6Y3VycmVudFBhcmFtZXRlcnMscGFyYW1ldGVyczpwYXJhbWV0ZXJzLGtleXM6a2V5c30pO3BvaW50QT1maW5kUG9pbnRzWzBdO3BvaW50Qj1maW5kUG9pbnRzWzFdO3N0cmluZ0JQYXJhbXM9SlNPTi5zdHJpbmdpZnkocGFyYW1ldGVycyhwb2ludEIpKTt4Kyt9Y3VycmVudFBvaW50c0FycmF5LnB1c2gocG9pbnRCKTtjdXJyZW50UG9pbnRzQXJyYXk9W3BvaW50Qixwb2ludF07ZGl2aWRlZExpbmVzRGF0YS5wdXNoKHtrZXk6bmV3UGFyYW1ldGVycyxwb2ludHM6Y3VycmVudFBvaW50c0FycmF5fSk7Y3VycmVudFBhcmFtZXRlcnM9bmV3UGFyYW1ldGVyc319KTtyZXR1cm4gZGl2aWRlZExpbmVzRGF0YX07ZnVuY3Rpb24gc2ltcGxlU2VhcmNoRnVuY3Rpb24oX3JlZjcpe3ZhciBwb2ludEE9X3JlZjcucG9pbnRBLHBvaW50Qj1fcmVmNy5wb2ludEIsY3VycmVudFBhcmFtZXRlcnM9X3JlZjcuY3VycmVudFBhcmFtZXRlcnMscGFyYW1ldGVycz1fcmVmNy5wYXJhbWV0ZXJzLGtleXM9X3JlZjcua2V5czt2YXIgYmV0d2VlblBvaW50PXt9O2tleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpe2JldHdlZW5Qb2ludFtrZXldPXR5cGVvZiBwb2ludEFba2V5XT09PSJudW1iZXIiPyhwb2ludEFba2V5XStwb2ludEJba2V5XSkvMjp1bmRlZmluZWR9KTt2YXIgc3RyaW5nQmV0d2Vlbj1KU09OLnN0cmluZ2lmeShwYXJhbWV0ZXJzKGJldHdlZW5Qb2ludCkpO3ZhciBzdHJpbmdDdXJyZW50PUpTT04uc3RyaW5naWZ5KGN1cnJlbnRQYXJhbWV0ZXJzKTtpZihzdHJpbmdCZXR3ZWVuPT09c3RyaW5nQ3VycmVudCl7cmV0dXJuW2JldHdlZW5Qb2ludCxwb2ludEJdfXJldHVybltwb2ludEEsYmV0d2VlblBvaW50XX1mdW5jdGlvbiBmdW5uZWxpemUoX3JlZjgpe3ZhciBkYXRhPV9yZWY4LmRhdGEsc3RlcHM9X3JlZjguc3RlcHMsa2V5PV9yZWY4LmtleTt2YXIgZnVubmVsRGF0YT1bXTtpZighQXJyYXkuaXNBcnJheShkYXRhKSl7ZGF0YT1bZGF0YV19aWYoIXN0ZXBzKXtzdGVwcz1sb2Rhc2hfdW5pcShsb2Rhc2hfZmxhdHRlbihkYXRhLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gT2JqZWN0LmtleXMoZCl9KSkpfWRhdGEuZm9yRWFjaChmdW5jdGlvbihkYXR1bSxpKXt2YXIgZGF0dW1LZXk9a2V5P2RhdHVtW2tleV06aTtzdGVwcy5mb3JFYWNoKGZ1bmN0aW9uKHN0ZXApe3ZhciBmdW5uZWxEYXR1bT17ZnVubmVsS2V5OmRhdHVtS2V5fTtmdW5uZWxEYXR1bS5zdGVwTmFtZT1zdGVwO2Z1bm5lbERhdHVtLnN0ZXBWYWx1ZT1kYXR1bVtzdGVwXT9kYXR1bVtzdGVwXTowO2Z1bm5lbERhdGEucHVzaChmdW5uZWxEYXR1bSl9KX0pO3JldHVybiBmdW5uZWxEYXRhfWZ1bmN0aW9uIHJlbGF0aXZlWShfcmVmOSl7dmFyIHBvaW50PV9yZWY5LnBvaW50LGxpbmVzPV9yZWY5LmxpbmVzLHByb2plY3RlZFlNaWRkbGU9X3JlZjkucHJvamVjdGVkWU1pZGRsZSxwcm9qZWN0ZWRZPV9yZWY5LnByb2plY3RlZFkscHJvamVjdGVkWD1fcmVmOS5wcm9qZWN0ZWRYLHhBY2Nlc3Nvcj1fcmVmOS54QWNjZXNzb3IseUFjY2Vzc29yPV9yZWY5LnlBY2Nlc3Nvcix5U2NhbGU9X3JlZjkueVNjYWxlLHhTY2FsZT1fcmVmOS54U2NhbGUsaWRBY2Nlc3Nvcj1fcmVmOS5pZEFjY2Vzc29yO2lmKGlkQWNjZXNzb3IocG9pbnQpKXt2YXIgdGhpc0xpbmU9bGluZXMuZGF0YS5maW5kKGZ1bmN0aW9uKGwpe3JldHVybiBpZEFjY2Vzc29yKGwpPT09aWRBY2Nlc3Nvcihwb2ludCl9KTtpZighdGhpc0xpbmUpe3JldHVybiBudWxsfXZhciB0aGlzUG9pbnQ9dGhpc0xpbmUuZGF0YS5maW5kKGZ1bmN0aW9uKHApe3JldHVybiB4U2NhbGUocFtwcm9qZWN0ZWRYXSk9PT14U2NhbGUoeEFjY2Vzc29yKHBvaW50KSl9KTtpZighdGhpc1BvaW50KXtyZXR1cm4gbnVsbH1wb2ludD10aGlzUG9pbnR9cmV0dXJuIHlTY2FsZShwb2ludFtwcm9qZWN0ZWRZTWlkZGxlXXx8cG9pbnRbcHJvamVjdGVkWV18fHlBY2Nlc3Nvcihwb2ludCkpfXZhciB4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI7dmFyIG5hbWVzcGFjZXM9e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHhodG1sOnhodG1sLHhsaW5rOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIix4bWw6Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIn07dmFyIG5hbWVzcGFjZT1mdW5jdGlvbihuYW1lKXt2YXIgcHJlZml4PW5hbWUrPSIiLGk9cHJlZml4LmluZGV4T2YoIjoiKTtpZihpPj0wJiYocHJlZml4PW5hbWUuc2xpY2UoMCxpKSkhPT0ieG1sbnMiKW5hbWU9bmFtZS5zbGljZShpKzEpO3JldHVybiBuYW1lc3BhY2VzLmhhc093blByb3BlcnR5KHByZWZpeCk/e3NwYWNlOm5hbWVzcGFjZXNbcHJlZml4XSxsb2NhbDpuYW1lfTpuYW1lfTtmdW5jdGlvbiBjcmVhdG9ySW5oZXJpdChuYW1lKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZG9jdW1lbnQ9dGhpcy5vd25lckRvY3VtZW50LHVyaT10aGlzLm5hbWVzcGFjZVVSSTtyZXR1cm4gdXJpPT09eGh0bWwmJmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkk9PT14aHRtbD9kb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh1cmksbmFtZSl9fWZ1bmN0aW9uIGNyZWF0b3JGaXhlZChmdWxsbmFtZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZnVsbG5hbWUuc3BhY2UsZnVsbG5hbWUubG9jYWwpfX12YXIgY3JlYXRvcj1mdW5jdGlvbihuYW1lKXt2YXIgZnVsbG5hbWU9bmFtZXNwYWNlKG5hbWUpO3JldHVybihmdWxsbmFtZS5sb2NhbD9jcmVhdG9yRml4ZWQ6Y3JlYXRvckluaGVyaXQpKGZ1bGxuYW1lKX07dmFyIG5leHRJZD0wO2Z1bmN0aW9uIGxvY2FsKCl7cmV0dXJuIG5ldyBMb2NhbH1mdW5jdGlvbiBMb2NhbCgpe3RoaXMuXz0iQCIrKCsrbmV4dElkKS50b1N0cmluZygzNil9TG9jYWwucHJvdG90eXBlPWxvY2FsLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TG9jYWwsZ2V0OmZ1bmN0aW9uIGdldChub2RlKXt2YXIgaWQ9dGhpcy5fO3doaWxlKCEoaWQgaW4gbm9kZSkpe2lmKCEobm9kZT1ub2RlLnBhcmVudE5vZGUpKXJldHVybn1yZXR1cm4gbm9kZVtpZF19LHNldDpmdW5jdGlvbiBzZXQobm9kZSx2YWx1ZSl7cmV0dXJuIG5vZGVbdGhpcy5fXT12YWx1ZX0scmVtb3ZlOmZ1bmN0aW9uIHJlbW92ZShub2RlKXtyZXR1cm4gdGhpcy5fIGluIG5vZGUmJmRlbGV0ZSBub2RlW3RoaXMuX119LHRvU3RyaW5nOmZ1bmN0aW9uIHRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuX319O3ZhciBtYXRjaGVyPWZ1bmN0aW9uIG1hdGNoZXIoc2VsZWN0b3Ipe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hdGNoZXMoc2VsZWN0b3IpfX07aWYodHlwZW9mIGRvY3VtZW50IT09InVuZGVmaW5lZCIpe3ZhciBlbGVtZW50PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtpZighZWxlbWVudC5tYXRjaGVzKXt2YXIgdmVuZG9yTWF0Y2hlcz1lbGVtZW50LndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8ZWxlbWVudC5tc01hdGNoZXNTZWxlY3Rvcnx8ZWxlbWVudC5tb3pNYXRjaGVzU2VsZWN0b3J8fGVsZW1lbnQub01hdGNoZXNTZWxlY3RvcjttYXRjaGVyPWZ1bmN0aW9uIG1hdGNoZXIoc2VsZWN0b3Ipe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB2ZW5kb3JNYXRjaGVzLmNhbGwodGhpcyxzZWxlY3Rvcil9fX19dmFyIG1hdGNoZXIkMT1tYXRjaGVyO3ZhciBmaWx0ZXJFdmVudHM9e307dmFyIGV2ZW50PW51bGw7aWYodHlwZW9mIGRvY3VtZW50IT09InVuZGVmaW5lZCIpe3ZhciBlbGVtZW50JDE9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O2lmKCEoIm9ubW91c2VlbnRlciJpbiBlbGVtZW50JDEpKXtmaWx0ZXJFdmVudHM9e21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifX19ZnVuY3Rpb24gZmlsdGVyQ29udGV4dExpc3RlbmVyKGxpc3RlbmVyLGluZGV4LGdyb3VwKXtsaXN0ZW5lcj1jb250ZXh0TGlzdGVuZXIobGlzdGVuZXIsaW5kZXgsZ3JvdXApO3JldHVybiBmdW5jdGlvbihldmVudCl7dmFyIHJlbGF0ZWQ9ZXZlbnQucmVsYXRlZFRhcmdldDtpZighcmVsYXRlZHx8cmVsYXRlZCE9PXRoaXMmJiEocmVsYXRlZC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzKSY4KSl7bGlzdGVuZXIuY2FsbCh0aGlzLGV2ZW50KX19fWZ1bmN0aW9uIGNvbnRleHRMaXN0ZW5lcihsaXN0ZW5lcixpbmRleCxncm91cCl7cmV0dXJuIGZ1bmN0aW9uKGV2ZW50MSl7dmFyIGV2ZW50MD1ldmVudDtldmVudD1ldmVudDE7dHJ5e2xpc3RlbmVyLmNhbGwodGhpcyx0aGlzLl9fZGF0YV9fLGluZGV4LGdyb3VwKX1maW5hbGx5e2V2ZW50PWV2ZW50MH19fWZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzJDEodHlwZW5hbWVzKXtyZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCl7dmFyIG5hbWU9IiIsaT10LmluZGV4T2YoIi4iKTtpZihpPj0wKW5hbWU9dC5zbGljZShpKzEpLHQ9dC5zbGljZSgwLGkpO3JldHVybnt0eXBlOnQsbmFtZTpuYW1lfX0pfWZ1bmN0aW9uIG9uUmVtb3ZlKHR5cGVuYW1lKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgb249dGhpcy5fX29uO2lmKCFvbilyZXR1cm47Zm9yKHZhciBqPTAsaT0tMSxtPW9uLmxlbmd0aCxvO2o8bTsrK2ope2lmKG89b25bal0sKCF0eXBlbmFtZS50eXBlfHxvLnR5cGU9PT10eXBlbmFtZS50eXBlKSYmby5uYW1lPT09dHlwZW5hbWUubmFtZSl7dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSxvLmxpc3RlbmVyLG8uY2FwdHVyZSl9ZWxzZXtvblsrK2ldPW99fWlmKCsraSlvbi5sZW5ndGg9aTtlbHNlIGRlbGV0ZSB0aGlzLl9fb259fWZ1bmN0aW9uIG9uQWRkKHR5cGVuYW1lLHZhbHVlLGNhcHR1cmUpe3ZhciB3cmFwPWZpbHRlckV2ZW50cy5oYXNPd25Qcm9wZXJ0eSh0eXBlbmFtZS50eXBlKT9maWx0ZXJDb250ZXh0TGlzdGVuZXI6Y29udGV4dExpc3RlbmVyO3JldHVybiBmdW5jdGlvbihkLGksZ3JvdXApe3ZhciBvbj10aGlzLl9fb24sbyxsaXN0ZW5lcj13cmFwKHZhbHVlLGksZ3JvdXApO2lmKG9uKWZvcih2YXIgaj0wLG09b24ubGVuZ3RoO2o8bTsrK2ope2lmKChvPW9uW2pdKS50eXBlPT09dHlwZW5hbWUudHlwZSYmby5uYW1lPT09dHlwZW5hbWUubmFtZSl7dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSxvLmxpc3RlbmVyLG8uY2FwdHVyZSk7dGhpcy5hZGRFdmVudExpc3RlbmVyKG8udHlwZSxvLmxpc3RlbmVyPWxpc3RlbmVyLG8uY2FwdHVyZT1jYXB0dXJlKTtvLnZhbHVlPXZhbHVlO3JldHVybn19dGhpcy5hZGRFdmVudExpc3RlbmVyKHR5cGVuYW1lLnR5cGUsbGlzdGVuZXIsY2FwdHVyZSk7bz17dHlwZTp0eXBlbmFtZS50eXBlLG5hbWU6dHlwZW5hbWUubmFtZSx2YWx1ZTp2YWx1ZSxsaXN0ZW5lcjpsaXN0ZW5lcixjYXB0dXJlOmNhcHR1cmV9O2lmKCFvbil0aGlzLl9fb249W29dO2Vsc2Ugb24ucHVzaChvKX19dmFyIHNlbGVjdGlvbl9vbj1mdW5jdGlvbih0eXBlbmFtZSx2YWx1ZSxjYXB0dXJlKXt2YXIgdHlwZW5hbWVzPXBhcnNlVHlwZW5hbWVzJDEodHlwZW5hbWUrIiIpLGksbj10eXBlbmFtZXMubGVuZ3RoLHQ7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXt2YXIgb249dGhpcy5ub2RlKCkuX19vbjtpZihvbilmb3IodmFyIGo9MCxtPW9uLmxlbmd0aCxvO2o8bTsrK2ope2ZvcihpPTAsbz1vbltqXTtpPG47KytpKXtpZigodD10eXBlbmFtZXNbaV0pLnR5cGU9PT1vLnR5cGUmJnQubmFtZT09PW8ubmFtZSl7cmV0dXJuIG8udmFsdWV9fX1yZXR1cm59b249dmFsdWU/b25BZGQ6b25SZW1vdmU7aWYoY2FwdHVyZT09bnVsbCljYXB0dXJlPWZhbHNlO2ZvcihpPTA7aTxuOysraSl7dGhpcy5lYWNoKG9uKHR5cGVuYW1lc1tpXSx2YWx1ZSxjYXB0dXJlKSl9cmV0dXJuIHRoaXN9O2Z1bmN0aW9uIGN1c3RvbUV2ZW50KGV2ZW50MSxsaXN0ZW5lcix0aGF0LGFyZ3Mpe3ZhciBldmVudDA9ZXZlbnQ7ZXZlbnQxLnNvdXJjZUV2ZW50PWV2ZW50O2V2ZW50PWV2ZW50MTt0cnl7cmV0dXJuIGxpc3RlbmVyLmFwcGx5KHRoYXQsYXJncyl9ZmluYWxseXtldmVudD1ldmVudDB9fXZhciBzb3VyY2VFdmVudD1mdW5jdGlvbigpe3ZhciBjdXJyZW50PWV2ZW50LHNvdXJjZTt3aGlsZShzb3VyY2U9Y3VycmVudC5zb3VyY2VFdmVudCl7Y3VycmVudD1zb3VyY2V9cmV0dXJuIGN1cnJlbnR9O3ZhciBwb2ludD1mdW5jdGlvbihub2RlLGV2ZW50KXt2YXIgc3ZnPW5vZGUub3duZXJTVkdFbGVtZW50fHxub2RlO2lmKHN2Zy5jcmVhdGVTVkdQb2ludCl7dmFyIHBvaW50PXN2Zy5jcmVhdGVTVkdQb2ludCgpO3BvaW50Lng9ZXZlbnQuY2xpZW50WCxwb2ludC55PWV2ZW50LmNsaWVudFk7cG9pbnQ9cG9pbnQubWF0cml4VHJhbnNmb3JtKG5vZGUuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKTtyZXR1cm5bcG9pbnQueCxwb2ludC55XX12YXIgcmVjdD1ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybltldmVudC5jbGllbnRYLXJlY3QubGVmdC1ub2RlLmNsaWVudExlZnQsZXZlbnQuY2xpZW50WS1yZWN0LnRvcC1ub2RlLmNsaWVudFRvcF19O3ZhciBtb3VzZT1mdW5jdGlvbihub2RlKXt2YXIgZXZlbnQ9c291cmNlRXZlbnQoKTtpZihldmVudC5jaGFuZ2VkVG91Y2hlcylldmVudD1ldmVudC5jaGFuZ2VkVG91Y2hlc1swXTtyZXR1cm4gcG9pbnQobm9kZSxldmVudCl9O2Z1bmN0aW9uIG5vbmUkMigpe312YXIgc2VsZWN0b3I9ZnVuY3Rpb24oc2VsZWN0b3Ipe3JldHVybiBzZWxlY3Rvcj09bnVsbD9ub25lJDI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKX19O3ZhciBzZWxlY3Rpb25fc2VsZWN0PWZ1bmN0aW9uKHNlbGVjdCl7aWYodHlwZW9mIHNlbGVjdCE9PSJmdW5jdGlvbiIpc2VsZWN0PXNlbGVjdG9yKHNlbGVjdCk7Zm9yKHZhciBncm91cHM9dGhpcy5fZ3JvdXBzLG09Z3JvdXBzLmxlbmd0aCxzdWJncm91cHM9bmV3IEFycmF5KG0pLGo9MDtqPG07KytqKXtmb3IodmFyIGdyb3VwPWdyb3Vwc1tqXSxuPWdyb3VwLmxlbmd0aCxzdWJncm91cD1zdWJncm91cHNbal09bmV3IEFycmF5KG4pLG5vZGUsc3Vibm9kZSxpPTA7aTxuOysraSl7aWYoKG5vZGU9Z3JvdXBbaV0pJiYoc3Vibm9kZT1zZWxlY3QuY2FsbChub2RlLG5vZGUuX19kYXRhX18saSxncm91cCkpKXtpZigiX19kYXRhX18iaW4gbm9kZSlzdWJub2RlLl9fZGF0YV9fPW5vZGUuX19kYXRhX187c3ViZ3JvdXBbaV09c3Vibm9kZX19fXJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3Vwcyx0aGlzLl9wYXJlbnRzKX07ZnVuY3Rpb24gZW1wdHkoKXtyZXR1cm5bXX12YXIgc2VsZWN0b3JBbGw9ZnVuY3Rpb24oc2VsZWN0b3Ipe3JldHVybiBzZWxlY3Rvcj09bnVsbD9lbXB0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpfX07dmFyIHNlbGVjdGlvbl9zZWxlY3RBbGw9ZnVuY3Rpb24oc2VsZWN0KXtpZih0eXBlb2Ygc2VsZWN0IT09ImZ1bmN0aW9uIilzZWxlY3Q9c2VsZWN0b3JBbGwoc2VsZWN0KTtmb3IodmFyIGdyb3Vwcz10aGlzLl9ncm91cHMsbT1ncm91cHMubGVuZ3RoLHN1Ymdyb3Vwcz1bXSxwYXJlbnRzPVtdLGo9MDtqPG07KytqKXtmb3IodmFyIGdyb3VwPWdyb3Vwc1tqXSxuPWdyb3VwLmxlbmd0aCxub2RlLGk9MDtpPG47KytpKXtpZihub2RlPWdyb3VwW2ldKXtzdWJncm91cHMucHVzaChzZWxlY3QuY2FsbChub2RlLG5vZGUuX19kYXRhX18saSxncm91cCkpO3BhcmVudHMucHVzaChub2RlKX19fXJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcyxwYXJlbnRzKX07dmFyIHNlbGVjdGlvbl9maWx0ZXI9ZnVuY3Rpb24obWF0Y2gpe2lmKHR5cGVvZiBtYXRjaCE9PSJmdW5jdGlvbiIpbWF0Y2g9bWF0Y2hlciQxKG1hdGNoKTtmb3IodmFyIGdyb3Vwcz10aGlzLl9ncm91cHMsbT1ncm91cHMubGVuZ3RoLHN1Ymdyb3Vwcz1uZXcgQXJyYXkobSksaj0wO2o8bTsrK2ope2Zvcih2YXIgZ3JvdXA9Z3JvdXBzW2pdLG49Z3JvdXAubGVuZ3RoLHN1Ymdyb3VwPXN1Ymdyb3Vwc1tqXT1bXSxub2RlLGk9MDtpPG47KytpKXtpZigobm9kZT1ncm91cFtpXSkmJm1hdGNoLmNhbGwobm9kZSxub2RlLl9fZGF0YV9fLGksZ3JvdXApKXtzdWJncm91cC5wdXNoKG5vZGUpfX19cmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLHRoaXMuX3BhcmVudHMpfTt2YXIgc3BhcnNlPWZ1bmN0aW9uKHVwZGF0ZSl7cmV0dXJuIG5ldyBBcnJheSh1cGRhdGUubGVuZ3RoKX07dmFyIHNlbGVjdGlvbl9lbnRlcj1mdW5jdGlvbigpe3JldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2VudGVyfHx0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksdGhpcy5fcGFyZW50cyl9O2Z1bmN0aW9uIEVudGVyTm9kZShwYXJlbnQsZGF0dW0pe3RoaXMub3duZXJEb2N1bWVudD1wYXJlbnQub3duZXJEb2N1bWVudDt0aGlzLm5hbWVzcGFjZVVSST1wYXJlbnQubmFtZXNwYWNlVVJJO3RoaXMuX25leHQ9bnVsbDt0aGlzLl9wYXJlbnQ9cGFyZW50O3RoaXMuX19kYXRhX189ZGF0dW19RW50ZXJOb2RlLnByb3RvdHlwZT17Y29uc3RydWN0b3I6RW50ZXJOb2RlLGFwcGVuZENoaWxkOmZ1bmN0aW9uIGFwcGVuZENoaWxkKGNoaWxkKXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCx0aGlzLl9uZXh0KX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uIGluc2VydEJlZm9yZShjaGlsZCxuZXh0KXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCxuZXh0KX0scXVlcnlTZWxlY3RvcjpmdW5jdGlvbiBxdWVyeVNlbGVjdG9yKHNlbGVjdG9yKXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpfSxxdWVyeVNlbGVjdG9yQWxsOmZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3Ipe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcil9fTt2YXIgY29uc3RhbnQkMz1mdW5jdGlvbih4KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4geH19O3ZhciBrZXlQcmVmaXg9IiQiO2Z1bmN0aW9uIGJpbmRJbmRleChwYXJlbnQsZ3JvdXAsZW50ZXIsdXBkYXRlLGV4aXQsZGF0YSl7dmFyIGk9MCxub2RlLGdyb3VwTGVuZ3RoPWdyb3VwLmxlbmd0aCxkYXRhTGVuZ3RoPWRhdGEubGVuZ3RoO2Zvcig7aTxkYXRhTGVuZ3RoOysraSl7aWYobm9kZT1ncm91cFtpXSl7bm9kZS5fX2RhdGFfXz1kYXRhW2ldO3VwZGF0ZVtpXT1ub2RlfWVsc2V7ZW50ZXJbaV09bmV3IEVudGVyTm9kZShwYXJlbnQsZGF0YVtpXSl9fWZvcig7aTxncm91cExlbmd0aDsrK2kpe2lmKG5vZGU9Z3JvdXBbaV0pe2V4aXRbaV09bm9kZX19fWZ1bmN0aW9uIGJpbmRLZXkocGFyZW50LGdyb3VwLGVudGVyLHVwZGF0ZSxleGl0LGRhdGEsa2V5KXt2YXIgaSxub2RlLG5vZGVCeUtleVZhbHVlPXt9LGdyb3VwTGVuZ3RoPWdyb3VwLmxlbmd0aCxkYXRhTGVuZ3RoPWRhdGEubGVuZ3RoLGtleVZhbHVlcz1uZXcgQXJyYXkoZ3JvdXBMZW5ndGgpLGtleVZhbHVlO2ZvcihpPTA7aTxncm91cExlbmd0aDsrK2kpe2lmKG5vZGU9Z3JvdXBbaV0pe2tleVZhbHVlc1tpXT1rZXlWYWx1ZT1rZXlQcmVmaXgra2V5LmNhbGwobm9kZSxub2RlLl9fZGF0YV9fLGksZ3JvdXApO2lmKGtleVZhbHVlIGluIG5vZGVCeUtleVZhbHVlKXtleGl0W2ldPW5vZGV9ZWxzZXtub2RlQnlLZXlWYWx1ZVtrZXlWYWx1ZV09bm9kZX19fWZvcihpPTA7aTxkYXRhTGVuZ3RoOysraSl7a2V5VmFsdWU9a2V5UHJlZml4K2tleS5jYWxsKHBhcmVudCxkYXRhW2ldLGksZGF0YSk7aWYobm9kZT1ub2RlQnlLZXlWYWx1ZVtrZXlWYWx1ZV0pe3VwZGF0ZVtpXT1ub2RlO25vZGUuX19kYXRhX189ZGF0YVtpXTtub2RlQnlLZXlWYWx1ZVtrZXlWYWx1ZV09bnVsbH1lbHNle2VudGVyW2ldPW5ldyBFbnRlck5vZGUocGFyZW50LGRhdGFbaV0pfX1mb3IoaT0wO2k8Z3JvdXBMZW5ndGg7KytpKXtpZigobm9kZT1ncm91cFtpXSkmJm5vZGVCeUtleVZhbHVlW2tleVZhbHVlc1tpXV09PT1ub2RlKXtleGl0W2ldPW5vZGV9fX12YXIgc2VsZWN0aW9uX2RhdGE9ZnVuY3Rpb24odmFsdWUsa2V5KXtpZighdmFsdWUpe2RhdGE9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKSxqPS0xO3RoaXMuZWFjaChmdW5jdGlvbihkKXtkYXRhWysral09ZH0pO3JldHVybiBkYXRhfXZhciBiaW5kPWtleT9iaW5kS2V5OmJpbmRJbmRleCxwYXJlbnRzPXRoaXMuX3BhcmVudHMsZ3JvdXBzPXRoaXMuX2dyb3VwcztpZih0eXBlb2YgdmFsdWUhPT0iZnVuY3Rpb24iKXZhbHVlPWNvbnN0YW50JDModmFsdWUpO2Zvcih2YXIgbT1ncm91cHMubGVuZ3RoLHVwZGF0ZT1uZXcgQXJyYXkobSksZW50ZXI9bmV3IEFycmF5KG0pLGV4aXQ9bmV3IEFycmF5KG0pLGo9MDtqPG07KytqKXt2YXIgcGFyZW50PXBhcmVudHNbal0sZ3JvdXA9Z3JvdXBzW2pdLGdyb3VwTGVuZ3RoPWdyb3VwLmxlbmd0aCxkYXRhPXZhbHVlLmNhbGwocGFyZW50LHBhcmVudCYmcGFyZW50Ll9fZGF0YV9fLGoscGFyZW50cyksZGF0YUxlbmd0aD1kYXRhLmxlbmd0aCxlbnRlckdyb3VwPWVudGVyW2pdPW5ldyBBcnJheShkYXRhTGVuZ3RoKSx1cGRhdGVHcm91cD11cGRhdGVbal09bmV3IEFycmF5KGRhdGFMZW5ndGgpLGV4aXRHcm91cD1leGl0W2pdPW5ldyBBcnJheShncm91cExlbmd0aCk7YmluZChwYXJlbnQsZ3JvdXAsZW50ZXJHcm91cCx1cGRhdGVHcm91cCxleGl0R3JvdXAsZGF0YSxrZXkpO2Zvcih2YXIgaTA9MCxpMT0wLHByZXZpb3VzLG5leHQ7aTA8ZGF0YUxlbmd0aDsrK2kwKXtpZihwcmV2aW91cz1lbnRlckdyb3VwW2kwXSl7aWYoaTA+PWkxKWkxPWkwKzE7d2hpbGUoIShuZXh0PXVwZGF0ZUdyb3VwW2kxXSkmJisraTE8ZGF0YUxlbmd0aCl7fXByZXZpb3VzLl9uZXh0PW5leHR8fG51bGx9fX11cGRhdGU9bmV3IFNlbGVjdGlvbih1cGRhdGUscGFyZW50cyk7dXBkYXRlLl9lbnRlcj1lbnRlcjt1cGRhdGUuX2V4aXQ9ZXhpdDtyZXR1cm4gdXBkYXRlfTt2YXIgc2VsZWN0aW9uX2V4aXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9leGl0fHx0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksdGhpcy5fcGFyZW50cyl9O3ZhciBzZWxlY3Rpb25fbWVyZ2U9ZnVuY3Rpb24oc2VsZWN0aW9uJCQxKXtmb3IodmFyIGdyb3VwczA9dGhpcy5fZ3JvdXBzLGdyb3VwczE9c2VsZWN0aW9uJCQxLl9ncm91cHMsbTA9Z3JvdXBzMC5sZW5ndGgsbTE9Z3JvdXBzMS5sZW5ndGgsbT1NYXRoLm1pbihtMCxtMSksbWVyZ2VzPW5ldyBBcnJheShtMCksaj0wO2o8bTsrK2ope2Zvcih2YXIgZ3JvdXAwPWdyb3VwczBbal0sZ3JvdXAxPWdyb3VwczFbal0sbj1ncm91cDAubGVuZ3RoLG1lcmdlPW1lcmdlc1tqXT1uZXcgQXJyYXkobiksbm9kZSxpPTA7aTxuOysraSl7aWYobm9kZT1ncm91cDBbaV18fGdyb3VwMVtpXSl7bWVyZ2VbaV09bm9kZX19fWZvcig7ajxtMDsrK2ope21lcmdlc1tqXT1ncm91cHMwW2pdfXJldHVybiBuZXcgU2VsZWN0aW9uKG1lcmdlcyx0aGlzLl9wYXJlbnRzKX07dmFyIHNlbGVjdGlvbl9vcmRlcj1mdW5jdGlvbigpe2Zvcih2YXIgZ3JvdXBzPXRoaXMuX2dyb3VwcyxqPS0xLG09Z3JvdXBzLmxlbmd0aDsrK2o8bTspe2Zvcih2YXIgZ3JvdXA9Z3JvdXBzW2pdLGk9Z3JvdXAubGVuZ3RoLTEsbmV4dD1ncm91cFtpXSxub2RlOy0taT49MDspe2lmKG5vZGU9Z3JvdXBbaV0pe2lmKG5leHQmJm5leHQhPT1ub2RlLm5leHRTaWJsaW5nKW5leHQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSxuZXh0KTtuZXh0PW5vZGV9fX1yZXR1cm4gdGhpc307dmFyIHNlbGVjdGlvbl9zb3J0PWZ1bmN0aW9uKGNvbXBhcmUpe2lmKCFjb21wYXJlKWNvbXBhcmU9YXNjZW5kaW5nJDI7ZnVuY3Rpb24gY29tcGFyZU5vZGUoYSxiKXtyZXR1cm4gYSYmYj9jb21wYXJlKGEuX19kYXRhX18sYi5fX2RhdGFfXyk6IWEtIWJ9Zm9yKHZhciBncm91cHM9dGhpcy5fZ3JvdXBzLG09Z3JvdXBzLmxlbmd0aCxzb3J0Z3JvdXBzPW5ldyBBcnJheShtKSxqPTA7ajxtOysrail7Zm9yKHZhciBncm91cD1ncm91cHNbal0sbj1ncm91cC5sZW5ndGgsc29ydGdyb3VwPXNvcnRncm91cHNbal09bmV3IEFycmF5KG4pLG5vZGUsaT0wO2k8bjsrK2kpe2lmKG5vZGU9Z3JvdXBbaV0pe3NvcnRncm91cFtpXT1ub2RlfX1zb3J0Z3JvdXAuc29ydChjb21wYXJlTm9kZSl9cmV0dXJuIG5ldyBTZWxlY3Rpb24oc29ydGdyb3Vwcyx0aGlzLl9wYXJlbnRzKS5vcmRlcigpfTtmdW5jdGlvbiBhc2NlbmRpbmckMihhLGIpe3JldHVybiBhPGI/LTE6YT5iPzE6YT49Yj8wOk5hTn12YXIgc2VsZWN0aW9uX2NhbGw9ZnVuY3Rpb24oKXt2YXIgY2FsbGJhY2s9YXJndW1lbnRzWzBdO2FyZ3VtZW50c1swXT10aGlzO2NhbGxiYWNrLmFwcGx5KG51bGwsYXJndW1lbnRzKTtyZXR1cm4gdGhpc307dmFyIHNlbGVjdGlvbl9ub2Rlcz1mdW5jdGlvbigpe3ZhciBub2Rlcz1uZXcgQXJyYXkodGhpcy5zaXplKCkpLGk9LTE7dGhpcy5lYWNoKGZ1bmN0aW9uKCl7bm9kZXNbKytpXT10aGlzfSk7cmV0dXJuIG5vZGVzfTt2YXIgc2VsZWN0aW9uX25vZGU9ZnVuY3Rpb24oKXtmb3IodmFyIGdyb3Vwcz10aGlzLl9ncm91cHMsaj0wLG09Z3JvdXBzLmxlbmd0aDtqPG07KytqKXtmb3IodmFyIGdyb3VwPWdyb3Vwc1tqXSxpPTAsbj1ncm91cC5sZW5ndGg7aTxuOysraSl7dmFyIG5vZGU9Z3JvdXBbaV07aWYobm9kZSlyZXR1cm4gbm9kZX19cmV0dXJuIG51bGx9O3ZhciBzZWxlY3Rpb25fc2l6ZT1mdW5jdGlvbigpe3ZhciBzaXplPTA7dGhpcy5lYWNoKGZ1bmN0aW9uKCl7KytzaXplfSk7cmV0dXJuIHNpemV9O3ZhciBzZWxlY3Rpb25fZW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5ub2RlKCl9O3ZhciBzZWxlY3Rpb25fZWFjaD1mdW5jdGlvbihjYWxsYmFjayl7Zm9yKHZhciBncm91cHM9dGhpcy5fZ3JvdXBzLGo9MCxtPWdyb3Vwcy5sZW5ndGg7ajxtOysrail7Zm9yKHZhciBncm91cD1ncm91cHNbal0saT0wLG49Z3JvdXAubGVuZ3RoLG5vZGU7aTxuOysraSl7aWYobm9kZT1ncm91cFtpXSljYWxsYmFjay5jYWxsKG5vZGUsbm9kZS5fX2RhdGFfXyxpLGdyb3VwKX19cmV0dXJuIHRoaXN9O2Z1bmN0aW9uIGF0dHJSZW1vdmUobmFtZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSl9fWZ1bmN0aW9uIGF0dHJSZW1vdmVOUyhmdWxsbmFtZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSxmdWxsbmFtZS5sb2NhbCl9fWZ1bmN0aW9uIGF0dHJDb25zdGFudChuYW1lLHZhbHVlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZShuYW1lLHZhbHVlKX19ZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMoZnVsbG5hbWUsdmFsdWUpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsZnVsbG5hbWUubG9jYWwsdmFsdWUpfX1mdW5jdGlvbiBhdHRyRnVuY3Rpb24obmFtZSx2YWx1ZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHY9dmFsdWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKHY9PW51bGwpdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7ZWxzZSB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLHYpfX1mdW5jdGlvbiBhdHRyRnVuY3Rpb25OUyhmdWxsbmFtZSx2YWx1ZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHY9dmFsdWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKHY9PW51bGwpdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSxmdWxsbmFtZS5sb2NhbCk7ZWxzZSB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLGZ1bGxuYW1lLmxvY2FsLHYpfX12YXIgc2VsZWN0aW9uX2F0dHI9ZnVuY3Rpb24obmFtZSx2YWx1ZSl7dmFyIGZ1bGxuYW1lPW5hbWVzcGFjZShuYW1lKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciBub2RlPXRoaXMubm9kZSgpO3JldHVybiBmdWxsbmFtZS5sb2NhbD9ub2RlLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLGZ1bGxuYW1lLmxvY2FsKTpub2RlLmdldEF0dHJpYnV0ZShmdWxsbmFtZSl9cmV0dXJuIHRoaXMuZWFjaCgodmFsdWU9PW51bGw/ZnVsbG5hbWUubG9jYWw/YXR0clJlbW92ZU5TOmF0dHJSZW1vdmU6dHlwZW9mIHZhbHVlPT09ImZ1bmN0aW9uIj9mdWxsbmFtZS5sb2NhbD9hdHRyRnVuY3Rpb25OUzphdHRyRnVuY3Rpb246ZnVsbG5hbWUubG9jYWw/YXR0ckNvbnN0YW50TlM6YXR0ckNvbnN0YW50KShmdWxsbmFtZSx2YWx1ZSkpfTt2YXIgd2luZG93JDE9ZnVuY3Rpb24obm9kZSl7cmV0dXJuIG5vZGUub3duZXJEb2N1bWVudCYmbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fHxub2RlLmRvY3VtZW50JiZub2RlfHxub2RlLmRlZmF1bHRWaWV3fTtmdW5jdGlvbiBzdHlsZVJlbW92ZShuYW1lKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpfX1mdW5jdGlvbiBzdHlsZUNvbnN0YW50KG5hbWUsdmFsdWUscHJpb3JpdHkpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSx2YWx1ZSxwcmlvcml0eSl9fWZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24obmFtZSx2YWx1ZSxwcmlvcml0eSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHY9dmFsdWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKHY9PW51bGwpdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtlbHNlIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSx2LHByaW9yaXR5KX19dmFyIHNlbGVjdGlvbl9zdHlsZT1mdW5jdGlvbihuYW1lLHZhbHVlLHByaW9yaXR5KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgodmFsdWU9PW51bGw/c3R5bGVSZW1vdmU6dHlwZW9mIHZhbHVlPT09ImZ1bmN0aW9uIj9zdHlsZUZ1bmN0aW9uOnN0eWxlQ29uc3RhbnQpKG5hbWUsdmFsdWUscHJpb3JpdHk9PW51bGw/IiI6cHJpb3JpdHkpKTpzdHlsZVZhbHVlKHRoaXMubm9kZSgpLG5hbWUpfTtmdW5jdGlvbiBzdHlsZVZhbHVlKG5vZGUsbmFtZSl7cmV0dXJuIG5vZGUuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKXx8d2luZG93JDEobm9kZSkuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLG51bGwpLmdldFByb3BlcnR5VmFsdWUobmFtZSl9ZnVuY3Rpb24gcHJvcGVydHlSZW1vdmUobmFtZSl7cmV0dXJuIGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbbmFtZV19fWZ1bmN0aW9uIHByb3BlcnR5Q29uc3RhbnQobmFtZSx2YWx1ZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpc1tuYW1lXT12YWx1ZX19ZnVuY3Rpb24gcHJvcGVydHlGdW5jdGlvbihuYW1lLHZhbHVlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdj12YWx1ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYodj09bnVsbClkZWxldGUgdGhpc1tuYW1lXTtlbHNlIHRoaXNbbmFtZV09dn19dmFyIHNlbGVjdGlvbl9wcm9wZXJ0eT1mdW5jdGlvbihuYW1lLHZhbHVlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgodmFsdWU9PW51bGw/cHJvcGVydHlSZW1vdmU6dHlwZW9mIHZhbHVlPT09ImZ1bmN0aW9uIj9wcm9wZXJ0eUZ1bmN0aW9uOnByb3BlcnR5Q29uc3RhbnQpKG5hbWUsdmFsdWUpKTp0aGlzLm5vZGUoKVtuYW1lXX07ZnVuY3Rpb24gY2xhc3NBcnJheShzdHJpbmcpe3JldHVybiBzdHJpbmcudHJpbSgpLnNwbGl0KC9efFxzKy8pfWZ1bmN0aW9uIGNsYXNzTGlzdChub2RlKXtyZXR1cm4gbm9kZS5jbGFzc0xpc3R8fG5ldyBDbGFzc0xpc3Qobm9kZSl9ZnVuY3Rpb24gQ2xhc3NMaXN0KG5vZGUpe3RoaXMuX25vZGU9bm9kZTt0aGlzLl9uYW1lcz1jbGFzc0FycmF5KG5vZGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9Q2xhc3NMaXN0LnByb3RvdHlwZT17YWRkOmZ1bmN0aW9uIGFkZChuYW1lKXt2YXIgaT10aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpO2lmKGk8MCl7dGhpcy5fbmFtZXMucHVzaChuYW1lKTt0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSl9fSxyZW1vdmU6ZnVuY3Rpb24gcmVtb3ZlKG5hbWUpe3ZhciBpPXRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7aWYoaT49MCl7dGhpcy5fbmFtZXMuc3BsaWNlKGksMSk7dGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpfX0sY29udGFpbnM6ZnVuY3Rpb24gY29udGFpbnMobmFtZSl7cmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk+PTB9fTtmdW5jdGlvbiBjbGFzc2VkQWRkKG5vZGUsbmFtZXMpe3ZhciBsaXN0PWNsYXNzTGlzdChub2RlKSxpPS0xLG49bmFtZXMubGVuZ3RoO3doaWxlKCsraTxuKXtsaXN0LmFkZChuYW1lc1tpXSl9fWZ1bmN0aW9uIGNsYXNzZWRSZW1vdmUobm9kZSxuYW1lcyl7dmFyIGxpc3Q9Y2xhc3NMaXN0KG5vZGUpLGk9LTEsbj1uYW1lcy5sZW5ndGg7d2hpbGUoKytpPG4pe2xpc3QucmVtb3ZlKG5hbWVzW2ldKX19ZnVuY3Rpb24gY2xhc3NlZFRydWUobmFtZXMpe3JldHVybiBmdW5jdGlvbigpe2NsYXNzZWRBZGQodGhpcyxuYW1lcyl9fWZ1bmN0aW9uIGNsYXNzZWRGYWxzZShuYW1lcyl7cmV0dXJuIGZ1bmN0aW9uKCl7Y2xhc3NlZFJlbW92ZSh0aGlzLG5hbWVzKX19ZnVuY3Rpb24gY2xhc3NlZEZ1bmN0aW9uKG5hbWVzLHZhbHVlKXtyZXR1cm4gZnVuY3Rpb24oKXsodmFsdWUuYXBwbHkodGhpcyxhcmd1bWVudHMpP2NsYXNzZWRBZGQ6Y2xhc3NlZFJlbW92ZSkodGhpcyxuYW1lcyl9fXZhciBzZWxlY3Rpb25fY2xhc3NlZD1mdW5jdGlvbihuYW1lLHZhbHVlKXt2YXIgbmFtZXM9Y2xhc3NBcnJheShuYW1lKyIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciBsaXN0PWNsYXNzTGlzdCh0aGlzLm5vZGUoKSksaT0tMSxuPW5hbWVzLmxlbmd0aDt3aGlsZSgrK2k8bil7aWYoIWxpc3QuY29udGFpbnMobmFtZXNbaV0pKXJldHVybiBmYWxzZX1yZXR1cm4gdHJ1ZX1yZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWU9PT0iZnVuY3Rpb24iP2NsYXNzZWRGdW5jdGlvbjp2YWx1ZT9jbGFzc2VkVHJ1ZTpjbGFzc2VkRmFsc2UpKG5hbWVzLHZhbHVlKSl9O2Z1bmN0aW9uIHRleHRSZW1vdmUoKXt0aGlzLnRleHRDb250ZW50PSIifWZ1bmN0aW9uIHRleHRDb25zdGFudCh2YWx1ZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD12YWx1ZX19ZnVuY3Rpb24gdGV4dEZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdj12YWx1ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy50ZXh0Q29udGVudD12PT1udWxsPyIiOnZ9fXZhciBzZWxlY3Rpb25fdGV4dD1mdW5jdGlvbih2YWx1ZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKHZhbHVlPT1udWxsP3RleHRSZW1vdmU6KHR5cGVvZiB2YWx1ZT09PSJmdW5jdGlvbiI/dGV4dEZ1bmN0aW9uOnRleHRDb25zdGFudCkodmFsdWUpKTp0aGlzLm5vZGUoKS50ZXh0Q29udGVudH07ZnVuY3Rpb24gaHRtbFJlbW92ZSgpe3RoaXMuaW5uZXJIVE1MPSIifWZ1bmN0aW9uIGh0bWxDb25zdGFudCh2YWx1ZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9dmFsdWV9fWZ1bmN0aW9uIGh0bWxGdW5jdGlvbih2YWx1ZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHY9dmFsdWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaW5uZXJIVE1MPXY9PW51bGw/IiI6dn19dmFyIHNlbGVjdGlvbl9odG1sPWZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2godmFsdWU9PW51bGw/aHRtbFJlbW92ZToodHlwZW9mIHZhbHVlPT09ImZ1bmN0aW9uIj9odG1sRnVuY3Rpb246aHRtbENvbnN0YW50KSh2YWx1ZSkpOnRoaXMubm9kZSgpLmlubmVySFRNTH07ZnVuY3Rpb24gcmFpc2UoKXtpZih0aGlzLm5leHRTaWJsaW5nKXRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzKX12YXIgc2VsZWN0aW9uX3JhaXNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChyYWlzZSl9O2Z1bmN0aW9uIGxvd2VyKCl7aWYodGhpcy5wcmV2aW91c1NpYmxpbmcpdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKX12YXIgc2VsZWN0aW9uX2xvd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChsb3dlcil9O3ZhciBzZWxlY3Rpb25fYXBwZW5kPWZ1bmN0aW9uKG5hbWUpe3ZhciBjcmVhdGU9dHlwZW9mIG5hbWU9PT0iZnVuY3Rpb24iP25hbWU6Y3JlYXRvcihuYW1lKTtyZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChjcmVhdGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0pfTtmdW5jdGlvbiBjb25zdGFudE51bGwoKXtyZXR1cm4gbnVsbH12YXIgc2VsZWN0aW9uX2luc2VydD1mdW5jdGlvbihuYW1lLGJlZm9yZSl7dmFyIGNyZWF0ZT10eXBlb2YgbmFtZT09PSJmdW5jdGlvbiI/bmFtZTpjcmVhdG9yKG5hbWUpLHNlbGVjdD1iZWZvcmU9PW51bGw/Y29uc3RhbnROdWxsOnR5cGVvZiBiZWZvcmU9PT0iZnVuY3Rpb24iP2JlZm9yZTpzZWxlY3RvcihiZWZvcmUpO3JldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpe3JldHVybiB0aGlzLmluc2VydEJlZm9yZShjcmVhdGUuYXBwbHkodGhpcyxhcmd1bWVudHMpLHNlbGVjdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fG51bGwpfSl9O2Z1bmN0aW9uIHJlbW92ZSgpe3ZhciBwYXJlbnQ9dGhpcy5wYXJlbnROb2RlO2lmKHBhcmVudClwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyl9dmFyIHNlbGVjdGlvbl9yZW1vdmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKHJlbW92ZSl9O3ZhciBzZWxlY3Rpb25fZGF0dW09ZnVuY3Rpb24odmFsdWUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMucHJvcGVydHkoIl9fZGF0YV9fIix2YWx1ZSk6dGhpcy5ub2RlKCkuX19kYXRhX199O2Z1bmN0aW9uIGRpc3BhdGNoRXZlbnQobm9kZSx0eXBlLHBhcmFtcyl7dmFyIHdpbmRvdz13aW5kb3ckMShub2RlKSxldmVudD13aW5kb3cuQ3VzdG9tRXZlbnQ7aWYodHlwZW9mIGV2ZW50PT09ImZ1bmN0aW9uIil7ZXZlbnQ9bmV3IGV2ZW50KHR5cGUscGFyYW1zKX1lbHNle2V2ZW50PXdpbmRvdy5kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTtpZihwYXJhbXMpZXZlbnQuaW5pdEV2ZW50KHR5cGUscGFyYW1zLmJ1YmJsZXMscGFyYW1zLmNhbmNlbGFibGUpLGV2ZW50LmRldGFpbD1wYXJhbXMuZGV0YWlsO2Vsc2UgZXZlbnQuaW5pdEV2ZW50KHR5cGUsZmFsc2UsZmFsc2UpfW5vZGUuZGlzcGF0Y2hFdmVudChldmVudCl9ZnVuY3Rpb24gZGlzcGF0Y2hDb25zdGFudCh0eXBlLHBhcmFtcyl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGRpc3BhdGNoRXZlbnQodGhpcyx0eXBlLHBhcmFtcyl9fWZ1bmN0aW9uIGRpc3BhdGNoRnVuY3Rpb24odHlwZSxwYXJhbXMpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsdHlwZSxwYXJhbXMuYXBwbHkodGhpcyxhcmd1bWVudHMpKX19dmFyIHNlbGVjdGlvbl9kaXNwYXRjaD1mdW5jdGlvbih0eXBlLHBhcmFtcyl7cmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHBhcmFtcz09PSJmdW5jdGlvbiI/ZGlzcGF0Y2hGdW5jdGlvbjpkaXNwYXRjaENvbnN0YW50KSh0eXBlLHBhcmFtcykpfTt2YXIgcm9vdCQyPVtudWxsXTtmdW5jdGlvbiBTZWxlY3Rpb24oZ3JvdXBzLHBhcmVudHMpe3RoaXMuX2dyb3Vwcz1ncm91cHM7dGhpcy5fcGFyZW50cz1wYXJlbnRzfWZ1bmN0aW9uIHNlbGVjdGlvbigpe3JldHVybiBuZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XV0scm9vdCQyKX1TZWxlY3Rpb24ucHJvdG90eXBlPXNlbGVjdGlvbi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlNlbGVjdGlvbixzZWxlY3Q6c2VsZWN0aW9uX3NlbGVjdCxzZWxlY3RBbGw6c2VsZWN0aW9uX3NlbGVjdEFsbCxmaWx0ZXI6c2VsZWN0aW9uX2ZpbHRlcixkYXRhOnNlbGVjdGlvbl9kYXRhLGVudGVyOnNlbGVjdGlvbl9lbnRlcixleGl0OnNlbGVjdGlvbl9leGl0LG1lcmdlOnNlbGVjdGlvbl9tZXJnZSxvcmRlcjpzZWxlY3Rpb25fb3JkZXIsc29ydDpzZWxlY3Rpb25fc29ydCxjYWxsOnNlbGVjdGlvbl9jYWxsLG5vZGVzOnNlbGVjdGlvbl9ub2Rlcyxub2RlOnNlbGVjdGlvbl9ub2RlLHNpemU6c2VsZWN0aW9uX3NpemUsZW1wdHk6c2VsZWN0aW9uX2VtcHR5LGVhY2g6c2VsZWN0aW9uX2VhY2gsYXR0cjpzZWxlY3Rpb25fYXR0cixzdHlsZTpzZWxlY3Rpb25fc3R5bGUscHJvcGVydHk6c2VsZWN0aW9uX3Byb3BlcnR5LGNsYXNzZWQ6c2VsZWN0aW9uX2NsYXNzZWQsdGV4dDpzZWxlY3Rpb25fdGV4dCxodG1sOnNlbGVjdGlvbl9odG1sLHJhaXNlOnNlbGVjdGlvbl9yYWlzZSxsb3dlcjpzZWxlY3Rpb25fbG93ZXIsYXBwZW5kOnNlbGVjdGlvbl9hcHBlbmQsaW5zZXJ0OnNlbGVjdGlvbl9pbnNlcnQscmVtb3ZlOnNlbGVjdGlvbl9yZW1vdmUsZGF0dW06c2VsZWN0aW9uX2RhdHVtLG9uOnNlbGVjdGlvbl9vbixkaXNwYXRjaDpzZWxlY3Rpb25fZGlzcGF0Y2h9O3ZhciBzZWxlY3Q9ZnVuY3Rpb24oc2VsZWN0b3Ipe3JldHVybiB0eXBlb2Ygc2VsZWN0b3I9PT0ic3RyaW5nIj9uZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcildXSxbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSk6bmV3IFNlbGVjdGlvbihbW3NlbGVjdG9yXV0scm9vdCQyKX07dmFyIHNlbGVjdEFsbD1mdW5jdGlvbihzZWxlY3Rvcil7cmV0dXJuIHR5cGVvZiBzZWxlY3Rvcj09PSJzdHJpbmciP25ldyBTZWxlY3Rpb24oW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXSxbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSk6bmV3IFNlbGVjdGlvbihbc2VsZWN0b3I9PW51bGw/W106c2VsZWN0b3JdLHJvb3QkMil9O3ZhciB0b3VjaD1mdW5jdGlvbihub2RlLHRvdWNoZXMsaWRlbnRpZmllcil7aWYoYXJndW1lbnRzLmxlbmd0aDwzKWlkZW50aWZpZXI9dG91Y2hlcyx0b3VjaGVzPXNvdXJjZUV2ZW50KCkuY2hhbmdlZFRvdWNoZXM7Zm9yKHZhciBpPTAsbj10b3VjaGVzP3RvdWNoZXMubGVuZ3RoOjAsdG91Y2g7aTxuOysraSl7aWYoKHRvdWNoPXRvdWNoZXNbaV0pLmlkZW50aWZpZXI9PT1pZGVudGlmaWVyKXtyZXR1cm4gcG9pbnQobm9kZSx0b3VjaCl9fXJldHVybiBudWxsfTt2YXIgdG91Y2hlcz1mdW5jdGlvbihub2RlLHRvdWNoZXMpe2lmKHRvdWNoZXM9PW51bGwpdG91Y2hlcz1zb3VyY2VFdmVudCgpLnRvdWNoZXM7Zm9yKHZhciBpPTAsbj10b3VjaGVzP3RvdWNoZXMubGVuZ3RoOjAscG9pbnRzPW5ldyBBcnJheShuKTtpPG47KytpKXtwb2ludHNbaV09cG9pbnQobm9kZSx0b3VjaGVzW2ldKX1yZXR1cm4gcG9pbnRzfTt2YXIgZDNTZWxlY3Rpb249T2JqZWN0LmZyZWV6ZSh7Y3JlYXRvcjpjcmVhdG9yLGxvY2FsOmxvY2FsLG1hdGNoZXI6bWF0Y2hlciQxLG1vdXNlOm1vdXNlLG5hbWVzcGFjZTpuYW1lc3BhY2UsbmFtZXNwYWNlczpuYW1lc3BhY2VzLHNlbGVjdDpzZWxlY3Qsc2VsZWN0QWxsOnNlbGVjdEFsbCxzZWxlY3Rpb246c2VsZWN0aW9uLHNlbGVjdG9yOnNlbGVjdG9yLHNlbGVjdG9yQWxsOnNlbGVjdG9yQWxsLHN0eWxlOnN0eWxlVmFsdWUsdG91Y2g6dG91Y2gsdG91Y2hlczp0b3VjaGVzLHdpbmRvdzp3aW5kb3ckMSxnZXQgZXZlbnQoKXtyZXR1cm4gZXZlbnR9LGN1c3RvbUV2ZW50OmN1c3RvbUV2ZW50fSk7dmFyIGVtcHR5T249ZGlzcGF0Y2goInN0YXJ0IiwiZW5kIiwiaW50ZXJydXB0Iik7dmFyIGVtcHR5VHdlZW49W107dmFyIENSRUFURUQ9MDt2YXIgU0NIRURVTEVEPTE7dmFyIFNUQVJUSU5HPTI7dmFyIFNUQVJURUQ9Mzt2YXIgUlVOTklORz00O3ZhciBFTkRJTkc9NTt2YXIgRU5ERUQ9Njt2YXIgc2NoZWR1bGU9ZnVuY3Rpb24obm9kZSxuYW1lLGlkLGluZGV4LGdyb3VwLHRpbWluZyl7dmFyIHNjaGVkdWxlcz1ub2RlLl9fdHJhbnNpdGlvbjtpZighc2NoZWR1bGVzKW5vZGUuX190cmFuc2l0aW9uPXt9O2Vsc2UgaWYoaWQgaW4gc2NoZWR1bGVzKXJldHVybjtjcmVhdGUobm9kZSxpZCx7bmFtZTpuYW1lLGluZGV4OmluZGV4LGdyb3VwOmdyb3VwLG9uOmVtcHR5T24sdHdlZW46ZW1wdHlUd2Vlbix0aW1lOnRpbWluZy50aW1lLGRlbGF5OnRpbWluZy5kZWxheSxkdXJhdGlvbjp0aW1pbmcuZHVyYXRpb24sZWFzZTp0aW1pbmcuZWFzZSx0aW1lcjpudWxsLHN0YXRlOkNSRUFURUR9KX07ZnVuY3Rpb24gaW5pdChub2RlLGlkKXt2YXIgc2NoZWR1bGU9bm9kZS5fX3RyYW5zaXRpb247aWYoIXNjaGVkdWxlfHwhKHNjaGVkdWxlPXNjaGVkdWxlW2lkXSl8fHNjaGVkdWxlLnN0YXRlPkNSRUFURUQpdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZSIpO3JldHVybiBzY2hlZHVsZX1mdW5jdGlvbiBzZXQkNChub2RlLGlkKXt2YXIgc2NoZWR1bGU9bm9kZS5fX3RyYW5zaXRpb247aWYoIXNjaGVkdWxlfHwhKHNjaGVkdWxlPXNjaGVkdWxlW2lkXSl8fHNjaGVkdWxlLnN0YXRlPlNUQVJUSU5HKXRocm93IG5ldyBFcnJvcigidG9vIGxhdGUiKTtyZXR1cm4gc2NoZWR1bGV9ZnVuY3Rpb24gZ2V0JDIobm9kZSxpZCl7dmFyIHNjaGVkdWxlPW5vZGUuX190cmFuc2l0aW9uO2lmKCFzY2hlZHVsZXx8IShzY2hlZHVsZT1zY2hlZHVsZVtpZF0pKXRocm93IG5ldyBFcnJvcigidG9vIGxhdGUiKTtyZXR1cm4gc2NoZWR1bGV9ZnVuY3Rpb24gY3JlYXRlKG5vZGUsaWQsc2VsZil7dmFyIHNjaGVkdWxlcz1ub2RlLl9fdHJhbnNpdGlvbix0d2VlbjtzY2hlZHVsZXNbaWRdPXNlbGY7c2VsZi50aW1lcj10aW1lcihzY2hlZHVsZSwwLHNlbGYudGltZSk7ZnVuY3Rpb24gc2NoZWR1bGUoZWxhcHNlZCl7c2VsZi5zdGF0ZT1TQ0hFRFVMRUQ7c2VsZi50aW1lci5yZXN0YXJ0KHN0YXJ0LHNlbGYuZGVsYXksc2VsZi50aW1lKTtpZihzZWxmLmRlbGF5PD1lbGFwc2VkKXN0YXJ0KGVsYXBzZWQtc2VsZi5kZWxheSl9ZnVuY3Rpb24gc3RhcnQoZWxhcHNlZCl7dmFyIGksaixuLG87aWYoc2VsZi5zdGF0ZSE9PVNDSEVEVUxFRClyZXR1cm4gc3RvcCgpO2ZvcihpIGluIHNjaGVkdWxlcyl7bz1zY2hlZHVsZXNbaV07aWYoby5uYW1lIT09c2VsZi5uYW1lKWNvbnRpbnVlO2lmKG8uc3RhdGU9PT1TVEFSVEVEKXJldHVybiB0aW1lb3V0JDEoc3RhcnQpO2lmKG8uc3RhdGU9PT1SVU5OSU5HKXtvLnN0YXRlPUVOREVEO28udGltZXIuc3RvcCgpO28ub24uY2FsbCgiaW50ZXJydXB0Iixub2RlLG5vZGUuX19kYXRhX18sby5pbmRleCxvLmdyb3VwKTtkZWxldGUgc2NoZWR1bGVzW2ldfWVsc2UgaWYoK2k8aWQpe28uc3RhdGU9RU5ERUQ7by50aW1lci5zdG9wKCk7ZGVsZXRlIHNjaGVkdWxlc1tpXX19dGltZW91dCQxKGZ1bmN0aW9uKCl7aWYoc2VsZi5zdGF0ZT09PVNUQVJURUQpe3NlbGYuc3RhdGU9UlVOTklORztzZWxmLnRpbWVyLnJlc3RhcnQodGljayxzZWxmLmRlbGF5LHNlbGYudGltZSk7dGljayhlbGFwc2VkKX19KTtzZWxmLnN0YXRlPVNUQVJUSU5HO3NlbGYub24uY2FsbCgic3RhcnQiLG5vZGUsbm9kZS5fX2RhdGFfXyxzZWxmLmluZGV4LHNlbGYuZ3JvdXApO2lmKHNlbGYuc3RhdGUhPT1TVEFSVElORylyZXR1cm47c2VsZi5zdGF0ZT1TVEFSVEVEO3R3ZWVuPW5ldyBBcnJheShuPXNlbGYudHdlZW4ubGVuZ3RoKTtmb3IoaT0wLGo9LTE7aTxuOysraSl7aWYobz1zZWxmLnR3ZWVuW2ldLnZhbHVlLmNhbGwobm9kZSxub2RlLl9fZGF0YV9fLHNlbGYuaW5kZXgsc2VsZi5ncm91cCkpe3R3ZWVuWysral09b319dHdlZW4ubGVuZ3RoPWorMX1mdW5jdGlvbiB0aWNrKGVsYXBzZWQpe3ZhciB0PWVsYXBzZWQ8c2VsZi5kdXJhdGlvbj9zZWxmLmVhc2UuY2FsbChudWxsLGVsYXBzZWQvc2VsZi5kdXJhdGlvbik6KHNlbGYudGltZXIucmVzdGFydChzdG9wKSxzZWxmLnN0YXRlPUVORElORywxKSxpPS0xLG49dHdlZW4ubGVuZ3RoO3doaWxlKCsraTxuKXt0d2VlbltpXS5jYWxsKG51bGwsdCl9aWYoc2VsZi5zdGF0ZT09PUVORElORyl7c2VsZi5vbi5jYWxsKCJlbmQiLG5vZGUsbm9kZS5fX2RhdGFfXyxzZWxmLmluZGV4LHNlbGYuZ3JvdXApO3N0b3AoKX19ZnVuY3Rpb24gc3RvcCgpe3NlbGYuc3RhdGU9RU5ERUQ7c2VsZi50aW1lci5zdG9wKCk7ZGVsZXRlIHNjaGVkdWxlc1tpZF07Zm9yKHZhciBpIGluIHNjaGVkdWxlcyl7cmV0dXJufWRlbGV0ZSBub2RlLl9fdHJhbnNpdGlvbn19dmFyIGludGVycnVwdD1mdW5jdGlvbihub2RlLG5hbWUpe3ZhciBzY2hlZHVsZXM9bm9kZS5fX3RyYW5zaXRpb24sc2NoZWR1bGUkJDEsYWN0aXZlLGVtcHR5PXRydWUsaTtpZighc2NoZWR1bGVzKXJldHVybjtuYW1lPW5hbWU9PW51bGw/bnVsbDpuYW1lKyIiO2ZvcihpIGluIHNjaGVkdWxlcyl7aWYoKHNjaGVkdWxlJCQxPXNjaGVkdWxlc1tpXSkubmFtZSE9PW5hbWUpe2VtcHR5PWZhbHNlO2NvbnRpbnVlfWFjdGl2ZT1zY2hlZHVsZSQkMS5zdGF0ZT5TVEFSVElORyYmc2NoZWR1bGUkJDEuc3RhdGU8RU5ESU5HO3NjaGVkdWxlJCQxLnN0YXRlPUVOREVEO3NjaGVkdWxlJCQxLnRpbWVyLnN0b3AoKTtpZihhY3RpdmUpc2NoZWR1bGUkJDEub24uY2FsbCgiaW50ZXJydXB0Iixub2RlLG5vZGUuX19kYXRhX18sc2NoZWR1bGUkJDEuaW5kZXgsc2NoZWR1bGUkJDEuZ3JvdXApO2RlbGV0ZSBzY2hlZHVsZXNbaV19aWYoZW1wdHkpZGVsZXRlIG5vZGUuX190cmFuc2l0aW9ufTt2YXIgc2VsZWN0aW9uX2ludGVycnVwdD1mdW5jdGlvbihuYW1lKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7aW50ZXJydXB0KHRoaXMsbmFtZSl9KX07dmFyIGRlZmluZT1mdW5jdGlvbihjb25zdHJ1Y3RvcixmYWN0b3J5LHByb3RvdHlwZSl7Y29uc3RydWN0b3IucHJvdG90eXBlPWZhY3RvcnkucHJvdG90eXBlPXByb3RvdHlwZTtwcm90b3R5cGUuY29uc3RydWN0b3I9Y29uc3RydWN0b3J9O2Z1bmN0aW9uIGV4dGVuZChwYXJlbnQsZGVmaW5pdGlvbil7dmFyIHByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHBhcmVudC5wcm90b3R5cGUpO2Zvcih2YXIga2V5IGluIGRlZmluaXRpb24pe3Byb3RvdHlwZVtrZXldPWRlZmluaXRpb25ba2V5XX1yZXR1cm4gcHJvdG90eXBlfWZ1bmN0aW9uIENvbG9yKCl7fXZhciBfZGFya2VyPS43O3ZhciBfYnJpZ2h0ZXI9MS9fZGFya2VyO3ZhciByZUk9IlxccyooWystXT9cXGQrKVxccyoiO3ZhciByZU49IlxccyooWystXT9cXGQqXFwuP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pXFxzKiI7dmFyIHJlUD0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiI7dmFyIHJlSGV4Mz0vXiMoWzAtOWEtZl17M30pJC87dmFyIHJlSGV4Nj0vXiMoWzAtOWEtZl17Nn0pJC87dmFyIHJlUmdiSW50ZWdlcj1uZXcgUmVnRXhwKCJecmdiXFwoIitbcmVJLHJlSSxyZUldKyJcXCkkIik7dmFyIHJlUmdiUGVyY2VudD1uZXcgUmVnRXhwKCJecmdiXFwoIitbcmVQLHJlUCxyZVBdKyJcXCkkIik7dmFyIHJlUmdiYUludGVnZXI9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tyZUkscmVJLHJlSSxyZU5dKyJcXCkkIik7dmFyIHJlUmdiYVBlcmNlbnQ9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tyZVAscmVQLHJlUCxyZU5dKyJcXCkkIik7dmFyIHJlSHNsUGVyY2VudD1uZXcgUmVnRXhwKCJeaHNsXFwoIitbcmVOLHJlUCxyZVBdKyJcXCkkIik7dmFyIHJlSHNsYVBlcmNlbnQ9bmV3IFJlZ0V4cCgiXmhzbGFcXCgiK1tyZU4scmVQLHJlUCxyZU5dKyJcXCkkIik7dmFyIG5hbWVkPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9O2RlZmluZShDb2xvcixjb2xvcix7ZGlzcGxheWFibGU6ZnVuY3Rpb24gZGlzcGxheWFibGUoKXtyZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpfSx0b1N0cmluZzpmdW5jdGlvbiB0b1N0cmluZygpe3JldHVybiB0aGlzLnJnYigpKyIifX0pO2Z1bmN0aW9uIGNvbG9yKGZvcm1hdCl7dmFyIG07Zm9ybWF0PShmb3JtYXQrIiIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO3JldHVybihtPXJlSGV4My5leGVjKGZvcm1hdCkpPyhtPXBhcnNlSW50KG1bMV0sMTYpLG5ldyBSZ2IobT4+OCYxNXxtPj40JjI0MCxtPj40JjE1fG0mMjQwLChtJjE1KTw8NHxtJjE1LDEpKToobT1yZUhleDYuZXhlYyhmb3JtYXQpKT9yZ2JuKHBhcnNlSW50KG1bMV0sMTYpKToobT1yZVJnYkludGVnZXIuZXhlYyhmb3JtYXQpKT9uZXcgUmdiKG1bMV0sbVsyXSxtWzNdLDEpOihtPXJlUmdiUGVyY2VudC5leGVjKGZvcm1hdCkpP25ldyBSZ2IobVsxXSoyNTUvMTAwLG1bMl0qMjU1LzEwMCxtWzNdKjI1NS8xMDAsMSk6KG09cmVSZ2JhSW50ZWdlci5leGVjKGZvcm1hdCkpP3JnYmEobVsxXSxtWzJdLG1bM10sbVs0XSk6KG09cmVSZ2JhUGVyY2VudC5leGVjKGZvcm1hdCkpP3JnYmEobVsxXSoyNTUvMTAwLG1bMl0qMjU1LzEwMCxtWzNdKjI1NS8xMDAsbVs0XSk6KG09cmVIc2xQZXJjZW50LmV4ZWMoZm9ybWF0KSk/aHNsYShtWzFdLG1bMl0vMTAwLG1bM10vMTAwLDEpOihtPXJlSHNsYVBlcmNlbnQuZXhlYyhmb3JtYXQpKT9oc2xhKG1bMV0sbVsyXS8xMDAsbVszXS8xMDAsbVs0XSk6bmFtZWQuaGFzT3duUHJvcGVydHkoZm9ybWF0KT9yZ2JuKG5hbWVkW2Zvcm1hdF0pOmZvcm1hdD09PSJ0cmFuc3BhcmVudCI/bmV3IFJnYihOYU4sTmFOLE5hTiwwKTpudWxsfWZ1bmN0aW9uIHJnYm4obil7cmV0dXJuIG5ldyBSZ2Iobj4+MTYmMjU1LG4+PjgmMjU1LG4mMjU1LDEpfWZ1bmN0aW9uIHJnYmEocixnLGIsYSl7aWYoYTw9MClyPWc9Yj1OYU47cmV0dXJuIG5ldyBSZ2IocixnLGIsYSl9ZnVuY3Rpb24gcmdiQ29udmVydChvKXtpZighKG8gaW5zdGFuY2VvZiBDb2xvcikpbz1jb2xvcihvKTtpZighbylyZXR1cm4gbmV3IFJnYjtvPW8ucmdiKCk7cmV0dXJuIG5ldyBSZ2Ioby5yLG8uZyxvLmIsby5vcGFjaXR5KX1mdW5jdGlvbiByZ2IocixnLGIsb3BhY2l0eSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0xP3JnYkNvbnZlcnQocik6bmV3IFJnYihyLGcsYixvcGFjaXR5PT1udWxsPzE6b3BhY2l0eSl9ZnVuY3Rpb24gUmdiKHIsZyxiLG9wYWNpdHkpe3RoaXMucj0rcjt0aGlzLmc9K2c7dGhpcy5iPStiO3RoaXMub3BhY2l0eT0rb3BhY2l0eX1kZWZpbmUoUmdiLHJnYixleHRlbmQoQ29sb3Ise2JyaWdodGVyOmZ1bmN0aW9uIGJyaWdodGVyKGspe2s9az09bnVsbD9fYnJpZ2h0ZXI6TWF0aC5wb3coX2JyaWdodGVyLGspO3JldHVybiBuZXcgUmdiKHRoaXMuciprLHRoaXMuZyprLHRoaXMuYiprLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbiBkYXJrZXIoayl7az1rPT1udWxsP19kYXJrZXI6TWF0aC5wb3coX2RhcmtlcixrKTtyZXR1cm4gbmV3IFJnYih0aGlzLnIqayx0aGlzLmcqayx0aGlzLmIqayx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24gcmdiKCl7cmV0dXJuIHRoaXN9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uIGRpc3BsYXlhYmxlKCl7cmV0dXJuIDA8PXRoaXMuciYmdGhpcy5yPD0yNTUmJjA8PXRoaXMuZyYmdGhpcy5nPD0yNTUmJjA8PXRoaXMuYiYmdGhpcy5iPD0yNTUmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSx0b1N0cmluZzpmdW5jdGlvbiB0b1N0cmluZygpe3ZhciBhPXRoaXMub3BhY2l0eTthPWlzTmFOKGEpPzE6TWF0aC5tYXgoMCxNYXRoLm1pbigxLGEpKTtyZXR1cm4oYT09PTE/InJnYigiOiJyZ2JhKCIpK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5yKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmcpfHwwKSkrIiwgIitNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMuYil8fDApKSsoYT09PTE/IikiOiIsICIrYSsiKSIpfX0pKTtmdW5jdGlvbiBoc2xhKGgscyxsLGEpe2lmKGE8PTApaD1zPWw9TmFOO2Vsc2UgaWYobDw9MHx8bD49MSloPXM9TmFOO2Vsc2UgaWYoczw9MCloPU5hTjtyZXR1cm4gbmV3IEhzbChoLHMsbCxhKX1mdW5jdGlvbiBoc2xDb252ZXJ0KG8pe2lmKG8gaW5zdGFuY2VvZiBIc2wpcmV0dXJuIG5ldyBIc2woby5oLG8ucyxvLmwsby5vcGFjaXR5KTtpZighKG8gaW5zdGFuY2VvZiBDb2xvcikpbz1jb2xvcihvKTtpZighbylyZXR1cm4gbmV3IEhzbDtpZihvIGluc3RhbmNlb2YgSHNsKXJldHVybiBvO289by5yZ2IoKTt2YXIgcj1vLnIvMjU1LGc9by5nLzI1NSxiPW8uYi8yNTUsbWluPU1hdGgubWluKHIsZyxiKSxtYXg9TWF0aC5tYXgocixnLGIpLGg9TmFOLHM9bWF4LW1pbixsPShtYXgrbWluKS8yO2lmKHMpe2lmKHI9PT1tYXgpaD0oZy1iKS9zKyhnPGIpKjY7ZWxzZSBpZihnPT09bWF4KWg9KGItcikvcysyO2Vsc2UgaD0oci1nKS9zKzQ7cy89bDwuNT9tYXgrbWluOjItbWF4LW1pbjtoKj02MH1lbHNle3M9bD4wJiZsPDE/MDpofXJldHVybiBuZXcgSHNsKGgscyxsLG8ub3BhY2l0eSl9ZnVuY3Rpb24gaHNsKGgscyxsLG9wYWNpdHkpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT09MT9oc2xDb252ZXJ0KGgpOm5ldyBIc2woaCxzLGwsb3BhY2l0eT09bnVsbD8xOm9wYWNpdHkpfWZ1bmN0aW9uIEhzbChoLHMsbCxvcGFjaXR5KXt0aGlzLmg9K2g7dGhpcy5zPStzO3RoaXMubD0rbDt0aGlzLm9wYWNpdHk9K29wYWNpdHl9ZGVmaW5lKEhzbCxoc2wsZXh0ZW5kKENvbG9yLHticmlnaHRlcjpmdW5jdGlvbiBicmlnaHRlcihrKXtrPWs9PW51bGw/X2JyaWdodGVyOk1hdGgucG93KF9icmlnaHRlcixrKTtyZXR1cm4gbmV3IEhzbCh0aGlzLmgsdGhpcy5zLHRoaXMubCprLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbiBkYXJrZXIoayl7az1rPT1udWxsP19kYXJrZXI6TWF0aC5wb3coX2RhcmtlcixrKTtyZXR1cm4gbmV3IEhzbCh0aGlzLmgsdGhpcy5zLHRoaXMubCprLHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbiByZ2IoKXt2YXIgaD10aGlzLmglMzYwKyh0aGlzLmg8MCkqMzYwLHM9aXNOYU4oaCl8fGlzTmFOKHRoaXMucyk/MDp0aGlzLnMsbD10aGlzLmwsbTI9bCsobDwuNT9sOjEtbCkqcyxtMT0yKmwtbTI7cmV0dXJuIG5ldyBSZ2IoaHNsMnJnYihoPj0yNDA/aC0yNDA6aCsxMjAsbTEsbTIpLGhzbDJyZ2IoaCxtMSxtMiksaHNsMnJnYihoPDEyMD9oKzI0MDpoLTEyMCxtMSxtMiksdGhpcy5vcGFjaXR5KX0sZGlzcGxheWFibGU6ZnVuY3Rpb24gZGlzcGxheWFibGUoKXtyZXR1cm4oMDw9dGhpcy5zJiZ0aGlzLnM8PTF8fGlzTmFOKHRoaXMucykpJiYwPD10aGlzLmwmJnRoaXMubDw9MSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9fSkpO2Z1bmN0aW9uIGhzbDJyZ2IoaCxtMSxtMil7cmV0dXJuKGg8NjA/bTErKG0yLW0xKSpoLzYwOmg8MTgwP20yOmg8MjQwP20xKyhtMi1tMSkqKDI0MC1oKS82MDptMSkqMjU1fXZhciBkZWcycmFkPU1hdGguUEkvMTgwO3ZhciByYWQyZGVnPTE4MC9NYXRoLlBJO3ZhciBLbj0xODt2YXIgWG49Ljk1MDQ3O3ZhciBZbj0xO3ZhciBabj0xLjA4ODgzO3ZhciB0MD00LzI5O3ZhciB0MT02LzI5O3ZhciB0Mj0zKnQxKnQxO3ZhciB0Mz10MSp0MSp0MTtmdW5jdGlvbiBsYWJDb252ZXJ0KG8pe2lmKG8gaW5zdGFuY2VvZiBMYWIpcmV0dXJuIG5ldyBMYWIoby5sLG8uYSxvLmIsby5vcGFjaXR5KTtpZihvIGluc3RhbmNlb2YgSGNsKXt2YXIgaD1vLmgqZGVnMnJhZDtyZXR1cm4gbmV3IExhYihvLmwsTWF0aC5jb3MoaCkqby5jLE1hdGguc2luKGgpKm8uYyxvLm9wYWNpdHkpfWlmKCEobyBpbnN0YW5jZW9mIFJnYikpbz1yZ2JDb252ZXJ0KG8pO3ZhciBiPXJnYjJ4eXooby5yKSxhPXJnYjJ4eXooby5nKSxsPXJnYjJ4eXooby5iKSx4PXh5ejJsYWIoKC40MTI0NTY0KmIrLjM1NzU3NjEqYSsuMTgwNDM3NSpsKS9YbikseT14eXoybGFiKCguMjEyNjcyOSpiKy43MTUxNTIyKmErLjA3MjE3NSpsKS9Zbiksej14eXoybGFiKCguMDE5MzMzOSpiKy4xMTkxOTIqYSsuOTUwMzA0MSpsKS9abik7cmV0dXJuIG5ldyBMYWIoMTE2KnktMTYsNTAwKih4LXkpLDIwMCooeS16KSxvLm9wYWNpdHkpfWZ1bmN0aW9uIGxhYihsLGEsYixvcGFjaXR5KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTE/bGFiQ29udmVydChsKTpuZXcgTGFiKGwsYSxiLG9wYWNpdHk9PW51bGw/MTpvcGFjaXR5KX1mdW5jdGlvbiBMYWIobCxhLGIsb3BhY2l0eSl7dGhpcy5sPStsO3RoaXMuYT0rYTt0aGlzLmI9K2I7dGhpcy5vcGFjaXR5PStvcGFjaXR5fWRlZmluZShMYWIsbGFiLGV4dGVuZChDb2xvcix7YnJpZ2h0ZXI6ZnVuY3Rpb24gYnJpZ2h0ZXIoayl7cmV0dXJuIG5ldyBMYWIodGhpcy5sK0tuKihrPT1udWxsPzE6ayksdGhpcy5hLHRoaXMuYix0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24gZGFya2VyKGspe3JldHVybiBuZXcgTGFiKHRoaXMubC1Lbiooaz09bnVsbD8xOmspLHRoaXMuYSx0aGlzLmIsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uIHJnYiQkMSgpe3ZhciB5PSh0aGlzLmwrMTYpLzExNix4PWlzTmFOKHRoaXMuYSk/eTp5K3RoaXMuYS81MDAsej1pc05hTih0aGlzLmIpP3k6eS10aGlzLmIvMjAwO3k9WW4qbGFiMnh5eih5KTt4PVhuKmxhYjJ4eXooeCk7ej1abipsYWIyeHl6KHopO3JldHVybiBuZXcgUmdiKHh5ejJyZ2IoMy4yNDA0NTQyKngtMS41MzcxMzg1KnktLjQ5ODUzMTQqeikseHl6MnJnYigtLjk2OTI2Nip4KzEuODc2MDEwOCp5Ky4wNDE1NTYqeikseHl6MnJnYiguMDU1NjQzNCp4LS4yMDQwMjU5KnkrMS4wNTcyMjUyKnopLHRoaXMub3BhY2l0eSl9fSkpO2Z1bmN0aW9uIHh5ejJsYWIodCl7cmV0dXJuIHQ+dDM/TWF0aC5wb3codCwxLzMpOnQvdDIrdDB9ZnVuY3Rpb24gbGFiMnh5eih0KXtyZXR1cm4gdD50MT90KnQqdDp0MioodC10MCl9ZnVuY3Rpb24geHl6MnJnYih4KXtyZXR1cm4gMjU1Kih4PD0uMDAzMTMwOD8xMi45Mip4OjEuMDU1Kk1hdGgucG93KHgsMS8yLjQpLS4wNTUpfWZ1bmN0aW9uIHJnYjJ4eXooeCl7cmV0dXJuKHgvPTI1NSk8PS4wNDA0NT94LzEyLjkyOk1hdGgucG93KCh4Ky4wNTUpLzEuMDU1LDIuNCl9ZnVuY3Rpb24gaGNsQ29udmVydChvKXtpZihvIGluc3RhbmNlb2YgSGNsKXJldHVybiBuZXcgSGNsKG8uaCxvLmMsby5sLG8ub3BhY2l0eSk7aWYoIShvIGluc3RhbmNlb2YgTGFiKSlvPWxhYkNvbnZlcnQobyk7dmFyIGg9TWF0aC5hdGFuMihvLmIsby5hKSpyYWQyZGVnO3JldHVybiBuZXcgSGNsKGg8MD9oKzM2MDpoLE1hdGguc3FydChvLmEqby5hK28uYipvLmIpLG8ubCxvLm9wYWNpdHkpfWZ1bmN0aW9uIGhjbChoLGMsbCxvcGFjaXR5KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTE/aGNsQ29udmVydChoKTpuZXcgSGNsKGgsYyxsLG9wYWNpdHk9PW51bGw/MTpvcGFjaXR5KX1mdW5jdGlvbiBIY2woaCxjLGwsb3BhY2l0eSl7dGhpcy5oPStoO3RoaXMuYz0rYzt0aGlzLmw9K2w7dGhpcy5vcGFjaXR5PStvcGFjaXR5fWRlZmluZShIY2wsaGNsLGV4dGVuZChDb2xvcix7YnJpZ2h0ZXI6ZnVuY3Rpb24gYnJpZ2h0ZXIoayl7cmV0dXJuIG5ldyBIY2wodGhpcy5oLHRoaXMuYyx0aGlzLmwrS24qKGs9PW51bGw/MTprKSx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24gZGFya2VyKGspe3JldHVybiBuZXcgSGNsKHRoaXMuaCx0aGlzLmMsdGhpcy5sLUtuKihrPT1udWxsPzE6ayksdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uIHJnYiQkMSgpe3JldHVybiBsYWJDb252ZXJ0KHRoaXMpLnJnYigpfX0pKTt2YXIgQT0tLjE0ODYxO3ZhciBCPSsxLjc4Mjc3O3ZhciBDPS0uMjkyMjc7dmFyIEQ9LS45MDY0OTt2YXIgRT0rMS45NzI5NDt2YXIgRUQ9RSpEO3ZhciBFQj1FKkI7dmFyIEJDX0RBPUIqQy1EKkE7ZnVuY3Rpb24gY3ViZWhlbGl4Q29udmVydChvKXtpZihvIGluc3RhbmNlb2YgQ3ViZWhlbGl4KXJldHVybiBuZXcgQ3ViZWhlbGl4KG8uaCxvLnMsby5sLG8ub3BhY2l0eSk7aWYoIShvIGluc3RhbmNlb2YgUmdiKSlvPXJnYkNvbnZlcnQobyk7dmFyIHI9by5yLzI1NSxnPW8uZy8yNTUsYj1vLmIvMjU1LGw9KEJDX0RBKmIrRUQqci1FQipnKS8oQkNfREErRUQtRUIpLGJsPWItbCxrPShFKihnLWwpLUMqYmwpL0Qscz1NYXRoLnNxcnQoayprK2JsKmJsKS8oRSpsKigxLWwpKSxoPXM/TWF0aC5hdGFuMihrLGJsKSpyYWQyZGVnLTEyMDpOYU47cmV0dXJuIG5ldyBDdWJlaGVsaXgoaDwwP2grMzYwOmgscyxsLG8ub3BhY2l0eSl9ZnVuY3Rpb24gY3ViZWhlbGl4KGgscyxsLG9wYWNpdHkpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT09MT9jdWJlaGVsaXhDb252ZXJ0KGgpOm5ldyBDdWJlaGVsaXgoaCxzLGwsb3BhY2l0eT09bnVsbD8xOm9wYWNpdHkpfWZ1bmN0aW9uIEN1YmVoZWxpeChoLHMsbCxvcGFjaXR5KXt0aGlzLmg9K2g7dGhpcy5zPStzO3RoaXMubD0rbDt0aGlzLm9wYWNpdHk9K29wYWNpdHl9ZGVmaW5lKEN1YmVoZWxpeCxjdWJlaGVsaXgsZXh0ZW5kKENvbG9yLHticmlnaHRlcjpmdW5jdGlvbiBicmlnaHRlciQkMShrKXtrPWs9PW51bGw/X2JyaWdodGVyOk1hdGgucG93KF9icmlnaHRlcixrKTtyZXR1cm4gbmV3IEN1YmVoZWxpeCh0aGlzLmgsdGhpcy5zLHRoaXMubCprLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbiBkYXJrZXIkJDEoayl7az1rPT1udWxsP19kYXJrZXI6TWF0aC5wb3coX2RhcmtlcixrKTtyZXR1cm4gbmV3IEN1YmVoZWxpeCh0aGlzLmgsdGhpcy5zLHRoaXMubCprLHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbiByZ2IkJDEoKXt2YXIgaD1pc05hTih0aGlzLmgpPzA6KHRoaXMuaCsxMjApKmRlZzJyYWQsbD0rdGhpcy5sLGE9aXNOYU4odGhpcy5zKT8wOnRoaXMucypsKigxLWwpLGNvc2g9TWF0aC5jb3MoaCksc2luaD1NYXRoLnNpbihoKTtyZXR1cm4gbmV3IFJnYigyNTUqKGwrYSooQSpjb3NoK0Iqc2luaCkpLDI1NSoobCthKihDKmNvc2grRCpzaW5oKSksMjU1KihsK2EqKEUqY29zaCkpLHRoaXMub3BhY2l0eSl9fSkpO3ZhciBkM0NvbG9yPU9iamVjdC5mcmVlemUoe2NvbG9yOmNvbG9yLHJnYjpyZ2IsaHNsOmhzbCxsYWI6bGFiLGhjbDpoY2wsY3ViZWhlbGl4OmN1YmVoZWxpeH0pO3ZhciBjb25zdGFudCQ0PWZ1bmN0aW9uKHgpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB4fX07ZnVuY3Rpb24gbGluZWFyKGEsZCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBhK3QqZH19ZnVuY3Rpb24gZXhwb25lbnRpYWwoYSxiLHkpe3JldHVybiBhPU1hdGgucG93KGEseSksYj1NYXRoLnBvdyhiLHkpLWEseT0xL3ksZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucG93KGErdCpiLHkpfX1mdW5jdGlvbiBodWUoYSxiKXt2YXIgZD1iLWE7cmV0dXJuIGQ/bGluZWFyKGEsZD4xODB8fGQ8LTE4MD9kLTM2MCpNYXRoLnJvdW5kKGQvMzYwKTpkKTpjb25zdGFudCQ0KGlzTmFOKGEpP2I6YSl9ZnVuY3Rpb24gZ2FtbWEoeSl7cmV0dXJuKHk9K3kpPT09MT9ub2dhbW1hOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGItYT9leHBvbmVudGlhbChhLGIseSk6Y29uc3RhbnQkNChpc05hTihhKT9iOmEpfX1mdW5jdGlvbiBub2dhbW1hKGEsYil7dmFyIGQ9Yi1hO3JldHVybiBkP2xpbmVhcihhLGQpOmNvbnN0YW50JDQoaXNOYU4oYSk/YjphKX12YXIgaW50ZXJwb2xhdGVSZ2I9ZnVuY3Rpb24gcmdiR2FtbWEoeSl7dmFyIGNvbG9yJCQxPWdhbW1hKHkpO2Z1bmN0aW9uIHJnYiQkMShzdGFydCxlbmQpe3ZhciByPWNvbG9yJCQxKChzdGFydD1yZ2Ioc3RhcnQpKS5yLChlbmQ9cmdiKGVuZCkpLnIpLGc9Y29sb3IkJDEoc3RhcnQuZyxlbmQuZyksYj1jb2xvciQkMShzdGFydC5iLGVuZC5iKSxvcGFjaXR5PW5vZ2FtbWEoc3RhcnQub3BhY2l0eSxlbmQub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3N0YXJ0LnI9cih0KTtzdGFydC5nPWcodCk7c3RhcnQuYj1iKHQpO3N0YXJ0Lm9wYWNpdHk9b3BhY2l0eSh0KTtyZXR1cm4gc3RhcnQrIiJ9fXJnYiQkMS5nYW1tYT1yZ2JHYW1tYTtyZXR1cm4gcmdiJCQxfSgxKTt2YXIgYXJyYXkkMT1mdW5jdGlvbihhLGIpe3ZhciBuYj1iP2IubGVuZ3RoOjAsbmE9YT9NYXRoLm1pbihuYixhLmxlbmd0aCk6MCx4PW5ldyBBcnJheShuYiksYz1uZXcgQXJyYXkobmIpLGk7Zm9yKGk9MDtpPG5hOysraSl7eFtpXT1pbnRlcnBvbGF0ZShhW2ldLGJbaV0pfWZvcig7aTxuYjsrK2kpe2NbaV09YltpXX1yZXR1cm4gZnVuY3Rpb24odCl7Zm9yKGk9MDtpPG5hOysraSl7Y1tpXT14W2ldKHQpfXJldHVybiBjfX07dmFyIGRhdGU9ZnVuY3Rpb24oYSxiKXt2YXIgZD1uZXcgRGF0ZTtyZXR1cm4gYT0rYSxiLT1hLGZ1bmN0aW9uKHQpe3JldHVybiBkLnNldFRpbWUoYStiKnQpLGR9fTt2YXIgaW50ZXJwb2xhdGVOdW1iZXI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT0rYSxiLT1hLGZ1bmN0aW9uKHQpe3JldHVybiBhK2IqdH19O3ZhciBvYmplY3Q9ZnVuY3Rpb24oYSxiKXt2YXIgaT17fSxjPXt9LGs7aWYoYT09PW51bGx8fCh0eXBlb2YgYT09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2YoYSkpIT09Im9iamVjdCIpYT17fTtpZihiPT09bnVsbHx8KHR5cGVvZiBiPT09InVuZGVmaW5lZCI/InVuZGVmaW5lZCI6X3R5cGVvZihiKSkhPT0ib2JqZWN0IiliPXt9O2ZvcihrIGluIGIpe2lmKGsgaW4gYSl7aVtrXT1pbnRlcnBvbGF0ZShhW2tdLGJba10pfWVsc2V7Y1trXT1iW2tdfX1yZXR1cm4gZnVuY3Rpb24odCl7Zm9yKGsgaW4gaSl7Y1trXT1pW2tdKHQpfXJldHVybiBjfX07dmFyIHJlQT0vWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2c7dmFyIHJlQj1uZXcgUmVnRXhwKHJlQS5zb3VyY2UsImciKTtmdW5jdGlvbiB6ZXJvKGIpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBifX1mdW5jdGlvbiBvbmUoYil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBiKHQpKyIifX12YXIgaW50ZXJwb2xhdGVTdHJpbmc9ZnVuY3Rpb24oYSxiKXt2YXIgYmk9cmVBLmxhc3RJbmRleD1yZUIubGFzdEluZGV4PTAsYW0sYm0sYnMsaT0tMSxzPVtdLHE9W107YT1hKyIiLGI9YisiIjt3aGlsZSgoYW09cmVBLmV4ZWMoYSkpJiYoYm09cmVCLmV4ZWMoYikpKXtpZigoYnM9Ym0uaW5kZXgpPmJpKXticz1iLnNsaWNlKGJpLGJzKTtpZihzW2ldKXNbaV0rPWJzO2Vsc2Ugc1srK2ldPWJzfWlmKChhbT1hbVswXSk9PT0oYm09Ym1bMF0pKXtpZihzW2ldKXNbaV0rPWJtO2Vsc2Ugc1srK2ldPWJtfWVsc2V7c1srK2ldPW51bGw7cS5wdXNoKHtpOmkseDppbnRlcnBvbGF0ZU51bWJlcihhbSxibSl9KX1iaT1yZUIubGFzdEluZGV4fWlmKGJpPGIubGVuZ3RoKXticz1iLnNsaWNlKGJpKTtpZihzW2ldKXNbaV0rPWJzO2Vsc2Ugc1srK2ldPWJzfXJldHVybiBzLmxlbmd0aDwyP3FbMF0/b25lKHFbMF0ueCk6emVybyhiKTooYj1xLmxlbmd0aCxmdW5jdGlvbih0KXtmb3IodmFyIGk9MCxvO2k8YjsrK2kpe3NbKG89cVtpXSkuaV09by54KHQpfXJldHVybiBzLmpvaW4oIiIpfSl9O3ZhciBpbnRlcnBvbGF0ZT1mdW5jdGlvbihhLGIpe3ZhciB0PXR5cGVvZiBiPT09InVuZGVmaW5lZCI/InVuZGVmaW5lZCI6X3R5cGVvZihiKSxjO3JldHVybiBiPT1udWxsfHx0PT09ImJvb2xlYW4iP2NvbnN0YW50JDQoYik6KHQ9PT0ibnVtYmVyIj9pbnRlcnBvbGF0ZU51bWJlcjp0PT09InN0cmluZyI/KGM9Y29sb3IoYikpPyhiPWMsaW50ZXJwb2xhdGVSZ2IpOmludGVycG9sYXRlU3RyaW5nOmIgaW5zdGFuY2VvZiBjb2xvcj9pbnRlcnBvbGF0ZVJnYjpiIGluc3RhbmNlb2YgRGF0ZT9kYXRlOkFycmF5LmlzQXJyYXkoYik/YXJyYXkkMTp0eXBlb2YgYi52YWx1ZU9mIT09ImZ1bmN0aW9uIiYmdHlwZW9mIGIudG9TdHJpbmchPT0iZnVuY3Rpb24ifHxpc05hTihiKT9vYmplY3Q6aW50ZXJwb2xhdGVOdW1iZXIpKGEsYil9O3ZhciBpbnRlcnBvbGF0ZVJvdW5kPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9K2EsYi09YSxmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZChhK2IqdCl9fTt2YXIgZGVncmVlcz0xODAvTWF0aC5QSTt2YXIgaWRlbnRpdHkkMj17dHJhbnNsYXRlWDowLHRyYW5zbGF0ZVk6MCxyb3RhdGU6MCxza2V3WDowLHNjYWxlWDoxLHNjYWxlWToxfTt2YXIgZGVjb21wb3NlPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXt2YXIgc2NhbGVYLHNjYWxlWSxza2V3WDtpZihzY2FsZVg9TWF0aC5zcXJ0KGEqYStiKmIpKWEvPXNjYWxlWCxiLz1zY2FsZVg7aWYoc2tld1g9YSpjK2IqZCljLT1hKnNrZXdYLGQtPWIqc2tld1g7aWYoc2NhbGVZPU1hdGguc3FydChjKmMrZCpkKSljLz1zY2FsZVksZC89c2NhbGVZLHNrZXdYLz1zY2FsZVk7aWYoYSpkPGIqYylhPS1hLGI9LWIsc2tld1g9LXNrZXdYLHNjYWxlWD0tc2NhbGVYO3JldHVybnt0cmFuc2xhdGVYOmUsdHJhbnNsYXRlWTpmLHJvdGF0ZTpNYXRoLmF0YW4yKGIsYSkqZGVncmVlcyxza2V3WDpNYXRoLmF0YW4oc2tld1gpKmRlZ3JlZXMsc2NhbGVYOnNjYWxlWCxzY2FsZVk6c2NhbGVZfX07dmFyIGNzc05vZGU7dmFyIGNzc1Jvb3Q7dmFyIGNzc1ZpZXc7dmFyIHN2Z05vZGU7ZnVuY3Rpb24gcGFyc2VDc3ModmFsdWUpe2lmKHZhbHVlPT09Im5vbmUiKXJldHVybiBpZGVudGl0eSQyO2lmKCFjc3NOb2RlKWNzc05vZGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIiksY3NzUm9vdD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsY3NzVmlldz1kb2N1bWVudC5kZWZhdWx0Vmlldztjc3NOb2RlLnN0eWxlLnRyYW5zZm9ybT12YWx1ZTt2YWx1ZT1jc3NWaWV3LmdldENvbXB1dGVkU3R5bGUoY3NzUm9vdC5hcHBlbmRDaGlsZChjc3NOb2RlKSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKTtjc3NSb290LnJlbW92ZUNoaWxkKGNzc05vZGUpO3ZhbHVlPXZhbHVlLnNsaWNlKDcsLTEpLnNwbGl0KCIsIik7cmV0dXJuIGRlY29tcG9zZSgrdmFsdWVbMF0sK3ZhbHVlWzFdLCt2YWx1ZVsyXSwrdmFsdWVbM10sK3ZhbHVlWzRdLCt2YWx1ZVs1XSl9ZnVuY3Rpb24gcGFyc2VTdmcodmFsdWUpe2lmKHZhbHVlPT1udWxsKXJldHVybiBpZGVudGl0eSQyO2lmKCFzdmdOb2RlKXN2Z05vZGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsImciKTtzdmdOb2RlLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIix2YWx1ZSk7aWYoISh2YWx1ZT1zdmdOb2RlLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpKXJldHVybiBpZGVudGl0eSQyO3ZhbHVlPXZhbHVlLm1hdHJpeDtyZXR1cm4gZGVjb21wb3NlKHZhbHVlLmEsdmFsdWUuYix2YWx1ZS5jLHZhbHVlLmQsdmFsdWUuZSx2YWx1ZS5mKX1mdW5jdGlvbiBpbnRlcnBvbGF0ZVRyYW5zZm9ybShwYXJzZSxweENvbW1hLHB4UGFyZW4sZGVnUGFyZW4pe2Z1bmN0aW9uIHBvcChzKXtyZXR1cm4gcy5sZW5ndGg/cy5wb3AoKSsiICI6IiJ9ZnVuY3Rpb24gdHJhbnNsYXRlKHhhLHlhLHhiLHliLHMscSl7aWYoeGEhPT14Ynx8eWEhPT15Yil7dmFyIGk9cy5wdXNoKCJ0cmFuc2xhdGUoIixudWxsLHB4Q29tbWEsbnVsbCxweFBhcmVuKTtxLnB1c2goe2k6aS00LHg6aW50ZXJwb2xhdGVOdW1iZXIoeGEseGIpfSx7aTppLTIseDppbnRlcnBvbGF0ZU51bWJlcih5YSx5Yil9KX1lbHNlIGlmKHhifHx5Yil7cy5wdXNoKCJ0cmFuc2xhdGUoIit4YitweENvbW1hK3liK3B4UGFyZW4pfX1mdW5jdGlvbiByb3RhdGUoYSxiLHMscSl7aWYoYSE9PWIpe2lmKGEtYj4xODApYis9MzYwO2Vsc2UgaWYoYi1hPjE4MClhKz0zNjA7cS5wdXNoKHtpOnMucHVzaChwb3AocykrInJvdGF0ZSgiLG51bGwsZGVnUGFyZW4pLTIseDppbnRlcnBvbGF0ZU51bWJlcihhLGIpfSl9ZWxzZSBpZihiKXtzLnB1c2gocG9wKHMpKyJyb3RhdGUoIitiK2RlZ1BhcmVuKX19ZnVuY3Rpb24gc2tld1goYSxiLHMscSl7aWYoYSE9PWIpe3EucHVzaCh7aTpzLnB1c2gocG9wKHMpKyJza2V3WCgiLG51bGwsZGVnUGFyZW4pLTIseDppbnRlcnBvbGF0ZU51bWJlcihhLGIpfSl9ZWxzZSBpZihiKXtzLnB1c2gocG9wKHMpKyJza2V3WCgiK2IrZGVnUGFyZW4pfX1mdW5jdGlvbiBzY2FsZSh4YSx5YSx4Yix5YixzLHEpe2lmKHhhIT09eGJ8fHlhIT09eWIpe3ZhciBpPXMucHVzaChwb3AocykrInNjYWxlKCIsbnVsbCwiLCIsbnVsbCwiKSIpO3EucHVzaCh7aTppLTQseDppbnRlcnBvbGF0ZU51bWJlcih4YSx4Yil9LHtpOmktMix4OmludGVycG9sYXRlTnVtYmVyKHlhLHliKX0pfWVsc2UgaWYoeGIhPT0xfHx5YiE9PTEpe3MucHVzaChwb3AocykrInNjYWxlKCIreGIrIiwiK3liKyIpIil9fXJldHVybiBmdW5jdGlvbihhLGIpe3ZhciBzPVtdLHE9W107YT1wYXJzZShhKSxiPXBhcnNlKGIpO3RyYW5zbGF0ZShhLnRyYW5zbGF0ZVgsYS50cmFuc2xhdGVZLGIudHJhbnNsYXRlWCxiLnRyYW5zbGF0ZVkscyxxKTtyb3RhdGUoYS5yb3RhdGUsYi5yb3RhdGUscyxxKTtza2V3WChhLnNrZXdYLGIuc2tld1gscyxxKTtzY2FsZShhLnNjYWxlWCxhLnNjYWxlWSxiLnNjYWxlWCxiLnNjYWxlWSxzLHEpO2E9Yj1udWxsO3JldHVybiBmdW5jdGlvbih0KXt2YXIgaT0tMSxuPXEubGVuZ3RoLG87d2hpbGUoKytpPG4pe3NbKG89cVtpXSkuaV09by54KHQpfXJldHVybiBzLmpvaW4oIiIpfX19dmFyIGludGVycG9sYXRlVHJhbnNmb3JtQ3NzPWludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlQ3NzLCJweCwgIiwicHgpIiwiZGVnKSIpO3ZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2Zz1pbnRlcnBvbGF0ZVRyYW5zZm9ybShwYXJzZVN2ZywiLCAiLCIpIiwiKSIpO3ZhciByaG89TWF0aC5TUVJUMjtmdW5jdGlvbiBjdWJlaGVsaXgkMShodWUkJDEpe3JldHVybiBmdW5jdGlvbiBjdWJlaGVsaXhHYW1tYSh5KXt5PSt5O2Z1bmN0aW9uIGN1YmVoZWxpeCQkMShzdGFydCxlbmQpe3ZhciBoPWh1ZSQkMSgoc3RhcnQ9Y3ViZWhlbGl4KHN0YXJ0KSkuaCwoZW5kPWN1YmVoZWxpeChlbmQpKS5oKSxzPW5vZ2FtbWEoc3RhcnQucyxlbmQucyksbD1ub2dhbW1hKHN0YXJ0LmwsZW5kLmwpLG9wYWNpdHk9bm9nYW1tYShzdGFydC5vcGFjaXR5LGVuZC5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7c3RhcnQuaD1oKHQpO3N0YXJ0LnM9cyh0KTtzdGFydC5sPWwoTWF0aC5wb3codCx5KSk7c3RhcnQub3BhY2l0eT1vcGFjaXR5KHQpO3JldHVybiBzdGFydCsiIn19Y3ViZWhlbGl4JCQxLmdhbW1hPWN1YmVoZWxpeEdhbW1hO3JldHVybiBjdWJlaGVsaXgkJDF9KDEpfWN1YmVoZWxpeCQxKGh1ZSk7dmFyIGN1YmVoZWxpeExvbmc9Y3ViZWhlbGl4JDEobm9nYW1tYSk7ZnVuY3Rpb24gdHdlZW5SZW1vdmUoaWQsbmFtZSl7dmFyIHR3ZWVuMCx0d2VlbjE7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHNjaGVkdWxlJCQxPXNldCQ0KHRoaXMsaWQpLHR3ZWVuPXNjaGVkdWxlJCQxLnR3ZWVuO2lmKHR3ZWVuIT09dHdlZW4wKXt0d2VlbjE9dHdlZW4wPXR3ZWVuO2Zvcih2YXIgaT0wLG49dHdlZW4xLmxlbmd0aDtpPG47KytpKXtpZih0d2VlbjFbaV0ubmFtZT09PW5hbWUpe3R3ZWVuMT10d2VlbjEuc2xpY2UoKTt0d2VlbjEuc3BsaWNlKGksMSk7YnJlYWt9fX1zY2hlZHVsZSQkMS50d2Vlbj10d2VlbjF9fWZ1bmN0aW9uIHR3ZWVuRnVuY3Rpb24oaWQsbmFtZSx2YWx1ZSl7dmFyIHR3ZWVuMCx0d2VlbjE7aWYodHlwZW9mIHZhbHVlIT09ImZ1bmN0aW9uIil0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHNjaGVkdWxlJCQxPXNldCQ0KHRoaXMsaWQpLHR3ZWVuPXNjaGVkdWxlJCQxLnR3ZWVuO2lmKHR3ZWVuIT09dHdlZW4wKXt0d2VlbjE9KHR3ZWVuMD10d2Vlbikuc2xpY2UoKTtmb3IodmFyIHQ9e25hbWU6bmFtZSx2YWx1ZTp2YWx1ZX0saT0wLG49dHdlZW4xLmxlbmd0aDtpPG47KytpKXtpZih0d2VlbjFbaV0ubmFtZT09PW5hbWUpe3R3ZWVuMVtpXT10O2JyZWFrfX1pZihpPT09bil0d2VlbjEucHVzaCh0KX1zY2hlZHVsZSQkMS50d2Vlbj10d2VlbjF9fXZhciB0cmFuc2l0aW9uX3R3ZWVuPWZ1bmN0aW9uKG5hbWUsdmFsdWUpe3ZhciBpZD10aGlzLl9pZDtuYW1lKz0iIjtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciB0d2Vlbj1nZXQkMih0aGlzLm5vZGUoKSxpZCkudHdlZW47Zm9yKHZhciBpPTAsbj10d2Vlbi5sZW5ndGgsdDtpPG47KytpKXtpZigodD10d2VlbltpXSkubmFtZT09PW5hbWUpe3JldHVybiB0LnZhbHVlfX1yZXR1cm4gbnVsbH1yZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZT09bnVsbD90d2VlblJlbW92ZTp0d2VlbkZ1bmN0aW9uKShpZCxuYW1lLHZhbHVlKSl9O2Z1bmN0aW9uIHR3ZWVuVmFsdWUodHJhbnNpdGlvbixuYW1lLHZhbHVlKXt2YXIgaWQ9dHJhbnNpdGlvbi5faWQ7dHJhbnNpdGlvbi5lYWNoKGZ1bmN0aW9uKCl7dmFyIHNjaGVkdWxlJCQxPXNldCQ0KHRoaXMsaWQpOyhzY2hlZHVsZSQkMS52YWx1ZXx8KHNjaGVkdWxlJCQxLnZhbHVlPXt9KSlbbmFtZV09dmFsdWUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSk7cmV0dXJuIGZ1bmN0aW9uKG5vZGUpe3JldHVybiBnZXQkMihub2RlLGlkKS52YWx1ZVtuYW1lXX19dmFyIGludGVycG9sYXRlJDE9ZnVuY3Rpb24oYSxiKXt2YXIgYztyZXR1cm4odHlwZW9mIGI9PT0ibnVtYmVyIj9pbnRlcnBvbGF0ZU51bWJlcjpiIGluc3RhbmNlb2YgY29sb3I/aW50ZXJwb2xhdGVSZ2I6KGM9Y29sb3IoYikpPyhiPWMsaW50ZXJwb2xhdGVSZ2IpOmludGVycG9sYXRlU3RyaW5nKShhLGIpfTtmdW5jdGlvbiBhdHRyUmVtb3ZlJDEobmFtZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSl9fWZ1bmN0aW9uIGF0dHJSZW1vdmVOUyQxKGZ1bGxuYW1lKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLGZ1bGxuYW1lLmxvY2FsKX19ZnVuY3Rpb24gYXR0ckNvbnN0YW50JDEobmFtZSxpbnRlcnBvbGF0ZSx2YWx1ZTEpe3ZhciB2YWx1ZTAwLGludGVycG9sYXRlMDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdmFsdWUwPXRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpO3JldHVybiB2YWx1ZTA9PT12YWx1ZTE/bnVsbDp2YWx1ZTA9PT12YWx1ZTAwP2ludGVycG9sYXRlMDppbnRlcnBvbGF0ZTA9aW50ZXJwb2xhdGUodmFsdWUwMD12YWx1ZTAsdmFsdWUxKX19ZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMkMShmdWxsbmFtZSxpbnRlcnBvbGF0ZSx2YWx1ZTEpe3ZhciB2YWx1ZTAwLGludGVycG9sYXRlMDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdmFsdWUwPXRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsZnVsbG5hbWUubG9jYWwpO3JldHVybiB2YWx1ZTA9PT12YWx1ZTE/bnVsbDp2YWx1ZTA9PT12YWx1ZTAwP2ludGVycG9sYXRlMDppbnRlcnBvbGF0ZTA9aW50ZXJwb2xhdGUodmFsdWUwMD12YWx1ZTAsdmFsdWUxKX19ZnVuY3Rpb24gYXR0ckZ1bmN0aW9uJDEobmFtZSxpbnRlcnBvbGF0ZSx2YWx1ZSl7dmFyIHZhbHVlMDAsdmFsdWUxMCxpbnRlcnBvbGF0ZTA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHZhbHVlMCx2YWx1ZTE9dmFsdWUodGhpcyk7aWYodmFsdWUxPT1udWxsKXJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO3ZhbHVlMD10aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtyZXR1cm4gdmFsdWUwPT09dmFsdWUxP251bGw6dmFsdWUwPT09dmFsdWUwMCYmdmFsdWUxPT09dmFsdWUxMD9pbnRlcnBvbGF0ZTA6aW50ZXJwb2xhdGUwPWludGVycG9sYXRlKHZhbHVlMDA9dmFsdWUwLHZhbHVlMTA9dmFsdWUxKX19ZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMkMShmdWxsbmFtZSxpbnRlcnBvbGF0ZSx2YWx1ZSl7dmFyIHZhbHVlMDAsdmFsdWUxMCxpbnRlcnBvbGF0ZTA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHZhbHVlMCx2YWx1ZTE9dmFsdWUodGhpcyk7aWYodmFsdWUxPT1udWxsKXJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsZnVsbG5hbWUubG9jYWwpO3ZhbHVlMD10aGlzLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLGZ1bGxuYW1lLmxvY2FsKTtyZXR1cm4gdmFsdWUwPT09dmFsdWUxP251bGw6dmFsdWUwPT09dmFsdWUwMCYmdmFsdWUxPT09dmFsdWUxMD9pbnRlcnBvbGF0ZTA6aW50ZXJwb2xhdGUwPWludGVycG9sYXRlKHZhbHVlMDA9dmFsdWUwLHZhbHVlMTA9dmFsdWUxKX19dmFyIHRyYW5zaXRpb25fYXR0cj1mdW5jdGlvbihuYW1lLHZhbHVlKXt2YXIgZnVsbG5hbWU9bmFtZXNwYWNlKG5hbWUpLGk9ZnVsbG5hbWU9PT0idHJhbnNmb3JtIj9pbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZzppbnRlcnBvbGF0ZSQxO3JldHVybiB0aGlzLmF0dHJUd2VlbihuYW1lLHR5cGVvZiB2YWx1ZT09PSJmdW5jdGlvbiI/KGZ1bGxuYW1lLmxvY2FsP2F0dHJGdW5jdGlvbk5TJDE6YXR0ckZ1bmN0aW9uJDEpKGZ1bGxuYW1lLGksdHdlZW5WYWx1ZSh0aGlzLCJhdHRyLiIrbmFtZSx2YWx1ZSkpOnZhbHVlPT1udWxsPyhmdWxsbmFtZS5sb2NhbD9hdHRyUmVtb3ZlTlMkMTphdHRyUmVtb3ZlJDEpKGZ1bGxuYW1lKTooZnVsbG5hbWUubG9jYWw/YXR0ckNvbnN0YW50TlMkMTphdHRyQ29uc3RhbnQkMSkoZnVsbG5hbWUsaSx2YWx1ZSkpfTtmdW5jdGlvbiBhdHRyVHdlZW5OUyhmdWxsbmFtZSx2YWx1ZSl7ZnVuY3Rpb24gdHdlZW4oKXt2YXIgbm9kZT10aGlzLGk9dmFsdWUuYXBwbHkobm9kZSxhcmd1bWVudHMpO3JldHVybiBpJiZmdW5jdGlvbih0KXtub2RlLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLGZ1bGxuYW1lLmxvY2FsLGkodCkpfX10d2Vlbi5fdmFsdWU9dmFsdWU7cmV0dXJuIHR3ZWVufWZ1bmN0aW9uIGF0dHJUd2VlbihuYW1lLHZhbHVlKXtmdW5jdGlvbiB0d2Vlbigpe3ZhciBub2RlPXRoaXMsaT12YWx1ZS5hcHBseShub2RlLGFyZ3VtZW50cyk7cmV0dXJuIGkmJmZ1bmN0aW9uKHQpe25vZGUuc2V0QXR0cmlidXRlKG5hbWUsaSh0KSl9fXR3ZWVuLl92YWx1ZT12YWx1ZTtyZXR1cm4gdHdlZW59dmFyIHRyYW5zaXRpb25fYXR0clR3ZWVuPWZ1bmN0aW9uKG5hbWUsdmFsdWUpe3ZhciBrZXk9ImF0dHIuIituYW1lO2lmKGFyZ3VtZW50cy5sZW5ndGg8MilyZXR1cm4oa2V5PXRoaXMudHdlZW4oa2V5KSkmJmtleS5fdmFsdWU7aWYodmFsdWU9PW51bGwpcmV0dXJuIHRoaXMudHdlZW4oa2V5LG51bGwpO2lmKHR5cGVvZiB2YWx1ZSE9PSJmdW5jdGlvbiIpdGhyb3cgbmV3IEVycm9yO3ZhciBmdWxsbmFtZT1uYW1lc3BhY2UobmFtZSk7cmV0dXJuIHRoaXMudHdlZW4oa2V5LChmdWxsbmFtZS5sb2NhbD9hdHRyVHdlZW5OUzphdHRyVHdlZW4pKGZ1bGxuYW1lLHZhbHVlKSl9O2Z1bmN0aW9uIGRlbGF5RnVuY3Rpb24oaWQsdmFsdWUpe3JldHVybiBmdW5jdGlvbigpe2luaXQodGhpcyxpZCkuZGVsYXk9K3ZhbHVlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gZGVsYXlDb25zdGFudChpZCx2YWx1ZSl7cmV0dXJuIHZhbHVlPSt2YWx1ZSxmdW5jdGlvbigpe2luaXQodGhpcyxpZCkuZGVsYXk9dmFsdWV9fXZhciB0cmFuc2l0aW9uX2RlbGF5PWZ1bmN0aW9uKHZhbHVlKXt2YXIgaWQ9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCh0eXBlb2YgdmFsdWU9PT0iZnVuY3Rpb24iP2RlbGF5RnVuY3Rpb246ZGVsYXlDb25zdGFudCkoaWQsdmFsdWUpKTpnZXQkMih0aGlzLm5vZGUoKSxpZCkuZGVsYXl9O2Z1bmN0aW9uIGR1cmF0aW9uRnVuY3Rpb24oaWQsdmFsdWUpe3JldHVybiBmdW5jdGlvbigpe3NldCQ0KHRoaXMsaWQpLmR1cmF0aW9uPSt2YWx1ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIGR1cmF0aW9uQ29uc3RhbnQoaWQsdmFsdWUpe3JldHVybiB2YWx1ZT0rdmFsdWUsZnVuY3Rpb24oKXtzZXQkNCh0aGlzLGlkKS5kdXJhdGlvbj12YWx1ZX19dmFyIHRyYW5zaXRpb25fZHVyYXRpb249ZnVuY3Rpb24odmFsdWUpe3ZhciBpZD10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goKHR5cGVvZiB2YWx1ZT09PSJmdW5jdGlvbiI/ZHVyYXRpb25GdW5jdGlvbjpkdXJhdGlvbkNvbnN0YW50KShpZCx2YWx1ZSkpOmdldCQyKHRoaXMubm9kZSgpLGlkKS5kdXJhdGlvbn07ZnVuY3Rpb24gZWFzZUNvbnN0YW50KGlkLHZhbHVlKXtpZih0eXBlb2YgdmFsdWUhPT0iZnVuY3Rpb24iKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gZnVuY3Rpb24oKXtzZXQkNCh0aGlzLGlkKS5lYXNlPXZhbHVlfX12YXIgdHJhbnNpdGlvbl9lYXNlPWZ1bmN0aW9uKHZhbHVlKXt2YXIgaWQ9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKGVhc2VDb25zdGFudChpZCx2YWx1ZSkpOmdldCQyKHRoaXMubm9kZSgpLGlkKS5lYXNlfTt2YXIgdHJhbnNpdGlvbl9maWx0ZXI9ZnVuY3Rpb24obWF0Y2gpe2lmKHR5cGVvZiBtYXRjaCE9PSJmdW5jdGlvbiIpbWF0Y2g9bWF0Y2hlciQxKG1hdGNoKTtmb3IodmFyIGdyb3Vwcz10aGlzLl9ncm91cHMsbT1ncm91cHMubGVuZ3RoLHN1Ymdyb3Vwcz1uZXcgQXJyYXkobSksaj0wO2o8bTsrK2ope2Zvcih2YXIgZ3JvdXA9Z3JvdXBzW2pdLG49Z3JvdXAubGVuZ3RoLHN1Ymdyb3VwPXN1Ymdyb3Vwc1tqXT1bXSxub2RlLGk9MDtpPG47KytpKXtpZigobm9kZT1ncm91cFtpXSkmJm1hdGNoLmNhbGwobm9kZSxub2RlLl9fZGF0YV9fLGksZ3JvdXApKXtzdWJncm91cC5wdXNoKG5vZGUpfX19cmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3Vwcyx0aGlzLl9wYXJlbnRzLHRoaXMuX25hbWUsdGhpcy5faWQpfTt2YXIgdHJhbnNpdGlvbl9tZXJnZT1mdW5jdGlvbih0cmFuc2l0aW9uJCQxKXtpZih0cmFuc2l0aW9uJCQxLl9pZCE9PXRoaXMuX2lkKXRocm93IG5ldyBFcnJvcjtmb3IodmFyIGdyb3VwczA9dGhpcy5fZ3JvdXBzLGdyb3VwczE9dHJhbnNpdGlvbiQkMS5fZ3JvdXBzLG0wPWdyb3VwczAubGVuZ3RoLG0xPWdyb3VwczEubGVuZ3RoLG09TWF0aC5taW4obTAsbTEpLG1lcmdlcz1uZXcgQXJyYXkobTApLGo9MDtqPG07KytqKXtmb3IodmFyIGdyb3VwMD1ncm91cHMwW2pdLGdyb3VwMT1ncm91cHMxW2pdLG49Z3JvdXAwLmxlbmd0aCxtZXJnZT1tZXJnZXNbal09bmV3IEFycmF5KG4pLG5vZGUsaT0wO2k8bjsrK2kpe2lmKG5vZGU9Z3JvdXAwW2ldfHxncm91cDFbaV0pe21lcmdlW2ldPW5vZGV9fX1mb3IoO2o8bTA7KytqKXttZXJnZXNbal09Z3JvdXBzMFtqXX1yZXR1cm4gbmV3IFRyYW5zaXRpb24obWVyZ2VzLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9O2Z1bmN0aW9uIHN0YXJ0KG5hbWUpe3JldHVybihuYW1lKyIiKS50cmltKCkuc3BsaXQoL158XHMrLykuZXZlcnkoZnVuY3Rpb24odCl7dmFyIGk9dC5pbmRleE9mKCIuIik7aWYoaT49MCl0PXQuc2xpY2UoMCxpKTtyZXR1cm4hdHx8dD09PSJzdGFydCJ9KX1mdW5jdGlvbiBvbkZ1bmN0aW9uKGlkLG5hbWUsbGlzdGVuZXIpe3ZhciBvbjAsb24xLHNpdD1zdGFydChuYW1lKT9pbml0OnNldCQ0O3JldHVybiBmdW5jdGlvbigpe3ZhciBzY2hlZHVsZSQkMT1zaXQodGhpcyxpZCksb249c2NoZWR1bGUkJDEub247aWYob24hPT1vbjApKG9uMT0ob24wPW9uKS5jb3B5KCkpLm9uKG5hbWUsbGlzdGVuZXIpO3NjaGVkdWxlJCQxLm9uPW9uMX19dmFyIHRyYW5zaXRpb25fb249ZnVuY3Rpb24obmFtZSxsaXN0ZW5lcil7dmFyIGlkPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/Z2V0JDIodGhpcy5ub2RlKCksaWQpLm9uLm9uKG5hbWUpOnRoaXMuZWFjaChvbkZ1bmN0aW9uKGlkLG5hbWUsbGlzdGVuZXIpKX07ZnVuY3Rpb24gcmVtb3ZlRnVuY3Rpb24oaWQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBwYXJlbnQ9dGhpcy5wYXJlbnROb2RlO2Zvcih2YXIgaSBpbiB0aGlzLl9fdHJhbnNpdGlvbil7aWYoK2khPT1pZClyZXR1cm59aWYocGFyZW50KXBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKX19dmFyIHRyYW5zaXRpb25fcmVtb3ZlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub24oImVuZC5yZW1vdmUiLHJlbW92ZUZ1bmN0aW9uKHRoaXMuX2lkKSl9O3ZhciB0cmFuc2l0aW9uX3NlbGVjdD1mdW5jdGlvbihzZWxlY3Qpe3ZhciBuYW1lPXRoaXMuX25hbWUsaWQ9dGhpcy5faWQ7aWYodHlwZW9mIHNlbGVjdCE9PSJmdW5jdGlvbiIpc2VsZWN0PXNlbGVjdG9yKHNlbGVjdCk7Zm9yKHZhciBncm91cHM9dGhpcy5fZ3JvdXBzLG09Z3JvdXBzLmxlbmd0aCxzdWJncm91cHM9bmV3IEFycmF5KG0pLGo9MDtqPG07KytqKXtmb3IodmFyIGdyb3VwPWdyb3Vwc1tqXSxuPWdyb3VwLmxlbmd0aCxzdWJncm91cD1zdWJncm91cHNbal09bmV3IEFycmF5KG4pLG5vZGUsc3Vibm9kZSxpPTA7aTxuOysraSl7aWYoKG5vZGU9Z3JvdXBbaV0pJiYoc3Vibm9kZT1zZWxlY3QuY2FsbChub2RlLG5vZGUuX19kYXRhX18saSxncm91cCkpKXtpZigiX19kYXRhX18iaW4gbm9kZSlzdWJub2RlLl9fZGF0YV9fPW5vZGUuX19kYXRhX187c3ViZ3JvdXBbaV09c3Vibm9kZTtzY2hlZHVsZShzdWJncm91cFtpXSxuYW1lLGlkLGksc3ViZ3JvdXAsZ2V0JDIobm9kZSxpZCkpfX19cmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3Vwcyx0aGlzLl9wYXJlbnRzLG5hbWUsaWQpfTt2YXIgdHJhbnNpdGlvbl9zZWxlY3RBbGw9ZnVuY3Rpb24oc2VsZWN0KXt2YXIgbmFtZT10aGlzLl9uYW1lLGlkPXRoaXMuX2lkO2lmKHR5cGVvZiBzZWxlY3QhPT0iZnVuY3Rpb24iKXNlbGVjdD1zZWxlY3RvckFsbChzZWxlY3QpO2Zvcih2YXIgZ3JvdXBzPXRoaXMuX2dyb3VwcyxtPWdyb3Vwcy5sZW5ndGgsc3ViZ3JvdXBzPVtdLHBhcmVudHM9W10saj0wO2o8bTsrK2ope2Zvcih2YXIgZ3JvdXA9Z3JvdXBzW2pdLG49Z3JvdXAubGVuZ3RoLG5vZGUsaT0wO2k8bjsrK2kpe2lmKG5vZGU9Z3JvdXBbaV0pe2Zvcih2YXIgY2hpbGRyZW49c2VsZWN0LmNhbGwobm9kZSxub2RlLl9fZGF0YV9fLGksZ3JvdXApLGNoaWxkLGluaGVyaXQ9Z2V0JDIobm9kZSxpZCksaz0wLGw9Y2hpbGRyZW4ubGVuZ3RoO2s8bDsrK2spe2lmKGNoaWxkPWNoaWxkcmVuW2tdKXtzY2hlZHVsZShjaGlsZCxuYW1lLGlkLGssY2hpbGRyZW4saW5oZXJpdCl9fXN1Ymdyb3Vwcy5wdXNoKGNoaWxkcmVuKTtwYXJlbnRzLnB1c2gobm9kZSl9fX1yZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLHBhcmVudHMsbmFtZSxpZCl9O3ZhciBTZWxlY3Rpb24kMT1zZWxlY3Rpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yO3ZhciB0cmFuc2l0aW9uX3NlbGVjdGlvbj1mdW5jdGlvbigpe3JldHVybiBuZXcgU2VsZWN0aW9uJDEodGhpcy5fZ3JvdXBzLHRoaXMuX3BhcmVudHMpfTtmdW5jdGlvbiBzdHlsZVJlbW92ZSQxKG5hbWUsaW50ZXJwb2xhdGUpe3ZhciB2YWx1ZTAwLHZhbHVlMTAsaW50ZXJwb2xhdGUwO3JldHVybiBmdW5jdGlvbigpe3ZhciBzdHlsZT13aW5kb3ckMSh0aGlzKS5nZXRDb21wdXRlZFN0eWxlKHRoaXMsbnVsbCksdmFsdWUwPXN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSksdmFsdWUxPSh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpLHN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSkpO3JldHVybiB2YWx1ZTA9PT12YWx1ZTE/bnVsbDp2YWx1ZTA9PT12YWx1ZTAwJiZ2YWx1ZTE9PT12YWx1ZTEwP2ludGVycG9sYXRlMDppbnRlcnBvbGF0ZTA9aW50ZXJwb2xhdGUodmFsdWUwMD12YWx1ZTAsdmFsdWUxMD12YWx1ZTEpfX1mdW5jdGlvbiBzdHlsZVJlbW92ZUVuZChuYW1lKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpfX1mdW5jdGlvbiBzdHlsZUNvbnN0YW50JDEobmFtZSxpbnRlcnBvbGF0ZSx2YWx1ZTEpe3ZhciB2YWx1ZTAwLGludGVycG9sYXRlMDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdmFsdWUwPXdpbmRvdyQxKHRoaXMpLmdldENvbXB1dGVkU3R5bGUodGhpcyxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpO3JldHVybiB2YWx1ZTA9PT12YWx1ZTE/bnVsbDp2YWx1ZTA9PT12YWx1ZTAwP2ludGVycG9sYXRlMDppbnRlcnBvbGF0ZTA9aW50ZXJwb2xhdGUodmFsdWUwMD12YWx1ZTAsdmFsdWUxKX19ZnVuY3Rpb24gc3R5bGVGdW5jdGlvbiQxKG5hbWUsaW50ZXJwb2xhdGUsdmFsdWUpe3ZhciB2YWx1ZTAwLHZhbHVlMTAsaW50ZXJwb2xhdGUwO3JldHVybiBmdW5jdGlvbigpe3ZhciBzdHlsZT13aW5kb3ckMSh0aGlzKS5nZXRDb21wdXRlZFN0eWxlKHRoaXMsbnVsbCksdmFsdWUwPXN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSksdmFsdWUxPXZhbHVlKHRoaXMpO2lmKHZhbHVlMT09bnVsbCl2YWx1ZTE9KHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKSk7cmV0dXJuIHZhbHVlMD09PXZhbHVlMT9udWxsOnZhbHVlMD09PXZhbHVlMDAmJnZhbHVlMT09PXZhbHVlMTA/aW50ZXJwb2xhdGUwOmludGVycG9sYXRlMD1pbnRlcnBvbGF0ZSh2YWx1ZTAwPXZhbHVlMCx2YWx1ZTEwPXZhbHVlMSl9fXZhciB0cmFuc2l0aW9uX3N0eWxlPWZ1bmN0aW9uKG5hbWUsdmFsdWUscHJpb3JpdHkpe3ZhciBpPShuYW1lKz0iIik9PT0idHJhbnNmb3JtIj9pbnRlcnBvbGF0ZVRyYW5zZm9ybUNzczppbnRlcnBvbGF0ZSQxO3JldHVybiB2YWx1ZT09bnVsbD90aGlzLnN0eWxlVHdlZW4obmFtZSxzdHlsZVJlbW92ZSQxKG5hbWUsaSkpLm9uKCJlbmQuc3R5bGUuIituYW1lLHN0eWxlUmVtb3ZlRW5kKG5hbWUpKTp0aGlzLnN0eWxlVHdlZW4obmFtZSx0eXBlb2YgdmFsdWU9PT0iZnVuY3Rpb24iP3N0eWxlRnVuY3Rpb24kMShuYW1lLGksdHdlZW5WYWx1ZSh0aGlzLCJzdHlsZS4iK25hbWUsdmFsdWUpKTpzdHlsZUNvbnN0YW50JDEobmFtZSxpLHZhbHVlKSxwcmlvcml0eSl9O2Z1bmN0aW9uIHN0eWxlVHdlZW4obmFtZSx2YWx1ZSxwcmlvcml0eSl7ZnVuY3Rpb24gdHdlZW4oKXt2YXIgbm9kZT10aGlzLGk9dmFsdWUuYXBwbHkobm9kZSxhcmd1bWVudHMpO3JldHVybiBpJiZmdW5jdGlvbih0KXtub2RlLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsaSh0KSxwcmlvcml0eSl9fXR3ZWVuLl92YWx1ZT12YWx1ZTtyZXR1cm4gdHdlZW59dmFyIHRyYW5zaXRpb25fc3R5bGVUd2Vlbj1mdW5jdGlvbihuYW1lLHZhbHVlLHByaW9yaXR5KXt2YXIga2V5PSJzdHlsZS4iKyhuYW1lKz0iIik7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXJldHVybihrZXk9dGhpcy50d2VlbihrZXkpKSYma2V5Ll92YWx1ZTtpZih2YWx1ZT09bnVsbClyZXR1cm4gdGhpcy50d2VlbihrZXksbnVsbCk7aWYodHlwZW9mIHZhbHVlIT09ImZ1bmN0aW9uIil0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHRoaXMudHdlZW4oa2V5LHN0eWxlVHdlZW4obmFtZSx2YWx1ZSxwcmlvcml0eT09bnVsbD8iIjpwcmlvcml0eSkpfTtmdW5jdGlvbiB0ZXh0Q29uc3RhbnQkMSh2YWx1ZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD12YWx1ZX19ZnVuY3Rpb24gdGV4dEZ1bmN0aW9uJDEodmFsdWUpe3JldHVybiBmdW5jdGlvbigpe3ZhciB2YWx1ZTE9dmFsdWUodGhpcyk7dGhpcy50ZXh0Q29udGVudD12YWx1ZTE9PW51bGw/IiI6dmFsdWUxfX12YXIgdHJhbnNpdGlvbl90ZXh0PWZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdGhpcy50d2VlbigidGV4dCIsdHlwZW9mIHZhbHVlPT09ImZ1bmN0aW9uIj90ZXh0RnVuY3Rpb24kMSh0d2VlblZhbHVlKHRoaXMsInRleHQiLHZhbHVlKSk6dGV4dENvbnN0YW50JDEodmFsdWU9PW51bGw/IiI6dmFsdWUrIiIpKX07dmFyIHRyYW5zaXRpb25fdHJhbnNpdGlvbj1mdW5jdGlvbigpe3ZhciBuYW1lPXRoaXMuX25hbWUsaWQwPXRoaXMuX2lkLGlkMT1uZXdJZCgpO2Zvcih2YXIgZ3JvdXBzPXRoaXMuX2dyb3VwcyxtPWdyb3Vwcy5sZW5ndGgsaj0wO2o8bTsrK2ope2Zvcih2YXIgZ3JvdXA9Z3JvdXBzW2pdLG49Z3JvdXAubGVuZ3RoLG5vZGUsaT0wO2k8bjsrK2kpe2lmKG5vZGU9Z3JvdXBbaV0pe3ZhciBpbmhlcml0PWdldCQyKG5vZGUsaWQwKTtzY2hlZHVsZShub2RlLG5hbWUsaWQxLGksZ3JvdXAse3RpbWU6aW5oZXJpdC50aW1lK2luaGVyaXQuZGVsYXkraW5oZXJpdC5kdXJhdGlvbixkZWxheTowLGR1cmF0aW9uOmluaGVyaXQuZHVyYXRpb24sZWFzZTppbmhlcml0LmVhc2V9KX19fXJldHVybiBuZXcgVHJhbnNpdGlvbihncm91cHMsdGhpcy5fcGFyZW50cyxuYW1lLGlkMSl9O3ZhciBpZD0wO2Z1bmN0aW9uIFRyYW5zaXRpb24oZ3JvdXBzLHBhcmVudHMsbmFtZSxpZCl7dGhpcy5fZ3JvdXBzPWdyb3Vwczt0aGlzLl9wYXJlbnRzPXBhcmVudHM7dGhpcy5fbmFtZT1uYW1lO3RoaXMuX2lkPWlkfWZ1bmN0aW9uIHRyYW5zaXRpb24obmFtZSl7cmV0dXJuIHNlbGVjdGlvbigpLnRyYW5zaXRpb24obmFtZSl9ZnVuY3Rpb24gbmV3SWQoKXtyZXR1cm4rK2lkfXZhciBzZWxlY3Rpb25fcHJvdG90eXBlPXNlbGVjdGlvbi5wcm90b3R5cGU7VHJhbnNpdGlvbi5wcm90b3R5cGU9dHJhbnNpdGlvbi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlRyYW5zaXRpb24sc2VsZWN0OnRyYW5zaXRpb25fc2VsZWN0LHNlbGVjdEFsbDp0cmFuc2l0aW9uX3NlbGVjdEFsbCxmaWx0ZXI6dHJhbnNpdGlvbl9maWx0ZXIsbWVyZ2U6dHJhbnNpdGlvbl9tZXJnZSxzZWxlY3Rpb246dHJhbnNpdGlvbl9zZWxlY3Rpb24sdHJhbnNpdGlvbjp0cmFuc2l0aW9uX3RyYW5zaXRpb24sY2FsbDpzZWxlY3Rpb25fcHJvdG90eXBlLmNhbGwsbm9kZXM6c2VsZWN0aW9uX3Byb3RvdHlwZS5ub2Rlcyxub2RlOnNlbGVjdGlvbl9wcm90b3R5cGUubm9kZSxzaXplOnNlbGVjdGlvbl9wcm90b3R5cGUuc2l6ZSxlbXB0eTpzZWxlY3Rpb25fcHJvdG90eXBlLmVtcHR5LGVhY2g6c2VsZWN0aW9uX3Byb3RvdHlwZS5lYWNoLG9uOnRyYW5zaXRpb25fb24sYXR0cjp0cmFuc2l0aW9uX2F0dHIsYXR0clR3ZWVuOnRyYW5zaXRpb25fYXR0clR3ZWVuLHN0eWxlOnRyYW5zaXRpb25fc3R5bGUsc3R5bGVUd2Vlbjp0cmFuc2l0aW9uX3N0eWxlVHdlZW4sdGV4dDp0cmFuc2l0aW9uX3RleHQscmVtb3ZlOnRyYW5zaXRpb25fcmVtb3ZlLHR3ZWVuOnRyYW5zaXRpb25fdHdlZW4sZGVsYXk6dHJhbnNpdGlvbl9kZWxheSxkdXJhdGlvbjp0cmFuc2l0aW9uX2R1cmF0aW9uLGVhc2U6dHJhbnNpdGlvbl9lYXNlfTtmdW5jdGlvbiBjdWJpY0luT3V0KHQpe3JldHVybigodCo9Mik8PTE/dCp0KnQ6KHQtPTIpKnQqdCsyKS8yfXZhciBwaSQyPU1hdGguUEk7dmFyIHRhdSQyPTIqTWF0aC5QSTt2YXIgZGVmYXVsdFRpbWluZz17dGltZTpudWxsLGRlbGF5OjAsZHVyYXRpb246MjUwLGVhc2U6Y3ViaWNJbk91dH07ZnVuY3Rpb24gaW5oZXJpdChub2RlLGlkKXt2YXIgdGltaW5nO3doaWxlKCEodGltaW5nPW5vZGUuX190cmFuc2l0aW9uKXx8ISh0aW1pbmc9dGltaW5nW2lkXSkpe2lmKCEobm9kZT1ub2RlLnBhcmVudE5vZGUpKXtyZXR1cm4gZGVmYXVsdFRpbWluZy50aW1lPW5vdygpLGRlZmF1bHRUaW1pbmd9fXJldHVybiB0aW1pbmd9dmFyIHNlbGVjdGlvbl90cmFuc2l0aW9uPWZ1bmN0aW9uKG5hbWUpe3ZhciBpZCx0aW1pbmc7aWYobmFtZSBpbnN0YW5jZW9mIFRyYW5zaXRpb24pe2lkPW5hbWUuX2lkLG5hbWU9bmFtZS5fbmFtZX1lbHNle2lkPW5ld0lkKCksKHRpbWluZz1kZWZhdWx0VGltaW5nKS50aW1lPW5vdygpLG5hbWU9bmFtZT09bnVsbD9udWxsOm5hbWUrIiJ9Zm9yKHZhciBncm91cHM9dGhpcy5fZ3JvdXBzLG09Z3JvdXBzLmxlbmd0aCxqPTA7ajxtOysrail7Zm9yKHZhciBncm91cD1ncm91cHNbal0sbj1ncm91cC5sZW5ndGgsbm9kZSxpPTA7aTxuOysraSl7aWYobm9kZT1ncm91cFtpXSl7c2NoZWR1bGUobm9kZSxuYW1lLGlkLGksZ3JvdXAsdGltaW5nfHxpbmhlcml0KG5vZGUsaWQpKX19fXJldHVybiBuZXcgVHJhbnNpdGlvbihncm91cHMsdGhpcy5fcGFyZW50cyxuYW1lLGlkKX07c2VsZWN0aW9uLnByb3RvdHlwZS5pbnRlcnJ1cHQ9c2VsZWN0aW9uX2ludGVycnVwdDtzZWxlY3Rpb24ucHJvdG90eXBlLnRyYW5zaXRpb249c2VsZWN0aW9uX3RyYW5zaXRpb247dmFyIGNvbnN0YW50JDU9ZnVuY3Rpb24oeCl7cmV0dXJuIGZ1bmN0aW9uIGNvbnN0YW50KCl7cmV0dXJuIHh9fTt2YXIgZXBzaWxvbiQyPTFlLTEyO3ZhciBwaSQzPU1hdGguUEk7dmFyIGhhbGZQaSQyPXBpJDMvMjt2YXIgdGF1JDM9MipwaSQzO2Z1bmN0aW9uIGFyY0lubmVyUmFkaXVzJDEoZCl7cmV0dXJuIGQuaW5uZXJSYWRpdXN9ZnVuY3Rpb24gYXJjT3V0ZXJSYWRpdXMkMShkKXtyZXR1cm4gZC5vdXRlclJhZGl1c31mdW5jdGlvbiBhcmNTdGFydEFuZ2xlJDEoZCl7cmV0dXJuIGQuc3RhcnRBbmdsZX1mdW5jdGlvbiBhcmNFbmRBbmdsZSQxKGQpe3JldHVybiBkLmVuZEFuZ2xlfWZ1bmN0aW9uIGFyY1BhZEFuZ2xlJDEoZCl7cmV0dXJuIGQmJmQucGFkQW5nbGV9ZnVuY3Rpb24gYXNpbiQxKHgpe3JldHVybiB4Pj0xP2hhbGZQaSQyOng8PS0xPy1oYWxmUGkkMjpNYXRoLmFzaW4oeCl9ZnVuY3Rpb24gaW50ZXJzZWN0JDEoeDAseTAseDEseTEseDIseTIseDMseTMpe3ZhciB4MTA9eDEteDAseTEwPXkxLXkwLHgzMj14My14Mix5MzI9eTMteTIsdD0oeDMyKih5MC15MikteTMyKih4MC14MikpLyh5MzIqeDEwLXgzMip5MTApO3JldHVyblt4MCt0KngxMCx5MCt0KnkxMF19ZnVuY3Rpb24gY29ybmVyVGFuZ2VudHMkMSh4MCx5MCx4MSx5MSxyMSxyYyxjdyl7dmFyIHgwMT14MC14MSx5MDE9eTAteTEsbG89KGN3P3JjOi1yYykvTWF0aC5zcXJ0KHgwMSp4MDEreTAxKnkwMSksb3g9bG8qeTAxLG95PS1sbyp4MDEseDExPXgwK294LHkxMT15MCtveSx4MTA9eDErb3gseTEwPXkxK295LHgwMD0oeDExK3gxMCkvMix5MDA9KHkxMSt5MTApLzIsZHg9eDEwLXgxMSxkeT15MTAteTExLGQyPWR4KmR4K2R5KmR5LHI9cjEtcmMsRD14MTEqeTEwLXgxMCp5MTEsZD0oZHk8MD8tMToxKSpNYXRoLnNxcnQoTWF0aC5tYXgoMCxyKnIqZDItRCpEKSksY3gwPShEKmR5LWR4KmQpL2QyLGN5MD0oLUQqZHgtZHkqZCkvZDIsY3gxPShEKmR5K2R4KmQpL2QyLGN5MT0oLUQqZHgrZHkqZCkvZDIsZHgwPWN4MC14MDAsZHkwPWN5MC15MDAsZHgxPWN4MS14MDAsZHkxPWN5MS15MDA7aWYoZHgwKmR4MCtkeTAqZHkwPmR4MSpkeDErZHkxKmR5MSljeDA9Y3gxLGN5MD1jeTE7cmV0dXJue2N4OmN4MCxjeTpjeTAseDAxOi1veCx5MDE6LW95LHgxMTpjeDAqKHIxL3ItMSkseTExOmN5MCoocjEvci0xKX19dmFyIGFyYyQxPWZ1bmN0aW9uKCl7dmFyIGlubmVyUmFkaXVzPWFyY0lubmVyUmFkaXVzJDEsb3V0ZXJSYWRpdXM9YXJjT3V0ZXJSYWRpdXMkMSxjb3JuZXJSYWRpdXM9Y29uc3RhbnQkNSgwKSxwYWRSYWRpdXM9bnVsbCxzdGFydEFuZ2xlPWFyY1N0YXJ0QW5nbGUkMSxlbmRBbmdsZT1hcmNFbmRBbmdsZSQxLHBhZEFuZ2xlPWFyY1BhZEFuZ2xlJDEsY29udGV4dD1udWxsO2Z1bmN0aW9uIGFyYygpe3ZhciBidWZmZXIscixyMD0raW5uZXJSYWRpdXMuYXBwbHkodGhpcyxhcmd1bWVudHMpLHIxPStvdXRlclJhZGl1cy5hcHBseSh0aGlzLGFyZ3VtZW50cyksYTA9c3RhcnRBbmdsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyktaGFsZlBpJDIsYTE9ZW5kQW5nbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpLWhhbGZQaSQyLGRhPU1hdGguYWJzKGExLWEwKSxjdz1hMT5hMDtpZighY29udGV4dCljb250ZXh0PWJ1ZmZlcj1wYXRoKCk7aWYocjE8cjApcj1yMSxyMT1yMCxyMD1yO2lmKCEocjE+ZXBzaWxvbiQyKSljb250ZXh0Lm1vdmVUbygwLDApO2Vsc2UgaWYoZGE+dGF1JDMtZXBzaWxvbiQyKXtjb250ZXh0Lm1vdmVUbyhyMSpNYXRoLmNvcyhhMCkscjEqTWF0aC5zaW4oYTApKTtjb250ZXh0LmFyYygwLDAscjEsYTAsYTEsIWN3KTtpZihyMD5lcHNpbG9uJDIpe2NvbnRleHQubW92ZVRvKHIwKk1hdGguY29zKGExKSxyMCpNYXRoLnNpbihhMSkpO2NvbnRleHQuYXJjKDAsMCxyMCxhMSxhMCxjdyl9fWVsc2V7dmFyIGEwMT1hMCxhMTE9YTEsYTAwPWEwLGExMD1hMSxkYTA9ZGEsZGExPWRhLGFwPXBhZEFuZ2xlLmFwcGx5KHRoaXMsYXJndW1lbnRzKS8yLHJwPWFwPmVwc2lsb24kMiYmKHBhZFJhZGl1cz8rcGFkUmFkaXVzLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpNYXRoLnNxcnQocjAqcjArcjEqcjEpKSxyYz1NYXRoLm1pbihNYXRoLmFicyhyMS1yMCkvMiwrY29ybmVyUmFkaXVzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkscmMwPXJjLHJjMT1yYyx0MCx0MTtpZihycD5lcHNpbG9uJDIpe3ZhciBwMD1hc2luJDEocnAvcjAqTWF0aC5zaW4oYXApKSxwMT1hc2luJDEocnAvcjEqTWF0aC5zaW4oYXApKTtpZigoZGEwLT1wMCoyKT5lcHNpbG9uJDIpcDAqPWN3PzE6LTEsYTAwKz1wMCxhMTAtPXAwO2Vsc2UgZGEwPTAsYTAwPWExMD0oYTArYTEpLzI7aWYoKGRhMS09cDEqMik+ZXBzaWxvbiQyKXAxKj1jdz8xOi0xLGEwMSs9cDEsYTExLT1wMTtlbHNlIGRhMT0wLGEwMT1hMTE9KGEwK2ExKS8yfXZhciB4MDE9cjEqTWF0aC5jb3MoYTAxKSx5MDE9cjEqTWF0aC5zaW4oYTAxKSx4MTA9cjAqTWF0aC5jb3MoYTEwKSx5MTA9cjAqTWF0aC5zaW4oYTEwKTtpZihyYz5lcHNpbG9uJDIpe3ZhciB4MTE9cjEqTWF0aC5jb3MoYTExKSx5MTE9cjEqTWF0aC5zaW4oYTExKSx4MDA9cjAqTWF0aC5jb3MoYTAwKSx5MDA9cjAqTWF0aC5zaW4oYTAwKTtpZihkYTxwaSQzKXt2YXIgb2M9ZGEwPmVwc2lsb24kMj9pbnRlcnNlY3QkMSh4MDEseTAxLHgwMCx5MDAseDExLHkxMSx4MTAseTEwKTpbeDEwLHkxMF0sYXg9eDAxLW9jWzBdLGF5PXkwMS1vY1sxXSxieD14MTEtb2NbMF0sYnk9eTExLW9jWzFdLGtjPTEvTWF0aC5zaW4oTWF0aC5hY29zKChheCpieCtheSpieSkvKE1hdGguc3FydChheCpheCtheSpheSkqTWF0aC5zcXJ0KGJ4KmJ4K2J5KmJ5KSkpLzIpLGxjPU1hdGguc3FydChvY1swXSpvY1swXStvY1sxXSpvY1sxXSk7cmMwPU1hdGgubWluKHJjLChyMC1sYykvKGtjLTEpKTtyYzE9TWF0aC5taW4ocmMsKHIxLWxjKS8oa2MrMSkpfX1pZighKGRhMT5lcHNpbG9uJDIpKWNvbnRleHQubW92ZVRvKHgwMSx5MDEpO2Vsc2UgaWYocmMxPmVwc2lsb24kMil7dDA9Y29ybmVyVGFuZ2VudHMkMSh4MDAseTAwLHgwMSx5MDEscjEscmMxLGN3KTt0MT1jb3JuZXJUYW5nZW50cyQxKHgxMSx5MTEseDEwLHkxMCxyMSxyYzEsY3cpO2NvbnRleHQubW92ZVRvKHQwLmN4K3QwLngwMSx0MC5jeSt0MC55MDEpO2lmKHJjMTxyYyljb250ZXh0LmFyYyh0MC5jeCx0MC5jeSxyYzEsTWF0aC5hdGFuMih0MC55MDEsdDAueDAxKSxNYXRoLmF0YW4yKHQxLnkwMSx0MS54MDEpLCFjdyk7ZWxzZXtjb250ZXh0LmFyYyh0MC5jeCx0MC5jeSxyYzEsTWF0aC5hdGFuMih0MC55MDEsdDAueDAxKSxNYXRoLmF0YW4yKHQwLnkxMSx0MC54MTEpLCFjdyk7Y29udGV4dC5hcmMoMCwwLHIxLE1hdGguYXRhbjIodDAuY3krdDAueTExLHQwLmN4K3QwLngxMSksTWF0aC5hdGFuMih0MS5jeSt0MS55MTEsdDEuY3grdDEueDExKSwhY3cpO2NvbnRleHQuYXJjKHQxLmN4LHQxLmN5LHJjMSxNYXRoLmF0YW4yKHQxLnkxMSx0MS54MTEpLE1hdGguYXRhbjIodDEueTAxLHQxLngwMSksIWN3KX19ZWxzZSBjb250ZXh0Lm1vdmVUbyh4MDEseTAxKSxjb250ZXh0LmFyYygwLDAscjEsYTAxLGExMSwhY3cpO2lmKCEocjA+ZXBzaWxvbiQyKXx8IShkYTA+ZXBzaWxvbiQyKSljb250ZXh0LmxpbmVUbyh4MTAseTEwKTtlbHNlIGlmKHJjMD5lcHNpbG9uJDIpe3QwPWNvcm5lclRhbmdlbnRzJDEoeDEwLHkxMCx4MTEseTExLHIwLC1yYzAsY3cpO3QxPWNvcm5lclRhbmdlbnRzJDEoeDAxLHkwMSx4MDAseTAwLHIwLC1yYzAsY3cpO2NvbnRleHQubGluZVRvKHQwLmN4K3QwLngwMSx0MC5jeSt0MC55MDEpO2lmKHJjMDxyYyljb250ZXh0LmFyYyh0MC5jeCx0MC5jeSxyYzAsTWF0aC5hdGFuMih0MC55MDEsdDAueDAxKSxNYXRoLmF0YW4yKHQxLnkwMSx0MS54MDEpLCFjdyk7ZWxzZXtjb250ZXh0LmFyYyh0MC5jeCx0MC5jeSxyYzAsTWF0aC5hdGFuMih0MC55MDEsdDAueDAxKSxNYXRoLmF0YW4yKHQwLnkxMSx0MC54MTEpLCFjdyk7Y29udGV4dC5hcmMoMCwwLHIwLE1hdGguYXRhbjIodDAuY3krdDAueTExLHQwLmN4K3QwLngxMSksTWF0aC5hdGFuMih0MS5jeSt0MS55MTEsdDEuY3grdDEueDExKSxjdyk7Y29udGV4dC5hcmModDEuY3gsdDEuY3kscmMwLE1hdGguYXRhbjIodDEueTExLHQxLngxMSksTWF0aC5hdGFuMih0MS55MDEsdDEueDAxKSwhY3cpfX1lbHNlIGNvbnRleHQuYXJjKDAsMCxyMCxhMTAsYTAwLGN3KX1jb250ZXh0LmNsb3NlUGF0aCgpO2lmKGJ1ZmZlcilyZXR1cm4gY29udGV4dD1udWxsLGJ1ZmZlcisiInx8bnVsbH1hcmMuY2VudHJvaWQ9ZnVuY3Rpb24oKXt2YXIgcj0oK2lubmVyUmFkaXVzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSsgK291dGVyUmFkaXVzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMixhPSgrc3RhcnRBbmdsZS5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtlbmRBbmdsZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzItcGkkMy8yO3JldHVybltNYXRoLmNvcyhhKSpyLE1hdGguc2luKGEpKnJdfTthcmMuaW5uZXJSYWRpdXM9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGlubmVyUmFkaXVzPXR5cGVvZiBfPT09ImZ1bmN0aW9uIj9fOmNvbnN0YW50JDUoK18pLGFyYyk6aW5uZXJSYWRpdXN9O2FyYy5vdXRlclJhZGl1cz1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ob3V0ZXJSYWRpdXM9dHlwZW9mIF89PT0iZnVuY3Rpb24iP186Y29uc3RhbnQkNSgrXyksYXJjKTpvdXRlclJhZGl1c307YXJjLmNvcm5lclJhZGl1cz1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oY29ybmVyUmFkaXVzPXR5cGVvZiBfPT09ImZ1bmN0aW9uIj9fOmNvbnN0YW50JDUoK18pLGFyYyk6Y29ybmVyUmFkaXVzfTthcmMucGFkUmFkaXVzPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwYWRSYWRpdXM9Xz09bnVsbD9udWxsOnR5cGVvZiBfPT09ImZ1bmN0aW9uIj9fOmNvbnN0YW50JDUoK18pLGFyYyk6cGFkUmFkaXVzfTthcmMuc3RhcnRBbmdsZT1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oc3RhcnRBbmdsZT10eXBlb2YgXz09PSJmdW5jdGlvbiI/Xzpjb25zdGFudCQ1KCtfKSxhcmMpOnN0YXJ0QW5nbGV9O2FyYy5lbmRBbmdsZT1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZW5kQW5nbGU9dHlwZW9mIF89PT0iZnVuY3Rpb24iP186Y29uc3RhbnQkNSgrXyksYXJjKTplbmRBbmdsZX07YXJjLnBhZEFuZ2xlPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwYWRBbmdsZT10eXBlb2YgXz09PSJmdW5jdGlvbiI/Xzpjb25zdGFudCQ1KCtfKSxhcmMpOnBhZEFuZ2xlfTthcmMuY29udGV4dD1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oY29udGV4dD1fPT1udWxsP251bGw6XyxhcmMpOmNvbnRleHR9O3JldHVybiBhcmN9O2Z1bmN0aW9uIExpbmVhciQxKGNvbnRleHQpe3RoaXMuX2NvbnRleHQ9Y29udGV4dH1MaW5lYXIkMS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbiBhcmVhU3RhcnQoKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24gYXJlYUVuZCgpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24gbGluZVN0YXJ0KCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbiBsaW5lRW5kKCl7aWYodGhpcy5fbGluZXx8dGhpcy5fbGluZSE9PTAmJnRoaXMuX3BvaW50PT09MSl0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO3RoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbiBwb2ludCh4LHkpe3g9K3gseT0reTtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO3RoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8oeCx5KTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LHkpO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2RlZmF1bHQ6dGhpcy5fY29udGV4dC5saW5lVG8oeCx5KTticmVha319fTt2YXIgY3VydmVMaW5lYXIkMT1mdW5jdGlvbihjb250ZXh0KXtyZXR1cm4gbmV3IExpbmVhciQxKGNvbnRleHQpfTtmdW5jdGlvbiB4JDMocCl7cmV0dXJuIHBbMF19ZnVuY3Rpb24geSQzKHApe3JldHVybiBwWzFdfXZhciBsaW5lJDE9ZnVuY3Rpb24oKXt2YXIgeCQkMT14JDMseSQkMT15JDMsZGVmaW5lZD1jb25zdGFudCQ1KHRydWUpLGNvbnRleHQ9bnVsbCxjdXJ2ZT1jdXJ2ZUxpbmVhciQxLG91dHB1dD1udWxsO2Z1bmN0aW9uIGxpbmUoZGF0YSl7dmFyIGksbj1kYXRhLmxlbmd0aCxkLGRlZmluZWQwPWZhbHNlLGJ1ZmZlcjtpZihjb250ZXh0PT1udWxsKW91dHB1dD1jdXJ2ZShidWZmZXI9cGF0aCgpKTtmb3IoaT0wO2k8PW47KytpKXtpZighKGk8biYmZGVmaW5lZChkPWRhdGFbaV0saSxkYXRhKSk9PT1kZWZpbmVkMCl7aWYoZGVmaW5lZDA9IWRlZmluZWQwKW91dHB1dC5saW5lU3RhcnQoKTtlbHNlIG91dHB1dC5saW5lRW5kKCl9aWYoZGVmaW5lZDApb3V0cHV0LnBvaW50KCt4JCQxKGQsaSxkYXRhKSwreSQkMShkLGksZGF0YSkpfWlmKGJ1ZmZlcilyZXR1cm4gb3V0cHV0PW51bGwsYnVmZmVyKyIifHxudWxsfWxpbmUueD1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeCQkMT10eXBlb2YgXz09PSJmdW5jdGlvbiI/Xzpjb25zdGFudCQ1KCtfKSxsaW5lKTp4JCQxfTtsaW5lLnk9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHkkJDE9dHlwZW9mIF89PT0iZnVuY3Rpb24iP186Y29uc3RhbnQkNSgrXyksbGluZSk6eSQkMX07bGluZS5kZWZpbmVkPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkZWZpbmVkPXR5cGVvZiBfPT09ImZ1bmN0aW9uIj9fOmNvbnN0YW50JDUoISFfKSxsaW5lKTpkZWZpbmVkfTtsaW5lLmN1cnZlPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjdXJ2ZT1fLGNvbnRleHQhPW51bGwmJihvdXRwdXQ9Y3VydmUoY29udGV4dCkpLGxpbmUpOmN1cnZlfTtsaW5lLmNvbnRleHQ9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KF89PW51bGw/Y29udGV4dD1vdXRwdXQ9bnVsbDpvdXRwdXQ9Y3VydmUoY29udGV4dD1fKSxsaW5lKTpjb250ZXh0fTtyZXR1cm4gbGluZX07dmFyIGFyZWEkMT1mdW5jdGlvbigpe3ZhciB4MD14JDMseDE9bnVsbCx5MD1jb25zdGFudCQ1KDApLHkxPXkkMyxkZWZpbmVkPWNvbnN0YW50JDUodHJ1ZSksY29udGV4dD1udWxsLGN1cnZlPWN1cnZlTGluZWFyJDEsb3V0cHV0PW51bGw7ZnVuY3Rpb24gYXJlYShkYXRhKXt2YXIgaSxqLGssbj1kYXRhLmxlbmd0aCxkLGRlZmluZWQwPWZhbHNlLGJ1ZmZlcix4MHo9bmV3IEFycmF5KG4pLHkwej1uZXcgQXJyYXkobik7aWYoY29udGV4dD09bnVsbClvdXRwdXQ9Y3VydmUoYnVmZmVyPXBhdGgoKSk7Zm9yKGk9MDtpPD1uOysraSl7aWYoIShpPG4mJmRlZmluZWQoZD1kYXRhW2ldLGksZGF0YSkpPT09ZGVmaW5lZDApe2lmKGRlZmluZWQwPSFkZWZpbmVkMCl7aj1pO291dHB1dC5hcmVhU3RhcnQoKTtvdXRwdXQubGluZVN0YXJ0KCl9ZWxzZXtvdXRwdXQubGluZUVuZCgpO291dHB1dC5saW5lU3RhcnQoKTtmb3Ioaz1pLTE7az49ajstLWspe291dHB1dC5wb2ludCh4MHpba10seTB6W2tdKX1vdXRwdXQubGluZUVuZCgpO291dHB1dC5hcmVhRW5kKCl9fWlmKGRlZmluZWQwKXt4MHpbaV09K3gwKGQsaSxkYXRhKSx5MHpbaV09K3kwKGQsaSxkYXRhKTtvdXRwdXQucG9pbnQoeDE/K3gxKGQsaSxkYXRhKTp4MHpbaV0seTE/K3kxKGQsaSxkYXRhKTp5MHpbaV0pfX1pZihidWZmZXIpcmV0dXJuIG91dHB1dD1udWxsLGJ1ZmZlcisiInx8bnVsbH1mdW5jdGlvbiBhcmVhbGluZSgpe3JldHVybiBsaW5lJDEoKS5kZWZpbmVkKGRlZmluZWQpLmN1cnZlKGN1cnZlKS5jb250ZXh0KGNvbnRleHQpfWFyZWEueD1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeDA9dHlwZW9mIF89PT0iZnVuY3Rpb24iP186Y29uc3RhbnQkNSgrXykseDE9bnVsbCxhcmVhKTp4MH07YXJlYS54MD1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeDA9dHlwZW9mIF89PT0iZnVuY3Rpb24iP186Y29uc3RhbnQkNSgrXyksYXJlYSk6eDB9O2FyZWEueDE9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHgxPV89PW51bGw/bnVsbDp0eXBlb2YgXz09PSJmdW5jdGlvbiI/Xzpjb25zdGFudCQ1KCtfKSxhcmVhKTp4MX07YXJlYS55PWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5MD10eXBlb2YgXz09PSJmdW5jdGlvbiI/Xzpjb25zdGFudCQ1KCtfKSx5MT1udWxsLGFyZWEpOnkwfTthcmVhLnkwPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5MD10eXBlb2YgXz09PSJmdW5jdGlvbiI/Xzpjb25zdGFudCQ1KCtfKSxhcmVhKTp5MH07YXJlYS55MT1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeTE9Xz09bnVsbD9udWxsOnR5cGVvZiBfPT09ImZ1bmN0aW9uIj9fOmNvbnN0YW50JDUoK18pLGFyZWEpOnkxfTthcmVhLmxpbmVYMD1hcmVhLmxpbmVZMD1mdW5jdGlvbigpe3JldHVybiBhcmVhbGluZSgpLngoeDApLnkoeTApfTthcmVhLmxpbmVZMT1mdW5jdGlvbigpe3JldHVybiBhcmVhbGluZSgpLngoeDApLnkoeTEpfTthcmVhLmxpbmVYMT1mdW5jdGlvbigpe3JldHVybiBhcmVhbGluZSgpLngoeDEpLnkoeTApfTthcmVhLmRlZmluZWQ9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGRlZmluZWQ9dHlwZW9mIF89PT0iZnVuY3Rpb24iP186Y29uc3RhbnQkNSghIV8pLGFyZWEpOmRlZmluZWR9O2FyZWEuY3VydmU9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGN1cnZlPV8sY29udGV4dCE9bnVsbCYmKG91dHB1dD1jdXJ2ZShjb250ZXh0KSksYXJlYSk6Y3VydmV9O2FyZWEuY29udGV4dD1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oXz09bnVsbD9jb250ZXh0PW91dHB1dD1udWxsOm91dHB1dD1jdXJ2ZShjb250ZXh0PV8pLGFyZWEpOmNvbnRleHR9O3JldHVybiBhcmVhfTt2YXIgZGVzY2VuZGluZyQzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGI8YT8tMTpiPmE/MTpiPj1hPzA6TmFOfTt2YXIgaWRlbnRpdHkkMz1mdW5jdGlvbihkKXtyZXR1cm4gZH07dmFyIHBpZSQxPWZ1bmN0aW9uKCl7dmFyIHZhbHVlPWlkZW50aXR5JDMsc29ydFZhbHVlcz1kZXNjZW5kaW5nJDMsc29ydD1udWxsLHN0YXJ0QW5nbGU9Y29uc3RhbnQkNSgwKSxlbmRBbmdsZT1jb25zdGFudCQ1KHRhdSQzKSxwYWRBbmdsZT1jb25zdGFudCQ1KDApO2Z1bmN0aW9uIHBpZShkYXRhKXt2YXIgaSxuPWRhdGEubGVuZ3RoLGosayxzdW09MCxpbmRleD1uZXcgQXJyYXkobiksYXJjcz1uZXcgQXJyYXkobiksYTA9K3N0YXJ0QW5nbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpLGRhPU1hdGgubWluKHRhdSQzLE1hdGgubWF4KC10YXUkMyxlbmRBbmdsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyktYTApKSxhMSxwPU1hdGgubWluKE1hdGguYWJzKGRhKS9uLHBhZEFuZ2xlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkscGE9cCooZGE8MD8tMToxKSx2O2ZvcihpPTA7aTxuOysraSl7aWYoKHY9YXJjc1tpbmRleFtpXT1pXT0rdmFsdWUoZGF0YVtpXSxpLGRhdGEpKT4wKXtzdW0rPXZ9fWlmKHNvcnRWYWx1ZXMhPW51bGwpaW5kZXguc29ydChmdW5jdGlvbihpLGope3JldHVybiBzb3J0VmFsdWVzKGFyY3NbaV0sYXJjc1tqXSl9KTtlbHNlIGlmKHNvcnQhPW51bGwpaW5kZXguc29ydChmdW5jdGlvbihpLGope3JldHVybiBzb3J0KGRhdGFbaV0sZGF0YVtqXSl9KTtmb3IoaT0wLGs9c3VtPyhkYS1uKnBhKS9zdW06MDtpPG47KytpLGEwPWExKXtqPWluZGV4W2ldLHY9YXJjc1tqXSxhMT1hMCsodj4wP3YqazowKStwYSxhcmNzW2pdPXtkYXRhOmRhdGFbal0saW5kZXg6aSx2YWx1ZTp2LHN0YXJ0QW5nbGU6YTAsZW5kQW5nbGU6YTEscGFkQW5nbGU6cH19cmV0dXJuIGFyY3N9cGllLnZhbHVlPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh2YWx1ZT10eXBlb2YgXz09PSJmdW5jdGlvbiI/Xzpjb25zdGFudCQ1KCtfKSxwaWUpOnZhbHVlfTtwaWUuc29ydFZhbHVlcz1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oc29ydFZhbHVlcz1fLHNvcnQ9bnVsbCxwaWUpOnNvcnRWYWx1ZXN9O3BpZS5zb3J0PWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzb3J0PV8sc29ydFZhbHVlcz1udWxsLHBpZSk6c29ydH07cGllLnN0YXJ0QW5nbGU9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHN0YXJ0QW5nbGU9dHlwZW9mIF89PT0iZnVuY3Rpb24iP186Y29uc3RhbnQkNSgrXykscGllKTpzdGFydEFuZ2xlfTtwaWUuZW5kQW5nbGU9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGVuZEFuZ2xlPXR5cGVvZiBfPT09ImZ1bmN0aW9uIj9fOmNvbnN0YW50JDUoK18pLHBpZSk6ZW5kQW5nbGV9O3BpZS5wYWRBbmdsZT1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocGFkQW5nbGU9dHlwZW9mIF89PT0iZnVuY3Rpb24iP186Y29uc3RhbnQkNSgrXykscGllKTpwYWRBbmdsZX07cmV0dXJuIHBpZX07dmFyIGN1cnZlUmFkaWFsTGluZWFyJDE9Y3VydmVSYWRpYWwkMShjdXJ2ZUxpbmVhciQxKTtmdW5jdGlvbiBSYWRpYWwkMShjdXJ2ZSl7dGhpcy5fY3VydmU9Y3VydmV9UmFkaWFsJDEucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24gYXJlYVN0YXJ0KCl7dGhpcy5fY3VydmUuYXJlYVN0YXJ0KCl9LGFyZWFFbmQ6ZnVuY3Rpb24gYXJlYUVuZCgpe3RoaXMuX2N1cnZlLmFyZWFFbmQoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uIGxpbmVTdGFydCgpe3RoaXMuX2N1cnZlLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uIGxpbmVFbmQoKXt0aGlzLl9jdXJ2ZS5saW5lRW5kKCl9LHBvaW50OmZ1bmN0aW9uIHBvaW50KGEscil7dGhpcy5fY3VydmUucG9pbnQocipNYXRoLnNpbihhKSxyKi1NYXRoLmNvcyhhKSl9fTtmdW5jdGlvbiBjdXJ2ZVJhZGlhbCQxKGN1cnZlKXtmdW5jdGlvbiByYWRpYWwoY29udGV4dCl7cmV0dXJuIG5ldyBSYWRpYWwkMShjdXJ2ZShjb250ZXh0KSl9cmFkaWFsLl9jdXJ2ZT1jdXJ2ZTtyZXR1cm4gcmFkaWFsfWZ1bmN0aW9uIHJhZGlhbExpbmUkMihsKXt2YXIgYz1sLmN1cnZlO2wuYW5nbGU9bC54LGRlbGV0ZSBsLng7bC5yYWRpdXM9bC55LGRlbGV0ZSBsLnk7bC5jdXJ2ZT1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9jKGN1cnZlUmFkaWFsJDEoXykpOmMoKS5fY3VydmV9O3JldHVybiBsfXZhciByYWRpYWxMaW5lJDM9ZnVuY3Rpb24oKXtyZXR1cm4gcmFkaWFsTGluZSQyKGxpbmUkMSgpLmN1cnZlKGN1cnZlUmFkaWFsTGluZWFyJDEpKX07dmFyIHJhZGlhbEFyZWEkMT1mdW5jdGlvbigpe3ZhciBhPWFyZWEkMSgpLmN1cnZlKGN1cnZlUmFkaWFsTGluZWFyJDEpLGM9YS5jdXJ2ZSx4MD1hLmxpbmVYMCx4MT1hLmxpbmVYMSx5MD1hLmxpbmVZMCx5MT1hLmxpbmVZMTthLmFuZ2xlPWEueCxkZWxldGUgYS54O2Euc3RhcnRBbmdsZT1hLngwLGRlbGV0ZSBhLngwO2EuZW5kQW5nbGU9YS54MSxkZWxldGUgYS54MTthLnJhZGl1cz1hLnksZGVsZXRlIGEueTthLmlubmVyUmFkaXVzPWEueTAsZGVsZXRlIGEueTA7YS5vdXRlclJhZGl1cz1hLnkxLGRlbGV0ZSBhLnkxO2EubGluZVN0YXJ0QW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gcmFkaWFsTGluZSQyKHgwKCkpfSxkZWxldGUgYS5saW5lWDA7YS5saW5lRW5kQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gcmFkaWFsTGluZSQyKHgxKCkpfSxkZWxldGUgYS5saW5lWDE7YS5saW5lSW5uZXJSYWRpdXM9ZnVuY3Rpb24oKXtyZXR1cm4gcmFkaWFsTGluZSQyKHkwKCkpfSxkZWxldGUgYS5saW5lWTA7YS5saW5lT3V0ZXJSYWRpdXM9ZnVuY3Rpb24oKXtyZXR1cm4gcmFkaWFsTGluZSQyKHkxKCkpfSxkZWxldGUgYS5saW5lWTE7YS5jdXJ2ZT1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9jKGN1cnZlUmFkaWFsJDEoXykpOmMoKS5fY3VydmV9O3JldHVybiBhfTt2YXIgY2lyY2xlJDM9e2RyYXc6ZnVuY3Rpb24gZHJhdyhjb250ZXh0LHNpemUpe3ZhciByPU1hdGguc3FydChzaXplL3BpJDMpO2NvbnRleHQubW92ZVRvKHIsMCk7Y29udGV4dC5hcmMoMCwwLHIsMCx0YXUkMyl9fTt2YXIgY3Jvc3MkMj17ZHJhdzpmdW5jdGlvbiBkcmF3KGNvbnRleHQsc2l6ZSl7dmFyIHI9TWF0aC5zcXJ0KHNpemUvNSkvMjtjb250ZXh0Lm1vdmVUbygtMypyLC1yKTtjb250ZXh0LmxpbmVUbygtciwtcik7Y29udGV4dC5saW5lVG8oLXIsLTMqcik7Y29udGV4dC5saW5lVG8ociwtMypyKTtjb250ZXh0LmxpbmVUbyhyLC1yKTtjb250ZXh0LmxpbmVUbygzKnIsLXIpO2NvbnRleHQubGluZVRvKDMqcixyKTtjb250ZXh0LmxpbmVUbyhyLHIpO2NvbnRleHQubGluZVRvKHIsMypyKTtjb250ZXh0LmxpbmVUbygtciwzKnIpO2NvbnRleHQubGluZVRvKC1yLHIpO2NvbnRleHQubGluZVRvKC0zKnIscik7Y29udGV4dC5jbG9zZVBhdGgoKX19O3ZhciB0YW4zMCQxPU1hdGguc3FydCgxLzMpO3ZhciB0YW4zMF8yJDE9dGFuMzAkMSoyO3ZhciBkaWFtb25kJDE9e2RyYXc6ZnVuY3Rpb24gZHJhdyhjb250ZXh0LHNpemUpe3ZhciB5PU1hdGguc3FydChzaXplL3RhbjMwXzIkMSkseD15KnRhbjMwJDE7Y29udGV4dC5tb3ZlVG8oMCwteSk7Y29udGV4dC5saW5lVG8oeCwwKTtjb250ZXh0LmxpbmVUbygwLHkpO2NvbnRleHQubGluZVRvKC14LDApO2NvbnRleHQuY2xvc2VQYXRoKCl9fTt2YXIga2EkMT0uODkwODEzMDkxNTI5Mjg1Mjt2YXIga3IkMT1NYXRoLnNpbihwaSQzLzEwKS9NYXRoLnNpbig3KnBpJDMvMTApO3ZhciBreCQxPU1hdGguc2luKHRhdSQzLzEwKSprciQxO3ZhciBreSQxPS1NYXRoLmNvcyh0YXUkMy8xMCkqa3IkMTt2YXIgc3RhciQxPXtkcmF3OmZ1bmN0aW9uIGRyYXcoY29udGV4dCxzaXplKXt2YXIgcj1NYXRoLnNxcnQoc2l6ZSprYSQxKSx4PWt4JDEqcix5PWt5JDEqcjtjb250ZXh0Lm1vdmVUbygwLC1yKTtjb250ZXh0LmxpbmVUbyh4LHkpO2Zvcih2YXIgaT0xO2k8NTsrK2kpe3ZhciBhPXRhdSQzKmkvNSxjPU1hdGguY29zKGEpLHM9TWF0aC5zaW4oYSk7Y29udGV4dC5saW5lVG8ocypyLC1jKnIpO2NvbnRleHQubGluZVRvKGMqeC1zKnkscyp4K2MqeSl9Y29udGV4dC5jbG9zZVBhdGgoKX19O3ZhciBzcXVhcmUkMT17ZHJhdzpmdW5jdGlvbiBkcmF3KGNvbnRleHQsc2l6ZSl7dmFyIHc9TWF0aC5zcXJ0KHNpemUpLHg9LXcvMjtjb250ZXh0LnJlY3QoeCx4LHcsdyl9fTt2YXIgc3FydDMkMT1NYXRoLnNxcnQoMyk7dmFyIHRyaWFuZ2xlJDE9e2RyYXc6ZnVuY3Rpb24gZHJhdyhjb250ZXh0LHNpemUpe3ZhciB5PS1NYXRoLnNxcnQoc2l6ZS8oc3FydDMkMSozKSk7Y29udGV4dC5tb3ZlVG8oMCx5KjIpO2NvbnRleHQubGluZVRvKC1zcXJ0MyQxKnksLXkpO2NvbnRleHQubGluZVRvKHNxcnQzJDEqeSwteSk7Y29udGV4dC5jbG9zZVBhdGgoKX19O3ZhciBjJDE9LS41O3ZhciBzJDE9TWF0aC5zcXJ0KDMpLzI7dmFyIGskMT0xL01hdGguc3FydCgxMik7dmFyIGEkMT0oayQxLzIrMSkqMzt2YXIgd3llJDE9e2RyYXc6ZnVuY3Rpb24gZHJhdyhjb250ZXh0LHNpemUpe3ZhciByPU1hdGguc3FydChzaXplL2EkMSkseDA9ci8yLHkwPXIqayQxLHgxPXgwLHkxPXIqayQxK3IseDI9LXgxLHkyPXkxO2NvbnRleHQubW92ZVRvKHgwLHkwKTtjb250ZXh0LmxpbmVUbyh4MSx5MSk7Y29udGV4dC5saW5lVG8oeDIseTIpO2NvbnRleHQubGluZVRvKGMkMSp4MC1zJDEqeTAscyQxKngwK2MkMSp5MCk7Y29udGV4dC5saW5lVG8oYyQxKngxLXMkMSp5MSxzJDEqeDErYyQxKnkxKTtjb250ZXh0LmxpbmVUbyhjJDEqeDItcyQxKnkyLHMkMSp4MitjJDEqeTIpO2NvbnRleHQubGluZVRvKGMkMSp4MCtzJDEqeTAsYyQxKnkwLXMkMSp4MCk7Y29udGV4dC5saW5lVG8oYyQxKngxK3MkMSp5MSxjJDEqeTEtcyQxKngxKTtjb250ZXh0LmxpbmVUbyhjJDEqeDIrcyQxKnkyLGMkMSp5Mi1zJDEqeDIpO2NvbnRleHQuY2xvc2VQYXRoKCl9fTt2YXIgc3ltYm9scyQxPVtjaXJjbGUkMyxjcm9zcyQyLGRpYW1vbmQkMSxzcXVhcmUkMSxzdGFyJDEsdHJpYW5nbGUkMSx3eWUkMV07dmFyIHN5bWJvbCQxPWZ1bmN0aW9uKCl7dmFyIHR5cGU9Y29uc3RhbnQkNShjaXJjbGUkMyksc2l6ZT1jb25zdGFudCQ1KDY0KSxjb250ZXh0PW51bGw7ZnVuY3Rpb24gc3ltYm9sKCl7dmFyIGJ1ZmZlcjtpZighY29udGV4dCljb250ZXh0PWJ1ZmZlcj1wYXRoKCk7dHlwZS5hcHBseSh0aGlzLGFyZ3VtZW50cykuZHJhdyhjb250ZXh0LCtzaXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKSk7aWYoYnVmZmVyKXJldHVybiBjb250ZXh0PW51bGwsYnVmZmVyKyIifHxudWxsfXN5bWJvbC50eXBlPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0eXBlPXR5cGVvZiBfPT09ImZ1bmN0aW9uIj9fOmNvbnN0YW50JDUoXyksc3ltYm9sKTp0eXBlfTtzeW1ib2wuc2l6ZT1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oc2l6ZT10eXBlb2YgXz09PSJmdW5jdGlvbiI/Xzpjb25zdGFudCQ1KCtfKSxzeW1ib2wpOnNpemV9O3N5bWJvbC5jb250ZXh0PWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjb250ZXh0PV89PW51bGw/bnVsbDpfLHN5bWJvbCk6Y29udGV4dH07cmV0dXJuIHN5bWJvbH07dmFyIG5vb3AkMz1mdW5jdGlvbigpe307ZnVuY3Rpb24gX3BvaW50JDQodGhhdCx4LHkpe3RoYXQuX2NvbnRleHQuYmV6aWVyQ3VydmVUbygoMip0aGF0Ll94MCt0aGF0Ll94MSkvMywoMip0aGF0Ll95MCt0aGF0Ll95MSkvMywodGhhdC5feDArMip0aGF0Ll94MSkvMywodGhhdC5feTArMip0aGF0Ll95MSkvMywodGhhdC5feDArNCp0aGF0Ll94MSt4KS82LCh0aGF0Ll95MCs0KnRoYXQuX3kxK3kpLzYpfWZ1bmN0aW9uIEJhc2lzJDEoY29udGV4dCl7dGhpcy5fY29udGV4dD1jb250ZXh0fUJhc2lzJDEucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24gYXJlYVN0YXJ0KCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uIGFyZWFFbmQoKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uIGxpbmVTdGFydCgpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3kwPXRoaXMuX3kxPU5hTjt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uIGxpbmVFbmQoKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMzpfcG9pbnQkNCh0aGlzLHRoaXMuX3gxLHRoaXMuX3kxKTtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDEsdGhpcy5feTEpO2JyZWFrfWlmKHRoaXMuX2xpbmV8fHRoaXMuX2xpbmUhPT0wJiZ0aGlzLl9wb2ludD09PTEpdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTt0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24gcG9pbnQoeCx5KXt4PSt4LHk9K3k7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTt0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHgseSk6dGhpcy5fY29udGV4dC5tb3ZlVG8oeCx5KTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Mzt0aGlzLl9jb250ZXh0LmxpbmVUbygoNSp0aGlzLl94MCt0aGlzLl94MSkvNiwoNSp0aGlzLl95MCt0aGlzLl95MSkvNik7ZGVmYXVsdDpfcG9pbnQkNCh0aGlzLHgseSk7YnJlYWt9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9eDt0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT15fX07dmFyIGJhc2lzJDM9ZnVuY3Rpb24oY29udGV4dCl7cmV0dXJuIG5ldyBCYXNpcyQxKGNvbnRleHQpfTtmdW5jdGlvbiBCYXNpc0Nsb3NlZCQxKGNvbnRleHQpe3RoaXMuX2NvbnRleHQ9Y29udGV4dH1CYXNpc0Nsb3NlZCQxLnByb3RvdHlwZT17YXJlYVN0YXJ0Om5vb3AkMyxhcmVhRW5kOm5vb3AkMyxsaW5lU3RhcnQ6ZnVuY3Rpb24gbGluZVN0YXJ0KCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9TmFOO3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24gbGluZUVuZCgpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAxOnt0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95Mik7dGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVha31jYXNlIDI6e3RoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MisyKnRoaXMuX3gzKS8zLCh0aGlzLl95MisyKnRoaXMuX3kzKS8zKTt0aGlzLl9jb250ZXh0LmxpbmVUbygodGhpcy5feDMrMip0aGlzLl94MikvMywodGhpcy5feTMrMip0aGlzLl95MikvMyk7dGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVha31jYXNlIDM6e3RoaXMucG9pbnQodGhpcy5feDIsdGhpcy5feTIpO3RoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpO3RoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpO2JyZWFrfX19LHBvaW50OmZ1bmN0aW9uIHBvaW50JCQxKHgseSl7eD0reCx5PSt5O3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7dGhpcy5feDI9eCx0aGlzLl95Mj15O2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO3RoaXMuX3gzPXgsdGhpcy5feTM9eTticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Mzt0aGlzLl94ND14LHRoaXMuX3k0PXk7dGhpcy5fY29udGV4dC5tb3ZlVG8oKHRoaXMuX3gwKzQqdGhpcy5feDEreCkvNiwodGhpcy5feTArNCp0aGlzLl95MSt5KS82KTticmVhaztkZWZhdWx0Ol9wb2ludCQ0KHRoaXMseCx5KTticmVha310aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT14O3RoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXl9fTt2YXIgYmFzaXNDbG9zZWQkMj1mdW5jdGlvbihjb250ZXh0KXtyZXR1cm4gbmV3IEJhc2lzQ2xvc2VkJDEoY29udGV4dCl9O2Z1bmN0aW9uIEJhc2lzT3BlbiQxKGNvbnRleHQpe3RoaXMuX2NvbnRleHQ9Y29udGV4dH1CYXNpc09wZW4kMS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbiBhcmVhU3RhcnQoKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24gYXJlYUVuZCgpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24gbGluZVN0YXJ0KCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9TmFOO3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24gbGluZUVuZCgpe2lmKHRoaXMuX2xpbmV8fHRoaXMuX2xpbmUhPT0wJiZ0aGlzLl9wb2ludD09PTMpdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTt0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24gcG9pbnQkJDEoeCx5KXt4PSt4LHk9K3k7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Mzt2YXIgeDA9KHRoaXMuX3gwKzQqdGhpcy5feDEreCkvNix5MD0odGhpcy5feTArNCp0aGlzLl95MSt5KS82O3RoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8oeDAseTApOnRoaXMuX2NvbnRleHQubW92ZVRvKHgwLHkwKTticmVhaztjYXNlIDM6dGhpcy5fcG9pbnQ9NDtkZWZhdWx0Ol9wb2ludCQ0KHRoaXMseCx5KTticmVha310aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT14O3RoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXl9fTt2YXIgYmFzaXNPcGVuJDE9ZnVuY3Rpb24oY29udGV4dCl7cmV0dXJuIG5ldyBCYXNpc09wZW4kMShjb250ZXh0KX07ZnVuY3Rpb24gQnVuZGxlJDEoY29udGV4dCxiZXRhKXt0aGlzLl9iYXNpcz1uZXcgQmFzaXMkMShjb250ZXh0KTt0aGlzLl9iZXRhPWJldGF9QnVuZGxlJDEucHJvdG90eXBlPXtsaW5lU3RhcnQ6ZnVuY3Rpb24gbGluZVN0YXJ0KCl7dGhpcy5feD1bXTt0aGlzLl95PVtdO3RoaXMuX2Jhc2lzLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uIGxpbmVFbmQoKXt2YXIgeD10aGlzLl94LHk9dGhpcy5feSxqPXgubGVuZ3RoLTE7aWYoaj4wKXt2YXIgeDA9eFswXSx5MD15WzBdLGR4PXhbal0teDAsZHk9eVtqXS15MCxpPS0xLHQ7d2hpbGUoKytpPD1qKXt0PWkvajt0aGlzLl9iYXNpcy5wb2ludCh0aGlzLl9iZXRhKnhbaV0rKDEtdGhpcy5fYmV0YSkqKHgwK3QqZHgpLHRoaXMuX2JldGEqeVtpXSsoMS10aGlzLl9iZXRhKSooeTArdCpkeSkpfX10aGlzLl94PXRoaXMuX3k9bnVsbDt0aGlzLl9iYXNpcy5saW5lRW5kKCl9LHBvaW50OmZ1bmN0aW9uIHBvaW50KHgseSl7dGhpcy5feC5wdXNoKCt4KTt0aGlzLl95LnB1c2goK3kpfX07dmFyIGJ1bmRsZSQxPWZ1bmN0aW9uIGN1c3RvbShiZXRhKXtmdW5jdGlvbiBidW5kbGUoY29udGV4dCl7cmV0dXJuIGJldGE9PT0xP25ldyBCYXNpcyQxKGNvbnRleHQpOm5ldyBCdW5kbGUkMShjb250ZXh0LGJldGEpfWJ1bmRsZS5iZXRhPWZ1bmN0aW9uKGJldGEpe3JldHVybiBjdXN0b20oK2JldGEpfTtyZXR1cm4gYnVuZGxlfSguODUpO2Z1bmN0aW9uIF9wb2ludCQ1KHRoYXQseCx5KXt0aGF0Ll9jb250ZXh0LmJlemllckN1cnZlVG8odGhhdC5feDErdGhhdC5fayoodGhhdC5feDItdGhhdC5feDApLHRoYXQuX3kxK3RoYXQuX2sqKHRoYXQuX3kyLXRoYXQuX3kwKSx0aGF0Ll94Mit0aGF0Ll9rKih0aGF0Ll94MS14KSx0aGF0Ll95Mit0aGF0Ll9rKih0aGF0Ll95MS15KSx0aGF0Ll94Mix0aGF0Ll95Mil9ZnVuY3Rpb24gQ2FyZGluYWwkMShjb250ZXh0LHRlbnNpb24pe3RoaXMuX2NvbnRleHQ9Y29udGV4dDt0aGlzLl9rPSgxLXRlbnNpb24pLzZ9Q2FyZGluYWwkMS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbiBhcmVhU3RhcnQoKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24gYXJlYUVuZCgpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24gbGluZVN0YXJ0KCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOO3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24gbGluZUVuZCgpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6X3BvaW50JDUodGhpcyx0aGlzLl94MSx0aGlzLl95MSk7YnJlYWt9aWYodGhpcy5fbGluZXx8dGhpcy5fbGluZSE9PTAmJnRoaXMuX3BvaW50PT09MSl0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO3RoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbiBwb2ludCh4LHkpe3g9K3gseT0reTtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO3RoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8oeCx5KTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LHkpO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO3RoaXMuX3gxPXgsdGhpcy5feTE9eTticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0Ol9wb2ludCQ1KHRoaXMseCx5KTticmVha310aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj14O3RoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPXl9fTt2YXIgY2FyZGluYWwkMT1mdW5jdGlvbiBjdXN0b20odGVuc2lvbil7ZnVuY3Rpb24gY2FyZGluYWwoY29udGV4dCl7cmV0dXJuIG5ldyBDYXJkaW5hbCQxKGNvbnRleHQsdGVuc2lvbil9Y2FyZGluYWwudGVuc2lvbj1mdW5jdGlvbih0ZW5zaW9uKXtyZXR1cm4gY3VzdG9tKCt0ZW5zaW9uKX07cmV0dXJuIGNhcmRpbmFsfSgwKTtmdW5jdGlvbiBDYXJkaW5hbENsb3NlZCQxKGNvbnRleHQsdGVuc2lvbil7dGhpcy5fY29udGV4dD1jb250ZXh0O3RoaXMuX2s9KDEtdGVuc2lvbikvNn1DYXJkaW5hbENsb3NlZCQxLnByb3RvdHlwZT17YXJlYVN0YXJ0Om5vb3AkMyxhcmVhRW5kOm5vb3AkMyxsaW5lU3RhcnQ6ZnVuY3Rpb24gbGluZVN0YXJ0KCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOO3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24gbGluZUVuZCgpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAxOnt0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95Myk7dGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVha31jYXNlIDI6e3RoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gzLHRoaXMuX3kzKTt0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrfWNhc2UgMzp7dGhpcy5wb2ludCh0aGlzLl94Myx0aGlzLl95Myk7dGhpcy5wb2ludCh0aGlzLl94NCx0aGlzLl95NCk7dGhpcy5wb2ludCh0aGlzLl94NSx0aGlzLl95NSk7YnJlYWt9fX0scG9pbnQ6ZnVuY3Rpb24gcG9pbnQkJDEoeCx5KXt4PSt4LHk9K3k7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTt0aGlzLl94Mz14LHRoaXMuX3kzPXk7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDQ9eCx0aGlzLl95ND15KTticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Mzt0aGlzLl94NT14LHRoaXMuX3k1PXk7YnJlYWs7ZGVmYXVsdDpfcG9pbnQkNSh0aGlzLHgseSk7YnJlYWt9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9eDt0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj15fX07dmFyIGNhcmRpbmFsQ2xvc2VkJDE9ZnVuY3Rpb24gY3VzdG9tKHRlbnNpb24pe2Z1bmN0aW9uIGNhcmRpbmFsKGNvbnRleHQpe3JldHVybiBuZXcgQ2FyZGluYWxDbG9zZWQkMShjb250ZXh0LHRlbnNpb24pfWNhcmRpbmFsLnRlbnNpb249ZnVuY3Rpb24odGVuc2lvbil7cmV0dXJuIGN1c3RvbSgrdGVuc2lvbil9O3JldHVybiBjYXJkaW5hbH0oMCk7ZnVuY3Rpb24gQ2FyZGluYWxPcGVuJDEoY29udGV4dCx0ZW5zaW9uKXt0aGlzLl9jb250ZXh0PWNvbnRleHQ7dGhpcy5faz0oMS10ZW5zaW9uKS82fUNhcmRpbmFsT3BlbiQxLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uIGFyZWFTdGFydCgpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbiBhcmVhRW5kKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbiBsaW5lU3RhcnQoKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU47dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbiBsaW5lRW5kKCl7aWYodGhpcy5fbGluZXx8dGhpcy5fbGluZSE9PTAmJnRoaXMuX3BvaW50PT09Myl0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO3RoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbiBwb2ludCQkMSh4LHkpe3g9K3gseT0reTtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO3RoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5fcG9pbnQ9NDtkZWZhdWx0Ol9wb2ludCQ1KHRoaXMseCx5KTticmVha310aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj14O3RoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPXl9fTt2YXIgY2FyZGluYWxPcGVuJDE9ZnVuY3Rpb24gY3VzdG9tKHRlbnNpb24pe2Z1bmN0aW9uIGNhcmRpbmFsKGNvbnRleHQpe3JldHVybiBuZXcgQ2FyZGluYWxPcGVuJDEoY29udGV4dCx0ZW5zaW9uKX1jYXJkaW5hbC50ZW5zaW9uPWZ1bmN0aW9uKHRlbnNpb24pe3JldHVybiBjdXN0b20oK3RlbnNpb24pfTtyZXR1cm4gY2FyZGluYWx9KDApO2Z1bmN0aW9uIF9wb2ludCQ2KHRoYXQseCx5KXt2YXIgeDE9dGhhdC5feDEseTE9dGhhdC5feTEseDI9dGhhdC5feDIseTI9dGhhdC5feTI7aWYodGhhdC5fbDAxX2E+ZXBzaWxvbiQyKXt2YXIgYT0yKnRoYXQuX2wwMV8yYSszKnRoYXQuX2wwMV9hKnRoYXQuX2wxMl9hK3RoYXQuX2wxMl8yYSxuPTMqdGhhdC5fbDAxX2EqKHRoYXQuX2wwMV9hK3RoYXQuX2wxMl9hKTt4MT0oeDEqYS10aGF0Ll94MCp0aGF0Ll9sMTJfMmErdGhhdC5feDIqdGhhdC5fbDAxXzJhKS9uO3kxPSh5MSphLXRoYXQuX3kwKnRoYXQuX2wxMl8yYSt0aGF0Ll95Mip0aGF0Ll9sMDFfMmEpL259aWYodGhhdC5fbDIzX2E+ZXBzaWxvbiQyKXt2YXIgYj0yKnRoYXQuX2wyM18yYSszKnRoYXQuX2wyM19hKnRoYXQuX2wxMl9hK3RoYXQuX2wxMl8yYSxtPTMqdGhhdC5fbDIzX2EqKHRoYXQuX2wyM19hK3RoYXQuX2wxMl9hKTt4Mj0oeDIqYit0aGF0Ll94MSp0aGF0Ll9sMjNfMmEteCp0aGF0Ll9sMTJfMmEpL207eTI9KHkyKmIrdGhhdC5feTEqdGhhdC5fbDIzXzJhLXkqdGhhdC5fbDEyXzJhKS9tfXRoYXQuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyh4MSx5MSx4Mix5Mix0aGF0Ll94Mix0aGF0Ll95Mil9ZnVuY3Rpb24gQ2F0bXVsbFJvbSQxKGNvbnRleHQsYWxwaGEpe3RoaXMuX2NvbnRleHQ9Y29udGV4dDt0aGlzLl9hbHBoYT1hbHBoYX1DYXRtdWxsUm9tJDEucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24gYXJlYVN0YXJ0KCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uIGFyZWFFbmQoKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uIGxpbmVTdGFydCgpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTjt0aGlzLl9sMDFfYT10aGlzLl9sMTJfYT10aGlzLl9sMjNfYT10aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYT10aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uIGxpbmVFbmQoKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDIsdGhpcy5feTIpO2JyZWFrfWlmKHRoaXMuX2xpbmV8fHRoaXMuX2xpbmUhPT0wJiZ0aGlzLl9wb2ludD09PTEpdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTt0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24gcG9pbnQoeCx5KXt4PSt4LHk9K3k7aWYodGhpcy5fcG9pbnQpe3ZhciB4MjM9dGhpcy5feDIteCx5MjM9dGhpcy5feTIteTt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KHgyMyp4MjMreTIzKnkyMyx0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7dGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh4LHkpOnRoaXMuX2NvbnRleHQubW92ZVRvKHgseSk7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7ZGVmYXVsdDpfcG9pbnQkNih0aGlzLHgseSk7YnJlYWt9dGhpcy5fbDAxX2E9dGhpcy5fbDEyX2EsdGhpcy5fbDEyX2E9dGhpcy5fbDIzX2E7dGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYSx0aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhO3RoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXg7dGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9eX19O3ZhciBjYXRtdWxsUm9tPWZ1bmN0aW9uIGN1c3RvbShhbHBoYSl7ZnVuY3Rpb24gY2F0bXVsbFJvbShjb250ZXh0KXtyZXR1cm4gYWxwaGE/bmV3IENhdG11bGxSb20kMShjb250ZXh0LGFscGhhKTpuZXcgQ2FyZGluYWwkMShjb250ZXh0LDApfWNhdG11bGxSb20uYWxwaGE9ZnVuY3Rpb24oYWxwaGEpe3JldHVybiBjdXN0b20oK2FscGhhKX07cmV0dXJuIGNhdG11bGxSb219KC41KTtmdW5jdGlvbiBDYXRtdWxsUm9tQ2xvc2VkJDEoY29udGV4dCxhbHBoYSl7dGhpcy5fY29udGV4dD1jb250ZXh0O3RoaXMuX2FscGhhPWFscGhhfUNhdG11bGxSb21DbG9zZWQkMS5wcm90b3R5cGU9e2FyZWFTdGFydDpub29wJDMsYXJlYUVuZDpub29wJDMsbGluZVN0YXJ0OmZ1bmN0aW9uIGxpbmVTdGFydCgpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3g1PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PXRoaXMuX3k1PU5hTjt0aGlzLl9sMDFfYT10aGlzLl9sMTJfYT10aGlzLl9sMjNfYT10aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYT10aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uIGxpbmVFbmQoKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp7dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsdGhpcy5feTMpO3RoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWt9Y2FzZSAyOnt0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Myx0aGlzLl95Myk7dGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVha31jYXNlIDM6e3RoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpO3RoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpO3RoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpO2JyZWFrfX19LHBvaW50OmZ1bmN0aW9uIHBvaW50JCQxKHgseSl7eD0reCx5PSt5O2lmKHRoaXMuX3BvaW50KXt2YXIgeDIzPXRoaXMuX3gyLXgseTIzPXRoaXMuX3kyLXk7dGhpcy5fbDIzX2E9TWF0aC5zcXJ0KHRoaXMuX2wyM18yYT1NYXRoLnBvdyh4MjMqeDIzK3kyMyp5MjMsdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO3RoaXMuX3gzPXgsdGhpcy5feTM9eTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mjt0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94ND14LHRoaXMuX3k0PXkpO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO3RoaXMuX3g1PXgsdGhpcy5feTU9eTticmVhaztkZWZhdWx0Ol9wb2ludCQ2KHRoaXMseCx5KTticmVha310aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYTt0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmE7dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9eDt0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj15fX07dmFyIGNhdG11bGxSb21DbG9zZWQkMT1mdW5jdGlvbiBjdXN0b20oYWxwaGEpe2Z1bmN0aW9uIGNhdG11bGxSb20kJDEoY29udGV4dCl7cmV0dXJuIGFscGhhP25ldyBDYXRtdWxsUm9tQ2xvc2VkJDEoY29udGV4dCxhbHBoYSk6bmV3IENhcmRpbmFsQ2xvc2VkJDEoY29udGV4dCwwKX1jYXRtdWxsUm9tJCQxLmFscGhhPWZ1bmN0aW9uKGFscGhhKXtyZXR1cm4gY3VzdG9tKCthbHBoYSl9O3JldHVybiBjYXRtdWxsUm9tJCQxfSguNSk7ZnVuY3Rpb24gQ2F0bXVsbFJvbU9wZW4kMShjb250ZXh0LGFscGhhKXt0aGlzLl9jb250ZXh0PWNvbnRleHQ7dGhpcy5fYWxwaGE9YWxwaGF9Q2F0bXVsbFJvbU9wZW4kMS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbiBhcmVhU3RhcnQoKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24gYXJlYUVuZCgpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24gbGluZVN0YXJ0KCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOO3RoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24gbGluZUVuZCgpe2lmKHRoaXMuX2xpbmV8fHRoaXMuX2xpbmUhPT0wJiZ0aGlzLl9wb2ludD09PTMpdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTt0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24gcG9pbnQkJDEoeCx5KXt4PSt4LHk9K3k7aWYodGhpcy5fcG9pbnQpe3ZhciB4MjM9dGhpcy5feDIteCx5MjM9dGhpcy5feTIteTt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KHgyMyp4MjMreTIzKnkyMyx0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7dGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Mix0aGlzLl95Mik6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzp0aGlzLl9wb2ludD00O2RlZmF1bHQ6X3BvaW50JDYodGhpcyx4LHkpO2JyZWFrfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hO3RoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYTt0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj14O3RoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPXl9fTt2YXIgY2F0bXVsbFJvbU9wZW4kMT1mdW5jdGlvbiBjdXN0b20oYWxwaGEpe2Z1bmN0aW9uIGNhdG11bGxSb20kJDEoY29udGV4dCl7cmV0dXJuIGFscGhhP25ldyBDYXRtdWxsUm9tT3BlbiQxKGNvbnRleHQsYWxwaGEpOm5ldyBDYXJkaW5hbE9wZW4kMShjb250ZXh0LDApfWNhdG11bGxSb20kJDEuYWxwaGE9ZnVuY3Rpb24oYWxwaGEpe3JldHVybiBjdXN0b20oK2FscGhhKX07cmV0dXJuIGNhdG11bGxSb20kJDF9KC41KTtmdW5jdGlvbiBMaW5lYXJDbG9zZWQkMShjb250ZXh0KXt0aGlzLl9jb250ZXh0PWNvbnRleHR9TGluZWFyQ2xvc2VkJDEucHJvdG90eXBlPXthcmVhU3RhcnQ6bm9vcCQzLGFyZWFFbmQ6bm9vcCQzLGxpbmVTdGFydDpmdW5jdGlvbiBsaW5lU3RhcnQoKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uIGxpbmVFbmQoKXtpZih0aGlzLl9wb2ludCl0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpfSxwb2ludDpmdW5jdGlvbiBwb2ludCh4LHkpe3g9K3gseT0reTtpZih0aGlzLl9wb2ludCl0aGlzLl9jb250ZXh0LmxpbmVUbyh4LHkpO2Vsc2UgdGhpcy5fcG9pbnQ9MSx0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LHkpfX07dmFyIGxpbmVhckNsb3NlZD1mdW5jdGlvbihjb250ZXh0KXtyZXR1cm4gbmV3IExpbmVhckNsb3NlZCQxKGNvbnRleHQpfTtmdW5jdGlvbiBzaWduJDEoeCl7cmV0dXJuIHg8MD8tMToxfWZ1bmN0aW9uIHNsb3BlMyQxKHRoYXQseDIseTIpe3ZhciBoMD10aGF0Ll94MS10aGF0Ll94MCxoMT14Mi10aGF0Ll94MSxzMD0odGhhdC5feTEtdGhhdC5feTApLyhoMHx8aDE8MCYmLTApLHMxPSh5Mi10aGF0Ll95MSkvKGgxfHxoMDwwJiYtMCkscD0oczAqaDErczEqaDApLyhoMCtoMSk7cmV0dXJuKHNpZ24kMShzMCkrc2lnbiQxKHMxKSkqTWF0aC5taW4oTWF0aC5hYnMoczApLE1hdGguYWJzKHMxKSwuNSpNYXRoLmFicyhwKSl8fDB9ZnVuY3Rpb24gc2xvcGUyJDEodGhhdCx0KXt2YXIgaD10aGF0Ll94MS10aGF0Ll94MDtyZXR1cm4gaD8oMyoodGhhdC5feTEtdGhhdC5feTApL2gtdCkvMjp0fWZ1bmN0aW9uIF9wb2ludCQ3KHRoYXQsdDAsdDEpe3ZhciB4MD10aGF0Ll94MCx5MD10aGF0Ll95MCx4MT10aGF0Ll94MSx5MT10aGF0Ll95MSxkeD0oeDEteDApLzM7dGhhdC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHgwK2R4LHkwK2R4KnQwLHgxLWR4LHkxLWR4KnQxLHgxLHkxKX1mdW5jdGlvbiBNb25vdG9uZVgkMShjb250ZXh0KXt0aGlzLl9jb250ZXh0PWNvbnRleHR9TW9ub3RvbmVYJDEucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24gYXJlYVN0YXJ0KCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uIGFyZWFFbmQoKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uIGxpbmVTdGFydCgpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3QwPU5hTjt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uIGxpbmVFbmQoKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSx0aGlzLl95MSk7YnJlYWs7Y2FzZSAzOl9wb2ludCQ3KHRoaXMsdGhpcy5fdDAsc2xvcGUyJDEodGhpcyx0aGlzLl90MCkpO2JyZWFrfWlmKHRoaXMuX2xpbmV8fHRoaXMuX2xpbmUhPT0wJiZ0aGlzLl9wb2ludD09PTEpdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTt0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24gcG9pbnQoeCx5KXt2YXIgdDE9TmFOO3g9K3gseT0reTtpZih4PT09dGhpcy5feDEmJnk9PT10aGlzLl95MSlyZXR1cm47c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTt0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHgseSk6dGhpcy5fY29udGV4dC5tb3ZlVG8oeCx5KTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztfcG9pbnQkNyh0aGlzLHNsb3BlMiQxKHRoaXMsdDE9c2xvcGUzJDEodGhpcyx4LHkpKSx0MSk7YnJlYWs7ZGVmYXVsdDpfcG9pbnQkNyh0aGlzLHRoaXMuX3QwLHQxPXNsb3BlMyQxKHRoaXMseCx5KSk7YnJlYWt9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9eDt0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT15O3RoaXMuX3QwPXQxfX07ZnVuY3Rpb24gTW9ub3RvbmVZJDEoY29udGV4dCl7dGhpcy5fY29udGV4dD1uZXcgUmVmbGVjdENvbnRleHQkMShjb250ZXh0KX0oTW9ub3RvbmVZJDEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTW9ub3RvbmVYJDEucHJvdG90eXBlKSkucG9pbnQ9ZnVuY3Rpb24oeCx5KXtNb25vdG9uZVgkMS5wcm90b3R5cGUucG9pbnQuY2FsbCh0aGlzLHkseCl9O2Z1bmN0aW9uIFJlZmxlY3RDb250ZXh0JDEoY29udGV4dCl7dGhpcy5fY29udGV4dD1jb250ZXh0fVJlZmxlY3RDb250ZXh0JDEucHJvdG90eXBlPXttb3ZlVG86ZnVuY3Rpb24gbW92ZVRvKHgseSl7dGhpcy5fY29udGV4dC5tb3ZlVG8oeSx4KX0sY2xvc2VQYXRoOmZ1bmN0aW9uIGNsb3NlUGF0aCgpe3RoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCl9LGxpbmVUbzpmdW5jdGlvbiBsaW5lVG8oeCx5KXt0aGlzLl9jb250ZXh0LmxpbmVUbyh5LHgpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uIGJlemllckN1cnZlVG8oeDEseTEseDIseTIseCx5KXt0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8oeTEseDEseTIseDIseSx4KX19O2Z1bmN0aW9uIG1vbm90b25lWCQxKGNvbnRleHQpe3JldHVybiBuZXcgTW9ub3RvbmVYJDEoY29udGV4dCl9ZnVuY3Rpb24gbW9ub3RvbmVZJDEoY29udGV4dCl7cmV0dXJuIG5ldyBNb25vdG9uZVkkMShjb250ZXh0KX1mdW5jdGlvbiBOYXR1cmFsJDEoY29udGV4dCl7dGhpcy5fY29udGV4dD1jb250ZXh0fU5hdHVyYWwkMS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbiBhcmVhU3RhcnQoKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24gYXJlYUVuZCgpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24gbGluZVN0YXJ0KCl7dGhpcy5feD1bXTt0aGlzLl95PVtdfSxsaW5lRW5kOmZ1bmN0aW9uIGxpbmVFbmQoKXt2YXIgeD10aGlzLl94LHk9dGhpcy5feSxuPXgubGVuZ3RoO2lmKG4pe3RoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8oeFswXSx5WzBdKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh4WzBdLHlbMF0pO2lmKG49PT0yKXt0aGlzLl9jb250ZXh0LmxpbmVUbyh4WzFdLHlbMV0pfWVsc2V7dmFyIHB4PWNvbnRyb2xQb2ludHMkMSh4KSxweT1jb250cm9sUG9pbnRzJDEoeSk7Zm9yKHZhciBpMD0wLGkxPTE7aTE8bjsrK2kwLCsraTEpe3RoaXMuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhweFswXVtpMF0scHlbMF1baTBdLHB4WzFdW2kwXSxweVsxXVtpMF0seFtpMV0seVtpMV0pfX19aWYodGhpcy5fbGluZXx8dGhpcy5fbGluZSE9PTAmJm49PT0xKXRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7dGhpcy5fbGluZT0xLXRoaXMuX2xpbmU7dGhpcy5feD10aGlzLl95PW51bGx9LHBvaW50OmZ1bmN0aW9uIHBvaW50KHgseSl7dGhpcy5feC5wdXNoKCt4KTt0aGlzLl95LnB1c2goK3kpfX07ZnVuY3Rpb24gY29udHJvbFBvaW50cyQxKHgpe3ZhciBpLG49eC5sZW5ndGgtMSxtLGE9bmV3IEFycmF5KG4pLGI9bmV3IEFycmF5KG4pLHI9bmV3IEFycmF5KG4pO2FbMF09MCxiWzBdPTIsclswXT14WzBdKzIqeFsxXTtmb3IoaT0xO2k8bi0xOysraSl7YVtpXT0xLGJbaV09NCxyW2ldPTQqeFtpXSsyKnhbaSsxXX1hW24tMV09MixiW24tMV09NyxyW24tMV09OCp4W24tMV0reFtuXTtmb3IoaT0xO2k8bjsrK2kpe209YVtpXS9iW2ktMV0sYltpXS09bSxyW2ldLT1tKnJbaS0xXX1hW24tMV09cltuLTFdL2Jbbi0xXTtmb3IoaT1uLTI7aT49MDstLWkpe2FbaV09KHJbaV0tYVtpKzFdKS9iW2ldfWJbbi0xXT0oeFtuXSthW24tMV0pLzI7Zm9yKGk9MDtpPG4tMTsrK2kpe2JbaV09Mip4W2krMV0tYVtpKzFdfXJldHVyblthLGJdfXZhciBuYXR1cmFsJDE9ZnVuY3Rpb24oY29udGV4dCl7cmV0dXJuIG5ldyBOYXR1cmFsJDEoY29udGV4dCl9O2Z1bmN0aW9uIFN0ZXAkMShjb250ZXh0LHQpe3RoaXMuX2NvbnRleHQ9Y29udGV4dDt0aGlzLl90PXR9U3RlcCQxLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uIGFyZWFTdGFydCgpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbiBhcmVhRW5kKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbiBsaW5lU3RhcnQoKXt0aGlzLl94PXRoaXMuX3k9TmFOO3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24gbGluZUVuZCgpe2lmKDA8dGhpcy5fdCYmdGhpcy5fdDwxJiZ0aGlzLl9wb2ludD09PTIpdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCx0aGlzLl95KTtpZih0aGlzLl9saW5lfHx0aGlzLl9saW5lIT09MCYmdGhpcy5fcG9pbnQ9PT0xKXRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7aWYodGhpcy5fbGluZT49MCl0aGlzLl90PTEtdGhpcy5fdCx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24gcG9pbnQoeCx5KXt4PSt4LHk9K3k7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTt0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHgseSk6dGhpcy5fY29udGV4dC5tb3ZlVG8oeCx5KTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OntpZih0aGlzLl90PD0wKXt0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94LHkpO3RoaXMuX2NvbnRleHQubGluZVRvKHgseSl9ZWxzZXt2YXIgeDE9dGhpcy5feCooMS10aGlzLl90KSt4KnRoaXMuX3Q7dGhpcy5fY29udGV4dC5saW5lVG8oeDEsdGhpcy5feSk7dGhpcy5fY29udGV4dC5saW5lVG8oeDEseSl9YnJlYWt9fXRoaXMuX3g9eCx0aGlzLl95PXl9fTt2YXIgc3RlcCQxPWZ1bmN0aW9uKGNvbnRleHQpe3JldHVybiBuZXcgU3RlcCQxKGNvbnRleHQsLjUpfTtmdW5jdGlvbiBzdGVwQmVmb3JlJDEoY29udGV4dCl7cmV0dXJuIG5ldyBTdGVwJDEoY29udGV4dCwwKX1mdW5jdGlvbiBzdGVwQWZ0ZXIkMShjb250ZXh0KXtyZXR1cm4gbmV3IFN0ZXAkMShjb250ZXh0LDEpfXZhciBzbGljZSQyPUFycmF5LnByb3RvdHlwZS5zbGljZTt2YXIgbm9uZSQzPWZ1bmN0aW9uKHNlcmllcyxvcmRlcil7aWYoISgobj1zZXJpZXMubGVuZ3RoKT4xKSlyZXR1cm47Zm9yKHZhciBpPTEsczAsczE9c2VyaWVzW29yZGVyWzBdXSxuLG09czEubGVuZ3RoO2k8bjsrK2kpe3MwPXMxLHMxPXNlcmllc1tvcmRlcltpXV07Zm9yKHZhciBqPTA7ajxtOysrail7czFbal1bMV0rPXMxW2pdWzBdPWlzTmFOKHMwW2pdWzFdKT9zMFtqXVswXTpzMFtqXVsxXX19fTt2YXIgbm9uZSQ0PWZ1bmN0aW9uKHNlcmllcyl7dmFyIG49c2VyaWVzLmxlbmd0aCxvPW5ldyBBcnJheShuKTt3aGlsZSgtLW4+PTApe29bbl09bn1yZXR1cm4gb307ZnVuY3Rpb24gc3RhY2tWYWx1ZSQxKGQsa2V5KXtyZXR1cm4gZFtrZXldfXZhciBzdGFjayQxPWZ1bmN0aW9uKCl7dmFyIGtleXM9Y29uc3RhbnQkNShbXSksb3JkZXI9bm9uZSQ0LG9mZnNldD1ub25lJDMsdmFsdWU9c3RhY2tWYWx1ZSQxO2Z1bmN0aW9uIHN0YWNrKGRhdGEpe3ZhciBrej1rZXlzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxpLG09ZGF0YS5sZW5ndGgsbj1rei5sZW5ndGgsc3o9bmV3IEFycmF5KG4pLG96O2ZvcihpPTA7aTxuOysraSl7Zm9yKHZhciBraT1reltpXSxzaT1zeltpXT1uZXcgQXJyYXkobSksaj0wLHNpajtqPG07KytqKXtzaVtqXT1zaWo9WzAsK3ZhbHVlKGRhdGFbal0sa2ksaixkYXRhKV07c2lqLmRhdGE9ZGF0YVtqXX1zaS5rZXk9a2l9Zm9yKGk9MCxvej1vcmRlcihzeik7aTxuOysraSl7c3pbb3pbaV1dLmluZGV4PWl9b2Zmc2V0KHN6LG96KTtyZXR1cm4gc3p9c3RhY2sua2V5cz1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oa2V5cz10eXBlb2YgXz09PSJmdW5jdGlvbiI/Xzpjb25zdGFudCQ1KHNsaWNlJDIuY2FsbChfKSksc3RhY2spOmtleXN9O3N0YWNrLnZhbHVlPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh2YWx1ZT10eXBlb2YgXz09PSJmdW5jdGlvbiI/Xzpjb25zdGFudCQ1KCtfKSxzdGFjayk6dmFsdWV9O3N0YWNrLm9yZGVyPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvcmRlcj1fPT1udWxsP25vbmUkNDp0eXBlb2YgXz09PSJmdW5jdGlvbiI/Xzpjb25zdGFudCQ1KHNsaWNlJDIuY2FsbChfKSksc3RhY2spOm9yZGVyfTtzdGFjay5vZmZzZXQ9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG9mZnNldD1fPT1udWxsP25vbmUkMzpfLHN0YWNrKTpvZmZzZXR9O3JldHVybiBzdGFja307dmFyIGV4cGFuZCQxPWZ1bmN0aW9uKHNlcmllcyxvcmRlcil7aWYoISgobj1zZXJpZXMubGVuZ3RoKT4wKSlyZXR1cm47Zm9yKHZhciBpLG4saj0wLG09c2VyaWVzWzBdLmxlbmd0aCx5O2o8bTsrK2ope2Zvcih5PWk9MDtpPG47KytpKXt5Kz1zZXJpZXNbaV1bal1bMV18fDB9aWYoeSlmb3IoaT0wO2k8bjsrK2kpe3Nlcmllc1tpXVtqXVsxXS89eX19bm9uZSQzKHNlcmllcyxvcmRlcil9O3ZhciBzaWxob3VldHRlJDE9ZnVuY3Rpb24oc2VyaWVzLG9yZGVyKXtpZighKChuPXNlcmllcy5sZW5ndGgpPjApKXJldHVybjtmb3IodmFyIGo9MCxzMD1zZXJpZXNbb3JkZXJbMF1dLG4sbT1zMC5sZW5ndGg7ajxtOysrail7Zm9yKHZhciBpPTAseT0wO2k8bjsrK2kpe3krPXNlcmllc1tpXVtqXVsxXXx8MH1zMFtqXVsxXSs9czBbal1bMF09LXkvMn1ub25lJDMoc2VyaWVzLG9yZGVyKX07dmFyIHdpZ2dsZSQxPWZ1bmN0aW9uKHNlcmllcyxvcmRlcil7aWYoISgobj1zZXJpZXMubGVuZ3RoKT4wKXx8ISgobT0oczA9c2VyaWVzW29yZGVyWzBdXSkubGVuZ3RoKT4wKSlyZXR1cm47Zm9yKHZhciB5PTAsaj0xLHMwLG0sbjtqPG07KytqKXtmb3IodmFyIGk9MCxzMT0wLHMyPTA7aTxuOysraSl7dmFyIHNpPXNlcmllc1tvcmRlcltpXV0sc2lqMD1zaVtqXVsxXXx8MCxzaWoxPXNpW2otMV1bMV18fDAsczM9KHNpajAtc2lqMSkvMjtmb3IodmFyIGs9MDtrPGk7KytrKXt2YXIgc2s9c2VyaWVzW29yZGVyW2tdXSxza2owPXNrW2pdWzFdfHwwLHNrajE9c2tbai0xXVsxXXx8MDtzMys9c2tqMC1za2oxfXMxKz1zaWowLHMyKz1zMypzaWowfXMwW2otMV1bMV0rPXMwW2otMV1bMF09eTtpZihzMSl5LT1zMi9zMX1zMFtqLTFdWzFdKz1zMFtqLTFdWzBdPXk7bm9uZSQzKHNlcmllcyxvcmRlcil9O3ZhciBhc2NlbmRpbmckMz1mdW5jdGlvbihzZXJpZXMpe3ZhciBzdW1zPXNlcmllcy5tYXAoc3VtJDIpO3JldHVybiBub25lJDQoc2VyaWVzKS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIHN1bXNbYV0tc3Vtc1tiXX0pfTtmdW5jdGlvbiBzdW0kMihzZXJpZXMpe3ZhciBzPTAsaT0tMSxuPXNlcmllcy5sZW5ndGgsdjt3aGlsZSgrK2k8bil7aWYodj0rc2VyaWVzW2ldWzFdKXMrPXZ9cmV0dXJuIHN9dmFyIGRlc2NlbmRpbmckND1mdW5jdGlvbihzZXJpZXMpe3JldHVybiBhc2NlbmRpbmckMyhzZXJpZXMpLnJldmVyc2UoKX07dmFyIGluc2lkZU91dCQxPWZ1bmN0aW9uKHNlcmllcyl7dmFyIG49c2VyaWVzLmxlbmd0aCxpLGosc3Vtcz1zZXJpZXMubWFwKHN1bSQyKSxvcmRlcj1ub25lJDQoc2VyaWVzKS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIHN1bXNbYl0tc3Vtc1thXX0pLHRvcD0wLGJvdHRvbT0wLHRvcHM9W10sYm90dG9tcz1bXTtmb3IoaT0wO2k8bjsrK2kpe2o9b3JkZXJbaV07aWYodG9wPGJvdHRvbSl7dG9wKz1zdW1zW2pdO3RvcHMucHVzaChqKX1lbHNle2JvdHRvbSs9c3Vtc1tqXTtib3R0b21zLnB1c2goail9fXJldHVybiBib3R0b21zLnJldmVyc2UoKS5jb25jYXQodG9wcyl9O3ZhciByZXZlcnNlJDE9ZnVuY3Rpb24oc2VyaWVzKXtyZXR1cm4gbm9uZSQ0KHNlcmllcykucmV2ZXJzZSgpfTt2YXIgZDNTaGFwZSQxPU9iamVjdC5mcmVlemUoe2FyYzphcmMkMSxhcmVhOmFyZWEkMSxsaW5lOmxpbmUkMSxwaWU6cGllJDEscmFkaWFsQXJlYTpyYWRpYWxBcmVhJDEscmFkaWFsTGluZTpyYWRpYWxMaW5lJDMsc3ltYm9sOnN5bWJvbCQxLHN5bWJvbHM6c3ltYm9scyQxLHN5bWJvbENpcmNsZTpjaXJjbGUkMyxzeW1ib2xDcm9zczpjcm9zcyQyLHN5bWJvbERpYW1vbmQ6ZGlhbW9uZCQxLHN5bWJvbFNxdWFyZTpzcXVhcmUkMSxzeW1ib2xTdGFyOnN0YXIkMSxzeW1ib2xUcmlhbmdsZTp0cmlhbmdsZSQxLHN5bWJvbFd5ZTp3eWUkMSxjdXJ2ZUJhc2lzQ2xvc2VkOmJhc2lzQ2xvc2VkJDIsY3VydmVCYXNpc09wZW46YmFzaXNPcGVuJDEsY3VydmVCYXNpczpiYXNpcyQzLGN1cnZlQnVuZGxlOmJ1bmRsZSQxLGN1cnZlQ2FyZGluYWxDbG9zZWQ6Y2FyZGluYWxDbG9zZWQkMSxjdXJ2ZUNhcmRpbmFsT3BlbjpjYXJkaW5hbE9wZW4kMSxjdXJ2ZUNhcmRpbmFsOmNhcmRpbmFsJDEsY3VydmVDYXRtdWxsUm9tQ2xvc2VkOmNhdG11bGxSb21DbG9zZWQkMSxjdXJ2ZUNhdG11bGxSb21PcGVuOmNhdG11bGxSb21PcGVuJDEsY3VydmVDYXRtdWxsUm9tOmNhdG11bGxSb20sY3VydmVMaW5lYXJDbG9zZWQ6bGluZWFyQ2xvc2VkLGN1cnZlTGluZWFyOmN1cnZlTGluZWFyJDEsY3VydmVNb25vdG9uZVg6bW9ub3RvbmVYJDEsY3VydmVNb25vdG9uZVk6bW9ub3RvbmVZJDEsY3VydmVOYXR1cmFsOm5hdHVyYWwkMSxjdXJ2ZVN0ZXA6c3RlcCQxLGN1cnZlU3RlcEFmdGVyOnN0ZXBBZnRlciQxLGN1cnZlU3RlcEJlZm9yZTpzdGVwQmVmb3JlJDEsc3RhY2s6c3RhY2skMSxzdGFja09mZnNldEV4cGFuZDpleHBhbmQkMSxzdGFja09mZnNldE5vbmU6bm9uZSQzLHN0YWNrT2Zmc2V0U2lsaG91ZXR0ZTpzaWxob3VldHRlJDEsc3RhY2tPZmZzZXRXaWdnbGU6d2lnZ2xlJDEsc3RhY2tPcmRlckFzY2VuZGluZzphc2NlbmRpbmckMyxzdGFja09yZGVyRGVzY2VuZGluZzpkZXNjZW5kaW5nJDQsc3RhY2tPcmRlckluc2lkZU91dDppbnNpZGVPdXQkMSxzdGFja09yZGVyTm9uZTpub25lJDQsc3RhY2tPcmRlclJldmVyc2U6cmV2ZXJzZSQxfSk7dmFyIGFycmF5JDI9QXJyYXkucHJvdG90eXBlO3ZhciBtYXAkMz1hcnJheSQyLm1hcDt2YXIgc2xpY2UkMz1hcnJheSQyLnNsaWNlO3ZhciBpbXBsaWNpdD17bmFtZToiaW1wbGljaXQifTtmdW5jdGlvbiBvcmRpbmFsKHJhbmdlKXt2YXIgaW5kZXg9bWFwKCksZG9tYWluPVtdLHVua25vd249aW1wbGljaXQ7cmFuZ2U9cmFuZ2U9PW51bGw/W106c2xpY2UkMy5jYWxsKHJhbmdlKTtmdW5jdGlvbiBzY2FsZShkKXt2YXIga2V5PWQrIiIsaT1pbmRleC5nZXQoa2V5KTtpZighaSl7aWYodW5rbm93biE9PWltcGxpY2l0KXJldHVybiB1bmtub3duO2luZGV4LnNldChrZXksaT1kb21haW4ucHVzaChkKSl9cmV0dXJuIHJhbmdlWyhpLTEpJXJhbmdlLmxlbmd0aF19c2NhbGUuZG9tYWluPWZ1bmN0aW9uKF8pe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBkb21haW4uc2xpY2UoKTtkb21haW49W10saW5kZXg9bWFwKCk7dmFyIGk9LTEsbj1fLmxlbmd0aCxkLGtleTt3aGlsZSgrK2k8bil7aWYoIWluZGV4LmhhcyhrZXk9KGQ9X1tpXSkrIiIpKWluZGV4LnNldChrZXksZG9tYWluLnB1c2goZCkpfXJldHVybiBzY2FsZX07c2NhbGUucmFuZ2U9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHJhbmdlPXNsaWNlJDMuY2FsbChfKSxzY2FsZSk6cmFuZ2Uuc2xpY2UoKX07c2NhbGUudW5rbm93bj1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odW5rbm93bj1fLHNjYWxlKTp1bmtub3dufTtzY2FsZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIG9yZGluYWwoKS5kb21haW4oZG9tYWluKS5yYW5nZShyYW5nZSkudW5rbm93bih1bmtub3duKX07cmV0dXJuIHNjYWxlfWZ1bmN0aW9uIGJhbmQoKXt2YXIgc2NhbGU9b3JkaW5hbCgpLnVua25vd24odW5kZWZpbmVkKSxkb21haW49c2NhbGUuZG9tYWluLG9yZGluYWxSYW5nZT1zY2FsZS5yYW5nZSxyYW5nZSQkMT1bMCwxXSxzdGVwLGJhbmR3aWR0aCxyb3VuZD1mYWxzZSxwYWRkaW5nSW5uZXI9MCxwYWRkaW5nT3V0ZXI9MCxhbGlnbj0uNTtkZWxldGUgc2NhbGUudW5rbm93bjtmdW5jdGlvbiByZXNjYWxlKCl7dmFyIG49ZG9tYWluKCkubGVuZ3RoLHJldmVyc2U9cmFuZ2UkJDFbMV08cmFuZ2UkJDFbMF0sc3RhcnQ9cmFuZ2UkJDFbcmV2ZXJzZS0wXSxzdG9wPXJhbmdlJCQxWzEtcmV2ZXJzZV07c3RlcD0oc3RvcC1zdGFydCkvTWF0aC5tYXgoMSxuLXBhZGRpbmdJbm5lcitwYWRkaW5nT3V0ZXIqMik7aWYocm91bmQpc3RlcD1NYXRoLmZsb29yKHN0ZXApO3N0YXJ0Kz0oc3RvcC1zdGFydC1zdGVwKihuLXBhZGRpbmdJbm5lcikpKmFsaWduO2JhbmR3aWR0aD1zdGVwKigxLXBhZGRpbmdJbm5lcik7aWYocm91bmQpc3RhcnQ9TWF0aC5yb3VuZChzdGFydCksYmFuZHdpZHRoPU1hdGgucm91bmQoYmFuZHdpZHRoKTt2YXIgdmFsdWVzPXJhbmdlKG4pLm1hcChmdW5jdGlvbihpKXtyZXR1cm4gc3RhcnQrc3RlcCppfSk7cmV0dXJuIG9yZGluYWxSYW5nZShyZXZlcnNlP3ZhbHVlcy5yZXZlcnNlKCk6dmFsdWVzKX1zY2FsZS5kb21haW49ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGRvbWFpbihfKSxyZXNjYWxlKCkpOmRvbWFpbigpfTtzY2FsZS5yYW5nZT1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocmFuZ2UkJDE9WytfWzBdLCtfWzFdXSxyZXNjYWxlKCkpOnJhbmdlJCQxLnNsaWNlKCl9O3NjYWxlLnJhbmdlUm91bmQ9ZnVuY3Rpb24oXyl7cmV0dXJuIHJhbmdlJCQxPVsrX1swXSwrX1sxXV0scm91bmQ9dHJ1ZSxyZXNjYWxlKCl9O3NjYWxlLmJhbmR3aWR0aD1mdW5jdGlvbigpe3JldHVybiBiYW5kd2lkdGh9O3NjYWxlLnN0ZXA9ZnVuY3Rpb24oKXtyZXR1cm4gc3RlcH07c2NhbGUucm91bmQ9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHJvdW5kPSEhXyxyZXNjYWxlKCkpOnJvdW5kfTtzY2FsZS5wYWRkaW5nPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwYWRkaW5nSW5uZXI9cGFkZGluZ091dGVyPU1hdGgubWF4KDAsTWF0aC5taW4oMSxfKSkscmVzY2FsZSgpKTpwYWRkaW5nSW5uZXJ9O3NjYWxlLnBhZGRpbmdJbm5lcj1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocGFkZGluZ0lubmVyPU1hdGgubWF4KDAsTWF0aC5taW4oMSxfKSkscmVzY2FsZSgpKTpwYWRkaW5nSW5uZXJ9O3NjYWxlLnBhZGRpbmdPdXRlcj1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocGFkZGluZ091dGVyPU1hdGgubWF4KDAsTWF0aC5taW4oMSxfKSkscmVzY2FsZSgpKTpwYWRkaW5nT3V0ZXJ9O3NjYWxlLmFsaWduPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhbGlnbj1NYXRoLm1heCgwLE1hdGgubWluKDEsXykpLHJlc2NhbGUoKSk6YWxpZ259O3NjYWxlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gYmFuZCgpLmRvbWFpbihkb21haW4oKSkucmFuZ2UocmFuZ2UkJDEpLnJvdW5kKHJvdW5kKS5wYWRkaW5nSW5uZXIocGFkZGluZ0lubmVyKS5wYWRkaW5nT3V0ZXIocGFkZGluZ091dGVyKS5hbGlnbihhbGlnbil9O3JldHVybiByZXNjYWxlKCl9ZnVuY3Rpb24gcG9pbnRpc2goc2NhbGUpe3ZhciBjb3B5PXNjYWxlLmNvcHk7c2NhbGUucGFkZGluZz1zY2FsZS5wYWRkaW5nT3V0ZXI7ZGVsZXRlIHNjYWxlLnBhZGRpbmdJbm5lcjtkZWxldGUgc2NhbGUucGFkZGluZ091dGVyO3NjYWxlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gcG9pbnRpc2goY29weSgpKX07cmV0dXJuIHNjYWxlfWZ1bmN0aW9uIHBvaW50JDEoKXtyZXR1cm4gcG9pbnRpc2goYmFuZCgpLnBhZGRpbmdJbm5lcigxKSl9dmFyIGNvbnN0YW50JDY9ZnVuY3Rpb24oeCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHh9fTt2YXIgbnVtYmVyJDE9ZnVuY3Rpb24oeCl7cmV0dXJuK3h9O3ZhciB1bml0PVswLDFdO2Z1bmN0aW9uIGRlaW50ZXJwb2xhdGVMaW5lYXIoYSxiKXtyZXR1cm4oYi09YT0rYSk/ZnVuY3Rpb24oeCl7cmV0dXJuKHgtYSkvYn06Y29uc3RhbnQkNihiKX1mdW5jdGlvbiBkZWludGVycG9sYXRlQ2xhbXAoZGVpbnRlcnBvbGF0ZSl7cmV0dXJuIGZ1bmN0aW9uKGEsYil7dmFyIGQ9ZGVpbnRlcnBvbGF0ZShhPSthLGI9K2IpO3JldHVybiBmdW5jdGlvbih4KXtyZXR1cm4geDw9YT8wOng+PWI/MTpkKHgpfX19ZnVuY3Rpb24gcmVpbnRlcnBvbGF0ZUNsYW1wKHJlaW50ZXJwb2xhdGUpe3JldHVybiBmdW5jdGlvbihhLGIpe3ZhciByPXJlaW50ZXJwb2xhdGUoYT0rYSxiPStiKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQ8PTA/YTp0Pj0xP2I6cih0KX19fWZ1bmN0aW9uIGJpbWFwKGRvbWFpbixyYW5nZSxkZWludGVycG9sYXRlLHJlaW50ZXJwb2xhdGUpe3ZhciBkMD1kb21haW5bMF0sZDE9ZG9tYWluWzFdLHIwPXJhbmdlWzBdLHIxPXJhbmdlWzFdO2lmKGQxPGQwKWQwPWRlaW50ZXJwb2xhdGUoZDEsZDApLHIwPXJlaW50ZXJwb2xhdGUocjEscjApO2Vsc2UgZDA9ZGVpbnRlcnBvbGF0ZShkMCxkMSkscjA9cmVpbnRlcnBvbGF0ZShyMCxyMSk7cmV0dXJuIGZ1bmN0aW9uKHgpe3JldHVybiByMChkMCh4KSl9fWZ1bmN0aW9uIHBvbHltYXAoZG9tYWluLHJhbmdlLGRlaW50ZXJwb2xhdGUscmVpbnRlcnBvbGF0ZSl7dmFyIGo9TWF0aC5taW4oZG9tYWluLmxlbmd0aCxyYW5nZS5sZW5ndGgpLTEsZD1uZXcgQXJyYXkoaikscj1uZXcgQXJyYXkoaiksaT0tMTtpZihkb21haW5bal08ZG9tYWluWzBdKXtkb21haW49ZG9tYWluLnNsaWNlKCkucmV2ZXJzZSgpO3JhbmdlPXJhbmdlLnNsaWNlKCkucmV2ZXJzZSgpfXdoaWxlKCsraTxqKXtkW2ldPWRlaW50ZXJwb2xhdGUoZG9tYWluW2ldLGRvbWFpbltpKzFdKTtyW2ldPXJlaW50ZXJwb2xhdGUocmFuZ2VbaV0scmFuZ2VbaSsxXSl9cmV0dXJuIGZ1bmN0aW9uKHgpe3ZhciBpPWJpc2VjdFJpZ2h0KGRvbWFpbix4LDEsaiktMTtyZXR1cm4gcltpXShkW2ldKHgpKX19ZnVuY3Rpb24gY29weShzb3VyY2UsdGFyZ2V0KXtyZXR1cm4gdGFyZ2V0LmRvbWFpbihzb3VyY2UuZG9tYWluKCkpLnJhbmdlKHNvdXJjZS5yYW5nZSgpKS5pbnRlcnBvbGF0ZShzb3VyY2UuaW50ZXJwb2xhdGUoKSkuY2xhbXAoc291cmNlLmNsYW1wKCkpfWZ1bmN0aW9uIGNvbnRpbnVvdXMoZGVpbnRlcnBvbGF0ZSxyZWludGVycG9sYXRlKXt2YXIgZG9tYWluPXVuaXQscmFuZ2U9dW5pdCxpbnRlcnBvbGF0ZSQkMT1pbnRlcnBvbGF0ZSxjbGFtcD1mYWxzZSxwaWVjZXdpc2Usb3V0cHV0LGlucHV0O2Z1bmN0aW9uIHJlc2NhbGUoKXtwaWVjZXdpc2U9TWF0aC5taW4oZG9tYWluLmxlbmd0aCxyYW5nZS5sZW5ndGgpPjI/cG9seW1hcDpiaW1hcDtvdXRwdXQ9aW5wdXQ9bnVsbDtyZXR1cm4gc2NhbGV9ZnVuY3Rpb24gc2NhbGUoeCl7cmV0dXJuKG91dHB1dHx8KG91dHB1dD1waWVjZXdpc2UoZG9tYWluLHJhbmdlLGNsYW1wP2RlaW50ZXJwb2xhdGVDbGFtcChkZWludGVycG9sYXRlKTpkZWludGVycG9sYXRlLGludGVycG9sYXRlJCQxKSkpKCt4KX1zY2FsZS5pbnZlcnQ9ZnVuY3Rpb24oeSl7cmV0dXJuKGlucHV0fHwoaW5wdXQ9cGllY2V3aXNlKHJhbmdlLGRvbWFpbixkZWludGVycG9sYXRlTGluZWFyLGNsYW1wP3JlaW50ZXJwb2xhdGVDbGFtcChyZWludGVycG9sYXRlKTpyZWludGVycG9sYXRlKSkpKCt5KX07c2NhbGUuZG9tYWluPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkb21haW49bWFwJDMuY2FsbChfLG51bWJlciQxKSxyZXNjYWxlKCkpOmRvbWFpbi5zbGljZSgpfTtzY2FsZS5yYW5nZT1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocmFuZ2U9c2xpY2UkMy5jYWxsKF8pLHJlc2NhbGUoKSk6cmFuZ2Uuc2xpY2UoKX07c2NhbGUucmFuZ2VSb3VuZD1mdW5jdGlvbihfKXtyZXR1cm4gcmFuZ2U9c2xpY2UkMy5jYWxsKF8pLGludGVycG9sYXRlJCQxPWludGVycG9sYXRlUm91bmQscmVzY2FsZSgpfTtzY2FsZS5jbGFtcD1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oY2xhbXA9ISFfLHJlc2NhbGUoKSk6Y2xhbXB9O3NjYWxlLmludGVycG9sYXRlPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpbnRlcnBvbGF0ZSQkMT1fLHJlc2NhbGUoKSk6aW50ZXJwb2xhdGUkJDF9O3JldHVybiByZXNjYWxlKCl9dmFyIGZvcm1hdERlY2ltYWw9ZnVuY3Rpb24oeCxwKXtpZigoaT0oeD1wP3gudG9FeHBvbmVudGlhbChwLTEpOngudG9FeHBvbmVudGlhbCgpKS5pbmRleE9mKCJlIikpPDApcmV0dXJuIG51bGw7dmFyIGksY29lZmZpY2llbnQ9eC5zbGljZSgwLGkpO3JldHVybltjb2VmZmljaWVudC5sZW5ndGg+MT9jb2VmZmljaWVudFswXStjb2VmZmljaWVudC5zbGljZSgyKTpjb2VmZmljaWVudCwreC5zbGljZShpKzEpXX07dmFyIGV4cG9uZW50JDE9ZnVuY3Rpb24oeCl7cmV0dXJuIHg9Zm9ybWF0RGVjaW1hbChNYXRoLmFicyh4KSkseD94WzFdOk5hTn07dmFyIGZvcm1hdEdyb3VwPWZ1bmN0aW9uKGdyb3VwaW5nLHRob3VzYW5kcyl7cmV0dXJuIGZ1bmN0aW9uKHZhbHVlLHdpZHRoKXt2YXIgaT12YWx1ZS5sZW5ndGgsdD1bXSxqPTAsZz1ncm91cGluZ1swXSxsZW5ndGg9MDt3aGlsZShpPjAmJmc+MCl7aWYobGVuZ3RoK2crMT53aWR0aClnPU1hdGgubWF4KDEsd2lkdGgtbGVuZ3RoKTt0LnB1c2godmFsdWUuc3Vic3RyaW5nKGktPWcsaStnKSk7aWYoKGxlbmd0aCs9ZysxKT53aWR0aClicmVhaztnPWdyb3VwaW5nW2o9KGorMSklZ3JvdXBpbmcubGVuZ3RoXX1yZXR1cm4gdC5yZXZlcnNlKCkuam9pbih0aG91c2FuZHMpfX07dmFyIGZvcm1hdE51bWVyYWxzPWZ1bmN0aW9uKG51bWVyYWxzKXtyZXR1cm4gZnVuY3Rpb24odmFsdWUpe3JldHVybiB2YWx1ZS5yZXBsYWNlKC9bMC05XS9nLGZ1bmN0aW9uKGkpe3JldHVybiBudW1lcmFsc1sraV19KX19O3ZhciBmb3JtYXREZWZhdWx0PWZ1bmN0aW9uKHgscCl7eD14LnRvUHJlY2lzaW9uKHApO291dDpmb3IodmFyIG49eC5sZW5ndGgsaT0xLGkwPS0xLGkxO2k8bjsrK2kpe3N3aXRjaCh4W2ldKXtjYXNlIi4iOmkwPWkxPWk7YnJlYWs7Y2FzZSIwIjppZihpMD09PTApaTA9aTtpMT1pO2JyZWFrO2Nhc2UiZSI6YnJlYWsgb3V0O2RlZmF1bHQ6aWYoaTA+MClpMD0wO2JyZWFrfX1yZXR1cm4gaTA+MD94LnNsaWNlKDAsaTApK3guc2xpY2UoaTErMSk6eH07dmFyIHByZWZpeEV4cG9uZW50O3ZhciBmb3JtYXRQcmVmaXhBdXRvPWZ1bmN0aW9uKHgscCl7dmFyIGQ9Zm9ybWF0RGVjaW1hbCh4LHApO2lmKCFkKXJldHVybiB4KyIiO3ZhciBjb2VmZmljaWVudD1kWzBdLGV4cG9uZW50PWRbMV0saT1leHBvbmVudC0ocHJlZml4RXhwb25lbnQ9TWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKGV4cG9uZW50LzMpKSkqMykrMSxuPWNvZWZmaWNpZW50Lmxlbmd0aDtyZXR1cm4gaT09PW4/Y29lZmZpY2llbnQ6aT5uP2NvZWZmaWNpZW50K25ldyBBcnJheShpLW4rMSkuam9pbigiMCIpOmk+MD9jb2VmZmljaWVudC5zbGljZSgwLGkpKyIuIitjb2VmZmljaWVudC5zbGljZShpKToiMC4iK25ldyBBcnJheSgxLWkpLmpvaW4oIjAiKStmb3JtYXREZWNpbWFsKHgsTWF0aC5tYXgoMCxwK2ktMSkpWzBdfTt2YXIgZm9ybWF0Um91bmRlZD1mdW5jdGlvbih4LHApe3ZhciBkPWZvcm1hdERlY2ltYWwoeCxwKTtpZighZClyZXR1cm4geCsiIjt2YXIgY29lZmZpY2llbnQ9ZFswXSxleHBvbmVudD1kWzFdO3JldHVybiBleHBvbmVudDwwPyIwLiIrbmV3IEFycmF5KC1leHBvbmVudCkuam9pbigiMCIpK2NvZWZmaWNpZW50OmNvZWZmaWNpZW50Lmxlbmd0aD5leHBvbmVudCsxP2NvZWZmaWNpZW50LnNsaWNlKDAsZXhwb25lbnQrMSkrIi4iK2NvZWZmaWNpZW50LnNsaWNlKGV4cG9uZW50KzEpOmNvZWZmaWNpZW50K25ldyBBcnJheShleHBvbmVudC1jb2VmZmljaWVudC5sZW5ndGgrMikuam9pbigiMCIpfTt2YXIgZm9ybWF0VHlwZXM9eyIiOmZvcm1hdERlZmF1bHQsIiUiOmZ1bmN0aW9uIF8oeCxwKXtyZXR1cm4oeCoxMDApLnRvRml4ZWQocCl9LGI6ZnVuY3Rpb24gYih4KXtyZXR1cm4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygyKX0sYzpmdW5jdGlvbiBjKHgpe3JldHVybiB4KyIifSxkOmZ1bmN0aW9uIGQoeCl7cmV0dXJuIE1hdGgucm91bmQoeCkudG9TdHJpbmcoMTApfSxlOmZ1bmN0aW9uIGUoeCxwKXtyZXR1cm4geC50b0V4cG9uZW50aWFsKHApfSxmOmZ1bmN0aW9uIGYoeCxwKXtyZXR1cm4geC50b0ZpeGVkKHApfSxnOmZ1bmN0aW9uIGcoeCxwKXtyZXR1cm4geC50b1ByZWNpc2lvbihwKX0sbzpmdW5jdGlvbiBvKHgpe3JldHVybiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDgpfSxwOmZ1bmN0aW9uIHAoeCxfcCl7cmV0dXJuIGZvcm1hdFJvdW5kZWQoeCoxMDAsX3ApfSxyOmZvcm1hdFJvdW5kZWQsczpmb3JtYXRQcmVmaXhBdXRvLFg6ZnVuY3Rpb24gWCh4KXtyZXR1cm4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX0seDpmdW5jdGlvbiB4KF94KXtyZXR1cm4gTWF0aC5yb3VuZChfeCkudG9TdHJpbmcoMTYpfX07dmFyIHJlPS9eKD86KC4pPyhbPD49Xl0pKT8oWytcLVwoIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KFthLXolXSk/JC9pO2Z1bmN0aW9uIGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpe3JldHVybiBuZXcgRm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllcil9Zm9ybWF0U3BlY2lmaWVyLnByb3RvdHlwZT1Gb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlO2Z1bmN0aW9uIEZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpe2lmKCEobWF0Y2g9cmUuZXhlYyhzcGVjaWZpZXIpKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZm9ybWF0OiAiK3NwZWNpZmllcik7dmFyIG1hdGNoLGZpbGw9bWF0Y2hbMV18fCIgIixhbGlnbj1tYXRjaFsyXXx8Ij4iLHNpZ249bWF0Y2hbM118fCItIixzeW1ib2w9bWF0Y2hbNF18fCIiLHplcm89ISFtYXRjaFs1XSx3aWR0aD1tYXRjaFs2XSYmK21hdGNoWzZdLGNvbW1hPSEhbWF0Y2hbN10scHJlY2lzaW9uPW1hdGNoWzhdJiYrbWF0Y2hbOF0uc2xpY2UoMSksdHlwZT1tYXRjaFs5XXx8IiI7aWYodHlwZT09PSJuIiljb21tYT10cnVlLHR5cGU9ImciO2Vsc2UgaWYoIWZvcm1hdFR5cGVzW3R5cGVdKXR5cGU9IiI7aWYoemVyb3x8ZmlsbD09PSIwIiYmYWxpZ249PT0iPSIpemVybz10cnVlLGZpbGw9IjAiLGFsaWduPSI9Ijt0aGlzLmZpbGw9ZmlsbDt0aGlzLmFsaWduPWFsaWduO3RoaXMuc2lnbj1zaWduO3RoaXMuc3ltYm9sPXN5bWJvbDt0aGlzLnplcm89emVybzt0aGlzLndpZHRoPXdpZHRoO3RoaXMuY29tbWE9Y29tbWE7dGhpcy5wcmVjaXNpb249cHJlY2lzaW9uO3RoaXMudHlwZT10eXBlfUZvcm1hdFNwZWNpZmllci5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWxsK3RoaXMuYWxpZ24rdGhpcy5zaWduK3RoaXMuc3ltYm9sKyh0aGlzLnplcm8/IjAiOiIiKSsodGhpcy53aWR0aD09bnVsbD8iIjpNYXRoLm1heCgxLHRoaXMud2lkdGh8MCkpKyh0aGlzLmNvbW1hPyIsIjoiIikrKHRoaXMucHJlY2lzaW9uPT1udWxsPyIiOiIuIitNYXRoLm1heCgwLHRoaXMucHJlY2lzaW9ufDApKSt0aGlzLnR5cGV9O3ZhciBpZGVudGl0eSQ1PWZ1bmN0aW9uKHgpe3JldHVybiB4fTt2YXIgcHJlZml4ZXM9WyJ5IiwieiIsImEiLCJmIiwicCIsIm4iLCLCtSIsIm0iLCIiLCJrIiwiTSIsIkciLCJUIiwiUCIsIkUiLCJaIiwiWSJdO3ZhciBmb3JtYXRMb2NhbGU9ZnVuY3Rpb24obG9jYWxlKXt2YXIgZ3JvdXA9bG9jYWxlLmdyb3VwaW5nJiZsb2NhbGUudGhvdXNhbmRzP2Zvcm1hdEdyb3VwKGxvY2FsZS5ncm91cGluZyxsb2NhbGUudGhvdXNhbmRzKTppZGVudGl0eSQ1LGN1cnJlbmN5PWxvY2FsZS5jdXJyZW5jeSxkZWNpbWFsPWxvY2FsZS5kZWNpbWFsLG51bWVyYWxzPWxvY2FsZS5udW1lcmFscz9mb3JtYXROdW1lcmFscyhsb2NhbGUubnVtZXJhbHMpOmlkZW50aXR5JDUscGVyY2VudD1sb2NhbGUucGVyY2VudHx8IiUiO2Z1bmN0aW9uIG5ld0Zvcm1hdChzcGVjaWZpZXIpe3NwZWNpZmllcj1mb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKTt2YXIgZmlsbD1zcGVjaWZpZXIuZmlsbCxhbGlnbj1zcGVjaWZpZXIuYWxpZ24sc2lnbj1zcGVjaWZpZXIuc2lnbixzeW1ib2w9c3BlY2lmaWVyLnN5bWJvbCx6ZXJvPXNwZWNpZmllci56ZXJvLHdpZHRoPXNwZWNpZmllci53aWR0aCxjb21tYT1zcGVjaWZpZXIuY29tbWEscHJlY2lzaW9uPXNwZWNpZmllci5wcmVjaXNpb24sdHlwZT1zcGVjaWZpZXIudHlwZTt2YXIgcHJlZml4PXN5bWJvbD09PSIkIj9jdXJyZW5jeVswXTpzeW1ib2w9PT0iIyImJi9bYm94WF0vLnRlc3QodHlwZSk/IjAiK3R5cGUudG9Mb3dlckNhc2UoKToiIixzdWZmaXg9c3ltYm9sPT09IiQiP2N1cnJlbmN5WzFdOi9bJXBdLy50ZXN0KHR5cGUpP3BlcmNlbnQ6IiI7dmFyIGZvcm1hdFR5cGU9Zm9ybWF0VHlwZXNbdHlwZV0sbWF5YmVTdWZmaXg9IXR5cGV8fC9bZGVmZ3BycyVdLy50ZXN0KHR5cGUpO3ByZWNpc2lvbj1wcmVjaXNpb249PW51bGw/dHlwZT82OjEyOi9bZ3Byc10vLnRlc3QodHlwZSk/TWF0aC5tYXgoMSxNYXRoLm1pbigyMSxwcmVjaXNpb24pKTpNYXRoLm1heCgwLE1hdGgubWluKDIwLHByZWNpc2lvbikpO2Z1bmN0aW9uIGZvcm1hdCh2YWx1ZSl7dmFyIHZhbHVlUHJlZml4PXByZWZpeCx2YWx1ZVN1ZmZpeD1zdWZmaXgsaSxuLGM7aWYodHlwZT09PSJjIil7dmFsdWVTdWZmaXg9Zm9ybWF0VHlwZSh2YWx1ZSkrdmFsdWVTdWZmaXg7dmFsdWU9IiJ9ZWxzZXt2YWx1ZT0rdmFsdWU7dmFyIHZhbHVlTmVnYXRpdmU9dmFsdWU8MDt2YWx1ZT1mb3JtYXRUeXBlKE1hdGguYWJzKHZhbHVlKSxwcmVjaXNpb24pO2lmKHZhbHVlTmVnYXRpdmUmJit2YWx1ZT09PTApdmFsdWVOZWdhdGl2ZT1mYWxzZTt2YWx1ZVByZWZpeD0odmFsdWVOZWdhdGl2ZT9zaWduPT09IigiP3NpZ246Ii0iOnNpZ249PT0iLSJ8fHNpZ249PT0iKCI/IiI6c2lnbikrdmFsdWVQcmVmaXg7dmFsdWVTdWZmaXg9dmFsdWVTdWZmaXgrKHR5cGU9PT0icyI/cHJlZml4ZXNbOCtwcmVmaXhFeHBvbmVudC8zXToiIikrKHZhbHVlTmVnYXRpdmUmJnNpZ249PT0iKCI/IikiOiIiKTtpZihtYXliZVN1ZmZpeCl7aT0tMSxuPXZhbHVlLmxlbmd0aDt3aGlsZSgrK2k8bil7aWYoYz12YWx1ZS5jaGFyQ29kZUF0KGkpLDQ4PmN8fGM+NTcpe3ZhbHVlU3VmZml4PShjPT09NDY/ZGVjaW1hbCt2YWx1ZS5zbGljZShpKzEpOnZhbHVlLnNsaWNlKGkpKSt2YWx1ZVN1ZmZpeDt2YWx1ZT12YWx1ZS5zbGljZSgwLGkpO2JyZWFrfX19fWlmKGNvbW1hJiYhemVybyl2YWx1ZT1ncm91cCh2YWx1ZSxJbmZpbml0eSk7dmFyIGxlbmd0aD12YWx1ZVByZWZpeC5sZW5ndGgrdmFsdWUubGVuZ3RoK3ZhbHVlU3VmZml4Lmxlbmd0aCxwYWRkaW5nPWxlbmd0aDx3aWR0aD9uZXcgQXJyYXkod2lkdGgtbGVuZ3RoKzEpLmpvaW4oZmlsbCk6IiI7aWYoY29tbWEmJnplcm8pdmFsdWU9Z3JvdXAocGFkZGluZyt2YWx1ZSxwYWRkaW5nLmxlbmd0aD93aWR0aC12YWx1ZVN1ZmZpeC5sZW5ndGg6SW5maW5pdHkpLHBhZGRpbmc9IiI7c3dpdGNoKGFsaWduKXtjYXNlIjwiOnZhbHVlPXZhbHVlUHJlZml4K3ZhbHVlK3ZhbHVlU3VmZml4K3BhZGRpbmc7YnJlYWs7Y2FzZSI9Ijp2YWx1ZT12YWx1ZVByZWZpeCtwYWRkaW5nK3ZhbHVlK3ZhbHVlU3VmZml4O2JyZWFrO2Nhc2UiXiI6dmFsdWU9cGFkZGluZy5zbGljZSgwLGxlbmd0aD1wYWRkaW5nLmxlbmd0aD4+MSkrdmFsdWVQcmVmaXgrdmFsdWUrdmFsdWVTdWZmaXgrcGFkZGluZy5zbGljZShsZW5ndGgpO2JyZWFrO2RlZmF1bHQ6dmFsdWU9cGFkZGluZyt2YWx1ZVByZWZpeCt2YWx1ZSt2YWx1ZVN1ZmZpeDticmVha31yZXR1cm4gbnVtZXJhbHModmFsdWUpfWZvcm1hdC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBzcGVjaWZpZXIrIiJ9O3JldHVybiBmb3JtYXR9ZnVuY3Rpb24gZm9ybWF0UHJlZml4KHNwZWNpZmllcix2YWx1ZSl7dmFyIGY9bmV3Rm9ybWF0KChzcGVjaWZpZXI9Zm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllciksc3BlY2lmaWVyLnR5cGU9ImYiLHNwZWNpZmllcikpLGU9TWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKGV4cG9uZW50JDEodmFsdWUpLzMpKSkqMyxrPU1hdGgucG93KDEwLC1lKSxwcmVmaXg9cHJlZml4ZXNbOCtlLzNdO3JldHVybiBmdW5jdGlvbih2YWx1ZSl7cmV0dXJuIGYoayp2YWx1ZSkrcHJlZml4fX1yZXR1cm57Zm9ybWF0Om5ld0Zvcm1hdCxmb3JtYXRQcmVmaXg6Zm9ybWF0UHJlZml4fX07dmFyIGxvY2FsZTt2YXIgZm9ybWF0O3ZhciBmb3JtYXRQcmVmaXg7ZGVmYXVsdExvY2FsZSh7ZGVjaW1hbDoiLiIsdGhvdXNhbmRzOiIsIixncm91cGluZzpbM10sY3VycmVuY3k6WyIkIiwiIl19KTtmdW5jdGlvbiBkZWZhdWx0TG9jYWxlKGRlZmluaXRpb24pe2xvY2FsZT1mb3JtYXRMb2NhbGUoZGVmaW5pdGlvbik7Zm9ybWF0PWxvY2FsZS5mb3JtYXQ7Zm9ybWF0UHJlZml4PWxvY2FsZS5mb3JtYXRQcmVmaXg7cmV0dXJuIGxvY2FsZX12YXIgcHJlY2lzaW9uRml4ZWQ9ZnVuY3Rpb24oc3RlcCl7cmV0dXJuIE1hdGgubWF4KDAsLWV4cG9uZW50JDEoTWF0aC5hYnMoc3RlcCkpKX07dmFyIHByZWNpc2lvblByZWZpeD1mdW5jdGlvbihzdGVwLHZhbHVlKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoZXhwb25lbnQkMSh2YWx1ZSkvMykpKSozLWV4cG9uZW50JDEoTWF0aC5hYnMoc3RlcCkpKX07dmFyIHByZWNpc2lvblJvdW5kPWZ1bmN0aW9uKHN0ZXAsbWF4KXtzdGVwPU1hdGguYWJzKHN0ZXApLG1heD1NYXRoLmFicyhtYXgpLXN0ZXA7cmV0dXJuIE1hdGgubWF4KDAsZXhwb25lbnQkMShtYXgpLWV4cG9uZW50JDEoc3RlcCkpKzF9O3ZhciB0aWNrRm9ybWF0PWZ1bmN0aW9uKGRvbWFpbixjb3VudCxzcGVjaWZpZXIpe3ZhciBzdGFydD1kb21haW5bMF0sc3RvcD1kb21haW5bZG9tYWluLmxlbmd0aC0xXSxzdGVwPXRpY2tTdGVwKHN0YXJ0LHN0b3AsY291bnQ9PW51bGw/MTA6Y291bnQpLHByZWNpc2lvbjtzcGVjaWZpZXI9Zm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllcj09bnVsbD8iLGYiOnNwZWNpZmllcik7c3dpdGNoKHNwZWNpZmllci50eXBlKXtjYXNlInMiOnt2YXIgdmFsdWU9TWF0aC5tYXgoTWF0aC5hYnMoc3RhcnQpLE1hdGguYWJzKHN0b3ApKTtpZihzcGVjaWZpZXIucHJlY2lzaW9uPT1udWxsJiYhaXNOYU4ocHJlY2lzaW9uPXByZWNpc2lvblByZWZpeChzdGVwLHZhbHVlKSkpc3BlY2lmaWVyLnByZWNpc2lvbj1wcmVjaXNpb247cmV0dXJuIGZvcm1hdFByZWZpeChzcGVjaWZpZXIsdmFsdWUpfWNhc2UiIjpjYXNlImUiOmNhc2UiZyI6Y2FzZSJwIjpjYXNlInIiOntpZihzcGVjaWZpZXIucHJlY2lzaW9uPT1udWxsJiYhaXNOYU4ocHJlY2lzaW9uPXByZWNpc2lvblJvdW5kKHN0ZXAsTWF0aC5tYXgoTWF0aC5hYnMoc3RhcnQpLE1hdGguYWJzKHN0b3ApKSkpKXNwZWNpZmllci5wcmVjaXNpb249cHJlY2lzaW9uLShzcGVjaWZpZXIudHlwZT09PSJlIik7YnJlYWt9Y2FzZSJmIjpjYXNlIiUiOntpZihzcGVjaWZpZXIucHJlY2lzaW9uPT1udWxsJiYhaXNOYU4ocHJlY2lzaW9uPXByZWNpc2lvbkZpeGVkKHN0ZXApKSlzcGVjaWZpZXIucHJlY2lzaW9uPXByZWNpc2lvbi0oc3BlY2lmaWVyLnR5cGU9PT0iJSIpKjI7YnJlYWt9fXJldHVybiBmb3JtYXQoc3BlY2lmaWVyKX07ZnVuY3Rpb24gbGluZWFyaXNoKHNjYWxlKXt2YXIgZG9tYWluPXNjYWxlLmRvbWFpbjtzY2FsZS50aWNrcz1mdW5jdGlvbihjb3VudCl7dmFyIGQ9ZG9tYWluKCk7cmV0dXJuIHRpY2tzKGRbMF0sZFtkLmxlbmd0aC0xXSxjb3VudD09bnVsbD8xMDpjb3VudCl9O3NjYWxlLnRpY2tGb3JtYXQ9ZnVuY3Rpb24oY291bnQsc3BlY2lmaWVyKXtyZXR1cm4gdGlja0Zvcm1hdChkb21haW4oKSxjb3VudCxzcGVjaWZpZXIpfTtzY2FsZS5uaWNlPWZ1bmN0aW9uKGNvdW50KXt2YXIgZD1kb21haW4oKSxpPWQubGVuZ3RoLTEsbj1jb3VudD09bnVsbD8xMDpjb3VudCxzdGFydD1kWzBdLHN0b3A9ZFtpXSxzdGVwPXRpY2tTdGVwKHN0YXJ0LHN0b3Asbik7aWYoc3RlcCl7c3RlcD10aWNrU3RlcChNYXRoLmZsb29yKHN0YXJ0L3N0ZXApKnN0ZXAsTWF0aC5jZWlsKHN0b3Avc3RlcCkqc3RlcCxuKTtkWzBdPU1hdGguZmxvb3Ioc3RhcnQvc3RlcCkqc3RlcDtkW2ldPU1hdGguY2VpbChzdG9wL3N0ZXApKnN0ZXA7ZG9tYWluKGQpfXJldHVybiBzY2FsZX07cmV0dXJuIHNjYWxlfWZ1bmN0aW9uIGxpbmVhciQyKCl7dmFyIHNjYWxlPWNvbnRpbnVvdXMoZGVpbnRlcnBvbGF0ZUxpbmVhcixpbnRlcnBvbGF0ZU51bWJlcik7c2NhbGUuY29weT1mdW5jdGlvbigpe3JldHVybiBjb3B5KHNjYWxlLGxpbmVhciQyKCkpfTtyZXR1cm4gbGluZWFyaXNoKHNjYWxlKX1mdW5jdGlvbiBpZGVudGl0eSQ0KCl7dmFyIGRvbWFpbj1bMCwxXTtmdW5jdGlvbiBzY2FsZSh4KXtyZXR1cm4reH1zY2FsZS5pbnZlcnQ9c2NhbGU7c2NhbGUuZG9tYWluPXNjYWxlLnJhbmdlPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkb21haW49bWFwJDMuY2FsbChfLG51bWJlciQxKSxzY2FsZSk6ZG9tYWluLnNsaWNlKCl9O3NjYWxlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gaWRlbnRpdHkkNCgpLmRvbWFpbihkb21haW4pfTtyZXR1cm4gbGluZWFyaXNoKHNjYWxlKX12YXIgbmljZT1mdW5jdGlvbihkb21haW4saW50ZXJ2YWwpe2RvbWFpbj1kb21haW4uc2xpY2UoKTt2YXIgaTA9MCxpMT1kb21haW4ubGVuZ3RoLTEseDA9ZG9tYWluW2kwXSx4MT1kb21haW5baTFdLHQ7aWYoeDE8eDApe3Q9aTAsaTA9aTEsaTE9dDt0PXgwLHgwPXgxLHgxPXR9ZG9tYWluW2kwXT1pbnRlcnZhbC5mbG9vcih4MCk7ZG9tYWluW2kxXT1pbnRlcnZhbC5jZWlsKHgxKTtyZXR1cm4gZG9tYWlufTtmdW5jdGlvbiBkZWludGVycG9sYXRlKGEsYil7cmV0dXJuKGI9TWF0aC5sb2coYi9hKSk/ZnVuY3Rpb24oeCl7cmV0dXJuIE1hdGgubG9nKHgvYSkvYn06Y29uc3RhbnQkNihiKX1mdW5jdGlvbiByZWludGVycG9sYXRlKGEsYil7cmV0dXJuIGE8MD9mdW5jdGlvbih0KXtyZXR1cm4tTWF0aC5wb3coLWIsdCkqTWF0aC5wb3coLWEsMS10KX06ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucG93KGIsdCkqTWF0aC5wb3coYSwxLXQpfX1mdW5jdGlvbiBwb3cxMCh4KXtyZXR1cm4gaXNGaW5pdGUoeCk/KygiMWUiK3gpOng8MD8wOnh9ZnVuY3Rpb24gcG93cChiYXNlKXtyZXR1cm4gYmFzZT09PTEwP3BvdzEwOmJhc2U9PT1NYXRoLkU/TWF0aC5leHA6ZnVuY3Rpb24oeCl7cmV0dXJuIE1hdGgucG93KGJhc2UseCl9fWZ1bmN0aW9uIGxvZ3AoYmFzZSl7cmV0dXJuIGJhc2U9PT1NYXRoLkU/TWF0aC5sb2c6YmFzZT09PTEwJiZNYXRoLmxvZzEwfHxiYXNlPT09MiYmTWF0aC5sb2cyfHwoYmFzZT1NYXRoLmxvZyhiYXNlKSxmdW5jdGlvbih4KXtyZXR1cm4gTWF0aC5sb2coeCkvYmFzZX0pfWZ1bmN0aW9uIHJlZmxlY3QoZil7cmV0dXJuIGZ1bmN0aW9uKHgpe3JldHVybi1mKC14KX19ZnVuY3Rpb24gbG9nKCl7dmFyIHNjYWxlPWNvbnRpbnVvdXMoZGVpbnRlcnBvbGF0ZSxyZWludGVycG9sYXRlKS5kb21haW4oWzEsMTBdKSxkb21haW49c2NhbGUuZG9tYWluLGJhc2U9MTAsbG9ncz1sb2dwKDEwKSxwb3dzPXBvd3AoMTApO2Z1bmN0aW9uIHJlc2NhbGUoKXtsb2dzPWxvZ3AoYmFzZSkscG93cz1wb3dwKGJhc2UpO2lmKGRvbWFpbigpWzBdPDApbG9ncz1yZWZsZWN0KGxvZ3MpLHBvd3M9cmVmbGVjdChwb3dzKTtyZXR1cm4gc2NhbGV9c2NhbGUuYmFzZT1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYmFzZT0rXyxyZXNjYWxlKCkpOmJhc2V9O3NjYWxlLmRvbWFpbj1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZG9tYWluKF8pLHJlc2NhbGUoKSk6ZG9tYWluKCl9O3NjYWxlLnRpY2tzPWZ1bmN0aW9uKGNvdW50KXt2YXIgZD1kb21haW4oKSx1PWRbMF0sdj1kW2QubGVuZ3RoLTFdLHI7aWYocj12PHUpaT11LHU9dix2PWk7dmFyIGk9bG9ncyh1KSxqPWxvZ3ModikscCxrLHQsbj1jb3VudD09bnVsbD8xMDorY291bnQsej1bXTtpZighKGJhc2UlMSkmJmotaTxuKXtpPU1hdGgucm91bmQoaSktMSxqPU1hdGgucm91bmQoaikrMTtpZih1PjApZm9yKDtpPGo7KytpKXtmb3Ioaz0xLHA9cG93cyhpKTtrPGJhc2U7KytrKXt0PXAqaztpZih0PHUpY29udGludWU7aWYodD52KWJyZWFrO3oucHVzaCh0KX19ZWxzZSBmb3IoO2k8ajsrK2kpe2ZvcihrPWJhc2UtMSxwPXBvd3MoaSk7az49MTstLWspe3Q9cCprO2lmKHQ8dSljb250aW51ZTtpZih0PnYpYnJlYWs7ei5wdXNoKHQpfX19ZWxzZXt6PXRpY2tzKGksaixNYXRoLm1pbihqLWksbikpLm1hcChwb3dzKX1yZXR1cm4gcj96LnJldmVyc2UoKTp6fTtzY2FsZS50aWNrRm9ybWF0PWZ1bmN0aW9uKGNvdW50LHNwZWNpZmllcil7aWYoc3BlY2lmaWVyPT1udWxsKXNwZWNpZmllcj1iYXNlPT09MTA/Ii4wZSI6IiwiO2lmKHR5cGVvZiBzcGVjaWZpZXIhPT0iZnVuY3Rpb24iKXNwZWNpZmllcj1mb3JtYXQoc3BlY2lmaWVyKTtpZihjb3VudD09PUluZmluaXR5KXJldHVybiBzcGVjaWZpZXI7aWYoY291bnQ9PW51bGwpY291bnQ9MTA7dmFyIGs9TWF0aC5tYXgoMSxiYXNlKmNvdW50L3NjYWxlLnRpY2tzKCkubGVuZ3RoKTtyZXR1cm4gZnVuY3Rpb24oZCl7dmFyIGk9ZC9wb3dzKE1hdGgucm91bmQobG9ncyhkKSkpO2lmKGkqYmFzZTxiYXNlLS41KWkqPWJhc2U7cmV0dXJuIGk8PWs/c3BlY2lmaWVyKGQpOiIifX07c2NhbGUubmljZT1mdW5jdGlvbigpe3JldHVybiBkb21haW4obmljZShkb21haW4oKSx7Zmxvb3I6ZnVuY3Rpb24gZmxvb3IoeCl7cmV0dXJuIHBvd3MoTWF0aC5mbG9vcihsb2dzKHgpKSl9LGNlaWw6ZnVuY3Rpb24gY2VpbCh4KXtyZXR1cm4gcG93cyhNYXRoLmNlaWwobG9ncyh4KSkpfX0pKX07c2NhbGUuY29weT1mdW5jdGlvbigpe3JldHVybiBjb3B5KHNjYWxlLGxvZygpLmJhc2UoYmFzZSkpfTtyZXR1cm4gc2NhbGV9ZnVuY3Rpb24gcmFpc2UkMSh4LGV4cG9uZW50KXtyZXR1cm4geDwwPy1NYXRoLnBvdygteCxleHBvbmVudCk6TWF0aC5wb3coeCxleHBvbmVudCl9ZnVuY3Rpb24gcG93KCl7dmFyIGV4cG9uZW50PTEsc2NhbGU9Y29udGludW91cyhkZWludGVycG9sYXRlLHJlaW50ZXJwb2xhdGUpLGRvbWFpbj1zY2FsZS5kb21haW47ZnVuY3Rpb24gZGVpbnRlcnBvbGF0ZShhLGIpe3JldHVybihiPXJhaXNlJDEoYixleHBvbmVudCktKGE9cmFpc2UkMShhLGV4cG9uZW50KSkpP2Z1bmN0aW9uKHgpe3JldHVybihyYWlzZSQxKHgsZXhwb25lbnQpLWEpL2J9OmNvbnN0YW50JDYoYil9ZnVuY3Rpb24gcmVpbnRlcnBvbGF0ZShhLGIpe2I9cmFpc2UkMShiLGV4cG9uZW50KS0oYT1yYWlzZSQxKGEsZXhwb25lbnQpKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHJhaXNlJDEoYStiKnQsMS9leHBvbmVudCl9fXNjYWxlLmV4cG9uZW50PWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhleHBvbmVudD0rXyxkb21haW4oZG9tYWluKCkpKTpleHBvbmVudH07c2NhbGUuY29weT1mdW5jdGlvbigpe3JldHVybiBjb3B5KHNjYWxlLHBvdygpLmV4cG9uZW50KGV4cG9uZW50KSl9O3JldHVybiBsaW5lYXJpc2goc2NhbGUpfWZ1bmN0aW9uIHNxcnQoKXtyZXR1cm4gcG93KCkuZXhwb25lbnQoLjUpfWZ1bmN0aW9uIHF1YW50aWxlJDEoKXt2YXIgZG9tYWluPVtdLHJhbmdlPVtdLHRocmVzaG9sZHM9W107ZnVuY3Rpb24gcmVzY2FsZSgpe3ZhciBpPTAsbj1NYXRoLm1heCgxLHJhbmdlLmxlbmd0aCk7dGhyZXNob2xkcz1uZXcgQXJyYXkobi0xKTt3aGlsZSgrK2k8bil7dGhyZXNob2xkc1tpLTFdPXF1YW50aWxlKGRvbWFpbixpL24pfXJldHVybiBzY2FsZX1mdW5jdGlvbiBzY2FsZSh4KXtpZighaXNOYU4oeD0reCkpcmV0dXJuIHJhbmdlW2Jpc2VjdFJpZ2h0KHRocmVzaG9sZHMseCldfXNjYWxlLmludmVydEV4dGVudD1mdW5jdGlvbih5KXt2YXIgaT1yYW5nZS5pbmRleE9mKHkpO3JldHVybiBpPDA/W05hTixOYU5dOltpPjA/dGhyZXNob2xkc1tpLTFdOmRvbWFpblswXSxpPHRocmVzaG9sZHMubGVuZ3RoP3RocmVzaG9sZHNbaV06ZG9tYWluW2RvbWFpbi5sZW5ndGgtMV1dfTtzY2FsZS5kb21haW49ZnVuY3Rpb24oXyl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGRvbWFpbi5zbGljZSgpO2RvbWFpbj1bXTtmb3IodmFyIGk9MCxuPV8ubGVuZ3RoLGQ7aTxuOysraSl7aWYoZD1fW2ldLGQhPW51bGwmJiFpc05hTihkPStkKSlkb21haW4ucHVzaChkKX1kb21haW4uc29ydChhc2NlbmRpbmckMSk7cmV0dXJuIHJlc2NhbGUoKX07c2NhbGUucmFuZ2U9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHJhbmdlPXNsaWNlJDMuY2FsbChfKSxyZXNjYWxlKCkpOnJhbmdlLnNsaWNlKCl9O3NjYWxlLnF1YW50aWxlcz1mdW5jdGlvbigpe3JldHVybiB0aHJlc2hvbGRzLnNsaWNlKCl9O3NjYWxlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gcXVhbnRpbGUkMSgpLmRvbWFpbihkb21haW4pLnJhbmdlKHJhbmdlKX07cmV0dXJuIHNjYWxlfWZ1bmN0aW9uIHF1YW50aXplJDEoKXt2YXIgeDA9MCx4MT0xLG49MSxkb21haW49Wy41XSxyYW5nZT1bMCwxXTtmdW5jdGlvbiBzY2FsZSh4KXtpZih4PD14KXJldHVybiByYW5nZVtiaXNlY3RSaWdodChkb21haW4seCwwLG4pXX1mdW5jdGlvbiByZXNjYWxlKCl7dmFyIGk9LTE7ZG9tYWluPW5ldyBBcnJheShuKTt3aGlsZSgrK2k8bil7ZG9tYWluW2ldPSgoaSsxKSp4MS0oaS1uKSp4MCkvKG4rMSl9cmV0dXJuIHNjYWxlfXNjYWxlLmRvbWFpbj1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeDA9K19bMF0seDE9K19bMV0scmVzY2FsZSgpKTpbeDAseDFdfTtzY2FsZS5yYW5nZT1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0ocmFuZ2U9c2xpY2UkMy5jYWxsKF8pKS5sZW5ndGgtMSxyZXNjYWxlKCkpOnJhbmdlLnNsaWNlKCl9O3NjYWxlLmludmVydEV4dGVudD1mdW5jdGlvbih5KXt2YXIgaT1yYW5nZS5pbmRleE9mKHkpO3JldHVybiBpPDA/W05hTixOYU5dOmk8MT9beDAsZG9tYWluWzBdXTppPj1uP1tkb21haW5bbi0xXSx4MV06W2RvbWFpbltpLTFdLGRvbWFpbltpXV19O3NjYWxlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gcXVhbnRpemUkMSgpLmRvbWFpbihbeDAseDFdKS5yYW5nZShyYW5nZSl9O3JldHVybiBsaW5lYXJpc2goc2NhbGUpfWZ1bmN0aW9uIHRocmVzaG9sZCQyKCl7dmFyIGRvbWFpbj1bLjVdLHJhbmdlPVswLDFdLG49MTtmdW5jdGlvbiBzY2FsZSh4KXtpZih4PD14KXJldHVybiByYW5nZVtiaXNlY3RSaWdodChkb21haW4seCwwLG4pXX1zY2FsZS5kb21haW49ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGRvbWFpbj1zbGljZSQzLmNhbGwoXyksbj1NYXRoLm1pbihkb21haW4ubGVuZ3RoLHJhbmdlLmxlbmd0aC0xKSxzY2FsZSk6ZG9tYWluLnNsaWNlKCl9O3NjYWxlLnJhbmdlPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyYW5nZT1zbGljZSQzLmNhbGwoXyksbj1NYXRoLm1pbihkb21haW4ubGVuZ3RoLHJhbmdlLmxlbmd0aC0xKSxzY2FsZSk6cmFuZ2Uuc2xpY2UoKX07c2NhbGUuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHkpe3ZhciBpPXJhbmdlLmluZGV4T2YoeSk7cmV0dXJuW2RvbWFpbltpLTFdLGRvbWFpbltpXV19O3NjYWxlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhyZXNob2xkJDIoKS5kb21haW4oZG9tYWluKS5yYW5nZShyYW5nZSl9O3JldHVybiBzY2FsZX12YXIgdDAkMT1uZXcgRGF0ZTt2YXIgdDEkMT1uZXcgRGF0ZTtmdW5jdGlvbiBuZXdJbnRlcnZhbChmbG9vcmksb2Zmc2V0aSxjb3VudCxmaWVsZCl7ZnVuY3Rpb24gaW50ZXJ2YWwoZGF0ZSl7cmV0dXJuIGZsb29yaShkYXRlPW5ldyBEYXRlKCtkYXRlKSksZGF0ZX1pbnRlcnZhbC5mbG9vcj1pbnRlcnZhbDtpbnRlcnZhbC5jZWlsPWZ1bmN0aW9uKGRhdGUpe3JldHVybiBmbG9vcmkoZGF0ZT1uZXcgRGF0ZShkYXRlLTEpKSxvZmZzZXRpKGRhdGUsMSksZmxvb3JpKGRhdGUpLGRhdGV9O2ludGVydmFsLnJvdW5kPWZ1bmN0aW9uKGRhdGUpe3ZhciBkMD1pbnRlcnZhbChkYXRlKSxkMT1pbnRlcnZhbC5jZWlsKGRhdGUpO3JldHVybiBkYXRlLWQwPGQxLWRhdGU/ZDA6ZDF9O2ludGVydmFsLm9mZnNldD1mdW5jdGlvbihkYXRlLHN0ZXApe3JldHVybiBvZmZzZXRpKGRhdGU9bmV3IERhdGUoK2RhdGUpLHN0ZXA9PW51bGw/MTpNYXRoLmZsb29yKHN0ZXApKSxkYXRlfTtpbnRlcnZhbC5yYW5nZT1mdW5jdGlvbihzdGFydCxzdG9wLHN0ZXApe3ZhciByYW5nZT1bXTtzdGFydD1pbnRlcnZhbC5jZWlsKHN0YXJ0KTtzdGVwPXN0ZXA9PW51bGw/MTpNYXRoLmZsb29yKHN0ZXApO2lmKCEoc3RhcnQ8c3RvcCl8fCEoc3RlcD4wKSlyZXR1cm4gcmFuZ2U7ZG97cmFuZ2UucHVzaChuZXcgRGF0ZSgrc3RhcnQpKX13aGlsZShvZmZzZXRpKHN0YXJ0LHN0ZXApLGZsb29yaShzdGFydCksc3RhcnQ8c3RvcCk7cmV0dXJuIHJhbmdlfTtpbnRlcnZhbC5maWx0ZXI9ZnVuY3Rpb24odGVzdCl7cmV0dXJuIG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpe2lmKGRhdGU+PWRhdGUpd2hpbGUoZmxvb3JpKGRhdGUpLCF0ZXN0KGRhdGUpKXtkYXRlLnNldFRpbWUoZGF0ZS0xKX19LGZ1bmN0aW9uKGRhdGUsc3RlcCl7aWYoZGF0ZT49ZGF0ZSl7aWYoc3RlcDwwKXdoaWxlKCsrc3RlcDw9MCl7d2hpbGUob2Zmc2V0aShkYXRlLC0xKSwhdGVzdChkYXRlKSl7fX1lbHNlIHdoaWxlKC0tc3RlcD49MCl7d2hpbGUob2Zmc2V0aShkYXRlLCsxKSwhdGVzdChkYXRlKSl7fX19fSl9O2lmKGNvdW50KXtpbnRlcnZhbC5jb3VudD1mdW5jdGlvbihzdGFydCxlbmQpe3QwJDEuc2V0VGltZSgrc3RhcnQpLHQxJDEuc2V0VGltZSgrZW5kKTtmbG9vcmkodDAkMSksZmxvb3JpKHQxJDEpO3JldHVybiBNYXRoLmZsb29yKGNvdW50KHQwJDEsdDEkMSkpfTtpbnRlcnZhbC5ldmVyeT1mdW5jdGlvbihzdGVwKXtzdGVwPU1hdGguZmxvb3Ioc3RlcCk7cmV0dXJuIWlzRmluaXRlKHN0ZXApfHwhKHN0ZXA+MCk/bnVsbDohKHN0ZXA+MSk/aW50ZXJ2YWw6aW50ZXJ2YWwuZmlsdGVyKGZpZWxkP2Z1bmN0aW9uKGQpe3JldHVybiBmaWVsZChkKSVzdGVwPT09MH06ZnVuY3Rpb24oZCl7cmV0dXJuIGludGVydmFsLmNvdW50KDAsZCklc3RlcD09PTB9KX19cmV0dXJuIGludGVydmFsfXZhciBtaWxsaXNlY29uZD1uZXdJbnRlcnZhbChmdW5jdGlvbigpe30sZnVuY3Rpb24oZGF0ZSxzdGVwKXtkYXRlLnNldFRpbWUoK2RhdGUrc3RlcCl9LGZ1bmN0aW9uKHN0YXJ0LGVuZCl7cmV0dXJuIGVuZC1zdGFydH0pO21pbGxpc2Vjb25kLmV2ZXJ5PWZ1bmN0aW9uKGspe2s9TWF0aC5mbG9vcihrKTtpZighaXNGaW5pdGUoayl8fCEoaz4wKSlyZXR1cm4gbnVsbDtpZighKGs+MSkpcmV0dXJuIG1pbGxpc2Vjb25kO3JldHVybiBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKXtkYXRlLnNldFRpbWUoTWF0aC5mbG9vcihkYXRlL2spKmspfSxmdW5jdGlvbihkYXRlLHN0ZXApe2RhdGUuc2V0VGltZSgrZGF0ZStzdGVwKmspfSxmdW5jdGlvbihzdGFydCxlbmQpe3JldHVybihlbmQtc3RhcnQpL2t9KX07dmFyIGR1cmF0aW9uU2Vjb25kJDE9MWUzO3ZhciBkdXJhdGlvbk1pbnV0ZSQxPTZlNDt2YXIgZHVyYXRpb25Ib3VyJDE9MzZlNTt2YXIgZHVyYXRpb25EYXkkMT04NjRlNTt2YXIgZHVyYXRpb25XZWVrJDE9NjA0OGU1O3ZhciBzZWNvbmQ9bmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSl7ZGF0ZS5zZXRUaW1lKE1hdGguZmxvb3IoZGF0ZS9kdXJhdGlvblNlY29uZCQxKSpkdXJhdGlvblNlY29uZCQxKX0sZnVuY3Rpb24oZGF0ZSxzdGVwKXtkYXRlLnNldFRpbWUoK2RhdGUrc3RlcCpkdXJhdGlvblNlY29uZCQxKX0sZnVuY3Rpb24oc3RhcnQsZW5kKXtyZXR1cm4oZW5kLXN0YXJ0KS9kdXJhdGlvblNlY29uZCQxfSxmdW5jdGlvbihkYXRlKXtyZXR1cm4gZGF0ZS5nZXRVVENTZWNvbmRzKCl9KTt2YXIgbWludXRlPW5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpe2RhdGUuc2V0VGltZShNYXRoLmZsb29yKGRhdGUvZHVyYXRpb25NaW51dGUkMSkqZHVyYXRpb25NaW51dGUkMSl9LGZ1bmN0aW9uKGRhdGUsc3RlcCl7ZGF0ZS5zZXRUaW1lKCtkYXRlK3N0ZXAqZHVyYXRpb25NaW51dGUkMSl9LGZ1bmN0aW9uKHN0YXJ0LGVuZCl7cmV0dXJuKGVuZC1zdGFydCkvZHVyYXRpb25NaW51dGUkMX0sZnVuY3Rpb24oZGF0ZSl7cmV0dXJuIGRhdGUuZ2V0TWludXRlcygpfSk7dmFyIGhvdXI9bmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSl7dmFyIG9mZnNldD1kYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkqZHVyYXRpb25NaW51dGUkMSVkdXJhdGlvbkhvdXIkMTtpZihvZmZzZXQ8MClvZmZzZXQrPWR1cmF0aW9uSG91ciQxO2RhdGUuc2V0VGltZShNYXRoLmZsb29yKCgrZGF0ZS1vZmZzZXQpL2R1cmF0aW9uSG91ciQxKSpkdXJhdGlvbkhvdXIkMStvZmZzZXQpfSxmdW5jdGlvbihkYXRlLHN0ZXApe2RhdGUuc2V0VGltZSgrZGF0ZStzdGVwKmR1cmF0aW9uSG91ciQxKX0sZnVuY3Rpb24oc3RhcnQsZW5kKXtyZXR1cm4oZW5kLXN0YXJ0KS9kdXJhdGlvbkhvdXIkMX0sZnVuY3Rpb24oZGF0ZSl7cmV0dXJuIGRhdGUuZ2V0SG91cnMoKX0pO3ZhciBkYXk9bmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSl7ZGF0ZS5zZXRIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24oZGF0ZSxzdGVwKXtkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkrc3RlcCl9LGZ1bmN0aW9uKHN0YXJ0LGVuZCl7cmV0dXJuKGVuZC1zdGFydC0oZW5kLmdldFRpbWV6b25lT2Zmc2V0KCktc3RhcnQuZ2V0VGltZXpvbmVPZmZzZXQoKSkqZHVyYXRpb25NaW51dGUkMSkvZHVyYXRpb25EYXkkMX0sZnVuY3Rpb24oZGF0ZSl7cmV0dXJuIGRhdGUuZ2V0RGF0ZSgpLTF9KTtmdW5jdGlvbiB3ZWVrZGF5KGkpe3JldHVybiBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKXtkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCktKGRhdGUuZ2V0RGF5KCkrNy1pKSU3KTtkYXRlLnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbihkYXRlLHN0ZXApe2RhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKStzdGVwKjcpfSxmdW5jdGlvbihzdGFydCxlbmQpe3JldHVybihlbmQtc3RhcnQtKGVuZC5nZXRUaW1lem9uZU9mZnNldCgpLXN0YXJ0LmdldFRpbWV6b25lT2Zmc2V0KCkpKmR1cmF0aW9uTWludXRlJDEpL2R1cmF0aW9uV2VlayQxfSl9dmFyIHN1bmRheT13ZWVrZGF5KDApO3ZhciBtb25kYXk9d2Vla2RheSgxKTt2YXIgdHVlc2RheT13ZWVrZGF5KDIpO3ZhciB3ZWRuZXNkYXk9d2Vla2RheSgzKTt2YXIgdGh1cnNkYXk9d2Vla2RheSg0KTt2YXIgZnJpZGF5PXdlZWtkYXkoNSk7dmFyIHNhdHVyZGF5PXdlZWtkYXkoNik7dmFyIG1vbnRoPW5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpe2RhdGUuc2V0RGF0ZSgxKTtkYXRlLnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbihkYXRlLHN0ZXApe2RhdGUuc2V0TW9udGgoZGF0ZS5nZXRNb250aCgpK3N0ZXApfSxmdW5jdGlvbihzdGFydCxlbmQpe3JldHVybiBlbmQuZ2V0TW9udGgoKS1zdGFydC5nZXRNb250aCgpKyhlbmQuZ2V0RnVsbFllYXIoKS1zdGFydC5nZXRGdWxsWWVhcigpKSoxMn0sZnVuY3Rpb24oZGF0ZSl7cmV0dXJuIGRhdGUuZ2V0TW9udGgoKX0pO3ZhciB5ZWFyPW5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpe2RhdGUuc2V0TW9udGgoMCwxKTtkYXRlLnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbihkYXRlLHN0ZXApe2RhdGUuc2V0RnVsbFllYXIoZGF0ZS5nZXRGdWxsWWVhcigpK3N0ZXApfSxmdW5jdGlvbihzdGFydCxlbmQpe3JldHVybiBlbmQuZ2V0RnVsbFllYXIoKS1zdGFydC5nZXRGdWxsWWVhcigpfSxmdW5jdGlvbihkYXRlKXtyZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpfSk7eWVhci5ldmVyeT1mdW5jdGlvbihrKXtyZXR1cm4haXNGaW5pdGUoaz1NYXRoLmZsb29yKGspKXx8IShrPjApP251bGw6bmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSl7ZGF0ZS5zZXRGdWxsWWVhcihNYXRoLmZsb29yKGRhdGUuZ2V0RnVsbFllYXIoKS9rKSprKTtkYXRlLnNldE1vbnRoKDAsMSk7ZGF0ZS5zZXRIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24oZGF0ZSxzdGVwKXtkYXRlLnNldEZ1bGxZZWFyKGRhdGUuZ2V0RnVsbFllYXIoKStzdGVwKmspfSl9O3ZhciB1dGNNaW51dGU9bmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSl7ZGF0ZS5zZXRVVENTZWNvbmRzKDAsMCl9LGZ1bmN0aW9uKGRhdGUsc3RlcCl7ZGF0ZS5zZXRUaW1lKCtkYXRlK3N0ZXAqZHVyYXRpb25NaW51dGUkMSl9LGZ1bmN0aW9uKHN0YXJ0LGVuZCl7cmV0dXJuKGVuZC1zdGFydCkvZHVyYXRpb25NaW51dGUkMX0sZnVuY3Rpb24oZGF0ZSl7cmV0dXJuIGRhdGUuZ2V0VVRDTWludXRlcygpfSk7dmFyIHV0Y0hvdXI9bmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSl7ZGF0ZS5zZXRVVENNaW51dGVzKDAsMCwwKX0sZnVuY3Rpb24oZGF0ZSxzdGVwKXtkYXRlLnNldFRpbWUoK2RhdGUrc3RlcCpkdXJhdGlvbkhvdXIkMSl9LGZ1bmN0aW9uKHN0YXJ0LGVuZCl7cmV0dXJuKGVuZC1zdGFydCkvZHVyYXRpb25Ib3VyJDF9LGZ1bmN0aW9uKGRhdGUpe3JldHVybiBkYXRlLmdldFVUQ0hvdXJzKCl9KTt2YXIgdXRjRGF5PW5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpe2RhdGUuc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKGRhdGUsc3RlcCl7ZGF0ZS5zZXRVVENEYXRlKGRhdGUuZ2V0VVRDRGF0ZSgpK3N0ZXApfSxmdW5jdGlvbihzdGFydCxlbmQpe3JldHVybihlbmQtc3RhcnQpL2R1cmF0aW9uRGF5JDF9LGZ1bmN0aW9uKGRhdGUpe3JldHVybiBkYXRlLmdldFVUQ0RhdGUoKS0xfSk7ZnVuY3Rpb24gdXRjV2Vla2RheShpKXtyZXR1cm4gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSl7ZGF0ZS5zZXRVVENEYXRlKGRhdGUuZ2V0VVRDRGF0ZSgpLShkYXRlLmdldFVUQ0RheSgpKzctaSklNyk7ZGF0ZS5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24oZGF0ZSxzdGVwKXtkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkrc3RlcCo3KX0sZnVuY3Rpb24oc3RhcnQsZW5kKXtyZXR1cm4oZW5kLXN0YXJ0KS9kdXJhdGlvbldlZWskMX0pfXZhciB1dGNTdW5kYXk9dXRjV2Vla2RheSgwKTt2YXIgdXRjTW9uZGF5PXV0Y1dlZWtkYXkoMSk7dmFyIHV0Y1R1ZXNkYXk9dXRjV2Vla2RheSgyKTt2YXIgdXRjV2VkbmVzZGF5PXV0Y1dlZWtkYXkoMyk7dmFyIHV0Y1RodXJzZGF5PXV0Y1dlZWtkYXkoNCk7dmFyIHV0Y0ZyaWRheT11dGNXZWVrZGF5KDUpO3ZhciB1dGNTYXR1cmRheT11dGNXZWVrZGF5KDYpO3ZhciB1dGNNb250aD1uZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKXtkYXRlLnNldFVUQ0RhdGUoMSk7ZGF0ZS5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24oZGF0ZSxzdGVwKXtkYXRlLnNldFVUQ01vbnRoKGRhdGUuZ2V0VVRDTW9udGgoKStzdGVwKX0sZnVuY3Rpb24oc3RhcnQsZW5kKXtyZXR1cm4gZW5kLmdldFVUQ01vbnRoKCktc3RhcnQuZ2V0VVRDTW9udGgoKSsoZW5kLmdldFVUQ0Z1bGxZZWFyKCktc3RhcnQuZ2V0VVRDRnVsbFllYXIoKSkqMTJ9LGZ1bmN0aW9uKGRhdGUpe3JldHVybiBkYXRlLmdldFVUQ01vbnRoKCl9KTt2YXIgdXRjWWVhcj1uZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKXtkYXRlLnNldFVUQ01vbnRoKDAsMSk7ZGF0ZS5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24oZGF0ZSxzdGVwKXtkYXRlLnNldFVUQ0Z1bGxZZWFyKGRhdGUuZ2V0VVRDRnVsbFllYXIoKStzdGVwKX0sZnVuY3Rpb24oc3RhcnQsZW5kKXtyZXR1cm4gZW5kLmdldFVUQ0Z1bGxZZWFyKCktc3RhcnQuZ2V0VVRDRnVsbFllYXIoKX0sZnVuY3Rpb24oZGF0ZSl7cmV0dXJuIGRhdGUuZ2V0VVRDRnVsbFllYXIoKX0pO3V0Y1llYXIuZXZlcnk9ZnVuY3Rpb24oayl7cmV0dXJuIWlzRmluaXRlKGs9TWF0aC5mbG9vcihrKSl8fCEoaz4wKT9udWxsOm5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpe2RhdGUuc2V0VVRDRnVsbFllYXIoTWF0aC5mbG9vcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCkvaykqayk7ZGF0ZS5zZXRVVENNb250aCgwLDEpO2RhdGUuc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKGRhdGUsc3RlcCl7ZGF0ZS5zZXRVVENGdWxsWWVhcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCkrc3RlcCprKX0pfTtmdW5jdGlvbiBsb2NhbERhdGUoZCl7aWYoMDw9ZC55JiZkLnk8MTAwKXt2YXIgZGF0ZT1uZXcgRGF0ZSgtMSxkLm0sZC5kLGQuSCxkLk0sZC5TLGQuTCk7ZGF0ZS5zZXRGdWxsWWVhcihkLnkpO3JldHVybiBkYXRlfXJldHVybiBuZXcgRGF0ZShkLnksZC5tLGQuZCxkLkgsZC5NLGQuUyxkLkwpfWZ1bmN0aW9uIHV0Y0RhdGUoZCl7aWYoMDw9ZC55JiZkLnk8MTAwKXt2YXIgZGF0ZT1uZXcgRGF0ZShEYXRlLlVUQygtMSxkLm0sZC5kLGQuSCxkLk0sZC5TLGQuTCkpO2RhdGUuc2V0VVRDRnVsbFllYXIoZC55KTtyZXR1cm4gZGF0ZX1yZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoZC55LGQubSxkLmQsZC5ILGQuTSxkLlMsZC5MKSl9ZnVuY3Rpb24gbmV3WWVhcih5KXtyZXR1cm57eTp5LG06MCxkOjEsSDowLE06MCxTOjAsTDowfX1mdW5jdGlvbiBmb3JtYXRMb2NhbGUkMShsb2NhbGUpe3ZhciBsb2NhbGVfZGF0ZVRpbWU9bG9jYWxlLmRhdGVUaW1lLGxvY2FsZV9kYXRlPWxvY2FsZS5kYXRlLGxvY2FsZV90aW1lPWxvY2FsZS50aW1lLGxvY2FsZV9wZXJpb2RzPWxvY2FsZS5wZXJpb2RzLGxvY2FsZV93ZWVrZGF5cz1sb2NhbGUuZGF5cyxsb2NhbGVfc2hvcnRXZWVrZGF5cz1sb2NhbGUuc2hvcnREYXlzLGxvY2FsZV9tb250aHM9bG9jYWxlLm1vbnRocyxsb2NhbGVfc2hvcnRNb250aHM9bG9jYWxlLnNob3J0TW9udGhzO3ZhciBwZXJpb2RSZT1mb3JtYXRSZShsb2NhbGVfcGVyaW9kcykscGVyaW9kTG9va3VwPWZvcm1hdExvb2t1cChsb2NhbGVfcGVyaW9kcyksd2Vla2RheVJlPWZvcm1hdFJlKGxvY2FsZV93ZWVrZGF5cyksd2Vla2RheUxvb2t1cD1mb3JtYXRMb29rdXAobG9jYWxlX3dlZWtkYXlzKSxzaG9ydFdlZWtkYXlSZT1mb3JtYXRSZShsb2NhbGVfc2hvcnRXZWVrZGF5cyksc2hvcnRXZWVrZGF5TG9va3VwPWZvcm1hdExvb2t1cChsb2NhbGVfc2hvcnRXZWVrZGF5cyksbW9udGhSZT1mb3JtYXRSZShsb2NhbGVfbW9udGhzKSxtb250aExvb2t1cD1mb3JtYXRMb29rdXAobG9jYWxlX21vbnRocyksc2hvcnRNb250aFJlPWZvcm1hdFJlKGxvY2FsZV9zaG9ydE1vbnRocyksc2hvcnRNb250aExvb2t1cD1mb3JtYXRMb29rdXAobG9jYWxlX3Nob3J0TW9udGhzKTt2YXIgZm9ybWF0cz17YTpmb3JtYXRTaG9ydFdlZWtkYXksQTpmb3JtYXRXZWVrZGF5LGI6Zm9ybWF0U2hvcnRNb250aCxCOmZvcm1hdE1vbnRoLGM6bnVsbCxkOmZvcm1hdERheU9mTW9udGgsZTpmb3JtYXREYXlPZk1vbnRoLEg6Zm9ybWF0SG91cjI0LEk6Zm9ybWF0SG91cjEyLGo6Zm9ybWF0RGF5T2ZZZWFyLEw6Zm9ybWF0TWlsbGlzZWNvbmRzLG06Zm9ybWF0TW9udGhOdW1iZXIsTTpmb3JtYXRNaW51dGVzLHA6Zm9ybWF0UGVyaW9kLFM6Zm9ybWF0U2Vjb25kcyxVOmZvcm1hdFdlZWtOdW1iZXJTdW5kYXksdzpmb3JtYXRXZWVrZGF5TnVtYmVyLFc6Zm9ybWF0V2Vla051bWJlck1vbmRheSx4Om51bGwsWDpudWxsLHk6Zm9ybWF0WWVhcixZOmZvcm1hdEZ1bGxZZWFyLFo6Zm9ybWF0Wm9uZSwiJSI6Zm9ybWF0TGl0ZXJhbFBlcmNlbnR9O3ZhciB1dGNGb3JtYXRzPXthOmZvcm1hdFVUQ1Nob3J0V2Vla2RheSxBOmZvcm1hdFVUQ1dlZWtkYXksYjpmb3JtYXRVVENTaG9ydE1vbnRoLEI6Zm9ybWF0VVRDTW9udGgsYzpudWxsLGQ6Zm9ybWF0VVRDRGF5T2ZNb250aCxlOmZvcm1hdFVUQ0RheU9mTW9udGgsSDpmb3JtYXRVVENIb3VyMjQsSTpmb3JtYXRVVENIb3VyMTIsajpmb3JtYXRVVENEYXlPZlllYXIsTDpmb3JtYXRVVENNaWxsaXNlY29uZHMsbTpmb3JtYXRVVENNb250aE51bWJlcixNOmZvcm1hdFVUQ01pbnV0ZXMscDpmb3JtYXRVVENQZXJpb2QsUzpmb3JtYXRVVENTZWNvbmRzLFU6Zm9ybWF0VVRDV2Vla051bWJlclN1bmRheSx3OmZvcm1hdFVUQ1dlZWtkYXlOdW1iZXIsVzpmb3JtYXRVVENXZWVrTnVtYmVyTW9uZGF5LHg6bnVsbCxYOm51bGwseTpmb3JtYXRVVENZZWFyLFk6Zm9ybWF0VVRDRnVsbFllYXIsWjpmb3JtYXRVVENab25lLCIlIjpmb3JtYXRMaXRlcmFsUGVyY2VudH07dmFyIHBhcnNlcz17YTpwYXJzZVNob3J0V2Vla2RheSxBOnBhcnNlV2Vla2RheSxiOnBhcnNlU2hvcnRNb250aCxCOnBhcnNlTW9udGgsYzpwYXJzZUxvY2FsZURhdGVUaW1lLGQ6cGFyc2VEYXlPZk1vbnRoLGU6cGFyc2VEYXlPZk1vbnRoLEg6cGFyc2VIb3VyMjQsSTpwYXJzZUhvdXIyNCxqOnBhcnNlRGF5T2ZZZWFyLEw6cGFyc2VNaWxsaXNlY29uZHMsbTpwYXJzZU1vbnRoTnVtYmVyLE06cGFyc2VNaW51dGVzLHA6cGFyc2VQZXJpb2QsUzpwYXJzZVNlY29uZHMsVTpwYXJzZVdlZWtOdW1iZXJTdW5kYXksdzpwYXJzZVdlZWtkYXlOdW1iZXIsVzpwYXJzZVdlZWtOdW1iZXJNb25kYXkseDpwYXJzZUxvY2FsZURhdGUsWDpwYXJzZUxvY2FsZVRpbWUseTpwYXJzZVllYXIsWTpwYXJzZUZ1bGxZZWFyLFo6cGFyc2Vab25lLCIlIjpwYXJzZUxpdGVyYWxQZXJjZW50fTtmb3JtYXRzLng9bmV3Rm9ybWF0KGxvY2FsZV9kYXRlLGZvcm1hdHMpO2Zvcm1hdHMuWD1uZXdGb3JtYXQobG9jYWxlX3RpbWUsZm9ybWF0cyk7Zm9ybWF0cy5jPW5ld0Zvcm1hdChsb2NhbGVfZGF0ZVRpbWUsZm9ybWF0cyk7dXRjRm9ybWF0cy54PW5ld0Zvcm1hdChsb2NhbGVfZGF0ZSx1dGNGb3JtYXRzKTt1dGNGb3JtYXRzLlg9bmV3Rm9ybWF0KGxvY2FsZV90aW1lLHV0Y0Zvcm1hdHMpO3V0Y0Zvcm1hdHMuYz1uZXdGb3JtYXQobG9jYWxlX2RhdGVUaW1lLHV0Y0Zvcm1hdHMpO2Z1bmN0aW9uIG5ld0Zvcm1hdChzcGVjaWZpZXIsZm9ybWF0cyl7cmV0dXJuIGZ1bmN0aW9uKGRhdGUpe3ZhciBzdHJpbmc9W10saT0tMSxqPTAsbj1zcGVjaWZpZXIubGVuZ3RoLGMscGFkLGZvcm1hdDtpZighKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSlkYXRlPW5ldyBEYXRlKCtkYXRlKTt3aGlsZSgrK2k8bil7aWYoc3BlY2lmaWVyLmNoYXJDb2RlQXQoaSk9PT0zNyl7c3RyaW5nLnB1c2goc3BlY2lmaWVyLnNsaWNlKGosaSkpO2lmKChwYWQ9cGFkc1tjPXNwZWNpZmllci5jaGFyQXQoKytpKV0pIT1udWxsKWM9c3BlY2lmaWVyLmNoYXJBdCgrK2kpO2Vsc2UgcGFkPWM9PT0iZSI/IiAiOiIwIjtpZihmb3JtYXQ9Zm9ybWF0c1tjXSljPWZvcm1hdChkYXRlLHBhZCk7c3RyaW5nLnB1c2goYyk7aj1pKzF9fXN0cmluZy5wdXNoKHNwZWNpZmllci5zbGljZShqLGkpKTtyZXR1cm4gc3RyaW5nLmpvaW4oIiIpfX1mdW5jdGlvbiBuZXdQYXJzZShzcGVjaWZpZXIsbmV3RGF0ZSl7cmV0dXJuIGZ1bmN0aW9uKHN0cmluZyl7dmFyIGQ9bmV3WWVhcigxOTAwKSxpPXBhcnNlU3BlY2lmaWVyKGQsc3BlY2lmaWVyLHN0cmluZys9IiIsMCk7aWYoaSE9c3RyaW5nLmxlbmd0aClyZXR1cm4gbnVsbDtpZigicCJpbiBkKWQuSD1kLkglMTIrZC5wKjEyO2lmKCJXImluIGR8fCJVImluIGQpe2lmKCEoInciaW4gZCkpZC53PSJXImluIGQ/MTowO3ZhciBkYXkkJDE9IloiaW4gZD91dGNEYXRlKG5ld1llYXIoZC55KSkuZ2V0VVRDRGF5KCk6bmV3RGF0ZShuZXdZZWFyKGQueSkpLmdldERheSgpO2QubT0wO2QuZD0iVyJpbiBkPyhkLncrNiklNytkLlcqNy0oZGF5JCQxKzUpJTc6ZC53K2QuVSo3LShkYXkkJDErNiklN31pZigiWiJpbiBkKXtkLkgrPWQuWi8xMDB8MDtkLk0rPWQuWiUxMDA7cmV0dXJuIHV0Y0RhdGUoZCl9cmV0dXJuIG5ld0RhdGUoZCl9fWZ1bmN0aW9uIHBhcnNlU3BlY2lmaWVyKGQsc3BlY2lmaWVyLHN0cmluZyxqKXt2YXIgaT0wLG49c3BlY2lmaWVyLmxlbmd0aCxtPXN0cmluZy5sZW5ndGgsYyxwYXJzZTt3aGlsZShpPG4pe2lmKGo+PW0pcmV0dXJuLTE7Yz1zcGVjaWZpZXIuY2hhckNvZGVBdChpKyspO2lmKGM9PT0zNyl7Yz1zcGVjaWZpZXIuY2hhckF0KGkrKyk7cGFyc2U9cGFyc2VzW2MgaW4gcGFkcz9zcGVjaWZpZXIuY2hhckF0KGkrKyk6Y107aWYoIXBhcnNlfHwoaj1wYXJzZShkLHN0cmluZyxqKSk8MClyZXR1cm4tMX1lbHNlIGlmKGMhPXN0cmluZy5jaGFyQ29kZUF0KGorKykpe3JldHVybi0xfX1yZXR1cm4gan1mdW5jdGlvbiBwYXJzZVBlcmlvZChkLHN0cmluZyxpKXt2YXIgbj1wZXJpb2RSZS5leGVjKHN0cmluZy5zbGljZShpKSk7cmV0dXJuIG4/KGQucD1wZXJpb2RMb29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSxpK25bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBwYXJzZVNob3J0V2Vla2RheShkLHN0cmluZyxpKXt2YXIgbj1zaG9ydFdlZWtkYXlSZS5leGVjKHN0cmluZy5zbGljZShpKSk7cmV0dXJuIG4/KGQudz1zaG9ydFdlZWtkYXlMb29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSxpK25bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBwYXJzZVdlZWtkYXkoZCxzdHJpbmcsaSl7dmFyIG49d2Vla2RheVJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTtyZXR1cm4gbj8oZC53PXdlZWtkYXlMb29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSxpK25bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBwYXJzZVNob3J0TW9udGgoZCxzdHJpbmcsaSl7dmFyIG49c2hvcnRNb250aFJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTtyZXR1cm4gbj8oZC5tPXNob3J0TW9udGhMb29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSxpK25bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBwYXJzZU1vbnRoKGQsc3RyaW5nLGkpe3ZhciBuPW1vbnRoUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpO3JldHVybiBuPyhkLm09bW9udGhMb29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSxpK25bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBwYXJzZUxvY2FsZURhdGVUaW1lKGQsc3RyaW5nLGkpe3JldHVybiBwYXJzZVNwZWNpZmllcihkLGxvY2FsZV9kYXRlVGltZSxzdHJpbmcsaSl9ZnVuY3Rpb24gcGFyc2VMb2NhbGVEYXRlKGQsc3RyaW5nLGkpe3JldHVybiBwYXJzZVNwZWNpZmllcihkLGxvY2FsZV9kYXRlLHN0cmluZyxpKX1mdW5jdGlvbiBwYXJzZUxvY2FsZVRpbWUoZCxzdHJpbmcsaSl7cmV0dXJuIHBhcnNlU3BlY2lmaWVyKGQsbG9jYWxlX3RpbWUsc3RyaW5nLGkpfWZ1bmN0aW9uIGZvcm1hdFNob3J0V2Vla2RheShkKXtyZXR1cm4gbG9jYWxlX3Nob3J0V2Vla2RheXNbZC5nZXREYXkoKV19ZnVuY3Rpb24gZm9ybWF0V2Vla2RheShkKXtyZXR1cm4gbG9jYWxlX3dlZWtkYXlzW2QuZ2V0RGF5KCldfWZ1bmN0aW9uIGZvcm1hdFNob3J0TW9udGgoZCl7cmV0dXJuIGxvY2FsZV9zaG9ydE1vbnRoc1tkLmdldE1vbnRoKCldfWZ1bmN0aW9uIGZvcm1hdE1vbnRoKGQpe3JldHVybiBsb2NhbGVfbW9udGhzW2QuZ2V0TW9udGgoKV19ZnVuY3Rpb24gZm9ybWF0UGVyaW9kKGQpe3JldHVybiBsb2NhbGVfcGVyaW9kc1srKGQuZ2V0SG91cnMoKT49MTIpXX1mdW5jdGlvbiBmb3JtYXRVVENTaG9ydFdlZWtkYXkoZCl7cmV0dXJuIGxvY2FsZV9zaG9ydFdlZWtkYXlzW2QuZ2V0VVRDRGF5KCldfWZ1bmN0aW9uIGZvcm1hdFVUQ1dlZWtkYXkoZCl7cmV0dXJuIGxvY2FsZV93ZWVrZGF5c1tkLmdldFVUQ0RheSgpXX1mdW5jdGlvbiBmb3JtYXRVVENTaG9ydE1vbnRoKGQpe3JldHVybiBsb2NhbGVfc2hvcnRNb250aHNbZC5nZXRVVENNb250aCgpXX1mdW5jdGlvbiBmb3JtYXRVVENNb250aChkKXtyZXR1cm4gbG9jYWxlX21vbnRoc1tkLmdldFVUQ01vbnRoKCldfWZ1bmN0aW9uIGZvcm1hdFVUQ1BlcmlvZChkKXtyZXR1cm4gbG9jYWxlX3BlcmlvZHNbKyhkLmdldFVUQ0hvdXJzKCk+PTEyKV19cmV0dXJue2Zvcm1hdDpmdW5jdGlvbiBmb3JtYXQoc3BlY2lmaWVyKXt2YXIgZj1uZXdGb3JtYXQoc3BlY2lmaWVyKz0iIixmb3JtYXRzKTtmLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHNwZWNpZmllcn07cmV0dXJuIGZ9LHBhcnNlOmZ1bmN0aW9uIHBhcnNlKHNwZWNpZmllcil7dmFyIHA9bmV3UGFyc2Uoc3BlY2lmaWVyKz0iIixsb2NhbERhdGUpO3AudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gc3BlY2lmaWVyfTtyZXR1cm4gcH0sdXRjRm9ybWF0OmZ1bmN0aW9uIHV0Y0Zvcm1hdChzcGVjaWZpZXIpe3ZhciBmPW5ld0Zvcm1hdChzcGVjaWZpZXIrPSIiLHV0Y0Zvcm1hdHMpO2YudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gc3BlY2lmaWVyfTtyZXR1cm4gZn0sdXRjUGFyc2U6ZnVuY3Rpb24gdXRjUGFyc2Uoc3BlY2lmaWVyKXt2YXIgcD1uZXdQYXJzZShzcGVjaWZpZXIsdXRjRGF0ZSk7cC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBzcGVjaWZpZXJ9O3JldHVybiBwfX19dmFyIHBhZHM9eyItIjoiIixfOiIgIiwwOiIwIn07dmFyIG51bWJlclJlPS9eXHMqXGQrLzt2YXIgcGVyY2VudFJlPS9eJS87dmFyIHJlcXVvdGVSZT0vW1xcXF5cJFwqXCtcP1x8XFtcXVwoXClcLlx7XH1dL2c7ZnVuY3Rpb24gcGFkKHZhbHVlLGZpbGwsd2lkdGgpe3ZhciBzaWduPXZhbHVlPDA/Ii0iOiIiLHN0cmluZz0oc2lnbj8tdmFsdWU6dmFsdWUpKyIiLGxlbmd0aD1zdHJpbmcubGVuZ3RoO3JldHVybiBzaWduKyhsZW5ndGg8d2lkdGg/bmV3IEFycmF5KHdpZHRoLWxlbmd0aCsxKS5qb2luKGZpbGwpK3N0cmluZzpzdHJpbmcpfWZ1bmN0aW9uIHJlcXVvdGUocyl7cmV0dXJuIHMucmVwbGFjZShyZXF1b3RlUmUsIlxcJCYiKX1mdW5jdGlvbiBmb3JtYXRSZShuYW1lcyl7cmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiK25hbWVzLm1hcChyZXF1b3RlKS5qb2luKCJ8IikrIikiLCJpIil9ZnVuY3Rpb24gZm9ybWF0TG9va3VwKG5hbWVzKXt2YXIgbWFwPXt9LGk9LTEsbj1uYW1lcy5sZW5ndGg7d2hpbGUoKytpPG4pe21hcFtuYW1lc1tpXS50b0xvd2VyQ2FzZSgpXT1pfXJldHVybiBtYXB9ZnVuY3Rpb24gcGFyc2VXZWVrZGF5TnVtYmVyKGQsc3RyaW5nLGkpe3ZhciBuPW51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksaSsxKSk7cmV0dXJuIG4/KGQudz0rblswXSxpK25bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBwYXJzZVdlZWtOdW1iZXJTdW5kYXkoZCxzdHJpbmcsaSl7dmFyIG49bnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpO3JldHVybiBuPyhkLlU9K25bMF0saStuWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcGFyc2VXZWVrTnVtYmVyTW9uZGF5KGQsc3RyaW5nLGkpe3ZhciBuPW51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTtyZXR1cm4gbj8oZC5XPStuWzBdLGkrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHBhcnNlRnVsbFllYXIoZCxzdHJpbmcsaSl7dmFyIG49bnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSxpKzQpKTtyZXR1cm4gbj8oZC55PStuWzBdLGkrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHBhcnNlWWVhcihkLHN0cmluZyxpKXt2YXIgbj1udW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLGkrMikpO3JldHVybiBuPyhkLnk9K25bMF0rKCtuWzBdPjY4PzE5MDA6MmUzKSxpK25bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBwYXJzZVpvbmUoZCxzdHJpbmcsaSl7dmFyIG49L14oWil8KFsrLV1cZFxkKSg/Olw6PyhcZFxkKSk/Ly5leGVjKHN0cmluZy5zbGljZShpLGkrNikpO3JldHVybiBuPyhkLlo9blsxXT8wOi0oblsyXSsoblszXXx8IjAwIikpLGkrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHBhcnNlTW9udGhOdW1iZXIoZCxzdHJpbmcsaSl7dmFyIG49bnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSxpKzIpKTtyZXR1cm4gbj8oZC5tPW5bMF0tMSxpK25bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBwYXJzZURheU9mTW9udGgoZCxzdHJpbmcsaSl7dmFyIG49bnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSxpKzIpKTtyZXR1cm4gbj8oZC5kPStuWzBdLGkrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHBhcnNlRGF5T2ZZZWFyKGQsc3RyaW5nLGkpe3ZhciBuPW51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksaSszKSk7cmV0dXJuIG4/KGQubT0wLGQuZD0rblswXSxpK25bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBwYXJzZUhvdXIyNChkLHN0cmluZyxpKXt2YXIgbj1udW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLGkrMikpO3JldHVybiBuPyhkLkg9K25bMF0saStuWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcGFyc2VNaW51dGVzKGQsc3RyaW5nLGkpe3ZhciBuPW51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksaSsyKSk7cmV0dXJuIG4/KGQuTT0rblswXSxpK25bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBwYXJzZVNlY29uZHMoZCxzdHJpbmcsaSl7dmFyIG49bnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSxpKzIpKTtyZXR1cm4gbj8oZC5TPStuWzBdLGkrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHBhcnNlTWlsbGlzZWNvbmRzKGQsc3RyaW5nLGkpe3ZhciBuPW51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksaSszKSk7cmV0dXJuIG4/KGQuTD0rblswXSxpK25bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBwYXJzZUxpdGVyYWxQZXJjZW50KGQsc3RyaW5nLGkpe3ZhciBuPXBlcmNlbnRSZS5leGVjKHN0cmluZy5zbGljZShpLGkrMSkpO3JldHVybiBuP2krblswXS5sZW5ndGg6LTF9ZnVuY3Rpb24gZm9ybWF0RGF5T2ZNb250aChkLHApe3JldHVybiBwYWQoZC5nZXREYXRlKCkscCwyKX1mdW5jdGlvbiBmb3JtYXRIb3VyMjQoZCxwKXtyZXR1cm4gcGFkKGQuZ2V0SG91cnMoKSxwLDIpfWZ1bmN0aW9uIGZvcm1hdEhvdXIxMihkLHApe3JldHVybiBwYWQoZC5nZXRIb3VycygpJTEyfHwxMixwLDIpfWZ1bmN0aW9uIGZvcm1hdERheU9mWWVhcihkLHApe3JldHVybiBwYWQoMStkYXkuY291bnQoeWVhcihkKSxkKSxwLDMpfWZ1bmN0aW9uIGZvcm1hdE1pbGxpc2Vjb25kcyhkLHApe3JldHVybiBwYWQoZC5nZXRNaWxsaXNlY29uZHMoKSxwLDMpfWZ1bmN0aW9uIGZvcm1hdE1vbnRoTnVtYmVyKGQscCl7cmV0dXJuIHBhZChkLmdldE1vbnRoKCkrMSxwLDIpfWZ1bmN0aW9uIGZvcm1hdE1pbnV0ZXMoZCxwKXtyZXR1cm4gcGFkKGQuZ2V0TWludXRlcygpLHAsMil9ZnVuY3Rpb24gZm9ybWF0U2Vjb25kcyhkLHApe3JldHVybiBwYWQoZC5nZXRTZWNvbmRzKCkscCwyKX1mdW5jdGlvbiBmb3JtYXRXZWVrTnVtYmVyU3VuZGF5KGQscCl7cmV0dXJuIHBhZChzdW5kYXkuY291bnQoeWVhcihkKSxkKSxwLDIpfWZ1bmN0aW9uIGZvcm1hdFdlZWtkYXlOdW1iZXIoZCl7cmV0dXJuIGQuZ2V0RGF5KCl9ZnVuY3Rpb24gZm9ybWF0V2Vla051bWJlck1vbmRheShkLHApe3JldHVybiBwYWQobW9uZGF5LmNvdW50KHllYXIoZCksZCkscCwyKX1mdW5jdGlvbiBmb3JtYXRZZWFyKGQscCl7cmV0dXJuIHBhZChkLmdldEZ1bGxZZWFyKCklMTAwLHAsMil9ZnVuY3Rpb24gZm9ybWF0RnVsbFllYXIoZCxwKXtyZXR1cm4gcGFkKGQuZ2V0RnVsbFllYXIoKSUxZTQscCw0KX1mdW5jdGlvbiBmb3JtYXRab25lKGQpe3ZhciB6PWQuZ2V0VGltZXpvbmVPZmZzZXQoKTtyZXR1cm4oej4wPyItIjooeio9LTEsIisiKSkrcGFkKHovNjB8MCwiMCIsMikrcGFkKHolNjAsIjAiLDIpfWZ1bmN0aW9uIGZvcm1hdFVUQ0RheU9mTW9udGgoZCxwKXtyZXR1cm4gcGFkKGQuZ2V0VVRDRGF0ZSgpLHAsMil9ZnVuY3Rpb24gZm9ybWF0VVRDSG91cjI0KGQscCl7cmV0dXJuIHBhZChkLmdldFVUQ0hvdXJzKCkscCwyKX1mdW5jdGlvbiBmb3JtYXRVVENIb3VyMTIoZCxwKXtyZXR1cm4gcGFkKGQuZ2V0VVRDSG91cnMoKSUxMnx8MTIscCwyKX1mdW5jdGlvbiBmb3JtYXRVVENEYXlPZlllYXIoZCxwKXtyZXR1cm4gcGFkKDErdXRjRGF5LmNvdW50KHV0Y1llYXIoZCksZCkscCwzKX1mdW5jdGlvbiBmb3JtYXRVVENNaWxsaXNlY29uZHMoZCxwKXtyZXR1cm4gcGFkKGQuZ2V0VVRDTWlsbGlzZWNvbmRzKCkscCwzKX1mdW5jdGlvbiBmb3JtYXRVVENNb250aE51bWJlcihkLHApe3JldHVybiBwYWQoZC5nZXRVVENNb250aCgpKzEscCwyKX1mdW5jdGlvbiBmb3JtYXRVVENNaW51dGVzKGQscCl7cmV0dXJuIHBhZChkLmdldFVUQ01pbnV0ZXMoKSxwLDIpfWZ1bmN0aW9uIGZvcm1hdFVUQ1NlY29uZHMoZCxwKXtyZXR1cm4gcGFkKGQuZ2V0VVRDU2Vjb25kcygpLHAsMil9ZnVuY3Rpb24gZm9ybWF0VVRDV2Vla051bWJlclN1bmRheShkLHApe3JldHVybiBwYWQodXRjU3VuZGF5LmNvdW50KHV0Y1llYXIoZCksZCkscCwyKX1mdW5jdGlvbiBmb3JtYXRVVENXZWVrZGF5TnVtYmVyKGQpe3JldHVybiBkLmdldFVUQ0RheSgpfWZ1bmN0aW9uIGZvcm1hdFVUQ1dlZWtOdW1iZXJNb25kYXkoZCxwKXtyZXR1cm4gcGFkKHV0Y01vbmRheS5jb3VudCh1dGNZZWFyKGQpLGQpLHAsMil9ZnVuY3Rpb24gZm9ybWF0VVRDWWVhcihkLHApe3JldHVybiBwYWQoZC5nZXRVVENGdWxsWWVhcigpJTEwMCxwLDIpfWZ1bmN0aW9uIGZvcm1hdFVUQ0Z1bGxZZWFyKGQscCl7cmV0dXJuIHBhZChkLmdldFVUQ0Z1bGxZZWFyKCklMWU0LHAsNCl9ZnVuY3Rpb24gZm9ybWF0VVRDWm9uZSgpe3JldHVybiIrMDAwMCJ9ZnVuY3Rpb24gZm9ybWF0TGl0ZXJhbFBlcmNlbnQoKXtyZXR1cm4iJSJ9dmFyIGxvY2FsZSQxO3ZhciB0aW1lRm9ybWF0O3ZhciB0aW1lUGFyc2U7dmFyIHV0Y0Zvcm1hdDt2YXIgdXRjUGFyc2U7ZGVmYXVsdExvY2FsZSQxKHtkYXRlVGltZToiJXgsICVYIixkYXRlOiIlLW0vJS1kLyVZIix0aW1lOiIlLUk6JU06JVMgJXAiLHBlcmlvZHM6WyJBTSIsIlBNIl0sZGF5czpbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sc2hvcnREYXlzOlsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0Il0sbW9udGhzOlsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxzaG9ydE1vbnRoczpbIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdfSk7ZnVuY3Rpb24gZGVmYXVsdExvY2FsZSQxKGRlZmluaXRpb24pe2xvY2FsZSQxPWZvcm1hdExvY2FsZSQxKGRlZmluaXRpb24pO3RpbWVGb3JtYXQ9bG9jYWxlJDEuZm9ybWF0O3RpbWVQYXJzZT1sb2NhbGUkMS5wYXJzZTt1dGNGb3JtYXQ9bG9jYWxlJDEudXRjRm9ybWF0O3V0Y1BhcnNlPWxvY2FsZSQxLnV0Y1BhcnNlO3JldHVybiBsb2NhbGUkMX12YXIgaXNvU3BlY2lmaWVyPSIlWS0lbS0lZFQlSDolTTolUy4lTFoiO2Z1bmN0aW9uIGZvcm1hdElzb05hdGl2ZShkYXRlKXtyZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpfXZhciBmb3JtYXRJc289RGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc/Zm9ybWF0SXNvTmF0aXZlOnV0Y0Zvcm1hdChpc29TcGVjaWZpZXIpO2Z1bmN0aW9uIHBhcnNlSXNvTmF0aXZlKHN0cmluZyl7dmFyIGRhdGU9bmV3IERhdGUoc3RyaW5nKTtyZXR1cm4gaXNOYU4oZGF0ZSk/bnVsbDpkYXRlfXZhciBwYXJzZUlzbz0rbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpP3BhcnNlSXNvTmF0aXZlOnV0Y1BhcnNlKGlzb1NwZWNpZmllcik7dmFyIGR1cmF0aW9uU2Vjb25kPTFlMzt2YXIgZHVyYXRpb25NaW51dGU9ZHVyYXRpb25TZWNvbmQqNjA7dmFyIGR1cmF0aW9uSG91cj1kdXJhdGlvbk1pbnV0ZSo2MDt2YXIgZHVyYXRpb25EYXk9ZHVyYXRpb25Ib3VyKjI0O3ZhciBkdXJhdGlvbldlZWs9ZHVyYXRpb25EYXkqNzt2YXIgZHVyYXRpb25Nb250aD1kdXJhdGlvbkRheSozMDt2YXIgZHVyYXRpb25ZZWFyPWR1cmF0aW9uRGF5KjM2NTtmdW5jdGlvbiBkYXRlJDEodCl7cmV0dXJuIG5ldyBEYXRlKHQpfWZ1bmN0aW9uIG51bWJlciQyKHQpe3JldHVybiB0IGluc3RhbmNlb2YgRGF0ZT8rdDorbmV3IERhdGUoK3QpfWZ1bmN0aW9uIGNhbGVuZGFyKHllYXIkJDEsbW9udGgkJDEsd2VlayxkYXkkJDEsaG91ciQkMSxtaW51dGUkJDEsc2Vjb25kJCQxLG1pbGxpc2Vjb25kJCQxLGZvcm1hdCl7dmFyIHNjYWxlPWNvbnRpbnVvdXMoZGVpbnRlcnBvbGF0ZUxpbmVhcixpbnRlcnBvbGF0ZU51bWJlciksaW52ZXJ0PXNjYWxlLmludmVydCxkb21haW49c2NhbGUuZG9tYWluO3ZhciBmb3JtYXRNaWxsaXNlY29uZD1mb3JtYXQoIi4lTCIpLGZvcm1hdFNlY29uZD1mb3JtYXQoIjolUyIpLGZvcm1hdE1pbnV0ZT1mb3JtYXQoIiVJOiVNIiksZm9ybWF0SG91cj1mb3JtYXQoIiVJICVwIiksZm9ybWF0RGF5PWZvcm1hdCgiJWEgJWQiKSxmb3JtYXRXZWVrPWZvcm1hdCgiJWIgJWQiKSxmb3JtYXRNb250aD1mb3JtYXQoIiVCIiksZm9ybWF0WWVhcj1mb3JtYXQoIiVZIik7dmFyIHRpY2tJbnRlcnZhbHM9W1tzZWNvbmQkJDEsMSxkdXJhdGlvblNlY29uZF0sW3NlY29uZCQkMSw1LDUqZHVyYXRpb25TZWNvbmRdLFtzZWNvbmQkJDEsMTUsMTUqZHVyYXRpb25TZWNvbmRdLFtzZWNvbmQkJDEsMzAsMzAqZHVyYXRpb25TZWNvbmRdLFttaW51dGUkJDEsMSxkdXJhdGlvbk1pbnV0ZV0sW21pbnV0ZSQkMSw1LDUqZHVyYXRpb25NaW51dGVdLFttaW51dGUkJDEsMTUsMTUqZHVyYXRpb25NaW51dGVdLFttaW51dGUkJDEsMzAsMzAqZHVyYXRpb25NaW51dGVdLFtob3VyJCQxLDEsZHVyYXRpb25Ib3VyXSxbaG91ciQkMSwzLDMqZHVyYXRpb25Ib3VyXSxbaG91ciQkMSw2LDYqZHVyYXRpb25Ib3VyXSxbaG91ciQkMSwxMiwxMipkdXJhdGlvbkhvdXJdLFtkYXkkJDEsMSxkdXJhdGlvbkRheV0sW2RheSQkMSwyLDIqZHVyYXRpb25EYXldLFt3ZWVrLDEsZHVyYXRpb25XZWVrXSxbbW9udGgkJDEsMSxkdXJhdGlvbk1vbnRoXSxbbW9udGgkJDEsMywzKmR1cmF0aW9uTW9udGhdLFt5ZWFyJCQxLDEsZHVyYXRpb25ZZWFyXV07ZnVuY3Rpb24gdGlja0Zvcm1hdChkYXRlKXtyZXR1cm4oc2Vjb25kJCQxKGRhdGUpPGRhdGU/Zm9ybWF0TWlsbGlzZWNvbmQ6bWludXRlJCQxKGRhdGUpPGRhdGU/Zm9ybWF0U2Vjb25kOmhvdXIkJDEoZGF0ZSk8ZGF0ZT9mb3JtYXRNaW51dGU6ZGF5JCQxKGRhdGUpPGRhdGU/Zm9ybWF0SG91cjptb250aCQkMShkYXRlKTxkYXRlP3dlZWsoZGF0ZSk8ZGF0ZT9mb3JtYXREYXk6Zm9ybWF0V2Vlazp5ZWFyJCQxKGRhdGUpPGRhdGU/Zm9ybWF0TW9udGg6Zm9ybWF0WWVhcikoZGF0ZSl9ZnVuY3Rpb24gdGlja0ludGVydmFsKGludGVydmFsLHN0YXJ0LHN0b3Asc3RlcCl7aWYoaW50ZXJ2YWw9PW51bGwpaW50ZXJ2YWw9MTA7aWYodHlwZW9mIGludGVydmFsPT09Im51bWJlciIpe3ZhciB0YXJnZXQ9TWF0aC5hYnMoc3RvcC1zdGFydCkvaW50ZXJ2YWwsaT1iaXNlY3RvcihmdW5jdGlvbihpKXtyZXR1cm4gaVsyXX0pLnJpZ2h0KHRpY2tJbnRlcnZhbHMsdGFyZ2V0KTtpZihpPT09dGlja0ludGVydmFscy5sZW5ndGgpe3N0ZXA9dGlja1N0ZXAoc3RhcnQvZHVyYXRpb25ZZWFyLHN0b3AvZHVyYXRpb25ZZWFyLGludGVydmFsKTtpbnRlcnZhbD15ZWFyJCQxfWVsc2UgaWYoaSl7aT10aWNrSW50ZXJ2YWxzW3RhcmdldC90aWNrSW50ZXJ2YWxzW2ktMV1bMl08dGlja0ludGVydmFsc1tpXVsyXS90YXJnZXQ/aS0xOmldO3N0ZXA9aVsxXTtpbnRlcnZhbD1pWzBdfWVsc2V7c3RlcD10aWNrU3RlcChzdGFydCxzdG9wLGludGVydmFsKTtpbnRlcnZhbD1taWxsaXNlY29uZCQkMX19cmV0dXJuIHN0ZXA9PW51bGw/aW50ZXJ2YWw6aW50ZXJ2YWwuZXZlcnkoc3RlcCl9c2NhbGUuaW52ZXJ0PWZ1bmN0aW9uKHkpe3JldHVybiBuZXcgRGF0ZShpbnZlcnQoeSkpfTtzY2FsZS5kb21haW49ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/ZG9tYWluKG1hcCQzLmNhbGwoXyxudW1iZXIkMikpOmRvbWFpbigpLm1hcChkYXRlJDEpfTtzY2FsZS50aWNrcz1mdW5jdGlvbihpbnRlcnZhbCxzdGVwKXt2YXIgZD1kb21haW4oKSx0MD1kWzBdLHQxPWRbZC5sZW5ndGgtMV0scj10MTx0MCx0O2lmKHIpdD10MCx0MD10MSx0MT10O3Q9dGlja0ludGVydmFsKGludGVydmFsLHQwLHQxLHN0ZXApO3Q9dD90LnJhbmdlKHQwLHQxKzEpOltdO3JldHVybiByP3QucmV2ZXJzZSgpOnR9O3NjYWxlLnRpY2tGb3JtYXQ9ZnVuY3Rpb24oY291bnQsc3BlY2lmaWVyKXtyZXR1cm4gc3BlY2lmaWVyPT1udWxsP3RpY2tGb3JtYXQ6Zm9ybWF0KHNwZWNpZmllcil9O3NjYWxlLm5pY2U9ZnVuY3Rpb24oaW50ZXJ2YWwsc3RlcCl7dmFyIGQ9ZG9tYWluKCk7cmV0dXJuKGludGVydmFsPXRpY2tJbnRlcnZhbChpbnRlcnZhbCxkWzBdLGRbZC5sZW5ndGgtMV0sc3RlcCkpP2RvbWFpbihuaWNlKGQsaW50ZXJ2YWwpKTpzY2FsZX07c2NhbGUuY29weT1mdW5jdGlvbigpe3JldHVybiBjb3B5KHNjYWxlLGNhbGVuZGFyKHllYXIkJDEsbW9udGgkJDEsd2VlayxkYXkkJDEsaG91ciQkMSxtaW51dGUkJDEsc2Vjb25kJCQxLG1pbGxpc2Vjb25kJCQxLGZvcm1hdCkpfTtyZXR1cm4gc2NhbGV9dmFyIHRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gY2FsZW5kYXIoeWVhcixtb250aCxzdW5kYXksZGF5LGhvdXIsbWludXRlLHNlY29uZCxtaWxsaXNlY29uZCx0aW1lRm9ybWF0KS5kb21haW4oW25ldyBEYXRlKDJlMywwLDEpLG5ldyBEYXRlKDJlMywwLDIpXSl9O3ZhciB1dGNUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIGNhbGVuZGFyKHV0Y1llYXIsdXRjTW9udGgsdXRjU3VuZGF5LHV0Y0RheSx1dGNIb3VyLHV0Y01pbnV0ZSxzZWNvbmQsbWlsbGlzZWNvbmQsdXRjRm9ybWF0KS5kb21haW4oW0RhdGUuVVRDKDJlMywwLDEpLERhdGUuVVRDKDJlMywwLDIpXSl9O3ZhciBjb2xvcnM9ZnVuY3Rpb24ocyl7cmV0dXJuIHMubWF0Y2goLy57Nn0vZykubWFwKGZ1bmN0aW9uKHgpe3JldHVybiIjIit4fSl9O3ZhciBjYXRlZ29yeTEwPWNvbG9ycygiMWY3N2I0ZmY3ZjBlMmNhMDJjZDYyNzI4OTQ2N2JkOGM1NjRiZTM3N2MyN2Y3ZjdmYmNiZDIyMTdiZWNmIik7dmFyIGNhdGVnb3J5MjBiPWNvbG9ycygiMzkzYjc5NTI1NGEzNmI2ZWNmOWM5ZWRlNjM3OTM5OGNhMjUyYjVjZjZiY2VkYjljOGM2ZDMxYmQ5ZTM5ZTdiYTUyZTdjYjk0ODQzYzM5YWQ0OTRhZDY2MTZiZTc5NjljN2I0MTczYTU1MTk0Y2U2ZGJkZGU5ZWQ2Iik7dmFyIGNhdGVnb3J5MjBjPWNvbG9ycygiMzE4MmJkNmJhZWQ2OWVjYWUxYzZkYmVmZTY1NTBkZmQ4ZDNjZmRhZTZiZmRkMGEyMzFhMzU0NzRjNDc2YTFkOTliYzdlOWMwNzU2YmIxOWU5YWM4YmNiZGRjZGFkYWViNjM2MzYzOTY5Njk2YmRiZGJkZDlkOWQ5Iik7dmFyIGNhdGVnb3J5MjA9Y29sb3JzKCIxZjc3YjRhZWM3ZThmZjdmMGVmZmJiNzgyY2EwMmM5OGRmOGFkNjI3MjhmZjk4OTY5NDY3YmRjNWIwZDU4YzU2NGJjNDljOTRlMzc3YzJmN2I2ZDI3ZjdmN2ZjN2M3YzdiY2JkMjJkYmRiOGQxN2JlY2Y5ZWRhZTUiKTt2YXIgY3ViZWhlbGl4JDM9Y3ViZWhlbGl4TG9uZyhjdWJlaGVsaXgoMzAwLC41LDApLGN1YmVoZWxpeCgtMjQwLC41LDEpKTt2YXIgd2FybT1jdWJlaGVsaXhMb25nKGN1YmVoZWxpeCgtMTAwLC43NSwuMzUpLGN1YmVoZWxpeCg4MCwxLjUsLjgpKTt2YXIgY29vbD1jdWJlaGVsaXhMb25nKGN1YmVoZWxpeCgyNjAsLjc1LC4zNSksY3ViZWhlbGl4KDgwLDEuNSwuOCkpO3ZhciByYWluYm93PWN1YmVoZWxpeCgpO3ZhciByYWluYm93JDE9ZnVuY3Rpb24odCl7aWYodDwwfHx0PjEpdC09TWF0aC5mbG9vcih0KTt2YXIgdHM9TWF0aC5hYnModC0uNSk7cmFpbmJvdy5oPTM2MCp0LTEwMDtyYWluYm93LnM9MS41LTEuNSp0cztyYWluYm93Lmw9LjgtLjkqdHM7cmV0dXJuIHJhaW5ib3crIiJ9O2Z1bmN0aW9uIHJhbXAocmFuZ2Upe3ZhciBuPXJhbmdlLmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHJhbmdlW01hdGgubWF4KDAsTWF0aC5taW4obi0xLE1hdGguZmxvb3IodCpuKSkpXX19dmFyIHZpcmlkaXM9cmFtcChjb2xvcnMoIjQ0MDE1NDQ0MDI1NjQ1MDQ1NzQ1MDU1OTQ2MDc1YTQ2MDg1YzQ2MGE1ZDQ2MGI1ZTQ3MGQ2MDQ3MGU2MTQ3MTA2MzQ3MTE2NDQ3MTM2NTQ4MTQ2NzQ4MTY2ODQ4MTc2OTQ4MTg2YTQ4MWE2YzQ4MWI2ZDQ4MWM2ZTQ4MWQ2ZjQ4MWY3MDQ4MjA3MTQ4MjE3MzQ4MjM3NDQ4MjQ3NTQ4MjU3NjQ4MjY3NzQ4Mjg3ODQ4Mjk3OTQ3MmE3YTQ3MmM3YTQ3MmQ3YjQ3MmU3YzQ3MmY3ZDQ2MzA3ZTQ2MzI3ZTQ2MzM3ZjQ2MzQ4MDQ1MzU4MTQ1Mzc4MTQ1Mzg4MjQ0Mzk4MzQ0M2E4MzQ0M2I4NDQzM2Q4NDQzM2U4NTQyM2Y4NTQyNDA4NjQyNDE4NjQxNDI4NzQxNDQ4NzQwNDU4ODQwNDY4ODNmNDc4ODNmNDg4OTNlNDk4OTNlNGE4OTNlNGM4YTNkNGQ4YTNkNGU4YTNjNGY4YTNjNTA4YjNiNTE4YjNiNTI4YjNhNTM4YjNhNTQ4YzM5NTU4YzM5NTY4YzM4NTg4YzM4NTk4YzM3NWE4YzM3NWI4ZDM2NWM4ZDM2NWQ4ZDM1NWU4ZDM1NWY4ZDM0NjA4ZDM0NjE4ZDMzNjI4ZDMzNjM4ZDMyNjQ4ZTMyNjU4ZTMxNjY4ZTMxNjc4ZTMxNjg4ZTMwNjk4ZTMwNmE4ZTJmNmI4ZTJmNmM4ZTJlNmQ4ZTJlNmU4ZTJlNmY4ZTJkNzA4ZTJkNzE4ZTJjNzE4ZTJjNzI4ZTJjNzM4ZTJiNzQ4ZTJiNzU4ZTJhNzY4ZTJhNzc4ZTJhNzg4ZTI5Nzk4ZTI5N2E4ZTI5N2I4ZTI4N2M4ZTI4N2Q4ZTI3N2U4ZTI3N2Y4ZTI3ODA4ZTI2ODE4ZTI2ODI4ZTI2ODI4ZTI1ODM4ZTI1ODQ4ZTI1ODU4ZTI0ODY4ZTI0ODc4ZTIzODg4ZTIzODk4ZTIzOGE4ZDIyOGI4ZDIyOGM4ZDIyOGQ4ZDIxOGU4ZDIxOGY4ZDIxOTA4ZDIxOTE4YzIwOTI4YzIwOTI4YzIwOTM4YzFmOTQ4YzFmOTU4YjFmOTY4YjFmOTc4YjFmOTg4YjFmOTk4YTFmOWE4YTFlOWI4YTFlOWM4OTFlOWQ4OTFmOWU4OTFmOWY4ODFmYTA4ODFmYTE4ODFmYTE4NzFmYTI4NzIwYTM4NjIwYTQ4NjIxYTU4NTIxYTY4NTIyYTc4NTIyYTg4NDIzYTk4MzI0YWE4MzI1YWI4MjI1YWM4MjI2YWQ4MTI3YWQ4MTI4YWU4MDI5YWY3ZjJhYjA3ZjJjYjE3ZTJkYjI3ZDJlYjM3YzJmYjQ3YzMxYjU3YjMyYjY3YTM0YjY3OTM1Yjc3OTM3Yjg3ODM4Yjk3NzNhYmE3NjNiYmI3NTNkYmM3NDNmYmM3MzQwYmQ3MjQyYmU3MTQ0YmY3MDQ2YzA2ZjQ4YzE2ZTRhYzE2ZDRjYzI2YzRlYzM2YjUwYzQ2YTUyYzU2OTU0YzU2ODU2YzY2NzU4Yzc2NTVhYzg2NDVjYzg2MzVlYzk2MjYwY2E2MDYzY2I1ZjY1Y2I1ZTY3Y2M1YzY5Y2Q1YjZjY2Q1YTZlY2U1ODcwY2Y1NzczZDA1Njc1ZDA1NDc3ZDE1MzdhZDE1MTdjZDI1MDdmZDM0ZTgxZDM0ZDg0ZDQ0Yjg2ZDU0OTg5ZDU0ODhiZDY0NjhlZDY0NTkwZDc0MzkzZDc0MTk1ZDg0MDk4ZDgzZTliZDkzYzlkZDkzYmEwZGEzOWEyZGEzN2E1ZGIzNmE4ZGIzNGFhZGMzMmFkZGMzMGIwZGQyZmIyZGQyZGI1ZGUyYmI4ZGUyOWJhZGUyOGJkZGYyNmMwZGYyNWMyZGYyM2M1ZTAyMWM4ZTAyMGNhZTExZmNkZTExZGQwZTExY2QyZTIxYmQ1ZTIxYWQ4ZTIxOWRhZTMxOWRkZTMxOGRmZTMxOGUyZTQxOGU1ZTQxOWU3ZTQxOWVhZTUxYWVjZTUxYmVmZTUxY2YxZTUxZGY0ZTYxZWY2ZTYyMGY4ZTYyMWZiZTcyM2ZkZTcyNSIpKTt2YXIgbWFnbWE9cmFtcChjb2xvcnMoIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwOTAyMDIwYjAyMDIwZDAzMDMwZjAzMDMxMjA0MDQxNDA1MDQxNjA2MDUxODA2MDUxYTA3MDYxYzA4MDcxZTA5MDcyMDBhMDgyMjBiMDkyNDBjMDkyNjBkMGEyOTBlMGIyYjEwMGIyZDExMGMyZjEyMGQzMTEzMGQzNDE0MGUzNjE1MGUzODE2MGYzYjE4MGYzZDE5MTAzZjFhMTA0MjFjMTA0NDFkMTE0NzFlMTE0OTIwMTE0YjIxMTE0ZTIyMTE1MDI0MTI1MzI1MTI1NTI3MTI1ODI5MTE1YTJhMTE1YzJjMTE1ZjJkMTE2MTJmMTE2MzMxMTE2NTMzMTA2NzM0MTA2OTM2MTA2YjM4MTA2YzM5MGY2ZTNiMGY3MDNkMGY3MTNmMGY3MjQwMGY3NDQyMGY3NTQ0MGY3NjQ1MTA3NzQ3MTA3ODQ5MTA3ODRhMTA3OTRjMTE3YTRlMTE3YjRmMTI3YjUxMTI3YzUyMTM3YzU0MTM3ZDU2MTQ3ZDU3MTU3ZTU5MTU3ZTVhMTY3ZTVjMTY3ZjVkMTc3ZjVmMTg3ZjYwMTg4MDYyMTk4MDY0MWE4MDY1MWE4MDY3MWI4MDY4MWM4MTZhMWM4MTZiMWQ4MTZkMWQ4MTZlMWU4MTcwMWY4MTcyMWY4MTczMjA4MTc1MjE4MTc2MjE4MTc4MjI4MTc5MjI4MjdiMjM4MjdjMjM4MjdlMjQ4MjgwMjU4MjgxMjU4MTgzMjY4MTg0MjY4MTg2Mjc4MTg4Mjc4MTg5Mjg4MThiMjk4MThjMjk4MThlMmE4MTkwMmE4MTkxMmI4MTkzMmI4MDk0MmM4MDk2MmM4MDk4MmQ4MDk5MmQ4MDliMmU3ZjljMmU3ZjllMmY3ZmEwMmY3ZmExMzA3ZWEzMzA3ZWE1MzE3ZWE2MzE3ZGE4MzI3ZGFhMzM3ZGFiMzM3Y2FkMzQ3Y2FlMzQ3YmIwMzU3YmIyMzU3YmIzMzY3YWI1MzY3YWI3Mzc3OWI4Mzc3OWJhMzg3OGJjMzk3OGJkMzk3N2JmM2E3N2MwM2E3NmMyM2I3NWM0M2M3NWM1M2M3NGM3M2Q3M2M4M2U3M2NhM2U3MmNjM2Y3MWNkNDA3MWNmNDA3MGQwNDE2ZmQyNDI2ZmQzNDM2ZWQ1NDQ2ZGQ2NDU2Y2Q4NDU2Y2Q5NDY2YmRiNDc2YWRjNDg2OWRlNDk2OGRmNGE2OGUwNGM2N2UyNGQ2NmUzNGU2NWU0NGY2NGU1NTA2NGU3NTI2M2U4NTM2MmU5NTQ2MmVhNTY2MWViNTc2MGVjNTg2MGVkNWE1ZmVlNWI1ZWVmNWQ1ZWYwNWY1ZWYxNjA1ZGYyNjI1ZGYyNjQ1Y2YzNjU1Y2Y0Njc1Y2Y0Njk1Y2Y1NmI1Y2Y2NmM1Y2Y2NmU1Y2Y3NzA1Y2Y3NzI1Y2Y4NzQ1Y2Y4NzY1Y2Y5Nzg1ZGY5Nzk1ZGY5N2I1ZGZhN2Q1ZWZhN2Y1ZWZhODE1ZmZiODM1ZmZiODU2MGZiODc2MWZjODk2MWZjOGE2MmZjOGM2M2ZjOGU2NGZjOTA2NWZkOTI2NmZkOTQ2N2ZkOTY2OGZkOTg2OWZkOWE2YWZkOWI2YmZlOWQ2Y2ZlOWY2ZGZlYTE2ZWZlYTM2ZmZlYTU3MWZlYTc3MmZlYTk3M2ZlYWE3NGZlYWM3NmZlYWU3N2ZlYjA3OGZlYjI3YWZlYjQ3YmZlYjY3Y2ZlYjc3ZWZlYjk3ZmZlYmI4MWZlYmQ4MmZlYmY4NGZlYzE4NWZlYzI4N2ZlYzQ4OGZlYzY4YWZlYzg4Y2ZlY2E4ZGZlY2M4ZmZlY2Q5MGZlY2Y5MmZlZDE5NGZlZDM5NWZlZDU5N2ZlZDc5OWZlZDg5YWZkZGE5Y2ZkZGM5ZWZkZGVhMGZkZTBhMWZkZTJhM2ZkZTNhNWZkZTVhN2ZkZTdhOWZkZTlhYWZkZWJhY2ZjZWNhZWZjZWViMGZjZjBiMmZjZjJiNGZjZjRiNmZjZjZiOGZjZjdiOWZjZjliYmZjZmJiZGZjZmRiZiIpKTt2YXIgaW5mZXJubz1yYW1wKGNvbG9ycygiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTBhMDIwMjBjMDIwMjBlMDMwMjEwMDQwMzEyMDQwMzE0MDUwNDE3MDYwNDE5MDcwNTFiMDgwNTFkMDkwNjFmMGEwNzIyMGIwNzI0MGMwODI2MGQwODI5MGUwOTJiMTAwOTJkMTEwYTMwMTIwYTMyMTQwYjM0MTUwYjM3MTYwYjM5MTgwYzNjMTkwYzNlMWIwYzQxMWMwYzQzMWUwYzQ1MWYwYzQ4MjEwYzRhMjMwYzRjMjQwYzRmMjYwYzUxMjgwYjUzMjkwYjU1MmIwYjU3MmQwYjU5MmYwYTViMzEwYTVjMzIwYTVlMzQwYTVmMzYwOTYxMzgwOTYyMzkwOTYzM2IwOTY0M2QwOTY1M2UwOTY2NDAwYTY3NDIwYTY4NDQwYTY4NDUwYTY5NDcwYjZhNDkwYjZhNGEwYzZiNGMwYzZiNGQwZDZjNGYwZDZjNTEwZTZjNTIwZTZkNTQwZjZkNTUwZjZkNTcxMDZlNTkxMDZlNWExMTZlNWMxMjZlNWQxMjZlNWYxMzZlNjExMzZlNjIxNDZlNjQxNTZlNjUxNTZlNjcxNjZlNjkxNjZlNmExNzZlNmMxODZlNmQxODZlNmYxOTZlNzExOTZlNzIxYTZlNzQxYTZlNzUxYjZlNzcxYzZkNzgxYzZkN2ExZDZkN2MxZDZkN2QxZTZkN2YxZTZjODAxZjZjODIyMDZjODQyMDZiODUyMTZiODcyMTZiODgyMjZhOGEyMjZhOGMyMzY5OGQyMzY5OGYyNDY5OTAyNTY4OTIyNTY4OTMyNjY3OTUyNjY3OTcyNzY2OTgyNzY2OWEyODY1OWIyOTY0OWQyOTY0OWYyYTYzYTAyYTYzYTIyYjYyYTMyYzYxYTUyYzYwYTYyZDYwYTgyZTVmYTkyZTVlYWIyZjVlYWQzMDVkYWUzMDVjYjAzMTViYjEzMjVhYjMzMjVhYjQzMzU5YjYzNDU4YjczNTU3YjkzNTU2YmEzNjU1YmMzNzU0YmQzODUzYmYzOTUyYzAzYTUxYzEzYTUwYzMzYjRmYzQzYzRlYzYzZDRkYzczZTRjYzgzZjRiY2E0MDRhY2I0MTQ5Y2M0MjQ4Y2U0MzQ3Y2Y0NDQ2ZDA0NTQ1ZDI0NjQ0ZDM0NzQzZDQ0ODQyZDU0YTQxZDc0YjNmZDg0YzNlZDk0ZDNkZGE0ZTNjZGI1MDNiZGQ1MTNhZGU1MjM4ZGY1MzM3ZTA1NTM2ZTE1NjM1ZTI1NzM0ZTM1OTMzZTQ1YTMxZTU1YzMwZTY1ZDJmZTc1ZTJlZTg2MDJkZTk2MTJiZWE2MzJhZWI2NDI5ZWI2NjI4ZWM2NzI2ZWQ2OTI1ZWU2YTI0ZWY2YzIzZWY2ZTIxZjA2ZjIwZjE3MTFmZjE3MzFkZjI3NDFjZjM3NjFiZjM3ODE5ZjQ3OTE4ZjU3YjE3ZjU3ZDE1ZjY3ZTE0ZjY4MDEzZjc4MjEyZjc4NDEwZjg4NTBmZjg4NzBlZjg4OTBjZjk4YjBiZjk4YzBhZjk4ZTA5ZmE5MDA4ZmE5MjA3ZmE5NDA3ZmI5NjA2ZmI5NzA2ZmI5OTA2ZmI5YjA2ZmI5ZDA3ZmM5ZjA3ZmNhMTA4ZmNhMzA5ZmNhNTBhZmNhNjBjZmNhODBkZmNhYTBmZmNhYzExZmNhZTEyZmNiMDE0ZmNiMjE2ZmNiNDE4ZmJiNjFhZmJiODFkZmJiYTFmZmJiYzIxZmJiZTIzZmFjMDI2ZmFjMjI4ZmFjNDJhZmFjNjJkZjljNzJmZjljOTMyZjljYjM1ZjhjZDM3ZjhjZjNhZjdkMTNkZjdkMzQwZjZkNTQzZjZkNzQ2ZjVkOTQ5ZjVkYjRjZjRkZDRmZjRkZjUzZjRlMTU2ZjNlMzVhZjNlNTVkZjJlNjYxZjJlODY1ZjJlYTY5ZjFlYzZkZjFlZDcxZjFlZjc1ZjFmMTc5ZjJmMjdkZjJmNDgyZjNmNTg2ZjNmNjhhZjRmODhlZjVmOTkyZjZmYTk2ZjhmYjlhZjlmYzlkZmFmZGExZmNmZmE0IikpO3ZhciBwbGFzbWE9cmFtcChjb2xvcnMoIjBkMDg4NzEwMDc4ODEzMDc4OTE2MDc4YTE5MDY4YzFiMDY4ZDFkMDY4ZTIwMDY4ZjIyMDY5MDI0MDY5MTI2MDU5MTI4MDU5MjJhMDU5MzJjMDU5NDJlMDU5NTJmMDU5NjMxMDU5NzMzMDU5NzM1MDQ5ODM3MDQ5OTM4MDQ5YTNhMDQ5YTNjMDQ5YjNlMDQ5YzNmMDQ5YzQxMDQ5ZDQzMDM5ZTQ0MDM5ZTQ2MDM5ZjQ4MDM5ZjQ5MDNhMDRiMDNhMTRjMDJhMTRlMDJhMjUwMDJhMjUxMDJhMzUzMDJhMzU1MDJhNDU2MDFhNDU4MDFhNDU5MDFhNTViMDFhNTVjMDFhNjVlMDFhNjYwMDFhNjYxMDBhNzYzMDBhNzY0MDBhNzY2MDBhNzY3MDBhODY5MDBhODZhMDBhODZjMDBhODZlMDBhODZmMDBhODcxMDBhODcyMDFhODc0MDFhODc1MDFhODc3MDFhODc4MDFhODdhMDJhODdiMDJhODdkMDNhODdlMDNhODgwMDRhODgxMDRhNzgzMDVhNzg0MDVhNzg2MDZhNjg3MDdhNjg4MDhhNjhhMDlhNThiMGFhNThkMGJhNThlMGNhNDhmMGRhNDkxMGVhMzkyMGZhMzk0MTBhMjk1MTFhMTk2MTNhMTk4MTRhMDk5MTU5ZjlhMTY5ZjljMTc5ZTlkMTg5ZDllMTk5ZGEwMWE5Y2ExMWI5YmEyMWQ5YWEzMWU5YWE1MWY5OWE2MjA5OGE3MjE5N2E4MjI5NmFhMjM5NWFiMjQ5NGFjMjY5NGFkMjc5M2FlMjg5MmIwMjk5MWIxMmE5MGIyMmI4ZmIzMmM4ZWI0MmU4ZGI1MmY4Y2I2MzA4YmI3MzE4YWI4MzI4OWJhMzM4OGJiMzQ4OGJjMzU4N2JkMzc4NmJlMzg4NWJmMzk4NGMwM2E4M2MxM2I4MmMyM2M4MWMzM2Q4MGM0M2U3ZmM1NDA3ZWM2NDE3ZGM3NDI3Y2M4NDM3YmM5NDQ3YWNhNDU3YWNiNDY3OWNjNDc3OGNjNDk3N2NkNGE3NmNlNGI3NWNmNGM3NGQwNGQ3M2QxNGU3MmQyNGY3MWQzNTE3MWQ0NTI3MGQ1NTM2ZmQ1NTQ2ZWQ2NTU2ZGQ3NTY2Y2Q4NTc2YmQ5NTg2YWRhNWE2YWRhNWI2OWRiNWM2OGRjNWQ2N2RkNWU2NmRlNWY2NWRlNjE2NGRmNjI2M2UwNjM2M2UxNjQ2MmUyNjU2MWUyNjY2MGUzNjg1ZmU0Njk1ZWU1NmE1ZGU1NmI1ZGU2NmM1Y2U3NmU1YmU3NmY1YWU4NzA1OWU5NzE1OGU5NzI1N2VhNzQ1N2ViNzU1NmViNzY1NWVjNzc1NGVkNzk1M2VkN2E1MmVlN2I1MWVmN2M1MWVmN2U1MGYwN2Y0ZmYwODA0ZWYxODE0ZGYxODM0Y2YyODQ0YmYzODU0YmYzODc0YWY0ODg0OWY0ODk0OGY1OGI0N2Y1OGM0NmY2OGQ0NWY2OGY0NGY3OTA0NGY3OTE0M2Y3OTM0MmY4OTQ0MWY4OTU0MGY5OTczZmY5OTgzZWY5OWEzZWZhOWIzZGZhOWMzY2ZhOWUzYmZiOWYzYWZiYTEzOWZiYTIzOGZjYTMzOGZjYTUzN2ZjYTYzNmZjYTgzNWZjYTkzNGZkYWIzM2ZkYWMzM2ZkYWUzMmZkYWYzMWZkYjEzMGZkYjIyZmZkYjQyZmZkYjUyZWZlYjcyZGZlYjgyY2ZlYmEyY2ZlYmIyYmZlYmQyYWZlYmUyYWZlYzAyOWZkYzIyOWZkYzMyOGZkYzUyN2ZkYzYyN2ZkYzgyN2ZkY2EyNmZkY2IyNmZjY2QyNWZjY2UyNWZjZDAyNWZjZDIyNWZiZDMyNGZiZDUyNGZiZDcyNGZhZDgyNGZhZGEyNGY5ZGMyNGY5ZGQyNWY4ZGYyNWY4ZTEyNWY3ZTIyNWY3ZTQyNWY2ZTYyNmY2ZTgyNmY1ZTkyNmY1ZWIyN2Y0ZWQyN2YzZWUyN2YzZjAyN2YyZjIyN2YxZjQyNmYxZjUyNWYwZjcyNGYwZjkyMSIpKTtmdW5jdGlvbiBzZXF1ZW50aWFsKGludGVycG9sYXRvcil7dmFyIHgwPTAseDE9MSxjbGFtcD1mYWxzZTtmdW5jdGlvbiBzY2FsZSh4KXt2YXIgdD0oeC14MCkvKHgxLXgwKTtyZXR1cm4gaW50ZXJwb2xhdG9yKGNsYW1wP01hdGgubWF4KDAsTWF0aC5taW4oMSx0KSk6dCl9c2NhbGUuZG9tYWluPWZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4MD0rX1swXSx4MT0rX1sxXSxzY2FsZSk6W3gwLHgxXX07c2NhbGUuY2xhbXA9ZnVuY3Rpb24oXyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGNsYW1wPSEhXyxzY2FsZSk6Y2xhbXB9O3NjYWxlLmludGVycG9sYXRvcj1mdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaW50ZXJwb2xhdG9yPV8sc2NhbGUpOmludGVycG9sYXRvcn07c2NhbGUuY29weT1mdW5jdGlvbigpe3JldHVybiBzZXF1ZW50aWFsKGludGVycG9sYXRvcikuZG9tYWluKFt4MCx4MV0pLmNsYW1wKGNsYW1wKX07cmV0dXJuIGxpbmVhcmlzaChzY2FsZSl9dmFyIGQzU2NhbGU9T2JqZWN0LmZyZWV6ZSh7c2NhbGVCYW5kOmJhbmQsc2NhbGVQb2ludDpwb2ludCQxLHNjYWxlSWRlbnRpdHk6aWRlbnRpdHkkNCxzY2FsZUxpbmVhcjpsaW5lYXIkMixzY2FsZUxvZzpsb2csc2NhbGVPcmRpbmFsOm9yZGluYWwsc2NhbGVJbXBsaWNpdDppbXBsaWNpdCxzY2FsZVBvdzpwb3csc2NhbGVTcXJ0OnNxcnQsc2NhbGVRdWFudGlsZTpxdWFudGlsZSQxLHNjYWxlUXVhbnRpemU6cXVhbnRpemUkMSxzY2FsZVRocmVzaG9sZDp0aHJlc2hvbGQkMixzY2FsZVRpbWU6dGltZSxzY2FsZVV0Yzp1dGNUaW1lLHNjaGVtZUNhdGVnb3J5MTA6Y2F0ZWdvcnkxMCxzY2hlbWVDYXRlZ29yeTIwYjpjYXRlZ29yeTIwYixzY2hlbWVDYXRlZ29yeTIwYzpjYXRlZ29yeTIwYyxzY2hlbWVDYXRlZ29yeTIwOmNhdGVnb3J5MjAsaW50ZXJwb2xhdGVDdWJlaGVsaXhEZWZhdWx0OmN1YmVoZWxpeCQzLGludGVycG9sYXRlUmFpbmJvdzpyYWluYm93JDEsaW50ZXJwb2xhdGVXYXJtOndhcm0saW50ZXJwb2xhdGVDb29sOmNvb2wsaW50ZXJwb2xhdGVWaXJpZGlzOnZpcmlkaXMsaW50ZXJwb2xhdGVNYWdtYTptYWdtYSxpbnRlcnBvbGF0ZUluZmVybm86aW5mZXJubyxpbnRlcnBvbGF0ZVBsYXNtYTpwbGFzbWEsc2NhbGVTZXF1ZW50aWFsOnNlcXVlbnRpYWx9KTt2YXIgZHJhd2luZz1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTp0cnVlfSk7dmFyIF90eXBlb2YkJDE9dHlwZW9mIFN5bWJvbD09PSJmdW5jdGlvbiImJl90eXBlb2YoU3ltYm9sLml0ZXJhdG9yKT09PSJzeW1ib2wiP2Z1bmN0aW9uKG9iail7cmV0dXJuIHR5cGVvZiBvYmo9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKG9iail9OmZ1bmN0aW9uKG9iail7cmV0dXJuIG9iaiYmdHlwZW9mIFN5bWJvbD09PSJmdW5jdGlvbiImJm9iai5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmb2JqIT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2Ygb2JqPT09InVuZGVmaW5lZCI/InVuZGVmaW5lZCI6X3R5cGVvZihvYmopfTt2YXIgX2V4dGVuZHMkJDE9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odGFyZ2V0KXtmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXt2YXIgc291cmNlPWFyZ3VtZW50c1tpXTtmb3IodmFyIGtleSBpbiBzb3VyY2Upe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2Usa2V5KSl7dGFyZ2V0W2tleV09c291cmNlW2tleV19fX1yZXR1cm4gdGFyZ2V0fTtleHBvcnRzLmFyZWFMaW5lR2VuZXJhdG9yPWFyZWFMaW5lR2VuZXJhdG9yO2V4cG9ydHMuYXJlYUxpbmU9YXJlYUxpbmU7ZXhwb3J0cy52ZXJ0aWNhbGJhcj12ZXJ0aWNhbGJhcjtleHBvcnRzLmhvcml6b250YWxiYXI9aG9yaXpvbnRhbGJhcjtleHBvcnRzLnBhdGhTdHI9cGF0aFN0cjtleHBvcnRzLmNpcmNsZVBhdGg9Y2lyY2xlUGF0aDtleHBvcnRzLnJlY3RQYXRoPXJlY3RQYXRoO2V4cG9ydHMubGluZVBhdGg9bGluZVBhdGg7ZXhwb3J0cy5qaXR0ZXJMaW5lPWppdHRlckxpbmU7ZXhwb3J0cy5jaGVhcFNrZXRjaHk9Y2hlYXBTa2V0Y2h5O2V4cG9ydHMuY2hlYXBQb3BBcnRzeT1jaGVhcFBvcEFydHN5O2V4cG9ydHMucmFuZG9tQ29sb3I9cmFuZG9tQ29sb3I7ZXhwb3J0cy5wYWludHk9cGFpbnR5O2V4cG9ydHMuc2tldGNoeT1za2V0Y2h5O2V4cG9ydHMuZ2VuZXJhdGVTVkc9Z2VuZXJhdGVTVkc7dmFyIF9yZWFjdDI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChSZWFjdCk7ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmope3JldHVybiBvYmomJm9iai5fX2VzTW9kdWxlP29iajp7ZGVmYXVsdDpvYmp9fWZ1bmN0aW9uIHJvdW5kVG9UZW50aChudW1iZXIpe3JldHVybiBNYXRoLnJvdW5kKG51bWJlcioxMCkvMTB9ZnVuY3Rpb24gYXJlYUxpbmVHZW5lcmF0b3IoY3VzdG9tQWNjZXNzb3JzLGludGVycG9sYXRvcil7dmFyIGxpbmVHZW5lcmF0b3I9KDAsZDNTaGFwZSQxLmFyZWEpKCkueDAoY3VzdG9tQWNjZXNzb3JzLngpLnkwKGN1c3RvbUFjY2Vzc29ycy55KS54MShjdXN0b21BY2Nlc3NvcnMueDEpLnkxKGN1c3RvbUFjY2Vzc29ycy55MSkuaW50ZXJwb2xhdGUoaW50ZXJwb2xhdG9yfHwibGluZWFyIik7cmV0dXJuIGxpbmVHZW5lcmF0b3J9ZnVuY3Rpb24gYXJlYUxpbmUocHJvcHMpe3ZhciBsaW5lR2VuZXJhdG9yPWFyZWFMaW5lR2VuZXJhdG9yKHByb3BzLmN1c3RvbUFjY2Vzc29ycyxwcm9wcy5pbnRlcnBvbGF0ZSk7cHJvcHMuZD1saW5lR2VuZXJhdG9yKHByb3BzLmNvb3JkaW5hdGVzKTtyZXR1cm4gcHJvcHN9ZnVuY3Rpb24gdmVydGljYWxiYXIocHJvcHMpe3Byb3BzLnk9cHJvcHMueS1wcm9wcy5oZWlnaHQ7cmV0dXJuIHByb3BzfWZ1bmN0aW9uIGhvcml6b250YWxiYXIocHJvcHMpe3ZhciBvcmlnaW5hbEhlaWdodD1wcm9wcy5oZWlnaHQ7dmFyIG9yaWdpbmFsV2lkdGg9cHJvcHMud2lkdGg7cHJvcHMud2lkdGg9b3JpZ2luYWxIZWlnaHQ7cHJvcHMuaGVpZ2h0PW9yaWdpbmFsV2lkdGg7cmV0dXJuIHByb3BzfWZ1bmN0aW9uIHBhdGhTdHIoX3JlZil7dmFyIHg9X3JlZi54LHk9X3JlZi55LHdpZHRoPV9yZWYud2lkdGgsaGVpZ2h0PV9yZWYuaGVpZ2h0LGN4PV9yZWYuY3gsY3k9X3JlZi5jeSxyPV9yZWYucjtpZihjeCE9PXVuZGVmaW5lZCl7cmV0dXJuWyJNIixyb3VuZFRvVGVudGgoY3gtcikscm91bmRUb1RlbnRoKGN5KSwiYSIscixyLDAsMSwwLHIqMiwwLCJhIixyLHIsMCwxLDAsLShyKjIpLDBdLmpvaW4oIiAiKSsiWiJ9cmV0dXJuWyJNIixyb3VuZFRvVGVudGgoeCkscm91bmRUb1RlbnRoKHkpLCJoIix3aWR0aCwidiIsaGVpZ2h0LCJoIiwtd2lkdGgsInYiLC1oZWlnaHRdLmpvaW4oIiAiKSsiWiJ9ZnVuY3Rpb24gY2lyY2xlUGF0aChjeCxjeSxyKXtyZXR1cm4gcGF0aFN0cih7Y3g6Y3gsY3k6Y3kscjpyfSl9ZnVuY3Rpb24gcmVjdFBhdGgoeCx5LHdpZHRoLGhlaWdodCl7cmV0dXJuIHBhdGhTdHIoe3g6eCx5Onksd2lkdGg6d2lkdGgsaGVpZ2h0OmhlaWdodH0pfWZ1bmN0aW9uIGxpbmVQYXRoKHgxLHgyLHkxLHkyKXtyZXR1cm4iTSIreDErIiwiK3kxKyJMIit4MisiLCIreTIrIkwifWZ1bmN0aW9uIGppdHRlckxpbmUocGF0aE5vZGUpe3ZhciBsZW5ndGg9cGF0aE5vZGUuZ2V0VG90YWxMZW5ndGgoKTt2YXIgaj0yO3ZhciB4PWorTWF0aC5yYW5kb20oKSpqKjU7dmFyIGppdHRlcmVkUG9pbnRzPVtdO3ZhciBsaW5lR2VuPSgwLGQzU2hhcGUkMS5saW5lKSgpLngoZnVuY3Rpb24oZCl7cmV0dXJuIGQueH0pLnkoZnVuY3Rpb24oZCl7cmV0dXJuIGQueX0pLmN1cnZlKGQzU2hhcGUkMS5jdXJ2ZUJhc2lzKTt2YXIgbmV3UG9pbnQ9cGF0aE5vZGUuZ2V0UG9pbnRBdExlbmd0aCgwKTtqaXR0ZXJlZFBvaW50cy5wdXNoKG5ld1BvaW50KTt3aGlsZSh4PGxlbmd0aCl7bmV3UG9pbnQ9cGF0aE5vZGUuZ2V0UG9pbnRBdExlbmd0aCh4KTt2YXIgbmV3WD1uZXdQb2ludC54KyhNYXRoLnJhbmRvbSgpKmotai8yKTt2YXIgbmV3WT1uZXdQb2ludC55KyhNYXRoLnJhbmRvbSgpKmotai8yKTtqaXR0ZXJlZFBvaW50cy5wdXNoKHt4Om5ld1gseTpuZXdZfSk7eCs9aitNYXRoLnJhbmRvbSgpKmoqNX1uZXdQb2ludD1wYXRoTm9kZS5nZXRQb2ludEF0TGVuZ3RoKGxlbmd0aCk7aml0dGVyZWRQb2ludHMucHVzaChuZXdQb2ludCk7cmV0dXJuIGxpbmVHZW4oaml0dGVyZWRQb2ludHMpfWZ1bmN0aW9uIGNoZWFwU2tldGNoeShwYXRoKXt2YXIgb3BhY2l0eT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMV06MTtpZihvcGFjaXR5PT09MCl7cmV0dXJuIiJ9dmFyIG9wYWNpdHlTa2V0Y2h5U2NhbGU9KDAsZDNTY2FsZS5zY2FsZUxpbmVhcikoKS5kb21haW4oWzAsMV0pLnJhbmdlKFsxMCwxXSkuY2xhbXAodHJ1ZSk7dmFyIGxlbmd0aD1wYXRoLmdldFRvdGFsTGVuZ3RoKCk7dmFyIGRyYXdDb2RlPSIiO3ZhciB4PTA7dmFyIHN0ZXA9b3BhY2l0eVNrZXRjaHlTY2FsZShvcGFjaXR5KTt3aGlsZSh4PGxlbmd0aC8yKXt2YXIgc3RhcnQ9cGF0aC5nZXRQb2ludEF0TGVuZ3RoKHgpO3ZhciBlbmQ9cGF0aC5nZXRQb2ludEF0TGVuZ3RoKGxlbmd0aC14KTtkcmF3Q29kZSs9IiBNIisoc3RhcnQueCsoTWF0aC5yYW5kb20oKSpzdGVwLXN0ZXAvMikpKyIgIisoc3RhcnQueSsoTWF0aC5yYW5kb20oKSpzdGVwLXN0ZXAvMikpKyJMIisoZW5kLngrKE1hdGgucmFuZG9tKCkqc3RlcC1zdGVwLzIpKSsiICIrKGVuZC55KyhNYXRoLnJhbmRvbSgpKnN0ZXAtc3RlcC8yKSk7eCs9c3RlcCtNYXRoLnJhbmRvbSgpKnN0ZXB9cmV0dXJuIGRyYXdDb2RlfWZ1bmN0aW9uIGNoZWFwUG9wQXJ0c3kocGF0aCxzaXplKXt2YXIgbGVuZ3RoPXBhdGguZ2V0VG90YWxMZW5ndGgoKTt2YXIgY2lyY2xlcz1bXTt2YXIgeD0wO3ZhciBzdGVwPXNpemUqMzt3aGlsZSh4PGxlbmd0aC8yKXt2YXIgc3RhcnQ9cGF0aC5nZXRQb2ludEF0TGVuZ3RoKHgpO3ZhciBlbmQ9cGF0aC5nZXRQb2ludEF0TGVuZ3RoKGxlbmd0aC14KTt2YXIgZGlzdGFuY2U9TWF0aC5zcXJ0KE1hdGgucG93KGVuZC54LXN0YXJ0LngsMikrTWF0aC5wb3coZW5kLnktc3RhcnQueSwyKSk7dmFyIGJlZ2luPXNpemUvMjt3aGlsZShiZWdpbjxkaXN0YW5jZS1zaXplLzIpe3ZhciBwZXJjZW50PWJlZ2luL2Rpc3RhbmNlO3ZhciBjaXJjbGVYYT1wZXJjZW50KnN0YXJ0Lng7dmFyIGNpcmNsZVhiPSgxLXBlcmNlbnQpKmVuZC54O3ZhciBjaXJjbGVZYT1wZXJjZW50KnN0YXJ0Lnk7dmFyIGNpcmNsZVliPSgxLXBlcmNlbnQpKmVuZC55O2NpcmNsZXMucHVzaChbY2lyY2xlWGErY2lyY2xlWGIsY2lyY2xlWWErY2lyY2xlWWJdKTtiZWdpbj1iZWdpbisoc3RlcCtNYXRoLnJhbmRvbSgpKX14PXgrc3RlcH1yZXR1cm4gY2lyY2xlc31mdW5jdGlvbiByYW5kb21Db2xvcihiYXNlQ29sb3IscmFuZ2Upe3ZhciBoc2xCYXNlPSgwLGQzQ29sb3IuaHNsKShiYXNlQ29sb3IpO2hzbEJhc2UuaD1oc2xCYXNlLmgrKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoocmFuZ2UqMjU1KSktTWF0aC5mbG9vcihyYW5nZS8yKSk7aHNsQmFzZS5zPWhzbEJhc2UucysoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnJhbmdlKS1NYXRoLmZsb29yKHJhbmdlLzIpKTtoc2xCYXNlLmw9aHNsQmFzZS5sKyhNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqcmFuZ2UpLU1hdGguZmxvb3IocmFuZ2UvMikpO3JldHVybiBoc2xCYXNlLnRvU3RyaW5nKCl9ZnVuY3Rpb24gcGFpbnR5KG1hcmtUeXBlLGNsb25lUHJvcHMpe2RlbGV0ZSBjbG9uZVByb3BzLm1hcmtUeXBlO2lmKChtYXJrVHlwZT09PSJwYXRoInx8bWFya1R5cGU9PT0iY2lyY2xlInx8bWFya1R5cGU9PT0ibGluZSJ8fG1hcmtUeXBlPT09InJlY3QiKSYmY2xvbmVQcm9wcy5zdHlsZSYmKGNsb25lUHJvcHMuc3R5bGUuc3Ryb2tlfHxjbG9uZVByb3BzLnN0eWxlLmZpbGwpKXtpZihtYXJrVHlwZT09PSJjaXJjbGUiKXtjbG9uZVByb3BzLmQ9Y2lyY2xlUGF0aChjbG9uZVByb3BzLmN4fHwwLGNsb25lUHJvcHMuY3l8fDAsY2xvbmVQcm9wcy5yKX1pZihtYXJrVHlwZT09PSJyZWN0Iil7Y2xvbmVQcm9wcy5kPXJlY3RQYXRoKGNsb25lUHJvcHMueHx8MCxjbG9uZVByb3BzLnl8fDAsY2xvbmVQcm9wcy53aWR0aCxjbG9uZVByb3BzLmhlaWdodCl9aWYobWFya1R5cGU9PT0ibGluZSIpe2Nsb25lUHJvcHMuZD1saW5lUGF0aChjbG9uZVByb3BzLngxLGNsb25lUHJvcHMueDIsY2xvbmVQcm9wcy55MSxjbG9uZVByb3BzLnkyKX0oMCxkM1NlbGVjdGlvbi5zZWxlY3QpKCJib2R5IikuYXBwZW5kKCJzdmciKS5hdHRyKCJpZCIsInNrZXRjaHlUZW1wU1ZHIik7dmFyIGZpbGxzPVtdO3ZhciBvdXRsaW5lcz1bXTtjbG9uZVByb3BzLmQuc3BsaXQoIk0iKS5maWx0ZXIoZnVuY3Rpb24oZCxpKXtyZXR1cm4gaSE9PTB9KS5mb3JFYWNoKGZ1bmN0aW9uKHBhdGhELGkpe3ZhciBwYXRoRHVtbXk9KDAsZDNTZWxlY3Rpb24uc2VsZWN0KSgiI3NrZXRjaHlUZW1wU1ZHIikuYXBwZW5kKCJwYXRoIikuYXR0cigiY2xhc3MiLGNsb25lUHJvcHMuY2xhc3NOYW1lKS5hdHRyKCJkIiwiTSIrcGF0aEQpO3ZhciBwYXRoTm9kZT1wYXRoRHVtbXkubm9kZSgpO2lmKGNsb25lUHJvcHMuc3R5bGUmJmNsb25lUHJvcHMuc3R5bGUuZmlsbCE9PSJub25lIil7dmFyIHNrZXRjaHlGaWxsPWNoZWFwUG9wQXJ0c3kocGF0aE5vZGUsNCk7dmFyIGZpbGxQcm9wcz1fZXh0ZW5kcyQkMSh7fSxjbG9uZVByb3BzKTt2YXIgZmlsbFN0eWxlPV9leHRlbmRzJCQxKHt9LGNsb25lUHJvcHMuc3R5bGUpO3ZhciBmaWxsVmFsdWU9ZmlsbFN0eWxlLmZpbGw7ZmlsbFByb3BzLnN0eWxlPWZpbGxTdHlsZTtkZWxldGUgZmlsbFByb3BzLmQ7ZGVsZXRlIGZpbGxQcm9wcy5zdHlsZS5maWxsT3BhY2l0eTtkZWxldGUgZmlsbFByb3BzLnN0eWxlLnN0cm9rZTtkZWxldGUgZmlsbFByb3BzLnN0eWxlLnN0cm9rZVdpZHRoO2ZpbGxzLnB1c2goc2tldGNoeUZpbGwubWFwKGZ1bmN0aW9uKGNpcmNsZSxjaSl7ZmlsbFByb3BzLmtleT0icGFpbnR5LWZpbGwtIitpKyItIitjaTtmaWxsUHJvcHMuY3g9Y2lyY2xlWzBdO2ZpbGxQcm9wcy5jeT1jaXJjbGVbMV07ZmlsbFByb3BzLnN0eWxlPV9leHRlbmRzJCQxKHt9LGZpbGxQcm9wcy5zdHlsZSk7ZmlsbFByb3BzLnN0eWxlLmZpbGw9cmFuZG9tQ29sb3IoZmlsbFZhbHVlLC4wNSk7ZmlsbFByb3BzLnI9TWF0aC5yYW5kb20oKSoyKzM7cmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJjaXJjbGUiLGZpbGxQcm9wcyl9KSl9aWYoY2xvbmVQcm9wcy5zdHlsZSYmY2xvbmVQcm9wcy5zdHlsZS5zdHJva2UhPT0ibm9uZSImJmNsb25lUHJvcHMuc3R5bGUuc3Ryb2tlV2lkdGghPT0wKXt2YXIgc2tldGNoeU91dGxpbmU9aml0dGVyTGluZShwYXRoTm9kZSk7dmFyIG91dGxpbmVQcm9wcz1fZXh0ZW5kcyQkMSh7fSxjbG9uZVByb3BzKTt2YXIgb3V0bGluZVN0eWxlPV9leHRlbmRzJCQxKHt9LGNsb25lUHJvcHMuc3R5bGUpO291dGxpbmVQcm9wcy5zdHlsZT1vdXRsaW5lU3R5bGU7b3V0bGluZVByb3BzLmQ9c2tldGNoeU91dGxpbmU7b3V0bGluZVByb3BzLmtleT0icGFpbnR5LW91dGxpbmUtIitpO291dGxpbmVQcm9wcy5zdHlsZS5maWxsPSJub25lIjtvdXRsaW5lcy5wdXNoKF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJwYXRoIixvdXRsaW5lUHJvcHMpKX19KTsoMCxkM1NlbGVjdGlvbi5zZWxlY3QpKCIjc2tldGNoeVRlbXBTVkciKS5yZW1vdmUoKTtyZXR1cm5bX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtrZXk6InBhaW50eS1pbnRlcmFjdGlvbi1vdmVybGF5IixkOmNsb25lUHJvcHMuZCxzdHlsZTp7b3BhY2l0eTowfX0pLF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJnIix7a2V5OiJwYWludHktZmlsbCIsc3R5bGU6e2ZpbHRlcjoidXJsKCNwYWludHlGaWx0ZXJIZWF2eSkifX0sZmlsbHMpLG91dGxpbmVzXX1yZXR1cm4gX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQobWFya1R5cGUsY2xvbmVQcm9wcyl9ZnVuY3Rpb24gc2tldGNoeShtYXJrVHlwZSxjbG9uZVByb3BzKXtkZWxldGUgY2xvbmVQcm9wcy5tYXJrVHlwZTtpZihtYXJrVHlwZT09PSJ0ZXh0IiYmX3R5cGVvZiQkMShjbG9uZVByb3BzLmNoaWxkcmVuKSE9PSJvYmplY3QiKXt2YXIgc3RyaW5neUNoaWxkPWNsb25lUHJvcHMuY2hpbGRyZW4udG9TdHJpbmcoKTt2YXIgeD0wO3ZhciBza2V0Y2h5VGV4dD1bXTt2YXIgc2tldGNoeUJhc2U9W107d2hpbGUoeDw9c3RyaW5neUNoaWxkLmxlbmd0aCsxKXt2YXIgcmFuZG9tPXBhcnNlSW50KE1hdGgucmFuZG9tKCkqMikrMTt2YXIgcmFuZG9tU3ViPXN0cmluZ3lDaGlsZC5zdWJzdHJpbmcoeCxyYW5kb20reCk7dmFyIHJhbmRvbVRzcGFuPV9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJ0c3BhbiIse3N0eWxlOntmb250U2l6ZToxMCtwYXJzZUludChNYXRoLnJhbmRvbSgpKjYpKyJweCIsc3Ryb2tlV2lkdGg6MCxmb250V2VpZ2h0Ok1hdGgucmFuZG9tKCk8LjU/IjkwMCI6IjEwMCJ9fSxyYW5kb21TdWIpO3NrZXRjaHlCYXNlLnB1c2gocmFuZG9tU3ViKTtza2V0Y2h5VGV4dC5wdXNoKHJhbmRvbVRzcGFuKTt4Kz1yYW5kb219Y2xvbmVQcm9wcy5jaGlsZHJlbj1za2V0Y2h5VGV4dDtyZXR1cm4gX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInRleHQiLGNsb25lUHJvcHMpfWlmKChtYXJrVHlwZT09PSJwYXRoInx8bWFya1R5cGU9PT0iY2lyY2xlInx8bWFya1R5cGU9PT0ibGluZSJ8fG1hcmtUeXBlPT09InJlY3QiKSYmY2xvbmVQcm9wcy5zdHlsZSYmKGNsb25lUHJvcHMuc3R5bGUuc3Ryb2tlfHxjbG9uZVByb3BzLnN0eWxlLmZpbGwpKXtpZihtYXJrVHlwZT09PSJjaXJjbGUiKXtjbG9uZVByb3BzLmQ9Y2lyY2xlUGF0aChjbG9uZVByb3BzLmN4fHwwLGNsb25lUHJvcHMuY3l8fDAsY2xvbmVQcm9wcy5yKX1pZihtYXJrVHlwZT09PSJyZWN0Iil7Y2xvbmVQcm9wcy5kPXJlY3RQYXRoKGNsb25lUHJvcHMueHx8MCxjbG9uZVByb3BzLnl8fDAsY2xvbmVQcm9wcy53aWR0aCxjbG9uZVByb3BzLmhlaWdodCl9aWYobWFya1R5cGU9PT0ibGluZSIpe2Nsb25lUHJvcHMuZD1saW5lUGF0aChjbG9uZVByb3BzLngxLGNsb25lUHJvcHMueDIsY2xvbmVQcm9wcy55MSxjbG9uZVByb3BzLnkyKX12YXIgZmlsbHM9W107dmFyIG91dGxpbmVzPVtdO3ZhciBza2V0Y2hLZXk9TWF0aC5yYW5kb20oKS50b1N0cmluZygpO2lmKGNsb25lUHJvcHMuZCl7KDAsZDNTZWxlY3Rpb24uc2VsZWN0KSgiYm9keSIpLmFwcGVuZCgic3ZnIikuYXR0cigiaWQiLCJza2V0Y2h5VGVtcFNWRyIpO3ZhciBtVHlwZT1jbG9uZVByb3BzLmQuc3Vic3RyaW5nKDAsMSk9PT0iTSI/Ik0iOiJtIjtjbG9uZVByb3BzLmQuc3BsaXQobVR5cGUpLmZpbHRlcihmdW5jdGlvbihkLGkpe3JldHVybiBpIT09MH0pLmZvckVhY2goZnVuY3Rpb24ocGF0aEQsaSl7dmFyIHBhdGhEdW1teT0oMCxkM1NlbGVjdGlvbi5zZWxlY3QpKCIjc2tldGNoeVRlbXBTVkciKS5hcHBlbmQoInBhdGgiKS5hdHRyKCJjbGFzcyIsY2xvbmVQcm9wcy5jbGFzc05hbWUpLmF0dHIoImQiLCIiK21UeXBlK3BhdGhEKTt2YXIgcGF0aE5vZGU9cGF0aER1bW15Lm5vZGUoKTtpZihjbG9uZVByb3BzLnN0eWxlJiZjbG9uZVByb3BzLnN0eWxlLmZpbGwhPT0ibm9uZSIpe3ZhciBmaWxsUHJvcHM9X2V4dGVuZHMkJDEoe30sY2xvbmVQcm9wcyk7dmFyIGZpbGxTdHlsZT1fZXh0ZW5kcyQkMSh7fSxjbG9uZVByb3BzLnN0eWxlKTt2YXIgc2tldGNoeUZpbGw9Y2hlYXBTa2V0Y2h5KHBhdGhOb2RlLGZpbGxTdHlsZS5maWxsT3BhY2l0eSk7aWYobWFya1R5cGUhPT0icmVjdCImJm1hcmtUeXBlIT09ImNpcmNsZSIpe2ZpbGxTdHlsZS5jbGlwUGF0aD0idXJsKCNjbGlwLXBhdGgtIitza2V0Y2hLZXkrIikifWZpbGxQcm9wcy5zdHlsZT1maWxsU3R5bGU7ZmlsbFByb3BzLmQ9c2tldGNoeUZpbGw7ZmlsbFN0eWxlLnN0cm9rZT1maWxsU3R5bGUuZmlsbDtmaWxsU3R5bGUuc3Ryb2tlV2lkdGg9IjFweCI7ZmlsbFN0eWxlLmZpbGw9Im5vbmUiO2ZpbGxQcm9wcy5rZXk9InNrZXRjaEZpbGwtIitpO2ZpbGxzLnB1c2goX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInBhdGgiLGZpbGxQcm9wcykpfWlmKGNsb25lUHJvcHMuc3R5bGUmJmNsb25lUHJvcHMuc3R5bGUuc3Ryb2tlIT09Im5vbmUiJiZjbG9uZVByb3BzLnN0eWxlLnN0cm9rZVdpZHRoIT09MCl7dmFyIHNrZXRjaHlPdXRsaW5lPWppdHRlckxpbmUocGF0aE5vZGUpO3ZhciBvdXRsaW5lUHJvcHM9X2V4dGVuZHMkJDEoe30sY2xvbmVQcm9wcyk7dmFyIG91dGxpbmVTdHlsZT1fZXh0ZW5kcyQkMSh7fSxjbG9uZVByb3BzLnN0eWxlKTtvdXRsaW5lUHJvcHMuc3R5bGU9b3V0bGluZVN0eWxlO291dGxpbmVQcm9wcy5kPXNrZXRjaHlPdXRsaW5lO291dGxpbmVQcm9wcy5rZXk9InNrZXRjaE91dGxpbmUtIitpO291dGxpbmVQcm9wcy5zdHlsZS5maWxsPSJub25lIjtvdXRsaW5lcy5wdXNoKF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJwYXRoIixvdXRsaW5lUHJvcHMpKX19KX0oMCxkM1NlbGVjdGlvbi5zZWxlY3QpKCIjc2tldGNoeVRlbXBTVkciKS5yZW1vdmUoKTt2YXIgZ2VuZXJhdGVkQ2xpcFBhdGg9dm9pZCAwO2lmKG1hcmtUeXBlIT09InJlY3QiJiZtYXJrVHlwZSE9PSJjaXJjbGUiKXtnZW5lcmF0ZWRDbGlwUGF0aD1fcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiY2xpcFBhdGgiLHtrZXk6InNrZXRjaHktY2xpcC1vdmVybGF5IixpZDoiY2xpcC1wYXRoLSIrc2tldGNoS2V5fSxfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgicGF0aCIse2Q6Y2xvbmVQcm9wcy5kLHN0eWxlOntvcGFjaXR5OjB9fSkpfXJldHVybltnZW5lcmF0ZWRDbGlwUGF0aCxfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgicGF0aCIse2tleToic2tldGNoeS1pbnRlcmFjdGlvbi1vdmVybGF5IixkOmNsb25lUHJvcHMuZCxzdHlsZTp7b3BhY2l0eTowfX0pLGZpbGxzLG91dGxpbmVzXX1yZXR1cm4gX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQobWFya1R5cGUsY2xvbmVQcm9wcyl9ZnVuY3Rpb24gZ2VuZXJhdGVTVkcocHJvcHMsY2xhc3NOYW1lKXt2YXIgbWFya1R5cGU9cHJvcHMubWFya1R5cGU7dmFyIHJlbmRlck1vZGU9cHJvcHMucmVuZGVyTW9kZTt2YXIgY2xvbmVQcm9wcz1fZXh0ZW5kcyQkMSh7fSxwcm9wcyk7ZGVsZXRlIGNsb25lUHJvcHMubWFya1R5cGU7ZGVsZXRlIGNsb25lUHJvcHMucmVuZGVyTW9kZTtkZWxldGUgY2xvbmVQcm9wcy5yZXNldEFmdGVyO2RlbGV0ZSBjbG9uZVByb3BzLmRyb3BwYWJsZTtkZWxldGUgY2xvbmVQcm9wcy5uaWQ7ZGVsZXRlIGNsb25lUHJvcHMuZHJvcEZ1bmN0aW9uO2RlbGV0ZSBjbG9uZVByb3BzLmNvbnRleHQ7ZGVsZXRlIGNsb25lUHJvcHMudXBkYXRlQ29udGV4dDtkZWxldGUgY2xvbmVQcm9wcy5wYXJhbWV0ZXJzO2RlbGV0ZSBjbG9uZVByb3BzLmxpbmVEYXRhQWNjZXNzb3I7ZGVsZXRlIGNsb25lUHJvcHMuY3VzdG9tQWNjZXNzb3JzO2RlbGV0ZSBjbG9uZVByb3BzLmludGVycG9sYXRlO2RlbGV0ZSBjbG9uZVByb3BzLmZvcmNlVXBkYXRlO2RlbGV0ZSBjbG9uZVByb3BzLnNlYXJjaEl0ZXJhdGlvbnM7ZGVsZXRlIGNsb25lUHJvcHMuc2ltcGxlSW50ZXJwb2xhdGU7ZGVsZXRlIGNsb25lUHJvcHMudHJhbnNpdGlvbkR1cmF0aW9uO2lmKG1hcmtUeXBlPT09InZlcnRpY2FsYmFyIil7bWFya1R5cGU9InJlY3QiO2Nsb25lUHJvcHM9dmVydGljYWxiYXIoY2xvbmVQcm9wcyl9ZWxzZSBpZihtYXJrVHlwZT09PSJob3Jpem9udGFsYmFyIil7bWFya1R5cGU9InJlY3QiO2Nsb25lUHJvcHM9aG9yaXpvbnRhbGJhcihjbG9uZVByb3BzKX1lbHNlIGlmKG1hcmtUeXBlPT09InNpbXBsZWxpbmUiKXttYXJrVHlwZT0icGF0aCI7Y2xvbmVQcm9wcz1hcmVhTGluZShjbG9uZVByb3BzKX1pZihwcm9wcy5kcmFnZ2FibGUpe2RlbGV0ZSBjbG9uZVByb3BzLnRyYW5zZm9ybX1jbG9uZVByb3BzLmNsYXNzTmFtZT1jbGFzc05hbWU7dmFyIGFjdHVhbFNWRz1udWxsO2lmKHJlbmRlck1vZGU9PT0ic2tldGNoeSIpe2FjdHVhbFNWRz1za2V0Y2h5KG1hcmtUeXBlLGNsb25lUHJvcHMpfWVsc2UgaWYocmVuZGVyTW9kZT09PSJwYWludHkiKXthY3R1YWxTVkc9cGFpbnR5KG1hcmtUeXBlLGNsb25lUHJvcHMpfWVsc2UgaWYocmVuZGVyTW9kZT09PSJmb3JjZVBhdGgiJiZtYXJrVHlwZT09PSJjaXJjbGUiKXtjbG9uZVByb3BzLmQ9Y2lyY2xlUGF0aChjbG9uZVByb3BzLmN4fHwwLGNsb25lUHJvcHMuY3l8fDAsY2xvbmVQcm9wcy5yKTttYXJrVHlwZT0icGF0aCI7YWN0dWFsU1ZHPV9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG1hcmtUeXBlLGNsb25lUHJvcHMpfWVsc2UgaWYocmVuZGVyTW9kZT09PSJmb3JjZVBhdGgiJiZtYXJrVHlwZT09PSJyZWN0Iil7Y2xvbmVQcm9wcy5kPXJlY3RQYXRoKGNsb25lUHJvcHMueHx8MCxjbG9uZVByb3BzLnl8fDAsY2xvbmVQcm9wcy53aWR0aCxjbG9uZVByb3BzLmhlaWdodCk7bWFya1R5cGU9InBhdGgiO2FjdHVhbFNWRz1fcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChtYXJrVHlwZSxjbG9uZVByb3BzKX1lbHNle2lmKHByb3BzLm1hcmtUeXBlPT09InRleHQiJiZfdHlwZW9mJCQxKGNsb25lUHJvcHMuY2hpbGRyZW4pIT09Im9iamVjdCIpe2Nsb25lUHJvcHMuY2hpbGRyZW49X3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoInRzcGFuIixudWxsLGNsb25lUHJvcHMuY2hpbGRyZW4pfWFjdHVhbFNWRz1fcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChtYXJrVHlwZSxjbG9uZVByb3BzKX1yZXR1cm4gYWN0dWFsU1ZHfX0pO3Vud3JhcEV4cG9ydHMoZHJhd2luZyk7dmFyIGRyYXdpbmdfMT1kcmF3aW5nLmFyZWFMaW5lR2VuZXJhdG9yO3ZhciBkcmF3aW5nXzI9ZHJhd2luZy5hcmVhTGluZTt2YXIgZHJhd2luZ18zPWRyYXdpbmcudmVydGljYWxiYXI7dmFyIGRyYXdpbmdfND1kcmF3aW5nLmhvcml6b250YWxiYXI7dmFyIGRyYXdpbmdfNT1kcmF3aW5nLnBhdGhTdHI7dmFyIGRyYXdpbmdfNj1kcmF3aW5nLmNpcmNsZVBhdGg7dmFyIGRyYXdpbmdfNz1kcmF3aW5nLnJlY3RQYXRoO3ZhciBkcmF3aW5nXzg9ZHJhd2luZy5saW5lUGF0aDt2YXIgZHJhd2luZ185PWRyYXdpbmcuaml0dGVyTGluZTt2YXIgZHJhd2luZ18xMD1kcmF3aW5nLmNoZWFwU2tldGNoeTt2YXIgZHJhd2luZ18xMT1kcmF3aW5nLmNoZWFwUG9wQXJ0c3k7dmFyIGRyYXdpbmdfMTI9ZHJhd2luZy5yYW5kb21Db2xvcjt2YXIgZHJhd2luZ18xMz1kcmF3aW5nLnBhaW50eTt2YXIgZHJhd2luZ18xND1kcmF3aW5nLnNrZXRjaHk7dmFyIGRyYXdpbmdfMTU9ZHJhd2luZy5nZW5lcmF0ZVNWRzt2YXIgbWFya1RyYW5zaXRpb249Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCJfX2VzTW9kdWxlIix7dmFsdWU6dHJ1ZX0pO3ZhciBzdHlsZVRyYW5zaXRpb25XaGl0ZWxpc3Q9ZXhwb3J0cy5zdHlsZVRyYW5zaXRpb25XaGl0ZWxpc3Q9WyJzdHJva2VPcGFjaXR5IiwiZmlsbE9wYWNpdHkiLCJzdHJva2VXaWR0aCIsImZpbGwiLCJzdHJva2UiLCJvcGFjaXR5Iiwic3Ryb2tlRGFzaGFycmF5Il07dmFyIGF0dHJpYnV0ZVRyYW5zaXRpb25XaGl0ZWxpc3Q9ZXhwb3J0cy5hdHRyaWJ1dGVUcmFuc2l0aW9uV2hpdGVsaXN0PVsiZCIsImhlaWdodCIsIndpZHRoIiwidHJhbnNmb3JtIiwieCIsInkiLCJjeCIsImN5IiwieDEiLCJ4MiIsInkxIiwieTIiLCJyeCIsInJ5IiwiciJdLmNvbmNhdChzdHlsZVRyYW5zaXRpb25XaGl0ZWxpc3QpO3ZhciByZWFjdENTU05hbWVTdHlsZUhhc2g9ZXhwb3J0cy5yZWFjdENTU05hbWVTdHlsZUhhc2g9e3N0cm9rZVdpZHRoOiJzdHJva2Utd2lkdGgiLGZpbGxPcGFjaXR5OiJmaWxsLW9wYWNpdHkiLHN0cm9rZU9wYWNpdHk6InN0cm9rZS1vcGFjaXR5IixzdHJva2VEYXNoYXJyYXk6InN0cm9rZS1kYXNoYXJyYXkifTt2YXIgZGlmZmVyZW50RD1leHBvcnRzLmRpZmZlcmVudEQ9ZnVuY3Rpb24gZGlmZmVyZW50RChkLG5ld0Qpe2lmKCFkfHwhbmV3RCl7cmV0dXJuIHRydWV9dmFyIGxvd2VyRD1kLnRvTG93ZXJDYXNlKCk7dmFyIGxvd2VyTmV3RD1uZXdELnRvTG93ZXJDYXNlKCk7aWYoKGxvd2VyRC5tYXRjaCgvbS9nKXx8W10pLmxlbmd0aCE9PShsb3dlck5ld0QubWF0Y2goL20vZyl8fFtdKS5sZW5ndGgpe3JldHVybiB0cnVlfWlmKChsb3dlckQubWF0Y2goL2wvZyl8fFtdKS5sZW5ndGghPT0obG93ZXJOZXdELm1hdGNoKC9sL2cpfHxbXSkubGVuZ3RoKXtyZXR1cm4gdHJ1ZX1pZigobG93ZXJELm1hdGNoKC9jL2cpfHxbXSkubGVuZ3RoIT09KGxvd2VyTmV3RC5tYXRjaCgvYy9nKXx8W10pLmxlbmd0aCl7cmV0dXJuIHRydWV9aWYoKGxvd2VyRC5tYXRjaCgvYS9nKXx8W10pLmxlbmd0aCE9PShsb3dlck5ld0QubWF0Y2goL2EvZyl8fFtdKS5sZW5ndGgpe3JldHVybiB0cnVlfXJldHVybiBmYWxzZX19KTt1bndyYXBFeHBvcnRzKG1hcmtUcmFuc2l0aW9uKTt2YXIgbWFya1RyYW5zaXRpb25fMT1tYXJrVHJhbnNpdGlvbi5zdHlsZVRyYW5zaXRpb25XaGl0ZWxpc3Q7dmFyIG1hcmtUcmFuc2l0aW9uXzI9bWFya1RyYW5zaXRpb24uYXR0cmlidXRlVHJhbnNpdGlvbldoaXRlbGlzdDt2YXIgbWFya1RyYW5zaXRpb25fMz1tYXJrVHJhbnNpdGlvbi5yZWFjdENTU05hbWVTdHlsZUhhc2g7dmFyIG1hcmtUcmFuc2l0aW9uXzQ9bWFya1RyYW5zaXRpb24uZGlmZmVyZW50RDt2YXIgTWFya18xPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywiX19lc01vZHVsZSIse3ZhbHVlOnRydWV9KTt2YXIgX2V4dGVuZHMkJDE9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odGFyZ2V0KXtmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXt2YXIgc291cmNlPWFyZ3VtZW50c1tpXTtmb3IodmFyIGtleSBpbiBzb3VyY2Upe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2Usa2V5KSl7dGFyZ2V0W2tleV09c291cmNlW2tleV19fX1yZXR1cm4gdGFyZ2V0fTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQscHJvcHMpe2Zvcih2YXIgaT0wO2k8cHJvcHMubGVuZ3RoO2krKyl7dmFyIGRlc2NyaXB0b3I9cHJvcHNbaV07ZGVzY3JpcHRvci5lbnVtZXJhYmxlPWRlc2NyaXB0b3IuZW51bWVyYWJsZXx8ZmFsc2U7ZGVzY3JpcHRvci5jb25maWd1cmFibGU9dHJ1ZTtpZigidmFsdWUiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKX19cmV0dXJuIGZ1bmN0aW9uKENvbnN0cnVjdG9yLHByb3RvUHJvcHMsc3RhdGljUHJvcHMpe2lmKHByb3RvUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUscHJvdG9Qcm9wcyk7aWYoc3RhdGljUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3RvcixzdGF0aWNQcm9wcyk7cmV0dXJuIENvbnN0cnVjdG9yfX0oKTt2YXIgX3JlYWN0Mj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KFJlYWN0KTt2YXIgX3Byb3BUeXBlczI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChwcm9wVHlwZXMpO2Z1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKXtyZXR1cm4gb2JqJiZvYmouX19lc01vZHVsZT9vYmo6e2RlZmF1bHQ6b2JqfX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpfXJldHVybiBjYWxsJiYoKHR5cGVvZiBjYWxsPT09InVuZGVmaW5lZCI/InVuZGVmaW5lZCI6X3R5cGVvZihjYWxsKSk9PT0ib2JqZWN0Inx8dHlwZW9mIGNhbGw9PT0iZnVuY3Rpb24iKT9jYWxsOnNlbGZ9ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLHN1cGVyQ2xhc3Mpe2lmKHR5cGVvZiBzdXBlckNsYXNzIT09ImZ1bmN0aW9uIiYmc3VwZXJDbGFzcyE9PW51bGwpe3Rocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIisodHlwZW9mIHN1cGVyQ2xhc3M9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKHN1cGVyQ2xhc3MpKSl9c3ViQ2xhc3MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyYmc3VwZXJDbGFzcy5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpzdWJDbGFzcyxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9fSk7aWYoc3VwZXJDbGFzcylPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLHN1cGVyQ2xhc3MpOnN1YkNsYXNzLl9fcHJvdG9fXz1zdXBlckNsYXNzfXZhciBNYXJrPWZ1bmN0aW9uKF9SZWFjdCRDb21wb25lbnQpe19pbmhlcml0cyhNYXJrLF9SZWFjdCRDb21wb25lbnQpO2Z1bmN0aW9uIE1hcmsocHJvcHMpe19jbGFzc0NhbGxDaGVjayh0aGlzLE1hcmspO3ZhciBfdGhpcz1fcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLChNYXJrLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKE1hcmspKS5jYWxsKHRoaXMscHJvcHMpKTtfdGhpcy5fbW91c2V1cD1fdGhpcy5fbW91c2V1cC5iaW5kKF90aGlzKTtfdGhpcy5fbW91c2Vkb3duPV90aGlzLl9tb3VzZWRvd24uYmluZChfdGhpcyk7X3RoaXMuX21vdXNlbW92ZT1fdGhpcy5fbW91c2Vtb3ZlLmJpbmQoX3RoaXMpO190aGlzLnN0YXRlPXt0cmFuc2xhdGU6WzAsMF0sbW91c2VPcmlnaW46W10sdHJhbnNsYXRlT3JpZ2luOlswLDBdLGRyYWdnaW5nOmZhbHNlLHVpVXBkYXRlOmZhbHNlfTtyZXR1cm4gX3RoaXN9X2NyZWF0ZUNsYXNzKE1hcmssW3trZXk6InNob3VsZENvbXBvbmVudFVwZGF0ZSIsdmFsdWU6ZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcyl7aWYodGhpcy5wcm9wcy5tYXJrVHlwZSE9PW5leHRQcm9wcy5tYXJrVHlwZXx8dGhpcy5zdGF0ZS5kcmFnZ2luZ3x8dGhpcy5wcm9wcy5mb3JjZVVwZGF0ZXx8bmV4dFByb3BzLmZvcmNlVXBkYXRlfHx0aGlzLnByb3BzLnJlbmRlck1vZGUhPT1uZXh0UHJvcHMucmVuZGVyTW9kZXx8dGhpcy5wcm9wcy5jbGFzc05hbWUhPT1uZXh0UHJvcHMuY2xhc3NOYW1lfHx0aGlzLnByb3BzLmNoaWxkcmVuIT09bmV4dFByb3BzLmNoaWxkcmVuKXtyZXR1cm4gdHJ1ZX12YXIgbm9kZT10aGlzLm5vZGU7dmFyIGFjdHVhbFNWRz0oMCxkcmF3aW5nLmdlbmVyYXRlU1ZHKShuZXh0UHJvcHMsbmV4dFByb3BzLmNsYXNzTmFtZSk7dmFyIGNsb25lUHJvcHM9YWN0dWFsU1ZHLnByb3BzO2lmKCFjbG9uZVByb3BzKXtyZXR1cm4gdHJ1ZX12YXIgX25leHRQcm9wcyR0cmFuc2l0aW9uPW5leHRQcm9wcy50cmFuc2l0aW9uRHVyYXRpb24sdHJhbnNpdGlvbkR1cmF0aW9uPV9uZXh0UHJvcHMkdHJhbnNpdGlvbj09PXVuZGVmaW5lZD97fTpfbmV4dFByb3BzJHRyYW5zaXRpb247dmFyIGlzRGVmYXVsdD10eXBlb2YgdHJhbnNpdGlvbkR1cmF0aW9uPT09Im51bWJlciI7dmFyIGRlZmF1bHREdXJhdGlvbj1pc0RlZmF1bHQ/dHJhbnNpdGlvbkR1cmF0aW9uOjFlMzt0cmFuc2l0aW9uRHVyYXRpb249aXNEZWZhdWx0P3tkZWZhdWx0OmRlZmF1bHREdXJhdGlvbn06X2V4dGVuZHMkJDEoe2RlZmF1bHQ6ZGVmYXVsdER1cmF0aW9ufSx0cmFuc2l0aW9uRHVyYXRpb24pO21hcmtUcmFuc2l0aW9uLmF0dHJpYnV0ZVRyYW5zaXRpb25XaGl0ZWxpc3QuZm9yRWFjaChmdW5jdGlvbihhdHRyKXtpZigoMCxkM1NlbGVjdGlvbi5zZWxlY3QpKG5vZGUpLnNlbGVjdCgiKiIpLnRyYW5zaXRpb24pe2lmKGF0dHI9PT0iZCImJigwLG1hcmtUcmFuc2l0aW9uLmRpZmZlcmVudEQpKGNsb25lUHJvcHMuZCx0aGlzLnByb3BzLmQpKXsoMCxkM1NlbGVjdGlvbi5zZWxlY3QpKG5vZGUpLnNlbGVjdCgiKiIpLmF0dHIoImQiLGNsb25lUHJvcHMuZCl9ZWxzZSBpZihjbG9uZVByb3BzW2F0dHJdIT09dGhpcy5wcm9wc1thdHRyXSl7aWYobWFya1RyYW5zaXRpb24ucmVhY3RDU1NOYW1lU3R5bGVIYXNoW2F0dHJdKXthdHRyPW1hcmtUcmFuc2l0aW9uLnJlYWN0Q1NTTmFtZVN0eWxlSGFzaFthdHRyXX12YXIgX3RyYW5zaXRpb25EdXJhdGlvbj10cmFuc2l0aW9uRHVyYXRpb24sZGVmYXVsdER1cj1fdHJhbnNpdGlvbkR1cmF0aW9uLmRlZmF1bHQsX3RyYW5zaXRpb25EdXJhdGlvbiRhPV90cmFuc2l0aW9uRHVyYXRpb25bYXR0cl0sYXBwbGllZER1cmF0aW9uPV90cmFuc2l0aW9uRHVyYXRpb24kYT09PXVuZGVmaW5lZD9kZWZhdWx0RHVyOl90cmFuc2l0aW9uRHVyYXRpb24kYTsoMCxkM1NlbGVjdGlvbi5zZWxlY3QpKG5vZGUpLnNlbGVjdCgiKiIpLnRyYW5zaXRpb24oYXR0cikuZHVyYXRpb24oYXBwbGllZER1cmF0aW9uKS5hdHRyKGF0dHIsY2xvbmVQcm9wc1thdHRyXSl9fX0sdGhpcyk7aWYoY2xvbmVQcm9wcy5zdHlsZSl7bWFya1RyYW5zaXRpb24uYXR0cmlidXRlVHJhbnNpdGlvbldoaXRlbGlzdC5mb3JFYWNoKGZ1bmN0aW9uKHN0eWxlKXtpZihjbG9uZVByb3BzLnN0eWxlW3N0eWxlXSE9PXRoaXMucHJvcHMuc3R5bGVbc3R5bGVdKXt2YXIgbmV4dFZhbHVlPWNsb25lUHJvcHMuc3R5bGVbc3R5bGVdO2lmKG1hcmtUcmFuc2l0aW9uLnJlYWN0Q1NTTmFtZVN0eWxlSGFzaFtzdHlsZV0pe3N0eWxlPW1hcmtUcmFuc2l0aW9uLnJlYWN0Q1NTTmFtZVN0eWxlSGFzaFtzdHlsZV19aWYoKDAsZDNTZWxlY3Rpb24uc2VsZWN0KShub2RlKS5zZWxlY3QoIioiKS50cmFuc2l0aW9uKXt2YXIgX3RyYW5zaXRpb25EdXJhdGlvbjI9dHJhbnNpdGlvbkR1cmF0aW9uLGRlZmF1bHREdXI9X3RyYW5zaXRpb25EdXJhdGlvbjIuZGVmYXVsdCxfdHJhbnNpdGlvbkR1cmF0aW9uMiQ9X3RyYW5zaXRpb25EdXJhdGlvbjJbc3R5bGVdLGFwcGxpZWREdXJhdGlvbj1fdHJhbnNpdGlvbkR1cmF0aW9uMiQ9PT11bmRlZmluZWQ/ZGVmYXVsdER1cjpfdHJhbnNpdGlvbkR1cmF0aW9uMiQ7KDAsZDNTZWxlY3Rpb24uc2VsZWN0KShub2RlKS5zZWxlY3QoIioiKS50cmFuc2l0aW9uKHN0eWxlKS5kdXJhdGlvbihhcHBsaWVkRHVyYXRpb24pLnN0eWxlKHN0eWxlLG5leHRWYWx1ZSl9ZWxzZXsoMCxkM1NlbGVjdGlvbi5zZWxlY3QpKG5vZGUpLnNlbGVjdCgiKiIpLnN0eWxlKHN0eWxlLG5leHRWYWx1ZSl9fX0sdGhpcyl9cmV0dXJuIGZhbHNlfX0se2tleToiX21vdXNldXAiLHZhbHVlOmZ1bmN0aW9uIF9tb3VzZXVwKCl7ZG9jdW1lbnQub25tb3VzZW1vdmU9bnVsbDt2YXIgZmluYWxUcmFuc2xhdGU9WzAsMF07aWYoIXRoaXMucHJvcHMucmVzZXRBZnRlcilmaW5hbFRyYW5zbGF0ZT10aGlzLnN0YXRlLnRyYW5zbGF0ZTt0aGlzLnNldFN0YXRlKHtkcmFnZ2luZzpmYWxzZSx0cmFuc2xhdGU6ZmluYWxUcmFuc2xhdGUsdWlVcGRhdGU6ZmFsc2V9KTtpZih0aGlzLnByb3BzLmRyb3BGdW5jdGlvbiYmdGhpcy5wcm9wcy5jb250ZXh0JiZ0aGlzLnByb3BzLmNvbnRleHQuZHJhZ1NvdXJjZSl7dGhpcy5wcm9wcy5kcm9wRnVuY3Rpb24odGhpcy5wcm9wcy5jb250ZXh0LmRyYWdTb3VyY2UucHJvcHMsdGhpcy5wcm9wcyk7dGhpcy5wcm9wcy51cGRhdGVDb250ZXh0KCJkcmFnU291cmNlIix1bmRlZmluZWQpfX19LHtrZXk6Il9tb3VzZWRvd24iLHZhbHVlOmZ1bmN0aW9uIF9tb3VzZWRvd24oZXZlbnQpe3RoaXMuc2V0U3RhdGUoe21vdXNlT3JpZ2luOltldmVudC5wYWdlWCxldmVudC5wYWdlWV0sdHJhbnNsYXRlT3JpZ2luOnRoaXMuc3RhdGUudHJhbnNsYXRlLGRyYWdnaW5nOnRydWV9KTtkb2N1bWVudC5vbm1vdXNldXA9dGhpcy5fbW91c2V1cDtkb2N1bWVudC5vbm1vdXNlbW92ZT10aGlzLl9tb3VzZW1vdmV9fSx7a2V5OiJfbW91c2Vtb3ZlIix2YWx1ZTpmdW5jdGlvbiBfbW91c2Vtb3ZlKGV2ZW50KXt2YXIgeEFkanVzdD10aGlzLnByb3BzLmZyZWV6ZVg/MDoxO3ZhciB5QWRqdXN0PXRoaXMucHJvcHMuZnJlZXplWT8wOjE7dmFyIGFkanVzdGVkUG9zaXRpb249W2V2ZW50LnBhZ2VYLXRoaXMuc3RhdGUubW91c2VPcmlnaW5bMF0sZXZlbnQucGFnZVktdGhpcy5zdGF0ZS5tb3VzZU9yaWdpblsxXV07dmFyIGFkanVzdGVkVHJhbnNsYXRlPVsoYWRqdXN0ZWRQb3NpdGlvblswXSt0aGlzLnN0YXRlLnRyYW5zbGF0ZU9yaWdpblswXSkqeEFkanVzdCwoYWRqdXN0ZWRQb3NpdGlvblsxXSt0aGlzLnN0YXRlLnRyYW5zbGF0ZU9yaWdpblsxXSkqeUFkanVzdF07aWYodGhpcy5wcm9wcy5kcm9wRnVuY3Rpb24mJnRoaXMuc3RhdGUudWlVcGRhdGU9PT1mYWxzZSl7dGhpcy5wcm9wcy51cGRhdGVDb250ZXh0KCJkcmFnU291cmNlIix0aGlzKTt0aGlzLnNldFN0YXRlKHt0cmFuc2xhdGU6YWRqdXN0ZWRUcmFuc2xhdGUsdWlVcGRhdGU6dHJ1ZSxkcmFnZ2luZzp0cnVlfSl9ZWxzZXt0aGlzLnNldFN0YXRlKHt0cmFuc2xhdGU6YWRqdXN0ZWRUcmFuc2xhdGV9KX19fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3ZhciBfdGhpczI9dGhpczt2YXIgY2xhc3NOYW1lPXRoaXMucHJvcHMuY2xhc3NOYW1lfHwiIjt2YXIgbW91c2VJbj1udWxsO3ZhciBtb3VzZU91dD1udWxsO3ZhciBhY3R1YWxTVkc9KDAsZHJhd2luZy5nZW5lcmF0ZVNWRykodGhpcy5wcm9wcyxjbGFzc05hbWUpO2lmKHRoaXMucHJvcHMuZHJhZ2dhYmxlKXtyZXR1cm4gX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoImciLHtyZWY6ZnVuY3Rpb24gcmVmKG5vZGUpe3JldHVybiBfdGhpczIubm9kZT1ub2RlfSxjbGFzc05hbWU6Y2xhc3NOYW1lLG9uTW91c2VFbnRlcjptb3VzZUluLG9uTW91c2VPdXQ6bW91c2VPdXQsb25Eb3VibGVDbGljazp0aGlzLl9kb3VibGVjbGljayxzdHlsZTp7cG9pbnRlckV2ZW50czp0aGlzLnByb3BzLmRyb3BGdW5jdGlvbiYmdGhpcy5zdGF0ZS5kcmFnZ2luZz8ibm9uZSI6ImFsbCJ9LG9uTW91c2VEb3duOnRoaXMuX21vdXNlZG93bixvbk1vdXNlVXA6dGhpcy5fbW91c2V1cCx0cmFuc2Zvcm06InRyYW5zbGF0ZSgiK3RoaXMuc3RhdGUudHJhbnNsYXRlKyIpIn0sYWN0dWFsU1ZHKX1lbHNle3JldHVybiBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgiZyIse3JlZjpmdW5jdGlvbiByZWYobm9kZSl7cmV0dXJuIF90aGlzMi5ub2RlPW5vZGV9LGNsYXNzTmFtZTpjbGFzc05hbWUsb25Nb3VzZUVudGVyOm1vdXNlSW4sb25Nb3VzZU91dDptb3VzZU91dH0sYWN0dWFsU1ZHKX19fV0pO3JldHVybiBNYXJrfShfcmVhY3QyLmRlZmF1bHQuQ29tcG9uZW50KTtNYXJrLnByb3BUeXBlcz17bWFya1R5cGU6X3Byb3BUeXBlczIuZGVmYXVsdC5zdHJpbmcuaXNSZXF1aXJlZCxmb3JjZVVwZGF0ZTpfcHJvcFR5cGVzMi5kZWZhdWx0LmJvb2wscmVuZGVyTW9kZTpfcHJvcFR5cGVzMi5kZWZhdWx0Lm9uZU9mVHlwZShbX3Byb3BUeXBlczIuZGVmYXVsdC5zdHJpbmcsX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jXSksZHJhZ2dhYmxlOl9wcm9wVHlwZXMyLmRlZmF1bHQuYm9vbCxkcm9wRnVuY3Rpb246X3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jLHJlc2V0QWZ0ZXI6X3Byb3BUeXBlczIuZGVmYXVsdC5ib29sLGZyZWV6ZVg6X3Byb3BUeXBlczIuZGVmYXVsdC5ib29sLGZyZWV6ZVk6X3Byb3BUeXBlczIuZGVmYXVsdC5ib29sLGNvbnRleHQ6X3Byb3BUeXBlczIuZGVmYXVsdC5vYmplY3QsdXBkYXRlQ29udGV4dDpfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMsY2xhc3NOYW1lOl9wcm9wVHlwZXMyLmRlZmF1bHQuc3RyaW5nfTtleHBvcnRzLmRlZmF1bHQ9TWFyazttb2R1bGUuZXhwb3J0cz1leHBvcnRzWyJkZWZhdWx0Il19KTt1bndyYXBFeHBvcnRzKE1hcmtfMSk7dmFyIERyYWdnYWJsZU1hcmtfMT1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTp0cnVlfSk7dmFyIF9leHRlbmRzJCQxPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHRhcmdldCl7Zm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIHNvdXJjZT1hcmd1bWVudHNbaV07Zm9yKHZhciBrZXkgaW4gc291cmNlKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkpe3RhcmdldFtrZXldPXNvdXJjZVtrZXldfX19cmV0dXJuIHRhcmdldH07dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoInZhbHVlImluIGRlc2NyaXB0b3IpZGVzY3JpcHRvci53cml0YWJsZT10cnVlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsZGVzY3JpcHRvci5rZXksZGVzY3JpcHRvcil9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcn19KCk7dmFyIF9yZWFjdDI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChSZWFjdCk7dmFyIF9NYXJrMj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KE1hcmtfMSk7dmFyIF9wcm9wVHlwZXMyPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQocHJvcFR5cGVzKTtmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iail7cmV0dXJuIG9iaiYmb2JqLl9fZXNNb2R1bGU/b2JqOntkZWZhdWx0Om9ian19ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLENvbnN0cnVjdG9yKXtpZighKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX19ZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZixjYWxsKXtpZighc2VsZil7dGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKX1yZXR1cm4gY2FsbCYmKCh0eXBlb2YgY2FsbD09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2YoY2FsbCkpPT09Im9iamVjdCJ8fHR5cGVvZiBjYWxsPT09ImZ1bmN0aW9uIik/Y2FsbDpzZWxmfWZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcyxzdXBlckNsYXNzKXtpZih0eXBlb2Ygc3VwZXJDbGFzcyE9PSJmdW5jdGlvbiImJnN1cGVyQ2xhc3MhPT1udWxsKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrKHR5cGVvZiBzdXBlckNsYXNzPT09InVuZGVmaW5lZCI/InVuZGVmaW5lZCI6X3R5cGVvZihzdXBlckNsYXNzKSkpfXN1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MmJnN1cGVyQ2xhc3MucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6c3ViQ2xhc3MsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfX0pO2lmKHN1cGVyQ2xhc3MpT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcyxzdXBlckNsYXNzKTpzdWJDbGFzcy5fX3Byb3RvX189c3VwZXJDbGFzc312YXIgRHJhZ2dhYmxlTWFyaz1mdW5jdGlvbihfUmVhY3QkQ29tcG9uZW50KXtfaW5oZXJpdHMoRHJhZ2dhYmxlTWFyayxfUmVhY3QkQ29tcG9uZW50KTtmdW5jdGlvbiBEcmFnZ2FibGVNYXJrKCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsRHJhZ2dhYmxlTWFyayk7cmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKERyYWdnYWJsZU1hcmsuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoRHJhZ2dhYmxlTWFyaykpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9X2NyZWF0ZUNsYXNzKERyYWdnYWJsZU1hcmssW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyKCl7cmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF9NYXJrMi5kZWZhdWx0LF9leHRlbmRzJCQxKHtkcmFnZ2FibGU6dHJ1ZSxyZXNldEFmdGVyOnRydWUsZHJvcHBhYmxlOnRydWV9LHRoaXMucHJvcHMpKX19XSk7cmV0dXJuIERyYWdnYWJsZU1hcmt9KF9yZWFjdDIuZGVmYXVsdC5Db21wb25lbnQpO0RyYWdnYWJsZU1hcmsucHJvcFR5cGVzPXtkcmFnZ2FibGU6X3Byb3BUeXBlczIuZGVmYXVsdC5ib29sLHJlc2V0QWZ0ZXI6X3Byb3BUeXBlczIuZGVmYXVsdC5ib29sLGRyb3BwYWJsZTpfcHJvcFR5cGVzMi5kZWZhdWx0LmJvb2x9O2V4cG9ydHMuZGVmYXVsdD1EcmFnZ2FibGVNYXJrO21vZHVsZS5leHBvcnRzPWV4cG9ydHNbImRlZmF1bHQiXX0pO3Vud3JhcEV4cG9ydHMoRHJhZ2dhYmxlTWFya18xKTt2YXIgTWFya0NvbnRleHRfMT1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTp0cnVlfSk7dmFyIF90eXBlb2YkJDE9dHlwZW9mIFN5bWJvbD09PSJmdW5jdGlvbiImJl90eXBlb2YoU3ltYm9sLml0ZXJhdG9yKT09PSJzeW1ib2wiP2Z1bmN0aW9uKG9iail7cmV0dXJuIHR5cGVvZiBvYmo9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKG9iail9OmZ1bmN0aW9uKG9iail7cmV0dXJuIG9iaiYmdHlwZW9mIFN5bWJvbD09PSJmdW5jdGlvbiImJm9iai5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmb2JqIT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2Ygb2JqPT09InVuZGVmaW5lZCI/InVuZGVmaW5lZCI6X3R5cGVvZihvYmopfTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQscHJvcHMpe2Zvcih2YXIgaT0wO2k8cHJvcHMubGVuZ3RoO2krKyl7dmFyIGRlc2NyaXB0b3I9cHJvcHNbaV07ZGVzY3JpcHRvci5lbnVtZXJhYmxlPWRlc2NyaXB0b3IuZW51bWVyYWJsZXx8ZmFsc2U7ZGVzY3JpcHRvci5jb25maWd1cmFibGU9dHJ1ZTtpZigidmFsdWUiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKX19cmV0dXJuIGZ1bmN0aW9uKENvbnN0cnVjdG9yLHByb3RvUHJvcHMsc3RhdGljUHJvcHMpe2lmKHByb3RvUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUscHJvdG9Qcm9wcyk7aWYoc3RhdGljUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3RvcixzdGF0aWNQcm9wcyk7cmV0dXJuIENvbnN0cnVjdG9yfX0oKTt2YXIgX3JlYWN0Mj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KFJlYWN0KTt2YXIgX3Byb3BUeXBlczI9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChwcm9wVHlwZXMpO2Z1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKXtyZXR1cm4gb2JqJiZvYmouX19lc01vZHVsZT9vYmo6e2RlZmF1bHQ6b2JqfX1mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpfXJldHVybiBjYWxsJiYoKHR5cGVvZiBjYWxsPT09InVuZGVmaW5lZCI/InVuZGVmaW5lZCI6X3R5cGVvZihjYWxsKSk9PT0ib2JqZWN0Inx8dHlwZW9mIGNhbGw9PT0iZnVuY3Rpb24iKT9jYWxsOnNlbGZ9ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLHN1cGVyQ2xhc3Mpe2lmKHR5cGVvZiBzdXBlckNsYXNzIT09ImZ1bmN0aW9uIiYmc3VwZXJDbGFzcyE9PW51bGwpe3Rocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIisodHlwZW9mIHN1cGVyQ2xhc3M9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKHN1cGVyQ2xhc3MpKSl9c3ViQ2xhc3MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyYmc3VwZXJDbGFzcy5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpzdWJDbGFzcyxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9fSk7aWYoc3VwZXJDbGFzcylPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLHN1cGVyQ2xhc3MpOnN1YkNsYXNzLl9fcHJvdG9fXz1zdXBlckNsYXNzfXZhciBNYXJrQ29udGV4dD1mdW5jdGlvbihfUmVhY3QkQ29tcG9uZW50KXtfaW5oZXJpdHMoTWFya0NvbnRleHQsX1JlYWN0JENvbXBvbmVudCk7ZnVuY3Rpb24gTWFya0NvbnRleHQocHJvcHMpe19jbGFzc0NhbGxDaGVjayh0aGlzLE1hcmtDb250ZXh0KTt2YXIgX3RoaXM9X3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywoTWFya0NvbnRleHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoTWFya0NvbnRleHQpKS5jYWxsKHRoaXMscHJvcHMpKTtfdGhpcy5tYXBFbGVtZW50cz1fdGhpcy5tYXBFbGVtZW50cy5iaW5kKF90aGlzKTtfdGhpcy5zaG91bGRDb21wb25lbnRVcGRhdGU9X3RoaXMuc2hvdWxkQ29tcG9uZW50VXBkYXRlLmJpbmQoX3RoaXMpO190aGlzLnVwZGF0ZUNvbnRleHQ9X3RoaXMudXBkYXRlQ29udGV4dC5iaW5kKF90aGlzKTtfdGhpcy5zdGF0ZT17Y29udGV4dDp7fX07cmV0dXJuIF90aGlzfV9jcmVhdGVDbGFzcyhNYXJrQ29udGV4dCxbe2tleToibWFwRWxlbWVudHMiLHZhbHVlOmZ1bmN0aW9uIG1hcEVsZW1lbnRzKGVsZW1lbnQsZWkpe2lmKCFlbGVtZW50KXJldHVybiBudWxsO3ZhciBwcm9wcz17a2V5OiJtYy1tYXJrLSIrZWl9O2lmKHR5cGVvZiBlbGVtZW50LnR5cGUhPT0ic3RyaW5nIil7cHJvcHMuY29udGV4dD10aGlzLnN0YXRlLmNvbnRleHQ7cHJvcHMudXBkYXRlQ29udGV4dD10aGlzLnVwZGF0ZUNvbnRleHR9aWYoQXJyYXkuaXNBcnJheShlbGVtZW50KSlyZXR1cm4gZWxlbWVudC5tYXAodGhpcy5tYXBFbGVtZW50cyk7cmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jbG9uZUVsZW1lbnQoZWxlbWVudCxwcm9wcyl9fSx7a2V5OiJzaG91bGRDb21wb25lbnRVcGRhdGUiLHZhbHVlOmZ1bmN0aW9uIHNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMpe2lmKHRoaXMucHJvcHMueHlGcmFtZUNoaWxkcmVuJiZ0aGlzLnByb3BzLnJlbmRlck51bWJlcj09PW5leHRQcm9wcy5yZW5kZXJOdW1iZXIpe3JldHVybiBmYWxzZX1yZXR1cm4gdHJ1ZX19LHtrZXk6InVwZGF0ZUNvbnRleHQiLHZhbHVlOmZ1bmN0aW9uIHVwZGF0ZUNvbnRleHQocHJvcCx2YWx1ZSl7dmFyIGN1cnJlbnRDb250ZXh0PXRoaXMuc3RhdGUuY29udGV4dDtjdXJyZW50Q29udGV4dFtwcm9wXT12YWx1ZTt0aGlzLnNldFN0YXRlKHtjb250ZXh0OmN1cnJlbnRDb250ZXh0fSl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3ZhciBlbGVtZW50cz1udWxsO2lmKEFycmF5LmlzQXJyYXkodGhpcy5wcm9wcy5jaGlsZHJlbikpZWxlbWVudHM9dGhpcy5wcm9wcy5jaGlsZHJlbi5tYXAodGhpcy5tYXBFbGVtZW50cyk7ZWxzZSBpZihfdHlwZW9mJCQxKHRoaXMucHJvcHMuY2hpbGRyZW4pPT09Im9iamVjdCIpZWxlbWVudHM9dGhpcy5tYXBFbGVtZW50cyh0aGlzLnByb3BzLmNoaWxkcmVuKTt2YXIgdHJhbnNmb3JtPVswLDBdO3RyYW5zZm9ybVswXT10aGlzLnByb3BzLnBvc2l0aW9uP3RoaXMucHJvcHMucG9zaXRpb25bMF06MDt0cmFuc2Zvcm1bMV09dGhpcy5wcm9wcy5wb3NpdGlvbj90aGlzLnByb3BzLnBvc2l0aW9uWzFdOjA7cmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCJnIix7dHJhbnNmb3JtOiJ0cmFuc2xhdGUoIit0cmFuc2Zvcm0udG9TdHJpbmcoKSsiKSJ9LGVsZW1lbnRzKX19XSk7cmV0dXJuIE1hcmtDb250ZXh0fShfcmVhY3QyLmRlZmF1bHQuQ29tcG9uZW50KTtNYXJrQ29udGV4dC5wcm9wVHlwZXM9e3Bvc2l0aW9uOl9wcm9wVHlwZXMyLmRlZmF1bHQuYXJyYXkseHlGcmFtZUNoaWxkcmVuOl9wcm9wVHlwZXMyLmRlZmF1bHQuYm9vbCxyZW5kZXJOdW1iZXI6X3Byb3BUeXBlczIuZGVmYXVsdC5udW1iZXJ9O2V4cG9ydHMuZGVmYXVsdD1NYXJrQ29udGV4dDttb2R1bGUuZXhwb3J0cz1leHBvcnRzWyJkZWZhdWx0Il19KTt1bndyYXBFeHBvcnRzKE1hcmtDb250ZXh0XzEpO3ZhciBsaWIkMT1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihtb2R1bGUsZXhwb3J0cyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTp0cnVlfSk7ZXhwb3J0cy5NYXJrQ29udGV4dD1leHBvcnRzLk1hcms9ZXhwb3J0cy5EcmFnZ2FibGVNYXJrPXVuZGVmaW5lZDt2YXIgX01hcmsyPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoTWFya18xKTt2YXIgX0RyYWdnYWJsZU1hcmsyPV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoRHJhZ2dhYmxlTWFya18xKTt2YXIgX01hcmtDb250ZXh0Mj1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KE1hcmtDb250ZXh0XzEpO2Z1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKXtyZXR1cm4gb2JqJiZvYmouX19lc01vZHVsZT9vYmo6e2RlZmF1bHQ6b2JqfX1leHBvcnRzLmRlZmF1bHQ9e0RyYWdnYWJsZU1hcms6X0RyYWdnYWJsZU1hcmsyLmRlZmF1bHQsTWFyazpfTWFyazIuZGVmYXVsdCxNYXJrQ29udGV4dDpfTWFya0NvbnRleHQyLmRlZmF1bHR9O2V4cG9ydHMuRHJhZ2dhYmxlTWFyaz1fRHJhZ2dhYmxlTWFyazIuZGVmYXVsdDtleHBvcnRzLk1hcms9X01hcmsyLmRlZmF1bHQ7ZXhwb3J0cy5NYXJrQ29udGV4dD1fTWFya0NvbnRleHQyLmRlZmF1bHR9KTt1bndyYXBFeHBvcnRzKGxpYiQxKTt2YXIgbGliXzEkMT1saWIkMS5NYXJrQ29udGV4dDt2YXIgbGliXzIkMT1saWIkMS5NYXJrO3ZhciBsaWJfMyQxPWxpYiQxLkRyYWdnYWJsZU1hcms7dmFyIERpdmlkZWRMaW5lPWZ1bmN0aW9uKF9SZWFjdCRDb21wb25lbnQpe2luaGVyaXRzKERpdmlkZWRMaW5lLF9SZWFjdCRDb21wb25lbnQpO2Z1bmN0aW9uIERpdmlkZWRMaW5lKHByb3BzKXtjbGFzc0NhbGxDaGVjayh0aGlzLERpdmlkZWRMaW5lKTt2YXIgX3RoaXM9cG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLChEaXZpZGVkTGluZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihEaXZpZGVkTGluZSkpLmNhbGwodGhpcyxwcm9wcykpO190aGlzLmNyZWF0ZUxpbmVTZWdtZW50cz1fdGhpcy5jcmVhdGVMaW5lU2VnbWVudHMuYmluZChfdGhpcyk7cmV0dXJuIF90aGlzfWNyZWF0ZUNsYXNzKERpdmlkZWRMaW5lLFt7a2V5OiJjcmVhdGVMaW5lU2VnbWVudHMiLHZhbHVlOmZ1bmN0aW9uIGNyZWF0ZUxpbmVTZWdtZW50cygpe3ZhciBfdGhpczI9dGhpczt2YXIgcGFyYW1zPXRoaXMucHJvcHMucGFyYW1ldGVyczt2YXIgY2xhc3NOYW1lPXRoaXMucHJvcHMuY2xhc3NOYW1lO3ZhciBpbnRlcnBvbGF0ZT10aGlzLnByb3BzLmludGVycG9sYXRlfHxjdXJ2ZUxpbmVhcjt2YXIgZGF0YT1wcm9qZWN0TGluZURhdGEoe2RhdGE6dGhpcy5wcm9wcy5kYXRhLGxpbmVEYXRhQWNjZXNzb3I6dGhpcy5wcm9wcy5saW5lRGF0YUFjY2Vzc29yLHhQcm9wOiJfeCIseVByb3A6Il95Iix4QWNjZXNzb3I6dGhpcy5wcm9wcy5jdXN0b21BY2Nlc3NvcnMueCx5QWNjZXNzb3I6dGhpcy5wcm9wcy5jdXN0b21BY2Nlc3NvcnMueX0pO3ZhciBsaW5lcz1kaXZpZGVkTGluZShwYXJhbXMsZGF0YVswXS5kYXRhLHRoaXMucHJvcHMuc2VhcmNoSXRlcmF0aW9ucyk7dmFyIGxpbmVSZW5kZXI9bGluZSgpLmN1cnZlKGludGVycG9sYXRlKS54KGZ1bmN0aW9uKGQpe3JldHVybiBkLl94fSkueShmdW5jdGlvbihkKXtyZXR1cm4gZC5feX0pO3JldHVybiBsaW5lcy5tYXAoZnVuY3Rpb24oZCxpKXtyZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChsaWJfMiQxLF9leHRlbmRzKHt9LF90aGlzMi5wcm9wcyx7Y2xhc3NOYW1lOmNsYXNzTmFtZSxtYXJrVHlwZToicGF0aCIsa2V5OiJEaXZpZGVkTGluZSIraSxzdHlsZTpkLmtleSxkOmxpbmVSZW5kZXIoZC5wb2ludHMpfSkpfSl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3ZhciBsaW5lcz10aGlzLmNyZWF0ZUxpbmVTZWdtZW50cygpO3JldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KCJnIixudWxsLGxpbmVzKX19XSk7cmV0dXJuIERpdmlkZWRMaW5lfShSZWFjdC5Db21wb25lbnQpO0RpdmlkZWRMaW5lLnByb3BUeXBlcz17cGFyYW1ldGVyczpwcm9wVHlwZXMuZnVuYyxjbGFzc05hbWU6cHJvcFR5cGVzLnN0cmluZyxpbnRlcnBvbGF0ZTpwcm9wVHlwZXMuZnVuYyxkYXRhOnByb3BUeXBlcy5vbmVPZlR5cGUoW3Byb3BUeXBlcy5hcnJheSxwcm9wVHlwZXMub2JqZWN0XSksbGluZURhdGFBY2Nlc3Nvcjpwcm9wVHlwZXMuZnVuYyxjdXN0b21BY2Nlc3NvcnM6cHJvcFR5cGVzLm9iamVjdCxzZWFyY2hJdGVyYXRpb25zOnByb3BUeXBlcy5udW1iZXJ9O3ZhciBkZWZhdWx0VGlja0xpbmVHZW5lcmF0b3I9ZnVuY3Rpb24gZGVmYXVsdFRpY2tMaW5lR2VuZXJhdG9yKF9yZWYpe3ZhciB4eT1fcmVmLnh5LG9yaWVudD1fcmVmLm9yaWVudCxpPV9yZWYuaTtyZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChsaWJfMiQxLHtrZXk6aSxtYXJrVHlwZToicGF0aCIscmVuZGVyTW9kZTp4eS5yZW5kZXJNb2RlLHN0cm9rZToiYmxhY2siLHN0cm9rZVdpZHRoOiIxcHgiLHNpbXBsZUludGVycG9sYXRlOnRydWUsZDoiTSIreHkueDErIiwiK3h5LnkxKyJMIit4eS54MisiLCIreHkueTIsY2xhc3NOYW1lOiJ0aWNrLWxpbmUgdGljayAiK29yaWVudH0pfTtmdW5jdGlvbiBheGlzUGllY2VzKF9yZWYyKXt2YXIgX3JlZjIkcmVuZGVyTW9kZT1fcmVmMi5yZW5kZXJNb2RlLHJlbmRlck1vZGU9X3JlZjIkcmVuZGVyTW9kZT09PXVuZGVmaW5lZD9mdW5jdGlvbigpe3JldHVybiB1bmRlZmluZWR9Ol9yZWYyJHJlbmRlck1vZGUsX3JlZjIkcGFkZGluZz1fcmVmMi5wYWRkaW5nLHBhZGRpbmc9X3JlZjIkcGFkZGluZz09PXVuZGVmaW5lZD81Ol9yZWYyJHBhZGRpbmcsdGlja1ZhbHVlcz1fcmVmMi50aWNrVmFsdWVzLHNjYWxlPV9yZWYyLnNjYWxlLHRpY2tzPV9yZWYyLnRpY2tzLF9yZWYyJG9yaWVudD1fcmVmMi5vcmllbnQsb3JpZW50PV9yZWYyJG9yaWVudD09PXVuZGVmaW5lZD8ibGVmdCI6X3JlZjIkb3JpZW50LHNpemU9X3JlZjIuc2l6ZSxfcmVmMiRtYXJnaW49X3JlZjIubWFyZ2luLG1hcmdpbj1fcmVmMiRtYXJnaW49PT11bmRlZmluZWQ/e2xlZnQ6MCxyaWdodDowLHRvcDowLGJvdHRvbTowfTpfcmVmMiRtYXJnaW4sX3JlZjIkZm9vdGVyPV9yZWYyLmZvb3Rlcixmb290ZXI9X3JlZjIkZm9vdGVyPT09dW5kZWZpbmVkP2ZhbHNlOl9yZWYyJGZvb3RlcixfcmVmMiR0aWNrU2l6ZT1fcmVmMi50aWNrU2l6ZSx0aWNrU2l6ZT1fcmVmMiR0aWNrU2l6ZT09PXVuZGVmaW5lZD9mb290ZXI/LTEwOlsidG9wIiwiYm90dG9tIl0uZmluZChmdW5jdGlvbihkKXtyZXR1cm4gZD09PW9yaWVudH0pP3NpemVbMV06c2l6ZVswXTpfcmVmMiR0aWNrU2l6ZTt2YXIgYXhpc0RvbWFpbj1bXSxwb3NpdGlvbjE9dm9pZCAwLHBvc2l0aW9uMj12b2lkIDAsZG9tYWluMT12b2lkIDAsZG9tYWluMj12b2lkIDAsdHBvc2l0aW9uMT12b2lkIDAsdHBvc2l0aW9uMj12b2lkIDAsdGV4dFBvc2l0aW9uTW9kPTAsdGV4dFBvc2l0aW9uTW9kMj0wLGRlZmF1bHRBbmNob3I9Im1pZGRsZSI7c3dpdGNoKG9yaWVudCl7Y2FzZSJ0b3AiOnBvc2l0aW9uMT0ieDEiO3Bvc2l0aW9uMj0ieDIiO2RvbWFpbjE9InkxIjtkb21haW4yPSJ5MiI7YXhpc0RvbWFpbj1bbWFyZ2luLnRvcCx0aWNrU2l6ZSttYXJnaW4udG9wXTt0cG9zaXRpb24xPSJ0eCI7dHBvc2l0aW9uMj0idHkiO3RleHRQb3NpdGlvbk1vZC09MjAtcGFkZGluZzticmVhaztjYXNlImJvdHRvbSI6cG9zaXRpb24xPSJ4MSI7cG9zaXRpb24yPSJ4MiI7ZG9tYWluMT0ieTIiO2RvbWFpbjI9InkxIjtheGlzRG9tYWluPVtzaXplWzFdK21hcmdpbi50b3Asc2l6ZVsxXSttYXJnaW4udG9wLXRpY2tTaXplXTt0cG9zaXRpb24xPSJ0eCI7dHBvc2l0aW9uMj0idHkiO3RleHRQb3NpdGlvbk1vZCs9MjArcGFkZGluZzticmVhaztjYXNlInJpZ2h0Ijpwb3NpdGlvbjE9InkyIjtwb3NpdGlvbjI9InkxIjtkb21haW4xPSJ4MiI7ZG9tYWluMj0ieDEiO2F4aXNEb21haW49W3NpemVbMF0rbWFyZ2luLmxlZnQsc2l6ZVswXSttYXJnaW4ubGVmdC10aWNrU2l6ZV07dHBvc2l0aW9uMT0idHkiO3Rwb3NpdGlvbjI9InR4Ijt0ZXh0UG9zaXRpb25Nb2QrPTUrcGFkZGluZzt0ZXh0UG9zaXRpb25Nb2QyKz01O2RlZmF1bHRBbmNob3I9InN0YXJ0IjticmVhaztkZWZhdWx0OnBvc2l0aW9uMT0ieTEiO3Bvc2l0aW9uMj0ieTIiO2RvbWFpbjE9IngxIjtkb21haW4yPSJ4MiI7YXhpc0RvbWFpbj1bbWFyZ2luLmxlZnQsdGlja1NpemUrbWFyZ2luLmxlZnRdO3Rwb3NpdGlvbjE9InR5Ijt0cG9zaXRpb24yPSJ0eCI7dGV4dFBvc2l0aW9uTW9kLT01K3BhZGRpbmc7dGV4dFBvc2l0aW9uTW9kMis9NTtkZWZhdWx0QW5jaG9yPSJlbmQiO2JyZWFrfXZhciBheGlzU2l6ZT1NYXRoLmFicyhzY2FsZS5yYW5nZSgpWzFdLXNjYWxlLnJhbmdlKClbMF0pO2lmKCF0aWNrVmFsdWVzKXtpZighdGlja3Mpe3RpY2tzPU1hdGgubWF4KDEscGFyc2VJbnQoYXhpc1NpemUvNDAsMTApKX10aWNrVmFsdWVzPXNjYWxlLnRpY2tzKHRpY2tzKX1yZXR1cm4gdGlja1ZhbHVlcy5tYXAoZnVuY3Rpb24odGljayxpKXt2YXIgX3JlZjM7dmFyIHRpY2tQb3NpdGlvbj1zY2FsZSh0aWNrKTtyZXR1cm4gX3JlZjM9e30sZGVmaW5lUHJvcGVydHkoX3JlZjMscG9zaXRpb24xLHRpY2tQb3NpdGlvbiksZGVmaW5lUHJvcGVydHkoX3JlZjMscG9zaXRpb24yLHRpY2tQb3NpdGlvbiksZGVmaW5lUHJvcGVydHkoX3JlZjMsZG9tYWluMSxheGlzRG9tYWluWzBdKSxkZWZpbmVQcm9wZXJ0eShfcmVmMyxkb21haW4yLGF4aXNEb21haW5bMV0pLGRlZmluZVByb3BlcnR5KF9yZWYzLHRwb3NpdGlvbjEsdGlja1Bvc2l0aW9uK3RleHRQb3NpdGlvbk1vZDIpLGRlZmluZVByb3BlcnR5KF9yZWYzLHRwb3NpdGlvbjIsYXhpc0RvbWFpblswXSt0ZXh0UG9zaXRpb25Nb2QpLGRlZmluZVByb3BlcnR5KF9yZWYzLCJkZWZhdWx0QW5jaG9yIixkZWZhdWx0QW5jaG9yKSxkZWZpbmVQcm9wZXJ0eShfcmVmMywicmVuZGVyTW9kZSIscmVuZGVyTW9kZSh0aWNrLGkpKSxkZWZpbmVQcm9wZXJ0eShfcmVmMywidmFsdWUiLHRpY2spLF9yZWYzfSl9dmFyIGF4aXNMYWJlbHM9ZnVuY3Rpb24gYXhpc0xhYmVscyhfcmVmNCl7dmFyIGF4aXNQYXJ0cz1fcmVmNC5heGlzUGFydHMsb3JpZW50PV9yZWY0Lm9yaWVudCx0aWNrRm9ybWF0PV9yZWY0LnRpY2tGb3JtYXQsX3JlZjQkcm90YXRlPV9yZWY0LnJvdGF0ZSxyb3RhdGU9X3JlZjQkcm90YXRlPT09dW5kZWZpbmVkPzA6X3JlZjQkcm90YXRlO3JldHVybiBheGlzUGFydHMubWFwKGZ1bmN0aW9uKGF4aXNQYXJ0LGkpe3ZhciByZW5kZXJlZFZhbHVlPXRpY2tGb3JtYXQoYXhpc1BhcnQudmFsdWUpO2lmKCh0eXBlb2YgcmVuZGVyZWRWYWx1ZT09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2YocmVuZGVyZWRWYWx1ZSkpIT09Im9iamVjdCJ8fHJlbmRlcmVkVmFsdWUgaW5zdGFuY2VvZiBEYXRlKXtyZW5kZXJlZFZhbHVlPVJlYWN0LmNyZWF0ZUVsZW1lbnQoInRleHQiLHt0ZXh0QW5jaG9yOmF4aXNQYXJ0LmRlZmF1bHRBbmNob3J9LHJlbmRlcmVkVmFsdWUudG9TdHJpbmc/cmVuZGVyZWRWYWx1ZS50b1N0cmluZygpOnJlbmRlcmVkVmFsdWUpfXJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KCJnIix7a2V5OmkscG9pbnRlckV2ZW50czoibm9uZSIsdHJhbnNmb3JtOiJ0cmFuc2xhdGUoIitheGlzUGFydC50eCsiLCIrYXhpc1BhcnQudHkrIilyb3RhdGUoIityb3RhdGUrIikifSxyZW5kZXJlZFZhbHVlKX0pfTt2YXIgYXhpc0xpbmVzPWZ1bmN0aW9uIGF4aXNMaW5lcyhfcmVmNSl7dmFyIGF4aXNQYXJ0cz1fcmVmNS5heGlzUGFydHMsb3JpZW50PV9yZWY1Lm9yaWVudCxfcmVmNSR0aWNrTGluZUdlbmVyYXQ9X3JlZjUudGlja0xpbmVHZW5lcmF0b3IsdGlja0xpbmVHZW5lcmF0b3I9X3JlZjUkdGlja0xpbmVHZW5lcmF0PT09dW5kZWZpbmVkP2RlZmF1bHRUaWNrTGluZUdlbmVyYXRvcjpfcmVmNSR0aWNrTGluZUdlbmVyYXQ7cmV0dXJuIGF4aXNQYXJ0cy5tYXAoZnVuY3Rpb24oYXhpc1BhcnQsaSl7cmV0dXJuIHRpY2tMaW5lR2VuZXJhdG9yKHt4eTpheGlzUGFydCxvcmllbnQ6b3JpZW50LGk6aX0pfSl9O2Z1bmN0aW9uIGZvcm1hdFZhbHVlKHZhbHVlLHByb3BzKXtpZihwcm9wcy50aWNrRm9ybWF0KXtyZXR1cm4gcHJvcHMudGlja0Zvcm1hdCh2YWx1ZSl9aWYodmFsdWUudG9TdHJpbmcpe3JldHVybiB2YWx1ZS50b1N0cmluZygpfXJldHVybiB2YWx1ZX12YXIgQXhpcz1mdW5jdGlvbihfUmVhY3QkQ29tcG9uZW50KXtpbmhlcml0cyhBeGlzLF9SZWFjdCRDb21wb25lbnQpO2Z1bmN0aW9uIEF4aXMocHJvcHMpe2NsYXNzQ2FsbENoZWNrKHRoaXMsQXhpcyk7dmFyIF90aGlzPXBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywoQXhpcy5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihBeGlzKSkuY2FsbCh0aGlzLHByb3BzKSk7X3RoaXMuc3RhdGU9e2hvdmVyQW5ub3RhdGlvbjowfTtyZXR1cm4gX3RoaXN9Y3JlYXRlQ2xhc3MoQXhpcyxbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbiByZW5kZXIoKXt2YXIgX3RoaXMyPXRoaXM7dmFyIHBvc2l0aW9uPXRoaXMucHJvcHMucG9zaXRpb258fFswLDBdO3ZhciBfcHJvcHM9dGhpcy5wcm9wcyxyb3RhdGU9X3Byb3BzLnJvdGF0ZSxsYWJlbD1fcHJvcHMubGFiZWwsX3Byb3BzJG9yaWVudD1fcHJvcHMub3JpZW50LG9yaWVudD1fcHJvcHMkb3JpZW50PT09dW5kZWZpbmVkPyJsZWZ0IjpfcHJvcHMkb3JpZW50LF9wcm9wcyR0aWNrRm9ybWF0PV9wcm9wcy50aWNrRm9ybWF0LHRpY2tGb3JtYXQ9X3Byb3BzJHRpY2tGb3JtYXQ9PT11bmRlZmluZWQ/ZnVuY3Rpb24oZCl7cmV0dXJuIGR9Ol9wcm9wcyR0aWNrRm9ybWF0LHNpemU9X3Byb3BzLnNpemUsX3Byb3BzJHdpZHRoPV9wcm9wcy53aWR0aCx3aWR0aD1fcHJvcHMkd2lkdGg9PT11bmRlZmluZWQ/c2l6ZVswXXx8MDpfcHJvcHMkd2lkdGgsX3Byb3BzJGhlaWdodD1fcHJvcHMuaGVpZ2h0LGhlaWdodD1fcHJvcHMkaGVpZ2h0PT09dW5kZWZpbmVkP3NpemVbMV18fDA6X3Byb3BzJGhlaWdodCxfcHJvcHMkbWFyZ2luPV9wcm9wcy5tYXJnaW4sbWFyZ2luPV9wcm9wcyRtYXJnaW49PT11bmRlZmluZWQ/e2xlZnQ6MCxyaWdodDowLHRvcDowLGJvdHRvbTowfTpfcHJvcHMkbWFyZ2luLGNsYXNzTmFtZT1fcHJvcHMuY2xhc3NOYW1lLHBhZGRpbmc9X3Byb3BzLnBhZGRpbmcsdGlja1ZhbHVlcz1fcHJvcHMudGlja1ZhbHVlcyxzY2FsZT1fcHJvcHMuc2NhbGUsdGlja3M9X3Byb3BzLnRpY2tzLGZvb3Rlcj1fcHJvcHMuZm9vdGVyLHRpY2tTaXplPV9wcm9wcy50aWNrU2l6ZSx0aWNrTGluZUdlbmVyYXRvcj1fcHJvcHMudGlja0xpbmVHZW5lcmF0b3IsX3Byb3BzJGJhc2VsaW5lPV9wcm9wcy5iYXNlbGluZSxiYXNlbGluZT1fcHJvcHMkYmFzZWxpbmU9PT11bmRlZmluZWQ/dHJ1ZTpfcHJvcHMkYmFzZWxpbmU7aWYodGhpcy5wcm9wcy5mb3JtYXQpe2NvbnNvbGUuZXJyb3IoImF4aXMgYGZvcm1hdGAgaGFzIGJlZW4gZGVwcmVjYXRlZCB1c2UgYHRpY2tGb3JtYXRgIil9dmFyIGF4aXNUaWNrTGluZXM9dm9pZCAwO3ZhciBheGlzUGFydHM9dGhpcy5wcm9wcy5heGlzUGFydHM7aWYoIWF4aXNQYXJ0cyl7YXhpc1BhcnRzPWF4aXNQaWVjZXMoe3BhZGRpbmc6cGFkZGluZyx0aWNrVmFsdWVzOnRpY2tWYWx1ZXMsc2NhbGU6c2NhbGUsdGlja3M6dGlja3Msb3JpZW50Om9yaWVudCxzaXplOnNpemUsbWFyZ2luOm1hcmdpbixmb290ZXI6Zm9vdGVyLHRpY2tTaXplOnRpY2tTaXplfSk7YXhpc1RpY2tMaW5lcz1SZWFjdC5jcmVhdGVFbGVtZW50KCJnIix7Y2xhc3NOYW1lOiJheGlzICIrY2xhc3NOYW1lfSxheGlzTGluZXMoe2F4aXNQYXJ0czpheGlzUGFydHMsb3JpZW50Om9yaWVudCx0aWNrTGluZUdlbmVyYXRvcjp0aWNrTGluZUdlbmVyYXRvcn0pKX1pZihheGlzUGFydHMubGVuZ3RoPT09MCl7cmV0dXJuIG51bGx9dmFyIGhvdmVyV2lkdGg9NTA7dmFyIGhvdmVySGVpZ2h0PWhlaWdodDt2YXIgaG92ZXJYPTA7dmFyIGhvdmVyWT1tYXJnaW4udG9wO3ZhciBiYXNlbGluZVg9bWFyZ2luLmxlZnQ7dmFyIGJhc2VsaW5lWT1tYXJnaW4udG9wO3ZhciBiYXNlbGluZVgyPW1hcmdpbi5sZWZ0O3ZhciBiYXNlbGluZVkyPW1hcmdpbi50b3AraGVpZ2h0O3ZhciBob3ZlckZ1bmN0aW9uPWZ1bmN0aW9uIGhvdmVyRnVuY3Rpb24oZSl7cmV0dXJuIF90aGlzMi5zZXRTdGF0ZSh7aG92ZXJBbm5vdGF0aW9uOmUubmF0aXZlRXZlbnQub2Zmc2V0WS1tYXJnaW4udG9wfSl9O3ZhciBjaXJjbGVYPTI1O3ZhciB0ZXh0WD0tMjU7dmFyIHRleHRZPTE4O3ZhciBsaW5lV2lkdGg9d2lkdGgrMjU7dmFyIGxpbmVIZWlnaHQ9MDt2YXIgY2lyY2xlWT10aGlzLnN0YXRlLmhvdmVyQW5ub3RhdGlvbjt2YXIgYW5ub3RhdGlvbk9mZnNldD1tYXJnaW4ubGVmdDt2YXIgYW5ub3RhdGlvblR5cGU9InkiO3N3aXRjaChvcmllbnQpe2Nhc2UicmlnaHQiOnBvc2l0aW9uPVtwb3NpdGlvblswXSxwb3NpdGlvblsxXV07aG92ZXJYPXdpZHRoO2Jhc2VsaW5lWDI9YmFzZWxpbmVYPXdpZHRoK21hcmdpbi5sZWZ0O2Fubm90YXRpb25PZmZzZXQ9bWFyZ2luLnRvcDtsaW5lV2lkdGg9LXdpZHRoLTI1O3RleHRYPTU7aG92ZXJGdW5jdGlvbj1mdW5jdGlvbiBob3ZlckZ1bmN0aW9uKGUpe3JldHVybiBfdGhpczIuc2V0U3RhdGUoe2hvdmVyQW5ub3RhdGlvbjplLm5hdGl2ZUV2ZW50Lm9mZnNldFktYW5ub3RhdGlvbk9mZnNldH0pfTticmVhaztjYXNlInRvcCI6cG9zaXRpb249W3Bvc2l0aW9uWzBdLDBdO2hvdmVyV2lkdGg9d2lkdGg7aG92ZXJIZWlnaHQ9NTA7YW5ub3RhdGlvblR5cGU9IngiO2Jhc2VsaW5lWDI9YmFzZWxpbmVYK3dpZHRoO2Jhc2VsaW5lWTI9bWFyZ2luLnRvcDtob3ZlckZ1bmN0aW9uPWZ1bmN0aW9uIGhvdmVyRnVuY3Rpb24oZSl7cmV0dXJuIF90aGlzMi5zZXRTdGF0ZSh7aG92ZXJBbm5vdGF0aW9uOmUubmF0aXZlRXZlbnQub2Zmc2V0WC1hbm5vdGF0aW9uT2Zmc2V0fSl9O2NpcmNsZVg9dGhpcy5zdGF0ZS5ob3ZlckFubm90YXRpb247Y2lyY2xlWT0yNTt0ZXh0WD0wO3RleHRZPS0xMDtsaW5lV2lkdGg9MDtsaW5lSGVpZ2h0PWhlaWdodCsyNTticmVhaztjYXNlImJvdHRvbSI6cG9zaXRpb249W3Bvc2l0aW9uWzBdLHBvc2l0aW9uWzFdLW1hcmdpbi50b3BdO3Bvc2l0aW9uPVtwb3NpdGlvblswXSwwXTtob3ZlcldpZHRoPXdpZHRoO2hvdmVySGVpZ2h0PTUwO2Jhc2VsaW5lWT1iYXNlbGluZVkyPWhvdmVyWT1oZWlnaHQrbWFyZ2luLnRvcDtiYXNlbGluZVg9aG92ZXJYPW1hcmdpbi5sZWZ0O2Jhc2VsaW5lWDI9YmFzZWxpbmVYK3dpZHRoO2hvdmVyRnVuY3Rpb249ZnVuY3Rpb24gaG92ZXJGdW5jdGlvbihlKXtyZXR1cm4gX3RoaXMyLnNldFN0YXRlKHtob3ZlckFubm90YXRpb246ZS5uYXRpdmVFdmVudC5vZmZzZXRYLWFubm90YXRpb25PZmZzZXR9KX07Y2lyY2xlWD10aGlzLnN0YXRlLmhvdmVyQW5ub3RhdGlvbjtjaXJjbGVZPTI1O3RleHRYPTA7dGV4dFk9MTU7bGluZVdpZHRoPTA7bGluZUhlaWdodD0taGVpZ2h0LTI1O2Fubm90YXRpb25UeXBlPSJ4IjticmVhaztkZWZhdWx0OnBvc2l0aW9uPVtwb3NpdGlvblswXS1tYXJnaW4ubGVmdCxwb3NpdGlvblsxXV07YW5ub3RhdGlvbk9mZnNldD1tYXJnaW4udG9wO2hvdmVyRnVuY3Rpb249ZnVuY3Rpb24gaG92ZXJGdW5jdGlvbihlKXtyZXR1cm4gX3RoaXMyLnNldFN0YXRlKHtob3ZlckFubm90YXRpb246ZS5uYXRpdmVFdmVudC5vZmZzZXRZLWFubm90YXRpb25PZmZzZXR9KX19dmFyIGFubm90YXRpb25CcnVzaD12b2lkIDA7aWYodGhpcy5wcm9wcy5hbm5vdGF0aW9uRnVuY3Rpb24pe3ZhciBmb3JtYXR0ZWRWYWx1ZT1mb3JtYXRWYWx1ZSh0aGlzLnByb3BzLnNjYWxlLmludmVydCh0aGlzLnN0YXRlLmhvdmVyQW5ub3RhdGlvbithbm5vdGF0aW9uT2Zmc2V0KSx0aGlzLnByb3BzKTt2YXIgaG92ZXJHbHlwaD10aGlzLnByb3BzLmdseXBoRnVuY3Rpb24/dGhpcy5wcm9wcy5nbHlwaEZ1bmN0aW9uKHtsaW5lSGVpZ2h0OmxpbmVIZWlnaHQsbGluZVdpZHRoOmxpbmVXaWR0aCx2YWx1ZTp0aGlzLnByb3BzLnNjYWxlLmludmVydCh0aGlzLnN0YXRlLmhvdmVyQW5ub3RhdGlvbithbm5vdGF0aW9uT2Zmc2V0KX0pOlJlYWN0LmNyZWF0ZUVsZW1lbnQoImciLG51bGwsUmVhY3QuaXNWYWxpZEVsZW1lbnQoZm9ybWF0dGVkVmFsdWUpP1JlYWN0LmNyZWF0ZUVsZW1lbnQoImciLHt0cmFuc2Zvcm06InRyYW5zbGF0ZSgiK3RleHRYKyIsIit0ZXh0WSsiKSJ9LGZvcm1hdHRlZFZhbHVlKTpSZWFjdC5jcmVhdGVFbGVtZW50KCJ0ZXh0Iix7eDp0ZXh0WCx5OnRleHRZfSxmb3JtYXR0ZWRWYWx1ZSksUmVhY3QuY3JlYXRlRWxlbWVudCgiY2lyY2xlIix7cjo1fSksUmVhY3QuY3JlYXRlRWxlbWVudCgibGluZSIse3gxOmxpbmVXaWR0aCx5MTpsaW5lSGVpZ2h0LHN0eWxlOntzdHJva2U6ImJsYWNrIn19KSk7dmFyIGFubm90YXRpb25TeW1ib2w9dGhpcy5zdGF0ZS5ob3ZlckFubm90YXRpb24/UmVhY3QuY3JlYXRlRWxlbWVudCgiZyIse3N0eWxlOntwb2ludGVyRXZlbnRzOiJub25lIn0sdHJhbnNmb3JtOiJ0cmFuc2xhdGUoIitjaXJjbGVYKyIsIitjaXJjbGVZKyIpIn0saG92ZXJHbHlwaCk6bnVsbDthbm5vdGF0aW9uQnJ1c2g9UmVhY3QuY3JlYXRlRWxlbWVudCgiZyIse2NsYXNzTmFtZToiYW5ub3RhdGlvbi1icnVzaCIsdHJhbnNmb3JtOiJ0cmFuc2xhdGUoIitob3ZlclgrIiwiK2hvdmVyWSsiKSJ9LFJlYWN0LmNyZWF0ZUVsZW1lbnQoInJlY3QiLHtzdHlsZTp7ZmlsbE9wYWNpdHk6MH0saGVpZ2h0OmhvdmVySGVpZ2h0LHdpZHRoOmhvdmVyV2lkdGgsb25Nb3VzZU1vdmU6aG92ZXJGdW5jdGlvbixvbkNsaWNrOmZ1bmN0aW9uIG9uQ2xpY2soKXtyZXR1cm4gX3RoaXMyLnByb3BzLmFubm90YXRpb25GdW5jdGlvbih7Y2xhc3NOYW1lOiJkeW5hbWljLWF4aXMtYW5ub3RhdGlvbiIsdHlwZTphbm5vdGF0aW9uVHlwZSx2YWx1ZTpfdGhpczIucHJvcHMuc2NhbGUuaW52ZXJ0KF90aGlzMi5zdGF0ZS5ob3ZlckFubm90YXRpb24rYW5ub3RhdGlvbk9mZnNldCl9KX0sb25Nb3VzZU91dDpmdW5jdGlvbiBvbk1vdXNlT3V0KCl7cmV0dXJuIF90aGlzMi5zZXRTdGF0ZSh7aG92ZXJBbm5vdGF0aW9uOnVuZGVmaW5lZH0pfX0pLGFubm90YXRpb25TeW1ib2wpfXZhciBheGlzVGl0bGU9dm9pZCAwO3ZhciBheGlzVGlja0xhYmVscz1heGlzTGFiZWxzKHt0aWNrRm9ybWF0OnRpY2tGb3JtYXQsYXhpc1BhcnRzOmF4aXNQYXJ0cyxvcmllbnQ6b3JpZW50LHJvdGF0ZTpyb3RhdGV9KTtpZihsYWJlbCl7dmFyIGxhYmVsTmFtZT1sYWJlbC5uYW1lfHxsYWJlbDt2YXIgbGFiZWxQb3NpdGlvbj1sYWJlbC5wb3NpdGlvbnx8e307dmFyIGxvY2F0aW9uTW9kPWxhYmVsUG9zaXRpb24ubG9jYXRpb258fCJvdXRzaWRlIjt2YXIgYW5jaG9yTW9kPWxhYmVsUG9zaXRpb24uYW5jaG9yfHwibWlkZGxlIjt2YXIgZGlzdGFuY2U9bGFiZWwubG9jYXRpb25EaXN0YW5jZTt2YXIgcm90YXRlSGFzaD17bGVmdDotOTAscmlnaHQ6OTAsdG9wOjAsYm90dG9tOjB9O3ZhciByb3RhdGlvbj1sYWJlbFBvc2l0aW9uLnJvdGF0aW9ufHxyb3RhdGVIYXNoW29yaWVudF07dmFyIHBvc2l0aW9uSGFzaD17bGVmdDp7c3RhcnQ6W21hcmdpbi5sZWZ0LHNpemVbMV0rbWFyZ2luLnRvcF0sbWlkZGxlOlttYXJnaW4ubGVmdCxzaXplWzFdLzIrbWFyZ2luLnRvcF0sZW5kOlttYXJnaW4ubGVmdCxtYXJnaW4udG9wXSxpbnNpZGU6W2Rpc3RhbmNlfHwxNSwwXSxvdXRzaWRlOlstKGRpc3RhbmNlfHw0NSksMF19LHJpZ2h0OntzdGFydDpbc2l6ZVswXSttYXJnaW4ubGVmdCxzaXplWzFdK21hcmdpbi50b3BdLG1pZGRsZTpbc2l6ZVswXSttYXJnaW4ubGVmdCxzaXplWzFdLzIrbWFyZ2luLnRvcF0sZW5kOltzaXplWzBdK21hcmdpbi5sZWZ0LG1hcmdpbi50b3BdLGluc2lkZTpbLShkaXN0YW5jZXx8MTUpLDBdLG91dHNpZGU6W2Rpc3RhbmNlfHw0NSwwXX0sdG9wOntzdGFydDpbbWFyZ2luLmxlZnQsbWFyZ2luLnRvcF0sbWlkZGxlOlttYXJnaW4ubGVmdCtzaXplWzBdLzIsbWFyZ2luLnRvcF0sZW5kOlttYXJnaW4ubGVmdCtzaXplWzBdLG1hcmdpbi50b3BdLGluc2lkZTpbMCxkaXN0YW5jZXx8MTVdLG91dHNpZGU6WzAsLShkaXN0YW5jZXx8NDApXX0sYm90dG9tOntzdGFydDpbbWFyZ2luLmxlZnQsc2l6ZVsxXSttYXJnaW4udG9wXSxtaWRkbGU6W21hcmdpbi5sZWZ0K3NpemVbMF0vMixzaXplWzFdK21hcmdpbi50b3BdLGVuZDpbbWFyZ2luLmxlZnQrc2l6ZVswXSxzaXplWzFdK21hcmdpbi50b3BdLGluc2lkZTpbMCwtKGRpc3RhbmNlfHw1KV0sb3V0c2lkZTpbMCxkaXN0YW5jZXx8NTBdfX07dmFyIHRyYW5zbGF0aW9uPXBvc2l0aW9uSGFzaFtvcmllbnRdW2FuY2hvck1vZF07dmFyIGxvY2F0aW9uPXBvc2l0aW9uSGFzaFtvcmllbnRdW2xvY2F0aW9uTW9kXTt0cmFuc2xhdGlvblswXT10cmFuc2xhdGlvblswXStsb2NhdGlvblswXTt0cmFuc2xhdGlvblsxXT10cmFuc2xhdGlvblsxXStsb2NhdGlvblsxXTtpZihhbmNob3JNb2Q9PT0ic3RhcnQiJiZvcmllbnQ9PT0icmlnaHQiKXthbmNob3JNb2Q9ImVuZCJ9ZWxzZSBpZihhbmNob3JNb2Q9PT0iZW5kIiYmb3JpZW50PT09InJpZ2h0Iil7YW5jaG9yTW9kPSJzdGFydCJ9YXhpc1RpdGxlPVJlYWN0LmNyZWF0ZUVsZW1lbnQoImciLHtjbGFzc05hbWU6ImF4aXMtdGl0bGUiLHRyYW5zZm9ybToidHJhbnNsYXRlKCIrW3RyYW5zbGF0aW9uWzBdK3Bvc2l0aW9uWzBdLHRyYW5zbGF0aW9uWzFdK3Bvc2l0aW9uWzFdXSsiKSByb3RhdGUoIityb3RhdGlvbisiKSJ9LFJlYWN0LmlzVmFsaWRFbGVtZW50KGxhYmVsTmFtZSk/bGFiZWxOYW1lOlJlYWN0LmNyZWF0ZUVsZW1lbnQoInRleHQiLHt0ZXh0QW5jaG9yOmFuY2hvck1vZH0sbGFiZWxOYW1lKSl9cmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoImciLHtjbGFzc05hbWU6Y2xhc3NOYW1lfSxhbm5vdGF0aW9uQnJ1c2gsYXhpc1RpY2tMYWJlbHMsYXhpc1RpY2tMaW5lcyxiYXNlbGluZT9SZWFjdC5jcmVhdGVFbGVtZW50KCJsaW5lIix7a2V5OiJiYXNlbGluZSIsY2xhc3NOYW1lOiJheGlzLWJhc2VsaW5lIixzdHJva2U6ImJsYWNrIixzdHJva2VMaW5lY2FwOiJzcXVhcmUiLHgxOmJhc2VsaW5lWCx4MjpiYXNlbGluZVgyLHkxOmJhc2VsaW5lWSx5MjpiYXNlbGluZVkyfSk6bnVsbCxheGlzVGl0bGUpfX1dKTtyZXR1cm4gQXhpc30oUmVhY3QuQ29tcG9uZW50KTtBeGlzLnByb3BUeXBlcz17bmFtZTpwcm9wVHlwZXMuc3RyaW5nLGNsYXNzTmFtZTpwcm9wVHlwZXMuc3RyaW5nLG9yaWVudDpwcm9wVHlwZXMuc3RyaW5nLHBvc2l0aW9uOnByb3BUeXBlcy5hcnJheSxzaXplOnByb3BUeXBlcy5hcnJheSxyb3RhdGU6cHJvcFR5cGVzLm51bWJlcixzY2FsZTpwcm9wVHlwZXMuZnVuYyxtYXJnaW46cHJvcFR5cGVzLm9iamVjdCxhbm5vdGF0aW9uRnVuY3Rpb246cHJvcFR5cGVzLmZ1bmMsZm9ybWF0OnByb3BUeXBlcy5zdHJpbmcsdGlja0Zvcm1hdDpwcm9wVHlwZXMuZnVuYyx0aWNrVmFsdWVzOnByb3BUeXBlcy5hcnJheSxwYWRkaW5nOnByb3BUeXBlcy5udW1iZXIsYmFzZWxpbmU6cHJvcFR5cGVzLmJvb2wsdGlja3M6cHJvcFR5cGVzLm9uZU9mVHlwZShbcHJvcFR5cGVzLmFycmF5LHByb3BUeXBlcy5udW1iZXJdKSxsYWJlbDpwcm9wVHlwZXMub25lT2ZUeXBlKFtwcm9wVHlwZXMuc3RyaW5nLHByb3BUeXBlcy5udW1iZXIscHJvcFR5cGVzLm9iamVjdF0pfTt2YXIgX2VuZGlhbm5lc3M7ZnVuY3Rpb24gZW5kaWFubmVzcygpe2lmKHR5cGVvZiBfZW5kaWFubmVzcz09PSJ1bmRlZmluZWQiKXt2YXIgYT1uZXcgQXJyYXlCdWZmZXIoMik7dmFyIGI9bmV3IFVpbnQ4QXJyYXkoYSk7dmFyIGM9bmV3IFVpbnQxNkFycmF5KGEpO2JbMF09MTtiWzFdPTI7aWYoY1swXT09PTI1OCl7X2VuZGlhbm5lc3M9IkJFIn1lbHNlIGlmKGNbMF09PT01MTMpe19lbmRpYW5uZXNzPSJMRSJ9ZWxzZXt0aHJvdyBuZXcgRXJyb3IoInVuYWJsZSB0byBmaWd1cmUgb3V0IGVuZGlhbmVzcyIpfX1yZXR1cm4gX2VuZGlhbm5lc3N9ZnVuY3Rpb24gaG9zdG5hbWUoKXtpZih0eXBlb2YgZ2xvYmFsLmxvY2F0aW9uIT09InVuZGVmaW5lZCIpe3JldHVybiBnbG9iYWwubG9jYXRpb24uaG9zdG5hbWV9ZWxzZSByZXR1cm4iIn1mdW5jdGlvbiBsb2FkYXZnKCl7cmV0dXJuW119ZnVuY3Rpb24gdXB0aW1lKCl7cmV0dXJuIDB9ZnVuY3Rpb24gZnJlZW1lbSgpe3JldHVybiBOdW1iZXIuTUFYX1ZBTFVFfWZ1bmN0aW9uIHRvdGFsbWVtKCl7cmV0dXJuIE51bWJlci5NQVhfVkFMVUV9ZnVuY3Rpb24gY3B1cygpe3JldHVybltdfWZ1bmN0aW9uIHR5cGUoKXtyZXR1cm4iQnJvd3NlciJ9ZnVuY3Rpb24gcmVsZWFzZSgpe2lmKHR5cGVvZiBnbG9iYWwubmF2aWdhdG9yIT09InVuZGVmaW5lZCIpe3JldHVybiBnbG9iYWwubmF2aWdhdG9yLmFwcFZlcnNpb259cmV0dXJuIiJ9ZnVuY3Rpb24gbmV0d29ya0ludGVyZmFjZXMoKXt9ZnVuY3Rpb24gZ2V0TmV0d29ya0ludGVyZmFjZXMoKXt9ZnVuY3Rpb24gYXJjaCgpe3JldHVybiJqYXZhc2NyaXB0In1mdW5jdGlvbiBwbGF0Zm9ybSgpe3JldHVybiJicm93c2VyIn1mdW5jdGlvbiB0bXBEaXIoKXtyZXR1cm4iL3RtcCJ9dmFyIHRtcGRpcj10bXBEaXI7dmFyIEVPTD0iXG4iO3ZhciBvcz17RU9MOkVPTCx0bXBkaXI6dG1wZGlyLHRtcERpcjp0bXBEaXIsbmV0d29ya0ludGVyZmFjZXM6bmV0d29ya0ludGVyZmFjZXMsZ2V0TmV0d29ya0ludGVyZmFjZXM6Z2V0TmV0d29ya0ludGVyZmFjZXMscmVsZWFzZTpyZWxlYXNlLHR5cGU6dHlwZSxjcHVzOmNwdXMsdG90YWxtZW06dG90YWxtZW0sZnJlZW1lbTpmcmVlbWVtLHVwdGltZTp1cHRpbWUsbG9hZGF2Zzpsb2FkYXZnLGhvc3RuYW1lOmhvc3RuYW1lLGVuZGlhbm5lc3M6ZW5kaWFubmVzc307dmFyIG9zJDE9T2JqZWN0LmZyZWV6ZSh7ZW5kaWFubmVzczplbmRpYW5uZXNzLGhvc3RuYW1lOmhvc3RuYW1lLGxvYWRhdmc6bG9hZGF2Zyx1cHRpbWU6dXB0aW1lLGZyZWVtZW06ZnJlZW1lbSx0b3RhbG1lbTp0b3RhbG1lbSxjcHVzOmNwdXMsdHlwZTp0eXBlLHJlbGVhc2U6cmVsZWFzZSxuZXR3b3JrSW50ZXJmYWNlczpuZXR3b3JrSW50ZXJmYWNlcyxnZXROZXR3b3JrSW50ZXJmYWNlczpnZXROZXR3b3JrSW50ZXJmYWNlcyxhcmNoOmFyY2gscGxhdGZvcm06cGxhdGZvcm0sdG1wRGlyOnRtcERpcix0bXBkaXI6dG1wZGlyLEVPTDpFT0wsZGVmYXVsdDpvc30pO3ZhciBGVU5DX0VSUk9SX1RFWFQ9IkV4cGVjdGVkIGEgZnVuY3Rpb24iO3ZhciBIQVNIX1VOREVGSU5FRCQxPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjt2YXIgSU5GSU5JVFkkMT0xLzA7dmFyIGZ1bmNUYWckMj0iW29iamVjdCBGdW5jdGlvbl0iO3ZhciBnZW5UYWckMj0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iO3ZhciBzeW1ib2xUYWc9IltvYmplY3QgU3ltYm9sXSI7dmFyIHJlSXNEZWVwUHJvcD0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLzt2YXIgcmVJc1BsYWluUHJvcD0vXlx3KiQvO3ZhciByZUxlYWRpbmdEb3Q9L15cLi87dmFyIHJlUHJvcE5hbWU9L1teLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JCkpL2c7dmFyIHJlUmVnRXhwQ2hhciQxPS9bXFxeJC4qKz8oKVtcXXt9fF0vZzt2YXIgcmVFc2NhcGVDaGFyPS9cXChcXCk/L2c7dmFyIHJlSXNIb3N0Q3RvciQxPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvO3ZhciBmcmVlR2xvYmFsJDI9X3R5cGVvZihjb21tb25qc0dsb2JhbCk9PSJvYmplY3QiJiZjb21tb25qc0dsb2JhbCYmY29tbW9uanNHbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZjb21tb25qc0dsb2JhbDt2YXIgZnJlZVNlbGYkMj0odHlwZW9mIHNlbGY9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKHNlbGYpKT09Im9iamVjdCImJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmO3ZhciByb290JDQ9ZnJlZUdsb2JhbCQyfHxmcmVlU2VsZiQyfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpO2Z1bmN0aW9uIGdldFZhbHVlJDEob2JqZWN0LGtleSl7cmV0dXJuIG9iamVjdD09bnVsbD91bmRlZmluZWQ6b2JqZWN0W2tleV19ZnVuY3Rpb24gaXNIb3N0T2JqZWN0JDEodmFsdWUpe3ZhciByZXN1bHQ9ZmFsc2U7aWYodmFsdWUhPW51bGwmJnR5cGVvZiB2YWx1ZS50b1N0cmluZyE9ImZ1bmN0aW9uIil7dHJ5e3Jlc3VsdD0hISh2YWx1ZSsiIil9Y2F0Y2goZSl7fX1yZXR1cm4gcmVzdWx0fXZhciBhcnJheVByb3RvJDE9QXJyYXkucHJvdG90eXBlO3ZhciBmdW5jUHJvdG8kMT1GdW5jdGlvbi5wcm90b3R5cGU7dmFyIG9iamVjdFByb3RvJDI9T2JqZWN0LnByb3RvdHlwZTt2YXIgY29yZUpzRGF0YSQxPXJvb3QkNFsiX19jb3JlLWpzX3NoYXJlZF9fIl07dmFyIG1hc2tTcmNLZXkkMT1mdW5jdGlvbigpe3ZhciB1aWQ9L1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhJDEmJmNvcmVKc0RhdGEkMS5rZXlzJiZjb3JlSnNEYXRhJDEua2V5cy5JRV9QUk9UT3x8IiIpO3JldHVybiB1aWQ/IlN5bWJvbChzcmMpXzEuIit1aWQ6IiJ9KCk7dmFyIGZ1bmNUb1N0cmluZyQxPWZ1bmNQcm90byQxLnRvU3RyaW5nO3ZhciBoYXNPd25Qcm9wZXJ0eSQzPW9iamVjdFByb3RvJDIuaGFzT3duUHJvcGVydHk7dmFyIG9iamVjdFRvU3RyaW5nJDI9b2JqZWN0UHJvdG8kMi50b1N0cmluZzt2YXIgcmVJc05hdGl2ZSQxPVJlZ0V4cCgiXiIrZnVuY1RvU3RyaW5nJDEuY2FsbChoYXNPd25Qcm9wZXJ0eSQzKS5yZXBsYWNlKHJlUmVnRXhwQ2hhciQxLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO3ZhciBfU3ltYm9sJDE9cm9vdCQ0LlN5bWJvbDt2YXIgc3BsaWNlJDE9YXJyYXlQcm90byQxLnNwbGljZTt2YXIgTWFwJDM9Z2V0TmF0aXZlJDEocm9vdCQ0LCJNYXAiKTt2YXIgbmF0aXZlQ3JlYXRlJDE9Z2V0TmF0aXZlJDEoT2JqZWN0LCJjcmVhdGUiKTt2YXIgc3ltYm9sUHJvdG89X1N5bWJvbCQxP19TeW1ib2wkMS5wcm90b3R5cGU6dW5kZWZpbmVkO3ZhciBzeW1ib2xUb1N0cmluZz1zeW1ib2xQcm90bz9zeW1ib2xQcm90by50b1N0cmluZzp1bmRlZmluZWQ7ZnVuY3Rpb24gSGFzaCQxKGVudHJpZXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9ZW50cmllcz9lbnRyaWVzLmxlbmd0aDowO3RoaXMuY2xlYXIoKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGVudHJ5PWVudHJpZXNbaW5kZXhdO3RoaXMuc2V0KGVudHJ5WzBdLGVudHJ5WzFdKX19ZnVuY3Rpb24gaGFzaENsZWFyJDEoKXt0aGlzLl9fZGF0YV9fPW5hdGl2ZUNyZWF0ZSQxP25hdGl2ZUNyZWF0ZSQxKG51bGwpOnt9fWZ1bmN0aW9uIGhhc2hEZWxldGUkMShrZXkpe3JldHVybiB0aGlzLmhhcyhrZXkpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1trZXldfWZ1bmN0aW9uIGhhc2hHZXQkMShrZXkpe3ZhciBkYXRhPXRoaXMuX19kYXRhX187aWYobmF0aXZlQ3JlYXRlJDEpe3ZhciByZXN1bHQ9ZGF0YVtrZXldO3JldHVybiByZXN1bHQ9PT1IQVNIX1VOREVGSU5FRCQxP3VuZGVmaW5lZDpyZXN1bHR9cmV0dXJuIGhhc093blByb3BlcnR5JDMuY2FsbChkYXRhLGtleSk/ZGF0YVtrZXldOnVuZGVmaW5lZH1mdW5jdGlvbiBoYXNoSGFzJDEoa2V5KXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fO3JldHVybiBuYXRpdmVDcmVhdGUkMT9kYXRhW2tleV0hPT11bmRlZmluZWQ6aGFzT3duUHJvcGVydHkkMy5jYWxsKGRhdGEsa2V5KX1mdW5jdGlvbiBoYXNoU2V0JDEoa2V5LHZhbHVlKXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fO2RhdGFba2V5XT1uYXRpdmVDcmVhdGUkMSYmdmFsdWU9PT11bmRlZmluZWQ/SEFTSF9VTkRFRklORUQkMTp2YWx1ZTtyZXR1cm4gdGhpc31IYXNoJDEucHJvdG90eXBlLmNsZWFyPWhhc2hDbGVhciQxO0hhc2gkMS5wcm90b3R5cGVbImRlbGV0ZSJdPWhhc2hEZWxldGUkMTtIYXNoJDEucHJvdG90eXBlLmdldD1oYXNoR2V0JDE7SGFzaCQxLnByb3RvdHlwZS5oYXM9aGFzaEhhcyQxO0hhc2gkMS5wcm90b3R5cGUuc2V0PWhhc2hTZXQkMTtmdW5jdGlvbiBMaXN0Q2FjaGUkMShlbnRyaWVzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWVudHJpZXM/ZW50cmllcy5sZW5ndGg6MDt0aGlzLmNsZWFyKCk7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBlbnRyeT1lbnRyaWVzW2luZGV4XTt0aGlzLnNldChlbnRyeVswXSxlbnRyeVsxXSl9fWZ1bmN0aW9uIGxpc3RDYWNoZUNsZWFyJDEoKXt0aGlzLl9fZGF0YV9fPVtdfWZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZSQxKGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXyxpbmRleD1hc3NvY0luZGV4T2YkMShkYXRhLGtleSk7aWYoaW5kZXg8MCl7cmV0dXJuIGZhbHNlfXZhciBsYXN0SW5kZXg9ZGF0YS5sZW5ndGgtMTtpZihpbmRleD09bGFzdEluZGV4KXtkYXRhLnBvcCgpfWVsc2V7c3BsaWNlJDEuY2FsbChkYXRhLGluZGV4LDEpfXJldHVybiB0cnVlfWZ1bmN0aW9uIGxpc3RDYWNoZUdldCQxKGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXyxpbmRleD1hc3NvY0luZGV4T2YkMShkYXRhLGtleSk7cmV0dXJuIGluZGV4PDA/dW5kZWZpbmVkOmRhdGFbaW5kZXhdWzFdfWZ1bmN0aW9uIGxpc3RDYWNoZUhhcyQxKGtleSl7cmV0dXJuIGFzc29jSW5kZXhPZiQxKHRoaXMuX19kYXRhX18sa2V5KT4tMX1mdW5jdGlvbiBsaXN0Q2FjaGVTZXQkMShrZXksdmFsdWUpe3ZhciBkYXRhPXRoaXMuX19kYXRhX18saW5kZXg9YXNzb2NJbmRleE9mJDEoZGF0YSxrZXkpO2lmKGluZGV4PDApe2RhdGEucHVzaChba2V5LHZhbHVlXSl9ZWxzZXtkYXRhW2luZGV4XVsxXT12YWx1ZX1yZXR1cm4gdGhpc31MaXN0Q2FjaGUkMS5wcm90b3R5cGUuY2xlYXI9bGlzdENhY2hlQ2xlYXIkMTtMaXN0Q2FjaGUkMS5wcm90b3R5cGVbImRlbGV0ZSJdPWxpc3RDYWNoZURlbGV0ZSQxO0xpc3RDYWNoZSQxLnByb3RvdHlwZS5nZXQ9bGlzdENhY2hlR2V0JDE7TGlzdENhY2hlJDEucHJvdG90eXBlLmhhcz1saXN0Q2FjaGVIYXMkMTtMaXN0Q2FjaGUkMS5wcm90b3R5cGUuc2V0PWxpc3RDYWNoZVNldCQxO2Z1bmN0aW9uIE1hcENhY2hlJDEoZW50cmllcyl7dmFyIGluZGV4PS0xLGxlbmd0aD1lbnRyaWVzP2VudHJpZXMubGVuZ3RoOjA7dGhpcy5jbGVhcigpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgZW50cnk9ZW50cmllc1tpbmRleF07dGhpcy5zZXQoZW50cnlbMF0sZW50cnlbMV0pfX1mdW5jdGlvbiBtYXBDYWNoZUNsZWFyJDEoKXt0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyBIYXNoJDEsbWFwOm5ldyhNYXAkM3x8TGlzdENhY2hlJDEpLHN0cmluZzpuZXcgSGFzaCQxfX1mdW5jdGlvbiBtYXBDYWNoZURlbGV0ZSQxKGtleSl7cmV0dXJuIGdldE1hcERhdGEkMSh0aGlzLGtleSlbImRlbGV0ZSJdKGtleSl9ZnVuY3Rpb24gbWFwQ2FjaGVHZXQkMShrZXkpe3JldHVybiBnZXRNYXBEYXRhJDEodGhpcyxrZXkpLmdldChrZXkpfWZ1bmN0aW9uIG1hcENhY2hlSGFzJDEoa2V5KXtyZXR1cm4gZ2V0TWFwRGF0YSQxKHRoaXMsa2V5KS5oYXMoa2V5KX1mdW5jdGlvbiBtYXBDYWNoZVNldCQxKGtleSx2YWx1ZSl7Z2V0TWFwRGF0YSQxKHRoaXMsa2V5KS5zZXQoa2V5LHZhbHVlKTtyZXR1cm4gdGhpc31NYXBDYWNoZSQxLnByb3RvdHlwZS5jbGVhcj1tYXBDYWNoZUNsZWFyJDE7TWFwQ2FjaGUkMS5wcm90b3R5cGVbImRlbGV0ZSJdPW1hcENhY2hlRGVsZXRlJDE7TWFwQ2FjaGUkMS5wcm90b3R5cGUuZ2V0PW1hcENhY2hlR2V0JDE7TWFwQ2FjaGUkMS5wcm90b3R5cGUuaGFzPW1hcENhY2hlSGFzJDE7TWFwQ2FjaGUkMS5wcm90b3R5cGUuc2V0PW1hcENhY2hlU2V0JDE7ZnVuY3Rpb24gYXNzb2NJbmRleE9mJDEoYXJyYXksa2V5KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aDt3aGlsZShsZW5ndGgtLSl7aWYoZXEkMShhcnJheVtsZW5ndGhdWzBdLGtleSkpe3JldHVybiBsZW5ndGh9fXJldHVybi0xfWZ1bmN0aW9uIGJhc2VHZXQob2JqZWN0LHBhdGgpe3BhdGg9aXNLZXkocGF0aCxvYmplY3QpP1twYXRoXTpjYXN0UGF0aChwYXRoKTt2YXIgaW5kZXg9MCxsZW5ndGg9cGF0aC5sZW5ndGg7d2hpbGUob2JqZWN0IT1udWxsJiZpbmRleDxsZW5ndGgpe29iamVjdD1vYmplY3RbdG9LZXkocGF0aFtpbmRleCsrXSldfXJldHVybiBpbmRleCYmaW5kZXg9PWxlbmd0aD9vYmplY3Q6dW5kZWZpbmVkfWZ1bmN0aW9uIGJhc2VJc05hdGl2ZSQxKHZhbHVlKXtpZighaXNPYmplY3QkMih2YWx1ZSl8fGlzTWFza2VkJDEodmFsdWUpKXtyZXR1cm4gZmFsc2V9dmFyIHBhdHRlcm49aXNGdW5jdGlvbiQyKHZhbHVlKXx8aXNIb3N0T2JqZWN0JDEodmFsdWUpP3JlSXNOYXRpdmUkMTpyZUlzSG9zdEN0b3IkMTtyZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlJDEodmFsdWUpKX1mdW5jdGlvbiBiYXNlVG9TdHJpbmcodmFsdWUpe2lmKHR5cGVvZiB2YWx1ZT09InN0cmluZyIpe3JldHVybiB2YWx1ZX1pZihpc1N5bWJvbCh2YWx1ZSkpe3JldHVybiBzeW1ib2xUb1N0cmluZz9zeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKToiIn12YXIgcmVzdWx0PXZhbHVlKyIiO3JldHVybiByZXN1bHQ9PSIwIiYmMS92YWx1ZT09LUlORklOSVRZJDE/Ii0wIjpyZXN1bHR9ZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUpe3JldHVybiBpc0FycmF5JDEodmFsdWUpP3ZhbHVlOnN0cmluZ1RvUGF0aCh2YWx1ZSl9ZnVuY3Rpb24gZ2V0TWFwRGF0YSQxKG1hcCxrZXkpe3ZhciBkYXRhPW1hcC5fX2RhdGFfXztyZXR1cm4gaXNLZXlhYmxlJDEoa2V5KT9kYXRhW3R5cGVvZiBrZXk9PSJzdHJpbmciPyJzdHJpbmciOiJoYXNoIl06ZGF0YS5tYXB9ZnVuY3Rpb24gZ2V0TmF0aXZlJDEob2JqZWN0LGtleSl7dmFyIHZhbHVlPWdldFZhbHVlJDEob2JqZWN0LGtleSk7cmV0dXJuIGJhc2VJc05hdGl2ZSQxKHZhbHVlKT92YWx1ZTp1bmRlZmluZWR9ZnVuY3Rpb24gaXNLZXkodmFsdWUsb2JqZWN0KXtpZihpc0FycmF5JDEodmFsdWUpKXtyZXR1cm4gZmFsc2V9dmFyIHR5cGU9dHlwZW9mIHZhbHVlPT09InVuZGVmaW5lZCI/InVuZGVmaW5lZCI6X3R5cGVvZih2YWx1ZSk7aWYodHlwZT09Im51bWJlciJ8fHR5cGU9PSJzeW1ib2wifHx0eXBlPT0iYm9vbGVhbiJ8fHZhbHVlPT1udWxsfHxpc1N5bWJvbCh2YWx1ZSkpe3JldHVybiB0cnVlfXJldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpfHwhcmVJc0RlZXBQcm9wLnRlc3QodmFsdWUpfHxvYmplY3QhPW51bGwmJnZhbHVlIGluIE9iamVjdChvYmplY3QpfWZ1bmN0aW9uIGlzS2V5YWJsZSQxKHZhbHVlKXt2YXIgdHlwZT10eXBlb2YgdmFsdWU9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKHZhbHVlKTtyZXR1cm4gdHlwZT09InN0cmluZyJ8fHR5cGU9PSJudW1iZXIifHx0eXBlPT0ic3ltYm9sInx8dHlwZT09ImJvb2xlYW4iP3ZhbHVlIT09Il9fcHJvdG9fXyI6dmFsdWU9PT1udWxsfWZ1bmN0aW9uIGlzTWFza2VkJDEoZnVuYyl7cmV0dXJuISFtYXNrU3JjS2V5JDEmJm1hc2tTcmNLZXkkMSBpbiBmdW5jfXZhciBzdHJpbmdUb1BhdGg9bWVtb2l6ZShmdW5jdGlvbihzdHJpbmcpe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO3ZhciByZXN1bHQ9W107aWYocmVMZWFkaW5nRG90LnRlc3Qoc3RyaW5nKSl7cmVzdWx0LnB1c2goIiIpfXN0cmluZy5yZXBsYWNlKHJlUHJvcE5hbWUsZnVuY3Rpb24obWF0Y2gsbnVtYmVyLHF1b3RlLHN0cmluZyl7cmVzdWx0LnB1c2gocXVvdGU/c3RyaW5nLnJlcGxhY2UocmVFc2NhcGVDaGFyLCIkMSIpOm51bWJlcnx8bWF0Y2gpfSk7cmV0dXJuIHJlc3VsdH0pO2Z1bmN0aW9uIHRvS2V5KHZhbHVlKXtpZih0eXBlb2YgdmFsdWU9PSJzdHJpbmcifHxpc1N5bWJvbCh2YWx1ZSkpe3JldHVybiB2YWx1ZX12YXIgcmVzdWx0PXZhbHVlKyIiO3JldHVybiByZXN1bHQ9PSIwIiYmMS92YWx1ZT09LUlORklOSVRZJDE/Ii0wIjpyZXN1bHR9ZnVuY3Rpb24gdG9Tb3VyY2UkMShmdW5jKXtpZihmdW5jIT1udWxsKXt0cnl7cmV0dXJuIGZ1bmNUb1N0cmluZyQxLmNhbGwoZnVuYyl9Y2F0Y2goZSl7fXRyeXtyZXR1cm4gZnVuYysiIn1jYXRjaChlKXt9fXJldHVybiIifWZ1bmN0aW9uIG1lbW9pemUoZnVuYyxyZXNvbHZlcil7aWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiJ8fHJlc29sdmVyJiZ0eXBlb2YgcmVzb2x2ZXIhPSJmdW5jdGlvbiIpe3Rocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKX12YXIgbWVtb2l6ZWQ9ZnVuY3Rpb24gbWVtb2l6ZWQoKXt2YXIgYXJncz1hcmd1bWVudHMsa2V5PXJlc29sdmVyP3Jlc29sdmVyLmFwcGx5KHRoaXMsYXJncyk6YXJnc1swXSxjYWNoZT1tZW1vaXplZC5jYWNoZTtpZihjYWNoZS5oYXMoa2V5KSl7cmV0dXJuIGNhY2hlLmdldChrZXkpfXZhciByZXN1bHQ9ZnVuYy5hcHBseSh0aGlzLGFyZ3MpO21lbW9pemVkLmNhY2hlPWNhY2hlLnNldChrZXkscmVzdWx0KTtyZXR1cm4gcmVzdWx0fTttZW1vaXplZC5jYWNoZT1uZXcobWVtb2l6ZS5DYWNoZXx8TWFwQ2FjaGUkMSk7cmV0dXJuIG1lbW9pemVkfW1lbW9pemUuQ2FjaGU9TWFwQ2FjaGUkMTtmdW5jdGlvbiBlcSQxKHZhbHVlLG90aGVyKXtyZXR1cm4gdmFsdWU9PT1vdGhlcnx8dmFsdWUhPT12YWx1ZSYmb3RoZXIhPT1vdGhlcn12YXIgaXNBcnJheSQxPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gaXNGdW5jdGlvbiQyKHZhbHVlKXt2YXIgdGFnPWlzT2JqZWN0JDIodmFsdWUpP29iamVjdFRvU3RyaW5nJDIuY2FsbCh2YWx1ZSk6IiI7cmV0dXJuIHRhZz09ZnVuY1RhZyQyfHx0YWc9PWdlblRhZyQyfWZ1bmN0aW9uIGlzT2JqZWN0JDIodmFsdWUpe3ZhciB0eXBlPXR5cGVvZiB2YWx1ZT09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2YodmFsdWUpO3JldHVybiEhdmFsdWUmJih0eXBlPT0ib2JqZWN0Inx8dHlwZT09ImZ1bmN0aW9uIil9ZnVuY3Rpb24gaXNPYmplY3RMaWtlJDEodmFsdWUpe3JldHVybiEhdmFsdWUmJih0eXBlb2YgdmFsdWU9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKHZhbHVlKSk9PSJvYmplY3QifWZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKXtyZXR1cm4odHlwZW9mIHZhbHVlPT09InVuZGVmaW5lZCI/InVuZGVmaW5lZCI6X3R5cGVvZih2YWx1ZSkpPT0ic3ltYm9sInx8aXNPYmplY3RMaWtlJDEodmFsdWUpJiZvYmplY3RUb1N0cmluZyQyLmNhbGwodmFsdWUpPT1zeW1ib2xUYWd9ZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpe3JldHVybiB2YWx1ZT09bnVsbD8iIjpiYXNlVG9TdHJpbmcodmFsdWUpfWZ1bmN0aW9uIGdldCQzKG9iamVjdCxwYXRoLGRlZmF1bHRWYWx1ZSl7dmFyIHJlc3VsdD1vYmplY3Q9PW51bGw/dW5kZWZpbmVkOmJhc2VHZXQob2JqZWN0LHBhdGgpO3JldHVybiByZXN1bHQ9PT11bmRlZmluZWQ/ZGVmYXVsdFZhbHVlOnJlc3VsdH12YXIgbG9kYXNoX2dldD1nZXQkMzt2YXIgRlVOQ19FUlJPUl9URVhUJDE9IkV4cGVjdGVkIGEgZnVuY3Rpb24iO3ZhciBIQVNIX1VOREVGSU5FRCQyPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjt2YXIgSU5GSU5JVFkkMj0xLzA7dmFyIE1BWF9TQUZFX0lOVEVHRVIkMT05MDA3MTk5MjU0NzQwOTkxO3ZhciBmdW5jVGFnJDM9IltvYmplY3QgRnVuY3Rpb25dIjt2YXIgZ2VuVGFnJDM9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIjt2YXIgc3ltYm9sVGFnJDE9IltvYmplY3QgU3ltYm9sXSI7dmFyIHJlSXNEZWVwUHJvcCQxPS9cLnxcWyg/OlteW1xdXSp8KFsiJ10pKD86KD8hXDEpW15cXF18XFwuKSo/XDEpXF0vO3ZhciByZUlzUGxhaW5Qcm9wJDE9L15cdyokLzt2YXIgcmVMZWFkaW5nRG90JDE9L15cLi87dmFyIHJlUHJvcE5hbWUkMT0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZzt2YXIgcmVSZWdFeHBDaGFyJDI9L1tcXF4kLiorPygpW1xde318XS9nO3ZhciByZUVzY2FwZUNoYXIkMT0vXFwoXFwpPy9nO3ZhciByZUlzSG9zdEN0b3IkMj0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLzt2YXIgcmVJc1VpbnQ9L14oPzowfFsxLTldXGQqKSQvO3ZhciBmcmVlR2xvYmFsJDM9X3R5cGVvZihjb21tb25qc0dsb2JhbCk9PSJvYmplY3QiJiZjb21tb25qc0dsb2JhbCYmY29tbW9uanNHbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZjb21tb25qc0dsb2JhbDt2YXIgZnJlZVNlbGYkMz0odHlwZW9mIHNlbGY9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKHNlbGYpKT09Im9iamVjdCImJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmO3ZhciByb290JDU9ZnJlZUdsb2JhbCQzfHxmcmVlU2VsZiQzfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpO2Z1bmN0aW9uIGdldFZhbHVlJDIob2JqZWN0LGtleSl7cmV0dXJuIG9iamVjdD09bnVsbD91bmRlZmluZWQ6b2JqZWN0W2tleV19ZnVuY3Rpb24gaXNIb3N0T2JqZWN0JDIodmFsdWUpe3ZhciByZXN1bHQ9ZmFsc2U7aWYodmFsdWUhPW51bGwmJnR5cGVvZiB2YWx1ZS50b1N0cmluZyE9ImZ1bmN0aW9uIil7dHJ5e3Jlc3VsdD0hISh2YWx1ZSsiIil9Y2F0Y2goZSl7fX1yZXR1cm4gcmVzdWx0fXZhciBhcnJheVByb3RvJDI9QXJyYXkucHJvdG90eXBlO3ZhciBmdW5jUHJvdG8kMj1GdW5jdGlvbi5wcm90b3R5cGU7dmFyIG9iamVjdFByb3RvJDM9T2JqZWN0LnByb3RvdHlwZTt2YXIgY29yZUpzRGF0YSQyPXJvb3QkNVsiX19jb3JlLWpzX3NoYXJlZF9fIl07dmFyIG1hc2tTcmNLZXkkMj1mdW5jdGlvbigpe3ZhciB1aWQ9L1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhJDImJmNvcmVKc0RhdGEkMi5rZXlzJiZjb3JlSnNEYXRhJDIua2V5cy5JRV9QUk9UT3x8IiIpO3JldHVybiB1aWQ/IlN5bWJvbChzcmMpXzEuIit1aWQ6IiJ9KCk7dmFyIGZ1bmNUb1N0cmluZyQyPWZ1bmNQcm90byQyLnRvU3RyaW5nO3ZhciBoYXNPd25Qcm9wZXJ0eSQ0PW9iamVjdFByb3RvJDMuaGFzT3duUHJvcGVydHk7dmFyIG9iamVjdFRvU3RyaW5nJDM9b2JqZWN0UHJvdG8kMy50b1N0cmluZzt2YXIgcmVJc05hdGl2ZSQyPVJlZ0V4cCgiXiIrZnVuY1RvU3RyaW5nJDIuY2FsbChoYXNPd25Qcm9wZXJ0eSQ0KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciQyLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO3ZhciBfU3ltYm9sJDI9cm9vdCQ1LlN5bWJvbDt2YXIgc3BsaWNlJDI9YXJyYXlQcm90byQyLnNwbGljZTt2YXIgTWFwJDQ9Z2V0TmF0aXZlJDIocm9vdCQ1LCJNYXAiKTt2YXIgbmF0aXZlQ3JlYXRlJDI9Z2V0TmF0aXZlJDIoT2JqZWN0LCJjcmVhdGUiKTt2YXIgc3ltYm9sUHJvdG8kMT1fU3ltYm9sJDI/X1N5bWJvbCQyLnByb3RvdHlwZTp1bmRlZmluZWQ7dmFyIHN5bWJvbFRvU3RyaW5nJDE9c3ltYm9sUHJvdG8kMT9zeW1ib2xQcm90byQxLnRvU3RyaW5nOnVuZGVmaW5lZDtmdW5jdGlvbiBIYXNoJDIoZW50cmllcyl7dmFyIGluZGV4PS0xLGxlbmd0aD1lbnRyaWVzP2VudHJpZXMubGVuZ3RoOjA7dGhpcy5jbGVhcigpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgZW50cnk9ZW50cmllc1tpbmRleF07dGhpcy5zZXQoZW50cnlbMF0sZW50cnlbMV0pfX1mdW5jdGlvbiBoYXNoQ2xlYXIkMigpe3RoaXMuX19kYXRhX189bmF0aXZlQ3JlYXRlJDI/bmF0aXZlQ3JlYXRlJDIobnVsbCk6e319ZnVuY3Rpb24gaGFzaERlbGV0ZSQyKGtleSl7cmV0dXJuIHRoaXMuaGFzKGtleSkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleV19ZnVuY3Rpb24gaGFzaEdldCQyKGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXztpZihuYXRpdmVDcmVhdGUkMil7dmFyIHJlc3VsdD1kYXRhW2tleV07cmV0dXJuIHJlc3VsdD09PUhBU0hfVU5ERUZJTkVEJDI/dW5kZWZpbmVkOnJlc3VsdH1yZXR1cm4gaGFzT3duUHJvcGVydHkkNC5jYWxsKGRhdGEsa2V5KT9kYXRhW2tleV06dW5kZWZpbmVkfWZ1bmN0aW9uIGhhc2hIYXMkMihrZXkpe3ZhciBkYXRhPXRoaXMuX19kYXRhX187cmV0dXJuIG5hdGl2ZUNyZWF0ZSQyP2RhdGFba2V5XSE9PXVuZGVmaW5lZDpoYXNPd25Qcm9wZXJ0eSQ0LmNhbGwoZGF0YSxrZXkpfWZ1bmN0aW9uIGhhc2hTZXQkMihrZXksdmFsdWUpe3ZhciBkYXRhPXRoaXMuX19kYXRhX187ZGF0YVtrZXldPW5hdGl2ZUNyZWF0ZSQyJiZ2YWx1ZT09PXVuZGVmaW5lZD9IQVNIX1VOREVGSU5FRCQyOnZhbHVlO3JldHVybiB0aGlzfUhhc2gkMi5wcm90b3R5cGUuY2xlYXI9aGFzaENsZWFyJDI7SGFzaCQyLnByb3RvdHlwZVsiZGVsZXRlIl09aGFzaERlbGV0ZSQyO0hhc2gkMi5wcm90b3R5cGUuZ2V0PWhhc2hHZXQkMjtIYXNoJDIucHJvdG90eXBlLmhhcz1oYXNoSGFzJDI7SGFzaCQyLnByb3RvdHlwZS5zZXQ9aGFzaFNldCQyO2Z1bmN0aW9uIExpc3RDYWNoZSQyKGVudHJpZXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9ZW50cmllcz9lbnRyaWVzLmxlbmd0aDowO3RoaXMuY2xlYXIoKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGVudHJ5PWVudHJpZXNbaW5kZXhdO3RoaXMuc2V0KGVudHJ5WzBdLGVudHJ5WzFdKX19ZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIkMigpe3RoaXMuX19kYXRhX189W119ZnVuY3Rpb24gbGlzdENhY2hlRGVsZXRlJDIoa2V5KXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fLGluZGV4PWFzc29jSW5kZXhPZiQyKGRhdGEsa2V5KTtpZihpbmRleDwwKXtyZXR1cm4gZmFsc2V9dmFyIGxhc3RJbmRleD1kYXRhLmxlbmd0aC0xO2lmKGluZGV4PT1sYXN0SW5kZXgpe2RhdGEucG9wKCl9ZWxzZXtzcGxpY2UkMi5jYWxsKGRhdGEsaW5kZXgsMSl9cmV0dXJuIHRydWV9ZnVuY3Rpb24gbGlzdENhY2hlR2V0JDIoa2V5KXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fLGluZGV4PWFzc29jSW5kZXhPZiQyKGRhdGEsa2V5KTtyZXR1cm4gaW5kZXg8MD91bmRlZmluZWQ6ZGF0YVtpbmRleF1bMV19ZnVuY3Rpb24gbGlzdENhY2hlSGFzJDIoa2V5KXtyZXR1cm4gYXNzb2NJbmRleE9mJDIodGhpcy5fX2RhdGFfXyxrZXkpPi0xfWZ1bmN0aW9uIGxpc3RDYWNoZVNldCQyKGtleSx2YWx1ZSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXyxpbmRleD1hc3NvY0luZGV4T2YkMihkYXRhLGtleSk7aWYoaW5kZXg8MCl7ZGF0YS5wdXNoKFtrZXksdmFsdWVdKX1lbHNle2RhdGFbaW5kZXhdWzFdPXZhbHVlfXJldHVybiB0aGlzfUxpc3RDYWNoZSQyLnByb3RvdHlwZS5jbGVhcj1saXN0Q2FjaGVDbGVhciQyO0xpc3RDYWNoZSQyLnByb3RvdHlwZVsiZGVsZXRlIl09bGlzdENhY2hlRGVsZXRlJDI7TGlzdENhY2hlJDIucHJvdG90eXBlLmdldD1saXN0Q2FjaGVHZXQkMjtMaXN0Q2FjaGUkMi5wcm90b3R5cGUuaGFzPWxpc3RDYWNoZUhhcyQyO0xpc3RDYWNoZSQyLnByb3RvdHlwZS5zZXQ9bGlzdENhY2hlU2V0JDI7ZnVuY3Rpb24gTWFwQ2FjaGUkMihlbnRyaWVzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWVudHJpZXM/ZW50cmllcy5sZW5ndGg6MDt0aGlzLmNsZWFyKCk7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBlbnRyeT1lbnRyaWVzW2luZGV4XTt0aGlzLnNldChlbnRyeVswXSxlbnRyeVsxXSl9fWZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIkMigpe3RoaXMuX19kYXRhX189e2hhc2g6bmV3IEhhc2gkMixtYXA6bmV3KE1hcCQ0fHxMaXN0Q2FjaGUkMiksc3RyaW5nOm5ldyBIYXNoJDJ9fWZ1bmN0aW9uIG1hcENhY2hlRGVsZXRlJDIoa2V5KXtyZXR1cm4gZ2V0TWFwRGF0YSQyKHRoaXMsa2V5KVsiZGVsZXRlIl0oa2V5KX1mdW5jdGlvbiBtYXBDYWNoZUdldCQyKGtleSl7cmV0dXJuIGdldE1hcERhdGEkMih0aGlzLGtleSkuZ2V0KGtleSl9ZnVuY3Rpb24gbWFwQ2FjaGVIYXMkMihrZXkpe3JldHVybiBnZXRNYXBEYXRhJDIodGhpcyxrZXkpLmhhcyhrZXkpfWZ1bmN0aW9uIG1hcENhY2hlU2V0JDIoa2V5LHZhbHVlKXtnZXRNYXBEYXRhJDIodGhpcyxrZXkpLnNldChrZXksdmFsdWUpO3JldHVybiB0aGlzfU1hcENhY2hlJDIucHJvdG90eXBlLmNsZWFyPW1hcENhY2hlQ2xlYXIkMjtNYXBDYWNoZSQyLnByb3RvdHlwZVsiZGVsZXRlIl09bWFwQ2FjaGVEZWxldGUkMjtNYXBDYWNoZSQyLnByb3RvdHlwZS5nZXQ9bWFwQ2FjaGVHZXQkMjtNYXBDYWNoZSQyLnByb3RvdHlwZS5oYXM9bWFwQ2FjaGVIYXMkMjtNYXBDYWNoZSQyLnByb3RvdHlwZS5zZXQ9bWFwQ2FjaGVTZXQkMjtmdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3Qsa2V5LHZhbHVlKXt2YXIgb2JqVmFsdWU9b2JqZWN0W2tleV07aWYoIShoYXNPd25Qcm9wZXJ0eSQ0LmNhbGwob2JqZWN0LGtleSkmJmVxJDIob2JqVmFsdWUsdmFsdWUpKXx8dmFsdWU9PT11bmRlZmluZWQmJiEoa2V5IGluIG9iamVjdCkpe29iamVjdFtrZXldPXZhbHVlfX1mdW5jdGlvbiBhc3NvY0luZGV4T2YkMihhcnJheSxrZXkpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoO3doaWxlKGxlbmd0aC0tKXtpZihlcSQyKGFycmF5W2xlbmd0aF1bMF0sa2V5KSl7cmV0dXJuIGxlbmd0aH19cmV0dXJuLTF9ZnVuY3Rpb24gYmFzZUlzTmF0aXZlJDIodmFsdWUpe2lmKCFpc09iamVjdCQzKHZhbHVlKXx8aXNNYXNrZWQkMih2YWx1ZSkpe3JldHVybiBmYWxzZX12YXIgcGF0dGVybj1pc0Z1bmN0aW9uJDModmFsdWUpfHxpc0hvc3RPYmplY3QkMih2YWx1ZSk/cmVJc05hdGl2ZSQyOnJlSXNIb3N0Q3RvciQyO3JldHVybiBwYXR0ZXJuLnRlc3QodG9Tb3VyY2UkMih2YWx1ZSkpfWZ1bmN0aW9uIGJhc2VTZXQob2JqZWN0LHBhdGgsdmFsdWUsY3VzdG9taXplcil7aWYoIWlzT2JqZWN0JDMob2JqZWN0KSl7cmV0dXJuIG9iamVjdH1wYXRoPWlzS2V5JDEocGF0aCxvYmplY3QpP1twYXRoXTpjYXN0UGF0aCQxKHBhdGgpO3ZhciBpbmRleD0tMSxsZW5ndGg9cGF0aC5sZW5ndGgsbGFzdEluZGV4PWxlbmd0aC0xLG5lc3RlZD1vYmplY3Q7d2hpbGUobmVzdGVkIT1udWxsJiYrK2luZGV4PGxlbmd0aCl7dmFyIGtleT10b0tleSQxKHBhdGhbaW5kZXhdKSxuZXdWYWx1ZT12YWx1ZTtpZihpbmRleCE9bGFzdEluZGV4KXt2YXIgb2JqVmFsdWU9bmVzdGVkW2tleV07bmV3VmFsdWU9Y3VzdG9taXplcj9jdXN0b21pemVyKG9ialZhbHVlLGtleSxuZXN0ZWQpOnVuZGVmaW5lZDtpZihuZXdWYWx1ZT09PXVuZGVmaW5lZCl7bmV3VmFsdWU9aXNPYmplY3QkMyhvYmpWYWx1ZSk/b2JqVmFsdWU6aXNJbmRleChwYXRoW2luZGV4KzFdKT9bXTp7fX19YXNzaWduVmFsdWUobmVzdGVkLGtleSxuZXdWYWx1ZSk7bmVzdGVkPW5lc3RlZFtrZXldfXJldHVybiBvYmplY3R9ZnVuY3Rpb24gYmFzZVRvU3RyaW5nJDEodmFsdWUpe2lmKHR5cGVvZiB2YWx1ZT09InN0cmluZyIpe3JldHVybiB2YWx1ZX1pZihpc1N5bWJvbCQxKHZhbHVlKSl7cmV0dXJuIHN5bWJvbFRvU3RyaW5nJDE/c3ltYm9sVG9TdHJpbmckMS5jYWxsKHZhbHVlKToiIn12YXIgcmVzdWx0PXZhbHVlKyIiO3JldHVybiByZXN1bHQ9PSIwIiYmMS92YWx1ZT09LUlORklOSVRZJDI/Ii0wIjpyZXN1bHR9ZnVuY3Rpb24gY2FzdFBhdGgkMSh2YWx1ZSl7cmV0dXJuIGlzQXJyYXkkMih2YWx1ZSk/dmFsdWU6c3RyaW5nVG9QYXRoJDEodmFsdWUpfWZ1bmN0aW9uIGdldE1hcERhdGEkMihtYXAsa2V5KXt2YXIgZGF0YT1tYXAuX19kYXRhX187cmV0dXJuIGlzS2V5YWJsZSQyKGtleSk/ZGF0YVt0eXBlb2Yga2V5PT0ic3RyaW5nIj8ic3RyaW5nIjoiaGFzaCJdOmRhdGEubWFwfWZ1bmN0aW9uIGdldE5hdGl2ZSQyKG9iamVjdCxrZXkpe3ZhciB2YWx1ZT1nZXRWYWx1ZSQyKG9iamVjdCxrZXkpO3JldHVybiBiYXNlSXNOYXRpdmUkMih2YWx1ZSk/dmFsdWU6dW5kZWZpbmVkfWZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsbGVuZ3RoKXtsZW5ndGg9bGVuZ3RoPT1udWxsP01BWF9TQUZFX0lOVEVHRVIkMTpsZW5ndGg7cmV0dXJuISFsZW5ndGgmJih0eXBlb2YgdmFsdWU9PSJudW1iZXIifHxyZUlzVWludC50ZXN0KHZhbHVlKSkmJnZhbHVlPi0xJiZ2YWx1ZSUxPT0wJiZ2YWx1ZTxsZW5ndGh9ZnVuY3Rpb24gaXNLZXkkMSh2YWx1ZSxvYmplY3Qpe2lmKGlzQXJyYXkkMih2YWx1ZSkpe3JldHVybiBmYWxzZX12YXIgdHlwZT10eXBlb2YgdmFsdWU9PT0idW5kZWZpbmVkIj8idW5kZWZpbmVkIjpfdHlwZW9mKHZhbHVlKTtpZih0eXBlPT0ibnVtYmVyInx8dHlwZT09InN5bWJvbCJ8fHR5cGU9PSJib29sZWFuInx8dmFsdWU9PW51bGx8fGlzU3ltYm9sJDEodmFsdWUpKXtyZXR1cm4gdHJ1ZX1yZXR1cm4gcmVJc1BsYWluUHJvcCQxLnRlc3QodmFsdWUpfHwhcmVJc0RlZXBQcm9wJDEudGVzdCh2YWx1ZSl8fG9iamVjdCE9bnVsbCYmdmFsdWUgaW4gT2JqZWN0KG9iamVjdCl9ZnVuY3Rpb24gaXNLZXlhYmxlJDIodmFsdWUpe3ZhciB0eXBlPXR5cGVvZiB2YWx1ZT09PSJ1bmRlZmluZWQiPyJ1bmRlZmluZWQiOl90eXBlb2YodmFsdWUpO3JldHVybiB0eXBlPT0ic3RyaW5nInx8dHlwZT09Im51bWJlciJ8fHR5cGU9PSJzeW1ib2wifHx0eXBlPT0iYm9vbGVhbiI/dmFsdWUhPT0iX19wcm90b19fIjp2YWx1ZT09PW51bGx9ZnVuY3Rpb24gaXNNYXNrZWQkMihmdW5jKXtyZXR1cm4hIW1hc2tTcmNLZXkkMiYmbWFza1NyY0tleSQyIGluIGZ1bmN9dmFyIHN0cmluZ1RvUGF0aCQxPW1lbW9pemUkMShmdW5jdGlvbihzdHJpbmcpe3N0cmluZz10b1N0cmluZyQxKHN0cmluZyk7dmFyIHJlc3VsdD1bXTtpZihyZUxlYWRpbmdEb3QkMS50ZXN0KHN0cmluZykpe3Jlc3VsdC5wdXNoKCIiKX1zdHJpbmcucmVwbGFjZShyZVByb3BOYW1lJDEsZnVuY3Rpb24obWF0Y2gsbnVtYmVyLHF1b3RlLHN0cmluZyl7cmVzdWx0LnB1c2gocXVvdGU/c3RyaW5nLnJlcGxhY2UocmVFc2NhcGVDaGFyJDEsIiQxIik6bnVtYmVyfHxtYXRjaCl9KTtyZXR1cm4gcmVzdWx0fSk7ZnVuY3Rpb24gdG9LZXkkMSh2YWx1ZSl7aWYodHlwZW9mIHZhbHVlPT0ic3RyaW5nInx8aXNTeW1ib2wkMSh2YWx1ZSkpe3
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment