Skip to content

Instantly share code, notes, and snippets.

@timelyportfolio
Last active May 17, 2016 21:31
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/086fbb2f63805cdb39a859a9fc6f0be5 to your computer and use it in GitHub Desktop.
Save timelyportfolio/086fbb2f63805cdb39a859a9fc6f0be5 to your computer and use it in GitHub Desktop.
parcoords + sparkline R htmlwidget

Built with blockbuilder.org

experiments with sparklines

jquery.sparkline is old but works really well. As far as I know, its only real competitor is react-sparklines. Ramnath Vaidyanathan used jquery-sparkline for testing in one of the very first R htmlwidgets sparkline. Since then, not much has happened, but I hate to see a great JavaScript library not used to its full potential.

I have started experimenting with sparkline to hopefully update it to exploit the full potential. Here is one of the experiments combining parcoords with sparkline.

code

library(parcoords)
library(sparkline)
library(htmlwidgets)
library(htmltools)

browsable(
  attachDependencies(
    tagList(
      tags$div(
        tags$span(style="font-style:bold","mpg"),
        tags$span(id="sparkline-mpg")
      ),
      tags$div(
        tags$span(style="font-style:bold","disp"),
        tags$span(id="sparkline-disp")
      ),
      onRender(
        parcoords(mtcars,brushMode="1d-axes"),
        sprintf(
"        
function(el,x){
  var drawBox = function(pc){
    $('#sparkline-mpg').sparkline(
      pc.brushed().map(function(d){return d.mpg}),
      {type:'box',chartRangeMin:%i,chartRangeMax:%i}
    );
    $('#sparkline-disp').sparkline(
      pc.brushed().map(function(d){return d.disp}),
      {type:'box',chartRangeMin:%i,chartRangeMax:%i}
    );
  };
  
  drawBox(el.parcoords);

  el.parcoords.on(
    'brush.sparkline',
    function(){drawBox(this)}
  )
}
",
          0,
          ceiling(max(mtcars$mpg)),
          0,
          ceiling(max(mtcars$disp))
        )
      )
    ),
    htmlwidgets:::getDependency("sparkline","sparkline")
  )
)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEFkZCBhIG1ldGhvZCB0byBkZWxlZ2F0b3IgdGhhdCwgd2hlbiBpbnZva2VkLCBjYWxscwogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbgogIC8vIHRoZSBkZWxlZ2F0ZWUsIGJ1dCB0aGVyZSB3YXMgb25lIG9uIGRlbGVnYXRvciBiZWZvcmUKICAvLyBkZWxlZ2F0ZU1ldGhvZCB3YXMgY2FsbGVkLCB0aGVuIHRoZSBvcmlnaW5hbCB2ZXJzaW9uCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gdmFyIGEgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ExJyk7IH0KICAvLyAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYTInKTsgfQogIC8vIH07CiAgLy8gdmFyIGIgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2IxJyk7IH0KICAvLyB9OwogIC8vIGRlbGVnYXRlTWV0aG9kKGEsIGIsICJtZXRob2QxIik7CiAgLy8gZGVsZWdhdGVNZXRob2QoYSwgYiwgIm1ldGhvZDIiKTsKICAvLyBhLm1ldGhvZDEoKTsKICAvLyBhLm1ldGhvZDIoKTsKICAvLwogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4KICBmdW5jdGlvbiBkZWxlZ2F0ZU1ldGhvZChkZWxlZ2F0b3IsIGRlbGVnYXRlZSwgbWV0aG9kTmFtZSkgewogICAgdmFyIGluaGVyaXRlZCA9IGRlbGVnYXRvclttZXRob2ROYW1lXTsKICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdGFyZ2V0ID0gZGVsZWdhdGVlOwogICAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGVlW21ldGhvZE5hbWVdOwoKICAgICAgLy8gVGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0IG9uIHRoZSBkZWxlZ2F0ZWUuIEluc3RlYWQsCiAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBvbiB0aGUgZGVsZWdhdG9yLCBpZiBpdCBleGlzdHMuCiAgICAgIGlmICghbWV0aG9kKSB7CiAgICAgICAgdGFyZ2V0ID0gZGVsZWdhdG9yOwogICAgICAgIG1ldGhvZCA9IGluaGVyaXRlZDsKICAgICAgfQoKICAgICAgaWYgKG1ldGhvZCkgewogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gSW1wbGVtZW50IGEgdmFndWUgZmFjc2ltaWxpZSBvZiBqUXVlcnkncyBkYXRhIG1ldGhvZAogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICByZXR1cm4gZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV07CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgewogICAgICBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXSA9IHZhbHVlOwogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGVsZW1lbnREYXRhOiAiICsKICAgICAgICBhcmd1bWVudHMubGVuZ3RoKTsKICAgIH0KICB9CgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleAogIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCAiXFwkJiIpOwogIH0KCiAgZnVuY3Rpb24gaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkgewogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOwogICAgcmV0dXJuIHJlLnRlc3QoZWwuY2xhc3NOYW1lKTsKICB9CgogIC8vIGVsZW1lbnRzIC0gYXJyYXkgKG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBvZiBIVE1MIGVsZW1lbnRzCiAgLy8gY2xhc3NOYW1lIC0gY2xhc3MgbmFtZSB0byB0ZXN0IGZvcgogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsKICAvLyAgIGlmIGZhbHNlLCBvbmx5IHJldHVybiBlbGVtZW50cyAqd2l0aG91dCogZ2l2ZW4gY2xhc3NOYW1lCiAgZnVuY3Rpb24gZmlsdGVyQnlDbGFzcyhlbGVtZW50cywgY2xhc3NOYW1lLCBpbmNsdWRlKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaGFzQ2xhc3MoZWxlbWVudHNbaV0sIGNsYXNzTmFtZSkgPT0gaW5jbHVkZSkKICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQoKICBmdW5jdGlvbiBvbihvYmosIGV2ZW50TmFtZSwgZnVuYykgewogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgZmFsc2UpOwogICAgfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpIHsKICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvZmYob2JqLCBldmVudE5hbWUsIGZ1bmMpIHsKICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7CiAgICBlbHNlIGlmIChvYmouZGV0YWNoRXZlbnQpIHsKICAgICAgb2JqLmRldGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aAogIC8vIHRoZSAicGFkZGluZyIgQ1NTIHByb3BlcnR5CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3BhZGRpbmcKICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7CiAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgIHZhbHVlID0gW3ZhbHVlXTsKICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMF0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzBdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzNdfTsKICAgIH0KICB9CgogIC8vIENvbnZlcnQgYW4gdW5wYWNrZWQgcGFkZGluZyBvYmplY3QgdG8gYSBDU1MgdmFsdWUKICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgewogICAgcmV0dXJuIHBhZGRpbmdPYmoudG9wICsgInB4ICIgKyBwYWRkaW5nT2JqLnJpZ2h0ICsgInB4ICIgKyBwYWRkaW5nT2JqLmJvdHRvbSArICJweCAiICsgcGFkZGluZ09iai5sZWZ0ICsgInB4IjsKICB9CgogIC8vIE1ha2VzIGEgbnVtYmVyIHN1aXRhYmxlIGZvciBDU1MKICBmdW5jdGlvbiBweCh4KSB7CiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIHggKyAicHgiOwogICAgZWxzZQogICAgICByZXR1cm4geDsKICB9CgogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuCiAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIgbnVsbCwgb3IgYW4gb2JqZWN0IHdpdGggZmlsbCwgcGFkZGluZywKICAvLyBkZWZhdWx0V2lkdGgsIGRlZmF1bHRIZWlnaHQgZmllbGRzLgogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgewogICAgdmFyIHNpemluZ0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vaHRtbHdpZGdldC1zaXppbmcnXSIpOwogICAgaWYgKCFzaXppbmdFbCkKICAgICAgcmV0dXJuIG51bGw7CiAgICB2YXIgc3AgPSBKU09OLnBhcnNlKHNpemluZ0VsLnRleHRDb250ZW50IHx8IHNpemluZ0VsLnRleHQgfHwgInt9Iik7CiAgICBpZiAodmlld2VyTW9kZSkgewogICAgICByZXR1cm4gc3Audmlld2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHNwLmJyb3dzZXI7CiAgICB9CiAgfQoKICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLgogIC8vICAgRWFjaCBlbGVtZW50IG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdGhhdCB5aWVsZHMgYQogIC8vICAgZnVuY3Rpb24uCiAgLy8gQHBhcmFtIHRhcmdldCBUaGUgb2JqZWN0IHRoYXQgd2lsbCBiZSAidGhpcyIgZm9yIGVhY2ggZnVuY3Rpb24KICAvLyAgIGV4ZWN1dGlvbi4KICAvLyBAcGFyYW0gYXJncyBBcnJheSBvZiBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbnMuIChUaGUKICAvLyAgIHNhbWUgYXJndW1lbnRzIHdpbGwgYmUgcGFzc2VkIHRvIGFsbCBmdW5jdGlvbnMuKQogIGZ1bmN0aW9uIGV2YWxBbmRSdW4odGFza3MsIHRhcmdldCwgYXJncykgewogICAgaWYgKHRhc2tzKSB7CiAgICAgIGZvckVhY2godGFza3MsIGZ1bmN0aW9uKHRhc2spIHsKICAgICAgICB2YXIgdGFza0Z1bmMgPSBldmFsKCIoIiArIHRhc2sgKyAiKSIpOwogICAgICAgIGlmICh0eXBlb2YodGFza0Z1bmMpICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRhc2sgbXVzdCBiZSBhIGZ1bmN0aW9uISBTb3VyY2U6XG4iICsgdGFzayk7CiAgICAgICAgfQogICAgICAgIHRhc2tGdW5jLmFwcGx5KHRhcmdldCwgYXJncyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdFNpemluZyhlbCkgewogICAgdmFyIHNpemluZyA9IHNpemluZ1BvbGljeShlbCk7CiAgICBpZiAoIXNpemluZykKICAgICAgcmV0dXJuOwoKICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsKICAgIGlmICghY2VsKQogICAgICByZXR1cm47CgogICAgaWYgKHR5cGVvZihzaXppbmcucGFkZGluZykgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luID0gIjAiOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOwogICAgfQoKICAgIGlmIChzaXppbmcuZmlsbCkgewogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIGlmIChjZWwpIHsKICAgICAgICBjZWwuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgIHZhciBwYWQgPSB1bnBhY2tQYWRkaW5nKHNpemluZy5wYWRkaW5nKTsKICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLnJpZ2h0ID0gcGFkLnJpZ2h0ICsgInB4IjsKICAgICAgICBjZWwuc3R5bGUuYm90dG9tID0gcGFkLmJvdHRvbSArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7CiAgICAgICAgZWwuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwKICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY2VsLm9mZnNldEhlaWdodDsgfQogICAgICB9OwoKICAgIH0gZWxzZSB7CiAgICAgIGVsLnN0eWxlLndpZHRoID0gcHgoc2l6aW5nLndpZHRoKTsKICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LAogICAgICAgIGdldEhlaWdodDogZnVuY3Rpb24oKSB7IHJldHVybiBlbC5vZmZzZXRIZWlnaHQ7IH0KICAgICAgfTsKICAgIH0KICB9CgogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzCiAgdmFyIGRlZmF1bHRzID0gewogICAgZmluZDogZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7CiAgICB9LAogICAgcmVuZGVyRXJyb3I6IGZ1bmN0aW9uKGVsLCBlcnIpIHsKICAgICAgdmFyICRlbCA9ICQoZWwpOwoKICAgICAgdGhpcy5jbGVhckVycm9yKGVsKTsKCiAgICAgIC8vIEFkZCBhbGwgdGhlc2UgZXJyb3IgY2xhc3NlcywgYXMgU2hpbnkgZG9lcwogICAgICB2YXIgZXJyQ2xhc3MgPSAic2hpbnktb3V0cHV0LWVycm9yIjsKICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7CiAgICAgICAgLy8gdXNlIHRoZSBjbGFzc2VzIG9mIHRoZSBlcnJvciBjb25kaXRpb24gYXMgQ1NTIGNsYXNzIG5hbWVzCiAgICAgICAgZXJyQ2xhc3MgPSBlcnJDbGFzcyArICIgIiArICQubWFwKGFzQXJyYXkoZXJyLnR5cGUpLCBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOwogICAgICAgIH0pLmpvaW4oIiAiKTsKICAgICAgfQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7CgogICAgICAvLyBJcyBlbCBpbmxpbmUgb3IgYmxvY2s/IElmIGlubGluZSBvciBpbmxpbmUtYmxvY2ssIGp1c3QgZGlzcGxheTpub25lIGl0CiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLgogICAgICB2YXIgZGlzcGxheSA9ICRlbC5jc3MoImRpc3BsYXkiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgZGlzcGxheSk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICAkZWwuaGlkZSgpOwogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsKICAgICAgICAgIHZhciBlcnJvclNwYW4gPSAkKCI8c3Bhbj4iKS5hZGRDbGFzcyhlcnJDbGFzcyk7CiAgICAgICAgICBlcnJvclNwYW4udGV4dChlcnIubWVzc2FnZSk7CiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIikgewogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlCiAgICAgICAgLy8gZWwsIGFuZCBwb3NpdGlvbiB0aGUgZXJyb3IgdG8gYmUgb24gdG9wIG9mIHRoZSBlbC4KICAgICAgICAvLyBNYXJrIGl0IHdpdGggYSB1bmlxdWUgSUQgYW5kIENTUyBjbGFzcyBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGxhdGVyLgogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSAiIikgewogICAgICAgICAgdmFyIGVycm9yRGl2ID0gJCgiPGRpdj4iKS5hZGRDbGFzcyhlcnJDbGFzcykuY3NzKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpCiAgICAgICAgICAgIC8vIHNldHRpbmcgd2lkdGggY2FuIHB1c2ggb3V0IHRoZSBwYWdlIHNpemUsIGZvcmNpbmcgb3RoZXJ3aXNlCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3IKICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgdG8gc2hyaW5rOyBzbyB1c2UgbWF4LXdpZHRoIGluc3RlYWQKICAgICAgICAgICAgLmNzcygibWF4V2lkdGgiLCBlbC5vZmZzZXRXaWR0aCkKICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgIGVycm9yRGl2LnRleHQoZXJyLm1lc3NhZ2UpOwogICAgICAgICAgJGVsLmFmdGVyKGVycm9yRGl2KTsKCiAgICAgICAgICAvLyBSZWFsbHkgZHVtYiB3YXkgdG8ga2VlcCB0aGUgc2l6ZS9wb3NpdGlvbiBvZiB0aGUgZXJyb3IgaW4gc3luYyB3aXRoCiAgICAgICAgICAvLyB0aGUgcGFyZW50IGVsZW1lbnQgYXMgdGhlIHdpbmRvdyBpcyByZXNpemVkIG9yIHdoYXRldmVyLgogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghZXJyb3JEaXZbMF0ucGFyZW50RWxlbWVudCkgewogICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50SWQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvckRpdgogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgICAuY3NzKCJsZWZ0IiwgZWwub2Zmc2V0TGVmdCkKICAgICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICB9LCA1MDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGNsZWFyRXJyb3I6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIHZhciAkZWwgPSAkKGVsKTsKICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgbnVsbCk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICBpZiAoZGlzcGxheSkKICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsKICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOwogICAgICB9IGVsc2UgaWYgKGRpc3BsYXkgPT09ICJibG9jayIpewogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOwogICAgICAgICQoZWwubmV4dFNpYmxpbmcpLmZpbHRlcigiLmh0bWx3aWRnZXRzLWVycm9yIikucmVtb3ZlKCk7CiAgICAgIH0KICAgIH0sCiAgICBzaXppbmc6IHt9CiAgfTsKCiAgLy8gQ2FsbGVkIGJ5IHdpZGdldCBiaW5kaW5ncyB0byByZWdpc3RlciBhIG5ldyB0eXBlIG9mIHdpZGdldC4gVGhlIGRlZmluaXRpb24KICAvLyBvYmplY3QgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlCiAgLy8gICB1c2VkIGJ5IGRlZmF1bHQgYXMgdGhlIENTUyBjbGFzc25hbWUgdG8gbG9vayBmb3IuCiAgLy8gLSBpbml0aWFsaXplIChvcHRpb25hbCkgLSBBIGZ1bmN0aW9uKGVsKSB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uY2UgcGVyCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkCiAgLy8gICB2YWx1ZSB0byByZW5kZXJWYWx1ZS4KICAvLyAtIHJlbmRlclZhbHVlIChyZXF1aXJlZCkgLSBBIGZ1bmN0aW9uKGVsLCBkYXRhLCBpbml0VmFsdWUpIHRoYXQgd2lsbCBiZQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXIKICAvLyAgIGVsZW1lbnQ7IFNoaW55IGFwcHMgd2lsbCBjYXVzZSB0aGlzIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBwZXIKICAvLyAgIGVsZW1lbnQsIGFzIHRoZSBkYXRhIGNoYW5nZXMuCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsKICAgIGlmICghZGVmaW5pdGlvbi5uYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIG5hbWUiKTsKICAgIH0KICAgIGlmICghZGVmaW5pdGlvbi50eXBlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHR5cGUiKTsKICAgIH0KICAgIC8vIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgb3V0cHV0IHdpZGdldHMKICAgIGlmIChkZWZpbml0aW9uLnR5cGUgIT09ICJvdXRwdXQiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsKICAgIH0KICAgIC8vIFRPRE86IFZlcmlmeSB0aGF0IC5uYW1lIGlzIGEgdmFsaWQgQ1NTIGNsYXNzbmFtZQoKICAgIC8vIFN1cHBvcnQgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb25zLiBPbGQtc3R5bGUgY2xhc3MtYm91bmQKICAgIC8vIGRlZmluaXRpb25zIGhhdmUgb25lIHdpZGdldCAib2JqZWN0IiBwZXIgd2lkZ2V0IHBlciB0eXBlL2NsYXNzIG9mCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cwogICAgLy8gdGFrZSBlbCBhbmQgaW5zdGFuY2UgYXJndW1lbnRzLCBiZWNhdXNlIHRoZSB3aWRnZXQgb2JqZWN0IGNhbid0CiAgICAvLyBzdG9yZSB0aGVtLiBOZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0CiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0CiAgICAvLyBwcm92aWRlIHJlbmRlclZhbHVlIG9yIHJlc2l6ZSBtZXRob2RzIGF0IGFsbCwganVzdCB0aGUgc2luZ2xlIG1ldGhvZAogICAgLy8gICBmYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4KICAgIC8vIFRoaXMgZW5hYmxlcyBhIGZhciBtb3JlIG5hdHVyYWwgcHJvZ3JhbW1pbmcgc3R5bGUgZm9yIHRoZSB3aWRnZXQKICAgIC8vIGF1dGhvciwgd2hvIGNhbiBzdG9yZSBwZXItaW5zdGFuY2Ugc3RhdGUgdXNpbmcgZWl0aGVyIE9PLXN0eWxlCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzCiAgICAvLyBpcyBpbiBjb250cmFzdCB0byB3aGF0IGNhbiBvbmx5IGJlIGNhbGxlZCBDLXN0eWxlIHBzZXVkby1PTyB3aGljaCBpcwogICAgLy8gd2hhdCB3ZSByZXF1aXJlZCBiZWZvcmUpLgogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgewogICAgICBkZWZpbml0aW9uID0gY3JlYXRlTGVnYWN5RGVmaW5pdGlvbkFkYXB0ZXIoZGVmaW5pdGlvbik7CiAgICB9CgogICAgaWYgKCFkZWZpbml0aW9uLnJlbmRlclZhbHVlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHJlbmRlclZhbHVlIGZ1bmN0aW9uIik7CiAgICB9CgogICAgLy8gRm9yIHN0YXRpYyByZW5kZXJpbmcgKG5vbi1TaGlueSksIHVzZSBhIHNpbXBsZSB3aWRnZXQgcmVnaXN0cmF0aW9uCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28KICAgIC8vIGNvbnRhaW4gc3RhdGljIHdpZGdldHMuCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLgogICAgdmFyIHN0YXRpY0JpbmRpbmcgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKICAgIG92ZXJyaWRlTWV0aG9kKHN0YXRpY0JpbmRpbmcsICJmaW5kIiwgZnVuY3Rpb24oc3VwZXJmdW5jKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgewogICAgICAgIHZhciByZXN1bHRzID0gc3VwZXJmdW5jKHNjb3BlKTsKICAgICAgICAvLyBGaWx0ZXIgb3V0IFNoaW55IG91dHB1dHMsIHdlIG9ubHkgd2FudCB0aGUgc3RhdGljIGtpbmQKICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOwogICAgICB9OwogICAgfSk7CiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOwoKICAgIGlmIChzaGlueU1vZGUpIHsKICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4KICAgICAgLy8gVGhlIGRlZmluaXRpb24gaXRzZWxmIHdpbGwgbm90IGJlIHRoZSBvdXRwdXQgYmluZGluZywgaW5zdGVhZAogICAgICAvLyB3ZSB3aWxsIG1ha2UgYW4gb3V0cHV0IGJpbmRpbmcgb2JqZWN0IHRoYXQgZGVsZWdhdGVzIHRvIHRoZQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kCiAgICAgIC8vIG5hbWUgKHJlbmRlclZhbHVlKSBmb3IgaHRtbHdpZGdldHMgZGVmaW5pdGlvbiBhbmQgU2hpbnkgYmluZGluZ3MKICAgICAgLy8gYnV0IHRoZXkgYWN0dWFsbHkgaGF2ZSBxdWl0ZSBkaWZmZXJlbnQgc2VtYW50aWNzICh0aGUgU2hpbnkKICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0CiAgICAgIC8vIHN0cmlwcyBvZmYgYmVmb3JlIGNhbGxpbmcgaHRtbHdpZGdldHMgcmVuZGVyVmFsdWUpLiBXZSBjYW4ndAogICAgICAvLyBqdXN0IGlnbm9yZSB0aGUgZGlmZmVyZW5jZSBiZWNhdXNlIGluIHNvbWUgd2lkZ2V0cyBpdCdzIGhlbHBmdWwKICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZgogICAgICAvLyB3ZSdyZSBub3QgZGVsZWdhdGluZywgdGhlbiB0aGF0IGNhbGwgd2lsbCBnbyB0byB0aGUgU2hpbnkKICAgICAgLy8gdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBodG1sd2lkZ2V0cyB2ZXJzaW9uLgoKICAgICAgLy8gTWVyZ2UgZGVmYXVsdHMgd2l0aCBkZWZpbml0aW9uLCB3aXRob3V0IG11dGF0aW5nIGVpdGhlci4KICAgICAgdmFyIGJpbmRpbmdEZWYgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKCiAgICAgIC8vIFRoaXMgb2JqZWN0IHdpbGwgYmUgb3VyIGFjdHVhbCBTaGlueSBiaW5kaW5nLgogICAgICB2YXIgc2hpbnlCaW5kaW5nID0gbmV3IFNoaW55Lk91dHB1dEJpbmRpbmcoKTsKCiAgICAgIC8vIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgd2UnbGwgd2FudCB0byBzaW1wbHkgdXNlIHRoZSBiaW5kaW5nRGVmJ3MKICAgICAgLy8gdmVyc2lvbiBvZiBtZXRob2RzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0bwogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwKICAgICAgLy8gbWV0aG9kcyBpbiB0aGUgZnV0dXJlLCBhbmQgd2Ugd2FudCB0aGVtIHRvIGJlIG92ZXJyaWRlYWJsZSBieQogICAgICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcgZGVmaW5pdGlvbnMsIHRoZW4gd2UnbGwgbmVlZCB0byBhZGQgdGhlbSB0byB0aGlzCiAgICAgIC8vIGxpc3QuCiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImdldElkIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgIm9uVmFsdWVDaGFuZ2UiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgInJlbmRlckVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImNsZWFyRXJyb3IiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7CgogICAgICAvLyBUaGUgZmluZCwgcmVuZGVyVmFsdWUsIGFuZCByZXNpemUgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIGJlY2F1c2Ugd2UKICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4KCiAgICAgIHNoaW55QmluZGluZy5maW5kID0gZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7CgogICAgICAgIC8vIE9ubHkgcmV0dXJuIGVsZW1lbnRzIHRoYXQgYXJlIFNoaW55IG91dHB1dHMsIG5vdCBzdGF0aWMgb25lcwogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7CgogICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3aGF0ZXZlciBjYXVzZWQgU2hpbnkgdG8gdGhpbmsgdGhlcmUgbWlnaHQgYmUKICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuCiAgICAgICAgLy8gU2luY2UgdGhlcmUgbWlnaHQgYmUgbG90cyBvZiBkaWZmZXJlbnQgaHRtbHdpZGdldHMgYmluZGluZ3MsIHdlCiAgICAgICAgLy8gc2NoZWR1bGUgZXhlY3V0aW9uIGZvciBsYXRlci0tbm8gbmVlZCB0byBzdGF0aWNSZW5kZXIgbXVsdGlwbGUKICAgICAgICAvLyB0aW1lcy4KICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggIT09IGR5bmFtaWNSZXN1bHRzLmxlbmd0aCkKICAgICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyKCk7CgogICAgICAgIHJldHVybiBkeW5hbWljUmVzdWx0czsKICAgICAgfTsKCiAgICAgIC8vIFdyYXAgcmVuZGVyVmFsdWUgdG8gaGFuZGxlIGluaXRpYWxpemF0aW9uLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGlzbid0CiAgICAgIC8vIHN1cHBvcnRlZCBuYXRpdmVseSBieSBTaGlueSBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCgogICAgICBzaGlueUJpbmRpbmcucmVuZGVyVmFsdWUgPSBmdW5jdGlvbihlbCwgZGF0YSkgewogICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgZGF0YS5ldmFscyAmJiBpIDwgZGF0YS5ldmFscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1tpXSk7CiAgICAgICAgfQogICAgICAgIGlmICghYmluZGluZ0RlZi5yZW5kZXJPbk51bGxWYWx1ZSkgewogICAgICAgICAgaWYgKGRhdGEueCA9PT0gbnVsbCkgewogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7CiAgICAgICAgICBpbml0U2l6aW5nKGVsKTsKCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7CiAgICAgICAgICBpZiAoYmluZGluZ0RlZi5pbml0aWFsaXplKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBiaW5kaW5nRGVmLmluaXRpYWxpemUoZWwsIGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICAgIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiLCByZXN1bHQpOwogICAgICAgICAgfQogICAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7CiAgICAgICAgfQogICAgICAgIFNoaW55LnJlbmRlckRlcGVuZGVuY2llcyhkYXRhLmRlcHMpOwogICAgICAgIGJpbmRpbmdEZWYucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsKICAgICAgfTsKCiAgICAgIC8vIE9ubHkgb3ZlcnJpZGUgcmVzaXplIGlmIGJpbmRpbmdEZWYgaW1wbGVtZW50cyBpdAogICAgICBpZiAoYmluZGluZ0RlZi5yZXNpemUpIHsKICAgICAgICBzaGlueUJpbmRpbmcucmVzaXplID0gZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICAgIC8vIFNoaW55IGNhbiBjYWxsIHJlc2l6ZSBiZWZvcmUgaW5pdGlhbGl6ZS9yZW5kZXJWYWx1ZSBoYXZlIGJlZW4KICAgICAgICAgIC8vIGNhbGxlZCwgd2hpY2ggZG9lc24ndCBtYWtlIHNlbnNlIGZvciB3aWRnZXRzLgogICAgICAgICAgaWYgKGVsZW1lbnREYXRhKGVsLCAiaW5pdGlhbGl6ZWQiKSkgewogICAgICAgICAgICBiaW5kaW5nRGVmLnJlc2l6ZShlbCwgd2lkdGgsIGhlaWdodCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9CgogICAgICBTaGlueS5vdXRwdXRCaW5kaW5ncy5yZWdpc3RlcihzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYubmFtZSk7CiAgICB9CiAgfTsKCiAgdmFyIHNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCA9IG51bGw7CiAgZnVuY3Rpb24gc2NoZWR1bGVTdGF0aWNSZW5kZXIoKSB7CiAgICBpZiAoIXNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCkgewogICAgICBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCA9IG51bGw7CiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgICB9LCAxKTsKICAgIH0KICB9CgogIC8vIFJlbmRlciBzdGF0aWMgd2lkZ2V0cyBhZnRlciB0aGUgZG9jdW1lbnQgZmluaXNoZXMgbG9hZGluZwogIC8vIFN0YXRpY2FsbHkgcmVuZGVyIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBvZiB0aGlzIHdpZGdldCdzIGNsYXNzCiAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlciA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGJpbmRpbmdzID0gd2luZG93LkhUTUxXaWRnZXRzLndpZGdldHMgfHwgW107CiAgICBmb3JFYWNoKGJpbmRpbmdzLCBmdW5jdGlvbihiaW5kaW5nKSB7CiAgICAgIHZhciBtYXRjaGVzID0gYmluZGluZy5maW5kKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7CiAgICAgIGZvckVhY2gobWF0Y2hlcywgZnVuY3Rpb24oZWwpIHsKICAgICAgICB2YXIgc2l6ZU9iaiA9IGluaXRTaXppbmcoZWwsIGJpbmRpbmcpOwoKICAgICAgICBpZiAoaGFzQ2xhc3MoZWwsICJodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiKSkKICAgICAgICAgIHJldHVybjsKICAgICAgICBlbC5jbGFzc05hbWUgPSBlbC5jbGFzc05hbWUgKyAiIGh0bWwtd2lkZ2V0LXN0YXRpYy1ib3VuZCI7CgogICAgICAgIHZhciBpbml0UmVzdWx0OwogICAgICAgIGlmIChiaW5kaW5nLmluaXRpYWxpemUpIHsKICAgICAgICAgIGluaXRSZXN1bHQgPSBiaW5kaW5nLmluaXRpYWxpemUoZWwsCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgc2l6ZU9iaiA/IHNpemVPYmouZ2V0SGVpZ2h0KCkgOiBlbC5vZmZzZXRIZWlnaHQKICAgICAgICAgICk7CiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgaW5pdFJlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoYmluZGluZy5yZXNpemUpIHsKICAgICAgICAgIHZhciBsYXN0U2l6ZSA9IHt9OwogICAgICAgICAgdmFyIHJlc2l6ZUhhbmRsZXIgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIHZhciBzaXplID0gewogICAgICAgICAgICAgIHc6IHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgICBoOiBzaXplT2JqID8gc2l6ZU9iai5nZXRIZWlnaHQoKSA6IGVsLm9mZnNldEhlaWdodAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoc2l6ZS53ID09PSAwICYmIHNpemUuaCA9PT0gMCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGlmIChzaXplLncgPT09IGxhc3RTaXplLncgJiYgc2l6ZS5oID09PSBsYXN0U2l6ZS5oKQogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgbGFzdFNpemUgPSBzaXplOwogICAgICAgICAgICBiaW5kaW5nLnJlc2l6ZShlbCwgc2l6ZS53LCBzaXplLmgsIGluaXRSZXN1bHQpOwogICAgICAgICAgfTsKCiAgICAgICAgICBvbih3aW5kb3csICJyZXNpemUiLCByZXNpemVIYW5kbGVyKTsKCiAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgY2FzZXMgd2hlcmUgd2UncmUgcnVubmluZyBpbiBhIFNoaW55CiAgICAgICAgICAvLyBhcHAsIGJ1dCB0aGUgd2lkZ2V0IGl0c2VsZiBpcyBub3QgYSBTaGlueSBvdXRwdXQsIGJ1dAogICAgICAgICAgLy8gcmF0aGVyIGEgc2ltcGxlIHN0YXRpYyB3aWRnZXQuIE9uZSBleGFtcGxlIG9mIHRoaXMgaXMKICAgICAgICAgIC8vIGFuIHJtYXJrZG93biBkb2N1bWVudCB0aGF0IGhhcyBydW50aW1lOnNoaW55IGFuZCB3aWRnZXQKICAgICAgICAgIC8vIHRoYXQgaXNuJ3QgaW4gYSByZW5kZXIgZnVuY3Rpb24uIFNoaW55IG9ubHkga25vd3MgdG8KICAgICAgICAgIC8vIGNhbGwgcmVzaXplIGhhbmRsZXJzIGZvciBTaGlueSBvdXRwdXRzLCBub3QgZm9yIHN0YXRpYwogICAgICAgICAgLy8gd2lkZ2V0cywgc28gd2UgZG8gaXQgb3Vyc2VsdmVzLgogICAgICAgICAgaWYgKHdpbmRvdy5qUXVlcnkpIHsKICAgICAgICAgICAgd2luZG93LmpRdWVyeShkb2N1bWVudCkub24oInNob3duLmh0bWx3aWRnZXRzIHNob3duLmJzLnRhYi5odG1sd2lkZ2V0cyIsIHJlc2l6ZUhhbmRsZXIpOwogICAgICAgICAgICB3aW5kb3cualF1ZXJ5KGRvY3VtZW50KS5vbigiaGlkZGVuLmh0bWx3aWRnZXRzIGhpZGRlbi5icy50YWIuaHRtbHdpZGdldHMiLCByZXNpemVIYW5kbGVyKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlIHNwZWNpZmljIGNhc2Ugb2YgaW9zbGlkZXMsIHdoaWNoCiAgICAgICAgICAvLyBmbGlwcyBzbGlkZXMgYmV0d2VlbiBkaXNwbGF5Om5vbmUgYW5kIGRpc3BsYXk6YmxvY2suCiAgICAgICAgICAvLyBJZGVhbGx5IHdlIHdvdWxkIG5vdCBoYXZlIHRvIGhhdmUgaW9zbGlkZS1zcGVjaWZpYyBjb2RlCiAgICAgICAgICAvLyBoZXJlLCBidXQgcmF0aGVyIGhhdmUgaW9zbGlkZXMgcmFpc2UgYSBnZW5lcmljIGV2ZW50LAogICAgICAgICAgLy8gYnV0IHRoZSBybWFya2Rvd24gcGFja2FnZSBqdXN0IHdlbnQgdG8gQ1JBTiBzbyB0aGUKICAgICAgICAgIC8vIHdpbmRvdyB0byBnZXR0aW5nIHRoYXQgZml4ZWQgbWF5IGJlIGxvbmcuCiAgICAgICAgICBpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgICAgICAgICAgLy8gSXQncyBPSyB0byBsaW1pdCB0aGlzIHRvIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyCiAgICAgICAgICAgIC8vIGJyb3dzZXJzIGJlY2F1c2UgaW9zbGlkZXMgaXRzZWxmIG9ubHkgc3VwcG9ydHMKICAgICAgICAgICAgLy8gc3VjaCBicm93c2Vycy4KICAgICAgICAgICAgb24oZG9jdW1lbnQsICJzbGlkZWVudGVyIiwgcmVzaXplSGFuZGxlcik7CiAgICAgICAgICAgIG9uKGRvY3VtZW50LCAic2xpZGVsZWF2ZSIsIHJlc2l6ZUhhbmRsZXIpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdmFyIHNjcmlwdERhdGEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJzY3JpcHRbZGF0YS1mb3I9JyIgKyBlbC5pZCArICInXVt0eXBlPSdhcHBsaWNhdGlvbi9qc29uJ10iKTsKICAgICAgICBpZiAoc2NyaXB0RGF0YSkgewogICAgICAgICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKHNjcmlwdERhdGEudGV4dENvbnRlbnQgfHwgc2NyaXB0RGF0YS50ZXh0KTsKICAgICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzCiAgICAgICAgICBpZiAoIShkYXRhLmV2YWxzIGluc3RhbmNlb2YgQXJyYXkpKSBkYXRhLmV2YWxzID0gW2RhdGEuZXZhbHNdOwogICAgICAgICAgZm9yICh2YXIgayA9IDA7IGRhdGEuZXZhbHMgJiYgayA8IGRhdGEuZXZhbHMubGVuZ3RoOyBrKyspIHsKICAgICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1trXSk7CiAgICAgICAgICB9CiAgICAgICAgICBiaW5kaW5nLnJlbmRlclZhbHVlKGVsLCBkYXRhLngsIGluaXRSZXN1bHQpOwogICAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBpbml0UmVzdWx0LCBbZWwsIGRhdGEueF0pOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKCiAgICBpbnZva2VQb3N0UmVuZGVySGFuZGxlcnMoKTsKICB9CgogIC8vIFdhaXQgdW50aWwgYWZ0ZXIgdGhlIGRvY3VtZW50IGhhcyBsb2FkZWQgdG8gcmVuZGVyIHRoZSB3aWRnZXRzLgogIGlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSB7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24oKSB7CiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBhcmd1bWVudHMuY2FsbGVlLCBmYWxzZSk7CiAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsKICAgIH0sIGZhbHNlKTsKICB9IGVsc2UgaWYgKGRvY3VtZW50LmF0dGFjaEV2ZW50KSB7CiAgICBkb2N1bWVudC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgZnVuY3Rpb24oKSB7CiAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiKSB7CiAgICAgICAgZG9jdW1lbnQuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIGFyZ3VtZW50cy5jYWxsZWUpOwogICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsKICAgICAgfQogICAgfSk7CiAgfQoKCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEF0dGFjaG1lbnRVcmwgPSBmdW5jdGlvbihkZXBuYW1lLCBrZXkpIHsKICAgIC8vIElmIG5vIGtleSwgZGVmYXVsdCB0byB0aGUgZmlyc3QgaXRlbQogICAgaWYgKHR5cGVvZihrZXkpID09PSAidW5kZWZpbmVkIikKICAgICAga2V5ID0gMTsKCiAgICB2YXIgbGluayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRlcG5hbWUgKyAiLSIgKyBrZXkgKyAiLWF0dGFjaG1lbnQiKTsKICAgIGlmICghbGluaykgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIkF0dGFjaG1lbnQgIiArIGRlcG5hbWUgKyAiLyIgKyBrZXkgKyAiIG5vdCBmb3VuZCBpbiBkb2N1bWVudCIpOwogICAgfQogICAgcmV0dXJuIGxpbmsuZ2V0QXR0cmlidXRlKCJocmVmIik7CiAgfTsKCiAgd2luZG93LkhUTUxXaWRnZXRzLmRhdGFmcmFtZVRvRDMgPSBmdW5jdGlvbihkZikgewogICAgdmFyIG5hbWVzID0gW107CiAgICB2YXIgbGVuZ3RoOwogICAgZm9yICh2YXIgbmFtZSBpbiBkZikgewogICAgICAgIGlmIChkZi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkKICAgICAgICAgICAgbmFtZXMucHVzaChuYW1lKTsKICAgICAgICBpZiAodHlwZW9mKGRmW25hbWVdKSAhPT0gIm9iamVjdCIgfHwgdHlwZW9mKGRmW25hbWVdLmxlbmd0aCkgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxsIGZpZWxkcyBtdXN0IGJlIGFycmF5cyIpOwogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mKGxlbmd0aCkgIT09ICJ1bmRlZmluZWQiICYmIGxlbmd0aCAhPT0gZGZbbmFtZV0ubGVuZ3RoKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxsIGZpZWxkcyBtdXN0IGJlIGFycmF5cyBvZiB0aGUgc2FtZSBsZW5ndGgiKTsKICAgICAgICB9CiAgICAgICAgbGVuZ3RoID0gZGZbbmFtZV0ubGVuZ3RoOwogICAgfQogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIHZhciBpdGVtOwogICAgZm9yICh2YXIgcm93ID0gMDsgcm93IDwgbGVuZ3RoOyByb3crKykgewogICAgICAgIGl0ZW0gPSB7fTsKICAgICAgICBmb3IgKHZhciBjb2wgPSAwOyBjb2wgPCBuYW1lcy5sZW5ndGg7IGNvbCsrKSB7CiAgICAgICAgICAgIGl0ZW1bbmFtZXNbY29sXV0gPSBkZltuYW1lc1tjb2xdXVtyb3ddOwogICAgICAgIH0KICAgICAgICByZXN1bHRzLnB1c2goaXRlbSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICB3aW5kb3cuSFRNTFdpZGdldHMudHJhbnNwb3NlQXJyYXkyRCA9IGZ1bmN0aW9uKGFycmF5KSB7CiAgICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHJldHVybiBhcnJheTsKICAgICAgdmFyIG5ld0FycmF5ID0gYXJyYXlbMF0ubWFwKGZ1bmN0aW9uKGNvbCwgaSkgewogICAgICAgICAgcmV0dXJuIGFycmF5Lm1hcChmdW5jdGlvbihyb3cpIHsKICAgICAgICAgICAgICByZXR1cm4gcm93W2ldCiAgICAgICAgICB9KQogICAgICB9KTsKICAgICAgcmV0dXJuIG5ld0FycmF5OwogIH07CiAgLy8gU3BsaXQgdmFsdWUgYXQgc3BsaXRDaGFyLCBidXQgYWxsb3cgc3BsaXRDaGFyIHRvIGJlIGVzY2FwZWQKICAvLyB1c2luZyBlc2NhcGVDaGFyLiBBbnkgb3RoZXIgY2hhcmFjdGVycyBlc2NhcGVkIGJ5IGVzY2FwZUNoYXIKICAvLyB3aWxsIGJlIGluY2x1ZGVkIGFzIHVzdWFsIChpbmNsdWRpbmcgZXNjYXBlQ2hhciBpdHNlbGYpLgogIGZ1bmN0aW9uIHNwbGl0V2l0aEVzY2FwZSh2YWx1ZSwgc3BsaXRDaGFyLCBlc2NhcGVDaGFyKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgdmFyIGVzY2FwZU1vZGUgPSBmYWxzZTsKICAgIHZhciBjdXJyZW50UmVzdWx0ID0gIiI7CiAgICBmb3IgKHZhciBwb3MgPSAwOyBwb3MgPCB2YWx1ZS5sZW5ndGg7IHBvcysrKSB7CiAgICAgIGlmICghZXNjYXBlTW9kZSkgewogICAgICAgIGlmICh2YWx1ZVtwb3NdID09PSBzcGxpdENoYXIpIHsKICAgICAgICAgIHJlc3VsdHMucHVzaChjdXJyZW50UmVzdWx0KTsKICAgICAgICAgIGN1cnJlbnRSZXN1bHQgPSAiIjsKICAgICAgICB9IGVsc2UgaWYgKHZhbHVlW3Bvc10gPT09IGVzY2FwZUNoYXIpIHsKICAgICAgICAgIGVzY2FwZU1vZGUgPSB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdXJyZW50UmVzdWx0ICs9IHZhbHVlW3Bvc107CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGN1cnJlbnRSZXN1bHQgKz0gdmFsdWVbcG9zXTsKICAgICAgICBlc2NhcGVNb2RlID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGlmIChjdXJyZW50UmVzdWx0ICE9PSAiIikgewogICAgICByZXN1bHRzLnB1c2goY3VycmVudFJlc3VsdCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9CiAgLy8gRnVuY3Rpb24gYXV0aG9yZWQgYnkgWWlodWkvSkogQWxsYWlyZQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5ldmFsdWF0ZVN0cmluZ01lbWJlciA9IGZ1bmN0aW9uKG8sIG1lbWJlcikgewogICAgdmFyIHBhcnRzID0gc3BsaXRXaXRoRXNjYXBlKG1lbWJlciwgJy4nLCAnXFwnKTsKICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGFydHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIHZhciBwYXJ0ID0gcGFydHNbaV07CiAgICAgIC8vIHBhcnQgbWF5IGJlIGEgY2hhcmFjdGVyIG9yICdudW1lcmljJyBtZW1iZXIgbmFtZQogICAgICBpZiAobyAhPT0gbnVsbCAmJiB0eXBlb2YgbyA9PT0gIm9iamVjdCIgJiYgcGFydCBpbiBvKSB7CiAgICAgICAgaWYgKGkgPT0gKGwgLSAxKSkgeyAvLyBpZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSB0aGVuIGV2YWx1bGF0ZQogICAgICAgICAgaWYgKHR5cGVvZiBvW3BhcnRdID09PSAic3RyaW5nIikKICAgICAgICAgICAgb1twYXJ0XSA9IGV2YWwoIigiICsgb1twYXJ0XSArICIpIik7CiAgICAgICAgfSBlbHNlIHsgLy8gb3RoZXJ3aXNlIGNvbnRpbnVlIHRvIG5leHQgZW1iZWRkZWQgb2JqZWN0CiAgICAgICAgICBvID0gb1twYXJ0XTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9OwoKICAvLyBSZXRyaWV2ZSB0aGUgSFRNTFdpZGdldCBpbnN0YW5jZSAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlIG9mIGFuCiAgLy8gSFRNTFdpZGdldCBiaW5kaW5nJ3MgaW5pdGlhbGl6ZSgpIG9yIGZhY3RvcnkoKSBmdW5jdGlvbikKICAvLyBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudCwgb3IgbnVsbCBpZiBub25lLgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uKGVsKSB7CiAgICByZXR1cm4gZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpOwogIH07CgogIC8vIEZpbmRzIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBzY29wZSB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yLAogIC8vIGFuZCByZXR1cm5zIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlIChpLmUuIHRoZSByZXR1cm4gdmFsdWUgb2YKICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQogIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGVsZW1lbnQsIGlmIGFueS4gSWYgbm8gZWxlbWVudCBtYXRjaGVzIHRoZQogIC8vIHNlbGVjdG9yLCBvciB0aGUgZmlyc3QgbWF0Y2hpbmcgZWxlbWVudCBoYXMgbm8gSFRNTFdpZGdldAogIC8vIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBpdCwgdGhlbiBudWxsIGlzIHJldHVybmVkLgogIC8vCiAgLy8gVGhlIHNjb3BlIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCBhbmQgZGVmYXVsdHMgdG8gd2luZG93LmRvY3VtZW50LgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5maW5kID0gZnVuY3Rpb24oc2NvcGUsIHNlbGVjdG9yKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgIHNlbGVjdG9yID0gc2NvcGU7CiAgICAgIHNjb3BlID0gZG9jdW1lbnQ7CiAgICB9CgogICAgdmFyIGVsID0gc2NvcGUucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7CiAgICBpZiAoZWwgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gd2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlKGVsKTsKICAgIH0KICB9OwoKICAvLyBGaW5kcyBhbGwgZWxlbWVudHMgaW4gdGhlIHNjb3BlIHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yLCBhbmQKICAvLyByZXR1cm5zIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlcyAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlcyBvZgogIC8vIGFuIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pCiAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50cywgaW4gYW4gYXJyYXkuIElmIGVsZW1lbnRzIHRoYXQKICAvLyBtYXRjaCB0aGUgc2VsZWN0b3IgZG9uJ3QgaGF2ZSBhbiBhc3NvY2lhdGVkIEhUTUxXaWRnZXQKICAvLyBpbnN0YW5jZSwgdGhlIHJldHVybmVkIGFycmF5IHdpbGwgY29udGFpbiBudWxscy4KICAvLwogIC8vIFRoZSBzY29wZSBhcmd1bWVudCBpcyBvcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIHdpbmRvdy5kb2N1bWVudC4KICB3aW5kb3cuSFRNTFdpZGdldHMuZmluZEFsbCA9IGZ1bmN0aW9uKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgewogICAgICBzZWxlY3RvciA9IHNjb3BlOwogICAgICBzY29wZSA9IGRvY3VtZW50OwogICAgfQoKICAgIHZhciBub2RlcyA9IHNjb3BlLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOwogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0cy5wdXNoKHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZShub2Rlc1tpXSkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfTsKCiAgdmFyIHBvc3RSZW5kZXJIYW5kbGVycyA9IFtdOwogIGZ1bmN0aW9uIGludm9rZVBvc3RSZW5kZXJIYW5kbGVycygpIHsKICAgIHdoaWxlIChwb3N0UmVuZGVySGFuZGxlcnMubGVuZ3RoKSB7CiAgICAgIHZhciBoYW5kbGVyID0gcG9zdFJlbmRlckhhbmRsZXJzLnNoaWZ0KCk7CiAgICAgIGlmIChoYW5kbGVyKSB7CiAgICAgICAgaGFuZGxlcigpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZWdpc3RlciB0aGUgZ2l2ZW4gY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgaW52b2tlZCBhZnRlciB0aGUKICAvLyBuZXh0IHRpbWUgc3RhdGljIHdpZGdldHMgYXJlIHJlbmRlcmVkLgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5hZGRQb3N0UmVuZGVySGFuZGxlciA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICBwb3N0UmVuZGVySGFuZGxlcnMucHVzaChjYWxsYmFjayk7CiAgfTsKCiAgLy8gVGFrZXMgYSBuZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbiwgYW5kIHJldHVybnMgYW4KICAvLyBvbGQtc3R5bGUgY2xhc3MtYm91bmQgZGVmaW5pdGlvbi4gVGhpcyBzYXZlcyB1cyBmcm9tIGhhdmluZwogIC8vIHRvIHJld3JpdGUgYWxsIHRoZSBsb2dpYyBpbiB0aGlzIGZpbGUgdG8gYWNjb21vZGF0ZSBib3RoCiAgLy8gdHlwZXMgb2YgZGVmaW5pdGlvbnMuCiAgZnVuY3Rpb24gY3JlYXRlTGVnYWN5RGVmaW5pdGlvbkFkYXB0ZXIoZGVmbikgewogICAgdmFyIHJlc3VsdCA9IHsKICAgICAgbmFtZTogZGVmbi5uYW1lLAogICAgICB0eXBlOiBkZWZuLnR5cGUsCiAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgcmV0dXJuIGRlZm4uZmFjdG9yeShlbCwgd2lkdGgsIGhlaWdodCk7CiAgICAgIH0sCiAgICAgIHJlbmRlclZhbHVlOiBmdW5jdGlvbihlbCwgeCwgaW5zdGFuY2UpIHsKICAgICAgICByZXR1cm4gaW5zdGFuY2UucmVuZGVyVmFsdWUoeCk7CiAgICAgIH0sCiAgICAgIHJlc2l6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQsIGluc3RhbmNlKSB7CiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnJlc2l6ZSh3aWR0aCwgaGVpZ2h0KTsKICAgICAgfQogICAgfTsKCiAgICBpZiAoZGVmbi5maW5kKQogICAgICByZXN1bHQuZmluZCA9IGRlZm4uZmluZDsKICAgIGlmIChkZWZuLnJlbmRlckVycm9yKQogICAgICByZXN1bHQucmVuZGVyRXJyb3IgPSBkZWZuLnJlbmRlckVycm9yOwogICAgaWYgKGRlZm4uY2xlYXJFcnJvcikKICAgICAgcmVzdWx0LmNsZWFyRXJyb3IgPSBkZWZuLmNsZWFyRXJyb3I7CgogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0pKCk7Cgo="></script>
<script src="data:application/x-javascript;base64,IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbiYmKG4ub3duZXJEb2N1bWVudHx8bi5kb2N1bWVudHx8bikuZG9jdW1lbnRFbGVtZW50fWZ1bmN0aW9uIHQobil7cmV0dXJuIG4mJihuLm93bmVyRG9jdW1lbnQmJm4ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8bi5kb2N1bWVudCYmbnx8bi5kZWZhdWx0Vmlldyl9ZnVuY3Rpb24gZShuLHQpe3JldHVybiB0Pm4/LTE6bj50PzE6bj49dD8wOjAvMH1mdW5jdGlvbiByKG4pe3JldHVybiBudWxsPT09bj8wLzA6K259ZnVuY3Rpb24gdShuKXtyZXR1cm4haXNOYU4obil9ZnVuY3Rpb24gaShuKXtyZXR1cm57bGVmdDpmdW5jdGlvbih0LGUscix1KXtmb3IoYXJndW1lbnRzLmxlbmd0aDwzJiYocj0wKSxhcmd1bWVudHMubGVuZ3RoPDQmJih1PXQubGVuZ3RoKTt1PnI7KXt2YXIgaT1yK3U+Pj4xO24odFtpXSxlKTwwP3I9aSsxOnU9aX1yZXR1cm4gcn0scmlnaHQ6ZnVuY3Rpb24odCxlLHIsdSl7Zm9yKGFyZ3VtZW50cy5sZW5ndGg8MyYmKHI9MCksYXJndW1lbnRzLmxlbmd0aDw0JiYodT10Lmxlbmd0aCk7dT5yOyl7dmFyIGk9cit1Pj4+MTtuKHRbaV0sZSk+MD91PWk6cj1pKzF9cmV0dXJuIHJ9fX1mdW5jdGlvbiBvKG4pe3JldHVybiBuLmxlbmd0aH1mdW5jdGlvbiBhKG4pe2Zvcih2YXIgdD0xO24qdCUxOyl0Kj0xMDtyZXR1cm4gdH1mdW5jdGlvbiBjKG4sdCl7Zm9yKHZhciBlIGluIHQpT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLGUse3ZhbHVlOnRbZV0sZW51bWVyYWJsZTohMX0pfWZ1bmN0aW9uIGwoKXt0aGlzLl89T2JqZWN0LmNyZWF0ZShudWxsKX1mdW5jdGlvbiBzKG4pe3JldHVybihuKz0iIik9PT1wYXx8blswXT09PXZhP3ZhK246bn1mdW5jdGlvbiBmKG4pe3JldHVybihuKz0iIilbMF09PT12YT9uLnNsaWNlKDEpOm59ZnVuY3Rpb24gaChuKXtyZXR1cm4gcyhuKWluIHRoaXMuX31mdW5jdGlvbiBnKG4pe3JldHVybihuPXMobikpaW4gdGhpcy5fJiZkZWxldGUgdGhpcy5fW25dfWZ1bmN0aW9uIHAoKXt2YXIgbj1bXTtmb3IodmFyIHQgaW4gdGhpcy5fKW4ucHVzaChmKHQpKTtyZXR1cm4gbn1mdW5jdGlvbiB2KCl7dmFyIG49MDtmb3IodmFyIHQgaW4gdGhpcy5fKSsrbjtyZXR1cm4gbn1mdW5jdGlvbiBkKCl7Zm9yKHZhciBuIGluIHRoaXMuXylyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBtKCl7dGhpcy5fPU9iamVjdC5jcmVhdGUobnVsbCl9ZnVuY3Rpb24geShuKXtyZXR1cm4gbn1mdW5jdGlvbiBNKG4sdCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1lLmFwcGx5KHQsYXJndW1lbnRzKTtyZXR1cm4gcj09PXQ/bjpyfX1mdW5jdGlvbiB4KG4sdCl7aWYodCBpbiBuKXJldHVybiB0O3Q9dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpO2Zvcih2YXIgZT0wLHI9ZGEubGVuZ3RoO3I+ZTsrK2Upe3ZhciB1PWRhW2VdK3Q7aWYodSBpbiBuKXJldHVybiB1fX1mdW5jdGlvbiBiKCl7fWZ1bmN0aW9uIF8oKXt9ZnVuY3Rpb24gdyhuKXtmdW5jdGlvbiB0KCl7Zm9yKHZhciB0LHI9ZSx1PS0xLGk9ci5sZW5ndGg7Kyt1PGk7KSh0PXJbdV0ub24pJiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbn12YXIgZT1bXSxyPW5ldyBsO3JldHVybiB0Lm9uPWZ1bmN0aW9uKHQsdSl7dmFyIGksbz1yLmdldCh0KTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP28mJm8ub246KG8mJihvLm9uPW51bGwsZT1lLnNsaWNlKDAsaT1lLmluZGV4T2YobykpLmNvbmNhdChlLnNsaWNlKGkrMSkpLHIucmVtb3ZlKHQpKSx1JiZlLnB1c2goci5zZXQodCx7b246dX0pKSxuKX0sdH1mdW5jdGlvbiBTKCl7dGEuZXZlbnQucHJldmVudERlZmF1bHQoKX1mdW5jdGlvbiBrKCl7Zm9yKHZhciBuLHQ9dGEuZXZlbnQ7bj10LnNvdXJjZUV2ZW50Oyl0PW47cmV0dXJuIHR9ZnVuY3Rpb24gRShuKXtmb3IodmFyIHQ9bmV3IF8sZT0wLHI9YXJndW1lbnRzLmxlbmd0aDsrK2U8cjspdFthcmd1bWVudHNbZV1dPXcodCk7cmV0dXJuIHQub2Y9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZnVuY3Rpb24odSl7dHJ5e3ZhciBpPXUuc291cmNlRXZlbnQ9dGEuZXZlbnQ7dS50YXJnZXQ9bix0YS5ldmVudD11LHRbdS50eXBlXS5hcHBseShlLHIpfWZpbmFsbHl7dGEuZXZlbnQ9aX19fSx0fWZ1bmN0aW9uIEEobil7cmV0dXJuIHlhKG4sX2EpLG59ZnVuY3Rpb24gTihuKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmZ1bmN0aW9uKCl7cmV0dXJuIE1hKG4sdGhpcyl9fWZ1bmN0aW9uIEMobil7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpmdW5jdGlvbigpe3JldHVybiB4YShuLHRoaXMpfX1mdW5jdGlvbiB6KG4sdCl7ZnVuY3Rpb24gZSgpe3RoaXMucmVtb3ZlQXR0cmlidXRlKG4pfWZ1bmN0aW9uIHIoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCl9ZnVuY3Rpb24gdSgpe3RoaXMuc2V0QXR0cmlidXRlKG4sdCl9ZnVuY3Rpb24gaSgpe3RoaXMuc2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsLHQpfWZ1bmN0aW9uIG8oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlKG4pOnRoaXMuc2V0QXR0cmlidXRlKG4sZSl9ZnVuY3Rpb24gYSgpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpOnRoaXMuc2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsLGUpfXJldHVybiBuPXRhLm5zLnF1YWxpZnkobiksbnVsbD09dD9uLmxvY2FsP3I6ZToiZnVuY3Rpb24iPT10eXBlb2YgdD9uLmxvY2FsP2E6bzpuLmxvY2FsP2k6dX1mdW5jdGlvbiBxKG4pe3JldHVybiBuLnRyaW0oKS5yZXBsYWNlKC9ccysvZywiICIpfWZ1bmN0aW9uIEwobil7cmV0dXJuIG5ldyBSZWdFeHAoIig/Ol58XFxzKykiK3RhLnJlcXVvdGUobikrIig/Olxccyt8JCkiLCJnIil9ZnVuY3Rpb24gVChuKXtyZXR1cm4obisiIikudHJpbSgpLnNwbGl0KC9efFxzKy8pfWZ1bmN0aW9uIFIobix0KXtmdW5jdGlvbiBlKCl7Zm9yKHZhciBlPS0xOysrZTx1OyluW2VdKHRoaXMsdCl9ZnVuY3Rpb24gcigpe2Zvcih2YXIgZT0tMSxyPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpOysrZTx1OyluW2VdKHRoaXMscil9bj1UKG4pLm1hcChEKTt2YXIgdT1uLmxlbmd0aDtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD9yOmV9ZnVuY3Rpb24gRChuKXt2YXIgdD1MKG4pO3JldHVybiBmdW5jdGlvbihlLHIpe2lmKHU9ZS5jbGFzc0xpc3QpcmV0dXJuIHI/dS5hZGQobik6dS5yZW1vdmUobik7dmFyIHU9ZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiO3I/KHQubGFzdEluZGV4PTAsdC50ZXN0KHUpfHxlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHEodSsiICIrbikpKTplLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHEodS5yZXBsYWNlKHQsIiAiKSkpfX1mdW5jdGlvbiBQKG4sdCxlKXtmdW5jdGlvbiByKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKX1mdW5jdGlvbiB1KCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLHQsZSl9ZnVuY3Rpb24gaSgpe3ZhciByPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PXI/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KG4scixlKX1yZXR1cm4gbnVsbD09dD9yOiJmdW5jdGlvbiI9PXR5cGVvZiB0P2k6dX1mdW5jdGlvbiBVKG4sdCl7ZnVuY3Rpb24gZSgpe2RlbGV0ZSB0aGlzW25dfWZ1bmN0aW9uIHIoKXt0aGlzW25dPXR9ZnVuY3Rpb24gdSgpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/ZGVsZXRlIHRoaXNbbl06dGhpc1tuXT1lfXJldHVybiBudWxsPT10P2U6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dTpyfWZ1bmN0aW9uIGoobil7ZnVuY3Rpb24gdCgpe3ZhciB0PXRoaXMub3duZXJEb2N1bWVudCxlPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBlP3QuY3JlYXRlRWxlbWVudE5TKGUsbik6dC5jcmVhdGVFbGVtZW50KG4pfWZ1bmN0aW9uIGUoKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuLnNwYWNlLG4ubG9jYWwpfXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246KG49dGEubnMucXVhbGlmeShuKSkubG9jYWw/ZTp0fWZ1bmN0aW9uIEYoKXt2YXIgbj10aGlzLnBhcmVudE5vZGU7biYmbi5yZW1vdmVDaGlsZCh0aGlzKX1mdW5jdGlvbiBIKG4pe3JldHVybntfX2RhdGFfXzpufX1mdW5jdGlvbiBPKG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiYSh0aGlzLG4pfX1mdW5jdGlvbiBJKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RofHwobj1lKSxmdW5jdGlvbih0LGUpe3JldHVybiB0JiZlP24odC5fX2RhdGFfXyxlLl9fZGF0YV9fKTohdC0hZX19ZnVuY3Rpb24gWShuLHQpe2Zvcih2YXIgZT0wLHI9bi5sZW5ndGg7cj5lO2UrKylmb3IodmFyIHUsaT1uW2VdLG89MCxhPWkubGVuZ3RoO2E+bztvKyspKHU9aVtvXSkmJnQodSxvLGUpO3JldHVybiBufWZ1bmN0aW9uIFoobil7cmV0dXJuIHlhKG4sU2EpLG59ZnVuY3Rpb24gVihuKXt2YXIgdCxlO3JldHVybiBmdW5jdGlvbihyLHUsaSl7dmFyIG8sYT1uW2ldLnVwZGF0ZSxjPWEubGVuZ3RoO2ZvcihpIT1lJiYoZT1pLHQ9MCksdT49dCYmKHQ9dSsxKTshKG89YVt0XSkmJisrdDxjOyk7cmV0dXJuIG99fWZ1bmN0aW9uIFgobix0LGUpe2Z1bmN0aW9uIHIoKXt2YXIgdD10aGlzW29dO3QmJih0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIobix0LHQuJCksZGVsZXRlIHRoaXNbb10pfWZ1bmN0aW9uIHUoKXt2YXIgdT1jKHQscmEoYXJndW1lbnRzKSk7ci5jYWxsKHRoaXMpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihuLHRoaXNbb109dSx1LiQ9ZSksdS5fPXR9ZnVuY3Rpb24gaSgpe3ZhciB0LGU9bmV3IFJlZ0V4cCgiXl9fb24oW14uXSspIit0YS5yZXF1b3RlKG4pKyIkIik7Zm9yKHZhciByIGluIHRoaXMpaWYodD1yLm1hdGNoKGUpKXt2YXIgdT10aGlzW3JdO3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0WzFdLHUsdS4kKSxkZWxldGUgdGhpc1tyXX19dmFyIG89Il9fb24iK24sYT1uLmluZGV4T2YoIi4iKSxjPSQ7YT4wJiYobj1uLnNsaWNlKDAsYSkpO3ZhciBsPWthLmdldChuKTtyZXR1cm4gbCYmKG49bCxjPUIpLGE/dD91OnI6dD9iOml9ZnVuY3Rpb24gJChuLHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj10YS5ldmVudDt0YS5ldmVudD1lLHRbMF09dGhpcy5fX2RhdGFfXzt0cnl7bi5hcHBseSh0aGlzLHQpfWZpbmFsbHl7dGEuZXZlbnQ9cn19fWZ1bmN0aW9uIEIobix0KXt2YXIgZT0kKG4sdCk7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMscj1uLnJlbGF0ZWRUYXJnZXQ7ciYmKHI9PT10fHw4JnIuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCkpfHxlLmNhbGwodCxuKX19ZnVuY3Rpb24gVyhlKXt2YXIgcj0iLmRyYWdzdXBwcmVzcy0iKyArK0FhLHU9ImNsaWNrIityLGk9dGEuc2VsZWN0KHQoZSkpLm9uKCJ0b3VjaG1vdmUiK3IsUykub24oImRyYWdzdGFydCIrcixTKS5vbigic2VsZWN0c3RhcnQiK3IsUyk7aWYobnVsbD09RWEmJihFYT0ib25zZWxlY3RzdGFydCJpbiBlPyExOngoZS5zdHlsZSwidXNlclNlbGVjdCIpKSxFYSl7dmFyIG89bihlKS5zdHlsZSxhPW9bRWFdO29bRWFdPSJub25lIn1yZXR1cm4gZnVuY3Rpb24obil7aWYoaS5vbihyLG51bGwpLEVhJiYob1tFYV09YSksbil7dmFyIHQ9ZnVuY3Rpb24oKXtpLm9uKHUsbnVsbCl9O2kub24odSxmdW5jdGlvbigpe1MoKSx0KCl9LCEwKSxzZXRUaW1lb3V0KHQsMCl9fX1mdW5jdGlvbiBKKG4sZSl7ZS5jaGFuZ2VkVG91Y2hlcyYmKGU9ZS5jaGFuZ2VkVG91Y2hlc1swXSk7dmFyIHI9bi5vd25lclNWR0VsZW1lbnR8fG47aWYoci5jcmVhdGVTVkdQb2ludCl7dmFyIHU9ci5jcmVhdGVTVkdQb2ludCgpO2lmKDA+TmEpe3ZhciBpPXQobik7aWYoaS5zY3JvbGxYfHxpLnNjcm9sbFkpe3I9dGEuc2VsZWN0KCJib2R5IikuYXBwZW5kKCJzdmciKS5zdHlsZSh7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAsbWFyZ2luOjAscGFkZGluZzowLGJvcmRlcjoibm9uZSJ9LCJpbXBvcnRhbnQiKTt2YXIgbz1yWzBdWzBdLmdldFNjcmVlbkNUTSgpO05hPSEoby5mfHxvLmUpLHIucmVtb3ZlKCl9fXJldHVybiBOYT8odS54PWUucGFnZVgsdS55PWUucGFnZVkpOih1Lng9ZS5jbGllbnRYLHUueT1lLmNsaWVudFkpLHU9dS5tYXRyaXhUcmFuc2Zvcm0obi5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpLFt1LngsdS55XX12YXIgYT1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybltlLmNsaWVudFgtYS5sZWZ0LW4uY2xpZW50TGVmdCxlLmNsaWVudFktYS50b3Atbi5jbGllbnRUb3BdfWZ1bmN0aW9uIEcoKXtyZXR1cm4gdGEuZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcn1mdW5jdGlvbiBLKG4pe3JldHVybiBuPjA/MTowPm4/LTE6MH1mdW5jdGlvbiBRKG4sdCxlKXtyZXR1cm4odFswXS1uWzBdKSooZVsxXS1uWzFdKS0odFsxXS1uWzFdKSooZVswXS1uWzBdKX1mdW5jdGlvbiBudChuKXtyZXR1cm4gbj4xPzA6LTE+bj9xYTpNYXRoLmFjb3Mobil9ZnVuY3Rpb24gdHQobil7cmV0dXJuIG4+MT9SYTotMT5uPy1SYTpNYXRoLmFzaW4obil9ZnVuY3Rpb24gZXQobil7cmV0dXJuKChuPU1hdGguZXhwKG4pKS0xL24pLzJ9ZnVuY3Rpb24gcnQobil7cmV0dXJuKChuPU1hdGguZXhwKG4pKSsxL24pLzJ9ZnVuY3Rpb24gdXQobil7cmV0dXJuKChuPU1hdGguZXhwKDIqbikpLTEpLyhuKzEpfWZ1bmN0aW9uIGl0KG4pe3JldHVybihuPU1hdGguc2luKG4vMikpKm59ZnVuY3Rpb24gb3QoKXt9ZnVuY3Rpb24gYXQobix0LGUpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgYXQ/KHRoaXMuaD0rbix0aGlzLnM9K3Qsdm9pZCh0aGlzLmw9K2UpKTphcmd1bWVudHMubGVuZ3RoPDI/biBpbnN0YW5jZW9mIGF0P25ldyBhdChuLmgsbi5zLG4ubCk6YnQoIiIrbixfdCxhdCk6bmV3IGF0KG4sdCxlKX1mdW5jdGlvbiBjdChuLHQsZSl7ZnVuY3Rpb24gcihuKXtyZXR1cm4gbj4zNjA/bi09MzYwOjA+biYmKG4rPTM2MCksNjA+bj9pKyhvLWkpKm4vNjA6MTgwPm4/bzoyNDA+bj9pKyhvLWkpKigyNDAtbikvNjA6aX1mdW5jdGlvbiB1KG4pe3JldHVybiBNYXRoLnJvdW5kKDI1NSpyKG4pKX12YXIgaSxvO3JldHVybiBuPWlzTmFOKG4pPzA6KG4lPTM2MCk8MD9uKzM2MDpuLHQ9aXNOYU4odCk/MDowPnQ/MDp0PjE/MTp0LGU9MD5lPzA6ZT4xPzE6ZSxvPS41Pj1lP2UqKDErdCk6ZSt0LWUqdCxpPTIqZS1vLG5ldyBtdCh1KG4rMTIwKSx1KG4pLHUobi0xMjApKX1mdW5jdGlvbiBsdChuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBsdD8odGhpcy5oPStuLHRoaXMuYz0rdCx2b2lkKHRoaXMubD0rZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgbHQ/bmV3IGx0KG4uaCxuLmMsbi5sKTpuIGluc3RhbmNlb2YgZnQ/Z3Qobi5sLG4uYSxuLmIpOmd0KChuPXd0KChuPXRhLnJnYihuKSkucixuLmcsbi5iKSkubCxuLmEsbi5iKTpuZXcgbHQobix0LGUpfWZ1bmN0aW9uIHN0KG4sdCxlKXtyZXR1cm4gaXNOYU4obikmJihuPTApLGlzTmFOKHQpJiYodD0wKSxuZXcgZnQoZSxNYXRoLmNvcyhuKj1EYSkqdCxNYXRoLnNpbihuKSp0KX1mdW5jdGlvbiBmdChuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBmdD8odGhpcy5sPStuLHRoaXMuYT0rdCx2b2lkKHRoaXMuYj0rZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgZnQ/bmV3IGZ0KG4ubCxuLmEsbi5iKTpuIGluc3RhbmNlb2YgbHQ/c3Qobi5oLG4uYyxuLmwpOnd0KChuPW10KG4pKS5yLG4uZyxuLmIpOm5ldyBmdChuLHQsZSl9ZnVuY3Rpb24gaHQobix0LGUpe3ZhciByPShuKzE2KS8xMTYsdT1yK3QvNTAwLGk9ci1lLzIwMDtyZXR1cm4gdT1wdCh1KSpYYSxyPXB0KHIpKiRhLGk9cHQoaSkqQmEsbmV3IG10KGR0KDMuMjQwNDU0Mip1LTEuNTM3MTM4NSpyLS40OTg1MzE0KmkpLGR0KC0uOTY5MjY2KnUrMS44NzYwMTA4KnIrLjA0MTU1NippKSxkdCguMDU1NjQzNCp1LS4yMDQwMjU5KnIrMS4wNTcyMjUyKmkpKX1mdW5jdGlvbiBndChuLHQsZSl7cmV0dXJuIG4+MD9uZXcgbHQoTWF0aC5hdGFuMihlLHQpKlBhLE1hdGguc3FydCh0KnQrZSplKSxuKTpuZXcgbHQoMC8wLDAvMCxuKX1mdW5jdGlvbiBwdChuKXtyZXR1cm4gbj4uMjA2ODkzMDM0P24qbipuOihuLTQvMjkpLzcuNzg3MDM3fWZ1bmN0aW9uIHZ0KG4pe3JldHVybiBuPi4wMDg4NTY/TWF0aC5wb3cobiwxLzMpOjcuNzg3MDM3Km4rNC8yOX1mdW5jdGlvbiBkdChuKXtyZXR1cm4gTWF0aC5yb3VuZCgyNTUqKC4wMDMwND49bj8xMi45MipuOjEuMDU1Kk1hdGgucG93KG4sMS8yLjQpLS4wNTUpKX1mdW5jdGlvbiBtdChuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBtdD8odGhpcy5yPX5+bix0aGlzLmc9fn50LHZvaWQodGhpcy5iPX5+ZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgbXQ/bmV3IG10KG4ucixuLmcsbi5iKTpidCgiIituLG10LGN0KTpuZXcgbXQobix0LGUpfWZ1bmN0aW9uIHl0KG4pe3JldHVybiBuZXcgbXQobj4+MTYsbj4+OCYyNTUsMjU1Jm4pfWZ1bmN0aW9uIE10KG4pe3JldHVybiB5dChuKSsiIn1mdW5jdGlvbiB4dChuKXtyZXR1cm4gMTY+bj8iMCIrTWF0aC5tYXgoMCxuKS50b1N0cmluZygxNik6TWF0aC5taW4oMjU1LG4pLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBidChuLHQsZSl7dmFyIHIsdSxpLG89MCxhPTAsYz0wO2lmKHI9LyhbYS16XSspXCgoLiopXCkvaS5leGVjKG4pKXN3aXRjaCh1PXJbMl0uc3BsaXQoIiwiKSxyWzFdKXtjYXNlImhzbCI6cmV0dXJuIGUocGFyc2VGbG9hdCh1WzBdKSxwYXJzZUZsb2F0KHVbMV0pLzEwMCxwYXJzZUZsb2F0KHVbMl0pLzEwMCk7Y2FzZSJyZ2IiOnJldHVybiB0KGt0KHVbMF0pLGt0KHVbMV0pLGt0KHVbMl0pKX1yZXR1cm4oaT1HYS5nZXQobi50b0xvd2VyQ2FzZSgpKSk/dChpLnIsaS5nLGkuYik6KG51bGw9PW58fCIjIiE9PW4uY2hhckF0KDApfHxpc05hTihpPXBhcnNlSW50KG4uc2xpY2UoMSksMTYpKXx8KDQ9PT1uLmxlbmd0aD8obz0oMzg0MCZpKT4+NCxvPW8+PjR8byxhPTI0MCZpLGE9YT4+NHxhLGM9MTUmaSxjPWM8PDR8Yyk6Nz09PW4ubGVuZ3RoJiYobz0oMTY3MTE2ODAmaSk+PjE2LGE9KDY1MjgwJmkpPj44LGM9MjU1JmkpKSx0KG8sYSxjKSl9ZnVuY3Rpb24gX3Qobix0LGUpe3ZhciByLHUsaT1NYXRoLm1pbihuLz0yNTUsdC89MjU1LGUvPTI1NSksbz1NYXRoLm1heChuLHQsZSksYT1vLWksYz0obytpKS8yO3JldHVybiBhPyh1PS41PmM/YS8obytpKTphLygyLW8taSkscj1uPT1vPyh0LWUpL2ErKGU+dD82OjApOnQ9PW8/KGUtbikvYSsyOihuLXQpL2ErNCxyKj02MCk6KHI9MC8wLHU9Yz4wJiYxPmM/MDpyKSxuZXcgYXQocix1LGMpfWZ1bmN0aW9uIHd0KG4sdCxlKXtuPVN0KG4pLHQ9U3QodCksZT1TdChlKTt2YXIgcj12dCgoLjQxMjQ1NjQqbisuMzU3NTc2MSp0Ky4xODA0Mzc1KmUpL1hhKSx1PXZ0KCguMjEyNjcyOSpuKy43MTUxNTIyKnQrLjA3MjE3NSplKS8kYSksaT12dCgoLjAxOTMzMzkqbisuMTE5MTkyKnQrLjk1MDMwNDEqZSkvQmEpO3JldHVybiBmdCgxMTYqdS0xNiw1MDAqKHItdSksMjAwKih1LWkpKX1mdW5jdGlvbiBTdChuKXtyZXR1cm4obi89MjU1KTw9LjA0MDQ1P24vMTIuOTI6TWF0aC5wb3coKG4rLjA1NSkvMS4wNTUsMi40KX1mdW5jdGlvbiBrdChuKXt2YXIgdD1wYXJzZUZsb2F0KG4pO3JldHVybiIlIj09PW4uY2hhckF0KG4ubGVuZ3RoLTEpP01hdGgucm91bmQoMi41NSp0KTp0fWZ1bmN0aW9uIEV0KG4pe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246ZnVuY3Rpb24oKXtyZXR1cm4gbn19ZnVuY3Rpb24gQXQobil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gMj09PWFyZ3VtZW50cy5sZW5ndGgmJiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9bnVsbCksTnQodCxlLG4scil9fWZ1bmN0aW9uIE50KG4sdCxlLHIpe2Z1bmN0aW9uIHUoKXt2YXIgbix0PWMuc3RhdHVzO2lmKCF0JiZ6dChjKXx8dD49MjAwJiYzMDA+dHx8MzA0PT09dCl7dHJ5e249ZS5jYWxsKGksYyl9Y2F0Y2gocil7cmV0dXJuIHZvaWQgby5lcnJvci5jYWxsKGkscil9by5sb2FkLmNhbGwoaSxuKX1lbHNlIG8uZXJyb3IuY2FsbChpLGMpfXZhciBpPXt9LG89dGEuZGlzcGF0Y2goImJlZm9yZXNlbmQiLCJwcm9ncmVzcyIsImxvYWQiLCJlcnJvciIpLGE9e30sYz1uZXcgWE1MSHR0cFJlcXVlc3QsbD1udWxsO3JldHVybiF0aGlzLlhEb21haW5SZXF1ZXN0fHwid2l0aENyZWRlbnRpYWxzImluIGN8fCEvXihodHRwKHMpPzopP1wvXC8vLnRlc3Qobil8fChjPW5ldyBYRG9tYWluUmVxdWVzdCksIm9ubG9hZCJpbiBjP2Mub25sb2FkPWMub25lcnJvcj11OmMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7Yy5yZWFkeVN0YXRlPjMmJnUoKX0sYy5vbnByb2dyZXNzPWZ1bmN0aW9uKG4pe3ZhciB0PXRhLmV2ZW50O3RhLmV2ZW50PW47dHJ5e28ucHJvZ3Jlc3MuY2FsbChpLGMpfWZpbmFsbHl7dGEuZXZlbnQ9dH19LGkuaGVhZGVyPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49KG4rIiIpLnRvTG93ZXJDYXNlKCksYXJndW1lbnRzLmxlbmd0aDwyP2Fbbl06KG51bGw9PXQ/ZGVsZXRlIGFbbl06YVtuXT10KyIiLGkpfSxpLm1pbWVUeXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PW4/bnVsbDpuKyIiLGkpOnR9LGkucmVzcG9uc2VUeXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4saSk6bH0saS5yZXNwb25zZT1mdW5jdGlvbihuKXtyZXR1cm4gZT1uLGl9LFsiZ2V0IiwicG9zdCJdLmZvckVhY2goZnVuY3Rpb24obil7aVtuXT1mdW5jdGlvbigpe3JldHVybiBpLnNlbmQuYXBwbHkoaSxbbl0uY29uY2F0KHJhKGFyZ3VtZW50cykpKX19KSxpLnNlbmQ9ZnVuY3Rpb24oZSxyLHUpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgciYmKHU9cixyPW51bGwpLGMub3BlbihlLG4sITApLG51bGw9PXR8fCJhY2NlcHQiaW4gYXx8KGEuYWNjZXB0PXQrIiwqLyoiKSxjLnNldFJlcXVlc3RIZWFkZXIpZm9yKHZhciBzIGluIGEpYy5zZXRSZXF1ZXN0SGVhZGVyKHMsYVtzXSk7cmV0dXJuIG51bGwhPXQmJmMub3ZlcnJpZGVNaW1lVHlwZSYmYy5vdmVycmlkZU1pbWVUeXBlKHQpLG51bGwhPWwmJihjLnJlc3BvbnNlVHlwZT1sKSxudWxsIT11JiZpLm9uKCJlcnJvciIsdSkub24oImxvYWQiLGZ1bmN0aW9uKG4pe3UobnVsbCxuKX0pLG8uYmVmb3Jlc2VuZC5jYWxsKGksYyksYy5zZW5kKG51bGw9PXI/bnVsbDpyKSxpfSxpLmFib3J0PWZ1bmN0aW9uKCl7cmV0dXJuIGMuYWJvcnQoKSxpfSx0YS5yZWJpbmQoaSxvLCJvbiIpLG51bGw9PXI/aTppLmdldChDdChyKSl9ZnVuY3Rpb24gQ3Qobil7cmV0dXJuIDE9PT1uLmxlbmd0aD9mdW5jdGlvbih0LGUpe24obnVsbD09dD9lOm51bGwpfTpufWZ1bmN0aW9uIHp0KG4pe3ZhciB0PW4ucmVzcG9uc2VUeXBlO3JldHVybiB0JiYidGV4dCIhPT10P24ucmVzcG9uc2U6bi5yZXNwb25zZVRleHR9ZnVuY3Rpb24gcXQoKXt2YXIgbj1MdCgpLHQ9VHQoKS1uO3Q+MjQ/KGlzRmluaXRlKHQpJiYoY2xlYXJUaW1lb3V0KHRjKSx0Yz1zZXRUaW1lb3V0KHF0LHQpKSxuYz0wKToobmM9MSxyYyhxdCkpfWZ1bmN0aW9uIEx0KCl7dmFyIG49RGF0ZS5ub3coKTtmb3IoZWM9S2E7ZWM7KW4+PWVjLnQmJihlYy5mPWVjLmMobi1lYy50KSksZWM9ZWMubjtyZXR1cm4gbn1mdW5jdGlvbiBUdCgpe2Zvcih2YXIgbix0PUthLGU9MS8wO3Q7KXQuZj90PW4/bi5uPXQubjpLYT10Lm46KHQudDxlJiYoZT10LnQpLHQ9KG49dCkubik7cmV0dXJuIFFhPW4sZX1mdW5jdGlvbiBSdChuLHQpe3JldHVybiB0LShuP01hdGguY2VpbChNYXRoLmxvZyhuKS9NYXRoLkxOMTApOjEpfWZ1bmN0aW9uIER0KG4sdCl7dmFyIGU9TWF0aC5wb3coMTAsMypnYSg4LXQpKTtyZXR1cm57c2NhbGU6dD44P2Z1bmN0aW9uKG4pe3JldHVybiBuL2V9OmZ1bmN0aW9uKG4pe3JldHVybiBuKmV9LHN5bWJvbDpufX1mdW5jdGlvbiBQdChuKXt2YXIgdD1uLmRlY2ltYWwsZT1uLnRob3VzYW5kcyxyPW4uZ3JvdXBpbmcsdT1uLmN1cnJlbmN5LGk9ciYmZT9mdW5jdGlvbihuLHQpe2Zvcih2YXIgdT1uLmxlbmd0aCxpPVtdLG89MCxhPXJbMF0sYz0wO3U+MCYmYT4wJiYoYythKzE+dCYmKGE9TWF0aC5tYXgoMSx0LWMpKSxpLnB1c2gobi5zdWJzdHJpbmcodS09YSx1K2EpKSwhKChjKz1hKzEpPnQpKTspYT1yW289KG8rMSklci5sZW5ndGhdO3JldHVybiBpLnJldmVyc2UoKS5qb2luKGUpfTp5O3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1pYy5leGVjKG4pLHI9ZVsxXXx8IiAiLG89ZVsyXXx8Ij4iLGE9ZVszXXx8Ii0iLGM9ZVs0XXx8IiIsbD1lWzVdLHM9K2VbNl0sZj1lWzddLGg9ZVs4XSxnPWVbOV0scD0xLHY9IiIsZD0iIixtPSExLHk9ITA7c3dpdGNoKGgmJihoPStoLnN1YnN0cmluZygxKSksKGx8fCIwIj09PXImJiI9Ij09PW8pJiYobD1yPSIwIixvPSI9IiksZyl7Y2FzZSJuIjpmPSEwLGc9ImciO2JyZWFrO2Nhc2UiJSI6cD0xMDAsZD0iJSIsZz0iZiI7YnJlYWs7Y2FzZSJwIjpwPTEwMCxkPSIlIixnPSJyIjticmVhaztjYXNlImIiOmNhc2UibyI6Y2FzZSJ4IjpjYXNlIlgiOiIjIj09PWMmJih2PSIwIitnLnRvTG93ZXJDYXNlKCkpO2Nhc2UiYyI6eT0hMTtjYXNlImQiOm09ITAsaD0wO2JyZWFrO2Nhc2UicyI6cD0tMSxnPSJyIn0iJCI9PT1jJiYodj11WzBdLGQ9dVsxXSksInIiIT1nfHxofHwoZz0iZyIpLG51bGwhPWgmJigiZyI9PWc/aD1NYXRoLm1heCgxLE1hdGgubWluKDIxLGgpKTooImUiPT1nfHwiZiI9PWcpJiYoaD1NYXRoLm1heCgwLE1hdGgubWluKDIwLGgpKSkpLGc9b2MuZ2V0KGcpfHxVdDt2YXIgTT1sJiZmO3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1kO2lmKG0mJm4lMSlyZXR1cm4iIjt2YXIgdT0wPm58fDA9PT1uJiYwPjEvbj8obj0tbiwiLSIpOiItIj09PWE/IiI6YTtpZigwPnApe3ZhciBjPXRhLmZvcm1hdFByZWZpeChuLGgpO249Yy5zY2FsZShuKSxlPWMuc3ltYm9sK2R9ZWxzZSBuKj1wO249ZyhuLGgpO3ZhciB4LGIsXz1uLmxhc3RJbmRleE9mKCIuIik7aWYoMD5fKXt2YXIgdz15P24ubGFzdEluZGV4T2YoImUiKTotMTswPnc/KHg9bixiPSIiKTooeD1uLnN1YnN0cmluZygwLHcpLGI9bi5zdWJzdHJpbmcodykpfWVsc2UgeD1uLnN1YnN0cmluZygwLF8pLGI9dCtuLnN1YnN0cmluZyhfKzEpOyFsJiZmJiYoeD1pKHgsMS8wKSk7dmFyIFM9di5sZW5ndGgreC5sZW5ndGgrYi5sZW5ndGgrKE0/MDp1Lmxlbmd0aCksaz1zPlM/bmV3IEFycmF5KFM9cy1TKzEpLmpvaW4ocik6IiI7cmV0dXJuIE0mJih4PWkoayt4LGsubGVuZ3RoP3MtYi5sZW5ndGg6MS8wKSksdSs9dixuPXgrYiwoIjwiPT09bz91K24razoiPiI9PT1vP2srdStuOiJeIj09PW8/ay5zdWJzdHJpbmcoMCxTPj49MSkrdStuK2suc3Vic3RyaW5nKFMpOnUrKE0/bjprK24pKStlfX19ZnVuY3Rpb24gVXQobil7cmV0dXJuIG4rIiJ9ZnVuY3Rpb24ganQoKXt0aGlzLl89bmV3IERhdGUoYXJndW1lbnRzLmxlbmd0aD4xP0RhdGUuVVRDLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHNbMF0pfWZ1bmN0aW9uIEZ0KG4sdCxlKXtmdW5jdGlvbiByKHQpe3ZhciBlPW4odCkscj1pKGUsMSk7cmV0dXJuIHItdD50LWU/ZTpyfWZ1bmN0aW9uIHUoZSl7cmV0dXJuIHQoZT1uKG5ldyBjYyhlLTEpKSwxKSxlfWZ1bmN0aW9uIGkobixlKXtyZXR1cm4gdChuPW5ldyBjYygrbiksZSksbn1mdW5jdGlvbiBvKG4scixpKXt2YXIgbz11KG4pLGE9W107aWYoaT4xKWZvcig7cj5vOyllKG8pJWl8fGEucHVzaChuZXcgRGF0ZSgrbykpLHQobywxKTtlbHNlIGZvcig7cj5vOylhLnB1c2gobmV3IERhdGUoK28pKSx0KG8sMSk7cmV0dXJuIGF9ZnVuY3Rpb24gYShuLHQsZSl7dHJ5e2NjPWp0O3ZhciByPW5ldyBqdDtyZXR1cm4gci5fPW4sbyhyLHQsZSl9ZmluYWxseXtjYz1EYXRlfX1uLmZsb29yPW4sbi5yb3VuZD1yLG4uY2VpbD11LG4ub2Zmc2V0PWksbi5yYW5nZT1vO3ZhciBjPW4udXRjPUh0KG4pO3JldHVybiBjLmZsb29yPWMsYy5yb3VuZD1IdChyKSxjLmNlaWw9SHQodSksYy5vZmZzZXQ9SHQoaSksYy5yYW5nZT1hLG59ZnVuY3Rpb24gSHQobil7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dHJ5e2NjPWp0O3ZhciByPW5ldyBqdDtyZXR1cm4gci5fPXQsbihyLGUpLl99ZmluYWxseXtjYz1EYXRlfX19ZnVuY3Rpb24gT3Qobil7ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiB0KHQpe2Zvcih2YXIgZSx1LGksbz1bXSxhPS0xLGM9MDsrK2E8cjspMzc9PT1uLmNoYXJDb2RlQXQoYSkmJihvLnB1c2gobi5zbGljZShjLGEpKSxudWxsIT0odT1zY1tlPW4uY2hhckF0KCsrYSldKSYmKGU9bi5jaGFyQXQoKythKSksKGk9TltlXSkmJihlPWkodCxudWxsPT11PyJlIj09PWU/IiAiOiIwIjp1KSksby5wdXNoKGUpLGM9YSsxKTtyZXR1cm4gby5wdXNoKG4uc2xpY2UoYyxhKSksby5qb2luKCIiKX12YXIgcj1uLmxlbmd0aDtyZXR1cm4gdC5wYXJzZT1mdW5jdGlvbih0KXt2YXIgcj17eToxOTAwLG06MCxkOjEsSDowLE06MCxTOjAsTDowLFo6bnVsbH0sdT1lKHIsbix0LDApO2lmKHUhPXQubGVuZ3RoKXJldHVybiBudWxsOyJwImluIHImJihyLkg9ci5IJTEyKzEyKnIucCk7dmFyIGk9bnVsbCE9ci5aJiZjYyE9PWp0LG89bmV3KGk/anQ6Y2MpO3JldHVybiJqImluIHI/by5zZXRGdWxsWWVhcihyLnksMCxyLmopOiJ3ImluIHImJigiVyJpbiByfHwiVSJpbiByKT8oby5zZXRGdWxsWWVhcihyLnksMCwxKSxvLnNldEZ1bGxZZWFyKHIueSwwLCJXImluIHI/KHIudys2KSU3Kzcqci5XLShvLmdldERheSgpKzUpJTc6ci53Kzcqci5VLShvLmdldERheSgpKzYpJTcpKTpvLnNldEZ1bGxZZWFyKHIueSxyLm0sci5kKSxvLnNldEhvdXJzKHIuSCsoci5aLzEwMHwwKSxyLk0rci5aJTEwMCxyLlMsci5MKSxpP28uXzpvfSx0LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIG59LHR9ZnVuY3Rpb24gZShuLHQsZSxyKXtmb3IodmFyIHUsaSxvLGE9MCxjPXQubGVuZ3RoLGw9ZS5sZW5ndGg7Yz5hOyl7aWYocj49bClyZXR1cm4tMTtpZih1PXQuY2hhckNvZGVBdChhKyspLDM3PT09dSl7aWYobz10LmNoYXJBdChhKyspLGk9Q1tvIGluIHNjP3QuY2hhckF0KGErKyk6b10sIWl8fChyPWkobixlLHIpKTwwKXJldHVybi0xfWVsc2UgaWYodSE9ZS5jaGFyQ29kZUF0KHIrKykpcmV0dXJuLTF9cmV0dXJuIHJ9ZnVuY3Rpb24gcihuLHQsZSl7Xy5sYXN0SW5kZXg9MDt2YXIgcj1fLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4udz13LmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHUobix0LGUpe3gubGFzdEluZGV4PTA7dmFyIHI9eC5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLnc9Yi5nZXQoclswXS50b0xvd2VyQ2FzZSgpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBpKG4sdCxlKXtFLmxhc3RJbmRleD0wO3ZhciByPUUuZXhlYyh0LnNsaWNlKGUpKTtyZXR1cm4gcj8obi5tPUEuZ2V0KHJbMF0udG9Mb3dlckNhc2UoKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gbyhuLHQsZSl7Uy5sYXN0SW5kZXg9MDt2YXIgcj1TLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4ubT1rLmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGEobix0LHIpe3JldHVybiBlKG4sTi5jLnRvU3RyaW5nKCksdCxyKX1mdW5jdGlvbiBjKG4sdCxyKXtyZXR1cm4gZShuLE4ueC50b1N0cmluZygpLHQscil9ZnVuY3Rpb24gbChuLHQscil7cmV0dXJuIGUobixOLlgudG9TdHJpbmcoKSx0LHIpfWZ1bmN0aW9uIHMobix0LGUpe3ZhciByPU0uZ2V0KHQuc2xpY2UoZSxlKz0yKS50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gbnVsbD09cj8tMToobi5wPXIsZSl9dmFyIGY9bi5kYXRlVGltZSxoPW4uZGF0ZSxnPW4udGltZSxwPW4ucGVyaW9kcyx2PW4uZGF5cyxkPW4uc2hvcnREYXlzLG09bi5tb250aHMseT1uLnNob3J0TW9udGhzO3QudXRjPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIGUobil7dHJ5e2NjPWp0O3ZhciB0PW5ldyBjYztyZXR1cm4gdC5fPW4scih0KX1maW5hbGx5e2NjPURhdGV9fXZhciByPXQobik7cmV0dXJuIGUucGFyc2U9ZnVuY3Rpb24obil7dHJ5e2NjPWp0O3ZhciB0PXIucGFyc2Uobik7cmV0dXJuIHQmJnQuX31maW5hbGx5e2NjPURhdGV9fSxlLnRvU3RyaW5nPXIudG9TdHJpbmcsZX0sdC5tdWx0aT10LnV0Yy5tdWx0aT1hZTt2YXIgTT10YS5tYXAoKSx4PVl0KHYpLGI9WnQodiksXz1ZdChkKSx3PVp0KGQpLFM9WXQobSksaz1adChtKSxFPVl0KHkpLEE9WnQoeSk7cC5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7TS5zZXQobi50b0xvd2VyQ2FzZSgpLHQpfSk7dmFyIE49e2E6ZnVuY3Rpb24obil7cmV0dXJuIGRbbi5nZXREYXkoKV19LEE6ZnVuY3Rpb24obil7cmV0dXJuIHZbbi5nZXREYXkoKV19LGI6ZnVuY3Rpb24obil7cmV0dXJuIHlbbi5nZXRNb250aCgpXX0sQjpmdW5jdGlvbihuKXtyZXR1cm4gbVtuLmdldE1vbnRoKCldfSxjOnQoZiksZDpmdW5jdGlvbihuLHQpe3JldHVybiBJdChuLmdldERhdGUoKSx0LDIpfSxlOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KG4uZ2V0RGF0ZSgpLHQsMil9LEg6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRIb3VycygpLHQsMil9LEk6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRIb3VycygpJTEyfHwxMix0LDIpfSxqOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KDErYWMuZGF5T2ZZZWFyKG4pLHQsMyl9LEw6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRNaWxsaXNlY29uZHMoKSx0LDMpfSxtOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KG4uZ2V0TW9udGgoKSsxLHQsMil9LE06ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRNaW51dGVzKCksdCwyKX0scDpmdW5jdGlvbihuKXtyZXR1cm4gcFsrKG4uZ2V0SG91cnMoKT49MTIpXX0sUzpmdW5jdGlvbihuLHQpe3JldHVybiBJdChuLmdldFNlY29uZHMoKSx0LDIpfSxVOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KGFjLnN1bmRheU9mWWVhcihuKSx0LDIpfSx3OmZ1bmN0aW9uKG4pe3JldHVybiBuLmdldERheSgpfSxXOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KGFjLm1vbmRheU9mWWVhcihuKSx0LDIpfSx4OnQoaCksWDp0KGcpLHk6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRGdWxsWWVhcigpJTEwMCx0LDIpfSxZOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KG4uZ2V0RnVsbFllYXIoKSUxZTQsdCw0KX0sWjppZSwiJSI6ZnVuY3Rpb24oKXtyZXR1cm4iJSJ9fSxDPXthOnIsQTp1LGI6aSxCOm8sYzphLGQ6UXQsZTpRdCxIOnRlLEk6dGUsajpuZSxMOnVlLG06S3QsTTplZSxwOnMsUzpyZSxVOlh0LHc6VnQsVzokdCx4OmMsWDpsLHk6V3QsWTpCdCxaOkp0LCIlIjpvZX07cmV0dXJuIHR9ZnVuY3Rpb24gSXQobix0LGUpe3ZhciByPTA+bj8iLSI6IiIsdT0ocj8tbjpuKSsiIixpPXUubGVuZ3RoO3JldHVybiByKyhlPmk/bmV3IEFycmF5KGUtaSsxKS5qb2luKHQpK3U6dSl9ZnVuY3Rpb24gWXQobil7cmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiK24ubWFwKHRhLnJlcXVvdGUpLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiBadChuKXtmb3IodmFyIHQ9bmV3IGwsZT0tMSxyPW4ubGVuZ3RoOysrZTxyOyl0LnNldChuW2VdLnRvTG93ZXJDYXNlKCksZSk7cmV0dXJuIHR9ZnVuY3Rpb24gVnQobix0LGUpe2ZjLmxhc3RJbmRleD0wO3ZhciByPWZjLmV4ZWModC5zbGljZShlLGUrMSkpO3JldHVybiByPyhuLnc9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gWHQobix0LGUpe2ZjLmxhc3RJbmRleD0wO3ZhciByPWZjLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4uVT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiAkdChuLHQsZSl7ZmMubGFzdEluZGV4PTA7dmFyIHI9ZmMuZXhlYyh0LnNsaWNlKGUpKTtyZXR1cm4gcj8obi5XPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEJ0KG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzQpKTtyZXR1cm4gcj8obi55PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFd0KG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi55PUd0KCtyWzBdKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBKdChuLHQsZSl7cmV0dXJuL15bKy1dXGR7NH0kLy50ZXN0KHQ9dC5zbGljZShlLGUrNSkpPyhuLlo9LXQsZSs1KTotMX1mdW5jdGlvbiBHdChuKXtyZXR1cm4gbisobj42OD8xOTAwOjJlMyl9ZnVuY3Rpb24gS3Qobix0LGUpe2ZjLmxhc3RJbmRleD0wO3ZhciByPWZjLmV4ZWModC5zbGljZShlLGUrMikpO3JldHVybiByPyhuLm09clswXS0xLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFF0KG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG5lKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8obi5qPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHRlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5IPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGVlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5NPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHJlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5TPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHVlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8obi5MPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGllKG4pe3ZhciB0PW4uZ2V0VGltZXpvbmVPZmZzZXQoKSxlPXQ+MD8iLSI6IisiLHI9Z2EodCkvNjB8MCx1PWdhKHQpJTYwO3JldHVybiBlK0l0KHIsIjAiLDIpK0l0KHUsIjAiLDIpfWZ1bmN0aW9uIG9lKG4sdCxlKXtoYy5sYXN0SW5kZXg9MDt2YXIgcj1oYy5leGVjKHQuc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj9lK3JbMF0ubGVuZ3RoOi0xfWZ1bmN0aW9uIGFlKG4pe2Zvcih2YXIgdD1uLmxlbmd0aCxlPS0xOysrZTx0OyluW2VdWzBdPXRoaXMobltlXVswXSk7cmV0dXJuIGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLHI9bltlXTshclsxXSh0KTspcj1uWysrZV07cmV0dXJuIHJbMF0odCl9fWZ1bmN0aW9uIGNlKCl7fWZ1bmN0aW9uIGxlKG4sdCxlKXt2YXIgcj1lLnM9bit0LHU9ci1uLGk9ci11O2UudD1uLWkrKHQtdSl9ZnVuY3Rpb24gc2Uobix0KXtuJiZkYy5oYXNPd25Qcm9wZXJ0eShuLnR5cGUpJiZkY1tuLnR5cGVdKG4sdCl9ZnVuY3Rpb24gZmUobix0LGUpe3ZhciByLHU9LTEsaT1uLmxlbmd0aC1lO2Zvcih0LmxpbmVTdGFydCgpOysrdTxpOylyPW5bdV0sdC5wb2ludChyWzBdLHJbMV0sclsyXSk7dC5saW5lRW5kKCl9ZnVuY3Rpb24gaGUobix0KXt2YXIgZT0tMSxyPW4ubGVuZ3RoO2Zvcih0LnBvbHlnb25TdGFydCgpOysrZTxyOylmZShuW2VdLHQsMSk7dC5wb2x5Z29uRW5kKCl9ZnVuY3Rpb24gZ2UoKXtmdW5jdGlvbiBuKG4sdCl7bio9RGEsdD10KkRhLzIrcWEvNDt2YXIgZT1uLXIsbz1lPj0wPzE6LTEsYT1vKmUsYz1NYXRoLmNvcyh0KSxsPU1hdGguc2luKHQpLHM9aSpsLGY9dSpjK3MqTWF0aC5jb3MoYSksaD1zKm8qTWF0aC5zaW4oYSk7eWMuYWRkKE1hdGguYXRhbjIoaCxmKSkscj1uLHU9YyxpPWx9dmFyIHQsZSxyLHUsaTtNYy5wb2ludD1mdW5jdGlvbihvLGEpe01jLnBvaW50PW4scj0odD1vKSpEYSx1PU1hdGguY29zKGE9KGU9YSkqRGEvMitxYS80KSxpPU1hdGguc2luKGEpfSxNYy5saW5lRW5kPWZ1bmN0aW9uKCl7bih0LGUpfX1mdW5jdGlvbiBwZShuKXt2YXIgdD1uWzBdLGU9blsxXSxyPU1hdGguY29zKGUpO3JldHVybltyKk1hdGguY29zKHQpLHIqTWF0aC5zaW4odCksTWF0aC5zaW4oZSldfWZ1bmN0aW9uIHZlKG4sdCl7cmV0dXJuIG5bMF0qdFswXStuWzFdKnRbMV0rblsyXSp0WzJdfWZ1bmN0aW9uIGRlKG4sdCl7cmV0dXJuW25bMV0qdFsyXS1uWzJdKnRbMV0sblsyXSp0WzBdLW5bMF0qdFsyXSxuWzBdKnRbMV0tblsxXSp0WzBdXX1mdW5jdGlvbiBtZShuLHQpe25bMF0rPXRbMF0sblsxXSs9dFsxXSxuWzJdKz10WzJdfWZ1bmN0aW9uIHllKG4sdCl7cmV0dXJuW25bMF0qdCxuWzFdKnQsblsyXSp0XX1mdW5jdGlvbiBNZShuKXt2YXIgdD1NYXRoLnNxcnQoblswXSpuWzBdK25bMV0qblsxXStuWzJdKm5bMl0pO25bMF0vPXQsblsxXS89dCxuWzJdLz10fWZ1bmN0aW9uIHhlKG4pe3JldHVybltNYXRoLmF0YW4yKG5bMV0sblswXSksdHQoblsyXSldfWZ1bmN0aW9uIGJlKG4sdCl7cmV0dXJuIGdhKG5bMF0tdFswXSk8Q2EmJmdhKG5bMV0tdFsxXSk8Q2F9ZnVuY3Rpb24gX2Uobix0KXtuKj1EYTt2YXIgZT1NYXRoLmNvcyh0Kj1EYSk7d2UoZSpNYXRoLmNvcyhuKSxlKk1hdGguc2luKG4pLE1hdGguc2luKHQpKX1mdW5jdGlvbiB3ZShuLHQsZSl7Kyt4YyxfYys9KG4tX2MpL3hjLHdjKz0odC13YykveGMsU2MrPShlLVNjKS94Y31mdW5jdGlvbiBTZSgpe2Z1bmN0aW9uIG4obix1KXtuKj1EYTt2YXIgaT1NYXRoLmNvcyh1Kj1EYSksbz1pKk1hdGguY29zKG4pLGE9aSpNYXRoLnNpbihuKSxjPU1hdGguc2luKHUpLGw9TWF0aC5hdGFuMihNYXRoLnNxcnQoKGw9ZSpjLXIqYSkqbCsobD1yKm8tdCpjKSpsKyhsPXQqYS1lKm8pKmwpLHQqbytlKmErcipjKTtiYys9bCxrYys9bCoodCsodD1vKSksRWMrPWwqKGUrKGU9YSkpLEFjKz1sKihyKyhyPWMpKSx3ZSh0LGUscil9dmFyIHQsZSxyO3FjLnBvaW50PWZ1bmN0aW9uKHUsaSl7dSo9RGE7dmFyIG89TWF0aC5jb3MoaSo9RGEpO3Q9bypNYXRoLmNvcyh1KSxlPW8qTWF0aC5zaW4odSkscj1NYXRoLnNpbihpKSxxYy5wb2ludD1uLHdlKHQsZSxyKX19ZnVuY3Rpb24ga2UoKXtxYy5wb2ludD1fZX1mdW5jdGlvbiBFZSgpe2Z1bmN0aW9uIG4obix0KXtuKj1EYTt2YXIgZT1NYXRoLmNvcyh0Kj1EYSksbz1lKk1hdGguY29zKG4pLGE9ZSpNYXRoLnNpbihuKSxjPU1hdGguc2luKHQpLGw9dSpjLWkqYSxzPWkqby1yKmMsZj1yKmEtdSpvLGg9TWF0aC5zcXJ0KGwqbCtzKnMrZipmKSxnPXIqbyt1KmEraSpjLHA9aCYmLW50KGcpL2gsdj1NYXRoLmF0YW4yKGgsZyk7TmMrPXAqbCxDYys9cCpzLHpjKz1wKmYsYmMrPXYsa2MrPXYqKHIrKHI9bykpLEVjKz12Kih1Kyh1PWEpKSxBYys9diooaSsoaT1jKSksd2Uocix1LGkpfXZhciB0LGUscix1LGk7cWMucG9pbnQ9ZnVuY3Rpb24obyxhKXt0PW8sZT1hLHFjLnBvaW50PW4sbyo9RGE7dmFyIGM9TWF0aC5jb3MoYSo9RGEpO3I9YypNYXRoLmNvcyhvKSx1PWMqTWF0aC5zaW4obyksaT1NYXRoLnNpbihhKSx3ZShyLHUsaSl9LHFjLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSkscWMubGluZUVuZD1rZSxxYy5wb2ludD1fZX19ZnVuY3Rpb24gQWUobix0KXtmdW5jdGlvbiBlKGUscil7cmV0dXJuIGU9bihlLHIpLHQoZVswXSxlWzFdKX1yZXR1cm4gbi5pbnZlcnQmJnQuaW52ZXJ0JiYoZS5pbnZlcnQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZT10LmludmVydChlLHIpLGUmJm4uaW52ZXJ0KGVbMF0sZVsxXSl9KSxlfWZ1bmN0aW9uIE5lKCl7cmV0dXJuITB9ZnVuY3Rpb24gQ2Uobix0LGUscix1KXt2YXIgaT1bXSxvPVtdO2lmKG4uZm9yRWFjaChmdW5jdGlvbihuKXtpZighKCh0PW4ubGVuZ3RoLTEpPD0wKSl7dmFyIHQsZT1uWzBdLHI9blt0XTtpZihiZShlLHIpKXt1LmxpbmVTdGFydCgpO2Zvcih2YXIgYT0wO3Q+YTsrK2EpdS5wb2ludCgoZT1uW2FdKVswXSxlWzFdKTtyZXR1cm4gdm9pZCB1LmxpbmVFbmQoKX12YXIgYz1uZXcgcWUoZSxuLG51bGwsITApLGw9bmV3IHFlKGUsbnVsbCxjLCExKTtjLm89bCxpLnB1c2goYyksby5wdXNoKGwpLGM9bmV3IHFlKHIsbixudWxsLCExKSxsPW5ldyBxZShyLG51bGwsYywhMCksYy5vPWwsaS5wdXNoKGMpLG8ucHVzaChsKX19KSxvLnNvcnQodCksemUoaSksemUobyksaS5sZW5ndGgpe2Zvcih2YXIgYT0wLGM9ZSxsPW8ubGVuZ3RoO2w+YTsrK2Epb1thXS5lPWM9IWM7Zm9yKHZhciBzLGYsaD1pWzBdOzspe2Zvcih2YXIgZz1oLHA9ITA7Zy52OylpZigoZz1nLm4pPT09aClyZXR1cm47cz1nLnosdS5saW5lU3RhcnQoKTtkb3tpZihnLnY9Zy5vLnY9ITAsZy5lKXtpZihwKWZvcih2YXIgYT0wLGw9cy5sZW5ndGg7bD5hOysrYSl1LnBvaW50KChmPXNbYV0pWzBdLGZbMV0pO2Vsc2UgcihnLngsZy5uLngsMSx1KTtnPWcubn1lbHNle2lmKHApe3M9Zy5wLno7Zm9yKHZhciBhPXMubGVuZ3RoLTE7YT49MDstLWEpdS5wb2ludCgoZj1zW2FdKVswXSxmWzFdKX1lbHNlIHIoZy54LGcucC54LC0xLHUpO2c9Zy5wfWc9Zy5vLHM9Zy56LHA9IXB9d2hpbGUoIWcudik7dS5saW5lRW5kKCl9fX1mdW5jdGlvbiB6ZShuKXtpZih0PW4ubGVuZ3RoKXtmb3IodmFyIHQsZSxyPTAsdT1uWzBdOysrcjx0Oyl1Lm49ZT1uW3JdLGUucD11LHU9ZTt1Lm49ZT1uWzBdLGUucD11fX1mdW5jdGlvbiBxZShuLHQsZSxyKXt0aGlzLng9bix0aGlzLno9dCx0aGlzLm89ZSx0aGlzLmU9cix0aGlzLnY9ITEsdGhpcy5uPXRoaXMucD1udWxsfWZ1bmN0aW9uIExlKG4sdCxlLHIpe3JldHVybiBmdW5jdGlvbih1LGkpe2Z1bmN0aW9uIG8odCxlKXt2YXIgcj11KHQsZSk7bih0PXJbMF0sZT1yWzFdKSYmaS5wb2ludCh0LGUpfWZ1bmN0aW9uIGEobix0KXt2YXIgZT11KG4sdCk7ZC5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIGMoKXt5LnBvaW50PWEsZC5saW5lU3RhcnQoKX1mdW5jdGlvbiBsKCl7eS5wb2ludD1vLGQubGluZUVuZCgpfWZ1bmN0aW9uIHMobix0KXt2LnB1c2goW24sdF0pO3ZhciBlPXUobix0KTt4LnBvaW50KGVbMF0sZVsxXSl9ZnVuY3Rpb24gZigpe3gubGluZVN0YXJ0KCksdj1bXX1mdW5jdGlvbiBoKCl7cyh2WzBdWzBdLHZbMF1bMV0pLHgubGluZUVuZCgpO3ZhciBuLHQ9eC5jbGVhbigpLGU9TS5idWZmZXIoKSxyPWUubGVuZ3RoO2lmKHYucG9wKCkscC5wdXNoKHYpLHY9bnVsbCxyKWlmKDEmdCl7bj1lWzBdO3ZhciB1LHI9bi5sZW5ndGgtMSxvPS0xO2lmKHI+MCl7Zm9yKGJ8fChpLnBvbHlnb25TdGFydCgpLGI9ITApLGkubGluZVN0YXJ0KCk7KytvPHI7KWkucG9pbnQoKHU9bltvXSlbMF0sdVsxXSk7aS5saW5lRW5kKCl9fWVsc2Ugcj4xJiYyJnQmJmUucHVzaChlLnBvcCgpLmNvbmNhdChlLnNoaWZ0KCkpKSxnLnB1c2goZS5maWx0ZXIoVGUpKX12YXIgZyxwLHYsZD10KGkpLG09dS5pbnZlcnQoclswXSxyWzFdKSx5PXtwb2ludDpvLGxpbmVTdGFydDpjLGxpbmVFbmQ6bCxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt5LnBvaW50PXMseS5saW5lU3RhcnQ9Zix5LmxpbmVFbmQ9aCxnPVtdLHA9W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt5LnBvaW50PW8seS5saW5lU3RhcnQ9Yyx5LmxpbmVFbmQ9bCxnPXRhLm1lcmdlKGcpO3ZhciBuPUZlKG0scCk7Zy5sZW5ndGg/KGJ8fChpLnBvbHlnb25TdGFydCgpLGI9ITApLENlKGcsRGUsbixlLGkpKTpuJiYoYnx8KGkucG9seWdvblN0YXJ0KCksYj0hMCksaS5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLGkpLGkubGluZUVuZCgpKSxiJiYoaS5wb2x5Z29uRW5kKCksYj0hMSksZz1wPW51bGx9LHNwaGVyZTpmdW5jdGlvbigpe2kucG9seWdvblN0YXJ0KCksaS5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLGkpLGkubGluZUVuZCgpLGkucG9seWdvbkVuZCgpfX0sTT1SZSgpLHg9dChNKSxiPSExO3JldHVybiB5fX1mdW5jdGlvbiBUZShuKXtyZXR1cm4gbi5sZW5ndGg+MX1mdW5jdGlvbiBSZSgpe3ZhciBuLHQ9W107cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe3QucHVzaChuPVtdKX0scG9pbnQ6ZnVuY3Rpb24odCxlKXtuLnB1c2goW3QsZV0pfSxsaW5lRW5kOmIsYnVmZmVyOmZ1bmN0aW9uKCl7dmFyIGU9dDtyZXR1cm4gdD1bXSxuPW51bGwsZX0scmVqb2luOmZ1bmN0aW9uKCl7dC5sZW5ndGg+MSYmdC5wdXNoKHQucG9wKCkuY29uY2F0KHQuc2hpZnQoKSkpfX19ZnVuY3Rpb24gRGUobix0KXtyZXR1cm4oKG49bi54KVswXTwwP25bMV0tUmEtQ2E6UmEtblsxXSktKCh0PXQueClbMF08MD90WzFdLVJhLUNhOlJhLXRbMV0pfWZ1bmN0aW9uIFBlKG4pe3ZhciB0LGU9MC8wLHI9MC8wLHU9MC8wO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtuLmxpbmVTdGFydCgpLHQ9MX0scG9pbnQ6ZnVuY3Rpb24oaSxvKXt2YXIgYT1pPjA/cWE6LXFhLGM9Z2EoaS1lKTtnYShjLXFhKTxDYT8obi5wb2ludChlLHI9KHIrbykvMj4wP1JhOi1SYSksbi5wb2ludCh1LHIpLG4ubGluZUVuZCgpLG4ubGluZVN0YXJ0KCksbi5wb2ludChhLHIpLG4ucG9pbnQoaSxyKSx0PTApOnUhPT1hJiZjPj1xYSYmKGdhKGUtdSk8Q2EmJihlLT11KkNhKSxnYShpLWEpPENhJiYoaS09YSpDYSkscj1VZShlLHIsaSxvKSxuLnBvaW50KHUsciksbi5saW5lRW5kKCksbi5saW5lU3RhcnQoKSxuLnBvaW50KGEsciksdD0wKSxuLnBvaW50KGU9aSxyPW8pLHU9YX0sbGluZUVuZDpmdW5jdGlvbigpe24ubGluZUVuZCgpLGU9cj0wLzB9LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItdH19fWZ1bmN0aW9uIFVlKG4sdCxlLHIpe3ZhciB1LGksbz1NYXRoLnNpbihuLWUpO3JldHVybiBnYShvKT5DYT9NYXRoLmF0YW4oKE1hdGguc2luKHQpKihpPU1hdGguY29zKHIpKSpNYXRoLnNpbihlKS1NYXRoLnNpbihyKSoodT1NYXRoLmNvcyh0KSkqTWF0aC5zaW4obikpLyh1KmkqbykpOih0K3IpLzJ9ZnVuY3Rpb24gamUobix0LGUscil7dmFyIHU7aWYobnVsbD09bil1PWUqUmEsci5wb2ludCgtcWEsdSksci5wb2ludCgwLHUpLHIucG9pbnQocWEsdSksci5wb2ludChxYSwwKSxyLnBvaW50KHFhLC11KSxyLnBvaW50KDAsLXUpLHIucG9pbnQoLXFhLC11KSxyLnBvaW50KC1xYSwwKSxyLnBvaW50KC1xYSx1KTtlbHNlIGlmKGdhKG5bMF0tdFswXSk+Q2Epe3ZhciBpPW5bMF08dFswXT9xYTotcWE7dT1lKmkvMixyLnBvaW50KC1pLHUpLHIucG9pbnQoMCx1KSxyLnBvaW50KGksdSl9ZWxzZSByLnBvaW50KHRbMF0sdFsxXSl9ZnVuY3Rpb24gRmUobix0KXt2YXIgZT1uWzBdLHI9blsxXSx1PVtNYXRoLnNpbihlKSwtTWF0aC5jb3MoZSksMF0saT0wLG89MDt5Yy5yZXNldCgpO2Zvcih2YXIgYT0wLGM9dC5sZW5ndGg7Yz5hOysrYSl7dmFyIGw9dFthXSxzPWwubGVuZ3RoO2lmKHMpZm9yKHZhciBmPWxbMF0saD1mWzBdLGc9ZlsxXS8yK3FhLzQscD1NYXRoLnNpbihnKSx2PU1hdGguY29zKGcpLGQ9MTs7KXtkPT09cyYmKGQ9MCksbj1sW2RdO3ZhciBtPW5bMF0seT1uWzFdLzIrcWEvNCxNPU1hdGguc2luKHkpLHg9TWF0aC5jb3MoeSksYj1tLWgsXz1iPj0wPzE6LTEsdz1fKmIsUz13PnFhLGs9cCpNO2lmKHljLmFkZChNYXRoLmF0YW4yKGsqXypNYXRoLnNpbih3KSx2KngraypNYXRoLmNvcyh3KSkpLGkrPVM/YitfKkxhOmIsU15oPj1lXm0+PWUpe3ZhciBFPWRlKHBlKGYpLHBlKG4pKTtNZShFKTt2YXIgQT1kZSh1LEUpO01lKEEpO3ZhciBOPShTXmI+PTA/LTE6MSkqdHQoQVsyXSk7KHI+Tnx8cj09PU4mJihFWzBdfHxFWzFdKSkmJihvKz1TXmI+PTA/MTotMSl9aWYoIWQrKylicmVhaztoPW0scD1NLHY9eCxmPW59fXJldHVybigtQ2E+aXx8Q2E+aSYmMD55YyleMSZvfWZ1bmN0aW9uIEhlKG4pe2Z1bmN0aW9uIHQobix0KXtyZXR1cm4gTWF0aC5jb3MobikqTWF0aC5jb3ModCk+aX1mdW5jdGlvbiBlKG4pe3ZhciBlLGksYyxsLHM7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2w9Yz0hMSxzPTF9LHBvaW50OmZ1bmN0aW9uKGYsaCl7dmFyIGcscD1bZixoXSx2PXQoZixoKSxkPW8/dj8wOnUoZixoKTp2P3UoZisoMD5mP3FhOi1xYSksaCk6MDtpZighZSYmKGw9Yz12KSYmbi5saW5lU3RhcnQoKSx2IT09YyYmKGc9cihlLHApLChiZShlLGcpfHxiZShwLGcpKSYmKHBbMF0rPUNhLHBbMV0rPUNhLHY9dChwWzBdLHBbMV0pKSksdiE9PWMpcz0wLHY/KG4ubGluZVN0YXJ0KCksZz1yKHAsZSksbi5wb2ludChnWzBdLGdbMV0pKTooZz1yKGUscCksbi5wb2ludChnWzBdLGdbMV0pLG4ubGluZUVuZCgpKSxlPWc7ZWxzZSBpZihhJiZlJiZvXnYpe3ZhciBtO2QmaXx8IShtPXIocCxlLCEwKSl8fChzPTAsbz8obi5saW5lU3RhcnQoKSxuLnBvaW50KG1bMF1bMF0sbVswXVsxXSksbi5wb2ludChtWzFdWzBdLG1bMV1bMV0pLG4ubGluZUVuZCgpKToobi5wb2ludChtWzFdWzBdLG1bMV1bMV0pLG4ubGluZUVuZCgpLG4ubGluZVN0YXJ0KCksbi5wb2ludChtWzBdWzBdLG1bMF1bMV0pKSl9IXZ8fGUmJmJlKGUscCl8fG4ucG9pbnQocFswXSxwWzFdKSxlPXAsYz12LGk9ZH0sbGluZUVuZDpmdW5jdGlvbigpe2MmJm4ubGluZUVuZCgpLGU9bnVsbH0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gc3wobCYmYyk8PDF9fX1mdW5jdGlvbiByKG4sdCxlKXt2YXIgcj1wZShuKSx1PXBlKHQpLG89WzEsMCwwXSxhPWRlKHIsdSksYz12ZShhLGEpLGw9YVswXSxzPWMtbCpsO2lmKCFzKXJldHVybiFlJiZuO3ZhciBmPWkqYy9zLGg9LWkqbC9zLGc9ZGUobyxhKSxwPXllKG8sZiksdj15ZShhLGgpO21lKHAsdik7dmFyIGQ9ZyxtPXZlKHAsZCkseT12ZShkLGQpLE09bSptLXkqKHZlKHAscCktMSk7aWYoISgwPk0pKXt2YXIgeD1NYXRoLnNxcnQoTSksYj15ZShkLCgtbS14KS95KTtpZihtZShiLHApLGI9eGUoYiksIWUpcmV0dXJuIGI7dmFyIF8sdz1uWzBdLFM9dFswXSxrPW5bMV0sRT10WzFdO3c+UyYmKF89dyx3PVMsUz1fKTt2YXIgQT1TLXcsTj1nYShBLXFhKTxDYSxDPU58fENhPkE7aWYoIU4mJms+RSYmKF89ayxrPUUsRT1fKSxDP04/aytFPjBeYlsxXTwoZ2EoYlswXS13KTxDYT9rOkUpOms8PWJbMV0mJmJbMV08PUU6QT5xYV4odzw9YlswXSYmYlswXTw9Uykpe3ZhciB6PXllKGQsKC1tK3gpL3kpO3JldHVybiBtZSh6LHApLFtiLHhlKHopXX19fWZ1bmN0aW9uIHUodCxlKXt2YXIgcj1vP246cWEtbix1PTA7cmV0dXJuLXI+dD91fD0xOnQ+ciYmKHV8PTIpLC1yPmU/dXw9NDplPnImJih1fD04KSx1fXZhciBpPU1hdGguY29zKG4pLG89aT4wLGE9Z2EoaSk+Q2EsYz1ncihuLDYqRGEpO3JldHVybiBMZSh0LGUsYyxvP1swLC1uXTpbLXFhLG4tcWFdKX1mdW5jdGlvbiBPZShuLHQsZSxyKXtyZXR1cm4gZnVuY3Rpb24odSl7dmFyIGksbz11LmEsYT11LmIsYz1vLngsbD1vLnkscz1hLngsZj1hLnksaD0wLGc9MSxwPXMtYyx2PWYtbDtpZihpPW4tYyxwfHwhKGk+MCkpe2lmKGkvPXAsMD5wKXtpZihoPmkpcmV0dXJuO2c+aSYmKGc9aSl9ZWxzZSBpZihwPjApe2lmKGk+ZylyZXR1cm47aT5oJiYoaD1pKX1pZihpPWUtYyxwfHwhKDA+aSkpe2lmKGkvPXAsMD5wKXtpZihpPmcpcmV0dXJuO2k+aCYmKGg9aSl9ZWxzZSBpZihwPjApe2lmKGg+aSlyZXR1cm47Zz5pJiYoZz1pKX1pZihpPXQtbCx2fHwhKGk+MCkpe2lmKGkvPXYsMD52KXtpZihoPmkpcmV0dXJuO2c+aSYmKGc9aSl9ZWxzZSBpZih2PjApe2lmKGk+ZylyZXR1cm47aT5oJiYoaD1pKX1pZihpPXItbCx2fHwhKDA+aSkpe2lmKGkvPXYsMD52KXtpZihpPmcpcmV0dXJuO2k+aCYmKGg9aSl9ZWxzZSBpZih2PjApe2lmKGg+aSlyZXR1cm47Zz5pJiYoZz1pKX1yZXR1cm4gaD4wJiYodS5hPXt4OmMraCpwLHk6bCtoKnZ9KSwxPmcmJih1LmI9e3g6YytnKnAseTpsK2cqdn0pLHV9fX19fX1mdW5jdGlvbiBJZShuLHQsZSxyKXtmdW5jdGlvbiB1KHIsdSl7cmV0dXJuIGdhKHJbMF0tbik8Q2E/dT4wPzA6MzpnYShyWzBdLWUpPENhP3U+MD8yOjE6Z2EoclsxXS10KTxDYT91PjA/MTowOnU+MD8zOjJ9ZnVuY3Rpb24gaShuLHQpe3JldHVybiBvKG4ueCx0LngpfWZ1bmN0aW9uIG8obix0KXt2YXIgZT11KG4sMSkscj11KHQsMSk7cmV0dXJuIGUhPT1yP2UtcjowPT09ZT90WzFdLW5bMV06MT09PWU/blswXS10WzBdOjI9PT1lP25bMV0tdFsxXTp0WzBdLW5bMF19cmV0dXJuIGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMobil7Zm9yKHZhciB0PTAsZT1kLmxlbmd0aCxyPW5bMV0sdT0wO2U+dTsrK3UpZm9yKHZhciBpLG89MSxhPWRbdV0sYz1hLmxlbmd0aCxsPWFbMF07Yz5vOysrbylpPWFbb10sbFsxXTw9cj9pWzFdPnImJlEobCxpLG4pPjAmJisrdDppWzFdPD1yJiZRKGwsaSxuKTwwJiYtLXQsbD1pO3JldHVybiAwIT09dH1mdW5jdGlvbiBsKGksYSxjLGwpe3ZhciBzPTAsZj0wO2lmKG51bGw9PWl8fChzPXUoaSxjKSkhPT0oZj11KGEsYykpfHxvKGksYSk8MF5jPjApe2RvIGwucG9pbnQoMD09PXN8fDM9PT1zP246ZSxzPjE/cjp0KTt3aGlsZSgocz0ocytjKzQpJTQpIT09Zil9ZWxzZSBsLnBvaW50KGFbMF0sYVsxXSl9ZnVuY3Rpb24gcyh1LGkpe3JldHVybiB1Pj1uJiZlPj11JiZpPj10JiZyPj1pfWZ1bmN0aW9uIGYobix0KXtzKG4sdCkmJmEucG9pbnQobix0KX1mdW5jdGlvbiBoKCl7Qy5wb2ludD1wLGQmJmQucHVzaChtPVtdKSxTPSEwLHc9ITEsYj1fPTAvMH1mdW5jdGlvbiBnKCl7diYmKHAoeSxNKSx4JiZ3JiZBLnJlam9pbigpLHYucHVzaChBLmJ1ZmZlcigpKSksQy5wb2ludD1mLHcmJmEubGluZUVuZCgpfWZ1bmN0aW9uIHAobix0KXtuPU1hdGgubWF4KC1UYyxNYXRoLm1pbihUYyxuKSksdD1NYXRoLm1heCgtVGMsTWF0aC5taW4oVGMsdCkpO3ZhciBlPXMobix0KTtpZihkJiZtLnB1c2goW24sdF0pLFMpeT1uLE09dCx4PWUsUz0hMSxlJiYoYS5saW5lU3RhcnQoKSxhLnBvaW50KG4sdCkpO2Vsc2UgaWYoZSYmdylhLnBvaW50KG4sdCk7ZWxzZXt2YXIgcj17YTp7eDpiLHk6X30sYjp7eDpuLHk6dH19O04ocik/KHd8fChhLmxpbmVTdGFydCgpLGEucG9pbnQoci5hLngsci5hLnkpKSxhLnBvaW50KHIuYi54LHIuYi55KSxlfHxhLmxpbmVFbmQoKSxrPSExKTplJiYoYS5saW5lU3RhcnQoKSxhLnBvaW50KG4sdCksaz0hMSl9Yj1uLF89dCx3PWV9dmFyIHYsZCxtLHksTSx4LGIsXyx3LFMsayxFPWEsQT1SZSgpLE49T2Uobix0LGUsciksQz17cG9pbnQ6ZixsaW5lU3RhcnQ6aCxsaW5lRW5kOmcscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7YT1BLHY9W10sZD1bXSxrPSEwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7YT1FLHY9dGEubWVyZ2Uodik7dmFyIHQ9YyhbbixyXSksZT1rJiZ0LHU9di5sZW5ndGg7KGV8fHUpJiYoYS5wb2x5Z29uU3RhcnQoKSxlJiYoYS5saW5lU3RhcnQoKSxsKG51bGwsbnVsbCwxLGEpLGEubGluZUVuZCgpKSx1JiZDZSh2LGksdCxsLGEpLGEucG9seWdvbkVuZCgpKSx2PWQ9bT1udWxsfX07cmV0dXJuIEN9fWZ1bmN0aW9uIFllKG4pe3ZhciB0PTAsZT1xYS8zLHI9aXIobiksdT1yKHQsZSk7cmV0dXJuIHUucGFyYWxsZWxzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3IodD1uWzBdKnFhLzE4MCxlPW5bMV0qcWEvMTgwKTpbdC9xYSoxODAsZS9xYSoxODBdfSx1fWZ1bmN0aW9uIFplKG4sdCl7ZnVuY3Rpb24gZShuLHQpe3ZhciBlPU1hdGguc3FydChpLTIqdSpNYXRoLnNpbih0KSkvdTtyZXR1cm5bZSpNYXRoLnNpbihuKj11KSxvLWUqTWF0aC5jb3MobildfXZhciByPU1hdGguc2luKG4pLHU9KHIrTWF0aC5zaW4odCkpLzIsaT0xK3IqKDIqdS1yKSxvPU1hdGguc3FydChpKS91O3JldHVybiBlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPW8tdDtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL3UsdHQoKGktKG4qbitlKmUpKnUqdSkvKDIqdSkpXX0sZX1mdW5jdGlvbiBWZSgpe2Z1bmN0aW9uIG4obix0KXtEYys9dSpuLXIqdCxyPW4sdT10fXZhciB0LGUscix1O0hjLnBvaW50PWZ1bmN0aW9uKGksbyl7SGMucG9pbnQ9bix0PXI9aSxlPXU9b30sSGMubGluZUVuZD1mdW5jdGlvbigpe24odCxlKX19ZnVuY3Rpb24gWGUobix0KXtQYz5uJiYoUGM9biksbj5qYyYmKGpjPW4pLFVjPnQmJihVYz10KSx0PkZjJiYoRmM9dCl9ZnVuY3Rpb24gJGUoKXtmdW5jdGlvbiBuKG4sdCl7by5wdXNoKCJNIixuLCIsIix0LGkpfWZ1bmN0aW9uIHQobix0KXtvLnB1c2goIk0iLG4sIiwiLHQpLGEucG9pbnQ9ZX1mdW5jdGlvbiBlKG4sdCl7by5wdXNoKCJMIixuLCIsIix0KX1mdW5jdGlvbiByKCl7YS5wb2ludD1ufWZ1bmN0aW9uIHUoKXtvLnB1c2goIloiKX12YXIgaT1CZSg0LjUpLG89W10sYT17cG9pbnQ6bixsaW5lU3RhcnQ6ZnVuY3Rpb24oKXthLnBvaW50PXR9LGxpbmVFbmQ6cixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXthLmxpbmVFbmQ9dX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2EubGluZUVuZD1yLGEucG9pbnQ9bn0scG9pbnRSYWRpdXM6ZnVuY3Rpb24obil7cmV0dXJuIGk9QmUobiksYX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYoby5sZW5ndGgpe3ZhciBuPW8uam9pbigiIik7cmV0dXJuIG89W10sbn19fTtyZXR1cm4gYX1mdW5jdGlvbiBCZShuKXtyZXR1cm4ibTAsIituKyJhIituKyIsIituKyIgMCAxLDEgMCwiKy0yKm4rImEiK24rIiwiK24rIiAwIDEsMSAwLCIrMipuKyJ6In1mdW5jdGlvbiBXZShuLHQpe19jKz1uLHdjKz10LCsrU2N9ZnVuY3Rpb24gSmUoKXtmdW5jdGlvbiBuKG4scil7dmFyIHU9bi10LGk9ci1lLG89TWF0aC5zcXJ0KHUqdStpKmkpO2tjKz1vKih0K24pLzIsRWMrPW8qKGUrcikvMixBYys9byxXZSh0PW4sZT1yKX12YXIgdCxlO0ljLnBvaW50PWZ1bmN0aW9uKHIsdSl7SWMucG9pbnQ9bixXZSh0PXIsZT11KX19ZnVuY3Rpb24gR2UoKXtJYy5wb2ludD1XZX1mdW5jdGlvbiBLZSgpe2Z1bmN0aW9uIG4obix0KXt2YXIgZT1uLXIsaT10LXUsbz1NYXRoLnNxcnQoZSplK2kqaSk7a2MrPW8qKHIrbikvMixFYys9byoodSt0KS8yLEFjKz1vLG89dSpuLXIqdCxOYys9byoocituKSxDYys9byoodSt0KSx6Yys9MypvLFdlKHI9bix1PXQpfXZhciB0LGUscix1O0ljLnBvaW50PWZ1bmN0aW9uKGksbyl7SWMucG9pbnQ9bixXZSh0PXI9aSxlPXU9byl9LEljLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSl9fWZ1bmN0aW9uIFFlKG4pe2Z1bmN0aW9uIHQodCxlKXtuLm1vdmVUbyh0K28sZSksbi5hcmModCxlLG8sMCxMYSl9ZnVuY3Rpb24gZSh0LGUpe24ubW92ZVRvKHQsZSksYS5wb2ludD1yfWZ1bmN0aW9uIHIodCxlKXtuLmxpbmVUbyh0LGUpfWZ1bmN0aW9uIHUoKXthLnBvaW50PXR9ZnVuY3Rpb24gaSgpe24uY2xvc2VQYXRoKCl9dmFyIG89NC41LGE9e3BvaW50OnQsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7YS5wb2ludD1lfSxsaW5lRW5kOnUscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7YS5saW5lRW5kPWl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXthLmxpbmVFbmQ9dSxhLnBvaW50PXR9LHBvaW50UmFkaXVzOmZ1bmN0aW9uKG4pe3JldHVybiBvPW4sYX0scmVzdWx0OmJ9O3JldHVybiBhfWZ1bmN0aW9uIG5yKG4pe2Z1bmN0aW9uIHQobil7cmV0dXJuKGE/cjplKShuKX1mdW5jdGlvbiBlKHQpe3JldHVybiBycih0LGZ1bmN0aW9uKGUscil7ZT1uKGUsciksdC5wb2ludChlWzBdLGVbMV0pfSl9ZnVuY3Rpb24gcih0KXtmdW5jdGlvbiBlKGUscil7ZT1uKGUsciksdC5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIHIoKXtNPTAvMCxTLnBvaW50PWksdC5saW5lU3RhcnQoKX1mdW5jdGlvbiBpKGUscil7dmFyIGk9cGUoW2Uscl0pLG89bihlLHIpO3UoTSx4LHksYixfLHcsTT1vWzBdLHg9b1sxXSx5PWUsYj1pWzBdLF89aVsxXSx3PWlbMl0sYSx0KSx0LnBvaW50KE0seCl9ZnVuY3Rpb24gbygpe1MucG9pbnQ9ZSx0LmxpbmVFbmQoKX1mdW5jdGlvbiBjKCl7cigpLFMucG9pbnQ9bCxTLmxpbmVFbmQ9c31mdW5jdGlvbiBsKG4sdCl7aShmPW4saD10KSxnPU0scD14LHY9YixkPV8sbT13LFMucG9pbnQ9aX1mdW5jdGlvbiBzKCl7dShNLHgseSxiLF8sdyxnLHAsZix2LGQsbSxhLHQpLFMubGluZUVuZD1vLG8oKX12YXIgZixoLGcscCx2LGQsbSx5LE0seCxiLF8sdyxTPXtwb2ludDplLGxpbmVTdGFydDpyLGxpbmVFbmQ6byxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0LnBvbHlnb25TdGFydCgpLFMubGluZVN0YXJ0PWMNCn0scG9seWdvbkVuZDpmdW5jdGlvbigpe3QucG9seWdvbkVuZCgpLFMubGluZVN0YXJ0PXJ9fTtyZXR1cm4gU31mdW5jdGlvbiB1KHQsZSxyLGEsYyxsLHMsZixoLGcscCx2LGQsbSl7dmFyIHk9cy10LE09Zi1lLHg9eSp5K00qTTtpZih4PjQqaSYmZC0tKXt2YXIgYj1hK2csXz1jK3Asdz1sK3YsUz1NYXRoLnNxcnQoYipiK18qXyt3KncpLGs9TWF0aC5hc2luKHcvPVMpLEU9Z2EoZ2EodyktMSk8Q2F8fGdhKHItaCk8Q2E/KHIraCkvMjpNYXRoLmF0YW4yKF8sYiksQT1uKEUsayksTj1BWzBdLEM9QVsxXSx6PU4tdCxxPUMtZSxMPU0qei15KnE7KEwqTC94Pml8fGdhKCh5KnorTSpxKS94LS41KT4uM3x8bz5hKmcrYypwK2wqdikmJih1KHQsZSxyLGEsYyxsLE4sQyxFLGIvPVMsXy89Uyx3LGQsbSksbS5wb2ludChOLEMpLHUoTixDLEUsYixfLHcscyxmLGgsZyxwLHYsZCxtKSl9fXZhciBpPS41LG89TWF0aC5jb3MoMzAqRGEpLGE9MTY7cmV0dXJuIHQucHJlY2lzaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPShpPW4qbik+MCYmMTYsdCk6TWF0aC5zcXJ0KGkpfSx0fWZ1bmN0aW9uIHRyKG4pe3ZhciB0PW5yKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4oW3QqUGEsZSpQYV0pfSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBvcih0KG4pKX19ZnVuY3Rpb24gZXIobil7dGhpcy5zdHJlYW09bn1mdW5jdGlvbiBycihuLHQpe3JldHVybntwb2ludDp0LHNwaGVyZTpmdW5jdGlvbigpe24uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe24ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtuLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7bi5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe24ucG9seWdvbkVuZCgpfX19ZnVuY3Rpb24gdXIobil7cmV0dXJuIGlyKGZ1bmN0aW9uKCl7cmV0dXJuIG59KSgpfWZ1bmN0aW9uIGlyKG4pe2Z1bmN0aW9uIHQobil7cmV0dXJuIG49YShuWzBdKkRhLG5bMV0qRGEpLFtuWzBdKmgrYyxsLW5bMV0qaF19ZnVuY3Rpb24gZShuKXtyZXR1cm4gbj1hLmludmVydCgoblswXS1jKS9oLChsLW5bMV0pL2gpLG4mJltuWzBdKlBhLG5bMV0qUGFdfWZ1bmN0aW9uIHIoKXthPUFlKG89bHIobSxNLHgpLGkpO3ZhciBuPWkodixkKTtyZXR1cm4gYz1nLW5bMF0qaCxsPXArblsxXSpoLHUoKX1mdW5jdGlvbiB1KCl7cmV0dXJuIHMmJihzLnZhbGlkPSExLHM9bnVsbCksdH12YXIgaSxvLGEsYyxsLHMsZj1ucihmdW5jdGlvbihuLHQpe3JldHVybiBuPWkobix0KSxbblswXSpoK2MsbC1uWzFdKmhdfSksaD0xNTAsZz00ODAscD0yNTAsdj0wLGQ9MCxtPTAsTT0wLHg9MCxiPUxjLF89eSx3PW51bGwsUz1udWxsO3JldHVybiB0LnN0cmVhbT1mdW5jdGlvbihuKXtyZXR1cm4gcyYmKHMudmFsaWQ9ITEpLHM9b3IoYihvLGYoXyhuKSkpKSxzLnZhbGlkPSEwLHN9LHQuY2xpcEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPW51bGw9PW4/KHc9bixMYyk6SGUoKHc9K24pKkRhKSx1KCkpOnd9LHQuY2xpcEV4dGVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oUz1uLF89bj9JZShuWzBdWzBdLG5bMF1bMV0sblsxXVswXSxuWzFdWzFdKTp5LHUoKSk6U30sdC5zY2FsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rbixyKCkpOmh9LHQudHJhbnNsYXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPStuWzBdLHA9K25bMV0scigpKTpbZyxwXX0sdC5jZW50ZXI9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9blswXSUzNjAqRGEsZD1uWzFdJTM2MCpEYSxyKCkpOlt2KlBhLGQqUGFdfSx0LnJvdGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT1uWzBdJTM2MCpEYSxNPW5bMV0lMzYwKkRhLHg9bi5sZW5ndGg+Mj9uWzJdJTM2MCpEYTowLHIoKSk6W20qUGEsTSpQYSx4KlBhXX0sdGEucmViaW5kKHQsZiwicHJlY2lzaW9uIiksZnVuY3Rpb24oKXtyZXR1cm4gaT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0LmludmVydD1pLmludmVydCYmZSxyKCl9fWZ1bmN0aW9uIG9yKG4pe3JldHVybiBycihuLGZ1bmN0aW9uKHQsZSl7bi5wb2ludCh0KkRhLGUqRGEpfSl9ZnVuY3Rpb24gYXIobix0KXtyZXR1cm5bbix0XX1mdW5jdGlvbiBjcihuLHQpe3JldHVybltuPnFhP24tTGE6LXFhPm4/bitMYTpuLHRdfWZ1bmN0aW9uIGxyKG4sdCxlKXtyZXR1cm4gbj90fHxlP0FlKGZyKG4pLGhyKHQsZSkpOmZyKG4pOnR8fGU/aHIodCxlKTpjcn1mdW5jdGlvbiBzcihuKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gdCs9bixbdD5xYT90LUxhOi1xYT50P3QrTGE6dCxlXX19ZnVuY3Rpb24gZnIobil7dmFyIHQ9c3Iobik7cmV0dXJuIHQuaW52ZXJ0PXNyKC1uKSx0fWZ1bmN0aW9uIGhyKG4sdCl7ZnVuY3Rpb24gZShuLHQpe3ZhciBlPU1hdGguY29zKHQpLGE9TWF0aC5jb3MobikqZSxjPU1hdGguc2luKG4pKmUsbD1NYXRoLnNpbih0KSxzPWwqcithKnU7cmV0dXJuW01hdGguYXRhbjIoYyppLXMqbyxhKnItbCp1KSx0dChzKmkrYypvKV19dmFyIHI9TWF0aC5jb3MobiksdT1NYXRoLnNpbihuKSxpPU1hdGguY29zKHQpLG89TWF0aC5zaW4odCk7cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKG4sdCl7dmFyIGU9TWF0aC5jb3ModCksYT1NYXRoLmNvcyhuKSplLGM9TWF0aC5zaW4obikqZSxsPU1hdGguc2luKHQpLHM9bCppLWMqbztyZXR1cm5bTWF0aC5hdGFuMihjKmkrbCpvLGEqcitzKnUpLHR0KHMqci1hKnUpXX0sZX1mdW5jdGlvbiBncihuLHQpe3ZhciBlPU1hdGguY29zKG4pLHI9TWF0aC5zaW4obik7cmV0dXJuIGZ1bmN0aW9uKHUsaSxvLGEpe3ZhciBjPW8qdDtudWxsIT11Pyh1PXByKGUsdSksaT1wcihlLGkpLChvPjA/aT51OnU+aSkmJih1Kz1vKkxhKSk6KHU9bitvKkxhLGk9bi0uNSpjKTtmb3IodmFyIGwscz11O28+MD9zPmk6aT5zO3MtPWMpYS5wb2ludCgobD14ZShbZSwtcipNYXRoLmNvcyhzKSwtcipNYXRoLnNpbihzKV0pKVswXSxsWzFdKX19ZnVuY3Rpb24gcHIobix0KXt2YXIgZT1wZSh0KTtlWzBdLT1uLE1lKGUpO3ZhciByPW50KC1lWzFdKTtyZXR1cm4oKC1lWzJdPDA/LXI6cikrMipNYXRoLlBJLUNhKSUoMipNYXRoLlBJKX1mdW5jdGlvbiB2cihuLHQsZSl7dmFyIHI9dGEucmFuZ2Uobix0LUNhLGUpLmNvbmNhdCh0KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKHQpe3JldHVybltuLHRdfSl9fWZ1bmN0aW9uIGRyKG4sdCxlKXt2YXIgcj10YS5yYW5nZShuLHQtQ2EsZSkuY29uY2F0KHQpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gci5tYXAoZnVuY3Rpb24odCl7cmV0dXJuW3Qsbl19KX19ZnVuY3Rpb24gbXIobil7cmV0dXJuIG4uc291cmNlfWZ1bmN0aW9uIHlyKG4pe3JldHVybiBuLnRhcmdldH1mdW5jdGlvbiBNcihuLHQsZSxyKXt2YXIgdT1NYXRoLmNvcyh0KSxpPU1hdGguc2luKHQpLG89TWF0aC5jb3MociksYT1NYXRoLnNpbihyKSxjPXUqTWF0aC5jb3MobiksbD11Kk1hdGguc2luKG4pLHM9bypNYXRoLmNvcyhlKSxmPW8qTWF0aC5zaW4oZSksaD0yKk1hdGguYXNpbihNYXRoLnNxcnQoaXQoci10KSt1Km8qaXQoZS1uKSkpLGc9MS9NYXRoLnNpbihoKSxwPWg/ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zaW4obio9aCkqZyxlPU1hdGguc2luKGgtbikqZyxyPWUqYyt0KnMsdT1lKmwrdCpmLG89ZSppK3QqYTtyZXR1cm5bTWF0aC5hdGFuMih1LHIpKlBhLE1hdGguYXRhbjIobyxNYXRoLnNxcnQocipyK3UqdSkpKlBhXX06ZnVuY3Rpb24oKXtyZXR1cm5bbipQYSx0KlBhXX07cmV0dXJuIHAuZGlzdGFuY2U9aCxwfWZ1bmN0aW9uIHhyKCl7ZnVuY3Rpb24gbihuLHUpe3ZhciBpPU1hdGguc2luKHUqPURhKSxvPU1hdGguY29zKHUpLGE9Z2EoKG4qPURhKS10KSxjPU1hdGguY29zKGEpO1ljKz1NYXRoLmF0YW4yKE1hdGguc3FydCgoYT1vKk1hdGguc2luKGEpKSphKyhhPXIqaS1lKm8qYykqYSksZSppK3IqbypjKSx0PW4sZT1pLHI9b312YXIgdCxlLHI7WmMucG9pbnQ9ZnVuY3Rpb24odSxpKXt0PXUqRGEsZT1NYXRoLnNpbihpKj1EYSkscj1NYXRoLmNvcyhpKSxaYy5wb2ludD1ufSxaYy5saW5lRW5kPWZ1bmN0aW9uKCl7WmMucG9pbnQ9WmMubGluZUVuZD1ifX1mdW5jdGlvbiBicihuLHQpe2Z1bmN0aW9uIGUodCxlKXt2YXIgcj1NYXRoLmNvcyh0KSx1PU1hdGguY29zKGUpLGk9bihyKnUpO3JldHVybltpKnUqTWF0aC5zaW4odCksaSpNYXRoLnNpbihlKV19cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKG4sZSl7dmFyIHI9TWF0aC5zcXJ0KG4qbitlKmUpLHU9dChyKSxpPU1hdGguc2luKHUpLG89TWF0aC5jb3ModSk7cmV0dXJuW01hdGguYXRhbjIobippLHIqbyksTWF0aC5hc2luKHImJmUqaS9yKV19LGV9ZnVuY3Rpb24gX3Iobix0KXtmdW5jdGlvbiBlKG4sdCl7bz4wPy1SYStDYT50JiYodD0tUmErQ2EpOnQ+UmEtQ2EmJih0PVJhLUNhKTt2YXIgZT1vL01hdGgucG93KHUodCksaSk7cmV0dXJuW2UqTWF0aC5zaW4oaSpuKSxvLWUqTWF0aC5jb3MoaSpuKV19dmFyIHI9TWF0aC5jb3MobiksdT1mdW5jdGlvbihuKXtyZXR1cm4gTWF0aC50YW4ocWEvNCtuLzIpfSxpPW49PT10P01hdGguc2luKG4pOk1hdGgubG9nKHIvTWF0aC5jb3ModCkpL01hdGgubG9nKHUodCkvdShuKSksbz1yKk1hdGgucG93KHUobiksaSkvaTtyZXR1cm4gaT8oZS5pbnZlcnQ9ZnVuY3Rpb24obix0KXt2YXIgZT1vLXQscj1LKGkpKk1hdGguc3FydChuKm4rZSplKTtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL2ksMipNYXRoLmF0YW4oTWF0aC5wb3coby9yLDEvaSkpLVJhXX0sZSk6U3J9ZnVuY3Rpb24gd3Iobix0KXtmdW5jdGlvbiBlKG4sdCl7dmFyIGU9aS10O3JldHVybltlKk1hdGguc2luKHUqbiksaS1lKk1hdGguY29zKHUqbildfXZhciByPU1hdGguY29zKG4pLHU9bj09PXQ/TWF0aC5zaW4obik6KHItTWF0aC5jb3ModCkpLyh0LW4pLGk9ci91K247cmV0dXJuIGdhKHUpPENhP2FyOihlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPWktdDtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL3UsaS1LKHUpKk1hdGguc3FydChuKm4rZSplKV19LGUpfWZ1bmN0aW9uIFNyKG4sdCl7cmV0dXJuW24sTWF0aC5sb2coTWF0aC50YW4ocWEvNCt0LzIpKV19ZnVuY3Rpb24ga3Iobil7dmFyIHQsZT11cihuKSxyPWUuc2NhbGUsdT1lLnRyYW5zbGF0ZSxpPWUuY2xpcEV4dGVudDtyZXR1cm4gZS5zY2FsZT1mdW5jdGlvbigpe3ZhciBuPXIuYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybiBuPT09ZT90P2UuY2xpcEV4dGVudChudWxsKTplOm59LGUudHJhbnNsYXRlPWZ1bmN0aW9uKCl7dmFyIG49dS5hcHBseShlLGFyZ3VtZW50cyk7cmV0dXJuIG49PT1lP3Q/ZS5jbGlwRXh0ZW50KG51bGwpOmU6bn0sZS5jbGlwRXh0ZW50PWZ1bmN0aW9uKG4pe3ZhciBvPWkuYXBwbHkoZSxhcmd1bWVudHMpO2lmKG89PT1lKXtpZih0PW51bGw9PW4pe3ZhciBhPXFhKnIoKSxjPXUoKTtpKFtbY1swXS1hLGNbMV0tYV0sW2NbMF0rYSxjWzFdK2FdXSl9fWVsc2UgdCYmKG89bnVsbCk7cmV0dXJuIG99LGUuY2xpcEV4dGVudChudWxsKX1mdW5jdGlvbiBFcihuLHQpe3JldHVybltNYXRoLmxvZyhNYXRoLnRhbihxYS80K3QvMikpLC1uXX1mdW5jdGlvbiBBcihuKXtyZXR1cm4gblswXX1mdW5jdGlvbiBOcihuKXtyZXR1cm4gblsxXX1mdW5jdGlvbiBDcihuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT1bMCwxXSxyPTIsdT0yO3Q+dTt1Kyspe2Zvcig7cj4xJiZRKG5bZVtyLTJdXSxuW2Vbci0xXV0sblt1XSk8PTA7KS0tcjtlW3IrK109dX1yZXR1cm4gZS5zbGljZSgwLHIpfWZ1bmN0aW9uIHpyKG4sdCl7cmV0dXJuIG5bMF0tdFswXXx8blsxXS10WzFdfWZ1bmN0aW9uIHFyKG4sdCxlKXtyZXR1cm4oZVswXS10WzBdKSooblsxXS10WzFdKTwoZVsxXS10WzFdKSooblswXS10WzBdKX1mdW5jdGlvbiBMcihuLHQsZSxyKXt2YXIgdT1uWzBdLGk9ZVswXSxvPXRbMF0tdSxhPXJbMF0taSxjPW5bMV0sbD1lWzFdLHM9dFsxXS1jLGY9clsxXS1sLGg9KGEqKGMtbCktZioodS1pKSkvKGYqby1hKnMpO3JldHVyblt1K2gqbyxjK2gqc119ZnVuY3Rpb24gVHIobil7dmFyIHQ9blswXSxlPW5bbi5sZW5ndGgtMV07cmV0dXJuISh0WzBdLWVbMF18fHRbMV0tZVsxXSl9ZnVuY3Rpb24gUnIoKXt0dSh0aGlzKSx0aGlzLmVkZ2U9dGhpcy5zaXRlPXRoaXMuY2lyY2xlPW51bGx9ZnVuY3Rpb24gRHIobil7dmFyIHQ9ZWwucG9wKCl8fG5ldyBScjtyZXR1cm4gdC5zaXRlPW4sdH1mdW5jdGlvbiBQcihuKXtYcihuKSxRYy5yZW1vdmUobiksZWwucHVzaChuKSx0dShuKX1mdW5jdGlvbiBVcihuKXt2YXIgdD1uLmNpcmNsZSxlPXQueCxyPXQuY3ksdT17eDplLHk6cn0saT1uLlAsbz1uLk4sYT1bbl07UHIobik7Zm9yKHZhciBjPWk7Yy5jaXJjbGUmJmdhKGUtYy5jaXJjbGUueCk8Q2EmJmdhKHItYy5jaXJjbGUuY3kpPENhOylpPWMuUCxhLnVuc2hpZnQoYyksUHIoYyksYz1pO2EudW5zaGlmdChjKSxYcihjKTtmb3IodmFyIGw9bztsLmNpcmNsZSYmZ2EoZS1sLmNpcmNsZS54KTxDYSYmZ2Eoci1sLmNpcmNsZS5jeSk8Q2E7KW89bC5OLGEucHVzaChsKSxQcihsKSxsPW87YS5wdXNoKGwpLFhyKGwpO3ZhciBzLGY9YS5sZW5ndGg7Zm9yKHM9MTtmPnM7KytzKWw9YVtzXSxjPWFbcy0xXSxLcihsLmVkZ2UsYy5zaXRlLGwuc2l0ZSx1KTtjPWFbMF0sbD1hW2YtMV0sbC5lZGdlPUpyKGMuc2l0ZSxsLnNpdGUsbnVsbCx1KSxWcihjKSxWcihsKX1mdW5jdGlvbiBqcihuKXtmb3IodmFyIHQsZSxyLHUsaT1uLngsbz1uLnksYT1RYy5fO2E7KWlmKHI9RnIoYSxvKS1pLHI+Q2EpYT1hLkw7ZWxzZXtpZih1PWktSHIoYSxvKSwhKHU+Q2EpKXtyPi1DYT8odD1hLlAsZT1hKTp1Pi1DYT8odD1hLGU9YS5OKTp0PWU9YTticmVha31pZighYS5SKXt0PWE7YnJlYWt9YT1hLlJ9dmFyIGM9RHIobik7aWYoUWMuaW5zZXJ0KHQsYyksdHx8ZSl7aWYodD09PWUpcmV0dXJuIFhyKHQpLGU9RHIodC5zaXRlKSxRYy5pbnNlcnQoYyxlKSxjLmVkZ2U9ZS5lZGdlPUpyKHQuc2l0ZSxjLnNpdGUpLFZyKHQpLHZvaWQgVnIoZSk7aWYoIWUpcmV0dXJuIHZvaWQoYy5lZGdlPUpyKHQuc2l0ZSxjLnNpdGUpKTtYcih0KSxYcihlKTt2YXIgbD10LnNpdGUscz1sLngsZj1sLnksaD1uLngtcyxnPW4ueS1mLHA9ZS5zaXRlLHY9cC54LXMsZD1wLnktZixtPTIqKGgqZC1nKnYpLHk9aCpoK2cqZyxNPXYqditkKmQseD17eDooZCp5LWcqTSkvbStzLHk6KGgqTS12KnkpL20rZn07S3IoZS5lZGdlLGwscCx4KSxjLmVkZ2U9SnIobCxuLG51bGwseCksZS5lZGdlPUpyKG4scCxudWxsLHgpLFZyKHQpLFZyKGUpfX1mdW5jdGlvbiBGcihuLHQpe3ZhciBlPW4uc2l0ZSxyPWUueCx1PWUueSxpPXUtdDtpZighaSlyZXR1cm4gcjt2YXIgbz1uLlA7aWYoIW8pcmV0dXJuLTEvMDtlPW8uc2l0ZTt2YXIgYT1lLngsYz1lLnksbD1jLXQ7aWYoIWwpcmV0dXJuIGE7dmFyIHM9YS1yLGY9MS9pLTEvbCxoPXMvbDtyZXR1cm4gZj8oLWgrTWF0aC5zcXJ0KGgqaC0yKmYqKHMqcy8oLTIqbCktYytsLzIrdS1pLzIpKSkvZityOihyK2EpLzJ9ZnVuY3Rpb24gSHIobix0KXt2YXIgZT1uLk47aWYoZSlyZXR1cm4gRnIoZSx0KTt2YXIgcj1uLnNpdGU7cmV0dXJuIHIueT09PXQ/ci54OjEvMH1mdW5jdGlvbiBPcihuKXt0aGlzLnNpdGU9bix0aGlzLmVkZ2VzPVtdfWZ1bmN0aW9uIElyKG4pe2Zvcih2YXIgdCxlLHIsdSxpLG8sYSxjLGwscyxmPW5bMF1bMF0saD1uWzFdWzBdLGc9blswXVsxXSxwPW5bMV1bMV0sdj1LYyxkPXYubGVuZ3RoO2QtLTspaWYoaT12W2RdLGkmJmkucHJlcGFyZSgpKWZvcihhPWkuZWRnZXMsYz1hLmxlbmd0aCxvPTA7Yz5vOylzPWFbb10uZW5kKCkscj1zLngsdT1zLnksbD1hWysrbyVjXS5zdGFydCgpLHQ9bC54LGU9bC55LChnYShyLXQpPkNhfHxnYSh1LWUpPkNhKSYmKGEuc3BsaWNlKG8sMCxuZXcgUXIoR3IoaS5zaXRlLHMsZ2Eoci1mKTxDYSYmcC11PkNhP3t4OmYseTpnYSh0LWYpPENhP2U6cH06Z2EodS1wKTxDYSYmaC1yPkNhP3t4OmdhKGUtcCk8Q2E/dDpoLHk6cH06Z2Eoci1oKTxDYSYmdS1nPkNhP3t4OmgseTpnYSh0LWgpPENhP2U6Z306Z2EodS1nKTxDYSYmci1mPkNhP3t4OmdhKGUtZyk8Q2E/dDpmLHk6Z306bnVsbCksaS5zaXRlLG51bGwpKSwrK2MpfWZ1bmN0aW9uIFlyKG4sdCl7cmV0dXJuIHQuYW5nbGUtbi5hbmdsZX1mdW5jdGlvbiBacigpe3R1KHRoaXMpLHRoaXMueD10aGlzLnk9dGhpcy5hcmM9dGhpcy5zaXRlPXRoaXMuY3k9bnVsbH1mdW5jdGlvbiBWcihuKXt2YXIgdD1uLlAsZT1uLk47aWYodCYmZSl7dmFyIHI9dC5zaXRlLHU9bi5zaXRlLGk9ZS5zaXRlO2lmKHIhPT1pKXt2YXIgbz11LngsYT11LnksYz1yLngtbyxsPXIueS1hLHM9aS54LW8sZj1pLnktYSxoPTIqKGMqZi1sKnMpO2lmKCEoaD49LXphKSl7dmFyIGc9YypjK2wqbCxwPXMqcytmKmYsdj0oZipnLWwqcCkvaCxkPShjKnAtcypnKS9oLGY9ZCthLG09cmwucG9wKCl8fG5ldyBacjttLmFyYz1uLG0uc2l0ZT11LG0ueD12K28sbS55PWYrTWF0aC5zcXJ0KHYqditkKmQpLG0uY3k9ZixuLmNpcmNsZT1tO2Zvcih2YXIgeT1udWxsLE09dGwuXztNOylpZihtLnk8TS55fHxtLnk9PT1NLnkmJm0ueDw9TS54KXtpZighTS5MKXt5PU0uUDticmVha31NPU0uTH1lbHNle2lmKCFNLlIpe3k9TTticmVha31NPU0uUn10bC5pbnNlcnQoeSxtKSx5fHwobmw9bSl9fX19ZnVuY3Rpb24gWHIobil7dmFyIHQ9bi5jaXJjbGU7dCYmKHQuUHx8KG5sPXQuTiksdGwucmVtb3ZlKHQpLHJsLnB1c2godCksdHUodCksbi5jaXJjbGU9bnVsbCl9ZnVuY3Rpb24gJHIobil7Zm9yKHZhciB0LGU9R2Mscj1PZShuWzBdWzBdLG5bMF1bMV0sblsxXVswXSxuWzFdWzFdKSx1PWUubGVuZ3RoO3UtLTspdD1lW3VdLCghQnIodCxuKXx8IXIodCl8fGdhKHQuYS54LXQuYi54KTxDYSYmZ2EodC5hLnktdC5iLnkpPENhKSYmKHQuYT10LmI9bnVsbCxlLnNwbGljZSh1LDEpKX1mdW5jdGlvbiBCcihuLHQpe3ZhciBlPW4uYjtpZihlKXJldHVybiEwO3ZhciByLHUsaT1uLmEsbz10WzBdWzBdLGE9dFsxXVswXSxjPXRbMF1bMV0sbD10WzFdWzFdLHM9bi5sLGY9bi5yLGg9cy54LGc9cy55LHA9Zi54LHY9Zi55LGQ9KGgrcCkvMixtPShnK3YpLzI7aWYodj09PWcpe2lmKG8+ZHx8ZD49YSlyZXR1cm47aWYoaD5wKXtpZihpKXtpZihpLnk+PWwpcmV0dXJufWVsc2UgaT17eDpkLHk6Y307ZT17eDpkLHk6bH19ZWxzZXtpZihpKXtpZihpLnk8YylyZXR1cm59ZWxzZSBpPXt4OmQseTpsfTtlPXt4OmQseTpjfX19ZWxzZSBpZihyPShoLXApLyh2LWcpLHU9bS1yKmQsLTE+cnx8cj4xKWlmKGg+cCl7aWYoaSl7aWYoaS55Pj1sKXJldHVybn1lbHNlIGk9e3g6KGMtdSkvcix5OmN9O2U9e3g6KGwtdSkvcix5Omx9fWVsc2V7aWYoaSl7aWYoaS55PGMpcmV0dXJufWVsc2UgaT17eDoobC11KS9yLHk6bH07ZT17eDooYy11KS9yLHk6Y319ZWxzZSBpZih2Pmcpe2lmKGkpe2lmKGkueD49YSlyZXR1cm59ZWxzZSBpPXt4Om8seTpyKm8rdX07ZT17eDphLHk6ciphK3V9fWVsc2V7aWYoaSl7aWYoaS54PG8pcmV0dXJufWVsc2UgaT17eDphLHk6ciphK3V9O2U9e3g6byx5OnIqbyt1fX1yZXR1cm4gbi5hPWksbi5iPWUsITB9ZnVuY3Rpb24gV3Iobix0KXt0aGlzLmw9bix0aGlzLnI9dCx0aGlzLmE9dGhpcy5iPW51bGx9ZnVuY3Rpb24gSnIobix0LGUscil7dmFyIHU9bmV3IFdyKG4sdCk7cmV0dXJuIEdjLnB1c2godSksZSYmS3IodSxuLHQsZSksciYmS3IodSx0LG4sciksS2Nbbi5pXS5lZGdlcy5wdXNoKG5ldyBRcih1LG4sdCkpLEtjW3QuaV0uZWRnZXMucHVzaChuZXcgUXIodSx0LG4pKSx1fWZ1bmN0aW9uIEdyKG4sdCxlKXt2YXIgcj1uZXcgV3IobixudWxsKTtyZXR1cm4gci5hPXQsci5iPWUsR2MucHVzaChyKSxyfWZ1bmN0aW9uIEtyKG4sdCxlLHIpe24uYXx8bi5iP24ubD09PWU/bi5iPXI6bi5hPXI6KG4uYT1yLG4ubD10LG4ucj1lKX1mdW5jdGlvbiBRcihuLHQsZSl7dmFyIHI9bi5hLHU9bi5iO3RoaXMuZWRnZT1uLHRoaXMuc2l0ZT10LHRoaXMuYW5nbGU9ZT9NYXRoLmF0YW4yKGUueS10LnksZS54LXQueCk6bi5sPT09dD9NYXRoLmF0YW4yKHUueC1yLngsci55LXUueSk6TWF0aC5hdGFuMihyLngtdS54LHUueS1yLnkpfWZ1bmN0aW9uIG51KCl7dGhpcy5fPW51bGx9ZnVuY3Rpb24gdHUobil7bi5VPW4uQz1uLkw9bi5SPW4uUD1uLk49bnVsbH1mdW5jdGlvbiBldShuLHQpe3ZhciBlPXQscj10LlIsdT1lLlU7dT91Lkw9PT1lP3UuTD1yOnUuUj1yOm4uXz1yLHIuVT11LGUuVT1yLGUuUj1yLkwsZS5SJiYoZS5SLlU9ZSksci5MPWV9ZnVuY3Rpb24gcnUobix0KXt2YXIgZT10LHI9dC5MLHU9ZS5VO3U/dS5MPT09ZT91Lkw9cjp1LlI9cjpuLl89cixyLlU9dSxlLlU9cixlLkw9ci5SLGUuTCYmKGUuTC5VPWUpLHIuUj1lfWZ1bmN0aW9uIHV1KG4pe2Zvcig7bi5MOyluPW4uTDtyZXR1cm4gbn1mdW5jdGlvbiBpdShuLHQpe3ZhciBlLHIsdSxpPW4uc29ydChvdSkucG9wKCk7Zm9yKEdjPVtdLEtjPW5ldyBBcnJheShuLmxlbmd0aCksUWM9bmV3IG51LHRsPW5ldyBudTs7KWlmKHU9bmwsaSYmKCF1fHxpLnk8dS55fHxpLnk9PT11LnkmJmkueDx1LngpKShpLnghPT1lfHxpLnkhPT1yKSYmKEtjW2kuaV09bmV3IE9yKGkpLGpyKGkpLGU9aS54LHI9aS55KSxpPW4ucG9wKCk7ZWxzZXtpZighdSlicmVhaztVcih1LmFyYyl9dCYmKCRyKHQpLElyKHQpKTt2YXIgbz17Y2VsbHM6S2MsZWRnZXM6R2N9O3JldHVybiBRYz10bD1HYz1LYz1udWxsLG99ZnVuY3Rpb24gb3Uobix0KXtyZXR1cm4gdC55LW4ueXx8dC54LW4ueH1mdW5jdGlvbiBhdShuLHQsZSl7cmV0dXJuKG4ueC1lLngpKih0Lnktbi55KS0obi54LXQueCkqKGUueS1uLnkpfWZ1bmN0aW9uIGN1KG4pe3JldHVybiBuLnh9ZnVuY3Rpb24gbHUobil7cmV0dXJuIG4ueX1mdW5jdGlvbiBzdSgpe3JldHVybntsZWFmOiEwLG5vZGVzOltdLHBvaW50Om51bGwseDpudWxsLHk6bnVsbH19ZnVuY3Rpb24gZnUobix0LGUscix1LGkpe2lmKCFuKHQsZSxyLHUsaSkpe3ZhciBvPS41KihlK3UpLGE9LjUqKHIraSksYz10Lm5vZGVzO2NbMF0mJmZ1KG4sY1swXSxlLHIsbyxhKSxjWzFdJiZmdShuLGNbMV0sbyxyLHUsYSksY1syXSYmZnUobixjWzJdLGUsYSxvLGkpLGNbM10mJmZ1KG4sY1szXSxvLGEsdSxpKX19ZnVuY3Rpb24gaHUobix0LGUscix1LGksbyl7dmFyIGEsYz0xLzA7cmV0dXJuIGZ1bmN0aW9uIGwobixzLGYsaCxnKXtpZighKHM+aXx8Zj5vfHxyPmh8fHU+Zykpe2lmKHA9bi5wb2ludCl7dmFyIHAsdj10LW4ueCxkPWUtbi55LG09dip2K2QqZDtpZihjPm0pe3ZhciB5PU1hdGguc3FydChjPW0pO3I9dC15LHU9ZS15LGk9dCt5LG89ZSt5LGE9cH19Zm9yKHZhciBNPW4ubm9kZXMseD0uNSoocytoKSxiPS41KihmK2cpLF89dD49eCx3PWU+PWIsUz13PDwxfF8saz1TKzQ7az5TOysrUylpZihuPU1bMyZTXSlzd2l0Y2goMyZTKXtjYXNlIDA6bChuLHMsZix4LGIpO2JyZWFrO2Nhc2UgMTpsKG4seCxmLGgsYik7YnJlYWs7Y2FzZSAyOmwobixzLGIseCxnKTticmVhaztjYXNlIDM6bChuLHgsYixoLGcpfX19KG4scix1LGksbyksYX1mdW5jdGlvbiBndShuLHQpe249dGEucmdiKG4pLHQ9dGEucmdiKHQpO3ZhciBlPW4ucixyPW4uZyx1PW4uYixpPXQuci1lLG89dC5nLXIsYT10LmItdTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIiMiK3h0KE1hdGgucm91bmQoZStpKm4pKSt4dChNYXRoLnJvdW5kKHIrbypuKSkreHQoTWF0aC5yb3VuZCh1K2EqbikpfX1mdW5jdGlvbiBwdShuLHQpe3ZhciBlLHI9e30sdT17fTtmb3IoZSBpbiBuKWUgaW4gdD9yW2VdPW11KG5bZV0sdFtlXSk6dVtlXT1uW2VdO2ZvcihlIGluIHQpZSBpbiBufHwodVtlXT10W2VdKTtyZXR1cm4gZnVuY3Rpb24obil7Zm9yKGUgaW4gcil1W2VdPXJbZV0obik7cmV0dXJuIHV9fWZ1bmN0aW9uIHZ1KG4sdCl7cmV0dXJuIG49K24sdD0rdCxmdW5jdGlvbihlKXtyZXR1cm4gbiooMS1lKSt0KmV9fWZ1bmN0aW9uIGR1KG4sdCl7dmFyIGUscix1LGk9aWwubGFzdEluZGV4PW9sLmxhc3RJbmRleD0wLG89LTEsYT1bXSxjPVtdO2ZvcihuKz0iIix0Kz0iIjsoZT1pbC5leGVjKG4pKSYmKHI9b2wuZXhlYyh0KSk7KSh1PXIuaW5kZXgpPmkmJih1PXQuc2xpY2UoaSx1KSxhW29dP2Fbb10rPXU6YVsrK29dPXUpLChlPWVbMF0pPT09KHI9clswXSk/YVtvXT9hW29dKz1yOmFbKytvXT1yOihhWysrb109bnVsbCxjLnB1c2goe2k6byx4OnZ1KGUscil9KSksaT1vbC5sYXN0SW5kZXg7cmV0dXJuIGk8dC5sZW5ndGgmJih1PXQuc2xpY2UoaSksYVtvXT9hW29dKz11OmFbKytvXT11KSxhLmxlbmd0aDwyP2NbMF0/KHQ9Y1swXS54LGZ1bmN0aW9uKG4pe3JldHVybiB0KG4pKyIifSk6ZnVuY3Rpb24oKXtyZXR1cm4gdH06KHQ9Yy5sZW5ndGgsZnVuY3Rpb24obil7Zm9yKHZhciBlLHI9MDt0PnI7KytyKWFbKGU9Y1tyXSkuaV09ZS54KG4pO3JldHVybiBhLmpvaW4oIiIpfSl9ZnVuY3Rpb24gbXUobix0KXtmb3IodmFyIGUscj10YS5pbnRlcnBvbGF0b3JzLmxlbmd0aDstLXI+PTAmJiEoZT10YS5pbnRlcnBvbGF0b3JzW3JdKG4sdCkpOyk7cmV0dXJuIGV9ZnVuY3Rpb24geXUobix0KXt2YXIgZSxyPVtdLHU9W10saT1uLmxlbmd0aCxvPXQubGVuZ3RoLGE9TWF0aC5taW4obi5sZW5ndGgsdC5sZW5ndGgpO2ZvcihlPTA7YT5lOysrZSlyLnB1c2gobXUobltlXSx0W2VdKSk7Zm9yKDtpPmU7KytlKXVbZV09bltlXTtmb3IoO28+ZTsrK2UpdVtlXT10W2VdO3JldHVybiBmdW5jdGlvbihuKXtmb3IoZT0wO2E+ZTsrK2UpdVtlXT1yW2VdKG4pO3JldHVybiB1fX1mdW5jdGlvbiBNdShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIDA+PXQ/MDp0Pj0xPzE6bih0KX19ZnVuY3Rpb24geHUobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiAxLW4oMS10KX19ZnVuY3Rpb24gYnUobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybi41KiguNT50P24oMip0KToyLW4oMi0yKnQpKX19ZnVuY3Rpb24gX3Uobil7cmV0dXJuIG4qbn1mdW5jdGlvbiB3dShuKXtyZXR1cm4gbipuKm59ZnVuY3Rpb24gU3Uobil7aWYoMD49bilyZXR1cm4gMDtpZihuPj0xKXJldHVybiAxO3ZhciB0PW4qbixlPXQqbjtyZXR1cm4gNCooLjU+bj9lOjMqKG4tdCkrZS0uNzUpfWZ1bmN0aW9uIGt1KG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5wb3codCxuKX19ZnVuY3Rpb24gRXUobil7cmV0dXJuIDEtTWF0aC5jb3MobipSYSl9ZnVuY3Rpb24gQXUobil7cmV0dXJuIE1hdGgucG93KDIsMTAqKG4tMSkpfWZ1bmN0aW9uIE51KG4pe3JldHVybiAxLU1hdGguc3FydCgxLW4qbil9ZnVuY3Rpb24gQ3Uobix0KXt2YXIgZTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyJiYodD0uNDUpLGFyZ3VtZW50cy5sZW5ndGg/ZT10L0xhKk1hdGguYXNpbigxL24pOihuPTEsZT10LzQpLGZ1bmN0aW9uKHIpe3JldHVybiAxK24qTWF0aC5wb3coMiwtMTAqcikqTWF0aC5zaW4oKHItZSkqTGEvdCl9fWZ1bmN0aW9uIHp1KG4pe3JldHVybiBufHwobj0xLjcwMTU4KSxmdW5jdGlvbih0KXtyZXR1cm4gdCp0KigobisxKSp0LW4pfX1mdW5jdGlvbiBxdShuKXtyZXR1cm4gMS8yLjc1Pm4/Ny41NjI1Km4qbjoyLzIuNzU+bj83LjU2MjUqKG4tPTEuNS8yLjc1KSpuKy43NToyLjUvMi43NT5uPzcuNTYyNSoobi09Mi4yNS8yLjc1KSpuKy45Mzc1OjcuNTYyNSoobi09Mi42MjUvMi43NSkqbisuOTg0Mzc1fWZ1bmN0aW9uIEx1KG4sdCl7bj10YS5oY2wobiksdD10YS5oY2wodCk7dmFyIGU9bi5oLHI9bi5jLHU9bi5sLGk9dC5oLWUsbz10LmMtcixhPXQubC11O3JldHVybiBpc05hTihvKSYmKG89MCxyPWlzTmFOKHIpP3QuYzpyKSxpc05hTihpKT8oaT0wLGU9aXNOYU4oZSk/dC5oOmUpOmk+MTgwP2ktPTM2MDotMTgwPmkmJihpKz0zNjApLGZ1bmN0aW9uKG4pe3JldHVybiBzdChlK2kqbixyK28qbix1K2EqbikrIiJ9fWZ1bmN0aW9uIFR1KG4sdCl7bj10YS5oc2wobiksdD10YS5oc2wodCk7dmFyIGU9bi5oLHI9bi5zLHU9bi5sLGk9dC5oLWUsbz10LnMtcixhPXQubC11O3JldHVybiBpc05hTihvKSYmKG89MCxyPWlzTmFOKHIpP3QuczpyKSxpc05hTihpKT8oaT0wLGU9aXNOYU4oZSk/dC5oOmUpOmk+MTgwP2ktPTM2MDotMTgwPmkmJihpKz0zNjApLGZ1bmN0aW9uKG4pe3JldHVybiBjdChlK2kqbixyK28qbix1K2EqbikrIiJ9fWZ1bmN0aW9uIFJ1KG4sdCl7bj10YS5sYWIobiksdD10YS5sYWIodCk7dmFyIGU9bi5sLHI9bi5hLHU9bi5iLGk9dC5sLWUsbz10LmEtcixhPXQuYi11O3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gaHQoZStpKm4scitvKm4sdSthKm4pKyIifX1mdW5jdGlvbiBEdShuLHQpe3JldHVybiB0LT1uLGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnJvdW5kKG4rdCplKX19ZnVuY3Rpb24gUHUobil7dmFyIHQ9W24uYSxuLmJdLGU9W24uYyxuLmRdLHI9anUodCksdT1VdSh0LGUpLGk9anUoRnUoZSx0LC11KSl8fDA7dFswXSplWzFdPGVbMF0qdFsxXSYmKHRbMF0qPS0xLHRbMV0qPS0xLHIqPS0xLHUqPS0xKSx0aGlzLnJvdGF0ZT0ocj9NYXRoLmF0YW4yKHRbMV0sdFswXSk6TWF0aC5hdGFuMigtZVswXSxlWzFdKSkqUGEsdGhpcy50cmFuc2xhdGU9W24uZSxuLmZdLHRoaXMuc2NhbGU9W3IsaV0sdGhpcy5za2V3PWk/TWF0aC5hdGFuMih1LGkpKlBhOjB9ZnVuY3Rpb24gVXUobix0KXtyZXR1cm4gblswXSp0WzBdK25bMV0qdFsxXX1mdW5jdGlvbiBqdShuKXt2YXIgdD1NYXRoLnNxcnQoVXUobixuKSk7cmV0dXJuIHQmJihuWzBdLz10LG5bMV0vPXQpLHR9ZnVuY3Rpb24gRnUobix0LGUpe3JldHVybiBuWzBdKz1lKnRbMF0sblsxXSs9ZSp0WzFdLG59ZnVuY3Rpb24gSHUobix0KXt2YXIgZSxyPVtdLHU9W10saT10YS50cmFuc2Zvcm0obiksbz10YS50cmFuc2Zvcm0odCksYT1pLnRyYW5zbGF0ZSxjPW8udHJhbnNsYXRlLGw9aS5yb3RhdGUscz1vLnJvdGF0ZSxmPWkuc2tldyxoPW8uc2tldyxnPWkuc2NhbGUscD1vLnNjYWxlO3JldHVybiBhWzBdIT1jWzBdfHxhWzFdIT1jWzFdPyhyLnB1c2goInRyYW5zbGF0ZSgiLG51bGwsIiwiLG51bGwsIikiKSx1LnB1c2goe2k6MSx4OnZ1KGFbMF0sY1swXSl9LHtpOjMseDp2dShhWzFdLGNbMV0pfSkpOnIucHVzaChjWzBdfHxjWzFdPyJ0cmFuc2xhdGUoIitjKyIpIjoiIiksbCE9cz8obC1zPjE4MD9zKz0zNjA6cy1sPjE4MCYmKGwrPTM2MCksdS5wdXNoKHtpOnIucHVzaChyLnBvcCgpKyJyb3RhdGUoIixudWxsLCIpIiktMix4OnZ1KGwscyl9KSk6cyYmci5wdXNoKHIucG9wKCkrInJvdGF0ZSgiK3MrIikiKSxmIT1oP3UucHVzaCh7aTpyLnB1c2goci5wb3AoKSsic2tld1goIixudWxsLCIpIiktMix4OnZ1KGYsaCl9KTpoJiZyLnB1c2goci5wb3AoKSsic2tld1goIitoKyIpIiksZ1swXSE9cFswXXx8Z1sxXSE9cFsxXT8oZT1yLnB1c2goci5wb3AoKSsic2NhbGUoIixudWxsLCIsIixudWxsLCIpIiksdS5wdXNoKHtpOmUtNCx4OnZ1KGdbMF0scFswXSl9LHtpOmUtMix4OnZ1KGdbMV0scFsxXSl9KSk6KDEhPXBbMF18fDEhPXBbMV0pJiZyLnB1c2goci5wb3AoKSsic2NhbGUoIitwKyIpIiksZT11Lmxlbmd0aCxmdW5jdGlvbihuKXtmb3IodmFyIHQsaT0tMTsrK2k8ZTspclsodD11W2ldKS5pXT10Lngobik7cmV0dXJuIHIuam9pbigiIil9fWZ1bmN0aW9uIE91KG4sdCl7cmV0dXJuIHQ9KHQtPW49K24pfHwxL3QsZnVuY3Rpb24oZSl7cmV0dXJuKGUtbikvdH19ZnVuY3Rpb24gSXUobix0KXtyZXR1cm4gdD0odC09bj0rbil8fDEvdCxmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbigxLChlLW4pL3QpKX19ZnVuY3Rpb24gWXUobil7Zm9yKHZhciB0PW4uc291cmNlLGU9bi50YXJnZXQscj1WdSh0LGUpLHU9W3RdO3QhPT1yOyl0PXQucGFyZW50LHUucHVzaCh0KTtmb3IodmFyIGk9dS5sZW5ndGg7ZSE9PXI7KXUuc3BsaWNlKGksMCxlKSxlPWUucGFyZW50O3JldHVybiB1fWZ1bmN0aW9uIFp1KG4pe2Zvcih2YXIgdD1bXSxlPW4ucGFyZW50O251bGwhPWU7KXQucHVzaChuKSxuPWUsZT1lLnBhcmVudDtyZXR1cm4gdC5wdXNoKG4pLHR9ZnVuY3Rpb24gVnUobix0KXtpZihuPT09dClyZXR1cm4gbjtmb3IodmFyIGU9WnUobikscj1adSh0KSx1PWUucG9wKCksaT1yLnBvcCgpLG89bnVsbDt1PT09aTspbz11LHU9ZS5wb3AoKSxpPXIucG9wKCk7cmV0dXJuIG99ZnVuY3Rpb24gWHUobil7bi5maXhlZHw9Mn1mdW5jdGlvbiAkdShuKXtuLmZpeGVkJj0tN31mdW5jdGlvbiBCdShuKXtuLmZpeGVkfD00LG4ucHg9bi54LG4ucHk9bi55fWZ1bmN0aW9uIFd1KG4pe24uZml4ZWQmPS01fWZ1bmN0aW9uIEp1KG4sdCxlKXt2YXIgcj0wLHU9MDtpZihuLmNoYXJnZT0wLCFuLmxlYWYpZm9yKHZhciBpLG89bi5ub2RlcyxhPW8ubGVuZ3RoLGM9LTE7KytjPGE7KWk9b1tjXSxudWxsIT1pJiYoSnUoaSx0LGUpLG4uY2hhcmdlKz1pLmNoYXJnZSxyKz1pLmNoYXJnZSppLmN4LHUrPWkuY2hhcmdlKmkuY3kpO2lmKG4ucG9pbnQpe24ubGVhZnx8KG4ucG9pbnQueCs9TWF0aC5yYW5kb20oKS0uNSxuLnBvaW50LnkrPU1hdGgucmFuZG9tKCktLjUpO3ZhciBsPXQqZVtuLnBvaW50LmluZGV4XTtuLmNoYXJnZSs9bi5wb2ludENoYXJnZT1sLHIrPWwqbi5wb2ludC54LHUrPWwqbi5wb2ludC55fW4uY3g9ci9uLmNoYXJnZSxuLmN5PXUvbi5jaGFyZ2V9ZnVuY3Rpb24gR3Uobix0KXtyZXR1cm4gdGEucmViaW5kKG4sdCwic29ydCIsImNoaWxkcmVuIiwidmFsdWUiKSxuLm5vZGVzPW4sbi5saW5rcz1yaSxufWZ1bmN0aW9uIEt1KG4sdCl7Zm9yKHZhciBlPVtuXTtudWxsIT0obj1lLnBvcCgpKTspaWYodChuKSwodT1uLmNoaWxkcmVuKSYmKHI9dS5sZW5ndGgpKWZvcih2YXIgcix1Oy0tcj49MDspZS5wdXNoKHVbcl0pfWZ1bmN0aW9uIFF1KG4sdCl7Zm9yKHZhciBlPVtuXSxyPVtdO251bGwhPShuPWUucG9wKCkpOylpZihyLnB1c2gobiksKGk9bi5jaGlsZHJlbikmJih1PWkubGVuZ3RoKSlmb3IodmFyIHUsaSxvPS0xOysrbzx1OyllLnB1c2goaVtvXSk7Zm9yKDtudWxsIT0obj1yLnBvcCgpKTspdChuKX1mdW5jdGlvbiBuaShuKXtyZXR1cm4gbi5jaGlsZHJlbn1mdW5jdGlvbiB0aShuKXtyZXR1cm4gbi52YWx1ZX1mdW5jdGlvbiBlaShuLHQpe3JldHVybiB0LnZhbHVlLW4udmFsdWV9ZnVuY3Rpb24gcmkobil7cmV0dXJuIHRhLm1lcmdlKG4ubWFwKGZ1bmN0aW9uKG4pe3JldHVybihuLmNoaWxkcmVufHxbXSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybntzb3VyY2U6bix0YXJnZXQ6dH19KX0pKX1mdW5jdGlvbiB1aShuKXtyZXR1cm4gbi54fWZ1bmN0aW9uIGlpKG4pe3JldHVybiBuLnl9ZnVuY3Rpb24gb2kobix0LGUpe24ueTA9dCxuLnk9ZX1mdW5jdGlvbiBhaShuKXtyZXR1cm4gdGEucmFuZ2Uobi5sZW5ndGgpfWZ1bmN0aW9uIGNpKG4pe2Zvcih2YXIgdD0tMSxlPW5bMF0ubGVuZ3RoLHI9W107Kyt0PGU7KXJbdF09MDtyZXR1cm4gcn1mdW5jdGlvbiBsaShuKXtmb3IodmFyIHQsZT0xLHI9MCx1PW5bMF1bMV0saT1uLmxlbmd0aDtpPmU7KytlKSh0PW5bZV1bMV0pPnUmJihyPWUsdT10KTtyZXR1cm4gcn1mdW5jdGlvbiBzaShuKXtyZXR1cm4gbi5yZWR1Y2UoZmksMCl9ZnVuY3Rpb24gZmkobix0KXtyZXR1cm4gbit0WzFdfWZ1bmN0aW9uIGhpKG4sdCl7cmV0dXJuIGdpKG4sTWF0aC5jZWlsKE1hdGgubG9nKHQubGVuZ3RoKS9NYXRoLkxOMisxKSl9ZnVuY3Rpb24gZ2kobix0KXtmb3IodmFyIGU9LTEscj0rblswXSx1PShuWzFdLXIpL3QsaT1bXTsrK2U8PXQ7KWlbZV09dSplK3I7cmV0dXJuIGl9ZnVuY3Rpb24gcGkobil7cmV0dXJuW3RhLm1pbihuKSx0YS5tYXgobildfWZ1bmN0aW9uIHZpKG4sdCl7cmV0dXJuIG4udmFsdWUtdC52YWx1ZX1mdW5jdGlvbiBkaShuLHQpe3ZhciBlPW4uX3BhY2tfbmV4dDtuLl9wYWNrX25leHQ9dCx0Ll9wYWNrX3ByZXY9bix0Ll9wYWNrX25leHQ9ZSxlLl9wYWNrX3ByZXY9dH1mdW5jdGlvbiBtaShuLHQpe24uX3BhY2tfbmV4dD10LHQuX3BhY2tfcHJldj1ufWZ1bmN0aW9uIHlpKG4sdCl7dmFyIGU9dC54LW4ueCxyPXQueS1uLnksdT1uLnIrdC5yO3JldHVybi45OTkqdSp1PmUqZStyKnJ9ZnVuY3Rpb24gTWkobil7ZnVuY3Rpb24gdChuKXtzPU1hdGgubWluKG4ueC1uLnIscyksZj1NYXRoLm1heChuLngrbi5yLGYpLGg9TWF0aC5taW4obi55LW4ucixoKSxnPU1hdGgubWF4KG4ueStuLnIsZyl9aWYoKGU9bi5jaGlsZHJlbikmJihsPWUubGVuZ3RoKSl7dmFyIGUscix1LGksbyxhLGMsbCxzPTEvMCxmPS0xLzAsaD0xLzAsZz0tMS8wO2lmKGUuZm9yRWFjaCh4aSkscj1lWzBdLHIueD0tci5yLHIueT0wLHQociksbD4xJiYodT1lWzFdLHUueD11LnIsdS55PTAsdCh1KSxsPjIpKWZvcihpPWVbMl0sd2kocix1LGkpLHQoaSksZGkocixpKSxyLl9wYWNrX3ByZXY9aSxkaShpLHUpLHU9ci5fcGFja19uZXh0LG89MztsPm87bysrKXt3aShyLHUsaT1lW29dKTt2YXIgcD0wLHY9MSxkPTE7Zm9yKGE9dS5fcGFja19uZXh0O2EhPT11O2E9YS5fcGFja19uZXh0LHYrKylpZih5aShhLGkpKXtwPTE7YnJlYWt9aWYoMT09cClmb3IoYz1yLl9wYWNrX3ByZXY7YyE9PWEuX3BhY2tfcHJldiYmIXlpKGMsaSk7Yz1jLl9wYWNrX3ByZXYsZCsrKTtwPyhkPnZ8fHY9PWQmJnUucjxyLnI/bWkocix1PWEpOm1pKHI9Yyx1KSxvLS0pOihkaShyLGkpLHU9aSx0KGkpKX12YXIgbT0ocytmKS8yLHk9KGgrZykvMixNPTA7Zm9yKG89MDtsPm87bysrKWk9ZVtvXSxpLngtPW0saS55LT15LE09TWF0aC5tYXgoTSxpLnIrTWF0aC5zcXJ0KGkueCppLngraS55KmkueSkpO24ucj1NLGUuZm9yRWFjaChiaSl9fWZ1bmN0aW9uIHhpKG4pe24uX3BhY2tfbmV4dD1uLl9wYWNrX3ByZXY9bn1mdW5jdGlvbiBiaShuKXtkZWxldGUgbi5fcGFja19uZXh0LGRlbGV0ZSBuLl9wYWNrX3ByZXZ9ZnVuY3Rpb24gX2kobix0LGUscil7dmFyIHU9bi5jaGlsZHJlbjtpZihuLng9dCs9cipuLngsbi55PWUrPXIqbi55LG4ucio9cix1KWZvcih2YXIgaT0tMSxvPXUubGVuZ3RoOysraTxvOylfaSh1W2ldLHQsZSxyKX1mdW5jdGlvbiB3aShuLHQsZSl7dmFyIHI9bi5yK2Uucix1PXQueC1uLngsaT10Lnktbi55O2lmKHImJih1fHxpKSl7dmFyIG89dC5yK2UucixhPXUqdStpKmk7byo9byxyKj1yO3ZhciBjPS41KyhyLW8pLygyKmEpLGw9TWF0aC5zcXJ0KE1hdGgubWF4KDAsMipvKihyK2EpLShyLT1hKSpyLW8qbykpLygyKmEpO2UueD1uLngrYyp1K2wqaSxlLnk9bi55K2MqaS1sKnV9ZWxzZSBlLng9bi54K3IsZS55PW4ueX1mdW5jdGlvbiBTaShuLHQpe3JldHVybiBuLnBhcmVudD09dC5wYXJlbnQ/MToyfWZ1bmN0aW9uIGtpKG4pe3ZhciB0PW4uY2hpbGRyZW47cmV0dXJuIHQubGVuZ3RoP3RbMF06bi50fWZ1bmN0aW9uIEVpKG4pe3ZhciB0LGU9bi5jaGlsZHJlbjtyZXR1cm4odD1lLmxlbmd0aCk/ZVt0LTFdOm4udH1mdW5jdGlvbiBBaShuLHQsZSl7dmFyIHI9ZS8odC5pLW4uaSk7dC5jLT1yLHQucys9ZSxuLmMrPXIsdC56Kz1lLHQubSs9ZX1mdW5jdGlvbiBOaShuKXtmb3IodmFyIHQsZT0wLHI9MCx1PW4uY2hpbGRyZW4saT11Lmxlbmd0aDstLWk+PTA7KXQ9dVtpXSx0LnorPWUsdC5tKz1lLGUrPXQucysocis9dC5jKX1mdW5jdGlvbiBDaShuLHQsZSl7cmV0dXJuIG4uYS5wYXJlbnQ9PT10LnBhcmVudD9uLmE6ZX1mdW5jdGlvbiB6aShuKXtyZXR1cm4gMSt0YS5tYXgobixmdW5jdGlvbihuKXtyZXR1cm4gbi55fSl9ZnVuY3Rpb24gcWkobil7cmV0dXJuIG4ucmVkdWNlKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4rdC54fSwwKS9uLmxlbmd0aH1mdW5jdGlvbiBMaShuKXt2YXIgdD1uLmNoaWxkcmVuO3JldHVybiB0JiZ0Lmxlbmd0aD9MaSh0WzBdKTpufWZ1bmN0aW9uIFRpKG4pe3ZhciB0LGU9bi5jaGlsZHJlbjtyZXR1cm4gZSYmKHQ9ZS5sZW5ndGgpP1RpKGVbdC0xXSk6bn1mdW5jdGlvbiBSaShuKXtyZXR1cm57eDpuLngseTpuLnksZHg6bi5keCxkeTpuLmR5fX1mdW5jdGlvbiBEaShuLHQpe3ZhciBlPW4ueCt0WzNdLHI9bi55K3RbMF0sdT1uLmR4LXRbMV0tdFszXSxpPW4uZHktdFswXS10WzJdO3JldHVybiAwPnUmJihlKz11LzIsdT0wKSwwPmkmJihyKz1pLzIsaT0wKSx7eDplLHk6cixkeDp1LGR5Oml9fWZ1bmN0aW9uIFBpKG4pe3ZhciB0PW5bMF0sZT1uW24ubGVuZ3RoLTFdO3JldHVybiBlPnQ/W3QsZV06W2UsdF19ZnVuY3Rpb24gVWkobil7cmV0dXJuIG4ucmFuZ2VFeHRlbnQ/bi5yYW5nZUV4dGVudCgpOlBpKG4ucmFuZ2UoKSl9ZnVuY3Rpb24gamkobix0LGUscil7dmFyIHU9ZShuWzBdLG5bMV0pLGk9cih0WzBdLHRbMV0pO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gaSh1KG4pKX19ZnVuY3Rpb24gRmkobix0KXt2YXIgZSxyPTAsdT1uLmxlbmd0aC0xLGk9bltyXSxvPW5bdV07cmV0dXJuIGk+byYmKGU9cixyPXUsdT1lLGU9aSxpPW8sbz1lKSxuW3JdPXQuZmxvb3IoaSksblt1XT10LmNlaWwobyksbn1mdW5jdGlvbiBIaShuKXtyZXR1cm4gbj97Zmxvb3I6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguZmxvb3IodC9uKSpufSxjZWlsOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmNlaWwodC9uKSpufX06bWx9ZnVuY3Rpb24gT2kobix0LGUscil7dmFyIHU9W10saT1bXSxvPTAsYT1NYXRoLm1pbihuLmxlbmd0aCx0Lmxlbmd0aCktMTtmb3IoblthXTxuWzBdJiYobj1uLnNsaWNlKCkucmV2ZXJzZSgpLHQ9dC5zbGljZSgpLnJldmVyc2UoKSk7KytvPD1hOyl1LnB1c2goZShuW28tMV0sbltvXSkpLGkucHVzaChyKHRbby0xXSx0W29dKSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXRhLmJpc2VjdChuLHQsMSxhKS0xO3JldHVybiBpW2VdKHVbZV0odCkpfX1mdW5jdGlvbiBJaShuLHQsZSxyKXtmdW5jdGlvbiB1KCl7dmFyIHU9TWF0aC5taW4obi5sZW5ndGgsdC5sZW5ndGgpPjI/T2k6amksYz1yP0l1Ok91O3JldHVybiBvPXUobix0LGMsZSksYT11KHQsbixjLG11KSxpfWZ1bmN0aW9uIGkobil7cmV0dXJuIG8obil9dmFyIG8sYTtyZXR1cm4gaS5pbnZlcnQ9ZnVuY3Rpb24obil7cmV0dXJuIGEobil9LGkuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQubWFwKE51bWJlciksdSgpKTpufSxpLnJhbmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4sdSgpKTp0fSxpLnJhbmdlUm91bmQ9ZnVuY3Rpb24obil7cmV0dXJuIGkucmFuZ2UobikuaW50ZXJwb2xhdGUoRHUpfSxpLmNsYW1wPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdSgpKTpyfSxpLmludGVycG9sYXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdSgpKTplfSxpLnRpY2tzPWZ1bmN0aW9uKHQpe3JldHVybiBYaShuLHQpfSxpLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gJGkobix0LGUpfSxpLm5pY2U9ZnVuY3Rpb24odCl7cmV0dXJuIFppKG4sdCksdSgpfSxpLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gSWkobix0LGUscil9LHUoKX1mdW5jdGlvbiBZaShuLHQpe3JldHVybiB0YS5yZWJpbmQobix0LCJyYW5nZSIsInJhbmdlUm91bmQiLCJpbnRlcnBvbGF0ZSIsImNsYW1wIil9ZnVuY3Rpb24gWmkobix0KXtyZXR1cm4gRmkobixIaShWaShuLHQpWzJdKSl9ZnVuY3Rpb24gVmkobix0KXtudWxsPT10JiYodD0xMCk7dmFyIGU9UGkobikscj1lWzFdLWVbMF0sdT1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nKHIvdCkvTWF0aC5MTjEwKSksaT10L3IqdTtyZXR1cm4uMTU+PWk/dSo9MTA6LjM1Pj1pP3UqPTU6Ljc1Pj1pJiYodSo9MiksZVswXT1NYXRoLmNlaWwoZVswXS91KSp1LGVbMV09TWF0aC5mbG9vcihlWzFdL3UpKnUrLjUqdSxlWzJdPXUsZX1mdW5jdGlvbiBYaShuLHQpe3JldHVybiB0YS5yYW5nZS5hcHBseSh0YSxWaShuLHQpKX1mdW5jdGlvbiAkaShuLHQsZSl7dmFyIHI9Vmkobix0KTtpZihlKXt2YXIgdT1pYy5leGVjKGUpO2lmKHUuc2hpZnQoKSwicyI9PT11WzhdKXt2YXIgaT10YS5mb3JtYXRQcmVmaXgoTWF0aC5tYXgoZ2EoclswXSksZ2EoclsxXSkpKTtyZXR1cm4gdVs3XXx8KHVbN109Ii4iK0JpKGkuc2NhbGUoclsyXSkpKSx1WzhdPSJmIixlPXRhLmZvcm1hdCh1LmpvaW4oIiIpKSxmdW5jdGlvbihuKXtyZXR1cm4gZShpLnNjYWxlKG4pKStpLnN5bWJvbH19dVs3XXx8KHVbN109Ii4iK1dpKHVbOF0scikpLGU9dS5qb2luKCIiKX1lbHNlIGU9IiwuIitCaShyWzJdKSsiZiI7cmV0dXJuIHRhLmZvcm1hdChlKX1mdW5jdGlvbiBCaShuKXtyZXR1cm4tTWF0aC5mbG9vcihNYXRoLmxvZyhuKS9NYXRoLkxOMTArLjAxKX1mdW5jdGlvbiBXaShuLHQpe3ZhciBlPUJpKHRbMl0pO3JldHVybiBuIGluIHlsP01hdGguYWJzKGUtQmkoTWF0aC5tYXgoZ2EodFswXSksZ2EodFsxXSkpKSkrICsoImUiIT09bik6ZS0yKigiJSI9PT1uKX1mdW5jdGlvbiBKaShuLHQsZSxyKXtmdW5jdGlvbiB1KG4pe3JldHVybihlP01hdGgubG9nKDA+bj8wOm4pOi1NYXRoLmxvZyhuPjA/MDotbikpL01hdGgubG9nKHQpfWZ1bmN0aW9uIGkobil7cmV0dXJuIGU/TWF0aC5wb3codCxuKTotTWF0aC5wb3codCwtbil9ZnVuY3Rpb24gbyh0KXtyZXR1cm4gbih1KHQpKX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGkobi5pbnZlcnQodCkpfSxvLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10WzBdPj0wLG4uZG9tYWluKChyPXQubWFwKE51bWJlcikpLm1hcCh1KSksbyk6cn0sby5iYXNlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStlLG4uZG9tYWluKHIubWFwKHUpKSxvKTp0fSxvLm5pY2U9ZnVuY3Rpb24oKXt2YXIgdD1GaShyLm1hcCh1KSxlP01hdGg6eGwpO3JldHVybiBuLmRvbWFpbih0KSxyPXQubWFwKGkpLG99LG8udGlja3M9ZnVuY3Rpb24oKXt2YXIgbj1QaShyKSxvPVtdLGE9blswXSxjPW5bMV0sbD1NYXRoLmZsb29yKHUoYSkpLHM9TWF0aC5jZWlsKHUoYykpLGY9dCUxPzI6dDtpZihpc0Zpbml0ZShzLWwpKXtpZihlKXtmb3IoO3M+bDtsKyspZm9yKHZhciBoPTE7Zj5oO2grKylvLnB1c2goaShsKSpoKTtvLnB1c2goaShsKSl9ZWxzZSBmb3Ioby5wdXNoKGkobCkpO2wrKzxzOylmb3IodmFyIGg9Zi0xO2g+MDtoLS0pby5wdXNoKGkobCkqaCk7Zm9yKGw9MDtvW2xdPGE7bCsrKTtmb3Iocz1vLmxlbmd0aDtvW3MtMV0+YztzLS0pO289by5zbGljZShsLHMpfXJldHVybiBvfSxvLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obix0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gTWw7YXJndW1lbnRzLmxlbmd0aDwyP3Q9TWw6ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXRhLmZvcm1hdCh0KSk7dmFyIHIsYT1NYXRoLm1heCguMSxuL28udGlja3MoKS5sZW5ndGgpLGM9ZT8ocj0xZS0xMixNYXRoLmNlaWwpOihyPS0xZS0xMixNYXRoLmZsb29yKTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG4vaShjKHUobikrcikpPD1hP3Qobik6IiJ9fSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gSmkobi5jb3B5KCksdCxlLHIpfSxZaShvLG4pfWZ1bmN0aW9uIEdpKG4sdCxlKXtmdW5jdGlvbiByKHQpe3JldHVybiBuKHUodCkpfXZhciB1PUtpKHQpLGk9S2koMS90KTtyZXR1cm4gci5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGkobi5pbnZlcnQodCkpfSxyLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obi5kb21haW4oKGU9dC5tYXAoTnVtYmVyKSkubWFwKHUpKSxyKTplfSxyLnRpY2tzPWZ1bmN0aW9uKG4pe3JldHVybiBYaShlLG4pfSxyLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gJGkoZSxuLHQpfSxyLm5pY2U9ZnVuY3Rpb24obil7cmV0dXJuIHIuZG9tYWluKFppKGUsbikpfSxyLmV4cG9uZW50PWZ1bmN0aW9uKG8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PUtpKHQ9byksaT1LaSgxL3QpLG4uZG9tYWluKGUubWFwKHUpKSxyKTp0fSxyLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gR2kobi5jb3B5KCksdCxlKX0sWWkocixuKX1mdW5jdGlvbiBLaShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIDA+dD8tTWF0aC5wb3coLXQsbik6TWF0aC5wb3codCxuKX19ZnVuY3Rpb24gUWkobix0KXtmdW5jdGlvbiBlKGUpe3JldHVybiBpWygodS5nZXQoZSl8fCgicmFuZ2UiPT09dC50P3Uuc2V0KGUsbi5wdXNoKGUpKTowLzApKS0xKSVpLmxlbmd0aF19ZnVuY3Rpb24gcih0LGUpe3JldHVybiB0YS5yYW5nZShuLmxlbmd0aCkubWFwKGZ1bmN0aW9uKG4pe3JldHVybiB0K2Uqbn0pfXZhciB1LGksbztyZXR1cm4gZS5kb21haW49ZnVuY3Rpb24ocil7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIG47bj1bXSx1PW5ldyBsO2Zvcih2YXIgaSxvPS0xLGE9ci5sZW5ndGg7KytvPGE7KXUuaGFzKGk9cltvXSl8fHUuc2V0KGksbi5wdXNoKGkpKTtyZXR1cm4gZVt0LnRdLmFwcGx5KGUsdC5hKX0sZS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1uLG89MCx0PXt0OiJyYW5nZSIsYTphcmd1bWVudHN9LGUpOml9LGUucmFuZ2VQb2ludHM9ZnVuY3Rpb24odSxhKXthcmd1bWVudHMubGVuZ3RoPDImJihhPTApO3ZhciBjPXVbMF0sbD11WzFdLHM9bi5sZW5ndGg8Mj8oYz0oYytsKS8yLDApOihsLWMpLyhuLmxlbmd0aC0xK2EpO3JldHVybiBpPXIoYytzKmEvMixzKSxvPTAsdD17dDoicmFuZ2VQb2ludHMiLGE6YXJndW1lbnRzfSxlfSxlLnJhbmdlUm91bmRQb2ludHM9ZnVuY3Rpb24odSxhKXthcmd1bWVudHMubGVuZ3RoPDImJihhPTApO3ZhciBjPXVbMF0sbD11WzFdLHM9bi5sZW5ndGg8Mj8oYz1sPU1hdGgucm91bmQoKGMrbCkvMiksMCk6KGwtYykvKG4ubGVuZ3RoLTErYSl8MDtyZXR1cm4gaT1yKGMrTWF0aC5yb3VuZChzKmEvMisobC1jLShuLmxlbmd0aC0xK2EpKnMpLzIpLHMpLG89MCx0PXt0OiJyYW5nZVJvdW5kUG9pbnRzIixhOmFyZ3VtZW50c30sZX0sZS5yYW5nZUJhbmRzPWZ1bmN0aW9uKHUsYSxjKXthcmd1bWVudHMubGVuZ3RoPDImJihhPTApLGFyZ3VtZW50cy5sZW5ndGg8MyYmKGM9YSk7dmFyIGw9dVsxXTx1WzBdLHM9dVtsLTBdLGY9dVsxLWxdLGg9KGYtcykvKG4ubGVuZ3RoLWErMipjKTtyZXR1cm4gaT1yKHMraCpjLGgpLGwmJmkucmV2ZXJzZSgpLG89aCooMS1hKSx0PXt0OiJyYW5nZUJhbmRzIixhOmFyZ3VtZW50c30sZX0sZS5yYW5nZVJvdW5kQmFuZHM9ZnVuY3Rpb24odSxhLGMpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKGE9MCksYXJndW1lbnRzLmxlbmd0aDwzJiYoYz1hKTt2YXIgbD11WzFdPHVbMF0scz11W2wtMF0sZj11WzEtbF0saD1NYXRoLmZsb29yKChmLXMpLyhuLmxlbmd0aC1hKzIqYykpO3JldHVybiBpPXIocytNYXRoLnJvdW5kKChmLXMtKG4ubGVuZ3RoLWEpKmgpLzIpLGgpLGwmJmkucmV2ZXJzZSgpLG89TWF0aC5yb3VuZChoKigxLWEpKSx0PXt0OiJyYW5nZVJvdW5kQmFuZHMiLGE6YXJndW1lbnRzfSxlfSxlLnJhbmdlQmFuZD1mdW5jdGlvbigpe3JldHVybiBvfSxlLnJhbmdlRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIFBpKHQuYVswXSl9LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBRaShuLHQpfSxlLmRvbWFpbihuKX1mdW5jdGlvbiBubyhuLHQpe2Z1bmN0aW9uIGkoKXt2YXIgZT0wLHI9dC5sZW5ndGg7Zm9yKGE9W107KytlPHI7KWFbZS0xXT10YS5xdWFudGlsZShuLGUvcik7cmV0dXJuIG99ZnVuY3Rpb24gbyhuKXtyZXR1cm4gaXNOYU4obj0rbik/dm9pZCAwOnRbdGEuYmlzZWN0KGEsbildfXZhciBhO3JldHVybiBvLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10Lm1hcChyKS5maWx0ZXIodSkuc29ydChlKSxpKCkpOm59LG8ucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixpKCkpOnR9LG8ucXVhbnRpbGVzPWZ1bmN0aW9uKCl7cmV0dXJuIGF9LG8uaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlPXQuaW5kZXhPZihlKSwwPmU/WzAvMCwwLzBdOltlPjA/YVtlLTFdOm5bMF0sZTxhLmxlbmd0aD9hW2VdOm5bbi5sZW5ndGgtMV1dfSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gbm8obix0KX0saSgpfWZ1bmN0aW9uIHRvKG4sdCxlKXtmdW5jdGlvbiByKHQpe3JldHVybiBlW01hdGgubWF4KDAsTWF0aC5taW4obyxNYXRoLmZsb29yKGkqKHQtbikpKSldfWZ1bmN0aW9uIHUoKXtyZXR1cm4gaT1lLmxlbmd0aC8odC1uKSxvPWUubGVuZ3RoLTEscn12YXIgaSxvO3JldHVybiByLmRvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rZVswXSx0PStlW2UubGVuZ3RoLTFdLHUoKSk6W24sdF19LHIucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix1KCkpOmV9LHIuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0PWUuaW5kZXhPZih0KSx0PTA+dD8wLzA6dC9pK24sW3QsdCsxL2ldfSxyLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdG8obix0LGUpfSx1KCl9ZnVuY3Rpb24gZW8obix0KXtmdW5jdGlvbiBlKGUpe3JldHVybiBlPj1lP3RbdGEuYmlzZWN0KG4sZSldOnZvaWQgMH1yZXR1cm4gZS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxlKTpufSxlLnJhbmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4sZSk6dH0sZS5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dC5pbmRleE9mKGUpLFtuW2UtMV0sbltlXV19LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBlbyhuLHQpfSxlfWZ1bmN0aW9uIHJvKG4pe2Z1bmN0aW9uIHQobil7cmV0dXJuK259cmV0dXJuIHQuaW52ZXJ0PXQsdC5kb21haW49dC5yYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1lLm1hcCh0KSx0KTpufSx0LnRpY2tzPWZ1bmN0aW9uKHQpe3JldHVybiBYaShuLHQpfSx0LnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gJGkobix0LGUpfSx0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gcm8obil9LHR9ZnVuY3Rpb24gdW8oKXtyZXR1cm4gMH1mdW5jdGlvbiBpbyhuKXtyZXR1cm4gbi5pbm5lclJhZGl1c31mdW5jdGlvbiBvbyhuKXtyZXR1cm4gbi5vdXRlclJhZGl1c31mdW5jdGlvbiBhbyhuKXtyZXR1cm4gbi5zdGFydEFuZ2xlfWZ1bmN0aW9uIGNvKG4pe3JldHVybiBuLmVuZEFuZ2xlfWZ1bmN0aW9uIGxvKG4pe3JldHVybiBuJiZuLnBhZEFuZ2xlfWZ1bmN0aW9uIHNvKG4sdCxlLHIpe3JldHVybihuLWUpKnQtKHQtcikqbj4wPzA6MX1mdW5jdGlvbiBmbyhuLHQsZSxyLHUpe3ZhciBpPW5bMF0tdFswXSxvPW5bMV0tdFsxXSxhPSh1P3I6LXIpL01hdGguc3FydChpKmkrbypvKSxjPWEqbyxsPS1hKmkscz1uWzBdK2MsZj1uWzFdK2wsaD10WzBdK2MsZz10WzFdK2wscD0ocytoKS8yLHY9KGYrZykvMixkPWgtcyxtPWctZix5PWQqZCttKm0sTT1lLXIseD1zKmctaCpmLGI9KDA+bT8tMToxKSpNYXRoLnNxcnQoTSpNKnkteCp4KSxfPSh4Km0tZCpiKS95LHc9KC14KmQtbSpiKS95LFM9KHgqbStkKmIpL3ksaz0oLXgqZCttKmIpL3ksRT1fLXAsQT13LXYsTj1TLXAsQz1rLXY7cmV0dXJuIEUqRStBKkE+TipOK0MqQyYmKF89Uyx3PWspLFtbXy1jLHctbF0sW18qZS9NLHcqZS9NXV19ZnVuY3Rpb24gaG8obil7ZnVuY3Rpb24gdCh0KXtmdW5jdGlvbiBvKCl7bC5wdXNoKCJNIixpKG4ocyksYSkpfWZvcih2YXIgYyxsPVtdLHM9W10sZj0tMSxoPXQubGVuZ3RoLGc9RXQoZSkscD1FdChyKTsrK2Y8aDspdS5jYWxsKHRoaXMsYz10W2ZdLGYpP3MucHVzaChbK2cuY2FsbCh0aGlzLGMsZiksK3AuY2FsbCh0aGlzLGMsZildKTpzLmxlbmd0aCYmKG8oKSxzPVtdKTtyZXR1cm4gcy5sZW5ndGgmJm8oKSxsLmxlbmd0aD9sLmpvaW4oIiIpOm51bGx9dmFyIGU9QXIscj1Ocix1PU5lLGk9Z28sbz1pLmtleSxhPS43O3JldHVybiB0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix0KTplfSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bix0KTpyfSx0LmRlZmluZWQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bix0KTp1fSx0LmludGVycG9sYXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiBuP2k9bjooaT1FbC5nZXQobil8fGdvKS5rZXksdCk6b30sdC50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPW4sdCk6YX0sdH1mdW5jdGlvbiBnbyhuKXtyZXR1cm4gbi5qb2luKCJMIil9ZnVuY3Rpb24gcG8obil7cmV0dXJuIGdvKG4pKyJaIn1mdW5jdGlvbiB2byhuKXtmb3IodmFyIHQ9MCxlPW4ubGVuZ3RoLHI9blswXSx1PVtyWzBdLCIsIixyWzFdXTsrK3Q8ZTspdS5wdXNoKCJIIiwoclswXSsocj1uW3RdKVswXSkvMiwiViIsclsxXSk7cmV0dXJuIGU+MSYmdS5wdXNoKCJIIixyWzBdKSx1LmpvaW4oIiIpfWZ1bmN0aW9uIG1vKG4pe2Zvcih2YXIgdD0wLGU9bi5sZW5ndGgscj1uWzBdLHU9W3JbMF0sIiwiLHJbMV1dOysrdDxlOyl1LnB1c2goIlYiLChyPW5bdF0pWzFdLCJIIixyWzBdKTtyZXR1cm4gdS5qb2luKCIiKX1mdW5jdGlvbiB5byhuKXtmb3IodmFyIHQ9MCxlPW4ubGVuZ3RoLHI9blswXSx1PVtyWzBdLCIsIixyWzFdXTsrK3Q8ZTspdS5wdXNoKCJIIiwocj1uW3RdKVswXSwiViIsclsxXSk7cmV0dXJuIHUuam9pbigiIil9ZnVuY3Rpb24gTW8obix0KXtyZXR1cm4gbi5sZW5ndGg8ND9nbyhuKTpuWzFdK19vKG4uc2xpY2UoMSwtMSksd28obix0KSl9ZnVuY3Rpb24geG8obix0KXtyZXR1cm4gbi5sZW5ndGg8Mz9nbyhuKTpuWzBdK19vKChuLnB1c2goblswXSksbiksd28oW25bbi5sZW5ndGgtMl1dLmNvbmNhdChuLFtuWzFdXSksdCkpfWZ1bmN0aW9uIGJvKG4sdCl7cmV0dXJuIG4ubGVuZ3RoPDM/Z28obik6blswXStfbyhuLHdvKG4sdCkpfWZ1bmN0aW9uIF9vKG4sdCl7aWYodC5sZW5ndGg8MXx8bi5sZW5ndGghPXQubGVuZ3RoJiZuLmxlbmd0aCE9dC5sZW5ndGgrMilyZXR1cm4gZ28obik7dmFyIGU9bi5sZW5ndGghPXQubGVuZ3RoLHI9IiIsdT1uWzBdLGk9blsxXSxvPXRbMF0sYT1vLGM9MTtpZihlJiYocis9IlEiKyhpWzBdLTIqb1swXS8zKSsiLCIrKGlbMV0tMipvWzFdLzMpKyIsIitpWzBdKyIsIitpWzFdLHU9blsxXSxjPTIpLHQubGVuZ3RoPjEpe2E9dFsxXSxpPW5bY10sYysrLHIrPSJDIisodVswXStvWzBdKSsiLCIrKHVbMV0rb1sxXSkrIiwiKyhpWzBdLWFbMF0pKyIsIisoaVsxXS1hWzFdKSsiLCIraVswXSsiLCIraVsxXTtmb3IodmFyIGw9MjtsPHQubGVuZ3RoO2wrKyxjKyspaT1uW2NdLGE9dFtsXSxyKz0iUyIrKGlbMF0tYVswXSkrIiwiKyhpWzFdLWFbMV0pKyIsIitpWzBdKyIsIitpWzFdfWlmKGUpe3ZhciBzPW5bY107cis9IlEiKyhpWzBdKzIqYVswXS8zKSsiLCIrKGlbMV0rMiphWzFdLzMpKyIsIitzWzBdKyIsIitzWzFdfXJldHVybiByfWZ1bmN0aW9uIHdvKG4sdCl7Zm9yKHZhciBlLHI9W10sdT0oMS10KS8yLGk9blswXSxvPW5bMV0sYT0xLGM9bi5sZW5ndGg7KythPGM7KWU9aSxpPW8sbz1uW2FdLHIucHVzaChbdSoob1swXS1lWzBdKSx1KihvWzFdLWVbMV0pXSk7cmV0dXJuIHJ9ZnVuY3Rpb24gU28obil7aWYobi5sZW5ndGg8MylyZXR1cm4gZ28obik7dmFyIHQ9MSxlPW4ubGVuZ3RoLHI9blswXSx1PXJbMF0saT1yWzFdLG89W3UsdSx1LChyPW5bMV0pWzBdXSxhPVtpLGksaSxyWzFdXSxjPVt1LCIsIixpLCJMIixObyhDbCxvKSwiLCIsTm8oQ2wsYSldO2ZvcihuLnB1c2gobltlLTFdKTsrK3Q8PWU7KXI9blt0XSxvLnNoaWZ0KCksby5wdXNoKHJbMF0pLGEuc2hpZnQoKSxhLnB1c2goclsxXSksQ28oYyxvLGEpO3JldHVybiBuLnBvcCgpLGMucHVzaCgiTCIsciksYy5qb2luKCIiKX1mdW5jdGlvbiBrbyhuKXtpZihuLmxlbmd0aDw0KXJldHVybiBnbyhuKTtmb3IodmFyIHQsZT1bXSxyPS0xLHU9bi5sZW5ndGgsaT1bMF0sbz1bMF07KytyPDM7KXQ9bltyXSxpLnB1c2godFswXSksby5wdXNoKHRbMV0pO2ZvcihlLnB1c2goTm8oQ2wsaSkrIiwiK05vKENsLG8pKSwtLXI7KytyPHU7KXQ9bltyXSxpLnNoaWZ0KCksaS5wdXNoKHRbMF0pLG8uc2hpZnQoKSxvLnB1c2godFsxXSksQ28oZSxpLG8pO3JldHVybiBlLmpvaW4oIiIpfWZ1bmN0aW9uIEVvKG4pe2Zvcih2YXIgdCxlLHI9LTEsdT1uLmxlbmd0aCxpPXUrNCxvPVtdLGE9W107KytyPDQ7KWU9bltyJXVdLG8ucHVzaChlWzBdKSxhLnB1c2goZVsxXSk7Zm9yKHQ9W05vKENsLG8pLCIsIixObyhDbCxhKV0sLS1yOysrcjxpOyllPW5bciV1XSxvLnNoaWZ0KCksby5wdXNoKGVbMF0pLGEuc2hpZnQoKSxhLnB1c2goZVsxXSksQ28odCxvLGEpO3JldHVybiB0LmpvaW4oIiIpfWZ1bmN0aW9uIEFvKG4sdCl7dmFyIGU9bi5sZW5ndGgtMTtpZihlKWZvcih2YXIgcix1LGk9blswXVswXSxvPW5bMF1bMV0sYT1uW2VdWzBdLWksYz1uW2VdWzFdLW8sbD0tMTsrK2w8PWU7KXI9bltsXSx1PWwvZSxyWzBdPXQqclswXSsoMS10KSooaSt1KmEpLHJbMV09dCpyWzFdKygxLXQpKihvK3UqYyk7cmV0dXJuIFNvKG4pfWZ1bmN0aW9uIE5vKG4sdCl7cmV0dXJuIG5bMF0qdFswXStuWzFdKnRbMV0rblsyXSp0WzJdK25bM10qdFszXX1mdW5jdGlvbiBDbyhuLHQsZSl7bi5wdXNoKCJDIixObyhBbCx0KSwiLCIsTm8oQWwsZSksIiwiLE5vKE5sLHQpLCIsIixObyhObCxlKSwiLCIsTm8oQ2wsdCksIiwiLE5vKENsLGUpKX1mdW5jdGlvbiB6byhuLHQpe3JldHVybih0WzFdLW5bMV0pLyh0WzBdLW5bMF0pfWZ1bmN0aW9uIHFvKG4pe2Zvcih2YXIgdD0wLGU9bi5sZW5ndGgtMSxyPVtdLHU9blswXSxpPW5bMV0sbz1yWzBdPXpvKHUsaSk7Kyt0PGU7KXJbdF09KG8rKG89em8odT1pLGk9blt0KzFdKSkpLzI7cmV0dXJuIHJbdF09byxyfWZ1bmN0aW9uIExvKG4pe2Zvcih2YXIgdCxlLHIsdSxpPVtdLG89cW8obiksYT0tMSxjPW4ubGVuZ3RoLTE7KythPGM7KXQ9em8oblthXSxuW2ErMV0pLGdhKHQpPENhP29bYV09b1thKzFdPTA6KGU9b1thXS90LHI9b1thKzFdL3QsdT1lKmUrcipyLHU+OSYmKHU9Myp0L01hdGguc3FydCh1KSxvW2FdPXUqZSxvW2ErMV09dSpyKSk7Zm9yKGE9LTE7KythPD1jOyl1PShuW01hdGgubWluKGMsYSsxKV1bMF0tbltNYXRoLm1heCgwLGEtMSldWzBdKS8oNiooMStvW2FdKm9bYV0pKSxpLnB1c2goW3V8fDAsb1thXSp1fHwwXSk7cmV0dXJuIGl9ZnVuY3Rpb24gVG8obil7cmV0dXJuIG4ubGVuZ3RoPDM/Z28obik6blswXStfbyhuLExvKG4pKX1mdW5jdGlvbiBSbyhuKXtmb3IodmFyIHQsZSxyLHU9LTEsaT1uLmxlbmd0aDsrK3U8aTspdD1uW3VdLGU9dFswXSxyPXRbMV0tUmEsdFswXT1lKk1hdGguY29zKHIpLHRbMV09ZSpNYXRoLnNpbihyKTtyZXR1cm4gbn1mdW5jdGlvbiBEbyhuKXtmdW5jdGlvbiB0KHQpe2Z1bmN0aW9uIGMoKXt2LnB1c2goIk0iLGEobihtKSxmKSxzLGwobihkLnJldmVyc2UoKSksZiksIloiKX1mb3IodmFyIGgsZyxwLHY9W10sZD1bXSxtPVtdLHk9LTEsTT10Lmxlbmd0aCx4PUV0KGUpLGI9RXQodSksXz1lPT09cj9mdW5jdGlvbigpe3JldHVybiBnfTpFdChyKSx3PXU9PT1pP2Z1bmN0aW9uKCl7cmV0dXJuIHB9OkV0KGkpOysreTxNOylvLmNhbGwodGhpcyxoPXRbeV0seSk/KGQucHVzaChbZz0reC5jYWxsKHRoaXMsaCx5KSxwPStiLmNhbGwodGhpcyxoLHkpXSksbS5wdXNoKFsrXy5jYWxsKHRoaXMsaCx5KSwrdy5jYWxsKHRoaXMsaCx5KV0pKTpkLmxlbmd0aCYmKGMoKSxkPVtdLG09W10pO3JldHVybiBkLmxlbmd0aCYmYygpLHYubGVuZ3RoP3Yuam9pbigiIik6bnVsbH12YXIgZT1BcixyPUFyLHU9MCxpPU5yLG89TmUsYT1nbyxjPWEua2V5LGw9YSxzPSJMIixmPS43O3JldHVybiB0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9cj1uLHQpOnJ9LHQueDA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix0KTplfSx0LngxPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdCk6cg0KfSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9aT1uLHQpOml9LHQueTA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bix0KTp1fSx0LnkxPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW4sdCk6aX0sdC5kZWZpbmVkPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW4sdCk6b30sdC5pbnRlcnBvbGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9hPW46KGE9RWwuZ2V0KG4pfHxnbykua2V5LGw9YS5yZXZlcnNlfHxhLHM9YS5jbG9zZWQ/Ik0iOiJMIix0KTpjfSx0LnRlbnNpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9bix0KTpmfSx0fWZ1bmN0aW9uIFBvKG4pe3JldHVybiBuLnJhZGl1c31mdW5jdGlvbiBVbyhuKXtyZXR1cm5bbi54LG4ueV19ZnVuY3Rpb24gam8obil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyksZT10WzBdLHI9dFsxXS1SYTtyZXR1cm5bZSpNYXRoLmNvcyhyKSxlKk1hdGguc2luKHIpXX19ZnVuY3Rpb24gRm8oKXtyZXR1cm4gNjR9ZnVuY3Rpb24gSG8oKXtyZXR1cm4iY2lyY2xlIn1mdW5jdGlvbiBPbyhuKXt2YXIgdD1NYXRoLnNxcnQobi9xYSk7cmV0dXJuIk0wLCIrdCsiQSIrdCsiLCIrdCsiIDAgMSwxIDAsIistdCsiQSIrdCsiLCIrdCsiIDAgMSwxIDAsIit0KyJaIn1mdW5jdGlvbiBJbyhuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdCxlOyh0PXRoaXNbbl0pJiYoZT10W3QuYWN0aXZlXSkmJigtLXQuY291bnQ/ZGVsZXRlIHRbdC5hY3RpdmVdOmRlbGV0ZSB0aGlzW25dLHQuYWN0aXZlKz0uNSxlLmV2ZW50JiZlLmV2ZW50LmludGVycnVwdC5jYWxsKHRoaXMsdGhpcy5fX2RhdGFfXyxlLmluZGV4KSl9fWZ1bmN0aW9uIFlvKG4sdCxlKXtyZXR1cm4geWEobixQbCksbi5uYW1lc3BhY2U9dCxuLmlkPWUsbn1mdW5jdGlvbiBabyhuLHQsZSxyKXt2YXIgdT1uLmlkLGk9bi5uYW1lc3BhY2U7cmV0dXJuIFkobiwiZnVuY3Rpb24iPT10eXBlb2YgZT9mdW5jdGlvbihuLG8sYSl7bltpXVt1XS50d2Vlbi5zZXQodCxyKGUuY2FsbChuLG4uX19kYXRhX18sbyxhKSkpfTooZT1yKGUpLGZ1bmN0aW9uKG4pe25baV1bdV0udHdlZW4uc2V0KHQsZSl9KSl9ZnVuY3Rpb24gVm8obil7cmV0dXJuIG51bGw9PW4mJihuPSIiKSxmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9bn19ZnVuY3Rpb24gWG8obil7cmV0dXJuIG51bGw9PW4/Il9fdHJhbnNpdGlvbl9fIjoiX190cmFuc2l0aW9uXyIrbisiX18ifWZ1bmN0aW9uICRvKG4sdCxlLHIsdSl7dmFyIGk9bltlXXx8KG5bZV09e2FjdGl2ZTowLGNvdW50OjB9KSxvPWlbcl07aWYoIW8pe3ZhciBhPXUudGltZTtvPWlbcl09e3R3ZWVuOm5ldyBsLHRpbWU6YSxkZWxheTp1LmRlbGF5LGR1cmF0aW9uOnUuZHVyYXRpb24sZWFzZTp1LmVhc2UsaW5kZXg6dH0sdT1udWxsLCsraS5jb3VudCx0YS50aW1lcihmdW5jdGlvbih1KXtmdW5jdGlvbiBjKGUpe2lmKGkuYWN0aXZlPnIpcmV0dXJuIHMoKTt2YXIgdT1pW2kuYWN0aXZlXTt1JiYoLS1pLmNvdW50LGRlbGV0ZSBpW2kuYWN0aXZlXSx1LmV2ZW50JiZ1LmV2ZW50LmludGVycnVwdC5jYWxsKG4sbi5fX2RhdGFfXyx1LmluZGV4KSksaS5hY3RpdmU9cixvLmV2ZW50JiZvLmV2ZW50LnN0YXJ0LmNhbGwobixuLl9fZGF0YV9fLHQpLG8udHdlZW4uZm9yRWFjaChmdW5jdGlvbihlLHIpeyhyPXIuY2FsbChuLG4uX19kYXRhX18sdCkpJiZ2LnB1c2gocil9KSxoPW8uZWFzZSxmPW8uZHVyYXRpb24sdGEudGltZXIoZnVuY3Rpb24oKXtyZXR1cm4gcC5jPWwoZXx8MSk/TmU6bCwxfSwwLGEpfWZ1bmN0aW9uIGwoZSl7aWYoaS5hY3RpdmUhPT1yKXJldHVybiAxO2Zvcih2YXIgdT1lL2YsYT1oKHUpLGM9di5sZW5ndGg7Yz4wOyl2Wy0tY10uY2FsbChuLGEpO3JldHVybiB1Pj0xPyhvLmV2ZW50JiZvLmV2ZW50LmVuZC5jYWxsKG4sbi5fX2RhdGFfXyx0KSxzKCkpOnZvaWQgMH1mdW5jdGlvbiBzKCl7cmV0dXJuLS1pLmNvdW50P2RlbGV0ZSBpW3JdOmRlbGV0ZSBuW2VdLDF9dmFyIGYsaCxnPW8uZGVsYXkscD1lYyx2PVtdO3JldHVybiBwLnQ9ZythLHU+PWc/Yyh1LWcpOnZvaWQocC5jPWMpfSwwLGEpfX1mdW5jdGlvbiBCbyhuLHQsZSl7bi5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKG4pe3ZhciByPXQobik7cmV0dXJuInRyYW5zbGF0ZSgiKyhpc0Zpbml0ZShyKT9yOmUobikpKyIsMCkifSl9ZnVuY3Rpb24gV28obix0LGUpe24uYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihuKXt2YXIgcj10KG4pO3JldHVybiJ0cmFuc2xhdGUoMCwiKyhpc0Zpbml0ZShyKT9yOmUobikpKyIpIn0pfWZ1bmN0aW9uIEpvKG4pe3JldHVybiBuLnRvSVNPU3RyaW5nKCl9ZnVuY3Rpb24gR28obix0LGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIG4odCl9ZnVuY3Rpb24gdShuLGUpe3ZhciByPW5bMV0tblswXSx1PXIvZSxpPXRhLmJpc2VjdChWbCx1KTtyZXR1cm4gaT09VmwubGVuZ3RoP1t0LnllYXIsVmkobi5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG4vMzE1MzZlNn0pLGUpWzJdXTppP3RbdS9WbFtpLTFdPFZsW2ldL3U/aS0xOmldOltCbCxWaShuLGUpWzJdXX1yZXR1cm4gci5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIEtvKG4uaW52ZXJ0KHQpKX0sci5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG4uZG9tYWluKHQpLHIpOm4uZG9tYWluKCkubWFwKEtvKX0sci5uaWNlPWZ1bmN0aW9uKG4sdCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4haXNOYU4oZSkmJiFuLnJhbmdlKGUsS28oK2UrMSksdCkubGVuZ3RofXZhciBpPXIuZG9tYWluKCksbz1QaShpKSxhPW51bGw9PW4/dShvLDEwKToibnVtYmVyIj09dHlwZW9mIG4mJnUobyxuKTtyZXR1cm4gYSYmKG49YVswXSx0PWFbMV0pLHIuZG9tYWluKEZpKGksdD4xP3tmbG9vcjpmdW5jdGlvbih0KXtmb3IoO2UodD1uLmZsb29yKHQpKTspdD1Lbyh0LTEpO3JldHVybiB0fSxjZWlsOmZ1bmN0aW9uKHQpe2Zvcig7ZSh0PW4uY2VpbCh0KSk7KXQ9S28oK3QrMSk7cmV0dXJuIHR9fTpuKSl9LHIudGlja3M9ZnVuY3Rpb24obix0KXt2YXIgZT1QaShyLmRvbWFpbigpKSxpPW51bGw9PW4/dShlLDEwKToibnVtYmVyIj09dHlwZW9mIG4/dShlLG4pOiFuLnJhbmdlJiZbe3JhbmdlOm59LHRdO3JldHVybiBpJiYobj1pWzBdLHQ9aVsxXSksbi5yYW5nZShlWzBdLEtvKCtlWzFdKzEpLDE+dD8xOnQpfSxyLnRpY2tGb3JtYXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIEdvKG4uY29weSgpLHQsZSl9LFlpKHIsbil9ZnVuY3Rpb24gS28obil7cmV0dXJuIG5ldyBEYXRlKG4pfWZ1bmN0aW9uIFFvKG4pe3JldHVybiBKU09OLnBhcnNlKG4ucmVzcG9uc2VUZXh0KX1mdW5jdGlvbiBuYShuKXt2YXIgdD11YS5jcmVhdGVSYW5nZSgpO3JldHVybiB0LnNlbGVjdE5vZGUodWEuYm9keSksdC5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQobi5yZXNwb25zZVRleHQpfXZhciB0YT17dmVyc2lvbjoiMy41LjUifSxlYT1bXS5zbGljZSxyYT1mdW5jdGlvbihuKXtyZXR1cm4gZWEuY2FsbChuKX0sdWE9dGhpcy5kb2N1bWVudDtpZih1YSl0cnl7cmEodWEuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMpWzBdLm5vZGVUeXBlfWNhdGNoKGlhKXtyYT1mdW5jdGlvbihuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT1uZXcgQXJyYXkodCk7dC0tOyllW3RdPW5bdF07cmV0dXJuIGV9fWlmKERhdGUubm93fHwoRGF0ZS5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4rbmV3IERhdGV9KSx1YSl0cnl7dWEuY3JlYXRlRWxlbWVudCgiRElWIikuc3R5bGUuc2V0UHJvcGVydHkoIm9wYWNpdHkiLDAsIiIpfWNhdGNoKG9hKXt2YXIgYWE9dGhpcy5FbGVtZW50LnByb3RvdHlwZSxjYT1hYS5zZXRBdHRyaWJ1dGUsbGE9YWEuc2V0QXR0cmlidXRlTlMsc2E9dGhpcy5DU1NTdHlsZURlY2xhcmF0aW9uLnByb3RvdHlwZSxmYT1zYS5zZXRQcm9wZXJ0eTthYS5zZXRBdHRyaWJ1dGU9ZnVuY3Rpb24obix0KXtjYS5jYWxsKHRoaXMsbix0KyIiKX0sYWEuc2V0QXR0cmlidXRlTlM9ZnVuY3Rpb24obix0LGUpe2xhLmNhbGwodGhpcyxuLHQsZSsiIil9LHNhLnNldFByb3BlcnR5PWZ1bmN0aW9uKG4sdCxlKXtmYS5jYWxsKHRoaXMsbix0KyIiLGUpfX10YS5hc2NlbmRpbmc9ZSx0YS5kZXNjZW5kaW5nPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4+dD8tMTp0Pm4/MTp0Pj1uPzA6MC8wfSx0YS5taW49ZnVuY3Rpb24obix0KXt2YXIgZSxyLHU9LTEsaT1uLmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKDsrK3U8aTspaWYobnVsbCE9KHI9blt1XSkmJnI+PXIpe2U9cjticmVha31mb3IoOysrdTxpOyludWxsIT0ocj1uW3VdKSYmZT5yJiYoZT1yKX1lbHNle2Zvcig7Kyt1PGk7KWlmKG51bGwhPShyPXQuY2FsbChuLG5bdV0sdSkpJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK3U8aTspbnVsbCE9KHI9dC5jYWxsKG4sblt1XSx1KSkmJmU+ciYmKGU9cil9cmV0dXJuIGV9LHRhLm1heD1mdW5jdGlvbihuLHQpe3ZhciBlLHIsdT0tMSxpPW4ubGVuZ3RoO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IoOysrdTxpOylpZihudWxsIT0ocj1uW3VdKSYmcj49cil7ZT1yO2JyZWFrfWZvcig7Kyt1PGk7KW51bGwhPShyPW5bdV0pJiZyPmUmJihlPXIpfWVsc2V7Zm9yKDsrK3U8aTspaWYobnVsbCE9KHI9dC5jYWxsKG4sblt1XSx1KSkmJnI+PXIpe2U9cjticmVha31mb3IoOysrdTxpOyludWxsIT0ocj10LmNhbGwobixuW3VdLHUpKSYmcj5lJiYoZT1yKX1yZXR1cm4gZX0sdGEuZXh0ZW50PWZ1bmN0aW9uKG4sdCl7dmFyIGUscix1LGk9LTEsbz1uLmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKDsrK2k8bzspaWYobnVsbCE9KHI9bltpXSkmJnI+PXIpe2U9dT1yO2JyZWFrfWZvcig7KytpPG87KW51bGwhPShyPW5baV0pJiYoZT5yJiYoZT1yKSxyPnUmJih1PXIpKX1lbHNle2Zvcig7KytpPG87KWlmKG51bGwhPShyPXQuY2FsbChuLG5baV0saSkpJiZyPj1yKXtlPXU9cjticmVha31mb3IoOysraTxvOyludWxsIT0ocj10LmNhbGwobixuW2ldLGkpKSYmKGU+ciYmKGU9cikscj51JiYodT1yKSl9cmV0dXJuW2UsdV19LHRhLnN1bT1mdW5jdGlvbihuLHQpe3ZhciBlLHI9MCxpPW4ubGVuZ3RoLG89LTE7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK288aTspdShlPStuW29dKSYmKHIrPWUpO2Vsc2UgZm9yKDsrK288aTspdShlPSt0LmNhbGwobixuW29dLG8pKSYmKHIrPWUpO3JldHVybiByfSx0YS5tZWFuPWZ1bmN0aW9uKG4sdCl7dmFyIGUsaT0wLG89bi5sZW5ndGgsYT0tMSxjPW87aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2E8bzspdShlPXIoblthXSkpP2krPWU6LS1jO2Vsc2UgZm9yKDsrK2E8bzspdShlPXIodC5jYWxsKG4sblthXSxhKSkpP2krPWU6LS1jO3JldHVybiBjP2kvYzp2b2lkIDB9LHRhLnF1YW50aWxlPWZ1bmN0aW9uKG4sdCl7dmFyIGU9KG4ubGVuZ3RoLTEpKnQrMSxyPU1hdGguZmxvb3IoZSksdT0rbltyLTFdLGk9ZS1yO3JldHVybiBpP3UraSoobltyXS11KTp1fSx0YS5tZWRpYW49ZnVuY3Rpb24obix0KXt2YXIgaSxvPVtdLGE9bi5sZW5ndGgsYz0tMTtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IoOysrYzxhOyl1KGk9cihuW2NdKSkmJm8ucHVzaChpKTtlbHNlIGZvcig7KytjPGE7KXUoaT1yKHQuY2FsbChuLG5bY10sYykpKSYmby5wdXNoKGkpO3JldHVybiBvLmxlbmd0aD90YS5xdWFudGlsZShvLnNvcnQoZSksLjUpOnZvaWQgMH0sdGEudmFyaWFuY2U9ZnVuY3Rpb24obix0KXt2YXIgZSxpLG89bi5sZW5ndGgsYT0wLGM9MCxsPS0xLHM9MDtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IoOysrbDxvOyl1KGU9cihuW2xdKSkmJihpPWUtYSxhKz1pLysrcyxjKz1pKihlLWEpKTtlbHNlIGZvcig7KytsPG87KXUoZT1yKHQuY2FsbChuLG5bbF0sbCkpKSYmKGk9ZS1hLGErPWkvKytzLGMrPWkqKGUtYSkpO3JldHVybiBzPjE/Yy8ocy0xKTp2b2lkIDB9LHRhLmRldmlhdGlvbj1mdW5jdGlvbigpe3ZhciBuPXRhLnZhcmlhbmNlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbj9NYXRoLnNxcnQobik6bn07dmFyIGhhPWkoZSk7dGEuYmlzZWN0TGVmdD1oYS5sZWZ0LHRhLmJpc2VjdD10YS5iaXNlY3RSaWdodD1oYS5yaWdodCx0YS5iaXNlY3Rvcj1mdW5jdGlvbihuKXtyZXR1cm4gaSgxPT09bi5sZW5ndGg/ZnVuY3Rpb24odCxyKXtyZXR1cm4gZShuKHQpLHIpfTpuKX0sdGEuc2h1ZmZsZT1mdW5jdGlvbihuLHQsZSl7KGk9YXJndW1lbnRzLmxlbmd0aCk8MyYmKGU9bi5sZW5ndGgsMj5pJiYodD0wKSk7Zm9yKHZhciByLHUsaT1lLXQ7aTspdT1NYXRoLnJhbmRvbSgpKmktLXwwLHI9bltpK3RdLG5baSt0XT1uW3UrdF0sblt1K3RdPXI7cmV0dXJuIG59LHRhLnBlcm11dGU9ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9dC5sZW5ndGgscj1uZXcgQXJyYXkoZSk7ZS0tOylyW2VdPW5bdFtlXV07cmV0dXJuIHJ9LHRhLnBhaXJzPWZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxlPTAscj1uLmxlbmd0aC0xLHU9blswXSxpPW5ldyBBcnJheSgwPnI/MDpyKTtyPmU7KWlbZV09W3Q9dSx1PW5bKytlXV07cmV0dXJuIGl9LHRhLnppcD1mdW5jdGlvbigpe2lmKCEocj1hcmd1bWVudHMubGVuZ3RoKSlyZXR1cm5bXTtmb3IodmFyIG49LTEsdD10YS5taW4oYXJndW1lbnRzLG8pLGU9bmV3IEFycmF5KHQpOysrbjx0Oylmb3IodmFyIHIsdT0tMSxpPWVbbl09bmV3IEFycmF5KHIpOysrdTxyOylpW3VdPWFyZ3VtZW50c1t1XVtuXTtyZXR1cm4gZX0sdGEudHJhbnNwb3NlPWZ1bmN0aW9uKG4pe3JldHVybiB0YS56aXAuYXBwbHkodGEsbil9LHRhLmtleXM9ZnVuY3Rpb24obil7dmFyIHQ9W107Zm9yKHZhciBlIGluIG4pdC5wdXNoKGUpO3JldHVybiB0fSx0YS52YWx1ZXM9ZnVuY3Rpb24obil7dmFyIHQ9W107Zm9yKHZhciBlIGluIG4pdC5wdXNoKG5bZV0pO3JldHVybiB0fSx0YS5lbnRyaWVzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiBuKXQucHVzaCh7a2V5OmUsdmFsdWU6bltlXX0pO3JldHVybiB0fSx0YS5tZXJnZT1mdW5jdGlvbihuKXtmb3IodmFyIHQsZSxyLHU9bi5sZW5ndGgsaT0tMSxvPTA7KytpPHU7KW8rPW5baV0ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShvKTstLXU+PTA7KWZvcihyPW5bdV0sdD1yLmxlbmd0aDstLXQ+PTA7KWVbLS1vXT1yW3RdO3JldHVybiBlfTt2YXIgZ2E9TWF0aC5hYnM7dGEucmFuZ2U9ZnVuY3Rpb24obix0LGUpe2lmKGFyZ3VtZW50cy5sZW5ndGg8MyYmKGU9MSxhcmd1bWVudHMubGVuZ3RoPDImJih0PW4sbj0wKSksKHQtbikvZT09PTEvMCl0aHJvdyBuZXcgRXJyb3IoImluZmluaXRlIHJhbmdlIik7dmFyIHIsdT1bXSxpPWEoZ2EoZSkpLG89LTE7aWYobio9aSx0Kj1pLGUqPWksMD5lKWZvcig7KHI9bitlKisrbyk+dDspdS5wdXNoKHIvaSk7ZWxzZSBmb3IoOyhyPW4rZSorK28pPHQ7KXUucHVzaChyL2kpO3JldHVybiB1fSx0YS5tYXA9ZnVuY3Rpb24obix0KXt2YXIgZT1uZXcgbDtpZihuIGluc3RhbmNlb2YgbCluLmZvckVhY2goZnVuY3Rpb24obix0KXtlLnNldChuLHQpfSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KG4pKXt2YXIgcix1PS0xLGk9bi5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK3U8aTspZS5zZXQodSxuW3VdKTtlbHNlIGZvcig7Kyt1PGk7KWUuc2V0KHQuY2FsbChuLHI9blt1XSx1KSxyKX1lbHNlIGZvcih2YXIgbyBpbiBuKWUuc2V0KG8sbltvXSk7cmV0dXJuIGV9O3ZhciBwYT0iX19wcm90b19fIix2YT0iXHgwMCI7YyhsLHtoYXM6aCxnZXQ6ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX1tzKG4pXX0sc2V0OmZ1bmN0aW9uKG4sdCl7cmV0dXJuIHRoaXMuX1tzKG4pXT10fSxyZW1vdmU6ZyxrZXlzOnAsdmFsdWVzOmZ1bmN0aW9uKCl7dmFyIG49W107Zm9yKHZhciB0IGluIHRoaXMuXyluLnB1c2godGhpcy5fW3RdKTtyZXR1cm4gbn0sZW50cmllczpmdW5jdGlvbigpe3ZhciBuPVtdO2Zvcih2YXIgdCBpbiB0aGlzLl8pbi5wdXNoKHtrZXk6Zih0KSx2YWx1ZTp0aGlzLl9bdF19KTtyZXR1cm4gbn0sc2l6ZTp2LGVtcHR5OmQsZm9yRWFjaDpmdW5jdGlvbihuKXtmb3IodmFyIHQgaW4gdGhpcy5fKW4uY2FsbCh0aGlzLGYodCksdGhpcy5fW3RdKX19KSx0YS5uZXN0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih0LG8sYSl7aWYoYT49aS5sZW5ndGgpcmV0dXJuIHI/ci5jYWxsKHUsbyk6ZT9vLnNvcnQoZSk6bztmb3IodmFyIGMscyxmLGgsZz0tMSxwPW8ubGVuZ3RoLHY9aVthKytdLGQ9bmV3IGw7KytnPHA7KShoPWQuZ2V0KGM9dihzPW9bZ10pKSk/aC5wdXNoKHMpOmQuc2V0KGMsW3NdKTtyZXR1cm4gdD8ocz10KCksZj1mdW5jdGlvbihlLHIpe3Muc2V0KGUsbih0LHIsYSkpfSk6KHM9e30sZj1mdW5jdGlvbihlLHIpe3NbZV09bih0LHIsYSl9KSxkLmZvckVhY2goZiksc31mdW5jdGlvbiB0KG4sZSl7aWYoZT49aS5sZW5ndGgpcmV0dXJuIG47dmFyIHI9W10sdT1vW2UrK107cmV0dXJuIG4uZm9yRWFjaChmdW5jdGlvbihuLHUpe3IucHVzaCh7a2V5Om4sdmFsdWVzOnQodSxlKX0pfSksdT9yLnNvcnQoZnVuY3Rpb24obix0KXtyZXR1cm4gdShuLmtleSx0LmtleSl9KTpyfXZhciBlLHIsdT17fSxpPVtdLG89W107cmV0dXJuIHUubWFwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4oZSx0LDApfSx1LmVudHJpZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobih0YS5tYXAsZSwwKSwwKX0sdS5rZXk9ZnVuY3Rpb24obil7cmV0dXJuIGkucHVzaChuKSx1fSx1LnNvcnRLZXlzPWZ1bmN0aW9uKG4pe3JldHVybiBvW2kubGVuZ3RoLTFdPW4sdX0sdS5zb3J0VmFsdWVzPWZ1bmN0aW9uKG4pe3JldHVybiBlPW4sdX0sdS5yb2xsdXA9ZnVuY3Rpb24obil7cmV0dXJuIHI9bix1fSx1fSx0YS5zZXQ9ZnVuY3Rpb24obil7dmFyIHQ9bmV3IG07aWYobilmb3IodmFyIGU9MCxyPW4ubGVuZ3RoO3I+ZTsrK2UpdC5hZGQobltlXSk7cmV0dXJuIHR9LGMobSx7aGFzOmgsYWRkOmZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLl9bcyhuKz0iIildPSEwLG59LHJlbW92ZTpnLHZhbHVlczpwLHNpemU6dixlbXB0eTpkLGZvckVhY2g6ZnVuY3Rpb24obil7Zm9yKHZhciB0IGluIHRoaXMuXyluLmNhbGwodGhpcyxmKHQpKX19KSx0YS5iZWhhdmlvcj17fSx0YS5yZWJpbmQ9ZnVuY3Rpb24obix0KXtmb3IodmFyIGUscj0xLHU9YXJndW1lbnRzLmxlbmd0aDsrK3I8dTspbltlPWFyZ3VtZW50c1tyXV09TShuLHQsdFtlXSk7cmV0dXJuIG59O3ZhciBkYT1bIndlYmtpdCIsIm1zIiwibW96IiwiTW96IiwibyIsIk8iXTt0YS5kaXNwYXRjaD1mdW5jdGlvbigpe2Zvcih2YXIgbj1uZXcgXyx0PS0xLGU9YXJndW1lbnRzLmxlbmd0aDsrK3Q8ZTspblthcmd1bWVudHNbdF1dPXcobik7cmV0dXJuIG59LF8ucHJvdG90eXBlLm9uPWZ1bmN0aW9uKG4sdCl7dmFyIGU9bi5pbmRleE9mKCIuIikscj0iIjtpZihlPj0wJiYocj1uLnNsaWNlKGUrMSksbj1uLnNsaWNlKDAsZSkpLG4pcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj90aGlzW25dLm9uKHIpOnRoaXNbbl0ub24ocix0KTtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7aWYobnVsbD09dClmb3IobiBpbiB0aGlzKXRoaXMuaGFzT3duUHJvcGVydHkobikmJnRoaXNbbl0ub24ocixudWxsKTtyZXR1cm4gdGhpc319LHRhLmV2ZW50PW51bGwsdGEucmVxdW90ZT1mdW5jdGlvbihuKXtyZXR1cm4gbi5yZXBsYWNlKG1hLCJcXCQmIil9O3ZhciBtYT0vW1xcXF5cJFwqXCtcP1x8XFtcXVwoXClcLlx7XH1dL2cseWE9e30uX19wcm90b19fP2Z1bmN0aW9uKG4sdCl7bi5fX3Byb3RvX189dH06ZnVuY3Rpb24obix0KXtmb3IodmFyIGUgaW4gdCluW2VdPXRbZV19LE1hPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHQucXVlcnlTZWxlY3RvcihuKX0seGE9ZnVuY3Rpb24obix0KXtyZXR1cm4gdC5xdWVyeVNlbGVjdG9yQWxsKG4pfSxiYT1mdW5jdGlvbihuLHQpe3ZhciBlPW4ubWF0Y2hlc3x8blt4KG4sIm1hdGNoZXNTZWxlY3RvciIpXTtyZXR1cm4oYmE9ZnVuY3Rpb24obix0KXtyZXR1cm4gZS5jYWxsKG4sdCl9KShuLHQpfTsiZnVuY3Rpb24iPT10eXBlb2YgU2l6emxlJiYoTWE9ZnVuY3Rpb24obix0KXtyZXR1cm4gU2l6emxlKG4sdClbMF18fG51bGx9LHhhPVNpenpsZSxiYT1TaXp6bGUubWF0Y2hlc1NlbGVjdG9yKSx0YS5zZWxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGEuc2VsZWN0KHVhLmRvY3VtZW50RWxlbWVudCl9O3ZhciBfYT10YS5zZWxlY3Rpb24ucHJvdG90eXBlPVtdO19hLnNlbGVjdD1mdW5jdGlvbihuKXt2YXIgdCxlLHIsdSxpPVtdO249TihuKTtmb3IodmFyIG89LTEsYT10aGlzLmxlbmd0aDsrK288YTspe2kucHVzaCh0PVtdKSx0LnBhcmVudE5vZGU9KHI9dGhpc1tvXSkucGFyZW50Tm9kZTtmb3IodmFyIGM9LTEsbD1yLmxlbmd0aDsrK2M8bDspKHU9cltjXSk/KHQucHVzaChlPW4uY2FsbCh1LHUuX19kYXRhX18sYyxvKSksZSYmIl9fZGF0YV9fImluIHUmJihlLl9fZGF0YV9fPXUuX19kYXRhX18pKTp0LnB1c2gobnVsbCl9cmV0dXJuIEEoaSl9LF9hLnNlbGVjdEFsbD1mdW5jdGlvbihuKXt2YXIgdCxlLHI9W107bj1DKG4pO2Zvcih2YXIgdT0tMSxpPXRoaXMubGVuZ3RoOysrdTxpOylmb3IodmFyIG89dGhpc1t1XSxhPS0xLGM9by5sZW5ndGg7KythPGM7KShlPW9bYV0pJiYoci5wdXNoKHQ9cmEobi5jYWxsKGUsZS5fX2RhdGFfXyxhLHUpKSksdC5wYXJlbnROb2RlPWUpO3JldHVybiBBKHIpfTt2YXIgd2E9e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHhodG1sOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIix4bGluazoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIseG1sOiJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyJ9O3RhLm5zPXtwcmVmaXg6d2EscXVhbGlmeTpmdW5jdGlvbihuKXt2YXIgdD1uLmluZGV4T2YoIjoiKSxlPW47cmV0dXJuIHQ+PTAmJihlPW4uc2xpY2UoMCx0KSxuPW4uc2xpY2UodCsxKSksd2EuaGFzT3duUHJvcGVydHkoZSk/e3NwYWNlOndhW2VdLGxvY2FsOm59Om59fSxfYS5hdHRyPWZ1bmN0aW9uKG4sdCl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtpZigic3RyaW5nIj09dHlwZW9mIG4pe3ZhciBlPXRoaXMubm9kZSgpO3JldHVybiBuPXRhLm5zLnF1YWxpZnkobiksbi5sb2NhbD9lLmdldEF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCk6ZS5nZXRBdHRyaWJ1dGUobil9Zm9yKHQgaW4gbil0aGlzLmVhY2goeih0LG5bdF0pKTtyZXR1cm4gdGhpc31yZXR1cm4gdGhpcy5lYWNoKHoobix0KSl9LF9hLmNsYXNzZWQ9ZnVuY3Rpb24obix0KXtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2lmKCJzdHJpbmciPT10eXBlb2Ygbil7dmFyIGU9dGhpcy5ub2RlKCkscj0obj1UKG4pKS5sZW5ndGgsdT0tMTtpZih0PWUuY2xhc3NMaXN0KXtmb3IoOysrdTxyOylpZighdC5jb250YWlucyhuW3VdKSlyZXR1cm4hMX1lbHNlIGZvcih0PWUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOysrdTxyOylpZighTChuW3VdKS50ZXN0KHQpKXJldHVybiExO3JldHVybiEwfWZvcih0IGluIG4pdGhpcy5lYWNoKFIodCxuW3RdKSk7cmV0dXJuIHRoaXN9cmV0dXJuIHRoaXMuZWFjaChSKG4sdCkpfSxfYS5zdHlsZT1mdW5jdGlvbihuLGUscil7dmFyIHU9YXJndW1lbnRzLmxlbmd0aDtpZigzPnUpe2lmKCJzdHJpbmciIT10eXBlb2Ygbil7Mj51JiYoZT0iIik7Zm9yKHIgaW4gbil0aGlzLmVhY2goUChyLG5bcl0sZSkpO3JldHVybiB0aGlzfWlmKDI+dSl7dmFyIGk9dGhpcy5ub2RlKCk7cmV0dXJuIHQoaSkuZ2V0Q29tcHV0ZWRTdHlsZShpLG51bGwpLmdldFByb3BlcnR5VmFsdWUobil9cj0iIn1yZXR1cm4gdGhpcy5lYWNoKFAobixlLHIpKX0sX2EucHJvcGVydHk9ZnVuY3Rpb24obix0KXtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2lmKCJzdHJpbmciPT10eXBlb2YgbilyZXR1cm4gdGhpcy5ub2RlKClbbl07Zm9yKHQgaW4gbil0aGlzLmVhY2goVSh0LG5bdF0pKTtyZXR1cm4gdGhpc31yZXR1cm4gdGhpcy5lYWNoKFUobix0KSl9LF9hLnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKCl7dmFyIHQ9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT10PyIiOnR9Om51bGw9PW4/ZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PSIifTpmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9bn0pOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxfYS5odG1sPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbigpe3ZhciB0PW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaW5uZXJIVE1MPW51bGw9PXQ/IiI6dH06bnVsbD09bj9mdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPSIifTpmdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPW59KTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LF9hLmFwcGVuZD1mdW5jdGlvbihuKXtyZXR1cm4gbj1qKG4pLHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQobi5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSl9LF9hLmluc2VydD1mdW5jdGlvbihuLHQpe3JldHVybiBuPWoobiksdD1OKHQpLHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHxudWxsKX0pfSxfYS5yZW1vdmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKEYpfSxfYS5kYXRhPWZ1bmN0aW9uKG4sdCl7ZnVuY3Rpb24gZShuLGUpe3ZhciByLHUsaSxvPW4ubGVuZ3RoLGY9ZS5sZW5ndGgsaD1NYXRoLm1pbihvLGYpLGc9bmV3IEFycmF5KGYpLHA9bmV3IEFycmF5KGYpLHY9bmV3IEFycmF5KG8pO2lmKHQpe3ZhciBkLG09bmV3IGwseT1uZXcgQXJyYXkobyk7Zm9yKHI9LTE7KytyPG87KW0uaGFzKGQ9dC5jYWxsKHU9bltyXSx1Ll9fZGF0YV9fLHIpKT92W3JdPXU6bS5zZXQoZCx1KSx5W3JdPWQ7Zm9yKHI9LTE7KytyPGY7KSh1PW0uZ2V0KGQ9dC5jYWxsKGUsaT1lW3JdLHIpKSk/dSE9PSEwJiYoZ1tyXT11LHUuX19kYXRhX189aSk6cFtyXT1IKGkpLG0uc2V0KGQsITApO2ZvcihyPS0xOysrcjxvOyltLmdldCh5W3JdKSE9PSEwJiYodltyXT1uW3JdKX1lbHNle2ZvcihyPS0xOysrcjxoOyl1PW5bcl0saT1lW3JdLHU/KHUuX19kYXRhX189aSxnW3JdPXUpOnBbcl09SChpKTtmb3IoO2Y+cjsrK3IpcFtyXT1IKGVbcl0pO2Zvcig7bz5yOysrcil2W3JdPW5bcl19cC51cGRhdGU9ZyxwLnBhcmVudE5vZGU9Zy5wYXJlbnROb2RlPXYucGFyZW50Tm9kZT1uLnBhcmVudE5vZGUsYS5wdXNoKHApLGMucHVzaChnKSxzLnB1c2godil9dmFyIHIsdSxpPS0xLG89dGhpcy5sZW5ndGg7aWYoIWFyZ3VtZW50cy5sZW5ndGgpe2ZvcihuPW5ldyBBcnJheShvPShyPXRoaXNbMF0pLmxlbmd0aCk7KytpPG87KSh1PXJbaV0pJiYobltpXT11Ll9fZGF0YV9fKTtyZXR1cm4gbn12YXIgYT1aKFtdKSxjPUEoW10pLHM9QShbXSk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG4pZm9yKDsrK2k8bzspZShyPXRoaXNbaV0sbi5jYWxsKHIsci5wYXJlbnROb2RlLl9fZGF0YV9fLGkpKTtlbHNlIGZvcig7KytpPG87KWUocj10aGlzW2ldLG4pO3JldHVybiBjLmVudGVyPWZ1bmN0aW9uKCl7cmV0dXJuIGF9LGMuZXhpdD1mdW5jdGlvbigpe3JldHVybiBzfSxjfSxfYS5kYXR1bT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIsbik6dGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iKX0sX2EuZmlsdGVyPWZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PVtdOyJmdW5jdGlvbiIhPXR5cGVvZiBuJiYobj1PKG4pKTtmb3IodmFyIGk9MCxvPXRoaXMubGVuZ3RoO28+aTtpKyspe3UucHVzaCh0PVtdKSx0LnBhcmVudE5vZGU9KGU9dGhpc1tpXSkucGFyZW50Tm9kZTtmb3IodmFyIGE9MCxjPWUubGVuZ3RoO2M+YTthKyspKHI9ZVthXSkmJm4uY2FsbChyLHIuX19kYXRhX18sYSxpKSYmdC5wdXNoKHIpfXJldHVybiBBKHUpfSxfYS5vcmRlcj1mdW5jdGlvbigpe2Zvcih2YXIgbj0tMSx0PXRoaXMubGVuZ3RoOysrbjx0Oylmb3IodmFyIGUscj10aGlzW25dLHU9ci5sZW5ndGgtMSxpPXJbdV07LS11Pj0wOykoZT1yW3VdKSYmKGkmJmkhPT1lLm5leHRTaWJsaW5nJiZpLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsaSksaT1lKTtyZXR1cm4gdGhpc30sX2Euc29ydD1mdW5jdGlvbihuKXtuPUkuYXBwbHkodGhpcyxhcmd1bWVudHMpO2Zvcih2YXIgdD0tMSxlPXRoaXMubGVuZ3RoOysrdDxlOyl0aGlzW3RdLnNvcnQobik7cmV0dXJuIHRoaXMub3JkZXIoKX0sX2EuZWFjaD1mdW5jdGlvbihuKXtyZXR1cm4gWSh0aGlzLGZ1bmN0aW9uKHQsZSxyKXtuLmNhbGwodCx0Ll9fZGF0YV9fLGUscil9KX0sX2EuY2FsbD1mdW5jdGlvbihuKXt2YXIgdD1yYShhcmd1bWVudHMpO3JldHVybiBuLmFwcGx5KHRbMF09dGhpcyx0KSx0aGlzfSxfYS5lbXB0eT1mdW5jdGlvbigpe3JldHVybiF0aGlzLm5vZGUoKX0sX2Eubm9kZT1mdW5jdGlvbigpe2Zvcih2YXIgbj0wLHQ9dGhpcy5sZW5ndGg7dD5uO24rKylmb3IodmFyIGU9dGhpc1tuXSxyPTAsdT1lLmxlbmd0aDt1PnI7cisrKXt2YXIgaT1lW3JdO2lmKGkpcmV0dXJuIGl9cmV0dXJuIG51bGx9LF9hLnNpemU9ZnVuY3Rpb24oKXt2YXIgbj0wO3JldHVybiBZKHRoaXMsZnVuY3Rpb24oKXsrK259KSxufTt2YXIgU2E9W107dGEuc2VsZWN0aW9uLmVudGVyPVosdGEuc2VsZWN0aW9uLmVudGVyLnByb3RvdHlwZT1TYSxTYS5hcHBlbmQ9X2EuYXBwZW5kLFNhLmVtcHR5PV9hLmVtcHR5LFNhLm5vZGU9X2Eubm9kZSxTYS5jYWxsPV9hLmNhbGwsU2Euc2l6ZT1fYS5zaXplLFNhLnNlbGVjdD1mdW5jdGlvbihuKXtmb3IodmFyIHQsZSxyLHUsaSxvPVtdLGE9LTEsYz10aGlzLmxlbmd0aDsrK2E8Yzspe3I9KHU9dGhpc1thXSkudXBkYXRlLG8ucHVzaCh0PVtdKSx0LnBhcmVudE5vZGU9dS5wYXJlbnROb2RlO2Zvcih2YXIgbD0tMSxzPXUubGVuZ3RoOysrbDxzOykoaT11W2xdKT8odC5wdXNoKHJbbF09ZT1uLmNhbGwodS5wYXJlbnROb2RlLGkuX19kYXRhX18sbCxhKSksZS5fX2RhdGFfXz1pLl9fZGF0YV9fKTp0LnB1c2gobnVsbCl9cmV0dXJuIEEobyl9LFNhLmluc2VydD1mdW5jdGlvbihuLHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDImJih0PVYodGhpcykpLF9hLmluc2VydC5jYWxsKHRoaXMsbix0KX0sdGEuc2VsZWN0PWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiJzdHJpbmciPT10eXBlb2YgdD8oZT1bTWEodCx1YSldLGUucGFyZW50Tm9kZT11YS5kb2N1bWVudEVsZW1lbnQpOihlPVt0XSxlLnBhcmVudE5vZGU9bih0KSksQShbZV0pfSx0YS5zZWxlY3RBbGw9ZnVuY3Rpb24obil7dmFyIHQ7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBuPyh0PXJhKHhhKG4sdWEpKSx0LnBhcmVudE5vZGU9dWEuZG9jdW1lbnRFbGVtZW50KToodD1uLHQucGFyZW50Tm9kZT1udWxsKSxBKFt0XSl9LF9hLm9uPWZ1bmN0aW9uKG4sdCxlKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoO2lmKDM+cil7aWYoInN0cmluZyIhPXR5cGVvZiBuKXsyPnImJih0PSExKTtmb3IoZSBpbiBuKXRoaXMuZWFjaChYKGUsbltlXSx0KSk7cmV0dXJuIHRoaXN9aWYoMj5yKXJldHVybihyPXRoaXMubm9kZSgpWyJfX29uIituXSkmJnIuXztlPSExfXJldHVybiB0aGlzLmVhY2goWChuLHQsZSkpfTt2YXIga2E9dGEubWFwKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0pO3VhJiZrYS5mb3JFYWNoKGZ1bmN0aW9uKG4peyJvbiIrbiBpbiB1YSYma2EucmVtb3ZlKG4pfSk7dmFyIEVhLEFhPTA7dGEubW91c2U9ZnVuY3Rpb24obil7cmV0dXJuIEoobixrKCkpfTt2YXIgTmE9dGhpcy5uYXZpZ2F0b3ImJi9XZWJLaXQvLnRlc3QodGhpcy5uYXZpZ2F0b3IudXNlckFnZW50KT8tMTowO3RhLnRvdWNoPWZ1bmN0aW9uKG4sdCxlKXtpZihhcmd1bWVudHMubGVuZ3RoPDMmJihlPXQsdD1rKCkuY2hhbmdlZFRvdWNoZXMpLHQpZm9yKHZhciByLHU9MCxpPXQubGVuZ3RoO2k+dTsrK3UpaWYoKHI9dFt1XSkuaWRlbnRpZmllcj09PWUpcmV0dXJuIEoobixyKX0sdGEuYmVoYXZpb3IuZHJhZz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt0aGlzLm9uKCJtb3VzZWRvd24uZHJhZyIsaSkub24oInRvdWNoc3RhcnQuZHJhZyIsbyl9ZnVuY3Rpb24gZShuLHQsZSxpLG8pe3JldHVybiBmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt2YXIgbixlLHI9dChoLHYpO3ImJihuPXJbMF0tTVswXSxlPXJbMV0tTVsxXSxwfD1ufGUsTT1yLGcoe3R5cGU6ImRyYWciLHg6clswXStsWzBdLHk6clsxXStsWzFdLGR4Om4sZHk6ZX0pKX1mdW5jdGlvbiBjKCl7dChoLHYpJiYobS5vbihpK2QsbnVsbCkub24obytkLG51bGwpLHkocCYmdGEuZXZlbnQudGFyZ2V0PT09ZiksZyh7dHlwZToiZHJhZ2VuZCJ9KSl9dmFyIGwscz10aGlzLGY9dGEuZXZlbnQudGFyZ2V0LGg9cy5wYXJlbnROb2RlLGc9ci5vZihzLGFyZ3VtZW50cykscD0wLHY9bigpLGQ9Ii5kcmFnIisobnVsbD09dj8iIjoiLSIrdiksbT10YS5zZWxlY3QoZShmKSkub24oaStkLGEpLm9uKG8rZCxjKSx5PVcoZiksTT10KGgsdik7dT8obD11LmFwcGx5KHMsYXJndW1lbnRzKSxsPVtsLngtTVswXSxsLnktTVsxXV0pOmw9WzAsMF0sZyh7dHlwZToiZHJhZ3N0YXJ0In0pfX12YXIgcj1FKG4sImRyYWciLCJkcmFnc3RhcnQiLCJkcmFnZW5kIiksdT1udWxsLGk9ZShiLHRhLm1vdXNlLHQsIm1vdXNlbW92ZSIsIm1vdXNldXAiKSxvPWUoRyx0YS50b3VjaCx5LCJ0b3VjaG1vdmUiLCJ0b3VjaGVuZCIpO3JldHVybiBuLm9yaWdpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LG4pOnV9LHRhLnJlYmluZChuLHIsIm9uIil9LHRhLnRvdWNoZXM9ZnVuY3Rpb24obix0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyJiYodD1rKCkudG91Y2hlcyksdD9yYSh0KS5tYXAoZnVuY3Rpb24odCl7dmFyIGU9SihuLHQpO3JldHVybiBlLmlkZW50aWZpZXI9dC5pZGVudGlmaWVyLGV9KTpbXX07dmFyIENhPTFlLTYsemE9Q2EqQ2EscWE9TWF0aC5QSSxMYT0yKnFhLFRhPUxhLUNhLFJhPXFhLzIsRGE9cWEvMTgwLFBhPTE4MC9xYSxVYT1NYXRoLlNRUlQyLGphPTIsRmE9NDt0YS5pbnRlcnBvbGF0ZVpvb209ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKG4pe3ZhciB0PW4qeTtpZihtKXt2YXIgZT1ydCh2KSxvPWkvKGphKmgpKihlKnV0KFVhKnQrdiktZXQodikpO3JldHVybltyK28qbCx1K28qcyxpKmUvcnQoVWEqdCt2KV19cmV0dXJuW3IrbipsLHUrbipzLGkqTWF0aC5leHAoVWEqdCldfXZhciByPW5bMF0sdT1uWzFdLGk9blsyXSxvPXRbMF0sYT10WzFdLGM9dFsyXSxsPW8tcixzPWEtdSxmPWwqbCtzKnMsaD1NYXRoLnNxcnQoZiksZz0oYypjLWkqaStGYSpmKS8oMippKmphKmgpLHA9KGMqYy1pKmktRmEqZikvKDIqYypqYSpoKSx2PU1hdGgubG9nKE1hdGguc3FydChnKmcrMSktZyksZD1NYXRoLmxvZyhNYXRoLnNxcnQocCpwKzEpLXApLG09ZC12LHk9KG18fE1hdGgubG9nKGMvaSkpL1VhO3JldHVybiBlLmR1cmF0aW9uPTFlMyp5LGV9LHRhLmJlaGF2aW9yLnpvb209ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe24ub24ocSxmKS5vbihPYSsiLnpvb20iLGcpLm9uKCJkYmxjbGljay56b29tIixwKS5vbihSLGgpfWZ1bmN0aW9uIGUobil7cmV0dXJuWyhuWzBdLWsueCkvay5rLChuWzFdLWsueSkvay5rXX1mdW5jdGlvbiByKG4pe3JldHVybltuWzBdKmsuaytrLngsblsxXSprLmsray55XX1mdW5jdGlvbiB1KG4pe2suaz1NYXRoLm1heChOWzBdLE1hdGgubWluKE5bMV0sbikpfWZ1bmN0aW9uIGkobix0KXt0PXIodCksay54Kz1uWzBdLXRbMF0say55Kz1uWzFdLXRbMV19ZnVuY3Rpb24gbyh0LGUscixvKXt0Ll9fY2hhcnRfXz17eDprLngseTprLnksazprLmt9LHUoTWF0aC5wb3coMixvKSksaShkPWUsciksdD10YS5zZWxlY3QodCksQz4wJiYodD10LnRyYW5zaXRpb24oKS5kdXJhdGlvbihDKSksdC5jYWxsKG4uZXZlbnQpfWZ1bmN0aW9uIGEoKXtiJiZiLmRvbWFpbih4LnJhbmdlKCkubWFwKGZ1bmN0aW9uKG4pe3JldHVybihuLWsueCkvay5rfSkubWFwKHguaW52ZXJ0KSksdyYmdy5kb21haW4oXy5yYW5nZSgpLm1hcChmdW5jdGlvbihuKXtyZXR1cm4obi1rLnkpL2sua30pLm1hcChfLmludmVydCkpfWZ1bmN0aW9uIGMobil7eisrfHxuKHt0eXBlOiJ6b29tc3RhcnQifSl9ZnVuY3Rpb24gbChuKXthKCksbih7dHlwZToiem9vbSIsc2NhbGU6ay5rLHRyYW5zbGF0ZTpbay54LGsueV19KX1mdW5jdGlvbiBzKG4pey0tenx8bih7dHlwZToiem9vbWVuZCJ9KSxkPW51bGx9ZnVuY3Rpb24gZigpe2Z1bmN0aW9uIG4oKXtmPTEsaSh0YS5tb3VzZSh1KSxnKSxsKGEpfWZ1bmN0aW9uIHIoKXtoLm9uKEwsbnVsbCkub24oVCxudWxsKSxwKGYmJnRhLmV2ZW50LnRhcmdldD09PW8pLHMoYSl9dmFyIHU9dGhpcyxvPXRhLmV2ZW50LnRhcmdldCxhPUQub2YodSxhcmd1bWVudHMpLGY9MCxoPXRhLnNlbGVjdCh0KHUpKS5vbihMLG4pLm9uKFQsciksZz1lKHRhLm1vdXNlKHUpKSxwPVcodSk7RGwuY2FsbCh1KSxjKGEpfWZ1bmN0aW9uIGgoKXtmdW5jdGlvbiBuKCl7dmFyIG49dGEudG91Y2hlcyhwKTtyZXR1cm4gZz1rLmssbi5mb3JFYWNoKGZ1bmN0aW9uKG4pe24uaWRlbnRpZmllciBpbiBkJiYoZFtuLmlkZW50aWZpZXJdPWUobikpfSksbn1mdW5jdGlvbiB0KCl7dmFyIHQ9dGEuZXZlbnQudGFyZ2V0O3RhLnNlbGVjdCh0KS5vbih4LHIpLm9uKGIsYSksXy5wdXNoKHQpO2Zvcih2YXIgZT10YS5ldmVudC5jaGFuZ2VkVG91Y2hlcyx1PTAsaT1lLmxlbmd0aDtpPnU7Kyt1KWRbZVt1XS5pZGVudGlmaWVyXT1udWxsO3ZhciBjPW4oKSxsPURhdGUubm93KCk7aWYoMT09PWMubGVuZ3RoKXtpZig1MDA+bC1NKXt2YXIgcz1jWzBdO28ocCxzLGRbcy5pZGVudGlmaWVyXSxNYXRoLmZsb29yKE1hdGgubG9nKGsuaykvTWF0aC5MTjIpKzEpLFMoKX1NPWx9ZWxzZSBpZihjLmxlbmd0aD4xKXt2YXIgcz1jWzBdLGY9Y1sxXSxoPXNbMF0tZlswXSxnPXNbMV0tZlsxXTttPWgqaCtnKmd9fWZ1bmN0aW9uIHIoKXt2YXIgbix0LGUscixvPXRhLnRvdWNoZXMocCk7RGwuY2FsbChwKTtmb3IodmFyIGE9MCxjPW8ubGVuZ3RoO2M+YTsrK2Escj1udWxsKWlmKGU9b1thXSxyPWRbZS5pZGVudGlmaWVyXSl7aWYodClicmVhaztuPWUsdD1yfWlmKHIpe3ZhciBzPShzPWVbMF0tblswXSkqcysocz1lWzFdLW5bMV0pKnMsZj1tJiZNYXRoLnNxcnQocy9tKTtuPVsoblswXStlWzBdKS8yLChuWzFdK2VbMV0pLzJdLHQ9Wyh0WzBdK3JbMF0pLzIsKHRbMV0rclsxXSkvMl0sdShmKmcpfU09bnVsbCxpKG4sdCksbCh2KX1mdW5jdGlvbiBhKCl7aWYodGEuZXZlbnQudG91Y2hlcy5sZW5ndGgpe2Zvcih2YXIgdD10YS5ldmVudC5jaGFuZ2VkVG91Y2hlcyxlPTAscj10Lmxlbmd0aDtyPmU7KytlKWRlbGV0ZSBkW3RbZV0uaWRlbnRpZmllcl07Zm9yKHZhciB1IGluIGQpcmV0dXJuIHZvaWQgbigpfXRhLnNlbGVjdEFsbChfKS5vbih5LG51bGwpLHcub24ocSxmKS5vbihSLGgpLEUoKSxzKHYpfXZhciBnLHA9dGhpcyx2PUQub2YocCxhcmd1bWVudHMpLGQ9e30sbT0wLHk9Ii56b29tLSIrdGEuZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcix4PSJ0b3VjaG1vdmUiK3ksYj0idG91Y2hlbmQiK3ksXz1bXSx3PXRhLnNlbGVjdChwKSxFPVcocCk7dCgpLGModiksdy5vbihxLG51bGwpLm9uKFIsdCl9ZnVuY3Rpb24gZygpe3ZhciBuPUQub2YodGhpcyxhcmd1bWVudHMpO3k/Y2xlYXJUaW1lb3V0KHkpOih2PWUoZD1tfHx0YS5tb3VzZSh0aGlzKSksRGwuY2FsbCh0aGlzKSxjKG4pKSx5PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt5PW51bGwscyhuKX0sNTApLFMoKSx1KE1hdGgucG93KDIsLjAwMipIYSgpKSprLmspLGkoZCx2KSxsKG4pfWZ1bmN0aW9uIHAoKXt2YXIgbj10YS5tb3VzZSh0aGlzKSx0PU1hdGgubG9nKGsuaykvTWF0aC5MTjI7byh0aGlzLG4sZShuKSx0YS5ldmVudC5zaGlmdEtleT9NYXRoLmNlaWwodCktMTpNYXRoLmZsb29yKHQpKzEpfXZhciB2LGQsbSx5LE0seCxiLF8sdyxrPXt4OjAseTowLGs6MX0sQT1bOTYwLDUwMF0sTj1JYSxDPTI1MCx6PTAscT0ibW91c2Vkb3duLnpvb20iLEw9Im1vdXNlbW92ZS56b29tIixUPSJtb3VzZXVwLnpvb20iLFI9InRvdWNoc3RhcnQuem9vbSIsRD1FKG4sInpvb21zdGFydCIsInpvb20iLCJ6b29tZW5kIik7cmV0dXJuIE9hfHwoT2E9Im9ud2hlZWwiaW4gdWE/KEhhPWZ1bmN0aW9uKCl7cmV0dXJuLXRhLmV2ZW50LmRlbHRhWSoodGEuZXZlbnQuZGVsdGFNb2RlPzEyMDoxKX0sIndoZWVsIik6Im9ubW91c2V3aGVlbCJpbiB1YT8oSGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuZXZlbnQud2hlZWxEZWx0YX0sIm1vdXNld2hlZWwiKTooSGE9ZnVuY3Rpb24oKXtyZXR1cm4tdGEuZXZlbnQuZGV0YWlsfSwiTW96TW91c2VQaXhlbFNjcm9sbCIpKSxuLmV2ZW50PWZ1bmN0aW9uKG4pe24uZWFjaChmdW5jdGlvbigpe3ZhciBuPUQub2YodGhpcyxhcmd1bWVudHMpLHQ9aztUbD90YS5zZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmVhY2goInN0YXJ0Lnpvb20iLGZ1bmN0aW9uKCl7az10aGlzLl9fY2hhcnRfX3x8e3g6MCx5OjAsazoxfSxjKG4pfSkudHdlZW4oInpvb206em9vbSIsZnVuY3Rpb24oKXt2YXIgZT1BWzBdLHI9QVsxXSx1PWQ/ZFswXTplLzIsaT1kP2RbMV06ci8yLG89dGEuaW50ZXJwb2xhdGVab29tKFsodS1rLngpL2suaywoaS1rLnkpL2suayxlL2sua10sWyh1LXQueCkvdC5rLChpLXQueSkvdC5rLGUvdC5rXSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciByPW8odCksYT1lL3JbMl07dGhpcy5fX2NoYXJ0X189az17eDp1LXJbMF0qYSx5OmktclsxXSphLGs6YX0sbChuKX19KS5lYWNoKCJpbnRlcnJ1cHQuem9vbSIsZnVuY3Rpb24oKXtzKG4pfSkuZWFjaCgiZW5kLnpvb20iLGZ1bmN0aW9uKCl7cyhuKX0pOih0aGlzLl9fY2hhcnRfXz1rLGMobiksbChuKSxzKG4pKX0pfSxuLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaz17eDordFswXSx5Oit0WzFdLGs6ay5rfSxhKCksbik6W2sueCxrLnldfSxuLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhrPXt4OmsueCx5OmsueSxrOit0fSxhKCksbik6ay5rfSxuLnNjYWxlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhOPW51bGw9PXQ/SWE6Wyt0WzBdLCt0WzFdXSxuKTpOfSxuLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT10JiZbK3RbMF0sK3RbMV1dLG4pOm19LG4uc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oQT10JiZbK3RbMF0sK3RbMV1dLG4pOkF9LG4uZHVyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEM9K3Qsbik6Q30sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPXQseD10LmNvcHkoKSxrPXt4OjAseTowLGs6MX0sbik6Yn0sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh3PXQsXz10LmNvcHkoKSxrPXt4OjAseTowLGs6MX0sbik6d30sdGEucmViaW5kKG4sRCwib24iKX07dmFyIEhhLE9hLElhPVswLDEvMF07dGEuY29sb3I9b3Qsb3QucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkrIiJ9LHRhLmhzbD1hdDt2YXIgWWE9YXQucHJvdG90eXBlPW5ldyBvdDtZYS5icmlnaHRlcj1mdW5jdGlvbihuKXtyZXR1cm4gbj1NYXRoLnBvdyguNyxhcmd1bWVudHMubGVuZ3RoP246MSksbmV3IGF0KHRoaXMuaCx0aGlzLnMsdGhpcy5sL24pfSxZYS5kYXJrZXI9ZnVuY3Rpb24obil7cmV0dXJuIG49TWF0aC5wb3coLjcsYXJndW1lbnRzLmxlbmd0aD9uOjEpLG5ldyBhdCh0aGlzLmgsdGhpcy5zLG4qdGhpcy5sKX0sWWEucmdiPWZ1bmN0aW9uKCl7cmV0dXJuIGN0KHRoaXMuaCx0aGlzLnMsdGhpcy5sKX0sdGEuaGNsPWx0O3ZhciBaYT1sdC5wcm90b3R5cGU9bmV3IG90O1phLmJyaWdodGVyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgbHQodGhpcy5oLHRoaXMuYyxNYXRoLm1pbigxMDAsdGhpcy5sK1ZhKihhcmd1bWVudHMubGVuZ3RoP246MSkpKX0sWmEuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgbHQodGhpcy5oLHRoaXMuYyxNYXRoLm1heCgwLHRoaXMubC1WYSooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSl9LFphLnJnYj1mdW5jdGlvbigpe3JldHVybiBzdCh0aGlzLmgsdGhpcy5jLHRoaXMubCkucmdiKCl9LHRhLmxhYj1mdDt2YXIgVmE9MTgsWGE9Ljk1MDQ3LCRhPTEsQmE9MS4wODg4MyxXYT1mdC5wcm90b3R5cGU9bmV3IG90O1dhLmJyaWdodGVyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgZnQoTWF0aC5taW4oMTAwLHRoaXMubCtWYSooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSx0aGlzLmEsdGhpcy5iKX0sV2EuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgZnQoTWF0aC5tYXgoMCx0aGlzLmwtVmEqKGFyZ3VtZW50cy5sZW5ndGg/bjoxKSksdGhpcy5hLHRoaXMuYil9LFdhLnJnYj1mdW5jdGlvbigpe3JldHVybiBodCh0aGlzLmwsdGhpcy5hLHRoaXMuYil9LHRhLnJnYj1tdDt2YXIgSmE9bXQucHJvdG90eXBlPW5ldyBvdDtKYS5icmlnaHRlcj1mdW5jdGlvbihuKXtuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKTt2YXIgdD10aGlzLnIsZT10aGlzLmcscj10aGlzLmIsdT0zMDtyZXR1cm4gdHx8ZXx8cj8odCYmdT50JiYodD11KSxlJiZ1PmUmJihlPXUpLHImJnU+ciYmKHI9dSksbmV3IG10KE1hdGgubWluKDI1NSx0L24pLE1hdGgubWluKDI1NSxlL24pLE1hdGgubWluKDI1NSxyL24pKSk6bmV3IG10KHUsdSx1KX0sSmEuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKSxuZXcgbXQobip0aGlzLnIsbip0aGlzLmcsbip0aGlzLmIpfSxKYS5oc2w9ZnVuY3Rpb24oKXtyZXR1cm4gX3QodGhpcy5yLHRoaXMuZyx0aGlzLmIpfSxKYS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiIjIit4dCh0aGlzLnIpK3h0KHRoaXMuZykreHQodGhpcy5iKX07dmFyIEdhPXRhLm1hcCh7YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fSk7R2EuZm9yRWFjaChmdW5jdGlvbihuLHQpe0dhLnNldChuLHl0KHQpKX0pLHRhLmZ1bmN0b3I9RXQsdGEueGhyPUF0KHkpLHRhLmRzdj1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobixlLGkpe2FyZ3VtZW50cy5sZW5ndGg8MyYmKGk9ZSxlPW51bGwpO3ZhciBvPU50KG4sdCxudWxsPT1lP3I6dShlKSxpKTtyZXR1cm4gby5yb3c9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/by5yZXNwb25zZShudWxsPT0oZT1uKT9yOnUobikpOmV9LG99ZnVuY3Rpb24gcihuKXtyZXR1cm4gZS5wYXJzZShuLnJlc3BvbnNlVGV4dCl9ZnVuY3Rpb24gdShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUucGFyc2UodC5yZXNwb25zZVRleHQsbil9fWZ1bmN0aW9uIGkodCl7cmV0dXJuIHQubWFwKG8pLmpvaW4obil9ZnVuY3Rpb24gbyhuKXtyZXR1cm4gYS50ZXN0KG4pPyciJytuLnJlcGxhY2UoL1wiL2csJyIiJykrJyInOm59dmFyIGE9bmV3IFJlZ0V4cCgnWyInK24rIlxuXSIpLGM9bi5jaGFyQ29kZUF0KDApO3JldHVybiBlLnBhcnNlPWZ1bmN0aW9uKG4sdCl7dmFyIHI7cmV0dXJuIGUucGFyc2VSb3dzKG4sZnVuY3Rpb24obixlKXtpZihyKXJldHVybiByKG4sZS0xKTt2YXIgdT1uZXcgRnVuY3Rpb24oImQiLCJyZXR1cm4geyIrbi5tYXAoZnVuY3Rpb24obix0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkobikrIjogZFsiK3QrIl0ifSkuam9pbigiLCIpKyJ9Iik7cj10P2Z1bmN0aW9uKG4sZSl7cmV0dXJuIHQodShuKSxlKX06dX0pfSxlLnBhcnNlUm93cz1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUoKXtpZihzPj1sKXJldHVybiBvO2lmKHUpcmV0dXJuIHU9ITEsaTt2YXIgdD1zO2lmKDM0PT09bi5jaGFyQ29kZUF0KHQpKXtmb3IodmFyIGU9dDtlKys8bDspaWYoMzQ9PT1uLmNoYXJDb2RlQXQoZSkpe2lmKDM0IT09bi5jaGFyQ29kZUF0KGUrMSkpYnJlYWs7KytlfXM9ZSsyO3ZhciByPW4uY2hhckNvZGVBdChlKzEpO3JldHVybiAxMz09PXI/KHU9ITAsMTA9PT1uLmNoYXJDb2RlQXQoZSsyKSYmKytzKToxMD09PXImJih1PSEwKSxuLnNsaWNlKHQrMSxlKS5yZXBsYWNlKC8iIi9nLCciJyl9Zm9yKDtsPnM7KXt2YXIgcj1uLmNoYXJDb2RlQXQocysrKSxhPTE7aWYoMTA9PT1yKXU9ITA7ZWxzZSBpZigxMz09PXIpdT0hMCwxMD09PW4uY2hhckNvZGVBdChzKSYmKCsrcywrK2EpO2Vsc2UgaWYociE9PWMpY29udGludWU7cmV0dXJuIG4uc2xpY2UodCxzLWEpfXJldHVybiBuLnNsaWNlKHQpfWZvcih2YXIgcix1LGk9e30sbz17fSxhPVtdLGw9bi5sZW5ndGgscz0wLGY9MDsocj1lKCkpIT09bzspe2Zvcih2YXIgaD1bXTtyIT09aSYmciE9PW87KWgucHVzaChyKSxyPWUoKTt0JiZudWxsPT0oaD10KGgsZisrKSl8fGEucHVzaChoKX1yZXR1cm4gYX0sZS5mb3JtYXQ9ZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheSh0WzBdKSlyZXR1cm4gZS5mb3JtYXRSb3dzKHQpO3ZhciByPW5ldyBtLHU9W107cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihuKXtmb3IodmFyIHQgaW4gbilyLmhhcyh0KXx8dS5wdXNoKHIuYWRkKHQpKX0pLFt1Lm1hcChvKS5qb2luKG4pXS5jb25jYXQodC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHUubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBvKHRbbl0pfSkuam9pbihuKX0pKS5qb2luKCJcbiIpfSxlLmZvcm1hdFJvd3M9ZnVuY3Rpb24obil7cmV0dXJuIG4ubWFwKGkpLmpvaW4oIlxuIil9LGV9LHRhLmNzdj10YS5kc3YoIiwiLCJ0ZXh0L2NzdiIpLHRhLnRzdj10YS5kc3YoIgkiLCJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzIik7dmFyIEthLFFhLG5jLHRjLGVjLHJjPXRoaXNbeCh0aGlzLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiKV18fGZ1bmN0aW9uKG4pe3NldFRpbWVvdXQobiwxNyl9O3RhLnRpbWVyPWZ1bmN0aW9uKG4sdCxlKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoOzI+ciYmKHQ9MCksMz5yJiYoZT1EYXRlLm5vdygpKTt2YXIgdT1lK3QsaT17YzpuLHQ6dSxmOiExLG46bnVsbH07UWE/UWEubj1pOkthPWksUWE9aSxuY3x8KHRjPWNsZWFyVGltZW91dCh0YyksbmM9MSxyYyhxdCkpfSx0YS50aW1lci5mbHVzaD1mdW5jdGlvbigpe0x0KCksVHQoKX0sdGEucm91bmQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gdD9NYXRoLnJvdW5kKG4qKHQ9TWF0aC5wb3coMTAsdCkpKS90Ok1hdGgucm91bmQobil9O3ZhciB1Yz1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIlx4YjUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXS5tYXAoRHQpO3RhLmZvcm1hdFByZWZpeD1mdW5jdGlvbihuLHQpe3ZhciBlPTA7cmV0dXJuIG4mJigwPm4mJihuKj0tMSksdCYmKG49dGEucm91bmQobixSdChuLHQpKSksZT0xK01hdGguZmxvb3IoMWUtMTIrTWF0aC5sb2cobikvTWF0aC5MTjEwKSxlPU1hdGgubWF4KC0yNCxNYXRoLm1pbigyNCwzKk1hdGguZmxvb3IoKGUtMSkvMykpKSksdWNbOCtlLzNdfTt2YXIgaWM9Lyg/OihbXntdKT8oWzw+PV5dKSk/KFsrXC0gXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuLT9cZCspPyhbYS16JV0pPy9pLG9jPXRhLm1hcCh7YjpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZygyKX0sYzpmdW5jdGlvbihuKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShuKX0sbzpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZyg4KX0seDpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZygxNil9LFg6ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LGc6ZnVuY3Rpb24obix0KXtyZXR1cm4gbi50b1ByZWNpc2lvbih0KX0sZTpmdW5jdGlvbihuLHQpe3JldHVybiBuLnRvRXhwb25lbnRpYWwodCl9LGY6ZnVuY3Rpb24obix0KXtyZXR1cm4gbi50b0ZpeGVkKHQpfSxyOmZ1bmN0aW9uKG4sdCl7cmV0dXJuKG49dGEucm91bmQobixSdChuLHQpKSkudG9GaXhlZChNYXRoLm1heCgwLE1hdGgubWluKDIwLFJ0KG4qKDErMWUtMTUpLHQpKSkpfX0pLGFjPXRhLnRpbWU9e30sY2M9RGF0ZTtqdC5wcm90b3R5cGU9e2dldERhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ0RhdGUoKX0sZ2V0RGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENEYXkoKX0sZ2V0RnVsbFllYXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ0Z1bGxZZWFyKCl9LGdldEhvdXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENIb3VycygpfSxnZXRNaWxsaXNlY29uZHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ01pbGxpc2Vjb25kcygpfSxnZXRNaW51dGVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENNaW51dGVzKCl9LGdldE1vbnRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENNb250aCgpfSxnZXRTZWNvbmRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENTZWNvbmRzKCl9LGdldFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFRpbWUoKX0sZ2V0VGltZXpvbmVPZmZzZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8udmFsdWVPZigpfSxzZXREYXRlOmZ1bmN0aW9uKCl7bGMuc2V0VVRDRGF0ZS5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0RGF5OmZ1bmN0aW9uKCl7bGMuc2V0VVRDRGF5LmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRGdWxsWWVhcjpmdW5jdGlvbigpe2xjLnNldFVUQ0Z1bGxZZWFyLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRIb3VyczpmdW5jdGlvbigpe2xjLnNldFVUQ0hvdXJzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRNaWxsaXNlY29uZHM6ZnVuY3Rpb24oKXtsYy5zZXRVVENNaWxsaXNlY29uZHMuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldE1pbnV0ZXM6ZnVuY3Rpb24oKXtsYy5zZXRVVENNaW51dGVzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRNb250aDpmdW5jdGlvbigpe2xjLnNldFVUQ01vbnRoLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRTZWNvbmRzOmZ1bmN0aW9uKCl7bGMuc2V0VVRDU2Vjb25kcy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0VGltZTpmdW5jdGlvbigpe2xjLnNldFRpbWUuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9fTt2YXIgbGM9RGF0ZS5wcm90b3R5cGU7YWMueWVhcj1GdChmdW5jdGlvbihuKXtyZXR1cm4gbj1hYy5kYXkobiksbi5zZXRNb250aCgwLDEpLG59LGZ1bmN0aW9uKG4sdCl7bi5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCkrdCl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldEZ1bGxZZWFyKCl9KSxhYy55ZWFycz1hYy55ZWFyLnJhbmdlLGFjLnllYXJzLnV0Yz1hYy55ZWFyLnV0Yy5yYW5nZSxhYy5kYXk9RnQoZnVuY3Rpb24obil7dmFyIHQ9bmV3IGNjKDJlMywwKTtyZXR1cm4gdC5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCksbi5nZXRNb250aCgpLG4uZ2V0RGF0ZSgpKSx0fSxmdW5jdGlvbihuLHQpe24uc2V0RGF0ZShuLmdldERhdGUoKSt0KX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0RGF0ZSgpLTF9KSxhYy5kYXlzPWFjLmRheS5yYW5nZSxhYy5kYXlzLnV0Yz1hYy5kYXkudXRjLnJhbmdlLGFjLmRheU9mWWVhcj1mdW5jdGlvbihuKXt2YXIgdD1hYy55ZWFyKG4pO3JldHVybiBNYXRoLmZsb29yKChuLXQtNmU0KihuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSkvODY0ZTUpfSxbInN1bmRheSIsIm1vbmRheSIsInR1ZXNkYXkiLCJ3ZWRuZXNkYXkiLCJ0aHVyc2RheSIsImZyaWRheSIsInNhdHVyZGF5Il0uZm9yRWFjaChmdW5jdGlvbihuLHQpe3Q9Ny10O3ZhciBlPWFjW25dPUZ0KGZ1bmN0aW9uKG4pe3JldHVybihuPWFjLmRheShuKSkuc2V0RGF0ZShuLmdldERhdGUoKS0obi5nZXREYXkoKSt0KSU3KSxufSxmdW5jdGlvbihuLHQpe24uc2V0RGF0ZShuLmdldERhdGUoKSs3Kk1hdGguZmxvb3IodCkpfSxmdW5jdGlvbihuKXt2YXIgZT1hYy55ZWFyKG4pLmdldERheSgpO3JldHVybiBNYXRoLmZsb29yKChhYy5kYXlPZlllYXIobikrKGUrdCklNykvNyktKGUhPT10KX0pO2FjW24rInMiXT1lLnJhbmdlLGFjW24rInMiXS51dGM9ZS51dGMucmFuZ2UsYWNbbisiT2ZZZWFyIl09ZnVuY3Rpb24obil7dmFyIGU9YWMueWVhcihuKS5nZXREYXkoKTtyZXR1cm4gTWF0aC5mbG9vcigoYWMuZGF5T2ZZZWFyKG4pKyhlK3QpJTcpLzcpfX0pLGFjLndlZWs9YWMuc3VuZGF5LGFjLndlZWtzPWFjLnN1bmRheS5yYW5nZSxhYy53ZWVrcy51dGM9YWMuc3VuZGF5LnV0Yy5yYW5nZSxhYy53ZWVrT2ZZZWFyPWFjLnN1bmRheU9mWWVhcjt2YXIgc2M9eyItIjoiIixfOiIgIiwwOiIwIn0sZmM9L15ccypcZCsvLGhjPS9eJS87dGEubG9jYWxlPWZ1bmN0aW9uKG4pe3JldHVybntudW1iZXJGb3JtYXQ6UHQobiksdGltZUZvcm1hdDpPdChuKX19O3ZhciBnYz10YS5sb2NhbGUoe2RlY2ltYWw6Ii4iLHRob3VzYW5kczoiLCIsZ3JvdXBpbmc6WzNdLGN1cnJlbmN5OlsiJCIsIiJdLGRhdGVUaW1lOiIlYSAlYiAlZSAlWCAlWSIsZGF0ZToiJW0vJWQvJVkiLHRpbWU6IiVIOiVNOiVTIixwZXJpb2RzOlsiQU0iLCJQTSJdLGRheXM6WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLHNob3J0RGF5czpbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLG1vbnRoczpbIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sc2hvcnRNb250aHM6WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXX0pO3RhLmZvcm1hdD1nYy5udW1iZXJGb3JtYXQsdGEuZ2VvPXt9LGNlLnByb3RvdHlwZT17czowLHQ6MCxhZGQ6ZnVuY3Rpb24obil7bGUobix0aGlzLnQscGMpLGxlKHBjLnMsdGhpcy5zLHRoaXMpLHRoaXMucz90aGlzLnQrPXBjLnQ6dGhpcy5zPXBjLnQNCn0scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnM9dGhpcy50PTB9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zfX07dmFyIHBjPW5ldyBjZTt0YS5nZW8uc3RyZWFtPWZ1bmN0aW9uKG4sdCl7biYmdmMuaGFzT3duUHJvcGVydHkobi50eXBlKT92Y1tuLnR5cGVdKG4sdCk6c2Uobix0KX07dmFyIHZjPXtGZWF0dXJlOmZ1bmN0aW9uKG4sdCl7c2Uobi5nZW9tZXRyeSx0KX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5mZWF0dXJlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KXNlKGVbcl0uZ2VvbWV0cnksdCl9fSxkYz17U3BoZXJlOmZ1bmN0aW9uKG4sdCl7dC5zcGhlcmUoKX0sUG9pbnQ6ZnVuY3Rpb24obix0KXtuPW4uY29vcmRpbmF0ZXMsdC5wb2ludChuWzBdLG5bMV0sblsyXSl9LE11bHRpUG9pbnQ6ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5jb29yZGluYXRlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KW49ZVtyXSx0LnBvaW50KG5bMF0sblsxXSxuWzJdKX0sTGluZVN0cmluZzpmdW5jdGlvbihuLHQpe2ZlKG4uY29vcmRpbmF0ZXMsdCwwKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPW4uY29vcmRpbmF0ZXMscj0tMSx1PWUubGVuZ3RoOysrcjx1OylmZShlW3JdLHQsMCl9LFBvbHlnb246ZnVuY3Rpb24obix0KXtoZShuLmNvb3JkaW5hdGVzLHQpfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5jb29yZGluYXRlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KWhlKGVbcl0sdCl9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbihuLHQpe2Zvcih2YXIgZT1uLmdlb21ldHJpZXMscj0tMSx1PWUubGVuZ3RoOysrcjx1OylzZShlW3JdLHQpfX07dGEuZ2VvLmFyZWE9ZnVuY3Rpb24obil7cmV0dXJuIG1jPTAsdGEuZ2VvLnN0cmVhbShuLE1jKSxtY307dmFyIG1jLHljPW5ldyBjZSxNYz17c3BoZXJlOmZ1bmN0aW9uKCl7bWMrPTQqcWF9LHBvaW50OmIsbGluZVN0YXJ0OmIsbGluZUVuZDpiLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3ljLnJlc2V0KCksTWMubGluZVN0YXJ0PWdlfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIG49Mip5YzttYys9MD5uPzQqcWErbjpuLE1jLmxpbmVTdGFydD1NYy5saW5lRW5kPU1jLnBvaW50PWJ9fTt0YS5nZW8uYm91bmRzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHQpe00ucHVzaCh4PVtzPW4saD1uXSksZj50JiYoZj10KSx0PmcmJihnPXQpfWZ1bmN0aW9uIHQodCxlKXt2YXIgcj1wZShbdCpEYSxlKkRhXSk7aWYobSl7dmFyIHU9ZGUobSxyKSxpPVt1WzFdLC11WzBdLDBdLG89ZGUoaSx1KTtNZShvKSxvPXhlKG8pO3ZhciBjPXQtcCxsPWM+MD8xOi0xLHY9b1swXSpQYSpsLGQ9Z2EoYyk+MTgwO2lmKGReKHY+bCpwJiZsKnQ+dikpe3ZhciB5PW9bMV0qUGE7eT5nJiYoZz15KX1lbHNlIGlmKHY9KHYrMzYwKSUzNjAtMTgwLGReKHY+bCpwJiZsKnQ+dikpe3ZhciB5PS1vWzFdKlBhO2Y+eSYmKGY9eSl9ZWxzZSBmPmUmJihmPWUpLGU+ZyYmKGc9ZSk7ZD9wPnQ/YShzLHQpPmEocyxoKSYmKGg9dCk6YSh0LGgpPmEocyxoKSYmKHM9dCk6aD49cz8ocz50JiYocz10KSx0PmgmJihoPXQpKTp0PnA/YShzLHQpPmEocyxoKSYmKGg9dCk6YSh0LGgpPmEocyxoKSYmKHM9dCl9ZWxzZSBuKHQsZSk7bT1yLHA9dH1mdW5jdGlvbiBlKCl7Yi5wb2ludD10fWZ1bmN0aW9uIHIoKXt4WzBdPXMseFsxXT1oLGIucG9pbnQ9bixtPW51bGx9ZnVuY3Rpb24gdShuLGUpe2lmKG0pe3ZhciByPW4tcDt5Kz1nYShyKT4xODA/cisocj4wPzM2MDotMzYwKTpyfWVsc2Ugdj1uLGQ9ZTtNYy5wb2ludChuLGUpLHQobixlKX1mdW5jdGlvbiBpKCl7TWMubGluZVN0YXJ0KCl9ZnVuY3Rpb24gbygpe3UodixkKSxNYy5saW5lRW5kKCksZ2EoeSk+Q2EmJihzPS0oaD0xODApKSx4WzBdPXMseFsxXT1oLG09bnVsbH1mdW5jdGlvbiBhKG4sdCl7cmV0dXJuKHQtPW4pPDA/dCszNjA6dH1mdW5jdGlvbiBjKG4sdCl7cmV0dXJuIG5bMF0tdFswXX1mdW5jdGlvbiBsKG4sdCl7cmV0dXJuIHRbMF08PXRbMV0/dFswXTw9biYmbjw9dFsxXTpuPHRbMF18fHRbMV08bn12YXIgcyxmLGgsZyxwLHYsZCxtLHksTSx4LGI9e3BvaW50Om4sbGluZVN0YXJ0OmUsbGluZUVuZDpyLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2IucG9pbnQ9dSxiLmxpbmVTdGFydD1pLGIubGluZUVuZD1vLHk9MCxNYy5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe01jLnBvbHlnb25FbmQoKSxiLnBvaW50PW4sYi5saW5lU3RhcnQ9ZSxiLmxpbmVFbmQ9ciwwPnljPyhzPS0oaD0xODApLGY9LShnPTkwKSk6eT5DYT9nPTkwOi1DYT55JiYoZj0tOTApLHhbMF09cyx4WzFdPWh9fTtyZXR1cm4gZnVuY3Rpb24obil7Zz1oPS0ocz1mPTEvMCksTT1bXSx0YS5nZW8uc3RyZWFtKG4sYik7dmFyIHQ9TS5sZW5ndGg7aWYodCl7TS5zb3J0KGMpO2Zvcih2YXIgZSxyPTEsdT1NWzBdLGk9W3VdO3Q+cjsrK3IpZT1NW3JdLGwoZVswXSx1KXx8bChlWzFdLHUpPyhhKHVbMF0sZVsxXSk+YSh1WzBdLHVbMV0pJiYodVsxXT1lWzFdKSxhKGVbMF0sdVsxXSk+YSh1WzBdLHVbMV0pJiYodVswXT1lWzBdKSk6aS5wdXNoKHU9ZSk7Zm9yKHZhciBvLGUscD0tMS8wLHQ9aS5sZW5ndGgtMSxyPTAsdT1pW3RdO3Q+PXI7dT1lLCsrcillPWlbcl0sKG89YSh1WzFdLGVbMF0pKT5wJiYocD1vLHM9ZVswXSxoPXVbMV0pfXJldHVybiBNPXg9bnVsbCwxLzA9PT1zfHwxLzA9PT1mP1tbMC8wLDAvMF0sWzAvMCwwLzBdXTpbW3MsZl0sW2gsZ11dfX0oKSx0YS5nZW8uY2VudHJvaWQ9ZnVuY3Rpb24obil7eGM9YmM9X2M9d2M9U2M9a2M9RWM9QWM9TmM9Q2M9emM9MCx0YS5nZW8uc3RyZWFtKG4scWMpO3ZhciB0PU5jLGU9Q2Mscj16Yyx1PXQqdCtlKmUrcipyO3JldHVybiB6YT51JiYodD1rYyxlPUVjLHI9QWMsQ2E+YmMmJih0PV9jLGU9d2Mscj1TYyksdT10KnQrZSplK3Iqcix6YT51KT9bMC8wLDAvMF06W01hdGguYXRhbjIoZSx0KSpQYSx0dChyL01hdGguc3FydCh1KSkqUGFdfTt2YXIgeGMsYmMsX2Msd2MsU2Msa2MsRWMsQWMsTmMsQ2MsemMscWM9e3NwaGVyZTpiLHBvaW50Ol9lLGxpbmVTdGFydDpTZSxsaW5lRW5kOmtlLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3FjLmxpbmVTdGFydD1FZX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3FjLmxpbmVTdGFydD1TZX19LExjPUxlKE5lLFBlLGplLFstcWEsLXFhLzJdKSxUYz0xZTk7dGEuZ2VvLmNsaXBFeHRlbnQ9ZnVuY3Rpb24oKXt2YXIgbix0LGUscix1LGksbz17c3RyZWFtOmZ1bmN0aW9uKG4pe3JldHVybiB1JiYodS52YWxpZD0hMSksdT1pKG4pLHUudmFsaWQ9ITAsdX0sZXh0ZW50OmZ1bmN0aW9uKGEpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPUllKG49K2FbMF1bMF0sdD0rYVswXVsxXSxlPSthWzFdWzBdLHI9K2FbMV1bMV0pLHUmJih1LnZhbGlkPSExLHU9bnVsbCksbyk6W1tuLHRdLFtlLHJdXX19O3JldHVybiBvLmV4dGVudChbWzAsMF0sWzk2MCw1MDBdXSl9LCh0YS5nZW8uY29uaWNFcXVhbEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gWWUoWmUpfSkucmF3PVplLHRhLmdlby5hbGJlcnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFs5NiwwXSkuY2VudGVyKFstLjYsMzguN10pLnBhcmFsbGVscyhbMjkuNSw0NS41XSkuc2NhbGUoMTA3MCl9LHRhLmdlby5hbGJlcnNVc2E9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe3ZhciBpPW5bMF0sbz1uWzFdO3JldHVybiB0PW51bGwsZShpLG8pLHR8fChyKGksbyksdCl8fHUoaSxvKSx0fXZhciB0LGUscix1LGk9dGEuZ2VvLmFsYmVycygpLG89dGEuZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFsxNTQsMF0pLmNlbnRlcihbLTIsNTguNV0pLnBhcmFsbGVscyhbNTUsNjVdKSxhPXRhLmdlby5jb25pY0VxdWFsQXJlYSgpLnJvdGF0ZShbMTU3LDBdKS5jZW50ZXIoWy0zLDE5LjldKS5wYXJhbGxlbHMoWzgsMThdKSxjPXtwb2ludDpmdW5jdGlvbihuLGUpe3Q9W24sZV19fTtyZXR1cm4gbi5pbnZlcnQ9ZnVuY3Rpb24obil7dmFyIHQ9aS5zY2FsZSgpLGU9aS50cmFuc2xhdGUoKSxyPShuWzBdLWVbMF0pL3QsdT0oblsxXS1lWzFdKS90O3JldHVybih1Pj0uMTImJi4yMzQ+dSYmcj49LS40MjUmJi0uMjE0PnI/bzp1Pj0uMTY2JiYuMjM0PnUmJnI+PS0uMjE0JiYtLjExNT5yP2E6aSkuaW52ZXJ0KG4pfSxuLnN0cmVhbT1mdW5jdGlvbihuKXt2YXIgdD1pLnN0cmVhbShuKSxlPW8uc3RyZWFtKG4pLHI9YS5zdHJlYW0obik7cmV0dXJue3BvaW50OmZ1bmN0aW9uKG4sdSl7dC5wb2ludChuLHUpLGUucG9pbnQobix1KSxyLnBvaW50KG4sdSl9LHNwaGVyZTpmdW5jdGlvbigpe3Quc3BoZXJlKCksZS5zcGhlcmUoKSxyLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0LmxpbmVTdGFydCgpLGUubGluZVN0YXJ0KCksci5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpLGUubGluZUVuZCgpLHIubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0LnBvbHlnb25TdGFydCgpLGUucG9seWdvblN0YXJ0KCksci5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3QucG9seWdvbkVuZCgpLGUucG9seWdvbkVuZCgpLHIucG9seWdvbkVuZCgpfX19LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpLnByZWNpc2lvbih0KSxvLnByZWNpc2lvbih0KSxhLnByZWNpc2lvbih0KSxuKTppLnByZWNpc2lvbigpfSxuLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpLnNjYWxlKHQpLG8uc2NhbGUoLjM1KnQpLGEuc2NhbGUodCksbi50cmFuc2xhdGUoaS50cmFuc2xhdGUoKSkpOmkuc2NhbGUoKX0sbi50cmFuc2xhdGU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGkudHJhbnNsYXRlKCk7dmFyIGw9aS5zY2FsZSgpLHM9K3RbMF0sZj0rdFsxXTtyZXR1cm4gZT1pLnRyYW5zbGF0ZSh0KS5jbGlwRXh0ZW50KFtbcy0uNDU1KmwsZi0uMjM4KmxdLFtzKy40NTUqbCxmKy4yMzgqbF1dKS5zdHJlYW0oYykucG9pbnQscj1vLnRyYW5zbGF0ZShbcy0uMzA3KmwsZisuMjAxKmxdKS5jbGlwRXh0ZW50KFtbcy0uNDI1KmwrQ2EsZisuMTIqbCtDYV0sW3MtLjIxNCpsLUNhLGYrLjIzNCpsLUNhXV0pLnN0cmVhbShjKS5wb2ludCx1PWEudHJhbnNsYXRlKFtzLS4yMDUqbCxmKy4yMTIqbF0pLmNsaXBFeHRlbnQoW1tzLS4yMTQqbCtDYSxmKy4xNjYqbCtDYV0sW3MtLjExNSpsLUNhLGYrLjIzNCpsLUNhXV0pLnN0cmVhbShjKS5wb2ludCxufSxuLnNjYWxlKDEwNzApfTt2YXIgUmMsRGMsUGMsVWMsamMsRmMsSGM9e3BvaW50OmIsbGluZVN0YXJ0OmIsbGluZUVuZDpiLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe0RjPTAsSGMubGluZVN0YXJ0PVZlfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7SGMubGluZVN0YXJ0PUhjLmxpbmVFbmQ9SGMucG9pbnQ9YixSYys9Z2EoRGMvMil9fSxPYz17cG9pbnQ6WGUsbGluZVN0YXJ0OmIsbGluZUVuZDpiLHBvbHlnb25TdGFydDpiLHBvbHlnb25FbmQ6Yn0sSWM9e3BvaW50OldlLGxpbmVTdGFydDpKZSxsaW5lRW5kOkdlLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe0ljLmxpbmVTdGFydD1LZX0scG9seWdvbkVuZDpmdW5jdGlvbigpe0ljLnBvaW50PVdlLEljLmxpbmVTdGFydD1KZSxJYy5saW5lRW5kPUdlfX07dGEuZ2VvLnBhdGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe3JldHVybiBuJiYoImZ1bmN0aW9uIj09dHlwZW9mIGEmJmkucG9pbnRSYWRpdXMoK2EuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxvJiZvLnZhbGlkfHwobz11KGkpKSx0YS5nZW8uc3RyZWFtKG4sbykpLGkucmVzdWx0KCl9ZnVuY3Rpb24gdCgpe3JldHVybiBvPW51bGwsbn12YXIgZSxyLHUsaSxvLGE9NC41O3JldHVybiBuLmFyZWE9ZnVuY3Rpb24obil7cmV0dXJuIFJjPTAsdGEuZ2VvLnN0cmVhbShuLHUoSGMpKSxSY30sbi5jZW50cm9pZD1mdW5jdGlvbihuKXtyZXR1cm4gX2M9d2M9U2M9a2M9RWM9QWM9TmM9Q2M9emM9MCx0YS5nZW8uc3RyZWFtKG4sdShJYykpLHpjP1tOYy96YyxDYy96Y106QWM/W2tjL0FjLEVjL0FjXTpTYz9bX2MvU2Msd2MvU2NdOlswLzAsMC8wXX0sbi5ib3VuZHM9ZnVuY3Rpb24obil7cmV0dXJuIGpjPUZjPS0oUGM9VWM9MS8wKSx0YS5nZW8uc3RyZWFtKG4sdShPYykpLFtbUGMsVWNdLFtqYyxGY11dfSxuLnByb2plY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9KGU9bik/bi5zdHJlYW18fHRyKG4pOnksdCgpKTplfSxuLmNvbnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09KHI9bik/bmV3ICRlOm5ldyBRZShuKSwiZnVuY3Rpb24iIT10eXBlb2YgYSYmaS5wb2ludFJhZGl1cyhhKSx0KCkpOnJ9LG4ucG9pbnRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDooaS5wb2ludFJhZGl1cygrdCksK3QpLG4pOmF9LG4ucHJvamVjdGlvbih0YS5nZW8uYWxiZXJzVXNhKCkpLmNvbnRleHQobnVsbCl9LHRhLmdlby50cmFuc2Zvcm09ZnVuY3Rpb24obil7cmV0dXJue3N0cmVhbTpmdW5jdGlvbih0KXt2YXIgZT1uZXcgZXIodCk7Zm9yKHZhciByIGluIG4pZVtyXT1uW3JdO3JldHVybiBlfX19LGVyLnByb3RvdHlwZT17cG9pbnQ6ZnVuY3Rpb24obix0KXt0aGlzLnN0cmVhbS5wb2ludChuLHQpfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX0sdGEuZ2VvLnByb2plY3Rpb249dXIsdGEuZ2VvLnByb2plY3Rpb25NdXRhdG9yPWlyLCh0YS5nZW8uZXF1aXJlY3Rhbmd1bGFyPWZ1bmN0aW9uKCl7cmV0dXJuIHVyKGFyKX0pLnJhdz1hci5pbnZlcnQ9YXIsdGEuZ2VvLnJvdGF0aW9uPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQodCl7cmV0dXJuIHQ9bih0WzBdKkRhLHRbMV0qRGEpLHRbMF0qPVBhLHRbMV0qPVBhLHR9cmV0dXJuIG49bHIoblswXSUzNjAqRGEsblsxXSpEYSxuLmxlbmd0aD4yP25bMl0qRGE6MCksdC5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bi5pbnZlcnQodFswXSpEYSx0WzFdKkRhKSx0WzBdKj1QYSx0WzFdKj1QYSx0fSx0fSxjci5pbnZlcnQ9YXIsdGEuZ2VvLmNpcmNsZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpyLHQ9bHIoLW5bMF0qRGEsLW5bMV0qRGEsMCkuaW52ZXJ0LHU9W107cmV0dXJuIGUobnVsbCxudWxsLDEse3BvaW50OmZ1bmN0aW9uKG4sZSl7dS5wdXNoKG49dChuLGUpKSxuWzBdKj1QYSxuWzFdKj1QYX19KSx7dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W3VdfX12YXIgdCxlLHI9WzAsMF0sdT02O3JldHVybiBuLm9yaWdpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG4uYW5nbGU9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9Z3IoKHQ9K3IpKkRhLHUqRGEpLG4pOnR9LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWdyKHQqRGEsKHU9K3IpKkRhKSxuKTp1fSxuLmFuZ2xlKDkwKX0sdGEuZ2VvLmRpc3RhbmNlPWZ1bmN0aW9uKG4sdCl7dmFyIGUscj0odFswXS1uWzBdKSpEYSx1PW5bMV0qRGEsaT10WzFdKkRhLG89TWF0aC5zaW4ociksYT1NYXRoLmNvcyhyKSxjPU1hdGguc2luKHUpLGw9TWF0aC5jb3ModSkscz1NYXRoLnNpbihpKSxmPU1hdGguY29zKGkpO3JldHVybiBNYXRoLmF0YW4yKE1hdGguc3FydCgoZT1mKm8pKmUrKGU9bCpzLWMqZiphKSplKSxjKnMrbCpmKmEpfSx0YS5nZW8uZ3JhdGljdWxlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe3JldHVybnt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnQoKX19ZnVuY3Rpb24gdCgpe3JldHVybiB0YS5yYW5nZShNYXRoLmNlaWwoaS9kKSpkLHUsZCkubWFwKGgpLmNvbmNhdCh0YS5yYW5nZShNYXRoLmNlaWwobC9tKSptLGMsbSkubWFwKGcpKS5jb25jYXQodGEucmFuZ2UoTWF0aC5jZWlsKHIvcCkqcCxlLHApLmZpbHRlcihmdW5jdGlvbihuKXtyZXR1cm4gZ2EobiVkKT5DYX0pLm1hcChzKSkuY29uY2F0KHRhLnJhbmdlKE1hdGguY2VpbChhL3YpKnYsbyx2KS5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIGdhKG4lbSk+Q2F9KS5tYXAoZikpfXZhciBlLHIsdSxpLG8sYSxjLGwscyxmLGgsZyxwPTEwLHY9cCxkPTkwLG09MzYwLHk9Mi41O3JldHVybiBuLmxpbmVzPWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJue3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOm59fSl9LG4ub3V0bGluZT1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbaChpKS5jb25jYXQoZyhjKS5zbGljZSgxKSxoKHUpLnJldmVyc2UoKS5zbGljZSgxKSxnKGwpLnJldmVyc2UoKS5zbGljZSgxKSldfX0sbi5leHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bi5tYWpvckV4dGVudCh0KS5taW5vckV4dGVudCh0KTpuLm1pbm9yRXh0ZW50KCl9LG4ubWFqb3JFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3RbMF1bMF0sdT0rdFsxXVswXSxsPSt0WzBdWzFdLGM9K3RbMV1bMV0saT51JiYodD1pLGk9dSx1PXQpLGw+YyYmKHQ9bCxsPWMsYz10KSxuLnByZWNpc2lvbih5KSk6W1tpLGxdLFt1LGNdXX0sbi5taW5vckV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdFswXVswXSxlPSt0WzFdWzBdLGE9K3RbMF1bMV0sbz0rdFsxXVsxXSxyPmUmJih0PXIscj1lLGU9dCksYT5vJiYodD1hLGE9byxvPXQpLG4ucHJlY2lzaW9uKHkpKTpbW3IsYV0sW2Usb11dfSxuLnN0ZXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bi5tYWpvclN0ZXAodCkubWlub3JTdGVwKHQpOm4ubWlub3JTdGVwKCl9LG4ubWFqb3JTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPSt0WzBdLG09K3RbMV0sbik6W2QsbV19LG4ubWlub3JTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPSt0WzBdLHY9K3RbMV0sbik6W3Asdl19LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PSt0LHM9dnIoYSxvLDkwKSxmPWRyKHIsZSx5KSxoPXZyKGwsYyw5MCksZz1kcihpLHUseSksbik6eX0sbi5tYWpvckV4dGVudChbWy0xODAsLTkwK0NhXSxbMTgwLDkwLUNhXV0pLm1pbm9yRXh0ZW50KFtbLTE4MCwtODAtQ2FdLFsxODAsODArQ2FdXSl9LHRhLmdlby5ncmVhdEFyYz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXtyZXR1cm57dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6W3R8fHIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGV8fHUuYXBwbHkodGhpcyxhcmd1bWVudHMpXX19dmFyIHQsZSxyPW1yLHU9eXI7cmV0dXJuIG4uZGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuZ2VvLmRpc3RhbmNlKHR8fHIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGV8fHUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sbi5zb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ZSx0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP251bGw6ZSxuKTpyfSxuLnRhcmdldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/bnVsbDp0LG4pOnV9LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bjowfSxufSx0YS5nZW8uaW50ZXJwb2xhdGU9ZnVuY3Rpb24obix0KXtyZXR1cm4gTXIoblswXSpEYSxuWzFdKkRhLHRbMF0qRGEsdFsxXSpEYSl9LHRhLmdlby5sZW5ndGg9ZnVuY3Rpb24obil7cmV0dXJuIFljPTAsdGEuZ2VvLnN0cmVhbShuLFpjKSxZY307dmFyIFljLFpjPXtzcGhlcmU6Yixwb2ludDpiLGxpbmVTdGFydDp4cixsaW5lRW5kOmIscG9seWdvblN0YXJ0OmIscG9seWdvbkVuZDpifSxWYz1icihmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5zcXJ0KDIvKDErbikpfSxmdW5jdGlvbihuKXtyZXR1cm4gMipNYXRoLmFzaW4obi8yKX0pOyh0YS5nZW8uYXppbXV0aGFsRXF1YWxBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIHVyKFZjKX0pLnJhdz1WYzt2YXIgWGM9YnIoZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5hY29zKG4pO3JldHVybiB0JiZ0L01hdGguc2luKHQpfSx5KTsodGEuZ2VvLmF6aW11dGhhbEVxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIHVyKFhjKX0pLnJhdz1YYywodGEuZ2VvLmNvbmljQ29uZm9ybWFsPWZ1bmN0aW9uKCl7cmV0dXJuIFllKF9yKX0pLnJhdz1fciwodGEuZ2VvLmNvbmljRXF1aWRpc3RhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gWWUod3IpfSkucmF3PXdyO3ZhciAkYz1icihmdW5jdGlvbihuKXtyZXR1cm4gMS9ufSxNYXRoLmF0YW4pOyh0YS5nZW8uZ25vbW9uaWM9ZnVuY3Rpb24oKXtyZXR1cm4gdXIoJGMpfSkucmF3PSRjLFNyLmludmVydD1mdW5jdGlvbihuLHQpe3JldHVybltuLDIqTWF0aC5hdGFuKE1hdGguZXhwKHQpKS1SYV19LCh0YS5nZW8ubWVyY2F0b3I9ZnVuY3Rpb24oKXtyZXR1cm4ga3IoU3IpfSkucmF3PVNyO3ZhciBCYz1icihmdW5jdGlvbigpe3JldHVybiAxfSxNYXRoLmFzaW4pOyh0YS5nZW8ub3J0aG9ncmFwaGljPWZ1bmN0aW9uKCl7cmV0dXJuIHVyKEJjKX0pLnJhdz1CYzt2YXIgV2M9YnIoZnVuY3Rpb24obil7cmV0dXJuIDEvKDErbil9LGZ1bmN0aW9uKG4pe3JldHVybiAyKk1hdGguYXRhbihuKX0pOyh0YS5nZW8uc3RlcmVvZ3JhcGhpYz1mdW5jdGlvbigpe3JldHVybiB1cihXYyl9KS5yYXc9V2MsRXIuaW52ZXJ0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuWy10LDIqTWF0aC5hdGFuKE1hdGguZXhwKG4pKS1SYV19LCh0YS5nZW8udHJhbnN2ZXJzZU1lcmNhdG9yPWZ1bmN0aW9uKCl7dmFyIG49a3IoRXIpLHQ9bi5jZW50ZXIsZT1uLnJvdGF0ZTtyZXR1cm4gbi5jZW50ZXI9ZnVuY3Rpb24obil7cmV0dXJuIG4/dChbLW5bMV0sblswXV0pOihuPXQoKSxbblsxXSwtblswXV0pfSxuLnJvdGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gbj9lKFtuWzBdLG5bMV0sbi5sZW5ndGg+Mj9uWzJdKzkwOjkwXSk6KG49ZSgpLFtuWzBdLG5bMV0sblsyXS05MF0pfSxlKFswLDAsOTBdKX0pLnJhdz1Fcix0YS5nZW9tPXt9LHRhLmdlb20uaHVsbD1mdW5jdGlvbihuKXtmdW5jdGlvbiB0KG4pe2lmKG4ubGVuZ3RoPDMpcmV0dXJuW107dmFyIHQsdT1FdChlKSxpPUV0KHIpLG89bi5sZW5ndGgsYT1bXSxjPVtdO2Zvcih0PTA7bz50O3QrKylhLnB1c2goWyt1LmNhbGwodGhpcyxuW3RdLHQpLCtpLmNhbGwodGhpcyxuW3RdLHQpLHRdKTtmb3IoYS5zb3J0KHpyKSx0PTA7bz50O3QrKyljLnB1c2goW2FbdF1bMF0sLWFbdF1bMV1dKTt2YXIgbD1DcihhKSxzPUNyKGMpLGY9c1swXT09PWxbMF0saD1zW3MubGVuZ3RoLTFdPT09bFtsLmxlbmd0aC0xXSxnPVtdO2Zvcih0PWwubGVuZ3RoLTE7dD49MDstLXQpZy5wdXNoKG5bYVtsW3RdXVsyXV0pO2Zvcih0PStmO3Q8cy5sZW5ndGgtaDsrK3QpZy5wdXNoKG5bYVtzW3RdXVsyXV0pO3JldHVybiBnfXZhciBlPUFyLHI9TnI7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dChuKToodC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdCk6ZX0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdCk6cn0sdCl9LHRhLmdlb20ucG9seWdvbj1mdW5jdGlvbihuKXtyZXR1cm4geWEobixKYyksbn07dmFyIEpjPXRhLmdlb20ucG9seWdvbi5wcm90b3R5cGU9W107SmMuYXJlYT1mdW5jdGlvbigpe2Zvcih2YXIgbix0PS0xLGU9dGhpcy5sZW5ndGgscj10aGlzW2UtMV0sdT0wOysrdDxlOyluPXIscj10aGlzW3RdLHUrPW5bMV0qclswXS1uWzBdKnJbMV07cmV0dXJuLjUqdX0sSmMuY2VudHJvaWQ9ZnVuY3Rpb24obil7dmFyIHQsZSxyPS0xLHU9dGhpcy5sZW5ndGgsaT0wLG89MCxhPXRoaXNbdS0xXTtmb3IoYXJndW1lbnRzLmxlbmd0aHx8KG49LTEvKDYqdGhpcy5hcmVhKCkpKTsrK3I8dTspdD1hLGE9dGhpc1tyXSxlPXRbMF0qYVsxXS1hWzBdKnRbMV0saSs9KHRbMF0rYVswXSkqZSxvKz0odFsxXSthWzFdKSplO3JldHVybltpKm4sbypuXX0sSmMuY2xpcD1mdW5jdGlvbihuKXtmb3IodmFyIHQsZSxyLHUsaSxvLGE9VHIobiksYz0tMSxsPXRoaXMubGVuZ3RoLVRyKHRoaXMpLHM9dGhpc1tsLTFdOysrYzxsOyl7Zm9yKHQ9bi5zbGljZSgpLG4ubGVuZ3RoPTAsdT10aGlzW2NdLGk9dFsocj10Lmxlbmd0aC1hKS0xXSxlPS0xOysrZTxyOylvPXRbZV0scXIobyxzLHUpPyhxcihpLHMsdSl8fG4ucHVzaChMcihpLG8scyx1KSksbi5wdXNoKG8pKTpxcihpLHMsdSkmJm4ucHVzaChMcihpLG8scyx1KSksaT1vO2EmJm4ucHVzaChuWzBdKSxzPXV9cmV0dXJuIG59O3ZhciBHYyxLYyxRYyxubCx0bCxlbD1bXSxybD1bXTtPci5wcm90b3R5cGUucHJlcGFyZT1mdW5jdGlvbigpe2Zvcih2YXIgbix0PXRoaXMuZWRnZXMsZT10Lmxlbmd0aDtlLS07KW49dFtlXS5lZGdlLG4uYiYmbi5hfHx0LnNwbGljZShlLDEpO3JldHVybiB0LnNvcnQoWXIpLHQubGVuZ3RofSxRci5wcm90b3R5cGU9e3N0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZS5sPT09dGhpcy5zaXRlP3RoaXMuZWRnZS5hOnRoaXMuZWRnZS5ifSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGdlLmw9PT10aGlzLnNpdGU/dGhpcy5lZGdlLmI6dGhpcy5lZGdlLmF9fSxudS5wcm90b3R5cGU9e2luc2VydDpmdW5jdGlvbihuLHQpe3ZhciBlLHIsdTtpZihuKXtpZih0LlA9bix0Lk49bi5OLG4uTiYmKG4uTi5QPXQpLG4uTj10LG4uUil7Zm9yKG49bi5SO24uTDspbj1uLkw7bi5MPXR9ZWxzZSBuLlI9dDtlPW59ZWxzZSB0aGlzLl8/KG49dXUodGhpcy5fKSx0LlA9bnVsbCx0Lk49bixuLlA9bi5MPXQsZT1uKToodC5QPXQuTj1udWxsLHRoaXMuXz10LGU9bnVsbCk7Zm9yKHQuTD10LlI9bnVsbCx0LlU9ZSx0LkM9ITAsbj10O2UmJmUuQzspcj1lLlUsZT09PXIuTD8odT1yLlIsdSYmdS5DPyhlLkM9dS5DPSExLHIuQz0hMCxuPXIpOihuPT09ZS5SJiYoZXUodGhpcyxlKSxuPWUsZT1uLlUpLGUuQz0hMSxyLkM9ITAscnUodGhpcyxyKSkpOih1PXIuTCx1JiZ1LkM/KGUuQz11LkM9ITEsci5DPSEwLG49cik6KG49PT1lLkwmJihydSh0aGlzLGUpLG49ZSxlPW4uVSksZS5DPSExLHIuQz0hMCxldSh0aGlzLHIpKSksZT1uLlU7dGhpcy5fLkM9ITF9LHJlbW92ZTpmdW5jdGlvbihuKXtuLk4mJihuLk4uUD1uLlApLG4uUCYmKG4uUC5OPW4uTiksbi5OPW4uUD1udWxsO3ZhciB0LGUscix1PW4uVSxpPW4uTCxvPW4uUjtpZihlPWk/bz91dShvKTppOm8sdT91Lkw9PT1uP3UuTD1lOnUuUj1lOnRoaXMuXz1lLGkmJm8/KHI9ZS5DLGUuQz1uLkMsZS5MPWksaS5VPWUsZSE9PW8/KHU9ZS5VLGUuVT1uLlUsbj1lLlIsdS5MPW4sZS5SPW8sby5VPWUpOihlLlU9dSx1PWUsbj1lLlIpKToocj1uLkMsbj1lKSxuJiYobi5VPXUpLCFyKXtpZihuJiZuLkMpcmV0dXJuIHZvaWQobi5DPSExKTtkb3tpZihuPT09dGhpcy5fKWJyZWFrO2lmKG49PT11Lkwpe2lmKHQ9dS5SLHQuQyYmKHQuQz0hMSx1LkM9ITAsZXUodGhpcyx1KSx0PXUuUiksdC5MJiZ0LkwuQ3x8dC5SJiZ0LlIuQyl7dC5SJiZ0LlIuQ3x8KHQuTC5DPSExLHQuQz0hMCxydSh0aGlzLHQpLHQ9dS5SKSx0LkM9dS5DLHUuQz10LlIuQz0hMSxldSh0aGlzLHUpLG49dGhpcy5fO2JyZWFrfX1lbHNlIGlmKHQ9dS5MLHQuQyYmKHQuQz0hMSx1LkM9ITAscnUodGhpcyx1KSx0PXUuTCksdC5MJiZ0LkwuQ3x8dC5SJiZ0LlIuQyl7dC5MJiZ0LkwuQ3x8KHQuUi5DPSExLHQuQz0hMCxldSh0aGlzLHQpLHQ9dS5MKSx0LkM9dS5DLHUuQz10LkwuQz0hMSxydSh0aGlzLHUpLG49dGhpcy5fO2JyZWFrfXQuQz0hMCxuPXUsdT11LlV9d2hpbGUoIW4uQyk7biYmKG4uQz0hMSl9fX0sdGEuZ2VvbS52b3Jvbm9pPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQobil7dmFyIHQ9bmV3IEFycmF5KG4ubGVuZ3RoKSxyPWFbMF1bMF0sdT1hWzBdWzFdLGk9YVsxXVswXSxvPWFbMV1bMV07cmV0dXJuIGl1KGUobiksYSkuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihlLGEpe3ZhciBjPWUuZWRnZXMsbD1lLnNpdGUscz10W2FdPWMubGVuZ3RoP2MubWFwKGZ1bmN0aW9uKG4pe3ZhciB0PW4uc3RhcnQoKTtyZXR1cm5bdC54LHQueV19KTpsLng+PXImJmwueDw9aSYmbC55Pj11JiZsLnk8PW8/W1tyLG9dLFtpLG9dLFtpLHVdLFtyLHVdXTpbXTtzLnBvaW50PW5bYV19KSx0fWZ1bmN0aW9uIGUobil7cmV0dXJuIG4ubWFwKGZ1bmN0aW9uKG4sdCl7cmV0dXJue3g6TWF0aC5yb3VuZChpKG4sdCkvQ2EpKkNhLHk6TWF0aC5yb3VuZChvKG4sdCkvQ2EpKkNhLGk6dH19KX12YXIgcj1Bcix1PU5yLGk9cixvPXUsYT11bDtyZXR1cm4gbj90KG4pOih0LmxpbmtzPWZ1bmN0aW9uKG4pe3JldHVybiBpdShlKG4pKS5lZGdlcy5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIG4ubCYmbi5yfSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybntzb3VyY2U6blt0LmwuaV0sdGFyZ2V0Om5bdC5yLmldfX0pfSx0LnRyaWFuZ2xlcz1mdW5jdGlvbihuKXt2YXIgdD1bXTtyZXR1cm4gaXUoZShuKSkuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihlLHIpe2Zvcih2YXIgdSxpLG89ZS5zaXRlLGE9ZS5lZGdlcy5zb3J0KFlyKSxjPS0xLGw9YS5sZW5ndGgscz1hW2wtMV0uZWRnZSxmPXMubD09PW8/cy5yOnMubDsrK2M8bDspdT1zLGk9ZixzPWFbY10uZWRnZSxmPXMubD09PW8/cy5yOnMubCxyPGkuaSYmcjxmLmkmJmF1KG8saSxmKTwwJiZ0LnB1c2goW25bcl0sbltpLmldLG5bZi5pXV0pfSksdH0sdC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPUV0KHI9biksdCk6cn0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPUV0KHU9biksdCk6dX0sdC5jbGlwRXh0ZW50PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPW51bGw9PW4/dWw6bix0KTphPT09dWw/bnVsbDphfSx0LnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dC5jbGlwRXh0ZW50KG4mJltbMCwwXSxuXSk6YT09PXVsP251bGw6YSYmYVsxXX0sdCl9O3ZhciB1bD1bWy0xZTYsLTFlNl0sWzFlNiwxZTZdXTt0YS5nZW9tLmRlbGF1bmF5PWZ1bmN0aW9uKG4pe3JldHVybiB0YS5nZW9tLnZvcm9ub2koKS50cmlhbmdsZXMobil9LHRhLmdlb20ucXVhZHRyZWU9ZnVuY3Rpb24obix0LGUscix1KXtmdW5jdGlvbiBpKG4pe2Z1bmN0aW9uIGkobix0LGUscix1LGksbyxhKXtpZighaXNOYU4oZSkmJiFpc05hTihyKSlpZihuLmxlYWYpe3ZhciBjPW4ueCxzPW4ueTtpZihudWxsIT1jKWlmKGdhKGMtZSkrZ2Eocy1yKTwuMDEpbChuLHQsZSxyLHUsaSxvLGEpO2Vsc2V7dmFyIGY9bi5wb2ludDtuLng9bi55PW4ucG9pbnQ9bnVsbCxsKG4sZixjLHMsdSxpLG8sYSksbChuLHQsZSxyLHUsaSxvLGEpfWVsc2Ugbi54PWUsbi55PXIsbi5wb2ludD10fWVsc2UgbChuLHQsZSxyLHUsaSxvLGEpfWZ1bmN0aW9uIGwobix0LGUscix1LG8sYSxjKXt2YXIgbD0uNSoodSthKSxzPS41KihvK2MpLGY9ZT49bCxoPXI+PXMsZz1oPDwxfGY7bi5sZWFmPSExLG49bi5ub2Rlc1tnXXx8KG4ubm9kZXNbZ109c3UoKSksZj91PWw6YT1sLGg/bz1zOmM9cyxpKG4sdCxlLHIsdSxvLGEsYyl9dmFyIHMsZixoLGcscCx2LGQsbSx5LE09RXQoYSkseD1FdChjKTtpZihudWxsIT10KXY9dCxkPWUsbT1yLHk9dTtlbHNlIGlmKG09eT0tKHY9ZD0xLzApLGY9W10saD1bXSxwPW4ubGVuZ3RoLG8pZm9yKGc9MDtwPmc7KytnKXM9bltnXSxzLng8diYmKHY9cy54KSxzLnk8ZCYmKGQ9cy55KSxzLng+bSYmKG09cy54KSxzLnk+eSYmKHk9cy55KSxmLnB1c2gocy54KSxoLnB1c2gocy55KTtlbHNlIGZvcihnPTA7cD5nOysrZyl7dmFyIGI9K00ocz1uW2ddLGcpLF89K3gocyxnKTt2PmImJih2PWIpLGQ+XyYmKGQ9XyksYj5tJiYobT1iKSxfPnkmJih5PV8pLGYucHVzaChiKSxoLnB1c2goXyl9dmFyIHc9bS12LFM9eS1kO3c+Uz95PWQrdzptPXYrUzt2YXIgaz1zdSgpO2lmKGsuYWRkPWZ1bmN0aW9uKG4pe2koayxuLCtNKG4sKytnKSwreChuLGcpLHYsZCxtLHkpfSxrLnZpc2l0PWZ1bmN0aW9uKG4pe2Z1KG4sayx2LGQsbSx5KX0say5maW5kPWZ1bmN0aW9uKG4pe3JldHVybiBodShrLG5bMF0sblsxXSx2LGQsbSx5KX0sZz0tMSxudWxsPT10KXtmb3IoOysrZzxwOylpKGssbltnXSxmW2ddLGhbZ10sdixkLG0seSk7LS1nfWVsc2Ugbi5mb3JFYWNoKGsuYWRkKTtyZXR1cm4gZj1oPW49cz1udWxsLGt9dmFyIG8sYT1BcixjPU5yO3JldHVybihvPWFyZ3VtZW50cy5sZW5ndGgpPyhhPWN1LGM9bHUsMz09PW8mJih1PWUscj10LGU9dD0wKSxpKG4pKTooaS54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPW4saSk6YX0saS55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW4saSk6Y30saS5leHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PW4/dD1lPXI9dT1udWxsOih0PStuWzBdWzBdLGU9K25bMF1bMV0scj0rblsxXVswXSx1PStuWzFdWzFdKSxpKTpudWxsPT10P251bGw6W1t0LGVdLFtyLHVdXX0saS5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT1uP3Q9ZT1yPXU9bnVsbDoodD1lPTAscj0rblswXSx1PStuWzFdKSxpKTpudWxsPT10P251bGw6W3ItdCx1LWVdfSxpKX0sdGEuaW50ZXJwb2xhdGVSZ2I9Z3UsdGEuaW50ZXJwb2xhdGVPYmplY3Q9cHUsdGEuaW50ZXJwb2xhdGVOdW1iZXI9dnUsdGEuaW50ZXJwb2xhdGVTdHJpbmc9ZHU7dmFyIGlsPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxvbD1uZXcgUmVnRXhwKGlsLnNvdXJjZSwiZyIpO3RhLmludGVycG9sYXRlPW11LHRhLmludGVycG9sYXRvcnM9W2Z1bmN0aW9uKG4sdCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuKCJzdHJpbmciPT09ZT9HYS5oYXModCl8fC9eKCN8cmdiXCh8aHNsXCgpLy50ZXN0KHQpP2d1OmR1OnQgaW5zdGFuY2VvZiBvdD9ndTpBcnJheS5pc0FycmF5KHQpP3l1OiJvYmplY3QiPT09ZSYmaXNOYU4odCk/cHU6dnUpKG4sdCl9XSx0YS5pbnRlcnBvbGF0ZUFycmF5PXl1O3ZhciBhbD1mdW5jdGlvbigpe3JldHVybiB5fSxjbD10YS5tYXAoe2xpbmVhcjphbCxwb2x5Omt1LHF1YWQ6ZnVuY3Rpb24oKXtyZXR1cm4gX3V9LGN1YmljOmZ1bmN0aW9uKCl7cmV0dXJuIHd1fSxzaW46ZnVuY3Rpb24oKXtyZXR1cm4gRXV9LGV4cDpmdW5jdGlvbigpe3JldHVybiBBdX0sY2lyY2xlOmZ1bmN0aW9uKCl7cmV0dXJuIE51fSxlbGFzdGljOkN1LGJhY2s6enUsYm91bmNlOmZ1bmN0aW9uKCl7cmV0dXJuIHF1fX0pLGxsPXRhLm1hcCh7ImluIjp5LG91dDp4dSwiaW4tb3V0IjpidSwib3V0LWluIjpmdW5jdGlvbihuKXtyZXR1cm4gYnUoeHUobikpfX0pO3RhLmVhc2U9ZnVuY3Rpb24obil7dmFyIHQ9bi5pbmRleE9mKCItIiksZT10Pj0wP24uc2xpY2UoMCx0KTpuLHI9dD49MD9uLnNsaWNlKHQrMSk6ImluIjtyZXR1cm4gZT1jbC5nZXQoZSl8fGFsLHI9bGwuZ2V0KHIpfHx5LE11KHIoZS5hcHBseShudWxsLGVhLmNhbGwoYXJndW1lbnRzLDEpKSkpfSx0YS5pbnRlcnBvbGF0ZUhjbD1MdSx0YS5pbnRlcnBvbGF0ZUhzbD1UdSx0YS5pbnRlcnBvbGF0ZUxhYj1SdSx0YS5pbnRlcnBvbGF0ZVJvdW5kPUR1LHRhLnRyYW5zZm9ybT1mdW5jdGlvbihuKXt2YXIgdD11YS5jcmVhdGVFbGVtZW50TlModGEubnMucHJlZml4LnN2ZywiZyIpO3JldHVybih0YS50cmFuc2Zvcm09ZnVuY3Rpb24obil7aWYobnVsbCE9bil7dC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsbik7dmFyIGU9dC50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpfXJldHVybiBuZXcgUHUoZT9lLm1hdHJpeDpzbCl9KShuKX0sUHUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK3RoaXMudHJhbnNsYXRlKyIpcm90YXRlKCIrdGhpcy5yb3RhdGUrIilza2V3WCgiK3RoaXMuc2tldysiKXNjYWxlKCIrdGhpcy5zY2FsZSsiKSJ9O3ZhciBzbD17YToxLGI6MCxjOjAsZDoxLGU6MCxmOjB9O3RhLmludGVycG9sYXRlVHJhbnNmb3JtPUh1LHRhLmxheW91dD17fSx0YS5sYXlvdXQuYnVuZGxlPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKG4pe2Zvcih2YXIgdD1bXSxlPS0xLHI9bi5sZW5ndGg7KytlPHI7KXQucHVzaChZdShuW2VdKSk7cmV0dXJuIHR9fSx0YS5sYXlvdXQuY2hvcmQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7dmFyIG4sbCxmLGgsZyxwPXt9LHY9W10sZD10YS5yYW5nZShpKSxtPVtdO2ZvcihlPVtdLHI9W10sbj0wLGg9LTE7KytoPGk7KXtmb3IobD0wLGc9LTE7KytnPGk7KWwrPXVbaF1bZ107di5wdXNoKGwpLG0ucHVzaCh0YS5yYW5nZShpKSksbis9bH1mb3IobyYmZC5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIG8odltuXSx2W3RdKX0pLGEmJm0uZm9yRWFjaChmdW5jdGlvbihuLHQpe24uc29ydChmdW5jdGlvbihuLGUpe3JldHVybiBhKHVbdF1bbl0sdVt0XVtlXSl9KX0pLG49KExhLXMqaSkvbixsPTAsaD0tMTsrK2g8aTspe2ZvcihmPWwsZz0tMTsrK2c8aTspe3ZhciB5PWRbaF0sTT1tW3ldW2ddLHg9dVt5XVtNXSxiPWwsXz1sKz14Km47cFt5KyItIitNXT17aW5kZXg6eSxzdWJpbmRleDpNLHN0YXJ0QW5nbGU6YixlbmRBbmdsZTpfLHZhbHVlOnh9fXJbeV09e2luZGV4Onksc3RhcnRBbmdsZTpmLGVuZEFuZ2xlOmwsdmFsdWU6KGwtZikvbn0sbCs9c31mb3IoaD0tMTsrK2g8aTspZm9yKGc9aC0xOysrZzxpOyl7dmFyIHc9cFtoKyItIitnXSxTPXBbZysiLSIraF07KHcudmFsdWV8fFMudmFsdWUpJiZlLnB1c2gody52YWx1ZTxTLnZhbHVlP3tzb3VyY2U6Uyx0YXJnZXQ6d306e3NvdXJjZTp3LHRhcmdldDpTfSl9YyYmdCgpfWZ1bmN0aW9uIHQoKXtlLnNvcnQoZnVuY3Rpb24obix0KXtyZXR1cm4gYygobi5zb3VyY2UudmFsdWUrbi50YXJnZXQudmFsdWUpLzIsKHQuc291cmNlLnZhbHVlK3QudGFyZ2V0LnZhbHVlKS8yKX0pfXZhciBlLHIsdSxpLG8sYSxjLGw9e30scz0wO3JldHVybiBsLm1hdHJpeD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0odT1uKSYmdS5sZW5ndGgsZT1yPW51bGwsbCk6dX0sbC5wYWRkaW5nPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPW4sZT1yPW51bGwsbCk6c30sbC5zb3J0R3JvdXBzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW4sZT1yPW51bGwsbCk6b30sbC5zb3J0U3ViZ3JvdXBzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPW4sZT1udWxsLGwpOmF9LGwuc29ydENob3Jkcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1uLGUmJnQoKSxsKTpjfSxsLmNob3Jkcz1mdW5jdGlvbigpe3JldHVybiBlfHxuKCksZX0sbC5ncm91cHM9ZnVuY3Rpb24oKXtyZXR1cm4gcnx8bigpLHJ9LGx9LHRhLmxheW91dC5mb3JjZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyLHUpe2lmKHQucG9pbnQhPT1uKXt2YXIgaT10LmN4LW4ueCxvPXQuY3ktbi55LGE9dS1lLGM9aSppK28qbztpZihjPmEqYS9kKXtpZihwPmMpe3ZhciBsPXQuY2hhcmdlL2M7bi5weC09aSpsLG4ucHktPW8qbH1yZXR1cm4hMH1pZih0LnBvaW50JiZjJiZwPmMpe3ZhciBsPXQucG9pbnRDaGFyZ2UvYztuLnB4LT1pKmwsbi5weS09bypsfX1yZXR1cm4hdC5jaGFyZ2V9fWZ1bmN0aW9uIHQobil7bi5weD10YS5ldmVudC54LG4ucHk9dGEuZXZlbnQueSxhLnJlc3VtZSgpfXZhciBlLHIsdSxpLG8sYT17fSxjPXRhLmRpc3BhdGNoKCJzdGFydCIsInRpY2siLCJlbmQiKSxsPVsxLDFdLHM9LjksZj1mbCxoPWhsLGc9LTMwLHA9Z2wsdj0uMSxkPS42NCxtPVtdLE09W107cmV0dXJuIGEudGljaz1mdW5jdGlvbigpe2lmKChyKj0uOTkpPC4wMDUpcmV0dXJuIGMuZW5kKHt0eXBlOiJlbmQiLGFscGhhOnI9MH0pLCEwO3ZhciB0LGUsYSxmLGgscCxkLHkseCxiPW0ubGVuZ3RoLF89TS5sZW5ndGg7Zm9yKGU9MDtfPmU7KytlKWE9TVtlXSxmPWEuc291cmNlLGg9YS50YXJnZXQseT1oLngtZi54LHg9aC55LWYueSwocD15KnkreCp4KSYmKHA9cippW2VdKigocD1NYXRoLnNxcnQocCkpLXVbZV0pL3AseSo9cCx4Kj1wLGgueC09eSooZD1mLndlaWdodC8oaC53ZWlnaHQrZi53ZWlnaHQpKSxoLnktPXgqZCxmLngrPXkqKGQ9MS1kKSxmLnkrPXgqZCk7aWYoKGQ9cip2KSYmKHk9bFswXS8yLHg9bFsxXS8yLGU9LTEsZCkpZm9yKDsrK2U8YjspYT1tW2VdLGEueCs9KHktYS54KSpkLGEueSs9KHgtYS55KSpkO2lmKGcpZm9yKEp1KHQ9dGEuZ2VvbS5xdWFkdHJlZShtKSxyLG8pLGU9LTE7KytlPGI7KShhPW1bZV0pLmZpeGVkfHx0LnZpc2l0KG4oYSkpO2ZvcihlPS0xOysrZTxiOylhPW1bZV0sYS5maXhlZD8oYS54PWEucHgsYS55PWEucHkpOihhLngtPShhLnB4LShhLnB4PWEueCkpKnMsYS55LT0oYS5weS0oYS5weT1hLnkpKSpzKTtjLnRpY2soe3R5cGU6InRpY2siLGFscGhhOnJ9KX0sYS5ub2Rlcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT1uLGEpOm19LGEubGlua3M9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KE09bixhKTpNfSxhLnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9bixhKTpsfSxhLmxpbmtEaXN0YW5jZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOituLGEpOmZ9LGEuZGlzdGFuY2U9YS5saW5rRGlzdGFuY2UsYS5saW5rU3RyZW5ndGg9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjorbixhKTpofSxhLmZyaWN0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPStuLGEpOnN9LGEuY2hhcmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246K24sYSk6Z30sYS5jaGFyZ2VEaXN0YW5jZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD1uKm4sYSk6TWF0aC5zcXJ0KHApfSxhLmdyYXZpdHk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9K24sYSk6dn0sYS50aGV0YT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1uKm4sYSk6TWF0aC5zcXJ0KGQpfSxhLmFscGhhPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStuLHI/cj1uPjA/bjowOm4+MCYmKGMuc3RhcnQoe3R5cGU6InN0YXJ0IixhbHBoYTpyPW59KSx0YS50aW1lcihhLnRpY2spKSxhKTpyfSxhLnN0YXJ0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHIpe2lmKCFlKXtmb3IoZT1uZXcgQXJyYXkoYyksYT0wO2M+YTsrK2EpZVthXT1bXTtmb3IoYT0wO3M+YTsrK2Epe3ZhciB1PU1bYV07ZVt1LnNvdXJjZS5pbmRleF0ucHVzaCh1LnRhcmdldCksZVt1LnRhcmdldC5pbmRleF0ucHVzaCh1LnNvdXJjZSl9fWZvcih2YXIgaSxvPWVbdF0sYT0tMSxsPW8ubGVuZ3RoOysrYTxsOylpZighaXNOYU4oaT1vW2FdW25dKSlyZXR1cm4gaTtyZXR1cm4gTWF0aC5yYW5kb20oKSpyfXZhciB0LGUscixjPW0ubGVuZ3RoLHM9TS5sZW5ndGgscD1sWzBdLHY9bFsxXTtmb3IodD0wO2M+dDsrK3QpKHI9bVt0XSkuaW5kZXg9dCxyLndlaWdodD0wO2Zvcih0PTA7cz50OysrdClyPU1bdF0sIm51bWJlciI9PXR5cGVvZiByLnNvdXJjZSYmKHIuc291cmNlPW1bci5zb3VyY2VdKSwibnVtYmVyIj09dHlwZW9mIHIudGFyZ2V0JiYoci50YXJnZXQ9bVtyLnRhcmdldF0pLCsrci5zb3VyY2Uud2VpZ2h0LCsrci50YXJnZXQud2VpZ2h0O2Zvcih0PTA7Yz50OysrdClyPW1bdF0saXNOYU4oci54KSYmKHIueD1uKCJ4IixwKSksaXNOYU4oci55KSYmKHIueT1uKCJ5Iix2KSksaXNOYU4oci5weCkmJihyLnB4PXIueCksaXNOYU4oci5weSkmJihyLnB5PXIueSk7aWYodT1bXSwiZnVuY3Rpb24iPT10eXBlb2YgZilmb3IodD0wO3M+dDsrK3QpdVt0XT0rZi5jYWxsKHRoaXMsTVt0XSx0KTtlbHNlIGZvcih0PTA7cz50OysrdCl1W3RdPWY7aWYoaT1bXSwiZnVuY3Rpb24iPT10eXBlb2YgaClmb3IodD0wO3M+dDsrK3QpaVt0XT0raC5jYWxsKHRoaXMsTVt0XSx0KTtlbHNlIGZvcih0PTA7cz50OysrdClpW3RdPWg7aWYobz1bXSwiZnVuY3Rpb24iPT10eXBlb2YgZylmb3IodD0wO2M+dDsrK3Qpb1t0XT0rZy5jYWxsKHRoaXMsbVt0XSx0KTtlbHNlIGZvcih0PTA7Yz50OysrdClvW3RdPWc7cmV0dXJuIGEucmVzdW1lKCl9LGEucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIGEuYWxwaGEoLjEpfSxhLnN0b3A9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hbHBoYSgwKX0sYS5kcmFnPWZ1bmN0aW9uKCl7cmV0dXJuIGV8fChlPXRhLmJlaGF2aW9yLmRyYWcoKS5vcmlnaW4oeSkub24oImRyYWdzdGFydC5mb3JjZSIsWHUpLm9uKCJkcmFnLmZvcmNlIix0KS5vbigiZHJhZ2VuZC5mb3JjZSIsJHUpKSxhcmd1bWVudHMubGVuZ3RoP3ZvaWQgdGhpcy5vbigibW91c2VvdmVyLmZvcmNlIixCdSkub24oIm1vdXNlb3V0LmZvcmNlIixXdSkuY2FsbChlKTplfSx0YS5yZWJpbmQoYSxjLCJvbiIpfTt2YXIgZmw9MjAsaGw9MSxnbD0xLzA7dGEubGF5b3V0LmhpZXJhcmNoeT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odSl7dmFyIGksbz1bdV0sYT1bXTtmb3IodS5kZXB0aD0wO251bGwhPShpPW8ucG9wKCkpOylpZihhLnB1c2goaSksKGw9ZS5jYWxsKG4saSxpLmRlcHRoKSkmJihjPWwubGVuZ3RoKSl7Zm9yKHZhciBjLGwsczstLWM+PTA7KW8ucHVzaChzPWxbY10pLHMucGFyZW50PWkscy5kZXB0aD1pLmRlcHRoKzE7ciYmKGkudmFsdWU9MCksaS5jaGlsZHJlbj1sfWVsc2UgciYmKGkudmFsdWU9K3IuY2FsbChuLGksaS5kZXB0aCl8fDApLGRlbGV0ZSBpLmNoaWxkcmVuO3JldHVybiBRdSh1LGZ1bmN0aW9uKG4pe3ZhciBlLHU7dCYmKGU9bi5jaGlsZHJlbikmJmUuc29ydCh0KSxyJiYodT1uLnBhcmVudCkmJih1LnZhbHVlKz1uLnZhbHVlKX0pLGF9dmFyIHQ9ZWksZT1uaSxyPXRpO3JldHVybiBuLnNvcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLmNoaWxkcmVuPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbik6ZX0sbi52YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG4ucmV2YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gciYmKEt1KHQsZnVuY3Rpb24obil7bi5jaGlsZHJlbiYmKG4udmFsdWU9MCl9KSxRdSh0LGZ1bmN0aW9uKHQpe3ZhciBlO3QuY2hpbGRyZW58fCh0LnZhbHVlPStyLmNhbGwobix0LHQuZGVwdGgpfHwwKSwoZT10LnBhcmVudCkmJihlLnZhbHVlKz10LnZhbHVlKX0pKSx0fSxufSx0YS5sYXlvdXQucGFydGl0aW9uPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih0LGUscix1KXt2YXIgaT10LmNoaWxkcmVuO2lmKHQueD1lLHQueT10LmRlcHRoKnUsdC5keD1yLHQuZHk9dSxpJiYobz1pLmxlbmd0aCkpe3ZhciBvLGEsYyxsPS0xO2ZvcihyPXQudmFsdWU/ci90LnZhbHVlOjA7KytsPG87KW4oYT1pW2xdLGUsYz1hLnZhbHVlKnIsdSksZSs9Y319ZnVuY3Rpb24gdChuKXt2YXIgZT1uLmNoaWxkcmVuLHI9MDtpZihlJiYodT1lLmxlbmd0aCkpZm9yKHZhciB1LGk9LTE7KytpPHU7KXI9TWF0aC5tYXgocix0KGVbaV0pKTtyZXR1cm4gMStyfWZ1bmN0aW9uIGUoZSxpKXt2YXIgbz1yLmNhbGwodGhpcyxlLGkpO3JldHVybiBuKG9bMF0sMCx1WzBdLHVbMV0vdChvWzBdKSksb312YXIgcj10YS5sYXlvdXQuaGllcmFyY2h5KCksdT1bMSwxXTtyZXR1cm4gZS5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW4sZSk6dX0sR3UoZSxyKX0sdGEubGF5b3V0LnBpZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obyl7dmFyIGEsYz1vLmxlbmd0aCxsPW8ubWFwKGZ1bmN0aW9uKGUscil7cmV0dXJuK3QuY2FsbChuLGUscil9KSxzPSsoImZ1bmN0aW9uIj09dHlwZW9mIHI/ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ciksZj0oImZ1bmN0aW9uIj09dHlwZW9mIHU/dS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dSktcyxoPU1hdGgubWluKE1hdGguYWJzKGYpL2MsKygiZnVuY3Rpb24iPT10eXBlb2YgaT9pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTppKSksZz1oKigwPmY/LTE6MSkscD0oZi1jKmcpL3RhLnN1bShsKSx2PXRhLnJhbmdlKGMpLGQ9W107cmV0dXJuIG51bGwhPWUmJnYuc29ydChlPT09cGw/ZnVuY3Rpb24obix0KXtyZXR1cm4gbFt0XS1sW25dfTpmdW5jdGlvbihuLHQpe3JldHVybiBlKG9bbl0sb1t0XSl9KSx2LmZvckVhY2goZnVuY3Rpb24obil7ZFtuXT17ZGF0YTpvW25dLHZhbHVlOmE9bFtuXSxzdGFydEFuZ2xlOnMsZW5kQW5nbGU6cys9YSpwK2cscGFkQW5nbGU6aH19KSxkfXZhciB0PU51bWJlcixlPXBsLHI9MCx1PUxhLGk9MDtyZXR1cm4gbi52YWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLG4pOnR9LG4uc29ydD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4uc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG4uZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxuKTp1fSxuLnBhZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbik6aX0sbn07dmFyIHBsPXt9O3RhLmxheW91dC5zdGFjaz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oYSxjKXtpZighKGg9YS5sZW5ndGgpKXJldHVybiBhO3ZhciBsPWEubWFwKGZ1bmN0aW9uKGUscil7cmV0dXJuIHQuY2FsbChuLGUscil9KSxzPWwubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm1hcChmdW5jdGlvbih0LGUpe3JldHVybltpLmNhbGwobix0LGUpLG8uY2FsbChuLHQsZSldfSl9KSxmPWUuY2FsbChuLHMsYyk7bD10YS5wZXJtdXRlKGwsZikscz10YS5wZXJtdXRlKHMsZik7dmFyIGgsZyxwLHYsZD1yLmNhbGwobixzLGMpLG09bFswXS5sZW5ndGg7Zm9yKHA9MDttPnA7KytwKWZvcih1LmNhbGwobixsWzBdW3BdLHY9ZFtwXSxzWzBdW3BdWzFdKSxnPTE7aD5nOysrZyl1LmNhbGwobixsW2ddW3BdLHYrPXNbZy0xXVtwXVsxXSxzW2ddW3BdWzFdKTtyZXR1cm4gYX12YXIgdD15LGU9YWkscj1jaSx1PW9pLGk9dWksbz1paTtyZXR1cm4gbi52YWx1ZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLm9yZGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6dmwuZ2V0KHQpfHxhaSxuKTplfSxuLm9mZnNldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmRsLmdldCh0KXx8Y2ksbik6cn0sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbik6aX0sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXQsbik6b30sbi5vdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxuKTp1fSxufTt2YXIgdmw9dGEubWFwKHsiaW5zaWRlLW91dCI6ZnVuY3Rpb24obil7dmFyIHQsZSxyPW4ubGVuZ3RoLHU9bi5tYXAobGkpLGk9bi5tYXAoc2kpLG89dGEucmFuZ2Uocikuc29ydChmdW5jdGlvbihuLHQpe3JldHVybiB1W25dLXVbdF19KSxhPTAsYz0wLGw9W10scz1bXTtmb3IodD0wO3I+dDsrK3QpZT1vW3RdLGM+YT8oYSs9aVtlXSxsLnB1c2goZSkpOihjKz1pW2VdLHMucHVzaChlKSk7cmV0dXJuIHMucmV2ZXJzZSgpLmNvbmNhdChsKX0scmV2ZXJzZTpmdW5jdGlvbihuKXtyZXR1cm4gdGEucmFuZ2Uobi5sZW5ndGgpLnJldmVyc2UoKX0sImRlZmF1bHQiOmFpfSksZGw9dGEubWFwKHtzaWxob3VldHRlOmZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PW4ubGVuZ3RoLGk9blswXS5sZW5ndGgsbz1bXSxhPTAsYz1bXTtmb3IoZT0wO2k+ZTsrK2Upe2Zvcih0PTAscj0wO3U+dDt0Kyspcis9blt0XVtlXVsxXTtyPmEmJihhPXIpLG8ucHVzaChyKX1mb3IoZT0wO2k+ZTsrK2UpY1tlXT0oYS1vW2VdKS8yO3JldHVybiBjfSx3aWdnbGU6ZnVuY3Rpb24obil7dmFyIHQsZSxyLHUsaSxvLGEsYyxsLHM9bi5sZW5ndGgsZj1uWzBdLGg9Zi5sZW5ndGgsZz1bXTtmb3IoZ1swXT1jPWw9MCxlPTE7aD5lOysrZSl7Zm9yKHQ9MCx1PTA7cz50OysrdCl1Kz1uW3RdW2VdWzFdO2Zvcih0PTAsaT0wLGE9ZltlXVswXS1mW2UtMV1bMF07cz50OysrdCl7Zm9yKHI9MCxvPShuW3RdW2VdWzFdLW5bdF1bZS0xXVsxXSkvKDIqYSk7dD5yOysrcilvKz0obltyXVtlXVsxXS1uW3JdW2UtMV1bMV0pL2E7aSs9bypuW3RdW2VdWzFdfWdbZV09Yy09dT9pL3UqYTowLGw+YyYmKGw9Yyl9Zm9yKGU9MDtoPmU7KytlKWdbZV0tPWw7cmV0dXJuIGd9LGV4cGFuZDpmdW5jdGlvbihuKXt2YXIgdCxlLHIsdT1uLmxlbmd0aCxpPW5bMF0ubGVuZ3RoLG89MS91LGE9W107Zm9yKGU9MDtpPmU7KytlKXtmb3IodD0wLHI9MDt1PnQ7dCsrKXIrPW5bdF1bZV1bMV07aWYocilmb3IodD0wO3U+dDt0Kyspblt0XVtlXVsxXS89cjtlbHNlIGZvcih0PTA7dT50O3QrKyluW3RdW2VdWzFdPW99Zm9yKGU9MDtpPmU7KytlKWFbZV09MDtyZXR1cm4gYX0semVybzpjaX0pO3RhLmxheW91dC5oaXN0b2dyYW09ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4saSl7Zm9yKHZhciBvLGEsYz1bXSxsPW4ubWFwKGUsdGhpcykscz1yLmNhbGwodGhpcyxsLGkpLGY9dS5jYWxsKHRoaXMscyxsLGkpLGk9LTEsaD1sLmxlbmd0aCxnPWYubGVuZ3RoLTEscD10PzE6MS9oOysraTxnOylvPWNbaV09W10sby5keD1mW2krMV0tKG8ueD1mW2ldKSxvLnk9MDtpZihnPjApZm9yKGk9LTE7KytpPGg7KWE9bFtpXSxhPj1zWzBdJiZhPD1zWzFdJiYobz1jW3RhLmJpc2VjdChmLGEsMSxnKS0xXSxvLnkrPXAsby5wdXNoKG5baV0pKTtyZXR1cm4gY312YXIgdD0hMCxlPU51bWJlcixyPXBpLHU9aGk7cmV0dXJuIG4udmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPUV0KHQpLG4pOnJ9LG4uYmlucz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0ibnVtYmVyIj09dHlwZW9mIHQ/ZnVuY3Rpb24obil7cmV0dXJuIGdpKG4sdCl9OkV0KHQpLG4pOnV9LG4uZnJlcXVlbmN5PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSEhZSxuKTp0fSxufSx0YS5sYXlvdXQucGFjaz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixpKXt2YXIgbz1lLmNhbGwodGhpcyxuLGkpLGE9b1swXSxjPXVbMF0sbD11WzFdLHM9bnVsbD09dD9NYXRoLnNxcnQ6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmdW5jdGlvbigpe3JldHVybiB0fTtpZihhLng9YS55PTAsUXUoYSxmdW5jdGlvbihuKXtuLnI9K3Mobi52YWx1ZSl9KSxRdShhLE1pKSxyKXt2YXIgZj1yKih0PzE6TWF0aC5tYXgoMiphLnIvYywyKmEuci9sKSkvMjtRdShhLGZ1bmN0aW9uKG4pe24ucis9Zn0pLFF1KGEsTWkpLFF1KGEsZnVuY3Rpb24obil7bi5yLT1mfSl9cmV0dXJuIF9pKGEsYy8yLGwvMix0PzE6MS9NYXRoLm1heCgyKmEuci9jLDIqYS5yL2wpKSxvfXZhciB0LGU9dGEubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQodmkpLHI9MCx1PVsxLDFdO3JldHVybiBuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxuKTp1fSxuLnJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1udWxsPT1lfHwiZnVuY3Rpb24iPT10eXBlb2YgZT9lOitlLG4pOnR9LG4ucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdCxuKTpyfSxHdShuLGUpfSx0YS5sYXlvdXQudHJlZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obix1KXt2YXIgcz1vLmNhbGwodGhpcyxuLHUpLGY9c1swXSxoPXQoZik7aWYoUXUoaCxlKSxoLnBhcmVudC5tPS1oLnosS3UoaCxyKSxsKUt1KGYsaSk7ZWxzZXt2YXIgZz1mLHA9Zix2PWY7S3UoZixmdW5jdGlvbihuKXtuLng8Zy54JiYoZz1uKSxuLng+cC54JiYocD1uKSxuLmRlcHRoPnYuZGVwdGgmJih2PW4pfSk7dmFyIGQ9YShnLHApLzItZy54LG09Y1swXS8ocC54K2EocCxnKS8yK2QpLHk9Y1sxXS8odi5kZXB0aHx8MSk7S3UoZixmdW5jdGlvbihuKXtuLng9KG4ueCtkKSptLG4ueT1uLmRlcHRoKnl9KX1yZXR1cm4gc31mdW5jdGlvbiB0KG4pe2Zvcih2YXIgdCxlPXtBOm51bGwsY2hpbGRyZW46W25dfSxyPVtlXTtudWxsIT0odD1yLnBvcCgpKTspZm9yKHZhciB1LGk9dC5jaGlsZHJlbixvPTAsYT1pLmxlbmd0aDthPm87KytvKXIucHVzaCgoaVtvXT11PXtfOmlbb10scGFyZW50OnQsY2hpbGRyZW46KHU9aVtvXS5jaGlsZHJlbikmJnUuc2xpY2UoKXx8W10sQTpudWxsLGE6bnVsbCx6OjAsbTowLGM6MCxzOjAsdDpudWxsLGk6b30pLmE9dSk7cmV0dXJuIGUuY2hpbGRyZW5bMF19ZnVuY3Rpb24gZShuKXt2YXIgdD1uLmNoaWxkcmVuLGU9bi5wYXJlbnQuY2hpbGRyZW4scj1uLmk/ZVtuLmktMV06bnVsbDtpZih0Lmxlbmd0aCl7Tmkobik7dmFyIGk9KHRbMF0ueit0W3QubGVuZ3RoLTFdLnopLzI7cj8obi56PXIueithKG4uXyxyLl8pLG4ubT1uLnotaSk6bi56PWl9ZWxzZSByJiYobi56PXIueithKG4uXyxyLl8pKTtuLnBhcmVudC5BPXUobixyLG4ucGFyZW50LkF8fGVbMF0pfWZ1bmN0aW9uIHIobil7bi5fLng9bi56K24ucGFyZW50Lm0sbi5tKz1uLnBhcmVudC5tfWZ1bmN0aW9uIHUobix0LGUpe2lmKHQpe2Zvcih2YXIgcix1PW4saT1uLG89dCxjPXUucGFyZW50LmNoaWxkcmVuWzBdLGw9dS5tLHM9aS5tLGY9by5tLGg9Yy5tO289RWkobyksdT1raSh1KSxvJiZ1OyljPWtpKGMpLGk9RWkoaSksaS5hPW4scj1vLnorZi11LnotbCthKG8uXyx1Ll8pLHI+MCYmKEFpKENpKG8sbixlKSxuLHIpLGwrPXIscys9ciksZis9by5tLGwrPXUubSxoKz1jLm0scys9aS5tO28mJiFFaShpKSYmKGkudD1vLGkubSs9Zi1zKSx1JiYha2koYykmJihjLnQ9dSxjLm0rPWwtaCxlPW4pfXJldHVybiBlfWZ1bmN0aW9uIGkobil7bi54Kj1jWzBdLG4ueT1uLmRlcHRoKmNbMV19dmFyIG89dGEubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQobnVsbCkudmFsdWUobnVsbCksYT1TaSxjPVsxLDFdLGw9bnVsbDtyZXR1cm4gbi5zZXBhcmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQsbik6YX0sbi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW51bGw9PShjPXQpP2k6bnVsbCxuKTpsP251bGw6Y30sbi5ub2RlU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1udWxsPT0oYz10KT9udWxsOmksbik6bD9jOm51bGx9LEd1KG4sbyl9LHRhLmxheW91dC5jbHVzdGVyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLGkpe3ZhciBvLGE9dC5jYWxsKHRoaXMsbixpKSxjPWFbMF0sbD0wO1F1KGMsZnVuY3Rpb24obil7dmFyIHQ9bi5jaGlsZHJlbjt0JiZ0Lmxlbmd0aD8obi54PXFpKHQpLG4ueT16aSh0KSk6KG4ueD1vP2wrPWUobixvKTowLG4ueT0wLG89bil9KTt2YXIgcz1MaShjKSxmPVRpKGMpLGg9cy54LWUocyxmKS8yLGc9Zi54K2UoZixzKS8yO3JldHVybiBRdShjLHU/ZnVuY3Rpb24obil7bi54PShuLngtYy54KSpyWzBdLG4ueT0oYy55LW4ueSkqclsxXX06ZnVuY3Rpb24obil7bi54PShuLngtaCkvKGctaCkqclswXSxuLnk9KDEtKGMueT9uLnkvYy55OjEpKSpyWzFdfSksYX12YXIgdD10YS5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChudWxsKS52YWx1ZShudWxsKSxlPVNpLHI9WzEsMV0sdT0hMTtyZXR1cm4gbi5zZXBhcmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbik6ZX0sbi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGw9PShyPXQpLG4pOnU/bnVsbDpyfSxuLm5vZGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGwhPShyPXQpLG4pOnU/cjpudWxsfSxHdShuLHQpfSx0YS5sYXlvdXQudHJlZW1hcD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obix0KXtmb3IodmFyIGUscix1PS0xLGk9bi5sZW5ndGg7Kyt1PGk7KXI9KGU9blt1XSkudmFsdWUqKDA+dD8wOnQpLGUuYXJlYT1pc05hTihyKXx8MD49cj8wOnJ9ZnVuY3Rpb24gdChlKXt2YXIgaT1lLmNoaWxkcmVuO2lmKGkmJmkubGVuZ3RoKXt2YXIgbyxhLGMsbD1mKGUpLHM9W10saD1pLnNsaWNlKCkscD0xLzAsdj0ic2xpY2UiPT09Zz9sLmR4OiJkaWNlIj09PWc/bC5keToic2xpY2UtZGljZSI9PT1nPzEmZS5kZXB0aD9sLmR5OmwuZHg6TWF0aC5taW4obC5keCxsLmR5KTtmb3IobihoLGwuZHgqbC5keS9lLnZhbHVlKSxzLmFyZWE9MDsoYz1oLmxlbmd0aCk+MDspcy5wdXNoKG89aFtjLTFdKSxzLmFyZWErPW8uYXJlYSwic3F1YXJpZnkiIT09Z3x8KGE9cihzLHYpKTw9cD8oaC5wb3AoKSxwPWEpOihzLmFyZWEtPXMucG9wKCkuYXJlYSx1KHMsdixsLCExKSx2PU1hdGgubWluKGwuZHgsbC5keSkscy5sZW5ndGg9cy5hcmVhPTAscD0xLzApO3MubGVuZ3RoJiYodShzLHYsbCwhMCkscy5sZW5ndGg9cy5hcmVhPTApLGkuZm9yRWFjaCh0KX19ZnVuY3Rpb24gZSh0KXt2YXIgcj10LmNoaWxkcmVuO2lmKHImJnIubGVuZ3RoKXt2YXIgaSxvPWYodCksYT1yLnNsaWNlKCksYz1bXTtmb3IobihhLG8uZHgqby5keS90LnZhbHVlKSxjLmFyZWE9MDtpPWEucG9wKCk7KWMucHVzaChpKSxjLmFyZWErPWkuYXJlYSxudWxsIT1pLnomJih1KGMsaS56P28uZHg6by5keSxvLCFhLmxlbmd0aCksYy5sZW5ndGg9Yy5hcmVhPTApO3IuZm9yRWFjaChlKX19ZnVuY3Rpb24gcihuLHQpe2Zvcih2YXIgZSxyPW4uYXJlYSx1PTAsaT0xLzAsbz0tMSxhPW4ubGVuZ3RoOysrbzxhOykoZT1uW29dLmFyZWEpJiYoaT5lJiYoaT1lKSxlPnUmJih1PWUpKTtyZXR1cm4gcio9cix0Kj10LHI/TWF0aC5tYXgodCp1KnAvcixyLyh0KmkqcCkpOjEvMH1mdW5jdGlvbiB1KG4sdCxlLHIpe3ZhciB1LGk9LTEsbz1uLmxlbmd0aCxhPWUueCxsPWUueSxzPXQ/YyhuLmFyZWEvdCk6MDtpZih0PT1lLmR4KXtmb3IoKHJ8fHM+ZS5keSkmJihzPWUuZHkpOysraTxvOyl1PW5baV0sdS54PWEsdS55PWwsdS5keT1zLGErPXUuZHg9TWF0aC5taW4oZS54K2UuZHgtYSxzP2ModS5hcmVhL3MpOjApO3Uuej0hMCx1LmR4Kz1lLngrZS5keC1hLGUueSs9cyxlLmR5LT1zfWVsc2V7Zm9yKChyfHxzPmUuZHgpJiYocz1lLmR4KTsrK2k8bzspdT1uW2ldLHUueD1hLHUueT1sLHUuZHg9cyxsKz11LmR5PU1hdGgubWluKGUueStlLmR5LWwscz9jKHUuYXJlYS9zKTowKTt1Lno9ITEsdS5keSs9ZS55K2UuZHktbCxlLngrPXMsZS5keC09c319ZnVuY3Rpb24gaShyKXt2YXIgdT1vfHxhKHIpLGk9dVswXTtyZXR1cm4gaS54PTAsaS55PTAsaS5keD1sWzBdLGkuZHk9bFsxXSxvJiZhLnJldmFsdWUoaSksbihbaV0saS5keCppLmR5L2kudmFsdWUpLChvP2U6dCkoaSksaCYmKG89dSksdX12YXIgbyxhPXRhLmxheW91dC5oaWVyYXJjaHkoKSxjPU1hdGgucm91bmQsbD1bMSwxXSxzPW51bGwsZj1SaSxoPSExLGc9InNxdWFyaWZ5IixwPS41KigxK01hdGguc3FydCg1KSk7DQpyZXR1cm4gaS5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4saSk6bH0saS5wYWRkaW5nPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQodCl7dmFyIGU9bi5jYWxsKGksdCx0LmRlcHRoKTtyZXR1cm4gbnVsbD09ZT9SaSh0KTpEaSh0LCJudW1iZXIiPT10eXBlb2YgZT9bZSxlLGUsZV06ZSl9ZnVuY3Rpb24gZSh0KXtyZXR1cm4gRGkodCxuKX1pZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gczt2YXIgcjtyZXR1cm4gZj1udWxsPT0ocz1uKT9SaToiZnVuY3Rpb24iPT0ocj10eXBlb2Ygbik/dDoibnVtYmVyIj09PXI/KG49W24sbixuLG5dLGUpOmUsaX0saS5yb3VuZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1uP01hdGgucm91bmQ6TnVtYmVyLGkpOmMhPU51bWJlcn0saS5zdGlja3k9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9bixvPW51bGwsaSk6aH0saS5yYXRpbz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD1uLGkpOnB9LGkubW9kZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz1uKyIiLGkpOmd9LEd1KGksYSl9LHRhLnJhbmRvbT17bm9ybWFsOmZ1bmN0aW9uKG4sdCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gMj5lJiYodD0xKSwxPmUmJihuPTApLGZ1bmN0aW9uKCl7dmFyIGUscix1O2RvIGU9MipNYXRoLnJhbmRvbSgpLTEscj0yKk1hdGgucmFuZG9tKCktMSx1PWUqZStyKnI7d2hpbGUoIXV8fHU+MSk7cmV0dXJuIG4rdCplKk1hdGguc3FydCgtMipNYXRoLmxvZyh1KS91KX19LGxvZ05vcm1hbDpmdW5jdGlvbigpe3ZhciBuPXRhLnJhbmRvbS5ub3JtYWwuYXBwbHkodGEsYXJndW1lbnRzKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5leHAobigpKX19LGJhdGVzOmZ1bmN0aW9uKG4pe3ZhciB0PXRhLnJhbmRvbS5pcndpbkhhbGwobik7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQoKS9ufX0saXJ3aW5IYWxsOmZ1bmN0aW9uKG4pe3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgdD0wLGU9MDtuPmU7ZSsrKXQrPU1hdGgucmFuZG9tKCk7cmV0dXJuIHR9fX0sdGEuc2NhbGU9e307dmFyIG1sPXtmbG9vcjp5LGNlaWw6eX07dGEuc2NhbGUubGluZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIElpKFswLDFdLFswLDFdLG11LCExKX07dmFyIHlsPXtzOjEsZzoxLHA6MSxyOjEsZToxfTt0YS5zY2FsZS5sb2c9ZnVuY3Rpb24oKXtyZXR1cm4gSmkodGEuc2NhbGUubGluZWFyKCkuZG9tYWluKFswLDFdKSwxMCwhMCxbMSwxMF0pfTt2YXIgTWw9dGEuZm9ybWF0KCIuMGUiKSx4bD17Zmxvb3I6ZnVuY3Rpb24obil7cmV0dXJuLU1hdGguY2VpbCgtbil9LGNlaWw6ZnVuY3Rpb24obil7cmV0dXJuLU1hdGguZmxvb3IoLW4pfX07dGEuc2NhbGUucG93PWZ1bmN0aW9uKCl7cmV0dXJuIEdpKHRhLnNjYWxlLmxpbmVhcigpLDEsWzAsMV0pfSx0YS5zY2FsZS5zcXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRhLnNjYWxlLnBvdygpLmV4cG9uZW50KC41KX0sdGEuc2NhbGUub3JkaW5hbD1mdW5jdGlvbigpe3JldHVybiBRaShbXSx7dDoicmFuZ2UiLGE6W1tdXX0pfSx0YS5zY2FsZS5jYXRlZ29yeTEwPWZ1bmN0aW9uKCl7cmV0dXJuIHRhLnNjYWxlLm9yZGluYWwoKS5yYW5nZShibCl9LHRhLnNjYWxlLmNhdGVnb3J5MjA9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuc2NhbGUub3JkaW5hbCgpLnJhbmdlKF9sKX0sdGEuc2NhbGUuY2F0ZWdvcnkyMGI9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuc2NhbGUub3JkaW5hbCgpLnJhbmdlKHdsKX0sdGEuc2NhbGUuY2F0ZWdvcnkyMGM9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuc2NhbGUub3JkaW5hbCgpLnJhbmdlKFNsKX07dmFyIGJsPVsyMDYyMjYwLDE2NzQ0MjA2LDI5MjQ1ODgsMTQwMzQ3MjgsOTcyNTg4NSw5MTk3MTMxLDE0OTA3MzMwLDgzNTU3MTEsMTIzNjkxODYsMTU1NjE3NV0ubWFwKE10KSxfbD1bMjA2MjI2MCwxMTQ1NDQ0MCwxNjc0NDIwNiwxNjc1OTY3MiwyOTI0NTg4LDEwMDE4Njk4LDE0MDM0NzI4LDE2NzUwNzQyLDk3MjU4ODUsMTI5NTU4NjEsOTE5NzEzMSwxMjg4NTE0MCwxNDkwNzMzMCwxNjIzNDE5NCw4MzU1NzExLDEzMDkyODA3LDEyMzY5MTg2LDE0NDA4NTg5LDE1NTYxNzUsMTA0MTA3MjVdLm1hcChNdCksd2w9WzM3NTA3NzcsNTM5NTYxOSw3MDQwNzE5LDEwMjY0Mjg2LDY1MTkwOTcsOTIxNjU5NCwxMTkxNTExNSwxMzU1NjYzNiw5MjAyOTkzLDEyNDI2ODA5LDE1MTg2NTE0LDE1MTkwOTMyLDg2NjYxNjksMTEzNTY0OTAsMTQwNDk2NDMsMTUxNzczNzIsODA3NzY4MywxMDgzNDMyNCwxMzUyODUwOSwxNDU4OTY1NF0ubWFwKE10KSxTbD1bMzI0NDczMyw3MDU3MTEwLDEwNDA2NjI1LDEzMDMyNDMxLDE1MDk1MDUzLDE2NjE2NzY0LDE2NjI1MjU5LDE2NjM0MDE4LDMyNTMwNzYsNzY1MjQ3MCwxMDYwNzAwMywxMzEwMTUwNCw3Njk1MjgxLDEwMzk0MzEyLDEyMzY5MzcyLDE0MzQyODkxLDY1MTM1MDcsOTg2ODk1MCwxMjQzNDg3NywxNDI3NzA4MV0ubWFwKE10KTt0YS5zY2FsZS5xdWFudGlsZT1mdW5jdGlvbigpe3JldHVybiBubyhbXSxbXSl9LHRhLnNjYWxlLnF1YW50aXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRvKDAsMSxbMCwxXSl9LHRhLnNjYWxlLnRocmVzaG9sZD1mdW5jdGlvbigpe3JldHVybiBlbyhbLjVdLFswLDFdKX0sdGEuc2NhbGUuaWRlbnRpdHk9ZnVuY3Rpb24oKXtyZXR1cm4gcm8oWzAsMV0pfSx0YS5zdmc9e30sdGEuc3ZnLmFyYz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt2YXIgbj1NYXRoLm1heCgwLCtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksbD1NYXRoLm1heCgwLCtyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkscz1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1SYSxmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpLVJhLGg9TWF0aC5hYnMoZi1zKSxnPXM+Zj8wOjE7aWYobj5sJiYocD1sLGw9bixuPXApLGg+PVRhKXJldHVybiB0KGwsZykrKG4/dChuLDEtZyk6IiIpKyJaIjt2YXIgcCx2LGQsbSx5LE0seCxiLF8sdyxTLGssRT0wLEE9MCxOPVtdO2lmKChtPSgrYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fDApLzIpJiYoZD1pPT09a2w/TWF0aC5zcXJ0KG4qbitsKmwpOitpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxnfHwoQSo9LTEpLGwmJihBPXR0KGQvbCpNYXRoLnNpbihtKSkpLG4mJihFPXR0KGQvbipNYXRoLnNpbihtKSkpKSxsKXt5PWwqTWF0aC5jb3MocytBKSxNPWwqTWF0aC5zaW4ocytBKSx4PWwqTWF0aC5jb3MoZi1BKSxiPWwqTWF0aC5zaW4oZi1BKTt2YXIgQz1NYXRoLmFicyhmLXMtMipBKTw9cWE/MDoxO2lmKEEmJnNvKHksTSx4LGIpPT09Z15DKXt2YXIgej0ocytmKS8yO3k9bCpNYXRoLmNvcyh6KSxNPWwqTWF0aC5zaW4oeikseD1iPW51bGx9fWVsc2UgeT1NPTA7aWYobil7Xz1uKk1hdGguY29zKGYtRSksdz1uKk1hdGguc2luKGYtRSksUz1uKk1hdGguY29zKHMrRSksaz1uKk1hdGguc2luKHMrRSk7dmFyIHE9TWF0aC5hYnMocy1mKzIqRSk8PXFhPzA6MTtpZihFJiZzbyhfLHcsUyxrKT09PTEtZ15xKXt2YXIgTD0ocytmKS8yO189bipNYXRoLmNvcyhMKSx3PW4qTWF0aC5zaW4oTCksUz1rPW51bGx9fWVsc2UgXz13PTA7aWYoKHA9TWF0aC5taW4oTWF0aC5hYnMobC1uKS8yLCt1LmFwcGx5KHRoaXMsYXJndW1lbnRzKSkpPi4wMDEpe3Y9bD5uXmc/MDoxO3ZhciBUPW51bGw9PVM/W18sd106bnVsbD09eD9beSxNXTpMcihbeSxNXSxbUyxrXSxbeCxiXSxbXyx3XSksUj15LVRbMF0sRD1NLVRbMV0sUD14LVRbMF0sVT1iLVRbMV0saj0xL01hdGguc2luKE1hdGguYWNvcygoUipQK0QqVSkvKE1hdGguc3FydChSKlIrRCpEKSpNYXRoLnNxcnQoUCpQK1UqVSkpKS8yKSxGPU1hdGguc3FydChUWzBdKlRbMF0rVFsxXSpUWzFdKTtpZihudWxsIT14KXt2YXIgSD1NYXRoLm1pbihwLChsLUYpLyhqKzEpKSxPPWZvKG51bGw9PVM/W18sd106W1Msa10sW3ksTV0sbCxILGcpLEk9Zm8oW3gsYl0sW18sd10sbCxILGcpO3A9PT1IP04ucHVzaCgiTSIsT1swXSwiQSIsSCwiLCIsSCwiIDAgMCwiLHYsIiAiLE9bMV0sIkEiLGwsIiwiLGwsIiAwICIsMS1nXnNvKE9bMV1bMF0sT1sxXVsxXSxJWzFdWzBdLElbMV1bMV0pLCIsIixnLCIgIixJWzFdLCJBIixILCIsIixILCIgMCAwLCIsdiwiICIsSVswXSk6Ti5wdXNoKCJNIixPWzBdLCJBIixILCIsIixILCIgMCAxLCIsdiwiICIsSVswXSl9ZWxzZSBOLnB1c2goIk0iLHksIiwiLE0pO2lmKG51bGwhPVMpe3ZhciBZPU1hdGgubWluKHAsKG4tRikvKGotMSkpLFo9Zm8oW3ksTV0sW1Msa10sbiwtWSxnKSxWPWZvKFtfLHddLG51bGw9PXg/W3ksTV06W3gsYl0sbiwtWSxnKTtwPT09WT9OLnB1c2goIkwiLFZbMF0sIkEiLFksIiwiLFksIiAwIDAsIix2LCIgIixWWzFdLCJBIixuLCIsIixuLCIgMCAiLGdec28oVlsxXVswXSxWWzFdWzFdLFpbMV1bMF0sWlsxXVsxXSksIiwiLDEtZywiICIsWlsxXSwiQSIsWSwiLCIsWSwiIDAgMCwiLHYsIiAiLFpbMF0pOk4ucHVzaCgiTCIsVlswXSwiQSIsWSwiLCIsWSwiIDAgMCwiLHYsIiAiLFpbMF0pfWVsc2UgTi5wdXNoKCJMIixfLCIsIix3KX1lbHNlIE4ucHVzaCgiTSIseSwiLCIsTSksbnVsbCE9eCYmTi5wdXNoKCJBIixsLCIsIixsLCIgMCAiLEMsIiwiLGcsIiAiLHgsIiwiLGIpLE4ucHVzaCgiTCIsXywiLCIsdyksbnVsbCE9UyYmTi5wdXNoKCJBIixuLCIsIixuLCIgMCAiLHEsIiwiLDEtZywiICIsUywiLCIsayk7cmV0dXJuIE4ucHVzaCgiWiIpLE4uam9pbigiIil9ZnVuY3Rpb24gdChuLHQpe3JldHVybiJNMCwiK24rIkEiK24rIiwiK24rIiAwIDEsIit0KyIgMCwiKy1uKyJBIituKyIsIituKyIgMCAxLCIrdCsiIDAsIitufXZhciBlPWlvLHI9b28sdT11byxpPWtsLG89YW8sYT1jbyxjPWxvO3JldHVybiBuLmlubmVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPUV0KHQpLG4pOmV9LG4ub3V0ZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9RXQodCksbik6cn0sbi5jb3JuZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9RXQodCksbik6dX0sbi5wYWRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dD09a2w/a2w6RXQodCksbik6aX0sbi5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPUV0KHQpLG4pOm99LG4uZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9RXQodCksbik6YX0sbi5wYWRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1FdCh0KSxuKTpjfSxuLmNlbnRyb2lkPWZ1bmN0aW9uKCl7dmFyIG49KCtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSsgK3IuYXBwbHkodGhpcyxhcmd1bWVudHMpKS8yLHQ9KCtvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSsgK2EuYXBwbHkodGhpcyxhcmd1bWVudHMpKS8yLVJhO3JldHVybltNYXRoLmNvcyh0KSpuLE1hdGguc2luKHQpKm5dfSxufTt2YXIga2w9ImF1dG8iO3RhLnN2Zy5saW5lPWZ1bmN0aW9uKCl7cmV0dXJuIGhvKHkpfTt2YXIgRWw9dGEubWFwKHtsaW5lYXI6Z28sImxpbmVhci1jbG9zZWQiOnBvLHN0ZXA6dm8sInN0ZXAtYmVmb3JlIjptbywic3RlcC1hZnRlciI6eW8sYmFzaXM6U28sImJhc2lzLW9wZW4iOmtvLCJiYXNpcy1jbG9zZWQiOkVvLGJ1bmRsZTpBbyxjYXJkaW5hbDpibywiY2FyZGluYWwtb3BlbiI6TW8sImNhcmRpbmFsLWNsb3NlZCI6eG8sbW9ub3RvbmU6VG99KTtFbC5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7dC5rZXk9bix0LmNsb3NlZD0vLWNsb3NlZCQvLnRlc3Qobil9KTt2YXIgQWw9WzAsMi8zLDEvMywwXSxObD1bMCwxLzMsMi8zLDBdLENsPVswLDEvNiwyLzMsMS82XTt0YS5zdmcubGluZS5yYWRpYWw9ZnVuY3Rpb24oKXt2YXIgbj1obyhSbyk7cmV0dXJuIG4ucmFkaXVzPW4ueCxkZWxldGUgbi54LG4uYW5nbGU9bi55LGRlbGV0ZSBuLnksbn0sbW8ucmV2ZXJzZT15byx5by5yZXZlcnNlPW1vLHRhLnN2Zy5hcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIERvKHkpfSx0YS5zdmcuYXJlYS5yYWRpYWw9ZnVuY3Rpb24oKXt2YXIgbj1EbyhSbyk7cmV0dXJuIG4ucmFkaXVzPW4ueCxkZWxldGUgbi54LG4uaW5uZXJSYWRpdXM9bi54MCxkZWxldGUgbi54MCxuLm91dGVyUmFkaXVzPW4ueDEsZGVsZXRlIG4ueDEsbi5hbmdsZT1uLnksZGVsZXRlIG4ueSxuLnN0YXJ0QW5nbGU9bi55MCxkZWxldGUgbi55MCxuLmVuZEFuZ2xlPW4ueTEsZGVsZXRlIG4ueTEsbn0sdGEuc3ZnLmNob3JkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLGEpe3ZhciBjPXQodGhpcyxpLG4sYSksbD10KHRoaXMsbyxuLGEpO3JldHVybiJNIitjLnAwK3IoYy5yLGMucDEsYy5hMS1jLmEwKSsoZShjLGwpP3UoYy5yLGMucDEsYy5yLGMucDApOnUoYy5yLGMucDEsbC5yLGwucDApK3IobC5yLGwucDEsbC5hMS1sLmEwKSt1KGwucixsLnAxLGMucixjLnAwKSkrIloifWZ1bmN0aW9uIHQobix0LGUscil7dmFyIHU9dC5jYWxsKG4sZSxyKSxpPWEuY2FsbChuLHUsciksbz1jLmNhbGwobix1LHIpLVJhLHM9bC5jYWxsKG4sdSxyKS1SYTtyZXR1cm57cjppLGEwOm8sYTE6cyxwMDpbaSpNYXRoLmNvcyhvKSxpKk1hdGguc2luKG8pXSxwMTpbaSpNYXRoLmNvcyhzKSxpKk1hdGguc2luKHMpXX19ZnVuY3Rpb24gZShuLHQpe3JldHVybiBuLmEwPT10LmEwJiZuLmExPT10LmExfWZ1bmN0aW9uIHIobix0LGUpe3JldHVybiJBIituKyIsIituKyIgMCAiKyArKGU+cWEpKyIsMSAiK3R9ZnVuY3Rpb24gdShuLHQsZSxyKXtyZXR1cm4iUSAwLDAgIityfXZhciBpPW1yLG89eXIsYT1QbyxjPWFvLGw9Y287cmV0dXJuIG4ucmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPUV0KHQpLG4pOmF9LG4uc291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPUV0KHQpLG4pOml9LG4udGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPUV0KHQpLG4pOm99LG4uc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1FdCh0KSxuKTpjfSxuLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPUV0KHQpLG4pOmx9LG59LHRhLnN2Zy5kaWFnb25hbD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obix1KXt2YXIgaT10LmNhbGwodGhpcyxuLHUpLG89ZS5jYWxsKHRoaXMsbix1KSxhPShpLnkrby55KS8yLGM9W2kse3g6aS54LHk6YX0se3g6by54LHk6YX0sb107cmV0dXJuIGM9Yy5tYXAociksIk0iK2NbMF0rIkMiK2NbMV0rIiAiK2NbMl0rIiAiK2NbM119dmFyIHQ9bXIsZT15cixyPVVvO3JldHVybiBuLnNvdXJjZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1FdChlKSxuKTp0fSxuLnRhcmdldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1FdCh0KSxuKTplfSxuLnByb2plY3Rpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxuKTpyfSxufSx0YS5zdmcuZGlhZ29uYWwucmFkaWFsPWZ1bmN0aW9uKCl7dmFyIG49dGEuc3ZnLmRpYWdvbmFsKCksdD1VbyxlPW4ucHJvamVjdGlvbjtyZXR1cm4gbi5wcm9qZWN0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2Uoam8odD1uKSk6dH0sbn0sdGEuc3ZnLnN5bWJvbD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixyKXtyZXR1cm4oemwuZ2V0KHQuY2FsbCh0aGlzLG4scikpfHxPbykoZS5jYWxsKHRoaXMsbixyKSl9dmFyIHQ9SG8sZT1GbztyZXR1cm4gbi50eXBlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PUV0KGUpLG4pOnR9LG4uc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1FdCh0KSxuKTplfSxufTt2YXIgemw9dGEubWFwKHtjaXJjbGU6T28sY3Jvc3M6ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zcXJ0KG4vNSkvMjtyZXR1cm4iTSIrLTMqdCsiLCIrLXQrIkgiKy10KyJWIistMyp0KyJIIit0KyJWIistdCsiSCIrMyp0KyJWIit0KyJIIit0KyJWIiszKnQrIkgiKy10KyJWIit0KyJIIistMyp0KyJaIn0sZGlhbW9uZDpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobi8oMipMbCkpLGU9dCpMbDtyZXR1cm4iTTAsIistdCsiTCIrZSsiLDAgMCwiK3QrIiAiKy1lKyIsMFoifSxzcXVhcmU6ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zcXJ0KG4pLzI7cmV0dXJuIk0iKy10KyIsIistdCsiTCIrdCsiLCIrLXQrIiAiK3QrIiwiK3QrIiAiKy10KyIsIit0KyJaIn0sInRyaWFuZ2xlLWRvd24iOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuL3FsKSxlPXQqcWwvMjtyZXR1cm4iTTAsIitlKyJMIit0KyIsIistZSsiICIrLXQrIiwiKy1lKyJaIn0sInRyaWFuZ2xlLXVwIjpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobi9xbCksZT10KnFsLzI7cmV0dXJuIk0wLCIrLWUrIkwiK3QrIiwiK2UrIiAiKy10KyIsIitlKyJaIn19KTt0YS5zdmcuc3ltYm9sVHlwZXM9emwua2V5cygpO3ZhciBxbD1NYXRoLnNxcnQoMyksTGw9TWF0aC50YW4oMzAqRGEpO19hLnRyYW5zaXRpb249ZnVuY3Rpb24obil7Zm9yKHZhciB0LGUscj1UbHx8KytVbCx1PVhvKG4pLGk9W10sbz1SbHx8e3RpbWU6RGF0ZS5ub3coKSxlYXNlOlN1LGRlbGF5OjAsZHVyYXRpb246MjUwfSxhPS0xLGM9dGhpcy5sZW5ndGg7KythPGM7KXtpLnB1c2godD1bXSk7Zm9yKHZhciBsPXRoaXNbYV0scz0tMSxmPWwubGVuZ3RoOysrczxmOykoZT1sW3NdKSYmJG8oZSxzLHUscixvKSx0LnB1c2goZSl9cmV0dXJuIFlvKGksdSxyKX0sX2EuaW50ZXJydXB0PWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLmVhY2gobnVsbD09bj9EbDpJbyhYbyhuKSkpfTt2YXIgVGwsUmwsRGw9SW8oWG8oKSksUGw9W10sVWw9MDtQbC5jYWxsPV9hLmNhbGwsUGwuZW1wdHk9X2EuZW1wdHksUGwubm9kZT1fYS5ub2RlLFBsLnNpemU9X2Euc2l6ZSx0YS50cmFuc2l0aW9uPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4mJm4udHJhbnNpdGlvbj9UbD9uLnRyYW5zaXRpb24odCk6bjp0YS5zZWxlY3Rpb24oKS50cmFuc2l0aW9uKG4pfSx0YS50cmFuc2l0aW9uLnByb3RvdHlwZT1QbCxQbC5zZWxlY3Q9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHU9dGhpcy5pZCxpPXRoaXMubmFtZXNwYWNlLG89W107bj1OKG4pO2Zvcih2YXIgYT0tMSxjPXRoaXMubGVuZ3RoOysrYTxjOyl7by5wdXNoKHQ9W10pO2Zvcih2YXIgbD10aGlzW2FdLHM9LTEsZj1sLmxlbmd0aDsrK3M8ZjspKHI9bFtzXSkmJihlPW4uY2FsbChyLHIuX19kYXRhX18scyxhKSk/KCJfX2RhdGFfXyJpbiByJiYoZS5fX2RhdGFfXz1yLl9fZGF0YV9fKSwkbyhlLHMsaSx1LHJbaV1bdV0pLHQucHVzaChlKSk6dC5wdXNoKG51bGwpfXJldHVybiBZbyhvLGksdSl9LFBsLnNlbGVjdEFsbD1mdW5jdGlvbihuKXt2YXIgdCxlLHIsdSxpLG89dGhpcy5pZCxhPXRoaXMubmFtZXNwYWNlLGM9W107bj1DKG4pO2Zvcih2YXIgbD0tMSxzPXRoaXMubGVuZ3RoOysrbDxzOylmb3IodmFyIGY9dGhpc1tsXSxoPS0xLGc9Zi5sZW5ndGg7KytoPGc7KWlmKHI9ZltoXSl7aT1yW2FdW29dLGU9bi5jYWxsKHIsci5fX2RhdGFfXyxoLGwpLGMucHVzaCh0PVtdKTtmb3IodmFyIHA9LTEsdj1lLmxlbmd0aDsrK3A8djspKHU9ZVtwXSkmJiRvKHUscCxhLG8saSksdC5wdXNoKHUpfXJldHVybiBZbyhjLGEsbyl9LFBsLmZpbHRlcj1mdW5jdGlvbihuKXt2YXIgdCxlLHIsdT1bXTsiZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49TyhuKSk7Zm9yKHZhciBpPTAsbz10aGlzLmxlbmd0aDtvPmk7aSsrKXt1LnB1c2godD1bXSk7Zm9yKHZhciBlPXRoaXNbaV0sYT0wLGM9ZS5sZW5ndGg7Yz5hO2ErKykocj1lW2FdKSYmbi5jYWxsKHIsci5fX2RhdGFfXyxhLGkpJiZ0LnB1c2gocil9cmV0dXJuIFlvKHUsdGhpcy5uYW1lc3BhY2UsdGhpcy5pZCl9LFBsLnR3ZWVuPWZ1bmN0aW9uKG4sdCl7dmFyIGU9dGhpcy5pZCxyPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/dGhpcy5ub2RlKClbcl1bZV0udHdlZW4uZ2V0KG4pOlkodGhpcyxudWxsPT10P2Z1bmN0aW9uKHQpe3Rbcl1bZV0udHdlZW4ucmVtb3ZlKG4pfTpmdW5jdGlvbih1KXt1W3JdW2VdLnR3ZWVuLnNldChuLHQpfSl9LFBsLmF0dHI9ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUoYSl9ZnVuY3Rpb24gcigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlMoYS5zcGFjZSxhLmxvY2FsKX1mdW5jdGlvbiB1KG4pe3JldHVybiBudWxsPT1uP2U6KG4rPSIiLGZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLmdldEF0dHJpYnV0ZShhKTtyZXR1cm4gZSE9PW4mJih0PW8oZSxuKSxmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZShhLHQobikpfSl9KX1mdW5jdGlvbiBpKG4pe3JldHVybiBudWxsPT1uP3I6KG4rPSIiLGZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLmdldEF0dHJpYnV0ZU5TKGEuc3BhY2UsYS5sb2NhbCk7cmV0dXJuIGUhPT1uJiYodD1vKGUsbiksZnVuY3Rpb24obil7dGhpcy5zZXRBdHRyaWJ1dGVOUyhhLnNwYWNlLGEubG9jYWwsdChuKSl9KX0pfWlmKGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHQgaW4gbil0aGlzLmF0dHIodCxuW3RdKTtyZXR1cm4gdGhpc312YXIgbz0idHJhbnNmb3JtIj09bj9IdTptdSxhPXRhLm5zLnF1YWxpZnkobik7cmV0dXJuIFpvKHRoaXMsImF0dHIuIituLHQsYS5sb2NhbD9pOnUpfSxQbC5hdHRyVHdlZW49ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKG4sZSl7dmFyIHI9dC5jYWxsKHRoaXMsbixlLHRoaXMuZ2V0QXR0cmlidXRlKHUpKTtyZXR1cm4gciYmZnVuY3Rpb24obil7dGhpcy5zZXRBdHRyaWJ1dGUodSxyKG4pKX19ZnVuY3Rpb24gcihuLGUpe3ZhciByPXQuY2FsbCh0aGlzLG4sZSx0aGlzLmdldEF0dHJpYnV0ZU5TKHUuc3BhY2UsdS5sb2NhbCkpO3JldHVybiByJiZmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZU5TKHUuc3BhY2UsdS5sb2NhbCxyKG4pKX19dmFyIHU9dGEubnMucXVhbGlmeShuKTtyZXR1cm4gdGhpcy50d2VlbigiYXR0ci4iK24sdS5sb2NhbD9yOmUpfSxQbC5zdHlsZT1mdW5jdGlvbihuLGUscil7ZnVuY3Rpb24gdSgpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobil9ZnVuY3Rpb24gaShlKXtyZXR1cm4gbnVsbD09ZT91OihlKz0iIixmdW5jdGlvbigpe3ZhciB1LGk9dCh0aGlzKS5nZXRDb21wdXRlZFN0eWxlKHRoaXMsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuKTtyZXR1cm4gaSE9PWUmJih1PW11KGksZSksZnVuY3Rpb24odCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLHUodCkscil9KX0pfXZhciBvPWFyZ3VtZW50cy5sZW5ndGg7aWYoMz5vKXtpZigic3RyaW5nIiE9dHlwZW9mIG4pezI+byYmKGU9IiIpO2ZvcihyIGluIG4pdGhpcy5zdHlsZShyLG5bcl0sZSk7cmV0dXJuIHRoaXN9cj0iIn1yZXR1cm4gWm8odGhpcywic3R5bGUuIituLGUsaSl9LFBsLnN0eWxlVHdlZW49ZnVuY3Rpb24obixlLHIpe2Z1bmN0aW9uIHUodSxpKXt2YXIgbz1lLmNhbGwodGhpcyx1LGksdCh0aGlzKS5nZXRDb21wdXRlZFN0eWxlKHRoaXMsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuKSk7cmV0dXJuIG8mJmZ1bmN0aW9uKHQpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkobixvKHQpLHIpfX1yZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwzJiYocj0iIiksdGhpcy50d2Vlbigic3R5bGUuIituLHUpfSxQbC50ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBabyh0aGlzLCJ0ZXh0IixuLFZvKX0sUGwucmVtb3ZlPWZ1bmN0aW9uKCl7dmFyIG49dGhpcy5uYW1lc3BhY2U7cmV0dXJuIHRoaXMuZWFjaCgiZW5kLnRyYW5zaXRpb24iLGZ1bmN0aW9uKCl7dmFyIHQ7dGhpc1tuXS5jb3VudDwyJiYodD10aGlzLnBhcmVudE5vZGUpJiZ0LnJlbW92ZUNoaWxkKHRoaXMpfSl9LFBsLmVhc2U9ZnVuY3Rpb24obil7dmFyIHQ9dGhpcy5pZCxlPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/dGhpcy5ub2RlKClbZV1bdF0uZWFzZTooImZ1bmN0aW9uIiE9dHlwZW9mIG4mJihuPXRhLmVhc2UuYXBwbHkodGEsYXJndW1lbnRzKSksWSh0aGlzLGZ1bmN0aW9uKHIpe3JbZV1bdF0uZWFzZT1ufSkpfSxQbC5kZWxheT1mdW5jdGlvbihuKXt2YXIgdD10aGlzLmlkLGU9dGhpcy5uYW1lc3BhY2U7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MT90aGlzLm5vZGUoKVtlXVt0XS5kZWxheTpZKHRoaXMsImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24ocix1LGkpe3JbZV1bdF0uZGVsYXk9K24uY2FsbChyLHIuX19kYXRhX18sdSxpKX06KG49K24sZnVuY3Rpb24ocil7cltlXVt0XS5kZWxheT1ufSkpfSxQbC5kdXJhdGlvbj1mdW5jdGlvbihuKXt2YXIgdD10aGlzLmlkLGU9dGhpcy5uYW1lc3BhY2U7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MT90aGlzLm5vZGUoKVtlXVt0XS5kdXJhdGlvbjpZKHRoaXMsImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24ocix1LGkpe3JbZV1bdF0uZHVyYXRpb249TWF0aC5tYXgoMSxuLmNhbGwocixyLl9fZGF0YV9fLHUsaSkpfToobj1NYXRoLm1heCgxLG4pLGZ1bmN0aW9uKHIpe3JbZV1bdF0uZHVyYXRpb249bn0pKX0sUGwuZWFjaD1mdW5jdGlvbihuLHQpe3ZhciBlPXRoaXMuaWQscj10aGlzLm5hbWVzcGFjZTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciB1PVJsLGk9VGw7dHJ5e1RsPWUsWSh0aGlzLGZ1bmN0aW9uKHQsdSxpKXtSbD10W3JdW2VdLG4uY2FsbCh0LHQuX19kYXRhX18sdSxpKX0pfWZpbmFsbHl7Umw9dSxUbD1pfX1lbHNlIFkodGhpcyxmdW5jdGlvbih1KXt2YXIgaT11W3JdW2VdOyhpLmV2ZW50fHwoaS5ldmVudD10YS5kaXNwYXRjaCgic3RhcnQiLCJlbmQiLCJpbnRlcnJ1cHQiKSkpLm9uKG4sdCl9KTtyZXR1cm4gdGhpc30sUGwudHJhbnNpdGlvbj1mdW5jdGlvbigpe2Zvcih2YXIgbix0LGUscix1PXRoaXMuaWQsaT0rK1VsLG89dGhpcy5uYW1lc3BhY2UsYT1bXSxjPTAsbD10aGlzLmxlbmd0aDtsPmM7YysrKXthLnB1c2gobj1bXSk7Zm9yKHZhciB0PXRoaXNbY10scz0wLGY9dC5sZW5ndGg7Zj5zO3MrKykoZT10W3NdKSYmKHI9ZVtvXVt1XSwkbyhlLHMsbyxpLHt0aW1lOnIudGltZSxlYXNlOnIuZWFzZSxkZWxheTpyLmRlbGF5K3IuZHVyYXRpb24sZHVyYXRpb246ci5kdXJhdGlvbn0pKSxuLnB1c2goZSl9cmV0dXJuIFlvKGEsbyxpKX0sdGEuc3ZnLmF4aXM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe24uZWFjaChmdW5jdGlvbigpe3ZhciBuLGw9dGEuc2VsZWN0KHRoaXMpLHM9dGhpcy5fX2NoYXJ0X198fGUsZj10aGlzLl9fY2hhcnRfXz1lLmNvcHkoKSxoPW51bGw9PWM/Zi50aWNrcz9mLnRpY2tzLmFwcGx5KGYsYSk6Zi5kb21haW4oKTpjLGc9bnVsbD09dD9mLnRpY2tGb3JtYXQ/Zi50aWNrRm9ybWF0LmFwcGx5KGYsYSk6eTp0LHA9bC5zZWxlY3RBbGwoIi50aWNrIikuZGF0YShoLGYpLHY9cC5lbnRlcigpLmluc2VydCgiZyIsIi5kb21haW4iKS5hdHRyKCJjbGFzcyIsInRpY2siKS5zdHlsZSgib3BhY2l0eSIsQ2EpLGQ9dGEudHJhbnNpdGlvbihwLmV4aXQoKSkuc3R5bGUoIm9wYWNpdHkiLENhKS5yZW1vdmUoKSxtPXRhLnRyYW5zaXRpb24ocC5vcmRlcigpKS5zdHlsZSgib3BhY2l0eSIsMSksTT1NYXRoLm1heCh1LDApK28seD1VaShmKSxiPWwuc2VsZWN0QWxsKCIuZG9tYWluIikuZGF0YShbMF0pLF89KGIuZW50ZXIoKS5hcHBlbmQoInBhdGgiKS5hdHRyKCJjbGFzcyIsImRvbWFpbiIpLHRhLnRyYW5zaXRpb24oYikpO3YuYXBwZW5kKCJsaW5lIiksdi5hcHBlbmQoInRleHQiKTt2YXIgdyxTLGssRSxBPXYuc2VsZWN0KCJsaW5lIiksTj1tLnNlbGVjdCgibGluZSIpLEM9cC5zZWxlY3QoInRleHQiKS50ZXh0KGcpLHo9di5zZWxlY3QoInRleHQiKSxxPW0uc2VsZWN0KCJ0ZXh0IiksTD0idG9wIj09PXJ8fCJsZWZ0Ij09PXI/LTE6MTtpZigiYm90dG9tIj09PXJ8fCJ0b3AiPT09cj8obj1Cbyx3PSJ4IixrPSJ5IixTPSJ4MiIsRT0ieTIiLEMuYXR0cigiZHkiLDA+TD8iMGVtIjoiLjcxZW0iKS5zdHlsZSgidGV4dC1hbmNob3IiLCJtaWRkbGUiKSxfLmF0dHIoImQiLCJNIit4WzBdKyIsIitMKmkrIlYwSCIreFsxXSsiViIrTCppKSk6KG49V28sdz0ieSIsaz0ieCIsUz0ieTIiLEU9IngyIixDLmF0dHIoImR5IiwiLjMyZW0iKS5zdHlsZSgidGV4dC1hbmNob3IiLDA+TD8iZW5kIjoic3RhcnQiKSxfLmF0dHIoImQiLCJNIitMKmkrIiwiK3hbMF0rIkgwViIreFsxXSsiSCIrTCppKSksQS5hdHRyKEUsTCp1KSx6LmF0dHIoayxMKk0pLE4uYXR0cihTLDApLmF0dHIoRSxMKnUpLHEuYXR0cih3LDApLmF0dHIoayxMKk0pLGYucmFuZ2VCYW5kKXt2YXIgVD1mLFI9VC5yYW5nZUJhbmQoKS8yO3M9Zj1mdW5jdGlvbihuKXtyZXR1cm4gVChuKStSfX1lbHNlIHMucmFuZ2VCYW5kP3M9ZjpkLmNhbGwobixmLHMpO3YuY2FsbChuLHMsZiksbS5jYWxsKG4sZixmKX0pfXZhciB0LGU9dGEuc2NhbGUubGluZWFyKCkscj1qbCx1PTYsaT02LG89MyxhPVsxMF0sYz1udWxsO3JldHVybiBuLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbik6ZX0sbi5vcmllbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCBpbiBGbD90KyIiOmpsLG4pOnJ9LG4udGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1hcmd1bWVudHMsbik6YX0sbi50aWNrVmFsdWVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPXQsbik6Y30sbi50aWNrRm9ybWF0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsbik6dH0sbi50aWNrU2l6ZT1mdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoO3JldHVybiBlPyh1PSt0LGk9K2FyZ3VtZW50c1tlLTFdLG4pOnV9LG4uaW5uZXJUaWNrU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0rdCxuKTp1fSxuLm91dGVyVGlja1NpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3Qsbik6aX0sbi50aWNrUGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0rdCxuKTpvfSxuLnRpY2tTdWJkaXZpZGU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCYmbn0sbn07dmFyIGpsPSJib3R0b20iLEZsPXt0b3A6MSxyaWdodDoxLGJvdHRvbToxLGxlZnQ6MX07dGEuc3ZnLmJydXNoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih0KXt0LmVhY2goZnVuY3Rpb24oKXt2YXIgdD10YS5zZWxlY3QodGhpcykuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKS5vbigibW91c2Vkb3duLmJydXNoIixpKS5vbigidG91Y2hzdGFydC5icnVzaCIsaSksbz10LnNlbGVjdEFsbCgiLmJhY2tncm91bmQiKS5kYXRhKFswXSk7by5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwiYmFja2dyb3VuZCIpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIikuc3R5bGUoImN1cnNvciIsImNyb3NzaGFpciIpLHQuc2VsZWN0QWxsKCIuZXh0ZW50IikuZGF0YShbMF0pLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJleHRlbnQiKS5zdHlsZSgiY3Vyc29yIiwibW92ZSIpO3ZhciBhPXQuc2VsZWN0QWxsKCIucmVzaXplIikuZGF0YSh2LHkpO2EuZXhpdCgpLnJlbW92ZSgpLGEuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsZnVuY3Rpb24obil7cmV0dXJuInJlc2l6ZSAiK259KS5zdHlsZSgiY3Vyc29yIixmdW5jdGlvbihuKXtyZXR1cm4gSGxbbl19KS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IixmdW5jdGlvbihuKXtyZXR1cm4vW2V3XSQvLnRlc3Qobik/LTM6bnVsbH0pLmF0dHIoInkiLGZ1bmN0aW9uKG4pe3JldHVybi9eW25zXS8udGVzdChuKT8tMzpudWxsfSkuYXR0cigid2lkdGgiLDYpLmF0dHIoImhlaWdodCIsNikuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKSxhLnN0eWxlKCJkaXNwbGF5IixuLmVtcHR5KCk/Im5vbmUiOm51bGwpO3ZhciBjLGY9dGEudHJhbnNpdGlvbih0KSxoPXRhLnRyYW5zaXRpb24obyk7bCYmKGM9VWkobCksaC5hdHRyKCJ4IixjWzBdKS5hdHRyKCJ3aWR0aCIsY1sxXS1jWzBdKSxyKGYpKSxzJiYoYz1VaShzKSxoLmF0dHIoInkiLGNbMF0pLmF0dHIoImhlaWdodCIsY1sxXS1jWzBdKSx1KGYpKSxlKGYpfSl9ZnVuY3Rpb24gZShuKXtuLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24obil7cmV0dXJuInRyYW5zbGF0ZSgiK2ZbKy9lJC8udGVzdChuKV0rIiwiK2hbKy9ecy8udGVzdChuKV0rIikifSl9ZnVuY3Rpb24gcihuKXtuLnNlbGVjdCgiLmV4dGVudCIpLmF0dHIoIngiLGZbMF0pLG4uc2VsZWN0QWxsKCIuZXh0ZW50LC5uPnJlY3QsLnM+cmVjdCIpLmF0dHIoIndpZHRoIixmWzFdLWZbMF0pfWZ1bmN0aW9uIHUobil7bi5zZWxlY3QoIi5leHRlbnQiKS5hdHRyKCJ5IixoWzBdKSxuLnNlbGVjdEFsbCgiLmV4dGVudCwuZT5yZWN0LC53PnJlY3QiKS5hdHRyKCJoZWlnaHQiLGhbMV0taFswXSl9ZnVuY3Rpb24gaSgpe2Z1bmN0aW9uIGkoKXszMj09dGEuZXZlbnQua2V5Q29kZSYmKEN8fChNPW51bGwscVswXS09ZlsxXSxxWzFdLT1oWzFdLEM9MiksUygpKX1mdW5jdGlvbiB2KCl7MzI9PXRhLmV2ZW50LmtleUNvZGUmJjI9PUMmJihxWzBdKz1mWzFdLHFbMV0rPWhbMV0sQz0wLFMoKSl9ZnVuY3Rpb24gZCgpe3ZhciBuPXRhLm1vdXNlKGIpLHQ9ITE7eCYmKG5bMF0rPXhbMF0sblsxXSs9eFsxXSksQ3x8KHRhLmV2ZW50LmFsdEtleT8oTXx8KE09WyhmWzBdK2ZbMV0pLzIsKGhbMF0raFsxXSkvMl0pLHFbMF09ZlsrKG5bMF08TVswXSldLHFbMV09aFsrKG5bMV08TVsxXSldKTpNPW51bGwpLEEmJm0obixsLDApJiYocihrKSx0PSEwKSxOJiZtKG4scywxKSYmKHUoayksdD0hMCksdCYmKGUoayksdyh7dHlwZToiYnJ1c2giLG1vZGU6Qz8ibW92ZSI6InJlc2l6ZSJ9KSl9ZnVuY3Rpb24gbShuLHQsZSl7dmFyIHIsdSxpPVVpKHQpLGM9aVswXSxsPWlbMV0scz1xW2VdLHY9ZT9oOmYsZD12WzFdLXZbMF07cmV0dXJuIEMmJihjLT1zLGwtPWQrcykscj0oZT9wOmcpP01hdGgubWF4KGMsTWF0aC5taW4obCxuW2VdKSk6bltlXSxDP3U9KHIrPXMpK2Q6KE0mJihzPU1hdGgubWF4KGMsTWF0aC5taW4obCwyKk1bZV0tcikpKSxyPnM/KHU9cixyPXMpOnU9cyksdlswXSE9cnx8dlsxXSE9dT8oZT9hPW51bGw6bz1udWxsLHZbMF09cix2WzFdPXUsITApOnZvaWQgMH1mdW5jdGlvbiB5KCl7ZCgpLGsuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuc2VsZWN0QWxsKCIucmVzaXplIikuc3R5bGUoImRpc3BsYXkiLG4uZW1wdHkoKT8ibm9uZSI6bnVsbCksdGEuc2VsZWN0KCJib2R5Iikuc3R5bGUoImN1cnNvciIsbnVsbCksTC5vbigibW91c2Vtb3ZlLmJydXNoIixudWxsKS5vbigibW91c2V1cC5icnVzaCIsbnVsbCkub24oInRvdWNobW92ZS5icnVzaCIsbnVsbCkub24oInRvdWNoZW5kLmJydXNoIixudWxsKS5vbigia2V5ZG93bi5icnVzaCIsbnVsbCkub24oImtleXVwLmJydXNoIixudWxsKSx6KCksdyh7dHlwZToiYnJ1c2hlbmQifSl9dmFyIE0seCxiPXRoaXMsXz10YS5zZWxlY3QodGEuZXZlbnQudGFyZ2V0KSx3PWMub2YoYixhcmd1bWVudHMpLGs9dGEuc2VsZWN0KGIpLEU9Xy5kYXR1bSgpLEE9IS9eKG58cykkLy50ZXN0KEUpJiZsLE49IS9eKGV8dykkLy50ZXN0KEUpJiZzLEM9Xy5jbGFzc2VkKCJleHRlbnQiKSx6PVcoYikscT10YS5tb3VzZShiKSxMPXRhLnNlbGVjdCh0KGIpKS5vbigia2V5ZG93bi5icnVzaCIsaSkub24oImtleXVwLmJydXNoIix2KTtpZih0YS5ldmVudC5jaGFuZ2VkVG91Y2hlcz9MLm9uKCJ0b3VjaG1vdmUuYnJ1c2giLGQpLm9uKCJ0b3VjaGVuZC5icnVzaCIseSk6TC5vbigibW91c2Vtb3ZlLmJydXNoIixkKS5vbigibW91c2V1cC5icnVzaCIseSksay5pbnRlcnJ1cHQoKS5zZWxlY3RBbGwoIioiKS5pbnRlcnJ1cHQoKSxDKXFbMF09ZlswXS1xWzBdLHFbMV09aFswXS1xWzFdO2Vsc2UgaWYoRSl7dmFyIFQ9Ky93JC8udGVzdChFKSxSPSsvXm4vLnRlc3QoRSk7eD1bZlsxLVRdLXFbMF0saFsxLVJdLXFbMV1dLHFbMF09ZltUXSxxWzFdPWhbUl19ZWxzZSB0YS5ldmVudC5hbHRLZXkmJihNPXEuc2xpY2UoKSk7ay5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJub25lIikuc2VsZWN0QWxsKCIucmVzaXplIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLHRhLnNlbGVjdCgiYm9keSIpLnN0eWxlKCJjdXJzb3IiLF8uc3R5bGUoImN1cnNvciIpKSx3KHt0eXBlOiJicnVzaHN0YXJ0In0pLGQoKX12YXIgbyxhLGM9RShuLCJicnVzaHN0YXJ0IiwiYnJ1c2giLCJicnVzaGVuZCIpLGw9bnVsbCxzPW51bGwsZj1bMCwwXSxoPVswLDBdLGc9ITAscD0hMCx2PU9sWzBdO3JldHVybiBuLmV2ZW50PWZ1bmN0aW9uKG4pe24uZWFjaChmdW5jdGlvbigpe3ZhciBuPWMub2YodGhpcyxhcmd1bWVudHMpLHQ9e3g6Zix5OmgsaTpvLGo6YX0sZT10aGlzLl9fY2hhcnRfX3x8dDt0aGlzLl9fY2hhcnRfXz10LFRsP3RhLnNlbGVjdCh0aGlzKS50cmFuc2l0aW9uKCkuZWFjaCgic3RhcnQuYnJ1c2giLGZ1bmN0aW9uKCl7bz1lLmksYT1lLmosZj1lLngsaD1lLnksbih7dHlwZToiYnJ1c2hzdGFydCJ9KX0pLnR3ZWVuKCJicnVzaDpicnVzaCIsZnVuY3Rpb24oKXt2YXIgZT15dShmLHQueCkscj15dShoLHQueSk7cmV0dXJuIG89YT1udWxsLGZ1bmN0aW9uKHUpe2Y9dC54PWUodSksaD10Lnk9cih1KSxuKHt0eXBlOiJicnVzaCIsbW9kZToicmVzaXplIn0pfX0pLmVhY2goImVuZC5icnVzaCIsZnVuY3Rpb24oKXtvPXQuaSxhPXQuaixuKHt0eXBlOiJicnVzaCIsbW9kZToicmVzaXplIn0pLG4oe3R5cGU6ImJydXNoZW5kIn0pfSk6KG4oe3R5cGU6ImJydXNoc3RhcnQifSksbih7dHlwZToiYnJ1c2giLG1vZGU6InJlc2l6ZSJ9KSxuKHt0eXBlOiJicnVzaGVuZCJ9KSl9KX0sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPXQsdj1PbFshbDw8MXwhc10sbik6bH0sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPXQsdj1PbFshbDw8MXwhc10sbik6c30sbi5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obCYmcz8oZz0hIXRbMF0scD0hIXRbMV0pOmw/Zz0hIXQ6cyYmKHA9ISF0KSxuKTpsJiZzP1tnLHBdOmw/ZzpzP3A6bnVsbH0sbi5leHRlbnQ9ZnVuY3Rpb24odCl7dmFyIGUscix1LGksYztyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obCYmKGU9dFswXSxyPXRbMV0scyYmKGU9ZVswXSxyPXJbMF0pLG89W2Uscl0sbC5pbnZlcnQmJihlPWwoZSkscj1sKHIpKSxlPnImJihjPWUsZT1yLHI9YyksKGUhPWZbMF18fHIhPWZbMV0pJiYoZj1bZSxyXSkpLHMmJih1PXRbMF0saT10WzFdLGwmJih1PXVbMV0saT1pWzFdKSxhPVt1LGldLHMuaW52ZXJ0JiYodT1zKHUpLGk9cyhpKSksdT5pJiYoYz11LHU9aSxpPWMpLCh1IT1oWzBdfHxpIT1oWzFdKSYmKGg9W3UsaV0pKSxuKToobCYmKG8/KGU9b1swXSxyPW9bMV0pOihlPWZbMF0scj1mWzFdLGwuaW52ZXJ0JiYoZT1sLmludmVydChlKSxyPWwuaW52ZXJ0KHIpKSxlPnImJihjPWUsZT1yLHI9YykpKSxzJiYoYT8odT1hWzBdLGk9YVsxXSk6KHU9aFswXSxpPWhbMV0scy5pbnZlcnQmJih1PXMuaW52ZXJ0KHUpLGk9cy5pbnZlcnQoaSkpLHU+aSYmKGM9dSx1PWksaT1jKSkpLGwmJnM/W1tlLHVdLFtyLGldXTpsP1tlLHJdOnMmJlt1LGldKX0sbi5jbGVhcj1mdW5jdGlvbigpe3JldHVybiBuLmVtcHR5KCl8fChmPVswLDBdLGg9WzAsMF0sbz1hPW51bGwpLG59LG4uZW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4hIWwmJmZbMF09PWZbMV18fCEhcyYmaFswXT09aFsxXX0sdGEucmViaW5kKG4sYywib24iKX07dmFyIEhsPXtuOiJucy1yZXNpemUiLGU6ImV3LXJlc2l6ZSIsczoibnMtcmVzaXplIix3OiJldy1yZXNpemUiLG53OiJud3NlLXJlc2l6ZSIsbmU6Im5lc3ctcmVzaXplIixzZToibndzZS1yZXNpemUiLHN3OiJuZXN3LXJlc2l6ZSJ9LE9sPVtbIm4iLCJlIiwicyIsInciLCJudyIsIm5lIiwic2UiLCJzdyJdLFsiZSIsInciXSxbIm4iLCJzIl0sW11dLElsPWFjLmZvcm1hdD1nYy50aW1lRm9ybWF0LFlsPUlsLnV0YyxabD1ZbCgiJVktJW0tJWRUJUg6JU06JVMuJUxaIik7SWwuaXNvPURhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nJiYrbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpP0pvOlpsLEpvLnBhcnNlPWZ1bmN0aW9uKG4pe3ZhciB0PW5ldyBEYXRlKG4pO3JldHVybiBpc05hTih0KT9udWxsOnR9LEpvLnRvU3RyaW5nPVpsLnRvU3RyaW5nLGFjLnNlY29uZD1GdChmdW5jdGlvbihuKXtyZXR1cm4gbmV3IGNjKDFlMypNYXRoLmZsb29yKG4vMWUzKSl9LGZ1bmN0aW9uKG4sdCl7bi5zZXRUaW1lKG4uZ2V0VGltZSgpKzFlMypNYXRoLmZsb29yKHQpKX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0U2Vjb25kcygpfSksYWMuc2Vjb25kcz1hYy5zZWNvbmQucmFuZ2UsYWMuc2Vjb25kcy51dGM9YWMuc2Vjb25kLnV0Yy5yYW5nZSxhYy5taW51dGU9RnQoZnVuY3Rpb24obil7cmV0dXJuIG5ldyBjYyg2ZTQqTWF0aC5mbG9vcihuLzZlNCkpfSxmdW5jdGlvbihuLHQpe24uc2V0VGltZShuLmdldFRpbWUoKSs2ZTQqTWF0aC5mbG9vcih0KSl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1pbnV0ZXMoKX0pLGFjLm1pbnV0ZXM9YWMubWludXRlLnJhbmdlLGFjLm1pbnV0ZXMudXRjPWFjLm1pbnV0ZS51dGMucmFuZ2UsYWMuaG91cj1GdChmdW5jdGlvbihuKXt2YXIgdD1uLmdldFRpbWV6b25lT2Zmc2V0KCkvNjA7cmV0dXJuIG5ldyBjYygzNmU1KihNYXRoLmZsb29yKG4vMzZlNS10KSt0KSl9LGZ1bmN0aW9uKG4sdCl7bi5zZXRUaW1lKG4uZ2V0VGltZSgpKzM2ZTUqTWF0aC5mbG9vcih0KSl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldEhvdXJzKCl9KSxhYy5ob3Vycz1hYy5ob3VyLnJhbmdlLGFjLmhvdXJzLnV0Yz1hYy5ob3VyLnV0Yy5yYW5nZSxhYy5tb250aD1GdChmdW5jdGlvbihuKXtyZXR1cm4gbj1hYy5kYXkobiksbi5zZXREYXRlKDEpLG59LGZ1bmN0aW9uKG4sdCl7bi5zZXRNb250aChuLmdldE1vbnRoKCkrdCl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1vbnRoKCl9KSxhYy5tb250aHM9YWMubW9udGgucmFuZ2UsYWMubW9udGhzLnV0Yz1hYy5tb250aC51dGMucmFuZ2U7dmFyIFZsPVsxZTMsNWUzLDE1ZTMsM2U0LDZlNCwzZTUsOWU1LDE4ZTUsMzZlNSwxMDhlNSwyMTZlNSw0MzJlNSw4NjRlNSwxNzI4ZTUsNjA0OGU1LDI1OTJlNiw3Nzc2ZTYsMzE1MzZlNl0sWGw9W1thYy5zZWNvbmQsMV0sW2FjLnNlY29uZCw1XSxbYWMuc2Vjb25kLDE1XSxbYWMuc2Vjb25kLDMwXSxbYWMubWludXRlLDFdLFthYy5taW51dGUsNV0sW2FjLm1pbnV0ZSwxNV0sW2FjLm1pbnV0ZSwzMF0sW2FjLmhvdXIsMV0sW2FjLmhvdXIsM10sW2FjLmhvdXIsNl0sW2FjLmhvdXIsMTJdLFthYy5kYXksMV0sW2FjLmRheSwyXSxbYWMud2VlaywxXSxbYWMubW9udGgsMV0sW2FjLm1vbnRoLDNdLFthYy55ZWFyLDFdXSwkbD1JbC5tdWx0aShbWyIuJUwiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1pbGxpc2Vjb25kcygpfV0sWyI6JVMiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFNlY29uZHMoKX1dLFsiJUk6JU0iLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1pbnV0ZXMoKX1dLFsiJUkgJXAiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldEhvdXJzKCl9XSxbIiVhICVkIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXREYXkoKSYmMSE9bi5nZXREYXRlKCl9XSxbIiViICVkIixmdW5jdGlvbihuKXtyZXR1cm4gMSE9bi5nZXREYXRlKCl9XSxbIiVCIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRNb250aCgpfV0sWyIlWSIsTmVdXSksQmw9e3JhbmdlOmZ1bmN0aW9uKG4sdCxlKXtyZXR1cm4gdGEucmFuZ2UoTWF0aC5jZWlsKG4vZSkqZSwrdCxlKS5tYXAoS28pfSxmbG9vcjp5LGNlaWw6eX07WGwueWVhcj1hYy55ZWFyLGFjLnNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIEdvKHRhLnNjYWxlLmxpbmVhcigpLFhsLCRsKX07dmFyIFdsPVhsLm1hcChmdW5jdGlvbihuKXtyZXR1cm5bblswXS51dGMsblsxXV19KSxKbD1ZbC5tdWx0aShbWyIuJUwiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ01pbGxpc2Vjb25kcygpfV0sWyI6JVMiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ1NlY29uZHMoKX1dLFsiJUk6JU0iLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ01pbnV0ZXMoKX1dLFsiJUkgJXAiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ0hvdXJzKCl9XSxbIiVhICVkIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENEYXkoKSYmMSE9bi5nZXRVVENEYXRlKCl9XSxbIiViICVkIixmdW5jdGlvbihuKXtyZXR1cm4gMSE9bi5nZXRVVENEYXRlKCl9XSxbIiVCIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENNb250aCgpfV0sWyIlWSIsTmVdXSk7V2wueWVhcj1hYy55ZWFyLnV0YyxhYy5zY2FsZS51dGM9ZnVuY3Rpb24oKXtyZXR1cm4gR28odGEuc2NhbGUubGluZWFyKCksV2wsSmwpfSx0YS50ZXh0PUF0KGZ1bmN0aW9uKG4pe3JldHVybiBuLnJlc3BvbnNlVGV4dH0pLHRhLmpzb249ZnVuY3Rpb24obix0KXtyZXR1cm4gTnQobiwiYXBwbGljYXRpb24vanNvbiIsUW8sdCl9LHRhLmh0bWw9ZnVuY3Rpb24obix0KXtyZXR1cm4gTnQobiwidGV4dC9odG1sIixuYSx0KX0sdGEueG1sPUF0KGZ1bmN0aW9uKG4pe3JldHVybiBuLnJlc3BvbnNlWE1MfSksImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUodGEpOiJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cyYmKG1vZHVsZS5leHBvcnRzPXRhKSx0aGlzLmQzPXRhfSgpOw=="></script>
<link href="data:text/css;charset=utf-8,%2Eparcoords%20%3E%20svg%2C%20%2Eparcoords%20%3E%20canvas%20%7B%0Afont%3A%2014px%20sans%2Dserif%3B%0Aposition%3A%20absolute%3B%0A%7D%0A%2Eparcoords%20%3E%20canvas%20%7B%0Apointer%2Devents%3A%20none%3B%0A%7D%0A%2Eparcoords%20text%2Elabel%20%7B%0Acursor%3A%20default%3B%0A%7D%0A%2Eparcoords%20rect%2Ebackground%20%7B%0Afill%3A%20transparent%3B%0A%7D%0A%2Eparcoords%20rect%2Ebackground%3Ahover%20%7B%0Afill%3A%20rgba%28120%2C120%2C120%2C0%2E2%29%3B%0A%7D%0A%2Eparcoords%20%2Eresize%20rect%20%7B%0Afill%3A%20rgba%280%2C0%2C0%2C0%2E1%29%3B%0A%7D%0A%2Eparcoords%20rect%2Eextent%20%7B%0Afill%3A%20rgba%28255%2C255%2C255%2C0%2E25%29%3B%0Astroke%3A%20rgba%280%2C0%2C0%2C0%2E6%29%3B%0A%7D%0A%2Eparcoords%20%2Eaxis%20line%2C%20%2Eparcoords%20%2Eaxis%20path%20%7B%0Afill%3A%20none%3B%0Astroke%3A%20%23222%3B%0Ashape%2Drendering%3A%20crispEdges%3B%0A%7D%0A%2Eparcoords%20canvas%20%7B%0Aopacity%3A%201%3B%0A%2Dmoz%2Dtransition%3A%20opacity%200%2E3s%3B%0A%2Dwebkit%2Dtransition%3A%20opacity%200%2E3s%3B%0A%2Do%2Dtransition%3A%20opacity%200%2E3s%3B%0A%7D%0A%2Eparcoords%20canvas%2Efaded%20%7B%0Aopacity%3A%200%2E25%3B%0A%7D%0A%2Eparcoords%20%7B%0A%2Dwebkit%2Dtouch%2Dcallout%3A%20none%3B%0A%2Dwebkit%2Duser%2Dselect%3A%20none%3B%0A%2Dkhtml%2Duser%2Dselect%3A%20none%3B%0A%2Dmoz%2Duser%2Dselect%3A%20none%3B%0A%2Dms%2Duser%2Dselect%3A%20none%3B%0Auser%2Dselect%3A%20none%3B%0Abackground%2Dcolor%3A%20white%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uICgpIHsNCiAgZDMuc3ZnLm11bHRpYnJ1c2ggPSBmdW5jdGlvbigpIHsNCg0KICAgIC8vIEZyb20gZDMvc2NhbGUvc2NhbGUuanMNCiAgICBmdW5jdGlvbiBkM19zY2FsZUV4dGVudChkb21haW4pIHsNCiAgICAgIHZhciBzdGFydCA9IGRvbWFpblswXSwgc3RvcCA9IGRvbWFpbltkb21haW4ubGVuZ3RoIC0gMV07DQogICAgICByZXR1cm4gc3RhcnQgPCBzdG9wID8gWyBzdGFydCwgc3RvcCBdIDogWyBzdG9wLCBzdGFydCBdOw0KICAgIH0NCiAgICBmdW5jdGlvbiBkM19zY2FsZVJhbmdlKHNjYWxlKSB7DQogICAgICByZXR1cm4gc2NhbGUucmFuZ2VFeHRlbnQgPyBzY2FsZS5yYW5nZUV4dGVudCgpIDogZDNfc2NhbGVFeHRlbnQoc2NhbGUucmFuZ2UoKSk7DQogICAgfQ0KDQogICAgLy8gRnJvbSBkMw0KICAgIHZhciBkM19kb2N1bWVudCA9IHRoaXMuZG9jdW1lbnQ7DQogICAgZnVuY3Rpb24gZDNfZG9jdW1lbnRFbGVtZW50KG5vZGUpIHsNCiAgICAgIHJldHVybiBub2RlICYmIChub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZS5kb2N1bWVudCB8fCBub2RlKS5kb2N1bWVudEVsZW1lbnQ7DQogICAgfQ0KICAgIGZ1bmN0aW9uIGQzX3dpbmRvdyhub2RlKSB7DQogICAgICByZXR1cm4gbm9kZSAmJiAobm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCBub2RlLmRvY3VtZW50ICYmIG5vZGUgfHwgbm9kZS5kZWZhdWx0Vmlldyk7DQogICAgfQ0KICAgIGlmIChkM19kb2N1bWVudCkgew0KICAgICAgdHJ5IHsNCiAgICAgICAgZDNfYXJyYXkoZDNfZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMpWzBdLm5vZGVUeXBlOw0KICAgICAgfSBjYXRjaCAoZSkgew0KICAgICAgICBkM19hcnJheSA9IGZ1bmN0aW9uKGxpc3QpIHsNCiAgICAgICAgICB2YXIgaSA9IGxpc3QubGVuZ3RoLCBhcnJheSA9IG5ldyBBcnJheShpKTsNCiAgICAgICAgICB3aGlsZSAoaS0tKSBhcnJheVtpXSA9IGxpc3RbaV07DQogICAgICAgICAgcmV0dXJuIGFycmF5Ow0KICAgICAgICB9Ow0KICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGQzX2V2ZW50UHJldmVudERlZmF1bHQoKSB7DQogICAgICBkMy5ldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGQzX3ZlbmRvclN5bWJvbChvYmplY3QsIG5hbWUpIHsNCiAgICAgIGlmIChuYW1lIGluIG9iamVjdCkgcmV0dXJuIG5hbWU7DQogICAgICBuYW1lID0gbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSk7DQogICAgICBmb3IgKHZhciBpID0gMCwgbiA9IGQzX3ZlbmRvclByZWZpeGVzLmxlbmd0aDsgaSA8IG47ICsraSkgew0KICAgICAgICB2YXIgcHJlZml4TmFtZSA9IGQzX3ZlbmRvclByZWZpeGVzW2ldICsgbmFtZTsNCiAgICAgICAgaWYgKHByZWZpeE5hbWUgaW4gb2JqZWN0KSByZXR1cm4gcHJlZml4TmFtZTsNCiAgICAgIH0NCiAgICB9DQogICAgdmFyIGQzX3ZlbmRvclByZWZpeGVzID0gWyAid2Via2l0IiwgIm1zIiwgIm1veiIsICJNb3oiLCAibyIsICJPIiBdOw0KDQogICAgdmFyIGQzX2V2ZW50X2RyYWdTZWxlY3QgPSAib25zZWxlY3RzdGFydCIgaW4gZG9jdW1lbnQgPyBudWxsIDogZDNfdmVuZG9yU3ltYm9sKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSwgInVzZXJTZWxlY3QiKSwgZDNfZXZlbnRfZHJhZ0lkID0gMDsNCiAgICBmdW5jdGlvbiBkM19ldmVudF9kcmFnU3VwcHJlc3Mobm9kZSkgew0KICAgICAgdmFyIG5hbWUgPSAiLmRyYWdzdXBwcmVzcy0iICsgKytkM19ldmVudF9kcmFnSWQsIGNsaWNrID0gImNsaWNrIiArIG5hbWUsIHcgPSBkMy5zZWxlY3QoZDNfd2luZG93KG5vZGUpKS5vbigidG91Y2htb3ZlIiArIG5hbWUsIGQzX2V2ZW50UHJldmVudERlZmF1bHQpLm9uKCJkcmFnc3RhcnQiICsgbmFtZSwgZDNfZXZlbnRQcmV2ZW50RGVmYXVsdCkub24oInNlbGVjdHN0YXJ0IiArIG5hbWUsIGQzX2V2ZW50UHJldmVudERlZmF1bHQpOw0KICAgICAgaWYgKGQzX2V2ZW50X2RyYWdTZWxlY3QgPT0gbnVsbCkgew0KICAgICAgICBkM19ldmVudF9kcmFnU2VsZWN0ID0gIm9uc2VsZWN0c3RhcnQiIGluIG5vZGUgPyBmYWxzZSA6IGQzX3ZlbmRvclN5bWJvbChub2RlLnN0eWxlLCAidXNlclNlbGVjdCIpOw0KICAgICAgfQ0KICAgICAgaWYgKGQzX2V2ZW50X2RyYWdTZWxlY3QpIHsNCiAgICAgICAgdmFyIHN0eWxlID0gZDNfZG9jdW1lbnRFbGVtZW50KG5vZGUpLnN0eWxlLCBzZWxlY3QgPSBzdHlsZVtkM19ldmVudF9kcmFnU2VsZWN0XTsNCiAgICAgICAgc3R5bGVbZDNfZXZlbnRfZHJhZ1NlbGVjdF0gPSAibm9uZSI7DQogICAgICB9DQogICAgICByZXR1cm4gZnVuY3Rpb24oc3VwcHJlc3NDbGljaykgew0KICAgICAgICB3Lm9uKG5hbWUsIG51bGwpOw0KICAgICAgICBpZiAoZDNfZXZlbnRfZHJhZ1NlbGVjdCkgc3R5bGVbZDNfZXZlbnRfZHJhZ1NlbGVjdF0gPSBzZWxlY3Q7DQogICAgICAgIGlmIChzdXBwcmVzc0NsaWNrKSB7DQogICAgICAgICAgdmFyIG9mZiA9IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgdy5vbihjbGljaywgbnVsbCk7DQogICAgICAgICAgfTsNCiAgICAgICAgICB3Lm9uKGNsaWNrLCBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIGQzX2V2ZW50UHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgICAgIG9mZigpOw0KICAgICAgICAgIH0sIHRydWUpOw0KICAgICAgICAgIHNldFRpbWVvdXQob2ZmLCAwKTsNCiAgICAgICAgfQ0KICAgICAgfTsNCiAgICB9DQoNCiAgICB2YXIgZXZlbnQgPSBkMy5kaXNwYXRjaCgiYnJ1c2hzdGFydCIsICJicnVzaCIsICJicnVzaGVuZCIpLA0KICAgICAgICBicnVzaEVsZW1lbnQsDQogICAgICAgIHggPSBudWxsLCAvLyB4LXNjYWxlLCBvcHRpb25hbA0KICAgICAgICB5ID0gbnVsbCwgLy8geS1zY2FsZSwgb3B0aW9uYWwNCiAgICAgICAgeEV4dGVudCA9IFtbMCwgMF1dLCAvLyBbeDAsIHgxXSBpbiBpbnRlZ2VyIHBpeGVscw0KICAgICAgICB5RXh0ZW50ID0gW1swLCAwXV0sIC8vIFt5MCwgeTFdIGluIGludGVnZXIgcGl4ZWxzDQogICAgICAgIHhFeHRlbnREb21haW4gPSBbXSwgLy8geC1leHRlbnQgaW4gZGF0YSBzcGFjZQ0KICAgICAgICB5RXh0ZW50RG9tYWluID0gW10sIC8vIHktZXh0ZW50IGluIGRhdGEgc3BhY2UNCiAgICAgICAgeENsYW1wID0gdHJ1ZSwgLy8gd2hldGhlciB0byBjbGFtcCB0aGUgeC1leHRlbnQgdG8gdGhlIHJhbmdlDQogICAgICAgIHlDbGFtcCA9IHRydWUsIC8vIHdoZXRoZXIgdG8gY2xhbXAgdGhlIHktZXh0ZW50IHRvIHRoZSByYW5nZQ0KICAgICAgICByZXNpemVzID0gZDNfc3ZnX2JydXNoUmVzaXplc1swXSwNCiAgICAgICAgcmVzaXplQWRhcHRpb24gPSBmdW5jdGlvbiAoKSB7fSwgLy8gRnVuY3Rpb24gdG8gJ2NhbGwnIG9uIG5ldyByZXNpemUgc2VsZWN0aW9uDQogICAgICAgIGV4dGVudEFkYXB0aW9uID0gZnVuY3Rpb24gKCkge307IC8vIEZ1bmN0aW9uIHRvICdjYWxsJyBvbiBuZXcgZXh0ZW50IHNlbGVjdGlvbg0KDQogICAgZXZlbnQub2YgPSBmdW5jdGlvbih0aGl6LCBhcmd1bWVudHopIHsNCiAgICAgIHJldHVybiBmdW5jdGlvbihlMSkgew0KICAgICAgICB0cnkgew0KICAgICAgICAgIHZhciBlMCA9DQogICAgICAgICAgZTEuc291cmNlRXZlbnQgPSBkMy5ldmVudDsNCiAgICAgICAgICBlMS50YXJnZXQgPSBicnVzaDsNCiAgICAgICAgICBkMy5ldmVudCA9IGUxOw0KICAgICAgICAgIGV2ZW50W2UxLnR5cGVdLmFwcGx5KHRoaXosIGFyZ3VtZW50eik7DQogICAgICAgIH0gZmluYWxseSB7DQogICAgICAgICAgZDMuZXZlbnQgPSBlMDsNCiAgICAgICAgfQ0KICAgICAgfTsNCiAgICB9Ow0KDQogICAgZnVuY3Rpb24gYnJ1c2goZykgew0KICAgICAgZy5lYWNoKGZ1bmN0aW9uKCkgew0KDQogICAgICAgIC8vIFByZXBhcmUgdGhlIGJydXNoIGNvbnRhaW5lciBmb3IgZXZlbnRzLg0KICAgICAgICB2YXIgZyA9IGQzLnNlbGVjdCh0aGlzKQ0KICAgICAgICAgICAgLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsICJhbGwiKQ0KICAgICAgICAgICAgLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCAicmdiYSgwLDAsMCwwKSIpDQogICAgICAgICAgICAub24oIm1vdXNlZG93bi5icnVzaCIsIGJydXNoc3RhcnQpDQogICAgICAgICAgICAub24oInRvdWNoc3RhcnQuYnJ1c2giLCBicnVzaHN0YXJ0KTsNCg0KICAgICAgICBicnVzaEVsZW1lbnQgPSBnOw0KDQogICAgICAgIC8vIEFuIGludmlzaWJsZSwgbW91c2VhYmxlIGFyZWEgZm9yIHN0YXJ0aW5nIGEgbmV3IGJydXNoLg0KICAgICAgICB2YXIgYmFja2dyb3VuZCA9IGcuc2VsZWN0QWxsKCIuYmFja2dyb3VuZCIpDQogICAgICAgICAgICAuZGF0YShbMF0pOw0KDQogICAgICAgIGJhY2tncm91bmQuZW50ZXIoKS5hcHBlbmQoInJlY3QiKQ0KICAgICAgICAgICAgLmF0dHIoImNsYXNzIiwgImJhY2tncm91bmQiKQ0KICAgICAgICAgICAgLnN0eWxlKCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpDQogICAgICAgICAgICAuc3R5bGUoImN1cnNvciIsICJjcm9zc2hhaXIiKTsNCg0KICAgICAgICBkcmF3RXh0ZW50cyhnKTsNCg0KICAgICAgICAvLyBXaGVuIGNhbGxlZCBvbiBhIHRyYW5zaXRpb24sIHVzZSBhIHRyYW5zaXRpb24gdG8gdXBkYXRlLg0KICAgICAgICB2YXIgZ1VwZGF0ZSA9IGQzLnRyYW5zaXRpb24oZyksDQogICAgICAgICAgICBiYWNrZ3JvdW5kVXBkYXRlID0gZDMudHJhbnNpdGlvbihiYWNrZ3JvdW5kKSwNCiAgICAgICAgICAgIHJhbmdlOw0KDQogICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGJhY2tncm91bmQgdG8gZmlsbCB0aGUgZGVmaW5lZCByYW5nZS4NCiAgICAgICAgLy8gSWYgdGhlIHJhbmdlIGlzbid0IGRlZmluZWQsIHlvdSBjYW4gcG9zdC1wcm9jZXNzLg0KICAgICAgICBpZiAoeCkgew0KICAgICAgICAgIHJhbmdlID0gZDNfc2NhbGVSYW5nZSh4KTsNCiAgICAgICAgICBiYWNrZ3JvdW5kVXBkYXRlLmF0dHIoIngiLCByYW5nZVswXSkuYXR0cigid2lkdGgiLCByYW5nZVsxXSAtIHJhbmdlWzBdKTsNCiAgICAgICAgICByZWRyYXdYKGdVcGRhdGUpOw0KICAgICAgICB9DQogICAgICAgIGlmICh5KSB7DQogICAgICAgICAgcmFuZ2UgPSBkM19zY2FsZVJhbmdlKHkpOw0KICAgICAgICAgIGJhY2tncm91bmRVcGRhdGUuYXR0cigieSIsIHJhbmdlWzBdKS5hdHRyKCJoZWlnaHQiLCByYW5nZVsxXSAtIHJhbmdlWzBdKTsNCiAgICAgICAgICByZWRyYXdZKGdVcGRhdGUpOw0KICAgICAgICB9DQogICAgICAgIHJlZHJhdyhnVXBkYXRlKTsNCiAgICAgIH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGRyYXdFeHRlbnRzKGcpIHsNCiAgICAgIHZhciBleCA9IHhFeHRlbnQubGVuZ3RoID4geUV4dGVudC5sZW5ndGggPyB4RXh0ZW50IDogeUV4dGVudCwNCiAgICAgICAgICBpID0gZXgubGVuZ3RoDQogICAgICAgICAgZXh0ZW50QXJyID0gZXgubWFwKGZ1bmN0aW9uKGQsaSkgeyByZXR1cm4gaTsgfSksDQogICAgICAgICAgZXh0ZW50UmVzaXplcyA9IGQzLm1lcmdlKGV4Lm1hcChmdW5jdGlvbihkLGkpIHsgcmV0dXJuIHJlc2l6ZXMubWFwKGZ1bmN0aW9uKHIpIHsgcmV0dXJuIFtyLCBpXTsgfSk7IH0pKTsNCg0KICAgICAgaWYoIWcpIGcgPSBicnVzaEVsZW1lbnQ7DQoNCiAgICAgIC8vIFRoZSB2aXNpYmxlIGJydXNoIGV4dGVudDsgc3R5bGUgdGhpcyBhcyB5b3UgbGlrZSENCiAgICAgIHZhciBleHRlbnQgPSBnLnNlbGVjdEFsbCgiLmV4dGVudCIpDQogICAgICAgICAgLmRhdGEoZXh0ZW50QXJyLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gZDsgfSk7DQoNCiAgICAgIGV4dGVudC5leGl0KCkucmVtb3ZlKCk7DQoNCiAgICAgIGV4dGVudC5lbnRlcigpLmFwcGVuZCgicmVjdCIpDQogICAgICAgICAgLmF0dHIoImNsYXNzIiwgImV4dGVudCIpDQogICAgICAgICAgLnN0eWxlKCJjdXJzb3IiLCAibW92ZSIpDQogICAgICAgICAgLmNhbGwoZXh0ZW50QWRhcHRpb24pOw0KDQogICAgICAvLyBNb3JlIGludmlzaWJsZSByZWN0cyBmb3IgcmVzaXppbmcgdGhlIGV4dGVudC4NCiAgICAgIHZhciByZXNpemUgPSBnLnNlbGVjdEFsbCgiLnJlc2l6ZSIpDQogICAgICAgICAgLmRhdGEoZXh0ZW50UmVzaXplcywgZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGRbMF0gKyBkWzFdOyB9KTsNCg0KICAgICAgLy8gUmVtb3ZlIGFueSBzdXBlcmZsdW91cyByZXNpemVycy4NCiAgICAgIHJlc2l6ZS5leGl0KCkucmVtb3ZlKCk7DQoNCiAgICAgIHZhciBuZXdSZXNpemUgPSByZXNpemUuZW50ZXIoKS5hcHBlbmQoImciKQ0KICAgICAgICAgIC5hdHRyKCJjbGFzcyIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuICJyZXNpemUgIiArIGRbMF07IH0pDQogICAgICAgICAgLnN0eWxlKCJjdXJzb3IiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkM19zdmdfYnJ1c2hDdXJzb3JbZFswXV07IH0pOw0KDQogICAgICBuZXdSZXNpemUuYXBwZW5kKCJyZWN0IikNCiAgICAgICAgICAuYXR0cigieCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIC9bZXddJC8udGVzdChkWzBdKSA/IC0zIDogbnVsbDsgfSkNCiAgICAgICAgICAuYXR0cigieSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIC9eW25zXS8udGVzdChkWzBdKSA/IC0zIDogbnVsbDsgfSkNCiAgICAgICAgICAuYXR0cigid2lkdGgiLCA2KQ0KICAgICAgICAgIC5hdHRyKCJoZWlnaHQiLCA2KQ0KICAgICAgICAgIC5zdHlsZSgidmlzaWJpbGl0eSIsICJoaWRkZW4iKTsNCg0KICAgICAgbmV3UmVzaXplLmNhbGwocmVzaXplQWRhcHRpb24pOw0KDQogICAgICAvLyBTaG93IG9yIGhpZGUgdGhlIHJlc2l6ZXJzLg0KICAgICAgcmVzaXplLnN0eWxlKCJkaXNwbGF5IiwgZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGJydXNoLmVtcHR5KGRbMV0pID8gIm5vbmUiIDogbnVsbDsgfSk7DQogICAgfQ0KDQogICAgYnJ1c2guZXZlbnQgPSBmdW5jdGlvbihnKSB7DQogICAgICBnLmVhY2goZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBldmVudF8gPSBldmVudC5vZih0aGlzLCBhcmd1bWVudHMpLA0KICAgICAgICAgICAgZXh0ZW50MSA9IHt4OiB4RXh0ZW50LCB5OiB5RXh0ZW50LCBpOiB4RXh0ZW50RG9tYWluLCBqOiB5RXh0ZW50RG9tYWlufSwNCiAgICAgICAgICAgIGV4dGVudDAgPSB0aGlzLl9fY2hhcnRfXyB8fCBleHRlbnQxOw0KICAgICAgICB0aGlzLl9fY2hhcnRfXyA9IGV4dGVudDE7DQogICAgICAgIGlmIChkM190cmFuc2l0aW9uSW5oZXJpdElkKSB7DQogICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKQ0KICAgICAgICAgICAgICAuZWFjaCgic3RhcnQuYnJ1c2giLCBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB4RXh0ZW50RG9tYWluID0gZXh0ZW50MC5pOyAvLyBwcmUtdHJhbnNpdGlvbiBzdGF0ZQ0KICAgICAgICAgICAgICAgIHlFeHRlbnREb21haW4gPSBleHRlbnQwLmo7DQogICAgICAgICAgICAgICAgeEV4dGVudCA9IGV4dGVudDAueDsNCiAgICAgICAgICAgICAgICB5RXh0ZW50ID0gZXh0ZW50MC55Ow0KICAgICAgICAgICAgICAgIGV2ZW50Xyh7dHlwZTogImJydXNoc3RhcnQifSk7DQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIC50d2VlbigiYnJ1c2g6YnJ1c2giLCBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICAvLyBUT0RPOiB0cmFuc2l0aW9ucyBmb3IgYWxsIGV4dGVudHMNCiAgICAgICAgICAgICAgICB2YXIgeGkgPSBkM19pbnRlcnBvbGF0ZUFycmF5KHhFeHRlbnRbMF0sIGV4dGVudDEueFswXSksDQogICAgICAgICAgICAgICAgICAgIHlpID0gZDNfaW50ZXJwb2xhdGVBcnJheSh5RXh0ZW50WzBdLCBleHRlbnQxLnlbMF0pOw0KICAgICAgICAgICAgICAgIHhFeHRlbnREb21haW5bMF0gPSB5RXh0ZW50RG9tYWluWzBdID0gbnVsbDsgLy8gdHJhbnNpdGlvbiBzdGF0ZQ0KICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7DQogICAgICAgICAgICAgICAgICB4RXh0ZW50WzBdID0gZXh0ZW50MS54WzBdID0geGkodCk7DQogICAgICAgICAgICAgICAgICB5RXh0ZW50WzBdID0gZXh0ZW50MS55WzBdID0geWkodCk7DQogICAgICAgICAgICAgICAgICBldmVudF8oe3R5cGU6ICJicnVzaCIsIG1vZGU6ICJyZXNpemUifSk7DQogICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgLmVhY2goImVuZC5icnVzaCIsIGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIHhFeHRlbnREb21haW4gPSBleHRlbnQxLmk7IC8vIHBvc3QtdHJhbnNpdGlvbiBzdGF0ZQ0KICAgICAgICAgICAgICAgIHlFeHRlbnREb21haW4gPSBleHRlbnQxLmo7DQogICAgICAgICAgICAgICAgZXZlbnRfKHt0eXBlOiAiYnJ1c2giLCBtb2RlOiAicmVzaXplIn0pOw0KICAgICAgICAgICAgICAgIGV2ZW50Xyh7dHlwZTogImJydXNoZW5kIn0pOw0KICAgICAgICAgICAgICB9KTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICBldmVudF8oe3R5cGU6ICJicnVzaHN0YXJ0In0pOw0KICAgICAgICAgIGV2ZW50Xyh7dHlwZTogImJydXNoIiwgbW9kZTogInJlc2l6ZSJ9KTsNCiAgICAgICAgICBldmVudF8oe3R5cGU6ICJicnVzaGVuZCJ9KTsNCiAgICAgICAgfQ0KICAgICAgfSk7DQogICAgfTsNCg0KICAgIGZ1bmN0aW9uIHJlZHJhdyhnKSB7DQogICAgICBnLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgcmV0dXJuICJ0cmFuc2xhdGUoIiArIHhFeHRlbnRbZFsxXV1bKy9lJC8udGVzdChkWzBdKV0gKyAiLCIgKyB5RXh0ZW50W2RbMV1dWysvXnMvLnRlc3QoZFswXSldICsgIikiOw0KICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gcmVkcmF3WChnKSB7DQogICAgICBnLnNlbGVjdEFsbCgiLmV4dGVudCIpLmF0dHIoIngiLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4geEV4dGVudFtkXVswXTsgfSk7DQogICAgICBnLnNlbGVjdEFsbCgiLmV4dGVudCIpLmF0dHIoIndpZHRoIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4geEV4dGVudFtkXVsxXSAtIHhFeHRlbnRbZF1bMF07IH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHJlZHJhd1koZykgew0KICAgICAgZy5zZWxlY3RBbGwoIi5leHRlbnQiKS5hdHRyKCJ5IiwgZnVuY3Rpb24gKGQpIHsgcmV0dXJuIHlFeHRlbnRbZF1bMF07IH0pOw0KICAgICAgZy5zZWxlY3RBbGwoIi5leHRlbnQiKS5hdHRyKCJoZWlnaHQiLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4geUV4dGVudFtkXVsxXSAtIHlFeHRlbnRbZF1bMF07IH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGJydXNoc3RhcnQoKSB7DQogICAgICB2YXIgdGFyZ2V0ID0gdGhpcywNCiAgICAgICAgICBldmVudFRhcmdldCA9IGQzLnNlbGVjdChkMy5ldmVudC50YXJnZXQpLA0KICAgICAgICAgIGV2ZW50XyA9IGV2ZW50Lm9mKHRhcmdldCwgYXJndW1lbnRzKSwNCiAgICAgICAgICBnID0gZDMuc2VsZWN0KHRhcmdldCksDQogICAgICAgICAgcmVzaXppbmcgPSBldmVudFRhcmdldC5kYXR1bSgpWzBdLA0KICAgICAgICAgIHJlc2l6aW5nWCA9ICEvXihufHMpJC8udGVzdChyZXNpemluZykgJiYgeCwNCiAgICAgICAgICByZXNpemluZ1kgPSAhL14oZXx3KSQvLnRlc3QocmVzaXppbmcpICYmIHksDQogICAgICAgICAgZHJhZ2dpbmcgPSBldmVudFRhcmdldC5jbGFzc2VkKCJleHRlbnQiKSwNCiAgICAgICAgICBkcmFnUmVzdG9yZSA9IGQzX2V2ZW50X2RyYWdTdXBwcmVzcyh0YXJnZXQpLA0KICAgICAgICAgIGNlbnRlciwNCiAgICAgICAgICBvcmlnaW4gPSBkMy5tb3VzZSh0YXJnZXQpLA0KICAgICAgICAgIG9mZnNldCwNCiAgICAgICAgICBpOw0KDQogICAgICB2YXIgdyA9IGQzLnNlbGVjdCh3aW5kb3cpDQogICAgICAgICAgLm9uKCJrZXlkb3duLmJydXNoIiwga2V5ZG93bikNCiAgICAgICAgICAub24oImtleXVwLmJydXNoIiwga2V5dXApOw0KDQogICAgICBpZiAoZDMuZXZlbnQuY2hhbmdlZFRvdWNoZXMpIHsNCiAgICAgICAgdy5vbigidG91Y2htb3ZlLmJydXNoIiwgYnJ1c2htb3ZlKS5vbigidG91Y2hlbmQuYnJ1c2giLCBicnVzaGVuZCk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICB3Lm9uKCJtb3VzZW1vdmUuYnJ1c2giLCBicnVzaG1vdmUpLm9uKCJtb3VzZXVwLmJydXNoIiwgYnJ1c2hlbmQpOw0KICAgICAgfQ0KDQogICAgICAvLyBJbnRlcnJ1cHQgdGhlIHRyYW5zaXRpb24sIGlmIGFueS4NCiAgICAgIGcuaW50ZXJydXB0KCkuc2VsZWN0QWxsKCIqIikuaW50ZXJydXB0KCk7DQoNCiAgICAgIC8vIElmIHRoZSBleHRlbnQgd2FzIGNsaWNrZWQgb24sIGRyYWcgcmF0aGVyIHRoYW4gYnJ1c2g7DQogICAgICAvLyBzdG9yZSB0aGUgcG9pbnQgYmV0d2VlbiB0aGUgbW91c2UgYW5kIGV4dGVudCBvcmlnaW4gaW5zdGVhZC4NCiAgICAgIGlmIChkcmFnZ2luZykgew0KICAgICAgICBpID0gZXZlbnRUYXJnZXQuZGF0dW0oKTsNCiAgICAgICAgb3JpZ2luWzBdID0geEV4dGVudFtpXVswXSAtIG9yaWdpblswXTsNCiAgICAgICAgb3JpZ2luWzFdID0geUV4dGVudFtpXVswXSAtIG9yaWdpblsxXTsNCiAgICAgIH0NCg0KICAgICAgLy8gSWYgYSByZXNpemVyIHdhcyBjbGlja2VkIG9uLCByZWNvcmQgd2hpY2ggc2lkZSBpcyB0byBiZSByZXNpemVkLg0KICAgICAgLy8gQWxzbywgc2V0IHRoZSBvcmlnaW4gdG8gdGhlIG9wcG9zaXRlIHNpZGUuDQogICAgICBlbHNlIGlmIChyZXNpemluZykgew0KICAgICAgICB2YXIgZXggPSArL3ckLy50ZXN0KHJlc2l6aW5nKSwNCiAgICAgICAgICAgIGV5ID0gKy9ebi8udGVzdChyZXNpemluZyk7DQoNCiAgICAgICAgaSA9IGV2ZW50VGFyZ2V0LmRhdHVtKClbMV07DQogICAgICAgIG9mZnNldCA9IFt4RXh0ZW50W2ldWzEgLSBleF0gLSBvcmlnaW5bMF0sIHlFeHRlbnRbaV1bMSAtIGV5XSAtIG9yaWdpblsxXV07DQogICAgICAgIG9yaWdpblswXSA9IHhFeHRlbnRbaV1bZXhdOw0KICAgICAgICBvcmlnaW5bMV0gPSB5RXh0ZW50W2ldW2V5XTsNCiAgICAgIH0NCg0KICAgICAgZWxzZSB7DQogICAgICAgIGkgPSB4RXh0ZW50Lmxlbmd0aCAtIDE7IC8vIEZpZ3VyZSBvdXQgdGhlIGNvdW50IG9mIHRoZSBuZXcgZXh0ZW50Lg0KICAgICAgICB4RXh0ZW50LnB1c2goWzAsMF0pOw0KICAgICAgICB5RXh0ZW50LnB1c2goWzAsMF0pOw0KDQogICAgICAgIC8vIElmIHRoZSBBTFQga2V5IGlzIGRvd24gd2hlbiBzdGFydGluZyBhIGJydXNoLCB0aGUgY2VudGVyIGlzIGF0IHRoZSBtb3VzZS4NCiAgICAgICAgaWYgKGQzLmV2ZW50LmFsdEtleSkgY2VudGVyID0gb3JpZ2luLnNsaWNlKCk7DQogICAgICB9DQoNCiAgICAgIC8vIFByb3BhZ2F0ZSB0aGUgYWN0aXZlIGN1cnNvciB0byB0aGUgYm9keSBmb3IgdGhlIGRyYWcgZHVyYXRpb24uDQogICAgICBnLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsICJub25lIik7DQogICAgICBkMy5zZWxlY3QoImJvZHkiKS5zdHlsZSgiY3Vyc29yIiwgZXZlbnRUYXJnZXQuc3R5bGUoImN1cnNvciIpKTsNCg0KICAgICAgLy8gU2hvdyByZXNpemVycyBhcyBsb25nIGFzIHdlJ3JlIG5vdCBkcmFnZ2luZyBvciByZXNpemluZy4NCiAgICAgIGlmKCFkcmFnZ2luZyAmJiAhcmVzaXppbmcpIGcuc2VsZWN0QWxsKCIucmVzaXplIikuc3R5bGUoImRpc3BsYXkiLCBudWxsKQ0KDQogICAgICAvLyBOb3RpZnkgbGlzdGVuZXJzLg0KICAgICAgZXZlbnRfKHt0eXBlOiAiYnJ1c2hzdGFydCJ9KTsNCiAgICAgIGJydXNobW92ZSgpOw0KDQogICAgICBmdW5jdGlvbiBrZXlkb3duKCkgew0KICAgICAgICBpZiAoZDMuZXZlbnQua2V5Q29kZSA9PSAzMikgew0KICAgICAgICAgIGlmICghZHJhZ2dpbmcpIHsNCiAgICAgICAgICAgIGNlbnRlciA9IG51bGw7DQogICAgICAgICAgICBvcmlnaW5bMF0gLT0geEV4dGVudFtpXVsxXTsNCiAgICAgICAgICAgIG9yaWdpblsxXSAtPSB5RXh0ZW50W2ldWzFdOw0KICAgICAgICAgICAgZHJhZ2dpbmcgPSAyOw0KICAgICAgICAgIH0NCiAgICAgICAgICBkMy5ldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KICAgICAgICB9DQogICAgICB9DQoNCiAgICAgIGZ1bmN0aW9uIGtleXVwKCkgew0KICAgICAgICBpZiAoZDMuZXZlbnQua2V5Q29kZSA9PSAzMiAmJiBkcmFnZ2luZyA9PSAyKSB7DQogICAgICAgICAgb3JpZ2luWzBdICs9IHhFeHRlbnRbaV1bMV07DQogICAgICAgICAgb3JpZ2luWzFdICs9IHlFeHRlbnRbaV1bMV07DQogICAgICAgICAgZHJhZ2dpbmcgPSAwOw0KICAgICAgICAgIGQzLmV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgZnVuY3Rpb24gYnJ1c2htb3ZlKCkgew0KICAgICAgICB2YXIgcG9pbnQgPSBkMy5tb3VzZSh0YXJnZXQpLA0KICAgICAgICAgICAgbW92ZWQgPSBmYWxzZTsNCg0KICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgb2Zmc2V0IGZvciB0aGljayByZXNpemVycy4NCiAgICAgICAgaWYgKG9mZnNldCkgew0KICAgICAgICAgIHBvaW50WzBdICs9IG9mZnNldFswXTsNCiAgICAgICAgICBwb2ludFsxXSArPSBvZmZzZXRbMV07DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoIWRyYWdnaW5nKSB7DQoNCiAgICAgICAgICAvLyBJZiBuZWVkZWQsIGRldGVybWluZSB0aGUgY2VudGVyIGZyb20gdGhlIGN1cnJlbnQgZXh0ZW50Lg0KICAgICAgICAgIGlmIChkMy5ldmVudC5hbHRLZXkpIHsNCiAgICAgICAgICAgIGlmICghY2VudGVyKSBjZW50ZXIgPSBbKHhFeHRlbnRbaV1bMF0gKyB4RXh0ZW50W2ldWzFdKSAvIDIsICh5RXh0ZW50W2ldWzBdICsgeUV4dGVudFtpXVsxXSkgLyAyXTsNCg0KICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBvcmlnaW4sIGZvciB3aGVuIHRoZSBBTFQga2V5IGlzIHJlbGVhc2VkLg0KICAgICAgICAgICAgb3JpZ2luWzBdID0geEV4dGVudFtpXVsrKHBvaW50WzBdIDwgY2VudGVyWzBdKV07DQogICAgICAgICAgICBvcmlnaW5bMV0gPSB5RXh0ZW50W2ldWysocG9pbnRbMV0gPCBjZW50ZXJbMV0pXTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyBXaGVuIHRoZSBBTFQga2V5IGlzIHJlbGVhc2VkLCB3ZSBjbGVhciB0aGUgY2VudGVyLg0KICAgICAgICAgIGVsc2UgY2VudGVyID0gbnVsbDsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIFVwZGF0ZSB0aGUgYnJ1c2ggZXh0ZW50IGZvciBlYWNoIGRpbWVuc2lvbi4NCiAgICAgICAgaWYgKHJlc2l6aW5nWCAmJiBtb3ZlMShwb2ludCwgeCwgMCkpIHsNCiAgICAgICAgICByZWRyYXdYKGcsIGkpOw0KICAgICAgICAgIG1vdmVkID0gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAocmVzaXppbmdZICYmIG1vdmUxKHBvaW50LCB5LCAxKSkgew0KICAgICAgICAgIHJlZHJhd1koZywgaSk7DQogICAgICAgICAgbW92ZWQgPSB0cnVlOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gRmluYWwgcmVkcmF3IGFuZCBub3RpZnkgbGlzdGVuZXJzLg0KICAgICAgICBpZiAobW92ZWQpIHsNCiAgICAgICAgICByZWRyYXcoZyk7DQogICAgICAgICAgZXZlbnRfKHt0eXBlOiAiYnJ1c2giLCBtb2RlOiBkcmFnZ2luZyA/ICJtb3ZlIiA6ICJyZXNpemUifSk7DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgZnVuY3Rpb24gbW92ZTEocG9pbnQsIHNjYWxlLCBqKSB7DQogICAgICAgIHZhciByYW5nZSA9IGQzX3NjYWxlUmFuZ2Uoc2NhbGUpLA0KICAgICAgICAgICAgcjAgPSByYW5nZVswXSwNCiAgICAgICAgICAgIHIxID0gcmFuZ2VbMV0sDQogICAgICAgICAgICBwb3NpdGlvbiA9IG9yaWdpbltqXSwNCiAgICAgICAgICAgIGV4dGVudCA9IGogPyB5RXh0ZW50W2ldIDogeEV4dGVudFtpXSwNCiAgICAgICAgICAgIHNpemUgPSBleHRlbnRbMV0gLSBleHRlbnRbMF0sDQogICAgICAgICAgICBtaW4sDQogICAgICAgICAgICBtYXg7DQoNCiAgICAgICAgLy8gV2hlbiBkcmFnZ2luZywgcmVkdWNlIHRoZSByYW5nZSBieSB0aGUgZXh0ZW50IHNpemUgYW5kIHBvc2l0aW9uLg0KICAgICAgICBpZiAoZHJhZ2dpbmcpIHsNCiAgICAgICAgICByMCAtPSBwb3NpdGlvbjsNCiAgICAgICAgICByMSAtPSBzaXplICsgcG9zaXRpb247DQogICAgICAgIH0NCg0KICAgICAgICAvLyBDbGFtcCB0aGUgcG9pbnQgKHVubGVzcyBjbGFtcCBzZXQgdG8gZmFsc2UpIHNvIHRoYXQgdGhlIGV4dGVudCBmaXRzIHdpdGhpbiB0aGUgcmFuZ2UgZXh0ZW50Lg0KICAgICAgICBtaW4gPSAoaiA/IHlDbGFtcCA6IHhDbGFtcCkgPyBNYXRoLm1heChyMCwgTWF0aC5taW4ocjEsIHBvaW50W2pdKSkgOiBwb2ludFtqXTsNCg0KICAgICAgICAvLyBDb21wdXRlIHRoZSBuZXcgZXh0ZW50IGJvdW5kcy4NCiAgICAgICAgaWYgKGRyYWdnaW5nKSB7DQogICAgICAgICAgbWF4ID0gKG1pbiArPSBwb3NpdGlvbikgKyBzaXplOw0KICAgICAgICB9IGVsc2Ugew0KDQogICAgICAgICAgLy8gSWYgdGhlIEFMVCBrZXkgaXMgcHJlc3NlZCwgdGhlbiBwcmVzZXJ2ZSB0aGUgY2VudGVyIG9mIHRoZSBleHRlbnQuDQogICAgICAgICAgaWYgKGNlbnRlcikgcG9zaXRpb24gPSBNYXRoLm1heChyMCwgTWF0aC5taW4ocjEsIDIgKiBjZW50ZXJbal0gLSBtaW4pKTsNCg0KICAgICAgICAgIC8vIENvbXB1dGUgdGhlIG1pbiBhbmQgbWF4IG9mIHRoZSBwb3NpdGlvbiBhbmQgcG9pbnQuDQogICAgICAgICAgaWYgKHBvc2l0aW9uIDwgbWluKSB7DQogICAgICAgICAgICBtYXggPSBtaW47DQogICAgICAgICAgICBtaW4gPSBwb3NpdGlvbjsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgbWF4ID0gcG9zaXRpb247DQogICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8gVXBkYXRlIHRoZSBzdG9yZWQgYm91bmRzLg0KICAgICAgICBpZiAoZXh0ZW50WzBdICE9IG1pbiB8fCBleHRlbnRbMV0gIT0gbWF4KSB7DQogICAgICAgICAgaWYgKGopIHlFeHRlbnREb21haW5baV0gPSBudWxsOw0KICAgICAgICAgIGVsc2UgeEV4dGVudERvbWFpbltpXSA9IG51bGw7DQogICAgICAgICAgZXh0ZW50WzBdID0gbWluOw0KICAgICAgICAgIGV4dGVudFsxXSA9IG1heDsNCiAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgfQ0KDQogICAgICBmdW5jdGlvbiBicnVzaGVuZCgpIHsNCiAgICAgICAgYnJ1c2htb3ZlKCk7DQoNCiAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgZXh0ZW50IGlzIGVtcHR5LCBjbGVhciBldmVyeXRoaW5nLg0KICAgICAgICBpZih4ICYmIHhFeHRlbnRbaV1bMF0gPT0geEV4dGVudFtpXVsxXSB8fA0KICAgICAgICAgICB5ICYmIHlFeHRlbnRbaV1bMF0gPT0geUV4dGVudFtpXVsxXSkgew0KICAgICAgICAgIGJydXNoLmNsZWFyKCk7DQogICAgICAgIH0NCg0KICAgICAgICAvLyByZXNldCB0aGUgY3Vyc29yIHN0eWxlcw0KICAgICAgICBnLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsICJhbGwiKS5zZWxlY3RBbGwoIi5yZXNpemUiKS5zdHlsZSgiZGlzcGxheSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGJydXNoLmVtcHR5KGRbMV0pID8gIm5vbmUiIDogbnVsbDsgfSk7DQogICAgICAgIGQzLnNlbGVjdCgiYm9keSIpLnN0eWxlKCJjdXJzb3IiLCBudWxsKTsNCg0KICAgICAgICB3IC5vbigibW91c2Vtb3ZlLmJydXNoIiwgbnVsbCkNCiAgICAgICAgICAub24oIm1vdXNldXAuYnJ1c2giLCBudWxsKQ0KICAgICAgICAgIC5vbigidG91Y2htb3ZlLmJydXNoIiwgbnVsbCkNCiAgICAgICAgICAub24oInRvdWNoZW5kLmJydXNoIiwgbnVsbCkNCiAgICAgICAgICAub24oImtleWRvd24uYnJ1c2giLCBudWxsKQ0KICAgICAgICAgIC5vbigia2V5dXAuYnJ1c2giLCBudWxsKTsNCg0KICAgICAgICBkcmF3RXh0ZW50cygpOw0KDQogICAgICAgIGRyYWdSZXN0b3JlKCk7DQogICAgICAgIGV2ZW50Xyh7dHlwZTogImJydXNoZW5kIn0pOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIGJydXNoLnggPSBmdW5jdGlvbih6KSB7DQogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB4Ow0KICAgICAgeCA9IHo7DQogICAgICByZXNpemVzID0gZDNfc3ZnX2JydXNoUmVzaXplc1sheCA8PCAxIHwgIXldOyAvLyBmb3JlIQ0KICAgICAgcmV0dXJuIGJydXNoOw0KICAgIH07DQoNCiAgICBicnVzaC55ID0gZnVuY3Rpb24oeikgew0KICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geTsNCiAgICAgIHkgPSB6Ow0KICAgICAgcmVzaXplcyA9IGQzX3N2Z19icnVzaFJlc2l6ZXNbIXggPDwgMSB8ICF5XTsgLy8gZm9yZSENCiAgICAgIHJldHVybiBicnVzaDsNCiAgICB9Ow0KDQogICAgYnJ1c2gucmVzaXplQWRhcHRpb24gPSBmdW5jdGlvbih6KSB7DQogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByZXNpemVBZGFwdGlvbjsNCiAgICAgIHJlc2l6ZUFkYXB0aW9uID0gejsNCiAgICAgIHJldHVybiBicnVzaDsNCiAgICB9DQoNCiAgICBicnVzaC5leHRlbnRBZGFwdGlvbiA9IGZ1bmN0aW9uKHopIHsNCiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGV4dGVudEFkYXB0aW9uOw0KICAgICAgZXh0ZW50QWRhcHRpb24gPSB6Ow0KICAgICAgcmV0dXJuIGJydXNoOw0KICAgIH0NCg0KICAgIGJydXNoLmNsYW1wID0gZnVuY3Rpb24oeikgew0KICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geCAmJiB5ID8gW3hDbGFtcCwgeUNsYW1wXSA6IHggPyB4Q2xhbXAgOiB5ID8geUNsYW1wIDogbnVsbDsNCiAgICAgIGlmICh4ICYmIHkpIHhDbGFtcCA9ICEhelswXSwgeUNsYW1wID0gISF6WzFdOw0KICAgICAgZWxzZSBpZiAoeCkgeENsYW1wID0gISF6Ow0KICAgICAgZWxzZSBpZiAoeSkgeUNsYW1wID0gISF6Ow0KICAgICAgcmV0dXJuIGJydXNoOw0KICAgIH07DQoNCiAgICBicnVzaC5leHRlbnQgPSBmdW5jdGlvbih6KSB7DQogICAgICB2YXIgeDAsIHgxLCB5MCwgeTEsIHQ7DQogICAgICB2YXIgeE91dHB1dCwgeU91dHB1dCwgeHlPdXRwdXQgPSBbXTsNCg0KICAgICAgLy8gSW52ZXJ0IHRoZSBwaXhlbCBleHRlbnQgdG8gZGF0YS1zcGFjZS4NCiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgew0KICAgICAgICBpZiAoeCkgew0KICAgICAgICAgIGlmICh4RXh0ZW50RG9tYWluWzBdKSB7DQogICAgICAgICAgICB4T3V0cHV0ID0geEV4dGVudERvbWFpbjsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgeE91dHB1dCA9IHhFeHRlbnQubWFwKGZ1bmN0aW9uIChkKSB7DQogICAgICAgICAgICAgIGlmICh4LmludmVydCkgcmV0dXJuIFsgeC5pbnZlcnQoZFswXSksIHguaW52ZXJ0KGRbMV0pIF07DQogICAgICAgICAgICAgIHJldHVybiBkOw0KICAgICAgICAgICAgfSkubWFwKGZ1bmN0aW9uIChkKSB7DQogICAgICAgICAgICAgIGlmIChkWzFdIDwgZFswXSkgcmV0dXJuIFsgZFsxXSwgZFswXSBdOw0KICAgICAgICAgICAgICByZXR1cm4gZDsNCiAgICAgICAgICAgIH0pLmZpbHRlcihmdW5jdGlvbiAoZCkgeyByZXR1cm4gZFsxXSAtIGRbMF0gIT0gMDsgfSk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmICh5KSB7DQogICAgICAgICAgaWYgKHlFeHRlbnREb21haW5bMF0pIHsNCiAgICAgICAgICAgIHlPdXRwdXQgPSB5RXh0ZW50RG9tYWluOw0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB5T3V0cHV0ID0geUV4dGVudC5tYXAoZnVuY3Rpb24gKGQpIHsNCiAgICAgICAgICAgICAgaWYoeS5pbnZlcnQpIHJldHVybiBbIHkuaW52ZXJ0KGRbMF0pLCB5LmludmVydChkWzFdKSBdOw0KICAgICAgICAgICAgICByZXR1cm4gZDsNCiAgICAgICAgICAgIH0pLm1hcChmdW5jdGlvbiAoZCkgew0KICAgICAgICAgICAgICBpZiAoZFsxXSA8IGRbMF0pIHJldHVybiBbIGRbMV0sIGRbMF0gXTsNCiAgICAgICAgICAgICAgcmV0dXJuIGQ7DQogICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGRbMV0gLSBkWzBdICE9IDA7IH0pOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZih4ICYmIHkpIHsNCiAgICAgICAgICB4T3V0cHV0LmZvckVhY2goZnVuY3Rpb24gKGQsIGkpIHsNCiAgICAgICAgICAgIHh5T3V0cHV0LnB1c2goW1tkWzBdLCB5T3V0cHV0W2ldWzBdXSwgW2RbMV0sIHlPdXRwdXRbaV1bMV1dXSk7DQogICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHggJiYgeSA/IHh5T3V0cHV0IDogeCA/IHhPdXRwdXQgOiB5ICYmIHlPdXRwdXQ7DQogICAgICB9DQoNCiAgICAgIC8vIFNjYWxlIHRoZSBkYXRhLXNwYWNlIGV4dGVudCB0byBwaXhlbHMuDQogICAgICBpZiAoeCkgew0KICAgICAgICB4T3V0cHV0ID0gejsNCiAgICAgICAgaWYgKHkpIHhPdXRwdXQgPSB4T3V0cHV0Lm1hcChmdW5jdGlvbiAoZCkgew0KICAgICAgICAgIHJldHVybiBbZFswXVswXSwgZFsxXVswXV07DQogICAgICAgIH0pOw0KICAgICAgICB4RXh0ZW50RG9tYWluID0geE91dHB1dDsNCiAgICAgICAgeE91dHB1dCA9IHhPdXRwdXQubWFwKGZ1bmN0aW9uIChkKSB7DQogICAgICAgICAgaWYgKHguaW52ZXJ0KSByZXR1cm4gW3goZFswXSksIHgoZFsxXSldOw0KICAgICAgICAgIHJldHVybiBkOw0KICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKGQpIHsNCiAgICAgICAgICBpZihkWzFdIDwgZFswXSkgcmV0dXJuIFtkWzFdLCBkWzBdXTsNCiAgICAgICAgICByZXR1cm4gZDsNCiAgICAgICAgfSk7DQogICAgICAgIHhFeHRlbnQgPSB4T3V0cHV0Ow0KICAgICAgICBpZigheSkgeUV4dGVudCA9IHhPdXRwdXQubWFwKGZ1bmN0aW9uKCkgeyByZXR1cm4gWzAsMF07IH0pOw0KICAgICAgfQ0KICAgICAgaWYgKHkpIHsNCiAgICAgICAgeU91dHB1dCA9IHo7DQogICAgICAgIGlmICh4KSB5T3V0cHV0ID0geU91dHB1dC5tYXAoZnVuY3Rpb24gKGQpIHsNCiAgICAgICAgICByZXR1cm4gW2RbMF1bMV0sIGRbMV1bMV1dOw0KICAgICAgICB9KTsNCiAgICAgICAgeUV4dGVudERvbWFpbiA9IHlPdXRwdXQ7DQogICAgICAgIHlPdXRwdXQgPSB5T3V0cHV0Lm1hcChmdW5jdGlvbiAoZCkgew0KICAgICAgICAgIGlmICh5LmludmVydCkgcmV0dXJuIFt5KGRbMF0pLCB5KGRbMV0pXTsNCiAgICAgICAgICByZXR1cm4gZDsNCiAgICAgICAgfSkubWFwKGZ1bmN0aW9uIChkKSB7DQogICAgICAgICAgaWYoZFsxXSA8IGRbMF0pIHJldHVybiBbZFsxXSwgZFswXV07DQogICAgICAgICAgcmV0dXJuIGQ7DQogICAgICAgIH0pOw0KICAgICAgICB5RXh0ZW50ID0geU91dHB1dDsNCiAgICAgICAgaWYoIXgpIHhFeHRlbnQgPSB5T3V0cHV0Lm1hcChmdW5jdGlvbiAoKSB7IHJldHVybiBbMCwwXTsgfSk7DQogICAgICB9DQoNCiAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgZXh0ZW50cyBhcmUgc2V0IHRvIGVtcHR5IGFycmF5cy4NCiAgICAgIGlmKHhFeHRlbnQubGVuZ3RoID09PSAwKSB4RXh0ZW50ID0gW1swLDBdXTsNCiAgICAgIGlmKHlFeHRlbnQubGVuZ3RoID09PSAwKSB5RXh0ZW50ID0gW1swLDBdXTsNCg0KICAgICAgcmV0dXJuIGJydXNoOw0KICAgIH07DQoNCiAgICBicnVzaC5jbGVhciA9IGZ1bmN0aW9uKCkgew0KICAgICAgeEV4dGVudCA9IFtbMCwgMF1dLCB5RXh0ZW50ID0gW1swLCAwXV07DQogICAgICB4RXh0ZW50RG9tYWluID0geUV4dGVudERvbWFpbiA9IFtdOw0KICAgICAgZHJhd0V4dGVudHMoKTsNCiAgICAgIGlmKHgpIHJlZHJhd1goYnJ1c2hFbGVtZW50KTsNCiAgICAgIGlmKHkpIHJlZHJhd1koYnJ1c2hFbGVtZW50KTsNCiAgICAgIHJldHVybiBicnVzaDsNCiAgICB9Ow0KDQogICAgYnJ1c2guZW1wdHkgPSBmdW5jdGlvbihpKSB7DQogICAgaWYgKHRoaXMuZXh0ZW50KCkubGVuZ3RoID09PSAwKSB7DQogICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9DQogICAgICBpZih4RXh0ZW50Lmxlbmd0aCA9PSAxICYmIHlFeHRlbnQubGVuZ3RoID09IDEpIGkgPSAwOw0KICAgICAgaWYoaSAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgIHJldHVybiAhIXggJiYgeEV4dGVudFtpXVswXSA9PSB4RXh0ZW50W2ldWzFdDQogICAgICAgICAgfHwgISF5ICYmIHlFeHRlbnRbaV1bMF0gPT0geUV4dGVudFtpXVsxXTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgIH0NCiAgICB9Ow0KDQogICAgcmV0dXJuIGQzLnJlYmluZChicnVzaCwgZXZlbnQsICJvbiIpOw0KICB9Ow0KDQogIHZhciBkM19zdmdfYnJ1c2hDdXJzb3IgPSB7DQogICAgbjogIm5zLXJlc2l6ZSIsDQogICAgZTogImV3LXJlc2l6ZSIsDQogICAgczogIm5zLXJlc2l6ZSIsDQogICAgdzogImV3LXJlc2l6ZSIsDQogICAgbnc6ICJud3NlLXJlc2l6ZSIsDQogICAgbmU6ICJuZXN3LXJlc2l6ZSIsDQogICAgc2U6ICJud3NlLXJlc2l6ZSIsDQogICAgc3c6ICJuZXN3LXJlc2l6ZSINCiAgfTsNCg0KICB2YXIgZDNfc3ZnX2JydXNoUmVzaXplcyA9IFsNCiAgICBbIm4iLCAiZSIsICJzIiwgInciLCAibnciLCAibmUiLCAic2UiLCAic3ciXSwNCiAgICBbImUiLCAidyJdLA0KICAgIFsibiIsICJzIl0sDQogICAgW10NCiAgXTsNCn0pKCk7DQo="></script>
<script src="data:application/x-javascript;base64,ZDMucGFyY29vcmRzID0gZnVuY3Rpb24oY29uZmlnKSB7DQogIHZhciBfXyA9IHsNCiAgICBkYXRhOiBbXSwNCiAgICBoaWdobGlnaHRlZDogW10sDQogICAgZGltZW5zaW9uczogW10sDQogICAgZGltZW5zaW9uVGl0bGVzOiB7fSwNCiAgICBkaW1lbnNpb25UaXRsZVJvdGF0aW9uOiAwLA0KICAgIHR5cGVzOiB7fSwNCiAgICBicnVzaGVkOiBmYWxzZSwNCiAgICBicnVzaGVkQ29sb3I6IG51bGwsDQogICAgYWxwaGFPbkJydXNoZWQ6IDAuMCwNCiAgICBtb2RlOiAiZGVmYXVsdCIsDQogICAgcmF0ZTogMjAsDQogICAgd2lkdGg6IDYwMCwNCiAgICBoZWlnaHQ6IDMwMCwNCiAgICBtYXJnaW46IHsgdG9wOiAyNCwgcmlnaHQ6IDAsIGJvdHRvbTogMTIsIGxlZnQ6IDAgfSwNCiAgICBjb2xvcjogIiMwNjkiLA0KICAgIGNvbXBvc2l0ZTogInNvdXJjZS1vdmVyIiwNCiAgICBhbHBoYTogMC43LA0KICAgIGJ1bmRsaW5nU3RyZW5ndGg6IDAuNSwNCiAgICBidW5kbGVEaW1lbnNpb246IG51bGwsDQogICAgc21vb3RobmVzczogMC4wLA0KICAgIHNob3dDb250cm9sUG9pbnRzOiBmYWxzZSwNCiAgICBoaWRlQXhpcyA6IFtdDQogIH07DQoNCiAgZXh0ZW5kKF9fLCBjb25maWcpOw0KdmFyIHBjID0gZnVuY3Rpb24oc2VsZWN0aW9uKSB7DQogIHNlbGVjdGlvbiA9IHBjLnNlbGVjdGlvbiA9IGQzLnNlbGVjdChzZWxlY3Rpb24pOw0KDQogIF9fLndpZHRoID0gc2VsZWN0aW9uWzBdWzBdLmNsaWVudFdpZHRoOw0KICBfXy5oZWlnaHQgPSBzZWxlY3Rpb25bMF1bMF0uY2xpZW50SGVpZ2h0Ow0KDQogIC8vIGNhbnZhcyBkYXRhIGxheWVycw0KICBbIm1hcmtzIiwgImZvcmVncm91bmQiLCAiYnJ1c2hlZCIsICJoaWdobGlnaHQiXS5mb3JFYWNoKGZ1bmN0aW9uKGxheWVyKSB7DQogICAgY2FudmFzW2xheWVyXSA9IHNlbGVjdGlvbg0KICAgICAgLmFwcGVuZCgiY2FudmFzIikNCiAgICAgIC5hdHRyKCJjbGFzcyIsIGxheWVyKVswXVswXTsNCiAgICBjdHhbbGF5ZXJdID0gY2FudmFzW2xheWVyXS5nZXRDb250ZXh0KCIyZCIpOw0KICB9KTsNCg0KICAvLyBzdmcgdGljayBhbmQgYnJ1c2ggbGF5ZXJzDQogIHBjLnN2ZyA9IHNlbGVjdGlvbg0KICAgIC5hcHBlbmQoInN2ZyIpDQogICAgICAuYXR0cigid2lkdGgiLCBfXy53aWR0aCkNCiAgICAgIC5hdHRyKCJoZWlnaHQiLCBfXy5oZWlnaHQpDQogICAgLmFwcGVuZCgic3ZnOmciKQ0KICAgICAgLmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoIiArIF9fLm1hcmdpbi5sZWZ0ICsgIiwiICsgX18ubWFyZ2luLnRvcCArICIpIik7DQoNCiAgcmV0dXJuIHBjOw0KfTsNCnZhciBldmVudHMgPSBkMy5kaXNwYXRjaC5hcHBseSh0aGlzLFsicmVuZGVyIiwgInJlc2l6ZSIsICJoaWdobGlnaHQiLCAiYnJ1c2giLCAiYnJ1c2hlbmQiLCAiYXhlc3Jlb3JkZXIiXS5jb25jYXQoZDMua2V5cyhfXykpKSwNCiAgICB3ID0gZnVuY3Rpb24oKSB7IHJldHVybiBfXy53aWR0aCAtIF9fLm1hcmdpbi5yaWdodCAtIF9fLm1hcmdpbi5sZWZ0OyB9LA0KICAgIGggPSBmdW5jdGlvbigpIHsgcmV0dXJuIF9fLmhlaWdodCAtIF9fLm1hcmdpbi50b3AgLSBfXy5tYXJnaW4uYm90dG9tOyB9LA0KICAgIGZsYWdzID0gew0KICAgICAgYnJ1c2hhYmxlOiBmYWxzZSwNCiAgICAgIHJlb3JkZXJhYmxlOiBmYWxzZSwNCiAgICAgIGF4ZXM6IGZhbHNlLA0KICAgICAgaW50ZXJhY3RpdmU6IGZhbHNlLA0KICAgICAgZGVidWc6IGZhbHNlDQogICAgfSwNCiAgICB4c2NhbGUgPSBkMy5zY2FsZS5vcmRpbmFsKCksDQogICAgeXNjYWxlID0ge30sDQogICAgZHJhZ2dpbmcgPSB7fSwNCiAgICBsaW5lID0gZDMuc3ZnLmxpbmUoKSwNCiAgICBheGlzID0gZDMuc3ZnLmF4aXMoKS5vcmllbnQoImxlZnQiKS50aWNrcyg1KSwNCiAgICBnLCAvLyBncm91cHMgZm9yIGF4ZXMsIGJydXNoZXMNCiAgICBjdHggPSB7fSwNCiAgICBjYW52YXMgPSB7fSwNCiAgICBjbHVzdGVyQ2VudHJvaWRzID0gW107DQoNCi8vIHNpZGUgZWZmZWN0cyBmb3Igc2V0dGVycw0KdmFyIHNpZGVfZWZmZWN0cyA9IGQzLmRpc3BhdGNoLmFwcGx5KHRoaXMsZDMua2V5cyhfXykpDQogIC5vbigiY29tcG9zaXRlIiwgZnVuY3Rpb24oZCkgew0KICAgIGN0eC5mb3JlZ3JvdW5kLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGQudmFsdWU7DQogICAgY3R4LmJydXNoZWQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gZC52YWx1ZTsNCiAgfSkNCiAgLm9uKCJhbHBoYSIsIGZ1bmN0aW9uKGQpIHsNCiAgICBjdHguZm9yZWdyb3VuZC5nbG9iYWxBbHBoYSA9IGQudmFsdWU7DQogICAgY3R4LmJydXNoZWQuZ2xvYmFsQWxwaGEgPSBkLnZhbHVlOw0KICB9KQ0KICAub24oImJydXNoZWRDb2xvciIsIGZ1bmN0aW9uIChkKSB7DQogICAgY3R4LmJydXNoZWQuc3Ryb2tlU3R5bGUgPSBkLnZhbHVlOw0KICB9KQ0KICAub24oIndpZHRoIiwgZnVuY3Rpb24oZCkgeyBwYy5yZXNpemUoKTsgfSkNCiAgLm9uKCJoZWlnaHQiLCBmdW5jdGlvbihkKSB7IHBjLnJlc2l6ZSgpOyB9KQ0KICAub24oIm1hcmdpbiIsIGZ1bmN0aW9uKGQpIHsgcGMucmVzaXplKCk7IH0pDQogIC5vbigicmF0ZSIsIGZ1bmN0aW9uKGQpIHsNCiAgICBicnVzaGVkUXVldWUucmF0ZShkLnZhbHVlKTsNCiAgICBmb3JlZ3JvdW5kUXVldWUucmF0ZShkLnZhbHVlKTsNCiAgfSkNCiAgLm9uKCJkaW1lbnNpb25zIiwgZnVuY3Rpb24oZCkgew0KICAgIHhzY2FsZS5kb21haW4oX18uZGltZW5zaW9ucyk7DQogICAgaWYgKGZsYWdzLmludGVyYWN0aXZlKXtwYy5yZW5kZXIoKS51cGRhdGVBeGVzKCk7fQ0KICB9KQ0KICAub24oImJ1bmRsZURpbWVuc2lvbiIsIGZ1bmN0aW9uKGQpIHsNCgkgIGlmICghX18uZGltZW5zaW9ucy5sZW5ndGgpIHBjLmRldGVjdERpbWVuc2lvbnMoKTsNCgkgIGlmICghKF9fLmRpbWVuc2lvbnNbMF0gaW4geXNjYWxlKSkgcGMuYXV0b3NjYWxlKCk7DQoJICBpZiAodHlwZW9mIGQudmFsdWUgPT09ICJudW1iZXIiKSB7DQoJCSAgaWYgKGQudmFsdWUgPCBfXy5kaW1lbnNpb25zLmxlbmd0aCkgew0KCQkJICBfXy5idW5kbGVEaW1lbnNpb24gPSBfXy5kaW1lbnNpb25zW2QudmFsdWVdOw0KCQkgIH0gZWxzZSBpZiAoZC52YWx1ZSA8IF9fLmhpZGVBeGlzLmxlbmd0aCkgew0KCQkJICBfXy5idW5kbGVEaW1lbnNpb24gPSBfXy5oaWRlQXhpc1tkLnZhbHVlXTsNCgkJICB9DQoJICB9IGVsc2Ugew0KCQkgIF9fLmJ1bmRsZURpbWVuc2lvbiA9IGQudmFsdWU7DQoJICB9DQoNCgkgIF9fLmNsdXN0ZXJDZW50cm9pZHMgPSBjb21wdXRlX2NsdXN0ZXJfY2VudHJvaWRzKF9fLmJ1bmRsZURpbWVuc2lvbik7DQogIH0pDQogIC5vbigiaGlkZUF4aXMiLCBmdW5jdGlvbihkKSB7DQoJICBpZiAoIV9fLmRpbWVuc2lvbnMubGVuZ3RoKSBwYy5kZXRlY3REaW1lbnNpb25zKCk7DQoJICBwYy5kaW1lbnNpb25zKHdpdGhvdXQoX18uZGltZW5zaW9ucywgZC52YWx1ZSkpOw0KICB9KTsNCg0KLy8gZXhwb3NlIHRoZSBzdGF0ZSBvZiB0aGUgY2hhcnQNCnBjLnN0YXRlID0gX187DQpwYy5mbGFncyA9IGZsYWdzOw0KDQovLyBjcmVhdGUgZ2V0dGVyL3NldHRlcnMNCmdldHNldChwYywgX18sIGV2ZW50cyk7DQoNCi8vIGV4cG9zZSBldmVudHMNCmQzLnJlYmluZChwYywgZXZlbnRzLCAib24iKTsNCg0KLy8gZ2V0dGVyL3NldHRlciB3aXRoIGV2ZW50IGZpcmluZw0KZnVuY3Rpb24gZ2V0c2V0KG9iaixzdGF0ZSxldmVudHMpICB7DQogIGQzLmtleXMoc3RhdGUpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7DQogICAgb2JqW2tleV0gPSBmdW5jdGlvbih4KSB7DQogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsNCgkJcmV0dXJuIHN0YXRlW2tleV07DQoJfQ0KICAgICAgdmFyIG9sZCA9IHN0YXRlW2tleV07DQogICAgICBzdGF0ZVtrZXldID0geDsNCiAgICAgIHNpZGVfZWZmZWN0c1trZXldLmNhbGwocGMseyJ2YWx1ZSI6IHgsICJwcmV2aW91cyI6IG9sZH0pOw0KICAgICAgZXZlbnRzW2tleV0uY2FsbChwYyx7InZhbHVlIjogeCwgInByZXZpb3VzIjogb2xkfSk7DQogICAgICByZXR1cm4gb2JqOw0KICAgIH07DQogIH0pOw0KfTsNCg0KZnVuY3Rpb24gZXh0ZW5kKHRhcmdldCwgc291cmNlKSB7DQogIGZvciAoa2V5IGluIHNvdXJjZSkgew0KICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07DQogIH0NCiAgcmV0dXJuIHRhcmdldDsNCn07DQoNCmZ1bmN0aW9uIHdpdGhvdXQoYXJyLCBpdGVtKSB7DQogIHJldHVybiBhcnIuZmlsdGVyKGZ1bmN0aW9uKGVsZW0pIHsgcmV0dXJuIGl0ZW0uaW5kZXhPZihlbGVtKSA9PT0gLTE7IH0pDQp9Ow0KcGMuYXV0b3NjYWxlID0gZnVuY3Rpb24oKSB7DQogIC8vIHlzY2FsZQ0KICB2YXIgZGVmYXVsdFNjYWxlcyA9IHsNCiAgICAiZGF0ZSI6IGZ1bmN0aW9uKGspIHsNCiAgICAgIHZhciBleHRlbnQgPSBkMy5leHRlbnQoX18uZGF0YSwgZnVuY3Rpb24oZCkgew0KICAgICAgICByZXR1cm4gZFtrXSA/IGRba10uZ2V0VGltZSgpIDogbnVsbDsNCiAgICAgIH0pOw0KDQogICAgICAvLyBzcGVjaWFsIGNhc2UgaWYgc2luZ2xlIHZhbHVlDQogICAgICBpZiAoZXh0ZW50WzBdID09PSBleHRlbnRbMV0pIHsNCiAgICAgICAgcmV0dXJuIGQzLnNjYWxlLm9yZGluYWwoKQ0KICAgICAgICAgIC5kb21haW4oW2V4dGVudFswXV0pDQogICAgICAgICAgLnJhbmdlUG9pbnRzKFtoKCkrMSwgMV0pOw0KICAgICAgfQ0KDQogICAgICByZXR1cm4gZDMudGltZS5zY2FsZSgpDQogICAgICAgIC5kb21haW4oZXh0ZW50KQ0KICAgICAgICAucmFuZ2UoW2goKSsxLCAxXSk7DQogICAgfSwNCiAgICAibnVtYmVyIjogZnVuY3Rpb24oaykgew0KICAgICAgdmFyIGV4dGVudCA9IGQzLmV4dGVudChfXy5kYXRhLCBmdW5jdGlvbihkKSB7IHJldHVybiArZFtrXTsgfSk7DQoNCiAgICAgIC8vIHNwZWNpYWwgY2FzZSBpZiBzaW5nbGUgdmFsdWUNCiAgICAgIGlmIChleHRlbnRbMF0gPT09IGV4dGVudFsxXSkgew0KICAgICAgICByZXR1cm4gZDMuc2NhbGUub3JkaW5hbCgpDQogICAgICAgICAgLmRvbWFpbihbZXh0ZW50WzBdXSkNCiAgICAgICAgICAucmFuZ2VQb2ludHMoW2goKSsxLCAxXSk7DQogICAgICB9DQoNCiAgICAgIHJldHVybiBkMy5zY2FsZS5saW5lYXIoKQ0KICAgICAgICAuZG9tYWluKGV4dGVudCkNCiAgICAgICAgLnJhbmdlKFtoKCkrMSwgMV0pOw0KICAgIH0sDQogICAgInN0cmluZyI6IGZ1bmN0aW9uKGspIHsNCiAgICAgIHZhciBjb3VudHMgPSB7fSwNCiAgICAgICAgICBkb21haW4gPSBbXTsNCg0KICAgICAgLy8gTGV0J3MgZ2V0IHRoZSBjb3VudCBmb3IgZWFjaCB2YWx1ZSBzbyB0aGF0IHdlIGNhbiBzb3J0IHRoZSBkb21haW4gYmFzZWQNCiAgICAgIC8vIG9uIHRoZSBudW1iZXIgb2YgaXRlbXMgZm9yIGVhY2ggdmFsdWUuDQogICAgICBfXy5kYXRhLm1hcChmdW5jdGlvbihwKSB7DQogICAgICAgIGlmIChjb3VudHNbcFtrXV0gPT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgIGNvdW50c1twW2tdXSA9IDE7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgY291bnRzW3Bba11dID0gY291bnRzW3Bba11dICsgMTsNCiAgICAgICAgfQ0KICAgICAgfSk7DQoNCiAgICAgIGRvbWFpbiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGNvdW50cykuc29ydChmdW5jdGlvbihhLCBiKSB7DQogICAgICAgIHJldHVybiBjb3VudHNbYV0gLSBjb3VudHNbYl07DQogICAgICB9KTsNCg0KICAgICAgcmV0dXJuIGQzLnNjYWxlLm9yZGluYWwoKQ0KICAgICAgICAuZG9tYWluKGRvbWFpbikNCiAgICAgICAgLnJhbmdlUG9pbnRzKFtoKCkrMSwgMV0pOw0KICAgIH0NCiAgfTsNCg0KICBfXy5kaW1lbnNpb25zLmZvckVhY2goZnVuY3Rpb24oaykgew0KICAgIHlzY2FsZVtrXSA9IGRlZmF1bHRTY2FsZXNbX18udHlwZXNba11dKGspOw0KICB9KTsNCg0KICBfXy5oaWRlQXhpcy5mb3JFYWNoKGZ1bmN0aW9uKGspIHsNCiAgICB5c2NhbGVba10gPSBkZWZhdWx0U2NhbGVzW19fLnR5cGVzW2tdXShrKTsNCiAgfSk7DQoNCiAgLy8geHNjYWxlDQogIHhzY2FsZS5yYW5nZVBvaW50cyhbMCwgdygpXSwgMSk7DQoNCiAgLy8gY2FudmFzIHNpemVzDQogIHBjLnNlbGVjdGlvbi5zZWxlY3RBbGwoImNhbnZhcyIpDQogICAgICAuc3R5bGUoIm1hcmdpbi10b3AiLCBfXy5tYXJnaW4udG9wICsgInB4IikNCiAgICAgIC5zdHlsZSgibWFyZ2luLWxlZnQiLCBfXy5tYXJnaW4ubGVmdCArICJweCIpDQogICAgICAuYXR0cigid2lkdGgiLCB3KCkrMikNCiAgICAgIC5hdHRyKCJoZWlnaHQiLCBoKCkrMik7DQoNCiAgLy8gZGVmYXVsdCBzdHlsZXMsIG5lZWRzIHRvIGJlIHNldCB3aGVuIGNhbnZhcyB3aWR0aCBjaGFuZ2VzDQogIGN0eC5mb3JlZ3JvdW5kLnN0cm9rZVN0eWxlID0gX18uY29sb3I7DQogIGN0eC5mb3JlZ3JvdW5kLmxpbmVXaWR0aCA9IDEuNDsNCiAgY3R4LmZvcmVncm91bmQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gX18uY29tcG9zaXRlOw0KICBjdHguZm9yZWdyb3VuZC5nbG9iYWxBbHBoYSA9IF9fLmFscGhhOw0KICBjdHguYnJ1c2hlZC5zdHJva2VTdHlsZSA9IF9fLmJydXNoZWRDb2xvcjsNCiAgY3R4LmJydXNoZWQubGluZVdpZHRoID0gMS40Ow0KICBjdHguYnJ1c2hlZC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBfXy5jb21wb3NpdGU7DQogIGN0eC5icnVzaGVkLmdsb2JhbEFscGhhID0gX18uYWxwaGE7DQogIGN0eC5oaWdobGlnaHQubGluZVdpZHRoID0gMzsNCg0KICByZXR1cm4gdGhpczsNCn07DQoNCnBjLnNjYWxlID0gZnVuY3Rpb24oZCwgZG9tYWluKSB7DQoJeXNjYWxlW2RdLmRvbWFpbihkb21haW4pOw0KDQoJcmV0dXJuIHRoaXM7DQp9Ow0KDQpwYy5mbGlwID0gZnVuY3Rpb24oZCkgew0KCS8veXNjYWxlW2RdLmRvbWFpbigpLnJldmVyc2UoKTsJCQkJCS8vIGRvZXMgbm90IHdvcmsNCgl5c2NhbGVbZF0uZG9tYWluKHlzY2FsZVtkXS5kb21haW4oKS5yZXZlcnNlKCkpOyAvLyB3b3Jrcw0KDQoJcmV0dXJuIHRoaXM7DQp9Ow0KDQpwYy5jb21tb25TY2FsZSA9IGZ1bmN0aW9uKGdsb2JhbCwgdHlwZSkgew0KCXZhciB0ID0gdHlwZSB8fCAibnVtYmVyIjsNCglpZiAodHlwZW9mIGdsb2JhbCA9PT0gJ3VuZGVmaW5lZCcpIHsNCgkJZ2xvYmFsID0gdHJ1ZTsNCgl9DQoNCgkvLyBzY2FsZXMgb2YgdGhlIHNhbWUgdHlwZQ0KCXZhciBzY2FsZXMgPSBfXy5kaW1lbnNpb25zLmNvbmNhdChfXy5oaWRlQXhpcykuZmlsdGVyKGZ1bmN0aW9uKHApIHsNCgkJcmV0dXJuIF9fLnR5cGVzW3BdID09IHQ7DQoJfSk7DQoNCglpZiAoZ2xvYmFsKSB7DQoJCXZhciBleHRlbnQgPSBkMy5leHRlbnQoc2NhbGVzLm1hcChmdW5jdGlvbihwLGkpIHsNCgkJCQlyZXR1cm4geXNjYWxlW3BdLmRvbWFpbigpOw0KCQkJfSkucmVkdWNlKGZ1bmN0aW9uKGEsYikgew0KCQkJCXJldHVybiBhLmNvbmNhdChiKTsNCgkJCX0pKTsNCg0KCQlzY2FsZXMuZm9yRWFjaChmdW5jdGlvbihkKSB7DQoJCQl5c2NhbGVbZF0uZG9tYWluKGV4dGVudCk7DQoJCX0pOw0KDQoJfSBlbHNlIHsNCgkJc2NhbGVzLmZvckVhY2goZnVuY3Rpb24oaykgew0KCQkJeXNjYWxlW2tdLmRvbWFpbihkMy5leHRlbnQoX18uZGF0YSwgZnVuY3Rpb24oZCkgeyByZXR1cm4gK2Rba107IH0pKTsNCgkJfSk7DQoJfQ0KDQoJLy8gdXBkYXRlIGNlbnRyb2lkcw0KCWlmIChfXy5idW5kbGVEaW1lbnNpb24gIT09IG51bGwpIHsNCgkJcGMuYnVuZGxlRGltZW5zaW9uKF9fLmJ1bmRsZURpbWVuc2lvbik7DQoJfQ0KDQoJcmV0dXJuIHRoaXM7DQp9Ow0KcGMuZGV0ZWN0RGltZW5zaW9ucyA9IGZ1bmN0aW9uKCkgew0KICBwYy50eXBlcyhwYy5kZXRlY3REaW1lbnNpb25UeXBlcyhfXy5kYXRhKSk7DQogIHBjLmRpbWVuc2lvbnMoZDMua2V5cyhwYy50eXBlcygpKSk7DQogIHJldHVybiB0aGlzOw0KfTsNCg0KLy8gYSBiZXR0ZXIgInR5cGVvZiIgZnJvbSB0aGlzIHBvc3Q6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzM5MDQyNi9iZXR0ZXItd2F5LXRvLWdldC10eXBlLW9mLWEtamF2YXNjcmlwdC12YXJpYWJsZQ0KcGMudG9UeXBlID0gZnVuY3Rpb24odikgew0KICByZXR1cm4gKHt9KS50b1N0cmluZy5jYWxsKHYpLm1hdGNoKC9ccyhbYS16QS1aXSspLylbMV0udG9Mb3dlckNhc2UoKTsNCn07DQoNCi8vIHRyeSB0byBjb2VyY2UgdG8gbnVtYmVyIGJlZm9yZSByZXR1cm5pbmcgdHlwZQ0KcGMudG9UeXBlQ29lcmNlTnVtYmVycyA9IGZ1bmN0aW9uKHYpIHsNCiAgaWYgKChwYXJzZUZsb2F0KHYpID09IHYpICYmICh2ICE9IG51bGwpKSB7DQoJcmV0dXJuICJudW1iZXIiOw0KfQ0KICByZXR1cm4gcGMudG9UeXBlKHYpOw0KfTsNCg0KLy8gYXR0ZW1wdCB0byBkZXRlcm1pbmUgdHlwZXMgb2YgZWFjaCBkaW1lbnNpb24gYmFzZWQgb24gZmlyc3Qgcm93IG9mIGRhdGENCnBjLmRldGVjdERpbWVuc2lvblR5cGVzID0gZnVuY3Rpb24oZGF0YSkgew0KICB2YXIgdHlwZXMgPSB7fTsNCiAgZDMua2V5cyhkYXRhWzBdKQ0KICAgIC5mb3JFYWNoKGZ1bmN0aW9uKGNvbCkgew0KICAgICAgdHlwZXNbY29sXSA9IHBjLnRvVHlwZUNvZXJjZU51bWJlcnMoZGF0YVswXVtjb2xdKTsNCiAgICB9KTsNCiAgcmV0dXJuIHR5cGVzOw0KfTsNCnBjLnJlbmRlciA9IGZ1bmN0aW9uKCkgew0KICAvLyB0cnkgdG8gYXV0b2RldGVjdCBkaW1lbnNpb25zIGFuZCBjcmVhdGUgc2NhbGVzDQogIGlmICghX18uZGltZW5zaW9ucy5sZW5ndGgpIHBjLmRldGVjdERpbWVuc2lvbnMoKTsNCiAgaWYgKCEoX18uZGltZW5zaW9uc1swXSBpbiB5c2NhbGUpKSBwYy5hdXRvc2NhbGUoKTsNCg0KICBwYy5yZW5kZXJbX18ubW9kZV0oKTsNCg0KICBldmVudHMucmVuZGVyLmNhbGwodGhpcyk7DQogIHJldHVybiB0aGlzOw0KfTsNCg0KcGMucmVuZGVyQnJ1c2hlZCA9IGZ1bmN0aW9uKCkgew0KICBpZiAoIV9fLmRpbWVuc2lvbnMubGVuZ3RoKSBwYy5kZXRlY3REaW1lbnNpb25zKCk7DQogIGlmICghKF9fLmRpbWVuc2lvbnNbMF0gaW4geXNjYWxlKSkgcGMuYXV0b3NjYWxlKCk7DQoNCiAgcGMucmVuZGVyQnJ1c2hlZFtfXy5tb2RlXSgpOw0KDQogIGV2ZW50cy5yZW5kZXIuY2FsbCh0aGlzKTsNCiAgcmV0dXJuIHRoaXM7DQp9Ow0KDQpmdW5jdGlvbiBpc0JydXNoZWQoKSB7DQogIGlmIChfXy5icnVzaGVkICYmIF9fLmJydXNoZWQubGVuZ3RoICE9PSBfXy5kYXRhLmxlbmd0aCkNCiAgICByZXR1cm4gdHJ1ZTsNCg0KICB2YXIgb2JqZWN0ID0gYnJ1c2guY3VycmVudE1vZGUoKS5icnVzaFN0YXRlKCk7DQoNCiAgZm9yICh2YXIga2V5IGluIG9iamVjdCkgew0KICAgIGlmIChvYmplY3QuaGFzT3duUHJvcGVydHkoa2V5KSkgew0KICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KICB9DQogIHJldHVybiBmYWxzZTsNCn0NCg0KcGMucmVuZGVyLmRlZmF1bHQgPSBmdW5jdGlvbigpIHsNCiAgcGMuY2xlYXIoJ2ZvcmVncm91bmQnKTsNCiAgcGMuY2xlYXIoJ2hpZ2hsaWdodCcpOw0KDQogIHBjLnJlbmRlckJydXNoZWQuZGVmYXVsdCgpOw0KDQogIF9fLmRhdGEuZm9yRWFjaChwYXRoX2ZvcmVncm91bmQpOw0KfTsNCg0KdmFyIGZvcmVncm91bmRRdWV1ZSA9IGQzLnJlbmRlclF1ZXVlKHBhdGhfZm9yZWdyb3VuZCkNCiAgLnJhdGUoNTApDQogIC5jbGVhcihmdW5jdGlvbigpIHsNCiAgICBwYy5jbGVhcignZm9yZWdyb3VuZCcpOw0KICAgIHBjLmNsZWFyKCdoaWdobGlnaHQnKTsNCiAgfSk7DQoNCnBjLnJlbmRlci5xdWV1ZSA9IGZ1bmN0aW9uKCkgew0KICBwYy5yZW5kZXJCcnVzaGVkLnF1ZXVlKCk7DQoNCiAgZm9yZWdyb3VuZFF1ZXVlKF9fLmRhdGEpOw0KfTsNCg0KcGMucmVuZGVyQnJ1c2hlZC5kZWZhdWx0ID0gZnVuY3Rpb24oKSB7DQogIHBjLmNsZWFyKCdicnVzaGVkJyk7DQoNCiAgaWYgKGlzQnJ1c2hlZCgpKSB7DQogICAgX18uYnJ1c2hlZC5mb3JFYWNoKHBhdGhfYnJ1c2hlZCk7DQogIH0NCn07DQoNCnZhciBicnVzaGVkUXVldWUgPSBkMy5yZW5kZXJRdWV1ZShwYXRoX2JydXNoZWQpDQogIC5yYXRlKDUwKQ0KICAuY2xlYXIoZnVuY3Rpb24oKSB7DQogICAgcGMuY2xlYXIoJ2JydXNoZWQnKTsNCiAgfSk7DQoNCnBjLnJlbmRlckJydXNoZWQucXVldWUgPSBmdW5jdGlvbigpIHsNCiAgaWYgKGlzQnJ1c2hlZCgpKSB7DQogICAgYnJ1c2hlZFF1ZXVlKF9fLmJydXNoZWQpOw0KICB9IGVsc2Ugew0KICAgIGJydXNoZWRRdWV1ZShbXSk7IC8vIFRoaXMgaXMgbmVlZGVkIHRvIGNsZWFyIHRoZSBjdXJyZW50bHkgYnJ1c2hlZCBpdGVtcw0KICB9DQp9O2Z1bmN0aW9uIGNvbXB1dGVfY2x1c3Rlcl9jZW50cm9pZHMoZCkgew0KDQoJdmFyIGNsdXN0ZXJDZW50cm9pZHMgPSBkMy5tYXAoKTsNCgl2YXIgY2x1c3RlckNvdW50cyA9IGQzLm1hcCgpOw0KCS8vIGRldGVybWluZSBjbHVzdGVyQ291bnRzDQoJX18uZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKHJvdykgew0KCQl2YXIgc2NhbGVkID0geXNjYWxlW2RdKHJvd1tkXSk7DQoJCWlmICghY2x1c3RlckNvdW50cy5oYXMoc2NhbGVkKSkgew0KCQkJY2x1c3RlckNvdW50cy5zZXQoc2NhbGVkLCAwKTsNCgkJfQ0KCQl2YXIgY291bnQgPSBjbHVzdGVyQ291bnRzLmdldChzY2FsZWQpOw0KCQljbHVzdGVyQ291bnRzLnNldChzY2FsZWQsIGNvdW50ICsgMSk7DQoJfSk7DQoNCglfXy5kYXRhLmZvckVhY2goZnVuY3Rpb24ocm93KSB7DQoJCV9fLmRpbWVuc2lvbnMubWFwKGZ1bmN0aW9uKHAsIGkpIHsNCgkJCXZhciBzY2FsZWQgPSB5c2NhbGVbZF0ocm93W2RdKTsNCgkJCWlmICghY2x1c3RlckNlbnRyb2lkcy5oYXMoc2NhbGVkKSkgew0KCQkJCXZhciBtYXAgPSBkMy5tYXAoKTsNCgkJCQljbHVzdGVyQ2VudHJvaWRzLnNldChzY2FsZWQsIG1hcCk7DQoJCQl9DQoJCQlpZiAoIWNsdXN0ZXJDZW50cm9pZHMuZ2V0KHNjYWxlZCkuaGFzKHApKSB7DQoJCQkJY2x1c3RlckNlbnRyb2lkcy5nZXQoc2NhbGVkKS5zZXQocCwgMCk7DQoJCQl9DQoJCQl2YXIgdmFsdWUgPSBjbHVzdGVyQ2VudHJvaWRzLmdldChzY2FsZWQpLmdldChwKTsNCgkJCXZhbHVlICs9IHlzY2FsZVtwXShyb3dbcF0pIC8gY2x1c3RlckNvdW50cy5nZXQoc2NhbGVkKTsNCgkJCWNsdXN0ZXJDZW50cm9pZHMuZ2V0KHNjYWxlZCkuc2V0KHAsIHZhbHVlKTsNCgkJfSk7DQoJfSk7DQoNCglyZXR1cm4gY2x1c3RlckNlbnRyb2lkczsNCg0KfQ0KDQpmdW5jdGlvbiBjb21wdXRlX2NlbnRyb2lkcyhyb3cpIHsNCgl2YXIgY2VudHJvaWRzID0gW107DQoNCgl2YXIgcCA9IF9fLmRpbWVuc2lvbnM7DQoJdmFyIGNvbHMgPSBwLmxlbmd0aDsNCgl2YXIgYSA9IDAuNTsJCQkvLyBjZW50ZXIgYmV0d2VlbiBheGVzDQoJZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xzOyArK2kpIHsNCgkJLy8gY2VudHJvaWRzIG9uICdyZWFsJyBheGVzDQoJCXZhciB4ID0gcG9zaXRpb24ocFtpXSk7DQoJCXZhciB5ID0geXNjYWxlW3BbaV1dKHJvd1twW2ldXSk7DQoJCWNlbnRyb2lkcy5wdXNoKCRWKFt4LCB5XSkpOw0KDQoJCS8vIGNlbnRyb2lkcyBvbiAndmlydHVhbCcgYXhlcw0KCQlpZiAoaSA8IGNvbHMgLSAxKSB7DQoJCQl2YXIgY3ggPSB4ICsgYSAqIChwb3NpdGlvbihwW2krMV0pIC0geCk7DQoJCQl2YXIgY3kgPSB5ICsgYSAqICh5c2NhbGVbcFtpKzFdXShyb3dbcFtpKzFdXSkgLSB5KTsNCgkJCWlmIChfXy5idW5kbGVEaW1lbnNpb24gIT09IG51bGwpIHsNCgkJCQl2YXIgbGVmdENlbnRyb2lkID0gX18uY2x1c3RlckNlbnRyb2lkcy5nZXQoeXNjYWxlW19fLmJ1bmRsZURpbWVuc2lvbl0ocm93W19fLmJ1bmRsZURpbWVuc2lvbl0pKS5nZXQocFtpXSk7DQoJCQkJdmFyIHJpZ2h0Q2VudHJvaWQgPSBfXy5jbHVzdGVyQ2VudHJvaWRzLmdldCh5c2NhbGVbX18uYnVuZGxlRGltZW5zaW9uXShyb3dbX18uYnVuZGxlRGltZW5zaW9uXSkpLmdldChwW2krMV0pOw0KCQkJCXZhciBjZW50cm9pZCA9IDAuNSAqIChsZWZ0Q2VudHJvaWQgKyByaWdodENlbnRyb2lkKTsNCgkJCQljeSA9IGNlbnRyb2lkICsgKDEgLSBfXy5idW5kbGluZ1N0cmVuZ3RoKSAqIChjeSAtIGNlbnRyb2lkKTsNCgkJCX0NCgkJCWNlbnRyb2lkcy5wdXNoKCRWKFtjeCwgY3ldKSk7DQoJCX0NCgl9DQoNCglyZXR1cm4gY2VudHJvaWRzOw0KfQ0KDQpmdW5jdGlvbiBjb21wdXRlX2NvbnRyb2xfcG9pbnRzKGNlbnRyb2lkcykgew0KDQoJdmFyIGNvbHMgPSBjZW50cm9pZHMubGVuZ3RoOw0KCXZhciBhID0gX18uc21vb3RobmVzczsNCgl2YXIgY3BzID0gW107DQoNCgljcHMucHVzaChjZW50cm9pZHNbMF0pOw0KCWNwcy5wdXNoKCRWKFtjZW50cm9pZHNbMF0uZSgxKSArIGEqMiooY2VudHJvaWRzWzFdLmUoMSktY2VudHJvaWRzWzBdLmUoMSkpLCBjZW50cm9pZHNbMF0uZSgyKV0pKTsNCglmb3IgKHZhciBjb2wgPSAxOyBjb2wgPCBjb2xzIC0gMTsgKytjb2wpIHsNCgkJdmFyIG1pZCA9IGNlbnRyb2lkc1tjb2xdOw0KCQl2YXIgbGVmdCA9IGNlbnRyb2lkc1tjb2wgLSAxXTsNCgkJdmFyIHJpZ2h0ID0gY2VudHJvaWRzW2NvbCArIDFdOw0KDQoJCXZhciBkaWZmID0gbGVmdC5zdWJ0cmFjdChyaWdodCk7DQoJCWNwcy5wdXNoKG1pZC5hZGQoZGlmZi54KGEpKSk7DQoJCWNwcy5wdXNoKG1pZCk7DQoJCWNwcy5wdXNoKG1pZC5zdWJ0cmFjdChkaWZmLngoYSkpKTsNCgl9DQoJY3BzLnB1c2goJFYoW2NlbnRyb2lkc1tjb2xzLTFdLmUoMSkgKyBhKjIqKGNlbnRyb2lkc1tjb2xzLTJdLmUoMSktY2VudHJvaWRzW2NvbHMtMV0uZSgxKSksIGNlbnRyb2lkc1tjb2xzLTFdLmUoMildKSk7DQoJY3BzLnB1c2goY2VudHJvaWRzW2NvbHMgLSAxXSk7DQoNCglyZXR1cm4gY3BzOw0KDQp9O3BjLnNoYWRvd3MgPSBmdW5jdGlvbigpIHsNCglmbGFncy5zaGFkb3dzID0gdHJ1ZTsNCglwYy5hbHBoYU9uQnJ1c2hlZCgwLjEpOw0KCXBjLnJlbmRlcigpOw0KCXJldHVybiB0aGlzOw0KfTsNCg0KLy8gZHJhdyBkb3RzIHdpdGggcmFkaXVzIHIgb24gdGhlIGF4aXMgbGluZSB3aGVyZSBkYXRhIGludGVyc2VjdHMNCnBjLmF4aXNEb3RzID0gZnVuY3Rpb24ocikgew0KCXZhciByID0gciB8fCAwLjE7DQoJdmFyIGN0eCA9IHBjLmN0eC5tYXJrczsNCgl2YXIgc3RhcnRBbmdsZSA9IDA7DQoJdmFyIGVuZEFuZ2xlID0gMiAqIE1hdGguUEk7DQoJY3R4Lmdsb2JhbEFscGhhID0gZDMubWluKFsgMSAvIE1hdGgucG93KF9fLmRhdGEubGVuZ3RoLCAxIC8gMiksIDEgXSk7DQoJX18uZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKGQpIHsNCgkJX18uZGltZW5zaW9ucy5tYXAoZnVuY3Rpb24ocCwgaSkgew0KCQkJY3R4LmJlZ2luUGF0aCgpOw0KCQkJY3R4LmFyYyhwb3NpdGlvbihwKSwgeXNjYWxlW3BdKGRbcF0pLCByLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSk7DQoJCQljdHguc3Ryb2tlKCk7DQoJCQljdHguZmlsbCgpOw0KCQl9KTsNCgl9KTsNCglyZXR1cm4gdGhpczsNCn07DQoNCi8vIGRyYXcgc2luZ2xlIGN1YmljIGJlemllciBjdXJ2ZQ0KZnVuY3Rpb24gc2luZ2xlX2N1cnZlKGQsIGN0eCkgew0KDQoJdmFyIGNlbnRyb2lkcyA9IGNvbXB1dGVfY2VudHJvaWRzKGQpOw0KCXZhciBjcHMgPSBjb21wdXRlX2NvbnRyb2xfcG9pbnRzKGNlbnRyb2lkcyk7DQoNCgljdHgubW92ZVRvKGNwc1swXS5lKDEpLCBjcHNbMF0uZSgyKSk7DQoJZm9yICh2YXIgaSA9IDE7IGkgPCBjcHMubGVuZ3RoOyBpICs9IDMpIHsNCgkJaWYgKF9fLnNob3dDb250cm9sUG9pbnRzKSB7DQoJCQlmb3IgKHZhciBqID0gMDsgaiA8IDM7IGorKykgew0KCQkJCWN0eC5maWxsUmVjdChjcHNbaStqXS5lKDEpLCBjcHNbaStqXS5lKDIpLCAyLCAyKTsNCgkJCX0NCgkJfQ0KCQljdHguYmV6aWVyQ3VydmVUbyhjcHNbaV0uZSgxKSwgY3BzW2ldLmUoMiksIGNwc1tpKzFdLmUoMSksIGNwc1tpKzFdLmUoMiksIGNwc1tpKzJdLmUoMSksIGNwc1tpKzJdLmUoMikpOw0KCX0NCn07DQoNCi8vIGRyYXcgc2luZ2xlIHBvbHlsaW5lDQpmdW5jdGlvbiBjb2xvcl9wYXRoKGQsIGN0eCkgew0KCWN0eC5iZWdpblBhdGgoKTsNCglpZiAoKF9fLmJ1bmRsZURpbWVuc2lvbiAhPT0gbnVsbCAmJiBfXy5idW5kbGluZ1N0cmVuZ3RoID4gMCkgfHwgX18uc21vb3RobmVzcyA+IDApIHsNCgkJc2luZ2xlX2N1cnZlKGQsIGN0eCk7DQoJfSBlbHNlIHsNCgkJc2luZ2xlX3BhdGgoZCwgY3R4KTsNCgl9DQoJY3R4LnN0cm9rZSgpOw0KfTsNCg0KLy8gZHJhdyBtYW55IHBvbHlsaW5lcyBvZiB0aGUgc2FtZSBjb2xvcg0KZnVuY3Rpb24gcGF0aHMoZGF0YSwgY3R4KSB7DQoJY3R4LmNsZWFyUmVjdCgtMSwgLTEsIHcoKSArIDIsIGgoKSArIDIpOw0KCWN0eC5iZWdpblBhdGgoKTsNCglkYXRhLmZvckVhY2goZnVuY3Rpb24oZCkgew0KCQlpZiAoKF9fLmJ1bmRsZURpbWVuc2lvbiAhPT0gbnVsbCAmJiBfXy5idW5kbGluZ1N0cmVuZ3RoID4gMCkgfHwgX18uc21vb3RobmVzcyA+IDApIHsNCgkJCXNpbmdsZV9jdXJ2ZShkLCBjdHgpOw0KCQl9IGVsc2Ugew0KCQkJc2luZ2xlX3BhdGgoZCwgY3R4KTsNCgkJfQ0KCX0pOw0KCWN0eC5zdHJva2UoKTsNCn07DQoNCmZ1bmN0aW9uIHNpbmdsZV9wYXRoKGQsIGN0eCkgew0KCV9fLmRpbWVuc2lvbnMubWFwKGZ1bmN0aW9uKHAsIGkpIHsNCgkJaWYgKGkgPT0gMCkgew0KCQkJY3R4Lm1vdmVUbyhwb3NpdGlvbihwKSwgeXNjYWxlW3BdKGRbcF0pKTsNCgkJfSBlbHNlIHsNCgkJCWN0eC5saW5lVG8ocG9zaXRpb24ocCksIHlzY2FsZVtwXShkW3BdKSk7DQoJCX0NCgl9KTsNCn0NCg0KZnVuY3Rpb24gcGF0aF9icnVzaGVkKGQsIGkpIHsNCiAgaWYgKF9fLmJydXNoZWRDb2xvciAhPT0gbnVsbCkgew0KICAgIGN0eC5icnVzaGVkLnN0cm9rZVN0eWxlID0gZDMuZnVuY3RvcihfXy5icnVzaGVkQ29sb3IpKGQsIGkpOw0KICB9IGVsc2Ugew0KICAgIGN0eC5icnVzaGVkLnN0cm9rZVN0eWxlID0gZDMuZnVuY3RvcihfXy5jb2xvcikoZCwgaSk7DQogIH0NCiAgcmV0dXJuIGNvbG9yX3BhdGgoZCwgY3R4LmJydXNoZWQpDQp9DQoNCmZ1bmN0aW9uIHBhdGhfZm9yZWdyb3VuZChkLCBpKSB7DQogIGN0eC5mb3JlZ3JvdW5kLnN0cm9rZVN0eWxlID0gZDMuZnVuY3RvcihfXy5jb2xvcikoZCwgaSk7DQoJcmV0dXJuIGNvbG9yX3BhdGgoZCwgY3R4LmZvcmVncm91bmQpOw0KfTsNCg0KZnVuY3Rpb24gcGF0aF9oaWdobGlnaHQoZCwgaSkgew0KICBjdHguaGlnaGxpZ2h0LnN0cm9rZVN0eWxlID0gZDMuZnVuY3RvcihfXy5jb2xvcikoZCwgaSk7DQoJcmV0dXJuIGNvbG9yX3BhdGgoZCwgY3R4LmhpZ2hsaWdodCk7DQp9Ow0KcGMuY2xlYXIgPSBmdW5jdGlvbihsYXllcikgew0KICBjdHhbbGF5ZXJdLmNsZWFyUmVjdCgwLCAwLCB3KCkgKyAyLCBoKCkgKyAyKTsNCg0KICAvLyBUaGlzIHdpbGwgbWFrZSBzdXJlIHRoYXQgdGhlIGZvcmVncm91bmQgaXRlbXMgYXJlIHRyYW5zcGFyZW50DQogIC8vIHdpdGhvdXQgdGhlIG5lZWQgZm9yIGNoYW5naW5nIHRoZSBvcGFjaXR5IHN0eWxlIG9mIHRoZSBmb3JlZ3JvdW5kIGNhbnZhcw0KICAvLyBhcyB0aGlzIHdvdWxkIHN0b3AgdGhlIGNzcyBzdHlsaW5nIGZyb20gd29ya2luZw0KICBpZihsYXllciA9PT0gImJydXNoZWQiICYmIGlzQnJ1c2hlZCgpKSB7DQogICAgY3R4LmJydXNoZWQuZmlsbFN0eWxlID0gcGMuc2VsZWN0aW9uLnN0eWxlKCJiYWNrZ3JvdW5kLWNvbG9yIik7DQogICAgY3R4LmJydXNoZWQuZ2xvYmFsQWxwaGEgPSAxIC0gX18uYWxwaGFPbkJydXNoZWQ7DQogICAgY3R4LmJydXNoZWQuZmlsbFJlY3QoMCwgMCwgdygpICsgMiwgaCgpICsgMik7DQogICAgY3R4LmJydXNoZWQuZ2xvYmFsQWxwaGEgPSBfXy5hbHBoYTsNCiAgfQ0KICByZXR1cm4gdGhpczsNCn07DQpkMy5yZWJpbmQocGMsIGF4aXMsICJ0aWNrcyIsICJvcmllbnQiLCAidGlja1ZhbHVlcyIsICJ0aWNrU3ViZGl2aWRlIiwgInRpY2tTaXplIiwgInRpY2tQYWRkaW5nIiwgInRpY2tGb3JtYXQiKTsNCg0KZnVuY3Rpb24gZmxpcEF4aXNBbmRVcGRhdGVQQ1AoZGltZW5zaW9uKSB7DQogIHZhciBnID0gcGMuc3ZnLnNlbGVjdEFsbCgiLmRpbWVuc2lvbiIpOw0KDQogIHBjLmZsaXAoZGltZW5zaW9uKTsNCg0KICBkMy5zZWxlY3QodGhpcy5wYXJlbnRFbGVtZW50KQ0KICAgIC50cmFuc2l0aW9uKCkNCiAgICAgIC5kdXJhdGlvbigxMTAwKQ0KICAgICAgLmNhbGwoYXhpcy5zY2FsZSh5c2NhbGVbZGltZW5zaW9uXSkpOw0KDQogIHBjLnJlbmRlcigpOw0KfQ0KDQpmdW5jdGlvbiByb3RhdGVMYWJlbHMoKSB7DQogIHZhciBkZWx0YSA9IGQzLmV2ZW50LmRlbHRhWTsNCiAgZGVsdGEgPSBkZWx0YSA8IDAgPyAtNSA6IGRlbHRhOw0KICBkZWx0YSA9IGRlbHRhID4gMCA/IDUgOiBkZWx0YTsNCg0KICBfXy5kaW1lbnNpb25UaXRsZVJvdGF0aW9uICs9IGRlbHRhOw0KICBwYy5zdmcuc2VsZWN0QWxsKCJ0ZXh0LmxhYmVsIikNCiAgICAuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgwLC01KSByb3RhdGUoIiArIF9fLmRpbWVuc2lvblRpdGxlUm90YXRpb24gKyAiKSIpOw0KICBkMy5ldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KfQ0KDQpmdW5jdGlvbiBkaW1lbnNpb25MYWJlbHMoZCkgew0KICByZXR1cm4gZCBpbiBfXy5kaW1lbnNpb25UaXRsZXMgPyBfXy5kaW1lbnNpb25UaXRsZXNbZF0gOiBkOyAgLy8gZGltZW5zaW9uIGRpc3BsYXkgbmFtZXMNCn0NCg0KcGMuY3JlYXRlQXhlcyA9IGZ1bmN0aW9uKCkgew0KICBpZiAoZykgcGMucmVtb3ZlQXhlcygpOw0KDQogIC8vIEFkZCBhIGdyb3VwIGVsZW1lbnQgZm9yIGVhY2ggZGltZW5zaW9uLg0KICBnID0gcGMuc3ZnLnNlbGVjdEFsbCgiLmRpbWVuc2lvbiIpDQogICAgICAuZGF0YShfXy5kaW1lbnNpb25zLCBmdW5jdGlvbihkKSB7IHJldHVybiBkOyB9KQ0KICAgIC5lbnRlcigpLmFwcGVuZCgic3ZnOmciKQ0KICAgICAgLmF0dHIoImNsYXNzIiwgImRpbWVuc2lvbiIpDQogICAgICAuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gInRyYW5zbGF0ZSgiICsgeHNjYWxlKGQpICsgIikiOyB9KTsNCg0KICAvLyBBZGQgYW4gYXhpcyBhbmQgdGl0bGUuDQogIGcuYXBwZW5kKCJzdmc6ZyIpDQogICAgICAuYXR0cigiY2xhc3MiLCAiYXhpcyIpDQogICAgICAuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgwLDApIikNCiAgICAgIC5lYWNoKGZ1bmN0aW9uKGQpIHsgZDMuc2VsZWN0KHRoaXMpLmNhbGwoYXhpcy5zY2FsZSh5c2NhbGVbZF0pKTsgfSkNCiAgICAuYXBwZW5kKCJzdmc6dGV4dCIpDQogICAgICAuYXR0cih7DQogICAgICAgICJ0ZXh0LWFuY2hvciI6ICJtaWRkbGUiLA0KICAgICAgICAieSI6IDAsDQogICAgICAgICJ0cmFuc2Zvcm0iOiAidHJhbnNsYXRlKDAsLTUpIHJvdGF0ZSgiICsgX18uZGltZW5zaW9uVGl0bGVSb3RhdGlvbiArICIpIiwNCiAgICAgICAgIngiOiAwLA0KICAgICAgICAiY2xhc3MiOiAibGFiZWwiDQogICAgICB9KQ0KICAgICAgLnRleHQoZGltZW5zaW9uTGFiZWxzKQ0KICAgICAgLm9uKCJkYmxjbGljayIsIGZsaXBBeGlzQW5kVXBkYXRlUENQKQ0KICAgICAgLm9uKCJ3aGVlbCIsIHJvdGF0ZUxhYmVscyk7DQoNCiAgZmxhZ3MuYXhlcz0gdHJ1ZTsNCiAgcmV0dXJuIHRoaXM7DQp9Ow0KDQpwYy5yZW1vdmVBeGVzID0gZnVuY3Rpb24oKSB7DQogIGcucmVtb3ZlKCk7DQogIHJldHVybiB0aGlzOw0KfTsNCg0KcGMudXBkYXRlQXhlcyA9IGZ1bmN0aW9uKCkgew0KICB2YXIgZ19kYXRhID0gcGMuc3ZnLnNlbGVjdEFsbCgiLmRpbWVuc2lvbiIpLmRhdGEoX18uZGltZW5zaW9ucyk7DQoNCiAgLy8gRW50ZXINCiAgZ19kYXRhLmVudGVyKCkuYXBwZW5kKCJzdmc6ZyIpDQogICAgICAuYXR0cigiY2xhc3MiLCAiZGltZW5zaW9uIikNCiAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCBmdW5jdGlvbihwKSB7IHJldHVybiAidHJhbnNsYXRlKCIgKyBwb3NpdGlvbihwKSArICIpIjsgfSkNCiAgICAgIC5zdHlsZSgib3BhY2l0eSIsIDApDQogICAgLmFwcGVuZCgic3ZnOmciKQ0KICAgICAgLmF0dHIoImNsYXNzIiwgImF4aXMiKQ0KICAgICAgLmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoMCwwKSIpDQogICAgICAuZWFjaChmdW5jdGlvbihkKSB7IGQzLnNlbGVjdCh0aGlzKS5jYWxsKGF4aXMuc2NhbGUoeXNjYWxlW2RdKSk7IH0pDQogICAgLmFwcGVuZCgic3ZnOnRleHQiKQ0KICAgICAgLmF0dHIoew0KICAgICAgICAidGV4dC1hbmNob3IiOiAibWlkZGxlIiwNCiAgICAgICAgInkiOiAwLA0KICAgICAgICAidHJhbnNmb3JtIjogInRyYW5zbGF0ZSgwLC01KSByb3RhdGUoIiArIF9fLmRpbWVuc2lvblRpdGxlUm90YXRpb24gKyAiKSIsDQogICAgICAgICJ4IjogMCwNCiAgICAgICAgImNsYXNzIjogImxhYmVsIg0KICAgICAgfSkNCiAgICAgIC50ZXh0KGRpbWVuc2lvbkxhYmVscykNCiAgICAgIC5vbigiZGJsY2xpY2siLCBmbGlwQXhpc0FuZFVwZGF0ZVBDUCkNCiAgICAgIC5vbigid2hlZWwiLCByb3RhdGVMYWJlbHMpOw0KDQogIC8vIFVwZGF0ZQ0KICBnX2RhdGEuYXR0cigib3BhY2l0eSIsIDApOw0KICBnX2RhdGEuc2VsZWN0KCIuYXhpcyIpDQogICAgLnRyYW5zaXRpb24oKQ0KICAgICAgLmR1cmF0aW9uKDExMDApDQogICAgICAuZWFjaChmdW5jdGlvbihkKSB7DQogICAgICAgIGQzLnNlbGVjdCh0aGlzKS5jYWxsKGF4aXMuc2NhbGUoeXNjYWxlW2RdKSk7DQogICAgICB9KTsNCiAgZ19kYXRhLnNlbGVjdCgiLmxhYmVsIikNCiAgICAudHJhbnNpdGlvbigpDQogICAgICAuZHVyYXRpb24oMTEwMCkNCiAgICAgIC50ZXh0KGRpbWVuc2lvbkxhYmVscykNCiAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlKDAsLTUpIHJvdGF0ZSgiICsgX18uZGltZW5zaW9uVGl0bGVSb3RhdGlvbiArICIpIik7DQoNCiAgLy8gRXhpdA0KICBnX2RhdGEuZXhpdCgpLnJlbW92ZSgpOw0KDQogIGcgPSBwYy5zdmcuc2VsZWN0QWxsKCIuZGltZW5zaW9uIik7DQogIGcudHJhbnNpdGlvbigpLmR1cmF0aW9uKDExMDApDQogICAgLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKHApIHsgcmV0dXJuICJ0cmFuc2xhdGUoIiArIHBvc2l0aW9uKHApICsgIikiOyB9KQ0KICAgIC5zdHlsZSgib3BhY2l0eSIsIDEpOw0KDQogIHBjLnN2Zy5zZWxlY3RBbGwoIi5heGlzIikNCiAgICAudHJhbnNpdGlvbigpDQogICAgICAuZHVyYXRpb24oMTEwMCkNCiAgICAgIC5lYWNoKGZ1bmN0aW9uKGQpIHsgZDMuc2VsZWN0KHRoaXMpLmNhbGwoYXhpcy5zY2FsZSh5c2NhbGVbZF0pKTsgfSk7DQoNCiAgaWYgKGZsYWdzLmJydXNoYWJsZSkgcGMuYnJ1c2hhYmxlKCk7DQogIGlmIChmbGFncy5yZW9yZGVyYWJsZSkgcGMucmVvcmRlcmFibGUoKTsNCiAgaWYgKHBjLmJydXNoTW9kZSgpICE9PSAiTm9uZSIpIHsNCiAgICB2YXIgbW9kZSA9IHBjLmJydXNoTW9kZSgpOw0KICAgIHBjLmJydXNoTW9kZSgiTm9uZSIpOw0KICAgIHBjLmJydXNoTW9kZShtb2RlKTsNCiAgfQ0KICByZXR1cm4gdGhpczsNCn07DQoNCi8vIEphc29uIERhdmllcywgaHR0cDovL2JsLm9ja3Mub3JnLzEzNDEyODENCnBjLnJlb3JkZXJhYmxlID0gZnVuY3Rpb24oKSB7DQogIGlmICghZykgcGMuY3JlYXRlQXhlcygpOw0KDQogIGcuc3R5bGUoImN1cnNvciIsICJtb3ZlIikNCiAgICAuY2FsbChkMy5iZWhhdmlvci5kcmFnKCkNCiAgICAgIC5vbigiZHJhZ3N0YXJ0IiwgZnVuY3Rpb24oZCkgew0KICAgICAgICBkcmFnZ2luZ1tkXSA9IHRoaXMuX19vcmlnaW5fXyA9IHhzY2FsZShkKTsNCiAgICAgIH0pDQogICAgICAub24oImRyYWciLCBmdW5jdGlvbihkKSB7DQogICAgICAgIGRyYWdnaW5nW2RdID0gTWF0aC5taW4odygpLCBNYXRoLm1heCgwLCB0aGlzLl9fb3JpZ2luX18gKz0gZDMuZXZlbnQuZHgpKTsNCiAgICAgICAgX18uZGltZW5zaW9ucy5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIHBvc2l0aW9uKGEpIC0gcG9zaXRpb24oYik7IH0pOw0KICAgICAgICB4c2NhbGUuZG9tYWluKF9fLmRpbWVuc2lvbnMpOw0KICAgICAgICBwYy5yZW5kZXIoKTsNCiAgICAgICAgZy5hdHRyKCJ0cmFuc2Zvcm0iLCBmdW5jdGlvbihkKSB7IHJldHVybiAidHJhbnNsYXRlKCIgKyBwb3NpdGlvbihkKSArICIpIjsgfSk7DQogICAgICB9KQ0KICAgICAgLm9uKCJkcmFnZW5kIiwgZnVuY3Rpb24oZCkgew0KICAgICAgICAvLyBMZXQncyBzZWUgaWYgdGhlIG9yZGVyIGhhcyBjaGFuZ2VkIGFuZCBzZW5kIG91dCBhbiBldmVudCBpZiBzby4NCiAgICAgICAgdmFyIGkgPSAwLA0KICAgICAgICAgICAgaiA9IF9fLmRpbWVuc2lvbnMuaW5kZXhPZihkKSwNCiAgICAgICAgICAgIGVsZW0gPSB0aGlzLA0KICAgICAgICAgICAgcGFyZW50ID0gdGhpcy5wYXJlbnRFbGVtZW50Ow0KDQogICAgICAgIHdoaWxlKChlbGVtID0gZWxlbS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSAhPSBudWxsKSArK2k7DQogICAgICAgIGlmIChpICE9PSBqKSB7DQogICAgICAgICAgZXZlbnRzLmF4ZXNyZW9yZGVyLmNhbGwocGMsIF9fLmRpbWVuc2lvbnMpOw0KICAgICAgICAgIC8vIFdlIG5vdyBhbHNvIHdhbnQgdG8gcmVvcmRlciB0aGUgYWN0dWFsIGRvbSBlbGVtZW50cyB0aGF0IHJlcHJlc2VudA0KICAgICAgICAgIC8vIHRoZSBheGVzLiBUaGF0IGlzLCB0aGUgZy5kaW1lbnNpb24gZWxlbWVudHMuIElmIHdlIGRvbid0IGRvIHRoaXMsDQogICAgICAgICAgLy8gd2UgZ2V0IGEgd2VpcmQgYW5kIGNvbmZ1c2luZyB0cmFuc2l0aW9uIHdoZW4gdXBkYXRlQXhlcyBpcyBjYWxsZWQuDQogICAgICAgICAgLy8gVGhpcyBpcyBkdWUgdG8gdGhlIGZhY3QgdGhhdCwgaW5pdGlhbGx5IHRoZSBudGggZy5kaW1lbnNpb24gZWxlbWVudA0KICAgICAgICAgIC8vIHJlcHJlc2VudHMgdGhlIG50aCBheGlzLiBIb3dldmVyLCBhZnRlciBhIG1hbnVhbCByZW9yZGVyaW5nLA0KICAgICAgICAgIC8vIHdpdGhvdXQgcmVvcmRlcmluZyB0aGUgZG9tIGVsZW1lbnRzLCB0aGUgbnRoIGRvbSBlbGVtZW50cyBubyBsb25nZXINCiAgICAgICAgICAvLyBuZWNlc3NhcmlseSByZXByZXNlbnRzIHRoZSBudGggYXhpcy4NCiAgICAgICAgICAvLw0KICAgICAgICAgIC8vIGkgaXMgdGhlIG9yaWdpbmFsIGluZGV4IG9mIHRoZSBkb20gZWxlbWVudA0KICAgICAgICAgIC8vIGogaXMgdGhlIG5ldyBpbmRleCBvZiB0aGUgZG9tIGVsZW1lbnQNCiAgICAgICAgICBpZiAoaSA+IGopIHsgLy8gRWxlbWVudCBtb3ZlZCBsZWZ0DQogICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKHRoaXMsIHBhcmVudC5jaGlsZHJlbltqIC0gMV0pOw0KICAgICAgICAgIH0gZWxzZSB7ICAgICAvLyBFbGVtZW50IG1vdmVkIHJpZ2h0DQogICAgICAgICAgICBpZiAoKGogKyAxKSA8IHBhcmVudC5jaGlsZHJlbi5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZSh0aGlzLCBwYXJlbnQuY2hpbGRyZW5baiArIDFdKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZCh0aGlzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBkZWxldGUgdGhpcy5fX29yaWdpbl9fOw0KICAgICAgICBkZWxldGUgZHJhZ2dpbmdbZF07DQogICAgICAgIGQzLnNlbGVjdCh0aGlzKS50cmFuc2l0aW9uKCkuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgiICsgeHNjYWxlKGQpICsgIikiKTsNCiAgICAgICAgcGMucmVuZGVyKCk7DQogICAgICB9KSk7DQogIGZsYWdzLnJlb3JkZXJhYmxlID0gdHJ1ZTsNCiAgcmV0dXJuIHRoaXM7DQp9Ow0KDQovLyBSZW9yZGVyIGRpbWVuc2lvbnMsIHN1Y2ggdGhhdCB0aGUgaGlnaGVzdCB2YWx1ZSAodmlzdWFsbHkpIGlzIG9uIHRoZSBsZWZ0IGFuZA0KLy8gdGhlIGxvd2VzdCBvbiB0aGUgcmlnaHQuIFZpc3VhbCB2YWx1ZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIGRhdGEgdmFsdWVzIGluDQovLyB0aGUgZ2l2ZW4gcm93Lg0KcGMucmVvcmRlciA9IGZ1bmN0aW9uKHJvd2RhdGEpIHsNCiAgdmFyIGRpbXMgPSBfXy5kaW1lbnNpb25zLnNsaWNlKDApOw0KICBfXy5kaW1lbnNpb25zLnNvcnQoZnVuY3Rpb24oYSwgYikgew0KICAgIHZhciBwaXhlbERpZmZlcmVuY2UgPSB5c2NhbGVbYV0ocm93ZGF0YVthXSkgLSB5c2NhbGVbYl0ocm93ZGF0YVtiXSk7DQoNCiAgICAvLyBBcnJheS5zb3J0IGlzIG5vdCBuZWNlc3NhcmlseSBzdGFibGUsIHRoaXMgbWVhbnMgdGhhdCBpZiBwaXhlbERpZmZlcmVuY2UgaXMgemVybw0KICAgIC8vIHRoZSBvcmRlcmluZyBvZiBkaW1lbnNpb25zIG1pZ2h0IGNoYW5nZSB1bmV4cGVjdGVkbHkuIFRoaXMgaXMgc29sdmVkIGJ5IHNvcnRpbmcgb24NCiAgICAvLyB2YXJpYWJsZSBuYW1lIGluIHRoYXQgY2FzZS4NCiAgICBpZiAocGl4ZWxEaWZmZXJlbmNlID09PSAwKSB7DQogICAgICByZXR1cm4gYS5sb2NhbGVDb21wYXJlKGIpOw0KICAgIH0gLy8gZWxzZQ0KICAgIHJldHVybiBwaXhlbERpZmZlcmVuY2U7DQogIH0pOw0KDQogIC8vIE5PVEU6IHRoaXMgaXMgcmVsYXRpdmVseSBjaGVhcCBnaXZlbiB0aGF0Og0KICAvLyBudW1iZXIgb2YgZGltZW5zaW9ucyA8IG51bWJlciBvZiBkYXRhIGl0ZW1zDQogIC8vIFRodXMgd2UgY2hlY2sgZXF1YWxpdHkgb2Ygb3JkZXIgdG8gcHJldmVudCByZXJlbmRlcmluZyB3aGVuIHRoaXMgaXMgdGhlIGNhc2UuDQogIHZhciByZW9yZGVyZWQgPSBmYWxzZTsNCiAgZGltcy5zb21lKGZ1bmN0aW9uKHZhbCwgaW5kZXgpIHsNCiAgICByZW9yZGVyZWQgPSB2YWwgIT09IF9fLmRpbWVuc2lvbnNbaW5kZXhdOw0KICAgIHJldHVybiByZW9yZGVyZWQ7DQogIH0pOw0KDQogIGlmIChyZW9yZGVyZWQpIHsNCiAgICB4c2NhbGUuZG9tYWluKF9fLmRpbWVuc2lvbnMpOw0KICAgIHZhciBoaWdobGlnaHRlZCA9IF9fLmhpZ2hsaWdodGVkLnNsaWNlKDApOw0KICAgIHBjLnVuaGlnaGxpZ2h0KCk7DQoNCiAgICBnLnRyYW5zaXRpb24oKQ0KICAgICAgLmR1cmF0aW9uKDE1MDApDQogICAgICAuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgew0KICAgICAgICByZXR1cm4gInRyYW5zbGF0ZSgiICsgeHNjYWxlKGQpICsgIikiOw0KICAgICAgfSk7DQogICAgcGMucmVuZGVyKCk7DQoNCiAgICAvLyBwYy5oaWdobGlnaHQoKSBkb2VzIG5vdCBjaGVjayB3aGV0aGVyIGhpZ2hsaWdodGVkIGlzIGxlbmd0aCB6ZXJvLCBzbyB3ZSBkbyB0aGF0IGhlcmUuDQogICAgaWYgKGhpZ2hsaWdodGVkLmxlbmd0aCAhPT0gMCkgew0KICAgICAgcGMuaGlnaGxpZ2h0KGhpZ2hsaWdodGVkKTsNCiAgICB9DQogIH0NCn0NCg0KLy8gcGFpcnMgb2YgYWRqYWNlbnQgZGltZW5zaW9ucw0KcGMuYWRqYWNlbnRfcGFpcnMgPSBmdW5jdGlvbihhcnIpIHsNCiAgdmFyIHJldCA9IFtdOw0KICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGgtMTsgaSsrKSB7DQogICAgcmV0LnB1c2goW2FycltpXSxhcnJbaSsxXV0pOw0KICB9Ow0KICByZXR1cm4gcmV0Ow0KfTsNCg0KdmFyIGJydXNoID0gew0KICBtb2Rlczogew0KICAgICJOb25lIjogew0KICAgICAgaW5zdGFsbDogZnVuY3Rpb24ocGMpIHt9LCAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gYmUgZG9uZS4NCiAgICAgIHVuaW5zdGFsbDogZnVuY3Rpb24ocGMpIHt9LCAgICAgICAgICAvLyBOb3RoaW5nIHRvIGJlIGRvbmUuDQogICAgICBzZWxlY3RlZDogZnVuY3Rpb24oKSB7IHJldHVybiBbXTsgfSwgLy8gTm90aGluZyB0byByZXR1cm4NCiAgICAgIGJydXNoU3RhdGU6IGZ1bmN0aW9uKCkgeyByZXR1cm4ge307IH0NCiAgICB9DQogIH0sDQogIG1vZGU6ICJOb25lIiwNCiAgcHJlZGljYXRlOiAiQU5EIiwNCiAgY3VycmVudE1vZGU6IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aGlzLm1vZGVzW3RoaXMubW9kZV07DQogIH0NCn07DQoNCi8vIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yICdsaXZlJyB1cGRhdGVzIG9mIGJydXNoZXMuIFRoYXQgaXMsIGR1cmluZyB0aGUNCi8vIHNwZWNpZmljYXRpb24gb2YgYSBicnVzaCwgdGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byB1cGRhdGUgdGhlIHZpZXcuDQovLw0KLy8gQHBhcmFtIG5ld1NlbGVjdGlvbiAtIFRoZSBuZXcgc2V0IG9mIGRhdGEgaXRlbXMgdGhhdCBpcyBjdXJyZW50bHkgY29udGFpbmVkDQovLyAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIGJydXNoZXMNCmZ1bmN0aW9uIGJydXNoVXBkYXRlZChuZXdTZWxlY3Rpb24pIHsNCiAgX18uYnJ1c2hlZCA9IG5ld1NlbGVjdGlvbjsNCiAgZXZlbnRzLmJydXNoLmNhbGwocGMsX18uYnJ1c2hlZCk7DQogIHBjLnJlbmRlckJydXNoZWQoKTsNCn0NCg0KZnVuY3Rpb24gYnJ1c2hQcmVkaWNhdGUocHJlZGljYXRlKSB7DQogIGlmICghYXJndW1lbnRzLmxlbmd0aCkgeyByZXR1cm4gYnJ1c2gucHJlZGljYXRlOyB9DQoNCiAgcHJlZGljYXRlID0gU3RyaW5nKHByZWRpY2F0ZSkudG9VcHBlckNhc2UoKTsNCiAgaWYgKHByZWRpY2F0ZSAhPT0gIkFORCIgJiYgcHJlZGljYXRlICE9PSAiT1IiKSB7DQogICAgdGhyb3cgIkludmFsaWQgcHJlZGljYXRlICIgKyBwcmVkaWNhdGU7DQogIH0NCg0KICBicnVzaC5wcmVkaWNhdGUgPSBwcmVkaWNhdGU7DQogIF9fLmJydXNoZWQgPSBicnVzaC5jdXJyZW50TW9kZSgpLnNlbGVjdGVkKCk7DQogIHBjLnJlbmRlckJydXNoZWQoKTsNCiAgcmV0dXJuIHBjOw0KfQ0KDQpwYy5icnVzaE1vZGVzID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhicnVzaC5tb2Rlcyk7DQp9Ow0KDQpwYy5icnVzaE1vZGUgPSBmdW5jdGlvbihtb2RlKSB7DQogIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7DQogICAgcmV0dXJuIGJydXNoLm1vZGU7DQogIH0NCg0KICBpZiAocGMuYnJ1c2hNb2RlcygpLmluZGV4T2YobW9kZSkgPT09IC0xKSB7DQogICAgdGhyb3cgInBjLmJydXNobW9kZTogVW5zdXBwb3J0ZWQgYnJ1c2ggbW9kZTogIiArIG1vZGU7DQogIH0NCg0KICAvLyBNYWtlIHN1cmUgdGhhdCB3ZSBkb24ndCB0cmlnZ2VyIHVubmVjZXNzYXJ5IGV2ZW50cyBieSBjaGVja2luZyBpZiB0aGUgbW9kZQ0KICAvLyBhY3R1YWxseSBjaGFuZ2VzLg0KICBpZiAobW9kZSAhPT0gYnJ1c2gubW9kZSkgew0KICAgIC8vIFdoZW4gY2hhbmdpbmcgYnJ1c2ggbW9kZXMsIHRoZSBmaXJzdCB0aGluZyB3ZSBuZWVkIHRvIGRvIGlzIGNsZWFyaW5nIGFueQ0KICAgIC8vIGJydXNoZXMgZnJvbSB0aGUgY3VycmVudCBtb2RlLCBpZiBhbnkuDQogICAgaWYgKGJydXNoLm1vZGUgIT09ICJOb25lIikgew0KICAgICAgcGMuYnJ1c2hSZXNldCgpOw0KICAgIH0NCg0KICAgIC8vIE5leHQsIHdlIG5lZWQgdG8gJ3VuaW5zdGFsbCcgdGhlIGN1cnJlbnQgYnJ1c2hNb2RlLg0KICAgIGJydXNoLm1vZGVzW2JydXNoLm1vZGVdLnVuaW5zdGFsbChwYyk7DQogICAgLy8gRmluYWxseSwgd2UgY2FuIGluc3RhbGwgdGhlIHJlcXVlc3RlZCBvbmUuDQogICAgYnJ1c2gubW9kZSA9IG1vZGU7DQogICAgYnJ1c2gubW9kZXNbYnJ1c2gubW9kZV0uaW5zdGFsbCgpOw0KICAgIGlmIChtb2RlID09PSAiTm9uZSIpIHsNCiAgICAgIGRlbGV0ZSBwYy5icnVzaFByZWRpY2F0ZTsNCiAgICB9IGVsc2Ugew0KICAgICAgcGMuYnJ1c2hQcmVkaWNhdGUgPSBicnVzaFByZWRpY2F0ZTsNCiAgICB9DQogIH0NCg0KICByZXR1cm4gcGM7DQp9Ow0KDQovLyBicnVzaCBtb2RlOiAxRC1BeGVzDQoNCihmdW5jdGlvbigpIHsNCiAgdmFyIGJydXNoZXMgPSB7fTsNCg0KICBmdW5jdGlvbiBpc19icnVzaGVkKHApIHsNCiAgICByZXR1cm4gIWJydXNoZXNbcF0uZW1wdHkoKTsNCiAgfQ0KDQogIC8vIGRhdGEgd2l0aGluIGV4dGVudHMNCiAgZnVuY3Rpb24gc2VsZWN0ZWQoKSB7DQogICAgdmFyIGFjdGl2ZXMgPSBfXy5kaW1lbnNpb25zLmZpbHRlcihpc19icnVzaGVkKSwNCiAgICAgICAgZXh0ZW50cyA9IGFjdGl2ZXMubWFwKGZ1bmN0aW9uKHApIHsgcmV0dXJuIGJydXNoZXNbcF0uZXh0ZW50KCk7IH0pOw0KDQogICAgLy8gV2UgZG9uJ3Qgd2FudCB0byByZXR1cm4gdGhlIGZ1bGwgZGF0YSBzZXQgd2hlbiB0aGVyZSBhcmUgbm8gYXhlcyBicnVzaGVkLg0KICAgIC8vIEFjdHVhbGx5LCB3aGVuIHRoZXJlIGFyZSBubyBheGVzIGJydXNoZWQsIGJ5IGRlZmluaXRpb24sIG5vIGl0ZW1zIGFyZQ0KICAgIC8vIHNlbGVjdGVkLiBTbywgbGV0J3MgYXZvaWQgdGhlIGZpbHRlcmluZyBhbmQganVzdCByZXR1cm4gZmFsc2UuDQogICAgLy9pZiAoYWN0aXZlcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTsNCg0KICAgIC8vIFJlc29sdmVzIGJyb2tlbiBleGFtcGxlcyBmb3Igbm93LiBUaGV5IGV4cGVjdCB0byBnZXQgdGhlIGZ1bGwgZGF0YXNldCBiYWNrIGZyb20gZW1wdHkgYnJ1c2hlcw0KICAgIGlmIChhY3RpdmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIF9fLmRhdGE7DQoNCiAgICAvLyB0ZXN0IGlmIHdpdGhpbiByYW5nZQ0KICAgIHZhciB3aXRoaW4gPSB7DQogICAgICAiZGF0ZSI6IGZ1bmN0aW9uKGQscCxkaW1lbnNpb24pIHsNCiAgICAgICAgcmV0dXJuIGV4dGVudHNbZGltZW5zaW9uXVswXSA8PSBkW3BdICYmIGRbcF0gPD0gZXh0ZW50c1tkaW1lbnNpb25dWzFdDQogICAgICB9LA0KICAgICAgIm51bWJlciI6IGZ1bmN0aW9uKGQscCxkaW1lbnNpb24pIHsNCiAgICAgICAgcmV0dXJuIGV4dGVudHNbZGltZW5zaW9uXVswXSA8PSBkW3BdICYmIGRbcF0gPD0gZXh0ZW50c1tkaW1lbnNpb25dWzFdDQogICAgICB9LA0KICAgICAgInN0cmluZyI6IGZ1bmN0aW9uKGQscCxkaW1lbnNpb24pIHsNCiAgICAgICAgcmV0dXJuIGV4dGVudHNbZGltZW5zaW9uXVswXSA8PSB5c2NhbGVbcF0oZFtwXSkgJiYgeXNjYWxlW3BdKGRbcF0pIDw9IGV4dGVudHNbZGltZW5zaW9uXVsxXQ0KICAgICAgfQ0KICAgIH07DQoNCiAgICByZXR1cm4gX18uZGF0YQ0KICAgICAgLmZpbHRlcihmdW5jdGlvbihkKSB7DQogICAgICAgIHN3aXRjaChicnVzaC5wcmVkaWNhdGUpIHsNCiAgICAgICAgY2FzZSAiQU5EIjoNCiAgICAgICAgICByZXR1cm4gYWN0aXZlcy5ldmVyeShmdW5jdGlvbihwLCBkaW1lbnNpb24pIHsNCiAgICAgICAgICAgIHJldHVybiB3aXRoaW5bX18udHlwZXNbcF1dKGQscCxkaW1lbnNpb24pOw0KICAgICAgICAgIH0pOw0KICAgICAgICBjYXNlICJPUiI6DQogICAgICAgICAgcmV0dXJuIGFjdGl2ZXMuc29tZShmdW5jdGlvbihwLCBkaW1lbnNpb24pIHsNCiAgICAgICAgICAgIHJldHVybiB3aXRoaW5bX18udHlwZXNbcF1dKGQscCxkaW1lbnNpb24pOw0KICAgICAgICAgIH0pOw0KICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgIHRocm93ICJVbmtub3duIGJydXNoIHByZWRpY2F0ZSAiICsgX18uYnJ1c2hQcmVkaWNhdGU7DQogICAgICAgIH0NCiAgICAgIH0pOw0KICB9Ow0KDQogIGZ1bmN0aW9uIGJydXNoRXh0ZW50cygpIHsNCiAgICB2YXIgZXh0ZW50cyA9IHt9Ow0KICAgIF9fLmRpbWVuc2lvbnMuZm9yRWFjaChmdW5jdGlvbihkKSB7DQogICAgICB2YXIgYnJ1c2ggPSBicnVzaGVzW2RdOw0KICAgICAgaWYgKGJydXNoICE9PSB1bmRlZmluZWQgJiYgIWJydXNoLmVtcHR5KCkpIHsNCiAgICAgICAgdmFyIGV4dGVudCA9IGJydXNoLmV4dGVudCgpOw0KICAgICAgICBleHRlbnQuc29ydChkMy5hc2NlbmRpbmcpOw0KICAgICAgICBleHRlbnRzW2RdID0gZXh0ZW50Ow0KICAgICAgfQ0KICAgIH0pOw0KICAgIHJldHVybiBleHRlbnRzOw0KICB9DQoNCiAgZnVuY3Rpb24gYnJ1c2hGb3IoYXhpcykgew0KICAgIHZhciBicnVzaCA9IGQzLnN2Zy5icnVzaCgpOw0KDQogICAgYnJ1c2gNCiAgICAgIC55KHlzY2FsZVtheGlzXSkNCiAgICAgIC5vbigiYnJ1c2hzdGFydCIsIGZ1bmN0aW9uKCkgeyBkMy5ldmVudC5zb3VyY2VFdmVudC5zdG9wUHJvcGFnYXRpb24oKSB9KQ0KICAgICAgLm9uKCJicnVzaCIsIGZ1bmN0aW9uKCkgew0KICAgICAgICBicnVzaFVwZGF0ZWQoc2VsZWN0ZWQoKSk7DQogICAgICB9KQ0KICAgICAgLm9uKCJicnVzaGVuZCIsIGZ1bmN0aW9uKCkgew0KICAgICAgICBldmVudHMuYnJ1c2hlbmQuY2FsbChwYywgX18uYnJ1c2hlZCk7DQogICAgICB9KTsNCg0KICAgIGJydXNoZXNbYXhpc10gPSBicnVzaDsNCiAgICByZXR1cm4gYnJ1c2g7DQogIH0NCg0KICBmdW5jdGlvbiBicnVzaFJlc2V0KGRpbWVuc2lvbikgew0KICAgIF9fLmJydXNoZWQgPSBmYWxzZTsNCiAgICBpZiAoZykgew0KICAgICAgZy5zZWxlY3RBbGwoJy5icnVzaCcpDQogICAgICAgIC5lYWNoKGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgICBkMy5zZWxlY3QodGhpcykuY2FsbCgNCiAgICAgICAgICAgIGJydXNoZXNbZF0uY2xlYXIoKQ0KICAgICAgICAgICk7DQogICAgICAgIH0pOw0KICAgICAgcGMucmVuZGVyQnJ1c2hlZCgpOw0KICAgIH0NCiAgICByZXR1cm4gdGhpczsNCiAgfTsNCg0KICBmdW5jdGlvbiBpbnN0YWxsKCkgew0KICAgIGlmICghZykgcGMuY3JlYXRlQXhlcygpOw0KDQogICAgLy8gQWRkIGFuZCBzdG9yZSBhIGJydXNoIGZvciBlYWNoIGF4aXMuDQogICAgZy5hcHBlbmQoInN2ZzpnIikNCiAgICAgIC5hdHRyKCJjbGFzcyIsICJicnVzaCIpDQogICAgICAuZWFjaChmdW5jdGlvbihkKSB7DQogICAgICAgIGQzLnNlbGVjdCh0aGlzKS5jYWxsKGJydXNoRm9yKGQpKTsNCiAgICAgIH0pDQogICAgICAuc2VsZWN0QWxsKCJyZWN0IikNCiAgICAgICAgLnN0eWxlKCJ2aXNpYmlsaXR5IiwgbnVsbCkNCiAgICAgICAgLmF0dHIoIngiLCAtMTUpDQogICAgICAgIC5hdHRyKCJ3aWR0aCIsIDMwKTsNCg0KICAgIHBjLmJydXNoRXh0ZW50cyA9IGJydXNoRXh0ZW50czsNCiAgICBwYy5icnVzaFJlc2V0ID0gYnJ1c2hSZXNldDsNCiAgICByZXR1cm4gcGM7DQogIH0NCg0KICBicnVzaC5tb2Rlc1siMUQtYXhlcyJdID0gew0KICAgIGluc3RhbGw6IGluc3RhbGwsDQogICAgdW5pbnN0YWxsOiBmdW5jdGlvbigpIHsNCiAgICAgIGcuc2VsZWN0QWxsKCIuYnJ1c2giKS5yZW1vdmUoKTsNCiAgICAgIGJydXNoZXMgPSB7fTsNCiAgICAgIGRlbGV0ZSBwYy5icnVzaEV4dGVudHM7DQogICAgICBkZWxldGUgcGMuYnJ1c2hSZXNldDsNCiAgICB9LA0KICAgIHNlbGVjdGVkOiBzZWxlY3RlZCwNCiAgICBicnVzaFN0YXRlOiBicnVzaEV4dGVudHMNCiAgfQ0KfSkoKTsNCi8vIGJydXNoIG1vZGU6IDJELXN0cnVtcw0KLy8gYmwub2Nrcy5vcmcvc3ludGFnbWF0aWMvNTQ0MTAyMg0KDQooZnVuY3Rpb24oKSB7DQogIHZhciBzdHJ1bXMgPSB7fSwNCiAgICAgIHN0cnVtUmVjdDsNCg0KICBmdW5jdGlvbiBkcmF3U3RydW0oc3RydW0sIGFjdGl2ZVBvaW50KSB7DQogICAgdmFyIHN2ZyA9IHBjLnNlbGVjdGlvbi5zZWxlY3QoInN2ZyIpLnNlbGVjdCgiZyNzdHJ1bXMiKSwNCiAgICAgICAgaWQgPSBzdHJ1bS5kaW1zLmksDQogICAgICAgIHBvaW50cyA9IFtzdHJ1bS5wMSwgc3RydW0ucDJdLA0KICAgICAgICBsaW5lID0gc3ZnLnNlbGVjdEFsbCgibGluZSNzdHJ1bS0iICsgaWQpLmRhdGEoW3N0cnVtXSksDQogICAgICAgIGNpcmNsZXMgPSBzdmcuc2VsZWN0QWxsKCJjaXJjbGUjc3RydW0tIiArIGlkKS5kYXRhKHBvaW50cyksDQogICAgICAgIGRyYWcgPSBkMy5iZWhhdmlvci5kcmFnKCk7DQoNCiAgICBsaW5lLmVudGVyKCkNCiAgICAgIC5hcHBlbmQoImxpbmUiKQ0KICAgICAgLmF0dHIoImlkIiwgInN0cnVtLSIgKyBpZCkNCiAgICAgIC5hdHRyKCJjbGFzcyIsICJzdHJ1bSIpOw0KDQogICAgbGluZQ0KICAgICAgLmF0dHIoIngxIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5wMVswXTsgfSkNCiAgICAgIC5hdHRyKCJ5MSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQucDFbMV07IH0pDQogICAgICAuYXR0cigieDIiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnAyWzBdOyB9KQ0KICAgICAgLmF0dHIoInkyIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5wMlsxXTsgfSkNCiAgICAgIC5hdHRyKCJzdHJva2UiLCAiYmxhY2siKQ0KICAgICAgLmF0dHIoInN0cm9rZS13aWR0aCIsIDIpOw0KDQogICAgZHJhZw0KICAgICAgLm9uKCJkcmFnIiwgZnVuY3Rpb24oZCwgaSkgew0KICAgICAgICB2YXIgZXYgPSBkMy5ldmVudDsNCiAgICAgICAgaSA9IGkgKyAxOw0KICAgICAgICBzdHJ1bVsicCIgKyBpXVswXSA9IE1hdGgubWluKE1hdGgubWF4KHN0cnVtLm1pblggKyAxLCBldi54KSwgc3RydW0ubWF4WCk7DQogICAgICAgIHN0cnVtWyJwIiArIGldWzFdID0gTWF0aC5taW4oTWF0aC5tYXgoc3RydW0ubWluWSwgZXYueSksIHN0cnVtLm1heFkpOw0KICAgICAgICBkcmF3U3RydW0oc3RydW0sIGkgLSAxKTsNCiAgICAgIH0pDQogICAgICAub24oImRyYWdlbmQiLCBvbkRyYWdFbmQoKSk7DQoNCiAgICBjaXJjbGVzLmVudGVyKCkNCiAgICAgIC5hcHBlbmQoImNpcmNsZSIpDQogICAgICAuYXR0cigiaWQiLCAic3RydW0tIiArIGlkKQ0KICAgICAgLmF0dHIoImNsYXNzIiwgInN0cnVtIik7DQoNCiAgICBjaXJjbGVzDQogICAgICAuYXR0cigiY3giLCBmdW5jdGlvbihkKSB7IHJldHVybiBkWzBdOyB9KQ0KICAgICAgLmF0dHIoImN5IiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZFsxXTsgfSkNCiAgICAgIC5hdHRyKCJyIiwgNSkNCiAgICAgIC5zdHlsZSgib3BhY2l0eSIsIGZ1bmN0aW9uKGQsIGkpIHsNCiAgICAgICAgcmV0dXJuIChhY3RpdmVQb2ludCAhPT0gdW5kZWZpbmVkICYmIGkgPT09IGFjdGl2ZVBvaW50KSA/IDAuOCA6IDA7DQogICAgICB9KQ0KICAgICAgLm9uKCJtb3VzZW92ZXIiLCBmdW5jdGlvbigpIHsNCiAgICAgICAgZDMuc2VsZWN0KHRoaXMpLnN0eWxlKCJvcGFjaXR5IiwgMC44KTsNCiAgICAgIH0pDQogICAgICAub24oIm1vdXNlb3V0IiwgZnVuY3Rpb24oKSB7DQogICAgICAgIGQzLnNlbGVjdCh0aGlzKS5zdHlsZSgib3BhY2l0eSIsIDApOw0KICAgICAgfSkNCiAgICAgIC5jYWxsKGRyYWcpOw0KICB9DQoNCiAgZnVuY3Rpb24gZGltZW5zaW9uc0ZvclBvaW50KHApIHsNCiAgICB2YXIgZGltcyA9IHsgaTogLTEsIGxlZnQ6IHVuZGVmaW5lZCwgcmlnaHQ6IHVuZGVmaW5lZCB9Ow0KICAgIF9fLmRpbWVuc2lvbnMuc29tZShmdW5jdGlvbihkaW0sIGkpIHsNCiAgICAgIGlmICh4c2NhbGUoZGltKSA8IHBbMF0pIHsNCiAgICAgICAgdmFyIG5leHQgPSBfXy5kaW1lbnNpb25zW2kgKyAxXTsNCiAgICAgICAgZGltcy5pID0gaTsNCiAgICAgICAgZGltcy5sZWZ0ID0gZGltOw0KICAgICAgICBkaW1zLnJpZ2h0ID0gbmV4dDsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIHRydWU7DQogICAgfSk7DQoNCiAgICBpZiAoZGltcy5sZWZ0ID09PSB1bmRlZmluZWQpIHsNCiAgICAgIC8vIEV2ZW50IG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGZpcnN0IGF4aXMuDQogICAgICBkaW1zLmkgPSAwOw0KICAgICAgZGltcy5sZWZ0ID0gX18uZGltZW5zaW9uc1swXTsNCiAgICAgIGRpbXMucmlnaHQgPSBfXy5kaW1lbnNpb25zWzFdOw0KICAgIH0gZWxzZSBpZiAoZGltcy5yaWdodCA9PT0gdW5kZWZpbmVkKSB7DQogICAgICAvLyBFdmVudCBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgbGFzdCBheGlzDQogICAgICBkaW1zLmkgPSBfXy5kaW1lbnNpb25zLmxlbmd0aCAtIDE7DQogICAgICBkaW1zLnJpZ2h0ID0gZGltcy5sZWZ0Ow0KICAgICAgZGltcy5sZWZ0ID0gX18uZGltZW5zaW9uc1tfXy5kaW1lbnNpb25zLmxlbmd0aCAtIDJdOw0KICAgIH0NCg0KICAgIHJldHVybiBkaW1zOw0KICB9DQoNCiAgZnVuY3Rpb24gb25EcmFnU3RhcnQoKSB7DQogICAgLy8gRmlyc3Qgd2UgbmVlZCB0byBkZXRlcm1pbmUgYmV0d2VlbiB3aGljaCB0d28gYXhlcyB0aGUgc3R1cm0gd2FzIHN0YXJ0ZWQuDQogICAgLy8gVGhpcyB3aWxsIGRldGVybWluZSB0aGUgZnJlZWRvbSBvZiBtb3ZlbWVudCwgYmVjYXVzZSBhIHN0cnVtIGNhbg0KICAgIC8vIGxvZ2ljYWxseSBvbmx5IGhhcHBlbiBiZXR3ZWVuIHR3byBheGVzLCBzbyBubyBtb3ZlbWVudCBvdXRzaWRlIHRoZXNlIGF4ZXMNCiAgICAvLyBzaG91bGQgYmUgYWxsb3dlZC4NCiAgICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgcCA9IGQzLm1vdXNlKHN0cnVtUmVjdFswXVswXSksDQogICAgICAgICAgZGltcywNCiAgICAgICAgICBzdHJ1bTsNCg0KICAgICAgcFswXSA9IHBbMF0gLSBfXy5tYXJnaW4ubGVmdDsNCiAgICAgIHBbMV0gPSBwWzFdIC0gX18ubWFyZ2luLnRvcDsNCg0KICAgICAgZGltcyA9IGRpbWVuc2lvbnNGb3JQb2ludChwKSwNCiAgICAgIHN0cnVtID0gew0KICAgICAgICBwMTogcCwNCiAgICAgICAgZGltczogZGltcywNCiAgICAgICAgbWluWDogeHNjYWxlKGRpbXMubGVmdCksDQogICAgICAgIG1heFg6IHhzY2FsZShkaW1zLnJpZ2h0KSwNCiAgICAgICAgbWluWTogMCwNCiAgICAgICAgbWF4WTogaCgpDQogICAgICB9Ow0KDQogICAgICBzdHJ1bXNbZGltcy5pXSA9IHN0cnVtOw0KICAgICAgc3RydW1zLmFjdGl2ZSA9IGRpbXMuaTsNCg0KICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHBvaW50IGlzIHdpdGhpbiB0aGUgYm91bmRzDQogICAgICBzdHJ1bS5wMVswXSA9IE1hdGgubWluKE1hdGgubWF4KHN0cnVtLm1pblgsIHBbMF0pLCBzdHJ1bS5tYXhYKTsNCiAgICAgIHN0cnVtLnAyID0gc3RydW0ucDEuc2xpY2UoKTsNCiAgICB9Ow0KICB9DQoNCiAgZnVuY3Rpb24gb25EcmFnKCkgew0KICAgIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBldiA9IGQzLmV2ZW50LA0KICAgICAgICAgIHN0cnVtID0gc3RydW1zW3N0cnVtcy5hY3RpdmVdOw0KDQogICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgcG9pbnQgaXMgd2l0aGluIHRoZSBib3VuZHMNCiAgICAgIHN0cnVtLnAyWzBdID0gTWF0aC5taW4oTWF0aC5tYXgoc3RydW0ubWluWCArIDEsIGV2LnggLSBfXy5tYXJnaW4ubGVmdCksIHN0cnVtLm1heFgpOw0KICAgICAgc3RydW0ucDJbMV0gPSBNYXRoLm1pbihNYXRoLm1heChzdHJ1bS5taW5ZLCBldi55IC0gX18ubWFyZ2luLnRvcCksIHN0cnVtLm1heFkpOw0KICAgICAgZHJhd1N0cnVtKHN0cnVtLCAxKTsNCiAgICB9Ow0KICB9DQoNCiAgZnVuY3Rpb24gY29udGFpbm1lbnRUZXN0KHN0cnVtLCB3aWR0aCkgew0KICAgIHZhciBwMSA9IFtzdHJ1bS5wMVswXSAtIHN0cnVtLm1pblgsIHN0cnVtLnAxWzFdIC0gc3RydW0ubWluWF0sDQogICAgICAgIHAyID0gW3N0cnVtLnAyWzBdIC0gc3RydW0ubWluWCwgc3RydW0ucDJbMV0gLSBzdHJ1bS5taW5YXSwNCiAgICAgICAgbTEgPSAxIC0gd2lkdGggLyBwMVswXSwNCiAgICAgICAgYjEgPSBwMVsxXSAqICgxIC0gbTEpLA0KICAgICAgICBtMiA9IDEgLSB3aWR0aCAvIHAyWzBdLA0KICAgICAgICBiMiA9IHAyWzFdICogKDEgLSBtMik7DQoNCiAgICAvLyB0ZXN0IGlmIHBvaW50IGZhbGxzIGJldHdlZW4gbGluZXMNCiAgICByZXR1cm4gZnVuY3Rpb24ocCkgew0KICAgICAgdmFyIHggPSBwWzBdLA0KICAgICAgICAgIHkgPSBwWzFdLA0KICAgICAgICAgIHkxID0gbTEgKiB4ICsgYjEsDQogICAgICAgICAgeTIgPSBtMiAqIHggKyBiMjsNCg0KICAgICAgaWYgKHkgPiBNYXRoLm1pbih5MSwgeTIpICYmIHkgPCBNYXRoLm1heCh5MSwgeTIpKSB7DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgfQ0KDQogICAgICByZXR1cm4gZmFsc2U7DQogICAgfTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHNlbGVjdGVkKCkgew0KICAgIHZhciBpZHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzdHJ1bXMpLA0KICAgICAgICBicnVzaGVkID0gX18uZGF0YTsNCg0KICAgIC8vIEdldCB0aGUgaWRzIG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIHN0cnVtcy4NCiAgICBpZHMgPSBpZHMuZmlsdGVyKGZ1bmN0aW9uKGQpIHsNCiAgICAgIHJldHVybiAhaXNOYU4oZCk7DQogICAgfSk7DQoNCiAgICBmdW5jdGlvbiBjcm9zc2VzU3RydW0oZCwgaWQpIHsNCiAgICAgIHZhciBzdHJ1bSA9IHN0cnVtc1tpZF0sDQogICAgICAgICAgdGVzdCA9IGNvbnRhaW5tZW50VGVzdChzdHJ1bSwgc3RydW1zLndpZHRoKGlkKSksDQogICAgICAgICAgZDEgPSBzdHJ1bS5kaW1zLmxlZnQsDQogICAgICAgICAgZDIgPSBzdHJ1bS5kaW1zLnJpZ2h0LA0KICAgICAgICAgIHkxID0geXNjYWxlW2QxXSwNCiAgICAgICAgICB5MiA9IHlzY2FsZVtkMl0sDQogICAgICAgICAgcG9pbnQgPSBbeTEoZFtkMV0pIC0gc3RydW0ubWluWCwgeTIoZFtkMl0pIC0gc3RydW0ubWluWF07DQogICAgICByZXR1cm4gdGVzdChwb2ludCk7DQogICAgfQ0KDQogICAgaWYgKGlkcy5sZW5ndGggPT09IDApIHsgcmV0dXJuIGJydXNoZWQ7IH0NCg0KICAgIHJldHVybiBicnVzaGVkLmZpbHRlcihmdW5jdGlvbihkKSB7DQogICAgICBzd2l0Y2goYnJ1c2gucHJlZGljYXRlKSB7DQogICAgICBjYXNlICJBTkQiOg0KICAgICAgICByZXR1cm4gaWRzLmV2ZXJ5KGZ1bmN0aW9uKGlkKSB7IHJldHVybiBjcm9zc2VzU3RydW0oZCwgaWQpOyB9KTsNCiAgICAgIGNhc2UgIk9SIjoNCiAgICAgICAgcmV0dXJuIGlkcy5zb21lKGZ1bmN0aW9uKGlkKSB7IHJldHVybiBjcm9zc2VzU3RydW0oZCwgaWQpOyB9KTsNCiAgICAgIGRlZmF1bHQ6DQogICAgICAgIHRocm93ICJVbmtub3duIGJydXNoIHByZWRpY2F0ZSAiICsgX18uYnJ1c2hQcmVkaWNhdGU7DQogICAgICB9DQogICAgfSk7DQogIH0NCg0KICBmdW5jdGlvbiByZW1vdmVTdHJ1bSgpIHsNCiAgICB2YXIgc3RydW0gPSBzdHJ1bXNbc3RydW1zLmFjdGl2ZV0sDQogICAgICAgIHN2ZyA9IHBjLnNlbGVjdGlvbi5zZWxlY3QoInN2ZyIpLnNlbGVjdCgiZyNzdHJ1bXMiKTsNCg0KICAgIGRlbGV0ZSBzdHJ1bXNbc3RydW1zLmFjdGl2ZV07DQogICAgc3RydW1zLmFjdGl2ZSA9IHVuZGVmaW5lZDsNCiAgICBzdmcuc2VsZWN0QWxsKCJsaW5lI3N0cnVtLSIgKyBzdHJ1bS5kaW1zLmkpLnJlbW92ZSgpOw0KICAgIHN2Zy5zZWxlY3RBbGwoImNpcmNsZSNzdHJ1bS0iICsgc3RydW0uZGltcy5pKS5yZW1vdmUoKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIG9uRHJhZ0VuZCgpIHsNCiAgICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgYnJ1c2hlZCA9IF9fLmRhdGEsDQogICAgICAgICAgc3RydW0gPSBzdHJ1bXNbc3RydW1zLmFjdGl2ZV07DQoNCiAgICAgIC8vIE9rYXksIHNvbWV3aGF0IHVuZXhwZWN0ZWQsIGJ1dCBub3QgdG90YWxseSB1bnN1cnByaXNpbmcsIGEgbW91c2NsaWNrIGlzDQogICAgICAvLyBjb25zaWRlcmVkIGEgZHJhZyB3aXRob3V0IG1vdmUuIFNvIHdlIGhhdmUgdG8gZGVhbCB3aXRoIHRoYXQgY2FzZQ0KICAgICAgaWYgKHN0cnVtICYmIHN0cnVtLnAxWzBdID09PSBzdHJ1bS5wMlswXSAmJiBzdHJ1bS5wMVsxXSA9PT0gc3RydW0ucDJbMV0pIHsNCiAgICAgICAgcmVtb3ZlU3RydW0oc3RydW1zKTsNCiAgICAgIH0NCg0KICAgICAgYnJ1c2hlZCA9IHNlbGVjdGVkKHN0cnVtcyk7DQogICAgICBzdHJ1bXMuYWN0aXZlID0gdW5kZWZpbmVkOw0KICAgICAgX18uYnJ1c2hlZCA9IGJydXNoZWQ7DQogICAgICBwYy5yZW5kZXJCcnVzaGVkKCk7DQogICAgICBldmVudHMuYnJ1c2hlbmQuY2FsbChwYywgX18uYnJ1c2hlZCk7DQogICAgfTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGJydXNoUmVzZXQoc3RydW1zKSB7DQogICAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIGlkcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHN0cnVtcykuZmlsdGVyKGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgcmV0dXJuICFpc05hTihkKTsNCiAgICAgIH0pOw0KDQogICAgICBpZHMuZm9yRWFjaChmdW5jdGlvbihkKSB7DQogICAgICAgIHN0cnVtcy5hY3RpdmUgPSBkOw0KICAgICAgICByZW1vdmVTdHJ1bShzdHJ1bXMpOw0KICAgICAgfSk7DQogICAgICBvbkRyYWdFbmQoc3RydW1zKSgpOw0KICAgIH07DQogIH0NCg0KICBmdW5jdGlvbiBpbnN0YWxsKCkgew0KICAgIHZhciBkcmFnID0gZDMuYmVoYXZpb3IuZHJhZygpOw0KDQogICAgLy8gTWFwIG9mIGN1cnJlbnQgc3RydW1zLiBTdHJ1bXMgYXJlIHN0b3JlZCBwZXIgc2VnbWVudCBvZiB0aGUgUEMuIEEgc2VnbWVudCwNCiAgICAvLyBiZWluZyB0aGUgYXJlYSBiZXR3ZWVuIHR3byBheGVzLiBUaGUgbGVmdCBtb3N0IGFyZWEgaXMgaW5kZXhlZCBhdCAwLg0KICAgIHN0cnVtcy5hY3RpdmUgPSB1bmRlZmluZWQ7DQogICAgLy8gUmV0dXJucyB0aGUgd2lkdGggb2YgdGhlIFBDIHNlZ21lbnQgd2hlcmUgY3VycmVudGx5IGEgc3RydW0gaXMgYmVpbmcNCiAgICAvLyBwbGFjZWQuIE5PVEU6IGV2ZW4gdGhvdWdoIHRoZXkgYXJlIGV2ZW5seSBzcGFjZWQgaW4gb3VyIGN1cnJlbnQNCiAgICAvLyBpbXBsZW1lbnRhdGlvbiwgd2Uga2VlcCBmb3Igd2hlbiBub24tZXZlbiBzcGFjZWQgc2VnbWVudHMgYXJlIHN1cHBvcnRlZCBhcw0KICAgIC8vIHdlbGwuDQogICAgc3RydW1zLndpZHRoID0gZnVuY3Rpb24oaWQpIHsNCiAgICAgIHZhciBzdHJ1bSA9IHN0cnVtc1tpZF07DQoNCiAgICAgIGlmIChzdHJ1bSA9PT0gdW5kZWZpbmVkKSB7DQogICAgICAgIHJldHVybiB1bmRlZmluZWQ7DQogICAgICB9DQoNCiAgICAgIHJldHVybiBzdHJ1bS5tYXhYIC0gc3RydW0ubWluWDsNCiAgICB9Ow0KDQogICAgcGMub24oImF4ZXNyZW9yZGVyLnN0cnVtcyIsIGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIGlkcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHN0cnVtcykuZmlsdGVyKGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgcmV0dXJuICFpc05hTihkKTsNCiAgICAgIH0pOw0KDQogICAgICAvLyBDaGVja3MgaWYgdGhlIGZpcnN0IGRpbWVuc2lvbiBpcyBkaXJlY3RseSBsZWZ0IG9mIHRoZSBzZWNvbmQgZGltZW5zaW9uLg0KICAgICAgZnVuY3Rpb24gY29uc2VjdXRpdmUoZmlyc3QsIHNlY29uZCkgew0KICAgICAgICB2YXIgbGVuZ3RoID0gX18uZGltZW5zaW9ucy5sZW5ndGg7DQogICAgICAgIHJldHVybiBfXy5kaW1lbnNpb25zLnNvbWUoZnVuY3Rpb24oZCwgaSkgew0KICAgICAgICAgIHJldHVybiAoZCA9PT0gZmlyc3QpDQogICAgICAgICAgICA/IGkgKyBpIDwgbGVuZ3RoICYmIF9fLmRpbWVuc2lvbnNbaSArIDFdID09PSBzZWNvbmQNCiAgICAgICAgICAgIDogZmFsc2U7DQogICAgICAgIH0pOw0KICAgICAgfQ0KDQogICAgICBpZiAoaWRzLmxlbmd0aCA+IDApIHsgLy8gV2UgaGF2ZSBzb21lIHN0cnVtcywgd2hpY2ggbWlnaHQgbmVlZCB0byBiZSByZW1vdmVkLg0KICAgICAgICBpZHMuZm9yRWFjaChmdW5jdGlvbihkKSB7DQogICAgICAgICAgdmFyIGRpbXMgPSBzdHJ1bXNbZF0uZGltczsNCiAgICAgICAgICBzdHJ1bXMuYWN0aXZlID0gZDsNCiAgICAgICAgICAvLyBJZiB0aGUgdHdvIGRpbWVuc2lvbnMgb2YgdGhlIGN1cnJlbnQgc3RydW0gYXJlIG5vdCBuZXh0IHRvIGVhY2ggb3RoZXINCiAgICAgICAgICAvLyBhbnkgbW9yZSwgdGhhbiB3ZSdsbCBuZWVkIHRvIHJlbW92ZSB0aGUgc3RydW0uIE90aGVyd2lzZSB3ZSBrZWVwIGl0Lg0KICAgICAgICAgIGlmICghY29uc2VjdXRpdmUoZGltcy5sZWZ0LCBkaW1zLnJpZ2h0KSkgew0KICAgICAgICAgICAgcmVtb3ZlU3RydW0oc3RydW1zKTsNCiAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgICBvbkRyYWdFbmQoc3RydW1zKSgpOw0KICAgICAgfQ0KICAgIH0pOw0KDQogICAgLy8gQWRkIGEgbmV3IHN2ZyBncm91cCBpbiB3aGljaCB3ZSBkcmF3IHRoZSBzdHJ1bXMuDQogICAgcGMuc2VsZWN0aW9uLnNlbGVjdCgic3ZnIikuYXBwZW5kKCJnIikNCiAgICAgIC5hdHRyKCJpZCIsICJzdHJ1bXMiKQ0KICAgICAgLmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoIiArIF9fLm1hcmdpbi5sZWZ0ICsgIiwiICsgX18ubWFyZ2luLnRvcCArICIpIik7DQoNCiAgICAvLyBJbnN0YWxsIHRoZSByZXF1aXJlZCBicnVzaFJlc2V0IGZ1bmN0aW9uDQogICAgcGMuYnJ1c2hSZXNldCA9IGJydXNoUmVzZXQoc3RydW1zKTsNCg0KICAgIGRyYWcNCiAgICAgIC5vbigiZHJhZ3N0YXJ0Iiwgb25EcmFnU3RhcnQoc3RydW1zKSkNCiAgICAgIC5vbigiZHJhZyIsIG9uRHJhZyhzdHJ1bXMpKQ0KICAgICAgLm9uKCJkcmFnZW5kIiwgb25EcmFnRW5kKHN0cnVtcykpOw0KDQogICAgLy8gTk9URTogVGhlIHN0eWxpbmcgbmVlZHMgdG8gYmUgZG9uZSBoZXJlIGFuZCBub3QgaW4gdGhlIGNzcy4gVGhpcyBpcyBiZWNhdXNlDQogICAgLy8gICAgICAgZm9yIDFEIGJydXNoaW5nLCB0aGUgY2FudmFzIGxheWVycyBzaG91bGQgbm90IGxpc3RlbiB0bw0KICAgIC8vICAgICAgIHBvaW50ZXItZXZlbnRzLg0KICAgIHN0cnVtUmVjdCA9IHBjLnNlbGVjdGlvbi5zZWxlY3QoInN2ZyIpLmluc2VydCgicmVjdCIsICJnI3N0cnVtcyIpDQogICAgICAuYXR0cigiaWQiLCAic3RydW0tZXZlbnRzIikNCiAgICAgIC5hdHRyKCJ4IiwgX18ubWFyZ2luLmxlZnQpDQogICAgICAuYXR0cigieSIsIF9fLm1hcmdpbi50b3ApDQogICAgICAuYXR0cigid2lkdGgiLCB3KCkpDQogICAgICAuYXR0cigiaGVpZ2h0IiwgaCgpICsgMikNCiAgICAgIC5zdHlsZSgib3BhY2l0eSIsIDApDQogICAgICAuY2FsbChkcmFnKTsNCiAgfQ0KDQogIGJydXNoLm1vZGVzWyIyRC1zdHJ1bXMiXSA9IHsNCiAgICBpbnN0YWxsOiBpbnN0YWxsLA0KICAgIHVuaW5zdGFsbDogZnVuY3Rpb24oKSB7DQogICAgICBwYy5zZWxlY3Rpb24uc2VsZWN0KCJzdmciKS5zZWxlY3QoImcjc3RydW1zIikucmVtb3ZlKCk7DQogICAgICBwYy5zZWxlY3Rpb24uc2VsZWN0KCJzdmciKS5zZWxlY3QoInJlY3Qjc3RydW0tZXZlbnRzIikucmVtb3ZlKCk7DQogICAgICBwYy5vbigiYXhlc3Jlb3JkZXIuc3RydW1zIiwgdW5kZWZpbmVkKTsNCiAgICAgIGRlbGV0ZSBwYy5icnVzaFJlc2V0Ow0KDQogICAgICBzdHJ1bVJlY3QgPSB1bmRlZmluZWQ7DQogICAgfSwNCiAgICBzZWxlY3RlZDogc2VsZWN0ZWQsDQogICAgYnJ1c2hTdGF0ZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gc3RydW1zOyB9DQogIH07DQoNCn0oKSk7DQoNCi8vIGJydXNoIG1vZGU6IDFELUF4ZXMgd2l0aCBtdWx0aXBsZSBleHRlbnRzDQovLyByZXF1aXJlcyBkMy5zdmcubXVsdGlicnVzaA0KDQooZnVuY3Rpb24oKSB7DQogIGlmICh0eXBlb2YgZDMuc3ZnLm11bHRpYnJ1c2ggIT09ICdmdW5jdGlvbicpIHsNCgkgIHJldHVybjsNCiAgfQ0KICB2YXIgYnJ1c2hlcyA9IHt9Ow0KDQogIGZ1bmN0aW9uIGlzX2JydXNoZWQocCkgew0KICAgIHJldHVybiAhYnJ1c2hlc1twXS5lbXB0eSgpOw0KICB9DQoNCiAgLy8gZGF0YSB3aXRoaW4gZXh0ZW50cw0KICBmdW5jdGlvbiBzZWxlY3RlZCgpIHsNCiAgICB2YXIgYWN0aXZlcyA9IF9fLmRpbWVuc2lvbnMuZmlsdGVyKGlzX2JydXNoZWQpLA0KICAgICAgICBleHRlbnRzID0gYWN0aXZlcy5tYXAoZnVuY3Rpb24ocCkgeyByZXR1cm4gYnJ1c2hlc1twXS5leHRlbnQoKTsgfSk7DQoNCiAgICAvLyBXZSBkb24ndCB3YW50IHRvIHJldHVybiB0aGUgZnVsbCBkYXRhIHNldCB3aGVuIHRoZXJlIGFyZSBubyBheGVzIGJydXNoZWQuDQogICAgLy8gQWN0dWFsbHksIHdoZW4gdGhlcmUgYXJlIG5vIGF4ZXMgYnJ1c2hlZCwgYnkgZGVmaW5pdGlvbiwgbm8gaXRlbXMgYXJlDQogICAgLy8gc2VsZWN0ZWQuIFNvLCBsZXQncyBhdm9pZCB0aGUgZmlsdGVyaW5nIGFuZCBqdXN0IHJldHVybiBmYWxzZS4NCiAgICAvL2lmIChhY3RpdmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlOw0KDQogICAgLy8gUmVzb2x2ZXMgYnJva2VuIGV4YW1wbGVzIGZvciBub3cuIFRoZXkgZXhwZWN0IHRvIGdldCB0aGUgZnVsbCBkYXRhc2V0IGJhY2sgZnJvbSBlbXB0eSBicnVzaGVzDQogICAgaWYgKGFjdGl2ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gX18uZGF0YTsNCg0KICAgIC8vIHRlc3QgaWYgd2l0aGluIHJhbmdlDQogICAgdmFyIHdpdGhpbiA9IHsNCiAgICAgICJkYXRlIjogZnVuY3Rpb24oZCxwLGRpbWVuc2lvbixiKSB7DQogICAgICAgIHJldHVybiBiWzBdIDw9IGRbcF0gJiYgZFtwXSA8PSBiWzFdDQogICAgICB9LA0KICAgICAgIm51bWJlciI6IGZ1bmN0aW9uKGQscCxkaW1lbnNpb24sYikgew0KICAgICAgICByZXR1cm4gYlswXSA8PSBkW3BdICYmIGRbcF0gPD0gYlsxXQ0KICAgICAgfSwNCiAgICAgICJzdHJpbmciOiBmdW5jdGlvbihkLHAsZGltZW5zaW9uLGIpIHsNCiAgICAgICAgcmV0dXJuIGJbMF0gPD0geXNjYWxlW3BdKGRbcF0pICYmIHlzY2FsZVtwXShkW3BdKSA8PSBiWzFdDQogICAgICB9DQogICAgfTsNCg0KICAgIHJldHVybiBfXy5kYXRhDQogICAgLmZpbHRlcihmdW5jdGlvbihkKSB7DQogICAgICBzd2l0Y2goYnJ1c2gucHJlZGljYXRlKSB7DQogICAgICBjYXNlICJBTkQiOg0KICAgICAgICByZXR1cm4gYWN0aXZlcy5ldmVyeShmdW5jdGlvbihwLCBkaW1lbnNpb24pIHsNCiAgICAgICAgICByZXR1cm4gZXh0ZW50c1tkaW1lbnNpb25dLnNvbWUoZnVuY3Rpb24oYikgew0KICAgICAgICAgIAlyZXR1cm4gd2l0aGluW19fLnR5cGVzW3BdXShkLHAsZGltZW5zaW9uLGIpOw0KICAgICAgICAgIH0pOw0KICAgICAgICB9KTsNCiAgICAgIGNhc2UgIk9SIjoNCiAgICAgICAgcmV0dXJuIGFjdGl2ZXMuc29tZShmdW5jdGlvbihwLCBkaW1lbnNpb24pIHsNCiAgICAgIAkgIHJldHVybiBleHRlbnRzW2RpbWVuc2lvbl0uc29tZShmdW5jdGlvbihiKSB7DQogICAgICAgICAgICAJcmV0dXJuIHdpdGhpbltfXy50eXBlc1twXV0oZCxwLGRpbWVuc2lvbixiKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9KTsNCiAgICAgIGRlZmF1bHQ6DQogICAgICAgIHRocm93ICJVbmtub3duIGJydXNoIHByZWRpY2F0ZSAiICsgX18uYnJ1c2hQcmVkaWNhdGU7DQogICAgICB9DQogICAgfSk7DQogIH07DQoNCiAgZnVuY3Rpb24gYnJ1c2hFeHRlbnRzKCkgew0KICAgIHZhciBleHRlbnRzID0ge307DQogICAgX18uZGltZW5zaW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGQpIHsNCiAgICAgIHZhciBicnVzaCA9IGJydXNoZXNbZF07DQogICAgICBpZiAoYnJ1c2ggIT09IHVuZGVmaW5lZCAmJiAhYnJ1c2guZW1wdHkoKSkgew0KICAgICAgICB2YXIgZXh0ZW50ID0gYnJ1c2guZXh0ZW50KCk7DQogICAgICAgIGV4dGVudHNbZF0gPSBleHRlbnQ7DQogICAgICB9DQogICAgfSk7DQogICAgcmV0dXJuIGV4dGVudHM7DQogIH0NCg0KICBmdW5jdGlvbiBicnVzaEZvcihheGlzKSB7DQogICAgdmFyIGJydXNoID0gZDMuc3ZnLm11bHRpYnJ1c2goKTsNCg0KICAgIGJydXNoDQogICAgICAueSh5c2NhbGVbYXhpc10pDQogICAgICAub24oImJydXNoc3RhcnQiLCBmdW5jdGlvbigpIHsgZDMuZXZlbnQuc291cmNlRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkgfSkNCiAgICAgIC5vbigiYnJ1c2giLCBmdW5jdGlvbigpIHsNCiAgICAgICAgYnJ1c2hVcGRhdGVkKHNlbGVjdGVkKCkpOw0KICAgICAgfSkNCiAgICAgIC5vbigiYnJ1c2hlbmQiLCBmdW5jdGlvbigpIHsNCiAgICAJLy8gZDMuc3ZnLm11bHRpYnJ1c2ggY2xlYXJzIGV4dGVudHMganVzdCBiZWZvcmUgY2FsbGluZyAnYnJ1c2hlbmQnDQogICAgCS8vIHNvIHdlIGhhdmUgdG8gdXBkYXRlIGhlcmUgYWdhaW4uDQogICAgCS8vIFRoaXMgZml4ZXMgaXNzdWUgIzEwMyBmb3Igbm93LCBidXQgc2hvdWxkIGJlIGNoYW5nZWQgaW4gZDMuc3ZnLm11bHRpYnJ1c2gNCiAgICAJLy8gdG8gYXZvaWQgdW5uZWNlc3NhcnkgY29tcHV0YXRpb24uDQogICAgCWJydXNoVXBkYXRlZChzZWxlY3RlZCgpKTsNCiAgICAgICAgZXZlbnRzLmJydXNoZW5kLmNhbGwocGMsIF9fLmJydXNoZWQpOw0KICAgICAgfSkNCiAgICAgIC5leHRlbnRBZGFwdGlvbihmdW5jdGlvbihzZWxlY3Rpb24pIHsNCiAgICAJICBzZWxlY3Rpb24NCiAgICAJICAuc3R5bGUoInZpc2liaWxpdHkiLCBudWxsKQ0KICAgICAgICAgIC5hdHRyKCJ4IiwgLTE1KQ0KICAgICAgICAgIC5hdHRyKCJ3aWR0aCIsIDMwKTsNCiAgICAgIH0pDQogICAgICAucmVzaXplQWRhcHRpb24oZnVuY3Rpb24oc2VsZWN0aW9uKSB7DQogICAgCSBzZWxlY3Rpb24NCiAgICAJICAgLnNlbGVjdEFsbCgicmVjdCIpDQogICAgCSAgIC5hdHRyKCJ4IiwgLTE1KQ0KICAgIAkgICAuYXR0cigid2lkdGgiLCAzMCk7DQogICAgICB9KTsNCg0KICAgIGJydXNoZXNbYXhpc10gPSBicnVzaDsNCiAgICByZXR1cm4gYnJ1c2g7DQogIH0NCg0KICBmdW5jdGlvbiBicnVzaFJlc2V0KGRpbWVuc2lvbikgew0KICAgIF9fLmJydXNoZWQgPSBmYWxzZTsNCiAgICBpZiAoZykgew0KICAgICAgZy5zZWxlY3RBbGwoJy5icnVzaCcpDQogICAgICAgIC5lYWNoKGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgICBkMy5zZWxlY3QodGhpcykuY2FsbCgNCiAgICAgICAgICAgIGJydXNoZXNbZF0uY2xlYXIoKQ0KICAgICAgICAgICk7DQogICAgICAgIH0pOw0KICAgICAgcGMucmVuZGVyQnJ1c2hlZCgpOw0KICAgIH0NCiAgICByZXR1cm4gdGhpczsNCiAgfTsNCg0KICBmdW5jdGlvbiBpbnN0YWxsKCkgew0KICAgIGlmICghZykgcGMuY3JlYXRlQXhlcygpOw0KDQogICAgLy8gQWRkIGFuZCBzdG9yZSBhIGJydXNoIGZvciBlYWNoIGF4aXMuDQogICAgZy5hcHBlbmQoInN2ZzpnIikNCiAgICAgIC5hdHRyKCJjbGFzcyIsICJicnVzaCIpDQogICAgICAuZWFjaChmdW5jdGlvbihkKSB7DQogICAgICAgIGQzLnNlbGVjdCh0aGlzKS5jYWxsKGJydXNoRm9yKGQpKTsNCiAgICAgIH0pDQogICAgICAuc2VsZWN0QWxsKCJyZWN0IikNCiAgICAgICAgLnN0eWxlKCJ2aXNpYmlsaXR5IiwgbnVsbCkNCiAgICAgICAgLmF0dHIoIngiLCAtMTUpDQogICAgICAgIC5hdHRyKCJ3aWR0aCIsIDMwKTsNCg0KICAgIHBjLmJydXNoRXh0ZW50cyA9IGJydXNoRXh0ZW50czsNCiAgICBwYy5icnVzaFJlc2V0ID0gYnJ1c2hSZXNldDsNCiAgICByZXR1cm4gcGM7DQogIH0NCg0KICBicnVzaC5tb2Rlc1siMUQtYXhlcy1tdWx0aSJdID0gew0KICAgIGluc3RhbGw6IGluc3RhbGwsDQogICAgdW5pbnN0YWxsOiBmdW5jdGlvbigpIHsNCiAgICAgIGcuc2VsZWN0QWxsKCIuYnJ1c2giKS5yZW1vdmUoKTsNCiAgICAgIGJydXNoZXMgPSB7fTsNCiAgICAgIGRlbGV0ZSBwYy5icnVzaEV4dGVudHM7DQogICAgICBkZWxldGUgcGMuYnJ1c2hSZXNldDsNCiAgICB9LA0KICAgIHNlbGVjdGVkOiBzZWxlY3RlZCwNCiAgICBicnVzaFN0YXRlOiBicnVzaEV4dGVudHMNCiAgfQ0KfSkoKTsNCnBjLmludGVyYWN0aXZlID0gZnVuY3Rpb24oKSB7DQogIGZsYWdzLmludGVyYWN0aXZlID0gdHJ1ZTsNCiAgcmV0dXJuIHRoaXM7DQp9Ow0KDQovLyBleHBvc2UgYSBmZXcgb2JqZWN0cw0KcGMueHNjYWxlID0geHNjYWxlOw0KcGMueXNjYWxlID0geXNjYWxlOw0KcGMuY3R4ID0gY3R4Ow0KcGMuY2FudmFzID0gY2FudmFzOw0KcGMuZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gZzsgfTsNCg0KLy8gcmVzY2FsZSBmb3IgaGVpZ2h0LCB3aWR0aCBhbmQgbWFyZ2lucw0KLy8gVE9ETyBjdXJyZW50bHkgYXNzdW1lcyBjaGFydCBpcyBicnVzaGFibGUsIGFuZCBkZXN0cm95cyBvbGQgYnJ1c2hlcw0KcGMucmVzaXplID0gZnVuY3Rpb24oKSB7DQogIC8vIHNlbGVjdGlvbiBzaXplDQogIHBjLnNlbGVjdGlvbi5zZWxlY3QoInN2ZyIpDQogICAgLmF0dHIoIndpZHRoIiwgX18ud2lkdGgpDQogICAgLmF0dHIoImhlaWdodCIsIF9fLmhlaWdodCkNCiAgcGMuc3ZnLmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoIiArIF9fLm1hcmdpbi5sZWZ0ICsgIiwiICsgX18ubWFyZ2luLnRvcCArICIpIik7DQoNCiAgLy8gRklYTUU6IHRoZSBjdXJyZW50IGJydXNoIHN0YXRlIHNob3VsZCBwYXNzIHRocm91Z2gNCiAgaWYgKGZsYWdzLmJydXNoYWJsZSkgcGMuYnJ1c2hSZXNldCgpOw0KDQogIC8vIHNjYWxlcw0KICBwYy5hdXRvc2NhbGUoKTsNCg0KICAvLyBheGVzLCBkZXN0cm95cyBvbGQgYnJ1c2hlcy4NCiAgaWYgKGcpIHBjLmNyZWF0ZUF4ZXMoKTsNCiAgaWYgKGZsYWdzLmJydXNoYWJsZSkgcGMuYnJ1c2hhYmxlKCk7DQogIGlmIChmbGFncy5yZW9yZGVyYWJsZSkgcGMucmVvcmRlcmFibGUoKTsNCg0KICBldmVudHMucmVzaXplLmNhbGwodGhpcywge3dpZHRoOiBfXy53aWR0aCwgaGVpZ2h0OiBfXy5oZWlnaHQsIG1hcmdpbjogX18ubWFyZ2lufSk7DQogIHJldHVybiB0aGlzOw0KfTsNCg0KLy8gaGlnaGxpZ2h0IGFuIGFycmF5IG9mIGRhdGENCnBjLmhpZ2hsaWdodCA9IGZ1bmN0aW9uKGRhdGEpIHsNCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHsNCiAgICByZXR1cm4gX18uaGlnaGxpZ2h0ZWQ7DQogIH0NCg0KICBfXy5oaWdobGlnaHRlZCA9IGRhdGE7DQogIHBjLmNsZWFyKCJoaWdobGlnaHQiKTsNCiAgZDMuc2VsZWN0QWxsKFtjYW52YXMuZm9yZWdyb3VuZCwgY2FudmFzLmJydXNoZWRdKS5jbGFzc2VkKCJmYWRlZCIsIHRydWUpOw0KICBkYXRhLmZvckVhY2gocGF0aF9oaWdobGlnaHQpOw0KICBldmVudHMuaGlnaGxpZ2h0LmNhbGwodGhpcywgZGF0YSk7DQogIHJldHVybiB0aGlzOw0KfTsNCg0KLy8gY2xlYXIgaGlnaGxpZ2h0aW5nDQpwYy51bmhpZ2hsaWdodCA9IGZ1bmN0aW9uKCkgew0KICBfXy5oaWdobGlnaHRlZCA9IFtdOw0KICBwYy5jbGVhcigiaGlnaGxpZ2h0Iik7DQogIGQzLnNlbGVjdEFsbChbY2FudmFzLmZvcmVncm91bmQsIGNhbnZhcy5icnVzaGVkXSkuY2xhc3NlZCgiZmFkZWQiLCBmYWxzZSk7DQogIHJldHVybiB0aGlzOw0KfTsNCg0KLy8gY2FsY3VsYXRlIDJkIGludGVyc2VjdGlvbiBvZiBsaW5lIGEtPmIgd2l0aCBsaW5lIGMtPmQNCi8vIHBvaW50cyBhcmUgb2JqZWN0cyB3aXRoIHggYW5kIHkgcHJvcGVydGllcw0KcGMuaW50ZXJzZWN0aW9uID0gIGZ1bmN0aW9uKGEsIGIsIGMsIGQpIHsNCiAgcmV0dXJuIHsNCiAgICB4OiAoKGEueCAqIGIueSAtIGEueSAqIGIueCkgKiAoYy54IC0gZC54KSAtIChhLnggLSBiLngpICogKGMueCAqIGQueSAtIGMueSAqIGQueCkpIC8gKChhLnggLSBiLngpICogKGMueSAtIGQueSkgLSAoYS55IC0gYi55KSAqIChjLnggLSBkLngpKSwNCiAgICB5OiAoKGEueCAqIGIueSAtIGEueSAqIGIueCkgKiAoYy55IC0gZC55KSAtIChhLnkgLSBiLnkpICogKGMueCAqIGQueSAtIGMueSAqIGQueCkpIC8gKChhLnggLSBiLngpICogKGMueSAtIGQueSkgLSAoYS55IC0gYi55KSAqIChjLnggLSBkLngpKQ0KICB9Ow0KfTsNCg0KZnVuY3Rpb24gcG9zaXRpb24oZCkgew0KICB2YXIgdiA9IGRyYWdnaW5nW2RdOw0KICByZXR1cm4gdiA9PSBudWxsID8geHNjYWxlKGQpIDogdjsNCn0NCnBjLnZlcnNpb24gPSAiMC42LjAiOw0KICAvLyB0aGlzIGRlc2NyaXB0aXZlIHRleHQgc2hvdWxkIGxpdmUgd2l0aCBvdGhlciBpbnRyb3NwZWN0aXZlIG1ldGhvZHMNCiAgcGMudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuICJQYXJhbGxlbCBDb29yZGluYXRlczogIiArIF9fLmRpbWVuc2lvbnMubGVuZ3RoICsgIiBkaW1lbnNpb25zICgiICsgZDMua2V5cyhfXy5kYXRhWzBdKS5sZW5ndGggKyAiIHRvdGFsKSAsICIgKyBfXy5kYXRhLmxlbmd0aCArICIgcm93cyI7IH07DQoNCiAgcmV0dXJuIHBjOw0KfTsNCg0KZDMucmVuZGVyUXVldWUgPSAoZnVuY3Rpb24oZnVuYykgew0KICB2YXIgX3F1ZXVlID0gW10sICAgICAgICAgICAgICAgICAgLy8gZGF0YSB0byBiZSByZW5kZXJlZA0KICAgICAgX3JhdGUgPSAxMCwgICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGNhbGxzIHBlciBmcmFtZQ0KICAgICAgX2NsZWFyID0gZnVuY3Rpb24oKSB7fSwgICAgICAgLy8gY2xlYXJpbmcgZnVuY3Rpb24NCiAgICAgIF9pID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgaXRlcmF0aW9uDQoNCiAgdmFyIHJxID0gZnVuY3Rpb24oZGF0YSkgew0KICAgIGlmIChkYXRhKSBycS5kYXRhKGRhdGEpOw0KICAgIHJxLmludmFsaWRhdGUoKTsNCiAgICBfY2xlYXIoKTsNCiAgICBycS5yZW5kZXIoKTsNCiAgfTsNCg0KICBycS5yZW5kZXIgPSBmdW5jdGlvbigpIHsNCiAgICBfaSA9IDA7DQogICAgdmFyIHZhbGlkID0gdHJ1ZTsNCiAgICBycS5pbnZhbGlkYXRlID0gZnVuY3Rpb24oKSB7IHZhbGlkID0gZmFsc2U7IH07DQoNCiAgICBmdW5jdGlvbiBkb0ZyYW1lKCkgew0KICAgICAgaWYgKCF2YWxpZCkgcmV0dXJuIHRydWU7DQogICAgICBpZiAoX2kgPiBfcXVldWUubGVuZ3RoKSByZXR1cm4gdHJ1ZTsNCg0KICAgICAgLy8gVHlwaWNhbCBkMyBiZWhhdmlvciBpcyB0byBwYXNzIGEgZGF0YSBpdGVtICphbmQqIGl0cyBpbmRleC4gQXMgdGhlDQogICAgICAvLyByZW5kZXIgcXVldWUgc3BsaXRzIHRoZSBvcmlnaW5hbCBkYXRhIHNldCwgd2UnbGwgaGF2ZSB0byBiZSBzbGlnaHRseQ0KICAgICAgLy8gbW9yZSBjYXJlZnVsbCBhYm91dCBwYXNzaW5nIHRoZSBjb3JyZWN0IGluZGV4IHdpdGggdGhlIGRhdGEgaXRlbS4NCiAgICAgIHZhciBlbmQgPSBNYXRoLm1pbihfaSArIF9yYXRlLCBfcXVldWUubGVuZ3RoKTsNCiAgICAgIGZvciAodmFyIGkgPSBfaTsgaSA8IGVuZDsgaSsrKSB7DQogICAgICAgIGZ1bmMoX3F1ZXVlW2ldLCBpKTsNCiAgICAgIH0NCiAgICAgIF9pICs9IF9yYXRlOw0KICAgIH0NCg0KICAgIGQzLnRpbWVyKGRvRnJhbWUpOw0KICB9Ow0KDQogIHJxLmRhdGEgPSBmdW5jdGlvbihkYXRhKSB7DQogICAgcnEuaW52YWxpZGF0ZSgpOw0KICAgIF9xdWV1ZSA9IGRhdGEuc2xpY2UoMCk7DQogICAgcmV0dXJuIHJxOw0KICB9Ow0KDQogIHJxLnJhdGUgPSBmdW5jdGlvbih2YWx1ZSkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIF9yYXRlOw0KICAgIF9yYXRlID0gdmFsdWU7DQogICAgcmV0dXJuIHJxOw0KICB9Ow0KDQogIHJxLnJlbWFpbmluZyA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBfcXVldWUubGVuZ3RoIC0gX2k7DQogIH07DQoNCiAgLy8gY2xlYXIgdGhlIGNhbnZhcw0KICBycS5jbGVhciA9IGZ1bmN0aW9uKGZ1bmMpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsNCiAgICAgIF9jbGVhcigpOw0KICAgICAgcmV0dXJuIHJxOw0KICAgIH0NCiAgICBfY2xlYXIgPSBmdW5jOw0KICAgIHJldHVybiBycTsNCiAgfTsNCg0KICBycS5pbnZhbGlkYXRlID0gZnVuY3Rpb24oKSB7fTsNCg0KICByZXR1cm4gcnE7DQp9KTsNCg=="></script>
<script src="data:application/x-javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsNCg0KICBuYW1lOiAncGFyY29vcmRzJywNCg0KICB0eXBlOiAnb3V0cHV0JywNCg0KICBmYWN0b3J5OiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCkgew0KDQogICAgdmFyIGluc3RhbmNlID0ge307DQoNCiAgICB2YXIgZHJhdyA9IGZ1bmN0aW9uKCl7DQoNCiAgICAgIHZhciB4ID0gaW5zdGFuY2UueDsNCg0KDQogICAgICAvL3VnbHkgYnV0IGN1cnJlbnRseSBoYXZlIHRvIGNsZWFyIG91dA0KICAgICAgLy8gIGVhY2ggdGltZSB0byBnZXQgcHJvcGVyIHJlbmRlcg0KICAgICAgLy8gZGVsZXRlIGFsbCBjaGlsZHJlbiBvZiBlbA0KICAgICAgLy8gIHBvc3NpYmx5IHJldmlzaXQgdG8gc2VlIGlmIHdlIHNob3VsZCBiZSBhIGxpdHRsZSBtb3JlIGRlbGljYXRlDQogICAgICBkMy5zZWxlY3QoIGVsICkuc2VsZWN0QWxsKCIqIikucmVtb3ZlKCk7DQogICAgICAvLyBjcmVhdGUgb3VyIHBhcmFsbGVsIGNvb3JkaW5hdGVzDQogICAgICB2YXIgcGFyY29vcmRzID0gZDMucGFyY29vcmRzKCkoIiMiICsgZWwuaWQpDQogICAgICAgIC5kYXRhKCB4LmRhdGEgKTsNCg0KICAgICAgaWYoIHR5cGVvZiB4Lm9wdGlvbnMucm93bmFtZXMgPT0gInVuZGVmaW5lZCIgfHwgeC5vcHRpb25zLnJvd25hbWVzID09PSBmYWxzZSApIHsNCiAgICAgICAgLy9yb3duYW1lcyA9IEYgc28gaGlkZSB0aGUgYXhpcw0KICAgICAgICBwYXJjb29yZHMuaGlkZUF4aXMoWyJuYW1lcyJdKTsNCiAgICAgIH0NCg0KICAgICAgLy9pZGVudGlmeSB0aGUgYnJ1c2hlZCBlbGVtZW50cyBhbmQgcmV0dXJuIHRob3NlIGRhdGEgSURzIHRvIFJzaGlueQ0KICAgICAgLy90aGUgcGFyY29vcmRzLm9uKCJicnVzaCIsZnVuY3Rpb24oZCkpe30gb25seSB3b3JrcyB3aXRoIDFELWF4ZXMgc2VsZWN0aW9uDQogICAgICBpZiAoSFRNTFdpZGdldHMuc2hpbnlNb2RlKXsNCiAgICAgICAgcGFyY29vcmRzLm9uKCJyZW5kZXIiLCBmdW5jdGlvbigpIHsNCiAgICAgICAgICB2YXIgaWRzID0gW107DQogICAgICAgICAgaWYodGhpcy5icnVzaGVkKCkpew0KICAgICAgICAgICAgaWRzID0gdGhpcy5icnVzaGVkKCkubWFwKGZ1bmN0aW9uKGQpew0KICAgICAgICAgICAgICByZXR1cm4gZC5uYW1lczsNCiAgICAgICAgICAgIH0pDQogICAgICAgICAgfQ0KDQogICAgICAgICAgLy9yZXR1cm4gdGhlIGJydXNoZWQgcm93IG5hbWVzDQogICAgICAgICAgaWYoU2hpbnkub25JbnB1dENoYW5nZSl7DQogICAgICAgICAgICBTaGlueS5vbklucHV0Q2hhbmdlKGVsLmlkICsgIl9icnVzaGVkX3Jvd19uYW1lcyIsIGlkcyk7DQogICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgIH0NCg0KICAgICAgLy8gY3VzdG9taXplIG91ciBwYXJjb29yZHMgYWNjb3JkaW5nIHRvIG9wdGlvbnMNCiAgICAgIE9iamVjdC5rZXlzKCB4Lm9wdGlvbnMgKS5maWx0ZXIoZnVuY3Rpb24oayl7IHJldHVybiBrICE9PSAicmVvcmRlcmFibGUiICYmIGsgIT09ICJicnVzaE1vZGUiICYmIGsgIT09ICJicnVzaFByZWRpY2F0ZSIgJiYgayE9PSAiY29sb3IiICYmIGshPT0icm93bmFtZXMiIH0pLm1hcCggZnVuY3Rpb24oaykgew0KICAgICAgICAvLyBpZiB0aGUga2V5IGV4aXN0cyB3aXRoaW4gcGFyY29vcmRzDQogICAgICAgIGlmICggcGFyY29vcmRzW2tdICl7DQogICAgICAgICAgaWYoIHR5cGVvZiB4Lm9wdGlvbnNba10gPT09ICJib29sZWFuIiApew0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgcGFyY29vcmRzW2tdKCk7DQogICAgICAgICAgICB9IGNhdGNoKGUpIHsNCiAgICAgICAgICAgICAgY29uc29sZS5sb2coICJrZXkvb3B0aW9uOiAiICsgayArICIgZGlkIG5vdCB3b3JrIHNvIGlnbm9yZSBmb3Igbm93LiIgKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB0cnl7DQogICAgICAgICAgICAgIHBhcmNvb3Jkc1trXSggeC5vcHRpb25zW2tdICk7DQogICAgICAgICAgICB9IGNhdGNoKGUpIHsNCiAgICAgICAgICAgICAgY29uc29sZS5sb2coICJrZXkvb3B0aW9uOiAiICsgayArICIgd2l0aCB2YWx1ZSAiICsgeC5vcHRpb25zW2tdICsgImRpZCBub3Qgd29yayBzbyBpZ25vcmUgZm9yIG5vdy4iICkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgY29uc29sZS5sb2coICJrZXkvb3B0aW9uOiAiICsgayArICIgaXMgbm90IGF2YWlsYWJsZSBmb3IgY3VzdG9taXphdGlvbi4iICkNCiAgICAgICAgfQ0KICAgICAgfSkNCg0KICAgICAgLy8gY29sb3Igb3B0aW9uIHdpbGwgcmVxdWlyZSBzb21lIGN1c3RvbSBoYW5kbGluZw0KICAgICAgLy8gICBpZiBjb2xvciBpcyBhbiBvYmplY3Qgd2l0aCBjb2xvclNjYWxlIGFuZCBjb2xvckJ5DQogICAgICAvLyAgICB3aWxsIG5lZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIGVhY2ggb2YgdGhlIHVuaXF1ZSBncm91cCB2YWx1ZXMNCiAgICAgIC8vICAgIGFuZCBhc3NpZ24gYSBjb2xvcg0KICAgICAgaWYgKCB0eXBlb2YgeC5vcHRpb25zLmNvbG9yICE9PSAidW5kZWZpbmVkIiApIHsNCiAgICAgICAgdmFyIGNvbG9yOw0KICAgICAgICBpZiggeC5vcHRpb25zLmNvbG9yLmNvbnN0cnVjdG9yLm5hbWUgPT09ICJPYmplY3QiICkgew0KICAgICAgICAgIGNvbG9yU2NhbGUgPSB4Lm9wdGlvbnMuY29sb3IuY29sb3JTY2FsZSAgPyB4Lm9wdGlvbnMuY29sb3IuY29sb3JTY2FsZSA6IGQzLnNjYWxlLmNhdGVnb3J5MjBiKCk7DQogICAgICAgICAgdmFyIGNvbG9ycyA9IHt9Ow0KICAgICAgICAgIGQzLmtleXMoZDMubmVzdCgpLmtleShmdW5jdGlvbihkKXtyZXR1cm4gZFt4Lm9wdGlvbnMuY29sb3IuY29sb3JCeV19KS5tYXAoeC5kYXRhKSkubWFwKGZ1bmN0aW9uKGMpew0KICAgICAgICAgICAgY29sb3JzW2NdID0gY29sb3JTY2FsZShjKTsNCiAgICAgICAgICB9KQ0KDQogICAgICAgICAgY29sb3IgPSBmdW5jdGlvbihkKSB7DQogICAgICAgICAgICByZXR1cm4gY29sb3JzW2RbeC5vcHRpb25zLmNvbG9yLmNvbG9yQnldXTsNCiAgICAgICAgICB9Ow0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIC8vICAgY29sb3IgY2FuIGJlIGEgc2luZ2xlIHZhbHVlIGluIHdoaWNoIGFsbCBsaW5lcyB3aWxsIGJlIHNhbWUgY29sb3INCiAgICAgICAgICAvLyAgICBmb3IgdGhpcyB3ZSBkbyBub3QgbmVlZCB0byBkbyBhbnl0aGluZw0KICAgICAgICAgIGNvbG9yID0geC5vcHRpb25zLmNvbG9yOw0KICAgICAgICB9DQoNCiAgICAgICAgcGFyY29vcmRzLmNvbG9yKCBjb2xvciApOw0KICAgICAgfQ0KDQogICAgICAvLyBub3cgcmVuZGVyIG91ciBwYXJjb29yZHMNCiAgICAgIHBhcmNvb3Jkcw0KICAgICAgICAucmVuZGVyKCkNCg0KICAgICAgaWYoIHgub3B0aW9ucy5yZW9yZGVyYWJsZSApIHsNCiAgICAgICAgcGFyY29vcmRzLnJlb3JkZXJhYmxlKCk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBwYXJjb29yZHMuY3JlYXRlQXhlcygpOw0KICAgICAgfQ0KDQogICAgICBpZiggeC5vcHRpb25zLmJydXNoTW9kZSApIHsNCiAgICAgICAgcGFyY29vcmRzLmJydXNoTW9kZSh4Lm9wdGlvbnMuYnJ1c2hNb2RlKTsNCiAgICAgICAgcGFyY29vcmRzLmJydXNoUHJlZGljYXRlKHgub3B0aW9ucy5icnVzaFByZWRpY2F0ZSk7DQogICAgICB9DQoNCiAgICAgIC8vIGlmIHJvd25hbWVzID0gVCB0aGVuIHJlbW92ZSBheGlzIHRpdGxlDQogICAgICBpZiggdHlwZW9mIHgub3B0aW9ucy5yb3duYW1lcyAhPT0gInVuZGVmaW5lZCIgJiYgeC5vcHRpb25zLnJvd25hbWVzID09PSB0cnVlICkgew0KICAgICAgICBkMy5zZWxlY3QoIiMiICsgZWwuaWQgKyAiIC5kaW1lbnNpb24gLmF4aXMgPiB0ZXh0IikucmVtb3ZlKCk7DQogICAgICB9DQoNCiAgICAgIC8vIHNsb3BweSBidXQgZm9yIG5vdyBsZXQncyBmb3JjZSB0ZXh0IHNtYWxsZXINCiAgICAgIC8vICAgPz8gaG93IGJlc3QgdG8gcHJvdmlkZSBwYXJhbWV0ZXIgaW4gUg0KICAgICAgZDMuc2VsZWN0QWxsKCIjIiArIGVsLmlkICsgIiBzdmcgdGV4dCIpDQogICAgICAgICAgLnN0eWxlKCJmb250LXNpemUiLCIxMHB4Iik7DQoNCiAgICAgIC8vIHNldCB1cCBhIGNvbnRhaW5lciBmb3IgdGFza3MgdG8gcGVyZm9ybSBhZnRlciBjb21wbGV0aW9uDQogICAgICAvLyAgb25lIGV4YW1wbGUgd291bGQgYmUgYWRkIGNhbGxiYWNrcyBmb3IgZXZlbnQgaGFuZGxpbmcNCiAgICAgIC8vICBzdHlsaW5nDQogICAgICBpZiAoISh0eXBlb2YgeC50YXNrcyA9PT0gInVuZGVmaW5lZCIgfHwgeC50YXNrcyA9PT0gbnVsbCkgKXsNCiAgICAgICAgaWYgKCAodHlwZW9mIHgudGFza3MubGVuZ3RoID09PSAidW5kZWZpbmVkIikgfHwNCiAgICAgICAgICh0eXBlb2YgeC50YXNrcyA9PT0gImZ1bmN0aW9uIiApICkgew0KICAgICAgICAgICAvLyBoYW5kbGUgYSBmdW5jdGlvbiBub3QgZW5jbG9zZWQgaW4gYXJyYXkNCiAgICAgICAgICAgLy8gc2hvdWxkIGJlIGFibGUgdG8gcmVtb3ZlIG9uY2UgdXNpbmcganNvbmxpdGUNCiAgICAgICAgICAgeC50YXNrcyA9IFt4LnRhc2tzXTsNCiAgICAgICAgfQ0KICAgICAgICB4LnRhc2tzLm1hcChmdW5jdGlvbih0KXsNCiAgICAgICAgICAvLyBmb3IgZWFjaCB0YXNrcyBjYWxsIHRoZSB0YXNrIHdpdGggZWwgc3VwcGxpZWQgYXMgYHRoaXNgDQogICAgICAgICAgdC5jYWxsKHtlbDplbCxwYXJjb29yZHM6cGFyY29vcmRzfSk7DQogICAgICAgIH0pOw0KICAgICAgfQ0KDQogICAgICAvLyB1c2UgZXhwYW5kbyB0byBhdHRhY2ggcGFyY29vcmRzIHRvIHRoZSBlbGVtZW50DQogICAgICAvLyAgdGhpcyBkdXBsaWNhdGVzIHRoZSBzdGVwIGJlbG93DQogICAgICAvLyAgYnV0IG1pZ2h0IG1ha2UgaXQgZWFzaWVyIGZvciBhIHVzZXINCiAgICAgIC8vICB0byBtYW5pcHVsYXRlIHRoZSBwYXJjb29yZHMNCiAgICAgIC8vICBpZiB0aGV5IGFyZSBub3QgZmFtaWxpYXIgd2l0aCB0aGUNCiAgICAgIC8vICBpbnRlcm5hbHMgb2YgaHRtbHdpZGdldHMNCiAgICAgIGVsLnBhcmNvb3JkcyA9IHBhcmNvb3JkczsNCiAgICAgIC8vIGFsc28gYXR0YWNoIHRoZSBwYXJhbGxlbCBjb29yZGluYXRlcyBhbmQgeCB0byBpbnN0YW5jZQ0KICAgICAgaW5zdGFuY2UucGFyY29vcmRzID0gcGFyY29vcmRzOw0KICAgICAgaW5zdGFuY2UueCA9IHg7DQogICAgfTsNCg0KICAgIHJldHVybiB7DQoNCiAgICAgIHJlbmRlclZhbHVlOiBmdW5jdGlvbih4KSB7DQoNCiAgICAgICAgLy8gYmFzaWMgY2hlY2sgb2YgZGF0YSB0byBtYWtlIHN1cmUgd2UgcmVjZWl2ZWQNCiAgICAgICAgLy8gICBpbiBjb2x1bW4gZm9ybWF0IG9yIG9iamVjdCBvZiBhcnJheXMNCiAgICAgICAgLy8gICB3aGljaCBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBodG1sd2lkZ2V0cw0KICAgICAgICAvLyAgIHJlYXNvbiBmb3IgdGhpcyBjaGVjayBpcw0KICAgICAgICAvLyAgICAgIGZ1dHVyZS1wcm9vZmluZyBpZiBiZWhhdmlvciBjaGFuZ2VzDQogICAgICAgIC8vICAgICAgc29tZW9uZSBzdXBwbGllcyBkYXRhIGluIGFuIGF0eXBpY2FsIHdheQ0KICAgICAgICBpZiggeC5kYXRhLmNvbnN0cnVjdG9yLm5hbWUgPT09ICJPYmplY3QiICl7DQogICAgICAgICAgLy8gdXNlIEhUTUxXaWRnZXRzIGZ1bmN0aW9uIHRvIGNvbnZlcnQgdG8gYW4gYXJyYXkgb2Ygb2JqZWN0cyAocm93IGZvcm1hdCkNCiAgICAgICAgICB4LmRhdGEgPSBIVE1MV2lkZ2V0cy5kYXRhZnJhbWVUb0QzKCB4LmRhdGEgKQ0KICAgICAgICB9DQoNCiAgICAgICAgaW5zdGFuY2UueCA9IHg7DQoNCiAgICAgICAgZHJhdygpOw0KDQogICAgICB9LA0KDQogICAgICByZXNpemU6IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpIHsNCg0KICAgICAgICAvLyBvbmx5IHJlc2l6ZSBpZiBhdXRvcmVzaXplIHNldCB0byBUUlVFDQogICAgICAgIC8vICAgcmVzaXplIHdpbGwgY2F1c2UgdGhlIGVudGlyZSBwYXJjb29yZHMgdG8gcmUtcmVuZGVyDQogICAgICAgIC8vICAgc28gYnJ1c2hlZCBzZWxlY3Rpb25zLCBldGMuIHdpbGwgYmUgbG9zdA0KICAgICAgICAvLyAgIGFuZCBpbiBldmVudCBvZiBiaWdnZXIgZGF0YSwgZXhwZW5zaXZlIHJlLXJlbmRlcg0KICAgICAgICAvLyAgIHdpbGwgb2NjdXINCiAgICAgICAgaWYoaW5zdGFuY2UueC5hdXRvcmVzaXplKXsNCiAgICAgICAgICB2YXIgdyA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoOw0KICAgICAgICAgIHZhciBoID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0Ow0KDQogICAgICAgICAgaW5zdGFuY2UucGFyY29vcmRzLndpZHRoKHcpOw0KICAgICAgICAgIGluc3RhbmNlLnBhcmNvb3Jkcy5oZWlnaHQoaCk7DQoNCiAgICAgICAgICBkcmF3KCk7DQoNCiAgICAgICAgfQ0KDQogICAgICB9DQoNCiAgICB9Ow0KICB9DQp9KTsNCg=="></script>
<script src="data:application/x-javascript;base64,LyohIGpRdWVyeSB2MS4xMS4zIHwgKGMpIDIwMDUsIDIwMTUgalF1ZXJ5IEZvdW5kYXRpb24sIEluYy4gfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8NCiFmdW5jdGlvbihhLGIpeyJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWEuZG9jdW1lbnQ/YihhLCEwKTpmdW5jdGlvbihhKXtpZighYS5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gYihhKX06YihhKX0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24oYSxiKXt2YXIgYz1bXSxkPWMuc2xpY2UsZT1jLmNvbmNhdCxmPWMucHVzaCxnPWMuaW5kZXhPZixoPXt9LGk9aC50b1N0cmluZyxqPWguaGFzT3duUHJvcGVydHksaz17fSxsPSIxLjExLjMiLG09ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IG0uZm4uaW5pdChhLGIpfSxuPS9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZyxvPS9eLW1zLS8scD0vLShbXGRhLXpdKS9naSxxPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGIudG9VcHBlckNhc2UoKX07bS5mbj1tLnByb3RvdHlwZT17anF1ZXJ5OmwsY29uc3RydWN0b3I6bSxzZWxlY3RvcjoiIixsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIGQuY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hPzA+YT90aGlzW2ErdGhpcy5sZW5ndGhdOnRoaXNbYV06ZC5jYWxsKHRoaXMpfSxwdXNoU3RhY2s6ZnVuY3Rpb24oYSl7dmFyIGI9bS5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksYSk7cmV0dXJuIGIucHJldk9iamVjdD10aGlzLGIuY29udGV4dD10aGlzLmNvbnRleHQsYn0sZWFjaDpmdW5jdGlvbihhLGIpe3JldHVybiBtLmVhY2godGhpcyxhLGIpfSxtYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG0ubWFwKHRoaXMsZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5jYWxsKGIsYyxiKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZC5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmxlbmd0aCxjPSthKygwPmE/YjowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYz49MCYmYj5jP1t0aGlzW2NdXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IobnVsbCl9LHB1c2g6Zixzb3J0OmMuc29ydCxzcGxpY2U6Yy5zcGxpY2V9LG0uZXh0ZW5kPW0uZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmLGc9YXJndW1lbnRzWzBdfHx7fSxoPTEsaT1hcmd1bWVudHMubGVuZ3RoLGo9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIGcmJihqPWcsZz1hcmd1bWVudHNbaF18fHt9LGgrKyksIm9iamVjdCI9PXR5cGVvZiBnfHxtLmlzRnVuY3Rpb24oZyl8fChnPXt9KSxoPT09aSYmKGc9dGhpcyxoLS0pO2k+aDtoKyspaWYobnVsbCE9KGU9YXJndW1lbnRzW2hdKSlmb3IoZCBpbiBlKWE9Z1tkXSxjPWVbZF0sZyE9PWMmJihqJiZjJiYobS5pc1BsYWluT2JqZWN0KGMpfHwoYj1tLmlzQXJyYXkoYykpKT8oYj8oYj0hMSxmPWEmJm0uaXNBcnJheShhKT9hOltdKTpmPWEmJm0uaXNQbGFpbk9iamVjdChhKT9hOnt9LGdbZF09bS5leHRlbmQoaixmLGMpKTp2b2lkIDAhPT1jJiYoZ1tkXT1jKSk7cmV0dXJuIGd9LG0uZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKyhsK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLGlzUmVhZHk6ITAsZXJyb3I6ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKGEpfSxub29wOmZ1bmN0aW9uKCl7fSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PT1tLnR5cGUoYSl9LGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuImFycmF5Ij09PW0udHlwZShhKX0saXNXaW5kb3c6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEmJmE9PWEud2luZG93fSxpc051bWVyaWM6ZnVuY3Rpb24oYSl7cmV0dXJuIW0uaXNBcnJheShhKSYmYS1wYXJzZUZsb2F0KGEpKzE+PTB9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7dmFyIGI7Zm9yKGIgaW4gYSlyZXR1cm4hMTtyZXR1cm4hMH0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtpZighYXx8Im9iamVjdCIhPT1tLnR5cGUoYSl8fGEubm9kZVR5cGV8fG0uaXNXaW5kb3coYSkpcmV0dXJuITE7dHJ5e2lmKGEuY29uc3RydWN0b3ImJiFqLmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIWouY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKGMpe3JldHVybiExfWlmKGsub3duTGFzdClmb3IoYiBpbiBhKXJldHVybiBqLmNhbGwoYSxiKTtmb3IoYiBpbiBhKTtyZXR1cm4gdm9pZCAwPT09Ynx8ai5jYWxsKGEsYil9LHR5cGU6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/YSsiIjoib2JqZWN0Ij09dHlwZW9mIGF8fCJmdW5jdGlvbiI9PXR5cGVvZiBhP2hbaS5jYWxsKGEpXXx8Im9iamVjdCI6dHlwZW9mIGF9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oYil7YiYmbS50cmltKGIpJiYoYS5leGVjU2NyaXB0fHxmdW5jdGlvbihiKXthLmV2YWwuY2FsbChhLGIpfSkoYil9LGNhbWVsQ2FzZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKG8sIm1zLSIpLnJlcGxhY2UocCxxKX0sbm9kZU5hbWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yi50b0xvd2VyQ2FzZSgpfSxlYWNoOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPTAsZj1hLmxlbmd0aCxnPXIoYSk7aWYoYyl7aWYoZyl7Zm9yKDtmPmU7ZSsrKWlmKGQ9Yi5hcHBseShhW2VdLGMpLGQ9PT0hMSlicmVha31lbHNlIGZvcihlIGluIGEpaWYoZD1iLmFwcGx5KGFbZV0sYyksZD09PSExKWJyZWFrfWVsc2UgaWYoZyl7Zm9yKDtmPmU7ZSsrKWlmKGQ9Yi5jYWxsKGFbZV0sZSxhW2VdKSxkPT09ITEpYnJlYWt9ZWxzZSBmb3IoZSBpbiBhKWlmKGQ9Yi5jYWxsKGFbZV0sZSxhW2VdKSxkPT09ITEpYnJlYWs7cmV0dXJuIGF9LHRyaW06ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6KGErIiIpLnJlcGxhY2UobiwiIil9LG1ha2VBcnJheTpmdW5jdGlvbihhLGIpe3ZhciBjPWJ8fFtdO3JldHVybiBudWxsIT1hJiYocihPYmplY3QoYSkpP20ubWVyZ2UoYywic3RyaW5nIj09dHlwZW9mIGE/W2FdOmEpOmYuY2FsbChjLGEpKSxjfSxpbkFycmF5OmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihiKXtpZihnKXJldHVybiBnLmNhbGwoYixhLGMpO2ZvcihkPWIubGVuZ3RoLGM9Yz8wPmM/TWF0aC5tYXgoMCxkK2MpOmM6MDtkPmM7YysrKWlmKGMgaW4gYiYmYltjXT09PWEpcmV0dXJuIGN9cmV0dXJuLTF9LG1lcmdlOmZ1bmN0aW9uKGEsYil7dmFyIGM9K2IubGVuZ3RoLGQ9MCxlPWEubGVuZ3RoO3doaWxlKGM+ZClhW2UrK109YltkKytdO2lmKGMhPT1jKXdoaWxlKHZvaWQgMCE9PWJbZF0pYVtlKytdPWJbZCsrXTtyZXR1cm4gYS5sZW5ndGg9ZSxhfSxncmVwOmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQsZT1bXSxmPTAsZz1hLmxlbmd0aCxoPSFjO2c+ZjtmKyspZD0hYihhW2ZdLGYpLGQhPT1oJiZlLnB1c2goYVtmXSk7cmV0dXJuIGV9LG1hcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZj0wLGc9YS5sZW5ndGgsaD1yKGEpLGk9W107aWYoaClmb3IoO2c+ZjtmKyspZD1iKGFbZl0sZixjKSxudWxsIT1kJiZpLnB1c2goZCk7ZWxzZSBmb3IoZiBpbiBhKWQ9YihhW2ZdLGYsYyksbnVsbCE9ZCYmaS5wdXNoKGQpO3JldHVybiBlLmFwcGx5KFtdLGkpfSxndWlkOjEscHJveHk6ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGY7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBiJiYoZj1hW2JdLGI9YSxhPWYpLG0uaXNGdW5jdGlvbihhKT8oYz1kLmNhbGwoYXJndW1lbnRzLDIpLGU9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShifHx0aGlzLGMuY29uY2F0KGQuY2FsbChhcmd1bWVudHMpKSl9LGUuZ3VpZD1hLmd1aWQ9YS5ndWlkfHxtLmd1aWQrKyxlKTp2b2lkIDB9LG5vdzpmdW5jdGlvbigpe3JldHVybituZXcgRGF0ZX0sc3VwcG9ydDprfSksbS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7aFsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KTtmdW5jdGlvbiByKGEpe3ZhciBiPSJsZW5ndGgiaW4gYSYmYS5sZW5ndGgsYz1tLnR5cGUoYSk7cmV0dXJuImZ1bmN0aW9uIj09PWN8fG0uaXNXaW5kb3coYSk/ITE6MT09PWEubm9kZVR5cGUmJmI/ITA6ImFycmF5Ij09PWN8fDA9PT1ifHwibnVtYmVyIj09dHlwZW9mIGImJmI+MCYmYi0xIGluIGF9dmFyIHM9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwLHEscixzLHQsdT0ic2l6emxlIisxKm5ldyBEYXRlLHY9YS5kb2N1bWVudCx3PTAseD0wLHk9aGEoKSx6PWhhKCksQT1oYSgpLEI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWImJihsPSEwKSwwfSxDPTE8PDMxLEQ9e30uaGFzT3duUHJvcGVydHksRT1bXSxGPUUucG9wLEc9RS5wdXNoLEg9RS5wdXNoLEk9RS5zbGljZSxKPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtkPmM7YysrKWlmKGFbY109PT1iKXJldHVybiBjO3JldHVybi0xfSxLPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsTD0iW1xceDIwXFx0XFxyXFxuXFxmXSIsTT0iKD86XFxcXC58W1xcdy1dfFteXFx4MDAtXFx4YTBdKSsiLE49TS5yZXBsYWNlKCJ3IiwidyMiKSxPPSJcXFsiK0wrIiooIitNKyIpKD86IitMKyIqKFsqXiR8IX5dPz0pIitMKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrTisiKSl8KSIrTCsiKlxcXSIsUD0iOigiK00rIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK08rIikqKXwuKilcXCl8KSIsUT1uZXcgUmVnRXhwKEwrIisiLCJnIiksUj1uZXcgUmVnRXhwKCJeIitMKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK0wrIiskIiwiZyIpLFM9bmV3IFJlZ0V4cCgiXiIrTCsiKiwiK0wrIioiKSxUPW5ldyBSZWdFeHAoIl4iK0wrIiooWz4rfl18IitMKyIpIitMKyIqIiksVT1uZXcgUmVnRXhwKCI9IitMKyIqKFteXFxdJ1wiXSo/KSIrTCsiKlxcXSIsImciKSxWPW5ldyBSZWdFeHAoUCksVz1uZXcgUmVnRXhwKCJeIitOKyIkIiksWD17SUQ6bmV3IFJlZ0V4cCgiXiMoIitNKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK00rIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK00ucmVwbGFjZSgidyIsIncqIikrIikiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK08pLFBTRVVETzpuZXcgUmVnRXhwKCJeIitQKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK0wrIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK0wrIiooPzooWystXXwpIitMKyIqKFxcZCspfCkpIitMKyIqXFwpfCkiLCJpIiksYm9vbDpuZXcgUmVnRXhwKCJeKD86IitLKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrTCsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitMKyIqKCg/Oi1cXGQpP1xcZCopIitMKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxZPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksWj0vXmhcZCQvaSwkPS9eW157XStce1xzKlxbbmF0aXZlIFx3LyxfPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sYWE9L1srfl0vLGJhPS8nfFxcL2csY2E9bmV3IFJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitMKyI/fCgiK0wrIil8LikiLCJpZyIpLGRhPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD0iMHgiK2ItNjU1MzY7cmV0dXJuIGQhPT1kfHxjP2I6MD5kP1N0cmluZy5mcm9tQ2hhckNvZGUoZCs2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShkPj4xMHw1NTI5NiwxMDIzJmR8NTYzMjApfSxlYT1mdW5jdGlvbigpe20oKX07dHJ5e0guYXBwbHkoRT1JLmNhbGwodi5jaGlsZE5vZGVzKSx2LmNoaWxkTm9kZXMpLEVbdi5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2goZmEpe0g9e2FwcGx5OkUubGVuZ3RoP2Z1bmN0aW9uKGEsYil7Ry5hcHBseShhLEkuY2FsbChiKSl9OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5sZW5ndGgsZD0wO3doaWxlKGFbYysrXT1iW2QrK10pO2EubGVuZ3RoPWMtMX19fWZ1bmN0aW9uIGdhKGEsYixkLGUpe3ZhciBmLGgsaixrLGwsbyxyLHMsdyx4O2lmKChiP2Iub3duZXJEb2N1bWVudHx8Yjp2KSE9PW4mJm0oYiksYj1ifHxuLGQ9ZHx8W10saz1iLm5vZGVUeXBlLCJzdHJpbmciIT10eXBlb2YgYXx8IWF8fDEhPT1rJiY5IT09ayYmMTEhPT1rKXJldHVybiBkO2lmKCFlJiZwKXtpZigxMSE9PWsmJihmPV8uZXhlYyhhKSkpaWYoaj1mWzFdKXtpZig5PT09ayl7aWYoaD1iLmdldEVsZW1lbnRCeUlkKGopLCFofHwhaC5wYXJlbnROb2RlKXJldHVybiBkO2lmKGguaWQ9PT1qKXJldHVybiBkLnB1c2goaCksZH1lbHNlIGlmKGIub3duZXJEb2N1bWVudCYmKGg9Yi5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGopKSYmdChiLGgpJiZoLmlkPT09ailyZXR1cm4gZC5wdXNoKGgpLGR9ZWxzZXtpZihmWzJdKXJldHVybiBILmFwcGx5KGQsYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKSksZDtpZigoaj1mWzNdKSYmYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBILmFwcGx5KGQsYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGopKSxkfWlmKGMucXNhJiYoIXF8fCFxLnRlc3QoYSkpKXtpZihzPXI9dSx3PWIseD0xIT09ayYmYSwxPT09ayYmIm9iamVjdCIhPT1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpe289ZyhhKSwocj1iLmdldEF0dHJpYnV0ZSgiaWQiKSk/cz1yLnJlcGxhY2UoYmEsIlxcJCYiKTpiLnNldEF0dHJpYnV0ZSgiaWQiLHMpLHM9IltpZD0nIitzKyInXSAiLGw9by5sZW5ndGg7d2hpbGUobC0tKW9bbF09cytyYShvW2xdKTt3PWFhLnRlc3QoYSkmJnBhKGIucGFyZW50Tm9kZSl8fGIseD1vLmpvaW4oIiwiKX1pZih4KXRyeXtyZXR1cm4gSC5hcHBseShkLHcucXVlcnlTZWxlY3RvckFsbCh4KSksZH1jYXRjaCh5KXt9ZmluYWxseXtyfHxiLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBpKGEucmVwbGFjZShSLCIkMSIpLGIsZCxlKX1mdW5jdGlvbiBoYSgpe3ZhciBhPVtdO2Z1bmN0aW9uIGIoYyxlKXtyZXR1cm4gYS5wdXNoKGMrIiAiKT5kLmNhY2hlTGVuZ3RoJiZkZWxldGUgYlthLnNoaWZ0KCldLGJbYysiICJdPWV9cmV0dXJuIGJ9ZnVuY3Rpb24gaWEoYSl7cmV0dXJuIGFbdV09ITAsYX1mdW5jdGlvbiBqYShhKXt2YXIgYj1uLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RyeXtyZXR1cm4hIWEoYil9Y2F0Y2goYyl7cmV0dXJuITF9ZmluYWxseXtiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKSxiPW51bGx9fWZ1bmN0aW9uIGthKGEsYil7dmFyIGM9YS5zcGxpdCgifCIpLGU9YS5sZW5ndGg7d2hpbGUoZS0tKWQuYXR0ckhhbmRsZVtjW2VdXT1ifWZ1bmN0aW9uIGxhKGEsYil7dmFyIGM9YiYmYSxkPWMmJjE9PT1hLm5vZGVUeXBlJiYxPT09Yi5ub2RlVHlwZSYmKH5iLnNvdXJjZUluZGV4fHxDKS0ofmEuc291cmNlSW5kZXh8fEMpO2lmKGQpcmV0dXJuIGQ7aWYoYyl3aGlsZShjPWMubmV4dFNpYmxpbmcpaWYoYz09PWIpcmV0dXJuLTE7cmV0dXJuIGE/MTotMX1mdW5jdGlvbiBtYShhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1jJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBuYShhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09Y3x8ImJ1dHRvbiI9PT1jKSYmYi50eXBlPT09YX19ZnVuY3Rpb24gb2EoYSl7cmV0dXJuIGlhKGZ1bmN0aW9uKGIpe3JldHVybiBiPStiLGlhKGZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1hKFtdLGMubGVuZ3RoLGIpLGc9Zi5sZW5ndGg7d2hpbGUoZy0tKWNbZT1mW2ddXSYmKGNbZV09IShkW2VdPWNbZV0pKX0pfSl9ZnVuY3Rpb24gcGEoYSl7cmV0dXJuIGEmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRFbGVtZW50c0J5VGFnTmFtZSYmYX1jPWdhLnN1cHBvcnQ9e30sZj1nYS5pc1hNTD1mdW5jdGlvbihhKXt2YXIgYj1hJiYoYS5vd25lckRvY3VtZW50fHxhKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIGI/IkhUTUwiIT09Yi5ub2RlTmFtZTohMX0sbT1nYS5zZXREb2N1bWVudD1mdW5jdGlvbihhKXt2YXIgYixlLGc9YT9hLm93bmVyRG9jdW1lbnR8fGE6djtyZXR1cm4gZyE9PW4mJjk9PT1nLm5vZGVUeXBlJiZnLmRvY3VtZW50RWxlbWVudD8obj1nLG89Zy5kb2N1bWVudEVsZW1lbnQsZT1nLmRlZmF1bHRWaWV3LGUmJmUhPT1lLnRvcCYmKGUuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZWEsITEpOmUuYXR0YWNoRXZlbnQmJmUuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixlYSkpLHA9IWYoZyksYy5hdHRyaWJ1dGVzPWphKGZ1bmN0aW9uKGEpe3JldHVybiBhLmNsYXNzTmFtZT0iaSIsIWEuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKX0pLGMuZ2V0RWxlbWVudHNCeVRhZ05hbWU9amEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXBwZW5kQ2hpbGQoZy5jcmVhdGVDb21tZW50KCIiKSksIWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGh9KSxjLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9JC50ZXN0KGcuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSksYy5nZXRCeUlkPWphKGZ1bmN0aW9uKGEpe3JldHVybiBvLmFwcGVuZENoaWxkKGEpLmlkPXUsIWcuZ2V0RWxlbWVudHNCeU5hbWV8fCFnLmdldEVsZW1lbnRzQnlOYW1lKHUpLmxlbmd0aH0pLGMuZ2V0QnlJZD8oZC5maW5kLklEPWZ1bmN0aW9uKGEsYil7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBiLmdldEVsZW1lbnRCeUlkJiZwKXt2YXIgYz1iLmdldEVsZW1lbnRCeUlkKGEpO3JldHVybiBjJiZjLnBhcmVudE5vZGU/W2NdOltdfX0sZC5maWx0ZXIuSUQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKGNhLGRhKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJpZCIpPT09Yn19KTooZGVsZXRlIGQuZmluZC5JRCxkLmZpbHRlci5JRD1mdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoY2EsZGEpO3JldHVybiBmdW5jdGlvbihhKXt2YXIgYz0idW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0QXR0cmlidXRlTm9kZSYmYS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBjJiZjLnZhbHVlPT09Yn19KSxkLmZpbmQuVEFHPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZnVuY3Rpb24oYSxiKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWU/Yi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKTpjLnFzYT9iLnF1ZXJ5U2VsZWN0b3JBbGwoYSk6dm9pZCAwfTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT0wLGY9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKTtpZigiKiI9PT1hKXt3aGlsZShjPWZbZSsrXSkxPT09Yy5ub2RlVHlwZSYmZC5wdXNoKGMpO3JldHVybiBkfXJldHVybiBmfSxkLmZpbmQuQ0xBU1M9Yy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZmdW5jdGlvbihhLGIpe3JldHVybiBwP2IuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhKTp2b2lkIDB9LHI9W10scT1bXSwoYy5xc2E9JC50ZXN0KGcucXVlcnlTZWxlY3RvckFsbCkpJiYoamEoZnVuY3Rpb24oYSl7by5hcHBlbmRDaGlsZChhKS5pbm5lckhUTUw9IjxhIGlkPSciK3UrIic+PC9hPjxzZWxlY3QgaWQ9JyIrdSsiLVxmXScgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGEucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnEucHVzaCgiWypeJF09IitMKyIqKD86Jyd8XCJcIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHEucHVzaCgiXFxbIitMKyIqKD86dmFsdWV8IitLKyIpIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrdSsiLV0iKS5sZW5ndGh8fHEucHVzaCgifj0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxxLnB1c2goIjpjaGVja2VkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJhIyIrdSsiKyoiKS5sZW5ndGh8fHEucHVzaCgiLiMuK1srfl0iKX0pLGphKGZ1bmN0aW9uKGEpe3ZhciBiPWcuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtiLnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGEuYXBwZW5kQ2hpbGQoYikuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLGEucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnEucHVzaCgibmFtZSIrTCsiKlsqXiR8IX5dPz0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RofHxxLnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4IikscS5wdXNoKCIsLio6Iil9KSksKGMubWF0Y2hlc1NlbGVjdG9yPSQudGVzdChzPW8ubWF0Y2hlc3x8by53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG8ubW96TWF0Y2hlc1NlbGVjdG9yfHxvLm9NYXRjaGVzU2VsZWN0b3J8fG8ubXNNYXRjaGVzU2VsZWN0b3IpKSYmamEoZnVuY3Rpb24oYSl7Yy5kaXNjb25uZWN0ZWRNYXRjaD1zLmNhbGwoYSwiZGl2Iikscy5jYWxsKGEsIltzIT0nJ106eCIpLHIucHVzaCgiIT0iLFApfSkscT1xLmxlbmd0aCYmbmV3IFJlZ0V4cChxLmpvaW4oInwiKSkscj1yLmxlbmd0aCYmbmV3IFJlZ0V4cChyLmpvaW4oInwiKSksYj0kLnRlc3Qoby5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiksdD1ifHwkLnRlc3Qoby5jb250YWlucyk/ZnVuY3Rpb24oYSxiKXt2YXIgYz05PT09YS5ub2RlVHlwZT9hLmRvY3VtZW50RWxlbWVudDphLGQ9YiYmYi5wYXJlbnROb2RlO3JldHVybiBhPT09ZHx8ISghZHx8MSE9PWQubm9kZVR5cGV8fCEoYy5jb250YWlucz9jLmNvbnRhaW5zKGQpOmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZCkpKX06ZnVuY3Rpb24oYSxiKXtpZihiKXdoaWxlKGI9Yi5wYXJlbnROb2RlKWlmKGI9PT1hKXJldHVybiEwO3JldHVybiExfSxCPWI/ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gbD0hMCwwO3ZhciBkPSFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiBkP2Q6KGQ9KGEub3duZXJEb2N1bWVudHx8YSk9PT0oYi5vd25lckRvY3VtZW50fHxiKT9hLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpOjEsMSZkfHwhYy5zb3J0RGV0YWNoZWQmJmIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYSk9PT1kP2E9PT1nfHxhLm93bmVyRG9jdW1lbnQ9PT12JiZ0KHYsYSk/LTE6Yj09PWd8fGIub3duZXJEb2N1bWVudD09PXYmJnQodixiKT8xOms/SihrLGEpLUooayxiKTowOjQmZD8tMToxKX06ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gbD0hMCwwO3ZhciBjLGQ9MCxlPWEucGFyZW50Tm9kZSxmPWIucGFyZW50Tm9kZSxoPVthXSxpPVtiXTtpZighZXx8IWYpcmV0dXJuIGE9PT1nPy0xOmI9PT1nPzE6ZT8tMTpmPzE6az9KKGssYSktSihrLGIpOjA7aWYoZT09PWYpcmV0dXJuIGxhKGEsYik7Yz1hO3doaWxlKGM9Yy5wYXJlbnROb2RlKWgudW5zaGlmdChjKTtjPWI7d2hpbGUoYz1jLnBhcmVudE5vZGUpaS51bnNoaWZ0KGMpO3doaWxlKGhbZF09PT1pW2RdKWQrKztyZXR1cm4gZD9sYShoW2RdLGlbZF0pOmhbZF09PT12Py0xOmlbZF09PT12PzE6MH0sZyk6bn0sZ2EubWF0Y2hlcz1mdW5jdGlvbihhLGIpe3JldHVybiBnYShhLG51bGwsbnVsbCxiKX0sZ2EubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGEsYil7aWYoKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLGI9Yi5yZXBsYWNlKFUsIj0nJDEnXSIpLCEoIWMubWF0Y2hlc1NlbGVjdG9yfHwhcHx8ciYmci50ZXN0KGIpfHxxJiZxLnRlc3QoYikpKXRyeXt2YXIgZD1zLmNhbGwoYSxiKTtpZihkfHxjLmRpc2Nvbm5lY3RlZE1hdGNofHxhLmRvY3VtZW50JiYxMSE9PWEuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIGR9Y2F0Y2goZSl7fXJldHVybiBnYShiLG4sbnVsbCxbYV0pLmxlbmd0aD4wfSxnYS5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybihhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKSx0KGEsYil9LGdhLmF0dHI9ZnVuY3Rpb24oYSxiKXsoYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSk7dmFyIGU9ZC5hdHRySGFuZGxlW2IudG9Mb3dlckNhc2UoKV0sZj1lJiZELmNhbGwoZC5hdHRySGFuZGxlLGIudG9Mb3dlckNhc2UoKSk/ZShhLGIsIXApOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09Zj9mOmMuYXR0cmlidXRlc3x8IXA/YS5nZXRBdHRyaWJ1dGUoYik6KGY9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpKSYmZi5zcGVjaWZpZWQ/Zi52YWx1ZTpudWxsfSxnYS5lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrYSl9LGdhLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oYSl7dmFyIGIsZD1bXSxlPTAsZj0wO2lmKGw9IWMuZGV0ZWN0RHVwbGljYXRlcyxrPSFjLnNvcnRTdGFibGUmJmEuc2xpY2UoMCksYS5zb3J0KEIpLGwpe3doaWxlKGI9YVtmKytdKWI9PT1hW2ZdJiYoZT1kLnB1c2goZikpO3doaWxlKGUtLSlhLnNwbGljZShkW2VdLDEpfXJldHVybiBrPW51bGwsYX0sZT1nYS5nZXRUZXh0PWZ1bmN0aW9uKGEpe3ZhciBiLGM9IiIsZD0wLGY9YS5ub2RlVHlwZTtpZihmKXtpZigxPT09Znx8OT09PWZ8fDExPT09Zil7aWYoInN0cmluZyI9PXR5cGVvZiBhLnRleHRDb250ZW50KXJldHVybiBhLnRleHRDb250ZW50O2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZyljKz1lKGEpfWVsc2UgaWYoMz09PWZ8fDQ9PT1mKXJldHVybiBhLm5vZGVWYWx1ZX1lbHNlIHdoaWxlKGI9YVtkKytdKWMrPWUoYik7cmV0dXJuIGN9LGQ9Z2Euc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86aWEsbWF0Y2g6WCxhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV09YVsxXS5yZXBsYWNlKGNhLGRhKSxhWzNdPShhWzNdfHxhWzRdfHxhWzVdfHwiIikucmVwbGFjZShjYSxkYSksIn49Ij09PWFbMl0mJihhWzNdPSIgIithWzNdKyIgIiksYS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1hWzFdLnNsaWNlKDAsMyk/KGFbM118fGdhLmVycm9yKGFbMF0pLGFbNF09KyhhWzRdP2FbNV0rKGFbNl18fDEpOjIqKCJldmVuIj09PWFbM118fCJvZGQiPT09YVszXSkpLGFbNV09KyhhWzddK2FbOF18fCJvZGQiPT09YVszXSkpOmFbM10mJmdhLmVycm9yKGFbMF0pLGF9LFBTRVVETzpmdW5jdGlvbihhKXt2YXIgYixjPSFhWzZdJiZhWzJdO3JldHVybiBYLkNISUxELnRlc3QoYVswXSk/bnVsbDooYVszXT9hWzJdPWFbNF18fGFbNV18fCIiOmMmJlYudGVzdChjKSYmKGI9ZyhjLCEwKSkmJihiPWMuaW5kZXhPZigiKSIsYy5sZW5ndGgtYiktYy5sZW5ndGgpJiYoYVswXT1hWzBdLnNsaWNlKDAsYiksYVsyXT1jLnNsaWNlKDAsYikpLGEuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoY2EsZGEpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIioiPT09YT9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yn19LENMQVNTOmZ1bmN0aW9uKGEpe3ZhciBiPXlbYSsiICJdO3JldHVybiBifHwoYj1uZXcgUmVnRXhwKCIoXnwiK0wrIikiK2ErIigiK0wrInwkKSIpKSYmeShhLGZ1bmN0aW9uKGEpe3JldHVybiBiLnRlc3QoInN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZSYmYS5jbGFzc05hbWV8fCJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3ZhciBlPWdhLmF0dHIoZCxhKTtyZXR1cm4gbnVsbD09ZT8iIT0iPT09YjpiPyhlKz0iIiwiPSI9PT1iP2U9PT1jOiIhPSI9PT1iP2UhPT1jOiJePSI9PT1iP2MmJjA9PT1lLmluZGV4T2YoYyk6Iio9Ij09PWI/YyYmZS5pbmRleE9mKGMpPi0xOiIkPSI9PT1iP2MmJmUuc2xpY2UoLWMubGVuZ3RoKT09PWM6In49Ij09PWI/KCIgIitlLnJlcGxhY2UoUSwiICIpKyIgIikuaW5kZXhPZihjKT4tMToifD0iPT09Yj9lPT09Y3x8ZS5zbGljZSgwLGMubGVuZ3RoKzEpPT09YysiLSI6ITEpOiEwfX0sQ0hJTEQ6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj0ibnRoIiE9PWEuc2xpY2UoMCwzKSxnPSJsYXN0IiE9PWEuc2xpY2UoLTQpLGg9Im9mLXR5cGUiPT09YjtyZXR1cm4gMT09PWQmJjA9PT1lP2Z1bmN0aW9uKGEpe3JldHVybiEhYS5wYXJlbnROb2RlfTpmdW5jdGlvbihiLGMsaSl7dmFyIGosayxsLG0sbixvLHA9ZiE9PWc/Im5leHRTaWJsaW5nIjoicHJldmlvdXNTaWJsaW5nIixxPWIucGFyZW50Tm9kZSxyPWgmJmIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxzPSFpJiYhaDtpZihxKXtpZihmKXt3aGlsZShwKXtsPWI7d2hpbGUobD1sW3BdKWlmKGg/bC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09cjoxPT09bC5ub2RlVHlwZSlyZXR1cm4hMTtvPXA9Im9ubHkiPT09YSYmIW8mJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYobz1bZz9xLmZpcnN0Q2hpbGQ6cS5sYXN0Q2hpbGRdLGcmJnMpe2s9cVt1XXx8KHFbdV09e30pLGo9a1thXXx8W10sbj1qWzBdPT09dyYmalsxXSxtPWpbMF09PT13JiZqWzJdLGw9biYmcS5jaGlsZE5vZGVzW25dO3doaWxlKGw9KytuJiZsJiZsW3BdfHwobT1uPTApfHxvLnBvcCgpKWlmKDE9PT1sLm5vZGVUeXBlJiYrK20mJmw9PT1iKXtrW2FdPVt3LG4sbV07YnJlYWt9fWVsc2UgaWYocyYmKGo9KGJbdV18fChiW3VdPXt9KSlbYV0pJiZqWzBdPT09dyltPWpbMV07ZWxzZSB3aGlsZShsPSsrbiYmbCYmbFtwXXx8KG09bj0wKXx8by5wb3AoKSlpZigoaD9sLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1yOjE9PT1sLm5vZGVUeXBlKSYmKyttJiYocyYmKChsW3VdfHwobFt1XT17fSkpW2FdPVt3LG1dKSxsPT09YikpYnJlYWs7cmV0dXJuIG0tPWUsbT09PWR8fG0lZD09PTAmJm0vZD49MH19fSxQU0VVRE86ZnVuY3Rpb24oYSxiKXt2YXIgYyxlPWQucHNldWRvc1thXXx8ZC5zZXRGaWx0ZXJzW2EudG9Mb3dlckNhc2UoKV18fGdhLmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrYSk7cmV0dXJuIGVbdV0/ZShiKTplLmxlbmd0aD4xPyhjPVthLGEsIiIsYl0sZC5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGEudG9Mb3dlckNhc2UoKSk/aWEoZnVuY3Rpb24oYSxjKXt2YXIgZCxmPWUoYSxiKSxnPWYubGVuZ3RoO3doaWxlKGctLSlkPUooYSxmW2ddKSxhW2RdPSEoY1tkXT1mW2ddKX0pOmZ1bmN0aW9uKGEpe3JldHVybiBlKGEsMCxjKX0pOmV9fSxwc2V1ZG9zOntub3Q6aWEoZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxkPWgoYS5yZXBsYWNlKFIsIiQxIikpO3JldHVybiBkW3VdP2lhKGZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmLGc9ZChhLG51bGwsZSxbXSksaD1hLmxlbmd0aDt3aGlsZShoLS0pKGY9Z1toXSkmJihhW2hdPSEoYltoXT1mKSl9KTpmdW5jdGlvbihhLGUsZil7cmV0dXJuIGJbMF09YSxkKGIsbnVsbCxmLGMpLGJbMF09bnVsbCwhYy5wb3AoKX19KSxoYXM6aWEoZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBnYShhLGIpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOmlhKGZ1bmN0aW9uKGEpe3JldHVybiBhPWEucmVwbGFjZShjYSxkYSksZnVuY3Rpb24oYil7cmV0dXJuKGIudGV4dENvbnRlbnR8fGIuaW5uZXJUZXh0fHxlKGIpKS5pbmRleE9mKGEpPi0xfX0pLGxhbmc6aWEoZnVuY3Rpb24oYSl7cmV0dXJuIFcudGVzdChhfHwiIil8fGdhLmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK2EpLGE9YS5yZXBsYWNlKGNhLGRhKS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKGIpe3ZhciBjO2RvIGlmKGM9cD9iLmxhbmc6Yi5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fGIuZ2V0QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuIGM9Yy50b0xvd2VyQ2FzZSgpLGM9PT1hfHwwPT09Yy5pbmRleE9mKGErIi0iKTt3aGlsZSgoYj1iLnBhcmVudE5vZGUpJiYxPT09Yi5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKGIpe3ZhciBjPWEubG9jYXRpb24mJmEubG9jYXRpb24uaGFzaDtyZXR1cm4gYyYmYy5zbGljZSgxKT09PWIuaWR9LHJvb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1vfSxmb2N1czpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW4uYWN0aXZlRWxlbWVudCYmKCFuLmhhc0ZvY3VzfHxuLmhhc0ZvY3VzKCkpJiYhIShhLnR5cGV8fGEuaHJlZnx8fmEudGFiSW5kZXgpfSxlbmFibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITF9LGRpc2FibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITB9LGNoZWNrZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1iJiYhIWEuY2hlY2tlZHx8Im9wdGlvbiI9PT1iJiYhIWEuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLnBhcmVudE5vZGUmJmEucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LGEuc2VsZWN0ZWQ9PT0hMH0sZW1wdHk6ZnVuY3Rpb24oYSl7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWlmKGEubm9kZVR5cGU8NilyZXR1cm4hMTtyZXR1cm4hMH0scGFyZW50OmZ1bmN0aW9uKGEpe3JldHVybiFkLnBzZXVkb3MuZW1wdHkoYSl9LGhlYWRlcjpmdW5jdGlvbihhKXtyZXR1cm4gWi50ZXN0KGEubm9kZU5hbWUpfSxpbnB1dDpmdW5jdGlvbihhKXtyZXR1cm4gWS50ZXN0KGEubm9kZU5hbWUpfSxidXR0b246ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1iJiYiYnV0dG9uIj09PWEudHlwZXx8ImJ1dHRvbiI9PT1ifSx0ZXh0OmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiJpbnB1dCI9PT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJiJ0ZXh0Ij09PWEudHlwZSYmKG51bGw9PShiPWEuZ2V0QXR0cmlidXRlKCJ0eXBlIikpfHwidGV4dCI9PT1iLnRvTG93ZXJDYXNlKCkpfSxmaXJzdDpvYShmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6b2EoZnVuY3Rpb24oYSxiKXtyZXR1cm5bYi0xXX0pLGVxOm9hKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm5bMD5jP2MrYjpjXX0pLGV2ZW46b2EoZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MDtiPmM7Yys9MilhLnB1c2goYyk7cmV0dXJuIGF9KSxvZGQ6b2EoZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MTtiPmM7Yys9MilhLnB1c2goYyk7cmV0dXJuIGF9KSxsdDpvYShmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPTA+Yz9jK2I6YzstLWQ+PTA7KWEucHVzaChkKTtyZXR1cm4gYX0pLGd0Om9hKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9MD5jP2MrYjpjOysrZDxiOylhLnB1c2goZCk7cmV0dXJuIGF9KX19LGQucHNldWRvcy5udGg9ZC5wc2V1ZG9zLmVxO2ZvcihiIGlue3JhZGlvOiEwLGNoZWNrYm94OiEwLGZpbGU6ITAscGFzc3dvcmQ6ITAsaW1hZ2U6ITB9KWQucHNldWRvc1tiXT1tYShiKTtmb3IoYiBpbntzdWJtaXQ6ITAscmVzZXQ6ITB9KWQucHNldWRvc1tiXT1uYShiKTtmdW5jdGlvbiBxYSgpe31xYS5wcm90b3R5cGU9ZC5maWx0ZXJzPWQucHNldWRvcyxkLnNldEZpbHRlcnM9bmV3IHFhLGc9Z2EudG9rZW5pemU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGYsZyxoLGksaixrPXpbYSsiICJdO2lmKGspcmV0dXJuIGI/MDprLnNsaWNlKDApO2g9YSxpPVtdLGo9ZC5wcmVGaWx0ZXI7d2hpbGUoaCl7KCFjfHwoZT1TLmV4ZWMoaCkpKSYmKGUmJihoPWguc2xpY2UoZVswXS5sZW5ndGgpfHxoKSxpLnB1c2goZj1bXSkpLGM9ITEsKGU9VC5leGVjKGgpKSYmKGM9ZS5zaGlmdCgpLGYucHVzaCh7dmFsdWU6Yyx0eXBlOmVbMF0ucmVwbGFjZShSLCIgIil9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtmb3IoZyBpbiBkLmZpbHRlcikhKGU9WFtnXS5leGVjKGgpKXx8altnXSYmIShlPWpbZ10oZSkpfHwoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZyxtYXRjaGVzOmV9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtpZighYylicmVha31yZXR1cm4gYj9oLmxlbmd0aDpoP2dhLmVycm9yKGEpOnooYSxpKS5zbGljZSgwKX07ZnVuY3Rpb24gcmEoYSl7Zm9yKHZhciBiPTAsYz1hLmxlbmd0aCxkPSIiO2M+YjtiKyspZCs9YVtiXS52YWx1ZTtyZXR1cm4gZH1mdW5jdGlvbiBzYShhLGIsYyl7dmFyIGQ9Yi5kaXIsZT1jJiYicGFyZW50Tm9kZSI9PT1kLGY9eCsrO3JldHVybiBiLmZpcnN0P2Z1bmN0aW9uKGIsYyxmKXt3aGlsZShiPWJbZF0paWYoMT09PWIubm9kZVR5cGV8fGUpcmV0dXJuIGEoYixjLGYpfTpmdW5jdGlvbihiLGMsZyl7dmFyIGgsaSxqPVt3LGZdO2lmKGcpe3doaWxlKGI9YltkXSlpZigoMT09PWIubm9kZVR5cGV8fGUpJiZhKGIsYyxnKSlyZXR1cm4hMH1lbHNlIHdoaWxlKGI9YltkXSlpZigxPT09Yi5ub2RlVHlwZXx8ZSl7aWYoaT1iW3VdfHwoYlt1XT17fSksKGg9aVtkXSkmJmhbMF09PT13JiZoWzFdPT09ZilyZXR1cm4galsyXT1oWzJdO2lmKGlbZF09aixqWzJdPWEoYixjLGcpKXJldHVybiEwfX19ZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEubGVuZ3RoPjE/ZnVuY3Rpb24oYixjLGQpe3ZhciBlPWEubGVuZ3RoO3doaWxlKGUtLSlpZighYVtlXShiLGMsZCkpcmV0dXJuITE7cmV0dXJuITB9OmFbMF19ZnVuY3Rpb24gdWEoYSxiLGMpe2Zvcih2YXIgZD0wLGU9Yi5sZW5ndGg7ZT5kO2QrKylnYShhLGJbZF0sYyk7cmV0dXJuIGN9ZnVuY3Rpb24gdmEoYSxiLGMsZCxlKXtmb3IodmFyIGYsZz1bXSxoPTAsaT1hLmxlbmd0aCxqPW51bGwhPWI7aT5oO2grKykoZj1hW2hdKSYmKCFjfHxjKGYsZCxlKSkmJihnLnB1c2goZiksaiYmYi5wdXNoKGgpKTtyZXR1cm4gZ31mdW5jdGlvbiB3YShhLGIsYyxkLGUsZil7cmV0dXJuIGQmJiFkW3VdJiYoZD13YShkKSksZSYmIWVbdV0mJihlPXdhKGUsZikpLGlhKGZ1bmN0aW9uKGYsZyxoLGkpe3ZhciBqLGssbCxtPVtdLG49W10sbz1nLmxlbmd0aCxwPWZ8fHVhKGJ8fCIqIixoLm5vZGVUeXBlP1toXTpoLFtdKSxxPSFhfHwhZiYmYj9wOnZhKHAsbSxhLGgsaSkscj1jP2V8fChmP2E6b3x8ZCk/W106ZzpxO2lmKGMmJmMocSxyLGgsaSksZCl7aj12YShyLG4pLGQoaixbXSxoLGkpLGs9ai5sZW5ndGg7d2hpbGUoay0tKShsPWpba10pJiYocltuW2tdXT0hKHFbbltrXV09bCkpfWlmKGYpe2lmKGV8fGEpe2lmKGUpe2o9W10saz1yLmxlbmd0aDt3aGlsZShrLS0pKGw9cltrXSkmJmoucHVzaChxW2tdPWwpO2UobnVsbCxyPVtdLGosaSl9az1yLmxlbmd0aDt3aGlsZShrLS0pKGw9cltrXSkmJihqPWU/SihmLGwpOm1ba10pPi0xJiYoZltqXT0hKGdbal09bCkpfX1lbHNlIHI9dmEocj09PWc/ci5zcGxpY2UobyxyLmxlbmd0aCk6ciksZT9lKG51bGwsZyxyLGkpOkguYXBwbHkoZyxyKX0pfWZ1bmN0aW9uIHhhKGEpe2Zvcih2YXIgYixjLGUsZj1hLmxlbmd0aCxnPWQucmVsYXRpdmVbYVswXS50eXBlXSxoPWd8fGQucmVsYXRpdmVbIiAiXSxpPWc/MTowLGs9c2EoZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1ifSxoLCEwKSxsPXNhKGZ1bmN0aW9uKGEpe3JldHVybiBKKGIsYSk+LTF9LGgsITApLG09W2Z1bmN0aW9uKGEsYyxkKXt2YXIgZT0hZyYmKGR8fGMhPT1qKXx8KChiPWMpLm5vZGVUeXBlP2soYSxjLGQpOmwoYSxjLGQpKTtyZXR1cm4gYj1udWxsLGV9XTtmPmk7aSsrKWlmKGM9ZC5yZWxhdGl2ZVthW2ldLnR5cGVdKW09W3NhKHRhKG0pLGMpXTtlbHNle2lmKGM9ZC5maWx0ZXJbYVtpXS50eXBlXS5hcHBseShudWxsLGFbaV0ubWF0Y2hlcyksY1t1XSl7Zm9yKGU9KytpO2Y+ZTtlKyspaWYoZC5yZWxhdGl2ZVthW2VdLnR5cGVdKWJyZWFrO3JldHVybiB3YShpPjEmJnRhKG0pLGk+MSYmcmEoYS5zbGljZSgwLGktMSkuY29uY2F0KHt2YWx1ZToiICI9PT1hW2ktMl0udHlwZT8iKiI6IiJ9KSkucmVwbGFjZShSLCIkMSIpLGMsZT5pJiZ4YShhLnNsaWNlKGksZSkpLGY+ZSYmeGEoYT1hLnNsaWNlKGUpKSxmPmUmJnJhKGEpKX1tLnB1c2goYyl9cmV0dXJuIHRhKG0pfWZ1bmN0aW9uIHlhKGEsYil7dmFyIGM9Yi5sZW5ndGg+MCxlPWEubGVuZ3RoPjAsZj1mdW5jdGlvbihmLGcsaCxpLGspe3ZhciBsLG0sbyxwPTAscT0iMCIscj1mJiZbXSxzPVtdLHQ9aix1PWZ8fGUmJmQuZmluZC5UQUcoIioiLGspLHY9dys9bnVsbD09dD8xOk1hdGgucmFuZG9tKCl8fC4xLHg9dS5sZW5ndGg7Zm9yKGsmJihqPWchPT1uJiZnKTtxIT09eCYmbnVsbCE9KGw9dVtxXSk7cSsrKXtpZihlJiZsKXttPTA7d2hpbGUobz1hW20rK10paWYobyhsLGcsaCkpe2kucHVzaChsKTticmVha31rJiYodz12KX1jJiYoKGw9IW8mJmwpJiZwLS0sZiYmci5wdXNoKGwpKX1pZihwKz1xLGMmJnEhPT1wKXttPTA7d2hpbGUobz1iW20rK10pbyhyLHMsZyxoKTtpZihmKXtpZihwPjApd2hpbGUocS0tKXJbcV18fHNbcV18fChzW3FdPUYuY2FsbChpKSk7cz12YShzKX1ILmFwcGx5KGkscyksayYmIWYmJnMubGVuZ3RoPjAmJnArYi5sZW5ndGg+MSYmZ2EudW5pcXVlU29ydChpKX1yZXR1cm4gayYmKHc9dixqPXQpLHJ9O3JldHVybiBjP2lhKGYpOmZ9cmV0dXJuIGg9Z2EuY29tcGlsZT1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT1bXSxmPUFbYSsiICJdO2lmKCFmKXtifHwoYj1nKGEpKSxjPWIubGVuZ3RoO3doaWxlKGMtLSlmPXhhKGJbY10pLGZbdV0/ZC5wdXNoKGYpOmUucHVzaChmKTtmPUEoYSx5YShlLGQpKSxmLnNlbGVjdG9yPWF9cmV0dXJuIGZ9LGk9Z2Euc2VsZWN0PWZ1bmN0aW9uKGEsYixlLGYpe3ZhciBpLGosayxsLG0sbj0iZnVuY3Rpb24iPT10eXBlb2YgYSYmYSxvPSFmJiZnKGE9bi5zZWxlY3Rvcnx8YSk7aWYoZT1lfHxbXSwxPT09by5sZW5ndGgpe2lmKGo9b1swXT1vWzBdLnNsaWNlKDApLGoubGVuZ3RoPjImJiJJRCI9PT0oaz1qWzBdKS50eXBlJiZjLmdldEJ5SWQmJjk9PT1iLm5vZGVUeXBlJiZwJiZkLnJlbGF0aXZlW2pbMV0udHlwZV0pe2lmKGI9KGQuZmluZC5JRChrLm1hdGNoZXNbMF0ucmVwbGFjZShjYSxkYSksYil8fFtdKVswXSwhYilyZXR1cm4gZTtuJiYoYj1iLnBhcmVudE5vZGUpLGE9YS5zbGljZShqLnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1pPVgubmVlZHNDb250ZXh0LnRlc3QoYSk/MDpqLmxlbmd0aDt3aGlsZShpLS0pe2lmKGs9altpXSxkLnJlbGF0aXZlW2w9ay50eXBlXSlicmVhaztpZigobT1kLmZpbmRbbF0pJiYoZj1tKGsubWF0Y2hlc1swXS5yZXBsYWNlKGNhLGRhKSxhYS50ZXN0KGpbMF0udHlwZSkmJnBhKGIucGFyZW50Tm9kZSl8fGIpKSl7aWYoai5zcGxpY2UoaSwxKSxhPWYubGVuZ3RoJiZyYShqKSwhYSlyZXR1cm4gSC5hcHBseShlLGYpLGU7YnJlYWt9fX1yZXR1cm4obnx8aChhLG8pKShmLGIsIXAsZSxhYS50ZXN0KGEpJiZwYShiLnBhcmVudE5vZGUpfHxiKSxlfSxjLnNvcnRTdGFibGU9dS5zcGxpdCgiIikuc29ydChCKS5qb2luKCIiKT09PXUsYy5kZXRlY3REdXBsaWNhdGVzPSEhbCxtKCksYy5zb3J0RGV0YWNoZWQ9amEoZnVuY3Rpb24oYSl7cmV0dXJuIDEmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuLmNyZWF0ZUVsZW1lbnQoImRpdiIpKX0pLGphKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09YS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGthKCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmEuZ2V0QXR0cmlidXRlKGIsInR5cGUiPT09Yi50b0xvd2VyQ2FzZSgpPzE6Mil9KSxjLmF0dHJpYnV0ZXMmJmphKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGlucHV0Lz4iLGEuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGthKCJ2YWx1ZSIsZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjfHwiaW5wdXQiIT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP3ZvaWQgMDphLmRlZmF1bHRWYWx1ZX0pLGphKGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxrYShLLGZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gYz92b2lkIDA6YVtiXT09PSEwP2IudG9Mb3dlckNhc2UoKTooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZkLnNwZWNpZmllZD9kLnZhbHVlOm51bGx9KSxnYX0oYSk7bS5maW5kPXMsbS5leHByPXMuc2VsZWN0b3JzLG0uZXhwclsiOiJdPW0uZXhwci5wc2V1ZG9zLG0udW5pcXVlPXMudW5pcXVlU29ydCxtLnRleHQ9cy5nZXRUZXh0LG0uaXNYTUxEb2M9cy5pc1hNTCxtLmNvbnRhaW5zPXMuY29udGFpbnM7dmFyIHQ9bS5leHByLm1hdGNoLm5lZWRzQ29udGV4dCx1PS9ePChcdyspXHMqXC8/Pig/OjxcL1wxPnwpJC8sdj0vXi5bXjojXFtcLixdKiQvO2Z1bmN0aW9uIHcoYSxiLGMpe2lmKG0uaXNGdW5jdGlvbihiKSlyZXR1cm4gbS5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4hIWIuY2FsbChhLGQsYSkhPT1jfSk7aWYoYi5ub2RlVHlwZSlyZXR1cm4gbS5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1iIT09Y30pO2lmKCJzdHJpbmciPT10eXBlb2YgYil7aWYodi50ZXN0KGIpKXJldHVybiBtLmZpbHRlcihiLGEsYyk7Yj1tLmZpbHRlcihiLGEpfXJldHVybiBtLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gbS5pbkFycmF5KGEsYik+PTAhPT1jfSl9bS5maWx0ZXI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWJbMF07cmV0dXJuIGMmJihhPSI6bm90KCIrYSsiKSIpLDE9PT1iLmxlbmd0aCYmMT09PWQubm9kZVR5cGU/bS5maW5kLm1hdGNoZXNTZWxlY3RvcihkLGEpP1tkXTpbXTptLmZpbmQubWF0Y2hlcyhhLG0uZ3JlcChiLGZ1bmN0aW9uKGEpe3JldHVybiAxPT09YS5ub2RlVHlwZX0pKX0sbS5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXSxkPXRoaXMsZT1kLmxlbmd0aDtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIHRoaXMucHVzaFN0YWNrKG0oYSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKGI9MDtlPmI7YisrKWlmKG0uY29udGFpbnMoZFtiXSx0aGlzKSlyZXR1cm4hMH0pKTtmb3IoYj0wO2U+YjtiKyspbS5maW5kKGEsZFtiXSxjKTtyZXR1cm4gYz10aGlzLnB1c2hTdGFjayhlPjE/bS51bmlxdWUoYyk6YyksYy5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yP3RoaXMuc2VsZWN0b3IrIiAiK2E6YSxjfSxmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHcodGhpcyxhfHxbXSwhMSkpfSxub3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHcodGhpcyxhfHxbXSwhMCkpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIXcodGhpcywic3RyaW5nIj09dHlwZW9mIGEmJnQudGVzdChhKT9tKGEpOmF8fFtdLCExKS5sZW5ndGh9fSk7dmFyIHgseT1hLmRvY3VtZW50LHo9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0qKSkkLyxBPW0uZm4uaW5pdD1mdW5jdGlvbihhLGIpe3ZhciBjLGQ7aWYoIWEpcmV0dXJuIHRoaXM7aWYoInN0cmluZyI9PXR5cGVvZiBhKXtpZihjPSI8Ij09PWEuY2hhckF0KDApJiYiPiI9PT1hLmNoYXJBdChhLmxlbmd0aC0xKSYmYS5sZW5ndGg+PTM/W251bGwsYSxudWxsXTp6LmV4ZWMoYSksIWN8fCFjWzFdJiZiKXJldHVybiFifHxiLmpxdWVyeT8oYnx8eCkuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGIpLmZpbmQoYSk7aWYoY1sxXSl7aWYoYj1iIGluc3RhbmNlb2YgbT9iWzBdOmIsbS5tZXJnZSh0aGlzLG0ucGFyc2VIVE1MKGNbMV0sYiYmYi5ub2RlVHlwZT9iLm93bmVyRG9jdW1lbnR8fGI6eSwhMCkpLHUudGVzdChjWzFdKSYmbS5pc1BsYWluT2JqZWN0KGIpKWZvcihjIGluIGIpbS5pc0Z1bmN0aW9uKHRoaXNbY10pP3RoaXNbY10oYltjXSk6dGhpcy5hdHRyKGMsYltjXSk7cmV0dXJuIHRoaXN9aWYoZD15LmdldEVsZW1lbnRCeUlkKGNbMl0pLGQmJmQucGFyZW50Tm9kZSl7aWYoZC5pZCE9PWNbMl0pcmV0dXJuIHguZmluZChhKTt0aGlzLmxlbmd0aD0xLHRoaXNbMF09ZH1yZXR1cm4gdGhpcy5jb250ZXh0PXksdGhpcy5zZWxlY3Rvcj1hLHRoaXN9cmV0dXJuIGEubm9kZVR5cGU/KHRoaXMuY29udGV4dD10aGlzWzBdPWEsdGhpcy5sZW5ndGg9MSx0aGlzKTptLmlzRnVuY3Rpb24oYSk/InVuZGVmaW5lZCIhPXR5cGVvZiB4LnJlYWR5P3gucmVhZHkoYSk6YShtKToodm9pZCAwIT09YS5zZWxlY3RvciYmKHRoaXMuc2VsZWN0b3I9YS5zZWxlY3Rvcix0aGlzLmNvbnRleHQ9YS5jb250ZXh0KSxtLm1ha2VBcnJheShhLHRoaXMpKX07QS5wcm90b3R5cGU9bS5mbix4PW0oeSk7dmFyIEI9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sQz17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTttLmV4dGVuZCh7ZGlyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlPWFbYl07d2hpbGUoZSYmOSE9PWUubm9kZVR5cGUmJih2b2lkIDA9PT1jfHwxIT09ZS5ub2RlVHlwZXx8IW0oZSkuaXMoYykpKTE9PT1lLm5vZGVUeXBlJiZkLnB1c2goZSksZT1lW2JdO3JldHVybiBkfSxzaWJsaW5nOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPVtdO2E7YT1hLm5leHRTaWJsaW5nKTE9PT1hLm5vZGVUeXBlJiZhIT09YiYmYy5wdXNoKGEpO3JldHVybiBjfX0pLG0uZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oYSl7dmFyIGIsYz1tKGEsdGhpcyksZD1jLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2Q+YjtiKyspaWYobS5jb250YWlucyh0aGlzLGNbYl0pKXJldHVybiEwfSl9LGNsb3Nlc3Q6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMsZD0wLGU9dGhpcy5sZW5ndGgsZj1bXSxnPXQudGVzdChhKXx8InN0cmluZyIhPXR5cGVvZiBhP20oYSxifHx0aGlzLmNvbnRleHQpOjA7ZT5kO2QrKylmb3IoYz10aGlzW2RdO2MmJmMhPT1iO2M9Yy5wYXJlbnROb2RlKWlmKGMubm9kZVR5cGU8MTEmJihnP2cuaW5kZXgoYyk+LTE6MT09PWMubm9kZVR5cGUmJm0uZmluZC5tYXRjaGVzU2VsZWN0b3IoYyxhKSkpe2YucHVzaChjKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soZi5sZW5ndGg+MT9tLnVuaXF1ZShmKTpmKX0saW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/InN0cmluZyI9PXR5cGVvZiBhP20uaW5BcnJheSh0aGlzWzBdLG0oYSkpOm0uaW5BcnJheShhLmpxdWVyeT9hWzBdOmEsdGhpcyk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobS51bmlxdWUobS5tZXJnZSh0aGlzLmdldCgpLG0oYSxiKSkpKX0sYWRkQmFjazpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09YT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihhKSl9fSk7ZnVuY3Rpb24gRChhLGIpe2RvIGE9YVtiXTt3aGlsZShhJiYxIT09YS5ub2RlVHlwZSk7cmV0dXJuIGF9bS5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiYxMSE9PWIubm9kZVR5cGU/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBtLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0uZGlyKGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBEKGEsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIEQoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIG0uZGlyKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIG0uZGlyKGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBtLmRpcihhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0uZGlyKGEsInByZXZpb3VzU2libGluZyIsYyl9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiBtLnNpYmxpbmcoKGEucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiBtLnNpYmxpbmcoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIG0ubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDptLm1lcmdlKFtdLGEuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihhLGIpe20uZm5bYV09ZnVuY3Rpb24oYyxkKXt2YXIgZT1tLm1hcCh0aGlzLGIsYyk7cmV0dXJuIlVudGlsIiE9PWEuc2xpY2UoLTUpJiYoZD1jKSxkJiYic3RyaW5nIj09dHlwZW9mIGQmJihlPW0uZmlsdGVyKGQsZSkpLHRoaXMubGVuZ3RoPjEmJihDW2FdfHwoZT1tLnVuaXF1ZShlKSksQi50ZXN0KGEpJiYoZT1lLnJldmVyc2UoKSkpLHRoaXMucHVzaFN0YWNrKGUpfX0pO3ZhciBFPS9cUysvZyxGPXt9O2Z1bmN0aW9uIEcoYSl7dmFyIGI9RlthXT17fTtyZXR1cm4gbS5lYWNoKGEubWF0Y2goRSl8fFtdLGZ1bmN0aW9uKGEsYyl7YltjXT0hMH0pLGJ9bS5DYWxsYmFja3M9ZnVuY3Rpb24oYSl7YT0ic3RyaW5nIj09dHlwZW9mIGE/RlthXXx8RyhhKTptLmV4dGVuZCh7fSxhKTt2YXIgYixjLGQsZSxmLGcsaD1bXSxpPSFhLm9uY2UmJltdLGo9ZnVuY3Rpb24obCl7Zm9yKGM9YS5tZW1vcnkmJmwsZD0hMCxmPWd8fDAsZz0wLGU9aC5sZW5ndGgsYj0hMDtoJiZlPmY7ZisrKWlmKGhbZl0uYXBwbHkobFswXSxsWzFdKT09PSExJiZhLnN0b3BPbkZhbHNlKXtjPSExO2JyZWFrfWI9ITEsaCYmKGk/aS5sZW5ndGgmJmooaS5zaGlmdCgpKTpjP2g9W106ay5kaXNhYmxlKCkpfSxrPXthZGQ6ZnVuY3Rpb24oKXtpZihoKXt2YXIgZD1oLmxlbmd0aDshZnVuY3Rpb24gZihiKXttLmVhY2goYixmdW5jdGlvbihiLGMpe3ZhciBkPW0udHlwZShjKTsiZnVuY3Rpb24iPT09ZD9hLnVuaXF1ZSYmay5oYXMoYyl8fGgucHVzaChjKTpjJiZjLmxlbmd0aCYmInN0cmluZyIhPT1kJiZmKGMpfSl9KGFyZ3VtZW50cyksYj9lPWgubGVuZ3RoOmMmJihnPWQsaihjKSl9cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiBoJiZtLmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGEsYyl7dmFyIGQ7d2hpbGUoKGQ9bS5pbkFycmF5KGMsaCxkKSk+LTEpaC5zcGxpY2UoZCwxKSxiJiYoZT49ZCYmZS0tLGY+PWQmJmYtLSl9KSx0aGlzfSxoYXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/bS5pbkFycmF5KGEsaCk+LTE6ISghaHx8IWgubGVuZ3RoKX0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gaD1bXSxlPTAsdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBoPWk9Yz12b2lkIDAsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haH0sbG9jazpmdW5jdGlvbigpe3JldHVybiBpPXZvaWQgMCxjfHxrLmRpc2FibGUoKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haX0sZmlyZVdpdGg6ZnVuY3Rpb24oYSxjKXtyZXR1cm4haHx8ZCYmIWl8fChjPWN8fFtdLGM9W2EsYy5zbGljZT9jLnNsaWNlKCk6Y10sYj9pLnB1c2goYyk6aihjKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBrLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhZH19O3JldHVybiBrfSxtLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9W1sicmVzb2x2ZSIsImRvbmUiLG0uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsbS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlamVjdGVkIl0sWyJub3RpZnkiLCJwcm9ncmVzcyIsbS5DYWxsYmFja3MoIm1lbW9yeSIpXV0sYz0icGVuZGluZyIsZD17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gY30sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGUuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSx0aGVuOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiBtLkRlZmVycmVkKGZ1bmN0aW9uKGMpe20uZWFjaChiLGZ1bmN0aW9uKGIsZil7dmFyIGc9bS5pc0Z1bmN0aW9uKGFbYl0pJiZhW2JdO2VbZlsxXV0oZnVuY3Rpb24oKXt2YXIgYT1nJiZnLmFwcGx5KHRoaXMsYXJndW1lbnRzKTthJiZtLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hLnByb21pc2UoKS5kb25lKGMucmVzb2x2ZSkuZmFpbChjLnJlamVjdCkucHJvZ3Jlc3MoYy5ub3RpZnkpOmNbZlswXSsiV2l0aCJdKHRoaXM9PT1kP2MucHJvbWlzZSgpOnRoaXMsZz9bYV06YXJndW1lbnRzKX0pfSksYT1udWxsfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hP20uZXh0ZW5kKGEsZCk6ZH19LGU9e307cmV0dXJuIGQucGlwZT1kLnRoZW4sbS5lYWNoKGIsZnVuY3Rpb24oYSxmKXt2YXIgZz1mWzJdLGg9ZlszXTtkW2ZbMV1dPWcuYWRkLGgmJmcuYWRkKGZ1bmN0aW9uKCl7Yz1ofSxiWzFeYV1bMl0uZGlzYWJsZSxiWzJdWzJdLmxvY2spLGVbZlswXV09ZnVuY3Rpb24oKXtyZXR1cm4gZVtmWzBdKyJXaXRoIl0odGhpcz09PWU/ZDp0aGlzLGFyZ3VtZW50cyksdGhpc30sZVtmWzBdKyJXaXRoIl09Zy5maXJlV2l0aH0pLGQucHJvbWlzZShlKSxhJiZhLmNhbGwoZSxlKSxlfSx3aGVuOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz1kLmNhbGwoYXJndW1lbnRzKSxlPWMubGVuZ3RoLGY9MSE9PWV8fGEmJm0uaXNGdW5jdGlvbihhLnByb21pc2UpP2U6MCxnPTE9PT1mP2E6bS5EZWZlcnJlZCgpLGg9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmdW5jdGlvbihlKXtiW2FdPXRoaXMsY1thXT1hcmd1bWVudHMubGVuZ3RoPjE/ZC5jYWxsKGFyZ3VtZW50cyk6ZSxjPT09aT9nLm5vdGlmeVdpdGgoYixjKTotLWZ8fGcucmVzb2x2ZVdpdGgoYixjKX19LGksaixrO2lmKGU+MSlmb3IoaT1uZXcgQXJyYXkoZSksaj1uZXcgQXJyYXkoZSksaz1uZXcgQXJyYXkoZSk7ZT5iO2IrKyljW2JdJiZtLmlzRnVuY3Rpb24oY1tiXS5wcm9taXNlKT9jW2JdLnByb21pc2UoKS5kb25lKGgoYixrLGMpKS5mYWlsKGcucmVqZWN0KS5wcm9ncmVzcyhoKGIsaixpKSk6LS1mO3JldHVybiBmfHxnLnJlc29sdmVXaXRoKGssYyksZy5wcm9taXNlKCl9fSk7dmFyIEg7bS5mbi5yZWFkeT1mdW5jdGlvbihhKXtyZXR1cm4gbS5yZWFkeS5wcm9taXNlKCkuZG9uZShhKSx0aGlzfSxtLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9tLnJlYWR5V2FpdCsrOm0ucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXtpZihhPT09ITA/IS0tbS5yZWFkeVdhaXQ6IW0uaXNSZWFkeSl7aWYoIXkuYm9keSlyZXR1cm4gc2V0VGltZW91dChtLnJlYWR5KTttLmlzUmVhZHk9ITAsYSE9PSEwJiYtLW0ucmVhZHlXYWl0PjB8fChILnJlc29sdmVXaXRoKHksW21dKSxtLmZuLnRyaWdnZXJIYW5kbGVyJiYobSh5KS50cmlnZ2VySGFuZGxlcigicmVhZHkiKSxtKHkpLm9mZigicmVhZHkiKSkpfX19KTtmdW5jdGlvbiBJKCl7eS5hZGRFdmVudExpc3RlbmVyPyh5LnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEosITEpLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsSiwhMSkpOih5LmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEopLGEuZGV0YWNoRXZlbnQoIm9ubG9hZCIsSikpfWZ1bmN0aW9uIEooKXsoeS5hZGRFdmVudExpc3RlbmVyfHwibG9hZCI9PT1ldmVudC50eXBlfHwiY29tcGxldGUiPT09eS5yZWFkeVN0YXRlKSYmKEkoKSxtLnJlYWR5KCkpfW0ucmVhZHkucHJvbWlzZT1mdW5jdGlvbihiKXtpZighSClpZihIPW0uRGVmZXJyZWQoKSwiY29tcGxldGUiPT09eS5yZWFkeVN0YXRlKXNldFRpbWVvdXQobS5yZWFkeSk7ZWxzZSBpZih5LmFkZEV2ZW50TGlzdGVuZXIpeS5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixKLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLEosITEpO2Vsc2V7eS5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixKKSxhLmF0dGFjaEV2ZW50KCJvbmxvYWQiLEopO3ZhciBjPSExO3RyeXtjPW51bGw9PWEuZnJhbWVFbGVtZW50JiZ5LmRvY3VtZW50RWxlbWVudH1jYXRjaChkKXt9YyYmYy5kb1Njcm9sbCYmIWZ1bmN0aW9uIGUoKXtpZighbS5pc1JlYWR5KXt0cnl7Yy5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGEpe3JldHVybiBzZXRUaW1lb3V0KGUsNTApfUkoKSxtLnJlYWR5KCl9fSgpfXJldHVybiBILnByb21pc2UoYil9O3ZhciBLPSJ1bmRlZmluZWQiLEw7Zm9yKEwgaW4gbShrKSlicmVhaztrLm93bkxhc3Q9IjAiIT09TCxrLmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9ITEsbShmdW5jdGlvbigpe3ZhciBhLGIsYyxkO2M9eS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdLGMmJmMuc3R5bGUmJihiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksZD15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHgiLGMuYXBwZW5kQ2hpbGQoZCkuYXBwZW5kQ2hpbGQoYiksdHlwZW9mIGIuc3R5bGUuem9vbSE9PUsmJihiLnN0eWxlLmNzc1RleHQ9ImRpc3BsYXk6aW5saW5lO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjEiLGsuaW5saW5lQmxvY2tOZWVkc0xheW91dD1hPTM9PT1iLm9mZnNldFdpZHRoLGEmJihjLnN0eWxlLnpvb209MSkpLGMucmVtb3ZlQ2hpbGQoZCkpfSksZnVuY3Rpb24oKXt2YXIgYT15LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2lmKG51bGw9PWsuZGVsZXRlRXhwYW5kbyl7ay5kZWxldGVFeHBhbmRvPSEwO3RyeXtkZWxldGUgYS50ZXN0fWNhdGNoKGIpe2suZGVsZXRlRXhwYW5kbz0hMX19YT1udWxsfSgpLG0uYWNjZXB0RGF0YT1mdW5jdGlvbihhKXt2YXIgYj1tLm5vRGF0YVsoYS5ub2RlTmFtZSsiICIpLnRvTG93ZXJDYXNlKCldLGM9K2Eubm9kZVR5cGV8fDE7cmV0dXJuIDEhPT1jJiY5IT09Yz8hMTohYnx8YiE9PSEwJiZhLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpPT09Yn07dmFyIE09L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxOPS8oW0EtWl0pL2c7ZnVuY3Rpb24gTyhhLGIsYyl7aWYodm9pZCAwPT09YyYmMT09PWEubm9kZVR5cGUpe3ZhciBkPSJkYXRhLSIrYi5yZXBsYWNlKE4sIi0kMSIpLnRvTG93ZXJDYXNlKCk7aWYoYz1hLmdldEF0dHJpYnV0ZShkKSwic3RyaW5nIj09dHlwZW9mIGMpe3RyeXtjPSJ0cnVlIj09PWM/ITA6ImZhbHNlIj09PWM/ITE6Im51bGwiPT09Yz9udWxsOitjKyIiPT09Yz8rYzpNLnRlc3QoYyk/bS5wYXJzZUpTT04oYyk6Y31jYXRjaChlKXt9bS5kYXRhKGEsYixjKX1lbHNlIGM9dm9pZCAwfXJldHVybiBjfWZ1bmN0aW9uIFAoYSl7dmFyIGI7Zm9yKGIgaW4gYSlpZigoImRhdGEiIT09Ynx8IW0uaXNFbXB0eU9iamVjdChhW2JdKSkmJiJ0b0pTT04iIT09YilyZXR1cm4hMTsNCg0KcmV0dXJuITB9ZnVuY3Rpb24gUShhLGIsZCxlKXtpZihtLmFjY2VwdERhdGEoYSkpe3ZhciBmLGcsaD1tLmV4cGFuZG8saT1hLm5vZGVUeXBlLGo9aT9tLmNhY2hlOmEsaz1pP2FbaF06YVtoXSYmaDtpZihrJiZqW2tdJiYoZXx8altrXS5kYXRhKXx8dm9pZCAwIT09ZHx8InN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBrfHwoaz1pP2FbaF09Yy5wb3AoKXx8bS5ndWlkKys6aCksaltrXXx8KGpba109aT97fTp7dG9KU09OOm0ubm9vcH0pLCgib2JqZWN0Ij09dHlwZW9mIGJ8fCJmdW5jdGlvbiI9PXR5cGVvZiBiKSYmKGU/altrXT1tLmV4dGVuZChqW2tdLGIpOmpba10uZGF0YT1tLmV4dGVuZChqW2tdLmRhdGEsYikpLGc9altrXSxlfHwoZy5kYXRhfHwoZy5kYXRhPXt9KSxnPWcuZGF0YSksdm9pZCAwIT09ZCYmKGdbbS5jYW1lbENhc2UoYildPWQpLCJzdHJpbmciPT10eXBlb2YgYj8oZj1nW2JdLG51bGw9PWYmJihmPWdbbS5jYW1lbENhc2UoYildKSk6Zj1nLGZ9fWZ1bmN0aW9uIFIoYSxiLGMpe2lmKG0uYWNjZXB0RGF0YShhKSl7dmFyIGQsZSxmPWEubm9kZVR5cGUsZz1mP20uY2FjaGU6YSxoPWY/YVttLmV4cGFuZG9dOm0uZXhwYW5kbztpZihnW2hdKXtpZihiJiYoZD1jP2dbaF06Z1toXS5kYXRhKSl7bS5pc0FycmF5KGIpP2I9Yi5jb25jYXQobS5tYXAoYixtLmNhbWVsQ2FzZSkpOmIgaW4gZD9iPVtiXTooYj1tLmNhbWVsQ2FzZShiKSxiPWIgaW4gZD9bYl06Yi5zcGxpdCgiICIpKSxlPWIubGVuZ3RoO3doaWxlKGUtLSlkZWxldGUgZFtiW2VdXTtpZihjPyFQKGQpOiFtLmlzRW1wdHlPYmplY3QoZCkpcmV0dXJufShjfHwoZGVsZXRlIGdbaF0uZGF0YSxQKGdbaF0pKSkmJihmP20uY2xlYW5EYXRhKFthXSwhMCk6ay5kZWxldGVFeHBhbmRvfHxnIT1nLndpbmRvdz9kZWxldGUgZ1toXTpnW2hdPW51bGwpfX19bS5leHRlbmQoe2NhY2hlOnt9LG5vRGF0YTp7ImFwcGxldCAiOiEwLCJlbWJlZCAiOiEwLCJvYmplY3QgIjoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIn0saGFzRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gYT1hLm5vZGVUeXBlP20uY2FjaGVbYVttLmV4cGFuZG9dXTphW20uZXhwYW5kb10sISFhJiYhUChhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIFEoYSxiLGMpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFIoYSxiKX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBRKGEsYixjLCEwKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUihhLGIsITApfX0pLG0uZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9dGhpc1swXSxnPWYmJmYuYXR0cmlidXRlcztpZih2b2lkIDA9PT1hKXtpZih0aGlzLmxlbmd0aCYmKGU9bS5kYXRhKGYpLDE9PT1mLm5vZGVUeXBlJiYhbS5fZGF0YShmLCJwYXJzZWRBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZ1tjXSYmKGQ9Z1tjXS5uYW1lLDA9PT1kLmluZGV4T2YoImRhdGEtIikmJihkPW0uY2FtZWxDYXNlKGQuc2xpY2UoNSkpLE8oZixkLGVbZF0pKSk7bS5fZGF0YShmLCJwYXJzZWRBdHRycyIsITApfXJldHVybiBlfXJldHVybiJvYmplY3QiPT10eXBlb2YgYT90aGlzLmVhY2goZnVuY3Rpb24oKXttLmRhdGEodGhpcyxhKX0pOmFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goZnVuY3Rpb24oKXttLmRhdGEodGhpcyxhLGIpfSk6Zj9PKGYsYSxtLmRhdGEoZixhKSk6dm9pZCAwfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXttLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLG0uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGE/KGI9KGJ8fCJmeCIpKyJxdWV1ZSIsZD1tLl9kYXRhKGEsYiksYyYmKCFkfHxtLmlzQXJyYXkoYyk/ZD1tLl9kYXRhKGEsYixtLm1ha2VBcnJheShjKSk6ZC5wdXNoKGMpKSxkfHxbXSk6dm9pZCAwfSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPW0ucXVldWUoYSxiKSxkPWMubGVuZ3RoLGU9Yy5zaGlmdCgpLGY9bS5fcXVldWVIb29rcyhhLGIpLGc9ZnVuY3Rpb24oKXttLmRlcXVldWUoYSxiKX07ImlucHJvZ3Jlc3MiPT09ZSYmKGU9Yy5zaGlmdCgpLGQtLSksZSYmKCJmeCI9PT1iJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgZi5zdG9wLGUuY2FsbChhLGcsZikpLCFkJiZmJiZmLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iKyJxdWV1ZUhvb2tzIjtyZXR1cm4gbS5fZGF0YShhLGMpfHxtLl9kYXRhKGEsYyx7ZW1wdHk6bS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7bS5fcmVtb3ZlRGF0YShhLGIrInF1ZXVlIiksbS5fcmVtb3ZlRGF0YShhLGMpfSl9KX19KSxtLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPSJmeCIsYy0tKSxhcmd1bWVudHMubGVuZ3RoPGM/bS5xdWV1ZSh0aGlzWzBdLGEpOnZvaWQgMD09PWI/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1tLnF1ZXVlKHRoaXMsYSxiKTttLl9xdWV1ZUhvb2tzKHRoaXMsYSksImZ4Ij09PWEmJiJpbnByb2dyZXNzIiE9PWNbMF0mJm0uZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20uZGVxdWV1ZSh0aGlzLGEpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTEsZT1tLkRlZmVycmVkKCksZj10aGlzLGc9dGhpcy5sZW5ndGgsaD1mdW5jdGlvbigpey0tZHx8ZS5yZXNvbHZlV2l0aChmLFtmXSl9OyJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYT1hfHwiZngiO3doaWxlKGctLSljPW0uX2RhdGEoZltnXSxhKyJxdWV1ZUhvb2tzIiksYyYmYy5lbXB0eSYmKGQrKyxjLmVtcHR5LmFkZChoKSk7cmV0dXJuIGgoKSxlLnByb21pc2UoYil9fSk7dmFyIFM9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsVD1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLFU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1ifHxhLCJub25lIj09PW0uY3NzKGEsImRpc3BsYXkiKXx8IW0uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfSxWPW0uYWNjZXNzPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPTAsaT1hLmxlbmd0aCxqPW51bGw9PWM7aWYoIm9iamVjdCI9PT1tLnR5cGUoYykpe2U9ITA7Zm9yKGggaW4gYyltLmFjY2VzcyhhLGIsaCxjW2hdLCEwLGYsZyl9ZWxzZSBpZih2b2lkIDAhPT1kJiYoZT0hMCxtLmlzRnVuY3Rpb24oZCl8fChnPSEwKSxqJiYoZz8oYi5jYWxsKGEsZCksYj1udWxsKTooaj1iLGI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBqLmNhbGwobShhKSxjKX0pKSxiKSlmb3IoO2k+aDtoKyspYihhW2hdLGMsZz9kOmQuY2FsbChhW2hdLGgsYihhW2hdLGMpKSk7cmV0dXJuIGU/YTpqP2IuY2FsbChhKTppP2IoYVswXSxjKTpmfSxXPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pOyFmdW5jdGlvbigpe3ZhciBhPXkuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYz15LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihiLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixrLmxlYWRpbmdXaGl0ZXNwYWNlPTM9PT1iLmZpcnN0Q2hpbGQubm9kZVR5cGUsay50Ym9keT0hYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsay5odG1sU2VyaWFsaXplPSEhYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxrLmh0bWw1Q2xvbmU9Ijw6bmF2PjwvOm5hdj4iIT09eS5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCxhLnR5cGU9ImNoZWNrYm94IixhLmNoZWNrZWQ9ITAsYy5hcHBlbmRDaGlsZChhKSxrLmFwcGVuZENoZWNrZWQ9YS5jaGVja2VkLGIuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IixrLm5vQ2xvbmVDaGVja2VkPSEhYi5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWUsYy5hcHBlbmRDaGlsZChiKSxiLmlubmVySFRNTD0iPGlucHV0IHR5cGU9J3JhZGlvJyBjaGVja2VkPSdjaGVja2VkJyBuYW1lPSd0Jy8+IixrLmNoZWNrQ2xvbmU9Yi5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsay5ub0Nsb25lRXZlbnQ9ITAsYi5hdHRhY2hFdmVudCYmKGIuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGZ1bmN0aW9uKCl7ay5ub0Nsb25lRXZlbnQ9ITF9KSxiLmNsb25lTm9kZSghMCkuY2xpY2soKSksbnVsbD09ay5kZWxldGVFeHBhbmRvKXtrLmRlbGV0ZUV4cGFuZG89ITA7dHJ5e2RlbGV0ZSBiLnRlc3R9Y2F0Y2goZCl7ay5kZWxldGVFeHBhbmRvPSExfX19KCksZnVuY3Rpb24oKXt2YXIgYixjLGQ9eS5jcmVhdGVFbGVtZW50KCJkaXYiKTtmb3IoYiBpbntzdWJtaXQ6ITAsY2hhbmdlOiEwLGZvY3VzaW46ITB9KWM9Im9uIitiLChrW2IrIkJ1YmJsZXMiXT1jIGluIGEpfHwoZC5zZXRBdHRyaWJ1dGUoYywidCIpLGtbYisiQnViYmxlcyJdPWQuYXR0cmlidXRlc1tjXS5leHBhbmRvPT09ITEpO2Q9bnVsbH0oKTt2YXIgWD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksWT0vXmtleS8sWj0vXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnUpfGNsaWNrLywkPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxfPS9eKFteLl0qKSg/OlwuKC4rKXwpJC87ZnVuY3Rpb24gYWEoKXtyZXR1cm4hMH1mdW5jdGlvbiBiYSgpe3JldHVybiExfWZ1bmN0aW9uIGNhKCl7dHJ5e3JldHVybiB5LmFjdGl2ZUVsZW1lbnR9Y2F0Y2goYSl7fX1tLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbixvLHAscSxyPW0uX2RhdGEoYSk7aWYocil7Yy5oYW5kbGVyJiYoaT1jLGM9aS5oYW5kbGVyLGU9aS5zZWxlY3RvciksYy5ndWlkfHwoYy5ndWlkPW0uZ3VpZCsrKSwoZz1yLmV2ZW50cyl8fChnPXIuZXZlbnRzPXt9KSwoaz1yLmhhbmRsZSl8fChrPXIuaGFuZGxlPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgbT09PUt8fGEmJm0uZXZlbnQudHJpZ2dlcmVkPT09YS50eXBlP3ZvaWQgMDptLmV2ZW50LmRpc3BhdGNoLmFwcGx5KGsuZWxlbSxhcmd1bWVudHMpfSxrLmVsZW09YSksYj0oYnx8IiIpLm1hdGNoKEUpfHxbIiJdLGg9Yi5sZW5ndGg7d2hpbGUoaC0tKWY9Xy5leGVjKGJbaF0pfHxbXSxvPXE9ZlsxXSxwPShmWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyYmKGo9bS5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShlP2ouZGVsZWdhdGVUeXBlOmouYmluZFR5cGUpfHxvLGo9bS5ldmVudC5zcGVjaWFsW29dfHx7fSxsPW0uZXh0ZW5kKHt0eXBlOm8sb3JpZ1R5cGU6cSxkYXRhOmQsaGFuZGxlcjpjLGd1aWQ6Yy5ndWlkLHNlbGVjdG9yOmUsbmVlZHNDb250ZXh0OmUmJm0uZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChlKSxuYW1lc3BhY2U6cC5qb2luKCIuIil9LGkpLChuPWdbb10pfHwobj1nW29dPVtdLG4uZGVsZWdhdGVDb3VudD0wLGouc2V0dXAmJmouc2V0dXAuY2FsbChhLGQscCxrKSE9PSExfHwoYS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihvLGssITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitvLGspKSksai5hZGQmJihqLmFkZC5jYWxsKGEsbCksbC5oYW5kbGVyLmd1aWR8fChsLmhhbmRsZXIuZ3VpZD1jLmd1aWQpKSxlP24uc3BsaWNlKG4uZGVsZWdhdGVDb3VudCsrLDAsbCk6bi5wdXNoKGwpLG0uZXZlbnQuZ2xvYmFsW29dPSEwKTthPW51bGx9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxuLG8scCxxLHI9bS5oYXNEYXRhKGEpJiZtLl9kYXRhKGEpO2lmKHImJihrPXIuZXZlbnRzKSl7Yj0oYnx8IiIpLm1hdGNoKEUpfHxbIiJdLGo9Yi5sZW5ndGg7d2hpbGUoai0tKWlmKGg9Xy5leGVjKGJbal0pfHxbXSxvPXE9aFsxXSxwPShoWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyl7bD1tLmV2ZW50LnNwZWNpYWxbb118fHt9LG89KGQ/bC5kZWxlZ2F0ZVR5cGU6bC5iaW5kVHlwZSl8fG8sbj1rW29dfHxbXSxoPWhbMl0mJm5ldyBSZWdFeHAoIihefFxcLikiK3Auam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksaT1mPW4ubGVuZ3RoO3doaWxlKGYtLSlnPW5bZl0sIWUmJnEhPT1nLm9yaWdUeXBlfHxjJiZjLmd1aWQhPT1nLmd1aWR8fGgmJiFoLnRlc3QoZy5uYW1lc3BhY2UpfHxkJiZkIT09Zy5zZWxlY3RvciYmKCIqKiIhPT1kfHwhZy5zZWxlY3Rvcil8fChuLnNwbGljZShmLDEpLGcuc2VsZWN0b3ImJm4uZGVsZWdhdGVDb3VudC0tLGwucmVtb3ZlJiZsLnJlbW92ZS5jYWxsKGEsZykpO2kmJiFuLmxlbmd0aCYmKGwudGVhcmRvd24mJmwudGVhcmRvd24uY2FsbChhLHAsci5oYW5kbGUpIT09ITF8fG0ucmVtb3ZlRXZlbnQoYSxvLHIuaGFuZGxlKSxkZWxldGUga1tvXSl9ZWxzZSBmb3IobyBpbiBrKW0uZXZlbnQucmVtb3ZlKGEsbytiW2pdLGMsZCwhMCk7bS5pc0VtcHR5T2JqZWN0KGspJiYoZGVsZXRlIHIuaGFuZGxlLG0uX3JlbW92ZURhdGEoYSwiZXZlbnRzIikpfX0sdHJpZ2dlcjpmdW5jdGlvbihiLGMsZCxlKXt2YXIgZixnLGgsaSxrLGwsbixvPVtkfHx5XSxwPWouY2FsbChiLCJ0eXBlIik/Yi50eXBlOmIscT1qLmNhbGwoYiwibmFtZXNwYWNlIik/Yi5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihoPWw9ZD1kfHx5LDMhPT1kLm5vZGVUeXBlJiY4IT09ZC5ub2RlVHlwZSYmISQudGVzdChwK20uZXZlbnQudHJpZ2dlcmVkKSYmKHAuaW5kZXhPZigiLiIpPj0wJiYocT1wLnNwbGl0KCIuIikscD1xLnNoaWZ0KCkscS5zb3J0KCkpLGc9cC5pbmRleE9mKCI6Iik8MCYmIm9uIitwLGI9YlttLmV4cGFuZG9dP2I6bmV3IG0uRXZlbnQocCwib2JqZWN0Ij09dHlwZW9mIGImJmIpLGIuaXNUcmlnZ2VyPWU/MjozLGIubmFtZXNwYWNlPXEuam9pbigiLiIpLGIubmFtZXNwYWNlX3JlPWIubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3Euam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxiLnJlc3VsdD12b2lkIDAsYi50YXJnZXR8fChiLnRhcmdldD1kKSxjPW51bGw9PWM/W2JdOm0ubWFrZUFycmF5KGMsW2JdKSxrPW0uZXZlbnQuc3BlY2lhbFtwXXx8e30sZXx8IWsudHJpZ2dlcnx8ay50cmlnZ2VyLmFwcGx5KGQsYykhPT0hMSkpe2lmKCFlJiYhay5ub0J1YmJsZSYmIW0uaXNXaW5kb3coZCkpe2ZvcihpPWsuZGVsZWdhdGVUeXBlfHxwLCQudGVzdChpK3ApfHwoaD1oLnBhcmVudE5vZGUpO2g7aD1oLnBhcmVudE5vZGUpby5wdXNoKGgpLGw9aDtsPT09KGQub3duZXJEb2N1bWVudHx8eSkmJm8ucHVzaChsLmRlZmF1bHRWaWV3fHxsLnBhcmVudFdpbmRvd3x8YSl9bj0wO3doaWxlKChoPW9bbisrXSkmJiFiLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYi50eXBlPW4+MT9pOmsuYmluZFR5cGV8fHAsZj0obS5fZGF0YShoLCJldmVudHMiKXx8e30pW2IudHlwZV0mJm0uX2RhdGEoaCwiaGFuZGxlIiksZiYmZi5hcHBseShoLGMpLGY9ZyYmaFtnXSxmJiZmLmFwcGx5JiZtLmFjY2VwdERhdGEoaCkmJihiLnJlc3VsdD1mLmFwcGx5KGgsYyksYi5yZXN1bHQ9PT0hMSYmYi5wcmV2ZW50RGVmYXVsdCgpKTtpZihiLnR5cGU9cCwhZSYmIWIuaXNEZWZhdWx0UHJldmVudGVkKCkmJighay5fZGVmYXVsdHx8ay5fZGVmYXVsdC5hcHBseShvLnBvcCgpLGMpPT09ITEpJiZtLmFjY2VwdERhdGEoZCkmJmcmJmRbcF0mJiFtLmlzV2luZG93KGQpKXtsPWRbZ10sbCYmKGRbZ109bnVsbCksbS5ldmVudC50cmlnZ2VyZWQ9cDt0cnl7ZFtwXSgpfWNhdGNoKHIpe31tLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsbCYmKGRbZ109bCl9cmV0dXJuIGIucmVzdWx0fX0sZGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YT1tLmV2ZW50LmZpeChhKTt2YXIgYixjLGUsZixnLGg9W10saT1kLmNhbGwoYXJndW1lbnRzKSxqPShtLl9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbYS50eXBlXXx8W10saz1tLmV2ZW50LnNwZWNpYWxbYS50eXBlXXx8e307aWYoaVswXT1hLGEuZGVsZWdhdGVUYXJnZXQ9dGhpcywhay5wcmVEaXNwYXRjaHx8ay5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsYSkhPT0hMSl7aD1tLmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyxhLGopLGI9MDt3aGlsZSgoZj1oW2IrK10pJiYhYS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXthLmN1cnJlbnRUYXJnZXQ9Zi5lbGVtLGc9MDt3aGlsZSgoZT1mLmhhbmRsZXJzW2crK10pJiYhYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKSghYS5uYW1lc3BhY2VfcmV8fGEubmFtZXNwYWNlX3JlLnRlc3QoZS5uYW1lc3BhY2UpKSYmKGEuaGFuZGxlT2JqPWUsYS5kYXRhPWUuZGF0YSxjPSgobS5ldmVudC5zcGVjaWFsW2Uub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxlLmhhbmRsZXIpLmFwcGx5KGYuZWxlbSxpKSx2b2lkIDAhPT1jJiYoYS5yZXN1bHQ9Yyk9PT0hMSYmKGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGsucG9zdERpc3BhdGNoJiZrLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsYSksYS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc9W10saD1iLmRlbGVnYXRlQ291bnQsaT1hLnRhcmdldDtpZihoJiZpLm5vZGVUeXBlJiYoIWEuYnV0dG9ufHwiY2xpY2siIT09YS50eXBlKSlmb3IoO2khPXRoaXM7aT1pLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWkubm9kZVR5cGUmJihpLmRpc2FibGVkIT09ITB8fCJjbGljayIhPT1hLnR5cGUpKXtmb3IoZT1bXSxmPTA7aD5mO2YrKylkPWJbZl0sYz1kLnNlbGVjdG9yKyIgIix2b2lkIDA9PT1lW2NdJiYoZVtjXT1kLm5lZWRzQ29udGV4dD9tKGMsdGhpcykuaW5kZXgoaSk+PTA6bS5maW5kKGMsdGhpcyxudWxsLFtpXSkubGVuZ3RoKSxlW2NdJiZlLnB1c2goZCk7ZS5sZW5ndGgmJmcucHVzaCh7ZWxlbTppLGhhbmRsZXJzOmV9KX1yZXR1cm4gaDxiLmxlbmd0aCYmZy5wdXNoKHtlbGVtOnRoaXMsaGFuZGxlcnM6Yi5zbGljZShoKX0pLGd9LGZpeDpmdW5jdGlvbihhKXtpZihhW20uZXhwYW5kb10pcmV0dXJuIGE7dmFyIGIsYyxkLGU9YS50eXBlLGY9YSxnPXRoaXMuZml4SG9va3NbZV07Z3x8KHRoaXMuZml4SG9va3NbZV09Zz1aLnRlc3QoZSk/dGhpcy5tb3VzZUhvb2tzOlkudGVzdChlKT90aGlzLmtleUhvb2tzOnt9KSxkPWcucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQoZy5wcm9wcyk6dGhpcy5wcm9wcyxhPW5ldyBtLkV2ZW50KGYpLGI9ZC5sZW5ndGg7d2hpbGUoYi0tKWM9ZFtiXSxhW2NdPWZbY107cmV0dXJuIGEudGFyZ2V0fHwoYS50YXJnZXQ9Zi5zcmNFbGVtZW50fHx5KSwzPT09YS50YXJnZXQubm9kZVR5cGUmJihhLnRhcmdldD1hLnRhcmdldC5wYXJlbnROb2RlKSxhLm1ldGFLZXk9ISFhLm1ldGFLZXksZy5maWx0ZXI/Zy5maWx0ZXIoYSxmKTphfSxwcm9wczoiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09YS53aGljaCYmKGEud2hpY2g9bnVsbCE9Yi5jaGFyQ29kZT9iLmNoYXJDb2RlOmIua2V5Q29kZSksYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9Yi5idXR0b24sZz1iLmZyb21FbGVtZW50O3JldHVybiBudWxsPT1hLnBhZ2VYJiZudWxsIT1iLmNsaWVudFgmJihkPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fHksZT1kLmRvY3VtZW50RWxlbWVudCxjPWQuYm9keSxhLnBhZ2VYPWIuY2xpZW50WCsoZSYmZS5zY3JvbGxMZWZ0fHxjJiZjLnNjcm9sbExlZnR8fDApLShlJiZlLmNsaWVudExlZnR8fGMmJmMuY2xpZW50TGVmdHx8MCksYS5wYWdlWT1iLmNsaWVudFkrKGUmJmUuc2Nyb2xsVG9wfHxjJiZjLnNjcm9sbFRvcHx8MCktKGUmJmUuY2xpZW50VG9wfHxjJiZjLmNsaWVudFRvcHx8MCkpLCFhLnJlbGF0ZWRUYXJnZXQmJmcmJihhLnJlbGF0ZWRUYXJnZXQ9Zz09PWEudGFyZ2V0P2IudG9FbGVtZW50OmcpLGEud2hpY2h8fHZvaWQgMD09PWZ8fChhLndoaWNoPTEmZj8xOjImZj8zOjQmZj8yOjApLGF9fSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzIT09Y2EoKSYmdGhpcy5mb2N1cyl0cnl7cmV0dXJuIHRoaXMuZm9jdXMoKSwhMX1jYXRjaChhKXt9fSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM9PT1jYSgpJiZ0aGlzLmJsdXI/KHRoaXMuYmx1cigpLCExKTp2b2lkIDB9LGRlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiBtLm5vZGVOYW1lKHRoaXMsImlucHV0IikmJiJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2s/KHRoaXMuY2xpY2soKSwhMSk6dm9pZCAwfSxfZGVmYXVsdDpmdW5jdGlvbihhKXtyZXR1cm4gbS5ub2RlTmFtZShhLnRhcmdldCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7dm9pZCAwIT09YS5yZXN1bHQmJmEub3JpZ2luYWxFdmVudCYmKGEub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1hLnJlc3VsdCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bS5leHRlbmQobmV3IG0uRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtkP20uZXZlbnQudHJpZ2dlcihlLG51bGwsYik6bS5ldmVudC5kaXNwYXRjaC5jYWxsKGIsZSksZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sbS5yZW1vdmVFdmVudD15LnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSl9OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0ib24iK2I7YS5kZXRhY2hFdmVudCYmKHR5cGVvZiBhW2RdPT09SyYmKGFbZF09bnVsbCksYS5kZXRhY2hFdmVudChkLGMpKX0sbS5FdmVudD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgbS5FdmVudD8oYSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09YS5kZWZhdWx0UHJldmVudGVkJiZhLnJldHVyblZhbHVlPT09ITE/YWE6YmEpOnRoaXMudHlwZT1hLGImJm0uZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fG0ubm93KCksdm9pZCh0aGlzW20uZXhwYW5kb109ITApKTpuZXcgbS5FdmVudChhLGIpfSxtLkV2ZW50LnByb3RvdHlwZT17aXNEZWZhdWx0UHJldmVudGVkOmJhLGlzUHJvcGFnYXRpb25TdG9wcGVkOmJhLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOmJhLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPWFhLGEmJihhLnByZXZlbnREZWZhdWx0P2EucHJldmVudERlZmF1bHQoKTphLnJldHVyblZhbHVlPSExKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9YWEsYSYmKGEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpLGEuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9YWEsYSYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24mJmEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LG0uZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxiKXttLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9dGhpcyxlPWEucmVsYXRlZFRhcmdldCxmPWEuaGFuZGxlT2JqO3JldHVybighZXx8ZSE9PWQmJiFtLmNvbnRhaW5zKGQsZSkpJiYoYS50eXBlPWYub3JpZ1R5cGUsYz1mLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGEudHlwZT1iKSxjfX19KSxrLnN1Ym1pdEJ1YmJsZXN8fChtLmV2ZW50LnNwZWNpYWwuc3VibWl0PXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBtLm5vZGVOYW1lKHRoaXMsImZvcm0iKT8hMTp2b2lkIG0uZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsYz1tLm5vZGVOYW1lKGIsImlucHV0Iil8fG0ubm9kZU5hbWUoYiwiYnV0dG9uIik/Yi5mb3JtOnZvaWQgMDtjJiYhbS5fZGF0YShjLCJzdWJtaXRCdWJibGVzIikmJihtLmV2ZW50LmFkZChjLCJzdWJtaXQuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7YS5fc3VibWl0X2J1YmJsZT0hMH0pLG0uX2RhdGEoYywic3VibWl0QnViYmxlcyIsITApKX0pfSxwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YS5fc3VibWl0X2J1YmJsZSYmKGRlbGV0ZSBhLl9zdWJtaXRfYnViYmxlLHRoaXMucGFyZW50Tm9kZSYmIWEuaXNUcmlnZ2VyJiZtLmV2ZW50LnNpbXVsYXRlKCJzdWJtaXQiLHRoaXMucGFyZW50Tm9kZSxhLCEwKSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7cmV0dXJuIG0ubm9kZU5hbWUodGhpcywiZm9ybSIpPyExOnZvaWQgbS5ldmVudC5yZW1vdmUodGhpcywiLl9zdWJtaXQiKX19KSxrLmNoYW5nZUJ1YmJsZXN8fChtLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBYLnRlc3QodGhpcy5ub2RlTmFtZSk/KCgiY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlKSYmKG0uZXZlbnQuYWRkKHRoaXMsInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpeyJjaGVja2VkIj09PWEub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWUmJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITApfSksbS5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5fanVzdF9jaGFuZ2VkJiYhYS5pc1RyaWdnZXImJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITEpLG0uZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxhLCEwKX0pKSwhMSk6dm9pZCBtLmV2ZW50LmFkZCh0aGlzLCJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdlIixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtYLnRlc3QoYi5ub2RlTmFtZSkmJiFtLl9kYXRhKGIsImNoYW5nZUJ1YmJsZXMiKSYmKG0uZXZlbnQuYWRkKGIsImNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXshdGhpcy5wYXJlbnROb2RlfHxhLmlzU2ltdWxhdGVkfHxhLmlzVHJpZ2dlcnx8bS5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLnBhcmVudE5vZGUsYSwhMCl9KSxtLl9kYXRhKGIsImNoYW5nZUJ1YmJsZXMiLCEwKSl9KX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O3JldHVybiB0aGlzIT09Ynx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fCJyYWRpbyIhPT1iLnR5cGUmJiJjaGVja2JveCIhPT1iLnR5cGU/YS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dm9pZCAwfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBtLmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpLCFYLnRlc3QodGhpcy5ub2RlTmFtZSl9fSksay5mb2N1c2luQnViYmxlc3x8bS5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKGEpe20uZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxtLmV2ZW50LmZpeChhKSwhMCl9O20uZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1tLl9kYXRhKGQsYik7ZXx8ZC5hZGRFdmVudExpc3RlbmVyKGEsYywhMCksbS5fZGF0YShkLGIsKGV8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciBkPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxlPW0uX2RhdGEoZCxiKS0xO2U/bS5fZGF0YShkLGIsZSk6KGQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGMsITApLG0uX3JlbW92ZURhdGEoZCxiKSl9fX0pLG0uZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGc7aWYoIm9iamVjdCI9PXR5cGVvZiBhKXsic3RyaW5nIiE9dHlwZW9mIGImJihjPWN8fGIsYj12b2lkIDApO2ZvcihmIGluIGEpdGhpcy5vbihmLGIsYyxhW2ZdLGUpO3JldHVybiB0aGlzfWlmKG51bGw9PWMmJm51bGw9PWQ/KGQ9YixjPWI9dm9pZCAwKTpudWxsPT1kJiYoInN0cmluZyI9PXR5cGVvZiBiPyhkPWMsYz12b2lkIDApOihkPWMsYz1iLGI9dm9pZCAwKSksZD09PSExKWQ9YmE7ZWxzZSBpZighZClyZXR1cm4gdGhpcztyZXR1cm4gMT09PWUmJihnPWQsZD1mdW5jdGlvbihhKXtyZXR1cm4gbSgpLm9mZihhKSxnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZC5ndWlkPWcuZ3VpZHx8KGcuZ3VpZD1tLmd1aWQrKykpLHRoaXMuZWFjaChmdW5jdGlvbigpe20uZXZlbnQuYWRkKHRoaXMsYSxkLGMsYil9KX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iailyZXR1cm4gZD1hLmhhbmRsZU9iaixtKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihkLm5hbWVzcGFjZT9kLm9yaWdUeXBlKyIuIitkLm5hbWVzcGFjZTpkLm9yaWdUeXBlLGQuc2VsZWN0b3IsZC5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7Zm9yKGUgaW4gYSl0aGlzLm9mZihlLGIsYVtlXSk7cmV0dXJuIHRoaXN9cmV0dXJuKGI9PT0hMXx8ImZ1bmN0aW9uIj09dHlwZW9mIGIpJiYoYz1iLGI9dm9pZCAwKSxjPT09ITEmJihjPWJhKSx0aGlzLmVhY2goZnVuY3Rpb24oKXttLmV2ZW50LnJlbW92ZSh0aGlzLGEsYyxiKX0pfSx0cmlnZ2VyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20uZXZlbnQudHJpZ2dlcihhLGIsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzWzBdO3JldHVybiBjP20uZXZlbnQudHJpZ2dlcihhLGIsYywhMCk6dm9pZCAwfX0pO2Z1bmN0aW9uIGRhKGEpe3ZhciBiPWVhLnNwbGl0KCJ8IiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfXZhciBlYT0iYWJicnxhcnRpY2xlfGFzaWRlfGF1ZGlvfGJkaXxjYW52YXN8ZGF0YXxkYXRhbGlzdHxkZXRhaWxzfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnxoZWFkZXJ8aGdyb3VwfG1hcmt8bWV0ZXJ8bmF2fG91dHB1dHxwcm9ncmVzc3xzZWN0aW9ufHN1bW1hcnl8dGltZXx2aWRlbyIsZmE9LyBqUXVlcnlcZCs9Iig/Om51bGx8XGQrKSIvZyxnYT1uZXcgUmVnRXhwKCI8KD86IitlYSsiKVtcXHMvPl0iLCJpIiksaGE9L15ccysvLGlhPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vZ2ksamE9LzwoW1x3Ol0rKS8sa2E9Lzx0Ym9keS9pLGxhPS88fCYjP1x3KzsvLG1hPS88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksbmE9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksb2E9L14kfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLHBhPS9edHJ1ZVwvKC4qKS8scWE9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nLHJhPXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSxsZWdlbmQ6WzEsIjxmaWVsZHNldD4iLCI8L2ZpZWxkc2V0PiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0scGFyYW06WzEsIjxvYmplY3Q+IiwiPC9vYmplY3Q+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDprLmh0bWxTZXJpYWxpemU/WzAsIiIsIiJdOlsxLCJYPGRpdj4iLCI8L2Rpdj4iXX0sc2E9ZGEoeSksdGE9c2EuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSk7cmEub3B0Z3JvdXA9cmEub3B0aW9uLHJhLnRib2R5PXJhLnRmb290PXJhLmNvbGdyb3VwPXJhLmNhcHRpb249cmEudGhlYWQscmEudGg9cmEudGQ7ZnVuY3Rpb24gdWEoYSxiKXt2YXIgYyxkLGU9MCxmPXR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lIT09Sz9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKGJ8fCIqIik6dHlwZW9mIGEucXVlcnlTZWxlY3RvckFsbCE9PUs/YS5xdWVyeVNlbGVjdG9yQWxsKGJ8fCIqIik6dm9pZCAwO2lmKCFmKWZvcihmPVtdLGM9YS5jaGlsZE5vZGVzfHxhO251bGwhPShkPWNbZV0pO2UrKykhYnx8bS5ub2RlTmFtZShkLGIpP2YucHVzaChkKTptLm1lcmdlKGYsdWEoZCxiKSk7cmV0dXJuIHZvaWQgMD09PWJ8fGImJm0ubm9kZU5hbWUoYSxiKT9tLm1lcmdlKFthXSxmKTpmfWZ1bmN0aW9uIHZhKGEpe1cudGVzdChhLnR5cGUpJiYoYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWQpfWZ1bmN0aW9uIHdhKGEsYil7cmV0dXJuIG0ubm9kZU5hbWUoYSwidGFibGUiKSYmbS5ub2RlTmFtZSgxMSE9PWIubm9kZVR5cGU/YjpiLmZpcnN0Q2hpbGQsInRyIik/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6YX1mdW5jdGlvbiB4YShhKXtyZXR1cm4gYS50eXBlPShudWxsIT09bS5maW5kLmF0dHIoYSwidHlwZSIpKSsiLyIrYS50eXBlLGF9ZnVuY3Rpb24geWEoYSl7dmFyIGI9cGEuZXhlYyhhLnR5cGUpO3JldHVybiBiP2EudHlwZT1iWzFdOmEucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksYX1mdW5jdGlvbiB6YShhLGIpe2Zvcih2YXIgYyxkPTA7bnVsbCE9KGM9YVtkXSk7ZCsrKW0uX2RhdGEoYywiZ2xvYmFsRXZhbCIsIWJ8fG0uX2RhdGEoYltkXSwiZ2xvYmFsRXZhbCIpKX1mdW5jdGlvbiBBYShhLGIpe2lmKDE9PT1iLm5vZGVUeXBlJiZtLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxmPW0uX2RhdGEoYSksZz1tLl9kYXRhKGIsZiksaD1mLmV2ZW50cztpZihoKXtkZWxldGUgZy5oYW5kbGUsZy5ldmVudHM9e307Zm9yKGMgaW4gaClmb3IoZD0wLGU9aFtjXS5sZW5ndGg7ZT5kO2QrKyltLmV2ZW50LmFkZChiLGMsaFtjXVtkXSl9Zy5kYXRhJiYoZy5kYXRhPW0uZXh0ZW5kKHt9LGcuZGF0YSkpfX1mdW5jdGlvbiBCYShhLGIpe3ZhciBjLGQsZTtpZigxPT09Yi5ub2RlVHlwZSl7aWYoYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIWsubm9DbG9uZUV2ZW50JiZiW20uZXhwYW5kb10pe2U9bS5fZGF0YShiKTtmb3IoZCBpbiBlLmV2ZW50cyltLnJlbW92ZUV2ZW50KGIsZCxlLmhhbmRsZSk7Yi5yZW1vdmVBdHRyaWJ1dGUobS5leHBhbmRvKX0ic2NyaXB0Ij09PWMmJmIudGV4dCE9PWEudGV4dD8oeGEoYikudGV4dD1hLnRleHQseWEoYikpOiJvYmplY3QiPT09Yz8oYi5wYXJlbnROb2RlJiYoYi5vdXRlckhUTUw9YS5vdXRlckhUTUwpLGsuaHRtbDVDbG9uZSYmYS5pbm5lckhUTUwmJiFtLnRyaW0oYi5pbm5lckhUTUwpJiYoYi5pbm5lckhUTUw9YS5pbm5lckhUTUwpKToiaW5wdXQiPT09YyYmVy50ZXN0KGEudHlwZSk/KGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSkpOiJvcHRpb24iPT09Yz9iLmRlZmF1bHRTZWxlY3RlZD1iLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkOigiaW5wdXQiPT09Y3x8InRleHRhcmVhIj09PWMpJiYoYi5kZWZhdWx0VmFsdWU9YS5kZWZhdWx0VmFsdWUpfX1tLmV4dGVuZCh7Y2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaT1tLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKTtpZihrLmh0bWw1Q2xvbmV8fG0uaXNYTUxEb2MoYSl8fCFnYS50ZXN0KCI8IithLm5vZGVOYW1lKyI+Iik/Zj1hLmNsb25lTm9kZSghMCk6KHRhLmlubmVySFRNTD1hLm91dGVySFRNTCx0YS5yZW1vdmVDaGlsZChmPXRhLmZpcnN0Q2hpbGQpKSwhKGsubm9DbG9uZUV2ZW50JiZrLm5vQ2xvbmVDaGVja2VkfHwxIT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlfHxtLmlzWE1MRG9jKGEpKSlmb3IoZD11YShmKSxoPXVhKGEpLGc9MDtudWxsIT0oZT1oW2ddKTsrK2cpZFtnXSYmQmEoZSxkW2ddKTtpZihiKWlmKGMpZm9yKGg9aHx8dWEoYSksZD1kfHx1YShmKSxnPTA7bnVsbCE9KGU9aFtnXSk7ZysrKUFhKGUsZFtnXSk7ZWxzZSBBYShhLGYpO3JldHVybiBkPXVhKGYsInNjcmlwdCIpLGQubGVuZ3RoPjAmJnphKGQsIWkmJnVhKGEsInNjcmlwdCIpKSxkPWg9ZT1udWxsLGZ9LGJ1aWxkRnJhZ21lbnQ6ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlLGYsZyxoLGksaixsLG49YS5sZW5ndGgsbz1kYShiKSxwPVtdLHE9MDtuPnE7cSsrKWlmKGY9YVtxXSxmfHwwPT09ZilpZigib2JqZWN0Ij09PW0udHlwZShmKSltLm1lcmdlKHAsZi5ub2RlVHlwZT9bZl06Zik7ZWxzZSBpZihsYS50ZXN0KGYpKXtoPWh8fG8uYXBwZW5kQ2hpbGQoYi5jcmVhdGVFbGVtZW50KCJkaXYiKSksaT0oamEuZXhlYyhmKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSxsPXJhW2ldfHxyYS5fZGVmYXVsdCxoLmlubmVySFRNTD1sWzFdK2YucmVwbGFjZShpYSwiPCQxPjwvJDI+IikrbFsyXSxlPWxbMF07d2hpbGUoZS0tKWg9aC5sYXN0Q2hpbGQ7aWYoIWsubGVhZGluZ1doaXRlc3BhY2UmJmhhLnRlc3QoZikmJnAucHVzaChiLmNyZWF0ZVRleHROb2RlKGhhLmV4ZWMoZilbMF0pKSwhay50Ym9keSl7Zj0idGFibGUiIT09aXx8a2EudGVzdChmKT8iPHRhYmxlPiIhPT1sWzFdfHxrYS50ZXN0KGYpPzA6aDpoLmZpcnN0Q2hpbGQsZT1mJiZmLmNoaWxkTm9kZXMubGVuZ3RoO3doaWxlKGUtLSltLm5vZGVOYW1lKGo9Zi5jaGlsZE5vZGVzW2VdLCJ0Ym9keSIpJiYhai5jaGlsZE5vZGVzLmxlbmd0aCYmZi5yZW1vdmVDaGlsZChqKX1tLm1lcmdlKHAsaC5jaGlsZE5vZGVzKSxoLnRleHRDb250ZW50PSIiO3doaWxlKGguZmlyc3RDaGlsZCloLnJlbW92ZUNoaWxkKGguZmlyc3RDaGlsZCk7aD1vLmxhc3RDaGlsZH1lbHNlIHAucHVzaChiLmNyZWF0ZVRleHROb2RlKGYpKTtoJiZvLnJlbW92ZUNoaWxkKGgpLGsuYXBwZW5kQ2hlY2tlZHx8bS5ncmVwKHVhKHAsImlucHV0IiksdmEpLHE9MDt3aGlsZShmPXBbcSsrXSlpZigoIWR8fC0xPT09bS5pbkFycmF5KGYsZCkpJiYoZz1tLmNvbnRhaW5zKGYub3duZXJEb2N1bWVudCxmKSxoPXVhKG8uYXBwZW5kQ2hpbGQoZiksInNjcmlwdCIpLGcmJnphKGgpLGMpKXtlPTA7d2hpbGUoZj1oW2UrK10pb2EudGVzdChmLnR5cGV8fCIiKSYmYy5wdXNoKGYpfXJldHVybiBoPW51bGwsb30sY2xlYW5EYXRhOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkLGUsZixnLGg9MCxpPW0uZXhwYW5kbyxqPW0uY2FjaGUsbD1rLmRlbGV0ZUV4cGFuZG8sbj1tLmV2ZW50LnNwZWNpYWw7bnVsbCE9KGQ9YVtoXSk7aCsrKWlmKChifHxtLmFjY2VwdERhdGEoZCkpJiYoZj1kW2ldLGc9ZiYmaltmXSkpe2lmKGcuZXZlbnRzKWZvcihlIGluIGcuZXZlbnRzKW5bZV0/bS5ldmVudC5yZW1vdmUoZCxlKTptLnJlbW92ZUV2ZW50KGQsZSxnLmhhbmRsZSk7altmXSYmKGRlbGV0ZSBqW2ZdLGw/ZGVsZXRlIGRbaV06dHlwZW9mIGQucmVtb3ZlQXR0cmlidXRlIT09Sz9kLnJlbW92ZUF0dHJpYnV0ZShpKTpkW2ldPW51bGwsYy5wdXNoKGYpKX19fSksbS5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFYodGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT9tLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHx5KS5jcmVhdGVUZXh0Tm9kZShhKSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgYj13YSh0aGlzLGEpO2IuYXBwZW5kQ2hpbGQoYSl9fSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPXdhKHRoaXMsYSk7Yi5pbnNlcnRCZWZvcmUoYSxiLmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcy5uZXh0U2libGluZyl9KX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQ9YT9tLmZpbHRlcihhLHRoaXMpOnRoaXMsZT0wO251bGwhPShjPWRbZV0pO2UrKylifHwxIT09Yy5ub2RlVHlwZXx8bS5jbGVhbkRhdGEodWEoYykpLGMucGFyZW50Tm9kZSYmKGImJm0uY29udGFpbnMoYy5vd25lckRvY3VtZW50LGMpJiZ6YSh1YShjLCJzY3JpcHQiKSksYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpKTtyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGEsYj0wO251bGwhPShhPXRoaXNbYl0pO2IrKyl7MT09PWEubm9kZVR5cGUmJm0uY2xlYW5EYXRhKHVhKGEsITEpKTt3aGlsZShhLmZpcnN0Q2hpbGQpYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2Eub3B0aW9ucyYmbS5ub2RlTmFtZShhLCJzZWxlY3QiKSYmKGEub3B0aW9ucy5sZW5ndGg9MCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bnVsbD09YT8hMTphLGI9bnVsbD09Yj9hOmIsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gbS5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF18fHt9LGM9MCxkPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWEpcmV0dXJuIDE9PT1iLm5vZGVUeXBlP2IuaW5uZXJIVE1MLnJlcGxhY2UoZmEsIiIpOnZvaWQgMDtpZighKCJzdHJpbmciIT10eXBlb2YgYXx8bWEudGVzdChhKXx8IWsuaHRtbFNlcmlhbGl6ZSYmZ2EudGVzdChhKXx8IWsubGVhZGluZ1doaXRlc3BhY2UmJmhhLnRlc3QoYSl8fHJhWyhqYS5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSkpe2E9YS5yZXBsYWNlKGlhLCI8JDE+PC8kMj4iKTt0cnl7Zm9yKDtkPmM7YysrKWI9dGhpc1tjXXx8e30sMT09PWIubm9kZVR5cGUmJihtLmNsZWFuRGF0YSh1YShiLCExKSksYi5pbm5lckhUTUw9YSk7Yj0wfWNhdGNoKGUpe319YiYmdGhpcy5lbXB0eSgpLmFwcGVuZChhKX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBhPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYil7YT10aGlzLnBhcmVudE5vZGUsbS5jbGVhbkRhdGEodWEodGhpcykpLGEmJmEucmVwbGFjZUNoaWxkKGIsdGhpcyl9KSxhJiYoYS5sZW5ndGh8fGEubm9kZVR5cGUpP3RoaXM6dGhpcy5yZW1vdmUoKX0sZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhLCEwKX0sZG9tTWFuaXA6ZnVuY3Rpb24oYSxiKXthPWUuYXBwbHkoW10sYSk7dmFyIGMsZCxmLGcsaCxpLGo9MCxsPXRoaXMubGVuZ3RoLG49dGhpcyxvPWwtMSxwPWFbMF0scT1tLmlzRnVuY3Rpb24ocCk7aWYocXx8bD4xJiYic3RyaW5nIj09dHlwZW9mIHAmJiFrLmNoZWNrQ2xvbmUmJm5hLnRlc3QocCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXt2YXIgZD1uLmVxKGMpO3EmJihhWzBdPXAuY2FsbCh0aGlzLGMsZC5odG1sKCkpKSxkLmRvbU1hbmlwKGEsYil9KTtpZihsJiYoaT1tLmJ1aWxkRnJhZ21lbnQoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQsITEsdGhpcyksYz1pLmZpcnN0Q2hpbGQsMT09PWkuY2hpbGROb2Rlcy5sZW5ndGgmJihpPWMpLGMpKXtmb3IoZz1tLm1hcCh1YShpLCJzY3JpcHQiKSx4YSksZj1nLmxlbmd0aDtsPmo7aisrKWQ9aSxqIT09byYmKGQ9bS5jbG9uZShkLCEwLCEwKSxmJiZtLm1lcmdlKGcsdWEoZCwic2NyaXB0IikpKSxiLmNhbGwodGhpc1tqXSxkLGopO2lmKGYpZm9yKGg9Z1tnLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LG0ubWFwKGcseWEpLGo9MDtmPmo7aisrKWQ9Z1tqXSxvYS50ZXN0KGQudHlwZXx8IiIpJiYhbS5fZGF0YShkLCJnbG9iYWxFdmFsIikmJm0uY29udGFpbnMoaCxkKSYmKGQuc3JjP20uX2V2YWxVcmwmJm0uX2V2YWxVcmwoZC5zcmMpOm0uZ2xvYmFsRXZhbCgoZC50ZXh0fHxkLnRleHRDb250ZW50fHxkLmlubmVySFRNTHx8IiIpLnJlcGxhY2UocWEsIiIpKSk7aT1jPW51bGx9cmV0dXJuIHRoaXN9fSksbS5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oYSxiKXttLmZuW2FdPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYyxkPTAsZT1bXSxnPW0oYSksaD1nLmxlbmd0aC0xO2g+PWQ7ZCsrKWM9ZD09PWg/dGhpczp0aGlzLmNsb25lKCEwKSxtKGdbZF0pW2JdKGMpLGYuYXBwbHkoZSxjLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZSl9fSk7dmFyIENhLERhPXt9O2Z1bmN0aW9uIEVhKGIsYyl7dmFyIGQsZT1tKGMuY3JlYXRlRWxlbWVudChiKSkuYXBwZW5kVG8oYy5ib2R5KSxmPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUmJihkPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUoZVswXSkpP2QuZGlzcGxheTptLmNzcyhlWzBdLCJkaXNwbGF5Iik7cmV0dXJuIGUuZGV0YWNoKCksZn1mdW5jdGlvbiBGYShhKXt2YXIgYj15LGM9RGFbYV07cmV0dXJuIGN8fChjPUVhKGEsYiksIm5vbmUiIT09YyYmY3x8KENhPShDYXx8bSgiPGlmcmFtZSBmcmFtZWJvcmRlcj0nMCcgd2lkdGg9JzAnIGhlaWdodD0nMCcvPiIpKS5hcHBlbmRUbyhiLmRvY3VtZW50RWxlbWVudCksYj0oQ2FbMF0uY29udGVudFdpbmRvd3x8Q2FbMF0uY29udGVudERvY3VtZW50KS5kb2N1bWVudCxiLndyaXRlKCksYi5jbG9zZSgpLGM9RWEoYSxiKSxDYS5kZXRhY2goKSksRGFbYV09YyksY30hZnVuY3Rpb24oKXt2YXIgYTtrLnNocmlua1dyYXBCbG9ja3M9ZnVuY3Rpb24oKXtpZihudWxsIT1hKXJldHVybiBhO2E9ITE7dmFyIGIsYyxkO3JldHVybiBjPXkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlPyhiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksZD15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHgiLGMuYXBwZW5kQ2hpbGQoZCkuYXBwZW5kQ2hpbGQoYiksdHlwZW9mIGIuc3R5bGUuem9vbSE9PUsmJihiLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjEiLGIuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSkuc3R5bGUud2lkdGg9IjVweCIsYT0zIT09Yi5vZmZzZXRXaWR0aCksYy5yZW1vdmVDaGlsZChkKSxhKTp2b2lkIDB9fSgpO3ZhciBHYT0vXm1hcmdpbi8sSGE9bmV3IFJlZ0V4cCgiXigiK1MrIikoPyFweClbYS16JV0rJCIsImkiKSxJYSxKYSxLYT0vXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC87YS5nZXRDb21wdXRlZFN0eWxlPyhJYT1mdW5jdGlvbihiKXtyZXR1cm4gYi5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Lm9wZW5lcj9iLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmEuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpfSxKYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLnN0eWxlO3JldHVybiBjPWN8fElhKGEpLGc9Yz9jLmdldFByb3BlcnR5VmFsdWUoYil8fGNbYl06dm9pZCAwLGMmJigiIiE9PWd8fG0uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfHwoZz1tLnN0eWxlKGEsYikpLEhhLnRlc3QoZykmJkdhLnRlc3QoYikmJihkPWgud2lkdGgsZT1oLm1pbldpZHRoLGY9aC5tYXhXaWR0aCxoLm1pbldpZHRoPWgubWF4V2lkdGg9aC53aWR0aD1nLGc9Yy53aWR0aCxoLndpZHRoPWQsaC5taW5XaWR0aD1lLGgubWF4V2lkdGg9ZikpLHZvaWQgMD09PWc/ZzpnKyIifSk6eS5kb2N1bWVudEVsZW1lbnQuY3VycmVudFN0eWxlJiYoSWE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY3VycmVudFN0eWxlfSxKYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLnN0eWxlO3JldHVybiBjPWN8fElhKGEpLGc9Yz9jW2JdOnZvaWQgMCxudWxsPT1nJiZoJiZoW2JdJiYoZz1oW2JdKSxIYS50ZXN0KGcpJiYhS2EudGVzdChiKSYmKGQ9aC5sZWZ0LGU9YS5ydW50aW1lU3R5bGUsZj1lJiZlLmxlZnQsZiYmKGUubGVmdD1hLmN1cnJlbnRTdHlsZS5sZWZ0KSxoLmxlZnQ9ImZvbnRTaXplIj09PWI/IjFlbSI6ZyxnPWgucGl4ZWxMZWZ0KyJweCIsaC5sZWZ0PWQsZiYmKGUubGVmdD1mKSksdm9pZCAwPT09Zz9nOmcrIiJ8fCJhdXRvIn0pO2Z1bmN0aW9uIExhKGEsYil7cmV0dXJue2dldDpmdW5jdGlvbigpe3ZhciBjPWEoKTtpZihudWxsIT1jKXJldHVybiBjP3ZvaWQgZGVsZXRlIHRoaXMuZ2V0Oih0aGlzLmdldD1iKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX0hZnVuY3Rpb24oKXt2YXIgYixjLGQsZSxmLGcsaDtpZihiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYi5pbm5lckhUTUw9IiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF0sYz1kJiZkLnN0eWxlKXtjLmNzc1RleHQ9ImZsb2F0OmxlZnQ7b3BhY2l0eTouNSIsay5vcGFjaXR5PSIwLjUiPT09Yy5vcGFjaXR5LGsuY3NzRmxvYXQ9ISFjLmNzc0Zsb2F0LGIuc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixiLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIsay5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWIuc3R5bGUuYmFja2dyb3VuZENsaXAsay5ib3hTaXppbmc9IiI9PT1jLmJveFNpemluZ3x8IiI9PT1jLk1vekJveFNpemluZ3x8IiI9PT1jLldlYmtpdEJveFNpemluZyxtLmV4dGVuZChrLHtyZWxpYWJsZUhpZGRlbk9mZnNldHM6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09ZyYmaSgpLGd9LGJveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWYmJmkoKSxmfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWUmJmkoKSxlfSxyZWxpYWJsZU1hcmdpblJpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWgmJmkoKSxofX0pO2Z1bmN0aW9uIGkoKXt2YXIgYixjLGQsaTtjPXkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlJiYoYj15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9eS5jcmVhdGVFbGVtZW50KCJkaXYiKSxkLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2JvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7dG9wOjA7bGVmdDotOTk5OXB4IixjLmFwcGVuZENoaWxkKGQpLmFwcGVuZENoaWxkKGIpLGIuc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDoxJTt0b3A6MSU7Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo0cHg7cG9zaXRpb246YWJzb2x1dGUiLGU9Zj0hMSxoPSEwLGEuZ2V0Q29tcHV0ZWRTdHlsZSYmKGU9IjElIiE9PShhLmdldENvbXB1dGVkU3R5bGUoYixudWxsKXx8e30pLnRvcCxmPSI0cHgiPT09KGEuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpfHx7d2lkdGg6IjRweCJ9KS53aWR0aCxpPWIuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSksaS5zdHlsZS5jc3NUZXh0PWIuc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowIixpLnN0eWxlLm1hcmdpblJpZ2h0PWkuc3R5bGUud2lkdGg9IjAiLGIuc3R5bGUud2lkdGg9IjFweCIsaD0hcGFyc2VGbG9hdCgoYS5nZXRDb21wdXRlZFN0eWxlKGksbnVsbCl8fHt9KS5tYXJnaW5SaWdodCksYi5yZW1vdmVDaGlsZChpKSksYi5pbm5lckhUTUw9Ijx0YWJsZT48dHI+PHRkPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLGk9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxpWzBdLnN0eWxlLmNzc1RleHQ9Im1hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtkaXNwbGF5Om5vbmUiLGc9MD09PWlbMF0ub2Zmc2V0SGVpZ2h0LGcmJihpWzBdLnN0eWxlLmRpc3BsYXk9IiIsaVsxXS5zdHlsZS5kaXNwbGF5PSJub25lIixnPTA9PT1pWzBdLm9mZnNldEhlaWdodCksYy5yZW1vdmVDaGlsZChkKSl9fX0oKSxtLnN3YXA9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnPXt9O2ZvcihmIGluIGIpZ1tmXT1hLnN0eWxlW2ZdLGEuc3R5bGVbZl09YltmXTtlPWMuYXBwbHkoYSxkfHxbXSk7Zm9yKGYgaW4gYilhLnN0eWxlW2ZdPWdbZl07cmV0dXJuIGV9O3ZhciBNYT0vYWxwaGFcKFteKV0qXCkvaSxOYT0vb3BhY2l0eVxzKj1ccyooW14pXSopLyxPYT0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sUGE9bmV3IFJlZ0V4cCgiXigiK1MrIikoLiopJCIsImkiKSxRYT1uZXcgUmVnRXhwKCJeKFsrLV0pPSgiK1MrIikiLCJpIiksUmE9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LFNhPXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifSxUYT1bIldlYmtpdCIsIk8iLCJNb3oiLCJtcyJdO2Z1bmN0aW9uIFVhKGEsYil7aWYoYiBpbiBhKXJldHVybiBiO3ZhciBjPWIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKSxkPWIsZT1UYS5sZW5ndGg7d2hpbGUoZS0tKWlmKGI9VGFbZV0rYyxiIGluIGEpcmV0dXJuIGI7cmV0dXJuIGR9ZnVuY3Rpb24gVmEoYSxiKXtmb3IodmFyIGMsZCxlLGY9W10sZz0wLGg9YS5sZW5ndGg7aD5nO2crKylkPWFbZ10sZC5zdHlsZSYmKGZbZ109bS5fZGF0YShkLCJvbGRkaXNwbGF5IiksYz1kLnN0eWxlLmRpc3BsYXksYj8oZltnXXx8Im5vbmUiIT09Y3x8KGQuc3R5bGUuZGlzcGxheT0iIiksIiI9PT1kLnN0eWxlLmRpc3BsYXkmJlUoZCkmJihmW2ddPW0uX2RhdGEoZCwib2xkZGlzcGxheSIsRmEoZC5ub2RlTmFtZSkpKSk6KGU9VShkKSwoYyYmIm5vbmUiIT09Y3x8IWUpJiZtLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGU/YzptLmNzcyhkLCJkaXNwbGF5IikpKSk7Zm9yKGc9MDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoYiYmIm5vbmUiIT09ZC5zdHlsZS5kaXNwbGF5JiYiIiE9PWQuc3R5bGUuZGlzcGxheXx8KGQuc3R5bGUuZGlzcGxheT1iP2ZbZ118fCIiOiJub25lIikpO3JldHVybiBhfWZ1bmN0aW9uIFdhKGEsYixjKXt2YXIgZD1QYS5leGVjKGIpO3JldHVybiBkP01hdGgubWF4KDAsZFsxXS0oY3x8MCkpKyhkWzJdfHwicHgiKTpifWZ1bmN0aW9uIFhhKGEsYixjLGQsZSl7Zm9yKHZhciBmPWM9PT0oZD8iYm9yZGVyIjoiY29udGVudCIpPzQ6IndpZHRoIj09PWI/MTowLGc9MDs0PmY7Zis9MikibWFyZ2luIj09PWMmJihnKz1tLmNzcyhhLGMrVFtmXSwhMCxlKSksZD8oImNvbnRlbnQiPT09YyYmKGctPW0uY3NzKGEsInBhZGRpbmciK1RbZl0sITAsZSkpLCJtYXJnaW4iIT09YyYmKGctPW0uY3NzKGEsImJvcmRlciIrVFtmXSsiV2lkdGgiLCEwLGUpKSk6KGcrPW0uY3NzKGEsInBhZGRpbmciK1RbZl0sITAsZSksInBhZGRpbmciIT09YyYmKGcrPW0uY3NzKGEsImJvcmRlciIrVFtmXSsiV2lkdGgiLCEwLGUpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gWWEoYSxiLGMpe3ZhciBkPSEwLGU9IndpZHRoIj09PWI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxmPUlhKGEpLGc9ay5ib3hTaXppbmcmJiJib3JkZXItYm94Ij09PW0uY3NzKGEsImJveFNpemluZyIsITEsZik7aWYoMD49ZXx8bnVsbD09ZSl7aWYoZT1KYShhLGIsZiksKDA+ZXx8bnVsbD09ZSkmJihlPWEuc3R5bGVbYl0pLEhhLnRlc3QoZSkpcmV0dXJuIGU7ZD1nJiYoay5ib3hTaXppbmdSZWxpYWJsZSgpfHxlPT09YS5zdHlsZVtiXSksZT1wYXJzZUZsb2F0KGUpfHwwfXJldHVybiBlK1hhKGEsYixjfHwoZz8iYm9yZGVyIjoiY29udGVudCIpLGQsZikrInB4In1tLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPUphKGEsIm9wYWNpdHkiKTtyZXR1cm4iIj09PWM/IjEiOmN9fX19LGNzc051bWJlcjp7Y29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6ay5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYSYmMyE9PWEubm9kZVR5cGUmJjghPT1hLm5vZGVUeXBlJiZhLnN0eWxlKXt2YXIgZSxmLGcsaD1tLmNhbWVsQ2FzZShiKSxpPWEuc3R5bGU7aWYoYj1tLmNzc1Byb3BzW2hdfHwobS5jc3NQcm9wc1toXT1VYShpLGgpKSxnPW0uY3NzSG9va3NbYl18fG0uY3NzSG9va3NbaF0sdm9pZCAwPT09YylyZXR1cm4gZyYmImdldCJpbiBnJiZ2b2lkIDAhPT0oZT1nLmdldChhLCExLGQpKT9lOmlbYl07aWYoZj10eXBlb2YgYywic3RyaW5nIj09PWYmJihlPVFhLmV4ZWMoYykpJiYoYz0oZVsxXSsxKSplWzJdK3BhcnNlRmxvYXQobS5jc3MoYSxiKSksZj0ibnVtYmVyIiksbnVsbCE9YyYmYz09PWMmJigibnVtYmVyIiE9PWZ8fG0uY3NzTnVtYmVyW2hdfHwoYys9InB4Iiksay5jbGVhckNsb25lU3R5bGV8fCIiIT09Y3x8MCE9PWIuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoaVtiXT0iaW5oZXJpdCIpLCEoZyYmInNldCJpbiBnJiZ2b2lkIDA9PT0oYz1nLnNldChhLGMsZCkpKSkpdHJ5e2lbYl09Y31jYXRjaChqKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoPW0uY2FtZWxDYXNlKGIpO3JldHVybiBiPW0uY3NzUHJvcHNbaF18fChtLmNzc1Byb3BzW2hdPVVhKGEuc3R5bGUsaCkpLGc9bS5jc3NIb29rc1tiXXx8bS5jc3NIb29rc1toXSxnJiYiZ2V0ImluIGcmJihmPWcuZ2V0KGEsITAsYykpLHZvaWQgMD09PWYmJihmPUphKGEsYixkKSksIm5vcm1hbCI9PT1mJiZiIGluIFNhJiYoZj1TYVtiXSksIiI9PT1jfHxjPyhlPXBhcnNlRmxvYXQoZiksYz09PSEwfHxtLmlzTnVtZXJpYyhlKT9lfHwwOmYpOmZ9fSksbS5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYl09e2dldDpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGM/T2EudGVzdChtLmNzcyhhLCJkaXNwbGF5IikpJiYwPT09YS5vZmZzZXRXaWR0aD9tLnN3YXAoYSxSYSxmdW5jdGlvbigpe3JldHVybiBZYShhLGIsZCl9KTpZYShhLGIsZCk6dm9pZCAwfSxzZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWQmJklhKGEpO3JldHVybiBXYShhLGMsZD9YYShhLGIsZCxrLmJveFNpemluZyYmImJvcmRlci1ib3giPT09bS5jc3MoYSwiYm94U2l6aW5nIiwhMSxlKSxlKTowKX19fSksay5vcGFjaXR5fHwobS5jc3NIb29rcy5vcGFjaXR5PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gTmEudGVzdCgoYiYmYS5jdXJyZW50U3R5bGU/YS5jdXJyZW50U3R5bGUuZmlsdGVyOmEuc3R5bGUuZmlsdGVyKXx8IiIpPy4wMSpwYXJzZUZsb2F0KFJlZ0V4cC4kMSkrIiI6Yj8iMSI6IiJ9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc3R5bGUsZD1hLmN1cnJlbnRTdHlsZSxlPW0uaXNOdW1lcmljKGIpPyJhbHBoYShvcGFjaXR5PSIrMTAwKmIrIikiOiIiLGY9ZCYmZC5maWx0ZXJ8fGMuZmlsdGVyfHwiIjtjLnpvb209MSwoYj49MXx8IiI9PT1iKSYmIiI9PT1tLnRyaW0oZi5yZXBsYWNlKE1hLCIiKSkmJmMucmVtb3ZlQXR0cmlidXRlJiYoYy5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpLCIiPT09Ynx8ZCYmIWQuZmlsdGVyKXx8KGMuZmlsdGVyPU1hLnRlc3QoZik/Zi5yZXBsYWNlKE1hLGUpOmYrIiAiK2UpfX0pLG0uY3NzSG9va3MubWFyZ2luUmlnaHQ9TGEoay5yZWxpYWJsZU1hcmdpblJpZ2h0LGZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/bS5zd2FwKGEse2Rpc3BsYXk6ImlubGluZS1ibG9jayJ9LEphLFthLCJtYXJnaW5SaWdodCJdKTp2b2lkIDB9KSxtLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYStiXT17ZXhwYW5kOmZ1bmN0aW9uKGMpe2Zvcih2YXIgZD0wLGU9e30sZj0ic3RyaW5nIj09dHlwZW9mIGM/Yy5zcGxpdCgiICIpOltjXTs0PmQ7ZCsrKWVbYStUW2RdK2JdPWZbZF18fGZbZC0yXXx8ZlswXTtyZXR1cm4gZX19LEdhLnRlc3QoYSl8fChtLmNzc0hvb2tzW2ErYl0uc2V0PVdhKX0pLG0uZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY9e30sZz0wO2lmKG0uaXNBcnJheShiKSl7Zm9yKGQ9SWEoYSksZT1iLmxlbmd0aDtlPmc7ZysrKWZbYltnXV09bS5jc3MoYSxiW2ddLCExLGQpO3JldHVybiBmfXJldHVybiB2b2lkIDAhPT1jP20uc3R5bGUoYSxiLGMpOm0uY3NzKGEsYil9LGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIFZhKHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIFZhKHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24oYSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgYT9hP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe1UodGhpcyk/bSh0aGlzKS5zaG93KCk6bSh0aGlzKS5oaWRlKCl9KX19KTtmdW5jdGlvbiBaYShhLGIsYyxkLGUpew0KcmV0dXJuIG5ldyBaYS5wcm90b3R5cGUuaW5pdChhLGIsYyxkLGUpfW0uVHdlZW49WmEsWmEucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpaYSxpbml0OmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt0aGlzLmVsZW09YSx0aGlzLnByb3A9Yyx0aGlzLmVhc2luZz1lfHwic3dpbmciLHRoaXMub3B0aW9ucz1iLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1kLHRoaXMudW5pdD1mfHwobS5jc3NOdW1iZXJbY10/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBhPVphLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBhJiZhLmdldD9hLmdldCh0aGlzKTpaYS5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oYSl7dmFyIGIsYz1aYS5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPWI9bS5lYXNpbmdbdGhpcy5lYXNpbmddKGEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmEsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9Yj1hLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSpiK3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLGMmJmMuc2V0P2Muc2V0KHRoaXMpOlphLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LFphLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT1aYS5wcm90b3R5cGUsWmEucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiBudWxsPT1hLmVsZW1bYS5wcm9wXXx8YS5lbGVtLnN0eWxlJiZudWxsIT1hLmVsZW0uc3R5bGVbYS5wcm9wXT8oYj1tLmNzcyhhLmVsZW0sYS5wcm9wLCIiKSxiJiYiYXV0byIhPT1iP2I6MCk6YS5lbGVtW2EucHJvcF19LHNldDpmdW5jdGlvbihhKXttLmZ4LnN0ZXBbYS5wcm9wXT9tLmZ4LnN0ZXBbYS5wcm9wXShhKTphLmVsZW0uc3R5bGUmJihudWxsIT1hLmVsZW0uc3R5bGVbbS5jc3NQcm9wc1thLnByb3BdXXx8bS5jc3NIb29rc1thLnByb3BdKT9tLnN0eWxlKGEuZWxlbSxhLnByb3AsYS5ub3crYS51bml0KTphLmVsZW1bYS5wcm9wXT1hLm5vd319fSxaYS5wcm9wSG9va3Muc2Nyb2xsVG9wPVphLnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oYSl7YS5lbGVtLm5vZGVUeXBlJiZhLmVsZW0ucGFyZW50Tm9kZSYmKGEuZWxlbVthLnByb3BdPWEubm93KX19LG0uZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LHN3aW5nOmZ1bmN0aW9uKGEpe3JldHVybi41LU1hdGguY29zKGEqTWF0aC5QSSkvMn19LG0uZng9WmEucHJvdG90eXBlLmluaXQsbS5meC5zdGVwPXt9O3ZhciAkYSxfYSxhYj0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sYmI9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK1MrIikoW2EteiVdKikkIiwiaSIpLGNiPS9xdWV1ZUhvb2tzJC8sZGI9W2liXSxlYj17IioiOltmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuY3JlYXRlVHdlZW4oYSxiKSxkPWMuY3VyKCksZT1iYi5leGVjKGIpLGY9ZSYmZVszXXx8KG0uY3NzTnVtYmVyW2FdPyIiOiJweCIpLGc9KG0uY3NzTnVtYmVyW2FdfHwicHgiIT09ZiYmK2QpJiZiYi5leGVjKG0uY3NzKGMuZWxlbSxhKSksaD0xLGk9MjA7aWYoZyYmZ1szXSE9PWYpe2Y9Znx8Z1szXSxlPWV8fFtdLGc9K2R8fDE7ZG8gaD1ofHwiLjUiLGcvPWgsbS5zdHlsZShjLmVsZW0sYSxnK2YpO3doaWxlKGghPT0oaD1jLmN1cigpL2QpJiYxIT09aCYmLS1pKX1yZXR1cm4gZSYmKGc9Yy5zdGFydD0rZ3x8K2R8fDAsYy51bml0PWYsYy5lbmQ9ZVsxXT9nKyhlWzFdKzEpKmVbMl06K2VbMl0pLGN9XX07ZnVuY3Rpb24gZmIoKXtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpeyRhPXZvaWQgMH0pLCRhPW0ubm93KCl9ZnVuY3Rpb24gZ2IoYSxiKXt2YXIgYyxkPXtoZWlnaHQ6YX0sZT0wO2ZvcihiPWI/MTowOzQ+ZTtlKz0yLWIpYz1UW2VdLGRbIm1hcmdpbiIrY109ZFsicGFkZGluZyIrY109YTtyZXR1cm4gYiYmKGQub3BhY2l0eT1kLndpZHRoPWEpLGR9ZnVuY3Rpb24gaGIoYSxiLGMpe2Zvcih2YXIgZCxlPShlYltiXXx8W10pLmNvbmNhdChlYlsiKiJdKSxmPTAsZz1lLmxlbmd0aDtnPmY7ZisrKWlmKGQ9ZVtmXS5jYWxsKGMsYixhKSlyZXR1cm4gZH1mdW5jdGlvbiBpYihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpLGosbCxuPXRoaXMsbz17fSxwPWEuc3R5bGUscT1hLm5vZGVUeXBlJiZVKGEpLHI9bS5fZGF0YShhLCJmeHNob3ciKTtjLnF1ZXVlfHwoaD1tLl9xdWV1ZUhvb2tzKGEsImZ4IiksbnVsbD09aC51bnF1ZXVlZCYmKGgudW5xdWV1ZWQ9MCxpPWguZW1wdHkuZmlyZSxoLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXtoLnVucXVldWVkfHxpKCl9KSxoLnVucXVldWVkKyssbi5hbHdheXMoZnVuY3Rpb24oKXtuLmFsd2F5cyhmdW5jdGlvbigpe2gudW5xdWV1ZWQtLSxtLnF1ZXVlKGEsImZ4IikubGVuZ3RofHxoLmVtcHR5LmZpcmUoKX0pfSkpLDE9PT1hLm5vZGVUeXBlJiYoImhlaWdodCJpbiBifHwid2lkdGgiaW4gYikmJihjLm92ZXJmbG93PVtwLm92ZXJmbG93LHAub3ZlcmZsb3dYLHAub3ZlcmZsb3dZXSxqPW0uY3NzKGEsImRpc3BsYXkiKSxsPSJub25lIj09PWo/bS5fZGF0YShhLCJvbGRkaXNwbGF5Iil8fEZhKGEubm9kZU5hbWUpOmosImlubGluZSI9PT1sJiYibm9uZSI9PT1tLmNzcyhhLCJmbG9hdCIpJiYoay5pbmxpbmVCbG9ja05lZWRzTGF5b3V0JiYiaW5saW5lIiE9PUZhKGEubm9kZU5hbWUpP3Auem9vbT0xOnAuZGlzcGxheT0iaW5saW5lLWJsb2NrIikpLGMub3ZlcmZsb3cmJihwLm92ZXJmbG93PSJoaWRkZW4iLGsuc2hyaW5rV3JhcEJsb2NrcygpfHxuLmFsd2F5cyhmdW5jdGlvbigpe3Aub3ZlcmZsb3c9Yy5vdmVyZmxvd1swXSxwLm92ZXJmbG93WD1jLm92ZXJmbG93WzFdLHAub3ZlcmZsb3dZPWMub3ZlcmZsb3dbMl19KSk7Zm9yKGQgaW4gYilpZihlPWJbZF0sYWIuZXhlYyhlKSl7aWYoZGVsZXRlIGJbZF0sZj1mfHwidG9nZ2xlIj09PWUsZT09PShxPyJoaWRlIjoic2hvdyIpKXtpZigic2hvdyIhPT1lfHwhcnx8dm9pZCAwPT09cltkXSljb250aW51ZTtxPSEwfW9bZF09ciYmcltkXXx8bS5zdHlsZShhLGQpfWVsc2Ugaj12b2lkIDA7aWYobS5pc0VtcHR5T2JqZWN0KG8pKSJpbmxpbmUiPT09KCJub25lIj09PWo/RmEoYS5ub2RlTmFtZSk6aikmJihwLmRpc3BsYXk9aik7ZWxzZXtyPyJoaWRkZW4iaW4gciYmKHE9ci5oaWRkZW4pOnI9bS5fZGF0YShhLCJmeHNob3ciLHt9KSxmJiYoci5oaWRkZW49IXEpLHE/bShhKS5zaG93KCk6bi5kb25lKGZ1bmN0aW9uKCl7bShhKS5oaWRlKCl9KSxuLmRvbmUoZnVuY3Rpb24oKXt2YXIgYjttLl9yZW1vdmVEYXRhKGEsImZ4c2hvdyIpO2ZvcihiIGluIG8pbS5zdHlsZShhLGIsb1tiXSl9KTtmb3IoZCBpbiBvKWc9aGIocT9yW2RdOjAsZCxuKSxkIGluIHJ8fChyW2RdPWcuc3RhcnQscSYmKGcuZW5kPWcuc3RhcnQsZy5zdGFydD0id2lkdGgiPT09ZHx8ImhlaWdodCI9PT1kPzE6MCkpfX1mdW5jdGlvbiBqYihhLGIpe3ZhciBjLGQsZSxmLGc7Zm9yKGMgaW4gYSlpZihkPW0uY2FtZWxDYXNlKGMpLGU9YltkXSxmPWFbY10sbS5pc0FycmF5KGYpJiYoZT1mWzFdLGY9YVtjXT1mWzBdKSxjIT09ZCYmKGFbZF09ZixkZWxldGUgYVtjXSksZz1tLmNzc0hvb2tzW2RdLGcmJiJleHBhbmQiaW4gZyl7Zj1nLmV4cGFuZChmKSxkZWxldGUgYVtkXTtmb3IoYyBpbiBmKWMgaW4gYXx8KGFbY109ZltjXSxiW2NdPWUpfWVsc2UgYltkXT1lfWZ1bmN0aW9uIGtiKGEsYixjKXt2YXIgZCxlLGY9MCxnPWRiLmxlbmd0aCxoPW0uRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgaS5lbGVtfSksaT1mdW5jdGlvbigpe2lmKGUpcmV0dXJuITE7Zm9yKHZhciBiPSRhfHxmYigpLGM9TWF0aC5tYXgoMCxqLnN0YXJ0VGltZStqLmR1cmF0aW9uLWIpLGQ9Yy9qLmR1cmF0aW9ufHwwLGY9MS1kLGc9MCxpPWoudHdlZW5zLmxlbmd0aDtpPmc7ZysrKWoudHdlZW5zW2ddLnJ1bihmKTtyZXR1cm4gaC5ub3RpZnlXaXRoKGEsW2osZixjXSksMT5mJiZpP2M6KGgucmVzb2x2ZVdpdGgoYSxbal0pLCExKX0saj1oLnByb21pc2Uoe2VsZW06YSxwcm9wczptLmV4dGVuZCh7fSxiKSxvcHRzOm0uZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9fSxjKSxvcmlnaW5hbFByb3BlcnRpZXM6YixvcmlnaW5hbE9wdGlvbnM6YyxzdGFydFRpbWU6JGF8fGZiKCksZHVyYXRpb246Yy5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24oYixjKXt2YXIgZD1tLlR3ZWVuKGEsai5vcHRzLGIsYyxqLm9wdHMuc3BlY2lhbEVhc2luZ1tiXXx8ai5vcHRzLmVhc2luZyk7cmV0dXJuIGoudHdlZW5zLnB1c2goZCksZH0sc3RvcDpmdW5jdGlvbihiKXt2YXIgYz0wLGQ9Yj9qLnR3ZWVucy5sZW5ndGg6MDtpZihlKXJldHVybiB0aGlzO2ZvcihlPSEwO2Q+YztjKyspai50d2VlbnNbY10ucnVuKDEpO3JldHVybiBiP2gucmVzb2x2ZVdpdGgoYSxbaixiXSk6aC5yZWplY3RXaXRoKGEsW2osYl0pLHRoaXN9fSksaz1qLnByb3BzO2ZvcihqYihrLGoub3B0cy5zcGVjaWFsRWFzaW5nKTtnPmY7ZisrKWlmKGQ9ZGJbZl0uY2FsbChqLGEsayxqLm9wdHMpKXJldHVybiBkO3JldHVybiBtLm1hcChrLGhiLGopLG0uaXNGdW5jdGlvbihqLm9wdHMuc3RhcnQpJiZqLm9wdHMuc3RhcnQuY2FsbChhLGopLG0uZngudGltZXIobS5leHRlbmQoaSx7ZWxlbTphLGFuaW06aixxdWV1ZTpqLm9wdHMucXVldWV9KSksai5wcm9ncmVzcyhqLm9wdHMucHJvZ3Jlc3MpLmRvbmUoai5vcHRzLmRvbmUsai5vcHRzLmNvbXBsZXRlKS5mYWlsKGoub3B0cy5mYWlsKS5hbHdheXMoai5vcHRzLmFsd2F5cyl9bS5BbmltYXRpb249bS5leHRlbmQoa2Ise3R3ZWVuZXI6ZnVuY3Rpb24oYSxiKXttLmlzRnVuY3Rpb24oYSk/KGI9YSxhPVsiKiJdKTphPWEuc3BsaXQoIiAiKTtmb3IodmFyIGMsZD0wLGU9YS5sZW5ndGg7ZT5kO2QrKyljPWFbZF0sZWJbY109ZWJbY118fFtdLGViW2NdLnVuc2hpZnQoYil9LHByZWZpbHRlcjpmdW5jdGlvbihhLGIpe2I/ZGIudW5zaGlmdChhKTpkYi5wdXNoKGEpfX0pLG0uc3BlZWQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEmJiJvYmplY3QiPT10eXBlb2YgYT9tLmV4dGVuZCh7fSxhKTp7Y29tcGxldGU6Y3x8IWMmJmJ8fG0uaXNGdW5jdGlvbihhKSYmYSxkdXJhdGlvbjphLGVhc2luZzpjJiZifHxiJiYhbS5pc0Z1bmN0aW9uKGIpJiZifTtyZXR1cm4gZC5kdXJhdGlvbj1tLmZ4Lm9mZj8wOiJudW1iZXIiPT10eXBlb2YgZC5kdXJhdGlvbj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gbS5meC5zcGVlZHM/bS5meC5zcGVlZHNbZC5kdXJhdGlvbl06bS5meC5zcGVlZHMuX2RlZmF1bHQsKG51bGw9PWQucXVldWV8fGQucXVldWU9PT0hMCkmJihkLnF1ZXVlPSJmeCIpLGQub2xkPWQuY29tcGxldGUsZC5jb21wbGV0ZT1mdW5jdGlvbigpe20uaXNGdW5jdGlvbihkLm9sZCkmJmQub2xkLmNhbGwodGhpcyksZC5xdWV1ZSYmbS5kZXF1ZXVlKHRoaXMsZC5xdWV1ZSl9LGR9LG0uZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMuZmlsdGVyKFUpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxjLGQpfSxhbmltYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPW0uaXNFbXB0eU9iamVjdChhKSxmPW0uc3BlZWQoYixjLGQpLGc9ZnVuY3Rpb24oKXt2YXIgYj1rYih0aGlzLG0uZXh0ZW5kKHt9LGEpLGYpOyhlfHxtLl9kYXRhKHRoaXMsImZpbmlzaCIpKSYmYi5zdG9wKCEwKX07cmV0dXJuIGcuZmluaXNoPWcsZXx8Zi5xdWV1ZT09PSExP3RoaXMuZWFjaChnKTp0aGlzLnF1ZXVlKGYucXVldWUsZyl9LHN0b3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuc3RvcDtkZWxldGUgYS5zdG9wLGIoYyl9O3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGM9YixiPWEsYT12b2lkIDApLGImJmEhPT0hMSYmdGhpcy5xdWV1ZShhfHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj0hMCxlPW51bGwhPWEmJmErInF1ZXVlSG9va3MiLGY9bS50aW1lcnMsZz1tLl9kYXRhKHRoaXMpO2lmKGUpZ1tlXSYmZ1tlXS5zdG9wJiZkKGdbZV0pO2Vsc2UgZm9yKGUgaW4gZylnW2VdJiZnW2VdLnN0b3AmJmNiLnRlc3QoZSkmJmQoZ1tlXSk7Zm9yKGU9Zi5sZW5ndGg7ZS0tOylmW2VdLmVsZW0hPT10aGlzfHxudWxsIT1hJiZmW2VdLnF1ZXVlIT09YXx8KGZbZV0uYW5pbS5zdG9wKGMpLGI9ITEsZi5zcGxpY2UoZSwxKSk7KGJ8fCFjKSYmbS5kZXF1ZXVlKHRoaXMsYSl9KX0sZmluaXNoOmZ1bmN0aW9uKGEpe3JldHVybiBhIT09ITEmJihhPWF8fCJmeCIpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiLGM9bS5fZGF0YSh0aGlzKSxkPWNbYSsicXVldWUiXSxlPWNbYSsicXVldWVIb29rcyJdLGY9bS50aW1lcnMsZz1kP2QubGVuZ3RoOjA7Zm9yKGMuZmluaXNoPSEwLG0ucXVldWUodGhpcyxhLFtdKSxlJiZlLnN0b3AmJmUuc3RvcC5jYWxsKHRoaXMsITApLGI9Zi5sZW5ndGg7Yi0tOylmW2JdLmVsZW09PT10aGlzJiZmW2JdLnF1ZXVlPT09YSYmKGZbYl0uYW5pbS5zdG9wKCEwKSxmLnNwbGljZShiLDEpKTtmb3IoYj0wO2c+YjtiKyspZFtiXSYmZFtiXS5maW5pc2gmJmRbYl0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIGMuZmluaXNofSl9fSksbS5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihhLGIpe3ZhciBjPW0uZm5bYl07bS5mbltiXT1mdW5jdGlvbihhLGQsZSl7cmV0dXJuIG51bGw9PWF8fCJib29sZWFuIj09dHlwZW9mIGE/Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKGdiKGIsITApLGEsZCxlKX19KSxtLmVhY2goe3NsaWRlRG93bjpnYigic2hvdyIpLHNsaWRlVXA6Z2IoImhpZGUiKSxzbGlkZVRvZ2dsZTpnYigidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihhLGIpe20uZm5bYV09ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmFuaW1hdGUoYixhLGMsZCl9fSksbS50aW1lcnM9W10sbS5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGEsYj1tLnRpbWVycyxjPTA7Zm9yKCRhPW0ubm93KCk7YzxiLmxlbmd0aDtjKyspYT1iW2NdLGEoKXx8YltjXSE9PWF8fGIuc3BsaWNlKGMtLSwxKTtiLmxlbmd0aHx8bS5meC5zdG9wKCksJGE9dm9pZCAwfSxtLmZ4LnRpbWVyPWZ1bmN0aW9uKGEpe20udGltZXJzLnB1c2goYSksYSgpP20uZnguc3RhcnQoKTptLnRpbWVycy5wb3AoKX0sbS5meC5pbnRlcnZhbD0xMyxtLmZ4LnN0YXJ0PWZ1bmN0aW9uKCl7X2F8fChfYT1zZXRJbnRlcnZhbChtLmZ4LnRpY2ssbS5meC5pbnRlcnZhbCkpfSxtLmZ4LnN0b3A9ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKF9hKSxfYT1udWxsfSxtLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxtLmZuLmRlbGF5PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bS5meD9tLmZ4LnNwZWVkc1thXXx8YTphLGI9Ynx8ImZ4Iix0aGlzLnF1ZXVlKGIsZnVuY3Rpb24oYixjKXt2YXIgZD1zZXRUaW1lb3V0KGIsYSk7Yy5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGQpfX0pfSxmdW5jdGlvbigpe3ZhciBhLGIsYyxkLGU7Yj15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGIuc2V0QXR0cmlidXRlKCJjbGFzc05hbWUiLCJ0IiksYi5pbm5lckhUTUw9IiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF0sYz15LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGU9Yy5hcHBlbmRDaGlsZCh5LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IilbMF0sZC5zdHlsZS5jc3NUZXh0PSJ0b3A6MXB4IixrLmdldFNldEF0dHJpYnV0ZT0idCIhPT1iLmNsYXNzTmFtZSxrLnN0eWxlPS90b3AvLnRlc3QoZC5nZXRBdHRyaWJ1dGUoInN0eWxlIikpLGsuaHJlZk5vcm1hbGl6ZWQ9Ii9hIj09PWQuZ2V0QXR0cmlidXRlKCJocmVmIiksay5jaGVja09uPSEhYS52YWx1ZSxrLm9wdFNlbGVjdGVkPWUuc2VsZWN0ZWQsay5lbmN0eXBlPSEheS5jcmVhdGVFbGVtZW50KCJmb3JtIikuZW5jdHlwZSxjLmRpc2FibGVkPSEwLGsub3B0RGlzYWJsZWQ9IWUuZGlzYWJsZWQsYT15LmNyZWF0ZUVsZW1lbnQoImlucHV0IiksYS5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksay5pbnB1dD0iIj09PWEuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpLGEudmFsdWU9InQiLGEuc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxrLnJhZGlvVmFsdWU9InQiPT09YS52YWx1ZX0oKTt2YXIgbGI9L1xyL2c7bS5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZT10aGlzWzBdO3tpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBkPW0uaXNGdW5jdGlvbihhKSx0aGlzLmVhY2goZnVuY3Rpb24oYyl7dmFyIGU7MT09PXRoaXMubm9kZVR5cGUmJihlPWQ/YS5jYWxsKHRoaXMsYyxtKHRoaXMpLnZhbCgpKTphLG51bGw9PWU/ZT0iIjoibnVtYmVyIj09dHlwZW9mIGU/ZSs9IiI6bS5pc0FycmF5KGUpJiYoZT1tLm1hcChlLGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hPyIiOmErIiJ9KSksYj1tLnZhbEhvb2tzW3RoaXMudHlwZV18fG0udmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxiJiYic2V0ImluIGImJnZvaWQgMCE9PWIuc2V0KHRoaXMsZSwidmFsdWUiKXx8KHRoaXMudmFsdWU9ZSkpfSk7aWYoZSlyZXR1cm4gYj1tLnZhbEhvb2tzW2UudHlwZV18fG0udmFsSG9va3NbZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxiJiYiZ2V0ImluIGImJnZvaWQgMCE9PShjPWIuZ2V0KGUsInZhbHVlIikpP2M6KGM9ZS52YWx1ZSwic3RyaW5nIj09dHlwZW9mIGM/Yy5yZXBsYWNlKGxiLCIiKTpudWxsPT1jPyIiOmMpfX19KSxtLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPW0uZmluZC5hdHRyKGEsInZhbHVlIik7cmV0dXJuIG51bGwhPWI/YjptLnRyaW0obS50ZXh0KGEpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYixjLGQ9YS5vcHRpb25zLGU9YS5zZWxlY3RlZEluZGV4LGY9InNlbGVjdC1vbmUiPT09YS50eXBlfHwwPmUsZz1mP251bGw6W10saD1mP2UrMTpkLmxlbmd0aCxpPTA+ZT9oOmY/ZTowO2g+aTtpKyspaWYoYz1kW2ldLCEoIWMuc2VsZWN0ZWQmJmkhPT1lfHwoay5vcHREaXNhYmxlZD9jLmRpc2FibGVkOm51bGwhPT1jLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKSl8fGMucGFyZW50Tm9kZS5kaXNhYmxlZCYmbS5ub2RlTmFtZShjLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtpZihiPW0oYykudmFsKCksZilyZXR1cm4gYjtnLnB1c2goYil9cmV0dXJuIGd9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZT1hLm9wdGlvbnMsZj1tLm1ha2VBcnJheShiKSxnPWUubGVuZ3RoO3doaWxlKGctLSlpZihkPWVbZ10sbS5pbkFycmF5KG0udmFsSG9va3Mub3B0aW9uLmdldChkKSxmKT49MCl0cnl7ZC5zZWxlY3RlZD1jPSEwfWNhdGNoKGgpe2Quc2Nyb2xsSGVpZ2h0fWVsc2UgZC5zZWxlY3RlZD0hMTtyZXR1cm4gY3x8KGEuc2VsZWN0ZWRJbmRleD0tMSksZX19fX0pLG0uZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe20udmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbihhLGIpe3JldHVybiBtLmlzQXJyYXkoYik/YS5jaGVja2VkPW0uaW5BcnJheShtKGEpLnZhbCgpLGIpPj0wOnZvaWQgMH19LGsuY2hlY2tPbnx8KG0udmFsSG9va3NbdGhpc10uZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT09YS5nZXRBdHRyaWJ1dGUoInZhbHVlIik/Im9uIjphLnZhbHVlfSl9KTt2YXIgbWIsbmIsb2I9bS5leHByLmF0dHJIYW5kbGUscGI9L14oPzpjaGVja2VkfHNlbGVjdGVkKSQvaSxxYj1rLmdldFNldEF0dHJpYnV0ZSxyYj1rLmlucHV0O20uZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFYodGhpcyxtLmF0dHIsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20ucmVtb3ZlQXR0cih0aGlzLGEpfSl9fSksbS5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj1hLm5vZGVUeXBlO2lmKGEmJjMhPT1mJiY4IT09ZiYmMiE9PWYpcmV0dXJuIHR5cGVvZiBhLmdldEF0dHJpYnV0ZT09PUs/bS5wcm9wKGEsYixjKTooMT09PWYmJm0uaXNYTUxEb2MoYSl8fChiPWIudG9Mb3dlckNhc2UoKSxkPW0uYXR0ckhvb2tzW2JdfHwobS5leHByLm1hdGNoLmJvb2wudGVzdChiKT9uYjptYikpLHZvaWQgMD09PWM/ZCYmImdldCJpbiBkJiZudWxsIT09KGU9ZC5nZXQoYSxiKSk/ZTooZT1tLmZpbmQuYXR0cihhLGIpLG51bGw9PWU/dm9pZCAwOmUpOm51bGwhPT1jP2QmJiJzZXQiaW4gZCYmdm9pZCAwIT09KGU9ZC5zZXQoYSxjLGIpKT9lOihhLnNldEF0dHJpYnV0ZShiLGMrIiIpLGMpOnZvaWQgbS5yZW1vdmVBdHRyKGEsYikpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPTAsZj1iJiZiLm1hdGNoKEUpO2lmKGYmJjE9PT1hLm5vZGVUeXBlKXdoaWxlKGM9ZltlKytdKWQ9bS5wcm9wRml4W2NdfHxjLG0uZXhwci5tYXRjaC5ib29sLnRlc3QoYyk/cmImJnFifHwhcGIudGVzdChjKT9hW2RdPSExOmFbbS5jYW1lbENhc2UoImRlZmF1bHQtIitjKV09YVtkXT0hMTptLmF0dHIoYSxjLCIiKSxhLnJlbW92ZUF0dHJpYnV0ZShxYj9jOmQpfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihhLGIpe2lmKCFrLnJhZGlvVmFsdWUmJiJyYWRpbyI9PT1iJiZtLm5vZGVOYW1lKGEsImlucHV0Iikpe3ZhciBjPWEudmFsdWU7cmV0dXJuIGEuc2V0QXR0cmlidXRlKCJ0eXBlIixiKSxjJiYoYS52YWx1ZT1jKSxifX19fX0pLG5iPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPT09ITE/bS5yZW1vdmVBdHRyKGEsYyk6cmImJnFifHwhcGIudGVzdChjKT9hLnNldEF0dHJpYnV0ZSghcWImJm0ucHJvcEZpeFtjXXx8YyxjKTphW20uY2FtZWxDYXNlKCJkZWZhdWx0LSIrYyldPWFbY109ITAsY319LG0uZWFjaChtLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihhLGIpe3ZhciBjPW9iW2JdfHxtLmZpbmQuYXR0cjtvYltiXT1yYiYmcWJ8fCFwYi50ZXN0KGIpP2Z1bmN0aW9uKGEsYixkKXt2YXIgZSxmO3JldHVybiBkfHwoZj1vYltiXSxvYltiXT1lLGU9bnVsbCE9YyhhLGIsZCk/Yi50b0xvd2VyQ2FzZSgpOm51bGwsb2JbYl09ZiksZX06ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjP3ZvaWQgMDphW20uY2FtZWxDYXNlKCJkZWZhdWx0LSIrYildP2IudG9Mb3dlckNhc2UoKTpudWxsfX0pLHJiJiZxYnx8KG0uYXR0ckhvb2tzLnZhbHVlPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBtLm5vZGVOYW1lKGEsImlucHV0Iik/dm9pZChhLmRlZmF1bHRWYWx1ZT1iKTptYiYmbWIuc2V0KGEsYixjKX19KSxxYnx8KG1iPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0QXR0cmlidXRlTm9kZShjKTtyZXR1cm4gZHx8YS5zZXRBdHRyaWJ1dGVOb2RlKGQ9YS5vd25lckRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShjKSksZC52YWx1ZT1iKz0iIiwidmFsdWUiPT09Y3x8Yj09PWEuZ2V0QXR0cmlidXRlKGMpP2I6dm9pZCAwfX0sb2IuaWQ9b2IubmFtZT1vYi5jb29yZHM9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBjP3ZvaWQgMDooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiYiIiE9PWQudmFsdWU/ZC52YWx1ZTpudWxsfSxtLnZhbEhvb2tzLmJ1dHRvbj17Z2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpO3JldHVybiBjJiZjLnNwZWNpZmllZD9jLnZhbHVlOnZvaWQgMH0sc2V0Om1iLnNldH0sbS5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe21iLnNldChhLCIiPT09Yj8hMTpiLGMpfX0sbS5lYWNoKFsid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihhLGIpe20uYXR0ckhvb2tzW2JdPXtzZXQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4iIj09PWM/KGEuc2V0QXR0cmlidXRlKGIsImF1dG8iKSxjKTp2b2lkIDB9fX0pKSxrLnN0eWxlfHwobS5hdHRySG9va3Muc3R5bGU9e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0fHx2b2lkIDB9LHNldDpmdW5jdGlvbihhLGIpe3JldHVybiBhLnN0eWxlLmNzc1RleHQ9YisiIn19KTt2YXIgc2I9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9ufG9iamVjdCkkL2ksdGI9L14oPzphfGFyZWEpJC9pO20uZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFYodGhpcyxtLnByb3AsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9bS5wcm9wRml4W2FdfHxhLHRoaXMuZWFjaChmdW5jdGlvbigpe3RyeXt0aGlzW2FdPXZvaWQgMCxkZWxldGUgdGhpc1thXX1jYXRjaChiKXt9fSl9fSksbS5leHRlbmQoe3Byb3BGaXg6eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUifSxwcm9wOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZz1hLm5vZGVUeXBlO2lmKGEmJjMhPT1nJiY4IT09ZyYmMiE9PWcpcmV0dXJuIGY9MSE9PWd8fCFtLmlzWE1MRG9jKGEpLGYmJihiPW0ucHJvcEZpeFtiXXx8YixlPW0ucHJvcEhvb2tzW2JdKSx2b2lkIDAhPT1jP2UmJiJzZXQiaW4gZSYmdm9pZCAwIT09KGQ9ZS5zZXQoYSxjLGIpKT9kOmFbYl09YzplJiYiZ2V0ImluIGUmJm51bGwhPT0oZD1lLmdldChhLGIpKT9kOmFbYl19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihhKXt2YXIgYj1tLmZpbmQuYXR0cihhLCJ0YWJpbmRleCIpO3JldHVybiBiP3BhcnNlSW50KGIsMTApOnNiLnRlc3QoYS5ub2RlTmFtZSl8fHRiLnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOi0xfX19fSksay5ocmVmTm9ybWFsaXplZHx8bS5lYWNoKFsiaHJlZiIsInNyYyJdLGZ1bmN0aW9uKGEsYil7bS5wcm9wSG9va3NbYl09e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoYiw0KX19fSksay5vcHRTZWxlY3RlZHx8KG0ucHJvcEhvb2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiYoYi5zZWxlY3RlZEluZGV4LGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpLG51bGx9fSksbS5lYWNoKFsidGFiSW5kZXgiLCJyZWFkT25seSIsIm1heExlbmd0aCIsImNlbGxTcGFjaW5nIiwiY2VsbFBhZGRpbmciLCJyb3dTcGFuIiwiY29sU3BhbiIsInVzZU1hcCIsImZyYW1lQm9yZGVyIiwiY29udGVudEVkaXRhYmxlIl0sZnVuY3Rpb24oKXttLnByb3BGaXhbdGhpcy50b0xvd2VyQ2FzZSgpXT10aGlzfSksay5lbmN0eXBlfHwobS5wcm9wRml4LmVuY3R5cGU9ImVuY29kaW5nIik7dmFyIHViPS9bXHRcclxuXGZdL2c7bS5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoPTAsaT10aGlzLmxlbmd0aCxqPSJzdHJpbmciPT10eXBlb2YgYSYmYTtpZihtLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXttKHRoaXMpLmFkZENsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGopZm9yKGI9KGF8fCIiKS5tYXRjaChFKXx8W107aT5oO2grKylpZihjPXRoaXNbaF0sZD0xPT09Yy5ub2RlVHlwZSYmKGMuY2xhc3NOYW1lPygiICIrYy5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKHViLCIgIik6IiAiKSl7Zj0wO3doaWxlKGU9YltmKytdKWQuaW5kZXhPZigiICIrZSsiICIpPDAmJihkKz1lKyIgIik7Zz1tLnRyaW0oZCksYy5jbGFzc05hbWUhPT1nJiYoYy5jbGFzc05hbWU9Zyl9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoPTAsaT10aGlzLmxlbmd0aCxqPTA9PT1hcmd1bWVudHMubGVuZ3RofHwic3RyaW5nIj09dHlwZW9mIGEmJmE7aWYobS5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7bSh0aGlzKS5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxiLHRoaXMuY2xhc3NOYW1lKSl9KTtpZihqKWZvcihiPShhfHwiIikubWF0Y2goRSl8fFtdO2k+aDtoKyspaWYoYz10aGlzW2hdLGQ9MT09PWMubm9kZVR5cGUmJihjLmNsYXNzTmFtZT8oIiAiK2MuY2xhc3NOYW1lKyIgIikucmVwbGFjZSh1YiwiICIpOiIiKSl7Zj0wO3doaWxlKGU9YltmKytdKXdoaWxlKGQuaW5kZXhPZigiICIrZSsiICIpPj0wKWQ9ZC5yZXBsYWNlKCIgIitlKyIgIiwiICIpO2c9YT9tLnRyaW0oZCk6IiIsYy5jbGFzc05hbWUhPT1nJiYoYy5jbGFzc05hbWU9Zyl9cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGE7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgYiYmInN0cmluZyI9PT1jP2I/dGhpcy5hZGRDbGFzcyhhKTp0aGlzLnJlbW92ZUNsYXNzKGEpOnRoaXMuZWFjaChtLmlzRnVuY3Rpb24oYSk/ZnVuY3Rpb24oYyl7bSh0aGlzKS50b2dnbGVDbGFzcyhhLmNhbGwodGhpcyxjLHRoaXMuY2xhc3NOYW1lLGIpLGIpfTpmdW5jdGlvbigpe2lmKCJzdHJpbmciPT09Yyl7dmFyIGIsZD0wLGU9bSh0aGlzKSxmPWEubWF0Y2goRSl8fFtdO3doaWxlKGI9ZltkKytdKWUuaGFzQ2xhc3MoYik/ZS5yZW1vdmVDbGFzcyhiKTplLmFkZENsYXNzKGIpfWVsc2UoYz09PUt8fCJib29sZWFuIj09PWMpJiYodGhpcy5jbGFzc05hbWUmJm0uX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIsdGhpcy5jbGFzc05hbWUpLHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lfHxhPT09ITE/IiI6bS5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKX0pfSxoYXNDbGFzczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiAiK2ErIiAiLGM9MCxkPXRoaXMubGVuZ3RoO2Q+YztjKyspaWYoMT09PXRoaXNbY10ubm9kZVR5cGUmJigiICIrdGhpc1tjXS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKHViLCIgIikuaW5kZXhPZihiKT49MClyZXR1cm4hMDtyZXR1cm4hMX19KSxtLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXttLmZuW2JdPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKGIsbnVsbCxhLGMpOnRoaXMudHJpZ2dlcihiKX19KSxtLmZuLmV4dGVuZCh7aG92ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGEpLm1vdXNlbGVhdmUoYnx8YSl9LGJpbmQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm9uKGEsbnVsbCxiLGMpfSx1bmJpbmQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vZmYoYSxudWxsLGIpfSxkZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihiLGEsYyxkKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKGEsIioqIik6dGhpcy5vZmYoYixhfHwiKioiLGMpfX0pO3ZhciB2Yj1tLm5vdygpLHdiPS9cPy8seGI9LygsKXwoXFt8eyl8KH18XSl8Iig/OlteIlxcXHJcbl18XFxbIlxcXC9iZm5ydF18XFx1W1xkYS1mQS1GXXs0fSkqIlxzKjo/fHRydWV8ZmFsc2V8bnVsbHwtPyg/ITBcZClcZCsoPzpcLlxkK3wpKD86W2VFXVsrLV0/XGQrfCkvZzttLnBhcnNlSlNPTj1mdW5jdGlvbihiKXtpZihhLkpTT04mJmEuSlNPTi5wYXJzZSlyZXR1cm4gYS5KU09OLnBhcnNlKGIrIiIpO3ZhciBjLGQ9bnVsbCxlPW0udHJpbShiKyIiKTtyZXR1cm4gZSYmIW0udHJpbShlLnJlcGxhY2UoeGIsZnVuY3Rpb24oYSxiLGUsZil7cmV0dXJuIGMmJmImJihkPTApLDA9PT1kP2E6KGM9ZXx8YixkKz0hZi0hZSwiIil9KSk/RnVuY3Rpb24oInJldHVybiAiK2UpKCk6bS5lcnJvcigiSW52YWxpZCBKU09OOiAiK2IpfSxtLnBhcnNlWE1MPWZ1bmN0aW9uKGIpe3ZhciBjLGQ7aWYoIWJ8fCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gbnVsbDt0cnl7YS5ET01QYXJzZXI/KGQ9bmV3IERPTVBhcnNlcixjPWQucGFyc2VGcm9tU3RyaW5nKGIsInRleHQveG1sIikpOihjPW5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MRE9NIiksYy5hc3luYz0iZmFsc2UiLGMubG9hZFhNTChiKSl9Y2F0Y2goZSl7Yz12b2lkIDB9cmV0dXJuIGMmJmMuZG9jdW1lbnRFbGVtZW50JiYhYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGh8fG0uZXJyb3IoIkludmFsaWQgWE1MOiAiK2IpLGN9O3ZhciB5Yix6YixBYj0vIy4qJC8sQmI9LyhbPyZdKV89W14mXSovLENiPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvZ20sRGI9L14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sRWI9L14oPzpHRVR8SEVBRCkkLyxGYj0vXlwvXC8vLEdiPS9eKFtcdy4rLV0rOikoPzpcL1wvKD86W15cLz8jXSpAfCkoW15cLz8jOl0qKSg/OjooXGQrKXwpfCkvLEhiPXt9LEliPXt9LEpiPSIqLyIuY29uY2F0KCIqIik7dHJ5e3piPWxvY2F0aW9uLmhyZWZ9Y2F0Y2goS2Ipe3piPXkuY3JlYXRlRWxlbWVudCgiYSIpLHpiLmhyZWY9IiIsemI9emIuaHJlZn15Yj1HYi5leGVjKHpiLnRvTG93ZXJDYXNlKCkpfHxbXTtmdW5jdGlvbiBMYihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXsic3RyaW5nIiE9dHlwZW9mIGImJihjPWIsYj0iKiIpO3ZhciBkLGU9MCxmPWIudG9Mb3dlckNhc2UoKS5tYXRjaChFKXx8W107aWYobS5pc0Z1bmN0aW9uKGMpKXdoaWxlKGQ9ZltlKytdKSIrIj09PWQuY2hhckF0KDApPyhkPWQuc2xpY2UoMSl8fCIqIiwoYVtkXT1hW2RdfHxbXSkudW5zaGlmdChjKSk6KGFbZF09YVtkXXx8W10pLnB1c2goYyl9fWZ1bmN0aW9uIE1iKGEsYixjLGQpe3ZhciBlPXt9LGY9YT09PUliO2Z1bmN0aW9uIGcoaCl7dmFyIGk7cmV0dXJuIGVbaF09ITAsbS5lYWNoKGFbaF18fFtdLGZ1bmN0aW9uKGEsaCl7dmFyIGo9aChiLGMsZCk7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBqfHxmfHxlW2pdP2Y/IShpPWopOnZvaWQgMDooYi5kYXRhVHlwZXMudW5zaGlmdChqKSxnKGopLCExKX0pLGl9cmV0dXJuIGcoYi5kYXRhVHlwZXNbMF0pfHwhZVsiKiJdJiZnKCIqIil9ZnVuY3Rpb24gTmIoYSxiKXt2YXIgYyxkLGU9bS5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihkIGluIGIpdm9pZCAwIT09YltkXSYmKChlW2RdP2E6Y3x8KGM9e30pKVtkXT1iW2RdKTtyZXR1cm4gYyYmbS5leHRlbmQoITAsYSxjKSxhfWZ1bmN0aW9uIE9iKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuY29udGVudHMsaT1hLmRhdGFUeXBlczt3aGlsZSgiKiI9PT1pWzBdKWkuc2hpZnQoKSx2b2lkIDA9PT1lJiYoZT1hLm1pbWVUeXBlfHxiLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSk7aWYoZSlmb3IoZyBpbiBoKWlmKGhbZ10mJmhbZ10udGVzdChlKSl7aS51bnNoaWZ0KGcpO2JyZWFrfWlmKGlbMF1pbiBjKWY9aVswXTtlbHNle2ZvcihnIGluIGMpe2lmKCFpWzBdfHxhLmNvbnZlcnRlcnNbZysiICIraVswXV0pe2Y9ZzticmVha31kfHwoZD1nKX1mPWZ8fGR9cmV0dXJuIGY/KGYhPT1pWzBdJiZpLnVuc2hpZnQoZiksY1tmXSk6dm9pZCAwfWZ1bmN0aW9uIFBiKGEsYixjLGQpe3ZhciBlLGYsZyxoLGksaj17fSxrPWEuZGF0YVR5cGVzLnNsaWNlKCk7aWYoa1sxXSlmb3IoZyBpbiBhLmNvbnZlcnRlcnMpaltnLnRvTG93ZXJDYXNlKCldPWEuY29udmVydGVyc1tnXTtmPWsuc2hpZnQoKTt3aGlsZShmKWlmKGEucmVzcG9uc2VGaWVsZHNbZl0mJihjW2EucmVzcG9uc2VGaWVsZHNbZl1dPWIpLCFpJiZkJiZhLmRhdGFGaWx0ZXImJihiPWEuZGF0YUZpbHRlcihiLGEuZGF0YVR5cGUpKSxpPWYsZj1rLnNoaWZ0KCkpaWYoIioiPT09ZilmPWk7ZWxzZSBpZigiKiIhPT1pJiZpIT09Zil7aWYoZz1qW2krIiAiK2ZdfHxqWyIqICIrZl0sIWcpZm9yKGUgaW4gailpZihoPWUuc3BsaXQoIiAiKSxoWzFdPT09ZiYmKGc9altpKyIgIitoWzBdXXx8alsiKiAiK2hbMF1dKSl7Zz09PSEwP2c9altlXTpqW2VdIT09ITAmJihmPWhbMF0say51bnNoaWZ0KGhbMV0pKTticmVha31pZihnIT09ITApaWYoZyYmYVsidGhyb3dzIl0pYj1nKGIpO2Vsc2UgdHJ5e2I9ZyhiKX1jYXRjaChsKXtyZXR1cm57c3RhdGU6InBhcnNlcmVycm9yIixlcnJvcjpnP2w6Ik5vIGNvbnZlcnNpb24gZnJvbSAiK2krIiB0byAiK2Z9fX1yZXR1cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6Yn19bS5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOnpiLHR5cGU6IkdFVCIsaXNMb2NhbDpEYi50ZXN0KHliWzFdKSxnbG9iYWw6ITAscHJvY2Vzc0RhdGE6ITAsYXN5bmM6ITAsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsYWNjZXB0czp7IioiOkpiLHRleHQ6InRleHQvcGxhaW4iLGh0bWw6InRleHQvaHRtbCIseG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQifSxjb250ZW50czp7eG1sOi94bWwvLGh0bWw6L2h0bWwvLGpzb246L2pzb24vfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6bS5wYXJzZUpTT04sInRleHQgeG1sIjptLnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj9OYihOYihhLG0uYWpheFNldHRpbmdzKSxiKTpOYihtLmFqYXhTZXR0aW5ncyxhKX0sYWpheFByZWZpbHRlcjpMYihIYiksYWpheFRyYW5zcG9ydDpMYihJYiksYWpheDpmdW5jdGlvbihhLGIpeyJvYmplY3QiPT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYj1ifHx7fTt2YXIgYyxkLGUsZixnLGgsaSxqLGs9bS5hamF4U2V0dXAoe30sYiksbD1rLmNvbnRleHR8fGssbj1rLmNvbnRleHQmJihsLm5vZGVUeXBlfHxsLmpxdWVyeSk/bShsKTptLmV2ZW50LG89bS5EZWZlcnJlZCgpLHA9bS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikscT1rLnN0YXR1c0NvZGV8fHt9LHI9e30scz17fSx0PTAsdT0iY2FuY2VsZWQiLHY9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihhKXt2YXIgYjtpZigyPT09dCl7aWYoIWope2o9e307d2hpbGUoYj1DYi5leGVjKGYpKWpbYlsxXS50b0xvd2VyQ2FzZSgpXT1iWzJdfWI9althLnRvTG93ZXJDYXNlKCldfXJldHVybiBudWxsPT1iP251bGw6Yn0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIDI9PT10P2Y6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihhLGIpe3ZhciBjPWEudG9Mb3dlckNhc2UoKTtyZXR1cm4gdHx8KGE9c1tjXT1zW2NdfHxhLHJbYV09YiksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gdHx8KGsubWltZVR5cGU9YSksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbihhKXt2YXIgYjtpZihhKWlmKDI+dClmb3IoYiBpbiBhKXFbYl09W3FbYl0sYVtiXV07ZWxzZSB2LmFsd2F5cyhhW3Yuc3RhdHVzXSk7cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGEpe3ZhciBiPWF8fHU7cmV0dXJuIGkmJmkuYWJvcnQoYikseCgwLGIpLHRoaXN9fTtpZihvLnByb21pc2UodikuY29tcGxldGU9cC5hZGQsdi5zdWNjZXNzPXYuZG9uZSx2LmVycm9yPXYuZmFpbCxrLnVybD0oKGF8fGsudXJsfHx6YikrIiIpLnJlcGxhY2UoQWIsIiIpLnJlcGxhY2UoRmIseWJbMV0rIi8vIiksay50eXBlPWIubWV0aG9kfHxiLnR5cGV8fGsubWV0aG9kfHxrLnR5cGUsay5kYXRhVHlwZXM9bS50cmltKGsuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChFKXx8WyIiXSxudWxsPT1rLmNyb3NzRG9tYWluJiYoYz1HYi5leGVjKGsudXJsLnRvTG93ZXJDYXNlKCkpLGsuY3Jvc3NEb21haW49ISghY3x8Y1sxXT09PXliWzFdJiZjWzJdPT09eWJbMl0mJihjWzNdfHwoImh0dHA6Ij09PWNbMV0/IjgwIjoiNDQzIikpPT09KHliWzNdfHwoImh0dHA6Ij09PXliWzFdPyI4MCI6IjQ0MyIpKSkpLGsuZGF0YSYmay5wcm9jZXNzRGF0YSYmInN0cmluZyIhPXR5cGVvZiBrLmRhdGEmJihrLmRhdGE9bS5wYXJhbShrLmRhdGEsay50cmFkaXRpb25hbCkpLE1iKEhiLGssYix2KSwyPT09dClyZXR1cm4gdjtoPW0uZXZlbnQmJmsuZ2xvYmFsLGgmJjA9PT1tLmFjdGl2ZSsrJiZtLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLGsudHlwZT1rLnR5cGUudG9VcHBlckNhc2UoKSxrLmhhc0NvbnRlbnQ9IUViLnRlc3Qoay50eXBlKSxlPWsudXJsLGsuaGFzQ29udGVudHx8KGsuZGF0YSYmKGU9ay51cmwrPSh3Yi50ZXN0KGUpPyImIjoiPyIpK2suZGF0YSxkZWxldGUgay5kYXRhKSxrLmNhY2hlPT09ITEmJihrLnVybD1CYi50ZXN0KGUpP2UucmVwbGFjZShCYiwiJDFfPSIrdmIrKyk6ZSsod2IudGVzdChlKT8iJiI6Ij8iKSsiXz0iK3ZiKyspKSxrLmlmTW9kaWZpZWQmJihtLmxhc3RNb2RpZmllZFtlXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsbS5sYXN0TW9kaWZpZWRbZV0pLG0uZXRhZ1tlXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixtLmV0YWdbZV0pKSwoay5kYXRhJiZrLmhhc0NvbnRlbnQmJmsuY29udGVudFR5cGUhPT0hMXx8Yi5jb250ZW50VHlwZSkmJnYuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixrLmNvbnRlbnRUeXBlKSx2LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsay5kYXRhVHlwZXNbMF0mJmsuYWNjZXB0c1trLmRhdGFUeXBlc1swXV0/ay5hY2NlcHRzW2suZGF0YVR5cGVzWzBdXSsoIioiIT09ay5kYXRhVHlwZXNbMF0/IiwgIitKYisiOyBxPTAuMDEiOiIiKTprLmFjY2VwdHNbIioiXSk7Zm9yKGQgaW4gay5oZWFkZXJzKXYuc2V0UmVxdWVzdEhlYWRlcihkLGsuaGVhZGVyc1tkXSk7aWYoay5iZWZvcmVTZW5kJiYoay5iZWZvcmVTZW5kLmNhbGwobCx2LGspPT09ITF8fDI9PT10KSlyZXR1cm4gdi5hYm9ydCgpO3U9ImFib3J0Ijtmb3IoZCBpbntzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSl2W2RdKGtbZF0pO2lmKGk9TWIoSWIsayxiLHYpKXt2LnJlYWR5U3RhdGU9MSxoJiZuLnRyaWdnZXIoImFqYXhTZW5kIixbdixrXSksay5hc3luYyYmay50aW1lb3V0PjAmJihnPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2LmFib3J0KCJ0aW1lb3V0Iil9LGsudGltZW91dCkpO3RyeXt0PTEsaS5zZW5kKHIseCl9Y2F0Y2godyl7aWYoISgyPnQpKXRocm93IHc7eCgtMSx3KX19ZWxzZSB4KC0xLCJObyBUcmFuc3BvcnQiKTtmdW5jdGlvbiB4KGEsYixjLGQpe3ZhciBqLHIscyx1LHcseD1iOzIhPT10JiYodD0yLGcmJmNsZWFyVGltZW91dChnKSxpPXZvaWQgMCxmPWR8fCIiLHYucmVhZHlTdGF0ZT1hPjA/NDowLGo9YT49MjAwJiYzMDA+YXx8MzA0PT09YSxjJiYodT1PYihrLHYsYykpLHU9UGIoayx1LHYsaiksaj8oay5pZk1vZGlmaWVkJiYodz12LmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIiksdyYmKG0ubGFzdE1vZGlmaWVkW2VdPXcpLHc9di5nZXRSZXNwb25zZUhlYWRlcigiZXRhZyIpLHcmJihtLmV0YWdbZV09dykpLDIwND09PWF8fCJIRUFEIj09PWsudHlwZT94PSJub2NvbnRlbnQiOjMwND09PWE/eD0ibm90bW9kaWZpZWQiOih4PXUuc3RhdGUscj11LmRhdGEscz11LmVycm9yLGo9IXMpKToocz14LChhfHwheCkmJih4PSJlcnJvciIsMD5hJiYoYT0wKSkpLHYuc3RhdHVzPWEsdi5zdGF0dXNUZXh0PShifHx4KSsiIixqP28ucmVzb2x2ZVdpdGgobCxbcix4LHZdKTpvLnJlamVjdFdpdGgobCxbdix4LHNdKSx2LnN0YXR1c0NvZGUocSkscT12b2lkIDAsaCYmbi50cmlnZ2VyKGo/ImFqYXhTdWNjZXNzIjoiYWpheEVycm9yIixbdixrLGo/cjpzXSkscC5maXJlV2l0aChsLFt2LHhdKSxoJiYobi50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFt2LGtdKSwtLW0uYWN0aXZlfHxtLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpKX1yZXR1cm4gdn0sZ2V0SlNPTjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0uZ2V0KGEsYixjLCJqc29uIil9LGdldFNjcmlwdDpmdW5jdGlvbihhLGIpe3JldHVybiBtLmdldChhLHZvaWQgMCxiLCJzY3JpcHQiKX19KSxtLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oYSxiKXttW2JdPWZ1bmN0aW9uKGEsYyxkLGUpe3JldHVybiBtLmlzRnVuY3Rpb24oYykmJihlPWV8fGQsZD1jLGM9dm9pZCAwKSxtLmFqYXgoe3VybDphLHR5cGU6YixkYXRhVHlwZTplLGRhdGE6YyxzdWNjZXNzOmR9KX19KSxtLl9ldmFsVXJsPWZ1bmN0aW9uKGEpe3JldHVybiBtLmFqYXgoe3VybDphLHR5cGU6IkdFVCIsZGF0YVR5cGU6InNjcmlwdCIsYXN5bmM6ITEsZ2xvYmFsOiExLCJ0aHJvd3MiOiEwfSl9LG0uZm4uZXh0ZW5kKHt3cmFwQWxsOmZ1bmN0aW9uKGEpe2lmKG0uaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe20odGhpcykud3JhcEFsbChhLmNhbGwodGhpcyxiKSl9KTtpZih0aGlzWzBdKXt2YXIgYj1tKGEsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCk7dGhpc1swXS5wYXJlbnROb2RlJiZiLmluc2VydEJlZm9yZSh0aGlzWzBdKSxiLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXM7d2hpbGUoYS5maXJzdENoaWxkJiYxPT09YS5maXJzdENoaWxkLm5vZGVUeXBlKWE9YS5maXJzdENoaWxkO3JldHVybiBhfSkuYXBwZW5kKHRoaXMpfXJldHVybiB0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChtLmlzRnVuY3Rpb24oYSk/ZnVuY3Rpb24oYil7bSh0aGlzKS53cmFwSW5uZXIoYS5jYWxsKHRoaXMsYikpfTpmdW5jdGlvbigpe3ZhciBiPW0odGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7dmFyIGI9bS5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7bSh0aGlzKS53cmFwQWxsKGI/YS5jYWxsKHRoaXMsYyk6YSl9KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpe20ubm9kZU5hbWUodGhpcywiYm9keSIpfHxtKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KS5lbmQoKX19KSxtLmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oYSl7cmV0dXJuIGEub2Zmc2V0V2lkdGg8PTAmJmEub2Zmc2V0SGVpZ2h0PD0wfHwhay5yZWxpYWJsZUhpZGRlbk9mZnNldHMoKSYmIm5vbmUiPT09KGEuc3R5bGUmJmEuc3R5bGUuZGlzcGxheXx8bS5jc3MoYSwiZGlzcGxheSIpKX0sbS5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihhKXtyZXR1cm4hbS5leHByLmZpbHRlcnMuaGlkZGVuKGEpfTt2YXIgUWI9LyUyMC9nLFJiPS9cW1xdJC8sU2I9L1xyP1xuL2csVGI9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLFViPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBWYihhLGIsYyxkKXt2YXIgZTtpZihtLmlzQXJyYXkoYikpbS5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHxSYi50ZXN0KGEpP2QoYSxlKTpWYihhKyJbIisoIm9iamVjdCI9PXR5cGVvZiBlP2I6IiIpKyJdIixlLGMsZCl9KTtlbHNlIGlmKGN8fCJvYmplY3QiIT09bS50eXBlKGIpKWQoYSxiKTtlbHNlIGZvcihlIGluIGIpVmIoYSsiWyIrZSsiXSIsYltlXSxjLGQpfW0ucGFyYW09ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9ZnVuY3Rpb24oYSxiKXtiPW0uaXNGdW5jdGlvbihiKT9iKCk6bnVsbD09Yj8iIjpiLGRbZC5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChhKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpfTtpZih2b2lkIDA9PT1iJiYoYj1tLmFqYXhTZXR0aW5ncyYmbS5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLG0uaXNBcnJheShhKXx8YS5qcXVlcnkmJiFtLmlzUGxhaW5PYmplY3QoYSkpbS5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKGMgaW4gYSlWYihjLGFbY10sYixlKTtyZXR1cm4gZC5qb2luKCImIikucmVwbGFjZShRYiwiKyIpfSxtLmZuLmV4dGVuZCh7c2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIG0ucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT1tLnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gYT9tLm1ha2VBcnJheShhKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiFtKHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYmVWIudGVzdCh0aGlzLm5vZGVOYW1lKSYmIVRiLnRlc3QoYSkmJih0aGlzLmNoZWNrZWR8fCFXLnRlc3QoYSkpfSkubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9bSh0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09Yz9udWxsOm0uaXNBcnJheShjKT9tLm1hcChjLGZ1bmN0aW9uKGEpe3JldHVybntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoU2IsIlxyXG4iKX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6Yy5yZXBsYWNlKFNiLCJcclxuIil9fSkuZ2V0KCl9fSksbS5hamF4U2V0dGluZ3MueGhyPXZvaWQgMCE9PWEuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe3JldHVybiF0aGlzLmlzTG9jYWwmJi9eKGdldHxwb3N0fGhlYWR8cHV0fGRlbGV0ZXxvcHRpb25zKSQvaS50ZXN0KHRoaXMudHlwZSkmJlpiKCl8fCRiKCl9OlpiO3ZhciBXYj0wLFhiPXt9LFliPW0uYWpheFNldHRpbmdzLnhocigpO2EuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixmdW5jdGlvbigpe2Zvcih2YXIgYSBpbiBYYilYYlthXSh2b2lkIDAsITApfSksay5jb3JzPSEhWWImJiJ3aXRoQ3JlZGVudGlhbHMiaW4gWWIsWWI9ay5hamF4PSEhWWIsWWImJm0uYWpheFRyYW5zcG9ydChmdW5jdGlvbihhKXtpZighYS5jcm9zc0RvbWFpbnx8ay5jb3JzKXt2YXIgYjtyZXR1cm57c2VuZDpmdW5jdGlvbihjLGQpe3ZhciBlLGY9YS54aHIoKSxnPSsrV2I7aWYoZi5vcGVuKGEudHlwZSxhLnVybCxhLmFzeW5jLGEudXNlcm5hbWUsYS5wYXNzd29yZCksYS54aHJGaWVsZHMpZm9yKGUgaW4gYS54aHJGaWVsZHMpZltlXT1hLnhockZpZWxkc1tlXTthLm1pbWVUeXBlJiZmLm92ZXJyaWRlTWltZVR5cGUmJmYub3ZlcnJpZGVNaW1lVHlwZShhLm1pbWVUeXBlKSxhLmNyb3NzRG9tYWlufHxjWyJYLVJlcXVlc3RlZC1XaXRoIl18fChjWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0Iik7Zm9yKGUgaW4gYyl2b2lkIDAhPT1jW2VdJiZmLnNldFJlcXVlc3RIZWFkZXIoZSxjW2VdKyIiKTtmLnNlbmQoYS5oYXNDb250ZW50JiZhLmRhdGF8fG51bGwpLGI9ZnVuY3Rpb24oYyxlKXt2YXIgaCxpLGo7aWYoYiYmKGV8fDQ9PT1mLnJlYWR5U3RhdGUpKWlmKGRlbGV0ZSBYYltnXSxiPXZvaWQgMCxmLm9ucmVhZHlzdGF0ZWNoYW5nZT1tLm5vb3AsZSk0IT09Zi5yZWFkeVN0YXRlJiZmLmFib3J0KCk7ZWxzZXtqPXt9LGg9Zi5zdGF0dXMsInN0cmluZyI9PXR5cGVvZiBmLnJlc3BvbnNlVGV4dCYmKGoudGV4dD1mLnJlc3BvbnNlVGV4dCk7dHJ5e2k9Zi5zdGF0dXNUZXh0fWNhdGNoKGspe2k9IiJ9aHx8IWEuaXNMb2NhbHx8YS5jcm9zc0RvbWFpbj8xMjIzPT09aCYmKGg9MjA0KTpoPWoudGV4dD8yMDA6NDA0fWomJmQoaCxpLGosZi5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSl9LGEuYXN5bmM/ND09PWYucmVhZHlTdGF0ZT9zZXRUaW1lb3V0KGIpOmYub25yZWFkeXN0YXRlY2hhbmdlPVhiW2ddPWI6YigpfSxhYm9ydDpmdW5jdGlvbigpe2ImJmIodm9pZCAwLCEwKX19fX0pO2Z1bmN0aW9uIFpiKCl7dHJ5e3JldHVybiBuZXcgYS5YTUxIdHRwUmVxdWVzdH1jYXRjaChiKXt9fWZ1bmN0aW9uICRiKCl7dHJ5e3JldHVybiBuZXcgYS5BY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpfWNhdGNoKGIpe319bS5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi8oPzpqYXZhfGVjbWEpc2NyaXB0L30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihhKXtyZXR1cm4gbS5nbG9iYWxFdmFsKGEpLGF9fX0pLG0uYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihhKXt2b2lkIDA9PT1hLmNhY2hlJiYoYS5jYWNoZT0hMSksYS5jcm9zc0RvbWFpbiYmKGEudHlwZT0iR0VUIixhLmdsb2JhbD0hMSl9KSxtLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oYSl7aWYoYS5jcm9zc0RvbWFpbil7dmFyIGIsYz15LmhlYWR8fG0oImhlYWQiKVswXXx8eS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZCxlKXtiPXkuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksYi5hc3luYz0hMCxhLnNjcmlwdENoYXJzZXQmJihiLmNoYXJzZXQ9YS5zY3JpcHRDaGFyc2V0KSxiLnNyYz1hLnVybCxiLm9ubG9hZD1iLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihhLGMpeyhjfHwhYi5yZWFkeVN0YXRlfHwvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KGIucmVhZHlTdGF0ZSkpJiYoYi5vbmxvYWQ9Yi5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKSxiPW51bGwsY3x8ZSgyMDAsInN1Y2Nlc3MiKSl9LGMuaW5zZXJ0QmVmb3JlKGIsYy5maXJzdENoaWxkKX0sYWJvcnQ6ZnVuY3Rpb24oKXtiJiZiLm9ubG9hZCh2b2lkIDAsITApfX19fSk7dmFyIF9iPVtdLGFjPS8oPSlcPyg/PSZ8JCl8XD9cPy87bS5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBhPV9iLnBvcCgpfHxtLmV4cGFuZG8rIl8iK3ZiKys7cmV0dXJuIHRoaXNbYV09ITAsYX19KSxtLmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZSxmLGcsaD1iLmpzb25wIT09ITEmJihhYy50ZXN0KGIudXJsKT8idXJsIjoic3RyaW5nIj09dHlwZW9mIGIuZGF0YSYmIShiLmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJmFjLnRlc3QoYi5kYXRhKSYmImRhdGEiKTtyZXR1cm4gaHx8Impzb25wIj09PWIuZGF0YVR5cGVzWzBdPyhlPWIuanNvbnBDYWxsYmFjaz1tLmlzRnVuY3Rpb24oYi5qc29ucENhbGxiYWNrKT9iLmpzb25wQ2FsbGJhY2soKTpiLmpzb25wQ2FsbGJhY2ssaD9iW2hdPWJbaF0ucmVwbGFjZShhYywiJDEiK2UpOmIuanNvbnAhPT0hMSYmKGIudXJsKz0od2IudGVzdChiLnVybCk/IiYiOiI/IikrYi5qc29ucCsiPSIrZSksYi5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7cmV0dXJuIGd8fG0uZXJyb3IoZSsiIHdhcyBub3QgY2FsbGVkIiksZ1swXX0sYi5kYXRhVHlwZXNbMF09Impzb24iLGY9YVtlXSxhW2VdPWZ1bmN0aW9uKCl7Zz1hcmd1bWVudHN9LGQuYWx3YXlzKGZ1bmN0aW9uKCl7YVtlXT1mLGJbZV0mJihiLmpzb25wQ2FsbGJhY2s9Yy5qc29ucENhbGxiYWNrLF9iLnB1c2goZSkpLGcmJm0uaXNGdW5jdGlvbihmKSYmZihnWzBdKSxnPWY9dm9pZCAwfSksInNjcmlwdCIpOnZvaWQgMH0pLG0ucGFyc2VIVE1MPWZ1bmN0aW9uKGEsYixjKXtpZighYXx8InN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBudWxsOyJib29sZWFuIj09dHlwZW9mIGImJihjPWIsYj0hMSksYj1ifHx5O3ZhciBkPXUuZXhlYyhhKSxlPSFjJiZbXTtyZXR1cm4gZD9bYi5jcmVhdGVFbGVtZW50KGRbMV0pXTooZD1tLmJ1aWxkRnJhZ21lbnQoW2FdLGIsZSksZSYmZS5sZW5ndGgmJm0oZSkucmVtb3ZlKCksbS5tZXJnZShbXSxkLmNoaWxkTm9kZXMpKX07dmFyIGJjPW0uZm4ubG9hZDttLmZuLmxvYWQ9ZnVuY3Rpb24oYSxiLGMpe2lmKCJzdHJpbmciIT10eXBlb2YgYSYmYmMpcmV0dXJuIGJjLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZCxlLGYsZz10aGlzLGg9YS5pbmRleE9mKCIgIik7cmV0dXJuIGg+PTAmJihkPW0udHJpbShhLnNsaWNlKGgsYS5sZW5ndGgpKSxhPWEuc2xpY2UoMCxoKSksbS5pc0Z1bmN0aW9uKGIpPyhjPWIsYj12b2lkIDApOmImJiJvYmplY3QiPT10eXBlb2YgYiYmKGY9IlBPU1QiKSxnLmxlbmd0aD4wJiZtLmFqYXgoe3VybDphLHR5cGU6ZixkYXRhVHlwZToiaHRtbCIsZGF0YTpifSkuZG9uZShmdW5jdGlvbihhKXtlPWFyZ3VtZW50cyxnLmh0bWwoZD9tKCI8ZGl2PiIpLmFwcGVuZChtLnBhcnNlSFRNTChhKSkuZmluZChkKTphKX0pLmNvbXBsZXRlKGMmJmZ1bmN0aW9uKGEsYil7Zy5lYWNoKGMsZXx8W2EucmVzcG9uc2VUZXh0LGIsYV0pfSksdGhpc30sbS5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oYSxiKXttLmZuW2JdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9uKGIsYSl9fSksbS5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG0uZ3JlcChtLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH07dmFyIGNjPWEuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O2Z1bmN0aW9uIGRjKGEpe3JldHVybiBtLmlzV2luZG93KGEpP2E6OT09PWEubm9kZVR5cGU/YS5kZWZhdWx0Vmlld3x8YS5wYXJlbnRXaW5kb3c6ITF9bS5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpLGosaz1tLmNzcyhhLCJwb3NpdGlvbiIpLGw9bShhKSxuPXt9OyJzdGF0aWMiPT09ayYmKGEuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksaD1sLm9mZnNldCgpLGY9bS5jc3MoYSwidG9wIiksaT1tLmNzcyhhLCJsZWZ0Iiksaj0oImFic29sdXRlIj09PWt8fCJmaXhlZCI9PT1rKSYmbS5pbkFycmF5KCJhdXRvIixbZixpXSk+LTEsaj8oZD1sLnBvc2l0aW9uKCksZz1kLnRvcCxlPWQubGVmdCk6KGc9cGFyc2VGbG9hdChmKXx8MCxlPXBhcnNlRmxvYXQoaSl8fDApLG0uaXNGdW5jdGlvbihiKSYmKGI9Yi5jYWxsKGEsYyxoKSksbnVsbCE9Yi50b3AmJihuLnRvcD1iLnRvcC1oLnRvcCtnKSxudWxsIT1iLmxlZnQmJihuLmxlZnQ9Yi5sZWZ0LWgubGVmdCtlKSwidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxuKTpsLmNzcyhuKX19LG0uZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oYSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09YT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihiKXttLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7dmFyIGIsYyxkPXt0b3A6MCxsZWZ0OjB9LGU9dGhpc1swXSxmPWUmJmUub3duZXJEb2N1bWVudDtpZihmKXJldHVybiBiPWYuZG9jdW1lbnRFbGVtZW50LG0uY29udGFpbnMoYixlKT8odHlwZW9mIGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0IT09SyYmKGQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSksYz1kYyhmKSx7dG9wOmQudG9wKyhjLnBhZ2VZT2Zmc2V0fHxiLnNjcm9sbFRvcCktKGIuY2xpZW50VG9wfHwwKSxsZWZ0OmQubGVmdCsoYy5wYWdlWE9mZnNldHx8Yi5zY3JvbGxMZWZ0KS0oYi5jbGllbnRMZWZ0fHwwKX0pOmR9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGEsYixjPXt0b3A6MCxsZWZ0OjB9LGQ9dGhpc1swXTtyZXR1cm4iZml4ZWQiPT09bS5jc3MoZCwicG9zaXRpb24iKT9iPWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk6KGE9dGhpcy5vZmZzZXRQYXJlbnQoKSxiPXRoaXMub2Zmc2V0KCksbS5ub2RlTmFtZShhWzBdLCJodG1sIil8fChjPWEub2Zmc2V0KCkpLGMudG9wKz1tLmNzcyhhWzBdLCJib3JkZXJUb3BXaWR0aCIsITApLGMubGVmdCs9bS5jc3MoYVswXSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpLHt0b3A6Yi50b3AtYy50b3AtbS5jc3MoZCwibWFyZ2luVG9wIiwhMCksbGVmdDpiLmxlZnQtYy5sZWZ0LW0uY3NzKGQsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFBhcmVudHx8Y2M7d2hpbGUoYSYmIW0ubm9kZU5hbWUoYSwiaHRtbCIpJiYic3RhdGljIj09PW0uY3NzKGEsInBvc2l0aW9uIikpYT1hLm9mZnNldFBhcmVudDtyZXR1cm4gYXx8Y2N9KX19KSxtLmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24oYSxiKXt2YXIgYz0vWS8udGVzdChiKTttLmZuW2FdPWZ1bmN0aW9uKGQpe3JldHVybiBWKHRoaXMsZnVuY3Rpb24oYSxkLGUpe3ZhciBmPWRjKGEpO3JldHVybiB2b2lkIDA9PT1lP2Y/YiBpbiBmP2ZbYl06Zi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbZF06YVtkXTp2b2lkKGY/Zi5zY3JvbGxUbyhjP20oZikuc2Nyb2xsTGVmdCgpOmUsYz9lOm0oZikuc2Nyb2xsVG9wKCkpOmFbZF09ZSl9LGEsZCxhcmd1bWVudHMubGVuZ3RoLG51bGwpfX0pLG0uZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYl09TGEoay5waXhlbFBvc2l0aW9uLGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGM/KGM9SmEoYSxiKSxIYS50ZXN0KGMpP20oYSkucG9zaXRpb24oKVtiXSsicHgiOmMpOnZvaWQgMH0pfSksbS5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24oYSxiKXttLmVhY2goe3BhZGRpbmc6ImlubmVyIithLGNvbnRlbnQ6YiwiIjoib3V0ZXIiK2F9LGZ1bmN0aW9uKGMsZCl7bS5mbltkXT1mdW5jdGlvbihkLGUpe3ZhciBmPWFyZ3VtZW50cy5sZW5ndGgmJihjfHwiYm9vbGVhbiIhPXR5cGVvZiBkKSxnPWN8fChkPT09ITB8fGU9PT0hMD8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuIFYodGhpcyxmdW5jdGlvbihiLGMsZCl7dmFyIGU7cmV0dXJuIG0uaXNXaW5kb3coYik/Yi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYV06OT09PWIubm9kZVR5cGU/KGU9Yi5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoYi5ib2R5WyJzY3JvbGwiK2FdLGVbInNjcm9sbCIrYV0sYi5ib2R5WyJvZmZzZXQiK2FdLGVbIm9mZnNldCIrYV0sZVsiY2xpZW50IithXSkpOnZvaWQgMD09PWQ/bS5jc3MoYixjLGcpOm0uc3R5bGUoYixjLGQsZyl9LGIsZj9kOnZvaWQgMCxmLG51bGwpfX0pfSksbS5mbi5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RofSxtLmZuLmFuZFNlbGY9bS5mbi5hZGRCYWNrLCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiBtfSk7dmFyIGVjPWEualF1ZXJ5LGZjPWEuJDtyZXR1cm4gbS5ub0NvbmZsaWN0PWZ1bmN0aW9uKGIpe3JldHVybiBhLiQ9PT1tJiYoYS4kPWZjKSxiJiZhLmpRdWVyeT09PW0mJihhLmpRdWVyeT1lYyksbX0sdHlwZW9mIGI9PT1LJiYoYS5qUXVlcnk9YS4kPW0pLG19KTsNCg=="></script>
<script src="data:application/x-javascript;base64,LyoganF1ZXJ5LnNwYXJrbGluZSAyLjEuMyAtIGh0dHA6Ly9vbW5pcG90ZW50Lm5ldC9qcXVlcnkuc3BhcmtsaW5lLyANCiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBMaWNlbnNlIC0gc2VlIGFib3ZlIHNpdGUgZm9yIGRldGFpbHMgKi8NCiFmdW5jdGlvbihhLGIsYyl7IWZ1bmN0aW9uKGEpeyJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKCJqcXVlcnkuc3BhcmtsaW5lIixbImpxdWVyeSJdLGEpOmpRdWVyeSYmIWpRdWVyeS5mbi5zcGFya2xpbmUmJmEoalF1ZXJ5KX0oZnVuY3Rpb24oZCl7InVzZSBzdHJpY3QiO3ZhciBlLGYsZyxoLGksaixrLGwsbSxuLG8scCxxLHIscyx0LHUsdix3LHgseSx6LEEsQixDLEQsRSxGLEcsSCxJLEosSyxMLE0sTj17fSxPPTA7ZT1mdW5jdGlvbigpe3JldHVybntjb21tb246e3R5cGU6ImxpbmUiLGxpbmVDb2xvcjoiIzAwZiIsZmlsbENvbG9yOiIjY2RmIixkZWZhdWx0UGl4ZWxzUGVyVmFsdWU6Myx3aWR0aDoiYXV0byIsaGVpZ2h0OiJhdXRvIixjb21wb3NpdGU6ITEsdGFnVmFsdWVzQXR0cmlidXRlOiJ2YWx1ZXMiLHRhZ09wdGlvbnNQcmVmaXg6InNwYXJrIixlbmFibGVUYWdPcHRpb25zOiExLGVuYWJsZUhpZ2hsaWdodDohMCxoaWdobGlnaHRMaWdodGVuOjEuNCx0b29sdGlwU2tpcE51bGw6ITAsdG9vbHRpcFByZWZpeDoiIix0b29sdGlwU3VmZml4OiIiLGRpc2FibGVIaWRkZW5DaGVjazohMSxudW1iZXJGb3JtYXR0ZXI6ITEsbnVtYmVyRGlnaXRHcm91cENvdW50OjMsbnVtYmVyRGlnaXRHcm91cFNlcDoiLCIsbnVtYmVyRGVjaW1hbE1hcms6Ii4iLGRpc2FibGVUb29sdGlwczohMSxkaXNhYmxlSW50ZXJhY3Rpb246ITF9LGxpbmU6e3Nwb3RDb2xvcjoiI2Y4MCIsaGlnaGxpZ2h0U3BvdENvbG9yOiIjNWY1IixoaWdobGlnaHRMaW5lQ29sb3I6IiNmMjIiLHJlZkxpbmVDb2xvcjoiI2YyMiIsc3BvdFJhZGl1czoxLjUsbWluU3BvdENvbG9yOiIjZjgwIixtYXhTcG90Q29sb3I6IiNmODAiLGxpbmVXaWR0aDoxLG5vcm1hbFJhbmdlTWluOmMsbm9ybWFsUmFuZ2VNYXg6Yyxub3JtYWxSYW5nZUNvbG9yOiIjY2NjIixkcmF3Tm9ybWFsT25Ub3A6ITEsY2hhcnRSYW5nZU1pbjpjLGNoYXJ0UmFuZ2VNYXg6YyxjaGFydFJhbmdlTWluWDpjLGNoYXJ0UmFuZ2VNYXhYOmMsdG9vbHRpcEZvcm1hdDpuZXcgZygnPHNwYW4gc3R5bGU9ImNvbG9yOiB7e2NvbG9yfX0iPiYjOTY3OTs8L3NwYW4+IHt7cHJlZml4fX17e3l9fXt7c3VmZml4fX0nKX0sYmFyOntiYXJDb2xvcjoiIzMzNjZjYyIsbmVnQmFyQ29sb3I6IiNmNDQiLHN0YWNrZWRCYXJDb2xvcjpbIiMzMzY2Y2MiLCIjZGMzOTEyIiwiI2ZmOTkwMCIsIiMxMDk2MTgiLCIjNjZhYTAwIiwiI2RkNDQ3NyIsIiMwMDk5YzYiLCIjOTkwMDk5Il0semVyb0NvbG9yOmMsbnVsbENvbG9yOmMsemVyb0F4aXM6ITAsYmFyV2lkdGg6NCxiYXJTcGFjaW5nOjEsY2hhcnRSYW5nZU1heDpjLGNoYXJ0UmFuZ2VNaW46YyxjaGFydFJhbmdlQ2xpcDohMSxjb2xvck1hcDpjLHRvb2x0aXBGb3JtYXQ6bmV3IGcoJzxzcGFuIHN0eWxlPSJjb2xvcjoge3tjb2xvcn19Ij4mIzk2Nzk7PC9zcGFuPiB7e3ByZWZpeH19e3t2YWx1ZX19e3tzdWZmaXh9fScpfSx0aW1lbGluZTp7d2lkdGg6MTIwLGhlaWdodDozLGxpbmVDb2xvcjoiIzY3OTJjNiIsZmlsbENvbG9yOiIjYmFkN2ZiIixvcmllbnRhdGlvbjoiaG9yaXpvbnRhbCIsdGltZU1hcmtJbnRlcnZhbDowLGJlZ2luOm5ldyBEYXRlKDJlMywxLDEsMCwwKSxmaW5pc2g6bmV3IERhdGUoMmUzLDEsMSwyMyw1OSksaW5pdDpmdW5jdGlvbihhKXtyZXR1cm57YmVnaW46bmV3IERhdGUoYS5iZWdpbiksZmluaXNoOm5ldyBEYXRlKGEuZmluaXNoKSx0aXRsZTphLnRpdGxlLGNvbG9yOmEuY29sb3J9fSx0b29sdGlwRm9ybWF0Om5ldyBnKCc8c3BhbiBzdHlsZT0iY29sb3I6IHt7Y29sb3J9fSI+JiM5Njc5Ozwvc3Bhbj4ge3t0aXRsZX19OiB7e2JlZ2lufX0gLyB7e2ZpbmlzaH19Jyl9LHRyaXN0YXRlOntiYXJXaWR0aDo0LGJhclNwYWNpbmc6MSxwb3NCYXJDb2xvcjoiIzZmNiIsbmVnQmFyQ29sb3I6IiNmNDQiLHplcm9CYXJDb2xvcjoiIzk5OSIsY29sb3JNYXA6e30sdG9vbHRpcEZvcm1hdDpuZXcgZygnPHNwYW4gc3R5bGU9ImNvbG9yOiB7e2NvbG9yfX0iPiYjOTY3OTs8L3NwYW4+IHt7cHJlZml4fX17e3ZhbHVlOm1hcH19e3tzdWZmaXh9fScpLHRvb2x0aXBWYWx1ZUxvb2t1cHM6e21hcDp7Ii0xIjoiTG9zcyIsMDoiRHJhdyIsMToiV2luIn19fSxkaXNjcmV0ZTp7bGluZUhlaWdodDoiYXV0byIsdGhyZXNob2xkQ29sb3I6Yyx0aHJlc2hvbGRWYWx1ZTowLGNoYXJ0UmFuZ2VNYXg6YyxjaGFydFJhbmdlTWluOmMsY2hhcnRSYW5nZUNsaXA6ITEsdG9vbHRpcEZvcm1hdDpuZXcgZygie3twcmVmaXh9fXt7dmFsdWV9fXt7c3VmZml4fX0iKX0sYnVsbGV0Ont0YXJnZXRDb2xvcjoiI2YzMyIsdGFyZ2V0V2lkdGg6MyxwZXJmb3JtYW5jZUNvbG9yOiIjMzNmIixyYW5nZUNvbG9yczpbIiNkM2RhZmUiLCIjYThiNmZmIiwiIzdmOTRmZiJdLGJhc2U6Yyx0b29sdGlwRm9ybWF0Om5ldyBnKCJ7e2ZpZWxka2V5OmZpZWxkc319IC0ge3t2YWx1ZX19IiksdG9vbHRpcFZhbHVlTG9va3Vwczp7ZmllbGRzOntyOiJSYW5nZSIscDoiUGVyZm9ybWFuY2UiLHQ6IlRhcmdldCJ9fX0scGllOntvZmZzZXQ6MCxzbGljZUNvbG9yczpbIiMzMzY2Y2MiLCIjZGMzOTEyIiwiI2ZmOTkwMCIsIiMxMDk2MTgiLCIjNjZhYTAwIiwiI2RkNDQ3NyIsIiMwMDk5YzYiLCIjOTkwMDk5Il0sYm9yZGVyV2lkdGg6MCxib3JkZXJDb2xvcjoiIzAwMCIsdG9vbHRpcEZvcm1hdDpuZXcgZygnPHNwYW4gc3R5bGU9ImNvbG9yOiB7e2NvbG9yfX0iPiYjOTY3OTs8L3NwYW4+IHt7cHJlZml4fX17e3ZhbHVlfX0gKHt7cGVyY2VudC4xfX0lKXt7c3VmZml4fX0nKX0sc3RhY2s6e29mZnNldDowLHNsaWNlQ29sb3JzOlsiIzMzNjZjYyIsIiNkYzM5MTIiLCIjZmY5OTAwIiwiIzEwOTYxOCIsIiM2NmFhMDAiLCIjZGQ0NDc3IiwiIzAwOTljNiIsIiM5OTAwOTkiXSxib3JkZXJXaWR0aDowLGJvcmRlckNvbG9yOiIjMDAwIix0b29sdGlwRm9ybWF0Om5ldyBnKCc8c3BhbiBzdHlsZT0iY29sb3I6IHt7Y29sb3J9fSI+JiM5Njc5Ozwvc3Bhbj4ge3t2YWx1ZX19ICh7e3BlcmNlbnQuMX19JSknKX0sYm94OntyYXc6ITEsYm94TGluZUNvbG9yOiIjMDAwIixib3hGaWxsQ29sb3I6IiNjZGYiLHdoaXNrZXJDb2xvcjoiIzAwMCIsb3V0bGllckxpbmVDb2xvcjoiIzMzMyIsb3V0bGllckZpbGxDb2xvcjoiI2ZmZiIsbWVkaWFuQ29sb3I6IiNmMDAiLHNob3dPdXRsaWVyczohMCxvdXRsaWVySVFSOjEuNSxzcG90UmFkaXVzOjEuNSx0YXJnZXQ6Yyx0YXJnZXRDb2xvcjoiIzRhMiIsY2hhcnRSYW5nZU1heDpjLGNoYXJ0UmFuZ2VNaW46Yyx0b29sdGlwRm9ybWF0Om5ldyBnKCJ7e2ZpZWxkOmZpZWxkc319OiB7e3ZhbHVlfX0iKSx0b29sdGlwRm9ybWF0RmllbGRsaXN0S2V5OiJmaWVsZCIsdG9vbHRpcFZhbHVlTG9va3Vwczp7ZmllbGRzOntscToiTG93ZXIgUXVhcnRpbGUiLG1lZDoiTWVkaWFuIix1cToiVXBwZXIgUXVhcnRpbGUiLGxvOiJMZWZ0IE91dGxpZXIiLHJvOiJSaWdodCBPdXRsaWVyIixsdzoiTGVmdCBXaGlza2VyIixydzoiUmlnaHQgV2hpc2tlciJ9fX19fTt2YXIgUD0iLXdlYmtpdC1ib3gtc2l6aW5nOiBjb250ZW50LWJveCAhaW1wb3J0YW50Oy1tb3otYm94LXNpemluZzogY29udGVudC1ib3ggIWltcG9ydGFudDtib3gtc2l6aW5nOiBjb250ZW50LWJveCAhaW1wb3J0YW50OyI7Rz0nLmpxc3Rvb2x0aXAgeyBwb3NpdGlvbjogYWJzb2x1dGU7bGVmdDogMHB4O3RvcDogMHB4O3Zpc2liaWxpdHk6IGhpZGRlbjtiYWNrZ3JvdW5kOiByZ2IoMCwgMCwgMCkgdHJhbnNwYXJlbnQ7YmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLDAsMCwwLjYpO2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0jOTkwMDAwMDAsIGVuZENvbG9yc3RyPSM5OTAwMDAwMCk7LW1zLWZpbHRlcjogInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPSM5OTAwMDAwMCwgZW5kQ29sb3JzdHI9Izk5MDAwMDAwKSI7Y29sb3I6IHdoaXRlO2ZvbnQ6IDEwcHggYXJpYWwsIHNhbiBzZXJpZjt0ZXh0LWFsaWduOiBsZWZ0O3doaXRlLXNwYWNlOiBub3dyYXA7cGFkZGluZzogNXB4O2JvcmRlcjogMXB4IHNvbGlkIHdoaXRlO3otaW5kZXg6IDEwMDAwOycrUCsifS5qcXNmaWVsZCB7IGNvbG9yOiB3aGl0ZTtmb250OiAxMHB4IGFyaWFsLCBzYW4gc2VyaWY7dGV4dC1hbGlnbjogbGVmdDt9Lmpxc3Rvb2x0aXA6YmVmb3JlLCAuanFzdG9vbHRpcDphZnRlciB7ICIrUCsifSIsZj1mdW5jdGlvbigpe3ZhciBhLGI7cmV0dXJuIGE9ZnVuY3Rpb24oKXt0aGlzLmluaXQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxhcmd1bWVudHMubGVuZ3RoPjE/KGFyZ3VtZW50c1swXT8oYS5wcm90b3R5cGU9ZC5leHRlbmQobmV3IGFyZ3VtZW50c1swXSxhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aC0xXSksYS5fc3VwZXI9YXJndW1lbnRzWzBdLnByb3RvdHlwZSk6YS5wcm90b3R5cGU9YXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGgtMV0sYXJndW1lbnRzLmxlbmd0aD4yJiYoYj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSwtMSksYi51bnNoaWZ0KGEucHJvdG90eXBlKSxkLmV4dGVuZC5hcHBseShkLGIpKSk6YS5wcm90b3R5cGU9YXJndW1lbnRzWzBdLGEucHJvdG90eXBlLmNscz1hLGF9LGQuU1BGb3JtYXRDbGFzcz1nPWYoe2ZyZTovXHtceyhbXHcuXSs/KSg6KC4rPykpP1x9XH0vZyxwcmVjcmU6LyhcdyspXC4oXGQrKS8saW5pdDpmdW5jdGlvbihhLGIpe3RoaXMuZm9ybWF0PWEsdGhpcy5mY2xhc3M9Yn0scmVuZGVyOmZ1bmN0aW9uKGEsYixkKXt2YXIgZSxmLGcsaCxpLGo9dGhpcyxrPWE7cmV0dXJuIHRoaXMuZm9ybWF0LnJlcGxhY2UodGhpcy5mcmUsZnVuY3Rpb24oKXt2YXIgYTtyZXR1cm4gZj1hcmd1bWVudHNbMV0sZz1hcmd1bWVudHNbM10sZT1qLnByZWNyZS5leGVjKGYpLGU/KGk9ZVsyXSxmPWVbMV0pOmk9ITEsaD1rW2ZdLGg9PT1jPyIiOmcmJmImJmJbZ10/KGE9YltnXSxhLmdldD9iW2ddLmdldChoKXx8aDpiW2ddW2hdfHxoKToobihoKSYmKGg9ZC5nZXQoIm51bWJlckZvcm1hdHRlciIpP2QuZ2V0KCJudW1iZXJGb3JtYXR0ZXIiKShoKTpzKGgsaSxkLmdldCgibnVtYmVyRGlnaXRHcm91cENvdW50IiksZC5nZXQoIm51bWJlckRpZ2l0R3JvdXBTZXAiKSxkLmdldCgibnVtYmVyRGVjaW1hbE1hcmsiKSkpLGgpfSl9fSksZC5zcGZvcm1hdD1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgZyhhLGIpfSxoPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYj5hP2I6YT5jP2M6YX0saT1mdW5jdGlvbihhKXt2YXIgYixjO2lmKDA9PT1hLmxlbmd0aCUyKXt2YXIgZCxlO2M9YS5sZW5ndGgvMixkPWFbYy0xXSxlPWFbY10sYj0oZCtlKS8yfWVsc2UgYz1wYXJzZUludChhLmxlbmd0aC8yKSxiPWFbY107cmV0dXJue206YixpZHg6Y319LGo9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU7aWYoZD1pKGEpLDI9PT1iKWM9ZC5tO2Vsc2V7dmFyIGY9W107aWYoZT1kLm0sbnVsbCE9ZSl7dmFyIGc9MDtpZigxPT09Yil7Zm9yKDtnPGQuaWR4OylmW2ddPWFbZ10sZysrO2YubGVuZ3RofHwoZj1bYVswXV0pfWVsc2UgaWYoMz09PWIpe2Zvcih2YXIgaD1hLmxlbmd0aC0xO2g+ZC5pZHg7KWZbZ109YVtoXSxnKyssaC0tO2YubGVuZ3RofHwoZj1bYVthLmxlbmd0aC0xXV0pfX1kPWkoZiksYz1kLm19cmV0dXJuIGN9LGs9ZnVuY3Rpb24oYSl7dmFyIGI7c3dpdGNoKGEpe2Nhc2UidW5kZWZpbmVkIjphPWM7YnJlYWs7Y2FzZSJudWxsIjphPW51bGw7YnJlYWs7Y2FzZSJ0cnVlIjphPSEwO2JyZWFrO2Nhc2UiZmFsc2UiOmE9ITE7YnJlYWs7ZGVmYXVsdDpiPXBhcnNlRmxvYXQoYSksYT09YiYmKGE9Yil9cmV0dXJuIGF9LGw9ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXTtmb3IoYj1hLmxlbmd0aDtiLS07KWNbYl09ayhhW2JdKTtyZXR1cm4gY30sbT1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZT1bXTtmb3IoYz0wLGQ9YS5sZW5ndGg7ZD5jO2MrKylhW2NdIT09YiYmZS5wdXNoKGFbY10pO3JldHVybiBlfSxuPWZ1bmN0aW9uKGEpe3JldHVybiFpc05hTihwYXJzZUZsb2F0KGEpKSYmaXNGaW5pdGUoYSl9LHM9ZnVuY3Rpb24oYSxiLGMsZSxmKXt2YXIgZyxoO2ZvcihhPShiPT09ITE/cGFyc2VGbG9hdChhKS50b1N0cmluZygpOmEudG9GaXhlZChiKSkuc3BsaXQoIiIpLGc9KGc9ZC5pbkFycmF5KCIuIixhKSk8MD9hLmxlbmd0aDpnLGc8YS5sZW5ndGgmJihhW2ddPWYpLGg9Zy1jO2g+MDtoLT1jKWEuc3BsaWNlKGgsMCxlKTtyZXR1cm4gYS5qb2luKCIiKX0sbz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ7Zm9yKGQ9Yi5sZW5ndGg7ZC0tOylpZigoIWN8fG51bGwhPT1iW2RdKSYmYltkXSE9PWEpcmV0dXJuITE7cmV0dXJuITB9LHA9ZnVuY3Rpb24oYSl7dmFyIGIsYz0wO2ZvcihiPWEubGVuZ3RoO2ItLTspYys9Im51bWJlciI9PXR5cGVvZiBhW2JdP2FbYl06MDtyZXR1cm4gY30scj1mdW5jdGlvbihhKXtyZXR1cm4gZC5pc0FycmF5KGEpP2E6W2FdfSxxPWZ1bmN0aW9uKGIpe3ZhciBjLGQ7aWYoYS5jcmVhdGVTdHlsZVNoZWV0KXRyeXtyZXR1cm4gdm9pZChhLmNyZWF0ZVN0eWxlU2hlZXQoKS5jc3NUZXh0PWIpfWNhdGNoKGUpe2Q9ITB9Yz1hLmNyZWF0ZUVsZW1lbnQoInN0eWxlIiksYy50eXBlPSJ0ZXh0L2NzcyIsYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKGMpLGQ/YS5zdHlsZVNoZWV0c1thLnN0eWxlU2hlZXRzLmxlbmd0aC0xXS5jc3NUZXh0PWI6Y1sic3RyaW5nIj09dHlwZW9mIGEuYm9keS5zdHlsZS5XZWJraXRBcHBlYXJhbmNlPyJpbm5lclRleHQiOiJpbm5lckhUTUwiXT1ifSxkLmZuLnNpbXBsZWRyYXc9ZnVuY3Rpb24oYixlLGYsZyl7dmFyIGgsaTtpZihmJiYoaD10aGlzLmRhdGEoIl9qcXNfdmNhbnZhcyIpKSlyZXR1cm4gaDtpZihkLmZuLnNwYXJrbGluZS5jYW52YXM9PT0hMSlyZXR1cm4hMTtpZihkLmZuLnNwYXJrbGluZS5jYW52YXM9PT1jKXt2YXIgaj1hLmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO2lmKGouZ2V0Q29udGV4dCYmai5nZXRDb250ZXh0KCIyZCIpKWQuZm4uc3BhcmtsaW5lLmNhbnZhcz1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gbmV3IEsoYSxiLGMsZCl9O2Vsc2V7aWYoIWEubmFtZXNwYWNlc3x8YS5uYW1lc3BhY2VzLnYpcmV0dXJuIGQuZm4uc3BhcmtsaW5lLmNhbnZhcz0hMSwhMTthLm5hbWVzcGFjZXMuYWRkKCJ2IiwidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiLCIjZGVmYXVsdCNWTUwiKSxkLmZuLnNwYXJrbGluZS5jYW52YXM9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIG5ldyBMKGEsYixjKX19fXJldHVybiBiPT09YyYmKGI9ZCh0aGlzKS5pbm5lcldpZHRoKCkpLGU9PT1jJiYoZT1kKHRoaXMpLmlubmVySGVpZ2h0KCkpLGg9ZC5mbi5zcGFya2xpbmUuY2FudmFzKGIsZSx0aGlzLGcpLGk9ZCh0aGlzKS5kYXRhKCJfanFzX21oYW5kbGVyIiksaSYmaS5yZWdpc3RlckNhbnZhcyhoKSxofSxkLmZuLmNsZWFyZHJhdz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZGF0YSgiX2pxc192Y2FudmFzIik7YSYmYS5yZXNldCgpfSxkLlJhbmdlTWFwQ2xhc3M9dD1mKHtpbml0OmZ1bmN0aW9uKGEpe3ZhciBiLGMsZD1bXTtmb3IoYiBpbiBhKWEuaGFzT3duUHJvcGVydHkoYikmJiJzdHJpbmciPT10eXBlb2YgYiYmYi5pbmRleE9mKCI6Iik+LTEmJihjPWIuc3BsaXQoIjoiKSxjWzBdPTA9PT1jWzBdLmxlbmd0aD8tKDEvMCk6cGFyc2VGbG9hdChjWzBdKSxjWzFdPTA9PT1jWzFdLmxlbmd0aD8xLzA6cGFyc2VGbG9hdChjWzFdKSxjWzJdPWFbYl0sZC5wdXNoKGMpKTt0aGlzLm1hcD1hLHRoaXMucmFuZ2VsaXN0PWR8fCExfSxnZXQ6ZnVuY3Rpb24oYSl7dmFyIGIsZCxlLGY9dGhpcy5yYW5nZWxpc3Q7aWYoKGU9dGhpcy5tYXBbYV0pIT09YylyZXR1cm4gZTtpZihmKWZvcihiPWYubGVuZ3RoO2ItLTspaWYoZD1mW2JdLGRbMF08PWEmJmRbMV0+PWEpcmV0dXJuIGRbMl07cmV0dXJuIGN9fSksZC5yYW5nZV9tYXA9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyB0KGEpfSx1PWYoe2luaXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1kKGEpO3RoaXMuJGVsPWMsdGhpcy5vcHRpb25zPWIsdGhpcy5jdXJyZW50UGFnZVg9MCx0aGlzLmN1cnJlbnRQYWdlWT0wLHRoaXMuZWw9YSx0aGlzLnNwbGlzdD1bXSx0aGlzLnRvb2x0aXA9bnVsbCx0aGlzLm92ZXI9ITEsdGhpcy5kaXNwbGF5VG9vbHRpcHM9IWIuZ2V0KCJkaXNhYmxlVG9vbHRpcHMiKSx0aGlzLmhpZ2hsaWdodEVuYWJsZWQ9IWIuZ2V0KCJkaXNhYmxlSGlnaGxpZ2h0Iil9LHJlZ2lzdGVyU3BhcmtsaW5lOmZ1bmN0aW9uKGEpe3RoaXMuc3BsaXN0LnB1c2goYSksdGhpcy5vdmVyJiZ0aGlzLnVwZGF0ZURpc3BsYXkoKX0scmVnaXN0ZXJDYW52YXM6ZnVuY3Rpb24oYSl7dmFyIGI9ZChhLmNhbnZhcyk7dGhpcy5jYW52YXM9YSx0aGlzLiRjYW52YXM9YixiLm1vdXNlZW50ZXIoZC5wcm94eSh0aGlzLm1vdXNlZW50ZXIsdGhpcykpLGIubW91c2VsZWF2ZShkLnByb3h5KHRoaXMubW91c2VsZWF2ZSx0aGlzKSksYi5jbGljayhkLnByb3h5KHRoaXMubW91c2VjbGljayx0aGlzKSl9LHJlc2V0OmZ1bmN0aW9uKGEpe3RoaXMuc3BsaXN0PVtdLHRoaXMudG9vbHRpcCYmYSYmKHRoaXMudG9vbHRpcC5yZW1vdmUoKSx0aGlzLnRvb2x0aXA9Yyl9LG1vdXNlY2xpY2s6ZnVuY3Rpb24oYSl7dmFyIGI9ZC5FdmVudCgic3BhcmtsaW5lQ2xpY2siKTtiLm9yaWdpbmFsRXZlbnQ9YSxiLnNwYXJrbGluZXM9dGhpcy5zcGxpc3QsdGhpcy4kZWwudHJpZ2dlcihiKX0sbW91c2VlbnRlcjpmdW5jdGlvbihiKXtkKGEuYm9keSkudW5iaW5kKCJtb3VzZW1vdmUuanFzIiksZChhLmJvZHkpLmJpbmQoIm1vdXNlbW92ZS5qcXMiLGQucHJveHkodGhpcy5tb3VzZW1vdmUsdGhpcykpLHRoaXMub3Zlcj0hMCx0aGlzLmN1cnJlbnRQYWdlWD1iLnBhZ2VYLHRoaXMuY3VycmVudFBhZ2VZPWIucGFnZVksdGhpcy5jdXJyZW50RWw9Yi50YXJnZXQsIXRoaXMudG9vbHRpcCYmdGhpcy5kaXNwbGF5VG9vbHRpcHMmJih0aGlzLnRvb2x0aXA9bmV3IHYodGhpcy5vcHRpb25zKSx0aGlzLnRvb2x0aXAudXBkYXRlUG9zaXRpb24oYi5wYWdlWCxiLnBhZ2VZKSksdGhpcy51cGRhdGVEaXNwbGF5KCl9LG1vdXNlbGVhdmU6ZnVuY3Rpb24oKXtkKGEuYm9keSkudW5iaW5kKCJtb3VzZW1vdmUuanFzIik7dmFyIGIsYyxlPXRoaXMuc3BsaXN0LGY9ZS5sZW5ndGgsZz0hMTtmb3IodGhpcy5vdmVyPSExLHRoaXMuY3VycmVudEVsPW51bGwsdGhpcy50b29sdGlwJiYodGhpcy50b29sdGlwLnJlbW92ZSgpLHRoaXMudG9vbHRpcD1udWxsKSxjPTA7Zj5jO2MrKyliPWVbY10sYi5jbGVhclJlZ2lvbkhpZ2hsaWdodCgpJiYoZz0hMCk7ZyYmdGhpcy5jYW52YXMucmVuZGVyKCl9LG1vdXNlbW92ZTpmdW5jdGlvbihhKXt0aGlzLmN1cnJlbnRQYWdlWD1hLnBhZ2VYLHRoaXMuY3VycmVudFBhZ2VZPWEucGFnZVksdGhpcy5jdXJyZW50RWw9YS50YXJnZXQsdGhpcy50b29sdGlwJiZ0aGlzLnRvb2x0aXAudXBkYXRlUG9zaXRpb24oYS5wYWdlWCxhLnBhZ2VZKSx0aGlzLnVwZGF0ZURpc3BsYXkoKX0sdXBkYXRlRGlzcGxheTpmdW5jdGlvbigpe3ZhciBhLGMsZSxmLGcsaD10aGlzLnNwbGlzdCxpPWgubGVuZ3RoLGo9ITEsaz10aGlzLiRjYW52YXMub2Zmc2V0KCksbD1iLnJvdW5kKHRoaXMuY3VycmVudFBhZ2VYLWsubGVmdCksbT1iLnJvdW5kKHRoaXMuY3VycmVudFBhZ2VZLWsudG9wKTtpZih0aGlzLm92ZXIpe2ZvcihlPTA7aT5lO2UrKyljPWhbZV0sZj1jLnNldFJlZ2lvbkhpZ2hsaWdodCh0aGlzLmN1cnJlbnRFbCxsLG0pLGYmJihqPSEwKTtpZihqKXtpZihnPWQuRXZlbnQoInNwYXJrbGluZVJlZ2lvbkNoYW5nZSIpLGcuc3BhcmtsaW5lcz10aGlzLnNwbGlzdCx0aGlzLiRlbC50cmlnZ2VyKGcpLHRoaXMudG9vbHRpcCl7Zm9yKGE9IiIsZT0wO2k+ZTtlKyspYz1oW2VdLGErPWMuZ2V0Q3VycmVudFJlZ2lvblRvb2x0aXAoKTt0aGlzLnRvb2x0aXAuc2V0Q29udGVudChhKX10aGlzLmRpc2FibGVIaWdobGlnaHR8fHRoaXMuY2FudmFzLnJlbmRlcigpfW51bGw9PT1mJiZ0aGlzLm1vdXNlbGVhdmUoKX19fSksdj1mKHtzaXplU3R5bGU6InBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDtkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O3Zpc2liaWxpdHk6IGhpZGRlbiAhaW1wb3J0YW50O2Zsb2F0OiBsZWZ0ICFpbXBvcnRhbnQ7Iixpbml0OmZ1bmN0aW9uKGIpe3ZhciBjLGU9Yi5nZXQoInRvb2x0aXBDbGFzc25hbWUiLCJqcXN0b29sdGlwIiksZj10aGlzLnNpemVTdHlsZTt0aGlzLmNvbnRhaW5lcj1iLmdldCgidG9vbHRpcENvbnRhaW5lciIpfHxhLmJvZHksdGhpcy50b29sdGlwT2Zmc2V0WD1iLmdldCgidG9vbHRpcE9mZnNldFgiLDEwKSx0aGlzLnRvb2x0aXBPZmZzZXRZPWIuZ2V0KCJ0b29sdGlwT2Zmc2V0WSIsMTIpLHRoaXMuZGlzcGxheU9uTGVmdD0ibGVmdCI9PT1iLmdldCgidG9vbFRpcFBvc2l0aW9uIiksZCgiI2pxc3NpemV0aXAiKS5yZW1vdmUoKSxkKCIjanFzdG9vbHRpcCIpLnJlbW92ZSgpLHRoaXMuc2l6ZXRpcD1kKCI8ZGl2Lz4iLHtpZDoianFzc2l6ZXRpcCIsc3R5bGU6ZiwiY2xhc3MiOmV9KSx0aGlzLnRvb2x0aXA9ZCgiPGRpdi8+Iix7aWQ6Impxc3Rvb2x0aXAiLCJjbGFzcyI6ZX0pLmFwcGVuZFRvKHRoaXMuY29udGFpbmVyKSxjPXRoaXMudG9vbHRpcC5vZmZzZXQoKSx0aGlzLm9mZnNldExlZnQ9Yy5sZWZ0LHRoaXMub2Zmc2V0VG9wPWMudG9wLHRoaXMuaGlkZGVuPSEwLGQod2luZG93KS51bmJpbmQoInJlc2l6ZS5qcXMgc2Nyb2xsLmpxcyIpLGQod2luZG93KS5iaW5kKCJyZXNpemUuanFzIHNjcm9sbC5qcXMiLGQucHJveHkodGhpcy51cGRhdGVXaW5kb3dEaW1zLHRoaXMpKSx0aGlzLnVwZGF0ZVdpbmRvd0RpbXMoKX0sdXBkYXRlV2luZG93RGltczpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsVG9wPWQod2luZG93KS5zY3JvbGxUb3AoKSx0aGlzLnNjcm9sbExlZnQ9ZCh3aW5kb3cpLnNjcm9sbExlZnQoKSx0aGlzLnNjcm9sbFJpZ2h0PXRoaXMuc2Nyb2xsTGVmdCtkKHdpbmRvdykud2lkdGgoKSx0aGlzLnVwZGF0ZVBvc2l0aW9uKCl9LGdldFNpemU6ZnVuY3Rpb24oYSl7dGhpcy5zaXpldGlwLmh0bWwoYSkuYXBwZW5kVG8odGhpcy5jb250YWluZXIpO3ZhciBiPXBhcnNlSW50KHRoaXMuc2l6ZXRpcC5jc3MoInBhZGRpbmctbGVmdCIpLDEwKSxjPXBhcnNlSW50KHRoaXMuc2l6ZXRpcC5jc3MoInBhZGRpbmctcmlnaHQiKSwxMCk7dGhpcy5wYWRkaW5nPWIrYysxLHRoaXMud2lkdGg9dGhpcy5zaXpldGlwLndpZHRoKCkrMSx0aGlzLmhlaWdodD10aGlzLnNpemV0aXAuaGVpZ2h0KCksdGhpcy5zaXpldGlwLnJlbW92ZSgpfSxzZXRDb250ZW50OmZ1bmN0aW9uKGEpe3JldHVybiBhPyh0aGlzLmdldFNpemUoYSksdGhpcy50b29sdGlwLmh0bWwoYSkuY3NzKHt3aWR0aDp0aGlzLndpZHRoLGhlaWdodDp0aGlzLmhlaWdodCx2aXNpYmlsaXR5OiJ2aXNpYmxlIn0pLHZvaWQodGhpcy5oaWRkZW4mJih0aGlzLmhpZGRlbj0hMSx0aGlzLnVwZGF0ZVBvc2l0aW9uKCkpKSk6KHRoaXMudG9vbHRpcC5jc3MoInZpc2liaWxpdHkiLCJoaWRkZW4iKSx2b2lkKHRoaXMuaGlkZGVuPSEwKSl9LHVwZGF0ZVBvc2l0aW9uOmZ1bmN0aW9uKGEsYil7aWYoYT09PWMpe2lmKHRoaXMubW91c2V4PT09YylyZXR1cm47YT10aGlzLm1vdXNleC10aGlzLm9mZnNldExlZnQsYj10aGlzLm1vdXNleS10aGlzLm9mZnNldFRvcH1lbHNlIHRoaXMubW91c2V4PWEtPXRoaXMub2Zmc2V0TGVmdCx0aGlzLm1vdXNleT1iLT10aGlzLm9mZnNldFRvcDt0aGlzLmhlaWdodCYmdGhpcy53aWR0aCYmIXRoaXMuaGlkZGVuJiYoYi09dGhpcy5oZWlnaHQrdGhpcy50b29sdGlwT2Zmc2V0WSxiPHRoaXMuc2Nyb2xsVG9wJiYoYj10aGlzLnNjcm9sbFRvcCksdGhpcy5kaXNwbGF5T25MZWZ0P2EtPXRoaXMudG9vbHRpcE9mZnNldFgrdGhpcy53aWR0aCt0aGlzLnBhZGRpbmc6YSs9dGhpcy50b29sdGlwT2Zmc2V0WCxhPHRoaXMuc2Nyb2xsTGVmdD9hPXRoaXMuc2Nyb2xsTGVmdDphK3RoaXMud2lkdGg+dGhpcy5zY3JvbGxSaWdodCYmKGE9dGhpcy5zY3JvbGxSaWdodC10aGlzLndpZHRoKSx0aGlzLnRvb2x0aXAuY3NzKHtsZWZ0OmEsdG9wOmJ9KSl9LHJlbW92ZTpmdW5jdGlvbigpe3RoaXMudG9vbHRpcC5yZW1vdmUoKSx0aGlzLnNpemV0aXAucmVtb3ZlKCksdGhpcy5zaXpldGlwPXRoaXMudG9vbHRpcD1jLGQod2luZG93KS51bmJpbmQoInJlc2l6ZS5qcXMgc2Nyb2xsLmpxcyIpfX0pLEg9ZnVuY3Rpb24oKXtxKEcpfSxkKEgpLE09W10sZC5mbi5zcGFya2xpbmU9ZnVuY3Rpb24oYixlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGYsZyxoPW5ldyBkLmZuLnNwYXJrbGluZS5vcHRpb25zKHRoaXMsZSksaT1kKHRoaXMpO2lmKGY9ZnVuY3Rpb24oKXt2YXIgZSxmLGcsaixrLGwsbTtyZXR1cm4iaHRtbCI9PT1ifHxiPT09Yz8obT10aGlzLmdldEF0dHJpYnV0ZShoLmdldCgidGFnVmFsdWVzQXR0cmlidXRlIikpLChtPT09Y3x8bnVsbD09PW0pJiYobT1pLmh0bWwoKSksZT1tLnJlcGxhY2UoLyheXHMqPCEtLSl8KC0tPlxzKiQpfFxzKy9nLCIiKS5zcGxpdCgiLCIpKTplPWIsZj0iYXV0byI9PT1oLmdldCgid2lkdGgiKT9lLmxlbmd0aCpoLmdldCgiZGVmYXVsdFBpeGVsc1BlclZhbHVlIik6aC5nZXQoIndpZHRoIiksImF1dG8iPT09aC5nZXQoImhlaWdodCIpP2guZ2V0KCJjb21wb3NpdGUiKSYmZC5kYXRhKHRoaXMsIl9qcXNfdmNhbnZhcyIpfHwoaj1hLmNyZWF0ZUVsZW1lbnQoInNwYW4iKSxqLmlubmVySFRNTD0iYSIsaS5odG1sKGopLGc9ZChqKS5pbm5lckhlaWdodCgpfHxkKGopLmhlaWdodCgpLGQoaikucmVtb3ZlKCksaj1udWxsKTpnPWguZ2V0KCJoZWlnaHQiKSxoLmdldCgiZGlzYWJsZUludGVyYWN0aW9uIik/az0hMTooaz1kLmRhdGEodGhpcywiX2pxc19taGFuZGxlciIpLGs/aC5nZXQoImNvbXBvc2l0ZSIpfHxrLnJlc2V0KCk6KGs9bmV3IHUodGhpcyxoKSxkLmRhdGEodGhpcywiX2pxc19taGFuZGxlciIsaykpKSxoLmdldCgiY29tcG9zaXRlIikmJiFkLmRhdGEodGhpcywiX2pxc192Y2FudmFzIik/dm9pZChkLmRhdGEodGhpcywiX2pxc19lcnJub3RpZnkiKXx8KGFsZXJ0KCJBdHRlbXB0ZWQgdG8gYXR0YWNoIGEgY29tcG9zaXRlIHNwYXJrbGluZSB0byBhbiBlbGVtZW50IHdpdGggbm8gZXhpc3Rpbmcgc3BhcmtsaW5lIiksZC5kYXRhKHRoaXMsIl9qcXNfZXJybm90aWZ5IiwhMCkpKToobD1uZXcoZC5mbi5zcGFya2xpbmVbaC5nZXQoInR5cGUiKV0pKHRoaXMsZSxoLGYsZyksbC5yZW5kZXIoKSx2b2lkKGsmJmsucmVnaXN0ZXJTcGFya2xpbmUobCkpKX0sZCh0aGlzKS5odG1sKCkmJiFoLmdldCgiZGlzYWJsZUhpZGRlbkNoZWNrIikmJmQodGhpcykuaXMoIjpoaWRkZW4iKXx8IWQodGhpcykucGFyZW50cygiYm9keSIpLmxlbmd0aCl7aWYoIWguZ2V0KCJjb21wb3NpdGUiKSYmZC5kYXRhKHRoaXMsIl9qcXNfcGVuZGluZyIpKWZvcihnPU0ubGVuZ3RoO2c7Zy0tKU1bZy0xXVswXT09dGhpcyYmTS5zcGxpY2UoZy0xLDEpO00ucHVzaChbdGhpcyxmXSksZC5kYXRhKHRoaXMsIl9qcXNfcGVuZGluZyIsITApfWVsc2UgZi5jYWxsKHRoaXMpfSl9LGQuZm4uc3BhcmtsaW5lLmRlZmF1bHRzPWUoKSxkLnNwYXJrbGluZV9kaXNwbGF5X3Zpc2libGU9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZT1bXTtmb3IoYj0wLGM9TS5sZW5ndGg7Yz5iO2IrKylhPU1bYl1bMF0sZChhKS5pcygiOnZpc2libGUiKSYmIWQoYSkucGFyZW50cygpLmlzKCI6aGlkZGVuIik/KE1bYl1bMV0uY2FsbChhKSxkLmRhdGEoTVtiXVswXSwiX2pxc19wZW5kaW5nIiwhMSksZS5wdXNoKGIpKTpkKGEpLmNsb3Nlc3QoImh0bWwiKS5sZW5ndGh8fGQuZGF0YShhLCJfanFzX3BlbmRpbmciKXx8KGQuZGF0YShNW2JdWzBdLCJfanFzX3BlbmRpbmciLCExKSxlLnB1c2goYikpO2ZvcihiPWUubGVuZ3RoO2I7Yi0tKU0uc3BsaWNlKGVbYi0xXSwxKX0sZC5mbi5zcGFya2xpbmUub3B0aW9ucz1mKHtpbml0OmZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGc7dGhpcy51c2VyT3B0aW9ucz1iPWJ8fHt9LHRoaXMudGFnPWEsdGhpcy50YWdWYWxDYWNoZT17fSxlPWQuZm4uc3BhcmtsaW5lLmRlZmF1bHRzLGY9ZS5jb21tb24sdGhpcy50YWdPcHRpb25zUHJlZml4PWIuZW5hYmxlVGFnT3B0aW9ucyYmKGIudGFnT3B0aW9uc1ByZWZpeHx8Zi50YWdPcHRpb25zUHJlZml4KSxnPXRoaXMuZ2V0VGFnU2V0dGluZygidHlwZSIpLGM9Zz09PU4/ZVtiLnR5cGV8fGYudHlwZV06ZVtnXSx0aGlzLm1lcmdlZE9wdGlvbnM9ZC5leHRlbmQoe30sZixjLGIpfSxnZXRUYWdTZXR0aW5nOmZ1bmN0aW9uKGEpe3ZhciBiLGQsZSxmLGc9dGhpcy50YWdPcHRpb25zUHJlZml4O2lmKGc9PT0hMXx8Zz09PWMpcmV0dXJuIE47aWYodGhpcy50YWdWYWxDYWNoZS5oYXNPd25Qcm9wZXJ0eShhKSliPXRoaXMudGFnVmFsQ2FjaGUua2V5O2Vsc2V7aWYoYj10aGlzLnRhZy5nZXRBdHRyaWJ1dGUoZythKSxiPT09Y3x8bnVsbD09PWIpYj1OO2Vsc2UgaWYoIlsiPT09Yi5zdWJzdHIoMCwxKSlmb3IoYj1iLnN1YnN0cigxLGIubGVuZ3RoLTIpLnNwbGl0KCIsIiksZD1iLmxlbmd0aDtkLS07KWJbZF09ayhiW2RdLnJlcGxhY2UoLyheXHMqKXwoXHMqJCkvZywiIikpO2Vsc2UgaWYoInsiPT09Yi5zdWJzdHIoMCwxKSlmb3IoZT1iLnN1YnN0cigxLGIubGVuZ3RoLTIpLnNwbGl0KCIsIiksYj17fSxkPWUubGVuZ3RoO2QtLTspZj1lW2RdLnNwbGl0KCI6IiwyKSxiW2ZbMF0ucmVwbGFjZSgvKF5ccyopfChccyokKS9nLCIiKV09ayhmWzFdLnJlcGxhY2UoLyheXHMqKXwoXHMqJCkvZywiIikpO2Vsc2UgYj1rKGIpO3RoaXMudGFnVmFsQ2FjaGUua2V5PWJ9cmV0dXJuIGJ9LGdldDpmdW5jdGlvbihhLGIpe3ZhciBkLGU9dGhpcy5nZXRUYWdTZXR0aW5nKGEpO3JldHVybiBlIT09Tj9lOihkPXRoaXMubWVyZ2VkT3B0aW9uc1thXSk9PT1jP2I6ZH19KSxkLmZuLnNwYXJrbGluZS5fYmFzZT1mKHtkaXNhYmxlZDohMSxpbml0OmZ1bmN0aW9uKGEsYixlLGYsZyl7dGhpcy5lbD1hLHRoaXMuJGVsPWQoYSksdGhpcy52YWx1ZXM9Yix0aGlzLm9wdGlvbnM9ZSx0aGlzLndpZHRoPWYsdGhpcy5oZWlnaHQ9Zyx0aGlzLmN1cnJlbnRSZWdpb249Y30saW5pdFRhcmdldDpmdW5jdGlvbigpe3ZhciBhPSF0aGlzLm9wdGlvbnMuZ2V0KCJkaXNhYmxlSW50ZXJhY3Rpb24iKTsodGhpcy50YXJnZXQ9dGhpcy4kZWwuc2ltcGxlZHJhdyh0aGlzLndpZHRoLHRoaXMuaGVpZ2h0LHRoaXMub3B0aW9ucy5nZXQoImNvbXBvc2l0ZSIpLGEpKT8odGhpcy5jYW52YXNXaWR0aD10aGlzLnRhcmdldC5waXhlbFdpZHRoLHRoaXMuY2FudmFzSGVpZ2h0PXRoaXMudGFyZ2V0LnBpeGVsSGVpZ2h0KTp0aGlzLmRpc2FibGVkPSEwfSxpbml0Q29sb3JNYXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnMuZ2V0KCJjb2xvck1hcCIpO2QuaXNGdW5jdGlvbihhKT90aGlzLmNvbG9yTWFwRnVuY3Rpb249YTpkLmlzQXJyYXkoYSk/dGhpcy5jb2xvck1hcEZ1bmN0aW9uPWZ1bmN0aW9uKGIsYyxkLGUpe3JldHVybiBkPGEubGVuZ3RoP2FbZF06dm9pZCAwfTphJiYoYS5nZXQ9PT1jJiYoYT1uZXcgdChhKSksdGhpcy5jb2xvck1hcEZ1bmN0aW9uPWZ1bmN0aW9uKGIsYyxkLGUpe3JldHVybiBhLmdldChlKX0pfSxyZW5kZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXNhYmxlZD8odGhpcy5lbC5pbm5lckhUTUw9IiIsITEpOiEwfSxnZXRSZWdpb246ZnVuY3Rpb24oYSxiKXt9LHNldFJlZ2lvbkhpZ2hsaWdodDpmdW5jdGlvbihhLGIsZSl7dmFyIGYsZz10aGlzLmN1cnJlbnRSZWdpb24saD0hdGhpcy5vcHRpb25zLmdldCgiZGlzYWJsZUhpZ2hsaWdodCIpLGk9ZCgiY2FudmFzIix0aGlzLmVsKS53aWR0aCgpK3BhcnNlSW50KGQoImNhbnZhcyIsdGhpcy5lbCkuY3NzKCJwYWRkaW5nLWxlZnQiKSkrcGFyc2VJbnQoZCgiY2FudmFzIix0aGlzLmVsKS5jc3MoInBhZGRpbmctcmlnaHQiKSk7cmV0dXJuIGI+aXx8ZT50aGlzLmNhbnZhc0hlaWdodHx8MD5ifHwwPmU/bnVsbDooZj10aGlzLmdldFJlZ2lvbihhLGIsZSksZyE9PWY/KGchPT1jJiZoJiZ0aGlzLnJlbW92ZUhpZ2hsaWdodCgpLHRoaXMuY3VycmVudFJlZ2lvbj1mLGYhPT1jJiZoJiZ0aGlzLnJlbmRlckhpZ2hsaWdodCgpLCEwKTohMSl9LGNsZWFyUmVnaW9uSGlnaGxpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3VycmVudFJlZ2lvbiE9PWM/KHRoaXMucmVtb3ZlSGlnaGxpZ2h0KCksdGhpcy5jdXJyZW50UmVnaW9uPWMsITApOiExfSxyZW5kZXJIaWdobGlnaHQ6ZnVuY3Rpb24oKXt0aGlzLmNoYW5nZUhpZ2hsaWdodCghMCl9LHJlbW92ZUhpZ2hsaWdodDpmdW5jdGlvbigpe3RoaXMuY2hhbmdlSGlnaGxpZ2h0KCExKX0sY2hhbmdlSGlnaGxpZ2h0OmZ1bmN0aW9uKGEpe30sZ2V0Q3VycmVudFJlZ2lvblRvb2x0aXA6ZnVuY3Rpb24oKXt2YXIgYSxiLGUsZixoLGksaixrLGwsbSxuLG8scCxxLHIscyx0PXRoaXMub3B0aW9ucyx1PSIiLHY9W107aWYodGhpcy5jdXJyZW50UmVnaW9uPT09YylyZXR1cm4iIjtpZihhPXRoaXMuZ2V0Q3VycmVudFJlZ2lvbkZpZWxkcygpLG49dC5nZXQoInRvb2x0aXBGb3JtYXR0ZXIiKSlyZXR1cm4gbih0aGlzLHQsYSk7aWYodC5nZXQoInRvb2x0aXBDaGFydFRpdGxlIikmJih1Kz0nPGRpdiBjbGFzcz0ianFzIGpxc3RpdGxlIj4nK3QuZ2V0KCJ0b29sdGlwQ2hhcnRUaXRsZSIpKyI8L2Rpdj5cbiIpLGI9dGhpcy5vcHRpb25zLmdldCgidG9vbHRpcEZvcm1hdCIpLCFiKXJldHVybiIiO2lmKGQuaXNBcnJheShiKXx8KGI9W2JdKSxkLmlzQXJyYXkoYSl8fChhPVthXSksaj10aGlzLm9wdGlvbnMuZ2V0KCJ0b29sdGlwRm9ybWF0RmllbGRsaXN0Iiksaz10aGlzLm9wdGlvbnMuZ2V0KCJ0b29sdGlwRm9ybWF0RmllbGRsaXN0S2V5IiksaiYmayl7Zm9yKGw9W10saT1hLmxlbmd0aDtpLS07KW09YVtpXVtrXSwtMSE9KHE9ZC5pbkFycmF5KG0saikpJiYobFtxXT1hW2ldKTthPWx9Zm9yKGU9Yi5sZW5ndGgscD1hLmxlbmd0aCxpPTA7ZT5pO2krKylmb3Iobz1iW2ldLCJzdHJpbmciPT10eXBlb2YgbyYmKG89bmV3IGcobykpLGY9by5mY2xhc3N8fCJqcXNmaWVsZCIscT0wO3A+cTtxKyspYVtxXS5pc051bGwmJnQuZ2V0KCJ0b29sdGlwU2tpcE51bGwiKXx8KHI9IiIscz0iIix0LmdldCgidG9vbHRpcFByZWZpeEJpbkxhYmVscyIpJiZ0LmdldCgidG9vbHRpcFByZWZpeEJpbkxhYmVscyIpLmxlbmd0aD5hW3FdLm9mZnNldCYmKHI9dC5nZXQoInRvb2x0aXBQcmVmaXhCaW5MYWJlbHMiKVthW3FdLm9mZnNldF0pLHQuZ2V0KCJ0b29sdGlwU3VmZml4QmluTGFiZWxzIikmJnQuZ2V0KCJ0b29sdGlwU3VmZml4QmluTGFiZWxzIikubGVuZ3RoPmFbcV0ub2Zmc2V0JiYocz10LmdldCgidG9vbHRpcFN1ZmZpeEJpbkxhYmVscyIpW2FbcV0ub2Zmc2V0XSksZC5leHRlbmQoYVtxXSx7cHJlZml4OnIrdC5nZXQoInRvb2x0aXBQcmVmaXgiKSxzdWZmaXg6dC5nZXQoInRvb2x0aXBTdWZmaXgiKStzfSksaD1vLnJlbmRlcihhW3FdLHQuZ2V0KCJ0b29sdGlwVmFsdWVMb29rdXBzIiksdCksdi5wdXNoKCc8ZGl2IGNsYXNzPSInK2YrJyI+JytoKyI8L2Rpdj4iKSk7cmV0dXJuIHYubGVuZ3RoP3Urdi5qb2luKCJcbiIpOiIifSxnZXRDdXJyZW50UmVnaW9uRmllbGRzOmZ1bmN0aW9uKCl7fSxjYWxjSGlnaGxpZ2h0Q29sb3I6ZnVuY3Rpb24oYSxjKXt2YXIgZCxlLGYsZyxpPWMuZ2V0KCJoaWdobGlnaHRDb2xvciIpLGo9Yy5nZXQoImhpZ2hsaWdodExpZ2h0ZW4iKTtpZihpKXJldHVybiBpO2lmKGomJihkPS9eIyhbMC05YS1mXSkoWzAtOWEtZl0pKFswLTlhLWZdKSQvaS5leGVjKGEpfHwvXiMoWzAtOWEtZl17Mn0pKFswLTlhLWZdezJ9KShbMC05YS1mXXsyfSkkL2kuZXhlYyhhKSkpe2ZvcihmPVtdLGU9ND09PWEubGVuZ3RoPzE2OjEsZz0wOzM+ZztnKyspZltnXT1oKGIucm91bmQocGFyc2VJbnQoZFtnKzFdLDE2KSplKmopLDAsMjU1KTtyZXR1cm4icmdiKCIrZi5qb2luKCIsIikrIikifXJldHVybiBhfX0pLHc9e2NoYW5nZUhpZ2hsaWdodDpmdW5jdGlvbihhKXt2YXIgYixjPXRoaXMuY3VycmVudFJlZ2lvbixlPXRoaXMudGFyZ2V0LGY9dGhpcy5yZWdpb25TaGFwZXNbY107ZiYmKGI9dGhpcy5yZW5kZXJSZWdpb24oYyxhKSxkLmlzQXJyYXkoYil8fGQuaXNBcnJheShmKT8oZS5yZXBsYWNlV2l0aFNoYXBlcyhmLGIpLHRoaXMucmVnaW9uU2hhcGVzW2NdPWQubWFwKGIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaWR9KSk6KGUucmVwbGFjZVdpdGhTaGFwZShmLGIpLHRoaXMucmVnaW9uU2hhcGVzW2NdPWIuaWQpKX0scmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGEsYixjLGUsZj10aGlzLnZhbHVlcyxnPXRoaXMudGFyZ2V0LGg9dGhpcy5yZWdpb25TaGFwZXM7aWYodGhpcy5jbHMuX3N1cGVyLnJlbmRlci5jYWxsKHRoaXMpKXtmb3IoYz1mLmxlbmd0aDtjLS07KWlmKGE9dGhpcy5yZW5kZXJSZWdpb24oYykpaWYoZC5pc0FycmF5KGEpKXtmb3IoYj1bXSxlPWEubGVuZ3RoO2UtLTspYVtlXS5hcHBlbmQoKSxiLnB1c2goYVtlXS5pZCk7aFtjXT1ifWVsc2UgYS5hcHBlbmQoKSxoW2NdPWEuaWQ7ZWxzZSBoW2NdPW51bGw7Zy5yZW5kZXIoKX19fSxkLmZuLnNwYXJrbGluZS5saW5lPXg9ZihkLmZuLnNwYXJrbGluZS5fYmFzZSx7dHlwZToibGluZSIsaW5pdDpmdW5jdGlvbihhLGIsYyxkLGUpe3guX3N1cGVyLmluaXQuY2FsbCh0aGlzLGEsYixjLGQsZSksdGhpcy52ZXJ0aWNlcz1bXSx0aGlzLnJlZ2lvbk1hcD1bXSx0aGlzLnh2YWx1ZXM9W10sdGhpcy55dmFsdWVzPVtdLHRoaXMueW1pbm1heD1bXSx0aGlzLmhpZ2h0bGlnaHRTcG90SWQ9bnVsbCx0aGlzLmxhc3RTaGFwZUlkPW51bGwsdGhpcy5pbml0VGFyZ2V0KCl9LGdldFJlZ2lvbjpmdW5jdGlvbihhLGIsZCl7dmFyIGUsZj10aGlzLnJlZ2lvbk1hcDtmb3IoZT1mLmxlbmd0aDtlLS07KWlmKG51bGwhPT1mW2VdJiZiPj1mW2VdWzBdJiZiPD1mW2VdWzFdKXJldHVybiBmW2VdWzJdO3JldHVybiBjfSxnZXRDdXJyZW50UmVnaW9uRmllbGRzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5jdXJyZW50UmVnaW9uO3JldHVybntpc051bGw6bnVsbD09PXRoaXMueXZhbHVlc1thXSx4OnRoaXMueHZhbHVlc1thXSx5OnRoaXMueXZhbHVlc1thXSxjb2xvcjp0aGlzLm9wdGlvbnMuZ2V0KCJsaW5lQ29sb3IiKSxmaWxsQ29sb3I6dGhpcy5vcHRpb25zLmdldCgiZmlsbENvbG9yIiksb2Zmc2V0OmF9fSxyZW5kZXJIaWdobGlnaHQ6ZnVuY3Rpb24oKXt2YXIgYSxiLGQ9dGhpcy5jdXJyZW50UmVnaW9uLGU9dGhpcy50YXJnZXQsZj10aGlzLnZlcnRpY2VzW2RdLGc9dGhpcy5vcHRpb25zLGg9Zy5nZXQoInNwb3RSYWRpdXMiKSxpPWcuZ2V0KCJoaWdobGlnaHRTcG90Q29sb3IiKSxqPWcuZ2V0KCJoaWdobGlnaHRMaW5lQ29sb3IiKTtmJiYoaCYmaSYmKGE9ZS5kcmF3Q2lyY2xlKGZbMF0sZlsxXSxoLGMsaSksdGhpcy5oaWdobGlnaHRTcG90SWQ9YS5pZCxlLmluc2VydEFmdGVyU2hhcGUodGhpcy5sYXN0U2hhcGVJZCxhKSksaiYmKGI9ZS5kcmF3TGluZShmWzBdLHRoaXMuY2FudmFzVG9wLGZbMF0sdGhpcy5jYW52YXNUb3ArdGhpcy5jYW52YXNIZWlnaHQsaiksdGhpcy5oaWdobGlnaHRMaW5lSWQ9Yi5pZCxlLmluc2VydEFmdGVyU2hhcGUodGhpcy5sYXN0U2hhcGVJZCxiKSkpfSxyZW1vdmVIaWdobGlnaHQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnRhcmdldDt0aGlzLmhpZ2hsaWdodFNwb3RJZCYmKGEucmVtb3ZlU2hhcGVJZCh0aGlzLmhpZ2hsaWdodFNwb3RJZCksdGhpcy5oaWdobGlnaHRTcG90SWQ9bnVsbCksdGhpcy5oaWdobGlnaHRMaW5lSWQmJihhLnJlbW92ZVNoYXBlSWQodGhpcy5oaWdobGlnaHRMaW5lSWQpLHRoaXMuaGlnaGxpZ2h0TGluZUlkPW51bGwpfSxzY2FuVmFsdWVzOmZ1bmN0aW9uKCl7dmFyIGEsYyxkLGUsZixnPXRoaXMudmFsdWVzLGg9Zy5sZW5ndGgsaT10aGlzLnh2YWx1ZXMsaj10aGlzLnl2YWx1ZXMsaz10aGlzLnltaW5tYXg7Zm9yKGE9MDtoPmE7YSsrKWM9Z1thXSxkPSJzdHJpbmciPT10eXBlb2YgZ1thXSxlPSJvYmplY3QiPT10eXBlb2YgZ1thXSYmZ1thXWluc3RhbmNlb2YgQXJyYXksZj1kJiZnW2FdLnNwbGl0KCI6IiksZCYmMj09PWYubGVuZ3RoPyhpLnB1c2goTnVtYmVyKGZbMF0pKSxqLnB1c2goTnVtYmVyKGZbMV0pKSxrLnB1c2goTnVtYmVyKGZbMV0pKSk6ZT8oaS5wdXNoKGNbMF0pLGoucHVzaChjWzFdKSxrLnB1c2goY1sxXSkpOihpLnB1c2goYSksbnVsbD09PWdbYV18fCJudWxsIj09PWdbYV0/ai5wdXNoKG51bGwpOihqLnB1c2goTnVtYmVyKGMpKSxrLnB1c2goTnVtYmVyKGMpKSkpO3RoaXMub3B0aW9ucy5nZXQoInh2YWx1ZXMiKSYmKGk9dGhpcy5vcHRpb25zLmdldCgieHZhbHVlcyIpKSx0aGlzLm1heHk9dGhpcy5tYXh5b3JnPWIubWF4LmFwcGx5KGIsayksdGhpcy5taW55PXRoaXMubWlueW9yZz1iLm1pbi5hcHBseShiLGspLHRoaXMubWF4eD1iLm1heC5hcHBseShiLGkpLHRoaXMubWlueD1iLm1pbi5hcHBseShiLGkpLHRoaXMueHZhbHVlcz1pLHRoaXMueXZhbHVlcz1qLHRoaXMueW1pbm1heD1rfSxwcm9jZXNzUmFuZ2VPcHRpb25zOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcHRpb25zLGI9YS5nZXQoIm5vcm1hbFJhbmdlTWluIiksZD1hLmdldCgibm9ybWFsUmFuZ2VNYXgiKTtiIT09YyYmKGI8dGhpcy5taW55JiYodGhpcy5taW55PWIpLGQ+dGhpcy5tYXh5JiYodGhpcy5tYXh5PWQpKSxhLmdldCgiY2hhcnRSYW5nZU1pbiIpIT09YyYmKGEuZ2V0KCJjaGFydFJhbmdlQ2xpcCIpfHxhLmdldCgiY2hhcnRSYW5nZU1pbiIpPHRoaXMubWlueSkmJih0aGlzLm1pbnk9YS5nZXQoImNoYXJ0UmFuZ2VNaW4iKSksYS5nZXQoImNoYXJ0UmFuZ2VNYXgiKSE9PWMmJihhLmdldCgiY2hhcnRSYW5nZUNsaXAiKXx8YS5nZXQoImNoYXJ0UmFuZ2VNYXgiKT50aGlzLm1heHkpJiYodGhpcy5tYXh5PWEuZ2V0KCJjaGFydFJhbmdlTWF4IikpLGEuZ2V0KCJjaGFydFJhbmdlTWluWCIpIT09YyYmKGEuZ2V0KCJjaGFydFJhbmdlQ2xpcFgiKXx8YS5nZXQoImNoYXJ0UmFuZ2VNaW5YIik8dGhpcy5taW54KSYmKHRoaXMubWlueD1hLmdldCgiY2hhcnRSYW5nZU1pblgiKSksYS5nZXQoImNoYXJ0UmFuZ2VNYXhYIikhPT1jJiYoYS5nZXQoImNoYXJ0UmFuZ2VDbGlwWCIpfHxhLmdldCgiY2hhcnRSYW5nZU1heFgiKT50aGlzLm1heHgpJiYodGhpcy5tYXh4PWEuZ2V0KCJjaGFydFJhbmdlTWF4WCIpKX0sZHJhd05vcm1hbFJhbmdlOmZ1bmN0aW9uKGEsZCxlLGYsZyl7dmFyIGg9dGhpcy5vcHRpb25zLmdldCgibm9ybWFsUmFuZ2VNaW4iKSxpPXRoaXMub3B0aW9ucy5nZXQoIm5vcm1hbFJhbmdlTWF4Iiksaj1kK2Iucm91bmQoZS1lKigoaS10aGlzLm1pbnkpL2cpKSxrPWIucm91bmQoZSooaS1oKS9nKTt0aGlzLnRhcmdldC5kcmF3UmVjdChhLGosZixrLGMsdGhpcy5vcHRpb25zLmdldCgibm9ybWFsUmFuZ2VDb2xvciIpKS5hcHBlbmQoKX0scmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGEsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMsdSx2LHcseSx6LEEsQixDLEQsRT10aGlzLm9wdGlvbnMsRj10aGlzLnRhcmdldCxHPXRoaXMuY2FudmFzV2lkdGgsSD10aGlzLmNhbnZhc0hlaWdodCxJPXRoaXMudmVydGljZXMsSj1FLmdldCgic3BvdFJhZGl1cyIpLEs9dGhpcy5yZWdpb25NYXA7aWYoeC5fc3VwZXIucmVuZGVyLmNhbGwodGhpcykmJih0aGlzLnNjYW5WYWx1ZXMoKSx0aGlzLnByb2Nlc3NSYW5nZU9wdGlvbnMoKSxCPXRoaXMueHZhbHVlcyxDPXRoaXMueXZhbHVlcyx0aGlzLnltaW5tYXgubGVuZ3RoJiYhKHRoaXMueXZhbHVlcy5sZW5ndGg8MikpKXtmb3IoZz1oPTAsYT10aGlzLm1heHgtdGhpcy5taW54PT09MD8xOnRoaXMubWF4eC10aGlzLm1pbngsZT10aGlzLm1heHktdGhpcy5taW55PT09MD8xOnRoaXMubWF4eS10aGlzLm1pbnksZj10aGlzLnl2YWx1ZXMubGVuZ3RoLTEsSiYmKDQqSj5HfHw0Kko+SCkmJihKPTApLEomJih6PUUuZ2V0KCJoaWdobGlnaHRTcG90Q29sb3IiKSYmIUUuZ2V0KCJkaXNhYmxlSW50ZXJhY3Rpb24iKSwoenx8RS5nZXQoIm1pblNwb3RDb2xvciIpfHxFLmdldCgic3BvdENvbG9yIikmJkNbZl09PT10aGlzLm1pbnkpJiYoSC09Yi5jZWlsKEopKSwoenx8RS5nZXQoIm1heFNwb3RDb2xvciIpfHxFLmdldCgic3BvdENvbG9yIikmJkNbZl09PT10aGlzLm1heHkpJiYoSC09Yi5jZWlsKEopLGcrPWIuY2VpbChKKSksKHp8fChFLmdldCgibWluU3BvdENvbG9yIil8fEUuZ2V0KCJtYXhTcG90Q29sb3IiKSkmJihDWzBdPT09dGhpcy5taW55fHxDWzBdPT09dGhpcy5tYXh5KSkmJihoKz1iLmNlaWwoSiksRy09Yi5jZWlsKEopKSwoenx8RS5nZXQoInNwb3RDb2xvciIpfHxFLmdldCgibWluU3BvdENvbG9yIil8fEUuZ2V0KCJtYXhTcG90Q29sb3IiKSYmKENbZl09PT10aGlzLm1pbnl8fENbZl09PT10aGlzLm1heHkpKSYmKEctPWIuY2VpbChKKSkpLEgtLSxFLmdldCgibm9ybWFsUmFuZ2VNaW4iKT09PWN8fEUuZ2V0KCJkcmF3Tm9ybWFsT25Ub3AiKXx8dGhpcy5kcmF3Tm9ybWFsUmFuZ2UoaCxnLEgsRyxlKSxqPVtdLGs9W2pdLHE9cj1udWxsLHM9Qy5sZW5ndGgsRD0wO3M+RDtEKyspbD1CW0RdLG49QltEKzFdLG09Q1tEXSxvPWgrYi5yb3VuZCgobC10aGlzLm1pbngpKihHL2EpKSxwPXMtMT5EP2grYi5yb3VuZCgobi10aGlzLm1pbngpKihHL2EpKTpHLHI9bysocC1vKS8yLEtbRF09W3F8fDAscixEXSxxPXIsbnVsbD09PW0/RCYmKG51bGwhPT1DW0QtMV0mJihqPVtdLGsucHVzaChqKSksSS5wdXNoKG51bGwpKToobTx0aGlzLm1pbnkmJihtPXRoaXMubWlueSksbT50aGlzLm1heHkmJihtPXRoaXMubWF4eSksai5sZW5ndGh8fGoucHVzaChbbyxnK0hdKSxpPVtvLGcrYi5yb3VuZChILUgqKChtLXRoaXMubWlueSkvZSkpXSxqLnB1c2goaSksSS5wdXNoKGkpKTtmb3IodT1bXSx2PVtdLHc9ay5sZW5ndGgsRD0wO3c+RDtEKyspaj1rW0RdLGoubGVuZ3RoJiYoRS5nZXQoImZpbGxDb2xvciIpJiYoai5wdXNoKFtqW2oubGVuZ3RoLTFdWzBdLGcrSF0pLHYucHVzaChqLnNsaWNlKDApKSxqLnBvcCgpKSxqLmxlbmd0aD4yJiYoalswXT1balswXVswXSxqWzFdWzFdXSksdS5wdXNoKGopKTtmb3Iodz12Lmxlbmd0aCxEPTA7dz5EO0QrKylGLmRyYXdTaGFwZSh2W0RdLEUuZ2V0KCJmaWxsQ29sb3IiKSxFLmdldCgiZmlsbENvbG9yIikpLmFwcGVuZCgpO2ZvcihFLmdldCgibm9ybWFsUmFuZ2VNaW4iKSE9PWMmJkUuZ2V0KCJkcmF3Tm9ybWFsT25Ub3AiKSYmdGhpcy5kcmF3Tm9ybWFsUmFuZ2UoaCxnLEgsRyxlKSx3PXUubGVuZ3RoLEQ9MDt3PkQ7RCsrKUYuZHJhd1NoYXBlKHVbRF0sRS5nZXQoImxpbmVDb2xvciIpLGMsRS5nZXQoImxpbmVXaWR0aCIpKS5hcHBlbmQoKTtpZihKJiZFLmdldCgidmFsdWVTcG90cyIpKWZvcih5PUUuZ2V0KCJ2YWx1ZVNwb3RzIikseS5nZXQ9PT1jJiYoeT1uZXcgdCh5KSksRD0wO3M+RDtEKyspQT15LmdldChDW0RdKSxBJiZGLmRyYXdDaXJjbGUoaCtiLnJvdW5kKChCW0RdLXRoaXMubWlueCkqKEcvYSkpLGcrYi5yb3VuZChILUgqKChDW0RdLXRoaXMubWlueSkvZSkpLEosYyxBKS5hcHBlbmQoKTtKJiZFLmdldCgic3BvdENvbG9yIikmJm51bGwhPT1DW2ZdJiZGLmRyYXdDaXJjbGUoaCtiLnJvdW5kKChCW0IubGVuZ3RoLTFdLXRoaXMubWlueCkqKEcvYSkpLGcrYi5yb3VuZChILUgqKChDW2ZdLXRoaXMubWlueSkvZSkpLEosYyxFLmdldCgic3BvdENvbG9yIikpLmFwcGVuZCgpLHRoaXMubWF4eSE9PXRoaXMubWlueW9yZyYmKEomJkUuZ2V0KCJtaW5TcG90Q29sb3IiKSYmKGw9QltkLmluQXJyYXkodGhpcy5taW55b3JnLEMpXSxGLmRyYXdDaXJjbGUoaCtiLnJvdW5kKChsLXRoaXMubWlueCkqKEcvYSkpLGcrYi5yb3VuZChILUgqKCh0aGlzLm1pbnlvcmctdGhpcy5taW55KS9lKSksSixjLEUuZ2V0KCJtaW5TcG90Q29sb3IiKSkuYXBwZW5kKCkpLEomJkUuZ2V0KCJtYXhTcG90Q29sb3IiKSYmKGw9QltkLmluQXJyYXkodGhpcy5tYXh5b3JnLEMpXSxGLmRyYXdDaXJjbGUoaCtiLnJvdW5kKChsLXRoaXMubWlueCkqKEcvYSkpLGcrYi5yb3VuZChILUgqKCh0aGlzLm1heHlvcmctdGhpcy5taW55KS9lKSksSixjLEUuZ2V0KCJtYXhTcG90Q29sb3IiKSkuYXBwZW5kKCkpKSxudWxsIT1FLmdldCgicmVmTGluZVgiKSYmKG09Yi5yb3VuZCh0aGlzLmNhbnZhc0hlaWdodC0oRS5nZXQoInJlZkxpbmVYIiktdGhpcy5taW55KSoodGhpcy5jYW52YXNIZWlnaHQvZSkpLEYuZHJhd0xpbmUoMCxtLHRoaXMuY2FudmFzV2lkdGgsbSxFLmdldCgicmVmTGluZUNvbG9yIikpLmFwcGVuZCgpKSxudWxsIT1FLmdldCgicmVmTGluZVkiKSYmKGw9Yi5yb3VuZCgoRS5nZXQoInJlZkxpbmVZIiktdGhpcy5taW54KSoodGhpcy5jYW52YXNXaWR0aC9hKSksRi5kcmF3TGluZShsLHRoaXMuY2FudmFzSGVpZ2h0LGwsMCxFLmdldCgicmVmTGluZUNvbG9yIikpLmFwcGVuZCgpKSx0aGlzLmxhc3RTaGFwZUlkPUYuZ2V0TGFzdFNoYXBlSWQoKSx0aGlzLmNhbnZhc1RvcD1nLEYucmVuZGVyKCl9fX0pLGQuZm4uc3BhcmtsaW5lLmJhcj15PWYoZC5mbi5zcGFya2xpbmUuX2Jhc2Usdyx7dHlwZToiYmFyIixpbml0OmZ1bmN0aW9uKGEsZSxmLGcsaSl7dmFyIGosbixvLHAscSxyLHMsdCx1LHYsdyx4LHosQSxCLEMsRCxFLEYsRyxILEksSixLLEwsTSxOPXBhcnNlSW50KGYuZ2V0KCJiYXJXaWR0aCIpLDEwKSxPPXBhcnNlSW50KGYuZ2V0KCJiYXJTcGFjaW5nIiksMTApLFA9Zi5nZXQoImNoYXJ0UmFuZ2VNaW4iKSxRPWYuZ2V0KCJjaGFydFJhbmdlTWF4IiksUj1mLmdldCgiY2hhcnRSYW5nZUNsaXAiKSxTPTEvMCxUPS0oMS8wKTtmb3IoeS5fc3VwZXIuaW5pdC5jYWxsKHRoaXMsYSxlLGYsZyxpKSx2PTAsdz1lLmxlbmd0aDt3PnY7disrKUs9ZVt2XSxqPSJzdHJpbmciPT10eXBlb2YgSyYmSy5pbmRleE9mKCI6Iik+LTEsKGp8fGQuaXNBcnJheShLKSkmJihGPSEwLGomJihLPWVbdl09bChLLnNwbGl0KCI6IikpKSxLPW0oSyxudWxsKSxuPWIubWluLmFwcGx5KGIsSyksbz1iLm1heC5hcHBseShiLEspLFM+biYmKFM9biksbz5UJiYoVD1vKSk7dGhpcy5zdGFja2VkPUYsdGhpcy5yZWdpb25TaGFwZXM9e30sdGhpcy5iYXJXaWR0aD1OLHRoaXMuYmFyU3BhY2luZz1PLHRoaXMudG90YWxCYXJXaWR0aD1OK087dmFyIFU9ZS5sZW5ndGgqTisoZS5sZW5ndGgtMSkqTztmb3IodGhpcy54U2NhbGU9Yi5taW4oMSxVP2cvVToxKSx0aGlzLndpZHRoPVUqdGhpcy54U2NhbGUsdGhpcy5pbml0VGFyZ2V0KCksUiYmKEQ9UD09PWM/LSgxLzApOlAsRT1RPT09Yz8xLzA6USksRiYmKHM9UD09PWM/UzpiLm1pbihTLFApLHQ9UT09PWM/VDpiLm1heChULFEpKSx1PVtdLHA9Rj9bXTp1LHI9W10scT1bXSx2PTAsdz1lLmxlbmd0aDt3PnY7disrKWlmKEYpZm9yKEc9ZVt2XSxlW3ZdPUo9W10sclt2XT0wLHBbdl09cVt2XT0wLEg9MCxJPUcubGVuZ3RoO0k+SDtIKyspSz1KW0hdPVI/aChHW0hdLEQsRSk6R1tIXSxudWxsIT09SyYmKEs+MCYmKHJbdl0rPUspLDA+UyYmVD4wPzA+Sz9xW3ZdKz1iLmFicyhLKTpwW3ZdKz1LOnBbdl0rPWIuYWJzKEstKDA+Sz90OnMpKSx1LnB1c2goSykpO2Vsc2UgSz1SP2goZVt2XSxELEUpOmVbdl0sSz1lW3ZdPWsoSyksbnVsbCE9PUsmJnUucHVzaChLKTt0aGlzLm1heD1DPWIubWF4LmFwcGx5KGIsdSksdGhpcy5taW49Qj1iLm1pbi5hcHBseShiLHUpLHRoaXMuc3RhY2tNYXg9VD1GP2IubWF4LmFwcGx5KGIscik6Qyx0aGlzLnN0YWNrTWluPVM9Rj9iLm1pbi5hcHBseShiLHUpOkIsUCE9PWMmJihSfHxCPlApJiYoQj1QKSxRIT09YyYmKFJ8fFE+QykmJihDPVEpLHRoaXMuemVyb0F4aXM9ej1mLmdldCgiemVyb0F4aXMiLCEwKSxBPTA+PUImJkM+PTAmJno/MDp6PT09ITE/QjpCPjA/QjpDLHRoaXMueGF4aXNPZmZzZXQ9QSx4PUY/Yi5tYXguYXBwbHkoYixwKStiLm1heC5hcHBseShiLHEpOkMtQix0aGlzLmNhbnZhc0hlaWdodEVmPXomJjA+Qj90aGlzLmNhbnZhc0hlaWdodC0yOnRoaXMuY2FudmFzSGVpZ2h0LTEsQT5CPyhNPUYmJkM+PTA/VDpDLEw9KE0tQSkveCp0aGlzLmNhbnZhc0hlaWdodCxMIT09Yi5jZWlsKEwpJiYodGhpcy5jYW52YXNIZWlnaHRFZi09MixMPWIuY2VpbChMKSkpOkw9dGhpcy5jYW52YXNIZWlnaHQsdGhpcy55b2Zmc2V0PUwsdGhpcy5pbml0Q29sb3JNYXAoKSx0aGlzLnJhbmdlPXh9LGdldFJlZ2lvbjpmdW5jdGlvbihhLGQsZSl7ZC89dGhpcy54U2NhbGU7dmFyIGY9Yi5mbG9vcihkL3RoaXMudG90YWxCYXJXaWR0aCk7cmV0dXJuIDA+Znx8Zj49dGhpcy52YWx1ZXMubGVuZ3RoP2M6Zn0sZ2V0Q3VycmVudFJlZ2lvbkZpZWxkczpmdW5jdGlvbigpe3ZhciBhLGIsYz10aGlzLmN1cnJlbnRSZWdpb24sZD1yKHRoaXMudmFsdWVzW2NdKSxlPVtdO2ZvcihiPWQubGVuZ3RoO2ItLTspYT1kW2JdLGUucHVzaCh7aXNOdWxsOm51bGw9PT1hLHZhbHVlOmEsY29sb3I6dGhpcy5jYWxjQ29sb3IoYixhLGMpLG9mZnNldDpjfSk7cmV0dXJuIGV9LGNhbGNDb2xvcjpmdW5jdGlvbihhLGIsZSl7dmFyIGYsZyxoPXRoaXMuY29sb3JNYXBGdW5jdGlvbixpPXRoaXMub3B0aW9ucztyZXR1cm4gaCYmKGc9aCh0aGlzLGksZSxiKSk/Zj1nOihmPXRoaXMuc3RhY2tlZD9pLmdldCgic3RhY2tlZEJhckNvbG9yIik6MD5iP2kuZ2V0KCJuZWdCYXJDb2xvciIpOmkuZ2V0KCJiYXJDb2xvciIpLDA9PT1iJiZpLmdldCgiemVyb0NvbG9yIikhPT1jJiYoZj1pLmdldCgiemVyb0NvbG9yIikpKSxkLmlzQXJyYXkoZik/ZlthJWYubGVuZ3RoXTpmfSxyZW5kZXJSZWdpb246ZnVuY3Rpb24oYSxlKXt2YXIgZixnLGgsaSxqLGssbCxtLG4scCxxPXRoaXMudmFsdWVzW2FdLHI9dGhpcy5vcHRpb25zLHM9dGhpcy54YXhpc09mZnNldCx0PVtdLHU9dGhpcy5yYW5nZSx2PXRoaXMuc3RhY2tlZCx3PXRoaXMudGFyZ2V0LHg9YSp0aGlzLnRvdGFsQmFyV2lkdGgseT10aGlzLmNhbnZhc0hlaWdodEVmLHo9dGhpcy55b2Zmc2V0O2lmKHE9ZC5pc0FycmF5KHEpP3E6W3FdLGw9cS5sZW5ndGgsbT1xWzBdLGk9byhudWxsLHEpLHA9byhzLHEsITApLGkpcmV0dXJuIHIuZ2V0KCJudWxsQ29sb3IiKT8oaD1lP3IuZ2V0KCJudWxsQ29sb3IiKTp0aGlzLmNhbGNIaWdobGlnaHRDb2xvcihyLmdldCgibnVsbENvbG9yIiksciksZj16PjA/ei0xOnosdy5kcmF3UmVjdCh4LGYsdGhpcy5iYXJXaWR0aC0xLDAsaCxoKSk6Yztmb3Ioaj16LGs9MDtsPms7aysrKXtpZihtPXFba10sdiYmbT09PXMpe2lmKCFwfHxuKWNvbnRpbnVlO249ITB9Zz11PjA/Yi5mbG9vcih5KihiLmFicyhtLXMpL3UpKSsxOjEscz5tfHxtPT09cyYmMD09PXo/KGY9aixqKz1nKTooZj16LWcsei09ZyksaD10aGlzLmNhbGNDb2xvcihrLG0sYSksZSYmKGg9dGhpcy5jYWxjSGlnaGxpZ2h0Q29sb3IoaCxyKSksdC5wdXNoKHcuZHJhd1JlY3QoeCp0aGlzLnhTY2FsZSxmLCh0aGlzLmJhcldpZHRoLTEpKnRoaXMueFNjYWxlLGctMSxoLGgpKX1yZXR1cm4gMT09PXQubGVuZ3RoP3RbMF06dH19KSxkLmZuLnNwYXJrbGluZS5zdGFjaz1EPWYoZC5mbi5zcGFya2xpbmUuX2Jhc2Use3R5cGU6InN0YWNrIixpbml0OmZ1bmN0aW9uKGEsYixjLGUsZil7dmFyIGcsaD0wO2lmKEQuX3N1cGVyLmluaXQuY2FsbCh0aGlzLGEsYixjLGUsZiksdGhpcy5zaGFwZXM9e30sdGhpcy52YWx1ZVNoYXBlcz17fSx0aGlzLnZhbHVlcz1iPWQubWFwKGIsTnVtYmVyKSwiYXV0byI9PT1jLmdldCgid2lkdGgiKSYmKHRoaXMud2lkdGg9dGhpcy5oZWlnaHQpLGIubGVuZ3RoPjApZm9yKGc9Yi5sZW5ndGg7Zy0tOyloKz1iW2ddO3RoaXMudG90YWw9aCx0aGlzLmluaXRUYXJnZXQoKSx0aGlzLmhlaWdodD10aGlzLmNhbnZhc0hlaWdodCx0aGlzLndpZHRoPXRoaXMuY2FudmFzV2lkdGh9LGdldFJlZ2lvbjpmdW5jdGlvbihhLGIsZCl7dmFyIGU9dGhpcy50YXJnZXQuZ2V0U2hhcGVBdChhLGIsZCk7cmV0dXJuIGUhPT1jJiZ0aGlzLnNoYXBlc1tlXSE9PWM/dGhpcy5zaGFwZXNbZV06Y30sZ2V0Q3VycmVudFJlZ2lvbkZpZWxkczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY3VycmVudFJlZ2lvbjtyZXR1cm57aXNOdWxsOnRoaXMudmFsdWVzW2FdPT09Yyx2YWx1ZTp0aGlzLnZhbHVlc1thXSxwZXJjZW50OnRoaXMudmFsdWVzW2FdL3RoaXMudG90YWwqMTAwLGNvbG9yOnRoaXMub3B0aW9ucy5nZXQoInNsaWNlQ29sb3JzIilbYSV0aGlzLm9wdGlvbnMuZ2V0KCJzbGljZUNvbG9ycyIpLmxlbmd0aF0sb2Zmc2V0OmF9fSxjaGFuZ2VIaWdobGlnaHQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jdXJyZW50UmVnaW9uLGM9dGhpcy5yZW5kZXJTbGljZShiLGEpLGQ9dGhpcy52YWx1ZVNoYXBlc1tiXTtkZWxldGUgdGhpcy5zaGFwZXNbZF0sdGhpcy50YXJnZXQucmVwbGFjZVdpdGhTaGFwZShkLGMpLHRoaXMudmFsdWVTaGFwZXNbYl09Yy5pZCx0aGlzLnNoYXBlc1tjLmlkXT1ifSxyZW5kZXJTbGljZTpmdW5jdGlvbihhLGQpe3ZhciBlLGYsZyxoPXRoaXMudGFyZ2V0LGk9dGhpcy5vcHRpb25zLGo9dGhpcy5oZWlnaHQsaz10aGlzLndpZHRoLGw9dGhpcy52YWx1ZXMsbT10aGlzLnRvdGFsLG49MCxvPTA7Zm9yKGY9bC5sZW5ndGgsZT0wO2Y+ZTtlKyspe249bzt2YXIgcD1iLnJvdW5kKGxbZV0qay9tKTtpZihhPT09ZSlyZXR1cm4gZz1pLmdldCgic2xpY2VDb2xvcnMiKVtlJWkuZ2V0KCJzbGljZUNvbG9ycyIpLmxlbmd0aF0sZCYmKGc9dGhpcy5jYWxjSGlnaGxpZ2h0Q29sb3IoZyxpKSksaC5kcmF3UmVjdChuLDAscCxqLGMsZyk7bys9cH19LHJlbmRlcjpmdW5jdGlvbigpe3ZhciBhLGIsYz10aGlzLnRhcmdldCxkPXRoaXMudmFsdWVzLGU9dGhpcy5vcHRpb25zO2UuZ2V0KCJib3JkZXJXaWR0aCIpO2lmKEQuX3N1cGVyLnJlbmRlci5jYWxsKHRoaXMpKXtmb3IoYj0wO2I8ZC5sZW5ndGg7YisrKWRbYl0mJihhPXRoaXMucmVuZGVyU2xpY2UoYikuYXBwZW5kKCksdGhpcy52YWx1ZVNoYXBlc1tiXT1hLmlkLHRoaXMuc2hhcGVzW2EuaWRdPWIpO2MucmVuZGVyKCl9fX0pLGQuZm4uc3BhcmtsaW5lLnRyaXN0YXRlPXo9ZihkLmZuLnNwYXJrbGluZS5fYmFzZSx3LHt0eXBlOiJ0cmlzdGF0ZSIsaW5pdDpmdW5jdGlvbihhLGMsZSxmLGcpe3ZhciBoPXBhcnNlSW50KGUuZ2V0KCJiYXJXaWR0aCIpLDEwKSxpPXBhcnNlSW50KGUuZ2V0KCJiYXJTcGFjaW5nIiksMTApO3ouX3N1cGVyLmluaXQuY2FsbCh0aGlzLGEsYyxlLGYsZyksdGhpcy5yZWdpb25TaGFwZXM9e30sdGhpcy5iYXJXaWR0aD1oLHRoaXMuYmFyU3BhY2luZz1pLHRoaXMudG90YWxCYXJXaWR0aD1oK2ksdGhpcy52YWx1ZXM9ZC5tYXAoYyxOdW1iZXIpO3ZhciBqPWMubGVuZ3RoKmgrKGMubGVuZ3RoLTEpKmk7dGhpcy54U2NhbGU9Yi5taW4oMSxqP2YvajoxKSx0aGlzLndpZHRoPWoqdGhpcy54U2NhbGUsdGhpcy5pbml0Q29sb3JNYXAoKSx0aGlzLmluaXRUYXJnZXQoKX0sZ2V0UmVnaW9uOmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gYi5mbG9vcihjL3RoaXMudG90YWxCYXJXaWR0aCl9LGdldEN1cnJlbnRSZWdpb25GaWVsZHM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmN1cnJlbnRSZWdpb247cmV0dXJue2lzTnVsbDp0aGlzLnZhbHVlc1thXT09PWMsdmFsdWU6dGhpcy52YWx1ZXNbYV0sY29sb3I6dGhpcy5jYWxjQ29sb3IodGhpcy52YWx1ZXNbYV0sYSksb2Zmc2V0OmF9fSxjYWxjQ29sb3I6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9dGhpcy5vcHRpb25zLGY9dGhpcy5jb2xvck1hcEZ1bmN0aW9uO3JldHVybiBjPWYmJihkPWYodGhpcyxlLGIsYSkpP2Q6MD5hP2UuZ2V0KCJuZWdCYXJDb2xvciIpOmE+MD9lLmdldCgicG9zQmFyQ29sb3IiKTplLmdldCgiemVyb0JhckNvbG9yIil9LHJlbmRlclJlZ2lvbjpmdW5jdGlvbihhLGMpe3ZhciBkLGUsZixnLGgsaSxqPXRoaXMudmFsdWVzLGs9dGhpcy5vcHRpb25zLGw9dGhpcy50YXJnZXQ7cmV0dXJuIGQ9bC5waXhlbEhlaWdodCxmPWIucm91bmQoZC8yKSxnPWEqdGhpcy50b3RhbEJhcldpZHRoLGpbYV08MD8oaD1mLGU9Zi0xKTpqW2FdPjA/KGg9MCxlPWYtMSk6KGg9Zi0xLGU9MiksaT10aGlzLmNhbGNDb2xvcihqW2FdLGEpLG51bGwhPT1pPyhjJiYoaT10aGlzLmNhbGNIaWdobGlnaHRDb2xvcihpLGspKSxsLmRyYXdSZWN0KGcqdGhpcy54U2NhbGUsaCwodGhpcy5iYXJXaWR0aC0xKSp0aGlzLnhTY2FsZSxlLTEsaSxpKSk6dm9pZCAwfX0pLGQuZm4uc3BhcmtsaW5lLmRpc2NyZXRlPUE9ZihkLmZuLnNwYXJrbGluZS5fYmFzZSx3LHt0eXBlOiJkaXNjcmV0ZSIsaW5pdDpmdW5jdGlvbihhLGUsZixnLGgpe0EuX3N1cGVyLmluaXQuY2FsbCh0aGlzLGEsZSxmLGcsaCksdGhpcy5yZWdpb25TaGFwZXM9e30sdGhpcy52YWx1ZXM9ZT1kLm1hcChlLE51bWJlciksdGhpcy5taW49Yi5taW4uYXBwbHkoYixlKSx0aGlzLm1heD1iLm1heC5hcHBseShiLGUpLHRoaXMucmFuZ2U9dGhpcy5tYXgtdGhpcy5taW4sdGhpcy53aWR0aD1nPSJhdXRvIj09PWYuZ2V0KCJ3aWR0aCIpPzIqZS5sZW5ndGg6dGhpcy53aWR0aCx0aGlzLmludGVydmFsPWIuZmxvb3IoZy9lLmxlbmd0aCksdGhpcy5pdGVtV2lkdGg9Zy9lLmxlbmd0aCxmLmdldCgiY2hhcnRSYW5nZU1pbiIpIT09YyYmKGYuZ2V0KCJjaGFydFJhbmdlQ2xpcCIpfHxmLmdldCgiY2hhcnRSYW5nZU1pbiIpPHRoaXMubWluKSYmKHRoaXMubWluPWYuZ2V0KCJjaGFydFJhbmdlTWluIikpLGYuZ2V0KCJjaGFydFJhbmdlTWF4IikhPT1jJiYoZi5nZXQoImNoYXJ0UmFuZ2VDbGlwIil8fGYuZ2V0KCJjaGFydFJhbmdlTWF4Iik+dGhpcy5tYXgpJiYodGhpcy5tYXg9Zi5nZXQoImNoYXJ0UmFuZ2VNYXgiKSksdGhpcy5pbml0VGFyZ2V0KCksdGhpcy50YXJnZXQmJih0aGlzLmxpbmVIZWlnaHQ9ImF1dG8iPT09Zi5nZXQoImxpbmVIZWlnaHQiKT9iLnJvdW5kKC4zKnRoaXMuY2FudmFzSGVpZ2h0KTpmLmdldCgibGluZUhlaWdodCIpKX0sZ2V0UmVnaW9uOmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gYi5mbG9vcihjL3RoaXMuaXRlbVdpZHRoKX0sZ2V0Q3VycmVudFJlZ2lvbkZpZWxkczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY3VycmVudFJlZ2lvbjtyZXR1cm57aXNOdWxsOnRoaXMudmFsdWVzW2FdPT09Yyx2YWx1ZTp0aGlzLnZhbHVlc1thXSxvZmZzZXQ6YX19LHJlbmRlclJlZ2lvbjpmdW5jdGlvbihhLGMpe3ZhciBkLGUsZixnLGk9dGhpcy52YWx1ZXMsaj10aGlzLm9wdGlvbnMsaz10aGlzLm1pbixsPXRoaXMubWF4LG09dGhpcy5yYW5nZSxuPXRoaXMuaW50ZXJ2YWwsbz10aGlzLnRhcmdldCxwPXRoaXMuY2FudmFzSGVpZ2h0LHE9dGhpcy5saW5lSGVpZ2h0LHI9cC1xO3JldHVybiBlPWgoaVthXSxrLGwpLGc9YSpuLGQ9Yi5yb3VuZChyLXIqKChlLWspL20pKSxmPWouZ2V0KCJ0aHJlc2hvbGRDb2xvciIpJiZlPGouZ2V0KCJ0aHJlc2hvbGRWYWx1ZSIpP2ouZ2V0KCJ0aHJlc2hvbGRDb2xvciIpOmouZ2V0KCJsaW5lQ29sb3IiKSxjJiYoZj10aGlzLmNhbGNIaWdobGlnaHRDb2xvcihmLGopKSxvLmRyYXdMaW5lKGcsZCxnLGQrcSxmKX19KSxkLmZuLnNwYXJrbGluZS5idWxsZXQ9Qj1mKGQuZm4uc3BhcmtsaW5lLl9iYXNlLHt0eXBlOiJidWxsZXQiLGluaXQ6ZnVuY3Rpb24oYSxkLGUsZixnKXt2YXIgaCxpLGo7Qi5fc3VwZXIuaW5pdC5jYWxsKHRoaXMsYSxkLGUsZixnKSx0aGlzLnZhbHVlcz1kPWwoZCksaj1kLnNsaWNlKCksalswXT1udWxsPT09alswXT9qWzJdOmpbMF0salsxXT1udWxsPT09ZFsxXT9qWzJdOmpbMV0saD1iLm1pbi5hcHBseShiLGQpLGk9Yi5tYXguYXBwbHkoYixkKSxoPWUuZ2V0KCJiYXNlIik9PT1jPzA+aD9oOjA6ZS5nZXQoImJhc2UiKSx0aGlzLm1pbj1oLHRoaXMubWF4PWksdGhpcy5yYW5nZT1pLWg7dmFyIGs9ZS5nZXQoInJhbmdlQ29sb3JzIik7aWYoZS5nZXQoImdyYWRpZW50IikmJmsubGVuZ3RoPjEpe3ZhciBtPW5ldyBSYWluYm93O20uc2V0U3BlY3RydW1CeUFycmF5KGspLG0uc2V0TnVtYmVyUmFuZ2UoMCx0aGlzLnZhbHVlcy5sZW5ndGgpOw0KZm9yKHZhciBuPTA7bjx0aGlzLnZhbHVlcy5sZW5ndGg7bisrKWtbbl09bS5jb2xvckF0KG4pfXRoaXMucmFuZ2VDb2xvcnM9ayx0aGlzLnNoYXBlcz17fSx0aGlzLnZhbHVlU2hhcGVzPXt9LHRoaXMucmVnaW9uZGF0YT17fSx0aGlzLndpZHRoPWY9ImF1dG8iPT09ZS5nZXQoIndpZHRoIik/IjQuMGVtIjpmLHRoaXMudGFyZ2V0PXRoaXMuJGVsLnNpbXBsZWRyYXcoZixnLGUuZ2V0KCJjb21wb3NpdGUiKSksZC5sZW5ndGh8fCh0aGlzLmRpc2FibGVkPSEwKSx0aGlzLmluaXRUYXJnZXQoKX0sZ2V0UmVnaW9uOmZ1bmN0aW9uKGEsYixkKXt2YXIgZT10aGlzLnRhcmdldC5nZXRTaGFwZUF0KGEsYixkKTtyZXR1cm4gZSE9PWMmJnRoaXMuc2hhcGVzW2VdIT09Yz90aGlzLnNoYXBlc1tlXTpjfSxnZXRDdXJyZW50UmVnaW9uRmllbGRzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5jdXJyZW50UmVnaW9uO3JldHVybntmaWVsZGtleTphLnN1YnN0cigwLDEpLHZhbHVlOnRoaXMudmFsdWVzW2Euc3Vic3RyKDEpXSxyZWdpb246YX19LGNoYW5nZUhpZ2hsaWdodDpmdW5jdGlvbihhKXt2YXIgYixjPXRoaXMuY3VycmVudFJlZ2lvbixkPXRoaXMudmFsdWVTaGFwZXNbY107c3dpdGNoKGRlbGV0ZSB0aGlzLnNoYXBlc1tkXSxjLnN1YnN0cigwLDEpKXtjYXNlInIiOmI9dGhpcy5yZW5kZXJSYW5nZShjLnN1YnN0cigxKSxhKTticmVhaztjYXNlInAiOmI9dGhpcy5yZW5kZXJQZXJmb3JtYW5jZShhKTticmVhaztjYXNlInQiOmI9dGhpcy5yZW5kZXJUYXJnZXQoYSl9dGhpcy52YWx1ZVNoYXBlc1tjXT1iLmlkLHRoaXMuc2hhcGVzW2IuaWRdPWMsdGhpcy50YXJnZXQucmVwbGFjZVdpdGhTaGFwZShkLGIpfSxyZW5kZXJSYW5nZTpmdW5jdGlvbihhLGMpe3ZhciBkPXRoaXMudmFsdWVzW2FdLGU9Yi5yb3VuZCh0aGlzLmNhbnZhc1dpZHRoKigoZC10aGlzLm1pbikvdGhpcy5yYW5nZSkpLGY9dGhpcy5yYW5nZUNvbG9yc1thLTJdO3JldHVybiBjJiYoZj10aGlzLmNhbGNIaWdobGlnaHRDb2xvcihmLHRoaXMub3B0aW9ucykpLHRoaXMudGFyZ2V0LmRyYXdSZWN0KDAsMCxlLTEsdGhpcy5jYW52YXNIZWlnaHQtMSxmLGYpfSxyZW5kZXJQZXJmb3JtYW5jZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnZhbHVlc1sxXSxkPWIucm91bmQodGhpcy5jYW52YXNXaWR0aCooKGMtdGhpcy5taW4pL3RoaXMucmFuZ2UpKSxlPXRoaXMub3B0aW9ucy5nZXQoInBlcmZvcm1hbmNlQ29sb3IiKTtyZXR1cm4gYSYmKGU9dGhpcy5jYWxjSGlnaGxpZ2h0Q29sb3IoZSx0aGlzLm9wdGlvbnMpKSx0aGlzLnRhcmdldC5kcmF3UmVjdCgwLGIucm91bmQoLjMqdGhpcy5jYW52YXNIZWlnaHQpLGQtMSxiLnJvdW5kKC40KnRoaXMuY2FudmFzSGVpZ2h0KS0xLGUsZSl9LHJlbmRlclRhcmdldDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnZhbHVlc1swXSxkPWIucm91bmQodGhpcy5jYW52YXNXaWR0aCooKGMtdGhpcy5taW4pL3RoaXMucmFuZ2UpLXRoaXMub3B0aW9ucy5nZXQoInRhcmdldFdpZHRoIikvMiksZT1iLnJvdW5kKC4xKnRoaXMuY2FudmFzSGVpZ2h0KSxmPXRoaXMuY2FudmFzSGVpZ2h0LTIqZSxnPXRoaXMub3B0aW9ucy5nZXQoInRhcmdldENvbG9yIik7cmV0dXJuIGEmJihnPXRoaXMuY2FsY0hpZ2hsaWdodENvbG9yKGcsdGhpcy5vcHRpb25zKSksdGhpcy50YXJnZXQuZHJhd1JlY3QoZCxlLHRoaXMub3B0aW9ucy5nZXQoInRhcmdldFdpZHRoIiktMSxmLTEsZyxnKX0scmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGEsYixjPXRoaXMudmFsdWVzLmxlbmd0aCxkPXRoaXMudGFyZ2V0O2lmKEIuX3N1cGVyLnJlbmRlci5jYWxsKHRoaXMpKXtmb3IoYT0yO2M+YTthKyspYj10aGlzLnJlbmRlclJhbmdlKGEpLmFwcGVuZCgpLHRoaXMuc2hhcGVzW2IuaWRdPSJyIithLHRoaXMudmFsdWVTaGFwZXNbInIiK2FdPWIuaWQ7bnVsbCE9PXRoaXMudmFsdWVzWzFdJiYoYj10aGlzLnJlbmRlclBlcmZvcm1hbmNlKCkuYXBwZW5kKCksdGhpcy5zaGFwZXNbYi5pZF09InAxIix0aGlzLnZhbHVlU2hhcGVzLnAxPWIuaWQpLG51bGwhPT10aGlzLnZhbHVlc1swXSYmKGI9dGhpcy5yZW5kZXJUYXJnZXQoKS5hcHBlbmQoKSx0aGlzLnNoYXBlc1tiLmlkXT0idDAiLHRoaXMudmFsdWVTaGFwZXMudDA9Yi5pZCksZC5yZW5kZXIoKX19fSksZC5mbi5zcGFya2xpbmUucGllPUM9ZihkLmZuLnNwYXJrbGluZS5fYmFzZSx7dHlwZToicGllIixpbml0OmZ1bmN0aW9uKGEsYyxlLGYsZyl7dmFyIGgsaT0wO2lmKEMuX3N1cGVyLmluaXQuY2FsbCh0aGlzLGEsYyxlLGYsZyksdGhpcy5zaGFwZXM9e30sdGhpcy52YWx1ZVNoYXBlcz17fSx0aGlzLnZhbHVlcz1jPWQubWFwKGMsTnVtYmVyKSwiYXV0byI9PT1lLmdldCgid2lkdGgiKSYmKHRoaXMud2lkdGg9dGhpcy5oZWlnaHQpLGMubGVuZ3RoPjApZm9yKGg9Yy5sZW5ndGg7aC0tOylpKz1jW2hdO3RoaXMudG90YWw9aSx0aGlzLmluaXRUYXJnZXQoKSx0aGlzLnJhZGl1cz1iLmZsb29yKGIubWluKHRoaXMuY2FudmFzV2lkdGgsdGhpcy5jYW52YXNIZWlnaHQpLzIpfSxnZXRSZWdpb246ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPXRoaXMudGFyZ2V0LmdldFNoYXBlQXQoYSxiLGQpO3JldHVybiBlIT09YyYmdGhpcy5zaGFwZXNbZV0hPT1jP3RoaXMuc2hhcGVzW2VdOmN9LGdldEN1cnJlbnRSZWdpb25GaWVsZHM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmN1cnJlbnRSZWdpb247cmV0dXJue2lzTnVsbDp0aGlzLnZhbHVlc1thXT09PWMsdmFsdWU6dGhpcy52YWx1ZXNbYV0scGVyY2VudDp0aGlzLnZhbHVlc1thXS90aGlzLnRvdGFsKjEwMCxjb2xvcjp0aGlzLm9wdGlvbnMuZ2V0KCJzbGljZUNvbG9ycyIpW2EldGhpcy5vcHRpb25zLmdldCgic2xpY2VDb2xvcnMiKS5sZW5ndGhdLG9mZnNldDphfX0sY2hhbmdlSGlnaGxpZ2h0OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY3VycmVudFJlZ2lvbixjPXRoaXMucmVuZGVyU2xpY2UoYixhKSxkPXRoaXMudmFsdWVTaGFwZXNbYl07ZGVsZXRlIHRoaXMuc2hhcGVzW2RdLHRoaXMudGFyZ2V0LnJlcGxhY2VXaXRoU2hhcGUoZCxjKSx0aGlzLnZhbHVlU2hhcGVzW2JdPWMuaWQsdGhpcy5zaGFwZXNbYy5pZF09Yn0scmVuZGVyU2xpY2U6ZnVuY3Rpb24oYSxkKXt2YXIgZSxmLGcsaCxpLGo9dGhpcy50YXJnZXQsaz10aGlzLm9wdGlvbnMsbD10aGlzLnJhZGl1cyxtPWsuZ2V0KCJib3JkZXJXaWR0aCIpLG49ay5nZXQoIm9mZnNldCIpLG89MipiLlBJLHA9dGhpcy52YWx1ZXMscT10aGlzLnRvdGFsLHI9bj8yKmIuUEkqKG4vMzYwKTowO2ZvcihoPXAubGVuZ3RoLGc9MDtoPmc7ZysrKXtpZihlPXIsZj1yLHE+MCYmKGY9citvKihwW2ddL3EpKSxhPT09ZylyZXR1cm4gaT1rLmdldCgic2xpY2VDb2xvcnMiKVtnJWsuZ2V0KCJzbGljZUNvbG9ycyIpLmxlbmd0aF0sZCYmKGk9dGhpcy5jYWxjSGlnaGxpZ2h0Q29sb3IoaSxrKSksai5kcmF3UGllU2xpY2UobCxsLGwtbSxlLGYsYyxpKTtyPWZ9fSxyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgYSxkLGU9dGhpcy50YXJnZXQsZj10aGlzLnZhbHVlcyxnPXRoaXMub3B0aW9ucyxoPXRoaXMucmFkaXVzLGk9Zy5nZXQoImJvcmRlcldpZHRoIik7aWYoQy5fc3VwZXIucmVuZGVyLmNhbGwodGhpcykpe2ZvcihpJiZlLmRyYXdDaXJjbGUoaCxoLGIuZmxvb3IoaC1pLzIpLGcuZ2V0KCJib3JkZXJDb2xvciIpLGMsaSkuYXBwZW5kKCksZD1mLmxlbmd0aDtkLS07KWZbZF0mJihhPXRoaXMucmVuZGVyU2xpY2UoZCkuYXBwZW5kKCksdGhpcy52YWx1ZVNoYXBlc1tkXT1hLmlkLHRoaXMuc2hhcGVzW2EuaWRdPWQpO2UucmVuZGVyKCl9fX0pLGQuZm4uc3BhcmtsaW5lLmJveD1FPWYoZC5mbi5zcGFya2xpbmUuX2Jhc2Use3R5cGU6ImJveCIsaW5pdDpmdW5jdGlvbihhLGIsYyxlLGYpe0UuX3N1cGVyLmluaXQuY2FsbCh0aGlzLGEsYixjLGUsZiksdGhpcy52YWx1ZXM9ZC5tYXAoYixOdW1iZXIpLHRoaXMud2lkdGg9ImF1dG8iPT09Yy5nZXQoIndpZHRoIik/IjQuMGVtIjplLHRoaXMuaW5pdFRhcmdldCgpLHRoaXMudmFsdWVzLmxlbmd0aHx8KHRoaXMuZGlzYWJsZWQ9MSl9LGdldFJlZ2lvbjpmdW5jdGlvbigpe3JldHVybiAxfSxnZXRDdXJyZW50UmVnaW9uRmllbGRzOmZ1bmN0aW9uKCl7dmFyIGE9W3tmaWVsZDoibHEiLHZhbHVlOnRoaXMucXVhcnRpbGVzWzBdfSx7ZmllbGQ6Im1lZCIsdmFsdWU6dGhpcy5xdWFydGlsZXNbMV19LHtmaWVsZDoidXEiLHZhbHVlOnRoaXMucXVhcnRpbGVzWzJdfV07cmV0dXJuIHRoaXMubG91dGxpZXIhPT1jJiZhLnB1c2goe2ZpZWxkOiJsbyIsdmFsdWU6dGhpcy5sb3V0bGllcn0pLHRoaXMucm91dGxpZXIhPT1jJiZhLnB1c2goe2ZpZWxkOiJybyIsdmFsdWU6dGhpcy5yb3V0bGllcn0pLHRoaXMubHdoaXNrZXIhPT1jJiZhLnB1c2goe2ZpZWxkOiJsdyIsdmFsdWU6dGhpcy5sd2hpc2tlcn0pLHRoaXMucndoaXNrZXIhPT1jJiZhLnB1c2goe2ZpZWxkOiJydyIsdmFsdWU6dGhpcy5yd2hpc2tlcn0pLGF9LHJlbmRlcjpmdW5jdGlvbigpe3ZhciBhLGQsZSxmLGcsaCxpLGssbCxtLG4sbyxwPXRoaXMudGFyZ2V0LHE9dGhpcy52YWx1ZXMscj1xLmxlbmd0aCxzPXRoaXMub3B0aW9ucyx0PXRoaXMuY2FudmFzV2lkdGgsdT10aGlzLmNhbnZhc0hlaWdodCx2PXMuZ2V0KCJjaGFydFJhbmdlTWluIik9PT1jP2IubWluLmFwcGx5KGIscSk6cy5nZXQoImNoYXJ0UmFuZ2VNaW4iKSx3PXMuZ2V0KCJjaGFydFJhbmdlTWF4Iik9PT1jP2IubWF4LmFwcGx5KGIscSk6cy5nZXQoImNoYXJ0UmFuZ2VNYXgiKSx4PTA7aWYoRS5fc3VwZXIucmVuZGVyLmNhbGwodGhpcykpe2lmKHMuZ2V0KCJyYXciKSlzLmdldCgic2hvd091dGxpZXJzIikmJnEubGVuZ3RoPjU/KGQ9cVswXSxhPXFbMV0sZj1xWzJdLGc9cVszXSxoPXFbNF0saT1xWzVdLGs9cVs2XSk6KGE9cVswXSxmPXFbMV0sZz1xWzJdLGg9cVszXSxpPXFbNF0pO2Vsc2UgaWYocS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEtYn0pLGY9aihxLDEpLGc9aihxLDIpLGg9aihxLDMpLGU9aC1mLHMuZ2V0KCJzaG93T3V0bGllcnMiKSl7Zm9yKGE9aT1jLGw9MDtyPmw7bCsrKWE9PT1jJiZxW2xdPmYtZSpzLmdldCgib3V0bGllcklRUiIpJiYoYT1xW2xdKSxxW2xdPGgrZSpzLmdldCgib3V0bGllcklRUiIpJiYoaT1xW2xdKTtkPXFbMF0saz1xW3ItMV19ZWxzZSBhPXFbMF0saT1xW3ItMV07dGhpcy5xdWFydGlsZXM9W2YsZyxoXSx0aGlzLmx3aGlza2VyPWEsdGhpcy5yd2hpc2tlcj1pLHRoaXMubG91dGxpZXI9ZCx0aGlzLnJvdXRsaWVyPWssbz0wLHctdj09MCYmKG89MSksbj10Lyh3LXYrbykscy5nZXQoInNob3dPdXRsaWVycyIpJiYoeD1iLmNlaWwocy5nZXQoInNwb3RSYWRpdXMiKSksdC09MipiLmNlaWwocy5nZXQoInNwb3RSYWRpdXMiKSksbj10Lyh3LXYrbyksYT5kJiZwLmRyYXdDaXJjbGUoKGQtdikqbit4LHUvMixzLmdldCgic3BvdFJhZGl1cyIpLHMuZ2V0KCJvdXRsaWVyTGluZUNvbG9yIikscy5nZXQoIm91dGxpZXJGaWxsQ29sb3IiKSkuYXBwZW5kKCksaz5pJiZwLmRyYXdDaXJjbGUoKGstdikqbit4LHUvMixzLmdldCgic3BvdFJhZGl1cyIpLHMuZ2V0KCJvdXRsaWVyTGluZUNvbG9yIikscy5nZXQoIm91dGxpZXJGaWxsQ29sb3IiKSkuYXBwZW5kKCkpLHAuZHJhd1JlY3QoYi5yb3VuZCgoZi12KSpuK3gpLGIucm91bmQoLjEqdSksYi5yb3VuZCgoaC1mKSpuKSxiLnJvdW5kKC44KnUpLHMuZ2V0KCJib3hMaW5lQ29sb3IiKSxzLmdldCgiYm94RmlsbENvbG9yIikscy5nZXQoImxpbmVXaWR0aCIpLHMuZ2V0KCJjb3JuZXJSYWRpdXMiKSkuYXBwZW5kKCk7dmFyIHk9Zi12O2lmKHMuZ2V0KCJzdHJpa2VUaHJvdWdoIikmJih5PWktdikscC5kcmF3TGluZShiLnJvdW5kKChhLXYpKm4reCksYi5yb3VuZCh1LzIpLGIucm91bmQoeSpuK3gpLGIucm91bmQodS8yKSxzLmdldCgibGluZUNvbG9yIikscy5nZXQoImxpbmVXaWR0aCIpKS5hcHBlbmQoKSxwLmRyYXdMaW5lKGIucm91bmQoKGEtdikqbit4KSxiLnJvdW5kKHUvNCksYi5yb3VuZCgoYS12KSpuK3gpLGIucm91bmQodS11LzQpLHMuZ2V0KCJ3aGlza2VyQ29sb3IiKSxzLmdldCgibGluZVdpZHRoIikpLmFwcGVuZCgpLHMuZ2V0KCJzdHJpa2VUaHJvdWdoIil8fHAuZHJhd0xpbmUoYi5yb3VuZCgoaS12KSpuK3gpLGIucm91bmQodS8yKSxiLnJvdW5kKChoLXYpKm4reCksYi5yb3VuZCh1LzIpLHMuZ2V0KCJsaW5lQ29sb3IiKSxzLmdldCgibGluZVdpZHRoIikpLmFwcGVuZCgpLHAuZHJhd0xpbmUoYi5yb3VuZCgoaS12KSpuK3gpLGIucm91bmQodS80KSxiLnJvdW5kKChpLXYpKm4reCksYi5yb3VuZCh1LXUvNCkscy5nZXQoIndoaXNrZXJDb2xvciIpLHMuZ2V0KCJsaW5lV2lkdGgiKSkuYXBwZW5kKCkscC5kcmF3TGluZShiLnJvdW5kKChnLXYpKm4reCksYi5yb3VuZCguMSp1KSxiLnJvdW5kKChnLXYpKm4reCksYi5yb3VuZCguOSp1KSxzLmdldCgibWVkaWFuQ29sb3IiKSxzLmdldCgibWVkaWFuV2lkdGgiKSkuYXBwZW5kKCksIm51bWJlciI9PXR5cGVvZiBzLmdldCgidGFyZ2V0Iikpe209Yi5jZWlsKHMuZ2V0KCJzcG90UmFkaXVzIikpO3ZhciB6PXMuZ2V0KCJ0YXJnZXQiKSxBPXMuZ2V0KCJ0YXJnZXRPYmoiKTtBJiYiY3Jvc3NoYWlyIiE9QT8iY2lyY2xlIj09QSYmcC5kcmF3Q2lyY2xlKCh6LXYpKm4reCx1LzIscy5nZXQoInNwb3RSYWRpdXMiKSxzLmdldCgidGFyZ2V0Q29sb3IiKSxzLmdldCgidGFyZ2V0Q29sb3IiKSkuYXBwZW5kKCk6KHAuZHJhd0xpbmUoYi5yb3VuZCgoei12KSpuK3gpLGIucm91bmQodS8yLW0pLGIucm91bmQoKHotdikqbit4KSxiLnJvdW5kKHUvMittKSxzLmdldCgidGFyZ2V0Q29sb3IiKSkuYXBwZW5kKCkscC5kcmF3TGluZShiLnJvdW5kKCh6LXYpKm4reC1tKSxiLnJvdW5kKHUvMiksYi5yb3VuZCgoei12KSpuK3grbSksYi5yb3VuZCh1LzIpLHMuZ2V0KCJ0YXJnZXRDb2xvciIpKS5hcHBlbmQoKSl9cC5yZW5kZXIoKX19fSksZnVuY3Rpb24oYSl7YS5mbi5zcGFya2xpbmUudGltZWxpbmU9Rj1mKGEuZm4uc3BhcmtsaW5lLl9iYXNlLHcse3R5cGU6InRpbWVsaW5lIixpbml0OmZ1bmN0aW9uKGMsZCxlLGYsZyl7ZnVuY3Rpb24gaChhKXtyZXR1cm4gYS82ZTR9ZnVuY3Rpb24gaShhKXtyZXR1cm4gYT1iLmFicyhhKSxpc05hTihhKT8wOmF9ZnVuY3Rpb24gaihhLGMpe3JldHVybiBiLmNlaWwocSooaChhKS1jKSl9dmFyIGssbCxtLG4sbyxwLHEscixzLHQsdSx2LHcseCx5O2lmKEYuX3N1cGVyLmluaXQuY2FsbCh0aGlzLGMsZCxlLGYsZyksdGhpcy5yZWdpb25TaGFwZXM9e30sdGhpcy5pbml0VGFyZ2V0KCksdGhpcy5zZWdtZW50cz1bXSx0aGlzLnRpbWVtYXJrcz1bXSx1PWkoZS5tZXJnZWRPcHRpb25zLnRpbWVNYXJrSW50ZXJ2YWwpLHQ9InZlcnRpY2FsIj09PWUubWVyZ2VkT3B0aW9ucy5vcmllbnRhdGlvbixyPWEuaXNGdW5jdGlvbihlLm1lcmdlZE9wdGlvbnMuaW5pdCk/ZS5tZXJnZWRPcHRpb25zLmluaXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LG49aChlLm1lcmdlZE9wdGlvbnMuYmVnaW4pLG89aChlLm1lcmdlZE9wdGlvbnMuZmluaXNoKSxwPW8tbixxPXQ/KHRoaXMuY2FudmFzSGVpZ2h0LTEpL3A6KHRoaXMuY2FudmFzV2lkdGgtMSkvcCx1PjApe2ZvcihzPXUqcSxrPTA7cCpxL3MrMT5rO2srKyl4PXt4MTowLHkxOjAseDI6MCx5MjowLGxjOiIjZmYwMDExIix3OjF9LHc9Yi5yb3VuZChrKnMpLHk9Yi5jZWlsKHcvcSklNjA9PT0wPzM6MSx0Pyh4LngyPXkseC55MT14LnkyPXcpOih4LnkyPXkseC54MT14LngyPXcpLHRoaXMudGltZW1hcmtzLnB1c2goeCk7dD90aGlzLnRpbWVtYXJrcy5wdXNoKHt4MTowLHkxOjAseDI6MCx5Mjp0aGlzLmNhbnZhc0hlaWdodCxsYzoiI2VlZSIsdzoxfSk6dGhpcy50aW1lbWFya3MucHVzaCh7eDE6MCx5MTowLHgyOnRoaXMuY2FudmFzV2lkdGgseTI6MCxsYzoiI2VlZSIsdzoxfSl9Zm9yKHY9dT4wPzE6MCxrPTA7azxkLmxlbmd0aDtrKyspZFtrXSYmKGw9cihkW2tdLGspLGwmJihtPXt4OnYseTp2LHc6Zi0odisxKSxoOmctKHYrMSksZGF0YTpsfSx0PyhtLnk9aihsLmJlZ2luLG4pLG0uaD1qKGwuZmluaXNoLGgobC5iZWdpbikpKToobS54PWoobC5iZWdpbixuKSxtLnc9aihsLmZpbmlzaCxoKGwuYmVnaW4pKSksbS5mYz1sLmNvbG9yfHxlLm1lcmdlZE9wdGlvbnMuZmlsbENvbG9yLG0ubGM9bC5saW5lQ29sb3J8fGUubWVyZ2VkT3B0aW9ucy5saW5lQ29sb3IsdGhpcy5zZWdtZW50cy5wdXNoKG0pKSk7dGhpcy5zZWdtZW50cz10aGlzLnNlZ21lbnRzLnNvcnQoZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZjtyZXR1cm4gYz1OdW1iZXIoYS5kYXRhLmJlZ2luKSxlPU51bWJlcihiLmRhdGEuYmVnaW4pLGQ9TnVtYmVyKGEuZGF0YS5maW5pc2gpLGY9TnVtYmVyKGIuZGF0YS5maW5pc2gpLGUtYysoZi1kKX0pfSxnZXRSZWdpb246ZnVuY3Rpb24oYSxiLGMpe3JldHVybntlbDphLHg6Yix5OmN9fSxnZXRDdXJyZW50UmVnaW9uRmllbGRzOmZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmLGcsaCxpLGo9W107Zm9yKGI9dGhpcy5jdXJyZW50UmVnaW9uLmVsLGM9dGhpcy5jdXJyZW50UmVnaW9uLngsZD10aGlzLmN1cnJlbnRSZWdpb24ueSxhPTA7YTx0aGlzLnNlZ21lbnRzLmxlbmd0aDthKyspZT10aGlzLnNlZ21lbnRzW2FdLGUmJihmPWUueCxnPWYrZS53LGg9ZS55LGk9aCtlLmgsYz5mJiZnPmMmJmQ+aCYmaT5kJiZqLnB1c2goZS5kYXRhKSk7cmV0dXJuIGp9LHJlbmRlclJlZ2lvbjpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmPVtdLGc9dGhpcy50YXJnZXQ7aWYoMD09PWEpZm9yKGM9MDtjPHRoaXMudGltZW1hcmtzLmxlbmd0aDtjKyspZD10aGlzLnRpbWVtYXJrc1tjXSxmLnB1c2goZy5kcmF3TGluZShkLngxLGQueTEsZC54MixkLnkyLGQubGMsZC53KSk7cmV0dXJuIGU9dGhpcy5zZWdtZW50c1thXSxlJiZmLnB1c2goZy5kcmF3UmVjdChlLngsZS55LGUudyxlLmgsZS5sYyxlLmZjKSksZn19KX0oalF1ZXJ5KSxJPWYoe2luaXQ6ZnVuY3Rpb24oYSxiLGMsZCl7dGhpcy50YXJnZXQ9YSx0aGlzLmlkPWIsdGhpcy50eXBlPWMsdGhpcy5hcmdzPWR9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRhcmdldC5hcHBlbmRTaGFwZSh0aGlzKSx0aGlzfX0pLEo9Zih7X3B4cmVnZXg6LyhcZCspKHB4KT9ccyokL2ksaW5pdDpmdW5jdGlvbihhLGIsYyl7YSYmKHRoaXMud2lkdGg9YSx0aGlzLmhlaWdodD1iLHRoaXMudGFyZ2V0PWMsdGhpcy5sYXN0U2hhcGVJZD1udWxsLGNbMF0mJihjPWNbMF0pLGQuZGF0YShjLCJfanFzX3ZjYW52YXMiLHRoaXMpKX0sZHJhd0xpbmU6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3JldHVybiB0aGlzLmRyYXdTaGFwZShbW2EsYl0sW2MsZF1dLGUsbnVsbCxmKX0sZHJhd1NoYXBlOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLl9nZW5TaGFwZSgiU2hhcGUiLFthLGIsYyxkXSl9LGRyYXdDaXJjbGU6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3JldHVybiB0aGlzLl9nZW5TaGFwZSgiQ2lyY2xlIixbYSxiLGMsZCxlLGZdKX0sZHJhd1BpZVNsaWNlOmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3JldHVybiB0aGlzLl9nZW5TaGFwZSgiUGllU2xpY2UiLFthLGIsYyxkLGUsZixnXSl9LGRyYXdSZWN0OmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCl7cmV0dXJuIHRoaXMuX2dlblNoYXBlKCJSZWN0IixbYSxiLGMsZCxlLGYsZyxoXSl9LGdldEVsZW1lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW52YXN9LGdldExhc3RTaGFwZUlkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGFzdFNoYXBlSWR9LHJlc2V0OmZ1bmN0aW9uKCl7YWxlcnQoInJlc2V0IG5vdCBpbXBsZW1lbnRlZCIpfSxfaW5zZXJ0OmZ1bmN0aW9uKGEsYil7ZChiKS5odG1sKGEpfSxfY2FsY3VsYXRlUGl4ZWxEaW1zOmZ1bmN0aW9uKGEsYixjKXt2YXIgZTtlPXRoaXMuX3B4cmVnZXguZXhlYyhiKSxlP3RoaXMucGl4ZWxIZWlnaHQ9ZVsxXTp0aGlzLnBpeGVsSGVpZ2h0PWQoYykuaGVpZ2h0KCksZT10aGlzLl9weHJlZ2V4LmV4ZWMoYSksZT90aGlzLnBpeGVsV2lkdGg9ZVsxXTp0aGlzLnBpeGVsV2lkdGg9ZChjKS53aWR0aCgpO3ZhciBmPXdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgiZGV2aWNlUGl4ZWxSYXRpbyIpP3dpbmRvdy5kZXZpY2VQaXhlbFJhdGlvOjE7dGhpcy5waXhlbFdpZHRoKj1mLHRoaXMucGl4ZWxIZWlnaHQqPWZ9LF9nZW5TaGFwZTpmdW5jdGlvbihhLGIpe3ZhciBjPU8rKztyZXR1cm4gYi51bnNoaWZ0KGMpLG5ldyBJKHRoaXMsYyxhLGIpfSxhcHBlbmRTaGFwZTpmdW5jdGlvbihhKXthbGVydCgiYXBwZW5kU2hhcGUgbm90IGltcGxlbWVudGVkIil9LHJlcGxhY2VXaXRoU2hhcGU6ZnVuY3Rpb24oYSxiKXthbGVydCgicmVwbGFjZVdpdGhTaGFwZSBub3QgaW1wbGVtZW50ZWQiKX0saW5zZXJ0QWZ0ZXJTaGFwZTpmdW5jdGlvbihhLGIpe2FsZXJ0KCJpbnNlcnRBZnRlclNoYXBlIG5vdCBpbXBsZW1lbnRlZCIpfSxyZW1vdmVTaGFwZUlkOmZ1bmN0aW9uKGEpe2FsZXJ0KCJyZW1vdmVTaGFwZUlkIG5vdCBpbXBsZW1lbnRlZCIpfSxnZXRTaGFwZUF0OmZ1bmN0aW9uKGEsYixjKXthbGVydCgiZ2V0U2hhcGVBdCBub3QgaW1wbGVtZW50ZWQiKX0scmVuZGVyOmZ1bmN0aW9uKCl7YWxlcnQoInJlbmRlciBub3QgaW1wbGVtZW50ZWQiKX19KSxLPWYoSix7aW5pdDpmdW5jdGlvbihiLGUsZixnKXtLLl9zdXBlci5pbml0LmNhbGwodGhpcyxiLGUsZiksdGhpcy5jYW52YXM9YS5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSxmWzBdJiYoZj1mWzBdKSx0aGlzLmNvbnRleHQ9dGhpcy5jYW52YXMuZ2V0Q29udGV4dCgiMmQiKTt2YXIgaD13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8MSxpPXRoaXMuY29udGV4dC53ZWJraXRCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0aGlzLmNvbnRleHQubW96QmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8dGhpcy5jb250ZXh0Lm1zQmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8dGhpcy5jb250ZXh0Lm9CYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0aGlzLmNvbnRleHQuYmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8MSxqPWgvaTtkLmRhdGEoZiwiX2pxc192Y2FudmFzIix0aGlzKSxkKHRoaXMuY2FudmFzKS5jc3Moe2Rpc3BsYXk6ImlubGluZS1ibG9jayIsd2lkdGg6YixoZWlnaHQ6ZSx2ZXJ0aWNhbEFsaWduOiJ0b3AifSksdGhpcy5faW5zZXJ0KHRoaXMuY2FudmFzLGYpLHRoaXMuX2NhbGN1bGF0ZVBpeGVsRGltcyhiLGUsdGhpcy5jYW52YXMpLHRoaXMuY2FudmFzLndpZHRoPXRoaXMucGl4ZWxXaWR0aCpqLHRoaXMuY2FudmFzLmhlaWdodD10aGlzLnBpeGVsSGVpZ2h0KmosdGhpcy5jb250ZXh0LnNjYWxlKGosaiksdGhpcy5pbnRlcmFjdD1nLHRoaXMuc2hhcGVzPXt9LHRoaXMuc2hhcGVzZXE9W10sdGhpcy5jdXJyZW50VGFyZ2V0U2hhcGVJZD1jfSxfZ2V0Q29udGV4dDpmdW5jdGlvbihhLGIsZCl7dmFyIGU9dGhpcy5jYW52YXMuZ2V0Q29udGV4dCgiMmQiKTtyZXR1cm4gYSE9PWMmJihlLnN0cm9rZVN0eWxlPWEpLGUubGluZVdpZHRoPWQ9PT1jPzE6ZCxiIT09YyYmKGUuZmlsbFN0eWxlPWIpLGV9LHJlc2V0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5fZ2V0Q29udGV4dCgpO2EuY2xlYXJSZWN0KDAsMCx0aGlzLnBpeGVsV2lkdGgsdGhpcy5waXhlbEhlaWdodCksdGhpcy5zaGFwZXM9e30sdGhpcy5zaGFwZXNlcT1bXSx0aGlzLmN1cnJlbnRUYXJnZXRTaGFwZUlkPWN9LF9kcmF3U2hhcGU6ZnVuY3Rpb24oYSxiLGQsZSxmLGcpe3ZhciBoLGksaj10aGlzLl9nZXRDb250ZXh0KGQsZSxmKSxrPSExO2lmKGd8fChnPTApLGouYmVnaW5QYXRoKCksNT09PWIubGVuZ3RoJiYoYlsxXVswXS1iWzBdWzBdPGcmJihnPTApLGc+MCYmKGoubW92ZVRvKGJbMF1bMF0rZysuNSxiWzBdWzFdKy41KSxqLmxpbmVUbyhiWzFdWzBdLWcrLjUsYlsxXVsxXSsuNSksai5xdWFkcmF0aWNDdXJ2ZVRvKGJbMV1bMF0tZysuNSxiWzFdWzFdKy41LGJbMV1bMF0rLjUsYlsxXVsxXStnKy41KSxqLmxpbmVUbyhiWzJdWzBdKy41LGJbMl1bMV0tZysuNSksai5xdWFkcmF0aWNDdXJ2ZVRvKGJbMl1bMF0rLjUsYlsyXVsxXS1nKy41LGJbMl1bMF0tZysuNSxiWzJdWzFdKy41KSxqLmxpbmVUbyhiWzNdWzBdK2crLjUsYlszXVsxXSsuNSksai5xdWFkcmF0aWNDdXJ2ZVRvKGJbM11bMF0rZysuNSxiWzNdWzFdKy41LGJbM11bMF0rLjUsYlszXVsxXS1nKy41KSxqLmxpbmVUbyhiWzRdWzBdKy41LGJbNF1bMV0rZysuNSksai5xdWFkcmF0aWNDdXJ2ZVRvKGJbNF1bMF0rLjUsYls0XVsxXStnKy41LGJbNF1bMF0rZysuNSxiWzRdWzFdKy41KSxrPSEwKSksIWspZm9yKGoubW92ZVRvKGJbMF1bMF0rLjUsYlswXVsxXSsuNSksaD0xLGk9Yi5sZW5ndGg7aT5oO2grKylqLmxpbmVUbyhiW2hdWzBdKy41LGJbaF1bMV0rLjUpO2QhPT1jJiZqLnN0cm9rZSgpLGUhPT1jJiZqLmZpbGwoKSx0aGlzLnRhcmdldFghPT1jJiZ0aGlzLnRhcmdldFkhPT1jJiZqLmlzUG9pbnRJblBhdGgodGhpcy50YXJnZXRYLHRoaXMudGFyZ2V0WSkmJih0aGlzLmN1cnJlbnRUYXJnZXRTaGFwZUlkPWEpfSxfZHJhd0NpcmNsZTpmdW5jdGlvbihhLGQsZSxmLGcsaCxpKXt2YXIgaj10aGlzLl9nZXRDb250ZXh0KGcsaCxpKTtqLmJlZ2luUGF0aCgpLGouYXJjKGQsZSxmLDAsMipiLlBJLCExKSx0aGlzLnRhcmdldFghPT1jJiZ0aGlzLnRhcmdldFkhPT1jJiZqLmlzUG9pbnRJblBhdGgodGhpcy50YXJnZXRYLHRoaXMudGFyZ2V0WSkmJih0aGlzLmN1cnJlbnRUYXJnZXRTaGFwZUlkPWEpLGchPT1jJiZqLnN0cm9rZSgpLGghPT1jJiZqLmZpbGwoKX0sX2RyYXdQaWVTbGljZTpmdW5jdGlvbihhLGIsZCxlLGYsZyxoLGkpe3ZhciBqPXRoaXMuX2dldENvbnRleHQoaCxpKTtqLmJlZ2luUGF0aCgpLGoubW92ZVRvKGIsZCksai5hcmMoYixkLGUsZixnLCExKSxqLmxpbmVUbyhiLGQpLGouY2xvc2VQYXRoKCksaCE9PWMmJmouc3Ryb2tlKCksaSYmai5maWxsKCksdGhpcy50YXJnZXRYIT09YyYmdGhpcy50YXJnZXRZIT09YyYmai5pc1BvaW50SW5QYXRoKHRoaXMudGFyZ2V0WCx0aGlzLnRhcmdldFkpJiYodGhpcy5jdXJyZW50VGFyZ2V0U2hhcGVJZD1hKX0sX2RyYXdSZWN0OmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpKXtyZXR1cm4gdGhpcy5fZHJhd1NoYXBlKGEsW1tiLGNdLFtiK2QsY10sW2IrZCxjK2VdLFtiLGMrZV0sW2IsY11dLGYsZyxudWxsLGkpfSxhcHBlbmRTaGFwZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zaGFwZXNbYS5pZF09YSx0aGlzLnNoYXBlc2VxLnB1c2goYS5pZCksdGhpcy5sYXN0U2hhcGVJZD1hLmlkLGEuaWR9LHJlcGxhY2VXaXRoU2hhcGU6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPXRoaXMuc2hhcGVzZXE7Zm9yKHRoaXMuc2hhcGVzW2IuaWRdPWIsYz1kLmxlbmd0aDtjLS07KWRbY109PWEmJihkW2NdPWIuaWQpO2RlbGV0ZSB0aGlzLnNoYXBlc1thXX0scmVwbGFjZVdpdGhTaGFwZXM6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZj10aGlzLnNoYXBlc2VxLGc9e307Zm9yKGQ9YS5sZW5ndGg7ZC0tOylnW2FbZF1dPSEwO2ZvcihkPWYubGVuZ3RoO2QtLTspYz1mW2RdLGdbY10mJihmLnNwbGljZShkLDEpLGRlbGV0ZSB0aGlzLnNoYXBlc1tjXSxlPWQpO2ZvcihkPWIubGVuZ3RoO2QtLTspZi5zcGxpY2UoZSwwLGJbZF0uaWQpLHRoaXMuc2hhcGVzW2JbZF0uaWRdPWJbZF19LGluc2VydEFmdGVyU2hhcGU6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPXRoaXMuc2hhcGVzZXE7Zm9yKGM9ZC5sZW5ndGg7Yy0tOylpZihkW2NdPT09YSlyZXR1cm4gZC5zcGxpY2UoYysxLDAsYi5pZCksdm9pZCh0aGlzLnNoYXBlc1tiLmlkXT1iKX0scmVtb3ZlU2hhcGVJZDpmdW5jdGlvbihhKXt2YXIgYixjPXRoaXMuc2hhcGVzZXE7Zm9yKGI9Yy5sZW5ndGg7Yi0tOylpZihjW2JdPT09YSl7Yy5zcGxpY2UoYiwxKTticmVha31kZWxldGUgdGhpcy5zaGFwZXNbYV19LGdldFNoYXBlQXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLnRhcmdldFg9Yix0aGlzLnRhcmdldFk9Yyx0aGlzLnJlbmRlcigpLHRoaXMuY3VycmVudFRhcmdldFNoYXBlSWR9LHJlbmRlcjpmdW5jdGlvbigpe3ZhciBhLGIsYyxkPXRoaXMuc2hhcGVzZXEsZT10aGlzLnNoYXBlcyxmPWQubGVuZ3RoLGc9dGhpcy5fZ2V0Q29udGV4dCgpO2ZvcihnLmNsZWFyUmVjdCgwLDAsdGhpcy5waXhlbFdpZHRoLHRoaXMucGl4ZWxIZWlnaHQpLGM9MDtmPmM7YysrKWE9ZFtjXSxiPWVbYV0sdGhpc1siX2RyYXciK2IudHlwZV0uYXBwbHkodGhpcyxiLmFyZ3MpO3RoaXMuaW50ZXJhY3R8fCh0aGlzLnNoYXBlcz17fSx0aGlzLnNoYXBlc2VxPVtdKX19KSxMPWYoSix7aW5pdDpmdW5jdGlvbihiLGMsZSl7dmFyIGY7TC5fc3VwZXIuaW5pdC5jYWxsKHRoaXMsYixjLGUpLGVbMF0mJihlPWVbMF0pLGQuZGF0YShlLCJfanFzX3ZjYW52YXMiLHRoaXMpLHRoaXMuY2FudmFzPWEuY3JlYXRlRWxlbWVudCgic3BhbiIpLGQodGhpcy5jYW52YXMpLmNzcyh7ZGlzcGxheToiaW5saW5lLWJsb2NrIixwb3NpdGlvbjoicmVsYXRpdmUiLG92ZXJmbG93OiJoaWRkZW4iLHdpZHRoOmIsaGVpZ2h0OmMsbWFyZ2luOiIwcHgiLHBhZGRpbmc6IjBweCIsdmVydGljYWxBbGlnbjoidG9wIn0pLHRoaXMuX2luc2VydCh0aGlzLmNhbnZhcyxlKSx0aGlzLl9jYWxjdWxhdGVQaXhlbERpbXMoYixjLHRoaXMuY2FudmFzKSx0aGlzLmNhbnZhcy53aWR0aD10aGlzLnBpeGVsV2lkdGgsdGhpcy5jYW52YXMuaGVpZ2h0PXRoaXMucGl4ZWxIZWlnaHQsZj0nPHY6Z3JvdXAgY29vcmRvcmlnaW49IjAgMCIgY29vcmRzaXplPSInK3RoaXMucGl4ZWxXaWR0aCsiICIrdGhpcy5waXhlbEhlaWdodCsnIiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3dpZHRoOicrdGhpcy5waXhlbFdpZHRoKyJweDtoZWlnaHQ9Iit0aGlzLnBpeGVsSGVpZ2h0KydweDsiPjwvdjpncm91cD4nLHRoaXMuY2FudmFzLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlRW5kIixmKSx0aGlzLmdyb3VwPWQodGhpcy5jYW52YXMpLmNoaWxkcmVuKClbMF0sdGhpcy5yZW5kZXJlZD0hMSx0aGlzLnByZXJlbmRlcj0iIn0sX2RyYXdTaGFwZTpmdW5jdGlvbihhLGIsZCxlLGYsZyl7dmFyIGgsaSxqLGssbCxtLG4sbz1bXTtmb3Iobj0wLG09Yi5sZW5ndGg7bT5uO24rKylvW25dPSIiK2Jbbl1bMF0rIiwiK2Jbbl1bMV07cmV0dXJuIGg9by5zcGxpY2UoMCwxKSxmPWY9PT1jPzE6ZixpPWQ9PT1jPycgc3Ryb2tlZD0iZmFsc2UiICc6JyBzdHJva2VXZWlnaHQ9IicrZisncHgiIHN0cm9rZUNvbG9yPSInK2QrJyIgJyxqPWU9PT1jPycgZmlsbGVkPSJmYWxzZSInOicgZmlsbENvbG9yPSInK2UrJyIgZmlsbGVkPSJ0cnVlIiAnLGs9b1swXT09PW9bby5sZW5ndGgtMV0/InggIjoiIixsPSc8djpzaGFwZSBjb29yZG9yaWdpbj0iMCAwIiBjb29yZHNpemU9IicrdGhpcy5waXhlbFdpZHRoKyIgIit0aGlzLnBpeGVsSGVpZ2h0KyciICBpZD0ianFzc2hhcGUnK2ErJyIgJytpK2orJyBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7bGVmdDowcHg7dG9wOjBweDtoZWlnaHQ6Jyt0aGlzLnBpeGVsSGVpZ2h0KyJweDt3aWR0aDoiK3RoaXMucGl4ZWxXaWR0aCsncHg7cGFkZGluZzowcHg7bWFyZ2luOjBweDsiICBwYXRoPSJtICcraCsiIGwgIitvLmpvaW4oIiwgIikrIiAiK2srJ2UiPiA8L3Y6c2hhcGU+J30sX2RyYXdDaXJjbGU6ZnVuY3Rpb24oYSxiLGQsZSxmLGcsaCl7dmFyIGksaixrO3JldHVybiBiLT1lLGQtPWUsaT1mPT09Yz8nIHN0cm9rZWQ9ImZhbHNlIiAnOicgc3Ryb2tlV2VpZ2h0PSInK2grJ3B4IiBzdHJva2VDb2xvcj0iJytmKyciICcsaj1nPT09Yz8nIGZpbGxlZD0iZmFsc2UiJzonIGZpbGxDb2xvcj0iJytnKyciIGZpbGxlZD0idHJ1ZSIgJyxrPSc8djpvdmFsICBpZD0ianFzc2hhcGUnK2ErJyIgJytpK2orJyBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOicrZCsicHg7IGxlZnQ6IitiKyJweDsgd2lkdGg6IisyKmUrInB4OyBoZWlnaHQ6IisyKmUrJ3B4Ij48L3Y6b3ZhbD4nfSxfZHJhd1BpZVNsaWNlOmZ1bmN0aW9uKGEsZCxlLGYsZyxoLGksail7dmFyIGssbCxtLG4sbyxwLHEscjtpZihnPT09aClyZXR1cm4iIjtpZihoLWc9PT0yKmIuUEkmJihnPTAsaD0yKmIuUEkpLGw9ZCtiLnJvdW5kKGIuY29zKGcpKmYpLG09ZStiLnJvdW5kKGIuc2luKGcpKmYpLG49ZCtiLnJvdW5kKGIuY29zKGgpKmYpLG89ZStiLnJvdW5kKGIuc2luKGgpKmYpLGw9PT1uJiZtPT09byl7aWYoaC1nPGIuUEkpcmV0dXJuIiI7bD1uPWQrZixtPW89ZX1yZXR1cm4gbD09PW4mJm09PT1vJiZoLWc8Yi5QST8iIjooaz1bZC1mLGUtZixkK2YsZStmLGwsbSxuLG9dLHA9aT09PWM/JyBzdHJva2VkPSJmYWxzZSIgJzonIHN0cm9rZVdlaWdodD0iMXB4IiBzdHJva2VDb2xvcj0iJytpKyciICcscT1qPT09Yz8nIGZpbGxlZD0iZmFsc2UiJzonIGZpbGxDb2xvcj0iJytqKyciIGZpbGxlZD0idHJ1ZSIgJyxyPSc8djpzaGFwZSBjb29yZG9yaWdpbj0iMCAwIiBjb29yZHNpemU9IicrdGhpcy5waXhlbFdpZHRoKyIgIit0aGlzLnBpeGVsSGVpZ2h0KyciICBpZD0ianFzc2hhcGUnK2ErJyIgJytwK3ErJyBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7bGVmdDowcHg7dG9wOjBweDtoZWlnaHQ6Jyt0aGlzLnBpeGVsSGVpZ2h0KyJweDt3aWR0aDoiK3RoaXMucGl4ZWxXaWR0aCsncHg7cGFkZGluZzowcHg7bWFyZ2luOjBweDsiICBwYXRoPSJtICcrZCsiLCIrZSsiIHdhICIray5qb2luKCIsICIpKycgeCBlIj4gPC92OnNoYXBlPicpfSxfZHJhd1JlY3Q6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGkpe3JldHVybiB0aGlzLl9kcmF3U2hhcGUoYSxbW2IsY10sW2IsYytlXSxbYitkLGMrZV0sW2IrZCxjXSxbYixjXV0sZixnLGgsaSl9LHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5ncm91cC5pbm5lckhUTUw9IiJ9LGFwcGVuZFNoYXBlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbIl9kcmF3IithLnR5cGVdLmFwcGx5KHRoaXMsYS5hcmdzKTtyZXR1cm4gdGhpcy5yZW5kZXJlZD90aGlzLmdyb3VwLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlRW5kIixiKTp0aGlzLnByZXJlbmRlcis9Yix0aGlzLmxhc3RTaGFwZUlkPWEuaWQsYS5pZH0scmVwbGFjZVdpdGhTaGFwZTpmdW5jdGlvbihhLGIpe3ZhciBjPWQoIiNqcXNzaGFwZSIrYSksZT10aGlzWyJfZHJhdyIrYi50eXBlXS5hcHBseSh0aGlzLGIuYXJncyk7Y1swXS5vdXRlckhUTUw9ZX0scmVwbGFjZVdpdGhTaGFwZXM6ZnVuY3Rpb24oYSxiKXt2YXIgYyxlPWQoIiNqcXNzaGFwZSIrYVswXSksZj0iIixnPWIubGVuZ3RoO2ZvcihjPTA7Zz5jO2MrKylmKz10aGlzWyJfZHJhdyIrYltjXS50eXBlXS5hcHBseSh0aGlzLGJbY10uYXJncyk7Zm9yKGVbMF0ub3V0ZXJIVE1MPWYsYz0xO2M8YS5sZW5ndGg7YysrKWQoIiNqcXNzaGFwZSIrYVtjXSkucmVtb3ZlKCl9LGluc2VydEFmdGVyU2hhcGU6ZnVuY3Rpb24oYSxiKXt2YXIgYz1kKCIjanFzc2hhcGUiK2EpLGU9dGhpc1siX2RyYXciK2IudHlwZV0uYXBwbHkodGhpcyxiLmFyZ3MpO2NbMF0uaW5zZXJ0QWRqYWNlbnRIVE1MKCJhZnRlckVuZCIsZSl9LHJlbW92ZVNoYXBlSWQ6ZnVuY3Rpb24oYSl7dmFyIGI9ZCgiI2pxc3NoYXBlIithKTt0aGlzLmdyb3VwLnJlbW92ZUNoaWxkKGJbMF0pfSxnZXRTaGFwZUF0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmlkLnN1YnN0cig4KTtyZXR1cm4gZH0scmVuZGVyOmZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlZHx8KHRoaXMuZ3JvdXAuaW5uZXJIVE1MPXRoaXMucHJlcmVuZGVyLHRoaXMucmVuZGVyZWQ9ITApfX0pfSl9KGRvY3VtZW50LE1hdGgpOw=="></script>
<script src="data:application/x-javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsNCiAgbmFtZTogInNwYXJrbGluZSIsDQogIHR5cGU6ICJvdXRwdXQiLA0KICBmYWN0b3J5OiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCkgew0KDQogICAgcmV0dXJuIHsNCg0KICAgICAgcmVuZGVyVmFsdWU6IGZ1bmN0aW9uKGRhdGEpIHsNCg0KICAgICAgICAvLyBpZiByZW5kZXJUYWcgcHJvdmlkZWQgdGhlbiB3ZSB3aWxsIGRvIHRocmVlIHRoaW5ncw0KICAgICAgICAvLyAgIDEuICBzZXQgaGVpZ2h0IGFuZCB3aWR0aCB0byAwIGFuZCBkaXNwbGF5IG5vbmUNCiAgICAgICAgLy8gICAyLiAgc2V0IG91ciBlbCB0byB0aGUgcmVuZGVyIHRhZyBpZiBhdmFpbGFibGUNCiAgICAgICAgLy8gICAzLiAgc2V0IGhlaWdodCBhbmQgd2lkdGggb3B0aW9ucyB0byBudWxsDQogICAgICAgIGlmKGRhdGEucmVuZGVyU2VsZWN0b3IgJiYgJChkYXRhLnJlbmRlclNlbGVjdG9yKS5sZW5ndGgpew0KICAgICAgICAgICQoZWwpLmNzcyh7DQogICAgICAgICAgICAnaGVpZ2h0JzogJzAnLA0KICAgICAgICAgICAgJ3dpZHRoJzogJzAnLA0KICAgICAgICAgICAgJ2Rpc3BsYXknOiAnbm9uZScNCiAgICAgICAgICB9KTsNCiAgICAgICAgICBlbCA9IGRhdGEucmVuZGVyU2VsZWN0b3I7DQogICAgICAgICAgLy8gc2V0IGhlaWdodCBhbmQgd2lkdGggdG8gbnVsbA0KICAgICAgICAgIC8vICAgdGhpcyBtaWdodCBiZSBjb25mdXNpbmcgYW5kIG5lZWQgdG8gYmUgcmV2ZXJ0ZWQNCiAgICAgICAgICBkYXRhLm9wdGlvbnMuaGVpZ2h0ID0gbnVsbDsNCiAgICAgICAgICBkYXRhLm9wdGlvbnMud2lkdGggPSBudWxsOw0KICAgICAgICB9DQogICAgICAgICQoZWwpLnNwYXJrbGluZShkYXRhLnZhbHVlcywgZGF0YS5vcHRpb25zKTsNCiAgICAgICAgDQogICAgICAgIC8vIGV4cGVyaW1lbnRhbCBhZGRDb21wb3NpdGUgZnVuY3Rpb24gaW4gUg0KICAgICAgICAvLyAgIHdpbGwgYWRkIGNvbXBvc2l0ZXMgdG8gZGF0YS5jb21wb3NpdGVzDQogICAgICAgIGlmKGRhdGEuY29tcG9zaXRlcykgew0KICAgICAgICAgIGlmKCFBcnJheS5pc0FycmF5KGRhdGEuY29tcG9zaXRlcykpIHsNCiAgICAgICAgICAgIGRhdGEuY29tcG9zaXRlcyA9IFtkYXRhLmNvbXBvc2l0ZXNdOw0KICAgICAgICAgIH0NCiAgICAgICAgICBkYXRhLmNvbXBvc2l0ZXMubWFwKCBmdW5jdGlvbihzcGspIHsNCiAgICAgICAgICAgICQoZWwpLnNwYXJrbGluZShzcGsudmFsdWVzLHNway5vcHRpb25zKTsNCiAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgfSwNCg0KICAgICAgcmVzaXplOiBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KSB7DQoNCiAgICAgICAgLy8gbm90IHN1cmUgd2hhdCB0byBkbyBpbiB0aGUgZXZlbnQgb2YgcmVzaXplDQogICAgICAgIC8vICBJIHRoaW5rIG5vdGhpbmcgZm9yIG5vdw0KICAgICAgICAvLyAgYnV0IHdpbGwgbmVlZCB0byBnZXQgYSBmZWVsIGZvciB1c2UgY2FzZXMNCiAgICAgICAgLy8gIHdoZXJlIHRoaXMgaXMgaW1wb3J0YW50IHN1Y2ggYXMgc2xpZGVzLCBmbGV4ZGFzaGJvYXJkLCB0YWJzZXQNCg0KICAgICAgfQ0KDQogICAgfTsNCiAgfSAgDQp9KTsNCg=="></script>
</head>
<body style="background-color:white;">
<div>
<p><span style="font-style:bold">mpg</span> <span id="sparkline-mpg"></span></p>
</div>
<div>
<p><span style="font-style:bold">disp</span> <span id="sparkline-disp"></span></p>
</div>
<div id="htmlwidget-8946" class="parcoords html-widget" style="width:960px;height:500px;">
</div>
<script type="application/json" data-for="htmlwidget-8946">{"x":{"data":{"names":["Mazda RX4","Mazda RX4 Wag","Datsun 710","Hornet 4 Drive","Hornet Sportabout","Valiant","Duster 360","Merc 240D","Merc 230","Merc 280","Merc 280C","Merc 450SE","Merc 450SL","Merc 450SLC","Cadillac Fleetwood","Lincoln Continental","Chrysler Imperial","Fiat 128","Honda Civic","Toyota Corolla","Toyota Corona","Dodge Challenger","AMC Javelin","Camaro Z28","Pontiac Firebird","Fiat X1-9","Porsche 914-2","Lotus Europa","Ford Pantera L","Ferrari Dino","Maserati Bora","Volvo 142E"],"mpg":[21,21,22.8,21.4,18.7,18.1,14.3,24.4,22.8,19.2,17.8,16.4,17.3,15.2,10.4,10.4,14.7,32.4,30.4,33.9,21.5,15.5,15.2,13.3,19.2,27.3,26,30.4,15.8,19.7,15,21.4],"cyl":[6,6,4,6,8,6,8,4,4,6,6,8,8,8,8,8,8,4,4,4,4,8,8,8,8,4,4,4,8,6,8,4],"disp":[160,160,108,258,360,225,360,146.7,140.8,167.6,167.6,275.8,275.8,275.8,472,460,440,78.7,75.7,71.1,120.1,318,304,350,400,79,120.3,95.1,351,145,301,121],"hp":[110,110,93,110,175,105,245,62,95,123,123,180,180,180,205,215,230,66,52,65,97,150,150,245,175,66,91,113,264,175,335,109],"drat":[3.9,3.9,3.85,3.08,3.15,2.76,3.21,3.69,3.92,3.92,3.92,3.07,3.07,3.07,2.93,3,3.23,4.08,4.93,4.22,3.7,2.76,3.15,3.73,3.08,4.08,4.43,3.77,4.22,3.62,3.54,4.11],"wt":[2.62,2.875,2.32,3.215,3.44,3.46,3.57,3.19,3.15,3.44,3.44,4.07,3.73,3.78,5.25,5.424,5.345,2.2,1.615,1.835,2.465,3.52,3.435,3.84,3.845,1.935,2.14,1.513,3.17,2.77,3.57,2.78],"qsec":[16.46,17.02,18.61,19.44,17.02,20.22,15.84,20,22.9,18.3,18.9,17.4,17.6,18,17.98,17.82,17.42,19.47,18.52,19.9,20.01,16.87,17.3,15.41,17.05,18.9,16.7,16.9,14.5,15.5,14.6,18.6],"vs":[0,0,1,1,0,1,0,1,1,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,0,1,0,0,0,1],"am":[1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1],"gear":[4,4,4,3,3,3,3,4,4,4,4,3,3,3,3,3,3,4,4,4,3,3,3,3,3,4,5,5,5,5,5,4],"carb":[4,4,1,1,2,1,4,2,2,4,4,3,3,3,4,4,4,1,2,1,1,2,2,4,2,1,2,2,4,6,8,2]},"options":{"rownames":true,"brushMode":"1D-axes","brushPredicate":"AND","reorderable":false,"margin":{"top":50,"bottom":50,"left":100,"right":50},"mode":false},"autoresize":false,"tasks":null},"evals":[],"jsHooks":{"render":[" \n function(el,x){\n var drawBox = function(pc){\n $('#sparkline-mpg').sparkline(\n pc.brushed().map(function(d){return d.mpg}),\n {type:'box',chartRangeMin:0,chartRangeMax:34}\n );\n $('#sparkline-disp').sparkline(\n pc.brushed().map(function(d){return d.disp}),\n {type:'box',chartRangeMin:0,chartRangeMax:472}\n );\n };\n \n drawBox(el.parcoords);\n \n el.parcoords.on(\n 'brush.sparkline',\n function(){drawBox(this)}\n )\n }\n "]}}</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment