Skip to content

Instantly share code, notes, and snippets.

@timelyportfolio
Last active June 16, 2017 14:47
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/44bd24c433126492c530dac618e2ddc7 to your computer and use it in GitHub Desktop.
Save timelyportfolio/44bd24c433126492c530dac618e2ddc7 to your computer and use it in GitHub Desktop.
flubberized sunburst
license: mit

spinoff of timelyportfolio's block: flubberized US states to/from hex
This is a combination of quite a few numerous generous open-source contributions. Thanks especially to [Mike Bostock](https://bost.ocks.org/mike/) and [Noah Veltman](https://noahveltman.com/).

Code in R

library(sunburstR)
library(htmltools)

# d3 source tree from Mike Bostock
# https://gist.githubusercontent.com/mbostock/8fe6fa6ed1fa976e5dd76cfa4d816fec/
d3_src <- read.csv(
  "https://gist.githubusercontent.com/mbostock/8fe6fa6ed1fa976e5dd76cfa4d816fec/raw/122aa364ef1b0134455654f446e15dbfd1c95f86/d3.csv",
  stringsAsFactors = FALSE
)

d3_tree <- sunburstR:::csv_to_hier(
  d3_src[,2:1],
  delim = "/"
)

sb <- sunburst(d3_tree, withD3 = TRUE)
sb$x$tasks <- list(htmlwidgets::JS("
function(){
  var chart = this.instance.chart;
  var el = this.el;
  var svg = d3.select(el).select('.sunburst-chart>svg');

  chart.on('click.tree', function(d) {
    svg.selectAll('.tree')
      .transition()
      .style('opacity', 0.001)
      .remove();

    // interpolate to rect
    var cloned = d3.select(event.target.cloneNode(true));
    cloned
      .classed('tree', true)
      .attr('transform', svg.select('g').attr('transform'));
    svg.node().appendChild(cloned.node());
    

    var interpolator = flubber.interpolate(
      d3.select(event.target).attr('d'),
      [[0,0],[0,100],[100,100],[100,0],[0,0]]
    );
    cloned
      .transition()
      .duration(1500)
      .attrTween('d', function(){ return interpolator; })
      .attr('transform', 'translate(0,0)');

    //interpolate rect to tree with separate
    var hier = d3.hierarchy(d3.select(event.target).datum())
      .sum(function(d) {return d.data.size});
    if(hier.children) {
      var tree = d3.treemap().size([100,100])(hier);
      tree.children.map(function(d) {
        svg.append('rect')
          .classed('tree', true)
          .attr('transform', 'translate(' + d.x0 + ',' + d.y0 + ')')
          .attr('width', d.x1 - d.x0)
          .attr('height', d.y1 - d.y0)
          .style('stroke', 'white')
          .style('fill','none')
          .style('opacity',0.00001)
          .transition()
          .delay(100)
          .style('opacity',1)
      });
    }
  })
}
"))

                 
                 
browsable(
  tagList(
    tags$head(tags$script(src="https://unpkg.com/flubber")),
    sb
  )
)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEFkZCBhIG1ldGhvZCB0byBkZWxlZ2F0b3IgdGhhdCwgd2hlbiBpbnZva2VkLCBjYWxscwogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbgogIC8vIHRoZSBkZWxlZ2F0ZWUsIGJ1dCB0aGVyZSB3YXMgb25lIG9uIGRlbGVnYXRvciBiZWZvcmUKICAvLyBkZWxlZ2F0ZU1ldGhvZCB3YXMgY2FsbGVkLCB0aGVuIHRoZSBvcmlnaW5hbCB2ZXJzaW9uCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gdmFyIGEgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ExJyk7IH0KICAvLyAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYTInKTsgfQogIC8vIH07CiAgLy8gdmFyIGIgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2IxJyk7IH0KICAvLyB9OwogIC8vIGRlbGVnYXRlTWV0aG9kKGEsIGIsICJtZXRob2QxIik7CiAgLy8gZGVsZWdhdGVNZXRob2QoYSwgYiwgIm1ldGhvZDIiKTsKICAvLyBhLm1ldGhvZDEoKTsKICAvLyBhLm1ldGhvZDIoKTsKICAvLwogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4KICBmdW5jdGlvbiBkZWxlZ2F0ZU1ldGhvZChkZWxlZ2F0b3IsIGRlbGVnYXRlZSwgbWV0aG9kTmFtZSkgewogICAgdmFyIGluaGVyaXRlZCA9IGRlbGVnYXRvclttZXRob2ROYW1lXTsKICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdGFyZ2V0ID0gZGVsZWdhdGVlOwogICAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGVlW21ldGhvZE5hbWVdOwoKICAgICAgLy8gVGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0IG9uIHRoZSBkZWxlZ2F0ZWUuIEluc3RlYWQsCiAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBvbiB0aGUgZGVsZWdhdG9yLCBpZiBpdCBleGlzdHMuCiAgICAgIGlmICghbWV0aG9kKSB7CiAgICAgICAgdGFyZ2V0ID0gZGVsZWdhdG9yOwogICAgICAgIG1ldGhvZCA9IGluaGVyaXRlZDsKICAgICAgfQoKICAgICAgaWYgKG1ldGhvZCkgewogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gSW1wbGVtZW50IGEgdmFndWUgZmFjc2ltaWxpZSBvZiBqUXVlcnkncyBkYXRhIG1ldGhvZAogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICByZXR1cm4gZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV07CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgewogICAgICBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXSA9IHZhbHVlOwogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGVsZW1lbnREYXRhOiAiICsKICAgICAgICBhcmd1bWVudHMubGVuZ3RoKTsKICAgIH0KICB9CgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleAogIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCAiXFwkJiIpOwogIH0KCiAgZnVuY3Rpb24gaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkgewogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOwogICAgcmV0dXJuIHJlLnRlc3QoZWwuY2xhc3NOYW1lKTsKICB9CgogIC8vIGVsZW1lbnRzIC0gYXJyYXkgKG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBvZiBIVE1MIGVsZW1lbnRzCiAgLy8gY2xhc3NOYW1lIC0gY2xhc3MgbmFtZSB0byB0ZXN0IGZvcgogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsKICAvLyAgIGlmIGZhbHNlLCBvbmx5IHJldHVybiBlbGVtZW50cyAqd2l0aG91dCogZ2l2ZW4gY2xhc3NOYW1lCiAgZnVuY3Rpb24gZmlsdGVyQnlDbGFzcyhlbGVtZW50cywgY2xhc3NOYW1lLCBpbmNsdWRlKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaGFzQ2xhc3MoZWxlbWVudHNbaV0sIGNsYXNzTmFtZSkgPT0gaW5jbHVkZSkKICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQoKICBmdW5jdGlvbiBvbihvYmosIGV2ZW50TmFtZSwgZnVuYykgewogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgZmFsc2UpOwogICAgfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpIHsKICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvZmYob2JqLCBldmVudE5hbWUsIGZ1bmMpIHsKICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7CiAgICBlbHNlIGlmIChvYmouZGV0YWNoRXZlbnQpIHsKICAgICAgb2JqLmRldGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aAogIC8vIHRoZSAicGFkZGluZyIgQ1NTIHByb3BlcnR5CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3BhZGRpbmcKICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7CiAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgIHZhbHVlID0gW3ZhbHVlXTsKICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMF0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzBdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzNdfTsKICAgIH0KICB9CgogIC8vIENvbnZlcnQgYW4gdW5wYWNrZWQgcGFkZGluZyBvYmplY3QgdG8gYSBDU1MgdmFsdWUKICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgewogICAgcmV0dXJuIHBhZGRpbmdPYmoudG9wICsgInB4ICIgKyBwYWRkaW5nT2JqLnJpZ2h0ICsgInB4ICIgKyBwYWRkaW5nT2JqLmJvdHRvbSArICJweCAiICsgcGFkZGluZ09iai5sZWZ0ICsgInB4IjsKICB9CgogIC8vIE1ha2VzIGEgbnVtYmVyIHN1aXRhYmxlIGZvciBDU1MKICBmdW5jdGlvbiBweCh4KSB7CiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIHggKyAicHgiOwogICAgZWxzZQogICAgICByZXR1cm4geDsKICB9CgogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuCiAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIgbnVsbCwgb3IgYW4gb2JqZWN0IHdpdGggZmlsbCwgcGFkZGluZywKICAvLyBkZWZhdWx0V2lkdGgsIGRlZmF1bHRIZWlnaHQgZmllbGRzLgogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgewogICAgdmFyIHNpemluZ0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vaHRtbHdpZGdldC1zaXppbmcnXSIpOwogICAgaWYgKCFzaXppbmdFbCkKICAgICAgcmV0dXJuIG51bGw7CiAgICB2YXIgc3AgPSBKU09OLnBhcnNlKHNpemluZ0VsLnRleHRDb250ZW50IHx8IHNpemluZ0VsLnRleHQgfHwgInt9Iik7CiAgICBpZiAodmlld2VyTW9kZSkgewogICAgICByZXR1cm4gc3Audmlld2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHNwLmJyb3dzZXI7CiAgICB9CiAgfQoKICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLgogIC8vICAgRWFjaCBlbGVtZW50IG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdGhhdCB5aWVsZHMgYQogIC8vICAgZnVuY3Rpb24uIE9yLCBjYW4gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICJjb2RlIiBhbmQgImRhdGEiCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nCiAgLy8gICBvZiBKUyB0aGF0J3MgYW4gZXhwciB0aGF0IHlpZWxkcyBhIGZ1bmN0aW9uLCBhbmQgImRhdGEiIHNob3VsZCBiZQogIC8vICAgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBhZGRlZCBhcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHdoZW4gdGhhdAogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLgogIC8vIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgInRoaXMiIGZvciBlYWNoIGZ1bmN0aW9uCiAgLy8gICBleGVjdXRpb24uCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlCiAgLy8gICBzYW1lIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zLikKICBmdW5jdGlvbiBldmFsQW5kUnVuKHRhc2tzLCB0YXJnZXQsIGFyZ3MpIHsKICAgIGlmICh0YXNrcykgewogICAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgdmFyIHRoZXNlQXJncyA9IGFyZ3M7CiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHRoZXNlQXJncyA9IHRoZXNlQXJncy5jb25jYXQoW3Rhc2suZGF0YV0pOwogICAgICAgICAgdGFzayA9IHRhc2suY29kZTsKICAgICAgICB9CiAgICAgICAgdmFyIHRhc2tGdW5jID0gZXZhbCgiKCIgKyB0YXNrICsgIikiKTsKICAgICAgICBpZiAodHlwZW9mKHRhc2tGdW5jKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOwogICAgICAgIH0KICAgICAgICB0YXNrRnVuYy5hcHBseSh0YXJnZXQsIHRoZXNlQXJncyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdFNpemluZyhlbCkgewogICAgdmFyIHNpemluZyA9IHNpemluZ1BvbGljeShlbCk7CiAgICBpZiAoIXNpemluZykKICAgICAgcmV0dXJuOwoKICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsKICAgIGlmICghY2VsKQogICAgICByZXR1cm47CgogICAgaWYgKHR5cGVvZihzaXppbmcucGFkZGluZykgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luID0gIjAiOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOwogICAgfQoKICAgIGlmIChzaXppbmcuZmlsbCkgewogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIGlmIChjZWwpIHsKICAgICAgICBjZWwuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgIHZhciBwYWQgPSB1bnBhY2tQYWRkaW5nKHNpemluZy5wYWRkaW5nKTsKICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLnJpZ2h0ID0gcGFkLnJpZ2h0ICsgInB4IjsKICAgICAgICBjZWwuc3R5bGUuYm90dG9tID0gcGFkLmJvdHRvbSArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7CiAgICAgICAgZWwuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwKICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY2VsLm9mZnNldEhlaWdodDsgfQogICAgICB9OwoKICAgIH0gZWxzZSB7CiAgICAgIGVsLnN0eWxlLndpZHRoID0gcHgoc2l6aW5nLndpZHRoKTsKICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LAogICAgICAgIGdldEhlaWdodDogZnVuY3Rpb24oKSB7IHJldHVybiBlbC5vZmZzZXRIZWlnaHQ7IH0KICAgICAgfTsKICAgIH0KICB9CgogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzCiAgdmFyIGRlZmF1bHRzID0gewogICAgZmluZDogZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7CiAgICB9LAogICAgcmVuZGVyRXJyb3I6IGZ1bmN0aW9uKGVsLCBlcnIpIHsKICAgICAgdmFyICRlbCA9ICQoZWwpOwoKICAgICAgdGhpcy5jbGVhckVycm9yKGVsKTsKCiAgICAgIC8vIEFkZCBhbGwgdGhlc2UgZXJyb3IgY2xhc3NlcywgYXMgU2hpbnkgZG9lcwogICAgICB2YXIgZXJyQ2xhc3MgPSAic2hpbnktb3V0cHV0LWVycm9yIjsKICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7CiAgICAgICAgLy8gdXNlIHRoZSBjbGFzc2VzIG9mIHRoZSBlcnJvciBjb25kaXRpb24gYXMgQ1NTIGNsYXNzIG5hbWVzCiAgICAgICAgZXJyQ2xhc3MgPSBlcnJDbGFzcyArICIgIiArICQubWFwKGFzQXJyYXkoZXJyLnR5cGUpLCBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOwogICAgICAgIH0pLmpvaW4oIiAiKTsKICAgICAgfQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7CgogICAgICAvLyBJcyBlbCBpbmxpbmUgb3IgYmxvY2s/IElmIGlubGluZSBvciBpbmxpbmUtYmxvY2ssIGp1c3QgZGlzcGxheTpub25lIGl0CiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLgogICAgICB2YXIgZGlzcGxheSA9ICRlbC5jc3MoImRpc3BsYXkiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgZGlzcGxheSk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICAkZWwuaGlkZSgpOwogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsKICAgICAgICAgIHZhciBlcnJvclNwYW4gPSAkKCI8c3Bhbj4iKS5hZGRDbGFzcyhlcnJDbGFzcyk7CiAgICAgICAgICBlcnJvclNwYW4udGV4dChlcnIubWVzc2FnZSk7CiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIikgewogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlCiAgICAgICAgLy8gZWwsIGFuZCBwb3NpdGlvbiB0aGUgZXJyb3IgdG8gYmUgb24gdG9wIG9mIHRoZSBlbC4KICAgICAgICAvLyBNYXJrIGl0IHdpdGggYSB1bmlxdWUgSUQgYW5kIENTUyBjbGFzcyBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGxhdGVyLgogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSAiIikgewogICAgICAgICAgdmFyIGVycm9yRGl2ID0gJCgiPGRpdj4iKS5hZGRDbGFzcyhlcnJDbGFzcykuY3NzKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpCiAgICAgICAgICAgIC8vIHNldHRpbmcgd2lkdGggY2FuIHB1c2ggb3V0IHRoZSBwYWdlIHNpemUsIGZvcmNpbmcgb3RoZXJ3aXNlCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3IKICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgdG8gc2hyaW5rOyBzbyB1c2UgbWF4LXdpZHRoIGluc3RlYWQKICAgICAgICAgICAgLmNzcygibWF4V2lkdGgiLCBlbC5vZmZzZXRXaWR0aCkKICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgIGVycm9yRGl2LnRleHQoZXJyLm1lc3NhZ2UpOwogICAgICAgICAgJGVsLmFmdGVyKGVycm9yRGl2KTsKCiAgICAgICAgICAvLyBSZWFsbHkgZHVtYiB3YXkgdG8ga2VlcCB0aGUgc2l6ZS9wb3NpdGlvbiBvZiB0aGUgZXJyb3IgaW4gc3luYyB3aXRoCiAgICAgICAgICAvLyB0aGUgcGFyZW50IGVsZW1lbnQgYXMgdGhlIHdpbmRvdyBpcyByZXNpemVkIG9yIHdoYXRldmVyLgogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghZXJyb3JEaXZbMF0ucGFyZW50RWxlbWVudCkgewogICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50SWQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvckRpdgogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgICAuY3NzKCJsZWZ0IiwgZWwub2Zmc2V0TGVmdCkKICAgICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICB9LCA1MDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGNsZWFyRXJyb3I6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIHZhciAkZWwgPSAkKGVsKTsKICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgbnVsbCk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICBpZiAoZGlzcGxheSkKICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsKICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOwogICAgICB9IGVsc2UgaWYgKGRpc3BsYXkgPT09ICJibG9jayIpewogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOwogICAgICAgICQoZWwubmV4dFNpYmxpbmcpLmZpbHRlcigiLmh0bWx3aWRnZXRzLWVycm9yIikucmVtb3ZlKCk7CiAgICAgIH0KICAgIH0sCiAgICBzaXppbmc6IHt9CiAgfTsKCiAgLy8gQ2FsbGVkIGJ5IHdpZGdldCBiaW5kaW5ncyB0byByZWdpc3RlciBhIG5ldyB0eXBlIG9mIHdpZGdldC4gVGhlIGRlZmluaXRpb24KICAvLyBvYmplY3QgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlCiAgLy8gICB1c2VkIGJ5IGRlZmF1bHQgYXMgdGhlIENTUyBjbGFzc25hbWUgdG8gbG9vayBmb3IuCiAgLy8gLSBpbml0aWFsaXplIChvcHRpb25hbCkgLSBBIGZ1bmN0aW9uKGVsKSB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uY2UgcGVyCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkCiAgLy8gICB2YWx1ZSB0byByZW5kZXJWYWx1ZS4KICAvLyAtIHJlbmRlclZhbHVlIChyZXF1aXJlZCkgLSBBIGZ1bmN0aW9uKGVsLCBkYXRhLCBpbml0VmFsdWUpIHRoYXQgd2lsbCBiZQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXIKICAvLyAgIGVsZW1lbnQ7IFNoaW55IGFwcHMgd2lsbCBjYXVzZSB0aGlzIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBwZXIKICAvLyAgIGVsZW1lbnQsIGFzIHRoZSBkYXRhIGNoYW5nZXMuCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsKICAgIGlmICghZGVmaW5pdGlvbi5uYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIG5hbWUiKTsKICAgIH0KICAgIGlmICghZGVmaW5pdGlvbi50eXBlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHR5cGUiKTsKICAgIH0KICAgIC8vIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgb3V0cHV0IHdpZGdldHMKICAgIGlmIChkZWZpbml0aW9uLnR5cGUgIT09ICJvdXRwdXQiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsKICAgIH0KICAgIC8vIFRPRE86IFZlcmlmeSB0aGF0IC5uYW1lIGlzIGEgdmFsaWQgQ1NTIGNsYXNzbmFtZQoKICAgIC8vIFN1cHBvcnQgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb25zLiBPbGQtc3R5bGUgY2xhc3MtYm91bmQKICAgIC8vIGRlZmluaXRpb25zIGhhdmUgb25lIHdpZGdldCAib2JqZWN0IiBwZXIgd2lkZ2V0IHBlciB0eXBlL2NsYXNzIG9mCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cwogICAgLy8gdGFrZSBlbCBhbmQgaW5zdGFuY2UgYXJndW1lbnRzLCBiZWNhdXNlIHRoZSB3aWRnZXQgb2JqZWN0IGNhbid0CiAgICAvLyBzdG9yZSB0aGVtLiBOZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0CiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0CiAgICAvLyBwcm92aWRlIHJlbmRlclZhbHVlIG9yIHJlc2l6ZSBtZXRob2RzIGF0IGFsbCwganVzdCB0aGUgc2luZ2xlIG1ldGhvZAogICAgLy8gICBmYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4KICAgIC8vIFRoaXMgZW5hYmxlcyBhIGZhciBtb3JlIG5hdHVyYWwgcHJvZ3JhbW1pbmcgc3R5bGUgZm9yIHRoZSB3aWRnZXQKICAgIC8vIGF1dGhvciwgd2hvIGNhbiBzdG9yZSBwZXItaW5zdGFuY2Ugc3RhdGUgdXNpbmcgZWl0aGVyIE9PLXN0eWxlCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzCiAgICAvLyBpcyBpbiBjb250cmFzdCB0byB3aGF0IGNhbiBvbmx5IGJlIGNhbGxlZCBDLXN0eWxlIHBzZXVkby1PTyB3aGljaCBpcwogICAgLy8gd2hhdCB3ZSByZXF1aXJlZCBiZWZvcmUpLgogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgewogICAgICBkZWZpbml0aW9uID0gY3JlYXRlTGVnYWN5RGVmaW5pdGlvbkFkYXB0ZXIoZGVmaW5pdGlvbik7CiAgICB9CgogICAgaWYgKCFkZWZpbml0aW9uLnJlbmRlclZhbHVlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHJlbmRlclZhbHVlIGZ1bmN0aW9uIik7CiAgICB9CgogICAgLy8gRm9yIHN0YXRpYyByZW5kZXJpbmcgKG5vbi1TaGlueSksIHVzZSBhIHNpbXBsZSB3aWRnZXQgcmVnaXN0cmF0aW9uCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28KICAgIC8vIGNvbnRhaW4gc3RhdGljIHdpZGdldHMuCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLgogICAgdmFyIHN0YXRpY0JpbmRpbmcgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKICAgIG92ZXJyaWRlTWV0aG9kKHN0YXRpY0JpbmRpbmcsICJmaW5kIiwgZnVuY3Rpb24oc3VwZXJmdW5jKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgewogICAgICAgIHZhciByZXN1bHRzID0gc3VwZXJmdW5jKHNjb3BlKTsKICAgICAgICAvLyBGaWx0ZXIgb3V0IFNoaW55IG91dHB1dHMsIHdlIG9ubHkgd2FudCB0aGUgc3RhdGljIGtpbmQKICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOwogICAgICB9OwogICAgfSk7CiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOwoKICAgIGlmIChzaGlueU1vZGUpIHsKICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4KICAgICAgLy8gVGhlIGRlZmluaXRpb24gaXRzZWxmIHdpbGwgbm90IGJlIHRoZSBvdXRwdXQgYmluZGluZywgaW5zdGVhZAogICAgICAvLyB3ZSB3aWxsIG1ha2UgYW4gb3V0cHV0IGJpbmRpbmcgb2JqZWN0IHRoYXQgZGVsZWdhdGVzIHRvIHRoZQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kCiAgICAgIC8vIG5hbWUgKHJlbmRlclZhbHVlKSBmb3IgaHRtbHdpZGdldHMgZGVmaW5pdGlvbiBhbmQgU2hpbnkgYmluZGluZ3MKICAgICAgLy8gYnV0IHRoZXkgYWN0dWFsbHkgaGF2ZSBxdWl0ZSBkaWZmZXJlbnQgc2VtYW50aWNzICh0aGUgU2hpbnkKICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0CiAgICAgIC8vIHN0cmlwcyBvZmYgYmVmb3JlIGNhbGxpbmcgaHRtbHdpZGdldHMgcmVuZGVyVmFsdWUpLiBXZSBjYW4ndAogICAgICAvLyBqdXN0IGlnbm9yZSB0aGUgZGlmZmVyZW5jZSBiZWNhdXNlIGluIHNvbWUgd2lkZ2V0cyBpdCdzIGhlbHBmdWwKICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZgogICAgICAvLyB3ZSdyZSBub3QgZGVsZWdhdGluZywgdGhlbiB0aGF0IGNhbGwgd2lsbCBnbyB0byB0aGUgU2hpbnkKICAgICAgLy8gdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBodG1sd2lkZ2V0cyB2ZXJzaW9uLgoKICAgICAgLy8gTWVyZ2UgZGVmYXVsdHMgd2l0aCBkZWZpbml0aW9uLCB3aXRob3V0IG11dGF0aW5nIGVpdGhlci4KICAgICAgdmFyIGJpbmRpbmdEZWYgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKCiAgICAgIC8vIFRoaXMgb2JqZWN0IHdpbGwgYmUgb3VyIGFjdHVhbCBTaGlueSBiaW5kaW5nLgogICAgICB2YXIgc2hpbnlCaW5kaW5nID0gbmV3IFNoaW55Lk91dHB1dEJpbmRpbmcoKTsKCiAgICAgIC8vIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgd2UnbGwgd2FudCB0byBzaW1wbHkgdXNlIHRoZSBiaW5kaW5nRGVmJ3MKICAgICAgLy8gdmVyc2lvbiBvZiBtZXRob2RzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0bwogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwKICAgICAgLy8gbWV0aG9kcyBpbiB0aGUgZnV0dXJlLCBhbmQgd2Ugd2FudCB0aGVtIHRvIGJlIG92ZXJyaWRlYWJsZSBieQogICAgICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcgZGVmaW5pdGlvbnMsIHRoZW4gd2UnbGwgbmVlZCB0byBhZGQgdGhlbSB0byB0aGlzCiAgICAgIC8vIGxpc3QuCiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImdldElkIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgIm9uVmFsdWVDaGFuZ2UiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgInJlbmRlckVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImNsZWFyRXJyb3IiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7CgogICAgICAvLyBUaGUgZmluZCwgcmVuZGVyVmFsdWUsIGFuZCByZXNpemUgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIGJlY2F1c2Ugd2UKICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4KCiAgICAgIHNoaW55QmluZGluZy5maW5kID0gZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7CgogICAgICAgIC8vIE9ubHkgcmV0dXJuIGVsZW1lbnRzIHRoYXQgYXJlIFNoaW55IG91dHB1dHMsIG5vdCBzdGF0aWMgb25lcwogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7CgogICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3aGF0ZXZlciBjYXVzZWQgU2hpbnkgdG8gdGhpbmsgdGhlcmUgbWlnaHQgYmUKICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuCiAgICAgICAgLy8gU2luY2UgdGhlcmUgbWlnaHQgYmUgbG90cyBvZiBkaWZmZXJlbnQgaHRtbHdpZGdldHMgYmluZGluZ3MsIHdlCiAgICAgICAgLy8gc2NoZWR1bGUgZXhlY3V0aW9uIGZvciBsYXRlci0tbm8gbmVlZCB0byBzdGF0aWNSZW5kZXIgbXVsdGlwbGUKICAgICAgICAvLyB0aW1lcy4KICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggIT09IGR5bmFtaWNSZXN1bHRzLmxlbmd0aCkKICAgICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyKCk7CgogICAgICAgIHJldHVybiBkeW5hbWljUmVzdWx0czsKICAgICAgfTsKCiAgICAgIC8vIFdyYXAgcmVuZGVyVmFsdWUgdG8gaGFuZGxlIGluaXRpYWxpemF0aW9uLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGlzbid0CiAgICAgIC8vIHN1cHBvcnRlZCBuYXRpdmVseSBieSBTaGlueSBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCgogICAgICBzaGlueUJpbmRpbmcucmVuZGVyVmFsdWUgPSBmdW5jdGlvbihlbCwgZGF0YSkgewogICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgZGF0YS5ldmFscyAmJiBpIDwgZGF0YS5ldmFscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1tpXSk7CiAgICAgICAgfQogICAgICAgIGlmICghYmluZGluZ0RlZi5yZW5kZXJPbk51bGxWYWx1ZSkgewogICAgICAgICAgaWYgKGRhdGEueCA9PT0gbnVsbCkgewogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7CiAgICAgICAgICBpbml0U2l6aW5nKGVsKTsKCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7CiAgICAgICAgICBpZiAoYmluZGluZ0RlZi5pbml0aWFsaXplKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBiaW5kaW5nRGVmLmluaXRpYWxpemUoZWwsIGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICAgIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiLCByZXN1bHQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBTaGlueS5yZW5kZXJEZXBlbmRlbmNpZXMoZGF0YS5kZXBzKTsKICAgICAgICBiaW5kaW5nRGVmLnJlbmRlclZhbHVlKGVsLCBkYXRhLngsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7CiAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7CiAgICAgIH07CgogICAgICAvLyBPbmx5IG92ZXJyaWRlIHJlc2l6ZSBpZiBiaW5kaW5nRGVmIGltcGxlbWVudHMgaXQKICAgICAgaWYgKGJpbmRpbmdEZWYucmVzaXplKSB7CiAgICAgICAgc2hpbnlCaW5kaW5nLnJlc2l6ZSA9IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgICAvLyBTaGlueSBjYW4gY2FsbCByZXNpemUgYmVmb3JlIGluaXRpYWxpemUvcmVuZGVyVmFsdWUgaGF2ZSBiZWVuCiAgICAgICAgICAvLyBjYWxsZWQsIHdoaWNoIGRvZXNuJ3QgbWFrZSBzZW5zZSBmb3Igd2lkZ2V0cy4KICAgICAgICAgIGlmIChlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIikpIHsKICAgICAgICAgICAgYmluZGluZ0RlZi5yZXNpemUoZWwsIHdpZHRoLCBoZWlnaHQsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgU2hpbnkub3V0cHV0QmluZGluZ3MucmVnaXN0ZXIoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLm5hbWUpOwogICAgfQogIH07CgogIHZhciBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogIGZ1bmN0aW9uIHNjaGVkdWxlU3RhdGljUmVuZGVyKCkgewogICAgaWYgKCFzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQpIHsKICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsKICAgICAgfSwgMSk7CiAgICB9CiAgfQoKICAvLyBSZW5kZXIgc3RhdGljIHdpZGdldHMgYWZ0ZXIgdGhlIGRvY3VtZW50IGZpbmlzaGVzIGxvYWRpbmcKICAvLyBTdGF0aWNhbGx5IHJlbmRlciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgb2YgdGhpcyB3aWRnZXQncyBjbGFzcwogIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIgPSBmdW5jdGlvbigpIHsKICAgIHZhciBiaW5kaW5ncyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgZm9yRWFjaChiaW5kaW5ncywgZnVuY3Rpb24oYmluZGluZykgewogICAgICB2YXIgbWF0Y2hlcyA9IGJpbmRpbmcuZmluZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOwogICAgICBmb3JFYWNoKG1hdGNoZXMsIGZ1bmN0aW9uKGVsKSB7CiAgICAgICAgdmFyIHNpemVPYmogPSBpbml0U2l6aW5nKGVsLCBiaW5kaW5nKTsKCiAgICAgICAgaWYgKGhhc0NsYXNzKGVsLCAiaHRtbC13aWRnZXQtc3RhdGljLWJvdW5kIikpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lICsgIiBodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiOwoKICAgICAgICB2YXIgaW5pdFJlc3VsdDsKICAgICAgICBpZiAoYmluZGluZy5pbml0aWFsaXplKSB7CiAgICAgICAgICBpbml0UmVzdWx0ID0gYmluZGluZy5pbml0aWFsaXplKGVsLAogICAgICAgICAgICBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0CiAgICAgICAgICApOwogICAgICAgICAgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIsIGluaXRSZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGJpbmRpbmcucmVzaXplKSB7CiAgICAgICAgICB2YXIgbGFzdFNpemUgPSB7fTsKICAgICAgICAgIHZhciByZXNpemVIYW5kbGVyID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICB2YXIgc2l6ZSA9IHsKICAgICAgICAgICAgICB3OiBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgICAgaDogc2l6ZU9iaiA/IHNpemVPYmouZ2V0SGVpZ2h0KCkgOiBlbC5vZmZzZXRIZWlnaHQKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHNpemUudyA9PT0gMCAmJiBzaXplLmggPT09IDApCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBpZiAoc2l6ZS53ID09PSBsYXN0U2l6ZS53ICYmIHNpemUuaCA9PT0gbGFzdFNpemUuaCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGxhc3RTaXplID0gc2l6ZTsKICAgICAgICAgICAgYmluZGluZy5yZXNpemUoZWwsIHNpemUudywgc2l6ZS5oLCBpbml0UmVzdWx0KTsKICAgICAgICAgIH07CgogICAgICAgICAgb24od2luZG93LCAicmVzaXplIiwgcmVzaXplSGFuZGxlcik7CgogICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIGNhc2VzIHdoZXJlIHdlJ3JlIHJ1bm5pbmcgaW4gYSBTaGlueQogICAgICAgICAgLy8gYXBwLCBidXQgdGhlIHdpZGdldCBpdHNlbGYgaXMgbm90IGEgU2hpbnkgb3V0cHV0LCBidXQKICAgICAgICAgIC8vIHJhdGhlciBhIHNpbXBsZSBzdGF0aWMgd2lkZ2V0LiBPbmUgZXhhbXBsZSBvZiB0aGlzIGlzCiAgICAgICAgICAvLyBhbiBybWFya2Rvd24gZG9jdW1lbnQgdGhhdCBoYXMgcnVudGltZTpzaGlueSBhbmQgd2lkZ2V0CiAgICAgICAgICAvLyB0aGF0IGlzbid0IGluIGEgcmVuZGVyIGZ1bmN0aW9uLiBTaGlueSBvbmx5IGtub3dzIHRvCiAgICAgICAgICAvLyBjYWxsIHJlc2l6ZSBoYW5kbGVycyBmb3IgU2hpbnkgb3V0cHV0cywgbm90IGZvciBzdGF0aWMKICAgICAgICAgIC8vIHdpZGdldHMsIHNvIHdlIGRvIGl0IG91cnNlbHZlcy4KICAgICAgICAgIGlmICh3aW5kb3cualF1ZXJ5KSB7CiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKAogICAgICAgICAgICAgICJzaG93bi5odG1sd2lkZ2V0cyBzaG93bi5icy50YWIuaHRtbHdpZGdldHMgc2hvd24uYnMuY29sbGFwc2UuaHRtbHdpZGdldHMiLAogICAgICAgICAgICAgIHJlc2l6ZUhhbmRsZXIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgd2luZG93LmpRdWVyeShkb2N1bWVudCkub24oCiAgICAgICAgICAgICAgImhpZGRlbi5odG1sd2lkZ2V0cyBoaWRkZW4uYnMudGFiLmh0bWx3aWRnZXRzIGhpZGRlbi5icy5jb2xsYXBzZS5odG1sd2lkZ2V0cyIsCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcgogICAgICAgICAgICApOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgc3BlY2lmaWMgY2FzZSBvZiBpb3NsaWRlcywgd2hpY2gKICAgICAgICAgIC8vIGZsaXBzIHNsaWRlcyBiZXR3ZWVuIGRpc3BsYXk6bm9uZSBhbmQgZGlzcGxheTpibG9jay4KICAgICAgICAgIC8vIElkZWFsbHkgd2Ugd291bGQgbm90IGhhdmUgdG8gaGF2ZSBpb3NsaWRlLXNwZWNpZmljIGNvZGUKICAgICAgICAgIC8vIGhlcmUsIGJ1dCByYXRoZXIgaGF2ZSBpb3NsaWRlcyByYWlzZSBhIGdlbmVyaWMgZXZlbnQsCiAgICAgICAgICAvLyBidXQgdGhlIHJtYXJrZG93biBwYWNrYWdlIGp1c3Qgd2VudCB0byBDUkFOIHNvIHRoZQogICAgICAgICAgLy8gd2luZG93IHRvIGdldHRpbmcgdGhhdCBmaXhlZCBtYXkgYmUgbG9uZy4KICAgICAgICAgIGlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikgewogICAgICAgICAgICAvLyBJdCdzIE9LIHRvIGxpbWl0IHRoaXMgdG8gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIKICAgICAgICAgICAgLy8gYnJvd3NlcnMgYmVjYXVzZSBpb3NsaWRlcyBpdHNlbGYgb25seSBzdXBwb3J0cwogICAgICAgICAgICAvLyBzdWNoIGJyb3dzZXJzLgogICAgICAgICAgICBvbihkb2N1bWVudCwgInNsaWRlZW50ZXIiLCByZXNpemVIYW5kbGVyKTsKICAgICAgICAgICAgb24oZG9jdW1lbnQsICJzbGlkZWxlYXZlIiwgcmVzaXplSGFuZGxlcik7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgc2NyaXB0RGF0YSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtkYXRhLWZvcj0nIiArIGVsLmlkICsgIiddW3R5cGU9J2FwcGxpY2F0aW9uL2pzb24nXSIpOwogICAgICAgIGlmIChzY3JpcHREYXRhKSB7CiAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2Uoc2NyaXB0RGF0YS50ZXh0Q29udGVudCB8fCBzY3JpcHREYXRhLnRleHQpOwogICAgICAgICAgLy8gUmVzb2x2ZSBzdHJpbmdzIG1hcmtlZCBhcyBqYXZhc2NyaXB0IGxpdGVyYWxzIHRvIG9iamVjdHMKICAgICAgICAgIGlmICghKGRhdGEuZXZhbHMgaW5zdGFuY2VvZiBBcnJheSkpIGRhdGEuZXZhbHMgPSBbZGF0YS5ldmFsc107CiAgICAgICAgICBmb3IgKHZhciBrID0gMDsgZGF0YS5ldmFscyAmJiBrIDwgZGF0YS5ldmFscy5sZW5ndGg7IGsrKykgewogICAgICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIoZGF0YS54LCBkYXRhLmV2YWxzW2tdKTsKICAgICAgICAgIH0KICAgICAgICAgIGJpbmRpbmcucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgaW5pdFJlc3VsdCk7CiAgICAgICAgICBldmFsQW5kUnVuKGRhdGEuanNIb29rcy5yZW5kZXIsIGluaXRSZXN1bHQsIFtlbCwgZGF0YS54XSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwoKICAgIGludm9rZVBvc3RSZW5kZXJIYW5kbGVycygpOwogIH0KCiAgLy8gV2FpdCB1bnRpbCBhZnRlciB0aGUgZG9jdW1lbnQgaGFzIGxvYWRlZCB0byByZW5kZXIgdGhlIHdpZGdldHMuCiAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigpIHsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlKTsKICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgfSwgZmFsc2UpOwogIH0gZWxzZSBpZiAoZG9jdW1lbnQuYXR0YWNoRXZlbnQpIHsKICAgIGRvY3VtZW50LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBmdW5jdGlvbigpIHsKICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIpIHsKICAgICAgICBkb2N1bWVudC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgYXJndW1lbnRzLmNhbGxlZSk7CiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgICB9CiAgICB9KTsKICB9CgoKICB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0QXR0YWNobWVudFVybCA9IGZ1bmN0aW9uKGRlcG5hbWUsIGtleSkgewogICAgLy8gSWYgbm8ga2V5LCBkZWZhdWx0IHRvIHRoZSBmaXJzdCBpdGVtCiAgICBpZiAodHlwZW9mKGtleSkgPT09ICJ1bmRlZmluZWQiKQogICAgICBrZXkgPSAxOwoKICAgIHZhciBsaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGVwbmFtZSArICItIiArIGtleSArICItYXR0YWNobWVudCIpOwogICAgaWYgKCFsaW5rKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiQXR0YWNobWVudCAiICsgZGVwbmFtZSArICIvIiArIGtleSArICIgbm90IGZvdW5kIGluIGRvY3VtZW50Iik7CiAgICB9CiAgICByZXR1cm4gbGluay5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKICB9OwoKICB3aW5kb3cuSFRNTFdpZGdldHMuZGF0YWZyYW1lVG9EMyA9IGZ1bmN0aW9uKGRmKSB7CiAgICB2YXIgbmFtZXMgPSBbXTsKICAgIHZhciBsZW5ndGg7CiAgICBmb3IgKHZhciBuYW1lIGluIGRmKSB7CiAgICAgICAgaWYgKGRmLmhhc093blByb3BlcnR5KG5hbWUpKQogICAgICAgICAgICBuYW1lcy5wdXNoKG5hbWUpOwogICAgICAgIGlmICh0eXBlb2YoZGZbbmFtZV0pICE9PSAib2JqZWN0IiB8fCB0eXBlb2YoZGZbbmFtZV0ubGVuZ3RoKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIik7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YobGVuZ3RoKSAhPT0gInVuZGVmaW5lZCIgJiYgbGVuZ3RoICE9PSBkZltuYW1lXS5sZW5ndGgpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIG9mIHRoZSBzYW1lIGxlbmd0aCIpOwogICAgICAgIH0KICAgICAgICBsZW5ndGggPSBkZltuYW1lXS5sZW5ndGg7CiAgICB9CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgdmFyIGl0ZW07CiAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCBsZW5ndGg7IHJvdysrKSB7CiAgICAgICAgaXRlbSA9IHt9OwogICAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG5hbWVzLmxlbmd0aDsgY29sKyspIHsKICAgICAgICAgICAgaXRlbVtuYW1lc1tjb2xdXSA9IGRmW25hbWVzW2NvbF1dW3Jvd107CiAgICAgICAgfQogICAgICAgIHJlc3VsdHMucHVzaChpdGVtKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIHdpbmRvdy5IVE1MV2lkZ2V0cy50cmFuc3Bvc2VBcnJheTJEID0gZnVuY3Rpb24oYXJyYXkpIHsKICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFycmF5OwogICAgICB2YXIgbmV3QXJyYXkgPSBhcnJheVswXS5tYXAoZnVuY3Rpb24oY29sLCBpKSB7CiAgICAgICAgICByZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uKHJvdykgewogICAgICAgICAgICAgIHJldHVybiByb3dbaV0KICAgICAgICAgIH0pCiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3QXJyYXk7CiAgfTsKICAvLyBTcGxpdCB2YWx1ZSBhdCBzcGxpdENoYXIsIGJ1dCBhbGxvdyBzcGxpdENoYXIgdG8gYmUgZXNjYXBlZAogIC8vIHVzaW5nIGVzY2FwZUNoYXIuIEFueSBvdGhlciBjaGFyYWN0ZXJzIGVzY2FwZWQgYnkgZXNjYXBlQ2hhcgogIC8vIHdpbGwgYmUgaW5jbHVkZWQgYXMgdXN1YWwgKGluY2x1ZGluZyBlc2NhcGVDaGFyIGl0c2VsZikuCiAgZnVuY3Rpb24gc3BsaXRXaXRoRXNjYXBlKHZhbHVlLCBzcGxpdENoYXIsIGVzY2FwZUNoYXIpIHsKICAgIHZhciByZXN1bHRzID0gW107CiAgICB2YXIgZXNjYXBlTW9kZSA9IGZhbHNlOwogICAgdmFyIGN1cnJlbnRSZXN1bHQgPSAiIjsKICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IHZhbHVlLmxlbmd0aDsgcG9zKyspIHsKICAgICAgaWYgKCFlc2NhcGVNb2RlKSB7CiAgICAgICAgaWYgKHZhbHVlW3Bvc10gPT09IHNwbGl0Q2hhcikgewogICAgICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOwogICAgICAgICAgY3VycmVudFJlc3VsdCA9ICIiOwogICAgICAgIH0gZWxzZSBpZiAodmFsdWVbcG9zXSA9PT0gZXNjYXBlQ2hhcikgewogICAgICAgICAgZXNjYXBlTW9kZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGN1cnJlbnRSZXN1bHQgKz0gdmFsdWVbcG9zXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOwogICAgICAgIGVzY2FwZU1vZGUgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgaWYgKGN1cnJlbnRSZXN1bHQgIT09ICIiKSB7CiAgICAgIHJlc3VsdHMucHVzaChjdXJyZW50UmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH0KICAvLyBGdW5jdGlvbiBhdXRob3JlZCBieSBZaWh1aS9KSiBBbGxhaXJlCiAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyID0gZnVuY3Rpb24obywgbWVtYmVyKSB7CiAgICB2YXIgcGFydHMgPSBzcGxpdFdpdGhFc2NhcGUobWVtYmVyLCAnLicsICdcXCcpOwogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBwYXJ0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsKICAgICAgLy8gcGFydCBtYXkgYmUgYSBjaGFyYWN0ZXIgb3IgJ251bWVyaWMnIG1lbWJlciBuYW1lCiAgICAgIGlmIChvICE9PSBudWxsICYmIHR5cGVvZiBvID09PSAib2JqZWN0IiAmJiBwYXJ0IGluIG8pIHsKICAgICAgICBpZiAoaSA9PSAobCAtIDEpKSB7IC8vIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIHRoZW4gZXZhbHVsYXRlCiAgICAgICAgICBpZiAodHlwZW9mIG9bcGFydF0gPT09ICJzdHJpbmciKQogICAgICAgICAgICBvW3BhcnRdID0gZXZhbCgiKCIgKyBvW3BhcnRdICsgIikiKTsKICAgICAgICB9IGVsc2UgeyAvLyBvdGhlcndpc2UgY29udGludWUgdG8gbmV4dCBlbWJlZGRlZCBvYmplY3QKICAgICAgICAgIG8gPSBvW3BhcnRdOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH07CgogIC8vIFJldHJpZXZlIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlIChpLmUuIHRoZSByZXR1cm4gdmFsdWUgb2YgYW4KICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQogIC8vIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50LCBvciBudWxsIGlmIG5vbmUuCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlID0gZnVuY3Rpb24oZWwpIHsKICAgIHJldHVybiBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0Iik7CiAgfTsKCiAgLy8gRmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHNjb3BlIHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsCiAgLy8gYW5kIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZgogIC8vIGFuIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pCiAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoYXQgZWxlbWVudCwgaWYgYW55LiBJZiBubyBlbGVtZW50IG1hdGNoZXMgdGhlCiAgLy8gc2VsZWN0b3IsIG9yIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IGhhcyBubyBIVE1MV2lkZ2V0CiAgLy8gaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGl0LCB0aGVuIG51bGwgaXMgcmV0dXJuZWQuCiAgLy8KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmQgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgc2VsZWN0b3IgPSBzY29wZTsKICAgICAgc2NvcGUgPSBkb2N1bWVudDsKICAgIH0KCiAgICB2YXIgZWwgPSBzY29wZS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgIGlmIChlbCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2UoZWwpOwogICAgfQogIH07CgogIC8vIEZpbmRzIGFsbCBlbGVtZW50cyBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IsIGFuZAogIC8vIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2VzIChpLmUuIHRoZSByZXR1cm4gdmFsdWVzIG9mCiAgLy8gYW4gSFRNTFdpZGdldCBiaW5kaW5nJ3MgaW5pdGlhbGl6ZSgpIG9yIGZhY3RvcnkoKSBmdW5jdGlvbikKICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnRzLCBpbiBhbiBhcnJheS4gSWYgZWxlbWVudHMgdGhhdAogIC8vIG1hdGNoIHRoZSBzZWxlY3RvciBkb24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgSFRNTFdpZGdldAogIC8vIGluc3RhbmNlLCB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBjb250YWluIG51bGxzLgogIC8vCiAgLy8gVGhlIHNjb3BlIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCBhbmQgZGVmYXVsdHMgdG8gd2luZG93LmRvY3VtZW50LgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5maW5kQWxsID0gZnVuY3Rpb24oc2NvcGUsIHNlbGVjdG9yKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgIHNlbGVjdG9yID0gc2NvcGU7CiAgICAgIHNjb3BlID0gZG9jdW1lbnQ7CiAgICB9CgogICAgdmFyIG5vZGVzID0gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewogICAgICByZXN1bHRzLnB1c2god2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlKG5vZGVzW2ldKSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICB2YXIgcG9zdFJlbmRlckhhbmRsZXJzID0gW107CiAgZnVuY3Rpb24gaW52b2tlUG9zdFJlbmRlckhhbmRsZXJzKCkgewogICAgd2hpbGUgKHBvc3RSZW5kZXJIYW5kbGVycy5sZW5ndGgpIHsKICAgICAgdmFyIGhhbmRsZXIgPSBwb3N0UmVuZGVySGFuZGxlcnMuc2hpZnQoKTsKICAgICAgaWYgKGhhbmRsZXIpIHsKICAgICAgICBoYW5kbGVyKCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFJlZ2lzdGVyIHRoZSBnaXZlbiBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBpbnZva2VkIGFmdGVyIHRoZQogIC8vIG5leHQgdGltZSBzdGF0aWMgd2lkZ2V0cyBhcmUgcmVuZGVyZWQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmFkZFBvc3RSZW5kZXJIYW5kbGVyID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIHBvc3RSZW5kZXJIYW5kbGVycy5wdXNoKGNhbGxiYWNrKTsKICB9OwoKICAvLyBUYWtlcyBhIG5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9uLCBhbmQgcmV0dXJucyBhbgogIC8vIG9sZC1zdHlsZSBjbGFzcy1ib3VuZCBkZWZpbml0aW9uLiBUaGlzIHNhdmVzIHVzIGZyb20gaGF2aW5nCiAgLy8gdG8gcmV3cml0ZSBhbGwgdGhlIGxvZ2ljIGluIHRoaXMgZmlsZSB0byBhY2NvbW9kYXRlIGJvdGgKICAvLyB0eXBlcyBvZiBkZWZpbml0aW9ucy4KICBmdW5jdGlvbiBjcmVhdGVMZWdhY3lEZWZpbml0aW9uQWRhcHRlcihkZWZuKSB7CiAgICB2YXIgcmVzdWx0ID0gewogICAgICBuYW1lOiBkZWZuLm5hbWUsCiAgICAgIHR5cGU6IGRlZm4udHlwZSwKICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICByZXR1cm4gZGVmbi5mYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgfSwKICAgICAgcmVuZGVyVmFsdWU6IGZ1bmN0aW9uKGVsLCB4LCBpbnN0YW5jZSkgewogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZW5kZXJWYWx1ZSh4KTsKICAgICAgfSwKICAgICAgcmVzaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCwgaW5zdGFuY2UpIHsKICAgICAgICByZXR1cm4gaW5zdGFuY2UucmVzaXplKHdpZHRoLCBoZWlnaHQpOwogICAgICB9CiAgICB9OwoKICAgIGlmIChkZWZuLmZpbmQpCiAgICAgIHJlc3VsdC5maW5kID0gZGVmbi5maW5kOwogICAgaWYgKGRlZm4ucmVuZGVyRXJyb3IpCiAgICAgIHJlc3VsdC5yZW5kZXJFcnJvciA9IGRlZm4ucmVuZGVyRXJyb3I7CiAgICBpZiAoZGVmbi5jbGVhckVycm9yKQogICAgICByZXN1bHQuY2xlYXJFcnJvciA9IGRlZm4uY2xlYXJFcnJvcjsKCiAgICByZXR1cm4gcmVzdWx0OwogIH0KfSkoKTsKCg=="></script>
<link href="data:text/css;charset=utf-8,%2Esunburst%2Dmain%20%7B%0Awidth%3A%2090%25%3B%0Aheight%3A%20100%25%3B%0A%7D%0A%2Esunburst%2Dsidebar%20%7B%0Aposition%3A%20absolute%3B%0Aright%3A%2010px%3B%0Atop%3A%2010px%3B%0A%7D%0A%2Esunburst%2Dsequence%20%7B%0Awidth%3A%20100%25%3B%0Aposition%3A%20absolute%3B%0Atop%3A%200px%3B%0Aleft%3A%200px%3B%0Apointer%2Devents%3A%20none%3B%0A%7D%0A%2Esunburst%2Dlegend%20%7B%0Apadding%3A%2010px%200%200%203px%3B%0A%7D%0A%2Esunburst%2Dchart%20%7B%0Awidth%3A%20100%25%3B%0Aheight%3A%20100%25%3B%0Aposition%3A%20absolute%3B%0Atop%3A%2070px%3B%0A%7D%0A%2Esunburst%2Dchart%20path%20%7B%0Astroke%3A%20%23fff%3B%0A%7D%0A%2Esunburst%2Dexplanation%20%7B%0Aposition%3A%20absolute%3B%0Atext%2Dalign%3A%20center%3B%0Acolor%3A%20%23666%3B%0Az%2Dindex%3A%20999%3B%0Afont%2Dsize%3A%202em%3B%0Apointer%2Devents%3A%20none%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrbysiJyIpO3Rocm93IGYuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSh7MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7DQooZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgew0KCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkocmVxdWlyZSgnZDMtZGlzcGF0Y2gnKSwgcmVxdWlyZSgnZDMtYXJyYXknKSwgcmVxdWlyZSgnZDMtZm9ybWF0JyksIHJlcXVpcmUoJ2QzLXNlbGVjdGlvbicpLCByZXF1aXJlKCdkMy1zY2FsZScpLCByZXF1aXJlKCdkMy1zaGFwZScpLCByZXF1aXJlKCdkMy1oaWVyYXJjaHknKSwgcmVxdWlyZSgnZDMtY29sbGVjdGlvbicpLCByZXF1aXJlKCdkMy10cmFuc2l0aW9uJykpIDoNCgl0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydkMy1kaXNwYXRjaCcsICdkMy1hcnJheScsICdkMy1mb3JtYXQnLCAnZDMtc2VsZWN0aW9uJywgJ2QzLXNjYWxlJywgJ2QzLXNoYXBlJywgJ2QzLWhpZXJhcmNoeScsICdkMy1jb2xsZWN0aW9uJywgJ2QzLXRyYW5zaXRpb24nXSwgZmFjdG9yeSkgOg0KCShmYWN0b3J5KGdsb2JhbC5kMyxnbG9iYWwuZDMsZ2xvYmFsLmQzLGdsb2JhbC5kMyxnbG9iYWwuZDMsZ2xvYmFsLmQzLGdsb2JhbC5kMyxnbG9iYWwuZDMsZ2xvYmFsLmQzKSk7DQp9KHRoaXMsIChmdW5jdGlvbiAoZDNEaXNwYXRjaCxkM0FycmF5LGQzRm9ybWF0LGQzU2VsZWN0aW9uLGQzU2NhbGUsZDNTaGFwZSxkM0hpZXJhcmNoeSxkM0NvbGxlY3Rpb24sZDNUcmFuc2l0aW9uKSB7ICd1c2Ugc3RyaWN0JzsNCg0KLy8gQ29waWVzIGEgdmFyaWFibGUgbnVtYmVyIG9mIG1ldGhvZHMgZnJvbSBzb3VyY2UgdG8gdGFyZ2V0Lg0KdmFyIHJlYmluZCA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkgew0KICB2YXIgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoLCBtZXRob2Q7DQogIHdoaWxlICgrK2kgPCBuKSB0YXJnZXRbbWV0aG9kID0gYXJndW1lbnRzW2ldXSA9IGQzX3JlYmluZCh0YXJnZXQsIHNvdXJjZSwgc291cmNlW21ldGhvZF0pOw0KICByZXR1cm4gdGFyZ2V0Ow0KfTsNCg0KLy8gTWV0aG9kIGlzIGFzc3VtZWQgdG8gYmUgYSBzdGFuZGFyZCBEMyBnZXR0ZXItc2V0dGVyOg0KICAvLyBJZiBwYXNzZWQgd2l0aCBubyBhcmd1bWVudHMsIGdldHMgdGhlIHZhbHVlLg0KLy8gSWYgcGFzc2VkIHdpdGggYXJndW1lbnRzLCBzZXRzIHRoZSB2YWx1ZSBhbmQgcmV0dXJucyB0aGUgdGFyZ2V0Lg0KZnVuY3Rpb24gZDNfcmViaW5kKHRhcmdldCwgc291cmNlLCBtZXRob2QpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHZhciB2YWx1ZSA9IG1ldGhvZC5hcHBseShzb3VyY2UsIGFyZ3VtZW50cyk7DQogICAgcmV0dXJuIHZhbHVlID09PSBzb3VyY2UgPyB0YXJnZXQgOiB2YWx1ZTsNCiAgfTsNCn0NCg0KdmFyIGRyYXcgPSBmdW5jdGlvbiAoZWwsIGluc3RhbmNlLCBkaXNwYXRjaF8pIHsNCiAgLy8gd291bGQgYmUgbXVjaCBuaWNlciB0byBpbXBsZW1lbnQgdHJhbnNpdGlvbnMvYW5pbWF0aW9uDQogIC8vIHJlbW92ZSBwcmV2aW91cyBpbiBjYXNlIG9mIFNoaW55L2R5bmFtaWMNCiAgZDNTZWxlY3Rpb24uc2VsZWN0KGVsKS5zZWxlY3QoIi5zdW5idXJzdC1jaGFydCBzdmciKS5yZW1vdmUoKTsNCg0KICB2YXIgeCA9IGluc3RhbmNlLng7DQogIHZhciBqc29uID0gaW5zdGFuY2UuanNvbjsNCiAgdmFyIGNoYXJ0ID0gaW5zdGFuY2UuY2hhcnQ7DQoNCiAgLy8gRGltZW5zaW9ucyBvZiBzdW5idXJzdA0KICB2YXIgd2lkdGggPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAtICh4Lm9wdGlvbnMubGVnZW5kLncgPyB4Lm9wdGlvbnMubGVnZW5kLncgOiA3NSk7DQogIHZhciBoZWlnaHQgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgLSA3MDsNCiAgdmFyIHJhZGl1cyA9IE1hdGgubWluKHdpZHRoLCBoZWlnaHQpIC8gMjsNCg0KICBkM1NlbGVjdGlvbi5zZWxlY3QoZWwpLnNlbGVjdCgiLnN1bmJ1cnN0LWNoYXJ0IikuYXBwZW5kKCJzdmciKQ0KICAgIC5zdHlsZSgid2lkdGgiLCB3aWR0aCArICJweCIpIC8vIHNob3VsZG50IGhhdmUgdG8gZG8gdGhpcw0KICAgIC5zdHlsZSgiaGVpZ2h0IiwgaGVpZ2h0ICsgInB4Iik7IC8vIHNob3VsZG50IGhhdmUgdG8gZG8gdGhpcw0KDQogIC8vIEJyZWFkY3J1bWIgZGltZW5zaW9uczogd2lkdGgsIGhlaWdodCwgc3BhY2luZywgd2lkdGggb2YgdGlwL3RhaWwuDQogIC8vICB0aGVzZSB3aWxsIGJlIHRoZSBkZWZhdWx0cw0KICB2YXIgYiA9IHsNCiAgICB3OiAwLCBoOiAzMCwgczogMywgdDogMTANCiAgfTsNCiAgLy8gIGlmIGJyZWFkY3J1bWIgaXMgcHJvdmlkZWQgaW4gdGhlIG9wdGlvbiwgd2Ugd2lsbCBvdmVyd3JpdGUNCiAgLy8gICB3aXRoIHdoYXQgaXMgcHJvdmlkZWQNCiAgT2JqZWN0LmtleXMoeC5vcHRpb25zLmJyZWFkY3J1bWIpLm1hcChmdW5jdGlvbihreSl7DQogICAgYltreV0gPSB4Lm9wdGlvbnMuYnJlYWRjcnVtYltreV07DQogIH0pOw0KLyoNCiAgLy8gTWFwcGluZyBvZiBzdGVwIG5hbWVzIHRvIGNvbG9ycy4NCiAgdmFyIGNvbG9ycyA9IHsNCiAgICAiaG9tZSI6ICIjNTY4N2QxIiwNCiAgICAicHJvZHVjdCI6ICIjN2I2MTVjIiwNCiAgICAic2VhcmNoIjogIiNkZTc4M2IiLA0KICAgICJhY2NvdW50IjogIiM2YWI5NzUiLA0KICAgICJvdGhlciI6ICIjYTE3M2QxIiwNCiAgICAiZW5kIjogIiNiYmJiYmIiDQogIH07DQoqLw0KDQogIHZhciBjb2xvcnMgPSBkM1NjYWxlLnNjYWxlT3JkaW5hbChkM1NjYWxlLnNjaGVtZUNhdGVnb3J5MjApOw0KDQogIGlmKHgub3B0aW9ucy5jb2xvcnMgIT09IG51bGwpew0KICAgIC8vIGlmIGFuIGFycmF5IHRoZW4gd2UgYXNzdW1lIHRoZSBjb2xvcnMNCiAgICAvLyAgcmVwcmVzZW50IGFuIGFycmF5IG9mIGhleGFkZWNpbWFsIGNvbG9ycyB0byBiZSB1c2VkDQogICAgaWYoQXJyYXkuaXNBcnJheSh4Lm9wdGlvbnMuY29sb3JzKSkgew0KICAgICAgdHJ5ew0KICAgICAgICBjb2xvcnMucmFuZ2UoeC5vcHRpb25zLmNvbG9ycyk7DQogICAgICB9IGNhdGNoKGUpIHsNCg0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIGlmIGFuIG9iamVjdCB3aXRoIHJhbmdlIHRoZW4gd2UgYXNzdW1lDQogICAgLy8gIHRoYXQgdGhpcyBpcyBhbiBhcnJheSBvZiBjb2xvcnMgdG8gYmUgdXNlZCBhcyByYW5nZQ0KICAgIGlmKHgub3B0aW9ucy5jb2xvcnMucmFuZ2Upew0KICAgICAgdHJ5ew0KICAgICAgICBjb2xvcnMucmFuZ2UoeC5vcHRpb25zLmNvbG9ycy5yYW5nZSk7DQogICAgICB9IGNhdGNoKGUpIHsNCg0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIGlmIGFuIG9iamVjdCB3aXRoIGRvbWFpbiB0aGVuIHdlIGFzc3VtZQ0KICAgIC8vICB0aGF0IHRoaXMgaXMgYW4gYXJyYXkgb2YgY29sb3JzIHRvIGJlIHVzZWQgYXMgZG9tYWluDQogICAgLy8gIGZvciBtb3JlIHByZWNpc2UgY29udHJvbCBvZiB0aGUgY29sb3JzIGFzc2lnbmVkDQogICAgaWYoeC5vcHRpb25zLmNvbG9ycy5kb21haW4pew0KICAgICAgdHJ5ew0KICAgICAgICBjb2xvcnMuZG9tYWluKHgub3B0aW9ucy5jb2xvcnMuZG9tYWluKTsNCiAgICAgIH0gY2F0Y2goZSkgew0KDQogICAgICB9DQogICAgfQ0KDQogICAgLy8gaWYgYSBmdW5jdGlvbiB0aGVuIHNldCB0byB0aGUgZnVuY3Rpb24NCiAgICBpZih0eXBlb2YoeC5vcHRpb25zLmNvbG9ycykgPT09ICJmdW5jdGlvbiIpIHsNCiAgICAgIGNvbG9ycyA9IHgub3B0aW9ucy5jb2xvcnM7DQogICAgfQ0KICB9DQogIC8vIFRvdGFsIHNpemUgb2YgYWxsIHNlZ21lbnRzOyB3ZSBzZXQgdGhpcyBsYXRlciwgYWZ0ZXIgbG9hZGluZyB0aGUgZGF0YS4NCiAgdmFyIHRvdGFsU2l6ZSA9IDA7DQoNCiAgdmFyIHZpcyA9IGQzU2VsZWN0aW9uLnNlbGVjdChlbCkuc2VsZWN0KCIuc3VuYnVyc3QtY2hhcnQiKS5zZWxlY3QoInN2ZyIpDQogICAgICAuYXBwZW5kKCJnIikNCiAgICAgIC5hdHRyKCJpZCIsIGVsLmlkICsgIi1jb250YWluZXIiKQ0KICAgICAgLmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoIiArIHdpZHRoIC8gMiArICIsIiArIGhlaWdodCAvIDIgKyAiKSIpOw0KDQogIHZhciBwYXJ0aXRpb25lciA9IGQzSGllcmFyY2h5LnBhcnRpdGlvbigpDQogICAgICAuc2l6ZShbMiAqIE1hdGguUEksIHJhZGl1cyAqIHJhZGl1c10pOw0KDQogIHZhciBhcmNfc2hhcGUgPSBkM1NoYXBlLmFyYygpDQogICAgICAuc3RhcnRBbmdsZShmdW5jdGlvbihkKSB7IHJldHVybiBkLngwOyB9KQ0KICAgICAgLmVuZEFuZ2xlKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQueDE7IH0pDQogICAgICAuaW5uZXJSYWRpdXMoZnVuY3Rpb24oZCkgeyByZXR1cm4gTWF0aC5zcXJ0KGQueTApOyB9KQ0KICAgICAgLm91dGVyUmFkaXVzKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIE1hdGguc3FydChkLnkxKTsgfSk7DQoNCiAgY3JlYXRlVmlzdWFsaXphdGlvbihqc29uKTsNCg0KICAvLyBzZXQgdXAgYSBjb250YWluZXIgZm9yIHRhc2tzIHRvIHBlcmZvcm0gYWZ0ZXIgY29tcGxldGlvbg0KICAvLyAgb25lIGV4YW1wbGUgd291bGQgYmUgYWRkIGNhbGxiYWNrcyBmb3IgZXZlbnQgaGFuZGxpbmcNCiAgLy8gIHN0eWxpbmcNCiAgaWYgKCEodHlwZW9mIHgudGFza3MgPT09ICJ1bmRlZmluZWQiKSApew0KICAgIGlmICggKHR5cGVvZiB4LnRhc2tzLmxlbmd0aCA9PT0gInVuZGVmaW5lZCIpIHx8DQogICAgICh0eXBlb2YgeC50YXNrcyA9PT0gImZ1bmN0aW9uIiApICkgew0KICAgICAgIC8vIGhhbmRsZSBhIGZ1bmN0aW9uIG5vdCBlbmNsb3NlZCBpbiBhcnJheQ0KICAgICAgIC8vIHNob3VsZCBiZSBhYmxlIHRvIHJlbW92ZSBvbmNlIHVzaW5nIGpzb25saXRlDQogICAgICAgeC50YXNrcyA9IFt4LnRhc2tzXTsNCiAgICB9DQogICAgeC50YXNrcy5tYXAoZnVuY3Rpb24odCl7DQogICAgICAvLyBmb3IgZWFjaCB0YXNrcyBjYWxsIHRoZSB0YXNrIHdpdGggZWwgc3VwcGxpZWQgYXMgYHRoaXNgDQogICAgICB0LmNhbGwoe2VsOmVsLHg6eCxpbnN0YW5jZTppbnN0YW5jZX0pOw0KICAgIH0pOw0KICB9DQoNCiAgLy8gTWFpbiBmdW5jdGlvbiB0byBkcmF3IGFuZCBzZXQgdXAgdGhlIHZpc3VhbGl6YXRpb24sIG9uY2Ugd2UgaGF2ZSB0aGUgZGF0YS4NCiAgZnVuY3Rpb24gY3JlYXRlVmlzdWFsaXphdGlvbihqc29uKSB7DQoNCiAgICAvLyBCYXNpYyBzZXR1cCBvZiBwYWdlIGVsZW1lbnRzLg0KICAgIGluaXRpYWxpemVCcmVhZGNydW1iVHJhaWwoKTsNCg0KICAgIC8vIEJvdW5kaW5nIGNpcmNsZSB1bmRlcm5lYXRoIHRoZSBzdW5idXJzdCwgdG8gbWFrZSBpdCBlYXNpZXIgdG8gZGV0ZWN0DQogICAgLy8gd2hlbiB0aGUgbW91c2UgbGVhdmVzIHRoZSBwYXJlbnQgZy4NCiAgICB2aXMuYXBwZW5kKCJjaXJjbGUiKQ0KICAgICAgICAuYXR0cigiciIsIHJhZGl1cykNCiAgICAgICAgLnN0eWxlKCJvcGFjaXR5IiwgMCk7DQoNCiAgICAvLyBUdXJuIHRoZSBkYXRhIGludG8gYSBkMyBoaWVyYXJjaHkgYW5kIGNhbGN1bGF0ZSB0aGUgc3Vtcy4NCiAgICB2YXIgcm9vdCA9IGQzSGllcmFyY2h5LmhpZXJhcmNoeShqc29uKQ0KICAgICAgICAuc3VtKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGRbeC5vcHRpb25zLnZhbHVlRmllbGQgfHwgInNpemUiXTsgfSk7DQoNCiAgICAvLyBjaGVjayBmb3Igc29ydCBmdW5jdGlvbg0KICAgIGlmKHgub3B0aW9ucy5zb3J0RnVuY3Rpb24pew0KICAgICAgcm9vdC5zb3J0KHgub3B0aW9ucy5zb3J0RnVuY3Rpb24pOw0KICAgIH0NCg0KICAgIC8vIEZvciBlZmZpY2llbmN5LCBmaWx0ZXIgbm9kZXMgdG8ga2VlcCBvbmx5IHRob3NlIGxhcmdlIGVub3VnaCB0byBzZWUuDQogICAgdmFyIG5vZGVzID0gcGFydGl0aW9uZXIocm9vdCkuZGVzY2VuZGFudHMoKQ0KICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgICAgIHJldHVybiAoZC54MSAtIGQueDAgPiAwLjAwNSk7IC8vIDAuMDA1IHJhZGlhbnMgPSAwLjI5IGRlZ3JlZXMNCiAgICAgICAgfSk7DQoNCiAgICB2YXIgcGF0aCA9IHZpcy5kYXRhKFtqc29uXSkuc2VsZWN0QWxsKCJwYXRoIikNCiAgICAgICAgLmRhdGEobm9kZXMpDQogICAgICAgIC5lbnRlcigpLmFwcGVuZCgicGF0aCIpDQogICAgICAgIC5hdHRyKCJkaXNwbGF5IiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5kZXB0aCA/IG51bGwgOiAibm9uZSI7IH0pDQogICAgICAgIC5hdHRyKCJkIiwgYXJjX3NoYXBlKQ0KICAgICAgICAuYXR0cigiZmlsbC1ydWxlIiwgImV2ZW5vZGQiKQ0KICAgICAgICAuc3R5bGUoImZpbGwiLCBmdW5jdGlvbihkKSB7IHJldHVybiBjb2xvcnMuY2FsbCh0aGlzLCBkLmRhdGEubmFtZSk7IH0pDQogICAgICAgIC5zdHlsZSgib3BhY2l0eSIsIDEpDQogICAgICAgIC5vbigibW91c2VvdmVyIiwgbW91c2VvdmVyKQ0KICAgICAgICAub24oImNsaWNrIiwgY2xpY2spOw0KDQogICAgLy8gQWRkIHRoZSBtb3VzZWxlYXZlIGhhbmRsZXIgdG8gdGhlIGJvdW5kaW5nIGNpcmNsZS4NCiAgICBkM1NlbGVjdGlvbi5zZWxlY3QoZWwpLnNlbGVjdCgiIyIrIGVsLmlkICsgIi1jb250YWluZXIiKS5vbigibW91c2VsZWF2ZSIsIG1vdXNlbGVhdmUpOw0KDQogICAgLy8gR2V0IHRvdGFsIHNpemUgb2YgdGhlIHRyZWUgPSB2YWx1ZSBvZiByb290IG5vZGUgZnJvbSBwYXJ0aXRpb24uDQogICAgdG90YWxTaXplID0gcGF0aC5kYXR1bSgpLnZhbHVlOw0KDQogICAgZHJhd0xlZ2VuZChub2Rlcyk7DQogICAgZDNTZWxlY3Rpb24uc2VsZWN0KGVsKS5zZWxlY3QoIi5zdW5idXJzdC10b2dnbGVsZWdlbmQiKS5vbigiY2xpY2siLCB0b2dnbGVMZWdlbmQpOw0KDQogICB9DQoNCiAgLy8gRmFkZSBhbGwgYnV0IHRoZSBjdXJyZW50IHNlcXVlbmNlLCBhbmQgc2hvdyBpdCBpbiB0aGUgYnJlYWRjcnVtYiB0cmFpbC4NCiAgZnVuY3Rpb24gbW91c2VvdmVyKGQpIHsNCg0KICAgIHZhciBwZXJjZW50YWdlID0gKDEwMCAqIGQudmFsdWUgLyB0b3RhbFNpemUpLnRvUHJlY2lzaW9uKDMpOw0KICAgIHZhciBwZXJjZW50YWdlU3RyaW5nID0gcGVyY2VudGFnZSArICIlIjsNCiAgICBpZiAocGVyY2VudGFnZSA8IDAuMSkgew0KICAgICAgcGVyY2VudGFnZVN0cmluZyA9ICI8IDAuMSUiOw0KICAgIH0NCg0KICAgIHZhciBjb3VudFN0cmluZyA9IFsNCiAgICAgICAgJzxzcGFuIHN0eWxlID0gImZvbnQtc2l6ZTouN2VtIj4nLA0KICAgICAgICBkM0Zvcm1hdC5mb3JtYXQoIjEuMnMiKShkLnZhbHVlKSArICcgb2YgJyArIGQzRm9ybWF0LmZvcm1hdCgiMS4ycyIpKHRvdGFsU2l6ZSksDQogICAgICAgICc8L3NwYW4+Jw0KICAgICAgXS5qb2luKCcnKTsNCg0KICAgIHZhciBleHBsYW5hdGlvblN0cmluZyA9ICIiOw0KICAgIGlmKHgub3B0aW9ucy5wZXJjZW50ICYmIHgub3B0aW9ucy5jb3VudCl7DQogICAgICBleHBsYW5hdGlvblN0cmluZyA9IHBlcmNlbnRhZ2VTdHJpbmcgKyAnPGJyLz4nICsgY291bnRTdHJpbmc7DQogICAgfSBlbHNlIGlmKHgub3B0aW9ucy5wZXJjZW50KXsNCiAgICAgIGV4cGxhbmF0aW9uU3RyaW5nID0gcGVyY2VudGFnZVN0cmluZzsNCiAgICB9IGVsc2UgaWYoeC5vcHRpb25zLmNvdW50KXsNCiAgICAgIGV4cGxhbmF0aW9uU3RyaW5nID0gY291bnRTdHJpbmc7DQogICAgfQ0KDQogICAgLy9pZiBleHBsYW5hdGlvbiBkZWZpbmVkIGluIFIgdGhlbiB1c2UgdGhpcyBpbnN0ZWFkDQogICAgaWYoeC5vcHRpb25zLmV4cGxhbmF0aW9uICE9PSBudWxsKXsNCiAgICAgIGV4cGxhbmF0aW9uU3RyaW5nID0geC5vcHRpb25zLmV4cGxhbmF0aW9uLmJpbmQodG90YWxTaXplKShkKTsNCiAgICB9DQoNCg0KICAgIGQzU2VsZWN0aW9uLnNlbGVjdChlbCkuc2VsZWN0QWxsKCIuc3VuYnVyc3QtZXhwbGFuYXRpb24iKQ0KICAgICAgICAuc3R5bGUoInZpc2liaWxpdHkiLCAiIikNCiAgICAgICAgLnN0eWxlKCJ0b3AiLCgoaGVpZ2h0IC0gNzApLzIpICsgInB4IikNCiAgICAgICAgLnN0eWxlKCJ3aWR0aCIsd2lkdGggKyAicHgiKQ0KICAgICAgICAuaHRtbChleHBsYW5hdGlvblN0cmluZyk7DQoNCiAgICB2YXIgc2VxdWVuY2VBcnJheSA9IGQuYW5jZXN0b3JzKCkucmV2ZXJzZSgpOw0KICAgIHNlcXVlbmNlQXJyYXkuc2hpZnQoKTsgLy8gcmVtb3ZlIHJvb3Qgbm9kZSBmcm9tIHRoZSBhcnJheQ0KDQogICAgY2hhcnQuX3NlbGVjdGlvbiA9IHNlcXVlbmNlQXJyYXkubWFwKA0KICAgICAgZnVuY3Rpb24oZCl7cmV0dXJuIGQuZGF0YS5uYW1lfQ0KICAgICk7DQogICAgZGlzcGF0Y2hfLmNhbGwoIm1vdXNlb3ZlciIsIGNoYXJ0Ll9zZWxlY3Rpb24pOw0KDQogICAgdXBkYXRlQnJlYWRjcnVtYnMoc2VxdWVuY2VBcnJheSwgcGVyY2VudGFnZVN0cmluZyk7DQoNCiAgICAvLyBGYWRlIGFsbCB0aGUgc2VnbWVudHMuDQogICAgZDNTZWxlY3Rpb24uc2VsZWN0KGVsKS5zZWxlY3RBbGwoInBhdGgiKQ0KICAgICAgICAuc3R5bGUoIm9wYWNpdHkiLCAwLjMpOw0KDQogICAgLy8gVGhlbiBoaWdobGlnaHQgb25seSB0aG9zZSB0aGF0IGFyZSBhbiBhbmNlc3RvciBvZiB0aGUgY3VycmVudCBzZWdtZW50Lg0KICAgIHZpcy5zZWxlY3RBbGwoInBhdGgiKQ0KICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uKG5vZGUpIHsNCiAgICAgICAgICAgICAgICAgIHJldHVybiAoc2VxdWVuY2VBcnJheS5pbmRleE9mKG5vZGUpID49IDApOw0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgIC5zdHlsZSgib3BhY2l0eSIsIDEpOw0KICB9DQoNCiAgLy8gUmVzdG9yZSBldmVyeXRoaW5nIHRvIGZ1bGwgb3BhY2l0eSB3aGVuIG1vdmluZyBvZmYgdGhlIHZpc3VhbGl6YXRpb24uDQogIGZ1bmN0aW9uIG1vdXNlbGVhdmUoZCkgew0KDQogICAgZGlzcGF0Y2hfLmNhbGwoIm1vdXNlbGVhdmUiLCBjaGFydC5fc2VsZWN0aW9uKTsNCiAgICBjaGFydC5fc2VsZWN0aW9uID0gW107DQoNCiAgICAvLyBIaWRlIHRoZSBicmVhZGNydW1iIHRyYWlsDQogICAgZDNTZWxlY3Rpb24uc2VsZWN0KGVsKS5zZWxlY3QoIiMiICsgZWwuaWQgKyAiLXRyYWlsIikNCiAgICAgICAgLnN0eWxlKCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOw0KDQogICAgLy8gRGVhY3RpdmF0ZSBhbGwgc2VnbWVudHMgZHVyaW5nIHRyYW5zaXRpb24uDQogICAgZDNTZWxlY3Rpb24uc2VsZWN0KGVsKS5zZWxlY3RBbGwoInBhdGgiKS5vbigibW91c2VvdmVyIiwgbnVsbCk7DQoNCiAgICAvLyBUcmFuc2l0aW9uIGVhY2ggc2VnbWVudCB0byBmdWxsIG9wYWNpdHkgYW5kIHRoZW4gcmVhY3RpdmF0ZSBpdC4NCiAgICBkM1NlbGVjdGlvbi5zZWxlY3QoZWwpLnNlbGVjdEFsbCgicGF0aCIpDQogICAgICAgIC50cmFuc2l0aW9uKCkNCiAgICAgICAgLmR1cmF0aW9uKDEwMDApDQogICAgICAgIC5zdHlsZSgib3BhY2l0eSIsIDEpDQogICAgICAgIC5vbigiZW5kIiwgZnVuY3Rpb24oKSB7DQogICAgICAgICAgZDNTZWxlY3Rpb24uc2VsZWN0KHRoaXMpLm9uKCJtb3VzZW92ZXIiLCBtb3VzZW92ZXIpOw0KICAgICAgICB9KTsNCg0KICAgIGQzU2VsZWN0aW9uLnNlbGVjdChlbCkuc2VsZWN0QWxsKCIuc3VuYnVyc3QtZXhwbGFuYXRpb24iKQ0KICAgICAgICAuc3R5bGUoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7DQogIH0NCg0KICBmdW5jdGlvbiBjbGljayhkLGkpIHsNCiAgICB2YXIgc2VxdWVuY2VBcnJheSA9IGQuYW5jZXN0b3JzKCkucmV2ZXJzZSgpOw0KICAgIHNlcXVlbmNlQXJyYXkuc2hpZnQoKTsgLy8gcmVtb3ZlIHJvb3Qgbm9kZSBmcm9tIHRoZSBhcnJheQ0KDQogICAgZGlzcGF0Y2hfLmNhbGwoImNsaWNrIiwgc2VxdWVuY2VBcnJheS5tYXAoDQogICAgICBmdW5jdGlvbihkKXtyZXR1cm4gZC5kYXRhLm5hbWV9DQogICAgKSk7DQogIH0NCg0KICBmdW5jdGlvbiBpbml0aWFsaXplQnJlYWRjcnVtYlRyYWlsKCkgew0KICAgIC8vIEFkZCB0aGUgc3ZnIGFyZWEuDQogICAgdmFyIHRyYWlsID0gZDNTZWxlY3Rpb24uc2VsZWN0KGVsKS5zZWxlY3QoIi5zdW5idXJzdC1zZXF1ZW5jZSIpLmFwcGVuZCgic3ZnIikNCiAgICAgICAgLmF0dHIoIndpZHRoIiwgd2lkdGgpDQogICAgICAgIC8vLmF0dHIoImhlaWdodCIsIDUwKQ0KICAgICAgICAuYXR0cigiaWQiLCBlbC5pZCArICItdHJhaWwiKTsNCiAgICAvLyBBZGQgdGhlIGxhYmVsIGF0IHRoZSBlbmQsIGZvciB0aGUgcGVyY2VudGFnZS4NCiAgICB0cmFpbC5hcHBlbmQoInRleHQiKQ0KICAgICAgLmF0dHIoImlkIiwgZWwuaWQgKyAiLWVuZGxhYmVsIikNCiAgICAgIC5zdHlsZSgiZmlsbCIsICIjMDAwIik7DQogIH0NCg0KICAvLyBHZW5lcmF0ZSBhIHN0cmluZyB0aGF0IGRlc2NyaWJlcyB0aGUgcG9pbnRzIG9mIGEgYnJlYWRjcnVtYiBwb2x5Z29uLg0KICBmdW5jdGlvbiBicmVhZGNydW1iUG9pbnRzKGQsIGkpIHsNCiAgICB2YXIgcG9pbnRzID0gW107DQogICAgcG9pbnRzLnB1c2goIjAsMCIpOw0KICAgIGlmIChiLncgPD0gMCkgew0KICAgICAgLy8gY2FsY3VsYXRlIGJyZWFkY3J1bWIgd2lkdGggYmFzZWQgb24gc3RyaW5nIGxlbmd0aA0KICAgICAgcG9pbnRzLnB1c2goZC5zdHJpbmdfbGVuZ3RoICsgIiwwIik7DQogICAgICBwb2ludHMucHVzaChkLnN0cmluZ19sZW5ndGggKyBiLnQgKyAiLCIgKyAoYi5oIC8gMikpOw0KICAgICAgcG9pbnRzLnB1c2goZC5zdHJpbmdfbGVuZ3RoICsgIiwiICsgYi5oKTsNCiAgICB9IGVsc2Ugew0KICAgICAgcG9pbnRzLnB1c2goYi53ICsgIiwwIik7DQogICAgICBwb2ludHMucHVzaChiLncgKyBiLnQgKyAiLCIgKyAoYi5oIC8gMikpOw0KICAgICAgcG9pbnRzLnB1c2goYi53ICsgIiwiICsgYi5oKTsNCiAgICB9DQogICAgcG9pbnRzLnB1c2goIjAsIiArIGIuaCk7DQoNCiAgICBpZiAoaSA+IDApIHsgLy8gTGVmdG1vc3QgYnJlYWRjcnVtYjsgZG9uJ3QgaW5jbHVkZSA2dGggdmVydGV4Lg0KICAgICAgcG9pbnRzLnB1c2goYi50ICsgIiwiICsgKGIuaCAvIDIpKTsNCiAgICB9DQogICAgcmV0dXJuIHBvaW50cy5qb2luKCIgIik7DQogIH0NCg0KICAvLyBVcGRhdGUgdGhlIGJyZWFkY3J1bWIgdHJhaWwgdG8gc2hvdyB0aGUgY3VycmVudCBzZXF1ZW5jZSBhbmQgcGVyY2VudGFnZS4NCiAgZnVuY3Rpb24gdXBkYXRlQnJlYWRjcnVtYnMobm9kZUFycmF5LCBwZXJjZW50YWdlU3RyaW5nKSB7DQoNCiAgICAvLyBEYXRhIGpvaW47IGtleSBmdW5jdGlvbiBjb21iaW5lcyBuYW1lIGFuZCBkZXB0aCAoPSBwb3NpdGlvbiBpbiBzZXF1ZW5jZSkuDQogICAgdmFyIGcgPSBkM1NlbGVjdGlvbi5zZWxlY3QoZWwpLnNlbGVjdCgiIyIgKyBlbC5pZCArICItdHJhaWwiKQ0KICAgICAgICAuc2VsZWN0QWxsKCJnIikNCiAgICAgICAgLmRhdGEobm9kZUFycmF5LCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmRhdGEubmFtZSArIGQuZGVwdGg7IH0pOw0KDQogICAgLy8gQWRkIGJyZWFkY3J1bWIgYW5kIGxhYmVsIGZvciBlbnRlcmluZyBub2Rlcy4NCiAgICB2YXIgZW50ZXJpbmcgPSBnLmVudGVyKCkuYXBwZW5kKCJnIik7DQoNCg0KICAgIGlmIChiLncgPD0gMCkgew0KICAgICAgLy8gQ3JlYXRlIGEgbm9kZSBhcnJheSB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgYnJlYWRjcnVtYiB3aWR0aHMNCiAgICAgIC8vIENhbGN1bGF0ZSBwb3NpdGlvbnMgb2YgYnJlYWRjcnVtYnMgYmFzZWQgb24gc3RyaW5nIGxlbmd0aHMNCiAgICAgIHZhciBjdXJyX2JyZWFkY3J1bWJfeCA9IDA7DQogICAgICBub2RlQXJyYXlbMF0uYnJlYWRjcnVtYl94ID0gMDsNCiAgICAgIG5vZGVBcnJheVswXS5icmVhZGNydW1iX2ggPSAwOw0KDQogICAgICBlbnRlcmluZy5hcHBlbmQoInBvbHlnb24iKQ0KICAgICAgICAgIC5zdHlsZSgiei1pbmRleCIsZnVuY3Rpb24oZCxpKSB7IHJldHVybig5OTktaSk7IH0pDQogICAgICAgICAgLnN0eWxlKCJmaWxsIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gY29sb3JzLmNhbGwodGhpcywgZC5kYXRhLm5hbWUpOyB9KTsNCg0KICAgICAgZW50ZXJpbmcuYXBwZW5kKCJ0ZXh0IikNCiAgICAgICAgICAuYXR0cigieCIsIGIudCArIDIpDQogICAgICAgICAgLmF0dHIoInkiLCBiLmggLyAyKQ0KICAgICAgICAgIC5hdHRyKCJkeSIsICIwLjM1ZW0iKQ0KICAgICAgICAgIC5hdHRyKCJ0ZXh0LWFuY2hvciIsICJsZWZ0IikNCiAgICAgICAgICAudGV4dChmdW5jdGlvbihkKSB7IHJldHVybiBkLmRhdGEubmFtZTsgfSk7DQoNCiAgICAgIC8vIFJlbW92ZSBleGl0aW5nIG5vZGVzLg0KICAgICAgZy5leGl0KCkucmVtb3ZlKCk7DQoNCiAgICAgIC8vIGxvb3AgdGhyb3VnaCBlYWNoIGcgZWxlbWVudA0KICAgICAgLy8gIGNhbGN1bGF0ZSBzdHJpbmcgbGVuZ3RoDQogICAgICAvLyAgZHJhdyB0aGUgYnJlYWRjcnVtYiBwb2x5Z29uDQogICAgICAvLyAgYW5kIGRldGVybWluZSBpZiBicmVhZGNydW1iIHNob3VsZCBiZSB3cmFwcGVkIHRvIG5leHQgcm93DQogICAgICBlbnRlcmluZy5tZXJnZShnKS5lYWNoKGZ1bmN0aW9uKGQsayl7DQogICAgICAgIHZhciBjcnVtYmcgPSBkM1NlbGVjdGlvbi5zZWxlY3QodGhpcyk7DQogICAgICAgIHZhciBteV9zdHJpbmdfbGVuZ3RoID0gY3J1bWJnLnNlbGVjdCgidGV4dCIpLm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDsNCiAgICAgICAgbm9kZUFycmF5W2tdLnN0cmluZ19sZW5ndGggPSBteV9zdHJpbmdfbGVuZ3RoICsgMTI7DQogICAgICAgIGNydW1iZy5zZWxlY3QoInBvbHlnb24iKS5hdHRyKCJwb2ludHMiLCBmdW5jdGlvbihkKXsNCiAgICAgICAgICByZXR1cm4gYnJlYWRjcnVtYlBvaW50cyhkLCBrKTsNCiAgICAgICAgfSk7DQogICAgICAgIHZhciBteV9nX2xlbmd0aCA9IGNydW1iZy5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7DQogICAgICAgIGN1cnJfYnJlYWRjcnVtYl94ICs9IGs9PT0wID8gMCA6IG5vZGVBcnJheVtrLTFdLnN0cmluZ19sZW5ndGggKyBiLnM7DQogICAgICAgIG5vZGVBcnJheVtrXS5icmVhZGNydW1iX2ggPSBrPT09MCA/IDAgOiBub2RlQXJyYXlbay0xXS5icmVhZGNydW1iX2g7DQoNCiAgICAgICAgaWYgKGN1cnJfYnJlYWRjcnVtYl94ICsgbXlfZ19sZW5ndGggPiB3aWR0aCowLjk5KSB7DQogICAgICAgICAgbm9kZUFycmF5W2tdLmJyZWFkY3J1bWJfaCArPSBiLmg7ICAvLyBnb3QgdG8gbmV4dCBsaW5lDQogICAgICAgICAgY3Vycl9icmVhZGNydW1iX3ggPSBiLnQgKyBiLnM7ICAgICAvLyByZXN0YXJ0IGNvdW50ZXINCiAgICAgICAgfQ0KICAgICAgICBub2RlQXJyYXlba10uYnJlYWRjcnVtYl94ID0gY3Vycl9icmVhZGNydW1iX3g7DQogICAgICB9KTsNCg0KDQogICAgICAvLyBTZXQgcG9zaXRpb24gZm9yIGVudGVyaW5nIGFuZCB1cGRhdGluZyBub2Rlcy4NCiAgICAgIGVudGVyaW5nLm1lcmdlKGcpLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQsIGkpIHsNCiAgICAgICAgcmV0dXJuICJ0cmFuc2xhdGUoIiArIGQuYnJlYWRjcnVtYl94ICsgIiwgIitkLmJyZWFkY3J1bWJfaCsiKSI7DQogICAgICB9KTsNCg0KDQogICAgICAvLyBOb3cgbW92ZSBhbmQgdXBkYXRlIHRoZSBwZXJjZW50YWdlIGF0IHRoZSBlbmQuDQogICAgICBkM1NlbGVjdGlvbi5zZWxlY3QoZWwpLnNlbGVjdCgiIyIgKyBlbC5pZCArICItdHJhaWwiKS5zZWxlY3QoIiMiICsgZWwuaWQgKyAiLWVuZGxhYmVsIikNCiAgICAgICAgICAuYXR0cigieCIsIGZ1bmN0aW9uKGQpew0KICAgICAgICAgICAgdmFyIGJlbmQgPSBkM1NlbGVjdGlvbi5zZWxlY3QodGhpcyk7DQogICAgICAgICAgICB2YXIgY3Vycl9icmVhZGNydW1iX3ggPSBub2RlQXJyYXlbbm9kZUFycmF5Lmxlbmd0aC0xXS5icmVhZGNydW1iX3ggKyAgbm9kZUFycmF5W25vZGVBcnJheS5sZW5ndGgtMV0uc3RyaW5nX2xlbmd0aCArIGIudCArIGIuczsNCiAgICAgICAgICAgIHZhciBteV9nX2xlbmd0aCA9IGJlbmQubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoOw0KDQogICAgICAgICAgICB2YXIgY3Vycl9icmVhZGNydW1iX2ggPSBub2RlQXJyYXlbbm9kZUFycmF5Lmxlbmd0aC0xXS5icmVhZGNydW1iX2ggKyBiLmgvMjsNCiAgICAgICAgICAgIGlmIChjdXJyX2JyZWFkY3J1bWJfeCArIG15X2dfbGVuZ3RoID4gd2lkdGgqMC45OSkgew0KICAgICAgICAgICAgICBjdXJyX2JyZWFkY3J1bWJfaCArPSBiLmggKyBiLmgvMjsNCiAgICAgICAgICAgICAgY3Vycl9icmVhZGNydW1iX3ggPSBiLnQgKyBiLnM7ICAgICAvLyByZXN0YXJ0IGNvdW50ZXINCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGJlbmQuZGF0dW0oew0KICAgICAgICAgICAgICAiYnJlYWRjcnVtYl94IjogY3Vycl9icmVhZGNydW1iX3gsDQogICAgICAgICAgICAgICJicmVhZGNydW1iX2giOiBjdXJyX2JyZWFkY3J1bWJfaA0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICByZXR1cm4gY3Vycl9icmVhZGNydW1iX3g7DQogICAgICAgICAgfSkNCiAgICAgICAgICAuYXR0cigieSIsIGZ1bmN0aW9uKGQpe3JldHVybiBkLmJyZWFkY3J1bWJfaH0pDQogICAgICAgICAgLmF0dHIoImR5IiwgIjAuMzVlbSIpDQogICAgICAgICAgLmF0dHIoInRleHQtYW5jaG9yIiwgInN0YXJ0IikNCiAgICAgICAgICAudGV4dChwZXJjZW50YWdlU3RyaW5nKTsNCg0KDQogICAgfSBlbHNlIHsNCiAgICAgIGVudGVyaW5nLmFwcGVuZCgicG9seWdvbiIpDQogICAgICAgICAgLmF0dHIoInBvaW50cyIsIGJyZWFkY3J1bWJQb2ludHMpDQogICAgICAgICAgLnN0eWxlKCJmaWxsIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gY29sb3JzLmNhbGwodGhpcywgZC5kYXRhLm5hbWUpOyB9KTsNCg0KICAgICAgZW50ZXJpbmcuYXBwZW5kKCJ0ZXh0IikNCiAgICAgICAgICAuYXR0cigieCIsIChiLncgKyBiLnQpIC8gMikNCiAgICAgICAgICAuYXR0cigieSIsIGIuaCAvIDIpDQogICAgICAgICAgLmF0dHIoImR5IiwgIjAuMzVlbSIpDQogICAgICAgICAgLmF0dHIoInRleHQtYW5jaG9yIiwgIm1pZGRsZSIpDQogICAgICAgICAgLnRleHQoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5kYXRhLm5hbWU7IH0pOw0KDQogICAgICAvLyBTZXQgcG9zaXRpb24gZm9yIGVudGVyaW5nIGFuZCB1cGRhdGluZyBub2Rlcy4NCiAgICAgIGVudGVyaW5nLm1lcmdlKGcpLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQsIGkpIHsNCiAgICAgICAgcmV0dXJuICJ0cmFuc2xhdGUoIiArIGkgKiAoYi53ICsgYi5zKSArICIsIDApIjsNCiAgICAgIH0pOw0KDQogICAgICAvLyBSZW1vdmUgZXhpdGluZyBub2Rlcy4NCiAgICAgIGcuZXhpdCgpLnJlbW92ZSgpOw0KDQogICAgICAvLyBOb3cgbW92ZSBhbmQgdXBkYXRlIHRoZSBwZXJjZW50YWdlIGF0IHRoZSBlbmQuDQogICAgICBkM1NlbGVjdGlvbi5zZWxlY3QoZWwpLnNlbGVjdCgiIyIgKyBlbC5pZCArICItdHJhaWwiKS5zZWxlY3QoIiMiICsgZWwuaWQgKyAiLWVuZGxhYmVsIikNCiAgICAgICAgICAuYXR0cigieCIsIChub2RlQXJyYXkubGVuZ3RoICsgMC41KSAqIChiLncgKyBiLnMpKQ0KICAgICAgICAgIC5hdHRyKCJ5IiwgYi5oIC8gMikNCiAgICAgICAgICAuYXR0cigiZHkiLCAiMC4zNWVtIikNCiAgICAgICAgICAuYXR0cigidGV4dC1hbmNob3IiLCAibWlkZGxlIikNCiAgICAgICAgICAudGV4dChwZXJjZW50YWdlU3RyaW5nKTsNCg0KICAgIH0NCg0KICAgIC8vIE1ha2UgdGhlIGJyZWFkY3J1bWIgdHJhaWwgdmlzaWJsZSwgaWYgaXQncyBoaWRkZW4uDQogICAgZDNTZWxlY3Rpb24uc2VsZWN0KGVsKS5zZWxlY3QoIiMiICsgZWwuaWQgKyAiLXRyYWlsIikNCiAgICAgICAgLnN0eWxlKCJ2aXNpYmlsaXR5IiwgIiIpOw0KDQogIH0NCg0KICBmdW5jdGlvbiBkcmF3TGVnZW5kKG5vZGVzKSB7DQoNCiAgICAvLyBEaW1lbnNpb25zIG9mIGxlZ2VuZCBpdGVtOiB3aWR0aCwgaGVpZ2h0LCBzcGFjaW5nLCByYWRpdXMgb2Ygcm91bmRlZCByZWN0Lg0KICAgIHZhciBsaSA9IHsNCiAgICAgIHc6IDc1LCBoOiAzMCwgczogMywgcjogMw0KICAgIH07DQoNCiAgICAvLyAgaWYgbGVnZW5kIGlzIHByb3ZpZGVkIGluIHRoZSBvcHRpb24sIHdlIHdpbGwgb3ZlcndyaXRlDQogICAgLy8gICB3aXRoIHdoYXQgaXMgcHJvdmlkZWQNCiAgICBPYmplY3Qua2V5cyh4Lm9wdGlvbnMubGVnZW5kKS5tYXAoZnVuY3Rpb24oa3kpew0KICAgICAgbGlba3ldID0geC5vcHRpb25zLmxlZ2VuZFtreV07DQogICAgfSk7DQoNCiAgICAvLyByZW1vdmUgaWYgYWxyZWFkeSBkcmF3bg0KICAgIGQzU2VsZWN0aW9uLnNlbGVjdChlbCkuc2VsZWN0KCIuc3VuYnVyc3QtbGVnZW5kIHN2ZyIpLnJlbW92ZSgpOw0KDQogICAgLy8gZ2V0IGxhYmVscyBmcm9tIG5vZGUgbmFtZXMNCiAgICB2YXIgbGFiZWxzID0gZDNDb2xsZWN0aW9uLm5lc3QoKQ0KICAgICAgLmtleShmdW5jdGlvbihkKSB7cmV0dXJuIGQuZGF0YS5uYW1lfSkNCiAgICAgIC5lbnRyaWVzKA0KICAgICAgICBub2Rlcy5zb3J0KA0KICAgICAgICAgIGZ1bmN0aW9uKGEsYikge3JldHVybiBkM0FycmF5LmFzY2VuZGluZyhhLmRlcHRoLGIuZGVwdGgpfQ0KICAgICAgICApDQogICAgICApDQogICAgICAubWFwKGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgcmV0dXJuIGQudmFsdWVzWzBdOw0KICAgICAgfSkNCiAgICAgIC5maWx0ZXIoZnVuY3Rpb24oZCkgew0KICAgICAgICByZXR1cm4gZC5kYXRhLm5hbWUgIT09ICJyb290IjsNCiAgICAgIH0pOw0KDQogICAgdmFyIGxlZ2VuZCA9IGQzU2VsZWN0aW9uLnNlbGVjdChlbCkuc2VsZWN0KCIuc3VuYnVyc3QtbGVnZW5kIikuYXBwZW5kKCJzdmciKQ0KICAgICAgICAuYXR0cigid2lkdGgiLCBsaS53KQ0KICAgICAgICAuYXR0cigiaGVpZ2h0IiwgbGFiZWxzLmxlbmd0aCAqIChsaS5oICsgbGkucykpOw0KDQogICAgdmFyIGcgPSBsZWdlbmQuc2VsZWN0QWxsKCJnIikNCiAgICAgICAgLmRhdGEoIGZ1bmN0aW9uKCl7DQogICAgICAgICAgaWYoeC5vcHRpb25zLmxlZ2VuZE9yZGVyICE9PSBudWxsKXsNCiAgICAgICAgICAgIHJldHVybiB4Lm9wdGlvbnMubGVnZW5kT3JkZXIubWFwKGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgICAgICAgcmV0dXJuIGxhYmVscy5maWx0ZXIoZnVuY3Rpb24oZGQpIHtyZXR1cm4gZGQuZGF0YS5uYW1lID09PSBkIH0pWzBdOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIC8vIGdldCBzb3J0ZWQgYnkgdG9wIGxldmVsDQogICAgICAgICAgICByZXR1cm4gbGFiZWxzOw0KICAgICAgICAgIH0NCiAgICAgICAgfSkNCiAgICAgICAgLmVudGVyKCkuYXBwZW5kKCJnIikNCiAgICAgICAgLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQsIGkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gInRyYW5zbGF0ZSgwLCIgKyBpICogKGxpLmggKyBsaS5zKSArICIpIjsNCiAgICAgICAgICAgICB9KTsNCg0KICAgIGcuYXBwZW5kKCJyZWN0IikNCiAgICAgICAgLmF0dHIoInJ4IiwgbGkucikNCiAgICAgICAgLmF0dHIoInJ5IiwgbGkucikNCiAgICAgICAgLmF0dHIoIndpZHRoIiwgbGkudykNCiAgICAgICAgLmF0dHIoImhlaWdodCIsIGxpLmgpDQogICAgICAgIC5zdHlsZSgiZmlsbCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGNvbG9ycy5jYWxsKHRoaXMsIGQuZGF0YS5uYW1lKTsgfSk7DQoNCiAgICBnLmFwcGVuZCgidGV4dCIpDQogICAgICAgIC5hdHRyKCJ4IiwgbGkudyAvIDIpDQogICAgICAgIC5hdHRyKCJ5IiwgbGkuaCAvIDIpDQogICAgICAgIC5hdHRyKCJkeSIsICIwLjM1ZW0iKQ0KICAgICAgICAuYXR0cigidGV4dC1hbmNob3IiLCAibWlkZGxlIikNCiAgICAgICAgLnRleHQoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5kYXRhLm5hbWU7IH0pOw0KICB9DQoNCiAgZnVuY3Rpb24gdG9nZ2xlTGVnZW5kKCkgew0KICAgIHZhciBsZWdlbmQgPSBkM1NlbGVjdGlvbi5zZWxlY3QoZWwpLnNlbGVjdCgiLnN1bmJ1cnN0LWxlZ2VuZCIpOw0KICAgIGlmIChsZWdlbmQuc3R5bGUoInZpc2liaWxpdHkiKSA9PSAiaGlkZGVuIikgew0KICAgICAgbGVnZW5kLnN0eWxlKCJ2aXNpYmlsaXR5IiwgIiIpOw0KICAgIH0gZWxzZSB7DQogICAgICBsZWdlbmQuc3R5bGUoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7DQogICAgfQ0KICB9DQp9Ow0KDQp2YXIgSFRNTFdpZGdldHMgPSB3aW5kb3cuSFRNTFdpZGdldHM7DQoNCkhUTUxXaWRnZXRzLndpZGdldCh7DQoNCiAgbmFtZTogJ3N1bmJ1cnN0JywNCg0KICB0eXBlOiAnb3V0cHV0JywNCg0KICBmYWN0b3J5OiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCkgew0KDQogICAgdmFyIGluc3RhbmNlID0ge307DQoNCiAgICBpbnN0YW5jZS5jaGFydCA9IHt9Ow0KDQogICAgdmFyIGRpc3BhdGNoXyA9IGQzRGlzcGF0Y2guZGlzcGF0Y2goIm1vdXNlb3ZlciIsIm1vdXNlbGVhdmUiLCJjbGljayIpOw0KICAgIHJlYmluZChpbnN0YW5jZS5jaGFydCwgZGlzcGF0Y2hfLCAnb24nKTsNCg0KICAgIC8vIFRha2UgYSAyLWNvbHVtbiBDU1YgYW5kIHRyYW5zZm9ybSBpdCBpbnRvIGEgaGllcmFyY2hpY2FsIHN0cnVjdHVyZSBzdWl0YWJsZQ0KICAgIC8vIGZvciBhIHBhcnRpdGlvbiBsYXlvdXQuIFRoZSBmaXJzdCBjb2x1bW4gaXMgYSBzZXF1ZW5jZSBvZiBzdGVwIG5hbWVzLCBmcm9tDQogICAgLy8gcm9vdCB0byBsZWFmLCBzZXBhcmF0ZWQgYnkgaHlwaGVucy4gVGhlIHNlY29uZCBjb2x1bW4gaXMgYSBjb3VudCBvZiBob3cNCiAgICAvLyBvZnRlbiB0aGF0IHNlcXVlbmNlIG9jY3VycmVkLg0KICAgIGZ1bmN0aW9uIGJ1aWxkSGllcmFyY2h5KGNzdikgew0KICAgICAgdmFyIHJvb3QgPSB7Im5hbWUiOiAicm9vdCIsICJjaGlsZHJlbiI6IFtdfTsNCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3N2Lmxlbmd0aDsgaSsrKSB7DQogICAgICAgIHZhciBzZXF1ZW5jZSA9IGNzdltpXVswXTsNCiAgICAgICAgdmFyIHNpemUgPSArY3N2W2ldWzFdOw0KICAgICAgICBpZiAoaXNOYU4oc2l6ZSkpIHsgLy8gZS5nLiBpZiB0aGlzIGlzIGEgaGVhZGVyIHJvdw0KICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICB9DQogICAgICAgIHZhciBwYXJ0cyA9IHNlcXVlbmNlLnNwbGl0KCItIik7DQogICAgICAgIHZhciBjdXJyZW50Tm9kZSA9IHJvb3Q7DQogICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcGFydHMubGVuZ3RoOyBqKyspIHsNCiAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBjdXJyZW50Tm9kZVsiY2hpbGRyZW4iXTsNCiAgICAgICAgICB2YXIgbm9kZU5hbWUgPSBwYXJ0c1tqXTsNCiAgICAgICAgICB2YXIgY2hpbGROb2RlOw0KICAgICAgICAgIGlmIChqICsgMSA8IHBhcnRzLmxlbmd0aCkgew0KICAgICAgIC8vIE5vdCB5ZXQgYXQgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2U7IG1vdmUgZG93biB0aGUgdHJlZS4NCiAgICAgCXZhciBmb3VuZENoaWxkID0gZmFsc2U7DQogICAgIAlmb3IgKHZhciBrID0gMDsgayA8IGNoaWxkcmVuLmxlbmd0aDsgaysrKSB7DQogICAgIAkgIGlmIChjaGlsZHJlbltrXVsibmFtZSJdID09IG5vZGVOYW1lKSB7DQogICAgIAkgICAgY2hpbGROb2RlID0gY2hpbGRyZW5ba107DQogICAgIAkgICAgZm91bmRDaGlsZCA9IHRydWU7DQogICAgIAkgICAgYnJlYWs7DQogICAgIAkgIH0NCiAgICAgCX0NCiAgICAgIC8vIElmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBhIGNoaWxkIG5vZGUgZm9yIHRoaXMgYnJhbmNoLCBjcmVhdGUgaXQuDQogICAgIAlpZiAoIWZvdW5kQ2hpbGQpIHsNCiAgICAgCSAgY2hpbGROb2RlID0geyJuYW1lIjogbm9kZU5hbWUsICJjaGlsZHJlbiI6IFtdfTsNCiAgICAgCSAgY2hpbGRyZW4ucHVzaChjaGlsZE5vZGUpOw0KICAgICAJfQ0KICAgICAJY3VycmVudE5vZGUgPSBjaGlsZE5vZGU7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgCS8vIFJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2U7IGNyZWF0ZSBhIGxlYWYgbm9kZS4NCiAgICAgCWNoaWxkTm9kZSA9IHsibmFtZSI6IG5vZGVOYW1lLCAic2l6ZSI6IHNpemV9Ow0KICAgICAJY2hpbGRyZW4ucHVzaChjaGlsZE5vZGUpOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuIHJvb3Q7DQoNCiAgICB9DQoNCiAgICByZXR1cm4gew0KDQogICAgICByZW5kZXJWYWx1ZTogZnVuY3Rpb24oeCkgew0KDQogICAgICAgIGluc3RhbmNlLnggPSB4Ow0KDQogICAgICAgIC8vIHguZGF0YSBzaG91bGQgYmUgYSBkYXRhLmZyYW1lIGluIFIgc28gYW4gSmF2YXNjcmlwdCBPYmplY3Qgb2YgT2JqZWN0cw0KICAgICAgICAvLyAgICAgYnV0IGJ1aWxkSGllcmFyY2h5IGV4cGVjdHMgYW4gQXJyYXkgb2YgQXJyYXlzDQogICAgICAgIC8vICAgICBzbyB1c2UgZDMuemlwIGFuZCBhcHBseSB0byBkbyB0aGlzDQogICAgICAgIHZhciBqc29uID0gW107DQogICAgICAgIGlmKHR5cGVvZih4LmNzdmRhdGEpICE9PSAidW5kZWZpbmVkIil7DQogICAgICAgICAganNvbiA9IGJ1aWxkSGllcmFyY2h5KA0KICAgICAgICAgICAgZDNBcnJheS56aXAuYXBwbHkoDQogICAgICAgICAgICAgIG51bGwsDQogICAgICAgICAgICAgIE9iamVjdC5rZXlzKHguY3N2ZGF0YSkubWFwKGZ1bmN0aW9uKGt5KXtyZXR1cm4geC5jc3ZkYXRhW2t5XX0pDQogICAgICAgICAgICApDQogICAgICAgICAgKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICBqc29uID0geC5kYXRhOw0KICAgICAgICB9DQogICAgICAgIGluc3RhbmNlLmpzb24gPSBqc29uOw0KDQogICAgICAgIGRyYXcoZWwsIGluc3RhbmNlLCBkaXNwYXRjaF8pOw0KDQogICAgICB9LA0KDQogICAgICByZXNpemU6IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpIHsNCg0KICAgICAgICBkcmF3KGVsLCBpbnN0YW5jZSwgZGlzcGF0Y2hfKTsNCg0KICAgICAgfSwNCg0KICAgICAgaW5zdGFuY2U6IGluc3RhbmNlDQoNCiAgICB9Ow0KICB9DQp9KTsNCg0KfSkpKTsNCg0KfSx7ImQzLWFycmF5IjoyLCJkMy1jb2xsZWN0aW9uIjozLCJkMy1kaXNwYXRjaCI6NSwiZDMtZm9ybWF0Ijo3LCJkMy1oaWVyYXJjaHkiOjgsImQzLXNjYWxlIjoxMSwiZDMtc2VsZWN0aW9uIjoxMiwiZDMtc2hhcGUiOjEzLCJkMy10cmFuc2l0aW9uIjoxN31dLDI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpew0KLy8gaHR0cHM6Ly9kM2pzLm9yZy9kMy1hcnJheS8gVmVyc2lvbiAxLjIuMC4gQ29weXJpZ2h0IDIwMTcgTWlrZSBCb3N0b2NrLg0KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsNCgl0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDoNCgl0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpIDoNCgkoZmFjdG9yeSgoZ2xvYmFsLmQzID0gZ2xvYmFsLmQzIHx8IHt9KSkpOw0KfSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMpIHsgJ3VzZSBzdHJpY3QnOw0KDQp2YXIgYXNjZW5kaW5nID0gZnVuY3Rpb24oYSwgYikgew0KICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47DQp9Ow0KDQp2YXIgYmlzZWN0b3IgPSBmdW5jdGlvbihjb21wYXJlKSB7DQogIGlmIChjb21wYXJlLmxlbmd0aCA9PT0gMSkgY29tcGFyZSA9IGFzY2VuZGluZ0NvbXBhcmF0b3IoY29tcGFyZSk7DQogIHJldHVybiB7DQogICAgbGVmdDogZnVuY3Rpb24oYSwgeCwgbG8sIGhpKSB7DQogICAgICBpZiAobG8gPT0gbnVsbCkgbG8gPSAwOw0KICAgICAgaWYgKGhpID09IG51bGwpIGhpID0gYS5sZW5ndGg7DQogICAgICB3aGlsZSAobG8gPCBoaSkgew0KICAgICAgICB2YXIgbWlkID0gbG8gKyBoaSA+Pj4gMTsNCiAgICAgICAgaWYgKGNvbXBhcmUoYVttaWRdLCB4KSA8IDApIGxvID0gbWlkICsgMTsNCiAgICAgICAgZWxzZSBoaSA9IG1pZDsNCiAgICAgIH0NCiAgICAgIHJldHVybiBsbzsNCiAgICB9LA0KICAgIHJpZ2h0OiBmdW5jdGlvbihhLCB4LCBsbywgaGkpIHsNCiAgICAgIGlmIChsbyA9PSBudWxsKSBsbyA9IDA7DQogICAgICBpZiAoaGkgPT0gbnVsbCkgaGkgPSBhLmxlbmd0aDsNCiAgICAgIHdoaWxlIChsbyA8IGhpKSB7DQogICAgICAgIHZhciBtaWQgPSBsbyArIGhpID4+PiAxOw0KICAgICAgICBpZiAoY29tcGFyZShhW21pZF0sIHgpID4gMCkgaGkgPSBtaWQ7DQogICAgICAgIGVsc2UgbG8gPSBtaWQgKyAxOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIGxvOw0KICAgIH0NCiAgfTsNCn07DQoNCmZ1bmN0aW9uIGFzY2VuZGluZ0NvbXBhcmF0b3IoZikgew0KICByZXR1cm4gZnVuY3Rpb24oZCwgeCkgew0KICAgIHJldHVybiBhc2NlbmRpbmcoZihkKSwgeCk7DQogIH07DQp9DQoNCnZhciBhc2NlbmRpbmdCaXNlY3QgPSBiaXNlY3Rvcihhc2NlbmRpbmcpOw0KdmFyIGJpc2VjdFJpZ2h0ID0gYXNjZW5kaW5nQmlzZWN0LnJpZ2h0Ow0KdmFyIGJpc2VjdExlZnQgPSBhc2NlbmRpbmdCaXNlY3QubGVmdDsNCg0KdmFyIHBhaXJzID0gZnVuY3Rpb24oYXJyYXksIGYpIHsNCiAgaWYgKGYgPT0gbnVsbCkgZiA9IHBhaXI7DQogIHZhciBpID0gMCwgbiA9IGFycmF5Lmxlbmd0aCAtIDEsIHAgPSBhcnJheVswXSwgcGFpcnMgPSBuZXcgQXJyYXkobiA8IDAgPyAwIDogbik7DQogIHdoaWxlIChpIDwgbikgcGFpcnNbaV0gPSBmKHAsIHAgPSBhcnJheVsrK2ldKTsNCiAgcmV0dXJuIHBhaXJzOw0KfTsNCg0KZnVuY3Rpb24gcGFpcihhLCBiKSB7DQogIHJldHVybiBbYSwgYl07DQp9DQoNCnZhciBjcm9zcyA9IGZ1bmN0aW9uKHZhbHVlczAsIHZhbHVlczEsIHJlZHVjZSkgew0KICB2YXIgbjAgPSB2YWx1ZXMwLmxlbmd0aCwNCiAgICAgIG4xID0gdmFsdWVzMS5sZW5ndGgsDQogICAgICB2YWx1ZXMgPSBuZXcgQXJyYXkobjAgKiBuMSksDQogICAgICBpMCwNCiAgICAgIGkxLA0KICAgICAgaSwNCiAgICAgIHZhbHVlMDsNCg0KICBpZiAocmVkdWNlID09IG51bGwpIHJlZHVjZSA9IHBhaXI7DQoNCiAgZm9yIChpMCA9IGkgPSAwOyBpMCA8IG4wOyArK2kwKSB7DQogICAgZm9yICh2YWx1ZTAgPSB2YWx1ZXMwW2kwXSwgaTEgPSAwOyBpMSA8IG4xOyArK2kxLCArK2kpIHsNCiAgICAgIHZhbHVlc1tpXSA9IHJlZHVjZSh2YWx1ZTAsIHZhbHVlczFbaTFdKTsNCiAgICB9DQogIH0NCg0KICByZXR1cm4gdmFsdWVzOw0KfTsNCg0KdmFyIGRlc2NlbmRpbmcgPSBmdW5jdGlvbihhLCBiKSB7DQogIHJldHVybiBiIDwgYSA/IC0xIDogYiA+IGEgPyAxIDogYiA+PSBhID8gMCA6IE5hTjsNCn07DQoNCnZhciBudW1iZXIgPSBmdW5jdGlvbih4KSB7DQogIHJldHVybiB4ID09PSBudWxsID8gTmFOIDogK3g7DQp9Ow0KDQp2YXIgdmFyaWFuY2UgPSBmdW5jdGlvbih2YWx1ZXMsIHZhbHVlb2YpIHsNCiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoLA0KICAgICAgbSA9IDAsDQogICAgICBpID0gLTEsDQogICAgICBtZWFuID0gMCwNCiAgICAgIHZhbHVlLA0KICAgICAgZGVsdGEsDQogICAgICBzdW0gPSAwOw0KDQogIGlmICh2YWx1ZW9mID09IG51bGwpIHsNCiAgICB3aGlsZSAoKytpIDwgbikgew0KICAgICAgaWYgKCFpc05hTih2YWx1ZSA9IG51bWJlcih2YWx1ZXNbaV0pKSkgew0KICAgICAgICBkZWx0YSA9IHZhbHVlIC0gbWVhbjsNCiAgICAgICAgbWVhbiArPSBkZWx0YSAvICsrbTsNCiAgICAgICAgc3VtICs9IGRlbHRhICogKHZhbHVlIC0gbWVhbik7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgZWxzZSB7DQogICAgd2hpbGUgKCsraSA8IG4pIHsNCiAgICAgIGlmICghaXNOYU4odmFsdWUgPSBudW1iZXIodmFsdWVvZih2YWx1ZXNbaV0sIGksIHZhbHVlcykpKSkgew0KICAgICAgICBkZWx0YSA9IHZhbHVlIC0gbWVhbjsNCiAgICAgICAgbWVhbiArPSBkZWx0YSAvICsrbTsNCiAgICAgICAgc3VtICs9IGRlbHRhICogKHZhbHVlIC0gbWVhbik7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgaWYgKG0gPiAxKSByZXR1cm4gc3VtIC8gKG0gLSAxKTsNCn07DQoNCnZhciBkZXZpYXRpb24gPSBmdW5jdGlvbihhcnJheSwgZikgew0KICB2YXIgdiA9IHZhcmlhbmNlKGFycmF5LCBmKTsNCiAgcmV0dXJuIHYgPyBNYXRoLnNxcnQodikgOiB2Ow0KfTsNCg0KdmFyIGV4dGVudCA9IGZ1bmN0aW9uKHZhbHVlcywgdmFsdWVvZikgew0KICB2YXIgbiA9IHZhbHVlcy5sZW5ndGgsDQogICAgICBpID0gLTEsDQogICAgICB2YWx1ZSwNCiAgICAgIG1pbiwNCiAgICAgIG1heDsNCg0KICBpZiAodmFsdWVvZiA9PSBudWxsKSB7DQogICAgd2hpbGUgKCsraSA8IG4pIHsgLy8gRmluZCB0aGUgZmlyc3QgY29tcGFyYWJsZSB2YWx1ZS4NCiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZXNbaV0pICE9IG51bGwgJiYgdmFsdWUgPj0gdmFsdWUpIHsNCiAgICAgICAgbWluID0gbWF4ID0gdmFsdWU7DQogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIENvbXBhcmUgdGhlIHJlbWFpbmluZyB2YWx1ZXMuDQogICAgICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlc1tpXSkgIT0gbnVsbCkgew0KICAgICAgICAgICAgaWYgKG1pbiA+IHZhbHVlKSBtaW4gPSB2YWx1ZTsNCiAgICAgICAgICAgIGlmIChtYXggPCB2YWx1ZSkgbWF4ID0gdmFsdWU7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgZWxzZSB7DQogICAgd2hpbGUgKCsraSA8IG4pIHsgLy8gRmluZCB0aGUgZmlyc3QgY29tcGFyYWJsZSB2YWx1ZS4NCiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkgIT0gbnVsbCAmJiB2YWx1ZSA+PSB2YWx1ZSkgew0KICAgICAgICBtaW4gPSBtYXggPSB2YWx1ZTsNCiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsgLy8gQ29tcGFyZSB0aGUgcmVtYWluaW5nIHZhbHVlcy4NCiAgICAgICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZXNbaV0sIGksIHZhbHVlcykpICE9IG51bGwpIHsNCiAgICAgICAgICAgIGlmIChtaW4gPiB2YWx1ZSkgbWluID0gdmFsdWU7DQogICAgICAgICAgICBpZiAobWF4IDwgdmFsdWUpIG1heCA9IHZhbHVlOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIHJldHVybiBbbWluLCBtYXhdOw0KfTsNCg0KdmFyIGFycmF5ID0gQXJyYXkucHJvdG90eXBlOw0KDQp2YXIgc2xpY2UgPSBhcnJheS5zbGljZTsNCnZhciBtYXAgPSBhcnJheS5tYXA7DQoNCnZhciBjb25zdGFudCA9IGZ1bmN0aW9uKHgpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB4Ow0KICB9Ow0KfTsNCg0KdmFyIGlkZW50aXR5ID0gZnVuY3Rpb24oeCkgew0KICByZXR1cm4geDsNCn07DQoNCnZhciByYW5nZSA9IGZ1bmN0aW9uKHN0YXJ0LCBzdG9wLCBzdGVwKSB7DQogIHN0YXJ0ID0gK3N0YXJ0LCBzdG9wID0gK3N0b3AsIHN0ZXAgPSAobiA9IGFyZ3VtZW50cy5sZW5ndGgpIDwgMiA/IChzdG9wID0gc3RhcnQsIHN0YXJ0ID0gMCwgMSkgOiBuIDwgMyA/IDEgOiArc3RlcDsNCg0KICB2YXIgaSA9IC0xLA0KICAgICAgbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgoc3RvcCAtIHN0YXJ0KSAvIHN0ZXApKSB8IDAsDQogICAgICByYW5nZSA9IG5ldyBBcnJheShuKTsNCg0KICB3aGlsZSAoKytpIDwgbikgew0KICAgIHJhbmdlW2ldID0gc3RhcnQgKyBpICogc3RlcDsNCiAgfQ0KDQogIHJldHVybiByYW5nZTsNCn07DQoNCnZhciBlMTAgPSBNYXRoLnNxcnQoNTApOw0KdmFyIGU1ID0gTWF0aC5zcXJ0KDEwKTsNCnZhciBlMiA9IE1hdGguc3FydCgyKTsNCg0KdmFyIHRpY2tzID0gZnVuY3Rpb24oc3RhcnQsIHN0b3AsIGNvdW50KSB7DQogIHZhciByZXZlcnNlID0gc3RvcCA8IHN0YXJ0LA0KICAgICAgaSA9IC0xLA0KICAgICAgbiwNCiAgICAgIHRpY2tzLA0KICAgICAgc3RlcDsNCg0KICBpZiAocmV2ZXJzZSkgbiA9IHN0YXJ0LCBzdGFydCA9IHN0b3AsIHN0b3AgPSBuOw0KDQogIGlmICgoc3RlcCA9IHRpY2tJbmNyZW1lbnQoc3RhcnQsIHN0b3AsIGNvdW50KSkgPT09IDAgfHwgIWlzRmluaXRlKHN0ZXApKSByZXR1cm4gW107DQoNCiAgaWYgKHN0ZXAgPiAwKSB7DQogICAgc3RhcnQgPSBNYXRoLmNlaWwoc3RhcnQgLyBzdGVwKTsNCiAgICBzdG9wID0gTWF0aC5mbG9vcihzdG9wIC8gc3RlcCk7DQogICAgdGlja3MgPSBuZXcgQXJyYXkobiA9IE1hdGguY2VpbChzdG9wIC0gc3RhcnQgKyAxKSk7DQogICAgd2hpbGUgKCsraSA8IG4pIHRpY2tzW2ldID0gKHN0YXJ0ICsgaSkgKiBzdGVwOw0KICB9IGVsc2Ugew0KICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihzdGFydCAqIHN0ZXApOw0KICAgIHN0b3AgPSBNYXRoLmNlaWwoc3RvcCAqIHN0ZXApOw0KICAgIHRpY2tzID0gbmV3IEFycmF5KG4gPSBNYXRoLmNlaWwoc3RhcnQgLSBzdG9wICsgMSkpOw0KICAgIHdoaWxlICgrK2kgPCBuKSB0aWNrc1tpXSA9IChzdGFydCAtIGkpIC8gc3RlcDsNCiAgfQ0KDQogIGlmIChyZXZlcnNlKSB0aWNrcy5yZXZlcnNlKCk7DQoNCiAgcmV0dXJuIHRpY2tzOw0KfTsNCg0KZnVuY3Rpb24gdGlja0luY3JlbWVudChzdGFydCwgc3RvcCwgY291bnQpIHsNCiAgdmFyIHN0ZXAgPSAoc3RvcCAtIHN0YXJ0KSAvIE1hdGgubWF4KDAsIGNvdW50KSwNCiAgICAgIHBvd2VyID0gTWF0aC5mbG9vcihNYXRoLmxvZyhzdGVwKSAvIE1hdGguTE4xMCksDQogICAgICBlcnJvciA9IHN0ZXAgLyBNYXRoLnBvdygxMCwgcG93ZXIpOw0KICByZXR1cm4gcG93ZXIgPj0gMA0KICAgICAgPyAoZXJyb3IgPj0gZTEwID8gMTAgOiBlcnJvciA+PSBlNSA/IDUgOiBlcnJvciA+PSBlMiA/IDIgOiAxKSAqIE1hdGgucG93KDEwLCBwb3dlcikNCiAgICAgIDogLU1hdGgucG93KDEwLCAtcG93ZXIpIC8gKGVycm9yID49IGUxMCA/IDEwIDogZXJyb3IgPj0gZTUgPyA1IDogZXJyb3IgPj0gZTIgPyAyIDogMSk7DQp9DQoNCmZ1bmN0aW9uIHRpY2tTdGVwKHN0YXJ0LCBzdG9wLCBjb3VudCkgew0KICB2YXIgc3RlcDAgPSBNYXRoLmFicyhzdG9wIC0gc3RhcnQpIC8gTWF0aC5tYXgoMCwgY291bnQpLA0KICAgICAgc3RlcDEgPSBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihNYXRoLmxvZyhzdGVwMCkgLyBNYXRoLkxOMTApKSwNCiAgICAgIGVycm9yID0gc3RlcDAgLyBzdGVwMTsNCiAgaWYgKGVycm9yID49IGUxMCkgc3RlcDEgKj0gMTA7DQogIGVsc2UgaWYgKGVycm9yID49IGU1KSBzdGVwMSAqPSA1Ow0KICBlbHNlIGlmIChlcnJvciA+PSBlMikgc3RlcDEgKj0gMjsNCiAgcmV0dXJuIHN0b3AgPCBzdGFydCA/IC1zdGVwMSA6IHN0ZXAxOw0KfQ0KDQp2YXIgc3R1cmdlcyA9IGZ1bmN0aW9uKHZhbHVlcykgew0KICByZXR1cm4gTWF0aC5jZWlsKE1hdGgubG9nKHZhbHVlcy5sZW5ndGgpIC8gTWF0aC5MTjIpICsgMTsNCn07DQoNCnZhciBoaXN0b2dyYW0gPSBmdW5jdGlvbigpIHsNCiAgdmFyIHZhbHVlID0gaWRlbnRpdHksDQogICAgICBkb21haW4gPSBleHRlbnQsDQogICAgICB0aHJlc2hvbGQgPSBzdHVyZ2VzOw0KDQogIGZ1bmN0aW9uIGhpc3RvZ3JhbShkYXRhKSB7DQogICAgdmFyIGksDQogICAgICAgIG4gPSBkYXRhLmxlbmd0aCwNCiAgICAgICAgeCwNCiAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5KG4pOw0KDQogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgew0KICAgICAgdmFsdWVzW2ldID0gdmFsdWUoZGF0YVtpXSwgaSwgZGF0YSk7DQogICAgfQ0KDQogICAgdmFyIHh6ID0gZG9tYWluKHZhbHVlcyksDQogICAgICAgIHgwID0geHpbMF0sDQogICAgICAgIHgxID0geHpbMV0sDQogICAgICAgIHR6ID0gdGhyZXNob2xkKHZhbHVlcywgeDAsIHgxKTsNCg0KICAgIC8vIENvbnZlcnQgbnVtYmVyIG9mIHRocmVzaG9sZHMgaW50byB1bmlmb3JtIHRocmVzaG9sZHMuDQogICAgaWYgKCFBcnJheS5pc0FycmF5KHR6KSkgew0KICAgICAgdHogPSB0aWNrU3RlcCh4MCwgeDEsIHR6KTsNCiAgICAgIHR6ID0gcmFuZ2UoTWF0aC5jZWlsKHgwIC8gdHopICogdHosIE1hdGguZmxvb3IoeDEgLyB0eikgKiB0eiwgdHopOyAvLyBleGNsdXNpdmUNCiAgICB9DQoNCiAgICAvLyBSZW1vdmUgYW55IHRocmVzaG9sZHMgb3V0c2lkZSB0aGUgZG9tYWluLg0KICAgIHZhciBtID0gdHoubGVuZ3RoOw0KICAgIHdoaWxlICh0elswXSA8PSB4MCkgdHouc2hpZnQoKSwgLS1tOw0KICAgIHdoaWxlICh0elttIC0gMV0gPiB4MSkgdHoucG9wKCksIC0tbTsNCg0KICAgIHZhciBiaW5zID0gbmV3IEFycmF5KG0gKyAxKSwNCiAgICAgICAgYmluOw0KDQogICAgLy8gSW5pdGlhbGl6ZSBiaW5zLg0KICAgIGZvciAoaSA9IDA7IGkgPD0gbTsgKytpKSB7DQogICAgICBiaW4gPSBiaW5zW2ldID0gW107DQogICAgICBiaW4ueDAgPSBpID4gMCA/IHR6W2kgLSAxXSA6IHgwOw0KICAgICAgYmluLngxID0gaSA8IG0gPyB0eltpXSA6IHgxOw0KICAgIH0NCg0KICAgIC8vIEFzc2lnbiBkYXRhIHRvIGJpbnMgYnkgdmFsdWUsIGlnbm9yaW5nIGFueSBvdXRzaWRlIHRoZSBkb21haW4uDQogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgew0KICAgICAgeCA9IHZhbHVlc1tpXTsNCiAgICAgIGlmICh4MCA8PSB4ICYmIHggPD0geDEpIHsNCiAgICAgICAgYmluc1tiaXNlY3RSaWdodCh0eiwgeCwgMCwgbSldLnB1c2goZGF0YVtpXSk7DQogICAgICB9DQogICAgfQ0KDQogICAgcmV0dXJuIGJpbnM7DQogIH0NCg0KICBoaXN0b2dyYW0udmFsdWUgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudChfKSwgaGlzdG9ncmFtKSA6IHZhbHVlOw0KICB9Ow0KDQogIGhpc3RvZ3JhbS5kb21haW4gPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQoW19bMF0sIF9bMV1dKSwgaGlzdG9ncmFtKSA6IGRvbWFpbjsNCiAgfTsNCg0KICBoaXN0b2dyYW0udGhyZXNob2xkcyA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aHJlc2hvbGQgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBBcnJheS5pc0FycmF5KF8pID8gY29uc3RhbnQoc2xpY2UuY2FsbChfKSkgOiBjb25zdGFudChfKSwgaGlzdG9ncmFtKSA6IHRocmVzaG9sZDsNCiAgfTsNCg0KICByZXR1cm4gaGlzdG9ncmFtOw0KfTsNCg0KdmFyIHF1YW50aWxlID0gZnVuY3Rpb24odmFsdWVzLCBwLCB2YWx1ZW9mKSB7DQogIGlmICh2YWx1ZW9mID09IG51bGwpIHZhbHVlb2YgPSBudW1iZXI7DQogIGlmICghKG4gPSB2YWx1ZXMubGVuZ3RoKSkgcmV0dXJuOw0KICBpZiAoKHAgPSArcCkgPD0gMCB8fCBuIDwgMikgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1swXSwgMCwgdmFsdWVzKTsNCiAgaWYgKHAgPj0gMSkgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1tuIC0gMV0sIG4gLSAxLCB2YWx1ZXMpOw0KICB2YXIgbiwNCiAgICAgIGkgPSAobiAtIDEpICogcCwNCiAgICAgIGkwID0gTWF0aC5mbG9vcihpKSwNCiAgICAgIHZhbHVlMCA9ICt2YWx1ZW9mKHZhbHVlc1tpMF0sIGkwLCB2YWx1ZXMpLA0KICAgICAgdmFsdWUxID0gK3ZhbHVlb2YodmFsdWVzW2kwICsgMV0sIGkwICsgMSwgdmFsdWVzKTsNCiAgcmV0dXJuIHZhbHVlMCArICh2YWx1ZTEgLSB2YWx1ZTApICogKGkgLSBpMCk7DQp9Ow0KDQp2YXIgZnJlZWRtYW5EaWFjb25pcyA9IGZ1bmN0aW9uKHZhbHVlcywgbWluLCBtYXgpIHsNCiAgdmFsdWVzID0gbWFwLmNhbGwodmFsdWVzLCBudW1iZXIpLnNvcnQoYXNjZW5kaW5nKTsNCiAgcmV0dXJuIE1hdGguY2VpbCgobWF4IC0gbWluKSAvICgyICogKHF1YW50aWxlKHZhbHVlcywgMC43NSkgLSBxdWFudGlsZSh2YWx1ZXMsIDAuMjUpKSAqIE1hdGgucG93KHZhbHVlcy5sZW5ndGgsIC0xIC8gMykpKTsNCn07DQoNCnZhciBzY290dCA9IGZ1bmN0aW9uKHZhbHVlcywgbWluLCBtYXgpIHsNCiAgcmV0dXJuIE1hdGguY2VpbCgobWF4IC0gbWluKSAvICgzLjUgKiBkZXZpYXRpb24odmFsdWVzKSAqIE1hdGgucG93KHZhbHVlcy5sZW5ndGgsIC0xIC8gMykpKTsNCn07DQoNCnZhciBtYXggPSBmdW5jdGlvbih2YWx1ZXMsIHZhbHVlb2YpIHsNCiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoLA0KICAgICAgaSA9IC0xLA0KICAgICAgdmFsdWUsDQogICAgICBtYXg7DQoNCiAgaWYgKHZhbHVlb2YgPT0gbnVsbCkgew0KICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIEZpbmQgdGhlIGZpcnN0IGNvbXBhcmFibGUgdmFsdWUuDQogICAgICBpZiAoKHZhbHVlID0gdmFsdWVzW2ldKSAhPSBudWxsICYmIHZhbHVlID49IHZhbHVlKSB7DQogICAgICAgIG1heCA9IHZhbHVlOw0KICAgICAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBDb21wYXJlIHRoZSByZW1haW5pbmcgdmFsdWVzLg0KICAgICAgICAgIGlmICgodmFsdWUgPSB2YWx1ZXNbaV0pICE9IG51bGwgJiYgdmFsdWUgPiBtYXgpIHsNCiAgICAgICAgICAgIG1heCA9IHZhbHVlOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIGVsc2Ugew0KICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIEZpbmQgdGhlIGZpcnN0IGNvbXBhcmFibGUgdmFsdWUuDQogICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZXNbaV0sIGksIHZhbHVlcykpICE9IG51bGwgJiYgdmFsdWUgPj0gdmFsdWUpIHsNCiAgICAgICAgbWF4ID0gdmFsdWU7DQogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIENvbXBhcmUgdGhlIHJlbWFpbmluZyB2YWx1ZXMuDQogICAgICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSAhPSBudWxsICYmIHZhbHVlID4gbWF4KSB7DQogICAgICAgICAgICBtYXggPSB2YWx1ZTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICByZXR1cm4gbWF4Ow0KfTsNCg0KdmFyIG1lYW4gPSBmdW5jdGlvbih2YWx1ZXMsIHZhbHVlb2YpIHsNCiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoLA0KICAgICAgbSA9IG4sDQogICAgICBpID0gLTEsDQogICAgICB2YWx1ZSwNCiAgICAgIHN1bSA9IDA7DQoNCiAgaWYgKHZhbHVlb2YgPT0gbnVsbCkgew0KICAgIHdoaWxlICgrK2kgPCBuKSB7DQogICAgICBpZiAoIWlzTmFOKHZhbHVlID0gbnVtYmVyKHZhbHVlc1tpXSkpKSBzdW0gKz0gdmFsdWU7DQogICAgICBlbHNlIC0tbTsNCiAgICB9DQogIH0NCg0KICBlbHNlIHsNCiAgICB3aGlsZSAoKytpIDwgbikgew0KICAgICAgaWYgKCFpc05hTih2YWx1ZSA9IG51bWJlcih2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkpKSBzdW0gKz0gdmFsdWU7DQogICAgICBlbHNlIC0tbTsNCiAgICB9DQogIH0NCg0KICBpZiAobSkgcmV0dXJuIHN1bSAvIG07DQp9Ow0KDQp2YXIgbWVkaWFuID0gZnVuY3Rpb24odmFsdWVzLCB2YWx1ZW9mKSB7DQogIHZhciBuID0gdmFsdWVzLmxlbmd0aCwNCiAgICAgIGkgPSAtMSwNCiAgICAgIHZhbHVlLA0KICAgICAgbnVtYmVycyA9IFtdOw0KDQogIGlmICh2YWx1ZW9mID09IG51bGwpIHsNCiAgICB3aGlsZSAoKytpIDwgbikgew0KICAgICAgaWYgKCFpc05hTih2YWx1ZSA9IG51bWJlcih2YWx1ZXNbaV0pKSkgew0KICAgICAgICBudW1iZXJzLnB1c2godmFsdWUpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIGVsc2Ugew0KICAgIHdoaWxlICgrK2kgPCBuKSB7DQogICAgICBpZiAoIWlzTmFOKHZhbHVlID0gbnVtYmVyKHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSkpIHsNCiAgICAgICAgbnVtYmVycy5wdXNoKHZhbHVlKTsNCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICByZXR1cm4gcXVhbnRpbGUobnVtYmVycy5zb3J0KGFzY2VuZGluZyksIDAuNSk7DQp9Ow0KDQp2YXIgbWVyZ2UgPSBmdW5jdGlvbihhcnJheXMpIHsNCiAgdmFyIG4gPSBhcnJheXMubGVuZ3RoLA0KICAgICAgbSwNCiAgICAgIGkgPSAtMSwNCiAgICAgIGogPSAwLA0KICAgICAgbWVyZ2VkLA0KICAgICAgYXJyYXk7DQoNCiAgd2hpbGUgKCsraSA8IG4pIGogKz0gYXJyYXlzW2ldLmxlbmd0aDsNCiAgbWVyZ2VkID0gbmV3IEFycmF5KGopOw0KDQogIHdoaWxlICgtLW4gPj0gMCkgew0KICAgIGFycmF5ID0gYXJyYXlzW25dOw0KICAgIG0gPSBhcnJheS5sZW5ndGg7DQogICAgd2hpbGUgKC0tbSA+PSAwKSB7DQogICAgICBtZXJnZWRbLS1qXSA9IGFycmF5W21dOw0KICAgIH0NCiAgfQ0KDQogIHJldHVybiBtZXJnZWQ7DQp9Ow0KDQp2YXIgbWluID0gZnVuY3Rpb24odmFsdWVzLCB2YWx1ZW9mKSB7DQogIHZhciBuID0gdmFsdWVzLmxlbmd0aCwNCiAgICAgIGkgPSAtMSwNCiAgICAgIHZhbHVlLA0KICAgICAgbWluOw0KDQogIGlmICh2YWx1ZW9mID09IG51bGwpIHsNCiAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBGaW5kIHRoZSBmaXJzdCBjb21wYXJhYmxlIHZhbHVlLg0KICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlc1tpXSkgIT0gbnVsbCAmJiB2YWx1ZSA+PSB2YWx1ZSkgew0KICAgICAgICBtaW4gPSB2YWx1ZTsNCiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsgLy8gQ29tcGFyZSB0aGUgcmVtYWluaW5nIHZhbHVlcy4NCiAgICAgICAgICBpZiAoKHZhbHVlID0gdmFsdWVzW2ldKSAhPSBudWxsICYmIG1pbiA+IHZhbHVlKSB7DQogICAgICAgICAgICBtaW4gPSB2YWx1ZTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICBlbHNlIHsNCiAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBGaW5kIHRoZSBmaXJzdCBjb21wYXJhYmxlIHZhbHVlLg0KICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSAhPSBudWxsICYmIHZhbHVlID49IHZhbHVlKSB7DQogICAgICAgIG1pbiA9IHZhbHVlOw0KICAgICAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBDb21wYXJlIHRoZSByZW1haW5pbmcgdmFsdWVzLg0KICAgICAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkgIT0gbnVsbCAmJiBtaW4gPiB2YWx1ZSkgew0KICAgICAgICAgICAgbWluID0gdmFsdWU7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgcmV0dXJuIG1pbjsNCn07DQoNCnZhciBwZXJtdXRlID0gZnVuY3Rpb24oYXJyYXksIGluZGV4ZXMpIHsNCiAgdmFyIGkgPSBpbmRleGVzLmxlbmd0aCwgcGVybXV0ZXMgPSBuZXcgQXJyYXkoaSk7DQogIHdoaWxlIChpLS0pIHBlcm11dGVzW2ldID0gYXJyYXlbaW5kZXhlc1tpXV07DQogIHJldHVybiBwZXJtdXRlczsNCn07DQoNCnZhciBzY2FuID0gZnVuY3Rpb24odmFsdWVzLCBjb21wYXJlKSB7DQogIGlmICghKG4gPSB2YWx1ZXMubGVuZ3RoKSkgcmV0dXJuOw0KICB2YXIgbiwNCiAgICAgIGkgPSAwLA0KICAgICAgaiA9IDAsDQogICAgICB4aSwNCiAgICAgIHhqID0gdmFsdWVzW2pdOw0KDQogIGlmIChjb21wYXJlID09IG51bGwpIGNvbXBhcmUgPSBhc2NlbmRpbmc7DQoNCiAgd2hpbGUgKCsraSA8IG4pIHsNCiAgICBpZiAoY29tcGFyZSh4aSA9IHZhbHVlc1tpXSwgeGopIDwgMCB8fCBjb21wYXJlKHhqLCB4aikgIT09IDApIHsNCiAgICAgIHhqID0geGksIGogPSBpOw0KICAgIH0NCiAgfQ0KDQogIGlmIChjb21wYXJlKHhqLCB4aikgPT09IDApIHJldHVybiBqOw0KfTsNCg0KdmFyIHNodWZmbGUgPSBmdW5jdGlvbihhcnJheSwgaTAsIGkxKSB7DQogIHZhciBtID0gKGkxID09IG51bGwgPyBhcnJheS5sZW5ndGggOiBpMSkgLSAoaTAgPSBpMCA9PSBudWxsID8gMCA6ICtpMCksDQogICAgICB0LA0KICAgICAgaTsNCg0KICB3aGlsZSAobSkgew0KICAgIGkgPSBNYXRoLnJhbmRvbSgpICogbS0tIHwgMDsNCiAgICB0ID0gYXJyYXlbbSArIGkwXTsNCiAgICBhcnJheVttICsgaTBdID0gYXJyYXlbaSArIGkwXTsNCiAgICBhcnJheVtpICsgaTBdID0gdDsNCiAgfQ0KDQogIHJldHVybiBhcnJheTsNCn07DQoNCnZhciBzdW0gPSBmdW5jdGlvbih2YWx1ZXMsIHZhbHVlb2YpIHsNCiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoLA0KICAgICAgaSA9IC0xLA0KICAgICAgdmFsdWUsDQogICAgICBzdW0gPSAwOw0KDQogIGlmICh2YWx1ZW9mID09IG51bGwpIHsNCiAgICB3aGlsZSAoKytpIDwgbikgew0KICAgICAgaWYgKHZhbHVlID0gK3ZhbHVlc1tpXSkgc3VtICs9IHZhbHVlOyAvLyBOb3RlOiB6ZXJvIGFuZCBudWxsIGFyZSBlcXVpdmFsZW50Lg0KICAgIH0NCiAgfQ0KDQogIGVsc2Ugew0KICAgIHdoaWxlICgrK2kgPCBuKSB7DQogICAgICBpZiAodmFsdWUgPSArdmFsdWVvZih2YWx1ZXNbaV0sIGksIHZhbHVlcykpIHN1bSArPSB2YWx1ZTsNCiAgICB9DQogIH0NCg0KICByZXR1cm4gc3VtOw0KfTsNCg0KdmFyIHRyYW5zcG9zZSA9IGZ1bmN0aW9uKG1hdHJpeCkgew0KICBpZiAoIShuID0gbWF0cml4Lmxlbmd0aCkpIHJldHVybiBbXTsNCiAgZm9yICh2YXIgaSA9IC0xLCBtID0gbWluKG1hdHJpeCwgbGVuZ3RoKSwgdHJhbnNwb3NlID0gbmV3IEFycmF5KG0pOyArK2kgPCBtOykgew0KICAgIGZvciAodmFyIGogPSAtMSwgbiwgcm93ID0gdHJhbnNwb3NlW2ldID0gbmV3IEFycmF5KG4pOyArK2ogPCBuOykgew0KICAgICAgcm93W2pdID0gbWF0cml4W2pdW2ldOw0KICAgIH0NCiAgfQ0KICByZXR1cm4gdHJhbnNwb3NlOw0KfTsNCg0KZnVuY3Rpb24gbGVuZ3RoKGQpIHsNCiAgcmV0dXJuIGQubGVuZ3RoOw0KfQ0KDQp2YXIgemlwID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiB0cmFuc3Bvc2UoYXJndW1lbnRzKTsNCn07DQoNCmV4cG9ydHMuYmlzZWN0ID0gYmlzZWN0UmlnaHQ7DQpleHBvcnRzLmJpc2VjdFJpZ2h0ID0gYmlzZWN0UmlnaHQ7DQpleHBvcnRzLmJpc2VjdExlZnQgPSBiaXNlY3RMZWZ0Ow0KZXhwb3J0cy5hc2NlbmRpbmcgPSBhc2NlbmRpbmc7DQpleHBvcnRzLmJpc2VjdG9yID0gYmlzZWN0b3I7DQpleHBvcnRzLmNyb3NzID0gY3Jvc3M7DQpleHBvcnRzLmRlc2NlbmRpbmcgPSBkZXNjZW5kaW5nOw0KZXhwb3J0cy5kZXZpYXRpb24gPSBkZXZpYXRpb247DQpleHBvcnRzLmV4dGVudCA9IGV4dGVudDsNCmV4cG9ydHMuaGlzdG9ncmFtID0gaGlzdG9ncmFtOw0KZXhwb3J0cy50aHJlc2hvbGRGcmVlZG1hbkRpYWNvbmlzID0gZnJlZWRtYW5EaWFjb25pczsNCmV4cG9ydHMudGhyZXNob2xkU2NvdHQgPSBzY290dDsNCmV4cG9ydHMudGhyZXNob2xkU3R1cmdlcyA9IHN0dXJnZXM7DQpleHBvcnRzLm1heCA9IG1heDsNCmV4cG9ydHMubWVhbiA9IG1lYW47DQpleHBvcnRzLm1lZGlhbiA9IG1lZGlhbjsNCmV4cG9ydHMubWVyZ2UgPSBtZXJnZTsNCmV4cG9ydHMubWluID0gbWluOw0KZXhwb3J0cy5wYWlycyA9IHBhaXJzOw0KZXhwb3J0cy5wZXJtdXRlID0gcGVybXV0ZTsNCmV4cG9ydHMucXVhbnRpbGUgPSBxdWFudGlsZTsNCmV4cG9ydHMucmFuZ2UgPSByYW5nZTsNCmV4cG9ydHMuc2NhbiA9IHNjYW47DQpleHBvcnRzLnNodWZmbGUgPSBzaHVmZmxlOw0KZXhwb3J0cy5zdW0gPSBzdW07DQpleHBvcnRzLnRpY2tzID0gdGlja3M7DQpleHBvcnRzLnRpY2tJbmNyZW1lbnQgPSB0aWNrSW5jcmVtZW50Ow0KZXhwb3J0cy50aWNrU3RlcCA9IHRpY2tTdGVwOw0KZXhwb3J0cy50cmFuc3Bvc2UgPSB0cmFuc3Bvc2U7DQpleHBvcnRzLnZhcmlhbmNlID0gdmFyaWFuY2U7DQpleHBvcnRzLnppcCA9IHppcDsNCg0KT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTsNCg0KfSkpKTsNCg0KfSx7fV0sMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7DQovLyBodHRwczovL2QzanMub3JnL2QzLWNvbGxlY3Rpb24vIFZlcnNpb24gMS4wLjMuIENvcHlyaWdodCAyMDE3IE1pa2UgQm9zdG9jay4NCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7DQoJdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6DQoJdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6DQoJKGZhY3RvcnkoKGdsb2JhbC5kMyA9IGdsb2JhbC5kMyB8fCB7fSkpKTsNCn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JzsNCg0KdmFyIHByZWZpeCA9ICIkIjsNCg0KZnVuY3Rpb24gTWFwKCkge30NCg0KTWFwLnByb3RvdHlwZSA9IG1hcC5wcm90b3R5cGUgPSB7DQogIGNvbnN0cnVjdG9yOiBNYXAsDQogIGhhczogZnVuY3Rpb24oa2V5KSB7DQogICAgcmV0dXJuIChwcmVmaXggKyBrZXkpIGluIHRoaXM7DQogIH0sDQogIGdldDogZnVuY3Rpb24oa2V5KSB7DQogICAgcmV0dXJuIHRoaXNbcHJlZml4ICsga2V5XTsNCiAgfSwNCiAgc2V0OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7DQogICAgdGhpc1twcmVmaXggKyBrZXldID0gdmFsdWU7DQogICAgcmV0dXJuIHRoaXM7DQogIH0sDQogIHJlbW92ZTogZnVuY3Rpb24oa2V5KSB7DQogICAgdmFyIHByb3BlcnR5ID0gcHJlZml4ICsga2V5Ow0KICAgIHJldHVybiBwcm9wZXJ0eSBpbiB0aGlzICYmIGRlbGV0ZSB0aGlzW3Byb3BlcnR5XTsNCiAgfSwNCiAgY2xlYXI6IGZ1bmN0aW9uKCkgew0KICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4KSBkZWxldGUgdGhpc1twcm9wZXJ0eV07DQogIH0sDQogIGtleXM6IGZ1bmN0aW9uKCkgew0KICAgIHZhciBrZXlzID0gW107DQogICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIGtleXMucHVzaChwcm9wZXJ0eS5zbGljZSgxKSk7DQogICAgcmV0dXJuIGtleXM7DQogIH0sDQogIHZhbHVlczogZnVuY3Rpb24oKSB7DQogICAgdmFyIHZhbHVlcyA9IFtdOw0KICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4KSB2YWx1ZXMucHVzaCh0aGlzW3Byb3BlcnR5XSk7DQogICAgcmV0dXJuIHZhbHVlczsNCiAgfSwNCiAgZW50cmllczogZnVuY3Rpb24oKSB7DQogICAgdmFyIGVudHJpZXMgPSBbXTsNCiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCkgZW50cmllcy5wdXNoKHtrZXk6IHByb3BlcnR5LnNsaWNlKDEpLCB2YWx1ZTogdGhpc1twcm9wZXJ0eV19KTsNCiAgICByZXR1cm4gZW50cmllczsNCiAgfSwNCiAgc2l6ZTogZnVuY3Rpb24oKSB7DQogICAgdmFyIHNpemUgPSAwOw0KICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4KSArK3NpemU7DQogICAgcmV0dXJuIHNpemU7DQogIH0sDQogIGVtcHR5OiBmdW5jdGlvbigpIHsNCiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCkgcmV0dXJuIGZhbHNlOw0KICAgIHJldHVybiB0cnVlOw0KICB9LA0KICBlYWNoOiBmdW5jdGlvbihmKSB7DQogICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIGYodGhpc1twcm9wZXJ0eV0sIHByb3BlcnR5LnNsaWNlKDEpLCB0aGlzKTsNCiAgfQ0KfTsNCg0KZnVuY3Rpb24gbWFwKG9iamVjdCwgZikgew0KICB2YXIgbWFwID0gbmV3IE1hcDsNCg0KICAvLyBDb3B5IGNvbnN0cnVjdG9yLg0KICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWFwKSBvYmplY3QuZWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7IG1hcC5zZXQoa2V5LCB2YWx1ZSk7IH0pOw0KDQogIC8vIEluZGV4IGFycmF5IGJ5IG51bWVyaWMgaW5kZXggb3Igc3BlY2lmaWVkIGtleSBmdW5jdGlvbi4NCiAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7DQogICAgdmFyIGkgPSAtMSwNCiAgICAgICAgbiA9IG9iamVjdC5sZW5ndGgsDQogICAgICAgIG87DQoNCiAgICBpZiAoZiA9PSBudWxsKSB3aGlsZSAoKytpIDwgbikgbWFwLnNldChpLCBvYmplY3RbaV0pOw0KICAgIGVsc2Ugd2hpbGUgKCsraSA8IG4pIG1hcC5zZXQoZihvID0gb2JqZWN0W2ldLCBpLCBvYmplY3QpLCBvKTsNCiAgfQ0KDQogIC8vIENvbnZlcnQgb2JqZWN0IHRvIG1hcC4NCiAgZWxzZSBpZiAob2JqZWN0KSBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSBtYXAuc2V0KGtleSwgb2JqZWN0W2tleV0pOw0KDQogIHJldHVybiBtYXA7DQp9DQoNCnZhciBuZXN0ID0gZnVuY3Rpb24oKSB7DQogIHZhciBrZXlzID0gW10sDQogICAgICBzb3J0S2V5cyA9IFtdLA0KICAgICAgc29ydFZhbHVlcywNCiAgICAgIHJvbGx1cCwNCiAgICAgIG5lc3Q7DQoNCiAgZnVuY3Rpb24gYXBwbHkoYXJyYXksIGRlcHRoLCBjcmVhdGVSZXN1bHQsIHNldFJlc3VsdCkgew0KICAgIGlmIChkZXB0aCA+PSBrZXlzLmxlbmd0aCkgcmV0dXJuIHJvbGx1cCAhPSBudWxsDQogICAgICAgID8gcm9sbHVwKGFycmF5KSA6IChzb3J0VmFsdWVzICE9IG51bGwNCiAgICAgICAgPyBhcnJheS5zb3J0KHNvcnRWYWx1ZXMpDQogICAgICAgIDogYXJyYXkpOw0KDQogICAgdmFyIGkgPSAtMSwNCiAgICAgICAgbiA9IGFycmF5Lmxlbmd0aCwNCiAgICAgICAga2V5ID0ga2V5c1tkZXB0aCsrXSwNCiAgICAgICAga2V5VmFsdWUsDQogICAgICAgIHZhbHVlLA0KICAgICAgICB2YWx1ZXNCeUtleSA9IG1hcCgpLA0KICAgICAgICB2YWx1ZXMsDQogICAgICAgIHJlc3VsdCA9IGNyZWF0ZVJlc3VsdCgpOw0KDQogICAgd2hpbGUgKCsraSA8IG4pIHsNCiAgICAgIGlmICh2YWx1ZXMgPSB2YWx1ZXNCeUtleS5nZXQoa2V5VmFsdWUgPSBrZXkodmFsdWUgPSBhcnJheVtpXSkgKyAiIikpIHsNCiAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdmFsdWVzQnlLZXkuc2V0KGtleVZhbHVlLCBbdmFsdWVdKTsNCiAgICAgIH0NCiAgICB9DQoNCiAgICB2YWx1ZXNCeUtleS5lYWNoKGZ1bmN0aW9uKHZhbHVlcywga2V5KSB7DQogICAgICBzZXRSZXN1bHQocmVzdWx0LCBrZXksIGFwcGx5KHZhbHVlcywgZGVwdGgsIGNyZWF0ZVJlc3VsdCwgc2V0UmVzdWx0KSk7DQogICAgfSk7DQoNCiAgICByZXR1cm4gcmVzdWx0Ow0KICB9DQoNCiAgZnVuY3Rpb24gZW50cmllcyhtYXAkJDEsIGRlcHRoKSB7DQogICAgaWYgKCsrZGVwdGggPiBrZXlzLmxlbmd0aCkgcmV0dXJuIG1hcCQkMTsNCiAgICB2YXIgYXJyYXksIHNvcnRLZXkgPSBzb3J0S2V5c1tkZXB0aCAtIDFdOw0KICAgIGlmIChyb2xsdXAgIT0gbnVsbCAmJiBkZXB0aCA+PSBrZXlzLmxlbmd0aCkgYXJyYXkgPSBtYXAkJDEuZW50cmllcygpOw0KICAgIGVsc2UgYXJyYXkgPSBbXSwgbWFwJCQxLmVhY2goZnVuY3Rpb24odiwgaykgeyBhcnJheS5wdXNoKHtrZXk6IGssIHZhbHVlczogZW50cmllcyh2LCBkZXB0aCl9KTsgfSk7DQogICAgcmV0dXJuIHNvcnRLZXkgIT0gbnVsbCA/IGFycmF5LnNvcnQoZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gc29ydEtleShhLmtleSwgYi5rZXkpOyB9KSA6IGFycmF5Ow0KICB9DQoNCiAgcmV0dXJuIG5lc3QgPSB7DQogICAgb2JqZWN0OiBmdW5jdGlvbihhcnJheSkgeyByZXR1cm4gYXBwbHkoYXJyYXksIDAsIGNyZWF0ZU9iamVjdCwgc2V0T2JqZWN0KTsgfSwNCiAgICBtYXA6IGZ1bmN0aW9uKGFycmF5KSB7IHJldHVybiBhcHBseShhcnJheSwgMCwgY3JlYXRlTWFwLCBzZXRNYXApOyB9LA0KICAgIGVudHJpZXM6IGZ1bmN0aW9uKGFycmF5KSB7IHJldHVybiBlbnRyaWVzKGFwcGx5KGFycmF5LCAwLCBjcmVhdGVNYXAsIHNldE1hcCksIDApOyB9LA0KICAgIGtleTogZnVuY3Rpb24oZCkgeyBrZXlzLnB1c2goZCk7IHJldHVybiBuZXN0OyB9LA0KICAgIHNvcnRLZXlzOiBmdW5jdGlvbihvcmRlcikgeyBzb3J0S2V5c1trZXlzLmxlbmd0aCAtIDFdID0gb3JkZXI7IHJldHVybiBuZXN0OyB9LA0KICAgIHNvcnRWYWx1ZXM6IGZ1bmN0aW9uKG9yZGVyKSB7IHNvcnRWYWx1ZXMgPSBvcmRlcjsgcmV0dXJuIG5lc3Q7IH0sDQogICAgcm9sbHVwOiBmdW5jdGlvbihmKSB7IHJvbGx1cCA9IGY7IHJldHVybiBuZXN0OyB9DQogIH07DQp9Ow0KDQpmdW5jdGlvbiBjcmVhdGVPYmplY3QoKSB7DQogIHJldHVybiB7fTsNCn0NCg0KZnVuY3Rpb24gc2V0T2JqZWN0KG9iamVjdCwga2V5LCB2YWx1ZSkgew0KICBvYmplY3Rba2V5XSA9IHZhbHVlOw0KfQ0KDQpmdW5jdGlvbiBjcmVhdGVNYXAoKSB7DQogIHJldHVybiBtYXAoKTsNCn0NCg0KZnVuY3Rpb24gc2V0TWFwKG1hcCQkMSwga2V5LCB2YWx1ZSkgew0KICBtYXAkJDEuc2V0KGtleSwgdmFsdWUpOw0KfQ0KDQpmdW5jdGlvbiBTZXQoKSB7fQ0KDQp2YXIgcHJvdG8gPSBtYXAucHJvdG90eXBlOw0KDQpTZXQucHJvdG90eXBlID0gc2V0LnByb3RvdHlwZSA9IHsNCiAgY29uc3RydWN0b3I6IFNldCwNCiAgaGFzOiBwcm90by5oYXMsDQogIGFkZDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICB2YWx1ZSArPSAiIjsNCiAgICB0aGlzW3ByZWZpeCArIHZhbHVlXSA9IHZhbHVlOw0KICAgIHJldHVybiB0aGlzOw0KICB9LA0KICByZW1vdmU6IHByb3RvLnJlbW92ZSwNCiAgY2xlYXI6IHByb3RvLmNsZWFyLA0KICB2YWx1ZXM6IHByb3RvLmtleXMsDQogIHNpemU6IHByb3RvLnNpemUsDQogIGVtcHR5OiBwcm90by5lbXB0eSwNCiAgZWFjaDogcHJvdG8uZWFjaA0KfTsNCg0KZnVuY3Rpb24gc2V0KG9iamVjdCwgZikgew0KICB2YXIgc2V0ID0gbmV3IFNldDsNCg0KICAvLyBDb3B5IGNvbnN0cnVjdG9yLg0KICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU2V0KSBvYmplY3QuZWFjaChmdW5jdGlvbih2YWx1ZSkgeyBzZXQuYWRkKHZhbHVlKTsgfSk7DQoNCiAgLy8gT3RoZXJ3aXNlLCBhc3N1bWUgaXTigJlzIGFuIGFycmF5Lg0KICBlbHNlIGlmIChvYmplY3QpIHsNCiAgICB2YXIgaSA9IC0xLCBuID0gb2JqZWN0Lmxlbmd0aDsNCiAgICBpZiAoZiA9PSBudWxsKSB3aGlsZSAoKytpIDwgbikgc2V0LmFkZChvYmplY3RbaV0pOw0KICAgIGVsc2Ugd2hpbGUgKCsraSA8IG4pIHNldC5hZGQoZihvYmplY3RbaV0sIGksIG9iamVjdCkpOw0KICB9DQoNCiAgcmV0dXJuIHNldDsNCn0NCg0KdmFyIGtleXMgPSBmdW5jdGlvbihtYXApIHsNCiAgdmFyIGtleXMgPSBbXTsNCiAgZm9yICh2YXIga2V5IGluIG1hcCkga2V5cy5wdXNoKGtleSk7DQogIHJldHVybiBrZXlzOw0KfTsNCg0KdmFyIHZhbHVlcyA9IGZ1bmN0aW9uKG1hcCkgew0KICB2YXIgdmFsdWVzID0gW107DQogIGZvciAodmFyIGtleSBpbiBtYXApIHZhbHVlcy5wdXNoKG1hcFtrZXldKTsNCiAgcmV0dXJuIHZhbHVlczsNCn07DQoNCnZhciBlbnRyaWVzID0gZnVuY3Rpb24obWFwKSB7DQogIHZhciBlbnRyaWVzID0gW107DQogIGZvciAodmFyIGtleSBpbiBtYXApIGVudHJpZXMucHVzaCh7a2V5OiBrZXksIHZhbHVlOiBtYXBba2V5XX0pOw0KICByZXR1cm4gZW50cmllczsNCn07DQoNCmV4cG9ydHMubmVzdCA9IG5lc3Q7DQpleHBvcnRzLnNldCA9IHNldDsNCmV4cG9ydHMubWFwID0gbWFwOw0KZXhwb3J0cy5rZXlzID0ga2V5czsNCmV4cG9ydHMudmFsdWVzID0gdmFsdWVzOw0KZXhwb3J0cy5lbnRyaWVzID0gZW50cmllczsNCg0KT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTsNCg0KfSkpKTsNCg0KfSx7fV0sNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7DQovLyBodHRwczovL2QzanMub3JnL2QzLWNvbG9yLyBWZXJzaW9uIDEuMC4zLiBDb3B5cmlnaHQgMjAxNyBNaWtlIEJvc3RvY2suDQooZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgew0KCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOg0KCXR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnXSwgZmFjdG9yeSkgOg0KCShmYWN0b3J5KChnbG9iYWwuZDMgPSBnbG9iYWwuZDMgfHwge30pKSk7DQp9KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7DQoNCnZhciBkZWZpbmUgPSBmdW5jdGlvbihjb25zdHJ1Y3RvciwgZmFjdG9yeSwgcHJvdG90eXBlKSB7DQogIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGZhY3RvcnkucHJvdG90eXBlID0gcHJvdG90eXBlOw0KICBwcm90b3R5cGUuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcjsNCn07DQoNCmZ1bmN0aW9uIGV4dGVuZChwYXJlbnQsIGRlZmluaXRpb24pIHsNCiAgdmFyIHByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocGFyZW50LnByb3RvdHlwZSk7DQogIGZvciAodmFyIGtleSBpbiBkZWZpbml0aW9uKSBwcm90b3R5cGVba2V5XSA9IGRlZmluaXRpb25ba2V5XTsNCiAgcmV0dXJuIHByb3RvdHlwZTsNCn0NCg0KZnVuY3Rpb24gQ29sb3IoKSB7fQ0KDQp2YXIgZGFya2VyID0gMC43Ow0KdmFyIGJyaWdodGVyID0gMSAvIGRhcmtlcjsNCg0KdmFyIHJlSSA9ICJcXHMqKFsrLV0/XFxkKylcXHMqIjsNCnZhciByZU4gPSAiXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIjsNCnZhciByZVAgPSAiXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiI7DQp2YXIgcmVIZXgzID0gL14jKFswLTlhLWZdezN9KSQvOw0KdmFyIHJlSGV4NiA9IC9eIyhbMC05YS1mXXs2fSkkLzsNCnZhciByZVJnYkludGVnZXIgPSBuZXcgUmVnRXhwKCJecmdiXFwoIiArIFtyZUksIHJlSSwgcmVJXSArICJcXCkkIik7DQp2YXIgcmVSZ2JQZXJjZW50ID0gbmV3IFJlZ0V4cCgiXnJnYlxcKCIgKyBbcmVQLCByZVAsIHJlUF0gKyAiXFwpJCIpOw0KdmFyIHJlUmdiYUludGVnZXIgPSBuZXcgUmVnRXhwKCJecmdiYVxcKCIgKyBbcmVJLCByZUksIHJlSSwgcmVOXSArICJcXCkkIik7DQp2YXIgcmVSZ2JhUGVyY2VudCA9IG5ldyBSZWdFeHAoIl5yZ2JhXFwoIiArIFtyZVAsIHJlUCwgcmVQLCByZU5dICsgIlxcKSQiKTsNCnZhciByZUhzbFBlcmNlbnQgPSBuZXcgUmVnRXhwKCJeaHNsXFwoIiArIFtyZU4sIHJlUCwgcmVQXSArICJcXCkkIik7DQp2YXIgcmVIc2xhUGVyY2VudCA9IG5ldyBSZWdFeHAoIl5oc2xhXFwoIiArIFtyZU4sIHJlUCwgcmVQLCByZU5dICsgIlxcKSQiKTsNCg0KdmFyIG5hbWVkID0gew0KICBhbGljZWJsdWU6IDB4ZjBmOGZmLA0KICBhbnRpcXVld2hpdGU6IDB4ZmFlYmQ3LA0KICBhcXVhOiAweDAwZmZmZiwNCiAgYXF1YW1hcmluZTogMHg3ZmZmZDQsDQogIGF6dXJlOiAweGYwZmZmZiwNCiAgYmVpZ2U6IDB4ZjVmNWRjLA0KICBiaXNxdWU6IDB4ZmZlNGM0LA0KICBibGFjazogMHgwMDAwMDAsDQogIGJsYW5jaGVkYWxtb25kOiAweGZmZWJjZCwNCiAgYmx1ZTogMHgwMDAwZmYsDQogIGJsdWV2aW9sZXQ6IDB4OGEyYmUyLA0KICBicm93bjogMHhhNTJhMmEsDQogIGJ1cmx5d29vZDogMHhkZWI4ODcsDQogIGNhZGV0Ymx1ZTogMHg1ZjllYTAsDQogIGNoYXJ0cmV1c2U6IDB4N2ZmZjAwLA0KICBjaG9jb2xhdGU6IDB4ZDI2OTFlLA0KICBjb3JhbDogMHhmZjdmNTAsDQogIGNvcm5mbG93ZXJibHVlOiAweDY0OTVlZCwNCiAgY29ybnNpbGs6IDB4ZmZmOGRjLA0KICBjcmltc29uOiAweGRjMTQzYywNCiAgY3lhbjogMHgwMGZmZmYsDQogIGRhcmtibHVlOiAweDAwMDA4YiwNCiAgZGFya2N5YW46IDB4MDA4YjhiLA0KICBkYXJrZ29sZGVucm9kOiAweGI4ODYwYiwNCiAgZGFya2dyYXk6IDB4YTlhOWE5LA0KICBkYXJrZ3JlZW46IDB4MDA2NDAwLA0KICBkYXJrZ3JleTogMHhhOWE5YTksDQogIGRhcmtraGFraTogMHhiZGI3NmIsDQogIGRhcmttYWdlbnRhOiAweDhiMDA4YiwNCiAgZGFya29saXZlZ3JlZW46IDB4NTU2YjJmLA0KICBkYXJrb3JhbmdlOiAweGZmOGMwMCwNCiAgZGFya29yY2hpZDogMHg5OTMyY2MsDQogIGRhcmtyZWQ6IDB4OGIwMDAwLA0KICBkYXJrc2FsbW9uOiAweGU5OTY3YSwNCiAgZGFya3NlYWdyZWVuOiAweDhmYmM4ZiwNCiAgZGFya3NsYXRlYmx1ZTogMHg0ODNkOGIsDQogIGRhcmtzbGF0ZWdyYXk6IDB4MmY0ZjRmLA0KICBkYXJrc2xhdGVncmV5OiAweDJmNGY0ZiwNCiAgZGFya3R1cnF1b2lzZTogMHgwMGNlZDEsDQogIGRhcmt2aW9sZXQ6IDB4OTQwMGQzLA0KICBkZWVwcGluazogMHhmZjE0OTMsDQogIGRlZXBza3libHVlOiAweDAwYmZmZiwNCiAgZGltZ3JheTogMHg2OTY5NjksDQogIGRpbWdyZXk6IDB4Njk2OTY5LA0KICBkb2RnZXJibHVlOiAweDFlOTBmZiwNCiAgZmlyZWJyaWNrOiAweGIyMjIyMiwNCiAgZmxvcmFsd2hpdGU6IDB4ZmZmYWYwLA0KICBmb3Jlc3RncmVlbjogMHgyMjhiMjIsDQogIGZ1Y2hzaWE6IDB4ZmYwMGZmLA0KICBnYWluc2Jvcm86IDB4ZGNkY2RjLA0KICBnaG9zdHdoaXRlOiAweGY4ZjhmZiwNCiAgZ29sZDogMHhmZmQ3MDAsDQogIGdvbGRlbnJvZDogMHhkYWE1MjAsDQogIGdyYXk6IDB4ODA4MDgwLA0KICBncmVlbjogMHgwMDgwMDAsDQogIGdyZWVueWVsbG93OiAweGFkZmYyZiwNCiAgZ3JleTogMHg4MDgwODAsDQogIGhvbmV5ZGV3OiAweGYwZmZmMCwNCiAgaG90cGluazogMHhmZjY5YjQsDQogIGluZGlhbnJlZDogMHhjZDVjNWMsDQogIGluZGlnbzogMHg0YjAwODIsDQogIGl2b3J5OiAweGZmZmZmMCwNCiAga2hha2k6IDB4ZjBlNjhjLA0KICBsYXZlbmRlcjogMHhlNmU2ZmEsDQogIGxhdmVuZGVyYmx1c2g6IDB4ZmZmMGY1LA0KICBsYXduZ3JlZW46IDB4N2NmYzAwLA0KICBsZW1vbmNoaWZmb246IDB4ZmZmYWNkLA0KICBsaWdodGJsdWU6IDB4YWRkOGU2LA0KICBsaWdodGNvcmFsOiAweGYwODA4MCwNCiAgbGlnaHRjeWFuOiAweGUwZmZmZiwNCiAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IDB4ZmFmYWQyLA0KICBsaWdodGdyYXk6IDB4ZDNkM2QzLA0KICBsaWdodGdyZWVuOiAweDkwZWU5MCwNCiAgbGlnaHRncmV5OiAweGQzZDNkMywNCiAgbGlnaHRwaW5rOiAweGZmYjZjMSwNCiAgbGlnaHRzYWxtb246IDB4ZmZhMDdhLA0KICBsaWdodHNlYWdyZWVuOiAweDIwYjJhYSwNCiAgbGlnaHRza3libHVlOiAweDg3Y2VmYSwNCiAgbGlnaHRzbGF0ZWdyYXk6IDB4Nzc4ODk5LA0KICBsaWdodHNsYXRlZ3JleTogMHg3Nzg4OTksDQogIGxpZ2h0c3RlZWxibHVlOiAweGIwYzRkZSwNCiAgbGlnaHR5ZWxsb3c6IDB4ZmZmZmUwLA0KICBsaW1lOiAweDAwZmYwMCwNCiAgbGltZWdyZWVuOiAweDMyY2QzMiwNCiAgbGluZW46IDB4ZmFmMGU2LA0KICBtYWdlbnRhOiAweGZmMDBmZiwNCiAgbWFyb29uOiAweDgwMDAwMCwNCiAgbWVkaXVtYXF1YW1hcmluZTogMHg2NmNkYWEsDQogIG1lZGl1bWJsdWU6IDB4MDAwMGNkLA0KICBtZWRpdW1vcmNoaWQ6IDB4YmE1NWQzLA0KICBtZWRpdW1wdXJwbGU6IDB4OTM3MGRiLA0KICBtZWRpdW1zZWFncmVlbjogMHgzY2IzNzEsDQogIG1lZGl1bXNsYXRlYmx1ZTogMHg3YjY4ZWUsDQogIG1lZGl1bXNwcmluZ2dyZWVuOiAweDAwZmE5YSwNCiAgbWVkaXVtdHVycXVvaXNlOiAweDQ4ZDFjYywNCiAgbWVkaXVtdmlvbGV0cmVkOiAweGM3MTU4NSwNCiAgbWlkbmlnaHRibHVlOiAweDE5MTk3MCwNCiAgbWludGNyZWFtOiAweGY1ZmZmYSwNCiAgbWlzdHlyb3NlOiAweGZmZTRlMSwNCiAgbW9jY2FzaW46IDB4ZmZlNGI1LA0KICBuYXZham93aGl0ZTogMHhmZmRlYWQsDQogIG5hdnk6IDB4MDAwMDgwLA0KICBvbGRsYWNlOiAweGZkZjVlNiwNCiAgb2xpdmU6IDB4ODA4MDAwLA0KICBvbGl2ZWRyYWI6IDB4NmI4ZTIzLA0KICBvcmFuZ2U6IDB4ZmZhNTAwLA0KICBvcmFuZ2VyZWQ6IDB4ZmY0NTAwLA0KICBvcmNoaWQ6IDB4ZGE3MGQ2LA0KICBwYWxlZ29sZGVucm9kOiAweGVlZThhYSwNCiAgcGFsZWdyZWVuOiAweDk4ZmI5OCwNCiAgcGFsZXR1cnF1b2lzZTogMHhhZmVlZWUsDQogIHBhbGV2aW9sZXRyZWQ6IDB4ZGI3MDkzLA0KICBwYXBheWF3aGlwOiAweGZmZWZkNSwNCiAgcGVhY2hwdWZmOiAweGZmZGFiOSwNCiAgcGVydTogMHhjZDg1M2YsDQogIHBpbms6IDB4ZmZjMGNiLA0KICBwbHVtOiAweGRkYTBkZCwNCiAgcG93ZGVyYmx1ZTogMHhiMGUwZTYsDQogIHB1cnBsZTogMHg4MDAwODAsDQogIHJlYmVjY2FwdXJwbGU6IDB4NjYzMzk5LA0KICByZWQ6IDB4ZmYwMDAwLA0KICByb3N5YnJvd246IDB4YmM4ZjhmLA0KICByb3lhbGJsdWU6IDB4NDE2OWUxLA0KICBzYWRkbGVicm93bjogMHg4YjQ1MTMsDQogIHNhbG1vbjogMHhmYTgwNzIsDQogIHNhbmR5YnJvd246IDB4ZjRhNDYwLA0KICBzZWFncmVlbjogMHgyZThiNTcsDQogIHNlYXNoZWxsOiAweGZmZjVlZSwNCiAgc2llbm5hOiAweGEwNTIyZCwNCiAgc2lsdmVyOiAweGMwYzBjMCwNCiAgc2t5Ymx1ZTogMHg4N2NlZWIsDQogIHNsYXRlYmx1ZTogMHg2YTVhY2QsDQogIHNsYXRlZ3JheTogMHg3MDgwOTAsDQogIHNsYXRlZ3JleTogMHg3MDgwOTAsDQogIHNub3c6IDB4ZmZmYWZhLA0KICBzcHJpbmdncmVlbjogMHgwMGZmN2YsDQogIHN0ZWVsYmx1ZTogMHg0NjgyYjQsDQogIHRhbjogMHhkMmI0OGMsDQogIHRlYWw6IDB4MDA4MDgwLA0KICB0aGlzdGxlOiAweGQ4YmZkOCwNCiAgdG9tYXRvOiAweGZmNjM0NywNCiAgdHVycXVvaXNlOiAweDQwZTBkMCwNCiAgdmlvbGV0OiAweGVlODJlZSwNCiAgd2hlYXQ6IDB4ZjVkZWIzLA0KICB3aGl0ZTogMHhmZmZmZmYsDQogIHdoaXRlc21va2U6IDB4ZjVmNWY1LA0KICB5ZWxsb3c6IDB4ZmZmZjAwLA0KICB5ZWxsb3dncmVlbjogMHg5YWNkMzINCn07DQoNCmRlZmluZShDb2xvciwgY29sb3IsIHsNCiAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCk7DQogIH0sDQogIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcy5yZ2IoKSArICIiOw0KICB9DQp9KTsNCg0KZnVuY3Rpb24gY29sb3IoZm9ybWF0KSB7DQogIHZhciBtOw0KICBmb3JtYXQgPSAoZm9ybWF0ICsgIiIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOw0KICByZXR1cm4gKG0gPSByZUhleDMuZXhlYyhmb3JtYXQpKSA/IChtID0gcGFyc2VJbnQobVsxXSwgMTYpLCBuZXcgUmdiKChtID4+IDggJiAweGYpIHwgKG0gPj4gNCAmIDB4MGYwKSwgKG0gPj4gNCAmIDB4ZikgfCAobSAmIDB4ZjApLCAoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpLCAxKSkgLy8gI2YwMA0KICAgICAgOiAobSA9IHJlSGV4Ni5leGVjKGZvcm1hdCkpID8gcmdibihwYXJzZUludChtWzFdLCAxNikpIC8vICNmZjAwMDANCiAgICAgIDogKG0gPSByZVJnYkludGVnZXIuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSwgbVsyXSwgbVszXSwgMSkgLy8gcmdiKDI1NSwgMCwgMCkNCiAgICAgIDogKG0gPSByZVJnYlBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgMSkgLy8gcmdiKDEwMCUsIDAlLCAwJSkNCiAgICAgIDogKG0gPSByZVJnYmFJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0sIG1bMl0sIG1bM10sIG1bNF0pIC8vIHJnYmEoMjU1LCAwLCAwLCAxKQ0KICAgICAgOiAobSA9IHJlUmdiYVBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IHJnYmEobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgbVs0XSkgLy8gcmdiKDEwMCUsIDAlLCAwJSwgMSkNCiAgICAgIDogKG0gPSByZUhzbFBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IGhzbGEobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgMSkgLy8gaHNsKDEyMCwgNTAlLCA1MCUpDQogICAgICA6IChtID0gcmVIc2xhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCBtWzRdKSAvLyBoc2xhKDEyMCwgNTAlLCA1MCUsIDEpDQogICAgICA6IG5hbWVkLmhhc093blByb3BlcnR5KGZvcm1hdCkgPyByZ2JuKG5hbWVkW2Zvcm1hdF0pDQogICAgICA6IGZvcm1hdCA9PT0gInRyYW5zcGFyZW50IiA/IG5ldyBSZ2IoTmFOLCBOYU4sIE5hTiwgMCkNCiAgICAgIDogbnVsbDsNCn0NCg0KZnVuY3Rpb24gcmdibihuKSB7DQogIHJldHVybiBuZXcgUmdiKG4gPj4gMTYgJiAweGZmLCBuID4+IDggJiAweGZmLCBuICYgMHhmZiwgMSk7DQp9DQoNCmZ1bmN0aW9uIHJnYmEociwgZywgYiwgYSkgew0KICBpZiAoYSA8PSAwKSByID0gZyA9IGIgPSBOYU47DQogIHJldHVybiBuZXcgUmdiKHIsIGcsIGIsIGEpOw0KfQ0KDQpmdW5jdGlvbiByZ2JDb252ZXJ0KG8pIHsNCiAgaWYgKCEobyBpbnN0YW5jZW9mIENvbG9yKSkgbyA9IGNvbG9yKG8pOw0KICBpZiAoIW8pIHJldHVybiBuZXcgUmdiOw0KICBvID0gby5yZ2IoKTsNCiAgcmV0dXJuIG5ldyBSZ2Ioby5yLCBvLmcsIG8uYiwgby5vcGFjaXR5KTsNCn0NCg0KZnVuY3Rpb24gcmdiKHIsIGcsIGIsIG9wYWNpdHkpIHsNCiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyByZ2JDb252ZXJ0KHIpIDogbmV3IFJnYihyLCBnLCBiLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7DQp9DQoNCmZ1bmN0aW9uIFJnYihyLCBnLCBiLCBvcGFjaXR5KSB7DQogIHRoaXMuciA9ICtyOw0KICB0aGlzLmcgPSArZzsNCiAgdGhpcy5iID0gK2I7DQogIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5Ow0KfQ0KDQpkZWZpbmUoUmdiLCByZ2IsIGV4dGVuZChDb2xvciwgew0KICBicmlnaHRlcjogZnVuY3Rpb24oaykgew0KICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTsNCiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpOw0KICB9LA0KICBkYXJrZXI6IGZ1bmN0aW9uKGspIHsNCiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTsNCiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpOw0KICB9LA0KICByZ2I6IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aGlzOw0KICB9LA0KICBkaXNwbGF5YWJsZTogZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuICgwIDw9IHRoaXMuciAmJiB0aGlzLnIgPD0gMjU1KQ0KICAgICAgICAmJiAoMCA8PSB0aGlzLmcgJiYgdGhpcy5nIDw9IDI1NSkNCiAgICAgICAgJiYgKDAgPD0gdGhpcy5iICYmIHRoaXMuYiA8PSAyNTUpDQogICAgICAgICYmICgwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMSk7DQogIH0sDQogIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgYSA9IHRoaXMub3BhY2l0eTsgYSA9IGlzTmFOKGEpID8gMSA6IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGEpKTsNCiAgICByZXR1cm4gKGEgPT09IDEgPyAicmdiKCIgOiAicmdiYSgiKQ0KICAgICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0aGlzLnIpIHx8IDApKSArICIsICINCiAgICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodGhpcy5nKSB8fCAwKSkgKyAiLCAiDQogICAgICAgICsgTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHRoaXMuYikgfHwgMCkpDQogICAgICAgICsgKGEgPT09IDEgPyAiKSIgOiAiLCAiICsgYSArICIpIik7DQogIH0NCn0pKTsNCg0KZnVuY3Rpb24gaHNsYShoLCBzLCBsLCBhKSB7DQogIGlmIChhIDw9IDApIGggPSBzID0gbCA9IE5hTjsNCiAgZWxzZSBpZiAobCA8PSAwIHx8IGwgPj0gMSkgaCA9IHMgPSBOYU47DQogIGVsc2UgaWYgKHMgPD0gMCkgaCA9IE5hTjsNCiAgcmV0dXJuIG5ldyBIc2woaCwgcywgbCwgYSk7DQp9DQoNCmZ1bmN0aW9uIGhzbENvbnZlcnQobykgew0KICBpZiAobyBpbnN0YW5jZW9mIEhzbCkgcmV0dXJuIG5ldyBIc2woby5oLCBvLnMsIG8ubCwgby5vcGFjaXR5KTsNCiAgaWYgKCEobyBpbnN0YW5jZW9mIENvbG9yKSkgbyA9IGNvbG9yKG8pOw0KICBpZiAoIW8pIHJldHVybiBuZXcgSHNsOw0KICBpZiAobyBpbnN0YW5jZW9mIEhzbCkgcmV0dXJuIG87DQogIG8gPSBvLnJnYigpOw0KICB2YXIgciA9IG8uciAvIDI1NSwNCiAgICAgIGcgPSBvLmcgLyAyNTUsDQogICAgICBiID0gby5iIC8gMjU1LA0KICAgICAgbWluID0gTWF0aC5taW4ociwgZywgYiksDQogICAgICBtYXggPSBNYXRoLm1heChyLCBnLCBiKSwNCiAgICAgIGggPSBOYU4sDQogICAgICBzID0gbWF4IC0gbWluLA0KICAgICAgbCA9IChtYXggKyBtaW4pIC8gMjsNCiAgaWYgKHMpIHsNCiAgICBpZiAociA9PT0gbWF4KSBoID0gKGcgLSBiKSAvIHMgKyAoZyA8IGIpICogNjsNCiAgICBlbHNlIGlmIChnID09PSBtYXgpIGggPSAoYiAtIHIpIC8gcyArIDI7DQogICAgZWxzZSBoID0gKHIgLSBnKSAvIHMgKyA0Ow0KICAgIHMgLz0gbCA8IDAuNSA/IG1heCArIG1pbiA6IDIgLSBtYXggLSBtaW47DQogICAgaCAqPSA2MDsNCiAgfSBlbHNlIHsNCiAgICBzID0gbCA+IDAgJiYgbCA8IDEgPyAwIDogaDsNCiAgfQ0KICByZXR1cm4gbmV3IEhzbChoLCBzLCBsLCBvLm9wYWNpdHkpOw0KfQ0KDQpmdW5jdGlvbiBoc2woaCwgcywgbCwgb3BhY2l0eSkgew0KICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhzbENvbnZlcnQoaCkgOiBuZXcgSHNsKGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsNCn0NCg0KZnVuY3Rpb24gSHNsKGgsIHMsIGwsIG9wYWNpdHkpIHsNCiAgdGhpcy5oID0gK2g7DQogIHRoaXMucyA9ICtzOw0KICB0aGlzLmwgPSArbDsNCiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7DQp9DQoNCmRlZmluZShIc2wsIGhzbCwgZXh0ZW5kKENvbG9yLCB7DQogIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7DQogICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspOw0KICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpOw0KICB9LA0KICBkYXJrZXI6IGZ1bmN0aW9uKGspIHsNCiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTsNCiAgICByZXR1cm4gbmV3IEhzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTsNCiAgfSwNCiAgcmdiOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgaCA9IHRoaXMuaCAlIDM2MCArICh0aGlzLmggPCAwKSAqIDM2MCwNCiAgICAgICAgcyA9IGlzTmFOKGgpIHx8IGlzTmFOKHRoaXMucykgPyAwIDogdGhpcy5zLA0KICAgICAgICBsID0gdGhpcy5sLA0KICAgICAgICBtMiA9IGwgKyAobCA8IDAuNSA/IGwgOiAxIC0gbCkgKiBzLA0KICAgICAgICBtMSA9IDIgKiBsIC0gbTI7DQogICAgcmV0dXJuIG5ldyBSZ2IoDQogICAgICBoc2wycmdiKGggPj0gMjQwID8gaCAtIDI0MCA6IGggKyAxMjAsIG0xLCBtMiksDQogICAgICBoc2wycmdiKGgsIG0xLCBtMiksDQogICAgICBoc2wycmdiKGggPCAxMjAgPyBoICsgMjQwIDogaCAtIDEyMCwgbTEsIG0yKSwNCiAgICAgIHRoaXMub3BhY2l0eQ0KICAgICk7DQogIH0sDQogIGRpc3BsYXlhYmxlOiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gKDAgPD0gdGhpcy5zICYmIHRoaXMucyA8PSAxIHx8IGlzTmFOKHRoaXMucykpDQogICAgICAgICYmICgwIDw9IHRoaXMubCAmJiB0aGlzLmwgPD0gMSkNCiAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTsNCiAgfQ0KfSkpOw0KDQovKiBGcm9tIEZ2RCAxMy4zNywgQ1NTIENvbG9yIE1vZHVsZSBMZXZlbCAzICovDQpmdW5jdGlvbiBoc2wycmdiKGgsIG0xLCBtMikgew0KICByZXR1cm4gKGggPCA2MCA/IG0xICsgKG0yIC0gbTEpICogaCAvIDYwDQogICAgICA6IGggPCAxODAgPyBtMg0KICAgICAgOiBoIDwgMjQwID8gbTEgKyAobTIgLSBtMSkgKiAoMjQwIC0gaCkgLyA2MA0KICAgICAgOiBtMSkgKiAyNTU7DQp9DQoNCnZhciBkZWcycmFkID0gTWF0aC5QSSAvIDE4MDsNCnZhciByYWQyZGVnID0gMTgwIC8gTWF0aC5QSTsNCg0KdmFyIEtuID0gMTg7DQp2YXIgWG4gPSAwLjk1MDQ3MDsNCnZhciBZbiA9IDE7DQp2YXIgWm4gPSAxLjA4ODgzMDsNCnZhciB0MCA9IDQgLyAyOTsNCnZhciB0MSA9IDYgLyAyOTsNCnZhciB0MiA9IDMgKiB0MSAqIHQxOw0KdmFyIHQzID0gdDEgKiB0MSAqIHQxOw0KDQpmdW5jdGlvbiBsYWJDb252ZXJ0KG8pIHsNCiAgaWYgKG8gaW5zdGFuY2VvZiBMYWIpIHJldHVybiBuZXcgTGFiKG8ubCwgby5hLCBvLmIsIG8ub3BhY2l0eSk7DQogIGlmIChvIGluc3RhbmNlb2YgSGNsKSB7DQogICAgdmFyIGggPSBvLmggKiBkZWcycmFkOw0KICAgIHJldHVybiBuZXcgTGFiKG8ubCwgTWF0aC5jb3MoaCkgKiBvLmMsIE1hdGguc2luKGgpICogby5jLCBvLm9wYWNpdHkpOw0KICB9DQogIGlmICghKG8gaW5zdGFuY2VvZiBSZ2IpKSBvID0gcmdiQ29udmVydChvKTsNCiAgdmFyIGIgPSByZ2IyeHl6KG8uciksDQogICAgICBhID0gcmdiMnh5eihvLmcpLA0KICAgICAgbCA9IHJnYjJ4eXooby5iKSwNCiAgICAgIHggPSB4eXoybGFiKCgwLjQxMjQ1NjQgKiBiICsgMC4zNTc1NzYxICogYSArIDAuMTgwNDM3NSAqIGwpIC8gWG4pLA0KICAgICAgeSA9IHh5ejJsYWIoKDAuMjEyNjcyOSAqIGIgKyAwLjcxNTE1MjIgKiBhICsgMC4wNzIxNzUwICogbCkgLyBZbiksDQogICAgICB6ID0geHl6MmxhYigoMC4wMTkzMzM5ICogYiArIDAuMTE5MTkyMCAqIGEgKyAwLjk1MDMwNDEgKiBsKSAvIFpuKTsNCiAgcmV0dXJuIG5ldyBMYWIoMTE2ICogeSAtIDE2LCA1MDAgKiAoeCAtIHkpLCAyMDAgKiAoeSAtIHopLCBvLm9wYWNpdHkpOw0KfQ0KDQpmdW5jdGlvbiBsYWIobCwgYSwgYiwgb3BhY2l0eSkgew0KICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGxhYkNvbnZlcnQobCkgOiBuZXcgTGFiKGwsIGEsIGIsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsNCn0NCg0KZnVuY3Rpb24gTGFiKGwsIGEsIGIsIG9wYWNpdHkpIHsNCiAgdGhpcy5sID0gK2w7DQogIHRoaXMuYSA9ICthOw0KICB0aGlzLmIgPSArYjsNCiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7DQp9DQoNCmRlZmluZShMYWIsIGxhYiwgZXh0ZW5kKENvbG9yLCB7DQogIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7DQogICAgcmV0dXJuIG5ldyBMYWIodGhpcy5sICsgS24gKiAoayA9PSBudWxsID8gMSA6IGspLCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5vcGFjaXR5KTsNCiAgfSwNCiAgZGFya2VyOiBmdW5jdGlvbihrKSB7DQogICAgcmV0dXJuIG5ldyBMYWIodGhpcy5sIC0gS24gKiAoayA9PSBudWxsID8gMSA6IGspLCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5vcGFjaXR5KTsNCiAgfSwNCiAgcmdiOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgeSA9ICh0aGlzLmwgKyAxNikgLyAxMTYsDQogICAgICAgIHggPSBpc05hTih0aGlzLmEpID8geSA6IHkgKyB0aGlzLmEgLyA1MDAsDQogICAgICAgIHogPSBpc05hTih0aGlzLmIpID8geSA6IHkgLSB0aGlzLmIgLyAyMDA7DQogICAgeSA9IFluICogbGFiMnh5eih5KTsNCiAgICB4ID0gWG4gKiBsYWIyeHl6KHgpOw0KICAgIHogPSBabiAqIGxhYjJ4eXooeik7DQogICAgcmV0dXJuIG5ldyBSZ2IoDQogICAgICB4eXoycmdiKCAzLjI0MDQ1NDIgKiB4IC0gMS41MzcxMzg1ICogeSAtIDAuNDk4NTMxNCAqIHopLCAvLyBENjUgLT4gc1JHQg0KICAgICAgeHl6MnJnYigtMC45NjkyNjYwICogeCArIDEuODc2MDEwOCAqIHkgKyAwLjA0MTU1NjAgKiB6KSwNCiAgICAgIHh5ejJyZ2IoIDAuMDU1NjQzNCAqIHggLSAwLjIwNDAyNTkgKiB5ICsgMS4wNTcyMjUyICogeiksDQogICAgICB0aGlzLm9wYWNpdHkNCiAgICApOw0KICB9DQp9KSk7DQoNCmZ1bmN0aW9uIHh5ejJsYWIodCkgew0KICByZXR1cm4gdCA+IHQzID8gTWF0aC5wb3codCwgMSAvIDMpIDogdCAvIHQyICsgdDA7DQp9DQoNCmZ1bmN0aW9uIGxhYjJ4eXoodCkgew0KICByZXR1cm4gdCA+IHQxID8gdCAqIHQgKiB0IDogdDIgKiAodCAtIHQwKTsNCn0NCg0KZnVuY3Rpb24geHl6MnJnYih4KSB7DQogIHJldHVybiAyNTUgKiAoeCA8PSAwLjAwMzEzMDggPyAxMi45MiAqIHggOiAxLjA1NSAqIE1hdGgucG93KHgsIDEgLyAyLjQpIC0gMC4wNTUpOw0KfQ0KDQpmdW5jdGlvbiByZ2IyeHl6KHgpIHsNCiAgcmV0dXJuICh4IC89IDI1NSkgPD0gMC4wNDA0NSA/IHggLyAxMi45MiA6IE1hdGgucG93KCh4ICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7DQp9DQoNCmZ1bmN0aW9uIGhjbENvbnZlcnQobykgew0KICBpZiAobyBpbnN0YW5jZW9mIEhjbCkgcmV0dXJuIG5ldyBIY2woby5oLCBvLmMsIG8ubCwgby5vcGFjaXR5KTsNCiAgaWYgKCEobyBpbnN0YW5jZW9mIExhYikpIG8gPSBsYWJDb252ZXJ0KG8pOw0KICB2YXIgaCA9IE1hdGguYXRhbjIoby5iLCBvLmEpICogcmFkMmRlZzsNCiAgcmV0dXJuIG5ldyBIY2woaCA8IDAgPyBoICsgMzYwIDogaCwgTWF0aC5zcXJ0KG8uYSAqIG8uYSArIG8uYiAqIG8uYiksIG8ubCwgby5vcGFjaXR5KTsNCn0NCg0KZnVuY3Rpb24gaGNsKGgsIGMsIGwsIG9wYWNpdHkpIHsNCiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBoY2xDb252ZXJ0KGgpIDogbmV3IEhjbChoLCBjLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7DQp9DQoNCmZ1bmN0aW9uIEhjbChoLCBjLCBsLCBvcGFjaXR5KSB7DQogIHRoaXMuaCA9ICtoOw0KICB0aGlzLmMgPSArYzsNCiAgdGhpcy5sID0gK2w7DQogIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5Ow0KfQ0KDQpkZWZpbmUoSGNsLCBoY2wsIGV4dGVuZChDb2xvciwgew0KICBicmlnaHRlcjogZnVuY3Rpb24oaykgew0KICAgIHJldHVybiBuZXcgSGNsKHRoaXMuaCwgdGhpcy5jLCB0aGlzLmwgKyBLbiAqIChrID09IG51bGwgPyAxIDogayksIHRoaXMub3BhY2l0eSk7DQogIH0sDQogIGRhcmtlcjogZnVuY3Rpb24oaykgew0KICAgIHJldHVybiBuZXcgSGNsKHRoaXMuaCwgdGhpcy5jLCB0aGlzLmwgLSBLbiAqIChrID09IG51bGwgPyAxIDogayksIHRoaXMub3BhY2l0eSk7DQogIH0sDQogIHJnYjogZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIGxhYkNvbnZlcnQodGhpcykucmdiKCk7DQogIH0NCn0pKTsNCg0KdmFyIEEgPSAtMC4xNDg2MTsNCnZhciBCID0gKzEuNzgyNzc7DQp2YXIgQyA9IC0wLjI5MjI3Ow0KdmFyIEQgPSAtMC45MDY0OTsNCnZhciBFID0gKzEuOTcyOTQ7DQp2YXIgRUQgPSBFICogRDsNCnZhciBFQiA9IEUgKiBCOw0KdmFyIEJDX0RBID0gQiAqIEMgLSBEICogQTsNCg0KZnVuY3Rpb24gY3ViZWhlbGl4Q29udmVydChvKSB7DQogIGlmIChvIGluc3RhbmNlb2YgQ3ViZWhlbGl4KSByZXR1cm4gbmV3IEN1YmVoZWxpeChvLmgsIG8ucywgby5sLCBvLm9wYWNpdHkpOw0KICBpZiAoIShvIGluc3RhbmNlb2YgUmdiKSkgbyA9IHJnYkNvbnZlcnQobyk7DQogIHZhciByID0gby5yIC8gMjU1LA0KICAgICAgZyA9IG8uZyAvIDI1NSwNCiAgICAgIGIgPSBvLmIgLyAyNTUsDQogICAgICBsID0gKEJDX0RBICogYiArIEVEICogciAtIEVCICogZykgLyAoQkNfREEgKyBFRCAtIEVCKSwNCiAgICAgIGJsID0gYiAtIGwsDQogICAgICBrID0gKEUgKiAoZyAtIGwpIC0gQyAqIGJsKSAvIEQsDQogICAgICBzID0gTWF0aC5zcXJ0KGsgKiBrICsgYmwgKiBibCkgLyAoRSAqIGwgKiAoMSAtIGwpKSwgLy8gTmFOIGlmIGw9MCBvciBsPTENCiAgICAgIGggPSBzID8gTWF0aC5hdGFuMihrLCBibCkgKiByYWQyZGVnIC0gMTIwIDogTmFOOw0KICByZXR1cm4gbmV3IEN1YmVoZWxpeChoIDwgMCA/IGggKyAzNjAgOiBoLCBzLCBsLCBvLm9wYWNpdHkpOw0KfQ0KDQpmdW5jdGlvbiBjdWJlaGVsaXgoaCwgcywgbCwgb3BhY2l0eSkgew0KICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGN1YmVoZWxpeENvbnZlcnQoaCkgOiBuZXcgQ3ViZWhlbGl4KGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsNCn0NCg0KZnVuY3Rpb24gQ3ViZWhlbGl4KGgsIHMsIGwsIG9wYWNpdHkpIHsNCiAgdGhpcy5oID0gK2g7DQogIHRoaXMucyA9ICtzOw0KICB0aGlzLmwgPSArbDsNCiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7DQp9DQoNCmRlZmluZShDdWJlaGVsaXgsIGN1YmVoZWxpeCwgZXh0ZW5kKENvbG9yLCB7DQogIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7DQogICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspOw0KICAgIHJldHVybiBuZXcgQ3ViZWhlbGl4KHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpOw0KICB9LA0KICBkYXJrZXI6IGZ1bmN0aW9uKGspIHsNCiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTsNCiAgICByZXR1cm4gbmV3IEN1YmVoZWxpeCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTsNCiAgfSwNCiAgcmdiOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgaCA9IGlzTmFOKHRoaXMuaCkgPyAwIDogKHRoaXMuaCArIDEyMCkgKiBkZWcycmFkLA0KICAgICAgICBsID0gK3RoaXMubCwNCiAgICAgICAgYSA9IGlzTmFOKHRoaXMucykgPyAwIDogdGhpcy5zICogbCAqICgxIC0gbCksDQogICAgICAgIGNvc2ggPSBNYXRoLmNvcyhoKSwNCiAgICAgICAgc2luaCA9IE1hdGguc2luKGgpOw0KICAgIHJldHVybiBuZXcgUmdiKA0KICAgICAgMjU1ICogKGwgKyBhICogKEEgKiBjb3NoICsgQiAqIHNpbmgpKSwNCiAgICAgIDI1NSAqIChsICsgYSAqIChDICogY29zaCArIEQgKiBzaW5oKSksDQogICAgICAyNTUgKiAobCArIGEgKiAoRSAqIGNvc2gpKSwNCiAgICAgIHRoaXMub3BhY2l0eQ0KICAgICk7DQogIH0NCn0pKTsNCg0KZXhwb3J0cy5jb2xvciA9IGNvbG9yOw0KZXhwb3J0cy5yZ2IgPSByZ2I7DQpleHBvcnRzLmhzbCA9IGhzbDsNCmV4cG9ydHMubGFiID0gbGFiOw0KZXhwb3J0cy5oY2wgPSBoY2w7DQpleHBvcnRzLmN1YmVoZWxpeCA9IGN1YmVoZWxpeDsNCg0KT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTsNCg0KfSkpKTsNCg0KfSx7fV0sNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7DQovLyBodHRwczovL2QzanMub3JnL2QzLWRpc3BhdGNoLyBWZXJzaW9uIDEuMC4zLiBDb3B5cmlnaHQgMjAxNyBNaWtlIEJvc3RvY2suDQooZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgew0KCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOg0KCXR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnXSwgZmFjdG9yeSkgOg0KCShmYWN0b3J5KChnbG9iYWwuZDMgPSBnbG9iYWwuZDMgfHwge30pKSk7DQp9KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7DQoNCnZhciBub29wID0ge3ZhbHVlOiBmdW5jdGlvbigpIHt9fTsNCg0KZnVuY3Rpb24gZGlzcGF0Y2goKSB7DQogIGZvciAodmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aCwgXyA9IHt9LCB0OyBpIDwgbjsgKytpKSB7DQogICAgaWYgKCEodCA9IGFyZ3VtZW50c1tpXSArICIiKSB8fCAodCBpbiBfKSkgdGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIHR5cGU6ICIgKyB0KTsNCiAgICBfW3RdID0gW107DQogIH0NCiAgcmV0dXJuIG5ldyBEaXNwYXRjaChfKTsNCn0NCg0KZnVuY3Rpb24gRGlzcGF0Y2goXykgew0KICB0aGlzLl8gPSBfOw0KfQ0KDQpmdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMsIHR5cGVzKSB7DQogIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcChmdW5jdGlvbih0KSB7DQogICAgdmFyIG5hbWUgPSAiIiwgaSA9IHQuaW5kZXhPZigiLiIpOw0KICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7DQogICAgaWYgKHQgJiYgIXR5cGVzLmhhc093blByb3BlcnR5KHQpKSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIiArIHQpOw0KICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07DQogIH0pOw0KfQ0KDQpEaXNwYXRjaC5wcm90b3R5cGUgPSBkaXNwYXRjaC5wcm90b3R5cGUgPSB7DQogIGNvbnN0cnVjdG9yOiBEaXNwYXRjaCwNCiAgb246IGZ1bmN0aW9uKHR5cGVuYW1lLCBjYWxsYmFjaykgew0KICAgIHZhciBfID0gdGhpcy5fLA0KICAgICAgICBUID0gcGFyc2VUeXBlbmFtZXModHlwZW5hbWUgKyAiIiwgXyksDQogICAgICAgIHQsDQogICAgICAgIGkgPSAtMSwNCiAgICAgICAgbiA9IFQubGVuZ3RoOw0KDQogICAgLy8gSWYgbm8gY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBjYWxsYmFjayBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS4NCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsNCiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSAmJiAodCA9IGdldChfW3RdLCB0eXBlbmFtZS5uYW1lKSkpIHJldHVybiB0Ow0KICAgICAgcmV0dXJuOw0KICAgIH0NCg0KICAgIC8vIElmIGEgdHlwZSB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGNhbGxiYWNrIGZvciB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS4NCiAgICAvLyBPdGhlcndpc2UsIGlmIGEgbnVsbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZW1vdmUgY2FsbGJhY2tzIG9mIHRoZSBnaXZlbiBuYW1lLg0KICAgIGlmIChjYWxsYmFjayAhPSBudWxsICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiICsgY2FsbGJhY2spOw0KICAgIHdoaWxlICgrK2kgPCBuKSB7DQogICAgICBpZiAodCA9ICh0eXBlbmFtZSA9IFRbaV0pLnR5cGUpIF9bdF0gPSBzZXQoX1t0XSwgdHlwZW5hbWUubmFtZSwgY2FsbGJhY2spOw0KICAgICAgZWxzZSBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgZm9yICh0IGluIF8pIF9bdF0gPSBzZXQoX1t0XSwgdHlwZW5hbWUubmFtZSwgbnVsbCk7DQogICAgfQ0KDQogICAgcmV0dXJuIHRoaXM7DQogIH0sDQogIGNvcHk6IGZ1bmN0aW9uKCkgew0KICAgIHZhciBjb3B5ID0ge30sIF8gPSB0aGlzLl87DQogICAgZm9yICh2YXIgdCBpbiBfKSBjb3B5W3RdID0gX1t0XS5zbGljZSgpOw0KICAgIHJldHVybiBuZXcgRGlzcGF0Y2goY29weSk7DQogIH0sDQogIGNhbGw6IGZ1bmN0aW9uKHR5cGUsIHRoYXQpIHsNCiAgICBpZiAoKG4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMikgPiAwKSBmb3IgKHZhciBhcmdzID0gbmV3IEFycmF5KG4pLCBpID0gMCwgbiwgdDsgaSA8IG47ICsraSkgYXJnc1tpXSA9IGFyZ3VtZW50c1tpICsgMl07DQogICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiICsgdHlwZSk7DQogICAgZm9yICh0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpOw0KICB9LA0KICBhcHBseTogZnVuY3Rpb24odHlwZSwgdGhhdCwgYXJncykgew0KICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIiArIHR5cGUpOw0KICAgIGZvciAodmFyIHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7DQogIH0NCn07DQoNCmZ1bmN0aW9uIGdldCh0eXBlLCBuYW1lKSB7DQogIGZvciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGgsIGM7IGkgPCBuOyArK2kpIHsNCiAgICBpZiAoKGMgPSB0eXBlW2ldKS5uYW1lID09PSBuYW1lKSB7DQogICAgICByZXR1cm4gYy52YWx1ZTsNCiAgICB9DQogIH0NCn0NCg0KZnVuY3Rpb24gc2V0KHR5cGUsIG5hbWUsIGNhbGxiYWNrKSB7DQogIGZvciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGg7IGkgPCBuOyArK2kpIHsNCiAgICBpZiAodHlwZVtpXS5uYW1lID09PSBuYW1lKSB7DQogICAgICB0eXBlW2ldID0gbm9vcCwgdHlwZSA9IHR5cGUuc2xpY2UoMCwgaSkuY29uY2F0KHR5cGUuc2xpY2UoaSArIDEpKTsNCiAgICAgIGJyZWFrOw0KICAgIH0NCiAgfQ0KICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgdHlwZS5wdXNoKHtuYW1lOiBuYW1lLCB2YWx1ZTogY2FsbGJhY2t9KTsNCiAgcmV0dXJuIHR5cGU7DQp9DQoNCmV4cG9ydHMuZGlzcGF0Y2ggPSBkaXNwYXRjaDsNCg0KT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTsNCg0KfSkpKTsNCg0KfSx7fV0sNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7DQovLyBodHRwczovL2QzanMub3JnL2QzLWVhc2UvIFZlcnNpb24gMS4wLjMuIENvcHlyaWdodCAyMDE3IE1pa2UgQm9zdG9jay4NCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7DQoJdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6DQoJdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6DQoJKGZhY3RvcnkoKGdsb2JhbC5kMyA9IGdsb2JhbC5kMyB8fCB7fSkpKTsNCn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JzsNCg0KZnVuY3Rpb24gbGluZWFyKHQpIHsNCiAgcmV0dXJuICt0Ow0KfQ0KDQpmdW5jdGlvbiBxdWFkSW4odCkgew0KICByZXR1cm4gdCAqIHQ7DQp9DQoNCmZ1bmN0aW9uIHF1YWRPdXQodCkgew0KICByZXR1cm4gdCAqICgyIC0gdCk7DQp9DQoNCmZ1bmN0aW9uIHF1YWRJbk91dCh0KSB7DQogIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IHQgKiB0IDogLS10ICogKDIgLSB0KSArIDEpIC8gMjsNCn0NCg0KZnVuY3Rpb24gY3ViaWNJbih0KSB7DQogIHJldHVybiB0ICogdCAqIHQ7DQp9DQoNCmZ1bmN0aW9uIGN1YmljT3V0KHQpIHsNCiAgcmV0dXJuIC0tdCAqIHQgKiB0ICsgMTsNCn0NCg0KZnVuY3Rpb24gY3ViaWNJbk91dCh0KSB7DQogIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IHQgKiB0ICogdCA6ICh0IC09IDIpICogdCAqIHQgKyAyKSAvIDI7DQp9DQoNCnZhciBleHBvbmVudCA9IDM7DQoNCnZhciBwb2x5SW4gPSAoZnVuY3Rpb24gY3VzdG9tKGUpIHsNCiAgZSA9ICtlOw0KDQogIGZ1bmN0aW9uIHBvbHlJbih0KSB7DQogICAgcmV0dXJuIE1hdGgucG93KHQsIGUpOw0KICB9DQoNCiAgcG9seUluLmV4cG9uZW50ID0gY3VzdG9tOw0KDQogIHJldHVybiBwb2x5SW47DQp9KShleHBvbmVudCk7DQoNCnZhciBwb2x5T3V0ID0gKGZ1bmN0aW9uIGN1c3RvbShlKSB7DQogIGUgPSArZTsNCg0KICBmdW5jdGlvbiBwb2x5T3V0KHQpIHsNCiAgICByZXR1cm4gMSAtIE1hdGgucG93KDEgLSB0LCBlKTsNCiAgfQ0KDQogIHBvbHlPdXQuZXhwb25lbnQgPSBjdXN0b207DQoNCiAgcmV0dXJuIHBvbHlPdXQ7DQp9KShleHBvbmVudCk7DQoNCnZhciBwb2x5SW5PdXQgPSAoZnVuY3Rpb24gY3VzdG9tKGUpIHsNCiAgZSA9ICtlOw0KDQogIGZ1bmN0aW9uIHBvbHlJbk91dCh0KSB7DQogICAgcmV0dXJuICgodCAqPSAyKSA8PSAxID8gTWF0aC5wb3codCwgZSkgOiAyIC0gTWF0aC5wb3coMiAtIHQsIGUpKSAvIDI7DQogIH0NCg0KICBwb2x5SW5PdXQuZXhwb25lbnQgPSBjdXN0b207DQoNCiAgcmV0dXJuIHBvbHlJbk91dDsNCn0pKGV4cG9uZW50KTsNCg0KdmFyIHBpID0gTWF0aC5QSTsNCnZhciBoYWxmUGkgPSBwaSAvIDI7DQoNCmZ1bmN0aW9uIHNpbkluKHQpIHsNCiAgcmV0dXJuIDEgLSBNYXRoLmNvcyh0ICogaGFsZlBpKTsNCn0NCg0KZnVuY3Rpb24gc2luT3V0KHQpIHsNCiAgcmV0dXJuIE1hdGguc2luKHQgKiBoYWxmUGkpOw0KfQ0KDQpmdW5jdGlvbiBzaW5Jbk91dCh0KSB7DQogIHJldHVybiAoMSAtIE1hdGguY29zKHBpICogdCkpIC8gMjsNCn0NCg0KZnVuY3Rpb24gZXhwSW4odCkgew0KICByZXR1cm4gTWF0aC5wb3coMiwgMTAgKiB0IC0gMTApOw0KfQ0KDQpmdW5jdGlvbiBleHBPdXQodCkgew0KICByZXR1cm4gMSAtIE1hdGgucG93KDIsIC0xMCAqIHQpOw0KfQ0KDQpmdW5jdGlvbiBleHBJbk91dCh0KSB7DQogIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IE1hdGgucG93KDIsIDEwICogdCAtIDEwKSA6IDIgLSBNYXRoLnBvdygyLCAxMCAtIDEwICogdCkpIC8gMjsNCn0NCg0KZnVuY3Rpb24gY2lyY2xlSW4odCkgew0KICByZXR1cm4gMSAtIE1hdGguc3FydCgxIC0gdCAqIHQpOw0KfQ0KDQpmdW5jdGlvbiBjaXJjbGVPdXQodCkgew0KICByZXR1cm4gTWF0aC5zcXJ0KDEgLSAtLXQgKiB0KTsNCn0NCg0KZnVuY3Rpb24gY2lyY2xlSW5PdXQodCkgew0KICByZXR1cm4gKCh0ICo9IDIpIDw9IDEgPyAxIC0gTWF0aC5zcXJ0KDEgLSB0ICogdCkgOiBNYXRoLnNxcnQoMSAtICh0IC09IDIpICogdCkgKyAxKSAvIDI7DQp9DQoNCnZhciBiMSA9IDQgLyAxMTsNCnZhciBiMiA9IDYgLyAxMTsNCnZhciBiMyA9IDggLyAxMTsNCnZhciBiNCA9IDMgLyA0Ow0KdmFyIGI1ID0gOSAvIDExOw0KdmFyIGI2ID0gMTAgLyAxMTsNCnZhciBiNyA9IDE1IC8gMTY7DQp2YXIgYjggPSAyMSAvIDIyOw0KdmFyIGI5ID0gNjMgLyA2NDsNCnZhciBiMCA9IDEgLyBiMSAvIGIxOw0KDQpmdW5jdGlvbiBib3VuY2VJbih0KSB7DQogIHJldHVybiAxIC0gYm91bmNlT3V0KDEgLSB0KTsNCn0NCg0KZnVuY3Rpb24gYm91bmNlT3V0KHQpIHsNCiAgcmV0dXJuICh0ID0gK3QpIDwgYjEgPyBiMCAqIHQgKiB0IDogdCA8IGIzID8gYjAgKiAodCAtPSBiMikgKiB0ICsgYjQgOiB0IDwgYjYgPyBiMCAqICh0IC09IGI1KSAqIHQgKyBiNyA6IGIwICogKHQgLT0gYjgpICogdCArIGI5Ow0KfQ0KDQpmdW5jdGlvbiBib3VuY2VJbk91dCh0KSB7DQogIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IDEgLSBib3VuY2VPdXQoMSAtIHQpIDogYm91bmNlT3V0KHQgLSAxKSArIDEpIC8gMjsNCn0NCg0KdmFyIG92ZXJzaG9vdCA9IDEuNzAxNTg7DQoNCnZhciBiYWNrSW4gPSAoZnVuY3Rpb24gY3VzdG9tKHMpIHsNCiAgcyA9ICtzOw0KDQogIGZ1bmN0aW9uIGJhY2tJbih0KSB7DQogICAgcmV0dXJuIHQgKiB0ICogKChzICsgMSkgKiB0IC0gcyk7DQogIH0NCg0KICBiYWNrSW4ub3ZlcnNob290ID0gY3VzdG9tOw0KDQogIHJldHVybiBiYWNrSW47DQp9KShvdmVyc2hvb3QpOw0KDQp2YXIgYmFja091dCA9IChmdW5jdGlvbiBjdXN0b20ocykgew0KICBzID0gK3M7DQoNCiAgZnVuY3Rpb24gYmFja091dCh0KSB7DQogICAgcmV0dXJuIC0tdCAqIHQgKiAoKHMgKyAxKSAqIHQgKyBzKSArIDE7DQogIH0NCg0KICBiYWNrT3V0Lm92ZXJzaG9vdCA9IGN1c3RvbTsNCg0KICByZXR1cm4gYmFja091dDsNCn0pKG92ZXJzaG9vdCk7DQoNCnZhciBiYWNrSW5PdXQgPSAoZnVuY3Rpb24gY3VzdG9tKHMpIHsNCiAgcyA9ICtzOw0KDQogIGZ1bmN0aW9uIGJhY2tJbk91dCh0KSB7DQogICAgcmV0dXJuICgodCAqPSAyKSA8IDEgPyB0ICogdCAqICgocyArIDEpICogdCAtIHMpIDogKHQgLT0gMikgKiB0ICogKChzICsgMSkgKiB0ICsgcykgKyAyKSAvIDI7DQogIH0NCg0KICBiYWNrSW5PdXQub3ZlcnNob290ID0gY3VzdG9tOw0KDQogIHJldHVybiBiYWNrSW5PdXQ7DQp9KShvdmVyc2hvb3QpOw0KDQp2YXIgdGF1ID0gMiAqIE1hdGguUEk7DQp2YXIgYW1wbGl0dWRlID0gMTsNCnZhciBwZXJpb2QgPSAwLjM7DQoNCnZhciBlbGFzdGljSW4gPSAoZnVuY3Rpb24gY3VzdG9tKGEsIHApIHsNCiAgdmFyIHMgPSBNYXRoLmFzaW4oMSAvIChhID0gTWF0aC5tYXgoMSwgYSkpKSAqIChwIC89IHRhdSk7DQoNCiAgZnVuY3Rpb24gZWxhc3RpY0luKHQpIHsNCiAgICByZXR1cm4gYSAqIE1hdGgucG93KDIsIDEwICogLS10KSAqIE1hdGguc2luKChzIC0gdCkgLyBwKTsNCiAgfQ0KDQogIGVsYXN0aWNJbi5hbXBsaXR1ZGUgPSBmdW5jdGlvbihhKSB7IHJldHVybiBjdXN0b20oYSwgcCAqIHRhdSk7IH07DQogIGVsYXN0aWNJbi5wZXJpb2QgPSBmdW5jdGlvbihwKSB7IHJldHVybiBjdXN0b20oYSwgcCk7IH07DQoNCiAgcmV0dXJuIGVsYXN0aWNJbjsNCn0pKGFtcGxpdHVkZSwgcGVyaW9kKTsNCg0KdmFyIGVsYXN0aWNPdXQgPSAoZnVuY3Rpb24gY3VzdG9tKGEsIHApIHsNCiAgdmFyIHMgPSBNYXRoLmFzaW4oMSAvIChhID0gTWF0aC5tYXgoMSwgYSkpKSAqIChwIC89IHRhdSk7DQoNCiAgZnVuY3Rpb24gZWxhc3RpY091dCh0KSB7DQogICAgcmV0dXJuIDEgLSBhICogTWF0aC5wb3coMiwgLTEwICogKHQgPSArdCkpICogTWF0aC5zaW4oKHQgKyBzKSAvIHApOw0KICB9DQoNCiAgZWxhc3RpY091dC5hbXBsaXR1ZGUgPSBmdW5jdGlvbihhKSB7IHJldHVybiBjdXN0b20oYSwgcCAqIHRhdSk7IH07DQogIGVsYXN0aWNPdXQucGVyaW9kID0gZnVuY3Rpb24ocCkgeyByZXR1cm4gY3VzdG9tKGEsIHApOyB9Ow0KDQogIHJldHVybiBlbGFzdGljT3V0Ow0KfSkoYW1wbGl0dWRlLCBwZXJpb2QpOw0KDQp2YXIgZWxhc3RpY0luT3V0ID0gKGZ1bmN0aW9uIGN1c3RvbShhLCBwKSB7DQogIHZhciBzID0gTWF0aC5hc2luKDEgLyAoYSA9IE1hdGgubWF4KDEsIGEpKSkgKiAocCAvPSB0YXUpOw0KDQogIGZ1bmN0aW9uIGVsYXN0aWNJbk91dCh0KSB7DQogICAgcmV0dXJuICgodCA9IHQgKiAyIC0gMSkgPCAwDQogICAgICAgID8gYSAqIE1hdGgucG93KDIsIDEwICogdCkgKiBNYXRoLnNpbigocyAtIHQpIC8gcCkNCiAgICAgICAgOiAyIC0gYSAqIE1hdGgucG93KDIsIC0xMCAqIHQpICogTWF0aC5zaW4oKHMgKyB0KSAvIHApKSAvIDI7DQogIH0NCg0KICBlbGFzdGljSW5PdXQuYW1wbGl0dWRlID0gZnVuY3Rpb24oYSkgeyByZXR1cm4gY3VzdG9tKGEsIHAgKiB0YXUpOyB9Ow0KICBlbGFzdGljSW5PdXQucGVyaW9kID0gZnVuY3Rpb24ocCkgeyByZXR1cm4gY3VzdG9tKGEsIHApOyB9Ow0KDQogIHJldHVybiBlbGFzdGljSW5PdXQ7DQp9KShhbXBsaXR1ZGUsIHBlcmlvZCk7DQoNCmV4cG9ydHMuZWFzZUxpbmVhciA9IGxpbmVhcjsNCmV4cG9ydHMuZWFzZVF1YWQgPSBxdWFkSW5PdXQ7DQpleHBvcnRzLmVhc2VRdWFkSW4gPSBxdWFkSW47DQpleHBvcnRzLmVhc2VRdWFkT3V0ID0gcXVhZE91dDsNCmV4cG9ydHMuZWFzZVF1YWRJbk91dCA9IHF1YWRJbk91dDsNCmV4cG9ydHMuZWFzZUN1YmljID0gY3ViaWNJbk91dDsNCmV4cG9ydHMuZWFzZUN1YmljSW4gPSBjdWJpY0luOw0KZXhwb3J0cy5lYXNlQ3ViaWNPdXQgPSBjdWJpY091dDsNCmV4cG9ydHMuZWFzZUN1YmljSW5PdXQgPSBjdWJpY0luT3V0Ow0KZXhwb3J0cy5lYXNlUG9seSA9IHBvbHlJbk91dDsNCmV4cG9ydHMuZWFzZVBvbHlJbiA9IHBvbHlJbjsNCmV4cG9ydHMuZWFzZVBvbHlPdXQgPSBwb2x5T3V0Ow0KZXhwb3J0cy5lYXNlUG9seUluT3V0ID0gcG9seUluT3V0Ow0KZXhwb3J0cy5lYXNlU2luID0gc2luSW5PdXQ7DQpleHBvcnRzLmVhc2VTaW5JbiA9IHNpbkluOw0KZXhwb3J0cy5lYXNlU2luT3V0ID0gc2luT3V0Ow0KZXhwb3J0cy5lYXNlU2luSW5PdXQgPSBzaW5Jbk91dDsNCmV4cG9ydHMuZWFzZUV4cCA9IGV4cEluT3V0Ow0KZXhwb3J0cy5lYXNlRXhwSW4gPSBleHBJbjsNCmV4cG9ydHMuZWFzZUV4cE91dCA9IGV4cE91dDsNCmV4cG9ydHMuZWFzZUV4cEluT3V0ID0gZXhwSW5PdXQ7DQpleHBvcnRzLmVhc2VDaXJjbGUgPSBjaXJjbGVJbk91dDsNCmV4cG9ydHMuZWFzZUNpcmNsZUluID0gY2lyY2xlSW47DQpleHBvcnRzLmVhc2VDaXJjbGVPdXQgPSBjaXJjbGVPdXQ7DQpleHBvcnRzLmVhc2VDaXJjbGVJbk91dCA9IGNpcmNsZUluT3V0Ow0KZXhwb3J0cy5lYXNlQm91bmNlID0gYm91bmNlT3V0Ow0KZXhwb3J0cy5lYXNlQm91bmNlSW4gPSBib3VuY2VJbjsNCmV4cG9ydHMuZWFzZUJvdW5jZU91dCA9IGJvdW5jZU91dDsNCmV4cG9ydHMuZWFzZUJvdW5jZUluT3V0ID0gYm91bmNlSW5PdXQ7DQpleHBvcnRzLmVhc2VCYWNrID0gYmFja0luT3V0Ow0KZXhwb3J0cy5lYXNlQmFja0luID0gYmFja0luOw0KZXhwb3J0cy5lYXNlQmFja091dCA9IGJhY2tPdXQ7DQpleHBvcnRzLmVhc2VCYWNrSW5PdXQgPSBiYWNrSW5PdXQ7DQpleHBvcnRzLmVhc2VFbGFzdGljID0gZWxhc3RpY091dDsNCmV4cG9ydHMuZWFzZUVsYXN0aWNJbiA9IGVsYXN0aWNJbjsNCmV4cG9ydHMuZWFzZUVsYXN0aWNPdXQgPSBlbGFzdGljT3V0Ow0KZXhwb3J0cy5lYXNlRWxhc3RpY0luT3V0ID0gZWxhc3RpY0luT3V0Ow0KDQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOw0KDQp9KSkpOw0KDQp9LHt9XSw3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsNCi8vIGh0dHBzOi8vZDNqcy5vcmcvZDMtZm9ybWF0LyBWZXJzaW9uIDEuMi4wLiBDb3B5cmlnaHQgMjAxNyBNaWtlIEJvc3RvY2suDQooZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgew0KCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOg0KCXR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnXSwgZmFjdG9yeSkgOg0KCShmYWN0b3J5KChnbG9iYWwuZDMgPSBnbG9iYWwuZDMgfHwge30pKSk7DQp9KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7DQoNCi8vIENvbXB1dGVzIHRoZSBkZWNpbWFsIGNvZWZmaWNpZW50IGFuZCBleHBvbmVudCBvZiB0aGUgc3BlY2lmaWVkIG51bWJlciB4IHdpdGgNCi8vIHNpZ25pZmljYW50IGRpZ2l0cyBwLCB3aGVyZSB4IGlzIHBvc2l0aXZlIGFuZCBwIGlzIGluIFsxLCAyMV0gb3IgdW5kZWZpbmVkLg0KLy8gRm9yIGV4YW1wbGUsIGZvcm1hdERlY2ltYWwoMS4yMykgcmV0dXJucyBbIjEyMyIsIDBdLg0KdmFyIGZvcm1hdERlY2ltYWwgPSBmdW5jdGlvbih4LCBwKSB7DQogIGlmICgoaSA9ICh4ID0gcCA/IHgudG9FeHBvbmVudGlhbChwIC0gMSkgOiB4LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZigiZSIpKSA8IDApIHJldHVybiBudWxsOyAvLyBOYU4sIMKxSW5maW5pdHkNCiAgdmFyIGksIGNvZWZmaWNpZW50ID0geC5zbGljZSgwLCBpKTsNCg0KICAvLyBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRvRXhwb25lbnRpYWwgZWl0aGVyIGhhcyB0aGUgZm9ybSBcZFwuXGQrZVstK11cZCsNCiAgLy8gKGUuZy4sIDEuMmUrMykgb3IgdGhlIGZvcm0gXGRlWy0rXVxkKyAoZS5nLiwgMWUrMykuDQogIHJldHVybiBbDQogICAgY29lZmZpY2llbnQubGVuZ3RoID4gMSA/IGNvZWZmaWNpZW50WzBdICsgY29lZmZpY2llbnQuc2xpY2UoMikgOiBjb2VmZmljaWVudCwNCiAgICAreC5zbGljZShpICsgMSkNCiAgXTsNCn07DQoNCnZhciBleHBvbmVudCA9IGZ1bmN0aW9uKHgpIHsNCiAgcmV0dXJuIHggPSBmb3JtYXREZWNpbWFsKE1hdGguYWJzKHgpKSwgeCA/IHhbMV0gOiBOYU47DQp9Ow0KDQp2YXIgZm9ybWF0R3JvdXAgPSBmdW5jdGlvbihncm91cGluZywgdGhvdXNhbmRzKSB7DQogIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgd2lkdGgpIHsNCiAgICB2YXIgaSA9IHZhbHVlLmxlbmd0aCwNCiAgICAgICAgdCA9IFtdLA0KICAgICAgICBqID0gMCwNCiAgICAgICAgZyA9IGdyb3VwaW5nWzBdLA0KICAgICAgICBsZW5ndGggPSAwOw0KDQogICAgd2hpbGUgKGkgPiAwICYmIGcgPiAwKSB7DQogICAgICBpZiAobGVuZ3RoICsgZyArIDEgPiB3aWR0aCkgZyA9IE1hdGgubWF4KDEsIHdpZHRoIC0gbGVuZ3RoKTsNCiAgICAgIHQucHVzaCh2YWx1ZS5zdWJzdHJpbmcoaSAtPSBnLCBpICsgZykpOw0KICAgICAgaWYgKChsZW5ndGggKz0gZyArIDEpID4gd2lkdGgpIGJyZWFrOw0KICAgICAgZyA9IGdyb3VwaW5nW2ogPSAoaiArIDEpICUgZ3JvdXBpbmcubGVuZ3RoXTsNCiAgICB9DQoNCiAgICByZXR1cm4gdC5yZXZlcnNlKCkuam9pbih0aG91c2FuZHMpOw0KICB9Ow0KfTsNCg0KdmFyIGZvcm1hdE51bWVyYWxzID0gZnVuY3Rpb24obnVtZXJhbHMpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1swLTldL2csIGZ1bmN0aW9uKGkpIHsNCiAgICAgIHJldHVybiBudW1lcmFsc1sraV07DQogICAgfSk7DQogIH07DQp9Ow0KDQp2YXIgZm9ybWF0RGVmYXVsdCA9IGZ1bmN0aW9uKHgsIHApIHsNCiAgeCA9IHgudG9QcmVjaXNpb24ocCk7DQoNCiAgb3V0OiBmb3IgKHZhciBuID0geC5sZW5ndGgsIGkgPSAxLCBpMCA9IC0xLCBpMTsgaSA8IG47ICsraSkgew0KICAgIHN3aXRjaCAoeFtpXSkgew0KICAgICAgY2FzZSAiLiI6IGkwID0gaTEgPSBpOyBicmVhazsNCiAgICAgIGNhc2UgIjAiOiBpZiAoaTAgPT09IDApIGkwID0gaTsgaTEgPSBpOyBicmVhazsNCiAgICAgIGNhc2UgImUiOiBicmVhayBvdXQ7DQogICAgICBkZWZhdWx0OiBpZiAoaTAgPiAwKSBpMCA9IDA7IGJyZWFrOw0KICAgIH0NCiAgfQ0KDQogIHJldHVybiBpMCA+IDAgPyB4LnNsaWNlKDAsIGkwKSArIHguc2xpY2UoaTEgKyAxKSA6IHg7DQp9Ow0KDQp2YXIgcHJlZml4RXhwb25lbnQ7DQoNCnZhciBmb3JtYXRQcmVmaXhBdXRvID0gZnVuY3Rpb24oeCwgcCkgew0KICB2YXIgZCA9IGZvcm1hdERlY2ltYWwoeCwgcCk7DQogIGlmICghZCkgcmV0dXJuIHggKyAiIjsNCiAgdmFyIGNvZWZmaWNpZW50ID0gZFswXSwNCiAgICAgIGV4cG9uZW50ID0gZFsxXSwNCiAgICAgIGkgPSBleHBvbmVudCAtIChwcmVmaXhFeHBvbmVudCA9IE1hdGgubWF4KC04LCBNYXRoLm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50IC8gMykpKSAqIDMpICsgMSwNCiAgICAgIG4gPSBjb2VmZmljaWVudC5sZW5ndGg7DQogIHJldHVybiBpID09PSBuID8gY29lZmZpY2llbnQNCiAgICAgIDogaSA+IG4gPyBjb2VmZmljaWVudCArIG5ldyBBcnJheShpIC0gbiArIDEpLmpvaW4oIjAiKQ0KICAgICAgOiBpID4gMCA/IGNvZWZmaWNpZW50LnNsaWNlKDAsIGkpICsgIi4iICsgY29lZmZpY2llbnQuc2xpY2UoaSkNCiAgICAgIDogIjAuIiArIG5ldyBBcnJheSgxIC0gaSkuam9pbigiMCIpICsgZm9ybWF0RGVjaW1hbCh4LCBNYXRoLm1heCgwLCBwICsgaSAtIDEpKVswXTsgLy8gbGVzcyB0aGFuIDF5IQ0KfTsNCg0KdmFyIGZvcm1hdFJvdW5kZWQgPSBmdW5jdGlvbih4LCBwKSB7DQogIHZhciBkID0gZm9ybWF0RGVjaW1hbCh4LCBwKTsNCiAgaWYgKCFkKSByZXR1cm4geCArICIiOw0KICB2YXIgY29lZmZpY2llbnQgPSBkWzBdLA0KICAgICAgZXhwb25lbnQgPSBkWzFdOw0KICByZXR1cm4gZXhwb25lbnQgPCAwID8gIjAuIiArIG5ldyBBcnJheSgtZXhwb25lbnQpLmpvaW4oIjAiKSArIGNvZWZmaWNpZW50DQogICAgICA6IGNvZWZmaWNpZW50Lmxlbmd0aCA+IGV4cG9uZW50ICsgMSA/IGNvZWZmaWNpZW50LnNsaWNlKDAsIGV4cG9uZW50ICsgMSkgKyAiLiIgKyBjb2VmZmljaWVudC5zbGljZShleHBvbmVudCArIDEpDQogICAgICA6IGNvZWZmaWNpZW50ICsgbmV3IEFycmF5KGV4cG9uZW50IC0gY29lZmZpY2llbnQubGVuZ3RoICsgMikuam9pbigiMCIpOw0KfTsNCg0KdmFyIGZvcm1hdFR5cGVzID0gew0KICAiIjogZm9ybWF0RGVmYXVsdCwNCiAgIiUiOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiAoeCAqIDEwMCkudG9GaXhlZChwKTsgfSwNCiAgImIiOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDIpOyB9LA0KICAiYyI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHggKyAiIjsgfSwNCiAgImQiOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDEwKTsgfSwNCiAgImUiOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiB4LnRvRXhwb25lbnRpYWwocCk7IH0sDQogICJmIjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4geC50b0ZpeGVkKHApOyB9LA0KICAiZyI6IGZ1bmN0aW9uKHgsIHApIHsgcmV0dXJuIHgudG9QcmVjaXNpb24ocCk7IH0sDQogICJvIjogZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5yb3VuZCh4KS50b1N0cmluZyg4KTsgfSwNCiAgInAiOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiBmb3JtYXRSb3VuZGVkKHggKiAxMDAsIHApOyB9LA0KICAiciI6IGZvcm1hdFJvdW5kZWQsDQogICJzIjogZm9ybWF0UHJlZml4QXV0bywNCiAgIlgiOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpOyB9LA0KICAieCI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgucm91bmQoeCkudG9TdHJpbmcoMTYpOyB9DQp9Ow0KDQovLyBbW2ZpbGxdYWxpZ25dW3NpZ25dW3N5bWJvbF1bMF1bd2lkdGhdWyxdWy5wcmVjaXNpb25dW3R5cGVdDQp2YXIgcmUgPSAvXig/OiguKT8oWzw+PV5dKSk/KFsrXC1cKCBdKT8oWyQjXSk/KDApPyhcZCspPygsKT8oXC5cZCspPyhbYS16JV0pPyQvaTsNCg0KZnVuY3Rpb24gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllcikgew0KICByZXR1cm4gbmV3IEZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpOw0KfQ0KDQpmb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlID0gRm9ybWF0U3BlY2lmaWVyLnByb3RvdHlwZTsgLy8gaW5zdGFuY2VvZg0KDQpmdW5jdGlvbiBGb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSB7DQogIGlmICghKG1hdGNoID0gcmUuZXhlYyhzcGVjaWZpZXIpKSkgdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdDogIiArIHNwZWNpZmllcik7DQoNCiAgdmFyIG1hdGNoLA0KICAgICAgZmlsbCA9IG1hdGNoWzFdIHx8ICIgIiwNCiAgICAgIGFsaWduID0gbWF0Y2hbMl0gfHwgIj4iLA0KICAgICAgc2lnbiA9IG1hdGNoWzNdIHx8ICItIiwNCiAgICAgIHN5bWJvbCA9IG1hdGNoWzRdIHx8ICIiLA0KICAgICAgemVybyA9ICEhbWF0Y2hbNV0sDQogICAgICB3aWR0aCA9IG1hdGNoWzZdICYmICttYXRjaFs2XSwNCiAgICAgIGNvbW1hID0gISFtYXRjaFs3XSwNCiAgICAgIHByZWNpc2lvbiA9IG1hdGNoWzhdICYmICttYXRjaFs4XS5zbGljZSgxKSwNCiAgICAgIHR5cGUgPSBtYXRjaFs5XSB8fCAiIjsNCg0KICAvLyBUaGUgIm4iIHR5cGUgaXMgYW4gYWxpYXMgZm9yICIsZyIuDQogIGlmICh0eXBlID09PSAibiIpIGNvbW1hID0gdHJ1ZSwgdHlwZSA9ICJnIjsNCg0KICAvLyBNYXAgaW52YWxpZCB0eXBlcyB0byB0aGUgZGVmYXVsdCBmb3JtYXQuDQogIGVsc2UgaWYgKCFmb3JtYXRUeXBlc1t0eXBlXSkgdHlwZSA9ICIiOw0KDQogIC8vIElmIHplcm8gZmlsbCBpcyBzcGVjaWZpZWQsIHBhZGRpbmcgZ29lcyBhZnRlciBzaWduIGFuZCBiZWZvcmUgZGlnaXRzLg0KICBpZiAoemVybyB8fCAoZmlsbCA9PT0gIjAiICYmIGFsaWduID09PSAiPSIpKSB6ZXJvID0gdHJ1ZSwgZmlsbCA9ICIwIiwgYWxpZ24gPSAiPSI7DQoNCiAgdGhpcy5maWxsID0gZmlsbDsNCiAgdGhpcy5hbGlnbiA9IGFsaWduOw0KICB0aGlzLnNpZ24gPSBzaWduOw0KICB0aGlzLnN5bWJvbCA9IHN5bWJvbDsNCiAgdGhpcy56ZXJvID0gemVybzsNCiAgdGhpcy53aWR0aCA9IHdpZHRoOw0KICB0aGlzLmNvbW1hID0gY29tbWE7DQogIHRoaXMucHJlY2lzaW9uID0gcHJlY2lzaW9uOw0KICB0aGlzLnR5cGUgPSB0eXBlOw0KfQ0KDQpGb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiB0aGlzLmZpbGwNCiAgICAgICsgdGhpcy5hbGlnbg0KICAgICAgKyB0aGlzLnNpZ24NCiAgICAgICsgdGhpcy5zeW1ib2wNCiAgICAgICsgKHRoaXMuemVybyA/ICIwIiA6ICIiKQ0KICAgICAgKyAodGhpcy53aWR0aCA9PSBudWxsID8gIiIgOiBNYXRoLm1heCgxLCB0aGlzLndpZHRoIHwgMCkpDQogICAgICArICh0aGlzLmNvbW1hID8gIiwiIDogIiIpDQogICAgICArICh0aGlzLnByZWNpc2lvbiA9PSBudWxsID8gIiIgOiAiLiIgKyBNYXRoLm1heCgwLCB0aGlzLnByZWNpc2lvbiB8IDApKQ0KICAgICAgKyB0aGlzLnR5cGU7DQp9Ow0KDQp2YXIgaWRlbnRpdHkgPSBmdW5jdGlvbih4KSB7DQogIHJldHVybiB4Ow0KfTsNCg0KdmFyIHByZWZpeGVzID0gWyJ5IiwieiIsImEiLCJmIiwicCIsIm4iLCLCtSIsIm0iLCIiLCJrIiwiTSIsIkciLCJUIiwiUCIsIkUiLCJaIiwiWSJdOw0KDQp2YXIgZm9ybWF0TG9jYWxlID0gZnVuY3Rpb24obG9jYWxlKSB7DQogIHZhciBncm91cCA9IGxvY2FsZS5ncm91cGluZyAmJiBsb2NhbGUudGhvdXNhbmRzID8gZm9ybWF0R3JvdXAobG9jYWxlLmdyb3VwaW5nLCBsb2NhbGUudGhvdXNhbmRzKSA6IGlkZW50aXR5LA0KICAgICAgY3VycmVuY3kgPSBsb2NhbGUuY3VycmVuY3ksDQogICAgICBkZWNpbWFsID0gbG9jYWxlLmRlY2ltYWwsDQogICAgICBudW1lcmFscyA9IGxvY2FsZS5udW1lcmFscyA/IGZvcm1hdE51bWVyYWxzKGxvY2FsZS5udW1lcmFscykgOiBpZGVudGl0eSwNCiAgICAgIHBlcmNlbnQgPSBsb2NhbGUucGVyY2VudCB8fCAiJSI7DQoNCiAgZnVuY3Rpb24gbmV3Rm9ybWF0KHNwZWNpZmllcikgew0KICAgIHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpOw0KDQogICAgdmFyIGZpbGwgPSBzcGVjaWZpZXIuZmlsbCwNCiAgICAgICAgYWxpZ24gPSBzcGVjaWZpZXIuYWxpZ24sDQogICAgICAgIHNpZ24gPSBzcGVjaWZpZXIuc2lnbiwNCiAgICAgICAgc3ltYm9sID0gc3BlY2lmaWVyLnN5bWJvbCwNCiAgICAgICAgemVybyA9IHNwZWNpZmllci56ZXJvLA0KICAgICAgICB3aWR0aCA9IHNwZWNpZmllci53aWR0aCwNCiAgICAgICAgY29tbWEgPSBzcGVjaWZpZXIuY29tbWEsDQogICAgICAgIHByZWNpc2lvbiA9IHNwZWNpZmllci5wcmVjaXNpb24sDQogICAgICAgIHR5cGUgPSBzcGVjaWZpZXIudHlwZTsNCg0KICAgIC8vIENvbXB1dGUgdGhlIHByZWZpeCBhbmQgc3VmZml4Lg0KICAgIC8vIEZvciBTSS1wcmVmaXgsIHRoZSBzdWZmaXggaXMgbGF6aWx5IGNvbXB1dGVkLg0KICAgIHZhciBwcmVmaXggPSBzeW1ib2wgPT09ICIkIiA/IGN1cnJlbmN5WzBdIDogc3ltYm9sID09PSAiIyIgJiYgL1tib3hYXS8udGVzdCh0eXBlKSA/ICIwIiArIHR5cGUudG9Mb3dlckNhc2UoKSA6ICIiLA0KICAgICAgICBzdWZmaXggPSBzeW1ib2wgPT09ICIkIiA/IGN1cnJlbmN5WzFdIDogL1slcF0vLnRlc3QodHlwZSkgPyBwZXJjZW50IDogIiI7DQoNCiAgICAvLyBXaGF0IGZvcm1hdCBmdW5jdGlvbiBzaG91bGQgd2UgdXNlPw0KICAgIC8vIElzIHRoaXMgYW4gaW50ZWdlciB0eXBlPw0KICAgIC8vIENhbiB0aGlzIHR5cGUgZ2VuZXJhdGUgZXhwb25lbnRpYWwgbm90YXRpb24/DQogICAgdmFyIGZvcm1hdFR5cGUgPSBmb3JtYXRUeXBlc1t0eXBlXSwNCiAgICAgICAgbWF5YmVTdWZmaXggPSAhdHlwZSB8fCAvW2RlZmdwcnMlXS8udGVzdCh0eXBlKTsNCg0KICAgIC8vIFNldCB0aGUgZGVmYXVsdCBwcmVjaXNpb24gaWYgbm90IHNwZWNpZmllZCwNCiAgICAvLyBvciBjbGFtcCB0aGUgc3BlY2lmaWVkIHByZWNpc2lvbiB0byB0aGUgc3VwcG9ydGVkIHJhbmdlLg0KICAgIC8vIEZvciBzaWduaWZpY2FudCBwcmVjaXNpb24sIGl0IG11c3QgYmUgaW4gWzEsIDIxXS4NCiAgICAvLyBGb3IgZml4ZWQgcHJlY2lzaW9uLCBpdCBtdXN0IGJlIGluIFswLCAyMF0uDQogICAgcHJlY2lzaW9uID0gcHJlY2lzaW9uID09IG51bGwgPyAodHlwZSA/IDYgOiAxMikNCiAgICAgICAgOiAvW2dwcnNdLy50ZXN0KHR5cGUpID8gTWF0aC5tYXgoMSwgTWF0aC5taW4oMjEsIHByZWNpc2lvbikpDQogICAgICAgIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMjAsIHByZWNpc2lvbikpOw0KDQogICAgZnVuY3Rpb24gZm9ybWF0KHZhbHVlKSB7DQogICAgICB2YXIgdmFsdWVQcmVmaXggPSBwcmVmaXgsDQogICAgICAgICAgdmFsdWVTdWZmaXggPSBzdWZmaXgsDQogICAgICAgICAgaSwgbiwgYzsNCg0KICAgICAgaWYgKHR5cGUgPT09ICJjIikgew0KICAgICAgICB2YWx1ZVN1ZmZpeCA9IGZvcm1hdFR5cGUodmFsdWUpICsgdmFsdWVTdWZmaXg7DQogICAgICAgIHZhbHVlID0gIiI7DQogICAgICB9IGVsc2Ugew0KICAgICAgICB2YWx1ZSA9ICt2YWx1ZTsNCg0KICAgICAgICAvLyBQZXJmb3JtIHRoZSBpbml0aWFsIGZvcm1hdHRpbmcuDQogICAgICAgIHZhciB2YWx1ZU5lZ2F0aXZlID0gdmFsdWUgPCAwOw0KICAgICAgICB2YWx1ZSA9IGZvcm1hdFR5cGUoTWF0aC5hYnModmFsdWUpLCBwcmVjaXNpb24pOw0KDQogICAgICAgIC8vIElmIGEgbmVnYXRpdmUgdmFsdWUgcm91bmRzIHRvIHplcm8gZHVyaW5nIGZvcm1hdHRpbmcsIHRyZWF0IGFzIHBvc2l0aXZlLg0KICAgICAgICBpZiAodmFsdWVOZWdhdGl2ZSAmJiArdmFsdWUgPT09IDApIHZhbHVlTmVnYXRpdmUgPSBmYWxzZTsNCg0KICAgICAgICAvLyBDb21wdXRlIHRoZSBwcmVmaXggYW5kIHN1ZmZpeC4NCiAgICAgICAgdmFsdWVQcmVmaXggPSAodmFsdWVOZWdhdGl2ZSA/IChzaWduID09PSAiKCIgPyBzaWduIDogIi0iKSA6IHNpZ24gPT09ICItIiB8fCBzaWduID09PSAiKCIgPyAiIiA6IHNpZ24pICsgdmFsdWVQcmVmaXg7DQogICAgICAgIHZhbHVlU3VmZml4ID0gdmFsdWVTdWZmaXggKyAodHlwZSA9PT0gInMiID8gcHJlZml4ZXNbOCArIHByZWZpeEV4cG9uZW50IC8gM10gOiAiIikgKyAodmFsdWVOZWdhdGl2ZSAmJiBzaWduID09PSAiKCIgPyAiKSIgOiAiIik7DQoNCiAgICAgICAgLy8gQnJlYWsgdGhlIGZvcm1hdHRlZCB2YWx1ZSBpbnRvIHRoZSBpbnRlZ2VyIOKAnHZhbHVl4oCdIHBhcnQgdGhhdCBjYW4gYmUNCiAgICAgICAgLy8gZ3JvdXBlZCwgYW5kIGZyYWN0aW9uYWwgb3IgZXhwb25lbnRpYWwg4oCcc3VmZml44oCdIHBhcnQgdGhhdCBpcyBub3QuDQogICAgICAgIGlmIChtYXliZVN1ZmZpeCkgew0KICAgICAgICAgIGkgPSAtMSwgbiA9IHZhbHVlLmxlbmd0aDsNCiAgICAgICAgICB3aGlsZSAoKytpIDwgbikgew0KICAgICAgICAgICAgaWYgKGMgPSB2YWx1ZS5jaGFyQ29kZUF0KGkpLCA0OCA+IGMgfHwgYyA+IDU3KSB7DQogICAgICAgICAgICAgIHZhbHVlU3VmZml4ID0gKGMgPT09IDQ2ID8gZGVjaW1hbCArIHZhbHVlLnNsaWNlKGkgKyAxKSA6IHZhbHVlLnNsaWNlKGkpKSArIHZhbHVlU3VmZml4Ow0KICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIGkpOw0KICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgLy8gSWYgdGhlIGZpbGwgY2hhcmFjdGVyIGlzIG5vdCAiMCIsIGdyb3VwaW5nIGlzIGFwcGxpZWQgYmVmb3JlIHBhZGRpbmcuDQogICAgICBpZiAoY29tbWEgJiYgIXplcm8pIHZhbHVlID0gZ3JvdXAodmFsdWUsIEluZmluaXR5KTsNCg0KICAgICAgLy8gQ29tcHV0ZSB0aGUgcGFkZGluZy4NCiAgICAgIHZhciBsZW5ndGggPSB2YWx1ZVByZWZpeC5sZW5ndGggKyB2YWx1ZS5sZW5ndGggKyB2YWx1ZVN1ZmZpeC5sZW5ndGgsDQogICAgICAgICAgcGFkZGluZyA9IGxlbmd0aCA8IHdpZHRoID8gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbihmaWxsKSA6ICIiOw0KDQogICAgICAvLyBJZiB0aGUgZmlsbCBjaGFyYWN0ZXIgaXMgIjAiLCBncm91cGluZyBpcyBhcHBsaWVkIGFmdGVyIHBhZGRpbmcuDQogICAgICBpZiAoY29tbWEgJiYgemVybykgdmFsdWUgPSBncm91cChwYWRkaW5nICsgdmFsdWUsIHBhZGRpbmcubGVuZ3RoID8gd2lkdGggLSB2YWx1ZVN1ZmZpeC5sZW5ndGggOiBJbmZpbml0eSksIHBhZGRpbmcgPSAiIjsNCg0KICAgICAgLy8gUmVjb25zdHJ1Y3QgdGhlIGZpbmFsIG91dHB1dCBiYXNlZCBvbiB0aGUgZGVzaXJlZCBhbGlnbm1lbnQuDQogICAgICBzd2l0Y2ggKGFsaWduKSB7DQogICAgICAgIGNhc2UgIjwiOiB2YWx1ZSA9IHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeCArIHBhZGRpbmc7IGJyZWFrOw0KICAgICAgICBjYXNlICI9IjogdmFsdWUgPSB2YWx1ZVByZWZpeCArIHBhZGRpbmcgKyB2YWx1ZSArIHZhbHVlU3VmZml4OyBicmVhazsNCiAgICAgICAgY2FzZSAiXiI6IHZhbHVlID0gcGFkZGluZy5zbGljZSgwLCBsZW5ndGggPSBwYWRkaW5nLmxlbmd0aCA+PiAxKSArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeCArIHBhZGRpbmcuc2xpY2UobGVuZ3RoKTsgYnJlYWs7DQogICAgICAgIGRlZmF1bHQ6IHZhbHVlID0gcGFkZGluZyArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeDsgYnJlYWs7DQogICAgICB9DQoNCiAgICAgIHJldHVybiBudW1lcmFscyh2YWx1ZSk7DQogICAgfQ0KDQogICAgZm9ybWF0LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gc3BlY2lmaWVyICsgIiI7DQogICAgfTsNCg0KICAgIHJldHVybiBmb3JtYXQ7DQogIH0NCg0KICBmdW5jdGlvbiBmb3JtYXRQcmVmaXgoc3BlY2lmaWVyLCB2YWx1ZSkgew0KICAgIHZhciBmID0gbmV3Rm9ybWF0KChzcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSwgc3BlY2lmaWVyLnR5cGUgPSAiZiIsIHNwZWNpZmllcikpLA0KICAgICAgICBlID0gTWF0aC5tYXgoLTgsIE1hdGgubWluKDgsIE1hdGguZmxvb3IoZXhwb25lbnQodmFsdWUpIC8gMykpKSAqIDMsDQogICAgICAgIGsgPSBNYXRoLnBvdygxMCwgLWUpLA0KICAgICAgICBwcmVmaXggPSBwcmVmaXhlc1s4ICsgZSAvIDNdOw0KICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkgew0KICAgICAgcmV0dXJuIGYoayAqIHZhbHVlKSArIHByZWZpeDsNCiAgICB9Ow0KICB9DQoNCiAgcmV0dXJuIHsNCiAgICBmb3JtYXQ6IG5ld0Zvcm1hdCwNCiAgICBmb3JtYXRQcmVmaXg6IGZvcm1hdFByZWZpeA0KICB9Ow0KfTsNCg0KdmFyIGxvY2FsZTsNCg0KDQoNCmRlZmF1bHRMb2NhbGUoew0KICBkZWNpbWFsOiAiLiIsDQogIHRob3VzYW5kczogIiwiLA0KICBncm91cGluZzogWzNdLA0KICBjdXJyZW5jeTogWyIkIiwgIiJdDQp9KTsNCg0KZnVuY3Rpb24gZGVmYXVsdExvY2FsZShkZWZpbml0aW9uKSB7DQogIGxvY2FsZSA9IGZvcm1hdExvY2FsZShkZWZpbml0aW9uKTsNCiAgZXhwb3J0cy5mb3JtYXQgPSBsb2NhbGUuZm9ybWF0Ow0KICBleHBvcnRzLmZvcm1hdFByZWZpeCA9IGxvY2FsZS5mb3JtYXRQcmVmaXg7DQogIHJldHVybiBsb2NhbGU7DQp9DQoNCnZhciBwcmVjaXNpb25GaXhlZCA9IGZ1bmN0aW9uKHN0ZXApIHsNCiAgcmV0dXJuIE1hdGgubWF4KDAsIC1leHBvbmVudChNYXRoLmFicyhzdGVwKSkpOw0KfTsNCg0KdmFyIHByZWNpc2lvblByZWZpeCA9IGZ1bmN0aW9uKHN0ZXAsIHZhbHVlKSB7DQogIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCh2YWx1ZSkgLyAzKSkpICogMyAtIGV4cG9uZW50KE1hdGguYWJzKHN0ZXApKSk7DQp9Ow0KDQp2YXIgcHJlY2lzaW9uUm91bmQgPSBmdW5jdGlvbihzdGVwLCBtYXgpIHsNCiAgc3RlcCA9IE1hdGguYWJzKHN0ZXApLCBtYXggPSBNYXRoLmFicyhtYXgpIC0gc3RlcDsNCiAgcmV0dXJuIE1hdGgubWF4KDAsIGV4cG9uZW50KG1heCkgLSBleHBvbmVudChzdGVwKSkgKyAxOw0KfTsNCg0KZXhwb3J0cy5mb3JtYXREZWZhdWx0TG9jYWxlID0gZGVmYXVsdExvY2FsZTsNCmV4cG9ydHMuZm9ybWF0TG9jYWxlID0gZm9ybWF0TG9jYWxlOw0KZXhwb3J0cy5mb3JtYXRTcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXI7DQpleHBvcnRzLnByZWNpc2lvbkZpeGVkID0gcHJlY2lzaW9uRml4ZWQ7DQpleHBvcnRzLnByZWNpc2lvblByZWZpeCA9IHByZWNpc2lvblByZWZpeDsNCmV4cG9ydHMucHJlY2lzaW9uUm91bmQgPSBwcmVjaXNpb25Sb3VuZDsNCg0KT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTsNCg0KfSkpKTsNCg0KfSx7fV0sODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7DQovLyBodHRwczovL2QzanMub3JnL2QzLWhpZXJhcmNoeS8gVmVyc2lvbiAxLjEuNS4gQ29weXJpZ2h0IDIwMTcgTWlrZSBCb3N0b2NrLg0KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsNCgl0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDoNCgl0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpIDoNCgkoZmFjdG9yeSgoZ2xvYmFsLmQzID0gZ2xvYmFsLmQzIHx8IHt9KSkpOw0KfSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMpIHsgJ3VzZSBzdHJpY3QnOw0KDQpmdW5jdGlvbiBkZWZhdWx0U2VwYXJhdGlvbihhLCBiKSB7DQogIHJldHVybiBhLnBhcmVudCA9PT0gYi5wYXJlbnQgPyAxIDogMjsNCn0NCg0KZnVuY3Rpb24gbWVhblgoY2hpbGRyZW4pIHsNCiAgcmV0dXJuIGNoaWxkcmVuLnJlZHVjZShtZWFuWFJlZHVjZSwgMCkgLyBjaGlsZHJlbi5sZW5ndGg7DQp9DQoNCmZ1bmN0aW9uIG1lYW5YUmVkdWNlKHgsIGMpIHsNCiAgcmV0dXJuIHggKyBjLng7DQp9DQoNCmZ1bmN0aW9uIG1heFkoY2hpbGRyZW4pIHsNCiAgcmV0dXJuIDEgKyBjaGlsZHJlbi5yZWR1Y2UobWF4WVJlZHVjZSwgMCk7DQp9DQoNCmZ1bmN0aW9uIG1heFlSZWR1Y2UoeSwgYykgew0KICByZXR1cm4gTWF0aC5tYXgoeSwgYy55KTsNCn0NCg0KZnVuY3Rpb24gbGVhZkxlZnQobm9kZSkgew0KICB2YXIgY2hpbGRyZW47DQogIHdoaWxlIChjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4pIG5vZGUgPSBjaGlsZHJlblswXTsNCiAgcmV0dXJuIG5vZGU7DQp9DQoNCmZ1bmN0aW9uIGxlYWZSaWdodChub2RlKSB7DQogIHZhciBjaGlsZHJlbjsNCiAgd2hpbGUgKGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbikgbm9kZSA9IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdOw0KICByZXR1cm4gbm9kZTsNCn0NCg0KdmFyIGNsdXN0ZXIgPSBmdW5jdGlvbigpIHsNCiAgdmFyIHNlcGFyYXRpb24gPSBkZWZhdWx0U2VwYXJhdGlvbiwNCiAgICAgIGR4ID0gMSwNCiAgICAgIGR5ID0gMSwNCiAgICAgIG5vZGVTaXplID0gZmFsc2U7DQoNCiAgZnVuY3Rpb24gY2x1c3Rlcihyb290KSB7DQogICAgdmFyIHByZXZpb3VzTm9kZSwNCiAgICAgICAgeCA9IDA7DQoNCiAgICAvLyBGaXJzdCB3YWxrLCBjb21wdXRpbmcgdGhlIGluaXRpYWwgeCAmIHkgdmFsdWVzLg0KICAgIHJvb3QuZWFjaEFmdGVyKGZ1bmN0aW9uKG5vZGUpIHsNCiAgICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47DQogICAgICBpZiAoY2hpbGRyZW4pIHsNCiAgICAgICAgbm9kZS54ID0gbWVhblgoY2hpbGRyZW4pOw0KICAgICAgICBub2RlLnkgPSBtYXhZKGNoaWxkcmVuKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIG5vZGUueCA9IHByZXZpb3VzTm9kZSA/IHggKz0gc2VwYXJhdGlvbihub2RlLCBwcmV2aW91c05vZGUpIDogMDsNCiAgICAgICAgbm9kZS55ID0gMDsNCiAgICAgICAgcHJldmlvdXNOb2RlID0gbm9kZTsNCiAgICAgIH0NCiAgICB9KTsNCg0KICAgIHZhciBsZWZ0ID0gbGVhZkxlZnQocm9vdCksDQogICAgICAgIHJpZ2h0ID0gbGVhZlJpZ2h0KHJvb3QpLA0KICAgICAgICB4MCA9IGxlZnQueCAtIHNlcGFyYXRpb24obGVmdCwgcmlnaHQpIC8gMiwNCiAgICAgICAgeDEgPSByaWdodC54ICsgc2VwYXJhdGlvbihyaWdodCwgbGVmdCkgLyAyOw0KDQogICAgLy8gU2Vjb25kIHdhbGssIG5vcm1hbGl6aW5nIHggJiB5IHRvIHRoZSBkZXNpcmVkIHNpemUuDQogICAgcmV0dXJuIHJvb3QuZWFjaEFmdGVyKG5vZGVTaXplID8gZnVuY3Rpb24obm9kZSkgew0KICAgICAgbm9kZS54ID0gKG5vZGUueCAtIHJvb3QueCkgKiBkeDsNCiAgICAgIG5vZGUueSA9IChyb290LnkgLSBub2RlLnkpICogZHk7DQogICAgfSA6IGZ1bmN0aW9uKG5vZGUpIHsNCiAgICAgIG5vZGUueCA9IChub2RlLnggLSB4MCkgLyAoeDEgLSB4MCkgKiBkeDsNCiAgICAgIG5vZGUueSA9ICgxIC0gKHJvb3QueSA/IG5vZGUueSAvIHJvb3QueSA6IDEpKSAqIGR5Ow0KICAgIH0pOw0KICB9DQoNCiAgY2x1c3Rlci5zZXBhcmF0aW9uID0gZnVuY3Rpb24oeCkgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNlcGFyYXRpb24gPSB4LCBjbHVzdGVyKSA6IHNlcGFyYXRpb247DQogIH07DQoNCiAgY2x1c3Rlci5zaXplID0gZnVuY3Rpb24oeCkgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5vZGVTaXplID0gZmFsc2UsIGR4ID0gK3hbMF0sIGR5ID0gK3hbMV0sIGNsdXN0ZXIpIDogKG5vZGVTaXplID8gbnVsbCA6IFtkeCwgZHldKTsNCiAgfTsNCg0KICBjbHVzdGVyLm5vZGVTaXplID0gZnVuY3Rpb24oeCkgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5vZGVTaXplID0gdHJ1ZSwgZHggPSAreFswXSwgZHkgPSAreFsxXSwgY2x1c3RlcikgOiAobm9kZVNpemUgPyBbZHgsIGR5XSA6IG51bGwpOw0KICB9Ow0KDQogIHJldHVybiBjbHVzdGVyOw0KfTsNCg0KZnVuY3Rpb24gY291bnQobm9kZSkgew0KICB2YXIgc3VtID0gMCwNCiAgICAgIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwNCiAgICAgIGkgPSBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGg7DQogIGlmICghaSkgc3VtID0gMTsNCiAgZWxzZSB3aGlsZSAoLS1pID49IDApIHN1bSArPSBjaGlsZHJlbltpXS52YWx1ZTsNCiAgbm9kZS52YWx1ZSA9IHN1bTsNCn0NCg0KdmFyIG5vZGVfY291bnQgPSBmdW5jdGlvbigpIHsNCiAgcmV0dXJuIHRoaXMuZWFjaEFmdGVyKGNvdW50KTsNCn07DQoNCnZhciBub2RlX2VhY2ggPSBmdW5jdGlvbihjYWxsYmFjaykgew0KICB2YXIgbm9kZSA9IHRoaXMsIGN1cnJlbnQsIG5leHQgPSBbbm9kZV0sIGNoaWxkcmVuLCBpLCBuOw0KICBkbyB7DQogICAgY3VycmVudCA9IG5leHQucmV2ZXJzZSgpLCBuZXh0ID0gW107DQogICAgd2hpbGUgKG5vZGUgPSBjdXJyZW50LnBvcCgpKSB7DQogICAgICBjYWxsYmFjayhub2RlKSwgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOw0KICAgICAgaWYgKGNoaWxkcmVuKSBmb3IgKGkgPSAwLCBuID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbjsgKytpKSB7DQogICAgICAgIG5leHQucHVzaChjaGlsZHJlbltpXSk7DQogICAgICB9DQogICAgfQ0KICB9IHdoaWxlIChuZXh0Lmxlbmd0aCk7DQogIHJldHVybiB0aGlzOw0KfTsNCg0KdmFyIG5vZGVfZWFjaEJlZm9yZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7DQogIHZhciBub2RlID0gdGhpcywgbm9kZXMgPSBbbm9kZV0sIGNoaWxkcmVuLCBpOw0KICB3aGlsZSAobm9kZSA9IG5vZGVzLnBvcCgpKSB7DQogICAgY2FsbGJhY2sobm9kZSksIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsNCiAgICBpZiAoY2hpbGRyZW4pIGZvciAoaSA9IGNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7DQogICAgICBub2Rlcy5wdXNoKGNoaWxkcmVuW2ldKTsNCiAgICB9DQogIH0NCiAgcmV0dXJuIHRoaXM7DQp9Ow0KDQp2YXIgbm9kZV9lYWNoQWZ0ZXIgPSBmdW5jdGlvbihjYWxsYmFjaykgew0KICB2YXIgbm9kZSA9IHRoaXMsIG5vZGVzID0gW25vZGVdLCBuZXh0ID0gW10sIGNoaWxkcmVuLCBpLCBuOw0KICB3aGlsZSAobm9kZSA9IG5vZGVzLnBvcCgpKSB7DQogICAgbmV4dC5wdXNoKG5vZGUpLCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47DQogICAgaWYgKGNoaWxkcmVuKSBmb3IgKGkgPSAwLCBuID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbjsgKytpKSB7DQogICAgICBub2Rlcy5wdXNoKGNoaWxkcmVuW2ldKTsNCiAgICB9DQogIH0NCiAgd2hpbGUgKG5vZGUgPSBuZXh0LnBvcCgpKSB7DQogICAgY2FsbGJhY2sobm9kZSk7DQogIH0NCiAgcmV0dXJuIHRoaXM7DQp9Ow0KDQp2YXIgbm9kZV9zdW0gPSBmdW5jdGlvbih2YWx1ZSkgew0KICByZXR1cm4gdGhpcy5lYWNoQWZ0ZXIoZnVuY3Rpb24obm9kZSkgew0KICAgIHZhciBzdW0gPSArdmFsdWUobm9kZS5kYXRhKSB8fCAwLA0KICAgICAgICBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sDQogICAgICAgIGkgPSBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGg7DQogICAgd2hpbGUgKC0taSA+PSAwKSBzdW0gKz0gY2hpbGRyZW5baV0udmFsdWU7DQogICAgbm9kZS52YWx1ZSA9IHN1bTsNCiAgfSk7DQp9Ow0KDQp2YXIgbm9kZV9zb3J0ID0gZnVuY3Rpb24oY29tcGFyZSkgew0KICByZXR1cm4gdGhpcy5lYWNoQmVmb3JlKGZ1bmN0aW9uKG5vZGUpIHsNCiAgICBpZiAobm9kZS5jaGlsZHJlbikgew0KICAgICAgbm9kZS5jaGlsZHJlbi5zb3J0KGNvbXBhcmUpOw0KICAgIH0NCiAgfSk7DQp9Ow0KDQp2YXIgbm9kZV9wYXRoID0gZnVuY3Rpb24oZW5kKSB7DQogIHZhciBzdGFydCA9IHRoaXMsDQogICAgICBhbmNlc3RvciA9IGxlYXN0Q29tbW9uQW5jZXN0b3Ioc3RhcnQsIGVuZCksDQogICAgICBub2RlcyA9IFtzdGFydF07DQogIHdoaWxlIChzdGFydCAhPT0gYW5jZXN0b3IpIHsNCiAgICBzdGFydCA9IHN0YXJ0LnBhcmVudDsNCiAgICBub2Rlcy5wdXNoKHN0YXJ0KTsNCiAgfQ0KICB2YXIgayA9IG5vZGVzLmxlbmd0aDsNCiAgd2hpbGUgKGVuZCAhPT0gYW5jZXN0b3IpIHsNCiAgICBub2Rlcy5zcGxpY2UoaywgMCwgZW5kKTsNCiAgICBlbmQgPSBlbmQucGFyZW50Ow0KICB9DQogIHJldHVybiBub2RlczsNCn07DQoNCmZ1bmN0aW9uIGxlYXN0Q29tbW9uQW5jZXN0b3IoYSwgYikgew0KICBpZiAoYSA9PT0gYikgcmV0dXJuIGE7DQogIHZhciBhTm9kZXMgPSBhLmFuY2VzdG9ycygpLA0KICAgICAgYk5vZGVzID0gYi5hbmNlc3RvcnMoKSwNCiAgICAgIGMgPSBudWxsOw0KICBhID0gYU5vZGVzLnBvcCgpOw0KICBiID0gYk5vZGVzLnBvcCgpOw0KICB3aGlsZSAoYSA9PT0gYikgew0KICAgIGMgPSBhOw0KICAgIGEgPSBhTm9kZXMucG9wKCk7DQogICAgYiA9IGJOb2Rlcy5wb3AoKTsNCiAgfQ0KICByZXR1cm4gYzsNCn0NCg0KdmFyIG5vZGVfYW5jZXN0b3JzID0gZnVuY3Rpb24oKSB7DQogIHZhciBub2RlID0gdGhpcywgbm9kZXMgPSBbbm9kZV07DQogIHdoaWxlIChub2RlID0gbm9kZS5wYXJlbnQpIHsNCiAgICBub2Rlcy5wdXNoKG5vZGUpOw0KICB9DQogIHJldHVybiBub2RlczsNCn07DQoNCnZhciBub2RlX2Rlc2NlbmRhbnRzID0gZnVuY3Rpb24oKSB7DQogIHZhciBub2RlcyA9IFtdOw0KICB0aGlzLmVhY2goZnVuY3Rpb24obm9kZSkgew0KICAgIG5vZGVzLnB1c2gobm9kZSk7DQogIH0pOw0KICByZXR1cm4gbm9kZXM7DQp9Ow0KDQp2YXIgbm9kZV9sZWF2ZXMgPSBmdW5jdGlvbigpIHsNCiAgdmFyIGxlYXZlcyA9IFtdOw0KICB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obm9kZSkgew0KICAgIGlmICghbm9kZS5jaGlsZHJlbikgew0KICAgICAgbGVhdmVzLnB1c2gobm9kZSk7DQogICAgfQ0KICB9KTsNCiAgcmV0dXJuIGxlYXZlczsNCn07DQoNCnZhciBub2RlX2xpbmtzID0gZnVuY3Rpb24oKSB7DQogIHZhciByb290ID0gdGhpcywgbGlua3MgPSBbXTsNCiAgcm9vdC5lYWNoKGZ1bmN0aW9uKG5vZGUpIHsNCiAgICBpZiAobm9kZSAhPT0gcm9vdCkgeyAvLyBEb27igJl0IGluY2x1ZGUgdGhlIHJvb3TigJlzIHBhcmVudCwgaWYgYW55Lg0KICAgICAgbGlua3MucHVzaCh7c291cmNlOiBub2RlLnBhcmVudCwgdGFyZ2V0OiBub2RlfSk7DQogICAgfQ0KICB9KTsNCiAgcmV0dXJuIGxpbmtzOw0KfTsNCg0KZnVuY3Rpb24gaGllcmFyY2h5KGRhdGEsIGNoaWxkcmVuKSB7DQogIHZhciByb290ID0gbmV3IE5vZGUoZGF0YSksDQogICAgICB2YWx1ZWQgPSArZGF0YS52YWx1ZSAmJiAocm9vdC52YWx1ZSA9IGRhdGEudmFsdWUpLA0KICAgICAgbm9kZSwNCiAgICAgIG5vZGVzID0gW3Jvb3RdLA0KICAgICAgY2hpbGQsDQogICAgICBjaGlsZHMsDQogICAgICBpLA0KICAgICAgbjsNCg0KICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgY2hpbGRyZW4gPSBkZWZhdWx0Q2hpbGRyZW47DQoNCiAgd2hpbGUgKG5vZGUgPSBub2Rlcy5wb3AoKSkgew0KICAgIGlmICh2YWx1ZWQpIG5vZGUudmFsdWUgPSArbm9kZS5kYXRhLnZhbHVlOw0KICAgIGlmICgoY2hpbGRzID0gY2hpbGRyZW4obm9kZS5kYXRhKSkgJiYgKG4gPSBjaGlsZHMubGVuZ3RoKSkgew0KICAgICAgbm9kZS5jaGlsZHJlbiA9IG5ldyBBcnJheShuKTsNCiAgICAgIGZvciAoaSA9IG4gLSAxOyBpID49IDA7IC0taSkgew0KICAgICAgICBub2Rlcy5wdXNoKGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXSA9IG5ldyBOb2RlKGNoaWxkc1tpXSkpOw0KICAgICAgICBjaGlsZC5wYXJlbnQgPSBub2RlOw0KICAgICAgICBjaGlsZC5kZXB0aCA9IG5vZGUuZGVwdGggKyAxOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIHJldHVybiByb290LmVhY2hCZWZvcmUoY29tcHV0ZUhlaWdodCk7DQp9DQoNCmZ1bmN0aW9uIG5vZGVfY29weSgpIHsNCiAgcmV0dXJuIGhpZXJhcmNoeSh0aGlzKS5lYWNoQmVmb3JlKGNvcHlEYXRhKTsNCn0NCg0KZnVuY3Rpb24gZGVmYXVsdENoaWxkcmVuKGQpIHsNCiAgcmV0dXJuIGQuY2hpbGRyZW47DQp9DQoNCmZ1bmN0aW9uIGNvcHlEYXRhKG5vZGUpIHsNCiAgbm9kZS5kYXRhID0gbm9kZS5kYXRhLmRhdGE7DQp9DQoNCmZ1bmN0aW9uIGNvbXB1dGVIZWlnaHQobm9kZSkgew0KICB2YXIgaGVpZ2h0ID0gMDsNCiAgZG8gbm9kZS5oZWlnaHQgPSBoZWlnaHQ7DQogIHdoaWxlICgobm9kZSA9IG5vZGUucGFyZW50KSAmJiAobm9kZS5oZWlnaHQgPCArK2hlaWdodCkpOw0KfQ0KDQpmdW5jdGlvbiBOb2RlKGRhdGEpIHsNCiAgdGhpcy5kYXRhID0gZGF0YTsNCiAgdGhpcy5kZXB0aCA9DQogIHRoaXMuaGVpZ2h0ID0gMDsNCiAgdGhpcy5wYXJlbnQgPSBudWxsOw0KfQ0KDQpOb2RlLnByb3RvdHlwZSA9IGhpZXJhcmNoeS5wcm90b3R5cGUgPSB7DQogIGNvbnN0cnVjdG9yOiBOb2RlLA0KICBjb3VudDogbm9kZV9jb3VudCwNCiAgZWFjaDogbm9kZV9lYWNoLA0KICBlYWNoQWZ0ZXI6IG5vZGVfZWFjaEFmdGVyLA0KICBlYWNoQmVmb3JlOiBub2RlX2VhY2hCZWZvcmUsDQogIHN1bTogbm9kZV9zdW0sDQogIHNvcnQ6IG5vZGVfc29ydCwNCiAgcGF0aDogbm9kZV9wYXRoLA0KICBhbmNlc3RvcnM6IG5vZGVfYW5jZXN0b3JzLA0KICBkZXNjZW5kYW50czogbm9kZV9kZXNjZW5kYW50cywNCiAgbGVhdmVzOiBub2RlX2xlYXZlcywNCiAgbGlua3M6IG5vZGVfbGlua3MsDQogIGNvcHk6IG5vZGVfY29weQ0KfTsNCg0KdmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlOw0KDQpmdW5jdGlvbiBzaHVmZmxlKGFycmF5KSB7DQogIHZhciBtID0gYXJyYXkubGVuZ3RoLA0KICAgICAgdCwNCiAgICAgIGk7DQoNCiAgd2hpbGUgKG0pIHsNCiAgICBpID0gTWF0aC5yYW5kb20oKSAqIG0tLSB8IDA7DQogICAgdCA9IGFycmF5W21dOw0KICAgIGFycmF5W21dID0gYXJyYXlbaV07DQogICAgYXJyYXlbaV0gPSB0Ow0KICB9DQoNCiAgcmV0dXJuIGFycmF5Ow0KfQ0KDQp2YXIgZW5jbG9zZSA9IGZ1bmN0aW9uKGNpcmNsZXMpIHsNCiAgdmFyIGkgPSAwLCBuID0gKGNpcmNsZXMgPSBzaHVmZmxlKHNsaWNlLmNhbGwoY2lyY2xlcykpKS5sZW5ndGgsIEIgPSBbXSwgcCwgZTsNCg0KICB3aGlsZSAoaSA8IG4pIHsNCiAgICBwID0gY2lyY2xlc1tpXTsNCiAgICBpZiAoZSAmJiBlbmNsb3Nlc1dlYWsoZSwgcCkpICsraTsNCiAgICBlbHNlIGUgPSBlbmNsb3NlQmFzaXMoQiA9IGV4dGVuZEJhc2lzKEIsIHApKSwgaSA9IDA7DQogIH0NCg0KICByZXR1cm4gZTsNCn07DQoNCmZ1bmN0aW9uIGV4dGVuZEJhc2lzKEIsIHApIHsNCiAgdmFyIGksIGo7DQoNCiAgaWYgKGVuY2xvc2VzV2Vha0FsbChwLCBCKSkgcmV0dXJuIFtwXTsNCg0KICAvLyBJZiB3ZSBnZXQgaGVyZSB0aGVuIEIgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBlbGVtZW50Lg0KICBmb3IgKGkgPSAwOyBpIDwgQi5sZW5ndGg7ICsraSkgew0KICAgIGlmIChlbmNsb3Nlc05vdChwLCBCW2ldKQ0KICAgICAgICAmJiBlbmNsb3Nlc1dlYWtBbGwoZW5jbG9zZUJhc2lzMihCW2ldLCBwKSwgQikpIHsNCiAgICAgIHJldHVybiBbQltpXSwgcF07DQogICAgfQ0KICB9DQoNCiAgLy8gSWYgd2UgZ2V0IGhlcmUgdGhlbiBCIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gZWxlbWVudHMuDQogIGZvciAoaSA9IDA7IGkgPCBCLmxlbmd0aCAtIDE7ICsraSkgew0KICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgQi5sZW5ndGg7ICsraikgew0KICAgICAgaWYgKGVuY2xvc2VzTm90KGVuY2xvc2VCYXNpczIoQltpXSwgQltqXSksIHApDQogICAgICAgICAgJiYgZW5jbG9zZXNOb3QoZW5jbG9zZUJhc2lzMihCW2ldLCBwKSwgQltqXSkNCiAgICAgICAgICAmJiBlbmNsb3Nlc05vdChlbmNsb3NlQmFzaXMyKEJbal0sIHApLCBCW2ldKQ0KICAgICAgICAgICYmIGVuY2xvc2VzV2Vha0FsbChlbmNsb3NlQmFzaXMzKEJbaV0sIEJbal0sIHApLCBCKSkgew0KICAgICAgICByZXR1cm4gW0JbaV0sIEJbal0sIHBdOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIC8vIElmIHdlIGdldCBoZXJlIHRoZW4gc29tZXRoaW5nIGlzIHZlcnkgd3JvbmcuDQogIHRocm93IG5ldyBFcnJvcjsNCn0NCg0KZnVuY3Rpb24gZW5jbG9zZXNOb3QoYSwgYikgew0KICB2YXIgZHIgPSBhLnIgLSBiLnIsIGR4ID0gYi54IC0gYS54LCBkeSA9IGIueSAtIGEueTsNCiAgcmV0dXJuIGRyIDwgMCB8fCBkciAqIGRyIDwgZHggKiBkeCArIGR5ICogZHk7DQp9DQoNCmZ1bmN0aW9uIGVuY2xvc2VzV2VhayhhLCBiKSB7DQogIHZhciBkciA9IGEuciAtIGIuciArIDFlLTYsIGR4ID0gYi54IC0gYS54LCBkeSA9IGIueSAtIGEueTsNCiAgcmV0dXJuIGRyID4gMCAmJiBkciAqIGRyID4gZHggKiBkeCArIGR5ICogZHk7DQp9DQoNCmZ1bmN0aW9uIGVuY2xvc2VzV2Vha0FsbChhLCBCKSB7DQogIGZvciAodmFyIGkgPSAwOyBpIDwgQi5sZW5ndGg7ICsraSkgew0KICAgIGlmICghZW5jbG9zZXNXZWFrKGEsIEJbaV0pKSB7DQogICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KICB9DQogIHJldHVybiB0cnVlOw0KfQ0KDQpmdW5jdGlvbiBlbmNsb3NlQmFzaXMoQikgew0KICBzd2l0Y2ggKEIubGVuZ3RoKSB7DQogICAgY2FzZSAxOiByZXR1cm4gZW5jbG9zZUJhc2lzMShCWzBdKTsNCiAgICBjYXNlIDI6IHJldHVybiBlbmNsb3NlQmFzaXMyKEJbMF0sIEJbMV0pOw0KICAgIGNhc2UgMzogcmV0dXJuIGVuY2xvc2VCYXNpczMoQlswXSwgQlsxXSwgQlsyXSk7DQogIH0NCn0NCg0KZnVuY3Rpb24gZW5jbG9zZUJhc2lzMShhKSB7DQogIHJldHVybiB7DQogICAgeDogYS54LA0KICAgIHk6IGEueSwNCiAgICByOiBhLnINCiAgfTsNCn0NCg0KZnVuY3Rpb24gZW5jbG9zZUJhc2lzMihhLCBiKSB7DQogIHZhciB4MSA9IGEueCwgeTEgPSBhLnksIHIxID0gYS5yLA0KICAgICAgeDIgPSBiLngsIHkyID0gYi55LCByMiA9IGIuciwNCiAgICAgIHgyMSA9IHgyIC0geDEsIHkyMSA9IHkyIC0geTEsIHIyMSA9IHIyIC0gcjEsDQogICAgICBsID0gTWF0aC5zcXJ0KHgyMSAqIHgyMSArIHkyMSAqIHkyMSk7DQogIHJldHVybiB7DQogICAgeDogKHgxICsgeDIgKyB4MjEgLyBsICogcjIxKSAvIDIsDQogICAgeTogKHkxICsgeTIgKyB5MjEgLyBsICogcjIxKSAvIDIsDQogICAgcjogKGwgKyByMSArIHIyKSAvIDINCiAgfTsNCn0NCg0KZnVuY3Rpb24gZW5jbG9zZUJhc2lzMyhhLCBiLCBjKSB7DQogIHZhciB4MSA9IGEueCwgeTEgPSBhLnksIHIxID0gYS5yLA0KICAgICAgeDIgPSBiLngsIHkyID0gYi55LCByMiA9IGIuciwNCiAgICAgIHgzID0gYy54LCB5MyA9IGMueSwgcjMgPSBjLnIsDQogICAgICBhMiA9IHgxIC0geDIsDQogICAgICBhMyA9IHgxIC0geDMsDQogICAgICBiMiA9IHkxIC0geTIsDQogICAgICBiMyA9IHkxIC0geTMsDQogICAgICBjMiA9IHIyIC0gcjEsDQogICAgICBjMyA9IHIzIC0gcjEsDQogICAgICBkMSA9IHgxICogeDEgKyB5MSAqIHkxIC0gcjEgKiByMSwNCiAgICAgIGQyID0gZDEgLSB4MiAqIHgyIC0geTIgKiB5MiArIHIyICogcjIsDQogICAgICBkMyA9IGQxIC0geDMgKiB4MyAtIHkzICogeTMgKyByMyAqIHIzLA0KICAgICAgYWIgPSBhMyAqIGIyIC0gYTIgKiBiMywNCiAgICAgIHhhID0gKGIyICogZDMgLSBiMyAqIGQyKSAvIChhYiAqIDIpIC0geDEsDQogICAgICB4YiA9IChiMyAqIGMyIC0gYjIgKiBjMykgLyBhYiwNCiAgICAgIHlhID0gKGEzICogZDIgLSBhMiAqIGQzKSAvIChhYiAqIDIpIC0geTEsDQogICAgICB5YiA9IChhMiAqIGMzIC0gYTMgKiBjMikgLyBhYiwNCiAgICAgIEEgPSB4YiAqIHhiICsgeWIgKiB5YiAtIDEsDQogICAgICBCID0gMiAqIChyMSArIHhhICogeGIgKyB5YSAqIHliKSwNCiAgICAgIEMgPSB4YSAqIHhhICsgeWEgKiB5YSAtIHIxICogcjEsDQogICAgICByID0gLShBID8gKEIgKyBNYXRoLnNxcnQoQiAqIEIgLSA0ICogQSAqIEMpKSAvICgyICogQSkgOiBDIC8gQik7DQogIHJldHVybiB7DQogICAgeDogeDEgKyB4YSArIHhiICogciwNCiAgICB5OiB5MSArIHlhICsgeWIgKiByLA0KICAgIHI6IHINCiAgfTsNCn0NCg0KZnVuY3Rpb24gcGxhY2UoYSwgYiwgYykgew0KICB2YXIgYXggPSBhLngsDQogICAgICBheSA9IGEueSwNCiAgICAgIGRhID0gYi5yICsgYy5yLA0KICAgICAgZGIgPSBhLnIgKyBjLnIsDQogICAgICBkeCA9IGIueCAtIGF4LA0KICAgICAgZHkgPSBiLnkgLSBheSwNCiAgICAgIGRjID0gZHggKiBkeCArIGR5ICogZHk7DQogIGlmIChkYykgew0KICAgIHZhciB4ID0gMC41ICsgKChkYiAqPSBkYikgLSAoZGEgKj0gZGEpKSAvICgyICogZGMpLA0KICAgICAgICB5ID0gTWF0aC5zcXJ0KE1hdGgubWF4KDAsIDIgKiBkYSAqIChkYiArIGRjKSAtIChkYiAtPSBkYykgKiBkYiAtIGRhICogZGEpKSAvICgyICogZGMpOw0KICAgIGMueCA9IGF4ICsgeCAqIGR4ICsgeSAqIGR5Ow0KICAgIGMueSA9IGF5ICsgeCAqIGR5IC0geSAqIGR4Ow0KICB9IGVsc2Ugew0KICAgIGMueCA9IGF4ICsgZGI7DQogICAgYy55ID0gYXk7DQogIH0NCn0NCg0KZnVuY3Rpb24gaW50ZXJzZWN0cyhhLCBiKSB7DQogIHZhciBkeCA9IGIueCAtIGEueCwNCiAgICAgIGR5ID0gYi55IC0gYS55LA0KICAgICAgZHIgPSBhLnIgKyBiLnI7DQogIHJldHVybiBkciAqIGRyIC0gMWUtNiA+IGR4ICogZHggKyBkeSAqIGR5Ow0KfQ0KDQpmdW5jdGlvbiBzY29yZShub2RlKSB7DQogIHZhciBhID0gbm9kZS5fLA0KICAgICAgYiA9IG5vZGUubmV4dC5fLA0KICAgICAgYWIgPSBhLnIgKyBiLnIsDQogICAgICBkeCA9IChhLnggKiBiLnIgKyBiLnggKiBhLnIpIC8gYWIsDQogICAgICBkeSA9IChhLnkgKiBiLnIgKyBiLnkgKiBhLnIpIC8gYWI7DQogIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTsNCn0NCg0KZnVuY3Rpb24gTm9kZSQxKGNpcmNsZSkgew0KICB0aGlzLl8gPSBjaXJjbGU7DQogIHRoaXMubmV4dCA9IG51bGw7DQogIHRoaXMucHJldmlvdXMgPSBudWxsOw0KfQ0KDQpmdW5jdGlvbiBwYWNrRW5jbG9zZShjaXJjbGVzKSB7DQogIGlmICghKG4gPSBjaXJjbGVzLmxlbmd0aCkpIHJldHVybiAwOw0KDQogIHZhciBhLCBiLCBjLCBuLCBhYSwgY2EsIGksIGosIGssIHNqLCBzazsNCg0KICAvLyBQbGFjZSB0aGUgZmlyc3QgY2lyY2xlLg0KICBhID0gY2lyY2xlc1swXSwgYS54ID0gMCwgYS55ID0gMDsNCiAgaWYgKCEobiA+IDEpKSByZXR1cm4gYS5yOw0KDQogIC8vIFBsYWNlIHRoZSBzZWNvbmQgY2lyY2xlLg0KICBiID0gY2lyY2xlc1sxXSwgYS54ID0gLWIuciwgYi54ID0gYS5yLCBiLnkgPSAwOw0KICBpZiAoIShuID4gMikpIHJldHVybiBhLnIgKyBiLnI7DQoNCiAgLy8gUGxhY2UgdGhlIHRoaXJkIGNpcmNsZS4NCiAgcGxhY2UoYiwgYSwgYyA9IGNpcmNsZXNbMl0pOw0KDQogIC8vIEluaXRpYWxpemUgdGhlIGZyb250LWNoYWluIHVzaW5nIHRoZSBmaXJzdCB0aHJlZSBjaXJjbGVzIGEsIGIgYW5kIGMuDQogIGEgPSBuZXcgTm9kZSQxKGEpLCBiID0gbmV3IE5vZGUkMShiKSwgYyA9IG5ldyBOb2RlJDEoYyk7DQogIGEubmV4dCA9IGMucHJldmlvdXMgPSBiOw0KICBiLm5leHQgPSBhLnByZXZpb3VzID0gYzsNCiAgYy5uZXh0ID0gYi5wcmV2aW91cyA9IGE7DQoNCiAgLy8gQXR0ZW1wdCB0byBwbGFjZSBlYWNoIHJlbWFpbmluZyBjaXJjbGXigKYNCiAgcGFjazogZm9yIChpID0gMzsgaSA8IG47ICsraSkgew0KICAgIHBsYWNlKGEuXywgYi5fLCBjID0gY2lyY2xlc1tpXSksIGMgPSBuZXcgTm9kZSQxKGMpOw0KDQogICAgLy8gRmluZCB0aGUgY2xvc2VzdCBpbnRlcnNlY3RpbmcgY2lyY2xlIG9uIHRoZSBmcm9udC1jaGFpbiwgaWYgYW55Lg0KICAgIC8vIOKAnENsb3NlbmVzc+KAnSBpcyBkZXRlcm1pbmVkIGJ5IGxpbmVhciBkaXN0YW5jZSBhbG9uZyB0aGUgZnJvbnQtY2hhaW4uDQogICAgLy8g4oCcQWhlYWTigJ0gb3Ig4oCcYmVoaW5k4oCdIGlzIGxpa2V3aXNlIGRldGVybWluZWQgYnkgbGluZWFyIGRpc3RhbmNlLg0KICAgIGogPSBiLm5leHQsIGsgPSBhLnByZXZpb3VzLCBzaiA9IGIuXy5yLCBzayA9IGEuXy5yOw0KICAgIGRvIHsNCiAgICAgIGlmIChzaiA8PSBzaykgew0KICAgICAgICBpZiAoaW50ZXJzZWN0cyhqLl8sIGMuXykpIHsNCiAgICAgICAgICBiID0gaiwgYS5uZXh0ID0gYiwgYi5wcmV2aW91cyA9IGEsIC0taTsNCiAgICAgICAgICBjb250aW51ZSBwYWNrOw0KICAgICAgICB9DQogICAgICAgIHNqICs9IGouXy5yLCBqID0gai5uZXh0Ow0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgaWYgKGludGVyc2VjdHMoay5fLCBjLl8pKSB7DQogICAgICAgICAgYSA9IGssIGEubmV4dCA9IGIsIGIucHJldmlvdXMgPSBhLCAtLWk7DQogICAgICAgICAgY29udGludWUgcGFjazsNCiAgICAgICAgfQ0KICAgICAgICBzayArPSBrLl8uciwgayA9IGsucHJldmlvdXM7DQogICAgICB9DQogICAgfSB3aGlsZSAoaiAhPT0gay5uZXh0KTsNCg0KICAgIC8vIFN1Y2Nlc3MhIEluc2VydCB0aGUgbmV3IGNpcmNsZSBjIGJldHdlZW4gYSBhbmQgYi4NCiAgICBjLnByZXZpb3VzID0gYSwgYy5uZXh0ID0gYiwgYS5uZXh0ID0gYi5wcmV2aW91cyA9IGIgPSBjOw0KDQogICAgLy8gQ29tcHV0ZSB0aGUgbmV3IGNsb3Nlc3QgY2lyY2xlIHBhaXIgdG8gdGhlIGNlbnRyb2lkLg0KICAgIGFhID0gc2NvcmUoYSk7DQogICAgd2hpbGUgKChjID0gYy5uZXh0KSAhPT0gYikgew0KICAgICAgaWYgKChjYSA9IHNjb3JlKGMpKSA8IGFhKSB7DQogICAgICAgIGEgPSBjLCBhYSA9IGNhOw0KICAgICAgfQ0KICAgIH0NCiAgICBiID0gYS5uZXh0Ow0KICB9DQoNCiAgLy8gQ29tcHV0ZSB0aGUgZW5jbG9zaW5nIGNpcmNsZSBvZiB0aGUgZnJvbnQgY2hhaW4uDQogIGEgPSBbYi5fXSwgYyA9IGI7IHdoaWxlICgoYyA9IGMubmV4dCkgIT09IGIpIGEucHVzaChjLl8pOyBjID0gZW5jbG9zZShhKTsNCg0KICAvLyBUcmFuc2xhdGUgdGhlIGNpcmNsZXMgdG8gcHV0IHRoZSBlbmNsb3NpbmcgY2lyY2xlIGFyb3VuZCB0aGUgb3JpZ2luLg0KICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBhID0gY2lyY2xlc1tpXSwgYS54IC09IGMueCwgYS55IC09IGMueTsNCg0KICByZXR1cm4gYy5yOw0KfQ0KDQp2YXIgc2libGluZ3MgPSBmdW5jdGlvbihjaXJjbGVzKSB7DQogIHBhY2tFbmNsb3NlKGNpcmNsZXMpOw0KICByZXR1cm4gY2lyY2xlczsNCn07DQoNCmZ1bmN0aW9uIG9wdGlvbmFsKGYpIHsNCiAgcmV0dXJuIGYgPT0gbnVsbCA/IG51bGwgOiByZXF1aXJlZChmKTsNCn0NCg0KZnVuY3Rpb24gcmVxdWlyZWQoZikgew0KICBpZiAodHlwZW9mIGYgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcjsNCiAgcmV0dXJuIGY7DQp9DQoNCmZ1bmN0aW9uIGNvbnN0YW50WmVybygpIHsNCiAgcmV0dXJuIDA7DQp9DQoNCnZhciBjb25zdGFudCA9IGZ1bmN0aW9uKHgpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB4Ow0KICB9Ow0KfTsNCg0KZnVuY3Rpb24gZGVmYXVsdFJhZGl1cyhkKSB7DQogIHJldHVybiBNYXRoLnNxcnQoZC52YWx1ZSk7DQp9DQoNCnZhciBpbmRleCA9IGZ1bmN0aW9uKCkgew0KICB2YXIgcmFkaXVzID0gbnVsbCwNCiAgICAgIGR4ID0gMSwNCiAgICAgIGR5ID0gMSwNCiAgICAgIHBhZGRpbmcgPSBjb25zdGFudFplcm87DQoNCiAgZnVuY3Rpb24gcGFjayhyb290KSB7DQogICAgcm9vdC54ID0gZHggLyAyLCByb290LnkgPSBkeSAvIDI7DQogICAgaWYgKHJhZGl1cykgew0KICAgICAgcm9vdC5lYWNoQmVmb3JlKHJhZGl1c0xlYWYocmFkaXVzKSkNCiAgICAgICAgICAuZWFjaEFmdGVyKHBhY2tDaGlsZHJlbihwYWRkaW5nLCAwLjUpKQ0KICAgICAgICAgIC5lYWNoQmVmb3JlKHRyYW5zbGF0ZUNoaWxkKDEpKTsNCiAgICB9IGVsc2Ugew0KICAgICAgcm9vdC5lYWNoQmVmb3JlKHJhZGl1c0xlYWYoZGVmYXVsdFJhZGl1cykpDQogICAgICAgICAgLmVhY2hBZnRlcihwYWNrQ2hpbGRyZW4oY29uc3RhbnRaZXJvLCAxKSkNCiAgICAgICAgICAuZWFjaEFmdGVyKHBhY2tDaGlsZHJlbihwYWRkaW5nLCByb290LnIgLyBNYXRoLm1pbihkeCwgZHkpKSkNCiAgICAgICAgICAuZWFjaEJlZm9yZSh0cmFuc2xhdGVDaGlsZChNYXRoLm1pbihkeCwgZHkpIC8gKDIgKiByb290LnIpKSk7DQogICAgfQ0KICAgIHJldHVybiByb290Ow0KICB9DQoNCiAgcGFjay5yYWRpdXMgPSBmdW5jdGlvbih4KSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFkaXVzID0gb3B0aW9uYWwoeCksIHBhY2spIDogcmFkaXVzOw0KICB9Ow0KDQogIHBhY2suc2l6ZSA9IGZ1bmN0aW9uKHgpIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCBwYWNrKSA6IFtkeCwgZHldOw0KICB9Ow0KDQogIHBhY2sucGFkZGluZyA9IGZ1bmN0aW9uKHgpIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nID0gdHlwZW9mIHggPT09ICJmdW5jdGlvbiIgPyB4IDogY29uc3RhbnQoK3gpLCBwYWNrKSA6IHBhZGRpbmc7DQogIH07DQoNCiAgcmV0dXJuIHBhY2s7DQp9Ow0KDQpmdW5jdGlvbiByYWRpdXNMZWFmKHJhZGl1cykgew0KICByZXR1cm4gZnVuY3Rpb24obm9kZSkgew0KICAgIGlmICghbm9kZS5jaGlsZHJlbikgew0KICAgICAgbm9kZS5yID0gTWF0aC5tYXgoMCwgK3JhZGl1cyhub2RlKSB8fCAwKTsNCiAgICB9DQogIH07DQp9DQoNCmZ1bmN0aW9uIHBhY2tDaGlsZHJlbihwYWRkaW5nLCBrKSB7DQogIHJldHVybiBmdW5jdGlvbihub2RlKSB7DQogICAgaWYgKGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbikgew0KICAgICAgdmFyIGNoaWxkcmVuLA0KICAgICAgICAgIGksDQogICAgICAgICAgbiA9IGNoaWxkcmVuLmxlbmd0aCwNCiAgICAgICAgICByID0gcGFkZGluZyhub2RlKSAqIGsgfHwgMCwNCiAgICAgICAgICBlOw0KDQogICAgICBpZiAocikgZm9yIChpID0gMDsgaSA8IG47ICsraSkgY2hpbGRyZW5baV0uciArPSByOw0KICAgICAgZSA9IHBhY2tFbmNsb3NlKGNoaWxkcmVuKTsNCiAgICAgIGlmIChyKSBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBjaGlsZHJlbltpXS5yIC09IHI7DQogICAgICBub2RlLnIgPSBlICsgcjsNCiAgICB9DQogIH07DQp9DQoNCmZ1bmN0aW9uIHRyYW5zbGF0ZUNoaWxkKGspIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHsNCiAgICB2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnQ7DQogICAgbm9kZS5yICo9IGs7DQogICAgaWYgKHBhcmVudCkgew0KICAgICAgbm9kZS54ID0gcGFyZW50LnggKyBrICogbm9kZS54Ow0KICAgICAgbm9kZS55ID0gcGFyZW50LnkgKyBrICogbm9kZS55Ow0KICAgIH0NCiAgfTsNCn0NCg0KdmFyIHJvdW5kTm9kZSA9IGZ1bmN0aW9uKG5vZGUpIHsNCiAgbm9kZS54MCA9IE1hdGgucm91bmQobm9kZS54MCk7DQogIG5vZGUueTAgPSBNYXRoLnJvdW5kKG5vZGUueTApOw0KICBub2RlLngxID0gTWF0aC5yb3VuZChub2RlLngxKTsNCiAgbm9kZS55MSA9IE1hdGgucm91bmQobm9kZS55MSk7DQp9Ow0KDQp2YXIgdHJlZW1hcERpY2UgPSBmdW5jdGlvbihwYXJlbnQsIHgwLCB5MCwgeDEsIHkxKSB7DQogIHZhciBub2RlcyA9IHBhcmVudC5jaGlsZHJlbiwNCiAgICAgIG5vZGUsDQogICAgICBpID0gLTEsDQogICAgICBuID0gbm9kZXMubGVuZ3RoLA0KICAgICAgayA9IHBhcmVudC52YWx1ZSAmJiAoeDEgLSB4MCkgLyBwYXJlbnQudmFsdWU7DQoNCiAgd2hpbGUgKCsraSA8IG4pIHsNCiAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUueTAgPSB5MCwgbm9kZS55MSA9IHkxOw0KICAgIG5vZGUueDAgPSB4MCwgbm9kZS54MSA9IHgwICs9IG5vZGUudmFsdWUgKiBrOw0KICB9DQp9Ow0KDQp2YXIgcGFydGl0aW9uID0gZnVuY3Rpb24oKSB7DQogIHZhciBkeCA9IDEsDQogICAgICBkeSA9IDEsDQogICAgICBwYWRkaW5nID0gMCwNCiAgICAgIHJvdW5kID0gZmFsc2U7DQoNCiAgZnVuY3Rpb24gcGFydGl0aW9uKHJvb3QpIHsNCiAgICB2YXIgbiA9IHJvb3QuaGVpZ2h0ICsgMTsNCiAgICByb290LngwID0NCiAgICByb290LnkwID0gcGFkZGluZzsNCiAgICByb290LngxID0gZHg7DQogICAgcm9vdC55MSA9IGR5IC8gbjsNCiAgICByb290LmVhY2hCZWZvcmUocG9zaXRpb25Ob2RlKGR5LCBuKSk7DQogICAgaWYgKHJvdW5kKSByb290LmVhY2hCZWZvcmUocm91bmROb2RlKTsNCiAgICByZXR1cm4gcm9vdDsNCiAgfQ0KDQogIGZ1bmN0aW9uIHBvc2l0aW9uTm9kZShkeSwgbikgew0KICAgIHJldHVybiBmdW5jdGlvbihub2RlKSB7DQogICAgICBpZiAobm9kZS5jaGlsZHJlbikgew0KICAgICAgICB0cmVlbWFwRGljZShub2RlLCBub2RlLngwLCBkeSAqIChub2RlLmRlcHRoICsgMSkgLyBuLCBub2RlLngxLCBkeSAqIChub2RlLmRlcHRoICsgMikgLyBuKTsNCiAgICAgIH0NCiAgICAgIHZhciB4MCA9IG5vZGUueDAsDQogICAgICAgICAgeTAgPSBub2RlLnkwLA0KICAgICAgICAgIHgxID0gbm9kZS54MSAtIHBhZGRpbmcsDQogICAgICAgICAgeTEgPSBub2RlLnkxIC0gcGFkZGluZzsNCiAgICAgIGlmICh4MSA8IHgwKSB4MCA9IHgxID0gKHgwICsgeDEpIC8gMjsNCiAgICAgIGlmICh5MSA8IHkwKSB5MCA9IHkxID0gKHkwICsgeTEpIC8gMjsNCiAgICAgIG5vZGUueDAgPSB4MDsNCiAgICAgIG5vZGUueTAgPSB5MDsNCiAgICAgIG5vZGUueDEgPSB4MTsNCiAgICAgIG5vZGUueTEgPSB5MTsNCiAgICB9Ow0KICB9DQoNCiAgcGFydGl0aW9uLnJvdW5kID0gZnVuY3Rpb24oeCkgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJvdW5kID0gISF4LCBwYXJ0aXRpb24pIDogcm91bmQ7DQogIH07DQoNCiAgcGFydGl0aW9uLnNpemUgPSBmdW5jdGlvbih4KSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZHggPSAreFswXSwgZHkgPSAreFsxXSwgcGFydGl0aW9uKSA6IFtkeCwgZHldOw0KICB9Ow0KDQogIHBhcnRpdGlvbi5wYWRkaW5nID0gZnVuY3Rpb24oeCkgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmcgPSAreCwgcGFydGl0aW9uKSA6IHBhZGRpbmc7DQogIH07DQoNCiAgcmV0dXJuIHBhcnRpdGlvbjsNCn07DQoNCnZhciBrZXlQcmVmaXggPSAiJCI7DQp2YXIgcHJlcm9vdCA9IHtkZXB0aDogLTF9Ow0KdmFyIGFtYmlndW91cyA9IHt9Ow0KDQpmdW5jdGlvbiBkZWZhdWx0SWQoZCkgew0KICByZXR1cm4gZC5pZDsNCn0NCg0KZnVuY3Rpb24gZGVmYXVsdFBhcmVudElkKGQpIHsNCiAgcmV0dXJuIGQucGFyZW50SWQ7DQp9DQoNCnZhciBzdHJhdGlmeSA9IGZ1bmN0aW9uKCkgew0KICB2YXIgaWQgPSBkZWZhdWx0SWQsDQogICAgICBwYXJlbnRJZCA9IGRlZmF1bHRQYXJlbnRJZDsNCg0KICBmdW5jdGlvbiBzdHJhdGlmeShkYXRhKSB7DQogICAgdmFyIGQsDQogICAgICAgIGksDQogICAgICAgIG4gPSBkYXRhLmxlbmd0aCwNCiAgICAgICAgcm9vdCwNCiAgICAgICAgcGFyZW50LA0KICAgICAgICBub2RlLA0KICAgICAgICBub2RlcyA9IG5ldyBBcnJheShuKSwNCiAgICAgICAgbm9kZUlkLA0KICAgICAgICBub2RlS2V5LA0KICAgICAgICBub2RlQnlLZXkgPSB7fTsNCg0KICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsNCiAgICAgIGQgPSBkYXRhW2ldLCBub2RlID0gbm9kZXNbaV0gPSBuZXcgTm9kZShkKTsNCiAgICAgIGlmICgobm9kZUlkID0gaWQoZCwgaSwgZGF0YSkpICE9IG51bGwgJiYgKG5vZGVJZCArPSAiIikpIHsNCiAgICAgICAgbm9kZUtleSA9IGtleVByZWZpeCArIChub2RlLmlkID0gbm9kZUlkKTsNCiAgICAgICAgbm9kZUJ5S2V5W25vZGVLZXldID0gbm9kZUtleSBpbiBub2RlQnlLZXkgPyBhbWJpZ3VvdXMgOiBub2RlOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsNCiAgICAgIG5vZGUgPSBub2Rlc1tpXSwgbm9kZUlkID0gcGFyZW50SWQoZGF0YVtpXSwgaSwgZGF0YSk7DQogICAgICBpZiAobm9kZUlkID09IG51bGwgfHwgIShub2RlSWQgKz0gIiIpKSB7DQogICAgICAgIGlmIChyb290KSB0aHJvdyBuZXcgRXJyb3IoIm11bHRpcGxlIHJvb3RzIik7DQogICAgICAgIHJvb3QgPSBub2RlOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgcGFyZW50ID0gbm9kZUJ5S2V5W2tleVByZWZpeCArIG5vZGVJZF07DQogICAgICAgIGlmICghcGFyZW50KSB0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIgKyBub2RlSWQpOw0KICAgICAgICBpZiAocGFyZW50ID09PSBhbWJpZ3VvdXMpIHRocm93IG5ldyBFcnJvcigiYW1iaWd1b3VzOiAiICsgbm9kZUlkKTsNCiAgICAgICAgaWYgKHBhcmVudC5jaGlsZHJlbikgcGFyZW50LmNoaWxkcmVuLnB1c2gobm9kZSk7DQogICAgICAgIGVsc2UgcGFyZW50LmNoaWxkcmVuID0gW25vZGVdOw0KICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDsNCiAgICAgIH0NCiAgICB9DQoNCiAgICBpZiAoIXJvb3QpIHRocm93IG5ldyBFcnJvcigibm8gcm9vdCIpOw0KICAgIHJvb3QucGFyZW50ID0gcHJlcm9vdDsNCiAgICByb290LmVhY2hCZWZvcmUoZnVuY3Rpb24obm9kZSkgeyBub2RlLmRlcHRoID0gbm9kZS5wYXJlbnQuZGVwdGggKyAxOyAtLW47IH0pLmVhY2hCZWZvcmUoY29tcHV0ZUhlaWdodCk7DQogICAgcm9vdC5wYXJlbnQgPSBudWxsOw0KICAgIGlmIChuID4gMCkgdGhyb3cgbmV3IEVycm9yKCJjeWNsZSIpOw0KDQogICAgcmV0dXJuIHJvb3Q7DQogIH0NCg0KICBzdHJhdGlmeS5pZCA9IGZ1bmN0aW9uKHgpIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpZCA9IHJlcXVpcmVkKHgpLCBzdHJhdGlmeSkgOiBpZDsNCiAgfTsNCg0KICBzdHJhdGlmeS5wYXJlbnRJZCA9IGZ1bmN0aW9uKHgpIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYXJlbnRJZCA9IHJlcXVpcmVkKHgpLCBzdHJhdGlmeSkgOiBwYXJlbnRJZDsNCiAgfTsNCg0KICByZXR1cm4gc3RyYXRpZnk7DQp9Ow0KDQpmdW5jdGlvbiBkZWZhdWx0U2VwYXJhdGlvbiQxKGEsIGIpIHsNCiAgcmV0dXJuIGEucGFyZW50ID09PSBiLnBhcmVudCA/IDEgOiAyOw0KfQ0KDQovLyBmdW5jdGlvbiByYWRpYWxTZXBhcmF0aW9uKGEsIGIpIHsNCi8vICAgcmV0dXJuIChhLnBhcmVudCA9PT0gYi5wYXJlbnQgPyAxIDogMikgLyBhLmRlcHRoOw0KLy8gfQ0KDQovLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gdHJhdmVyc2UgdGhlIGxlZnQgY29udG91ciBvZiBhIHN1YnRyZWUgKG9yDQovLyBzdWJmb3Jlc3QpLiBJdCByZXR1cm5zIHRoZSBzdWNjZXNzb3Igb2YgdiBvbiB0aGlzIGNvbnRvdXIuIFRoaXMgc3VjY2Vzc29yIGlzDQovLyBlaXRoZXIgZ2l2ZW4gYnkgdGhlIGxlZnRtb3N0IGNoaWxkIG9mIHYgb3IgYnkgdGhlIHRocmVhZCBvZiB2LiBUaGUgZnVuY3Rpb24NCi8vIHJldHVybnMgbnVsbCBpZiBhbmQgb25seSBpZiB2IGlzIG9uIHRoZSBoaWdoZXN0IGxldmVsIG9mIGl0cyBzdWJ0cmVlLg0KZnVuY3Rpb24gbmV4dExlZnQodikgew0KICB2YXIgY2hpbGRyZW4gPSB2LmNoaWxkcmVuOw0KICByZXR1cm4gY2hpbGRyZW4gPyBjaGlsZHJlblswXSA6IHYudDsNCn0NCg0KLy8gVGhpcyBmdW5jdGlvbiB3b3JrcyBhbmFsb2dvdXNseSB0byBuZXh0TGVmdC4NCmZ1bmN0aW9uIG5leHRSaWdodCh2KSB7DQogIHZhciBjaGlsZHJlbiA9IHYuY2hpbGRyZW47DQogIHJldHVybiBjaGlsZHJlbiA/IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdIDogdi50Ow0KfQ0KDQovLyBTaGlmdHMgdGhlIGN1cnJlbnQgc3VidHJlZSByb290ZWQgYXQgdysuIFRoaXMgaXMgZG9uZSBieSBpbmNyZWFzaW5nDQovLyBwcmVsaW0odyspIGFuZCBtb2QodyspIGJ5IHNoaWZ0Lg0KZnVuY3Rpb24gbW92ZVN1YnRyZWUod20sIHdwLCBzaGlmdCkgew0KICB2YXIgY2hhbmdlID0gc2hpZnQgLyAod3AuaSAtIHdtLmkpOw0KICB3cC5jIC09IGNoYW5nZTsNCiAgd3AucyArPSBzaGlmdDsNCiAgd20uYyArPSBjaGFuZ2U7DQogIHdwLnogKz0gc2hpZnQ7DQogIHdwLm0gKz0gc2hpZnQ7DQp9DQoNCi8vIEFsbCBvdGhlciBzaGlmdHMsIGFwcGxpZWQgdG8gdGhlIHNtYWxsZXIgc3VidHJlZXMgYmV0d2VlbiB3LSBhbmQgdyssIGFyZQ0KLy8gcGVyZm9ybWVkIGJ5IHRoaXMgZnVuY3Rpb24uIFRvIHByZXBhcmUgdGhlIHNoaWZ0cywgd2UgaGF2ZSB0byBhZGp1c3QNCi8vIGNoYW5nZSh3KyksIHNoaWZ0KHcrKSwgYW5kIGNoYW5nZSh3LSkuDQpmdW5jdGlvbiBleGVjdXRlU2hpZnRzKHYpIHsNCiAgdmFyIHNoaWZ0ID0gMCwNCiAgICAgIGNoYW5nZSA9IDAsDQogICAgICBjaGlsZHJlbiA9IHYuY2hpbGRyZW4sDQogICAgICBpID0gY2hpbGRyZW4ubGVuZ3RoLA0KICAgICAgdzsNCiAgd2hpbGUgKC0taSA+PSAwKSB7DQogICAgdyA9IGNoaWxkcmVuW2ldOw0KICAgIHcueiArPSBzaGlmdDsNCiAgICB3Lm0gKz0gc2hpZnQ7DQogICAgc2hpZnQgKz0gdy5zICsgKGNoYW5nZSArPSB3LmMpOw0KICB9DQp9DQoNCi8vIElmIHZpLeKAmXMgYW5jZXN0b3IgaXMgYSBzaWJsaW5nIG9mIHYsIHJldHVybnMgdmkt4oCZcyBhbmNlc3Rvci4gT3RoZXJ3aXNlLA0KLy8gcmV0dXJucyB0aGUgc3BlY2lmaWVkIChkZWZhdWx0KSBhbmNlc3Rvci4NCmZ1bmN0aW9uIG5leHRBbmNlc3Rvcih2aW0sIHYsIGFuY2VzdG9yKSB7DQogIHJldHVybiB2aW0uYS5wYXJlbnQgPT09IHYucGFyZW50ID8gdmltLmEgOiBhbmNlc3RvcjsNCn0NCg0KZnVuY3Rpb24gVHJlZU5vZGUobm9kZSwgaSkgew0KICB0aGlzLl8gPSBub2RlOw0KICB0aGlzLnBhcmVudCA9IG51bGw7DQogIHRoaXMuY2hpbGRyZW4gPSBudWxsOw0KICB0aGlzLkEgPSBudWxsOyAvLyBkZWZhdWx0IGFuY2VzdG9yDQogIHRoaXMuYSA9IHRoaXM7IC8vIGFuY2VzdG9yDQogIHRoaXMueiA9IDA7IC8vIHByZWxpbQ0KICB0aGlzLm0gPSAwOyAvLyBtb2QNCiAgdGhpcy5jID0gMDsgLy8gY2hhbmdlDQogIHRoaXMucyA9IDA7IC8vIHNoaWZ0DQogIHRoaXMudCA9IG51bGw7IC8vIHRocmVhZA0KICB0aGlzLmkgPSBpOyAvLyBudW1iZXINCn0NCg0KVHJlZU5vZGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShOb2RlLnByb3RvdHlwZSk7DQoNCmZ1bmN0aW9uIHRyZWVSb290KHJvb3QpIHsNCiAgdmFyIHRyZWUgPSBuZXcgVHJlZU5vZGUocm9vdCwgMCksDQogICAgICBub2RlLA0KICAgICAgbm9kZXMgPSBbdHJlZV0sDQogICAgICBjaGlsZCwNCiAgICAgIGNoaWxkcmVuLA0KICAgICAgaSwNCiAgICAgIG47DQoNCiAgd2hpbGUgKG5vZGUgPSBub2Rlcy5wb3AoKSkgew0KICAgIGlmIChjaGlsZHJlbiA9IG5vZGUuXy5jaGlsZHJlbikgew0KICAgICAgbm9kZS5jaGlsZHJlbiA9IG5ldyBBcnJheShuID0gY2hpbGRyZW4ubGVuZ3RoKTsNCiAgICAgIGZvciAoaSA9IG4gLSAxOyBpID49IDA7IC0taSkgew0KICAgICAgICBub2Rlcy5wdXNoKGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXSA9IG5ldyBUcmVlTm9kZShjaGlsZHJlbltpXSwgaSkpOw0KICAgICAgICBjaGlsZC5wYXJlbnQgPSBub2RlOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogICh0cmVlLnBhcmVudCA9IG5ldyBUcmVlTm9kZShudWxsLCAwKSkuY2hpbGRyZW4gPSBbdHJlZV07DQogIHJldHVybiB0cmVlOw0KfQ0KDQovLyBOb2RlLWxpbmsgdHJlZSBkaWFncmFtIHVzaW5nIHRoZSBSZWluZ29sZC1UaWxmb3JkICJ0aWR5IiBhbGdvcml0aG0NCnZhciB0cmVlID0gZnVuY3Rpb24oKSB7DQogIHZhciBzZXBhcmF0aW9uID0gZGVmYXVsdFNlcGFyYXRpb24kMSwNCiAgICAgIGR4ID0gMSwNCiAgICAgIGR5ID0gMSwNCiAgICAgIG5vZGVTaXplID0gbnVsbDsNCg0KICBmdW5jdGlvbiB0cmVlKHJvb3QpIHsNCiAgICB2YXIgdCA9IHRyZWVSb290KHJvb3QpOw0KDQogICAgLy8gQ29tcHV0ZSB0aGUgbGF5b3V0IHVzaW5nIEJ1Y2hoZWltIGV0IGFsLuKAmXMgYWxnb3JpdGhtLg0KICAgIHQuZWFjaEFmdGVyKGZpcnN0V2FsayksIHQucGFyZW50Lm0gPSAtdC56Ow0KICAgIHQuZWFjaEJlZm9yZShzZWNvbmRXYWxrKTsNCg0KICAgIC8vIElmIGEgZml4ZWQgbm9kZSBzaXplIGlzIHNwZWNpZmllZCwgc2NhbGUgeCBhbmQgeS4NCiAgICBpZiAobm9kZVNpemUpIHJvb3QuZWFjaEJlZm9yZShzaXplTm9kZSk7DQoNCiAgICAvLyBJZiBhIGZpeGVkIHRyZWUgc2l6ZSBpcyBzcGVjaWZpZWQsIHNjYWxlIHggYW5kIHkgYmFzZWQgb24gdGhlIGV4dGVudC4NCiAgICAvLyBDb21wdXRlIHRoZSBsZWZ0LW1vc3QsIHJpZ2h0LW1vc3QsIGFuZCBkZXB0aC1tb3N0IG5vZGVzIGZvciBleHRlbnRzLg0KICAgIGVsc2Ugew0KICAgICAgdmFyIGxlZnQgPSByb290LA0KICAgICAgICAgIHJpZ2h0ID0gcm9vdCwNCiAgICAgICAgICBib3R0b20gPSByb290Ow0KICAgICAgcm9vdC5lYWNoQmVmb3JlKGZ1bmN0aW9uKG5vZGUpIHsNCiAgICAgICAgaWYgKG5vZGUueCA8IGxlZnQueCkgbGVmdCA9IG5vZGU7DQogICAgICAgIGlmIChub2RlLnggPiByaWdodC54KSByaWdodCA9IG5vZGU7DQogICAgICAgIGlmIChub2RlLmRlcHRoID4gYm90dG9tLmRlcHRoKSBib3R0b20gPSBub2RlOw0KICAgICAgfSk7DQogICAgICB2YXIgcyA9IGxlZnQgPT09IHJpZ2h0ID8gMSA6IHNlcGFyYXRpb24obGVmdCwgcmlnaHQpIC8gMiwNCiAgICAgICAgICB0eCA9IHMgLSBsZWZ0LngsDQogICAgICAgICAga3ggPSBkeCAvIChyaWdodC54ICsgcyArIHR4KSwNCiAgICAgICAgICBreSA9IGR5IC8gKGJvdHRvbS5kZXB0aCB8fCAxKTsNCiAgICAgIHJvb3QuZWFjaEJlZm9yZShmdW5jdGlvbihub2RlKSB7DQogICAgICAgIG5vZGUueCA9IChub2RlLnggKyB0eCkgKiBreDsNCiAgICAgICAgbm9kZS55ID0gbm9kZS5kZXB0aCAqIGt5Ow0KICAgICAgfSk7DQogICAgfQ0KDQogICAgcmV0dXJuIHJvb3Q7DQogIH0NCg0KICAvLyBDb21wdXRlcyBhIHByZWxpbWluYXJ5IHgtY29vcmRpbmF0ZSBmb3Igdi4gQmVmb3JlIHRoYXQsIEZJUlNUIFdBTEsgaXMNCiAgLy8gYXBwbGllZCByZWN1cnNpdmVseSB0byB0aGUgY2hpbGRyZW4gb2YgdiwgYXMgd2VsbCBhcyB0aGUgZnVuY3Rpb24NCiAgLy8gQVBQT1JUSU9OLiBBZnRlciBzcGFjaW5nIG91dCB0aGUgY2hpbGRyZW4gYnkgY2FsbGluZyBFWEVDVVRFIFNISUZUUywgdGhlDQogIC8vIG5vZGUgdiBpcyBwbGFjZWQgdG8gdGhlIG1pZHBvaW50IG9mIGl0cyBvdXRlcm1vc3QgY2hpbGRyZW4uDQogIGZ1bmN0aW9uIGZpcnN0V2Fsayh2KSB7DQogICAgdmFyIGNoaWxkcmVuID0gdi5jaGlsZHJlbiwNCiAgICAgICAgc2libGluZ3MgPSB2LnBhcmVudC5jaGlsZHJlbiwNCiAgICAgICAgdyA9IHYuaSA/IHNpYmxpbmdzW3YuaSAtIDFdIDogbnVsbDsNCiAgICBpZiAoY2hpbGRyZW4pIHsNCiAgICAgIGV4ZWN1dGVTaGlmdHModik7DQogICAgICB2YXIgbWlkcG9pbnQgPSAoY2hpbGRyZW5bMF0ueiArIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLnopIC8gMjsNCiAgICAgIGlmICh3KSB7DQogICAgICAgIHYueiA9IHcueiArIHNlcGFyYXRpb24odi5fLCB3Ll8pOw0KICAgICAgICB2Lm0gPSB2LnogLSBtaWRwb2ludDsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHYueiA9IG1pZHBvaW50Ow0KICAgICAgfQ0KICAgIH0gZWxzZSBpZiAodykgew0KICAgICAgdi56ID0gdy56ICsgc2VwYXJhdGlvbih2Ll8sIHcuXyk7DQogICAgfQ0KICAgIHYucGFyZW50LkEgPSBhcHBvcnRpb24odiwgdywgdi5wYXJlbnQuQSB8fCBzaWJsaW5nc1swXSk7DQogIH0NCg0KICAvLyBDb21wdXRlcyBhbGwgcmVhbCB4LWNvb3JkaW5hdGVzIGJ5IHN1bW1pbmcgdXAgdGhlIG1vZGlmaWVycyByZWN1cnNpdmVseS4NCiAgZnVuY3Rpb24gc2Vjb25kV2Fsayh2KSB7DQogICAgdi5fLnggPSB2LnogKyB2LnBhcmVudC5tOw0KICAgIHYubSArPSB2LnBhcmVudC5tOw0KICB9DQoNCiAgLy8gVGhlIGNvcmUgb2YgdGhlIGFsZ29yaXRobS4gSGVyZSwgYSBuZXcgc3VidHJlZSBpcyBjb21iaW5lZCB3aXRoIHRoZQ0KICAvLyBwcmV2aW91cyBzdWJ0cmVlcy4gVGhyZWFkcyBhcmUgdXNlZCB0byB0cmF2ZXJzZSB0aGUgaW5zaWRlIGFuZCBvdXRzaWRlDQogIC8vIGNvbnRvdXJzIG9mIHRoZSBsZWZ0IGFuZCByaWdodCBzdWJ0cmVlIHVwIHRvIHRoZSBoaWdoZXN0IGNvbW1vbiBsZXZlbC4gVGhlDQogIC8vIHZlcnRpY2VzIHVzZWQgZm9yIHRoZSB0cmF2ZXJzYWxzIGFyZSB2aSssIHZpLSwgdm8tLCBhbmQgdm8rLCB3aGVyZSB0aGUNCiAgLy8gc3VwZXJzY3JpcHQgbyBtZWFucyBvdXRzaWRlIGFuZCBpIG1lYW5zIGluc2lkZSwgdGhlIHN1YnNjcmlwdCAtIG1lYW5zIGxlZnQNCiAgLy8gc3VidHJlZSBhbmQgKyBtZWFucyByaWdodCBzdWJ0cmVlLiBGb3Igc3VtbWluZyB1cCB0aGUgbW9kaWZpZXJzIGFsb25nIHRoZQ0KICAvLyBjb250b3VyLCB3ZSB1c2UgcmVzcGVjdGl2ZSB2YXJpYWJsZXMgc2krLCBzaS0sIHNvLSwgYW5kIHNvKy4gV2hlbmV2ZXIgdHdvDQogIC8vIG5vZGVzIG9mIHRoZSBpbnNpZGUgY29udG91cnMgY29uZmxpY3QsIHdlIGNvbXB1dGUgdGhlIGxlZnQgb25lIG9mIHRoZQ0KICAvLyBncmVhdGVzdCB1bmNvbW1vbiBhbmNlc3RvcnMgdXNpbmcgdGhlIGZ1bmN0aW9uIEFOQ0VTVE9SIGFuZCBjYWxsIE1PVkUNCiAgLy8gU1VCVFJFRSB0byBzaGlmdCB0aGUgc3VidHJlZSBhbmQgcHJlcGFyZSB0aGUgc2hpZnRzIG9mIHNtYWxsZXIgc3VidHJlZXMuDQogIC8vIEZpbmFsbHksIHdlIGFkZCBhIG5ldyB0aHJlYWQgKGlmIG5lY2Vzc2FyeSkuDQogIGZ1bmN0aW9uIGFwcG9ydGlvbih2LCB3LCBhbmNlc3Rvcikgew0KICAgIGlmICh3KSB7DQogICAgICB2YXIgdmlwID0gdiwNCiAgICAgICAgICB2b3AgPSB2LA0KICAgICAgICAgIHZpbSA9IHcsDQogICAgICAgICAgdm9tID0gdmlwLnBhcmVudC5jaGlsZHJlblswXSwNCiAgICAgICAgICBzaXAgPSB2aXAubSwNCiAgICAgICAgICBzb3AgPSB2b3AubSwNCiAgICAgICAgICBzaW0gPSB2aW0ubSwNCiAgICAgICAgICBzb20gPSB2b20ubSwNCiAgICAgICAgICBzaGlmdDsNCiAgICAgIHdoaWxlICh2aW0gPSBuZXh0UmlnaHQodmltKSwgdmlwID0gbmV4dExlZnQodmlwKSwgdmltICYmIHZpcCkgew0KICAgICAgICB2b20gPSBuZXh0TGVmdCh2b20pOw0KICAgICAgICB2b3AgPSBuZXh0UmlnaHQodm9wKTsNCiAgICAgICAgdm9wLmEgPSB2Ow0KICAgICAgICBzaGlmdCA9IHZpbS56ICsgc2ltIC0gdmlwLnogLSBzaXAgKyBzZXBhcmF0aW9uKHZpbS5fLCB2aXAuXyk7DQogICAgICAgIGlmIChzaGlmdCA+IDApIHsNCiAgICAgICAgICBtb3ZlU3VidHJlZShuZXh0QW5jZXN0b3IodmltLCB2LCBhbmNlc3RvciksIHYsIHNoaWZ0KTsNCiAgICAgICAgICBzaXAgKz0gc2hpZnQ7DQogICAgICAgICAgc29wICs9IHNoaWZ0Ow0KICAgICAgICB9DQogICAgICAgIHNpbSArPSB2aW0ubTsNCiAgICAgICAgc2lwICs9IHZpcC5tOw0KICAgICAgICBzb20gKz0gdm9tLm07DQogICAgICAgIHNvcCArPSB2b3AubTsNCiAgICAgIH0NCiAgICAgIGlmICh2aW0gJiYgIW5leHRSaWdodCh2b3ApKSB7DQogICAgICAgIHZvcC50ID0gdmltOw0KICAgICAgICB2b3AubSArPSBzaW0gLSBzb3A7DQogICAgICB9DQogICAgICBpZiAodmlwICYmICFuZXh0TGVmdCh2b20pKSB7DQogICAgICAgIHZvbS50ID0gdmlwOw0KICAgICAgICB2b20ubSArPSBzaXAgLSBzb207DQogICAgICAgIGFuY2VzdG9yID0gdjsNCiAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIGFuY2VzdG9yOw0KICB9DQoNCiAgZnVuY3Rpb24gc2l6ZU5vZGUobm9kZSkgew0KICAgIG5vZGUueCAqPSBkeDsNCiAgICBub2RlLnkgPSBub2RlLmRlcHRoICogZHk7DQogIH0NCg0KICB0cmVlLnNlcGFyYXRpb24gPSBmdW5jdGlvbih4KSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2VwYXJhdGlvbiA9IHgsIHRyZWUpIDogc2VwYXJhdGlvbjsNCiAgfTsNCg0KICB0cmVlLnNpemUgPSBmdW5jdGlvbih4KSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobm9kZVNpemUgPSBmYWxzZSwgZHggPSAreFswXSwgZHkgPSAreFsxXSwgdHJlZSkgOiAobm9kZVNpemUgPyBudWxsIDogW2R4LCBkeV0pOw0KICB9Ow0KDQogIHRyZWUubm9kZVNpemUgPSBmdW5jdGlvbih4KSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobm9kZVNpemUgPSB0cnVlLCBkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCB0cmVlKSA6IChub2RlU2l6ZSA/IFtkeCwgZHldIDogbnVsbCk7DQogIH07DQoNCiAgcmV0dXJuIHRyZWU7DQp9Ow0KDQp2YXIgdHJlZW1hcFNsaWNlID0gZnVuY3Rpb24ocGFyZW50LCB4MCwgeTAsIHgxLCB5MSkgew0KICB2YXIgbm9kZXMgPSBwYXJlbnQuY2hpbGRyZW4sDQogICAgICBub2RlLA0KICAgICAgaSA9IC0xLA0KICAgICAgbiA9IG5vZGVzLmxlbmd0aCwNCiAgICAgIGsgPSBwYXJlbnQudmFsdWUgJiYgKHkxIC0geTApIC8gcGFyZW50LnZhbHVlOw0KDQogIHdoaWxlICgrK2kgPCBuKSB7DQogICAgbm9kZSA9IG5vZGVzW2ldLCBub2RlLngwID0geDAsIG5vZGUueDEgPSB4MTsNCiAgICBub2RlLnkwID0geTAsIG5vZGUueTEgPSB5MCArPSBub2RlLnZhbHVlICogazsNCiAgfQ0KfTsNCg0KdmFyIHBoaSA9ICgxICsgTWF0aC5zcXJ0KDUpKSAvIDI7DQoNCmZ1bmN0aW9uIHNxdWFyaWZ5UmF0aW8ocmF0aW8sIHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHsNCiAgdmFyIHJvd3MgPSBbXSwNCiAgICAgIG5vZGVzID0gcGFyZW50LmNoaWxkcmVuLA0KICAgICAgcm93LA0KICAgICAgbm9kZVZhbHVlLA0KICAgICAgaTAgPSAwLA0KICAgICAgaTEgPSAwLA0KICAgICAgbiA9IG5vZGVzLmxlbmd0aCwNCiAgICAgIGR4LCBkeSwNCiAgICAgIHZhbHVlID0gcGFyZW50LnZhbHVlLA0KICAgICAgc3VtVmFsdWUsDQogICAgICBtaW5WYWx1ZSwNCiAgICAgIG1heFZhbHVlLA0KICAgICAgbmV3UmF0aW8sDQogICAgICBtaW5SYXRpbywNCiAgICAgIGFscGhhLA0KICAgICAgYmV0YTsNCg0KICB3aGlsZSAoaTAgPCBuKSB7DQogICAgZHggPSB4MSAtIHgwLCBkeSA9IHkxIC0geTA7DQoNCiAgICAvLyBGaW5kIHRoZSBuZXh0IG5vbi1lbXB0eSBub2RlLg0KICAgIGRvIHN1bVZhbHVlID0gbm9kZXNbaTErK10udmFsdWU7IHdoaWxlICghc3VtVmFsdWUgJiYgaTEgPCBuKTsNCiAgICBtaW5WYWx1ZSA9IG1heFZhbHVlID0gc3VtVmFsdWU7DQogICAgYWxwaGEgPSBNYXRoLm1heChkeSAvIGR4LCBkeCAvIGR5KSAvICh2YWx1ZSAqIHJhdGlvKTsNCiAgICBiZXRhID0gc3VtVmFsdWUgKiBzdW1WYWx1ZSAqIGFscGhhOw0KICAgIG1pblJhdGlvID0gTWF0aC5tYXgobWF4VmFsdWUgLyBiZXRhLCBiZXRhIC8gbWluVmFsdWUpOw0KDQogICAgLy8gS2VlcCBhZGRpbmcgbm9kZXMgd2hpbGUgdGhlIGFzcGVjdCByYXRpbyBtYWludGFpbnMgb3IgaW1wcm92ZXMuDQogICAgZm9yICg7IGkxIDwgbjsgKytpMSkgew0KICAgICAgc3VtVmFsdWUgKz0gbm9kZVZhbHVlID0gbm9kZXNbaTFdLnZhbHVlOw0KICAgICAgaWYgKG5vZGVWYWx1ZSA8IG1pblZhbHVlKSBtaW5WYWx1ZSA9IG5vZGVWYWx1ZTsNCiAgICAgIGlmIChub2RlVmFsdWUgPiBtYXhWYWx1ZSkgbWF4VmFsdWUgPSBub2RlVmFsdWU7DQogICAgICBiZXRhID0gc3VtVmFsdWUgKiBzdW1WYWx1ZSAqIGFscGhhOw0KICAgICAgbmV3UmF0aW8gPSBNYXRoLm1heChtYXhWYWx1ZSAvIGJldGEsIGJldGEgLyBtaW5WYWx1ZSk7DQogICAgICBpZiAobmV3UmF0aW8gPiBtaW5SYXRpbykgeyBzdW1WYWx1ZSAtPSBub2RlVmFsdWU7IGJyZWFrOyB9DQogICAgICBtaW5SYXRpbyA9IG5ld1JhdGlvOw0KICAgIH0NCg0KICAgIC8vIFBvc2l0aW9uIGFuZCByZWNvcmQgdGhlIHJvdyBvcmllbnRhdGlvbi4NCiAgICByb3dzLnB1c2gocm93ID0ge3ZhbHVlOiBzdW1WYWx1ZSwgZGljZTogZHggPCBkeSwgY2hpbGRyZW46IG5vZGVzLnNsaWNlKGkwLCBpMSl9KTsNCiAgICBpZiAocm93LmRpY2UpIHRyZWVtYXBEaWNlKHJvdywgeDAsIHkwLCB4MSwgdmFsdWUgPyB5MCArPSBkeSAqIHN1bVZhbHVlIC8gdmFsdWUgOiB5MSk7DQogICAgZWxzZSB0cmVlbWFwU2xpY2Uocm93LCB4MCwgeTAsIHZhbHVlID8geDAgKz0gZHggKiBzdW1WYWx1ZSAvIHZhbHVlIDogeDEsIHkxKTsNCiAgICB2YWx1ZSAtPSBzdW1WYWx1ZSwgaTAgPSBpMTsNCiAgfQ0KDQogIHJldHVybiByb3dzOw0KfQ0KDQp2YXIgc3F1YXJpZnkgPSAoKGZ1bmN0aW9uIGN1c3RvbShyYXRpbykgew0KDQogIGZ1bmN0aW9uIHNxdWFyaWZ5KHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHsNCiAgICBzcXVhcmlmeVJhdGlvKHJhdGlvLCBwYXJlbnQsIHgwLCB5MCwgeDEsIHkxKTsNCiAgfQ0KDQogIHNxdWFyaWZ5LnJhdGlvID0gZnVuY3Rpb24oeCkgew0KICAgIHJldHVybiBjdXN0b20oKHggPSAreCkgPiAxID8geCA6IDEpOw0KICB9Ow0KDQogIHJldHVybiBzcXVhcmlmeTsNCn0pKShwaGkpOw0KDQp2YXIgaW5kZXgkMSA9IGZ1bmN0aW9uKCkgew0KICB2YXIgdGlsZSA9IHNxdWFyaWZ5LA0KICAgICAgcm91bmQgPSBmYWxzZSwNCiAgICAgIGR4ID0gMSwNCiAgICAgIGR5ID0gMSwNCiAgICAgIHBhZGRpbmdTdGFjayA9IFswXSwNCiAgICAgIHBhZGRpbmdJbm5lciA9IGNvbnN0YW50WmVybywNCiAgICAgIHBhZGRpbmdUb3AgPSBjb25zdGFudFplcm8sDQogICAgICBwYWRkaW5nUmlnaHQgPSBjb25zdGFudFplcm8sDQogICAgICBwYWRkaW5nQm90dG9tID0gY29uc3RhbnRaZXJvLA0KICAgICAgcGFkZGluZ0xlZnQgPSBjb25zdGFudFplcm87DQoNCiAgZnVuY3Rpb24gdHJlZW1hcChyb290KSB7DQogICAgcm9vdC54MCA9DQogICAgcm9vdC55MCA9IDA7DQogICAgcm9vdC54MSA9IGR4Ow0KICAgIHJvb3QueTEgPSBkeTsNCiAgICByb290LmVhY2hCZWZvcmUocG9zaXRpb25Ob2RlKTsNCiAgICBwYWRkaW5nU3RhY2sgPSBbMF07DQogICAgaWYgKHJvdW5kKSByb290LmVhY2hCZWZvcmUocm91bmROb2RlKTsNCiAgICByZXR1cm4gcm9vdDsNCiAgfQ0KDQogIGZ1bmN0aW9uIHBvc2l0aW9uTm9kZShub2RlKSB7DQogICAgdmFyIHAgPSBwYWRkaW5nU3RhY2tbbm9kZS5kZXB0aF0sDQogICAgICAgIHgwID0gbm9kZS54MCArIHAsDQogICAgICAgIHkwID0gbm9kZS55MCArIHAsDQogICAgICAgIHgxID0gbm9kZS54MSAtIHAsDQogICAgICAgIHkxID0gbm9kZS55MSAtIHA7DQogICAgaWYgKHgxIDwgeDApIHgwID0geDEgPSAoeDAgKyB4MSkgLyAyOw0KICAgIGlmICh5MSA8IHkwKSB5MCA9IHkxID0gKHkwICsgeTEpIC8gMjsNCiAgICBub2RlLngwID0geDA7DQogICAgbm9kZS55MCA9IHkwOw0KICAgIG5vZGUueDEgPSB4MTsNCiAgICBub2RlLnkxID0geTE7DQogICAgaWYgKG5vZGUuY2hpbGRyZW4pIHsNCiAgICAgIHAgPSBwYWRkaW5nU3RhY2tbbm9kZS5kZXB0aCArIDFdID0gcGFkZGluZ0lubmVyKG5vZGUpIC8gMjsNCiAgICAgIHgwICs9IHBhZGRpbmdMZWZ0KG5vZGUpIC0gcDsNCiAgICAgIHkwICs9IHBhZGRpbmdUb3Aobm9kZSkgLSBwOw0KICAgICAgeDEgLT0gcGFkZGluZ1JpZ2h0KG5vZGUpIC0gcDsNCiAgICAgIHkxIC09IHBhZGRpbmdCb3R0b20obm9kZSkgLSBwOw0KICAgICAgaWYgKHgxIDwgeDApIHgwID0geDEgPSAoeDAgKyB4MSkgLyAyOw0KICAgICAgaWYgKHkxIDwgeTApIHkwID0geTEgPSAoeTAgKyB5MSkgLyAyOw0KICAgICAgdGlsZShub2RlLCB4MCwgeTAsIHgxLCB5MSk7DQogICAgfQ0KICB9DQoNCiAgdHJlZW1hcC5yb3VuZCA9IGZ1bmN0aW9uKHgpIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyb3VuZCA9ICEheCwgdHJlZW1hcCkgOiByb3VuZDsNCiAgfTsNCg0KICB0cmVlbWFwLnNpemUgPSBmdW5jdGlvbih4KSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZHggPSAreFswXSwgZHkgPSAreFsxXSwgdHJlZW1hcCkgOiBbZHgsIGR5XTsNCiAgfTsNCg0KICB0cmVlbWFwLnRpbGUgPSBmdW5jdGlvbih4KSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlsZSA9IHJlcXVpcmVkKHgpLCB0cmVlbWFwKSA6IHRpbGU7DQogIH07DQoNCiAgdHJlZW1hcC5wYWRkaW5nID0gZnVuY3Rpb24oeCkgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gdHJlZW1hcC5wYWRkaW5nSW5uZXIoeCkucGFkZGluZ091dGVyKHgpIDogdHJlZW1hcC5wYWRkaW5nSW5uZXIoKTsNCiAgfTsNCg0KICB0cmVlbWFwLnBhZGRpbmdJbm5lciA9IGZ1bmN0aW9uKHgpIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nSW5uZXIgPSB0eXBlb2YgeCA9PT0gImZ1bmN0aW9uIiA/IHggOiBjb25zdGFudCgreCksIHRyZWVtYXApIDogcGFkZGluZ0lubmVyOw0KICB9Ow0KDQogIHRyZWVtYXAucGFkZGluZ091dGVyID0gZnVuY3Rpb24oeCkgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gdHJlZW1hcC5wYWRkaW5nVG9wKHgpLnBhZGRpbmdSaWdodCh4KS5wYWRkaW5nQm90dG9tKHgpLnBhZGRpbmdMZWZ0KHgpIDogdHJlZW1hcC5wYWRkaW5nVG9wKCk7DQogIH07DQoNCiAgdHJlZW1hcC5wYWRkaW5nVG9wID0gZnVuY3Rpb24oeCkgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdUb3AgPSB0eXBlb2YgeCA9PT0gImZ1bmN0aW9uIiA/IHggOiBjb25zdGFudCgreCksIHRyZWVtYXApIDogcGFkZGluZ1RvcDsNCiAgfTsNCg0KICB0cmVlbWFwLnBhZGRpbmdSaWdodCA9IGZ1bmN0aW9uKHgpIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nUmlnaHQgPSB0eXBlb2YgeCA9PT0gImZ1bmN0aW9uIiA/IHggOiBjb25zdGFudCgreCksIHRyZWVtYXApIDogcGFkZGluZ1JpZ2h0Ow0KICB9Ow0KDQogIHRyZWVtYXAucGFkZGluZ0JvdHRvbSA9IGZ1bmN0aW9uKHgpIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nQm90dG9tID0gdHlwZW9mIHggPT09ICJmdW5jdGlvbiIgPyB4IDogY29uc3RhbnQoK3gpLCB0cmVlbWFwKSA6IHBhZGRpbmdCb3R0b207DQogIH07DQoNCiAgdHJlZW1hcC5wYWRkaW5nTGVmdCA9IGZ1bmN0aW9uKHgpIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nTGVmdCA9IHR5cGVvZiB4ID09PSAiZnVuY3Rpb24iID8geCA6IGNvbnN0YW50KCt4KSwgdHJlZW1hcCkgOiBwYWRkaW5nTGVmdDsNCiAgfTsNCg0KICByZXR1cm4gdHJlZW1hcDsNCn07DQoNCnZhciBiaW5hcnkgPSBmdW5jdGlvbihwYXJlbnQsIHgwLCB5MCwgeDEsIHkxKSB7DQogIHZhciBub2RlcyA9IHBhcmVudC5jaGlsZHJlbiwNCiAgICAgIGksIG4gPSBub2Rlcy5sZW5ndGgsDQogICAgICBzdW0sIHN1bXMgPSBuZXcgQXJyYXkobiArIDEpOw0KDQogIGZvciAoc3Vtc1swXSA9IHN1bSA9IGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgc3Vtc1tpICsgMV0gPSBzdW0gKz0gbm9kZXNbaV0udmFsdWU7DQogIH0NCg0KICBwYXJ0aXRpb24oMCwgbiwgcGFyZW50LnZhbHVlLCB4MCwgeTAsIHgxLCB5MSk7DQoNCiAgZnVuY3Rpb24gcGFydGl0aW9uKGksIGosIHZhbHVlLCB4MCwgeTAsIHgxLCB5MSkgew0KICAgIGlmIChpID49IGogLSAxKSB7DQogICAgICB2YXIgbm9kZSA9IG5vZGVzW2ldOw0KICAgICAgbm9kZS54MCA9IHgwLCBub2RlLnkwID0geTA7DQogICAgICBub2RlLngxID0geDEsIG5vZGUueTEgPSB5MTsNCiAgICAgIHJldHVybjsNCiAgICB9DQoNCiAgICB2YXIgdmFsdWVPZmZzZXQgPSBzdW1zW2ldLA0KICAgICAgICB2YWx1ZVRhcmdldCA9ICh2YWx1ZSAvIDIpICsgdmFsdWVPZmZzZXQsDQogICAgICAgIGsgPSBpICsgMSwNCiAgICAgICAgaGkgPSBqIC0gMTsNCg0KICAgIHdoaWxlIChrIDwgaGkpIHsNCiAgICAgIHZhciBtaWQgPSBrICsgaGkgPj4+IDE7DQogICAgICBpZiAoc3Vtc1ttaWRdIDwgdmFsdWVUYXJnZXQpIGsgPSBtaWQgKyAxOw0KICAgICAgZWxzZSBoaSA9IG1pZDsNCiAgICB9DQoNCiAgICBpZiAoKHZhbHVlVGFyZ2V0IC0gc3Vtc1trIC0gMV0pIDwgKHN1bXNba10gLSB2YWx1ZVRhcmdldCkgJiYgaSArIDEgPCBrKSAtLWs7DQoNCiAgICB2YXIgdmFsdWVMZWZ0ID0gc3Vtc1trXSAtIHZhbHVlT2Zmc2V0LA0KICAgICAgICB2YWx1ZVJpZ2h0ID0gdmFsdWUgLSB2YWx1ZUxlZnQ7DQoNCiAgICBpZiAoKHgxIC0geDApID4gKHkxIC0geTApKSB7DQogICAgICB2YXIgeGsgPSAoeDAgKiB2YWx1ZVJpZ2h0ICsgeDEgKiB2YWx1ZUxlZnQpIC8gdmFsdWU7DQogICAgICBwYXJ0aXRpb24oaSwgaywgdmFsdWVMZWZ0LCB4MCwgeTAsIHhrLCB5MSk7DQogICAgICBwYXJ0aXRpb24oaywgaiwgdmFsdWVSaWdodCwgeGssIHkwLCB4MSwgeTEpOw0KICAgIH0gZWxzZSB7DQogICAgICB2YXIgeWsgPSAoeTAgKiB2YWx1ZVJpZ2h0ICsgeTEgKiB2YWx1ZUxlZnQpIC8gdmFsdWU7DQogICAgICBwYXJ0aXRpb24oaSwgaywgdmFsdWVMZWZ0LCB4MCwgeTAsIHgxLCB5ayk7DQogICAgICBwYXJ0aXRpb24oaywgaiwgdmFsdWVSaWdodCwgeDAsIHlrLCB4MSwgeTEpOw0KICAgIH0NCiAgfQ0KfTsNCg0KdmFyIHNsaWNlRGljZSA9IGZ1bmN0aW9uKHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHsNCiAgKHBhcmVudC5kZXB0aCAmIDEgPyB0cmVlbWFwU2xpY2UgOiB0cmVlbWFwRGljZSkocGFyZW50LCB4MCwgeTAsIHgxLCB5MSk7DQp9Ow0KDQp2YXIgcmVzcXVhcmlmeSA9ICgoZnVuY3Rpb24gY3VzdG9tKHJhdGlvKSB7DQoNCiAgZnVuY3Rpb24gcmVzcXVhcmlmeShwYXJlbnQsIHgwLCB5MCwgeDEsIHkxKSB7DQogICAgaWYgKChyb3dzID0gcGFyZW50Ll9zcXVhcmlmeSkgJiYgKHJvd3MucmF0aW8gPT09IHJhdGlvKSkgew0KICAgICAgdmFyIHJvd3MsDQogICAgICAgICAgcm93LA0KICAgICAgICAgIG5vZGVzLA0KICAgICAgICAgIGksDQogICAgICAgICAgaiA9IC0xLA0KICAgICAgICAgIG4sDQogICAgICAgICAgbSA9IHJvd3MubGVuZ3RoLA0KICAgICAgICAgIHZhbHVlID0gcGFyZW50LnZhbHVlOw0KDQogICAgICB3aGlsZSAoKytqIDwgbSkgew0KICAgICAgICByb3cgPSByb3dzW2pdLCBub2RlcyA9IHJvdy5jaGlsZHJlbjsNCiAgICAgICAgZm9yIChpID0gcm93LnZhbHVlID0gMCwgbiA9IG5vZGVzLmxlbmd0aDsgaSA8IG47ICsraSkgcm93LnZhbHVlICs9IG5vZGVzW2ldLnZhbHVlOw0KICAgICAgICBpZiAocm93LmRpY2UpIHRyZWVtYXBEaWNlKHJvdywgeDAsIHkwLCB4MSwgeTAgKz0gKHkxIC0geTApICogcm93LnZhbHVlIC8gdmFsdWUpOw0KICAgICAgICBlbHNlIHRyZWVtYXBTbGljZShyb3csIHgwLCB5MCwgeDAgKz0gKHgxIC0geDApICogcm93LnZhbHVlIC8gdmFsdWUsIHkxKTsNCiAgICAgICAgdmFsdWUgLT0gcm93LnZhbHVlOw0KICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICBwYXJlbnQuX3NxdWFyaWZ5ID0gcm93cyA9IHNxdWFyaWZ5UmF0aW8ocmF0aW8sIHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpOw0KICAgICAgcm93cy5yYXRpbyA9IHJhdGlvOw0KICAgIH0NCiAgfQ0KDQogIHJlc3F1YXJpZnkucmF0aW8gPSBmdW5jdGlvbih4KSB7DQogICAgcmV0dXJuIGN1c3RvbSgoeCA9ICt4KSA+IDEgPyB4IDogMSk7DQogIH07DQoNCiAgcmV0dXJuIHJlc3F1YXJpZnk7DQp9KSkocGhpKTsNCg0KZXhwb3J0cy5jbHVzdGVyID0gY2x1c3RlcjsNCmV4cG9ydHMuaGllcmFyY2h5ID0gaGllcmFyY2h5Ow0KZXhwb3J0cy5wYWNrID0gaW5kZXg7DQpleHBvcnRzLnBhY2tTaWJsaW5ncyA9IHNpYmxpbmdzOw0KZXhwb3J0cy5wYWNrRW5jbG9zZSA9IGVuY2xvc2U7DQpleHBvcnRzLnBhcnRpdGlvbiA9IHBhcnRpdGlvbjsNCmV4cG9ydHMuc3RyYXRpZnkgPSBzdHJhdGlmeTsNCmV4cG9ydHMudHJlZSA9IHRyZWU7DQpleHBvcnRzLnRyZWVtYXAgPSBpbmRleCQxOw0KZXhwb3J0cy50cmVlbWFwQmluYXJ5ID0gYmluYXJ5Ow0KZXhwb3J0cy50cmVlbWFwRGljZSA9IHRyZWVtYXBEaWNlOw0KZXhwb3J0cy50cmVlbWFwU2xpY2UgPSB0cmVlbWFwU2xpY2U7DQpleHBvcnRzLnRyZWVtYXBTbGljZURpY2UgPSBzbGljZURpY2U7DQpleHBvcnRzLnRyZWVtYXBTcXVhcmlmeSA9IHNxdWFyaWZ5Ow0KZXhwb3J0cy50cmVlbWFwUmVzcXVhcmlmeSA9IHJlc3F1YXJpZnk7DQoNCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7DQoNCn0pKSk7DQoNCn0se31dLDk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpew0KLy8gaHR0cHM6Ly9kM2pzLm9yZy9kMy1pbnRlcnBvbGF0ZS8gVmVyc2lvbiAxLjEuNS4gQ29weXJpZ2h0IDIwMTcgTWlrZSBCb3N0b2NrLg0KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsNCgl0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMsIHJlcXVpcmUoJ2QzLWNvbG9yJykpIDoNCgl0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJywgJ2QzLWNvbG9yJ10sIGZhY3RvcnkpIDoNCgkoZmFjdG9yeSgoZ2xvYmFsLmQzID0gZ2xvYmFsLmQzIHx8IHt9KSxnbG9iYWwuZDMpKTsNCn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzLGQzQ29sb3IpIHsgJ3VzZSBzdHJpY3QnOw0KDQpmdW5jdGlvbiBiYXNpcyh0MSwgdjAsIHYxLCB2MiwgdjMpIHsNCiAgdmFyIHQyID0gdDEgKiB0MSwgdDMgPSB0MiAqIHQxOw0KICByZXR1cm4gKCgxIC0gMyAqIHQxICsgMyAqIHQyIC0gdDMpICogdjANCiAgICAgICsgKDQgLSA2ICogdDIgKyAzICogdDMpICogdjENCiAgICAgICsgKDEgKyAzICogdDEgKyAzICogdDIgLSAzICogdDMpICogdjINCiAgICAgICsgdDMgKiB2MykgLyA2Ow0KfQ0KDQp2YXIgYmFzaXMkMSA9IGZ1bmN0aW9uKHZhbHVlcykgew0KICB2YXIgbiA9IHZhbHVlcy5sZW5ndGggLSAxOw0KICByZXR1cm4gZnVuY3Rpb24odCkgew0KICAgIHZhciBpID0gdCA8PSAwID8gKHQgPSAwKSA6IHQgPj0gMSA/ICh0ID0gMSwgbiAtIDEpIDogTWF0aC5mbG9vcih0ICogbiksDQogICAgICAgIHYxID0gdmFsdWVzW2ldLA0KICAgICAgICB2MiA9IHZhbHVlc1tpICsgMV0sDQogICAgICAgIHYwID0gaSA+IDAgPyB2YWx1ZXNbaSAtIDFdIDogMiAqIHYxIC0gdjIsDQogICAgICAgIHYzID0gaSA8IG4gLSAxID8gdmFsdWVzW2kgKyAyXSA6IDIgKiB2MiAtIHYxOw0KICAgIHJldHVybiBiYXNpcygodCAtIGkgLyBuKSAqIG4sIHYwLCB2MSwgdjIsIHYzKTsNCiAgfTsNCn07DQoNCnZhciBiYXNpc0Nsb3NlZCA9IGZ1bmN0aW9uKHZhbHVlcykgew0KICB2YXIgbiA9IHZhbHVlcy5sZW5ndGg7DQogIHJldHVybiBmdW5jdGlvbih0KSB7DQogICAgdmFyIGkgPSBNYXRoLmZsb29yKCgodCAlPSAxKSA8IDAgPyArK3QgOiB0KSAqIG4pLA0KICAgICAgICB2MCA9IHZhbHVlc1soaSArIG4gLSAxKSAlIG5dLA0KICAgICAgICB2MSA9IHZhbHVlc1tpICUgbl0sDQogICAgICAgIHYyID0gdmFsdWVzWyhpICsgMSkgJSBuXSwNCiAgICAgICAgdjMgPSB2YWx1ZXNbKGkgKyAyKSAlIG5dOw0KICAgIHJldHVybiBiYXNpcygodCAtIGkgLyBuKSAqIG4sIHYwLCB2MSwgdjIsIHYzKTsNCiAgfTsNCn07DQoNCnZhciBjb25zdGFudCA9IGZ1bmN0aW9uKHgpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB4Ow0KICB9Ow0KfTsNCg0KZnVuY3Rpb24gbGluZWFyKGEsIGQpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsNCiAgICByZXR1cm4gYSArIHQgKiBkOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBleHBvbmVudGlhbChhLCBiLCB5KSB7DQogIHJldHVybiBhID0gTWF0aC5wb3coYSwgeSksIGIgPSBNYXRoLnBvdyhiLCB5KSAtIGEsIHkgPSAxIC8geSwgZnVuY3Rpb24odCkgew0KICAgIHJldHVybiBNYXRoLnBvdyhhICsgdCAqIGIsIHkpOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBodWUoYSwgYikgew0KICB2YXIgZCA9IGIgLSBhOw0KICByZXR1cm4gZCA/IGxpbmVhcihhLCBkID4gMTgwIHx8IGQgPCAtMTgwID8gZCAtIDM2MCAqIE1hdGgucm91bmQoZCAvIDM2MCkgOiBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpOw0KfQ0KDQpmdW5jdGlvbiBnYW1tYSh5KSB7DQogIHJldHVybiAoeSA9ICt5KSA9PT0gMSA/IG5vZ2FtbWEgOiBmdW5jdGlvbihhLCBiKSB7DQogICAgcmV0dXJuIGIgLSBhID8gZXhwb25lbnRpYWwoYSwgYiwgeSkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gbm9nYW1tYShhLCBiKSB7DQogIHZhciBkID0gYiAtIGE7DQogIHJldHVybiBkID8gbGluZWFyKGEsIGQpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7DQp9DQoNCnZhciByZ2IkMSA9ICgoZnVuY3Rpb24gcmdiR2FtbWEoeSkgew0KICB2YXIgY29sb3IkJDEgPSBnYW1tYSh5KTsNCg0KICBmdW5jdGlvbiByZ2IkJDEoc3RhcnQsIGVuZCkgew0KICAgIHZhciByID0gY29sb3IkJDEoKHN0YXJ0ID0gZDNDb2xvci5yZ2Ioc3RhcnQpKS5yLCAoZW5kID0gZDNDb2xvci5yZ2IoZW5kKSkuciksDQogICAgICAgIGcgPSBjb2xvciQkMShzdGFydC5nLCBlbmQuZyksDQogICAgICAgIGIgPSBjb2xvciQkMShzdGFydC5iLCBlbmQuYiksDQogICAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTsNCiAgICByZXR1cm4gZnVuY3Rpb24odCkgew0KICAgICAgc3RhcnQuciA9IHIodCk7DQogICAgICBzdGFydC5nID0gZyh0KTsNCiAgICAgIHN0YXJ0LmIgPSBiKHQpOw0KICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7DQogICAgICByZXR1cm4gc3RhcnQgKyAiIjsNCiAgICB9Ow0KICB9DQoNCiAgcmdiJCQxLmdhbW1hID0gcmdiR2FtbWE7DQoNCiAgcmV0dXJuIHJnYiQkMTsNCn0pKSgxKTsNCg0KZnVuY3Rpb24gcmdiU3BsaW5lKHNwbGluZSkgew0KICByZXR1cm4gZnVuY3Rpb24oY29sb3JzKSB7DQogICAgdmFyIG4gPSBjb2xvcnMubGVuZ3RoLA0KICAgICAgICByID0gbmV3IEFycmF5KG4pLA0KICAgICAgICBnID0gbmV3IEFycmF5KG4pLA0KICAgICAgICBiID0gbmV3IEFycmF5KG4pLA0KICAgICAgICBpLCBjb2xvciQkMTsNCiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgICBjb2xvciQkMSA9IGQzQ29sb3IucmdiKGNvbG9yc1tpXSk7DQogICAgICByW2ldID0gY29sb3IkJDEuciB8fCAwOw0KICAgICAgZ1tpXSA9IGNvbG9yJCQxLmcgfHwgMDsNCiAgICAgIGJbaV0gPSBjb2xvciQkMS5iIHx8IDA7DQogICAgfQ0KICAgIHIgPSBzcGxpbmUocik7DQogICAgZyA9IHNwbGluZShnKTsNCiAgICBiID0gc3BsaW5lKGIpOw0KICAgIGNvbG9yJCQxLm9wYWNpdHkgPSAxOw0KICAgIHJldHVybiBmdW5jdGlvbih0KSB7DQogICAgICBjb2xvciQkMS5yID0gcih0KTsNCiAgICAgIGNvbG9yJCQxLmcgPSBnKHQpOw0KICAgICAgY29sb3IkJDEuYiA9IGIodCk7DQogICAgICByZXR1cm4gY29sb3IkJDEgKyAiIjsNCiAgICB9Ow0KICB9Ow0KfQ0KDQp2YXIgcmdiQmFzaXMgPSByZ2JTcGxpbmUoYmFzaXMkMSk7DQp2YXIgcmdiQmFzaXNDbG9zZWQgPSByZ2JTcGxpbmUoYmFzaXNDbG9zZWQpOw0KDQp2YXIgYXJyYXkgPSBmdW5jdGlvbihhLCBiKSB7DQogIHZhciBuYiA9IGIgPyBiLmxlbmd0aCA6IDAsDQogICAgICBuYSA9IGEgPyBNYXRoLm1pbihuYiwgYS5sZW5ndGgpIDogMCwNCiAgICAgIHggPSBuZXcgQXJyYXkobmIpLA0KICAgICAgYyA9IG5ldyBBcnJheShuYiksDQogICAgICBpOw0KDQogIGZvciAoaSA9IDA7IGkgPCBuYTsgKytpKSB4W2ldID0gdmFsdWUoYVtpXSwgYltpXSk7DQogIGZvciAoOyBpIDwgbmI7ICsraSkgY1tpXSA9IGJbaV07DQoNCiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsNCiAgICBmb3IgKGkgPSAwOyBpIDwgbmE7ICsraSkgY1tpXSA9IHhbaV0odCk7DQogICAgcmV0dXJuIGM7DQogIH07DQp9Ow0KDQp2YXIgZGF0ZSA9IGZ1bmN0aW9uKGEsIGIpIHsNCiAgdmFyIGQgPSBuZXcgRGF0ZTsNCiAgcmV0dXJuIGEgPSArYSwgYiAtPSBhLCBmdW5jdGlvbih0KSB7DQogICAgcmV0dXJuIGQuc2V0VGltZShhICsgYiAqIHQpLCBkOw0KICB9Ow0KfTsNCg0KdmFyIG51bWJlciA9IGZ1bmN0aW9uKGEsIGIpIHsNCiAgcmV0dXJuIGEgPSArYSwgYiAtPSBhLCBmdW5jdGlvbih0KSB7DQogICAgcmV0dXJuIGEgKyBiICogdDsNCiAgfTsNCn07DQoNCnZhciBvYmplY3QgPSBmdW5jdGlvbihhLCBiKSB7DQogIHZhciBpID0ge30sDQogICAgICBjID0ge30sDQogICAgICBrOw0KDQogIGlmIChhID09PSBudWxsIHx8IHR5cGVvZiBhICE9PSAib2JqZWN0IikgYSA9IHt9Ow0KICBpZiAoYiA9PT0gbnVsbCB8fCB0eXBlb2YgYiAhPT0gIm9iamVjdCIpIGIgPSB7fTsNCg0KICBmb3IgKGsgaW4gYikgew0KICAgIGlmIChrIGluIGEpIHsNCiAgICAgIGlba10gPSB2YWx1ZShhW2tdLCBiW2tdKTsNCiAgICB9IGVsc2Ugew0KICAgICAgY1trXSA9IGJba107DQogICAgfQ0KICB9DQoNCiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsNCiAgICBmb3IgKGsgaW4gaSkgY1trXSA9IGlba10odCk7DQogICAgcmV0dXJuIGM7DQogIH07DQp9Ow0KDQp2YXIgcmVBID0gL1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nOw0KdmFyIHJlQiA9IG5ldyBSZWdFeHAocmVBLnNvdXJjZSwgImciKTsNCg0KZnVuY3Rpb24gemVybyhiKSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gYjsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gb25lKGIpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsNCiAgICByZXR1cm4gYih0KSArICIiOw0KICB9Ow0KfQ0KDQp2YXIgc3RyaW5nID0gZnVuY3Rpb24oYSwgYikgew0KICB2YXIgYmkgPSByZUEubGFzdEluZGV4ID0gcmVCLmxhc3RJbmRleCA9IDAsIC8vIHNjYW4gaW5kZXggZm9yIG5leHQgbnVtYmVyIGluIGINCiAgICAgIGFtLCAvLyBjdXJyZW50IG1hdGNoIGluIGENCiAgICAgIGJtLCAvLyBjdXJyZW50IG1hdGNoIGluIGINCiAgICAgIGJzLCAvLyBzdHJpbmcgcHJlY2VkaW5nIGN1cnJlbnQgbnVtYmVyIGluIGIsIGlmIGFueQ0KICAgICAgaSA9IC0xLCAvLyBpbmRleCBpbiBzDQogICAgICBzID0gW10sIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVycw0KICAgICAgcSA9IFtdOyAvLyBudW1iZXIgaW50ZXJwb2xhdG9ycw0KDQogIC8vIENvZXJjZSBpbnB1dHMgdG8gc3RyaW5ncy4NCiAgYSA9IGEgKyAiIiwgYiA9IGIgKyAiIjsNCg0KICAvLyBJbnRlcnBvbGF0ZSBwYWlycyBvZiBudW1iZXJzIGluIGEgJiBiLg0KICB3aGlsZSAoKGFtID0gcmVBLmV4ZWMoYSkpDQogICAgICAmJiAoYm0gPSByZUIuZXhlYyhiKSkpIHsNCiAgICBpZiAoKGJzID0gYm0uaW5kZXgpID4gYmkpIHsgLy8gYSBzdHJpbmcgcHJlY2VkZXMgdGhlIG5leHQgbnVtYmVyIGluIGINCiAgICAgIGJzID0gYi5zbGljZShiaSwgYnMpOw0KICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nDQogICAgICBlbHNlIHNbKytpXSA9IGJzOw0KICAgIH0NCiAgICBpZiAoKGFtID0gYW1bMF0pID09PSAoYm0gPSBibVswXSkpIHsgLy8gbnVtYmVycyBpbiBhICYgYiBtYXRjaA0KICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYm07IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nDQogICAgICBlbHNlIHNbKytpXSA9IGJtOw0KICAgIH0gZWxzZSB7IC8vIGludGVycG9sYXRlIG5vbi1tYXRjaGluZyBudW1iZXJzDQogICAgICBzWysraV0gPSBudWxsOw0KICAgICAgcS5wdXNoKHtpOiBpLCB4OiBudW1iZXIoYW0sIGJtKX0pOw0KICAgIH0NCiAgICBiaSA9IHJlQi5sYXN0SW5kZXg7DQogIH0NCg0KICAvLyBBZGQgcmVtYWlucyBvZiBiLg0KICBpZiAoYmkgPCBiLmxlbmd0aCkgew0KICAgIGJzID0gYi5zbGljZShiaSk7DQogICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nDQogICAgZWxzZSBzWysraV0gPSBiczsNCiAgfQ0KDQogIC8vIFNwZWNpYWwgb3B0aW1pemF0aW9uIGZvciBvbmx5IGEgc2luZ2xlIG1hdGNoLg0KICAvLyBPdGhlcndpc2UsIGludGVycG9sYXRlIGVhY2ggb2YgdGhlIG51bWJlcnMgYW5kIHJlam9pbiB0aGUgc3RyaW5nLg0KICByZXR1cm4gcy5sZW5ndGggPCAyID8gKHFbMF0NCiAgICAgID8gb25lKHFbMF0ueCkNCiAgICAgIDogemVybyhiKSkNCiAgICAgIDogKGIgPSBxLmxlbmd0aCwgZnVuY3Rpb24odCkgew0KICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBvOyBpIDwgYjsgKytpKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7DQogICAgICAgICAgcmV0dXJuIHMuam9pbigiIik7DQogICAgICAgIH0pOw0KfTsNCg0KdmFyIHZhbHVlID0gZnVuY3Rpb24oYSwgYikgew0KICB2YXIgdCA9IHR5cGVvZiBiLCBjOw0KICByZXR1cm4gYiA9PSBudWxsIHx8IHQgPT09ICJib29sZWFuIiA/IGNvbnN0YW50KGIpDQogICAgICA6ICh0ID09PSAibnVtYmVyIiA/IG51bWJlcg0KICAgICAgOiB0ID09PSAic3RyaW5nIiA/ICgoYyA9IGQzQ29sb3IuY29sb3IoYikpID8gKGIgPSBjLCByZ2IkMSkgOiBzdHJpbmcpDQogICAgICA6IGIgaW5zdGFuY2VvZiBkM0NvbG9yLmNvbG9yID8gcmdiJDENCiAgICAgIDogYiBpbnN0YW5jZW9mIERhdGUgPyBkYXRlDQogICAgICA6IEFycmF5LmlzQXJyYXkoYikgPyBhcnJheQ0KICAgICAgOiB0eXBlb2YgYi52YWx1ZU9mICE9PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBiLnRvU3RyaW5nICE9PSAiZnVuY3Rpb24iIHx8IGlzTmFOKGIpID8gb2JqZWN0DQogICAgICA6IG51bWJlcikoYSwgYik7DQp9Ow0KDQp2YXIgcm91bmQgPSBmdW5jdGlvbihhLCBiKSB7DQogIHJldHVybiBhID0gK2EsIGIgLT0gYSwgZnVuY3Rpb24odCkgew0KICAgIHJldHVybiBNYXRoLnJvdW5kKGEgKyBiICogdCk7DQogIH07DQp9Ow0KDQp2YXIgZGVncmVlcyA9IDE4MCAvIE1hdGguUEk7DQoNCnZhciBpZGVudGl0eSA9IHsNCiAgdHJhbnNsYXRlWDogMCwNCiAgdHJhbnNsYXRlWTogMCwNCiAgcm90YXRlOiAwLA0KICBza2V3WDogMCwNCiAgc2NhbGVYOiAxLA0KICBzY2FsZVk6IDENCn07DQoNCnZhciBkZWNvbXBvc2UgPSBmdW5jdGlvbihhLCBiLCBjLCBkLCBlLCBmKSB7DQogIHZhciBzY2FsZVgsIHNjYWxlWSwgc2tld1g7DQogIGlmIChzY2FsZVggPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYikpIGEgLz0gc2NhbGVYLCBiIC89IHNjYWxlWDsNCiAgaWYgKHNrZXdYID0gYSAqIGMgKyBiICogZCkgYyAtPSBhICogc2tld1gsIGQgLT0gYiAqIHNrZXdYOw0KICBpZiAoc2NhbGVZID0gTWF0aC5zcXJ0KGMgKiBjICsgZCAqIGQpKSBjIC89IHNjYWxlWSwgZCAvPSBzY2FsZVksIHNrZXdYIC89IHNjYWxlWTsNCiAgaWYgKGEgKiBkIDwgYiAqIGMpIGEgPSAtYSwgYiA9IC1iLCBza2V3WCA9IC1za2V3WCwgc2NhbGVYID0gLXNjYWxlWDsNCiAgcmV0dXJuIHsNCiAgICB0cmFuc2xhdGVYOiBlLA0KICAgIHRyYW5zbGF0ZVk6IGYsDQogICAgcm90YXRlOiBNYXRoLmF0YW4yKGIsIGEpICogZGVncmVlcywNCiAgICBza2V3WDogTWF0aC5hdGFuKHNrZXdYKSAqIGRlZ3JlZXMsDQogICAgc2NhbGVYOiBzY2FsZVgsDQogICAgc2NhbGVZOiBzY2FsZVkNCiAgfTsNCn07DQoNCnZhciBjc3NOb2RlOw0KdmFyIGNzc1Jvb3Q7DQp2YXIgY3NzVmlldzsNCnZhciBzdmdOb2RlOw0KDQpmdW5jdGlvbiBwYXJzZUNzcyh2YWx1ZSkgew0KICBpZiAodmFsdWUgPT09ICJub25lIikgcmV0dXJuIGlkZW50aXR5Ow0KICBpZiAoIWNzc05vZGUpIGNzc05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSwgY3NzUm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgY3NzVmlldyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3Ow0KICBjc3NOb2RlLnN0eWxlLnRyYW5zZm9ybSA9IHZhbHVlOw0KICB2YWx1ZSA9IGNzc1ZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShjc3NSb290LmFwcGVuZENoaWxkKGNzc05vZGUpLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKTsNCiAgY3NzUm9vdC5yZW1vdmVDaGlsZChjc3NOb2RlKTsNCiAgdmFsdWUgPSB2YWx1ZS5zbGljZSg3LCAtMSkuc3BsaXQoIiwiKTsNCiAgcmV0dXJuIGRlY29tcG9zZSgrdmFsdWVbMF0sICt2YWx1ZVsxXSwgK3ZhbHVlWzJdLCArdmFsdWVbM10sICt2YWx1ZVs0XSwgK3ZhbHVlWzVdKTsNCn0NCg0KZnVuY3Rpb24gcGFyc2VTdmcodmFsdWUpIHsNCiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBpZGVudGl0eTsNCiAgaWYgKCFzdmdOb2RlKSBzdmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsICJnIik7DQogIHN2Z05vZGUuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLCB2YWx1ZSk7DQogIGlmICghKHZhbHVlID0gc3ZnTm9kZS50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKSkgcmV0dXJuIGlkZW50aXR5Ow0KICB2YWx1ZSA9IHZhbHVlLm1hdHJpeDsNCiAgcmV0dXJuIGRlY29tcG9zZSh2YWx1ZS5hLCB2YWx1ZS5iLCB2YWx1ZS5jLCB2YWx1ZS5kLCB2YWx1ZS5lLCB2YWx1ZS5mKTsNCn0NCg0KZnVuY3Rpb24gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2UsIHB4Q29tbWEsIHB4UGFyZW4sIGRlZ1BhcmVuKSB7DQoNCiAgZnVuY3Rpb24gcG9wKHMpIHsNCiAgICByZXR1cm4gcy5sZW5ndGggPyBzLnBvcCgpICsgIiAiIDogIiI7DQogIH0NCg0KICBmdW5jdGlvbiB0cmFuc2xhdGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHsNCiAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5Yikgew0KICAgICAgdmFyIGkgPSBzLnB1c2goInRyYW5zbGF0ZSgiLCBudWxsLCBweENvbW1hLCBudWxsLCBweFBhcmVuKTsNCiAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IG51bWJlcih4YSwgeGIpfSwge2k6IGkgLSAyLCB4OiBudW1iZXIoeWEsIHliKX0pOw0KICAgIH0gZWxzZSBpZiAoeGIgfHwgeWIpIHsNCiAgICAgIHMucHVzaCgidHJhbnNsYXRlKCIgKyB4YiArIHB4Q29tbWEgKyB5YiArIHB4UGFyZW4pOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIHJvdGF0ZShhLCBiLCBzLCBxKSB7DQogICAgaWYgKGEgIT09IGIpIHsNCiAgICAgIGlmIChhIC0gYiA+IDE4MCkgYiArPSAzNjA7IGVsc2UgaWYgKGIgLSBhID4gMTgwKSBhICs9IDM2MDsgLy8gc2hvcnRlc3QgcGF0aA0KICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgInJvdGF0ZSgiLCBudWxsLCBkZWdQYXJlbikgLSAyLCB4OiBudW1iZXIoYSwgYil9KTsNCiAgICB9IGVsc2UgaWYgKGIpIHsNCiAgICAgIHMucHVzaChwb3AocykgKyAicm90YXRlKCIgKyBiICsgZGVnUGFyZW4pOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIHNrZXdYKGEsIGIsIHMsIHEpIHsNCiAgICBpZiAoYSAhPT0gYikgew0KICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgInNrZXdYKCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlcihhLCBiKX0pOw0KICAgIH0gZWxzZSBpZiAoYikgew0KICAgICAgcy5wdXNoKHBvcChzKSArICJza2V3WCgiICsgYiArIGRlZ1BhcmVuKTsNCiAgICB9DQogIH0NCg0KICBmdW5jdGlvbiBzY2FsZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkgew0KICAgIGlmICh4YSAhPT0geGIgfHwgeWEgIT09IHliKSB7DQogICAgICB2YXIgaSA9IHMucHVzaChwb3AocykgKyAic2NhbGUoIiwgbnVsbCwgIiwiLCBudWxsLCAiKSIpOw0KICAgICAgcS5wdXNoKHtpOiBpIC0gNCwgeDogbnVtYmVyKHhhLCB4Yil9LCB7aTogaSAtIDIsIHg6IG51bWJlcih5YSwgeWIpfSk7DQogICAgfSBlbHNlIGlmICh4YiAhPT0gMSB8fCB5YiAhPT0gMSkgew0KICAgICAgcy5wdXNoKHBvcChzKSArICJzY2FsZSgiICsgeGIgKyAiLCIgKyB5YiArICIpIik7DQogICAgfQ0KICB9DQoNCiAgcmV0dXJuIGZ1bmN0aW9uKGEsIGIpIHsNCiAgICB2YXIgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnMNCiAgICAgICAgcSA9IFtdOyAvLyBudW1iZXIgaW50ZXJwb2xhdG9ycw0KICAgIGEgPSBwYXJzZShhKSwgYiA9IHBhcnNlKGIpOw0KICAgIHRyYW5zbGF0ZShhLnRyYW5zbGF0ZVgsIGEudHJhbnNsYXRlWSwgYi50cmFuc2xhdGVYLCBiLnRyYW5zbGF0ZVksIHMsIHEpOw0KICAgIHJvdGF0ZShhLnJvdGF0ZSwgYi5yb3RhdGUsIHMsIHEpOw0KICAgIHNrZXdYKGEuc2tld1gsIGIuc2tld1gsIHMsIHEpOw0KICAgIHNjYWxlKGEuc2NhbGVYLCBhLnNjYWxlWSwgYi5zY2FsZVgsIGIuc2NhbGVZLCBzLCBxKTsNCiAgICBhID0gYiA9IG51bGw7IC8vIGdjDQogICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsNCiAgICAgIHZhciBpID0gLTEsIG4gPSBxLmxlbmd0aCwgbzsNCiAgICAgIHdoaWxlICgrK2kgPCBuKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7DQogICAgICByZXR1cm4gcy5qb2luKCIiKTsNCiAgICB9Ow0KICB9Ow0KfQ0KDQp2YXIgaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MgPSBpbnRlcnBvbGF0ZVRyYW5zZm9ybShwYXJzZUNzcywgInB4LCAiLCAicHgpIiwgImRlZykiKTsNCnZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlU3ZnLCAiLCAiLCAiKSIsICIpIik7DQoNCnZhciByaG8gPSBNYXRoLlNRUlQyOw0KdmFyIHJobzIgPSAyOw0KdmFyIHJobzQgPSA0Ow0KdmFyIGVwc2lsb24yID0gMWUtMTI7DQoNCmZ1bmN0aW9uIGNvc2goeCkgew0KICByZXR1cm4gKCh4ID0gTWF0aC5leHAoeCkpICsgMSAvIHgpIC8gMjsNCn0NCg0KZnVuY3Rpb24gc2luaCh4KSB7DQogIHJldHVybiAoKHggPSBNYXRoLmV4cCh4KSkgLSAxIC8geCkgLyAyOw0KfQ0KDQpmdW5jdGlvbiB0YW5oKHgpIHsNCiAgcmV0dXJuICgoeCA9IE1hdGguZXhwKDIgKiB4KSkgLSAxKSAvICh4ICsgMSk7DQp9DQoNCi8vIHAwID0gW3V4MCwgdXkwLCB3MF0NCi8vIHAxID0gW3V4MSwgdXkxLCB3MV0NCnZhciB6b29tID0gZnVuY3Rpb24ocDAsIHAxKSB7DQogIHZhciB1eDAgPSBwMFswXSwgdXkwID0gcDBbMV0sIHcwID0gcDBbMl0sDQogICAgICB1eDEgPSBwMVswXSwgdXkxID0gcDFbMV0sIHcxID0gcDFbMl0sDQogICAgICBkeCA9IHV4MSAtIHV4MCwNCiAgICAgIGR5ID0gdXkxIC0gdXkwLA0KICAgICAgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeSwNCiAgICAgIGksDQogICAgICBTOw0KDQogIC8vIFNwZWNpYWwgY2FzZSBmb3IgdTAg4omFIHUxLg0KICBpZiAoZDIgPCBlcHNpbG9uMikgew0KICAgIFMgPSBNYXRoLmxvZyh3MSAvIHcwKSAvIHJobzsNCiAgICBpID0gZnVuY3Rpb24odCkgew0KICAgICAgcmV0dXJuIFsNCiAgICAgICAgdXgwICsgdCAqIGR4LA0KICAgICAgICB1eTAgKyB0ICogZHksDQogICAgICAgIHcwICogTWF0aC5leHAocmhvICogdCAqIFMpDQogICAgICBdOw0KICAgIH07DQogIH0NCg0KICAvLyBHZW5lcmFsIGNhc2UuDQogIGVsc2Ugew0KICAgIHZhciBkMSA9IE1hdGguc3FydChkMiksDQogICAgICAgIGIwID0gKHcxICogdzEgLSB3MCAqIHcwICsgcmhvNCAqIGQyKSAvICgyICogdzAgKiByaG8yICogZDEpLA0KICAgICAgICBiMSA9ICh3MSAqIHcxIC0gdzAgKiB3MCAtIHJobzQgKiBkMikgLyAoMiAqIHcxICogcmhvMiAqIGQxKSwNCiAgICAgICAgcjAgPSBNYXRoLmxvZyhNYXRoLnNxcnQoYjAgKiBiMCArIDEpIC0gYjApLA0KICAgICAgICByMSA9IE1hdGgubG9nKE1hdGguc3FydChiMSAqIGIxICsgMSkgLSBiMSk7DQogICAgUyA9IChyMSAtIHIwKSAvIHJobzsNCiAgICBpID0gZnVuY3Rpb24odCkgew0KICAgICAgdmFyIHMgPSB0ICogUywNCiAgICAgICAgICBjb3NocjAgPSBjb3NoKHIwKSwNCiAgICAgICAgICB1ID0gdzAgLyAocmhvMiAqIGQxKSAqIChjb3NocjAgKiB0YW5oKHJobyAqIHMgKyByMCkgLSBzaW5oKHIwKSk7DQogICAgICByZXR1cm4gWw0KICAgICAgICB1eDAgKyB1ICogZHgsDQogICAgICAgIHV5MCArIHUgKiBkeSwNCiAgICAgICAgdzAgKiBjb3NocjAgLyBjb3NoKHJobyAqIHMgKyByMCkNCiAgICAgIF07DQogICAgfTsNCiAgfQ0KDQogIGkuZHVyYXRpb24gPSBTICogMTAwMDsNCg0KICByZXR1cm4gaTsNCn07DQoNCmZ1bmN0aW9uIGhzbCQxKGh1ZSQkMSkgew0KICByZXR1cm4gZnVuY3Rpb24oc3RhcnQsIGVuZCkgew0KICAgIHZhciBoID0gaHVlJCQxKChzdGFydCA9IGQzQ29sb3IuaHNsKHN0YXJ0KSkuaCwgKGVuZCA9IGQzQ29sb3IuaHNsKGVuZCkpLmgpLA0KICAgICAgICBzID0gbm9nYW1tYShzdGFydC5zLCBlbmQucyksDQogICAgICAgIGwgPSBub2dhbW1hKHN0YXJ0LmwsIGVuZC5sKSwNCiAgICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEoc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpOw0KICAgIHJldHVybiBmdW5jdGlvbih0KSB7DQogICAgICBzdGFydC5oID0gaCh0KTsNCiAgICAgIHN0YXJ0LnMgPSBzKHQpOw0KICAgICAgc3RhcnQubCA9IGwodCk7DQogICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTsNCiAgICAgIHJldHVybiBzdGFydCArICIiOw0KICAgIH07DQogIH0NCn0NCg0KdmFyIGhzbCQyID0gaHNsJDEoaHVlKTsNCnZhciBoc2xMb25nID0gaHNsJDEobm9nYW1tYSk7DQoNCmZ1bmN0aW9uIGxhYiQxKHN0YXJ0LCBlbmQpIHsNCiAgdmFyIGwgPSBub2dhbW1hKChzdGFydCA9IGQzQ29sb3IubGFiKHN0YXJ0KSkubCwgKGVuZCA9IGQzQ29sb3IubGFiKGVuZCkpLmwpLA0KICAgICAgYSA9IG5vZ2FtbWEoc3RhcnQuYSwgZW5kLmEpLA0KICAgICAgYiA9IG5vZ2FtbWEoc3RhcnQuYiwgZW5kLmIpLA0KICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEoc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpOw0KICByZXR1cm4gZnVuY3Rpb24odCkgew0KICAgIHN0YXJ0LmwgPSBsKHQpOw0KICAgIHN0YXJ0LmEgPSBhKHQpOw0KICAgIHN0YXJ0LmIgPSBiKHQpOw0KICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpOw0KICAgIHJldHVybiBzdGFydCArICIiOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBoY2wkMShodWUkJDEpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsNCiAgICB2YXIgaCA9IGh1ZSQkMSgoc3RhcnQgPSBkM0NvbG9yLmhjbChzdGFydCkpLmgsIChlbmQgPSBkM0NvbG9yLmhjbChlbmQpKS5oKSwNCiAgICAgICAgYyA9IG5vZ2FtbWEoc3RhcnQuYywgZW5kLmMpLA0KICAgICAgICBsID0gbm9nYW1tYShzdGFydC5sLCBlbmQubCksDQogICAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTsNCiAgICByZXR1cm4gZnVuY3Rpb24odCkgew0KICAgICAgc3RhcnQuaCA9IGgodCk7DQogICAgICBzdGFydC5jID0gYyh0KTsNCiAgICAgIHN0YXJ0LmwgPSBsKHQpOw0KICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7DQogICAgICByZXR1cm4gc3RhcnQgKyAiIjsNCiAgICB9Ow0KICB9DQp9DQoNCnZhciBoY2wkMiA9IGhjbCQxKGh1ZSk7DQp2YXIgaGNsTG9uZyA9IGhjbCQxKG5vZ2FtbWEpOw0KDQpmdW5jdGlvbiBjdWJlaGVsaXgkMShodWUkJDEpIHsNCiAgcmV0dXJuIChmdW5jdGlvbiBjdWJlaGVsaXhHYW1tYSh5KSB7DQogICAgeSA9ICt5Ow0KDQogICAgZnVuY3Rpb24gY3ViZWhlbGl4JCQxKHN0YXJ0LCBlbmQpIHsNCiAgICAgIHZhciBoID0gaHVlJCQxKChzdGFydCA9IGQzQ29sb3IuY3ViZWhlbGl4KHN0YXJ0KSkuaCwgKGVuZCA9IGQzQ29sb3IuY3ViZWhlbGl4KGVuZCkpLmgpLA0KICAgICAgICAgIHMgPSBub2dhbW1hKHN0YXJ0LnMsIGVuZC5zKSwNCiAgICAgICAgICBsID0gbm9nYW1tYShzdGFydC5sLCBlbmQubCksDQogICAgICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEoc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpOw0KICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsNCiAgICAgICAgc3RhcnQuaCA9IGgodCk7DQogICAgICAgIHN0YXJ0LnMgPSBzKHQpOw0KICAgICAgICBzdGFydC5sID0gbChNYXRoLnBvdyh0LCB5KSk7DQogICAgICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpOw0KICAgICAgICByZXR1cm4gc3RhcnQgKyAiIjsNCiAgICAgIH07DQogICAgfQ0KDQogICAgY3ViZWhlbGl4JCQxLmdhbW1hID0gY3ViZWhlbGl4R2FtbWE7DQoNCiAgICByZXR1cm4gY3ViZWhlbGl4JCQxOw0KICB9KSgxKTsNCn0NCg0KdmFyIGN1YmVoZWxpeCQyID0gY3ViZWhlbGl4JDEoaHVlKTsNCnZhciBjdWJlaGVsaXhMb25nID0gY3ViZWhlbGl4JDEobm9nYW1tYSk7DQoNCnZhciBxdWFudGl6ZSA9IGZ1bmN0aW9uKGludGVycG9sYXRvciwgbikgew0KICB2YXIgc2FtcGxlcyA9IG5ldyBBcnJheShuKTsNCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpIHNhbXBsZXNbaV0gPSBpbnRlcnBvbGF0b3IoaSAvIChuIC0gMSkpOw0KICByZXR1cm4gc2FtcGxlczsNCn07DQoNCmV4cG9ydHMuaW50ZXJwb2xhdGUgPSB2YWx1ZTsNCmV4cG9ydHMuaW50ZXJwb2xhdGVBcnJheSA9IGFycmF5Ow0KZXhwb3J0cy5pbnRlcnBvbGF0ZUJhc2lzID0gYmFzaXMkMTsNCmV4cG9ydHMuaW50ZXJwb2xhdGVCYXNpc0Nsb3NlZCA9IGJhc2lzQ2xvc2VkOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZURhdGUgPSBkYXRlOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZU51bWJlciA9IG51bWJlcjsNCmV4cG9ydHMuaW50ZXJwb2xhdGVPYmplY3QgPSBvYmplY3Q7DQpleHBvcnRzLmludGVycG9sYXRlUm91bmQgPSByb3VuZDsNCmV4cG9ydHMuaW50ZXJwb2xhdGVTdHJpbmcgPSBzdHJpbmc7DQpleHBvcnRzLmludGVycG9sYXRlVHJhbnNmb3JtQ3NzID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3M7DQpleHBvcnRzLmludGVycG9sYXRlVHJhbnNmb3JtU3ZnID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm1Tdmc7DQpleHBvcnRzLmludGVycG9sYXRlWm9vbSA9IHpvb207DQpleHBvcnRzLmludGVycG9sYXRlUmdiID0gcmdiJDE7DQpleHBvcnRzLmludGVycG9sYXRlUmdiQmFzaXMgPSByZ2JCYXNpczsNCmV4cG9ydHMuaW50ZXJwb2xhdGVSZ2JCYXNpc0Nsb3NlZCA9IHJnYkJhc2lzQ2xvc2VkOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZUhzbCA9IGhzbCQyOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZUhzbExvbmcgPSBoc2xMb25nOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZUxhYiA9IGxhYiQxOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZUhjbCA9IGhjbCQyOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZUhjbExvbmcgPSBoY2xMb25nOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZUN1YmVoZWxpeCA9IGN1YmVoZWxpeCQyOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmcgPSBjdWJlaGVsaXhMb25nOw0KZXhwb3J0cy5xdWFudGl6ZSA9IHF1YW50aXplOw0KDQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOw0KDQp9KSkpOw0KDQp9LHsiZDMtY29sb3IiOjR9XSwxMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7DQovLyBodHRwczovL2QzanMub3JnL2QzLXBhdGgvIFZlcnNpb24gMS4wLjUuIENvcHlyaWdodCAyMDE3IE1pa2UgQm9zdG9jay4NCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7DQoJdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6DQoJdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6DQoJKGZhY3RvcnkoKGdsb2JhbC5kMyA9IGdsb2JhbC5kMyB8fCB7fSkpKTsNCn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JzsNCg0KdmFyIHBpID0gTWF0aC5QSTsNCnZhciB0YXUgPSAyICogcGk7DQp2YXIgZXBzaWxvbiA9IDFlLTY7DQp2YXIgdGF1RXBzaWxvbiA9IHRhdSAtIGVwc2lsb247DQoNCmZ1bmN0aW9uIFBhdGgoKSB7DQogIHRoaXMuX3gwID0gdGhpcy5feTAgPSAvLyBzdGFydCBvZiBjdXJyZW50IHN1YnBhdGgNCiAgdGhpcy5feDEgPSB0aGlzLl95MSA9IG51bGw7IC8vIGVuZCBvZiBjdXJyZW50IHN1YnBhdGgNCiAgdGhpcy5fID0gIiI7DQp9DQoNCmZ1bmN0aW9uIHBhdGgoKSB7DQogIHJldHVybiBuZXcgUGF0aDsNCn0NCg0KUGF0aC5wcm90b3R5cGUgPSBwYXRoLnByb3RvdHlwZSA9IHsNCiAgY29uc3RydWN0b3I6IFBhdGgsDQogIG1vdmVUbzogZnVuY3Rpb24oeCwgeSkgew0KICAgIHRoaXMuXyArPSAiTSIgKyAodGhpcy5feDAgPSB0aGlzLl94MSA9ICt4KSArICIsIiArICh0aGlzLl95MCA9IHRoaXMuX3kxID0gK3kpOw0KICB9LA0KICBjbG9zZVBhdGg6IGZ1bmN0aW9uKCkgew0KICAgIGlmICh0aGlzLl94MSAhPT0gbnVsbCkgew0KICAgICAgdGhpcy5feDEgPSB0aGlzLl94MCwgdGhpcy5feTEgPSB0aGlzLl95MDsNCiAgICAgIHRoaXMuXyArPSAiWiI7DQogICAgfQ0KICB9LA0KICBsaW5lVG86IGZ1bmN0aW9uKHgsIHkpIHsNCiAgICB0aGlzLl8gKz0gIkwiICsgKHRoaXMuX3gxID0gK3gpICsgIiwiICsgKHRoaXMuX3kxID0gK3kpOw0KICB9LA0KICBxdWFkcmF0aWNDdXJ2ZVRvOiBmdW5jdGlvbih4MSwgeTEsIHgsIHkpIHsNCiAgICB0aGlzLl8gKz0gIlEiICsgKCt4MSkgKyAiLCIgKyAoK3kxKSArICIsIiArICh0aGlzLl94MSA9ICt4KSArICIsIiArICh0aGlzLl95MSA9ICt5KTsNCiAgfSwNCiAgYmV6aWVyQ3VydmVUbzogZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIsIHgsIHkpIHsNCiAgICB0aGlzLl8gKz0gIkMiICsgKCt4MSkgKyAiLCIgKyAoK3kxKSArICIsIiArICgreDIpICsgIiwiICsgKCt5MikgKyAiLCIgKyAodGhpcy5feDEgPSAreCkgKyAiLCIgKyAodGhpcy5feTEgPSAreSk7DQogIH0sDQogIGFyY1RvOiBmdW5jdGlvbih4MSwgeTEsIHgyLCB5Miwgcikgew0KICAgIHgxID0gK3gxLCB5MSA9ICt5MSwgeDIgPSAreDIsIHkyID0gK3kyLCByID0gK3I7DQogICAgdmFyIHgwID0gdGhpcy5feDEsDQogICAgICAgIHkwID0gdGhpcy5feTEsDQogICAgICAgIHgyMSA9IHgyIC0geDEsDQogICAgICAgIHkyMSA9IHkyIC0geTEsDQogICAgICAgIHgwMSA9IHgwIC0geDEsDQogICAgICAgIHkwMSA9IHkwIC0geTEsDQogICAgICAgIGwwMV8yID0geDAxICogeDAxICsgeTAxICogeTAxOw0KDQogICAgLy8gSXMgdGhlIHJhZGl1cyBuZWdhdGl2ZT8gRXJyb3IuDQogICAgaWYgKHIgPCAwKSB0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIiArIHIpOw0KDQogICAgLy8gSXMgdGhpcyBwYXRoIGVtcHR5PyBNb3ZlIHRvICh4MSx5MSkuDQogICAgaWYgKHRoaXMuX3gxID09PSBudWxsKSB7DQogICAgICB0aGlzLl8gKz0gIk0iICsgKHRoaXMuX3gxID0geDEpICsgIiwiICsgKHRoaXMuX3kxID0geTEpOw0KICAgIH0NCg0KICAgIC8vIE9yLCBpcyAoeDEseTEpIGNvaW5jaWRlbnQgd2l0aCAoeDAseTApPyBEbyBub3RoaW5nLg0KICAgIGVsc2UgaWYgKCEobDAxXzIgPiBlcHNpbG9uKSkge30NCg0KICAgIC8vIE9yLCBhcmUgKHgwLHkwKSwgKHgxLHkxKSBhbmQgKHgyLHkyKSBjb2xsaW5lYXI/DQogICAgLy8gRXF1aXZhbGVudGx5LCBpcyAoeDEseTEpIGNvaW5jaWRlbnQgd2l0aCAoeDIseTIpPw0KICAgIC8vIE9yLCBpcyB0aGUgcmFkaXVzIHplcm8/IExpbmUgdG8gKHgxLHkxKS4NCiAgICBlbHNlIGlmICghKE1hdGguYWJzKHkwMSAqIHgyMSAtIHkyMSAqIHgwMSkgPiBlcHNpbG9uKSB8fCAhcikgew0KICAgICAgdGhpcy5fICs9ICJMIiArICh0aGlzLl94MSA9IHgxKSArICIsIiArICh0aGlzLl95MSA9IHkxKTsNCiAgICB9DQoNCiAgICAvLyBPdGhlcndpc2UsIGRyYXcgYW4gYXJjIQ0KICAgIGVsc2Ugew0KICAgICAgdmFyIHgyMCA9IHgyIC0geDAsDQogICAgICAgICAgeTIwID0geTIgLSB5MCwNCiAgICAgICAgICBsMjFfMiA9IHgyMSAqIHgyMSArIHkyMSAqIHkyMSwNCiAgICAgICAgICBsMjBfMiA9IHgyMCAqIHgyMCArIHkyMCAqIHkyMCwNCiAgICAgICAgICBsMjEgPSBNYXRoLnNxcnQobDIxXzIpLA0KICAgICAgICAgIGwwMSA9IE1hdGguc3FydChsMDFfMiksDQogICAgICAgICAgbCA9IHIgKiBNYXRoLnRhbigocGkgLSBNYXRoLmFjb3MoKGwyMV8yICsgbDAxXzIgLSBsMjBfMikgLyAoMiAqIGwyMSAqIGwwMSkpKSAvIDIpLA0KICAgICAgICAgIHQwMSA9IGwgLyBsMDEsDQogICAgICAgICAgdDIxID0gbCAvIGwyMTsNCg0KICAgICAgLy8gSWYgdGhlIHN0YXJ0IHRhbmdlbnQgaXMgbm90IGNvaW5jaWRlbnQgd2l0aCAoeDAseTApLCBsaW5lIHRvLg0KICAgICAgaWYgKE1hdGguYWJzKHQwMSAtIDEpID4gZXBzaWxvbikgew0KICAgICAgICB0aGlzLl8gKz0gIkwiICsgKHgxICsgdDAxICogeDAxKSArICIsIiArICh5MSArIHQwMSAqIHkwMSk7DQogICAgICB9DQoNCiAgICAgIHRoaXMuXyArPSAiQSIgKyByICsgIiwiICsgciArICIsMCwwLCIgKyAoKyh5MDEgKiB4MjAgPiB4MDEgKiB5MjApKSArICIsIiArICh0aGlzLl94MSA9IHgxICsgdDIxICogeDIxKSArICIsIiArICh0aGlzLl95MSA9IHkxICsgdDIxICogeTIxKTsNCiAgICB9DQogIH0sDQogIGFyYzogZnVuY3Rpb24oeCwgeSwgciwgYTAsIGExLCBjY3cpIHsNCiAgICB4ID0gK3gsIHkgPSAreSwgciA9ICtyOw0KICAgIHZhciBkeCA9IHIgKiBNYXRoLmNvcyhhMCksDQogICAgICAgIGR5ID0gciAqIE1hdGguc2luKGEwKSwNCiAgICAgICAgeDAgPSB4ICsgZHgsDQogICAgICAgIHkwID0geSArIGR5LA0KICAgICAgICBjdyA9IDEgXiBjY3csDQogICAgICAgIGRhID0gY2N3ID8gYTAgLSBhMSA6IGExIC0gYTA7DQoNCiAgICAvLyBJcyB0aGUgcmFkaXVzIG5lZ2F0aXZlPyBFcnJvci4NCiAgICBpZiAociA8IDApIHRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzOiAiICsgcik7DQoNCiAgICAvLyBJcyB0aGlzIHBhdGggZW1wdHk/IE1vdmUgdG8gKHgwLHkwKS4NCiAgICBpZiAodGhpcy5feDEgPT09IG51bGwpIHsNCiAgICAgIHRoaXMuXyArPSAiTSIgKyB4MCArICIsIiArIHkwOw0KICAgIH0NCg0KICAgIC8vIE9yLCBpcyAoeDAseTApIG5vdCBjb2luY2lkZW50IHdpdGggdGhlIHByZXZpb3VzIHBvaW50PyBMaW5lIHRvICh4MCx5MCkuDQogICAgZWxzZSBpZiAoTWF0aC5hYnModGhpcy5feDEgLSB4MCkgPiBlcHNpbG9uIHx8IE1hdGguYWJzKHRoaXMuX3kxIC0geTApID4gZXBzaWxvbikgew0KICAgICAgdGhpcy5fICs9ICJMIiArIHgwICsgIiwiICsgeTA7DQogICAgfQ0KDQogICAgLy8gSXMgdGhpcyBhcmMgZW1wdHk/IFdl4oCZcmUgZG9uZS4NCiAgICBpZiAoIXIpIHJldHVybjsNCg0KICAgIC8vIERvZXMgdGhlIGFuZ2xlIGdvIHRoZSB3cm9uZyB3YXk/IEZsaXAgdGhlIGRpcmVjdGlvbi4NCiAgICBpZiAoZGEgPCAwKSBkYSA9IGRhICUgdGF1ICsgdGF1Ow0KDQogICAgLy8gSXMgdGhpcyBhIGNvbXBsZXRlIGNpcmNsZT8gRHJhdyB0d28gYXJjcyB0byBjb21wbGV0ZSB0aGUgY2lyY2xlLg0KICAgIGlmIChkYSA+IHRhdUVwc2lsb24pIHsNCiAgICAgIHRoaXMuXyArPSAiQSIgKyByICsgIiwiICsgciArICIsMCwxLCIgKyBjdyArICIsIiArICh4IC0gZHgpICsgIiwiICsgKHkgLSBkeSkgKyAiQSIgKyByICsgIiwiICsgciArICIsMCwxLCIgKyBjdyArICIsIiArICh0aGlzLl94MSA9IHgwKSArICIsIiArICh0aGlzLl95MSA9IHkwKTsNCiAgICB9DQoNCiAgICAvLyBJcyB0aGlzIGFyYyBub24tZW1wdHk/IERyYXcgYW4gYXJjIQ0KICAgIGVsc2UgaWYgKGRhID4gZXBzaWxvbikgew0KICAgICAgdGhpcy5fICs9ICJBIiArIHIgKyAiLCIgKyByICsgIiwwLCIgKyAoKyhkYSA+PSBwaSkpICsgIiwiICsgY3cgKyAiLCIgKyAodGhpcy5feDEgPSB4ICsgciAqIE1hdGguY29zKGExKSkgKyAiLCIgKyAodGhpcy5feTEgPSB5ICsgciAqIE1hdGguc2luKGExKSk7DQogICAgfQ0KICB9LA0KICByZWN0OiBmdW5jdGlvbih4LCB5LCB3LCBoKSB7DQogICAgdGhpcy5fICs9ICJNIiArICh0aGlzLl94MCA9IHRoaXMuX3gxID0gK3gpICsgIiwiICsgKHRoaXMuX3kwID0gdGhpcy5feTEgPSAreSkgKyAiaCIgKyAoK3cpICsgInYiICsgKCtoKSArICJoIiArICgtdykgKyAiWiI7DQogIH0sDQogIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcy5fOw0KICB9DQp9Ow0KDQpleHBvcnRzLnBhdGggPSBwYXRoOw0KDQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOw0KDQp9KSkpOw0KDQp9LHt9XSwxMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7DQovLyBodHRwczovL2QzanMub3JnL2QzLXNjYWxlLyBWZXJzaW9uIDEuMC42LiBDb3B5cmlnaHQgMjAxNyBNaWtlIEJvc3RvY2suDQooZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgew0KCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cywgcmVxdWlyZSgnZDMtYXJyYXknKSwgcmVxdWlyZSgnZDMtY29sbGVjdGlvbicpLCByZXF1aXJlKCdkMy1pbnRlcnBvbGF0ZScpLCByZXF1aXJlKCdkMy1mb3JtYXQnKSwgcmVxdWlyZSgnZDMtdGltZScpLCByZXF1aXJlKCdkMy10aW1lLWZvcm1hdCcpLCByZXF1aXJlKCdkMy1jb2xvcicpKSA6DQoJdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cycsICdkMy1hcnJheScsICdkMy1jb2xsZWN0aW9uJywgJ2QzLWludGVycG9sYXRlJywgJ2QzLWZvcm1hdCcsICdkMy10aW1lJywgJ2QzLXRpbWUtZm9ybWF0JywgJ2QzLWNvbG9yJ10sIGZhY3RvcnkpIDoNCgkoZmFjdG9yeSgoZ2xvYmFsLmQzID0gZ2xvYmFsLmQzIHx8IHt9KSxnbG9iYWwuZDMsZ2xvYmFsLmQzLGdsb2JhbC5kMyxnbG9iYWwuZDMsZ2xvYmFsLmQzLGdsb2JhbC5kMyxnbG9iYWwuZDMpKTsNCn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzLGQzQXJyYXksZDNDb2xsZWN0aW9uLGQzSW50ZXJwb2xhdGUsZDNGb3JtYXQsZDNUaW1lLGQzVGltZUZvcm1hdCxkM0NvbG9yKSB7ICd1c2Ugc3RyaWN0JzsNCg0KdmFyIGFycmF5ID0gQXJyYXkucHJvdG90eXBlOw0KDQp2YXIgbWFwJDEgPSBhcnJheS5tYXA7DQp2YXIgc2xpY2UgPSBhcnJheS5zbGljZTsNCg0KdmFyIGltcGxpY2l0ID0ge25hbWU6ICJpbXBsaWNpdCJ9Ow0KDQpmdW5jdGlvbiBvcmRpbmFsKHJhbmdlJCQxKSB7DQogIHZhciBpbmRleCA9IGQzQ29sbGVjdGlvbi5tYXAoKSwNCiAgICAgIGRvbWFpbiA9IFtdLA0KICAgICAgdW5rbm93biA9IGltcGxpY2l0Ow0KDQogIHJhbmdlJCQxID0gcmFuZ2UkJDEgPT0gbnVsbCA/IFtdIDogc2xpY2UuY2FsbChyYW5nZSQkMSk7DQoNCiAgZnVuY3Rpb24gc2NhbGUoZCkgew0KICAgIHZhciBrZXkgPSBkICsgIiIsIGkgPSBpbmRleC5nZXQoa2V5KTsNCiAgICBpZiAoIWkpIHsNCiAgICAgIGlmICh1bmtub3duICE9PSBpbXBsaWNpdCkgcmV0dXJuIHVua25vd247DQogICAgICBpbmRleC5zZXQoa2V5LCBpID0gZG9tYWluLnB1c2goZCkpOw0KICAgIH0NCiAgICByZXR1cm4gcmFuZ2UkJDFbKGkgLSAxKSAlIHJhbmdlJCQxLmxlbmd0aF07DQogIH0NCg0KICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluLnNsaWNlKCk7DQogICAgZG9tYWluID0gW10sIGluZGV4ID0gZDNDb2xsZWN0aW9uLm1hcCgpOw0KICAgIHZhciBpID0gLTEsIG4gPSBfLmxlbmd0aCwgZCwga2V5Ow0KICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWluZGV4LmhhcyhrZXkgPSAoZCA9IF9baV0pICsgIiIpKSBpbmRleC5zZXQoa2V5LCBkb21haW4ucHVzaChkKSk7DQogICAgcmV0dXJuIHNjYWxlOw0KICB9Ow0KDQogIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmdlJCQxID0gc2xpY2UuY2FsbChfKSwgc2NhbGUpIDogcmFuZ2UkJDEuc2xpY2UoKTsNCiAgfTsNCg0KICBzY2FsZS51bmtub3duID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHVua25vd24gPSBfLCBzY2FsZSkgOiB1bmtub3duOw0KICB9Ow0KDQogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gb3JkaW5hbCgpDQogICAgICAgIC5kb21haW4oZG9tYWluKQ0KICAgICAgICAucmFuZ2UocmFuZ2UkJDEpDQogICAgICAgIC51bmtub3duKHVua25vd24pOw0KICB9Ow0KDQogIHJldHVybiBzY2FsZTsNCn0NCg0KZnVuY3Rpb24gYmFuZCgpIHsNCiAgdmFyIHNjYWxlID0gb3JkaW5hbCgpLnVua25vd24odW5kZWZpbmVkKSwNCiAgICAgIGRvbWFpbiA9IHNjYWxlLmRvbWFpbiwNCiAgICAgIG9yZGluYWxSYW5nZSA9IHNjYWxlLnJhbmdlLA0KICAgICAgcmFuZ2UkJDEgPSBbMCwgMV0sDQogICAgICBzdGVwLA0KICAgICAgYmFuZHdpZHRoLA0KICAgICAgcm91bmQgPSBmYWxzZSwNCiAgICAgIHBhZGRpbmdJbm5lciA9IDAsDQogICAgICBwYWRkaW5nT3V0ZXIgPSAwLA0KICAgICAgYWxpZ24gPSAwLjU7DQoNCiAgZGVsZXRlIHNjYWxlLnVua25vd247DQoNCiAgZnVuY3Rpb24gcmVzY2FsZSgpIHsNCiAgICB2YXIgbiA9IGRvbWFpbigpLmxlbmd0aCwNCiAgICAgICAgcmV2ZXJzZSA9IHJhbmdlJCQxWzFdIDwgcmFuZ2UkJDFbMF0sDQogICAgICAgIHN0YXJ0ID0gcmFuZ2UkJDFbcmV2ZXJzZSAtIDBdLA0KICAgICAgICBzdG9wID0gcmFuZ2UkJDFbMSAtIHJldmVyc2VdOw0KICAgIHN0ZXAgPSAoc3RvcCAtIHN0YXJ0KSAvIE1hdGgubWF4KDEsIG4gLSBwYWRkaW5nSW5uZXIgKyBwYWRkaW5nT3V0ZXIgKiAyKTsNCiAgICBpZiAocm91bmQpIHN0ZXAgPSBNYXRoLmZsb29yKHN0ZXApOw0KICAgIHN0YXJ0ICs9IChzdG9wIC0gc3RhcnQgLSBzdGVwICogKG4gLSBwYWRkaW5nSW5uZXIpKSAqIGFsaWduOw0KICAgIGJhbmR3aWR0aCA9IHN0ZXAgKiAoMSAtIHBhZGRpbmdJbm5lcik7DQogICAgaWYgKHJvdW5kKSBzdGFydCA9IE1hdGgucm91bmQoc3RhcnQpLCBiYW5kd2lkdGggPSBNYXRoLnJvdW5kKGJhbmR3aWR0aCk7DQogICAgdmFyIHZhbHVlcyA9IGQzQXJyYXkucmFuZ2UobikubWFwKGZ1bmN0aW9uKGkpIHsgcmV0dXJuIHN0YXJ0ICsgc3RlcCAqIGk7IH0pOw0KICAgIHJldHVybiBvcmRpbmFsUmFuZ2UocmV2ZXJzZSA/IHZhbHVlcy5yZXZlcnNlKCkgOiB2YWx1ZXMpOw0KICB9DQoNCiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbihfKSwgcmVzY2FsZSgpKSA6IGRvbWFpbigpOw0KICB9Ow0KDQogIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmdlJCQxID0gWytfWzBdLCArX1sxXV0sIHJlc2NhbGUoKSkgOiByYW5nZSQkMS5zbGljZSgpOw0KICB9Ow0KDQogIHNjYWxlLnJhbmdlUm91bmQgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIHJhbmdlJCQxID0gWytfWzBdLCArX1sxXV0sIHJvdW5kID0gdHJ1ZSwgcmVzY2FsZSgpOw0KICB9Ow0KDQogIHNjYWxlLmJhbmR3aWR0aCA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBiYW5kd2lkdGg7DQogIH07DQoNCiAgc2NhbGUuc3RlcCA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBzdGVwOw0KICB9Ow0KDQogIHNjYWxlLnJvdW5kID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJvdW5kID0gISFfLCByZXNjYWxlKCkpIDogcm91bmQ7DQogIH07DQoNCiAgc2NhbGUucGFkZGluZyA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nSW5uZXIgPSBwYWRkaW5nT3V0ZXIgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBfKSksIHJlc2NhbGUoKSkgOiBwYWRkaW5nSW5uZXI7DQogIH07DQoNCiAgc2NhbGUucGFkZGluZ0lubmVyID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdJbm5lciA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIF8pKSwgcmVzY2FsZSgpKSA6IHBhZGRpbmdJbm5lcjsNCiAgfTsNCg0KICBzY2FsZS5wYWRkaW5nT3V0ZXIgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ091dGVyID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgXykpLCByZXNjYWxlKCkpIDogcGFkZGluZ091dGVyOw0KICB9Ow0KDQogIHNjYWxlLmFsaWduID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGFsaWduID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgXykpLCByZXNjYWxlKCkpIDogYWxpZ247DQogIH07DQoNCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBiYW5kKCkNCiAgICAgICAgLmRvbWFpbihkb21haW4oKSkNCiAgICAgICAgLnJhbmdlKHJhbmdlJCQxKQ0KICAgICAgICAucm91bmQocm91bmQpDQogICAgICAgIC5wYWRkaW5nSW5uZXIocGFkZGluZ0lubmVyKQ0KICAgICAgICAucGFkZGluZ091dGVyKHBhZGRpbmdPdXRlcikNCiAgICAgICAgLmFsaWduKGFsaWduKTsNCiAgfTsNCg0KICByZXR1cm4gcmVzY2FsZSgpOw0KfQ0KDQpmdW5jdGlvbiBwb2ludGlzaChzY2FsZSkgew0KICB2YXIgY29weSA9IHNjYWxlLmNvcHk7DQoNCiAgc2NhbGUucGFkZGluZyA9IHNjYWxlLnBhZGRpbmdPdXRlcjsNCiAgZGVsZXRlIHNjYWxlLnBhZGRpbmdJbm5lcjsNCiAgZGVsZXRlIHNjYWxlLnBhZGRpbmdPdXRlcjsNCg0KICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHBvaW50aXNoKGNvcHkoKSk7DQogIH07DQoNCiAgcmV0dXJuIHNjYWxlOw0KfQ0KDQpmdW5jdGlvbiBwb2ludCgpIHsNCiAgcmV0dXJuIHBvaW50aXNoKGJhbmQoKS5wYWRkaW5nSW5uZXIoMSkpOw0KfQ0KDQp2YXIgY29uc3RhbnQgPSBmdW5jdGlvbih4KSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4geDsNCiAgfTsNCn07DQoNCnZhciBudW1iZXIgPSBmdW5jdGlvbih4KSB7DQogIHJldHVybiAreDsNCn07DQoNCnZhciB1bml0ID0gWzAsIDFdOw0KDQpmdW5jdGlvbiBkZWludGVycG9sYXRlTGluZWFyKGEsIGIpIHsNCiAgcmV0dXJuIChiIC09IChhID0gK2EpKQ0KICAgICAgPyBmdW5jdGlvbih4KSB7IHJldHVybiAoeCAtIGEpIC8gYjsgfQ0KICAgICAgOiBjb25zdGFudChiKTsNCn0NCg0KZnVuY3Rpb24gZGVpbnRlcnBvbGF0ZUNsYW1wKGRlaW50ZXJwb2xhdGUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKGEsIGIpIHsNCiAgICB2YXIgZCA9IGRlaW50ZXJwb2xhdGUoYSA9ICthLCBiID0gK2IpOw0KICAgIHJldHVybiBmdW5jdGlvbih4KSB7IHJldHVybiB4IDw9IGEgPyAwIDogeCA+PSBiID8gMSA6IGQoeCk7IH07DQogIH07DQp9DQoNCmZ1bmN0aW9uIHJlaW50ZXJwb2xhdGVDbGFtcChyZWludGVycG9sYXRlKSB7DQogIHJldHVybiBmdW5jdGlvbihhLCBiKSB7DQogICAgdmFyIHIgPSByZWludGVycG9sYXRlKGEgPSArYSwgYiA9ICtiKTsNCiAgICByZXR1cm4gZnVuY3Rpb24odCkgeyByZXR1cm4gdCA8PSAwID8gYSA6IHQgPj0gMSA/IGIgOiByKHQpOyB9Ow0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBiaW1hcChkb21haW4sIHJhbmdlJCQxLCBkZWludGVycG9sYXRlLCByZWludGVycG9sYXRlKSB7DQogIHZhciBkMCA9IGRvbWFpblswXSwgZDEgPSBkb21haW5bMV0sIHIwID0gcmFuZ2UkJDFbMF0sIHIxID0gcmFuZ2UkJDFbMV07DQogIGlmIChkMSA8IGQwKSBkMCA9IGRlaW50ZXJwb2xhdGUoZDEsIGQwKSwgcjAgPSByZWludGVycG9sYXRlKHIxLCByMCk7DQogIGVsc2UgZDAgPSBkZWludGVycG9sYXRlKGQwLCBkMSksIHIwID0gcmVpbnRlcnBvbGF0ZShyMCwgcjEpOw0KICByZXR1cm4gZnVuY3Rpb24oeCkgeyByZXR1cm4gcjAoZDAoeCkpOyB9Ow0KfQ0KDQpmdW5jdGlvbiBwb2x5bWFwKGRvbWFpbiwgcmFuZ2UkJDEsIGRlaW50ZXJwb2xhdGUsIHJlaW50ZXJwb2xhdGUpIHsNCiAgdmFyIGogPSBNYXRoLm1pbihkb21haW4ubGVuZ3RoLCByYW5nZSQkMS5sZW5ndGgpIC0gMSwNCiAgICAgIGQgPSBuZXcgQXJyYXkoaiksDQogICAgICByID0gbmV3IEFycmF5KGopLA0KICAgICAgaSA9IC0xOw0KDQogIC8vIFJldmVyc2UgZGVzY2VuZGluZyBkb21haW5zLg0KICBpZiAoZG9tYWluW2pdIDwgZG9tYWluWzBdKSB7DQogICAgZG9tYWluID0gZG9tYWluLnNsaWNlKCkucmV2ZXJzZSgpOw0KICAgIHJhbmdlJCQxID0gcmFuZ2UkJDEuc2xpY2UoKS5yZXZlcnNlKCk7DQogIH0NCg0KICB3aGlsZSAoKytpIDwgaikgew0KICAgIGRbaV0gPSBkZWludGVycG9sYXRlKGRvbWFpbltpXSwgZG9tYWluW2kgKyAxXSk7DQogICAgcltpXSA9IHJlaW50ZXJwb2xhdGUocmFuZ2UkJDFbaV0sIHJhbmdlJCQxW2kgKyAxXSk7DQogIH0NCg0KICByZXR1cm4gZnVuY3Rpb24oeCkgew0KICAgIHZhciBpID0gZDNBcnJheS5iaXNlY3QoZG9tYWluLCB4LCAxLCBqKSAtIDE7DQogICAgcmV0dXJuIHJbaV0oZFtpXSh4KSk7DQogIH07DQp9DQoNCmZ1bmN0aW9uIGNvcHkoc291cmNlLCB0YXJnZXQpIHsNCiAgcmV0dXJuIHRhcmdldA0KICAgICAgLmRvbWFpbihzb3VyY2UuZG9tYWluKCkpDQogICAgICAucmFuZ2Uoc291cmNlLnJhbmdlKCkpDQogICAgICAuaW50ZXJwb2xhdGUoc291cmNlLmludGVycG9sYXRlKCkpDQogICAgICAuY2xhbXAoc291cmNlLmNsYW1wKCkpOw0KfQ0KDQovLyBkZWludGVycG9sYXRlKGEsIGIpKHgpIHRha2VzIGEgZG9tYWluIHZhbHVlIHggaW4gW2EsYl0gYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyIHQgaW4gWzAsMV0uDQovLyByZWludGVycG9sYXRlKGEsIGIpKHQpIHRha2VzIGEgcGFyYW1ldGVyIHQgaW4gWzAsMV0gYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgZG9tYWluIHZhbHVlIHggaW4gW2EsYl0uDQpmdW5jdGlvbiBjb250aW51b3VzKGRlaW50ZXJwb2xhdGUsIHJlaW50ZXJwb2xhdGUpIHsNCiAgdmFyIGRvbWFpbiA9IHVuaXQsDQogICAgICByYW5nZSQkMSA9IHVuaXQsDQogICAgICBpbnRlcnBvbGF0ZSQkMSA9IGQzSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGUsDQogICAgICBjbGFtcCA9IGZhbHNlLA0KICAgICAgcGllY2V3aXNlLA0KICAgICAgb3V0cHV0LA0KICAgICAgaW5wdXQ7DQoNCiAgZnVuY3Rpb24gcmVzY2FsZSgpIHsNCiAgICBwaWVjZXdpc2UgPSBNYXRoLm1pbihkb21haW4ubGVuZ3RoLCByYW5nZSQkMS5sZW5ndGgpID4gMiA/IHBvbHltYXAgOiBiaW1hcDsNCiAgICBvdXRwdXQgPSBpbnB1dCA9IG51bGw7DQogICAgcmV0dXJuIHNjYWxlOw0KICB9DQoNCiAgZnVuY3Rpb24gc2NhbGUoeCkgew0KICAgIHJldHVybiAob3V0cHV0IHx8IChvdXRwdXQgPSBwaWVjZXdpc2UoZG9tYWluLCByYW5nZSQkMSwgY2xhbXAgPyBkZWludGVycG9sYXRlQ2xhbXAoZGVpbnRlcnBvbGF0ZSkgOiBkZWludGVycG9sYXRlLCBpbnRlcnBvbGF0ZSQkMSkpKSgreCk7DQogIH0NCg0KICBzY2FsZS5pbnZlcnQgPSBmdW5jdGlvbih5KSB7DQogICAgcmV0dXJuIChpbnB1dCB8fCAoaW5wdXQgPSBwaWVjZXdpc2UocmFuZ2UkJDEsIGRvbWFpbiwgZGVpbnRlcnBvbGF0ZUxpbmVhciwgY2xhbXAgPyByZWludGVycG9sYXRlQ2xhbXAocmVpbnRlcnBvbGF0ZSkgOiByZWludGVycG9sYXRlKSkpKCt5KTsNCiAgfTsNCg0KICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluID0gbWFwJDEuY2FsbChfLCBudW1iZXIpLCByZXNjYWxlKCkpIDogZG9tYWluLnNsaWNlKCk7DQogIH07DQoNCiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UkJDEgPSBzbGljZS5jYWxsKF8pLCByZXNjYWxlKCkpIDogcmFuZ2UkJDEuc2xpY2UoKTsNCiAgfTsNCg0KICBzY2FsZS5yYW5nZVJvdW5kID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiByYW5nZSQkMSA9IHNsaWNlLmNhbGwoXyksIGludGVycG9sYXRlJCQxID0gZDNJbnRlcnBvbGF0ZS5pbnRlcnBvbGF0ZVJvdW5kLCByZXNjYWxlKCk7DQogIH07DQoNCiAgc2NhbGUuY2xhbXAgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2xhbXAgPSAhIV8sIHJlc2NhbGUoKSkgOiBjbGFtcDsNCiAgfTsNCg0KICBzY2FsZS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpbnRlcnBvbGF0ZSQkMSA9IF8sIHJlc2NhbGUoKSkgOiBpbnRlcnBvbGF0ZSQkMTsNCiAgfTsNCg0KICByZXR1cm4gcmVzY2FsZSgpOw0KfQ0KDQp2YXIgdGlja0Zvcm1hdCA9IGZ1bmN0aW9uKGRvbWFpbiwgY291bnQsIHNwZWNpZmllcikgew0KICB2YXIgc3RhcnQgPSBkb21haW5bMF0sDQogICAgICBzdG9wID0gZG9tYWluW2RvbWFpbi5sZW5ndGggLSAxXSwNCiAgICAgIHN0ZXAgPSBkM0FycmF5LnRpY2tTdGVwKHN0YXJ0LCBzdG9wLCBjb3VudCA9PSBudWxsID8gMTAgOiBjb3VudCksDQogICAgICBwcmVjaXNpb247DQogIHNwZWNpZmllciA9IGQzRm9ybWF0LmZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIgPT0gbnVsbCA/ICIsZiIgOiBzcGVjaWZpZXIpOw0KICBzd2l0Y2ggKHNwZWNpZmllci50eXBlKSB7DQogICAgY2FzZSAicyI6IHsNCiAgICAgIHZhciB2YWx1ZSA9IE1hdGgubWF4KE1hdGguYWJzKHN0YXJ0KSwgTWF0aC5hYnMoc3RvcCkpOw0KICAgICAgaWYgKHNwZWNpZmllci5wcmVjaXNpb24gPT0gbnVsbCAmJiAhaXNOYU4ocHJlY2lzaW9uID0gZDNGb3JtYXQucHJlY2lzaW9uUHJlZml4KHN0ZXAsIHZhbHVlKSkpIHNwZWNpZmllci5wcmVjaXNpb24gPSBwcmVjaXNpb247DQogICAgICByZXR1cm4gZDNGb3JtYXQuZm9ybWF0UHJlZml4KHNwZWNpZmllciwgdmFsdWUpOw0KICAgIH0NCiAgICBjYXNlICIiOg0KICAgIGNhc2UgImUiOg0KICAgIGNhc2UgImciOg0KICAgIGNhc2UgInAiOg0KICAgIGNhc2UgInIiOiB7DQogICAgICBpZiAoc3BlY2lmaWVyLnByZWNpc2lvbiA9PSBudWxsICYmICFpc05hTihwcmVjaXNpb24gPSBkM0Zvcm1hdC5wcmVjaXNpb25Sb3VuZChzdGVwLCBNYXRoLm1heChNYXRoLmFicyhzdGFydCksIE1hdGguYWJzKHN0b3ApKSkpKSBzcGVjaWZpZXIucHJlY2lzaW9uID0gcHJlY2lzaW9uIC0gKHNwZWNpZmllci50eXBlID09PSAiZSIpOw0KICAgICAgYnJlYWs7DQogICAgfQ0KICAgIGNhc2UgImYiOg0KICAgIGNhc2UgIiUiOiB7DQogICAgICBpZiAoc3BlY2lmaWVyLnByZWNpc2lvbiA9PSBudWxsICYmICFpc05hTihwcmVjaXNpb24gPSBkM0Zvcm1hdC5wcmVjaXNpb25GaXhlZChzdGVwKSkpIHNwZWNpZmllci5wcmVjaXNpb24gPSBwcmVjaXNpb24gLSAoc3BlY2lmaWVyLnR5cGUgPT09ICIlIikgKiAyOw0KICAgICAgYnJlYWs7DQogICAgfQ0KICB9DQogIHJldHVybiBkM0Zvcm1hdC5mb3JtYXQoc3BlY2lmaWVyKTsNCn07DQoNCmZ1bmN0aW9uIGxpbmVhcmlzaChzY2FsZSkgew0KICB2YXIgZG9tYWluID0gc2NhbGUuZG9tYWluOw0KDQogIHNjYWxlLnRpY2tzID0gZnVuY3Rpb24oY291bnQpIHsNCiAgICB2YXIgZCA9IGRvbWFpbigpOw0KICAgIHJldHVybiBkM0FycmF5LnRpY2tzKGRbMF0sIGRbZC5sZW5ndGggLSAxXSwgY291bnQgPT0gbnVsbCA/IDEwIDogY291bnQpOw0KICB9Ow0KDQogIHNjYWxlLnRpY2tGb3JtYXQgPSBmdW5jdGlvbihjb3VudCwgc3BlY2lmaWVyKSB7DQogICAgcmV0dXJuIHRpY2tGb3JtYXQoZG9tYWluKCksIGNvdW50LCBzcGVjaWZpZXIpOw0KICB9Ow0KDQogIHNjYWxlLm5pY2UgPSBmdW5jdGlvbihjb3VudCkgew0KICAgIGlmIChjb3VudCA9PSBudWxsKSBjb3VudCA9IDEwOw0KDQogICAgdmFyIGQgPSBkb21haW4oKSwNCiAgICAgICAgaTAgPSAwLA0KICAgICAgICBpMSA9IGQubGVuZ3RoIC0gMSwNCiAgICAgICAgc3RhcnQgPSBkW2kwXSwNCiAgICAgICAgc3RvcCA9IGRbaTFdLA0KICAgICAgICBzdGVwOw0KDQogICAgaWYgKHN0b3AgPCBzdGFydCkgew0KICAgICAgc3RlcCA9IHN0YXJ0LCBzdGFydCA9IHN0b3AsIHN0b3AgPSBzdGVwOw0KICAgICAgc3RlcCA9IGkwLCBpMCA9IGkxLCBpMSA9IHN0ZXA7DQogICAgfQ0KDQogICAgc3RlcCA9IGQzQXJyYXkudGlja0luY3JlbWVudChzdGFydCwgc3RvcCwgY291bnQpOw0KDQogICAgaWYgKHN0ZXAgPiAwKSB7DQogICAgICBzdGFydCA9IE1hdGguZmxvb3Ioc3RhcnQgLyBzdGVwKSAqIHN0ZXA7DQogICAgICBzdG9wID0gTWF0aC5jZWlsKHN0b3AgLyBzdGVwKSAqIHN0ZXA7DQogICAgICBzdGVwID0gZDNBcnJheS50aWNrSW5jcmVtZW50KHN0YXJ0LCBzdG9wLCBjb3VudCk7DQogICAgfSBlbHNlIGlmIChzdGVwIDwgMCkgew0KICAgICAgc3RhcnQgPSBNYXRoLmNlaWwoc3RhcnQgKiBzdGVwKSAvIHN0ZXA7DQogICAgICBzdG9wID0gTWF0aC5mbG9vcihzdG9wICogc3RlcCkgLyBzdGVwOw0KICAgICAgc3RlcCA9IGQzQXJyYXkudGlja0luY3JlbWVudChzdGFydCwgc3RvcCwgY291bnQpOw0KICAgIH0NCg0KICAgIGlmIChzdGVwID4gMCkgew0KICAgICAgZFtpMF0gPSBNYXRoLmZsb29yKHN0YXJ0IC8gc3RlcCkgKiBzdGVwOw0KICAgICAgZFtpMV0gPSBNYXRoLmNlaWwoc3RvcCAvIHN0ZXApICogc3RlcDsNCiAgICAgIGRvbWFpbihkKTsNCiAgICB9IGVsc2UgaWYgKHN0ZXAgPCAwKSB7DQogICAgICBkW2kwXSA9IE1hdGguY2VpbChzdGFydCAqIHN0ZXApIC8gc3RlcDsNCiAgICAgIGRbaTFdID0gTWF0aC5mbG9vcihzdG9wICogc3RlcCkgLyBzdGVwOw0KICAgICAgZG9tYWluKGQpOw0KICAgIH0NCg0KICAgIHJldHVybiBzY2FsZTsNCiAgfTsNCg0KICByZXR1cm4gc2NhbGU7DQp9DQoNCmZ1bmN0aW9uIGxpbmVhcigpIHsNCiAgdmFyIHNjYWxlID0gY29udGludW91cyhkZWludGVycG9sYXRlTGluZWFyLCBkM0ludGVycG9sYXRlLmludGVycG9sYXRlTnVtYmVyKTsNCg0KICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIGNvcHkoc2NhbGUsIGxpbmVhcigpKTsNCiAgfTsNCg0KICByZXR1cm4gbGluZWFyaXNoKHNjYWxlKTsNCn0NCg0KZnVuY3Rpb24gaWRlbnRpdHkoKSB7DQogIHZhciBkb21haW4gPSBbMCwgMV07DQoNCiAgZnVuY3Rpb24gc2NhbGUoeCkgew0KICAgIHJldHVybiAreDsNCiAgfQ0KDQogIHNjYWxlLmludmVydCA9IHNjYWxlOw0KDQogIHNjYWxlLmRvbWFpbiA9IHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbiA9IG1hcCQxLmNhbGwoXywgbnVtYmVyKSwgc2NhbGUpIDogZG9tYWluLnNsaWNlKCk7DQogIH07DQoNCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBpZGVudGl0eSgpLmRvbWFpbihkb21haW4pOw0KICB9Ow0KDQogIHJldHVybiBsaW5lYXJpc2goc2NhbGUpOw0KfQ0KDQp2YXIgbmljZSA9IGZ1bmN0aW9uKGRvbWFpbiwgaW50ZXJ2YWwpIHsNCiAgZG9tYWluID0gZG9tYWluLnNsaWNlKCk7DQoNCiAgdmFyIGkwID0gMCwNCiAgICAgIGkxID0gZG9tYWluLmxlbmd0aCAtIDEsDQogICAgICB4MCA9IGRvbWFpbltpMF0sDQogICAgICB4MSA9IGRvbWFpbltpMV0sDQogICAgICB0Ow0KDQogIGlmICh4MSA8IHgwKSB7DQogICAgdCA9IGkwLCBpMCA9IGkxLCBpMSA9IHQ7DQogICAgdCA9IHgwLCB4MCA9IHgxLCB4MSA9IHQ7DQogIH0NCg0KICBkb21haW5baTBdID0gaW50ZXJ2YWwuZmxvb3IoeDApOw0KICBkb21haW5baTFdID0gaW50ZXJ2YWwuY2VpbCh4MSk7DQogIHJldHVybiBkb21haW47DQp9Ow0KDQpmdW5jdGlvbiBkZWludGVycG9sYXRlKGEsIGIpIHsNCiAgcmV0dXJuIChiID0gTWF0aC5sb2coYiAvIGEpKQ0KICAgICAgPyBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLmxvZyh4IC8gYSkgLyBiOyB9DQogICAgICA6IGNvbnN0YW50KGIpOw0KfQ0KDQpmdW5jdGlvbiByZWludGVycG9sYXRlKGEsIGIpIHsNCiAgcmV0dXJuIGEgPCAwDQogICAgICA/IGZ1bmN0aW9uKHQpIHsgcmV0dXJuIC1NYXRoLnBvdygtYiwgdCkgKiBNYXRoLnBvdygtYSwgMSAtIHQpOyB9DQogICAgICA6IGZ1bmN0aW9uKHQpIHsgcmV0dXJuIE1hdGgucG93KGIsIHQpICogTWF0aC5wb3coYSwgMSAtIHQpOyB9Ow0KfQ0KDQpmdW5jdGlvbiBwb3cxMCh4KSB7DQogIHJldHVybiBpc0Zpbml0ZSh4KSA/ICsoIjFlIiArIHgpIDogeCA8IDAgPyAwIDogeDsNCn0NCg0KZnVuY3Rpb24gcG93cChiYXNlKSB7DQogIHJldHVybiBiYXNlID09PSAxMCA/IHBvdzEwDQogICAgICA6IGJhc2UgPT09IE1hdGguRSA/IE1hdGguZXhwDQogICAgICA6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgucG93KGJhc2UsIHgpOyB9Ow0KfQ0KDQpmdW5jdGlvbiBsb2dwKGJhc2UpIHsNCiAgcmV0dXJuIGJhc2UgPT09IE1hdGguRSA/IE1hdGgubG9nDQogICAgICA6IGJhc2UgPT09IDEwICYmIE1hdGgubG9nMTANCiAgICAgIHx8IGJhc2UgPT09IDIgJiYgTWF0aC5sb2cyDQogICAgICB8fCAoYmFzZSA9IE1hdGgubG9nKGJhc2UpLCBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLmxvZyh4KSAvIGJhc2U7IH0pOw0KfQ0KDQpmdW5jdGlvbiByZWZsZWN0KGYpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsNCiAgICByZXR1cm4gLWYoLXgpOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBsb2coKSB7DQogIHZhciBzY2FsZSA9IGNvbnRpbnVvdXMoZGVpbnRlcnBvbGF0ZSwgcmVpbnRlcnBvbGF0ZSkuZG9tYWluKFsxLCAxMF0pLA0KICAgICAgZG9tYWluID0gc2NhbGUuZG9tYWluLA0KICAgICAgYmFzZSA9IDEwLA0KICAgICAgbG9ncyA9IGxvZ3AoMTApLA0KICAgICAgcG93cyA9IHBvd3AoMTApOw0KDQogIGZ1bmN0aW9uIHJlc2NhbGUoKSB7DQogICAgbG9ncyA9IGxvZ3AoYmFzZSksIHBvd3MgPSBwb3dwKGJhc2UpOw0KICAgIGlmIChkb21haW4oKVswXSA8IDApIGxvZ3MgPSByZWZsZWN0KGxvZ3MpLCBwb3dzID0gcmVmbGVjdChwb3dzKTsNCiAgICByZXR1cm4gc2NhbGU7DQogIH0NCg0KICBzY2FsZS5iYXNlID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGJhc2UgPSArXywgcmVzY2FsZSgpKSA6IGJhc2U7DQogIH07DQoNCiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbihfKSwgcmVzY2FsZSgpKSA6IGRvbWFpbigpOw0KICB9Ow0KDQogIHNjYWxlLnRpY2tzID0gZnVuY3Rpb24oY291bnQpIHsNCiAgICB2YXIgZCA9IGRvbWFpbigpLA0KICAgICAgICB1ID0gZFswXSwNCiAgICAgICAgdiA9IGRbZC5sZW5ndGggLSAxXSwNCiAgICAgICAgcjsNCg0KICAgIGlmIChyID0gdiA8IHUpIGkgPSB1LCB1ID0gdiwgdiA9IGk7DQoNCiAgICB2YXIgaSA9IGxvZ3ModSksDQogICAgICAgIGogPSBsb2dzKHYpLA0KICAgICAgICBwLA0KICAgICAgICBrLA0KICAgICAgICB0LA0KICAgICAgICBuID0gY291bnQgPT0gbnVsbCA/IDEwIDogK2NvdW50LA0KICAgICAgICB6ID0gW107DQoNCiAgICBpZiAoIShiYXNlICUgMSkgJiYgaiAtIGkgPCBuKSB7DQogICAgICBpID0gTWF0aC5yb3VuZChpKSAtIDEsIGogPSBNYXRoLnJvdW5kKGopICsgMTsNCiAgICAgIGlmICh1ID4gMCkgZm9yICg7IGkgPCBqOyArK2kpIHsNCiAgICAgICAgZm9yIChrID0gMSwgcCA9IHBvd3MoaSk7IGsgPCBiYXNlOyArK2spIHsNCiAgICAgICAgICB0ID0gcCAqIGs7DQogICAgICAgICAgaWYgKHQgPCB1KSBjb250aW51ZTsNCiAgICAgICAgICBpZiAodCA+IHYpIGJyZWFrOw0KICAgICAgICAgIHoucHVzaCh0KTsNCiAgICAgICAgfQ0KICAgICAgfSBlbHNlIGZvciAoOyBpIDwgajsgKytpKSB7DQogICAgICAgIGZvciAoayA9IGJhc2UgLSAxLCBwID0gcG93cyhpKTsgayA+PSAxOyAtLWspIHsNCiAgICAgICAgICB0ID0gcCAqIGs7DQogICAgICAgICAgaWYgKHQgPCB1KSBjb250aW51ZTsNCiAgICAgICAgICBpZiAodCA+IHYpIGJyZWFrOw0KICAgICAgICAgIHoucHVzaCh0KTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICB6ID0gZDNBcnJheS50aWNrcyhpLCBqLCBNYXRoLm1pbihqIC0gaSwgbikpLm1hcChwb3dzKTsNCiAgICB9DQoNCiAgICByZXR1cm4gciA/IHoucmV2ZXJzZSgpIDogejsNCiAgfTsNCg0KICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rpb24oY291bnQsIHNwZWNpZmllcikgew0KICAgIGlmIChzcGVjaWZpZXIgPT0gbnVsbCkgc3BlY2lmaWVyID0gYmFzZSA9PT0gMTAgPyAiLjBlIiA6ICIsIjsNCiAgICBpZiAodHlwZW9mIHNwZWNpZmllciAhPT0gImZ1bmN0aW9uIikgc3BlY2lmaWVyID0gZDNGb3JtYXQuZm9ybWF0KHNwZWNpZmllcik7DQogICAgaWYgKGNvdW50ID09PSBJbmZpbml0eSkgcmV0dXJuIHNwZWNpZmllcjsNCiAgICBpZiAoY291bnQgPT0gbnVsbCkgY291bnQgPSAxMDsNCiAgICB2YXIgayA9IE1hdGgubWF4KDEsIGJhc2UgKiBjb3VudCAvIHNjYWxlLnRpY2tzKCkubGVuZ3RoKTsgLy8gVE9ETyBmYXN0IGVzdGltYXRlPw0KICAgIHJldHVybiBmdW5jdGlvbihkKSB7DQogICAgICB2YXIgaSA9IGQgLyBwb3dzKE1hdGgucm91bmQobG9ncyhkKSkpOw0KICAgICAgaWYgKGkgKiBiYXNlIDwgYmFzZSAtIDAuNSkgaSAqPSBiYXNlOw0KICAgICAgcmV0dXJuIGkgPD0gayA/IHNwZWNpZmllcihkKSA6ICIiOw0KICAgIH07DQogIH07DQoNCiAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBkb21haW4obmljZShkb21haW4oKSwgew0KICAgICAgZmxvb3I6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHBvd3MoTWF0aC5mbG9vcihsb2dzKHgpKSk7IH0sDQogICAgICBjZWlsOiBmdW5jdGlvbih4KSB7IHJldHVybiBwb3dzKE1hdGguY2VpbChsb2dzKHgpKSk7IH0NCiAgICB9KSk7DQogIH07DQoNCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBjb3B5KHNjYWxlLCBsb2coKS5iYXNlKGJhc2UpKTsNCiAgfTsNCg0KICByZXR1cm4gc2NhbGU7DQp9DQoNCmZ1bmN0aW9uIHJhaXNlKHgsIGV4cG9uZW50KSB7DQogIHJldHVybiB4IDwgMCA/IC1NYXRoLnBvdygteCwgZXhwb25lbnQpIDogTWF0aC5wb3coeCwgZXhwb25lbnQpOw0KfQ0KDQpmdW5jdGlvbiBwb3coKSB7DQogIHZhciBleHBvbmVudCA9IDEsDQogICAgICBzY2FsZSA9IGNvbnRpbnVvdXMoZGVpbnRlcnBvbGF0ZSwgcmVpbnRlcnBvbGF0ZSksDQogICAgICBkb21haW4gPSBzY2FsZS5kb21haW47DQoNCiAgZnVuY3Rpb24gZGVpbnRlcnBvbGF0ZShhLCBiKSB7DQogICAgcmV0dXJuIChiID0gcmFpc2UoYiwgZXhwb25lbnQpIC0gKGEgPSByYWlzZShhLCBleHBvbmVudCkpKQ0KICAgICAgICA/IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIChyYWlzZSh4LCBleHBvbmVudCkgLSBhKSAvIGI7IH0NCiAgICAgICAgOiBjb25zdGFudChiKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHJlaW50ZXJwb2xhdGUoYSwgYikgew0KICAgIGIgPSByYWlzZShiLCBleHBvbmVudCkgLSAoYSA9IHJhaXNlKGEsIGV4cG9uZW50KSk7DQogICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsgcmV0dXJuIHJhaXNlKGEgKyBiICogdCwgMSAvIGV4cG9uZW50KTsgfTsNCiAgfQ0KDQogIHNjYWxlLmV4cG9uZW50ID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV4cG9uZW50ID0gK18sIGRvbWFpbihkb21haW4oKSkpIDogZXhwb25lbnQ7DQogIH07DQoNCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBjb3B5KHNjYWxlLCBwb3coKS5leHBvbmVudChleHBvbmVudCkpOw0KICB9Ow0KDQogIHJldHVybiBsaW5lYXJpc2goc2NhbGUpOw0KfQ0KDQpmdW5jdGlvbiBzcXJ0KCkgew0KICByZXR1cm4gcG93KCkuZXhwb25lbnQoMC41KTsNCn0NCg0KZnVuY3Rpb24gcXVhbnRpbGUkMSgpIHsNCiAgdmFyIGRvbWFpbiA9IFtdLA0KICAgICAgcmFuZ2UkJDEgPSBbXSwNCiAgICAgIHRocmVzaG9sZHMgPSBbXTsNCg0KICBmdW5jdGlvbiByZXNjYWxlKCkgew0KICAgIHZhciBpID0gMCwgbiA9IE1hdGgubWF4KDEsIHJhbmdlJCQxLmxlbmd0aCk7DQogICAgdGhyZXNob2xkcyA9IG5ldyBBcnJheShuIC0gMSk7DQogICAgd2hpbGUgKCsraSA8IG4pIHRocmVzaG9sZHNbaSAtIDFdID0gZDNBcnJheS5xdWFudGlsZShkb21haW4sIGkgLyBuKTsNCiAgICByZXR1cm4gc2NhbGU7DQogIH0NCg0KICBmdW5jdGlvbiBzY2FsZSh4KSB7DQogICAgaWYgKCFpc05hTih4ID0gK3gpKSByZXR1cm4gcmFuZ2UkJDFbZDNBcnJheS5iaXNlY3QodGhyZXNob2xkcywgeCldOw0KICB9DQoNCiAgc2NhbGUuaW52ZXJ0RXh0ZW50ID0gZnVuY3Rpb24oeSkgew0KICAgIHZhciBpID0gcmFuZ2UkJDEuaW5kZXhPZih5KTsNCiAgICByZXR1cm4gaSA8IDAgPyBbTmFOLCBOYU5dIDogWw0KICAgICAgaSA+IDAgPyB0aHJlc2hvbGRzW2kgLSAxXSA6IGRvbWFpblswXSwNCiAgICAgIGkgPCB0aHJlc2hvbGRzLmxlbmd0aCA/IHRocmVzaG9sZHNbaV0gOiBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdDQogICAgXTsNCiAgfTsNCg0KICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluLnNsaWNlKCk7DQogICAgZG9tYWluID0gW107DQogICAgZm9yICh2YXIgaSA9IDAsIG4gPSBfLmxlbmd0aCwgZDsgaSA8IG47ICsraSkgaWYgKGQgPSBfW2ldLCBkICE9IG51bGwgJiYgIWlzTmFOKGQgPSArZCkpIGRvbWFpbi5wdXNoKGQpOw0KICAgIGRvbWFpbi5zb3J0KGQzQXJyYXkuYXNjZW5kaW5nKTsNCiAgICByZXR1cm4gcmVzY2FsZSgpOw0KICB9Ow0KDQogIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmdlJCQxID0gc2xpY2UuY2FsbChfKSwgcmVzY2FsZSgpKSA6IHJhbmdlJCQxLnNsaWNlKCk7DQogIH07DQoNCiAgc2NhbGUucXVhbnRpbGVzID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHRocmVzaG9sZHMuc2xpY2UoKTsNCiAgfTsNCg0KICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHF1YW50aWxlJDEoKQ0KICAgICAgICAuZG9tYWluKGRvbWFpbikNCiAgICAgICAgLnJhbmdlKHJhbmdlJCQxKTsNCiAgfTsNCg0KICByZXR1cm4gc2NhbGU7DQp9DQoNCmZ1bmN0aW9uIHF1YW50aXplKCkgew0KICB2YXIgeDAgPSAwLA0KICAgICAgeDEgPSAxLA0KICAgICAgbiA9IDEsDQogICAgICBkb21haW4gPSBbMC41XSwNCiAgICAgIHJhbmdlJCQxID0gWzAsIDFdOw0KDQogIGZ1bmN0aW9uIHNjYWxlKHgpIHsNCiAgICBpZiAoeCA8PSB4KSByZXR1cm4gcmFuZ2UkJDFbZDNBcnJheS5iaXNlY3QoZG9tYWluLCB4LCAwLCBuKV07DQogIH0NCg0KICBmdW5jdGlvbiByZXNjYWxlKCkgew0KICAgIHZhciBpID0gLTE7DQogICAgZG9tYWluID0gbmV3IEFycmF5KG4pOw0KICAgIHdoaWxlICgrK2kgPCBuKSBkb21haW5baV0gPSAoKGkgKyAxKSAqIHgxIC0gKGkgLSBuKSAqIHgwKSAvIChuICsgMSk7DQogICAgcmV0dXJuIHNjYWxlOw0KICB9DQoNCiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHgwID0gK19bMF0sIHgxID0gK19bMV0sIHJlc2NhbGUoKSkgOiBbeDAsIHgxXTsNCiAgfTsNCg0KICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChuID0gKHJhbmdlJCQxID0gc2xpY2UuY2FsbChfKSkubGVuZ3RoIC0gMSwgcmVzY2FsZSgpKSA6IHJhbmdlJCQxLnNsaWNlKCk7DQogIH07DQoNCiAgc2NhbGUuaW52ZXJ0RXh0ZW50ID0gZnVuY3Rpb24oeSkgew0KICAgIHZhciBpID0gcmFuZ2UkJDEuaW5kZXhPZih5KTsNCiAgICByZXR1cm4gaSA8IDAgPyBbTmFOLCBOYU5dDQogICAgICAgIDogaSA8IDEgPyBbeDAsIGRvbWFpblswXV0NCiAgICAgICAgOiBpID49IG4gPyBbZG9tYWluW24gLSAxXSwgeDFdDQogICAgICAgIDogW2RvbWFpbltpIC0gMV0sIGRvbWFpbltpXV07DQogIH07DQoNCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBxdWFudGl6ZSgpDQogICAgICAgIC5kb21haW4oW3gwLCB4MV0pDQogICAgICAgIC5yYW5nZShyYW5nZSQkMSk7DQogIH07DQoNCiAgcmV0dXJuIGxpbmVhcmlzaChzY2FsZSk7DQp9DQoNCmZ1bmN0aW9uIHRocmVzaG9sZCgpIHsNCiAgdmFyIGRvbWFpbiA9IFswLjVdLA0KICAgICAgcmFuZ2UkJDEgPSBbMCwgMV0sDQogICAgICBuID0gMTsNCg0KICBmdW5jdGlvbiBzY2FsZSh4KSB7DQogICAgaWYgKHggPD0geCkgcmV0dXJuIHJhbmdlJCQxW2QzQXJyYXkuYmlzZWN0KGRvbWFpbiwgeCwgMCwgbildOw0KICB9DQoNCiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbiA9IHNsaWNlLmNhbGwoXyksIG4gPSBNYXRoLm1pbihkb21haW4ubGVuZ3RoLCByYW5nZSQkMS5sZW5ndGggLSAxKSwgc2NhbGUpIDogZG9tYWluLnNsaWNlKCk7DQogIH07DQoNCiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UkJDEgPSBzbGljZS5jYWxsKF8pLCBuID0gTWF0aC5taW4oZG9tYWluLmxlbmd0aCwgcmFuZ2UkJDEubGVuZ3RoIC0gMSksIHNjYWxlKSA6IHJhbmdlJCQxLnNsaWNlKCk7DQogIH07DQoNCiAgc2NhbGUuaW52ZXJ0RXh0ZW50ID0gZnVuY3Rpb24oeSkgew0KICAgIHZhciBpID0gcmFuZ2UkJDEuaW5kZXhPZih5KTsNCiAgICByZXR1cm4gW2RvbWFpbltpIC0gMV0sIGRvbWFpbltpXV07DQogIH07DQoNCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aHJlc2hvbGQoKQ0KICAgICAgICAuZG9tYWluKGRvbWFpbikNCiAgICAgICAgLnJhbmdlKHJhbmdlJCQxKTsNCiAgfTsNCg0KICByZXR1cm4gc2NhbGU7DQp9DQoNCnZhciBkdXJhdGlvblNlY29uZCA9IDEwMDA7DQp2YXIgZHVyYXRpb25NaW51dGUgPSBkdXJhdGlvblNlY29uZCAqIDYwOw0KdmFyIGR1cmF0aW9uSG91ciA9IGR1cmF0aW9uTWludXRlICogNjA7DQp2YXIgZHVyYXRpb25EYXkgPSBkdXJhdGlvbkhvdXIgKiAyNDsNCnZhciBkdXJhdGlvbldlZWsgPSBkdXJhdGlvbkRheSAqIDc7DQp2YXIgZHVyYXRpb25Nb250aCA9IGR1cmF0aW9uRGF5ICogMzA7DQp2YXIgZHVyYXRpb25ZZWFyID0gZHVyYXRpb25EYXkgKiAzNjU7DQoNCmZ1bmN0aW9uIGRhdGUodCkgew0KICByZXR1cm4gbmV3IERhdGUodCk7DQp9DQoNCmZ1bmN0aW9uIG51bWJlciQxKHQpIHsNCiAgcmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlID8gK3QgOiArbmV3IERhdGUoK3QpOw0KfQ0KDQpmdW5jdGlvbiBjYWxlbmRhcih5ZWFyLCBtb250aCwgd2VlaywgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQsIGZvcm1hdCQkMSkgew0KICB2YXIgc2NhbGUgPSBjb250aW51b3VzKGRlaW50ZXJwb2xhdGVMaW5lYXIsIGQzSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGVOdW1iZXIpLA0KICAgICAgaW52ZXJ0ID0gc2NhbGUuaW52ZXJ0LA0KICAgICAgZG9tYWluID0gc2NhbGUuZG9tYWluOw0KDQogIHZhciBmb3JtYXRNaWxsaXNlY29uZCA9IGZvcm1hdCQkMSgiLiVMIiksDQogICAgICBmb3JtYXRTZWNvbmQgPSBmb3JtYXQkJDEoIjolUyIpLA0KICAgICAgZm9ybWF0TWludXRlID0gZm9ybWF0JCQxKCIlSTolTSIpLA0KICAgICAgZm9ybWF0SG91ciA9IGZvcm1hdCQkMSgiJUkgJXAiKSwNCiAgICAgIGZvcm1hdERheSA9IGZvcm1hdCQkMSgiJWEgJWQiKSwNCiAgICAgIGZvcm1hdFdlZWsgPSBmb3JtYXQkJDEoIiViICVkIiksDQogICAgICBmb3JtYXRNb250aCA9IGZvcm1hdCQkMSgiJUIiKSwNCiAgICAgIGZvcm1hdFllYXIgPSBmb3JtYXQkJDEoIiVZIik7DQoNCiAgdmFyIHRpY2tJbnRlcnZhbHMgPSBbDQogICAgW3NlY29uZCwgIDEsICAgICAgZHVyYXRpb25TZWNvbmRdLA0KICAgIFtzZWNvbmQsICA1LCAgNSAqIGR1cmF0aW9uU2Vjb25kXSwNCiAgICBbc2Vjb25kLCAxNSwgMTUgKiBkdXJhdGlvblNlY29uZF0sDQogICAgW3NlY29uZCwgMzAsIDMwICogZHVyYXRpb25TZWNvbmRdLA0KICAgIFttaW51dGUsICAxLCAgICAgIGR1cmF0aW9uTWludXRlXSwNCiAgICBbbWludXRlLCAgNSwgIDUgKiBkdXJhdGlvbk1pbnV0ZV0sDQogICAgW21pbnV0ZSwgMTUsIDE1ICogZHVyYXRpb25NaW51dGVdLA0KICAgIFttaW51dGUsIDMwLCAzMCAqIGR1cmF0aW9uTWludXRlXSwNCiAgICBbICBob3VyLCAgMSwgICAgICBkdXJhdGlvbkhvdXIgIF0sDQogICAgWyAgaG91ciwgIDMsICAzICogZHVyYXRpb25Ib3VyICBdLA0KICAgIFsgIGhvdXIsICA2LCAgNiAqIGR1cmF0aW9uSG91ciAgXSwNCiAgICBbICBob3VyLCAxMiwgMTIgKiBkdXJhdGlvbkhvdXIgIF0sDQogICAgWyAgIGRheSwgIDEsICAgICAgZHVyYXRpb25EYXkgICBdLA0KICAgIFsgICBkYXksICAyLCAgMiAqIGR1cmF0aW9uRGF5ICAgXSwNCiAgICBbICB3ZWVrLCAgMSwgICAgICBkdXJhdGlvbldlZWsgIF0sDQogICAgWyBtb250aCwgIDEsICAgICAgZHVyYXRpb25Nb250aCBdLA0KICAgIFsgbW9udGgsICAzLCAgMyAqIGR1cmF0aW9uTW9udGggXSwNCiAgICBbICB5ZWFyLCAgMSwgICAgICBkdXJhdGlvblllYXIgIF0NCiAgXTsNCg0KICBmdW5jdGlvbiB0aWNrRm9ybWF0KGRhdGUpIHsNCiAgICByZXR1cm4gKHNlY29uZChkYXRlKSA8IGRhdGUgPyBmb3JtYXRNaWxsaXNlY29uZA0KICAgICAgICA6IG1pbnV0ZShkYXRlKSA8IGRhdGUgPyBmb3JtYXRTZWNvbmQNCiAgICAgICAgOiBob3VyKGRhdGUpIDwgZGF0ZSA/IGZvcm1hdE1pbnV0ZQ0KICAgICAgICA6IGRheShkYXRlKSA8IGRhdGUgPyBmb3JtYXRIb3VyDQogICAgICAgIDogbW9udGgoZGF0ZSkgPCBkYXRlID8gKHdlZWsoZGF0ZSkgPCBkYXRlID8gZm9ybWF0RGF5IDogZm9ybWF0V2VlaykNCiAgICAgICAgOiB5ZWFyKGRhdGUpIDwgZGF0ZSA/IGZvcm1hdE1vbnRoDQogICAgICAgIDogZm9ybWF0WWVhcikoZGF0ZSk7DQogIH0NCg0KICBmdW5jdGlvbiB0aWNrSW50ZXJ2YWwoaW50ZXJ2YWwsIHN0YXJ0LCBzdG9wLCBzdGVwKSB7DQogICAgaWYgKGludGVydmFsID09IG51bGwpIGludGVydmFsID0gMTA7DQoNCiAgICAvLyBJZiBhIGRlc2lyZWQgdGljayBjb3VudCBpcyBzcGVjaWZpZWQsIHBpY2sgYSByZWFzb25hYmxlIHRpY2sgaW50ZXJ2YWwNCiAgICAvLyBiYXNlZCBvbiB0aGUgZXh0ZW50IG9mIHRoZSBkb21haW4gYW5kIGEgcm91Z2ggZXN0aW1hdGUgb2YgdGljayBzaXplLg0KICAgIC8vIE90aGVyd2lzZSwgYXNzdW1lIGludGVydmFsIGlzIGFscmVhZHkgYSB0aW1lIGludGVydmFsIGFuZCB1c2UgaXQuDQogICAgaWYgKHR5cGVvZiBpbnRlcnZhbCA9PT0gIm51bWJlciIpIHsNCiAgICAgIHZhciB0YXJnZXQgPSBNYXRoLmFicyhzdG9wIC0gc3RhcnQpIC8gaW50ZXJ2YWwsDQogICAgICAgICAgaSA9IGQzQXJyYXkuYmlzZWN0b3IoZnVuY3Rpb24oaSkgeyByZXR1cm4gaVsyXTsgfSkucmlnaHQodGlja0ludGVydmFscywgdGFyZ2V0KTsNCiAgICAgIGlmIChpID09PSB0aWNrSW50ZXJ2YWxzLmxlbmd0aCkgew0KICAgICAgICBzdGVwID0gZDNBcnJheS50aWNrU3RlcChzdGFydCAvIGR1cmF0aW9uWWVhciwgc3RvcCAvIGR1cmF0aW9uWWVhciwgaW50ZXJ2YWwpOw0KICAgICAgICBpbnRlcnZhbCA9IHllYXI7DQogICAgICB9IGVsc2UgaWYgKGkpIHsNCiAgICAgICAgaSA9IHRpY2tJbnRlcnZhbHNbdGFyZ2V0IC8gdGlja0ludGVydmFsc1tpIC0gMV1bMl0gPCB0aWNrSW50ZXJ2YWxzW2ldWzJdIC8gdGFyZ2V0ID8gaSAtIDEgOiBpXTsNCiAgICAgICAgc3RlcCA9IGlbMV07DQogICAgICAgIGludGVydmFsID0gaVswXTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHN0ZXAgPSBkM0FycmF5LnRpY2tTdGVwKHN0YXJ0LCBzdG9wLCBpbnRlcnZhbCk7DQogICAgICAgIGludGVydmFsID0gbWlsbGlzZWNvbmQ7DQogICAgICB9DQogICAgfQ0KDQogICAgcmV0dXJuIHN0ZXAgPT0gbnVsbCA/IGludGVydmFsIDogaW50ZXJ2YWwuZXZlcnkoc3RlcCk7DQogIH0NCg0KICBzY2FsZS5pbnZlcnQgPSBmdW5jdGlvbih5KSB7DQogICAgcmV0dXJuIG5ldyBEYXRlKGludmVydCh5KSk7DQogIH07DQoNCiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gZG9tYWluKG1hcCQxLmNhbGwoXywgbnVtYmVyJDEpKSA6IGRvbWFpbigpLm1hcChkYXRlKTsNCiAgfTsNCg0KICBzY2FsZS50aWNrcyA9IGZ1bmN0aW9uKGludGVydmFsLCBzdGVwKSB7DQogICAgdmFyIGQgPSBkb21haW4oKSwNCiAgICAgICAgdDAgPSBkWzBdLA0KICAgICAgICB0MSA9IGRbZC5sZW5ndGggLSAxXSwNCiAgICAgICAgciA9IHQxIDwgdDAsDQogICAgICAgIHQ7DQogICAgaWYgKHIpIHQgPSB0MCwgdDAgPSB0MSwgdDEgPSB0Ow0KICAgIHQgPSB0aWNrSW50ZXJ2YWwoaW50ZXJ2YWwsIHQwLCB0MSwgc3RlcCk7DQogICAgdCA9IHQgPyB0LnJhbmdlKHQwLCB0MSArIDEpIDogW107IC8vIGluY2x1c2l2ZSBzdG9wDQogICAgcmV0dXJuIHIgPyB0LnJldmVyc2UoKSA6IHQ7DQogIH07DQoNCiAgc2NhbGUudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKGNvdW50LCBzcGVjaWZpZXIpIHsNCiAgICByZXR1cm4gc3BlY2lmaWVyID09IG51bGwgPyB0aWNrRm9ybWF0IDogZm9ybWF0JCQxKHNwZWNpZmllcik7DQogIH07DQoNCiAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKGludGVydmFsLCBzdGVwKSB7DQogICAgdmFyIGQgPSBkb21haW4oKTsNCiAgICByZXR1cm4gKGludGVydmFsID0gdGlja0ludGVydmFsKGludGVydmFsLCBkWzBdLCBkW2QubGVuZ3RoIC0gMV0sIHN0ZXApKQ0KICAgICAgICA/IGRvbWFpbihuaWNlKGQsIGludGVydmFsKSkNCiAgICAgICAgOiBzY2FsZTsNCiAgfTsNCg0KICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIGNvcHkoc2NhbGUsIGNhbGVuZGFyKHllYXIsIG1vbnRoLCB3ZWVrLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCwgZm9ybWF0JCQxKSk7DQogIH07DQoNCiAgcmV0dXJuIHNjYWxlOw0KfQ0KDQp2YXIgdGltZSA9IGZ1bmN0aW9uKCkgew0KICByZXR1cm4gY2FsZW5kYXIoZDNUaW1lLnRpbWVZZWFyLCBkM1RpbWUudGltZU1vbnRoLCBkM1RpbWUudGltZVdlZWssIGQzVGltZS50aW1lRGF5LCBkM1RpbWUudGltZUhvdXIsIGQzVGltZS50aW1lTWludXRlLCBkM1RpbWUudGltZVNlY29uZCwgZDNUaW1lLnRpbWVNaWxsaXNlY29uZCwgZDNUaW1lRm9ybWF0LnRpbWVGb3JtYXQpLmRvbWFpbihbbmV3IERhdGUoMjAwMCwgMCwgMSksIG5ldyBEYXRlKDIwMDAsIDAsIDIpXSk7DQp9Ow0KDQp2YXIgdXRjVGltZSA9IGZ1bmN0aW9uKCkgew0KICByZXR1cm4gY2FsZW5kYXIoZDNUaW1lLnV0Y1llYXIsIGQzVGltZS51dGNNb250aCwgZDNUaW1lLnV0Y1dlZWssIGQzVGltZS51dGNEYXksIGQzVGltZS51dGNIb3VyLCBkM1RpbWUudXRjTWludXRlLCBkM1RpbWUudXRjU2Vjb25kLCBkM1RpbWUudXRjTWlsbGlzZWNvbmQsIGQzVGltZUZvcm1hdC51dGNGb3JtYXQpLmRvbWFpbihbRGF0ZS5VVEMoMjAwMCwgMCwgMSksIERhdGUuVVRDKDIwMDAsIDAsIDIpXSk7DQp9Ow0KDQp2YXIgY29sb3JzID0gZnVuY3Rpb24ocykgew0KICByZXR1cm4gcy5tYXRjaCgvLns2fS9nKS5tYXAoZnVuY3Rpb24oeCkgew0KICAgIHJldHVybiAiIyIgKyB4Ow0KICB9KTsNCn07DQoNCnZhciBjYXRlZ29yeTEwID0gY29sb3JzKCIxZjc3YjRmZjdmMGUyY2EwMmNkNjI3Mjg5NDY3YmQ4YzU2NGJlMzc3YzI3ZjdmN2ZiY2JkMjIxN2JlY2YiKTsNCg0KdmFyIGNhdGVnb3J5MjBiID0gY29sb3JzKCIzOTNiNzk1MjU0YTM2YjZlY2Y5YzllZGU2Mzc5Mzk4Y2EyNTJiNWNmNmJjZWRiOWM4YzZkMzFiZDllMzllN2JhNTJlN2NiOTQ4NDNjMzlhZDQ5NGFkNjYxNmJlNzk2OWM3YjQxNzNhNTUxOTRjZTZkYmRkZTllZDYiKTsNCg0KdmFyIGNhdGVnb3J5MjBjID0gY29sb3JzKCIzMTgyYmQ2YmFlZDY5ZWNhZTFjNmRiZWZlNjU1MGRmZDhkM2NmZGFlNmJmZGQwYTIzMWEzNTQ3NGM0NzZhMWQ5OWJjN2U5YzA3NTZiYjE5ZTlhYzhiY2JkZGNkYWRhZWI2MzYzNjM5Njk2OTZiZGJkYmRkOWQ5ZDkiKTsNCg0KdmFyIGNhdGVnb3J5MjAgPSBjb2xvcnMoIjFmNzdiNGFlYzdlOGZmN2YwZWZmYmI3ODJjYTAyYzk4ZGY4YWQ2MjcyOGZmOTg5Njk0NjdiZGM1YjBkNThjNTY0YmM0OWM5NGUzNzdjMmY3YjZkMjdmN2Y3ZmM3YzdjN2JjYmQyMmRiZGI4ZDE3YmVjZjllZGFlNSIpOw0KDQp2YXIgY3ViZWhlbGl4JDEgPSBkM0ludGVycG9sYXRlLmludGVycG9sYXRlQ3ViZWhlbGl4TG9uZyhkM0NvbG9yLmN1YmVoZWxpeCgzMDAsIDAuNSwgMC4wKSwgZDNDb2xvci5jdWJlaGVsaXgoLTI0MCwgMC41LCAxLjApKTsNCg0KdmFyIHdhcm0gPSBkM0ludGVycG9sYXRlLmludGVycG9sYXRlQ3ViZWhlbGl4TG9uZyhkM0NvbG9yLmN1YmVoZWxpeCgtMTAwLCAwLjc1LCAwLjM1KSwgZDNDb2xvci5jdWJlaGVsaXgoODAsIDEuNTAsIDAuOCkpOw0KDQp2YXIgY29vbCA9IGQzSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGVDdWJlaGVsaXhMb25nKGQzQ29sb3IuY3ViZWhlbGl4KDI2MCwgMC43NSwgMC4zNSksIGQzQ29sb3IuY3ViZWhlbGl4KDgwLCAxLjUwLCAwLjgpKTsNCg0KdmFyIHJhaW5ib3cgPSBkM0NvbG9yLmN1YmVoZWxpeCgpOw0KDQp2YXIgcmFpbmJvdyQxID0gZnVuY3Rpb24odCkgew0KICBpZiAodCA8IDAgfHwgdCA+IDEpIHQgLT0gTWF0aC5mbG9vcih0KTsNCiAgdmFyIHRzID0gTWF0aC5hYnModCAtIDAuNSk7DQogIHJhaW5ib3cuaCA9IDM2MCAqIHQgLSAxMDA7DQogIHJhaW5ib3cucyA9IDEuNSAtIDEuNSAqIHRzOw0KICByYWluYm93LmwgPSAwLjggLSAwLjkgKiB0czsNCiAgcmV0dXJuIHJhaW5ib3cgKyAiIjsNCn07DQoNCmZ1bmN0aW9uIHJhbXAocmFuZ2UkJDEpIHsNCiAgdmFyIG4gPSByYW5nZSQkMS5sZW5ndGg7DQogIHJldHVybiBmdW5jdGlvbih0KSB7DQogICAgcmV0dXJuIHJhbmdlJCQxW01hdGgubWF4KDAsIE1hdGgubWluKG4gLSAxLCBNYXRoLmZsb29yKHQgKiBuKSkpXTsNCiAgfTsNCn0NCg0KdmFyIHZpcmlkaXMgPSByYW1wKGNvbG9ycygiNDQwMTU0NDQwMjU2NDUwNDU3NDUwNTU5NDYwNzVhNDYwODVjNDYwYTVkNDYwYjVlNDcwZDYwNDcwZTYxNDcxMDYzNDcxMTY0NDcxMzY1NDgxNDY3NDgxNjY4NDgxNzY5NDgxODZhNDgxYTZjNDgxYjZkNDgxYzZlNDgxZDZmNDgxZjcwNDgyMDcxNDgyMTczNDgyMzc0NDgyNDc1NDgyNTc2NDgyNjc3NDgyODc4NDgyOTc5NDcyYTdhNDcyYzdhNDcyZDdiNDcyZTdjNDcyZjdkNDYzMDdlNDYzMjdlNDYzMzdmNDYzNDgwNDUzNTgxNDUzNzgxNDUzODgyNDQzOTgzNDQzYTgzNDQzYjg0NDMzZDg0NDMzZTg1NDIzZjg1NDI0MDg2NDI0MTg2NDE0Mjg3NDE0NDg3NDA0NTg4NDA0Njg4M2Y0Nzg4M2Y0ODg5M2U0OTg5M2U0YTg5M2U0YzhhM2Q0ZDhhM2Q0ZThhM2M0ZjhhM2M1MDhiM2I1MThiM2I1MjhiM2E1MzhiM2E1NDhjMzk1NThjMzk1NjhjMzg1ODhjMzg1OThjMzc1YThjMzc1YjhkMzY1YzhkMzY1ZDhkMzU1ZThkMzU1ZjhkMzQ2MDhkMzQ2MThkMzM2MjhkMzM2MzhkMzI2NDhlMzI2NThlMzE2NjhlMzE2NzhlMzE2ODhlMzA2OThlMzA2YThlMmY2YjhlMmY2YzhlMmU2ZDhlMmU2ZThlMmU2ZjhlMmQ3MDhlMmQ3MThlMmM3MThlMmM3MjhlMmM3MzhlMmI3NDhlMmI3NThlMmE3NjhlMmE3NzhlMmE3ODhlMjk3OThlMjk3YThlMjk3YjhlMjg3YzhlMjg3ZDhlMjc3ZThlMjc3ZjhlMjc4MDhlMjY4MThlMjY4MjhlMjY4MjhlMjU4MzhlMjU4NDhlMjU4NThlMjQ4NjhlMjQ4NzhlMjM4ODhlMjM4OThlMjM4YThkMjI4YjhkMjI4YzhkMjI4ZDhkMjE4ZThkMjE4ZjhkMjE5MDhkMjE5MThjMjA5MjhjMjA5MjhjMjA5MzhjMWY5NDhjMWY5NThiMWY5NjhiMWY5NzhiMWY5ODhiMWY5OThhMWY5YThhMWU5YjhhMWU5Yzg5MWU5ZDg5MWY5ZTg5MWY5Zjg4MWZhMDg4MWZhMTg4MWZhMTg3MWZhMjg3MjBhMzg2MjBhNDg2MjFhNTg1MjFhNjg1MjJhNzg1MjJhODg0MjNhOTgzMjRhYTgzMjVhYjgyMjVhYzgyMjZhZDgxMjdhZDgxMjhhZTgwMjlhZjdmMmFiMDdmMmNiMTdlMmRiMjdkMmViMzdjMmZiNDdjMzFiNTdiMzJiNjdhMzRiNjc5MzViNzc5MzdiODc4MzhiOTc3M2FiYTc2M2JiYjc1M2RiYzc0M2ZiYzczNDBiZDcyNDJiZTcxNDRiZjcwNDZjMDZmNDhjMTZlNGFjMTZkNGNjMjZjNGVjMzZiNTBjNDZhNTJjNTY5NTRjNTY4NTZjNjY3NThjNzY1NWFjODY0NWNjODYzNWVjOTYyNjBjYTYwNjNjYjVmNjVjYjVlNjdjYzVjNjljZDViNmNjZDVhNmVjZTU4NzBjZjU3NzNkMDU2NzVkMDU0NzdkMTUzN2FkMTUxN2NkMjUwN2ZkMzRlODFkMzRkODRkNDRiODZkNTQ5ODlkNTQ4OGJkNjQ2OGVkNjQ1OTBkNzQzOTNkNzQxOTVkODQwOThkODNlOWJkOTNjOWRkOTNiYTBkYTM5YTJkYTM3YTVkYjM2YThkYjM0YWFkYzMyYWRkYzMwYjBkZDJmYjJkZDJkYjVkZTJiYjhkZTI5YmFkZTI4YmRkZjI2YzBkZjI1YzJkZjIzYzVlMDIxYzhlMDIwY2FlMTFmY2RlMTFkZDBlMTFjZDJlMjFiZDVlMjFhZDhlMjE5ZGFlMzE5ZGRlMzE4ZGZlMzE4ZTJlNDE4ZTVlNDE5ZTdlNDE5ZWFlNTFhZWNlNTFiZWZlNTFjZjFlNTFkZjRlNjFlZjZlNjIwZjhlNjIxZmJlNzIzZmRlNzI1IikpOw0KDQp2YXIgbWFnbWEgPSByYW1wKGNvbG9ycygiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTA5MDIwMjBiMDIwMjBkMDMwMzBmMDMwMzEyMDQwNDE0MDUwNDE2MDYwNTE4MDYwNTFhMDcwNjFjMDgwNzFlMDkwNzIwMGEwODIyMGIwOTI0MGMwOTI2MGQwYTI5MGUwYjJiMTAwYjJkMTEwYzJmMTIwZDMxMTMwZDM0MTQwZTM2MTUwZTM4MTYwZjNiMTgwZjNkMTkxMDNmMWExMDQyMWMxMDQ0MWQxMTQ3MWUxMTQ5MjAxMTRiMjExMTRlMjIxMTUwMjQxMjUzMjUxMjU1MjcxMjU4MjkxMTVhMmExMTVjMmMxMTVmMmQxMTYxMmYxMTYzMzExMTY1MzMxMDY3MzQxMDY5MzYxMDZiMzgxMDZjMzkwZjZlM2IwZjcwM2QwZjcxM2YwZjcyNDAwZjc0NDIwZjc1NDQwZjc2NDUxMDc3NDcxMDc4NDkxMDc4NGExMDc5NGMxMTdhNGUxMTdiNGYxMjdiNTExMjdjNTIxMzdjNTQxMzdkNTYxNDdkNTcxNTdlNTkxNTdlNWExNjdlNWMxNjdmNWQxNzdmNWYxODdmNjAxODgwNjIxOTgwNjQxYTgwNjUxYTgwNjcxYjgwNjgxYzgxNmExYzgxNmIxZDgxNmQxZDgxNmUxZTgxNzAxZjgxNzIxZjgxNzMyMDgxNzUyMTgxNzYyMTgxNzgyMjgxNzkyMjgyN2IyMzgyN2MyMzgyN2UyNDgyODAyNTgyODEyNTgxODMyNjgxODQyNjgxODYyNzgxODgyNzgxODkyODgxOGIyOTgxOGMyOTgxOGUyYTgxOTAyYTgxOTEyYjgxOTMyYjgwOTQyYzgwOTYyYzgwOTgyZDgwOTkyZDgwOWIyZTdmOWMyZTdmOWUyZjdmYTAyZjdmYTEzMDdlYTMzMDdlYTUzMTdlYTYzMTdkYTgzMjdkYWEzMzdkYWIzMzdjYWQzNDdjYWUzNDdiYjAzNTdiYjIzNTdiYjMzNjdhYjUzNjdhYjczNzc5YjgzNzc5YmEzODc4YmMzOTc4YmQzOTc3YmYzYTc3YzAzYTc2YzIzYjc1YzQzYzc1YzUzYzc0YzczZDczYzgzZTczY2EzZTcyY2MzZjcxY2Q0MDcxY2Y0MDcwZDA0MTZmZDI0MjZmZDM0MzZlZDU0NDZkZDY0NTZjZDg0NTZjZDk0NjZiZGI0NzZhZGM0ODY5ZGU0OTY4ZGY0YTY4ZTA0YzY3ZTI0ZDY2ZTM0ZTY1ZTQ0ZjY0ZTU1MDY0ZTc1MjYzZTg1MzYyZTk1NDYyZWE1NjYxZWI1NzYwZWM1ODYwZWQ1YTVmZWU1YjVlZWY1ZDVlZjA1ZjVlZjE2MDVkZjI2MjVkZjI2NDVjZjM2NTVjZjQ2NzVjZjQ2OTVjZjU2YjVjZjY2YzVjZjY2ZTVjZjc3MDVjZjc3MjVjZjg3NDVjZjg3NjVjZjk3ODVkZjk3OTVkZjk3YjVkZmE3ZDVlZmE3ZjVlZmE4MTVmZmI4MzVmZmI4NTYwZmI4NzYxZmM4OTYxZmM4YTYyZmM4YzYzZmM4ZTY0ZmM5MDY1ZmQ5MjY2ZmQ5NDY3ZmQ5NjY4ZmQ5ODY5ZmQ5YTZhZmQ5YjZiZmU5ZDZjZmU5ZjZkZmVhMTZlZmVhMzZmZmVhNTcxZmVhNzcyZmVhOTczZmVhYTc0ZmVhYzc2ZmVhZTc3ZmViMDc4ZmViMjdhZmViNDdiZmViNjdjZmViNzdlZmViOTdmZmViYjgxZmViZDgyZmViZjg0ZmVjMTg1ZmVjMjg3ZmVjNDg4ZmVjNjhhZmVjODhjZmVjYThkZmVjYzhmZmVjZDkwZmVjZjkyZmVkMTk0ZmVkMzk1ZmVkNTk3ZmVkNzk5ZmVkODlhZmRkYTljZmRkYzllZmRkZWEwZmRlMGExZmRlMmEzZmRlM2E1ZmRlNWE3ZmRlN2E5ZmRlOWFhZmRlYmFjZmNlY2FlZmNlZWIwZmNmMGIyZmNmMmI0ZmNmNGI2ZmNmNmI4ZmNmN2I5ZmNmOWJiZmNmYmJkZmNmZGJmIikpOw0KDQp2YXIgaW5mZXJubyA9IHJhbXAoY29sb3JzKCIwMDAwMDQwMTAwMDUwMTAxMDYwMTAxMDgwMjAxMGEwMjAyMGMwMjAyMGUwMzAyMTAwNDAzMTIwNDAzMTQwNTA0MTcwNjA0MTkwNzA1MWIwODA1MWQwOTA2MWYwYTA3MjIwYjA3MjQwYzA4MjYwZDA4MjkwZTA5MmIxMDA5MmQxMTBhMzAxMjBhMzIxNDBiMzQxNTBiMzcxNjBiMzkxODBjM2MxOTBjM2UxYjBjNDExYzBjNDMxZTBjNDUxZjBjNDgyMTBjNGEyMzBjNGMyNDBjNGYyNjBjNTEyODBiNTMyOTBiNTUyYjBiNTcyZDBiNTkyZjBhNWIzMTBhNWMzMjBhNWUzNDBhNWYzNjA5NjEzODA5NjIzOTA5NjMzYjA5NjQzZDA5NjUzZTA5NjY0MDBhNjc0MjBhNjg0NDBhNjg0NTBhNjk0NzBiNmE0OTBiNmE0YTBjNmI0YzBjNmI0ZDBkNmM0ZjBkNmM1MTBlNmM1MjBlNmQ1NDBmNmQ1NTBmNmQ1NzEwNmU1OTEwNmU1YTExNmU1YzEyNmU1ZDEyNmU1ZjEzNmU2MTEzNmU2MjE0NmU2NDE1NmU2NTE1NmU2NzE2NmU2OTE2NmU2YTE3NmU2YzE4NmU2ZDE4NmU2ZjE5NmU3MTE5NmU3MjFhNmU3NDFhNmU3NTFiNmU3NzFjNmQ3ODFjNmQ3YTFkNmQ3YzFkNmQ3ZDFlNmQ3ZjFlNmM4MDFmNmM4MjIwNmM4NDIwNmI4NTIxNmI4NzIxNmI4ODIyNmE4YTIyNmE4YzIzNjk4ZDIzNjk4ZjI0Njk5MDI1Njg5MjI1Njg5MzI2Njc5NTI2Njc5NzI3NjY5ODI3NjY5YTI4NjU5YjI5NjQ5ZDI5NjQ5ZjJhNjNhMDJhNjNhMjJiNjJhMzJjNjFhNTJjNjBhNjJkNjBhODJlNWZhOTJlNWVhYjJmNWVhZDMwNWRhZTMwNWNiMDMxNWJiMTMyNWFiMzMyNWFiNDMzNTliNjM0NThiNzM1NTdiOTM1NTZiYTM2NTViYzM3NTRiZDM4NTNiZjM5NTJjMDNhNTFjMTNhNTBjMzNiNGZjNDNjNGVjNjNkNGRjNzNlNGNjODNmNGJjYTQwNGFjYjQxNDljYzQyNDhjZTQzNDdjZjQ0NDZkMDQ1NDVkMjQ2NDRkMzQ3NDNkNDQ4NDJkNTRhNDFkNzRiM2ZkODRjM2VkOTRkM2RkYTRlM2NkYjUwM2JkZDUxM2FkZTUyMzhkZjUzMzdlMDU1MzZlMTU2MzVlMjU3MzRlMzU5MzNlNDVhMzFlNTVjMzBlNjVkMmZlNzVlMmVlODYwMmRlOTYxMmJlYTYzMmFlYjY0MjllYjY2MjhlYzY3MjZlZDY5MjVlZTZhMjRlZjZjMjNlZjZlMjFmMDZmMjBmMTcxMWZmMTczMWRmMjc0MWNmMzc2MWJmMzc4MTlmNDc5MThmNTdiMTdmNTdkMTVmNjdlMTRmNjgwMTNmNzgyMTJmNzg0MTBmODg1MGZmODg3MGVmODg5MGNmOThiMGJmOThjMGFmOThlMDlmYTkwMDhmYTkyMDdmYTk0MDdmYjk2MDZmYjk3MDZmYjk5MDZmYjliMDZmYjlkMDdmYzlmMDdmY2ExMDhmY2EzMDlmY2E1MGFmY2E2MGNmY2E4MGRmY2FhMGZmY2FjMTFmY2FlMTJmY2IwMTRmY2IyMTZmY2I0MThmYmI2MWFmYmI4MWRmYmJhMWZmYmJjMjFmYmJlMjNmYWMwMjZmYWMyMjhmYWM0MmFmYWM2MmRmOWM3MmZmOWM5MzJmOWNiMzVmOGNkMzdmOGNmM2FmN2QxM2RmN2QzNDBmNmQ1NDNmNmQ3NDZmNWQ5NDlmNWRiNGNmNGRkNGZmNGRmNTNmNGUxNTZmM2UzNWFmM2U1NWRmMmU2NjFmMmU4NjVmMmVhNjlmMWVjNmRmMWVkNzFmMWVmNzVmMWYxNzlmMmYyN2RmMmY0ODJmM2Y1ODZmM2Y2OGFmNGY4OGVmNWY5OTJmNmZhOTZmOGZiOWFmOWZjOWRmYWZkYTFmY2ZmYTQiKSk7DQoNCnZhciBwbGFzbWEgPSByYW1wKGNvbG9ycygiMGQwODg3MTAwNzg4MTMwNzg5MTYwNzhhMTkwNjhjMWIwNjhkMWQwNjhlMjAwNjhmMjIwNjkwMjQwNjkxMjYwNTkxMjgwNTkyMmEwNTkzMmMwNTk0MmUwNTk1MmYwNTk2MzEwNTk3MzMwNTk3MzUwNDk4MzcwNDk5MzgwNDlhM2EwNDlhM2MwNDliM2UwNDljM2YwNDljNDEwNDlkNDMwMzllNDQwMzllNDYwMzlmNDgwMzlmNDkwM2EwNGIwM2ExNGMwMmExNGUwMmEyNTAwMmEyNTEwMmEzNTMwMmEzNTUwMmE0NTYwMWE0NTgwMWE0NTkwMWE1NWIwMWE1NWMwMWE2NWUwMWE2NjAwMWE2NjEwMGE3NjMwMGE3NjQwMGE3NjYwMGE3NjcwMGE4NjkwMGE4NmEwMGE4NmMwMGE4NmUwMGE4NmYwMGE4NzEwMGE4NzIwMWE4NzQwMWE4NzUwMWE4NzcwMWE4NzgwMWE4N2EwMmE4N2IwMmE4N2QwM2E4N2UwM2E4ODAwNGE4ODEwNGE3ODMwNWE3ODQwNWE3ODYwNmE2ODcwN2E2ODgwOGE2OGEwOWE1OGIwYWE1OGQwYmE1OGUwY2E0OGYwZGE0OTEwZWEzOTIwZmEzOTQxMGEyOTUxMWExOTYxM2ExOTgxNGEwOTkxNTlmOWExNjlmOWMxNzllOWQxODlkOWUxOTlkYTAxYTljYTExYjliYTIxZDlhYTMxZTlhYTUxZjk5YTYyMDk4YTcyMTk3YTgyMjk2YWEyMzk1YWIyNDk0YWMyNjk0YWQyNzkzYWUyODkyYjAyOTkxYjEyYTkwYjIyYjhmYjMyYzhlYjQyZThkYjUyZjhjYjYzMDhiYjczMThhYjgzMjg5YmEzMzg4YmIzNDg4YmMzNTg3YmQzNzg2YmUzODg1YmYzOTg0YzAzYTgzYzEzYjgyYzIzYzgxYzMzZDgwYzQzZTdmYzU0MDdlYzY0MTdkYzc0MjdjYzg0MzdiYzk0NDdhY2E0NTdhY2I0Njc5Y2M0Nzc4Y2M0OTc3Y2Q0YTc2Y2U0Yjc1Y2Y0Yzc0ZDA0ZDczZDE0ZTcyZDI0ZjcxZDM1MTcxZDQ1MjcwZDU1MzZmZDU1NDZlZDY1NTZkZDc1NjZjZDg1NzZiZDk1ODZhZGE1YTZhZGE1YjY5ZGI1YzY4ZGM1ZDY3ZGQ1ZTY2ZGU1ZjY1ZGU2MTY0ZGY2MjYzZTA2MzYzZTE2NDYyZTI2NTYxZTI2NjYwZTM2ODVmZTQ2OTVlZTU2YTVkZTU2YjVkZTY2YzVjZTc2ZTViZTc2ZjVhZTg3MDU5ZTk3MTU4ZTk3MjU3ZWE3NDU3ZWI3NTU2ZWI3NjU1ZWM3NzU0ZWQ3OTUzZWQ3YTUyZWU3YjUxZWY3YzUxZWY3ZTUwZjA3ZjRmZjA4MDRlZjE4MTRkZjE4MzRjZjI4NDRiZjM4NTRiZjM4NzRhZjQ4ODQ5ZjQ4OTQ4ZjU4YjQ3ZjU4YzQ2ZjY4ZDQ1ZjY4ZjQ0Zjc5MDQ0Zjc5MTQzZjc5MzQyZjg5NDQxZjg5NTQwZjk5NzNmZjk5ODNlZjk5YTNlZmE5YjNkZmE5YzNjZmE5ZTNiZmI5ZjNhZmJhMTM5ZmJhMjM4ZmNhMzM4ZmNhNTM3ZmNhNjM2ZmNhODM1ZmNhOTM0ZmRhYjMzZmRhYzMzZmRhZTMyZmRhZjMxZmRiMTMwZmRiMjJmZmRiNDJmZmRiNTJlZmViNzJkZmViODJjZmViYTJjZmViYjJiZmViZDJhZmViZTJhZmVjMDI5ZmRjMjI5ZmRjMzI4ZmRjNTI3ZmRjNjI3ZmRjODI3ZmRjYTI2ZmRjYjI2ZmNjZDI1ZmNjZTI1ZmNkMDI1ZmNkMjI1ZmJkMzI0ZmJkNTI0ZmJkNzI0ZmFkODI0ZmFkYTI0ZjlkYzI0ZjlkZDI1ZjhkZjI1ZjhlMTI1ZjdlMjI1ZjdlNDI1ZjZlNjI2ZjZlODI2ZjVlOTI2ZjVlYjI3ZjRlZDI3ZjNlZTI3ZjNmMDI3ZjJmMjI3ZjFmNDI2ZjFmNTI1ZjBmNzI0ZjBmOTIxIikpOw0KDQpmdW5jdGlvbiBzZXF1ZW50aWFsKGludGVycG9sYXRvcikgew0KICB2YXIgeDAgPSAwLA0KICAgICAgeDEgPSAxLA0KICAgICAgY2xhbXAgPSBmYWxzZTsNCg0KICBmdW5jdGlvbiBzY2FsZSh4KSB7DQogICAgdmFyIHQgPSAoeCAtIHgwKSAvICh4MSAtIHgwKTsNCiAgICByZXR1cm4gaW50ZXJwb2xhdG9yKGNsYW1wID8gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdCkpIDogdCk7DQogIH0NCg0KICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeDAgPSArX1swXSwgeDEgPSArX1sxXSwgc2NhbGUpIDogW3gwLCB4MV07DQogIH07DQoNCiAgc2NhbGUuY2xhbXAgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2xhbXAgPSAhIV8sIHNjYWxlKSA6IGNsYW1wOw0KICB9Ow0KDQogIHNjYWxlLmludGVycG9sYXRvciA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpbnRlcnBvbGF0b3IgPSBfLCBzY2FsZSkgOiBpbnRlcnBvbGF0b3I7DQogIH07DQoNCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBzZXF1ZW50aWFsKGludGVycG9sYXRvcikuZG9tYWluKFt4MCwgeDFdKS5jbGFtcChjbGFtcCk7DQogIH07DQoNCiAgcmV0dXJuIGxpbmVhcmlzaChzY2FsZSk7DQp9DQoNCmV4cG9ydHMuc2NhbGVCYW5kID0gYmFuZDsNCmV4cG9ydHMuc2NhbGVQb2ludCA9IHBvaW50Ow0KZXhwb3J0cy5zY2FsZUlkZW50aXR5ID0gaWRlbnRpdHk7DQpleHBvcnRzLnNjYWxlTGluZWFyID0gbGluZWFyOw0KZXhwb3J0cy5zY2FsZUxvZyA9IGxvZzsNCmV4cG9ydHMuc2NhbGVPcmRpbmFsID0gb3JkaW5hbDsNCmV4cG9ydHMuc2NhbGVJbXBsaWNpdCA9IGltcGxpY2l0Ow0KZXhwb3J0cy5zY2FsZVBvdyA9IHBvdzsNCmV4cG9ydHMuc2NhbGVTcXJ0ID0gc3FydDsNCmV4cG9ydHMuc2NhbGVRdWFudGlsZSA9IHF1YW50aWxlJDE7DQpleHBvcnRzLnNjYWxlUXVhbnRpemUgPSBxdWFudGl6ZTsNCmV4cG9ydHMuc2NhbGVUaHJlc2hvbGQgPSB0aHJlc2hvbGQ7DQpleHBvcnRzLnNjYWxlVGltZSA9IHRpbWU7DQpleHBvcnRzLnNjYWxlVXRjID0gdXRjVGltZTsNCmV4cG9ydHMuc2NoZW1lQ2F0ZWdvcnkxMCA9IGNhdGVnb3J5MTA7DQpleHBvcnRzLnNjaGVtZUNhdGVnb3J5MjBiID0gY2F0ZWdvcnkyMGI7DQpleHBvcnRzLnNjaGVtZUNhdGVnb3J5MjBjID0gY2F0ZWdvcnkyMGM7DQpleHBvcnRzLnNjaGVtZUNhdGVnb3J5MjAgPSBjYXRlZ29yeTIwOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZUN1YmVoZWxpeERlZmF1bHQgPSBjdWJlaGVsaXgkMTsNCmV4cG9ydHMuaW50ZXJwb2xhdGVSYWluYm93ID0gcmFpbmJvdyQxOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZVdhcm0gPSB3YXJtOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZUNvb2wgPSBjb29sOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZVZpcmlkaXMgPSB2aXJpZGlzOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZU1hZ21hID0gbWFnbWE7DQpleHBvcnRzLmludGVycG9sYXRlSW5mZXJubyA9IGluZmVybm87DQpleHBvcnRzLmludGVycG9sYXRlUGxhc21hID0gcGxhc21hOw0KZXhwb3J0cy5zY2FsZVNlcXVlbnRpYWwgPSBzZXF1ZW50aWFsOw0KDQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOw0KDQp9KSkpOw0KDQp9LHsiZDMtYXJyYXkiOjIsImQzLWNvbGxlY3Rpb24iOjMsImQzLWNvbG9yIjo0LCJkMy1mb3JtYXQiOjcsImQzLWludGVycG9sYXRlIjo5LCJkMy10aW1lIjoxNSwiZDMtdGltZS1mb3JtYXQiOjE0fV0sMTI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpew0KLy8gaHR0cHM6Ly9kM2pzLm9yZy9kMy1zZWxlY3Rpb24vIFZlcnNpb24gMS4xLjAuIENvcHlyaWdodCAyMDE3IE1pa2UgQm9zdG9jay4NCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7DQoJdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6DQoJdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6DQoJKGZhY3RvcnkoKGdsb2JhbC5kMyA9IGdsb2JhbC5kMyB8fCB7fSkpKTsNCn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JzsNCg0KdmFyIHhodG1sID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOw0KDQp2YXIgbmFtZXNwYWNlcyA9IHsNCiAgc3ZnOiAiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLA0KICB4aHRtbDogeGh0bWwsDQogIHhsaW5rOiAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsDQogIHhtbDogImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsDQogIHhtbG5zOiAiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iDQp9Ow0KDQp2YXIgbmFtZXNwYWNlID0gZnVuY3Rpb24obmFtZSkgew0KICB2YXIgcHJlZml4ID0gbmFtZSArPSAiIiwgaSA9IHByZWZpeC5pbmRleE9mKCI6Iik7DQogIGlmIChpID49IDAgJiYgKHByZWZpeCA9IG5hbWUuc2xpY2UoMCwgaSkpICE9PSAieG1sbnMiKSBuYW1lID0gbmFtZS5zbGljZShpICsgMSk7DQogIHJldHVybiBuYW1lc3BhY2VzLmhhc093blByb3BlcnR5KHByZWZpeCkgPyB7c3BhY2U6IG5hbWVzcGFjZXNbcHJlZml4XSwgbG9jYWw6IG5hbWV9IDogbmFtZTsNCn07DQoNCmZ1bmN0aW9uIGNyZWF0b3JJbmhlcml0KG5hbWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHZhciBkb2N1bWVudCA9IHRoaXMub3duZXJEb2N1bWVudCwNCiAgICAgICAgdXJpID0gdGhpcy5uYW1lc3BhY2VVUkk7DQogICAgcmV0dXJuIHVyaSA9PT0geGh0bWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0geGh0bWwNCiAgICAgICAgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpDQogICAgICAgIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHVyaSwgbmFtZSk7DQogIH07DQp9DQoNCmZ1bmN0aW9uIGNyZWF0b3JGaXhlZChmdWxsbmFtZSkgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsNCiAgfTsNCn0NCg0KdmFyIGNyZWF0b3IgPSBmdW5jdGlvbihuYW1lKSB7DQogIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTsNCiAgcmV0dXJuIChmdWxsbmFtZS5sb2NhbA0KICAgICAgPyBjcmVhdG9yRml4ZWQNCiAgICAgIDogY3JlYXRvckluaGVyaXQpKGZ1bGxuYW1lKTsNCn07DQoNCnZhciBuZXh0SWQgPSAwOw0KDQpmdW5jdGlvbiBsb2NhbCgpIHsNCiAgcmV0dXJuIG5ldyBMb2NhbDsNCn0NCg0KZnVuY3Rpb24gTG9jYWwoKSB7DQogIHRoaXMuXyA9ICJAIiArICgrK25leHRJZCkudG9TdHJpbmcoMzYpOw0KfQ0KDQpMb2NhbC5wcm90b3R5cGUgPSBsb2NhbC5wcm90b3R5cGUgPSB7DQogIGNvbnN0cnVjdG9yOiBMb2NhbCwNCiAgZ2V0OiBmdW5jdGlvbihub2RlKSB7DQogICAgdmFyIGlkID0gdGhpcy5fOw0KICAgIHdoaWxlICghKGlkIGluIG5vZGUpKSBpZiAoIShub2RlID0gbm9kZS5wYXJlbnROb2RlKSkgcmV0dXJuOw0KICAgIHJldHVybiBub2RlW2lkXTsNCiAgfSwNCiAgc2V0OiBmdW5jdGlvbihub2RlLCB2YWx1ZSkgew0KICAgIHJldHVybiBub2RlW3RoaXMuX10gPSB2YWx1ZTsNCiAgfSwNCiAgcmVtb3ZlOiBmdW5jdGlvbihub2RlKSB7DQogICAgcmV0dXJuIHRoaXMuXyBpbiBub2RlICYmIGRlbGV0ZSBub2RlW3RoaXMuX107DQogIH0sDQogIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcy5fOw0KICB9DQp9Ow0KDQp2YXIgbWF0Y2hlciA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcy5tYXRjaGVzKHNlbGVjdG9yKTsNCiAgfTsNCn07DQoNCmlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICJ1bmRlZmluZWQiKSB7DQogIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Ow0KICBpZiAoIWVsZW1lbnQubWF0Y2hlcykgew0KICAgIHZhciB2ZW5kb3JNYXRjaGVzID0gZWxlbWVudC53ZWJraXRNYXRjaGVzU2VsZWN0b3INCiAgICAgICAgfHwgZWxlbWVudC5tc01hdGNoZXNTZWxlY3Rvcg0KICAgICAgICB8fCBlbGVtZW50Lm1vek1hdGNoZXNTZWxlY3Rvcg0KICAgICAgICB8fCBlbGVtZW50Lm9NYXRjaGVzU2VsZWN0b3I7DQogICAgbWF0Y2hlciA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7DQogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB2ZW5kb3JNYXRjaGVzLmNhbGwodGhpcywgc2VsZWN0b3IpOw0KICAgICAgfTsNCiAgICB9Ow0KICB9DQp9DQoNCnZhciBtYXRjaGVyJDEgPSBtYXRjaGVyOw0KDQp2YXIgZmlsdGVyRXZlbnRzID0ge307DQoNCmV4cG9ydHMuZXZlbnQgPSBudWxsOw0KDQppZiAodHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIikgew0KICB2YXIgZWxlbWVudCQxID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Ow0KICBpZiAoISgib25tb3VzZWVudGVyIiBpbiBlbGVtZW50JDEpKSB7DQogICAgZmlsdGVyRXZlbnRzID0ge21vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLCBtb3VzZWxlYXZlOiAibW91c2VvdXQifTsNCiAgfQ0KfQ0KDQpmdW5jdGlvbiBmaWx0ZXJDb250ZXh0TGlzdGVuZXIobGlzdGVuZXIsIGluZGV4LCBncm91cCkgew0KICBsaXN0ZW5lciA9IGNvbnRleHRMaXN0ZW5lcihsaXN0ZW5lciwgaW5kZXgsIGdyb3VwKTsNCiAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7DQogICAgdmFyIHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0Ow0KICAgIGlmICghcmVsYXRlZCB8fCAocmVsYXRlZCAhPT0gdGhpcyAmJiAhKHJlbGF0ZWQuY29tcGFyZURvY3VtZW50UG9zaXRpb24odGhpcykgJiA4KSkpIHsNCiAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZXZlbnQpOw0KICAgIH0NCiAgfTsNCn0NCg0KZnVuY3Rpb24gY29udGV4dExpc3RlbmVyKGxpc3RlbmVyLCBpbmRleCwgZ3JvdXApIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50MSkgew0KICAgIHZhciBldmVudDAgPSBleHBvcnRzLmV2ZW50OyAvLyBFdmVudHMgY2FuIGJlIHJlZW50cmFudCAoZS5nLiwgZm9jdXMpLg0KICAgIGV4cG9ydHMuZXZlbnQgPSBldmVudDE7DQogICAgdHJ5IHsNCiAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgdGhpcy5fX2RhdGFfXywgaW5kZXgsIGdyb3VwKTsNCiAgICB9IGZpbmFsbHkgew0KICAgICAgZXhwb3J0cy5ldmVudCA9IGV2ZW50MDsNCiAgICB9DQogIH07DQp9DQoNCmZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lcykgew0KICByZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCkgew0KICAgIHZhciBuYW1lID0gIiIsIGkgPSB0LmluZGV4T2YoIi4iKTsNCiAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpOw0KICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07DQogIH0pOw0KfQ0KDQpmdW5jdGlvbiBvblJlbW92ZSh0eXBlbmFtZSkgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdmFyIG9uID0gdGhpcy5fX29uOw0KICAgIGlmICghb24pIHJldHVybjsNCiAgICBmb3IgKHZhciBqID0gMCwgaSA9IC0xLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7DQogICAgICBpZiAobyA9IG9uW2pdLCAoIXR5cGVuYW1lLnR5cGUgfHwgby50eXBlID09PSB0eXBlbmFtZS50eXBlKSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHsNCiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5jYXB0dXJlKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIG9uWysraV0gPSBvOw0KICAgICAgfQ0KICAgIH0NCiAgICBpZiAoKytpKSBvbi5sZW5ndGggPSBpOw0KICAgIGVsc2UgZGVsZXRlIHRoaXMuX19vbjsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gb25BZGQodHlwZW5hbWUsIHZhbHVlLCBjYXB0dXJlKSB7DQogIHZhciB3cmFwID0gZmlsdGVyRXZlbnRzLmhhc093blByb3BlcnR5KHR5cGVuYW1lLnR5cGUpID8gZmlsdGVyQ29udGV4dExpc3RlbmVyIDogY29udGV4dExpc3RlbmVyOw0KICByZXR1cm4gZnVuY3Rpb24oZCwgaSwgZ3JvdXApIHsNCiAgICB2YXIgb24gPSB0aGlzLl9fb24sIG8sIGxpc3RlbmVyID0gd3JhcCh2YWx1ZSwgaSwgZ3JvdXApOw0KICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGg7IGogPCBtOyArK2opIHsNCiAgICAgIGlmICgobyA9IG9uW2pdKS50eXBlID09PSB0eXBlbmFtZS50eXBlICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkgew0KICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLmNhcHR1cmUpOw0KICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyID0gbGlzdGVuZXIsIG8uY2FwdHVyZSA9IGNhcHR1cmUpOw0KICAgICAgICBvLnZhbHVlID0gdmFsdWU7DQogICAgICAgIHJldHVybjsNCiAgICAgIH0NCiAgICB9DQogICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHR5cGVuYW1lLnR5cGUsIGxpc3RlbmVyLCBjYXB0dXJlKTsNCiAgICBvID0ge3R5cGU6IHR5cGVuYW1lLnR5cGUsIG5hbWU6IHR5cGVuYW1lLm5hbWUsIHZhbHVlOiB2YWx1ZSwgbGlzdGVuZXI6IGxpc3RlbmVyLCBjYXB0dXJlOiBjYXB0dXJlfTsNCiAgICBpZiAoIW9uKSB0aGlzLl9fb24gPSBbb107DQogICAgZWxzZSBvbi5wdXNoKG8pOw0KICB9Ow0KfQ0KDQp2YXIgc2VsZWN0aW9uX29uID0gZnVuY3Rpb24odHlwZW5hbWUsIHZhbHVlLCBjYXB0dXJlKSB7DQogIHZhciB0eXBlbmFtZXMgPSBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZSArICIiKSwgaSwgbiA9IHR5cGVuYW1lcy5sZW5ndGgsIHQ7DQoNCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7DQogICAgdmFyIG9uID0gdGhpcy5ub2RlKCkuX19vbjsNCiAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7DQogICAgICBmb3IgKGkgPSAwLCBvID0gb25bal07IGkgPCBuOyArK2kpIHsNCiAgICAgICAgaWYgKCh0ID0gdHlwZW5hbWVzW2ldKS50eXBlID09PSBvLnR5cGUgJiYgdC5uYW1lID09PSBvLm5hbWUpIHsNCiAgICAgICAgICByZXR1cm4gby52YWx1ZTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm47DQogIH0NCg0KICBvbiA9IHZhbHVlID8gb25BZGQgOiBvblJlbW92ZTsNCiAgaWYgKGNhcHR1cmUgPT0gbnVsbCkgY2FwdHVyZSA9IGZhbHNlOw0KICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB0aGlzLmVhY2gob24odHlwZW5hbWVzW2ldLCB2YWx1ZSwgY2FwdHVyZSkpOw0KICByZXR1cm4gdGhpczsNCn07DQoNCmZ1bmN0aW9uIGN1c3RvbUV2ZW50KGV2ZW50MSwgbGlzdGVuZXIsIHRoYXQsIGFyZ3MpIHsNCiAgdmFyIGV2ZW50MCA9IGV4cG9ydHMuZXZlbnQ7DQogIGV2ZW50MS5zb3VyY2VFdmVudCA9IGV4cG9ydHMuZXZlbnQ7DQogIGV4cG9ydHMuZXZlbnQgPSBldmVudDE7DQogIHRyeSB7DQogICAgcmV0dXJuIGxpc3RlbmVyLmFwcGx5KHRoYXQsIGFyZ3MpOw0KICB9IGZpbmFsbHkgew0KICAgIGV4cG9ydHMuZXZlbnQgPSBldmVudDA7DQogIH0NCn0NCg0KdmFyIHNvdXJjZUV2ZW50ID0gZnVuY3Rpb24oKSB7DQogIHZhciBjdXJyZW50ID0gZXhwb3J0cy5ldmVudCwgc291cmNlOw0KICB3aGlsZSAoc291cmNlID0gY3VycmVudC5zb3VyY2VFdmVudCkgY3VycmVudCA9IHNvdXJjZTsNCiAgcmV0dXJuIGN1cnJlbnQ7DQp9Ow0KDQp2YXIgcG9pbnQgPSBmdW5jdGlvbihub2RlLCBldmVudCkgew0KICB2YXIgc3ZnID0gbm9kZS5vd25lclNWR0VsZW1lbnQgfHwgbm9kZTsNCg0KICBpZiAoc3ZnLmNyZWF0ZVNWR1BvaW50KSB7DQogICAgdmFyIHBvaW50ID0gc3ZnLmNyZWF0ZVNWR1BvaW50KCk7DQogICAgcG9pbnQueCA9IGV2ZW50LmNsaWVudFgsIHBvaW50LnkgPSBldmVudC5jbGllbnRZOw0KICAgIHBvaW50ID0gcG9pbnQubWF0cml4VHJhbnNmb3JtKG5vZGUuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKTsNCiAgICByZXR1cm4gW3BvaW50LngsIHBvaW50LnldOw0KICB9DQoNCiAgdmFyIHJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOw0KICByZXR1cm4gW2V2ZW50LmNsaWVudFggLSByZWN0LmxlZnQgLSBub2RlLmNsaWVudExlZnQsIGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCAtIG5vZGUuY2xpZW50VG9wXTsNCn07DQoNCnZhciBtb3VzZSA9IGZ1bmN0aW9uKG5vZGUpIHsNCiAgdmFyIGV2ZW50ID0gc291cmNlRXZlbnQoKTsNCiAgaWYgKGV2ZW50LmNoYW5nZWRUb3VjaGVzKSBldmVudCA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdOw0KICByZXR1cm4gcG9pbnQobm9kZSwgZXZlbnQpOw0KfTsNCg0KZnVuY3Rpb24gbm9uZSgpIHt9DQoNCnZhciBzZWxlY3RvciA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7DQogIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gbm9uZSA6IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOw0KICB9Ow0KfTsNCg0KdmFyIHNlbGVjdGlvbl9zZWxlY3QgPSBmdW5jdGlvbihzZWxlY3QpIHsNCiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09ICJmdW5jdGlvbiIpIHNlbGVjdCA9IHNlbGVjdG9yKHNlbGVjdCk7DQoNCiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgew0KICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgc3Vibm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsNCiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAoc3Vibm9kZSA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkpIHsNCiAgICAgICAgaWYgKCJfX2RhdGFfXyIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187DQogICAgICAgIHN1Ymdyb3VwW2ldID0gc3Vibm9kZTsNCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpOw0KfTsNCg0KZnVuY3Rpb24gZW1wdHkoKSB7DQogIHJldHVybiBbXTsNCn0NCg0KdmFyIHNlbGVjdG9yQWxsID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsNCiAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBlbXB0eSA6IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOw0KICB9Ow0KfTsNCg0KdmFyIHNlbGVjdGlvbl9zZWxlY3RBbGwgPSBmdW5jdGlvbihzZWxlY3QpIHsNCiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09ICJmdW5jdGlvbiIpIHNlbGVjdCA9IHNlbGVjdG9yQWxsKHNlbGVjdCk7DQoNCiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBhcmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHsNCiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsNCiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsNCiAgICAgICAgc3ViZ3JvdXBzLnB1c2goc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKTsNCiAgICAgICAgcGFyZW50cy5wdXNoKG5vZGUpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgcGFyZW50cyk7DQp9Ow0KDQp2YXIgc2VsZWN0aW9uX2ZpbHRlciA9IGZ1bmN0aW9uKG1hdGNoKSB7DQogIGlmICh0eXBlb2YgbWF0Y2ggIT09ICJmdW5jdGlvbiIpIG1hdGNoID0gbWF0Y2hlciQxKG1hdGNoKTsNCg0KICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7DQogICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gW10sIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgbWF0Y2guY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpIHsNCiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTsNCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpOw0KfTsNCg0KdmFyIHNwYXJzZSA9IGZ1bmN0aW9uKHVwZGF0ZSkgew0KICByZXR1cm4gbmV3IEFycmF5KHVwZGF0ZS5sZW5ndGgpOw0KfTsNCg0KdmFyIHNlbGVjdGlvbl9lbnRlciA9IGZ1bmN0aW9uKCkgew0KICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9lbnRlciB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpOw0KfTsNCg0KZnVuY3Rpb24gRW50ZXJOb2RlKHBhcmVudCwgZGF0dW0pIHsNCiAgdGhpcy5vd25lckRvY3VtZW50ID0gcGFyZW50Lm93bmVyRG9jdW1lbnQ7DQogIHRoaXMubmFtZXNwYWNlVVJJID0gcGFyZW50Lm5hbWVzcGFjZVVSSTsNCiAgdGhpcy5fbmV4dCA9IG51bGw7DQogIHRoaXMuX3BhcmVudCA9IHBhcmVudDsNCiAgdGhpcy5fX2RhdGFfXyA9IGRhdHVtOw0KfQ0KDQpFbnRlck5vZGUucHJvdG90eXBlID0gew0KICBjb25zdHJ1Y3RvcjogRW50ZXJOb2RlLA0KICBhcHBlbmRDaGlsZDogZnVuY3Rpb24oY2hpbGQpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIHRoaXMuX25leHQpOyB9LA0KICBpbnNlcnRCZWZvcmU6IGZ1bmN0aW9uKGNoaWxkLCBuZXh0KSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBuZXh0KTsgfSwNCiAgcXVlcnlTZWxlY3RvcjogZnVuY3Rpb24oc2VsZWN0b3IpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsgfSwNCiAgcXVlcnlTZWxlY3RvckFsbDogZnVuY3Rpb24oc2VsZWN0b3IpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsgfQ0KfTsNCg0KdmFyIGNvbnN0YW50ID0gZnVuY3Rpb24oeCkgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHg7DQogIH07DQp9Ow0KDQp2YXIga2V5UHJlZml4ID0gIiQiOyAvLyBQcm90ZWN0IGFnYWluc3Qga2V5cyBsaWtlIOKAnF9fcHJvdG9fX+KAnS4NCg0KZnVuY3Rpb24gYmluZEluZGV4KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEpIHsNCiAgdmFyIGkgPSAwLA0KICAgICAgbm9kZSwNCiAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLA0KICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoOw0KDQogIC8vIFB1dCBhbnkgbm9uLW51bGwgbm9kZXMgdGhhdCBmaXQgaW50byB1cGRhdGUuDQogIC8vIFB1dCBhbnkgbnVsbCBub2RlcyBpbnRvIGVudGVyLg0KICAvLyBQdXQgYW55IHJlbWFpbmluZyBkYXRhIGludG8gZW50ZXIuDQogIGZvciAoOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7DQogICAgaWYgKG5vZGUgPSBncm91cFtpXSkgew0KICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07DQogICAgICB1cGRhdGVbaV0gPSBub2RlOw0KICAgIH0gZWxzZSB7DQogICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUocGFyZW50LCBkYXRhW2ldKTsNCiAgICB9DQogIH0NCg0KICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZG9u4oCZdCBmaXQgaW50byBleGl0Lg0KICBmb3IgKDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsNCiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7DQogICAgICBleGl0W2ldID0gbm9kZTsNCiAgICB9DQogIH0NCn0NCg0KZnVuY3Rpb24gYmluZEtleShwYXJlbnQsIGdyb3VwLCBlbnRlciwgdXBkYXRlLCBleGl0LCBkYXRhLCBrZXkpIHsNCiAgdmFyIGksDQogICAgICBub2RlLA0KICAgICAgbm9kZUJ5S2V5VmFsdWUgPSB7fSwNCiAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLA0KICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoLA0KICAgICAga2V5VmFsdWVzID0gbmV3IEFycmF5KGdyb3VwTGVuZ3RoKSwNCiAgICAgIGtleVZhbHVlOw0KDQogIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBub2RlLg0KICAvLyBJZiBtdWx0aXBsZSBub2RlcyBoYXZlIHRoZSBzYW1lIGtleSwgdGhlIGR1cGxpY2F0ZXMgYXJlIGFkZGVkIHRvIGV4aXQuDQogIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7DQogICAgaWYgKG5vZGUgPSBncm91cFtpXSkgew0KICAgICAga2V5VmFsdWVzW2ldID0ga2V5VmFsdWUgPSBrZXlQcmVmaXggKyBrZXkuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCk7DQogICAgICBpZiAoa2V5VmFsdWUgaW4gbm9kZUJ5S2V5VmFsdWUpIHsNCiAgICAgICAgZXhpdFtpXSA9IG5vZGU7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBub2RlQnlLZXlWYWx1ZVtrZXlWYWx1ZV0gPSBub2RlOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBkYXR1bS4NCiAgLy8gSWYgdGhlcmUgYSBub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGtleSwgam9pbiBhbmQgYWRkIGl0IHRvIHVwZGF0ZS4NCiAgLy8gSWYgdGhlcmUgaXMgbm90IChvciB0aGUga2V5IGlzIGEgZHVwbGljYXRlKSwgYWRkIGl0IHRvIGVudGVyLg0KICBmb3IgKGkgPSAwOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7DQogICAga2V5VmFsdWUgPSBrZXlQcmVmaXggKyBrZXkuY2FsbChwYXJlbnQsIGRhdGFbaV0sIGksIGRhdGEpOw0KICAgIGlmIChub2RlID0gbm9kZUJ5S2V5VmFsdWVba2V5VmFsdWVdKSB7DQogICAgICB1cGRhdGVbaV0gPSBub2RlOw0KICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07DQogICAgICBub2RlQnlLZXlWYWx1ZVtrZXlWYWx1ZV0gPSBudWxsOw0KICAgIH0gZWxzZSB7DQogICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUocGFyZW50LCBkYXRhW2ldKTsNCiAgICB9DQogIH0NCg0KICAvLyBBZGQgYW55IHJlbWFpbmluZyBub2RlcyB0aGF0IHdlcmUgbm90IGJvdW5kIHRvIGRhdGEgdG8gZXhpdC4NCiAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsNCiAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKG5vZGVCeUtleVZhbHVlW2tleVZhbHVlc1tpXV0gPT09IG5vZGUpKSB7DQogICAgICBleGl0W2ldID0gbm9kZTsNCiAgICB9DQogIH0NCn0NCg0KdmFyIHNlbGVjdGlvbl9kYXRhID0gZnVuY3Rpb24odmFsdWUsIGtleSkgew0KICBpZiAoIXZhbHVlKSB7DQogICAgZGF0YSA9IG5ldyBBcnJheSh0aGlzLnNpemUoKSksIGogPSAtMTsNCiAgICB0aGlzLmVhY2goZnVuY3Rpb24oZCkgeyBkYXRhWysral0gPSBkOyB9KTsNCiAgICByZXR1cm4gZGF0YTsNCiAgfQ0KDQogIHZhciBiaW5kID0ga2V5ID8gYmluZEtleSA6IGJpbmRJbmRleCwNCiAgICAgIHBhcmVudHMgPSB0aGlzLl9wYXJlbnRzLA0KICAgICAgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzOw0KDQogIGlmICh0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHZhbHVlID0gY29uc3RhbnQodmFsdWUpOw0KDQogIGZvciAodmFyIG0gPSBncm91cHMubGVuZ3RoLCB1cGRhdGUgPSBuZXcgQXJyYXkobSksIGVudGVyID0gbmV3IEFycmF5KG0pLCBleGl0ID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgew0KICAgIHZhciBwYXJlbnQgPSBwYXJlbnRzW2pdLA0KICAgICAgICBncm91cCA9IGdyb3Vwc1tqXSwNCiAgICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsDQogICAgICAgIGRhdGEgPSB2YWx1ZS5jYWxsKHBhcmVudCwgcGFyZW50ICYmIHBhcmVudC5fX2RhdGFfXywgaiwgcGFyZW50cyksDQogICAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCwNCiAgICAgICAgZW50ZXJHcm91cCA9IGVudGVyW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLA0KICAgICAgICB1cGRhdGVHcm91cCA9IHVwZGF0ZVtqXSA9IG5ldyBBcnJheShkYXRhTGVuZ3RoKSwNCiAgICAgICAgZXhpdEdyb3VwID0gZXhpdFtqXSA9IG5ldyBBcnJheShncm91cExlbmd0aCk7DQoNCiAgICBiaW5kKHBhcmVudCwgZ3JvdXAsIGVudGVyR3JvdXAsIHVwZGF0ZUdyb3VwLCBleGl0R3JvdXAsIGRhdGEsIGtleSk7DQoNCiAgICAvLyBOb3cgY29ubmVjdCB0aGUgZW50ZXIgbm9kZXMgdG8gdGhlaXIgZm9sbG93aW5nIHVwZGF0ZSBub2RlLCBzdWNoIHRoYXQNCiAgICAvLyBhcHBlbmRDaGlsZCBjYW4gaW5zZXJ0IHRoZSBtYXRlcmlhbGl6ZWQgZW50ZXIgbm9kZSBiZWZvcmUgdGhpcyBub2RlLA0KICAgIC8vIHJhdGhlciB0aGFuIGF0IHRoZSBlbmQgb2YgdGhlIHBhcmVudCBub2RlLg0KICAgIGZvciAodmFyIGkwID0gMCwgaTEgPSAwLCBwcmV2aW91cywgbmV4dDsgaTAgPCBkYXRhTGVuZ3RoOyArK2kwKSB7DQogICAgICBpZiAocHJldmlvdXMgPSBlbnRlckdyb3VwW2kwXSkgew0KICAgICAgICBpZiAoaTAgPj0gaTEpIGkxID0gaTAgKyAxOw0KICAgICAgICB3aGlsZSAoIShuZXh0ID0gdXBkYXRlR3JvdXBbaTFdKSAmJiArK2kxIDwgZGF0YUxlbmd0aCk7DQogICAgICAgIHByZXZpb3VzLl9uZXh0ID0gbmV4dCB8fCBudWxsOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIHVwZGF0ZSA9IG5ldyBTZWxlY3Rpb24odXBkYXRlLCBwYXJlbnRzKTsNCiAgdXBkYXRlLl9lbnRlciA9IGVudGVyOw0KICB1cGRhdGUuX2V4aXQgPSBleGl0Ow0KICByZXR1cm4gdXBkYXRlOw0KfTsNCg0KdmFyIHNlbGVjdGlvbl9leGl0ID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2V4aXQgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UpLCB0aGlzLl9wYXJlbnRzKTsNCn07DQoNCnZhciBzZWxlY3Rpb25fbWVyZ2UgPSBmdW5jdGlvbihzZWxlY3Rpb24pIHsNCg0KICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gc2VsZWN0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikgew0KICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsNCiAgICAgIGlmIChub2RlID0gZ3JvdXAwW2ldIHx8IGdyb3VwMVtpXSkgew0KICAgICAgICBtZXJnZVtpXSA9IG5vZGU7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgZm9yICg7IGogPCBtMDsgKytqKSB7DQogICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTsNCiAgfQ0KDQogIHJldHVybiBuZXcgU2VsZWN0aW9uKG1lcmdlcywgdGhpcy5fcGFyZW50cyk7DQp9Ow0KDQp2YXIgc2VsZWN0aW9uX29yZGVyID0gZnVuY3Rpb24oKSB7DQoNCiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gLTEsIG0gPSBncm91cHMubGVuZ3RoOyArK2ogPCBtOykgew0KICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gZ3JvdXAubGVuZ3RoIC0gMSwgbmV4dCA9IGdyb3VwW2ldLCBub2RlOyAtLWkgPj0gMDspIHsNCiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsNCiAgICAgICAgaWYgKG5leHQgJiYgbmV4dCAhPT0gbm9kZS5uZXh0U2libGluZykgbmV4dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBuZXh0KTsNCiAgICAgICAgbmV4dCA9IG5vZGU7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgcmV0dXJuIHRoaXM7DQp9Ow0KDQp2YXIgc2VsZWN0aW9uX3NvcnQgPSBmdW5jdGlvbihjb21wYXJlKSB7DQogIGlmICghY29tcGFyZSkgY29tcGFyZSA9IGFzY2VuZGluZzsNCg0KICBmdW5jdGlvbiBjb21wYXJlTm9kZShhLCBiKSB7DQogICAgcmV0dXJuIGEgJiYgYiA/IGNvbXBhcmUoYS5fX2RhdGFfXywgYi5fX2RhdGFfXykgOiAhYSAtICFiOw0KICB9DQoNCiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc29ydGdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsNCiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc29ydGdyb3VwID0gc29ydGdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsNCiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsNCiAgICAgICAgc29ydGdyb3VwW2ldID0gbm9kZTsNCiAgICAgIH0NCiAgICB9DQogICAgc29ydGdyb3VwLnNvcnQoY29tcGFyZU5vZGUpOw0KICB9DQoNCiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc29ydGdyb3VwcywgdGhpcy5fcGFyZW50cykub3JkZXIoKTsNCn07DQoNCmZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7DQogIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjsNCn0NCg0KdmFyIHNlbGVjdGlvbl9jYWxsID0gZnVuY3Rpb24oKSB7DQogIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50c1swXTsNCiAgYXJndW1lbnRzWzBdID0gdGhpczsNCiAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTsNCiAgcmV0dXJuIHRoaXM7DQp9Ow0KDQp2YXIgc2VsZWN0aW9uX25vZGVzID0gZnVuY3Rpb24oKSB7DQogIHZhciBub2RlcyA9IG5ldyBBcnJheSh0aGlzLnNpemUoKSksIGkgPSAtMTsNCiAgdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeyBub2Rlc1srK2ldID0gdGhpczsgfSk7DQogIHJldHVybiBub2RlczsNCn07DQoNCnZhciBzZWxlY3Rpb25fbm9kZSA9IGZ1bmN0aW9uKCkgew0KDQogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7DQogICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbjsgKytpKSB7DQogICAgICB2YXIgbm9kZSA9IGdyb3VwW2ldOw0KICAgICAgaWYgKG5vZGUpIHJldHVybiBub2RlOw0KICAgIH0NCiAgfQ0KDQogIHJldHVybiBudWxsOw0KfTsNCg0KdmFyIHNlbGVjdGlvbl9zaXplID0gZnVuY3Rpb24oKSB7DQogIHZhciBzaXplID0gMDsNCiAgdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeyArK3NpemU7IH0pOw0KICByZXR1cm4gc2l6ZTsNCn07DQoNCnZhciBzZWxlY3Rpb25fZW1wdHkgPSBmdW5jdGlvbigpIHsNCiAgcmV0dXJuICF0aGlzLm5vZGUoKTsNCn07DQoNCnZhciBzZWxlY3Rpb25fZWFjaCA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7DQoNCiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHsNCiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHsNCiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIGNhbGxiYWNrLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApOw0KICAgIH0NCiAgfQ0KDQogIHJldHVybiB0aGlzOw0KfTsNCg0KZnVuY3Rpb24gYXR0clJlbW92ZShuYW1lKSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gYXR0clJlbW92ZU5TKGZ1bGxuYW1lKSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7DQogIH07DQp9DQoNCmZ1bmN0aW9uIGF0dHJDb25zdGFudChuYW1lLCB2YWx1ZSkgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBhdHRyQ29uc3RhbnROUyhmdWxsbmFtZSwgdmFsdWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2YWx1ZSk7DQogIH07DQp9DQoNCmZ1bmN0aW9uIGF0dHJGdW5jdGlvbihuYW1lLCB2YWx1ZSkgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOw0KICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdik7DQogIH07DQp9DQoNCmZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TKGZ1bGxuYW1lLCB2YWx1ZSkgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsNCiAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2KTsNCiAgfTsNCn0NCg0KdmFyIHNlbGVjdGlvbl9hdHRyID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsNCiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpOw0KDQogIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgew0KICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCk7DQogICAgcmV0dXJuIGZ1bGxuYW1lLmxvY2FsDQogICAgICAgID8gbm9kZS5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpDQogICAgICAgIDogbm9kZS5nZXRBdHRyaWJ1dGUoZnVsbG5hbWUpOw0KICB9DQoNCiAgcmV0dXJuIHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbA0KICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMgOiBhdHRyUmVtb3ZlKSA6ICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiINCiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMgOiBhdHRyRnVuY3Rpb24pDQogICAgICA6IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TIDogYXR0ckNvbnN0YW50KSkpKGZ1bGxuYW1lLCB2YWx1ZSkpOw0KfTsNCg0KdmFyIGRlZmF1bHRWaWV3ID0gZnVuY3Rpb24obm9kZSkgew0KICByZXR1cm4gKG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpIC8vIG5vZGUgaXMgYSBOb2RlDQogICAgICB8fCAobm9kZS5kb2N1bWVudCAmJiBub2RlKSAvLyBub2RlIGlzIGEgV2luZG93DQogICAgICB8fCBub2RlLmRlZmF1bHRWaWV3OyAvLyBub2RlIGlzIGEgRG9jdW1lbnQNCn07DQoNCmZ1bmN0aW9uIHN0eWxlUmVtb3ZlKG5hbWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7DQogIH07DQp9DQoNCmZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlLCBwcmlvcml0eSk7DQogIH07DQp9DQoNCmZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQogICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsNCiAgICBlbHNlIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdiwgcHJpb3JpdHkpOw0KICB9Ow0KfQ0KDQp2YXIgc2VsZWN0aW9uX3N0eWxlID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7DQogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMQ0KICAgICAgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGwNCiAgICAgICAgICAgID8gc3R5bGVSZW1vdmUgOiB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiINCiAgICAgICAgICAgID8gc3R5bGVGdW5jdGlvbg0KICAgICAgICAgICAgOiBzdHlsZUNvbnN0YW50KShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkgPT0gbnVsbCA/ICIiIDogcHJpb3JpdHkpKQ0KICAgICAgOiBzdHlsZVZhbHVlKHRoaXMubm9kZSgpLCBuYW1lKTsNCn07DQoNCmZ1bmN0aW9uIHN0eWxlVmFsdWUobm9kZSwgbmFtZSkgew0KICByZXR1cm4gbm9kZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpDQogICAgICB8fCBkZWZhdWx0Vmlldyhub2RlKS5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpLmdldFByb3BlcnR5VmFsdWUobmFtZSk7DQp9DQoNCmZ1bmN0aW9uIHByb3BlcnR5UmVtb3ZlKG5hbWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIGRlbGV0ZSB0aGlzW25hbWVdOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBwcm9wZXJ0eUNvbnN0YW50KG5hbWUsIHZhbHVlKSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB0aGlzW25hbWVdID0gdmFsdWU7DQogIH07DQp9DQoNCmZ1bmN0aW9uIHByb3BlcnR5RnVuY3Rpb24obmFtZSwgdmFsdWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICBpZiAodiA9PSBudWxsKSBkZWxldGUgdGhpc1tuYW1lXTsNCiAgICBlbHNlIHRoaXNbbmFtZV0gPSB2Ow0KICB9Ow0KfQ0KDQp2YXIgc2VsZWN0aW9uX3Byb3BlcnR5ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsNCiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxDQogICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbA0KICAgICAgICAgID8gcHJvcGVydHlSZW1vdmUgOiB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiINCiAgICAgICAgICA/IHByb3BlcnR5RnVuY3Rpb24NCiAgICAgICAgICA6IHByb3BlcnR5Q29uc3RhbnQpKG5hbWUsIHZhbHVlKSkNCiAgICAgIDogdGhpcy5ub2RlKClbbmFtZV07DQp9Ow0KDQpmdW5jdGlvbiBjbGFzc0FycmF5KHN0cmluZykgew0KICByZXR1cm4gc3RyaW5nLnRyaW0oKS5zcGxpdCgvXnxccysvKTsNCn0NCg0KZnVuY3Rpb24gY2xhc3NMaXN0KG5vZGUpIHsNCiAgcmV0dXJuIG5vZGUuY2xhc3NMaXN0IHx8IG5ldyBDbGFzc0xpc3Qobm9kZSk7DQp9DQoNCmZ1bmN0aW9uIENsYXNzTGlzdChub2RlKSB7DQogIHRoaXMuX25vZGUgPSBub2RlOw0KICB0aGlzLl9uYW1lcyA9IGNsYXNzQXJyYXkobm9kZS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgIiIpOw0KfQ0KDQpDbGFzc0xpc3QucHJvdG90eXBlID0gew0KICBhZGQ6IGZ1bmN0aW9uKG5hbWUpIHsNCiAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7DQogICAgaWYgKGkgPCAwKSB7DQogICAgICB0aGlzLl9uYW1lcy5wdXNoKG5hbWUpOw0KICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwgdGhpcy5fbmFtZXMuam9pbigiICIpKTsNCiAgICB9DQogIH0sDQogIHJlbW92ZTogZnVuY3Rpb24obmFtZSkgew0KICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTsNCiAgICBpZiAoaSA+PSAwKSB7DQogICAgICB0aGlzLl9uYW1lcy5zcGxpY2UoaSwgMSk7DQogICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCB0aGlzLl9uYW1lcy5qb2luKCIgIikpOw0KICAgIH0NCiAgfSwNCiAgY29udGFpbnM6IGZ1bmN0aW9uKG5hbWUpIHsNCiAgICByZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKSA+PSAwOw0KICB9DQp9Ow0KDQpmdW5jdGlvbiBjbGFzc2VkQWRkKG5vZGUsIG5hbWVzKSB7DQogIHZhciBsaXN0ID0gY2xhc3NMaXN0KG5vZGUpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7DQogIHdoaWxlICgrK2kgPCBuKSBsaXN0LmFkZChuYW1lc1tpXSk7DQp9DQoNCmZ1bmN0aW9uIGNsYXNzZWRSZW1vdmUobm9kZSwgbmFtZXMpIHsNCiAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDsNCiAgd2hpbGUgKCsraSA8IG4pIGxpc3QucmVtb3ZlKG5hbWVzW2ldKTsNCn0NCg0KZnVuY3Rpb24gY2xhc3NlZFRydWUobmFtZXMpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIGNsYXNzZWRBZGQodGhpcywgbmFtZXMpOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBjbGFzc2VkRmFsc2UobmFtZXMpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIGNsYXNzZWRSZW1vdmUodGhpcywgbmFtZXMpOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBjbGFzc2VkRnVuY3Rpb24obmFtZXMsIHZhbHVlKSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICAodmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKSA/IGNsYXNzZWRBZGQgOiBjbGFzc2VkUmVtb3ZlKSh0aGlzLCBuYW1lcyk7DQogIH07DQp9DQoNCnZhciBzZWxlY3Rpb25fY2xhc3NlZCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7DQogIHZhciBuYW1lcyA9IGNsYXNzQXJyYXkobmFtZSArICIiKTsNCg0KICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsNCiAgICB2YXIgbGlzdCA9IGNsYXNzTGlzdCh0aGlzLm5vZGUoKSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDsNCiAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFsaXN0LmNvbnRhaW5zKG5hbWVzW2ldKSkgcmV0dXJuIGZhbHNlOw0KICAgIHJldHVybiB0cnVlOw0KICB9DQoNCiAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iDQogICAgICA/IGNsYXNzZWRGdW5jdGlvbiA6IHZhbHVlDQogICAgICA/IGNsYXNzZWRUcnVlDQogICAgICA6IGNsYXNzZWRGYWxzZSkobmFtZXMsIHZhbHVlKSk7DQp9Ow0KDQpmdW5jdGlvbiB0ZXh0UmVtb3ZlKCkgew0KICB0aGlzLnRleHRDb250ZW50ID0gIiI7DQp9DQoNCmZ1bmN0aW9uIHRleHRDb25zdGFudCh2YWx1ZSkgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiB0ZXh0RnVuY3Rpb24odmFsdWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICB0aGlzLnRleHRDb250ZW50ID0gdiA9PSBudWxsID8gIiIgOiB2Ow0KICB9Ow0KfQ0KDQp2YXIgc2VsZWN0aW9uX3RleHQgPSBmdW5jdGlvbih2YWx1ZSkgew0KICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aA0KICAgICAgPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbA0KICAgICAgICAgID8gdGV4dFJlbW92ZSA6ICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiINCiAgICAgICAgICA/IHRleHRGdW5jdGlvbg0KICAgICAgICAgIDogdGV4dENvbnN0YW50KSh2YWx1ZSkpDQogICAgICA6IHRoaXMubm9kZSgpLnRleHRDb250ZW50Ow0KfTsNCg0KZnVuY3Rpb24gaHRtbFJlbW92ZSgpIHsNCiAgdGhpcy5pbm5lckhUTUwgPSAiIjsNCn0NCg0KZnVuY3Rpb24gaHRtbENvbnN0YW50KHZhbHVlKSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLmlubmVySFRNTCA9IHZhbHVlOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBodG1sRnVuY3Rpb24odmFsdWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICB0aGlzLmlubmVySFRNTCA9IHYgPT0gbnVsbCA/ICIiIDogdjsNCiAgfTsNCn0NCg0KdmFyIHNlbGVjdGlvbl9odG1sID0gZnVuY3Rpb24odmFsdWUpIHsNCiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgNCiAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGwNCiAgICAgICAgICA/IGh0bWxSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iDQogICAgICAgICAgPyBodG1sRnVuY3Rpb24NCiAgICAgICAgICA6IGh0bWxDb25zdGFudCkodmFsdWUpKQ0KICAgICAgOiB0aGlzLm5vZGUoKS5pbm5lckhUTUw7DQp9Ow0KDQpmdW5jdGlvbiByYWlzZSgpIHsNCiAgaWYgKHRoaXMubmV4dFNpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzKTsNCn0NCg0KdmFyIHNlbGVjdGlvbl9yYWlzZSA9IGZ1bmN0aW9uKCkgew0KICByZXR1cm4gdGhpcy5lYWNoKHJhaXNlKTsNCn07DQoNCmZ1bmN0aW9uIGxvd2VyKCkgew0KICBpZiAodGhpcy5wcmV2aW91c1NpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcywgdGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpOw0KfQ0KDQp2YXIgc2VsZWN0aW9uX2xvd2VyID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiB0aGlzLmVhY2gobG93ZXIpOw0KfTsNCg0KdmFyIHNlbGVjdGlvbl9hcHBlbmQgPSBmdW5jdGlvbihuYW1lKSB7DQogIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gImZ1bmN0aW9uIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpOw0KICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOw0KICB9KTsNCn07DQoNCmZ1bmN0aW9uIGNvbnN0YW50TnVsbCgpIHsNCiAgcmV0dXJuIG51bGw7DQp9DQoNCnZhciBzZWxlY3Rpb25faW5zZXJ0ID0gZnVuY3Rpb24obmFtZSwgYmVmb3JlKSB7DQogIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gImZ1bmN0aW9uIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpLA0KICAgICAgc2VsZWN0ID0gYmVmb3JlID09IG51bGwgPyBjb25zdGFudE51bGwgOiB0eXBlb2YgYmVmb3JlID09PSAiZnVuY3Rpb24iID8gYmVmb3JlIDogc2VsZWN0b3IoYmVmb3JlKTsNCiAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aGlzLmluc2VydEJlZm9yZShjcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgc2VsZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgbnVsbCk7DQogIH0pOw0KfTsNCg0KZnVuY3Rpb24gcmVtb3ZlKCkgew0KICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOw0KICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7DQp9DQoNCnZhciBzZWxlY3Rpb25fcmVtb3ZlID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiB0aGlzLmVhY2gocmVtb3ZlKTsNCn07DQoNCnZhciBzZWxlY3Rpb25fZGF0dW0gPSBmdW5jdGlvbih2YWx1ZSkgew0KICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aA0KICAgICAgPyB0aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIsIHZhbHVlKQ0KICAgICAgOiB0aGlzLm5vZGUoKS5fX2RhdGFfXzsNCn07DQoNCmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQobm9kZSwgdHlwZSwgcGFyYW1zKSB7DQogIHZhciB3aW5kb3cgPSBkZWZhdWx0Vmlldyhub2RlKSwNCiAgICAgIGV2ZW50ID0gd2luZG93LkN1c3RvbUV2ZW50Ow0KDQogIGlmICh0eXBlb2YgZXZlbnQgPT09ICJmdW5jdGlvbiIpIHsNCiAgICBldmVudCA9IG5ldyBldmVudCh0eXBlLCBwYXJhbXMpOw0KICB9IGVsc2Ugew0KICAgIGV2ZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpOw0KICAgIGlmIChwYXJhbXMpIGV2ZW50LmluaXRFdmVudCh0eXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUpLCBldmVudC5kZXRhaWwgPSBwYXJhbXMuZGV0YWlsOw0KICAgIGVsc2UgZXZlbnQuaW5pdEV2ZW50KHR5cGUsIGZhbHNlLCBmYWxzZSk7DQogIH0NCg0KICBub2RlLmRpc3BhdGNoRXZlbnQoZXZlbnQpOw0KfQ0KDQpmdW5jdGlvbiBkaXNwYXRjaENvbnN0YW50KHR5cGUsIHBhcmFtcykgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIGRpc3BhdGNoRXZlbnQodGhpcywgdHlwZSwgcGFyYW1zKTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gZGlzcGF0Y2hGdW5jdGlvbih0eXBlLCBwYXJhbXMpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsNCiAgfTsNCn0NCg0KdmFyIHNlbGVjdGlvbl9kaXNwYXRjaCA9IGZ1bmN0aW9uKHR5cGUsIHBhcmFtcykgew0KICByZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgcGFyYW1zID09PSAiZnVuY3Rpb24iDQogICAgICA/IGRpc3BhdGNoRnVuY3Rpb24NCiAgICAgIDogZGlzcGF0Y2hDb25zdGFudCkodHlwZSwgcGFyYW1zKSk7DQp9Ow0KDQp2YXIgcm9vdCA9IFtudWxsXTsNCg0KZnVuY3Rpb24gU2VsZWN0aW9uKGdyb3VwcywgcGFyZW50cykgew0KICB0aGlzLl9ncm91cHMgPSBncm91cHM7DQogIHRoaXMuX3BhcmVudHMgPSBwYXJlbnRzOw0KfQ0KDQpmdW5jdGlvbiBzZWxlY3Rpb24oKSB7DQogIHJldHVybiBuZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XV0sIHJvb3QpOw0KfQ0KDQpTZWxlY3Rpb24ucHJvdG90eXBlID0gc2VsZWN0aW9uLnByb3RvdHlwZSA9IHsNCiAgY29uc3RydWN0b3I6IFNlbGVjdGlvbiwNCiAgc2VsZWN0OiBzZWxlY3Rpb25fc2VsZWN0LA0KICBzZWxlY3RBbGw6IHNlbGVjdGlvbl9zZWxlY3RBbGwsDQogIGZpbHRlcjogc2VsZWN0aW9uX2ZpbHRlciwNCiAgZGF0YTogc2VsZWN0aW9uX2RhdGEsDQogIGVudGVyOiBzZWxlY3Rpb25fZW50ZXIsDQogIGV4aXQ6IHNlbGVjdGlvbl9leGl0LA0KICBtZXJnZTogc2VsZWN0aW9uX21lcmdlLA0KICBvcmRlcjogc2VsZWN0aW9uX29yZGVyLA0KICBzb3J0OiBzZWxlY3Rpb25fc29ydCwNCiAgY2FsbDogc2VsZWN0aW9uX2NhbGwsDQogIG5vZGVzOiBzZWxlY3Rpb25fbm9kZXMsDQogIG5vZGU6IHNlbGVjdGlvbl9ub2RlLA0KICBzaXplOiBzZWxlY3Rpb25fc2l6ZSwNCiAgZW1wdHk6IHNlbGVjdGlvbl9lbXB0eSwNCiAgZWFjaDogc2VsZWN0aW9uX2VhY2gsDQogIGF0dHI6IHNlbGVjdGlvbl9hdHRyLA0KICBzdHlsZTogc2VsZWN0aW9uX3N0eWxlLA0KICBwcm9wZXJ0eTogc2VsZWN0aW9uX3Byb3BlcnR5LA0KICBjbGFzc2VkOiBzZWxlY3Rpb25fY2xhc3NlZCwNCiAgdGV4dDogc2VsZWN0aW9uX3RleHQsDQogIGh0bWw6IHNlbGVjdGlvbl9odG1sLA0KICByYWlzZTogc2VsZWN0aW9uX3JhaXNlLA0KICBsb3dlcjogc2VsZWN0aW9uX2xvd2VyLA0KICBhcHBlbmQ6IHNlbGVjdGlvbl9hcHBlbmQsDQogIGluc2VydDogc2VsZWN0aW9uX2luc2VydCwNCiAgcmVtb3ZlOiBzZWxlY3Rpb25fcmVtb3ZlLA0KICBkYXR1bTogc2VsZWN0aW9uX2RhdHVtLA0KICBvbjogc2VsZWN0aW9uX29uLA0KICBkaXNwYXRjaDogc2VsZWN0aW9uX2Rpc3BhdGNoDQp9Ow0KDQp2YXIgc2VsZWN0ID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsNCiAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyINCiAgICAgID8gbmV3IFNlbGVjdGlvbihbW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpXV0sIFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKQ0KICAgICAgOiBuZXcgU2VsZWN0aW9uKFtbc2VsZWN0b3JdXSwgcm9vdCk7DQp9Ow0KDQp2YXIgc2VsZWN0QWxsID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsNCiAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyINCiAgICAgID8gbmV3IFNlbGVjdGlvbihbZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcildLCBbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSkNCiAgICAgIDogbmV3IFNlbGVjdGlvbihbc2VsZWN0b3IgPT0gbnVsbCA/IFtdIDogc2VsZWN0b3JdLCByb290KTsNCn07DQoNCnZhciB0b3VjaCA9IGZ1bmN0aW9uKG5vZGUsIHRvdWNoZXMsIGlkZW50aWZpZXIpIHsNCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBpZGVudGlmaWVyID0gdG91Y2hlcywgdG91Y2hlcyA9IHNvdXJjZUV2ZW50KCkuY2hhbmdlZFRvdWNoZXM7DQoNCiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0b3VjaGVzID8gdG91Y2hlcy5sZW5ndGggOiAwLCB0b3VjaDsgaSA8IG47ICsraSkgew0KICAgIGlmICgodG91Y2ggPSB0b3VjaGVzW2ldKS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7DQogICAgICByZXR1cm4gcG9pbnQobm9kZSwgdG91Y2gpOw0KICAgIH0NCiAgfQ0KDQogIHJldHVybiBudWxsOw0KfTsNCg0KdmFyIHRvdWNoZXMgPSBmdW5jdGlvbihub2RlLCB0b3VjaGVzKSB7DQogIGlmICh0b3VjaGVzID09IG51bGwpIHRvdWNoZXMgPSBzb3VyY2VFdmVudCgpLnRvdWNoZXM7DQoNCiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0b3VjaGVzID8gdG91Y2hlcy5sZW5ndGggOiAwLCBwb2ludHMgPSBuZXcgQXJyYXkobik7IGkgPCBuOyArK2kpIHsNCiAgICBwb2ludHNbaV0gPSBwb2ludChub2RlLCB0b3VjaGVzW2ldKTsNCiAgfQ0KDQogIHJldHVybiBwb2ludHM7DQp9Ow0KDQpleHBvcnRzLmNyZWF0b3IgPSBjcmVhdG9yOw0KZXhwb3J0cy5sb2NhbCA9IGxvY2FsOw0KZXhwb3J0cy5tYXRjaGVyID0gbWF0Y2hlciQxOw0KZXhwb3J0cy5tb3VzZSA9IG1vdXNlOw0KZXhwb3J0cy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7DQpleHBvcnRzLm5hbWVzcGFjZXMgPSBuYW1lc3BhY2VzOw0KZXhwb3J0cy5zZWxlY3QgPSBzZWxlY3Q7DQpleHBvcnRzLnNlbGVjdEFsbCA9IHNlbGVjdEFsbDsNCmV4cG9ydHMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOw0KZXhwb3J0cy5zZWxlY3RvciA9IHNlbGVjdG9yOw0KZXhwb3J0cy5zZWxlY3RvckFsbCA9IHNlbGVjdG9yQWxsOw0KZXhwb3J0cy5zdHlsZSA9IHN0eWxlVmFsdWU7DQpleHBvcnRzLnRvdWNoID0gdG91Y2g7DQpleHBvcnRzLnRvdWNoZXMgPSB0b3VjaGVzOw0KZXhwb3J0cy53aW5kb3cgPSBkZWZhdWx0VmlldzsNCmV4cG9ydHMuY3VzdG9tRXZlbnQgPSBjdXN0b21FdmVudDsNCg0KT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTsNCg0KfSkpKTsNCg0KfSx7fV0sMTM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpew0KLy8gaHR0cHM6Ly9kM2pzLm9yZy9kMy1zaGFwZS8gVmVyc2lvbiAxLjIuMC4gQ29weXJpZ2h0IDIwMTcgTWlrZSBCb3N0b2NrLg0KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsNCgl0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMsIHJlcXVpcmUoJ2QzLXBhdGgnKSkgOg0KCXR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnLCAnZDMtcGF0aCddLCBmYWN0b3J5KSA6DQoJKGZhY3RvcnkoKGdsb2JhbC5kMyA9IGdsb2JhbC5kMyB8fCB7fSksZ2xvYmFsLmQzKSk7DQp9KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cyxkM1BhdGgpIHsgJ3VzZSBzdHJpY3QnOw0KDQp2YXIgY29uc3RhbnQgPSBmdW5jdGlvbih4KSB7DQogIHJldHVybiBmdW5jdGlvbiBjb25zdGFudCgpIHsNCiAgICByZXR1cm4geDsNCiAgfTsNCn07DQoNCnZhciBhYnMgPSBNYXRoLmFiczsNCnZhciBhdGFuMiA9IE1hdGguYXRhbjI7DQp2YXIgY29zID0gTWF0aC5jb3M7DQp2YXIgbWF4ID0gTWF0aC5tYXg7DQp2YXIgbWluID0gTWF0aC5taW47DQp2YXIgc2luID0gTWF0aC5zaW47DQp2YXIgc3FydCA9IE1hdGguc3FydDsNCg0KdmFyIGVwc2lsb24gPSAxZS0xMjsNCnZhciBwaSA9IE1hdGguUEk7DQp2YXIgaGFsZlBpID0gcGkgLyAyOw0KdmFyIHRhdSA9IDIgKiBwaTsNCg0KZnVuY3Rpb24gYWNvcyh4KSB7DQogIHJldHVybiB4ID4gMSA/IDAgOiB4IDwgLTEgPyBwaSA6IE1hdGguYWNvcyh4KTsNCn0NCg0KZnVuY3Rpb24gYXNpbih4KSB7DQogIHJldHVybiB4ID49IDEgPyBoYWxmUGkgOiB4IDw9IC0xID8gLWhhbGZQaSA6IE1hdGguYXNpbih4KTsNCn0NCg0KZnVuY3Rpb24gYXJjSW5uZXJSYWRpdXMoZCkgew0KICByZXR1cm4gZC5pbm5lclJhZGl1czsNCn0NCg0KZnVuY3Rpb24gYXJjT3V0ZXJSYWRpdXMoZCkgew0KICByZXR1cm4gZC5vdXRlclJhZGl1czsNCn0NCg0KZnVuY3Rpb24gYXJjU3RhcnRBbmdsZShkKSB7DQogIHJldHVybiBkLnN0YXJ0QW5nbGU7DQp9DQoNCmZ1bmN0aW9uIGFyY0VuZEFuZ2xlKGQpIHsNCiAgcmV0dXJuIGQuZW5kQW5nbGU7DQp9DQoNCmZ1bmN0aW9uIGFyY1BhZEFuZ2xlKGQpIHsNCiAgcmV0dXJuIGQgJiYgZC5wYWRBbmdsZTsgLy8gTm90ZTogb3B0aW9uYWwhDQp9DQoNCmZ1bmN0aW9uIGludGVyc2VjdCh4MCwgeTAsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpIHsNCiAgdmFyIHgxMCA9IHgxIC0geDAsIHkxMCA9IHkxIC0geTAsDQogICAgICB4MzIgPSB4MyAtIHgyLCB5MzIgPSB5MyAtIHkyLA0KICAgICAgdCA9ICh4MzIgKiAoeTAgLSB5MikgLSB5MzIgKiAoeDAgLSB4MikpIC8gKHkzMiAqIHgxMCAtIHgzMiAqIHkxMCk7DQogIHJldHVybiBbeDAgKyB0ICogeDEwLCB5MCArIHQgKiB5MTBdOw0KfQ0KDQovLyBDb21wdXRlIHBlcnBlbmRpY3VsYXIgb2Zmc2V0IGxpbmUgb2YgbGVuZ3RoIHJjLg0KLy8gaHR0cDovL21hdGh3b3JsZC53b2xmcmFtLmNvbS9DaXJjbGUtTGluZUludGVyc2VjdGlvbi5odG1sDQpmdW5jdGlvbiBjb3JuZXJUYW5nZW50cyh4MCwgeTAsIHgxLCB5MSwgcjEsIHJjLCBjdykgew0KICB2YXIgeDAxID0geDAgLSB4MSwNCiAgICAgIHkwMSA9IHkwIC0geTEsDQogICAgICBsbyA9IChjdyA/IHJjIDogLXJjKSAvIHNxcnQoeDAxICogeDAxICsgeTAxICogeTAxKSwNCiAgICAgIG94ID0gbG8gKiB5MDEsDQogICAgICBveSA9IC1sbyAqIHgwMSwNCiAgICAgIHgxMSA9IHgwICsgb3gsDQogICAgICB5MTEgPSB5MCArIG95LA0KICAgICAgeDEwID0geDEgKyBveCwNCiAgICAgIHkxMCA9IHkxICsgb3ksDQogICAgICB4MDAgPSAoeDExICsgeDEwKSAvIDIsDQogICAgICB5MDAgPSAoeTExICsgeTEwKSAvIDIsDQogICAgICBkeCA9IHgxMCAtIHgxMSwNCiAgICAgIGR5ID0geTEwIC0geTExLA0KICAgICAgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeSwNCiAgICAgIHIgPSByMSAtIHJjLA0KICAgICAgRCA9IHgxMSAqIHkxMCAtIHgxMCAqIHkxMSwNCiAgICAgIGQgPSAoZHkgPCAwID8gLTEgOiAxKSAqIHNxcnQobWF4KDAsIHIgKiByICogZDIgLSBEICogRCkpLA0KICAgICAgY3gwID0gKEQgKiBkeSAtIGR4ICogZCkgLyBkMiwNCiAgICAgIGN5MCA9ICgtRCAqIGR4IC0gZHkgKiBkKSAvIGQyLA0KICAgICAgY3gxID0gKEQgKiBkeSArIGR4ICogZCkgLyBkMiwNCiAgICAgIGN5MSA9ICgtRCAqIGR4ICsgZHkgKiBkKSAvIGQyLA0KICAgICAgZHgwID0gY3gwIC0geDAwLA0KICAgICAgZHkwID0gY3kwIC0geTAwLA0KICAgICAgZHgxID0gY3gxIC0geDAwLA0KICAgICAgZHkxID0gY3kxIC0geTAwOw0KDQogIC8vIFBpY2sgdGhlIGNsb3NlciBvZiB0aGUgdHdvIGludGVyc2VjdGlvbiBwb2ludHMuDQogIC8vIFRPRE8gSXMgdGhlcmUgYSBmYXN0ZXIgd2F5IHRvIGRldGVybWluZSB3aGljaCBpbnRlcnNlY3Rpb24gdG8gdXNlPw0KICBpZiAoZHgwICogZHgwICsgZHkwICogZHkwID4gZHgxICogZHgxICsgZHkxICogZHkxKSBjeDAgPSBjeDEsIGN5MCA9IGN5MTsNCg0KICByZXR1cm4gew0KICAgIGN4OiBjeDAsDQogICAgY3k6IGN5MCwNCiAgICB4MDE6IC1veCwNCiAgICB5MDE6IC1veSwNCiAgICB4MTE6IGN4MCAqIChyMSAvIHIgLSAxKSwNCiAgICB5MTE6IGN5MCAqIChyMSAvIHIgLSAxKQ0KICB9Ow0KfQ0KDQp2YXIgYXJjID0gZnVuY3Rpb24oKSB7DQogIHZhciBpbm5lclJhZGl1cyA9IGFyY0lubmVyUmFkaXVzLA0KICAgICAgb3V0ZXJSYWRpdXMgPSBhcmNPdXRlclJhZGl1cywNCiAgICAgIGNvcm5lclJhZGl1cyA9IGNvbnN0YW50KDApLA0KICAgICAgcGFkUmFkaXVzID0gbnVsbCwNCiAgICAgIHN0YXJ0QW5nbGUgPSBhcmNTdGFydEFuZ2xlLA0KICAgICAgZW5kQW5nbGUgPSBhcmNFbmRBbmdsZSwNCiAgICAgIHBhZEFuZ2xlID0gYXJjUGFkQW5nbGUsDQogICAgICBjb250ZXh0ID0gbnVsbDsNCg0KICBmdW5jdGlvbiBhcmMoKSB7DQogICAgdmFyIGJ1ZmZlciwNCiAgICAgICAgciwNCiAgICAgICAgcjAgPSAraW5uZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwNCiAgICAgICAgcjEgPSArb3V0ZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwNCiAgICAgICAgYTAgPSBzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgLSBoYWxmUGksDQogICAgICAgIGExID0gZW5kQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSAtIGhhbGZQaSwNCiAgICAgICAgZGEgPSBhYnMoYTEgLSBhMCksDQogICAgICAgIGN3ID0gYTEgPiBhMDsNCg0KICAgIGlmICghY29udGV4dCkgY29udGV4dCA9IGJ1ZmZlciA9IGQzUGF0aC5wYXRoKCk7DQoNCiAgICAvLyBFbnN1cmUgdGhhdCB0aGUgb3V0ZXIgcmFkaXVzIGlzIGFsd2F5cyBsYXJnZXIgdGhhbiB0aGUgaW5uZXIgcmFkaXVzLg0KICAgIGlmIChyMSA8IHIwKSByID0gcjEsIHIxID0gcjAsIHIwID0gcjsNCg0KICAgIC8vIElzIGl0IGEgcG9pbnQ/DQogICAgaWYgKCEocjEgPiBlcHNpbG9uKSkgY29udGV4dC5tb3ZlVG8oMCwgMCk7DQoNCiAgICAvLyBPciBpcyBpdCBhIGNpcmNsZSBvciBhbm51bHVzPw0KICAgIGVsc2UgaWYgKGRhID4gdGF1IC0gZXBzaWxvbikgew0KICAgICAgY29udGV4dC5tb3ZlVG8ocjEgKiBjb3MoYTApLCByMSAqIHNpbihhMCkpOw0KICAgICAgY29udGV4dC5hcmMoMCwgMCwgcjEsIGEwLCBhMSwgIWN3KTsNCiAgICAgIGlmIChyMCA+IGVwc2lsb24pIHsNCiAgICAgICAgY29udGV4dC5tb3ZlVG8ocjAgKiBjb3MoYTEpLCByMCAqIHNpbihhMSkpOw0KICAgICAgICBjb250ZXh0LmFyYygwLCAwLCByMCwgYTEsIGEwLCBjdyk7DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gT3IgaXMgaXQgYSBjaXJjdWxhciBvciBhbm51bGFyIHNlY3Rvcj8NCiAgICBlbHNlIHsNCiAgICAgIHZhciBhMDEgPSBhMCwNCiAgICAgICAgICBhMTEgPSBhMSwNCiAgICAgICAgICBhMDAgPSBhMCwNCiAgICAgICAgICBhMTAgPSBhMSwNCiAgICAgICAgICBkYTAgPSBkYSwNCiAgICAgICAgICBkYTEgPSBkYSwNCiAgICAgICAgICBhcCA9IHBhZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgLyAyLA0KICAgICAgICAgIHJwID0gKGFwID4gZXBzaWxvbikgJiYgKHBhZFJhZGl1cyA/ICtwYWRSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHNxcnQocjAgKiByMCArIHIxICogcjEpKSwNCiAgICAgICAgICByYyA9IG1pbihhYnMocjEgLSByMCkgLyAyLCArY29ybmVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpLA0KICAgICAgICAgIHJjMCA9IHJjLA0KICAgICAgICAgIHJjMSA9IHJjLA0KICAgICAgICAgIHQwLA0KICAgICAgICAgIHQxOw0KDQogICAgICAvLyBBcHBseSBwYWRkaW5nPyBOb3RlIHRoYXQgc2luY2UgcjEg4omlIHIwLCBkYTEg4omlIGRhMC4NCiAgICAgIGlmIChycCA+IGVwc2lsb24pIHsNCiAgICAgICAgdmFyIHAwID0gYXNpbihycCAvIHIwICogc2luKGFwKSksDQogICAgICAgICAgICBwMSA9IGFzaW4ocnAgLyByMSAqIHNpbihhcCkpOw0KICAgICAgICBpZiAoKGRhMCAtPSBwMCAqIDIpID4gZXBzaWxvbikgcDAgKj0gKGN3ID8gMSA6IC0xKSwgYTAwICs9IHAwLCBhMTAgLT0gcDA7DQogICAgICAgIGVsc2UgZGEwID0gMCwgYTAwID0gYTEwID0gKGEwICsgYTEpIC8gMjsNCiAgICAgICAgaWYgKChkYTEgLT0gcDEgKiAyKSA+IGVwc2lsb24pIHAxICo9IChjdyA/IDEgOiAtMSksIGEwMSArPSBwMSwgYTExIC09IHAxOw0KICAgICAgICBlbHNlIGRhMSA9IDAsIGEwMSA9IGExMSA9IChhMCArIGExKSAvIDI7DQogICAgICB9DQoNCiAgICAgIHZhciB4MDEgPSByMSAqIGNvcyhhMDEpLA0KICAgICAgICAgIHkwMSA9IHIxICogc2luKGEwMSksDQogICAgICAgICAgeDEwID0gcjAgKiBjb3MoYTEwKSwNCiAgICAgICAgICB5MTAgPSByMCAqIHNpbihhMTApOw0KDQogICAgICAvLyBBcHBseSByb3VuZGVkIGNvcm5lcnM/DQogICAgICBpZiAocmMgPiBlcHNpbG9uKSB7DQogICAgICAgIHZhciB4MTEgPSByMSAqIGNvcyhhMTEpLA0KICAgICAgICAgICAgeTExID0gcjEgKiBzaW4oYTExKSwNCiAgICAgICAgICAgIHgwMCA9IHIwICogY29zKGEwMCksDQogICAgICAgICAgICB5MDAgPSByMCAqIHNpbihhMDApOw0KDQogICAgICAgIC8vIFJlc3RyaWN0IHRoZSBjb3JuZXIgcmFkaXVzIGFjY29yZGluZyB0byB0aGUgc2VjdG9yIGFuZ2xlLg0KICAgICAgICBpZiAoZGEgPCBwaSkgew0KICAgICAgICAgIHZhciBvYyA9IGRhMCA+IGVwc2lsb24gPyBpbnRlcnNlY3QoeDAxLCB5MDEsIHgwMCwgeTAwLCB4MTEsIHkxMSwgeDEwLCB5MTApIDogW3gxMCwgeTEwXSwNCiAgICAgICAgICAgICAgYXggPSB4MDEgLSBvY1swXSwNCiAgICAgICAgICAgICAgYXkgPSB5MDEgLSBvY1sxXSwNCiAgICAgICAgICAgICAgYnggPSB4MTEgLSBvY1swXSwNCiAgICAgICAgICAgICAgYnkgPSB5MTEgLSBvY1sxXSwNCiAgICAgICAgICAgICAga2MgPSAxIC8gc2luKGFjb3MoKGF4ICogYnggKyBheSAqIGJ5KSAvIChzcXJ0KGF4ICogYXggKyBheSAqIGF5KSAqIHNxcnQoYnggKiBieCArIGJ5ICogYnkpKSkgLyAyKSwNCiAgICAgICAgICAgICAgbGMgPSBzcXJ0KG9jWzBdICogb2NbMF0gKyBvY1sxXSAqIG9jWzFdKTsNCiAgICAgICAgICByYzAgPSBtaW4ocmMsIChyMCAtIGxjKSAvIChrYyAtIDEpKTsNCiAgICAgICAgICByYzEgPSBtaW4ocmMsIChyMSAtIGxjKSAvIChrYyArIDEpKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KDQogICAgICAvLyBJcyB0aGUgc2VjdG9yIGNvbGxhcHNlZCB0byBhIGxpbmU/DQogICAgICBpZiAoIShkYTEgPiBlcHNpbG9uKSkgY29udGV4dC5tb3ZlVG8oeDAxLCB5MDEpOw0KDQogICAgICAvLyBEb2VzIHRoZSBzZWN0b3LigJlzIG91dGVyIHJpbmcgaGF2ZSByb3VuZGVkIGNvcm5lcnM/DQogICAgICBlbHNlIGlmIChyYzEgPiBlcHNpbG9uKSB7DQogICAgICAgIHQwID0gY29ybmVyVGFuZ2VudHMoeDAwLCB5MDAsIHgwMSwgeTAxLCByMSwgcmMxLCBjdyk7DQogICAgICAgIHQxID0gY29ybmVyVGFuZ2VudHMoeDExLCB5MTEsIHgxMCwgeTEwLCByMSwgcmMxLCBjdyk7DQoNCiAgICAgICAgY29udGV4dC5tb3ZlVG8odDAuY3ggKyB0MC54MDEsIHQwLmN5ICsgdDAueTAxKTsNCg0KICAgICAgICAvLyBIYXZlIHRoZSBjb3JuZXJzIG1lcmdlZD8NCiAgICAgICAgaWYgKHJjMSA8IHJjKSBjb250ZXh0LmFyYyh0MC5jeCwgdDAuY3ksIHJjMSwgYXRhbjIodDAueTAxLCB0MC54MDEpLCBhdGFuMih0MS55MDEsIHQxLngwMSksICFjdyk7DQoNCiAgICAgICAgLy8gT3RoZXJ3aXNlLCBkcmF3IHRoZSB0d28gY29ybmVycyBhbmQgdGhlIHJpbmcuDQogICAgICAgIGVsc2Ugew0KICAgICAgICAgIGNvbnRleHQuYXJjKHQwLmN4LCB0MC5jeSwgcmMxLCBhdGFuMih0MC55MDEsIHQwLngwMSksIGF0YW4yKHQwLnkxMSwgdDAueDExKSwgIWN3KTsNCiAgICAgICAgICBjb250ZXh0LmFyYygwLCAwLCByMSwgYXRhbjIodDAuY3kgKyB0MC55MTEsIHQwLmN4ICsgdDAueDExKSwgYXRhbjIodDEuY3kgKyB0MS55MTEsIHQxLmN4ICsgdDEueDExKSwgIWN3KTsNCiAgICAgICAgICBjb250ZXh0LmFyYyh0MS5jeCwgdDEuY3ksIHJjMSwgYXRhbjIodDEueTExLCB0MS54MTEpLCBhdGFuMih0MS55MDEsIHQxLngwMSksICFjdyk7DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgLy8gT3IgaXMgdGhlIG91dGVyIHJpbmcganVzdCBhIGNpcmN1bGFyIGFyYz8NCiAgICAgIGVsc2UgY29udGV4dC5tb3ZlVG8oeDAxLCB5MDEpLCBjb250ZXh0LmFyYygwLCAwLCByMSwgYTAxLCBhMTEsICFjdyk7DQoNCiAgICAgIC8vIElzIHRoZXJlIG5vIGlubmVyIHJpbmcsIGFuZCBpdOKAmXMgYSBjaXJjdWxhciBzZWN0b3I/DQogICAgICAvLyBPciBwZXJoYXBzIGl04oCZcyBhbiBhbm51bGFyIHNlY3RvciBjb2xsYXBzZWQgZHVlIHRvIHBhZGRpbmc/DQogICAgICBpZiAoIShyMCA+IGVwc2lsb24pIHx8ICEoZGEwID4gZXBzaWxvbikpIGNvbnRleHQubGluZVRvKHgxMCwgeTEwKTsNCg0KICAgICAgLy8gRG9lcyB0aGUgc2VjdG9y4oCZcyBpbm5lciByaW5nIChvciBwb2ludCkgaGF2ZSByb3VuZGVkIGNvcm5lcnM/DQogICAgICBlbHNlIGlmIChyYzAgPiBlcHNpbG9uKSB7DQogICAgICAgIHQwID0gY29ybmVyVGFuZ2VudHMoeDEwLCB5MTAsIHgxMSwgeTExLCByMCwgLXJjMCwgY3cpOw0KICAgICAgICB0MSA9IGNvcm5lclRhbmdlbnRzKHgwMSwgeTAxLCB4MDAsIHkwMCwgcjAsIC1yYzAsIGN3KTsNCg0KICAgICAgICBjb250ZXh0LmxpbmVUbyh0MC5jeCArIHQwLngwMSwgdDAuY3kgKyB0MC55MDEpOw0KDQogICAgICAgIC8vIEhhdmUgdGhlIGNvcm5lcnMgbWVyZ2VkPw0KICAgICAgICBpZiAocmMwIDwgcmMpIGNvbnRleHQuYXJjKHQwLmN4LCB0MC5jeSwgcmMwLCBhdGFuMih0MC55MDEsIHQwLngwMSksIGF0YW4yKHQxLnkwMSwgdDEueDAxKSwgIWN3KTsNCg0KICAgICAgICAvLyBPdGhlcndpc2UsIGRyYXcgdGhlIHR3byBjb3JuZXJzIGFuZCB0aGUgcmluZy4NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgY29udGV4dC5hcmModDAuY3gsIHQwLmN5LCByYzAsIGF0YW4yKHQwLnkwMSwgdDAueDAxKSwgYXRhbjIodDAueTExLCB0MC54MTEpLCAhY3cpOw0KICAgICAgICAgIGNvbnRleHQuYXJjKDAsIDAsIHIwLCBhdGFuMih0MC5jeSArIHQwLnkxMSwgdDAuY3ggKyB0MC54MTEpLCBhdGFuMih0MS5jeSArIHQxLnkxMSwgdDEuY3ggKyB0MS54MTEpLCBjdyk7DQogICAgICAgICAgY29udGV4dC5hcmModDEuY3gsIHQxLmN5LCByYzAsIGF0YW4yKHQxLnkxMSwgdDEueDExKSwgYXRhbjIodDEueTAxLCB0MS54MDEpLCAhY3cpOw0KICAgICAgICB9DQogICAgICB9DQoNCiAgICAgIC8vIE9yIGlzIHRoZSBpbm5lciByaW5nIGp1c3QgYSBjaXJjdWxhciBhcmM/DQogICAgICBlbHNlIGNvbnRleHQuYXJjKDAsIDAsIHIwLCBhMTAsIGEwMCwgY3cpOw0KICAgIH0NCg0KICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7DQoNCiAgICBpZiAoYnVmZmVyKSByZXR1cm4gY29udGV4dCA9IG51bGwsIGJ1ZmZlciArICIiIHx8IG51bGw7DQogIH0NCg0KICBhcmMuY2VudHJvaWQgPSBmdW5jdGlvbigpIHsNCiAgICB2YXIgciA9ICgraW5uZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSArICtvdXRlclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSAvIDIsDQogICAgICAgIGEgPSAoK3N0YXJ0QW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSArICtlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSAvIDIgLSBwaSAvIDI7DQogICAgcmV0dXJuIFtjb3MoYSkgKiByLCBzaW4oYSkgKiByXTsNCiAgfTsNCg0KICBhcmMuaW5uZXJSYWRpdXMgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaW5uZXJSYWRpdXMgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCgrXyksIGFyYykgOiBpbm5lclJhZGl1czsNCiAgfTsNCg0KICBhcmMub3V0ZXJSYWRpdXMgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3V0ZXJSYWRpdXMgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCgrXyksIGFyYykgOiBvdXRlclJhZGl1czsNCiAgfTsNCg0KICBhcmMuY29ybmVyUmFkaXVzID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvcm5lclJhZGl1cyA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50KCtfKSwgYXJjKSA6IGNvcm5lclJhZGl1czsNCiAgfTsNCg0KICBhcmMucGFkUmFkaXVzID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZFJhZGl1cyA9IF8gPT0gbnVsbCA/IG51bGwgOiB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCgrXyksIGFyYykgOiBwYWRSYWRpdXM7DQogIH07DQoNCiAgYXJjLnN0YXJ0QW5nbGUgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3RhcnRBbmdsZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50KCtfKSwgYXJjKSA6IHN0YXJ0QW5nbGU7DQogIH07DQoNCiAgYXJjLmVuZEFuZ2xlID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVuZEFuZ2xlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQoK18pLCBhcmMpIDogZW5kQW5nbGU7DQogIH07DQoNCiAgYXJjLnBhZEFuZ2xlID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZEFuZ2xlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQoK18pLCBhcmMpIDogcGFkQW5nbGU7DQogIH07DQoNCiAgYXJjLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoKGNvbnRleHQgPSBfID09IG51bGwgPyBudWxsIDogXyksIGFyYykgOiBjb250ZXh0Ow0KICB9Ow0KDQogIHJldHVybiBhcmM7DQp9Ow0KDQpmdW5jdGlvbiBMaW5lYXIoY29udGV4dCkgew0KICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsNCn0NCg0KTGluZWFyLnByb3RvdHlwZSA9IHsNCiAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl9saW5lID0gMDsNCiAgfSwNCiAgYXJlYUVuZDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5fbGluZSA9IE5hTjsNCiAgfSwNCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl9wb2ludCA9IDA7DQogIH0sDQogIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgew0KICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAxKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsNCiAgICB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7DQogIH0sDQogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7DQogICAgeCA9ICt4LCB5ID0gK3k7DQogICAgc3dpdGNoICh0aGlzLl9wb2ludCkgew0KICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHgsIHkpOyBicmVhazsNCiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyAvLyBwcm9jZWVkDQogICAgICBkZWZhdWx0OiB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KTsgYnJlYWs7DQogICAgfQ0KICB9DQp9Ow0KDQp2YXIgY3VydmVMaW5lYXIgPSBmdW5jdGlvbihjb250ZXh0KSB7DQogIHJldHVybiBuZXcgTGluZWFyKGNvbnRleHQpOw0KfTsNCg0KZnVuY3Rpb24geChwKSB7DQogIHJldHVybiBwWzBdOw0KfQ0KDQpmdW5jdGlvbiB5KHApIHsNCiAgcmV0dXJuIHBbMV07DQp9DQoNCnZhciBsaW5lID0gZnVuY3Rpb24oKSB7DQogIHZhciB4JCQxID0geCwNCiAgICAgIHkkJDEgPSB5LA0KICAgICAgZGVmaW5lZCA9IGNvbnN0YW50KHRydWUpLA0KICAgICAgY29udGV4dCA9IG51bGwsDQogICAgICBjdXJ2ZSA9IGN1cnZlTGluZWFyLA0KICAgICAgb3V0cHV0ID0gbnVsbDsNCg0KICBmdW5jdGlvbiBsaW5lKGRhdGEpIHsNCiAgICB2YXIgaSwNCiAgICAgICAgbiA9IGRhdGEubGVuZ3RoLA0KICAgICAgICBkLA0KICAgICAgICBkZWZpbmVkMCA9IGZhbHNlLA0KICAgICAgICBidWZmZXI7DQoNCiAgICBpZiAoY29udGV4dCA9PSBudWxsKSBvdXRwdXQgPSBjdXJ2ZShidWZmZXIgPSBkM1BhdGgucGF0aCgpKTsNCg0KICAgIGZvciAoaSA9IDA7IGkgPD0gbjsgKytpKSB7DQogICAgICBpZiAoIShpIDwgbiAmJiBkZWZpbmVkKGQgPSBkYXRhW2ldLCBpLCBkYXRhKSkgPT09IGRlZmluZWQwKSB7DQogICAgICAgIGlmIChkZWZpbmVkMCA9ICFkZWZpbmVkMCkgb3V0cHV0LmxpbmVTdGFydCgpOw0KICAgICAgICBlbHNlIG91dHB1dC5saW5lRW5kKCk7DQogICAgICB9DQogICAgICBpZiAoZGVmaW5lZDApIG91dHB1dC5wb2ludCgreCQkMShkLCBpLCBkYXRhKSwgK3kkJDEoZCwgaSwgZGF0YSkpOw0KICAgIH0NCg0KICAgIGlmIChidWZmZXIpIHJldHVybiBvdXRwdXQgPSBudWxsLCBidWZmZXIgKyAiIiB8fCBudWxsOw0KICB9DQoNCiAgbGluZS54ID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHgkJDEgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCgrXyksIGxpbmUpIDogeCQkMTsNCiAgfTsNCg0KICBsaW5lLnkgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeSQkMSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50KCtfKSwgbGluZSkgOiB5JCQxOw0KICB9Ow0KDQogIGxpbmUuZGVmaW5lZCA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkZWZpbmVkID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQoISFfKSwgbGluZSkgOiBkZWZpbmVkOw0KICB9Ow0KDQogIGxpbmUuY3VydmUgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY3VydmUgPSBfLCBjb250ZXh0ICE9IG51bGwgJiYgKG91dHB1dCA9IGN1cnZlKGNvbnRleHQpKSwgbGluZSkgOiBjdXJ2ZTsNCiAgfTsNCg0KICBsaW5lLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoXyA9PSBudWxsID8gY29udGV4dCA9IG91dHB1dCA9IG51bGwgOiBvdXRwdXQgPSBjdXJ2ZShjb250ZXh0ID0gXyksIGxpbmUpIDogY29udGV4dDsNCiAgfTsNCg0KICByZXR1cm4gbGluZTsNCn07DQoNCnZhciBhcmVhID0gZnVuY3Rpb24oKSB7DQogIHZhciB4MCA9IHgsDQogICAgICB4MSA9IG51bGwsDQogICAgICB5MCA9IGNvbnN0YW50KDApLA0KICAgICAgeTEgPSB5LA0KICAgICAgZGVmaW5lZCA9IGNvbnN0YW50KHRydWUpLA0KICAgICAgY29udGV4dCA9IG51bGwsDQogICAgICBjdXJ2ZSA9IGN1cnZlTGluZWFyLA0KICAgICAgb3V0cHV0ID0gbnVsbDsNCg0KICBmdW5jdGlvbiBhcmVhKGRhdGEpIHsNCiAgICB2YXIgaSwNCiAgICAgICAgaiwNCiAgICAgICAgaywNCiAgICAgICAgbiA9IGRhdGEubGVuZ3RoLA0KICAgICAgICBkLA0KICAgICAgICBkZWZpbmVkMCA9IGZhbHNlLA0KICAgICAgICBidWZmZXIsDQogICAgICAgIHgweiA9IG5ldyBBcnJheShuKSwNCiAgICAgICAgeTB6ID0gbmV3IEFycmF5KG4pOw0KDQogICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgb3V0cHV0ID0gY3VydmUoYnVmZmVyID0gZDNQYXRoLnBhdGgoKSk7DQoNCiAgICBmb3IgKGkgPSAwOyBpIDw9IG47ICsraSkgew0KICAgICAgaWYgKCEoaSA8IG4gJiYgZGVmaW5lZChkID0gZGF0YVtpXSwgaSwgZGF0YSkpID09PSBkZWZpbmVkMCkgew0KICAgICAgICBpZiAoZGVmaW5lZDAgPSAhZGVmaW5lZDApIHsNCiAgICAgICAgICBqID0gaTsNCiAgICAgICAgICBvdXRwdXQuYXJlYVN0YXJ0KCk7DQogICAgICAgICAgb3V0cHV0LmxpbmVTdGFydCgpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIG91dHB1dC5saW5lRW5kKCk7DQogICAgICAgICAgb3V0cHV0LmxpbmVTdGFydCgpOw0KICAgICAgICAgIGZvciAoayA9IGkgLSAxOyBrID49IGo7IC0taykgew0KICAgICAgICAgICAgb3V0cHV0LnBvaW50KHgweltrXSwgeTB6W2tdKTsNCiAgICAgICAgICB9DQogICAgICAgICAgb3V0cHV0LmxpbmVFbmQoKTsNCiAgICAgICAgICBvdXRwdXQuYXJlYUVuZCgpOw0KICAgICAgICB9DQogICAgICB9DQogICAgICBpZiAoZGVmaW5lZDApIHsNCiAgICAgICAgeDB6W2ldID0gK3gwKGQsIGksIGRhdGEpLCB5MHpbaV0gPSAreTAoZCwgaSwgZGF0YSk7DQogICAgICAgIG91dHB1dC5wb2ludCh4MSA/ICt4MShkLCBpLCBkYXRhKSA6IHgweltpXSwgeTEgPyAreTEoZCwgaSwgZGF0YSkgOiB5MHpbaV0pOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIGlmIChidWZmZXIpIHJldHVybiBvdXRwdXQgPSBudWxsLCBidWZmZXIgKyAiIiB8fCBudWxsOw0KICB9DQoNCiAgZnVuY3Rpb24gYXJlYWxpbmUoKSB7DQogICAgcmV0dXJuIGxpbmUoKS5kZWZpbmVkKGRlZmluZWQpLmN1cnZlKGN1cnZlKS5jb250ZXh0KGNvbnRleHQpOw0KICB9DQoNCiAgYXJlYS54ID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHgwID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQoK18pLCB4MSA9IG51bGwsIGFyZWEpIDogeDA7DQogIH07DQoNCiAgYXJlYS54MCA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4MCA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50KCtfKSwgYXJlYSkgOiB4MDsNCiAgfTsNCg0KICBhcmVhLngxID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHgxID0gXyA9PSBudWxsID8gbnVsbCA6IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50KCtfKSwgYXJlYSkgOiB4MTsNCiAgfTsNCg0KICBhcmVhLnkgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeTAgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCgrXyksIHkxID0gbnVsbCwgYXJlYSkgOiB5MDsNCiAgfTsNCg0KICBhcmVhLnkwID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHkwID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQoK18pLCBhcmVhKSA6IHkwOw0KICB9Ow0KDQogIGFyZWEueTEgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeTEgPSBfID09IG51bGwgPyBudWxsIDogdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQoK18pLCBhcmVhKSA6IHkxOw0KICB9Ow0KDQogIGFyZWEubGluZVgwID0NCiAgYXJlYS5saW5lWTAgPSBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gYXJlYWxpbmUoKS54KHgwKS55KHkwKTsNCiAgfTsNCg0KICBhcmVhLmxpbmVZMSA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBhcmVhbGluZSgpLngoeDApLnkoeTEpOw0KICB9Ow0KDQogIGFyZWEubGluZVgxID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIGFyZWFsaW5lKCkueCh4MSkueSh5MCk7DQogIH07DQoNCiAgYXJlYS5kZWZpbmVkID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRlZmluZWQgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCghIV8pLCBhcmVhKSA6IGRlZmluZWQ7DQogIH07DQoNCiAgYXJlYS5jdXJ2ZSA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjdXJ2ZSA9IF8sIGNvbnRleHQgIT0gbnVsbCAmJiAob3V0cHV0ID0gY3VydmUoY29udGV4dCkpLCBhcmVhKSA6IGN1cnZlOw0KICB9Ow0KDQogIGFyZWEuY29udGV4dCA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChfID09IG51bGwgPyBjb250ZXh0ID0gb3V0cHV0ID0gbnVsbCA6IG91dHB1dCA9IGN1cnZlKGNvbnRleHQgPSBfKSwgYXJlYSkgOiBjb250ZXh0Ow0KICB9Ow0KDQogIHJldHVybiBhcmVhOw0KfTsNCg0KdmFyIGRlc2NlbmRpbmcgPSBmdW5jdGlvbihhLCBiKSB7DQogIHJldHVybiBiIDwgYSA/IC0xIDogYiA+IGEgPyAxIDogYiA+PSBhID8gMCA6IE5hTjsNCn07DQoNCnZhciBpZGVudGl0eSA9IGZ1bmN0aW9uKGQpIHsNCiAgcmV0dXJuIGQ7DQp9Ow0KDQp2YXIgcGllID0gZnVuY3Rpb24oKSB7DQogIHZhciB2YWx1ZSA9IGlkZW50aXR5LA0KICAgICAgc29ydFZhbHVlcyA9IGRlc2NlbmRpbmcsDQogICAgICBzb3J0ID0gbnVsbCwNCiAgICAgIHN0YXJ0QW5nbGUgPSBjb25zdGFudCgwKSwNCiAgICAgIGVuZEFuZ2xlID0gY29uc3RhbnQodGF1KSwNCiAgICAgIHBhZEFuZ2xlID0gY29uc3RhbnQoMCk7DQoNCiAgZnVuY3Rpb24gcGllKGRhdGEpIHsNCiAgICB2YXIgaSwNCiAgICAgICAgbiA9IGRhdGEubGVuZ3RoLA0KICAgICAgICBqLA0KICAgICAgICBrLA0KICAgICAgICBzdW0gPSAwLA0KICAgICAgICBpbmRleCA9IG5ldyBBcnJheShuKSwNCiAgICAgICAgYXJjcyA9IG5ldyBBcnJheShuKSwNCiAgICAgICAgYTAgPSArc3RhcnRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLA0KICAgICAgICBkYSA9IE1hdGgubWluKHRhdSwgTWF0aC5tYXgoLXRhdSwgZW5kQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSAtIGEwKSksDQogICAgICAgIGExLA0KICAgICAgICBwID0gTWF0aC5taW4oTWF0aC5hYnMoZGEpIC8gbiwgcGFkQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSksDQogICAgICAgIHBhID0gcCAqIChkYSA8IDAgPyAtMSA6IDEpLA0KICAgICAgICB2Ow0KDQogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgew0KICAgICAgaWYgKCh2ID0gYXJjc1tpbmRleFtpXSA9IGldID0gK3ZhbHVlKGRhdGFbaV0sIGksIGRhdGEpKSA+IDApIHsNCiAgICAgICAgc3VtICs9IHY7DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gT3B0aW9uYWxseSBzb3J0IHRoZSBhcmNzIGJ5IHByZXZpb3VzbHktY29tcHV0ZWQgdmFsdWVzIG9yIGJ5IGRhdGEuDQogICAgaWYgKHNvcnRWYWx1ZXMgIT0gbnVsbCkgaW5kZXguc29ydChmdW5jdGlvbihpLCBqKSB7IHJldHVybiBzb3J0VmFsdWVzKGFyY3NbaV0sIGFyY3Nbal0pOyB9KTsNCiAgICBlbHNlIGlmIChzb3J0ICE9IG51bGwpIGluZGV4LnNvcnQoZnVuY3Rpb24oaSwgaikgeyByZXR1cm4gc29ydChkYXRhW2ldLCBkYXRhW2pdKTsgfSk7DQoNCiAgICAvLyBDb21wdXRlIHRoZSBhcmNzISBUaGV5IGFyZSBzdG9yZWQgaW4gdGhlIG9yaWdpbmFsIGRhdGEncyBvcmRlci4NCiAgICBmb3IgKGkgPSAwLCBrID0gc3VtID8gKGRhIC0gbiAqIHBhKSAvIHN1bSA6IDA7IGkgPCBuOyArK2ksIGEwID0gYTEpIHsNCiAgICAgIGogPSBpbmRleFtpXSwgdiA9IGFyY3Nbal0sIGExID0gYTAgKyAodiA+IDAgPyB2ICogayA6IDApICsgcGEsIGFyY3Nbal0gPSB7DQogICAgICAgIGRhdGE6IGRhdGFbal0sDQogICAgICAgIGluZGV4OiBpLA0KICAgICAgICB2YWx1ZTogdiwNCiAgICAgICAgc3RhcnRBbmdsZTogYTAsDQogICAgICAgIGVuZEFuZ2xlOiBhMSwNCiAgICAgICAgcGFkQW5nbGU6IHANCiAgICAgIH07DQogICAgfQ0KDQogICAgcmV0dXJuIGFyY3M7DQogIH0NCg0KICBwaWUudmFsdWUgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCgrXyksIHBpZSkgOiB2YWx1ZTsNCiAgfTsNCg0KICBwaWUuc29ydFZhbHVlcyA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzb3J0VmFsdWVzID0gXywgc29ydCA9IG51bGwsIHBpZSkgOiBzb3J0VmFsdWVzOw0KICB9Ow0KDQogIHBpZS5zb3J0ID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNvcnQgPSBfLCBzb3J0VmFsdWVzID0gbnVsbCwgcGllKSA6IHNvcnQ7DQogIH07DQoNCiAgcGllLnN0YXJ0QW5nbGUgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3RhcnRBbmdsZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50KCtfKSwgcGllKSA6IHN0YXJ0QW5nbGU7DQogIH07DQoNCiAgcGllLmVuZEFuZ2xlID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVuZEFuZ2xlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQoK18pLCBwaWUpIDogZW5kQW5nbGU7DQogIH07DQoNCiAgcGllLnBhZEFuZ2xlID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZEFuZ2xlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQoK18pLCBwaWUpIDogcGFkQW5nbGU7DQogIH07DQoNCiAgcmV0dXJuIHBpZTsNCn07DQoNCnZhciBjdXJ2ZVJhZGlhbExpbmVhciA9IGN1cnZlUmFkaWFsKGN1cnZlTGluZWFyKTsNCg0KZnVuY3Rpb24gUmFkaWFsKGN1cnZlKSB7DQogIHRoaXMuX2N1cnZlID0gY3VydmU7DQp9DQoNClJhZGlhbC5wcm90b3R5cGUgPSB7DQogIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5fY3VydmUuYXJlYVN0YXJ0KCk7DQogIH0sDQogIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuX2N1cnZlLmFyZWFFbmQoKTsNCiAgfSwNCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl9jdXJ2ZS5saW5lU3RhcnQoKTsNCiAgfSwNCiAgbGluZUVuZDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5fY3VydmUubGluZUVuZCgpOw0KICB9LA0KICBwb2ludDogZnVuY3Rpb24oYSwgcikgew0KICAgIHRoaXMuX2N1cnZlLnBvaW50KHIgKiBNYXRoLnNpbihhKSwgciAqIC1NYXRoLmNvcyhhKSk7DQogIH0NCn07DQoNCmZ1bmN0aW9uIGN1cnZlUmFkaWFsKGN1cnZlKSB7DQoNCiAgZnVuY3Rpb24gcmFkaWFsKGNvbnRleHQpIHsNCiAgICByZXR1cm4gbmV3IFJhZGlhbChjdXJ2ZShjb250ZXh0KSk7DQogIH0NCg0KICByYWRpYWwuX2N1cnZlID0gY3VydmU7DQoNCiAgcmV0dXJuIHJhZGlhbDsNCn0NCg0KZnVuY3Rpb24gbGluZVJhZGlhbChsKSB7DQogIHZhciBjID0gbC5jdXJ2ZTsNCg0KICBsLmFuZ2xlID0gbC54LCBkZWxldGUgbC54Ow0KICBsLnJhZGl1cyA9IGwueSwgZGVsZXRlIGwueTsNCg0KICBsLmN1cnZlID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gYyhjdXJ2ZVJhZGlhbChfKSkgOiBjKCkuX2N1cnZlOw0KICB9Ow0KDQogIHJldHVybiBsOw0KfQ0KDQp2YXIgbGluZVJhZGlhbCQxID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiBsaW5lUmFkaWFsKGxpbmUoKS5jdXJ2ZShjdXJ2ZVJhZGlhbExpbmVhcikpOw0KfTsNCg0KdmFyIGFyZWFSYWRpYWwgPSBmdW5jdGlvbigpIHsNCiAgdmFyIGEgPSBhcmVhKCkuY3VydmUoY3VydmVSYWRpYWxMaW5lYXIpLA0KICAgICAgYyA9IGEuY3VydmUsDQogICAgICB4MCA9IGEubGluZVgwLA0KICAgICAgeDEgPSBhLmxpbmVYMSwNCiAgICAgIHkwID0gYS5saW5lWTAsDQogICAgICB5MSA9IGEubGluZVkxOw0KDQogIGEuYW5nbGUgPSBhLngsIGRlbGV0ZSBhLng7DQogIGEuc3RhcnRBbmdsZSA9IGEueDAsIGRlbGV0ZSBhLngwOw0KICBhLmVuZEFuZ2xlID0gYS54MSwgZGVsZXRlIGEueDE7DQogIGEucmFkaXVzID0gYS55LCBkZWxldGUgYS55Ow0KICBhLmlubmVyUmFkaXVzID0gYS55MCwgZGVsZXRlIGEueTA7DQogIGEub3V0ZXJSYWRpdXMgPSBhLnkxLCBkZWxldGUgYS55MTsNCiAgYS5saW5lU3RhcnRBbmdsZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGluZVJhZGlhbCh4MCgpKTsgfSwgZGVsZXRlIGEubGluZVgwOw0KICBhLmxpbmVFbmRBbmdsZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGluZVJhZGlhbCh4MSgpKTsgfSwgZGVsZXRlIGEubGluZVgxOw0KICBhLmxpbmVJbm5lclJhZGl1cyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGluZVJhZGlhbCh5MCgpKTsgfSwgZGVsZXRlIGEubGluZVkwOw0KICBhLmxpbmVPdXRlclJhZGl1cyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGluZVJhZGlhbCh5MSgpKTsgfSwgZGVsZXRlIGEubGluZVkxOw0KDQogIGEuY3VydmUgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyBjKGN1cnZlUmFkaWFsKF8pKSA6IGMoKS5fY3VydmU7DQogIH07DQoNCiAgcmV0dXJuIGE7DQp9Ow0KDQp2YXIgcG9pbnRSYWRpYWwgPSBmdW5jdGlvbih4LCB5KSB7DQogIHJldHVybiBbKHkgPSAreSkgKiBNYXRoLmNvcyh4IC09IE1hdGguUEkgLyAyKSwgeSAqIE1hdGguc2luKHgpXTsNCn07DQoNCnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTsNCg0KZnVuY3Rpb24gbGlua1NvdXJjZShkKSB7DQogIHJldHVybiBkLnNvdXJjZTsNCn0NCg0KZnVuY3Rpb24gbGlua1RhcmdldChkKSB7DQogIHJldHVybiBkLnRhcmdldDsNCn0NCg0KZnVuY3Rpb24gbGluayhjdXJ2ZSkgew0KICB2YXIgc291cmNlID0gbGlua1NvdXJjZSwNCiAgICAgIHRhcmdldCA9IGxpbmtUYXJnZXQsDQogICAgICB4JCQxID0geCwNCiAgICAgIHkkJDEgPSB5LA0KICAgICAgY29udGV4dCA9IG51bGw7DQoNCiAgZnVuY3Rpb24gbGluaygpIHsNCiAgICB2YXIgYnVmZmVyLCBhcmd2ID0gc2xpY2UuY2FsbChhcmd1bWVudHMpLCBzID0gc291cmNlLmFwcGx5KHRoaXMsIGFyZ3YpLCB0ID0gdGFyZ2V0LmFwcGx5KHRoaXMsIGFyZ3YpOw0KICAgIGlmICghY29udGV4dCkgY29udGV4dCA9IGJ1ZmZlciA9IGQzUGF0aC5wYXRoKCk7DQogICAgY3VydmUoY29udGV4dCwgK3gkJDEuYXBwbHkodGhpcywgKGFyZ3ZbMF0gPSBzLCBhcmd2KSksICt5JCQxLmFwcGx5KHRoaXMsIGFyZ3YpLCAreCQkMS5hcHBseSh0aGlzLCAoYXJndlswXSA9IHQsIGFyZ3YpKSwgK3kkJDEuYXBwbHkodGhpcywgYXJndikpOw0KICAgIGlmIChidWZmZXIpIHJldHVybiBjb250ZXh0ID0gbnVsbCwgYnVmZmVyICsgIiIgfHwgbnVsbDsNCiAgfQ0KDQogIGxpbmsuc291cmNlID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNvdXJjZSA9IF8sIGxpbmspIDogc291cmNlOw0KICB9Ow0KDQogIGxpbmsudGFyZ2V0ID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRhcmdldCA9IF8sIGxpbmspIDogdGFyZ2V0Ow0KICB9Ow0KDQogIGxpbmsueCA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4JCQxID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQoK18pLCBsaW5rKSA6IHgkJDE7DQogIH07DQoNCiAgbGluay55ID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHkkJDEgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCgrXyksIGxpbmspIDogeSQkMTsNCiAgfTsNCg0KICBsaW5rLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoKGNvbnRleHQgPSBfID09IG51bGwgPyBudWxsIDogXyksIGxpbmspIDogY29udGV4dDsNCiAgfTsNCg0KICByZXR1cm4gbGluazsNCn0NCg0KZnVuY3Rpb24gY3VydmVIb3Jpem9udGFsKGNvbnRleHQsIHgwLCB5MCwgeDEsIHkxKSB7DQogIGNvbnRleHQubW92ZVRvKHgwLCB5MCk7DQogIGNvbnRleHQuYmV6aWVyQ3VydmVUbyh4MCA9ICh4MCArIHgxKSAvIDIsIHkwLCB4MCwgeTEsIHgxLCB5MSk7DQp9DQoNCmZ1bmN0aW9uIGN1cnZlVmVydGljYWwoY29udGV4dCwgeDAsIHkwLCB4MSwgeTEpIHsNCiAgY29udGV4dC5tb3ZlVG8oeDAsIHkwKTsNCiAgY29udGV4dC5iZXppZXJDdXJ2ZVRvKHgwLCB5MCA9ICh5MCArIHkxKSAvIDIsIHgxLCB5MCwgeDEsIHkxKTsNCn0NCg0KZnVuY3Rpb24gY3VydmVSYWRpYWwkMShjb250ZXh0LCB4MCwgeTAsIHgxLCB5MSkgew0KICB2YXIgcDAgPSBwb2ludFJhZGlhbCh4MCwgeTApLA0KICAgICAgcDEgPSBwb2ludFJhZGlhbCh4MCwgeTAgPSAoeTAgKyB5MSkgLyAyKSwNCiAgICAgIHAyID0gcG9pbnRSYWRpYWwoeDEsIHkwKSwNCiAgICAgIHAzID0gcG9pbnRSYWRpYWwoeDEsIHkxKTsNCiAgY29udGV4dC5tb3ZlVG8ocDBbMF0sIHAwWzFdKTsNCiAgY29udGV4dC5iZXppZXJDdXJ2ZVRvKHAxWzBdLCBwMVsxXSwgcDJbMF0sIHAyWzFdLCBwM1swXSwgcDNbMV0pOw0KfQ0KDQpmdW5jdGlvbiBsaW5rSG9yaXpvbnRhbCgpIHsNCiAgcmV0dXJuIGxpbmsoY3VydmVIb3Jpem9udGFsKTsNCn0NCg0KZnVuY3Rpb24gbGlua1ZlcnRpY2FsKCkgew0KICByZXR1cm4gbGluayhjdXJ2ZVZlcnRpY2FsKTsNCn0NCg0KZnVuY3Rpb24gbGlua1JhZGlhbCgpIHsNCiAgdmFyIGwgPSBsaW5rKGN1cnZlUmFkaWFsJDEpOw0KICBsLmFuZ2xlID0gbC54LCBkZWxldGUgbC54Ow0KICBsLnJhZGl1cyA9IGwueSwgZGVsZXRlIGwueTsNCiAgcmV0dXJuIGw7DQp9DQoNCnZhciBjaXJjbGUgPSB7DQogIGRyYXc6IGZ1bmN0aW9uKGNvbnRleHQsIHNpemUpIHsNCiAgICB2YXIgciA9IE1hdGguc3FydChzaXplIC8gcGkpOw0KICAgIGNvbnRleHQubW92ZVRvKHIsIDApOw0KICAgIGNvbnRleHQuYXJjKDAsIDAsIHIsIDAsIHRhdSk7DQogIH0NCn07DQoNCnZhciBjcm9zcyA9IHsNCiAgZHJhdzogZnVuY3Rpb24oY29udGV4dCwgc2l6ZSkgew0KICAgIHZhciByID0gTWF0aC5zcXJ0KHNpemUgLyA1KSAvIDI7DQogICAgY29udGV4dC5tb3ZlVG8oLTMgKiByLCAtcik7DQogICAgY29udGV4dC5saW5lVG8oLXIsIC1yKTsNCiAgICBjb250ZXh0LmxpbmVUbygtciwgLTMgKiByKTsNCiAgICBjb250ZXh0LmxpbmVUbyhyLCAtMyAqIHIpOw0KICAgIGNvbnRleHQubGluZVRvKHIsIC1yKTsNCiAgICBjb250ZXh0LmxpbmVUbygzICogciwgLXIpOw0KICAgIGNvbnRleHQubGluZVRvKDMgKiByLCByKTsNCiAgICBjb250ZXh0LmxpbmVUbyhyLCByKTsNCiAgICBjb250ZXh0LmxpbmVUbyhyLCAzICogcik7DQogICAgY29udGV4dC5saW5lVG8oLXIsIDMgKiByKTsNCiAgICBjb250ZXh0LmxpbmVUbygtciwgcik7DQogICAgY29udGV4dC5saW5lVG8oLTMgKiByLCByKTsNCiAgICBjb250ZXh0LmNsb3NlUGF0aCgpOw0KICB9DQp9Ow0KDQp2YXIgdGFuMzAgPSBNYXRoLnNxcnQoMSAvIDMpOw0KdmFyIHRhbjMwXzIgPSB0YW4zMCAqIDI7DQoNCnZhciBkaWFtb25kID0gew0KICBkcmF3OiBmdW5jdGlvbihjb250ZXh0LCBzaXplKSB7DQogICAgdmFyIHkgPSBNYXRoLnNxcnQoc2l6ZSAvIHRhbjMwXzIpLA0KICAgICAgICB4ID0geSAqIHRhbjMwOw0KICAgIGNvbnRleHQubW92ZVRvKDAsIC15KTsNCiAgICBjb250ZXh0LmxpbmVUbyh4LCAwKTsNCiAgICBjb250ZXh0LmxpbmVUbygwLCB5KTsNCiAgICBjb250ZXh0LmxpbmVUbygteCwgMCk7DQogICAgY29udGV4dC5jbG9zZVBhdGgoKTsNCiAgfQ0KfTsNCg0KdmFyIGthID0gMC44OTA4MTMwOTE1MjkyODUyMjgxMDsNCnZhciBrciA9IE1hdGguc2luKHBpIC8gMTApIC8gTWF0aC5zaW4oNyAqIHBpIC8gMTApOw0KdmFyIGt4ID0gTWF0aC5zaW4odGF1IC8gMTApICoga3I7DQp2YXIga3kgPSAtTWF0aC5jb3ModGF1IC8gMTApICoga3I7DQoNCnZhciBzdGFyID0gew0KICBkcmF3OiBmdW5jdGlvbihjb250ZXh0LCBzaXplKSB7DQogICAgdmFyIHIgPSBNYXRoLnNxcnQoc2l6ZSAqIGthKSwNCiAgICAgICAgeCA9IGt4ICogciwNCiAgICAgICAgeSA9IGt5ICogcjsNCiAgICBjb250ZXh0Lm1vdmVUbygwLCAtcik7DQogICAgY29udGV4dC5saW5lVG8oeCwgeSk7DQogICAgZm9yICh2YXIgaSA9IDE7IGkgPCA1OyArK2kpIHsNCiAgICAgIHZhciBhID0gdGF1ICogaSAvIDUsDQogICAgICAgICAgYyA9IE1hdGguY29zKGEpLA0KICAgICAgICAgIHMgPSBNYXRoLnNpbihhKTsNCiAgICAgIGNvbnRleHQubGluZVRvKHMgKiByLCAtYyAqIHIpOw0KICAgICAgY29udGV4dC5saW5lVG8oYyAqIHggLSBzICogeSwgcyAqIHggKyBjICogeSk7DQogICAgfQ0KICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7DQogIH0NCn07DQoNCnZhciBzcXVhcmUgPSB7DQogIGRyYXc6IGZ1bmN0aW9uKGNvbnRleHQsIHNpemUpIHsNCiAgICB2YXIgdyA9IE1hdGguc3FydChzaXplKSwNCiAgICAgICAgeCA9IC13IC8gMjsNCiAgICBjb250ZXh0LnJlY3QoeCwgeCwgdywgdyk7DQogIH0NCn07DQoNCnZhciBzcXJ0MyA9IE1hdGguc3FydCgzKTsNCg0KdmFyIHRyaWFuZ2xlID0gew0KICBkcmF3OiBmdW5jdGlvbihjb250ZXh0LCBzaXplKSB7DQogICAgdmFyIHkgPSAtTWF0aC5zcXJ0KHNpemUgLyAoc3FydDMgKiAzKSk7DQogICAgY29udGV4dC5tb3ZlVG8oMCwgeSAqIDIpOw0KICAgIGNvbnRleHQubGluZVRvKC1zcXJ0MyAqIHksIC15KTsNCiAgICBjb250ZXh0LmxpbmVUbyhzcXJ0MyAqIHksIC15KTsNCiAgICBjb250ZXh0LmNsb3NlUGF0aCgpOw0KICB9DQp9Ow0KDQp2YXIgYyA9IC0wLjU7DQp2YXIgcyA9IE1hdGguc3FydCgzKSAvIDI7DQp2YXIgayA9IDEgLyBNYXRoLnNxcnQoMTIpOw0KdmFyIGEgPSAoayAvIDIgKyAxKSAqIDM7DQoNCnZhciB3eWUgPSB7DQogIGRyYXc6IGZ1bmN0aW9uKGNvbnRleHQsIHNpemUpIHsNCiAgICB2YXIgciA9IE1hdGguc3FydChzaXplIC8gYSksDQogICAgICAgIHgwID0gciAvIDIsDQogICAgICAgIHkwID0gciAqIGssDQogICAgICAgIHgxID0geDAsDQogICAgICAgIHkxID0gciAqIGsgKyByLA0KICAgICAgICB4MiA9IC14MSwNCiAgICAgICAgeTIgPSB5MTsNCiAgICBjb250ZXh0Lm1vdmVUbyh4MCwgeTApOw0KICAgIGNvbnRleHQubGluZVRvKHgxLCB5MSk7DQogICAgY29udGV4dC5saW5lVG8oeDIsIHkyKTsNCiAgICBjb250ZXh0LmxpbmVUbyhjICogeDAgLSBzICogeTAsIHMgKiB4MCArIGMgKiB5MCk7DQogICAgY29udGV4dC5saW5lVG8oYyAqIHgxIC0gcyAqIHkxLCBzICogeDEgKyBjICogeTEpOw0KICAgIGNvbnRleHQubGluZVRvKGMgKiB4MiAtIHMgKiB5MiwgcyAqIHgyICsgYyAqIHkyKTsNCiAgICBjb250ZXh0LmxpbmVUbyhjICogeDAgKyBzICogeTAsIGMgKiB5MCAtIHMgKiB4MCk7DQogICAgY29udGV4dC5saW5lVG8oYyAqIHgxICsgcyAqIHkxLCBjICogeTEgLSBzICogeDEpOw0KICAgIGNvbnRleHQubGluZVRvKGMgKiB4MiArIHMgKiB5MiwgYyAqIHkyIC0gcyAqIHgyKTsNCiAgICBjb250ZXh0LmNsb3NlUGF0aCgpOw0KICB9DQp9Ow0KDQp2YXIgc3ltYm9scyA9IFsNCiAgY2lyY2xlLA0KICBjcm9zcywNCiAgZGlhbW9uZCwNCiAgc3F1YXJlLA0KICBzdGFyLA0KICB0cmlhbmdsZSwNCiAgd3llDQpdOw0KDQp2YXIgc3ltYm9sID0gZnVuY3Rpb24oKSB7DQogIHZhciB0eXBlID0gY29uc3RhbnQoY2lyY2xlKSwNCiAgICAgIHNpemUgPSBjb25zdGFudCg2NCksDQogICAgICBjb250ZXh0ID0gbnVsbDsNCg0KICBmdW5jdGlvbiBzeW1ib2woKSB7DQogICAgdmFyIGJ1ZmZlcjsNCiAgICBpZiAoIWNvbnRleHQpIGNvbnRleHQgPSBidWZmZXIgPSBkM1BhdGgucGF0aCgpOw0KICAgIHR5cGUuYXBwbHkodGhpcywgYXJndW1lbnRzKS5kcmF3KGNvbnRleHQsICtzaXplLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOw0KICAgIGlmIChidWZmZXIpIHJldHVybiBjb250ZXh0ID0gbnVsbCwgYnVmZmVyICsgIiIgfHwgbnVsbDsNCiAgfQ0KDQogIHN5bWJvbC50eXBlID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHR5cGUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudChfKSwgc3ltYm9sKSA6IHR5cGU7DQogIH07DQoNCiAgc3ltYm9sLnNpemUgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2l6ZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50KCtfKSwgc3ltYm9sKSA6IHNpemU7DQogIH07DQoNCiAgc3ltYm9sLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY29udGV4dCA9IF8gPT0gbnVsbCA/IG51bGwgOiBfLCBzeW1ib2wpIDogY29udGV4dDsNCiAgfTsNCg0KICByZXR1cm4gc3ltYm9sOw0KfTsNCg0KdmFyIG5vb3AgPSBmdW5jdGlvbigpIHt9Ow0KDQpmdW5jdGlvbiBwb2ludCh0aGF0LCB4LCB5KSB7DQogIHRoYXQuX2NvbnRleHQuYmV6aWVyQ3VydmVUbygNCiAgICAoMiAqIHRoYXQuX3gwICsgdGhhdC5feDEpIC8gMywNCiAgICAoMiAqIHRoYXQuX3kwICsgdGhhdC5feTEpIC8gMywNCiAgICAodGhhdC5feDAgKyAyICogdGhhdC5feDEpIC8gMywNCiAgICAodGhhdC5feTAgKyAyICogdGhhdC5feTEpIC8gMywNCiAgICAodGhhdC5feDAgKyA0ICogdGhhdC5feDEgKyB4KSAvIDYsDQogICAgKHRoYXQuX3kwICsgNCAqIHRoYXQuX3kxICsgeSkgLyA2DQogICk7DQp9DQoNCmZ1bmN0aW9uIEJhc2lzKGNvbnRleHQpIHsNCiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7DQp9DQoNCkJhc2lzLnByb3RvdHlwZSA9IHsNCiAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl9saW5lID0gMDsNCiAgfSwNCiAgYXJlYUVuZDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5fbGluZSA9IE5hTjsNCiAgfSwNCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl94MCA9IHRoaXMuX3gxID0NCiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gTmFOOw0KICAgIHRoaXMuX3BvaW50ID0gMDsNCiAgfSwNCiAgbGluZUVuZDogZnVuY3Rpb24oKSB7DQogICAgc3dpdGNoICh0aGlzLl9wb2ludCkgew0KICAgICAgY2FzZSAzOiBwb2ludCh0aGlzLCB0aGlzLl94MSwgdGhpcy5feTEpOyAvLyBwcm9jZWVkDQogICAgICBjYXNlIDI6IHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLCB0aGlzLl95MSk7IGJyZWFrOw0KICAgIH0NCiAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0aGlzLl9wb2ludCA9PT0gMSkpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7DQogICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lOw0KICB9LA0KICBwb2ludDogZnVuY3Rpb24oeCwgeSkgew0KICAgIHggPSAreCwgeSA9ICt5Ow0KICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsNCiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsgYnJlYWs7DQogICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgYnJlYWs7DQogICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgdGhpcy5fY29udGV4dC5saW5lVG8oKDUgKiB0aGlzLl94MCArIHRoaXMuX3gxKSAvIDYsICg1ICogdGhpcy5feTAgKyB0aGlzLl95MSkgLyA2KTsgLy8gcHJvY2VlZA0KICAgICAgZGVmYXVsdDogcG9pbnQodGhpcywgeCwgeSk7IGJyZWFrOw0KICAgIH0NCiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHg7DQogICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB5Ow0KICB9DQp9Ow0KDQp2YXIgYmFzaXMgPSBmdW5jdGlvbihjb250ZXh0KSB7DQogIHJldHVybiBuZXcgQmFzaXMoY29udGV4dCk7DQp9Ow0KDQpmdW5jdGlvbiBCYXNpc0Nsb3NlZChjb250ZXh0KSB7DQogIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0Ow0KfQ0KDQpCYXNpc0Nsb3NlZC5wcm90b3R5cGUgPSB7DQogIGFyZWFTdGFydDogbm9vcCwNCiAgYXJlYUVuZDogbm9vcCwNCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl94MCA9IHRoaXMuX3gxID0gdGhpcy5feDIgPSB0aGlzLl94MyA9IHRoaXMuX3g0ID0NCiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSB0aGlzLl95MyA9IHRoaXMuX3k0ID0gTmFOOw0KICAgIHRoaXMuX3BvaW50ID0gMDsNCiAgfSwNCiAgbGluZUVuZDogZnVuY3Rpb24oKSB7DQogICAgc3dpdGNoICh0aGlzLl9wb2ludCkgew0KICAgICAgY2FzZSAxOiB7DQogICAgICAgIHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLCB0aGlzLl95Mik7DQogICAgICAgIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7DQogICAgICAgIGJyZWFrOw0KICAgICAgfQ0KICAgICAgY2FzZSAyOiB7DQogICAgICAgIHRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MiArIDIgKiB0aGlzLl94MykgLyAzLCAodGhpcy5feTIgKyAyICogdGhpcy5feTMpIC8gMyk7DQogICAgICAgIHRoaXMuX2NvbnRleHQubGluZVRvKCh0aGlzLl94MyArIDIgKiB0aGlzLl94MikgLyAzLCAodGhpcy5feTMgKyAyICogdGhpcy5feTIpIC8gMyk7DQogICAgICAgIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7DQogICAgICAgIGJyZWFrOw0KICAgICAgfQ0KICAgICAgY2FzZSAzOiB7DQogICAgICAgIHRoaXMucG9pbnQodGhpcy5feDIsIHRoaXMuX3kyKTsNCiAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94MywgdGhpcy5feTMpOw0KICAgICAgICB0aGlzLnBvaW50KHRoaXMuX3g0LCB0aGlzLl95NCk7DQogICAgICAgIGJyZWFrOw0KICAgICAgfQ0KICAgIH0NCiAgfSwNCiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsNCiAgICB4ID0gK3gsIHkgPSAreTsNCiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7DQogICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5feDIgPSB4LCB0aGlzLl95MiA9IHk7IGJyZWFrOw0KICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IHRoaXMuX3gzID0geCwgdGhpcy5feTMgPSB5OyBicmVhazsNCiAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyB0aGlzLl94NCA9IHgsIHRoaXMuX3k0ID0geTsgdGhpcy5fY29udGV4dC5tb3ZlVG8oKHRoaXMuX3gwICsgNCAqIHRoaXMuX3gxICsgeCkgLyA2LCAodGhpcy5feTAgKyA0ICogdGhpcy5feTEgKyB5KSAvIDYpOyBicmVhazsNCiAgICAgIGRlZmF1bHQ6IHBvaW50KHRoaXMsIHgsIHkpOyBicmVhazsNCiAgICB9DQogICAgdGhpcy5feDAgPSB0aGlzLl94MSwgdGhpcy5feDEgPSB4Ow0KICAgIHRoaXMuX3kwID0gdGhpcy5feTEsIHRoaXMuX3kxID0geTsNCiAgfQ0KfTsNCg0KdmFyIGJhc2lzQ2xvc2VkID0gZnVuY3Rpb24oY29udGV4dCkgew0KICByZXR1cm4gbmV3IEJhc2lzQ2xvc2VkKGNvbnRleHQpOw0KfTsNCg0KZnVuY3Rpb24gQmFzaXNPcGVuKGNvbnRleHQpIHsNCiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7DQp9DQoNCkJhc2lzT3Blbi5wcm90b3R5cGUgPSB7DQogIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5fbGluZSA9IDA7DQogIH0sDQogIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuX2xpbmUgPSBOYU47DQogIH0sDQogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5feDAgPSB0aGlzLl94MSA9DQogICAgdGhpcy5feTAgPSB0aGlzLl95MSA9IE5hTjsNCiAgICB0aGlzLl9wb2ludCA9IDA7DQogIH0sDQogIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgew0KICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAzKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsNCiAgICB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7DQogIH0sDQogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7DQogICAgeCA9ICt4LCB5ID0gK3k7DQogICAgc3dpdGNoICh0aGlzLl9wb2ludCkgew0KICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IGJyZWFrOw0KICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IGJyZWFrOw0KICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IHZhciB4MCA9ICh0aGlzLl94MCArIDQgKiB0aGlzLl94MSArIHgpIC8gNiwgeTAgPSAodGhpcy5feTAgKyA0ICogdGhpcy5feTEgKyB5KSAvIDY7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4MCwgeTApIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeDAsIHkwKTsgYnJlYWs7DQogICAgICBjYXNlIDM6IHRoaXMuX3BvaW50ID0gNDsgLy8gcHJvY2VlZA0KICAgICAgZGVmYXVsdDogcG9pbnQodGhpcywgeCwgeSk7IGJyZWFrOw0KICAgIH0NCiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHg7DQogICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB5Ow0KICB9DQp9Ow0KDQp2YXIgYmFzaXNPcGVuID0gZnVuY3Rpb24oY29udGV4dCkgew0KICByZXR1cm4gbmV3IEJhc2lzT3Blbihjb250ZXh0KTsNCn07DQoNCmZ1bmN0aW9uIEJ1bmRsZShjb250ZXh0LCBiZXRhKSB7DQogIHRoaXMuX2Jhc2lzID0gbmV3IEJhc2lzKGNvbnRleHQpOw0KICB0aGlzLl9iZXRhID0gYmV0YTsNCn0NCg0KQnVuZGxlLnByb3RvdHlwZSA9IHsNCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl94ID0gW107DQogICAgdGhpcy5feSA9IFtdOw0KICAgIHRoaXMuX2Jhc2lzLmxpbmVTdGFydCgpOw0KICB9LA0KICBsaW5lRW5kOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgeCA9IHRoaXMuX3gsDQogICAgICAgIHkgPSB0aGlzLl95LA0KICAgICAgICBqID0geC5sZW5ndGggLSAxOw0KDQogICAgaWYgKGogPiAwKSB7DQogICAgICB2YXIgeDAgPSB4WzBdLA0KICAgICAgICAgIHkwID0geVswXSwNCiAgICAgICAgICBkeCA9IHhbal0gLSB4MCwNCiAgICAgICAgICBkeSA9IHlbal0gLSB5MCwNCiAgICAgICAgICBpID0gLTEsDQogICAgICAgICAgdDsNCg0KICAgICAgd2hpbGUgKCsraSA8PSBqKSB7DQogICAgICAgIHQgPSBpIC8gajsNCiAgICAgICAgdGhpcy5fYmFzaXMucG9pbnQoDQogICAgICAgICAgdGhpcy5fYmV0YSAqIHhbaV0gKyAoMSAtIHRoaXMuX2JldGEpICogKHgwICsgdCAqIGR4KSwNCiAgICAgICAgICB0aGlzLl9iZXRhICogeVtpXSArICgxIC0gdGhpcy5fYmV0YSkgKiAoeTAgKyB0ICogZHkpDQogICAgICAgICk7DQogICAgICB9DQogICAgfQ0KDQogICAgdGhpcy5feCA9IHRoaXMuX3kgPSBudWxsOw0KICAgIHRoaXMuX2Jhc2lzLmxpbmVFbmQoKTsNCiAgfSwNCiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsNCiAgICB0aGlzLl94LnB1c2goK3gpOw0KICAgIHRoaXMuX3kucHVzaCgreSk7DQogIH0NCn07DQoNCnZhciBidW5kbGUgPSAoKGZ1bmN0aW9uIGN1c3RvbShiZXRhKSB7DQoNCiAgZnVuY3Rpb24gYnVuZGxlKGNvbnRleHQpIHsNCiAgICByZXR1cm4gYmV0YSA9PT0gMSA/IG5ldyBCYXNpcyhjb250ZXh0KSA6IG5ldyBCdW5kbGUoY29udGV4dCwgYmV0YSk7DQogIH0NCg0KICBidW5kbGUuYmV0YSA9IGZ1bmN0aW9uKGJldGEpIHsNCiAgICByZXR1cm4gY3VzdG9tKCtiZXRhKTsNCiAgfTsNCg0KICByZXR1cm4gYnVuZGxlOw0KfSkpKDAuODUpOw0KDQpmdW5jdGlvbiBwb2ludCQxKHRoYXQsIHgsIHkpIHsNCiAgdGhhdC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKA0KICAgIHRoYXQuX3gxICsgdGhhdC5fayAqICh0aGF0Ll94MiAtIHRoYXQuX3gwKSwNCiAgICB0aGF0Ll95MSArIHRoYXQuX2sgKiAodGhhdC5feTIgLSB0aGF0Ll95MCksDQogICAgdGhhdC5feDIgKyB0aGF0Ll9rICogKHRoYXQuX3gxIC0geCksDQogICAgdGhhdC5feTIgKyB0aGF0Ll9rICogKHRoYXQuX3kxIC0geSksDQogICAgdGhhdC5feDIsDQogICAgdGhhdC5feTINCiAgKTsNCn0NCg0KZnVuY3Rpb24gQ2FyZGluYWwoY29udGV4dCwgdGVuc2lvbikgew0KICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsNCiAgdGhpcy5fayA9ICgxIC0gdGVuc2lvbikgLyA2Ow0KfQ0KDQpDYXJkaW5hbC5wcm90b3R5cGUgPSB7DQogIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5fbGluZSA9IDA7DQogIH0sDQogIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuX2xpbmUgPSBOYU47DQogIH0sDQogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMuX3gyID0NCiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSBOYU47DQogICAgdGhpcy5fcG9pbnQgPSAwOw0KICB9LA0KICBsaW5lRW5kOiBmdW5jdGlvbigpIHsNCiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7DQogICAgICBjYXNlIDI6IHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLCB0aGlzLl95Mik7IGJyZWFrOw0KICAgICAgY2FzZSAzOiBwb2ludCQxKHRoaXMsIHRoaXMuX3gxLCB0aGlzLl95MSk7IGJyZWFrOw0KICAgIH0NCiAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0aGlzLl9wb2ludCA9PT0gMSkpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7DQogICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lOw0KICB9LA0KICBwb2ludDogZnVuY3Rpb24oeCwgeSkgew0KICAgIHggPSAreCwgeSA9ICt5Ow0KICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsNCiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsgYnJlYWs7DQogICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgdGhpcy5feDEgPSB4LCB0aGlzLl95MSA9IHk7IGJyZWFrOw0KICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IC8vIHByb2NlZWQNCiAgICAgIGRlZmF1bHQ6IHBvaW50JDEodGhpcywgeCwgeSk7IGJyZWFrOw0KICAgIH0NCiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7DQogICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB0aGlzLl95MiwgdGhpcy5feTIgPSB5Ow0KICB9DQp9Ow0KDQp2YXIgY2FyZGluYWwgPSAoKGZ1bmN0aW9uIGN1c3RvbSh0ZW5zaW9uKSB7DQoNCiAgZnVuY3Rpb24gY2FyZGluYWwoY29udGV4dCkgew0KICAgIHJldHVybiBuZXcgQ2FyZGluYWwoY29udGV4dCwgdGVuc2lvbik7DQogIH0NCg0KICBjYXJkaW5hbC50ZW5zaW9uID0gZnVuY3Rpb24odGVuc2lvbikgew0KICAgIHJldHVybiBjdXN0b20oK3RlbnNpb24pOw0KICB9Ow0KDQogIHJldHVybiBjYXJkaW5hbDsNCn0pKSgwKTsNCg0KZnVuY3Rpb24gQ2FyZGluYWxDbG9zZWQoY29udGV4dCwgdGVuc2lvbikgew0KICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsNCiAgdGhpcy5fayA9ICgxIC0gdGVuc2lvbikgLyA2Ow0KfQ0KDQpDYXJkaW5hbENsb3NlZC5wcm90b3R5cGUgPSB7DQogIGFyZWFTdGFydDogbm9vcCwNCiAgYXJlYUVuZDogbm9vcCwNCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl94MCA9IHRoaXMuX3gxID0gdGhpcy5feDIgPSB0aGlzLl94MyA9IHRoaXMuX3g0ID0gdGhpcy5feDUgPQ0KICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSB0aGlzLl95MiA9IHRoaXMuX3kzID0gdGhpcy5feTQgPSB0aGlzLl95NSA9IE5hTjsNCiAgICB0aGlzLl9wb2ludCA9IDA7DQogIH0sDQogIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgew0KICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsNCiAgICAgIGNhc2UgMTogew0KICAgICAgICB0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94MywgdGhpcy5feTMpOw0KICAgICAgICB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOw0KICAgICAgICBicmVhazsNCiAgICAgIH0NCiAgICAgIGNhc2UgMjogew0KICAgICAgICB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MywgdGhpcy5feTMpOw0KICAgICAgICB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOw0KICAgICAgICBicmVhazsNCiAgICAgIH0NCiAgICAgIGNhc2UgMzogew0KICAgICAgICB0aGlzLnBvaW50KHRoaXMuX3gzLCB0aGlzLl95Myk7DQogICAgICAgIHRoaXMucG9pbnQodGhpcy5feDQsIHRoaXMuX3k0KTsNCiAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94NSwgdGhpcy5feTUpOw0KICAgICAgICBicmVhazsNCiAgICAgIH0NCiAgICB9DQogIH0sDQogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7DQogICAgeCA9ICt4LCB5ID0gK3k7DQogICAgc3dpdGNoICh0aGlzLl9wb2ludCkgew0KICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX3gzID0geCwgdGhpcy5feTMgPSB5OyBicmVhazsNCiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyB0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94NCA9IHgsIHRoaXMuX3k0ID0geSk7IGJyZWFrOw0KICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IHRoaXMuX3g1ID0geCwgdGhpcy5feTUgPSB5OyBicmVhazsNCiAgICAgIGRlZmF1bHQ6IHBvaW50JDEodGhpcywgeCwgeSk7IGJyZWFrOw0KICAgIH0NCiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7DQogICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB0aGlzLl95MiwgdGhpcy5feTIgPSB5Ow0KICB9DQp9Ow0KDQp2YXIgY2FyZGluYWxDbG9zZWQgPSAoKGZ1bmN0aW9uIGN1c3RvbSh0ZW5zaW9uKSB7DQoNCiAgZnVuY3Rpb24gY2FyZGluYWwoY29udGV4dCkgew0KICAgIHJldHVybiBuZXcgQ2FyZGluYWxDbG9zZWQoY29udGV4dCwgdGVuc2lvbik7DQogIH0NCg0KICBjYXJkaW5hbC50ZW5zaW9uID0gZnVuY3Rpb24odGVuc2lvbikgew0KICAgIHJldHVybiBjdXN0b20oK3RlbnNpb24pOw0KICB9Ow0KDQogIHJldHVybiBjYXJkaW5hbDsNCn0pKSgwKTsNCg0KZnVuY3Rpb24gQ2FyZGluYWxPcGVuKGNvbnRleHQsIHRlbnNpb24pIHsNCiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7DQogIHRoaXMuX2sgPSAoMSAtIHRlbnNpb24pIC8gNjsNCn0NCg0KQ2FyZGluYWxPcGVuLnByb3RvdHlwZSA9IHsNCiAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl9saW5lID0gMDsNCiAgfSwNCiAgYXJlYUVuZDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5fbGluZSA9IE5hTjsNCiAgfSwNCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl94MCA9IHRoaXMuX3gxID0gdGhpcy5feDIgPQ0KICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSB0aGlzLl95MiA9IE5hTjsNCiAgICB0aGlzLl9wb2ludCA9IDA7DQogIH0sDQogIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgew0KICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAzKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsNCiAgICB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7DQogIH0sDQogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7DQogICAgeCA9ICt4LCB5ID0gK3k7DQogICAgc3dpdGNoICh0aGlzLl9wb2ludCkgew0KICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IGJyZWFrOw0KICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IGJyZWFrOw0KICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MiwgdGhpcy5feTIpIDogdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsIHRoaXMuX3kyKTsgYnJlYWs7DQogICAgICBjYXNlIDM6IHRoaXMuX3BvaW50ID0gNDsgLy8gcHJvY2VlZA0KICAgICAgZGVmYXVsdDogcG9pbnQkMSh0aGlzLCB4LCB5KTsgYnJlYWs7DQogICAgfQ0KICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0gdGhpcy5feDIsIHRoaXMuX3gyID0geDsNCiAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHRoaXMuX3kyLCB0aGlzLl95MiA9IHk7DQogIH0NCn07DQoNCnZhciBjYXJkaW5hbE9wZW4gPSAoKGZ1bmN0aW9uIGN1c3RvbSh0ZW5zaW9uKSB7DQoNCiAgZnVuY3Rpb24gY2FyZGluYWwoY29udGV4dCkgew0KICAgIHJldHVybiBuZXcgQ2FyZGluYWxPcGVuKGNvbnRleHQsIHRlbnNpb24pOw0KICB9DQoNCiAgY2FyZGluYWwudGVuc2lvbiA9IGZ1bmN0aW9uKHRlbnNpb24pIHsNCiAgICByZXR1cm4gY3VzdG9tKCt0ZW5zaW9uKTsNCiAgfTsNCg0KICByZXR1cm4gY2FyZGluYWw7DQp9KSkoMCk7DQoNCmZ1bmN0aW9uIHBvaW50JDIodGhhdCwgeCwgeSkgew0KICB2YXIgeDEgPSB0aGF0Ll94MSwNCiAgICAgIHkxID0gdGhhdC5feTEsDQogICAgICB4MiA9IHRoYXQuX3gyLA0KICAgICAgeTIgPSB0aGF0Ll95MjsNCg0KICBpZiAodGhhdC5fbDAxX2EgPiBlcHNpbG9uKSB7DQogICAgdmFyIGEgPSAyICogdGhhdC5fbDAxXzJhICsgMyAqIHRoYXQuX2wwMV9hICogdGhhdC5fbDEyX2EgKyB0aGF0Ll9sMTJfMmEsDQogICAgICAgIG4gPSAzICogdGhhdC5fbDAxX2EgKiAodGhhdC5fbDAxX2EgKyB0aGF0Ll9sMTJfYSk7DQogICAgeDEgPSAoeDEgKiBhIC0gdGhhdC5feDAgKiB0aGF0Ll9sMTJfMmEgKyB0aGF0Ll94MiAqIHRoYXQuX2wwMV8yYSkgLyBuOw0KICAgIHkxID0gKHkxICogYSAtIHRoYXQuX3kwICogdGhhdC5fbDEyXzJhICsgdGhhdC5feTIgKiB0aGF0Ll9sMDFfMmEpIC8gbjsNCiAgfQ0KDQogIGlmICh0aGF0Ll9sMjNfYSA+IGVwc2lsb24pIHsNCiAgICB2YXIgYiA9IDIgKiB0aGF0Ll9sMjNfMmEgKyAzICogdGhhdC5fbDIzX2EgKiB0aGF0Ll9sMTJfYSArIHRoYXQuX2wxMl8yYSwNCiAgICAgICAgbSA9IDMgKiB0aGF0Ll9sMjNfYSAqICh0aGF0Ll9sMjNfYSArIHRoYXQuX2wxMl9hKTsNCiAgICB4MiA9ICh4MiAqIGIgKyB0aGF0Ll94MSAqIHRoYXQuX2wyM18yYSAtIHggKiB0aGF0Ll9sMTJfMmEpIC8gbTsNCiAgICB5MiA9ICh5MiAqIGIgKyB0aGF0Ll95MSAqIHRoYXQuX2wyM18yYSAtIHkgKiB0aGF0Ll9sMTJfMmEpIC8gbTsNCiAgfQ0KDQogIHRoYXQuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyh4MSwgeTEsIHgyLCB5MiwgdGhhdC5feDIsIHRoYXQuX3kyKTsNCn0NCg0KZnVuY3Rpb24gQ2F0bXVsbFJvbShjb250ZXh0LCBhbHBoYSkgew0KICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsNCiAgdGhpcy5fYWxwaGEgPSBhbHBoYTsNCn0NCg0KQ2F0bXVsbFJvbS5wcm90b3R5cGUgPSB7DQogIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5fbGluZSA9IDA7DQogIH0sDQogIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuX2xpbmUgPSBOYU47DQogIH0sDQogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMuX3gyID0NCiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSBOYU47DQogICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSA9IHRoaXMuX2wyM19hID0NCiAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEgPSB0aGlzLl9sMjNfMmEgPQ0KICAgIHRoaXMuX3BvaW50ID0gMDsNCiAgfSwNCiAgbGluZUVuZDogZnVuY3Rpb24oKSB7DQogICAgc3dpdGNoICh0aGlzLl9wb2ludCkgew0KICAgICAgY2FzZSAyOiB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MiwgdGhpcy5feTIpOyBicmVhazsNCiAgICAgIGNhc2UgMzogdGhpcy5wb2ludCh0aGlzLl94MiwgdGhpcy5feTIpOyBicmVhazsNCiAgICB9DQogICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOw0KICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTsNCiAgfSwNCiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsNCiAgICB4ID0gK3gsIHkgPSAreTsNCg0KICAgIGlmICh0aGlzLl9wb2ludCkgew0KICAgICAgdmFyIHgyMyA9IHRoaXMuX3gyIC0geCwNCiAgICAgICAgICB5MjMgPSB0aGlzLl95MiAtIHk7DQogICAgICB0aGlzLl9sMjNfYSA9IE1hdGguc3FydCh0aGlzLl9sMjNfMmEgPSBNYXRoLnBvdyh4MjMgKiB4MjMgKyB5MjMgKiB5MjMsIHRoaXMuX2FscGhhKSk7DQogICAgfQ0KDQogICAgc3dpdGNoICh0aGlzLl9wb2ludCkgew0KICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHgsIHkpOyBicmVhazsNCiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyBicmVhazsNCiAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyAvLyBwcm9jZWVkDQogICAgICBkZWZhdWx0OiBwb2ludCQyKHRoaXMsIHgsIHkpOyBicmVhazsNCiAgICB9DQoNCiAgICB0aGlzLl9sMDFfYSA9IHRoaXMuX2wxMl9hLCB0aGlzLl9sMTJfYSA9IHRoaXMuX2wyM19hOw0KICAgIHRoaXMuX2wwMV8yYSA9IHRoaXMuX2wxMl8yYSwgdGhpcy5fbDEyXzJhID0gdGhpcy5fbDIzXzJhOw0KICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0gdGhpcy5feDIsIHRoaXMuX3gyID0geDsNCiAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHRoaXMuX3kyLCB0aGlzLl95MiA9IHk7DQogIH0NCn07DQoNCnZhciBjYXRtdWxsUm9tID0gKChmdW5jdGlvbiBjdXN0b20oYWxwaGEpIHsNCg0KICBmdW5jdGlvbiBjYXRtdWxsUm9tKGNvbnRleHQpIHsNCiAgICByZXR1cm4gYWxwaGEgPyBuZXcgQ2F0bXVsbFJvbShjb250ZXh0LCBhbHBoYSkgOiBuZXcgQ2FyZGluYWwoY29udGV4dCwgMCk7DQogIH0NCg0KICBjYXRtdWxsUm9tLmFscGhhID0gZnVuY3Rpb24oYWxwaGEpIHsNCiAgICByZXR1cm4gY3VzdG9tKCthbHBoYSk7DQogIH07DQoNCiAgcmV0dXJuIGNhdG11bGxSb207DQp9KSkoMC41KTsNCg0KZnVuY3Rpb24gQ2F0bXVsbFJvbUNsb3NlZChjb250ZXh0LCBhbHBoYSkgew0KICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsNCiAgdGhpcy5fYWxwaGEgPSBhbHBoYTsNCn0NCg0KQ2F0bXVsbFJvbUNsb3NlZC5wcm90b3R5cGUgPSB7DQogIGFyZWFTdGFydDogbm9vcCwNCiAgYXJlYUVuZDogbm9vcCwNCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl94MCA9IHRoaXMuX3gxID0gdGhpcy5feDIgPSB0aGlzLl94MyA9IHRoaXMuX3g0ID0gdGhpcy5feDUgPQ0KICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSB0aGlzLl95MiA9IHRoaXMuX3kzID0gdGhpcy5feTQgPSB0aGlzLl95NSA9IE5hTjsNCiAgICB0aGlzLl9sMDFfYSA9IHRoaXMuX2wxMl9hID0gdGhpcy5fbDIzX2EgPQ0KICAgIHRoaXMuX2wwMV8yYSA9IHRoaXMuX2wxMl8yYSA9IHRoaXMuX2wyM18yYSA9DQogICAgdGhpcy5fcG9pbnQgPSAwOw0KICB9LA0KICBsaW5lRW5kOiBmdW5jdGlvbigpIHsNCiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7DQogICAgICBjYXNlIDE6IHsNCiAgICAgICAgdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsIHRoaXMuX3kzKTsNCiAgICAgICAgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsNCiAgICAgICAgYnJlYWs7DQogICAgICB9DQogICAgICBjYXNlIDI6IHsNCiAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsIHRoaXMuX3kzKTsNCiAgICAgICAgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsNCiAgICAgICAgYnJlYWs7DQogICAgICB9DQogICAgICBjYXNlIDM6IHsNCiAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94MywgdGhpcy5feTMpOw0KICAgICAgICB0aGlzLnBvaW50KHRoaXMuX3g0LCB0aGlzLl95NCk7DQogICAgICAgIHRoaXMucG9pbnQodGhpcy5feDUsIHRoaXMuX3k1KTsNCiAgICAgICAgYnJlYWs7DQogICAgICB9DQogICAgfQ0KICB9LA0KICBwb2ludDogZnVuY3Rpb24oeCwgeSkgew0KICAgIHggPSAreCwgeSA9ICt5Ow0KDQogICAgaWYgKHRoaXMuX3BvaW50KSB7DQogICAgICB2YXIgeDIzID0gdGhpcy5feDIgLSB4LA0KICAgICAgICAgIHkyMyA9IHRoaXMuX3kyIC0geTsNCiAgICAgIHRoaXMuX2wyM19hID0gTWF0aC5zcXJ0KHRoaXMuX2wyM18yYSA9IE1hdGgucG93KHgyMyAqIHgyMyArIHkyMyAqIHkyMywgdGhpcy5fYWxwaGEpKTsNCiAgICB9DQoNCiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7DQogICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5feDMgPSB4LCB0aGlzLl95MyA9IHk7IGJyZWFrOw0KICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0ID0geCwgdGhpcy5feTQgPSB5KTsgYnJlYWs7DQogICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgdGhpcy5feDUgPSB4LCB0aGlzLl95NSA9IHk7IGJyZWFrOw0KICAgICAgZGVmYXVsdDogcG9pbnQkMih0aGlzLCB4LCB5KTsgYnJlYWs7DQogICAgfQ0KDQogICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSwgdGhpcy5fbDEyX2EgPSB0aGlzLl9sMjNfYTsNCiAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEsIHRoaXMuX2wxMl8yYSA9IHRoaXMuX2wyM18yYTsNCiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7DQogICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB0aGlzLl95MiwgdGhpcy5feTIgPSB5Ow0KICB9DQp9Ow0KDQp2YXIgY2F0bXVsbFJvbUNsb3NlZCA9ICgoZnVuY3Rpb24gY3VzdG9tKGFscGhhKSB7DQoNCiAgZnVuY3Rpb24gY2F0bXVsbFJvbShjb250ZXh0KSB7DQogICAgcmV0dXJuIGFscGhhID8gbmV3IENhdG11bGxSb21DbG9zZWQoY29udGV4dCwgYWxwaGEpIDogbmV3IENhcmRpbmFsQ2xvc2VkKGNvbnRleHQsIDApOw0KICB9DQoNCiAgY2F0bXVsbFJvbS5hbHBoYSA9IGZ1bmN0aW9uKGFscGhhKSB7DQogICAgcmV0dXJuIGN1c3RvbSgrYWxwaGEpOw0KICB9Ow0KDQogIHJldHVybiBjYXRtdWxsUm9tOw0KfSkpKDAuNSk7DQoNCmZ1bmN0aW9uIENhdG11bGxSb21PcGVuKGNvbnRleHQsIGFscGhhKSB7DQogIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0Ow0KICB0aGlzLl9hbHBoYSA9IGFscGhhOw0KfQ0KDQpDYXRtdWxsUm9tT3Blbi5wcm90b3R5cGUgPSB7DQogIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5fbGluZSA9IDA7DQogIH0sDQogIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuX2xpbmUgPSBOYU47DQogIH0sDQogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMuX3gyID0NCiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSBOYU47DQogICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSA9IHRoaXMuX2wyM19hID0NCiAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEgPSB0aGlzLl9sMjNfMmEgPQ0KICAgIHRoaXMuX3BvaW50ID0gMDsNCiAgfSwNCiAgbGluZUVuZDogZnVuY3Rpb24oKSB7DQogICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDMpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOw0KICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTsNCiAgfSwNCiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsNCiAgICB4ID0gK3gsIHkgPSAreTsNCg0KICAgIGlmICh0aGlzLl9wb2ludCkgew0KICAgICAgdmFyIHgyMyA9IHRoaXMuX3gyIC0geCwNCiAgICAgICAgICB5MjMgPSB0aGlzLl95MiAtIHk7DQogICAgICB0aGlzLl9sMjNfYSA9IE1hdGguc3FydCh0aGlzLl9sMjNfMmEgPSBNYXRoLnBvdyh4MjMgKiB4MjMgKyB5MjMgKiB5MjMsIHRoaXMuX2FscGhhKSk7DQogICAgfQ0KDQogICAgc3dpdGNoICh0aGlzLl9wb2ludCkgew0KICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IGJyZWFrOw0KICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IGJyZWFrOw0KICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MiwgdGhpcy5feTIpIDogdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsIHRoaXMuX3kyKTsgYnJlYWs7DQogICAgICBjYXNlIDM6IHRoaXMuX3BvaW50ID0gNDsgLy8gcHJvY2VlZA0KICAgICAgZGVmYXVsdDogcG9pbnQkMih0aGlzLCB4LCB5KTsgYnJlYWs7DQogICAgfQ0KDQogICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSwgdGhpcy5fbDEyX2EgPSB0aGlzLl9sMjNfYTsNCiAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEsIHRoaXMuX2wxMl8yYSA9IHRoaXMuX2wyM18yYTsNCiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7DQogICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB0aGlzLl95MiwgdGhpcy5feTIgPSB5Ow0KICB9DQp9Ow0KDQp2YXIgY2F0bXVsbFJvbU9wZW4gPSAoKGZ1bmN0aW9uIGN1c3RvbShhbHBoYSkgew0KDQogIGZ1bmN0aW9uIGNhdG11bGxSb20oY29udGV4dCkgew0KICAgIHJldHVybiBhbHBoYSA/IG5ldyBDYXRtdWxsUm9tT3Blbihjb250ZXh0LCBhbHBoYSkgOiBuZXcgQ2FyZGluYWxPcGVuKGNvbnRleHQsIDApOw0KICB9DQoNCiAgY2F0bXVsbFJvbS5hbHBoYSA9IGZ1bmN0aW9uKGFscGhhKSB7DQogICAgcmV0dXJuIGN1c3RvbSgrYWxwaGEpOw0KICB9Ow0KDQogIHJldHVybiBjYXRtdWxsUm9tOw0KfSkpKDAuNSk7DQoNCmZ1bmN0aW9uIExpbmVhckNsb3NlZChjb250ZXh0KSB7DQogIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0Ow0KfQ0KDQpMaW5lYXJDbG9zZWQucHJvdG90eXBlID0gew0KICBhcmVhU3RhcnQ6IG5vb3AsDQogIGFyZWFFbmQ6IG5vb3AsDQogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5fcG9pbnQgPSAwOw0KICB9LA0KICBsaW5lRW5kOiBmdW5jdGlvbigpIHsNCiAgICBpZiAodGhpcy5fcG9pbnQpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7DQogIH0sDQogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7DQogICAgeCA9ICt4LCB5ID0gK3k7DQogICAgaWYgKHRoaXMuX3BvaW50KSB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KTsNCiAgICBlbHNlIHRoaXMuX3BvaW50ID0gMSwgdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7DQogIH0NCn07DQoNCnZhciBsaW5lYXJDbG9zZWQgPSBmdW5jdGlvbihjb250ZXh0KSB7DQogIHJldHVybiBuZXcgTGluZWFyQ2xvc2VkKGNvbnRleHQpOw0KfTsNCg0KZnVuY3Rpb24gc2lnbih4KSB7DQogIHJldHVybiB4IDwgMCA/IC0xIDogMTsNCn0NCg0KLy8gQ2FsY3VsYXRlIHRoZSBzbG9wZXMgb2YgdGhlIHRhbmdlbnRzIChIZXJtaXRlLXR5cGUgaW50ZXJwb2xhdGlvbikgYmFzZWQgb24NCi8vIHRoZSBmb2xsb3dpbmcgcGFwZXI6IFN0ZWZmZW4sIE0uIDE5OTAuIEEgU2ltcGxlIE1ldGhvZCBmb3IgTW9ub3RvbmljDQovLyBJbnRlcnBvbGF0aW9uIGluIE9uZSBEaW1lbnNpb24uIEFzdHJvbm9teSBhbmQgQXN0cm9waHlzaWNzLCBWb2wuIDIzOSwgTk8uDQovLyBOT1YoSUkpLCBQLiA0NDMsIDE5OTAuDQpmdW5jdGlvbiBzbG9wZTModGhhdCwgeDIsIHkyKSB7DQogIHZhciBoMCA9IHRoYXQuX3gxIC0gdGhhdC5feDAsDQogICAgICBoMSA9IHgyIC0gdGhhdC5feDEsDQogICAgICBzMCA9ICh0aGF0Ll95MSAtIHRoYXQuX3kwKSAvIChoMCB8fCBoMSA8IDAgJiYgLTApLA0KICAgICAgczEgPSAoeTIgLSB0aGF0Ll95MSkgLyAoaDEgfHwgaDAgPCAwICYmIC0wKSwNCiAgICAgIHAgPSAoczAgKiBoMSArIHMxICogaDApIC8gKGgwICsgaDEpOw0KICByZXR1cm4gKHNpZ24oczApICsgc2lnbihzMSkpICogTWF0aC5taW4oTWF0aC5hYnMoczApLCBNYXRoLmFicyhzMSksIDAuNSAqIE1hdGguYWJzKHApKSB8fCAwOw0KfQ0KDQovLyBDYWxjdWxhdGUgYSBvbmUtc2lkZWQgc2xvcGUuDQpmdW5jdGlvbiBzbG9wZTIodGhhdCwgdCkgew0KICB2YXIgaCA9IHRoYXQuX3gxIC0gdGhhdC5feDA7DQogIHJldHVybiBoID8gKDMgKiAodGhhdC5feTEgLSB0aGF0Ll95MCkgLyBoIC0gdCkgLyAyIDogdDsNCn0NCg0KLy8gQWNjb3JkaW5nIHRvIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0N1YmljX0hlcm1pdGVfc3BsaW5lI1JlcHJlc2VudGF0aW9ucw0KLy8gInlvdSBjYW4gZXhwcmVzcyBjdWJpYyBIZXJtaXRlIGludGVycG9sYXRpb24gaW4gdGVybXMgb2YgY3ViaWMgQsOpemllciBjdXJ2ZXMNCi8vIHdpdGggcmVzcGVjdCB0byB0aGUgZm91ciB2YWx1ZXMgcDAsIHAwICsgbTAgLyAzLCBwMSAtIG0xIC8gMywgcDEiLg0KZnVuY3Rpb24gcG9pbnQkMyh0aGF0LCB0MCwgdDEpIHsNCiAgdmFyIHgwID0gdGhhdC5feDAsDQogICAgICB5MCA9IHRoYXQuX3kwLA0KICAgICAgeDEgPSB0aGF0Ll94MSwNCiAgICAgIHkxID0gdGhhdC5feTEsDQogICAgICBkeCA9ICh4MSAtIHgwKSAvIDM7DQogIHRoYXQuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyh4MCArIGR4LCB5MCArIGR4ICogdDAsIHgxIC0gZHgsIHkxIC0gZHggKiB0MSwgeDEsIHkxKTsNCn0NCg0KZnVuY3Rpb24gTW9ub3RvbmVYKGNvbnRleHQpIHsNCiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7DQp9DQoNCk1vbm90b25lWC5wcm90b3R5cGUgPSB7DQogIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5fbGluZSA9IDA7DQogIH0sDQogIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuX2xpbmUgPSBOYU47DQogIH0sDQogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5feDAgPSB0aGlzLl94MSA9DQogICAgdGhpcy5feTAgPSB0aGlzLl95MSA9DQogICAgdGhpcy5fdDAgPSBOYU47DQogICAgdGhpcy5fcG9pbnQgPSAwOw0KICB9LA0KICBsaW5lRW5kOiBmdW5jdGlvbigpIHsNCiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7DQogICAgICBjYXNlIDI6IHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLCB0aGlzLl95MSk7IGJyZWFrOw0KICAgICAgY2FzZSAzOiBwb2ludCQzKHRoaXMsIHRoaXMuX3QwLCBzbG9wZTIodGhpcywgdGhpcy5fdDApKTsgYnJlYWs7DQogICAgfQ0KICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAxKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsNCiAgICB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7DQogIH0sDQogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7DQogICAgdmFyIHQxID0gTmFOOw0KDQogICAgeCA9ICt4LCB5ID0gK3k7DQogICAgaWYgKHggPT09IHRoaXMuX3gxICYmIHkgPT09IHRoaXMuX3kxKSByZXR1cm47IC8vIElnbm9yZSBjb2luY2lkZW50IHBvaW50cy4NCiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7DQogICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7IGJyZWFrOw0KICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IGJyZWFrOw0KICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IHBvaW50JDModGhpcywgc2xvcGUyKHRoaXMsIHQxID0gc2xvcGUzKHRoaXMsIHgsIHkpKSwgdDEpOyBicmVhazsNCiAgICAgIGRlZmF1bHQ6IHBvaW50JDModGhpcywgdGhpcy5fdDAsIHQxID0gc2xvcGUzKHRoaXMsIHgsIHkpKTsgYnJlYWs7DQogICAgfQ0KDQogICAgdGhpcy5feDAgPSB0aGlzLl94MSwgdGhpcy5feDEgPSB4Ow0KICAgIHRoaXMuX3kwID0gdGhpcy5feTEsIHRoaXMuX3kxID0geTsNCiAgICB0aGlzLl90MCA9IHQxOw0KICB9DQp9Ow0KDQpmdW5jdGlvbiBNb25vdG9uZVkoY29udGV4dCkgew0KICB0aGlzLl9jb250ZXh0ID0gbmV3IFJlZmxlY3RDb250ZXh0KGNvbnRleHQpOw0KfQ0KDQooTW9ub3RvbmVZLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTW9ub3RvbmVYLnByb3RvdHlwZSkpLnBvaW50ID0gZnVuY3Rpb24oeCwgeSkgew0KICBNb25vdG9uZVgucHJvdG90eXBlLnBvaW50LmNhbGwodGhpcywgeSwgeCk7DQp9Ow0KDQpmdW5jdGlvbiBSZWZsZWN0Q29udGV4dChjb250ZXh0KSB7DQogIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0Ow0KfQ0KDQpSZWZsZWN0Q29udGV4dC5wcm90b3R5cGUgPSB7DQogIG1vdmVUbzogZnVuY3Rpb24oeCwgeSkgeyB0aGlzLl9jb250ZXh0Lm1vdmVUbyh5LCB4KTsgfSwNCiAgY2xvc2VQYXRoOiBmdW5jdGlvbigpIHsgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsgfSwNCiAgbGluZVRvOiBmdW5jdGlvbih4LCB5KSB7IHRoaXMuX2NvbnRleHQubGluZVRvKHksIHgpOyB9LA0KICBiZXppZXJDdXJ2ZVRvOiBmdW5jdGlvbih4MSwgeTEsIHgyLCB5MiwgeCwgeSkgeyB0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8oeTEsIHgxLCB5MiwgeDIsIHksIHgpOyB9DQp9Ow0KDQpmdW5jdGlvbiBtb25vdG9uZVgoY29udGV4dCkgew0KICByZXR1cm4gbmV3IE1vbm90b25lWChjb250ZXh0KTsNCn0NCg0KZnVuY3Rpb24gbW9ub3RvbmVZKGNvbnRleHQpIHsNCiAgcmV0dXJuIG5ldyBNb25vdG9uZVkoY29udGV4dCk7DQp9DQoNCmZ1bmN0aW9uIE5hdHVyYWwoY29udGV4dCkgew0KICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsNCn0NCg0KTmF0dXJhbC5wcm90b3R5cGUgPSB7DQogIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5fbGluZSA9IDA7DQogIH0sDQogIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuX2xpbmUgPSBOYU47DQogIH0sDQogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5feCA9IFtdOw0KICAgIHRoaXMuX3kgPSBbXTsNCiAgfSwNCiAgbGluZUVuZDogZnVuY3Rpb24oKSB7DQogICAgdmFyIHggPSB0aGlzLl94LA0KICAgICAgICB5ID0gdGhpcy5feSwNCiAgICAgICAgbiA9IHgubGVuZ3RoOw0KDQogICAgaWYgKG4pIHsNCiAgICAgIHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4WzBdLCB5WzBdKSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHhbMF0sIHlbMF0pOw0KICAgICAgaWYgKG4gPT09IDIpIHsNCiAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8oeFsxXSwgeVsxXSk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICB2YXIgcHggPSBjb250cm9sUG9pbnRzKHgpLA0KICAgICAgICAgICAgcHkgPSBjb250cm9sUG9pbnRzKHkpOw0KICAgICAgICBmb3IgKHZhciBpMCA9IDAsIGkxID0gMTsgaTEgPCBuOyArK2kwLCArK2kxKSB7DQogICAgICAgICAgdGhpcy5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHB4WzBdW2kwXSwgcHlbMF1baTBdLCBweFsxXVtpMF0sIHB5WzFdW2kwXSwgeFtpMV0sIHlbaTFdKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCg0KICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIG4gPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOw0KICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTsNCiAgICB0aGlzLl94ID0gdGhpcy5feSA9IG51bGw7DQogIH0sDQogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7DQogICAgdGhpcy5feC5wdXNoKCt4KTsNCiAgICB0aGlzLl95LnB1c2goK3kpOw0KICB9DQp9Ow0KDQovLyBTZWUgaHR0cHM6Ly93d3cucGFydGljbGVpbmNlbGwuY29tLzIwMTIvYmV6aWVyLXNwbGluZXMvIGZvciBkZXJpdmF0aW9uLg0KZnVuY3Rpb24gY29udHJvbFBvaW50cyh4KSB7DQogIHZhciBpLA0KICAgICAgbiA9IHgubGVuZ3RoIC0gMSwNCiAgICAgIG0sDQogICAgICBhID0gbmV3IEFycmF5KG4pLA0KICAgICAgYiA9IG5ldyBBcnJheShuKSwNCiAgICAgIHIgPSBuZXcgQXJyYXkobik7DQogIGFbMF0gPSAwLCBiWzBdID0gMiwgclswXSA9IHhbMF0gKyAyICogeFsxXTsNCiAgZm9yIChpID0gMTsgaSA8IG4gLSAxOyArK2kpIGFbaV0gPSAxLCBiW2ldID0gNCwgcltpXSA9IDQgKiB4W2ldICsgMiAqIHhbaSArIDFdOw0KICBhW24gLSAxXSA9IDIsIGJbbiAtIDFdID0gNywgcltuIC0gMV0gPSA4ICogeFtuIC0gMV0gKyB4W25dOw0KICBmb3IgKGkgPSAxOyBpIDwgbjsgKytpKSBtID0gYVtpXSAvIGJbaSAtIDFdLCBiW2ldIC09IG0sIHJbaV0gLT0gbSAqIHJbaSAtIDFdOw0KICBhW24gLSAxXSA9IHJbbiAtIDFdIC8gYltuIC0gMV07DQogIGZvciAoaSA9IG4gLSAyOyBpID49IDA7IC0taSkgYVtpXSA9IChyW2ldIC0gYVtpICsgMV0pIC8gYltpXTsNCiAgYltuIC0gMV0gPSAoeFtuXSArIGFbbiAtIDFdKSAvIDI7DQogIGZvciAoaSA9IDA7IGkgPCBuIC0gMTsgKytpKSBiW2ldID0gMiAqIHhbaSArIDFdIC0gYVtpICsgMV07DQogIHJldHVybiBbYSwgYl07DQp9DQoNCnZhciBuYXR1cmFsID0gZnVuY3Rpb24oY29udGV4dCkgew0KICByZXR1cm4gbmV3IE5hdHVyYWwoY29udGV4dCk7DQp9Ow0KDQpmdW5jdGlvbiBTdGVwKGNvbnRleHQsIHQpIHsNCiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7DQogIHRoaXMuX3QgPSB0Ow0KfQ0KDQpTdGVwLnByb3RvdHlwZSA9IHsNCiAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl9saW5lID0gMDsNCiAgfSwNCiAgYXJlYUVuZDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5fbGluZSA9IE5hTjsNCiAgfSwNCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl94ID0gdGhpcy5feSA9IE5hTjsNCiAgICB0aGlzLl9wb2ludCA9IDA7DQogIH0sDQogIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgew0KICAgIGlmICgwIDwgdGhpcy5fdCAmJiB0aGlzLl90IDwgMSAmJiB0aGlzLl9wb2ludCA9PT0gMikgdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCwgdGhpcy5feSk7DQogICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOw0KICAgIGlmICh0aGlzLl9saW5lID49IDApIHRoaXMuX3QgPSAxIC0gdGhpcy5fdCwgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lOw0KICB9LA0KICBwb2ludDogZnVuY3Rpb24oeCwgeSkgew0KICAgIHggPSAreCwgeSA9ICt5Ow0KICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsNCiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsgYnJlYWs7DQogICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgLy8gcHJvY2VlZA0KICAgICAgZGVmYXVsdDogew0KICAgICAgICBpZiAodGhpcy5fdCA8PSAwKSB7DQogICAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCwgeSk7DQogICAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgdmFyIHgxID0gdGhpcy5feCAqICgxIC0gdGhpcy5fdCkgKyB4ICogdGhpcy5fdDsNCiAgICAgICAgICB0aGlzLl9jb250ZXh0LmxpbmVUbyh4MSwgdGhpcy5feSk7DQogICAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8oeDEsIHkpOw0KICAgICAgICB9DQogICAgICAgIGJyZWFrOw0KICAgICAgfQ0KICAgIH0NCiAgICB0aGlzLl94ID0geCwgdGhpcy5feSA9IHk7DQogIH0NCn07DQoNCnZhciBzdGVwID0gZnVuY3Rpb24oY29udGV4dCkgew0KICByZXR1cm4gbmV3IFN0ZXAoY29udGV4dCwgMC41KTsNCn07DQoNCmZ1bmN0aW9uIHN0ZXBCZWZvcmUoY29udGV4dCkgew0KICByZXR1cm4gbmV3IFN0ZXAoY29udGV4dCwgMCk7DQp9DQoNCmZ1bmN0aW9uIHN0ZXBBZnRlcihjb250ZXh0KSB7DQogIHJldHVybiBuZXcgU3RlcChjb250ZXh0LCAxKTsNCn0NCg0KdmFyIG5vbmUgPSBmdW5jdGlvbihzZXJpZXMsIG9yZGVyKSB7DQogIGlmICghKChuID0gc2VyaWVzLmxlbmd0aCkgPiAxKSkgcmV0dXJuOw0KICBmb3IgKHZhciBpID0gMSwgaiwgczAsIHMxID0gc2VyaWVzW29yZGVyWzBdXSwgbiwgbSA9IHMxLmxlbmd0aDsgaSA8IG47ICsraSkgew0KICAgIHMwID0gczEsIHMxID0gc2VyaWVzW29yZGVyW2ldXTsNCiAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB7DQogICAgICBzMVtqXVsxXSArPSBzMVtqXVswXSA9IGlzTmFOKHMwW2pdWzFdKSA/IHMwW2pdWzBdIDogczBbal1bMV07DQogICAgfQ0KICB9DQp9Ow0KDQp2YXIgbm9uZSQxID0gZnVuY3Rpb24oc2VyaWVzKSB7DQogIHZhciBuID0gc2VyaWVzLmxlbmd0aCwgbyA9IG5ldyBBcnJheShuKTsNCiAgd2hpbGUgKC0tbiA+PSAwKSBvW25dID0gbjsNCiAgcmV0dXJuIG87DQp9Ow0KDQpmdW5jdGlvbiBzdGFja1ZhbHVlKGQsIGtleSkgew0KICByZXR1cm4gZFtrZXldOw0KfQ0KDQp2YXIgc3RhY2sgPSBmdW5jdGlvbigpIHsNCiAgdmFyIGtleXMgPSBjb25zdGFudChbXSksDQogICAgICBvcmRlciA9IG5vbmUkMSwNCiAgICAgIG9mZnNldCA9IG5vbmUsDQogICAgICB2YWx1ZSA9IHN0YWNrVmFsdWU7DQoNCiAgZnVuY3Rpb24gc3RhY2soZGF0YSkgew0KICAgIHZhciBreiA9IGtleXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwNCiAgICAgICAgaSwNCiAgICAgICAgbSA9IGRhdGEubGVuZ3RoLA0KICAgICAgICBuID0ga3oubGVuZ3RoLA0KICAgICAgICBzeiA9IG5ldyBBcnJheShuKSwNCiAgICAgICAgb3o7DQoNCiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgICBmb3IgKHZhciBraSA9IGt6W2ldLCBzaSA9IHN6W2ldID0gbmV3IEFycmF5KG0pLCBqID0gMCwgc2lqOyBqIDwgbTsgKytqKSB7DQogICAgICAgIHNpW2pdID0gc2lqID0gWzAsICt2YWx1ZShkYXRhW2pdLCBraSwgaiwgZGF0YSldOw0KICAgICAgICBzaWouZGF0YSA9IGRhdGFbal07DQogICAgICB9DQogICAgICBzaS5rZXkgPSBraTsNCiAgICB9DQoNCiAgICBmb3IgKGkgPSAwLCBveiA9IG9yZGVyKHN6KTsgaSA8IG47ICsraSkgew0KICAgICAgc3pbb3pbaV1dLmluZGV4ID0gaTsNCiAgICB9DQoNCiAgICBvZmZzZXQoc3osIG96KTsNCiAgICByZXR1cm4gc3o7DQogIH0NCg0KICBzdGFjay5rZXlzID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGtleXMgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudChzbGljZS5jYWxsKF8pKSwgc3RhY2spIDoga2V5czsNCiAgfTsNCg0KICBzdGFjay52YWx1ZSA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50KCtfKSwgc3RhY2spIDogdmFsdWU7DQogIH07DQoNCiAgc3RhY2sub3JkZXIgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3JkZXIgPSBfID09IG51bGwgPyBub25lJDEgOiB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudChzbGljZS5jYWxsKF8pKSwgc3RhY2spIDogb3JkZXI7DQogIH07DQoNCiAgc3RhY2sub2Zmc2V0ID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9mZnNldCA9IF8gPT0gbnVsbCA/IG5vbmUgOiBfLCBzdGFjaykgOiBvZmZzZXQ7DQogIH07DQoNCiAgcmV0dXJuIHN0YWNrOw0KfTsNCg0KdmFyIGV4cGFuZCA9IGZ1bmN0aW9uKHNlcmllcywgb3JkZXIpIHsNCiAgaWYgKCEoKG4gPSBzZXJpZXMubGVuZ3RoKSA+IDApKSByZXR1cm47DQogIGZvciAodmFyIGksIG4sIGogPSAwLCBtID0gc2VyaWVzWzBdLmxlbmd0aCwgeTsgaiA8IG07ICsraikgew0KICAgIGZvciAoeSA9IGkgPSAwOyBpIDwgbjsgKytpKSB5ICs9IHNlcmllc1tpXVtqXVsxXSB8fCAwOw0KICAgIGlmICh5KSBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBzZXJpZXNbaV1bal1bMV0gLz0geTsNCiAgfQ0KICBub25lKHNlcmllcywgb3JkZXIpOw0KfTsNCg0KdmFyIGRpdmVyZ2luZyA9IGZ1bmN0aW9uKHNlcmllcywgb3JkZXIpIHsNCiAgaWYgKCEoKG4gPSBzZXJpZXMubGVuZ3RoKSA+IDEpKSByZXR1cm47DQogIGZvciAodmFyIGksIGogPSAwLCBkLCBkeSwgeXAsIHluLCBuLCBtID0gc2VyaWVzW29yZGVyWzBdXS5sZW5ndGg7IGogPCBtOyArK2opIHsNCiAgICBmb3IgKHlwID0geW4gPSAwLCBpID0gMDsgaSA8IG47ICsraSkgew0KICAgICAgaWYgKChkeSA9IChkID0gc2VyaWVzW29yZGVyW2ldXVtqXSlbMV0gLSBkWzBdKSA+PSAwKSB7DQogICAgICAgIGRbMF0gPSB5cCwgZFsxXSA9IHlwICs9IGR5Ow0KICAgICAgfSBlbHNlIGlmIChkeSA8IDApIHsNCiAgICAgICAgZFsxXSA9IHluLCBkWzBdID0geW4gKz0gZHk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBkWzBdID0geXA7DQogICAgICB9DQogICAgfQ0KICB9DQp9Ow0KDQp2YXIgc2lsaG91ZXR0ZSA9IGZ1bmN0aW9uKHNlcmllcywgb3JkZXIpIHsNCiAgaWYgKCEoKG4gPSBzZXJpZXMubGVuZ3RoKSA+IDApKSByZXR1cm47DQogIGZvciAodmFyIGogPSAwLCBzMCA9IHNlcmllc1tvcmRlclswXV0sIG4sIG0gPSBzMC5sZW5ndGg7IGogPCBtOyArK2opIHsNCiAgICBmb3IgKHZhciBpID0gMCwgeSA9IDA7IGkgPCBuOyArK2kpIHkgKz0gc2VyaWVzW2ldW2pdWzFdIHx8IDA7DQogICAgczBbal1bMV0gKz0gczBbal1bMF0gPSAteSAvIDI7DQogIH0NCiAgbm9uZShzZXJpZXMsIG9yZGVyKTsNCn07DQoNCnZhciB3aWdnbGUgPSBmdW5jdGlvbihzZXJpZXMsIG9yZGVyKSB7DQogIGlmICghKChuID0gc2VyaWVzLmxlbmd0aCkgPiAwKSB8fCAhKChtID0gKHMwID0gc2VyaWVzW29yZGVyWzBdXSkubGVuZ3RoKSA+IDApKSByZXR1cm47DQogIGZvciAodmFyIHkgPSAwLCBqID0gMSwgczAsIG0sIG47IGogPCBtOyArK2opIHsNCiAgICBmb3IgKHZhciBpID0gMCwgczEgPSAwLCBzMiA9IDA7IGkgPCBuOyArK2kpIHsNCiAgICAgIHZhciBzaSA9IHNlcmllc1tvcmRlcltpXV0sDQogICAgICAgICAgc2lqMCA9IHNpW2pdWzFdIHx8IDAsDQogICAgICAgICAgc2lqMSA9IHNpW2ogLSAxXVsxXSB8fCAwLA0KICAgICAgICAgIHMzID0gKHNpajAgLSBzaWoxKSAvIDI7DQogICAgICBmb3IgKHZhciBrID0gMDsgayA8IGk7ICsraykgew0KICAgICAgICB2YXIgc2sgPSBzZXJpZXNbb3JkZXJba11dLA0KICAgICAgICAgICAgc2tqMCA9IHNrW2pdWzFdIHx8IDAsDQogICAgICAgICAgICBza2oxID0gc2tbaiAtIDFdWzFdIHx8IDA7DQogICAgICAgIHMzICs9IHNrajAgLSBza2oxOw0KICAgICAgfQ0KICAgICAgczEgKz0gc2lqMCwgczIgKz0gczMgKiBzaWowOw0KICAgIH0NCiAgICBzMFtqIC0gMV1bMV0gKz0gczBbaiAtIDFdWzBdID0geTsNCiAgICBpZiAoczEpIHkgLT0gczIgLyBzMTsNCiAgfQ0KICBzMFtqIC0gMV1bMV0gKz0gczBbaiAtIDFdWzBdID0geTsNCiAgbm9uZShzZXJpZXMsIG9yZGVyKTsNCn07DQoNCnZhciBhc2NlbmRpbmcgPSBmdW5jdGlvbihzZXJpZXMpIHsNCiAgdmFyIHN1bXMgPSBzZXJpZXMubWFwKHN1bSk7DQogIHJldHVybiBub25lJDEoc2VyaWVzKS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIHN1bXNbYV0gLSBzdW1zW2JdOyB9KTsNCn07DQoNCmZ1bmN0aW9uIHN1bShzZXJpZXMpIHsNCiAgdmFyIHMgPSAwLCBpID0gLTEsIG4gPSBzZXJpZXMubGVuZ3RoLCB2Ow0KICB3aGlsZSAoKytpIDwgbikgaWYgKHYgPSArc2VyaWVzW2ldWzFdKSBzICs9IHY7DQogIHJldHVybiBzOw0KfQ0KDQp2YXIgZGVzY2VuZGluZyQxID0gZnVuY3Rpb24oc2VyaWVzKSB7DQogIHJldHVybiBhc2NlbmRpbmcoc2VyaWVzKS5yZXZlcnNlKCk7DQp9Ow0KDQp2YXIgaW5zaWRlT3V0ID0gZnVuY3Rpb24oc2VyaWVzKSB7DQogIHZhciBuID0gc2VyaWVzLmxlbmd0aCwNCiAgICAgIGksDQogICAgICBqLA0KICAgICAgc3VtcyA9IHNlcmllcy5tYXAoc3VtKSwNCiAgICAgIG9yZGVyID0gbm9uZSQxKHNlcmllcykuc29ydChmdW5jdGlvbihhLCBiKSB7IHJldHVybiBzdW1zW2JdIC0gc3Vtc1thXTsgfSksDQogICAgICB0b3AgPSAwLA0KICAgICAgYm90dG9tID0gMCwNCiAgICAgIHRvcHMgPSBbXSwNCiAgICAgIGJvdHRvbXMgPSBbXTsNCg0KICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgaiA9IG9yZGVyW2ldOw0KICAgIGlmICh0b3AgPCBib3R0b20pIHsNCiAgICAgIHRvcCArPSBzdW1zW2pdOw0KICAgICAgdG9wcy5wdXNoKGopOw0KICAgIH0gZWxzZSB7DQogICAgICBib3R0b20gKz0gc3Vtc1tqXTsNCiAgICAgIGJvdHRvbXMucHVzaChqKTsNCiAgICB9DQogIH0NCg0KICByZXR1cm4gYm90dG9tcy5yZXZlcnNlKCkuY29uY2F0KHRvcHMpOw0KfTsNCg0KdmFyIHJldmVyc2UgPSBmdW5jdGlvbihzZXJpZXMpIHsNCiAgcmV0dXJuIG5vbmUkMShzZXJpZXMpLnJldmVyc2UoKTsNCn07DQoNCmV4cG9ydHMuYXJjID0gYXJjOw0KZXhwb3J0cy5hcmVhID0gYXJlYTsNCmV4cG9ydHMubGluZSA9IGxpbmU7DQpleHBvcnRzLnBpZSA9IHBpZTsNCmV4cG9ydHMuYXJlYVJhZGlhbCA9IGFyZWFSYWRpYWw7DQpleHBvcnRzLnJhZGlhbEFyZWEgPSBhcmVhUmFkaWFsOw0KZXhwb3J0cy5saW5lUmFkaWFsID0gbGluZVJhZGlhbCQxOw0KZXhwb3J0cy5yYWRpYWxMaW5lID0gbGluZVJhZGlhbCQxOw0KZXhwb3J0cy5wb2ludFJhZGlhbCA9IHBvaW50UmFkaWFsOw0KZXhwb3J0cy5saW5rSG9yaXpvbnRhbCA9IGxpbmtIb3Jpem9udGFsOw0KZXhwb3J0cy5saW5rVmVydGljYWwgPSBsaW5rVmVydGljYWw7DQpleHBvcnRzLmxpbmtSYWRpYWwgPSBsaW5rUmFkaWFsOw0KZXhwb3J0cy5zeW1ib2wgPSBzeW1ib2w7DQpleHBvcnRzLnN5bWJvbHMgPSBzeW1ib2xzOw0KZXhwb3J0cy5zeW1ib2xDaXJjbGUgPSBjaXJjbGU7DQpleHBvcnRzLnN5bWJvbENyb3NzID0gY3Jvc3M7DQpleHBvcnRzLnN5bWJvbERpYW1vbmQgPSBkaWFtb25kOw0KZXhwb3J0cy5zeW1ib2xTcXVhcmUgPSBzcXVhcmU7DQpleHBvcnRzLnN5bWJvbFN0YXIgPSBzdGFyOw0KZXhwb3J0cy5zeW1ib2xUcmlhbmdsZSA9IHRyaWFuZ2xlOw0KZXhwb3J0cy5zeW1ib2xXeWUgPSB3eWU7DQpleHBvcnRzLmN1cnZlQmFzaXNDbG9zZWQgPSBiYXNpc0Nsb3NlZDsNCmV4cG9ydHMuY3VydmVCYXNpc09wZW4gPSBiYXNpc09wZW47DQpleHBvcnRzLmN1cnZlQmFzaXMgPSBiYXNpczsNCmV4cG9ydHMuY3VydmVCdW5kbGUgPSBidW5kbGU7DQpleHBvcnRzLmN1cnZlQ2FyZGluYWxDbG9zZWQgPSBjYXJkaW5hbENsb3NlZDsNCmV4cG9ydHMuY3VydmVDYXJkaW5hbE9wZW4gPSBjYXJkaW5hbE9wZW47DQpleHBvcnRzLmN1cnZlQ2FyZGluYWwgPSBjYXJkaW5hbDsNCmV4cG9ydHMuY3VydmVDYXRtdWxsUm9tQ2xvc2VkID0gY2F0bXVsbFJvbUNsb3NlZDsNCmV4cG9ydHMuY3VydmVDYXRtdWxsUm9tT3BlbiA9IGNhdG11bGxSb21PcGVuOw0KZXhwb3J0cy5jdXJ2ZUNhdG11bGxSb20gPSBjYXRtdWxsUm9tOw0KZXhwb3J0cy5jdXJ2ZUxpbmVhckNsb3NlZCA9IGxpbmVhckNsb3NlZDsNCmV4cG9ydHMuY3VydmVMaW5lYXIgPSBjdXJ2ZUxpbmVhcjsNCmV4cG9ydHMuY3VydmVNb25vdG9uZVggPSBtb25vdG9uZVg7DQpleHBvcnRzLmN1cnZlTW9ub3RvbmVZID0gbW9ub3RvbmVZOw0KZXhwb3J0cy5jdXJ2ZU5hdHVyYWwgPSBuYXR1cmFsOw0KZXhwb3J0cy5jdXJ2ZVN0ZXAgPSBzdGVwOw0KZXhwb3J0cy5jdXJ2ZVN0ZXBBZnRlciA9IHN0ZXBBZnRlcjsNCmV4cG9ydHMuY3VydmVTdGVwQmVmb3JlID0gc3RlcEJlZm9yZTsNCmV4cG9ydHMuc3RhY2sgPSBzdGFjazsNCmV4cG9ydHMuc3RhY2tPZmZzZXRFeHBhbmQgPSBleHBhbmQ7DQpleHBvcnRzLnN0YWNrT2Zmc2V0RGl2ZXJnaW5nID0gZGl2ZXJnaW5nOw0KZXhwb3J0cy5zdGFja09mZnNldE5vbmUgPSBub25lOw0KZXhwb3J0cy5zdGFja09mZnNldFNpbGhvdWV0dGUgPSBzaWxob3VldHRlOw0KZXhwb3J0cy5zdGFja09mZnNldFdpZ2dsZSA9IHdpZ2dsZTsNCmV4cG9ydHMuc3RhY2tPcmRlckFzY2VuZGluZyA9IGFzY2VuZGluZzsNCmV4cG9ydHMuc3RhY2tPcmRlckRlc2NlbmRpbmcgPSBkZXNjZW5kaW5nJDE7DQpleHBvcnRzLnN0YWNrT3JkZXJJbnNpZGVPdXQgPSBpbnNpZGVPdXQ7DQpleHBvcnRzLnN0YWNrT3JkZXJOb25lID0gbm9uZSQxOw0KZXhwb3J0cy5zdGFja09yZGVyUmV2ZXJzZSA9IHJldmVyc2U7DQoNCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7DQoNCn0pKSk7DQoNCn0seyJkMy1wYXRoIjoxMH1dLDE0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsNCi8vIGh0dHBzOi8vZDNqcy5vcmcvZDMtdGltZS1mb3JtYXQvIFZlcnNpb24gMi4wLjUuIENvcHlyaWdodCAyMDE3IE1pa2UgQm9zdG9jay4NCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7DQoJdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzLCByZXF1aXJlKCdkMy10aW1lJykpIDoNCgl0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJywgJ2QzLXRpbWUnXSwgZmFjdG9yeSkgOg0KCShmYWN0b3J5KChnbG9iYWwuZDMgPSBnbG9iYWwuZDMgfHwge30pLGdsb2JhbC5kMykpOw0KfSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMsZDNUaW1lKSB7ICd1c2Ugc3RyaWN0JzsNCg0KZnVuY3Rpb24gbG9jYWxEYXRlKGQpIHsNCiAgaWYgKDAgPD0gZC55ICYmIGQueSA8IDEwMCkgew0KICAgIHZhciBkYXRlID0gbmV3IERhdGUoLTEsIGQubSwgZC5kLCBkLkgsIGQuTSwgZC5TLCBkLkwpOw0KICAgIGRhdGUuc2V0RnVsbFllYXIoZC55KTsNCiAgICByZXR1cm4gZGF0ZTsNCiAgfQ0KICByZXR1cm4gbmV3IERhdGUoZC55LCBkLm0sIGQuZCwgZC5ILCBkLk0sIGQuUywgZC5MKTsNCn0NCg0KZnVuY3Rpb24gdXRjRGF0ZShkKSB7DQogIGlmICgwIDw9IGQueSAmJiBkLnkgPCAxMDApIHsNCiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDKC0xLCBkLm0sIGQuZCwgZC5ILCBkLk0sIGQuUywgZC5MKSk7DQogICAgZGF0ZS5zZXRVVENGdWxsWWVhcihkLnkpOw0KICAgIHJldHVybiBkYXRlOw0KICB9DQogIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyhkLnksIGQubSwgZC5kLCBkLkgsIGQuTSwgZC5TLCBkLkwpKTsNCn0NCg0KZnVuY3Rpb24gbmV3WWVhcih5KSB7DQogIHJldHVybiB7eTogeSwgbTogMCwgZDogMSwgSDogMCwgTTogMCwgUzogMCwgTDogMH07DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdExvY2FsZShsb2NhbGUpIHsNCiAgdmFyIGxvY2FsZV9kYXRlVGltZSA9IGxvY2FsZS5kYXRlVGltZSwNCiAgICAgIGxvY2FsZV9kYXRlID0gbG9jYWxlLmRhdGUsDQogICAgICBsb2NhbGVfdGltZSA9IGxvY2FsZS50aW1lLA0KICAgICAgbG9jYWxlX3BlcmlvZHMgPSBsb2NhbGUucGVyaW9kcywNCiAgICAgIGxvY2FsZV93ZWVrZGF5cyA9IGxvY2FsZS5kYXlzLA0KICAgICAgbG9jYWxlX3Nob3J0V2Vla2RheXMgPSBsb2NhbGUuc2hvcnREYXlzLA0KICAgICAgbG9jYWxlX21vbnRocyA9IGxvY2FsZS5tb250aHMsDQogICAgICBsb2NhbGVfc2hvcnRNb250aHMgPSBsb2NhbGUuc2hvcnRNb250aHM7DQoNCiAgdmFyIHBlcmlvZFJlID0gZm9ybWF0UmUobG9jYWxlX3BlcmlvZHMpLA0KICAgICAgcGVyaW9kTG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV9wZXJpb2RzKSwNCiAgICAgIHdlZWtkYXlSZSA9IGZvcm1hdFJlKGxvY2FsZV93ZWVrZGF5cyksDQogICAgICB3ZWVrZGF5TG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV93ZWVrZGF5cyksDQogICAgICBzaG9ydFdlZWtkYXlSZSA9IGZvcm1hdFJlKGxvY2FsZV9zaG9ydFdlZWtkYXlzKSwNCiAgICAgIHNob3J0V2Vla2RheUxvb2t1cCA9IGZvcm1hdExvb2t1cChsb2NhbGVfc2hvcnRXZWVrZGF5cyksDQogICAgICBtb250aFJlID0gZm9ybWF0UmUobG9jYWxlX21vbnRocyksDQogICAgICBtb250aExvb2t1cCA9IGZvcm1hdExvb2t1cChsb2NhbGVfbW9udGhzKSwNCiAgICAgIHNob3J0TW9udGhSZSA9IGZvcm1hdFJlKGxvY2FsZV9zaG9ydE1vbnRocyksDQogICAgICBzaG9ydE1vbnRoTG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV9zaG9ydE1vbnRocyk7DQoNCiAgdmFyIGZvcm1hdHMgPSB7DQogICAgImEiOiBmb3JtYXRTaG9ydFdlZWtkYXksDQogICAgIkEiOiBmb3JtYXRXZWVrZGF5LA0KICAgICJiIjogZm9ybWF0U2hvcnRNb250aCwNCiAgICAiQiI6IGZvcm1hdE1vbnRoLA0KICAgICJjIjogbnVsbCwNCiAgICAiZCI6IGZvcm1hdERheU9mTW9udGgsDQogICAgImUiOiBmb3JtYXREYXlPZk1vbnRoLA0KICAgICJIIjogZm9ybWF0SG91cjI0LA0KICAgICJJIjogZm9ybWF0SG91cjEyLA0KICAgICJqIjogZm9ybWF0RGF5T2ZZZWFyLA0KICAgICJMIjogZm9ybWF0TWlsbGlzZWNvbmRzLA0KICAgICJtIjogZm9ybWF0TW9udGhOdW1iZXIsDQogICAgIk0iOiBmb3JtYXRNaW51dGVzLA0KICAgICJwIjogZm9ybWF0UGVyaW9kLA0KICAgICJTIjogZm9ybWF0U2Vjb25kcywNCiAgICAiVSI6IGZvcm1hdFdlZWtOdW1iZXJTdW5kYXksDQogICAgInciOiBmb3JtYXRXZWVrZGF5TnVtYmVyLA0KICAgICJXIjogZm9ybWF0V2Vla051bWJlck1vbmRheSwNCiAgICAieCI6IG51bGwsDQogICAgIlgiOiBudWxsLA0KICAgICJ5IjogZm9ybWF0WWVhciwNCiAgICAiWSI6IGZvcm1hdEZ1bGxZZWFyLA0KICAgICJaIjogZm9ybWF0Wm9uZSwNCiAgICAiJSI6IGZvcm1hdExpdGVyYWxQZXJjZW50DQogIH07DQoNCiAgdmFyIHV0Y0Zvcm1hdHMgPSB7DQogICAgImEiOiBmb3JtYXRVVENTaG9ydFdlZWtkYXksDQogICAgIkEiOiBmb3JtYXRVVENXZWVrZGF5LA0KICAgICJiIjogZm9ybWF0VVRDU2hvcnRNb250aCwNCiAgICAiQiI6IGZvcm1hdFVUQ01vbnRoLA0KICAgICJjIjogbnVsbCwNCiAgICAiZCI6IGZvcm1hdFVUQ0RheU9mTW9udGgsDQogICAgImUiOiBmb3JtYXRVVENEYXlPZk1vbnRoLA0KICAgICJIIjogZm9ybWF0VVRDSG91cjI0LA0KICAgICJJIjogZm9ybWF0VVRDSG91cjEyLA0KICAgICJqIjogZm9ybWF0VVRDRGF5T2ZZZWFyLA0KICAgICJMIjogZm9ybWF0VVRDTWlsbGlzZWNvbmRzLA0KICAgICJtIjogZm9ybWF0VVRDTW9udGhOdW1iZXIsDQogICAgIk0iOiBmb3JtYXRVVENNaW51dGVzLA0KICAgICJwIjogZm9ybWF0VVRDUGVyaW9kLA0KICAgICJTIjogZm9ybWF0VVRDU2Vjb25kcywNCiAgICAiVSI6IGZvcm1hdFVUQ1dlZWtOdW1iZXJTdW5kYXksDQogICAgInciOiBmb3JtYXRVVENXZWVrZGF5TnVtYmVyLA0KICAgICJXIjogZm9ybWF0VVRDV2Vla051bWJlck1vbmRheSwNCiAgICAieCI6IG51bGwsDQogICAgIlgiOiBudWxsLA0KICAgICJ5IjogZm9ybWF0VVRDWWVhciwNCiAgICAiWSI6IGZvcm1hdFVUQ0Z1bGxZZWFyLA0KICAgICJaIjogZm9ybWF0VVRDWm9uZSwNCiAgICAiJSI6IGZvcm1hdExpdGVyYWxQZXJjZW50DQogIH07DQoNCiAgdmFyIHBhcnNlcyA9IHsNCiAgICAiYSI6IHBhcnNlU2hvcnRXZWVrZGF5LA0KICAgICJBIjogcGFyc2VXZWVrZGF5LA0KICAgICJiIjogcGFyc2VTaG9ydE1vbnRoLA0KICAgICJCIjogcGFyc2VNb250aCwNCiAgICAiYyI6IHBhcnNlTG9jYWxlRGF0ZVRpbWUsDQogICAgImQiOiBwYXJzZURheU9mTW9udGgsDQogICAgImUiOiBwYXJzZURheU9mTW9udGgsDQogICAgIkgiOiBwYXJzZUhvdXIyNCwNCiAgICAiSSI6IHBhcnNlSG91cjI0LA0KICAgICJqIjogcGFyc2VEYXlPZlllYXIsDQogICAgIkwiOiBwYXJzZU1pbGxpc2Vjb25kcywNCiAgICAibSI6IHBhcnNlTW9udGhOdW1iZXIsDQogICAgIk0iOiBwYXJzZU1pbnV0ZXMsDQogICAgInAiOiBwYXJzZVBlcmlvZCwNCiAgICAiUyI6IHBhcnNlU2Vjb25kcywNCiAgICAiVSI6IHBhcnNlV2Vla051bWJlclN1bmRheSwNCiAgICAidyI6IHBhcnNlV2Vla2RheU51bWJlciwNCiAgICAiVyI6IHBhcnNlV2Vla051bWJlck1vbmRheSwNCiAgICAieCI6IHBhcnNlTG9jYWxlRGF0ZSwNCiAgICAiWCI6IHBhcnNlTG9jYWxlVGltZSwNCiAgICAieSI6IHBhcnNlWWVhciwNCiAgICAiWSI6IHBhcnNlRnVsbFllYXIsDQogICAgIloiOiBwYXJzZVpvbmUsDQogICAgIiUiOiBwYXJzZUxpdGVyYWxQZXJjZW50DQogIH07DQoNCiAgLy8gVGhlc2UgcmVjdXJzaXZlIGRpcmVjdGl2ZSBkZWZpbml0aW9ucyBtdXN0IGJlIGRlZmVycmVkLg0KICBmb3JtYXRzLnggPSBuZXdGb3JtYXQobG9jYWxlX2RhdGUsIGZvcm1hdHMpOw0KICBmb3JtYXRzLlggPSBuZXdGb3JtYXQobG9jYWxlX3RpbWUsIGZvcm1hdHMpOw0KICBmb3JtYXRzLmMgPSBuZXdGb3JtYXQobG9jYWxlX2RhdGVUaW1lLCBmb3JtYXRzKTsNCiAgdXRjRm9ybWF0cy54ID0gbmV3Rm9ybWF0KGxvY2FsZV9kYXRlLCB1dGNGb3JtYXRzKTsNCiAgdXRjRm9ybWF0cy5YID0gbmV3Rm9ybWF0KGxvY2FsZV90aW1lLCB1dGNGb3JtYXRzKTsNCiAgdXRjRm9ybWF0cy5jID0gbmV3Rm9ybWF0KGxvY2FsZV9kYXRlVGltZSwgdXRjRm9ybWF0cyk7DQoNCiAgZnVuY3Rpb24gbmV3Rm9ybWF0KHNwZWNpZmllciwgZm9ybWF0cykgew0KICAgIHJldHVybiBmdW5jdGlvbihkYXRlKSB7DQogICAgICB2YXIgc3RyaW5nID0gW10sDQogICAgICAgICAgaSA9IC0xLA0KICAgICAgICAgIGogPSAwLA0KICAgICAgICAgIG4gPSBzcGVjaWZpZXIubGVuZ3RoLA0KICAgICAgICAgIGMsDQogICAgICAgICAgcGFkLA0KICAgICAgICAgIGZvcm1hdDsNCg0KICAgICAgaWYgKCEoZGF0ZSBpbnN0YW5jZW9mIERhdGUpKSBkYXRlID0gbmV3IERhdGUoK2RhdGUpOw0KDQogICAgICB3aGlsZSAoKytpIDwgbikgew0KICAgICAgICBpZiAoc3BlY2lmaWVyLmNoYXJDb2RlQXQoaSkgPT09IDM3KSB7DQogICAgICAgICAgc3RyaW5nLnB1c2goc3BlY2lmaWVyLnNsaWNlKGosIGkpKTsNCiAgICAgICAgICBpZiAoKHBhZCA9IHBhZHNbYyA9IHNwZWNpZmllci5jaGFyQXQoKytpKV0pICE9IG51bGwpIGMgPSBzcGVjaWZpZXIuY2hhckF0KCsraSk7DQogICAgICAgICAgZWxzZSBwYWQgPSBjID09PSAiZSIgPyAiICIgOiAiMCI7DQogICAgICAgICAgaWYgKGZvcm1hdCA9IGZvcm1hdHNbY10pIGMgPSBmb3JtYXQoZGF0ZSwgcGFkKTsNCiAgICAgICAgICBzdHJpbmcucHVzaChjKTsNCiAgICAgICAgICBqID0gaSArIDE7DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgc3RyaW5nLnB1c2goc3BlY2lmaWVyLnNsaWNlKGosIGkpKTsNCiAgICAgIHJldHVybiBzdHJpbmcuam9pbigiIik7DQogICAgfTsNCiAgfQ0KDQogIGZ1bmN0aW9uIG5ld1BhcnNlKHNwZWNpZmllciwgbmV3RGF0ZSkgew0KICAgIHJldHVybiBmdW5jdGlvbihzdHJpbmcpIHsNCiAgICAgIHZhciBkID0gbmV3WWVhcigxOTAwKSwNCiAgICAgICAgICBpID0gcGFyc2VTcGVjaWZpZXIoZCwgc3BlY2lmaWVyLCBzdHJpbmcgKz0gIiIsIDApOw0KICAgICAgaWYgKGkgIT0gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIG51bGw7DQoNCiAgICAgIC8vIFRoZSBhbS1wbSBmbGFnIGlzIDAgZm9yIEFNLCBhbmQgMSBmb3IgUE0uDQogICAgICBpZiAoInAiIGluIGQpIGQuSCA9IGQuSCAlIDEyICsgZC5wICogMTI7DQoNCiAgICAgIC8vIENvbnZlcnQgZGF5LW9mLXdlZWsgYW5kIHdlZWstb2YteWVhciB0byBkYXktb2YteWVhci4NCiAgICAgIGlmICgiVyIgaW4gZCB8fCAiVSIgaW4gZCkgew0KICAgICAgICBpZiAoISgidyIgaW4gZCkpIGQudyA9ICJXIiBpbiBkID8gMSA6IDA7DQogICAgICAgIHZhciBkYXkgPSAiWiIgaW4gZCA/IHV0Y0RhdGUobmV3WWVhcihkLnkpKS5nZXRVVENEYXkoKSA6IG5ld0RhdGUobmV3WWVhcihkLnkpKS5nZXREYXkoKTsNCiAgICAgICAgZC5tID0gMDsNCiAgICAgICAgZC5kID0gIlciIGluIGQgPyAoZC53ICsgNikgJSA3ICsgZC5XICogNyAtIChkYXkgKyA1KSAlIDcgOiBkLncgKyBkLlUgKiA3IC0gKGRheSArIDYpICUgNzsNCiAgICAgIH0NCg0KICAgICAgLy8gSWYgYSB0aW1lIHpvbmUgaXMgc3BlY2lmaWVkLCBhbGwgZmllbGRzIGFyZSBpbnRlcnByZXRlZCBhcyBVVEMgYW5kIHRoZW4NCiAgICAgIC8vIG9mZnNldCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCB0aW1lIHpvbmUuDQogICAgICBpZiAoIloiIGluIGQpIHsNCiAgICAgICAgZC5IICs9IGQuWiAvIDEwMCB8IDA7DQogICAgICAgIGQuTSArPSBkLlogJSAxMDA7DQogICAgICAgIHJldHVybiB1dGNEYXRlKGQpOw0KICAgICAgfQ0KDQogICAgICAvLyBPdGhlcndpc2UsIGFsbCBmaWVsZHMgYXJlIGluIGxvY2FsIHRpbWUuDQogICAgICByZXR1cm4gbmV3RGF0ZShkKTsNCiAgICB9Ow0KICB9DQoNCiAgZnVuY3Rpb24gcGFyc2VTcGVjaWZpZXIoZCwgc3BlY2lmaWVyLCBzdHJpbmcsIGopIHsNCiAgICB2YXIgaSA9IDAsDQogICAgICAgIG4gPSBzcGVjaWZpZXIubGVuZ3RoLA0KICAgICAgICBtID0gc3RyaW5nLmxlbmd0aCwNCiAgICAgICAgYywNCiAgICAgICAgcGFyc2U7DQoNCiAgICB3aGlsZSAoaSA8IG4pIHsNCiAgICAgIGlmIChqID49IG0pIHJldHVybiAtMTsNCiAgICAgIGMgPSBzcGVjaWZpZXIuY2hhckNvZGVBdChpKyspOw0KICAgICAgaWYgKGMgPT09IDM3KSB7DQogICAgICAgIGMgPSBzcGVjaWZpZXIuY2hhckF0KGkrKyk7DQogICAgICAgIHBhcnNlID0gcGFyc2VzW2MgaW4gcGFkcyA/IHNwZWNpZmllci5jaGFyQXQoaSsrKSA6IGNdOw0KICAgICAgICBpZiAoIXBhcnNlIHx8ICgoaiA9IHBhcnNlKGQsIHN0cmluZywgaikpIDwgMCkpIHJldHVybiAtMTsNCiAgICAgIH0gZWxzZSBpZiAoYyAhPSBzdHJpbmcuY2hhckNvZGVBdChqKyspKSB7DQogICAgICAgIHJldHVybiAtMTsNCiAgICAgIH0NCiAgICB9DQoNCiAgICByZXR1cm4gajsNCiAgfQ0KDQogIGZ1bmN0aW9uIHBhcnNlUGVyaW9kKGQsIHN0cmluZywgaSkgew0KICAgIHZhciBuID0gcGVyaW9kUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpOw0KICAgIHJldHVybiBuID8gKGQucCA9IHBlcmlvZExvb2t1cFtuWzBdLnRvTG93ZXJDYXNlKCldLCBpICsgblswXS5sZW5ndGgpIDogLTE7DQogIH0NCg0KICBmdW5jdGlvbiBwYXJzZVNob3J0V2Vla2RheShkLCBzdHJpbmcsIGkpIHsNCiAgICB2YXIgbiA9IHNob3J0V2Vla2RheVJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTsNCiAgICByZXR1cm4gbiA/IChkLncgPSBzaG9ydFdlZWtkYXlMb29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOw0KICB9DQoNCiAgZnVuY3Rpb24gcGFyc2VXZWVrZGF5KGQsIHN0cmluZywgaSkgew0KICAgIHZhciBuID0gd2Vla2RheVJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTsNCiAgICByZXR1cm4gbiA/IChkLncgPSB3ZWVrZGF5TG9va3VwW25bMF0udG9Mb3dlckNhc2UoKV0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHBhcnNlU2hvcnRNb250aChkLCBzdHJpbmcsIGkpIHsNCiAgICB2YXIgbiA9IHNob3J0TW9udGhSZS5leGVjKHN0cmluZy5zbGljZShpKSk7DQogICAgcmV0dXJuIG4gPyAoZC5tID0gc2hvcnRNb250aExvb2t1cFtuWzBdLnRvTG93ZXJDYXNlKCldLCBpICsgblswXS5sZW5ndGgpIDogLTE7DQogIH0NCg0KICBmdW5jdGlvbiBwYXJzZU1vbnRoKGQsIHN0cmluZywgaSkgew0KICAgIHZhciBuID0gbW9udGhSZS5leGVjKHN0cmluZy5zbGljZShpKSk7DQogICAgcmV0dXJuIG4gPyAoZC5tID0gbW9udGhMb29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOw0KICB9DQoNCiAgZnVuY3Rpb24gcGFyc2VMb2NhbGVEYXRlVGltZShkLCBzdHJpbmcsIGkpIHsNCiAgICByZXR1cm4gcGFyc2VTcGVjaWZpZXIoZCwgbG9jYWxlX2RhdGVUaW1lLCBzdHJpbmcsIGkpOw0KICB9DQoNCiAgZnVuY3Rpb24gcGFyc2VMb2NhbGVEYXRlKGQsIHN0cmluZywgaSkgew0KICAgIHJldHVybiBwYXJzZVNwZWNpZmllcihkLCBsb2NhbGVfZGF0ZSwgc3RyaW5nLCBpKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHBhcnNlTG9jYWxlVGltZShkLCBzdHJpbmcsIGkpIHsNCiAgICByZXR1cm4gcGFyc2VTcGVjaWZpZXIoZCwgbG9jYWxlX3RpbWUsIHN0cmluZywgaSk7DQogIH0NCg0KICBmdW5jdGlvbiBmb3JtYXRTaG9ydFdlZWtkYXkoZCkgew0KICAgIHJldHVybiBsb2NhbGVfc2hvcnRXZWVrZGF5c1tkLmdldERheSgpXTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGZvcm1hdFdlZWtkYXkoZCkgew0KICAgIHJldHVybiBsb2NhbGVfd2Vla2RheXNbZC5nZXREYXkoKV07DQogIH0NCg0KICBmdW5jdGlvbiBmb3JtYXRTaG9ydE1vbnRoKGQpIHsNCiAgICByZXR1cm4gbG9jYWxlX3Nob3J0TW9udGhzW2QuZ2V0TW9udGgoKV07DQogIH0NCg0KICBmdW5jdGlvbiBmb3JtYXRNb250aChkKSB7DQogICAgcmV0dXJuIGxvY2FsZV9tb250aHNbZC5nZXRNb250aCgpXTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGZvcm1hdFBlcmlvZChkKSB7DQogICAgcmV0dXJuIGxvY2FsZV9wZXJpb2RzWysoZC5nZXRIb3VycygpID49IDEyKV07DQogIH0NCg0KICBmdW5jdGlvbiBmb3JtYXRVVENTaG9ydFdlZWtkYXkoZCkgew0KICAgIHJldHVybiBsb2NhbGVfc2hvcnRXZWVrZGF5c1tkLmdldFVUQ0RheSgpXTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGZvcm1hdFVUQ1dlZWtkYXkoZCkgew0KICAgIHJldHVybiBsb2NhbGVfd2Vla2RheXNbZC5nZXRVVENEYXkoKV07DQogIH0NCg0KICBmdW5jdGlvbiBmb3JtYXRVVENTaG9ydE1vbnRoKGQpIHsNCiAgICByZXR1cm4gbG9jYWxlX3Nob3J0TW9udGhzW2QuZ2V0VVRDTW9udGgoKV07DQogIH0NCg0KICBmdW5jdGlvbiBmb3JtYXRVVENNb250aChkKSB7DQogICAgcmV0dXJuIGxvY2FsZV9tb250aHNbZC5nZXRVVENNb250aCgpXTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGZvcm1hdFVUQ1BlcmlvZChkKSB7DQogICAgcmV0dXJuIGxvY2FsZV9wZXJpb2RzWysoZC5nZXRVVENIb3VycygpID49IDEyKV07DQogIH0NCg0KICByZXR1cm4gew0KICAgIGZvcm1hdDogZnVuY3Rpb24oc3BlY2lmaWVyKSB7DQogICAgICB2YXIgZiA9IG5ld0Zvcm1hdChzcGVjaWZpZXIgKz0gIiIsIGZvcm1hdHMpOw0KICAgICAgZi50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gc3BlY2lmaWVyOyB9Ow0KICAgICAgcmV0dXJuIGY7DQogICAgfSwNCiAgICBwYXJzZTogZnVuY3Rpb24oc3BlY2lmaWVyKSB7DQogICAgICB2YXIgcCA9IG5ld1BhcnNlKHNwZWNpZmllciArPSAiIiwgbG9jYWxEYXRlKTsNCiAgICAgIHAudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHNwZWNpZmllcjsgfTsNCiAgICAgIHJldHVybiBwOw0KICAgIH0sDQogICAgdXRjRm9ybWF0OiBmdW5jdGlvbihzcGVjaWZpZXIpIHsNCiAgICAgIHZhciBmID0gbmV3Rm9ybWF0KHNwZWNpZmllciArPSAiIiwgdXRjRm9ybWF0cyk7DQogICAgICBmLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBzcGVjaWZpZXI7IH07DQogICAgICByZXR1cm4gZjsNCiAgICB9LA0KICAgIHV0Y1BhcnNlOiBmdW5jdGlvbihzcGVjaWZpZXIpIHsNCiAgICAgIHZhciBwID0gbmV3UGFyc2Uoc3BlY2lmaWVyLCB1dGNEYXRlKTsNCiAgICAgIHAudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHNwZWNpZmllcjsgfTsNCiAgICAgIHJldHVybiBwOw0KICAgIH0NCiAgfTsNCn0NCg0KdmFyIHBhZHMgPSB7Ii0iOiAiIiwgIl8iOiAiICIsICIwIjogIjAifTsNCnZhciBudW1iZXJSZSA9IC9eXHMqXGQrLzsNCnZhciBwZXJjZW50UmUgPSAvXiUvOw0KdmFyIHJlcXVvdGVSZSA9IC9bXFxcXlwkXCpcK1w/XHxcW1xdXChcKVwuXHtcfV0vZzsNCg0KZnVuY3Rpb24gcGFkKHZhbHVlLCBmaWxsLCB3aWR0aCkgew0KICB2YXIgc2lnbiA9IHZhbHVlIDwgMCA/ICItIiA6ICIiLA0KICAgICAgc3RyaW5nID0gKHNpZ24gPyAtdmFsdWUgOiB2YWx1ZSkgKyAiIiwNCiAgICAgIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7DQogIHJldHVybiBzaWduICsgKGxlbmd0aCA8IHdpZHRoID8gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbihmaWxsKSArIHN0cmluZyA6IHN0cmluZyk7DQp9DQoNCmZ1bmN0aW9uIHJlcXVvdGUocykgew0KICByZXR1cm4gcy5yZXBsYWNlKHJlcXVvdGVSZSwgIlxcJCYiKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0UmUobmFtZXMpIHsNCiAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiICsgbmFtZXMubWFwKHJlcXVvdGUpLmpvaW4oInwiKSArICIpIiwgImkiKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0TG9va3VwKG5hbWVzKSB7DQogIHZhciBtYXAgPSB7fSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoOw0KICB3aGlsZSAoKytpIDwgbikgbWFwW25hbWVzW2ldLnRvTG93ZXJDYXNlKCldID0gaTsNCiAgcmV0dXJuIG1hcDsNCn0NCg0KZnVuY3Rpb24gcGFyc2VXZWVrZGF5TnVtYmVyKGQsIHN0cmluZywgaSkgew0KICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAxKSk7DQogIHJldHVybiBuID8gKGQudyA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7DQp9DQoNCmZ1bmN0aW9uIHBhcnNlV2Vla051bWJlclN1bmRheShkLCBzdHJpbmcsIGkpIHsNCiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpKSk7DQogIHJldHVybiBuID8gKGQuVSA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7DQp9DQoNCmZ1bmN0aW9uIHBhcnNlV2Vla051bWJlck1vbmRheShkLCBzdHJpbmcsIGkpIHsNCiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpKSk7DQogIHJldHVybiBuID8gKGQuVyA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7DQp9DQoNCmZ1bmN0aW9uIHBhcnNlRnVsbFllYXIoZCwgc3RyaW5nLCBpKSB7DQogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDQpKTsNCiAgcmV0dXJuIG4gPyAoZC55ID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsNCn0NCg0KZnVuY3Rpb24gcGFyc2VZZWFyKGQsIHN0cmluZywgaSkgew0KICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7DQogIHJldHVybiBuID8gKGQueSA9ICtuWzBdICsgKCtuWzBdID4gNjggPyAxOTAwIDogMjAwMCksIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsNCn0NCg0KZnVuY3Rpb24gcGFyc2Vab25lKGQsIHN0cmluZywgaSkgew0KICB2YXIgbiA9IC9eKFopfChbKy1dXGRcZCkoPzpcOj8oXGRcZCkpPy8uZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDYpKTsNCiAgcmV0dXJuIG4gPyAoZC5aID0gblsxXSA/IDAgOiAtKG5bMl0gKyAoblszXSB8fCAiMDAiKSksIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsNCn0NCg0KZnVuY3Rpb24gcGFyc2VNb250aE51bWJlcihkLCBzdHJpbmcsIGkpIHsNCiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpOw0KICByZXR1cm4gbiA/IChkLm0gPSBuWzBdIC0gMSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOw0KfQ0KDQpmdW5jdGlvbiBwYXJzZURheU9mTW9udGgoZCwgc3RyaW5nLCBpKSB7DQogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTsNCiAgcmV0dXJuIG4gPyAoZC5kID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsNCn0NCg0KZnVuY3Rpb24gcGFyc2VEYXlPZlllYXIoZCwgc3RyaW5nLCBpKSB7DQogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDMpKTsNCiAgcmV0dXJuIG4gPyAoZC5tID0gMCwgZC5kID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsNCn0NCg0KZnVuY3Rpb24gcGFyc2VIb3VyMjQoZCwgc3RyaW5nLCBpKSB7DQogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTsNCiAgcmV0dXJuIG4gPyAoZC5IID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsNCn0NCg0KZnVuY3Rpb24gcGFyc2VNaW51dGVzKGQsIHN0cmluZywgaSkgew0KICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7DQogIHJldHVybiBuID8gKGQuTSA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7DQp9DQoNCmZ1bmN0aW9uIHBhcnNlU2Vjb25kcyhkLCBzdHJpbmcsIGkpIHsNCiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpOw0KICByZXR1cm4gbiA/IChkLlMgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOw0KfQ0KDQpmdW5jdGlvbiBwYXJzZU1pbGxpc2Vjb25kcyhkLCBzdHJpbmcsIGkpIHsNCiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMykpOw0KICByZXR1cm4gbiA/IChkLkwgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOw0KfQ0KDQpmdW5jdGlvbiBwYXJzZUxpdGVyYWxQZXJjZW50KGQsIHN0cmluZywgaSkgew0KICB2YXIgbiA9IHBlcmNlbnRSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMSkpOw0KICByZXR1cm4gbiA/IGkgKyBuWzBdLmxlbmd0aCA6IC0xOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXREYXlPZk1vbnRoKGQsIHApIHsNCiAgcmV0dXJuIHBhZChkLmdldERhdGUoKSwgcCwgMik7DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdEhvdXIyNChkLCBwKSB7DQogIHJldHVybiBwYWQoZC5nZXRIb3VycygpLCBwLCAyKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0SG91cjEyKGQsIHApIHsNCiAgcmV0dXJuIHBhZChkLmdldEhvdXJzKCkgJSAxMiB8fCAxMiwgcCwgMik7DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdERheU9mWWVhcihkLCBwKSB7DQogIHJldHVybiBwYWQoMSArIGQzVGltZS50aW1lRGF5LmNvdW50KGQzVGltZS50aW1lWWVhcihkKSwgZCksIHAsIDMpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRNaWxsaXNlY29uZHMoZCwgcCkgew0KICByZXR1cm4gcGFkKGQuZ2V0TWlsbGlzZWNvbmRzKCksIHAsIDMpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRNb250aE51bWJlcihkLCBwKSB7DQogIHJldHVybiBwYWQoZC5nZXRNb250aCgpICsgMSwgcCwgMik7DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdE1pbnV0ZXMoZCwgcCkgew0KICByZXR1cm4gcGFkKGQuZ2V0TWludXRlcygpLCBwLCAyKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0U2Vjb25kcyhkLCBwKSB7DQogIHJldHVybiBwYWQoZC5nZXRTZWNvbmRzKCksIHAsIDIpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRXZWVrTnVtYmVyU3VuZGF5KGQsIHApIHsNCiAgcmV0dXJuIHBhZChkM1RpbWUudGltZVN1bmRheS5jb3VudChkM1RpbWUudGltZVllYXIoZCksIGQpLCBwLCAyKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0V2Vla2RheU51bWJlcihkKSB7DQogIHJldHVybiBkLmdldERheSgpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRXZWVrTnVtYmVyTW9uZGF5KGQsIHApIHsNCiAgcmV0dXJuIHBhZChkM1RpbWUudGltZU1vbmRheS5jb3VudChkM1RpbWUudGltZVllYXIoZCksIGQpLCBwLCAyKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0WWVhcihkLCBwKSB7DQogIHJldHVybiBwYWQoZC5nZXRGdWxsWWVhcigpICUgMTAwLCBwLCAyKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0RnVsbFllYXIoZCwgcCkgew0KICByZXR1cm4gcGFkKGQuZ2V0RnVsbFllYXIoKSAlIDEwMDAwLCBwLCA0KTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0Wm9uZShkKSB7DQogIHZhciB6ID0gZC5nZXRUaW1lem9uZU9mZnNldCgpOw0KICByZXR1cm4gKHogPiAwID8gIi0iIDogKHogKj0gLTEsICIrIikpDQogICAgICArIHBhZCh6IC8gNjAgfCAwLCAiMCIsIDIpDQogICAgICArIHBhZCh6ICUgNjAsICIwIiwgMik7DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdFVUQ0RheU9mTW9udGgoZCwgcCkgew0KICByZXR1cm4gcGFkKGQuZ2V0VVRDRGF0ZSgpLCBwLCAyKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0VVRDSG91cjI0KGQsIHApIHsNCiAgcmV0dXJuIHBhZChkLmdldFVUQ0hvdXJzKCksIHAsIDIpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRVVENIb3VyMTIoZCwgcCkgew0KICByZXR1cm4gcGFkKGQuZ2V0VVRDSG91cnMoKSAlIDEyIHx8IDEyLCBwLCAyKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0VVRDRGF5T2ZZZWFyKGQsIHApIHsNCiAgcmV0dXJuIHBhZCgxICsgZDNUaW1lLnV0Y0RheS5jb3VudChkM1RpbWUudXRjWWVhcihkKSwgZCksIHAsIDMpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRVVENNaWxsaXNlY29uZHMoZCwgcCkgew0KICByZXR1cm4gcGFkKGQuZ2V0VVRDTWlsbGlzZWNvbmRzKCksIHAsIDMpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRVVENNb250aE51bWJlcihkLCBwKSB7DQogIHJldHVybiBwYWQoZC5nZXRVVENNb250aCgpICsgMSwgcCwgMik7DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdFVUQ01pbnV0ZXMoZCwgcCkgew0KICByZXR1cm4gcGFkKGQuZ2V0VVRDTWludXRlcygpLCBwLCAyKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0VVRDU2Vjb25kcyhkLCBwKSB7DQogIHJldHVybiBwYWQoZC5nZXRVVENTZWNvbmRzKCksIHAsIDIpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRVVENXZWVrTnVtYmVyU3VuZGF5KGQsIHApIHsNCiAgcmV0dXJuIHBhZChkM1RpbWUudXRjU3VuZGF5LmNvdW50KGQzVGltZS51dGNZZWFyKGQpLCBkKSwgcCwgMik7DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdFVUQ1dlZWtkYXlOdW1iZXIoZCkgew0KICByZXR1cm4gZC5nZXRVVENEYXkoKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0VVRDV2Vla051bWJlck1vbmRheShkLCBwKSB7DQogIHJldHVybiBwYWQoZDNUaW1lLnV0Y01vbmRheS5jb3VudChkM1RpbWUudXRjWWVhcihkKSwgZCksIHAsIDIpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRVVENZZWFyKGQsIHApIHsNCiAgcmV0dXJuIHBhZChkLmdldFVUQ0Z1bGxZZWFyKCkgJSAxMDAsIHAsIDIpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRVVENGdWxsWWVhcihkLCBwKSB7DQogIHJldHVybiBwYWQoZC5nZXRVVENGdWxsWWVhcigpICUgMTAwMDAsIHAsIDQpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRVVENab25lKCkgew0KICByZXR1cm4gIiswMDAwIjsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0TGl0ZXJhbFBlcmNlbnQoKSB7DQogIHJldHVybiAiJSI7DQp9DQoNCnZhciBsb2NhbGUkMTsNCg0KDQoNCg0KDQpkZWZhdWx0TG9jYWxlKHsNCiAgZGF0ZVRpbWU6ICIleCwgJVgiLA0KICBkYXRlOiAiJS1tLyUtZC8lWSIsDQogIHRpbWU6ICIlLUk6JU06JVMgJXAiLA0KICBwZXJpb2RzOiBbIkFNIiwgIlBNIl0sDQogIGRheXM6IFsiU3VuZGF5IiwgIk1vbmRheSIsICJUdWVzZGF5IiwgIldlZG5lc2RheSIsICJUaHVyc2RheSIsICJGcmlkYXkiLCAiU2F0dXJkYXkiXSwNCiAgc2hvcnREYXlzOiBbIlN1biIsICJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCJdLA0KICBtb250aHM6IFsiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLA0KICBzaG9ydE1vbnRoczogWyJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsICJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyJdDQp9KTsNCg0KZnVuY3Rpb24gZGVmYXVsdExvY2FsZShkZWZpbml0aW9uKSB7DQogIGxvY2FsZSQxID0gZm9ybWF0TG9jYWxlKGRlZmluaXRpb24pOw0KICBleHBvcnRzLnRpbWVGb3JtYXQgPSBsb2NhbGUkMS5mb3JtYXQ7DQogIGV4cG9ydHMudGltZVBhcnNlID0gbG9jYWxlJDEucGFyc2U7DQogIGV4cG9ydHMudXRjRm9ybWF0ID0gbG9jYWxlJDEudXRjRm9ybWF0Ow0KICBleHBvcnRzLnV0Y1BhcnNlID0gbG9jYWxlJDEudXRjUGFyc2U7DQogIHJldHVybiBsb2NhbGUkMTsNCn0NCg0KdmFyIGlzb1NwZWNpZmllciA9ICIlWS0lbS0lZFQlSDolTTolUy4lTFoiOw0KDQpmdW5jdGlvbiBmb3JtYXRJc29OYXRpdmUoZGF0ZSkgew0KICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpOw0KfQ0KDQp2YXIgZm9ybWF0SXNvID0gRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcNCiAgICA/IGZvcm1hdElzb05hdGl2ZQ0KICAgIDogZXhwb3J0cy51dGNGb3JtYXQoaXNvU3BlY2lmaWVyKTsNCg0KZnVuY3Rpb24gcGFyc2VJc29OYXRpdmUoc3RyaW5nKSB7DQogIHZhciBkYXRlID0gbmV3IERhdGUoc3RyaW5nKTsNCiAgcmV0dXJuIGlzTmFOKGRhdGUpID8gbnVsbCA6IGRhdGU7DQp9DQoNCnZhciBwYXJzZUlzbyA9ICtuZXcgRGF0ZSgiMjAwMC0wMS0wMVQwMDowMDowMC4wMDBaIikNCiAgICA/IHBhcnNlSXNvTmF0aXZlDQogICAgOiBleHBvcnRzLnV0Y1BhcnNlKGlzb1NwZWNpZmllcik7DQoNCmV4cG9ydHMudGltZUZvcm1hdERlZmF1bHRMb2NhbGUgPSBkZWZhdWx0TG9jYWxlOw0KZXhwb3J0cy50aW1lRm9ybWF0TG9jYWxlID0gZm9ybWF0TG9jYWxlOw0KZXhwb3J0cy5pc29Gb3JtYXQgPSBmb3JtYXRJc287DQpleHBvcnRzLmlzb1BhcnNlID0gcGFyc2VJc287DQoNCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7DQoNCn0pKSk7DQoNCn0seyJkMy10aW1lIjoxNX1dLDE1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsNCi8vIGh0dHBzOi8vZDNqcy5vcmcvZDMtdGltZS8gVmVyc2lvbiAxLjAuNi4gQ29weXJpZ2h0IDIwMTcgTWlrZSBCb3N0b2NrLg0KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsNCgl0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDoNCgl0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpIDoNCgkoZmFjdG9yeSgoZ2xvYmFsLmQzID0gZ2xvYmFsLmQzIHx8IHt9KSkpOw0KfSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMpIHsgJ3VzZSBzdHJpY3QnOw0KDQp2YXIgdDAgPSBuZXcgRGF0ZTsNCnZhciB0MSA9IG5ldyBEYXRlOw0KDQpmdW5jdGlvbiBuZXdJbnRlcnZhbChmbG9vcmksIG9mZnNldGksIGNvdW50LCBmaWVsZCkgew0KDQogIGZ1bmN0aW9uIGludGVydmFsKGRhdGUpIHsNCiAgICByZXR1cm4gZmxvb3JpKGRhdGUgPSBuZXcgRGF0ZSgrZGF0ZSkpLCBkYXRlOw0KICB9DQoNCiAgaW50ZXJ2YWwuZmxvb3IgPSBpbnRlcnZhbDsNCg0KICBpbnRlcnZhbC5jZWlsID0gZnVuY3Rpb24oZGF0ZSkgew0KICAgIHJldHVybiBmbG9vcmkoZGF0ZSA9IG5ldyBEYXRlKGRhdGUgLSAxKSksIG9mZnNldGkoZGF0ZSwgMSksIGZsb29yaShkYXRlKSwgZGF0ZTsNCiAgfTsNCg0KICBpbnRlcnZhbC5yb3VuZCA9IGZ1bmN0aW9uKGRhdGUpIHsNCiAgICB2YXIgZDAgPSBpbnRlcnZhbChkYXRlKSwNCiAgICAgICAgZDEgPSBpbnRlcnZhbC5jZWlsKGRhdGUpOw0KICAgIHJldHVybiBkYXRlIC0gZDAgPCBkMSAtIGRhdGUgPyBkMCA6IGQxOw0KICB9Ow0KDQogIGludGVydmFsLm9mZnNldCA9IGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsNCiAgICByZXR1cm4gb2Zmc2V0aShkYXRlID0gbmV3IERhdGUoK2RhdGUpLCBzdGVwID09IG51bGwgPyAxIDogTWF0aC5mbG9vcihzdGVwKSksIGRhdGU7DQogIH07DQoNCiAgaW50ZXJ2YWwucmFuZ2UgPSBmdW5jdGlvbihzdGFydCwgc3RvcCwgc3RlcCkgew0KICAgIHZhciByYW5nZSA9IFtdOw0KICAgIHN0YXJ0ID0gaW50ZXJ2YWwuY2VpbChzdGFydCk7DQogICAgc3RlcCA9IHN0ZXAgPT0gbnVsbCA/IDEgOiBNYXRoLmZsb29yKHN0ZXApOw0KICAgIGlmICghKHN0YXJ0IDwgc3RvcCkgfHwgIShzdGVwID4gMCkpIHJldHVybiByYW5nZTsgLy8gYWxzbyBoYW5kbGVzIEludmFsaWQgRGF0ZQ0KICAgIGRvIHJhbmdlLnB1c2gobmV3IERhdGUoK3N0YXJ0KSk7IHdoaWxlIChvZmZzZXRpKHN0YXJ0LCBzdGVwKSwgZmxvb3JpKHN0YXJ0KSwgc3RhcnQgPCBzdG9wKQ0KICAgIHJldHVybiByYW5nZTsNCiAgfTsNCg0KICBpbnRlcnZhbC5maWx0ZXIgPSBmdW5jdGlvbih0ZXN0KSB7DQogICAgcmV0dXJuIG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsNCiAgICAgIGlmIChkYXRlID49IGRhdGUpIHdoaWxlIChmbG9vcmkoZGF0ZSksICF0ZXN0KGRhdGUpKSBkYXRlLnNldFRpbWUoZGF0ZSAtIDEpOw0KICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsNCiAgICAgIGlmIChkYXRlID49IGRhdGUpIHdoaWxlICgtLXN0ZXAgPj0gMCkgd2hpbGUgKG9mZnNldGkoZGF0ZSwgMSksICF0ZXN0KGRhdGUpKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5DQogICAgfSk7DQogIH07DQoNCiAgaWYgKGNvdW50KSB7DQogICAgaW50ZXJ2YWwuY291bnQgPSBmdW5jdGlvbihzdGFydCwgZW5kKSB7DQogICAgICB0MC5zZXRUaW1lKCtzdGFydCksIHQxLnNldFRpbWUoK2VuZCk7DQogICAgICBmbG9vcmkodDApLCBmbG9vcmkodDEpOw0KICAgICAgcmV0dXJuIE1hdGguZmxvb3IoY291bnQodDAsIHQxKSk7DQogICAgfTsNCg0KICAgIGludGVydmFsLmV2ZXJ5ID0gZnVuY3Rpb24oc3RlcCkgew0KICAgICAgc3RlcCA9IE1hdGguZmxvb3Ioc3RlcCk7DQogICAgICByZXR1cm4gIWlzRmluaXRlKHN0ZXApIHx8ICEoc3RlcCA+IDApID8gbnVsbA0KICAgICAgICAgIDogIShzdGVwID4gMSkgPyBpbnRlcnZhbA0KICAgICAgICAgIDogaW50ZXJ2YWwuZmlsdGVyKGZpZWxkDQogICAgICAgICAgICAgID8gZnVuY3Rpb24oZCkgeyByZXR1cm4gZmllbGQoZCkgJSBzdGVwID09PSAwOyB9DQogICAgICAgICAgICAgIDogZnVuY3Rpb24oZCkgeyByZXR1cm4gaW50ZXJ2YWwuY291bnQoMCwgZCkgJSBzdGVwID09PSAwOyB9KTsNCiAgICB9Ow0KICB9DQoNCiAgcmV0dXJuIGludGVydmFsOw0KfQ0KDQp2YXIgbWlsbGlzZWNvbmQgPSBuZXdJbnRlcnZhbChmdW5jdGlvbigpIHsNCiAgLy8gbm9vcA0KfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgew0KICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwKTsNCn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsNCiAgcmV0dXJuIGVuZCAtIHN0YXJ0Ow0KfSk7DQoNCi8vIEFuIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBzaW1wbGUgY2FzZS4NCm1pbGxpc2Vjb25kLmV2ZXJ5ID0gZnVuY3Rpb24oaykgew0KICBrID0gTWF0aC5mbG9vcihrKTsNCiAgaWYgKCFpc0Zpbml0ZShrKSB8fCAhKGsgPiAwKSkgcmV0dXJuIG51bGw7DQogIGlmICghKGsgPiAxKSkgcmV0dXJuIG1pbGxpc2Vjb25kOw0KICByZXR1cm4gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgew0KICAgIGRhdGUuc2V0VGltZShNYXRoLmZsb29yKGRhdGUgLyBrKSAqIGspOw0KICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7DQogICAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCAqIGspOw0KICB9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7DQogICAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBrOw0KICB9KTsNCn07DQoNCnZhciBtaWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZC5yYW5nZTsNCg0KdmFyIGR1cmF0aW9uU2Vjb25kID0gMWUzOw0KdmFyIGR1cmF0aW9uTWludXRlID0gNmU0Ow0KdmFyIGR1cmF0aW9uSG91ciA9IDM2ZTU7DQp2YXIgZHVyYXRpb25EYXkgPSA4NjRlNTsNCnZhciBkdXJhdGlvbldlZWsgPSA2MDQ4ZTU7DQoNCnZhciBzZWNvbmQgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7DQogIGRhdGUuc2V0VGltZShNYXRoLmZsb29yKGRhdGUgLyBkdXJhdGlvblNlY29uZCkgKiBkdXJhdGlvblNlY29uZCk7DQp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7DQogIGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXAgKiBkdXJhdGlvblNlY29uZCk7DQp9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7DQogIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25TZWNvbmQ7DQp9LCBmdW5jdGlvbihkYXRlKSB7DQogIHJldHVybiBkYXRlLmdldFVUQ1NlY29uZHMoKTsNCn0pOw0KDQp2YXIgc2Vjb25kcyA9IHNlY29uZC5yYW5nZTsNCg0KdmFyIG1pbnV0ZSA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsNCiAgZGF0ZS5zZXRUaW1lKE1hdGguZmxvb3IoZGF0ZSAvIGR1cmF0aW9uTWludXRlKSAqIGR1cmF0aW9uTWludXRlKTsNCn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsNCiAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCAqIGR1cmF0aW9uTWludXRlKTsNCn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsNCiAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbk1pbnV0ZTsNCn0sIGZ1bmN0aW9uKGRhdGUpIHsNCiAgcmV0dXJuIGRhdGUuZ2V0TWludXRlcygpOw0KfSk7DQoNCnZhciBtaW51dGVzID0gbWludXRlLnJhbmdlOw0KDQp2YXIgaG91ciA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsNCiAgdmFyIG9mZnNldCA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIGR1cmF0aW9uTWludXRlICUgZHVyYXRpb25Ib3VyOw0KICBpZiAob2Zmc2V0IDwgMCkgb2Zmc2V0ICs9IGR1cmF0aW9uSG91cjsNCiAgZGF0ZS5zZXRUaW1lKE1hdGguZmxvb3IoKCtkYXRlIC0gb2Zmc2V0KSAvIGR1cmF0aW9uSG91cikgKiBkdXJhdGlvbkhvdXIgKyBvZmZzZXQpOw0KfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgew0KICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwICogZHVyYXRpb25Ib3VyKTsNCn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsNCiAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbkhvdXI7DQp9LCBmdW5jdGlvbihkYXRlKSB7DQogIHJldHVybiBkYXRlLmdldEhvdXJzKCk7DQp9KTsNCg0KdmFyIGhvdXJzID0gaG91ci5yYW5nZTsNCg0KdmFyIGRheSA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsNCiAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsNCn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsNCiAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgc3RlcCk7DQp9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7DQogIHJldHVybiAoZW5kIC0gc3RhcnQgLSAoZW5kLmdldFRpbWV6b25lT2Zmc2V0KCkgLSBzdGFydC5nZXRUaW1lem9uZU9mZnNldCgpKSAqIGR1cmF0aW9uTWludXRlKSAvIGR1cmF0aW9uRGF5Ow0KfSwgZnVuY3Rpb24oZGF0ZSkgew0KICByZXR1cm4gZGF0ZS5nZXREYXRlKCkgLSAxOw0KfSk7DQoNCnZhciBkYXlzID0gZGF5LnJhbmdlOw0KDQpmdW5jdGlvbiB3ZWVrZGF5KGkpIHsNCiAgcmV0dXJuIG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsNCiAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgLSAoZGF0ZS5nZXREYXkoKSArIDcgLSBpKSAlIDcpOw0KICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7DQogIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsNCiAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBzdGVwICogNyk7DQogIH0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsNCiAgICByZXR1cm4gKGVuZCAtIHN0YXJ0IC0gKGVuZC5nZXRUaW1lem9uZU9mZnNldCgpIC0gc3RhcnQuZ2V0VGltZXpvbmVPZmZzZXQoKSkgKiBkdXJhdGlvbk1pbnV0ZSkgLyBkdXJhdGlvbldlZWs7DQogIH0pOw0KfQ0KDQp2YXIgc3VuZGF5ID0gd2Vla2RheSgwKTsNCnZhciBtb25kYXkgPSB3ZWVrZGF5KDEpOw0KdmFyIHR1ZXNkYXkgPSB3ZWVrZGF5KDIpOw0KdmFyIHdlZG5lc2RheSA9IHdlZWtkYXkoMyk7DQp2YXIgdGh1cnNkYXkgPSB3ZWVrZGF5KDQpOw0KdmFyIGZyaWRheSA9IHdlZWtkYXkoNSk7DQp2YXIgc2F0dXJkYXkgPSB3ZWVrZGF5KDYpOw0KDQp2YXIgc3VuZGF5cyA9IHN1bmRheS5yYW5nZTsNCnZhciBtb25kYXlzID0gbW9uZGF5LnJhbmdlOw0KdmFyIHR1ZXNkYXlzID0gdHVlc2RheS5yYW5nZTsNCnZhciB3ZWRuZXNkYXlzID0gd2VkbmVzZGF5LnJhbmdlOw0KdmFyIHRodXJzZGF5cyA9IHRodXJzZGF5LnJhbmdlOw0KdmFyIGZyaWRheXMgPSBmcmlkYXkucmFuZ2U7DQp2YXIgc2F0dXJkYXlzID0gc2F0dXJkYXkucmFuZ2U7DQoNCnZhciBtb250aCA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsNCiAgZGF0ZS5zZXREYXRlKDEpOw0KICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOw0KfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgew0KICBkYXRlLnNldE1vbnRoKGRhdGUuZ2V0TW9udGgoKSArIHN0ZXApOw0KfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgew0KICByZXR1cm4gZW5kLmdldE1vbnRoKCkgLSBzdGFydC5nZXRNb250aCgpICsgKGVuZC5nZXRGdWxsWWVhcigpIC0gc3RhcnQuZ2V0RnVsbFllYXIoKSkgKiAxMjsNCn0sIGZ1bmN0aW9uKGRhdGUpIHsNCiAgcmV0dXJuIGRhdGUuZ2V0TW9udGgoKTsNCn0pOw0KDQp2YXIgbW9udGhzID0gbW9udGgucmFuZ2U7DQoNCnZhciB5ZWFyID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgew0KICBkYXRlLnNldE1vbnRoKDAsIDEpOw0KICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOw0KfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgew0KICBkYXRlLnNldEZ1bGxZZWFyKGRhdGUuZ2V0RnVsbFllYXIoKSArIHN0ZXApOw0KfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgew0KICByZXR1cm4gZW5kLmdldEZ1bGxZZWFyKCkgLSBzdGFydC5nZXRGdWxsWWVhcigpOw0KfSwgZnVuY3Rpb24oZGF0ZSkgew0KICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpOw0KfSk7DQoNCi8vIEFuIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBzaW1wbGUgY2FzZS4NCnllYXIuZXZlcnkgPSBmdW5jdGlvbihrKSB7DQogIHJldHVybiAhaXNGaW5pdGUoayA9IE1hdGguZmxvb3IoaykpIHx8ICEoayA+IDApID8gbnVsbCA6IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsNCiAgICBkYXRlLnNldEZ1bGxZZWFyKE1hdGguZmxvb3IoZGF0ZS5nZXRGdWxsWWVhcigpIC8gaykgKiBrKTsNCiAgICBkYXRlLnNldE1vbnRoKDAsIDEpOw0KICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7DQogIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsNCiAgICBkYXRlLnNldEZ1bGxZZWFyKGRhdGUuZ2V0RnVsbFllYXIoKSArIHN0ZXAgKiBrKTsNCiAgfSk7DQp9Ow0KDQp2YXIgeWVhcnMgPSB5ZWFyLnJhbmdlOw0KDQp2YXIgdXRjTWludXRlID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgew0KICBkYXRlLnNldFVUQ1NlY29uZHMoMCwgMCk7DQp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7DQogIGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXAgKiBkdXJhdGlvbk1pbnV0ZSk7DQp9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7DQogIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25NaW51dGU7DQp9LCBmdW5jdGlvbihkYXRlKSB7DQogIHJldHVybiBkYXRlLmdldFVUQ01pbnV0ZXMoKTsNCn0pOw0KDQp2YXIgdXRjTWludXRlcyA9IHV0Y01pbnV0ZS5yYW5nZTsNCg0KdmFyIHV0Y0hvdXIgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7DQogIGRhdGUuc2V0VVRDTWludXRlcygwLCAwLCAwKTsNCn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsNCiAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCAqIGR1cmF0aW9uSG91cik7DQp9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7DQogIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25Ib3VyOw0KfSwgZnVuY3Rpb24oZGF0ZSkgew0KICByZXR1cm4gZGF0ZS5nZXRVVENIb3VycygpOw0KfSk7DQoNCnZhciB1dGNIb3VycyA9IHV0Y0hvdXIucmFuZ2U7DQoNCnZhciB1dGNEYXkgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7DQogIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7DQp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7DQogIGRhdGUuc2V0VVRDRGF0ZShkYXRlLmdldFVUQ0RhdGUoKSArIHN0ZXApOw0KfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgew0KICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uRGF5Ow0KfSwgZnVuY3Rpb24oZGF0ZSkgew0KICByZXR1cm4gZGF0ZS5nZXRVVENEYXRlKCkgLSAxOw0KfSk7DQoNCnZhciB1dGNEYXlzID0gdXRjRGF5LnJhbmdlOw0KDQpmdW5jdGlvbiB1dGNXZWVrZGF5KGkpIHsNCiAgcmV0dXJuIG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsNCiAgICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgLSAoZGF0ZS5nZXRVVENEYXkoKSArIDcgLSBpKSAlIDcpOw0KICAgIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7DQogIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsNCiAgICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgKyBzdGVwICogNyk7DQogIH0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsNCiAgICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uV2VlazsNCiAgfSk7DQp9DQoNCnZhciB1dGNTdW5kYXkgPSB1dGNXZWVrZGF5KDApOw0KdmFyIHV0Y01vbmRheSA9IHV0Y1dlZWtkYXkoMSk7DQp2YXIgdXRjVHVlc2RheSA9IHV0Y1dlZWtkYXkoMik7DQp2YXIgdXRjV2VkbmVzZGF5ID0gdXRjV2Vla2RheSgzKTsNCnZhciB1dGNUaHVyc2RheSA9IHV0Y1dlZWtkYXkoNCk7DQp2YXIgdXRjRnJpZGF5ID0gdXRjV2Vla2RheSg1KTsNCnZhciB1dGNTYXR1cmRheSA9IHV0Y1dlZWtkYXkoNik7DQoNCnZhciB1dGNTdW5kYXlzID0gdXRjU3VuZGF5LnJhbmdlOw0KdmFyIHV0Y01vbmRheXMgPSB1dGNNb25kYXkucmFuZ2U7DQp2YXIgdXRjVHVlc2RheXMgPSB1dGNUdWVzZGF5LnJhbmdlOw0KdmFyIHV0Y1dlZG5lc2RheXMgPSB1dGNXZWRuZXNkYXkucmFuZ2U7DQp2YXIgdXRjVGh1cnNkYXlzID0gdXRjVGh1cnNkYXkucmFuZ2U7DQp2YXIgdXRjRnJpZGF5cyA9IHV0Y0ZyaWRheS5yYW5nZTsNCnZhciB1dGNTYXR1cmRheXMgPSB1dGNTYXR1cmRheS5yYW5nZTsNCg0KdmFyIHV0Y01vbnRoID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgew0KICBkYXRlLnNldFVUQ0RhdGUoMSk7DQogIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7DQp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7DQogIGRhdGUuc2V0VVRDTW9udGgoZGF0ZS5nZXRVVENNb250aCgpICsgc3RlcCk7DQp9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7DQogIHJldHVybiBlbmQuZ2V0VVRDTW9udGgoKSAtIHN0YXJ0LmdldFVUQ01vbnRoKCkgKyAoZW5kLmdldFVUQ0Z1bGxZZWFyKCkgLSBzdGFydC5nZXRVVENGdWxsWWVhcigpKSAqIDEyOw0KfSwgZnVuY3Rpb24oZGF0ZSkgew0KICByZXR1cm4gZGF0ZS5nZXRVVENNb250aCgpOw0KfSk7DQoNCnZhciB1dGNNb250aHMgPSB1dGNNb250aC5yYW5nZTsNCg0KdmFyIHV0Y1llYXIgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7DQogIGRhdGUuc2V0VVRDTW9udGgoMCwgMSk7DQogIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7DQp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7DQogIGRhdGUuc2V0VVRDRnVsbFllYXIoZGF0ZS5nZXRVVENGdWxsWWVhcigpICsgc3RlcCk7DQp9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7DQogIHJldHVybiBlbmQuZ2V0VVRDRnVsbFllYXIoKSAtIHN0YXJ0LmdldFVUQ0Z1bGxZZWFyKCk7DQp9LCBmdW5jdGlvbihkYXRlKSB7DQogIHJldHVybiBkYXRlLmdldFVUQ0Z1bGxZZWFyKCk7DQp9KTsNCg0KLy8gQW4gb3B0aW1pemVkIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIHNpbXBsZSBjYXNlLg0KdXRjWWVhci5ldmVyeSA9IGZ1bmN0aW9uKGspIHsNCiAgcmV0dXJuICFpc0Zpbml0ZShrID0gTWF0aC5mbG9vcihrKSkgfHwgIShrID4gMCkgPyBudWxsIDogbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgew0KICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoTWF0aC5mbG9vcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgLyBrKSAqIGspOw0KICAgIGRhdGUuc2V0VVRDTW9udGgoMCwgMSk7DQogICAgZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTsNCiAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgew0KICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoZGF0ZS5nZXRVVENGdWxsWWVhcigpICsgc3RlcCAqIGspOw0KICB9KTsNCn07DQoNCnZhciB1dGNZZWFycyA9IHV0Y1llYXIucmFuZ2U7DQoNCmV4cG9ydHMudGltZUludGVydmFsID0gbmV3SW50ZXJ2YWw7DQpleHBvcnRzLnRpbWVNaWxsaXNlY29uZCA9IG1pbGxpc2Vjb25kOw0KZXhwb3J0cy50aW1lTWlsbGlzZWNvbmRzID0gbWlsbGlzZWNvbmRzOw0KZXhwb3J0cy51dGNNaWxsaXNlY29uZCA9IG1pbGxpc2Vjb25kOw0KZXhwb3J0cy51dGNNaWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZHM7DQpleHBvcnRzLnRpbWVTZWNvbmQgPSBzZWNvbmQ7DQpleHBvcnRzLnRpbWVTZWNvbmRzID0gc2Vjb25kczsNCmV4cG9ydHMudXRjU2Vjb25kID0gc2Vjb25kOw0KZXhwb3J0cy51dGNTZWNvbmRzID0gc2Vjb25kczsNCmV4cG9ydHMudGltZU1pbnV0ZSA9IG1pbnV0ZTsNCmV4cG9ydHMudGltZU1pbnV0ZXMgPSBtaW51dGVzOw0KZXhwb3J0cy50aW1lSG91ciA9IGhvdXI7DQpleHBvcnRzLnRpbWVIb3VycyA9IGhvdXJzOw0KZXhwb3J0cy50aW1lRGF5ID0gZGF5Ow0KZXhwb3J0cy50aW1lRGF5cyA9IGRheXM7DQpleHBvcnRzLnRpbWVXZWVrID0gc3VuZGF5Ow0KZXhwb3J0cy50aW1lV2Vla3MgPSBzdW5kYXlzOw0KZXhwb3J0cy50aW1lU3VuZGF5ID0gc3VuZGF5Ow0KZXhwb3J0cy50aW1lU3VuZGF5cyA9IHN1bmRheXM7DQpleHBvcnRzLnRpbWVNb25kYXkgPSBtb25kYXk7DQpleHBvcnRzLnRpbWVNb25kYXlzID0gbW9uZGF5czsNCmV4cG9ydHMudGltZVR1ZXNkYXkgPSB0dWVzZGF5Ow0KZXhwb3J0cy50aW1lVHVlc2RheXMgPSB0dWVzZGF5czsNCmV4cG9ydHMudGltZVdlZG5lc2RheSA9IHdlZG5lc2RheTsNCmV4cG9ydHMudGltZVdlZG5lc2RheXMgPSB3ZWRuZXNkYXlzOw0KZXhwb3J0cy50aW1lVGh1cnNkYXkgPSB0aHVyc2RheTsNCmV4cG9ydHMudGltZVRodXJzZGF5cyA9IHRodXJzZGF5czsNCmV4cG9ydHMudGltZUZyaWRheSA9IGZyaWRheTsNCmV4cG9ydHMudGltZUZyaWRheXMgPSBmcmlkYXlzOw0KZXhwb3J0cy50aW1lU2F0dXJkYXkgPSBzYXR1cmRheTsNCmV4cG9ydHMudGltZVNhdHVyZGF5cyA9IHNhdHVyZGF5czsNCmV4cG9ydHMudGltZU1vbnRoID0gbW9udGg7DQpleHBvcnRzLnRpbWVNb250aHMgPSBtb250aHM7DQpleHBvcnRzLnRpbWVZZWFyID0geWVhcjsNCmV4cG9ydHMudGltZVllYXJzID0geWVhcnM7DQpleHBvcnRzLnV0Y01pbnV0ZSA9IHV0Y01pbnV0ZTsNCmV4cG9ydHMudXRjTWludXRlcyA9IHV0Y01pbnV0ZXM7DQpleHBvcnRzLnV0Y0hvdXIgPSB1dGNIb3VyOw0KZXhwb3J0cy51dGNIb3VycyA9IHV0Y0hvdXJzOw0KZXhwb3J0cy51dGNEYXkgPSB1dGNEYXk7DQpleHBvcnRzLnV0Y0RheXMgPSB1dGNEYXlzOw0KZXhwb3J0cy51dGNXZWVrID0gdXRjU3VuZGF5Ow0KZXhwb3J0cy51dGNXZWVrcyA9IHV0Y1N1bmRheXM7DQpleHBvcnRzLnV0Y1N1bmRheSA9IHV0Y1N1bmRheTsNCmV4cG9ydHMudXRjU3VuZGF5cyA9IHV0Y1N1bmRheXM7DQpleHBvcnRzLnV0Y01vbmRheSA9IHV0Y01vbmRheTsNCmV4cG9ydHMudXRjTW9uZGF5cyA9IHV0Y01vbmRheXM7DQpleHBvcnRzLnV0Y1R1ZXNkYXkgPSB1dGNUdWVzZGF5Ow0KZXhwb3J0cy51dGNUdWVzZGF5cyA9IHV0Y1R1ZXNkYXlzOw0KZXhwb3J0cy51dGNXZWRuZXNkYXkgPSB1dGNXZWRuZXNkYXk7DQpleHBvcnRzLnV0Y1dlZG5lc2RheXMgPSB1dGNXZWRuZXNkYXlzOw0KZXhwb3J0cy51dGNUaHVyc2RheSA9IHV0Y1RodXJzZGF5Ow0KZXhwb3J0cy51dGNUaHVyc2RheXMgPSB1dGNUaHVyc2RheXM7DQpleHBvcnRzLnV0Y0ZyaWRheSA9IHV0Y0ZyaWRheTsNCmV4cG9ydHMudXRjRnJpZGF5cyA9IHV0Y0ZyaWRheXM7DQpleHBvcnRzLnV0Y1NhdHVyZGF5ID0gdXRjU2F0dXJkYXk7DQpleHBvcnRzLnV0Y1NhdHVyZGF5cyA9IHV0Y1NhdHVyZGF5czsNCmV4cG9ydHMudXRjTW9udGggPSB1dGNNb250aDsNCmV4cG9ydHMudXRjTW9udGhzID0gdXRjTW9udGhzOw0KZXhwb3J0cy51dGNZZWFyID0gdXRjWWVhcjsNCmV4cG9ydHMudXRjWWVhcnMgPSB1dGNZZWFyczsNCg0KT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTsNCg0KfSkpKTsNCg0KfSx7fV0sMTY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpew0KLy8gaHR0cHM6Ly9kM2pzLm9yZy9kMy10aW1lci8gVmVyc2lvbiAxLjAuNi4gQ29weXJpZ2h0IDIwMTcgTWlrZSBCb3N0b2NrLg0KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsNCgl0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDoNCgl0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpIDoNCgkoZmFjdG9yeSgoZ2xvYmFsLmQzID0gZ2xvYmFsLmQzIHx8IHt9KSkpOw0KfSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMpIHsgJ3VzZSBzdHJpY3QnOw0KDQp2YXIgZnJhbWUgPSAwOw0KdmFyIHRpbWVvdXQgPSAwOw0KdmFyIGludGVydmFsID0gMDsNCnZhciBwb2tlRGVsYXkgPSAxMDAwOw0KdmFyIHRhc2tIZWFkOw0KdmFyIHRhc2tUYWlsOw0KdmFyIGNsb2NrTGFzdCA9IDA7DQp2YXIgY2xvY2tOb3cgPSAwOw0KdmFyIGNsb2NrU2tldyA9IDA7DQp2YXIgY2xvY2sgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICJvYmplY3QiICYmIHBlcmZvcm1hbmNlLm5vdyA/IHBlcmZvcm1hbmNlIDogRGF0ZTsNCnZhciBzZXRGcmFtZSA9IHR5cGVvZiB3aW5kb3cgPT09ICJvYmplY3QiICYmIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPyB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KSA6IGZ1bmN0aW9uKGYpIHsgc2V0VGltZW91dChmLCAxNyk7IH07DQoNCmZ1bmN0aW9uIG5vdygpIHsNCiAgcmV0dXJuIGNsb2NrTm93IHx8IChzZXRGcmFtZShjbGVhck5vdyksIGNsb2NrTm93ID0gY2xvY2subm93KCkgKyBjbG9ja1NrZXcpOw0KfQ0KDQpmdW5jdGlvbiBjbGVhck5vdygpIHsNCiAgY2xvY2tOb3cgPSAwOw0KfQ0KDQpmdW5jdGlvbiBUaW1lcigpIHsNCiAgdGhpcy5fY2FsbCA9DQogIHRoaXMuX3RpbWUgPQ0KICB0aGlzLl9uZXh0ID0gbnVsbDsNCn0NCg0KVGltZXIucHJvdG90eXBlID0gdGltZXIucHJvdG90eXBlID0gew0KICBjb25zdHJ1Y3RvcjogVGltZXIsDQogIHJlc3RhcnQ6IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkgew0KICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uIik7DQogICAgdGltZSA9ICh0aW1lID09IG51bGwgPyBub3coKSA6ICt0aW1lKSArIChkZWxheSA9PSBudWxsID8gMCA6ICtkZWxheSk7DQogICAgaWYgKCF0aGlzLl9uZXh0ICYmIHRhc2tUYWlsICE9PSB0aGlzKSB7DQogICAgICBpZiAodGFza1RhaWwpIHRhc2tUYWlsLl9uZXh0ID0gdGhpczsNCiAgICAgIGVsc2UgdGFza0hlYWQgPSB0aGlzOw0KICAgICAgdGFza1RhaWwgPSB0aGlzOw0KICAgIH0NCiAgICB0aGlzLl9jYWxsID0gY2FsbGJhY2s7DQogICAgdGhpcy5fdGltZSA9IHRpbWU7DQogICAgc2xlZXAoKTsNCiAgfSwNCiAgc3RvcDogZnVuY3Rpb24oKSB7DQogICAgaWYgKHRoaXMuX2NhbGwpIHsNCiAgICAgIHRoaXMuX2NhbGwgPSBudWxsOw0KICAgICAgdGhpcy5fdGltZSA9IEluZmluaXR5Ow0KICAgICAgc2xlZXAoKTsNCiAgICB9DQogIH0NCn07DQoNCmZ1bmN0aW9uIHRpbWVyKGNhbGxiYWNrLCBkZWxheSwgdGltZSkgew0KICB2YXIgdCA9IG5ldyBUaW1lcjsNCiAgdC5yZXN0YXJ0KGNhbGxiYWNrLCBkZWxheSwgdGltZSk7DQogIHJldHVybiB0Ow0KfQ0KDQpmdW5jdGlvbiB0aW1lckZsdXNoKCkgew0KICBub3coKTsgLy8gR2V0IHRoZSBjdXJyZW50IHRpbWUsIGlmIG5vdCBhbHJlYWR5IHNldC4NCiAgKytmcmFtZTsgLy8gUHJldGVuZCB3ZeKAmXZlIHNldCBhbiBhbGFybSwgaWYgd2UgaGF2ZW7igJl0IGFscmVhZHkuDQogIHZhciB0ID0gdGFza0hlYWQsIGU7DQogIHdoaWxlICh0KSB7DQogICAgaWYgKChlID0gY2xvY2tOb3cgLSB0Ll90aW1lKSA+PSAwKSB0Ll9jYWxsLmNhbGwobnVsbCwgZSk7DQogICAgdCA9IHQuX25leHQ7DQogIH0NCiAgLS1mcmFtZTsNCn0NCg0KZnVuY3Rpb24gd2FrZSgpIHsNCiAgY2xvY2tOb3cgPSAoY2xvY2tMYXN0ID0gY2xvY2subm93KCkpICsgY2xvY2tTa2V3Ow0KICBmcmFtZSA9IHRpbWVvdXQgPSAwOw0KICB0cnkgew0KICAgIHRpbWVyRmx1c2goKTsNCiAgfSBmaW5hbGx5IHsNCiAgICBmcmFtZSA9IDA7DQogICAgbmFwKCk7DQogICAgY2xvY2tOb3cgPSAwOw0KICB9DQp9DQoNCmZ1bmN0aW9uIHBva2UoKSB7DQogIHZhciBub3cgPSBjbG9jay5ub3coKSwgZGVsYXkgPSBub3cgLSBjbG9ja0xhc3Q7DQogIGlmIChkZWxheSA+IHBva2VEZWxheSkgY2xvY2tTa2V3IC09IGRlbGF5LCBjbG9ja0xhc3QgPSBub3c7DQp9DQoNCmZ1bmN0aW9uIG5hcCgpIHsNCiAgdmFyIHQwLCB0MSA9IHRhc2tIZWFkLCB0MiwgdGltZSA9IEluZmluaXR5Ow0KICB3aGlsZSAodDEpIHsNCiAgICBpZiAodDEuX2NhbGwpIHsNCiAgICAgIGlmICh0aW1lID4gdDEuX3RpbWUpIHRpbWUgPSB0MS5fdGltZTsNCiAgICAgIHQwID0gdDEsIHQxID0gdDEuX25leHQ7DQogICAgfSBlbHNlIHsNCiAgICAgIHQyID0gdDEuX25leHQsIHQxLl9uZXh0ID0gbnVsbDsNCiAgICAgIHQxID0gdDAgPyB0MC5fbmV4dCA9IHQyIDogdGFza0hlYWQgPSB0MjsNCiAgICB9DQogIH0NCiAgdGFza1RhaWwgPSB0MDsNCiAgc2xlZXAodGltZSk7DQp9DQoNCmZ1bmN0aW9uIHNsZWVwKHRpbWUpIHsNCiAgaWYgKGZyYW1lKSByZXR1cm47IC8vIFNvb25lc3QgYWxhcm0gYWxyZWFkeSBzZXQsIG9yIHdpbGwgYmUuDQogIGlmICh0aW1lb3V0KSB0aW1lb3V0ID0gY2xlYXJUaW1lb3V0KHRpbWVvdXQpOw0KICB2YXIgZGVsYXkgPSB0aW1lIC0gY2xvY2tOb3c7DQogIGlmIChkZWxheSA+IDI0KSB7DQogICAgaWYgKHRpbWUgPCBJbmZpbml0eSkgdGltZW91dCA9IHNldFRpbWVvdXQod2FrZSwgZGVsYXkpOw0KICAgIGlmIChpbnRlcnZhbCkgaW50ZXJ2YWwgPSBjbGVhckludGVydmFsKGludGVydmFsKTsNCiAgfSBlbHNlIHsNCiAgICBpZiAoIWludGVydmFsKSBjbG9ja0xhc3QgPSBjbG9ja05vdywgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChwb2tlLCBwb2tlRGVsYXkpOw0KICAgIGZyYW1lID0gMSwgc2V0RnJhbWUod2FrZSk7DQogIH0NCn0NCg0KdmFyIHRpbWVvdXQkMSA9IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkgew0KICB2YXIgdCA9IG5ldyBUaW1lcjsNCiAgZGVsYXkgPSBkZWxheSA9PSBudWxsID8gMCA6ICtkZWxheTsNCiAgdC5yZXN0YXJ0KGZ1bmN0aW9uKGVsYXBzZWQpIHsNCiAgICB0LnN0b3AoKTsNCiAgICBjYWxsYmFjayhlbGFwc2VkICsgZGVsYXkpOw0KICB9LCBkZWxheSwgdGltZSk7DQogIHJldHVybiB0Ow0KfTsNCg0KdmFyIGludGVydmFsJDEgPSBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHsNCiAgdmFyIHQgPSBuZXcgVGltZXIsIHRvdGFsID0gZGVsYXk7DQogIGlmIChkZWxheSA9PSBudWxsKSByZXR1cm4gdC5yZXN0YXJ0KGNhbGxiYWNrLCBkZWxheSwgdGltZSksIHQ7DQogIGRlbGF5ID0gK2RlbGF5LCB0aW1lID0gdGltZSA9PSBudWxsID8gbm93KCkgOiArdGltZTsNCiAgdC5yZXN0YXJ0KGZ1bmN0aW9uIHRpY2soZWxhcHNlZCkgew0KICAgIGVsYXBzZWQgKz0gdG90YWw7DQogICAgdC5yZXN0YXJ0KHRpY2ssIHRvdGFsICs9IGRlbGF5LCB0aW1lKTsNCiAgICBjYWxsYmFjayhlbGFwc2VkKTsNCiAgfSwgZGVsYXksIHRpbWUpOw0KICByZXR1cm4gdDsNCn07DQoNCmV4cG9ydHMubm93ID0gbm93Ow0KZXhwb3J0cy50aW1lciA9IHRpbWVyOw0KZXhwb3J0cy50aW1lckZsdXNoID0gdGltZXJGbHVzaDsNCmV4cG9ydHMudGltZW91dCA9IHRpbWVvdXQkMTsNCmV4cG9ydHMuaW50ZXJ2YWwgPSBpbnRlcnZhbCQxOw0KDQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOw0KDQp9KSkpOw0KDQp9LHt9XSwxNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7DQovLyBodHRwczovL2QzanMub3JnL2QzLXRyYW5zaXRpb24vIFZlcnNpb24gMS4xLjAuIENvcHlyaWdodCAyMDE3IE1pa2UgQm9zdG9jay4NCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7DQoJdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzLCByZXF1aXJlKCdkMy1zZWxlY3Rpb24nKSwgcmVxdWlyZSgnZDMtZGlzcGF0Y2gnKSwgcmVxdWlyZSgnZDMtdGltZXInKSwgcmVxdWlyZSgnZDMtaW50ZXJwb2xhdGUnKSwgcmVxdWlyZSgnZDMtY29sb3InKSwgcmVxdWlyZSgnZDMtZWFzZScpKSA6DQoJdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cycsICdkMy1zZWxlY3Rpb24nLCAnZDMtZGlzcGF0Y2gnLCAnZDMtdGltZXInLCAnZDMtaW50ZXJwb2xhdGUnLCAnZDMtY29sb3InLCAnZDMtZWFzZSddLCBmYWN0b3J5KSA6DQoJKGZhY3RvcnkoKGdsb2JhbC5kMyA9IGdsb2JhbC5kMyB8fCB7fSksZ2xvYmFsLmQzLGdsb2JhbC5kMyxnbG9iYWwuZDMsZ2xvYmFsLmQzLGdsb2JhbC5kMyxnbG9iYWwuZDMpKTsNCn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzLGQzU2VsZWN0aW9uLGQzRGlzcGF0Y2gsZDNUaW1lcixkM0ludGVycG9sYXRlLGQzQ29sb3IsZDNFYXNlKSB7ICd1c2Ugc3RyaWN0JzsNCg0KdmFyIGVtcHR5T24gPSBkM0Rpc3BhdGNoLmRpc3BhdGNoKCJzdGFydCIsICJlbmQiLCAiaW50ZXJydXB0Iik7DQp2YXIgZW1wdHlUd2VlbiA9IFtdOw0KDQp2YXIgQ1JFQVRFRCA9IDA7DQp2YXIgU0NIRURVTEVEID0gMTsNCnZhciBTVEFSVElORyA9IDI7DQp2YXIgU1RBUlRFRCA9IDM7DQp2YXIgUlVOTklORyA9IDQ7DQp2YXIgRU5ESU5HID0gNTsNCnZhciBFTkRFRCA9IDY7DQoNCnZhciBzY2hlZHVsZSA9IGZ1bmN0aW9uKG5vZGUsIG5hbWUsIGlkLCBpbmRleCwgZ3JvdXAsIHRpbWluZykgew0KICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb247DQogIGlmICghc2NoZWR1bGVzKSBub2RlLl9fdHJhbnNpdGlvbiA9IHt9Ow0KICBlbHNlIGlmIChpZCBpbiBzY2hlZHVsZXMpIHJldHVybjsNCiAgY3JlYXRlKG5vZGUsIGlkLCB7DQogICAgbmFtZTogbmFtZSwNCiAgICBpbmRleDogaW5kZXgsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay4NCiAgICBncm91cDogZ3JvdXAsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay4NCiAgICBvbjogZW1wdHlPbiwNCiAgICB0d2VlbjogZW1wdHlUd2VlbiwNCiAgICB0aW1lOiB0aW1pbmcudGltZSwNCiAgICBkZWxheTogdGltaW5nLmRlbGF5LA0KICAgIGR1cmF0aW9uOiB0aW1pbmcuZHVyYXRpb24sDQogICAgZWFzZTogdGltaW5nLmVhc2UsDQogICAgdGltZXI6IG51bGwsDQogICAgc3RhdGU6IENSRUFURUQNCiAgfSk7DQp9Ow0KDQpmdW5jdGlvbiBpbml0KG5vZGUsIGlkKSB7DQogIHZhciBzY2hlZHVsZSA9IG5vZGUuX190cmFuc2l0aW9uOw0KICBpZiAoIXNjaGVkdWxlIHx8ICEoc2NoZWR1bGUgPSBzY2hlZHVsZVtpZF0pIHx8IHNjaGVkdWxlLnN0YXRlID4gQ1JFQVRFRCkgdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZSIpOw0KICByZXR1cm4gc2NoZWR1bGU7DQp9DQoNCmZ1bmN0aW9uIHNldChub2RlLCBpZCkgew0KICB2YXIgc2NoZWR1bGUgPSBub2RlLl9fdHJhbnNpdGlvbjsNCiAgaWYgKCFzY2hlZHVsZSB8fCAhKHNjaGVkdWxlID0gc2NoZWR1bGVbaWRdKSB8fCBzY2hlZHVsZS5zdGF0ZSA+IFNUQVJUSU5HKSB0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlIik7DQogIHJldHVybiBzY2hlZHVsZTsNCn0NCg0KZnVuY3Rpb24gZ2V0KG5vZGUsIGlkKSB7DQogIHZhciBzY2hlZHVsZSA9IG5vZGUuX190cmFuc2l0aW9uOw0KICBpZiAoIXNjaGVkdWxlIHx8ICEoc2NoZWR1bGUgPSBzY2hlZHVsZVtpZF0pKSB0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlIik7DQogIHJldHVybiBzY2hlZHVsZTsNCn0NCg0KZnVuY3Rpb24gY3JlYXRlKG5vZGUsIGlkLCBzZWxmKSB7DQogIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbiwNCiAgICAgIHR3ZWVuOw0KDQogIC8vIEluaXRpYWxpemUgdGhlIHNlbGYgdGltZXIgd2hlbiB0aGUgdHJhbnNpdGlvbiBpcyBjcmVhdGVkLg0KICAvLyBOb3RlIHRoZSBhY3R1YWwgZGVsYXkgaXMgbm90IGtub3duIHVudGlsIHRoZSBmaXJzdCBjYWxsYmFjayENCiAgc2NoZWR1bGVzW2lkXSA9IHNlbGY7DQogIHNlbGYudGltZXIgPSBkM1RpbWVyLnRpbWVyKHNjaGVkdWxlLCAwLCBzZWxmLnRpbWUpOw0KDQogIGZ1bmN0aW9uIHNjaGVkdWxlKGVsYXBzZWQpIHsNCiAgICBzZWxmLnN0YXRlID0gU0NIRURVTEVEOw0KICAgIHNlbGYudGltZXIucmVzdGFydChzdGFydCwgc2VsZi5kZWxheSwgc2VsZi50aW1lKTsNCg0KICAgIC8vIElmIHRoZSBlbGFwc2VkIGRlbGF5IGlzIGxlc3MgdGhhbiBvdXIgZmlyc3Qgc2xlZXAsIHN0YXJ0IGltbWVkaWF0ZWx5Lg0KICAgIGlmIChzZWxmLmRlbGF5IDw9IGVsYXBzZWQpIHN0YXJ0KGVsYXBzZWQgLSBzZWxmLmRlbGF5KTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHN0YXJ0KGVsYXBzZWQpIHsNCiAgICB2YXIgaSwgaiwgbiwgbzsNCg0KICAgIC8vIElmIHRoZSBzdGF0ZSBpcyBub3QgU0NIRURVTEVELCB0aGVuIHdlIHByZXZpb3VzbHkgZXJyb3JlZCBvbiBzdGFydC4NCiAgICBpZiAoc2VsZi5zdGF0ZSAhPT0gU0NIRURVTEVEKSByZXR1cm4gc3RvcCgpOw0KDQogICAgZm9yIChpIGluIHNjaGVkdWxlcykgew0KICAgICAgbyA9IHNjaGVkdWxlc1tpXTsNCiAgICAgIGlmIChvLm5hbWUgIT09IHNlbGYubmFtZSkgY29udGludWU7DQoNCiAgICAgIC8vIFdoaWxlIHRoaXMgZWxlbWVudCBhbHJlYWR5IGhhcyBhIHN0YXJ0aW5nIHRyYW5zaXRpb24gZHVyaW5nIHRoaXMgZnJhbWUsDQogICAgICAvLyBkZWZlciBzdGFydGluZyBhbiBpbnRlcnJ1cHRpbmcgdHJhbnNpdGlvbiB1bnRpbCB0aGF0IHRyYW5zaXRpb24gaGFzIGENCiAgICAgIC8vIGNoYW5jZSB0byB0aWNrIChhbmQgcG9zc2libHkgZW5kKTsgc2VlIGQzL2QzLXRyYW5zaXRpb24jNTQhDQogICAgICBpZiAoby5zdGF0ZSA9PT0gU1RBUlRFRCkgcmV0dXJuIGQzVGltZXIudGltZW91dChzdGFydCk7DQoNCiAgICAgIC8vIEludGVycnVwdCB0aGUgYWN0aXZlIHRyYW5zaXRpb24sIGlmIGFueS4NCiAgICAgIC8vIERpc3BhdGNoIHRoZSBpbnRlcnJ1cHQgZXZlbnQuDQogICAgICBpZiAoby5zdGF0ZSA9PT0gUlVOTklORykgew0KICAgICAgICBvLnN0YXRlID0gRU5ERUQ7DQogICAgICAgIG8udGltZXIuc3RvcCgpOw0KICAgICAgICBvLm9uLmNhbGwoImludGVycnVwdCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIG8uaW5kZXgsIG8uZ3JvdXApOw0KICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2ldOw0KICAgICAgfQ0KDQogICAgICAvLyBDYW5jZWwgYW55IHByZS1lbXB0ZWQgdHJhbnNpdGlvbnMuIE5vIGludGVycnVwdCBldmVudCBpcyBkaXNwYXRjaGVkDQogICAgICAvLyBiZWNhdXNlIHRoZSBjYW5jZWxsZWQgdHJhbnNpdGlvbnMgbmV2ZXIgc3RhcnRlZC4gTm90ZSB0aGF0IHRoaXMgYWxzbw0KICAgICAgLy8gcmVtb3ZlcyB0aGlzIHRyYW5zaXRpb24gZnJvbSB0aGUgcGVuZGluZyBsaXN0IQ0KICAgICAgZWxzZSBpZiAoK2kgPCBpZCkgew0KICAgICAgICBvLnN0YXRlID0gRU5ERUQ7DQogICAgICAgIG8udGltZXIuc3RvcCgpOw0KICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2ldOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIERlZmVyIHRoZSBmaXJzdCB0aWNrIHRvIGVuZCBvZiB0aGUgY3VycmVudCBmcmFtZTsgc2VlIGQzL2QzIzE1NzYuDQogICAgLy8gTm90ZSB0aGUgdHJhbnNpdGlvbiBtYXkgYmUgY2FuY2VsZWQgYWZ0ZXIgc3RhcnQgYW5kIGJlZm9yZSB0aGUgZmlyc3QgdGljayENCiAgICAvLyBOb3RlIHRoaXMgbXVzdCBiZSBzY2hlZHVsZWQgYmVmb3JlIHRoZSBzdGFydCBldmVudDsgc2VlIGQzL2QzLXRyYW5zaXRpb24jMTYhDQogICAgLy8gQXNzdW1pbmcgdGhpcyBpcyBzdWNjZXNzZnVsLCBzdWJzZXF1ZW50IGNhbGxiYWNrcyBnbyBzdHJhaWdodCB0byB0aWNrLg0KICAgIGQzVGltZXIudGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgIGlmIChzZWxmLnN0YXRlID09PSBTVEFSVEVEKSB7DQogICAgICAgIHNlbGYuc3RhdGUgPSBSVU5OSU5HOw0KICAgICAgICBzZWxmLnRpbWVyLnJlc3RhcnQodGljaywgc2VsZi5kZWxheSwgc2VsZi50aW1lKTsNCiAgICAgICAgdGljayhlbGFwc2VkKTsNCiAgICAgIH0NCiAgICB9KTsNCg0KICAgIC8vIERpc3BhdGNoIHRoZSBzdGFydCBldmVudC4NCiAgICAvLyBOb3RlIHRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgdHdlZW4gYXJlIGluaXRpYWxpemVkLg0KICAgIHNlbGYuc3RhdGUgPSBTVEFSVElORzsNCiAgICBzZWxmLm9uLmNhbGwoInN0YXJ0Iiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7DQogICAgaWYgKHNlbGYuc3RhdGUgIT09IFNUQVJUSU5HKSByZXR1cm47IC8vIGludGVycnVwdGVkDQogICAgc2VsZi5zdGF0ZSA9IFNUQVJURUQ7DQoNCiAgICAvLyBJbml0aWFsaXplIHRoZSB0d2VlbiwgZGVsZXRpbmcgbnVsbCB0d2Vlbi4NCiAgICB0d2VlbiA9IG5ldyBBcnJheShuID0gc2VsZi50d2Vlbi5sZW5ndGgpOw0KICAgIGZvciAoaSA9IDAsIGogPSAtMTsgaSA8IG47ICsraSkgew0KICAgICAgaWYgKG8gPSBzZWxmLnR3ZWVuW2ldLnZhbHVlLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCkpIHsNCiAgICAgICAgdHdlZW5bKytqXSA9IG87DQogICAgICB9DQogICAgfQ0KICAgIHR3ZWVuLmxlbmd0aCA9IGogKyAxOw0KICB9DQoNCiAgZnVuY3Rpb24gdGljayhlbGFwc2VkKSB7DQogICAgdmFyIHQgPSBlbGFwc2VkIDwgc2VsZi5kdXJhdGlvbiA/IHNlbGYuZWFzZS5jYWxsKG51bGwsIGVsYXBzZWQgLyBzZWxmLmR1cmF0aW9uKSA6IChzZWxmLnRpbWVyLnJlc3RhcnQoc3RvcCksIHNlbGYuc3RhdGUgPSBFTkRJTkcsIDEpLA0KICAgICAgICBpID0gLTEsDQogICAgICAgIG4gPSB0d2Vlbi5sZW5ndGg7DQoNCiAgICB3aGlsZSAoKytpIDwgbikgew0KICAgICAgdHdlZW5baV0uY2FsbChudWxsLCB0KTsNCiAgICB9DQoNCiAgICAvLyBEaXNwYXRjaCB0aGUgZW5kIGV2ZW50Lg0KICAgIGlmIChzZWxmLnN0YXRlID09PSBFTkRJTkcpIHsNCiAgICAgIHNlbGYub24uY2FsbCgiZW5kIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7DQogICAgICBzdG9wKCk7DQogICAgfQ0KICB9DQoNCiAgZnVuY3Rpb24gc3RvcCgpIHsNCiAgICBzZWxmLnN0YXRlID0gRU5ERUQ7DQogICAgc2VsZi50aW1lci5zdG9wKCk7DQogICAgZGVsZXRlIHNjaGVkdWxlc1tpZF07DQogICAgZm9yICh2YXIgaSBpbiBzY2hlZHVsZXMpIHJldHVybjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycw0KICAgIGRlbGV0ZSBub2RlLl9fdHJhbnNpdGlvbjsNCiAgfQ0KfQ0KDQp2YXIgaW50ZXJydXB0ID0gZnVuY3Rpb24obm9kZSwgbmFtZSkgew0KICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sDQogICAgICBzY2hlZHVsZSwNCiAgICAgIGFjdGl2ZSwNCiAgICAgIGVtcHR5ID0gdHJ1ZSwNCiAgICAgIGk7DQoNCiAgaWYgKCFzY2hlZHVsZXMpIHJldHVybjsNCg0KICBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyAiIjsNCg0KICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7DQogICAgaWYgKChzY2hlZHVsZSA9IHNjaGVkdWxlc1tpXSkubmFtZSAhPT0gbmFtZSkgeyBlbXB0eSA9IGZhbHNlOyBjb250aW51ZTsgfQ0KICAgIGFjdGl2ZSA9IHNjaGVkdWxlLnN0YXRlID4gU1RBUlRJTkcgJiYgc2NoZWR1bGUuc3RhdGUgPCBFTkRJTkc7DQogICAgc2NoZWR1bGUuc3RhdGUgPSBFTkRFRDsNCiAgICBzY2hlZHVsZS50aW1lci5zdG9wKCk7DQogICAgaWYgKGFjdGl2ZSkgc2NoZWR1bGUub24uY2FsbCgiaW50ZXJydXB0Iiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2NoZWR1bGUuaW5kZXgsIHNjaGVkdWxlLmdyb3VwKTsNCiAgICBkZWxldGUgc2NoZWR1bGVzW2ldOw0KICB9DQoNCiAgaWYgKGVtcHR5KSBkZWxldGUgbm9kZS5fX3RyYW5zaXRpb247DQp9Ow0KDQp2YXIgc2VsZWN0aW9uX2ludGVycnVwdCA9IGZ1bmN0aW9uKG5hbWUpIHsNCiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsNCiAgICBpbnRlcnJ1cHQodGhpcywgbmFtZSk7DQogIH0pOw0KfTsNCg0KZnVuY3Rpb24gdHdlZW5SZW1vdmUoaWQsIG5hbWUpIHsNCiAgdmFyIHR3ZWVuMCwgdHdlZW4xOw0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSwNCiAgICAgICAgdHdlZW4gPSBzY2hlZHVsZS50d2VlbjsNCg0KICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgdHdlZW4gd2l0aCB0aGUgcHJldmlvdXMgbm9kZSwNCiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdl4oCZcmUgZG9uZSENCiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuDQogICAgaWYgKHR3ZWVuICE9PSB0d2VlbjApIHsNCiAgICAgIHR3ZWVuMSA9IHR3ZWVuMCA9IHR3ZWVuOw0KICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0d2VlbjEubGVuZ3RoOyBpIDwgbjsgKytpKSB7DQogICAgICAgIGlmICh0d2VlbjFbaV0ubmFtZSA9PT0gbmFtZSkgew0KICAgICAgICAgIHR3ZWVuMSA9IHR3ZWVuMS5zbGljZSgpOw0KICAgICAgICAgIHR3ZWVuMS5zcGxpY2UoaSwgMSk7DQogICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQoNCiAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gdHdlZW5GdW5jdGlvbihpZCwgbmFtZSwgdmFsdWUpIHsNCiAgdmFyIHR3ZWVuMCwgdHdlZW4xOw0KICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3I7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLA0KICAgICAgICB0d2VlbiA9IHNjaGVkdWxlLnR3ZWVuOw0KDQogICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCB0d2VlbiB3aXRoIHRoZSBwcmV2aW91cyBub2RlLA0KICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCB0d2VlbiBhbmQgd2XigJlyZSBkb25lIQ0KICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS4NCiAgICBpZiAodHdlZW4gIT09IHR3ZWVuMCkgew0KICAgICAgdHdlZW4xID0gKHR3ZWVuMCA9IHR3ZWVuKS5zbGljZSgpOw0KICAgICAgZm9yICh2YXIgdCA9IHtuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWV9LCBpID0gMCwgbiA9IHR3ZWVuMS5sZW5ndGg7IGkgPCBuOyArK2kpIHsNCiAgICAgICAgaWYgKHR3ZWVuMVtpXS5uYW1lID09PSBuYW1lKSB7DQogICAgICAgICAgdHdlZW4xW2ldID0gdDsNCiAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYgKGkgPT09IG4pIHR3ZWVuMS5wdXNoKHQpOw0KICAgIH0NCg0KICAgIHNjaGVkdWxlLnR3ZWVuID0gdHdlZW4xOw0KICB9Ow0KfQ0KDQp2YXIgdHJhbnNpdGlvbl90d2VlbiA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7DQogIHZhciBpZCA9IHRoaXMuX2lkOw0KDQogIG5hbWUgKz0gIiI7DQoNCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7DQogICAgdmFyIHR3ZWVuID0gZ2V0KHRoaXMubm9kZSgpLCBpZCkudHdlZW47DQogICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0d2Vlbi5sZW5ndGgsIHQ7IGkgPCBuOyArK2kpIHsNCiAgICAgIGlmICgodCA9IHR3ZWVuW2ldKS5uYW1lID09PSBuYW1lKSB7DQogICAgICAgIHJldHVybiB0LnZhbHVlOw0KICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gbnVsbDsNCiAgfQ0KDQogIHJldHVybiB0aGlzLmVhY2goKHZhbHVlID09IG51bGwgPyB0d2VlblJlbW92ZSA6IHR3ZWVuRnVuY3Rpb24pKGlkLCBuYW1lLCB2YWx1ZSkpOw0KfTsNCg0KZnVuY3Rpb24gdHdlZW5WYWx1ZSh0cmFuc2l0aW9uLCBuYW1lLCB2YWx1ZSkgew0KICB2YXIgaWQgPSB0cmFuc2l0aW9uLl9pZDsNCg0KICB0cmFuc2l0aW9uLmVhY2goZnVuY3Rpb24oKSB7DQogICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKTsNCiAgICAoc2NoZWR1bGUudmFsdWUgfHwgKHNjaGVkdWxlLnZhbHVlID0ge30pKVtuYW1lXSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQogIH0pOw0KDQogIHJldHVybiBmdW5jdGlvbihub2RlKSB7DQogICAgcmV0dXJuIGdldChub2RlLCBpZCkudmFsdWVbbmFtZV07DQogIH07DQp9DQoNCnZhciBpbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKGEsIGIpIHsNCiAgdmFyIGM7DQogIHJldHVybiAodHlwZW9mIGIgPT09ICJudW1iZXIiID8gZDNJbnRlcnBvbGF0ZS5pbnRlcnBvbGF0ZU51bWJlcg0KICAgICAgOiBiIGluc3RhbmNlb2YgZDNDb2xvci5jb2xvciA/IGQzSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGVSZ2INCiAgICAgIDogKGMgPSBkM0NvbG9yLmNvbG9yKGIpKSA/IChiID0gYywgZDNJbnRlcnBvbGF0ZS5pbnRlcnBvbGF0ZVJnYikNCiAgICAgIDogZDNJbnRlcnBvbGF0ZS5pbnRlcnBvbGF0ZVN0cmluZykoYSwgYik7DQp9Ow0KDQpmdW5jdGlvbiBhdHRyUmVtb3ZlKG5hbWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBhdHRyUmVtb3ZlTlMoZnVsbG5hbWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gYXR0ckNvbnN0YW50KG5hbWUsIGludGVycG9sYXRlJCQxLCB2YWx1ZTEpIHsNCiAgdmFyIHZhbHVlMDAsDQogICAgICBpbnRlcnBvbGF0ZTA7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB2YXIgdmFsdWUwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7DQogICAgcmV0dXJuIHZhbHVlMCA9PT0gdmFsdWUxID8gbnVsbA0KICAgICAgICA6IHZhbHVlMCA9PT0gdmFsdWUwMCA/IGludGVycG9sYXRlMA0KICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlJCQxKHZhbHVlMDAgPSB2YWx1ZTAsIHZhbHVlMSk7DQogIH07DQp9DQoNCmZ1bmN0aW9uIGF0dHJDb25zdGFudE5TKGZ1bGxuYW1lLCBpbnRlcnBvbGF0ZSQkMSwgdmFsdWUxKSB7DQogIHZhciB2YWx1ZTAwLA0KICAgICAgaW50ZXJwb2xhdGUwOw0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdmFyIHZhbHVlMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsNCiAgICByZXR1cm4gdmFsdWUwID09PSB2YWx1ZTEgPyBudWxsDQogICAgICAgIDogdmFsdWUwID09PSB2YWx1ZTAwID8gaW50ZXJwb2xhdGUwDQogICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUkJDEodmFsdWUwMCA9IHZhbHVlMCwgdmFsdWUxKTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gYXR0ckZ1bmN0aW9uKG5hbWUsIGludGVycG9sYXRlJCQxLCB2YWx1ZSkgew0KICB2YXIgdmFsdWUwMCwNCiAgICAgIHZhbHVlMTAsDQogICAgICBpbnRlcnBvbGF0ZTA7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB2YXIgdmFsdWUwLCB2YWx1ZTEgPSB2YWx1ZSh0aGlzKTsNCiAgICBpZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOw0KICAgIHZhbHVlMCA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpOw0KICAgIHJldHVybiB2YWx1ZTAgPT09IHZhbHVlMSA/IG51bGwNCiAgICAgICAgOiB2YWx1ZTAgPT09IHZhbHVlMDAgJiYgdmFsdWUxID09PSB2YWx1ZTEwID8gaW50ZXJwb2xhdGUwDQogICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUkJDEodmFsdWUwMCA9IHZhbHVlMCwgdmFsdWUxMCA9IHZhbHVlMSk7DQogIH07DQp9DQoNCmZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TKGZ1bGxuYW1lLCBpbnRlcnBvbGF0ZSQkMSwgdmFsdWUpIHsNCiAgdmFyIHZhbHVlMDAsDQogICAgICB2YWx1ZTEwLA0KICAgICAgaW50ZXJwb2xhdGUwOw0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdmFyIHZhbHVlMCwgdmFsdWUxID0gdmFsdWUodGhpcyk7DQogICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7DQogICAgdmFsdWUwID0gdGhpcy5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpOw0KICAgIHJldHVybiB2YWx1ZTAgPT09IHZhbHVlMSA/IG51bGwNCiAgICAgICAgOiB2YWx1ZTAgPT09IHZhbHVlMDAgJiYgdmFsdWUxID09PSB2YWx1ZTEwID8gaW50ZXJwb2xhdGUwDQogICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUkJDEodmFsdWUwMCA9IHZhbHVlMCwgdmFsdWUxMCA9IHZhbHVlMSk7DQogIH07DQp9DQoNCnZhciB0cmFuc2l0aW9uX2F0dHIgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgew0KICB2YXIgZnVsbG5hbWUgPSBkM1NlbGVjdGlvbi5uYW1lc3BhY2UobmFtZSksIGkgPSBmdWxsbmFtZSA9PT0gInRyYW5zZm9ybSIgPyBkM0ludGVycG9sYXRlLmludGVycG9sYXRlVHJhbnNmb3JtU3ZnIDogaW50ZXJwb2xhdGU7DQogIHJldHVybiB0aGlzLmF0dHJUd2VlbihuYW1lLCB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiINCiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMgOiBhdHRyRnVuY3Rpb24pKGZ1bGxuYW1lLCBpLCB0d2VlblZhbHVlKHRoaXMsICJhdHRyLiIgKyBuYW1lLCB2YWx1ZSkpDQogICAgICA6IHZhbHVlID09IG51bGwgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMgOiBhdHRyUmVtb3ZlKShmdWxsbmFtZSkNCiAgICAgIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKGZ1bGxuYW1lLCBpLCB2YWx1ZSArICIiKSk7DQp9Ow0KDQpmdW5jdGlvbiBhdHRyVHdlZW5OUyhmdWxsbmFtZSwgdmFsdWUpIHsNCiAgZnVuY3Rpb24gdHdlZW4oKSB7DQogICAgdmFyIG5vZGUgPSB0aGlzLCBpID0gdmFsdWUuYXBwbHkobm9kZSwgYXJndW1lbnRzKTsNCiAgICByZXR1cm4gaSAmJiBmdW5jdGlvbih0KSB7DQogICAgICBub2RlLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgaSh0KSk7DQogICAgfTsNCiAgfQ0KICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTsNCiAgcmV0dXJuIHR3ZWVuOw0KfQ0KDQpmdW5jdGlvbiBhdHRyVHdlZW4obmFtZSwgdmFsdWUpIHsNCiAgZnVuY3Rpb24gdHdlZW4oKSB7DQogICAgdmFyIG5vZGUgPSB0aGlzLCBpID0gdmFsdWUuYXBwbHkobm9kZSwgYXJndW1lbnRzKTsNCiAgICByZXR1cm4gaSAmJiBmdW5jdGlvbih0KSB7DQogICAgICBub2RlLnNldEF0dHJpYnV0ZShuYW1lLCBpKHQpKTsNCiAgICB9Ow0KICB9DQogIHR3ZWVuLl92YWx1ZSA9IHZhbHVlOw0KICByZXR1cm4gdHdlZW47DQp9DQoNCnZhciB0cmFuc2l0aW9uX2F0dHJUd2VlbiA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7DQogIHZhciBrZXkgPSAiYXR0ci4iICsgbmFtZTsNCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTsNCiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7DQogIGlmICh0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcjsNCiAgdmFyIGZ1bGxuYW1lID0gZDNTZWxlY3Rpb24ubmFtZXNwYWNlKG5hbWUpOw0KICByZXR1cm4gdGhpcy50d2VlbihrZXksIChmdWxsbmFtZS5sb2NhbCA/IGF0dHJUd2Vlbk5TIDogYXR0clR3ZWVuKShmdWxsbmFtZSwgdmFsdWUpKTsNCn07DQoNCmZ1bmN0aW9uIGRlbGF5RnVuY3Rpb24oaWQsIHZhbHVlKSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICBpbml0KHRoaXMsIGlkKS5kZWxheSA9ICt2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBkZWxheUNvbnN0YW50KGlkLCB2YWx1ZSkgew0KICByZXR1cm4gdmFsdWUgPSArdmFsdWUsIGZ1bmN0aW9uKCkgew0KICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gdmFsdWU7DQogIH07DQp9DQoNCnZhciB0cmFuc2l0aW9uX2RlbGF5ID0gZnVuY3Rpb24odmFsdWUpIHsNCiAgdmFyIGlkID0gdGhpcy5faWQ7DQoNCiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgNCiAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiINCiAgICAgICAgICA/IGRlbGF5RnVuY3Rpb24NCiAgICAgICAgICA6IGRlbGF5Q29uc3RhbnQpKGlkLCB2YWx1ZSkpDQogICAgICA6IGdldCh0aGlzLm5vZGUoKSwgaWQpLmRlbGF5Ow0KfTsNCg0KZnVuY3Rpb24gZHVyYXRpb25GdW5jdGlvbihpZCwgdmFsdWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHNldCh0aGlzLCBpZCkuZHVyYXRpb24gPSArdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gZHVyYXRpb25Db25zdGFudChpZCwgdmFsdWUpIHsNCiAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbigpIHsNCiAgICBzZXQodGhpcywgaWQpLmR1cmF0aW9uID0gdmFsdWU7DQogIH07DQp9DQoNCnZhciB0cmFuc2l0aW9uX2R1cmF0aW9uID0gZnVuY3Rpb24odmFsdWUpIHsNCiAgdmFyIGlkID0gdGhpcy5faWQ7DQoNCiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgNCiAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiINCiAgICAgICAgICA/IGR1cmF0aW9uRnVuY3Rpb24NCiAgICAgICAgICA6IGR1cmF0aW9uQ29uc3RhbnQpKGlkLCB2YWx1ZSkpDQogICAgICA6IGdldCh0aGlzLm5vZGUoKSwgaWQpLmR1cmF0aW9uOw0KfTsNCg0KZnVuY3Rpb24gZWFzZUNvbnN0YW50KGlkLCB2YWx1ZSkgew0KICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3I7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICBzZXQodGhpcywgaWQpLmVhc2UgPSB2YWx1ZTsNCiAgfTsNCn0NCg0KdmFyIHRyYW5zaXRpb25fZWFzZSA9IGZ1bmN0aW9uKHZhbHVlKSB7DQogIHZhciBpZCA9IHRoaXMuX2lkOw0KDQogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoDQogICAgICA/IHRoaXMuZWFjaChlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSkNCiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZWFzZTsNCn07DQoNCnZhciB0cmFuc2l0aW9uX2ZpbHRlciA9IGZ1bmN0aW9uKG1hdGNoKSB7DQogIGlmICh0eXBlb2YgbWF0Y2ggIT09ICJmdW5jdGlvbiIpIG1hdGNoID0gZDNTZWxlY3Rpb24ubWF0Y2hlcihtYXRjaCk7DQoNCiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgew0KICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IFtdLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgew0KICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7DQogICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgdGhpcy5fbmFtZSwgdGhpcy5faWQpOw0KfTsNCg0KdmFyIHRyYW5zaXRpb25fbWVyZ2UgPSBmdW5jdGlvbih0cmFuc2l0aW9uKSB7DQogIGlmICh0cmFuc2l0aW9uLl9pZCAhPT0gdGhpcy5faWQpIHRocm93IG5ldyBFcnJvcjsNCg0KICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gdHJhbnNpdGlvbi5fZ3JvdXBzLCBtMCA9IGdyb3VwczAubGVuZ3RoLCBtMSA9IGdyb3VwczEubGVuZ3RoLCBtID0gTWF0aC5taW4obTAsIG0xKSwgbWVyZ2VzID0gbmV3IEFycmF5KG0wKSwgaiA9IDA7IGogPCBtOyArK2opIHsNCiAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgICBpZiAobm9kZSA9IGdyb3VwMFtpXSB8fCBncm91cDFbaV0pIHsNCiAgICAgICAgbWVyZ2VbaV0gPSBub2RlOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIGZvciAoOyBqIDwgbTA7ICsraikgew0KICAgIG1lcmdlc1tqXSA9IGdyb3VwczBbal07DQogIH0NCg0KICByZXR1cm4gbmV3IFRyYW5zaXRpb24obWVyZ2VzLCB0aGlzLl9wYXJlbnRzLCB0aGlzLl9uYW1lLCB0aGlzLl9pZCk7DQp9Ow0KDQpmdW5jdGlvbiBzdGFydChuYW1lKSB7DQogIHJldHVybiAobmFtZSArICIiKS50cmltKCkuc3BsaXQoL158XHMrLykuZXZlcnkoZnVuY3Rpb24odCkgew0KICAgIHZhciBpID0gdC5pbmRleE9mKCIuIik7DQogICAgaWYgKGkgPj0gMCkgdCA9IHQuc2xpY2UoMCwgaSk7DQogICAgcmV0dXJuICF0IHx8IHQgPT09ICJzdGFydCI7DQogIH0pOw0KfQ0KDQpmdW5jdGlvbiBvbkZ1bmN0aW9uKGlkLCBuYW1lLCBsaXN0ZW5lcikgew0KICB2YXIgb24wLCBvbjEsIHNpdCA9IHN0YXJ0KG5hbWUpID8gaW5pdCA6IHNldDsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHZhciBzY2hlZHVsZSA9IHNpdCh0aGlzLCBpZCksDQogICAgICAgIG9uID0gc2NoZWR1bGUub247DQoNCiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSwNCiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSENCiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuDQogICAgaWYgKG9uICE9PSBvbjApIChvbjEgPSAob24wID0gb24pLmNvcHkoKSkub24obmFtZSwgbGlzdGVuZXIpOw0KDQogICAgc2NoZWR1bGUub24gPSBvbjE7DQogIH07DQp9DQoNCnZhciB0cmFuc2l0aW9uX29uID0gZnVuY3Rpb24obmFtZSwgbGlzdGVuZXIpIHsNCiAgdmFyIGlkID0gdGhpcy5faWQ7DQoNCiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyDQogICAgICA/IGdldCh0aGlzLm5vZGUoKSwgaWQpLm9uLm9uKG5hbWUpDQogICAgICA6IHRoaXMuZWFjaChvbkZ1bmN0aW9uKGlkLCBuYW1lLCBsaXN0ZW5lcikpOw0KfTsNCg0KZnVuY3Rpb24gcmVtb3ZlRnVuY3Rpb24oaWQpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7DQogICAgZm9yICh2YXIgaSBpbiB0aGlzLl9fdHJhbnNpdGlvbikgaWYgKCtpICE9PSBpZCkgcmV0dXJuOw0KICAgIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTsNCiAgfTsNCn0NCg0KdmFyIHRyYW5zaXRpb25fcmVtb3ZlID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiB0aGlzLm9uKCJlbmQucmVtb3ZlIiwgcmVtb3ZlRnVuY3Rpb24odGhpcy5faWQpKTsNCn07DQoNCnZhciB0cmFuc2l0aW9uX3NlbGVjdCA9IGZ1bmN0aW9uKHNlbGVjdCkgew0KICB2YXIgbmFtZSA9IHRoaXMuX25hbWUsDQogICAgICBpZCA9IHRoaXMuX2lkOw0KDQogIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBkM1NlbGVjdGlvbi5zZWxlY3RvcihzZWxlY3QpOw0KDQogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsNCiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7DQogICAgICAgIGlmICgiX19kYXRhX18iIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fOw0KICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7DQogICAgICAgIHNjaGVkdWxlKHN1Ymdyb3VwW2ldLCBuYW1lLCBpZCwgaSwgc3ViZ3JvdXAsIGdldChub2RlLCBpZCkpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTsNCn07DQoNCnZhciB0cmFuc2l0aW9uX3NlbGVjdEFsbCA9IGZ1bmN0aW9uKHNlbGVjdCkgew0KICB2YXIgbmFtZSA9IHRoaXMuX25hbWUsDQogICAgICBpZCA9IHRoaXMuX2lkOw0KDQogIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBkM1NlbGVjdGlvbi5zZWxlY3RvckFsbChzZWxlY3QpOw0KDQogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7DQogICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7DQogICAgICAgIGZvciAodmFyIGNoaWxkcmVuID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApLCBjaGlsZCwgaW5oZXJpdCA9IGdldChub2RlLCBpZCksIGsgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBrIDwgbDsgKytrKSB7DQogICAgICAgICAgaWYgKGNoaWxkID0gY2hpbGRyZW5ba10pIHsNCiAgICAgICAgICAgIHNjaGVkdWxlKGNoaWxkLCBuYW1lLCBpZCwgaywgY2hpbGRyZW4sIGluaGVyaXQpOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBzdWJncm91cHMucHVzaChjaGlsZHJlbik7DQogICAgICAgIHBhcmVudHMucHVzaChub2RlKTsNCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCBwYXJlbnRzLCBuYW1lLCBpZCk7DQp9Ow0KDQp2YXIgU2VsZWN0aW9uID0gZDNTZWxlY3Rpb24uc2VsZWN0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvcjsNCg0KdmFyIHRyYW5zaXRpb25fc2VsZWN0aW9uID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2dyb3VwcywgdGhpcy5fcGFyZW50cyk7DQp9Ow0KDQpmdW5jdGlvbiBzdHlsZVJlbW92ZShuYW1lLCBpbnRlcnBvbGF0ZSQkMSkgew0KICB2YXIgdmFsdWUwMCwNCiAgICAgIHZhbHVlMTAsDQogICAgICBpbnRlcnBvbGF0ZTA7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB2YXIgdmFsdWUwID0gZDNTZWxlY3Rpb24uc3R5bGUodGhpcywgbmFtZSksDQogICAgICAgIHZhbHVlMSA9ICh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpLCBkM1NlbGVjdGlvbi5zdHlsZSh0aGlzLCBuYW1lKSk7DQogICAgcmV0dXJuIHZhbHVlMCA9PT0gdmFsdWUxID8gbnVsbA0KICAgICAgICA6IHZhbHVlMCA9PT0gdmFsdWUwMCAmJiB2YWx1ZTEgPT09IHZhbHVlMTAgPyBpbnRlcnBvbGF0ZTANCiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZSQkMSh2YWx1ZTAwID0gdmFsdWUwLCB2YWx1ZTEwID0gdmFsdWUxKTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gc3R5bGVSZW1vdmVFbmQobmFtZSkgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gc3R5bGVDb25zdGFudChuYW1lLCBpbnRlcnBvbGF0ZSQkMSwgdmFsdWUxKSB7DQogIHZhciB2YWx1ZTAwLA0KICAgICAgaW50ZXJwb2xhdGUwOw0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdmFyIHZhbHVlMCA9IGQzU2VsZWN0aW9uLnN0eWxlKHRoaXMsIG5hbWUpOw0KICAgIHJldHVybiB2YWx1ZTAgPT09IHZhbHVlMSA/IG51bGwNCiAgICAgICAgOiB2YWx1ZTAgPT09IHZhbHVlMDAgPyBpbnRlcnBvbGF0ZTANCiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZSQkMSh2YWx1ZTAwID0gdmFsdWUwLCB2YWx1ZTEpOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBzdHlsZUZ1bmN0aW9uKG5hbWUsIGludGVycG9sYXRlJCQxLCB2YWx1ZSkgew0KICB2YXIgdmFsdWUwMCwNCiAgICAgIHZhbHVlMTAsDQogICAgICBpbnRlcnBvbGF0ZTA7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB2YXIgdmFsdWUwID0gZDNTZWxlY3Rpb24uc3R5bGUodGhpcywgbmFtZSksDQogICAgICAgIHZhbHVlMSA9IHZhbHVlKHRoaXMpOw0KICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgdmFsdWUxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIGQzU2VsZWN0aW9uLnN0eWxlKHRoaXMsIG5hbWUpKTsNCiAgICByZXR1cm4gdmFsdWUwID09PSB2YWx1ZTEgPyBudWxsDQogICAgICAgIDogdmFsdWUwID09PSB2YWx1ZTAwICYmIHZhbHVlMSA9PT0gdmFsdWUxMCA/IGludGVycG9sYXRlMA0KICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlJCQxKHZhbHVlMDAgPSB2YWx1ZTAsIHZhbHVlMTAgPSB2YWx1ZTEpOw0KICB9Ow0KfQ0KDQp2YXIgdHJhbnNpdGlvbl9zdHlsZSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgew0KICB2YXIgaSA9IChuYW1lICs9ICIiKSA9PT0gInRyYW5zZm9ybSIgPyBkM0ludGVycG9sYXRlLmludGVycG9sYXRlVHJhbnNmb3JtQ3NzIDogaW50ZXJwb2xhdGU7DQogIHJldHVybiB2YWx1ZSA9PSBudWxsID8gdGhpcw0KICAgICAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlUmVtb3ZlKG5hbWUsIGkpKQ0KICAgICAgICAgIC5vbigiZW5kLnN0eWxlLiIgKyBuYW1lLCBzdHlsZVJlbW92ZUVuZChuYW1lKSkNCiAgICAgIDogdGhpcy5zdHlsZVR3ZWVuKG5hbWUsIHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIg0KICAgICAgICAgID8gc3R5bGVGdW5jdGlvbihuYW1lLCBpLCB0d2VlblZhbHVlKHRoaXMsICJzdHlsZS4iICsgbmFtZSwgdmFsdWUpKQ0KICAgICAgICAgIDogc3R5bGVDb25zdGFudChuYW1lLCBpLCB2YWx1ZSArICIiKSwgcHJpb3JpdHkpOw0KfTsNCg0KZnVuY3Rpb24gc3R5bGVUd2VlbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsNCiAgZnVuY3Rpb24gdHdlZW4oKSB7DQogICAgdmFyIG5vZGUgPSB0aGlzLCBpID0gdmFsdWUuYXBwbHkobm9kZSwgYXJndW1lbnRzKTsNCiAgICByZXR1cm4gaSAmJiBmdW5jdGlvbih0KSB7DQogICAgICBub2RlLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIGkodCksIHByaW9yaXR5KTsNCiAgICB9Ow0KICB9DQogIHR3ZWVuLl92YWx1ZSA9IHZhbHVlOw0KICByZXR1cm4gdHdlZW47DQp9DQoNCnZhciB0cmFuc2l0aW9uX3N0eWxlVHdlZW4gPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsNCiAgdmFyIGtleSA9ICJzdHlsZS4iICsgKG5hbWUgKz0gIiIpOw0KICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlOw0KICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTsNCiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yOw0KICByZXR1cm4gdGhpcy50d2VlbihrZXksIHN0eWxlVHdlZW4obmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyAiIiA6IHByaW9yaXR5KSk7DQp9Ow0KDQpmdW5jdGlvbiB0ZXh0Q29uc3RhbnQodmFsdWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gdGV4dEZ1bmN0aW9uKHZhbHVlKSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB2YXIgdmFsdWUxID0gdmFsdWUodGhpcyk7DQogICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlMSA9PSBudWxsID8gIiIgOiB2YWx1ZTE7DQogIH07DQp9DQoNCnZhciB0cmFuc2l0aW9uX3RleHQgPSBmdW5jdGlvbih2YWx1ZSkgew0KICByZXR1cm4gdGhpcy50d2VlbigidGV4dCIsIHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIg0KICAgICAgPyB0ZXh0RnVuY3Rpb24odHdlZW5WYWx1ZSh0aGlzLCAidGV4dCIsIHZhbHVlKSkNCiAgICAgIDogdGV4dENvbnN0YW50KHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlICsgIiIpKTsNCn07DQoNCnZhciB0cmFuc2l0aW9uX3RyYW5zaXRpb24gPSBmdW5jdGlvbigpIHsNCiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLA0KICAgICAgaWQwID0gdGhpcy5faWQsDQogICAgICBpZDEgPSBuZXdJZCgpOw0KDQogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7DQogICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7DQogICAgICAgIHZhciBpbmhlcml0ID0gZ2V0KG5vZGUsIGlkMCk7DQogICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkMSwgaSwgZ3JvdXAsIHsNCiAgICAgICAgICB0aW1lOiBpbmhlcml0LnRpbWUgKyBpbmhlcml0LmRlbGF5ICsgaW5oZXJpdC5kdXJhdGlvbiwNCiAgICAgICAgICBkZWxheTogMCwNCiAgICAgICAgICBkdXJhdGlvbjogaW5oZXJpdC5kdXJhdGlvbiwNCiAgICAgICAgICBlYXNlOiBpbmhlcml0LmVhc2UNCiAgICAgICAgfSk7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKGdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQxKTsNCn07DQoNCnZhciBpZCA9IDA7DQoNCmZ1bmN0aW9uIFRyYW5zaXRpb24oZ3JvdXBzLCBwYXJlbnRzLCBuYW1lLCBpZCkgew0KICB0aGlzLl9ncm91cHMgPSBncm91cHM7DQogIHRoaXMuX3BhcmVudHMgPSBwYXJlbnRzOw0KICB0aGlzLl9uYW1lID0gbmFtZTsNCiAgdGhpcy5faWQgPSBpZDsNCn0NCg0KZnVuY3Rpb24gdHJhbnNpdGlvbihuYW1lKSB7DQogIHJldHVybiBkM1NlbGVjdGlvbi5zZWxlY3Rpb24oKS50cmFuc2l0aW9uKG5hbWUpOw0KfQ0KDQpmdW5jdGlvbiBuZXdJZCgpIHsNCiAgcmV0dXJuICsraWQ7DQp9DQoNCnZhciBzZWxlY3Rpb25fcHJvdG90eXBlID0gZDNTZWxlY3Rpb24uc2VsZWN0aW9uLnByb3RvdHlwZTsNCg0KVHJhbnNpdGlvbi5wcm90b3R5cGUgPSB0cmFuc2l0aW9uLnByb3RvdHlwZSA9IHsNCiAgY29uc3RydWN0b3I6IFRyYW5zaXRpb24sDQogIHNlbGVjdDogdHJhbnNpdGlvbl9zZWxlY3QsDQogIHNlbGVjdEFsbDogdHJhbnNpdGlvbl9zZWxlY3RBbGwsDQogIGZpbHRlcjogdHJhbnNpdGlvbl9maWx0ZXIsDQogIG1lcmdlOiB0cmFuc2l0aW9uX21lcmdlLA0KICBzZWxlY3Rpb246IHRyYW5zaXRpb25fc2VsZWN0aW9uLA0KICB0cmFuc2l0aW9uOiB0cmFuc2l0aW9uX3RyYW5zaXRpb24sDQogIGNhbGw6IHNlbGVjdGlvbl9wcm90b3R5cGUuY2FsbCwNCiAgbm9kZXM6IHNlbGVjdGlvbl9wcm90b3R5cGUubm9kZXMsDQogIG5vZGU6IHNlbGVjdGlvbl9wcm90b3R5cGUubm9kZSwNCiAgc2l6ZTogc2VsZWN0aW9uX3Byb3RvdHlwZS5zaXplLA0KICBlbXB0eTogc2VsZWN0aW9uX3Byb3RvdHlwZS5lbXB0eSwNCiAgZWFjaDogc2VsZWN0aW9uX3Byb3RvdHlwZS5lYWNoLA0KICBvbjogdHJhbnNpdGlvbl9vbiwNCiAgYXR0cjogdHJhbnNpdGlvbl9hdHRyLA0KICBhdHRyVHdlZW46IHRyYW5zaXRpb25fYXR0clR3ZWVuLA0KICBzdHlsZTogdHJhbnNpdGlvbl9zdHlsZSwNCiAgc3R5bGVUd2VlbjogdHJhbnNpdGlvbl9zdHlsZVR3ZWVuLA0KICB0ZXh0OiB0cmFuc2l0aW9uX3RleHQsDQogIHJlbW92ZTogdHJhbnNpdGlvbl9yZW1vdmUsDQogIHR3ZWVuOiB0cmFuc2l0aW9uX3R3ZWVuLA0KICBkZWxheTogdHJhbnNpdGlvbl9kZWxheSwNCiAgZHVyYXRpb246IHRyYW5zaXRpb25fZHVyYXRpb24sDQogIGVhc2U6IHRyYW5zaXRpb25fZWFzZQ0KfTsNCg0KdmFyIGRlZmF1bHRUaW1pbmcgPSB7DQogIHRpbWU6IG51bGwsIC8vIFNldCBvbiB1c2UuDQogIGRlbGF5OiAwLA0KICBkdXJhdGlvbjogMjUwLA0KICBlYXNlOiBkM0Vhc2UuZWFzZUN1YmljSW5PdXQNCn07DQoNCmZ1bmN0aW9uIGluaGVyaXQobm9kZSwgaWQpIHsNCiAgdmFyIHRpbWluZzsNCiAgd2hpbGUgKCEodGltaW5nID0gbm9kZS5fX3RyYW5zaXRpb24pIHx8ICEodGltaW5nID0gdGltaW5nW2lkXSkpIHsNCiAgICBpZiAoIShub2RlID0gbm9kZS5wYXJlbnROb2RlKSkgew0KICAgICAgcmV0dXJuIGRlZmF1bHRUaW1pbmcudGltZSA9IGQzVGltZXIubm93KCksIGRlZmF1bHRUaW1pbmc7DQogICAgfQ0KICB9DQogIHJldHVybiB0aW1pbmc7DQp9DQoNCnZhciBzZWxlY3Rpb25fdHJhbnNpdGlvbiA9IGZ1bmN0aW9uKG5hbWUpIHsNCiAgdmFyIGlkLA0KICAgICAgdGltaW5nOw0KDQogIGlmIChuYW1lIGluc3RhbmNlb2YgVHJhbnNpdGlvbikgew0KICAgIGlkID0gbmFtZS5faWQsIG5hbWUgPSBuYW1lLl9uYW1lOw0KICB9IGVsc2Ugew0KICAgIGlkID0gbmV3SWQoKSwgKHRpbWluZyA9IGRlZmF1bHRUaW1pbmcpLnRpbWUgPSBkM1RpbWVyLm5vdygpLCBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyAiIjsNCiAgfQ0KDQogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7DQogICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7DQogICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkLCBpLCBncm91cCwgdGltaW5nIHx8IGluaGVyaXQobm9kZSwgaWQpKTsNCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICByZXR1cm4gbmV3IFRyYW5zaXRpb24oZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZCk7DQp9Ow0KDQpkM1NlbGVjdGlvbi5zZWxlY3Rpb24ucHJvdG90eXBlLmludGVycnVwdCA9IHNlbGVjdGlvbl9pbnRlcnJ1cHQ7DQpkM1NlbGVjdGlvbi5zZWxlY3Rpb24ucHJvdG90eXBlLnRyYW5zaXRpb24gPSBzZWxlY3Rpb25fdHJhbnNpdGlvbjsNCg0KdmFyIHJvb3QgPSBbbnVsbF07DQoNCnZhciBhY3RpdmUgPSBmdW5jdGlvbihub2RlLCBuYW1lKSB7DQogIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbiwNCiAgICAgIHNjaGVkdWxlLA0KICAgICAgaTsNCg0KICBpZiAoc2NoZWR1bGVzKSB7DQogICAgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgIiI7DQogICAgZm9yIChpIGluIHNjaGVkdWxlcykgew0KICAgICAgaWYgKChzY2hlZHVsZSA9IHNjaGVkdWxlc1tpXSkuc3RhdGUgPiBTQ0hFRFVMRUQgJiYgc2NoZWR1bGUubmFtZSA9PT0gbmFtZSkgew0KICAgICAgICByZXR1cm4gbmV3IFRyYW5zaXRpb24oW1tub2RlXV0sIHJvb3QsIG5hbWUsICtpKTsNCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICByZXR1cm4gbnVsbDsNCn07DQoNCmV4cG9ydHMudHJhbnNpdGlvbiA9IHRyYW5zaXRpb247DQpleHBvcnRzLmFjdGl2ZSA9IGFjdGl2ZTsNCmV4cG9ydHMuaW50ZXJydXB0ID0gaW50ZXJydXB0Ow0KDQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOw0KDQp9KSkpOw0KDQp9LHsiZDMtY29sb3IiOjQsImQzLWRpc3BhdGNoIjo1LCJkMy1lYXNlIjo2LCJkMy1pbnRlcnBvbGF0ZSI6OSwiZDMtc2VsZWN0aW9uIjoxMiwiZDMtdGltZXIiOjE2fV19LHt9LFsxXSk7DQo="></script>
<script src="data:application/x-javascript;base64,Ly8gaHR0cHM6Ly9kM2pzLm9yZyBWZXJzaW9uIDQuOS4xLiBDb3B5cmlnaHQgMjAxNyBNaWtlIEJvc3RvY2suCihmdW5jdGlvbih0LG4peyJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGU/bihleHBvcnRzKToiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImV4cG9ydHMiXSxuKTpuKHQuZDM9dC5kM3x8e30pfSkodGhpcyxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXtyZXR1cm4ganModChuKSxlKX19ZnVuY3Rpb24gZSh0LG4pe3JldHVyblt0LG5dfWZ1bmN0aW9uIHIodCxuLGUpe3ZhciByPShuLXQpL01hdGgubWF4KDAsZSksaT1NYXRoLmZsb29yKE1hdGgubG9nKHIpL01hdGguTE4xMCksbz1yL01hdGgucG93KDEwLGkpO3JldHVybiBpPj0wPyhvPj1zZj8xMDpvPj1mZj81Om8+PWxmPzI6MSkqTWF0aC5wb3coMTAsaSk6LU1hdGgucG93KDEwLC1pKS8obz49c2Y/MTA6bz49ZmY/NTpvPj1sZj8yOjEpfWZ1bmN0aW9uIGkodCxuLGUpe3ZhciByPU1hdGguYWJzKG4tdCkvTWF0aC5tYXgoMCxlKSxpPU1hdGgucG93KDEwLE1hdGguZmxvb3IoTWF0aC5sb2cocikvTWF0aC5MTjEwKSksbz1yL2k7cmV0dXJuIG8+PXNmP2kqPTEwOm8+PWZmP2kqPTU6bz49bGYmJihpKj0yKSxuPHQ/LWk6aX1mdW5jdGlvbiBvKHQpe3JldHVybiB0Lmxlbmd0aH1mdW5jdGlvbiB1KHQpe3JldHVybiJ0cmFuc2xhdGUoIisodCsuNSkrIiwwKSJ9ZnVuY3Rpb24gYSh0KXtyZXR1cm4idHJhbnNsYXRlKDAsIisodCsuNSkrIikifWZ1bmN0aW9uIGModCl7dmFyIG49TWF0aC5tYXgoMCx0LmJhbmR3aWR0aCgpLTEpLzI7cmV0dXJuIHQucm91bmQoKSYmKG49TWF0aC5yb3VuZChuKSksZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSkrbn19ZnVuY3Rpb24gcygpe3JldHVybiF0aGlzLl9fYXhpc31mdW5jdGlvbiBmKHQsbil7ZnVuY3Rpb24gZShlKXt2YXIgdT1udWxsPT1pP24udGlja3M/bi50aWNrcy5hcHBseShuLHIpOm4uZG9tYWluKCk6aSxhPW51bGw9PW8/bi50aWNrRm9ybWF0P24udGlja0Zvcm1hdC5hcHBseShuLHIpOkNmOm8sXz1NYXRoLm1heChmLDApK2gseT1uLnJhbmdlKCksZz15WzBdKy41LG09eVt5Lmxlbmd0aC0xXSsuNSx4PShuLmJhbmR3aWR0aD9jOkNmKShuLmNvcHkoKSksYj1lLnNlbGVjdGlvbj9lLnNlbGVjdGlvbigpOmUsdz1iLnNlbGVjdEFsbCgiLmRvbWFpbiIpLmRhdGEoW251bGxdKSxNPWIuc2VsZWN0QWxsKCIudGljayIpLmRhdGEodSxuKS5vcmRlcigpLFQ9TS5leGl0KCksaz1NLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJ0aWNrIiksTj1NLnNlbGVjdCgibGluZSIpLFM9TS5zZWxlY3QoInRleHQiKTt3PXcubWVyZ2Uody5lbnRlcigpLmluc2VydCgicGF0aCIsIi50aWNrIikuYXR0cigiY2xhc3MiLCJkb21haW4iKS5hdHRyKCJzdHJva2UiLCIjMDAwIikpLE09TS5tZXJnZShrKSxOPU4ubWVyZ2Uoay5hcHBlbmQoImxpbmUiKS5hdHRyKCJzdHJva2UiLCIjMDAwIikuYXR0cihkKyIyIixwKmYpKSxTPVMubWVyZ2Uoay5hcHBlbmQoInRleHQiKS5hdHRyKCJmaWxsIiwiIzAwMCIpLmF0dHIoZCxwKl8pLmF0dHIoImR5Iix0PT09emY/IjBlbSI6dD09PUxmPyIwLjcxZW0iOiIwLjMyZW0iKSksZSE9PWImJih3PXcudHJhbnNpdGlvbihlKSxNPU0udHJhbnNpdGlvbihlKSxOPU4udHJhbnNpdGlvbihlKSxTPVMudHJhbnNpdGlvbihlKSxUPVQudHJhbnNpdGlvbihlKS5hdHRyKCJvcGFjaXR5IixxZikuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD14KHQpKT92KHQpOnRoaXMuZ2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iKX0pLGsuYXR0cigib3BhY2l0eSIscWYpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7dmFyIG49dGhpcy5wYXJlbnROb2RlLl9fYXhpcztyZXR1cm4gdihuJiZpc0Zpbml0ZShuPW4odCkpP246eCh0KSl9KSksVC5yZW1vdmUoKSx3LmF0dHIoImQiLHQ9PT1SZnx8dD09UGY/Ik0iK3AqbCsiLCIrZysiSDAuNVYiK20rIkgiK3AqbDoiTSIrZysiLCIrcCpsKyJWMC41SCIrbSsiViIrcCpsKSxNLmF0dHIoIm9wYWNpdHkiLDEpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7cmV0dXJuIHYoeCh0KSl9KSxOLmF0dHIoZCsiMiIscCpmKSxTLmF0dHIoZCxwKl8pLnRleHQoYSksYi5maWx0ZXIocykuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJmb250LXNpemUiLDEwKS5hdHRyKCJmb250LWZhbWlseSIsInNhbnMtc2VyaWYiKS5hdHRyKCJ0ZXh0LWFuY2hvciIsdD09PVBmPyJzdGFydCI6dD09PVJmPyJlbmQiOiJtaWRkbGUiKSxiLmVhY2goZnVuY3Rpb24oKXt0aGlzLl9fYXhpcz14fSl9dmFyIHI9W10saT1udWxsLG89bnVsbCxmPTYsbD02LGg9MyxwPXQ9PT16Znx8dD09PVJmPy0xOjEsZD10PT09UmZ8fHQ9PT1QZj8ieCI6InkiLHY9dD09PXpmfHx0PT09TGY/dTphO3JldHVybiBlLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsZSk6bn0sZS50aWNrcz1mdW5jdGlvbigpe3JldHVybiByPUFmLmNhbGwoYXJndW1lbnRzKSxlfSxlLnRpY2tBcmd1bWVudHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09dD9bXTpBZi5jYWxsKHQpLGUpOnIuc2xpY2UoKX0sZS50aWNrVmFsdWVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PXQ/bnVsbDpBZi5jYWxsKHQpLGUpOmkmJmkuc2xpY2UoKX0sZS50aWNrRm9ybWF0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXQsZSk6b30sZS50aWNrU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1sPSt0LGUpOmZ9LGUudGlja1NpemVJbm5lcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0rdCxlKTpmfSxlLnRpY2tTaXplT3V0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9K3QsZSk6bH0sZS50aWNrUGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rdCxlKTpofSxlfWZ1bmN0aW9uIGwodCl7cmV0dXJuIGYoemYsdCl9ZnVuY3Rpb24gaCh0KXtyZXR1cm4gZihQZix0KX1mdW5jdGlvbiBwKHQpe3JldHVybiBmKExmLHQpfWZ1bmN0aW9uIGQodCl7cmV0dXJuIGYoUmYsdCl9ZnVuY3Rpb24gdigpe2Zvcih2YXIgdCxuPTAsZT1hcmd1bWVudHMubGVuZ3RoLHI9e307bjxlOysrbil7aWYoISh0PWFyZ3VtZW50c1tuXSsiIil8fHQgaW4gcil0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgdHlwZTogIit0KTtyW3RdPVtdfXJldHVybiBuZXcgXyhyKX1mdW5jdGlvbiBfKHQpe3RoaXMuXz10fWZ1bmN0aW9uIHkodCxuKXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLykubWFwKGZ1bmN0aW9uKHQpe3ZhciBlPSIiLHI9dC5pbmRleE9mKCIuIik7aWYocj49MCYmKGU9dC5zbGljZShyKzEpLHQ9dC5zbGljZSgwLHIpKSx0JiYhbi5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtyZXR1cm57dHlwZTp0LG5hbWU6ZX19KX1mdW5jdGlvbiBnKHQsbil7Zm9yKHZhciBlLHI9MCxpPXQubGVuZ3RoO3I8aTsrK3IpaWYoKGU9dFtyXSkubmFtZT09PW4pcmV0dXJuIGUudmFsdWV9ZnVuY3Rpb24gbSh0LG4sZSl7Zm9yKHZhciByPTAsaT10Lmxlbmd0aDtyPGk7KytyKWlmKHRbcl0ubmFtZT09PW4pe3Rbcl09VWYsdD10LnNsaWNlKDAscikuY29uY2F0KHQuc2xpY2UocisxKSk7YnJlYWt9cmV0dXJuIG51bGwhPWUmJnQucHVzaCh7bmFtZTpuLHZhbHVlOmV9KSx0fWZ1bmN0aW9uIHgodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dGhpcy5vd25lckRvY3VtZW50LGU9dGhpcy5uYW1lc3BhY2VVUkk7cmV0dXJuIGU9PT1EZiYmbi5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJPT09RGY/bi5jcmVhdGVFbGVtZW50KHQpOm4uY3JlYXRlRWxlbWVudE5TKGUsdCl9fWZ1bmN0aW9uIGIodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gdygpe3JldHVybiBuZXcgTX1mdW5jdGlvbiBNKCl7dGhpcy5fPSJAIisoKytZZikudG9TdHJpbmcoMzYpfWZ1bmN0aW9uIFQodCxuLGUpe3JldHVybiB0PWsodCxuLGUpLGZ1bmN0aW9uKG4pe3ZhciBlPW4ucmVsYXRlZFRhcmdldDtlJiYoZT09PXRoaXN8fDgmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzKSl8fHQuY2FsbCh0aGlzLG4pfX1mdW5jdGlvbiBrKG4sZSxyKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIG89dC5ldmVudDt0LmV2ZW50PWk7dHJ5e24uY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sZSxyKX1maW5hbGx5e3QuZXZlbnQ9b319fWZ1bmN0aW9uIE4odCl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcChmdW5jdGlvbih0KXt2YXIgbj0iIixlPXQuaW5kZXhPZigiLiIpO3JldHVybiBlPj0wJiYobj10LnNsaWNlKGUrMSksdD10LnNsaWNlKDAsZSkpLHt0eXBlOnQsbmFtZTpufX0pfWZ1bmN0aW9uIFModCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dGhpcy5fX29uO2lmKG4pe2Zvcih2YXIgZSxyPTAsaT0tMSxvPW4ubGVuZ3RoO3I8bzsrK3IpZT1uW3JdLHQudHlwZSYmZS50eXBlIT09dC50eXBlfHxlLm5hbWUhPT10Lm5hbWU/blsrK2ldPWU6dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGUudHlwZSxlLmxpc3RlbmVyLGUuY2FwdHVyZSk7KytpP24ubGVuZ3RoPWk6ZGVsZXRlIHRoaXMuX19vbn19fWZ1bmN0aW9uIEUodCxuLGUpe3ZhciByPSRmLmhhc093blByb3BlcnR5KHQudHlwZSk/VDprO3JldHVybiBmdW5jdGlvbihpLG8sdSl7dmFyIGEsYz10aGlzLl9fb24scz1yKG4sbyx1KTtpZihjKWZvcih2YXIgZj0wLGw9Yy5sZW5ndGg7ZjxsOysrZilpZigoYT1jW2ZdKS50eXBlPT09dC50eXBlJiZhLm5hbWU9PT10Lm5hbWUpcmV0dXJuIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLnR5cGUsYS5saXN0ZW5lcixhLmNhcHR1cmUpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihhLnR5cGUsYS5saXN0ZW5lcj1zLGEuY2FwdHVyZT1lKSx2b2lkKGEudmFsdWU9bik7dGhpcy5hZGRFdmVudExpc3RlbmVyKHQudHlwZSxzLGUpLGE9e3R5cGU6dC50eXBlLG5hbWU6dC5uYW1lLHZhbHVlOm4sbGlzdGVuZXI6cyxjYXB0dXJlOmV9LGM/Yy5wdXNoKGEpOnRoaXMuX19vbj1bYV19fWZ1bmN0aW9uIEEobixlLHIsaSl7dmFyIG89dC5ldmVudDtuLnNvdXJjZUV2ZW50PXQuZXZlbnQsdC5ldmVudD1uO3RyeXtyZXR1cm4gZS5hcHBseShyLGkpfWZpbmFsbHl7dC5ldmVudD1vfX1mdW5jdGlvbiBDKCl7fWZ1bmN0aW9uIHooKXtyZXR1cm5bXX1mdW5jdGlvbiBQKHQsbil7dGhpcy5vd25lckRvY3VtZW50PXQub3duZXJEb2N1bWVudCx0aGlzLm5hbWVzcGFjZVVSST10Lm5hbWVzcGFjZVVSSSx0aGlzLl9uZXh0PW51bGwsdGhpcy5fcGFyZW50PXQsdGhpcy5fX2RhdGFfXz1ufWZ1bmN0aW9uIEwodCxuLGUscixpLG8pe2Zvcih2YXIgdSxhPTAsYz1uLmxlbmd0aCxzPW8ubGVuZ3RoO2E8czsrK2EpKHU9blthXSk/KHUuX19kYXRhX189b1thXSxyW2FdPXUpOmVbYV09bmV3IFAodCxvW2FdKTtmb3IoO2E8YzsrK2EpKHU9blthXSkmJihpW2FdPXUpfWZ1bmN0aW9uIFIodCxuLGUscixpLG8sdSl7dmFyIGEsYyxzLGY9e30sbD1uLmxlbmd0aCxoPW8ubGVuZ3RoLHA9bmV3IEFycmF5KGwpO2ZvcihhPTA7YTxsOysrYSkoYz1uW2FdKSYmKHBbYV09cz1vbCt1LmNhbGwoYyxjLl9fZGF0YV9fLGEsbikscyBpbiBmP2lbYV09YzpmW3NdPWMpO2ZvcihhPTA7YTxoOysrYSlzPW9sK3UuY2FsbCh0LG9bYV0sYSxvKSwoYz1mW3NdKT8oclthXT1jLGMuX19kYXRhX189b1thXSxmW3NdPW51bGwpOmVbYV09bmV3IFAodCxvW2FdKTtmb3IoYT0wO2E8bDsrK2EpKGM9blthXSkmJmZbcFthXV09PT1jJiYoaVthXT1jKX1mdW5jdGlvbiBxKHQsbil7cmV0dXJuIHQ8bj8tMTp0Pm4/MTp0Pj1uPzA6TmFOfWZ1bmN0aW9uIFUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIEQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiBPKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUodCxuKX19ZnVuY3Rpb24gRih0LG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLG4pfX1mdW5jdGlvbiBJKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT90aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KTp0aGlzLnNldEF0dHJpYnV0ZSh0LGUpfX1mdW5jdGlvbiBZKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT90aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk6dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsZSl9fWZ1bmN0aW9uIEIodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KX19ZnVuY3Rpb24gSCh0LG4sZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LG4sZSl9fWZ1bmN0aW9uIGoodCxuLGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciByPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PXI/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQscixlKX19ZnVuY3Rpb24gWCh0LG4pe3JldHVybiB0LnN0eWxlLmdldFByb3BlcnR5VmFsdWUobil8fGdsKHQpLmdldENvbXB1dGVkU3R5bGUodCxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG4pfWZ1bmN0aW9uICQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbdF19fWZ1bmN0aW9uIFYodCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzW3RdPW59fWZ1bmN0aW9uIFcodCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP2RlbGV0ZSB0aGlzW3RdOnRoaXNbdF09ZX19ZnVuY3Rpb24gWih0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLyl9ZnVuY3Rpb24gRyh0KXtyZXR1cm4gdC5jbGFzc0xpc3R8fG5ldyBKKHQpfWZ1bmN0aW9uIEoodCl7dGhpcy5fbm9kZT10LHRoaXMuX25hbWVzPVoodC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX1mdW5jdGlvbiBRKHQsbil7Zm9yKHZhciBlPUcodCkscj0tMSxpPW4ubGVuZ3RoOysrcjxpOyllLmFkZChuW3JdKX1mdW5jdGlvbiBLKHQsbil7Zm9yKHZhciBlPUcodCkscj0tMSxpPW4ubGVuZ3RoOysrcjxpOyllLnJlbW92ZShuW3JdKX1mdW5jdGlvbiB0dCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtRKHRoaXMsdCl9fWZ1bmN0aW9uIG50KHQpe3JldHVybiBmdW5jdGlvbigpe0sodGhpcyx0KX19ZnVuY3Rpb24gZXQodCxuKXtyZXR1cm4gZnVuY3Rpb24oKXsobi5hcHBseSh0aGlzLGFyZ3VtZW50cyk/UTpLKSh0aGlzLHQpfX1mdW5jdGlvbiBydCgpe3RoaXMudGV4dENvbnRlbnQ9IiJ9ZnVuY3Rpb24gaXQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD10fX1mdW5jdGlvbiBvdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PW4/IiI6bn19ZnVuY3Rpb24gdXQoKXt0aGlzLmlubmVySFRNTD0iIn1mdW5jdGlvbiBhdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD10fX1mdW5jdGlvbiBjdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmlubmVySFRNTD1udWxsPT1uPyIiOm59fWZ1bmN0aW9uIHN0KCl7dGhpcy5uZXh0U2libGluZyYmdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpfWZ1bmN0aW9uIGZ0KCl7dGhpcy5wcmV2aW91c1NpYmxpbmcmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcyx0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCl9ZnVuY3Rpb24gbHQoKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBodCgpe3ZhciB0PXRoaXMucGFyZW50Tm9kZTt0JiZ0LnJlbW92ZUNoaWxkKHRoaXMpfWZ1bmN0aW9uIHB0KHQsbixlKXt2YXIgcj1nbCh0KSxpPXIuQ3VzdG9tRXZlbnQ7ImZ1bmN0aW9uIj09dHlwZW9mIGk/aT1uZXcgaShuLGUpOihpPXIuZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksZT8oaS5pbml0RXZlbnQobixlLmJ1YmJsZXMsZS5jYW5jZWxhYmxlKSxpLmRldGFpbD1lLmRldGFpbCk6aS5pbml0RXZlbnQobiwhMSwhMSkpLHQuZGlzcGF0Y2hFdmVudChpKX1mdW5jdGlvbiBkdCh0LG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBwdCh0aGlzLHQsbil9fWZ1bmN0aW9uIHZ0KHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHB0KHRoaXMsdCxuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fWZ1bmN0aW9uIF90KHQsbil7dGhpcy5fZ3JvdXBzPXQsdGhpcy5fcGFyZW50cz1ufWZ1bmN0aW9uIHl0KCl7cmV0dXJuIG5ldyBfdChbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLHpsKX1mdW5jdGlvbiBndCgpe3QuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gbXQodCxuKXt2YXIgZT10LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxyPVBsKHQpLm9uKCJkcmFnc3RhcnQuZHJhZyIsbnVsbCk7biYmKHIub24oImNsaWNrLmRyYWciLFVsLCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5vbigiY2xpY2suZHJhZyIsbnVsbCl9LDApKSwib25zZWxlY3RzdGFydCJpbiBlP3Iub24oInNlbGVjdHN0YXJ0LmRyYWciLG51bGwpOihlLnN0eWxlLk1velVzZXJTZWxlY3Q9ZS5fX25vc2VsZWN0LGRlbGV0ZSBlLl9fbm9zZWxlY3QpfWZ1bmN0aW9uIHh0KHQsbixlLHIsaSxvLHUsYSxjLHMpe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPW4sdGhpcy5zdWJqZWN0PWUsdGhpcy5pZGVudGlmaWVyPXIsdGhpcy5hY3RpdmU9aSx0aGlzLng9byx0aGlzLnk9dSx0aGlzLmR4PWEsdGhpcy5keT1jLHRoaXMuXz1zfWZ1bmN0aW9uIGJ0KCl7cmV0dXJuIXQuZXZlbnQuYnV0dG9ufWZ1bmN0aW9uIHd0KCl7cmV0dXJuIHRoaXMucGFyZW50Tm9kZX1mdW5jdGlvbiBNdChuKXtyZXR1cm4gbnVsbD09bj97eDp0LmV2ZW50LngseTp0LmV2ZW50Lnl9Om59ZnVuY3Rpb24gVHQodCxuKXt2YXIgZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTtmb3IodmFyIHIgaW4gbillW3JdPW5bcl07cmV0dXJuIGV9ZnVuY3Rpb24ga3QoKXt9ZnVuY3Rpb24gTnQodCl7dmFyIG47cmV0dXJuIHQ9KHQrIiIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLChuPWpsLmV4ZWModCkpPyhuPXBhcnNlSW50KG5bMV0sMTYpLG5ldyB6dChuPj44JjE1fG4+PjQmMjQwLG4+PjQmMTV8MjQwJm4sKDE1Jm4pPDw0fDE1Jm4sMSkpOihuPVhsLmV4ZWModCkpP1N0KHBhcnNlSW50KG5bMV0sMTYpKToobj0kbC5leGVjKHQpKT9uZXcgenQoblsxXSxuWzJdLG5bM10sMSk6KG49VmwuZXhlYyh0KSk/bmV3IHp0KDI1NSpuWzFdLzEwMCwyNTUqblsyXS8xMDAsMjU1Km5bM10vMTAwLDEpOihuPVdsLmV4ZWModCkpP0V0KG5bMV0sblsyXSxuWzNdLG5bNF0pOihuPVpsLmV4ZWModCkpP0V0KDI1NSpuWzFdLzEwMCwyNTUqblsyXS8xMDAsMjU1Km5bM10vMTAwLG5bNF0pOihuPUdsLmV4ZWModCkpP1B0KG5bMV0sblsyXS8xMDAsblszXS8xMDAsMSk6KG49SmwuZXhlYyh0KSk/UHQoblsxXSxuWzJdLzEwMCxuWzNdLzEwMCxuWzRdKTpRbC5oYXNPd25Qcm9wZXJ0eSh0KT9TdChRbFt0XSk6InRyYW5zcGFyZW50Ij09PXQ/bmV3IHp0KE5hTixOYU4sTmFOLDApOm51bGx9ZnVuY3Rpb24gU3QodCl7cmV0dXJuIG5ldyB6dCh0Pj4xNiYyNTUsdD4+OCYyNTUsMjU1JnQsMSl9ZnVuY3Rpb24gRXQodCxuLGUscil7cmV0dXJuIHI8PTAmJih0PW49ZT1OYU4pLG5ldyB6dCh0LG4sZSxyKX1mdW5jdGlvbiBBdCh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIGt0fHwodD1OdCh0KSksdD8odD10LnJnYigpLG5ldyB6dCh0LnIsdC5nLHQuYix0Lm9wYWNpdHkpKTpuZXcgenR9ZnVuY3Rpb24gQ3QodCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP0F0KHQpOm5ldyB6dCh0LG4sZSxudWxsPT1yPzE6cil9ZnVuY3Rpb24genQodCxuLGUscil7dGhpcy5yPSt0LHRoaXMuZz0rbix0aGlzLmI9K2UsdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIFB0KHQsbixlLHIpe3JldHVybiByPD0wP3Q9bj1lPU5hTjplPD0wfHxlPj0xP3Q9bj1OYU46bjw9MCYmKHQ9TmFOKSxuZXcgcXQodCxuLGUscil9ZnVuY3Rpb24gTHQodCl7aWYodCBpbnN0YW5jZW9mIHF0KXJldHVybiBuZXcgcXQodC5oLHQucyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2Yga3R8fCh0PU50KHQpKSwhdClyZXR1cm4gbmV3IHF0O2lmKHQgaW5zdGFuY2VvZiBxdClyZXR1cm4gdDt0PXQucmdiKCk7dmFyIG49dC5yLzI1NSxlPXQuZy8yNTUscj10LmIvMjU1LGk9TWF0aC5taW4obixlLHIpLG89TWF0aC5tYXgobixlLHIpLHU9TmFOLGE9by1pLGM9KG8raSkvMjtyZXR1cm4gYT8odT1uPT09bz8oZS1yKS9hKzYqKGU8cik6ZT09PW8/KHItbikvYSsyOihuLWUpL2ErNCxhLz1jPC41P28raToyLW8taSx1Kj02MCk6YT1jPjAmJmM8MT8wOnUsbmV3IHF0KHUsYSxjLHQub3BhY2l0eSl9ZnVuY3Rpb24gUnQodCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP0x0KHQpOm5ldyBxdCh0LG4sZSxudWxsPT1yPzE6cil9ZnVuY3Rpb24gcXQodCxuLGUscil7dGhpcy5oPSt0LHRoaXMucz0rbix0aGlzLmw9K2UsdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIFV0KHQsbixlKXtyZXR1cm4gMjU1Kih0PDYwP24rKGUtbikqdC82MDp0PDE4MD9lOnQ8MjQwP24rKGUtbikqKDI0MC10KS82MDpuKX1mdW5jdGlvbiBEdCh0KXtpZih0IGluc3RhbmNlb2YgRnQpcmV0dXJuIG5ldyBGdCh0LmwsdC5hLHQuYix0Lm9wYWNpdHkpO2lmKHQgaW5zdGFuY2VvZiAkdCl7dmFyIG49dC5oKktsO3JldHVybiBuZXcgRnQodC5sLE1hdGguY29zKG4pKnQuYyxNYXRoLnNpbihuKSp0LmMsdC5vcGFjaXR5KX10IGluc3RhbmNlb2YgenR8fCh0PUF0KHQpKTt2YXIgZT1IdCh0LnIpLHI9SHQodC5nKSxpPUh0KHQuYiksbz1JdCgoLjQxMjQ1NjQqZSsuMzU3NTc2MSpyKy4xODA0Mzc1KmkpL25oKSx1PUl0KCguMjEyNjcyOSplKy43MTUxNTIyKnIrLjA3MjE3NSppKS9laCk7cmV0dXJuIG5ldyBGdCgxMTYqdS0xNiw1MDAqKG8tdSksMjAwKih1LUl0KCguMDE5MzMzOSplKy4xMTkxOTIqcisuOTUwMzA0MSppKS9yaCkpLHQub3BhY2l0eSl9ZnVuY3Rpb24gT3QodCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP0R0KHQpOm5ldyBGdCh0LG4sZSxudWxsPT1yPzE6cil9ZnVuY3Rpb24gRnQodCxuLGUscil7dGhpcy5sPSt0LHRoaXMuYT0rbix0aGlzLmI9K2UsdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIEl0KHQpe3JldHVybiB0PmFoP01hdGgucG93KHQsMS8zKTp0L3VoK2lofWZ1bmN0aW9uIFl0KHQpe3JldHVybiB0Pm9oP3QqdCp0OnVoKih0LWloKX1mdW5jdGlvbiBCdCh0KXtyZXR1cm4gMjU1Kih0PD0uMDAzMTMwOD8xMi45Mip0OjEuMDU1Kk1hdGgucG93KHQsMS8yLjQpLS4wNTUpfWZ1bmN0aW9uIEh0KHQpe3JldHVybih0Lz0yNTUpPD0uMDQwNDU/dC8xMi45MjpNYXRoLnBvdygodCsuMDU1KS8xLjA1NSwyLjQpfWZ1bmN0aW9uIGp0KHQpe2lmKHQgaW5zdGFuY2VvZiAkdClyZXR1cm4gbmV3ICR0KHQuaCx0LmMsdC5sLHQub3BhY2l0eSk7dCBpbnN0YW5jZW9mIEZ0fHwodD1EdCh0KSk7dmFyIG49TWF0aC5hdGFuMih0LmIsdC5hKSp0aDtyZXR1cm4gbmV3ICR0KG48MD9uKzM2MDpuLE1hdGguc3FydCh0LmEqdC5hK3QuYip0LmIpLHQubCx0Lm9wYWNpdHkpfWZ1bmN0aW9uIFh0KHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9qdCh0KTpuZXcgJHQodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uICR0KHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLmM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBWdCh0KXtpZih0IGluc3RhbmNlb2YgWnQpcmV0dXJuIG5ldyBadCh0LmgsdC5zLHQubCx0Lm9wYWNpdHkpO3QgaW5zdGFuY2VvZiB6dHx8KHQ9QXQodCkpO3ZhciBuPXQuci8yNTUsZT10LmcvMjU1LHI9dC5iLzI1NSxpPSh2aCpyK3BoKm4tZGgqZSkvKHZoK3BoLWRoKSxvPXItaSx1PShoaCooZS1pKS1maCpvKS9saCxhPU1hdGguc3FydCh1KnUrbypvKS8oaGgqaSooMS1pKSksYz1hP01hdGguYXRhbjIodSxvKSp0aC0xMjA6TmFOO3JldHVybiBuZXcgWnQoYzwwP2MrMzYwOmMsYSxpLHQub3BhY2l0eSl9ZnVuY3Rpb24gV3QodCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP1Z0KHQpOm5ldyBadCh0LG4sZSxudWxsPT1yPzE6cil9ZnVuY3Rpb24gWnQodCxuLGUscil7dGhpcy5oPSt0LHRoaXMucz0rbix0aGlzLmw9K2UsdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIEd0KHQsbixlLHIsaSl7dmFyIG89dCp0LHU9byp0O3JldHVybigoMS0zKnQrMypvLXUpKm4rKDQtNipvKzMqdSkqZSsoMSszKnQrMypvLTMqdSkqcit1KmkpLzZ9ZnVuY3Rpb24gSnQodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQrZSpufX1mdW5jdGlvbiBRdCh0LG4sZSl7cmV0dXJuIHQ9TWF0aC5wb3codCxlKSxuPU1hdGgucG93KG4sZSktdCxlPTEvZSxmdW5jdGlvbihyKXtyZXR1cm4gTWF0aC5wb3codCtyKm4sZSl9fWZ1bmN0aW9uIEt0KHQsbil7dmFyIGU9bi10O3JldHVybiBlP0p0KHQsZT4xODB8fGU8LTE4MD9lLTM2MCpNYXRoLnJvdW5kKGUvMzYwKTplKTpUaChpc05hTih0KT9uOnQpfWZ1bmN0aW9uIHRuKHQpe3JldHVybiAxPT0odD0rdCk/bm46ZnVuY3Rpb24obixlKXtyZXR1cm4gZS1uP1F0KG4sZSx0KTpUaChpc05hTihuKT9lOm4pfX1mdW5jdGlvbiBubih0LG4pe3ZhciBlPW4tdDtyZXR1cm4gZT9KdCh0LGUpOlRoKGlzTmFOKHQpP246dCl9ZnVuY3Rpb24gZW4odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlLHIsaT1uLmxlbmd0aCxvPW5ldyBBcnJheShpKSx1PW5ldyBBcnJheShpKSxhPW5ldyBBcnJheShpKTtmb3IoZT0wO2U8aTsrK2Upcj1DdChuW2VdKSxvW2VdPXIucnx8MCx1W2VdPXIuZ3x8MCxhW2VdPXIuYnx8MDtyZXR1cm4gbz10KG8pLHU9dCh1KSxhPXQoYSksci5vcGFjaXR5PTEsZnVuY3Rpb24odCl7cmV0dXJuIHIucj1vKHQpLHIuZz11KHQpLHIuYj1hKHQpLHIrIiJ9fX1mdW5jdGlvbiBybih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0KG4pKyIifX1mdW5jdGlvbiB1bih0KXtyZXR1cm4ibm9uZSI9PT10P09oOihfaHx8KF9oPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLHloPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxnaD1kb2N1bWVudC5kZWZhdWx0VmlldyksX2guc3R5bGUudHJhbnNmb3JtPXQsdD1naC5nZXRDb21wdXRlZFN0eWxlKHloLmFwcGVuZENoaWxkKF9oKSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKSx5aC5yZW1vdmVDaGlsZChfaCksdD10LnNsaWNlKDcsLTEpLnNwbGl0KCIsIiksRmgoK3RbMF0sK3RbMV0sK3RbMl0sK3RbM10sK3RbNF0sK3RbNV0pKX1mdW5jdGlvbiBhbih0KXtyZXR1cm4gbnVsbD09dD9PaDoobWh8fChtaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwiZyIpKSxtaC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsdCksKHQ9bWgudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKSk/KHQ9dC5tYXRyaXgsRmgodC5hLHQuYix0LmMsdC5kLHQuZSx0LmYpKTpPaCl9ZnVuY3Rpb24gY24odCxuLGUscil7ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdC5sZW5ndGg/dC5wb3AoKSsiICI6IiJ9ZnVuY3Rpb24gbyh0LHIsaSxvLHUsYSl7aWYodCE9PWl8fHIhPT1vKXt2YXIgYz11LnB1c2goInRyYW5zbGF0ZSgiLG51bGwsbixudWxsLGUpO2EucHVzaCh7aTpjLTQseDpDaCh0LGkpfSx7aTpjLTIseDpDaChyLG8pfSl9ZWxzZShpfHxvKSYmdS5wdXNoKCJ0cmFuc2xhdGUoIitpK24rbytlKX1mdW5jdGlvbiB1KHQsbixlLG8pe3QhPT1uPyh0LW4+MTgwP24rPTM2MDpuLXQ+MTgwJiYodCs9MzYwKSxvLnB1c2goe2k6ZS5wdXNoKGkoZSkrInJvdGF0ZSgiLG51bGwsciktMix4OkNoKHQsbil9KSk6biYmZS5wdXNoKGkoZSkrInJvdGF0ZSgiK24rcil9ZnVuY3Rpb24gYSh0LG4sZSxvKXt0IT09bj9vLnB1c2goe2k6ZS5wdXNoKGkoZSkrInNrZXdYKCIsbnVsbCxyKS0yLHg6Q2godCxuKX0pOm4mJmUucHVzaChpKGUpKyJza2V3WCgiK24rcil9ZnVuY3Rpb24gYyh0LG4sZSxyLG8sdSl7aWYodCE9PWV8fG4hPT1yKXt2YXIgYT1vLnB1c2goaShvKSsic2NhbGUoIixudWxsLCIsIixudWxsLCIpIik7dS5wdXNoKHtpOmEtNCx4OkNoKHQsZSl9LHtpOmEtMix4OkNoKG4scil9KX1lbHNlIDE9PT1lJiYxPT09cnx8by5wdXNoKGkobykrInNjYWxlKCIrZSsiLCIrcisiKSIpfXJldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPVtdLGk9W107cmV0dXJuIG49dChuKSxlPXQoZSksbyhuLnRyYW5zbGF0ZVgsbi50cmFuc2xhdGVZLGUudHJhbnNsYXRlWCxlLnRyYW5zbGF0ZVkscixpKSx1KG4ucm90YXRlLGUucm90YXRlLHIsaSksYShuLnNrZXdYLGUuc2tld1gscixpKSxjKG4uc2NhbGVYLG4uc2NhbGVZLGUuc2NhbGVYLGUuc2NhbGVZLHIsaSksbj1lPW51bGwsZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9LTEsbz1pLmxlbmd0aDsrK2U8bzspclsobj1pW2VdKS5pXT1uLngodCk7cmV0dXJuIHIuam9pbigiIil9fX1mdW5jdGlvbiBzbih0KXtyZXR1cm4oKHQ9TWF0aC5leHAodCkpKzEvdCkvMn1mdW5jdGlvbiBmbih0KXtyZXR1cm4oKHQ9TWF0aC5leHAodCkpLTEvdCkvMn1mdW5jdGlvbiBsbih0KXtyZXR1cm4oKHQ9TWF0aC5leHAoMip0KSktMSkvKHQrMSl9ZnVuY3Rpb24gaG4odCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9dCgobj1SdChuKSkuaCwoZT1SdChlKSkuaCksaT1ubihuLnMsZS5zKSxvPW5uKG4ubCxlLmwpLHU9bm4obi5vcGFjaXR5LGUub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuLmg9cih0KSxuLnM9aSh0KSxuLmw9byh0KSxuLm9wYWNpdHk9dSh0KSxuKyIifX19ZnVuY3Rpb24gcG4odCxuKXt2YXIgZT1ubigodD1PdCh0KSkubCwobj1PdChuKSkubCkscj1ubih0LmEsbi5hKSxpPW5uKHQuYixuLmIpLG89bm4odC5vcGFjaXR5LG4ub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0Lmw9ZShuKSx0LmE9cihuKSx0LmI9aShuKSx0Lm9wYWNpdHk9byhuKSx0KyIifX1mdW5jdGlvbiBkbih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPVh0KG4pKS5oLChlPVh0KGUpKS5oKSxpPW5uKG4uYyxlLmMpLG89bm4obi5sLGUubCksdT1ubihuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4uYz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT11KHQpLG4rIiJ9fX1mdW5jdGlvbiB2bih0KXtyZXR1cm4gZnVuY3Rpb24gbihlKXtmdW5jdGlvbiByKG4scil7dmFyIGk9dCgobj1XdChuKSkuaCwocj1XdChyKSkuaCksbz1ubihuLnMsci5zKSx1PW5uKG4ubCxyLmwpLGE9bm4obi5vcGFjaXR5LHIub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuLmg9aSh0KSxuLnM9byh0KSxuLmw9dShNYXRoLnBvdyh0LGUpKSxuLm9wYWNpdHk9YSh0KSxuKyIifX1yZXR1cm4gZT0rZSxyLmdhbW1hPW4scn0oMSl9ZnVuY3Rpb24gX24oKXtyZXR1cm4gZXB8fChvcCh5biksZXA9aXAubm93KCkrcnApfWZ1bmN0aW9uIHluKCl7ZXA9MH1mdW5jdGlvbiBnbigpe3RoaXMuX2NhbGw9dGhpcy5fdGltZT10aGlzLl9uZXh0PW51bGx9ZnVuY3Rpb24gbW4odCxuLGUpe3ZhciByPW5ldyBnbjtyZXR1cm4gci5yZXN0YXJ0KHQsbixlKSxyfWZ1bmN0aW9uIHhuKCl7X24oKSwrK0poO2Zvcih2YXIgdCxuPXhoO247KSh0PWVwLW4uX3RpbWUpPj0wJiZuLl9jYWxsLmNhbGwobnVsbCx0KSxuPW4uX25leHQ7LS1KaH1mdW5jdGlvbiBibigpe2VwPShucD1pcC5ub3coKSkrcnAsSmg9UWg9MDt0cnl7eG4oKX1maW5hbGx5e0poPTAsTW4oKSxlcD0wfX1mdW5jdGlvbiB3bigpe3ZhciB0PWlwLm5vdygpLG49dC1ucDtuPnRwJiYocnAtPW4sbnA9dCl9ZnVuY3Rpb24gTW4oKXtmb3IodmFyIHQsbixlPXhoLHI9MS8wO2U7KWUuX2NhbGw/KHI+ZS5fdGltZSYmKHI9ZS5fdGltZSksdD1lLGU9ZS5fbmV4dCk6KG49ZS5fbmV4dCxlLl9uZXh0PW51bGwsZT10P3QuX25leHQ9bjp4aD1uKTtiaD10LFRuKHIpfWZ1bmN0aW9uIFRuKHQpe2lmKCFKaCl7UWgmJihRaD1jbGVhclRpbWVvdXQoUWgpKTt2YXIgbj10LWVwO24+MjQ/KHQ8MS8wJiYoUWg9c2V0VGltZW91dChibixuKSksS2gmJihLaD1jbGVhckludGVydmFsKEtoKSkpOihLaHx8KG5wPWVwLEtoPXNldEludGVydmFsKHduLHRwKSksSmg9MSxvcChibikpfX1mdW5jdGlvbiBrbih0LG4pe3ZhciBlPXQuX190cmFuc2l0aW9uO2lmKCFlfHwhKGU9ZVtuXSl8fGUuc3RhdGU+ZnApdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZSIpO3JldHVybiBlfWZ1bmN0aW9uIE5uKHQsbil7dmFyIGU9dC5fX3RyYW5zaXRpb247aWYoIWV8fCEoZT1lW25dKXx8ZS5zdGF0ZT5ocCl0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlIik7cmV0dXJuIGV9ZnVuY3Rpb24gU24odCxuKXt2YXIgZT10Ll9fdHJhbnNpdGlvbjtpZighZXx8IShlPWVbbl0pKXRocm93IG5ldyBFcnJvcigidG9vIGxhdGUiKTtyZXR1cm4gZX1mdW5jdGlvbiBFbih0LG4sZSl7ZnVuY3Rpb24gcih0KXtlLnN0YXRlPWxwLGUudGltZXIucmVzdGFydChpLGUuZGVsYXksZS50aW1lKSxlLmRlbGF5PD10JiZpKHQtZS5kZWxheSl9ZnVuY3Rpb24gaShyKXt2YXIgcyxmLGwsaDtpZihlLnN0YXRlIT09bHApcmV0dXJuIHUoKTtmb3IocyBpbiBjKWlmKGg9Y1tzXSxoLm5hbWU9PT1lLm5hbWUpe2lmKGguc3RhdGU9PT1wcClyZXR1cm4gdXAoaSk7aC5zdGF0ZT09PWRwPyhoLnN0YXRlPV9wLGgudGltZXIuc3RvcCgpLGgub24uY2FsbCgiaW50ZXJydXB0Iix0LHQuX19kYXRhX18saC5pbmRleCxoLmdyb3VwKSxkZWxldGUgY1tzXSk6K3M8biYmKGguc3RhdGU9X3AsaC50aW1lci5zdG9wKCksZGVsZXRlIGNbc10pfWlmKHVwKGZ1bmN0aW9uKCl7ZS5zdGF0ZT09PXBwJiYoZS5zdGF0ZT1kcCxlLnRpbWVyLnJlc3RhcnQobyxlLmRlbGF5LGUudGltZSksbyhyKSl9KSxlLnN0YXRlPWhwLGUub24uY2FsbCgic3RhcnQiLHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApLGUuc3RhdGU9PT1ocCl7Zm9yKGUuc3RhdGU9cHAsYT1uZXcgQXJyYXkobD1lLnR3ZWVuLmxlbmd0aCkscz0wLGY9LTE7czxsOysrcykoaD1lLnR3ZWVuW3NdLnZhbHVlLmNhbGwodCx0Ll9fZGF0YV9fLGUuaW5kZXgsZS5ncm91cCkpJiYoYVsrK2ZdPWgpO2EubGVuZ3RoPWYrMX19ZnVuY3Rpb24gbyhuKXtmb3IodmFyIHI9bjxlLmR1cmF0aW9uP2UuZWFzZS5jYWxsKG51bGwsbi9lLmR1cmF0aW9uKTooZS50aW1lci5yZXN0YXJ0KHUpLGUuc3RhdGU9dnAsMSksaT0tMSxvPWEubGVuZ3RoOysraTxvOylhW2ldLmNhbGwobnVsbCxyKTtlLnN0YXRlPT09dnAmJihlLm9uLmNhbGwoImVuZCIsdCx0Ll9fZGF0YV9fLGUuaW5kZXgsZS5ncm91cCksdSgpKX1mdW5jdGlvbiB1KCl7ZS5zdGF0ZT1fcCxlLnRpbWVyLnN0b3AoKSxkZWxldGUgY1tuXTtmb3IodmFyIHIgaW4gYylyZXR1cm47ZGVsZXRlIHQuX190cmFuc2l0aW9ufXZhciBhLGM9dC5fX3RyYW5zaXRpb247Y1tuXT1lLGUudGltZXI9bW4ociwwLGUudGltZSl9ZnVuY3Rpb24gQW4odCxuKXt2YXIgZSxyO3JldHVybiBmdW5jdGlvbigpe3ZhciBpPU5uKHRoaXMsdCksbz1pLnR3ZWVuO2lmKG8hPT1lKXtyPWU9bztmb3IodmFyIHU9MCxhPXIubGVuZ3RoO3U8YTsrK3UpaWYoclt1XS5uYW1lPT09bil7cj1yLnNsaWNlKCksci5zcGxpY2UodSwxKTticmVha319aS50d2Vlbj1yfX1mdW5jdGlvbiBDbih0LG4sZSl7dmFyIHIsaTtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89Tm4odGhpcyx0KSx1PW8udHdlZW47aWYodSE9PXIpe2k9KHI9dSkuc2xpY2UoKTtmb3IodmFyIGE9e25hbWU6bix2YWx1ZTplfSxjPTAscz1pLmxlbmd0aDtjPHM7KytjKWlmKGlbY10ubmFtZT09PW4pe2lbY109YTticmVha31jPT09cyYmaS5wdXNoKGEpfW8udHdlZW49aX19ZnVuY3Rpb24gem4odCxuLGUpe3ZhciByPXQuX2lkO3JldHVybiB0LmVhY2goZnVuY3Rpb24oKXt2YXIgdD1Obih0aGlzLHIpOyh0LnZhbHVlfHwodC52YWx1ZT17fSkpW25dPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSksZnVuY3Rpb24odCl7cmV0dXJuIFNuKHQscikudmFsdWVbbl19fWZ1bmN0aW9uIFBuKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX1mdW5jdGlvbiBMbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIFJuKHQsbixlKXt2YXIgcixpO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPXRoaXMuZ2V0QXR0cmlidXRlKHQpO3JldHVybiBvPT09ZT9udWxsOm89PT1yP2k6aT1uKHI9byxlKX19ZnVuY3Rpb24gcW4odCxuLGUpe3ZhciByLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89dGhpcy5nZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpO3JldHVybiBvPT09ZT9udWxsOm89PT1yP2k6aT1uKHI9byxlKX19ZnVuY3Rpb24gVW4odCxuLGUpe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdSxhPWUodGhpcyk7cmV0dXJuIG51bGw9PWE/dm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KToodT10aGlzLmdldEF0dHJpYnV0ZSh0KSx1PT09YT9udWxsOnU9PT1yJiZhPT09aT9vOm89bihyPXUsaT1hKSl9fWZ1bmN0aW9uIERuKHQsbixlKXt2YXIgcixpLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHUsYT1lKHRoaXMpO3JldHVybiBudWxsPT1hP3ZvaWQgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpOih1PXRoaXMuZ2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKSx1PT09YT9udWxsOnU9PT1yJiZhPT09aT9vOm89bihyPXUsaT1hKSl9fWZ1bmN0aW9uIE9uKHQsbil7ZnVuY3Rpb24gZSgpe3ZhciBlPXRoaXMscj1uLmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gciYmZnVuY3Rpb24obil7ZS5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwscihuKSl9fXJldHVybiBlLl92YWx1ZT1uLGV9ZnVuY3Rpb24gRm4odCxuKXtmdW5jdGlvbiBlKCl7dmFyIGU9dGhpcyxyPW4uYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybiByJiZmdW5jdGlvbihuKXtlLnNldEF0dHJpYnV0ZSh0LHIobikpfX1yZXR1cm4gZS5fdmFsdWU9bixlfWZ1bmN0aW9uIEluKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7a24odGhpcyx0KS5kZWxheT0rbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIFluKHQsbil7cmV0dXJuIG49K24sZnVuY3Rpb24oKXtrbih0aGlzLHQpLmRlbGF5PW59fWZ1bmN0aW9uIEJuKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7Tm4odGhpcyx0KS5kdXJhdGlvbj0rbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIEhuKHQsbil7cmV0dXJuIG49K24sZnVuY3Rpb24oKXtObih0aGlzLHQpLmR1cmF0aW9uPW59fWZ1bmN0aW9uIGpuKHQsbil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEVycm9yO3JldHVybiBmdW5jdGlvbigpe05uKHRoaXMsdCkuZWFzZT1ufX1mdW5jdGlvbiBYbih0KXtyZXR1cm4odCsiIikudHJpbSgpLnNwbGl0KC9efFxzKy8pLmV2ZXJ5KGZ1bmN0aW9uKHQpe3ZhciBuPXQuaW5kZXhPZigiLiIpO3JldHVybiBuPj0wJiYodD10LnNsaWNlKDAsbikpLCF0fHwic3RhcnQiPT09dH0pfWZ1bmN0aW9uICRuKHQsbixlKXt2YXIgcixpLG89WG4obik/a246Tm47cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHU9byh0aGlzLHQpLGE9dS5vbjthIT09ciYmKGk9KHI9YSkuY29weSgpKS5vbihuLGUpLHUub249aX19ZnVuY3Rpb24gVm4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dGhpcy5wYXJlbnROb2RlO2Zvcih2YXIgZSBpbiB0aGlzLl9fdHJhbnNpdGlvbilpZigrZSE9PXQpcmV0dXJuO24mJm4ucmVtb3ZlQ2hpbGQodGhpcyl9fWZ1bmN0aW9uIFduKHQsbil7dmFyIGUscixpO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPVgodGhpcyx0KSx1PSh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLFgodGhpcyx0KSk7cmV0dXJuIG89PT11P251bGw6bz09PWUmJnU9PT1yP2k6aT1uKGU9byxyPXUpfX1mdW5jdGlvbiBabih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfX1mdW5jdGlvbiBHbih0LG4sZSl7dmFyIHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1YKHRoaXMsdCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX1mdW5jdGlvbiBKbih0LG4sZSl7dmFyIHIsaSxvO3JldHVybiBmdW5jdGlvbigpe3ZhciB1PVgodGhpcyx0KSxhPWUodGhpcyk7cmV0dXJuIG51bGw9PWEmJih0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLGE9WCh0aGlzLHQpKSx1PT09YT9udWxsOnU9PT1yJiZhPT09aT9vOm89bihyPXUsaT1hKX19ZnVuY3Rpb24gUW4odCxuLGUpe2Z1bmN0aW9uIHIoKXt2YXIgcj10aGlzLGk9bi5hcHBseShyLGFyZ3VtZW50cyk7cmV0dXJuIGkmJmZ1bmN0aW9uKG4pe3Iuc3R5bGUuc2V0UHJvcGVydHkodCxpKG4pLGUpfX1yZXR1cm4gci5fdmFsdWU9bixyfWZ1bmN0aW9uIEtuKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19ZnVuY3Rpb24gdGUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dCh0aGlzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PW4/IiI6bn19ZnVuY3Rpb24gbmUodCxuLGUscil7dGhpcy5fZ3JvdXBzPXQsdGhpcy5fcGFyZW50cz1uLHRoaXMuX25hbWU9ZSx0aGlzLl9pZD1yfWZ1bmN0aW9uIGVlKHQpe3JldHVybiB5dCgpLnRyYW5zaXRpb24odCl9ZnVuY3Rpb24gcmUoKXtyZXR1cm4rK0ZwfWZ1bmN0aW9uIGllKHQpe3JldHVybit0fWZ1bmN0aW9uIG9lKHQpe3JldHVybiB0KnR9ZnVuY3Rpb24gdWUodCl7cmV0dXJuIHQqKDItdCl9ZnVuY3Rpb24gYWUodCl7cmV0dXJuKCh0Kj0yKTw9MT90KnQ6LS10KigyLXQpKzEpLzJ9ZnVuY3Rpb24gY2UodCl7cmV0dXJuIHQqdCp0fWZ1bmN0aW9uIHNlKHQpe3JldHVybi0tdCp0KnQrMX1mdW5jdGlvbiBmZSh0KXtyZXR1cm4oKHQqPTIpPD0xP3QqdCp0Oih0LT0yKSp0KnQrMikvMn1mdW5jdGlvbiBsZSh0KXtyZXR1cm4gMS1NYXRoLmNvcyh0KlhwKX1mdW5jdGlvbiBoZSh0KXtyZXR1cm4gTWF0aC5zaW4odCpYcCl9ZnVuY3Rpb24gcGUodCl7cmV0dXJuKDEtTWF0aC5jb3MoanAqdCkpLzJ9ZnVuY3Rpb24gZGUodCl7cmV0dXJuIE1hdGgucG93KDIsMTAqdC0xMCl9ZnVuY3Rpb24gdmUodCl7cmV0dXJuIDEtTWF0aC5wb3coMiwtMTAqdCl9ZnVuY3Rpb24gX2UodCl7cmV0dXJuKCh0Kj0yKTw9MT9NYXRoLnBvdygyLDEwKnQtMTApOjItTWF0aC5wb3coMiwxMC0xMCp0KSkvMn1mdW5jdGlvbiB5ZSh0KXtyZXR1cm4gMS1NYXRoLnNxcnQoMS10KnQpfWZ1bmN0aW9uIGdlKHQpe3JldHVybiBNYXRoLnNxcnQoMS0gLS10KnQpfWZ1bmN0aW9uIG1lKHQpe3JldHVybigodCo9Mik8PTE/MS1NYXRoLnNxcnQoMS10KnQpOk1hdGguc3FydCgxLSh0LT0yKSp0KSsxKS8yfWZ1bmN0aW9uIHhlKHQpe3JldHVybiAxLWJlKDEtdCl9ZnVuY3Rpb24gYmUodCl7cmV0dXJuKHQ9K3QpPCRwP25kKnQqdDp0PFdwP25kKih0LT1WcCkqdCtacDp0PEpwP25kKih0LT1HcCkqdCtRcDpuZCoodC09S3ApKnQrdGR9ZnVuY3Rpb24gd2UodCl7cmV0dXJuKCh0Kj0yKTw9MT8xLWJlKDEtdCk6YmUodC0xKSsxKS8yfWZ1bmN0aW9uIE1lKHQsbil7Zm9yKHZhciBlOyEoZT10Ll9fdHJhbnNpdGlvbil8fCEoZT1lW25dKTspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuIHNkLnRpbWU9X24oKSxzZDtyZXR1cm4gZX1mdW5jdGlvbiBUZSgpe3QuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24ga2UodCl7cmV0dXJue3R5cGU6dH19ZnVuY3Rpb24gTmUoKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gU2UoKXt2YXIgdD10aGlzLm93bmVyU1ZHRWxlbWVudHx8dGhpcztyZXR1cm5bWzAsMF0sW3Qud2lkdGguYmFzZVZhbC52YWx1ZSx0LmhlaWdodC5iYXNlVmFsLnZhbHVlXV19ZnVuY3Rpb24gRWUodCl7Zm9yKDshdC5fX2JydXNoOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm47cmV0dXJuIHQuX19icnVzaH1mdW5jdGlvbiBBZSh0KXtyZXR1cm4gdFswXVswXT09PXRbMV1bMF18fHRbMF1bMV09PT10WzFdWzFdfWZ1bmN0aW9uIENlKHQpe3ZhciBuPXQuX19icnVzaDtyZXR1cm4gbj9uLmRpbS5vdXRwdXQobi5zZWxlY3Rpb24pOm51bGx9ZnVuY3Rpb24gemUoKXtyZXR1cm4gTGUoeGQpfWZ1bmN0aW9uIFBlKCl7cmV0dXJuIExlKGJkKX1mdW5jdGlvbiBMZShuKXtmdW5jdGlvbiBlKHQpe3ZhciBlPXQucHJvcGVydHkoIl9fYnJ1c2giLGEpLnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5kYXRhKFtrZSgib3ZlcmxheSIpXSk7ZS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwib3ZlcmxheSIpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuYXR0cigiY3Vyc29yIixNZC5vdmVybGF5KS5tZXJnZShlKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9RWUodGhpcykuZXh0ZW50O1BsKHRoaXMpLmF0dHIoIngiLHRbMF1bMF0pLmF0dHIoInkiLHRbMF1bMV0pLmF0dHIoIndpZHRoIix0WzFdWzBdLXRbMF1bMF0pLmF0dHIoImhlaWdodCIsdFsxXVsxXS10WzBdWzFdKX0pLHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuZGF0YShba2UoInNlbGVjdGlvbiIpXSkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsInNlbGVjdGlvbiIpLmF0dHIoImN1cnNvciIsTWQuc2VsZWN0aW9uKS5hdHRyKCJmaWxsIiwiIzc3NyIpLmF0dHIoImZpbGwtb3BhY2l0eSIsLjMpLmF0dHIoInN0cm9rZSIsIiNmZmYiKS5hdHRyKCJzaGFwZS1yZW5kZXJpbmciLCJjcmlzcEVkZ2VzIik7dmFyIGk9dC5zZWxlY3RBbGwoIi5oYW5kbGUiKS5kYXRhKG4uaGFuZGxlcyxmdW5jdGlvbih0KXtyZXR1cm4gdC50eXBlfSk7aS5leGl0KCkucmVtb3ZlKCksaS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIixmdW5jdGlvbih0KXtyZXR1cm4iaGFuZGxlIGhhbmRsZS0tIit0LnR5cGV9KS5hdHRyKCJjdXJzb3IiLGZ1bmN0aW9uKHQpe3JldHVybiBNZFt0LnR5cGVdfSksdC5lYWNoKHIpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpLm9uKCJtb3VzZWRvd24uYnJ1c2ggdG91Y2hzdGFydC5icnVzaCIsdSl9ZnVuY3Rpb24gcigpe3ZhciB0PVBsKHRoaXMpLG49RWUodGhpcykuc2VsZWN0aW9uO24/KHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLmF0dHIoIngiLG5bMF1bMF0pLmF0dHIoInkiLG5bMF1bMV0pLmF0dHIoIndpZHRoIixuWzFdWzBdLW5bMF1bMF0pLmF0dHIoImhlaWdodCIsblsxXVsxXS1uWzBdWzFdKSx0LnNlbGVjdEFsbCgiLmhhbmRsZSIpLnN0eWxlKCJkaXNwbGF5IixudWxsKS5hdHRyKCJ4IixmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGVbdC50eXBlLmxlbmd0aC0xXT9uWzFdWzBdLWgvMjpuWzBdWzBdLWgvMn0pLmF0dHIoInkiLGZ1bmN0aW9uKHQpe3JldHVybiJzIj09PXQudHlwZVswXT9uWzFdWzFdLWgvMjpuWzBdWzFdLWgvMn0pLmF0dHIoIndpZHRoIixmdW5jdGlvbih0KXtyZXR1cm4ibiI9PT10LnR5cGV8fCJzIj09PXQudHlwZT9uWzFdWzBdLW5bMF1bMF0raDpofSkuYXR0cigiaGVpZ2h0IixmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGV8fCJ3Ij09PXQudHlwZT9uWzFdWzFdLW5bMF1bMV0raDpofSkpOnQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uLC5oYW5kbGUiKS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKS5hdHRyKCJ4IixudWxsKS5hdHRyKCJ5IixudWxsKS5hdHRyKCJ3aWR0aCIsbnVsbCkuYXR0cigiaGVpZ2h0IixudWxsKX1mdW5jdGlvbiBpKHQsbil7cmV0dXJuIHQuX19icnVzaC5lbWl0dGVyfHxuZXcgbyh0LG4pfWZ1bmN0aW9uIG8odCxuKXt0aGlzLnRoYXQ9dCx0aGlzLmFyZ3M9bix0aGlzLnN0YXRlPXQuX19icnVzaCx0aGlzLmFjdGl2ZT0wfWZ1bmN0aW9uIHUoKXtmdW5jdGlvbiBlKCl7dmFyIHQ9R2YoVCk7IVV8fHd8fE18fChNYXRoLmFicyh0WzBdLU9bMF0pPk1hdGguYWJzKHRbMV0tT1sxXSk/TT0hMDp3PSEwKSxPPXQsYj0hMCx2ZCgpLG8oKX1mdW5jdGlvbiBvKCl7dmFyIHQ7c3dpdGNoKG09T1swXS1EWzBdLHg9T1sxXS1EWzFdLE4pe2Nhc2UgeWQ6Y2FzZSBfZDpTJiYobT1NYXRoLm1heChQLWwsTWF0aC5taW4oUi12LG0pKSxoPWwrbSxfPXYrbSksRSYmKHg9TWF0aC5tYXgoTC1wLE1hdGgubWluKHEteSx4KSksZD1wK3gsZz15K3gpO2JyZWFrO2Nhc2UgZ2Q6UzwwPyhtPU1hdGgubWF4KFAtbCxNYXRoLm1pbihSLWwsbSkpLGg9bCttLF89dik6Uz4wJiYobT1NYXRoLm1heChQLXYsTWF0aC5taW4oUi12LG0pKSxoPWwsXz12K20pLEU8MD8oeD1NYXRoLm1heChMLXAsTWF0aC5taW4ocS1wLHgpKSxkPXAreCxnPXkpOkU+MCYmKHg9TWF0aC5tYXgoTC15LE1hdGgubWluKHEteSx4KSksZD1wLGc9eSt4KTticmVhaztjYXNlIG1kOlMmJihoPU1hdGgubWF4KFAsTWF0aC5taW4oUixsLW0qUykpLF89TWF0aC5tYXgoUCxNYXRoLm1pbihSLHYrbSpTKSkpLEUmJihkPU1hdGgubWF4KEwsTWF0aC5taW4ocSxwLXgqRSkpLGc9TWF0aC5tYXgoTCxNYXRoLm1pbihxLHkreCpFKSkpfV88aCYmKFMqPS0xLHQ9bCxsPXYsdj10LHQ9aCxoPV8sXz10LGsgaW4gVGQmJlkuYXR0cigiY3Vyc29yIixNZFtrPVRkW2tdXSkpLGc8ZCYmKEUqPS0xLHQ9cCxwPXkseT10LHQ9ZCxkPWcsZz10LGsgaW4ga2QmJlkuYXR0cigiY3Vyc29yIixNZFtrPWtkW2tdXSkpLEEuc2VsZWN0aW9uJiYoej1BLnNlbGVjdGlvbiksdyYmKGg9elswXVswXSxfPXpbMV1bMF0pLE0mJihkPXpbMF1bMV0sZz16WzFdWzFdKSx6WzBdWzBdPT09aCYmelswXVsxXT09PWQmJnpbMV1bMF09PT1fJiZ6WzFdWzFdPT09Z3x8KEEuc2VsZWN0aW9uPVtbaCxkXSxbXyxnXV0sci5jYWxsKFQpLEYuYnJ1c2goKSl9ZnVuY3Rpb24gdSgpe2lmKFRlKCksdC5ldmVudC50b3VjaGVzKXtpZih0LmV2ZW50LnRvdWNoZXMubGVuZ3RoKXJldHVybjtjJiZjbGVhclRpbWVvdXQoYyksYz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yz1udWxsfSw1MDApLEkub24oInRvdWNobW92ZS5icnVzaCB0b3VjaGVuZC5icnVzaCB0b3VjaGNhbmNlbC5icnVzaCIsbnVsbCl9ZWxzZSBtdCh0LmV2ZW50LnZpZXcsYiksQi5vbigia2V5ZG93bi5icnVzaCBrZXl1cC5icnVzaCBtb3VzZW1vdmUuYnJ1c2ggbW91c2V1cC5icnVzaCIsbnVsbCk7SS5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLFkuYXR0cigiY3Vyc29yIixNZC5vdmVybGF5KSxBLnNlbGVjdGlvbiYmKHo9QS5zZWxlY3Rpb24pLEFlKHopJiYoQS5zZWxlY3Rpb249bnVsbCxyLmNhbGwoVCkpLEYuZW5kKCl9ZnVuY3Rpb24gYSgpe3N3aXRjaCh0LmV2ZW50LmtleUNvZGUpe2Nhc2UgMTY6VT1TJiZFO2JyZWFrO2Nhc2UgMTg6Tj09PWdkJiYoUyYmKHY9Xy1tKlMsbD1oK20qUyksRSYmKHk9Zy14KkUscD1kK3gqRSksTj1tZCxvKCkpO2JyZWFrO2Nhc2UgMzI6TiE9PWdkJiZOIT09bWR8fChTPDA/dj1fLW06Uz4wJiYobD1oLW0pLEU8MD95PWcteDpFPjAmJihwPWQteCksTj15ZCxZLmF0dHIoImN1cnNvciIsTWQuc2VsZWN0aW9uKSxvKCkpO2JyZWFrO2RlZmF1bHQ6cmV0dXJufXZkKCl9ZnVuY3Rpb24gcygpe3N3aXRjaCh0LmV2ZW50LmtleUNvZGUpe2Nhc2UgMTY6VSYmKHc9TT1VPSExLG8oKSk7YnJlYWs7Y2FzZSAxODpOPT09bWQmJihTPDA/dj1fOlM+MCYmKGw9aCksRTwwP3k9ZzpFPjAmJihwPWQpLE49Z2QsbygpKTticmVhaztjYXNlIDMyOk49PT15ZCYmKHQuZXZlbnQuYWx0S2V5PyhTJiYodj1fLW0qUyxsPWgrbSpTKSxFJiYoeT1nLXgqRSxwPWQreCpFKSxOPW1kKTooUzwwP3Y9XzpTPjAmJihsPWgpLEU8MD95PWc6RT4wJiYocD1kKSxOPWdkKSxZLmF0dHIoImN1cnNvciIsTWRba10pLG8oKSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59dmQoKX1pZih0LmV2ZW50LnRvdWNoZXMpe2lmKHQuZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoPHQuZXZlbnQudG91Y2hlcy5sZW5ndGgpcmV0dXJuIHZkKCl9ZWxzZSBpZihjKXJldHVybjtpZihmLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIGwsaCxwLGQsdixfLHksZyxtLHgsYix3LE0sVD10aGlzLGs9dC5ldmVudC50YXJnZXQuX19kYXRhX18udHlwZSxOPSJzZWxlY3Rpb24iPT09KHQuZXZlbnQubWV0YUtleT9rPSJvdmVybGF5IjprKT9fZDp0LmV2ZW50LmFsdEtleT9tZDpnZCxTPW49PT1iZD9udWxsOk5kW2tdLEU9bj09PXhkP251bGw6U2Rba10sQT1FZShUKSxDPUEuZXh0ZW50LHo9QS5zZWxlY3Rpb24sUD1DWzBdWzBdLEw9Q1swXVsxXSxSPUNbMV1bMF0scT1DWzFdWzFdLFU9UyYmRSYmdC5ldmVudC5zaGlmdEtleSxEPUdmKFQpLE89RCxGPWkoVCxhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCk7Im92ZXJsYXkiPT09az9BLnNlbGVjdGlvbj16PVtbbD1uPT09YmQ/UDpEWzBdLHA9bj09PXhkP0w6RFsxXV0sW3Y9bj09PWJkP1I6bCx5PW49PT14ZD9xOnBdXToobD16WzBdWzBdLHA9elswXVsxXSx2PXpbMV1bMF0seT16WzFdWzFdKSxoPWwsZD1wLF89dixnPXk7dmFyIEk9UGwoVCkuYXR0cigicG9pbnRlci1ldmVudHMiLCJub25lIiksWT1JLnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5hdHRyKCJjdXJzb3IiLE1kW2tdKTtpZih0LmV2ZW50LnRvdWNoZXMpSS5vbigidG91Y2htb3ZlLmJydXNoIixlLCEwKS5vbigidG91Y2hlbmQuYnJ1c2ggdG91Y2hjYW5jZWwuYnJ1c2giLHUsITApO2Vsc2V7dmFyIEI9UGwodC5ldmVudC52aWV3KS5vbigia2V5ZG93bi5icnVzaCIsYSwhMCkub24oImtleXVwLmJydXNoIixzLCEwKS5vbigibW91c2Vtb3ZlLmJydXNoIixlLCEwKS5vbigibW91c2V1cC5icnVzaCIsdSwhMCk7RGwodC5ldmVudC52aWV3KX1UZSgpLGdwKFQpLHIuY2FsbChUKSxGLnN0YXJ0KCl9fWZ1bmN0aW9uIGEoKXt2YXIgdD10aGlzLl9fYnJ1c2h8fHtzZWxlY3Rpb246bnVsbH07cmV0dXJuIHQuZXh0ZW50PXMuYXBwbHkodGhpcyxhcmd1bWVudHMpLHQuZGltPW4sdH12YXIgYyxzPVNlLGY9TmUsbD12KGUsInN0YXJ0IiwiYnJ1c2giLCJlbmQiKSxoPTY7cmV0dXJuIGUubW92ZT1mdW5jdGlvbih0LGUpe3Quc2VsZWN0aW9uP3Qub24oInN0YXJ0LmJydXNoIixmdW5jdGlvbigpe2kodGhpcyxhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCkuc3RhcnQoKX0pLm9uKCJpbnRlcnJ1cHQuYnJ1c2ggZW5kLmJydXNoIixmdW5jdGlvbigpe2kodGhpcyxhcmd1bWVudHMpLmVuZCgpfSkudHdlZW4oImJydXNoIixmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dS5zZWxlY3Rpb249MT09PXQmJkFlKHMpP251bGw6Zih0KSxyLmNhbGwobyksYS5icnVzaCgpfXZhciBvPXRoaXMsdT1vLl9fYnJ1c2gsYT1pKG8sYXJndW1lbnRzKSxjPXUuc2VsZWN0aW9uLHM9bi5pbnB1dCgiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTplLHUuZXh0ZW50KSxmPXFoKGMscyk7cmV0dXJuIGMmJnM/dDp0KDEpfSk6dC5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxvPWFyZ3VtZW50cyx1PXQuX19icnVzaCxhPW4uaW5wdXQoImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0LG8pOmUsdS5leHRlbnQpLGM9aSh0LG8pLmJlZm9yZXN0YXJ0KCk7Z3AodCksdS5zZWxlY3Rpb249bnVsbD09YXx8QWUoYSk/bnVsbDphLHIuY2FsbCh0KSxjLnN0YXJ0KCkuYnJ1c2goKS5lbmQoKX0pfSxvLnByb3RvdHlwZT17YmVmb3Jlc3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gMT09Kyt0aGlzLmFjdGl2ZSYmKHRoaXMuc3RhdGUuZW1pdHRlcj10aGlzLHRoaXMuc3RhcnRpbmc9ITApLHRoaXN9LHN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhcnRpbmcmJih0aGlzLnN0YXJ0aW5nPSExLHRoaXMuZW1pdCgic3RhcnQiKSksdGhpc30sYnJ1c2g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbWl0KCJicnVzaCIpLHRoaXN9LGVuZDpmdW5jdGlvbigpe3JldHVybiAwPT0tLXRoaXMuYWN0aXZlJiYoZGVsZXRlIHRoaXMuc3RhdGUuZW1pdHRlcix0aGlzLmVtaXQoImVuZCIpKSx0aGlzfSxlbWl0OmZ1bmN0aW9uKHQpe0EobmV3IGRkKGUsdCxuLm91dHB1dCh0aGlzLnN0YXRlLnNlbGVjdGlvbikpLGwuYXBwbHksbCxbdCx0aGlzLnRoYXQsdGhpcy5hcmdzXSl9fSxlLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnBkKFtbK3RbMF1bMF0sK3RbMF1bMV1dLFsrdFsxXVswXSwrdFsxXVsxXV1dKSxlKTpzfSxlLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnBkKCEhdCksZSk6Zn0sZS5oYW5kbGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSt0LGUpOmh9LGUub249ZnVuY3Rpb24oKXt2YXIgdD1sLm9uLmFwcGx5KGwsYXJndW1lbnRzKTtyZXR1cm4gdD09PWw/ZTp0fSxlfWZ1bmN0aW9uIFJlKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3JldHVybiB0KG4uc291cmNlLnZhbHVlK24udGFyZ2V0LnZhbHVlLGUuc291cmNlLnZhbHVlK2UudGFyZ2V0LnZhbHVlKX19ZnVuY3Rpb24gcWUoKXt0aGlzLl94MD10aGlzLl95MD10aGlzLl94MT10aGlzLl95MT1udWxsLHRoaXMuXz0iIn1mdW5jdGlvbiBVZSgpe3JldHVybiBuZXcgcWV9ZnVuY3Rpb24gRGUodCl7cmV0dXJuIHQuc291cmNlfWZ1bmN0aW9uIE9lKHQpe3JldHVybiB0LnRhcmdldH1mdW5jdGlvbiBGZSh0KXtyZXR1cm4gdC5yYWRpdXN9ZnVuY3Rpb24gSWUodCl7cmV0dXJuIHQuc3RhcnRBbmdsZX1mdW5jdGlvbiBZZSh0KXtyZXR1cm4gdC5lbmRBbmdsZX1mdW5jdGlvbiBCZSgpe31mdW5jdGlvbiBIZSh0LG4pe3ZhciBlPW5ldyBCZTtpZih0IGluc3RhbmNlb2YgQmUpdC5lYWNoKGZ1bmN0aW9uKHQsbil7ZS5zZXQobix0KX0pO2Vsc2UgaWYoQXJyYXkuaXNBcnJheSh0KSl7dmFyIHIsaT0tMSxvPXQubGVuZ3RoO2lmKG51bGw9PW4pZm9yKDsrK2k8bzspZS5zZXQoaSx0W2ldKTtlbHNlIGZvcig7KytpPG87KWUuc2V0KG4ocj10W2ldLGksdCkscil9ZWxzZSBpZih0KWZvcih2YXIgdSBpbiB0KWUuc2V0KHUsdFt1XSk7cmV0dXJuIGV9ZnVuY3Rpb24gamUoKXtyZXR1cm57fX1mdW5jdGlvbiBYZSh0LG4sZSl7dFtuXT1lfWZ1bmN0aW9uICRlKCl7cmV0dXJuIEhlKCl9ZnVuY3Rpb24gVmUodCxuLGUpe3Quc2V0KG4sZSl9ZnVuY3Rpb24gV2UoKXt9ZnVuY3Rpb24gWmUodCxuKXt2YXIgZT1uZXcgV2U7aWYodCBpbnN0YW5jZW9mIFdlKXQuZWFjaChmdW5jdGlvbih0KXtlLmFkZCh0KX0pO2Vsc2UgaWYodCl7dmFyIHI9LTEsaT10Lmxlbmd0aDtpZihudWxsPT1uKWZvcig7KytyPGk7KWUuYWRkKHRbcl0pO2Vsc2UgZm9yKDsrK3I8aTspZS5hZGQobih0W3JdLHIsdCkpfXJldHVybiBlfWZ1bmN0aW9uIEdlKHQpe3JldHVybiBuZXcgRnVuY3Rpb24oImQiLCJyZXR1cm4geyIrdC5tYXAoZnVuY3Rpb24odCxuKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodCkrIjogZFsiK24rIl0ifSkuam9pbigiLCIpKyJ9Iil9ZnVuY3Rpb24gSmUodCxuKXt2YXIgZT1HZSh0KTtyZXR1cm4gZnVuY3Rpb24ocixpKXtyZXR1cm4gbihlKHIpLGksdCl9fWZ1bmN0aW9uIFFlKHQpe3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCksZT1bXTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgciBpbiB0KXIgaW4gbnx8ZS5wdXNoKG5bcl09cil9KSxlfWZ1bmN0aW9uIEtlKHQsbixlLHIpe2lmKGlzTmFOKG4pfHxpc05hTihlKSlyZXR1cm4gdDt2YXIgaSxvLHUsYSxjLHMsZixsLGgscD10Ll9yb290LGQ9e2RhdGE6cn0sdj10Ll94MCxfPXQuX3kwLHk9dC5feDEsZz10Ll95MTtpZighcClyZXR1cm4gdC5fcm9vdD1kLHQ7Zm9yKDtwLmxlbmd0aDspaWYoKHM9bj49KG89KHYreSkvMikpP3Y9bzp5PW8sKGY9ZT49KHU9KF8rZykvMikpP189dTpnPXUsaT1wLCEocD1wW2w9Zjw8MXxzXSkpcmV0dXJuIGlbbF09ZCx0O2lmKGE9K3QuX3guY2FsbChudWxsLHAuZGF0YSksYz0rdC5feS5jYWxsKG51bGwscC5kYXRhKSxuPT09YSYmZT09PWMpcmV0dXJuIGQubmV4dD1wLGk/aVtsXT1kOnQuX3Jvb3Q9ZCx0O2Rve2k9aT9pW2xdPW5ldyBBcnJheSg0KTp0Ll9yb290PW5ldyBBcnJheSg0KSwocz1uPj0obz0odit5KS8yKSk/dj1vOnk9bywoZj1lPj0odT0oXytnKS8yKSk/Xz11Omc9dX13aGlsZSgobD1mPDwxfHMpPT0oaD0oYz49dSk8PDF8YT49bykpO3JldHVybiBpW2hdPXAsaVtsXT1kLHR9ZnVuY3Rpb24gdHIodCl7dmFyIG4sZSxyLGksbz10Lmxlbmd0aCx1PW5ldyBBcnJheShvKSxhPW5ldyBBcnJheShvKSxjPTEvMCxzPTEvMCxmPS0xLzAsbD0tMS8wO2ZvcihlPTA7ZTxvOysrZSlpc05hTihyPSt0aGlzLl94LmNhbGwobnVsbCxuPXRbZV0pKXx8aXNOYU4oaT0rdGhpcy5feS5jYWxsKG51bGwsbikpfHwodVtlXT1yLGFbZV09aSxyPGMmJihjPXIpLHI+ZiYmKGY9ciksaTxzJiYocz1pKSxpPmwmJihsPWkpKTtmb3IoZjxjJiYoYz10aGlzLl94MCxmPXRoaXMuX3gxKSxsPHMmJihzPXRoaXMuX3kwLGw9dGhpcy5feTEpLHRoaXMuY292ZXIoYyxzKS5jb3ZlcihmLGwpLGU9MDtlPG87KytlKUtlKHRoaXMsdVtlXSxhW2VdLHRbZV0pO3JldHVybiB0aGlzfWZ1bmN0aW9uIG5yKHQpe2Zvcih2YXIgbj0wLGU9dC5sZW5ndGg7bjxlOysrbil0aGlzLnJlbW92ZSh0W25dKTtyZXR1cm4gdGhpc31mdW5jdGlvbiBlcih0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiBycih0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiBpcih0LG4sZSl7dmFyIHI9bmV3IG9yKG51bGw9PW4/ZXI6bixudWxsPT1lP3JyOmUsTmFOLE5hTixOYU4sTmFOKTtyZXR1cm4gbnVsbD09dD9yOnIuYWRkQWxsKHQpfWZ1bmN0aW9uIG9yKHQsbixlLHIsaSxvKXt0aGlzLl94PXQsdGhpcy5feT1uLHRoaXMuX3gwPWUsdGhpcy5feTA9cix0aGlzLl94MT1pLHRoaXMuX3kxPW8sdGhpcy5fcm9vdD12b2lkIDB9ZnVuY3Rpb24gdXIodCl7Zm9yKHZhciBuPXtkYXRhOnQuZGF0YX0sZT1uO3Q9dC5uZXh0OyllPWUubmV4dD17ZGF0YTp0LmRhdGF9O3JldHVybiBufWZ1bmN0aW9uIGFyKHQpe3JldHVybiB0LngrdC52eH1mdW5jdGlvbiBjcih0KXtyZXR1cm4gdC55K3Qudnl9ZnVuY3Rpb24gc3IodCl7cmV0dXJuIHQuaW5kZXh9ZnVuY3Rpb24gZnIodCxuKXt2YXIgZT10LmdldChuKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIrbik7cmV0dXJuIGV9ZnVuY3Rpb24gbHIodCl7cmV0dXJuIHQueH1mdW5jdGlvbiBocih0KXtyZXR1cm4gdC55fWZ1bmN0aW9uIHByKHQpe3JldHVybiBuZXcgZHIodCl9ZnVuY3Rpb24gZHIodCl7aWYoIShuPU92LmV4ZWModCkpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQ6ICIrdCk7dmFyIG4sZT1uWzFdfHwiICIscj1uWzJdfHwiPiIsaT1uWzNdfHwiLSIsbz1uWzRdfHwiIix1PSEhbls1XSxhPW5bNl0mJituWzZdLGM9ISFuWzddLHM9bls4XSYmK25bOF0uc2xpY2UoMSksZj1uWzldfHwiIjsibiI9PT1mPyhjPSEwLGY9ImciKTpEdltmXXx8KGY9IiIpLCh1fHwiMCI9PT1lJiYiPSI9PT1yKSYmKHU9ITAsZT0iMCIscj0iPSIpLHRoaXMuZmlsbD1lLHRoaXMuYWxpZ249ciwKdGhpcy5zaWduPWksdGhpcy5zeW1ib2w9byx0aGlzLnplcm89dSx0aGlzLndpZHRoPWEsdGhpcy5jb21tYT1jLHRoaXMucHJlY2lzaW9uPXMsdGhpcy50eXBlPWZ9ZnVuY3Rpb24gdnIobil7cmV0dXJuIEZ2PUJ2KG4pLHQuZm9ybWF0PUZ2LmZvcm1hdCx0LmZvcm1hdFByZWZpeD1Gdi5mb3JtYXRQcmVmaXgsRnZ9ZnVuY3Rpb24gX3IoKXt0aGlzLnJlc2V0KCl9ZnVuY3Rpb24geXIodCxuLGUpe3ZhciByPXQucz1uK2UsaT1yLW4sbz1yLWk7dC50PW4tbysoZS1pKX1mdW5jdGlvbiBncih0KXtyZXR1cm4gdD4xPzA6dDwtMT9OXzpNYXRoLmFjb3ModCl9ZnVuY3Rpb24gbXIodCl7cmV0dXJuIHQ+MT9TXzp0PC0xPy1TXzpNYXRoLmFzaW4odCl9ZnVuY3Rpb24geHIodCl7cmV0dXJuKHQ9SV8odC8yKSkqdH1mdW5jdGlvbiBicigpe31mdW5jdGlvbiB3cih0LG4pe3QmJlhfLmhhc093blByb3BlcnR5KHQudHlwZSkmJlhfW3QudHlwZV0odCxuKX1mdW5jdGlvbiBNcih0LG4sZSl7dmFyIHIsaT0tMSxvPXQubGVuZ3RoLWU7Zm9yKG4ubGluZVN0YXJ0KCk7KytpPG87KXI9dFtpXSxuLnBvaW50KHJbMF0sclsxXSxyWzJdKTtuLmxpbmVFbmQoKX1mdW5jdGlvbiBUcih0LG4pe3ZhciBlPS0xLHI9dC5sZW5ndGg7Zm9yKG4ucG9seWdvblN0YXJ0KCk7KytlPHI7KU1yKHRbZV0sbiwxKTtuLnBvbHlnb25FbmQoKX1mdW5jdGlvbiBrcigpe1pfLnBvaW50PVNyfWZ1bmN0aW9uIE5yKCl7RXIoVnYsV3YpfWZ1bmN0aW9uIFNyKHQsbil7Wl8ucG9pbnQ9RXIsVnY9dCxXdj1uLHQqPXpfLG4qPXpfLFp2PXQsR3Y9cV8obj1uLzIrRV8pLEp2PUlfKG4pfWZ1bmN0aW9uIEVyKHQsbil7dCo9el8sbio9el8sbj1uLzIrRV87dmFyIGU9dC1adixyPWU+PTA/MTotMSxpPXIqZSxvPXFfKG4pLHU9SV8obiksYT1Kdip1LGM9R3YqbythKnFfKGkpLHM9YSpyKklfKGkpO1ZfLmFkZChSXyhzLGMpKSxadj10LEd2PW8sSnY9dX1mdW5jdGlvbiBBcih0KXtyZXR1cm5bUl8odFsxXSx0WzBdKSxtcih0WzJdKV19ZnVuY3Rpb24gQ3IodCl7dmFyIG49dFswXSxlPXRbMV0scj1xXyhlKTtyZXR1cm5bcipxXyhuKSxyKklfKG4pLElfKGUpXX1mdW5jdGlvbiB6cih0LG4pe3JldHVybiB0WzBdKm5bMF0rdFsxXSpuWzFdK3RbMl0qblsyXX1mdW5jdGlvbiBQcih0LG4pe3JldHVyblt0WzFdKm5bMl0tdFsyXSpuWzFdLHRbMl0qblswXS10WzBdKm5bMl0sdFswXSpuWzFdLXRbMV0qblswXV19ZnVuY3Rpb24gTHIodCxuKXt0WzBdKz1uWzBdLHRbMV0rPW5bMV0sdFsyXSs9blsyXX1mdW5jdGlvbiBScih0LG4pe3JldHVyblt0WzBdKm4sdFsxXSpuLHRbMl0qbl19ZnVuY3Rpb24gcXIodCl7dmFyIG49Ql8odFswXSp0WzBdK3RbMV0qdFsxXSt0WzJdKnRbMl0pO3RbMF0vPW4sdFsxXS89bix0WzJdLz1ufWZ1bmN0aW9uIFVyKHQsbil7dV8ucHVzaChhXz1bUXY9dCx0Xz10XSksbjxLdiYmKEt2PW4pLG4+bl8mJihuXz1uKX1mdW5jdGlvbiBEcih0LG4pe3ZhciBlPUNyKFt0KnpfLG4qel9dKTtpZihvXyl7dmFyIHI9UHIob18sZSksaT1bclsxXSwtclswXSwwXSxvPVByKGkscik7cXIobyksbz1BcihvKTt2YXIgdSxhPXQtZV8sYz1hPjA/MTotMSxzPW9bMF0qQ18qYyxmPVBfKGEpPjE4MDtmXihjKmVfPHMmJnM8Yyp0KT8odT1vWzFdKkNfKT5uXyYmKG5fPXUpOihzPShzKzM2MCklMzYwLTE4MCxmXihjKmVfPHMmJnM8Yyp0KT8odT0tb1sxXSpDXyk8S3YmJihLdj11KToobjxLdiYmKEt2PW4pLG4+bl8mJihuXz1uKSkpLGY/dDxlXz9IcihRdix0KT5IcihRdix0XykmJih0Xz10KTpIcih0LHRfKT5IcihRdix0XykmJihRdj10KTp0Xz49UXY/KHQ8UXYmJihRdj10KSx0PnRfJiYodF89dCkpOnQ+ZV8/SHIoUXYsdCk+SHIoUXYsdF8pJiYodF89dCk6SHIodCx0Xyk+SHIoUXYsdF8pJiYoUXY9dCl9ZWxzZSB1Xy5wdXNoKGFfPVtRdj10LHRfPXRdKTtuPEt2JiYoS3Y9biksbj5uXyYmKG5fPW4pLG9fPWUsZV89dH1mdW5jdGlvbiBPcigpe1FfLnBvaW50PURyfWZ1bmN0aW9uIEZyKCl7YV9bMF09UXYsYV9bMV09dF8sUV8ucG9pbnQ9VXIsb189bnVsbH1mdW5jdGlvbiBJcih0LG4pe2lmKG9fKXt2YXIgZT10LWVfO0pfLmFkZChQXyhlKT4xODA/ZSsoZT4wPzM2MDotMzYwKTplKX1lbHNlIHJfPXQsaV89bjtaXy5wb2ludCh0LG4pLERyKHQsbil9ZnVuY3Rpb24gWXIoKXtaXy5saW5lU3RhcnQoKX1mdW5jdGlvbiBCcigpe0lyKHJfLGlfKSxaXy5saW5lRW5kKCksUF8oSl8pPmtfJiYoUXY9LSh0Xz0xODApKSxhX1swXT1RdixhX1sxXT10XyxvXz1udWxsfWZ1bmN0aW9uIEhyKHQsbil7cmV0dXJuKG4tPXQpPDA/biszNjA6bn1mdW5jdGlvbiBqcih0LG4pe3JldHVybiB0WzBdLW5bMF19ZnVuY3Rpb24gWHIodCxuKXtyZXR1cm4gdFswXTw9dFsxXT90WzBdPD1uJiZuPD10WzFdOm48dFswXXx8dFsxXTxufWZ1bmN0aW9uICRyKHQsbil7dCo9el8sbio9el87dmFyIGU9cV8obik7VnIoZSpxXyh0KSxlKklfKHQpLElfKG4pKX1mdW5jdGlvbiBWcih0LG4sZSl7KytjXyxmXys9KHQtZl8pL2NfLGxfKz0obi1sXykvY18saF8rPShlLWhfKS9jX31mdW5jdGlvbiBXcigpe3R5LnBvaW50PVpyfWZ1bmN0aW9uIFpyKHQsbil7dCo9el8sbio9el87dmFyIGU9cV8obik7Yl89ZSpxXyh0KSx3Xz1lKklfKHQpLE1fPUlfKG4pLHR5LnBvaW50PUdyLFZyKGJfLHdfLE1fKX1mdW5jdGlvbiBHcih0LG4pe3QqPXpfLG4qPXpfO3ZhciBlPXFfKG4pLHI9ZSpxXyh0KSxpPWUqSV8odCksbz1JXyhuKSx1PVJfKEJfKCh1PXdfKm8tTV8qaSkqdSsodT1NXypyLWJfKm8pKnUrKHU9Yl8qaS13XypyKSp1KSxiXypyK3dfKmkrTV8qbyk7c18rPXUscF8rPXUqKGJfKyhiXz1yKSksZF8rPXUqKHdfKyh3Xz1pKSksdl8rPXUqKE1fKyhNXz1vKSksVnIoYl8sd18sTV8pfWZ1bmN0aW9uIEpyKCl7dHkucG9pbnQ9JHJ9ZnVuY3Rpb24gUXIoKXt0eS5wb2ludD10aX1mdW5jdGlvbiBLcigpe25pKG1fLHhfKSx0eS5wb2ludD0kcn1mdW5jdGlvbiB0aSh0LG4pe21fPXQseF89bix0Kj16XyxuKj16Xyx0eS5wb2ludD1uaTt2YXIgZT1xXyhuKTtiXz1lKnFfKHQpLHdfPWUqSV8odCksTV89SV8obiksVnIoYl8sd18sTV8pfWZ1bmN0aW9uIG5pKHQsbil7dCo9el8sbio9el87dmFyIGU9cV8obikscj1lKnFfKHQpLGk9ZSpJXyh0KSxvPUlfKG4pLHU9d18qby1NXyppLGE9TV8qci1iXypvLGM9Yl8qaS13XypyLHM9Ql8odSp1K2EqYStjKmMpLGY9bXIocyksbD1zJiYtZi9zO19fKz1sKnUseV8rPWwqYSxnXys9bCpjLHNfKz1mLHBfKz1mKihiXysoYl89cikpLGRfKz1mKih3Xysod189aSkpLHZfKz1mKihNXysoTV89bykpLFZyKGJfLHdfLE1fKX1mdW5jdGlvbiBlaSh0LG4pe3JldHVyblt0Pk5fP3QtQV86dDwtTl8/dCtBXzp0LG5dfWZ1bmN0aW9uIHJpKHQsbixlKXtyZXR1cm4odCU9QV8pP258fGU/cnkob2kodCksdWkobixlKSk6b2kodCk6bnx8ZT91aShuLGUpOmVpfWZ1bmN0aW9uIGlpKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3JldHVybiBuKz10LFtuPk5fP24tQV86bjwtTl8/bitBXzpuLGVdfX1mdW5jdGlvbiBvaSh0KXt2YXIgbj1paSh0KTtyZXR1cm4gbi5pbnZlcnQ9aWkoLXQpLG59ZnVuY3Rpb24gdWkodCxuKXtmdW5jdGlvbiBlKHQsbil7dmFyIGU9cV8obiksYT1xXyh0KSplLGM9SV8odCkqZSxzPUlfKG4pLGY9cypyK2EqaTtyZXR1cm5bUl8oYypvLWYqdSxhKnItcyppKSxtcihmKm8rYyp1KV19dmFyIHI9cV8odCksaT1JXyh0KSxvPXFfKG4pLHU9SV8obik7cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9cV8obiksYT1xXyh0KSplLGM9SV8odCkqZSxzPUlfKG4pLGY9cypvLWMqdTtyZXR1cm5bUl8oYypvK3MqdSxhKnIrZippKSxtcihmKnItYSppKV19LGV9ZnVuY3Rpb24gYWkodCxuLGUscixpLG8pe2lmKGUpe3ZhciB1PXFfKG4pLGE9SV8obiksYz1yKmU7bnVsbD09aT8oaT1uK3IqQV8sbz1uLWMvMik6KGk9Y2kodSxpKSxvPWNpKHUsbyksKHI+MD9pPG86aT5vKSYmKGkrPXIqQV8pKTtmb3IodmFyIHMsZj1pO3I+MD9mPm86ZjxvO2YtPWMpcz1BcihbdSwtYSpxXyhmKSwtYSpJXyhmKV0pLHQucG9pbnQoc1swXSxzWzFdKX19ZnVuY3Rpb24gY2kodCxuKXtuPUNyKG4pLG5bMF0tPXQscXIobik7dmFyIGU9Z3IoLW5bMV0pO3JldHVybigoLW5bMl08MD8tZTplKStBXy1rXyklQV99ZnVuY3Rpb24gc2kodCxuLGUscil7dGhpcy54PXQsdGhpcy56PW4sdGhpcy5vPWUsdGhpcy5lPXIsdGhpcy52PSExLHRoaXMubj10aGlzLnA9bnVsbH1mdW5jdGlvbiBmaSh0KXtpZihuPXQubGVuZ3RoKXtmb3IodmFyIG4sZSxyPTAsaT10WzBdOysrcjxuOylpLm49ZT10W3JdLGUucD1pLGk9ZTtpLm49ZT10WzBdLGUucD1pfX1mdW5jdGlvbiBsaSh0LG4sZSxyKXtmdW5jdGlvbiBpKGksbyl7cmV0dXJuIHQ8PWkmJmk8PWUmJm48PW8mJm88PXJ9ZnVuY3Rpb24gbyhpLG8sYSxzKXt2YXIgZj0wLGw9MDtpZihudWxsPT1pfHwoZj11KGksYSkpIT09KGw9dShvLGEpKXx8YyhpLG8pPDBeYT4wKWRve3MucG9pbnQoMD09PWZ8fDM9PT1mP3Q6ZSxmPjE/cjpuKX13aGlsZSgoZj0oZithKzQpJTQpIT09bCk7ZWxzZSBzLnBvaW50KG9bMF0sb1sxXSl9ZnVuY3Rpb24gdShyLGkpe3JldHVybiBQXyhyWzBdLXQpPGtfP2k+MD8wOjM6UF8oclswXS1lKTxrXz9pPjA/MjoxOlBfKHJbMV0tbik8a18/aT4wPzE6MDppPjA/MzoyfWZ1bmN0aW9uIGEodCxuKXtyZXR1cm4gYyh0Lngsbi54KX1mdW5jdGlvbiBjKHQsbil7dmFyIGU9dSh0LDEpLHI9dShuLDEpO3JldHVybiBlIT09cj9lLXI6MD09PWU/blsxXS10WzFdOjE9PT1lP3RbMF0tblswXToyPT09ZT90WzFdLW5bMV06blswXS10WzBdfXJldHVybiBmdW5jdGlvbih1KXtmdW5jdGlvbiBjKHQsbil7aSh0LG4pJiZOLnBvaW50KHQsbil9ZnVuY3Rpb24gcygpe2Zvcih2YXIgbj0wLGU9MCxpPV8ubGVuZ3RoO2U8aTsrK2UpZm9yKHZhciBvLHUsYT1fW2VdLGM9MSxzPWEubGVuZ3RoLGY9YVswXSxsPWZbMF0saD1mWzFdO2M8czsrK2Mpbz1sLHU9aCxmPWFbY10sbD1mWzBdLGg9ZlsxXSx1PD1yP2g+ciYmKGwtbykqKHItdSk+KGgtdSkqKHQtbykmJisrbjpoPD1yJiYobC1vKSooci11KTwoaC11KSoodC1vKSYmLS1uO3JldHVybiBufWZ1bmN0aW9uIGYoKXtOPVMsdj1bXSxfPVtdLGs9ITB9ZnVuY3Rpb24gbCgpe3ZhciB0PXMoKSxuPWsmJnQsZT0odj1iZih2KSkubGVuZ3RoOyhufHxlKSYmKHUucG9seWdvblN0YXJ0KCksbiYmKHUubGluZVN0YXJ0KCksbyhudWxsLG51bGwsMSx1KSx1LmxpbmVFbmQoKSksZSYmeHkodixhLHQsbyx1KSx1LnBvbHlnb25FbmQoKSksTj11LHY9Xz15PW51bGx9ZnVuY3Rpb24gaCgpe0UucG9pbnQ9ZCxfJiZfLnB1c2goeT1bXSksVD0hMCxNPSExLGI9dz1OYU59ZnVuY3Rpb24gcCgpe3YmJihkKGcsbSkseCYmTSYmUy5yZWpvaW4oKSx2LnB1c2goUy5yZXN1bHQoKSkpLEUucG9pbnQ9YyxNJiZOLmxpbmVFbmQoKX1mdW5jdGlvbiBkKG8sdSl7dmFyIGE9aShvLHUpO2lmKF8mJnkucHVzaChbbyx1XSksVClnPW8sbT11LHg9YSxUPSExLGEmJihOLmxpbmVTdGFydCgpLE4ucG9pbnQobyx1KSk7ZWxzZSBpZihhJiZNKU4ucG9pbnQobyx1KTtlbHNle3ZhciBjPVtiPU1hdGgubWF4KHd5LE1hdGgubWluKGJ5LGIpKSx3PU1hdGgubWF4KHd5LE1hdGgubWluKGJ5LHcpKV0scz1bbz1NYXRoLm1heCh3eSxNYXRoLm1pbihieSxvKSksdT1NYXRoLm1heCh3eSxNYXRoLm1pbihieSx1KSldO2d5KGMscyx0LG4sZSxyKT8oTXx8KE4ubGluZVN0YXJ0KCksTi5wb2ludChjWzBdLGNbMV0pKSxOLnBvaW50KHNbMF0sc1sxXSksYXx8Ti5saW5lRW5kKCksaz0hMSk6YSYmKE4ubGluZVN0YXJ0KCksTi5wb2ludChvLHUpLGs9ITEpfWI9byx3PXUsTT1hfXZhciB2LF8seSxnLG0seCxiLHcsTSxULGssTj11LFM9eXkoKSxFPXtwb2ludDpjLGxpbmVTdGFydDpoLGxpbmVFbmQ6cCxwb2x5Z29uU3RhcnQ6Zixwb2x5Z29uRW5kOmx9O3JldHVybiBFfX1mdW5jdGlvbiBoaSgpe1N5LnBvaW50PWRpLFN5LmxpbmVFbmQ9cGl9ZnVuY3Rpb24gcGkoKXtTeS5wb2ludD1TeS5saW5lRW5kPWJyfWZ1bmN0aW9uIGRpKHQsbil7dCo9el8sbio9el8saXk9dCxveT1JXyhuKSx1eT1xXyhuKSxTeS5wb2ludD12aX1mdW5jdGlvbiB2aSh0LG4pe3QqPXpfLG4qPXpfO3ZhciBlPUlfKG4pLHI9cV8obiksaT1QXyh0LWl5KSxvPXFfKGkpLHU9SV8oaSksYT1yKnUsYz11eSplLW95KnIqbyxzPW95KmUrdXkqcipvO055LmFkZChSXyhCXyhhKmErYypjKSxzKSksaXk9dCxveT1lLHV5PXJ9ZnVuY3Rpb24gX2kodCxuKXtyZXR1cm4hKCF0fHwhTHkuaGFzT3duUHJvcGVydHkodC50eXBlKSkmJkx5W3QudHlwZV0odCxuKX1mdW5jdGlvbiB5aSh0LG4pe3JldHVybiAwPT09enkodCxuKX1mdW5jdGlvbiBnaSh0LG4pe3ZhciBlPXp5KHRbMF0sdFsxXSk7cmV0dXJuIHp5KHRbMF0sbikrenkobix0WzFdKTw9ZStrX31mdW5jdGlvbiBtaSh0LG4pe3JldHVybiEha3kodC5tYXAoeGkpLGJpKG4pKX1mdW5jdGlvbiB4aSh0KXtyZXR1cm4gdD10Lm1hcChiaSksdC5wb3AoKSx0fWZ1bmN0aW9uIGJpKHQpe3JldHVyblt0WzBdKnpfLHRbMV0qel9dfWZ1bmN0aW9uIHdpKHQsbixlKXt2YXIgcj1jZih0LG4ta18sZSkuY29uY2F0KG4pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gci5tYXAoZnVuY3Rpb24obil7cmV0dXJuW3Qsbl19KX19ZnVuY3Rpb24gTWkodCxuLGUpe3ZhciByPWNmKHQsbi1rXyxlKS5jb25jYXQobik7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiByLm1hcChmdW5jdGlvbihuKXtyZXR1cm5bbix0XX0pfX1mdW5jdGlvbiBUaSgpe2Z1bmN0aW9uIHQoKXtyZXR1cm57dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczpuKCl9fWZ1bmN0aW9uIG4oKXtyZXR1cm4gY2YoVV8oby9fKSpfLGksXykubWFwKGgpLmNvbmNhdChjZihVXyhzL3kpKnksYyx5KS5tYXAocCkpLmNvbmNhdChjZihVXyhyL2QpKmQsZSxkKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIFBfKHQlXyk+a199KS5tYXAoZikpLmNvbmNhdChjZihVXyhhL3YpKnYsdSx2KS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIFBfKHQleSk+a199KS5tYXAobCkpfXZhciBlLHIsaSxvLHUsYSxjLHMsZixsLGgscCxkPTEwLHY9ZCxfPTkwLHk9MzYwLGc9Mi41O3JldHVybiB0LmxpbmVzPWZ1bmN0aW9uKCl7cmV0dXJuIG4oKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJue3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnR9fSl9LHQub3V0bGluZT1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbaChvKS5jb25jYXQocChjKS5zbGljZSgxKSxoKGkpLnJldmVyc2UoKS5zbGljZSgxKSxwKHMpLnJldmVyc2UoKS5zbGljZSgxKSldfX0sdC5leHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dC5leHRlbnRNYWpvcihuKS5leHRlbnRNaW5vcihuKTp0LmV4dGVudE1pbm9yKCl9LHQuZXh0ZW50TWFqb3I9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K25bMF1bMF0saT0rblsxXVswXSxzPStuWzBdWzFdLGM9K25bMV1bMV0sbz5pJiYobj1vLG89aSxpPW4pLHM+YyYmKG49cyxzPWMsYz1uKSx0LnByZWNpc2lvbihnKSk6W1tvLHNdLFtpLGNdXX0sdC5leHRlbnRNaW5vcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rblswXVswXSxlPStuWzFdWzBdLGE9K25bMF1bMV0sdT0rblsxXVsxXSxyPmUmJihuPXIscj1lLGU9biksYT51JiYobj1hLGE9dSx1PW4pLHQucHJlY2lzaW9uKGcpKTpbW3IsYV0sW2UsdV1dfSx0LnN0ZXA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dC5zdGVwTWFqb3Iobikuc3RlcE1pbm9yKG4pOnQuc3RlcE1pbm9yKCl9LHQuc3RlcE1ham9yPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhfPStuWzBdLHk9K25bMV0sdCk6W18seV19LHQuc3RlcE1pbm9yPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPStuWzBdLHY9K25bMV0sdCk6W2Qsdl19LHQucHJlY2lzaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPStuLGY9d2koYSx1LDkwKSxsPU1pKHIsZSxnKSxoPXdpKHMsYyw5MCkscD1NaShvLGksZyksdCk6Z30sdC5leHRlbnRNYWpvcihbWy0xODAsLTkwK2tfXSxbMTgwLDkwLWtfXV0pLmV4dGVudE1pbm9yKFtbLTE4MCwtODAta19dLFsxODAsODAra19dXSl9ZnVuY3Rpb24ga2koKXtyZXR1cm4gVGkoKSgpfWZ1bmN0aW9uIE5pKCl7RnkucG9pbnQ9U2l9ZnVuY3Rpb24gU2kodCxuKXtGeS5wb2ludD1FaSxheT1zeT10LGN5PWZ5PW59ZnVuY3Rpb24gRWkodCxuKXtPeS5hZGQoZnkqdC1zeSpuKSxzeT10LGZ5PW59ZnVuY3Rpb24gQWkoKXtFaShheSxjeSl9ZnVuY3Rpb24gQ2kodCxuKXt0PEl5JiYoSXk9dCksdD5CeSYmKEJ5PXQpLG48WXkmJihZeT1uKSxuPkh5JiYoSHk9bil9ZnVuY3Rpb24gemkodCxuKXtYeSs9dCwkeSs9biwrK1Z5fWZ1bmN0aW9uIFBpKCl7dGcucG9pbnQ9TGl9ZnVuY3Rpb24gTGkodCxuKXt0Zy5wb2ludD1SaSx6aShweT10LGR5PW4pfWZ1bmN0aW9uIFJpKHQsbil7dmFyIGU9dC1weSxyPW4tZHksaT1CXyhlKmUrcipyKTtXeSs9aSoocHkrdCkvMixaeSs9aSooZHkrbikvMixHeSs9aSx6aShweT10LGR5PW4pfWZ1bmN0aW9uIHFpKCl7dGcucG9pbnQ9eml9ZnVuY3Rpb24gVWkoKXt0Zy5wb2ludD1PaX1mdW5jdGlvbiBEaSgpe0ZpKGx5LGh5KX1mdW5jdGlvbiBPaSh0LG4pe3RnLnBvaW50PUZpLHppKGx5PXB5PXQsaHk9ZHk9bil9ZnVuY3Rpb24gRmkodCxuKXt2YXIgZT10LXB5LHI9bi1keSxpPUJfKGUqZStyKnIpO1d5Kz1pKihweSt0KS8yLFp5Kz1pKihkeStuKS8yLEd5Kz1pLGk9ZHkqdC1weSpuLEp5Kz1pKihweSt0KSxReSs9aSooZHkrbiksS3krPTMqaSx6aShweT10LGR5PW4pfWZ1bmN0aW9uIElpKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBZaSh0LG4pe2FnLnBvaW50PUJpLGVnPWlnPXQscmc9b2c9bn1mdW5jdGlvbiBCaSh0LG4pe2lnLT10LG9nLT1uLHVnLmFkZChCXyhpZyppZytvZypvZykpLGlnPXQsb2c9bn1mdW5jdGlvbiBIaSgpe3RoaXMuX3N0cmluZz1bXX1mdW5jdGlvbiBqaSh0KXtyZXR1cm4ibTAsIit0KyJhIit0KyIsIit0KyIgMCAxLDEgMCwiKy0yKnQrImEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrMip0KyJ6In1mdW5jdGlvbiBYaSh0KXtyZXR1cm4gdC5sZW5ndGg+MX1mdW5jdGlvbiAkaSh0LG4pe3JldHVybigodD10LngpWzBdPDA/dFsxXS1TXy1rXzpTXy10WzFdKS0oKG49bi54KVswXTwwP25bMV0tU18ta186U18tblsxXSl9ZnVuY3Rpb24gVmkodCl7dmFyIG4sZT1OYU4scj1OYU4saT1OYU47cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe3QubGluZVN0YXJ0KCksbj0xfSxwb2ludDpmdW5jdGlvbihvLHUpe3ZhciBhPW8+MD9OXzotTl8sYz1QXyhvLWUpO1BfKGMtTl8pPGtfPyh0LnBvaW50KGUscj0ocit1KS8yPjA/U186LVNfKSx0LnBvaW50KGksciksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KGEsciksdC5wb2ludChvLHIpLG49MCk6aSE9PWEmJmM+PU5fJiYoUF8oZS1pKTxrXyYmKGUtPWkqa18pLFBfKG8tYSk8a18mJihvLT1hKmtfKSxyPVdpKGUscixvLHUpLHQucG9pbnQoaSxyKSx0LmxpbmVFbmQoKSx0LmxpbmVTdGFydCgpLHQucG9pbnQoYSxyKSxuPTApLHQucG9pbnQoZT1vLHI9dSksaT1hfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dC5saW5lRW5kKCksZT1yPU5hTn0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gMi1ufX19ZnVuY3Rpb24gV2kodCxuLGUscil7dmFyIGksbyx1PUlfKHQtZSk7cmV0dXJuIFBfKHUpPmtfP0xfKChJXyhuKSoobz1xXyhyKSkqSV8oZSktSV8ocikqKGk9cV8obikpKklfKHQpKS8oaSpvKnUpKToobityKS8yfWZ1bmN0aW9uIFppKHQsbixlLHIpe3ZhciBpO2lmKG51bGw9PXQpaT1lKlNfLHIucG9pbnQoLU5fLGkpLHIucG9pbnQoMCxpKSxyLnBvaW50KE5fLGkpLHIucG9pbnQoTl8sMCksci5wb2ludChOXywtaSksci5wb2ludCgwLC1pKSxyLnBvaW50KC1OXywtaSksci5wb2ludCgtTl8sMCksci5wb2ludCgtTl8saSk7ZWxzZSBpZihQXyh0WzBdLW5bMF0pPmtfKXt2YXIgbz10WzBdPG5bMF0/Tl86LU5fO2k9ZSpvLzIsci5wb2ludCgtbyxpKSxyLnBvaW50KDAsaSksci5wb2ludChvLGkpfWVsc2Ugci5wb2ludChuWzBdLG5bMV0pfWZ1bmN0aW9uIEdpKHQpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1uZXcgSmk7Zm9yKHZhciByIGluIHQpZVtyXT10W3JdO3JldHVybiBlLnN0cmVhbT1uLGV9fWZ1bmN0aW9uIEppKCl7fWZ1bmN0aW9uIFFpKHQsbixlKXt2YXIgcj1uWzFdWzBdLW5bMF1bMF0saT1uWzFdWzFdLW5bMF1bMV0sbz10LmNsaXBFeHRlbnQmJnQuY2xpcEV4dGVudCgpO3Quc2NhbGUoMTUwKS50cmFuc2xhdGUoWzAsMF0pLG51bGwhPW8mJnQuY2xpcEV4dGVudChudWxsKSwkXyhlLHQuc3RyZWFtKGp5KSk7dmFyIHU9ankucmVzdWx0KCksYT1NYXRoLm1pbihyLyh1WzFdWzBdLXVbMF1bMF0pLGkvKHVbMV1bMV0tdVswXVsxXSkpLGM9K25bMF1bMF0rKHItYSoodVsxXVswXSt1WzBdWzBdKSkvMixzPStuWzBdWzFdKyhpLWEqKHVbMV1bMV0rdVswXVsxXSkpLzI7cmV0dXJuIG51bGwhPW8mJnQuY2xpcEV4dGVudChvKSx0LnNjYWxlKDE1MCphKS50cmFuc2xhdGUoW2Msc10pfWZ1bmN0aW9uIEtpKHQsbixlKXtyZXR1cm4gUWkodCxbWzAsMF0sbl0sZSl9ZnVuY3Rpb24gdG8odCl7cmV0dXJuIEdpKHtwb2ludDpmdW5jdGlvbihuLGUpe249dChuLGUpLHRoaXMuc3RyZWFtLnBvaW50KG5bMF0sblsxXSl9fSl9ZnVuY3Rpb24gbm8odCxuKXtmdW5jdGlvbiBlKHIsaSxvLHUsYSxjLHMsZixsLGgscCxkLHYsXyl7dmFyIHk9cy1yLGc9Zi1pLG09eSp5K2cqZztpZihtPjQqbiYmdi0tKXt2YXIgeD11K2gsYj1hK3Asdz1jK2QsTT1CXyh4KngrYipiK3cqdyksVD1tcih3Lz1NKSxrPVBfKFBfKHcpLTEpPGtffHxQXyhvLWwpPGtfPyhvK2wpLzI6Ul8oYix4KSxOPXQoayxUKSxTPU5bMF0sRT1OWzFdLEE9Uy1yLEM9RS1pLHo9ZypBLXkqQzsoeip6L20+bnx8UF8oKHkqQStnKkMpL20tLjUpPi4zfHx1KmgrYSpwK2MqZDxkZykmJihlKHIsaSxvLHUsYSxjLFMsRSxrLHgvPU0sYi89TSx3LHYsXyksXy5wb2ludChTLEUpLGUoUyxFLGsseCxiLHcscyxmLGwsaCxwLGQsdixfKSl9fXJldHVybiBmdW5jdGlvbihuKXtmdW5jdGlvbiByKGUscil7ZT10KGUsciksbi5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIGkoKXt5PU5hTix3LnBvaW50PW8sbi5saW5lU3RhcnQoKX1mdW5jdGlvbiBvKHIsaSl7dmFyIG89Q3IoW3IsaV0pLHU9dChyLGkpO2UoeSxnLF8sbSx4LGIseT11WzBdLGc9dVsxXSxfPXIsbT1vWzBdLHg9b1sxXSxiPW9bMl0scGcsbiksbi5wb2ludCh5LGcpfWZ1bmN0aW9uIHUoKXt3LnBvaW50PXIsbi5saW5lRW5kKCl9ZnVuY3Rpb24gYSgpe2koKSx3LnBvaW50PWMsdy5saW5lRW5kPXN9ZnVuY3Rpb24gYyh0LG4pe28oZj10LG4pLGw9eSxoPWcscD1tLGQ9eCx2PWIsdy5wb2ludD1vfWZ1bmN0aW9uIHMoKXtlKHksZyxfLG0seCxiLGwsaCxmLHAsZCx2LHBnLG4pLHcubGluZUVuZD11LHUoKX12YXIgZixsLGgscCxkLHYsXyx5LGcsbSx4LGIsdz17cG9pbnQ6cixsaW5lU3RhcnQ6aSxsaW5lRW5kOnUscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7bi5wb2x5Z29uU3RhcnQoKSx3LmxpbmVTdGFydD1hfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7bi5wb2x5Z29uRW5kKCksdy5saW5lU3RhcnQ9aX19O3JldHVybiB3fX1mdW5jdGlvbiBlbyh0KXtyZXR1cm4gcm8oZnVuY3Rpb24oKXtyZXR1cm4gdH0pKCl9ZnVuY3Rpb24gcm8odCl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gdD1mKHRbMF0qel8sdFsxXSp6XyksW3RbMF0qXythLGMtdFsxXSpfXX1mdW5jdGlvbiBlKHQpe3JldHVybih0PWYuaW52ZXJ0KCh0WzBdLWEpL18sKGMtdFsxXSkvXykpJiZbdFswXSpDXyx0WzFdKkNfXX1mdW5jdGlvbiByKHQsbil7cmV0dXJuIHQ9dSh0LG4pLFt0WzBdKl8rYSxjLXRbMV0qX119ZnVuY3Rpb24gaSgpe2Y9cnkocz1yaShiLHcsTSksdSk7dmFyIHQ9dShtLHgpO3JldHVybiBhPXktdFswXSpfLGM9Zyt0WzFdKl8sbygpfWZ1bmN0aW9uIG8oKXtyZXR1cm4gZD12PW51bGwsbn12YXIgdSxhLGMscyxmLGwsaCxwLGQsdixfPTE1MCx5PTQ4MCxnPTI1MCxtPTAseD0wLGI9MCx3PTAsTT0wLFQ9bnVsbCxrPWZnLE49bnVsbCxTPVV5LEU9LjUsQT12ZyhyLEUpO3JldHVybiBuLnN0cmVhbT1mdW5jdGlvbih0KXtyZXR1cm4gZCYmdj09PXQ/ZDpkPV9nKGsocyxBKFModj10KSkpKX0sbi5jbGlwQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGs9K3Q/bGcoVD10KnpfLDYqel8pOihUPW51bGwsZmcpLG8oKSk6VCpDX30sbi5jbGlwRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhTPW51bGw9PXQ/KE49bD1oPXA9bnVsbCxVeSk6bGkoTj0rdFswXVswXSxsPSt0WzBdWzFdLGg9K3RbMV1bMF0scD0rdFsxXVsxXSksbygpKTpudWxsPT1OP251bGw6W1tOLGxdLFtoLHBdXX0sbi5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oXz0rdCxpKCkpOl99LG4udHJhbnNsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PSt0WzBdLGc9K3RbMV0saSgpKTpbeSxnXX0sbi5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG09dFswXSUzNjAqel8seD10WzFdJTM2MCp6XyxpKCkpOlttKkNfLHgqQ19dfSxuLnJvdGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYj10WzBdJTM2MCp6Xyx3PXRbMV0lMzYwKnpfLE09dC5sZW5ndGg+Mj90WzJdJTM2MCp6XzowLGkoKSk6W2IqQ18sdypDXyxNKkNfXX0sbi5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEE9dmcocixFPXQqdCksbygpKTpCXyhFKX0sbi5maXRFeHRlbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gUWkobix0LGUpfSxuLmZpdFNpemU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gS2kobix0LGUpfSxmdW5jdGlvbigpe3JldHVybiB1PXQuYXBwbHkodGhpcyxhcmd1bWVudHMpLG4uaW52ZXJ0PXUuaW52ZXJ0JiZlLGkoKX19ZnVuY3Rpb24gaW8odCl7dmFyIG49MCxlPU5fLzMscj1ybyh0KSxpPXIobixlKTtyZXR1cm4gaS5wYXJhbGxlbHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/cihuPXRbMF0qel8sZT10WzFdKnpfKTpbbipDXyxlKkNfXX0saX1mdW5jdGlvbiBvbyh0KXtmdW5jdGlvbiBuKHQsbil7cmV0dXJuW3QqZSxJXyhuKS9lXX12YXIgZT1xXyh0KTtyZXR1cm4gbi5pbnZlcnQ9ZnVuY3Rpb24odCxuKXtyZXR1cm5bdC9lLG1yKG4qZSldfSxufWZ1bmN0aW9uIHVvKHQsbil7ZnVuY3Rpb24gZSh0LG4pe3ZhciBlPUJfKG8tMippKklfKG4pKS9pO3JldHVybltlKklfKHQqPWkpLHUtZSpxXyh0KV19dmFyIHI9SV8odCksaT0ocitJXyhuKSkvMjtpZihQXyhpKTxrXylyZXR1cm4gb28odCk7dmFyIG89MStyKigyKmktciksdT1CXyhvKS9pO3JldHVybiBlLmludmVydD1mdW5jdGlvbih0LG4pe3ZhciBlPXUtbjtyZXR1cm5bUl8odCxQXyhlKSkvaSpZXyhlKSxtcigoby0odCp0K2UqZSkqaSppKS8oMippKSldfSxlfWZ1bmN0aW9uIGFvKHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybntwb2ludDpmdW5jdGlvbihlLHIpe2Zvcih2YXIgaT0tMTsrK2k8bjspdFtpXS5wb2ludChlLHIpfSxzcGhlcmU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9LTE7KytlPG47KXRbZV0uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe2Zvcih2YXIgZT0tMTsrK2U8bjspdFtlXS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe2Zvcih2YXIgZT0tMTsrK2U8bjspdFtlXS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2Zvcih2YXIgZT0tMTsrK2U8bjspdFtlXS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2Zvcih2YXIgZT0tMTsrK2U8bjspdFtlXS5wb2x5Z29uRW5kKCl9fX1mdW5jdGlvbiBjbyh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj1xXyhuKSxpPXFfKGUpLG89dChyKmkpO3JldHVybltvKmkqSV8obiksbypJXyhlKV19fWZ1bmN0aW9uIHNvKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPUJfKG4qbitlKmUpLGk9dChyKSxvPUlfKGkpLHU9cV8oaSk7cmV0dXJuW1JfKG4qbyxyKnUpLG1yKHImJmUqby9yKV19fWZ1bmN0aW9uIGZvKHQsbil7cmV0dXJuW3QsT18oSF8oKFNfK24pLzIpKV19ZnVuY3Rpb24gbG8odCl7ZnVuY3Rpb24gbigpe3ZhciBuPU5fKmEoKSx1PW8odnkoby5yb3RhdGUoKSkuaW52ZXJ0KFswLDBdKSk7cmV0dXJuIHMobnVsbD09Zj9bW3VbMF0tbix1WzFdLW5dLFt1WzBdK24sdVsxXStuXV06dD09PWZvP1tbTWF0aC5tYXgodVswXS1uLGYpLGVdLFtNYXRoLm1pbih1WzBdK24sciksaV1dOltbZixNYXRoLm1heCh1WzFdLW4sZSldLFtyLE1hdGgubWluKHVbMV0rbixpKV1dKX12YXIgZSxyLGksbz1lbyh0KSx1PW8uY2VudGVyLGE9by5zY2FsZSxjPW8udHJhbnNsYXRlLHM9by5jbGlwRXh0ZW50LGY9bnVsbDtyZXR1cm4gby5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYSh0KSxuKCkpOmEoKX0sby50cmFuc2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGModCksbigpKTpjKCl9LG8uY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1KHQpLG4oKSk6dSgpfSxvLmNsaXBFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/Zj1lPXI9aT1udWxsOihmPSt0WzBdWzBdLGU9K3RbMF1bMV0scj0rdFsxXVswXSxpPSt0WzFdWzFdKSxuKCkpOm51bGw9PWY/bnVsbDpbW2YsZV0sW3IsaV1dfSxuKCl9ZnVuY3Rpb24gaG8odCl7cmV0dXJuIEhfKChTXyt0KS8yKX1mdW5jdGlvbiBwbyh0LG4pe2Z1bmN0aW9uIGUodCxuKXtvPjA/bjwtU18ra18mJihuPS1TXytrXyk6bj5TXy1rXyYmKG49U18ta18pO3ZhciBlPW8vRl8oaG8obiksaSk7cmV0dXJuW2UqSV8oaSp0KSxvLWUqcV8oaSp0KV19dmFyIHI9cV8odCksaT10PT09bj9JXyh0KTpPXyhyL3FfKG4pKS9PXyhobyhuKS9obyh0KSksbz1yKkZfKGhvKHQpLGkpL2k7cmV0dXJuIGk/KGUuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9by1uLHI9WV8oaSkqQl8odCp0K2UqZSk7cmV0dXJuW1JfKHQsUF8oZSkpL2kqWV8oZSksMipMXyhGXyhvL3IsMS9pKSktU19dfSxlKTpmb31mdW5jdGlvbiB2byh0LG4pe3JldHVyblt0LG5dfWZ1bmN0aW9uIF9vKHQsbil7ZnVuY3Rpb24gZSh0LG4pe3ZhciBlPW8tbixyPWkqdDtyZXR1cm5bZSpJXyhyKSxvLWUqcV8ocildfXZhciByPXFfKHQpLGk9dD09PW4/SV8odCk6KHItcV8obikpLyhuLXQpLG89ci9pK3Q7cmV0dXJuIFBfKGkpPGtfP3ZvOihlLmludmVydD1mdW5jdGlvbih0LG4pe3ZhciBlPW8tbjtyZXR1cm5bUl8odCxQXyhlKSkvaSpZXyhlKSxvLVlfKGkpKkJfKHQqdCtlKmUpXX0sZSl9ZnVuY3Rpb24geW8odCxuKXt2YXIgZT1xXyhuKSxyPXFfKHQpKmU7cmV0dXJuW2UqSV8odCkvcixJXyhuKS9yXX1mdW5jdGlvbiBnbyh0LG4sZSxyKXtyZXR1cm4gMT09PXQmJjE9PT1uJiYwPT09ZSYmMD09PXI/VXk6R2koe3BvaW50OmZ1bmN0aW9uKGksbyl7dGhpcy5zdHJlYW0ucG9pbnQoaSp0K2UsbypuK3IpfX0pfWZ1bmN0aW9uIG1vKHQsbil7cmV0dXJuW3FfKG4pKklfKHQpLElfKG4pXX1mdW5jdGlvbiB4byh0LG4pe3ZhciBlPXFfKG4pLHI9MStxXyh0KSplO3JldHVybltlKklfKHQpL3IsSV8obikvcl19ZnVuY3Rpb24gYm8odCxuKXtyZXR1cm5bT18oSF8oKFNfK24pLzIpKSwtdF19ZnVuY3Rpb24gd28odCxuKXtyZXR1cm4gdC5wYXJlbnQ9PT1uLnBhcmVudD8xOjJ9ZnVuY3Rpb24gTW8odCl7cmV0dXJuIHQucmVkdWNlKFRvLDApL3QubGVuZ3RofWZ1bmN0aW9uIFRvKHQsbil7cmV0dXJuIHQrbi54fWZ1bmN0aW9uIGtvKHQpe3JldHVybiAxK3QucmVkdWNlKE5vLDApfWZ1bmN0aW9uIE5vKHQsbil7cmV0dXJuIE1hdGgubWF4KHQsbi55KX1mdW5jdGlvbiBTbyh0KXtmb3IodmFyIG47bj10LmNoaWxkcmVuOyl0PW5bMF07cmV0dXJuIHR9ZnVuY3Rpb24gRW8odCl7Zm9yKHZhciBuO249dC5jaGlsZHJlbjspdD1uW24ubGVuZ3RoLTFdO3JldHVybiB0fWZ1bmN0aW9uIEFvKHQpe3ZhciBuPTAsZT10LmNoaWxkcmVuLHI9ZSYmZS5sZW5ndGg7aWYocilmb3IoOy0tcj49MDspbis9ZVtyXS52YWx1ZTtlbHNlIG49MTt0LnZhbHVlPW59ZnVuY3Rpb24gQ28odCxuKXtpZih0PT09bilyZXR1cm4gdDt2YXIgZT10LmFuY2VzdG9ycygpLHI9bi5hbmNlc3RvcnMoKSxpPW51bGw7Zm9yKHQ9ZS5wb3AoKSxuPXIucG9wKCk7dD09PW47KWk9dCx0PWUucG9wKCksbj1yLnBvcCgpO3JldHVybiBpfWZ1bmN0aW9uIHpvKHQsbil7dmFyIGUscixpLG8sdSxhPW5ldyBVbyh0KSxjPSt0LnZhbHVlJiYoYS52YWx1ZT10LnZhbHVlKSxzPVthXTtmb3IobnVsbD09biYmKG49TG8pO2U9cy5wb3AoKTspaWYoYyYmKGUudmFsdWU9K2UuZGF0YS52YWx1ZSksKGk9bihlLmRhdGEpKSYmKHU9aS5sZW5ndGgpKWZvcihlLmNoaWxkcmVuPW5ldyBBcnJheSh1KSxvPXUtMTtvPj0wOy0tbylzLnB1c2gocj1lLmNoaWxkcmVuW29dPW5ldyBVbyhpW29dKSksci5wYXJlbnQ9ZSxyLmRlcHRoPWUuZGVwdGgrMTtyZXR1cm4gYS5lYWNoQmVmb3JlKHFvKX1mdW5jdGlvbiBQbygpe3JldHVybiB6byh0aGlzKS5lYWNoQmVmb3JlKFJvKX1mdW5jdGlvbiBMbyh0KXtyZXR1cm4gdC5jaGlsZHJlbn1mdW5jdGlvbiBSbyh0KXt0LmRhdGE9dC5kYXRhLmRhdGF9ZnVuY3Rpb24gcW8odCl7dmFyIG49MDtkb3t0LmhlaWdodD1ufXdoaWxlKCh0PXQucGFyZW50KSYmdC5oZWlnaHQ8KytuKX1mdW5jdGlvbiBVbyh0KXt0aGlzLmRhdGE9dCx0aGlzLmRlcHRoPXRoaXMuaGVpZ2h0PTAsdGhpcy5wYXJlbnQ9bnVsbH1mdW5jdGlvbiBEbyh0KXt0aGlzLl89dCx0aGlzLm5leHQ9bnVsbH1mdW5jdGlvbiBPbyh0LG4pe3ZhciBlPW4ueC10Lngscj1uLnktdC55LGk9dC5yLW4ucjtyZXR1cm4gaSppKzFlLTY+ZSplK3Iqcn1mdW5jdGlvbiBGbyh0LG4pe3ZhciBlLHIsaSxvPW51bGwsdT10LmhlYWQ7c3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDE6ZT1JbyhuWzBdKTticmVhaztjYXNlIDI6ZT1ZbyhuWzBdLG5bMV0pO2JyZWFrO2Nhc2UgMzplPUJvKG5bMF0sblsxXSxuWzJdKX1mb3IoO3U7KWk9dS5fLHI9dS5uZXh0LGUmJk9vKGUsaSk/bz11OihvPyh0LnRhaWw9byxvLm5leHQ9bnVsbCk6dC5oZWFkPXQudGFpbD1udWxsLG4ucHVzaChpKSxlPUZvKHQsbiksbi5wb3AoKSx0LmhlYWQ/KHUubmV4dD10LmhlYWQsdC5oZWFkPXUpOih1Lm5leHQ9bnVsbCx0LmhlYWQ9dC50YWlsPXUpLG89dC50YWlsLG8ubmV4dD1yKSx1PXI7cmV0dXJuIHQudGFpbD1vLGV9ZnVuY3Rpb24gSW8odCl7cmV0dXJue3g6dC54LHk6dC55LHI6dC5yfX1mdW5jdGlvbiBZbyh0LG4pe3ZhciBlPXQueCxyPXQueSxpPXQucixvPW4ueCx1PW4ueSxhPW4ucixjPW8tZSxzPXUtcixmPWEtaSxsPU1hdGguc3FydChjKmMrcypzKTtyZXR1cm57eDooZStvK2MvbCpmKS8yLHk6KHIrdStzL2wqZikvMixyOihsK2krYSkvMn19ZnVuY3Rpb24gQm8odCxuLGUpe3ZhciByPXQueCxpPXQueSxvPXQucix1PW4ueCxhPW4ueSxjPW4ucixzPWUueCxmPWUueSxsPWUucixoPTIqKHItdSkscD0yKihpLWEpLGQ9MiooYy1vKSx2PXIqcitpKmktbypvLXUqdS1hKmErYypjLF89Miooci1zKSx5PTIqKGktZiksZz0yKihsLW8pLG09cipyK2kqaS1vKm8tcypzLWYqZitsKmwseD1fKnAtaCp5LGI9KHAqbS15KnYpL3gtcix3PSh5KmQtcCpnKS94LE09KF8qdi1oKm0pL3gtaSxUPShoKmctXypkKS94LGs9dyp3K1QqVC0xLE49MiooYip3K00qVCtvKSxTPWIqYitNKk0tbypvLEU9KC1OLU1hdGguc3FydChOKk4tNCprKlMpKS8oMiprKTtyZXR1cm57eDpiK3cqRStyLHk6TStUKkUraSxyOkV9fWZ1bmN0aW9uIEhvKHQsbixlKXt2YXIgcj10LngsaT10Lnksbz1uLnIrZS5yLHU9dC5yK2UucixhPW4ueC1yLGM9bi55LWkscz1hKmErYypjO2lmKHMpe3ZhciBmPS41KygodSo9dSktKG8qPW8pKS8oMipzKSxsPU1hdGguc3FydChNYXRoLm1heCgwLDIqbyoodStzKS0odS09cykqdS1vKm8pKS8oMipzKTtlLng9citmKmErbCpjLGUueT1pK2YqYy1sKmF9ZWxzZSBlLng9cit1LGUueT1pfWZ1bmN0aW9uIGpvKHQsbil7dmFyIGU9bi54LXQueCxyPW4ueS10LnksaT10LnIrbi5yO3JldHVybiBpKmktMWUtNj5lKmUrcipyfWZ1bmN0aW9uIFhvKHQsbixlKXt2YXIgcj10Ll8saT10Lm5leHQuXyxvPXIucitpLnIsdT0oci54KmkucitpLngqci5yKS9vLW4sYT0oci55KmkucitpLnkqci5yKS9vLWU7cmV0dXJuIHUqdSthKmF9ZnVuY3Rpb24gJG8odCl7dGhpcy5fPXQsdGhpcy5uZXh0PW51bGwsdGhpcy5wcmV2aW91cz1udWxsfWZ1bmN0aW9uIFZvKHQpe2lmKCEoaT10Lmxlbmd0aCkpcmV0dXJuIDA7dmFyIG4sZSxyLGk7aWYobj10WzBdLG4ueD0wLG4ueT0wLCEoaT4xKSlyZXR1cm4gbi5yO2lmKGU9dFsxXSxuLng9LWUucixlLng9bi5yLGUueT0wLCEoaT4yKSlyZXR1cm4gbi5yK2UucjtIbyhlLG4scj10WzJdKTt2YXIgbyx1LGEsYyxzLGYsbCxoPW4ucipuLnIscD1lLnIqZS5yLGQ9ci5yKnIucix2PWgrcCtkLF89aCpuLngrcCplLngrZCpyLngseT1oKm4ueStwKmUueStkKnIueTtuPW5ldyAkbyhuKSxlPW5ldyAkbyhlKSxyPW5ldyAkbyhyKSxuLm5leHQ9ci5wcmV2aW91cz1lLGUubmV4dD1uLnByZXZpb3VzPXIsci5uZXh0PWUucHJldmlvdXM9bjt0OmZvcihhPTM7YTxpOysrYSl7SG8obi5fLGUuXyxyPXRbYV0pLHI9bmV3ICRvKHIpLGM9ZS5uZXh0LHM9bi5wcmV2aW91cyxmPWUuXy5yLGw9bi5fLnI7ZG97aWYoZjw9bCl7aWYoam8oYy5fLHIuXykpe2U9YyxuLm5leHQ9ZSxlLnByZXZpb3VzPW4sLS1hO2NvbnRpbnVlIHR9Zis9Yy5fLnIsYz1jLm5leHR9ZWxzZXtpZihqbyhzLl8sci5fKSl7bj1zLG4ubmV4dD1lLGUucHJldmlvdXM9biwtLWE7Y29udGludWUgdH1sKz1zLl8ucixzPXMucHJldmlvdXN9fXdoaWxlKGMhPT1zLm5leHQpO2ZvcihyLnByZXZpb3VzPW4sci5uZXh0PWUsbi5uZXh0PWUucHJldmlvdXM9ZT1yLHYrPWQ9ci5fLnIqci5fLnIsXys9ZCpyLl8ueCx5Kz1kKnIuXy55LGg9WG8obixvPV8vdix1PXkvdik7KHI9ci5uZXh0KSE9PWU7KShkPVhvKHIsbyx1KSk8aCYmKG49cixoPWQpO2U9bi5uZXh0fWZvcihuPVtlLl9dLHI9ZTsocj1yLm5leHQpIT09ZTspbi5wdXNoKHIuXyk7Zm9yKHI9JGcobiksYT0wO2E8aTsrK2Epbj10W2FdLG4ueC09ci54LG4ueS09ci55O3JldHVybiByLnJ9ZnVuY3Rpb24gV28odCl7cmV0dXJuIG51bGw9PXQ/bnVsbDpabyh0KX1mdW5jdGlvbiBabyh0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHR9ZnVuY3Rpb24gR28oKXtyZXR1cm4gMH1mdW5jdGlvbiBKbyh0KXtyZXR1cm4gTWF0aC5zcXJ0KHQudmFsdWUpfWZ1bmN0aW9uIFFvKHQpe3JldHVybiBmdW5jdGlvbihuKXtuLmNoaWxkcmVufHwobi5yPU1hdGgubWF4KDAsK3Qobil8fDApKX19ZnVuY3Rpb24gS28odCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYocj1lLmNoaWxkcmVuKXt2YXIgcixpLG8sdT1yLmxlbmd0aCxhPXQoZSkqbnx8MDtpZihhKWZvcihpPTA7aTx1OysraSlyW2ldLnIrPWE7aWYobz1WbyhyKSxhKWZvcihpPTA7aTx1OysraSlyW2ldLnItPWE7ZS5yPW8rYX19fWZ1bmN0aW9uIHR1KHQpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1uLnBhcmVudDtuLnIqPXQsZSYmKG4ueD1lLngrdCpuLngsbi55PWUueSt0Km4ueSl9fWZ1bmN0aW9uIG51KHQpe3JldHVybiB0LmlkfWZ1bmN0aW9uIGV1KHQpe3JldHVybiB0LnBhcmVudElkfWZ1bmN0aW9uIHJ1KHQsbil7cmV0dXJuIHQucGFyZW50PT09bi5wYXJlbnQ/MToyfWZ1bmN0aW9uIGl1KHQpe3ZhciBuPXQuY2hpbGRyZW47cmV0dXJuIG4/blswXTp0LnR9ZnVuY3Rpb24gb3UodCl7dmFyIG49dC5jaGlsZHJlbjtyZXR1cm4gbj9uW24ubGVuZ3RoLTFdOnQudH1mdW5jdGlvbiB1dSh0LG4sZSl7dmFyIHI9ZS8obi5pLXQuaSk7bi5jLT1yLG4ucys9ZSx0LmMrPXIsbi56Kz1lLG4ubSs9ZX1mdW5jdGlvbiBhdSh0KXtmb3IodmFyIG4sZT0wLHI9MCxpPXQuY2hpbGRyZW4sbz1pLmxlbmd0aDstLW8+PTA7KW49aVtvXSxuLnorPWUsbi5tKz1lLGUrPW4ucysocis9bi5jKX1mdW5jdGlvbiBjdSh0LG4sZSl7cmV0dXJuIHQuYS5wYXJlbnQ9PT1uLnBhcmVudD90LmE6ZX1mdW5jdGlvbiBzdSh0LG4pe3RoaXMuXz10LHRoaXMucGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbj1udWxsLHRoaXMuQT1udWxsLHRoaXMuYT10aGlzLHRoaXMuej0wLHRoaXMubT0wLHRoaXMuYz0wLHRoaXMucz0wLHRoaXMudD1udWxsLHRoaXMuaT1ufWZ1bmN0aW9uIGZ1KHQpe2Zvcih2YXIgbixlLHIsaSxvLHU9bmV3IHN1KHQsMCksYT1bdV07bj1hLnBvcCgpOylpZihyPW4uXy5jaGlsZHJlbilmb3Iobi5jaGlsZHJlbj1uZXcgQXJyYXkobz1yLmxlbmd0aCksaT1vLTE7aT49MDstLWkpYS5wdXNoKGU9bi5jaGlsZHJlbltpXT1uZXcgc3UocltpXSxpKSksZS5wYXJlbnQ9bjtyZXR1cm4odS5wYXJlbnQ9bmV3IHN1KG51bGwsMCkpLmNoaWxkcmVuPVt1XSx1fWZ1bmN0aW9uIGx1KHQsbixlLHIsaSxvKXtmb3IodmFyIHUsYSxjLHMsZixsLGgscCxkLHYsXyx5PVtdLGc9bi5jaGlsZHJlbixtPTAseD0wLGI9Zy5sZW5ndGgsdz1uLnZhbHVlO208Yjspe2M9aS1lLHM9by1yO2Rve2Y9Z1t4KytdLnZhbHVlfXdoaWxlKCFmJiZ4PGIpO2ZvcihsPWg9Zix2PU1hdGgubWF4KHMvYyxjL3MpLyh3KnQpLF89ZipmKnYsZD1NYXRoLm1heChoL18sXy9sKTt4PGI7Kyt4KXtpZihmKz1hPWdbeF0udmFsdWUsYTxsJiYobD1hKSxhPmgmJihoPWEpLF89ZipmKnYsKHA9TWF0aC5tYXgoaC9fLF8vbCkpPmQpe2YtPWE7YnJlYWt9ZD1wfXkucHVzaCh1PXt2YWx1ZTpmLGRpY2U6YzxzLGNoaWxkcmVuOmcuc2xpY2UobSx4KX0pLHUuZGljZT9KZyh1LGUscixpLHc/cis9cypmL3c6byk6aW0odSxlLHIsdz9lKz1jKmYvdzppLG8pLHctPWYsbT14fXJldHVybiB5fWZ1bmN0aW9uIGh1KHQsbil7cmV0dXJuIHRbMF0tblswXXx8dFsxXS1uWzFdfWZ1bmN0aW9uIHB1KHQpe2Zvcih2YXIgbj10Lmxlbmd0aCxlPVswLDFdLHI9MixpPTI7aTxuOysraSl7Zm9yKDtyPjEmJnBtKHRbZVtyLTJdXSx0W2Vbci0xXV0sdFtpXSk8PTA7KS0tcjtlW3IrK109aX1yZXR1cm4gZS5zbGljZSgwLHIpfWZ1bmN0aW9uIGR1KHQpe3RoaXMuX3NpemU9dCx0aGlzLl9jYWxsPXRoaXMuX2Vycm9yPW51bGwsdGhpcy5fdGFza3M9W10sdGhpcy5fZGF0YT1bXSx0aGlzLl93YWl0aW5nPXRoaXMuX2FjdGl2ZT10aGlzLl9lbmRlZD10aGlzLl9zdGFydD0wfWZ1bmN0aW9uIHZ1KHQpe2lmKCF0Ll9zdGFydCl0cnl7X3UodCl9Y2F0Y2gobil7aWYodC5fdGFza3NbdC5fZW5kZWQrdC5fYWN0aXZlLTFdKWd1KHQsbik7ZWxzZSBpZighdC5fZGF0YSl0aHJvdyBufX1mdW5jdGlvbiBfdSh0KXtmb3IoO3QuX3N0YXJ0PXQuX3dhaXRpbmcmJnQuX2FjdGl2ZTx0Ll9zaXplOyl7dmFyIG49dC5fZW5kZWQrdC5fYWN0aXZlLGU9dC5fdGFza3Nbbl0scj1lLmxlbmd0aC0xLGk9ZVtyXTtlW3JdPXl1KHQsbiksLS10Ll93YWl0aW5nLCsrdC5fYWN0aXZlLGU9aS5hcHBseShudWxsLGUpLHQuX3Rhc2tzW25dJiYodC5fdGFza3Nbbl09ZXx8Z20pfX1mdW5jdGlvbiB5dSh0LG4pe3JldHVybiBmdW5jdGlvbihlLHIpe3QuX3Rhc2tzW25dJiYoLS10Ll9hY3RpdmUsKyt0Ll9lbmRlZCx0Ll90YXNrc1tuXT1udWxsLG51bGw9PXQuX2Vycm9yJiYobnVsbCE9ZT9ndSh0LGUpOih0Ll9kYXRhW25dPXIsdC5fd2FpdGluZz92dSh0KTptdSh0KSkpKX19ZnVuY3Rpb24gZ3UodCxuKXt2YXIgZSxyPXQuX3Rhc2tzLmxlbmd0aDtmb3IodC5fZXJyb3I9bix0Ll9kYXRhPXZvaWQgMCx0Ll93YWl0aW5nPU5hTjstLXI+PTA7KWlmKChlPXQuX3Rhc2tzW3JdKSYmKHQuX3Rhc2tzW3JdPW51bGwsZS5hYm9ydCkpdHJ5e2UuYWJvcnQoKX1jYXRjaChuKXt9dC5fYWN0aXZlPU5hTixtdSh0KX1mdW5jdGlvbiBtdSh0KXtpZighdC5fYWN0aXZlJiZ0Ll9jYWxsKXt2YXIgbj10Ll9kYXRhO3QuX2RhdGE9dm9pZCAwLHQuX2NhbGwodC5fZXJyb3Isbil9fWZ1bmN0aW9uIHh1KHQpe2lmKG51bGw9PXQpdD0xLzA7ZWxzZSBpZighKCh0PSt0KT49MSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNvbmN1cnJlbmN5Iik7cmV0dXJuIG5ldyBkdSh0KX1mdW5jdGlvbiBidSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt0KG51bGw9PW4/ZTpudWxsKX19ZnVuY3Rpb24gd3UodCl7dmFyIG49dC5yZXNwb25zZVR5cGU7cmV0dXJuIG4mJiJ0ZXh0IiE9PW4/dC5yZXNwb25zZTp0LnJlc3BvbnNlVGV4dH1mdW5jdGlvbiBNdSh0LG4pe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChlLnJlc3BvbnNlVGV4dCxuKX19ZnVuY3Rpb24gVHUodCl7ZnVuY3Rpb24gbihuKXt2YXIgbz1uKyIiLHU9ZS5nZXQobyk7aWYoIXUpe2lmKGkhPT1PbSlyZXR1cm4gaTtlLnNldChvLHU9ci5wdXNoKG4pKX1yZXR1cm4gdFsodS0xKSV0Lmxlbmd0aF19dmFyIGU9SGUoKSxyPVtdLGk9T207cmV0dXJuIHQ9bnVsbD09dD9bXTpEbS5jYWxsKHQpLG4uZG9tYWluPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiByLnNsaWNlKCk7cj1bXSxlPUhlKCk7Zm9yKHZhciBpLG8sdT0tMSxhPXQubGVuZ3RoOysrdTxhOyllLmhhcyhvPShpPXRbdV0pKyIiKXx8ZS5zZXQobyxyLnB1c2goaSkpO3JldHVybiBufSxuLnJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PURtLmNhbGwoZSksbik6dC5zbGljZSgpfSxuLnVua25vd249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dCxuKTppfSxuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gVHUoKS5kb21haW4ocikucmFuZ2UodCkudW5rbm93bihpKX0sbn1mdW5jdGlvbiBrdSgpe2Z1bmN0aW9uIHQoKXt2YXIgdD1pKCkubGVuZ3RoLHI9dVsxXTx1WzBdLGw9dVtyLTBdLGg9dVsxLXJdO249KGgtbCkvTWF0aC5tYXgoMSx0LWMrMipzKSxhJiYobj1NYXRoLmZsb29yKG4pKSxsKz0oaC1sLW4qKHQtYykpKmYsZT1uKigxLWMpLGEmJihsPU1hdGgucm91bmQobCksZT1NYXRoLnJvdW5kKGUpKTt2YXIgcD1jZih0KS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIGwrbip0fSk7cmV0dXJuIG8ocj9wLnJldmVyc2UoKTpwKX12YXIgbixlLHI9VHUoKS51bmtub3duKHZvaWQgMCksaT1yLmRvbWFpbixvPXIucmFuZ2UsdT1bMCwxXSxhPSExLGM9MCxzPTAsZj0uNTtyZXR1cm4gZGVsZXRlIHIudW5rbm93bixyLmRvbWFpbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaShuKSx0KCkpOmkoKX0sci5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1bK25bMF0sK25bMV1dLHQoKSk6dS5zbGljZSgpfSxyLnJhbmdlUm91bmQ9ZnVuY3Rpb24obil7cmV0dXJuIHU9WytuWzBdLCtuWzFdXSxhPSEwLHQoKX0sci5iYW5kd2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sci5zdGVwPWZ1bmN0aW9uKCl7cmV0dXJuIG59LHIucm91bmQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ISFuLHQoKSk6YX0sci5wYWRkaW5nPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPXM9TWF0aC5tYXgoMCxNYXRoLm1pbigxLG4pKSx0KCkpOmN9LHIucGFkZGluZ0lubmVyPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPU1hdGgubWF4KDAsTWF0aC5taW4oMSxuKSksdCgpKTpjfSxyLnBhZGRpbmdPdXRlcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1NYXRoLm1heCgwLE1hdGgubWluKDEsbikpLHQoKSk6c30sci5hbGlnbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1NYXRoLm1heCgwLE1hdGgubWluKDEsbikpLHQoKSk6Zn0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGt1KCkuZG9tYWluKGkoKSkucmFuZ2UodSkucm91bmQoYSkucGFkZGluZ0lubmVyKGMpLnBhZGRpbmdPdXRlcihzKS5hbGlnbihmKX0sdCgpfWZ1bmN0aW9uIE51KHQpe3ZhciBuPXQuY29weTtyZXR1cm4gdC5wYWRkaW5nPXQucGFkZGluZ091dGVyLGRlbGV0ZSB0LnBhZGRpbmdJbm5lcixkZWxldGUgdC5wYWRkaW5nT3V0ZXIsdC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIE51KG4oKSl9LHR9ZnVuY3Rpb24gU3UoKXtyZXR1cm4gTnUoa3UoKS5wYWRkaW5nSW5uZXIoMSkpfWZ1bmN0aW9uIEV1KHQsbil7cmV0dXJuKG4tPXQ9K3QpP2Z1bmN0aW9uKGUpe3JldHVybihlLXQpL259OkZtKG4pfWZ1bmN0aW9uIEF1KHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPXQobj0rbixlPStlKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQ8PW4/MDp0Pj1lPzE6cih0KX19fWZ1bmN0aW9uIEN1KHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPXQobj0rbixlPStlKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQ8PTA/bjp0Pj0xP2U6cih0KX19fWZ1bmN0aW9uIHp1KHQsbixlLHIpe3ZhciBpPXRbMF0sbz10WzFdLHU9blswXSxhPW5bMV07cmV0dXJuIG88aT8oaT1lKG8saSksdT1yKGEsdSkpOihpPWUoaSxvKSx1PXIodSxhKSksZnVuY3Rpb24odCl7cmV0dXJuIHUoaSh0KSl9fWZ1bmN0aW9uIFB1KHQsbixlLHIpe3ZhciBpPU1hdGgubWluKHQubGVuZ3RoLG4ubGVuZ3RoKS0xLG89bmV3IEFycmF5KGkpLHU9bmV3IEFycmF5KGkpLGE9LTE7Zm9yKHRbaV08dFswXSYmKHQ9dC5zbGljZSgpLnJldmVyc2UoKSxuPW4uc2xpY2UoKS5yZXZlcnNlKCkpOysrYTxpOylvW2FdPWUodFthXSx0W2ErMV0pLHVbYV09cihuW2FdLG5bYSsxXSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlPVZzKHQsbiwxLGkpLTE7cmV0dXJuIHVbZV0ob1tlXShuKSl9fWZ1bmN0aW9uIEx1KHQsbil7cmV0dXJuIG4uZG9tYWluKHQuZG9tYWluKCkpLnJhbmdlKHQucmFuZ2UoKSkuaW50ZXJwb2xhdGUodC5pbnRlcnBvbGF0ZSgpKS5jbGFtcCh0LmNsYW1wKCkpfWZ1bmN0aW9uIFJ1KHQsbil7ZnVuY3Rpb24gZSgpe3JldHVybiBpPU1hdGgubWluKGEubGVuZ3RoLGMubGVuZ3RoKT4yP1B1Onp1LG89dT1udWxsLHJ9ZnVuY3Rpb24gcihuKXtyZXR1cm4ob3x8KG89aShhLGMsZj9BdSh0KTp0LHMpKSkoK24pfXZhciBpLG8sdSxhPVltLGM9WW0scz1xaCxmPSExO3JldHVybiByLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4odXx8KHU9aShjLGEsRXUsZj9DdShuKTpuKSkpKCt0KX0sci5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9VW0uY2FsbCh0LEltKSxlKCkpOmEuc2xpY2UoKX0sci5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1EbS5jYWxsKHQpLGUoKSk6Yy5zbGljZSgpfSxyLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGM9RG0uY2FsbCh0KSxzPVVoLGUoKX0sci5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0hIXQsZSgpKTpmfSxyLmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPXQsZSgpKTpzfSxlKCl9ZnVuY3Rpb24gcXUodCl7dmFyIG49dC5kb21haW47cmV0dXJuIHQudGlja3M9ZnVuY3Rpb24odCl7dmFyIGU9bigpO3JldHVybiBoZihlWzBdLGVbZS5sZW5ndGgtMV0sbnVsbD09dD8xMDp0KX0sdC50aWNrRm9ybWF0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEJtKG4oKSx0LGUpfSx0Lm5pY2U9ZnVuY3Rpb24oZSl7bnVsbD09ZSYmKGU9MTApO3ZhciBpLG89bigpLHU9MCxhPW8ubGVuZ3RoLTEsYz1vW3VdLHM9b1thXTtyZXR1cm4gczxjJiYoaT1jLGM9cyxzPWksaT11LHU9YSxhPWkpLGk9cihjLHMsZSksaT4wPyhjPU1hdGguZmxvb3IoYy9pKSppLHM9TWF0aC5jZWlsKHMvaSkqaSxpPXIoYyxzLGUpKTppPDAmJihjPU1hdGguY2VpbChjKmkpL2kscz1NYXRoLmZsb29yKHMqaSkvaSxpPXIoYyxzLGUpKSxpPjA/KG9bdV09TWF0aC5mbG9vcihjL2kpKmksb1thXT1NYXRoLmNlaWwocy9pKSppLG4obykpOmk8MCYmKG9bdV09TWF0aC5jZWlsKGMqaSkvaSxvW2FdPU1hdGguZmxvb3IocyppKS9pLG4obykpLHR9LHR9ZnVuY3Rpb24gVXUoKXt2YXIgdD1SdShFdSxDaCk7cmV0dXJuIHQuY29weT1mdW5jdGlvbigpe3JldHVybiBMdSh0LFV1KCkpfSxxdSh0KX1mdW5jdGlvbiBEdSgpe2Z1bmN0aW9uIHQodCl7cmV0dXJuK3R9dmFyIG49WzAsMV07cmV0dXJuIHQuaW52ZXJ0PXQsdC5kb21haW49dC5yYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1VbS5jYWxsKGUsSW0pLHQpOm4uc2xpY2UoKX0sdC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIER1KCkuZG9tYWluKG4pfSxxdSh0KX1mdW5jdGlvbiBPdSh0LG4pe3JldHVybihuPU1hdGgubG9nKG4vdCkpP2Z1bmN0aW9uKGUpe3JldHVybiBNYXRoLmxvZyhlL3QpL259OkZtKG4pfWZ1bmN0aW9uIEZ1KHQsbil7cmV0dXJuIHQ8MD9mdW5jdGlvbihlKXtyZXR1cm4tTWF0aC5wb3coLW4sZSkqTWF0aC5wb3coLXQsMS1lKX06ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucG93KG4sZSkqTWF0aC5wb3codCwxLWUpfX1mdW5jdGlvbiBJdSh0KXtyZXR1cm4gaXNGaW5pdGUodCk/KygiMWUiK3QpOnQ8MD8wOnR9ZnVuY3Rpb24gWXUodCl7cmV0dXJuIDEwPT09dD9JdTp0PT09TWF0aC5FP01hdGguZXhwOmZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnBvdyh0LG4pfX1mdW5jdGlvbiBCdSh0KXtyZXR1cm4gdD09PU1hdGguRT9NYXRoLmxvZzoxMD09PXQmJk1hdGgubG9nMTB8fDI9PT10JiZNYXRoLmxvZzJ8fCh0PU1hdGgubG9nKHQpLGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLmxvZyhuKS90fSl9ZnVuY3Rpb24gSHUodCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybi10KC1uKX19ZnVuY3Rpb24ganUoKXtmdW5jdGlvbiBuKCl7cmV0dXJuIG89QnUoaSksdT1ZdShpKSxyKClbMF08MCYmKG89SHUobyksdT1IdSh1KSksZX12YXIgZT1SdShPdSxGdSkuZG9tYWluKFsxLDEwXSkscj1lLmRvbWFpbixpPTEwLG89QnUoMTApLHU9WXUoMTApO3JldHVybiBlLmJhc2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3QsbigpKTppfSxlLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocih0KSxuKCkpOnIoKX0sZS50aWNrcz1mdW5jdGlvbih0KXt2YXIgbixlPXIoKSxhPWVbMF0sYz1lW2UubGVuZ3RoLTFdOyhuPWM8YSkmJihoPWEsYT1jLGM9aCk7dmFyIHMsZixsLGg9byhhKSxwPW8oYyksZD1udWxsPT10PzEwOit0LHY9W107aWYoIShpJTEpJiZwLWg8ZCl7aWYoaD1NYXRoLnJvdW5kKGgpLTEscD1NYXRoLnJvdW5kKHApKzEsYT4wKXtmb3IoO2g8cDsrK2gpZm9yKGY9MSxzPXUoaCk7ZjxpOysrZilpZighKChsPXMqZik8YSkpe2lmKGw+YylicmVhazt2LnB1c2gobCl9fWVsc2UgZm9yKDtoPHA7KytoKWZvcihmPWktMSxzPXUoaCk7Zj49MTstLWYpaWYoISgobD1zKmYpPGEpKXtpZihsPmMpYnJlYWs7di5wdXNoKGwpfX1lbHNlIHY9aGYoaCxwLE1hdGgubWluKHAtaCxkKSkubWFwKHUpO3JldHVybiBuP3YucmV2ZXJzZSgpOnZ9LGUudGlja0Zvcm1hdD1mdW5jdGlvbihuLHIpe2lmKG51bGw9PXImJihyPTEwPT09aT8iLjBlIjoiLCIpLCJmdW5jdGlvbiIhPXR5cGVvZiByJiYocj10LmZvcm1hdChyKSksbj09PTEvMClyZXR1cm4gcjtudWxsPT1uJiYobj0xMCk7dmFyIGE9TWF0aC5tYXgoMSxpKm4vZS50aWNrcygpLmxlbmd0aCk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPXQvdShNYXRoLnJvdW5kKG8odCkpKTtyZXR1cm4gbippPGktLjUmJihuKj1pKSxuPD1hP3IodCk6IiJ9fSxlLm5pY2U9ZnVuY3Rpb24oKXtyZXR1cm4gcihIbShyKCkse2Zsb29yOmZ1bmN0aW9uKHQpe3JldHVybiB1KE1hdGguZmxvb3Iobyh0KSkpfSxjZWlsOmZ1bmN0aW9uKHQpe3JldHVybiB1KE1hdGguY2VpbChvKHQpKSl9fSkpfSxlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gTHUoZSxqdSgpLmJhc2UoaSkpfSxlfWZ1bmN0aW9uIFh1KHQsbil7cmV0dXJuIHQ8MD8tTWF0aC5wb3coLXQsbik6TWF0aC5wb3codCxuKX1mdW5jdGlvbiAkdSgpe2Z1bmN0aW9uIHQodCxuKXtyZXR1cm4obj1YdShuLGUpLSh0PVh1KHQsZSkpKT9mdW5jdGlvbihyKXtyZXR1cm4oWHUocixlKS10KS9ufTpGbShuKX1mdW5jdGlvbiBuKHQsbil7cmV0dXJuIG49WHUobixlKS0odD1YdSh0LGUpKSxmdW5jdGlvbihyKXtyZXR1cm4gWHUodCtuKnIsMS9lKX19dmFyIGU9MSxyPVJ1KHQsbiksaT1yLmRvbWFpbjtyZXR1cm4gci5leHBvbmVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCxpKGkoKSkpOmV9LHIuY29weT1mdW5jdGlvbigpe3JldHVybiBMdShyLCR1KCkuZXhwb25lbnQoZSkpfSxxdShyKX1mdW5jdGlvbiBWdSgpe3JldHVybiAkdSgpLmV4cG9uZW50KC41KX1mdW5jdGlvbiBXdSgpe2Z1bmN0aW9uIHQoKXt2YXIgdD0wLG89TWF0aC5tYXgoMSxyLmxlbmd0aCk7Zm9yKGk9bmV3IEFycmF5KG8tMSk7Kyt0PG87KWlbdC0xXT12ZihlLHQvbyk7cmV0dXJuIG59ZnVuY3Rpb24gbih0KXtpZighaXNOYU4odD0rdCkpcmV0dXJuIHJbVnMoaSx0KV19dmFyIGU9W10scj1bXSxpPVtdO3JldHVybiBuLmludmVydEV4dGVudD1mdW5jdGlvbih0KXt2YXIgbj1yLmluZGV4T2YodCk7cmV0dXJuIG48MD9bTmFOLE5hTl06W24+MD9pW24tMV06ZVswXSxuPGkubGVuZ3RoP2lbbl06ZVtlLmxlbmd0aC0xXV19LG4uZG9tYWluPWZ1bmN0aW9uKG4pe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBlLnNsaWNlKCk7ZT1bXTtmb3IodmFyIHIsaT0wLG89bi5sZW5ndGg7aTxvOysraSludWxsPT0ocj1uW2ldKXx8aXNOYU4ocj0rcil8fGUucHVzaChyKTtyZXR1cm4gZS5zb3J0KGpzKSx0KCl9LG4ucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9RG0uY2FsbChuKSx0KCkpOnIuc2xpY2UoKX0sbi5xdWFudGlsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gaS5zbGljZSgpfSxuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gV3UoKS5kb21haW4oZSkucmFuZ2Uocil9LG59ZnVuY3Rpb24gWnUoKXtmdW5jdGlvbiB0KHQpe2lmKHQ8PXQpcmV0dXJuIHVbVnMobyx0LDAsaSldfWZ1bmN0aW9uIG4oKXt2YXIgbj0tMTtmb3Iobz1uZXcgQXJyYXkoaSk7KytuPGk7KW9bbl09KChuKzEpKnItKG4taSkqZSkvKGkrMSk7cmV0dXJuIHR9dmFyIGU9MCxyPTEsaT0xLG89Wy41XSx1PVswLDFdO3JldHVybiB0LmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdFswXSxyPSt0WzFdLG4oKSk6W2Uscl19LHQucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9KHU9RG0uY2FsbCh0KSkubGVuZ3RoLTEsbigpKTp1LnNsaWNlKCl9LHQuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBuPXUuaW5kZXhPZih0KTtyZXR1cm4gbjwwP1tOYU4sTmFOXTpuPDE/W2Usb1swXV06bj49aT9bb1tpLTFdLHJdOltvW24tMV0sb1tuXV19LHQuY29weT1mdW5jdGlvbigpe3JldHVybiBadSgpLmRvbWFpbihbZSxyXSkucmFuZ2UodSl9LHF1KHQpfWZ1bmN0aW9uIEd1KCl7ZnVuY3Rpb24gdCh0KXtpZih0PD10KXJldHVybiBlW1ZzKG4sdCwwLHIpXX12YXIgbj1bLjVdLGU9WzAsMV0scj0xO3JldHVybiB0LmRvbWFpbj1mdW5jdGlvbihpKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1EbS5jYWxsKGkpLHI9TWF0aC5taW4obi5sZW5ndGgsZS5sZW5ndGgtMSksdCk6bi5zbGljZSgpfSx0LnJhbmdlPWZ1bmN0aW9uKGkpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPURtLmNhbGwoaSkscj1NYXRoLm1pbihuLmxlbmd0aCxlLmxlbmd0aC0xKSx0KTplLnNsaWNlKCl9LHQuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciByPWUuaW5kZXhPZih0KTtyZXR1cm5bbltyLTFdLG5bcl1dfSx0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gR3UoKS5kb21haW4obikucmFuZ2UoZSl9LHR9ZnVuY3Rpb24gSnUodCxuLGUscil7ZnVuY3Rpb24gaShuKXtyZXR1cm4gdChuPW5ldyBEYXRlKCtuKSksbn1yZXR1cm4gaS5mbG9vcj1pLGkuY2VpbD1mdW5jdGlvbihlKXtyZXR1cm4gdChlPW5ldyBEYXRlKGUtMSkpLG4oZSwxKSx0KGUpLGV9LGkucm91bmQ9ZnVuY3Rpb24odCl7dmFyIG49aSh0KSxlPWkuY2VpbCh0KTtyZXR1cm4gdC1uPGUtdD9uOmV9LGkub2Zmc2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odD1uZXcgRGF0ZSgrdCksbnVsbD09ZT8xOk1hdGguZmxvb3IoZSkpLHR9LGkucmFuZ2U9ZnVuY3Rpb24oZSxyLG8pe3ZhciB1PVtdO2lmKGU9aS5jZWlsKGUpLG89bnVsbD09bz8xOk1hdGguZmxvb3IobyksIShlPHImJm8+MCkpcmV0dXJuIHU7ZG97dS5wdXNoKG5ldyBEYXRlKCtlKSl9d2hpbGUobihlLG8pLHQoZSksZTxyKTtyZXR1cm4gdX0saS5maWx0ZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIEp1KGZ1bmN0aW9uKG4pe2lmKG4+PW4pZm9yKDt0KG4pLCFlKG4pOyluLnNldFRpbWUobi0xKX0sZnVuY3Rpb24odCxyKXtpZih0Pj10KWZvcig7LS1yPj0wOylmb3IoO24odCwxKSwhZSh0KTspO30pfSxlJiYoaS5jb3VudD1mdW5jdGlvbihuLHIpe3JldHVybiBqbS5zZXRUaW1lKCtuKSxYbS5zZXRUaW1lKCtyKSx0KGptKSx0KFhtKSxNYXRoLmZsb29yKGUoam0sWG0pKX0saS5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP2kuZmlsdGVyKHI/ZnVuY3Rpb24obil7cmV0dXJuIHIobikldD09MH06ZnVuY3Rpb24obil7cmV0dXJuIGkuY291bnQoMCxuKSV0PT0wfSk6aTpudWxsfSksaX1mdW5jdGlvbiBRdSh0KXtyZXR1cm4gSnUoZnVuY3Rpb24obil7bi5zZXREYXRlKG4uZ2V0RGF0ZSgpLShuLmdldERheSgpKzctdCklNyksbi5zZXRIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldERhdGUodC5nZXREYXRlKCkrNypuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10LShuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSpXbSkvWm19KX1mdW5jdGlvbiBLdSh0KXtyZXR1cm4gSnUoZnVuY3Rpb24obil7bi5zZXRVVENEYXRlKG4uZ2V0VVRDRGF0ZSgpLShuLmdldFVUQ0RheSgpKzctdCklNyksbi5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFVUQ0RhdGUodC5nZXRVVENEYXRlKCkrNypuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS9abX0pfWZ1bmN0aW9uIHRhKHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIG49bmV3IERhdGUoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpO3JldHVybiBuLnNldEZ1bGxZZWFyKHQueSksbn1yZXR1cm4gbmV3IERhdGUodC55LHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKX1mdW5jdGlvbiBuYSh0KXtpZigwPD10LnkmJnQueTwxMDApe3ZhciBuPW5ldyBEYXRlKERhdGUuVVRDKC0xLHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKSk7cmV0dXJuIG4uc2V0VVRDRnVsbFllYXIodC55KSxufXJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh0LnksdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpKX1mdW5jdGlvbiBlYSh0KXtyZXR1cm57eTp0LG06MCxkOjEsSDowLE06MCxTOjAsTDowfX1mdW5jdGlvbiByYSh0KXtmdW5jdGlvbiBuKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByLGksbyx1PVtdLGE9LTEsYz0wLHM9dC5sZW5ndGg7Zm9yKGUgaW5zdGFuY2VvZiBEYXRlfHwoZT1uZXcgRGF0ZSgrZSkpOysrYTxzOykzNz09PXQuY2hhckNvZGVBdChhKSYmKHUucHVzaCh0LnNsaWNlKGMsYSkpLG51bGwhPShpPVZ4W3I9dC5jaGFyQXQoKythKV0pP3I9dC5jaGFyQXQoKythKTppPSJlIj09PXI/IiAiOiIwIiwobz1uW3JdKSYmKHI9byhlLGkpKSwKdS5wdXNoKHIpLGM9YSsxKTtyZXR1cm4gdS5wdXNoKHQuc2xpY2UoYyxhKSksdS5qb2luKCIiKX19ZnVuY3Rpb24gZSh0LG4pe3JldHVybiBmdW5jdGlvbihlKXt2YXIgaT1lYSgxOTAwKTtpZihyKGksdCxlKz0iIiwwKSE9ZS5sZW5ndGgpcmV0dXJuIG51bGw7aWYoInAiaW4gaSYmKGkuSD1pLkglMTIrMTIqaS5wKSwiVyJpbiBpfHwiVSJpbiBpKXsidyJpbiBpfHwoaS53PSJXImluIGk/MTowKTt2YXIgbz0iWiJpbiBpP25hKGVhKGkueSkpLmdldFVUQ0RheSgpOm4oZWEoaS55KSkuZ2V0RGF5KCk7aS5tPTAsaS5kPSJXImluIGk/KGkudys2KSU3KzcqaS5XLShvKzUpJTc6aS53KzcqaS5VLShvKzYpJTd9cmV0dXJuIloiaW4gaT8oaS5IKz1pLlovMTAwfDAsaS5NKz1pLlolMTAwLG5hKGkpKTpuKGkpfX1mdW5jdGlvbiByKHQsbixlLHIpe2Zvcih2YXIgaSxvLHU9MCxhPW4ubGVuZ3RoLGM9ZS5sZW5ndGg7dTxhOyl7aWYocj49YylyZXR1cm4tMTtpZigzNz09PShpPW4uY2hhckNvZGVBdCh1KyspKSl7aWYoaT1uLmNoYXJBdCh1KyspLCEobz1CW2kgaW4gVng/bi5jaGFyQXQodSsrKTppXSl8fChyPW8odCxlLHIpKTwwKXJldHVybi0xfWVsc2UgaWYoaSE9ZS5jaGFyQ29kZUF0KHIrKykpcmV0dXJuLTF9cmV0dXJuIHJ9ZnVuY3Rpb24gaSh0LG4sZSl7dmFyIHI9Qy5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0LnA9eltyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG8odCxuLGUpe3ZhciByPVIuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC53PXFbclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB1KHQsbixlKXt2YXIgcj1QLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQudz1MW3JbMF0udG9Mb3dlckNhc2UoKV0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gYSh0LG4sZSl7dmFyIHI9Ty5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lm09RltyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGModCxuLGUpe3ZhciByPVUuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5tPURbclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBzKHQsbixlKXtyZXR1cm4gcih0LHcsbixlKX1mdW5jdGlvbiBmKHQsbixlKXtyZXR1cm4gcih0LE0sbixlKX1mdW5jdGlvbiBsKHQsbixlKXtyZXR1cm4gcih0LFQsbixlKX1mdW5jdGlvbiBoKHQpe3JldHVybiBTW3QuZ2V0RGF5KCldfWZ1bmN0aW9uIHAodCl7cmV0dXJuIE5bdC5nZXREYXkoKV19ZnVuY3Rpb24gZCh0KXtyZXR1cm4gQVt0LmdldE1vbnRoKCldfWZ1bmN0aW9uIHYodCl7cmV0dXJuIEVbdC5nZXRNb250aCgpXX1mdW5jdGlvbiBfKHQpe3JldHVybiBrWysodC5nZXRIb3VycygpPj0xMildfWZ1bmN0aW9uIHkodCl7cmV0dXJuIFNbdC5nZXRVVENEYXkoKV19ZnVuY3Rpb24gZyh0KXtyZXR1cm4gTlt0LmdldFVUQ0RheSgpXX1mdW5jdGlvbiBtKHQpe3JldHVybiBBW3QuZ2V0VVRDTW9udGgoKV19ZnVuY3Rpb24geCh0KXtyZXR1cm4gRVt0LmdldFVUQ01vbnRoKCldfWZ1bmN0aW9uIGIodCl7cmV0dXJuIGtbKyh0LmdldFVUQ0hvdXJzKCk+PTEyKV19dmFyIHc9dC5kYXRlVGltZSxNPXQuZGF0ZSxUPXQudGltZSxrPXQucGVyaW9kcyxOPXQuZGF5cyxTPXQuc2hvcnREYXlzLEU9dC5tb250aHMsQT10LnNob3J0TW9udGhzLEM9dWEoayksej1hYShrKSxQPXVhKE4pLEw9YWEoTiksUj11YShTKSxxPWFhKFMpLFU9dWEoRSksRD1hYShFKSxPPXVhKEEpLEY9YWEoQSksST17YTpoLEE6cCxiOmQsQjp2LGM6bnVsbCxkOndhLGU6d2EsSDpNYSxJOlRhLGo6a2EsTDpOYSxtOlNhLE06RWEscDpfLFM6QWEsVTpDYSx3OnphLFc6UGEseDpudWxsLFg6bnVsbCx5OkxhLFk6UmEsWjpxYSwiJSI6R2F9LFk9e2E6eSxBOmcsYjptLEI6eCxjOm51bGwsZDpVYSxlOlVhLEg6RGEsSTpPYSxqOkZhLEw6SWEsbTpZYSxNOkJhLHA6YixTOkhhLFU6amEsdzpYYSxXOiRhLHg6bnVsbCxYOm51bGwseTpWYSxZOldhLFo6WmEsIiUiOkdhfSxCPXthOm8sQTp1LGI6YSxCOmMsYzpzLGQ6dmEsZTp2YSxIOnlhLEk6eWEsajpfYSxMOnhhLG06ZGEsTTpnYSxwOmksUzptYSxVOnNhLHc6Y2EsVzpmYSx4OmYsWDpsLHk6aGEsWTpsYSxaOnBhLCIlIjpiYX07cmV0dXJuIEkueD1uKE0sSSksSS5YPW4oVCxJKSxJLmM9bih3LEkpLFkueD1uKE0sWSksWS5YPW4oVCxZKSxZLmM9bih3LFkpLHtmb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIGU9bih0Kz0iIixJKTtyZXR1cm4gZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxlfSxwYXJzZTpmdW5jdGlvbih0KXt2YXIgbj1lKHQrPSIiLHRhKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSx1dGNGb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIGU9bih0Kz0iIixZKTtyZXR1cm4gZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxlfSx1dGNQYXJzZTpmdW5jdGlvbih0KXt2YXIgbj1lKHQsbmEpO3JldHVybiBuLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LG59fX1mdW5jdGlvbiBpYSh0LG4sZSl7dmFyIHI9dDwwPyItIjoiIixpPShyPy10OnQpKyIiLG89aS5sZW5ndGg7cmV0dXJuIHIrKG88ZT9uZXcgQXJyYXkoZS1vKzEpLmpvaW4obikraTppKX1mdW5jdGlvbiBvYSh0KXtyZXR1cm4gdC5yZXBsYWNlKEd4LCJcXCQmIil9ZnVuY3Rpb24gdWEodCl7cmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiK3QubWFwKG9hKS5qb2luKCJ8IikrIikiLCJpIil9ZnVuY3Rpb24gYWEodCl7Zm9yKHZhciBuPXt9LGU9LTEscj10Lmxlbmd0aDsrK2U8cjspblt0W2VdLnRvTG93ZXJDYXNlKCldPWU7cmV0dXJuIG59ZnVuY3Rpb24gY2EodCxuLGUpe3ZhciByPVd4LmV4ZWMobi5zbGljZShlLGUrMSkpO3JldHVybiByPyh0Lnc9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gc2EodCxuLGUpe3ZhciByPVd4LmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQuVT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBmYSh0LG4sZSl7dmFyIHI9V3guZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5XPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGxhKHQsbixlKXt2YXIgcj1XeC5leGVjKG4uc2xpY2UoZSxlKzQpKTtyZXR1cm4gcj8odC55PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGhhKHQsbixlKXt2YXIgcj1XeC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC55PStyWzBdKygrclswXT42OD8xOTAwOjJlMyksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcGEodCxuLGUpe3ZhciByPS9eKFopfChbKy1dXGRcZCkoPzpcOj8oXGRcZCkpPy8uZXhlYyhuLnNsaWNlKGUsZSs2KSk7cmV0dXJuIHI/KHQuWj1yWzFdPzA6LShyWzJdKyhyWzNdfHwiMDAiKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gZGEodCxuLGUpe3ZhciByPVd4LmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Lm09clswXS0xLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHZhKHQsbixlKXt2YXIgcj1XeC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIF9hKHQsbixlKXt2YXIgcj1XeC5leGVjKG4uc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8odC5tPTAsdC5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHlhKHQsbixlKXt2YXIgcj1XeC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5IPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGdhKHQsbixlKXt2YXIgcj1XeC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5NPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG1hKHQsbixlKXt2YXIgcj1XeC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5TPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHhhKHQsbixlKXt2YXIgcj1XeC5leGVjKG4uc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8odC5MPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGJhKHQsbixlKXt2YXIgcj1aeC5leGVjKG4uc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj9lK3JbMF0ubGVuZ3RoOi0xfWZ1bmN0aW9uIHdhKHQsbil7cmV0dXJuIGlhKHQuZ2V0RGF0ZSgpLG4sMil9ZnVuY3Rpb24gTWEodCxuKXtyZXR1cm4gaWEodC5nZXRIb3VycygpLG4sMil9ZnVuY3Rpb24gVGEodCxuKXtyZXR1cm4gaWEodC5nZXRIb3VycygpJTEyfHwxMixuLDIpfWZ1bmN0aW9uIGthKHQsbil7cmV0dXJuIGlhKDErZXguY291bnQoeHgodCksdCksbiwzKX1mdW5jdGlvbiBOYSh0LG4pe3JldHVybiBpYSh0LmdldE1pbGxpc2Vjb25kcygpLG4sMyl9ZnVuY3Rpb24gU2EodCxuKXtyZXR1cm4gaWEodC5nZXRNb250aCgpKzEsbiwyKX1mdW5jdGlvbiBFYSh0LG4pe3JldHVybiBpYSh0LmdldE1pbnV0ZXMoKSxuLDIpfWZ1bmN0aW9uIEFhKHQsbil7cmV0dXJuIGlhKHQuZ2V0U2Vjb25kcygpLG4sMil9ZnVuY3Rpb24gQ2EodCxuKXtyZXR1cm4gaWEoaXguY291bnQoeHgodCksdCksbiwyKX1mdW5jdGlvbiB6YSh0KXtyZXR1cm4gdC5nZXREYXkoKX1mdW5jdGlvbiBQYSh0LG4pe3JldHVybiBpYShveC5jb3VudCh4eCh0KSx0KSxuLDIpfWZ1bmN0aW9uIExhKHQsbil7cmV0dXJuIGlhKHQuZ2V0RnVsbFllYXIoKSUxMDAsbiwyKX1mdW5jdGlvbiBSYSh0LG4pe3JldHVybiBpYSh0LmdldEZ1bGxZZWFyKCklMWU0LG4sNCl9ZnVuY3Rpb24gcWEodCl7dmFyIG49dC5nZXRUaW1lem9uZU9mZnNldCgpO3JldHVybihuPjA/Ii0iOihuKj0tMSwiKyIpKStpYShuLzYwfDAsIjAiLDIpK2lhKG4lNjAsIjAiLDIpfWZ1bmN0aW9uIFVhKHQsbil7cmV0dXJuIGlhKHQuZ2V0VVRDRGF0ZSgpLG4sMil9ZnVuY3Rpb24gRGEodCxuKXtyZXR1cm4gaWEodC5nZXRVVENIb3VycygpLG4sMil9ZnVuY3Rpb24gT2EodCxuKXtyZXR1cm4gaWEodC5nZXRVVENIb3VycygpJTEyfHwxMixuLDIpfWZ1bmN0aW9uIEZhKHQsbil7cmV0dXJuIGlhKDErTnguY291bnQoangodCksdCksbiwzKX1mdW5jdGlvbiBJYSh0LG4pe3JldHVybiBpYSh0LmdldFVUQ01pbGxpc2Vjb25kcygpLG4sMyl9ZnVuY3Rpb24gWWEodCxuKXtyZXR1cm4gaWEodC5nZXRVVENNb250aCgpKzEsbiwyKX1mdW5jdGlvbiBCYSh0LG4pe3JldHVybiBpYSh0LmdldFVUQ01pbnV0ZXMoKSxuLDIpfWZ1bmN0aW9uIEhhKHQsbil7cmV0dXJuIGlhKHQuZ2V0VVRDU2Vjb25kcygpLG4sMil9ZnVuY3Rpb24gamEodCxuKXtyZXR1cm4gaWEoRXguY291bnQoangodCksdCksbiwyKX1mdW5jdGlvbiBYYSh0KXtyZXR1cm4gdC5nZXRVVENEYXkoKX1mdW5jdGlvbiAkYSh0LG4pe3JldHVybiBpYShBeC5jb3VudChqeCh0KSx0KSxuLDIpfWZ1bmN0aW9uIFZhKHQsbil7cmV0dXJuIGlhKHQuZ2V0VVRDRnVsbFllYXIoKSUxMDAsbiwyKX1mdW5jdGlvbiBXYSh0LG4pe3JldHVybiBpYSh0LmdldFVUQ0Z1bGxZZWFyKCklMWU0LG4sNCl9ZnVuY3Rpb24gWmEoKXtyZXR1cm4iKzAwMDAifWZ1bmN0aW9uIEdhKCl7cmV0dXJuIiUifWZ1bmN0aW9uIEphKG4pe3JldHVybiBYeD1yYShuKSx0LnRpbWVGb3JtYXQ9WHguZm9ybWF0LHQudGltZVBhcnNlPVh4LnBhcnNlLHQudXRjRm9ybWF0PVh4LnV0Y0Zvcm1hdCx0LnV0Y1BhcnNlPVh4LnV0Y1BhcnNlLFh4fWZ1bmN0aW9uIFFhKHQpe3JldHVybiB0LnRvSVNPU3RyaW5nKCl9ZnVuY3Rpb24gS2EodCl7dmFyIG49bmV3IERhdGUodCk7cmV0dXJuIGlzTmFOKG4pP251bGw6bn1mdW5jdGlvbiB0Yyh0KXtyZXR1cm4gbmV3IERhdGUodCl9ZnVuY3Rpb24gbmModCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlPyt0OituZXcgRGF0ZSgrdCl9ZnVuY3Rpb24gZWModCxuLGUscixvLHUsYSxjLHMpe2Z1bmN0aW9uIGYoaSl7cmV0dXJuKGEoaSk8aT92OnUoaSk8aT9fOm8oaSk8aT95OnIoaSk8aT9nOm4oaSk8aT9lKGkpPGk/bTp4OnQoaSk8aT9iOncpKGkpfWZ1bmN0aW9uIGwobixlLHIsbyl7aWYobnVsbD09biYmKG49MTApLCJudW1iZXIiPT10eXBlb2Ygbil7dmFyIHU9TWF0aC5hYnMoci1lKS9uLGE9WHMoZnVuY3Rpb24odCl7cmV0dXJuIHRbMl19KS5yaWdodChNLHUpO2E9PT1NLmxlbmd0aD8obz1pKGUvb2Isci9vYixuKSxuPXQpOmE/KGE9TVt1L01bYS0xXVsyXTxNW2FdWzJdL3U/YS0xOmFdLG89YVsxXSxuPWFbMF0pOihvPWkoZSxyLG4pLG49Yyl9cmV0dXJuIG51bGw9PW8/bjpuLmV2ZXJ5KG8pfXZhciBoPVJ1KEV1LENoKSxwPWguaW52ZXJ0LGQ9aC5kb21haW4sdj1zKCIuJUwiKSxfPXMoIjolUyIpLHk9cygiJUk6JU0iKSxnPXMoIiVJICVwIiksbT1zKCIlYSAlZCIpLHg9cygiJWIgJWQiKSxiPXMoIiVCIiksdz1zKCIlWSIpLE09W1thLDEsS3hdLFthLDUsNSpLeF0sW2EsMTUsMTUqS3hdLFthLDMwLDMwKkt4XSxbdSwxLHRiXSxbdSw1LDUqdGJdLFt1LDE1LDE1KnRiXSxbdSwzMCwzMCp0Yl0sW28sMSxuYl0sW28sMywzKm5iXSxbbyw2LDYqbmJdLFtvLDEyLDEyKm5iXSxbciwxLGViXSxbciwyLDIqZWJdLFtlLDEscmJdLFtuLDEsaWJdLFtuLDMsMyppYl0sW3QsMSxvYl1dO3JldHVybiBoLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IERhdGUocCh0KSl9LGguZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2QoVW0uY2FsbCh0LG5jKSk6ZCgpLm1hcCh0Yyl9LGgudGlja3M9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPWQoKSxpPXJbMF0sbz1yW3IubGVuZ3RoLTFdLHU9bzxpO3JldHVybiB1JiYoZT1pLGk9byxvPWUpLGU9bCh0LGksbyxuKSxlPWU/ZS5yYW5nZShpLG8rMSk6W10sdT9lLnJldmVyc2UoKTplfSxoLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbnVsbD09bj9mOnMobil9LGgubmljZT1mdW5jdGlvbih0LG4pe3ZhciBlPWQoKTtyZXR1cm4odD1sKHQsZVswXSxlW2UubGVuZ3RoLTFdLG4pKT9kKEhtKGUsdCkpOmh9LGguY29weT1mdW5jdGlvbigpe3JldHVybiBMdShoLGVjKHQsbixlLHIsbyx1LGEsYyxzKSl9LGh9ZnVuY3Rpb24gcmModCl7dmFyIG49dC5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0W01hdGgubWF4KDAsTWF0aC5taW4obi0xLE1hdGguZmxvb3IoZSpuKSkpXX19ZnVuY3Rpb24gaWModCl7ZnVuY3Rpb24gbihuKXt2YXIgbz0obi1lKS8oci1lKTtyZXR1cm4gdChpP01hdGgubWF4KDAsTWF0aC5taW4oMSxvKSk6byl9dmFyIGU9MCxyPTEsaT0hMTtyZXR1cm4gbi5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3RbMF0scj0rdFsxXSxuKTpbZSxyXX0sbi5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0hIXQsbik6aX0sbi5pbnRlcnBvbGF0b3I9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gaWModCkuZG9tYWluKFtlLHJdKS5jbGFtcChpKX0scXUobil9ZnVuY3Rpb24gb2ModCl7cmV0dXJuIHQ+MT8wOnQ8LTE/emI6TWF0aC5hY29zKHQpfWZ1bmN0aW9uIHVjKHQpe3JldHVybiB0Pj0xP1BiOnQ8PS0xPy1QYjpNYXRoLmFzaW4odCl9ZnVuY3Rpb24gYWModCl7cmV0dXJuIHQuaW5uZXJSYWRpdXN9ZnVuY3Rpb24gY2ModCl7cmV0dXJuIHQub3V0ZXJSYWRpdXN9ZnVuY3Rpb24gc2ModCl7cmV0dXJuIHQuc3RhcnRBbmdsZX1mdW5jdGlvbiBmYyh0KXtyZXR1cm4gdC5lbmRBbmdsZX1mdW5jdGlvbiBsYyh0KXtyZXR1cm4gdCYmdC5wYWRBbmdsZX1mdW5jdGlvbiBoYyh0LG4sZSxyLGksbyx1LGEpe3ZhciBjPWUtdCxzPXItbixmPXUtaSxsPWEtbyxoPShmKihuLW8pLWwqKHQtaSkpLyhsKmMtZipzKTtyZXR1cm5bdCtoKmMsbitoKnNdfWZ1bmN0aW9uIHBjKHQsbixlLHIsaSxvLHUpe3ZhciBhPXQtZSxjPW4tcixzPSh1P286LW8pL0FiKGEqYStjKmMpLGY9cypjLGw9LXMqYSxoPXQrZixwPW4rbCxkPWUrZix2PXIrbCxfPShoK2QpLzIseT0ocCt2KS8yLGc9ZC1oLG09di1wLHg9ZypnK20qbSxiPWktbyx3PWgqdi1kKnAsTT0obTwwPy0xOjEpKkFiKE5iKDAsYipiKngtdyp3KSksVD0odyptLWcqTSkveCxrPSgtdypnLW0qTSkveCxOPSh3Km0rZypNKS94LFM9KC13KmcrbSpNKS94LEU9VC1fLEE9ay15LEM9Ti1fLHo9Uy15O3JldHVybiBFKkUrQSpBPkMqQyt6KnomJihUPU4saz1TKSx7Y3g6VCxjeTprLHgwMTotZix5MDE6LWwseDExOlQqKGkvYi0xKSx5MTE6ayooaS9iLTEpfX1mdW5jdGlvbiBkYyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gdmModCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gX2ModCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24geWModCl7dGhpcy5fY3VydmU9dH1mdW5jdGlvbiBnYyh0KXtmdW5jdGlvbiBuKG4pe3JldHVybiBuZXcgeWModChuKSl9cmV0dXJuIG4uX2N1cnZlPXQsbn1mdW5jdGlvbiBtYyh0KXt2YXIgbj10LmN1cnZlO3JldHVybiB0LmFuZ2xlPXQueCxkZWxldGUgdC54LHQucmFkaXVzPXQueSxkZWxldGUgdC55LHQuY3VydmU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bihnYyh0KSk6bigpLl9jdXJ2ZX0sdH1mdW5jdGlvbiB4Yyh0KXtyZXR1cm4gdC5zb3VyY2V9ZnVuY3Rpb24gYmModCl7cmV0dXJuIHQudGFyZ2V0fWZ1bmN0aW9uIHdjKHQpe2Z1bmN0aW9uIG4oKXt2YXIgbixhPWpiLmNhbGwoYXJndW1lbnRzKSxjPWUuYXBwbHkodGhpcyxhKSxzPXIuYXBwbHkodGhpcyxhKTtpZih1fHwodT1uPVVlKCkpLHQodSwraS5hcHBseSh0aGlzLChhWzBdPWMsYSkpLCtvLmFwcGx5KHRoaXMsYSksK2kuYXBwbHkodGhpcywoYVswXT1zLGEpKSwrby5hcHBseSh0aGlzLGEpKSxuKXJldHVybiB1PW51bGwsbisiInx8bnVsbH12YXIgZT14YyxyPWJjLGk9dmMsbz1fYyx1PW51bGw7cmV0dXJuIG4uc291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbik6ZX0sbi50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxuKTpyfSxuLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp3YigrdCksbik6aX0sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6d2IoK3QpLG4pOm99LG4uY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1udWxsPT10P251bGw6dCxuKTp1fSxufWZ1bmN0aW9uIE1jKHQsbixlLHIsaSl7dC5tb3ZlVG8obixlKSx0LmJlemllckN1cnZlVG8obj0obityKS8yLGUsbixpLHIsaSl9ZnVuY3Rpb24gVGModCxuLGUscixpKXt0Lm1vdmVUbyhuLGUpLHQuYmV6aWVyQ3VydmVUbyhuLGU9KGUraSkvMixyLGUscixpKX1mdW5jdGlvbiBrYyh0LG4sZSxyLGkpe3ZhciBvPVhiKG4sZSksdT1YYihuLGU9KGUraSkvMiksYT1YYihyLGUpLGM9WGIocixpKTt0Lm1vdmVUbyhvWzBdLG9bMV0pLHQuYmV6aWVyQ3VydmVUbyh1WzBdLHVbMV0sYVswXSxhWzFdLGNbMF0sY1sxXSl9ZnVuY3Rpb24gTmMoKXtyZXR1cm4gd2MoTWMpfWZ1bmN0aW9uIFNjKCl7cmV0dXJuIHdjKFRjKX1mdW5jdGlvbiBFYygpe3ZhciB0PXdjKGtjKTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnJhZGl1cz10LnksZGVsZXRlIHQueSx0fWZ1bmN0aW9uIEFjKHQsbixlKXt0Ll9jb250ZXh0LmJlemllckN1cnZlVG8oKDIqdC5feDArdC5feDEpLzMsKDIqdC5feTArdC5feTEpLzMsKHQuX3gwKzIqdC5feDEpLzMsKHQuX3kwKzIqdC5feTEpLzMsKHQuX3gwKzQqdC5feDErbikvNiwodC5feTArNCp0Ll95MStlKS82KX1mdW5jdGlvbiBDYyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gemModCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIFBjKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBMYyh0LG4pe3RoaXMuX2Jhc2lzPW5ldyBDYyh0KSx0aGlzLl9iZXRhPW59ZnVuY3Rpb24gUmModCxuLGUpe3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyh0Ll94MSt0Ll9rKih0Ll94Mi10Ll94MCksdC5feTErdC5fayoodC5feTItdC5feTApLHQuX3gyK3QuX2sqKHQuX3gxLW4pLHQuX3kyK3QuX2sqKHQuX3kxLWUpLHQuX3gyLHQuX3kyKX1mdW5jdGlvbiBxYyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9rPSgxLW4pLzZ9ZnVuY3Rpb24gVWModCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5faz0oMS1uKS82fWZ1bmN0aW9uIERjKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1mdW5jdGlvbiBPYyh0LG4sZSl7dmFyIHI9dC5feDEsaT10Ll95MSxvPXQuX3gyLHU9dC5feTI7aWYodC5fbDAxX2E+Q2Ipe3ZhciBhPTIqdC5fbDAxXzJhKzMqdC5fbDAxX2EqdC5fbDEyX2ErdC5fbDEyXzJhLGM9Myp0Ll9sMDFfYSoodC5fbDAxX2ErdC5fbDEyX2EpO3I9KHIqYS10Ll94MCp0Ll9sMTJfMmErdC5feDIqdC5fbDAxXzJhKS9jLGk9KGkqYS10Ll95MCp0Ll9sMTJfMmErdC5feTIqdC5fbDAxXzJhKS9jfWlmKHQuX2wyM19hPkNiKXt2YXIgcz0yKnQuX2wyM18yYSszKnQuX2wyM19hKnQuX2wxMl9hK3QuX2wxMl8yYSxmPTMqdC5fbDIzX2EqKHQuX2wyM19hK3QuX2wxMl9hKTtvPShvKnMrdC5feDEqdC5fbDIzXzJhLW4qdC5fbDEyXzJhKS9mLHU9KHUqcyt0Ll95MSp0Ll9sMjNfMmEtZSp0Ll9sMTJfMmEpL2Z9dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHIsaSxvLHUsdC5feDIsdC5feTIpfWZ1bmN0aW9uIEZjKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPW59ZnVuY3Rpb24gSWModCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fYWxwaGE9bn1mdW5jdGlvbiBZYyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1ufWZ1bmN0aW9uIEJjKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBIYyh0KXtyZXR1cm4gdDwwPy0xOjF9ZnVuY3Rpb24gamModCxuLGUpe3ZhciByPXQuX3gxLXQuX3gwLGk9bi10Ll94MSxvPSh0Ll95MS10Ll95MCkvKHJ8fGk8MCYmLTApLHU9KGUtdC5feTEpLyhpfHxyPDAmJi0wKSxhPShvKmkrdSpyKS8ocitpKTtyZXR1cm4oSGMobykrSGModSkpKk1hdGgubWluKE1hdGguYWJzKG8pLE1hdGguYWJzKHUpLC41Kk1hdGguYWJzKGEpKXx8MH1mdW5jdGlvbiBYYyh0LG4pe3ZhciBlPXQuX3gxLXQuX3gwO3JldHVybiBlPygzKih0Ll95MS10Ll95MCkvZS1uKS8yOm59ZnVuY3Rpb24gJGModCxuLGUpe3ZhciByPXQuX3gwLGk9dC5feTAsbz10Ll94MSx1PXQuX3kxLGE9KG8tcikvMzt0Ll9jb250ZXh0LmJlemllckN1cnZlVG8ocithLGkrYSpuLG8tYSx1LWEqZSxvLHUpfWZ1bmN0aW9uIFZjKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBXYyh0KXt0aGlzLl9jb250ZXh0PW5ldyBaYyh0KX1mdW5jdGlvbiBaYyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gR2ModCl7cmV0dXJuIG5ldyBWYyh0KX1mdW5jdGlvbiBKYyh0KXtyZXR1cm4gbmV3IFdjKHQpfWZ1bmN0aW9uIFFjKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBLYyh0KXt2YXIgbixlLHI9dC5sZW5ndGgtMSxpPW5ldyBBcnJheShyKSxvPW5ldyBBcnJheShyKSx1PW5ldyBBcnJheShyKTtmb3IoaVswXT0wLG9bMF09Mix1WzBdPXRbMF0rMip0WzFdLG49MTtuPHItMTsrK24paVtuXT0xLG9bbl09NCx1W25dPTQqdFtuXSsyKnRbbisxXTtmb3IoaVtyLTFdPTIsb1tyLTFdPTcsdVtyLTFdPTgqdFtyLTFdK3Rbcl0sbj0xO248cjsrK24pZT1pW25dL29bbi0xXSxvW25dLT1lLHVbbl0tPWUqdVtuLTFdO2ZvcihpW3ItMV09dVtyLTFdL29bci0xXSxuPXItMjtuPj0wOy0tbilpW25dPSh1W25dLWlbbisxXSkvb1tuXTtmb3Iob1tyLTFdPSh0W3JdK2lbci0xXSkvMixuPTA7bjxyLTE7KytuKW9bbl09Mip0W24rMV0taVtuKzFdO3JldHVybltpLG9dfWZ1bmN0aW9uIHRzKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX3Q9bn1mdW5jdGlvbiBucyh0KXtyZXR1cm4gbmV3IHRzKHQsMCl9ZnVuY3Rpb24gZXModCl7cmV0dXJuIG5ldyB0cyh0LDEpfWZ1bmN0aW9uIHJzKHQsbil7cmV0dXJuIHRbbl19ZnVuY3Rpb24gaXModCl7Zm9yKHZhciBuLGU9MCxyPS0xLGk9dC5sZW5ndGg7KytyPGk7KShuPSt0W3JdWzFdKSYmKGUrPW4pO3JldHVybiBlfWZ1bmN0aW9uIG9zKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIHVzKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIGFzKCl7dGhpcy5fPW51bGx9ZnVuY3Rpb24gY3ModCl7dC5VPXQuQz10Lkw9dC5SPXQuUD10Lk49bnVsbH1mdW5jdGlvbiBzcyh0LG4pe3ZhciBlPW4scj1uLlIsaT1lLlU7aT9pLkw9PT1lP2kuTD1yOmkuUj1yOnQuXz1yLHIuVT1pLGUuVT1yLGUuUj1yLkwsZS5SJiYoZS5SLlU9ZSksci5MPWV9ZnVuY3Rpb24gZnModCxuKXt2YXIgZT1uLHI9bi5MLGk9ZS5VO2k/aS5MPT09ZT9pLkw9cjppLlI9cjp0Ll89cixyLlU9aSxlLlU9cixlLkw9ci5SLGUuTCYmKGUuTC5VPWUpLHIuUj1lfWZ1bmN0aW9uIGxzKHQpe2Zvcig7dC5MOyl0PXQuTDtyZXR1cm4gdH1mdW5jdGlvbiBocyh0LG4sZSxyKXt2YXIgaT1bbnVsbCxudWxsXSxvPVl3LnB1c2goaSktMTtyZXR1cm4gaS5sZWZ0PXQsaS5yaWdodD1uLGUmJmRzKGksdCxuLGUpLHImJmRzKGksbix0LHIpLEZ3W3QuaW5kZXhdLmhhbGZlZGdlcy5wdXNoKG8pLEZ3W24uaW5kZXhdLmhhbGZlZGdlcy5wdXNoKG8pLGl9ZnVuY3Rpb24gcHModCxuLGUpe3ZhciByPVtuLGVdO3JldHVybiByLmxlZnQ9dCxyfWZ1bmN0aW9uIGRzKHQsbixlLHIpe3RbMF18fHRbMV0/dC5sZWZ0PT09ZT90WzFdPXI6dFswXT1yOih0WzBdPXIsdC5sZWZ0PW4sdC5yaWdodD1lKX1mdW5jdGlvbiB2cyh0LG4sZSxyLGkpe3ZhciBvLHU9dFswXSxhPXRbMV0sYz11WzBdLHM9dVsxXSxmPWFbMF0sbD1hWzFdLGg9MCxwPTEsZD1mLWMsdj1sLXM7aWYobz1uLWMsZHx8IShvPjApKXtpZihvLz1kLGQ8MCl7aWYobzxoKXJldHVybjtvPHAmJihwPW8pfWVsc2UgaWYoZD4wKXtpZihvPnApcmV0dXJuO28+aCYmKGg9byl9aWYobz1yLWMsZHx8IShvPDApKXtpZihvLz1kLGQ8MCl7aWYobz5wKXJldHVybjtvPmgmJihoPW8pfWVsc2UgaWYoZD4wKXtpZihvPGgpcmV0dXJuO288cCYmKHA9byl9aWYobz1lLXMsdnx8IShvPjApKXtpZihvLz12LHY8MCl7aWYobzxoKXJldHVybjtvPHAmJihwPW8pfWVsc2UgaWYodj4wKXtpZihvPnApcmV0dXJuO28+aCYmKGg9byl9aWYobz1pLXMsdnx8IShvPDApKXtpZihvLz12LHY8MCl7aWYobz5wKXJldHVybjtvPmgmJihoPW8pfWVsc2UgaWYodj4wKXtpZihvPGgpcmV0dXJuO288cCYmKHA9byl9cmV0dXJuIShoPjB8fHA8MSl8fChoPjAmJih0WzBdPVtjK2gqZCxzK2gqdl0pLHA8MSYmKHRbMV09W2MrcCpkLHMrcCp2XSksITApfX19fX1mdW5jdGlvbiBfcyh0LG4sZSxyLGkpe3ZhciBvPXRbMV07aWYobylyZXR1cm4hMDt2YXIgdSxhLGM9dFswXSxzPXQubGVmdCxmPXQucmlnaHQsbD1zWzBdLGg9c1sxXSxwPWZbMF0sZD1mWzFdLHY9KGwrcCkvMixfPShoK2QpLzI7aWYoZD09PWgpe2lmKHY8bnx8dj49cilyZXR1cm47aWYobD5wKXtpZihjKXtpZihjWzFdPj1pKXJldHVybn1lbHNlIGM9W3YsZV07bz1bdixpXX1lbHNle2lmKGMpe2lmKGNbMV08ZSlyZXR1cm59ZWxzZSBjPVt2LGldO289W3YsZV19fWVsc2UgaWYodT0obC1wKS8oZC1oKSxhPV8tdSp2LHU8LTF8fHU+MSlpZihsPnApe2lmKGMpe2lmKGNbMV0+PWkpcmV0dXJufWVsc2UgYz1bKGUtYSkvdSxlXTtvPVsoaS1hKS91LGldfWVsc2V7aWYoYyl7aWYoY1sxXTxlKXJldHVybn1lbHNlIGM9WyhpLWEpL3UsaV07bz1bKGUtYSkvdSxlXX1lbHNlIGlmKGg8ZCl7aWYoYyl7aWYoY1swXT49cilyZXR1cm59ZWxzZSBjPVtuLHUqbithXTtvPVtyLHUqcithXX1lbHNle2lmKGMpe2lmKGNbMF08bilyZXR1cm59ZWxzZSBjPVtyLHUqcithXTtvPVtuLHUqbithXX1yZXR1cm4gdFswXT1jLHRbMV09bywhMH1mdW5jdGlvbiB5cyh0LG4sZSxyKXtmb3IodmFyIGksbz1Zdy5sZW5ndGg7by0tOylfcyhpPVl3W29dLHQsbixlLHIpJiZ2cyhpLHQsbixlLHIpJiYoTWF0aC5hYnMoaVswXVswXS1pWzFdWzBdKT5qd3x8TWF0aC5hYnMoaVswXVsxXS1pWzFdWzFdKT5qdyl8fGRlbGV0ZSBZd1tvXX1mdW5jdGlvbiBncyh0KXtyZXR1cm4gRndbdC5pbmRleF09e3NpdGU6dCxoYWxmZWRnZXM6W119fWZ1bmN0aW9uIG1zKHQsbil7dmFyIGU9dC5zaXRlLHI9bi5sZWZ0LGk9bi5yaWdodDtyZXR1cm4gZT09PWkmJihpPXIscj1lKSxpP01hdGguYXRhbjIoaVsxXS1yWzFdLGlbMF0tclswXSk6KGU9PT1yPyhyPW5bMV0saT1uWzBdKToocj1uWzBdLGk9blsxXSksTWF0aC5hdGFuMihyWzBdLWlbMF0saVsxXS1yWzFdKSl9ZnVuY3Rpb24geHModCxuKXtyZXR1cm4gblsrKG4ubGVmdCE9PXQuc2l0ZSldfWZ1bmN0aW9uIGJzKHQsbil7cmV0dXJuIG5bKyhuLmxlZnQ9PT10LnNpdGUpXX1mdW5jdGlvbiB3cygpe2Zvcih2YXIgdCxuLGUscixpPTAsbz1Gdy5sZW5ndGg7aTxvOysraSlpZigodD1Gd1tpXSkmJihyPShuPXQuaGFsZmVkZ2VzKS5sZW5ndGgpKXt2YXIgdT1uZXcgQXJyYXkociksYT1uZXcgQXJyYXkocik7Zm9yKGU9MDtlPHI7KytlKXVbZV09ZSxhW2VdPW1zKHQsWXdbbltlXV0pO2Zvcih1LnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gYVtuXS1hW3RdfSksZT0wO2U8cjsrK2UpYVtlXT1uW3VbZV1dO2ZvcihlPTA7ZTxyOysrZSluW2VdPWFbZV19fWZ1bmN0aW9uIE1zKHQsbixlLHIpe3ZhciBpLG8sdSxhLGMscyxmLGwsaCxwLGQsdixfPUZ3Lmxlbmd0aCx5PSEwO2ZvcihpPTA7aTxfOysraSlpZihvPUZ3W2ldKXtmb3IodT1vLnNpdGUsYz1vLmhhbGZlZGdlcyxhPWMubGVuZ3RoO2EtLTspWXdbY1thXV18fGMuc3BsaWNlKGEsMSk7Zm9yKGE9MCxzPWMubGVuZ3RoO2E8czspcD1icyhvLFl3W2NbYV1dKSxkPXBbMF0sdj1wWzFdLGY9eHMobyxZd1tjWysrYSVzXV0pLGw9ZlswXSxoPWZbMV0sKE1hdGguYWJzKGQtbCk+and8fE1hdGguYWJzKHYtaCk+ancpJiYoYy5zcGxpY2UoYSwwLFl3LnB1c2gocHModSxwLE1hdGguYWJzKGQtdCk8ancmJnItdj5qdz9bdCxNYXRoLmFicyhsLXQpPGp3P2g6cl06TWF0aC5hYnModi1yKTxqdyYmZS1kPmp3P1tNYXRoLmFicyhoLXIpPGp3P2w6ZSxyXTpNYXRoLmFicyhkLWUpPGp3JiZ2LW4+anc/W2UsTWF0aC5hYnMobC1lKTxqdz9oOm5dOk1hdGguYWJzKHYtbik8ancmJmQtdD5qdz9bTWF0aC5hYnMoaC1uKTxqdz9sOnQsbl06bnVsbCkpLTEpLCsrcyk7cyYmKHk9ITEpfWlmKHkpe3ZhciBnLG0seCxiPTEvMDtmb3IoaT0wLHk9bnVsbDtpPF87KytpKShvPUZ3W2ldKSYmKHU9by5zaXRlLGc9dVswXS10LG09dVsxXS1uLCh4PWcqZyttKm0pPGImJihiPXgseT1vKSk7aWYoeSl7dmFyIHc9W3Qsbl0sTT1bdCxyXSxUPVtlLHJdLGs9W2Usbl07eS5oYWxmZWRnZXMucHVzaChZdy5wdXNoKHBzKHU9eS5zaXRlLHcsTSkpLTEsWXcucHVzaChwcyh1LE0sVCkpLTEsWXcucHVzaChwcyh1LFQsaykpLTEsWXcucHVzaChwcyh1LGssdykpLTEpfX1mb3IoaT0wO2k8XzsrK2kpKG89RndbaV0pJiYoby5oYWxmZWRnZXMubGVuZ3RofHxkZWxldGUgRndbaV0pfWZ1bmN0aW9uIFRzKCl7Y3ModGhpcyksdGhpcy54PXRoaXMueT10aGlzLmFyYz10aGlzLnNpdGU9dGhpcy5jeT1udWxsfWZ1bmN0aW9uIGtzKHQpe3ZhciBuPXQuUCxlPXQuTjtpZihuJiZlKXt2YXIgcj1uLnNpdGUsaT10LnNpdGUsbz1lLnNpdGU7aWYociE9PW8pe3ZhciB1PWlbMF0sYT1pWzFdLGM9clswXS11LHM9clsxXS1hLGY9b1swXS11LGw9b1sxXS1hLGg9MiooYypsLXMqZik7aWYoIShoPj0tWHcpKXt2YXIgcD1jKmMrcypzLGQ9ZipmK2wqbCx2PShsKnAtcypkKS9oLF89KGMqZC1mKnApL2gseT1Cdy5wb3AoKXx8bmV3IFRzO3kuYXJjPXQseS5zaXRlPWkseS54PXYrdSx5Lnk9KHkuY3k9XythKStNYXRoLnNxcnQodip2K18qXyksdC5jaXJjbGU9eTtmb3IodmFyIGc9bnVsbCxtPUl3Ll87bTspaWYoeS55PG0ueXx8eS55PT09bS55JiZ5Lng8PW0ueCl7aWYoIW0uTCl7Zz1tLlA7YnJlYWt9bT1tLkx9ZWxzZXtpZighbS5SKXtnPW07YnJlYWt9bT1tLlJ9SXcuaW5zZXJ0KGcseSksZ3x8KER3PXkpfX19fWZ1bmN0aW9uIE5zKHQpe3ZhciBuPXQuY2lyY2xlO24mJihuLlB8fChEdz1uLk4pLEl3LnJlbW92ZShuKSxCdy5wdXNoKG4pLGNzKG4pLHQuY2lyY2xlPW51bGwpfWZ1bmN0aW9uIFNzKCl7Y3ModGhpcyksdGhpcy5lZGdlPXRoaXMuc2l0ZT10aGlzLmNpcmNsZT1udWxsfWZ1bmN0aW9uIEVzKHQpe3ZhciBuPUh3LnBvcCgpfHxuZXcgU3M7cmV0dXJuIG4uc2l0ZT10LG59ZnVuY3Rpb24gQXModCl7TnModCksT3cucmVtb3ZlKHQpLEh3LnB1c2godCksY3ModCl9ZnVuY3Rpb24gQ3ModCl7dmFyIG49dC5jaXJjbGUsZT1uLngscj1uLmN5LGk9W2Uscl0sbz10LlAsdT10Lk4sYT1bdF07QXModCk7Zm9yKHZhciBjPW87Yy5jaXJjbGUmJk1hdGguYWJzKGUtYy5jaXJjbGUueCk8ancmJk1hdGguYWJzKHItYy5jaXJjbGUuY3kpPGp3OylvPWMuUCxhLnVuc2hpZnQoYyksQXMoYyksYz1vO2EudW5zaGlmdChjKSxOcyhjKTtmb3IodmFyIHM9dTtzLmNpcmNsZSYmTWF0aC5hYnMoZS1zLmNpcmNsZS54KTxqdyYmTWF0aC5hYnMoci1zLmNpcmNsZS5jeSk8anc7KXU9cy5OLGEucHVzaChzKSxBcyhzKSxzPXU7YS5wdXNoKHMpLE5zKHMpO3ZhciBmLGw9YS5sZW5ndGg7Zm9yKGY9MTtmPGw7KytmKXM9YVtmXSxjPWFbZi0xXSxkcyhzLmVkZ2UsYy5zaXRlLHMuc2l0ZSxpKTtjPWFbMF0scz1hW2wtMV0scy5lZGdlPWhzKGMuc2l0ZSxzLnNpdGUsbnVsbCxpKSxrcyhjKSxrcyhzKX1mdW5jdGlvbiB6cyh0KXtmb3IodmFyIG4sZSxyLGksbz10WzBdLHU9dFsxXSxhPU93Ll87YTspaWYoKHI9UHMoYSx1KS1vKT5qdylhPWEuTDtlbHNle2lmKCEoKGk9by1McyhhLHUpKT5qdykpe3I+LWp3PyhuPWEuUCxlPWEpOmk+LWp3PyhuPWEsZT1hLk4pOm49ZT1hO2JyZWFrfWlmKCFhLlIpe249YTticmVha31hPWEuUn1ncyh0KTt2YXIgYz1Fcyh0KTtpZihPdy5pbnNlcnQobixjKSxufHxlKXtpZihuPT09ZSlyZXR1cm4gTnMobiksZT1FcyhuLnNpdGUpLE93Lmluc2VydChjLGUpLGMuZWRnZT1lLmVkZ2U9aHMobi5zaXRlLGMuc2l0ZSksa3Mobiksdm9pZCBrcyhlKTtpZighZSlyZXR1cm4gdm9pZChjLmVkZ2U9aHMobi5zaXRlLGMuc2l0ZSkpO05zKG4pLE5zKGUpO3ZhciBzPW4uc2l0ZSxmPXNbMF0sbD1zWzFdLGg9dFswXS1mLHA9dFsxXS1sLGQ9ZS5zaXRlLHY9ZFswXS1mLF89ZFsxXS1sLHk9MiooaCpfLXAqdiksZz1oKmgrcCpwLG09dip2K18qXyx4PVsoXypnLXAqbSkveStmLChoKm0tdipnKS95K2xdO2RzKGUuZWRnZSxzLGQseCksYy5lZGdlPWhzKHMsdCxudWxsLHgpLGUuZWRnZT1ocyh0LGQsbnVsbCx4KSxrcyhuKSxrcyhlKX19ZnVuY3Rpb24gUHModCxuKXt2YXIgZT10LnNpdGUscj1lWzBdLGk9ZVsxXSxvPWktbjtpZighbylyZXR1cm4gcjt2YXIgdT10LlA7aWYoIXUpcmV0dXJuLTEvMDtlPXUuc2l0ZTt2YXIgYT1lWzBdLGM9ZVsxXSxzPWMtbjtpZighcylyZXR1cm4gYTt2YXIgZj1hLXIsbD0xL28tMS9zLGg9Zi9zO3JldHVybiBsPygtaCtNYXRoLnNxcnQoaCpoLTIqbCooZipmLygtMipzKS1jK3MvMitpLW8vMikpKS9sK3I6KHIrYSkvMn1mdW5jdGlvbiBMcyh0LG4pe3ZhciBlPXQuTjtpZihlKXJldHVybiBQcyhlLG4pO3ZhciByPXQuc2l0ZTtyZXR1cm4gclsxXT09PW4/clswXToxLzB9ZnVuY3Rpb24gUnModCxuLGUpe3JldHVybih0WzBdLWVbMF0pKihuWzFdLXRbMV0pLSh0WzBdLW5bMF0pKihlWzFdLXRbMV0pfWZ1bmN0aW9uIHFzKHQsbil7cmV0dXJuIG5bMV0tdFsxXXx8blswXS10WzBdfWZ1bmN0aW9uIFVzKHQsbil7dmFyIGUscixpLG89dC5zb3J0KHFzKS5wb3AoKTtmb3IoWXc9W10sRnc9bmV3IEFycmF5KHQubGVuZ3RoKSxPdz1uZXcgYXMsSXc9bmV3IGFzOzspaWYoaT1EdyxvJiYoIWl8fG9bMV08aS55fHxvWzFdPT09aS55JiZvWzBdPGkueCkpb1swXT09PWUmJm9bMV09PT1yfHwoenMobyksZT1vWzBdLHI9b1sxXSksbz10LnBvcCgpO2Vsc2V7aWYoIWkpYnJlYWs7Q3MoaS5hcmMpfWlmKHdzKCksbil7dmFyIHU9K25bMF1bMF0sYT0rblswXVsxXSxjPStuWzFdWzBdLHM9K25bMV1bMV07eXModSxhLGMscyksTXModSxhLGMscyl9dGhpcy5lZGdlcz1Zdyx0aGlzLmNlbGxzPUZ3LE93PUl3PVl3PUZ3PW51bGx9ZnVuY3Rpb24gRHModCxuLGUpe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPW4sdGhpcy50cmFuc2Zvcm09ZX1mdW5jdGlvbiBPcyh0LG4sZSl7dGhpcy5rPXQsdGhpcy54PW4sdGhpcy55PWV9ZnVuY3Rpb24gRnModCl7cmV0dXJuIHQuX196b29tfHxXd31mdW5jdGlvbiBJcygpe3QuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gWXMoKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gQnMoKXt2YXIgdCxuLGU9dGhpcztyZXR1cm4gZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ/KGU9ZS5vd25lclNWR0VsZW1lbnR8fGUsdD1lLndpZHRoLmJhc2VWYWwudmFsdWUsbj1lLmhlaWdodC5iYXNlVmFsLnZhbHVlKToodD1lLmNsaWVudFdpZHRoLG49ZS5jbGllbnRIZWlnaHQpLFtbMCwwXSxbdCxuXV19ZnVuY3Rpb24gSHMoKXtyZXR1cm4gdGhpcy5fX3pvb218fFd3fXZhciBqcz1mdW5jdGlvbih0LG4pe3JldHVybiB0PG4/LTE6dD5uPzE6dD49bj8wOk5hTn0sWHM9ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10Lmxlbmd0aCYmKHQ9bih0KSkse2xlZnQ6ZnVuY3Rpb24obixlLHIsaSl7Zm9yKG51bGw9PXImJihyPTApLG51bGw9PWkmJihpPW4ubGVuZ3RoKTtyPGk7KXt2YXIgbz1yK2k+Pj4xO3QobltvXSxlKTwwP3I9bysxOmk9b31yZXR1cm4gcn0scmlnaHQ6ZnVuY3Rpb24obixlLHIsaSl7Zm9yKG51bGw9PXImJihyPTApLG51bGw9PWkmJihpPW4ubGVuZ3RoKTtyPGk7KXt2YXIgbz1yK2k+Pj4xO3QobltvXSxlKT4wP2k9bzpyPW8rMX1yZXR1cm4gcn19fSwkcz1YcyhqcyksVnM9JHMucmlnaHQsV3M9JHMubGVmdCxacz1mdW5jdGlvbih0LG4pe251bGw9PW4mJihuPWUpO2Zvcih2YXIgcj0wLGk9dC5sZW5ndGgtMSxvPXRbMF0sdT1uZXcgQXJyYXkoaTwwPzA6aSk7cjxpOyl1W3JdPW4obyxvPXRbKytyXSk7cmV0dXJuIHV9LEdzPWZ1bmN0aW9uKHQsbixyKXt2YXIgaSxvLHUsYSxjPXQubGVuZ3RoLHM9bi5sZW5ndGgsZj1uZXcgQXJyYXkoYypzKTtmb3IobnVsbD09ciYmKHI9ZSksaT11PTA7aTxjOysraSlmb3IoYT10W2ldLG89MDtvPHM7KytvLCsrdSlmW3VdPXIoYSxuW29dKTtyZXR1cm4gZn0sSnM9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbjx0Py0xOm4+dD8xOm4+PXQ/MDpOYU59LFFzPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dD9OYU46K3R9LEtzPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXQubGVuZ3RoLG89MCx1PS0xLGE9MCxjPTA7aWYobnVsbD09bilmb3IoOysrdTxpOylpc05hTihlPVFzKHRbdV0pKXx8KHI9ZS1hLGErPXIvKytvLGMrPXIqKGUtYSkpO2Vsc2UgZm9yKDsrK3U8aTspaXNOYU4oZT1RcyhuKHRbdV0sdSx0KSkpfHwocj1lLWEsYSs9ci8rK28sYys9ciooZS1hKSk7aWYobz4xKXJldHVybiBjLyhvLTEpfSx0Zj1mdW5jdGlvbih0LG4pe3ZhciBlPUtzKHQsbik7cmV0dXJuIGU/TWF0aC5zcXJ0KGUpOmV9LG5mPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpLG89dC5sZW5ndGgsdT0tMTtpZihudWxsPT1uKXtmb3IoOysrdTxvOylpZihudWxsIT0oZT10W3VdKSYmZT49ZSlmb3Iocj1pPWU7Kyt1PG87KW51bGwhPShlPXRbdV0pJiYocj5lJiYocj1lKSxpPGUmJihpPWUpKX1lbHNlIGZvcig7Kyt1PG87KWlmKG51bGwhPShlPW4odFt1XSx1LHQpKSYmZT49ZSlmb3Iocj1pPWU7Kyt1PG87KW51bGwhPShlPW4odFt1XSx1LHQpKSYmKHI+ZSYmKHI9ZSksaTxlJiYoaT1lKSk7cmV0dXJuW3IsaV19LGVmPUFycmF5LnByb3RvdHlwZSxyZj1lZi5zbGljZSxvZj1lZi5tYXAsdWY9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSxhZj1mdW5jdGlvbih0KXtyZXR1cm4gdH0sY2Y9ZnVuY3Rpb24odCxuLGUpe3Q9K3Qsbj0rbixlPShpPWFyZ3VtZW50cy5sZW5ndGgpPDI/KG49dCx0PTAsMSk6aTwzPzE6K2U7Zm9yKHZhciByPS0xLGk9MHxNYXRoLm1heCgwLE1hdGguY2VpbCgobi10KS9lKSksbz1uZXcgQXJyYXkoaSk7KytyPGk7KW9bcl09dCtyKmU7cmV0dXJuIG99LHNmPU1hdGguc3FydCg1MCksZmY9TWF0aC5zcXJ0KDEwKSxsZj1NYXRoLnNxcnQoMiksaGY9ZnVuY3Rpb24odCxuLGUpe3ZhciBpLG8sdSxhPW48dCxjPS0xO2lmKGEmJihpPXQsdD1uLG49aSksMD09PSh1PXIodCxuLGUpKXx8IWlzRmluaXRlKHUpKXJldHVybltdO2lmKHU+MClmb3IodD1NYXRoLmNlaWwodC91KSxuPU1hdGguZmxvb3Iobi91KSxvPW5ldyBBcnJheShpPU1hdGguY2VpbChuLXQrMSkpOysrYzxpOylvW2NdPSh0K2MpKnU7ZWxzZSBmb3IodD1NYXRoLmZsb29yKHQqdSksbj1NYXRoLmNlaWwobip1KSxvPW5ldyBBcnJheShpPU1hdGguY2VpbCh0LW4rMSkpOysrYzxpOylvW2NdPSh0LWMpL3U7cmV0dXJuIGEmJm8ucmV2ZXJzZSgpLG99LHBmPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmNlaWwoTWF0aC5sb2codC5sZW5ndGgpL01hdGguTE4yKSsxfSxkZj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIG8sdSxhPXQubGVuZ3RoLGM9bmV3IEFycmF5KGEpO2ZvcihvPTA7bzxhOysrbyljW29dPW4odFtvXSxvLHQpO3ZhciBzPWUoYyksZj1zWzBdLGw9c1sxXSxoPXIoYyxmLGwpO0FycmF5LmlzQXJyYXkoaCl8fChoPWkoZixsLGgpLGg9Y2YoTWF0aC5jZWlsKGYvaCkqaCxNYXRoLmZsb29yKGwvaCkqaCxoKSk7Zm9yKHZhciBwPWgubGVuZ3RoO2hbMF08PWY7KWguc2hpZnQoKSwtLXA7Zm9yKDtoW3AtMV0+bDspaC5wb3AoKSwtLXA7dmFyIGQsdj1uZXcgQXJyYXkocCsxKTtmb3Iobz0wO288PXA7KytvKWQ9dltvXT1bXSxkLngwPW8+MD9oW28tMV06ZixkLngxPW88cD9oW29dOmw7Zm9yKG89MDtvPGE7KytvKXU9Y1tvXSxmPD11JiZ1PD1sJiZ2W1ZzKGgsdSwwLHApXS5wdXNoKHRbb10pO3JldHVybiB2fXZhciBuPWFmLGU9bmYscj1wZjtyZXR1cm4gdC52YWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOnVmKGUpLHQpOm59LHQuZG9tYWluPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246dWYoW25bMF0sblsxXV0pLHQpOmV9LHQudGhyZXNob2xkcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnVmKEFycmF5LmlzQXJyYXkobik/cmYuY2FsbChuKTpuKSx0KTpyfSx0fSx2Zj1mdW5jdGlvbih0LG4sZSl7aWYobnVsbD09ZSYmKGU9UXMpLHI9dC5sZW5ndGgpe2lmKChuPStuKTw9MHx8cjwyKXJldHVybitlKHRbMF0sMCx0KTtpZihuPj0xKXJldHVybitlKHRbci0xXSxyLTEsdCk7dmFyIHIsaT0oci0xKSpuLG89TWF0aC5mbG9vcihpKSx1PStlKHRbb10sbyx0KTtyZXR1cm4gdSsoK2UodFtvKzFdLG8rMSx0KS11KSooaS1vKX19LF9mPWZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gdD1vZi5jYWxsKHQsUXMpLnNvcnQoanMpLE1hdGguY2VpbCgoZS1uKS8oMioodmYodCwuNzUpLXZmKHQsLjI1KSkqTWF0aC5wb3codC5sZW5ndGgsLTEvMykpKX0seWY9ZnVuY3Rpb24odCxuLGUpe3JldHVybiBNYXRoLmNlaWwoKGUtbikvKDMuNSp0Zih0KSpNYXRoLnBvdyh0Lmxlbmd0aCwtMS8zKSkpfSxnZj1mdW5jdGlvbih0LG4pe3ZhciBlLHIsaT10Lmxlbmd0aCxvPS0xO2lmKG51bGw9PW4pe2Zvcig7KytvPGk7KWlmKG51bGwhPShlPXRbb10pJiZlPj1lKWZvcihyPWU7KytvPGk7KW51bGwhPShlPXRbb10pJiZlPnImJihyPWUpfWVsc2UgZm9yKDsrK288aTspaWYobnVsbCE9KGU9bih0W29dLG8sdCkpJiZlPj1lKWZvcihyPWU7KytvPGk7KW51bGwhPShlPW4odFtvXSxvLHQpKSYmZT5yJiYocj1lKTtyZXR1cm4gcn0sbWY9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPXQubGVuZ3RoLGk9cixvPS0xLHU9MDtpZihudWxsPT1uKWZvcig7KytvPHI7KWlzTmFOKGU9UXModFtvXSkpPy0taTp1Kz1lO2Vsc2UgZm9yKDsrK288cjspaXNOYU4oZT1RcyhuKHRbb10sbyx0KSkpPy0taTp1Kz1lO2lmKGkpcmV0dXJuIHUvaX0seGY9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPXQubGVuZ3RoLGk9LTEsbz1bXTtpZihudWxsPT1uKWZvcig7KytpPHI7KWlzTmFOKGU9UXModFtpXSkpfHxvLnB1c2goZSk7ZWxzZSBmb3IoOysraTxyOylpc05hTihlPVFzKG4odFtpXSxpLHQpKSl8fG8ucHVzaChlKTtyZXR1cm4gdmYoby5zb3J0KGpzKSwuNSl9LGJmPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHIsaT10Lmxlbmd0aCxvPS0xLHU9MDsrK288aTspdSs9dFtvXS5sZW5ndGg7Zm9yKGU9bmV3IEFycmF5KHUpOy0taT49MDspZm9yKHI9dFtpXSxuPXIubGVuZ3RoOy0tbj49MDspZVstLXVdPXJbbl07cmV0dXJuIGV9LHdmPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXQubGVuZ3RoLG89LTE7aWYobnVsbD09bil7Zm9yKDsrK288aTspaWYobnVsbCE9KGU9dFtvXSkmJmU+PWUpZm9yKHI9ZTsrK288aTspbnVsbCE9KGU9dFtvXSkmJnI+ZSYmKHI9ZSl9ZWxzZSBmb3IoOysrbzxpOylpZihudWxsIT0oZT1uKHRbb10sbyx0KSkmJmU+PWUpZm9yKHI9ZTsrK288aTspbnVsbCE9KGU9bih0W29dLG8sdCkpJiZyPmUmJihyPWUpO3JldHVybiByfSxNZj1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZT1uLmxlbmd0aCxyPW5ldyBBcnJheShlKTtlLS07KXJbZV09dFtuW2VdXTtyZXR1cm4gcn0sVGY9ZnVuY3Rpb24odCxuKXtpZihlPXQubGVuZ3RoKXt2YXIgZSxyLGk9MCxvPTAsdT10W29dO2ZvcihudWxsPT1uJiYobj1qcyk7KytpPGU7KShuKHI9dFtpXSx1KTwwfHwwIT09bih1LHUpKSYmKHU9cixvPWkpO3JldHVybiAwPT09bih1LHUpP286dm9pZCAwfX0sa2Y9ZnVuY3Rpb24odCxuLGUpe2Zvcih2YXIgcixpLG89KG51bGw9PWU/dC5sZW5ndGg6ZSktKG49bnVsbD09bj8wOituKTtvOylpPU1hdGgucmFuZG9tKCkqby0tfDAscj10W28rbl0sdFtvK25dPXRbaStuXSx0W2krbl09cjtyZXR1cm4gdH0sTmY9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPXQubGVuZ3RoLGk9LTEsbz0wO2lmKG51bGw9PW4pZm9yKDsrK2k8cjspKGU9K3RbaV0pJiYobys9ZSk7ZWxzZSBmb3IoOysraTxyOykoZT0rbih0W2ldLGksdCkpJiYobys9ZSk7cmV0dXJuIG99LFNmPWZ1bmN0aW9uKHQpe2lmKCEoaT10Lmxlbmd0aCkpcmV0dXJuW107Zm9yKHZhciBuPS0xLGU9d2YodCxvKSxyPW5ldyBBcnJheShlKTsrK248ZTspZm9yKHZhciBpLHU9LTEsYT1yW25dPW5ldyBBcnJheShpKTsrK3U8aTspYVt1XT10W3VdW25dO3JldHVybiByfSxFZj1mdW5jdGlvbigpe3JldHVybiBTZihhcmd1bWVudHMpfSxBZj1BcnJheS5wcm90b3R5cGUuc2xpY2UsQ2Y9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHpmPTEsUGY9MixMZj0zLFJmPTQscWY9MWUtNixVZj17dmFsdWU6ZnVuY3Rpb24oKXt9fTtfLnByb3RvdHlwZT12LnByb3RvdHlwZT17Y29uc3RydWN0b3I6XyxvbjpmdW5jdGlvbih0LG4pe3ZhciBlLHI9dGhpcy5fLGk9eSh0KyIiLHIpLG89LTEsdT1pLmxlbmd0aDt7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtpZihudWxsIT1uJiYiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrbik7Zm9yKDsrK288dTspaWYoZT0odD1pW29dKS50eXBlKXJbZV09bShyW2VdLHQubmFtZSxuKTtlbHNlIGlmKG51bGw9PW4pZm9yKGUgaW4gcilyW2VdPW0ocltlXSx0Lm5hbWUsbnVsbCk7cmV0dXJuIHRoaXN9Zm9yKDsrK288dTspaWYoKGU9KHQ9aVtvXSkudHlwZSkmJihlPWcocltlXSx0Lm5hbWUpKSlyZXR1cm4gZX19LGNvcHk6ZnVuY3Rpb24oKXt2YXIgdD17fSxuPXRoaXMuXztmb3IodmFyIGUgaW4gbil0W2VdPW5bZV0uc2xpY2UoKTtyZXR1cm4gbmV3IF8odCl9LGNhbGw6ZnVuY3Rpb24odCxuKXtpZigoZT1hcmd1bWVudHMubGVuZ3RoLTIpPjApZm9yKHZhciBlLHIsaT1uZXcgQXJyYXkoZSksbz0wO288ZTsrK28paVtvXT1hcmd1bWVudHNbbysyXTtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2ZvcihyPXRoaXMuX1t0XSxvPTAsZT1yLmxlbmd0aDtvPGU7KytvKXJbb10udmFsdWUuYXBwbHkobixpKX0sYXBwbHk6ZnVuY3Rpb24odCxuLGUpe2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKHZhciByPXRoaXMuX1t0XSxpPTAsbz1yLmxlbmd0aDtpPG87KytpKXJbaV0udmFsdWUuYXBwbHkobixlKX19O3ZhciBEZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsT2Y9e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHhodG1sOkRmLHhsaW5rOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIix4bWw6Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIn0sRmY9ZnVuY3Rpb24odCl7dmFyIG49dCs9IiIsZT1uLmluZGV4T2YoIjoiKTtyZXR1cm4gZT49MCYmInhtbG5zIiE9PShuPXQuc2xpY2UoMCxlKSkmJih0PXQuc2xpY2UoZSsxKSksT2YuaGFzT3duUHJvcGVydHkobik/e3NwYWNlOk9mW25dLGxvY2FsOnR9OnR9LElmPWZ1bmN0aW9uKHQpe3ZhciBuPUZmKHQpO3JldHVybihuLmxvY2FsP2I6eCkobil9LFlmPTA7TS5wcm90b3R5cGU9dy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk0sZ2V0OmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl87IShuIGluIHQpOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm47cmV0dXJuIHRbbl19LHNldDpmdW5jdGlvbih0LG4pe3JldHVybiB0W3RoaXMuX109bn0scmVtb3ZlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl8gaW4gdCYmZGVsZXRlIHRbdGhpcy5fXX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX07dmFyIEJmPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hdGNoZXModCl9fTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KXt2YXIgSGY9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O2lmKCFIZi5tYXRjaGVzKXt2YXIgamY9SGYud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxIZi5tc01hdGNoZXNTZWxlY3Rvcnx8SGYubW96TWF0Y2hlc1NlbGVjdG9yfHxIZi5vTWF0Y2hlc1NlbGVjdG9yO0JmPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBqZi5jYWxsKHRoaXMsdCl9fX19dmFyIFhmPUJmLCRmPXt9O2lmKHQuZXZlbnQ9bnVsbCwidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KXsib25tb3VzZWVudGVyImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8KCRmPXttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0pfXZhciBWZj1mdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvPU4odCsiIiksdT1vLmxlbmd0aDt7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtmb3IoYT1uP0U6UyxudWxsPT1lJiYoZT0hMSkscj0wO3I8dTsrK3IpdGhpcy5lYWNoKGEob1tyXSxuLGUpKTtyZXR1cm4gdGhpc312YXIgYT10aGlzLm5vZGUoKS5fX29uO2lmKGEpZm9yKHZhciBjLHM9MCxmPWEubGVuZ3RoO3M8ZjsrK3MpZm9yKHI9MCxjPWFbc107cjx1OysrcilpZigoaT1vW3JdKS50eXBlPT09Yy50eXBlJiZpLm5hbWU9PT1jLm5hbWUpcmV0dXJuIGMudmFsdWV9fSxXZj1mdW5jdGlvbigpe2Zvcih2YXIgbixlPXQuZXZlbnQ7bj1lLnNvdXJjZUV2ZW50OyllPW47cmV0dXJuIGV9LFpmPWZ1bmN0aW9uKHQsbil7dmFyIGU9dC5vd25lclNWR0VsZW1lbnR8fHQ7aWYoZS5jcmVhdGVTVkdQb2ludCl7dmFyIHI9ZS5jcmVhdGVTVkdQb2ludCgpO3JldHVybiByLng9bi5jbGllbnRYLHIueT1uLmNsaWVudFkscj1yLm1hdHJpeFRyYW5zZm9ybSh0LmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSksW3IueCxyLnldfXZhciBpPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuW24uY2xpZW50WC1pLmxlZnQtdC5jbGllbnRMZWZ0LG4uY2xpZW50WS1pLnRvcC10LmNsaWVudFRvcF19LEdmPWZ1bmN0aW9uKHQpe3ZhciBuPVdmKCk7cmV0dXJuIG4uY2hhbmdlZFRvdWNoZXMmJihuPW4uY2hhbmdlZFRvdWNoZXNbMF0pLFpmKHQsbil9LEpmPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P0M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHQpfX0sUWY9ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PUpmKHQpKTtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9bi5sZW5ndGgscj1uZXcgQXJyYXkoZSksaT0wO2k8ZTsrK2kpZm9yKHZhciBvLHUsYT1uW2ldLGM9YS5sZW5ndGgscz1yW2ldPW5ldyBBcnJheShjKSxmPTA7ZjxjOysrZikobz1hW2ZdKSYmKHU9dC5jYWxsKG8sby5fX2RhdGFfXyxmLGEpKSYmKCJfX2RhdGFfXyJpbiBvJiYodS5fX2RhdGFfXz1vLl9fZGF0YV9fKSxzW2ZdPXUpO3JldHVybiBuZXcgX3Qocix0aGlzLl9wYXJlbnRzKX0sS2Y9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/ejpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwodCl9fSx0bD1mdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9S2YodCkpO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT1uLmxlbmd0aCxyPVtdLGk9W10sbz0wO288ZTsrK28pZm9yKHZhciB1LGE9bltvXSxjPWEubGVuZ3RoLHM9MDtzPGM7KytzKSh1PWFbc10pJiYoci5wdXNoKHQuY2FsbCh1LHUuX19kYXRhX18scyxhKSksaS5wdXNoKHUpKTtyZXR1cm4gbmV3IF90KHIsaSl9LG5sPWZ1bmN0aW9uKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1YZih0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyx1PW5baV0sYT11Lmxlbmd0aCxjPXJbaV09W10scz0wO3M8YTsrK3MpKG89dVtzXSkmJnQuY2FsbChvLG8uX19kYXRhX18scyx1KSYmYy5wdXNoKG8pO3JldHVybiBuZXcgX3Qocix0aGlzLl9wYXJlbnRzKX0sZWw9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBBcnJheSh0Lmxlbmd0aCl9LHJsPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBfdCh0aGlzLl9lbnRlcnx8dGhpcy5fZ3JvdXBzLm1hcChlbCksdGhpcy5fcGFyZW50cyl9O1AucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpQLGFwcGVuZENoaWxkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsdGhpcy5fbmV4dCl9LGluc2VydEJlZm9yZTpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsbil9LHF1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHQpfSxxdWVyeVNlbGVjdG9yQWxsOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbCh0KX19O3ZhciBpbD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19LG9sPSIkIix1bD1mdW5jdGlvbih0LG4pe2lmKCF0KXJldHVybiBwPW5ldyBBcnJheSh0aGlzLnNpemUoKSkscz0tMSx0aGlzLmVhY2goZnVuY3Rpb24odCl7cFsrK3NdPXR9KSxwO3ZhciBlPW4/UjpMLHI9dGhpcy5fcGFyZW50cyxpPXRoaXMuX2dyb3VwczsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9aWwodCkpO2Zvcih2YXIgbz1pLmxlbmd0aCx1PW5ldyBBcnJheShvKSxhPW5ldyBBcnJheShvKSxjPW5ldyBBcnJheShvKSxzPTA7czxvOysrcyl7dmFyIGY9cltzXSxsPWlbc10saD1sLmxlbmd0aCxwPXQuY2FsbChmLGYmJmYuX19kYXRhX18scyxyKSxkPXAubGVuZ3RoLHY9YVtzXT1uZXcgQXJyYXkoZCksXz11W3NdPW5ldyBBcnJheShkKTtlKGYsbCx2LF8sY1tzXT1uZXcgQXJyYXkoaCkscCxuKTtmb3IodmFyIHksZyxtPTAseD0wO208ZDsrK20paWYoeT12W21dKXtmb3IobT49eCYmKHg9bSsxKTshKGc9X1t4XSkmJisreDxkOyk7eS5fbmV4dD1nfHxudWxsfX1yZXR1cm4gdT1uZXcgX3QodSxyKSx1Ll9lbnRlcj1hLHUuX2V4aXQ9Yyx1fSxhbD1mdW5jdGlvbigpe3JldHVybiBuZXcgX3QodGhpcy5fZXhpdHx8dGhpcy5fZ3JvdXBzLm1hcChlbCksdGhpcy5fcGFyZW50cyl9LGNsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT10Ll9ncm91cHMscj1uLmxlbmd0aCxpPWUubGVuZ3RoLG89TWF0aC5taW4ocixpKSx1PW5ldyBBcnJheShyKSxhPTA7YTxvOysrYSlmb3IodmFyIGMscz1uW2FdLGY9ZVthXSxsPXMubGVuZ3RoLGg9dVthXT1uZXcgQXJyYXkobCkscD0wO3A8bDsrK3ApKGM9c1twXXx8ZltwXSkmJihoW3BdPWMpO2Zvcig7YTxyOysrYSl1W2FdPW5bYV07cmV0dXJuIG5ldyBfdCh1LHRoaXMuX3BhcmVudHMpfSxzbD1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ncm91cHMsbj0tMSxlPXQubGVuZ3RoOysrbjxlOylmb3IodmFyIHIsaT10W25dLG89aS5sZW5ndGgtMSx1PWlbb107LS1vPj0wOykocj1pW29dKSYmKHUmJnUhPT1yLm5leHRTaWJsaW5nJiZ1LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHIsdSksdT1yKTtyZXR1cm4gdGhpc30sZmw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihuLGUpe3JldHVybiBuJiZlP3Qobi5fX2RhdGFfXyxlLl9fZGF0YV9fKTohbi0hZX10fHwodD1xKTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLHI9ZS5sZW5ndGgsaT1uZXcgQXJyYXkociksbz0wO288cjsrK28pe2Zvcih2YXIgdSxhPWVbb10sYz1hLmxlbmd0aCxzPWlbb109bmV3IEFycmF5KGMpLGY9MDtmPGM7KytmKSh1PWFbZl0pJiYoc1tmXT11KTtzLnNvcnQobil9cmV0dXJuIG5ldyBfdChpLHRoaXMuX3BhcmVudHMpLm9yZGVyKCl9LGxsPWZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBhcmd1bWVudHNbMF09dGhpcyx0LmFwcGx5KG51bGwsYXJndW1lbnRzKSx0aGlzfSxobD1mdW5jdGlvbigpe3ZhciB0PW5ldyBBcnJheSh0aGlzLnNpemUoKSksbj0tMTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dFsrK25dPXRoaXN9KSx0fSxwbD1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ncm91cHMsbj0wLGU9dC5sZW5ndGg7bjxlOysrbilmb3IodmFyIHI9dFtuXSxpPTAsbz1yLmxlbmd0aDtpPG87KytpKXt2YXIgdT1yW2ldO2lmKHUpcmV0dXJuIHV9cmV0dXJuIG51bGx9LGRsPWZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Kyt0fSksdH0sdmw9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5ub2RlKCl9LF9sPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT0wLHI9bi5sZW5ndGg7ZTxyOysrZSlmb3IodmFyIGksbz1uW2VdLHU9MCxhPW8ubGVuZ3RoO3U8YTsrK3UpKGk9b1t1XSkmJnQuY2FsbChpLGkuX19kYXRhX18sdSxvKTtyZXR1cm4gdGhpc30seWw9ZnVuY3Rpb24odCxuKXt2YXIgZT1GZih0KTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciByPXRoaXMubm9kZSgpO3JldHVybiBlLmxvY2FsP3IuZ2V0QXR0cmlidXRlTlMoZS5zcGFjZSxlLmxvY2FsKTpyLmdldEF0dHJpYnV0ZShlKX1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1uP2UubG9jYWw/RDpVOiJmdW5jdGlvbiI9PXR5cGVvZiBuP2UubG9jYWw/WTpJOmUubG9jYWw/RjpPKShlLG4pKX0sZ2w9ZnVuY3Rpb24odCl7cmV0dXJuIHQub3duZXJEb2N1bWVudCYmdC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fHx0LmRvY3VtZW50JiZ0fHx0LmRlZmF1bHRWaWV3fSxtbD1mdW5jdGlvbih0LG4sZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PW4/QjoiZnVuY3Rpb24iPT10eXBlb2Ygbj9qOkgpKHQsbixudWxsPT1lPyIiOmUpKTpYKHRoaXMubm9kZSgpLHQpfSx4bD1mdW5jdGlvbih0LG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKChudWxsPT1uPyQ6ImZ1bmN0aW9uIj09dHlwZW9mIG4/VzpWKSh0LG4pKTp0aGlzLm5vZGUoKVt0XX07Si5wcm90b3R5cGU9e2FkZDpmdW5jdGlvbih0KXt0aGlzLl9uYW1lcy5pbmRleE9mKHQpPDAmJih0aGlzLl9uYW1lcy5wdXNoKHQpLHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5fbmFtZXMuam9pbigiICIpKSl9LHJlbW92ZTpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9uYW1lcy5pbmRleE9mKHQpO24+PTAmJih0aGlzLl9uYW1lcy5zcGxpY2UobiwxKSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxjb250YWluczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZih0KT49MH19O3ZhciBibD1mdW5jdGlvbih0LG4pe3ZhciBlPVoodCsiIik7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtmb3IodmFyIHI9Ryh0aGlzLm5vZGUoKSksaT0tMSxvPWUubGVuZ3RoOysraTxvOylpZighci5jb250YWlucyhlW2ldKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4gdGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9ldDpuP3R0Om50KShlLG4pKX0sd2w9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKG51bGw9PXQ/cnQ6KCJmdW5jdGlvbiI9PXR5cGVvZiB0P290Oml0KSh0KSk6dGhpcy5ub2RlKCkudGV4dENvbnRlbnR9LE1sPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT10P3V0OigiZnVuY3Rpb24iPT10eXBlb2YgdD9jdDphdCkodCkpOnRoaXMubm9kZSgpLmlubmVySFRNTH0sVGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKHN0KX0sa2w9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ0KX0sTmw9ZnVuY3Rpb24odCl7dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpJZih0KTtyZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9KX0sU2w9ZnVuY3Rpb24odCxuKXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OklmKHQpLHI9bnVsbD09bj9sdDoiZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkpmKG4pO3JldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpe3JldHVybiB0aGlzLmluc2VydEJlZm9yZShlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8bnVsbCl9KX0sRWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGh0KX0sQWw9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLHQpOnRoaXMubm9kZSgpLl9fZGF0YV9ffSxDbD1mdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBuP3Z0OmR0KSh0LG4pKX0semw9W251bGxdO190LnByb3RvdHlwZT15dC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOl90LHNlbGVjdDpRZixzZWxlY3RBbGw6dGwsZmlsdGVyOm5sLGRhdGE6dWwsZW50ZXI6cmwsZXhpdDphbCxtZXJnZTpjbCxvcmRlcjpzbCxzb3J0OmZsLGNhbGw6bGwsbm9kZXM6aGwsbm9kZTpwbCxzaXplOmRsLGVtcHR5OnZsLGVhY2g6X2wsYXR0cjp5bCxzdHlsZTptbCxwcm9wZXJ0eTp4bCxjbGFzc2VkOmJsLHRleHQ6d2wsaHRtbDpNbCxyYWlzZTpUbCxsb3dlcjprbCxhcHBlbmQ6TmwsaW5zZXJ0OlNsLHJlbW92ZTpFbCxkYXR1bTpBbCxvbjpWZixkaXNwYXRjaDpDbH07dmFyIFBsPWZ1bmN0aW9uKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9uZXcgX3QoW1tkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHQpXV0sW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pOm5ldyBfdChbW3RdXSx6bCl9LExsPWZ1bmN0aW9uKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9uZXcgX3QoW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCldLFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKTpuZXcgX3QoW251bGw9PXQ/W106dF0semwpCn0sUmw9ZnVuY3Rpb24odCxuLGUpe2FyZ3VtZW50cy5sZW5ndGg8MyYmKGU9bixuPVdmKCkuY2hhbmdlZFRvdWNoZXMpO2Zvcih2YXIgcixpPTAsbz1uP24ubGVuZ3RoOjA7aTxvOysraSlpZigocj1uW2ldKS5pZGVudGlmaWVyPT09ZSlyZXR1cm4gWmYodCxyKTtyZXR1cm4gbnVsbH0scWw9ZnVuY3Rpb24odCxuKXtudWxsPT1uJiYobj1XZigpLnRvdWNoZXMpO2Zvcih2YXIgZT0wLHI9bj9uLmxlbmd0aDowLGk9bmV3IEFycmF5KHIpO2U8cjsrK2UpaVtlXT1aZih0LG5bZV0pO3JldHVybiBpfSxVbD1mdW5jdGlvbigpe3QuZXZlbnQucHJldmVudERlZmF1bHQoKSx0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfSxEbD1mdW5jdGlvbih0KXt2YXIgbj10LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxlPVBsKHQpLm9uKCJkcmFnc3RhcnQuZHJhZyIsVWwsITApOyJvbnNlbGVjdHN0YXJ0ImluIG4/ZS5vbigic2VsZWN0c3RhcnQuZHJhZyIsVWwsITApOihuLl9fbm9zZWxlY3Q9bi5zdHlsZS5Nb3pVc2VyU2VsZWN0LG4uc3R5bGUuTW96VXNlclNlbGVjdD0ibm9uZSIpfSxPbD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19O3h0LnByb3RvdHlwZS5vbj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuXy5vbi5hcHBseSh0aGlzLl8sYXJndW1lbnRzKTtyZXR1cm4gdD09PXRoaXMuXz90aGlzOnR9O3ZhciBGbD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odCl7dC5vbigibW91c2Vkb3duLmRyYWciLGUpLm9uKCJ0b3VjaHN0YXJ0LmRyYWciLG8pLm9uKCJ0b3VjaG1vdmUuZHJhZyIsdSkub24oInRvdWNoZW5kLmRyYWcgdG91Y2hjYW5jZWwuZHJhZyIsYSkuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKX1mdW5jdGlvbiBlKCl7aWYoIWgmJnAuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbj1jKCJtb3VzZSIsZC5hcHBseSh0aGlzLGFyZ3VtZW50cyksR2YsdGhpcyxhcmd1bWVudHMpO24mJihQbCh0LmV2ZW50LnZpZXcpLm9uKCJtb3VzZW1vdmUuZHJhZyIsciwhMCkub24oIm1vdXNldXAuZHJhZyIsaSwhMCksRGwodC5ldmVudC52aWV3KSxndCgpLGw9ITEscz10LmV2ZW50LmNsaWVudFgsZj10LmV2ZW50LmNsaWVudFksbigic3RhcnQiKSl9fWZ1bmN0aW9uIHIoKXtpZihVbCgpLCFsKXt2YXIgbj10LmV2ZW50LmNsaWVudFgtcyxlPXQuZXZlbnQuY2xpZW50WS1mO2w9bipuK2UqZT54fXkubW91c2UoImRyYWciKX1mdW5jdGlvbiBpKCl7UGwodC5ldmVudC52aWV3KS5vbigibW91c2Vtb3ZlLmRyYWcgbW91c2V1cC5kcmFnIixudWxsKSxtdCh0LmV2ZW50LnZpZXcsbCksVWwoKSx5Lm1vdXNlKCJlbmQiKX1mdW5jdGlvbiBvKCl7aWYocC5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9ZC5hcHBseSh0aGlzLGFyZ3VtZW50cyksbz1yLmxlbmd0aDtmb3Iobj0wO248bzsrK24pKGU9YyhyW25dLmlkZW50aWZpZXIsaSxSbCx0aGlzLGFyZ3VtZW50cykpJiYoZ3QoKSxlKCJzdGFydCIpKX19ZnVuY3Rpb24gdSgpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9ci5sZW5ndGg7Zm9yKG49MDtuPGk7KytuKShlPXlbcltuXS5pZGVudGlmaWVyXSkmJihVbCgpLGUoImRyYWciKSl9ZnVuY3Rpb24gYSgpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9ci5sZW5ndGg7Zm9yKGgmJmNsZWFyVGltZW91dChoKSxoPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtoPW51bGx9LDUwMCksbj0wO248aTsrK24pKGU9eVtyW25dLmlkZW50aWZpZXJdKSYmKGd0KCksZSgiZW5kIikpfWZ1bmN0aW9uIGMoZSxyLGksbyx1KXt2YXIgYSxjLHMsZj1pKHIsZSksbD1nLmNvcHkoKTtpZihBKG5ldyB4dChuLCJiZWZvcmVzdGFydCIsYSxlLG0sZlswXSxmWzFdLDAsMCxsKSxmdW5jdGlvbigpe3JldHVybiBudWxsIT0odC5ldmVudC5zdWJqZWN0PWE9Xy5hcHBseShvLHUpKSYmKGM9YS54LWZbMF18fDAscz1hLnktZlsxXXx8MCwhMCl9KSlyZXR1cm4gZnVuY3Rpb24gdChoKXt2YXIgcCxkPWY7c3dpdGNoKGgpe2Nhc2Uic3RhcnQiOnlbZV09dCxwPW0rKzticmVhaztjYXNlImVuZCI6ZGVsZXRlIHlbZV0sLS1tO2Nhc2UiZHJhZyI6Zj1pKHIsZSkscD1tfUEobmV3IHh0KG4saCxhLGUscCxmWzBdK2MsZlsxXStzLGZbMF0tZFswXSxmWzFdLWRbMV0sbCksbC5hcHBseSxsLFtoLG8sdV0pfX12YXIgcyxmLGwsaCxwPWJ0LGQ9d3QsXz1NdCx5PXt9LGc9digic3RhcnQiLCJkcmFnIiwiZW5kIiksbT0wLHg9MDtyZXR1cm4gbi5maWx0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpPbCghIXQpLG4pOnB9LG4uY29udGFpbmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6T2wodCksbik6ZH0sbi5zdWJqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhfPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6T2wodCksbik6X30sbi5vbj1mdW5jdGlvbigpe3ZhciB0PWcub24uYXBwbHkoZyxhcmd1bWVudHMpO3JldHVybiB0PT09Zz9uOnR9LG4uY2xpY2tEaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD0odD0rdCkqdCxuKTpNYXRoLnNxcnQoeCl9LG59LElsPWZ1bmN0aW9uKHQsbixlKXt0LnByb3RvdHlwZT1uLnByb3RvdHlwZT1lLGUuY29uc3RydWN0b3I9dH0sWWw9IlxccyooWystXT9cXGQrKVxccyoiLEJsPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLEhsPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIixqbD0vXiMoWzAtOWEtZl17M30pJC8sWGw9L14jKFswLTlhLWZdezZ9KSQvLCRsPW5ldyBSZWdFeHAoIl5yZ2JcXCgiK1tZbCxZbCxZbF0rIlxcKSQiKSxWbD1uZXcgUmVnRXhwKCJecmdiXFwoIitbSGwsSGwsSGxdKyJcXCkkIiksV2w9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tZbCxZbCxZbCxCbF0rIlxcKSQiKSxabD1uZXcgUmVnRXhwKCJecmdiYVxcKCIrW0hsLEhsLEhsLEJsXSsiXFwpJCIpLEdsPW5ldyBSZWdFeHAoIl5oc2xcXCgiK1tCbCxIbCxIbF0rIlxcKSQiKSxKbD1uZXcgUmVnRXhwKCJeaHNsYVxcKCIrW0JsLEhsLEhsLEJsXSsiXFwpJCIpLFFsPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9O0lsKGt0LE50LHtkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkrIiJ9fSksSWwoenQsQ3QsVHQoa3Qse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/MS8uNzpNYXRoLnBvdygxLy43LHQpLG5ldyB6dCh0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8uNzpNYXRoLnBvdyguNyx0KSxuZXcgenQodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PXRoaXMuciYmdGhpcy5yPD0yNTUmJjA8PXRoaXMuZyYmdGhpcy5nPD0yNTUmJjA8PXRoaXMuYiYmdGhpcy5iPD0yNTUmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSx0b1N0cmluZzpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3BhY2l0eTtyZXR1cm4gdD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSksKDE9PT10PyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX19KSksSWwocXQsUnQsVHQoa3Qse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/MS8uNzpNYXRoLnBvdygxLy43LHQpLG5ldyBxdCh0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10Py43Ok1hdGgucG93KC43LHQpLG5ldyBxdCh0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuaCUzNjArMzYwKih0aGlzLmg8MCksbj1pc05hTih0KXx8aXNOYU4odGhpcy5zKT8wOnRoaXMucyxlPXRoaXMubCxyPWUrKGU8LjU/ZToxLWUpKm4saT0yKmUtcjtyZXR1cm4gbmV3IHp0KFV0KHQ+PTI0MD90LTI0MDp0KzEyMCxpLHIpLFV0KHQsaSxyKSxVdCh0PDEyMD90KzI0MDp0LTEyMCxpLHIpLHRoaXMub3BhY2l0eSl9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuKDA8PXRoaXMucyYmdGhpcy5zPD0xfHxpc05hTih0aGlzLnMpKSYmMDw9dGhpcy5sJiZ0aGlzLmw8PTEmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfX0pKTt2YXIgS2w9TWF0aC5QSS8xODAsdGg9MTgwL01hdGguUEksbmg9Ljk1MDQ3LGVoPTEscmg9MS4wODg4MyxpaD00LzI5LG9oPTYvMjksdWg9MypvaCpvaCxhaD1vaCpvaCpvaDtJbChGdCxPdCxUdChrdCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBGdCh0aGlzLmwrMTgqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEZ0KHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMuYSx0aGlzLmIsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9KHRoaXMubCsxNikvMTE2LG49aXNOYU4odGhpcy5hKT90OnQrdGhpcy5hLzUwMCxlPWlzTmFOKHRoaXMuYik/dDp0LXRoaXMuYi8yMDA7cmV0dXJuIHQ9ZWgqWXQodCksbj1uaCpZdChuKSxlPXJoKll0KGUpLG5ldyB6dChCdCgzLjI0MDQ1NDIqbi0xLjUzNzEzODUqdC0uNDk4NTMxNCplKSxCdCgtLjk2OTI2NipuKzEuODc2MDEwOCp0Ky4wNDE1NTYqZSksQnQoLjA1NTY0MzQqbi0uMjA0MDI1OSp0KzEuMDU3MjI1MiplKSx0aGlzLm9wYWNpdHkpfX0pKSxJbCgkdCxYdCxUdChrdCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyAkdCh0aGlzLmgsdGhpcy5jLHRoaXMubCsxOCoobnVsbD09dD8xOnQpLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3ICR0KHRoaXMuaCx0aGlzLmMsdGhpcy5sLTE4KihudWxsPT10PzE6dCksdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7cmV0dXJuIER0KHRoaXMpLnJnYigpfX0pKTt2YXIgY2g9LS4xNDg2MSxzaD0xLjc4Mjc3LGZoPS0uMjkyMjcsbGg9LS45MDY0OSxoaD0xLjk3Mjk0LHBoPWhoKmxoLGRoPWhoKnNoLHZoPXNoKmZoLWxoKmNoO0lsKFp0LFd0LFR0KGt0LHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10PzEvLjc6TWF0aC5wb3coMS8uNyx0KSxuZXcgWnQodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8uNzpNYXRoLnBvdyguNyx0KSxuZXcgWnQodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD1pc05hTih0aGlzLmgpPzA6KHRoaXMuaCsxMjApKktsLG49K3RoaXMubCxlPWlzTmFOKHRoaXMucyk/MDp0aGlzLnMqbiooMS1uKSxyPU1hdGguY29zKHQpLGk9TWF0aC5zaW4odCk7cmV0dXJuIG5ldyB6dCgyNTUqKG4rZSooY2gqcitzaCppKSksMjU1KihuK2UqKGZoKnIrbGgqaSkpLDI1NSoobitlKihoaCpyKSksdGhpcy5vcGFjaXR5KX19KSk7dmFyIF9oLHloLGdoLG1oLHhoLGJoLHdoPWZ1bmN0aW9uKHQpe3ZhciBuPXQubGVuZ3RoLTE7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByPWU8PTA/ZT0wOmU+PTE/KGU9MSxuLTEpOk1hdGguZmxvb3IoZSpuKSxpPXRbcl0sbz10W3IrMV0sdT1yPjA/dFtyLTFdOjIqaS1vLGE9cjxuLTE/dFtyKzJdOjIqby1pO3JldHVybiBHdCgoZS1yL24pKm4sdSxpLG8sYSl9fSxNaD1mdW5jdGlvbih0KXt2YXIgbj10Lmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHI9TWF0aC5mbG9vcigoKGUlPTEpPDA/KytlOmUpKm4pLGk9dFsocituLTEpJW5dLG89dFtyJW5dLHU9dFsocisxKSVuXSxhPXRbKHIrMiklbl07cmV0dXJuIEd0KChlLXIvbikqbixpLG8sdSxhKX19LFRoPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0sa2g9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsbil7dmFyIGU9cigodD1DdCh0KSkuciwobj1DdChuKSkuciksaT1yKHQuZyxuLmcpLG89cih0LmIsbi5iKSx1PW5uKHQub3BhY2l0eSxuLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdC5yPWUobiksdC5nPWkobiksdC5iPW8obiksdC5vcGFjaXR5PXUobiksdCsiIn19dmFyIHI9dG4obik7cmV0dXJuIGUuZ2FtbWE9dCxlfSgxKSxOaD1lbih3aCksU2g9ZW4oTWgpLEVoPWZ1bmN0aW9uKHQsbil7dmFyIGUscj1uP24ubGVuZ3RoOjAsaT10P01hdGgubWluKHIsdC5sZW5ndGgpOjAsbz1uZXcgQXJyYXkociksdT1uZXcgQXJyYXkocik7Zm9yKGU9MDtlPGk7KytlKW9bZV09cWgodFtlXSxuW2VdKTtmb3IoO2U8cjsrK2UpdVtlXT1uW2VdO3JldHVybiBmdW5jdGlvbih0KXtmb3IoZT0wO2U8aTsrK2UpdVtlXT1vW2VdKHQpO3JldHVybiB1fX0sQWg9ZnVuY3Rpb24odCxuKXt2YXIgZT1uZXcgRGF0ZTtyZXR1cm4gdD0rdCxuLT10LGZ1bmN0aW9uKHIpe3JldHVybiBlLnNldFRpbWUodCtuKnIpLGV9fSxDaD1mdW5jdGlvbih0LG4pe3JldHVybiB0PSt0LG4tPXQsZnVuY3Rpb24oZSl7cmV0dXJuIHQrbiplfX0semg9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPXt9LGk9e307bnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdHx8KHQ9e30pLG51bGwhPT1uJiYib2JqZWN0Ij09dHlwZW9mIG58fChuPXt9KTtmb3IoZSBpbiBuKWUgaW4gdD9yW2VdPXFoKHRbZV0sbltlXSk6aVtlXT1uW2VdO3JldHVybiBmdW5jdGlvbih0KXtmb3IoZSBpbiByKWlbZV09cltlXSh0KTtyZXR1cm4gaX19LFBoPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxMaD1uZXcgUmVnRXhwKFBoLnNvdXJjZSwiZyIpLFJoPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpLG89UGgubGFzdEluZGV4PUxoLmxhc3RJbmRleD0wLHU9LTEsYT1bXSxjPVtdO2Zvcih0Kz0iIixuKz0iIjsoZT1QaC5leGVjKHQpKSYmKHI9TGguZXhlYyhuKSk7KShpPXIuaW5kZXgpPm8mJihpPW4uc2xpY2UobyxpKSxhW3VdP2FbdV0rPWk6YVsrK3VdPWkpLChlPWVbMF0pPT09KHI9clswXSk/YVt1XT9hW3VdKz1yOmFbKyt1XT1yOihhWysrdV09bnVsbCxjLnB1c2goe2k6dSx4OkNoKGUscil9KSksbz1MaC5sYXN0SW5kZXg7cmV0dXJuIG88bi5sZW5ndGgmJihpPW4uc2xpY2UobyksYVt1XT9hW3VdKz1pOmFbKyt1XT1pKSxhLmxlbmd0aDwyP2NbMF0/b24oY1swXS54KTpybihuKToobj1jLmxlbmd0aCxmdW5jdGlvbih0KXtmb3IodmFyIGUscj0wO3I8bjsrK3IpYVsoZT1jW3JdKS5pXT1lLngodCk7cmV0dXJuIGEuam9pbigiIil9KX0scWg9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPXR5cGVvZiBuO3JldHVybiBudWxsPT1ufHwiYm9vbGVhbiI9PT1yP1RoKG4pOigibnVtYmVyIj09PXI/Q2g6InN0cmluZyI9PT1yPyhlPU50KG4pKT8obj1lLGtoKTpSaDpuIGluc3RhbmNlb2YgTnQ/a2g6biBpbnN0YW5jZW9mIERhdGU/QWg6QXJyYXkuaXNBcnJheShuKT9FaDoiZnVuY3Rpb24iIT10eXBlb2Ygbi52YWx1ZU9mJiYiZnVuY3Rpb24iIT10eXBlb2Ygbi50b1N0cmluZ3x8aXNOYU4obik/emg6Q2gpKHQsbil9LFVoPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHQ9K3Qsbi09dCxmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5yb3VuZCh0K24qZSl9fSxEaD0xODAvTWF0aC5QSSxPaD17dHJhbnNsYXRlWDowLHRyYW5zbGF0ZVk6MCxyb3RhdGU6MCxza2V3WDowLHNjYWxlWDoxLHNjYWxlWToxfSxGaD1mdW5jdGlvbih0LG4sZSxyLGksbyl7dmFyIHUsYSxjO3JldHVybih1PU1hdGguc3FydCh0KnQrbipuKSkmJih0Lz11LG4vPXUpLChjPXQqZStuKnIpJiYoZS09dCpjLHItPW4qYyksKGE9TWF0aC5zcXJ0KGUqZStyKnIpKSYmKGUvPWEsci89YSxjLz1hKSx0KnI8biplJiYodD0tdCxuPS1uLGM9LWMsdT0tdSkse3RyYW5zbGF0ZVg6aSx0cmFuc2xhdGVZOm8scm90YXRlOk1hdGguYXRhbjIobix0KSpEaCxza2V3WDpNYXRoLmF0YW4oYykqRGgsc2NhbGVYOnUsc2NhbGVZOmF9fSxJaD1jbih1biwicHgsICIsInB4KSIsImRlZykiKSxZaD1jbihhbiwiLCAiLCIpIiwiKSIpLEJoPU1hdGguU1FSVDIsSGg9ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk9dFswXSxvPXRbMV0sdT10WzJdLGE9blswXSxjPW5bMV0scz1uWzJdLGY9YS1pLGw9Yy1vLGg9ZipmK2wqbDtpZihoPDFlLTEyKXI9TWF0aC5sb2cocy91KS9CaCxlPWZ1bmN0aW9uKHQpe3JldHVybltpK3QqZixvK3QqbCx1Kk1hdGguZXhwKEJoKnQqcildfTtlbHNle3ZhciBwPU1hdGguc3FydChoKSxkPShzKnMtdSp1KzQqaCkvKDIqdSoyKnApLHY9KHMqcy11KnUtNCpoKS8oMipzKjIqcCksXz1NYXRoLmxvZyhNYXRoLnNxcnQoZCpkKzEpLWQpLHk9TWF0aC5sb2coTWF0aC5zcXJ0KHYqdisxKS12KTtyPSh5LV8pL0JoLGU9ZnVuY3Rpb24odCl7dmFyIG49dCpyLGU9c24oXyksYT11LygyKnApKihlKmxuKEJoKm4rXyktZm4oXykpO3JldHVybltpK2EqZixvK2EqbCx1KmUvc24oQmgqbitfKV19fXJldHVybiBlLmR1cmF0aW9uPTFlMypyLGV9LGpoPWhuKEt0KSxYaD1obihubiksJGg9ZG4oS3QpLFZoPWRuKG5uKSxXaD12bihLdCksWmg9dm4obm4pLEdoPWZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPW5ldyBBcnJheShuKSxyPTA7cjxuOysrcillW3JdPXQoci8obi0xKSk7cmV0dXJuIGV9LEpoPTAsUWg9MCxLaD0wLHRwPTFlMyxucD0wLGVwPTAscnA9MCxpcD0ib2JqZWN0Ij09dHlwZW9mIHBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2U6RGF0ZSxvcD0iZnVuY3Rpb24iPT10eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lP3JlcXVlc3RBbmltYXRpb25GcmFtZTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHQsMTcpfTtnbi5wcm90b3R5cGU9bW4ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpnbixyZXN0YXJ0OmZ1bmN0aW9uKHQsbixlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbiIpO2U9KG51bGw9PWU/X24oKTorZSkrKG51bGw9PW4/MDorbiksdGhpcy5fbmV4dHx8Ymg9PT10aGlzfHwoYmg/YmguX25leHQ9dGhpczp4aD10aGlzLGJoPXRoaXMpLHRoaXMuX2NhbGw9dCx0aGlzLl90aW1lPWUsVG4oKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuX2NhbGwmJih0aGlzLl9jYWxsPW51bGwsdGhpcy5fdGltZT0xLzAsVG4oKSl9fTt2YXIgdXA9ZnVuY3Rpb24odCxuLGUpe3ZhciByPW5ldyBnbjtyZXR1cm4gbj1udWxsPT1uPzA6K24sci5yZXN0YXJ0KGZ1bmN0aW9uKGUpe3Iuc3RvcCgpLHQoZStuKX0sbixlKSxyfSxhcD1mdW5jdGlvbih0LG4sZSl7dmFyIHI9bmV3IGduLGk9bjtyZXR1cm4gbnVsbD09bj8oci5yZXN0YXJ0KHQsbixlKSxyKToobj0rbixlPW51bGw9PWU/X24oKTorZSxyLnJlc3RhcnQoZnVuY3Rpb24gbyh1KXt1Kz1pLHIucmVzdGFydChvLGkrPW4sZSksdCh1KX0sbixlKSxyKX0sY3A9digic3RhcnQiLCJlbmQiLCJpbnRlcnJ1cHQiKSxzcD1bXSxmcD0wLGxwPTEsaHA9MixwcD0zLGRwPTQsdnA9NSxfcD02LHlwPWZ1bmN0aW9uKHQsbixlLHIsaSxvKXt2YXIgdT10Ll9fdHJhbnNpdGlvbjtpZih1KXtpZihlIGluIHUpcmV0dXJufWVsc2UgdC5fX3RyYW5zaXRpb249e307RW4odCxlLHtuYW1lOm4saW5kZXg6cixncm91cDppLG9uOmNwLHR3ZWVuOnNwLHRpbWU6by50aW1lLGRlbGF5Om8uZGVsYXksZHVyYXRpb246by5kdXJhdGlvbixlYXNlOm8uZWFzZSx0aW1lcjpudWxsLHN0YXRlOmZwfSl9LGdwPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpLG89dC5fX3RyYW5zaXRpb24sdT0hMDtpZihvKXtuPW51bGw9PW4/bnVsbDpuKyIiO2ZvcihpIGluIG8pKGU9b1tpXSkubmFtZT09PW4/KHI9ZS5zdGF0ZT5ocCYmZS5zdGF0ZTx2cCxlLnN0YXRlPV9wLGUudGltZXIuc3RvcCgpLHImJmUub24uY2FsbCgiaW50ZXJydXB0Iix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSxkZWxldGUgb1tpXSk6dT0hMTt1JiZkZWxldGUgdC5fX3RyYW5zaXRpb259fSxtcD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Z3AodGhpcyx0KX0pfSx4cD1mdW5jdGlvbih0LG4pe3ZhciBlPXRoaXMuX2lkO2lmKHQrPSIiLGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHZhciByLGk9U24odGhpcy5ub2RlKCksZSkudHdlZW4sbz0wLHU9aS5sZW5ndGg7bzx1OysrbylpZigocj1pW29dKS5uYW1lPT09dClyZXR1cm4gci52YWx1ZTtyZXR1cm4gbnVsbH1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1uP0FuOkNuKShlLHQsbikpfSxicD1mdW5jdGlvbih0LG4pe3ZhciBlO3JldHVybigibnVtYmVyIj09dHlwZW9mIG4/Q2g6biBpbnN0YW5jZW9mIE50P2toOihlPU50KG4pKT8obj1lLGtoKTpSaCkodCxuKX0sd3A9ZnVuY3Rpb24odCxuKXt2YXIgZT1GZih0KSxyPSJ0cmFuc2Zvcm0iPT09ZT9ZaDpicDtyZXR1cm4gdGhpcy5hdHRyVHdlZW4odCwiZnVuY3Rpb24iPT10eXBlb2Ygbj8oZS5sb2NhbD9EbjpVbikoZSxyLHpuKHRoaXMsImF0dHIuIit0LG4pKTpudWxsPT1uPyhlLmxvY2FsP0xuOlBuKShlKTooZS5sb2NhbD9xbjpSbikoZSxyLG4rIiIpKX0sTXA9ZnVuY3Rpb24odCxuKXt2YXIgZT0iYXR0ci4iK3Q7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXJldHVybihlPXRoaXMudHdlZW4oZSkpJiZlLl92YWx1ZTtpZihudWxsPT1uKXJldHVybiB0aGlzLnR3ZWVuKGUsbnVsbCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEVycm9yO3ZhciByPUZmKHQpO3JldHVybiB0aGlzLnR3ZWVuKGUsKHIubG9jYWw/T246Rm4pKHIsbikpfSxUcD1mdW5jdGlvbih0KXt2YXIgbj10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiB0P0luOlluKShuLHQpKTpTbih0aGlzLm5vZGUoKSxuKS5kZWxheX0sa3A9ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9CbjpIbikobix0KSk6U24odGhpcy5ub2RlKCksbikuZHVyYXRpb259LE5wPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChqbihuLHQpKTpTbih0aGlzLm5vZGUoKSxuKS5lYXNlfSxTcD1mdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9WGYodCkpO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT1uLmxlbmd0aCxyPW5ldyBBcnJheShlKSxpPTA7aTxlOysraSlmb3IodmFyIG8sdT1uW2ldLGE9dS5sZW5ndGgsYz1yW2ldPVtdLHM9MDtzPGE7KytzKShvPXVbc10pJiZ0LmNhbGwobyxvLl9fZGF0YV9fLHMsdSkmJmMucHVzaChvKTtyZXR1cm4gbmV3IG5lKHIsdGhpcy5fcGFyZW50cyx0aGlzLl9uYW1lLHRoaXMuX2lkKX0sRXA9ZnVuY3Rpb24odCl7aWYodC5faWQhPT10aGlzLl9pZCl0aHJvdyBuZXcgRXJyb3I7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPXQuX2dyb3VwcyxyPW4ubGVuZ3RoLGk9ZS5sZW5ndGgsbz1NYXRoLm1pbihyLGkpLHU9bmV3IEFycmF5KHIpLGE9MDthPG87KythKWZvcih2YXIgYyxzPW5bYV0sZj1lW2FdLGw9cy5sZW5ndGgsaD11W2FdPW5ldyBBcnJheShsKSxwPTA7cDxsOysrcCkoYz1zW3BdfHxmW3BdKSYmKGhbcF09Yyk7Zm9yKDthPHI7KythKXVbYV09blthXTtyZXR1cm4gbmV3IG5lKHUsdGhpcy5fcGFyZW50cyx0aGlzLl9uYW1lLHRoaXMuX2lkKX0sQXA9ZnVuY3Rpb24odCxuKXt2YXIgZT10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP1NuKHRoaXMubm9kZSgpLGUpLm9uLm9uKHQpOnRoaXMuZWFjaCgkbihlLHQsbikpfSxDcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9uKCJlbmQucmVtb3ZlIixWbih0aGlzLl9pZCkpfSx6cD1mdW5jdGlvbih0KXt2YXIgbj10aGlzLl9uYW1lLGU9dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PUpmKHQpKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz1uZXcgQXJyYXkoaSksdT0wO3U8aTsrK3UpZm9yKHZhciBhLGMscz1yW3VdLGY9cy5sZW5ndGgsbD1vW3VdPW5ldyBBcnJheShmKSxoPTA7aDxmOysraCkoYT1zW2hdKSYmKGM9dC5jYWxsKGEsYS5fX2RhdGFfXyxoLHMpKSYmKCJfX2RhdGFfXyJpbiBhJiYoYy5fX2RhdGFfXz1hLl9fZGF0YV9fKSxsW2hdPWMseXAobFtoXSxuLGUsaCxsLFNuKGEsZSkpKTtyZXR1cm4gbmV3IG5lKG8sdGhpcy5fcGFyZW50cyxuLGUpfSxQcD1mdW5jdGlvbih0KXt2YXIgbj10aGlzLl9uYW1lLGU9dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PUtmKHQpKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz1bXSx1PVtdLGE9MDthPGk7KythKWZvcih2YXIgYyxzPXJbYV0sZj1zLmxlbmd0aCxsPTA7bDxmOysrbClpZihjPXNbbF0pe2Zvcih2YXIgaCxwPXQuY2FsbChjLGMuX19kYXRhX18sbCxzKSxkPVNuKGMsZSksdj0wLF89cC5sZW5ndGg7djxfOysrdikoaD1wW3ZdKSYmeXAoaCxuLGUsdixwLGQpO28ucHVzaChwKSx1LnB1c2goYyl9cmV0dXJuIG5ldyBuZShvLHUsbixlKX0sTHA9eXQucHJvdG90eXBlLmNvbnN0cnVjdG9yLFJwPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBMcCh0aGlzLl9ncm91cHMsdGhpcy5fcGFyZW50cyl9LHFwPWZ1bmN0aW9uKHQsbixlKXt2YXIgcj0idHJhbnNmb3JtIj09KHQrPSIiKT9JaDpicDtyZXR1cm4gbnVsbD09bj90aGlzLnN0eWxlVHdlZW4odCxXbih0LHIpKS5vbigiZW5kLnN0eWxlLiIrdCxabih0KSk6dGhpcy5zdHlsZVR3ZWVuKHQsImZ1bmN0aW9uIj09dHlwZW9mIG4/Sm4odCxyLHpuKHRoaXMsInN0eWxlLiIrdCxuKSk6R24odCxyLG4rIiIpLGUpfSxVcD1mdW5jdGlvbih0LG4sZSl7dmFyIHI9InN0eWxlLiIrKHQrPSIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKHI9dGhpcy50d2VlbihyKSkmJnIuX3ZhbHVlO2lmKG51bGw9PW4pcmV0dXJuIHRoaXMudHdlZW4ocixudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHRoaXMudHdlZW4ocixRbih0LG4sbnVsbD09ZT8iIjplKSl9LERwPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnR3ZWVuKCJ0ZXh0IiwiZnVuY3Rpb24iPT10eXBlb2YgdD90ZSh6bih0aGlzLCJ0ZXh0Iix0KSk6S24obnVsbD09dD8iIjp0KyIiKSl9LE9wPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX25hbWUsbj10aGlzLl9pZCxlPXJlKCkscj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPTA7bzxpOysrbylmb3IodmFyIHUsYT1yW29dLGM9YS5sZW5ndGgscz0wO3M8YzsrK3MpaWYodT1hW3NdKXt2YXIgZj1Tbih1LG4pO3lwKHUsdCxlLHMsYSx7dGltZTpmLnRpbWUrZi5kZWxheStmLmR1cmF0aW9uLGRlbGF5OjAsZHVyYXRpb246Zi5kdXJhdGlvbixlYXNlOmYuZWFzZX0pfXJldHVybiBuZXcgbmUocix0aGlzLl9wYXJlbnRzLHQsZSl9LEZwPTAsSXA9eXQucHJvdG90eXBlO25lLnByb3RvdHlwZT1lZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOm5lLHNlbGVjdDp6cCxzZWxlY3RBbGw6UHAsZmlsdGVyOlNwLG1lcmdlOkVwLHNlbGVjdGlvbjpScCx0cmFuc2l0aW9uOk9wLGNhbGw6SXAuY2FsbCxub2RlczpJcC5ub2Rlcyxub2RlOklwLm5vZGUsc2l6ZTpJcC5zaXplLGVtcHR5OklwLmVtcHR5LGVhY2g6SXAuZWFjaCxvbjpBcCxhdHRyOndwLGF0dHJUd2VlbjpNcCxzdHlsZTpxcCxzdHlsZVR3ZWVuOlVwLHRleHQ6RHAscmVtb3ZlOkNwLHR3ZWVuOnhwLGRlbGF5OlRwLGR1cmF0aW9uOmtwLGVhc2U6TnB9O3ZhciBZcD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIE1hdGgucG93KHQsbil9cmV0dXJuIG49K24sZS5leHBvbmVudD10LGV9KDMpLEJwPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gMS1NYXRoLnBvdygxLXQsbil9cmV0dXJuIG49K24sZS5leHBvbmVudD10LGV9KDMpLEhwPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4oKHQqPTIpPD0xP01hdGgucG93KHQsbik6Mi1NYXRoLnBvdygyLXQsbikpLzJ9cmV0dXJuIG49K24sZS5leHBvbmVudD10LGV9KDMpLGpwPU1hdGguUEksWHA9anAvMiwkcD00LzExLFZwPTYvMTEsV3A9OC8xMSxacD0uNzUsR3A9OS8xMSxKcD0xMC8xMSxRcD0uOTM3NSxLcD0yMS8yMix0ZD02My82NCxuZD0xLyRwLyRwLGVkPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdCp0KigobisxKSp0LW4pfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oMS43MDE1OCkscmQ9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybi0tdCp0KigobisxKSp0K24pKzF9cmV0dXJuIG49K24sZS5vdmVyc2hvb3Q9dCxlfSgxLjcwMTU4KSxpZD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuKCh0Kj0yKTwxP3QqdCooKG4rMSkqdC1uKToodC09MikqdCooKG4rMSkqdCtuKSsyKS8yfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oMS43MDE1OCksb2Q9MipNYXRoLlBJLHVkPWZ1bmN0aW9uIHQobixlKXtmdW5jdGlvbiByKHQpe3JldHVybiBuKk1hdGgucG93KDIsMTAqLS10KSpNYXRoLnNpbigoaS10KS9lKX12YXIgaT1NYXRoLmFzaW4oMS8obj1NYXRoLm1heCgxLG4pKSkqKGUvPW9kKTtyZXR1cm4gci5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKm9kKX0sci5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0scn0oMSwuMyksYWQ9ZnVuY3Rpb24gdChuLGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIDEtbipNYXRoLnBvdygyLC0xMCoodD0rdCkpKk1hdGguc2luKCh0K2kpL2UpfXZhciBpPU1hdGguYXNpbigxLyhuPU1hdGgubWF4KDEsbikpKSooZS89b2QpO3JldHVybiByLmFtcGxpdHVkZT1mdW5jdGlvbihuKXtyZXR1cm4gdChuLGUqb2QpfSxyLnBlcmlvZD1mdW5jdGlvbihlKXtyZXR1cm4gdChuLGUpfSxyfSgxLC4zKSxjZD1mdW5jdGlvbiB0KG4sZSl7ZnVuY3Rpb24gcih0KXtyZXR1cm4oKHQ9Mip0LTEpPDA/bipNYXRoLnBvdygyLDEwKnQpKk1hdGguc2luKChpLXQpL2UpOjItbipNYXRoLnBvdygyLC0xMCp0KSpNYXRoLnNpbigoaSt0KS9lKSkvMn12YXIgaT1NYXRoLmFzaW4oMS8obj1NYXRoLm1heCgxLG4pKSkqKGUvPW9kKTtyZXR1cm4gci5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKm9kKX0sci5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0scn0oMSwuMyksc2Q9e3RpbWU6bnVsbCxkZWxheTowLGR1cmF0aW9uOjI1MCxlYXNlOmZlfSxmZD1mdW5jdGlvbih0KXt2YXIgbixlO3QgaW5zdGFuY2VvZiBuZT8obj10Ll9pZCx0PXQuX25hbWUpOihuPXJlKCksKGU9c2QpLnRpbWU9X24oKSx0PW51bGw9PXQ/bnVsbDp0KyIiKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz0wO288aTsrK28pZm9yKHZhciB1LGE9cltvXSxjPWEubGVuZ3RoLHM9MDtzPGM7KytzKSh1PWFbc10pJiZ5cCh1LHQsbixzLGEsZXx8TWUodSxuKSk7cmV0dXJuIG5ldyBuZShyLHRoaXMuX3BhcmVudHMsdCxuKX07eXQucHJvdG90eXBlLmludGVycnVwdD1tcCx5dC5wcm90b3R5cGUudHJhbnNpdGlvbj1mZDt2YXIgbGQ9W251bGxdLGhkPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXQuX190cmFuc2l0aW9uO2lmKGkpe249bnVsbD09bj9udWxsOm4rIiI7Zm9yKHIgaW4gaSlpZigoZT1pW3JdKS5zdGF0ZT5scCYmZS5uYW1lPT09bilyZXR1cm4gbmV3IG5lKFtbdF1dLGxkLG4sK3IpfXJldHVybiBudWxsfSxwZD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19LGRkPWZ1bmN0aW9uKHQsbixlKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1uLHRoaXMuc2VsZWN0aW9uPWV9LHZkPWZ1bmN0aW9uKCl7dC5ldmVudC5wcmV2ZW50RGVmYXVsdCgpLHQuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9LF9kPXtuYW1lOiJkcmFnIn0seWQ9e25hbWU6InNwYWNlIn0sZ2Q9e25hbWU6ImhhbmRsZSJ9LG1kPXtuYW1lOiJjZW50ZXIifSx4ZD17bmFtZToieCIsaGFuZGxlczpbImUiLCJ3Il0ubWFwKGtlKSxpbnB1dDpmdW5jdGlvbih0LG4pe3JldHVybiB0JiZbW3RbMF0sblswXVsxXV0sW3RbMV0sblsxXVsxXV1dfSxvdXRwdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlt0WzBdWzBdLHRbMV1bMF1dfX0sYmQ9e25hbWU6InkiLGhhbmRsZXM6WyJuIiwicyJdLm1hcChrZSksaW5wdXQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdCYmW1tuWzBdWzBdLHRbMF1dLFtuWzFdWzBdLHRbMV1dXX0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZbdFswXVsxXSx0WzFdWzFdXX19LHdkPXtuYW1lOiJ4eSIsaGFuZGxlczpbIm4iLCJlIiwicyIsInciLCJudyIsIm5lIiwic2UiLCJzdyJdLm1hcChrZSksaW5wdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHR9LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdH19LE1kPXtvdmVybGF5OiJjcm9zc2hhaXIiLHNlbGVjdGlvbjoibW92ZSIsbjoibnMtcmVzaXplIixlOiJldy1yZXNpemUiLHM6Im5zLXJlc2l6ZSIsdzoiZXctcmVzaXplIixudzoibndzZS1yZXNpemUiLG5lOiJuZXN3LXJlc2l6ZSIsc2U6Im53c2UtcmVzaXplIixzdzoibmVzdy1yZXNpemUifSxUZD17ZToidyIsdzoiZSIsbnc6Im5lIixuZToibnciLHNlOiJzdyIsc3c6InNlIn0sa2Q9e246InMiLHM6Im4iLG53OiJzdyIsbmU6InNlIixzZToibmUiLHN3OiJudyJ9LE5kPXtvdmVybGF5OjEsc2VsZWN0aW9uOjEsbjpudWxsLGU6MSxzOm51bGwsdzotMSxudzotMSxuZToxLHNlOjEsc3c6LTF9LFNkPXtvdmVybGF5OjEsc2VsZWN0aW9uOjEsbjotMSxlOm51bGwsczoxLHc6bnVsbCxudzotMSxuZTotMSxzZToxLHN3OjF9LEVkPWZ1bmN0aW9uKCl7cmV0dXJuIExlKHdkKX0sQWQ9TWF0aC5jb3MsQ2Q9TWF0aC5zaW4semQ9TWF0aC5QSSxQZD16ZC8yLExkPTIqemQsUmQ9TWF0aC5tYXgscWQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBvLHUsYSxjLHMsZixsPXQubGVuZ3RoLGg9W10scD1jZihsKSxkPVtdLHY9W10sXz12Lmdyb3Vwcz1uZXcgQXJyYXkobCkseT1uZXcgQXJyYXkobCpsKTtmb3Iobz0wLHM9LTE7KytzPGw7KXtmb3IodT0wLGY9LTE7KytmPGw7KXUrPXRbc11bZl07aC5wdXNoKHUpLGQucHVzaChjZihsKSksbys9dX1mb3IoZSYmcC5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUoaFt0XSxoW25dKX0pLHImJmQuZm9yRWFjaChmdW5jdGlvbihuLGUpe24uc29ydChmdW5jdGlvbihuLGkpe3JldHVybiByKHRbZV1bbl0sdFtlXVtpXSl9KX0pLG89UmQoMCxMZC1uKmwpL28sYz1vP246TGQvbCx1PTAscz0tMTsrK3M8bDspe2ZvcihhPXUsZj0tMTsrK2Y8bDspe3ZhciBnPXBbc10sbT1kW2ddW2ZdLHg9dFtnXVttXSxiPXUsdz11Kz14Km87eVttKmwrZ109e2luZGV4Omcsc3ViaW5kZXg6bSxzdGFydEFuZ2xlOmIsZW5kQW5nbGU6dyx2YWx1ZTp4fX1fW2ddPXtpbmRleDpnLHN0YXJ0QW5nbGU6YSxlbmRBbmdsZTp1LHZhbHVlOmhbZ119LHUrPWN9Zm9yKHM9LTE7KytzPGw7KWZvcihmPXMtMTsrK2Y8bDspe3ZhciBNPXlbZipsK3NdLFQ9eVtzKmwrZl07KE0udmFsdWV8fFQudmFsdWUpJiZ2LnB1c2goTS52YWx1ZTxULnZhbHVlP3tzb3VyY2U6VCx0YXJnZXQ6TX06e3NvdXJjZTpNLHRhcmdldDpUfSl9cmV0dXJuIGk/di5zb3J0KGkpOnZ9dmFyIG49MCxlPW51bGwscj1udWxsLGk9bnVsbDtyZXR1cm4gdC5wYWRBbmdsZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1SZCgwLGUpLHQpOm59LHQuc29ydEdyb3Vwcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHQpOmV9LHQuc29ydFN1Ymdyb3Vwcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1uLHQpOnJ9LHQuc29ydENob3Jkcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09bj9pPW51bGw6KGk9UmUobikpLl89bix0KTppJiZpLl99LHR9LFVkPUFycmF5LnByb3RvdHlwZS5zbGljZSxEZD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19LE9kPU1hdGguUEksRmQ9MipPZCxJZD1GZC0xZS02O3FlLnByb3RvdHlwZT1VZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnFlLG1vdmVUbzpmdW5jdGlvbih0LG4pe3RoaXMuXys9Ik0iKyh0aGlzLl94MD10aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MD10aGlzLl95MT0rbil9LGNsb3NlUGF0aDpmdW5jdGlvbigpe251bGwhPT10aGlzLl94MSYmKHRoaXMuX3gxPXRoaXMuX3gwLHRoaXMuX3kxPXRoaXMuX3kwLHRoaXMuXys9IloiKX0sbGluZVRvOmZ1bmN0aW9uKHQsbil7dGhpcy5fKz0iTCIrKHRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kxPStuKX0scXVhZHJhdGljQ3VydmVUbzpmdW5jdGlvbih0LG4sZSxyKXt0aGlzLl8rPSJRIisgK3QrIiwiKyArbisiLCIrKHRoaXMuX3gxPStlKSsiLCIrKHRoaXMuX3kxPStyKX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbih0LG4sZSxyLGksbyl7dGhpcy5fKz0iQyIrICt0KyIsIisgK24rIiwiKyArZSsiLCIrICtyKyIsIisodGhpcy5feDE9K2kpKyIsIisodGhpcy5feTE9K28pfSxhcmNUbzpmdW5jdGlvbih0LG4sZSxyLGkpe3Q9K3Qsbj0rbixlPStlLHI9K3IsaT0raTt2YXIgbz10aGlzLl94MSx1PXRoaXMuX3kxLGE9ZS10LGM9ci1uLHM9by10LGY9dS1uLGw9cypzK2YqZjtpZihpPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXM6ICIraSk7aWYobnVsbD09PXRoaXMuX3gxKXRoaXMuXys9Ik0iKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPW4pO2Vsc2UgaWYobD4xZS02KWlmKE1hdGguYWJzKGYqYS1jKnMpPjFlLTYmJmkpe3ZhciBoPWUtbyxwPXItdSxkPWEqYStjKmMsdj1oKmgrcCpwLF89TWF0aC5zcXJ0KGQpLHk9TWF0aC5zcXJ0KGwpLGc9aSpNYXRoLnRhbigoT2QtTWF0aC5hY29zKChkK2wtdikvKDIqXyp5KSkpLzIpLG09Zy95LHg9Zy9fO01hdGguYWJzKG0tMSk+MWUtNiYmKHRoaXMuXys9IkwiKyh0K20qcykrIiwiKyhuK20qZikpLHRoaXMuXys9IkEiK2krIiwiK2krIiwwLDAsIisgKyhmKmg+cypwKSsiLCIrKHRoaXMuX3gxPXQreCphKSsiLCIrKHRoaXMuX3kxPW4reCpjKX1lbHNlIHRoaXMuXys9IkwiKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPW4pO2Vsc2U7fSxhcmM6ZnVuY3Rpb24odCxuLGUscixpLG8pe3Q9K3Qsbj0rbixlPStlO3ZhciB1PWUqTWF0aC5jb3MociksYT1lKk1hdGguc2luKHIpLGM9dCt1LHM9bithLGY9MV5vLGw9bz9yLWk6aS1yO2lmKGU8MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIitlKTtudWxsPT09dGhpcy5feDE/dGhpcy5fKz0iTSIrYysiLCIrczooTWF0aC5hYnModGhpcy5feDEtYyk+MWUtNnx8TWF0aC5hYnModGhpcy5feTEtcyk+MWUtNikmJih0aGlzLl8rPSJMIitjKyIsIitzKSxlJiYobDwwJiYobD1sJUZkK0ZkKSxsPklkP3RoaXMuXys9IkEiK2UrIiwiK2UrIiwwLDEsIitmKyIsIisodC11KSsiLCIrKG4tYSkrIkEiK2UrIiwiK2UrIiwwLDEsIitmKyIsIisodGhpcy5feDE9YykrIiwiKyh0aGlzLl95MT1zKTpsPjFlLTYmJih0aGlzLl8rPSJBIitlKyIsIitlKyIsMCwiKyArKGw+PU9kKSsiLCIrZisiLCIrKHRoaXMuX3gxPXQrZSpNYXRoLmNvcyhpKSkrIiwiKyh0aGlzLl95MT1uK2UqTWF0aC5zaW4oaSkpKSl9LHJlY3Q6ZnVuY3Rpb24odCxuLGUscil7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPStuKSsiaCIrICtlKyJ2IisgK3IrImgiKy1lKyJaIn0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX07dmFyIFlkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciB0LGE9VWQuY2FsbChhcmd1bWVudHMpLGM9bi5hcHBseSh0aGlzLGEpLHM9ZS5hcHBseSh0aGlzLGEpLGY9K3IuYXBwbHkodGhpcywoYVswXT1jLGEpKSxsPWkuYXBwbHkodGhpcyxhKS1QZCxoPW8uYXBwbHkodGhpcyxhKS1QZCxwPWYqQWQobCksZD1mKkNkKGwpLHY9K3IuYXBwbHkodGhpcywoYVswXT1zLGEpKSxfPWkuYXBwbHkodGhpcyxhKS1QZCx5PW8uYXBwbHkodGhpcyxhKS1QZDtpZih1fHwodT10PVVlKCkpLHUubW92ZVRvKHAsZCksdS5hcmMoMCwwLGYsbCxoKSxsPT09XyYmaD09PXl8fCh1LnF1YWRyYXRpY0N1cnZlVG8oMCwwLHYqQWQoXyksdipDZChfKSksdS5hcmMoMCwwLHYsXyx5KSksdS5xdWFkcmF0aWNDdXJ2ZVRvKDAsMCxwLGQpLHUuY2xvc2VQYXRoKCksdClyZXR1cm4gdT1udWxsLHQrIiJ8fG51bGx9dmFyIG49RGUsZT1PZSxyPUZlLGk9SWUsbz1ZZSx1PW51bGw7cmV0dXJuIHQucmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246RGQoK24pLHQpOnJ9LHQuc3RhcnRBbmdsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkRkKCtuKSx0KTppfSx0LmVuZEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246RGQoK24pLHQpOm99LHQuc291cmNlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWUsdCk6bn0sdC50YXJnZXQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix0KTplfSx0LmNvbnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bnVsbD09bj9udWxsOm4sdCk6dX0sdH07QmUucHJvdG90eXBlPUhlLnByb3RvdHlwZT17Y29uc3RydWN0b3I6QmUsaGFzOmZ1bmN0aW9uKHQpe3JldHVybiIkIit0IGluIHRoaXN9LGdldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpc1siJCIrdF19LHNldDpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzWyIkIit0XT1uLHRoaXN9LHJlbW92ZTpmdW5jdGlvbih0KXt2YXIgbj0iJCIrdDtyZXR1cm4gbiBpbiB0aGlzJiZkZWxldGUgdGhpc1tuXX0sY2xlYXI6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcykiJCI9PT10WzBdJiZkZWxldGUgdGhpc1t0XX0sa2V5czpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiB0aGlzKSIkIj09PW5bMF0mJnQucHVzaChuLnNsaWNlKDEpKTtyZXR1cm4gdH0sdmFsdWVzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBuIGluIHRoaXMpIiQiPT09blswXSYmdC5wdXNoKHRoaXNbbl0pO3JldHVybiB0fSxlbnRyaWVzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBuIGluIHRoaXMpIiQiPT09blswXSYmdC5wdXNoKHtrZXk6bi5zbGljZSgxKSx2YWx1ZTp0aGlzW25dfSk7cmV0dXJuIHR9LHNpemU6ZnVuY3Rpb24oKXt2YXIgdD0wO2Zvcih2YXIgbiBpbiB0aGlzKSIkIj09PW5bMF0mJisrdDtyZXR1cm4gdH0sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcylpZigiJCI9PT10WzBdKXJldHVybiExO3JldHVybiEwfSxlYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbiBpbiB0aGlzKSIkIj09PW5bMF0mJnQodGhpc1tuXSxuLnNsaWNlKDEpLHRoaXMpfX07dmFyIEJkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChuLGksdSxhKXtpZihpPj1vLmxlbmd0aClyZXR1cm4gbnVsbCE9cj9yKG4pOm51bGwhPWU/bi5zb3J0KGUpOm47Zm9yKHZhciBjLHMsZixsPS0xLGg9bi5sZW5ndGgscD1vW2krK10sZD1IZSgpLHY9dSgpOysrbDxoOykoZj1kLmdldChjPXAocz1uW2xdKSsiIikpP2YucHVzaChzKTpkLnNldChjLFtzXSk7cmV0dXJuIGQuZWFjaChmdW5jdGlvbihuLGUpe2EodixlLHQobixpLHUsYSkpfSksdn1mdW5jdGlvbiBuKHQsZSl7aWYoKytlPm8ubGVuZ3RoKXJldHVybiB0O3ZhciBpLGE9dVtlLTFdO3JldHVybiBudWxsIT1yJiZlPj1vLmxlbmd0aD9pPXQuZW50cmllcygpOihpPVtdLHQuZWFjaChmdW5jdGlvbih0LHIpe2kucHVzaCh7a2V5OnIsdmFsdWVzOm4odCxlKX0pfSkpLG51bGwhPWE/aS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIGEodC5rZXksbi5rZXkpfSk6aX12YXIgZSxyLGksbz1bXSx1PVtdO3JldHVybiBpPXtvYmplY3Q6ZnVuY3Rpb24obil7cmV0dXJuIHQobiwwLGplLFhlKX0sbWFwOmZ1bmN0aW9uKG4pe3JldHVybiB0KG4sMCwkZSxWZSl9LGVudHJpZXM6ZnVuY3Rpb24oZSl7cmV0dXJuIG4odChlLDAsJGUsVmUpLDApfSxrZXk6ZnVuY3Rpb24odCl7cmV0dXJuIG8ucHVzaCh0KSxpfSxzb3J0S2V5czpmdW5jdGlvbih0KXtyZXR1cm4gdVtvLmxlbmd0aC0xXT10LGl9LHNvcnRWYWx1ZXM6ZnVuY3Rpb24odCl7cmV0dXJuIGU9dCxpfSxyb2xsdXA6ZnVuY3Rpb24odCl7cmV0dXJuIHI9dCxpfX19LEhkPUhlLnByb3RvdHlwZTtXZS5wcm90b3R5cGU9WmUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpXZSxoYXM6SGQuaGFzLGFkZDpmdW5jdGlvbih0KXtyZXR1cm4gdCs9IiIsdGhpc1siJCIrdF09dCx0aGlzfSxyZW1vdmU6SGQucmVtb3ZlLGNsZWFyOkhkLmNsZWFyLHZhbHVlczpIZC5rZXlzLHNpemU6SGQuc2l6ZSxlbXB0eTpIZC5lbXB0eSxlYWNoOkhkLmVhY2h9O3ZhciBqZD1mdW5jdGlvbih0KXt2YXIgbj1bXTtmb3IodmFyIGUgaW4gdCluLnB1c2goZSk7cmV0dXJuIG59LFhkPWZ1bmN0aW9uKHQpe3ZhciBuPVtdO2Zvcih2YXIgZSBpbiB0KW4ucHVzaCh0W2VdKTtyZXR1cm4gbn0sJGQ9ZnVuY3Rpb24odCl7dmFyIG49W107Zm9yKHZhciBlIGluIHQpbi5wdXNoKHtrZXk6ZSx2YWx1ZTp0W2VdfSk7cmV0dXJuIG59LFZkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4odCxuKXt2YXIgcixpLG89ZSh0LGZ1bmN0aW9uKHQsZSl7aWYocilyZXR1cm4gcih0LGUtMSk7aT10LHI9bj9KZSh0LG4pOkdlKHQpfSk7cmV0dXJuIG8uY29sdW1ucz1pLG99ZnVuY3Rpb24gZSh0LG4pe2Z1bmN0aW9uIGUoKXtpZihmPj1zKXJldHVybiB1O2lmKGkpcmV0dXJuIGk9ITEsbzt2YXIgbixlPWY7aWYoMzQ9PT10LmNoYXJDb2RlQXQoZSkpe2Zvcih2YXIgcj1lO3IrKzxzOylpZigzND09PXQuY2hhckNvZGVBdChyKSl7aWYoMzQhPT10LmNoYXJDb2RlQXQocisxKSlicmVhazsrK3J9cmV0dXJuIGY9cisyLG49dC5jaGFyQ29kZUF0KHIrMSksMTM9PT1uPyhpPSEwLDEwPT09dC5jaGFyQ29kZUF0KHIrMikmJisrZik6MTA9PT1uJiYoaT0hMCksdC5zbGljZShlKzEscikucmVwbGFjZSgvIiIvZywnIicpfWZvcig7ZjxzOyl7dmFyIGE9MTtpZigxMD09PShuPXQuY2hhckNvZGVBdChmKyspKSlpPSEwO2Vsc2UgaWYoMTM9PT1uKWk9ITAsMTA9PT10LmNoYXJDb2RlQXQoZikmJigrK2YsKythKTtlbHNlIGlmKG4hPT1jKWNvbnRpbnVlO3JldHVybiB0LnNsaWNlKGUsZi1hKX1yZXR1cm4gdC5zbGljZShlKX1mb3IodmFyIHIsaSxvPXt9LHU9e30sYT1bXSxzPXQubGVuZ3RoLGY9MCxsPTA7KHI9ZSgpKSE9PXU7KXtmb3IodmFyIGg9W107ciE9PW8mJnIhPT11OyloLnB1c2gocikscj1lKCk7biYmbnVsbD09KGg9bihoLGwrKykpfHxhLnB1c2goaCl9cmV0dXJuIGF9ZnVuY3Rpb24gcihuLGUpe3JldHVybiBudWxsPT1lJiYoZT1RZShuKSksW2UubWFwKHUpLmpvaW4odCldLmNvbmNhdChuLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gZS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHUoblt0XSl9KS5qb2luKHQpfSkpLmpvaW4oIlxuIil9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdC5tYXAobykuam9pbigiXG4iKX1mdW5jdGlvbiBvKG4pe3JldHVybiBuLm1hcCh1KS5qb2luKHQpfWZ1bmN0aW9uIHUodCl7cmV0dXJuIG51bGw9PXQ/IiI6YS50ZXN0KHQrPSIiKT8nIicrdC5yZXBsYWNlKC9cIi9nLCciIicpKyciJzp0fXZhciBhPW5ldyBSZWdFeHAoJ1siJyt0KyJcblxyXSIpLGM9dC5jaGFyQ29kZUF0KDApO3JldHVybntwYXJzZTpuLHBhcnNlUm93czplLGZvcm1hdDpyLGZvcm1hdFJvd3M6aX19LFdkPVZkKCIsIiksWmQ9V2QucGFyc2UsR2Q9V2QucGFyc2VSb3dzLEpkPVdkLmZvcm1hdCxRZD1XZC5mb3JtYXRSb3dzLEtkPVZkKCJcdCIpLHR2PUtkLnBhcnNlLG52PUtkLnBhcnNlUm93cyxldj1LZC5mb3JtYXQscnY9S2QuZm9ybWF0Um93cyxpdj1mdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGUoKXt2YXIgZSxpLG89ci5sZW5ndGgsdT0wLGE9MDtmb3IoZT0wO2U8bzsrK2UpaT1yW2VdLHUrPWkueCxhKz1pLnk7Zm9yKHU9dS9vLXQsYT1hL28tbixlPTA7ZTxvOysrZSlpPXJbZV0saS54LT11LGkueS09YX12YXIgcjtyZXR1cm4gbnVsbD09dCYmKHQ9MCksbnVsbD09biYmKG49MCksZS5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe3I9dH0sZS54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStuLGUpOnR9LGUueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdCxlKTpufSxlfSxvdj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19LHV2PWZ1bmN0aW9uKCl7cmV0dXJuIDFlLTYqKE1hdGgucmFuZG9tKCktLjUpfSxhdj1mdW5jdGlvbih0KXt2YXIgbj0rdGhpcy5feC5jYWxsKG51bGwsdCksZT0rdGhpcy5feS5jYWxsKG51bGwsdCk7cmV0dXJuIEtlKHRoaXMuY292ZXIobixlKSxuLGUsdCl9LGN2PWZ1bmN0aW9uKHQsbil7aWYoaXNOYU4odD0rdCl8fGlzTmFOKG49K24pKXJldHVybiB0aGlzO3ZhciBlPXRoaXMuX3gwLHI9dGhpcy5feTAsaT10aGlzLl94MSxvPXRoaXMuX3kxO2lmKGlzTmFOKGUpKWk9KGU9TWF0aC5mbG9vcih0KSkrMSxvPShyPU1hdGguZmxvb3IobikpKzE7ZWxzZXtpZighKGU+dHx8dD5pfHxyPm58fG4+bykpcmV0dXJuIHRoaXM7dmFyIHUsYSxjPWktZSxzPXRoaXMuX3Jvb3Q7c3dpdGNoKGE9KG48KHIrbykvMik8PDF8dDwoZStpKS8yKXtjYXNlIDA6ZG97dT1uZXcgQXJyYXkoNCksdVthXT1zLHM9dX13aGlsZShjKj0yLGk9ZStjLG89citjLHQ+aXx8bj5vKTticmVhaztjYXNlIDE6ZG97dT1uZXcgQXJyYXkoNCksdVthXT1zLHM9dX13aGlsZShjKj0yLGU9aS1jLG89citjLGU+dHx8bj5vKTticmVhaztjYXNlIDI6ZG97dT1uZXcgQXJyYXkoNCksdVthXT1zLHM9dX13aGlsZShjKj0yLGk9ZStjLHI9by1jLHQ+aXx8cj5uKTticmVhaztjYXNlIDM6ZG97dT1uZXcgQXJyYXkoNCksdVthXT1zLHM9dX13aGlsZShjKj0yLGU9aS1jLHI9by1jLGU+dHx8cj5uKX10aGlzLl9yb290JiZ0aGlzLl9yb290Lmxlbmd0aCYmKHRoaXMuX3Jvb3Q9cyl9cmV0dXJuIHRoaXMuX3gwPWUsdGhpcy5feTA9cix0aGlzLl94MT1pLHRoaXMuX3kxPW8sdGhpc30sc3Y9ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy52aXNpdChmdW5jdGlvbihuKXtpZighbi5sZW5ndGgpZG97dC5wdXNoKG4uZGF0YSl9d2hpbGUobj1uLm5leHQpfSksdH0sZnY9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5jb3ZlcigrdFswXVswXSwrdFswXVsxXSkuY292ZXIoK3RbMV1bMF0sK3RbMV1bMV0pOmlzTmFOKHRoaXMuX3gwKT92b2lkIDA6W1t0aGlzLl94MCx0aGlzLl95MF0sW3RoaXMuX3gxLHRoaXMuX3kxXV19LGx2PWZ1bmN0aW9uKHQsbixlLHIsaSl7dGhpcy5ub2RlPXQsdGhpcy54MD1uLHRoaXMueTA9ZSx0aGlzLngxPXIsdGhpcy55MT1pfSxodj1mdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvLHUsYSxjLHMsZj10aGlzLl94MCxsPXRoaXMuX3kwLGg9dGhpcy5feDEscD10aGlzLl95MSxkPVtdLHY9dGhpcy5fcm9vdDtmb3IodiYmZC5wdXNoKG5ldyBsdih2LGYsbCxoLHApKSxudWxsPT1lP2U9MS8wOihmPXQtZSxsPW4tZSxoPXQrZSxwPW4rZSxlKj1lKTtjPWQucG9wKCk7KWlmKCEoISh2PWMubm9kZSl8fChpPWMueDApPmh8fChvPWMueTApPnB8fCh1PWMueDEpPGZ8fChhPWMueTEpPGwpKWlmKHYubGVuZ3RoKXt2YXIgXz0oaSt1KS8yLHk9KG8rYSkvMjtkLnB1c2gobmV3IGx2KHZbM10sXyx5LHUsYSksbmV3IGx2KHZbMl0saSx5LF8sYSksbmV3IGx2KHZbMV0sXyxvLHUseSksbmV3IGx2KHZbMF0saSxvLF8seSkpLChzPShuPj15KTw8MXx0Pj1fKSYmKGM9ZFtkLmxlbmd0aC0xXSxkW2QubGVuZ3RoLTFdPWRbZC5sZW5ndGgtMS1zXSxkW2QubGVuZ3RoLTEtc109Yyl9ZWxzZXt2YXIgZz10LSt0aGlzLl94LmNhbGwobnVsbCx2LmRhdGEpLG09bi0rdGhpcy5feS5jYWxsKG51bGwsdi5kYXRhKSx4PWcqZyttKm07aWYoeDxlKXt2YXIgYj1NYXRoLnNxcnQoZT14KTtmPXQtYixsPW4tYixoPXQrYixwPW4rYixyPXYuZGF0YX19cmV0dXJuIHJ9LHB2PWZ1bmN0aW9uKHQpe2lmKGlzTmFOKG89K3RoaXMuX3guY2FsbChudWxsLHQpKXx8aXNOYU4odT0rdGhpcy5feS5jYWxsKG51bGwsdCkpKXJldHVybiB0aGlzO3ZhciBuLGUscixpLG8sdSxhLGMscyxmLGwsaCxwPXRoaXMuX3Jvb3QsZD10aGlzLl94MCx2PXRoaXMuX3kwLF89dGhpcy5feDEseT10aGlzLl95MTtpZighcClyZXR1cm4gdGhpcztpZihwLmxlbmd0aClmb3IoOzspe2lmKChzPW8+PShhPShkK18pLzIpKT9kPWE6Xz1hLChmPXU+PShjPSh2K3kpLzIpKT92PWM6eT1jLG49cCwhKHA9cFtsPWY8PDF8c10pKXJldHVybiB0aGlzO2lmKCFwLmxlbmd0aClicmVhazsobltsKzEmM118fG5bbCsyJjNdfHxuW2wrMyYzXSkmJihlPW4saD1sKX1mb3IoO3AuZGF0YSE9PXQ7KWlmKHI9cCwhKHA9cC5uZXh0KSlyZXR1cm4gdGhpcztyZXR1cm4oaT1wLm5leHQpJiZkZWxldGUgcC5uZXh0LHI/KGk/ci5uZXh0PWk6ZGVsZXRlIHIubmV4dCx0aGlzKTpuPyhpP25bbF09aTpkZWxldGUgbltsXSwocD1uWzBdfHxuWzFdfHxuWzJdfHxuWzNdKSYmcD09PShuWzNdfHxuWzJdfHxuWzFdfHxuWzBdKSYmIXAubGVuZ3RoJiYoZT9lW2hdPXA6dGhpcy5fcm9vdD1wKSx0aGlzKToodGhpcy5fcm9vdD1pLHRoaXMpfSxkdj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290fSx2dj1mdW5jdGlvbigpe3ZhciB0PTA7cmV0dXJuIHRoaXMudmlzaXQoZnVuY3Rpb24obil7aWYoIW4ubGVuZ3RoKWRveysrdH13aGlsZShuPW4ubmV4dCl9KSx0fSxfdj1mdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvLHUsYT1bXSxjPXRoaXMuX3Jvb3Q7Zm9yKGMmJmEucHVzaChuZXcgbHYoYyx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkpO249YS5wb3AoKTspaWYoIXQoYz1uLm5vZGUscj1uLngwLGk9bi55MCxvPW4ueDEsdT1uLnkxKSYmYy5sZW5ndGgpe3ZhciBzPShyK28pLzIsZj0oaSt1KS8yOyhlPWNbM10pJiZhLnB1c2gobmV3IGx2KGUscyxmLG8sdSkpLChlPWNbMl0pJiZhLnB1c2gobmV3IGx2KGUscixmLHMsdSkpLChlPWNbMV0pJiZhLnB1c2gobmV3IGx2KGUscyxpLG8sZikpLChlPWNbMF0pJiZhLnB1c2gobmV3IGx2KGUscixpLHMsZikpfXJldHVybiB0aGlzfSx5dj1mdW5jdGlvbih0KXt2YXIgbixlPVtdLHI9W107Zm9yKHRoaXMuX3Jvb3QmJmUucHVzaChuZXcgbHYodGhpcy5fcm9vdCx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkpO249ZS5wb3AoKTspe3ZhciBpPW4ubm9kZTtpZihpLmxlbmd0aCl7dmFyIG8sdT1uLngwLGE9bi55MCxjPW4ueDEscz1uLnkxLGY9KHUrYykvMixsPShhK3MpLzI7KG89aVswXSkmJmUucHVzaChuZXcgbHYobyx1LGEsZixsKSksKG89aVsxXSkmJmUucHVzaChuZXcgbHYobyxmLGEsYyxsKSksKG89aVsyXSkmJmUucHVzaChuZXcgbHYobyx1LGwsZixzKSksKG89aVszXSkmJmUucHVzaChuZXcgbHYobyxmLGwsYyxzKSl9ci5wdXNoKG4pfWZvcig7bj1yLnBvcCgpOyl0KG4ubm9kZSxuLngwLG4ueTAsbi54MSxuLnkxKTtyZXR1cm4gdGhpc30sZ3Y9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3g9dCx0aGlzKTp0aGlzLl94fSxtdj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5feT10LHRoaXMpOnRoaXMuX3l9LHh2PWlyLnByb3RvdHlwZT1vci5wcm90b3R5cGU7eHYuY29weT1mdW5jdGlvbigpe3ZhciB0LG4sZT1uZXcgb3IodGhpcy5feCx0aGlzLl95LHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSxyPXRoaXMuX3Jvb3Q7aWYoIXIpcmV0dXJuIGU7aWYoIXIubGVuZ3RoKXJldHVybiBlLl9yb290PXVyKHIpLGU7Zm9yKHQ9W3tzb3VyY2U6cix0YXJnZXQ6ZS5fcm9vdD1uZXcgQXJyYXkoNCl9XTtyPXQucG9wKCk7KWZvcih2YXIgaT0wO2k8NDsrK2kpKG49ci5zb3VyY2VbaV0pJiYobi5sZW5ndGg/dC5wdXNoKHtzb3VyY2U6bix0YXJnZXQ6ci50YXJnZXRbaV09bmV3IEFycmF5KDQpfSk6ci50YXJnZXRbaV09dXIobikpO3JldHVybiBlfSx4di5hZGQ9YXYseHYuYWRkQWxsPXRyLHh2LmNvdmVyPWN2LHh2LmRhdGE9c3YseHYuZXh0ZW50PWZ2LHh2LmZpbmQ9aHYseHYucmVtb3ZlPXB2LHh2LnJlbW92ZUFsbD1ucix4di5yb290PWR2LHh2LnNpemU9dnYseHYudmlzaXQ9X3YseHYudmlzaXRBZnRlcj15dix4di54PWd2LHh2Lnk9bXY7dmFyIGJ2LHd2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4oKXtmdW5jdGlvbiB0KHQsbixlLHIsaSl7dmFyIG89dC5kYXRhLGE9dC5yLHA9bCthO3tpZighbylyZXR1cm4gbj5zK3B8fHI8cy1wfHxlPmYrcHx8aTxmLXA7aWYoby5pbmRleD5jLmluZGV4KXt2YXIgZD1zLW8ueC1vLnZ4LHY9Zi1vLnktby52eSxfPWQqZCt2KnY7XzxwKnAmJigwPT09ZCYmKGQ9dXYoKSxfKz1kKmQpLDA9PT12JiYodj11digpLF8rPXYqdiksXz0ocC0oXz1NYXRoLnNxcnQoXykpKS9fKnUsYy52eCs9KGQqPV8pKihwPShhKj1hKS8oaCthKSksYy52eSs9KHYqPV8pKnAsby52eC09ZCoocD0xLXApLG8udnktPXYqcCl9fX1mb3IodmFyIG4scixjLHMsZixsLGgscD1pLmxlbmd0aCxkPTA7ZDxhOysrZClmb3Iocj1pcihpLGFyLGNyKS52aXNpdEFmdGVyKGUpLG49MDtuPHA7KytuKWM9aVtuXSxsPW9bYy5pbmRleF0saD1sKmwscz1jLngrYy52eCxmPWMueStjLnZ5LHIudmlzaXQodCl9ZnVuY3Rpb24gZSh0KXtpZih0LmRhdGEpcmV0dXJuIHQucj1vW3QuZGF0YS5pbmRleF07Zm9yKHZhciBuPXQucj0wO248NDsrK24pdFtuXSYmdFtuXS5yPnQuciYmKHQucj10W25dLnIpfWZ1bmN0aW9uIHIoKXtpZihpKXt2YXIgbixlLHI9aS5sZW5ndGg7Zm9yKG89bmV3IEFycmF5KHIpLG49MDtuPHI7KytuKWU9aVtuXSxvW2UuaW5kZXhdPSt0KGUsbixpKX19dmFyIGksbyx1PTEsYT0xCjtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9b3YobnVsbD09dD8xOit0KSksbi5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2k9dCxyKCl9LG4uaXRlcmF0aW9ucz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0rdCxuKTphfSxuLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSt0LG4pOnV9LG4ucmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6b3YoK2UpLHIoKSxuKTp0fSxufSxNdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKHQpe3JldHVybiAxL01hdGgubWluKHNbdC5zb3VyY2UuaW5kZXhdLHNbdC50YXJnZXQuaW5kZXhdKX1mdW5jdGlvbiBlKG4pe2Zvcih2YXIgZT0wLHI9dC5sZW5ndGg7ZTxkOysrZSlmb3IodmFyIGksbyxjLHMsbCxoLHAsdj0wO3Y8cjsrK3YpaT10W3ZdLG89aS5zb3VyY2UsYz1pLnRhcmdldCxzPWMueCtjLnZ4LW8ueC1vLnZ4fHx1digpLGw9Yy55K2Mudnktby55LW8udnl8fHV2KCksaD1NYXRoLnNxcnQocypzK2wqbCksaD0oaC1hW3ZdKS9oKm4qdVt2XSxzKj1oLGwqPWgsYy52eC09cyoocD1mW3ZdKSxjLnZ5LT1sKnAsby52eCs9cyoocD0xLXApLG8udnkrPWwqcH1mdW5jdGlvbiByKCl7aWYoYyl7dmFyIG4sZSxyPWMubGVuZ3RoLGg9dC5sZW5ndGgscD1IZShjLGwpO2ZvcihuPTAscz1uZXcgQXJyYXkocik7bjxoOysrbillPXRbbl0sZS5pbmRleD1uLCJvYmplY3QiIT10eXBlb2YgZS5zb3VyY2UmJihlLnNvdXJjZT1mcihwLGUuc291cmNlKSksIm9iamVjdCIhPXR5cGVvZiBlLnRhcmdldCYmKGUudGFyZ2V0PWZyKHAsZS50YXJnZXQpKSxzW2Uuc291cmNlLmluZGV4XT0oc1tlLnNvdXJjZS5pbmRleF18fDApKzEsc1tlLnRhcmdldC5pbmRleF09KHNbZS50YXJnZXQuaW5kZXhdfHwwKSsxO2ZvcihuPTAsZj1uZXcgQXJyYXkoaCk7bjxoOysrbillPXRbbl0sZltuXT1zW2Uuc291cmNlLmluZGV4XS8oc1tlLnNvdXJjZS5pbmRleF0rc1tlLnRhcmdldC5pbmRleF0pO3U9bmV3IEFycmF5KGgpLGkoKSxhPW5ldyBBcnJheShoKSxvKCl9fWZ1bmN0aW9uIGkoKXtpZihjKWZvcih2YXIgbj0wLGU9dC5sZW5ndGg7bjxlOysrbil1W25dPStoKHRbbl0sbix0KX1mdW5jdGlvbiBvKCl7aWYoYylmb3IodmFyIG49MCxlPXQubGVuZ3RoO248ZTsrK24pYVtuXT0rcCh0W25dLG4sdCl9dmFyIHUsYSxjLHMsZixsPXNyLGg9bixwPW92KDMwKSxkPTE7cmV0dXJuIG51bGw9PXQmJih0PVtdKSxlLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7Yz10LHIoKX0sZS5saW5rcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLHIoKSxlKTp0fSxlLmlkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPXQsZSk6bH0sZS5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPSt0LGUpOmR9LGUuc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpvdigrdCksaSgpLGUpOmh9LGUuZGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpvdigrdCksbygpLGUpOnB9LGV9LFR2PTEwLGt2PU1hdGguUEkqKDMtTWF0aC5zcXJ0KDUpKSxOdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKCl7ZSgpLHAuY2FsbCgidGljayIsbyksdTxhJiYoaC5zdG9wKCkscC5jYWxsKCJlbmQiLG8pKX1mdW5jdGlvbiBlKCl7dmFyIG4sZSxyPXQubGVuZ3RoO2Zvcih1Kz0ocy11KSpjLGwuZWFjaChmdW5jdGlvbih0KXt0KHUpfSksbj0wO248cjsrK24pZT10W25dLG51bGw9PWUuZng/ZS54Kz1lLnZ4Kj1mOihlLng9ZS5meCxlLnZ4PTApLG51bGw9PWUuZnk/ZS55Kz1lLnZ5Kj1mOihlLnk9ZS5meSxlLnZ5PTApfWZ1bmN0aW9uIHIoKXtmb3IodmFyIG4sZT0wLHI9dC5sZW5ndGg7ZTxyOysrZSl7aWYobj10W2VdLG4uaW5kZXg9ZSxpc05hTihuLngpfHxpc05hTihuLnkpKXt2YXIgaT1UdipNYXRoLnNxcnQoZSksbz1lKmt2O24ueD1pKk1hdGguY29zKG8pLG4ueT1pKk1hdGguc2luKG8pfShpc05hTihuLnZ4KXx8aXNOYU4obi52eSkpJiYobi52eD1uLnZ5PTApfX1mdW5jdGlvbiBpKG4pe3JldHVybiBuLmluaXRpYWxpemUmJm4uaW5pdGlhbGl6ZSh0KSxufXZhciBvLHU9MSxhPS4wMDEsYz0xLU1hdGgucG93KGEsMS8zMDApLHM9MCxmPS42LGw9SGUoKSxoPW1uKG4pLHA9digidGljayIsImVuZCIpO3JldHVybiBudWxsPT10JiYodD1bXSkscigpLG89e3RpY2s6ZSxyZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIGgucmVzdGFydChuKSxvfSxzdG9wOmZ1bmN0aW9uKCl7cmV0dXJuIGguc3RvcCgpLG99LG5vZGVzOmZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4scigpLGwuZWFjaChpKSxvKTp0fSxhbHBoYTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0rdCxvKTp1fSxhbHBoYU1pbjpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0rdCxvKTphfSxhbHBoYURlY2F5OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSt0LG8pOitjfSxhbHBoYVRhcmdldDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0rdCxvKTpzfSx2ZWxvY2l0eURlY2F5OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPTEtdCxvKToxLWZ9LGZvcmNlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8obnVsbD09bj9sLnJlbW92ZSh0KTpsLnNldCh0LGkobikpLG8pOmwuZ2V0KHQpfSxmaW5kOmZ1bmN0aW9uKG4sZSxyKXt2YXIgaSxvLHUsYSxjLHM9MCxmPXQubGVuZ3RoO2ZvcihudWxsPT1yP3I9MS8wOnIqPXIscz0wO3M8ZjsrK3MpYT10W3NdLGk9bi1hLngsbz1lLWEueSwodT1pKmkrbypvKTxyJiYoYz1hLHI9dSk7cmV0dXJuIGN9LG9uOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8ocC5vbih0LG4pLG8pOnAub24odCl9fX0sU3Y9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBuLGE9aS5sZW5ndGgsYz1pcihpLGxyLGhyKS52aXNpdEFmdGVyKGUpO2Zvcih1PXQsbj0wO248YTsrK24pbz1pW25dLGMudmlzaXQocil9ZnVuY3Rpb24gbigpe2lmKGkpe3ZhciB0LG4sZT1pLmxlbmd0aDtmb3IoYT1uZXcgQXJyYXkoZSksdD0wO3Q8ZTsrK3Qpbj1pW3RdLGFbbi5pbmRleF09K2Mobix0LGkpfX1mdW5jdGlvbiBlKHQpe3ZhciBuLGUscixpLG8sdT0wO2lmKHQubGVuZ3RoKXtmb3Iocj1pPW89MDtvPDQ7KytvKShuPXRbb10pJiYoZT1uLnZhbHVlKSYmKHUrPWUscis9ZSpuLngsaSs9ZSpuLnkpO3QueD1yL3UsdC55PWkvdX1lbHNle249dCxuLng9bi5kYXRhLngsbi55PW4uZGF0YS55O2Rve3UrPWFbbi5kYXRhLmluZGV4XX13aGlsZShuPW4ubmV4dCl9dC52YWx1ZT11fWZ1bmN0aW9uIHIodCxuLGUscil7aWYoIXQudmFsdWUpcmV0dXJuITA7dmFyIGk9dC54LW8ueCxjPXQueS1vLnksaD1yLW4scD1pKmkrYypjO2lmKGgqaC9sPHApcmV0dXJuIHA8ZiYmKDA9PT1pJiYoaT11digpLHArPWkqaSksMD09PWMmJihjPXV2KCkscCs9YypjKSxwPHMmJihwPU1hdGguc3FydChzKnApKSxvLnZ4Kz1pKnQudmFsdWUqdS9wLG8udnkrPWMqdC52YWx1ZSp1L3ApLCEwO2lmKCEodC5sZW5ndGh8fHA+PWYpKXsodC5kYXRhIT09b3x8dC5uZXh0KSYmKDA9PT1pJiYoaT11digpLHArPWkqaSksMD09PWMmJihjPXV2KCkscCs9YypjKSxwPHMmJihwPU1hdGguc3FydChzKnApKSk7ZG97dC5kYXRhIT09byYmKGg9YVt0LmRhdGEuaW5kZXhdKnUvcCxvLnZ4Kz1pKmgsby52eSs9YypoKX13aGlsZSh0PXQubmV4dCl9fXZhciBpLG8sdSxhLGM9b3YoLTMwKSxzPTEsZj0xLzAsbD0uODE7cmV0dXJuIHQuaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtpPXQsbigpfSx0LnN0cmVuZ3RoPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6b3YoK2UpLG4oKSx0KTpjfSx0LmRpc3RhbmNlTWluPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPW4qbix0KTpNYXRoLnNxcnQocyl9LHQuZGlzdGFuY2VNYXg9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9bipuLHQpOk1hdGguc3FydChmKX0sdC50aGV0YT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1uKm4sdCk6TWF0aC5zcXJ0KGwpfSx0fSxFdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKHQpe2Zvcih2YXIgbixlPTAsdT1yLmxlbmd0aDtlPHU7KytlKW49cltlXSxuLnZ4Kz0ob1tlXS1uLngpKmlbZV0qdH1mdW5jdGlvbiBlKCl7aWYocil7dmFyIG4sZT1yLmxlbmd0aDtmb3IoaT1uZXcgQXJyYXkoZSksbz1uZXcgQXJyYXkoZSksbj0wO248ZTsrK24paVtuXT1pc05hTihvW25dPSt0KHJbbl0sbixyKSk/MDordShyW25dLG4scil9fXZhciByLGksbyx1PW92KC4xKTtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9b3YobnVsbD09dD8wOit0KSksbi5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe3I9dCxlKCl9LG4uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpvdigrdCksZSgpLG4pOnV9LG4ueD1mdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yOm92KCtyKSxlKCksbik6dH0sbn0sQXY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbih0KXtmb3IodmFyIG4sZT0wLHU9ci5sZW5ndGg7ZTx1OysrZSluPXJbZV0sbi52eSs9KG9bZV0tbi55KSppW2VdKnR9ZnVuY3Rpb24gZSgpe2lmKHIpe3ZhciBuLGU9ci5sZW5ndGg7Zm9yKGk9bmV3IEFycmF5KGUpLG89bmV3IEFycmF5KGUpLG49MDtuPGU7KytuKWlbbl09aXNOYU4ob1tuXT0rdChyW25dLG4scikpPzA6K3UocltuXSxuLHIpfX12YXIgcixpLG8sdT1vdiguMSk7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PW92KG51bGw9PXQ/MDordCkpLG4uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtyPXQsZSgpfSxuLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6b3YoK3QpLGUoKSxuKTp1fSxuLnk9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIHI/cjpvdigrciksZSgpLG4pOnR9LG59LEN2PWZ1bmN0aW9uKHQsbil7aWYoKGU9KHQ9bj90LnRvRXhwb25lbnRpYWwobi0xKTp0LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZigiZSIpKTwwKXJldHVybiBudWxsO3ZhciBlLHI9dC5zbGljZSgwLGUpO3JldHVybltyLmxlbmd0aD4xP3JbMF0rci5zbGljZSgyKTpyLCt0LnNsaWNlKGUrMSldfSx6dj1mdW5jdGlvbih0KXtyZXR1cm4gdD1DdihNYXRoLmFicyh0KSksdD90WzFdOk5hTn0sUHY9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oZSxyKXtmb3IodmFyIGk9ZS5sZW5ndGgsbz1bXSx1PTAsYT10WzBdLGM9MDtpPjAmJmE+MCYmKGMrYSsxPnImJihhPU1hdGgubWF4KDEsci1jKSksby5wdXNoKGUuc3Vic3RyaW5nKGktPWEsaSthKSksISgoYys9YSsxKT5yKSk7KWE9dFt1PSh1KzEpJXQubGVuZ3RoXTtyZXR1cm4gby5yZXZlcnNlKCkuam9pbihuKX19LEx2PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbi5yZXBsYWNlKC9bMC05XS9nLGZ1bmN0aW9uKG4pe3JldHVybiB0WytuXX0pfX0sUnY9ZnVuY3Rpb24odCxuKXt0PXQudG9QcmVjaXNpb24obik7dDpmb3IodmFyIGUscj10Lmxlbmd0aCxpPTEsbz0tMTtpPHI7KytpKXN3aXRjaCh0W2ldKXtjYXNlIi4iOm89ZT1pO2JyZWFrO2Nhc2UiMCI6MD09PW8mJihvPWkpLGU9aTticmVhaztjYXNlImUiOmJyZWFrIHQ7ZGVmYXVsdDpvPjAmJihvPTApfXJldHVybiBvPjA/dC5zbGljZSgwLG8pK3Quc2xpY2UoZSsxKTp0fSxxdj1mdW5jdGlvbih0LG4pe3ZhciBlPUN2KHQsbik7aWYoIWUpcmV0dXJuIHQrIiI7dmFyIHI9ZVswXSxpPWVbMV0sbz1pLShidj0zKk1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihpLzMpKSkpKzEsdT1yLmxlbmd0aDtyZXR1cm4gbz09PXU/cjpvPnU/cituZXcgQXJyYXkoby11KzEpLmpvaW4oIjAiKTpvPjA/ci5zbGljZSgwLG8pKyIuIityLnNsaWNlKG8pOiIwLiIrbmV3IEFycmF5KDEtbykuam9pbigiMCIpK0N2KHQsTWF0aC5tYXgoMCxuK28tMSkpWzBdfSxVdj1mdW5jdGlvbih0LG4pe3ZhciBlPUN2KHQsbik7aWYoIWUpcmV0dXJuIHQrIiI7dmFyIHI9ZVswXSxpPWVbMV07cmV0dXJuIGk8MD8iMC4iK25ldyBBcnJheSgtaSkuam9pbigiMCIpK3I6ci5sZW5ndGg+aSsxP3Iuc2xpY2UoMCxpKzEpKyIuIityLnNsaWNlKGkrMSk6cituZXcgQXJyYXkoaS1yLmxlbmd0aCsyKS5qb2luKCIwIil9LER2PXsiIjpSdiwiJSI6ZnVuY3Rpb24odCxuKXtyZXR1cm4oMTAwKnQpLnRvRml4ZWQobil9LGI6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMil9LGM6ZnVuY3Rpb24odCl7cmV0dXJuIHQrIiJ9LGQ6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTApfSxlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQudG9FeHBvbmVudGlhbChuKX0sZjpmdW5jdGlvbih0LG4pe3JldHVybiB0LnRvRml4ZWQobil9LGc6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdC50b1ByZWNpc2lvbihuKX0sbzpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZyg4KX0scDpmdW5jdGlvbih0LG4pe3JldHVybiBVdigxMDAqdCxuKX0scjpVdixzOnF2LFg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LHg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpfX0sT3Y9L14oPzooLik/KFs8Pj1eXSkpPyhbK1wtXCggXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuXGQrKT8oW2EteiVdKT8kL2k7cHIucHJvdG90eXBlPWRyLnByb3RvdHlwZSxkci5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWxsK3RoaXMuYWxpZ24rdGhpcy5zaWduK3RoaXMuc3ltYm9sKyh0aGlzLnplcm8/IjAiOiIiKSsobnVsbD09dGhpcy53aWR0aD8iIjpNYXRoLm1heCgxLDB8dGhpcy53aWR0aCkpKyh0aGlzLmNvbW1hPyIsIjoiIikrKG51bGw9PXRoaXMucHJlY2lzaW9uPyIiOiIuIitNYXRoLm1heCgwLDB8dGhpcy5wcmVjaXNpb24pKSt0aGlzLnR5cGV9O3ZhciBGdixJdj1mdW5jdGlvbih0KXtyZXR1cm4gdH0sWXY9WyJ5IiwieiIsImEiLCJmIiwicCIsIm4iLCLCtSIsIm0iLCIiLCJrIiwiTSIsIkciLCJUIiwiUCIsIkUiLCJaIiwiWSJdLEJ2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4odCl7ZnVuY3Rpb24gbih0KXt2YXIgbixpLGEsZj1fLHg9eTtpZigiYyI9PT12KXg9Zyh0KSt4LHQ9IiI7ZWxzZXt0PSt0O3ZhciBiPXQ8MDtpZih0PWcoTWF0aC5hYnModCksZCksYiYmMD09K3QmJihiPSExKSxmPShiPyIoIj09PXM/czoiLSI6Ii0iPT09c3x8IigiPT09cz8iIjpzKStmLHg9eCsoInMiPT09dj9Zdls4K2J2LzNdOiIiKSsoYiYmIigiPT09cz8iKSI6IiIpLG0pZm9yKG49LTEsaT10Lmxlbmd0aDsrK248aTspaWYoNDg+KGE9dC5jaGFyQ29kZUF0KG4pKXx8YT41Nyl7eD0oNDY9PT1hP28rdC5zbGljZShuKzEpOnQuc2xpY2UobikpK3gsdD10LnNsaWNlKDAsbik7YnJlYWt9fXAmJiFsJiYodD1yKHQsMS8wKSk7dmFyIHc9Zi5sZW5ndGgrdC5sZW5ndGgreC5sZW5ndGgsTT13PGg/bmV3IEFycmF5KGgtdysxKS5qb2luKGUpOiIiO3N3aXRjaChwJiZsJiYodD1yKE0rdCxNLmxlbmd0aD9oLXgubGVuZ3RoOjEvMCksTT0iIiksYyl7Y2FzZSI8Ijp0PWYrdCt4K007YnJlYWs7Y2FzZSI9Ijp0PWYrTSt0K3g7YnJlYWs7Y2FzZSJeIjp0PU0uc2xpY2UoMCx3PU0ubGVuZ3RoPj4xKStmK3QreCtNLnNsaWNlKHcpO2JyZWFrO2RlZmF1bHQ6dD1NK2YrdCt4fXJldHVybiB1KHQpfXQ9cHIodCk7dmFyIGU9dC5maWxsLGM9dC5hbGlnbixzPXQuc2lnbixmPXQuc3ltYm9sLGw9dC56ZXJvLGg9dC53aWR0aCxwPXQuY29tbWEsZD10LnByZWNpc2lvbix2PXQudHlwZSxfPSIkIj09PWY/aVswXToiIyI9PT1mJiYvW2JveFhdLy50ZXN0KHYpPyIwIit2LnRvTG93ZXJDYXNlKCk6IiIseT0iJCI9PT1mP2lbMV06L1slcF0vLnRlc3Qodik/YToiIixnPUR2W3ZdLG09IXZ8fC9bZGVmZ3BycyVdLy50ZXN0KHYpO3JldHVybiBkPW51bGw9PWQ/dj82OjEyOi9bZ3Byc10vLnRlc3Qodik/TWF0aC5tYXgoMSxNYXRoLm1pbigyMSxkKSk6TWF0aC5tYXgoMCxNYXRoLm1pbigyMCxkKSksbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0KyIifSxufWZ1bmN0aW9uIGUodCxlKXt2YXIgcj1uKCh0PXByKHQpLHQudHlwZT0iZiIsdCkpLGk9MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoenYoZSkvMykpKSxvPU1hdGgucG93KDEwLC1pKSx1PVl2WzgraS8zXTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIobyp0KSt1fX12YXIgcj10Lmdyb3VwaW5nJiZ0LnRob3VzYW5kcz9Qdih0Lmdyb3VwaW5nLHQudGhvdXNhbmRzKTpJdixpPXQuY3VycmVuY3ksbz10LmRlY2ltYWwsdT10Lm51bWVyYWxzP0x2KHQubnVtZXJhbHMpOkl2LGE9dC5wZXJjZW50fHwiJSI7cmV0dXJue2Zvcm1hdDpuLGZvcm1hdFByZWZpeDplfX07dnIoe2RlY2ltYWw6Ii4iLHRob3VzYW5kczoiLCIsZ3JvdXBpbmc6WzNdLGN1cnJlbmN5OlsiJCIsIiJdfSk7dmFyIEh2PWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLm1heCgwLC16dihNYXRoLmFicyh0KSkpfSxqdj1mdW5jdGlvbih0LG4pe3JldHVybiBNYXRoLm1heCgwLDMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKHp2KG4pLzMpKSktenYoTWF0aC5hYnModCkpKX0sWHY9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdD1NYXRoLmFicyh0KSxuPU1hdGguYWJzKG4pLXQsTWF0aC5tYXgoMCx6dihuKS16dih0KSkrMX0sJHY9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IF9yfTtfci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOl9yLHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5zPXRoaXMudD0wfSxhZGQ6ZnVuY3Rpb24odCl7eXIoVF8sdCx0aGlzLnQpLHlyKHRoaXMsVF8ucyx0aGlzLnMpLHRoaXMucz90aGlzLnQrPVRfLnQ6dGhpcy5zPVRfLnR9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zfX07dmFyIFZ2LFd2LFp2LEd2LEp2LFF2LEt2LHRfLG5fLGVfLHJfLGlfLG9fLHVfLGFfLGNfLHNfLGZfLGxfLGhfLHBfLGRfLHZfLF9fLHlfLGdfLG1fLHhfLGJfLHdfLE1fLFRfPW5ldyBfcixrXz0xZS02LE5fPU1hdGguUEksU189Tl8vMixFXz1OXy80LEFfPTIqTl8sQ189MTgwL05fLHpfPU5fLzE4MCxQXz1NYXRoLmFicyxMXz1NYXRoLmF0YW4sUl89TWF0aC5hdGFuMixxXz1NYXRoLmNvcyxVXz1NYXRoLmNlaWwsRF89TWF0aC5leHAsT189TWF0aC5sb2csRl89TWF0aC5wb3csSV89TWF0aC5zaW4sWV89TWF0aC5zaWdufHxmdW5jdGlvbih0KXtyZXR1cm4gdD4wPzE6dDwwPy0xOjB9LEJfPU1hdGguc3FydCxIXz1NYXRoLnRhbixqXz17RmVhdHVyZTpmdW5jdGlvbih0LG4pe3dyKHQuZ2VvbWV0cnksbil9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZmVhdHVyZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOyl3cihlW3JdLmdlb21ldHJ5LG4pfX0sWF89e1NwaGVyZTpmdW5jdGlvbih0LG4pe24uc3BoZXJlKCl9LFBvaW50OmZ1bmN0aW9uKHQsbil7dD10LmNvb3JkaW5hdGVzLG4ucG9pbnQodFswXSx0WzFdLHRbMl0pfSxNdWx0aVBvaW50OmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOyl0PWVbcl0sbi5wb2ludCh0WzBdLHRbMV0sdFsyXSl9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtNcih0LmNvb3JkaW5hdGVzLG4sMCl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspTXIoZVtyXSxuLDApfSxQb2x5Z29uOmZ1bmN0aW9uKHQsbil7VHIodC5jb29yZGluYXRlcyxuKX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylUcihlW3JdLG4pfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5nZW9tZXRyaWVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspd3IoZVtyXSxuKX19LCRfPWZ1bmN0aW9uKHQsbil7dCYmal8uaGFzT3duUHJvcGVydHkodC50eXBlKT9qX1t0LnR5cGVdKHQsbik6d3IodCxuKX0sVl89JHYoKSxXXz0kdigpLFpfPXtwb2ludDpicixsaW5lU3RhcnQ6YnIsbGluZUVuZDpicixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtWXy5yZXNldCgpLFpfLmxpbmVTdGFydD1rcixaXy5saW5lRW5kPU5yfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9K1ZfO1dfLmFkZCh0PDA/QV8rdDp0KSx0aGlzLmxpbmVTdGFydD10aGlzLmxpbmVFbmQ9dGhpcy5wb2ludD1icn0sc3BoZXJlOmZ1bmN0aW9uKCl7V18uYWRkKEFfKX19LEdfPWZ1bmN0aW9uKHQpe3JldHVybiBXXy5yZXNldCgpLCRfKHQsWl8pLDIqV199LEpfPSR2KCksUV89e3BvaW50OlVyLGxpbmVTdGFydDpPcixsaW5lRW5kOkZyLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe1FfLnBvaW50PUlyLFFfLmxpbmVTdGFydD1ZcixRXy5saW5lRW5kPUJyLEpfLnJlc2V0KCksWl8ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtaXy5wb2x5Z29uRW5kKCksUV8ucG9pbnQ9VXIsUV8ubGluZVN0YXJ0PU9yLFFfLmxpbmVFbmQ9RnIsVl88MD8oUXY9LSh0Xz0xODApLEt2PS0obl89OTApKTpKXz5rXz9uXz05MDpKXzwta18mJihLdj0tOTApLGFfWzBdPVF2LGFfWzFdPXRffX0sS189ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbyx1LGE7aWYobl89dF89LShRdj1Ldj0xLzApLHVfPVtdLCRfKHQsUV8pLGU9dV8ubGVuZ3RoKXtmb3IodV8uc29ydChqciksbj0xLHI9dV9bMF0sbz1bcl07bjxlOysrbilpPXVfW25dLFhyKHIsaVswXSl8fFhyKHIsaVsxXSk/KEhyKHJbMF0saVsxXSk+SHIoclswXSxyWzFdKSYmKHJbMV09aVsxXSksSHIoaVswXSxyWzFdKT5IcihyWzBdLHJbMV0pJiYoclswXT1pWzBdKSk6by5wdXNoKHI9aSk7Zm9yKHU9LTEvMCxlPW8ubGVuZ3RoLTEsbj0wLHI9b1tlXTtuPD1lO3I9aSwrK24paT1vW25dLChhPUhyKHJbMV0saVswXSkpPnUmJih1PWEsUXY9aVswXSx0Xz1yWzFdKX1yZXR1cm4gdV89YV89bnVsbCxRdj09PTEvMHx8S3Y9PT0xLzA/W1tOYU4sTmFOXSxbTmFOLE5hTl1dOltbUXYsS3ZdLFt0XyxuX11dfSx0eT17c3BoZXJlOmJyLHBvaW50OiRyLGxpbmVTdGFydDpXcixsaW5lRW5kOkpyLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3R5LmxpbmVTdGFydD1Rcix0eS5saW5lRW5kPUtyfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dHkubGluZVN0YXJ0PVdyLHR5LmxpbmVFbmQ9SnJ9fSxueT1mdW5jdGlvbih0KXtjXz1zXz1mXz1sXz1oXz1wXz1kXz12Xz1fXz15Xz1nXz0wLCRfKHQsdHkpO3ZhciBuPV9fLGU9eV8scj1nXyxpPW4qbitlKmUrcipyO3JldHVybiBpPDFlLTEyJiYobj1wXyxlPWRfLHI9dl8sc188a18mJihuPWZfLGU9bF8scj1oXyksKGk9bipuK2UqZStyKnIpPDFlLTEyKT9bTmFOLE5hTl06W1JfKGUsbikqQ18sbXIoci9CXyhpKSkqQ19dfSxleT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19LHJ5PWZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZShlLHIpe3JldHVybiBlPXQoZSxyKSxuKGVbMF0sZVsxXSl9cmV0dXJuIHQuaW52ZXJ0JiZuLmludmVydCYmKGUuaW52ZXJ0PWZ1bmN0aW9uKGUscil7cmV0dXJuKGU9bi5pbnZlcnQoZSxyKSkmJnQuaW52ZXJ0KGVbMF0sZVsxXSl9KSxlfTtlaS5pbnZlcnQ9ZWk7dmFyIGl5LG95LHV5LGF5LGN5LHN5LGZ5LGx5LGh5LHB5LGR5LHZ5PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4obil7cmV0dXJuIG49dChuWzBdKnpfLG5bMV0qel8pLG5bMF0qPUNfLG5bMV0qPUNfLG59cmV0dXJuIHQ9cmkodFswXSp6Xyx0WzFdKnpfLHQubGVuZ3RoPjI/dFsyXSp6XzowKSxuLmludmVydD1mdW5jdGlvbihuKXtyZXR1cm4gbj10LmludmVydChuWzBdKnpfLG5bMV0qel8pLG5bMF0qPUNfLG5bMV0qPUNfLG59LG59LF95PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LG4pe2UucHVzaCh0PXIodCxuKSksdFswXSo9Q18sdFsxXSo9Q199ZnVuY3Rpb24gbigpe3ZhciB0PWkuYXBwbHkodGhpcyxhcmd1bWVudHMpLG49by5hcHBseSh0aGlzLGFyZ3VtZW50cykqel8sYz11LmFwcGx5KHRoaXMsYXJndW1lbnRzKSp6XztyZXR1cm4gZT1bXSxyPXJpKC10WzBdKnpfLC10WzFdKnpfLDApLmludmVydCxhaShhLG4sYywxKSx0PXt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbZV19LGU9cj1udWxsLHR9dmFyIGUscixpPWV5KFswLDBdKSxvPWV5KDkwKSx1PWV5KDYpLGE9e3BvaW50OnR9O3JldHVybiBuLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmV5KFsrdFswXSwrdFsxXV0pLG4pOml9LG4ucmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZXkoK3QpLG4pOm99LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZXkoK3QpLG4pOnV9LG59LHl5PWZ1bmN0aW9uKCl7dmFyIHQsbj1bXTtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24obixlKXt0LnB1c2goW24sZV0pfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtuLnB1c2godD1bXSl9LGxpbmVFbmQ6YnIscmVqb2luOmZ1bmN0aW9uKCl7bi5sZW5ndGg+MSYmbi5wdXNoKG4ucG9wKCkuY29uY2F0KG4uc2hpZnQoKSkpfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgZT1uO3JldHVybiBuPVtdLHQ9bnVsbCxlfX19LGd5PWZ1bmN0aW9uKHQsbixlLHIsaSxvKXt2YXIgdSxhPXRbMF0sYz10WzFdLHM9blswXSxmPW5bMV0sbD0wLGg9MSxwPXMtYSxkPWYtYztpZih1PWUtYSxwfHwhKHU+MCkpe2lmKHUvPXAscDwwKXtpZih1PGwpcmV0dXJuO3U8aCYmKGg9dSl9ZWxzZSBpZihwPjApe2lmKHU+aClyZXR1cm47dT5sJiYobD11KX1pZih1PWktYSxwfHwhKHU8MCkpe2lmKHUvPXAscDwwKXtpZih1PmgpcmV0dXJuO3U+bCYmKGw9dSl9ZWxzZSBpZihwPjApe2lmKHU8bClyZXR1cm47dTxoJiYoaD11KX1pZih1PXItYyxkfHwhKHU+MCkpe2lmKHUvPWQsZDwwKXtpZih1PGwpcmV0dXJuO3U8aCYmKGg9dSl9ZWxzZSBpZihkPjApe2lmKHU+aClyZXR1cm47dT5sJiYobD11KX1pZih1PW8tYyxkfHwhKHU8MCkpe2lmKHUvPWQsZDwwKXtpZih1PmgpcmV0dXJuO3U+bCYmKGw9dSl9ZWxzZSBpZihkPjApe2lmKHU8bClyZXR1cm47dTxoJiYoaD11KX1yZXR1cm4gbD4wJiYodFswXT1hK2wqcCx0WzFdPWMrbCpkKSxoPDEmJihuWzBdPWEraCpwLG5bMV09YytoKmQpLCEwfX19fX0sbXk9ZnVuY3Rpb24odCxuKXtyZXR1cm4gUF8odFswXS1uWzBdKTxrXyYmUF8odFsxXS1uWzFdKTxrX30seHk9ZnVuY3Rpb24odCxuLGUscixpKXt2YXIgbyx1LGE9W10sYz1bXTtpZih0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoISgobj10Lmxlbmd0aC0xKTw9MCkpe3ZhciBuLGUscj10WzBdLHU9dFtuXTtpZihteShyLHUpKXtmb3IoaS5saW5lU3RhcnQoKSxvPTA7bzxuOysrbylpLnBvaW50KChyPXRbb10pWzBdLHJbMV0pO3JldHVybiB2b2lkIGkubGluZUVuZCgpfWEucHVzaChlPW5ldyBzaShyLHQsbnVsbCwhMCkpLGMucHVzaChlLm89bmV3IHNpKHIsbnVsbCxlLCExKSksYS5wdXNoKGU9bmV3IHNpKHUsdCxudWxsLCExKSksYy5wdXNoKGUubz1uZXcgc2kodSxudWxsLGUsITApKX19KSxhLmxlbmd0aCl7Zm9yKGMuc29ydChuKSxmaShhKSxmaShjKSxvPTAsdT1jLmxlbmd0aDtvPHU7KytvKWNbb10uZT1lPSFlO2Zvcih2YXIgcyxmLGw9YVswXTs7KXtmb3IodmFyIGg9bCxwPSEwO2gudjspaWYoKGg9aC5uKT09PWwpcmV0dXJuO3M9aC56LGkubGluZVN0YXJ0KCk7ZG97aWYoaC52PWguby52PSEwLGguZSl7aWYocClmb3Iobz0wLHU9cy5sZW5ndGg7bzx1OysrbylpLnBvaW50KChmPXNbb10pWzBdLGZbMV0pO2Vsc2UgcihoLngsaC5uLngsMSxpKTtoPWgubn1lbHNle2lmKHApZm9yKHM9aC5wLnosbz1zLmxlbmd0aC0xO28+PTA7LS1vKWkucG9pbnQoKGY9c1tvXSlbMF0sZlsxXSk7ZWxzZSByKGgueCxoLnAueCwtMSxpKTtoPWgucH1oPWgubyxzPWgueixwPSFwfXdoaWxlKCFoLnYpO2kubGluZUVuZCgpfX19LGJ5PTFlOSx3eT0tYnksTXk9ZnVuY3Rpb24oKXt2YXIgdCxuLGUscj0wLGk9MCxvPTk2MCx1PTUwMDtyZXR1cm4gZT17c3RyZWFtOmZ1bmN0aW9uKGUpe3JldHVybiB0JiZuPT09ZT90OnQ9bGkocixpLG8sdSkobj1lKX0sZXh0ZW50OmZ1bmN0aW9uKGEpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSthWzBdWzBdLGk9K2FbMF1bMV0sbz0rYVsxXVswXSx1PSthWzFdWzFdLHQ9bj1udWxsLGUpOltbcixpXSxbbyx1XV19fX0sVHk9JHYoKSxreT1mdW5jdGlvbih0LG4pe3ZhciBlPW5bMF0scj1uWzFdLGk9W0lfKGUpLC1xXyhlKSwwXSxvPTAsdT0wO1R5LnJlc2V0KCk7Zm9yKHZhciBhPTAsYz10Lmxlbmd0aDthPGM7KythKWlmKGY9KHM9dFthXSkubGVuZ3RoKWZvcih2YXIgcyxmLGw9c1tmLTFdLGg9bFswXSxwPWxbMV0vMitFXyxkPUlfKHApLHY9cV8ocCksXz0wO188ZjsrK18saD1nLGQ9eCx2PWIsbD15KXt2YXIgeT1zW19dLGc9eVswXSxtPXlbMV0vMitFXyx4PUlfKG0pLGI9cV8obSksdz1nLWgsTT13Pj0wPzE6LTEsVD1NKncsaz1UPk5fLE49ZCp4O2lmKFR5LmFkZChSXyhOKk0qSV8oVCksdipiK04qcV8oVCkpKSxvKz1rP3crTSpBXzp3LGteaD49ZV5nPj1lKXt2YXIgUz1QcihDcihsKSxDcih5KSk7cXIoUyk7dmFyIEU9UHIoaSxTKTtxcihFKTt2YXIgQT0oa153Pj0wPy0xOjEpKm1yKEVbMl0pOyhyPkF8fHI9PT1BJiYoU1swXXx8U1sxXSkpJiYodSs9a153Pj0wPzE6LTEpfX1yZXR1cm4obzwta198fG88a18mJlR5PC1rXyleMSZ1fSxOeT0kdigpLFN5PXtzcGhlcmU6YnIscG9pbnQ6YnIsbGluZVN0YXJ0OmhpLGxpbmVFbmQ6YnIscG9seWdvblN0YXJ0OmJyLHBvbHlnb25FbmQ6YnJ9LEV5PWZ1bmN0aW9uKHQpe3JldHVybiBOeS5yZXNldCgpLCRfKHQsU3kpLCtOeX0sQXk9W251bGwsbnVsbF0sQ3k9e3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOkF5fSx6eT1mdW5jdGlvbih0LG4pe3JldHVybiBBeVswXT10LEF5WzFdPW4sRXkoQ3kpfSxQeT17RmVhdHVyZTpmdW5jdGlvbih0LG4pe3JldHVybiBfaSh0Lmdlb21ldHJ5LG4pfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmZlYXR1cmVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspaWYoX2koZVtyXS5nZW9tZXRyeSxuKSlyZXR1cm4hMDtyZXR1cm4hMX19LEx5PXtTcGhlcmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sUG9pbnQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4geWkodC5jb29yZGluYXRlcyxuKX0sTXVsdGlQb2ludDpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspaWYoeWkoZVtyXSxuKSlyZXR1cm4hMDtyZXR1cm4hMX0sTGluZVN0cmluZzpmdW5jdGlvbih0LG4pe3JldHVybiBnaSh0LmNvb3JkaW5hdGVzLG4pfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGdpKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9LFBvbHlnb246ZnVuY3Rpb24odCxuKXtyZXR1cm4gbWkodC5jb29yZGluYXRlcyxuKX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZihtaShlW3JdLG4pKXJldHVybiEwO3JldHVybiExfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5nZW9tZXRyaWVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspaWYoX2koZVtyXSxuKSlyZXR1cm4hMDtyZXR1cm4hMX19LFJ5PWZ1bmN0aW9uKHQsbil7cmV0dXJuKHQmJlB5Lmhhc093blByb3BlcnR5KHQudHlwZSk/UHlbdC50eXBlXTpfaSkodCxuKX0scXk9ZnVuY3Rpb24odCxuKXt2YXIgZT10WzBdKnpfLHI9dFsxXSp6XyxpPW5bMF0qel8sbz1uWzFdKnpfLHU9cV8ociksYT1JXyhyKSxjPXFfKG8pLHM9SV8obyksZj11KnFfKGUpLGw9dSpJXyhlKSxoPWMqcV8oaSkscD1jKklfKGkpLGQ9MiptcihCXyh4cihvLXIpK3UqYyp4cihpLWUpKSksdj1JXyhkKSxfPWQ/ZnVuY3Rpb24odCl7dmFyIG49SV8odCo9ZCkvdixlPUlfKGQtdCkvdixyPWUqZituKmgsaT1lKmwrbipwLG89ZSphK24qcztyZXR1cm5bUl8oaSxyKSpDXyxSXyhvLEJfKHIqcitpKmkpKSpDX119OmZ1bmN0aW9uKCl7cmV0dXJuW2UqQ18scipDX119O3JldHVybiBfLmRpc3RhbmNlPWQsX30sVXk9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LER5PSR2KCksT3k9JHYoKSxGeT17cG9pbnQ6YnIsbGluZVN0YXJ0OmJyLGxpbmVFbmQ6YnIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7RnkubGluZVN0YXJ0PU5pLEZ5LmxpbmVFbmQ9QWl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtGeS5saW5lU3RhcnQ9RnkubGluZUVuZD1GeS5wb2ludD1icixEeS5hZGQoUF8oT3kpKSxPeS5yZXNldCgpfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD1EeS8yO3JldHVybiBEeS5yZXNldCgpLHR9fSxJeT0xLzAsWXk9SXksQnk9LUl5LEh5PUJ5LGp5PXtwb2ludDpDaSxsaW5lU3RhcnQ6YnIsbGluZUVuZDpicixwb2x5Z29uU3RhcnQ6YnIscG9seWdvbkVuZDpicixyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD1bW0l5LFl5XSxbQnksSHldXTtyZXR1cm4gQnk9SHk9LShZeT1JeT0xLzApLHR9fSxYeT0wLCR5PTAsVnk9MCxXeT0wLFp5PTAsR3k9MCxKeT0wLFF5PTAsS3k9MCx0Zz17cG9pbnQ6emksbGluZVN0YXJ0OlBpLGxpbmVFbmQ6cWkscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGcubGluZVN0YXJ0PVVpLHRnLmxpbmVFbmQ9RGl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0Zy5wb2ludD16aSx0Zy5saW5lU3RhcnQ9UGksdGcubGluZUVuZD1xaX0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9S3k/W0p5L0t5LFF5L0t5XTpHeT9bV3kvR3ksWnkvR3ldOlZ5P1tYeS9WeSwkeS9WeV06W05hTixOYU5dO3JldHVybiBYeT0keT1WeT1XeT1aeT1HeT1KeT1ReT1LeT0wLHR9fTtJaS5wcm90b3R5cGU9e19yYWRpdXM6NC41LHBvaW50UmFkaXVzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yYWRpdXM9dCx0aGlzfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpezA9PT10aGlzLl9saW5lJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX3BvaW50PU5hTn0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pLHRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX2NvbnRleHQubGluZVRvKHQsbik7YnJlYWs7ZGVmYXVsdDp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0K3RoaXMuX3JhZGl1cyxuKSx0aGlzLl9jb250ZXh0LmFyYyh0LG4sdGhpcy5fcmFkaXVzLDAsQV8pfX0scmVzdWx0OmJyfTt2YXIgbmcsZWcscmcsaWcsb2csdWc9JHYoKSxhZz17cG9pbnQ6YnIsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7YWcucG9pbnQ9WWl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtuZyYmQmkoZWcscmcpLGFnLnBvaW50PWJyfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtuZz0hMH0scG9seWdvbkVuZDpmdW5jdGlvbigpe25nPW51bGx9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PSt1ZztyZXR1cm4gdWcucmVzZXQoKSx0fX07SGkucHJvdG90eXBlPXtfcmFkaXVzOjQuNSxfY2lyY2xlOmppKDQuNSkscG9pbnRSYWRpdXM6ZnVuY3Rpb24odCl7cmV0dXJuKHQ9K3QpIT09dGhpcy5fcmFkaXVzJiYodGhpcy5fcmFkaXVzPXQsdGhpcy5fY2lyY2xlPW51bGwpLHRoaXN9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MD09PXRoaXMuX2xpbmUmJnRoaXMuX3N0cmluZy5wdXNoKCJaIiksdGhpcy5fcG9pbnQ9TmFOfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3N0cmluZy5wdXNoKCJNIix0LCIsIixuKSx0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9zdHJpbmcucHVzaCgiTCIsdCwiLCIsbik7YnJlYWs7ZGVmYXVsdDpudWxsPT10aGlzLl9jaXJjbGUmJih0aGlzLl9jaXJjbGU9amkodGhpcy5fcmFkaXVzKSksdGhpcy5fc3RyaW5nLnB1c2goIk0iLHQsIiwiLG4sdGhpcy5fY2lyY2xlKX19LHJlc3VsdDpmdW5jdGlvbigpe2lmKHRoaXMuX3N0cmluZy5sZW5ndGgpe3ZhciB0PXRoaXMuX3N0cmluZy5qb2luKCIiKTtyZXR1cm4gdGhpcy5fc3RyaW5nPVtdLHR9cmV0dXJuIG51bGx9fTt2YXIgY2c9ZnVuY3Rpb24odCxuKXtmdW5jdGlvbiBlKHQpe3JldHVybiB0JiYoImZ1bmN0aW9uIj09dHlwZW9mIG8mJmkucG9pbnRSYWRpdXMoK28uYXBwbHkodGhpcyxhcmd1bWVudHMpKSwkXyh0LHIoaSkpKSxpLnJlc3VsdCgpfXZhciByLGksbz00LjU7cmV0dXJuIGUuYXJlYT1mdW5jdGlvbih0KXtyZXR1cm4gJF8odCxyKEZ5KSksRnkucmVzdWx0KCl9LGUubWVhc3VyZT1mdW5jdGlvbih0KXtyZXR1cm4gJF8odCxyKGFnKSksYWcucmVzdWx0KCl9LGUuYm91bmRzPWZ1bmN0aW9uKHQpe3JldHVybiAkXyh0LHIoankpKSxqeS5yZXN1bHQoKX0sZS5jZW50cm9pZD1mdW5jdGlvbih0KXtyZXR1cm4gJF8odCxyKHRnKSksdGcucmVzdWx0KCl9LGUucHJvamVjdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT1uPyh0PW51bGwsVXkpOih0PW4pLnN0cmVhbSxlKTp0fSxlLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09dD8obj1udWxsLG5ldyBIaSk6bmV3IElpKG49dCksImZ1bmN0aW9uIiE9dHlwZW9mIG8mJmkucG9pbnRSYWRpdXMobyksZSk6bn0sZS5wb2ludFJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OihpLnBvaW50UmFkaXVzKCt0KSwrdCksZSk6b30sZS5wcm9qZWN0aW9uKHQpLmNvbnRleHQobil9LHNnPWZ1bmN0aW9uKHQsbixlLHIpe3JldHVybiBmdW5jdGlvbihpLG8pe2Z1bmN0aW9uIHUobixlKXt2YXIgcj1pKG4sZSk7dChuPXJbMF0sZT1yWzFdKSYmby5wb2ludChuLGUpfWZ1bmN0aW9uIGEodCxuKXt2YXIgZT1pKHQsbik7Xy5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIGMoKXtiLnBvaW50PWEsXy5saW5lU3RhcnQoKX1mdW5jdGlvbiBzKCl7Yi5wb2ludD11LF8ubGluZUVuZCgpfWZ1bmN0aW9uIGYodCxuKXt2LnB1c2goW3Qsbl0pO3ZhciBlPWkodCxuKTttLnBvaW50KGVbMF0sZVsxXSl9ZnVuY3Rpb24gbCgpe20ubGluZVN0YXJ0KCksdj1bXX1mdW5jdGlvbiBoKCl7Zih2WzBdWzBdLHZbMF1bMV0pLG0ubGluZUVuZCgpO3ZhciB0LG4sZSxyLGk9bS5jbGVhbigpLHU9Zy5yZXN1bHQoKSxhPXUubGVuZ3RoO2lmKHYucG9wKCkscC5wdXNoKHYpLHY9bnVsbCxhKWlmKDEmaSl7aWYoZT11WzBdLChuPWUubGVuZ3RoLTEpPjApe2Zvcih4fHwoby5wb2x5Z29uU3RhcnQoKSx4PSEwKSxvLmxpbmVTdGFydCgpLHQ9MDt0PG47Kyt0KW8ucG9pbnQoKHI9ZVt0XSlbMF0sclsxXSk7by5saW5lRW5kKCl9fWVsc2UgYT4xJiYyJmkmJnUucHVzaCh1LnBvcCgpLmNvbmNhdCh1LnNoaWZ0KCkpKSxkLnB1c2godS5maWx0ZXIoWGkpKX12YXIgcCxkLHYsXz1uKG8pLHk9aS5pbnZlcnQoclswXSxyWzFdKSxnPXl5KCksbT1uKGcpLHg9ITEsYj17cG9pbnQ6dSxsaW5lU3RhcnQ6YyxsaW5lRW5kOnMscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Yi5wb2ludD1mLGIubGluZVN0YXJ0PWwsYi5saW5lRW5kPWgsZD1bXSxwPVtdfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7Yi5wb2ludD11LGIubGluZVN0YXJ0PWMsYi5saW5lRW5kPXMsZD1iZihkKTt2YXIgdD1reShwLHkpO2QubGVuZ3RoPyh4fHwoby5wb2x5Z29uU3RhcnQoKSx4PSEwKSx4eShkLCRpLHQsZSxvKSk6dCYmKHh8fChvLnBvbHlnb25TdGFydCgpLHg9ITApLG8ubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxvKSxvLmxpbmVFbmQoKSkseCYmKG8ucG9seWdvbkVuZCgpLHg9ITEpLGQ9cD1udWxsfSxzcGhlcmU6ZnVuY3Rpb24oKXtvLnBvbHlnb25TdGFydCgpLG8ubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxvKSxvLmxpbmVFbmQoKSxvLnBvbHlnb25FbmQoKX19O3JldHVybiBifX0sZmc9c2coZnVuY3Rpb24oKXtyZXR1cm4hMH0sVmksWmksWy1OXywtU19dKSxsZz1mdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGUoZSxyLGksbyl7YWkobyx0LG4saSxlLHIpfWZ1bmN0aW9uIHIodCxuKXtyZXR1cm4gcV8odCkqcV8obik+YX1mdW5jdGlvbiBpKHQpe3ZhciBuLGUsaSxhLGY7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2E9aT0hMSxmPTF9LHBvaW50OmZ1bmN0aW9uKGwsaCl7dmFyIHAsZD1bbCxoXSx2PXIobCxoKSxfPWM/dj8wOnUobCxoKTp2P3UobCsobDwwP05fOi1OXyksaCk6MDtpZighbiYmKGE9aT12KSYmdC5saW5lU3RhcnQoKSx2IT09aSYmKCEocD1vKG4sZCkpfHxteShuLHApfHxteShkLHApKSYmKGRbMF0rPWtfLGRbMV0rPWtfLHY9cihkWzBdLGRbMV0pKSx2IT09aSlmPTAsdj8odC5saW5lU3RhcnQoKSxwPW8oZCxuKSx0LnBvaW50KHBbMF0scFsxXSkpOihwPW8obixkKSx0LnBvaW50KHBbMF0scFsxXSksdC5saW5lRW5kKCkpLG49cDtlbHNlIGlmKHMmJm4mJmNedil7dmFyIHk7XyZlfHwhKHk9byhkLG4sITApKXx8KGY9MCxjPyh0LmxpbmVTdGFydCgpLHQucG9pbnQoeVswXVswXSx5WzBdWzFdKSx0LnBvaW50KHlbMV1bMF0seVsxXVsxXSksdC5saW5lRW5kKCkpOih0LnBvaW50KHlbMV1bMF0seVsxXVsxXSksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHlbMF1bMF0seVswXVsxXSkpKX0hdnx8biYmbXkobixkKXx8dC5wb2ludChkWzBdLGRbMV0pLG49ZCxpPXYsZT1ffSxsaW5lRW5kOmZ1bmN0aW9uKCl7aSYmdC5saW5lRW5kKCksbj1udWxsfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiBmfChhJiZpKTw8MX19fWZ1bmN0aW9uIG8odCxuLGUpe3ZhciByPUNyKHQpLGk9Q3Iobiksbz1bMSwwLDBdLHU9UHIocixpKSxjPXpyKHUsdSkscz11WzBdLGY9Yy1zKnM7aWYoIWYpcmV0dXJuIWUmJnQ7dmFyIGw9YSpjL2YsaD0tYSpzL2YscD1QcihvLHUpLGQ9UnIobyxsKTtMcihkLFJyKHUsaCkpO3ZhciB2PXAsXz16cihkLHYpLHk9enIodix2KSxnPV8qXy15Kih6cihkLGQpLTEpO2lmKCEoZzwwKSl7dmFyIG09Ql8oZykseD1Scih2LCgtXy1tKS95KTtpZihMcih4LGQpLHg9QXIoeCksIWUpcmV0dXJuIHg7dmFyIGIsdz10WzBdLE09blswXSxUPXRbMV0saz1uWzFdO008dyYmKGI9dyx3PU0sTT1iKTt2YXIgTj1NLXcsUz1QXyhOLU5fKTxrXyxFPVN8fE48a187aWYoIVMmJms8VCYmKGI9VCxUPWssaz1iKSxFP1M/VCtrPjBeeFsxXTwoUF8oeFswXS13KTxrXz9UOmspOlQ8PXhbMV0mJnhbMV08PWs6Tj5OX14odzw9eFswXSYmeFswXTw9TSkpe3ZhciBBPVJyKHYsKC1fK20pL3kpO3JldHVybiBMcihBLGQpLFt4LEFyKEEpXX19fWZ1bmN0aW9uIHUobixlKXt2YXIgcj1jP3Q6Tl8tdCxpPTA7cmV0dXJuIG48LXI/aXw9MTpuPnImJihpfD0yKSxlPC1yP2l8PTQ6ZT5yJiYoaXw9OCksaX12YXIgYT1xXyh0KSxjPWE+MCxzPVBfKGEpPmtfO3JldHVybiBzZyhyLGksZSxjP1swLC10XTpbLU5fLHQtTl9dKX0saGc9ZnVuY3Rpb24odCl7cmV0dXJue3N0cmVhbTpHaSh0KX19O0ppLnByb3RvdHlwZT17Y29uc3RydWN0b3I6SmkscG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLnN0cmVhbS5wb2ludCh0LG4pfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX07dmFyIHBnPTE2LGRnPXFfKDMwKnpfKSx2Zz1mdW5jdGlvbih0LG4pe3JldHVybituP25vKHQsbik6dG8odCl9LF9nPUdpKHtwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuc3RyZWFtLnBvaW50KHQqel8sbip6Xyl9fSkseWc9ZnVuY3Rpb24oKXtyZXR1cm4gaW8odW8pLnNjYWxlKDE1NS40MjQpLmNlbnRlcihbMCwzMy42NDQyXSl9LGdnPWZ1bmN0aW9uKCl7cmV0dXJuIHlnKCkucGFyYWxsZWxzKFsyOS41LDQ1LjVdKS5zY2FsZSgxMDcwKS50cmFuc2xhdGUoWzQ4MCwyNTBdKS5yb3RhdGUoWzk2LDBdKS5jZW50ZXIoWy0uNiwzOC43XSl9LG1nPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgbj10WzBdLGU9dFsxXTtyZXR1cm4gYT1udWxsLGkucG9pbnQobixlKSxhfHwoby5wb2ludChuLGUpLGEpfHwodS5wb2ludChuLGUpLGEpfWZ1bmN0aW9uIG4oKXtyZXR1cm4gZT1yPW51bGwsdH12YXIgZSxyLGksbyx1LGEsYz1nZygpLHM9eWcoKS5yb3RhdGUoWzE1NCwwXSkuY2VudGVyKFstMiw1OC41XSkucGFyYWxsZWxzKFs1NSw2NV0pLGY9eWcoKS5yb3RhdGUoWzE1NywwXSkuY2VudGVyKFstMywxOS45XSkucGFyYWxsZWxzKFs4LDE4XSksbD17cG9pbnQ6ZnVuY3Rpb24odCxuKXthPVt0LG5dfX07cmV0dXJuIHQuaW52ZXJ0PWZ1bmN0aW9uKHQpe3ZhciBuPWMuc2NhbGUoKSxlPWMudHJhbnNsYXRlKCkscj0odFswXS1lWzBdKS9uLGk9KHRbMV0tZVsxXSkvbjtyZXR1cm4oaT49LjEyJiZpPC4yMzQmJnI+PS0uNDI1JiZyPC0uMjE0P3M6aT49LjE2NiYmaTwuMjM0JiZyPj0tLjIxNCYmcjwtLjExNT9mOmMpLmludmVydCh0KX0sdC5zdHJlYW09ZnVuY3Rpb24odCl7cmV0dXJuIGUmJnI9PT10P2U6ZT1hbyhbYy5zdHJlYW0ocj10KSxzLnN0cmVhbSh0KSxmLnN0cmVhbSh0KV0pfSx0LnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYy5wcmVjaXNpb24odCkscy5wcmVjaXNpb24odCksZi5wcmVjaXNpb24odCksbigpKTpjLnByZWNpc2lvbigpfSx0LnNjYWxlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjLnNjYWxlKG4pLHMuc2NhbGUoLjM1Km4pLGYuc2NhbGUobiksdC50cmFuc2xhdGUoYy50cmFuc2xhdGUoKSkpOmMuc2NhbGUoKX0sdC50cmFuc2xhdGU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGMudHJhbnNsYXRlKCk7dmFyIGU9Yy5zY2FsZSgpLHI9K3RbMF0sYT0rdFsxXTtyZXR1cm4gaT1jLnRyYW5zbGF0ZSh0KS5jbGlwRXh0ZW50KFtbci0uNDU1KmUsYS0uMjM4KmVdLFtyKy40NTUqZSxhKy4yMzgqZV1dKS5zdHJlYW0obCksbz1zLnRyYW5zbGF0ZShbci0uMzA3KmUsYSsuMjAxKmVdKS5jbGlwRXh0ZW50KFtbci0uNDI1KmUra18sYSsuMTIqZStrX10sW3ItLjIxNCplLWtfLGErLjIzNCplLWtfXV0pLnN0cmVhbShsKSx1PWYudHJhbnNsYXRlKFtyLS4yMDUqZSxhKy4yMTIqZV0pLmNsaXBFeHRlbnQoW1tyLS4yMTQqZStrXyxhKy4xNjYqZStrX10sW3ItLjExNSplLWtfLGErLjIzNCplLWtfXV0pLnN0cmVhbShsKSxuKCl9LHQuZml0RXh0ZW50PWZ1bmN0aW9uKG4sZSl7cmV0dXJuIFFpKHQsbixlKX0sdC5maXRTaXplPWZ1bmN0aW9uKG4sZSl7cmV0dXJuIEtpKHQsbixlKX0sdC5zY2FsZSgxMDcwKX0seGc9Y28oZnVuY3Rpb24odCl7cmV0dXJuIEJfKDIvKDErdCkpfSk7eGcuaW52ZXJ0PXNvKGZ1bmN0aW9uKHQpe3JldHVybiAyKm1yKHQvMil9KTt2YXIgYmc9ZnVuY3Rpb24oKXtyZXR1cm4gZW8oeGcpLnNjYWxlKDEyNC43NSkuY2xpcEFuZ2xlKDE3OS45OTkpfSx3Zz1jbyhmdW5jdGlvbih0KXtyZXR1cm4odD1ncih0KSkmJnQvSV8odCl9KTt3Zy5pbnZlcnQ9c28oZnVuY3Rpb24odCl7cmV0dXJuIHR9KTt2YXIgTWc9ZnVuY3Rpb24oKXtyZXR1cm4gZW8od2cpLnNjYWxlKDc5LjQxODgpLmNsaXBBbmdsZSgxNzkuOTk5KX07Zm8uaW52ZXJ0PWZ1bmN0aW9uKHQsbil7cmV0dXJuW3QsMipMXyhEXyhuKSktU19dfTt2YXIgVGc9ZnVuY3Rpb24oKXtyZXR1cm4gbG8oZm8pLnNjYWxlKDk2MS9BXyl9LGtnPWZ1bmN0aW9uKCl7cmV0dXJuIGlvKHBvKS5zY2FsZSgxMDkuNSkucGFyYWxsZWxzKFszMCwzMF0pfTt2by5pbnZlcnQ9dm87dmFyIE5nPWZ1bmN0aW9uKCl7cmV0dXJuIGVvKHZvKS5zY2FsZSgxNTIuNjMpfSxTZz1mdW5jdGlvbigpe3JldHVybiBpbyhfbykuc2NhbGUoMTMxLjE1NCkuY2VudGVyKFswLDEzLjkzODldKX07eW8uaW52ZXJ0PXNvKExfKTt2YXIgRWc9ZnVuY3Rpb24oKXtyZXR1cm4gZW8oeW8pLnNjYWxlKDE0NC4wNDkpLmNsaXBBbmdsZSg2MCl9LEFnPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3JldHVybiBpPW89bnVsbCx1fXZhciBuLGUscixpLG8sdSxhPTEsYz0wLHM9MCxmPTEsbD0xLGg9VXkscD1udWxsLGQ9VXk7cmV0dXJuIHU9e3N0cmVhbTpmdW5jdGlvbih0KXtyZXR1cm4gaSYmbz09PXQ/aTppPWgoZChvPXQpKX0sY2xpcEV4dGVudDpmdW5jdGlvbihpKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1udWxsPT1pPyhwPW49ZT1yPW51bGwsVXkpOmxpKHA9K2lbMF1bMF0sbj0raVswXVsxXSxlPStpWzFdWzBdLHI9K2lbMV1bMV0pLHQoKSk6bnVsbD09cD9udWxsOltbcCxuXSxbZSxyXV19LHNjYWxlOmZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPWdvKChhPStuKSpmLGEqbCxjLHMpLHQoKSk6YX0sdHJhbnNsYXRlOmZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPWdvKGEqZixhKmwsYz0rblswXSxzPStuWzFdKSx0KCkpOltjLHNdfSxyZWZsZWN0WDpmdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD1nbyhhKihmPW4/LTE6MSksYSpsLGMscyksdCgpKTpmPDB9LHJlZmxlY3RZOmZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPWdvKGEqZixhKihsPW4/LTE6MSksYyxzKSx0KCkpOmw8MH0sZml0RXh0ZW50OmZ1bmN0aW9uKHQsbil7cmV0dXJuIFFpKHUsdCxuKX0sZml0U2l6ZTpmdW5jdGlvbih0LG4pe3JldHVybiBLaSh1LHQsbil9fX07bW8uaW52ZXJ0PXNvKG1yKTt2YXIgQ2c9ZnVuY3Rpb24oKXtyZXR1cm4gZW8obW8pLnNjYWxlKDI0OS41KS5jbGlwQW5nbGUoOTAra18pfTt4by5pbnZlcnQ9c28oZnVuY3Rpb24odCl7cmV0dXJuIDIqTF8odCl9KTt2YXIgemc9ZnVuY3Rpb24oKXtyZXR1cm4gZW8oeG8pLnNjYWxlKDI1MCkuY2xpcEFuZ2xlKDE0Mil9O2JvLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVyblstbiwyKkxfKERfKHQpKS1TX119O3ZhciBQZz1mdW5jdGlvbigpe3ZhciB0PWxvKGJvKSxuPXQuY2VudGVyLGU9dC5yb3RhdGU7cmV0dXJuIHQuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oWy10WzFdLHRbMF1dKToodD1uKCksW3RbMV0sLXRbMF1dKX0sdC5yb3RhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/ZShbdFswXSx0WzFdLHQubGVuZ3RoPjI/dFsyXSs5MDo5MF0pOih0PWUoKSxbdFswXSx0WzFdLHRbMl0tOTBdKX0sZShbMCwwLDkwXSkuc2NhbGUoMTU5LjE1NSl9LExnPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgbyx1PTA7dC5lYWNoQWZ0ZXIoZnVuY3Rpb24odCl7dmFyIGU9dC5jaGlsZHJlbjtlPyh0Lng9TW8oZSksdC55PWtvKGUpKToodC54PW8/dSs9bih0LG8pOjAsdC55PTAsbz10KX0pO3ZhciBhPVNvKHQpLGM9RW8odCkscz1hLngtbihhLGMpLzIsZj1jLngrbihjLGEpLzI7cmV0dXJuIHQuZWFjaEFmdGVyKGk/ZnVuY3Rpb24obil7bi54PShuLngtdC54KSplLG4ueT0odC55LW4ueSkqcn06ZnVuY3Rpb24obil7bi54PShuLngtcykvKGYtcykqZSxuLnk9KDEtKHQueT9uLnkvdC55OjEpKSpyfSl9dmFyIG49d28sZT0xLHI9MSxpPSExO3JldHVybiB0LnNlcGFyYXRpb249ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ZSx0KTpufSx0LnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ITEsZT0rblswXSxyPStuWzFdLHQpOmk/bnVsbDpbZSxyXX0sdC5ub2RlU2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0hMCxlPStuWzBdLHI9K25bMV0sdCk6aT9bZSxyXTpudWxsfSx0fSxSZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2hBZnRlcihBbyl9LHFnPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpLG89dGhpcyx1PVtvXTtkb3tmb3Iobj11LnJldmVyc2UoKSx1PVtdO289bi5wb3AoKTspaWYodChvKSxlPW8uY2hpbGRyZW4pZm9yKHI9MCxpPWUubGVuZ3RoO3I8aTsrK3IpdS5wdXNoKGVbcl0pfXdoaWxlKHUubGVuZ3RoKTtyZXR1cm4gdGhpc30sVWc9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscj10aGlzLGk9W3JdO3I9aS5wb3AoKTspaWYodChyKSxuPXIuY2hpbGRyZW4pZm9yKGU9bi5sZW5ndGgtMTtlPj0wOy0tZSlpLnB1c2gobltlXSk7cmV0dXJuIHRoaXN9LERnPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHIsaT10aGlzLG89W2ldLHU9W107aT1vLnBvcCgpOylpZih1LnB1c2goaSksbj1pLmNoaWxkcmVuKWZvcihlPTAscj1uLmxlbmd0aDtlPHI7KytlKW8ucHVzaChuW2VdKTtmb3IoO2k9dS5wb3AoKTspdChpKTtyZXR1cm4gdGhpc30sT2c9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaEFmdGVyKGZ1bmN0aW9uKG4pe2Zvcih2YXIgZT0rdChuLmRhdGEpfHwwLHI9bi5jaGlsZHJlbixpPXImJnIubGVuZ3RoOy0taT49MDspZSs9cltpXS52YWx1ZTtuLnZhbHVlPWV9KX0sRmc9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaEJlZm9yZShmdW5jdGlvbihuKXtuLmNoaWxkcmVuJiZuLmNoaWxkcmVuLnNvcnQodCl9KX0sSWc9ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMsZT1DbyhuLHQpLHI9W25dO24hPT1lOyluPW4ucGFyZW50LHIucHVzaChuKTtmb3IodmFyIGk9ci5sZW5ndGg7dCE9PWU7KXIuc3BsaWNlKGksMCx0KSx0PXQucGFyZW50O3JldHVybiByfSxZZz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLG49W3RdO3Q9dC5wYXJlbnQ7KW4ucHVzaCh0KTtyZXR1cm4gbn0sQmc9ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3QucHVzaChuKX0pLHR9LEhnPWZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMuZWFjaEJlZm9yZShmdW5jdGlvbihuKXtuLmNoaWxkcmVufHx0LnB1c2gobil9KSx0fSxqZz1mdW5jdGlvbigpe3ZhciB0PXRoaXMsbj1bXTtyZXR1cm4gdC5lYWNoKGZ1bmN0aW9uKGUpe2UhPT10JiZuLnB1c2goe3NvdXJjZTplLnBhcmVudCx0YXJnZXQ6ZX0pfSksbn07VW8ucHJvdG90eXBlPXpvLnByb3RvdHlwZT17Y29uc3RydWN0b3I6VW8sY291bnQ6UmcsZWFjaDpxZyxlYWNoQWZ0ZXI6RGcsZWFjaEJlZm9yZTpVZyxzdW06T2csc29ydDpGZyxwYXRoOklnLGFuY2VzdG9yczpZZyxkZXNjZW5kYW50czpCZyxsZWF2ZXM6SGcsbGlua3M6amcsY29weTpQb307dmFyIFhnPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj0odD10LnNsaWNlKCkpLmxlbmd0aCxlPW51bGwscj1lO247KXt2YXIgaT1uZXcgRG8odFtuLTFdKTtyPXI/ci5uZXh0PWk6ZT1pLHRbdm9pZCAwXT10Wy0tbl19cmV0dXJue2hlYWQ6ZSx0YWlsOnJ9fSwkZz1mdW5jdGlvbih0KXtyZXR1cm4gRm8oWGcodCksW10pfSxWZz1mdW5jdGlvbih0KXtyZXR1cm4gVm8odCksdH0sV2c9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSxaZz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7cmV0dXJuIHQueD1lLzIsdC55PXIvMixuP3QuZWFjaEJlZm9yZShRbyhuKSkuZWFjaEFmdGVyKEtvKGksLjUpKS5lYWNoQmVmb3JlKHR1KDEpKTp0LmVhY2hCZWZvcmUoUW8oSm8pKS5lYWNoQWZ0ZXIoS28oR28sMSkpLmVhY2hBZnRlcihLbyhpLHQuci9NYXRoLm1pbihlLHIpKSkuZWFjaEJlZm9yZSh0dShNYXRoLm1pbihlLHIpLygyKnQucikpKSx0fXZhciBuPW51bGwsZT0xLHI9MSxpPUdvO3JldHVybiB0LnJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1XbyhlKSx0KTpufSx0LnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K25bMF0scj0rblsxXSx0KTpbZSxyXX0sdC5wYWRkaW5nPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246V2coK24pLHQpOml9LHR9LEdnPWZ1bmN0aW9uKHQpe3QueDA9TWF0aC5yb3VuZCh0LngwKSx0LnkwPU1hdGgucm91bmQodC55MCksdC54MT1NYXRoLnJvdW5kKHQueDEpLHQueTE9TWF0aC5yb3VuZCh0LnkxKX0sSmc9ZnVuY3Rpb24odCxuLGUscixpKXtmb3IodmFyIG8sdT10LmNoaWxkcmVuLGE9LTEsYz11Lmxlbmd0aCxzPXQudmFsdWUmJihyLW4pL3QudmFsdWU7KythPGM7KW89dVthXSxvLnkwPWUsby55MT1pLG8ueDA9bixvLngxPW4rPW8udmFsdWUqc30sUWc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciB1PXQuaGVpZ2h0KzE7cmV0dXJuIHQueDA9dC55MD1pLHQueDE9ZSx0LnkxPXIvdSx0LmVhY2hCZWZvcmUobihyLHUpKSxvJiZ0LmVhY2hCZWZvcmUoR2cpLHR9ZnVuY3Rpb24gbih0LG4pe3JldHVybiBmdW5jdGlvbihlKXtlLmNoaWxkcmVuJiZKZyhlLGUueDAsdCooZS5kZXB0aCsxKS9uLGUueDEsdCooZS5kZXB0aCsyKS9uKTt2YXIgcj1lLngwLG89ZS55MCx1PWUueDEtaSxhPWUueTEtaTt1PHImJihyPXU9KHIrdSkvMiksYTxvJiYobz1hPShvK2EpLzIpLGUueDA9cixlLnkwPW8sZS54MT11LGUueTE9YX19dmFyIGU9MSxyPTEsaT0wLG89ITE7cmV0dXJuIHQucm91bmQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ISFuLHQpOm99LHQuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rblswXSxyPStuWzFdLHQpOltlLHJdfSx0LnBhZGRpbmc9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K24sdCk6aX0sdH0sS2c9IiQiLHRtPXtkZXB0aDotMX0sbm09e30sZW09ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciByLGksbyx1LGEsYyxzLGY9dC5sZW5ndGgsbD1uZXcgQXJyYXkoZiksaD17fTtmb3IoaT0wO2k8ZjsrK2kpcj10W2ldLGE9bFtpXT1uZXcgVW8ociksbnVsbCE9KGM9bihyLGksdCkpJiYoYys9IiIpJiYocz1LZysoYS5pZD1jKSxoW3NdPXMgaW4gaD9ubTphKTtmb3IoaT0wO2k8ZjsrK2kpaWYoYT1sW2ldLG51bGwhPShjPWUodFtpXSxpLHQpKSYmKGMrPSIiKSl7aWYoISh1PWhbS2crY10pKXRocm93IG5ldyBFcnJvcigibWlzc2luZzogIitjKTtpZih1PT09bm0pdGhyb3cgbmV3IEVycm9yKCJhbWJpZ3VvdXM6ICIrYyk7dS5jaGlsZHJlbj91LmNoaWxkcmVuLnB1c2goYSk6dS5jaGlsZHJlbj1bYV0sYS5wYXJlbnQ9dX1lbHNle2lmKG8pdGhyb3cgbmV3IEVycm9yKCJtdWx0aXBsZSByb290cyIpO289YX1pZighbyl0aHJvdyBuZXcgRXJyb3IoIm5vIHJvb3QiKTtpZihvLnBhcmVudD10bSxvLmVhY2hCZWZvcmUoZnVuY3Rpb24odCl7dC5kZXB0aD10LnBhcmVudC5kZXB0aCsxLC0tZn0pLmVhY2hCZWZvcmUocW8pLG8ucGFyZW50PW51bGwsZj4wKXRocm93IG5ldyBFcnJvcigiY3ljbGUiKTtyZXR1cm4gb312YXIgbj1udSxlPWV1O3JldHVybiB0LmlkPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPVpvKGUpLHQpOm59LHQucGFyZW50SWQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9Wm8obiksdCk6ZX0sdH07c3UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoVW8ucHJvdG90eXBlKTt2YXIgcm09ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciByPWZ1KHQpO2lmKHIuZWFjaEFmdGVyKG4pLHIucGFyZW50Lm09LXIueixyLmVhY2hCZWZvcmUoZSksYyl0LmVhY2hCZWZvcmUoaSk7ZWxzZXt2YXIgcz10LGY9dCxsPXQ7dC5lYWNoQmVmb3JlKGZ1bmN0aW9uKHQpe3QueDxzLngmJihzPXQpLHQueD5mLngmJihmPXQpLHQuZGVwdGg+bC5kZXB0aCYmKGw9dCl9KTt2YXIgaD1zPT09Zj8xOm8ocyxmKS8yLHA9aC1zLngsZD11LyhmLngraCtwKSx2PWEvKGwuZGVwdGh8fDEpO3QuZWFjaEJlZm9yZShmdW5jdGlvbih0KXt0Lng9KHQueCtwKSpkLHQueT10LmRlcHRoKnZ9KX1yZXR1cm4gdH1mdW5jdGlvbiBuKHQpe3ZhciBuPXQuY2hpbGRyZW4sZT10LnBhcmVudC5jaGlsZHJlbixpPXQuaT9lW3QuaS0xXTpudWxsO2lmKG4pe2F1KHQpO3ZhciB1PShuWzBdLnorbltuLmxlbmd0aC0xXS56KS8yO2k/KHQuej1pLnorbyh0Ll8saS5fKSx0Lm09dC56LXUpOnQuej11fWVsc2UgaSYmKHQuej1pLnorbyh0Ll8saS5fKSk7dC5wYXJlbnQuQT1yKHQsaSx0LnBhcmVudC5BfHxlWzBdKX1mdW5jdGlvbiBlKHQpe3QuXy54PXQueit0LnBhcmVudC5tLHQubSs9dC5wYXJlbnQubX1mdW5jdGlvbiByKHQsbixlKXtpZihuKXtmb3IodmFyIHIsaT10LHU9dCxhPW4sYz1pLnBhcmVudC5jaGlsZHJlblswXSxzPWkubSxmPXUubSxsPWEubSxoPWMubTthPW91KGEpLGk9aXUoaSksYSYmaTspYz1pdShjKSx1PW91KHUpLHUuYT10LHI9YS56K2wtaS56LXMrbyhhLl8saS5fKSxyPjAmJih1dShjdShhLHQsZSksdCxyKSxzKz1yLGYrPXIpLGwrPWEubSxzKz1pLm0saCs9Yy5tLGYrPXUubTthJiYhb3UodSkmJih1LnQ9YSx1Lm0rPWwtZiksaSYmIWl1KGMpJiYoYy50PWksYy5tKz1zLWgsZT10KX1yZXR1cm4gZX1mdW5jdGlvbiBpKHQpe3QueCo9dSx0Lnk9dC5kZXB0aCphfXZhciBvPXJ1LHU9MSxhPTEsYz1udWxsO3JldHVybiB0LnNlcGFyYXRpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bix0KTpvfSx0LnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ITEsdT0rblswXSxhPStuWzFdLHQpOmM/bnVsbDpbdSxhXX0sdC5ub2RlU2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz0hMCx1PStuWzBdLGE9K25bMV0sdCk6Yz9bdSxhXTpudWxsfSx0fSxpbT1mdW5jdGlvbih0LG4sZSxyLGkpe2Zvcih2YXIgbyx1PXQuY2hpbGRyZW4sYT0tMSxjPXUubGVuZ3RoLHM9dC52YWx1ZSYmKGktZSkvdC52YWx1ZTsrK2E8Yzspbz11W2FdLG8ueDA9bixvLngxPXIsby55MD1lLG8ueTE9ZSs9by52YWx1ZSpzfSxvbT0oMStNYXRoLnNxcnQoNSkpLzIsdW09ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSxyLGksbyl7bHUobix0LGUscixpLG8pfXJldHVybiBlLnJhdGlvPWZ1bmN0aW9uKG4pe3JldHVybiB0KChuPStuKT4xP246MSl9LGV9KG9tKSxhbT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7cmV0dXJuIHQueDA9dC55MD0wLHQueDE9aSx0LnkxPW8sdC5lYWNoQmVmb3JlKG4pLHU9WzBdLHImJnQuZWFjaEJlZm9yZShHZyksdH1mdW5jdGlvbiBuKHQpe3ZhciBuPXVbdC5kZXB0aF0scj10LngwK24saT10LnkwK24sbz10LngxLW4saD10LnkxLW47bzxyJiYocj1vPShyK28pLzIpLGg8aSYmKGk9aD0oaStoKS8yKSx0LngwPXIsdC55MD1pLHQueDE9byx0LnkxPWgsCnQuY2hpbGRyZW4mJihuPXVbdC5kZXB0aCsxXT1hKHQpLzIscis9bCh0KS1uLGkrPWModCktbixvLT1zKHQpLW4saC09Zih0KS1uLG88ciYmKHI9bz0ocitvKS8yKSxoPGkmJihpPWg9KGkraCkvMiksZSh0LHIsaSxvLGgpKX12YXIgZT11bSxyPSExLGk9MSxvPTEsdT1bMF0sYT1HbyxjPUdvLHM9R28sZj1HbyxsPUdvO3JldHVybiB0LnJvdW5kPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSEhbix0KTpyfSx0LnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K25bMF0sbz0rblsxXSx0KTpbaSxvXX0sdC50aWxlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPVpvKG4pLHQpOmV9LHQucGFkZGluZz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90LnBhZGRpbmdJbm5lcihuKS5wYWRkaW5nT3V0ZXIobik6dC5wYWRkaW5nSW5uZXIoKX0sdC5wYWRkaW5nSW5uZXI9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpXZygrbiksdCk6YX0sdC5wYWRkaW5nT3V0ZXI9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dC5wYWRkaW5nVG9wKG4pLnBhZGRpbmdSaWdodChuKS5wYWRkaW5nQm90dG9tKG4pLnBhZGRpbmdMZWZ0KG4pOnQucGFkZGluZ1RvcCgpfSx0LnBhZGRpbmdUb3A9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpXZygrbiksdCk6Y30sdC5wYWRkaW5nUmlnaHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpXZygrbiksdCk6c30sdC5wYWRkaW5nQm90dG9tPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246V2coK24pLHQpOmZ9LHQucGFkZGluZ0xlZnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpXZygrbiksdCk6bH0sdH0sY209ZnVuY3Rpb24odCxuLGUscixpKXtmdW5jdGlvbiBvKHQsbixlLHIsaSx1LGEpe2lmKHQ+PW4tMSl7dmFyIHM9Y1t0XTtyZXR1cm4gcy54MD1yLHMueTA9aSxzLngxPXUscy55MT1hLHZvaWQgMH1mb3IodmFyIGw9Zlt0XSxoPWUvMitsLHA9dCsxLGQ9bi0xO3A8ZDspe3ZhciB2PXArZD4+PjE7Zlt2XTxoP3A9disxOmQ9dn1oLWZbcC0xXTxmW3BdLWgmJnQrMTxwJiYtLXA7dmFyIF89ZltwXS1sLHk9ZS1fO2lmKHUtcj5hLWkpe3ZhciBnPShyKnkrdSpfKS9lO28odCxwLF8scixpLGcsYSksbyhwLG4seSxnLGksdSxhKX1lbHNle3ZhciBtPShpKnkrYSpfKS9lO28odCxwLF8scixpLHUsbSksbyhwLG4seSxyLG0sdSxhKX19dmFyIHUsYSxjPXQuY2hpbGRyZW4scz1jLmxlbmd0aCxmPW5ldyBBcnJheShzKzEpO2ZvcihmWzBdPWE9dT0wO3U8czsrK3UpZlt1KzFdPWErPWNbdV0udmFsdWU7bygwLHMsdC52YWx1ZSxuLGUscixpKX0sc209ZnVuY3Rpb24odCxuLGUscixpKXsoMSZ0LmRlcHRoP2ltOkpnKSh0LG4sZSxyLGkpfSxmbT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCxlLHIsaSxvKXtpZigodT10Ll9zcXVhcmlmeSkmJnUucmF0aW89PT1uKWZvcih2YXIgdSxhLGMscyxmLGw9LTEsaD11Lmxlbmd0aCxwPXQudmFsdWU7KytsPGg7KXtmb3IoYT11W2xdLGM9YS5jaGlsZHJlbixzPWEudmFsdWU9MCxmPWMubGVuZ3RoO3M8ZjsrK3MpYS52YWx1ZSs9Y1tzXS52YWx1ZTthLmRpY2U/SmcoYSxlLHIsaSxyKz0oby1yKSphLnZhbHVlL3ApOmltKGEsZSxyLGUrPShpLWUpKmEudmFsdWUvcCxvKSxwLT1hLnZhbHVlfWVsc2UgdC5fc3F1YXJpZnk9dT1sdShuLHQsZSxyLGksbyksdS5yYXRpbz1ufXJldHVybiBlLnJhdGlvPWZ1bmN0aW9uKG4pe3JldHVybiB0KChuPStuKT4xP246MSl9LGV9KG9tKSxsbT1mdW5jdGlvbih0KXtmb3IodmFyIG4sZT0tMSxyPXQubGVuZ3RoLGk9dFtyLTFdLG89MDsrK2U8cjspbj1pLGk9dFtlXSxvKz1uWzFdKmlbMF0tblswXSppWzFdO3JldHVybiBvLzJ9LGhtPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHI9LTEsaT10Lmxlbmd0aCxvPTAsdT0wLGE9dFtpLTFdLGM9MDsrK3I8aTspbj1hLGE9dFtyXSxjKz1lPW5bMF0qYVsxXS1hWzBdKm5bMV0sbys9KG5bMF0rYVswXSkqZSx1Kz0oblsxXSthWzFdKSplO3JldHVybiBjKj0zLFtvL2MsdS9jXX0scG09ZnVuY3Rpb24odCxuLGUpe3JldHVybihuWzBdLXRbMF0pKihlWzFdLXRbMV0pLShuWzFdLXRbMV0pKihlWzBdLXRbMF0pfSxkbT1mdW5jdGlvbih0KXtpZigoZT10Lmxlbmd0aCk8MylyZXR1cm4gbnVsbDt2YXIgbixlLHI9bmV3IEFycmF5KGUpLGk9bmV3IEFycmF5KGUpO2ZvcihuPTA7bjxlOysrbilyW25dPVsrdFtuXVswXSwrdFtuXVsxXSxuXTtmb3Ioci5zb3J0KGh1KSxuPTA7bjxlOysrbilpW25dPVtyW25dWzBdLC1yW25dWzFdXTt2YXIgbz1wdShyKSx1PXB1KGkpLGE9dVswXT09PW9bMF0sYz11W3UubGVuZ3RoLTFdPT09b1tvLmxlbmd0aC0xXSxzPVtdO2ZvcihuPW8ubGVuZ3RoLTE7bj49MDstLW4pcy5wdXNoKHRbcltvW25dXVsyXV0pO2ZvcihuPSthO248dS5sZW5ndGgtYzsrK24pcy5wdXNoKHRbclt1W25dXVsyXV0pO3JldHVybiBzfSx2bT1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZSxyLGk9dC5sZW5ndGgsbz10W2ktMV0sdT1uWzBdLGE9blsxXSxjPW9bMF0scz1vWzFdLGY9ITEsbD0wO2w8aTsrK2wpbz10W2xdLGU9b1swXSxyPW9bMV0scj5hIT1zPmEmJnU8KGMtZSkqKGEtcikvKHMtcikrZSYmKGY9IWYpLGM9ZSxzPXI7cmV0dXJuIGZ9LF9tPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHI9LTEsaT10Lmxlbmd0aCxvPXRbaS0xXSx1PW9bMF0sYT1vWzFdLGM9MDsrK3I8aTspbj11LGU9YSxvPXRbcl0sdT1vWzBdLGE9b1sxXSxuLT11LGUtPWEsYys9TWF0aC5zcXJ0KG4qbitlKmUpO3JldHVybiBjfSx5bT1bXS5zbGljZSxnbT17fTtkdS5wcm90b3R5cGU9eHUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpkdSxkZWZlcjpmdW5jdGlvbih0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2siKTtpZih0aGlzLl9jYWxsKXRocm93IG5ldyBFcnJvcigiZGVmZXIgYWZ0ZXIgYXdhaXQiKTtpZihudWxsIT10aGlzLl9lcnJvcilyZXR1cm4gdGhpczt2YXIgbj15bS5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gbi5wdXNoKHQpLCsrdGhpcy5fd2FpdGluZyx0aGlzLl90YXNrcy5wdXNoKG4pLHZ1KHRoaXMpLHRoaXN9LGFib3J0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PXRoaXMuX2Vycm9yJiZndSh0aGlzLG5ldyBFcnJvcigiYWJvcnQiKSksdGhpc30sYXdhaXQ6ZnVuY3Rpb24odCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrIik7aWYodGhpcy5fY2FsbCl0aHJvdyBuZXcgRXJyb3IoIm11bHRpcGxlIGF3YWl0Iik7cmV0dXJuIHRoaXMuX2NhbGw9ZnVuY3Rpb24obixlKXt0LmFwcGx5KG51bGwsW25dLmNvbmNhdChlKSl9LG11KHRoaXMpLHRoaXN9LGF3YWl0QWxsOmZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjayIpO2lmKHRoaXMuX2NhbGwpdGhyb3cgbmV3IEVycm9yKCJtdWx0aXBsZSBhd2FpdCIpO3JldHVybiB0aGlzLl9jYWxsPXQsbXUodGhpcyksdGhpc319O3ZhciBtbT1mdW5jdGlvbigpe3JldHVybiBNYXRoLnJhbmRvbSgpfSx4bT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCxlKXtyZXR1cm4gdD1udWxsPT10PzA6K3QsZT1udWxsPT1lPzE6K2UsMT09PWFyZ3VtZW50cy5sZW5ndGg/KGU9dCx0PTApOmUtPXQsZnVuY3Rpb24oKXtyZXR1cm4gbigpKmUrdH19cmV0dXJuIGUuc291cmNlPXQsZX0obW0pLGJtPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUpe3ZhciByLGk7cmV0dXJuIHQ9bnVsbD09dD8wOit0LGU9bnVsbD09ZT8xOitlLGZ1bmN0aW9uKCl7dmFyIG87aWYobnVsbCE9cilvPXIscj1udWxsO2Vsc2UgZG97cj0yKm4oKS0xLG89MipuKCktMSxpPXIqcitvKm99d2hpbGUoIWl8fGk+MSk7cmV0dXJuIHQrZSpvKk1hdGguc3FydCgtMipNYXRoLmxvZyhpKS9pKX19cmV0dXJuIGUuc291cmNlPXQsZX0obW0pLHdtPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSgpe3ZhciB0PWJtLnNvdXJjZShuKS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguZXhwKHQoKSl9fXJldHVybiBlLnNvdXJjZT10LGV9KG1tKSxNbT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBlPTAscj0wO3I8dDsrK3IpZSs9bigpO3JldHVybiBlfX1yZXR1cm4gZS5zb3VyY2U9dCxlfShtbSksVG09ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3ZhciBlPU1tLnNvdXJjZShuKSh0KTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZSgpL3R9fXJldHVybiBlLnNvdXJjZT10LGV9KG1tKSxrbT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuLU1hdGgubG9nKDEtbigpKS90fX1yZXR1cm4gZS5zb3VyY2U9dCxlfShtbSksTm09ZnVuY3Rpb24odCxuKXtmdW5jdGlvbiBlKHQpe3ZhciBuLGU9cy5zdGF0dXM7aWYoIWUmJnd1KHMpfHxlPj0yMDAmJmU8MzAwfHwzMDQ9PT1lKXtpZihvKXRyeXtuPW8uY2FsbChyLHMpfWNhdGNoKHQpe3JldHVybiB2b2lkIGEuY2FsbCgiZXJyb3IiLHIsdCl9ZWxzZSBuPXM7YS5jYWxsKCJsb2FkIixyLG4pfWVsc2UgYS5jYWxsKCJlcnJvciIscix0KX12YXIgcixpLG8sdSxhPXYoImJlZm9yZXNlbmQiLCJwcm9ncmVzcyIsImxvYWQiLCJlcnJvciIpLGM9SGUoKSxzPW5ldyBYTUxIdHRwUmVxdWVzdCxmPW51bGwsbD1udWxsLGg9MDtpZigidW5kZWZpbmVkIj09dHlwZW9mIFhEb21haW5SZXF1ZXN0fHwid2l0aENyZWRlbnRpYWxzImluIHN8fCEvXihodHRwKHMpPzopP1wvXC8vLnRlc3QodCl8fChzPW5ldyBYRG9tYWluUmVxdWVzdCksIm9ubG9hZCJpbiBzP3Mub25sb2FkPXMub25lcnJvcj1zLm9udGltZW91dD1lOnMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKHQpe3MucmVhZHlTdGF0ZT4zJiZlKHQpfSxzLm9ucHJvZ3Jlc3M9ZnVuY3Rpb24odCl7YS5jYWxsKCJwcm9ncmVzcyIscix0KX0scj17aGVhZGVyOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQ9KHQrIiIpLnRvTG93ZXJDYXNlKCksYXJndW1lbnRzLmxlbmd0aDwyP2MuZ2V0KHQpOihudWxsPT1uP2MucmVtb3ZlKHQpOmMuc2V0KHQsbisiIikscil9LG1pbWVUeXBlOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PXQ/bnVsbDp0KyIiLHIpOml9LHJlc3BvbnNlVHlwZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LHIpOnV9LHRpbWVvdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9K3Qscik6aH0sdXNlcjpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwxP2Y6KGY9bnVsbD09dD9udWxsOnQrIiIscil9LHBhc3N3b3JkOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/bDoobD1udWxsPT10P251bGw6dCsiIixyKX0scmVzcG9uc2U6ZnVuY3Rpb24odCl7cmV0dXJuIG89dCxyfSxnZXQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gci5zZW5kKCJHRVQiLHQsbil9LHBvc3Q6ZnVuY3Rpb24odCxuKXtyZXR1cm4gci5zZW5kKCJQT1NUIix0LG4pfSxzZW5kOmZ1bmN0aW9uKG4sZSxvKXtyZXR1cm4gcy5vcGVuKG4sdCwhMCxmLGwpLG51bGw9PWl8fGMuaGFzKCJhY2NlcHQiKXx8Yy5zZXQoImFjY2VwdCIsaSsiLCovKiIpLHMuc2V0UmVxdWVzdEhlYWRlciYmYy5lYWNoKGZ1bmN0aW9uKHQsbil7cy5zZXRSZXF1ZXN0SGVhZGVyKG4sdCl9KSxudWxsIT1pJiZzLm92ZXJyaWRlTWltZVR5cGUmJnMub3ZlcnJpZGVNaW1lVHlwZShpKSxudWxsIT11JiYocy5yZXNwb25zZVR5cGU9dSksaD4wJiYocy50aW1lb3V0PWgpLG51bGw9PW8mJiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYobz1lLGU9bnVsbCksbnVsbCE9byYmMT09PW8ubGVuZ3RoJiYobz1idShvKSksbnVsbCE9byYmci5vbigiZXJyb3IiLG8pLm9uKCJsb2FkIixmdW5jdGlvbih0KXtvKG51bGwsdCl9KSxhLmNhbGwoImJlZm9yZXNlbmQiLHIscykscy5zZW5kKG51bGw9PWU/bnVsbDplKSxyfSxhYm9ydDpmdW5jdGlvbigpe3JldHVybiBzLmFib3J0KCkscn0sb246ZnVuY3Rpb24oKXt2YXIgdD1hLm9uLmFwcGx5KGEsYXJndW1lbnRzKTtyZXR1cm4gdD09PWE/cjp0fX0sbnVsbCE9bil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiK24pO3JldHVybiByLmdldChuKX1yZXR1cm4gcn0sU209ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oZSxyKXt2YXIgaT1ObShlKS5taW1lVHlwZSh0KS5yZXNwb25zZShuKTtpZihudWxsIT1yKXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygcil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrcik7cmV0dXJuIGkuZ2V0KHIpfXJldHVybiBpfX0sRW09U20oInRleHQvaHRtbCIsZnVuY3Rpb24odCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHQucmVzcG9uc2VUZXh0KX0pLEFtPVNtKCJhcHBsaWNhdGlvbi9qc29uIixmdW5jdGlvbih0KXtyZXR1cm4gSlNPTi5wYXJzZSh0LnJlc3BvbnNlVGV4dCl9KSxDbT1TbSgidGV4dC9wbGFpbiIsZnVuY3Rpb24odCl7cmV0dXJuIHQucmVzcG9uc2VUZXh0fSksem09U20oImFwcGxpY2F0aW9uL3htbCIsZnVuY3Rpb24odCl7dmFyIG49dC5yZXNwb25zZVhNTDtpZighbil0aHJvdyBuZXcgRXJyb3IoInBhcnNlIGVycm9yIik7cmV0dXJuIG59KSxQbT1mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbihlLHIsaSl7YXJndW1lbnRzLmxlbmd0aDwzJiYoaT1yLHI9bnVsbCk7dmFyIG89Tm0oZSkubWltZVR5cGUodCk7cmV0dXJuIG8ucm93PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP28ucmVzcG9uc2UoTXUobixyPXQpKTpyfSxvLnJvdyhyKSxpP28uZ2V0KGkpOm99fSxMbT1QbSgidGV4dC9jc3YiLFpkKSxSbT1QbSgidGV4dC90YWItc2VwYXJhdGVkLXZhbHVlcyIsdHYpLHFtPUFycmF5LnByb3RvdHlwZSxVbT1xbS5tYXAsRG09cW0uc2xpY2UsT209e25hbWU6ImltcGxpY2l0In0sRm09ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSxJbT1mdW5jdGlvbih0KXtyZXR1cm4rdH0sWW09WzAsMV0sQm09ZnVuY3Rpb24obixlLHIpe3ZhciBvLHU9blswXSxhPW5bbi5sZW5ndGgtMV0sYz1pKHUsYSxudWxsPT1lPzEwOmUpO3N3aXRjaChyPXByKG51bGw9PXI/IixmIjpyKSxyLnR5cGUpe2Nhc2UicyI6dmFyIHM9TWF0aC5tYXgoTWF0aC5hYnModSksTWF0aC5hYnMoYSkpO3JldHVybiBudWxsIT1yLnByZWNpc2lvbnx8aXNOYU4obz1qdihjLHMpKXx8KHIucHJlY2lzaW9uPW8pLHQuZm9ybWF0UHJlZml4KHIscyk7Y2FzZSIiOmNhc2UiZSI6Y2FzZSJnIjpjYXNlInAiOmNhc2UiciI6bnVsbCE9ci5wcmVjaXNpb258fGlzTmFOKG89WHYoYyxNYXRoLm1heChNYXRoLmFicyh1KSxNYXRoLmFicyhhKSkpKXx8KHIucHJlY2lzaW9uPW8tKCJlIj09PXIudHlwZSkpO2JyZWFrO2Nhc2UiZiI6Y2FzZSIlIjpudWxsIT1yLnByZWNpc2lvbnx8aXNOYU4obz1IdihjKSl8fChyLnByZWNpc2lvbj1vLTIqKCIlIj09PXIudHlwZSkpfXJldHVybiB0LmZvcm1hdChyKX0sSG09ZnVuY3Rpb24odCxuKXt0PXQuc2xpY2UoKTt2YXIgZSxyPTAsaT10Lmxlbmd0aC0xLG89dFtyXSx1PXRbaV07cmV0dXJuIHU8byYmKGU9cixyPWksaT1lLGU9byxvPXUsdT1lKSx0W3JdPW4uZmxvb3IobyksdFtpXT1uLmNlaWwodSksdH0sam09bmV3IERhdGUsWG09bmV3IERhdGUsJG09SnUoZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0K24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLXR9KTskbS5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP0p1KGZ1bmN0aW9uKG4pe24uc2V0VGltZShNYXRoLmZsb29yKG4vdCkqdCl9LGZ1bmN0aW9uKG4sZSl7bi5zZXRUaW1lKCtuK2UqdCl9LGZ1bmN0aW9uKG4sZSl7cmV0dXJuKGUtbikvdH0pOiRtOm51bGx9O3ZhciBWbT0kbS5yYW5nZSxXbT02ZTQsWm09NjA0OGU1LEdtPUp1KGZ1bmN0aW9uKHQpe3Quc2V0VGltZSgxZTMqTWF0aC5mbG9vcih0LzFlMykpfSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCsxZTMqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvMWUzfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENTZWNvbmRzKCl9KSxKbT1HbS5yYW5nZSxRbT1KdShmdW5jdGlvbih0KXt0LnNldFRpbWUoTWF0aC5mbG9vcih0L1dtKSpXbSl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0K24qV20pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpL1dtfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRNaW51dGVzKCl9KSxLbT1RbS5yYW5nZSx0eD1KdShmdW5jdGlvbih0KXt2YXIgbj10LmdldFRpbWV6b25lT2Zmc2V0KCkqV20lMzZlNTtuPDAmJihuKz0zNmU1KSx0LnNldFRpbWUoMzZlNSpNYXRoLmZsb29yKCgrdC1uKS8zNmU1KStuKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrMzZlNSpuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS8zNmU1fSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRIb3VycygpfSksbng9dHgucmFuZ2UsZXg9SnUoZnVuY3Rpb24odCl7dC5zZXRIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldERhdGUodC5nZXREYXRlKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdC0obi5nZXRUaW1lem9uZU9mZnNldCgpLXQuZ2V0VGltZXpvbmVPZmZzZXQoKSkqV20pLzg2NGU1fSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXREYXRlKCktMX0pLHJ4PWV4LnJhbmdlLGl4PVF1KDApLG94PVF1KDEpLHV4PVF1KDIpLGF4PVF1KDMpLGN4PVF1KDQpLHN4PVF1KDUpLGZ4PVF1KDYpLGx4PWl4LnJhbmdlLGh4PW94LnJhbmdlLHB4PXV4LnJhbmdlLGR4PWF4LnJhbmdlLHZ4PWN4LnJhbmdlLF94PXN4LnJhbmdlLHl4PWZ4LnJhbmdlLGd4PUp1KGZ1bmN0aW9uKHQpe3Quc2V0RGF0ZSgxKSx0LnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0TW9udGgodC5nZXRNb250aCgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldE1vbnRoKCktdC5nZXRNb250aCgpKzEyKihuLmdldEZ1bGxZZWFyKCktdC5nZXRGdWxsWWVhcigpKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TW9udGgoKX0pLG14PWd4LnJhbmdlLHh4PUp1KGZ1bmN0aW9uKHQpe3Quc2V0TW9udGgoMCwxKSx0LnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0RnVsbFllYXIodC5nZXRGdWxsWWVhcigpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldEZ1bGxZZWFyKCktdC5nZXRGdWxsWWVhcigpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRGdWxsWWVhcigpfSk7eHguZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9KdShmdW5jdGlvbihuKXtuLnNldEZ1bGxZZWFyKE1hdGguZmxvb3Iobi5nZXRGdWxsWWVhcigpL3QpKnQpLG4uc2V0TW9udGgoMCwxKSxuLnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbihuLGUpe24uc2V0RnVsbFllYXIobi5nZXRGdWxsWWVhcigpK2UqdCl9KTpudWxsfTt2YXIgYng9eHgucmFuZ2Usd3g9SnUoZnVuY3Rpb24odCl7dC5zZXRVVENTZWNvbmRzKDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0K24qV20pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpL1dtfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENNaW51dGVzKCl9KSxNeD13eC5yYW5nZSxUeD1KdShmdW5jdGlvbih0KXt0LnNldFVUQ01pbnV0ZXMoMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCszNmU1Km4pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzM2ZTV9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0hvdXJzKCl9KSxreD1UeC5yYW5nZSxOeD1KdShmdW5jdGlvbih0KXt0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDRGF0ZSh0LmdldFVUQ0RhdGUoKStuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS84NjRlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDRGF0ZSgpLTF9KSxTeD1OeC5yYW5nZSxFeD1LdSgwKSxBeD1LdSgxKSxDeD1LdSgyKSx6eD1LdSgzKSxQeD1LdSg0KSxMeD1LdSg1KSxSeD1LdSg2KSxxeD1FeC5yYW5nZSxVeD1BeC5yYW5nZSxEeD1DeC5yYW5nZSxPeD16eC5yYW5nZSxGeD1QeC5yYW5nZSxJeD1MeC5yYW5nZSxZeD1SeC5yYW5nZSxCeD1KdShmdW5jdGlvbih0KXt0LnNldFVUQ0RhdGUoMSksdC5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFVUQ01vbnRoKHQuZ2V0VVRDTW9udGgoKStuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4gbi5nZXRVVENNb250aCgpLXQuZ2V0VVRDTW9udGgoKSsxMioobi5nZXRVVENGdWxsWWVhcigpLXQuZ2V0VVRDRnVsbFllYXIoKSl9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01vbnRoKCl9KSxIeD1CeC5yYW5nZSxqeD1KdShmdW5jdGlvbih0KXt0LnNldFVUQ01vbnRoKDAsMSksdC5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFVUQ0Z1bGxZZWFyKHQuZ2V0VVRDRnVsbFllYXIoKStuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4gbi5nZXRVVENGdWxsWWVhcigpLXQuZ2V0VVRDRnVsbFllYXIoKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDRnVsbFllYXIoKX0pO2p4LmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiBpc0Zpbml0ZSh0PU1hdGguZmxvb3IodCkpJiZ0PjA/SnUoZnVuY3Rpb24obil7bi5zZXRVVENGdWxsWWVhcihNYXRoLmZsb29yKG4uZ2V0VVRDRnVsbFllYXIoKS90KSp0KSxuLnNldFVUQ01vbnRoKDAsMSksbi5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24obixlKXtuLnNldFVUQ0Z1bGxZZWFyKG4uZ2V0VVRDRnVsbFllYXIoKStlKnQpfSk6bnVsbH07dmFyIFh4LCR4PWp4LnJhbmdlLFZ4PXsiLSI6IiIsXzoiICIsMDoiMCJ9LFd4PS9eXHMqXGQrLyxaeD0vXiUvLEd4PS9bXFxcXlwkXCpcK1w/XHxcW1xdXChcKVwuXHtcfV0vZztKYSh7ZGF0ZVRpbWU6IiV4LCAlWCIsZGF0ZToiJS1tLyUtZC8lWSIsdGltZToiJS1JOiVNOiVTICVwIixwZXJpb2RzOlsiQU0iLCJQTSJdLGRheXM6WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLHNob3J0RGF5czpbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLG1vbnRoczpbIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sc2hvcnRNb250aHM6WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXX0pO3ZhciBKeD1EYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZz9RYTp0LnV0Y0Zvcm1hdCgiJVktJW0tJWRUJUg6JU06JVMuJUxaIiksUXg9K25ldyBEYXRlKCIyMDAwLTAxLTAxVDAwOjAwOjAwLjAwMFoiKT9LYTp0LnV0Y1BhcnNlKCIlWS0lbS0lZFQlSDolTTolUy4lTFoiKSxLeD0xZTMsdGI9NjAqS3gsbmI9NjAqdGIsZWI9MjQqbmIscmI9NyplYixpYj0zMCplYixvYj0zNjUqZWIsdWI9ZnVuY3Rpb24oKXtyZXR1cm4gZWMoeHgsZ3gsaXgsZXgsdHgsUW0sR20sJG0sdC50aW1lRm9ybWF0KS5kb21haW4oW25ldyBEYXRlKDJlMywwLDEpLG5ldyBEYXRlKDJlMywwLDIpXSl9LGFiPWZ1bmN0aW9uKCl7cmV0dXJuIGVjKGp4LEJ4LEV4LE54LFR4LHd4LEdtLCRtLHQudXRjRm9ybWF0KS5kb21haW4oW0RhdGUuVVRDKDJlMywwLDEpLERhdGUuVVRDKDJlMywwLDIpXSl9LGNiPWZ1bmN0aW9uKHQpe3JldHVybiB0Lm1hdGNoKC8uezZ9L2cpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4iIyIrdH0pfSxzYj1jYigiMWY3N2I0ZmY3ZjBlMmNhMDJjZDYyNzI4OTQ2N2JkOGM1NjRiZTM3N2MyN2Y3ZjdmYmNiZDIyMTdiZWNmIiksZmI9Y2IoIjM5M2I3OTUyNTRhMzZiNmVjZjljOWVkZTYzNzkzOThjYTI1MmI1Y2Y2YmNlZGI5YzhjNmQzMWJkOWUzOWU3YmE1MmU3Y2I5NDg0M2MzOWFkNDk0YWQ2NjE2YmU3OTY5YzdiNDE3M2E1NTE5NGNlNmRiZGRlOWVkNiIpLGxiPWNiKCIzMTgyYmQ2YmFlZDY5ZWNhZTFjNmRiZWZlNjU1MGRmZDhkM2NmZGFlNmJmZGQwYTIzMWEzNTQ3NGM0NzZhMWQ5OWJjN2U5YzA3NTZiYjE5ZTlhYzhiY2JkZGNkYWRhZWI2MzYzNjM5Njk2OTZiZGJkYmRkOWQ5ZDkiKSxoYj1jYigiMWY3N2I0YWVjN2U4ZmY3ZjBlZmZiYjc4MmNhMDJjOThkZjhhZDYyNzI4ZmY5ODk2OTQ2N2JkYzViMGQ1OGM1NjRiYzQ5Yzk0ZTM3N2MyZjdiNmQyN2Y3ZjdmYzdjN2M3YmNiZDIyZGJkYjhkMTdiZWNmOWVkYWU1IikscGI9WmgoV3QoMzAwLC41LDApLFd0KC0yNDAsLjUsMSkpLGRiPVpoKFd0KC0xMDAsLjc1LC4zNSksV3QoODAsMS41LC44KSksdmI9WmgoV3QoMjYwLC43NSwuMzUpLFd0KDgwLDEuNSwuOCkpLF9iPVd0KCkseWI9ZnVuY3Rpb24odCl7KHQ8MHx8dD4xKSYmKHQtPU1hdGguZmxvb3IodCkpO3ZhciBuPU1hdGguYWJzKHQtLjUpO3JldHVybiBfYi5oPTM2MCp0LTEwMCxfYi5zPTEuNS0xLjUqbixfYi5sPS44LS45Km4sX2IrIiJ9LGdiPXJjKGNiKCI0NDAxNTQ0NDAyNTY0NTA0NTc0NTA1NTk0NjA3NWE0NjA4NWM0NjBhNWQ0NjBiNWU0NzBkNjA0NzBlNjE0NzEwNjM0NzExNjQ0NzEzNjU0ODE0Njc0ODE2Njg0ODE3Njk0ODE4NmE0ODFhNmM0ODFiNmQ0ODFjNmU0ODFkNmY0ODFmNzA0ODIwNzE0ODIxNzM0ODIzNzQ0ODI0NzU0ODI1NzY0ODI2Nzc0ODI4Nzg0ODI5Nzk0NzJhN2E0NzJjN2E0NzJkN2I0NzJlN2M0NzJmN2Q0NjMwN2U0NjMyN2U0NjMzN2Y0NjM0ODA0NTM1ODE0NTM3ODE0NTM4ODI0NDM5ODM0NDNhODM0NDNiODQ0MzNkODQ0MzNlODU0MjNmODU0MjQwODY0MjQxODY0MTQyODc0MTQ0ODc0MDQ1ODg0MDQ2ODgzZjQ3ODgzZjQ4ODkzZTQ5ODkzZTRhODkzZTRjOGEzZDRkOGEzZDRlOGEzYzRmOGEzYzUwOGIzYjUxOGIzYjUyOGIzYTUzOGIzYTU0OGMzOTU1OGMzOTU2OGMzODU4OGMzODU5OGMzNzVhOGMzNzViOGQzNjVjOGQzNjVkOGQzNTVlOGQzNTVmOGQzNDYwOGQzNDYxOGQzMzYyOGQzMzYzOGQzMjY0OGUzMjY1OGUzMTY2OGUzMTY3OGUzMTY4OGUzMDY5OGUzMDZhOGUyZjZiOGUyZjZjOGUyZTZkOGUyZTZlOGUyZTZmOGUyZDcwOGUyZDcxOGUyYzcxOGUyYzcyOGUyYzczOGUyYjc0OGUyYjc1OGUyYTc2OGUyYTc3OGUyYTc4OGUyOTc5OGUyOTdhOGUyOTdiOGUyODdjOGUyODdkOGUyNzdlOGUyNzdmOGUyNzgwOGUyNjgxOGUyNjgyOGUyNjgyOGUyNTgzOGUyNTg0OGUyNTg1OGUyNDg2OGUyNDg3OGUyMzg4OGUyMzg5OGUyMzhhOGQyMjhiOGQyMjhjOGQyMjhkOGQyMThlOGQyMThmOGQyMTkwOGQyMTkxOGMyMDkyOGMyMDkyOGMyMDkzOGMxZjk0OGMxZjk1OGIxZjk2OGIxZjk3OGIxZjk4OGIxZjk5OGExZjlhOGExZTliOGExZTljODkxZTlkODkxZjllODkxZjlmODgxZmEwODgxZmExODgxZmExODcxZmEyODcyMGEzODYyMGE0ODYyMWE1ODUyMWE2ODUyMmE3ODUyMmE4ODQyM2E5ODMyNGFhODMyNWFiODIyNWFjODIyNmFkODEyN2FkODEyOGFlODAyOWFmN2YyYWIwN2YyY2IxN2UyZGIyN2QyZWIzN2MyZmI0N2MzMWI1N2IzMmI2N2EzNGI2NzkzNWI3NzkzN2I4NzgzOGI5NzczYWJhNzYzYmJiNzUzZGJjNzQzZmJjNzM0MGJkNzI0MmJlNzE0NGJmNzA0NmMwNmY0OGMxNmU0YWMxNmQ0Y2MyNmM0ZWMzNmI1MGM0NmE1MmM1Njk1NGM1Njg1NmM2Njc1OGM3NjU1YWM4NjQ1Y2M4NjM1ZWM5NjI2MGNhNjA2M2NiNWY2NWNiNWU2N2NjNWM2OWNkNWI2Y2NkNWE2ZWNlNTg3MGNmNTc3M2QwNTY3NWQwNTQ3N2QxNTM3YWQxNTE3Y2QyNTA3ZmQzNGU4MWQzNGQ4NGQ0NGI4NmQ1NDk4OWQ1NDg4YmQ2NDY4ZWQ2NDU5MGQ3NDM5M2Q3NDE5NWQ4NDA5OGQ4M2U5YmQ5M2M5ZGQ5M2JhMGRhMzlhMmRhMzdhNWRiMzZhOGRiMzRhYWRjMzJhZGRjMzBiMGRkMmZiMmRkMmRiNWRlMmJiOGRlMjliYWRlMjhiZGRmMjZjMGRmMjVjMmRmMjNjNWUwMjFjOGUwMjBjYWUxMWZjZGUxMWRkMGUxMWNkMmUyMWJkNWUyMWFkOGUyMTlkYWUzMTlkZGUzMThkZmUzMThlMmU0MThlNWU0MTllN2U0MTllYWU1MWFlY2U1MWJlZmU1MWNmMWU1MWRmNGU2MWVmNmU2MjBmOGU2MjFmYmU3MjNmZGU3MjUiKSksbWI9cmMoY2IoIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwOTAyMDIwYjAyMDIwZDAzMDMwZjAzMDMxMjA0MDQxNDA1MDQxNjA2MDUxODA2MDUxYTA3MDYxYzA4MDcxZTA5MDcyMDBhMDgyMjBiMDkyNDBjMDkyNjBkMGEyOTBlMGIyYjEwMGIyZDExMGMyZjEyMGQzMTEzMGQzNDE0MGUzNjE1MGUzODE2MGYzYjE4MGYzZDE5MTAzZjFhMTA0MjFjMTA0NDFkMTE0NzFlMTE0OTIwMTE0YjIxMTE0ZTIyMTE1MDI0MTI1MzI1MTI1NTI3MTI1ODI5MTE1YTJhMTE1YzJjMTE1ZjJkMTE2MTJmMTE2MzMxMTE2NTMzMTA2NzM0MTA2OTM2MTA2YjM4MTA2YzM5MGY2ZTNiMGY3MDNkMGY3MTNmMGY3MjQwMGY3NDQyMGY3NTQ0MGY3NjQ1MTA3NzQ3MTA3ODQ5MTA3ODRhMTA3OTRjMTE3YTRlMTE3YjRmMTI3YjUxMTI3YzUyMTM3YzU0MTM3ZDU2MTQ3ZDU3MTU3ZTU5MTU3ZTVhMTY3ZTVjMTY3ZjVkMTc3ZjVmMTg3ZjYwMTg4MDYyMTk4MDY0MWE4MDY1MWE4MDY3MWI4MDY4MWM4MTZhMWM4MTZiMWQ4MTZkMWQ4MTZlMWU4MTcwMWY4MTcyMWY4MTczMjA4MTc1MjE4MTc2MjE4MTc4MjI4MTc5MjI4MjdiMjM4MjdjMjM4MjdlMjQ4MjgwMjU4MjgxMjU4MTgzMjY4MTg0MjY4MTg2Mjc4MTg4Mjc4MTg5Mjg4MThiMjk4MThjMjk4MThlMmE4MTkwMmE4MTkxMmI4MTkzMmI4MDk0MmM4MDk2MmM4MDk4MmQ4MDk5MmQ4MDliMmU3ZjljMmU3ZjllMmY3ZmEwMmY3ZmExMzA3ZWEzMzA3ZWE1MzE3ZWE2MzE3ZGE4MzI3ZGFhMzM3ZGFiMzM3Y2FkMzQ3Y2FlMzQ3YmIwMzU3YmIyMzU3YmIzMzY3YWI1MzY3YWI3Mzc3OWI4Mzc3OWJhMzg3OGJjMzk3OGJkMzk3N2JmM2E3N2MwM2E3NmMyM2I3NWM0M2M3NWM1M2M3NGM3M2Q3M2M4M2U3M2NhM2U3MmNjM2Y3MWNkNDA3MWNmNDA3MGQwNDE2ZmQyNDI2ZmQzNDM2ZWQ1NDQ2ZGQ2NDU2Y2Q4NDU2Y2Q5NDY2YmRiNDc2YWRjNDg2OWRlNDk2OGRmNGE2OGUwNGM2N2UyNGQ2NmUzNGU2NWU0NGY2NGU1NTA2NGU3NTI2M2U4NTM2MmU5NTQ2MmVhNTY2MWViNTc2MGVjNTg2MGVkNWE1ZmVlNWI1ZWVmNWQ1ZWYwNWY1ZWYxNjA1ZGYyNjI1ZGYyNjQ1Y2YzNjU1Y2Y0Njc1Y2Y0Njk1Y2Y1NmI1Y2Y2NmM1Y2Y2NmU1Y2Y3NzA1Y2Y3NzI1Y2Y4NzQ1Y2Y4NzY1Y2Y5Nzg1ZGY5Nzk1ZGY5N2I1ZGZhN2Q1ZWZhN2Y1ZWZhODE1ZmZiODM1ZmZiODU2MGZiODc2MWZjODk2MWZjOGE2MmZjOGM2M2ZjOGU2NGZjOTA2NWZkOTI2NmZkOTQ2N2ZkOTY2OGZkOTg2OWZkOWE2YWZkOWI2YmZlOWQ2Y2ZlOWY2ZGZlYTE2ZWZlYTM2ZmZlYTU3MWZlYTc3MmZlYTk3M2ZlYWE3NGZlYWM3NmZlYWU3N2ZlYjA3OGZlYjI3YWZlYjQ3YmZlYjY3Y2ZlYjc3ZWZlYjk3ZmZlYmI4MWZlYmQ4MmZlYmY4NGZlYzE4NWZlYzI4N2ZlYzQ4OGZlYzY4YWZlYzg4Y2ZlY2E4ZGZlY2M4ZmZlY2Q5MGZlY2Y5MmZlZDE5NGZlZDM5NWZlZDU5N2ZlZDc5OWZlZDg5YWZkZGE5Y2ZkZGM5ZWZkZGVhMGZkZTBhMWZkZTJhM2ZkZTNhNWZkZTVhN2ZkZTdhOWZkZTlhYWZkZWJhY2ZjZWNhZWZjZWViMGZjZjBiMmZjZjJiNGZjZjRiNmZjZjZiOGZjZjdiOWZjZjliYmZjZmJiZGZjZmRiZiIpKSx4Yj1yYyhjYigiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTBhMDIwMjBjMDIwMjBlMDMwMjEwMDQwMzEyMDQwMzE0MDUwNDE3MDYwNDE5MDcwNTFiMDgwNTFkMDkwNjFmMGEwNzIyMGIwNzI0MGMwODI2MGQwODI5MGUwOTJiMTAwOTJkMTEwYTMwMTIwYTMyMTQwYjM0MTUwYjM3MTYwYjM5MTgwYzNjMTkwYzNlMWIwYzQxMWMwYzQzMWUwYzQ1MWYwYzQ4MjEwYzRhMjMwYzRjMjQwYzRmMjYwYzUxMjgwYjUzMjkwYjU1MmIwYjU3MmQwYjU5MmYwYTViMzEwYTVjMzIwYTVlMzQwYTVmMzYwOTYxMzgwOTYyMzkwOTYzM2IwOTY0M2QwOTY1M2UwOTY2NDAwYTY3NDIwYTY4NDQwYTY4NDUwYTY5NDcwYjZhNDkwYjZhNGEwYzZiNGMwYzZiNGQwZDZjNGYwZDZjNTEwZTZjNTIwZTZkNTQwZjZkNTUwZjZkNTcxMDZlNTkxMDZlNWExMTZlNWMxMjZlNWQxMjZlNWYxMzZlNjExMzZlNjIxNDZlNjQxNTZlNjUxNTZlNjcxNjZlNjkxNjZlNmExNzZlNmMxODZlNmQxODZlNmYxOTZlNzExOTZlNzIxYTZlNzQxYTZlNzUxYjZlNzcxYzZkNzgxYzZkN2ExZDZkN2MxZDZkN2QxZTZkN2YxZTZjODAxZjZjODIyMDZjODQyMDZiODUyMTZiODcyMTZiODgyMjZhOGEyMjZhOGMyMzY5OGQyMzY5OGYyNDY5OTAyNTY4OTIyNTY4OTMyNjY3OTUyNjY3OTcyNzY2OTgyNzY2OWEyODY1OWIyOTY0OWQyOTY0OWYyYTYzYTAyYTYzYTIyYjYyYTMyYzYxYTUyYzYwYTYyZDYwYTgyZTVmYTkyZTVlYWIyZjVlYWQzMDVkYWUzMDVjYjAzMTViYjEzMjVhYjMzMjVhYjQzMzU5YjYzNDU4YjczNTU3YjkzNTU2YmEzNjU1YmMzNzU0YmQzODUzYmYzOTUyYzAzYTUxYzEzYTUwYzMzYjRmYzQzYzRlYzYzZDRkYzczZTRjYzgzZjRiY2E0MDRhY2I0MTQ5Y2M0MjQ4Y2U0MzQ3Y2Y0NDQ2ZDA0NTQ1ZDI0NjQ0ZDM0NzQzZDQ0ODQyZDU0YTQxZDc0YjNmZDg0YzNlZDk0ZDNkZGE0ZTNjZGI1MDNiZGQ1MTNhZGU1MjM4ZGY1MzM3ZTA1NTM2ZTE1NjM1ZTI1NzM0ZTM1OTMzZTQ1YTMxZTU1YzMwZTY1ZDJmZTc1ZTJlZTg2MDJkZTk2MTJiZWE2MzJhZWI2NDI5ZWI2NjI4ZWM2NzI2ZWQ2OTI1ZWU2YTI0ZWY2YzIzZWY2ZTIxZjA2ZjIwZjE3MTFmZjE3MzFkZjI3NDFjZjM3NjFiZjM3ODE5ZjQ3OTE4ZjU3YjE3ZjU3ZDE1ZjY3ZTE0ZjY4MDEzZjc4MjEyZjc4NDEwZjg4NTBmZjg4NzBlZjg4OTBjZjk4YjBiZjk4YzBhZjk4ZTA5ZmE5MDA4ZmE5MjA3ZmE5NDA3ZmI5NjA2ZmI5NzA2ZmI5OTA2ZmI5YjA2ZmI5ZDA3ZmM5ZjA3ZmNhMTA4ZmNhMzA5ZmNhNTBhZmNhNjBjZmNhODBkZmNhYTBmZmNhYzExZmNhZTEyZmNiMDE0ZmNiMjE2ZmNiNDE4ZmJiNjFhZmJiODFkZmJiYTFmZmJiYzIxZmJiZTIzZmFjMDI2ZmFjMjI4ZmFjNDJhZmFjNjJkZjljNzJmZjljOTMyZjljYjM1ZjhjZDM3ZjhjZjNhZjdkMTNkZjdkMzQwZjZkNTQzZjZkNzQ2ZjVkOTQ5ZjVkYjRjZjRkZDRmZjRkZjUzZjRlMTU2ZjNlMzVhZjNlNTVkZjJlNjYxZjJlODY1ZjJlYTY5ZjFlYzZkZjFlZDcxZjFlZjc1ZjFmMTc5ZjJmMjdkZjJmNDgyZjNmNTg2ZjNmNjhhZjRmODhlZjVmOTkyZjZmYTk2ZjhmYjlhZjlmYzlkZmFmZGExZmNmZmE0IikpLGJiPXJjKGNiKCIwZDA4ODcxMDA3ODgxMzA3ODkxNjA3OGExOTA2OGMxYjA2OGQxZDA2OGUyMDA2OGYyMjA2OTAyNDA2OTEyNjA1OTEyODA1OTIyYTA1OTMyYzA1OTQyZTA1OTUyZjA1OTYzMTA1OTczMzA1OTczNTA0OTgzNzA0OTkzODA0OWEzYTA0OWEzYzA0OWIzZTA0OWMzZjA0OWM0MTA0OWQ0MzAzOWU0NDAzOWU0NjAzOWY0ODAzOWY0OTAzYTA0YjAzYTE0YzAyYTE0ZTAyYTI1MDAyYTI1MTAyYTM1MzAyYTM1NTAyYTQ1NjAxYTQ1ODAxYTQ1OTAxYTU1YjAxYTU1YzAxYTY1ZTAxYTY2MDAxYTY2MTAwYTc2MzAwYTc2NDAwYTc2NjAwYTc2NzAwYTg2OTAwYTg2YTAwYTg2YzAwYTg2ZTAwYTg2ZjAwYTg3MTAwYTg3MjAxYTg3NDAxYTg3NTAxYTg3NzAxYTg3ODAxYTg3YTAyYTg3YjAyYTg3ZDAzYTg3ZTAzYTg4MDA0YTg4MTA0YTc4MzA1YTc4NDA1YTc4NjA2YTY4NzA3YTY4ODA4YTY4YTA5YTU4YjBhYTU4ZDBiYTU4ZTBjYTQ4ZjBkYTQ5MTBlYTM5MjBmYTM5NDEwYTI5NTExYTE5NjEzYTE5ODE0YTA5OTE1OWY5YTE2OWY5YzE3OWU5ZDE4OWQ5ZTE5OWRhMDFhOWNhMTFiOWJhMjFkOWFhMzFlOWFhNTFmOTlhNjIwOThhNzIxOTdhODIyOTZhYTIzOTVhYjI0OTRhYzI2OTRhZDI3OTNhZTI4OTJiMDI5OTFiMTJhOTBiMjJiOGZiMzJjOGViNDJlOGRiNTJmOGNiNjMwOGJiNzMxOGFiODMyODliYTMzODhiYjM0ODhiYzM1ODdiZDM3ODZiZTM4ODViZjM5ODRjMDNhODNjMTNiODJjMjNjODFjMzNkODBjNDNlN2ZjNTQwN2VjNjQxN2RjNzQyN2NjODQzN2JjOTQ0N2FjYTQ1N2FjYjQ2NzljYzQ3NzhjYzQ5NzdjZDRhNzZjZTRiNzVjZjRjNzRkMDRkNzNkMTRlNzJkMjRmNzFkMzUxNzFkNDUyNzBkNTUzNmZkNTU0NmVkNjU1NmRkNzU2NmNkODU3NmJkOTU4NmFkYTVhNmFkYTViNjlkYjVjNjhkYzVkNjdkZDVlNjZkZTVmNjVkZTYxNjRkZjYyNjNlMDYzNjNlMTY0NjJlMjY1NjFlMjY2NjBlMzY4NWZlNDY5NWVlNTZhNWRlNTZiNWRlNjZjNWNlNzZlNWJlNzZmNWFlODcwNTllOTcxNThlOTcyNTdlYTc0NTdlYjc1NTZlYjc2NTVlYzc3NTRlZDc5NTNlZDdhNTJlZTdiNTFlZjdjNTFlZjdlNTBmMDdmNGZmMDgwNGVmMTgxNGRmMTgzNGNmMjg0NGJmMzg1NGJmMzg3NGFmNDg4NDlmNDg5NDhmNThiNDdmNThjNDZmNjhkNDVmNjhmNDRmNzkwNDRmNzkxNDNmNzkzNDJmODk0NDFmODk1NDBmOTk3M2ZmOTk4M2VmOTlhM2VmYTliM2RmYTljM2NmYTllM2JmYjlmM2FmYmExMzlmYmEyMzhmY2EzMzhmY2E1MzdmY2E2MzZmY2E4MzVmY2E5MzRmZGFiMzNmZGFjMzNmZGFlMzJmZGFmMzFmZGIxMzBmZGIyMmZmZGI0MmZmZGI1MmVmZWI3MmRmZWI4MmNmZWJhMmNmZWJiMmJmZWJkMmFmZWJlMmFmZWMwMjlmZGMyMjlmZGMzMjhmZGM1MjdmZGM2MjdmZGM4MjdmZGNhMjZmZGNiMjZmY2NkMjVmY2NlMjVmY2QwMjVmY2QyMjVmYmQzMjRmYmQ1MjRmYmQ3MjRmYWQ4MjRmYWRhMjRmOWRjMjRmOWRkMjVmOGRmMjVmOGUxMjVmN2UyMjVmN2U0MjVmNmU2MjZmNmU4MjZmNWU5MjZmNWViMjdmNGVkMjdmM2VlMjdmM2YwMjdmMmYyMjdmMWY0MjZmMWY1MjVmMGY3MjRmMGY5MjEiKSksd2I9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSxNYj1NYXRoLmFicyxUYj1NYXRoLmF0YW4yLGtiPU1hdGguY29zLE5iPU1hdGgubWF4LFNiPU1hdGgubWluLEViPU1hdGguc2luLEFiPU1hdGguc3FydCxDYj0xZS0xMix6Yj1NYXRoLlBJLFBiPXpiLzIsTGI9Mip6YixSYj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt2YXIgdCxzLGY9K24uYXBwbHkodGhpcyxhcmd1bWVudHMpLGw9K2UuYXBwbHkodGhpcyxhcmd1bWVudHMpLGg9by5hcHBseSh0aGlzLGFyZ3VtZW50cyktUGIscD11LmFwcGx5KHRoaXMsYXJndW1lbnRzKS1QYixkPU1iKHAtaCksdj1wPmg7aWYoY3x8KGM9dD1VZSgpKSxsPGYmJihzPWwsbD1mLGY9cyksbD5DYilpZihkPkxiLUNiKWMubW92ZVRvKGwqa2IoaCksbCpFYihoKSksYy5hcmMoMCwwLGwsaCxwLCF2KSxmPkNiJiYoYy5tb3ZlVG8oZiprYihwKSxmKkViKHApKSxjLmFyYygwLDAsZixwLGgsdikpO2Vsc2V7dmFyIF8seSxnPWgsbT1wLHg9aCxiPXAsdz1kLE09ZCxUPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpLzIsaz1UPkNiJiYoaT8raS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6QWIoZipmK2wqbCkpLE49U2IoTWIobC1mKS8yLCtyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksUz1OLEU9TjtpZihrPkNiKXt2YXIgQT11YyhrL2YqRWIoVCkpLEM9dWMoay9sKkViKFQpKTsody09MipBKT5DYj8oQSo9dj8xOi0xLHgrPUEsYi09QSk6KHc9MCx4PWI9KGgrcCkvMiksKE0tPTIqQyk+Q2I/KEMqPXY/MTotMSxnKz1DLG0tPUMpOihNPTAsZz1tPShoK3ApLzIpfXZhciB6PWwqa2IoZyksUD1sKkViKGcpLEw9ZiprYihiKSxSPWYqRWIoYik7aWYoTj5DYil7dmFyIHE9bCprYihtKSxVPWwqRWIobSksRD1mKmtiKHgpLE89ZipFYih4KTtpZihkPHpiKXt2YXIgRj13PkNiP2hjKHosUCxELE8scSxVLEwsUik6W0wsUl0sST16LUZbMF0sWT1QLUZbMV0sQj1xLUZbMF0sSD1VLUZbMV0saj0xL0ViKG9jKChJKkIrWSpIKS8oQWIoSSpJK1kqWSkqQWIoQipCK0gqSCkpKS8yKSxYPUFiKEZbMF0qRlswXStGWzFdKkZbMV0pO1M9U2IoTiwoZi1YKS8oai0xKSksRT1TYihOLChsLVgpLyhqKzEpKX19TT5DYj9FPkNiPyhfPXBjKEQsTyx6LFAsbCxFLHYpLHk9cGMocSxVLEwsUixsLEUsdiksYy5tb3ZlVG8oXy5jeCtfLngwMSxfLmN5K18ueTAxKSxFPE4/Yy5hcmMoXy5jeCxfLmN5LEUsVGIoXy55MDEsXy54MDEpLFRiKHkueTAxLHkueDAxKSwhdik6KGMuYXJjKF8uY3gsXy5jeSxFLFRiKF8ueTAxLF8ueDAxKSxUYihfLnkxMSxfLngxMSksIXYpLGMuYXJjKDAsMCxsLFRiKF8uY3krXy55MTEsXy5jeCtfLngxMSksVGIoeS5jeSt5LnkxMSx5LmN4K3kueDExKSwhdiksYy5hcmMoeS5jeCx5LmN5LEUsVGIoeS55MTEseS54MTEpLFRiKHkueTAxLHkueDAxKSwhdikpKTooYy5tb3ZlVG8oeixQKSxjLmFyYygwLDAsbCxnLG0sIXYpKTpjLm1vdmVUbyh6LFApLGY+Q2ImJnc+Q2I/Uz5DYj8oXz1wYyhMLFIscSxVLGYsLVMsdikseT1wYyh6LFAsRCxPLGYsLVMsdiksYy5saW5lVG8oXy5jeCtfLngwMSxfLmN5K18ueTAxKSxTPE4/Yy5hcmMoXy5jeCxfLmN5LFMsVGIoXy55MDEsXy54MDEpLFRiKHkueTAxLHkueDAxKSwhdik6KGMuYXJjKF8uY3gsXy5jeSxTLFRiKF8ueTAxLF8ueDAxKSxUYihfLnkxMSxfLngxMSksIXYpLGMuYXJjKDAsMCxmLFRiKF8uY3krXy55MTEsXy5jeCtfLngxMSksVGIoeS5jeSt5LnkxMSx5LmN4K3kueDExKSx2KSxjLmFyYyh5LmN4LHkuY3ksUyxUYih5LnkxMSx5LngxMSksVGIoeS55MDEseS54MDEpLCF2KSkpOmMuYXJjKDAsMCxmLGIseCx2KTpjLmxpbmVUbyhMLFIpfWVsc2UgYy5tb3ZlVG8oMCwwKTtpZihjLmNsb3NlUGF0aCgpLHQpcmV0dXJuIGM9bnVsbCx0KyIifHxudWxsfXZhciBuPWFjLGU9Y2Mscj13YigwKSxpPW51bGwsbz1zYyx1PWZjLGE9bGMsYz1udWxsO3JldHVybiB0LmNlbnRyb2lkPWZ1bmN0aW9uKCl7dmFyIHQ9KCtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSsgK2UuYXBwbHkodGhpcyxhcmd1bWVudHMpKS8yLHI9KCtvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSsgK3UuYXBwbHkodGhpcyxhcmd1bWVudHMpKS8yLXpiLzI7cmV0dXJuW2tiKHIpKnQsRWIocikqdF19LHQuaW5uZXJSYWRpdXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTp3YigrZSksdCk6bn0sdC5vdXRlclJhZGl1cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOndiKCtuKSx0KTplfSx0LmNvcm5lclJhZGl1cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOndiKCtuKSx0KTpyfSx0LnBhZFJhZGl1cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1udWxsPT1uP251bGw6ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp3YigrbiksdCk6aX0sdC5zdGFydEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246d2IoK24pLHQpOm99LHQuZW5kQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp3YigrbiksdCk6dX0sdC5wYWRBbmdsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOndiKCtuKSx0KTphfSx0LmNvbnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9bnVsbD09bj9udWxsOm4sdCk6Y30sdH07ZGMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OnRoaXMuX2NvbnRleHQubGluZVRvKHQsbil9fX07dmFyIHFiPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZGModCl9LFViPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgYSxjLHMsZj10Lmxlbmd0aCxsPSExO2ZvcihudWxsPT1pJiYodT1vKHM9VWUoKSkpLGE9MDthPD1mOysrYSkhKGE8ZiYmcihjPXRbYV0sYSx0KSk9PT1sJiYoKGw9IWwpP3UubGluZVN0YXJ0KCk6dS5saW5lRW5kKCkpLGwmJnUucG9pbnQoK24oYyxhLHQpLCtlKGMsYSx0KSk7aWYocylyZXR1cm4gdT1udWxsLHMrIiJ8fG51bGx9dmFyIG49dmMsZT1fYyxyPXdiKCEwKSxpPW51bGwsbz1xYix1PW51bGw7cmV0dXJuIHQueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOndiKCtlKSx0KTpufSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp3YigrbiksdCk6ZX0sdC5kZWZpbmVkPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246d2IoISFuKSx0KTpyfSx0LmN1cnZlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW4sbnVsbCE9aSYmKHU9byhpKSksdCk6b30sdC5jb250ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT1uP2k9dT1udWxsOnU9byhpPW4pLHQpOml9LHR9LERiPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgbixmLGwsaCxwLGQ9dC5sZW5ndGgsdj0hMSxfPW5ldyBBcnJheShkKSx5PW5ldyBBcnJheShkKTtmb3IobnVsbD09YSYmKHM9YyhwPVVlKCkpKSxuPTA7bjw9ZDsrK24pe2lmKCEobjxkJiZ1KGg9dFtuXSxuLHQpKT09PXYpaWYodj0hdilmPW4scy5hcmVhU3RhcnQoKSxzLmxpbmVTdGFydCgpO2Vsc2V7Zm9yKHMubGluZUVuZCgpLHMubGluZVN0YXJ0KCksbD1uLTE7bD49ZjstLWwpcy5wb2ludChfW2xdLHlbbF0pO3MubGluZUVuZCgpLHMuYXJlYUVuZCgpfXYmJihfW25dPStlKGgsbix0KSx5W25dPStpKGgsbix0KSxzLnBvaW50KHI/K3IoaCxuLHQpOl9bbl0sbz8rbyhoLG4sdCk6eVtuXSkpfWlmKHApcmV0dXJuIHM9bnVsbCxwKyIifHxudWxsfWZ1bmN0aW9uIG4oKXtyZXR1cm4gVWIoKS5kZWZpbmVkKHUpLmN1cnZlKGMpLmNvbnRleHQoYSl9dmFyIGU9dmMscj1udWxsLGk9d2IoMCksbz1fYyx1PXdiKCEwKSxhPW51bGwsYz1xYixzPW51bGw7cmV0dXJuIHQueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOndiKCtuKSxyPW51bGwsdCk6ZX0sdC54MD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOndiKCtuKSx0KTplfSx0LngxPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PW4/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2Ygbj9uOndiKCtuKSx0KTpyfSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp3Yigrbiksbz1udWxsLHQpOml9LHQueTA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp3YigrbiksdCk6aX0sdC55MT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1udWxsPT1uP251bGw6ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp3YigrbiksdCk6b30sdC5saW5lWDA9dC5saW5lWTA9ZnVuY3Rpb24oKXtyZXR1cm4gbigpLngoZSkueShpKX0sdC5saW5lWTE9ZnVuY3Rpb24oKXtyZXR1cm4gbigpLngoZSkueShvKX0sdC5saW5lWDE9ZnVuY3Rpb24oKXtyZXR1cm4gbigpLngocikueShpKX0sdC5kZWZpbmVkPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246d2IoISFuKSx0KTp1fSx0LmN1cnZlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW4sbnVsbCE9YSYmKHM9YyhhKSksdCk6Y30sdC5jb250ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT1uP2E9cz1udWxsOnM9YyhhPW4pLHQpOmF9LHR9LE9iPWZ1bmN0aW9uKHQsbil7cmV0dXJuIG48dD8tMTpuPnQ/MTpuPj10PzA6TmFOfSxGYj1mdW5jdGlvbih0KXtyZXR1cm4gdH0sSWI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBhLGMscyxmLGwsaD10Lmxlbmd0aCxwPTAsZD1uZXcgQXJyYXkoaCksdj1uZXcgQXJyYXkoaCksXz0raS5hcHBseSh0aGlzLGFyZ3VtZW50cykseT1NYXRoLm1pbihMYixNYXRoLm1heCgtTGIsby5hcHBseSh0aGlzLGFyZ3VtZW50cyktXykpLGc9TWF0aC5taW4oTWF0aC5hYnMoeSkvaCx1LmFwcGx5KHRoaXMsYXJndW1lbnRzKSksbT1nKih5PDA/LTE6MSk7Zm9yKGE9MDthPGg7KythKShsPXZbZFthXT1hXT0rbih0W2FdLGEsdCkpPjAmJihwKz1sKTtmb3IobnVsbCE9ZT9kLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gZSh2W3RdLHZbbl0pfSk6bnVsbCE9ciYmZC5zb3J0KGZ1bmN0aW9uKG4sZSl7cmV0dXJuIHIodFtuXSx0W2VdKX0pLGE9MCxzPXA/KHktaCptKS9wOjA7YTxoOysrYSxfPWYpYz1kW2FdLGw9dltjXSxmPV8rKGw+MD9sKnM6MCkrbSx2W2NdPXtkYXRhOnRbY10saW5kZXg6YSx2YWx1ZTpsLHN0YXJ0QW5nbGU6XyxlbmRBbmdsZTpmLHBhZEFuZ2xlOmd9O3JldHVybiB2fXZhciBuPUZiLGU9T2Iscj1udWxsLGk9d2IoMCksbz13YihMYiksdT13YigwKTtyZXR1cm4gdC52YWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOndiKCtlKSx0KTpufSx0LnNvcnRWYWx1ZXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bixyPW51bGwsdCk6ZX0sdC5zb3J0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sZT1udWxsLHQpOnJ9LHQuc3RhcnRBbmdsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOndiKCtuKSx0KTppfSx0LmVuZEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246d2IoK24pLHQpOm99LHQucGFkQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp3YigrbiksdCk6dX0sdH0sWWI9Z2MocWIpO3ljLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUuYXJlYVN0YXJ0KCl9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5hcmVhRW5kKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX2N1cnZlLnBvaW50KG4qTWF0aC5zaW4odCksbiotTWF0aC5jb3ModCkpfX07dmFyIEJiPWZ1bmN0aW9uKCl7cmV0dXJuIG1jKFViKCkuY3VydmUoWWIpKX0sSGI9ZnVuY3Rpb24oKXt2YXIgdD1EYigpLmN1cnZlKFliKSxuPXQuY3VydmUsZT10LmxpbmVYMCxyPXQubGluZVgxLGk9dC5saW5lWTAsbz10LmxpbmVZMTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnN0YXJ0QW5nbGU9dC54MCxkZWxldGUgdC54MCx0LmVuZEFuZ2xlPXQueDEsZGVsZXRlIHQueDEsdC5yYWRpdXM9dC55LGRlbGV0ZSB0LnksdC5pbm5lclJhZGl1cz10LnkwLGRlbGV0ZSB0LnkwLHQub3V0ZXJSYWRpdXM9dC55MSxkZWxldGUgdC55MSx0LmxpbmVTdGFydEFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIG1jKGUoKSl9LGRlbGV0ZSB0LmxpbmVYMCx0LmxpbmVFbmRBbmdsZT1mdW5jdGlvbigpe3JldHVybiBtYyhyKCkpfSxkZWxldGUgdC5saW5lWDEsdC5saW5lSW5uZXJSYWRpdXM9ZnVuY3Rpb24oKXtyZXR1cm4gbWMoaSgpKX0sZGVsZXRlIHQubGluZVkwLHQubGluZU91dGVyUmFkaXVzPWZ1bmN0aW9uKCl7cmV0dXJuIG1jKG8oKSl9LGRlbGV0ZSB0LmxpbmVZMSx0LmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oZ2ModCkpOm4oKS5fY3VydmV9LHR9LGpiPUFycmF5LnByb3RvdHlwZS5zbGljZSxYYj1mdW5jdGlvbih0LG4pe3JldHVyblsobj0rbikqTWF0aC5jb3ModC09TWF0aC5QSS8yKSxuKk1hdGguc2luKHQpXX0sJGI9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQobi96Yik7dC5tb3ZlVG8oZSwwKSx0LmFyYygwLDAsZSwwLExiKX19LFZiPXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vNSkvMjt0Lm1vdmVUbygtMyplLC1lKSx0LmxpbmVUbygtZSwtZSksdC5saW5lVG8oLWUsLTMqZSksdC5saW5lVG8oZSwtMyplKSx0LmxpbmVUbyhlLC1lKSx0LmxpbmVUbygzKmUsLWUpLHQubGluZVRvKDMqZSxlKSx0LmxpbmVUbyhlLGUpLHQubGluZVRvKGUsMyplKSx0LmxpbmVUbygtZSwzKmUpLHQubGluZVRvKC1lLGUpLHQubGluZVRvKC0zKmUsZSksdC5jbG9zZVBhdGgoKX19LFdiPU1hdGguc3FydCgxLzMpLFpiPTIqV2IsR2I9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQobi9aYikscj1lKldiO3QubW92ZVRvKDAsLWUpLHQubGluZVRvKHIsMCksdC5saW5lVG8oMCxlKSx0LmxpbmVUbygtciwwKSx0LmNsb3NlUGF0aCgpfX0sSmI9TWF0aC5zaW4oemIvMTApL01hdGguc2luKDcqemIvMTApLFFiPU1hdGguc2luKExiLzEwKSpKYixLYj0tTWF0aC5jb3MoTGIvMTApKkpiLHR3PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KC44OTA4MTMwOTE1MjkyODUyKm4pLHI9UWIqZSxpPUtiKmU7dC5tb3ZlVG8oMCwtZSksdC5saW5lVG8ocixpKTtmb3IodmFyIG89MTtvPDU7KytvKXt2YXIgdT1MYipvLzUsYT1NYXRoLmNvcyh1KSxjPU1hdGguc2luKHUpO3QubGluZVRvKGMqZSwtYSplKSx0LmxpbmVUbyhhKnItYyppLGMqcithKmkpfXQuY2xvc2VQYXRoKCl9fSxudz17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuKSxyPS1lLzI7dC5yZWN0KHIscixlLGUpfX0sZXc9TWF0aC5zcXJ0KDMpLHJ3PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9LU1hdGguc3FydChuLygzKmV3KSk7dC5tb3ZlVG8oMCwyKmUpLHQubGluZVRvKC1ldyplLC1lKSx0LmxpbmVUbyhldyplLC1lKSx0LmNsb3NlUGF0aCgpfX0saXc9LS41LG93PU1hdGguc3FydCgzKS8yLHV3PTEvTWF0aC5zcXJ0KDEyKSxhdz0zKih1dy8yKzEpLGN3PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vYXcpLHI9ZS8yLGk9ZSp1dyxvPXIsdT1lKnV3K2UsYT0tbyxjPXU7dC5tb3ZlVG8ocixpKSx0LmxpbmVUbyhvLHUpLHQubGluZVRvKGEsYyksdC5saW5lVG8oaXcqci1vdyppLG93KnIraXcqaSksdC5saW5lVG8oaXcqby1vdyp1LG93Km8raXcqdSksdC5saW5lVG8oaXcqYS1vdypjLG93KmEraXcqYyksdC5saW5lVG8oaXcqcitvdyppLGl3Kmktb3cqciksdC5saW5lVG8oaXcqbytvdyp1LGl3KnUtb3cqbyksdC5saW5lVG8oaXcqYStvdypjLGl3KmMtb3cqYSksdC5jbG9zZVBhdGgoKX19LHN3PVskYixWYixHYixudyx0dyxydyxjd10sZnc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dmFyIHQ7aWYocnx8KHI9dD1VZSgpKSxuLmFwcGx5KHRoaXMsYXJndW1lbnRzKS5kcmF3KHIsK2UuYXBwbHkodGhpcyxhcmd1bWVudHMpKSx0KXJldHVybiByPW51bGwsdCsiInx8bnVsbH12YXIgbj13YigkYiksZT13Yig2NCkscj1udWxsO3JldHVybiB0LnR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTp3YihlKSx0KTpufSx0LnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp3YigrbiksdCk6ZX0sdC5jb250ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PW4/bnVsbDpuLHQpOnJ9LHR9LGx3PWZ1bmN0aW9uKCl7fTtDYy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAzOkFjKHRoaXMsdGhpcy5feDEsdGhpcy5feTEpO2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2NvbnRleHQubGluZVRvKCg1KnRoaXMuX3gwK3RoaXMuX3gxKS82LCg1KnRoaXMuX3kwK3RoaXMuX3kxKS82KTtkZWZhdWx0OkFjKHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPW59fTt2YXIgaHc9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBDYyh0KX07emMucHJvdG90eXBlPXthcmVhU3RhcnQ6bHcsYXJlYUVuZDpsdyxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl94Mz10aGlzLl94ND10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj10aGlzLl95Mz10aGlzLl95ND1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAxOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMjp0aGlzLl9jb250ZXh0Lm1vdmVUbygodGhpcy5feDIrMip0aGlzLl94MykvMywodGhpcy5feTIrMip0aGlzLl95MykvMyksdGhpcy5fY29udGV4dC5saW5lVG8oKHRoaXMuX3gzKzIqdGhpcy5feDIpLzMsKHRoaXMuX3kzKzIqdGhpcy5feTIpLzMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDIsdGhpcy5feTIpLHRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl94Mj10LHRoaXMuX3kyPW47YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5feDM9dCx0aGlzLl95Mz1uO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX3g0PXQsdGhpcy5feTQ9bix0aGlzLl9jb250ZXh0Lm1vdmVUbygodGhpcy5feDArNCp0aGlzLl94MSt0KS82LCh0aGlzLl95MCs0KnRoaXMuX3kxK24pLzYpO2JyZWFrO2RlZmF1bHQ6QWModGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9bn19O3ZhciBwdz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHpjKHQpfTtQYy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMz09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Mzt2YXIgZT0odGhpcy5feDArNCp0aGlzLl94MSt0KS82LHI9KHRoaXMuX3kwKzQqdGhpcy5feTErbikvNjt0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKGUscik6dGhpcy5fY29udGV4dC5tb3ZlVG8oZSxyKTticmVhaztjYXNlIDM6dGhpcy5fcG9pbnQ9NDtkZWZhdWx0OkFjKHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPW59fTt2YXIgZHc9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBQYyh0KX07TGMucHJvdG90eXBlPXtsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94PVtdLHRoaXMuX3k9W10sdGhpcy5fYmFzaXMubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl94LG49dGhpcy5feSxlPXQubGVuZ3RoLTE7aWYoZT4wKWZvcih2YXIgcixpPXRbMF0sbz1uWzBdLHU9dFtlXS1pLGE9bltlXS1vLGM9LTE7KytjPD1lOylyPWMvZSx0aGlzLl9iYXNpcy5wb2ludCh0aGlzLl9iZXRhKnRbY10rKDEtdGhpcy5fYmV0YSkqKGkrcip1KSx0aGlzLl9iZXRhKm5bY10rKDEtdGhpcy5fYmV0YSkqKG8rciphKSk7dGhpcy5feD10aGlzLl95PW51bGwsdGhpcy5fYmFzaXMubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX3gucHVzaCgrdCksdGhpcy5feS5wdXNoKCtuKX19O3ZhciB2dz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIDE9PT1uP25ldyBDYyh0KTpuZXcgTGModCxuKX1yZXR1cm4gZS5iZXRhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjg1KTtxYy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6UmModGhpcyx0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX3gxPXQsdGhpcy5feTE9bjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0OlJjKHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLAp0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIF93PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IHFjKHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO1VjLnByb3RvdHlwZT17YXJlYVN0YXJ0Omx3LGFyZWFFbmQ6bHcsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpLHRoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDQ9dCx0aGlzLl95ND1uKTticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl94NT10LHRoaXMuX3k1PW47YnJlYWs7ZGVmYXVsdDpSYyh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIHl3PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IFVjKHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO0RjLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYzPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5fcG9pbnQ9NDtkZWZhdWx0OlJjKHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgZ3c9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuZXcgRGModCxuKX1yZXR1cm4gZS50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oMCk7RmMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDIsdGhpcy5feTIpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtpZih0PSt0LG49K24sdGhpcy5fcG9pbnQpe3ZhciBlPXRoaXMuX3gyLXQscj10aGlzLl95Mi1uO3RoaXMuX2wyM19hPU1hdGguc3FydCh0aGlzLl9sMjNfMmE9TWF0aC5wb3coZSplK3Iqcix0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7ZGVmYXVsdDpPYyh0aGlzLHQsbil9dGhpcy5fbDAxX2E9dGhpcy5fbDEyX2EsdGhpcy5fbDEyX2E9dGhpcy5fbDIzX2EsdGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYSx0aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhLHRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciBtdz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG4/bmV3IEZjKHQsbik6bmV3IHFjKHQsMCl9cmV0dXJuIGUuYWxwaGE9ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSguNSk7SWMucHJvdG90eXBlPXthcmVhU3RhcnQ6bHcsYXJlYUVuZDpsdyxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl94Mz10aGlzLl94ND10aGlzLl94NT10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj10aGlzLl95Mz10aGlzLl95ND10aGlzLl95NT1OYU4sdGhpcy5fbDAxX2E9dGhpcy5fbDEyX2E9dGhpcy5fbDIzX2E9dGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmE9dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAxOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5wb2ludCh0aGlzLl94NCx0aGlzLl95NCksdGhpcy5wb2ludCh0aGlzLl94NSx0aGlzLl95NSl9fSxwb2ludDpmdW5jdGlvbih0LG4pe2lmKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7dmFyIGU9dGhpcy5feDItdCxyPXRoaXMuX3kyLW47dGhpcy5fbDIzX2E9TWF0aC5zcXJ0KHRoaXMuX2wyM18yYT1NYXRoLnBvdyhlKmUrcipyLHRoaXMuX2FscGhhKSl9c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDQ9dCx0aGlzLl95ND1uKTticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl94NT10LHRoaXMuX3k1PW47YnJlYWs7ZGVmYXVsdDpPYyh0aGlzLHQsbil9dGhpcy5fbDAxX2E9dGhpcy5fbDEyX2EsdGhpcy5fbDEyX2E9dGhpcy5fbDIzX2EsdGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYSx0aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhLHRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciB4dz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG4/bmV3IEljKHQsbik6bmV3IFVjKHQsMCl9cmV0dXJuIGUuYWxwaGE9ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSguNSk7WWMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7aWYodD0rdCxuPStuLHRoaXMuX3BvaW50KXt2YXIgZT10aGlzLl94Mi10LHI9dGhpcy5feTItbjt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KGUqZStyKnIsdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5fcG9pbnQ9NDtkZWZhdWx0Ok9jKHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIGJ3PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgWWModCxuKTpuZXcgRGModCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTtCYy5wcm90b3R5cGU9e2FyZWFTdGFydDpsdyxhcmVhRW5kOmx3LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludCYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXt0PSt0LG49K24sdGhpcy5fcG9pbnQ/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKToodGhpcy5fcG9pbnQ9MSx0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pKX19O3ZhciB3dz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IEJjKHQpfTtWYy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT10aGlzLl90MD1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLHRoaXMuX3kxKTticmVhaztjYXNlIDM6JGModGhpcyx0aGlzLl90MCxYYyh0aGlzLHRoaXMuX3QwKSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3ZhciBlPU5hTjtpZih0PSt0LG49K24sdCE9PXRoaXMuX3gxfHxuIT09dGhpcy5feTEpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsJGModGhpcyxYYyh0aGlzLGU9amModGhpcyx0LG4pKSxlKTticmVhaztkZWZhdWx0OiRjKHRoaXMsdGhpcy5fdDAsZT1qYyh0aGlzLHQsbikpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9bix0aGlzLl90MD1lfX19LChXYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShWYy5wcm90b3R5cGUpKS5wb2ludD1mdW5jdGlvbih0LG4pe1ZjLnByb3RvdHlwZS5wb2ludC5jYWxsKHRoaXMsbix0KX0sWmMucHJvdG90eXBlPXttb3ZlVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0Lm1vdmVUbyhuLHQpfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXt0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpfSxsaW5lVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0LmxpbmVUbyhuLHQpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsbixlLHIsaSxvKXt0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8obix0LHIsZSxvLGkpfX0sUWMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD1bXSx0aGlzLl95PVtdfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5feCxuPXRoaXMuX3ksZT10Lmxlbmd0aDtpZihlKWlmKHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odFswXSxuWzBdKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0WzBdLG5bMF0pLDI9PT1lKXRoaXMuX2NvbnRleHQubGluZVRvKHRbMV0sblsxXSk7ZWxzZSBmb3IodmFyIHI9S2ModCksaT1LYyhuKSxvPTAsdT0xO3U8ZTsrK28sKyt1KXRoaXMuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhyWzBdW29dLGlbMF1bb10sclsxXVtvXSxpWzFdW29dLHRbdV0sblt1XSk7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09ZSkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmUsdGhpcy5feD10aGlzLl95PW51bGx9LHBvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5feC5wdXNoKCt0KSx0aGlzLl95LnB1c2goK24pfX07dmFyIE13PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgUWModCl9O3RzLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3g9dGhpcy5feT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpezA8dGhpcy5fdCYmdGhpcy5fdDwxJiYyPT09dGhpcy5fcG9pbnQmJnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gsdGhpcy5feSksKHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU+PTAmJih0aGlzLl90PTEtdGhpcy5fdCx0aGlzLl9saW5lPTEtdGhpcy5fbGluZSl9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7ZGVmYXVsdDppZih0aGlzLl90PD0wKXRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gsbiksdGhpcy5fY29udGV4dC5saW5lVG8odCxuKTtlbHNle3ZhciBlPXRoaXMuX3gqKDEtdGhpcy5fdCkrdCp0aGlzLl90O3RoaXMuX2NvbnRleHQubGluZVRvKGUsdGhpcy5feSksdGhpcy5fY29udGV4dC5saW5lVG8oZSxuKX19dGhpcy5feD10LHRoaXMuX3k9bn19O3ZhciBUdz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHRzKHQsLjUpfSxrdz1mdW5jdGlvbih0LG4pe2lmKChpPXQubGVuZ3RoKT4xKWZvcih2YXIgZSxyLGksbz0xLHU9dFtuWzBdXSxhPXUubGVuZ3RoO288aTsrK28pZm9yKHI9dSx1PXRbbltvXV0sZT0wO2U8YTsrK2UpdVtlXVsxXSs9dVtlXVswXT1pc05hTihyW2VdWzFdKT9yW2VdWzBdOnJbZV1bMV19LE53PWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10Lmxlbmd0aCxlPW5ldyBBcnJheShuKTstLW4+PTA7KWVbbl09bjtyZXR1cm4gZX0sU3c9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBvLHUsYT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxjPXQubGVuZ3RoLHM9YS5sZW5ndGgsZj1uZXcgQXJyYXkocyk7Zm9yKG89MDtvPHM7KytvKXtmb3IodmFyIGwsaD1hW29dLHA9ZltvXT1uZXcgQXJyYXkoYyksZD0wO2Q8YzsrK2QpcFtkXT1sPVswLCtpKHRbZF0saCxkLHQpXSxsLmRhdGE9dFtkXTtwLmtleT1ofWZvcihvPTAsdT1lKGYpO288czsrK28pZlt1W29dXS5pbmRleD1vO3JldHVybiByKGYsdSksZn12YXIgbj13YihbXSksZT1OdyxyPWt3LGk9cnM7cmV0dXJuIHQua2V5cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOndiKGpiLmNhbGwoZSkpLHQpOm59LHQudmFsdWU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp3YigrbiksdCk6aX0sdC5vcmRlcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT1uP053OiJmdW5jdGlvbiI9PXR5cGVvZiBuP246d2IoamIuY2FsbChuKSksdCk6ZX0sdC5vZmZzZXQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09bj9rdzpuLHQpOnJ9LHR9LEV3PWZ1bmN0aW9uKHQsbil7aWYoKHI9dC5sZW5ndGgpPjApe2Zvcih2YXIgZSxyLGksbz0wLHU9dFswXS5sZW5ndGg7bzx1Oysrbyl7Zm9yKGk9ZT0wO2U8cjsrK2UpaSs9dFtlXVtvXVsxXXx8MDtpZihpKWZvcihlPTA7ZTxyOysrZSl0W2VdW29dWzFdLz1pfWt3KHQsbil9fSxBdz1mdW5jdGlvbih0LG4pe2lmKChhPXQubGVuZ3RoKT4xKWZvcih2YXIgZSxyLGksbyx1LGEsYz0wLHM9dFtuWzBdXS5sZW5ndGg7YzxzOysrYylmb3Iobz11PTAsZT0wO2U8YTsrK2UpKGk9KHI9dFtuW2VdXVtjXSlbMV0tclswXSk+PTA/KHJbMF09byxyWzFdPW8rPWkpOmk8MD8oclsxXT11LHJbMF09dSs9aSk6clswXT1vfSxDdz1mdW5jdGlvbih0LG4pe2lmKChlPXQubGVuZ3RoKT4wKXtmb3IodmFyIGUscj0wLGk9dFtuWzBdXSxvPWkubGVuZ3RoO3I8bzsrK3Ipe2Zvcih2YXIgdT0wLGE9MDt1PGU7Kyt1KWErPXRbdV1bcl1bMV18fDA7aVtyXVsxXSs9aVtyXVswXT0tYS8yfWt3KHQsbil9fSx6dz1mdW5jdGlvbih0LG4pe2lmKChpPXQubGVuZ3RoKT4wJiYocj0oZT10W25bMF1dKS5sZW5ndGgpPjApe2Zvcih2YXIgZSxyLGksbz0wLHU9MTt1PHI7Kyt1KXtmb3IodmFyIGE9MCxjPTAscz0wO2E8aTsrK2Epe2Zvcih2YXIgZj10W25bYV1dLGw9Zlt1XVsxXXx8MCxoPWZbdS0xXVsxXXx8MCxwPShsLWgpLzIsZD0wO2Q8YTsrK2Qpe3ZhciB2PXRbbltkXV07cCs9KHZbdV1bMV18fDApLSh2W3UtMV1bMV18fDApfWMrPWwscys9cCpsfWVbdS0xXVsxXSs9ZVt1LTFdWzBdPW8sYyYmKG8tPXMvYyl9ZVt1LTFdWzFdKz1lW3UtMV1bMF09byxrdyh0LG4pfX0sUHc9ZnVuY3Rpb24odCl7dmFyIG49dC5tYXAoaXMpO3JldHVybiBOdyh0KS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5bdF0tbltlXX0pfSxMdz1mdW5jdGlvbih0KXtyZXR1cm4gUHcodCkucmV2ZXJzZSgpfSxSdz1mdW5jdGlvbih0KXt2YXIgbixlLHI9dC5sZW5ndGgsaT10Lm1hcChpcyksbz1Odyh0KS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIGlbbl0taVt0XX0pLHU9MCxhPTAsYz1bXSxzPVtdO2ZvcihuPTA7bjxyOysrbillPW9bbl0sdTxhPyh1Kz1pW2VdLGMucHVzaChlKSk6KGErPWlbZV0scy5wdXNoKGUpKTtyZXR1cm4gcy5yZXZlcnNlKCkuY29uY2F0KGMpfSxxdz1mdW5jdGlvbih0KXtyZXR1cm4gTncodCkucmV2ZXJzZSgpfSxVdz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19O2FzLnByb3RvdHlwZT17Y29uc3RydWN0b3I6YXMsaW5zZXJ0OmZ1bmN0aW9uKHQsbil7dmFyIGUscixpO2lmKHQpe2lmKG4uUD10LG4uTj10Lk4sdC5OJiYodC5OLlA9biksdC5OPW4sdC5SKXtmb3IodD10LlI7dC5MOyl0PXQuTDt0Lkw9bn1lbHNlIHQuUj1uO2U9dH1lbHNlIHRoaXMuXz8odD1scyh0aGlzLl8pLG4uUD1udWxsLG4uTj10LHQuUD10Lkw9bixlPXQpOihuLlA9bi5OPW51bGwsdGhpcy5fPW4sZT1udWxsKTtmb3Iobi5MPW4uUj1udWxsLG4uVT1lLG4uQz0hMCx0PW47ZSYmZS5DOylyPWUuVSxlPT09ci5MPyhpPXIuUixpJiZpLkM/KGUuQz1pLkM9ITEsci5DPSEwLHQ9cik6KHQ9PT1lLlImJihzcyh0aGlzLGUpLHQ9ZSxlPXQuVSksZS5DPSExLHIuQz0hMCxmcyh0aGlzLHIpKSk6KGk9ci5MLGkmJmkuQz8oZS5DPWkuQz0hMSxyLkM9ITAsdD1yKToodD09PWUuTCYmKGZzKHRoaXMsZSksdD1lLGU9dC5VKSxlLkM9ITEsci5DPSEwLHNzKHRoaXMscikpKSxlPXQuVTt0aGlzLl8uQz0hMX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3QuTiYmKHQuTi5QPXQuUCksdC5QJiYodC5QLk49dC5OKSx0Lk49dC5QPW51bGw7dmFyIG4sZSxyLGk9dC5VLG89dC5MLHU9dC5SO2lmKGU9bz91P2xzKHUpOm86dSxpP2kuTD09PXQ/aS5MPWU6aS5SPWU6dGhpcy5fPWUsbyYmdT8ocj1lLkMsZS5DPXQuQyxlLkw9byxvLlU9ZSxlIT09dT8oaT1lLlUsZS5VPXQuVSx0PWUuUixpLkw9dCxlLlI9dSx1LlU9ZSk6KGUuVT1pLGk9ZSx0PWUuUikpOihyPXQuQyx0PWUpLHQmJih0LlU9aSksIXIpe2lmKHQmJnQuQylyZXR1cm4gdm9pZCh0LkM9ITEpO2Rve2lmKHQ9PT10aGlzLl8pYnJlYWs7aWYodD09PWkuTCl7aWYobj1pLlIsbi5DJiYobi5DPSExLGkuQz0hMCxzcyh0aGlzLGkpLG49aS5SKSxuLkwmJm4uTC5DfHxuLlImJm4uUi5DKXtuLlImJm4uUi5DfHwobi5MLkM9ITEsbi5DPSEwLGZzKHRoaXMsbiksbj1pLlIpLG4uQz1pLkMsaS5DPW4uUi5DPSExLHNzKHRoaXMsaSksdD10aGlzLl87YnJlYWt9fWVsc2UgaWYobj1pLkwsbi5DJiYobi5DPSExLGkuQz0hMCxmcyh0aGlzLGkpLG49aS5MKSxuLkwmJm4uTC5DfHxuLlImJm4uUi5DKXtuLkwmJm4uTC5DfHwobi5SLkM9ITEsbi5DPSEwLHNzKHRoaXMsbiksbj1pLkwpLG4uQz1pLkMsaS5DPW4uTC5DPSExLGZzKHRoaXMsaSksdD10aGlzLl87YnJlYWt9bi5DPSEwLHQ9aSxpPWkuVX13aGlsZSghdC5DKTt0JiYodC5DPSExKX19fTt2YXIgRHcsT3csRncsSXcsWXcsQnc9W10sSHc9W10sanc9MWUtNixYdz0xZS0xMjtVcy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlVzLHBvbHlnb25zOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lZGdlcztyZXR1cm4gdGhpcy5jZWxscy5tYXAoZnVuY3Rpb24obil7dmFyIGU9bi5oYWxmZWRnZXMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiB4cyhuLHRbZV0pfSk7cmV0dXJuIGUuZGF0YT1uLnNpdGUuZGF0YSxlfSl9LHRyaWFuZ2xlczpmdW5jdGlvbigpe3ZhciB0PVtdLG49dGhpcy5lZGdlcztyZXR1cm4gdGhpcy5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKGUscil7aWYobz0oaT1lLmhhbGZlZGdlcykubGVuZ3RoKWZvcih2YXIgaSxvLHUsYT1lLnNpdGUsYz0tMSxzPW5baVtvLTFdXSxmPXMubGVmdD09PWE/cy5yaWdodDpzLmxlZnQ7KytjPG87KXU9ZixzPW5baVtjXV0sZj1zLmxlZnQ9PT1hP3MucmlnaHQ6cy5sZWZ0LHUmJmYmJnI8dS5pbmRleCYmcjxmLmluZGV4JiZScyhhLHUsZik8MCYmdC5wdXNoKFthLmRhdGEsdS5kYXRhLGYuZGF0YV0pfSksdH0sbGlua3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGdlcy5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQucmlnaHR9KS5tYXAoZnVuY3Rpb24odCl7cmV0dXJue3NvdXJjZTp0LmxlZnQuZGF0YSx0YXJnZXQ6dC5yaWdodC5kYXRhfX0pfSxmaW5kOmZ1bmN0aW9uKHQsbixlKXtmb3IodmFyIHIsaSxvPXRoaXMsdT1vLl9mb3VuZHx8MCxhPW8uY2VsbHMubGVuZ3RoOyEoaT1vLmNlbGxzW3VdKTspaWYoKyt1Pj1hKXJldHVybiBudWxsO3ZhciBjPXQtaS5zaXRlWzBdLHM9bi1pLnNpdGVbMV0sZj1jKmMrcypzO2Rve2k9by5jZWxsc1tyPXVdLHU9bnVsbCxpLmhhbGZlZGdlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciByPW8uZWRnZXNbZV0sYT1yLmxlZnQ7aWYoYSE9PWkuc2l0ZSYmYXx8KGE9ci5yaWdodCkpe3ZhciBjPXQtYVswXSxzPW4tYVsxXSxsPWMqYytzKnM7bDxmJiYoZj1sLHU9YS5pbmRleCl9fSl9d2hpbGUobnVsbCE9PXUpO3JldHVybiBvLl9mb3VuZD1yLG51bGw9PWV8fGY8PWUqZT9pLnNpdGU6bnVsbH19O3ZhciAkdz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7cmV0dXJuIG5ldyBVcyh0Lm1hcChmdW5jdGlvbihyLGkpe3ZhciBvPVtNYXRoLnJvdW5kKG4ocixpLHQpL2p3KSpqdyxNYXRoLnJvdW5kKGUocixpLHQpL2p3KSpqd107cmV0dXJuIG8uaW5kZXg9aSxvLmRhdGE9cixvfSkscil9dmFyIG49b3MsZT11cyxyPW51bGw7cmV0dXJuIHQucG9seWdvbnM9ZnVuY3Rpb24obil7cmV0dXJuIHQobikucG9seWdvbnMoKX0sdC5saW5rcz1mdW5jdGlvbihuKXtyZXR1cm4gdChuKS5saW5rcygpfSx0LnRyaWFuZ2xlcz1mdW5jdGlvbihuKXtyZXR1cm4gdChuKS50cmlhbmdsZXMoKX0sdC54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6VXcoK2UpLHQpOm59LHQueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlV3KCtuKSx0KTplfSx0LmV4dGVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT1uP251bGw6W1srblswXVswXSwrblswXVsxXV0sWytuWzFdWzBdLCtuWzFdWzFdXV0sdCk6ciYmW1tyWzBdWzBdLHJbMF1bMV1dLFtyWzFdWzBdLHJbMV1bMV1dXX0sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PW4/bnVsbDpbWzAsMF0sWytuWzBdLCtuWzFdXV0sdCk6ciYmW3JbMV1bMF0tclswXVswXSxyWzFdWzFdLXJbMF1bMV1dfSx0fSxWdz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19O09zLnByb3RvdHlwZT17Y29uc3RydWN0b3I6T3Msc2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10P3RoaXM6bmV3IE9zKHRoaXMuayp0LHRoaXMueCx0aGlzLnkpfSx0cmFuc2xhdGU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gMD09PXQmMD09PW4/dGhpczpuZXcgT3ModGhpcy5rLHRoaXMueCt0aGlzLmsqdCx0aGlzLnkrdGhpcy5rKm4pfSxhcHBseTpmdW5jdGlvbih0KXtyZXR1cm5bdFswXSp0aGlzLmsrdGhpcy54LHRbMV0qdGhpcy5rK3RoaXMueV19LGFwcGx5WDpmdW5jdGlvbih0KXtyZXR1cm4gdCp0aGlzLmsrdGhpcy54fSxhcHBseVk6ZnVuY3Rpb24odCl7cmV0dXJuIHQqdGhpcy5rK3RoaXMueX0saW52ZXJ0OmZ1bmN0aW9uKHQpe3JldHVyblsodFswXS10aGlzLngpL3RoaXMuaywodFsxXS10aGlzLnkpL3RoaXMua119LGludmVydFg6ZnVuY3Rpb24odCl7cmV0dXJuKHQtdGhpcy54KS90aGlzLmt9LGludmVydFk6ZnVuY3Rpb24odCl7cmV0dXJuKHQtdGhpcy55KS90aGlzLmt9LHJlc2NhbGVYOmZ1bmN0aW9uKHQpe3JldHVybiB0LmNvcHkoKS5kb21haW4odC5yYW5nZSgpLm1hcCh0aGlzLmludmVydFgsdGhpcykubWFwKHQuaW52ZXJ0LHQpKX0scmVzY2FsZVk6ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weSgpLmRvbWFpbih0LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WSx0aGlzKS5tYXAodC5pbnZlcnQsdCkpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiJ0cmFuc2xhdGUoIit0aGlzLngrIiwiK3RoaXMueSsiKSBzY2FsZSgiK3RoaXMuaysiKSJ9fTt2YXIgV3c9bmV3IE9zKDEsMCwwKTtGcy5wcm90b3R5cGU9T3MucHJvdG90eXBlO3ZhciBadz1mdW5jdGlvbigpe3QuZXZlbnQucHJldmVudERlZmF1bHQoKSx0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfSxHdz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odCl7dC5vbigid2hlZWwuem9vbSIscykub24oIm1vdXNlZG93bi56b29tIixmKS5vbigiZGJsY2xpY2suem9vbSIsbCkub24oInRvdWNoc3RhcnQuem9vbSIsaCkub24oInRvdWNobW92ZS56b29tIixwKS5vbigidG91Y2hlbmQuem9vbSB0b3VjaGNhbmNlbC56b29tIixkKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpLnByb3BlcnR5KCJfX3pvb20iLEhzKX1mdW5jdGlvbiBlKHQsbil7cmV0dXJuIG49TWF0aC5tYXgoeCxNYXRoLm1pbihiLG4pKSxuPT09dC5rP3Q6bmV3IE9zKG4sdC54LHQueSl9ZnVuY3Rpb24gcih0LG4sZSl7dmFyIHI9blswXS1lWzBdKnQuayxpPW5bMV0tZVsxXSp0Lms7cmV0dXJuIHI9PT10LngmJmk9PT10Lnk/dDpuZXcgT3ModC5rLHIsaSl9ZnVuY3Rpb24gaSh0LG4pe3ZhciBlPXQuaW52ZXJ0WChuWzBdWzBdKS13LHI9dC5pbnZlcnRYKG5bMV1bMF0pLU0saT10LmludmVydFkoblswXVsxXSktVCxvPXQuaW52ZXJ0WShuWzFdWzFdKS1rO3JldHVybiB0LnRyYW5zbGF0ZShyPmU/KGUrcikvMjpNYXRoLm1pbigwLGUpfHxNYXRoLm1heCgwLHIpLG8+aT8oaStvKS8yOk1hdGgubWluKDAsaSl8fE1hdGgubWF4KDAsbykpfWZ1bmN0aW9uIG8odCl7cmV0dXJuWygrdFswXVswXSsgK3RbMV1bMF0pLzIsKCt0WzBdWzFdKyArdFsxXVsxXSkvMl19ZnVuY3Rpb24gdSh0LG4sZSl7dC5vbigic3RhcnQuem9vbSIsZnVuY3Rpb24oKXthKHRoaXMsYXJndW1lbnRzKS5zdGFydCgpfSkub24oImludGVycnVwdC56b29tIGVuZC56b29tIixmdW5jdGlvbigpe2EodGhpcyxhcmd1bWVudHMpLmVuZCgpfSkudHdlZW4oInpvb20iLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxyPWFyZ3VtZW50cyxpPWEodCxyKSx1PW0uYXBwbHkodCxyKSxjPWV8fG8odSkscz1NYXRoLm1heCh1WzFdWzBdLXVbMF1bMF0sdVsxXVsxXS11WzBdWzFdKSxmPXQuX196b29tLGw9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0LHIpOm4saD1TKGYuaW52ZXJ0KGMpLmNvbmNhdChzL2YuayksbC5pbnZlcnQoYykuY29uY2F0KHMvbC5rKSk7cmV0dXJuIGZ1bmN0aW9uKHQpe2lmKDE9PT10KXQ9bDtlbHNle3ZhciBuPWgodCksZT1zL25bMl07dD1uZXcgT3MoZSxjWzBdLW5bMF0qZSxjWzFdLW5bMV0qZSl9aS56b29tKG51bGwsdCl9fSl9ZnVuY3Rpb24gYSh0LG4pe2Zvcih2YXIgZSxyPTAsaT1FLmxlbmd0aDtyPGk7KytyKWlmKChlPUVbcl0pLnRoYXQ9PT10KXJldHVybiBlO3JldHVybiBuZXcgYyh0LG4pfWZ1bmN0aW9uIGModCxuKXt0aGlzLnRoYXQ9dCx0aGlzLmFyZ3M9bix0aGlzLmluZGV4PS0xLHRoaXMuYWN0aXZlPTAsdGhpcy5leHRlbnQ9bS5hcHBseSh0LG4pfWZ1bmN0aW9uIHMoKXtmdW5jdGlvbiBuKCl7by53aGVlbD1udWxsLG8uZW5kKCl9aWYoZy5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBvPWEodGhpcyxhcmd1bWVudHMpLHU9dGhpcy5fX3pvb20sYz1NYXRoLm1heCh4LE1hdGgubWluKGIsdS5rKk1hdGgucG93KDIsLXQuZXZlbnQuZGVsdGFZKih0LmV2ZW50LmRlbHRhTW9kZT8xMjA6MSkvNTAwKSkpLHM9R2YodGhpcyk7aWYoby53aGVlbClvLm1vdXNlWzBdWzBdPT09c1swXSYmby5tb3VzZVswXVsxXT09PXNbMV18fChvLm1vdXNlWzFdPXUuaW52ZXJ0KG8ubW91c2VbMF09cykpLGNsZWFyVGltZW91dChvLndoZWVsKTtlbHNle2lmKHUuaz09PWMpcmV0dXJuO28ubW91c2U9W3MsdS5pbnZlcnQocyldLGdwKHRoaXMpLG8uc3RhcnQoKX1adygpLG8ud2hlZWw9c2V0VGltZW91dChuLFApLG8uem9vbSgibW91c2UiLGkocihlKHUsYyksby5tb3VzZVswXSxvLm1vdXNlWzFdKSxvLmV4dGVudCkpfX1mdW5jdGlvbiBmKCl7ZnVuY3Rpb24gbigpe2lmKFp3KCksIW8ubW92ZWQpe3ZhciBuPXQuZXZlbnQuY2xpZW50WC1zLGU9dC5ldmVudC5jbGllbnRZLWY7by5tb3ZlZD1uKm4rZSplPkx9by56b29tKCJtb3VzZSIsaShyKG8udGhhdC5fX3pvb20sby5tb3VzZVswXT1HZihvLnRoYXQpLG8ubW91c2VbMV0pLG8uZXh0ZW50KSl9ZnVuY3Rpb24gZSgpe3Uub24oIm1vdXNlbW92ZS56b29tIG1vdXNldXAuem9vbSIsbnVsbCksbXQodC5ldmVudC52aWV3LG8ubW92ZWQpLFp3KCksby5lbmQoKX1pZigheSYmZy5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBvPWEodGhpcyxhcmd1bWVudHMpLHU9UGwodC5ldmVudC52aWV3KS5vbigibW91c2Vtb3ZlLnpvb20iLG4sITApLm9uKCJtb3VzZXVwLnpvb20iLGUsITApLGM9R2YodGhpcykscz10LmV2ZW50LmNsaWVudFgsZj10LmV2ZW50LmNsaWVudFk7RGwodC5ldmVudC52aWV3KSxJcygpLG8ubW91c2U9W2MsdGhpcy5fX3pvb20uaW52ZXJ0KGMpXSxncCh0aGlzKSxvLnN0YXJ0KCl9fWZ1bmN0aW9uIGwoKXtpZihnLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIG89dGhpcy5fX3pvb20sYT1HZih0aGlzKSxjPW8uaW52ZXJ0KGEpLHM9by5rKih0LmV2ZW50LnNoaWZ0S2V5Py41OjIpLGY9aShyKGUobyxzKSxhLGMpLG0uYXBwbHkodGhpcyxhcmd1bWVudHMpKTtadygpLE4+MD9QbCh0aGlzKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oTikuY2FsbCh1LGYsYSk6UGwodGhpcykuY2FsbChuLnRyYW5zZm9ybSxmKX19ZnVuY3Rpb24gaCgpe2lmKGcuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbixlLHIsaSxvPWEodGhpcyxhcmd1bWVudHMpLHU9dC5ldmVudC5jaGFuZ2VkVG91Y2hlcyxjPXUubGVuZ3RoO2ZvcihJcygpLGU9MDtlPGM7KytlKXI9dVtlXSxpPVJsKHRoaXMsdSxyLmlkZW50aWZpZXIpLGk9W2ksdGhpcy5fX3pvb20uaW52ZXJ0KGkpLHIuaWRlbnRpZmllcl0sby50b3VjaDA/by50b3VjaDF8fChvLnRvdWNoMT1pKTooby50b3VjaDA9aSxuPSEwKTtpZihfJiYoXz1jbGVhclRpbWVvdXQoXyksIW8udG91Y2gxKSlyZXR1cm4gby5lbmQoKSx2b2lkKChpPVBsKHRoaXMpLm9uKCJkYmxjbGljay56b29tIikpJiZpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSk7biYmKF89c2V0VGltZW91dChmdW5jdGlvbigpe189bnVsbH0seiksZ3AodGhpcyksby5zdGFydCgpKX19ZnVuY3Rpb24gcCgpe3ZhciBuLG8sdSxjLHM9YSh0aGlzLGFyZ3VtZW50cyksZj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGw9Zi5sZW5ndGg7Zm9yKFp3KCksXyYmKF89Y2xlYXJUaW1lb3V0KF8pKSxuPTA7bjxsOysrbilvPWZbbl0sdT1SbCh0aGlzLGYsby5pZGVudGlmaWVyKSxzLnRvdWNoMCYmcy50b3VjaDBbMl09PT1vLmlkZW50aWZpZXI/cy50b3VjaDBbMF09dTpzLnRvdWNoMSYmcy50b3VjaDFbMl09PT1vLmlkZW50aWZpZXImJihzLnRvdWNoMVswXT11KTtpZihvPXMudGhhdC5fX3pvb20scy50b3VjaDEpe3ZhciBoPXMudG91Y2gwWzBdLHA9cy50b3VjaDBbMV0sZD1zLnRvdWNoMVswXSx2PXMudG91Y2gxWzFdLHk9KHk9ZFswXS1oWzBdKSp5Kyh5PWRbMV0taFsxXSkqeSxnPShnPXZbMF0tcFswXSkqZysoZz12WzFdLXBbMV0pKmc7bz1lKG8sTWF0aC5zcXJ0KHkvZykpLHU9WyhoWzBdK2RbMF0pLzIsKGhbMV0rZFsxXSkvMl0sYz1bKHBbMF0rdlswXSkvMiwocFsxXSt2WzFdKS8yXX1lbHNle2lmKCFzLnRvdWNoMClyZXR1cm47dT1zLnRvdWNoMFswXSxjPXMudG91Y2gwWzFdfXMuem9vbSgidG91Y2giLGkocihvLHUsYykscy5leHRlbnQpKX1mdW5jdGlvbiBkKCl7dmFyIG4sZSxyPWEodGhpcyxhcmd1bWVudHMpLGk9dC5ldmVudC5jaGFuZ2VkVG91Y2hlcyxvPWkubGVuZ3RoO2ZvcihJcygpLHkmJmNsZWFyVGltZW91dCh5KSx5PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt5PW51bGx9LHopLG49MDtuPG87KytuKWU9aVtuXSxyLnRvdWNoMCYmci50b3VjaDBbMl09PT1lLmlkZW50aWZpZXI/ZGVsZXRlIHIudG91Y2gwOnIudG91Y2gxJiZyLnRvdWNoMVsyXT09PWUuaWRlbnRpZmllciYmZGVsZXRlIHIudG91Y2gxO3IudG91Y2gxJiYhci50b3VjaDAmJihyLnRvdWNoMD1yLnRvdWNoMSxkZWxldGUgci50b3VjaDEpLHIudG91Y2gwP3IudG91Y2gwWzFdPXRoaXMuX196b29tLmludmVydChyLnRvdWNoMFswXSk6ci5lbmQoKX12YXIgXyx5LGc9WXMsbT1Ccyx4PTAsYj0xLzAsdz0tYixNPWIsVD13LGs9TSxOPTI1MCxTPUhoLEU9W10sQz12KCJzdGFydCIsInpvb20iLCJlbmQiKSx6PTUwMCxQPTE1MCxMPTA7cmV0dXJuIG4udHJhbnNmb3JtPWZ1bmN0aW9uKHQsbil7dmFyIGU9dC5zZWxlY3Rpb24/dC5zZWxlY3Rpb24oKTp0O2UucHJvcGVydHkoIl9fem9vbSIsSHMpLHQhPT1lP3UodCxuKTplLmludGVycnVwdCgpLmVhY2goZnVuY3Rpb24oKXthKHRoaXMsYXJndW1lbnRzKS5zdGFydCgpLnpvb20obnVsbCwiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuKS5lbmQoKX0pfSxuLnNjYWxlQnk9ZnVuY3Rpb24odCxlKXtuLnNjYWxlVG8odCxmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fem9vbS5rKigiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTplKX0pfSxuLnNjYWxlVG89ZnVuY3Rpb24odCx1KXtuLnRyYW5zZm9ybSh0LGZ1bmN0aW9uKCl7dmFyIHQ9bS5hcHBseSh0aGlzLGFyZ3VtZW50cyksbj10aGlzLl9fem9vbSxhPW8odCksYz1uLmludmVydChhKTtyZXR1cm4gaShyKGUobiwiZnVuY3Rpb24iPT10eXBlb2YgdT91LmFwcGx5KHRoaXMsYXJndW1lbnRzKTp1KSxhLGMpLHQpfSl9LG4udHJhbnNsYXRlQnk9ZnVuY3Rpb24odCxlLHIpe24udHJhbnNmb3JtKHQsZnVuY3Rpb24oKXtyZXR1cm4gaSh0aGlzLl9fem9vbS50cmFuc2xhdGUoImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ZSwiZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpyKSxtLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9KX0sYy5wcm90b3R5cGU9e3N0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PSsrdGhpcy5hY3RpdmUmJih0aGlzLmluZGV4PUUucHVzaCh0aGlzKS0xLHRoaXMuZW1pdCgic3RhcnQiKSksdGhpc30sem9vbTpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLm1vdXNlJiYibW91c2UiIT09dCYmKHRoaXMubW91c2VbMV09bi5pbnZlcnQodGhpcy5tb3VzZVswXSkpLHRoaXMudG91Y2gwJiYidG91Y2giIT09dCYmKHRoaXMudG91Y2gwWzFdPW4uaW52ZXJ0KHRoaXMudG91Y2gwWzBdKSksdGhpcy50b3VjaDEmJiJ0b3VjaCIhPT10JiYodGhpcy50b3VjaDFbMV09bi5pbnZlcnQodGhpcy50b3VjaDFbMF0pKSx0aGlzLnRoYXQuX196b29tPW4sdGhpcy5lbWl0KCJ6b29tIiksdGhpc30sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PS0tdGhpcy5hY3RpdmUmJihFLnNwbGljZSh0aGlzLmluZGV4LDEpLHRoaXMuaW5kZXg9LTEsdGhpcy5lbWl0KCJlbmQiKSksdGhpc30sZW1pdDpmdW5jdGlvbih0KXtBKG5ldyBEcyhuLHQsdGhpcy50aGF0Ll9fem9vbSksQy5hcHBseSxDLFt0LHRoaXMudGhhdCx0aGlzLmFyZ3NdKX19LG4uZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VncoISF0KSxuKTpnfSxuLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlZ3KFtbK3RbMF1bMF0sK3RbMF1bMV1dLFsrdFsxXVswXSwrdFsxXVsxXV1dKSxuKTptfSxuLnNjYWxlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PSt0WzBdLGI9K3RbMV0sbik6W3gsYl19LG4udHJhbnNsYXRlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh3PSt0WzBdWzBdLE09K3RbMV1bMF0sVD0rdFswXVsxXSxrPSt0WzFdWzFdLG4pOltbdyxUXSxbTSxrXV19LG4uZHVyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KE49K3Qsbik6Tn0sbi5pbnRlcnBvbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oUz10LG4pOlN9LG4ub249ZnVuY3Rpb24oKXt2YXIgdD1DLm9uLmFwcGx5KEMsYXJndW1lbnRzKTtyZXR1cm4gdD09PUM/bjp0fSxuLmNsaWNrRGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEw9KHQ9K3QpKnQsbik6TWF0aC5zcXJ0KEwpfSxufTt0LnZlcnNpb249IjQuOS4xIix0LmJpc2VjdD1Wcyx0LmJpc2VjdFJpZ2h0PVZzLHQuYmlzZWN0TGVmdD1Xcyx0LmFzY2VuZGluZz1qcyx0LmJpc2VjdG9yPVhzLHQuY3Jvc3M9R3MsdC5kZXNjZW5kaW5nPUpzLHQuZGV2aWF0aW9uPXRmLHQuZXh0ZW50PW5mLHQuaGlzdG9ncmFtPWRmLHQudGhyZXNob2xkRnJlZWRtYW5EaWFjb25pcz1fZix0LnRocmVzaG9sZFNjb3R0PXlmLHQudGhyZXNob2xkU3R1cmdlcz1wZix0Lm1heD1nZix0Lm1lYW49bWYsdC5tZWRpYW49eGYsdC5tZXJnZT1iZix0Lm1pbj13Zix0LnBhaXJzPVpzLHQucGVybXV0ZT1NZix0LnF1YW50aWxlPXZmLHQucmFuZ2U9Y2YsdC5zY2FuPVRmLHQuc2h1ZmZsZT1rZix0LnN1bT1OZix0LnRpY2tzPWhmLHQudGlja0luY3JlbWVudD1yLHQudGlja1N0ZXA9aSx0LnRyYW5zcG9zZT1TZix0LnZhcmlhbmNlPUtzLHQuemlwPUVmLHQuYXhpc1RvcD1sLHQuYXhpc1JpZ2h0PWgsdC5heGlzQm90dG9tPXAsdC5heGlzTGVmdD1kLHQuYnJ1c2g9RWQsdC5icnVzaFg9emUsdC5icnVzaFk9UGUsdC5icnVzaFNlbGVjdGlvbj1DZSx0LmNob3JkPXFkLHQucmliYm9uPVlkLHQubmVzdD1CZCx0LnNldD1aZSx0Lm1hcD1IZSx0LmtleXM9amQsdC52YWx1ZXM9WGQsdC5lbnRyaWVzPSRkLHQuY29sb3I9TnQsdC5yZ2I9Q3QsdC5oc2w9UnQsdC5sYWI9T3QsdC5oY2w9WHQsdC5jdWJlaGVsaXg9V3QsdC5kaXNwYXRjaD12LHQuZHJhZz1GbCx0LmRyYWdEaXNhYmxlPURsLHQuZHJhZ0VuYWJsZT1tdCx0LmRzdkZvcm1hdD1WZCx0LmNzdlBhcnNlPVpkLHQuY3N2UGFyc2VSb3dzPUdkLHQuY3N2Rm9ybWF0PUpkLHQuY3N2Rm9ybWF0Um93cz1RZCx0LnRzdlBhcnNlPXR2LHQudHN2UGFyc2VSb3dzPW52LHQudHN2Rm9ybWF0PWV2LHQudHN2Rm9ybWF0Um93cz1ydix0LmVhc2VMaW5lYXI9aWUsdC5lYXNlUXVhZD1hZSx0LmVhc2VRdWFkSW49b2UsdC5lYXNlUXVhZE91dD11ZSx0LmVhc2VRdWFkSW5PdXQ9YWUsdC5lYXNlQ3ViaWM9ZmUsdC5lYXNlQ3ViaWNJbj1jZSx0LmVhc2VDdWJpY091dD1zZSx0LmVhc2VDdWJpY0luT3V0PWZlLHQuZWFzZVBvbHk9SHAsdC5lYXNlUG9seUluPVlwLHQuZWFzZVBvbHlPdXQ9QnAsdC5lYXNlUG9seUluT3V0PUhwLHQuZWFzZVNpbj1wZSx0LmVhc2VTaW5Jbj1sZSx0LmVhc2VTaW5PdXQ9aGUsdC5lYXNlU2luSW5PdXQ9cGUsdC5lYXNlRXhwPV9lLHQuZWFzZUV4cEluPWRlLHQuZWFzZUV4cE91dD12ZSx0LmVhc2VFeHBJbk91dD1fZSx0LmVhc2VDaXJjbGU9bWUsdC5lYXNlQ2lyY2xlSW49eWUsdC5lYXNlQ2lyY2xlT3V0PWdlLHQuZWFzZUNpcmNsZUluT3V0PW1lLHQuZWFzZUJvdW5jZT1iZSx0LmVhc2VCb3VuY2VJbj14ZSx0LmVhc2VCb3VuY2VPdXQ9YmUsdC5lYXNlQm91bmNlSW5PdXQ9d2UsdC5lYXNlQmFjaz1pZCx0LmVhc2VCYWNrSW49ZWQsdC5lYXNlQmFja091dD1yZCx0LmVhc2VCYWNrSW5PdXQ9aWQsdC5lYXNlRWxhc3RpYz1hZCx0LmVhc2VFbGFzdGljSW49dWQsdC5lYXNlRWxhc3RpY091dD1hZCx0LmVhc2VFbGFzdGljSW5PdXQ9Y2QsdC5mb3JjZUNlbnRlcj1pdix0LmZvcmNlQ29sbGlkZT13dix0LmZvcmNlTGluaz1Ndix0LmZvcmNlTWFueUJvZHk9U3YsdC5mb3JjZVNpbXVsYXRpb249TnYsdC5mb3JjZVg9RXYsdC5mb3JjZVk9QXYsdC5mb3JtYXREZWZhdWx0TG9jYWxlPXZyLHQuZm9ybWF0TG9jYWxlPUJ2LHQuZm9ybWF0U3BlY2lmaWVyPXByLHQucHJlY2lzaW9uRml4ZWQ9SHYsdC5wcmVjaXNpb25QcmVmaXg9anYsdC5wcmVjaXNpb25Sb3VuZD1Ydix0Lmdlb0FyZWE9R18sdC5nZW9Cb3VuZHM9S18sdC5nZW9DZW50cm9pZD1ueSx0Lmdlb0NpcmNsZT1feSx0Lmdlb0NsaXBFeHRlbnQ9TXksdC5nZW9Db250YWlucz1SeSx0Lmdlb0Rpc3RhbmNlPXp5LHQuZ2VvR3JhdGljdWxlPVRpLHQuZ2VvR3JhdGljdWxlMTA9a2ksdC5nZW9JbnRlcnBvbGF0ZT1xeSx0Lmdlb0xlbmd0aD1FeSx0Lmdlb1BhdGg9Y2csdC5nZW9BbGJlcnM9Z2csdC5nZW9BbGJlcnNVc2E9bWcsdC5nZW9BemltdXRoYWxFcXVhbEFyZWE9YmcsdC5nZW9BemltdXRoYWxFcXVhbEFyZWFSYXc9eGcsdC5nZW9BemltdXRoYWxFcXVpZGlzdGFudD1NZyx0Lmdlb0F6aW11dGhhbEVxdWlkaXN0YW50UmF3PXdnLHQuZ2VvQ29uaWNDb25mb3JtYWw9a2csdC5nZW9Db25pY0NvbmZvcm1hbFJhdz1wbyx0Lmdlb0NvbmljRXF1YWxBcmVhPXlnLHQuZ2VvQ29uaWNFcXVhbEFyZWFSYXc9dW8sdC5nZW9Db25pY0VxdWlkaXN0YW50PVNnLHQuZ2VvQ29uaWNFcXVpZGlzdGFudFJhdz1fbyx0Lmdlb0VxdWlyZWN0YW5ndWxhcj1OZyx0Lmdlb0VxdWlyZWN0YW5ndWxhclJhdz12byx0Lmdlb0dub21vbmljPUVnLHQuZ2VvR25vbW9uaWNSYXc9eW8sdC5nZW9JZGVudGl0eT1BZyx0Lmdlb1Byb2plY3Rpb249ZW8sdC5nZW9Qcm9qZWN0aW9uTXV0YXRvcj1ybyx0Lmdlb01lcmNhdG9yPVRnLHQuZ2VvTWVyY2F0b3JSYXc9Zm8sdC5nZW9PcnRob2dyYXBoaWM9Q2csdC5nZW9PcnRob2dyYXBoaWNSYXc9bW8sdC5nZW9TdGVyZW9ncmFwaGljPXpnLHQuZ2VvU3RlcmVvZ3JhcGhpY1Jhdz14byx0Lmdlb1RyYW5zdmVyc2VNZXJjYXRvcj1QZyx0Lmdlb1RyYW5zdmVyc2VNZXJjYXRvclJhdz1ibyx0Lmdlb1JvdGF0aW9uPXZ5LHQuZ2VvU3RyZWFtPSRfLHQuZ2VvVHJhbnNmb3JtPWhnLHQuY2x1c3Rlcj1MZyx0LmhpZXJhcmNoeT16byx0LnBhY2s9WmcsdC5wYWNrU2libGluZ3M9VmcsdC5wYWNrRW5jbG9zZT0kZyx0LnBhcnRpdGlvbj1RZyx0LnN0cmF0aWZ5PWVtLHQudHJlZT1ybSx0LnRyZWVtYXA9YW0sdC50cmVlbWFwQmluYXJ5PWNtLHQudHJlZW1hcERpY2U9SmcsdC50cmVlbWFwU2xpY2U9aW0sdC50cmVlbWFwU2xpY2VEaWNlPXNtLHQudHJlZW1hcFNxdWFyaWZ5PXVtLHQudHJlZW1hcFJlc3F1YXJpZnk9Zm0sdC5pbnRlcnBvbGF0ZT1xaCx0LmludGVycG9sYXRlQXJyYXk9RWgsdC5pbnRlcnBvbGF0ZUJhc2lzPXdoLHQuaW50ZXJwb2xhdGVCYXNpc0Nsb3NlZD1NaCx0LmludGVycG9sYXRlRGF0ZT1BaCx0LmludGVycG9sYXRlTnVtYmVyPUNoLHQuaW50ZXJwb2xhdGVPYmplY3Q9emgsdC5pbnRlcnBvbGF0ZVJvdW5kPVVoLHQuaW50ZXJwb2xhdGVTdHJpbmc9UmgsdC5pbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcz1JaCx0LmludGVycG9sYXRlVHJhbnNmb3JtU3ZnPVloLHQuaW50ZXJwb2xhdGVab29tPUhoLHQuaW50ZXJwb2xhdGVSZ2I9a2gsdC5pbnRlcnBvbGF0ZVJnYkJhc2lzPU5oLHQuaW50ZXJwb2xhdGVSZ2JCYXNpc0Nsb3NlZD1TaCx0LmludGVycG9sYXRlSHNsPWpoLHQuaW50ZXJwb2xhdGVIc2xMb25nPVhoLHQuaW50ZXJwb2xhdGVMYWI9cG4sdC5pbnRlcnBvbGF0ZUhjbD0kaCx0LmludGVycG9sYXRlSGNsTG9uZz1WaCx0LmludGVycG9sYXRlQ3ViZWhlbGl4PVdoLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXhMb25nPVpoLHQucXVhbnRpemU9R2gsdC5wYXRoPVVlLHQucG9seWdvbkFyZWE9bG0sdC5wb2x5Z29uQ2VudHJvaWQ9aG07dC5wb2x5Z29uSHVsbD1kbSx0LnBvbHlnb25Db250YWlucz12bSx0LnBvbHlnb25MZW5ndGg9X20sdC5xdWFkdHJlZT1pcix0LnF1ZXVlPXh1LHQucmFuZG9tVW5pZm9ybT14bSx0LnJhbmRvbU5vcm1hbD1ibSx0LnJhbmRvbUxvZ05vcm1hbD13bSx0LnJhbmRvbUJhdGVzPVRtLHQucmFuZG9tSXJ3aW5IYWxsPU1tLHQucmFuZG9tRXhwb25lbnRpYWw9a20sdC5yZXF1ZXN0PU5tLHQuaHRtbD1FbSx0Lmpzb249QW0sdC50ZXh0PUNtLHQueG1sPXptLHQuY3N2PUxtLHQudHN2PVJtLHQuc2NhbGVCYW5kPWt1LHQuc2NhbGVQb2ludD1TdSx0LnNjYWxlSWRlbnRpdHk9RHUsdC5zY2FsZUxpbmVhcj1VdSx0LnNjYWxlTG9nPWp1LHQuc2NhbGVPcmRpbmFsPVR1LHQuc2NhbGVJbXBsaWNpdD1PbSx0LnNjYWxlUG93PSR1LHQuc2NhbGVTcXJ0PVZ1LHQuc2NhbGVRdWFudGlsZT1XdSx0LnNjYWxlUXVhbnRpemU9WnUsdC5zY2FsZVRocmVzaG9sZD1HdSx0LnNjYWxlVGltZT11Yix0LnNjYWxlVXRjPWFiLHQuc2NoZW1lQ2F0ZWdvcnkxMD1zYix0LnNjaGVtZUNhdGVnb3J5MjBiPWZiLHQuc2NoZW1lQ2F0ZWdvcnkyMGM9bGIsdC5zY2hlbWVDYXRlZ29yeTIwPWhiLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXhEZWZhdWx0PXBiLHQuaW50ZXJwb2xhdGVSYWluYm93PXliLHQuaW50ZXJwb2xhdGVXYXJtPWRiLHQuaW50ZXJwb2xhdGVDb29sPXZiLHQuaW50ZXJwb2xhdGVWaXJpZGlzPWdiLHQuaW50ZXJwb2xhdGVNYWdtYT1tYix0LmludGVycG9sYXRlSW5mZXJubz14Yix0LmludGVycG9sYXRlUGxhc21hPWJiLHQuc2NhbGVTZXF1ZW50aWFsPWljLHQuY3JlYXRvcj1JZix0LmxvY2FsPXcsdC5tYXRjaGVyPVhmLHQubW91c2U9R2YsdC5uYW1lc3BhY2U9RmYsdC5uYW1lc3BhY2VzPU9mLHQuc2VsZWN0PVBsLHQuc2VsZWN0QWxsPUxsLHQuc2VsZWN0aW9uPXl0LHQuc2VsZWN0b3I9SmYsdC5zZWxlY3RvckFsbD1LZix0LnN0eWxlPVgsdC50b3VjaD1SbCx0LnRvdWNoZXM9cWwsdC53aW5kb3c9Z2wsdC5jdXN0b21FdmVudD1BLHQuYXJjPVJiLHQuYXJlYT1EYix0LmxpbmU9VWIsdC5waWU9SWIsdC5yYWRpYWxBcmVhPUhiLHQucmFkaWFsTGluZT1CYix0LmxpbmtIb3Jpem9udGFsPU5jLHQubGlua1ZlcnRpY2FsPVNjLHQubGlua1JhZGlhbD1FYyx0LnN5bWJvbD1mdyx0LnN5bWJvbHM9c3csdC5zeW1ib2xDaXJjbGU9JGIsdC5zeW1ib2xDcm9zcz1WYix0LnN5bWJvbERpYW1vbmQ9R2IsdC5zeW1ib2xTcXVhcmU9bncsdC5zeW1ib2xTdGFyPXR3LHQuc3ltYm9sVHJpYW5nbGU9cncsdC5zeW1ib2xXeWU9Y3csdC5jdXJ2ZUJhc2lzQ2xvc2VkPXB3LHQuY3VydmVCYXNpc09wZW49ZHcsdC5jdXJ2ZUJhc2lzPWh3LHQuY3VydmVCdW5kbGU9dncsdC5jdXJ2ZUNhcmRpbmFsQ2xvc2VkPXl3LHQuY3VydmVDYXJkaW5hbE9wZW49Z3csdC5jdXJ2ZUNhcmRpbmFsPV93LHQuY3VydmVDYXRtdWxsUm9tQ2xvc2VkPXh3LHQuY3VydmVDYXRtdWxsUm9tT3Blbj1idyx0LmN1cnZlQ2F0bXVsbFJvbT1tdyx0LmN1cnZlTGluZWFyQ2xvc2VkPXd3LHQuY3VydmVMaW5lYXI9cWIsdC5jdXJ2ZU1vbm90b25lWD1HYyx0LmN1cnZlTW9ub3RvbmVZPUpjLHQuY3VydmVOYXR1cmFsPU13LHQuY3VydmVTdGVwPVR3LHQuY3VydmVTdGVwQWZ0ZXI9ZXMsdC5jdXJ2ZVN0ZXBCZWZvcmU9bnMsdC5zdGFjaz1Tdyx0LnN0YWNrT2Zmc2V0RXhwYW5kPUV3LHQuc3RhY2tPZmZzZXREaXZlcmdpbmc9QXcsdC5zdGFja09mZnNldE5vbmU9a3csdC5zdGFja09mZnNldFNpbGhvdWV0dGU9Q3csdC5zdGFja09mZnNldFdpZ2dsZT16dyx0LnN0YWNrT3JkZXJBc2NlbmRpbmc9UHcsdC5zdGFja09yZGVyRGVzY2VuZGluZz1Mdyx0LnN0YWNrT3JkZXJJbnNpZGVPdXQ9UncsdC5zdGFja09yZGVyTm9uZT1Odyx0LnN0YWNrT3JkZXJSZXZlcnNlPXF3LHQudGltZUludGVydmFsPUp1LHQudGltZU1pbGxpc2Vjb25kPSRtLHQudGltZU1pbGxpc2Vjb25kcz1WbSx0LnV0Y01pbGxpc2Vjb25kPSRtLHQudXRjTWlsbGlzZWNvbmRzPVZtLHQudGltZVNlY29uZD1HbSx0LnRpbWVTZWNvbmRzPUptLHQudXRjU2Vjb25kPUdtLHQudXRjU2Vjb25kcz1KbSx0LnRpbWVNaW51dGU9UW0sdC50aW1lTWludXRlcz1LbSx0LnRpbWVIb3VyPXR4LHQudGltZUhvdXJzPW54LHQudGltZURheT1leCx0LnRpbWVEYXlzPXJ4LHQudGltZVdlZWs9aXgsdC50aW1lV2Vla3M9bHgsdC50aW1lU3VuZGF5PWl4LHQudGltZVN1bmRheXM9bHgsdC50aW1lTW9uZGF5PW94LHQudGltZU1vbmRheXM9aHgsdC50aW1lVHVlc2RheT11eCx0LnRpbWVUdWVzZGF5cz1weCx0LnRpbWVXZWRuZXNkYXk9YXgsdC50aW1lV2VkbmVzZGF5cz1keCx0LnRpbWVUaHVyc2RheT1jeCx0LnRpbWVUaHVyc2RheXM9dngsdC50aW1lRnJpZGF5PXN4LHQudGltZUZyaWRheXM9X3gsdC50aW1lU2F0dXJkYXk9ZngsdC50aW1lU2F0dXJkYXlzPXl4LHQudGltZU1vbnRoPWd4LHQudGltZU1vbnRocz1teCx0LnRpbWVZZWFyPXh4LHQudGltZVllYXJzPWJ4LHQudXRjTWludXRlPXd4LHQudXRjTWludXRlcz1NeCx0LnV0Y0hvdXI9VHgsdC51dGNIb3Vycz1reCx0LnV0Y0RheT1OeCx0LnV0Y0RheXM9U3gsdC51dGNXZWVrPUV4LHQudXRjV2Vla3M9cXgsdC51dGNTdW5kYXk9RXgsdC51dGNTdW5kYXlzPXF4LHQudXRjTW9uZGF5PUF4LHQudXRjTW9uZGF5cz1VeCx0LnV0Y1R1ZXNkYXk9Q3gsdC51dGNUdWVzZGF5cz1EeCx0LnV0Y1dlZG5lc2RheT16eCx0LnV0Y1dlZG5lc2RheXM9T3gsdC51dGNUaHVyc2RheT1QeCx0LnV0Y1RodXJzZGF5cz1GeCx0LnV0Y0ZyaWRheT1MeCx0LnV0Y0ZyaWRheXM9SXgsdC51dGNTYXR1cmRheT1SeCx0LnV0Y1NhdHVyZGF5cz1ZeCx0LnV0Y01vbnRoPUJ4LHQudXRjTW9udGhzPUh4LHQudXRjWWVhcj1qeCx0LnV0Y1llYXJzPSR4LHQudGltZUZvcm1hdERlZmF1bHRMb2NhbGU9SmEsdC50aW1lRm9ybWF0TG9jYWxlPXJhLHQuaXNvRm9ybWF0PUp4LHQuaXNvUGFyc2U9UXgsdC5ub3c9X24sdC50aW1lcj1tbix0LnRpbWVyRmx1c2g9eG4sdC50aW1lb3V0PXVwLHQuaW50ZXJ2YWw9YXAsdC50cmFuc2l0aW9uPWVlLHQuYWN0aXZlPWhkLHQuaW50ZXJydXB0PWdwLHQudm9yb25vaT0kdyx0Lnpvb209R3csdC56b29tVHJhbnNmb3JtPUZzLHQuem9vbUlkZW50aXR5PVd3LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0pOw=="></script>
<script src="data:application/javascript;base64,IWZ1bmN0aW9uKHQsbil7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9uKGV4cG9ydHMpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsiZXhwb3J0cyJdLG4pOm4odC5mbHViYmVyPXQuZmx1YmJlcnx8e30pfSh0aGlzLGZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3JldHVybiAxMD09PXR8fDEzPT09dHx8ODIzMj09PXR8fDgyMzM9PT10fHwzMj09PXR8fDk9PT10fHwxMT09PXR8fDEyPT09dHx8MTYwPT09dHx8dD49NTc2MCYmS3QuaW5kZXhPZih0KT49MH1mdW5jdGlvbiBlKHQpe3N3aXRjaCgzMnx0KXtjYXNlIDEwOTpjYXNlIDEyMjpjYXNlIDEwODpjYXNlIDEwNDpjYXNlIDExODpjYXNlIDk5OmNhc2UgMTE1OmNhc2UgMTEzOmNhc2UgMTE2OmNhc2UgOTc6Y2FzZSAxMTQ6cmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gcih0KXtyZXR1cm4gdD49NDgmJnQ8PTU3fWZ1bmN0aW9uIGkodCl7cmV0dXJuIHQ+PTQ4JiZ0PD01N3x8NDM9PT10fHw0NT09PXR8fDQ2PT09dH1mdW5jdGlvbiBhKHQpe3RoaXMuaW5kZXg9MCx0aGlzLnBhdGg9dCx0aGlzLm1heD10Lmxlbmd0aCx0aGlzLnJlc3VsdD1bXSx0aGlzLnBhcmFtPTAsdGhpcy5lcnI9IiIsdGhpcy5zZWdtZW50U3RhcnQ9MCx0aGlzLmRhdGE9W119ZnVuY3Rpb24gbyh0KXtmb3IoO3QuaW5kZXg8dC5tYXgmJm4odC5wYXRoLmNoYXJDb2RlQXQodC5pbmRleCkpOyl0LmluZGV4Kyt9ZnVuY3Rpb24gcyh0KXt2YXIgbixlPXQuaW5kZXgsaT1lLGE9dC5tYXgsbz0hMSxzPSExLGg9ITEsdT0hMTtpZihpPj1hKXJldHVybiB2b2lkKHQuZXJyPSJTdmdQYXRoOiBtaXNzZWQgcGFyYW0gKGF0IHBvcyAiK2krIikiKTtpZihuPXQucGF0aC5jaGFyQ29kZUF0KGkpLDQzIT09biYmNDUhPT1ufHwoaSsrLG49aTxhP3QucGF0aC5jaGFyQ29kZUF0KGkpOjApLCFyKG4pJiY0NiE9PW4pcmV0dXJuIHZvaWQodC5lcnI9IlN2Z1BhdGg6IHBhcmFtIHNob3VsZCBzdGFydCB3aXRoIDAuLjkgb3IgYC5gIChhdCBwb3MgIitpKyIpIik7aWYoNDYhPT1uKXtpZihvPTQ4PT09bixpKyssbj1pPGE/dC5wYXRoLmNoYXJDb2RlQXQoaSk6MCxvJiZpPGEmJm4mJnIobikpcmV0dXJuIHZvaWQodC5lcnI9IlN2Z1BhdGg6IG51bWJlcnMgc3RhcnRlZCB3aXRoIGAwYCBzdWNoIGFzIGAwOWAgYXJlIGlsZWdhbCAoYXQgcG9zICIrZSsiKSIpO2Zvcig7aTxhJiZyKHQucGF0aC5jaGFyQ29kZUF0KGkpKTspaSsrLHM9ITA7bj1pPGE/dC5wYXRoLmNoYXJDb2RlQXQoaSk6MH1pZig0Nj09PW4pe2Zvcih1PSEwLGkrKztyKHQucGF0aC5jaGFyQ29kZUF0KGkpKTspaSsrLGg9ITA7bj1pPGE/dC5wYXRoLmNoYXJDb2RlQXQoaSk6MH1pZigxMDE9PT1ufHw2OT09PW4pe2lmKHUmJiFzJiYhaClyZXR1cm4gdm9pZCh0LmVycj0iU3ZnUGF0aDogaW52YWxpZCBmbG9hdCBleHBvbmVudCAoYXQgcG9zICIraSsiKSIpO2lmKGkrKyxuPWk8YT90LnBhdGguY2hhckNvZGVBdChpKTowLDQzIT09biYmNDUhPT1ufHxpKyssIShpPGEmJnIodC5wYXRoLmNoYXJDb2RlQXQoaSkpKSlyZXR1cm4gdm9pZCh0LmVycj0iU3ZnUGF0aDogaW52YWxpZCBmbG9hdCBleHBvbmVudCAoYXQgcG9zICIraSsiKSIpO2Zvcig7aTxhJiZyKHQucGF0aC5jaGFyQ29kZUF0KGkpKTspaSsrfXQuaW5kZXg9aSx0LnBhcmFtPXBhcnNlRmxvYXQodC5wYXRoLnNsaWNlKGUsaSkpKzB9ZnVuY3Rpb24gaCh0KXt2YXIgbixlO249dC5wYXRoW3Quc2VnbWVudFN0YXJ0XSxlPW4udG9Mb3dlckNhc2UoKTt2YXIgcj10LmRhdGE7aWYoIm0iPT09ZSYmci5sZW5ndGg+MiYmKHQucmVzdWx0LnB1c2goW24sclswXSxyWzFdXSkscj1yLnNsaWNlKDIpLGU9ImwiLG49Im0iPT09bj8ibCI6IkwiKSwiciI9PT1lKXQucmVzdWx0LnB1c2goW25dLmNvbmNhdChyKSk7ZWxzZSBmb3IoO3IubGVuZ3RoPj1KdFtlXSYmKHQucmVzdWx0LnB1c2goW25dLmNvbmNhdChyLnNwbGljZSgwLEp0W2VdKSkpLEp0W2VdKTspO31mdW5jdGlvbiB1KHQpe3ZhciBuLHIsYSx1LGM9dC5tYXg7aWYodC5zZWdtZW50U3RhcnQ9dC5pbmRleCxuPXQucGF0aC5jaGFyQ29kZUF0KHQuaW5kZXgpLCFlKG4pKXJldHVybiB2b2lkKHQuZXJyPSJTdmdQYXRoOiBiYWQgY29tbWFuZCAiK3QucGF0aFt0LmluZGV4XSsiIChhdCBwb3MgIit0LmluZGV4KyIpIik7aWYoYT1KdFt0LnBhdGhbdC5pbmRleF0udG9Mb3dlckNhc2UoKV0sdC5pbmRleCsrLG8odCksdC5kYXRhPVtdLCFhKXJldHVybiB2b2lkIGgodCk7Zm9yKHI9ITE7Oyl7Zm9yKHU9YTt1PjA7dS0tKXtpZihzKHQpLHQuZXJyLmxlbmd0aClyZXR1cm47dC5kYXRhLnB1c2godC5wYXJhbSksbyh0KSxyPSExLHQuaW5kZXg8YyYmNDQ9PT10LnBhdGguY2hhckNvZGVBdCh0LmluZGV4KSYmKHQuaW5kZXgrKyxvKHQpLHI9ITApfWlmKCFyKXtpZih0LmluZGV4Pj10Lm1heClicmVhaztpZighaSh0LnBhdGguY2hhckNvZGVBdCh0LmluZGV4KSkpYnJlYWt9fWgodCl9ZnVuY3Rpb24gYyh0LG4pe3JldHVyblt0WzBdKm5bMF0rdFsyXSpuWzFdLHRbMV0qblswXSt0WzNdKm5bMV0sdFswXSpuWzJdK3RbMl0qblszXSx0WzFdKm5bMl0rdFszXSpuWzNdLHRbMF0qbls0XSt0WzJdKm5bNV0rdFs0XSx0WzFdKm5bNF0rdFszXSpuWzVdK3RbNV1dfWZ1bmN0aW9uIGYoKXtpZighKHRoaXMgaW5zdGFuY2VvZiBmKSlyZXR1cm4gbmV3IGY7dGhpcy5xdWV1ZT1bXSx0aGlzLmNhY2hlPW51bGx9ZnVuY3Rpb24gbCh0LG4sZSxyKXt2YXIgaT10KnItbiplPDA/LTE6MSxhPU1hdGguc3FydCh0KnQrbipuKSxvPU1hdGguc3FydCh0KnQrbipuKSxzPXQqZStuKnIsaD1zLyhhKm8pO3JldHVybiBoPjEmJihoPTEpLGg8LTEmJihoPS0xKSxpKk1hdGguYWNvcyhoKX1mdW5jdGlvbiBwKHQsbixlLHIsaSxhLG8scyxoLHUpe3ZhciBjPXUqKHQtZSkvMitoKihuLXIpLzIsZj0taCoodC1lKS8yK3UqKG4tcikvMixwPW8qbyx2PXMqcyxnPWMqYyx4PWYqZix5PXAqdi1wKngtdipnO3k8MCYmKHk9MCkseS89cCp4K3YqZyx5PU1hdGguc3FydCh5KSooaT09PWE/LTE6MSk7dmFyIGQ9eSpvL3MqZixtPXkqLXMvbypjLE09dSpkLWgqbSsodCtlKS8yLHc9aCpkK3UqbSsobityKS8yLGI9KGMtZCkvbyxMPShmLW0pL3MsQT0oLWMtZCkvbyxxPSgtZi1tKS9zLGs9bCgxLDAsYixMKSxQPWwoYixMLEEscSk7cmV0dXJuIDA9PT1hJiZQPjAmJihQLT1zbiksMT09PWEmJlA8MCYmKFArPXNuKSxbTSx3LGssUF19ZnVuY3Rpb24gdih0LG4pe3ZhciBlPTQvMypNYXRoLnRhbihuLzQpLHI9TWF0aC5jb3ModCksaT1NYXRoLnNpbih0KSxhPU1hdGguY29zKHQrbiksbz1NYXRoLnNpbih0K24pO3JldHVybltyLGksci1pKmUsaStyKmUsYStvKmUsby1hKmUsYSxvXX1mdW5jdGlvbiBnKHQsbixlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBnKSlyZXR1cm4gbmV3IGcodCxuLGUpO3RoaXMucng9dCx0aGlzLnJ5PW4sdGhpcy5heD1lfWZ1bmN0aW9uIHgodCl7aWYoISh0aGlzIGluc3RhbmNlb2YgeCkpcmV0dXJuIG5ldyB4KHQpO3ZhciBuPXRuKHQpO3RoaXMuc2VnbWVudHM9bi5zZWdtZW50cyx0aGlzLmVycj1uLmVycix0aGlzLl9fc3RhY2s9W119ZnVuY3Rpb24geSh0KXt2YXIgbj10Lm1hdGNoKHhuKTtyZXR1cm4gbj9uLm1hcChOdW1iZXIpOltdfWZ1bmN0aW9uIGQodCxuLGUscixpLGEsbyxzKXt0aGlzLmE9e3g6dCx5Om59LHRoaXMuYj17eDplLHk6cn0sdGhpcy5jPXt4OmkseTphfSx0aGlzLmQ9e3g6byx5OnN9LG51bGwhPT1vJiZ2b2lkIDAhPT1vJiZudWxsIT09cyYmdm9pZCAwIT09cz8odGhpcy5nZXRBcmNMZW5ndGg9Xyx0aGlzLmdldFBvaW50PUwsdGhpcy5nZXREZXJpdmF0aXZlPU0pOih0aGlzLmdldEFyY0xlbmd0aD1BLHRoaXMuZ2V0UG9pbnQ9Yix0aGlzLmdldERlcml2YXRpdmU9bSksdGhpcy5pbml0KCl9ZnVuY3Rpb24gbSh0LG4sZSl7cmV0dXJue3g6MiooMS1lKSoodFsxXS10WzBdKSsyKmUqKHRbMl0tdFsxXSkseToyKigxLWUpKihuWzFdLW5bMF0pKzIqZSooblsyXS1uWzFdKX19ZnVuY3Rpb24gTSh0LG4sZSl7cmV0dXJuIGIoWzMqKHRbMV0tdFswXSksMyoodFsyXS10WzFdKSwzKih0WzNdLXRbMl0pXSxbMyooblsxXS1uWzBdKSwzKihuWzJdLW5bMV0pLDMqKG5bM10tblsyXSldLGUpfWZ1bmN0aW9uIHcodCxuLGUscixpKXtmb3IodmFyIGE9MSxvPXQvbixzPSh0LWUocixpLG8pKS9uO2E+LjAwMTspe3ZhciBoPWUocixpLG8rcyksdT1lKHIsaSxvLXMpLGM9TWF0aC5hYnModC1oKS9uLGY9TWF0aC5hYnModC11KS9uO2M8YT8oYT1jLG8rPXMpOmY8YT8oYT1mLG8tPXMpOnMvPTJ9cmV0dXJuIG99ZnVuY3Rpb24gYih0LG4sZSl7cmV0dXJue3g6KDEtZSkqKDEtZSkqdFswXSsyKigxLWUpKmUqdFsxXStlKmUqdFsyXSx5OigxLWUpKigxLWUpKm5bMF0rMiooMS1lKSplKm5bMV0rZSplKm5bMl19fWZ1bmN0aW9uIEwodCxuLGUpe3JldHVybnt4OigxLWUpKigxLWUpKigxLWUpKnRbMF0rMyooMS1lKSooMS1lKSplKnRbMV0rMyooMS1lKSplKmUqdFsyXStlKmUqZSp0WzNdLHk6KDEtZSkqKDEtZSkqKDEtZSkqblswXSszKigxLWUpKigxLWUpKmUqblsxXSszKigxLWUpKmUqZSpuWzJdK2UqZSplKm5bM119fWZ1bmN0aW9uIEEodCxuLGUpe3ZvaWQgMD09PWUmJihlPTEpO3ZhciByPXRbMF0tMip0WzFdK3RbMl0saT1uWzBdLTIqblsxXStuWzJdLGE9Mip0WzFdLTIqdFswXSxvPTIqblsxXS0yKm5bMF0scz00KihyKnIraSppKSxoPTQqKHIqYStpKm8pLHU9YSphK28qbztpZigwPT09cylyZXR1cm4gZSpNYXRoLnNxcnQoTWF0aC5wb3codFsyXS10WzBdLDIpK01hdGgucG93KG5bMl0tblswXSwyKSk7dmFyIGM9aC8oMipzKSxmPXUvcyxsPWUrYyxwPWYtYypjO3JldHVybiBNYXRoLnNxcnQocykvMioobCpNYXRoLnNxcnQobCpsK3ApLWMqTWF0aC5zcXJ0KGMqYytwKStwKk1hdGgubG9nKE1hdGguYWJzKChsK01hdGguc3FydChsKmwrcCkpLyhjK01hdGguc3FydChjKmMrcCkpKSkpfWZ1bmN0aW9uIHEodCxuKXtyZXR1cm4gTW5bdF1bbl19ZnVuY3Rpb24gayh0LG4sZSl7dmFyIHIsaSxhLG89ZS5sZW5ndGgtMTtpZigwPT09bylyZXR1cm4gMDtpZigwPT09dCl7Zm9yKGk9MCxhPTA7YTw9bzthKyspaSs9cShvLGEpKk1hdGgucG93KDEtbixvLWEpKk1hdGgucG93KG4sYSkqZVthXTtyZXR1cm4gaX1mb3Iocj1uZXcgQXJyYXkobyksYT0wO2E8bzthKyspclthXT1vKihlW2ErMV0tZVthXSk7cmV0dXJuIGsodC0xLG4scil9ZnVuY3Rpb24gUCh0LG4sZSl7dmFyIHI9aygxLGUsdCksaT1rKDEsZSxuKSxhPXIqcitpKmk7cmV0dXJuIE1hdGguc3FydChhKX1mdW5jdGlvbiBfKHQsbixlKXt2YXIgcixpLGEsbzt2b2lkIDA9PT1lJiYoZT0xKTtmb3Iocj1lLzIsaT0wLGE9MDthPDIwO2ErKylvPXIqZG5bMjBdW2FdK3IsaSs9bW5bMjBdW2FdKlAodCxuLG8pO3JldHVybiByKml9ZnVuY3Rpb24gRSh0LG4sZSxyKXt2YXIgaT10KnItbiplPDA/LTE6MSxhPXQqZStuKnI7cmV0dXJuIGE+MSYmKGE9MSksYTwtMSYmKGE9LTEpLGkqTWF0aC5hY29zKGEpfWZ1bmN0aW9uIEModCxuLGUscixpLGEsbyxzLGgsdSl7dmFyIGM9dSoodC1lKS8yK2gqKG4tcikvMixmPS1oKih0LWUpLzIrdSoobi1yKS8yLGw9bypvLHA9cypzLHY9YypjLGc9ZipmLHg9bCpwLWwqZy1wKnY7eDwwJiYoeD0wKSx4Lz1sKmcrcCp2LHg9TWF0aC5zcXJ0KHgpKihpPT09YT8tMToxKTt2YXIgeT14Km8vcypmLGQ9eCotcy9vKmMsbT11KnktaCpkKyh0K2UpLzIsTT1oKnkrdSpkKyhuK3IpLzIsdz0oYy15KS9vLGI9KGYtZCkvcyxMPSgtYy15KS9vLEE9KC1mLWQpL3MscT1FKDEsMCx3LGIpLGs9RSh3LGIsTCxBKTtyZXR1cm4gMD09PWEmJms+MCYmKGstPXduKSwxPT09YSYmazwwJiYoays9d24pLFttLE0scSxrXX1mdW5jdGlvbiBTKHQsbil7dmFyIGU9NC8zKk1hdGgudGFuKG4vNCkscj1NYXRoLmNvcyh0KSxpPU1hdGguc2luKHQpLGE9TWF0aC5jb3ModCtuKSxvPU1hdGguc2luKHQrbik7cmV0dXJuW3IsaSxyLWkqZSxpK3IqZSxhK28qZSxvLWEqZSxhLG9dfWZ1bmN0aW9uIFoodCxuLGUscixpLGEsbyxzLGgpe3ZhciB1PTAsYz1bXSxmPVtdO2JuKHQsbixlLHIsaSxhLG8scyxoKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBuPW5ldyB5bih0WzBdLHRbMV0sdFsyXSx0WzNdLHRbNF0sdFs1XSx0WzZdLHRbN10pLGU9bi5nZXRUb3RhbExlbmd0aCgpO3UrPWUsYy5wdXNoKGUpLGYucHVzaChuKX0pLHRoaXMubGVuZ3RoPXUsdGhpcy5wYXJ0aWFsTGVuZ3Rocz1jLHRoaXMuY3VydmVzPWZ9ZnVuY3Rpb24gVCh0LG4sZSxyKXt0aGlzLngwPXQsdGhpcy54MT1uLHRoaXMueTA9ZSx0aGlzLnkxPXJ9ZnVuY3Rpb24gRih0KXtyZXR1cm4gbmV3IGxuKHQpLmFicygpfWZ1bmN0aW9uIHoodCl7cmV0dXJuIHQudG9TdHJpbmcoKS5zcGxpdCgiTSIpLm1hcChmdW5jdGlvbih0LG4pe3JldHVybiB0PXQudHJpbSgpLG4mJnQ/Ik0iK3Q6dH0pLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdH0pfWZ1bmN0aW9uIGoodCl7cmV0dXJuIk0iK3Quam9pbigiTCIpKyJaIn1mdW5jdGlvbiBJKHQpe3JldHVybiB6KEYodCkpfWZ1bmN0aW9uIE4odCxuKXt2YXIgZT1GKHQpO3JldHVybiBYKGUpfHxZKGUsbil9ZnVuY3Rpb24gWCh0KXt2YXIgbj10LnNlZ21lbnRzfHxbXSxlPVtdO2lmKCFuLmxlbmd0aHx8Ik0iIT09blswXVswXSlyZXR1cm4hMTtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGk9bltyXSxhPWlbMF0sbz1pWzFdLHM9aVsyXTtpZigiTSI9PT1hJiZyfHwiWiI9PT1hKWJyZWFrO2lmKCJNIj09PWF8fCJMIj09PWEpZS5wdXNoKFtvLHNdKTtlbHNlIGlmKCJIIj09PWEpZS5wdXNoKFtvLGVbZS5sZW5ndGgtMV1bMV1dKTtlbHNle2lmKCJWIiE9PWEpcmV0dXJuITE7ZS5wdXNoKFtlW2UubGVuZ3RoLTFdWzBdLG9dKX19cmV0dXJuISFlLmxlbmd0aCYme3Jpbmc6ZX19ZnVuY3Rpb24gWSh0LG4pe3ZhciBlLHIsaT16KHQpWzBdLGE9W10sbz0zO2lmKCFpKXRocm93IG5ldyBUeXBlRXJyb3Ioa24pO3I9VihpKSxlPXIuZ2V0VG90YWxMZW5ndGgoKSxuJiZOdW1iZXIuaXNGaW5pdGUobikmJm4+MCYmKG89TWF0aC5tYXgobyxNYXRoLmNlaWwoZS9uKSkpO2Zvcih2YXIgcz0wO3M8bztzKyspe3ZhciBoPXIuZ2V0UG9pbnRBdExlbmd0aChlKnMvbyk7YS5wdXNoKFtoLngsaC55XSl9cmV0dXJue3Jpbmc6YSxza2lwQmlzZWN0OiEwfX1mdW5jdGlvbiBWKHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cylyZXR1cm4gcW4odCk7dmFyIG49KHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwic3ZnIiksd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJwYXRoIikpO3JldHVybiBuLnNldEF0dHJpYnV0ZU5TKG51bGwsImQiLHQpLG59ZnVuY3Rpb24gRyh0LG4pe3JldHVybiBNYXRoLnNxcnQoKHRbMF0tblswXSkqKHRbMF0tblswXSkrKHRbMV0tblsxXSkqKHRbMV0tblsxXSkpfWZ1bmN0aW9uIE8odCxuLGUpe3JldHVyblt0WzBdKyhuWzBdLXRbMF0pKmUsdFsxXSsoblsxXS10WzFdKSplXX1mdW5jdGlvbiBEKHQsbil7cmV0dXJuIEcodCxuKTwxZS05fWZ1bmN0aW9uIEgodCxuLGUpe3ZhciByPXQubWFwKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIFEodCxuW2VdKX0pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj1yLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gbih0KX0pO3JldHVybiBlP2oobik6bn19ZnVuY3Rpb24gUSh0LG4pe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC5tYXAoZnVuY3Rpb24odCxyKXtyZXR1cm4gdCtlKihuW3JdLXQpfSl9fWZ1bmN0aW9uIFIodCxuLGUpe3ZvaWQgMD09PWUmJihlPTEvMCk7Zm9yKHZhciByPXQubGVuZ3RoK24saT0kdCh0KS9uLGE9MCxvPTAscz1pLzI7dC5sZW5ndGg8cjspe3ZhciBoPXRbYV0sdT10WyhhKzEpJXQubGVuZ3RoXSxjPUcoaCx1KTtzPD1vK2M/KHQuc3BsaWNlKGErMSwwLGM/TyhoLHUsKHMtbykvYyk6aC5zbGljZSgwKSkscys9aSk6KG8rPWMsYSsrKX19ZnVuY3Rpb24gVSh0LG4pe3ZvaWQgMD09PW4mJihuPTEvMCk7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspZm9yKHZhciByPXRbZV0saT1lPT09dC5sZW5ndGgtMT90WzBdOnRbZSsxXTtHKHIsaSk+bjspaT1PKHIsaSwuNSksdC5zcGxpY2UoZSsxLDAsaSl9ZnVuY3Rpb24gQih0LG4pe3ZhciBlLHIsaTtpZigic3RyaW5nIj09dHlwZW9mIHQpe3ZhciBhPU4odCxuKTt0PWEucmluZyxpPWEuc2tpcEJpc2VjdH1lbHNlIGlmKCFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBUeXBlRXJyb3Ioa24pO2lmKGU9dC5zbGljZSgwKSwhVyhlKSl0aHJvdyBuZXcgVHlwZUVycm9yKGtuKTtpZihlLmxlbmd0aD4xJiZEKGVbMF0sZVtlLmxlbmd0aC0xXSkmJmUucG9wKCksZS5sZW5ndGg8Myl0aHJvdyBuZXcgVHlwZUVycm9yKFBuKTtyZXR1cm4gcj1CdChlKSxyPjAmJmUucmV2ZXJzZSgpLCFpJiZuJiZOdW1iZXIuaXNGaW5pdGUobikmJm4+MCYmVShlLG4pLGV9ZnVuY3Rpb24gVyh0KXtyZXR1cm4gdC5ldmVyeShmdW5jdGlvbih0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KSYmdC5sZW5ndGg+PTImJk51bWJlci5pc0Zpbml0ZSh0WzBdKSYmTnVtYmVyLmlzRmluaXRlKHRbMV0pfSl9ZnVuY3Rpb24gJCh0LG4sZSl7dmFyIHI7cmV0dXJuIHI9dC5sZW5ndGgtbi5sZW5ndGgsUih0LHI8MD8tMSpyOjApLFIobixyPjA/cjowKSxfbih0LG4pLEgodCxuLGUpfWZ1bmN0aW9uIEoodCxuLGUpe2U9ZXx8Mjt2YXIgcj1uJiZuLmxlbmd0aCxpPXI/blswXSplOnQubGVuZ3RoLGE9Syh0LDAsaSxlLCEwKSxvPVtdO2lmKCFhKXJldHVybiBvO3ZhciBzLGgsdSxjLGYsbCxwO2lmKHImJihhPW90KHQsbixhLGUpKSx0Lmxlbmd0aD44MCplKXtzPXU9dFswXSxoPWM9dFsxXTtmb3IodmFyIHY9ZTt2PGk7dis9ZSlmPXRbdl0sbD10W3YrMV0sZjxzJiYocz1mKSxsPGgmJihoPWwpLGY+dSYmKHU9ZiksbD5jJiYoYz1sKTtwPU1hdGgubWF4KHUtcyxjLWgpfXJldHVybiBudChhLG8sZSxzLGgscCksb31mdW5jdGlvbiBLKHQsbixlLHIsaSl7dmFyIGEsbztpZihpPT09a3QodCxuLGUscik+MClmb3IoYT1uO2E8ZTthKz1yKW89THQoYSx0W2FdLHRbYSsxXSxvKTtlbHNlIGZvcihhPWUtcjthPj1uO2EtPXIpbz1MdChhLHRbYV0sdFthKzFdLG8pO3JldHVybiBvJiZ5dChvLG8ubmV4dCkmJihBdChvKSxvPW8ubmV4dCksb31mdW5jdGlvbiB0dCh0LG4pe2lmKCF0KXJldHVybiB0O258fChuPXQpO3ZhciBlLHI9dDtkb3tpZihlPSExLHIuc3RlaW5lcnx8IXl0KHIsci5uZXh0KSYmMCE9PXh0KHIucHJldixyLHIubmV4dCkpcj1yLm5leHQ7ZWxzZXtpZihBdChyKSwocj1uPXIucHJldik9PT1yLm5leHQpcmV0dXJuIG51bGw7ZT0hMH19d2hpbGUoZXx8ciE9PW4pO3JldHVybiBufWZ1bmN0aW9uIG50KHQsbixlLHIsaSxhLG8pe2lmKHQpeyFvJiZhJiZjdCh0LHIsaSxhKTtmb3IodmFyIHMsaCx1PXQ7dC5wcmV2IT09dC5uZXh0OylpZihzPXQucHJldixoPXQubmV4dCxhP3J0KHQscixpLGEpOmV0KHQpKW4ucHVzaChzLmkvZSksbi5wdXNoKHQuaS9lKSxuLnB1c2goaC5pL2UpLEF0KHQpLHQ9aC5uZXh0LHU9aC5uZXh0O2Vsc2UgaWYoKHQ9aCk9PT11KXtvPzE9PT1vPyh0PWl0KHQsbixlKSxudCh0LG4sZSxyLGksYSwyKSk6Mj09PW8mJmF0KHQsbixlLHIsaSxhKTpudCh0dCh0KSxuLGUscixpLGEsMSk7YnJlYWt9fX1mdW5jdGlvbiBldCh0KXt2YXIgbj10LnByZXYsZT10LHI9dC5uZXh0O2lmKHh0KG4sZSxyKT49MClyZXR1cm4hMTtmb3IodmFyIGk9dC5uZXh0Lm5leHQ7aSE9PXQucHJldjspe2lmKHZ0KG4ueCxuLnksZS54LGUueSxyLngsci55LGkueCxpLnkpJiZ4dChpLnByZXYsaSxpLm5leHQpPj0wKXJldHVybiExO2k9aS5uZXh0fXJldHVybiEwfWZ1bmN0aW9uIHJ0KHQsbixlLHIpe3ZhciBpPXQucHJldixhPXQsbz10Lm5leHQ7aWYoeHQoaSxhLG8pPj0wKXJldHVybiExO2Zvcih2YXIgcz1pLng8YS54P2kueDxvLng/aS54Om8ueDphLng8by54P2EueDpvLngsaD1pLnk8YS55P2kueTxvLnk/aS55Om8ueTphLnk8by55P2EueTpvLnksdT1pLng+YS54P2kueD5vLng/aS54Om8ueDphLng+by54P2EueDpvLngsYz1pLnk+YS55P2kueT5vLnk/aS55Om8ueTphLnk+by55P2EueTpvLnksZj1sdChzLGgsbixlLHIpLGw9bHQodSxjLG4sZSxyKSxwPXQubmV4dFo7cCYmcC56PD1sOyl7aWYocCE9PXQucHJldiYmcCE9PXQubmV4dCYmdnQoaS54LGkueSxhLngsYS55LG8ueCxvLnkscC54LHAueSkmJnh0KHAucHJldixwLHAubmV4dCk+PTApcmV0dXJuITE7cD1wLm5leHRafWZvcihwPXQucHJldlo7cCYmcC56Pj1mOyl7aWYocCE9PXQucHJldiYmcCE9PXQubmV4dCYmdnQoaS54LGkueSxhLngsYS55LG8ueCxvLnkscC54LHAueSkmJnh0KHAucHJldixwLHAubmV4dCk+PTApcmV0dXJuITE7cD1wLnByZXZafXJldHVybiEwfWZ1bmN0aW9uIGl0KHQsbixlKXt2YXIgcj10O2Rve3ZhciBpPXIucHJldixhPXIubmV4dC5uZXh0OyF5dChpLGEpJiZkdChpLHIsci5uZXh0LGEpJiZNdChpLGEpJiZNdChhLGkpJiYobi5wdXNoKGkuaS9lKSxuLnB1c2goci5pL2UpLG4ucHVzaChhLmkvZSksQXQociksQXQoci5uZXh0KSxyPXQ9YSkscj1yLm5leHR9d2hpbGUociE9PXQpO3JldHVybiByfWZ1bmN0aW9uIGF0KHQsbixlLHIsaSxhKXt2YXIgbz10O2Rve2Zvcih2YXIgcz1vLm5leHQubmV4dDtzIT09by5wcmV2Oyl7aWYoby5pIT09cy5pJiZndChvLHMpKXt2YXIgaD1idChvLHMpO3JldHVybiBvPXR0KG8sby5uZXh0KSxoPXR0KGgsaC5uZXh0KSxudChvLG4sZSxyLGksYSksdm9pZCBudChoLG4sZSxyLGksYSl9cz1zLm5leHR9bz1vLm5leHR9d2hpbGUobyE9PXQpfWZ1bmN0aW9uIG90KHQsbixlLHIpe3ZhciBpLGEsbyxzLGgsdT1bXTtmb3IoaT0wLGE9bi5sZW5ndGg7aTxhO2krKylvPW5baV0qcixzPWk8YS0xP25baSsxXSpyOnQubGVuZ3RoLGg9Syh0LG8scyxyLCExKSxoPT09aC5uZXh0JiYoaC5zdGVpbmVyPSEwKSx1LnB1c2gocHQoaCkpO2Zvcih1LnNvcnQoc3QpLGk9MDtpPHUubGVuZ3RoO2krKylodCh1W2ldLGUpLGU9dHQoZSxlLm5leHQpO3JldHVybiBlfWZ1bmN0aW9uIHN0KHQsbil7cmV0dXJuIHQueC1uLnh9ZnVuY3Rpb24gaHQodCxuKXtpZihuPXV0KHQsbikpe3ZhciBlPWJ0KG4sdCk7dHQoZSxlLm5leHQpfX1mdW5jdGlvbiB1dCh0LG4pe3ZhciBlLHI9bixpPXQueCxhPXQueSxvPS0xLzA7ZG97aWYoYTw9ci55JiZhPj1yLm5leHQueSl7dmFyIHM9ci54KyhhLXIueSkqKHIubmV4dC54LXIueCkvKHIubmV4dC55LXIueSk7aWYoczw9aSYmcz5vKXtpZihvPXMscz09PWkpe2lmKGE9PT1yLnkpcmV0dXJuIHI7aWYoYT09PXIubmV4dC55KXJldHVybiByLm5leHR9ZT1yLng8ci5uZXh0Lng/cjpyLm5leHR9fXI9ci5uZXh0fXdoaWxlKHIhPT1uKTtpZighZSlyZXR1cm4gbnVsbDtpZihpPT09bylyZXR1cm4gZS5wcmV2O3ZhciBoLHU9ZSxjPWUueCxmPWUueSxsPTEvMDtmb3Iocj1lLm5leHQ7ciE9PXU7KWk+PXIueCYmci54Pj1jJiZ2dChhPGY/aTpvLGEsYyxmLGE8Zj9vOmksYSxyLngsci55KSYmKChoPU1hdGguYWJzKGEtci55KS8oaS1yLngpKTxsfHxoPT09bCYmci54PmUueCkmJk10KHIsdCkmJihlPXIsbD1oKSxyPXIubmV4dDtyZXR1cm4gZX1mdW5jdGlvbiBjdCh0LG4sZSxyKXt2YXIgaT10O2Rve251bGw9PT1pLnomJihpLno9bHQoaS54LGkueSxuLGUscikpLGkucHJldlo9aS5wcmV2LGkubmV4dFo9aS5uZXh0LGk9aS5uZXh0fXdoaWxlKGkhPT10KTtpLnByZXZaLm5leHRaPW51bGwsaS5wcmV2Wj1udWxsLGZ0KGkpfWZ1bmN0aW9uIGZ0KHQpe3ZhciBuLGUscixpLGEsbyxzLGgsdT0xO2Rve2ZvcihlPXQsdD1udWxsLGE9bnVsbCxvPTA7ZTspe2ZvcihvKysscj1lLHM9MCxuPTA7bjx1JiYocysrLHI9ci5uZXh0Wik7bisrKTtmb3IoaD11O3M+MHx8aD4wJiZyOykwPT09cz8oaT1yLHI9ci5uZXh0WixoLS0pOjAhPT1oJiZyP2Uuejw9ci56PyhpPWUsZT1lLm5leHRaLHMtLSk6KGk9cixyPXIubmV4dFosaC0tKTooaT1lLGU9ZS5uZXh0WixzLS0pLGE/YS5uZXh0Wj1pOnQ9aSxpLnByZXZaPWEsYT1pO2U9cn1hLm5leHRaPW51bGwsdSo9Mn13aGlsZShvPjEpO3JldHVybiB0fWZ1bmN0aW9uIGx0KHQsbixlLHIsaSl7cmV0dXJuIHQ9MzI3NjcqKHQtZSkvaSxuPTMyNzY3KihuLXIpL2ksdD0xNjcxMTkzNSYodHx0PDw4KSx0PTI1MjY0NTEzNSYodHx0PDw0KSx0PTg1ODk5MzQ1OSYodHx0PDwyKSx0PTE0MzE2NTU3NjUmKHR8dDw8MSksbj0xNjcxMTkzNSYobnxuPDw4KSxuPTI1MjY0NTEzNSYobnxuPDw0KSxuPTg1ODk5MzQ1OSYobnxuPDwyKSxuPTE0MzE2NTU3NjUmKG58bjw8MSksdHxuPDwxfWZ1bmN0aW9uIHB0KHQpe3ZhciBuPXQsZT10O2Rve24ueDxlLngmJihlPW4pLG49bi5uZXh0fXdoaWxlKG4hPT10KTtyZXR1cm4gZX1mdW5jdGlvbiB2dCh0LG4sZSxyLGksYSxvLHMpe3JldHVybihpLW8pKihuLXMpLSh0LW8pKihhLXMpPj0wJiYodC1vKSooci1zKS0oZS1vKSoobi1zKT49MCYmKGUtbykqKGEtcyktKGktbykqKHItcyk+PTB9ZnVuY3Rpb24gZ3QodCxuKXtyZXR1cm4gdC5uZXh0LmkhPT1uLmkmJnQucHJldi5pIT09bi5pJiYhbXQodCxuKSYmTXQodCxuKSYmTXQobix0KSYmd3QodCxuKX1mdW5jdGlvbiB4dCh0LG4sZSl7cmV0dXJuKG4ueS10LnkpKihlLngtbi54KS0obi54LXQueCkqKGUueS1uLnkpfWZ1bmN0aW9uIHl0KHQsbil7cmV0dXJuIHQueD09PW4ueCYmdC55PT09bi55fWZ1bmN0aW9uIGR0KHQsbixlLHIpe3JldHVybiEhKHl0KHQsbikmJnl0KGUscil8fHl0KHQscikmJnl0KGUsbikpfHx4dCh0LG4sZSk+MCE9eHQodCxuLHIpPjAmJnh0KGUscix0KT4wIT14dChlLHIsbik+MH1mdW5jdGlvbiBtdCh0LG4pe3ZhciBlPXQ7ZG97aWYoZS5pIT09dC5pJiZlLm5leHQuaSE9PXQuaSYmZS5pIT09bi5pJiZlLm5leHQuaSE9PW4uaSYmZHQoZSxlLm5leHQsdCxuKSlyZXR1cm4hMDtlPWUubmV4dH13aGlsZShlIT09dCk7cmV0dXJuITF9ZnVuY3Rpb24gTXQodCxuKXtyZXR1cm4geHQodC5wcmV2LHQsdC5uZXh0KTwwP3h0KHQsbix0Lm5leHQpPj0wJiZ4dCh0LHQucHJldixuKT49MDp4dCh0LG4sdC5wcmV2KTwwfHx4dCh0LHQubmV4dCxuKTwwfWZ1bmN0aW9uIHd0KHQsbil7dmFyIGU9dCxyPSExLGk9KHQueCtuLngpLzIsYT0odC55K24ueSkvMjtkb3tlLnk+YSE9ZS5uZXh0Lnk+YSYmaTwoZS5uZXh0LngtZS54KSooYS1lLnkpLyhlLm5leHQueS1lLnkpK2UueCYmKHI9IXIpLGU9ZS5uZXh0fXdoaWxlKGUhPT10KTtyZXR1cm4gcn1mdW5jdGlvbiBidCh0LG4pe3ZhciBlPW5ldyBxdCh0LmksdC54LHQueSkscj1uZXcgcXQobi5pLG4ueCxuLnkpLGk9dC5uZXh0LGE9bi5wcmV2O3JldHVybiB0Lm5leHQ9bixuLnByZXY9dCxlLm5leHQ9aSxpLnByZXY9ZSxyLm5leHQ9ZSxlLnByZXY9cixhLm5leHQ9cixyLnByZXY9YSxyfWZ1bmN0aW9uIEx0KHQsbixlLHIpe3ZhciBpPW5ldyBxdCh0LG4sZSk7cmV0dXJuIHI/KGkubmV4dD1yLm5leHQsaS5wcmV2PXIsci5uZXh0LnByZXY9aSxyLm5leHQ9aSk6KGkucHJldj1pLGkubmV4dD1pKSxpfWZ1bmN0aW9uIEF0KHQpe3QubmV4dC5wcmV2PXQucHJldix0LnByZXYubmV4dD10Lm5leHQsdC5wcmV2WiYmKHQucHJldloubmV4dFo9dC5uZXh0WiksdC5uZXh0WiYmKHQubmV4dFoucHJldlo9dC5wcmV2Wil9ZnVuY3Rpb24gcXQodCxuLGUpe3RoaXMuaT10LHRoaXMueD1uLHRoaXMueT1lLHRoaXMucHJldj1udWxsLHRoaXMubmV4dD1udWxsLHRoaXMuej1udWxsLHRoaXMucHJldlo9bnVsbCx0aGlzLm5leHRaPW51bGwsdGhpcy5zdGVpbmVyPSExfWZ1bmN0aW9uIGt0KHQsbixlLHIpe2Zvcih2YXIgaT0wLGE9bixvPWUtcjthPGU7YSs9cilpKz0odFtvXS10W2FdKSoodFthKzFdK3RbbysxXSksbz1hO3JldHVybiBpfWZ1bmN0aW9uIFB0KHQsbil7dmFyIGU9bi5pZCxyPW4uYmJveCxpPW51bGw9PW4ucHJvcGVydGllcz97fTpuLnByb3BlcnRpZXMsYT1fdCh0LG4pO3JldHVybiBudWxsPT1lJiZudWxsPT1yP3t0eXBlOiJGZWF0dXJlIixwcm9wZXJ0aWVzOmksZ2VvbWV0cnk6YX06bnVsbD09cj97dHlwZToiRmVhdHVyZSIsaWQ6ZSxwcm9wZXJ0aWVzOmksZ2VvbWV0cnk6YX06e3R5cGU6IkZlYXR1cmUiLGlkOmUsYmJveDpyLHByb3BlcnRpZXM6aSxnZW9tZXRyeTphfX1mdW5jdGlvbiBfdCh0LG4pe2Z1bmN0aW9uIGUodCxuKXtuLmxlbmd0aCYmbi5wb3AoKTtmb3IodmFyIGU9dVt0PDA/fnQ6dF0scj0wLGk9ZS5sZW5ndGg7cjxpOysrciluLnB1c2goaChlW3JdLHIpKTt0PDAmJlRuKG4saSl9ZnVuY3Rpb24gcih0KXtyZXR1cm4gaCh0KX1mdW5jdGlvbiBpKHQpe2Zvcih2YXIgbj1bXSxyPTAsaT10Lmxlbmd0aDtyPGk7KytyKWUodFtyXSxuKTtyZXR1cm4gbi5sZW5ndGg8MiYmbi5wdXNoKG5bMF0pLG59ZnVuY3Rpb24gYSh0KXtmb3IodmFyIG49aSh0KTtuLmxlbmd0aDw0OyluLnB1c2goblswXSk7cmV0dXJuIG59ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdC5tYXAoYSl9ZnVuY3Rpb24gcyh0KXt2YXIgbixlPXQudHlwZTtzd2l0Y2goZSl7Y2FzZSJHZW9tZXRyeUNvbGxlY3Rpb24iOnJldHVybnt0eXBlOmUsZ2VvbWV0cmllczp0Lmdlb21ldHJpZXMubWFwKHMpfTtjYXNlIlBvaW50IjpuPXIodC5jb29yZGluYXRlcyk7YnJlYWs7Y2FzZSJNdWx0aVBvaW50IjpuPXQuY29vcmRpbmF0ZXMubWFwKHIpO2JyZWFrO2Nhc2UiTGluZVN0cmluZyI6bj1pKHQuYXJjcyk7YnJlYWs7Y2FzZSJNdWx0aUxpbmVTdHJpbmciOm49dC5hcmNzLm1hcChpKTticmVhaztjYXNlIlBvbHlnb24iOm49byh0LmFyY3MpO2JyZWFrO2Nhc2UiTXVsdGlQb2x5Z29uIjpuPXQuYXJjcy5tYXAobyk7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gbnVsbH1yZXR1cm57dHlwZTplLGNvb3JkaW5hdGVzOm59fXZhciBoPVpuKHQudHJhbnNmb3JtKSx1PXQuYXJjcztyZXR1cm4gcyhuKX1mdW5jdGlvbiBFdCh0KXtmb3IodmFyIG4sZT0tMSxyPXQubGVuZ3RoLGk9dFtyLTFdLGE9MDsrK2U8cjspbj1pLGk9dFtlXSxhKz1uWzBdKmlbMV0tblsxXSppWzBdO3JldHVybiBNYXRoLmFicyhhKX1mdW5jdGlvbiBDdCh0LG4pe2Z1bmN0aW9uIGUodCl7c3dpdGNoKHQudHlwZSl7Y2FzZSJHZW9tZXRyeUNvbGxlY3Rpb24iOnQuZ2VvbWV0cmllcy5mb3JFYWNoKGUpO2JyZWFrO2Nhc2UiUG9seWdvbiI6cih0LmFyY3MpO2JyZWFrO2Nhc2UiTXVsdGlQb2x5Z29uIjp0LmFyY3MuZm9yRWFjaChyKX19ZnVuY3Rpb24gcih0KXt0LmZvckVhY2goZnVuY3Rpb24obil7bi5mb3JFYWNoKGZ1bmN0aW9uKG4peyhhW249bjwwP35uOm5dfHwoYVtuXT1bXSkpLnB1c2godCl9KX0pLG8ucHVzaCh0KX1mdW5jdGlvbiBpKG4pe3JldHVybiBFdChfdCh0LHt0eXBlOiJQb2x5Z29uIixhcmNzOltuXX0pLmNvb3JkaW5hdGVzWzBdKX12YXIgYT17fSxvPVtdLHM9W107cmV0dXJuIG4uZm9yRWFjaChlKSxvLmZvckVhY2goZnVuY3Rpb24odCl7aWYoIXQuXyl7dmFyIG49W10sZT1bdF07Zm9yKHQuXz0xLHMucHVzaChuKTt0PWUucG9wKCk7KW4ucHVzaCh0KSx0LmZvckVhY2goZnVuY3Rpb24odCl7dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2FbdDwwP350OnRdLmZvckVhY2goZnVuY3Rpb24odCl7dC5ffHwodC5fPTEsZS5wdXNoKHQpKX0pfSl9KX19KSxvLmZvckVhY2goZnVuY3Rpb24odCl7ZGVsZXRlIHQuX30pLHt0eXBlOiJNdWx0aVBvbHlnb24iLGFyY3M6cy5tYXAoZnVuY3Rpb24obil7dmFyIGUscj1bXTtpZihuLmZvckVhY2goZnVuY3Rpb24odCl7dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuZm9yRWFjaChmdW5jdGlvbih0KXthW3Q8MD9+dDp0XS5sZW5ndGg8MiYmci5wdXNoKHQpfSl9KX0pLHI9em4odCxyKSwoZT1yLmxlbmd0aCk+MSlmb3IodmFyIG8scyxoPTEsdT1pKHJbMF0pO2g8ZTsrK2gpKG89aShyW2hdKSk+dSYmKHM9clswXSxyWzBdPXJbaF0scltoXT1zLHU9byk7cmV0dXJuIHJ9KX19ZnVuY3Rpb24gU3QodCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7cmV0dXJuIE5uKHQobiksZSl9fWZ1bmN0aW9uIFp0KHQsbil7dmFyIGU9e30scj17dHlwZToiVG9wb2xvZ3kiLG9iamVjdHM6e3RyaWFuZ2xlczp7dHlwZToiR2VvbWV0cnlDb2xsZWN0aW9uIixnZW9tZXRyaWVzOltdfX0sYXJjczpbXX07cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgaT1bXTt0LmZvckVhY2goZnVuY3Rpb24odCxhKXt2YXIgbz10WzBdPHRbMV0/dC5qb2luKCIsIik6dFsxXSsiLCIrdFswXSxzPXQubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBuW3RdfSk7byBpbiBlP2kucHVzaCh+ZVtvXSk6KGkucHVzaChlW29dPXIuYXJjcy5sZW5ndGgpLHIuYXJjcy5wdXNoKHMpKX0pLHIub2JqZWN0cy50cmlhbmdsZXMuZ2VvbWV0cmllcy5wdXNoKHt0eXBlOiJQb2x5Z29uIixhcmVhOk1hdGguYWJzKEJ0KHQubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBuW3RbMF1dfSkpKSxhcmNzOltpXX0pfSksci5vYmplY3RzLnRyaWFuZ2xlcy5nZW9tZXRyaWVzLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gdC5hcmVhLW4uYXJlYX0pLHJ9ZnVuY3Rpb24gVHQodCxuKXtmb3IodmFyIGU9dC5vYmplY3RzLnRyaWFuZ2xlcy5nZW9tZXRyaWVzLHI9WG4oZnVuY3Rpb24odCl7cmV0dXJuIHQuYXJlYX0pLmxlZnQ7ZS5sZW5ndGg+bjspIWZ1bmN0aW9uKCl7dmFyIG49ZVswXSxpPUluKGUpWzBdWzBdLGE9ZVtpXSxvPUN0KHQsW24sYV0pO28uYXJlYT1uLmFyZWErYS5hcmVhLG8udHlwZT0iUG9seWdvbiIsby5hcmNzPW8uYXJjc1swXSxlLnNwbGljZShpLDEpLGUuc2hpZnQoKSxlLnNwbGljZShyKGUsby5hcmVhKSwwLG8pfSgpO2lmKG4+ZS5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkNhbid0IGNvbGxhcHNlIHRvcG9sb2d5IGludG8gIituKyIgcGllY2VzLiIpO3JldHVybiBGbih0LHQub2JqZWN0cy50cmlhbmdsZXMpLmZlYXR1cmVzLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZW9tZXRyeS5jb29yZGluYXRlc1swXS5wb3AoKSx0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdfSl9ZnVuY3Rpb24gRnQodCl7Zm9yKHZhciBuPXQucmVkdWNlKGZ1bmN0aW9uKHQsbil7cmV0dXJuIHQuY29uY2F0KG4uc2xpY2UoMCwyKSl9LFtdKSxlPUNuKG4pLHI9W10saT0wLGE9ZS5sZW5ndGg7aTxhO2krPTMpci5wdXNoKFtbZVtpXSxlW2krMV1dLFtlW2krMV0sZVtpKzJdXSxbZVtpKzJdLGVbaV1dXSk7cmV0dXJuIHJ9ZnVuY3Rpb24genQodCxuLGUpe2Z1bmN0aW9uIHIodCxuLG8pe3ZvaWQgMD09PW4mJihuPVtdKSx2b2lkIDA9PT1vJiYobz0wKTtmb3IodmFyIHM9MDtzPHQubGVuZ3RoO3MrKyl7dmFyIGg9dC5zcGxpY2UocywxKSx1PWVbaFswXV1bbi5sZW5ndGhdO28rdTxpJiYodC5sZW5ndGg/cih0LnNsaWNlKCksbi5jb25jYXQoaCksbyt1KTooaT1vK3UsYT1uLmNvbmNhdChoKSkpLHQubGVuZ3RoJiZ0LnNwbGljZShzLDAsaFswXSl9fXZhciBpPTEvMCxhPXQubWFwKGZ1bmN0aW9uKHQsbil7cmV0dXJuIG59KTtyZXR1cm4gcihhKSxhfWZ1bmN0aW9uIGp0KHQsbil7dmFyIGU9RyhXdCh0KSxXdChuKSk7cmV0dXJuIGUqZX1mdW5jdGlvbiBJdCh0LG4sZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciByPWUubWF4U2VnbWVudExlbmd0aDt2b2lkIDA9PT1yJiYocj0xMCk7dmFyIGk9ZS5zdHJpbmc7dm9pZCAwPT09aSYmKGk9ITApO3ZhciBhPWUuc2luZ2xlO3ZvaWQgMD09PWEmJihhPSExKTt2YXIgbz1CKHQscik7by5sZW5ndGg8bi5sZW5ndGgrMiYmUihvLG4ubGVuZ3RoKzItby5sZW5ndGgpO3ZhciBzPVZuKG8sbi5sZW5ndGgpLGg9bi5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIEIodCxyKX0pLHU9R24ocyxoKSxjPXUubWFwKGZ1bmN0aW9uKHQsbil7cmV0dXJuICQoc1t0XSxoW25dLGkpfSk7aWYoYSl7dmFyIGY9aT9mdW5jdGlvbih0KXtyZXR1cm4gYy5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG4odCl9KS5qb2luKCIgIil9OmZ1bmN0aW9uKHQpe3JldHVybiBjLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gbih0KX0pfTtpZihpKXt2YXIgbD0ic3RyaW5nIj09dHlwZW9mIHQmJnQscD1uLmV2ZXJ5KGZ1bmN0aW9uKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdH0pJiZuLmpvaW4oIiAiKTtpZihsfHxwKXJldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdDwxZS00JiZsfHwxLXQ8MWUtNCYmcHx8Zih0KX19cmV0dXJuIGZ9cmV0dXJuIGk/Yy5tYXAoZnVuY3Rpb24odCxlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIG5bZV0/ZnVuY3Rpb24ocil7cmV0dXJuIDEtcjwxZS00P25bZV06dChyKX06dH0pOmN9ZnVuY3Rpb24gTnQodCxuLGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgcj1lLm1heFNlZ21lbnRMZW5ndGg7dm9pZCAwPT09ciYmKHI9MTApO3ZhciBpPWUuc3RyaW5nO3ZvaWQgMD09PWkmJihpPSEwKTt2YXIgYT1lLnNpbmdsZTt2b2lkIDA9PT1hJiYoYT0hMSk7dmFyIG89SXQobix0LHttYXhTZWdtZW50TGVuZ3RoOnIsc3RyaW5nOmksc2luZ2xlOmF9KTtyZXR1cm4gYT9mdW5jdGlvbih0KXtyZXR1cm4gbygxLXQpfTpvLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQoMS1uKX19KX1mdW5jdGlvbiBYdCh0LG4sZSxyLGkpe3JldHVybiBPdChEdCh0LG4sZSkscixSdCh0LG4sZSksaSl9ZnVuY3Rpb24gWXQodCxuLGUscixpKXt2YXIgYT1YdChuLGUscix0LGkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gYSgxLXQpfX1mdW5jdGlvbiBWdCh0LG4sZSxyLGksYSl7cmV0dXJuIE90KEh0KHQsbixlLHIpLGksVXQodCxuLGUsciksYSl9ZnVuY3Rpb24gR3QodCxuLGUscixpLGEpe3ZhciBvPVZ0KG4sZSxyLGksdCxhKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG8oMS10KX19ZnVuY3Rpb24gT3QodCxuLGUscil7dm9pZCAwPT09ciYmKHI9e30pO3ZhciBpPXIubWF4U2VnbWVudExlbmd0aDt2b2lkIDA9PT1pJiYoaT0xMCk7dmFyIGE9ci5zdHJpbmc7dm9pZCAwPT09YSYmKGE9ITApO3ZhciBvPUIobixpKSxzPXQobyksaD1IKHMsbyxhKTtyZXR1cm4gYT9mdW5jdGlvbih0KXtyZXR1cm4gdDwxZS00P2U6aCh0KX06aH1mdW5jdGlvbiBEdCh0LG4sZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3ZhciBpPVd0KHIpLGE9JHQoci5jb25jYXQoW3JbMF1dKSksbz1NYXRoLmF0YW4yKHJbMF1bMV0taVsxXSxyWzBdWzBdLWlbMF0pLHM9MDtyZXR1cm4gci5tYXAoZnVuY3Rpb24oaSxoKXt2YXIgdTtyZXR1cm4gaCYmKHMrPUcoaSxyW2gtMV0pKSx1PW8rMipNYXRoLlBJKnMvYSxbTWF0aC5jb3ModSkqZSt0LE1hdGguc2luKHUpKmUrbl19KX19ZnVuY3Rpb24gSHQodCxuLGUscil7cmV0dXJuIGZ1bmN0aW9uKGkpe3ZhciBhPVd0KGkpLG89JHQoaS5jb25jYXQoW2lbMF1dKSkscz1NYXRoLmF0YW4yKGlbMF1bMV0tYVsxXSxpWzBdWzBdLWFbMF0pLGg9MDtzPDAmJihzPTIqTWF0aC5QSStzKTt2YXIgdT1zLygyKk1hdGguUEkpO3JldHVybiBpLm1hcChmdW5jdGlvbihhLHMpe3ZhciBjPVF0KCh1K2gvbyklMSk7cmV0dXJuIHMmJihoKz1HKGEsaVtzLTFdKSksW3QrY1swXSplLG4rY1sxXSpyXX0pfX1mdW5jdGlvbiBRdCh0KXtyZXR1cm4gdDw9MS84P1sxLC41KzQqdF06dDw9My84P1sxLjUtNCp0LDFdOnQ8PTUvOD9bMCwyLjUtNCp0XTp0PD03Lzg/WzQqdC0yLjUsMF06WzEsNCp0LTMuNV19ZnVuY3Rpb24gUnQodCxuLGUpe3ZhciByPXQtZSsiLCIrbixpPXQrZSsiLCIrbixhPSJBIitlKyIsIitlKyIsMCwxLDEsIjtyZXR1cm4iTSIrcithK2krYStyKyJaIn1mdW5jdGlvbiBVdCh0LG4sZSxyKXt2YXIgaT10K2UsYT1uK3I7cmV0dXJuIk0iK3QrIiwiK24rIkwiK2krIiwiK24rIkwiK2krIiwiK2ErIkwiK3QrIiwiK2ErIloifXZhciBCdD1mdW5jdGlvbih0KXtmb3IodmFyIG4sZT0tMSxyPXQubGVuZ3RoLGk9dFtyLTFdLGE9MDsrK2U8cjspbj1pLGk9dFtlXSxhKz1uWzFdKmlbMF0tblswXSppWzFdO3JldHVybiBhLzJ9LFd0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHI9LTEsaT10Lmxlbmd0aCxhPTAsbz0wLHM9dFtpLTFdLGg9MDsrK3I8aTspbj1zLHM9dFtyXSxoKz1lPW5bMF0qc1sxXS1zWzBdKm5bMV0sYSs9KG5bMF0rc1swXSkqZSxvKz0oblsxXStzWzFdKSplO3JldHVybiBoKj0zLFthL2gsby9oXX0sJHQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscj0tMSxpPXQubGVuZ3RoLGE9dFtpLTFdLG89YVswXSxzPWFbMV0saD0wOysrcjxpOyluPW8sZT1zLGE9dFtyXSxvPWFbMF0scz1hWzFdLG4tPW8sZS09cyxoKz1NYXRoLnNxcnQobipuK2UqZSk7cmV0dXJuIGh9LEp0PXthOjcsYzo2LGg6MSxsOjIsbToyLHI6NCxxOjQsczo0LHQ6Mix2OjEsejowfSxLdD1bNTc2MCw2MTU4LDgxOTIsODE5Myw4MTk0LDgxOTUsODE5Niw4MTk3LDgxOTgsODE5OSw4MjAwLDgyMDEsODIwMiw4MjM5LDgyODcsMTIyODgsNjUyNzldLHRuPWZ1bmN0aW9uKHQpe3ZhciBuPW5ldyBhKHQpLGU9bi5tYXg7Zm9yKG8obik7bi5pbmRleDxlJiYhbi5lcnIubGVuZ3RoOyl1KG4pO3JldHVybiBuLmVyci5sZW5ndGg/bi5yZXN1bHQ9W106bi5yZXN1bHQubGVuZ3RoJiYoIm1NIi5pbmRleE9mKG4ucmVzdWx0WzBdWzBdKTwwPyhuLmVycj0iU3ZnUGF0aDogc3RyaW5nIHNob3VsZCBzdGFydCB3aXRoIGBNYCBvciBgbWAiLG4ucmVzdWx0PVtdKTpuLnJlc3VsdFswXVswXT0iTSIpLHtlcnI6bi5lcnIsc2VnbWVudHM6bi5yZXN1bHR9fTtmLnByb3RvdHlwZS5tYXRyaXg9ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10WzBdJiYwPT09dFsxXSYmMD09PXRbMl0mJjE9PT10WzNdJiYwPT09dFs0XSYmMD09PXRbNV0/dGhpczoodGhpcy5jYWNoZT1udWxsLHRoaXMucXVldWUucHVzaCh0KSx0aGlzKX0sZi5wcm90b3R5cGUudHJhbnNsYXRlPWZ1bmN0aW9uKHQsbil7cmV0dXJuIDA9PT10JiYwPT09bnx8KHRoaXMuY2FjaGU9bnVsbCx0aGlzLnF1ZXVlLnB1c2goWzEsMCwwLDEsdCxuXSkpLHRoaXN9LGYucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKHQsbil7cmV0dXJuIDE9PT10JiYxPT09bnx8KHRoaXMuY2FjaGU9bnVsbCx0aGlzLnF1ZXVlLnB1c2goW3QsMCwwLG4sMCwwXSkpLHRoaXN9LGYucHJvdG90eXBlLnJvdGF0ZT1mdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxhO3JldHVybiAwIT09dCYmKHRoaXMudHJhbnNsYXRlKG4sZSkscj10Kk1hdGguUEkvMTgwLGk9TWF0aC5jb3MociksYT1NYXRoLnNpbihyKSx0aGlzLnF1ZXVlLnB1c2goW2ksYSwtYSxpLDAsMF0pLHRoaXMuY2FjaGU9bnVsbCx0aGlzLnRyYW5zbGF0ZSgtbiwtZSkpLHRoaXN9LGYucHJvdG90eXBlLnNrZXdYPWZ1bmN0aW9uKHQpe3JldHVybiAwIT09dCYmKHRoaXMuY2FjaGU9bnVsbCx0aGlzLnF1ZXVlLnB1c2goWzEsMCxNYXRoLnRhbih0Kk1hdGguUEkvMTgwKSwxLDAsMF0pKSx0aGlzfSxmLnByb3RvdHlwZS5za2V3WT1mdW5jdGlvbih0KXtyZXR1cm4gMCE9PXQmJih0aGlzLmNhY2hlPW51bGwsdGhpcy5xdWV1ZS5wdXNoKFsxLE1hdGgudGFuKHQqTWF0aC5QSS8xODApLDAsMSwwLDBdKSksdGhpc30sZi5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYodGhpcy5jYWNoZSlyZXR1cm4gdGhpcy5jYWNoZTtpZighdGhpcy5xdWV1ZS5sZW5ndGgpcmV0dXJuIHRoaXMuY2FjaGU9WzEsMCwwLDEsMCwwXSx0aGlzLmNhY2hlO2lmKHRoaXMuY2FjaGU9dGhpcy5xdWV1ZVswXSwxPT09dGhpcy5xdWV1ZS5sZW5ndGgpcmV0dXJuIHRoaXMuY2FjaGU7Zm9yKHZhciBuPTE7bjx0aGlzLnF1ZXVlLmxlbmd0aDtuKyspdC5jYWNoZT1jKHQuY2FjaGUsdC5xdWV1ZVtuXSk7cmV0dXJuIHRoaXMuY2FjaGV9LGYucHJvdG90eXBlLmNhbGM9ZnVuY3Rpb24odCxuLGUpe3ZhciByO3JldHVybiB0aGlzLnF1ZXVlLmxlbmd0aD8odGhpcy5jYWNoZXx8KHRoaXMuY2FjaGU9dGhpcy50b0FycmF5KCkpLHI9dGhpcy5jYWNoZSxbdCpyWzBdK24qclsyXSsoZT8wOnJbNF0pLHQqclsxXStuKnJbM10rKGU/MDpyWzVdKV0pOlt0LG5dfTt2YXIgbm49Zixlbj17bWF0cml4OiEwLHNjYWxlOiEwLHJvdGF0ZTohMCx0cmFuc2xhdGU6ITAsc2tld1g6ITAsc2tld1k6ITB9LHJuPS9ccyoobWF0cml4fHRyYW5zbGF0ZXxzY2FsZXxyb3RhdGV8c2tld1h8c2tld1kpXHMqXChccyooLis/KVxzKlwpW1xzLF0qLyxhbj0vW1xzLF0rLyxvbj1mdW5jdGlvbih0KXt2YXIgbixlLHI9bmV3IG5uO3JldHVybiB0LnNwbGl0KHJuKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKHQubGVuZ3RoKXtpZih2b2lkIDAhPT1lblt0XSlyZXR1cm4gdm9pZChuPXQpO3N3aXRjaChlPXQuc3BsaXQoYW4pLm1hcChmdW5jdGlvbih0KXtyZXR1cm4rdHx8MH0pLG4pe2Nhc2UibWF0cml4IjpyZXR1cm4gdm9pZCg2PT09ZS5sZW5ndGgmJnIubWF0cml4KGUpKTtjYXNlInNjYWxlIjpyZXR1cm4gdm9pZCgxPT09ZS5sZW5ndGg/ci5zY2FsZShlWzBdLGVbMF0pOjI9PT1lLmxlbmd0aCYmci5zY2FsZShlWzBdLGVbMV0pKTtjYXNlInJvdGF0ZSI6cmV0dXJuIHZvaWQoMT09PWUubGVuZ3RoP3Iucm90YXRlKGVbMF0sMCwwKTozPT09ZS5sZW5ndGgmJnIucm90YXRlKGVbMF0sZVsxXSxlWzJdKSk7Y2FzZSJ0cmFuc2xhdGUiOnJldHVybiB2b2lkKDE9PT1lLmxlbmd0aD9yLnRyYW5zbGF0ZShlWzBdLDApOjI9PT1lLmxlbmd0aCYmci50cmFuc2xhdGUoZVswXSxlWzFdKSk7Y2FzZSJza2V3WCI6cmV0dXJuIHZvaWQoMT09PWUubGVuZ3RoJiZyLnNrZXdYKGVbMF0pKTtjYXNlInNrZXdZIjpyZXR1cm4gdm9pZCgxPT09ZS5sZW5ndGgmJnIuc2tld1koZVswXSkpfX19KSxyfSxzbj0yKk1hdGguUEksaG49ZnVuY3Rpb24odCxuLGUscixpLGEsbyxzLGgpe3ZhciB1PU1hdGguc2luKGgqc24vMzYwKSxjPU1hdGguY29zKGgqc24vMzYwKSxmPWMqKHQtZSkvMit1KihuLXIpLzIsbD0tdSoodC1lKS8yK2MqKG4tcikvMjtpZigwPT09ZiYmMD09PWwpcmV0dXJuW107aWYoMD09PW98fDA9PT1zKXJldHVybltdO289TWF0aC5hYnMobykscz1NYXRoLmFicyhzKTt2YXIgZz1mKmYvKG8qbykrbCpsLyhzKnMpO2c+MSYmKG8qPU1hdGguc3FydChnKSxzKj1NYXRoLnNxcnQoZykpO3ZhciB4PXAodCxuLGUscixpLGEsbyxzLHUsYykseT1bXSxkPXhbMl0sbT14WzNdLE09TWF0aC5tYXgoTWF0aC5jZWlsKE1hdGguYWJzKG0pLyhzbi80KSksMSk7bS89TTtmb3IodmFyIHc9MDt3PE07dysrKXkucHVzaCh2KGQsbSkpLGQrPW07cmV0dXJuIHkubWFwKGZ1bmN0aW9uKHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bis9Mil7dmFyIGU9dFtuKzBdLHI9dFtuKzFdO2UqPW8scio9czt2YXIgaT1jKmUtdSpyLGE9dSplK2Mqcjt0W24rMF09aSt4WzBdLHRbbisxXT1hK3hbMV19cmV0dXJuIHR9KX0sdW49TWF0aC5QSS8xODA7Zy5wcm90b3R5cGUudHJhbnNmb3JtPWZ1bmN0aW9uKHQpe3ZhciBuPU1hdGguY29zKHRoaXMuYXgqdW4pLGU9TWF0aC5zaW4odGhpcy5heCp1bikscj1bdGhpcy5yeCoodFswXSpuK3RbMl0qZSksdGhpcy5yeCoodFsxXSpuK3RbM10qZSksdGhpcy5yeSooLXRbMF0qZSt0WzJdKm4pLHRoaXMucnkqKC10WzFdKmUrdFszXSpuKV0saT1yWzBdKnJbMF0rclsyXSpyWzJdLGE9clsxXSpyWzFdK3JbM10qclszXSxvPSgoclswXS1yWzNdKSooclswXS1yWzNdKSsoclsyXStyWzFdKSooclsyXStyWzFdKSkqKChyWzBdK3JbM10pKihyWzBdK3JbM10pKyhyWzJdLXJbMV0pKihyWzJdLXJbMV0pKSxzPShpK2EpLzI7aWYobzwxZS0xMCpzKXJldHVybiB0aGlzLnJ4PXRoaXMucnk9TWF0aC5zcXJ0KHMpLHRoaXMuYXg9MCx0aGlzO3ZhciBoPXJbMF0qclsxXStyWzJdKnJbM107bz1NYXRoLnNxcnQobyk7dmFyIHU9cytvLzIsYz1zLW8vMjtyZXR1cm4gdGhpcy5heD1NYXRoLmFicyhoKTwxZS0xMCYmTWF0aC5hYnModS1hKTwxZS0xMD85MDoxODAqTWF0aC5hdGFuKE1hdGguYWJzKGgpPk1hdGguYWJzKHUtYSk/KHUtaSkvaDpoLyh1LWEpKS9NYXRoLlBJLHRoaXMuYXg+PTA/KHRoaXMucng9TWF0aC5zcXJ0KHUpLHRoaXMucnk9TWF0aC5zcXJ0KGMpKToodGhpcy5heCs9OTAsdGhpcy5yeD1NYXRoLnNxcnQoYyksdGhpcy5yeT1NYXRoLnNxcnQodSkpLHRoaXN9LGcucHJvdG90eXBlLmlzRGVnZW5lcmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJ4PDFlLTEwKnRoaXMucnl8fHRoaXMucnk8MWUtMTAqdGhpcy5yeH07dmFyIGNuPWc7eC5wcm90b3R5cGUuX19tYXRyaXg9ZnVuY3Rpb24odCl7dmFyIG4sZT10aGlzO3QucXVldWUubGVuZ3RoJiZ0aGlzLml0ZXJhdGUoZnVuY3Rpb24ocixpLGEsbyl7dmFyIHMsaCx1LGM7c3dpdGNoKHJbMF0pe2Nhc2UidiI6cz10LmNhbGMoMCxyWzFdLCEwKSxoPTA9PT1zWzBdP1sidiIsc1sxXV06WyJsIixzWzBdLHNbMV1dO2JyZWFrO2Nhc2UiViI6cz10LmNhbGMoYSxyWzFdLCExKSxoPXNbMF09PT10LmNhbGMoYSxvLCExKVswXT9bIlYiLHNbMV1dOlsiTCIsc1swXSxzWzFdXTticmVhaztjYXNlImgiOnM9dC5jYWxjKHJbMV0sMCwhMCksaD0wPT09c1sxXT9bImgiLHNbMF1dOlsibCIsc1swXSxzWzFdXTticmVhaztjYXNlIkgiOnM9dC5jYWxjKHJbMV0sbywhMSksaD1zWzFdPT09dC5jYWxjKGEsbywhMSlbMV0/WyJIIixzWzBdXTpbIkwiLHNbMF0sc1sxXV07YnJlYWs7Y2FzZSJhIjpjYXNlIkEiOnZhciBmPXQudG9BcnJheSgpLGw9Y24oclsxXSxyWzJdLHJbM10pLnRyYW5zZm9ybShmKTtpZihmWzBdKmZbM10tZlsxXSpmWzJdPDAmJihyWzVdPXJbNV0/IjAiOiIxIikscz10LmNhbGMocls2XSxyWzddLCJhIj09PXJbMF0pLCJBIj09PXJbMF0mJnJbNl09PT1hJiZyWzddPT09b3x8ImEiPT09clswXSYmMD09PXJbNl0mJjA9PT1yWzddKXtoPVsiYSI9PT1yWzBdPyJsIjoiTCIsc1swXSxzWzFdXTticmVha31oPWwuaXNEZWdlbmVyYXRlKCk/WyJhIj09PXJbMF0/ImwiOiJMIixzWzBdLHNbMV1dOltyWzBdLGwucngsbC5yeSxsLmF4LHJbNF0scls1XSxzWzBdLHNbMV1dO2JyZWFrO2Nhc2UibSI6Yz1pPjAscz10LmNhbGMoclsxXSxyWzJdLGMpLGg9WyJtIixzWzBdLHNbMV1dO2JyZWFrO2RlZmF1bHQ6Zm9yKHU9clswXSxoPVt1XSxjPXUudG9Mb3dlckNhc2UoKT09PXUsbj0xO248ci5sZW5ndGg7bis9MilzPXQuY2FsYyhyW25dLHJbbisxXSxjKSxoLnB1c2goc1swXSxzWzFdKX1lLnNlZ21lbnRzW2ldPWh9LCEwKX0seC5wcm90b3R5cGUuX19ldmFsdWF0ZVN0YWNrPWZ1bmN0aW9uKCl7dmFyIHQsbixlPXRoaXM7aWYodGhpcy5fX3N0YWNrLmxlbmd0aCl7aWYoMT09PXRoaXMuX19zdGFjay5sZW5ndGgpcmV0dXJuIHRoaXMuX19tYXRyaXgodGhpcy5fX3N0YWNrWzBdKSx2b2lkKHRoaXMuX19zdGFjaz1bXSk7Zm9yKHQ9bm4oKSxuPXRoaXMuX19zdGFjay5sZW5ndGg7LS1uPj0wOyl0Lm1hdHJpeChlLl9fc3RhY2tbbl0udG9BcnJheSgpKTt0aGlzLl9fbWF0cml4KHQpLHRoaXMuX19zdGFjaz1bXX19LHgucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQsbixlPXRoaXMscj1bXTt0aGlzLl9fZXZhbHVhdGVTdGFjaygpO2Zvcih2YXIgaT0wO2k8dGhpcy5zZWdtZW50cy5sZW5ndGg7aSsrKW49ZS5zZWdtZW50c1tpXVswXSx0PWk+MCYmIm0iIT09biYmIk0iIT09biYmbj09PWUuc2VnbWVudHNbaS0xXVswXSxyPXIuY29uY2F0KHQ/ZS5zZWdtZW50c1tpXS5zbGljZSgxKTplLnNlZ21lbnRzW2ldKTtyZXR1cm4gci5qb2luKCIgIikucmVwbGFjZSgvID8oW2FjaGxtcXJzdHZ6XSkgPy9naSwiJDEiKS5yZXBsYWNlKC8gXC0vZywiLSIpLnJlcGxhY2UoL3ptL2csInogbSIpfSx4LnByb3RvdHlwZS50cmFuc2xhdGU9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5fX3N0YWNrLnB1c2gobm4oKS50cmFuc2xhdGUodCxufHwwKSksdGhpc30seC5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5fX3N0YWNrLnB1c2gobm4oKS5zY2FsZSh0LG58fDA9PT1uP246dCkpLHRoaXN9LHgucHJvdG90eXBlLnJvdGF0ZT1mdW5jdGlvbih0LG4sZSl7cmV0dXJuIHRoaXMuX19zdGFjay5wdXNoKG5uKCkucm90YXRlKHQsbnx8MCxlfHwwKSksdGhpc30seC5wcm90b3R5cGUuc2tld1g9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19zdGFjay5wdXNoKG5uKCkuc2tld1godCkpLHRoaXN9LHgucHJvdG90eXBlLnNrZXdZPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fc3RhY2sucHVzaChubigpLnNrZXdZKHQpKSx0aGlzfSx4LnByb3RvdHlwZS5tYXRyaXg9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19zdGFjay5wdXNoKG5uKCkubWF0cml4KHQpKSx0aGlzfSx4LnByb3RvdHlwZS50cmFuc2Zvcm09ZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbSgpPyh0aGlzLl9fc3RhY2sucHVzaChvbih0KSksdGhpcyk6dGhpc30seC5wcm90b3R5cGUucm91bmQ9ZnVuY3Rpb24odCl7dmFyIG4sZT0wLHI9MCxpPTAsYT0wO3JldHVybiB0PXR8fDAsdGhpcy5fX2V2YWx1YXRlU3RhY2soKSx0aGlzLnNlZ21lbnRzLmZvckVhY2goZnVuY3Rpb24obyl7dmFyIHM9b1swXS50b0xvd2VyQ2FzZSgpPT09b1swXTtzd2l0Y2gob1swXSl7Y2FzZSJIIjpjYXNlImgiOnJldHVybiBzJiYob1sxXSs9aSksaT1vWzFdLW9bMV0udG9GaXhlZCh0KSx2b2lkKG9bMV09K29bMV0udG9GaXhlZCh0KSk7Y2FzZSJWIjpjYXNlInYiOnJldHVybiBzJiYob1sxXSs9YSksYT1vWzFdLW9bMV0udG9GaXhlZCh0KSx2b2lkKG9bMV09K29bMV0udG9GaXhlZCh0KSk7Y2FzZSJaIjpjYXNlInoiOnJldHVybiBpPWUsdm9pZChhPXIpO2Nhc2UiTSI6Y2FzZSJtIjpyZXR1cm4gcyYmKG9bMV0rPWksb1syXSs9YSksaT1vWzFdLW9bMV0udG9GaXhlZCh0KSxhPW9bMl0tb1syXS50b0ZpeGVkKHQpLGU9aSxyPWEsb1sxXT0rb1sxXS50b0ZpeGVkKHQpLHZvaWQob1syXT0rb1syXS50b0ZpeGVkKHQpKTtjYXNlIkEiOmNhc2UiYSI6cmV0dXJuIHMmJihvWzZdKz1pLG9bN10rPWEpLGk9b1s2XS1vWzZdLnRvRml4ZWQodCksYT1vWzddLW9bN10udG9GaXhlZCh0KSxvWzFdPStvWzFdLnRvRml4ZWQodCksb1syXT0rb1syXS50b0ZpeGVkKHQpLG9bM109K29bM10udG9GaXhlZCh0KzIpLG9bNl09K29bNl0udG9GaXhlZCh0KSx2b2lkKG9bN109K29bN10udG9GaXhlZCh0KSk7ZGVmYXVsdDpyZXR1cm4gbj1vLmxlbmd0aCxzJiYob1tuLTJdKz1pLG9bbi0xXSs9YSksaT1vW24tMl0tb1tuLTJdLnRvRml4ZWQodCksYT1vW24tMV0tb1tuLTFdLnRvRml4ZWQodCksdm9pZCBvLmZvckVhY2goZnVuY3Rpb24obixlKXtlJiYob1tlXT0rb1tlXS50b0ZpeGVkKHQpKX0pfX0pLHRoaXN9LHgucHJvdG90eXBlLml0ZXJhdGU9ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGksYT10aGlzLnNlZ21lbnRzLG89e30scz0hMSxoPTAsdT0wLGM9MCxmPTA7aWYobnx8dGhpcy5fX2V2YWx1YXRlU3RhY2soKSxhLmZvckVhY2goZnVuY3Rpb24obixlKXt2YXIgcj10KG4sZSxoLHUpO0FycmF5LmlzQXJyYXkocikmJihvW2VdPXIscz0hMCk7dmFyIGk9blswXT09PW5bMF0udG9Mb3dlckNhc2UoKTtzd2l0Y2goblswXSl7Y2FzZSJtIjpjYXNlIk0iOnJldHVybiBoPW5bMV0rKGk/aDowKSx1PW5bMl0rKGk/dTowKSxjPWgsdm9pZChmPXUpO2Nhc2UiaCI6Y2FzZSJIIjpyZXR1cm4gdm9pZChoPW5bMV0rKGk/aDowKSk7Y2FzZSJ2IjpjYXNlIlYiOnJldHVybiB2b2lkKHU9blsxXSsoaT91OjApKTtjYXNlInoiOmNhc2UiWiI6cmV0dXJuIGg9Yyx2b2lkKHU9Zik7ZGVmYXVsdDpoPW5bbi5sZW5ndGgtMl0rKGk/aDowKSx1PW5bbi5sZW5ndGgtMV0rKGk/dTowKX19KSwhcylyZXR1cm4gdGhpcztmb3IoaT1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspaWYodm9pZCAwIT09b1tlXSlmb3Iocj0wO3I8b1tlXS5sZW5ndGg7cisrKWkucHVzaChvW2VdW3JdKTtlbHNlIGkucHVzaChhW2VdKTtyZXR1cm4gdGhpcy5zZWdtZW50cz1pLHRoaXN9LHgucHJvdG90eXBlLmFicz1mdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdGUoZnVuY3Rpb24odCxuLGUscil7dmFyIGksYT10WzBdLG89YS50b1VwcGVyQ2FzZSgpO2lmKGEhPT1vKXN3aXRjaCh0WzBdPW8sYSl7Y2FzZSJ2IjpyZXR1cm4gdm9pZCh0WzFdKz1yKTtjYXNlImEiOnJldHVybiB0WzZdKz1lLHZvaWQodFs3XSs9cik7ZGVmYXVsdDpmb3IoaT0xO2k8dC5sZW5ndGg7aSsrKXRbaV0rPWklMj9lOnJ9fSwhMCksdGhpc30seC5wcm90b3R5cGUucmVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0ZShmdW5jdGlvbih0LG4sZSxyKXt2YXIgaSxhPXRbMF0sbz1hLnRvTG93ZXJDYXNlKCk7aWYoYSE9PW8mJigwIT09bnx8Ik0iIT09YSkpc3dpdGNoKHRbMF09byxhKXtjYXNlIlYiOnJldHVybiB2b2lkKHRbMV0tPXIpO2Nhc2UiQSI6cmV0dXJuIHRbNl0tPWUsdm9pZCh0WzddLT1yKTtkZWZhdWx0OmZvcihpPTE7aTx0Lmxlbmd0aDtpKyspdFtpXS09aSUyP2U6cn19LCEwKSx0aGlzfSx4LnByb3RvdHlwZS51bmFyYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdGUoZnVuY3Rpb24odCxuLGUscil7dmFyIGksYSxvLHM9W10saD10WzBdO3JldHVybiJBIiE9PWgmJiJhIiE9PWg/bnVsbDooImEiPT09aD8oYT1lK3RbNl0sbz1yK3RbN10pOihhPXRbNl0sbz10WzddKSxpPWhuKGUscixhLG8sdFs0XSx0WzVdLHRbMV0sdFsyXSx0WzNdKSwwPT09aS5sZW5ndGg/W1siYSI9PT10WzBdPyJsIjoiTCIsdFs2XSx0WzddXV06KGkuZm9yRWFjaChmdW5jdGlvbih0KXtzLnB1c2goWyJDIix0WzJdLHRbM10sdFs0XSx0WzVdLHRbNl0sdFs3XV0pfSkscykpfSksdGhpc30seC5wcm90b3R5cGUudW5zaG9ydD1mdW5jdGlvbigpe3ZhciB0LG4sZSxyLGksYT10aGlzLnNlZ21lbnRzO3JldHVybiB0aGlzLml0ZXJhdGUoZnVuY3Rpb24obyxzLGgsdSl7dmFyIGMsZj1vWzBdLGw9Zi50b1VwcGVyQ2FzZSgpO3MmJigiVCI9PT1sPyhjPSJ0Ij09PWYsZT1hW3MtMV0sIlEiPT09ZVswXT8odD1lWzFdLWgsbj1lWzJdLXUpOiJxIj09PWVbMF0/KHQ9ZVsxXS1lWzNdLG49ZVsyXS1lWzRdKToodD0wLG49MCkscj0tdCxpPS1uLGN8fChyKz1oLGkrPXUpLGFbc109W2M/InEiOiJRIixyLGksb1sxXSxvWzJdXSk6IlMiPT09bCYmKGM9InMiPT09ZixlPWFbcy0xXSwiQyI9PT1lWzBdPyh0PWVbM10taCxuPWVbNF0tdSk6ImMiPT09ZVswXT8odD1lWzNdLWVbNV0sbj1lWzRdLWVbNl0pOih0PTAsbj0wKSxyPS10LGk9LW4sY3x8KHIrPWgsaSs9dSksYVtzXT1bYz8iYyI6IkMiLHIsaSxvWzFdLG9bMl0sb1szXSxvWzRdXSkpfSksdGhpc307dmFyIGZuPXgsbG49Zm4scG49e2E6NyxjOjYsaDoxLGw6MixtOjIscTo0LHM6NCx0OjIsdjoxLHo6MH0sdm49LyhbYXN0dnpxbWhsY10pKFteYXN0dnpxbWhsY10qKS9naSxnbj1mdW5jdGlvbih0KXt2YXIgbj1bXTtyZXR1cm4gdC5yZXBsYWNlKHZuLGZ1bmN0aW9uKHQsZSxyKXt2YXIgaT1lLnRvTG93ZXJDYXNlKCk7Zm9yKHI9eShyKSwibSI9PT1pJiZyLmxlbmd0aD4yJiYobi5wdXNoKFtlXS5jb25jYXQoci5zcGxpY2UoMCwyKSkpLGk9ImwiLGU9Im0iPT09ZT8ibCI6IkwiKTtyLmxlbmd0aD49MDspe2lmKHIubGVuZ3RoPT09cG5baV0pcmV0dXJuIHIudW5zaGlmdChlKSxuLnB1c2gocik7aWYoci5sZW5ndGg8cG5baV0pdGhyb3cgbmV3IEVycm9yKCJtYWxmb3JtZWQgcGF0aCBkYXRhIik7bi5wdXNoKFtlXS5jb25jYXQoci5zcGxpY2UoMCxwbltpXSkpKX19KSxufSx4bj0vLT9bMC05XSpcLj9bMC05XSsoPzplWy0rXT9cZCspPy9naSx5bj1mdW5jdGlvbih0LG4sZSxyLGksYSxvLHMpe3JldHVybiBuZXcgZCh0LG4sZSxyLGksYSxvLHMpfTtkLnByb3RvdHlwZT17Y29uc3RydWN0b3I6ZCxpbml0OmZ1bmN0aW9uKCl7dGhpcy5sZW5ndGg9dGhpcy5nZXRBcmNMZW5ndGgoW3RoaXMuYS54LHRoaXMuYi54LHRoaXMuYy54LHRoaXMuZC54XSxbdGhpcy5hLnksdGhpcy5iLnksdGhpcy5jLnksdGhpcy5kLnldKX0sZ2V0VG90YWxMZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LGdldFBvaW50QXRMZW5ndGg6ZnVuY3Rpb24odCl7dmFyIG49dyh0LHRoaXMubGVuZ3RoLHRoaXMuZ2V0QXJjTGVuZ3RoLFt0aGlzLmEueCx0aGlzLmIueCx0aGlzLmMueCx0aGlzLmQueF0sW3RoaXMuYS55LHRoaXMuYi55LHRoaXMuYy55LHRoaXMuZC55XSk7cmV0dXJuIHRoaXMuZ2V0UG9pbnQoW3RoaXMuYS54LHRoaXMuYi54LHRoaXMuYy54LHRoaXMuZC54XSxbdGhpcy5hLnksdGhpcy5iLnksdGhpcy5jLnksdGhpcy5kLnldLG4pfSxnZXRUYW5nZW50QXRMZW5ndGg6ZnVuY3Rpb24odCl7dmFyIG49dyh0LHRoaXMubGVuZ3RoLHRoaXMuZ2V0QXJjTGVuZ3RoLFt0aGlzLmEueCx0aGlzLmIueCx0aGlzLmMueCx0aGlzLmQueF0sW3RoaXMuYS55LHRoaXMuYi55LHRoaXMuYy55LHRoaXMuZC55XSksZT10aGlzLmdldERlcml2YXRpdmUoW3RoaXMuYS54LHRoaXMuYi54LHRoaXMuYy54LHRoaXMuZC54XSxbdGhpcy5hLnksdGhpcy5iLnksdGhpcy5jLnksdGhpcy5kLnldLG4pLHI9TWF0aC5zcXJ0KGUueCplLngrZS55KmUueSk7cmV0dXJuIHI+MD97eDplLngvcix5OmUueS9yfTp7eDowLHk6MH19LGdldFByb3BlcnRpZXNBdExlbmd0aDpmdW5jdGlvbih0KXt2YXIgbixlPXcodCx0aGlzLmxlbmd0aCx0aGlzLmdldEFyY0xlbmd0aCxbdGhpcy5hLngsdGhpcy5iLngsdGhpcy5jLngsdGhpcy5kLnhdLFt0aGlzLmEueSx0aGlzLmIueSx0aGlzLmMueSx0aGlzLmQueV0pLHI9dGhpcy5nZXREZXJpdmF0aXZlKFt0aGlzLmEueCx0aGlzLmIueCx0aGlzLmMueCx0aGlzLmQueF0sW3RoaXMuYS55LHRoaXMuYi55LHRoaXMuYy55LHRoaXMuZC55XSxlKSxpPU1hdGguc3FydChyLngqci54K3IueSpyLnkpO249aT4wP3t4OnIueC9pLHk6ci55L2l9Ont4OjAseTowfTt2YXIgYT10aGlzLmdldFBvaW50KFt0aGlzLmEueCx0aGlzLmIueCx0aGlzLmMueCx0aGlzLmQueF0sW3RoaXMuYS55LHRoaXMuYi55LHRoaXMuYy55LHRoaXMuZC55XSxlKTtyZXR1cm57eDphLngseTphLnksdGFuZ2VudFg6bi54LHRhbmdlbnRZOm4ueX19fQo7dmFyIGRuPVtbXSxbXSxbLS41NzczNTAyNjkxODk2MjU3LC41NzczNTAyNjkxODk2MjU3XSxbMCwtLjc3NDU5NjY2OTI0MTQ4MzQsLjc3NDU5NjY2OTI0MTQ4MzRdLFstLjMzOTk4MTA0MzU4NDg1NjI2LC4zMzk5ODEwNDM1ODQ4NTYyNiwtLjg2MTEzNjMxMTU5NDA1MjYsLjg2MTEzNjMxMTU5NDA1MjZdLFswLC0uNTM4NDY5MzEwMTA1NjgzMSwuNTM4NDY5MzEwMTA1NjgzMSwtLjkwNjE3OTg0NTkzODY2NCwuOTA2MTc5ODQ1OTM4NjY0XSxbLjY2MTIwOTM4NjQ2NjI2NDUsLS42NjEyMDkzODY0NjYyNjQ1LC0uMjM4NjE5MTg2MDgzMTk2OSwuMjM4NjE5MTg2MDgzMTk2OSwtLjkzMjQ2OTUxNDIwMzE1MiwuOTMyNDY5NTE0MjAzMTUyXSxbMCwuNDA1ODQ1MTUxMzc3Mzk3MiwtLjQwNTg0NTE1MTM3NzM5NzIsLS43NDE1MzExODU1OTkzOTQ1LC43NDE1MzExODU1OTkzOTQ1LC0uOTQ5MTA3OTEyMzQyNzU4NSwuOTQ5MTA3OTEyMzQyNzU4NV0sWy0uMTgzNDM0NjQyNDk1NjQ5OCwuMTgzNDM0NjQyNDk1NjQ5OCwtLjUyNTUzMjQwOTkxNjMyOSwuNTI1NTMyNDA5OTE2MzI5LC0uNzk2NjY2NDc3NDEzNjI2NywuNzk2NjY2NDc3NDEzNjI2NywtLjk2MDI4OTg1NjQ5NzUzNjMsLjk2MDI4OTg1NjQ5NzUzNjNdLFswLC0uODM2MDMxMTA3MzI2NjM1OCwuODM2MDMxMTA3MzI2NjM1OCwtLjk2ODE2MDIzOTUwNzYyNjEsLjk2ODE2MDIzOTUwNzYyNjEsLS4zMjQyNTM0MjM0MDM4MDg5LC4zMjQyNTM0MjM0MDM4MDg5LC0uNjEzMzcxNDMyNzAwNTkwNCwuNjEzMzcxNDMyNzAwNTkwNF0sWy0uMTQ4ODc0MzM4OTgxNjMxMjIsLjE0ODg3NDMzODk4MTYzMTIyLC0uNDMzMzk1Mzk0MTI5MjQ3MiwuNDMzMzk1Mzk0MTI5MjQ3MiwtLjY3OTQwOTU2ODI5OTAyNDQsLjY3OTQwOTU2ODI5OTAyNDQsLS44NjUwNjMzNjY2ODg5ODQ1LC44NjUwNjMzNjY2ODg5ODQ1LC0uOTczOTA2NTI4NTE3MTcxNywuOTczOTA2NTI4NTE3MTcxN10sWzAsLS4yNjk1NDMxNTU5NTIzNDQ5NiwuMjY5NTQzMTU1OTUyMzQ0OTYsLS41MTkwOTYxMjkyMDY4MTE4LC41MTkwOTYxMjkyMDY4MTE4LC0uNzMwMTUyMDA1NTc0MDQ5NCwuNzMwMTUyMDA1NTc0MDQ5NCwtLjg4NzA2MjU5OTc2ODA5NTMsLjg4NzA2MjU5OTc2ODA5NTMsLS45NzgyMjg2NTgxNDYwNTcsLjk3ODIyODY1ODE0NjA1N10sWy0uMTI1MjMzNDA4NTExNDY4OSwuMTI1MjMzNDA4NTExNDY4OSwtLjM2NzgzMTQ5ODk5ODE4MDIsLjM2NzgzMTQ5ODk5ODE4MDIsLS41ODczMTc5NTQyODY2MTc1LC41ODczMTc5NTQyODY2MTc1LC0uNzY5OTAyNjc0MTk0MzA0NywuNzY5OTAyNjc0MTk0MzA0NywtLjkwNDExNzI1NjM3MDQ3NDksLjkwNDExNzI1NjM3MDQ3NDksLS45ODE1NjA2MzQyNDY3MTkyLC45ODE1NjA2MzQyNDY3MTkyXSxbMCwtLjIzMDQ1ODMxNTk1NTEzNDgsLjIzMDQ1ODMxNTk1NTEzNDgsLS40NDg0OTI3NTEwMzY0NDY4NywuNDQ4NDkyNzUxMDM2NDQ2ODcsLS42NDIzNDkzMzk0NDAzNDAyLC42NDIzNDkzMzk0NDAzNDAyLC0uODAxNTc4MDkwNzMzMzA5OSwuODAxNTc4MDkwNzMzMzA5OSwtLjkxNzU5ODM5OTIyMjk3NzksLjkxNzU5ODM5OTIyMjk3NzksLS45ODQxODMwNTQ3MTg1ODgxLC45ODQxODMwNTQ3MTg1ODgxXSxbLS4xMDgwNTQ5NDg3MDczNDM2NywuMTA4MDU0OTQ4NzA3MzQzNjcsLS4zMTkxMTIzNjg5Mjc4ODk3NCwuMzE5MTEyMzY4OTI3ODg5NzQsLS41MTUyNDg2MzYzNTgxNTQxLC41MTUyNDg2MzYzNTgxNTQxLC0uNjg3MjkyOTA0ODExNjg1NSwuNjg3MjkyOTA0ODExNjg1NSwtLjgyNzIwMTMxNTA2OTc2NSwuODI3MjAxMzE1MDY5NzY1LC0uOTI4NDM0ODgzNjYzNTczNSwuOTI4NDM0ODgzNjYzNTczNSwtLjk4NjI4MzgwODY5NjgxMjMsLjk4NjI4MzgwODY5NjgxMjNdLFswLC0uMjAxMTk0MDkzOTk3NDM0NTEsLjIwMTE5NDA5Mzk5NzQzNDUxLC0uMzk0MTUxMzQ3MDc3NTYzNCwuMzk0MTUxMzQ3MDc3NTYzNCwtLjU3MDk3MjE3MjYwODUzODgsLjU3MDk3MjE3MjYwODUzODgsLS43MjQ0MTc3MzEzNjAxNzAxLC43MjQ0MTc3MzEzNjAxNzAxLC0uODQ4MjA2NTgzNDEwNDI3MiwuODQ4MjA2NTgzNDEwNDI3MiwtLjkzNzI3MzM5MjQwMDcwNiwuOTM3MjczMzkyNDAwNzA2LC0uOTg3OTkyNTE4MDIwNDg1NCwuOTg3OTkyNTE4MDIwNDg1NF0sWy0uMDk1MDEyNTA5ODM3NjM3NDQsLjA5NTAxMjUwOTgzNzYzNzQ0LC0uMjgxNjAzNTUwNzc5MjU4OSwuMjgxNjAzNTUwNzc5MjU4OSwtLjQ1ODAxNjc3NzY1NzIyNzM3LC40NTgwMTY3Nzc2NTcyMjczNywtLjYxNzg3NjI0NDQwMjY0MzgsLjYxNzg3NjI0NDQwMjY0MzgsLS43NTU0MDQ0MDgzNTUwMDMsLjc1NTQwNDQwODM1NTAwMywtLjg2NTYzMTIwMjM4NzgzMTgsLjg2NTYzMTIwMjM4NzgzMTgsLS45NDQ1NzUwMjMwNzMyMzI2LC45NDQ1NzUwMjMwNzMyMzI2LC0uOTg5NDAwOTM0OTkxNjQ5OSwuOTg5NDAwOTM0OTkxNjQ5OV0sWzAsLS4xNzg0ODQxODE0OTU4NDc4NSwuMTc4NDg0MTgxNDk1ODQ3ODUsLS4zNTEyMzE3NjM0NTM4NzYzLC4zNTEyMzE3NjM0NTM4NzYzLC0uNTEyNjkwNTM3MDg2NDc2OSwuNTEyNjkwNTM3MDg2NDc2OSwtLjY1NzY3MTE1OTIxNjY5MDcsLjY1NzY3MTE1OTIxNjY5MDcsLS43ODE1MTQwMDM4OTY4MDE0LC43ODE1MTQwMDM4OTY4MDE0LC0uODgwMjM5MTUzNzI2OTg1OSwuODgwMjM5MTUzNzI2OTg1OSwtLjk1MDY3NTUyMTc2ODc2NzgsLjk1MDY3NTUyMTc2ODc2NzgsLS45OTA1NzU0NzUzMTQ0MTc0LC45OTA1NzU0NzUzMTQ0MTc0XSxbLS4wODQ3NzUwMTMwNDE3MzUzLC4wODQ3NzUwMTMwNDE3MzUzLC0uMjUxODg2MjI1NjkxNTA1NSwuMjUxODg2MjI1NjkxNTA1NSwtLjQxMTc1MTE2MTQ2Mjg0MjYzLC40MTE3NTExNjE0NjI4NDI2MywtLjU1OTc3MDgzMTA3Mzk0NzUsLjU1OTc3MDgzMTA3Mzk0NzUsLS42OTE2ODcwNDMwNjAzNTMyLC42OTE2ODcwNDMwNjAzNTMyLC0uODAzNzA0OTU4OTcyNTIzMSwuODAzNzA0OTU4OTcyNTIzMSwtLjg5MjYwMjQ2NjQ5NzU1NTcsLjg5MjYwMjQ2NjQ5NzU1NTcsLS45NTU4MjM5NDk1NzEzOTc3LC45NTU4MjM5NDk1NzEzOTc3LC0uOTkxNTY1MTY4NDIwOTMwOSwuOTkxNTY1MTY4NDIwOTMwOV0sWzAsLS4xNjAzNTg2NDU2NDAyMjUzNywuMTYwMzU4NjQ1NjQwMjI1MzcsLS4zMTY1NjQwOTk5NjM2Mjk4MywuMzE2NTY0MDk5OTYzNjI5ODMsLS40NjQ1NzA3NDEzNzU5NjA5NCwuNDY0NTcwNzQxMzc1OTYwOTQsLS42MDA1NDUzMDQ2NjE2ODEsLjYwMDU0NTMwNDY2MTY4MSwtLjcyMDk2NjE3NzMzNTIyOTQsLjcyMDk2NjE3NzMzNTIyOTQsLS44MjI3MTQ2NTY1MzcxNDI4LC44MjI3MTQ2NTY1MzcxNDI4LC0uOTAzMTU1OTAzNjE0ODE3OSwuOTAzMTU1OTAzNjE0ODE3OSwtLjk2MDIwODE1MjEzNDgzLC45NjAyMDgxNTIxMzQ4MywtLjk5MjQwNjg0Mzg0MzU4NDQsLjk5MjQwNjg0Mzg0MzU4NDRdLFstLjA3NjUyNjUyMTEzMzQ5NzM0LC4wNzY1MjY1MjExMzM0OTczNCwtLjIyNzc4NTg1MTE0MTY0NTA3LC4yMjc3ODU4NTExNDE2NDUwNywtLjM3MzcwNjA4ODcxNTQxOTU1LC4zNzM3MDYwODg3MTU0MTk1NSwtLjUxMDg2NzAwMTk1MDgyNzEsLjUxMDg2NzAwMTk1MDgyNzEsLS42MzYwNTM2ODA3MjY1MTUsLjYzNjA1MzY4MDcyNjUxNSwtLjc0NjMzMTkwNjQ2MDE1MDgsLjc0NjMzMTkwNjQ2MDE1MDgsLS44MzkxMTY5NzE4MjIyMTg4LC44MzkxMTY5NzE4MjIyMTg4LC0uOTEyMjM0NDI4MjUxMzI2LC45MTIyMzQ0MjgyNTEzMjYsLS45NjM5NzE5MjcyNzc5MTM4LC45NjM5NzE5MjcyNzc5MTM4LC0uOTkzMTI4NTk5MTg1MDk0OSwuOTkzMTI4NTk5MTg1MDk0OV0sWzAsLS4xNDU1NjE4NTQxNjA4OTUxLC4xNDU1NjE4NTQxNjA4OTUxLC0uMjg4MDIxMzE2ODAyNDAxMSwuMjg4MDIxMzE2ODAyNDAxMSwtLjQyNDM0MjEyMDIwNzQzODgsLjQyNDM0MjEyMDIwNzQzODgsLS41NTE2MTg4MzU4ODcyMTk4LC41NTE2MTg4MzU4ODcyMTk4LC0uNjY3MTM4ODA0MTk3NDEyMywuNjY3MTM4ODA0MTk3NDEyMywtLjc2ODQzOTk2MzQ3NTY3NzksLjc2ODQzOTk2MzQ3NTY3NzksLS44NTMzNjMzNjQ1ODMzMTczLC44NTMzNjMzNjQ1ODMzMTczLC0uOTIwMDk5MzM0MTUwNDAwOCwuOTIwMDk5MzM0MTUwNDAwOCwtLjk2NzIyNjgzODU2NjMwNjMsLjk2NzIyNjgzODU2NjMwNjMsLS45OTM3NTIxNzA2MjAzODk1LC45OTM3NTIxNzA2MjAzODk1XSxbLS4wNjk3MzkyNzMzMTk3MjIyMywuMDY5NzM5MjczMzE5NzIyMjMsLS4yMDc4NjA0MjY2ODgyMjEyNywuMjA3ODYwNDI2Njg4MjIxMjcsLS4zNDE5MzU4MjA4OTIwODQyNCwuMzQxOTM1ODIwODkyMDg0MjQsLS40NjkzNTU4Mzc5ODY3NTcsLjQ2OTM1NTgzNzk4Njc1NywtLjU4NzY0MDQwMzUwNjkxMTYsLjU4NzY0MDQwMzUwNjkxMTYsLS42OTQ0ODcyNjMxODY2ODI3LC42OTQ0ODcyNjMxODY2ODI3LC0uNzg3ODE2ODA1OTc5MjA4MSwuNzg3ODE2ODA1OTc5MjA4MSwtLjg2NTgxMjU3NzcyMDMwMDIsLjg2NTgxMjU3NzcyMDMwMDIsLS45MjY5NTY3NzIxODcxNzQsLjkyNjk1Njc3MjE4NzE3NCwtLjk3MDA2MDQ5NzgzNTQyODcsLjk3MDA2MDQ5NzgzNTQyODcsLS45OTQyOTQ1ODU0ODIzOTkyLC45OTQyOTQ1ODU0ODIzOTkyXSxbMCwtLjEzMzI1NjgyNDI5ODQ2NjEsLjEzMzI1NjgyNDI5ODQ2NjEsLS4yNjQxMzU2ODA5NzAzNDQ5NSwuMjY0MTM1NjgwOTcwMzQ0OTUsLS4zOTAzMDEwMzgwMzAyOTA4LC4zOTAzMDEwMzgwMzAyOTA4LC0uNTA5NTAxNDc3ODQ2MDA3NSwuNTA5NTAxNDc3ODQ2MDA3NSwtLjYxOTYwOTg3NTc2MzY0NjEsLjYxOTYwOTg3NTc2MzY0NjEsLS43MTg2NjEzNjMxMzE5NTAyLC43MTg2NjEzNjMxMzE5NTAyLC0uODA0ODg4NDAxNjE4ODM5OSwuODA0ODg4NDAxNjE4ODM5OSwtLjg3Njc1MjM1ODI3MDQ0MTYsLjg3Njc1MjM1ODI3MDQ0MTYsLS45MzI5NzEwODY4MjYwMTYxLC45MzI5NzEwODY4MjYwMTYxLC0uOTcyNTQyNDcxMjE4MTE1MiwuOTcyNTQyNDcxMjE4MTE1MiwtLjk5NDc2OTMzNDk5NzU1MjIsLjk5NDc2OTMzNDk5NzU1MjJdLFstLjA2NDA1Njg5Mjg2MjYwNTYzLC4wNjQwNTY4OTI4NjI2MDU2MywtLjE5MTExODg2NzQ3MzYxNjMsLjE5MTExODg2NzQ3MzYxNjMsLS4zMTUwNDI2Nzk2OTYxNjM0LC4zMTUwNDI2Nzk2OTYxNjM0LC0uNDMzNzkzNTA3NjI2MDQ1MSwuNDMzNzkzNTA3NjI2MDQ1MSwtLjU0NTQyMTQ3MTM4ODgzOTYsLjU0NTQyMTQ3MTM4ODgzOTYsLS42NDgwOTM2NTE5MzY5NzU1LC42NDgwOTM2NTE5MzY5NzU1LC0uNzQwMTI0MTkxNTc4NTU0NCwuNzQwMTI0MTkxNTc4NTU0NCwtLjgyMDAwMTk4NTk3MzkwMywuODIwMDAxOTg1OTczOTAzLC0uODg2NDE1NTI3MDA0NDAxMSwuODg2NDE1NTI3MDA0NDAxMSwtLjkzODI3NDU1MjAwMjczMjgsLjkzODI3NDU1MjAwMjczMjgsLS45NzQ3Mjg1NTU5NzEzMDk1LC45NzQ3Mjg1NTU5NzEzMDk1LC0uOTk1MTg3MjE5OTk3MDIxMywuOTk1MTg3MjE5OTk3MDIxM11dLG1uPVtbXSxbXSxbMSwxXSxbLjg4ODg4ODg4ODg4ODg4ODgsLjU1NTU1NTU1NTU1NTU1NTYsLjU1NTU1NTU1NTU1NTU1NTZdLFsuNjUyMTQ1MTU0ODYyNTQ2MSwuNjUyMTQ1MTU0ODYyNTQ2MSwuMzQ3ODU0ODQ1MTM3NDUzODUsLjM0Nzg1NDg0NTEzNzQ1Mzg1XSxbLjU2ODg4ODg4ODg4ODg4ODksLjQ3ODYyODY3MDQ5OTM2NjQ3LC40Nzg2Mjg2NzA0OTkzNjY0NywuMjM2OTI2ODg1MDU2MTg5MDgsLjIzNjkyNjg4NTA1NjE4OTA4XSxbLjM2MDc2MTU3MzA0ODEzODYsLjM2MDc2MTU3MzA0ODEzODYsLjQ2NzkxMzkzNDU3MjY5MTA0LC40Njc5MTM5MzQ1NzI2OTEwNCwuMTcxMzI0NDkyMzc5MTcwMzYsLjE3MTMyNDQ5MjM3OTE3MDM2XSxbLjQxNzk1OTE4MzY3MzQ2OTQsLjM4MTgzMDA1MDUwNTExODksLjM4MTgzMDA1MDUwNTExODksLjI3OTcwNTM5MTQ4OTI3NjY0LC4yNzk3MDUzOTE0ODkyNzY2NCwuMTI5NDg0OTY2MTY4ODY5NywuMTI5NDg0OTY2MTY4ODY5N10sWy4zNjI2ODM3ODMzNzgzNjIsLjM2MjY4Mzc4MzM3ODM2MiwuMzEzNzA2NjQ1ODc3ODg3MjcsLjMxMzcwNjY0NTg3Nzg4NzI3LC4yMjIzODEwMzQ0NTMzNzQ0OCwuMjIyMzgxMDM0NDUzMzc0NDgsLjEwMTIyODUzNjI5MDM3NjI2LC4xMDEyMjg1MzYyOTAzNzYyNl0sWy4zMzAyMzkzNTUwMDEyNTk4LC4xODA2NDgxNjA2OTQ4NTc0LC4xODA2NDgxNjA2OTQ4NTc0LC4wODEyNzQzODgzNjE1NzQ0MSwuMDgxMjc0Mzg4MzYxNTc0NDEsLjMxMjM0NzA3NzA0MDAwMjg2LC4zMTIzNDcwNzcwNDAwMDI4NiwuMjYwNjEwNjk2NDAyOTM1NDQsLjI2MDYxMDY5NjQwMjkzNTQ0XSxbLjI5NTUyNDIyNDcxNDc1Mjg3LC4yOTU1MjQyMjQ3MTQ3NTI4NywuMjY5MjY2NzE5MzA5OTk2MzUsLjI2OTI2NjcxOTMwOTk5NjM1LC4yMTkwODYzNjI1MTU5ODIwNCwuMjE5MDg2MzYyNTE1OTgyMDQsLjE0OTQ1MTM0OTE1MDU4MDYsLjE0OTQ1MTM0OTE1MDU4MDYsLjA2NjY3MTM0NDMwODY4ODE0LC4wNjY2NzEzNDQzMDg2ODgxNF0sWy4yNzI5MjUwODY3Nzc5MDA2LC4yNjI4MDQ1NDQ1MTAyNDY2NSwuMjYyODA0NTQ0NTEwMjQ2NjUsLjIzMzE5Mzc2NDU5MTk5MDQ4LC4yMzMxOTM3NjQ1OTE5OTA0OCwuMTg2MjkwMjEwOTI3NzM0MjYsLjE4NjI5MDIxMDkyNzczNDI2LC4xMjU1ODAzNjk0NjQ5MDQ2LC4xMjU1ODAzNjk0NjQ5MDQ2LC4wNTU2Njg1NjcxMTYxNzM2NiwuMDU1NjY4NTY3MTE2MTczNjZdLFsuMjQ5MTQ3MDQ1ODEzNDAyNzcsLjI0OTE0NzA0NTgxMzQwMjc3LC4yMzM0OTI1MzY1MzgzNTQ4LC4yMzM0OTI1MzY1MzgzNTQ4LC4yMDMxNjc0MjY3MjMwNjU5MiwuMjAzMTY3NDI2NzIzMDY1OTIsLjE2MDA3ODMyODU0MzM0NjIyLC4xNjAwNzgzMjg1NDMzNDYyMiwuMTA2OTM5MzI1OTk1MzE4NDMsLjEwNjkzOTMyNTk5NTMxODQzLC4wNDcxNzUzMzYzODY1MTE4MywuMDQ3MTc1MzM2Mzg2NTExODNdLFsuMjMyNTUxNTUzMjMwODczOSwuMjI2MjgzMTgwMjYyODk3MjMsLjIyNjI4MzE4MDI2Mjg5NzIzLC4yMDc4MTYwNDc1MzY4ODg1LC4yMDc4MTYwNDc1MzY4ODg1LC4xNzgxNDU5ODA3NjE5NDU3NCwuMTc4MTQ1OTgwNzYxOTQ1NzQsLjEzODg3MzUxMDIxOTc4NzI1LC4xMzg4NzM1MTAyMTk3ODcyNSwuMDkyMTIxNDk5ODM3NzI4NDUsLjA5MjEyMTQ5OTgzNzcyODQ1LC4wNDA0ODQwMDQ3NjUzMTU4OCwuMDQwNDg0MDA0NzY1MzE1ODhdLFsuMjE1MjYzODUzNDYzMTU3OCwuMjE1MjYzODUzNDYzMTU3OCwuMjA1MTk4NDYzNzIxMjk1NiwuMjA1MTk4NDYzNzIxMjk1NiwuMTg1NTM4Mzk3NDc3OTM3ODIsLjE4NTUzODM5NzQ3NzkzNzgyLC4xNTcyMDMxNjcxNTgxOTM1NSwuMTU3MjAzMTY3MTU4MTkzNTUsLjEyMTUxODU3MDY4NzkwMzE5LC4xMjE1MTg1NzA2ODc5MDMxOSwuMDgwMTU4MDg3MTU5NzYwMjEsLjA4MDE1ODA4NzE1OTc2MDIxLC4wMzUxMTk0NjAzMzE3NTE4NiwuMDM1MTE5NDYwMzMxNzUxODZdLFsuMjAyNTc4MjQxOTI1NTYxMywuMTk4NDMxNDg1MzI3MTExNTgsLjE5ODQzMTQ4NTMyNzExMTU4LC4xODYxNjEwMDAwMTU1NjIyLC4xODYxNjEwMDAwMTU1NjIyLC4xNjYyNjkyMDU4MTY5OTM5MiwuMTY2MjY5MjA1ODE2OTkzOTIsLjEzOTU3MDY3NzkyNjE1NDMyLC4xMzk1NzA2Nzc5MjYxNTQzMiwuMTA3MTU5MjIwNDY3MTcxOTQsLjEwNzE1OTIyMDQ2NzE3MTk0LC4wNzAzNjYwNDc0ODgxMDgxMiwuMDcwMzY2MDQ3NDg4MTA4MTIsLjAzMDc1MzI0MTk5NjExNzI3LC4wMzA3NTMyNDE5OTYxMTcyN10sWy4xODk0NTA2MTA0NTUwNjg1LC4xODk0NTA2MTA0NTUwNjg1LC4xODI2MDM0MTUwNDQ5MjM1OCwuMTgyNjAzNDE1MDQ0OTIzNTgsLjE2OTE1NjUxOTM5NTAwMjU0LC4xNjkxNTY1MTkzOTUwMDI1NCwuMTQ5NTk1OTg4ODE2NTc2NzQsLjE0OTU5NTk4ODgxNjU3Njc0LC4xMjQ2Mjg5NzEyNTU1MzM4OCwuMTI0NjI4OTcxMjU1NTMzODgsLjA5NTE1ODUxMTY4MjQ5Mjc5LC4wOTUxNTg1MTE2ODI0OTI3OSwuMDYyMjUzNTIzOTM4NjQ3ODk0LC4wNjIyNTM1MjM5Mzg2NDc4OTQsLjAyNzE1MjQ1OTQxMTc1NDA5NiwuMDI3MTUyNDU5NDExNzU0MDk2XSxbLjE3OTQ0NjQ3MDM1NjIwNjUzLC4xNzY1NjI3MDUzNjY5OTI2NCwuMTc2NTYyNzA1MzY2OTkyNjQsLjE2ODAwNDEwMjE1NjQ1MDA0LC4xNjgwMDQxMDIxNTY0NTAwNCwuMTU0MDQ1NzYxMDc2ODEwMjgsLjE1NDA0NTc2MTA3NjgxMDI4LC4xMzUxMzYzNjg0Njg1MjU0OCwuMTM1MTM2MzY4NDY4NTI1NDgsLjExMTg4Mzg0NzE5MzQwMzk3LC4xMTE4ODM4NDcxOTM0MDM5NywuMDg1MDM2MTQ4MzE3MTc5MTgsLjA4NTAzNjE0ODMxNzE3OTE4LC4wNTU0NTk1MjkzNzM5ODcyLC4wNTU0NTk1MjkzNzM5ODcyLC4wMjQxNDgzMDI4Njg1NDc5MywuMDI0MTQ4MzAyODY4NTQ3OTNdLFsuMTY5MTQyMzgyOTYzMTQzNiwuMTY5MTQyMzgyOTYzMTQzNiwuMTY0Mjc2NDgzNzQ1ODMyNzMsLjE2NDI3NjQ4Mzc0NTgzMjczLC4xNTQ2ODQ2NzUxMjYyNjUyNCwuMTU0Njg0Njc1MTI2MjY1MjQsLjE0MDY0MjkxNDY3MDY1MDY1LC4xNDA2NDI5MTQ2NzA2NTA2NSwuMTIyNTU1MjA2NzExNDc4NDYsLjEyMjU1NTIwNjcxMTQ3ODQ2LC4xMDA5NDIwNDQxMDYyODcxNywuMTAwOTQyMDQ0MTA2Mjg3MTcsLjA3NjQyNTczMDI1NDg4OTA1LC4wNzY0MjU3MzAyNTQ4ODkwNSwuMDQ5NzE0NTQ4ODk0OTY5OCwuMDQ5NzE0NTQ4ODk0OTY5OCwuMDIxNjE2MDEzNTI2NDgzMzEsLjAyMTYxNjAxMzUyNjQ4MzMxXSxbLjE2MTA1NDQ0OTg0ODc4MzcsLjE1ODk2ODg0MzM5Mzk1NDM0LC4xNTg5Njg4NDMzOTM5NTQzNCwuMTUyNzY2MDQyMDY1ODU5NjcsLjE1Mjc2NjA0MjA2NTg1OTY3LC4xNDI2MDY3MDIxNzM2MDY2LC4xNDI2MDY3MDIxNzM2MDY2LC4xMjg3NTM5NjI1MzkzMzYyMSwuMTI4NzUzOTYyNTM5MzM2MjEsLjExMTU2NjY0NTU0NzMzMzk5LC4xMTE1NjY2NDU1NDczMzM5OSwuMDkxNDkwMDIxNjIyNDUsLjA5MTQ5MDAyMTYyMjQ1LC4wNjkwNDQ1NDI3Mzc2NDEyMywuMDY5MDQ0NTQyNzM3NjQxMjMsLjA0NDgxNDIyNjc2NTY5OTYsLjA0NDgxNDIyNjc2NTY5OTYsLjAxOTQ2MTc4ODIyOTcyNjQ3OCwuMDE5NDYxNzg4MjI5NzI2NDc4XSxbLjE1Mjc1MzM4NzEzMDcyNTg0LC4xNTI3NTMzODcxMzA3MjU4NCwuMTQ5MTcyOTg2NDcyNjAzNzQsLjE0OTE3Mjk4NjQ3MjYwMzc0LC4xNDIwOTYxMDkzMTgzODIwNCwuMTQyMDk2MTA5MzE4MzgyMDQsLjEzMTY4ODYzODQ0OTE3NjY0LC4xMzE2ODg2Mzg0NDkxNzY2NCwuMTE4MTk0NTMxOTYxNTE4NDEsLjExODE5NDUzMTk2MTUxODQxLC4xMDE5MzAxMTk4MTcyNDA0NCwuMTAxOTMwMTE5ODE3MjQwNDQsLjA4MzI3Njc0MTU3NjcwNDc1LC4wODMyNzY3NDE1NzY3MDQ3NSwuMDYyNjcyMDQ4MzM0MTA5MDcsLjA2MjY3MjA0ODMzNDEwOTA3LC4wNDA2MDE0Mjk4MDAzODY5NCwuMDQwNjAxNDI5ODAwMzg2OTQsLjAxNzYxNDAwNzEzOTE1MjExOCwuMDE3NjE0MDA3MTM5MTUyMTE4XSxbLjE0NjA4MTEzMzY0OTY5MDQxLC4xNDQ1MjQ0MDM5ODk5NzAwNSwuMTQ0NTI0NDAzOTg5OTcwMDUsLjEzOTg4NzM5NDc5MTA3MzE1LC4xMzk4ODczOTQ3OTEwNzMxNSwuMTMyMjY4OTM4NjMzMzM3NDcsLjEzMjI2ODkzODYzMzMzNzQ3LC4xMjE4MzE0MTYwNTM3Mjg1MywuMTIxODMxNDE2MDUzNzI4NTMsLjEwODc5NzI5OTE2NzE0ODM4LC4xMDg3OTcyOTkxNjcxNDgzOCwuMDkzNDQ0NDIzNDU2MDMzODYsLjA5MzQ0NDQyMzQ1NjAzMzg2LC4wNzYxMDAxMTM2MjgzNzkzLC4wNzYxMDAxMTM2MjgzNzkzLC4wNTcxMzQ0MjU0MjY4NTcyMDUsLjA1NzEzNDQyNTQyNjg1NzIwNSwuMDM2OTUzNzg5NzcwODUyNDk0LC4wMzY5NTM3ODk3NzA4NTI0OTQsLjAxNjAxNzIyODI1Nzc3NDMzNSwuMDE2MDE3MjI4MjU3Nzc0MzM1XSxbLjEzOTI1MTg3Mjg1NTYzMTk4LC4xMzkyNTE4NzI4NTU2MzE5OCwuMTM2NTQxNDk4MzQ2MDE1MTcsLjEzNjU0MTQ5ODM0NjAxNTE3LC4xMzExNzM1MDQ3ODcwNjIzOCwuMTMxMTczNTA0Nzg3MDYyMzgsLjEyMzI1MjM3NjgxMDUxMjQyLC4xMjMyNTIzNzY4MTA1MTI0MiwuMTEyOTMyMjk2MDgwNTM5MjIsLjExMjkzMjI5NjA4MDUzOTIyLC4xMDA0MTQxNDQ0NDI4ODA5NiwuMTAwNDE0MTQ0NDQyODgwOTYsLjA4NTk0MTYwNjIxNzA2NzczLC4wODU5NDE2MDYyMTcwNjc3MywuMDY5Nzk2NDY4NDI0NTIwNDksLjA2OTc5NjQ2ODQyNDUyMDQ5LC4wNTIyOTMzMzUxNTI2ODMyODYsLjA1MjI5MzMzNTE1MjY4MzI4NiwuMDMzNzc0OTAxNTg0ODE0MTUsLjAzMzc3NDkwMTU4NDgxNDE1LC4wMTQ2Mjc5OTUyOTgyNzIyLC4wMTQ2Mjc5OTUyOTgyNzIyXSxbLjEzMzY1NDU3MjE4NjEwNjE5LC4xMzI0NjIwMzk0MDQ2OTY2LC4xMzI0NjIwMzk0MDQ2OTY2LC4xMjg5MDU3MjIxODgwODIxNiwuMTI4OTA1NzIyMTg4MDgyMTYsLjEyMzA0OTA4NDMwNjcyOTUzLC4xMjMwNDkwODQzMDY3Mjk1MywuMTE0OTk2NjQwMjIyNDExMzYsLjExNDk5NjY0MDIyMjQxMTM2LC4xMDQ4OTIwOTE0NjQ1NDE0MSwuMTA0ODkyMDkxNDY0NTQxNDEsLjA5MjkxNTc2NjA2MDAzNTE1LC4wOTI5MTU3NjYwNjAwMzUxNSwuMDc5MjgxNDExNzc2NzE4OTUsLjA3OTI4MTQxMTc3NjcxODk1LC4wNjQyMzI0MjE0MDg1MjU4NSwuMDY0MjMyNDIxNDA4NTI1ODUsLjA0ODAzNzY3MTczMTA4NDY3LC4wNDgwMzc2NzE3MzEwODQ2NywuMDMwOTg4MDA1ODU2OTc5NDQ1LC4wMzA5ODgwMDU4NTY5Nzk0NDUsLjAxMzQxMTg1OTQ4NzE0MTc3MSwuMDEzNDExODU5NDg3MTQxNzcxXSxbLjEyNzkzODE5NTM0Njc1MjE2LC4xMjc5MzgxOTUzNDY3NTIxNiwuMTI1ODM3NDU2MzQ2ODI4MywuMTI1ODM3NDU2MzQ2ODI4MywuMTIxNjcwNDcyOTI3ODAzMzksLjEyMTY3MDQ3MjkyNzgwMzM5LC4xMTU1MDU2NjgwNTM3MjU2LC4xMTU1MDU2NjgwNTM3MjU2LC4xMDc0NDQyNzAxMTU5NjU2MywuMTA3NDQ0MjcwMTE1OTY1NjMsLjA5NzYxODY1MjEwNDExMzg4LC4wOTc2MTg2NTIxMDQxMTM4OCwuMDg2MTkwMTYxNTMxOTUzMjcsLjA4NjE5MDE2MTUzMTk1MzI3LC4wNzMzNDY0ODE0MTEwODAzLC4wNzMzNDY0ODE0MTEwODAzLC4wNTkyOTg1ODQ5MTU0MzY3OCwuMDU5Mjk4NTg0OTE1NDM2NzgsLjA0NDI3NzQzODgxNzQxOTgxLC4wNDQyNzc0Mzg4MTc0MTk4MSwuMDI4NTMxMzg4NjI4OTMzNjYzLC4wMjg1MzEzODg2Mjg5MzM2NjMsLjAxMjM0MTIyOTc5OTk4NzIsLjAxMjM0MTIyOTc5OTk4NzJdXSxNbj1bWzFdLFsxLDFdLFsxLDIsMV0sWzEsMywzLDFdXSx3bj0yKk1hdGguUEksYm49ZnVuY3Rpb24odCxuLGUscixpLGEsbyxzLGgpe3ZhciB1PU1hdGguc2luKGkqd24vMzYwKSxjPU1hdGguY29zKGkqd24vMzYwKSxmPWMqKHQtcykvMit1KihuLWgpLzIsbD0tdSoodC1zKS8yK2MqKG4taCkvMjtpZigwPT09ZiYmMD09PWwpcmV0dXJuW107aWYoMD09PWV8fDA9PT1yKXJldHVybltdO2U9TWF0aC5hYnMoZSkscj1NYXRoLmFicyhyKTt2YXIgcD1mKmYvKGUqZSkrbCpsLyhyKnIpO3A+MSYmKGUqPU1hdGguc3FydChwKSxyKj1NYXRoLnNxcnQocCkpO3ZhciB2PUModCxuLHMsaCxhLG8sZSxyLHUsYyksZz1bXSx4PXZbMl0seT12WzNdLGQ9TWF0aC5tYXgoTWF0aC5jZWlsKE1hdGguYWJzKHkpLyh3bi80KSksMSk7eS89ZDtmb3IodmFyIG09MDttPGQ7bSsrKWcucHVzaChTKHgseSkpLHgrPXk7cmV0dXJuIGcubWFwKGZ1bmN0aW9uKHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bis9Mil7dmFyIGk9dFtuKzBdLGE9dFtuKzFdO2kqPWUsYSo9cjt2YXIgbz1jKmktdSphLHM9dSppK2MqYTt0W24rMF09byt2WzBdLHRbbisxXT1zK3ZbMV19cmV0dXJuIHR9KX0sTG49ZnVuY3Rpb24odCxuLGUscixpLGEsbyxzLGgpe3JldHVybiBuZXcgWih0LG4sZSxyLGksYSxvLHMsaCl9O1oucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpaLGluaXQ6ZnVuY3Rpb24oKXt9LGdldFRvdGFsTGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RofSxnZXRQb2ludEF0TGVuZ3RoOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXM7dDwwP3Q9MDp0PnRoaXMubGVuZ3RoJiYodD10aGlzLmxlbmd0aCk7Zm9yKHZhciBlPXRoaXMucGFydGlhbExlbmd0aHMubGVuZ3RoLTE7dGhpcy5wYXJ0aWFsTGVuZ3Roc1tlXT49dCYmdGhpcy5wYXJ0aWFsTGVuZ3Roc1tlXT4wOyllLS07ZTx0aGlzLnBhcnRpYWxMZW5ndGhzLmxlbmd0aC0xJiZlKys7Zm9yKHZhciByPTAsaT0wO2k8ZTtpKyspcis9bi5wYXJ0aWFsTGVuZ3Roc1tpXTtyZXR1cm4gdGhpcy5jdXJ2ZXNbZV0uZ2V0UG9pbnRBdExlbmd0aCh0LXIpfSxnZXRUYW5nZW50QXRMZW5ndGg6ZnVuY3Rpb24odCl7dmFyIG49dGhpczt0PDA/dD0wOnQ+dGhpcy5sZW5ndGgmJih0PXRoaXMubGVuZ3RoKTtmb3IodmFyIGU9dGhpcy5wYXJ0aWFsTGVuZ3Rocy5sZW5ndGgtMTt0aGlzLnBhcnRpYWxMZW5ndGhzW2VdPj10JiZ0aGlzLnBhcnRpYWxMZW5ndGhzW2VdPjA7KWUtLTtlPHRoaXMucGFydGlhbExlbmd0aHMubGVuZ3RoLTEmJmUrKztmb3IodmFyIHI9MCxpPTA7aTxlO2krKylyKz1uLnBhcnRpYWxMZW5ndGhzW2ldO3JldHVybiB0aGlzLmN1cnZlc1tlXS5nZXRUYW5nZW50QXRMZW5ndGgodC1yKX0sZ2V0UHJvcGVydGllc0F0TGVuZ3RoOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuZ2V0VGFuZ2VudEF0TGVuZ3RoKHQpLGU9dGhpcy5nZXRQb2ludEF0TGVuZ3RoKHQpO3JldHVybnt4OmUueCx5OmUueSx0YW5nZW50WDpuLngsdGFuZ2VudFk6bi55fX19O3ZhciBBbj1mdW5jdGlvbih0LG4sZSxyKXtyZXR1cm4gbmV3IFQodCxuLGUscil9O1QucHJvdG90eXBlLmdldFRvdGFsTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyh0aGlzLngwLXRoaXMueDEsMikrTWF0aC5wb3codGhpcy55MC10aGlzLnkxLDIpKX0sVC5wcm90b3R5cGUuZ2V0UG9pbnRBdExlbmd0aD1mdW5jdGlvbih0KXt2YXIgbj10L01hdGguc3FydChNYXRoLnBvdyh0aGlzLngwLXRoaXMueDEsMikrTWF0aC5wb3codGhpcy55MC10aGlzLnkxLDIpKSxlPSh0aGlzLngxLXRoaXMueDApKm4scj0odGhpcy55MS10aGlzLnkwKSpuO3JldHVybnt4OnRoaXMueDArZSx5OnRoaXMueTArcn19LFQucHJvdG90eXBlLmdldFRhbmdlbnRBdExlbmd0aD1mdW5jdGlvbigpe3ZhciB0PU1hdGguc3FydCgodGhpcy54MS10aGlzLngwKSoodGhpcy54MS10aGlzLngwKSsodGhpcy55MS10aGlzLnkwKSoodGhpcy55MS10aGlzLnkwKSk7cmV0dXJue3g6KHRoaXMueDEtdGhpcy54MCkvdCx5Oih0aGlzLnkxLXRoaXMueTApL3R9fSxULnByb3RvdHlwZS5nZXRQcm9wZXJ0aWVzQXRMZW5ndGg9ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5nZXRQb2ludEF0TGVuZ3RoKHQpLGU9dGhpcy5nZXRUYW5nZW50QXRMZW5ndGgoKTtyZXR1cm57eDpuLngseTpuLnksdGFuZ2VudFg6ZS54LHRhbmdlbnRZOmUueX19O3ZhciBxbj1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKHQpe2lmKCF0KXJldHVybiBudWxsO2Zvcih2YXIgYSxvPWduKHQpLHM9WzAsMF0saD1bMCwwXSx1PTA7dTxvLmxlbmd0aDt1KyspIk0iPT09b1t1XVswXT8ocz1bb1t1XVsxXSxvW3VdWzJdXSxpLnB1c2gobnVsbCkpOiJtIj09PW9bdV1bMF0/KHM9W29bdV1bMV0rc1swXSxvW3VdWzJdK3NbMV1dLGkucHVzaChudWxsKSk6IkwiPT09b1t1XVswXT8oZSs9TWF0aC5zcXJ0KE1hdGgucG93KHNbMF0tb1t1XVsxXSwyKStNYXRoLnBvdyhzWzFdLW9bdV1bMl0sMikpLGkucHVzaChuZXcgQW4oc1swXSxvW3VdWzFdLHNbMV0sb1t1XVsyXSkpLHM9W29bdV1bMV0sb1t1XVsyXV0pOiJsIj09PW9bdV1bMF0/KGUrPU1hdGguc3FydChNYXRoLnBvdyhvW3VdWzFdLDIpK01hdGgucG93KG9bdV1bMl0sMikpLGkucHVzaChuZXcgQW4oc1swXSxvW3VdWzFdK3NbMF0sc1sxXSxvW3VdWzJdK3NbMV0pKSxzPVtvW3VdWzFdK3NbMF0sb1t1XVsyXStzWzFdXSk6IkgiPT09b1t1XVswXT8oZSs9TWF0aC5hYnMoc1swXS1vW3VdWzFdKSxpLnB1c2gobmV3IEFuKHNbMF0sb1t1XVsxXSxzWzFdLHNbMV0pKSxzWzBdPW9bdV1bMV0pOiJoIj09PW9bdV1bMF0/KGUrPU1hdGguYWJzKG9bdV1bMV0pLGkucHVzaChuZXcgQW4oc1swXSxzWzBdK29bdV1bMV0sc1sxXSxzWzFdKSksc1swXT1vW3VdWzFdK3NbMF0pOiJWIj09PW9bdV1bMF0/KGUrPU1hdGguYWJzKHNbMV0tb1t1XVsxXSksaS5wdXNoKG5ldyBBbihzWzBdLHNbMF0sc1sxXSxvW3VdWzFdKSksc1sxXT1vW3VdWzFdKToidiI9PT1vW3VdWzBdPyhlKz1NYXRoLmFicyhvW3VdWzFdKSxpLnB1c2gobmV3IEFuKHNbMF0sc1swXSxzWzFdLHNbMV0rb1t1XVsxXSkpLHNbMV09b1t1XVsxXStzWzFdKToieiI9PT1vW3VdWzBdfHwiWiI9PT1vW3VdWzBdPyhlKz1NYXRoLnNxcnQoTWF0aC5wb3cob1swXVsxXS1zWzBdLDIpK01hdGgucG93KG9bMF1bMl0tc1sxXSwyKSksaS5wdXNoKG5ldyBBbihzWzBdLG9bMF1bMV0sc1sxXSxvWzBdWzJdKSkscz1bb1swXVsxXSxvWzBdWzJdXSk6IkMiPT09b1t1XVswXT8oYT1uZXcgeW4oc1swXSxzWzFdLG9bdV1bMV0sb1t1XVsyXSxvW3VdWzNdLG9bdV1bNF0sb1t1XVs1XSxvW3VdWzZdKSxlKz1hLmdldFRvdGFsTGVuZ3RoKCkscz1bb1t1XVs1XSxvW3VdWzZdXSxpLnB1c2goYSkpOiJjIj09PW9bdV1bMF0/KGE9bmV3IHluKHNbMF0sc1sxXSxzWzBdK29bdV1bMV0sc1sxXStvW3VdWzJdLHNbMF0rb1t1XVszXSxzWzFdK29bdV1bNF0sc1swXStvW3VdWzVdLHNbMV0rb1t1XVs2XSksZSs9YS5nZXRUb3RhbExlbmd0aCgpLHM9W29bdV1bNV0rc1swXSxvW3VdWzZdK3NbMV1dLGkucHVzaChhKSk6IlMiPT09b1t1XVswXT8oYT11PjAmJlsiQyIsImMiLCJTIiwicyJdLmluZGV4T2Yob1t1LTFdWzBdKT4tMT9uZXcgeW4oc1swXSxzWzFdLDIqc1swXS1vW3UtMV1bb1t1LTFdLmxlbmd0aC00XSwyKnNbMV0tb1t1LTFdW29bdS0xXS5sZW5ndGgtM10sb1t1XVsxXSxvW3VdWzJdLG9bdV1bM10sb1t1XVs0XSk6bmV3IHluKHNbMF0sc1sxXSxzWzBdLHNbMV0sb1t1XVsxXSxvW3VdWzJdLG9bdV1bM10sb1t1XVs0XSksZSs9YS5nZXRUb3RhbExlbmd0aCgpLHM9W29bdV1bM10sb1t1XVs0XV0saS5wdXNoKGEpKToicyI9PT1vW3VdWzBdPyhhPXU+MCYmWyJDIiwiYyIsIlMiLCJzIl0uaW5kZXhPZihvW3UtMV1bMF0pPi0xP25ldyB5bihzWzBdLHNbMV0sc1swXSthLmQueC1hLmMueCxzWzFdK2EuZC55LWEuYy55LHNbMF0rb1t1XVsxXSxzWzFdK29bdV1bMl0sc1swXStvW3VdWzNdLHNbMV0rb1t1XVs0XSk6bmV3IHluKHNbMF0sc1sxXSxzWzBdLHNbMV0sc1swXStvW3VdWzFdLHNbMV0rb1t1XVsyXSxzWzBdK29bdV1bM10sc1sxXStvW3VdWzRdKSxlKz1hLmdldFRvdGFsTGVuZ3RoKCkscz1bb1t1XVszXStzWzBdLG9bdV1bNF0rc1sxXV0saS5wdXNoKGEpKToiUSI9PT1vW3VdWzBdPyhhPW5ldyB5bihzWzBdLHNbMV0sb1t1XVsxXSxvW3VdWzJdLG9bdV1bM10sb1t1XVs0XSksZSs9YS5nZXRUb3RhbExlbmd0aCgpLGkucHVzaChhKSxzPVtvW3VdWzNdLG9bdV1bNF1dLGg9W29bdV1bMV0sb1t1XVsyXV0pOiJxIj09PW9bdV1bMF0/KGE9bmV3IHluKHNbMF0sc1sxXSxzWzBdK29bdV1bMV0sc1sxXStvW3VdWzJdLHNbMF0rb1t1XVszXSxzWzFdK29bdV1bNF0pLGUrPWEuZ2V0VG90YWxMZW5ndGgoKSxoPVtzWzBdK29bdV1bMV0sc1sxXStvW3VdWzJdXSxzPVtvW3VdWzNdK3NbMF0sb1t1XVs0XStzWzFdXSxpLnB1c2goYSkpOiJUIj09PW9bdV1bMF0/KGE9dT4wJiZbIlEiLCJxIiwiVCIsInQiXS5pbmRleE9mKG9bdS0xXVswXSk+LTE/bmV3IHluKHNbMF0sc1sxXSwyKnNbMF0taFswXSwyKnNbMV0taFsxXSxvW3VdWzFdLG9bdV1bMl0pOm5ldyBBbihzWzBdLG9bdV1bMV0sc1sxXSxvW3VdWzJdKSxpLnB1c2goYSksZSs9YS5nZXRUb3RhbExlbmd0aCgpLGg9WzIqc1swXS1oWzBdLDIqc1sxXS1oWzFdXSxzPVtvW3VdWzFdLG9bdV1bMl1dKToidCI9PT1vW3VdWzBdPyhhPXU+MCYmWyJRIiwicSIsIlQiLCJ0Il0uaW5kZXhPZihvW3UtMV1bMF0pPi0xP25ldyB5bihzWzBdLHNbMV0sMipzWzBdLWhbMF0sMipzWzFdLWhbMV0sc1swXStvW3VdWzFdLHNbMV0rb1t1XVsyXSk6bmV3IEFuKHNbMF0sc1swXStvW3VdWzFdLHNbMV0sc1sxXStvW3VdWzJdKSxlKz1hLmdldFRvdGFsTGVuZ3RoKCksaD1bMipzWzBdLWhbMF0sMipzWzFdLWhbMV1dLHM9W29bdV1bMV0rc1swXSxvW3VdWzJdK3NbMF1dLGkucHVzaChhKSk6IkEiPT09b1t1XVswXT8oYT1uZXcgTG4oc1swXSxzWzFdLG9bdV1bMV0sb1t1XVsyXSxvW3VdWzNdLG9bdV1bNF0sb1t1XVs1XSxvW3VdWzZdLG9bdV1bN10pLGUrPWEuZ2V0VG90YWxMZW5ndGgoKSxzPVtvW3VdWzZdLG9bdV1bN11dLGkucHVzaChhKSk6ImEiPT09b1t1XVswXSYmKGE9bmV3IExuKHNbMF0sc1sxXSxvW3VdWzFdLG9bdV1bMl0sb1t1XVszXSxvW3VdWzRdLG9bdV1bNV0sc1swXStvW3VdWzZdLHNbMV0rb1t1XVs3XSksZSs9YS5nZXRUb3RhbExlbmd0aCgpLHM9W3NbMF0rb1t1XVs2XSxzWzFdK29bdV1bN11dLGkucHVzaChhKSksci5wdXNoKGUpO3JldHVybiBufXZhciBlPTAscj1bXSxpPVtdO24uZ2V0VG90YWxMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sbi5nZXRQb2ludEF0TGVuZ3RoPWZ1bmN0aW9uKHQpe3ZhciBuPWEodCk7cmV0dXJuIGlbbi5pXS5nZXRQb2ludEF0TGVuZ3RoKG4uZnJhY3Rpb24pfSxuLmdldFRhbmdlbnRBdExlbmd0aD1mdW5jdGlvbih0KXt2YXIgbj1hKHQpO3JldHVybiBpW24uaV0uZ2V0VGFuZ2VudEF0TGVuZ3RoKG4uZnJhY3Rpb24pfSxuLmdldFByb3BlcnRpZXNBdExlbmd0aD1mdW5jdGlvbih0KXt2YXIgbj1hKHQpO3JldHVybiBpW24uaV0uZ2V0UHJvcGVydGllc0F0TGVuZ3RoKG4uZnJhY3Rpb24pfTt2YXIgYT1mdW5jdGlvbih0KXt0PDA/dD0wOnQ+ZSYmKHQ9ZSk7Zm9yKHZhciBuPXIubGVuZ3RoLTE7cltuXT49dCYmcltuXT4wOyluLS07cmV0dXJuIG4rKyx7ZnJhY3Rpb246dC1yW24tMV0saTpufX07cmV0dXJuIG4odCl9LGtuPSdBbGwgc2hhcGVzIG11c3QgYmUgc3VwcGxpZWQgYXMgYXJyYXlzIG9mIFt4LCB5XSBwb2ludHMgb3IgYW4gU1ZHIHBhdGggc3RyaW5nIChodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9TVkcvQXR0cmlidXRlL2QpLlxuRXhhbXBsZSB2YWxpZCB3YXlzIG9mIHN1cHBseWluZyBhIHNoYXBlIHdvdWxkIGJlOlxuW1swLCAwXSwgWzEwLCAwXSwgWzEwLCAxMF1dXG4iTTAsMCBMMTAsMCBMMTAsMTBaIlxuJyxQbj0iUG9seWdvbnMgbXVzdCBoYXZlIGF0IGxlYXN0IHRocmVlIHBvaW50cy4iLF9uPWZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlLHIsaSxhPXQubGVuZ3RoLG89MS8wLHM9MDtzPGE7cysrKSFmdW5jdGlvbihpKXtyPTAsbi5mb3JFYWNoKGZ1bmN0aW9uKG4sZSl7dmFyIG89Ryh0WyhpK2UpJWFdLG4pO3IrPW8qb30pLHI8byYmKG89cixlPWkpfShzKTtlJiYoaT10LnNwbGljZSgwLGUpLHQuc3BsaWNlLmFwcGx5KHQsW3QubGVuZ3RoLDBdLmNvbmNhdChpKSkpfSxFbj1mdW5jdGlvbih0LG4sZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciByPWUubWF4U2VnbWVudExlbmd0aDt2b2lkIDA9PT1yJiYocj0xMCk7dmFyIGk9ZS5zdHJpbmc7dm9pZCAwPT09aSYmKGk9ITApO3ZhciBhPUIodCxyKSxvPUIobixyKSxzPSQoYSxvLGkpO3JldHVybiFpfHwic3RyaW5nIiE9dHlwZW9mIHQmJiJzdHJpbmciIT10eXBlb2Ygbj9zOmZ1bmN0aW9uKGUpe3JldHVybiBlPDFlLTQmJiJzdHJpbmciPT10eXBlb2YgdD90OjEtZTwxZS00JiYic3RyaW5nIj09dHlwZW9mIG4/bjpzKGUpfX0sQ249SjtKLmRldmlhdGlvbj1mdW5jdGlvbih0LG4sZSxyKXt2YXIgaT1uJiZuLmxlbmd0aCxhPWk/blswXSplOnQubGVuZ3RoLG89TWF0aC5hYnMoa3QodCwwLGEsZSkpO2lmKGkpZm9yKHZhciBzPTAsaD1uLmxlbmd0aDtzPGg7cysrKXt2YXIgdT1uW3NdKmUsYz1zPGgtMT9uW3MrMV0qZTp0Lmxlbmd0aDtvLT1NYXRoLmFicyhrdCh0LHUsYyxlKSl9dmFyIGY9MDtmb3Iocz0wO3M8ci5sZW5ndGg7cys9Myl7dmFyIGw9cltzXSplLHA9cltzKzFdKmUsdj1yW3MrMl0qZTtmKz1NYXRoLmFicygodFtsXS10W3ZdKSoodFtwKzFdLXRbbCsxXSktKHRbbF0tdFtwXSkqKHRbdisxXS10W2wrMV0pKX1yZXR1cm4gMD09PW8mJjA9PT1mPzA6TWF0aC5hYnMoKGYtbykvbyl9LEouZmxhdHRlbj1mdW5jdGlvbih0KXtmb3IodmFyIG49dFswXVswXS5sZW5ndGgsZT17dmVydGljZXM6W10saG9sZXM6W10sZGltZW5zaW9uczpufSxyPTAsaT0wO2k8dC5sZW5ndGg7aSsrKXtmb3IodmFyIGE9MDthPHRbaV0ubGVuZ3RoO2ErKylmb3IodmFyIG89MDtvPG47bysrKWUudmVydGljZXMucHVzaCh0W2ldW2FdW29dKTtpPjAmJihyKz10W2ktMV0ubGVuZ3RoLGUuaG9sZXMucHVzaChyKSl9cmV0dXJuIGV9O3ZhciBTbj1mdW5jdGlvbih0KXtyZXR1cm4gdH0sWm49ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gU247dmFyIG4sZSxyPXQuc2NhbGVbMF0saT10LnNjYWxlWzFdLGE9dC50cmFuc2xhdGVbMF0sbz10LnRyYW5zbGF0ZVsxXTtyZXR1cm4gZnVuY3Rpb24odCxzKXtzfHwobj1lPTApO3ZhciBoPTIsdT10Lmxlbmd0aCxjPW5ldyBBcnJheSh1KTtmb3IoY1swXT0obis9dFswXSkqcithLGNbMV09KGUrPXRbMV0pKmkrbztoPHU7KWNbaF09dFtoXSwrK2g7cmV0dXJuIGN9fSxUbj1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZSxyPXQubGVuZ3RoLGk9ci1uO2k8LS1yOyllPXRbaV0sdFtpKytdPXRbcl0sdFtyXT1lfSxGbj1mdW5jdGlvbih0LG4pe3JldHVybiJHZW9tZXRyeUNvbGxlY3Rpb24iPT09bi50eXBlP3t0eXBlOiJGZWF0dXJlQ29sbGVjdGlvbiIsZmVhdHVyZXM6bi5nZW9tZXRyaWVzLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gUHQodCxuKX0pfTpQdCh0LG4pfSx6bj1mdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGUobil7dmFyIGUscj10LmFyY3NbbjwwP35uOm5dLGk9clswXTtyZXR1cm4gdC50cmFuc2Zvcm0/KGU9WzAsMF0sci5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbMF0rPXRbMF0sZVsxXSs9dFsxXX0pKTplPXJbci5sZW5ndGgtMV0sbjwwP1tlLGldOltpLGVdfWZ1bmN0aW9uIHIodCxuKXtmb3IodmFyIGUgaW4gdCl7dmFyIHI9dFtlXTtkZWxldGUgbltyLnN0YXJ0XSxkZWxldGUgci5zdGFydCxkZWxldGUgci5lbmQsci5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lbdDwwP350OnRdPTF9KSxzLnB1c2gocil9fXZhciBpPXt9LGE9e30sbz17fSxzPVtdLGg9LTE7cmV0dXJuIG4uZm9yRWFjaChmdW5jdGlvbihlLHIpe3ZhciBpLGE9dC5hcmNzW2U8MD9+ZTplXTthLmxlbmd0aDwzJiYhYVsxXVswXSYmIWFbMV1bMV0mJihpPW5bKytoXSxuW2hdPWUsbltyXT1pKX0pLG4uZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgbixyLGk9ZSh0KSxzPWlbMF0saD1pWzFdO2lmKG49b1tzXSlpZihkZWxldGUgb1tuLmVuZF0sbi5wdXNoKHQpLG4uZW5kPWgscj1hW2hdKXtkZWxldGUgYVtyLnN0YXJ0XTt2YXIgdT1yPT09bj9uOm4uY29uY2F0KHIpO2FbdS5zdGFydD1uLnN0YXJ0XT1vW3UuZW5kPXIuZW5kXT11fWVsc2UgYVtuLnN0YXJ0XT1vW24uZW5kXT1uO2Vsc2UgaWYobj1hW2hdKWlmKGRlbGV0ZSBhW24uc3RhcnRdLG4udW5zaGlmdCh0KSxuLnN0YXJ0PXMscj1vW3NdKXtkZWxldGUgb1tyLmVuZF07dmFyIGM9cj09PW4/bjpyLmNvbmNhdChuKTthW2Muc3RhcnQ9ci5zdGFydF09b1tjLmVuZD1uLmVuZF09Y31lbHNlIGFbbi5zdGFydF09b1tuLmVuZF09bjtlbHNlIG49W3RdLGFbbi5zdGFydD1zXT1vW24uZW5kPWhdPW59KSxyKG8sYSkscihhLG8pLG4uZm9yRWFjaChmdW5jdGlvbih0KXtpW3Q8MD9+dDp0XXx8cy5wdXNoKFt0XSl9KSxzfSxqbj1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZT0wLHI9dC5sZW5ndGg7ZTxyOyl7dmFyIGk9ZStyPj4+MTt0W2ldPG4/ZT1pKzE6cj1pfXJldHVybiBlfSxJbj1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKHQsbil7dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Q8MCYmKHQ9fnQpO3ZhciBlPWlbdF07ZT9lLnB1c2gobik6aVt0XT1bbl19KX1mdW5jdGlvbiBlKHQsZSl7dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe24odCxlKX0pfWZ1bmN0aW9uIHIodCxuKXsiR2VvbWV0cnlDb2xsZWN0aW9uIj09PXQudHlwZT90Lmdlb21ldHJpZXMuZm9yRWFjaChmdW5jdGlvbih0KXtyKHQsbil9KTp0LnR5cGUgaW4gbyYmb1t0LnR5cGVdKHQuYXJjcyxuKX12YXIgaT17fSxhPXQubWFwKGZ1bmN0aW9uKCl7cmV0dXJuW119KSxvPXtMaW5lU3RyaW5nOm4sTXVsdGlMaW5lU3RyaW5nOmUsUG9seWdvbjplLE11bHRpUG9seWdvbjpmdW5jdGlvbih0LG4pe3QuZm9yRWFjaChmdW5jdGlvbih0KXtlKHQsbil9KX19O3QuZm9yRWFjaChyKTtmb3IodmFyIHMgaW4gaSlmb3IodmFyIGg9aVtzXSx1PWgubGVuZ3RoLGM9MDtjPHU7KytjKWZvcih2YXIgZj1jKzE7Zjx1OysrZil7dmFyIGwscD1oW2NdLHY9aFtmXTsobD1hW3BdKVtzPWpuKGwsdildIT09diYmbC5zcGxpY2UocywwLHYpLChsPWFbdl0pW3M9am4obCxwKV0hPT1wJiZsLnNwbGljZShzLDAscCl9cmV0dXJuIGF9LE5uPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHQ8bj8tMTp0Pm4/MTp0Pj1uPzA6TmFOfSxYbj1mdW5jdGlvbih0KXtyZXR1cm4gMT09PXQubGVuZ3RoJiYodD1TdCh0KSkse2xlZnQ6ZnVuY3Rpb24obixlLHIsaSl7Zm9yKG51bGw9PXImJihyPTApLG51bGw9PWkmJihpPW4ubGVuZ3RoKTtyPGk7KXt2YXIgYT1yK2k+Pj4xO3QoblthXSxlKTwwP3I9YSsxOmk9YX1yZXR1cm4gcn0scmlnaHQ6ZnVuY3Rpb24obixlLHIsaSl7Zm9yKG51bGw9PXImJihyPTApLG51bGw9PWkmJihpPW4ubGVuZ3RoKTtyPGk7KXt2YXIgYT1yK2k+Pj4xO3QoblthXSxlKT4wP2k9YTpyPWErMX1yZXR1cm4gcn19fSxZbj1YbihObiksVm49KFluLnJpZ2h0LE1hdGguc3FydCg1MCksTWF0aC5zcXJ0KDEwKSxNYXRoLnNxcnQoMiksZnVuY3Rpb24odCxuKXtyZXR1cm4gVHQoWnQoRnQodCksdCksbil9KSxHbj1mdW5jdGlvbih0LG4pe3ZhciBlPXQubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBuLm1hcChmdW5jdGlvbihuKXtyZXR1cm4ganQodCxuKX0pfSk7enQodCxuLGUpO3JldHVybiB0Lmxlbmd0aD44P3QubWFwKGZ1bmN0aW9uKHQsbil7cmV0dXJuIG59KTp6dCh0LG4sZSl9O3QuaW50ZXJwb2xhdGU9RW4sdC5zZXBhcmF0ZT1JdCx0LmNvbWJpbmU9TnQsdC5zcGxpdFBhdGhTdHJpbmc9SSx0LnRvUGF0aFN0cmluZz1qLHQuZnJvbUNpcmNsZT1YdCx0LnRvQ2lyY2xlPVl0LHQuZnJvbVJlY3Q9VnQsdC50b1JlY3Q9R3QsT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfSk7Cg=="></script>
</head>
<body style="background-color:white;">
<h3>
<a href="https://github.com/veltman/flubber">Flubbered</a>
(thx <a href="https://noahveltman.com/">Noah Veltman</a>)
Sunburst
</h3>
<div class="sunburst html-widget" id="htmlwidget-47f613d47c12a72ce1e3" style="width:960px;height:500px; position:relative;">
<div>
<div class="sunburst-main">
<div class="sunburst-sequence"></div>
<div class="sunburst-chart">
<div class="sunburst-explanation" style="visibility:hidden;"></div>
</div>
</div>
<div class="sunburst-sidebar">
<input type="checkbox" class="sunburst-togglelegend">Legend</input>
<div class="sunburst-legend" style="visibility:hidden;"></div>
</div>
</div>
</div>
<script type="application/json" data-for="htmlwidget-47f613d47c12a72ce1e3">{"x":{"data":{"children":[{"name":"d3","children":[{"name":"d3-array","children":[{"name":"threshold","children":[{"name":"freedmanDiaconis.js","size":361,"colname":"X4"},{"name":"scott.js","size":180,"colname":"X4"},{"name":"sturges.js","size":96,"colname":"X4"}],"colname":"X3"},{"name":"array.js","children":[],"size":90,"colname":"X3"},{"name":"ascending.js","children":[],"size":86,"colname":"X3"},{"name":"bisect.js","children":[],"size":238,"colname":"X3"},{"name":"bisector.js","children":[],"size":786,"colname":"X3"},{"name":"constant.js","children":[],"size":72,"colname":"X3"},{"name":"descending.js","children":[],"size":86,"colname":"X3"},{"name":"deviation.js","children":[],"size":135,"colname":"X3"},{"name":"extent.js","children":[],"size":553,"colname":"X3"},{"name":"histogram.js","children":[],"size":1876,"colname":"X3"},{"name":"identity.js","children":[],"size":43,"colname":"X3"},{"name":"max.js","children":[],"size":451,"colname":"X3"},{"name":"mean.js","children":[],"size":362,"colname":"X3"},{"name":"median.js","children":[],"size":452,"colname":"X3"},{"name":"merge.js","children":[],"size":339,"colname":"X3"},{"name":"min.js","children":[],"size":451,"colname":"X3"},{"name":"number.js","children":[],"size":63,"colname":"X3"},{"name":"pairs.js","children":[],"size":182,"colname":"X3"},{"name":"permute.js","children":[],"size":161,"colname":"X3"},{"name":"quantile.js","children":[],"size":416,"colname":"X3"},{"name":"range.js","children":[],"size":344,"colname":"X3"},{"name":"scan.js","children":[],"size":357,"colname":"X3"},{"name":"shuffle.js","children":[],"size":285,"colname":"X3"},{"name":"sum.js","children":[],"size":295,"colname":"X3"},{"name":"ticks.js","children":[],"size":672,"colname":"X3"},{"name":"transpose.js","children":[],"size":356,"colname":"X3"},{"name":"variance.js","children":[],"size":540,"colname":"X3"},{"name":"zip.js","children":[],"size":99,"colname":"X3"}],"colname":"X2"},{"name":"d3-axis","children":[{"name":"array.js","children":[],"size":42,"colname":"X3"},{"name":"axis.js","children":[],"size":5239,"colname":"X3"},{"name":"identity.js","children":[],"size":43,"colname":"X3"}],"colname":"X2"},{"name":"d3-brush","children":[{"name":"brush.js","children":[],"size":15778,"colname":"X3"},{"name":"constant.js","children":[],"size":72,"colname":"X3"},{"name":"event.js","children":[],"size":127,"colname":"X3"},{"name":"noevent.js","children":[],"size":202,"colname":"X3"}],"colname":"X2"},{"name":"d3-chord","children":[{"name":"array.js","children":[],"size":42,"colname":"X3"},{"name":"chord.js","children":[],"size":3178,"colname":"X3"},{"name":"constant.js","children":[],"size":72,"colname":"X3"},{"name":"math.js","children":[],"size":159,"colname":"X3"},{"name":"ribbon.js","children":[],"size":2340,"colname":"X3"}],"colname":"X2"},{"name":"d3-collection","children":[{"name":"entries.js","children":[],"size":137,"colname":"X3"},{"name":"keys.js","children":[],"size":104,"colname":"X3"},{"name":"map.js","children":[],"size":1988,"colname":"X3"},{"name":"nest.js","children":[],"size":2021,"colname":"X3"},{"name":"set.js","children":[],"size":800,"colname":"X3"},{"name":"values.js","children":[],"size":115,"colname":"X3"}],"colname":"X2"},{"name":"d3-color","children":[{"name":"color.js","children":[],"size":9276,"colname":"X3"},{"name":"cubehelix.js","children":[],"size":1855,"colname":"X3"},{"name":"define.js","children":[],"size":340,"colname":"X3"},{"name":"lab.js","children":[],"size":3167,"colname":"X3"},{"name":"math.js","children":[],"size":72,"colname":"X3"}],"colname":"X2"},{"name":"d3-dispatch","children":[{"name":"dispatch.js","children":[],"size":2729,"colname":"X3"}],"colname":"X2"},{"name":"d3-drag","children":[{"name":"constant.js","children":[],"size":72,"colname":"X3"},{"name":"drag.js","children":[],"size":4297,"colname":"X3"},{"name":"event.js","children":[],"size":430,"colname":"X3"},{"name":"nodrag.js","children":[],"size":857,"colname":"X3"},{"name":"noevent.js","children":[],"size":202,"colname":"X3"}],"colname":"X2"},{"name":"d3-dsv","children":[{"name":"csv.js","children":[],"size":199,"colname":"X3"},{"name":"dsv.js","children":[],"size":3582,"colname":"X3"},{"name":"tsv.js","children":[],"size":200,"colname":"X3"}],"colname":"X2"},{"name":"d3-ease","children":[{"name":"back.js","children":[],"size":653,"colname":"X3"},{"name":"bounce.js","children":[],"size":521,"colname":"X3"},{"name":"circle.js","children":[],"size":261,"colname":"X3"},{"name":"cubic.js","children":[],"size":210,"colname":"X3"},{"name":"elastic.js","children":[],"size":1309,"colname":"X3"},{"name":"exp.js","children":[],"size":251,"colname":"X3"},{"name":"linear.js","children":[],"size":43,"colname":"X3"},{"name":"poly.js","children":[],"size":596,"colname":"X3"},{"name":"quad.js","children":[],"size":192,"colname":"X3"},{"name":"sin.js","children":[],"size":236,"colname":"X3"}],"colname":"X2"},{"name":"d3-force","children":[{"name":"center.js","children":[],"size":654,"colname":"X3"},{"name":"collide.js","children":[],"size":2447,"colname":"X3"},{"name":"constant.js","children":[],"size":72,"colname":"X3"},{"name":"jiggle.js","children":[],"size":69,"colname":"X3"},{"name":"link.js","children":[],"size":3213,"colname":"X3"},{"name":"manyBody.js","children":[],"size":3181,"colname":"X3"},{"name":"simulation.js","children":[],"size":3444,"colname":"X3"},{"name":"x.js","children":[],"size":1030,"colname":"X3"},{"name":"y.js","children":[],"size":1030,"colname":"X3"}],"colname":"X2"},{"name":"d3-format","children":[{"name":"defaultLocale.js","children":[],"size":361,"colname":"X3"},{"name":"exponent.js","children":[],"size":134,"colname":"X3"},{"name":"formatDecimal.js","children":[],"size":656,"colname":"X3"},{"name":"formatDefault.js","children":[],"size":368,"colname":"X3"},{"name":"formatGroup.js","children":[],"size":475,"colname":"X3"},{"name":"formatPrefixAuto.js","children":[],"size":611,"colname":"X3"},{"name":"formatRounded.js","children":[],"size":458,"colname":"X3"},{"name":"formatSpecifier.js","children":[],"size":1589,"colname":"X3"},{"name":"formatTypes.js","children":[],"size":846,"colname":"X3"},{"name":"locale.js","children":[],"size":5247,"colname":"X3"},{"name":"precisionFixed.js","children":[],"size":119,"colname":"X3"},{"name":"precisionPrefix.js","children":[],"size":190,"colname":"X3"},{"name":"precisionRound.js","children":[],"size":186,"colname":"X3"}],"colname":"X2"},{"name":"d3-geo","children":[{"name":"clip","children":[{"name":"antimeridian.js","size":2897,"colname":"X4"},{"name":"buffer.js","size":470,"colname":"X4"},{"name":"circle.js","size":5956,"colname":"X4"},{"name":"extent.js","size":5527,"colname":"X4"},{"name":"index.js","size":3813,"colname":"X4"},{"name":"line.js","size":1099,"colname":"X4"},{"name":"polygon.js","size":2802,"colname":"X4"}],"colname":"X3"},{"name":"path","children":[{"name":"area.js","size":945,"colname":"X4"},{"name":"bounds.js","size":485,"colname":"X4"},{"name":"centroid.js","size":2033,"colname":"X4"},{"name":"context.js","size":914,"colname":"X4"},{"name":"index.js","size":1690,"colname":"X4"},{"name":"string.js","size":1149,"colname":"X4"}],"colname":"X3"},{"name":"projection","children":[{"name":"albers.js","size":235,"colname":"X4"},{"name":"albersUsa.js","size":3986,"colname":"X4"},{"name":"azimuthal.js","size":502,"colname":"X4"},{"name":"azimuthalEqualArea.js","size":447,"colname":"X4"},{"name":"azimuthalEquidistant.js","size":443,"colname":"X4"},{"name":"conic.js","size":402,"colname":"X4"},{"name":"conicConformal.js","size":1017,"colname":"X4"},{"name":"conicEqualArea.js","size":871,"colname":"X4"},{"name":"conicEquidistant.js","size":771,"colname":"X4"},{"name":"cylindricalEqualArea.js","size":314,"colname":"X4"},{"name":"equirectangular.js","size":253,"colname":"X4"},{"name":"fit.js","size":910,"colname":"X4"},{"name":"gnomonic.js","size":387,"colname":"X4"},{"name":"identity.js","size":1922,"colname":"X4"},{"name":"index.js","size":3752,"colname":"X4"},{"name":"mercator.js","size":1119,"colname":"X4"},{"name":"orthographic.js","size":376,"colname":"X4"},{"name":"resample.js","size":3275,"colname":"X4"},{"name":"stereographic.js","size":436,"colname":"X4"},{"name":"transverseMercator.js","size":762,"colname":"X4"}],"colname":"X3"},{"name":"adder.js","children":[],"size":906,"colname":"X3"},{"name":"area.js","children":[],"size":1958,"colname":"X3"},{"name":"bounds.js","children":[],"size":5361,"colname":"X3"},{"name":"cartesian.js","children":[],"size":929,"colname":"X3"},{"name":"centroid.js","children":[],"size":3816,"colname":"X3"},{"name":"circle.js","children":[],"size":2373,"colname":"X3"},{"name":"compose.js","children":[],"size":250,"colname":"X3"},{"name":"constant.js","children":[],"size":72,"colname":"X3"},{"name":"distance.js","children":[],"size":229,"colname":"X3"},{"name":"graticule.js","children":[],"size":3034,"colname":"X3"},{"name":"identity.js","children":[],"size":43,"colname":"X3"},{"name":"interpolate.js","children":[],"size":911,"colname":"X3"},{"name":"length.js","children":[],"size":1309,"colname":"X3"},{"name":"math.js","children":[],"size":880,"colname":"X3"},{"name":"noop.js","children":[],"size":34,"colname":"X3"},{"name":"pointEqual.js","children":[],"size":139,"colname":"X3"},{"name":"polygonContains.js","children":[],"size":2491,"colname":"X3"},{"name":"rotation.js","children":[],"size":2509,"colname":"X3"},{"name":"stream.js","children":[],"size":2305,"colname":"X3"},{"name":"transform.js","children":[],"size":701,"colname":"X3"}],"colname":"X2"},{"name":"d3-hierarchy","children":[{"name":"hierarchy","children":[{"name":"ancestors.js","size":138,"colname":"X4"},{"name":"descendants.js","size":121,"colname":"X4"},{"name":"each.js","size":381,"colname":"X4"},{"name":"eachAfter.js","size":353,"colname":"X4"},{"name":"eachBefore.js","size":282,"colname":"X4"},{"name":"index.js","size":1819,"colname":"X4"},{"name":"leaves.js","size":164,"colname":"X4"},{"name":"links.js","size":246,"colname":"X4"},{"name":"path.js","size":606,"colname":"X4"},{"name":"sort.js","size":151,"colname":"X4"},{"name":"sum.js","size":264,"colname":"X4"}],"colname":"X3"},{"name":"pack","children":[{"name":"enclose.js","size":2452,"colname":"X4"},{"name":"index.js","size":1917,"colname":"X4"},{"name":"shuffle.js","size":389,"colname":"X4"},{"name":"siblings.js","size":3497,"colname":"X4"}],"colname":"X3"},{"name":"treemap","children":[{"name":"binary.js","size":1184,"colname":"X4"},{"name":"dice.js","size":309,"colname":"X4"},{"name":"index.js","size":2810,"colname":"X4"},{"name":"resquarify.js","size":1029,"colname":"X4"},{"name":"round.js","size":166,"colname":"X4"},{"name":"slice.js","size":309,"colname":"X4"},{"name":"sliceDice.js","size":170,"colname":"X4"},{"name":"squarify.js","size":1868,"colname":"X4"}],"colname":"X3"},{"name":"accessors.js","children":[],"size":166,"colname":"X3"},{"name":"cluster.js","children":[],"size":2093,"colname":"X3"},{"name":"constant.js","children":[],"size":120,"colname":"X3"},{"name":"partition.js","children":[],"size":1266,"colname":"X3"},{"name":"stratify.js","children":[],"size":1934,"colname":"X3"},{"name":"tree.js","children":[],"size":7060,"colname":"X3"}],"colname":"X2"},{"name":"d3-interpolate","children":[{"name":"transform","children":[{"name":"decompose.js","size":672,"colname":"X4"},{"name":"index.js","size":2064,"colname":"X4"},{"name":"parse.js","size":980,"colname":"X4"}],"colname":"X3"},{"name":"array.js","children":[],"size":372,"colname":"X3"},{"name":"basis.js","children":[],"size":600,"colname":"X3"},{"name":"basisClosed.js","children":[],"size":360,"colname":"X3"},{"name":"color.js","children":[],"size":697,"colname":"X3"},{"name":"constant.js","children":[],"size":72,"colname":"X3"},{"name":"cubehelix.js","children":[],"size":760,"colname":"X3"},{"name":"date.js","children":[],"size":134,"colname":"X3"},{"name":"hcl.js","children":[],"size":547,"colname":"X3"},{"name":"hsl.js","children":[],"size":547,"colname":"X3"},{"name":"lab.js","children":[],"size":447,"colname":"X3"},{"name":"number.js","children":[],"size":100,"colname":"X3"},{"name":"object.js","children":[],"size":390,"colname":"X3"},{"name":"quantize.js","children":[],"size":163,"colname":"X3"},{"name":"rgb.js","children":[],"size":1277,"colname":"X3"},{"name":"round.js","children":[],"size":112,"colname":"X3"},{"name":"string.js","children":[],"size":1758,"colname":"X3"},{"name":"value.js","children":[],"size":598,"colname":"X3"},{"name":"zoom.js","children":[],"size":1387,"colname":"X3"}],"colname":"X2"},{"name":"d3-path","children":[{"name":"path.js","children":[],"size":4089,"colname":"X3"}],"colname":"X2"},{"name":"d3-polygon","children":[{"name":"area.js","children":[],"size":243,"colname":"X3"},{"name":"centroid.js","children":[],"size":346,"colname":"X3"},{"name":"contains.js","children":[],"size":411,"colname":"X3"},{"name":"cross.js","children":[],"size":402,"colname":"X3"},{"name":"hull.js","children":[],"size":1710,"colname":"X3"},{"name":"length.js","children":[],"size":375,"colname":"X3"}],"colname":"X2"},{"name":"d3-quadtree","children":[{"name":"add.js","children":[],"size":2441,"colname":"X3"},{"name":"cover.js","children":[],"size":1667,"colname":"X3"},{"name":"data.js","children":[],"size":170,"colname":"X3"},{"name":"extent.js","children":[],"size":206,"colname":"X3"},{"name":"find.js","children":[],"size":1696,"colname":"X3"},{"name":"quad.js","children":[],"size":134,"colname":"X3"},{"name":"quadtree.js","children":[],"size":2077,"colname":"X3"},{"name":"remove.js","children":[],"size":1898,"colname":"X3"},{"name":"root.js","children":[],"size":51,"colname":"X3"},{"name":"size.js","children":[],"size":155,"colname":"X3"},{"name":"visit.js","children":[],"size":695,"colname":"X3"},{"name":"visitAfter.js","children":[],"size":773,"colname":"X3"},{"name":"x.js","children":[],"size":138,"colname":"X3"},{"name":"y.js","children":[],"size":138,"colname":"X3"}],"colname":"X2"},{"name":"d3-queue","children":[{"name":"array.js","children":[],"size":29,"colname":"X3"},{"name":"queue.js","children":[],"size":2870,"colname":"X3"}],"colname":"X2"},{"name":"d3-random","children":[{"name":"bates.js","children":[],"size":168,"colname":"X3"},{"name":"exponential.js","children":[],"size":113,"colname":"X3"},{"name":"irwinHall.js","children":[],"size":137,"colname":"X3"},{"name":"logNormal.js","children":[],"size":178,"colname":"X3"},{"name":"normal.js","children":[],"size":503,"colname":"X3"},{"name":"uniform.js","children":[],"size":236,"colname":"X3"}],"colname":"X2"},{"name":"d3-request","children":[{"name":"csv.js","children":[],"size":101,"colname":"X3"},{"name":"dsv.js","children":[],"size":517,"colname":"X3"},{"name":"html.js","children":[],"size":157,"colname":"X3"},{"name":"json.js","children":[],"size":127,"colname":"X3"},{"name":"request.js","children":[],"size":4593,"colname":"X3"},{"name":"text.js","children":[],"size":109,"colname":"X3"},{"name":"tsv.js","children":[],"size":118,"colname":"X3"},{"name":"type.js","children":[],"size":370,"colname":"X3"},{"name":"xml.js","children":[],"size":174,"colname":"X3"}],"colname":"X2"},{"name":"d3-scale","children":[{"name":"array.js","children":[],"size":90,"colname":"X3"},{"name":"band.js","children":[],"size":2637,"colname":"X3"},{"name":"category10.js","children":[],"size":119,"colname":"X3"},{"name":"category20.js","children":[],"size":179,"colname":"X3"},{"name":"category20b.js","children":[],"size":179,"colname":"X3"},{"name":"category20c.js","children":[],"size":179,"colname":"X3"},{"name":"colors.js","children":[],"size":101,"colname":"X3"},{"name":"constant.js","children":[],"size":72,"colname":"X3"},{"name":"continuous.js","children":[],"size":3328,"colname":"X3"},{"name":"cubehelix.js","children":[],"size":188,"colname":"X3"},{"name":"identity.js","children":[],"size":463,"colname":"X3"},{"name":"linear.js","children":[],"size":1206,"colname":"X3"},{"name":"log.js","children":[],"size":3273,"colname":"X3"},{"name":"nice.js","children":[],"size":340,"colname":"X3"},{"name":"number.js","children":[],"size":44,"colname":"X3"},{"name":"ordinal.js","children":[],"size":1116,"colname":"X3"},{"name":"pow.js","children":[],"size":1000,"colname":"X3"},{"name":"quantile.js","children":[],"size":1280,"colname":"X3"},{"name":"quantize.js","children":[],"size":1066,"colname":"X3"},{"name":"rainbow.js","children":[],"size":536,"colname":"X3"},{"name":"sequential.js","children":[],"size":717,"colname":"X3"},{"name":"threshold.js","children":[],"size":802,"colname":"X3"},{"name":"tickFormat.js","children":[],"size":1203,"colname":"X3"},{"name":"time.js","children":[],"size":4565,"colname":"X3"},{"name":"utcTime.js","children":[],"size":379,"colname":"X3"},{"name":"viridis.js","children":[],"size":6471,"colname":"X3"}],"colname":"X2"},{"name":"d3-selection","children":[{"name":"selection","children":[{"name":"append.js","size":235,"colname":"X4"},{"name":"attr.js","size":1460,"colname":"X4"},{"name":"call.js","size":134,"colname":"X4"},{"name":"classed.js","size":1740,"colname":"X4"},{"name":"data.js","size":3597,"colname":"X4"},{"name":"datum.js","size":132,"colname":"X4"},{"name":"dispatch.js","size":869,"colname":"X4"},{"name":"each.js","size":289,"colname":"X4"},{"name":"empty.js","size":53,"colname":"X4"},{"name":"enter.js","size":792,"colname":"X4"},{"name":"exit.js","size":176,"colname":"X4"},{"name":"filter.js","size":546,"colname":"X4"},{"name":"html.js","size":520,"colname":"X4"},{"name":"index.js","size":2216,"colname":"X4"},{"name":"insert.js","size":468,"colname":"X4"},{"name":"lower.js","size":171,"colname":"X4"},{"name":"merge.js","size":575,"colname":"X4"},{"name":"node.js","size":258,"colname":"X4"},{"name":"nodes.js","size":140,"colname":"X4"},{"name":"on.js","size":3119,"colname":"X4"},{"name":"order.js","size":367,"colname":"X4"},{"name":"property.js","size":617,"colname":"X4"},{"name":"raise.js","size":138,"colname":"X4"},{"name":"remove.js","size":153,"colname":"X4"},{"name":"select.js","size":653,"colname":"X4"},{"name":"selectAll.js","size":550,"colname":"X4"},{"name":"size.js","size":98,"colname":"X4"},{"name":"sort.js","size":681,"colname":"X4"},{"name":"sparse.js","size":71,"colname":"X4"},{"name":"style.js","size":889,"colname":"X4"},{"name":"text.js","size":528,"colname":"X4"}],"colname":"X3"},{"name":"constant.js","children":[],"size":72,"colname":"X3"},{"name":"creator.js","children":[],"size":662,"colname":"X3"},{"name":"local.js","children":[],"size":536,"colname":"X3"},{"name":"matcher.js","children":[],"size":533,"colname":"X3"},{"name":"mouse.js","children":[],"size":224,"colname":"X3"},{"name":"namespace.js","children":[],"size":303,"colname":"X3"},{"name":"namespaces.js","children":[],"size":254,"colname":"X3"},{"name":"point.js","children":[],"size":448,"colname":"X3"},{"name":"select.js","children":[],"size":259,"colname":"X3"},{"name":"selectAll.js","children":[],"size":282,"colname":"X3"},{"name":"selector.js","children":[],"size":152,"colname":"X3"},{"name":"selectorAll.js","children":[],"size":171,"colname":"X3"},{"name":"sourceEvent.js","children":[],"size":175,"colname":"X3"},{"name":"touch.js","children":[],"size":407,"colname":"X3"},{"name":"touches.js","children":[],"size":323,"colname":"X3"},{"name":"window.js","children":[],"size":218,"colname":"X3"}],"colname":"X2"},{"name":"d3-shape","children":[{"name":"curve","children":[{"name":"basis.js","size":1436,"colname":"X4"},{"name":"basisClosed.js","size":1530,"colname":"X4"},{"name":"basisOpen.js","size":1069,"colname":"X4"},{"name":"bundle.js","size":1081,"colname":"X4"},{"name":"cardinal.js","size":1633,"colname":"X4"},{"name":"cardinalClosed.js","size":1605,"colname":"X4"},{"name":"cardinalOpen.js","size":1288,"colname":"X4"},{"name":"catmullRom.js","size":2637,"colname":"X4"},{"name":"catmullRomClosed.js","size":2083,"colname":"X4"},{"name":"catmullRomOpen.js","size":1760,"colname":"X4"},{"name":"linear.js","size":738,"colname":"X4"},{"name":"linearClosed.js","size":514,"colname":"X4"},{"name":"monotone.js","size":3203,"colname":"X4"},{"name":"natural.js","size":1761,"colname":"X4"},{"name":"radial.js","size":655,"colname":"X4"},{"name":"step.js","size":1367,"colname":"X4"}],"colname":"X3"},{"name":"offset","children":[{"name":"expand.js","size":319,"colname":"X4"},{"name":"none.js","size":310,"colname":"X4"},{"name":"silhouette.js","size":314,"colname":"X4"},{"name":"wiggle.js","size":740,"colname":"X4"}],"colname":"X3"},{"name":"order","children":[{"name":"ascending.js","size":305,"colname":"X4"},{"name":"descending.js","size":112,"colname":"X4"},{"name":"insideOut.js","size":545,"colname":"X4"},{"name":"none.js","size":120,"colname":"X4"},{"name":"reverse.js","size":97,"colname":"X4"}],"colname":"X3"},{"name":"symbol","children":[{"name":"circle.js","size":186,"colname":"X4"},{"name":"cross.js","size":476,"colname":"X4"},{"name":"diamond.js","size":307,"colname":"X4"},{"name":"square.js","size":137,"colname":"X4"},{"name":"star.js","size":609,"colname":"X4"},{"name":"triangle.js","size":255,"colname":"X4"},{"name":"wye.js","size":733,"colname":"X4"}],"colname":"X3"},{"name":"arc.js","children":[],"size":8831,"colname":"X3"},{"name":"area.js","children":[],"size":2917,"colname":"X3"},{"name":"array.js","children":[],"size":42,"colname":"X3"},{"name":"constant.js","children":[],"size":81,"colname":"X3"},{"name":"descending.js","children":[],"size":86,"colname":"X3"},{"name":"identity.js","children":[],"size":43,"colname":"X3"},{"name":"line.js","children":[],"size":1516,"colname":"X3"},{"name":"math.js","children":[],"size":106,"colname":"X3"},{"name":"noop.js","children":[],"size":29,"colname":"X3"},{"name":"pie.js","children":[],"size":2336,"colname":"X3"},{"name":"point.js","children":[],"size":81,"colname":"X3"},{"name":"radialArea.js","children":[],"size":934,"colname":"X3"},{"name":"radialLine.js","children":[],"size":396,"colname":"X3"},{"name":"stack.js","children":[],"size":1432,"colname":"X3"},{"name":"symbol.js","children":[],"size":1160,"colname":"X3"}],"colname":"X2"},{"name":"d3-time-format","children":[{"name":"defaultLocale.js","children":[],"size":867,"colname":"X3"},{"name":"isoFormat.js","children":[],"size":284,"colname":"X3"},{"name":"isoParse.js","children":[],"size":319,"colname":"X3"},{"name":"locale.js","children":[],"size":13876,"colname":"X3"}],"colname":"X2"},{"name":"d3-time","children":[{"name":"day.js","children":[],"size":462,"colname":"X3"},{"name":"duration.js","children":[],"size":164,"colname":"X3"},{"name":"hour.js","children":[],"size":569,"colname":"X3"},{"name":"interval.js","children":[],"size":1845,"colname":"X3"},{"name":"millisecond.js","children":[],"size":668,"colname":"X3"},{"name":"minute.js","children":[],"size":437,"colname":"X3"},{"name":"month.js","children":[],"size":414,"colname":"X3"},{"name":"second.js","children":[],"size":440,"colname":"X3"},{"name":"utcDay.js","children":[],"size":397,"colname":"X3"},{"name":"utcHour.js","children":[],"size":399,"colname":"X3"},{"name":"utcMinute.js","children":[],"size":412,"colname":"X3"},{"name":"utcMonth.js","children":[],"size":453,"colname":"X3"},{"name":"utcWeek.js","children":[],"size":979,"colname":"X3"},{"name":"utcYear.js","children":[],"size":808,"colname":"X3"},{"name":"week.js","children":[],"size":963,"colname":"X3"},{"name":"year.js","children":[],"size":754,"colname":"X3"}],"colname":"X2"},{"name":"d3-timer","children":[{"name":"interval.js","children":[],"size":400,"colname":"X3"},{"name":"timeout.js","children":[],"size":250,"colname":"X3"},{"name":"timer.js","children":[],"size":2771,"colname":"X3"}],"colname":"X2"},{"name":"d3-transition","children":[{"name":"selection","children":[{"name":"index.js","size":245,"colname":"X4"},{"name":"interrupt.js","size":138,"colname":"X4"},{"name":"transition.js","size":1090,"colname":"X4"}],"colname":"X3"},{"name":"transition","children":[{"name":"attr.js","size":2473,"colname":"X4"},{"name":"attrTween.js","size":904,"colname":"X4"},{"name":"delay.js","size":510,"colname":"X4"},{"name":"duration.js","size":528,"colname":"X4"},{"name":"ease.js","size":348,"colname":"X4"},{"name":"filter.js","size":574,"colname":"X4"},{"name":"index.js","size":1892,"colname":"X4"},{"name":"interpolate.js","size":340,"colname":"X4"},{"name":"merge.js","size":653,"colname":"X4"},{"name":"on.js","size":853,"colname":"X4"},{"name":"remove.js","size":284,"colname":"X4"},{"name":"schedule.js","size":4792,"colname":"X4"},{"name":"select.js","size":826,"colname":"X4"},{"name":"selectAll.js","size":883,"colname":"X4"},{"name":"selection.js","size":174,"colname":"X4"},{"name":"style.js","size":2119,"colname":"X4"},{"name":"styleTween.js","size":607,"colname":"X4"},{"name":"text.js","size":473,"colname":"X4"},{"name":"transition.js","size":691,"colname":"X4"},{"name":"tween.js","size":2026,"colname":"X4"}],"colname":"X3"},{"name":"active.js","children":[],"size":484,"colname":"X3"},{"name":"interrupt.js","children":[],"size":665,"colname":"X3"}],"colname":"X2"},{"name":"d3-voronoi","children":[{"name":"Beach.js","children":[],"size":4381,"colname":"X3"},{"name":"Cell.js","children":[],"size":4087,"colname":"X3"},{"name":"Circle.js","children":[],"size":1632,"colname":"X3"},{"name":"constant.js","children":[],"size":72,"colname":"X3"},{"name":"Diagram.js","children":[],"size":3415,"colname":"X3"},{"name":"Edge.js","children":[],"size":3634,"colname":"X3"},{"name":"point.js","children":[],"size":81,"colname":"X3"},{"name":"RedBlackTree.js","children":[],"size":5302,"colname":"X3"},{"name":"voronoi.js","children":[],"size":1420,"colname":"X3"}],"colname":"X2"},{"name":"d3-zoom","children":[{"name":"constant.js","children":[],"size":72,"colname":"X3"},{"name":"event.js","children":[],"size":137,"colname":"X3"},{"name":"noevent.js","children":[],"size":202,"colname":"X3"},{"name":"transform.js","children":[],"size":1336,"colname":"X3"},{"name":"zoom.js","children":[],"size":12133,"colname":"X3"}],"colname":"X2"}],"colname":"X1"}],"name":"root"},"options":{"legendOrder":null,"colors":null,"valueField":"size","percent":true,"count":false,"explanation":null,"breadcrumb":[],"legend":[],"sortFunction":null},"tasks":["\nfunction(){\n var chart = this.instance.chart;\n var el = this.el;\n var svg = d3.select(el).select('.sunburst-chart>svg');\n\n chart.on('click.tree', function(d) {\n svg.selectAll('.tree')\n .transition()\n .style('opacity', 0.001)\n .remove();\n\n // interpolate to rect\n var cloned = d3.select(event.target.cloneNode(true));\n cloned\n .classed('tree', true)\n .attr('transform', svg.select('g').attr('transform'));\n svg.node().appendChild(cloned.node());\n \n\n var interpolator = flubber.interpolate(\n d3.select(event.target).attr('d'),\n [[0,0],[0,100],[100,100],[100,0],[0,0]]\n );\n cloned\n .transition()\n .duration(1500)\n .attrTween('d', function(){ return interpolator; })\n .attr('transform', 'translate(0,0)');\n\n //interpolate rect to tree with separate\n var hier = d3.hierarchy(d3.select(event.target).datum())\n .sum(function(d) {return d.data.size});\n if(hier.children) {\n var tree = d3.treemap().size([100,100])(hier);\n tree.children.map(function(d) {\n svg.append('rect')\n .classed('tree', true)\n .attr('transform', 'translate(' + d.x0 + ',' + d.y0 + ')')\n .attr('width', d.x1 - d.x0)\n .attr('height', d.y1 - d.y0)\n .style('stroke', 'white')\n .style('fill','none')\n .style('opacity',0.00001)\n .transition()\n .delay(100)\n .style('opacity',1)\n });\n }\n })\n}\n"]},"evals":["tasks.0"],"jsHooks":[]}</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment