Skip to content

Instantly share code, notes, and snippets.

@timelyportfolio
Last active December 10, 2021 02:30
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/55f054d1e2a47b8942d155ae05c4e84e to your computer and use it in GitHub Desktop.
Save timelyportfolio/55f054d1e2a47b8942d155ae05c4e84e to your computer and use it in GitHub Desktop.
vue and networkD3 in R
license: mit

combining htmlwidgets and Vue.js

As I work more with Vue.js, I am impressed and delighted. See this article comparing Vue and React well if you want a little more detail.

In this example, I wanted to try combining the element tree component with a networkD3 diagonalNetwork tree. Very simple, when you check the box the node circle fills with gray.

Please do not consider this best practice since I am still learning Vue.

code

library(htmltools)
library(vueR)

rhd <- treemap::random.hierarchical.data()
tl_tree <- tagList(
  tags$div(
    id = "app",
    tag(
      "el-tree",
      list(
        "ref" = "mytree",
        ":data" = "data.children",
        ":props" = "defaultProps",
        "show-checkbox" = NA,
        "@check-change" = "handleCheckChange"
      )
    ),
    tags$pre("{{checkedNodes.map(function(d){return d.name})}}")
  ),
  vue(
    list(
      el="#app",
      data = list(
        data = d3r::d3_nest(
          rhd,
          value_cols="x"
        ),
        defaultProps = list(
          'children' = 'children',
          'label' = 'name'
        ),
        checkedNodes = list()
      ),
      methods = list(
        handleCheckChange = htmlwidgets::JS(
          "
function(data, checked, indeterminate){
  //debugger;
  //data.checked = checked && !indeterminate;
  console.log(data, checked, indeterminate);
  this.checkedNodes = this.$refs.mytree.getCheckedNodes();
  this.$emit('tree-checked');
}
          "
        )
      )
    ),
    minified = FALSE
  )
)

browsable(
  attachDependencies(
    tl_tree,
    list(
      element
    )
  )
)


# add a d3 tree and make it respond to Vue tree
d3t <- networkD3::diagonalNetwork(
  jsonlite::fromJSON(
    d3r::d3_nest(
      rhd,
      value_cols="x"
    ),
    simplifyVector=FALSE,
    simplifyDataFrame=FALSE
  )
)
# use onRender to add event handling
d3t <- htmlwidgets::onRender(
  d3t,
"
function(el, x) {
  var vue_tree = HTMLWidgets.find('.vue').instance;
  vue_tree.$on(
    'tree-checked',
    function() {
      var myvue = this;
      var checkedNodes = myvue.checkedNodes.map(function(d){return d.name});
      var nodes = d3.select(el).selectAll('g.node');
      nodes.each(function(d) {
        if(checkedNodes.indexOf(d.data.name) >= 0){
          d3.select(this).select('circle').style('fill', 'gray');
        } else {
          d3.select(this).select('circle').style('fill', 'rgb(255,255,255)');
        };
      })
    }
  )
}
"
)
browsable(
  attachDependencies(
    tagList(
      tags$div(tl_tree,style="width:20%; float:left; display:block;"),
      tags$div(d3t,style="width:70%; float:left; display:block;")
    ),
    list(
      element
    )
  )
)
This file has been truncated, but you can view the full file.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgew0KICAvLyBJZiB3aW5kb3cuSFRNTFdpZGdldHMgaXMgYWxyZWFkeSBkZWZpbmVkLCB0aGVuIHVzZSBpdDsgb3RoZXJ3aXNlIGNyZWF0ZSBhDQogIC8vIG5ldyBvYmplY3QuIFRoaXMgYWxsb3dzIHByZWNlZGluZyBjb2RlIHRvIHNldCBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZQ0KICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLg0KICB3aW5kb3cuSFRNTFdpZGdldHMgPSB3aW5kb3cuSFRNTFdpZGdldHMgfHwge307DQoNCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLg0KICB2YXIgdmlld2VyTW9kZSA9IHdpbmRvdy5IVE1MV2lkZ2V0cy52aWV3ZXJNb2RlID0NCiAgICAgIC9cYnZpZXdlcl9wYW5lPTFcYi8udGVzdCh3aW5kb3cubG9jYXRpb24pOw0KDQogIC8vIFNlZSBpZiB3ZSdyZSBydW5uaW5nIGluIFNoaW55IG1vZGUuIElmIG5vdCwgaXQncyBhIHN0YXRpYyBkb2N1bWVudC4NCiAgLy8gTm90ZSB0aGF0IHN0YXRpYyB3aWRnZXRzIGNhbiBhcHBlYXIgaW4gYm90aCBTaGlueSBhbmQgc3RhdGljIG1vZGVzLCBidXQNCiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4NCiAgdmFyIHNoaW55TW9kZSA9IHdpbmRvdy5IVE1MV2lkZ2V0cy5zaGlueU1vZGUgPQ0KICAgICAgdHlwZW9mKHdpbmRvdy5TaGlueSkgIT09ICJ1bmRlZmluZWQiICYmICEhd2luZG93LlNoaW55Lm91dHB1dEJpbmRpbmdzOw0KDQogIC8vIFdlIGNhbid0IGNvdW50IG9uIGpRdWVyeSBiZWluZyBhdmFpbGFibGUsIHNvIHdlIGltcGxlbWVudCBvdXIgb3duDQogIC8vIHZlcnNpb24gaWYgbmVjZXNzYXJ5Lg0KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3Rvcikgew0KICAgIGlmICh0eXBlb2YoalF1ZXJ5KSAhPT0gInVuZGVmaW5lZCIgJiYgc2NvcGUgaW5zdGFuY2VvZiBqUXVlcnkpIHsNCiAgICAgIHJldHVybiBzY29wZS5maW5kKHNlbGVjdG9yKTsNCiAgICB9DQogICAgaWYgKHNjb3BlLnF1ZXJ5U2VsZWN0b3JBbGwpIHsNCiAgICAgIHJldHVybiBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsNCiAgICB9DQogIH0NCg0KICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7DQogICAgaWYgKHZhbHVlID09PSBudWxsKQ0KICAgICAgcmV0dXJuIFtdOw0KICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQ0KICAgICAgcmV0dXJuIHZhbHVlOw0KICAgIHJldHVybiBbdmFsdWVdOw0KICB9DQoNCiAgLy8gSW1wbGVtZW50IGpRdWVyeSdzIGV4dGVuZA0KICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7DQogICAgICByZXR1cm4gdGFyZ2V0Ow0KICAgIH0NCiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgew0KICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsNCiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7DQogICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHsNCiAgICAgICAgICB0YXJnZXRbcHJvcF0gPSBzb3VyY2VbcHJvcF07DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIHRhcmdldDsNCiAgfQ0KDQogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4NCiAgZnVuY3Rpb24gZm9yRWFjaCh2YWx1ZXMsIGNhbGxiYWNrLCB0aGlzQXJnKSB7DQogICAgaWYgKHZhbHVlcy5mb3JFYWNoKSB7DQogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7DQogICAgfSBlbHNlIHsNCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIC8vIFJlcGxhY2VzIHRoZSBzcGVjaWZpZWQgbWV0aG9kIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiBmdW5jU291cmNlLg0KICAvLw0KICAvLyBOb3RlIHRoYXQgZnVuY1NvdXJjZSBzaG91bGQgbm90IEJFIHRoZSBuZXcgbWV0aG9kLCBpdCBzaG91bGQgYmUgYSBmdW5jdGlvbg0KICAvLyB0aGF0IFJFVFVSTlMgdGhlIG5ldyBtZXRob2QuIGZ1bmNTb3VyY2UgcmVjZWl2ZXMgYSBzaW5nbGUgYXJndW1lbnQgdGhhdCBpcw0KICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4NCiAgLy8gbWV0aG9kIGNhbiBiZSBjYWxsZWQgbGlrZSBhIHJlZ3VsYXIgZnVuY3Rpb24sIGl0IGhhcyB0aGUgdGFyZ2V0IHBlcm1hbmVudGx5DQogIC8vIGJvdW5kIHRvIGl0IHNvICJ0aGlzIiB3aWxsIHdvcmsgY29ycmVjdGx5Lg0KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsNCiAgICB2YXIgc3VwZXJGdW5jID0gdGFyZ2V0W21ldGhvZE5hbWVdIHx8IGZ1bmN0aW9uKCkge307DQogICAgdmFyIHN1cGVyRnVuY0JvdW5kID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsNCiAgICB9Ow0KICAgIHRhcmdldFttZXRob2ROYW1lXSA9IGZ1bmNTb3VyY2Uoc3VwZXJGdW5jQm91bmQpOw0KICB9DQoNCiAgLy8gQWRkIGEgbWV0aG9kIHRvIGRlbGVnYXRvciB0aGF0LCB3aGVuIGludm9rZWQsIGNhbGxzDQogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbg0KICAvLyB0aGUgZGVsZWdhdGVlLCBidXQgdGhlcmUgd2FzIG9uZSBvbiBkZWxlZ2F0b3IgYmVmb3JlDQogIC8vIGRlbGVnYXRlTWV0aG9kIHdhcyBjYWxsZWQsIHRoZW4gdGhlIG9yaWdpbmFsIHZlcnNpb24NCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLg0KICAvLyBGb3IgZXhhbXBsZToNCiAgLy8NCiAgLy8gdmFyIGEgPSB7DQogIC8vICAgbWV0aG9kMTogZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKCdhMScpOyB9DQogIC8vICAgbWV0aG9kMjogZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKCdhMicpOyB9DQogIC8vIH07DQogIC8vIHZhciBiID0gew0KICAvLyAgIG1ldGhvZDE6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYjEnKTsgfQ0KICAvLyB9Ow0KICAvLyBkZWxlZ2F0ZU1ldGhvZChhLCBiLCAibWV0aG9kMSIpOw0KICAvLyBkZWxlZ2F0ZU1ldGhvZChhLCBiLCAibWV0aG9kMiIpOw0KICAvLyBhLm1ldGhvZDEoKTsNCiAgLy8gYS5tZXRob2QyKCk7DQogIC8vDQogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4NCiAgZnVuY3Rpb24gZGVsZWdhdGVNZXRob2QoZGVsZWdhdG9yLCBkZWxlZ2F0ZWUsIG1ldGhvZE5hbWUpIHsNCiAgICB2YXIgaW5oZXJpdGVkID0gZGVsZWdhdG9yW21ldGhvZE5hbWVdOw0KICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIHRhcmdldCA9IGRlbGVnYXRlZTsNCiAgICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZWVbbWV0aG9kTmFtZV07DQoNCiAgICAgIC8vIFRoZSBtZXRob2QgZG9lc24ndCBleGlzdCBvbiB0aGUgZGVsZWdhdGVlLiBJbnN0ZWFkLA0KICAgICAgLy8gY2FsbCB0aGUgbWV0aG9kIG9uIHRoZSBkZWxlZ2F0b3IsIGlmIGl0IGV4aXN0cy4NCiAgICAgIGlmICghbWV0aG9kKSB7DQogICAgICAgIHRhcmdldCA9IGRlbGVnYXRvcjsNCiAgICAgICAgbWV0aG9kID0gaW5oZXJpdGVkOw0KICAgICAgfQ0KDQogICAgICBpZiAobWV0aG9kKSB7DQogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOw0KICAgICAgfQ0KICAgIH07DQogIH0NCg0KICAvLyBJbXBsZW1lbnQgYSB2YWd1ZSBmYWNzaW1pbGllIG9mIGpRdWVyeSdzIGRhdGEgbWV0aG9kDQogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgew0KICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDIpIHsNCiAgICAgIHJldHVybiBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXTsNCiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgew0KICAgICAgZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV0gPSB2YWx1ZTsNCiAgICAgIHJldHVybiBlbDsNCiAgICB9IGVsc2Ugew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBlbGVtZW50RGF0YTogIiArDQogICAgICAgIGFyZ3VtZW50cy5sZW5ndGgpOw0KICAgIH0NCiAgfQ0KDQogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleA0KICBmdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyKSB7DQogICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bXC1cW1xdXC9ce1x9XChcKVwqXCtcP1wuXFxcXlwkXHxdL2csICJcXCQmIik7DQogIH0NCg0KICBmdW5jdGlvbiBoYXNDbGFzcyhlbCwgY2xhc3NOYW1lKSB7DQogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOw0KICAgIHJldHVybiByZS50ZXN0KGVsLmNsYXNzTmFtZSk7DQogIH0NCg0KICAvLyBlbGVtZW50cyAtIGFycmF5IChvciBhcnJheS1saWtlIG9iamVjdCkgb2YgSFRNTCBlbGVtZW50cw0KICAvLyBjbGFzc05hbWUgLSBjbGFzcyBuYW1lIHRvIHRlc3QgZm9yDQogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsNCiAgLy8gICBpZiBmYWxzZSwgb25seSByZXR1cm4gZWxlbWVudHMgKndpdGhvdXQqIGdpdmVuIGNsYXNzTmFtZQ0KICBmdW5jdGlvbiBmaWx0ZXJCeUNsYXNzKGVsZW1lbnRzLCBjbGFzc05hbWUsIGluY2x1ZGUpIHsNCiAgICB2YXIgcmVzdWx0cyA9IFtdOw0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCiAgICAgIGlmIChoYXNDbGFzcyhlbGVtZW50c1tpXSwgY2xhc3NOYW1lKSA9PSBpbmNsdWRlKQ0KICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOw0KICAgIH0NCiAgICByZXR1cm4gcmVzdWx0czsNCiAgfQ0KDQogIGZ1bmN0aW9uIG9uKG9iaiwgZXZlbnROYW1lLCBmdW5jKSB7DQogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZ1bmMsIGZhbHNlKTsNCiAgICB9IGVsc2UgaWYgKG9iai5hdHRhY2hFdmVudCkgew0KICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7DQogICAgfQ0KICB9DQoNCiAgZnVuY3Rpb24gb2ZmKG9iaiwgZXZlbnROYW1lLCBmdW5jKSB7DQogICAgaWYgKG9iai5yZW1vdmVFdmVudExpc3RlbmVyKQ0KICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7DQogICAgZWxzZSBpZiAob2JqLmRldGFjaEV2ZW50KSB7DQogICAgICBvYmouZGV0YWNoRXZlbnQoZXZlbnROYW1lLCBmdW5jKTsNCiAgICB9DQogIH0NCg0KICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aA0KICAvLyB0aGUgInBhZGRpbmciIENTUyBwcm9wZXJ0eQ0KICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvcGFkZGluZw0KICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7DQogICAgaWYgKHR5cGVvZih2YWx1ZSkgPT09ICJudW1iZXIiKQ0KICAgICAgdmFsdWUgPSBbdmFsdWVdOw0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzBdLCBib3R0b206IHZhbHVlWzBdLCBsZWZ0OiB2YWx1ZVswXX07DQogICAgfQ0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzFdLCBib3R0b206IHZhbHVlWzBdLCBsZWZ0OiB2YWx1ZVsxXX07DQogICAgfQ0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzFdLCBib3R0b206IHZhbHVlWzJdLCBsZWZ0OiB2YWx1ZVsxXX07DQogICAgfQ0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzFdLCBib3R0b206IHZhbHVlWzJdLCBsZWZ0OiB2YWx1ZVszXX07DQogICAgfQ0KICB9DQoNCiAgLy8gQ29udmVydCBhbiB1bnBhY2tlZCBwYWRkaW5nIG9iamVjdCB0byBhIENTUyB2YWx1ZQ0KICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgew0KICAgIHJldHVybiBwYWRkaW5nT2JqLnRvcCArICJweCAiICsgcGFkZGluZ09iai5yaWdodCArICJweCAiICsgcGFkZGluZ09iai5ib3R0b20gKyAicHggIiArIHBhZGRpbmdPYmoubGVmdCArICJweCI7DQogIH0NCg0KICAvLyBNYWtlcyBhIG51bWJlciBzdWl0YWJsZSBmb3IgQ1NTDQogIGZ1bmN0aW9uIHB4KHgpIHsNCiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikNCiAgICAgIHJldHVybiB4ICsgInB4IjsNCiAgICBlbHNlDQogICAgICByZXR1cm4geDsNCiAgfQ0KDQogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuDQogIC8vIFRoZSByZXR1cm4gdmFsdWUgaXMgZWl0aGVyIG51bGwsIG9yIGFuIG9iamVjdCB3aXRoIGZpbGwsIHBhZGRpbmcsDQogIC8vIGRlZmF1bHRXaWR0aCwgZGVmYXVsdEhlaWdodCBmaWVsZHMuDQogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgew0KICAgIHZhciBzaXppbmdFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtkYXRhLWZvcj0nIiArIGVsLmlkICsgIiddW3R5cGU9J2FwcGxpY2F0aW9uL2h0bWx3aWRnZXQtc2l6aW5nJ10iKTsNCiAgICBpZiAoIXNpemluZ0VsKQ0KICAgICAgcmV0dXJuIG51bGw7DQogICAgdmFyIHNwID0gSlNPTi5wYXJzZShzaXppbmdFbC50ZXh0Q29udGVudCB8fCBzaXppbmdFbC50ZXh0IHx8ICJ7fSIpOw0KICAgIGlmICh2aWV3ZXJNb2RlKSB7DQogICAgICByZXR1cm4gc3Audmlld2VyOw0KICAgIH0gZWxzZSB7DQogICAgICByZXR1cm4gc3AuYnJvd3NlcjsNCiAgICB9DQogIH0NCg0KICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLg0KICAvLyAgIEVhY2ggZWxlbWVudCBtdXN0IGJlIGEgdmFsaWQgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRoYXQgeWllbGRzIGENCiAgLy8gICBmdW5jdGlvbi4gT3IsIGNhbiBiZSBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggImNvZGUiIGFuZCAiZGF0YSINCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nDQogIC8vICAgb2YgSlMgdGhhdCdzIGFuIGV4cHIgdGhhdCB5aWVsZHMgYSBmdW5jdGlvbiwgYW5kICJkYXRhIiBzaG91bGQgYmUNCiAgLy8gICBhbiBvYmplY3QgdGhhdCB3aWxsIGJlIGFkZGVkIGFzIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgd2hlbiB0aGF0DQogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLg0KICAvLyBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3QgdGhhdCB3aWxsIGJlICJ0aGlzIiBmb3IgZWFjaCBmdW5jdGlvbg0KICAvLyAgIGV4ZWN1dGlvbi4NCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlDQogIC8vICAgc2FtZSBhcmd1bWVudHMgd2lsbCBiZSBwYXNzZWQgdG8gYWxsIGZ1bmN0aW9ucy4pDQogIGZ1bmN0aW9uIGV2YWxBbmRSdW4odGFza3MsIHRhcmdldCwgYXJncykgew0KICAgIGlmICh0YXNrcykgew0KICAgICAgZm9yRWFjaCh0YXNrcywgZnVuY3Rpb24odGFzaykgew0KICAgICAgICB2YXIgdGhlc2VBcmdzID0gYXJnczsNCiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsNCiAgICAgICAgICB0aGVzZUFyZ3MgPSB0aGVzZUFyZ3MuY29uY2F0KFt0YXNrLmRhdGFdKTsNCiAgICAgICAgICB0YXNrID0gdGFzay5jb2RlOw0KICAgICAgICB9DQogICAgICAgIHZhciB0YXNrRnVuYyA9IGV2YWwoIigiICsgdGFzayArICIpIik7DQogICAgICAgIGlmICh0eXBlb2YodGFza0Z1bmMpICE9PSAiZnVuY3Rpb24iKSB7DQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOw0KICAgICAgICB9DQogICAgICAgIHRhc2tGdW5jLmFwcGx5KHRhcmdldCwgdGhlc2VBcmdzKTsNCiAgICAgIH0pOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIGluaXRTaXppbmcoZWwpIHsNCiAgICB2YXIgc2l6aW5nID0gc2l6aW5nUG9saWN5KGVsKTsNCiAgICBpZiAoIXNpemluZykNCiAgICAgIHJldHVybjsNCg0KICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsNCiAgICBpZiAoIWNlbCkNCiAgICAgIHJldHVybjsNCg0KICAgIGlmICh0eXBlb2Yoc2l6aW5nLnBhZGRpbmcpICE9PSAidW5kZWZpbmVkIikgew0KICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5tYXJnaW4gPSAiMCI7DQogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOw0KICAgIH0NCg0KICAgIGlmIChzaXppbmcuZmlsbCkgew0KICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOw0KICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS53aWR0aCA9ICIxMDAlIjsNCiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOw0KICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLndpZHRoID0gIjEwMCUiOw0KICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmhlaWdodCA9ICIxMDAlIjsNCiAgICAgIGlmIChjZWwpIHsNCiAgICAgICAgY2VsLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsNCiAgICAgICAgdmFyIHBhZCA9IHVucGFja1BhZGRpbmcoc2l6aW5nLnBhZGRpbmcpOw0KICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7DQogICAgICAgIGNlbC5zdHlsZS5yaWdodCA9IHBhZC5yaWdodCArICJweCI7DQogICAgICAgIGNlbC5zdHlsZS5ib3R0b20gPSBwYWQuYm90dG9tICsgInB4IjsNCiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7DQogICAgICAgIGVsLnN0eWxlLndpZHRoID0gIjEwMCUiOw0KICAgICAgICBlbC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7DQogICAgICB9DQoNCiAgICAgIHJldHVybiB7DQogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwNCiAgICAgICAgZ2V0SGVpZ2h0OiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRIZWlnaHQ7IH0NCiAgICAgIH07DQoNCiAgICB9IGVsc2Ugew0KICAgICAgZWwuc3R5bGUud2lkdGggPSBweChzaXppbmcud2lkdGgpOw0KICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7DQoNCiAgICAgIHJldHVybiB7DQogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LA0KICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZWwub2Zmc2V0SGVpZ2h0OyB9DQogICAgICB9Ow0KICAgIH0NCiAgfQ0KDQogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzDQogIHZhciBkZWZhdWx0cyA9IHsNCiAgICBmaW5kOiBmdW5jdGlvbihzY29wZSkgew0KICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7DQogICAgfSwNCiAgICByZW5kZXJFcnJvcjogZnVuY3Rpb24oZWwsIGVycikgew0KICAgICAgdmFyICRlbCA9ICQoZWwpOw0KDQogICAgICB0aGlzLmNsZWFyRXJyb3IoZWwpOw0KDQogICAgICAvLyBBZGQgYWxsIHRoZXNlIGVycm9yIGNsYXNzZXMsIGFzIFNoaW55IGRvZXMNCiAgICAgIHZhciBlcnJDbGFzcyA9ICJzaGlueS1vdXRwdXQtZXJyb3IiOw0KICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7DQogICAgICAgIC8vIHVzZSB0aGUgY2xhc3NlcyBvZiB0aGUgZXJyb3IgY29uZGl0aW9uIGFzIENTUyBjbGFzcyBuYW1lcw0KICAgICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiAiICsgJC5tYXAoYXNBcnJheShlcnIudHlwZSksIGZ1bmN0aW9uKHR5cGUpIHsNCiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOw0KICAgICAgICB9KS5qb2luKCIgIik7DQogICAgICB9DQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7DQoNCiAgICAgIC8vIElzIGVsIGlubGluZSBvciBibG9jaz8gSWYgaW5saW5lIG9yIGlubGluZS1ibG9jaywganVzdCBkaXNwbGF5Om5vbmUgaXQNCiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLg0KICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuY3NzKCJkaXNwbGF5Iik7DQogICAgICAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiLCBkaXNwbGF5KTsNCg0KICAgICAgaWYgKGRpc3BsYXkgPT09ICJpbmxpbmUiIHx8IGRpc3BsYXkgPT09ICJpbmxpbmUtYmxvY2siKSB7DQogICAgICAgICRlbC5oaWRlKCk7DQogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsNCiAgICAgICAgICB2YXIgZXJyb3JTcGFuID0gJCgiPHNwYW4+IikuYWRkQ2xhc3MoZXJyQ2xhc3MpOw0KICAgICAgICAgIGVycm9yU3Bhbi50ZXh0KGVyci5tZXNzYWdlKTsNCiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsNCiAgICAgICAgfQ0KICAgICAgfSBlbHNlIGlmIChkaXNwbGF5ID09PSAiYmxvY2siKSB7DQogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlDQogICAgICAgIC8vIGVsLCBhbmQgcG9zaXRpb24gdGhlIGVycm9yIHRvIGJlIG9uIHRvcCBvZiB0aGUgZWwuDQogICAgICAgIC8vIE1hcmsgaXQgd2l0aCBhIHVuaXF1ZSBJRCBhbmQgQ1NTIGNsYXNzIHNvIHdlIGNhbiByZW1vdmUgaXQgbGF0ZXIuDQogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7DQogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsNCiAgICAgICAgICB2YXIgZXJyb3JEaXYgPSAkKCI8ZGl2PiIpLmFkZENsYXNzKGVyckNsYXNzKS5jc3MoInBvc2l0aW9uIiwgImFic29sdXRlIikNCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkNCiAgICAgICAgICAgIC5jc3MoImxlZnQiLCBlbC5vZmZzZXRMZWZ0KQ0KICAgICAgICAgICAgLy8gc2V0dGluZyB3aWR0aCBjYW4gcHVzaCBvdXQgdGhlIHBhZ2Ugc2l6ZSwgZm9yY2luZyBvdGhlcndpc2UNCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3INCiAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50IHRvIHNocmluazsgc28gdXNlIG1heC13aWR0aCBpbnN0ZWFkDQogICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQ0KICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsNCiAgICAgICAgICBlcnJvckRpdi50ZXh0KGVyci5tZXNzYWdlKTsNCiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JEaXYpOw0KDQogICAgICAgICAgLy8gUmVhbGx5IGR1bWIgd2F5IHRvIGtlZXAgdGhlIHNpemUvcG9zaXRpb24gb2YgdGhlIGVycm9yIGluIHN5bmMgd2l0aA0KICAgICAgICAgIC8vIHRoZSBwYXJlbnQgZWxlbWVudCBhcyB0aGUgd2luZG93IGlzIHJlc2l6ZWQgb3Igd2hhdGV2ZXIuDQogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBpZiAoIWVycm9yRGl2WzBdLnBhcmVudEVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRJZCk7DQogICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVycm9yRGl2DQogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkNCiAgICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpDQogICAgICAgICAgICAgIC5jc3MoIm1heFdpZHRoIiwgZWwub2Zmc2V0V2lkdGgpDQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7DQogICAgICAgICAgfSwgNTAwKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0sDQogICAgY2xlYXJFcnJvcjogZnVuY3Rpb24oZWwpIHsNCiAgICAgIHZhciAkZWwgPSAkKGVsKTsNCiAgICAgIHZhciBkaXNwbGF5ID0gJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIik7DQogICAgICAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiLCBudWxsKTsNCg0KICAgICAgaWYgKGRpc3BsYXkgPT09ICJpbmxpbmUiIHx8IGRpc3BsYXkgPT09ICJpbmxpbmUtYmxvY2siKSB7DQogICAgICAgIGlmIChkaXNwbGF5KQ0KICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsNCiAgICAgICAgJChlbC5uZXh0U2libGluZykuZmlsdGVyKCIuaHRtbHdpZGdldHMtZXJyb3IiKS5yZW1vdmUoKTsNCiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIil7DQogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOw0KICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOw0KICAgICAgfQ0KICAgIH0sDQogICAgc2l6aW5nOiB7fQ0KICB9Ow0KDQogIC8vIENhbGxlZCBieSB3aWRnZXQgYmluZGluZ3MgdG8gcmVnaXN0ZXIgYSBuZXcgdHlwZSBvZiB3aWRnZXQuIFRoZSBkZWZpbml0aW9uDQogIC8vIG9iamVjdCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6DQogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlDQogIC8vICAgdXNlZCBieSBkZWZhdWx0IGFzIHRoZSBDU1MgY2xhc3NuYW1lIHRvIGxvb2sgZm9yLg0KICAvLyAtIGluaXRpYWxpemUgKG9wdGlvbmFsKSAtIEEgZnVuY3Rpb24oZWwpIHRoYXQgd2lsbCBiZSBjYWxsZWQgb25jZSBwZXINCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkDQogIC8vICAgdmFsdWUgdG8gcmVuZGVyVmFsdWUuDQogIC8vIC0gcmVuZGVyVmFsdWUgKHJlcXVpcmVkKSAtIEEgZnVuY3Rpb24oZWwsIGRhdGEsIGluaXRWYWx1ZSkgdGhhdCB3aWxsIGJlDQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXINCiAgLy8gICBlbGVtZW50OyBTaGlueSBhcHBzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgcGVyDQogIC8vICAgZWxlbWVudCwgYXMgdGhlIGRhdGEgY2hhbmdlcy4NCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsNCiAgICBpZiAoIWRlZmluaXRpb24ubmFtZSkgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgbmFtZSIpOw0KICAgIH0NCiAgICBpZiAoIWRlZmluaXRpb24udHlwZSkgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgdHlwZSIpOw0KICAgIH0NCiAgICAvLyBDdXJyZW50bHkgd2Ugb25seSBzdXBwb3J0IG91dHB1dCB3aWRnZXRzDQogICAgaWYgKGRlZmluaXRpb24udHlwZSAhPT0gIm91dHB1dCIpIHsNCiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsNCiAgICB9DQogICAgLy8gVE9ETzogVmVyaWZ5IHRoYXQgLm5hbWUgaXMgYSB2YWxpZCBDU1MgY2xhc3NuYW1lDQoNCiAgICAvLyBTdXBwb3J0IG5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9ucy4gT2xkLXN0eWxlIGNsYXNzLWJvdW5kDQogICAgLy8gZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0ICJvYmplY3QiIHBlciB3aWRnZXQgcGVyIHR5cGUvY2xhc3Mgb2YNCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cw0KICAgIC8vIHRha2UgZWwgYW5kIGluc3RhbmNlIGFyZ3VtZW50cywgYmVjYXVzZSB0aGUgd2lkZ2V0IG9iamVjdCBjYW4ndA0KICAgIC8vIHN0b3JlIHRoZW0uIE5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9ucyBoYXZlIG9uZSB3aWRnZXQNCiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0DQogICAgLy8gcHJvdmlkZSByZW5kZXJWYWx1ZSBvciByZXNpemUgbWV0aG9kcyBhdCBhbGwsIGp1c3QgdGhlIHNpbmdsZSBtZXRob2QNCiAgICAvLyAgIGZhY3RvcnkoZWwsIHdpZHRoLCBoZWlnaHQpDQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4NCiAgICAvLyBUaGlzIGVuYWJsZXMgYSBmYXIgbW9yZSBuYXR1cmFsIHByb2dyYW1taW5nIHN0eWxlIGZvciB0aGUgd2lkZ2V0DQogICAgLy8gYXV0aG9yLCB3aG8gY2FuIHN0b3JlIHBlci1pbnN0YW5jZSBzdGF0ZSB1c2luZyBlaXRoZXIgT08tc3R5bGUNCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzDQogICAgLy8gaXMgaW4gY29udHJhc3QgdG8gd2hhdCBjYW4gb25seSBiZSBjYWxsZWQgQy1zdHlsZSBwc2V1ZG8tT08gd2hpY2ggaXMNCiAgICAvLyB3aGF0IHdlIHJlcXVpcmVkIGJlZm9yZSkuDQogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgew0KICAgICAgZGVmaW5pdGlvbiA9IGNyZWF0ZUxlZ2FjeURlZmluaXRpb25BZGFwdGVyKGRlZmluaXRpb24pOw0KICAgIH0NCg0KICAgIGlmICghZGVmaW5pdGlvbi5yZW5kZXJWYWx1ZSkgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgcmVuZGVyVmFsdWUgZnVuY3Rpb24iKTsNCiAgICB9DQoNCiAgICAvLyBGb3Igc3RhdGljIHJlbmRlcmluZyAobm9uLVNoaW55KSwgdXNlIGEgc2ltcGxlIHdpZGdldCByZWdpc3RyYXRpb24NCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28NCiAgICAvLyBjb250YWluIHN0YXRpYyB3aWRnZXRzLg0KICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzID0gd2luZG93LkhUTUxXaWRnZXRzLndpZGdldHMgfHwgW107DQogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLg0KICAgIHZhciBzdGF0aWNCaW5kaW5nID0gZXh0ZW5kKHt9LCBkZWZhdWx0cywgZGVmaW5pdGlvbik7DQogICAgb3ZlcnJpZGVNZXRob2Qoc3RhdGljQmluZGluZywgImZpbmQiLCBmdW5jdGlvbihzdXBlcmZ1bmMpIHsNCiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgew0KICAgICAgICB2YXIgcmVzdWx0cyA9IHN1cGVyZnVuYyhzY29wZSk7DQogICAgICAgIC8vIEZpbHRlciBvdXQgU2hpbnkgb3V0cHV0cywgd2Ugb25seSB3YW50IHRoZSBzdGF0aWMga2luZA0KICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOw0KICAgICAgfTsNCiAgICB9KTsNCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOw0KDQogICAgaWYgKHNoaW55TW9kZSkgew0KICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4NCiAgICAgIC8vIFRoZSBkZWZpbml0aW9uIGl0c2VsZiB3aWxsIG5vdCBiZSB0aGUgb3V0cHV0IGJpbmRpbmcsIGluc3RlYWQNCiAgICAgIC8vIHdlIHdpbGwgbWFrZSBhbiBvdXRwdXQgYmluZGluZyBvYmplY3QgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlDQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kDQogICAgICAvLyBuYW1lIChyZW5kZXJWYWx1ZSkgZm9yIGh0bWx3aWRnZXRzIGRlZmluaXRpb24gYW5kIFNoaW55IGJpbmRpbmdzDQogICAgICAvLyBidXQgdGhleSBhY3R1YWxseSBoYXZlIHF1aXRlIGRpZmZlcmVudCBzZW1hbnRpY3MgKHRoZSBTaGlueQ0KICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0DQogICAgICAvLyBzdHJpcHMgb2ZmIGJlZm9yZSBjYWxsaW5nIGh0bWx3aWRnZXRzIHJlbmRlclZhbHVlKS4gV2UgY2FuJ3QNCiAgICAgIC8vIGp1c3QgaWdub3JlIHRoZSBkaWZmZXJlbmNlIGJlY2F1c2UgaW4gc29tZSB3aWRnZXRzIGl0J3MgaGVscGZ1bA0KICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZg0KICAgICAgLy8gd2UncmUgbm90IGRlbGVnYXRpbmcsIHRoZW4gdGhhdCBjYWxsIHdpbGwgZ28gdG8gdGhlIFNoaW55DQogICAgICAvLyB2ZXJzaW9uIGluc3RlYWQgb2YgdGhlIGh0bWx3aWRnZXRzIHZlcnNpb24uDQoNCiAgICAgIC8vIE1lcmdlIGRlZmF1bHRzIHdpdGggZGVmaW5pdGlvbiwgd2l0aG91dCBtdXRhdGluZyBlaXRoZXIuDQogICAgICB2YXIgYmluZGluZ0RlZiA9IGV4dGVuZCh7fSwgZGVmYXVsdHMsIGRlZmluaXRpb24pOw0KDQogICAgICAvLyBUaGlzIG9iamVjdCB3aWxsIGJlIG91ciBhY3R1YWwgU2hpbnkgYmluZGluZy4NCiAgICAgIHZhciBzaGlueUJpbmRpbmcgPSBuZXcgU2hpbnkuT3V0cHV0QmluZGluZygpOw0KDQogICAgICAvLyBXaXRoIGEgZmV3IGV4Y2VwdGlvbnMsIHdlJ2xsIHdhbnQgdG8gc2ltcGx5IHVzZSB0aGUgYmluZGluZ0RlZidzDQogICAgICAvLyB2ZXJzaW9uIG9mIG1ldGhvZHMgaWYgdGhleSBhcmUgYXZhaWxhYmxlLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvDQogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwNCiAgICAgIC8vIG1ldGhvZHMgaW4gdGhlIGZ1dHVyZSwgYW5kIHdlIHdhbnQgdGhlbSB0byBiZSBvdmVycmlkZWFibGUgYnkNCiAgICAgIC8vIEhUTUxXaWRnZXQgYmluZGluZyBkZWZpbml0aW9ucywgdGhlbiB3ZSdsbCBuZWVkIHRvIGFkZCB0aGVtIHRvIHRoaXMNCiAgICAgIC8vIGxpc3QuDQogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJnZXRJZCIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUNoYW5nZSIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7DQogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJyZW5kZXJFcnJvciIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAiY2xlYXJFcnJvciIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7DQoNCiAgICAgIC8vIFRoZSBmaW5kLCByZW5kZXJWYWx1ZSwgYW5kIHJlc2l6ZSBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgYmVjYXVzZSB3ZQ0KICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4NCg0KICAgICAgc2hpbnlCaW5kaW5nLmZpbmQgPSBmdW5jdGlvbihzY29wZSkgew0KICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7DQoNCiAgICAgICAgLy8gT25seSByZXR1cm4gZWxlbWVudHMgdGhhdCBhcmUgU2hpbnkgb3V0cHV0cywgbm90IHN0YXRpYyBvbmVzDQogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7DQoNCiAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHdoYXRldmVyIGNhdXNlZCBTaGlueSB0byB0aGluayB0aGVyZSBtaWdodCBiZQ0KICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuDQogICAgICAgIC8vIFNpbmNlIHRoZXJlIG1pZ2h0IGJlIGxvdHMgb2YgZGlmZmVyZW50IGh0bWx3aWRnZXRzIGJpbmRpbmdzLCB3ZQ0KICAgICAgICAvLyBzY2hlZHVsZSBleGVjdXRpb24gZm9yIGxhdGVyLS1ubyBuZWVkIHRvIHN0YXRpY1JlbmRlciBtdWx0aXBsZQ0KICAgICAgICAvLyB0aW1lcy4NCiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoICE9PSBkeW5hbWljUmVzdWx0cy5sZW5ndGgpDQogICAgICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXIoKTsNCg0KICAgICAgICByZXR1cm4gZHluYW1pY1Jlc3VsdHM7DQogICAgICB9Ow0KDQogICAgICAvLyBXcmFwIHJlbmRlclZhbHVlIHRvIGhhbmRsZSBpbml0aWFsaXphdGlvbiwgd2hpY2ggdW5mb3J0dW5hdGVseSBpc24ndA0KICAgICAgLy8gc3VwcG9ydGVkIG5hdGl2ZWx5IGJ5IFNoaW55IGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZy4NCg0KICAgICAgc2hpbnlCaW5kaW5nLnJlbmRlclZhbHVlID0gZnVuY3Rpb24oZWwsIGRhdGEpIHsNCiAgICAgICAgLy8gUmVzb2x2ZSBzdHJpbmdzIG1hcmtlZCBhcyBqYXZhc2NyaXB0IGxpdGVyYWxzIHRvIG9iamVjdHMNCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGRhdGEuZXZhbHMgJiYgaSA8IGRhdGEuZXZhbHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIoZGF0YS54LCBkYXRhLmV2YWxzW2ldKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIWJpbmRpbmdEZWYucmVuZGVyT25OdWxsVmFsdWUpIHsNCiAgICAgICAgICBpZiAoZGF0YS54ID09PSBudWxsKSB7DQogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7DQogICAgICAgICAgaW5pdFNpemluZyhlbCk7DQoNCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7DQogICAgICAgICAgaWYgKGJpbmRpbmdEZWYuaW5pdGlhbGl6ZSkgew0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGJpbmRpbmdEZWYuaW5pdGlhbGl6ZShlbCwgZWwub2Zmc2V0V2lkdGgsDQogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7DQogICAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgcmVzdWx0KTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgU2hpbnkucmVuZGVyRGVwZW5kZW5jaWVzKGRhdGEuZGVwcyk7DQogICAgICAgIGJpbmRpbmdEZWYucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsNCiAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7DQogICAgICB9Ow0KDQogICAgICAvLyBPbmx5IG92ZXJyaWRlIHJlc2l6ZSBpZiBiaW5kaW5nRGVmIGltcGxlbWVudHMgaXQNCiAgICAgIGlmIChiaW5kaW5nRGVmLnJlc2l6ZSkgew0KICAgICAgICBzaGlueUJpbmRpbmcucmVzaXplID0gZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsNCiAgICAgICAgICAvLyBTaGlueSBjYW4gY2FsbCByZXNpemUgYmVmb3JlIGluaXRpYWxpemUvcmVuZGVyVmFsdWUgaGF2ZSBiZWVuDQogICAgICAgICAgLy8gY2FsbGVkLCB3aGljaCBkb2Vzbid0IG1ha2Ugc2Vuc2UgZm9yIHdpZGdldHMuDQogICAgICAgICAgaWYgKGVsZW1lbnREYXRhKGVsLCAiaW5pdGlhbGl6ZWQiKSkgew0KICAgICAgICAgICAgYmluZGluZ0RlZi5yZXNpemUoZWwsIHdpZHRoLCBoZWlnaHQsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7DQogICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgfQ0KDQogICAgICBTaGlueS5vdXRwdXRCaW5kaW5ncy5yZWdpc3RlcihzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYubmFtZSk7DQogICAgfQ0KICB9Ow0KDQogIHZhciBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOw0KICBmdW5jdGlvbiBzY2hlZHVsZVN0YXRpY1JlbmRlcigpIHsNCiAgICBpZiAoIXNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCkgew0KICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gbnVsbDsNCiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOw0KICAgICAgfSwgMSk7DQogICAgfQ0KICB9DQoNCiAgLy8gUmVuZGVyIHN0YXRpYyB3aWRnZXRzIGFmdGVyIHRoZSBkb2N1bWVudCBmaW5pc2hlcyBsb2FkaW5nDQogIC8vIFN0YXRpY2FsbHkgcmVuZGVyIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBvZiB0aGlzIHdpZGdldCdzIGNsYXNzDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIgPSBmdW5jdGlvbigpIHsNCiAgICB2YXIgYmluZGluZ3MgPSB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyB8fCBbXTsNCiAgICBmb3JFYWNoKGJpbmRpbmdzLCBmdW5jdGlvbihiaW5kaW5nKSB7DQogICAgICB2YXIgbWF0Y2hlcyA9IGJpbmRpbmcuZmluZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOw0KICAgICAgZm9yRWFjaChtYXRjaGVzLCBmdW5jdGlvbihlbCkgew0KICAgICAgICB2YXIgc2l6ZU9iaiA9IGluaXRTaXppbmcoZWwsIGJpbmRpbmcpOw0KDQogICAgICAgIGlmIChoYXNDbGFzcyhlbCwgImh0bWwtd2lkZ2V0LXN0YXRpYy1ib3VuZCIpKQ0KICAgICAgICAgIHJldHVybjsNCiAgICAgICAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lICsgIiBodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiOw0KDQogICAgICAgIHZhciBpbml0UmVzdWx0Ow0KICAgICAgICBpZiAoYmluZGluZy5pbml0aWFsaXplKSB7DQogICAgICAgICAgaW5pdFJlc3VsdCA9IGJpbmRpbmcuaW5pdGlhbGl6ZShlbCwNCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwNCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0DQogICAgICAgICAgKTsNCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgaW5pdFJlc3VsdCk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoYmluZGluZy5yZXNpemUpIHsNCiAgICAgICAgICB2YXIgbGFzdFNpemUgPSB7fTsNCiAgICAgICAgICB2YXIgcmVzaXplSGFuZGxlciA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIHZhciBzaXplID0gew0KICAgICAgICAgICAgICB3OiBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsDQogICAgICAgICAgICAgIGg6IHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgaWYgKHNpemUudyA9PT0gMCAmJiBzaXplLmggPT09IDApDQogICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIGlmIChzaXplLncgPT09IGxhc3RTaXplLncgJiYgc2l6ZS5oID09PSBsYXN0U2l6ZS5oKQ0KICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICBsYXN0U2l6ZSA9IHNpemU7DQogICAgICAgICAgICBiaW5kaW5nLnJlc2l6ZShlbCwgc2l6ZS53LCBzaXplLmgsIGluaXRSZXN1bHQpOw0KICAgICAgICAgIH07DQoNCiAgICAgICAgICBvbih3aW5kb3csICJyZXNpemUiLCByZXNpemVIYW5kbGVyKTsNCg0KICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciBjYXNlcyB3aGVyZSB3ZSdyZSBydW5uaW5nIGluIGEgU2hpbnkNCiAgICAgICAgICAvLyBhcHAsIGJ1dCB0aGUgd2lkZ2V0IGl0c2VsZiBpcyBub3QgYSBTaGlueSBvdXRwdXQsIGJ1dA0KICAgICAgICAgIC8vIHJhdGhlciBhIHNpbXBsZSBzdGF0aWMgd2lkZ2V0LiBPbmUgZXhhbXBsZSBvZiB0aGlzIGlzDQogICAgICAgICAgLy8gYW4gcm1hcmtkb3duIGRvY3VtZW50IHRoYXQgaGFzIHJ1bnRpbWU6c2hpbnkgYW5kIHdpZGdldA0KICAgICAgICAgIC8vIHRoYXQgaXNuJ3QgaW4gYSByZW5kZXIgZnVuY3Rpb24uIFNoaW55IG9ubHkga25vd3MgdG8NCiAgICAgICAgICAvLyBjYWxsIHJlc2l6ZSBoYW5kbGVycyBmb3IgU2hpbnkgb3V0cHV0cywgbm90IGZvciBzdGF0aWMNCiAgICAgICAgICAvLyB3aWRnZXRzLCBzbyB3ZSBkbyBpdCBvdXJzZWx2ZXMuDQogICAgICAgICAgaWYgKHdpbmRvdy5qUXVlcnkpIHsNCiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKA0KICAgICAgICAgICAgICAic2hvd24uaHRtbHdpZGdldHMgc2hvd24uYnMudGFiLmh0bWx3aWRnZXRzIHNob3duLmJzLmNvbGxhcHNlLmh0bWx3aWRnZXRzIiwNCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcg0KICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKA0KICAgICAgICAgICAgICAiaGlkZGVuLmh0bWx3aWRnZXRzIGhpZGRlbi5icy50YWIuaHRtbHdpZGdldHMgaGlkZGVuLmJzLmNvbGxhcHNlLmh0bWx3aWRnZXRzIiwNCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcg0KICAgICAgICAgICAgKTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlIHNwZWNpZmljIGNhc2Ugb2YgaW9zbGlkZXMsIHdoaWNoDQogICAgICAgICAgLy8gZmxpcHMgc2xpZGVzIGJldHdlZW4gZGlzcGxheTpub25lIGFuZCBkaXNwbGF5OmJsb2NrLg0KICAgICAgICAgIC8vIElkZWFsbHkgd2Ugd291bGQgbm90IGhhdmUgdG8gaGF2ZSBpb3NsaWRlLXNwZWNpZmljIGNvZGUNCiAgICAgICAgICAvLyBoZXJlLCBidXQgcmF0aGVyIGhhdmUgaW9zbGlkZXMgcmFpc2UgYSBnZW5lcmljIGV2ZW50LA0KICAgICAgICAgIC8vIGJ1dCB0aGUgcm1hcmtkb3duIHBhY2thZ2UganVzdCB3ZW50IHRvIENSQU4gc28gdGhlDQogICAgICAgICAgLy8gd2luZG93IHRvIGdldHRpbmcgdGhhdCBmaXhlZCBtYXkgYmUgbG9uZy4NCiAgICAgICAgICBpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpIHsNCiAgICAgICAgICAgIC8vIEl0J3MgT0sgdG8gbGltaXQgdGhpcyB0byB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcg0KICAgICAgICAgICAgLy8gYnJvd3NlcnMgYmVjYXVzZSBpb3NsaWRlcyBpdHNlbGYgb25seSBzdXBwb3J0cw0KICAgICAgICAgICAgLy8gc3VjaCBicm93c2Vycy4NCiAgICAgICAgICAgIG9uKGRvY3VtZW50LCAic2xpZGVlbnRlciIsIHJlc2l6ZUhhbmRsZXIpOw0KICAgICAgICAgICAgb24oZG9jdW1lbnQsICJzbGlkZWxlYXZlIiwgcmVzaXplSGFuZGxlcik7DQogICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIHNjcmlwdERhdGEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJzY3JpcHRbZGF0YS1mb3I9JyIgKyBlbC5pZCArICInXVt0eXBlPSdhcHBsaWNhdGlvbi9qc29uJ10iKTsNCiAgICAgICAgaWYgKHNjcmlwdERhdGEpIHsNCiAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2Uoc2NyaXB0RGF0YS50ZXh0Q29udGVudCB8fCBzY3JpcHREYXRhLnRleHQpOw0KICAgICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzDQogICAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsNCiAgICAgICAgICBmb3IgKHZhciBrID0gMDsgZGF0YS5ldmFscyAmJiBrIDwgZGF0YS5ldmFscy5sZW5ndGg7IGsrKykgew0KICAgICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1trXSk7DQogICAgICAgICAgfQ0KICAgICAgICAgIGJpbmRpbmcucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgaW5pdFJlc3VsdCk7DQogICAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBpbml0UmVzdWx0LCBbZWwsIGRhdGEueF0pOw0KICAgICAgICB9DQogICAgICB9KTsNCiAgICB9KTsNCg0KICAgIGludm9rZVBvc3RSZW5kZXJIYW5kbGVycygpOw0KICB9DQoNCiAgLy8gV2FpdCB1bnRpbCBhZnRlciB0aGUgZG9jdW1lbnQgaGFzIGxvYWRlZCB0byByZW5kZXIgdGhlIHdpZGdldHMuDQogIGlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCkgew0KICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlKTsNCiAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsNCiAgICB9LCBmYWxzZSk7DQogIH0gZWxzZSBpZiAoZG9jdW1lbnQuYXR0YWNoRXZlbnQpIHsNCiAgICBkb2N1bWVudC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgZnVuY3Rpb24oKSB7DQogICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIikgew0KICAgICAgICBkb2N1bWVudC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgYXJndW1lbnRzLmNhbGxlZSk7DQogICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsNCiAgICAgIH0NCiAgICB9KTsNCiAgfQ0KDQoNCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEF0dGFjaG1lbnRVcmwgPSBmdW5jdGlvbihkZXBuYW1lLCBrZXkpIHsNCiAgICAvLyBJZiBubyBrZXksIGRlZmF1bHQgdG8gdGhlIGZpcnN0IGl0ZW0NCiAgICBpZiAodHlwZW9mKGtleSkgPT09ICJ1bmRlZmluZWQiKQ0KICAgICAga2V5ID0gMTsNCg0KICAgIHZhciBsaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGVwbmFtZSArICItIiArIGtleSArICItYXR0YWNobWVudCIpOw0KICAgIGlmICghbGluaykgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJBdHRhY2htZW50ICIgKyBkZXBuYW1lICsgIi8iICsga2V5ICsgIiBub3QgZm91bmQgaW4gZG9jdW1lbnQiKTsNCiAgICB9DQogICAgcmV0dXJuIGxpbmsuZ2V0QXR0cmlidXRlKCJocmVmIik7DQogIH07DQoNCiAgd2luZG93LkhUTUxXaWRnZXRzLmRhdGFmcmFtZVRvRDMgPSBmdW5jdGlvbihkZikgew0KICAgIHZhciBuYW1lcyA9IFtdOw0KICAgIHZhciBsZW5ndGg7DQogICAgZm9yICh2YXIgbmFtZSBpbiBkZikgew0KICAgICAgICBpZiAoZGYuaGFzT3duUHJvcGVydHkobmFtZSkpDQogICAgICAgICAgICBuYW1lcy5wdXNoKG5hbWUpOw0KICAgICAgICBpZiAodHlwZW9mKGRmW25hbWVdKSAhPT0gIm9iamVjdCIgfHwgdHlwZW9mKGRmW25hbWVdLmxlbmd0aCkgPT09ICJ1bmRlZmluZWQiKSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMiKTsNCiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YobGVuZ3RoKSAhPT0gInVuZGVmaW5lZCIgJiYgbGVuZ3RoICE9PSBkZltuYW1lXS5sZW5ndGgpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxsIGZpZWxkcyBtdXN0IGJlIGFycmF5cyBvZiB0aGUgc2FtZSBsZW5ndGgiKTsNCiAgICAgICAgfQ0KICAgICAgICBsZW5ndGggPSBkZltuYW1lXS5sZW5ndGg7DQogICAgfQ0KICAgIHZhciByZXN1bHRzID0gW107DQogICAgdmFyIGl0ZW07DQogICAgZm9yICh2YXIgcm93ID0gMDsgcm93IDwgbGVuZ3RoOyByb3crKykgew0KICAgICAgICBpdGVtID0ge307DQogICAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG5hbWVzLmxlbmd0aDsgY29sKyspIHsNCiAgICAgICAgICAgIGl0ZW1bbmFtZXNbY29sXV0gPSBkZltuYW1lc1tjb2xdXVtyb3ddOw0KICAgICAgICB9DQogICAgICAgIHJlc3VsdHMucHVzaChpdGVtKTsNCiAgICB9DQogICAgcmV0dXJuIHJlc3VsdHM7DQogIH07DQoNCiAgd2luZG93LkhUTUxXaWRnZXRzLnRyYW5zcG9zZUFycmF5MkQgPSBmdW5jdGlvbihhcnJheSkgew0KICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFycmF5Ow0KICAgICAgdmFyIG5ld0FycmF5ID0gYXJyYXlbMF0ubWFwKGZ1bmN0aW9uKGNvbCwgaSkgew0KICAgICAgICAgIHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24ocm93KSB7DQogICAgICAgICAgICAgIHJldHVybiByb3dbaV0NCiAgICAgICAgICB9KQ0KICAgICAgfSk7DQogICAgICByZXR1cm4gbmV3QXJyYXk7DQogIH07DQogIC8vIFNwbGl0IHZhbHVlIGF0IHNwbGl0Q2hhciwgYnV0IGFsbG93IHNwbGl0Q2hhciB0byBiZSBlc2NhcGVkDQogIC8vIHVzaW5nIGVzY2FwZUNoYXIuIEFueSBvdGhlciBjaGFyYWN0ZXJzIGVzY2FwZWQgYnkgZXNjYXBlQ2hhcg0KICAvLyB3aWxsIGJlIGluY2x1ZGVkIGFzIHVzdWFsIChpbmNsdWRpbmcgZXNjYXBlQ2hhciBpdHNlbGYpLg0KICBmdW5jdGlvbiBzcGxpdFdpdGhFc2NhcGUodmFsdWUsIHNwbGl0Q2hhciwgZXNjYXBlQ2hhcikgew0KICAgIHZhciByZXN1bHRzID0gW107DQogICAgdmFyIGVzY2FwZU1vZGUgPSBmYWxzZTsNCiAgICB2YXIgY3VycmVudFJlc3VsdCA9ICIiOw0KICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IHZhbHVlLmxlbmd0aDsgcG9zKyspIHsNCiAgICAgIGlmICghZXNjYXBlTW9kZSkgew0KICAgICAgICBpZiAodmFsdWVbcG9zXSA9PT0gc3BsaXRDaGFyKSB7DQogICAgICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOw0KICAgICAgICAgIGN1cnJlbnRSZXN1bHQgPSAiIjsNCiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVtwb3NdID09PSBlc2NhcGVDaGFyKSB7DQogICAgICAgICAgZXNjYXBlTW9kZSA9IHRydWU7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOw0KICAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICBjdXJyZW50UmVzdWx0ICs9IHZhbHVlW3Bvc107DQogICAgICAgIGVzY2FwZU1vZGUgPSBmYWxzZTsNCiAgICAgIH0NCiAgICB9DQogICAgaWYgKGN1cnJlbnRSZXN1bHQgIT09ICIiKSB7DQogICAgICByZXN1bHRzLnB1c2goY3VycmVudFJlc3VsdCk7DQogICAgfQ0KICAgIHJldHVybiByZXN1bHRzOw0KICB9DQogIC8vIEZ1bmN0aW9uIGF1dGhvcmVkIGJ5IFlpaHVpL0pKIEFsbGFpcmUNCiAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyID0gZnVuY3Rpb24obywgbWVtYmVyKSB7DQogICAgdmFyIHBhcnRzID0gc3BsaXRXaXRoRXNjYXBlKG1lbWJlciwgJy4nLCAnXFwnKTsNCiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgew0KICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsNCiAgICAgIC8vIHBhcnQgbWF5IGJlIGEgY2hhcmFjdGVyIG9yICdudW1lcmljJyBtZW1iZXIgbmFtZQ0KICAgICAgaWYgKG8gIT09IG51bGwgJiYgdHlwZW9mIG8gPT09ICJvYmplY3QiICYmIHBhcnQgaW4gbykgew0KICAgICAgICBpZiAoaSA9PSAobCAtIDEpKSB7IC8vIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIHRoZW4gZXZhbHVsYXRlDQogICAgICAgICAgaWYgKHR5cGVvZiBvW3BhcnRdID09PSAic3RyaW5nIikNCiAgICAgICAgICAgIG9bcGFydF0gPSBldmFsKCIoIiArIG9bcGFydF0gKyAiKSIpOw0KICAgICAgICB9IGVsc2UgeyAvLyBvdGhlcndpc2UgY29udGludWUgdG8gbmV4dCBlbWJlZGRlZCBvYmplY3QNCiAgICAgICAgICBvID0gb1twYXJ0XTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfTsNCg0KICAvLyBSZXRyaWV2ZSB0aGUgSFRNTFdpZGdldCBpbnN0YW5jZSAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlIG9mIGFuDQogIC8vIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pDQogIC8vIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50LCBvciBudWxsIGlmIG5vbmUuDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uKGVsKSB7DQogICAgcmV0dXJuIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKTsNCiAgfTsNCg0KICAvLyBGaW5kcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3RvciwNCiAgLy8gYW5kIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZg0KICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQ0KICAvLyBhc3NvY2lhdGVkIHdpdGggdGhhdCBlbGVtZW50LCBpZiBhbnkuIElmIG5vIGVsZW1lbnQgbWF0Y2hlcyB0aGUNCiAgLy8gc2VsZWN0b3IsIG9yIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IGhhcyBubyBIVE1MV2lkZ2V0DQogIC8vIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBpdCwgdGhlbiBudWxsIGlzIHJldHVybmVkLg0KICAvLw0KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5maW5kID0gZnVuY3Rpb24oc2NvcGUsIHNlbGVjdG9yKSB7DQogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgew0KICAgICAgc2VsZWN0b3IgPSBzY29wZTsNCiAgICAgIHNjb3BlID0gZG9jdW1lbnQ7DQogICAgfQ0KDQogICAgdmFyIGVsID0gc2NvcGUucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7DQogICAgaWYgKGVsID09PSBudWxsKSB7DQogICAgICByZXR1cm4gbnVsbDsNCiAgICB9IGVsc2Ugew0KICAgICAgcmV0dXJuIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZShlbCk7DQogICAgfQ0KICB9Ow0KDQogIC8vIEZpbmRzIGFsbCBlbGVtZW50cyBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IsIGFuZA0KICAvLyByZXR1cm5zIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlcyAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlcyBvZg0KICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQ0KICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnRzLCBpbiBhbiBhcnJheS4gSWYgZWxlbWVudHMgdGhhdA0KICAvLyBtYXRjaCB0aGUgc2VsZWN0b3IgZG9uJ3QgaGF2ZSBhbiBhc3NvY2lhdGVkIEhUTUxXaWRnZXQNCiAgLy8gaW5zdGFuY2UsIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGNvbnRhaW4gbnVsbHMuDQogIC8vDQogIC8vIFRoZSBzY29wZSBhcmd1bWVudCBpcyBvcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIHdpbmRvdy5kb2N1bWVudC4NCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmRBbGwgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7DQogICAgICBzZWxlY3RvciA9IHNjb3BlOw0KICAgICAgc2NvcGUgPSBkb2N1bWVudDsNCiAgICB9DQoNCiAgICB2YXIgbm9kZXMgPSBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsNCiAgICB2YXIgcmVzdWx0cyA9IFtdOw0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgIHJlc3VsdHMucHVzaCh3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2Uobm9kZXNbaV0pKTsNCiAgICB9DQogICAgcmV0dXJuIHJlc3VsdHM7DQogIH07DQoNCiAgdmFyIHBvc3RSZW5kZXJIYW5kbGVycyA9IFtdOw0KICBmdW5jdGlvbiBpbnZva2VQb3N0UmVuZGVySGFuZGxlcnMoKSB7DQogICAgd2hpbGUgKHBvc3RSZW5kZXJIYW5kbGVycy5sZW5ndGgpIHsNCiAgICAgIHZhciBoYW5kbGVyID0gcG9zdFJlbmRlckhhbmRsZXJzLnNoaWZ0KCk7DQogICAgICBpZiAoaGFuZGxlcikgew0KICAgICAgICBoYW5kbGVyKCk7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgLy8gUmVnaXN0ZXIgdGhlIGdpdmVuIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgYWZ0ZXIgdGhlDQogIC8vIG5leHQgdGltZSBzdGF0aWMgd2lkZ2V0cyBhcmUgcmVuZGVyZWQuDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5hZGRQb3N0UmVuZGVySGFuZGxlciA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7DQogICAgcG9zdFJlbmRlckhhbmRsZXJzLnB1c2goY2FsbGJhY2spOw0KICB9Ow0KDQogIC8vIFRha2VzIGEgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb24sIGFuZCByZXR1cm5zIGFuDQogIC8vIG9sZC1zdHlsZSBjbGFzcy1ib3VuZCBkZWZpbml0aW9uLiBUaGlzIHNhdmVzIHVzIGZyb20gaGF2aW5nDQogIC8vIHRvIHJld3JpdGUgYWxsIHRoZSBsb2dpYyBpbiB0aGlzIGZpbGUgdG8gYWNjb21vZGF0ZSBib3RoDQogIC8vIHR5cGVzIG9mIGRlZmluaXRpb25zLg0KICBmdW5jdGlvbiBjcmVhdGVMZWdhY3lEZWZpbml0aW9uQWRhcHRlcihkZWZuKSB7DQogICAgdmFyIHJlc3VsdCA9IHsNCiAgICAgIG5hbWU6IGRlZm4ubmFtZSwNCiAgICAgIHR5cGU6IGRlZm4udHlwZSwNCiAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7DQogICAgICAgIHJldHVybiBkZWZuLmZhY3RvcnkoZWwsIHdpZHRoLCBoZWlnaHQpOw0KICAgICAgfSwNCiAgICAgIHJlbmRlclZhbHVlOiBmdW5jdGlvbihlbCwgeCwgaW5zdGFuY2UpIHsNCiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnJlbmRlclZhbHVlKHgpOw0KICAgICAgfSwNCiAgICAgIHJlc2l6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQsIGluc3RhbmNlKSB7DQogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZXNpemUod2lkdGgsIGhlaWdodCk7DQogICAgICB9DQogICAgfTsNCg0KICAgIGlmIChkZWZuLmZpbmQpDQogICAgICByZXN1bHQuZmluZCA9IGRlZm4uZmluZDsNCiAgICBpZiAoZGVmbi5yZW5kZXJFcnJvcikNCiAgICAgIHJlc3VsdC5yZW5kZXJFcnJvciA9IGRlZm4ucmVuZGVyRXJyb3I7DQogICAgaWYgKGRlZm4uY2xlYXJFcnJvcikNCiAgICAgIHJlc3VsdC5jbGVhckVycm9yID0gZGVmbi5jbGVhckVycm9yOw0KDQogICAgcmV0dXJuIHJlc3VsdDsNCiAgfQ0KfSkoKTsNCg0K"></script>
<script src="data:application/x-javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsNCg0KICBuYW1lOiAndnVlJywNCg0KICB0eXBlOiAnb3V0cHV0JywNCg0KICBmYWN0b3J5OiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCkgew0KDQogICAgdmFyIGluc3RhbmNlID0ge307DQoNCiAgICByZXR1cm4gew0KDQogICAgICByZW5kZXJWYWx1ZTogZnVuY3Rpb24oeCkgew0KICAgICAgICAvLyBpZiB4LmVsIGlzIHNwZWNpZmllZCB0aGVuIHVzZSBpdCBhbmQNCiAgICAgICAgLy8gICBoaWRlIG91ciBodG1sd2lkZ2V0IGNvbnRhaW5lcg0KICAgICAgICBpZih4LmVsKSB7DQogICAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9ICJub25lIjsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAvLyB4LmVsIG5vdCBzcGVjaWZpZWQgc28gdXNlIG91ciBodG1sd2lkZ2V0IGVsDQogICAgICAgICAgLy8gIGNvbnRhaW5lciBmb3Igb3VyIFZ1ZSBhcHAgYnV0IHRoaXMgd2lsbA0KICAgICAgICAgIC8vICB3aWxsIHByb2JhYmx5IG5vdCB3b3JrIGFzIGV4cGVjdGVkDQogICAgICAgICAgLy8gIHNpbmNlIHRoZSB0YWcgaXMganVzdCBhIGRpdg0KICAgICAgICAgIHguZWwgPSAiIyIgKyBlbC5pZDsNCiAgICAgICAgfQ0KDQogICAgICAgIHRoaXMuaW5zdGFuY2UgPSBuZXcgVnVlKHgpOw0KDQogICAgICB9LA0KDQogICAgICByZXNpemU6IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpIHsNCg0KICAgICAgICAvLyBmb3Igbm93IGlnbm9yZSByZXNpemUgaG9wZWZ1bGx5IHdpdGhvdXQNCiAgICAgICAgLy8gICBtdWNoIGNvbnNlcXVlbmNlDQoNCiAgICAgIH0sDQoNCiAgICAgIGluc3RhbmNlOiBpbnN0YW5jZQ0KDQogICAgfTsNCiAgfQ0KfSk7DQo="></script>
<script src="data:application/x-javascript;base64,LyohDQogKiBWdWUuanMgdjIuMS40DQogKiAoYykgMjAxNC0yMDE2IEV2YW4gWW91DQogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuDQogKi8NCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7DQogIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDoNCiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDoNCiAgKGdsb2JhbC5WdWUgPSBmYWN0b3J5KCkpOw0KfSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7DQoNCi8qICAqLw0KDQovKioNCiAqIENvbnZlcnQgYSB2YWx1ZSB0byBhIHN0cmluZyB0aGF0IGlzIGFjdHVhbGx5IHJlbmRlcmVkLg0KICovDQpmdW5jdGlvbiBfdG9TdHJpbmcgKHZhbCkgew0KICByZXR1cm4gdmFsID09IG51bGwNCiAgICA/ICcnDQogICAgOiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jw0KICAgICAgPyBKU09OLnN0cmluZ2lmeSh2YWwsIG51bGwsIDIpDQogICAgICA6IFN0cmluZyh2YWwpDQp9DQoNCi8qKg0KICogQ29udmVydCBhIGlucHV0IHZhbHVlIHRvIGEgbnVtYmVyIGZvciBwZXJzaXN0ZW5jZS4NCiAqIElmIHRoZSBjb252ZXJzaW9uIGZhaWxzLCByZXR1cm4gb3JpZ2luYWwgc3RyaW5nLg0KICovDQpmdW5jdGlvbiB0b051bWJlciAodmFsKSB7DQogIHZhciBuID0gcGFyc2VGbG9hdCh2YWwsIDEwKTsNCiAgcmV0dXJuIChuIHx8IG4gPT09IDApID8gbiA6IHZhbA0KfQ0KDQovKioNCiAqIE1ha2UgYSBtYXAgYW5kIHJldHVybiBhIGZ1bmN0aW9uIGZvciBjaGVja2luZyBpZiBhIGtleQ0KICogaXMgaW4gdGhhdCBtYXAuDQogKi8NCmZ1bmN0aW9uIG1ha2VNYXAgKA0KICBzdHIsDQogIGV4cGVjdHNMb3dlckNhc2UNCikgew0KICB2YXIgbWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTsNCiAgdmFyIGxpc3QgPSBzdHIuc3BsaXQoJywnKTsNCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7DQogICAgbWFwW2xpc3RbaV1dID0gdHJ1ZTsNCiAgfQ0KICByZXR1cm4gZXhwZWN0c0xvd2VyQ2FzZQ0KICAgID8gZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gbWFwW3ZhbC50b0xvd2VyQ2FzZSgpXTsgfQ0KICAgIDogZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gbWFwW3ZhbF07IH0NCn0NCg0KLyoqDQogKiBDaGVjayBpZiBhIHRhZyBpcyBhIGJ1aWx0LWluIHRhZy4NCiAqLw0KdmFyIGlzQnVpbHRJblRhZyA9IG1ha2VNYXAoJ3Nsb3QsY29tcG9uZW50JywgdHJ1ZSk7DQoNCi8qKg0KICogUmVtb3ZlIGFuIGl0ZW0gZnJvbSBhbiBhcnJheQ0KICovDQpmdW5jdGlvbiByZW1vdmUkMSAoYXJyLCBpdGVtKSB7DQogIGlmIChhcnIubGVuZ3RoKSB7DQogICAgdmFyIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7DQogICAgaWYgKGluZGV4ID4gLTEpIHsNCiAgICAgIHJldHVybiBhcnIuc3BsaWNlKGluZGV4LCAxKQ0KICAgIH0NCiAgfQ0KfQ0KDQovKioNCiAqIENoZWNrIHdoZXRoZXIgdGhlIG9iamVjdCBoYXMgdGhlIHByb3BlcnR5Lg0KICovDQp2YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5Ow0KZnVuY3Rpb24gaGFzT3duIChvYmosIGtleSkgew0KICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkNCn0NCg0KLyoqDQogKiBDaGVjayBpZiB2YWx1ZSBpcyBwcmltaXRpdmUNCiAqLw0KZnVuY3Rpb24gaXNQcmltaXRpdmUgKHZhbHVlKSB7DQogIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicNCn0NCg0KLyoqDQogKiBDcmVhdGUgYSBjYWNoZWQgdmVyc2lvbiBvZiBhIHB1cmUgZnVuY3Rpb24uDQogKi8NCmZ1bmN0aW9uIGNhY2hlZCAoZm4pIHsNCiAgdmFyIGNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsNCiAgcmV0dXJuIGZ1bmN0aW9uIGNhY2hlZEZuIChzdHIpIHsNCiAgICB2YXIgaGl0ID0gY2FjaGVbc3RyXTsNCiAgICByZXR1cm4gaGl0IHx8IChjYWNoZVtzdHJdID0gZm4oc3RyKSkNCiAgfQ0KfQ0KDQovKioNCiAqIENhbWVsaXplIGEgaHlwaGVuLWRlbG1pdGVkIHN0cmluZy4NCiAqLw0KdmFyIGNhbWVsaXplUkUgPSAvLShcdykvZzsNCnZhciBjYW1lbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7DQogIHJldHVybiBzdHIucmVwbGFjZShjYW1lbGl6ZVJFLCBmdW5jdGlvbiAoXywgYykgeyByZXR1cm4gYyA/IGMudG9VcHBlckNhc2UoKSA6ICcnOyB9KQ0KfSk7DQoNCi8qKg0KICogQ2FwaXRhbGl6ZSBhIHN0cmluZy4NCiAqLw0KdmFyIGNhcGl0YWxpemUgPSBjYWNoZWQoZnVuY3Rpb24gKHN0cikgew0KICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpDQp9KTsNCg0KLyoqDQogKiBIeXBoZW5hdGUgYSBjYW1lbENhc2Ugc3RyaW5nLg0KICovDQp2YXIgaHlwaGVuYXRlUkUgPSAvKFteLV0pKFtBLVpdKS9nOw0KdmFyIGh5cGhlbmF0ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7DQogIHJldHVybiBzdHINCiAgICAucmVwbGFjZShoeXBoZW5hdGVSRSwgJyQxLSQyJykNCiAgICAucmVwbGFjZShoeXBoZW5hdGVSRSwgJyQxLSQyJykNCiAgICAudG9Mb3dlckNhc2UoKQ0KfSk7DQoNCi8qKg0KICogU2ltcGxlIGJpbmQsIGZhc3RlciB0aGFuIG5hdGl2ZQ0KICovDQpmdW5jdGlvbiBiaW5kJDEgKGZuLCBjdHgpIHsNCiAgZnVuY3Rpb24gYm91bmRGbiAoYSkgew0KICAgIHZhciBsID0gYXJndW1lbnRzLmxlbmd0aDsNCiAgICByZXR1cm4gbA0KICAgICAgPyBsID4gMQ0KICAgICAgICA/IGZuLmFwcGx5KGN0eCwgYXJndW1lbnRzKQ0KICAgICAgICA6IGZuLmNhbGwoY3R4LCBhKQ0KICAgICAgOiBmbi5jYWxsKGN0eCkNCiAgfQ0KICAvLyByZWNvcmQgb3JpZ2luYWwgZm4gbGVuZ3RoDQogIGJvdW5kRm4uX2xlbmd0aCA9IGZuLmxlbmd0aDsNCiAgcmV0dXJuIGJvdW5kRm4NCn0NCg0KLyoqDQogKiBDb252ZXJ0IGFuIEFycmF5LWxpa2Ugb2JqZWN0IHRvIGEgcmVhbCBBcnJheS4NCiAqLw0KZnVuY3Rpb24gdG9BcnJheSAobGlzdCwgc3RhcnQpIHsNCiAgc3RhcnQgPSBzdGFydCB8fCAwOw0KICB2YXIgaSA9IGxpc3QubGVuZ3RoIC0gc3RhcnQ7DQogIHZhciByZXQgPSBuZXcgQXJyYXkoaSk7DQogIHdoaWxlIChpLS0pIHsNCiAgICByZXRbaV0gPSBsaXN0W2kgKyBzdGFydF07DQogIH0NCiAgcmV0dXJuIHJldA0KfQ0KDQovKioNCiAqIE1peCBwcm9wZXJ0aWVzIGludG8gdGFyZ2V0IG9iamVjdC4NCiAqLw0KZnVuY3Rpb24gZXh0ZW5kICh0bywgX2Zyb20pIHsNCiAgZm9yICh2YXIga2V5IGluIF9mcm9tKSB7DQogICAgdG9ba2V5XSA9IF9mcm9tW2tleV07DQogIH0NCiAgcmV0dXJuIHRvDQp9DQoNCi8qKg0KICogUXVpY2sgb2JqZWN0IGNoZWNrIC0gdGhpcyBpcyBwcmltYXJpbHkgdXNlZCB0byB0ZWxsDQogKiBPYmplY3RzIGZyb20gcHJpbWl0aXZlIHZhbHVlcyB3aGVuIHdlIGtub3cgdGhlIHZhbHVlDQogKiBpcyBhIEpTT04tY29tcGxpYW50IHR5cGUuDQogKi8NCmZ1bmN0aW9uIGlzT2JqZWN0IChvYmopIHsNCiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jw0KfQ0KDQovKioNCiAqIFN0cmljdCBvYmplY3QgdHlwZSBjaGVjay4gT25seSByZXR1cm5zIHRydWUNCiAqIGZvciBwbGFpbiBKYXZhU2NyaXB0IG9iamVjdHMuDQogKi8NCnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7DQp2YXIgT0JKRUNUX1NUUklORyA9ICdbb2JqZWN0IE9iamVjdF0nOw0KZnVuY3Rpb24gaXNQbGFpbk9iamVjdCAob2JqKSB7DQogIHJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09IE9CSkVDVF9TVFJJTkcNCn0NCg0KLyoqDQogKiBNZXJnZSBhbiBBcnJheSBvZiBPYmplY3RzIGludG8gYSBzaW5nbGUgT2JqZWN0Lg0KICovDQpmdW5jdGlvbiB0b09iamVjdCAoYXJyKSB7DQogIHZhciByZXMgPSB7fTsNCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsNCiAgICBpZiAoYXJyW2ldKSB7DQogICAgICBleHRlbmQocmVzLCBhcnJbaV0pOw0KICAgIH0NCiAgfQ0KICByZXR1cm4gcmVzDQp9DQoNCi8qKg0KICogUGVyZm9ybSBubyBvcGVyYXRpb24uDQogKi8NCmZ1bmN0aW9uIG5vb3AgKCkge30NCg0KLyoqDQogKiBBbHdheXMgcmV0dXJuIGZhbHNlLg0KICovDQp2YXIgbm8gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBmYWxzZTsgfTsNCg0KLyoqDQogKiBHZW5lcmF0ZSBhIHN0YXRpYyBrZXlzIHN0cmluZyBmcm9tIGNvbXBpbGVyIG1vZHVsZXMuDQogKi8NCmZ1bmN0aW9uIGdlblN0YXRpY0tleXMgKG1vZHVsZXMpIHsNCiAgcmV0dXJuIG1vZHVsZXMucmVkdWNlKGZ1bmN0aW9uIChrZXlzLCBtKSB7DQogICAgcmV0dXJuIGtleXMuY29uY2F0KG0uc3RhdGljS2V5cyB8fCBbXSkNCiAgfSwgW10pLmpvaW4oJywnKQ0KfQ0KDQovKioNCiAqIENoZWNrIGlmIHR3byB2YWx1ZXMgYXJlIGxvb3NlbHkgZXF1YWwgLSB0aGF0IGlzLA0KICogaWYgdGhleSBhcmUgcGxhaW4gb2JqZWN0cywgZG8gdGhleSBoYXZlIHRoZSBzYW1lIHNoYXBlPw0KICovDQpmdW5jdGlvbiBsb29zZUVxdWFsIChhLCBiKSB7DQogIC8qIGVzbGludC1kaXNhYmxlIGVxZXFlcSAqLw0KICByZXR1cm4gYSA9PSBiIHx8ICgNCiAgICBpc09iamVjdChhKSAmJiBpc09iamVjdChiKQ0KICAgICAgPyBKU09OLnN0cmluZ2lmeShhKSA9PT0gSlNPTi5zdHJpbmdpZnkoYikNCiAgICAgIDogZmFsc2UNCiAgKQ0KICAvKiBlc2xpbnQtZW5hYmxlIGVxZXFlcSAqLw0KfQ0KDQpmdW5jdGlvbiBsb29zZUluZGV4T2YgKGFyciwgdmFsKSB7DQogIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7DQogICAgaWYgKGxvb3NlRXF1YWwoYXJyW2ldLCB2YWwpKSB7IHJldHVybiBpIH0NCiAgfQ0KICByZXR1cm4gLTENCn0NCg0KLyogICovDQoNCnZhciBjb25maWcgPSB7DQogIC8qKg0KICAgKiBPcHRpb24gbWVyZ2Ugc3RyYXRlZ2llcyAodXNlZCBpbiBjb3JlL3V0aWwvb3B0aW9ucykNCiAgICovDQogIG9wdGlvbk1lcmdlU3RyYXRlZ2llczogT2JqZWN0LmNyZWF0ZShudWxsKSwNCg0KICAvKioNCiAgICogV2hldGhlciB0byBzdXBwcmVzcyB3YXJuaW5ncy4NCiAgICovDQogIHNpbGVudDogZmFsc2UsDQoNCiAgLyoqDQogICAqIFdoZXRoZXIgdG8gZW5hYmxlIGRldnRvb2xzDQogICAqLw0KICBkZXZ0b29sczogImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nLA0KDQogIC8qKg0KICAgKiBFcnJvciBoYW5kbGVyIGZvciB3YXRjaGVyIGVycm9ycw0KICAgKi8NCiAgZXJyb3JIYW5kbGVyOiBudWxsLA0KDQogIC8qKg0KICAgKiBJZ25vcmUgY2VydGFpbiBjdXN0b20gZWxlbWVudHMNCiAgICovDQogIGlnbm9yZWRFbGVtZW50czogbnVsbCwNCg0KICAvKioNCiAgICogQ3VzdG9tIHVzZXIga2V5IGFsaWFzZXMgZm9yIHYtb24NCiAgICovDQogIGtleUNvZGVzOiBPYmplY3QuY3JlYXRlKG51bGwpLA0KDQogIC8qKg0KICAgKiBDaGVjayBpZiBhIHRhZyBpcyByZXNlcnZlZCBzbyB0aGF0IGl0IGNhbm5vdCBiZSByZWdpc3RlcmVkIGFzIGENCiAgICogY29tcG9uZW50LiBUaGlzIGlzIHBsYXRmb3JtLWRlcGVuZGVudCBhbmQgbWF5IGJlIG92ZXJ3cml0dGVuLg0KICAgKi8NCiAgaXNSZXNlcnZlZFRhZzogbm8sDQoNCiAgLyoqDQogICAqIENoZWNrIGlmIGEgdGFnIGlzIGFuIHVua25vd24gZWxlbWVudC4NCiAgICogUGxhdGZvcm0tZGVwZW5kZW50Lg0KICAgKi8NCiAgaXNVbmtub3duRWxlbWVudDogbm8sDQoNCiAgLyoqDQogICAqIEdldCB0aGUgbmFtZXNwYWNlIG9mIGFuIGVsZW1lbnQNCiAgICovDQogIGdldFRhZ05hbWVzcGFjZTogbm9vcCwNCg0KICAvKioNCiAgICogQ2hlY2sgaWYgYW4gYXR0cmlidXRlIG11c3QgYmUgYm91bmQgdXNpbmcgcHJvcGVydHksIGUuZy4gdmFsdWUNCiAgICogUGxhdGZvcm0tZGVwZW5kZW50Lg0KICAgKi8NCiAgbXVzdFVzZVByb3A6IG5vLA0KDQogIC8qKg0KICAgKiBMaXN0IG9mIGFzc2V0IHR5cGVzIHRoYXQgYSBjb21wb25lbnQgY2FuIG93bi4NCiAgICovDQogIF9hc3NldFR5cGVzOiBbDQogICAgJ2NvbXBvbmVudCcsDQogICAgJ2RpcmVjdGl2ZScsDQogICAgJ2ZpbHRlcicNCiAgXSwNCg0KICAvKioNCiAgICogTGlzdCBvZiBsaWZlY3ljbGUgaG9va3MuDQogICAqLw0KICBfbGlmZWN5Y2xlSG9va3M6IFsNCiAgICAnYmVmb3JlQ3JlYXRlJywNCiAgICAnY3JlYXRlZCcsDQogICAgJ2JlZm9yZU1vdW50JywNCiAgICAnbW91bnRlZCcsDQogICAgJ2JlZm9yZVVwZGF0ZScsDQogICAgJ3VwZGF0ZWQnLA0KICAgICdiZWZvcmVEZXN0cm95JywNCiAgICAnZGVzdHJveWVkJywNCiAgICAnYWN0aXZhdGVkJywNCiAgICAnZGVhY3RpdmF0ZWQnDQogIF0sDQoNCiAgLyoqDQogICAqIE1heCBjaXJjdWxhciB1cGRhdGVzIGFsbG93ZWQgaW4gYSBzY2hlZHVsZXIgZmx1c2ggY3ljbGUuDQogICAqLw0KICBfbWF4VXBkYXRlQ291bnQ6IDEwMA0KfTsNCg0KLyogICovDQoNCi8qKg0KICogQ2hlY2sgaWYgYSBzdHJpbmcgc3RhcnRzIHdpdGggJCBvciBfDQogKi8NCmZ1bmN0aW9uIGlzUmVzZXJ2ZWQgKHN0cikgew0KICB2YXIgYyA9IChzdHIgKyAnJykuY2hhckNvZGVBdCgwKTsNCiAgcmV0dXJuIGMgPT09IDB4MjQgfHwgYyA9PT0gMHg1Rg0KfQ0KDQovKioNCiAqIERlZmluZSBhIHByb3BlcnR5Lg0KICovDQpmdW5jdGlvbiBkZWYgKG9iaiwga2V5LCB2YWwsIGVudW1lcmFibGUpIHsNCiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7DQogICAgdmFsdWU6IHZhbCwNCiAgICBlbnVtZXJhYmxlOiAhIWVudW1lcmFibGUsDQogICAgd3JpdGFibGU6IHRydWUsDQogICAgY29uZmlndXJhYmxlOiB0cnVlDQogIH0pOw0KfQ0KDQovKioNCiAqIFBhcnNlIHNpbXBsZSBwYXRoLg0KICovDQp2YXIgYmFpbFJFID0gL1teXHcuJF0vOw0KZnVuY3Rpb24gcGFyc2VQYXRoIChwYXRoKSB7DQogIGlmIChiYWlsUkUudGVzdChwYXRoKSkgew0KICAgIHJldHVybg0KICB9IGVsc2Ugew0KICAgIHZhciBzZWdtZW50cyA9IHBhdGguc3BsaXQoJy4nKTsNCiAgICByZXR1cm4gZnVuY3Rpb24gKG9iaikgew0KICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykgew0KICAgICAgICBpZiAoIW9iaikgeyByZXR1cm4gfQ0KICAgICAgICBvYmogPSBvYmpbc2VnbWVudHNbaV1dOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIG9iag0KICAgIH0NCiAgfQ0KfQ0KDQovKiAgKi8NCi8qIGdsb2JhbHMgTXV0YXRpb25PYnNlcnZlciAqLw0KDQovLyBjYW4gd2UgdXNlIF9fcHJvdG9fXz8NCnZhciBoYXNQcm90byA9ICdfX3Byb3RvX18nIGluIHt9Ow0KDQovLyBCcm93c2VyIGVudmlyb25tZW50IHNuaWZmaW5nDQp2YXIgaW5Ccm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCc7DQp2YXIgVUEgPSBpbkJyb3dzZXIgJiYgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTsNCnZhciBpc0lFID0gVUEgJiYgL21zaWV8dHJpZGVudC8udGVzdChVQSk7DQp2YXIgaXNJRTkgPSBVQSAmJiBVQS5pbmRleE9mKCdtc2llIDkuMCcpID4gMDsNCnZhciBpc0VkZ2UgPSBVQSAmJiBVQS5pbmRleE9mKCdlZGdlLycpID4gMDsNCnZhciBpc0FuZHJvaWQgPSBVQSAmJiBVQS5pbmRleE9mKCdhbmRyb2lkJykgPiAwOw0KdmFyIGlzSU9TID0gVUEgJiYgL2lwaG9uZXxpcGFkfGlwb2R8aW9zLy50ZXN0KFVBKTsNCg0KLy8gdGhpcyBuZWVkcyB0byBiZSBsYXp5LWV2YWxlZCBiZWNhdXNlIHZ1ZSBtYXkgYmUgcmVxdWlyZWQgYmVmb3JlDQovLyB2dWUtc2VydmVyLXJlbmRlcmVyIGNhbiBzZXQgVlVFX0VOVg0KdmFyIF9pc1NlcnZlcjsNCnZhciBpc1NlcnZlclJlbmRlcmluZyA9IGZ1bmN0aW9uICgpIHsNCiAgaWYgKF9pc1NlcnZlciA9PT0gdW5kZWZpbmVkKSB7DQogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovDQogICAgaWYgKCFpbkJyb3dzZXIgJiYgdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHsNCiAgICAgIC8vIGRldGVjdCBwcmVzZW5jZSBvZiB2dWUtc2VydmVyLXJlbmRlcmVyIGFuZCBhdm9pZA0KICAgICAgLy8gV2VicGFjayBzaGltbWluZyB0aGUgcHJvY2Vzcw0KICAgICAgX2lzU2VydmVyID0gZ2xvYmFsWydwcm9jZXNzJ10uZW52LlZVRV9FTlYgPT09ICdzZXJ2ZXInOw0KICAgIH0gZWxzZSB7DQogICAgICBfaXNTZXJ2ZXIgPSBmYWxzZTsNCiAgICB9DQogIH0NCiAgcmV0dXJuIF9pc1NlcnZlcg0KfTsNCg0KLy8gZGV0ZWN0IGRldnRvb2xzDQp2YXIgZGV2dG9vbHMgPSBpbkJyb3dzZXIgJiYgd2luZG93Ll9fVlVFX0RFVlRPT0xTX0dMT0JBTF9IT09LX187DQoNCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovDQpmdW5jdGlvbiBpc05hdGl2ZSAoQ3Rvcikgew0KICByZXR1cm4gL25hdGl2ZSBjb2RlLy50ZXN0KEN0b3IudG9TdHJpbmcoKSkNCn0NCg0KLyoqDQogKiBEZWZlciBhIHRhc2sgdG8gZXhlY3V0ZSBpdCBhc3luY2hyb25vdXNseS4NCiAqLw0KdmFyIG5leHRUaWNrID0gKGZ1bmN0aW9uICgpIHsNCiAgdmFyIGNhbGxiYWNrcyA9IFtdOw0KICB2YXIgcGVuZGluZyA9IGZhbHNlOw0KICB2YXIgdGltZXJGdW5jOw0KDQogIGZ1bmN0aW9uIG5leHRUaWNrSGFuZGxlciAoKSB7DQogICAgcGVuZGluZyA9IGZhbHNlOw0KICAgIHZhciBjb3BpZXMgPSBjYWxsYmFja3Muc2xpY2UoMCk7DQogICAgY2FsbGJhY2tzLmxlbmd0aCA9IDA7DQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3BpZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgIGNvcGllc1tpXSgpOw0KICAgIH0NCiAgfQ0KDQogIC8vIHRoZSBuZXh0VGljayBiZWhhdmlvciBsZXZlcmFnZXMgdGhlIG1pY3JvdGFzayBxdWV1ZSwgd2hpY2ggY2FuIGJlIGFjY2Vzc2VkDQogIC8vIHZpYSBlaXRoZXIgbmF0aXZlIFByb21pc2UudGhlbiBvciBNdXRhdGlvbk9ic2VydmVyLg0KICAvLyBNdXRhdGlvbk9ic2VydmVyIGhhcyB3aWRlciBzdXBwb3J0LCBob3dldmVyIGl0IGlzIHNlcmlvdXNseSBidWdnZWQgaW4NCiAgLy8gVUlXZWJWaWV3IGluIGlPUyA+PSA5LjMuMyB3aGVuIHRyaWdnZXJlZCBpbiB0b3VjaCBldmVudCBoYW5kbGVycy4gSXQNCiAgLy8gY29tcGxldGVseSBzdG9wcyB3b3JraW5nIGFmdGVyIHRyaWdnZXJpbmcgYSBmZXcgdGltZXMuLi4gc28sIGlmIG5hdGl2ZQ0KICAvLyBQcm9taXNlIGlzIGF2YWlsYWJsZSwgd2Ugd2lsbCB1c2UgaXQ6DQogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLw0KICBpZiAodHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmIGlzTmF0aXZlKFByb21pc2UpKSB7DQogICAgdmFyIHAgPSBQcm9taXNlLnJlc29sdmUoKTsNCiAgICB2YXIgbG9nRXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7IGNvbnNvbGUuZXJyb3IoZXJyKTsgfTsNCiAgICB0aW1lckZ1bmMgPSBmdW5jdGlvbiAoKSB7DQogICAgICBwLnRoZW4obmV4dFRpY2tIYW5kbGVyKS5jYXRjaChsb2dFcnJvcik7DQogICAgICAvLyBpbiBwcm9ibGVtYXRpYyBVSVdlYlZpZXdzLCBQcm9taXNlLnRoZW4gZG9lc24ndCBjb21wbGV0ZWx5IGJyZWFrLCBidXQNCiAgICAgIC8vIGl0IGNhbiBnZXQgc3R1Y2sgaW4gYSB3ZWlyZCBzdGF0ZSB3aGVyZSBjYWxsYmFja3MgYXJlIHB1c2hlZCBpbnRvIHRoZQ0KICAgICAgLy8gbWljcm90YXNrIHF1ZXVlIGJ1dCB0aGUgcXVldWUgaXNuJ3QgYmVpbmcgZmx1c2hlZCwgdW50aWwgdGhlIGJyb3dzZXINCiAgICAgIC8vIG5lZWRzIHRvIGRvIHNvbWUgb3RoZXIgd29yaywgZS5nLiBoYW5kbGUgYSB0aW1lci4gVGhlcmVmb3JlIHdlIGNhbg0KICAgICAgLy8gImZvcmNlIiB0aGUgbWljcm90YXNrIHF1ZXVlIHRvIGJlIGZsdXNoZWQgYnkgYWRkaW5nIGFuIGVtcHR5IHRpbWVyLg0KICAgICAgaWYgKGlzSU9TKSB7IHNldFRpbWVvdXQobm9vcCk7IH0NCiAgICB9Ow0KICB9IGVsc2UgaWYgKHR5cGVvZiBNdXRhdGlvbk9ic2VydmVyICE9PSAndW5kZWZpbmVkJyAmJiAoDQogICAgaXNOYXRpdmUoTXV0YXRpb25PYnNlcnZlcikgfHwNCiAgICAvLyBQaGFudG9tSlMgYW5kIGlPUyA3LngNCiAgICBNdXRhdGlvbk9ic2VydmVyLnRvU3RyaW5nKCkgPT09ICdbb2JqZWN0IE11dGF0aW9uT2JzZXJ2ZXJDb25zdHJ1Y3Rvcl0nDQogICkpIHsNCiAgICAvLyB1c2UgTXV0YXRpb25PYnNlcnZlciB3aGVyZSBuYXRpdmUgUHJvbWlzZSBpcyBub3QgYXZhaWxhYmxlLA0KICAgIC8vIGUuZy4gUGhhbnRvbUpTIElFMTEsIGlPUzcsIEFuZHJvaWQgNC40DQogICAgdmFyIGNvdW50ZXIgPSAxOw0KICAgIHZhciBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG5leHRUaWNrSGFuZGxlcik7DQogICAgdmFyIHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGNvdW50ZXIpKTsNCiAgICBvYnNlcnZlci5vYnNlcnZlKHRleHROb2RlLCB7DQogICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlDQogICAgfSk7DQogICAgdGltZXJGdW5jID0gZnVuY3Rpb24gKCkgew0KICAgICAgY291bnRlciA9IChjb3VudGVyICsgMSkgJSAyOw0KICAgICAgdGV4dE5vZGUuZGF0YSA9IFN0cmluZyhjb3VudGVyKTsNCiAgICB9Ow0KICB9IGVsc2Ugew0KICAgIC8vIGZhbGxiYWNrIHRvIHNldFRpbWVvdXQNCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLw0KICAgIHRpbWVyRnVuYyA9IGZ1bmN0aW9uICgpIHsNCiAgICAgIHNldFRpbWVvdXQobmV4dFRpY2tIYW5kbGVyLCAwKTsNCiAgICB9Ow0KICB9DQoNCiAgcmV0dXJuIGZ1bmN0aW9uIHF1ZXVlTmV4dFRpY2sgKGNiLCBjdHgpIHsNCiAgICB2YXIgX3Jlc29sdmU7DQogICAgY2FsbGJhY2tzLnB1c2goZnVuY3Rpb24gKCkgew0KICAgICAgaWYgKGNiKSB7IGNiLmNhbGwoY3R4KTsgfQ0KICAgICAgaWYgKF9yZXNvbHZlKSB7IF9yZXNvbHZlKGN0eCk7IH0NCiAgICB9KTsNCiAgICBpZiAoIXBlbmRpbmcpIHsNCiAgICAgIHBlbmRpbmcgPSB0cnVlOw0KICAgICAgdGltZXJGdW5jKCk7DQogICAgfQ0KICAgIGlmICghY2IgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7DQogICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsNCiAgICAgICAgX3Jlc29sdmUgPSByZXNvbHZlOw0KICAgICAgfSkNCiAgICB9DQogIH0NCn0pKCk7DQoNCnZhciBfU2V0Ow0KLyogaXN0YW5idWwgaWdub3JlIGlmICovDQppZiAodHlwZW9mIFNldCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoU2V0KSkgew0KICAvLyB1c2UgbmF0aXZlIFNldCB3aGVuIGF2YWlsYWJsZS4NCiAgX1NldCA9IFNldDsNCn0gZWxzZSB7DQogIC8vIGEgbm9uLXN0YW5kYXJkIFNldCBwb2x5ZmlsbCB0aGF0IG9ubHkgd29ya3Mgd2l0aCBwcmltaXRpdmUga2V5cy4NCiAgX1NldCA9IChmdW5jdGlvbiAoKSB7DQogICAgZnVuY3Rpb24gU2V0ICgpIHsNCiAgICAgIHRoaXMuc2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsNCiAgICB9DQogICAgU2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiBoYXMgKGtleSkgew0KICAgICAgcmV0dXJuIHRoaXMuc2V0W2tleV0gIT09IHVuZGVmaW5lZA0KICAgIH07DQogICAgU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQgKGtleSkgew0KICAgICAgdGhpcy5zZXRba2V5XSA9IDE7DQogICAgfTsNCiAgICBTZXQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gY2xlYXIgKCkgew0KICAgICAgdGhpcy5zZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpOw0KICAgIH07DQoNCiAgICByZXR1cm4gU2V0Ow0KICB9KCkpOw0KfQ0KDQp2YXIgd2FybiA9IG5vb3A7DQp2YXIgZm9ybWF0Q29tcG9uZW50TmFtZTsNCg0Kew0KICB2YXIgaGFzQ29uc29sZSA9IHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJzsNCg0KICB3YXJuID0gZnVuY3Rpb24gKG1zZywgdm0pIHsNCiAgICBpZiAoaGFzQ29uc29sZSAmJiAoIWNvbmZpZy5zaWxlbnQpKSB7DQogICAgICBjb25zb2xlLmVycm9yKCJbVnVlIHdhcm5dOiAiICsgbXNnICsgIiAiICsgKA0KICAgICAgICB2bSA/IGZvcm1hdExvY2F0aW9uKGZvcm1hdENvbXBvbmVudE5hbWUodm0pKSA6ICcnDQogICAgICApKTsNCiAgICB9DQogIH07DQoNCiAgZm9ybWF0Q29tcG9uZW50TmFtZSA9IGZ1bmN0aW9uICh2bSkgew0KICAgIGlmICh2bS4kcm9vdCA9PT0gdm0pIHsNCiAgICAgIHJldHVybiAncm9vdCBpbnN0YW5jZScNCiAgICB9DQogICAgdmFyIG5hbWUgPSB2bS5faXNWdWUNCiAgICAgID8gdm0uJG9wdGlvbnMubmFtZSB8fCB2bS4kb3B0aW9ucy5fY29tcG9uZW50VGFnDQogICAgICA6IHZtLm5hbWU7DQogICAgcmV0dXJuICgNCiAgICAgIChuYW1lID8gKCJjb21wb25lbnQgPCIgKyBuYW1lICsgIj4iKSA6ICJhbm9ueW1vdXMgY29tcG9uZW50IikgKw0KICAgICAgKHZtLl9pc1Z1ZSAmJiB2bS4kb3B0aW9ucy5fX2ZpbGUgPyAoIiBhdCAiICsgKHZtLiRvcHRpb25zLl9fZmlsZSkpIDogJycpDQogICAgKQ0KICB9Ow0KDQogIHZhciBmb3JtYXRMb2NhdGlvbiA9IGZ1bmN0aW9uIChzdHIpIHsNCiAgICBpZiAoc3RyID09PSAnYW5vbnltb3VzIGNvbXBvbmVudCcpIHsNCiAgICAgIHN0ciArPSAiIC0gdXNlIHRoZSBcIm5hbWVcIiBvcHRpb24gZm9yIGJldHRlciBkZWJ1Z2dpbmcgbWVzc2FnZXMuIjsNCiAgICB9DQogICAgcmV0dXJuICgiXG4oZm91bmQgaW4gIiArIHN0ciArICIpIikNCiAgfTsNCn0NCg0KLyogICovDQoNCg0KdmFyIHVpZCQxID0gMDsNCg0KLyoqDQogKiBBIGRlcCBpcyBhbiBvYnNlcnZhYmxlIHRoYXQgY2FuIGhhdmUgbXVsdGlwbGUNCiAqIGRpcmVjdGl2ZXMgc3Vic2NyaWJpbmcgdG8gaXQuDQogKi8NCnZhciBEZXAgPSBmdW5jdGlvbiBEZXAgKCkgew0KICB0aGlzLmlkID0gdWlkJDErKzsNCiAgdGhpcy5zdWJzID0gW107DQp9Ow0KDQpEZXAucHJvdG90eXBlLmFkZFN1YiA9IGZ1bmN0aW9uIGFkZFN1YiAoc3ViKSB7DQogIHRoaXMuc3Vicy5wdXNoKHN1Yik7DQp9Ow0KDQpEZXAucHJvdG90eXBlLnJlbW92ZVN1YiA9IGZ1bmN0aW9uIHJlbW92ZVN1YiAoc3ViKSB7DQogIHJlbW92ZSQxKHRoaXMuc3Vicywgc3ViKTsNCn07DQoNCkRlcC5wcm90b3R5cGUuZGVwZW5kID0gZnVuY3Rpb24gZGVwZW5kICgpIHsNCiAgaWYgKERlcC50YXJnZXQpIHsNCiAgICBEZXAudGFyZ2V0LmFkZERlcCh0aGlzKTsNCiAgfQ0KfTsNCg0KRGVwLnByb3RvdHlwZS5ub3RpZnkgPSBmdW5jdGlvbiBub3RpZnkgKCkgew0KICAvLyBzdGFibGl6ZSB0aGUgc3Vic2NyaWJlciBsaXN0IGZpcnN0DQogIHZhciBzdWJzID0gdGhpcy5zdWJzLnNsaWNlKCk7DQogIGZvciAodmFyIGkgPSAwLCBsID0gc3Vicy5sZW5ndGg7IGkgPCBsOyBpKyspIHsNCiAgICBzdWJzW2ldLnVwZGF0ZSgpOw0KICB9DQp9Ow0KDQovLyB0aGUgY3VycmVudCB0YXJnZXQgd2F0Y2hlciBiZWluZyBldmFsdWF0ZWQuDQovLyB0aGlzIGlzIGdsb2JhbGx5IHVuaXF1ZSBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG9ubHkgb25lDQovLyB3YXRjaGVyIGJlaW5nIGV2YWx1YXRlZCBhdCBhbnkgdGltZS4NCkRlcC50YXJnZXQgPSBudWxsOw0KdmFyIHRhcmdldFN0YWNrID0gW107DQoNCmZ1bmN0aW9uIHB1c2hUYXJnZXQgKF90YXJnZXQpIHsNCiAgaWYgKERlcC50YXJnZXQpIHsgdGFyZ2V0U3RhY2sucHVzaChEZXAudGFyZ2V0KTsgfQ0KICBEZXAudGFyZ2V0ID0gX3RhcmdldDsNCn0NCg0KZnVuY3Rpb24gcG9wVGFyZ2V0ICgpIHsNCiAgRGVwLnRhcmdldCA9IHRhcmdldFN0YWNrLnBvcCgpOw0KfQ0KDQovKg0KICogbm90IHR5cGUgY2hlY2tpbmcgdGhpcyBmaWxlIGJlY2F1c2UgZmxvdyBkb2Vzbid0IHBsYXkgd2VsbCB3aXRoDQogKiBkeW5hbWljYWxseSBhY2Nlc3NpbmcgbWV0aG9kcyBvbiBBcnJheSBwcm90b3R5cGUNCiAqLw0KDQp2YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTsNCnZhciBhcnJheU1ldGhvZHMgPSBPYmplY3QuY3JlYXRlKGFycmF5UHJvdG8pO1sNCiAgJ3B1c2gnLA0KICAncG9wJywNCiAgJ3NoaWZ0JywNCiAgJ3Vuc2hpZnQnLA0KICAnc3BsaWNlJywNCiAgJ3NvcnQnLA0KICAncmV2ZXJzZScNCl0NCi5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHsNCiAgLy8gY2FjaGUgb3JpZ2luYWwgbWV0aG9kDQogIHZhciBvcmlnaW5hbCA9IGFycmF5UHJvdG9bbWV0aG9kXTsNCiAgZGVmKGFycmF5TWV0aG9kcywgbWV0aG9kLCBmdW5jdGlvbiBtdXRhdG9yICgpIHsNCiAgICB2YXIgYXJndW1lbnRzJDEgPSBhcmd1bWVudHM7DQoNCiAgICAvLyBhdm9pZCBsZWFraW5nIGFyZ3VtZW50czoNCiAgICAvLyBodHRwOi8vanNwZXJmLmNvbS9jbG9zdXJlLXdpdGgtYXJndW1lbnRzDQogICAgdmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoOw0KICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGkpOw0KICAgIHdoaWxlIChpLS0pIHsNCiAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHMkMVtpXTsNCiAgICB9DQogICAgdmFyIHJlc3VsdCA9IG9yaWdpbmFsLmFwcGx5KHRoaXMsIGFyZ3MpOw0KICAgIHZhciBvYiA9IHRoaXMuX19vYl9fOw0KICAgIHZhciBpbnNlcnRlZDsNCiAgICBzd2l0Y2ggKG1ldGhvZCkgew0KICAgICAgY2FzZSAncHVzaCc6DQogICAgICAgIGluc2VydGVkID0gYXJnczsNCiAgICAgICAgYnJlYWsNCiAgICAgIGNhc2UgJ3Vuc2hpZnQnOg0KICAgICAgICBpbnNlcnRlZCA9IGFyZ3M7DQogICAgICAgIGJyZWFrDQogICAgICBjYXNlICdzcGxpY2UnOg0KICAgICAgICBpbnNlcnRlZCA9IGFyZ3Muc2xpY2UoMik7DQogICAgICAgIGJyZWFrDQogICAgfQ0KICAgIGlmIChpbnNlcnRlZCkgeyBvYi5vYnNlcnZlQXJyYXkoaW5zZXJ0ZWQpOyB9DQogICAgLy8gbm90aWZ5IGNoYW5nZQ0KICAgIG9iLmRlcC5ub3RpZnkoKTsNCiAgICByZXR1cm4gcmVzdWx0DQogIH0pOw0KfSk7DQoNCi8qICAqLw0KDQp2YXIgYXJyYXlLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYXJyYXlNZXRob2RzKTsNCg0KLyoqDQogKiBCeSBkZWZhdWx0LCB3aGVuIGEgcmVhY3RpdmUgcHJvcGVydHkgaXMgc2V0LCB0aGUgbmV3IHZhbHVlIGlzDQogKiBhbHNvIGNvbnZlcnRlZCB0byBiZWNvbWUgcmVhY3RpdmUuIEhvd2V2ZXIgd2hlbiBwYXNzaW5nIGRvd24gcHJvcHMsDQogKiB3ZSBkb24ndCB3YW50IHRvIGZvcmNlIGNvbnZlcnNpb24gYmVjYXVzZSB0aGUgdmFsdWUgbWF5IGJlIGEgbmVzdGVkIHZhbHVlDQogKiB1bmRlciBhIGZyb3plbiBkYXRhIHN0cnVjdHVyZS4gQ29udmVydGluZyBpdCB3b3VsZCBkZWZlYXQgdGhlIG9wdGltaXphdGlvbi4NCiAqLw0KdmFyIG9ic2VydmVyU3RhdGUgPSB7DQogIHNob3VsZENvbnZlcnQ6IHRydWUsDQogIGlzU2V0dGluZ1Byb3BzOiBmYWxzZQ0KfTsNCg0KLyoqDQogKiBPYnNlcnZlciBjbGFzcyB0aGF0IGFyZSBhdHRhY2hlZCB0byBlYWNoIG9ic2VydmVkDQogKiBvYmplY3QuIE9uY2UgYXR0YWNoZWQsIHRoZSBvYnNlcnZlciBjb252ZXJ0cyB0YXJnZXQNCiAqIG9iamVjdCdzIHByb3BlcnR5IGtleXMgaW50byBnZXR0ZXIvc2V0dGVycyB0aGF0DQogKiBjb2xsZWN0IGRlcGVuZGVuY2llcyBhbmQgZGlzcGF0Y2hlcyB1cGRhdGVzLg0KICovDQp2YXIgT2JzZXJ2ZXIgPSBmdW5jdGlvbiBPYnNlcnZlciAodmFsdWUpIHsNCiAgdGhpcy52YWx1ZSA9IHZhbHVlOw0KICB0aGlzLmRlcCA9IG5ldyBEZXAoKTsNCiAgdGhpcy52bUNvdW50ID0gMDsNCiAgZGVmKHZhbHVlLCAnX19vYl9fJywgdGhpcyk7DQogIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgew0KICAgIHZhciBhdWdtZW50ID0gaGFzUHJvdG8NCiAgICAgID8gcHJvdG9BdWdtZW50DQogICAgICA6IGNvcHlBdWdtZW50Ow0KICAgIGF1Z21lbnQodmFsdWUsIGFycmF5TWV0aG9kcywgYXJyYXlLZXlzKTsNCiAgICB0aGlzLm9ic2VydmVBcnJheSh2YWx1ZSk7DQogIH0gZWxzZSB7DQogICAgdGhpcy53YWxrKHZhbHVlKTsNCiAgfQ0KfTsNCg0KLyoqDQogKiBXYWxrIHRocm91Z2ggZWFjaCBwcm9wZXJ0eSBhbmQgY29udmVydCB0aGVtIGludG8NCiAqIGdldHRlci9zZXR0ZXJzLiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbg0KICogdmFsdWUgdHlwZSBpcyBPYmplY3QuDQogKi8NCk9ic2VydmVyLnByb3RvdHlwZS53YWxrID0gZnVuY3Rpb24gd2FsayAob2JqKSB7DQogIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTsNCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7DQogICAgZGVmaW5lUmVhY3RpdmUkJDEob2JqLCBrZXlzW2ldLCBvYmpba2V5c1tpXV0pOw0KICB9DQp9Ow0KDQovKioNCiAqIE9ic2VydmUgYSBsaXN0IG9mIEFycmF5IGl0ZW1zLg0KICovDQpPYnNlcnZlci5wcm90b3R5cGUub2JzZXJ2ZUFycmF5ID0gZnVuY3Rpb24gb2JzZXJ2ZUFycmF5IChpdGVtcykgew0KICBmb3IgKHZhciBpID0gMCwgbCA9IGl0ZW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgew0KICAgIG9ic2VydmUoaXRlbXNbaV0pOw0KICB9DQp9Ow0KDQovLyBoZWxwZXJzDQoNCi8qKg0KICogQXVnbWVudCBhbiB0YXJnZXQgT2JqZWN0IG9yIEFycmF5IGJ5IGludGVyY2VwdGluZw0KICogdGhlIHByb3RvdHlwZSBjaGFpbiB1c2luZyBfX3Byb3RvX18NCiAqLw0KZnVuY3Rpb24gcHJvdG9BdWdtZW50ICh0YXJnZXQsIHNyYykgew0KICAvKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqLw0KICB0YXJnZXQuX19wcm90b19fID0gc3JjOw0KICAvKiBlc2xpbnQtZW5hYmxlIG5vLXByb3RvICovDQp9DQoNCi8qKg0KICogQXVnbWVudCBhbiB0YXJnZXQgT2JqZWN0IG9yIEFycmF5IGJ5IGRlZmluaW5nDQogKiBoaWRkZW4gcHJvcGVydGllcy4NCiAqDQogKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dA0KICovDQpmdW5jdGlvbiBjb3B5QXVnbWVudCAodGFyZ2V0LCBzcmMsIGtleXMpIHsNCiAgZm9yICh2YXIgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykgew0KICAgIHZhciBrZXkgPSBrZXlzW2ldOw0KICAgIGRlZih0YXJnZXQsIGtleSwgc3JjW2tleV0pOw0KICB9DQp9DQoNCi8qKg0KICogQXR0ZW1wdCB0byBjcmVhdGUgYW4gb2JzZXJ2ZXIgaW5zdGFuY2UgZm9yIGEgdmFsdWUsDQogKiByZXR1cm5zIHRoZSBuZXcgb2JzZXJ2ZXIgaWYgc3VjY2Vzc2Z1bGx5IG9ic2VydmVkLA0KICogb3IgdGhlIGV4aXN0aW5nIG9ic2VydmVyIGlmIHRoZSB2YWx1ZSBhbHJlYWR5IGhhcyBvbmUuDQogKi8NCmZ1bmN0aW9uIG9ic2VydmUgKHZhbHVlKSB7DQogIGlmICghaXNPYmplY3QodmFsdWUpKSB7DQogICAgcmV0dXJuDQogIH0NCiAgdmFyIG9iOw0KICBpZiAoaGFzT3duKHZhbHVlLCAnX19vYl9fJykgJiYgdmFsdWUuX19vYl9fIGluc3RhbmNlb2YgT2JzZXJ2ZXIpIHsNCiAgICBvYiA9IHZhbHVlLl9fb2JfXzsNCiAgfSBlbHNlIGlmICgNCiAgICBvYnNlcnZlclN0YXRlLnNob3VsZENvbnZlcnQgJiYNCiAgICAhaXNTZXJ2ZXJSZW5kZXJpbmcoKSAmJg0KICAgIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCBpc1BsYWluT2JqZWN0KHZhbHVlKSkgJiYNCiAgICBPYmplY3QuaXNFeHRlbnNpYmxlKHZhbHVlKSAmJg0KICAgICF2YWx1ZS5faXNWdWUNCiAgKSB7DQogICAgb2IgPSBuZXcgT2JzZXJ2ZXIodmFsdWUpOw0KICB9DQogIHJldHVybiBvYg0KfQ0KDQovKioNCiAqIERlZmluZSBhIHJlYWN0aXZlIHByb3BlcnR5IG9uIGFuIE9iamVjdC4NCiAqLw0KZnVuY3Rpb24gZGVmaW5lUmVhY3RpdmUkJDEgKA0KICBvYmosDQogIGtleSwNCiAgdmFsLA0KICBjdXN0b21TZXR0ZXINCikgew0KICB2YXIgZGVwID0gbmV3IERlcCgpOw0KDQogIHZhciBwcm9wZXJ0eSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpOw0KICBpZiAocHJvcGVydHkgJiYgcHJvcGVydHkuY29uZmlndXJhYmxlID09PSBmYWxzZSkgew0KICAgIHJldHVybg0KICB9DQoNCiAgLy8gY2F0ZXIgZm9yIHByZS1kZWZpbmVkIGdldHRlci9zZXR0ZXJzDQogIHZhciBnZXR0ZXIgPSBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5nZXQ7DQogIHZhciBzZXR0ZXIgPSBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5zZXQ7DQoNCiAgdmFyIGNoaWxkT2IgPSBvYnNlcnZlKHZhbCk7DQogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgew0KICAgIGVudW1lcmFibGU6IHRydWUsDQogICAgY29uZmlndXJhYmxlOiB0cnVlLA0KICAgIGdldDogZnVuY3Rpb24gcmVhY3RpdmVHZXR0ZXIgKCkgew0KICAgICAgdmFyIHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbDsNCiAgICAgIGlmIChEZXAudGFyZ2V0KSB7DQogICAgICAgIGRlcC5kZXBlbmQoKTsNCiAgICAgICAgaWYgKGNoaWxkT2IpIHsNCiAgICAgICAgICBjaGlsZE9iLmRlcC5kZXBlbmQoKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsNCiAgICAgICAgICBkZXBlbmRBcnJheSh2YWx1ZSk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHJldHVybiB2YWx1ZQ0KICAgIH0sDQogICAgc2V0OiBmdW5jdGlvbiByZWFjdGl2ZVNldHRlciAobmV3VmFsKSB7DQogICAgICB2YXIgdmFsdWUgPSBnZXR0ZXIgPyBnZXR0ZXIuY2FsbChvYmopIDogdmFsOw0KICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tc2VsZi1jb21wYXJlICovDQogICAgICBpZiAobmV3VmFsID09PSB2YWx1ZSB8fCAobmV3VmFsICE9PSBuZXdWYWwgJiYgdmFsdWUgIT09IHZhbHVlKSkgew0KICAgICAgICByZXR1cm4NCiAgICAgIH0NCiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tc2VsZi1jb21wYXJlICovDQogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGN1c3RvbVNldHRlcikgew0KICAgICAgICBjdXN0b21TZXR0ZXIoKTsNCiAgICAgIH0NCiAgICAgIGlmIChzZXR0ZXIpIHsNCiAgICAgICAgc2V0dGVyLmNhbGwob2JqLCBuZXdWYWwpOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdmFsID0gbmV3VmFsOw0KICAgICAgfQ0KICAgICAgY2hpbGRPYiA9IG9ic2VydmUobmV3VmFsKTsNCiAgICAgIGRlcC5ub3RpZnkoKTsNCiAgICB9DQogIH0pOw0KfQ0KDQovKioNCiAqIFNldCBhIHByb3BlcnR5IG9uIGFuIG9iamVjdC4gQWRkcyB0aGUgbmV3IHByb3BlcnR5IGFuZA0KICogdHJpZ2dlcnMgY2hhbmdlIG5vdGlmaWNhdGlvbiBpZiB0aGUgcHJvcGVydHkgZG9lc24ndA0KICogYWxyZWFkeSBleGlzdC4NCiAqLw0KZnVuY3Rpb24gc2V0JDEgKG9iaiwga2V5LCB2YWwpIHsNCiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgew0KICAgIG9iai5sZW5ndGggPSBNYXRoLm1heChvYmoubGVuZ3RoLCBrZXkpOw0KICAgIG9iai5zcGxpY2Uoa2V5LCAxLCB2YWwpOw0KICAgIHJldHVybiB2YWwNCiAgfQ0KICBpZiAoaGFzT3duKG9iaiwga2V5KSkgew0KICAgIG9ialtrZXldID0gdmFsOw0KICAgIHJldHVybg0KICB9DQogIHZhciBvYiA9IG9iai5fX29iX187DQogIGlmIChvYmouX2lzVnVlIHx8IChvYiAmJiBvYi52bUNvdW50KSkgew0KICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKA0KICAgICAgJ0F2b2lkIGFkZGluZyByZWFjdGl2ZSBwcm9wZXJ0aWVzIHRvIGEgVnVlIGluc3RhbmNlIG9yIGl0cyByb290ICRkYXRhICcgKw0KICAgICAgJ2F0IHJ1bnRpbWUgLSBkZWNsYXJlIGl0IHVwZnJvbnQgaW4gdGhlIGRhdGEgb3B0aW9uLicNCiAgICApOw0KICAgIHJldHVybg0KICB9DQogIGlmICghb2IpIHsNCiAgICBvYmpba2V5XSA9IHZhbDsNCiAgICByZXR1cm4NCiAgfQ0KICBkZWZpbmVSZWFjdGl2ZSQkMShvYi52YWx1ZSwga2V5LCB2YWwpOw0KICBvYi5kZXAubm90aWZ5KCk7DQogIHJldHVybiB2YWwNCn0NCg0KLyoqDQogKiBEZWxldGUgYSBwcm9wZXJ0eSBhbmQgdHJpZ2dlciBjaGFuZ2UgaWYgbmVjZXNzYXJ5Lg0KICovDQpmdW5jdGlvbiBkZWwgKG9iaiwga2V5KSB7DQogIHZhciBvYiA9IG9iai5fX29iX187DQogIGlmIChvYmouX2lzVnVlIHx8IChvYiAmJiBvYi52bUNvdW50KSkgew0KICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKA0KICAgICAgJ0F2b2lkIGRlbGV0aW5nIHByb3BlcnRpZXMgb24gYSBWdWUgaW5zdGFuY2Ugb3IgaXRzIHJvb3QgJGRhdGEgJyArDQogICAgICAnLSBqdXN0IHNldCBpdCB0byBudWxsLicNCiAgICApOw0KICAgIHJldHVybg0KICB9DQogIGlmICghaGFzT3duKG9iaiwga2V5KSkgew0KICAgIHJldHVybg0KICB9DQogIGRlbGV0ZSBvYmpba2V5XTsNCiAgaWYgKCFvYikgew0KICAgIHJldHVybg0KICB9DQogIG9iLmRlcC5ub3RpZnkoKTsNCn0NCg0KLyoqDQogKiBDb2xsZWN0IGRlcGVuZGVuY2llcyBvbiBhcnJheSBlbGVtZW50cyB3aGVuIHRoZSBhcnJheSBpcyB0b3VjaGVkLCBzaW5jZQ0KICogd2UgY2Fubm90IGludGVyY2VwdCBhcnJheSBlbGVtZW50IGFjY2VzcyBsaWtlIHByb3BlcnR5IGdldHRlcnMuDQogKi8NCmZ1bmN0aW9uIGRlcGVuZEFycmF5ICh2YWx1ZSkgew0KICBmb3IgKHZhciBlID0gKHZvaWQgMCksIGkgPSAwLCBsID0gdmFsdWUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7DQogICAgZSA9IHZhbHVlW2ldOw0KICAgIGUgJiYgZS5fX29iX18gJiYgZS5fX29iX18uZGVwLmRlcGVuZCgpOw0KICAgIGlmIChBcnJheS5pc0FycmF5KGUpKSB7DQogICAgICBkZXBlbmRBcnJheShlKTsNCiAgICB9DQogIH0NCn0NCg0KLyogICovDQoNCi8qKg0KICogT3B0aW9uIG92ZXJ3cml0aW5nIHN0cmF0ZWdpZXMgYXJlIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZQ0KICogaG93IHRvIG1lcmdlIGEgcGFyZW50IG9wdGlvbiB2YWx1ZSBhbmQgYSBjaGlsZCBvcHRpb24NCiAqIHZhbHVlIGludG8gdGhlIGZpbmFsIHZhbHVlLg0KICovDQp2YXIgc3RyYXRzID0gY29uZmlnLm9wdGlvbk1lcmdlU3RyYXRlZ2llczsNCg0KLyoqDQogKiBPcHRpb25zIHdpdGggcmVzdHJpY3Rpb25zDQogKi8NCnsNCiAgc3RyYXRzLmVsID0gc3RyYXRzLnByb3BzRGF0YSA9IGZ1bmN0aW9uIChwYXJlbnQsIGNoaWxkLCB2bSwga2V5KSB7DQogICAgaWYgKCF2bSkgew0KICAgICAgd2FybigNCiAgICAgICAgIm9wdGlvbiBcIiIgKyBrZXkgKyAiXCIgY2FuIG9ubHkgYmUgdXNlZCBkdXJpbmcgaW5zdGFuY2UgIiArDQogICAgICAgICdjcmVhdGlvbiB3aXRoIHRoZSBgbmV3YCBrZXl3b3JkLicNCiAgICAgICk7DQogICAgfQ0KICAgIHJldHVybiBkZWZhdWx0U3RyYXQocGFyZW50LCBjaGlsZCkNCiAgfTsNCn0NCg0KLyoqDQogKiBIZWxwZXIgdGhhdCByZWN1cnNpdmVseSBtZXJnZXMgdHdvIGRhdGEgb2JqZWN0cyB0b2dldGhlci4NCiAqLw0KZnVuY3Rpb24gbWVyZ2VEYXRhICh0bywgZnJvbSkgew0KICBpZiAoIWZyb20pIHsgcmV0dXJuIHRvIH0NCiAgdmFyIGtleSwgdG9WYWwsIGZyb21WYWw7DQogIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZnJvbSk7DQogIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgew0KICAgIGtleSA9IGtleXNbaV07DQogICAgdG9WYWwgPSB0b1trZXldOw0KICAgIGZyb21WYWwgPSBmcm9tW2tleV07DQogICAgaWYgKCFoYXNPd24odG8sIGtleSkpIHsNCiAgICAgIHNldCQxKHRvLCBrZXksIGZyb21WYWwpOw0KICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdCh0b1ZhbCkgJiYgaXNQbGFpbk9iamVjdChmcm9tVmFsKSkgew0KICAgICAgbWVyZ2VEYXRhKHRvVmFsLCBmcm9tVmFsKTsNCiAgICB9DQogIH0NCiAgcmV0dXJuIHRvDQp9DQoNCi8qKg0KICogRGF0YQ0KICovDQpzdHJhdHMuZGF0YSA9IGZ1bmN0aW9uICgNCiAgcGFyZW50VmFsLA0KICBjaGlsZFZhbCwNCiAgdm0NCikgew0KICBpZiAoIXZtKSB7DQogICAgLy8gaW4gYSBWdWUuZXh0ZW5kIG1lcmdlLCBib3RoIHNob3VsZCBiZSBmdW5jdGlvbnMNCiAgICBpZiAoIWNoaWxkVmFsKSB7DQogICAgICByZXR1cm4gcGFyZW50VmFsDQogICAgfQ0KICAgIGlmICh0eXBlb2YgY2hpbGRWYWwgIT09ICdmdW5jdGlvbicpIHsNCiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKA0KICAgICAgICAnVGhlICJkYXRhIiBvcHRpb24gc2hvdWxkIGJlIGEgZnVuY3Rpb24gJyArDQogICAgICAgICd0aGF0IHJldHVybnMgYSBwZXItaW5zdGFuY2UgdmFsdWUgaW4gY29tcG9uZW50ICcgKw0KICAgICAgICAnZGVmaW5pdGlvbnMuJywNCiAgICAgICAgdm0NCiAgICAgICk7DQogICAgICByZXR1cm4gcGFyZW50VmFsDQogICAgfQ0KICAgIGlmICghcGFyZW50VmFsKSB7DQogICAgICByZXR1cm4gY2hpbGRWYWwNCiAgICB9DQogICAgLy8gd2hlbiBwYXJlbnRWYWwgJiBjaGlsZFZhbCBhcmUgYm90aCBwcmVzZW50LA0KICAgIC8vIHdlIG5lZWQgdG8gcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZQ0KICAgIC8vIG1lcmdlZCByZXN1bHQgb2YgYm90aCBmdW5jdGlvbnMuLi4gbm8gbmVlZCB0bw0KICAgIC8vIGNoZWNrIGlmIHBhcmVudFZhbCBpcyBhIGZ1bmN0aW9uIGhlcmUgYmVjYXVzZQ0KICAgIC8vIGl0IGhhcyB0byBiZSBhIGZ1bmN0aW9uIHRvIHBhc3MgcHJldmlvdXMgbWVyZ2VzLg0KICAgIHJldHVybiBmdW5jdGlvbiBtZXJnZWREYXRhRm4gKCkgew0KICAgICAgcmV0dXJuIG1lcmdlRGF0YSgNCiAgICAgICAgY2hpbGRWYWwuY2FsbCh0aGlzKSwNCiAgICAgICAgcGFyZW50VmFsLmNhbGwodGhpcykNCiAgICAgICkNCiAgICB9DQogIH0gZWxzZSBpZiAocGFyZW50VmFsIHx8IGNoaWxkVmFsKSB7DQogICAgcmV0dXJuIGZ1bmN0aW9uIG1lcmdlZEluc3RhbmNlRGF0YUZuICgpIHsNCiAgICAgIC8vIGluc3RhbmNlIG1lcmdlDQogICAgICB2YXIgaW5zdGFuY2VEYXRhID0gdHlwZW9mIGNoaWxkVmFsID09PSAnZnVuY3Rpb24nDQogICAgICAgID8gY2hpbGRWYWwuY2FsbCh2bSkNCiAgICAgICAgOiBjaGlsZFZhbDsNCiAgICAgIHZhciBkZWZhdWx0RGF0YSA9IHR5cGVvZiBwYXJlbnRWYWwgPT09ICdmdW5jdGlvbicNCiAgICAgICAgPyBwYXJlbnRWYWwuY2FsbCh2bSkNCiAgICAgICAgOiB1bmRlZmluZWQ7DQogICAgICBpZiAoaW5zdGFuY2VEYXRhKSB7DQogICAgICAgIHJldHVybiBtZXJnZURhdGEoaW5zdGFuY2VEYXRhLCBkZWZhdWx0RGF0YSkNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiBkZWZhdWx0RGF0YQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfTsNCg0KLyoqDQogKiBIb29rcyBhbmQgcGFyYW0gYXR0cmlidXRlcyBhcmUgbWVyZ2VkIGFzIGFycmF5cy4NCiAqLw0KZnVuY3Rpb24gbWVyZ2VIb29rICgNCiAgcGFyZW50VmFsLA0KICBjaGlsZFZhbA0KKSB7DQogIHJldHVybiBjaGlsZFZhbA0KICAgID8gcGFyZW50VmFsDQogICAgICA/IHBhcmVudFZhbC5jb25jYXQoY2hpbGRWYWwpDQogICAgICA6IEFycmF5LmlzQXJyYXkoY2hpbGRWYWwpDQogICAgICAgID8gY2hpbGRWYWwNCiAgICAgICAgOiBbY2hpbGRWYWxdDQogICAgOiBwYXJlbnRWYWwNCn0NCg0KY29uZmlnLl9saWZlY3ljbGVIb29rcy5mb3JFYWNoKGZ1bmN0aW9uIChob29rKSB7DQogIHN0cmF0c1tob29rXSA9IG1lcmdlSG9vazsNCn0pOw0KDQovKioNCiAqIEFzc2V0cw0KICoNCiAqIFdoZW4gYSB2bSBpcyBwcmVzZW50IChpbnN0YW5jZSBjcmVhdGlvbiksIHdlIG5lZWQgdG8gZG8NCiAqIGEgdGhyZWUtd2F5IG1lcmdlIGJldHdlZW4gY29uc3RydWN0b3Igb3B0aW9ucywgaW5zdGFuY2UNCiAqIG9wdGlvbnMgYW5kIHBhcmVudCBvcHRpb25zLg0KICovDQpmdW5jdGlvbiBtZXJnZUFzc2V0cyAocGFyZW50VmFsLCBjaGlsZFZhbCkgew0KICB2YXIgcmVzID0gT2JqZWN0LmNyZWF0ZShwYXJlbnRWYWwgfHwgbnVsbCk7DQogIHJldHVybiBjaGlsZFZhbA0KICAgID8gZXh0ZW5kKHJlcywgY2hpbGRWYWwpDQogICAgOiByZXMNCn0NCg0KY29uZmlnLl9hc3NldFR5cGVzLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHsNCiAgc3RyYXRzW3R5cGUgKyAncyddID0gbWVyZ2VBc3NldHM7DQp9KTsNCg0KLyoqDQogKiBXYXRjaGVycy4NCiAqDQogKiBXYXRjaGVycyBoYXNoZXMgc2hvdWxkIG5vdCBvdmVyd3JpdGUgb25lDQogKiBhbm90aGVyLCBzbyB3ZSBtZXJnZSB0aGVtIGFzIGFycmF5cy4NCiAqLw0Kc3RyYXRzLndhdGNoID0gZnVuY3Rpb24gKHBhcmVudFZhbCwgY2hpbGRWYWwpIHsNCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovDQogIGlmICghY2hpbGRWYWwpIHsgcmV0dXJuIHBhcmVudFZhbCB9DQogIGlmICghcGFyZW50VmFsKSB7IHJldHVybiBjaGlsZFZhbCB9DQogIHZhciByZXQgPSB7fTsNCiAgZXh0ZW5kKHJldCwgcGFyZW50VmFsKTsNCiAgZm9yICh2YXIga2V5IGluIGNoaWxkVmFsKSB7DQogICAgdmFyIHBhcmVudCA9IHJldFtrZXldOw0KICAgIHZhciBjaGlsZCA9IGNoaWxkVmFsW2tleV07DQogICAgaWYgKHBhcmVudCAmJiAhQXJyYXkuaXNBcnJheShwYXJlbnQpKSB7DQogICAgICBwYXJlbnQgPSBbcGFyZW50XTsNCiAgICB9DQogICAgcmV0W2tleV0gPSBwYXJlbnQNCiAgICAgID8gcGFyZW50LmNvbmNhdChjaGlsZCkNCiAgICAgIDogW2NoaWxkXTsNCiAgfQ0KICByZXR1cm4gcmV0DQp9Ow0KDQovKioNCiAqIE90aGVyIG9iamVjdCBoYXNoZXMuDQogKi8NCnN0cmF0cy5wcm9wcyA9DQpzdHJhdHMubWV0aG9kcyA9DQpzdHJhdHMuY29tcHV0ZWQgPSBmdW5jdGlvbiAocGFyZW50VmFsLCBjaGlsZFZhbCkgew0KICBpZiAoIWNoaWxkVmFsKSB7IHJldHVybiBwYXJlbnRWYWwgfQ0KICBpZiAoIXBhcmVudFZhbCkgeyByZXR1cm4gY2hpbGRWYWwgfQ0KICB2YXIgcmV0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsNCiAgZXh0ZW5kKHJldCwgcGFyZW50VmFsKTsNCiAgZXh0ZW5kKHJldCwgY2hpbGRWYWwpOw0KICByZXR1cm4gcmV0DQp9Ow0KDQovKioNCiAqIERlZmF1bHQgc3RyYXRlZ3kuDQogKi8NCnZhciBkZWZhdWx0U3RyYXQgPSBmdW5jdGlvbiAocGFyZW50VmFsLCBjaGlsZFZhbCkgew0KICByZXR1cm4gY2hpbGRWYWwgPT09IHVuZGVmaW5lZA0KICAgID8gcGFyZW50VmFsDQogICAgOiBjaGlsZFZhbA0KfTsNCg0KLyoqDQogKiBWYWxpZGF0ZSBjb21wb25lbnQgbmFtZXMNCiAqLw0KZnVuY3Rpb24gY2hlY2tDb21wb25lbnRzIChvcHRpb25zKSB7DQogIGZvciAodmFyIGtleSBpbiBvcHRpb25zLmNvbXBvbmVudHMpIHsNCiAgICB2YXIgbG93ZXIgPSBrZXkudG9Mb3dlckNhc2UoKTsNCiAgICBpZiAoaXNCdWlsdEluVGFnKGxvd2VyKSB8fCBjb25maWcuaXNSZXNlcnZlZFRhZyhsb3dlcikpIHsNCiAgICAgIHdhcm4oDQogICAgICAgICdEbyBub3QgdXNlIGJ1aWx0LWluIG9yIHJlc2VydmVkIEhUTUwgZWxlbWVudHMgYXMgY29tcG9uZW50ICcgKw0KICAgICAgICAnaWQ6ICcgKyBrZXkNCiAgICAgICk7DQogICAgfQ0KICB9DQp9DQoNCi8qKg0KICogRW5zdXJlIGFsbCBwcm9wcyBvcHRpb24gc3ludGF4IGFyZSBub3JtYWxpemVkIGludG8gdGhlDQogKiBPYmplY3QtYmFzZWQgZm9ybWF0Lg0KICovDQpmdW5jdGlvbiBub3JtYWxpemVQcm9wcyAob3B0aW9ucykgew0KICB2YXIgcHJvcHMgPSBvcHRpb25zLnByb3BzOw0KICBpZiAoIXByb3BzKSB7IHJldHVybiB9DQogIHZhciByZXMgPSB7fTsNCiAgdmFyIGksIHZhbCwgbmFtZTsNCiAgaWYgKEFycmF5LmlzQXJyYXkocHJvcHMpKSB7DQogICAgaSA9IHByb3BzLmxlbmd0aDsNCiAgICB3aGlsZSAoaS0tKSB7DQogICAgICB2YWwgPSBwcm9wc1tpXTsNCiAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgew0KICAgICAgICBuYW1lID0gY2FtZWxpemUodmFsKTsNCiAgICAgICAgcmVzW25hbWVdID0geyB0eXBlOiBudWxsIH07DQogICAgICB9IGVsc2Ugew0KICAgICAgICB3YXJuKCdwcm9wcyBtdXN0IGJlIHN0cmluZ3Mgd2hlbiB1c2luZyBhcnJheSBzeW50YXguJyk7DQogICAgICB9DQogICAgfQ0KICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QocHJvcHMpKSB7DQogICAgZm9yICh2YXIga2V5IGluIHByb3BzKSB7DQogICAgICB2YWwgPSBwcm9wc1trZXldOw0KICAgICAgbmFtZSA9IGNhbWVsaXplKGtleSk7DQogICAgICByZXNbbmFtZV0gPSBpc1BsYWluT2JqZWN0KHZhbCkNCiAgICAgICAgPyB2YWwNCiAgICAgICAgOiB7IHR5cGU6IHZhbCB9Ow0KICAgIH0NCiAgfQ0KICBvcHRpb25zLnByb3BzID0gcmVzOw0KfQ0KDQovKioNCiAqIE5vcm1hbGl6ZSByYXcgZnVuY3Rpb24gZGlyZWN0aXZlcyBpbnRvIG9iamVjdCBmb3JtYXQuDQogKi8NCmZ1bmN0aW9uIG5vcm1hbGl6ZURpcmVjdGl2ZXMgKG9wdGlvbnMpIHsNCiAgdmFyIGRpcnMgPSBvcHRpb25zLmRpcmVjdGl2ZXM7DQogIGlmIChkaXJzKSB7DQogICAgZm9yICh2YXIga2V5IGluIGRpcnMpIHsNCiAgICAgIHZhciBkZWYgPSBkaXJzW2tleV07DQogICAgICBpZiAodHlwZW9mIGRlZiA9PT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICBkaXJzW2tleV0gPSB7IGJpbmQ6IGRlZiwgdXBkYXRlOiBkZWYgfTsNCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg0KLyoqDQogKiBNZXJnZSB0d28gb3B0aW9uIG9iamVjdHMgaW50byBhIG5ldyBvbmUuDQogKiBDb3JlIHV0aWxpdHkgdXNlZCBpbiBib3RoIGluc3RhbnRpYXRpb24gYW5kIGluaGVyaXRhbmNlLg0KICovDQpmdW5jdGlvbiBtZXJnZU9wdGlvbnMgKA0KICBwYXJlbnQsDQogIGNoaWxkLA0KICB2bQ0KKSB7DQogIHsNCiAgICBjaGVja0NvbXBvbmVudHMoY2hpbGQpOw0KICB9DQogIG5vcm1hbGl6ZVByb3BzKGNoaWxkKTsNCiAgbm9ybWFsaXplRGlyZWN0aXZlcyhjaGlsZCk7DQogIHZhciBleHRlbmRzRnJvbSA9IGNoaWxkLmV4dGVuZHM7DQogIGlmIChleHRlbmRzRnJvbSkgew0KICAgIHBhcmVudCA9IHR5cGVvZiBleHRlbmRzRnJvbSA9PT0gJ2Z1bmN0aW9uJw0KICAgICAgPyBtZXJnZU9wdGlvbnMocGFyZW50LCBleHRlbmRzRnJvbS5vcHRpb25zLCB2bSkNCiAgICAgIDogbWVyZ2VPcHRpb25zKHBhcmVudCwgZXh0ZW5kc0Zyb20sIHZtKTsNCiAgfQ0KICBpZiAoY2hpbGQubWl4aW5zKSB7DQogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaGlsZC5taXhpbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7DQogICAgICB2YXIgbWl4aW4gPSBjaGlsZC5taXhpbnNbaV07DQogICAgICBpZiAobWl4aW4ucHJvdG90eXBlIGluc3RhbmNlb2YgVnVlJDMpIHsNCiAgICAgICAgbWl4aW4gPSBtaXhpbi5vcHRpb25zOw0KICAgICAgfQ0KICAgICAgcGFyZW50ID0gbWVyZ2VPcHRpb25zKHBhcmVudCwgbWl4aW4sIHZtKTsNCiAgICB9DQogIH0NCiAgdmFyIG9wdGlvbnMgPSB7fTsNCiAgdmFyIGtleTsNCiAgZm9yIChrZXkgaW4gcGFyZW50KSB7DQogICAgbWVyZ2VGaWVsZChrZXkpOw0KICB9DQogIGZvciAoa2V5IGluIGNoaWxkKSB7DQogICAgaWYgKCFoYXNPd24ocGFyZW50LCBrZXkpKSB7DQogICAgICBtZXJnZUZpZWxkKGtleSk7DQogICAgfQ0KICB9DQogIGZ1bmN0aW9uIG1lcmdlRmllbGQgKGtleSkgew0KICAgIHZhciBzdHJhdCA9IHN0cmF0c1trZXldIHx8IGRlZmF1bHRTdHJhdDsNCiAgICBvcHRpb25zW2tleV0gPSBzdHJhdChwYXJlbnRba2V5XSwgY2hpbGRba2V5XSwgdm0sIGtleSk7DQogIH0NCiAgcmV0dXJuIG9wdGlvbnMNCn0NCg0KLyoqDQogKiBSZXNvbHZlIGFuIGFzc2V0Lg0KICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJlY2F1c2UgY2hpbGQgaW5zdGFuY2VzIG5lZWQgYWNjZXNzDQogKiB0byBhc3NldHMgZGVmaW5lZCBpbiBpdHMgYW5jZXN0b3IgY2hhaW4uDQogKi8NCmZ1bmN0aW9uIHJlc29sdmVBc3NldCAoDQogIG9wdGlvbnMsDQogIHR5cGUsDQogIGlkLA0KICB3YXJuTWlzc2luZw0KKSB7DQogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLw0KICBpZiAodHlwZW9mIGlkICE9PSAnc3RyaW5nJykgew0KICAgIHJldHVybg0KICB9DQogIHZhciBhc3NldHMgPSBvcHRpb25zW3R5cGVdOw0KICB2YXIgcmVzID0gYXNzZXRzW2lkXSB8fA0KICAgIC8vIGNhbWVsQ2FzZSBJRA0KICAgIGFzc2V0c1tjYW1lbGl6ZShpZCldIHx8DQogICAgLy8gUGFzY2FsIENhc2UgSUQNCiAgICBhc3NldHNbY2FwaXRhbGl6ZShjYW1lbGl6ZShpZCkpXTsNCiAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuTWlzc2luZyAmJiAhcmVzKSB7DQogICAgd2FybigNCiAgICAgICdGYWlsZWQgdG8gcmVzb2x2ZSAnICsgdHlwZS5zbGljZSgwLCAtMSkgKyAnOiAnICsgaWQsDQogICAgICBvcHRpb25zDQogICAgKTsNCiAgfQ0KICByZXR1cm4gcmVzDQp9DQoNCi8qICAqLw0KDQpmdW5jdGlvbiB2YWxpZGF0ZVByb3AgKA0KICBrZXksDQogIHByb3BPcHRpb25zLA0KICBwcm9wc0RhdGEsDQogIHZtDQopIHsNCiAgdmFyIHByb3AgPSBwcm9wT3B0aW9uc1trZXldOw0KICB2YXIgYWJzZW50ID0gIWhhc093bihwcm9wc0RhdGEsIGtleSk7DQogIHZhciB2YWx1ZSA9IHByb3BzRGF0YVtrZXldOw0KICAvLyBoYW5kbGUgYm9vbGVhbiBwcm9wcw0KICBpZiAoaXNCb29sZWFuVHlwZShwcm9wLnR5cGUpKSB7DQogICAgaWYgKGFic2VudCAmJiAhaGFzT3duKHByb3AsICdkZWZhdWx0JykpIHsNCiAgICAgIHZhbHVlID0gZmFsc2U7DQogICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IGh5cGhlbmF0ZShrZXkpKSB7DQogICAgICB2YWx1ZSA9IHRydWU7DQogICAgfQ0KICB9DQogIC8vIGNoZWNrIGRlZmF1bHQgdmFsdWUNCiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsNCiAgICB2YWx1ZSA9IGdldFByb3BEZWZhdWx0VmFsdWUodm0sIHByb3AsIGtleSk7DQogICAgLy8gc2luY2UgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYSBmcmVzaCBjb3B5LA0KICAgIC8vIG1ha2Ugc3VyZSB0byBvYnNlcnZlIGl0Lg0KICAgIHZhciBwcmV2U2hvdWxkQ29udmVydCA9IG9ic2VydmVyU3RhdGUuc2hvdWxkQ29udmVydDsNCiAgICBvYnNlcnZlclN0YXRlLnNob3VsZENvbnZlcnQgPSB0cnVlOw0KICAgIG9ic2VydmUodmFsdWUpOw0KICAgIG9ic2VydmVyU3RhdGUuc2hvdWxkQ29udmVydCA9IHByZXZTaG91bGRDb252ZXJ0Ow0KICB9DQogIHsNCiAgICBhc3NlcnRQcm9wKHByb3AsIGtleSwgdmFsdWUsIHZtLCBhYnNlbnQpOw0KICB9DQogIHJldHVybiB2YWx1ZQ0KfQ0KDQovKioNCiAqIEdldCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIHByb3AuDQogKi8NCmZ1bmN0aW9uIGdldFByb3BEZWZhdWx0VmFsdWUgKHZtLCBwcm9wLCBrZXkpIHsNCiAgLy8gbm8gZGVmYXVsdCwgcmV0dXJuIHVuZGVmaW5lZA0KICBpZiAoIWhhc093bihwcm9wLCAnZGVmYXVsdCcpKSB7DQogICAgcmV0dXJuIHVuZGVmaW5lZA0KICB9DQogIHZhciBkZWYgPSBwcm9wLmRlZmF1bHQ7DQogIC8vIHdhcm4gYWdhaW5zdCBub24tZmFjdG9yeSBkZWZhdWx0cyBmb3IgT2JqZWN0ICYgQXJyYXkNCiAgaWYgKGlzT2JqZWN0KGRlZikpIHsNCiAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigNCiAgICAgICdJbnZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIHByb3AgIicgKyBrZXkgKyAnIjogJyArDQogICAgICAnUHJvcHMgd2l0aCB0eXBlIE9iamVjdC9BcnJheSBtdXN0IHVzZSBhIGZhY3RvcnkgZnVuY3Rpb24gJyArDQogICAgICAndG8gcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLicsDQogICAgICB2bQ0KICAgICk7DQogIH0NCiAgLy8gdGhlIHJhdyBwcm9wIHZhbHVlIHdhcyBhbHNvIHVuZGVmaW5lZCBmcm9tIHByZXZpb3VzIHJlbmRlciwNCiAgLy8gcmV0dXJuIHByZXZpb3VzIGRlZmF1bHQgdmFsdWUgdG8gYXZvaWQgdW5uZWNlc3Nhcnkgd2F0Y2hlciB0cmlnZ2VyDQogIGlmICh2bSAmJiB2bS4kb3B0aW9ucy5wcm9wc0RhdGEgJiYNCiAgICB2bS4kb3B0aW9ucy5wcm9wc0RhdGFba2V5XSA9PT0gdW5kZWZpbmVkICYmDQogICAgdm1ba2V5XSAhPT0gdW5kZWZpbmVkKSB7DQogICAgcmV0dXJuIHZtW2tleV0NCiAgfQ0KICAvLyBjYWxsIGZhY3RvcnkgZnVuY3Rpb24gZm9yIG5vbi1GdW5jdGlvbiB0eXBlcw0KICByZXR1cm4gdHlwZW9mIGRlZiA9PT0gJ2Z1bmN0aW9uJyAmJiBwcm9wLnR5cGUgIT09IEZ1bmN0aW9uDQogICAgPyBkZWYuY2FsbCh2bSkNCiAgICA6IGRlZg0KfQ0KDQovKioNCiAqIEFzc2VydCB3aGV0aGVyIGEgcHJvcCBpcyB2YWxpZC4NCiAqLw0KZnVuY3Rpb24gYXNzZXJ0UHJvcCAoDQogIHByb3AsDQogIG5hbWUsDQogIHZhbHVlLA0KICB2bSwNCiAgYWJzZW50DQopIHsNCiAgaWYgKHByb3AucmVxdWlyZWQgJiYgYWJzZW50KSB7DQogICAgd2FybigNCiAgICAgICdNaXNzaW5nIHJlcXVpcmVkIHByb3A6ICInICsgbmFtZSArICciJywNCiAgICAgIHZtDQogICAgKTsNCiAgICByZXR1cm4NCiAgfQ0KICBpZiAodmFsdWUgPT0gbnVsbCAmJiAhcHJvcC5yZXF1aXJlZCkgew0KICAgIHJldHVybg0KICB9DQogIHZhciB0eXBlID0gcHJvcC50eXBlOw0KICB2YXIgdmFsaWQgPSAhdHlwZSB8fCB0eXBlID09PSB0cnVlOw0KICB2YXIgZXhwZWN0ZWRUeXBlcyA9IFtdOw0KICBpZiAodHlwZSkgew0KICAgIGlmICghQXJyYXkuaXNBcnJheSh0eXBlKSkgew0KICAgICAgdHlwZSA9IFt0eXBlXTsNCiAgICB9DQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlLmxlbmd0aCAmJiAhdmFsaWQ7IGkrKykgew0KICAgICAgdmFyIGFzc2VydGVkVHlwZSA9IGFzc2VydFR5cGUodmFsdWUsIHR5cGVbaV0pOw0KICAgICAgZXhwZWN0ZWRUeXBlcy5wdXNoKGFzc2VydGVkVHlwZS5leHBlY3RlZFR5cGUpOw0KICAgICAgdmFsaWQgPSBhc3NlcnRlZFR5cGUudmFsaWQ7DQogICAgfQ0KICB9DQogIGlmICghdmFsaWQpIHsNCiAgICB3YXJuKA0KICAgICAgJ0ludmFsaWQgcHJvcDogdHlwZSBjaGVjayBmYWlsZWQgZm9yIHByb3AgIicgKyBuYW1lICsgJyIuJyArDQogICAgICAnIEV4cGVjdGVkICcgKyBleHBlY3RlZFR5cGVzLm1hcChjYXBpdGFsaXplKS5qb2luKCcsICcpICsNCiAgICAgICcsIGdvdCAnICsgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKS5zbGljZSg4LCAtMSkgKyAnLicsDQogICAgICB2bQ0KICAgICk7DQogICAgcmV0dXJuDQogIH0NCiAgdmFyIHZhbGlkYXRvciA9IHByb3AudmFsaWRhdG9yOw0KICBpZiAodmFsaWRhdG9yKSB7DQogICAgaWYgKCF2YWxpZGF0b3IodmFsdWUpKSB7DQogICAgICB3YXJuKA0KICAgICAgICAnSW52YWxpZCBwcm9wOiBjdXN0b20gdmFsaWRhdG9yIGNoZWNrIGZhaWxlZCBmb3IgcHJvcCAiJyArIG5hbWUgKyAnIi4nLA0KICAgICAgICB2bQ0KICAgICAgKTsNCiAgICB9DQogIH0NCn0NCg0KLyoqDQogKiBBc3NlcnQgdGhlIHR5cGUgb2YgYSB2YWx1ZQ0KICovDQpmdW5jdGlvbiBhc3NlcnRUeXBlICh2YWx1ZSwgdHlwZSkgew0KICB2YXIgdmFsaWQ7DQogIHZhciBleHBlY3RlZFR5cGUgPSBnZXRUeXBlKHR5cGUpOw0KICBpZiAoZXhwZWN0ZWRUeXBlID09PSAnU3RyaW5nJykgew0KICAgIHZhbGlkID0gdHlwZW9mIHZhbHVlID09PSAoZXhwZWN0ZWRUeXBlID0gJ3N0cmluZycpOw0KICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gJ051bWJlcicpIHsNCiAgICB2YWxpZCA9IHR5cGVvZiB2YWx1ZSA9PT0gKGV4cGVjdGVkVHlwZSA9ICdudW1iZXInKTsNCiAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09ICdCb29sZWFuJykgew0KICAgIHZhbGlkID0gdHlwZW9mIHZhbHVlID09PSAoZXhwZWN0ZWRUeXBlID0gJ2Jvb2xlYW4nKTsNCiAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09ICdGdW5jdGlvbicpIHsNCiAgICB2YWxpZCA9IHR5cGVvZiB2YWx1ZSA9PT0gKGV4cGVjdGVkVHlwZSA9ICdmdW5jdGlvbicpOw0KICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gJ09iamVjdCcpIHsNCiAgICB2YWxpZCA9IGlzUGxhaW5PYmplY3QodmFsdWUpOw0KICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gJ0FycmF5Jykgew0KICAgIHZhbGlkID0gQXJyYXkuaXNBcnJheSh2YWx1ZSk7DQogIH0gZWxzZSB7DQogICAgdmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7DQogIH0NCiAgcmV0dXJuIHsNCiAgICB2YWxpZDogdmFsaWQsDQogICAgZXhwZWN0ZWRUeXBlOiBleHBlY3RlZFR5cGUNCiAgfQ0KfQ0KDQovKioNCiAqIFVzZSBmdW5jdGlvbiBzdHJpbmcgbmFtZSB0byBjaGVjayBidWlsdC1pbiB0eXBlcywNCiAqIGJlY2F1c2UgYSBzaW1wbGUgZXF1YWxpdHkgY2hlY2sgd2lsbCBmYWlsIHdoZW4gcnVubmluZw0KICogYWNyb3NzIGRpZmZlcmVudCB2bXMgLyBpZnJhbWVzLg0KICovDQpmdW5jdGlvbiBnZXRUeXBlIChmbikgew0KICB2YXIgbWF0Y2ggPSBmbiAmJiBmbi50b1N0cmluZygpLm1hdGNoKC9eXHMqZnVuY3Rpb24gKFx3KykvKTsNCiAgcmV0dXJuIG1hdGNoICYmIG1hdGNoWzFdDQp9DQoNCmZ1bmN0aW9uIGlzQm9vbGVhblR5cGUgKGZuKSB7DQogIGlmICghQXJyYXkuaXNBcnJheShmbikpIHsNCiAgICByZXR1cm4gZ2V0VHlwZShmbikgPT09ICdCb29sZWFuJw0KICB9DQogIGZvciAodmFyIGkgPSAwLCBsZW4gPSBmbi5sZW5ndGg7IGkgPCBsZW47IGkrKykgew0KICAgIGlmIChnZXRUeXBlKGZuW2ldKSA9PT0gJ0Jvb2xlYW4nKSB7DQogICAgICByZXR1cm4gdHJ1ZQ0KICAgIH0NCiAgfQ0KICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLw0KICByZXR1cm4gZmFsc2UNCn0NCg0KDQoNCnZhciB1dGlsID0gT2JqZWN0LmZyZWV6ZSh7DQoJZGVmaW5lUmVhY3RpdmU6IGRlZmluZVJlYWN0aXZlJCQxLA0KCV90b1N0cmluZzogX3RvU3RyaW5nLA0KCXRvTnVtYmVyOiB0b051bWJlciwNCgltYWtlTWFwOiBtYWtlTWFwLA0KCWlzQnVpbHRJblRhZzogaXNCdWlsdEluVGFnLA0KCXJlbW92ZTogcmVtb3ZlJDEsDQoJaGFzT3duOiBoYXNPd24sDQoJaXNQcmltaXRpdmU6IGlzUHJpbWl0aXZlLA0KCWNhY2hlZDogY2FjaGVkLA0KCWNhbWVsaXplOiBjYW1lbGl6ZSwNCgljYXBpdGFsaXplOiBjYXBpdGFsaXplLA0KCWh5cGhlbmF0ZTogaHlwaGVuYXRlLA0KCWJpbmQ6IGJpbmQkMSwNCgl0b0FycmF5OiB0b0FycmF5LA0KCWV4dGVuZDogZXh0ZW5kLA0KCWlzT2JqZWN0OiBpc09iamVjdCwNCglpc1BsYWluT2JqZWN0OiBpc1BsYWluT2JqZWN0LA0KCXRvT2JqZWN0OiB0b09iamVjdCwNCglub29wOiBub29wLA0KCW5vOiBubywNCglnZW5TdGF0aWNLZXlzOiBnZW5TdGF0aWNLZXlzLA0KCWxvb3NlRXF1YWw6IGxvb3NlRXF1YWwsDQoJbG9vc2VJbmRleE9mOiBsb29zZUluZGV4T2YsDQoJaXNSZXNlcnZlZDogaXNSZXNlcnZlZCwNCglkZWY6IGRlZiwNCglwYXJzZVBhdGg6IHBhcnNlUGF0aCwNCgloYXNQcm90bzogaGFzUHJvdG8sDQoJaW5Ccm93c2VyOiBpbkJyb3dzZXIsDQoJVUE6IFVBLA0KCWlzSUU6IGlzSUUsDQoJaXNJRTk6IGlzSUU5LA0KCWlzRWRnZTogaXNFZGdlLA0KCWlzQW5kcm9pZDogaXNBbmRyb2lkLA0KCWlzSU9TOiBpc0lPUywNCglpc1NlcnZlclJlbmRlcmluZzogaXNTZXJ2ZXJSZW5kZXJpbmcsDQoJZGV2dG9vbHM6IGRldnRvb2xzLA0KCW5leHRUaWNrOiBuZXh0VGljaywNCglnZXQgX1NldCAoKSB7IHJldHVybiBfU2V0OyB9LA0KCW1lcmdlT3B0aW9uczogbWVyZ2VPcHRpb25zLA0KCXJlc29sdmVBc3NldDogcmVzb2x2ZUFzc2V0LA0KCWdldCB3YXJuICgpIHsgcmV0dXJuIHdhcm47IH0sDQoJZ2V0IGZvcm1hdENvbXBvbmVudE5hbWUgKCkgeyByZXR1cm4gZm9ybWF0Q29tcG9uZW50TmFtZTsgfSwNCgl2YWxpZGF0ZVByb3A6IHZhbGlkYXRlUHJvcA0KfSk7DQoNCi8qIG5vdCB0eXBlIGNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGZsb3cgZG9lc24ndCBwbGF5IHdlbGwgd2l0aCBQcm94eSAqLw0KDQp2YXIgaW5pdFByb3h5Ow0KDQp7DQogIHZhciBhbGxvd2VkR2xvYmFscyA9IG1ha2VNYXAoDQogICAgJ0luZmluaXR5LHVuZGVmaW5lZCxOYU4saXNGaW5pdGUsaXNOYU4sJyArDQogICAgJ3BhcnNlRmxvYXQscGFyc2VJbnQsZGVjb2RlVVJJLGRlY29kZVVSSUNvbXBvbmVudCxlbmNvZGVVUkksZW5jb2RlVVJJQ29tcG9uZW50LCcgKw0KICAgICdNYXRoLE51bWJlcixEYXRlLEFycmF5LE9iamVjdCxCb29sZWFuLFN0cmluZyxSZWdFeHAsTWFwLFNldCxKU09OLEludGwsJyArDQogICAgJ3JlcXVpcmUnIC8vIGZvciBXZWJwYWNrL0Jyb3dzZXJpZnkNCiAgKTsNCg0KICB2YXIgd2Fybk5vblByZXNlbnQgPSBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsNCiAgICB3YXJuKA0KICAgICAgIlByb3BlcnR5IG9yIG1ldGhvZCBcIiIgKyBrZXkgKyAiXCIgaXMgbm90IGRlZmluZWQgb24gdGhlIGluc3RhbmNlIGJ1dCAiICsNCiAgICAgICJyZWZlcmVuY2VkIGR1cmluZyByZW5kZXIuIE1ha2Ugc3VyZSB0byBkZWNsYXJlIHJlYWN0aXZlIGRhdGEgIiArDQogICAgICAicHJvcGVydGllcyBpbiB0aGUgZGF0YSBvcHRpb24uIiwNCiAgICAgIHRhcmdldA0KICAgICk7DQogIH07DQoNCiAgdmFyIGhhc1Byb3h5ID0NCiAgICB0eXBlb2YgUHJveHkgIT09ICd1bmRlZmluZWQnICYmDQogICAgUHJveHkudG9TdHJpbmcoKS5tYXRjaCgvbmF0aXZlIGNvZGUvKTsNCg0KICBpZiAoaGFzUHJveHkpIHsNCiAgICB2YXIgaXNCdWlsdEluTW9kaWZpZXIgPSBtYWtlTWFwKCdzdG9wLHByZXZlbnQsc2VsZixjdHJsLHNoaWZ0LGFsdCxtZXRhJyk7DQogICAgY29uZmlnLmtleUNvZGVzID0gbmV3IFByb3h5KGNvbmZpZy5rZXlDb2Rlcywgew0KICAgICAgc2V0OiBmdW5jdGlvbiBzZXQgKHRhcmdldCwga2V5LCB2YWx1ZSkgew0KICAgICAgICBpZiAoaXNCdWlsdEluTW9kaWZpZXIoa2V5KSkgew0KICAgICAgICAgIHdhcm4oKCJBdm9pZCBvdmVyd3JpdGluZyBidWlsdC1pbiBtb2RpZmllciBpbiBjb25maWcua2V5Q29kZXM6IC4iICsga2V5KSk7DQogICAgICAgICAgcmV0dXJuIGZhbHNlDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWx1ZTsNCiAgICAgICAgICByZXR1cm4gdHJ1ZQ0KICAgICAgICB9DQogICAgICB9DQogICAgfSk7DQogIH0NCg0KICB2YXIgaGFzSGFuZGxlciA9IHsNCiAgICBoYXM6IGZ1bmN0aW9uIGhhcyAodGFyZ2V0LCBrZXkpIHsNCiAgICAgIHZhciBoYXMgPSBrZXkgaW4gdGFyZ2V0Ow0KICAgICAgdmFyIGlzQWxsb3dlZCA9IGFsbG93ZWRHbG9iYWxzKGtleSkgfHwga2V5LmNoYXJBdCgwKSA9PT0gJ18nOw0KICAgICAgaWYgKCFoYXMgJiYgIWlzQWxsb3dlZCkgew0KICAgICAgICB3YXJuTm9uUHJlc2VudCh0YXJnZXQsIGtleSk7DQogICAgICB9DQogICAgICByZXR1cm4gaGFzIHx8ICFpc0FsbG93ZWQNCiAgICB9DQogIH07DQoNCiAgdmFyIGdldEhhbmRsZXIgPSB7DQogICAgZ2V0OiBmdW5jdGlvbiBnZXQgKHRhcmdldCwga2V5KSB7DQogICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYgIShrZXkgaW4gdGFyZ2V0KSkgew0KICAgICAgICB3YXJuTm9uUHJlc2VudCh0YXJnZXQsIGtleSk7DQogICAgICB9DQogICAgICByZXR1cm4gdGFyZ2V0W2tleV0NCiAgICB9DQogIH07DQoNCiAgaW5pdFByb3h5ID0gZnVuY3Rpb24gaW5pdFByb3h5ICh2bSkgew0KICAgIGlmIChoYXNQcm94eSkgew0KICAgICAgLy8gZGV0ZXJtaW5lIHdoaWNoIHByb3h5IGhhbmRsZXIgdG8gdXNlDQogICAgICB2YXIgb3B0aW9ucyA9IHZtLiRvcHRpb25zOw0KICAgICAgdmFyIGhhbmRsZXJzID0gb3B0aW9ucy5yZW5kZXIgJiYgb3B0aW9ucy5yZW5kZXIuX3dpdGhTdHJpcHBlZA0KICAgICAgICA/IGdldEhhbmRsZXINCiAgICAgICAgOiBoYXNIYW5kbGVyOw0KICAgICAgdm0uX3JlbmRlclByb3h5ID0gbmV3IFByb3h5KHZtLCBoYW5kbGVycyk7DQogICAgfSBlbHNlIHsNCiAgICAgIHZtLl9yZW5kZXJQcm94eSA9IHZtOw0KICAgIH0NCiAgfTsNCn0NCg0KLyogICovDQoNCg0KdmFyIHF1ZXVlID0gW107DQp2YXIgaGFzJDEgPSB7fTsNCnZhciBjaXJjdWxhciA9IHt9Ow0KdmFyIHdhaXRpbmcgPSBmYWxzZTsNCnZhciBmbHVzaGluZyA9IGZhbHNlOw0KdmFyIGluZGV4ID0gMDsNCg0KLyoqDQogKiBSZXNldCB0aGUgc2NoZWR1bGVyJ3Mgc3RhdGUuDQogKi8NCmZ1bmN0aW9uIHJlc2V0U2NoZWR1bGVyU3RhdGUgKCkgew0KICBxdWV1ZS5sZW5ndGggPSAwOw0KICBoYXMkMSA9IHt9Ow0KICB7DQogICAgY2lyY3VsYXIgPSB7fTsNCiAgfQ0KICB3YWl0aW5nID0gZmx1c2hpbmcgPSBmYWxzZTsNCn0NCg0KLyoqDQogKiBGbHVzaCBib3RoIHF1ZXVlcyBhbmQgcnVuIHRoZSB3YXRjaGVycy4NCiAqLw0KZnVuY3Rpb24gZmx1c2hTY2hlZHVsZXJRdWV1ZSAoKSB7DQogIGZsdXNoaW5nID0gdHJ1ZTsNCg0KICAvLyBTb3J0IHF1ZXVlIGJlZm9yZSBmbHVzaC4NCiAgLy8gVGhpcyBlbnN1cmVzIHRoYXQ6DQogIC8vIDEuIENvbXBvbmVudHMgYXJlIHVwZGF0ZWQgZnJvbSBwYXJlbnQgdG8gY2hpbGQuIChiZWNhdXNlIHBhcmVudCBpcyBhbHdheXMNCiAgLy8gICAgY3JlYXRlZCBiZWZvcmUgdGhlIGNoaWxkKQ0KICAvLyAyLiBBIGNvbXBvbmVudCdzIHVzZXIgd2F0Y2hlcnMgYXJlIHJ1biBiZWZvcmUgaXRzIHJlbmRlciB3YXRjaGVyIChiZWNhdXNlDQogIC8vICAgIHVzZXIgd2F0Y2hlcnMgYXJlIGNyZWF0ZWQgYmVmb3JlIHRoZSByZW5kZXIgd2F0Y2hlcikNCiAgLy8gMy4gSWYgYSBjb21wb25lbnQgaXMgZGVzdHJveWVkIGR1cmluZyBhIHBhcmVudCBjb21wb25lbnQncyB3YXRjaGVyIHJ1biwNCiAgLy8gICAgaXRzIHdhdGNoZXJzIGNhbiBiZSBza2lwcGVkLg0KICBxdWV1ZS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhLmlkIC0gYi5pZDsgfSk7DQoNCiAgLy8gZG8gbm90IGNhY2hlIGxlbmd0aCBiZWNhdXNlIG1vcmUgd2F0Y2hlcnMgbWlnaHQgYmUgcHVzaGVkDQogIC8vIGFzIHdlIHJ1biBleGlzdGluZyB3YXRjaGVycw0KICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBxdWV1ZS5sZW5ndGg7IGluZGV4KyspIHsNCiAgICB2YXIgd2F0Y2hlciA9IHF1ZXVlW2luZGV4XTsNCiAgICB2YXIgaWQgPSB3YXRjaGVyLmlkOw0KICAgIGhhcyQxW2lkXSA9IG51bGw7DQogICAgd2F0Y2hlci5ydW4oKTsNCiAgICAvLyBpbiBkZXYgYnVpbGQsIGNoZWNrIGFuZCBzdG9wIGNpcmN1bGFyIHVwZGF0ZXMuDQogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBoYXMkMVtpZF0gIT0gbnVsbCkgew0KICAgICAgY2lyY3VsYXJbaWRdID0gKGNpcmN1bGFyW2lkXSB8fCAwKSArIDE7DQogICAgICBpZiAoY2lyY3VsYXJbaWRdID4gY29uZmlnLl9tYXhVcGRhdGVDb3VudCkgew0KICAgICAgICB3YXJuKA0KICAgICAgICAgICdZb3UgbWF5IGhhdmUgYW4gaW5maW5pdGUgdXBkYXRlIGxvb3AgJyArICgNCiAgICAgICAgICAgIHdhdGNoZXIudXNlcg0KICAgICAgICAgICAgICA/ICgiaW4gd2F0Y2hlciB3aXRoIGV4cHJlc3Npb24gXCIiICsgKHdhdGNoZXIuZXhwcmVzc2lvbikgKyAiXCIiKQ0KICAgICAgICAgICAgICA6ICJpbiBhIGNvbXBvbmVudCByZW5kZXIgZnVuY3Rpb24uIg0KICAgICAgICAgICksDQogICAgICAgICAgd2F0Y2hlci52bQ0KICAgICAgICApOw0KICAgICAgICBicmVhaw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIC8vIGRldnRvb2wgaG9vaw0KICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8NCiAgaWYgKGRldnRvb2xzICYmIGNvbmZpZy5kZXZ0b29scykgew0KICAgIGRldnRvb2xzLmVtaXQoJ2ZsdXNoJyk7DQogIH0NCg0KICByZXNldFNjaGVkdWxlclN0YXRlKCk7DQp9DQoNCi8qKg0KICogUHVzaCBhIHdhdGNoZXIgaW50byB0aGUgd2F0Y2hlciBxdWV1ZS4NCiAqIEpvYnMgd2l0aCBkdXBsaWNhdGUgSURzIHdpbGwgYmUgc2tpcHBlZCB1bmxlc3MgaXQncw0KICogcHVzaGVkIHdoZW4gdGhlIHF1ZXVlIGlzIGJlaW5nIGZsdXNoZWQuDQogKi8NCmZ1bmN0aW9uIHF1ZXVlV2F0Y2hlciAod2F0Y2hlcikgew0KICB2YXIgaWQgPSB3YXRjaGVyLmlkOw0KICBpZiAoaGFzJDFbaWRdID09IG51bGwpIHsNCiAgICBoYXMkMVtpZF0gPSB0cnVlOw0KICAgIGlmICghZmx1c2hpbmcpIHsNCiAgICAgIHF1ZXVlLnB1c2god2F0Y2hlcik7DQogICAgfSBlbHNlIHsNCiAgICAgIC8vIGlmIGFscmVhZHkgZmx1c2hpbmcsIHNwbGljZSB0aGUgd2F0Y2hlciBiYXNlZCBvbiBpdHMgaWQNCiAgICAgIC8vIGlmIGFscmVhZHkgcGFzdCBpdHMgaWQsIGl0IHdpbGwgYmUgcnVuIG5leHQgaW1tZWRpYXRlbHkuDQogICAgICB2YXIgaSA9IHF1ZXVlLmxlbmd0aCAtIDE7DQogICAgICB3aGlsZSAoaSA+PSAwICYmIHF1ZXVlW2ldLmlkID4gd2F0Y2hlci5pZCkgew0KICAgICAgICBpLS07DQogICAgICB9DQogICAgICBxdWV1ZS5zcGxpY2UoTWF0aC5tYXgoaSwgaW5kZXgpICsgMSwgMCwgd2F0Y2hlcik7DQogICAgfQ0KICAgIC8vIHF1ZXVlIHRoZSBmbHVzaA0KICAgIGlmICghd2FpdGluZykgew0KICAgICAgd2FpdGluZyA9IHRydWU7DQogICAgICBuZXh0VGljayhmbHVzaFNjaGVkdWxlclF1ZXVlKTsNCiAgICB9DQogIH0NCn0NCg0KLyogICovDQoNCnZhciB1aWQkMiA9IDA7DQoNCi8qKg0KICogQSB3YXRjaGVyIHBhcnNlcyBhbiBleHByZXNzaW9uLCBjb2xsZWN0cyBkZXBlbmRlbmNpZXMsDQogKiBhbmQgZmlyZXMgY2FsbGJhY2sgd2hlbiB0aGUgZXhwcmVzc2lvbiB2YWx1ZSBjaGFuZ2VzLg0KICogVGhpcyBpcyB1c2VkIGZvciBib3RoIHRoZSAkd2F0Y2goKSBhcGkgYW5kIGRpcmVjdGl2ZXMuDQogKi8NCnZhciBXYXRjaGVyID0gZnVuY3Rpb24gV2F0Y2hlciAoDQogIHZtLA0KICBleHBPckZuLA0KICBjYiwNCiAgb3B0aW9ucw0KKSB7DQogIGlmICggb3B0aW9ucyA9PT0gdm9pZCAwICkgb3B0aW9ucyA9IHt9Ow0KDQogIHRoaXMudm0gPSB2bTsNCiAgdm0uX3dhdGNoZXJzLnB1c2godGhpcyk7DQogIC8vIG9wdGlvbnMNCiAgdGhpcy5kZWVwID0gISFvcHRpb25zLmRlZXA7DQogIHRoaXMudXNlciA9ICEhb3B0aW9ucy51c2VyOw0KICB0aGlzLmxhenkgPSAhIW9wdGlvbnMubGF6eTsNCiAgdGhpcy5zeW5jID0gISFvcHRpb25zLnN5bmM7DQogIHRoaXMuZXhwcmVzc2lvbiA9IGV4cE9yRm4udG9TdHJpbmcoKTsNCiAgdGhpcy5jYiA9IGNiOw0KICB0aGlzLmlkID0gKyt1aWQkMjsgLy8gdWlkIGZvciBiYXRjaGluZw0KICB0aGlzLmFjdGl2ZSA9IHRydWU7DQogIHRoaXMuZGlydHkgPSB0aGlzLmxhenk7IC8vIGZvciBsYXp5IHdhdGNoZXJzDQogIHRoaXMuZGVwcyA9IFtdOw0KICB0aGlzLm5ld0RlcHMgPSBbXTsNCiAgdGhpcy5kZXBJZHMgPSBuZXcgX1NldCgpOw0KICB0aGlzLm5ld0RlcElkcyA9IG5ldyBfU2V0KCk7DQogIC8vIHBhcnNlIGV4cHJlc3Npb24gZm9yIGdldHRlcg0KICBpZiAodHlwZW9mIGV4cE9yRm4gPT09ICdmdW5jdGlvbicpIHsNCiAgICB0aGlzLmdldHRlciA9IGV4cE9yRm47DQogIH0gZWxzZSB7DQogICAgdGhpcy5nZXR0ZXIgPSBwYXJzZVBhdGgoZXhwT3JGbik7DQogICAgaWYgKCF0aGlzLmdldHRlcikgew0KICAgICAgdGhpcy5nZXR0ZXIgPSBmdW5jdGlvbiAoKSB7fTsNCiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKA0KICAgICAgICAiRmFpbGVkIHdhdGNoaW5nIHBhdGg6IFwiIiArIGV4cE9yRm4gKyAiXCIgIiArDQogICAgICAgICdXYXRjaGVyIG9ubHkgYWNjZXB0cyBzaW1wbGUgZG90LWRlbGltaXRlZCBwYXRocy4gJyArDQogICAgICAgICdGb3IgZnVsbCBjb250cm9sLCB1c2UgYSBmdW5jdGlvbiBpbnN0ZWFkLicsDQogICAgICAgIHZtDQogICAgICApOw0KICAgIH0NCiAgfQ0KICB0aGlzLnZhbHVlID0gdGhpcy5sYXp5DQogICAgPyB1bmRlZmluZWQNCiAgICA6IHRoaXMuZ2V0KCk7DQp9Ow0KDQovKioNCiAqIEV2YWx1YXRlIHRoZSBnZXR0ZXIsIGFuZCByZS1jb2xsZWN0IGRlcGVuZGVuY2llcy4NCiAqLw0KV2F0Y2hlci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0ICgpIHsNCiAgcHVzaFRhcmdldCh0aGlzKTsNCiAgdmFyIHZhbHVlID0gdGhpcy5nZXR0ZXIuY2FsbCh0aGlzLnZtLCB0aGlzLnZtKTsNCiAgLy8gInRvdWNoIiBldmVyeSBwcm9wZXJ0eSBzbyB0aGV5IGFyZSBhbGwgdHJhY2tlZCBhcw0KICAvLyBkZXBlbmRlbmNpZXMgZm9yIGRlZXAgd2F0Y2hpbmcNCiAgaWYgKHRoaXMuZGVlcCkgew0KICAgIHRyYXZlcnNlKHZhbHVlKTsNCiAgfQ0KICBwb3BUYXJnZXQoKTsNCiAgdGhpcy5jbGVhbnVwRGVwcygpOw0KICByZXR1cm4gdmFsdWUNCn07DQoNCi8qKg0KICogQWRkIGEgZGVwZW5kZW5jeSB0byB0aGlzIGRpcmVjdGl2ZS4NCiAqLw0KV2F0Y2hlci5wcm90b3R5cGUuYWRkRGVwID0gZnVuY3Rpb24gYWRkRGVwIChkZXApIHsNCiAgdmFyIGlkID0gZGVwLmlkOw0KICBpZiAoIXRoaXMubmV3RGVwSWRzLmhhcyhpZCkpIHsNCiAgICB0aGlzLm5ld0RlcElkcy5hZGQoaWQpOw0KICAgIHRoaXMubmV3RGVwcy5wdXNoKGRlcCk7DQogICAgaWYgKCF0aGlzLmRlcElkcy5oYXMoaWQpKSB7DQogICAgICBkZXAuYWRkU3ViKHRoaXMpOw0KICAgIH0NCiAgfQ0KfTsNCg0KLyoqDQogKiBDbGVhbiB1cCBmb3IgZGVwZW5kZW5jeSBjb2xsZWN0aW9uLg0KICovDQpXYXRjaGVyLnByb3RvdHlwZS5jbGVhbnVwRGVwcyA9IGZ1bmN0aW9uIGNsZWFudXBEZXBzICgpIHsNCiAgICB2YXIgdGhpcyQxID0gdGhpczsNCg0KICB2YXIgaSA9IHRoaXMuZGVwcy5sZW5ndGg7DQogIHdoaWxlIChpLS0pIHsNCiAgICB2YXIgZGVwID0gdGhpcyQxLmRlcHNbaV07DQogICAgaWYgKCF0aGlzJDEubmV3RGVwSWRzLmhhcyhkZXAuaWQpKSB7DQogICAgICBkZXAucmVtb3ZlU3ViKHRoaXMkMSk7DQogICAgfQ0KICB9DQogIHZhciB0bXAgPSB0aGlzLmRlcElkczsNCiAgdGhpcy5kZXBJZHMgPSB0aGlzLm5ld0RlcElkczsNCiAgdGhpcy5uZXdEZXBJZHMgPSB0bXA7DQogIHRoaXMubmV3RGVwSWRzLmNsZWFyKCk7DQogIHRtcCA9IHRoaXMuZGVwczsNCiAgdGhpcy5kZXBzID0gdGhpcy5uZXdEZXBzOw0KICB0aGlzLm5ld0RlcHMgPSB0bXA7DQogIHRoaXMubmV3RGVwcy5sZW5ndGggPSAwOw0KfTsNCg0KLyoqDQogKiBTdWJzY3JpYmVyIGludGVyZmFjZS4NCiAqIFdpbGwgYmUgY2FsbGVkIHdoZW4gYSBkZXBlbmRlbmN5IGNoYW5nZXMuDQogKi8NCldhdGNoZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAoKSB7DQogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovDQogIGlmICh0aGlzLmxhenkpIHsNCiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTsNCiAgfSBlbHNlIGlmICh0aGlzLnN5bmMpIHsNCiAgICB0aGlzLnJ1bigpOw0KICB9IGVsc2Ugew0KICAgIHF1ZXVlV2F0Y2hlcih0aGlzKTsNCiAgfQ0KfTsNCg0KLyoqDQogKiBTY2hlZHVsZXIgam9iIGludGVyZmFjZS4NCiAqIFdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBzY2hlZHVsZXIuDQogKi8NCldhdGNoZXIucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIHJ1biAoKSB7DQogIGlmICh0aGlzLmFjdGl2ZSkgew0KICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0KCk7DQogICAgICBpZiAoDQogICAgICAgIHZhbHVlICE9PSB0aGlzLnZhbHVlIHx8DQogICAgICAvLyBEZWVwIHdhdGNoZXJzIGFuZCB3YXRjaGVycyBvbiBPYmplY3QvQXJyYXlzIHNob3VsZCBmaXJlIGV2ZW4NCiAgICAgIC8vIHdoZW4gdGhlIHZhbHVlIGlzIHRoZSBzYW1lLCBiZWNhdXNlIHRoZSB2YWx1ZSBtYXkNCiAgICAgIC8vIGhhdmUgbXV0YXRlZC4NCiAgICAgIGlzT2JqZWN0KHZhbHVlKSB8fA0KICAgICAgdGhpcy5kZWVwDQogICAgKSB7DQogICAgICAvLyBzZXQgbmV3IHZhbHVlDQogICAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLnZhbHVlOw0KICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOw0KICAgICAgaWYgKHRoaXMudXNlcikgew0KICAgICAgICB0cnkgew0KICAgICAgICAgIHRoaXMuY2IuY2FsbCh0aGlzLnZtLCB2YWx1ZSwgb2xkVmFsdWUpOw0KICAgICAgICB9IGNhdGNoIChlKSB7DQogICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8NCiAgICAgICAgICBpZiAoY29uZmlnLmVycm9ySGFuZGxlcikgew0KICAgICAgICAgICAgY29uZmlnLmVycm9ySGFuZGxlci5jYWxsKG51bGwsIGUsIHRoaXMudm0pOw0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigNCiAgICAgICAgICAgICAgKCJFcnJvciBpbiB3YXRjaGVyIFwiIiArICh0aGlzLmV4cHJlc3Npb24pICsgIlwiIiksDQogICAgICAgICAgICAgIHRoaXMudm0NCiAgICAgICAgICAgICk7DQogICAgICAgICAgICB0aHJvdyBlDQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICB0aGlzLmNiLmNhbGwodGhpcy52bSwgdmFsdWUsIG9sZFZhbHVlKTsNCiAgICAgIH0NCiAgICB9DQogIH0NCn07DQoNCi8qKg0KICogRXZhbHVhdGUgdGhlIHZhbHVlIG9mIHRoZSB3YXRjaGVyLg0KICogVGhpcyBvbmx5IGdldHMgY2FsbGVkIGZvciBsYXp5IHdhdGNoZXJzLg0KICovDQpXYXRjaGVyLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uIGV2YWx1YXRlICgpIHsNCiAgdGhpcy52YWx1ZSA9IHRoaXMuZ2V0KCk7DQogIHRoaXMuZGlydHkgPSBmYWxzZTsNCn07DQoNCi8qKg0KICogRGVwZW5kIG9uIGFsbCBkZXBzIGNvbGxlY3RlZCBieSB0aGlzIHdhdGNoZXIuDQogKi8NCldhdGNoZXIucHJvdG90eXBlLmRlcGVuZCA9IGZ1bmN0aW9uIGRlcGVuZCAoKSB7DQogICAgdmFyIHRoaXMkMSA9IHRoaXM7DQoNCiAgdmFyIGkgPSB0aGlzLmRlcHMubGVuZ3RoOw0KICB3aGlsZSAoaS0tKSB7DQogICAgdGhpcyQxLmRlcHNbaV0uZGVwZW5kKCk7DQogIH0NCn07DQoNCi8qKg0KICogUmVtb3ZlIHNlbGYgZnJvbSBhbGwgZGVwZW5kZW5jaWVzJyBzdWJzY3JpYmVyIGxpc3QuDQogKi8NCldhdGNoZXIucHJvdG90eXBlLnRlYXJkb3duID0gZnVuY3Rpb24gdGVhcmRvd24gKCkgew0KICAgIHZhciB0aGlzJDEgPSB0aGlzOw0KDQogIGlmICh0aGlzLmFjdGl2ZSkgew0KICAgIC8vIHJlbW92ZSBzZWxmIGZyb20gdm0ncyB3YXRjaGVyIGxpc3QNCiAgICAvLyB0aGlzIGlzIGEgc29tZXdoYXQgZXhwZW5zaXZlIG9wZXJhdGlvbiBzbyB3ZSBza2lwIGl0DQogICAgLy8gaWYgdGhlIHZtIGlzIGJlaW5nIGRlc3Ryb3llZCBvciBpcyBwZXJmb3JtaW5nIGEgdi1mb3INCiAgICAvLyByZS1yZW5kZXIgKHRoZSB3YXRjaGVyIGxpc3QgaXMgdGhlbiBmaWx0ZXJlZCBieSB2LWZvcikuDQogICAgaWYgKCF0aGlzLnZtLl9pc0JlaW5nRGVzdHJveWVkICYmICF0aGlzLnZtLl92Rm9yUmVtb3ZpbmcpIHsNCiAgICAgIHJlbW92ZSQxKHRoaXMudm0uX3dhdGNoZXJzLCB0aGlzKTsNCiAgICB9DQogICAgdmFyIGkgPSB0aGlzLmRlcHMubGVuZ3RoOw0KICAgIHdoaWxlIChpLS0pIHsNCiAgICAgIHRoaXMkMS5kZXBzW2ldLnJlbW92ZVN1Yih0aGlzJDEpOw0KICAgIH0NCiAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlOw0KICB9DQp9Ow0KDQovKioNCiAqIFJlY3Vyc2l2ZWx5IHRyYXZlcnNlIGFuIG9iamVjdCB0byBldm9rZSBhbGwgY29udmVydGVkDQogKiBnZXR0ZXJzLCBzbyB0aGF0IGV2ZXJ5IG5lc3RlZCBwcm9wZXJ0eSBpbnNpZGUgdGhlIG9iamVjdA0KICogaXMgY29sbGVjdGVkIGFzIGEgImRlZXAiIGRlcGVuZGVuY3kuDQogKi8NCnZhciBzZWVuT2JqZWN0cyA9IG5ldyBfU2V0KCk7DQpmdW5jdGlvbiB0cmF2ZXJzZSAodmFsKSB7DQogIHNlZW5PYmplY3RzLmNsZWFyKCk7DQogIF90cmF2ZXJzZSh2YWwsIHNlZW5PYmplY3RzKTsNCn0NCg0KZnVuY3Rpb24gX3RyYXZlcnNlICh2YWwsIHNlZW4pIHsNCiAgdmFyIGksIGtleXM7DQogIHZhciBpc0EgPSBBcnJheS5pc0FycmF5KHZhbCk7DQogIGlmICgoIWlzQSAmJiAhaXNPYmplY3QodmFsKSkgfHwgIU9iamVjdC5pc0V4dGVuc2libGUodmFsKSkgew0KICAgIHJldHVybg0KICB9DQogIGlmICh2YWwuX19vYl9fKSB7DQogICAgdmFyIGRlcElkID0gdmFsLl9fb2JfXy5kZXAuaWQ7DQogICAgaWYgKHNlZW4uaGFzKGRlcElkKSkgew0KICAgICAgcmV0dXJuDQogICAgfQ0KICAgIHNlZW4uYWRkKGRlcElkKTsNCiAgfQ0KICBpZiAoaXNBKSB7DQogICAgaSA9IHZhbC5sZW5ndGg7DQogICAgd2hpbGUgKGktLSkgeyBfdHJhdmVyc2UodmFsW2ldLCBzZWVuKTsgfQ0KICB9IGVsc2Ugew0KICAgIGtleXMgPSBPYmplY3Qua2V5cyh2YWwpOw0KICAgIGkgPSBrZXlzLmxlbmd0aDsNCiAgICB3aGlsZSAoaS0tKSB7IF90cmF2ZXJzZSh2YWxba2V5c1tpXV0sIHNlZW4pOyB9DQogIH0NCn0NCg0KLyogICovDQoNCmZ1bmN0aW9uIGluaXRTdGF0ZSAodm0pIHsNCiAgdm0uX3dhdGNoZXJzID0gW107DQogIGluaXRQcm9wcyh2bSk7DQogIGluaXRNZXRob2RzKHZtKTsNCiAgaW5pdERhdGEodm0pOw0KICBpbml0Q29tcHV0ZWQodm0pOw0KICBpbml0V2F0Y2godm0pOw0KfQ0KDQp2YXIgaXNSZXNlcnZlZFByb3AgPSB7IGtleTogMSwgcmVmOiAxLCBzbG90OiAxIH07DQoNCmZ1bmN0aW9uIGluaXRQcm9wcyAodm0pIHsNCiAgdmFyIHByb3BzID0gdm0uJG9wdGlvbnMucHJvcHM7DQogIGlmIChwcm9wcykgew0KICAgIHZhciBwcm9wc0RhdGEgPSB2bS4kb3B0aW9ucy5wcm9wc0RhdGEgfHwge307DQogICAgdmFyIGtleXMgPSB2bS4kb3B0aW9ucy5fcHJvcEtleXMgPSBPYmplY3Qua2V5cyhwcm9wcyk7DQogICAgdmFyIGlzUm9vdCA9ICF2bS4kcGFyZW50Ow0KICAgIC8vIHJvb3QgaW5zdGFuY2UgcHJvcHMgc2hvdWxkIGJlIGNvbnZlcnRlZA0KICAgIG9ic2VydmVyU3RhdGUuc2hvdWxkQ29udmVydCA9IGlzUm9vdDsNCiAgICB2YXIgbG9vcCA9IGZ1bmN0aW9uICggaSApIHsNCiAgICAgIHZhciBrZXkgPSBrZXlzW2ldOw0KICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8NCiAgICAgIHsNCiAgICAgICAgaWYgKGlzUmVzZXJ2ZWRQcm9wW2tleV0pIHsNCiAgICAgICAgICB3YXJuKA0KICAgICAgICAgICAgKCJcIiIgKyBrZXkgKyAiXCIgaXMgYSByZXNlcnZlZCBhdHRyaWJ1dGUgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIGNvbXBvbmVudCBwcm9wLiIpLA0KICAgICAgICAgICAgdm0NCiAgICAgICAgICApOw0KICAgICAgICB9DQogICAgICAgIGRlZmluZVJlYWN0aXZlJCQxKHZtLCBrZXksIHZhbGlkYXRlUHJvcChrZXksIHByb3BzLCBwcm9wc0RhdGEsIHZtKSwgZnVuY3Rpb24gKCkgew0KICAgICAgICAgIGlmICh2bS4kcGFyZW50ICYmICFvYnNlcnZlclN0YXRlLmlzU2V0dGluZ1Byb3BzKSB7DQogICAgICAgICAgICB3YXJuKA0KICAgICAgICAgICAgICAiQXZvaWQgbXV0YXRpbmcgYSBwcm9wIGRpcmVjdGx5IHNpbmNlIHRoZSB2YWx1ZSB3aWxsIGJlICIgKw0KICAgICAgICAgICAgICAib3ZlcndyaXR0ZW4gd2hlbmV2ZXIgdGhlIHBhcmVudCBjb21wb25lbnQgcmUtcmVuZGVycy4gIiArDQogICAgICAgICAgICAgICJJbnN0ZWFkLCB1c2UgYSBkYXRhIG9yIGNvbXB1dGVkIHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwcm9wJ3MgIiArDQogICAgICAgICAgICAgICJ2YWx1ZS4gUHJvcCBiZWluZyBtdXRhdGVkOiBcIiIgKyBrZXkgKyAiXCIiLA0KICAgICAgICAgICAgICB2bQ0KICAgICAgICAgICAgKTsNCiAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgfQ0KICAgIH07DQoNCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIGxvb3AoIGkgKTsNCiAgICBvYnNlcnZlclN0YXRlLnNob3VsZENvbnZlcnQgPSB0cnVlOw0KICB9DQp9DQoNCmZ1bmN0aW9uIGluaXREYXRhICh2bSkgew0KICB2YXIgZGF0YSA9IHZtLiRvcHRpb25zLmRhdGE7DQogIGRhdGEgPSB2bS5fZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nDQogICAgPyBkYXRhLmNhbGwodm0pDQogICAgOiBkYXRhIHx8IHt9Ow0KICBpZiAoIWlzUGxhaW5PYmplY3QoZGF0YSkpIHsNCiAgICBkYXRhID0ge307DQogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oDQogICAgICAnZGF0YSBmdW5jdGlvbnMgc2hvdWxkIHJldHVybiBhbiBvYmplY3QuJywNCiAgICAgIHZtDQogICAgKTsNCiAgfQ0KICAvLyBwcm94eSBkYXRhIG9uIGluc3RhbmNlDQogIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7DQogIHZhciBwcm9wcyA9IHZtLiRvcHRpb25zLnByb3BzOw0KICB2YXIgaSA9IGtleXMubGVuZ3RoOw0KICB3aGlsZSAoaS0tKSB7DQogICAgaWYgKHByb3BzICYmIGhhc093bihwcm9wcywga2V5c1tpXSkpIHsNCiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKA0KICAgICAgICAiVGhlIGRhdGEgcHJvcGVydHkgXCIiICsgKGtleXNbaV0pICsgIlwiIGlzIGFscmVhZHkgZGVjbGFyZWQgYXMgYSBwcm9wLiAiICsNCiAgICAgICAgIlVzZSBwcm9wIGRlZmF1bHQgdmFsdWUgaW5zdGVhZC4iLA0KICAgICAgICB2bQ0KICAgICAgKTsNCiAgICB9IGVsc2Ugew0KICAgICAgcHJveHkodm0sIGtleXNbaV0pOw0KICAgIH0NCiAgfQ0KICAvLyBvYnNlcnZlIGRhdGENCiAgb2JzZXJ2ZShkYXRhKTsNCiAgZGF0YS5fX29iX18gJiYgZGF0YS5fX29iX18udm1Db3VudCsrOw0KfQ0KDQp2YXIgY29tcHV0ZWRTaGFyZWREZWZpbml0aW9uID0gew0KICBlbnVtZXJhYmxlOiB0cnVlLA0KICBjb25maWd1cmFibGU6IHRydWUsDQogIGdldDogbm9vcCwNCiAgc2V0OiBub29wDQp9Ow0KDQpmdW5jdGlvbiBpbml0Q29tcHV0ZWQgKHZtKSB7DQogIHZhciBjb21wdXRlZCA9IHZtLiRvcHRpb25zLmNvbXB1dGVkOw0KICBpZiAoY29tcHV0ZWQpIHsNCiAgICBmb3IgKHZhciBrZXkgaW4gY29tcHV0ZWQpIHsNCiAgICAgIHZhciB1c2VyRGVmID0gY29tcHV0ZWRba2V5XTsNCiAgICAgIGlmICh0eXBlb2YgdXNlckRlZiA9PT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICBjb21wdXRlZFNoYXJlZERlZmluaXRpb24uZ2V0ID0gbWFrZUNvbXB1dGVkR2V0dGVyKHVzZXJEZWYsIHZtKTsNCiAgICAgICAgY29tcHV0ZWRTaGFyZWREZWZpbml0aW9uLnNldCA9IG5vb3A7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBjb21wdXRlZFNoYXJlZERlZmluaXRpb24uZ2V0ID0gdXNlckRlZi5nZXQNCiAgICAgICAgICA/IHVzZXJEZWYuY2FjaGUgIT09IGZhbHNlDQogICAgICAgICAgICA/IG1ha2VDb21wdXRlZEdldHRlcih1c2VyRGVmLmdldCwgdm0pDQogICAgICAgICAgICA6IGJpbmQkMSh1c2VyRGVmLmdldCwgdm0pDQogICAgICAgICAgOiBub29wOw0KICAgICAgICBjb21wdXRlZFNoYXJlZERlZmluaXRpb24uc2V0ID0gdXNlckRlZi5zZXQNCiAgICAgICAgICA/IGJpbmQkMSh1c2VyRGVmLnNldCwgdm0pDQogICAgICAgICAgOiBub29wOw0KICAgICAgfQ0KICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZtLCBrZXksIGNvbXB1dGVkU2hhcmVkRGVmaW5pdGlvbik7DQogICAgfQ0KICB9DQp9DQoNCmZ1bmN0aW9uIG1ha2VDb21wdXRlZEdldHRlciAoZ2V0dGVyLCBvd25lcikgew0KICB2YXIgd2F0Y2hlciA9IG5ldyBXYXRjaGVyKG93bmVyLCBnZXR0ZXIsIG5vb3AsIHsNCiAgICBsYXp5OiB0cnVlDQogIH0pOw0KICByZXR1cm4gZnVuY3Rpb24gY29tcHV0ZWRHZXR0ZXIgKCkgew0KICAgIGlmICh3YXRjaGVyLmRpcnR5KSB7DQogICAgICB3YXRjaGVyLmV2YWx1YXRlKCk7DQogICAgfQ0KICAgIGlmIChEZXAudGFyZ2V0KSB7DQogICAgICB3YXRjaGVyLmRlcGVuZCgpOw0KICAgIH0NCiAgICByZXR1cm4gd2F0Y2hlci52YWx1ZQ0KICB9DQp9DQoNCmZ1bmN0aW9uIGluaXRNZXRob2RzICh2bSkgew0KICB2YXIgbWV0aG9kcyA9IHZtLiRvcHRpb25zLm1ldGhvZHM7DQogIGlmIChtZXRob2RzKSB7DQogICAgZm9yICh2YXIga2V5IGluIG1ldGhvZHMpIHsNCiAgICAgIHZtW2tleV0gPSBtZXRob2RzW2tleV0gPT0gbnVsbCA/IG5vb3AgOiBiaW5kJDEobWV0aG9kc1trZXldLCB2bSk7DQogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIG1ldGhvZHNba2V5XSA9PSBudWxsKSB7DQogICAgICAgIHdhcm4oDQogICAgICAgICAgIm1ldGhvZCBcIiIgKyBrZXkgKyAiXCIgaGFzIGFuIHVuZGVmaW5lZCB2YWx1ZSBpbiB0aGUgY29tcG9uZW50IGRlZmluaXRpb24uICIgKw0KICAgICAgICAgICJEaWQgeW91IHJlZmVyZW5jZSB0aGUgZnVuY3Rpb24gY29ycmVjdGx5PyIsDQogICAgICAgICAgdm0NCiAgICAgICAgKTsNCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg0KZnVuY3Rpb24gaW5pdFdhdGNoICh2bSkgew0KICB2YXIgd2F0Y2ggPSB2bS4kb3B0aW9ucy53YXRjaDsNCiAgaWYgKHdhdGNoKSB7DQogICAgZm9yICh2YXIga2V5IGluIHdhdGNoKSB7DQogICAgICB2YXIgaGFuZGxlciA9IHdhdGNoW2tleV07DQogICAgICBpZiAoQXJyYXkuaXNBcnJheShoYW5kbGVyKSkgew0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXIubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICBjcmVhdGVXYXRjaGVyKHZtLCBrZXksIGhhbmRsZXJbaV0pOw0KICAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICBjcmVhdGVXYXRjaGVyKHZtLCBrZXksIGhhbmRsZXIpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfQ0KDQpmdW5jdGlvbiBjcmVhdGVXYXRjaGVyICh2bSwga2V5LCBoYW5kbGVyKSB7DQogIHZhciBvcHRpb25zOw0KICBpZiAoaXNQbGFpbk9iamVjdChoYW5kbGVyKSkgew0KICAgIG9wdGlvbnMgPSBoYW5kbGVyOw0KICAgIGhhbmRsZXIgPSBoYW5kbGVyLmhhbmRsZXI7DQogIH0NCiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnc3RyaW5nJykgew0KICAgIGhhbmRsZXIgPSB2bVtoYW5kbGVyXTsNCiAgfQ0KICB2bS4kd2F0Y2goa2V5LCBoYW5kbGVyLCBvcHRpb25zKTsNCn0NCg0KZnVuY3Rpb24gc3RhdGVNaXhpbiAoVnVlKSB7DQogIC8vIGZsb3cgc29tZWhvdyBoYXMgcHJvYmxlbXMgd2l0aCBkaXJlY3RseSBkZWNsYXJlZCBkZWZpbml0aW9uIG9iamVjdA0KICAvLyB3aGVuIHVzaW5nIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSwgc28gd2UgaGF2ZSB0byBwcm9jZWR1cmFsbHkgYnVpbGQgdXANCiAgLy8gdGhlIG9iamVjdCBoZXJlLg0KICB2YXIgZGF0YURlZiA9IHt9Ow0KICBkYXRhRGVmLmdldCA9IGZ1bmN0aW9uICgpIHsNCiAgICByZXR1cm4gdGhpcy5fZGF0YQ0KICB9Ow0KICB7DQogICAgZGF0YURlZi5zZXQgPSBmdW5jdGlvbiAobmV3RGF0YSkgew0KICAgICAgd2FybigNCiAgICAgICAgJ0F2b2lkIHJlcGxhY2luZyBpbnN0YW5jZSByb290ICRkYXRhLiAnICsNCiAgICAgICAgJ1VzZSBuZXN0ZWQgZGF0YSBwcm9wZXJ0aWVzIGluc3RlYWQuJywNCiAgICAgICAgdGhpcw0KICAgICAgKTsNCiAgICB9Ow0KICB9DQogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJGRhdGEnLCBkYXRhRGVmKTsNCg0KICBWdWUucHJvdG90eXBlLiRzZXQgPSBzZXQkMTsNCiAgVnVlLnByb3RvdHlwZS4kZGVsZXRlID0gZGVsOw0KDQogIFZ1ZS5wcm90b3R5cGUuJHdhdGNoID0gZnVuY3Rpb24gKA0KICAgIGV4cE9yRm4sDQogICAgY2IsDQogICAgb3B0aW9ucw0KICApIHsNCiAgICB2YXIgdm0gPSB0aGlzOw0KICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9Ow0KICAgIG9wdGlvbnMudXNlciA9IHRydWU7DQogICAgdmFyIHdhdGNoZXIgPSBuZXcgV2F0Y2hlcih2bSwgZXhwT3JGbiwgY2IsIG9wdGlvbnMpOw0KICAgIGlmIChvcHRpb25zLmltbWVkaWF0ZSkgew0KICAgICAgY2IuY2FsbCh2bSwgd2F0Y2hlci52YWx1ZSk7DQogICAgfQ0KICAgIHJldHVybiBmdW5jdGlvbiB1bndhdGNoRm4gKCkgew0KICAgICAgd2F0Y2hlci50ZWFyZG93bigpOw0KICAgIH0NCiAgfTsNCn0NCg0KZnVuY3Rpb24gcHJveHkgKHZtLCBrZXkpIHsNCiAgaWYgKCFpc1Jlc2VydmVkKGtleSkpIHsNCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodm0sIGtleSwgew0KICAgICAgY29uZmlndXJhYmxlOiB0cnVlLA0KICAgICAgZW51bWVyYWJsZTogdHJ1ZSwNCiAgICAgIGdldDogZnVuY3Rpb24gcHJveHlHZXR0ZXIgKCkgew0KICAgICAgICByZXR1cm4gdm0uX2RhdGFba2V5XQ0KICAgICAgfSwNCiAgICAgIHNldDogZnVuY3Rpb24gcHJveHlTZXR0ZXIgKHZhbCkgew0KICAgICAgICB2bS5fZGF0YVtrZXldID0gdmFsOw0KICAgICAgfQ0KICAgIH0pOw0KICB9DQp9DQoNCi8qICAqLw0KDQp2YXIgVk5vZGUgPSBmdW5jdGlvbiBWTm9kZSAoDQogIHRhZywNCiAgZGF0YSwNCiAgY2hpbGRyZW4sDQogIHRleHQsDQogIGVsbSwNCiAgbnMsDQogIGNvbnRleHQsDQogIGNvbXBvbmVudE9wdGlvbnMNCikgew0KICB0aGlzLnRhZyA9IHRhZzsNCiAgdGhpcy5kYXRhID0gZGF0YTsNCiAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOw0KICB0aGlzLnRleHQgPSB0ZXh0Ow0KICB0aGlzLmVsbSA9IGVsbTsNCiAgdGhpcy5ucyA9IG5zOw0KICB0aGlzLmNvbnRleHQgPSBjb250ZXh0Ow0KICB0aGlzLmZ1bmN0aW9uYWxDb250ZXh0ID0gdW5kZWZpbmVkOw0KICB0aGlzLmtleSA9IGRhdGEgJiYgZGF0YS5rZXk7DQogIHRoaXMuY29tcG9uZW50T3B0aW9ucyA9IGNvbXBvbmVudE9wdGlvbnM7DQogIHRoaXMuY2hpbGQgPSB1bmRlZmluZWQ7DQogIHRoaXMucGFyZW50ID0gdW5kZWZpbmVkOw0KICB0aGlzLnJhdyA9IGZhbHNlOw0KICB0aGlzLmlzU3RhdGljID0gZmFsc2U7DQogIHRoaXMuaXNSb290SW5zZXJ0ID0gdHJ1ZTsNCiAgdGhpcy5pc0NvbW1lbnQgPSBmYWxzZTsNCiAgdGhpcy5pc0Nsb25lZCA9IGZhbHNlOw0KICB0aGlzLmlzT25jZSA9IGZhbHNlOw0KfTsNCg0KdmFyIGVtcHR5Vk5vZGUgPSBmdW5jdGlvbiAoKSB7DQogIHZhciBub2RlID0gbmV3IFZOb2RlKCk7DQogIG5vZGUudGV4dCA9ICcnOw0KICBub2RlLmlzQ29tbWVudCA9IHRydWU7DQogIHJldHVybiBub2RlDQp9Ow0KDQovLyBvcHRpbWl6ZWQgc2hhbGxvdyBjbG9uZQ0KLy8gdXNlZCBmb3Igc3RhdGljIG5vZGVzIGFuZCBzbG90IG5vZGVzIGJlY2F1c2UgdGhleSBtYXkgYmUgcmV1c2VkIGFjcm9zcw0KLy8gbXVsdGlwbGUgcmVuZGVycywgY2xvbmluZyB0aGVtIGF2b2lkcyBlcnJvcnMgd2hlbiBET00gbWFuaXB1bGF0aW9ucyByZWx5DQovLyBvbiB0aGVpciBlbG0gcmVmZXJlbmNlLg0KZnVuY3Rpb24gY2xvbmVWTm9kZSAodm5vZGUpIHsNCiAgdmFyIGNsb25lZCA9IG5ldyBWTm9kZSgNCiAgICB2bm9kZS50YWcsDQogICAgdm5vZGUuZGF0YSwNCiAgICB2bm9kZS5jaGlsZHJlbiwNCiAgICB2bm9kZS50ZXh0LA0KICAgIHZub2RlLmVsbSwNCiAgICB2bm9kZS5ucywNCiAgICB2bm9kZS5jb250ZXh0LA0KICAgIHZub2RlLmNvbXBvbmVudE9wdGlvbnMNCiAgKTsNCiAgY2xvbmVkLmlzU3RhdGljID0gdm5vZGUuaXNTdGF0aWM7DQogIGNsb25lZC5rZXkgPSB2bm9kZS5rZXk7DQogIGNsb25lZC5pc0Nsb25lZCA9IHRydWU7DQogIHJldHVybiBjbG9uZWQNCn0NCg0KZnVuY3Rpb24gY2xvbmVWTm9kZXMgKHZub2Rlcykgew0KICB2YXIgcmVzID0gbmV3IEFycmF5KHZub2Rlcy5sZW5ndGgpOw0KICBmb3IgKHZhciBpID0gMDsgaSA8IHZub2Rlcy5sZW5ndGg7IGkrKykgew0KICAgIHJlc1tpXSA9IGNsb25lVk5vZGUodm5vZGVzW2ldKTsNCiAgfQ0KICByZXR1cm4gcmVzDQp9DQoNCi8qICAqLw0KDQpmdW5jdGlvbiBtZXJnZVZOb2RlSG9vayAoZGVmLCBob29rS2V5LCBob29rLCBrZXkpIHsNCiAga2V5ID0ga2V5ICsgaG9va0tleTsNCiAgdmFyIGluamVjdGVkSGFzaCA9IGRlZi5fX2luamVjdGVkIHx8IChkZWYuX19pbmplY3RlZCA9IHt9KTsNCiAgaWYgKCFpbmplY3RlZEhhc2hba2V5XSkgew0KICAgIGluamVjdGVkSGFzaFtrZXldID0gdHJ1ZTsNCiAgICB2YXIgb2xkSG9vayA9IGRlZltob29rS2V5XTsNCiAgICBpZiAob2xkSG9vaykgew0KICAgICAgZGVmW2hvb2tLZXldID0gZnVuY3Rpb24gKCkgew0KICAgICAgICBvbGRIb29rLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQogICAgICAgIGhvb2suYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICAgIH07DQogICAgfSBlbHNlIHsNCiAgICAgIGRlZltob29rS2V5XSA9IGhvb2s7DQogICAgfQ0KICB9DQp9DQoNCi8qICAqLw0KDQpmdW5jdGlvbiB1cGRhdGVMaXN0ZW5lcnMgKA0KICBvbiwNCiAgb2xkT24sDQogIGFkZCwNCiAgcmVtb3ZlJCQxLA0KICB2bQ0KKSB7DQogIHZhciBuYW1lLCBjdXIsIG9sZCwgZm4sIGV2ZW50LCBjYXB0dXJlLCBvbmNlOw0KICBmb3IgKG5hbWUgaW4gb24pIHsNCiAgICBjdXIgPSBvbltuYW1lXTsNCiAgICBvbGQgPSBvbGRPbltuYW1lXTsNCiAgICBpZiAoIWN1cikgew0KICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oDQogICAgICAgICJJbnZhbGlkIGhhbmRsZXIgZm9yIGV2ZW50IFwiIiArIG5hbWUgKyAiXCI6IGdvdCAiICsgU3RyaW5nKGN1ciksDQogICAgICAgIHZtDQogICAgICApOw0KICAgIH0gZWxzZSBpZiAoIW9sZCkgew0KICAgICAgb25jZSA9IG5hbWUuY2hhckF0KDApID09PSAnfic7IC8vIFByZWZpeGVkIGxhc3QsIGNoZWNrZWQgZmlyc3QNCiAgICAgIGV2ZW50ID0gb25jZSA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lOw0KICAgICAgY2FwdHVyZSA9IGV2ZW50LmNoYXJBdCgwKSA9PT0gJyEnOw0KICAgICAgZXZlbnQgPSBjYXB0dXJlID8gZXZlbnQuc2xpY2UoMSkgOiBldmVudDsNCiAgICAgIGlmIChBcnJheS5pc0FycmF5KGN1cikpIHsNCiAgICAgICAgYWRkKGV2ZW50LCAoY3VyLmludm9rZXIgPSBhcnJJbnZva2VyKGN1cikpLCBvbmNlLCBjYXB0dXJlKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGlmICghY3VyLmludm9rZXIpIHsNCiAgICAgICAgICBmbiA9IGN1cjsNCiAgICAgICAgICBjdXIgPSBvbltuYW1lXSA9IHt9Ow0KICAgICAgICAgIGN1ci5mbiA9IGZuOw0KICAgICAgICAgIGN1ci5pbnZva2VyID0gZm5JbnZva2VyKGN1cik7DQogICAgICAgIH0NCiAgICAgICAgYWRkKGV2ZW50LCBjdXIuaW52b2tlciwgb25jZSwgY2FwdHVyZSk7DQogICAgICB9DQogICAgfSBlbHNlIGlmIChjdXIgIT09IG9sZCkgew0KICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2xkKSkgew0KICAgICAgICBvbGQubGVuZ3RoID0gY3VyLmxlbmd0aDsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvbGQubGVuZ3RoOyBpKyspIHsgb2xkW2ldID0gY3VyW2ldOyB9DQogICAgICAgIG9uW25hbWVdID0gb2xkOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgb2xkLmZuID0gY3VyOw0KICAgICAgICBvbltuYW1lXSA9IG9sZDsNCiAgICAgIH0NCiAgICB9DQogIH0NCiAgZm9yIChuYW1lIGluIG9sZE9uKSB7DQogICAgaWYgKCFvbltuYW1lXSkgew0KICAgICAgb25jZSA9IG5hbWUuY2hhckF0KDApID09PSAnfic7IC8vIFByZWZpeGVkIGxhc3QsIGNoZWNrZWQgZmlyc3QNCiAgICAgIGV2ZW50ID0gb25jZSA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lOw0KICAgICAgY2FwdHVyZSA9IGV2ZW50LmNoYXJBdCgwKSA9PT0gJyEnOw0KICAgICAgZXZlbnQgPSBjYXB0dXJlID8gZXZlbnQuc2xpY2UoMSkgOiBldmVudDsNCiAgICAgIHJlbW92ZSQkMShldmVudCwgb2xkT25bbmFtZV0uaW52b2tlciwgY2FwdHVyZSk7DQogICAgfQ0KICB9DQp9DQoNCmZ1bmN0aW9uIGFyckludm9rZXIgKGFycikgew0KICByZXR1cm4gZnVuY3Rpb24gKGV2KSB7DQogICAgdmFyIGFyZ3VtZW50cyQxID0gYXJndW1lbnRzOw0KDQogICAgdmFyIHNpbmdsZSA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDE7DQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsNCiAgICAgIHNpbmdsZSA/IGFycltpXShldikgOiBhcnJbaV0uYXBwbHkobnVsbCwgYXJndW1lbnRzJDEpOw0KICAgIH0NCiAgfQ0KfQ0KDQpmdW5jdGlvbiBmbkludm9rZXIgKG8pIHsNCiAgcmV0dXJuIGZ1bmN0aW9uIChldikgew0KICAgIHZhciBzaW5nbGUgPSBhcmd1bWVudHMubGVuZ3RoID09PSAxOw0KICAgIHNpbmdsZSA/IG8uZm4oZXYpIDogby5mbi5hcHBseShudWxsLCBhcmd1bWVudHMpOw0KICB9DQp9DQoNCi8qICAqLw0KDQpmdW5jdGlvbiBub3JtYWxpemVDaGlsZHJlbiAoDQogIGNoaWxkcmVuLA0KICBucywNCiAgbmVzdGVkSW5kZXgNCikgew0KICBpZiAoaXNQcmltaXRpdmUoY2hpbGRyZW4pKSB7DQogICAgcmV0dXJuIFtjcmVhdGVUZXh0Vk5vZGUoY2hpbGRyZW4pXQ0KICB9DQogIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgew0KICAgIHZhciByZXMgPSBbXTsNCiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykgew0KICAgICAgdmFyIGMgPSBjaGlsZHJlbltpXTsNCiAgICAgIHZhciBsYXN0ID0gcmVzW3Jlcy5sZW5ndGggLSAxXTsNCiAgICAgIC8vICBuZXN0ZWQNCiAgICAgIGlmIChBcnJheS5pc0FycmF5KGMpKSB7DQogICAgICAgIHJlcy5wdXNoLmFwcGx5KHJlcywgbm9ybWFsaXplQ2hpbGRyZW4oYywgbnMsICgobmVzdGVkSW5kZXggfHwgJycpICsgIl8iICsgaSkpKTsNCiAgICAgIH0gZWxzZSBpZiAoaXNQcmltaXRpdmUoYykpIHsNCiAgICAgICAgaWYgKGxhc3QgJiYgbGFzdC50ZXh0KSB7DQogICAgICAgICAgbGFzdC50ZXh0ICs9IFN0cmluZyhjKTsNCiAgICAgICAgfSBlbHNlIGlmIChjICE9PSAnJykgew0KICAgICAgICAgIC8vIGNvbnZlcnQgcHJpbWl0aXZlIHRvIHZub2RlDQogICAgICAgICAgcmVzLnB1c2goY3JlYXRlVGV4dFZOb2RlKGMpKTsNCiAgICAgICAgfQ0KICAgICAgfSBlbHNlIGlmIChjIGluc3RhbmNlb2YgVk5vZGUpIHsNCiAgICAgICAgaWYgKGMudGV4dCAmJiBsYXN0ICYmIGxhc3QudGV4dCkgew0KICAgICAgICAgIGlmICghbGFzdC5pc0Nsb25lZCkgew0KICAgICAgICAgICAgbGFzdC50ZXh0ICs9IGMudGV4dDsNCiAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgLy8gaW5oZXJpdCBwYXJlbnQgbmFtZXNwYWNlDQogICAgICAgICAgaWYgKG5zKSB7DQogICAgICAgICAgICBhcHBseU5TKGMsIG5zKTsNCiAgICAgICAgICB9DQogICAgICAgICAgLy8gZGVmYXVsdCBrZXkgZm9yIG5lc3RlZCBhcnJheSBjaGlsZHJlbiAobGlrZWx5IGdlbmVyYXRlZCBieSB2LWZvcikNCiAgICAgICAgICBpZiAoYy50YWcgJiYgYy5rZXkgPT0gbnVsbCAmJiBuZXN0ZWRJbmRleCAhPSBudWxsKSB7DQogICAgICAgICAgICBjLmtleSA9ICJfX3ZsaXN0IiArIG5lc3RlZEluZGV4ICsgIl8iICsgaSArICJfXyI7DQogICAgICAgICAgfQ0KICAgICAgICAgIHJlcy5wdXNoKGMpOw0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICAgIHJldHVybiByZXMNCiAgfQ0KfQ0KDQpmdW5jdGlvbiBjcmVhdGVUZXh0Vk5vZGUgKHZhbCkgew0KICByZXR1cm4gbmV3IFZOb2RlKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIFN0cmluZyh2YWwpKQ0KfQ0KDQpmdW5jdGlvbiBhcHBseU5TICh2bm9kZSwgbnMpIHsNCiAgaWYgKHZub2RlLnRhZyAmJiAhdm5vZGUubnMpIHsNCiAgICB2bm9kZS5ucyA9IG5zOw0KICAgIGlmICh2bm9kZS5jaGlsZHJlbikgew0KICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSB2bm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHsNCiAgICAgICAgYXBwbHlOUyh2bm9kZS5jaGlsZHJlbltpXSwgbnMpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfQ0KDQovKiAgKi8NCg0KZnVuY3Rpb24gZ2V0Rmlyc3RDb21wb25lbnRDaGlsZCAoY2hpbGRyZW4pIHsNCiAgcmV0dXJuIGNoaWxkcmVuICYmIGNoaWxkcmVuLmZpbHRlcihmdW5jdGlvbiAoYykgeyByZXR1cm4gYyAmJiBjLmNvbXBvbmVudE9wdGlvbnM7IH0pWzBdDQp9DQoNCi8qICAqLw0KDQp2YXIgYWN0aXZlSW5zdGFuY2UgPSBudWxsOw0KDQpmdW5jdGlvbiBpbml0TGlmZWN5Y2xlICh2bSkgew0KICB2YXIgb3B0aW9ucyA9IHZtLiRvcHRpb25zOw0KDQogIC8vIGxvY2F0ZSBmaXJzdCBub24tYWJzdHJhY3QgcGFyZW50DQogIHZhciBwYXJlbnQgPSBvcHRpb25zLnBhcmVudDsNCiAgaWYgKHBhcmVudCAmJiAhb3B0aW9ucy5hYnN0cmFjdCkgew0KICAgIHdoaWxlIChwYXJlbnQuJG9wdGlvbnMuYWJzdHJhY3QgJiYgcGFyZW50LiRwYXJlbnQpIHsNCiAgICAgIHBhcmVudCA9IHBhcmVudC4kcGFyZW50Ow0KICAgIH0NCiAgICBwYXJlbnQuJGNoaWxkcmVuLnB1c2godm0pOw0KICB9DQoNCiAgdm0uJHBhcmVudCA9IHBhcmVudDsNCiAgdm0uJHJvb3QgPSBwYXJlbnQgPyBwYXJlbnQuJHJvb3QgOiB2bTsNCg0KICB2bS4kY2hpbGRyZW4gPSBbXTsNCiAgdm0uJHJlZnMgPSB7fTsNCg0KICB2bS5fd2F0Y2hlciA9IG51bGw7DQogIHZtLl9pbmFjdGl2ZSA9IGZhbHNlOw0KICB2bS5faXNNb3VudGVkID0gZmFsc2U7DQogIHZtLl9pc0Rlc3Ryb3llZCA9IGZhbHNlOw0KICB2bS5faXNCZWluZ0Rlc3Ryb3llZCA9IGZhbHNlOw0KfQ0KDQpmdW5jdGlvbiBsaWZlY3ljbGVNaXhpbiAoVnVlKSB7DQogIFZ1ZS5wcm90b3R5cGUuX21vdW50ID0gZnVuY3Rpb24gKA0KICAgIGVsLA0KICAgIGh5ZHJhdGluZw0KICApIHsNCiAgICB2YXIgdm0gPSB0aGlzOw0KICAgIHZtLiRlbCA9IGVsOw0KICAgIGlmICghdm0uJG9wdGlvbnMucmVuZGVyKSB7DQogICAgICB2bS4kb3B0aW9ucy5yZW5kZXIgPSBlbXB0eVZOb2RlOw0KICAgICAgew0KICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8NCiAgICAgICAgaWYgKHZtLiRvcHRpb25zLnRlbXBsYXRlICYmIHZtLiRvcHRpb25zLnRlbXBsYXRlLmNoYXJBdCgwKSAhPT0gJyMnKSB7DQogICAgICAgICAgd2FybigNCiAgICAgICAgICAgICdZb3UgYXJlIHVzaW5nIHRoZSBydW50aW1lLW9ubHkgYnVpbGQgb2YgVnVlIHdoZXJlIHRoZSB0ZW1wbGF0ZSAnICsNCiAgICAgICAgICAgICdvcHRpb24gaXMgbm90IGF2YWlsYWJsZS4gRWl0aGVyIHByZS1jb21waWxlIHRoZSB0ZW1wbGF0ZXMgaW50byAnICsNCiAgICAgICAgICAgICdyZW5kZXIgZnVuY3Rpb25zLCBvciB1c2UgdGhlIGNvbXBpbGVyLWluY2x1ZGVkIGJ1aWxkLicsDQogICAgICAgICAgICB2bQ0KICAgICAgICAgICk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgd2FybigNCiAgICAgICAgICAgICdGYWlsZWQgdG8gbW91bnQgY29tcG9uZW50OiB0ZW1wbGF0ZSBvciByZW5kZXIgZnVuY3Rpb24gbm90IGRlZmluZWQuJywNCiAgICAgICAgICAgIHZtDQogICAgICAgICAgKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgICBjYWxsSG9vayh2bSwgJ2JlZm9yZU1vdW50Jyk7DQogICAgdm0uX3dhdGNoZXIgPSBuZXcgV2F0Y2hlcih2bSwgZnVuY3Rpb24gKCkgew0KICAgICAgdm0uX3VwZGF0ZSh2bS5fcmVuZGVyKCksIGh5ZHJhdGluZyk7DQogICAgfSwgbm9vcCk7DQogICAgaHlkcmF0aW5nID0gZmFsc2U7DQogICAgLy8gbWFudWFsbHkgbW91bnRlZCBpbnN0YW5jZSwgY2FsbCBtb3VudGVkIG9uIHNlbGYNCiAgICAvLyBtb3VudGVkIGlzIGNhbGxlZCBmb3IgcmVuZGVyLWNyZWF0ZWQgY2hpbGQgY29tcG9uZW50cyBpbiBpdHMgaW5zZXJ0ZWQgaG9vaw0KICAgIGlmICh2bS4kdm5vZGUgPT0gbnVsbCkgew0KICAgICAgdm0uX2lzTW91bnRlZCA9IHRydWU7DQogICAgICBjYWxsSG9vayh2bSwgJ21vdW50ZWQnKTsNCiAgICB9DQogICAgcmV0dXJuIHZtDQogIH07DQoNCiAgVnVlLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gKHZub2RlLCBoeWRyYXRpbmcpIHsNCiAgICB2YXIgdm0gPSB0aGlzOw0KICAgIGlmICh2bS5faXNNb3VudGVkKSB7DQogICAgICBjYWxsSG9vayh2bSwgJ2JlZm9yZVVwZGF0ZScpOw0KICAgIH0NCiAgICB2YXIgcHJldkVsID0gdm0uJGVsOw0KICAgIHZhciBwcmV2Vm5vZGUgPSB2bS5fdm5vZGU7DQogICAgdmFyIHByZXZBY3RpdmVJbnN0YW5jZSA9IGFjdGl2ZUluc3RhbmNlOw0KICAgIGFjdGl2ZUluc3RhbmNlID0gdm07DQogICAgdm0uX3Zub2RlID0gdm5vZGU7DQogICAgLy8gVnVlLnByb3RvdHlwZS5fX3BhdGNoX18gaXMgaW5qZWN0ZWQgaW4gZW50cnkgcG9pbnRzDQogICAgLy8gYmFzZWQgb24gdGhlIHJlbmRlcmluZyBiYWNrZW5kIHVzZWQuDQogICAgaWYgKCFwcmV2Vm5vZGUpIHsNCiAgICAgIC8vIGluaXRpYWwgcmVuZGVyDQogICAgICB2bS4kZWwgPSB2bS5fX3BhdGNoX18oDQogICAgICAgIHZtLiRlbCwgdm5vZGUsIGh5ZHJhdGluZywgZmFsc2UgLyogcmVtb3ZlT25seSAqLywNCiAgICAgICAgdm0uJG9wdGlvbnMuX3BhcmVudEVsbSwNCiAgICAgICAgdm0uJG9wdGlvbnMuX3JlZkVsbQ0KICAgICAgKTsNCiAgICB9IGVsc2Ugew0KICAgICAgLy8gdXBkYXRlcw0KICAgICAgdm0uJGVsID0gdm0uX19wYXRjaF9fKHByZXZWbm9kZSwgdm5vZGUpOw0KICAgIH0NCiAgICBhY3RpdmVJbnN0YW5jZSA9IHByZXZBY3RpdmVJbnN0YW5jZTsNCiAgICAvLyB1cGRhdGUgX192dWVfXyByZWZlcmVuY2UNCiAgICBpZiAocHJldkVsKSB7DQogICAgICBwcmV2RWwuX192dWVfXyA9IG51bGw7DQogICAgfQ0KICAgIGlmICh2bS4kZWwpIHsNCiAgICAgIHZtLiRlbC5fX3Z1ZV9fID0gdm07DQogICAgfQ0KICAgIC8vIGlmIHBhcmVudCBpcyBhbiBIT0MsIHVwZGF0ZSBpdHMgJGVsIGFzIHdlbGwNCiAgICBpZiAodm0uJHZub2RlICYmIHZtLiRwYXJlbnQgJiYgdm0uJHZub2RlID09PSB2bS4kcGFyZW50Ll92bm9kZSkgew0KICAgICAgdm0uJHBhcmVudC4kZWwgPSB2bS4kZWw7DQogICAgfQ0KICAgIGlmICh2bS5faXNNb3VudGVkKSB7DQogICAgICBjYWxsSG9vayh2bSwgJ3VwZGF0ZWQnKTsNCiAgICB9DQogIH07DQoNCiAgVnVlLnByb3RvdHlwZS5fdXBkYXRlRnJvbVBhcmVudCA9IGZ1bmN0aW9uICgNCiAgICBwcm9wc0RhdGEsDQogICAgbGlzdGVuZXJzLA0KICAgIHBhcmVudFZub2RlLA0KICAgIHJlbmRlckNoaWxkcmVuDQogICkgew0KICAgIHZhciB2bSA9IHRoaXM7DQogICAgdmFyIGhhc0NoaWxkcmVuID0gISEodm0uJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuIHx8IHJlbmRlckNoaWxkcmVuKTsNCiAgICB2bS4kb3B0aW9ucy5fcGFyZW50Vm5vZGUgPSBwYXJlbnRWbm9kZTsNCiAgICB2bS4kdm5vZGUgPSBwYXJlbnRWbm9kZTsgLy8gdXBkYXRlIHZtJ3MgcGxhY2Vob2xkZXIgbm9kZSB3aXRob3V0IHJlLXJlbmRlcg0KICAgIGlmICh2bS5fdm5vZGUpIHsgLy8gdXBkYXRlIGNoaWxkIHRyZWUncyBwYXJlbnQNCiAgICAgIHZtLl92bm9kZS5wYXJlbnQgPSBwYXJlbnRWbm9kZTsNCiAgICB9DQogICAgdm0uJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuID0gcmVuZGVyQ2hpbGRyZW47DQogICAgLy8gdXBkYXRlIHByb3BzDQogICAgaWYgKHByb3BzRGF0YSAmJiB2bS4kb3B0aW9ucy5wcm9wcykgew0KICAgICAgb2JzZXJ2ZXJTdGF0ZS5zaG91bGRDb252ZXJ0ID0gZmFsc2U7DQogICAgICB7DQogICAgICAgIG9ic2VydmVyU3RhdGUuaXNTZXR0aW5nUHJvcHMgPSB0cnVlOw0KICAgICAgfQ0KICAgICAgdmFyIHByb3BLZXlzID0gdm0uJG9wdGlvbnMuX3Byb3BLZXlzIHx8IFtdOw0KICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wS2V5cy5sZW5ndGg7IGkrKykgew0KICAgICAgICB2YXIga2V5ID0gcHJvcEtleXNbaV07DQogICAgICAgIHZtW2tleV0gPSB2YWxpZGF0ZVByb3Aoa2V5LCB2bS4kb3B0aW9ucy5wcm9wcywgcHJvcHNEYXRhLCB2bSk7DQogICAgICB9DQogICAgICBvYnNlcnZlclN0YXRlLnNob3VsZENvbnZlcnQgPSB0cnVlOw0KICAgICAgew0KICAgICAgICBvYnNlcnZlclN0YXRlLmlzU2V0dGluZ1Byb3BzID0gZmFsc2U7DQogICAgICB9DQogICAgICB2bS4kb3B0aW9ucy5wcm9wc0RhdGEgPSBwcm9wc0RhdGE7DQogICAgfQ0KICAgIC8vIHVwZGF0ZSBsaXN0ZW5lcnMNCiAgICBpZiAobGlzdGVuZXJzKSB7DQogICAgICB2YXIgb2xkTGlzdGVuZXJzID0gdm0uJG9wdGlvbnMuX3BhcmVudExpc3RlbmVyczsNCiAgICAgIHZtLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7DQogICAgICB2bS5fdXBkYXRlTGlzdGVuZXJzKGxpc3RlbmVycywgb2xkTGlzdGVuZXJzKTsNCiAgICB9DQogICAgLy8gcmVzb2x2ZSBzbG90cyArIGZvcmNlIHVwZGF0ZSBpZiBoYXMgY2hpbGRyZW4NCiAgICBpZiAoaGFzQ2hpbGRyZW4pIHsNCiAgICAgIHZtLiRzbG90cyA9IHJlc29sdmVTbG90cyhyZW5kZXJDaGlsZHJlbiwgcGFyZW50Vm5vZGUuY29udGV4dCk7DQogICAgICB2bS4kZm9yY2VVcGRhdGUoKTsNCiAgICB9DQogIH07DQoNCiAgVnVlLnByb3RvdHlwZS4kZm9yY2VVcGRhdGUgPSBmdW5jdGlvbiAoKSB7DQogICAgdmFyIHZtID0gdGhpczsNCiAgICBpZiAodm0uX3dhdGNoZXIpIHsNCiAgICAgIHZtLl93YXRjaGVyLnVwZGF0ZSgpOw0KICAgIH0NCiAgfTsNCg0KICBWdWUucHJvdG90eXBlLiRkZXN0cm95ID0gZnVuY3Rpb24gKCkgew0KICAgIHZhciB2bSA9IHRoaXM7DQogICAgaWYgKHZtLl9pc0JlaW5nRGVzdHJveWVkKSB7DQogICAgICByZXR1cm4NCiAgICB9DQogICAgY2FsbEhvb2sodm0sICdiZWZvcmVEZXN0cm95Jyk7DQogICAgdm0uX2lzQmVpbmdEZXN0cm95ZWQgPSB0cnVlOw0KICAgIC8vIHJlbW92ZSBzZWxmIGZyb20gcGFyZW50DQogICAgdmFyIHBhcmVudCA9IHZtLiRwYXJlbnQ7DQogICAgaWYgKHBhcmVudCAmJiAhcGFyZW50Ll9pc0JlaW5nRGVzdHJveWVkICYmICF2bS4kb3B0aW9ucy5hYnN0cmFjdCkgew0KICAgICAgcmVtb3ZlJDEocGFyZW50LiRjaGlsZHJlbiwgdm0pOw0KICAgIH0NCiAgICAvLyB0ZWFyZG93biB3YXRjaGVycw0KICAgIGlmICh2bS5fd2F0Y2hlcikgew0KICAgICAgdm0uX3dhdGNoZXIudGVhcmRvd24oKTsNCiAgICB9DQogICAgdmFyIGkgPSB2bS5fd2F0Y2hlcnMubGVuZ3RoOw0KICAgIHdoaWxlIChpLS0pIHsNCiAgICAgIHZtLl93YXRjaGVyc1tpXS50ZWFyZG93bigpOw0KICAgIH0NCiAgICAvLyByZW1vdmUgcmVmZXJlbmNlIGZyb20gZGF0YSBvYg0KICAgIC8vIGZyb3plbiBvYmplY3QgbWF5IG5vdCBoYXZlIG9ic2VydmVyLg0KICAgIGlmICh2bS5fZGF0YS5fX29iX18pIHsNCiAgICAgIHZtLl9kYXRhLl9fb2JfXy52bUNvdW50LS07DQogICAgfQ0KICAgIC8vIGNhbGwgdGhlIGxhc3QgaG9vay4uLg0KICAgIHZtLl9pc0Rlc3Ryb3llZCA9IHRydWU7DQogICAgY2FsbEhvb2sodm0sICdkZXN0cm95ZWQnKTsNCiAgICAvLyB0dXJuIG9mZiBhbGwgaW5zdGFuY2UgbGlzdGVuZXJzLg0KICAgIHZtLiRvZmYoKTsNCiAgICAvLyByZW1vdmUgX192dWVfXyByZWZlcmVuY2UNCiAgICBpZiAodm0uJGVsKSB7DQogICAgICB2bS4kZWwuX192dWVfXyA9IG51bGw7DQogICAgfQ0KICAgIC8vIGludm9rZSBkZXN0cm95IGhvb2tzIG9uIGN1cnJlbnQgcmVuZGVyZWQgdHJlZQ0KICAgIHZtLl9fcGF0Y2hfXyh2bS5fdm5vZGUsIG51bGwpOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBjYWxsSG9vayAodm0sIGhvb2spIHsNCiAgdmFyIGhhbmRsZXJzID0gdm0uJG9wdGlvbnNbaG9va107DQogIGlmIChoYW5kbGVycykgew0KICAgIGZvciAodmFyIGkgPSAwLCBqID0gaGFuZGxlcnMubGVuZ3RoOyBpIDwgajsgaSsrKSB7DQogICAgICBoYW5kbGVyc1tpXS5jYWxsKHZtKTsNCiAgICB9DQogIH0NCiAgdm0uJGVtaXQoJ2hvb2s6JyArIGhvb2spOw0KfQ0KDQovKiAgKi8NCg0KdmFyIGhvb2tzID0geyBpbml0OiBpbml0LCBwcmVwYXRjaDogcHJlcGF0Y2gsIGluc2VydDogaW5zZXJ0LCBkZXN0cm95OiBkZXN0cm95JDEgfTsNCnZhciBob29rc1RvTWVyZ2UgPSBPYmplY3Qua2V5cyhob29rcyk7DQoNCmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudCAoDQogIEN0b3IsDQogIGRhdGEsDQogIGNvbnRleHQsDQogIGNoaWxkcmVuLA0KICB0YWcNCikgew0KICBpZiAoIUN0b3IpIHsNCiAgICByZXR1cm4NCiAgfQ0KDQogIHZhciBiYXNlQ3RvciA9IGNvbnRleHQuJG9wdGlvbnMuX2Jhc2U7DQogIGlmIChpc09iamVjdChDdG9yKSkgew0KICAgIEN0b3IgPSBiYXNlQ3Rvci5leHRlbmQoQ3Rvcik7DQogIH0NCg0KICBpZiAodHlwZW9mIEN0b3IgIT09ICdmdW5jdGlvbicpIHsNCiAgICB7DQogICAgICB3YXJuKCgiSW52YWxpZCBDb21wb25lbnQgZGVmaW5pdGlvbjogIiArIChTdHJpbmcoQ3RvcikpKSwgY29udGV4dCk7DQogICAgfQ0KICAgIHJldHVybg0KICB9DQoNCiAgLy8gYXN5bmMgY29tcG9uZW50DQogIGlmICghQ3Rvci5jaWQpIHsNCiAgICBpZiAoQ3Rvci5yZXNvbHZlZCkgew0KICAgICAgQ3RvciA9IEN0b3IucmVzb2x2ZWQ7DQogICAgfSBlbHNlIHsNCiAgICAgIEN0b3IgPSByZXNvbHZlQXN5bmNDb21wb25lbnQoQ3RvciwgYmFzZUN0b3IsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgLy8gaXQncyBvayB0byBxdWV1ZSB0aGlzIG9uIGV2ZXJ5IHJlbmRlciBiZWNhdXNlDQogICAgICAgIC8vICRmb3JjZVVwZGF0ZSBpcyBidWZmZXJlZCBieSB0aGUgc2NoZWR1bGVyLg0KICAgICAgICBjb250ZXh0LiRmb3JjZVVwZGF0ZSgpOw0KICAgICAgfSk7DQogICAgICBpZiAoIUN0b3IpIHsNCiAgICAgICAgLy8gcmV0dXJuIG5vdGhpbmcgaWYgdGhpcyBpcyBpbmRlZWQgYW4gYXN5bmMgY29tcG9uZW50DQogICAgICAgIC8vIHdhaXQgZm9yIHRoZSBjYWxsYmFjayB0byB0cmlnZ2VyIHBhcmVudCB1cGRhdGUuDQogICAgICAgIHJldHVybg0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIC8vIHJlc29sdmUgY29uc3RydWN0b3Igb3B0aW9ucyBpbiBjYXNlIGdsb2JhbCBtaXhpbnMgYXJlIGFwcGxpZWQgYWZ0ZXINCiAgLy8gY29tcG9uZW50IGNvbnN0cnVjdG9yIGNyZWF0aW9uDQogIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMoQ3Rvcik7DQoNCiAgZGF0YSA9IGRhdGEgfHwge307DQoNCiAgLy8gZXh0cmFjdCBwcm9wcw0KICB2YXIgcHJvcHNEYXRhID0gZXh0cmFjdFByb3BzKGRhdGEsIEN0b3IpOw0KDQogIC8vIGZ1bmN0aW9uYWwgY29tcG9uZW50DQogIGlmIChDdG9yLm9wdGlvbnMuZnVuY3Rpb25hbCkgew0KICAgIHJldHVybiBjcmVhdGVGdW5jdGlvbmFsQ29tcG9uZW50KEN0b3IsIHByb3BzRGF0YSwgZGF0YSwgY29udGV4dCwgY2hpbGRyZW4pDQogIH0NCg0KICAvLyBleHRyYWN0IGxpc3RlbmVycywgc2luY2UgdGhlc2UgbmVlZHMgdG8gYmUgdHJlYXRlZCBhcw0KICAvLyBjaGlsZCBjb21wb25lbnQgbGlzdGVuZXJzIGluc3RlYWQgb2YgRE9NIGxpc3RlbmVycw0KICB2YXIgbGlzdGVuZXJzID0gZGF0YS5vbjsNCiAgLy8gcmVwbGFjZSB3aXRoIGxpc3RlbmVycyB3aXRoIC5uYXRpdmUgbW9kaWZpZXINCiAgZGF0YS5vbiA9IGRhdGEubmF0aXZlT247DQoNCiAgaWYgKEN0b3Iub3B0aW9ucy5hYnN0cmFjdCkgew0KICAgIC8vIGFic3RyYWN0IGNvbXBvbmVudHMgZG8gbm90IGtlZXAgYW55dGhpbmcNCiAgICAvLyBvdGhlciB0aGFuIHByb3BzICYgbGlzdGVuZXJzDQogICAgZGF0YSA9IHt9Ow0KICB9DQoNCiAgLy8gbWVyZ2UgY29tcG9uZW50IG1hbmFnZW1lbnQgaG9va3Mgb250byB0aGUgcGxhY2Vob2xkZXIgbm9kZQ0KICBtZXJnZUhvb2tzKGRhdGEpOw0KDQogIC8vIHJldHVybiBhIHBsYWNlaG9sZGVyIHZub2RlDQogIHZhciBuYW1lID0gQ3Rvci5vcHRpb25zLm5hbWUgfHwgdGFnOw0KICB2YXIgdm5vZGUgPSBuZXcgVk5vZGUoDQogICAgKCJ2dWUtY29tcG9uZW50LSIgKyAoQ3Rvci5jaWQpICsgKG5hbWUgPyAoIi0iICsgbmFtZSkgOiAnJykpLA0KICAgIGRhdGEsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgY29udGV4dCwNCiAgICB7IEN0b3I6IEN0b3IsIHByb3BzRGF0YTogcHJvcHNEYXRhLCBsaXN0ZW5lcnM6IGxpc3RlbmVycywgdGFnOiB0YWcsIGNoaWxkcmVuOiBjaGlsZHJlbiB9DQogICk7DQogIHJldHVybiB2bm9kZQ0KfQ0KDQpmdW5jdGlvbiBjcmVhdGVGdW5jdGlvbmFsQ29tcG9uZW50ICgNCiAgQ3RvciwNCiAgcHJvcHNEYXRhLA0KICBkYXRhLA0KICBjb250ZXh0LA0KICBjaGlsZHJlbg0KKSB7DQogIHZhciBwcm9wcyA9IHt9Ow0KICB2YXIgcHJvcE9wdGlvbnMgPSBDdG9yLm9wdGlvbnMucHJvcHM7DQogIGlmIChwcm9wT3B0aW9ucykgew0KICAgIGZvciAodmFyIGtleSBpbiBwcm9wT3B0aW9ucykgew0KICAgICAgcHJvcHNba2V5XSA9IHZhbGlkYXRlUHJvcChrZXksIHByb3BPcHRpb25zLCBwcm9wc0RhdGEpOw0KICAgIH0NCiAgfQ0KICB2YXIgdm5vZGUgPSBDdG9yLm9wdGlvbnMucmVuZGVyLmNhbGwoDQogICAgbnVsbCwNCiAgICAvLyBlbnN1cmUgdGhlIGNyZWF0ZUVsZW1lbnQgZnVuY3Rpb24gaW4gZnVuY3Rpb25hbCBjb21wb25lbnRzDQogICAgLy8gZ2V0cyBhIHVuaXF1ZSBjb250ZXh0IC0gdGhpcyBpcyBuZWNlc3NhcnkgZm9yIGNvcnJlY3QgbmFtZWQgc2xvdCBjaGVjaw0KICAgIGJpbmQkMShjcmVhdGVFbGVtZW50LCB7IF9zZWxmOiBPYmplY3QuY3JlYXRlKGNvbnRleHQpIH0pLA0KICAgIHsNCiAgICAgIHByb3BzOiBwcm9wcywNCiAgICAgIGRhdGE6IGRhdGEsDQogICAgICBwYXJlbnQ6IGNvbnRleHQsDQogICAgICBjaGlsZHJlbjogbm9ybWFsaXplQ2hpbGRyZW4oY2hpbGRyZW4pLA0KICAgICAgc2xvdHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlc29sdmVTbG90cyhjaGlsZHJlbiwgY29udGV4dCk7IH0NCiAgICB9DQogICk7DQogIGlmICh2bm9kZSBpbnN0YW5jZW9mIFZOb2RlKSB7DQogICAgdm5vZGUuZnVuY3Rpb25hbENvbnRleHQgPSBjb250ZXh0Ow0KICAgIGlmIChkYXRhLnNsb3QpIHsNCiAgICAgICh2bm9kZS5kYXRhIHx8ICh2bm9kZS5kYXRhID0ge30pKS5zbG90ID0gZGF0YS5zbG90Ow0KICAgIH0NCiAgfQ0KICByZXR1cm4gdm5vZGUNCn0NCg0KZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2VGb3JWbm9kZSAoDQogIHZub2RlLCAvLyB3ZSBrbm93IGl0J3MgTW91bnRlZENvbXBvbmVudFZOb2RlIGJ1dCBmbG93IGRvZXNuJ3QNCiAgcGFyZW50LCAvLyBhY3RpdmVJbnN0YW5jZSBpbiBsaWZlY3ljbGUgc3RhdGUNCiAgcGFyZW50RWxtLA0KICByZWZFbG0NCikgew0KICB2YXIgdm5vZGVDb21wb25lbnRPcHRpb25zID0gdm5vZGUuY29tcG9uZW50T3B0aW9uczsNCiAgdmFyIG9wdGlvbnMgPSB7DQogICAgX2lzQ29tcG9uZW50OiB0cnVlLA0KICAgIHBhcmVudDogcGFyZW50LA0KICAgIHByb3BzRGF0YTogdm5vZGVDb21wb25lbnRPcHRpb25zLnByb3BzRGF0YSwNCiAgICBfY29tcG9uZW50VGFnOiB2bm9kZUNvbXBvbmVudE9wdGlvbnMudGFnLA0KICAgIF9wYXJlbnRWbm9kZTogdm5vZGUsDQogICAgX3BhcmVudExpc3RlbmVyczogdm5vZGVDb21wb25lbnRPcHRpb25zLmxpc3RlbmVycywNCiAgICBfcmVuZGVyQ2hpbGRyZW46IHZub2RlQ29tcG9uZW50T3B0aW9ucy5jaGlsZHJlbiwNCiAgICBfcGFyZW50RWxtOiBwYXJlbnRFbG0gfHwgbnVsbCwNCiAgICBfcmVmRWxtOiByZWZFbG0gfHwgbnVsbA0KICB9Ow0KICAvLyBjaGVjayBpbmxpbmUtdGVtcGxhdGUgcmVuZGVyIGZ1bmN0aW9ucw0KICB2YXIgaW5saW5lVGVtcGxhdGUgPSB2bm9kZS5kYXRhLmlubGluZVRlbXBsYXRlOw0KICBpZiAoaW5saW5lVGVtcGxhdGUpIHsNCiAgICBvcHRpb25zLnJlbmRlciA9IGlubGluZVRlbXBsYXRlLnJlbmRlcjsNCiAgICBvcHRpb25zLnN0YXRpY1JlbmRlckZucyA9IGlubGluZVRlbXBsYXRlLnN0YXRpY1JlbmRlckZuczsNCiAgfQ0KICByZXR1cm4gbmV3IHZub2RlQ29tcG9uZW50T3B0aW9ucy5DdG9yKG9wdGlvbnMpDQp9DQoNCmZ1bmN0aW9uIGluaXQgKA0KICB2bm9kZSwNCiAgaHlkcmF0aW5nLA0KICBwYXJlbnRFbG0sDQogIHJlZkVsbQ0KKSB7DQogIGlmICghdm5vZGUuY2hpbGQgfHwgdm5vZGUuY2hpbGQuX2lzRGVzdHJveWVkKSB7DQogICAgdmFyIGNoaWxkID0gdm5vZGUuY2hpbGQgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZUZvclZub2RlKA0KICAgICAgdm5vZGUsDQogICAgICBhY3RpdmVJbnN0YW5jZSwNCiAgICAgIHBhcmVudEVsbSwNCiAgICAgIHJlZkVsbQ0KICAgICk7DQogICAgY2hpbGQuJG1vdW50KGh5ZHJhdGluZyA/IHZub2RlLmVsbSA6IHVuZGVmaW5lZCwgaHlkcmF0aW5nKTsNCiAgfSBlbHNlIGlmICh2bm9kZS5kYXRhLmtlZXBBbGl2ZSkgew0KICAgIC8vIGtlcHQtYWxpdmUgY29tcG9uZW50cywgdHJlYXQgYXMgYSBwYXRjaA0KICAgIHZhciBtb3VudGVkTm9kZSA9IHZub2RlOyAvLyB3b3JrIGFyb3VuZCBmbG93DQogICAgcHJlcGF0Y2gobW91bnRlZE5vZGUsIG1vdW50ZWROb2RlKTsNCiAgfQ0KfQ0KDQpmdW5jdGlvbiBwcmVwYXRjaCAoDQogIG9sZFZub2RlLA0KICB2bm9kZQ0KKSB7DQogIHZhciBvcHRpb25zID0gdm5vZGUuY29tcG9uZW50T3B0aW9uczsNCiAgdmFyIGNoaWxkID0gdm5vZGUuY2hpbGQgPSBvbGRWbm9kZS5jaGlsZDsNCiAgY2hpbGQuX3VwZGF0ZUZyb21QYXJlbnQoDQogICAgb3B0aW9ucy5wcm9wc0RhdGEsIC8vIHVwZGF0ZWQgcHJvcHMNCiAgICBvcHRpb25zLmxpc3RlbmVycywgLy8gdXBkYXRlZCBsaXN0ZW5lcnMNCiAgICB2bm9kZSwgLy8gbmV3IHBhcmVudCB2bm9kZQ0KICAgIG9wdGlvbnMuY2hpbGRyZW4gLy8gbmV3IGNoaWxkcmVuDQogICk7DQp9DQoNCmZ1bmN0aW9uIGluc2VydCAodm5vZGUpIHsNCiAgaWYgKCF2bm9kZS5jaGlsZC5faXNNb3VudGVkKSB7DQogICAgdm5vZGUuY2hpbGQuX2lzTW91bnRlZCA9IHRydWU7DQogICAgY2FsbEhvb2sodm5vZGUuY2hpbGQsICdtb3VudGVkJyk7DQogIH0NCiAgaWYgKHZub2RlLmRhdGEua2VlcEFsaXZlKSB7DQogICAgdm5vZGUuY2hpbGQuX2luYWN0aXZlID0gZmFsc2U7DQogICAgY2FsbEhvb2sodm5vZGUuY2hpbGQsICdhY3RpdmF0ZWQnKTsNCiAgfQ0KfQ0KDQpmdW5jdGlvbiBkZXN0cm95JDEgKHZub2RlKSB7DQogIGlmICghdm5vZGUuY2hpbGQuX2lzRGVzdHJveWVkKSB7DQogICAgaWYgKCF2bm9kZS5kYXRhLmtlZXBBbGl2ZSkgew0KICAgICAgdm5vZGUuY2hpbGQuJGRlc3Ryb3koKTsNCiAgICB9IGVsc2Ugew0KICAgICAgdm5vZGUuY2hpbGQuX2luYWN0aXZlID0gdHJ1ZTsNCiAgICAgIGNhbGxIb29rKHZub2RlLmNoaWxkLCAnZGVhY3RpdmF0ZWQnKTsNCiAgICB9DQogIH0NCn0NCg0KZnVuY3Rpb24gcmVzb2x2ZUFzeW5jQ29tcG9uZW50ICgNCiAgZmFjdG9yeSwNCiAgYmFzZUN0b3IsDQogIGNiDQopIHsNCiAgaWYgKGZhY3RvcnkucmVxdWVzdGVkKSB7DQogICAgLy8gcG9vbCBjYWxsYmFja3MNCiAgICBmYWN0b3J5LnBlbmRpbmdDYWxsYmFja3MucHVzaChjYik7DQogIH0gZWxzZSB7DQogICAgZmFjdG9yeS5yZXF1ZXN0ZWQgPSB0cnVlOw0KICAgIHZhciBjYnMgPSBmYWN0b3J5LnBlbmRpbmdDYWxsYmFja3MgPSBbY2JdOw0KICAgIHZhciBzeW5jID0gdHJ1ZTsNCg0KICAgIHZhciByZXNvbHZlID0gZnVuY3Rpb24gKHJlcykgew0KICAgICAgaWYgKGlzT2JqZWN0KHJlcykpIHsNCiAgICAgICAgcmVzID0gYmFzZUN0b3IuZXh0ZW5kKHJlcyk7DQogICAgICB9DQogICAgICAvLyBjYWNoZSByZXNvbHZlZA0KICAgICAgZmFjdG9yeS5yZXNvbHZlZCA9IHJlczsNCiAgICAgIC8vIGludm9rZSBjYWxsYmFja3Mgb25seSBpZiB0aGlzIGlzIG5vdCBhIHN5bmNocm9ub3VzIHJlc29sdmUNCiAgICAgIC8vIChhc3luYyByZXNvbHZlcyBhcmUgc2hpbW1lZCBhcyBzeW5jaHJvbm91cyBkdXJpbmcgU1NSKQ0KICAgICAgaWYgKCFzeW5jKSB7DQogICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2JzLmxlbmd0aDsgaSA8IGw7IGkrKykgew0KICAgICAgICAgIGNic1tpXShyZXMpOw0KICAgICAgICB9DQogICAgICB9DQogICAgfTsNCg0KICAgIHZhciByZWplY3QgPSBmdW5jdGlvbiAocmVhc29uKSB7DQogICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigNCiAgICAgICAgIkZhaWxlZCB0byByZXNvbHZlIGFzeW5jIGNvbXBvbmVudDogIiArIChTdHJpbmcoZmFjdG9yeSkpICsNCiAgICAgICAgKHJlYXNvbiA/ICgiXG5SZWFzb246ICIgKyByZWFzb24pIDogJycpDQogICAgICApOw0KICAgIH07DQoNCiAgICB2YXIgcmVzID0gZmFjdG9yeShyZXNvbHZlLCByZWplY3QpOw0KDQogICAgLy8gaGFuZGxlIHByb21pc2UNCiAgICBpZiAocmVzICYmIHR5cGVvZiByZXMudGhlbiA9PT0gJ2Z1bmN0aW9uJyAmJiAhZmFjdG9yeS5yZXNvbHZlZCkgew0KICAgICAgcmVzLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTsNCiAgICB9DQoNCiAgICBzeW5jID0gZmFsc2U7DQogICAgLy8gcmV0dXJuIGluIGNhc2UgcmVzb2x2ZWQgc3luY2hyb25vdXNseQ0KICAgIHJldHVybiBmYWN0b3J5LnJlc29sdmVkDQogIH0NCn0NCg0KZnVuY3Rpb24gZXh0cmFjdFByb3BzIChkYXRhLCBDdG9yKSB7DQogIC8vIHdlIGFyZSBvbmx5IGV4dHJhY3RpbmcgcmF3IHZhbHVlcyBoZXJlLg0KICAvLyB2YWxpZGF0aW9uIGFuZCBkZWZhdWx0IHZhbHVlcyBhcmUgaGFuZGxlZCBpbiB0aGUgY2hpbGQNCiAgLy8gY29tcG9uZW50IGl0c2VsZi4NCiAgdmFyIHByb3BPcHRpb25zID0gQ3Rvci5vcHRpb25zLnByb3BzOw0KICBpZiAoIXByb3BPcHRpb25zKSB7DQogICAgcmV0dXJuDQogIH0NCiAgdmFyIHJlcyA9IHt9Ow0KICB2YXIgYXR0cnMgPSBkYXRhLmF0dHJzOw0KICB2YXIgcHJvcHMgPSBkYXRhLnByb3BzOw0KICB2YXIgZG9tUHJvcHMgPSBkYXRhLmRvbVByb3BzOw0KICBpZiAoYXR0cnMgfHwgcHJvcHMgfHwgZG9tUHJvcHMpIHsNCiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcE9wdGlvbnMpIHsNCiAgICAgIHZhciBhbHRLZXkgPSBoeXBoZW5hdGUoa2V5KTsNCiAgICAgIGNoZWNrUHJvcChyZXMsIHByb3BzLCBrZXksIGFsdEtleSwgdHJ1ZSkgfHwNCiAgICAgIGNoZWNrUHJvcChyZXMsIGF0dHJzLCBrZXksIGFsdEtleSkgfHwNCiAgICAgIGNoZWNrUHJvcChyZXMsIGRvbVByb3BzLCBrZXksIGFsdEtleSk7DQogICAgfQ0KICB9DQogIHJldHVybiByZXMNCn0NCg0KZnVuY3Rpb24gY2hlY2tQcm9wICgNCiAgcmVzLA0KICBoYXNoLA0KICBrZXksDQogIGFsdEtleSwNCiAgcHJlc2VydmUNCikgew0KICBpZiAoaGFzaCkgew0KICAgIGlmIChoYXNPd24oaGFzaCwga2V5KSkgew0KICAgICAgcmVzW2tleV0gPSBoYXNoW2tleV07DQogICAgICBpZiAoIXByZXNlcnZlKSB7DQogICAgICAgIGRlbGV0ZSBoYXNoW2tleV07DQogICAgICB9DQogICAgICByZXR1cm4gdHJ1ZQ0KICAgIH0gZWxzZSBpZiAoaGFzT3duKGhhc2gsIGFsdEtleSkpIHsNCiAgICAgIHJlc1trZXldID0gaGFzaFthbHRLZXldOw0KICAgICAgaWYgKCFwcmVzZXJ2ZSkgew0KICAgICAgICBkZWxldGUgaGFzaFthbHRLZXldOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIHRydWUNCiAgICB9DQogIH0NCiAgcmV0dXJuIGZhbHNlDQp9DQoNCmZ1bmN0aW9uIG1lcmdlSG9va3MgKGRhdGEpIHsNCiAgaWYgKCFkYXRhLmhvb2spIHsNCiAgICBkYXRhLmhvb2sgPSB7fTsNCiAgfQ0KICBmb3IgKHZhciBpID0gMDsgaSA8IGhvb2tzVG9NZXJnZS5sZW5ndGg7IGkrKykgew0KICAgIHZhciBrZXkgPSBob29rc1RvTWVyZ2VbaV07DQogICAgdmFyIGZyb21QYXJlbnQgPSBkYXRhLmhvb2tba2V5XTsNCiAgICB2YXIgb3VycyA9IGhvb2tzW2tleV07DQogICAgZGF0YS5ob29rW2tleV0gPSBmcm9tUGFyZW50ID8gbWVyZ2VIb29rJDEob3VycywgZnJvbVBhcmVudCkgOiBvdXJzOw0KICB9DQp9DQoNCmZ1bmN0aW9uIG1lcmdlSG9vayQxIChvbmUsIHR3bykgew0KICByZXR1cm4gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHsNCiAgICBvbmUoYSwgYiwgYywgZCk7DQogICAgdHdvKGEsIGIsIGMsIGQpOw0KICB9DQp9DQoNCi8qICAqLw0KDQovLyB3cmFwcGVyIGZ1bmN0aW9uIGZvciBwcm92aWRpbmcgYSBtb3JlIGZsZXhpYmxlIGludGVyZmFjZQ0KLy8gd2l0aG91dCBnZXR0aW5nIHllbGxlZCBhdCBieSBmbG93DQpmdW5jdGlvbiBjcmVhdGVFbGVtZW50ICgNCiAgdGFnLA0KICBkYXRhLA0KICBjaGlsZHJlbg0KKSB7DQogIGlmIChkYXRhICYmIChBcnJheS5pc0FycmF5KGRhdGEpIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JykpIHsNCiAgICBjaGlsZHJlbiA9IGRhdGE7DQogICAgZGF0YSA9IHVuZGVmaW5lZDsNCiAgfQ0KICAvLyBtYWtlIHN1cmUgdG8gdXNlIHJlYWwgaW5zdGFuY2UgaW5zdGVhZCBvZiBwcm94eSBhcyBjb250ZXh0DQogIHJldHVybiBfY3JlYXRlRWxlbWVudCh0aGlzLl9zZWxmLCB0YWcsIGRhdGEsIGNoaWxkcmVuKQ0KfQ0KDQpmdW5jdGlvbiBfY3JlYXRlRWxlbWVudCAoDQogIGNvbnRleHQsDQogIHRhZywNCiAgZGF0YSwNCiAgY2hpbGRyZW4NCikgew0KICBpZiAoZGF0YSAmJiBkYXRhLl9fb2JfXykgew0KICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKA0KICAgICAgIkF2b2lkIHVzaW5nIG9ic2VydmVkIGRhdGEgb2JqZWN0IGFzIHZub2RlIGRhdGE6ICIgKyAoSlNPTi5zdHJpbmdpZnkoZGF0YSkpICsgIlxuIiArDQogICAgICAnQWx3YXlzIGNyZWF0ZSBmcmVzaCB2bm9kZSBkYXRhIG9iamVjdHMgaW4gZWFjaCByZW5kZXIhJywNCiAgICAgIGNvbnRleHQNCiAgICApOw0KICAgIHJldHVybg0KICB9DQogIGlmICghdGFnKSB7DQogICAgLy8gaW4gY2FzZSBvZiBjb21wb25lbnQgOmlzIHNldCB0byBmYWxzeSB2YWx1ZQ0KICAgIHJldHVybiBlbXB0eVZOb2RlKCkNCiAgfQ0KICAvLyBzdXBwb3J0IHNpbmdsZSBmdW5jdGlvbiBjaGlsZHJlbiBhcyBkZWZhdWx0IHNjb3BlZCBzbG90DQogIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSAmJg0KICAgICAgdHlwZW9mIGNoaWxkcmVuWzBdID09PSAnZnVuY3Rpb24nKSB7DQogICAgZGF0YSA9IGRhdGEgfHwge307DQogICAgZGF0YS5zY29wZWRTbG90cyA9IHsgZGVmYXVsdDogY2hpbGRyZW5bMF0gfTsNCiAgICBjaGlsZHJlbi5sZW5ndGggPSAwOw0KICB9DQogIGlmICh0eXBlb2YgdGFnID09PSAnc3RyaW5nJykgew0KICAgIHZhciBDdG9yOw0KICAgIHZhciBucyA9IGNvbmZpZy5nZXRUYWdOYW1lc3BhY2UodGFnKTsNCiAgICBpZiAoY29uZmlnLmlzUmVzZXJ2ZWRUYWcodGFnKSkgew0KICAgICAgLy8gcGxhdGZvcm0gYnVpbHQtaW4gZWxlbWVudHMNCiAgICAgIHJldHVybiBuZXcgVk5vZGUoDQogICAgICAgIHRhZywgZGF0YSwgbm9ybWFsaXplQ2hpbGRyZW4oY2hpbGRyZW4sIG5zKSwNCiAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsIG5zLCBjb250ZXh0DQogICAgICApDQogICAgfSBlbHNlIGlmICgoQ3RvciA9IHJlc29sdmVBc3NldChjb250ZXh0LiRvcHRpb25zLCAnY29tcG9uZW50cycsIHRhZykpKSB7DQogICAgICAvLyBjb21wb25lbnQNCiAgICAgIHJldHVybiBjcmVhdGVDb21wb25lbnQoQ3RvciwgZGF0YSwgY29udGV4dCwgY2hpbGRyZW4sIHRhZykNCiAgICB9IGVsc2Ugew0KICAgICAgLy8gdW5rbm93biBvciB1bmxpc3RlZCBuYW1lc3BhY2VkIGVsZW1lbnRzDQogICAgICAvLyBjaGVjayBhdCBydW50aW1lIGJlY2F1c2UgaXQgbWF5IGdldCBhc3NpZ25lZCBhIG5hbWVzcGFjZSB3aGVuIGl0cw0KICAgICAgLy8gcGFyZW50IG5vcm1hbGl6ZXMgY2hpbGRyZW4NCiAgICAgIHZhciBjaGlsZE5zID0gdGFnID09PSAnZm9yZWlnbk9iamVjdCcgPyAneGh0bWwnIDogbnM7DQogICAgICByZXR1cm4gbmV3IFZOb2RlKA0KICAgICAgICB0YWcsIGRhdGEsIG5vcm1hbGl6ZUNoaWxkcmVuKGNoaWxkcmVuLCBjaGlsZE5zKSwNCiAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsIG5zLCBjb250ZXh0DQogICAgICApDQogICAgfQ0KICB9IGVsc2Ugew0KICAgIC8vIGRpcmVjdCBjb21wb25lbnQgb3B0aW9ucyAvIGNvbnN0cnVjdG9yDQogICAgcmV0dXJuIGNyZWF0ZUNvbXBvbmVudCh0YWcsIGRhdGEsIGNvbnRleHQsIGNoaWxkcmVuKQ0KICB9DQp9DQoNCi8qICAqLw0KDQpmdW5jdGlvbiBpbml0UmVuZGVyICh2bSkgew0KICB2bS4kdm5vZGUgPSBudWxsOyAvLyB0aGUgcGxhY2Vob2xkZXIgbm9kZSBpbiBwYXJlbnQgdHJlZQ0KICB2bS5fdm5vZGUgPSBudWxsOyAvLyB0aGUgcm9vdCBvZiB0aGUgY2hpbGQgdHJlZQ0KICB2bS5fc3RhdGljVHJlZXMgPSBudWxsOw0KICB2YXIgcGFyZW50Vm5vZGUgPSB2bS4kb3B0aW9ucy5fcGFyZW50Vm5vZGU7DQogIHZhciByZW5kZXJDb250ZXh0ID0gcGFyZW50Vm5vZGUgJiYgcGFyZW50Vm5vZGUuY29udGV4dDsNCiAgdm0uJHNsb3RzID0gcmVzb2x2ZVNsb3RzKHZtLiRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbiwgcmVuZGVyQ29udGV4dCk7DQogIHZtLiRzY29wZWRTbG90cyA9IHt9Ow0KICAvLyBiaW5kIHRoZSBwdWJsaWMgY3JlYXRlRWxlbWVudCBmbiB0byB0aGlzIGluc3RhbmNlDQogIC8vIHNvIHRoYXQgd2UgZ2V0IHByb3BlciByZW5kZXIgY29udGV4dCBpbnNpZGUgaXQuDQogIHZtLiRjcmVhdGVFbGVtZW50ID0gYmluZCQxKGNyZWF0ZUVsZW1lbnQsIHZtKTsNCiAgaWYgKHZtLiRvcHRpb25zLmVsKSB7DQogICAgdm0uJG1vdW50KHZtLiRvcHRpb25zLmVsKTsNCiAgfQ0KfQ0KDQpmdW5jdGlvbiByZW5kZXJNaXhpbiAoVnVlKSB7DQogIFZ1ZS5wcm90b3R5cGUuJG5leHRUaWNrID0gZnVuY3Rpb24gKGZuKSB7DQogICAgcmV0dXJuIG5leHRUaWNrKGZuLCB0aGlzKQ0KICB9Ow0KDQogIFZ1ZS5wcm90b3R5cGUuX3JlbmRlciA9IGZ1bmN0aW9uICgpIHsNCiAgICB2YXIgdm0gPSB0aGlzOw0KICAgIHZhciByZWYgPSB2bS4kb3B0aW9uczsNCiAgICB2YXIgcmVuZGVyID0gcmVmLnJlbmRlcjsNCiAgICB2YXIgc3RhdGljUmVuZGVyRm5zID0gcmVmLnN0YXRpY1JlbmRlckZuczsNCiAgICB2YXIgX3BhcmVudFZub2RlID0gcmVmLl9wYXJlbnRWbm9kZTsNCg0KICAgIGlmICh2bS5faXNNb3VudGVkKSB7DQogICAgICAvLyBjbG9uZSBzbG90IG5vZGVzIG9uIHJlLXJlbmRlcnMNCiAgICAgIGZvciAodmFyIGtleSBpbiB2bS4kc2xvdHMpIHsNCiAgICAgICAgdm0uJHNsb3RzW2tleV0gPSBjbG9uZVZOb2Rlcyh2bS4kc2xvdHNba2V5XSk7DQogICAgICB9DQogICAgfQ0KDQogICAgaWYgKF9wYXJlbnRWbm9kZSAmJiBfcGFyZW50Vm5vZGUuZGF0YS5zY29wZWRTbG90cykgew0KICAgICAgdm0uJHNjb3BlZFNsb3RzID0gX3BhcmVudFZub2RlLmRhdGEuc2NvcGVkU2xvdHM7DQogICAgfQ0KDQogICAgaWYgKHN0YXRpY1JlbmRlckZucyAmJiAhdm0uX3N0YXRpY1RyZWVzKSB7DQogICAgICB2bS5fc3RhdGljVHJlZXMgPSBbXTsNCiAgICB9DQogICAgLy8gc2V0IHBhcmVudCB2bm9kZS4gdGhpcyBhbGxvd3MgcmVuZGVyIGZ1bmN0aW9ucyB0byBoYXZlIGFjY2Vzcw0KICAgIC8vIHRvIHRoZSBkYXRhIG9uIHRoZSBwbGFjZWhvbGRlciBub2RlLg0KICAgIHZtLiR2bm9kZSA9IF9wYXJlbnRWbm9kZTsNCiAgICAvLyByZW5kZXIgc2VsZg0KICAgIHZhciB2bm9kZTsNCiAgICB0cnkgew0KICAgICAgdm5vZGUgPSByZW5kZXIuY2FsbCh2bS5fcmVuZGVyUHJveHksIHZtLiRjcmVhdGVFbGVtZW50KTsNCiAgICB9IGNhdGNoIChlKSB7DQogICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLw0KICAgICAgaWYgKGNvbmZpZy5lcnJvckhhbmRsZXIpIHsNCiAgICAgICAgY29uZmlnLmVycm9ySGFuZGxlci5jYWxsKG51bGwsIGUsIHZtKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHsNCiAgICAgICAgICB3YXJuKCgiRXJyb3Igd2hlbiByZW5kZXJpbmcgIiArIChmb3JtYXRDb21wb25lbnROYW1lKHZtKSkgKyAiOiIpKTsNCiAgICAgICAgfQ0KICAgICAgICB0aHJvdyBlDQogICAgICB9DQogICAgICAvLyByZXR1cm4gcHJldmlvdXMgdm5vZGUgdG8gcHJldmVudCByZW5kZXIgZXJyb3IgY2F1c2luZyBibGFuayBjb21wb25lbnQNCiAgICAgIHZub2RlID0gdm0uX3Zub2RlOw0KICAgIH0NCiAgICAvLyByZXR1cm4gZW1wdHkgdm5vZGUgaW4gY2FzZSB0aGUgcmVuZGVyIGZ1bmN0aW9uIGVycm9yZWQgb3V0DQogICAgaWYgKCEodm5vZGUgaW5zdGFuY2VvZiBWTm9kZSkpIHsNCiAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgQXJyYXkuaXNBcnJheSh2bm9kZSkpIHsNCiAgICAgICAgd2FybigNCiAgICAgICAgICAnTXVsdGlwbGUgcm9vdCBub2RlcyByZXR1cm5lZCBmcm9tIHJlbmRlciBmdW5jdGlvbi4gUmVuZGVyIGZ1bmN0aW9uICcgKw0KICAgICAgICAgICdzaG91bGQgcmV0dXJuIGEgc2luZ2xlIHJvb3Qgbm9kZS4nLA0KICAgICAgICAgIHZtDQogICAgICAgICk7DQogICAgICB9DQogICAgICB2bm9kZSA9IGVtcHR5Vk5vZGUoKTsNCiAgICB9DQogICAgLy8gc2V0IHBhcmVudA0KICAgIHZub2RlLnBhcmVudCA9IF9wYXJlbnRWbm9kZTsNCiAgICByZXR1cm4gdm5vZGUNCiAgfTsNCg0KICAvLyBzaG9ydGhhbmRzIHVzZWQgaW4gcmVuZGVyIGZ1bmN0aW9ucw0KICBWdWUucHJvdG90eXBlLl9oID0gY3JlYXRlRWxlbWVudDsNCiAgLy8gdG9TdHJpbmcgZm9yIG11c3RhY2hlcw0KICBWdWUucHJvdG90eXBlLl9zID0gX3RvU3RyaW5nOw0KICAvLyBudW1iZXIgY29udmVyc2lvbg0KICBWdWUucHJvdG90eXBlLl9uID0gdG9OdW1iZXI7DQogIC8vIGVtcHR5IHZub2RlDQogIFZ1ZS5wcm90b3R5cGUuX2UgPSBlbXB0eVZOb2RlOw0KICAvLyBsb29zZSBlcXVhbA0KICBWdWUucHJvdG90eXBlLl9xID0gbG9vc2VFcXVhbDsNCiAgLy8gbG9vc2UgaW5kZXhPZg0KICBWdWUucHJvdG90eXBlLl9pID0gbG9vc2VJbmRleE9mOw0KDQogIC8vIHJlbmRlciBzdGF0aWMgdHJlZSBieSBpbmRleA0KICBWdWUucHJvdG90eXBlLl9tID0gZnVuY3Rpb24gcmVuZGVyU3RhdGljICgNCiAgICBpbmRleCwNCiAgICBpc0luRm9yDQogICkgew0KICAgIHZhciB0cmVlID0gdGhpcy5fc3RhdGljVHJlZXNbaW5kZXhdOw0KICAgIC8vIGlmIGhhcyBhbHJlYWR5LXJlbmRlcmVkIHN0YXRpYyB0cmVlIGFuZCBub3QgaW5zaWRlIHYtZm9yLA0KICAgIC8vIHdlIGNhbiByZXVzZSB0aGUgc2FtZSB0cmVlIGJ5IGRvaW5nIGEgc2hhbGxvdyBjbG9uZS4NCiAgICBpZiAodHJlZSAmJiAhaXNJbkZvcikgew0KICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodHJlZSkNCiAgICAgICAgPyBjbG9uZVZOb2Rlcyh0cmVlKQ0KICAgICAgICA6IGNsb25lVk5vZGUodHJlZSkNCiAgICB9DQogICAgLy8gb3RoZXJ3aXNlLCByZW5kZXIgYSBmcmVzaCB0cmVlLg0KICAgIHRyZWUgPSB0aGlzLl9zdGF0aWNUcmVlc1tpbmRleF0gPSB0aGlzLiRvcHRpb25zLnN0YXRpY1JlbmRlckZuc1tpbmRleF0uY2FsbCh0aGlzLl9yZW5kZXJQcm94eSk7DQogICAgbWFya1N0YXRpYyh0cmVlLCAoIl9fc3RhdGljX18iICsgaW5kZXgpLCBmYWxzZSk7DQogICAgcmV0dXJuIHRyZWUNCiAgfTsNCg0KICAvLyBtYXJrIG5vZGUgYXMgc3RhdGljICh2LW9uY2UpDQogIFZ1ZS5wcm90b3R5cGUuX28gPSBmdW5jdGlvbiBtYXJrT25jZSAoDQogICAgdHJlZSwNCiAgICBpbmRleCwNCiAgICBrZXkNCiAgKSB7DQogICAgbWFya1N0YXRpYyh0cmVlLCAoIl9fb25jZV9fIiArIGluZGV4ICsgKGtleSA/ICgiXyIgKyBrZXkpIDogIiIpKSwgdHJ1ZSk7DQogICAgcmV0dXJuIHRyZWUNCiAgfTsNCg0KICBmdW5jdGlvbiBtYXJrU3RhdGljICh0cmVlLCBrZXksIGlzT25jZSkgew0KICAgIGlmIChBcnJheS5pc0FycmF5KHRyZWUpKSB7DQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyZWUubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgaWYgKHRyZWVbaV0gJiYgdHlwZW9mIHRyZWVbaV0gIT09ICdzdHJpbmcnKSB7DQogICAgICAgICAgbWFya1N0YXRpY05vZGUodHJlZVtpXSwgKGtleSArICJfIiArIGkpLCBpc09uY2UpOw0KICAgICAgICB9DQogICAgICB9DQogICAgfSBlbHNlIHsNCiAgICAgIG1hcmtTdGF0aWNOb2RlKHRyZWUsIGtleSwgaXNPbmNlKTsNCiAgICB9DQogIH0NCg0KICBmdW5jdGlvbiBtYXJrU3RhdGljTm9kZSAobm9kZSwga2V5LCBpc09uY2UpIHsNCiAgICBub2RlLmlzU3RhdGljID0gdHJ1ZTsNCiAgICBub2RlLmtleSA9IGtleTsNCiAgICBub2RlLmlzT25jZSA9IGlzT25jZTsNCiAgfQ0KDQogIC8vIGZpbHRlciByZXNvbHV0aW9uIGhlbHBlcg0KICB2YXIgaWRlbnRpdHkgPSBmdW5jdGlvbiAoXykgeyByZXR1cm4gXzsgfTsNCiAgVnVlLnByb3RvdHlwZS5fZiA9IGZ1bmN0aW9uIHJlc29sdmVGaWx0ZXIgKGlkKSB7DQogICAgcmV0dXJuIHJlc29sdmVBc3NldCh0aGlzLiRvcHRpb25zLCAnZmlsdGVycycsIGlkLCB0cnVlKSB8fCBpZGVudGl0eQ0KICB9Ow0KDQogIC8vIHJlbmRlciB2LWZvcg0KICBWdWUucHJvdG90eXBlLl9sID0gZnVuY3Rpb24gcmVuZGVyTGlzdCAoDQogICAgdmFsLA0KICAgIHJlbmRlcg0KICApIHsNCiAgICB2YXIgcmV0LCBpLCBsLCBrZXlzLCBrZXk7DQogICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkgew0KICAgICAgcmV0ID0gbmV3IEFycmF5KHZhbC5sZW5ndGgpOw0KICAgICAgZm9yIChpID0gMCwgbCA9IHZhbC5sZW5ndGg7IGkgPCBsOyBpKyspIHsNCiAgICAgICAgcmV0W2ldID0gcmVuZGVyKHZhbFtpXSwgaSk7DQogICAgICB9DQogICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykgew0KICAgICAgcmV0ID0gbmV3IEFycmF5KHZhbCk7DQogICAgICBmb3IgKGkgPSAwOyBpIDwgdmFsOyBpKyspIHsNCiAgICAgICAgcmV0W2ldID0gcmVuZGVyKGkgKyAxLCBpKTsNCiAgICAgIH0NCiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbCkpIHsNCiAgICAgIGtleXMgPSBPYmplY3Qua2V5cyh2YWwpOw0KICAgICAgcmV0ID0gbmV3IEFycmF5KGtleXMubGVuZ3RoKTsNCiAgICAgIGZvciAoaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykgew0KICAgICAgICBrZXkgPSBrZXlzW2ldOw0KICAgICAgICByZXRbaV0gPSByZW5kZXIodmFsW2tleV0sIGtleSwgaSk7DQogICAgICB9DQogICAgfQ0KICAgIHJldHVybiByZXQNCiAgfTsNCg0KICAvLyByZW5kZXJTbG90DQogIFZ1ZS5wcm90b3R5cGUuX3QgPSBmdW5jdGlvbiAoDQogICAgbmFtZSwNCiAgICBmYWxsYmFjaywNCiAgICBwcm9wcw0KICApIHsNCiAgICB2YXIgc2NvcGVkU2xvdEZuID0gdGhpcy4kc2NvcGVkU2xvdHNbbmFtZV07DQogICAgaWYgKHNjb3BlZFNsb3RGbikgeyAvLyBzY29wZWQgc2xvdA0KICAgICAgcmV0dXJuIHNjb3BlZFNsb3RGbihwcm9wcyB8fCB7fSkgfHwgZmFsbGJhY2sNCiAgICB9IGVsc2Ugew0KICAgICAgdmFyIHNsb3ROb2RlcyA9IHRoaXMuJHNsb3RzW25hbWVdOw0KICAgICAgLy8gd2FybiBkdXBsaWNhdGUgc2xvdCB1c2FnZQ0KICAgICAgaWYgKHNsb3ROb2RlcyAmJiAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicpIHsNCiAgICAgICAgc2xvdE5vZGVzLl9yZW5kZXJlZCAmJiB3YXJuKA0KICAgICAgICAgICJEdXBsaWNhdGUgcHJlc2VuY2Ugb2Ygc2xvdCBcIiIgKyBuYW1lICsgIlwiIGZvdW5kIGluIHRoZSBzYW1lIHJlbmRlciB0cmVlICIgKw0KICAgICAgICAgICItIHRoaXMgd2lsbCBsaWtlbHkgY2F1c2UgcmVuZGVyIGVycm9ycy4iLA0KICAgICAgICAgIHRoaXMNCiAgICAgICAgKTsNCiAgICAgICAgc2xvdE5vZGVzLl9yZW5kZXJlZCA9IHRydWU7DQogICAgICB9DQogICAgICByZXR1cm4gc2xvdE5vZGVzIHx8IGZhbGxiYWNrDQogICAgfQ0KICB9Ow0KDQogIC8vIGFwcGx5IHYtYmluZCBvYmplY3QNCiAgVnVlLnByb3RvdHlwZS5fYiA9IGZ1bmN0aW9uIGJpbmRQcm9wcyAoDQogICAgZGF0YSwNCiAgICB0YWcsDQogICAgdmFsdWUsDQogICAgYXNQcm9wDQogICkgew0KICAgIGlmICh2YWx1ZSkgew0KICAgICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHsNCiAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oDQogICAgICAgICAgJ3YtYmluZCB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0IG9yIEFycmF5IHZhbHVlJywNCiAgICAgICAgICB0aGlzDQogICAgICAgICk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsNCiAgICAgICAgICB2YWx1ZSA9IHRvT2JqZWN0KHZhbHVlKTsNCiAgICAgICAgfQ0KICAgICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHsNCiAgICAgICAgICBpZiAoa2V5ID09PSAnY2xhc3MnIHx8IGtleSA9PT0gJ3N0eWxlJykgew0KICAgICAgICAgICAgZGF0YVtrZXldID0gdmFsdWVba2V5XTsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdmFyIGhhc2ggPSBhc1Byb3AgfHwgY29uZmlnLm11c3RVc2VQcm9wKHRhZywga2V5KQ0KICAgICAgICAgICAgICA/IGRhdGEuZG9tUHJvcHMgfHwgKGRhdGEuZG9tUHJvcHMgPSB7fSkNCiAgICAgICAgICAgICAgOiBkYXRhLmF0dHJzIHx8IChkYXRhLmF0dHJzID0ge30pOw0KICAgICAgICAgICAgaGFzaFtrZXldID0gdmFsdWVba2V5XTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIGRhdGENCiAgfTsNCg0KICAvLyBjaGVjayB2LW9uIGtleUNvZGVzDQogIFZ1ZS5wcm90b3R5cGUuX2sgPSBmdW5jdGlvbiBjaGVja0tleUNvZGVzICgNCiAgICBldmVudEtleUNvZGUsDQogICAga2V5LA0KICAgIGJ1aWx0SW5BbGlhcw0KICApIHsNCiAgICB2YXIga2V5Q29kZXMgPSBjb25maWcua2V5Q29kZXNba2V5XSB8fCBidWlsdEluQWxpYXM7DQogICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5Q29kZXMpKSB7DQogICAgICByZXR1cm4ga2V5Q29kZXMuaW5kZXhPZihldmVudEtleUNvZGUpID09PSAtMQ0KICAgIH0gZWxzZSB7DQogICAgICByZXR1cm4ga2V5Q29kZXMgIT09IGV2ZW50S2V5Q29kZQ0KICAgIH0NCiAgfTsNCn0NCg0KZnVuY3Rpb24gcmVzb2x2ZVNsb3RzICgNCiAgcmVuZGVyQ2hpbGRyZW4sDQogIGNvbnRleHQNCikgew0KICB2YXIgc2xvdHMgPSB7fTsNCiAgaWYgKCFyZW5kZXJDaGlsZHJlbikgew0KICAgIHJldHVybiBzbG90cw0KICB9DQogIHZhciBjaGlsZHJlbiA9IG5vcm1hbGl6ZUNoaWxkcmVuKHJlbmRlckNoaWxkcmVuKSB8fCBbXTsNCiAgdmFyIGRlZmF1bHRTbG90ID0gW107DQogIHZhciBuYW1lLCBjaGlsZDsNCiAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHsNCiAgICBjaGlsZCA9IGNoaWxkcmVuW2ldOw0KICAgIC8vIG5hbWVkIHNsb3RzIHNob3VsZCBvbmx5IGJlIHJlc3BlY3RlZCBpZiB0aGUgdm5vZGUgd2FzIHJlbmRlcmVkIGluIHRoZQ0KICAgIC8vIHNhbWUgY29udGV4dC4NCiAgICBpZiAoKGNoaWxkLmNvbnRleHQgPT09IGNvbnRleHQgfHwgY2hpbGQuZnVuY3Rpb25hbENvbnRleHQgPT09IGNvbnRleHQpICYmDQogICAgICAgIGNoaWxkLmRhdGEgJiYgKG5hbWUgPSBjaGlsZC5kYXRhLnNsb3QpKSB7DQogICAgICB2YXIgc2xvdCA9IChzbG90c1tuYW1lXSB8fCAoc2xvdHNbbmFtZV0gPSBbXSkpOw0KICAgICAgaWYgKGNoaWxkLnRhZyA9PT0gJ3RlbXBsYXRlJykgew0KICAgICAgICBzbG90LnB1c2guYXBwbHkoc2xvdCwgY2hpbGQuY2hpbGRyZW4pOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgc2xvdC5wdXNoKGNoaWxkKTsNCiAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgZGVmYXVsdFNsb3QucHVzaChjaGlsZCk7DQogICAgfQ0KICB9DQogIC8vIGlnbm9yZSBzaW5nbGUgd2hpdGVzcGFjZQ0KICBpZiAoZGVmYXVsdFNsb3QubGVuZ3RoICYmICEoDQogICAgZGVmYXVsdFNsb3QubGVuZ3RoID09PSAxICYmDQogICAgKGRlZmF1bHRTbG90WzBdLnRleHQgPT09ICcgJyB8fCBkZWZhdWx0U2xvdFswXS5pc0NvbW1lbnQpDQogICkpIHsNCiAgICBzbG90cy5kZWZhdWx0ID0gZGVmYXVsdFNsb3Q7DQogIH0NCiAgcmV0dXJuIHNsb3RzDQp9DQoNCi8qICAqLw0KDQpmdW5jdGlvbiBpbml0RXZlbnRzICh2bSkgew0KICB2bS5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsNCiAgLy8gaW5pdCBwYXJlbnQgYXR0YWNoZWQgZXZlbnRzDQogIHZhciBsaXN0ZW5lcnMgPSB2bS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzOw0KICB2YXIgYWRkID0gZnVuY3Rpb24gKGV2ZW50LCBmbiwgb25jZSkgew0KICAgIG9uY2UgPyB2bS4kb25jZShldmVudCwgZm4pIDogdm0uJG9uKGV2ZW50LCBmbik7DQogIH07DQogIHZhciByZW1vdmUkJDEgPSBiaW5kJDEodm0uJG9mZiwgdm0pOw0KICB2bS5fdXBkYXRlTGlzdGVuZXJzID0gZnVuY3Rpb24gKGxpc3RlbmVycywgb2xkTGlzdGVuZXJzKSB7DQogICAgdXBkYXRlTGlzdGVuZXJzKGxpc3RlbmVycywgb2xkTGlzdGVuZXJzIHx8IHt9LCBhZGQsIHJlbW92ZSQkMSwgdm0pOw0KICB9Ow0KICBpZiAobGlzdGVuZXJzKSB7DQogICAgdm0uX3VwZGF0ZUxpc3RlbmVycyhsaXN0ZW5lcnMpOw0KICB9DQp9DQoNCmZ1bmN0aW9uIGV2ZW50c01peGluIChWdWUpIHsNCiAgVnVlLnByb3RvdHlwZS4kb24gPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7DQogICAgdmFyIHZtID0gdGhpczsodm0uX2V2ZW50c1tldmVudF0gfHwgKHZtLl9ldmVudHNbZXZlbnRdID0gW10pKS5wdXNoKGZuKTsNCiAgICByZXR1cm4gdm0NCiAgfTsNCg0KICBWdWUucHJvdG90eXBlLiRvbmNlID0gZnVuY3Rpb24gKGV2ZW50LCBmbikgew0KICAgIHZhciB2bSA9IHRoaXM7DQogICAgZnVuY3Rpb24gb24gKCkgew0KICAgICAgdm0uJG9mZihldmVudCwgb24pOw0KICAgICAgZm4uYXBwbHkodm0sIGFyZ3VtZW50cyk7DQogICAgfQ0KICAgIG9uLmZuID0gZm47DQogICAgdm0uJG9uKGV2ZW50LCBvbik7DQogICAgcmV0dXJuIHZtDQogIH07DQoNCiAgVnVlLnByb3RvdHlwZS4kb2ZmID0gZnVuY3Rpb24gKGV2ZW50LCBmbikgew0KICAgIHZhciB2bSA9IHRoaXM7DQogICAgLy8gYWxsDQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7DQogICAgICB2bS5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsNCiAgICAgIHJldHVybiB2bQ0KICAgIH0NCiAgICAvLyBzcGVjaWZpYyBldmVudA0KICAgIHZhciBjYnMgPSB2bS5fZXZlbnRzW2V2ZW50XTsNCiAgICBpZiAoIWNicykgew0KICAgICAgcmV0dXJuIHZtDQogICAgfQ0KICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7DQogICAgICB2bS5fZXZlbnRzW2V2ZW50XSA9IG51bGw7DQogICAgICByZXR1cm4gdm0NCiAgICB9DQogICAgLy8gc3BlY2lmaWMgaGFuZGxlcg0KICAgIHZhciBjYjsNCiAgICB2YXIgaSA9IGNicy5sZW5ndGg7DQogICAgd2hpbGUgKGktLSkgew0KICAgICAgY2IgPSBjYnNbaV07DQogICAgICBpZiAoY2IgPT09IGZuIHx8IGNiLmZuID09PSBmbikgew0KICAgICAgICBjYnMuc3BsaWNlKGksIDEpOw0KICAgICAgICBicmVhaw0KICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gdm0NCiAgfTsNCg0KICBWdWUucHJvdG90eXBlLiRlbWl0ID0gZnVuY3Rpb24gKGV2ZW50KSB7DQogICAgdmFyIHZtID0gdGhpczsNCiAgICB2YXIgY2JzID0gdm0uX2V2ZW50c1tldmVudF07DQogICAgaWYgKGNicykgew0KICAgICAgY2JzID0gY2JzLmxlbmd0aCA+IDEgPyB0b0FycmF5KGNicykgOiBjYnM7DQogICAgICB2YXIgYXJncyA9IHRvQXJyYXkoYXJndW1lbnRzLCAxKTsNCiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2JzLmxlbmd0aDsgaSA8IGw7IGkrKykgew0KICAgICAgICBjYnNbaV0uYXBwbHkodm0sIGFyZ3MpOw0KICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gdm0NCiAgfTsNCn0NCg0KLyogICovDQoNCnZhciB1aWQgPSAwOw0KDQpmdW5jdGlvbiBpbml0TWl4aW4gKFZ1ZSkgew0KICBWdWUucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHsNCiAgICB2YXIgdm0gPSB0aGlzOw0KICAgIC8vIGEgdWlkDQogICAgdm0uX3VpZCA9IHVpZCsrOw0KICAgIC8vIGEgZmxhZyB0byBhdm9pZCB0aGlzIGJlaW5nIG9ic2VydmVkDQogICAgdm0uX2lzVnVlID0gdHJ1ZTsNCiAgICAvLyBtZXJnZSBvcHRpb25zDQogICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5faXNDb21wb25lbnQpIHsNCiAgICAgIC8vIG9wdGltaXplIGludGVybmFsIGNvbXBvbmVudCBpbnN0YW50aWF0aW9uDQogICAgICAvLyBzaW5jZSBkeW5hbWljIG9wdGlvbnMgbWVyZ2luZyBpcyBwcmV0dHkgc2xvdywgYW5kIG5vbmUgb2YgdGhlDQogICAgICAvLyBpbnRlcm5hbCBjb21wb25lbnQgb3B0aW9ucyBuZWVkcyBzcGVjaWFsIHRyZWF0bWVudC4NCiAgICAgIGluaXRJbnRlcm5hbENvbXBvbmVudCh2bSwgb3B0aW9ucyk7DQogICAgfSBlbHNlIHsNCiAgICAgIHZtLiRvcHRpb25zID0gbWVyZ2VPcHRpb25zKA0KICAgICAgICByZXNvbHZlQ29uc3RydWN0b3JPcHRpb25zKHZtLmNvbnN0cnVjdG9yKSwNCiAgICAgICAgb3B0aW9ucyB8fCB7fSwNCiAgICAgICAgdm0NCiAgICAgICk7DQogICAgfQ0KICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovDQogICAgew0KICAgICAgaW5pdFByb3h5KHZtKTsNCiAgICB9DQogICAgLy8gZXhwb3NlIHJlYWwgc2VsZg0KICAgIHZtLl9zZWxmID0gdm07DQogICAgaW5pdExpZmVjeWNsZSh2bSk7DQogICAgaW5pdEV2ZW50cyh2bSk7DQogICAgY2FsbEhvb2sodm0sICdiZWZvcmVDcmVhdGUnKTsNCiAgICBpbml0U3RhdGUodm0pOw0KICAgIGNhbGxIb29rKHZtLCAnY3JlYXRlZCcpOw0KICAgIGluaXRSZW5kZXIodm0pOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBpbml0SW50ZXJuYWxDb21wb25lbnQgKHZtLCBvcHRpb25zKSB7DQogIHZhciBvcHRzID0gdm0uJG9wdGlvbnMgPSBPYmplY3QuY3JlYXRlKHZtLmNvbnN0cnVjdG9yLm9wdGlvbnMpOw0KICAvLyBkb2luZyB0aGlzIGJlY2F1c2UgaXQncyBmYXN0ZXIgdGhhbiBkeW5hbWljIGVudW1lcmF0aW9uLg0KICBvcHRzLnBhcmVudCA9IG9wdGlvbnMucGFyZW50Ow0KICBvcHRzLnByb3BzRGF0YSA9IG9wdGlvbnMucHJvcHNEYXRhOw0KICBvcHRzLl9wYXJlbnRWbm9kZSA9IG9wdGlvbnMuX3BhcmVudFZub2RlOw0KICBvcHRzLl9wYXJlbnRMaXN0ZW5lcnMgPSBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7DQogIG9wdHMuX3JlbmRlckNoaWxkcmVuID0gb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW47DQogIG9wdHMuX2NvbXBvbmVudFRhZyA9IG9wdGlvbnMuX2NvbXBvbmVudFRhZzsNCiAgb3B0cy5fcGFyZW50RWxtID0gb3B0aW9ucy5fcGFyZW50RWxtOw0KICBvcHRzLl9yZWZFbG0gPSBvcHRpb25zLl9yZWZFbG07DQogIGlmIChvcHRpb25zLnJlbmRlcikgew0KICAgIG9wdHMucmVuZGVyID0gb3B0aW9ucy5yZW5kZXI7DQogICAgb3B0cy5zdGF0aWNSZW5kZXJGbnMgPSBvcHRpb25zLnN0YXRpY1JlbmRlckZuczsNCiAgfQ0KfQ0KDQpmdW5jdGlvbiByZXNvbHZlQ29uc3RydWN0b3JPcHRpb25zIChDdG9yKSB7DQogIHZhciBvcHRpb25zID0gQ3Rvci5vcHRpb25zOw0KICBpZiAoQ3Rvci5zdXBlcikgew0KICAgIHZhciBzdXBlck9wdGlvbnMgPSBDdG9yLnN1cGVyLm9wdGlvbnM7DQogICAgdmFyIGNhY2hlZFN1cGVyT3B0aW9ucyA9IEN0b3Iuc3VwZXJPcHRpb25zOw0KICAgIHZhciBleHRlbmRPcHRpb25zID0gQ3Rvci5leHRlbmRPcHRpb25zOw0KICAgIGlmIChzdXBlck9wdGlvbnMgIT09IGNhY2hlZFN1cGVyT3B0aW9ucykgew0KICAgICAgLy8gc3VwZXIgb3B0aW9uIGNoYW5nZWQNCiAgICAgIEN0b3Iuc3VwZXJPcHRpb25zID0gc3VwZXJPcHRpb25zOw0KICAgICAgZXh0ZW5kT3B0aW9ucy5yZW5kZXIgPSBvcHRpb25zLnJlbmRlcjsNCiAgICAgIGV4dGVuZE9wdGlvbnMuc3RhdGljUmVuZGVyRm5zID0gb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnM7DQogICAgICBleHRlbmRPcHRpb25zLl9zY29wZUlkID0gb3B0aW9ucy5fc2NvcGVJZDsNCiAgICAgIG9wdGlvbnMgPSBDdG9yLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoc3VwZXJPcHRpb25zLCBleHRlbmRPcHRpb25zKTsNCiAgICAgIGlmIChvcHRpb25zLm5hbWUpIHsNCiAgICAgICAgb3B0aW9ucy5jb21wb25lbnRzW29wdGlvbnMubmFtZV0gPSBDdG9yOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KICByZXR1cm4gb3B0aW9ucw0KfQ0KDQpmdW5jdGlvbiBWdWUkMyAob3B0aW9ucykgew0KICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmDQogICAgISh0aGlzIGluc3RhbmNlb2YgVnVlJDMpKSB7DQogICAgd2FybignVnVlIGlzIGEgY29uc3RydWN0b3IgYW5kIHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgYG5ld2Aga2V5d29yZCcpOw0KICB9DQogIHRoaXMuX2luaXQob3B0aW9ucyk7DQp9DQoNCmluaXRNaXhpbihWdWUkMyk7DQpzdGF0ZU1peGluKFZ1ZSQzKTsNCmV2ZW50c01peGluKFZ1ZSQzKTsNCmxpZmVjeWNsZU1peGluKFZ1ZSQzKTsNCnJlbmRlck1peGluKFZ1ZSQzKTsNCg0KLyogICovDQoNCmZ1bmN0aW9uIGluaXRVc2UgKFZ1ZSkgew0KICBWdWUudXNlID0gZnVuY3Rpb24gKHBsdWdpbikgew0KICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLw0KICAgIGlmIChwbHVnaW4uaW5zdGFsbGVkKSB7DQogICAgICByZXR1cm4NCiAgICB9DQogICAgLy8gYWRkaXRpb25hbCBwYXJhbWV0ZXJzDQogICAgdmFyIGFyZ3MgPSB0b0FycmF5KGFyZ3VtZW50cywgMSk7DQogICAgYXJncy51bnNoaWZ0KHRoaXMpOw0KICAgIGlmICh0eXBlb2YgcGx1Z2luLmluc3RhbGwgPT09ICdmdW5jdGlvbicpIHsNCiAgICAgIHBsdWdpbi5pbnN0YWxsLmFwcGx5KHBsdWdpbiwgYXJncyk7DQogICAgfSBlbHNlIHsNCiAgICAgIHBsdWdpbi5hcHBseShudWxsLCBhcmdzKTsNCiAgICB9DQogICAgcGx1Z2luLmluc3RhbGxlZCA9IHRydWU7DQogICAgcmV0dXJuIHRoaXMNCiAgfTsNCn0NCg0KLyogICovDQoNCmZ1bmN0aW9uIGluaXRNaXhpbiQxIChWdWUpIHsNCiAgVnVlLm1peGluID0gZnVuY3Rpb24gKG1peGluKSB7DQogICAgdGhpcy5vcHRpb25zID0gbWVyZ2VPcHRpb25zKHRoaXMub3B0aW9ucywgbWl4aW4pOw0KICB9Ow0KfQ0KDQovKiAgKi8NCg0KZnVuY3Rpb24gaW5pdEV4dGVuZCAoVnVlKSB7DQogIC8qKg0KICAgKiBFYWNoIGluc3RhbmNlIGNvbnN0cnVjdG9yLCBpbmNsdWRpbmcgVnVlLCBoYXMgYSB1bmlxdWUNCiAgICogY2lkLiBUaGlzIGVuYWJsZXMgdXMgdG8gY3JlYXRlIHdyYXBwZWQgImNoaWxkDQogICAqIGNvbnN0cnVjdG9ycyIgZm9yIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UgYW5kIGNhY2hlIHRoZW0uDQogICAqLw0KICBWdWUuY2lkID0gMDsNCiAgdmFyIGNpZCA9IDE7DQoNCiAgLyoqDQogICAqIENsYXNzIGluaGVyaXRhbmNlDQogICAqLw0KICBWdWUuZXh0ZW5kID0gZnVuY3Rpb24gKGV4dGVuZE9wdGlvbnMpIHsNCiAgICBleHRlbmRPcHRpb25zID0gZXh0ZW5kT3B0aW9ucyB8fCB7fTsNCiAgICB2YXIgU3VwZXIgPSB0aGlzOw0KICAgIHZhciBTdXBlcklkID0gU3VwZXIuY2lkOw0KICAgIHZhciBjYWNoZWRDdG9ycyA9IGV4dGVuZE9wdGlvbnMuX0N0b3IgfHwgKGV4dGVuZE9wdGlvbnMuX0N0b3IgPSB7fSk7DQogICAgaWYgKGNhY2hlZEN0b3JzW1N1cGVySWRdKSB7DQogICAgICByZXR1cm4gY2FjaGVkQ3RvcnNbU3VwZXJJZF0NCiAgICB9DQogICAgdmFyIG5hbWUgPSBleHRlbmRPcHRpb25zLm5hbWUgfHwgU3VwZXIub3B0aW9ucy5uYW1lOw0KICAgIHsNCiAgICAgIGlmICghL15bYS16QS1aXVtcdy1dKiQvLnRlc3QobmFtZSkpIHsNCiAgICAgICAgd2FybigNCiAgICAgICAgICAnSW52YWxpZCBjb21wb25lbnQgbmFtZTogIicgKyBuYW1lICsgJyIuIENvbXBvbmVudCBuYW1lcyAnICsNCiAgICAgICAgICAnY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjYXRlcnMgYW5kIHRoZSBoeXBoZW4uJw0KICAgICAgICApOw0KICAgICAgfQ0KICAgIH0NCiAgICB2YXIgU3ViID0gZnVuY3Rpb24gVnVlQ29tcG9uZW50IChvcHRpb25zKSB7DQogICAgICB0aGlzLl9pbml0KG9wdGlvbnMpOw0KICAgIH07DQogICAgU3ViLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3VwZXIucHJvdG90eXBlKTsNCiAgICBTdWIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ViOw0KICAgIFN1Yi5jaWQgPSBjaWQrKzsNCiAgICBTdWIub3B0aW9ucyA9IG1lcmdlT3B0aW9ucygNCiAgICAgIFN1cGVyLm9wdGlvbnMsDQogICAgICBleHRlbmRPcHRpb25zDQogICAgKTsNCiAgICBTdWJbJ3N1cGVyJ10gPSBTdXBlcjsNCiAgICAvLyBhbGxvdyBmdXJ0aGVyIGV4dGVuc2lvbi9taXhpbi9wbHVnaW4gdXNhZ2UNCiAgICBTdWIuZXh0ZW5kID0gU3VwZXIuZXh0ZW5kOw0KICAgIFN1Yi5taXhpbiA9IFN1cGVyLm1peGluOw0KICAgIFN1Yi51c2UgPSBTdXBlci51c2U7DQogICAgLy8gY3JlYXRlIGFzc2V0IHJlZ2lzdGVycywgc28gZXh0ZW5kZWQgY2xhc3Nlcw0KICAgIC8vIGNhbiBoYXZlIHRoZWlyIHByaXZhdGUgYXNzZXRzIHRvby4NCiAgICBjb25maWcuX2Fzc2V0VHlwZXMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkgew0KICAgICAgU3ViW3R5cGVdID0gU3VwZXJbdHlwZV07DQogICAgfSk7DQogICAgLy8gZW5hYmxlIHJlY3Vyc2l2ZSBzZWxmLWxvb2t1cA0KICAgIGlmIChuYW1lKSB7DQogICAgICBTdWIub3B0aW9ucy5jb21wb25lbnRzW25hbWVdID0gU3ViOw0KICAgIH0NCiAgICAvLyBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBzdXBlciBvcHRpb25zIGF0IGV4dGVuc2lvbiB0aW1lLg0KICAgIC8vIGxhdGVyIGF0IGluc3RhbnRpYXRpb24gd2UgY2FuIGNoZWNrIGlmIFN1cGVyJ3Mgb3B0aW9ucyBoYXZlDQogICAgLy8gYmVlbiB1cGRhdGVkLg0KICAgIFN1Yi5zdXBlck9wdGlvbnMgPSBTdXBlci5vcHRpb25zOw0KICAgIFN1Yi5leHRlbmRPcHRpb25zID0gZXh0ZW5kT3B0aW9uczsNCiAgICAvLyBjYWNoZSBjb25zdHJ1Y3Rvcg0KICAgIGNhY2hlZEN0b3JzW1N1cGVySWRdID0gU3ViOw0KICAgIHJldHVybiBTdWINCiAgfTsNCn0NCg0KLyogICovDQoNCmZ1bmN0aW9uIGluaXRBc3NldFJlZ2lzdGVycyAoVnVlKSB7DQogIC8qKg0KICAgKiBDcmVhdGUgYXNzZXQgcmVnaXN0cmF0aW9uIG1ldGhvZHMuDQogICAqLw0KICBjb25maWcuX2Fzc2V0VHlwZXMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkgew0KICAgIFZ1ZVt0eXBlXSA9IGZ1bmN0aW9uICgNCiAgICAgIGlkLA0KICAgICAgZGVmaW5pdGlvbg0KICAgICkgew0KICAgICAgaWYgKCFkZWZpbml0aW9uKSB7DQogICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNbdHlwZSArICdzJ11baWRdDQogICAgICB9IGVsc2Ugew0KICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8NCiAgICAgICAgew0KICAgICAgICAgIGlmICh0eXBlID09PSAnY29tcG9uZW50JyAmJiBjb25maWcuaXNSZXNlcnZlZFRhZyhpZCkpIHsNCiAgICAgICAgICAgIHdhcm4oDQogICAgICAgICAgICAgICdEbyBub3QgdXNlIGJ1aWx0LWluIG9yIHJlc2VydmVkIEhUTUwgZWxlbWVudHMgYXMgY29tcG9uZW50ICcgKw0KICAgICAgICAgICAgICAnaWQ6ICcgKyBpZA0KICAgICAgICAgICAgKTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYgKHR5cGUgPT09ICdjb21wb25lbnQnICYmIGlzUGxhaW5PYmplY3QoZGVmaW5pdGlvbikpIHsNCiAgICAgICAgICBkZWZpbml0aW9uLm5hbWUgPSBkZWZpbml0aW9uLm5hbWUgfHwgaWQ7DQogICAgICAgICAgZGVmaW5pdGlvbiA9IHRoaXMub3B0aW9ucy5fYmFzZS5leHRlbmQoZGVmaW5pdGlvbik7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHR5cGUgPT09ICdkaXJlY3RpdmUnICYmIHR5cGVvZiBkZWZpbml0aW9uID09PSAnZnVuY3Rpb24nKSB7DQogICAgICAgICAgZGVmaW5pdGlvbiA9IHsgYmluZDogZGVmaW5pdGlvbiwgdXBkYXRlOiBkZWZpbml0aW9uIH07DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5vcHRpb25zW3R5cGUgKyAncyddW2lkXSA9IGRlZmluaXRpb247DQogICAgICAgIHJldHVybiBkZWZpbml0aW9uDQogICAgICB9DQogICAgfTsNCiAgfSk7DQp9DQoNCi8qICAqLw0KDQp2YXIgcGF0dGVyblR5cGVzID0gW1N0cmluZywgUmVnRXhwXTsNCg0KZnVuY3Rpb24gbWF0Y2hlcyAocGF0dGVybiwgbmFtZSkgew0KICBpZiAodHlwZW9mIHBhdHRlcm4gPT09ICdzdHJpbmcnKSB7DQogICAgcmV0dXJuIHBhdHRlcm4uc3BsaXQoJywnKS5pbmRleE9mKG5hbWUpID4gLTENCiAgfSBlbHNlIHsNCiAgICByZXR1cm4gcGF0dGVybi50ZXN0KG5hbWUpDQogIH0NCn0NCg0KdmFyIEtlZXBBbGl2ZSA9IHsNCiAgbmFtZTogJ2tlZXAtYWxpdmUnLA0KICBhYnN0cmFjdDogdHJ1ZSwNCiAgcHJvcHM6IHsNCiAgICBpbmNsdWRlOiBwYXR0ZXJuVHlwZXMsDQogICAgZXhjbHVkZTogcGF0dGVyblR5cGVzDQogIH0sDQogIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQgKCkgew0KICAgIHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOw0KICB9LA0KICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlciAoKSB7DQogICAgdmFyIHZub2RlID0gZ2V0Rmlyc3RDb21wb25lbnRDaGlsZCh0aGlzLiRzbG90cy5kZWZhdWx0KTsNCiAgICBpZiAodm5vZGUgJiYgdm5vZGUuY29tcG9uZW50T3B0aW9ucykgew0KICAgICAgdmFyIG9wdHMgPSB2bm9kZS5jb21wb25lbnRPcHRpb25zOw0KICAgICAgLy8gY2hlY2sgcGF0dGVybg0KICAgICAgdmFyIG5hbWUgPSBvcHRzLkN0b3Iub3B0aW9ucy5uYW1lIHx8IG9wdHMudGFnOw0KICAgICAgaWYgKG5hbWUgJiYgKA0KICAgICAgICAodGhpcy5pbmNsdWRlICYmICFtYXRjaGVzKHRoaXMuaW5jbHVkZSwgbmFtZSkpIHx8DQogICAgICAgICh0aGlzLmV4Y2x1ZGUgJiYgbWF0Y2hlcyh0aGlzLmV4Y2x1ZGUsIG5hbWUpKQ0KICAgICAgKSkgew0KICAgICAgICByZXR1cm4gdm5vZGUNCiAgICAgIH0NCiAgICAgIHZhciBrZXkgPSB2bm9kZS5rZXkgPT0gbnVsbA0KICAgICAgICAvLyBzYW1lIGNvbnN0cnVjdG9yIG1heSBnZXQgcmVnaXN0ZXJlZCBhcyBkaWZmZXJlbnQgbG9jYWwgY29tcG9uZW50cw0KICAgICAgICAvLyBzbyBjaWQgYWxvbmUgaXMgbm90IGVub3VnaCAoIzMyNjkpDQogICAgICAgID8gb3B0cy5DdG9yLmNpZCArIChvcHRzLnRhZyA/ICgiOjoiICsgKG9wdHMudGFnKSkgOiAnJykNCiAgICAgICAgOiB2bm9kZS5rZXk7DQogICAgICBpZiAodGhpcy5jYWNoZVtrZXldKSB7DQogICAgICAgIHZub2RlLmNoaWxkID0gdGhpcy5jYWNoZVtrZXldLmNoaWxkOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdGhpcy5jYWNoZVtrZXldID0gdm5vZGU7DQogICAgICB9DQogICAgICB2bm9kZS5kYXRhLmtlZXBBbGl2ZSA9IHRydWU7DQogICAgfQ0KICAgIHJldHVybiB2bm9kZQ0KICB9LA0KICBkZXN0cm95ZWQ6IGZ1bmN0aW9uIGRlc3Ryb3llZCAoKSB7DQogICAgdmFyIHRoaXMkMSA9IHRoaXM7DQoNCiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5jYWNoZSkgew0KICAgICAgdmFyIHZub2RlID0gdGhpcyQxLmNhY2hlW2tleV07DQogICAgICBjYWxsSG9vayh2bm9kZS5jaGlsZCwgJ2RlYWN0aXZhdGVkJyk7DQogICAgICB2bm9kZS5jaGlsZC4kZGVzdHJveSgpOw0KICAgIH0NCiAgfQ0KfTsNCg0KdmFyIGJ1aWx0SW5Db21wb25lbnRzID0gew0KICBLZWVwQWxpdmU6IEtlZXBBbGl2ZQ0KfTsNCg0KLyogICovDQoNCmZ1bmN0aW9uIGluaXRHbG9iYWxBUEkgKFZ1ZSkgew0KICAvLyBjb25maWcNCiAgdmFyIGNvbmZpZ0RlZiA9IHt9Ow0KICBjb25maWdEZWYuZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gY29uZmlnOyB9Ow0KICB7DQogICAgY29uZmlnRGVmLnNldCA9IGZ1bmN0aW9uICgpIHsNCiAgICAgIHdhcm4oDQogICAgICAgICdEbyBub3QgcmVwbGFjZSB0aGUgVnVlLmNvbmZpZyBvYmplY3QsIHNldCBpbmRpdmlkdWFsIGZpZWxkcyBpbnN0ZWFkLicNCiAgICAgICk7DQogICAgfTsNCiAgfQ0KICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLCAnY29uZmlnJywgY29uZmlnRGVmKTsNCiAgVnVlLnV0aWwgPSB1dGlsOw0KICBWdWUuc2V0ID0gc2V0JDE7DQogIFZ1ZS5kZWxldGUgPSBkZWw7DQogIFZ1ZS5uZXh0VGljayA9IG5leHRUaWNrOw0KDQogIFZ1ZS5vcHRpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKTsNCiAgY29uZmlnLl9hc3NldFR5cGVzLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHsNCiAgICBWdWUub3B0aW9uc1t0eXBlICsgJ3MnXSA9IE9iamVjdC5jcmVhdGUobnVsbCk7DQogIH0pOw0KDQogIC8vIHRoaXMgaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgImJhc2UiIGNvbnN0cnVjdG9yIHRvIGV4dGVuZCBhbGwgcGxhaW4tb2JqZWN0DQogIC8vIGNvbXBvbmVudHMgd2l0aCBpbiBXZWV4J3MgbXVsdGktaW5zdGFuY2Ugc2NlbmFyaW9zLg0KICBWdWUub3B0aW9ucy5fYmFzZSA9IFZ1ZTsNCg0KICBleHRlbmQoVnVlLm9wdGlvbnMuY29tcG9uZW50cywgYnVpbHRJbkNvbXBvbmVudHMpOw0KDQogIGluaXRVc2UoVnVlKTsNCiAgaW5pdE1peGluJDEoVnVlKTsNCiAgaW5pdEV4dGVuZChWdWUpOw0KICBpbml0QXNzZXRSZWdpc3RlcnMoVnVlKTsNCn0NCg0KaW5pdEdsb2JhbEFQSShWdWUkMyk7DQoNCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUkMy5wcm90b3R5cGUsICckaXNTZXJ2ZXInLCB7DQogIGdldDogaXNTZXJ2ZXJSZW5kZXJpbmcNCn0pOw0KDQpWdWUkMy52ZXJzaW9uID0gJzIuMS40JzsNCg0KLyogICovDQoNCi8vIGF0dHJpYnV0ZXMgdGhhdCBzaG91bGQgYmUgdXNpbmcgcHJvcHMgZm9yIGJpbmRpbmcNCnZhciBtdXN0VXNlUHJvcCA9IGZ1bmN0aW9uICh0YWcsIGF0dHIpIHsNCiAgcmV0dXJuICgNCiAgICAoYXR0ciA9PT0gJ3ZhbHVlJyAmJiAodGFnID09PSAnaW5wdXQnIHx8IHRhZyA9PT0gJ3RleHRhcmVhJyB8fCB0YWcgPT09ICdvcHRpb24nKSkgfHwNCiAgICAoYXR0ciA9PT0gJ3NlbGVjdGVkJyAmJiB0YWcgPT09ICdvcHRpb24nKSB8fA0KICAgIChhdHRyID09PSAnY2hlY2tlZCcgJiYgdGFnID09PSAnaW5wdXQnKSB8fA0KICAgIChhdHRyID09PSAnbXV0ZWQnICYmIHRhZyA9PT0gJ3ZpZGVvJykNCiAgKQ0KfTsNCg0KdmFyIGlzRW51bWVyYXRlZEF0dHIgPSBtYWtlTWFwKCdjb250ZW50ZWRpdGFibGUsZHJhZ2dhYmxlLHNwZWxsY2hlY2snKTsNCg0KdmFyIGlzQm9vbGVhbkF0dHIgPSBtYWtlTWFwKA0KICAnYWxsb3dmdWxsc2NyZWVuLGFzeW5jLGF1dG9mb2N1cyxhdXRvcGxheSxjaGVja2VkLGNvbXBhY3QsY29udHJvbHMsZGVjbGFyZSwnICsNCiAgJ2RlZmF1bHQsZGVmYXVsdGNoZWNrZWQsZGVmYXVsdG11dGVkLGRlZmF1bHRzZWxlY3RlZCxkZWZlcixkaXNhYmxlZCwnICsNCiAgJ2VuYWJsZWQsZm9ybW5vdmFsaWRhdGUsaGlkZGVuLGluZGV0ZXJtaW5hdGUsaW5lcnQsaXNtYXAsaXRlbXNjb3BlLGxvb3AsbXVsdGlwbGUsJyArDQogICdtdXRlZCxub2hyZWYsbm9yZXNpemUsbm9zaGFkZSxub3ZhbGlkYXRlLG5vd3JhcCxvcGVuLHBhdXNlb25leGl0LHJlYWRvbmx5LCcgKw0KICAncmVxdWlyZWQscmV2ZXJzZWQsc2NvcGVkLHNlYW1sZXNzLHNlbGVjdGVkLHNvcnRhYmxlLHRyYW5zbGF0ZSwnICsNCiAgJ3RydWVzcGVlZCx0eXBlbXVzdG1hdGNoLHZpc2libGUnDQopOw0KDQp2YXIgeGxpbmtOUyA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJzsNCg0KdmFyIGlzWGxpbmsgPSBmdW5jdGlvbiAobmFtZSkgew0KICByZXR1cm4gbmFtZS5jaGFyQXQoNSkgPT09ICc6JyAmJiBuYW1lLnNsaWNlKDAsIDUpID09PSAneGxpbmsnDQp9Ow0KDQp2YXIgZ2V0WGxpbmtQcm9wID0gZnVuY3Rpb24gKG5hbWUpIHsNCiAgcmV0dXJuIGlzWGxpbmsobmFtZSkgPyBuYW1lLnNsaWNlKDYsIG5hbWUubGVuZ3RoKSA6ICcnDQp9Ow0KDQp2YXIgaXNGYWxzeUF0dHJWYWx1ZSA9IGZ1bmN0aW9uICh2YWwpIHsNCiAgcmV0dXJuIHZhbCA9PSBudWxsIHx8IHZhbCA9PT0gZmFsc2UNCn07DQoNCi8qICAqLw0KDQpmdW5jdGlvbiBnZW5DbGFzc0ZvclZub2RlICh2bm9kZSkgew0KICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7DQogIHZhciBwYXJlbnROb2RlID0gdm5vZGU7DQogIHZhciBjaGlsZE5vZGUgPSB2bm9kZTsNCiAgd2hpbGUgKGNoaWxkTm9kZS5jaGlsZCkgew0KICAgIGNoaWxkTm9kZSA9IGNoaWxkTm9kZS5jaGlsZC5fdm5vZGU7DQogICAgaWYgKGNoaWxkTm9kZS5kYXRhKSB7DQogICAgICBkYXRhID0gbWVyZ2VDbGFzc0RhdGEoY2hpbGROb2RlLmRhdGEsIGRhdGEpOw0KICAgIH0NCiAgfQ0KICB3aGlsZSAoKHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudCkpIHsNCiAgICBpZiAocGFyZW50Tm9kZS5kYXRhKSB7DQogICAgICBkYXRhID0gbWVyZ2VDbGFzc0RhdGEoZGF0YSwgcGFyZW50Tm9kZS5kYXRhKTsNCiAgICB9DQogIH0NCiAgcmV0dXJuIGdlbkNsYXNzRnJvbURhdGEoZGF0YSkNCn0NCg0KZnVuY3Rpb24gbWVyZ2VDbGFzc0RhdGEgKGNoaWxkLCBwYXJlbnQpIHsNCiAgcmV0dXJuIHsNCiAgICBzdGF0aWNDbGFzczogY29uY2F0KGNoaWxkLnN0YXRpY0NsYXNzLCBwYXJlbnQuc3RhdGljQ2xhc3MpLA0KICAgIGNsYXNzOiBjaGlsZC5jbGFzcw0KICAgICAgPyBbY2hpbGQuY2xhc3MsIHBhcmVudC5jbGFzc10NCiAgICAgIDogcGFyZW50LmNsYXNzDQogIH0NCn0NCg0KZnVuY3Rpb24gZ2VuQ2xhc3NGcm9tRGF0YSAoZGF0YSkgew0KICB2YXIgZHluYW1pY0NsYXNzID0gZGF0YS5jbGFzczsNCiAgdmFyIHN0YXRpY0NsYXNzID0gZGF0YS5zdGF0aWNDbGFzczsNCiAgaWYgKHN0YXRpY0NsYXNzIHx8IGR5bmFtaWNDbGFzcykgew0KICAgIHJldHVybiBjb25jYXQoc3RhdGljQ2xhc3MsIHN0cmluZ2lmeUNsYXNzKGR5bmFtaWNDbGFzcykpDQogIH0NCiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8NCiAgcmV0dXJuICcnDQp9DQoNCmZ1bmN0aW9uIGNvbmNhdCAoYSwgYikgew0KICByZXR1cm4gYSA/IGIgPyAoYSArICcgJyArIGIpIDogYSA6IChiIHx8ICcnKQ0KfQ0KDQpmdW5jdGlvbiBzdHJpbmdpZnlDbGFzcyAodmFsdWUpIHsNCiAgdmFyIHJlcyA9ICcnOw0KICBpZiAoIXZhbHVlKSB7DQogICAgcmV0dXJuIHJlcw0KICB9DQogIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7DQogICAgcmV0dXJuIHZhbHVlDQogIH0NCiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7DQogICAgdmFyIHN0cmluZ2lmaWVkOw0KICAgIGZvciAodmFyIGkgPSAwLCBsID0gdmFsdWUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7DQogICAgICBpZiAodmFsdWVbaV0pIHsNCiAgICAgICAgaWYgKChzdHJpbmdpZmllZCA9IHN0cmluZ2lmeUNsYXNzKHZhbHVlW2ldKSkpIHsNCiAgICAgICAgICByZXMgKz0gc3RyaW5naWZpZWQgKyAnICc7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIHJlcy5zbGljZSgwLCAtMSkNCiAgfQ0KICBpZiAoaXNPYmplY3QodmFsdWUpKSB7DQogICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7DQogICAgICBpZiAodmFsdWVba2V5XSkgeyByZXMgKz0ga2V5ICsgJyAnOyB9DQogICAgfQ0KICAgIHJldHVybiByZXMuc2xpY2UoMCwgLTEpDQogIH0NCiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8NCiAgcmV0dXJuIHJlcw0KfQ0KDQovKiAgKi8NCg0KdmFyIG5hbWVzcGFjZU1hcCA9IHsNCiAgc3ZnOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLA0KICBtYXRoOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCcsDQogIHhodG1sOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcNCn07DQoNCnZhciBpc0hUTUxUYWcgPSBtYWtlTWFwKA0KICAnaHRtbCxib2R5LGJhc2UsaGVhZCxsaW5rLG1ldGEsc3R5bGUsdGl0bGUsJyArDQogICdhZGRyZXNzLGFydGljbGUsYXNpZGUsZm9vdGVyLGhlYWRlcixoMSxoMixoMyxoNCxoNSxoNixoZ3JvdXAsbmF2LHNlY3Rpb24sJyArDQogICdkaXYsZGQsZGwsZHQsZmlnY2FwdGlvbixmaWd1cmUsaHIsaW1nLGxpLG1haW4sb2wscCxwcmUsdWwsJyArDQogICdhLGIsYWJicixiZGksYmRvLGJyLGNpdGUsY29kZSxkYXRhLGRmbixlbSxpLGtiZCxtYXJrLHEscnAscnQscnRjLHJ1YnksJyArDQogICdzLHNhbXAsc21hbGwsc3BhbixzdHJvbmcsc3ViLHN1cCx0aW1lLHUsdmFyLHdicixhcmVhLGF1ZGlvLG1hcCx0cmFjayx2aWRlbywnICsNCiAgJ2VtYmVkLG9iamVjdCxwYXJhbSxzb3VyY2UsY2FudmFzLHNjcmlwdCxub3NjcmlwdCxkZWwsaW5zLCcgKw0KICAnY2FwdGlvbixjb2wsY29sZ3JvdXAsdGFibGUsdGhlYWQsdGJvZHksdGQsdGgsdHIsJyArDQogICdidXR0b24sZGF0YWxpc3QsZmllbGRzZXQsZm9ybSxpbnB1dCxsYWJlbCxsZWdlbmQsbWV0ZXIsb3B0Z3JvdXAsb3B0aW9uLCcgKw0KICAnb3V0cHV0LHByb2dyZXNzLHNlbGVjdCx0ZXh0YXJlYSwnICsNCiAgJ2RldGFpbHMsZGlhbG9nLG1lbnUsbWVudWl0ZW0sc3VtbWFyeSwnICsNCiAgJ2NvbnRlbnQsZWxlbWVudCxzaGFkb3csdGVtcGxhdGUnDQopOw0KDQovLyB0aGlzIG1hcCBpcyBpbnRlbnRpb25hbGx5IHNlbGVjdGl2ZSwgb25seSBjb3ZlcmluZyBTVkcgZWxlbWVudHMgdGhhdCBtYXkNCi8vIGNvbnRhaW4gY2hpbGQgZWxlbWVudHMuDQp2YXIgaXNTVkcgPSBtYWtlTWFwKA0KICAnc3ZnLGFuaW1hdGUsY2lyY2xlLGNsaXBwYXRoLGN1cnNvcixkZWZzLGRlc2MsZWxsaXBzZSxmaWx0ZXIsZm9udCwnICsNCiAgJ2ZvbnQtZmFjZSxnLGdseXBoLGltYWdlLGxpbmUsbWFya2VyLG1hc2ssbWlzc2luZy1nbHlwaCxwYXRoLHBhdHRlcm4sJyArDQogICdwb2x5Z29uLHBvbHlsaW5lLHJlY3Qsc3dpdGNoLHN5bWJvbCx0ZXh0LHRleHRwYXRoLHRzcGFuLHVzZSx2aWV3JywNCiAgdHJ1ZQ0KKTsNCg0KdmFyIGlzUHJlVGFnID0gZnVuY3Rpb24gKHRhZykgeyByZXR1cm4gdGFnID09PSAncHJlJzsgfTsNCg0KdmFyIGlzUmVzZXJ2ZWRUYWcgPSBmdW5jdGlvbiAodGFnKSB7DQogIHJldHVybiBpc0hUTUxUYWcodGFnKSB8fCBpc1NWRyh0YWcpDQp9Ow0KDQpmdW5jdGlvbiBnZXRUYWdOYW1lc3BhY2UgKHRhZykgew0KICBpZiAoaXNTVkcodGFnKSkgew0KICAgIHJldHVybiAnc3ZnJw0KICB9DQogIC8vIGJhc2ljIHN1cHBvcnQgZm9yIE1hdGhNTA0KICAvLyBub3RlIGl0IGRvZXNuJ3Qgc3VwcG9ydCBvdGhlciBNYXRoTUwgZWxlbWVudHMgYmVpbmcgY29tcG9uZW50IHJvb3RzDQogIGlmICh0YWcgPT09ICdtYXRoJykgew0KICAgIHJldHVybiAnbWF0aCcNCiAgfQ0KfQ0KDQp2YXIgdW5rbm93bkVsZW1lbnRDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7DQpmdW5jdGlvbiBpc1Vua25vd25FbGVtZW50ICh0YWcpIHsNCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovDQogIGlmICghaW5Ccm93c2VyKSB7DQogICAgcmV0dXJuIHRydWUNCiAgfQ0KICBpZiAoaXNSZXNlcnZlZFRhZyh0YWcpKSB7DQogICAgcmV0dXJuIGZhbHNlDQogIH0NCiAgdGFnID0gdGFnLnRvTG93ZXJDYXNlKCk7DQogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLw0KICBpZiAodW5rbm93bkVsZW1lbnRDYWNoZVt0YWddICE9IG51bGwpIHsNCiAgICByZXR1cm4gdW5rbm93bkVsZW1lbnRDYWNoZVt0YWddDQogIH0NCiAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpOw0KICBpZiAodGFnLmluZGV4T2YoJy0nKSA+IC0xKSB7DQogICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjgyMTAzNjQvMTA3MDI0NA0KICAgIHJldHVybiAodW5rbm93bkVsZW1lbnRDYWNoZVt0YWddID0gKA0KICAgICAgZWwuY29uc3RydWN0b3IgPT09IHdpbmRvdy5IVE1MVW5rbm93bkVsZW1lbnQgfHwNCiAgICAgIGVsLmNvbnN0cnVjdG9yID09PSB3aW5kb3cuSFRNTEVsZW1lbnQNCiAgICApKQ0KICB9IGVsc2Ugew0KICAgIHJldHVybiAodW5rbm93bkVsZW1lbnRDYWNoZVt0YWddID0gL0hUTUxVbmtub3duRWxlbWVudC8udGVzdChlbC50b1N0cmluZygpKSkNCiAgfQ0KfQ0KDQovKiAgKi8NCg0KLyoqDQogKiBRdWVyeSBhbiBlbGVtZW50IHNlbGVjdG9yIGlmIGl0J3Mgbm90IGFuIGVsZW1lbnQgYWxyZWFkeS4NCiAqLw0KZnVuY3Rpb24gcXVlcnkgKGVsKSB7DQogIGlmICh0eXBlb2YgZWwgPT09ICdzdHJpbmcnKSB7DQogICAgdmFyIHNlbGVjdG9yID0gZWw7DQogICAgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsKTsNCiAgICBpZiAoIWVsKSB7DQogICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigNCiAgICAgICAgJ0Nhbm5vdCBmaW5kIGVsZW1lbnQ6ICcgKyBzZWxlY3Rvcg0KICAgICAgKTsNCiAgICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKQ0KICAgIH0NCiAgfQ0KICByZXR1cm4gZWwNCn0NCg0KLyogICovDQoNCmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQkMSAodGFnTmFtZSwgdm5vZGUpIHsNCiAgdmFyIGVsbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7DQogIGlmICh0YWdOYW1lICE9PSAnc2VsZWN0Jykgew0KICAgIHJldHVybiBlbG0NCiAgfQ0KICBpZiAodm5vZGUuZGF0YSAmJiB2bm9kZS5kYXRhLmF0dHJzICYmICdtdWx0aXBsZScgaW4gdm5vZGUuZGF0YS5hdHRycykgew0KICAgIGVsbS5zZXRBdHRyaWJ1dGUoJ211bHRpcGxlJywgJ211bHRpcGxlJyk7DQogIH0NCiAgcmV0dXJuIGVsbQ0KfQ0KDQpmdW5jdGlvbiBjcmVhdGVFbGVtZW50TlMgKG5hbWVzcGFjZSwgdGFnTmFtZSkgew0KICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZU1hcFtuYW1lc3BhY2VdLCB0YWdOYW1lKQ0KfQ0KDQpmdW5jdGlvbiBjcmVhdGVUZXh0Tm9kZSAodGV4dCkgew0KICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dCkNCn0NCg0KZnVuY3Rpb24gY3JlYXRlQ29tbWVudCAodGV4dCkgew0KICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCh0ZXh0KQ0KfQ0KDQpmdW5jdGlvbiBpbnNlcnRCZWZvcmUgKHBhcmVudE5vZGUsIG5ld05vZGUsIHJlZmVyZW5jZU5vZGUpIHsNCiAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobmV3Tm9kZSwgcmVmZXJlbmNlTm9kZSk7DQp9DQoNCmZ1bmN0aW9uIHJlbW92ZUNoaWxkIChub2RlLCBjaGlsZCkgew0KICBub2RlLnJlbW92ZUNoaWxkKGNoaWxkKTsNCn0NCg0KZnVuY3Rpb24gYXBwZW5kQ2hpbGQgKG5vZGUsIGNoaWxkKSB7DQogIG5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQpOw0KfQ0KDQpmdW5jdGlvbiBwYXJlbnROb2RlIChub2RlKSB7DQogIHJldHVybiBub2RlLnBhcmVudE5vZGUNCn0NCg0KZnVuY3Rpb24gbmV4dFNpYmxpbmcgKG5vZGUpIHsNCiAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmcNCn0NCg0KZnVuY3Rpb24gdGFnTmFtZSAobm9kZSkgew0KICByZXR1cm4gbm9kZS50YWdOYW1lDQp9DQoNCmZ1bmN0aW9uIHNldFRleHRDb250ZW50IChub2RlLCB0ZXh0KSB7DQogIG5vZGUudGV4dENvbnRlbnQgPSB0ZXh0Ow0KfQ0KDQpmdW5jdGlvbiBjaGlsZE5vZGVzIChub2RlKSB7DQogIHJldHVybiBub2RlLmNoaWxkTm9kZXMNCn0NCg0KZnVuY3Rpb24gc2V0QXR0cmlidXRlIChub2RlLCBrZXksIHZhbCkgew0KICBub2RlLnNldEF0dHJpYnV0ZShrZXksIHZhbCk7DQp9DQoNCg0KdmFyIG5vZGVPcHMgPSBPYmplY3QuZnJlZXplKHsNCgljcmVhdGVFbGVtZW50OiBjcmVhdGVFbGVtZW50JDEsDQoJY3JlYXRlRWxlbWVudE5TOiBjcmVhdGVFbGVtZW50TlMsDQoJY3JlYXRlVGV4dE5vZGU6IGNyZWF0ZVRleHROb2RlLA0KCWNyZWF0ZUNvbW1lbnQ6IGNyZWF0ZUNvbW1lbnQsDQoJaW5zZXJ0QmVmb3JlOiBpbnNlcnRCZWZvcmUsDQoJcmVtb3ZlQ2hpbGQ6IHJlbW92ZUNoaWxkLA0KCWFwcGVuZENoaWxkOiBhcHBlbmRDaGlsZCwNCglwYXJlbnROb2RlOiBwYXJlbnROb2RlLA0KCW5leHRTaWJsaW5nOiBuZXh0U2libGluZywNCgl0YWdOYW1lOiB0YWdOYW1lLA0KCXNldFRleHRDb250ZW50OiBzZXRUZXh0Q29udGVudCwNCgljaGlsZE5vZGVzOiBjaGlsZE5vZGVzLA0KCXNldEF0dHJpYnV0ZTogc2V0QXR0cmlidXRlDQp9KTsNCg0KLyogICovDQoNCnZhciByZWYgPSB7DQogIGNyZWF0ZTogZnVuY3Rpb24gY3JlYXRlIChfLCB2bm9kZSkgew0KICAgIHJlZ2lzdGVyUmVmKHZub2RlKTsNCiAgfSwNCiAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUgKG9sZFZub2RlLCB2bm9kZSkgew0KICAgIGlmIChvbGRWbm9kZS5kYXRhLnJlZiAhPT0gdm5vZGUuZGF0YS5yZWYpIHsNCiAgICAgIHJlZ2lzdGVyUmVmKG9sZFZub2RlLCB0cnVlKTsNCiAgICAgIHJlZ2lzdGVyUmVmKHZub2RlKTsNCiAgICB9DQogIH0sDQogIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3kgKHZub2RlKSB7DQogICAgcmVnaXN0ZXJSZWYodm5vZGUsIHRydWUpOw0KICB9DQp9Ow0KDQpmdW5jdGlvbiByZWdpc3RlclJlZiAodm5vZGUsIGlzUmVtb3ZhbCkgew0KICB2YXIga2V5ID0gdm5vZGUuZGF0YS5yZWY7DQogIGlmICgha2V5KSB7IHJldHVybiB9DQoNCiAgdmFyIHZtID0gdm5vZGUuY29udGV4dDsNCiAgdmFyIHJlZiA9IHZub2RlLmNoaWxkIHx8IHZub2RlLmVsbTsNCiAgdmFyIHJlZnMgPSB2bS4kcmVmczsNCiAgaWYgKGlzUmVtb3ZhbCkgew0KICAgIGlmIChBcnJheS5pc0FycmF5KHJlZnNba2V5XSkpIHsNCiAgICAgIHJlbW92ZSQxKHJlZnNba2V5XSwgcmVmKTsNCiAgICB9IGVsc2UgaWYgKHJlZnNba2V5XSA9PT0gcmVmKSB7DQogICAgICByZWZzW2tleV0gPSB1bmRlZmluZWQ7DQogICAgfQ0KICB9IGVsc2Ugew0KICAgIGlmICh2bm9kZS5kYXRhLnJlZkluRm9yKSB7DQogICAgICBpZiAoQXJyYXkuaXNBcnJheShyZWZzW2tleV0pICYmIHJlZnNba2V5XS5pbmRleE9mKHJlZikgPCAwKSB7DQogICAgICAgIHJlZnNba2V5XS5wdXNoKHJlZik7DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZWZzW2tleV0gPSBbcmVmXTsNCiAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgcmVmc1trZXldID0gcmVmOw0KICAgIH0NCiAgfQ0KfQ0KDQovKioNCiAqIFZpcnR1YWwgRE9NIHBhdGNoaW5nIGFsZ29yaXRobSBiYXNlZCBvbiBTbmFiYmRvbSBieQ0KICogU2ltb24gRnJpaXMgVmluZHVtIChAcGFsZGVwaW5kKQ0KICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlDQogKiBodHRwczovL2dpdGh1Yi5jb20vcGFsZGVwaW5kL3NuYWJiZG9tL2Jsb2IvbWFzdGVyL0xJQ0VOU0UNCiAqDQogKiBtb2RpZmllZCBieSBFdmFuIFlvdSAoQHl5eDk5MDgwMykNCiAqDQoNCi8qDQogKiBOb3QgdHlwZS1jaGVja2luZyB0aGlzIGJlY2F1c2UgdGhpcyBmaWxlIGlzIHBlcmYtY3JpdGljYWwgYW5kIHRoZSBjb3N0DQogKiBvZiBtYWtpbmcgZmxvdyB1bmRlcnN0YW5kIGl0IGlzIG5vdCB3b3J0aCBpdC4NCiAqLw0KDQp2YXIgZW1wdHlOb2RlID0gbmV3IFZOb2RlKCcnLCB7fSwgW10pOw0KDQp2YXIgaG9va3MkMSA9IFsnY3JlYXRlJywgJ2FjdGl2YXRlJywgJ3VwZGF0ZScsICdyZW1vdmUnLCAnZGVzdHJveSddOw0KDQpmdW5jdGlvbiBpc1VuZGVmIChzKSB7DQogIHJldHVybiBzID09IG51bGwNCn0NCg0KZnVuY3Rpb24gaXNEZWYgKHMpIHsNCiAgcmV0dXJuIHMgIT0gbnVsbA0KfQ0KDQpmdW5jdGlvbiBzYW1lVm5vZGUgKHZub2RlMSwgdm5vZGUyKSB7DQogIHJldHVybiAoDQogICAgdm5vZGUxLmtleSA9PT0gdm5vZGUyLmtleSAmJg0KICAgIHZub2RlMS50YWcgPT09IHZub2RlMi50YWcgJiYNCiAgICB2bm9kZTEuaXNDb21tZW50ID09PSB2bm9kZTIuaXNDb21tZW50ICYmDQogICAgIXZub2RlMS5kYXRhID09PSAhdm5vZGUyLmRhdGENCiAgKQ0KfQ0KDQpmdW5jdGlvbiBjcmVhdGVLZXlUb09sZElkeCAoY2hpbGRyZW4sIGJlZ2luSWR4LCBlbmRJZHgpIHsNCiAgdmFyIGksIGtleTsNCiAgdmFyIG1hcCA9IHt9Ow0KICBmb3IgKGkgPSBiZWdpbklkeDsgaSA8PSBlbmRJZHg7ICsraSkgew0KICAgIGtleSA9IGNoaWxkcmVuW2ldLmtleTsNCiAgICBpZiAoaXNEZWYoa2V5KSkgeyBtYXBba2V5XSA9IGk7IH0NCiAgfQ0KICByZXR1cm4gbWFwDQp9DQoNCmZ1bmN0aW9uIGNyZWF0ZVBhdGNoRnVuY3Rpb24gKGJhY2tlbmQpIHsNCiAgdmFyIGksIGo7DQogIHZhciBjYnMgPSB7fTsNCg0KICB2YXIgbW9kdWxlcyA9IGJhY2tlbmQubW9kdWxlczsNCiAgdmFyIG5vZGVPcHMgPSBiYWNrZW5kLm5vZGVPcHM7DQoNCiAgZm9yIChpID0gMDsgaSA8IGhvb2tzJDEubGVuZ3RoOyArK2kpIHsNCiAgICBjYnNbaG9va3MkMVtpXV0gPSBbXTsNCiAgICBmb3IgKGogPSAwOyBqIDwgbW9kdWxlcy5sZW5ndGg7ICsraikgew0KICAgICAgaWYgKG1vZHVsZXNbal1baG9va3MkMVtpXV0gIT09IHVuZGVmaW5lZCkgeyBjYnNbaG9va3MkMVtpXV0ucHVzaChtb2R1bGVzW2pdW2hvb2tzJDFbaV1dKTsgfQ0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIGVtcHR5Tm9kZUF0IChlbG0pIHsNCiAgICByZXR1cm4gbmV3IFZOb2RlKG5vZGVPcHMudGFnTmFtZShlbG0pLnRvTG93ZXJDYXNlKCksIHt9LCBbXSwgdW5kZWZpbmVkLCBlbG0pDQogIH0NCg0KICBmdW5jdGlvbiBjcmVhdGVSbUNiIChjaGlsZEVsbSwgbGlzdGVuZXJzKSB7DQogICAgZnVuY3Rpb24gcmVtb3ZlJCQxICgpIHsNCiAgICAgIGlmICgtLXJlbW92ZSQkMS5saXN0ZW5lcnMgPT09IDApIHsNCiAgICAgICAgcmVtb3ZlRWxlbWVudChjaGlsZEVsbSk7DQogICAgICB9DQogICAgfQ0KICAgIHJlbW92ZSQkMS5saXN0ZW5lcnMgPSBsaXN0ZW5lcnM7DQogICAgcmV0dXJuIHJlbW92ZSQkMQ0KICB9DQoNCiAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudCAoZWwpIHsNCiAgICB2YXIgcGFyZW50ID0gbm9kZU9wcy5wYXJlbnROb2RlKGVsKTsNCiAgICAvLyBlbGVtZW50IG1heSBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkIGR1ZSB0byB2LWh0bWwNCiAgICBpZiAocGFyZW50KSB7DQogICAgICBub2RlT3BzLnJlbW92ZUNoaWxkKHBhcmVudCwgZWwpOw0KICAgIH0NCiAgfQ0KDQogIHZhciBpblByZSA9IDA7DQogIGZ1bmN0aW9uIGNyZWF0ZUVsbSAodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0sIG5lc3RlZCkgew0KICAgIHZub2RlLmlzUm9vdEluc2VydCA9ICFuZXN0ZWQ7IC8vIGZvciB0cmFuc2l0aW9uIGVudGVyIGNoZWNrDQogICAgaWYgKGNyZWF0ZUNvbXBvbmVudCh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIHJlZkVsbSkpIHsNCiAgICAgIHJldHVybg0KICAgIH0NCg0KICAgIHZhciBkYXRhID0gdm5vZGUuZGF0YTsNCiAgICB2YXIgY2hpbGRyZW4gPSB2bm9kZS5jaGlsZHJlbjsNCiAgICB2YXIgdGFnID0gdm5vZGUudGFnOw0KICAgIGlmIChpc0RlZih0YWcpKSB7DQogICAgICB7DQogICAgICAgIGlmIChkYXRhICYmIGRhdGEucHJlKSB7DQogICAgICAgICAgaW5QcmUrKzsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoDQogICAgICAgICAgIWluUHJlICYmDQogICAgICAgICAgIXZub2RlLm5zICYmDQogICAgICAgICAgIShjb25maWcuaWdub3JlZEVsZW1lbnRzICYmIGNvbmZpZy5pZ25vcmVkRWxlbWVudHMuaW5kZXhPZih0YWcpID4gLTEpICYmDQogICAgICAgICAgY29uZmlnLmlzVW5rbm93bkVsZW1lbnQodGFnKQ0KICAgICAgICApIHsNCiAgICAgICAgICB3YXJuKA0KICAgICAgICAgICAgJ1Vua25vd24gY3VzdG9tIGVsZW1lbnQ6IDwnICsgdGFnICsgJz4gLSBkaWQgeW91ICcgKw0KICAgICAgICAgICAgJ3JlZ2lzdGVyIHRoZSBjb21wb25lbnQgY29ycmVjdGx5PyBGb3IgcmVjdXJzaXZlIGNvbXBvbmVudHMsICcgKw0KICAgICAgICAgICAgJ21ha2Ugc3VyZSB0byBwcm92aWRlIHRoZSAibmFtZSIgb3B0aW9uLicsDQogICAgICAgICAgICB2bm9kZS5jb250ZXh0DQogICAgICAgICAgKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgdm5vZGUuZWxtID0gdm5vZGUubnMNCiAgICAgICAgPyBub2RlT3BzLmNyZWF0ZUVsZW1lbnROUyh2bm9kZS5ucywgdGFnKQ0KICAgICAgICA6IG5vZGVPcHMuY3JlYXRlRWxlbWVudCh0YWcsIHZub2RlKTsNCiAgICAgIHNldFNjb3BlKHZub2RlKTsNCg0KICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovDQogICAgICB7DQogICAgICAgIGNyZWF0ZUNoaWxkcmVuKHZub2RlLCBjaGlsZHJlbiwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsNCiAgICAgICAgaWYgKGlzRGVmKGRhdGEpKSB7DQogICAgICAgICAgaW52b2tlQ3JlYXRlSG9va3Modm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7DQogICAgICAgIH0NCiAgICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pOw0KICAgICAgfQ0KDQogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGRhdGEgJiYgZGF0YS5wcmUpIHsNCiAgICAgICAgaW5QcmUtLTsNCiAgICAgIH0NCiAgICB9IGVsc2UgaWYgKHZub2RlLmlzQ29tbWVudCkgew0KICAgICAgdm5vZGUuZWxtID0gbm9kZU9wcy5jcmVhdGVDb21tZW50KHZub2RlLnRleHQpOw0KICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pOw0KICAgIH0gZWxzZSB7DQogICAgICB2bm9kZS5lbG0gPSBub2RlT3BzLmNyZWF0ZVRleHROb2RlKHZub2RlLnRleHQpOw0KICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudCAodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0pIHsNCiAgICB2YXIgaSA9IHZub2RlLmRhdGE7DQogICAgaWYgKGlzRGVmKGkpKSB7DQogICAgICB2YXIgaXNSZWFjdGl2YXRlZCA9IGlzRGVmKHZub2RlLmNoaWxkKSAmJiBpLmtlZXBBbGl2ZTsNCiAgICAgIGlmIChpc0RlZihpID0gaS5ob29rKSAmJiBpc0RlZihpID0gaS5pbml0KSkgew0KICAgICAgICBpKHZub2RlLCBmYWxzZSAvKiBoeWRyYXRpbmcgKi8sIHBhcmVudEVsbSwgcmVmRWxtKTsNCiAgICAgIH0NCiAgICAgIC8vIGFmdGVyIGNhbGxpbmcgdGhlIGluaXQgaG9vaywgaWYgdGhlIHZub2RlIGlzIGEgY2hpbGQgY29tcG9uZW50DQogICAgICAvLyBpdCBzaG91bGQndmUgY3JlYXRlZCBhIGNoaWxkIGluc3RhbmNlIGFuZCBtb3VudGVkIGl0LiB0aGUgY2hpbGQNCiAgICAgIC8vIGNvbXBvbmVudCBhbHNvIGhhcyBzZXQgdGhlIHBsYWNlaG9sZGVyIHZub2RlJ3MgZWxtLg0KICAgICAgLy8gaW4gdGhhdCBjYXNlIHdlIGNhbiBqdXN0IHJldHVybiB0aGUgZWxlbWVudCBhbmQgYmUgZG9uZS4NCiAgICAgIGlmIChpc0RlZih2bm9kZS5jaGlsZCkpIHsNCiAgICAgICAgaW5pdENvbXBvbmVudCh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsNCiAgICAgICAgaWYgKGlzUmVhY3RpdmF0ZWQpIHsNCiAgICAgICAgICByZWFjdGl2YXRlQ29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdHJ1ZQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIHJlYWN0aXZhdGVDb21wb25lbnQgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKSB7DQogICAgdmFyIGk7DQogICAgLy8gaGFjayBmb3IgIzQzMzk6IGEgcmVhY3RpdmF0ZWQgY29tcG9uZW50IHdpdGggaW5uZXIgdHJhbnNpdGlvbg0KICAgIC8vIGRvZXMgbm90IHRyaWdnZXIgYmVjYXVzZSB0aGUgaW5uZXIgbm9kZSdzIGNyZWF0ZWQgaG9va3MgYXJlIG5vdCBjYWxsZWQNCiAgICAvLyBhZ2Fpbi4gSXQncyBub3QgaWRlYWwgdG8gaW52b2x2ZSBtb2R1bGUtc3BlY2lmaWMgbG9naWMgaW4gaGVyZSBidXQNCiAgICAvLyB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSBiZXR0ZXIgd2F5IHRvIGRvIGl0Lg0KICAgIHZhciBpbm5lck5vZGUgPSB2bm9kZTsNCiAgICB3aGlsZSAoaW5uZXJOb2RlLmNoaWxkKSB7DQogICAgICBpbm5lck5vZGUgPSBpbm5lck5vZGUuY2hpbGQuX3Zub2RlOw0KICAgICAgaWYgKGlzRGVmKGkgPSBpbm5lck5vZGUuZGF0YSkgJiYgaXNEZWYoaSA9IGkudHJhbnNpdGlvbikpIHsNCiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNicy5hY3RpdmF0ZS5sZW5ndGg7ICsraSkgew0KICAgICAgICAgIGNicy5hY3RpdmF0ZVtpXShlbXB0eU5vZGUsIGlubmVyTm9kZSk7DQogICAgICAgIH0NCiAgICAgICAgaW5zZXJ0ZWRWbm9kZVF1ZXVlLnB1c2goaW5uZXJOb2RlKTsNCiAgICAgICAgYnJlYWsNCiAgICAgIH0NCiAgICB9DQogICAgLy8gdW5saWtlIGEgbmV3bHkgY3JlYXRlZCBjb21wb25lbnQsDQogICAgLy8gYSByZWFjdGl2YXRlZCBrZWVwLWFsaXZlIGNvbXBvbmVudCBkb2Vzbid0IGluc2VydCBpdHNlbGYNCiAgICBpbnNlcnQocGFyZW50RWxtLCB2bm9kZS5lbG0sIHJlZkVsbSk7DQogIH0NCg0KICBmdW5jdGlvbiBpbnNlcnQgKHBhcmVudCwgZWxtLCByZWYpIHsNCiAgICBpZiAocGFyZW50KSB7DQogICAgICBub2RlT3BzLmluc2VydEJlZm9yZShwYXJlbnQsIGVsbSwgcmVmKTsNCiAgICB9DQogIH0NCg0KICBmdW5jdGlvbiBjcmVhdGVDaGlsZHJlbiAodm5vZGUsIGNoaWxkcmVuLCBpbnNlcnRlZFZub2RlUXVldWUpIHsNCiAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHsNCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsNCiAgICAgICAgY3JlYXRlRWxtKGNoaWxkcmVuW2ldLCBpbnNlcnRlZFZub2RlUXVldWUsIHZub2RlLmVsbSwgbnVsbCwgdHJ1ZSk7DQogICAgICB9DQogICAgfSBlbHNlIGlmIChpc1ByaW1pdGl2ZSh2bm9kZS50ZXh0KSkgew0KICAgICAgbm9kZU9wcy5hcHBlbmRDaGlsZCh2bm9kZS5lbG0sIG5vZGVPcHMuY3JlYXRlVGV4dE5vZGUodm5vZGUudGV4dCkpOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIGlzUGF0Y2hhYmxlICh2bm9kZSkgew0KICAgIHdoaWxlICh2bm9kZS5jaGlsZCkgew0KICAgICAgdm5vZGUgPSB2bm9kZS5jaGlsZC5fdm5vZGU7DQogICAgfQ0KICAgIHJldHVybiBpc0RlZih2bm9kZS50YWcpDQogIH0NCg0KICBmdW5jdGlvbiBpbnZva2VDcmVhdGVIb29rcyAodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSkgew0KICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNicy5jcmVhdGUubGVuZ3RoOyArK2kkMSkgew0KICAgICAgY2JzLmNyZWF0ZVtpJDFdKGVtcHR5Tm9kZSwgdm5vZGUpOw0KICAgIH0NCiAgICBpID0gdm5vZGUuZGF0YS5ob29rOyAvLyBSZXVzZSB2YXJpYWJsZQ0KICAgIGlmIChpc0RlZihpKSkgew0KICAgICAgaWYgKGkuY3JlYXRlKSB7IGkuY3JlYXRlKGVtcHR5Tm9kZSwgdm5vZGUpOyB9DQogICAgICBpZiAoaS5pbnNlcnQpIHsgaW5zZXJ0ZWRWbm9kZVF1ZXVlLnB1c2godm5vZGUpOyB9DQogICAgfQ0KICB9DQoNCiAgZnVuY3Rpb24gaW5pdENvbXBvbmVudCAodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSkgew0KICAgIGlmICh2bm9kZS5kYXRhLnBlbmRpbmdJbnNlcnQpIHsNCiAgICAgIGluc2VydGVkVm5vZGVRdWV1ZS5wdXNoLmFwcGx5KGluc2VydGVkVm5vZGVRdWV1ZSwgdm5vZGUuZGF0YS5wZW5kaW5nSW5zZXJ0KTsNCiAgICB9DQogICAgdm5vZGUuZWxtID0gdm5vZGUuY2hpbGQuJGVsOw0KICAgIGlmIChpc1BhdGNoYWJsZSh2bm9kZSkpIHsNCiAgICAgIGludm9rZUNyZWF0ZUhvb2tzKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOw0KICAgICAgc2V0U2NvcGUodm5vZGUpOw0KICAgIH0gZWxzZSB7DQogICAgICAvLyBlbXB0eSBjb21wb25lbnQgcm9vdC4NCiAgICAgIC8vIHNraXAgYWxsIGVsZW1lbnQtcmVsYXRlZCBtb2R1bGVzIGV4Y2VwdCBmb3IgcmVmICgjMzQ1NSkNCiAgICAgIHJlZ2lzdGVyUmVmKHZub2RlKTsNCiAgICAgIC8vIG1ha2Ugc3VyZSB0byBpbnZva2UgdGhlIGluc2VydCBob29rDQogICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaCh2bm9kZSk7DQogICAgfQ0KICB9DQoNCiAgLy8gc2V0IHNjb3BlIGlkIGF0dHJpYnV0ZSBmb3Igc2NvcGVkIENTUy4NCiAgLy8gdGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhIHNwZWNpYWwgY2FzZSB0byBhdm9pZCB0aGUgb3ZlcmhlYWQNCiAgLy8gb2YgZ29pbmcgdGhyb3VnaCB0aGUgbm9ybWFsIGF0dHJpYnV0ZSBwYXRjaGluZyBwcm9jZXNzLg0KICBmdW5jdGlvbiBzZXRTY29wZSAodm5vZGUpIHsNCiAgICB2YXIgaTsNCiAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNvbnRleHQpICYmIGlzRGVmKGkgPSBpLiRvcHRpb25zLl9zY29wZUlkKSkgew0KICAgICAgbm9kZU9wcy5zZXRBdHRyaWJ1dGUodm5vZGUuZWxtLCBpLCAnJyk7DQogICAgfQ0KICAgIGlmIChpc0RlZihpID0gYWN0aXZlSW5zdGFuY2UpICYmDQogICAgICAgIGkgIT09IHZub2RlLmNvbnRleHQgJiYNCiAgICAgICAgaXNEZWYoaSA9IGkuJG9wdGlvbnMuX3Njb3BlSWQpKSB7DQogICAgICBub2RlT3BzLnNldEF0dHJpYnV0ZSh2bm9kZS5lbG0sIGksICcnKTsNCiAgICB9DQogIH0NCg0KICBmdW5jdGlvbiBhZGRWbm9kZXMgKHBhcmVudEVsbSwgcmVmRWxtLCB2bm9kZXMsIHN0YXJ0SWR4LCBlbmRJZHgsIGluc2VydGVkVm5vZGVRdWV1ZSkgew0KICAgIGZvciAoOyBzdGFydElkeCA8PSBlbmRJZHg7ICsrc3RhcnRJZHgpIHsNCiAgICAgIGNyZWF0ZUVsbSh2bm9kZXNbc3RhcnRJZHhdLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKTsNCiAgICB9DQogIH0NCg0KICBmdW5jdGlvbiBpbnZva2VEZXN0cm95SG9vayAodm5vZGUpIHsNCiAgICB2YXIgaSwgajsNCiAgICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7DQogICAgaWYgKGlzRGVmKGRhdGEpKSB7DQogICAgICBpZiAoaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkuZGVzdHJveSkpIHsgaSh2bm9kZSk7IH0NCiAgICAgIGZvciAoaSA9IDA7IGkgPCBjYnMuZGVzdHJveS5sZW5ndGg7ICsraSkgeyBjYnMuZGVzdHJveVtpXSh2bm9kZSk7IH0NCiAgICB9DQogICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5jaGlsZHJlbikpIHsNCiAgICAgIGZvciAoaiA9IDA7IGogPCB2bm9kZS5jaGlsZHJlbi5sZW5ndGg7ICsraikgew0KICAgICAgICBpbnZva2VEZXN0cm95SG9vayh2bm9kZS5jaGlsZHJlbltqXSk7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgZnVuY3Rpb24gcmVtb3ZlVm5vZGVzIChwYXJlbnRFbG0sIHZub2Rlcywgc3RhcnRJZHgsIGVuZElkeCkgew0KICAgIGZvciAoOyBzdGFydElkeCA8PSBlbmRJZHg7ICsrc3RhcnRJZHgpIHsNCiAgICAgIHZhciBjaCA9IHZub2Rlc1tzdGFydElkeF07DQogICAgICBpZiAoaXNEZWYoY2gpKSB7DQogICAgICAgIGlmIChpc0RlZihjaC50YWcpKSB7DQogICAgICAgICAgcmVtb3ZlQW5kSW52b2tlUmVtb3ZlSG9vayhjaCk7DQogICAgICAgICAgaW52b2tlRGVzdHJveUhvb2soY2gpOw0KICAgICAgICB9IGVsc2UgeyAvLyBUZXh0IG5vZGUNCiAgICAgICAgICBub2RlT3BzLnJlbW92ZUNoaWxkKHBhcmVudEVsbSwgY2guZWxtKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIHJlbW92ZUFuZEludm9rZVJlbW92ZUhvb2sgKHZub2RlLCBybSkgew0KICAgIGlmIChybSB8fCBpc0RlZih2bm9kZS5kYXRhKSkgew0KICAgICAgdmFyIGxpc3RlbmVycyA9IGNicy5yZW1vdmUubGVuZ3RoICsgMTsNCiAgICAgIGlmICghcm0pIHsNCiAgICAgICAgLy8gZGlyZWN0bHkgcmVtb3ZpbmcNCiAgICAgICAgcm0gPSBjcmVhdGVSbUNiKHZub2RlLmVsbSwgbGlzdGVuZXJzKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIC8vIHdlIGhhdmUgYSByZWN1cnNpdmVseSBwYXNzZWQgZG93biBybSBjYWxsYmFjaw0KICAgICAgICAvLyBpbmNyZWFzZSB0aGUgbGlzdGVuZXJzIGNvdW50DQogICAgICAgIHJtLmxpc3RlbmVycyArPSBsaXN0ZW5lcnM7DQogICAgICB9DQogICAgICAvLyByZWN1cnNpdmVseSBpbnZva2UgaG9va3Mgb24gY2hpbGQgY29tcG9uZW50IHJvb3Qgbm9kZQ0KICAgICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5jaGlsZCkgJiYgaXNEZWYoaSA9IGkuX3Zub2RlKSAmJiBpc0RlZihpLmRhdGEpKSB7DQogICAgICAgIHJlbW92ZUFuZEludm9rZVJlbW92ZUhvb2soaSwgcm0pOw0KICAgICAgfQ0KICAgICAgZm9yIChpID0gMDsgaSA8IGNicy5yZW1vdmUubGVuZ3RoOyArK2kpIHsNCiAgICAgICAgY2JzLnJlbW92ZVtpXSh2bm9kZSwgcm0pOw0KICAgICAgfQ0KICAgICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5kYXRhLmhvb2spICYmIGlzRGVmKGkgPSBpLnJlbW92ZSkpIHsNCiAgICAgICAgaSh2bm9kZSwgcm0pOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgcm0oKTsNCiAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgcmVtb3ZlRWxlbWVudCh2bm9kZS5lbG0pOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIHVwZGF0ZUNoaWxkcmVuIChwYXJlbnRFbG0sIG9sZENoLCBuZXdDaCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KSB7DQogICAgdmFyIG9sZFN0YXJ0SWR4ID0gMDsNCiAgICB2YXIgbmV3U3RhcnRJZHggPSAwOw0KICAgIHZhciBvbGRFbmRJZHggPSBvbGRDaC5sZW5ndGggLSAxOw0KICAgIHZhciBvbGRTdGFydFZub2RlID0gb2xkQ2hbMF07DQogICAgdmFyIG9sZEVuZFZub2RlID0gb2xkQ2hbb2xkRW5kSWR4XTsNCiAgICB2YXIgbmV3RW5kSWR4ID0gbmV3Q2gubGVuZ3RoIC0gMTsNCiAgICB2YXIgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWzBdOw0KICAgIHZhciBuZXdFbmRWbm9kZSA9IG5ld0NoW25ld0VuZElkeF07DQogICAgdmFyIG9sZEtleVRvSWR4LCBpZHhJbk9sZCwgZWxtVG9Nb3ZlLCByZWZFbG07DQoNCiAgICAvLyByZW1vdmVPbmx5IGlzIGEgc3BlY2lhbCBmbGFnIHVzZWQgb25seSBieSA8dHJhbnNpdGlvbi1ncm91cD4NCiAgICAvLyB0byBlbnN1cmUgcmVtb3ZlZCBlbGVtZW50cyBzdGF5IGluIGNvcnJlY3QgcmVsYXRpdmUgcG9zaXRpb25zDQogICAgLy8gZHVyaW5nIGxlYXZpbmcgdHJhbnNpdGlvbnMNCiAgICB2YXIgY2FuTW92ZSA9ICFyZW1vdmVPbmx5Ow0KDQogICAgd2hpbGUgKG9sZFN0YXJ0SWR4IDw9IG9sZEVuZElkeCAmJiBuZXdTdGFydElkeCA8PSBuZXdFbmRJZHgpIHsNCiAgICAgIGlmIChpc1VuZGVmKG9sZFN0YXJ0Vm5vZGUpKSB7DQogICAgICAgIG9sZFN0YXJ0Vm5vZGUgPSBvbGRDaFsrK29sZFN0YXJ0SWR4XTsgLy8gVm5vZGUgaGFzIGJlZW4gbW92ZWQgbGVmdA0KICAgICAgfSBlbHNlIGlmIChpc1VuZGVmKG9sZEVuZFZub2RlKSkgew0KICAgICAgICBvbGRFbmRWbm9kZSA9IG9sZENoWy0tb2xkRW5kSWR4XTsNCiAgICAgIH0gZWxzZSBpZiAoc2FtZVZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld1N0YXJ0Vm5vZGUpKSB7DQogICAgICAgIHBhdGNoVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsNCiAgICAgICAgb2xkU3RhcnRWbm9kZSA9IG9sZENoWysrb2xkU3RhcnRJZHhdOw0KICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07DQogICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRFbmRWbm9kZSwgbmV3RW5kVm5vZGUpKSB7DQogICAgICAgIHBhdGNoVm5vZGUob2xkRW5kVm5vZGUsIG5ld0VuZFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOw0KICAgICAgICBvbGRFbmRWbm9kZSA9IG9sZENoWy0tb2xkRW5kSWR4XTsNCiAgICAgICAgbmV3RW5kVm5vZGUgPSBuZXdDaFstLW5ld0VuZElkeF07DQogICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRTdGFydFZub2RlLCBuZXdFbmRWbm9kZSkpIHsgLy8gVm5vZGUgbW92ZWQgcmlnaHQNCiAgICAgICAgcGF0Y2hWbm9kZShvbGRTdGFydFZub2RlLCBuZXdFbmRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsNCiAgICAgICAgY2FuTW92ZSAmJiBub2RlT3BzLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtLCBub2RlT3BzLm5leHRTaWJsaW5nKG9sZEVuZFZub2RlLmVsbSkpOw0KICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07DQogICAgICAgIG5ld0VuZFZub2RlID0gbmV3Q2hbLS1uZXdFbmRJZHhdOw0KICAgICAgfSBlbHNlIGlmIChzYW1lVm5vZGUob2xkRW5kVm5vZGUsIG5ld1N0YXJ0Vm5vZGUpKSB7IC8vIFZub2RlIG1vdmVkIGxlZnQNCiAgICAgICAgcGF0Y2hWbm9kZShvbGRFbmRWbm9kZSwgbmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsNCiAgICAgICAgY2FuTW92ZSAmJiBub2RlT3BzLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZEVuZFZub2RlLmVsbSwgb2xkU3RhcnRWbm9kZS5lbG0pOw0KICAgICAgICBvbGRFbmRWbm9kZSA9IG9sZENoWy0tb2xkRW5kSWR4XTsNCiAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgaWYgKGlzVW5kZWYob2xkS2V5VG9JZHgpKSB7IG9sZEtleVRvSWR4ID0gY3JlYXRlS2V5VG9PbGRJZHgob2xkQ2gsIG9sZFN0YXJ0SWR4LCBvbGRFbmRJZHgpOyB9DQogICAgICAgIGlkeEluT2xkID0gaXNEZWYobmV3U3RhcnRWbm9kZS5rZXkpID8gb2xkS2V5VG9JZHhbbmV3U3RhcnRWbm9kZS5rZXldIDogbnVsbDsNCiAgICAgICAgaWYgKGlzVW5kZWYoaWR4SW5PbGQpKSB7IC8vIE5ldyBlbGVtZW50DQogICAgICAgICAgY3JlYXRlRWxtKG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCBvbGRTdGFydFZub2RlLmVsbSk7DQogICAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIGVsbVRvTW92ZSA9IG9sZENoW2lkeEluT2xkXTsNCiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8NCiAgICAgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmICFlbG1Ub01vdmUpIHsNCiAgICAgICAgICAgIHdhcm4oDQogICAgICAgICAgICAgICdJdCBzZWVtcyB0aGVyZSBhcmUgZHVwbGljYXRlIGtleXMgdGhhdCBpcyBjYXVzaW5nIGFuIHVwZGF0ZSBlcnJvci4gJyArDQogICAgICAgICAgICAgICdNYWtlIHN1cmUgZWFjaCB2LWZvciBpdGVtIGhhcyBhIHVuaXF1ZSBrZXkuJw0KICAgICAgICAgICAgKTsNCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKGVsbVRvTW92ZS50YWcgIT09IG5ld1N0YXJ0Vm5vZGUudGFnKSB7DQogICAgICAgICAgICAvLyBzYW1lIGtleSBidXQgZGlmZmVyZW50IGVsZW1lbnQuIHRyZWF0IGFzIG5ldyBlbGVtZW50DQogICAgICAgICAgICBjcmVhdGVFbG0obmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTsNCiAgICAgICAgICAgIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcGF0Y2hWbm9kZShlbG1Ub01vdmUsIG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7DQogICAgICAgICAgICBvbGRDaFtpZHhJbk9sZF0gPSB1bmRlZmluZWQ7DQogICAgICAgICAgICBjYW5Nb3ZlICYmIG5vZGVPcHMuaW5zZXJ0QmVmb3JlKHBhcmVudEVsbSwgbmV3U3RhcnRWbm9kZS5lbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTsNCiAgICAgICAgICAgIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogICAgaWYgKG9sZFN0YXJ0SWR4ID4gb2xkRW5kSWR4KSB7DQogICAgICByZWZFbG0gPSBpc1VuZGVmKG5ld0NoW25ld0VuZElkeCArIDFdKSA/IG51bGwgOiBuZXdDaFtuZXdFbmRJZHggKyAxXS5lbG07DQogICAgICBhZGRWbm9kZXMocGFyZW50RWxtLCByZWZFbG0sIG5ld0NoLCBuZXdTdGFydElkeCwgbmV3RW5kSWR4LCBpbnNlcnRlZFZub2RlUXVldWUpOw0KICAgIH0gZWxzZSBpZiAobmV3U3RhcnRJZHggPiBuZXdFbmRJZHgpIHsNCiAgICAgIHJlbW92ZVZub2RlcyhwYXJlbnRFbG0sIG9sZENoLCBvbGRTdGFydElkeCwgb2xkRW5kSWR4KTsNCiAgICB9DQogIH0NCg0KICBmdW5jdGlvbiBwYXRjaFZub2RlIChvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcmVtb3ZlT25seSkgew0KICAgIGlmIChvbGRWbm9kZSA9PT0gdm5vZGUpIHsNCiAgICAgIHJldHVybg0KICAgIH0NCiAgICAvLyByZXVzZSBlbGVtZW50IGZvciBzdGF0aWMgdHJlZXMuDQogICAgLy8gbm90ZSB3ZSBvbmx5IGRvIHRoaXMgaWYgdGhlIHZub2RlIGlzIGNsb25lZCAtDQogICAgLy8gaWYgdGhlIG5ldyBub2RlIGlzIG5vdCBjbG9uZWQgaXQgbWVhbnMgdGhlIHJlbmRlciBmdW5jdGlvbnMgaGF2ZSBiZWVuDQogICAgLy8gcmVzZXQgYnkgdGhlIGhvdC1yZWxvYWQtYXBpIGFuZCB3ZSBuZWVkIHRvIGRvIGEgcHJvcGVyIHJlLXJlbmRlci4NCiAgICBpZiAodm5vZGUuaXNTdGF0aWMgJiYNCiAgICAgICAgb2xkVm5vZGUuaXNTdGF0aWMgJiYNCiAgICAgICAgdm5vZGUua2V5ID09PSBvbGRWbm9kZS5rZXkgJiYNCiAgICAgICAgKHZub2RlLmlzQ2xvbmVkIHx8IHZub2RlLmlzT25jZSkpIHsNCiAgICAgIHZub2RlLmVsbSA9IG9sZFZub2RlLmVsbTsNCiAgICAgIHZub2RlLmNoaWxkID0gb2xkVm5vZGUuY2hpbGQ7DQogICAgICByZXR1cm4NCiAgICB9DQogICAgdmFyIGk7DQogICAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhOw0KICAgIHZhciBoYXNEYXRhID0gaXNEZWYoZGF0YSk7DQogICAgaWYgKGhhc0RhdGEgJiYgaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkucHJlcGF0Y2gpKSB7DQogICAgICBpKG9sZFZub2RlLCB2bm9kZSk7DQogICAgfQ0KICAgIHZhciBlbG0gPSB2bm9kZS5lbG0gPSBvbGRWbm9kZS5lbG07DQogICAgdmFyIG9sZENoID0gb2xkVm5vZGUuY2hpbGRyZW47DQogICAgdmFyIGNoID0gdm5vZGUuY2hpbGRyZW47DQogICAgaWYgKGhhc0RhdGEgJiYgaXNQYXRjaGFibGUodm5vZGUpKSB7DQogICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLnVwZGF0ZS5sZW5ndGg7ICsraSkgeyBjYnMudXBkYXRlW2ldKG9sZFZub2RlLCB2bm9kZSk7IH0NCiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS51cGRhdGUpKSB7IGkob2xkVm5vZGUsIHZub2RlKTsgfQ0KICAgIH0NCiAgICBpZiAoaXNVbmRlZih2bm9kZS50ZXh0KSkgew0KICAgICAgaWYgKGlzRGVmKG9sZENoKSAmJiBpc0RlZihjaCkpIHsNCiAgICAgICAgaWYgKG9sZENoICE9PSBjaCkgeyB1cGRhdGVDaGlsZHJlbihlbG0sIG9sZENoLCBjaCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KTsgfQ0KICAgICAgfSBlbHNlIGlmIChpc0RlZihjaCkpIHsNCiAgICAgICAgaWYgKGlzRGVmKG9sZFZub2RlLnRleHQpKSB7IG5vZGVPcHMuc2V0VGV4dENvbnRlbnQoZWxtLCAnJyk7IH0NCiAgICAgICAgYWRkVm5vZGVzKGVsbSwgbnVsbCwgY2gsIDAsIGNoLmxlbmd0aCAtIDEsIGluc2VydGVkVm5vZGVRdWV1ZSk7DQogICAgICB9IGVsc2UgaWYgKGlzRGVmKG9sZENoKSkgew0KICAgICAgICByZW1vdmVWbm9kZXMoZWxtLCBvbGRDaCwgMCwgb2xkQ2gubGVuZ3RoIC0gMSk7DQogICAgICB9IGVsc2UgaWYgKGlzRGVmKG9sZFZub2RlLnRleHQpKSB7DQogICAgICAgIG5vZGVPcHMuc2V0VGV4dENvbnRlbnQoZWxtLCAnJyk7DQogICAgICB9DQogICAgfSBlbHNlIGlmIChvbGRWbm9kZS50ZXh0ICE9PSB2bm9kZS50ZXh0KSB7DQogICAgICBub2RlT3BzLnNldFRleHRDb250ZW50KGVsbSwgdm5vZGUudGV4dCk7DQogICAgfQ0KICAgIGlmIChoYXNEYXRhKSB7DQogICAgICBpZiAoaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkucG9zdHBhdGNoKSkgeyBpKG9sZFZub2RlLCB2bm9kZSk7IH0NCiAgICB9DQogIH0NCg0KICBmdW5jdGlvbiBpbnZva2VJbnNlcnRIb29rICh2bm9kZSwgcXVldWUsIGluaXRpYWwpIHsNCiAgICAvLyBkZWxheSBpbnNlcnQgaG9va3MgZm9yIGNvbXBvbmVudCByb290IG5vZGVzLCBpbnZva2UgdGhlbSBhZnRlciB0aGUNCiAgICAvLyBlbGVtZW50IGlzIHJlYWxseSBpbnNlcnRlZA0KICAgIGlmIChpbml0aWFsICYmIHZub2RlLnBhcmVudCkgew0KICAgICAgdm5vZGUucGFyZW50LmRhdGEucGVuZGluZ0luc2VydCA9IHF1ZXVlOw0KICAgIH0gZWxzZSB7DQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgKytpKSB7DQogICAgICAgIHF1ZXVlW2ldLmRhdGEuaG9vay5pbnNlcnQocXVldWVbaV0pOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIHZhciBiYWlsZWQgPSBmYWxzZTsNCiAgZnVuY3Rpb24gaHlkcmF0ZSAoZWxtLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7DQogICAgew0KICAgICAgaWYgKCFhc3NlcnROb2RlTWF0Y2goZWxtLCB2bm9kZSkpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlDQogICAgICB9DQogICAgfQ0KICAgIHZub2RlLmVsbSA9IGVsbTsNCiAgICB2YXIgdGFnID0gdm5vZGUudGFnOw0KICAgIHZhciBkYXRhID0gdm5vZGUuZGF0YTsNCiAgICB2YXIgY2hpbGRyZW4gPSB2bm9kZS5jaGlsZHJlbjsNCiAgICBpZiAoaXNEZWYoZGF0YSkpIHsNCiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5pbml0KSkgeyBpKHZub2RlLCB0cnVlIC8qIGh5ZHJhdGluZyAqLyk7IH0NCiAgICAgIGlmIChpc0RlZihpID0gdm5vZGUuY2hpbGQpKSB7DQogICAgICAgIC8vIGNoaWxkIGNvbXBvbmVudC4gaXQgc2hvdWxkIGhhdmUgaHlkcmF0ZWQgaXRzIG93biB0cmVlLg0KICAgICAgICBpbml0Q29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOw0KICAgICAgICByZXR1cm4gdHJ1ZQ0KICAgICAgfQ0KICAgIH0NCiAgICBpZiAoaXNEZWYodGFnKSkgew0KICAgICAgaWYgKGlzRGVmKGNoaWxkcmVuKSkgew0KICAgICAgICB2YXIgY2hpbGROb2RlcyA9IG5vZGVPcHMuY2hpbGROb2RlcyhlbG0pOw0KICAgICAgICAvLyBlbXB0eSBlbGVtZW50LCBhbGxvdyBjbGllbnQgdG8gcGljayB1cCBhbmQgcG9wdWxhdGUgY2hpbGRyZW4NCiAgICAgICAgaWYgKCFjaGlsZE5vZGVzLmxlbmd0aCkgew0KICAgICAgICAgIGNyZWF0ZUNoaWxkcmVuKHZub2RlLCBjaGlsZHJlbiwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICB2YXIgY2hpbGRyZW5NYXRjaCA9IHRydWU7DQogICAgICAgICAgaWYgKGNoaWxkTm9kZXMubGVuZ3RoICE9PSBjaGlsZHJlbi5sZW5ndGgpIHsNCiAgICAgICAgICAgIGNoaWxkcmVuTWF0Y2ggPSBmYWxzZTsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgY2hpbGRyZW4ubGVuZ3RoOyBpJDErKykgew0KICAgICAgICAgICAgICBpZiAoIWh5ZHJhdGUoY2hpbGROb2Rlc1tpJDFdLCBjaGlsZHJlbltpJDFdLCBpbnNlcnRlZFZub2RlUXVldWUpKSB7DQogICAgICAgICAgICAgICAgY2hpbGRyZW5NYXRjaCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKCFjaGlsZHJlbk1hdGNoKSB7DQogICAgICAgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmDQogICAgICAgICAgICAgICAgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmDQogICAgICAgICAgICAgICAgIWJhaWxlZCkgew0KICAgICAgICAgICAgICBiYWlsZWQgPSB0cnVlOw0KICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1BhcmVudDogJywgZWxtKTsNCiAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdNaXNtYXRjaGluZyBjaGlsZE5vZGVzIHZzLiBWTm9kZXM6ICcsIGNoaWxkTm9kZXMsIGNoaWxkcmVuKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBmYWxzZQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYgKGlzRGVmKGRhdGEpKSB7DQogICAgICAgIGludm9rZUNyZWF0ZUhvb2tzKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOw0KICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gdHJ1ZQ0KICB9DQoNCiAgZnVuY3Rpb24gYXNzZXJ0Tm9kZU1hdGNoIChub2RlLCB2bm9kZSkgew0KICAgIGlmICh2bm9kZS50YWcpIHsNCiAgICAgIHJldHVybiAoDQogICAgICAgIHZub2RlLnRhZy5pbmRleE9mKCd2dWUtY29tcG9uZW50JykgPT09IDAgfHwNCiAgICAgICAgdm5vZGUudGFnLnRvTG93ZXJDYXNlKCkgPT09IG5vZGVPcHMudGFnTmFtZShub2RlKS50b0xvd2VyQ2FzZSgpDQogICAgICApDQogICAgfSBlbHNlIHsNCiAgICAgIHJldHVybiBfdG9TdHJpbmcodm5vZGUudGV4dCkgPT09IG5vZGUuZGF0YQ0KICAgIH0NCiAgfQ0KDQogIHJldHVybiBmdW5jdGlvbiBwYXRjaCAob2xkVm5vZGUsIHZub2RlLCBoeWRyYXRpbmcsIHJlbW92ZU9ubHksIHBhcmVudEVsbSwgcmVmRWxtKSB7DQogICAgaWYgKCF2bm9kZSkgew0KICAgICAgaWYgKG9sZFZub2RlKSB7IGludm9rZURlc3Ryb3lIb29rKG9sZFZub2RlKTsgfQ0KICAgICAgcmV0dXJuDQogICAgfQ0KDQogICAgdmFyIGVsbSwgcGFyZW50Ow0KICAgIHZhciBpc0luaXRpYWxQYXRjaCA9IGZhbHNlOw0KICAgIHZhciBpbnNlcnRlZFZub2RlUXVldWUgPSBbXTsNCg0KICAgIGlmICghb2xkVm5vZGUpIHsNCiAgICAgIC8vIGVtcHR5IG1vdW50IChsaWtlbHkgYXMgY29tcG9uZW50KSwgY3JlYXRlIG5ldyByb290IGVsZW1lbnQNCiAgICAgIGlzSW5pdGlhbFBhdGNoID0gdHJ1ZTsNCiAgICAgIGNyZWF0ZUVsbSh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIHJlZkVsbSk7DQogICAgfSBlbHNlIHsNCiAgICAgIHZhciBpc1JlYWxFbGVtZW50ID0gaXNEZWYob2xkVm5vZGUubm9kZVR5cGUpOw0KICAgICAgaWYgKCFpc1JlYWxFbGVtZW50ICYmIHNhbWVWbm9kZShvbGRWbm9kZSwgdm5vZGUpKSB7DQogICAgICAgIC8vIHBhdGNoIGV4aXN0aW5nIHJvb3Qgbm9kZQ0KICAgICAgICBwYXRjaFZub2RlKG9sZFZub2RlLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGlmIChpc1JlYWxFbGVtZW50KSB7DQogICAgICAgICAgLy8gbW91bnRpbmcgdG8gYSByZWFsIGVsZW1lbnQNCiAgICAgICAgICAvLyBjaGVjayBpZiB0aGlzIGlzIHNlcnZlci1yZW5kZXJlZCBjb250ZW50IGFuZCBpZiB3ZSBjYW4gcGVyZm9ybQ0KICAgICAgICAgIC8vIGEgc3VjY2Vzc2Z1bCBoeWRyYXRpb24uDQogICAgICAgICAgaWYgKG9sZFZub2RlLm5vZGVUeXBlID09PSAxICYmIG9sZFZub2RlLmhhc0F0dHJpYnV0ZSgnc2VydmVyLXJlbmRlcmVkJykpIHsNCiAgICAgICAgICAgIG9sZFZub2RlLnJlbW92ZUF0dHJpYnV0ZSgnc2VydmVyLXJlbmRlcmVkJyk7DQogICAgICAgICAgICBoeWRyYXRpbmcgPSB0cnVlOw0KICAgICAgICAgIH0NCiAgICAgICAgICBpZiAoaHlkcmF0aW5nKSB7DQogICAgICAgICAgICBpZiAoaHlkcmF0ZShvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSkpIHsNCiAgICAgICAgICAgICAgaW52b2tlSW5zZXJ0SG9vayh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCB0cnVlKTsNCiAgICAgICAgICAgICAgcmV0dXJuIG9sZFZub2RlDQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICB3YXJuKA0KICAgICAgICAgICAgICAgICdUaGUgY2xpZW50LXNpZGUgcmVuZGVyZWQgdmlydHVhbCBET00gdHJlZSBpcyBub3QgbWF0Y2hpbmcgJyArDQogICAgICAgICAgICAgICAgJ3NlcnZlci1yZW5kZXJlZCBjb250ZW50LiBUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgaW5jb3JyZWN0ICcgKw0KICAgICAgICAgICAgICAgICdIVE1MIG1hcmt1cCwgZm9yIGV4YW1wbGUgbmVzdGluZyBibG9jay1sZXZlbCBlbGVtZW50cyBpbnNpZGUgJyArDQogICAgICAgICAgICAgICAgJzxwPiwgb3IgbWlzc2luZyA8dGJvZHk+LiBCYWlsaW5nIGh5ZHJhdGlvbiBhbmQgcGVyZm9ybWluZyAnICsNCiAgICAgICAgICAgICAgICAnZnVsbCBjbGllbnQtc2lkZSByZW5kZXIuJw0KICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgICAvLyBlaXRoZXIgbm90IHNlcnZlci1yZW5kZXJlZCwgb3IgaHlkcmF0aW9uIGZhaWxlZC4NCiAgICAgICAgICAvLyBjcmVhdGUgYW4gZW1wdHkgbm9kZSBhbmQgcmVwbGFjZSBpdA0KICAgICAgICAgIG9sZFZub2RlID0gZW1wdHlOb2RlQXQob2xkVm5vZGUpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gcmVwbGFjaW5nIGV4aXN0aW5nIGVsZW1lbnQNCiAgICAgICAgZWxtID0gb2xkVm5vZGUuZWxtOw0KICAgICAgICBwYXJlbnQgPSBub2RlT3BzLnBhcmVudE5vZGUoZWxtKTsNCiAgICAgICAgY3JlYXRlRWxtKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudCwgbm9kZU9wcy5uZXh0U2libGluZyhlbG0pKTsNCg0KICAgICAgICBpZiAodm5vZGUucGFyZW50KSB7DQogICAgICAgICAgLy8gY29tcG9uZW50IHJvb3QgZWxlbWVudCByZXBsYWNlZC4NCiAgICAgICAgICAvLyB1cGRhdGUgcGFyZW50IHBsYWNlaG9sZGVyIG5vZGUgZWxlbWVudCwgcmVjdXJzaXZlbHkNCiAgICAgICAgICB2YXIgYW5jZXN0b3IgPSB2bm9kZS5wYXJlbnQ7DQogICAgICAgICAgd2hpbGUgKGFuY2VzdG9yKSB7DQogICAgICAgICAgICBhbmNlc3Rvci5lbG0gPSB2bm9kZS5lbG07DQogICAgICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudDsNCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKGlzUGF0Y2hhYmxlKHZub2RlKSkgew0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYnMuY3JlYXRlLmxlbmd0aDsgKytpKSB7DQogICAgICAgICAgICAgIGNicy5jcmVhdGVbaV0oZW1wdHlOb2RlLCB2bm9kZS5wYXJlbnQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChwYXJlbnQgIT09IG51bGwpIHsNCiAgICAgICAgICByZW1vdmVWbm9kZXMocGFyZW50LCBbb2xkVm5vZGVdLCAwLCAwKTsNCiAgICAgICAgfSBlbHNlIGlmIChpc0RlZihvbGRWbm9kZS50YWcpKSB7DQogICAgICAgICAgaW52b2tlRGVzdHJveUhvb2sob2xkVm5vZGUpOw0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KDQogICAgaW52b2tlSW5zZXJ0SG9vayh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBpc0luaXRpYWxQYXRjaCk7DQogICAgcmV0dXJuIHZub2RlLmVsbQ0KICB9DQp9DQoNCi8qICAqLw0KDQp2YXIgZGlyZWN0aXZlcyA9IHsNCiAgY3JlYXRlOiB1cGRhdGVEaXJlY3RpdmVzLA0KICB1cGRhdGU6IHVwZGF0ZURpcmVjdGl2ZXMsDQogIGRlc3Ryb3k6IGZ1bmN0aW9uIHVuYmluZERpcmVjdGl2ZXMgKHZub2RlKSB7DQogICAgdXBkYXRlRGlyZWN0aXZlcyh2bm9kZSwgZW1wdHlOb2RlKTsNCiAgfQ0KfTsNCg0KZnVuY3Rpb24gdXBkYXRlRGlyZWN0aXZlcyAoDQogIG9sZFZub2RlLA0KICB2bm9kZQ0KKSB7DQogIGlmICghb2xkVm5vZGUuZGF0YS5kaXJlY3RpdmVzICYmICF2bm9kZS5kYXRhLmRpcmVjdGl2ZXMpIHsNCiAgICByZXR1cm4NCiAgfQ0KICB2YXIgaXNDcmVhdGUgPSBvbGRWbm9kZSA9PT0gZW1wdHlOb2RlOw0KICB2YXIgb2xkRGlycyA9IG5vcm1hbGl6ZURpcmVjdGl2ZXMkMShvbGRWbm9kZS5kYXRhLmRpcmVjdGl2ZXMsIG9sZFZub2RlLmNvbnRleHQpOw0KICB2YXIgbmV3RGlycyA9IG5vcm1hbGl6ZURpcmVjdGl2ZXMkMSh2bm9kZS5kYXRhLmRpcmVjdGl2ZXMsIHZub2RlLmNvbnRleHQpOw0KDQogIHZhciBkaXJzV2l0aEluc2VydCA9IFtdOw0KICB2YXIgZGlyc1dpdGhQb3N0cGF0Y2ggPSBbXTsNCg0KICB2YXIga2V5LCBvbGREaXIsIGRpcjsNCiAgZm9yIChrZXkgaW4gbmV3RGlycykgew0KICAgIG9sZERpciA9IG9sZERpcnNba2V5XTsNCiAgICBkaXIgPSBuZXdEaXJzW2tleV07DQogICAgaWYgKCFvbGREaXIpIHsNCiAgICAgIC8vIG5ldyBkaXJlY3RpdmUsIGJpbmQNCiAgICAgIGNhbGxIb29rJDEoZGlyLCAnYmluZCcsIHZub2RlLCBvbGRWbm9kZSk7DQogICAgICBpZiAoZGlyLmRlZiAmJiBkaXIuZGVmLmluc2VydGVkKSB7DQogICAgICAgIGRpcnNXaXRoSW5zZXJ0LnB1c2goZGlyKTsNCiAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgLy8gZXhpc3RpbmcgZGlyZWN0aXZlLCB1cGRhdGUNCiAgICAgIGRpci5vbGRWYWx1ZSA9IG9sZERpci52YWx1ZTsNCiAgICAgIGNhbGxIb29rJDEoZGlyLCAndXBkYXRlJywgdm5vZGUsIG9sZFZub2RlKTsNCiAgICAgIGlmIChkaXIuZGVmICYmIGRpci5kZWYuY29tcG9uZW50VXBkYXRlZCkgew0KICAgICAgICBkaXJzV2l0aFBvc3RwYXRjaC5wdXNoKGRpcik7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgaWYgKGRpcnNXaXRoSW5zZXJ0Lmxlbmd0aCkgew0KICAgIHZhciBjYWxsSW5zZXJ0ID0gZnVuY3Rpb24gKCkgew0KICAgICAgZGlyc1dpdGhJbnNlcnQuZm9yRWFjaChmdW5jdGlvbiAoZGlyKSB7DQogICAgICAgIGNhbGxIb29rJDEoZGlyLCAnaW5zZXJ0ZWQnLCB2bm9kZSwgb2xkVm5vZGUpOw0KICAgICAgfSk7DQogICAgfTsNCiAgICBpZiAoaXNDcmVhdGUpIHsNCiAgICAgIG1lcmdlVk5vZGVIb29rKHZub2RlLmRhdGEuaG9vayB8fCAodm5vZGUuZGF0YS5ob29rID0ge30pLCAnaW5zZXJ0JywgY2FsbEluc2VydCwgJ2Rpci1pbnNlcnQnKTsNCiAgICB9IGVsc2Ugew0KICAgICAgY2FsbEluc2VydCgpOw0KICAgIH0NCiAgfQ0KDQogIGlmIChkaXJzV2l0aFBvc3RwYXRjaC5sZW5ndGgpIHsNCiAgICBtZXJnZVZOb2RlSG9vayh2bm9kZS5kYXRhLmhvb2sgfHwgKHZub2RlLmRhdGEuaG9vayA9IHt9KSwgJ3Bvc3RwYXRjaCcsIGZ1bmN0aW9uICgpIHsNCiAgICAgIGRpcnNXaXRoUG9zdHBhdGNoLmZvckVhY2goZnVuY3Rpb24gKGRpcikgew0KICAgICAgICBjYWxsSG9vayQxKGRpciwgJ2NvbXBvbmVudFVwZGF0ZWQnLCB2bm9kZSwgb2xkVm5vZGUpOw0KICAgICAgfSk7DQogICAgfSwgJ2Rpci1wb3N0cGF0Y2gnKTsNCiAgfQ0KDQogIGlmICghaXNDcmVhdGUpIHsNCiAgICBmb3IgKGtleSBpbiBvbGREaXJzKSB7DQogICAgICBpZiAoIW5ld0RpcnNba2V5XSkgew0KICAgICAgICAvLyBubyBsb25nZXIgcHJlc2VudCwgdW5iaW5kDQogICAgICAgIGNhbGxIb29rJDEob2xkRGlyc1trZXldLCAndW5iaW5kJywgb2xkVm5vZGUpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfQ0KDQp2YXIgZW1wdHlNb2RpZmllcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpOw0KDQpmdW5jdGlvbiBub3JtYWxpemVEaXJlY3RpdmVzJDEgKA0KICBkaXJzLA0KICB2bQ0KKSB7DQogIHZhciByZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpOw0KICBpZiAoIWRpcnMpIHsNCiAgICByZXR1cm4gcmVzDQogIH0NCiAgdmFyIGksIGRpcjsNCiAgZm9yIChpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyBpKyspIHsNCiAgICBkaXIgPSBkaXJzW2ldOw0KICAgIGlmICghZGlyLm1vZGlmaWVycykgew0KICAgICAgZGlyLm1vZGlmaWVycyA9IGVtcHR5TW9kaWZpZXJzOw0KICAgIH0NCiAgICByZXNbZ2V0UmF3RGlyTmFtZShkaXIpXSA9IGRpcjsNCiAgICBkaXIuZGVmID0gcmVzb2x2ZUFzc2V0KHZtLiRvcHRpb25zLCAnZGlyZWN0aXZlcycsIGRpci5uYW1lLCB0cnVlKTsNCiAgfQ0KICByZXR1cm4gcmVzDQp9DQoNCmZ1bmN0aW9uIGdldFJhd0Rpck5hbWUgKGRpcikgew0KICByZXR1cm4gZGlyLnJhd05hbWUgfHwgKChkaXIubmFtZSkgKyAiLiIgKyAoT2JqZWN0LmtleXMoZGlyLm1vZGlmaWVycyB8fCB7fSkuam9pbignLicpKSkNCn0NCg0KZnVuY3Rpb24gY2FsbEhvb2skMSAoZGlyLCBob29rLCB2bm9kZSwgb2xkVm5vZGUpIHsNCiAgdmFyIGZuID0gZGlyLmRlZiAmJiBkaXIuZGVmW2hvb2tdOw0KICBpZiAoZm4pIHsNCiAgICBmbih2bm9kZS5lbG0sIGRpciwgdm5vZGUsIG9sZFZub2RlKTsNCiAgfQ0KfQ0KDQp2YXIgYmFzZU1vZHVsZXMgPSBbDQogIHJlZiwNCiAgZGlyZWN0aXZlcw0KXTsNCg0KLyogICovDQoNCmZ1bmN0aW9uIHVwZGF0ZUF0dHJzIChvbGRWbm9kZSwgdm5vZGUpIHsNCiAgaWYgKCFvbGRWbm9kZS5kYXRhLmF0dHJzICYmICF2bm9kZS5kYXRhLmF0dHJzKSB7DQogICAgcmV0dXJuDQogIH0NCiAgdmFyIGtleSwgY3VyLCBvbGQ7DQogIHZhciBlbG0gPSB2bm9kZS5lbG07DQogIHZhciBvbGRBdHRycyA9IG9sZFZub2RlLmRhdGEuYXR0cnMgfHwge307DQogIHZhciBhdHRycyA9IHZub2RlLmRhdGEuYXR0cnMgfHwge307DQogIC8vIGNsb25lIG9ic2VydmVkIG9iamVjdHMsIGFzIHRoZSB1c2VyIHByb2JhYmx5IHdhbnRzIHRvIG11dGF0ZSBpdA0KICBpZiAoYXR0cnMuX19vYl9fKSB7DQogICAgYXR0cnMgPSB2bm9kZS5kYXRhLmF0dHJzID0gZXh0ZW5kKHt9LCBhdHRycyk7DQogIH0NCg0KICBmb3IgKGtleSBpbiBhdHRycykgew0KICAgIGN1ciA9IGF0dHJzW2tleV07DQogICAgb2xkID0gb2xkQXR0cnNba2V5XTsNCiAgICBpZiAob2xkICE9PSBjdXIpIHsNCiAgICAgIHNldEF0dHIoZWxtLCBrZXksIGN1cik7DQogICAgfQ0KICB9DQogIGZvciAoa2V5IGluIG9sZEF0dHJzKSB7DQogICAgaWYgKGF0dHJzW2tleV0gPT0gbnVsbCkgew0KICAgICAgaWYgKGlzWGxpbmsoa2V5KSkgew0KICAgICAgICBlbG0ucmVtb3ZlQXR0cmlidXRlTlMoeGxpbmtOUywgZ2V0WGxpbmtQcm9wKGtleSkpOw0KICAgICAgfSBlbHNlIGlmICghaXNFbnVtZXJhdGVkQXR0cihrZXkpKSB7DQogICAgICAgIGVsbS5yZW1vdmVBdHRyaWJ1dGUoa2V5KTsNCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg0KZnVuY3Rpb24gc2V0QXR0ciAoZWwsIGtleSwgdmFsdWUpIHsNCiAgaWYgKGlzQm9vbGVhbkF0dHIoa2V5KSkgew0KICAgIC8vIHNldCBhdHRyaWJ1dGUgZm9yIGJsYW5rIHZhbHVlDQogICAgLy8gZS5nLiA8b3B0aW9uIGRpc2FibGVkPlNlbGVjdCBvbmU8L29wdGlvbj4NCiAgICBpZiAoaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkpIHsNCiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShrZXkpOw0KICAgIH0gZWxzZSB7DQogICAgICBlbC5zZXRBdHRyaWJ1dGUoa2V5LCBrZXkpOw0KICAgIH0NCiAgfSBlbHNlIGlmIChpc0VudW1lcmF0ZWRBdHRyKGtleSkpIHsNCiAgICBlbC5zZXRBdHRyaWJ1dGUoa2V5LCBpc0ZhbHN5QXR0clZhbHVlKHZhbHVlKSB8fCB2YWx1ZSA9PT0gJ2ZhbHNlJyA/ICdmYWxzZScgOiAndHJ1ZScpOw0KICB9IGVsc2UgaWYgKGlzWGxpbmsoa2V5KSkgew0KICAgIGlmIChpc0ZhbHN5QXR0clZhbHVlKHZhbHVlKSkgew0KICAgICAgZWwucmVtb3ZlQXR0cmlidXRlTlMoeGxpbmtOUywgZ2V0WGxpbmtQcm9wKGtleSkpOw0KICAgIH0gZWxzZSB7DQogICAgICBlbC5zZXRBdHRyaWJ1dGVOUyh4bGlua05TLCBrZXksIHZhbHVlKTsNCiAgICB9DQogIH0gZWxzZSB7DQogICAgaWYgKGlzRmFsc3lBdHRyVmFsdWUodmFsdWUpKSB7DQogICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoa2V5KTsNCiAgICB9IGVsc2Ugew0KICAgICAgZWwuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpOw0KICAgIH0NCiAgfQ0KfQ0KDQp2YXIgYXR0cnMgPSB7DQogIGNyZWF0ZTogdXBkYXRlQXR0cnMsDQogIHVwZGF0ZTogdXBkYXRlQXR0cnMNCn07DQoNCi8qICAqLw0KDQpmdW5jdGlvbiB1cGRhdGVDbGFzcyAob2xkVm5vZGUsIHZub2RlKSB7DQogIHZhciBlbCA9IHZub2RlLmVsbTsNCiAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhOw0KICB2YXIgb2xkRGF0YSA9IG9sZFZub2RlLmRhdGE7DQogIGlmICghZGF0YS5zdGF0aWNDbGFzcyAmJiAhZGF0YS5jbGFzcyAmJg0KICAgICAgKCFvbGREYXRhIHx8ICghb2xkRGF0YS5zdGF0aWNDbGFzcyAmJiAhb2xkRGF0YS5jbGFzcykpKSB7DQogICAgcmV0dXJuDQogIH0NCg0KICB2YXIgY2xzID0gZ2VuQ2xhc3NGb3JWbm9kZSh2bm9kZSk7DQoNCiAgLy8gaGFuZGxlIHRyYW5zaXRpb24gY2xhc3Nlcw0KICB2YXIgdHJhbnNpdGlvbkNsYXNzID0gZWwuX3RyYW5zaXRpb25DbGFzc2VzOw0KICBpZiAodHJhbnNpdGlvbkNsYXNzKSB7DQogICAgY2xzID0gY29uY2F0KGNscywgc3RyaW5naWZ5Q2xhc3ModHJhbnNpdGlvbkNsYXNzKSk7DQogIH0NCg0KICAvLyBzZXQgdGhlIGNsYXNzDQogIGlmIChjbHMgIT09IGVsLl9wcmV2Q2xhc3MpIHsNCiAgICBlbC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgY2xzKTsNCiAgICBlbC5fcHJldkNsYXNzID0gY2xzOw0KICB9DQp9DQoNCnZhciBrbGFzcyA9IHsNCiAgY3JlYXRlOiB1cGRhdGVDbGFzcywNCiAgdXBkYXRlOiB1cGRhdGVDbGFzcw0KfTsNCg0KLy8gc2tpcCB0eXBlIGNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIHdlIG5lZWQgdG8gYXR0YWNoIHByaXZhdGUgcHJvcGVydGllcw0KLy8gdG8gZWxlbWVudHMNCg0KZnVuY3Rpb24gdXBkYXRlRE9NTGlzdGVuZXJzIChvbGRWbm9kZSwgdm5vZGUpIHsNCiAgaWYgKCFvbGRWbm9kZS5kYXRhLm9uICYmICF2bm9kZS5kYXRhLm9uKSB7DQogICAgcmV0dXJuDQogIH0NCiAgdmFyIG9uID0gdm5vZGUuZGF0YS5vbiB8fCB7fTsNCiAgdmFyIG9sZE9uID0gb2xkVm5vZGUuZGF0YS5vbiB8fCB7fTsNCiAgdmFyIGFkZCA9IHZub2RlLmVsbS5fdl9hZGQgfHwgKA0KICAgIHZub2RlLmVsbS5fdl9hZGQgPSBmdW5jdGlvbiAoZXZlbnQsIGhhbmRsZXIsIG9uY2UsIGNhcHR1cmUpIHsNCiAgICAgIGlmIChvbmNlKSB7DQogICAgICAgIHZhciBvbGRIYW5kbGVyID0gaGFuZGxlcjsNCiAgICAgICAgaGFuZGxlciA9IGZ1bmN0aW9uIChldikgew0KICAgICAgICAgIHJlbW92ZShldmVudCwgaGFuZGxlciwgY2FwdHVyZSk7DQogICAgICAgICAgYXJndW1lbnRzLmxlbmd0aCA9PT0gMQ0KICAgICAgICAgICAgPyBvbGRIYW5kbGVyKGV2KQ0KICAgICAgICAgICAgOiBvbGRIYW5kbGVyLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7DQogICAgICAgIH07DQogICAgICB9DQogICAgICB2bm9kZS5lbG0uYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgY2FwdHVyZSk7DQogICAgfQ0KICApOw0KICB2YXIgcmVtb3ZlID0gdm5vZGUuZWxtLl92X3JlbW92ZSB8fCAoDQogICAgdm5vZGUuZWxtLl92X3JlbW92ZSA9IGZ1bmN0aW9uIChldmVudCwgaGFuZGxlciwgY2FwdHVyZSkgew0KICAgICAgdm5vZGUuZWxtLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIGNhcHR1cmUpOw0KICAgIH0NCiAgKTsNCiAgdXBkYXRlTGlzdGVuZXJzKG9uLCBvbGRPbiwgYWRkLCByZW1vdmUsIHZub2RlLmNvbnRleHQpOw0KfQ0KDQp2YXIgZXZlbnRzID0gew0KICBjcmVhdGU6IHVwZGF0ZURPTUxpc3RlbmVycywNCiAgdXBkYXRlOiB1cGRhdGVET01MaXN0ZW5lcnMNCn07DQoNCi8qICAqLw0KDQpmdW5jdGlvbiB1cGRhdGVET01Qcm9wcyAob2xkVm5vZGUsIHZub2RlKSB7DQogIGlmICghb2xkVm5vZGUuZGF0YS5kb21Qcm9wcyAmJiAhdm5vZGUuZGF0YS5kb21Qcm9wcykgew0KICAgIHJldHVybg0KICB9DQogIHZhciBrZXksIGN1cjsNCiAgdmFyIGVsbSA9IHZub2RlLmVsbTsNCiAgdmFyIG9sZFByb3BzID0gb2xkVm5vZGUuZGF0YS5kb21Qcm9wcyB8fCB7fTsNCiAgdmFyIHByb3BzID0gdm5vZGUuZGF0YS5kb21Qcm9wcyB8fCB7fTsNCiAgLy8gY2xvbmUgb2JzZXJ2ZWQgb2JqZWN0cywgYXMgdGhlIHVzZXIgcHJvYmFibHkgd2FudHMgdG8gbXV0YXRlIGl0DQogIGlmIChwcm9wcy5fX29iX18pIHsNCiAgICBwcm9wcyA9IHZub2RlLmRhdGEuZG9tUHJvcHMgPSBleHRlbmQoe30sIHByb3BzKTsNCiAgfQ0KDQogIGZvciAoa2V5IGluIG9sZFByb3BzKSB7DQogICAgaWYgKHByb3BzW2tleV0gPT0gbnVsbCkgew0KICAgICAgZWxtW2tleV0gPSAnJzsNCiAgICB9DQogIH0NCiAgZm9yIChrZXkgaW4gcHJvcHMpIHsNCiAgICBjdXIgPSBwcm9wc1trZXldOw0KICAgIC8vIGlnbm9yZSBjaGlsZHJlbiBpZiB0aGUgbm9kZSBoYXMgdGV4dENvbnRlbnQgb3IgaW5uZXJIVE1MLA0KICAgIC8vIGFzIHRoZXNlIHdpbGwgdGhyb3cgYXdheSBleGlzdGluZyBET00gbm9kZXMgYW5kIGNhdXNlIHJlbW92YWwgZXJyb3JzDQogICAgLy8gb24gc3Vic2VxdWVudCBwYXRjaGVzICgjMzM2MCkNCiAgICBpZiAoa2V5ID09PSAndGV4dENvbnRlbnQnIHx8IGtleSA9PT0gJ2lubmVySFRNTCcpIHsNCiAgICAgIGlmICh2bm9kZS5jaGlsZHJlbikgeyB2bm9kZS5jaGlsZHJlbi5sZW5ndGggPSAwOyB9DQogICAgICBpZiAoY3VyID09PSBvbGRQcm9wc1trZXldKSB7IGNvbnRpbnVlIH0NCiAgICB9DQogICAgaWYgKGtleSA9PT0gJ3ZhbHVlJykgew0KICAgICAgLy8gc3RvcmUgdmFsdWUgYXMgX3ZhbHVlIGFzIHdlbGwgc2luY2UNCiAgICAgIC8vIG5vbi1zdHJpbmcgdmFsdWVzIHdpbGwgYmUgc3RyaW5naWZpZWQNCiAgICAgIGVsbS5fdmFsdWUgPSBjdXI7DQogICAgICAvLyBhdm9pZCByZXNldHRpbmcgY3Vyc29yIHBvc2l0aW9uIHdoZW4gdmFsdWUgaXMgdGhlIHNhbWUNCiAgICAgIHZhciBzdHJDdXIgPSBjdXIgPT0gbnVsbCA/ICcnIDogU3RyaW5nKGN1cik7DQogICAgICBpZiAoZWxtLnZhbHVlICE9PSBzdHJDdXIgJiYgIWVsbS5jb21wb3NpbmcpIHsNCiAgICAgICAgZWxtLnZhbHVlID0gc3RyQ3VyOw0KICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICBlbG1ba2V5XSA9IGN1cjsNCiAgICB9DQogIH0NCn0NCg0KdmFyIGRvbVByb3BzID0gew0KICBjcmVhdGU6IHVwZGF0ZURPTVByb3BzLA0KICB1cGRhdGU6IHVwZGF0ZURPTVByb3BzDQp9Ow0KDQovKiAgKi8NCg0KdmFyIHBhcnNlU3R5bGVUZXh0ID0gY2FjaGVkKGZ1bmN0aW9uIChjc3NUZXh0KSB7DQogIHZhciByZXMgPSB7fTsNCiAgdmFyIGxpc3REZWxpbWl0ZXIgPSAvOyg/IVteKF0qXCkpL2c7DQogIHZhciBwcm9wZXJ0eURlbGltaXRlciA9IC86KC4rKS87DQogIGNzc1RleHQuc3BsaXQobGlzdERlbGltaXRlcikuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgew0KICAgIGlmIChpdGVtKSB7DQogICAgICB2YXIgdG1wID0gaXRlbS5zcGxpdChwcm9wZXJ0eURlbGltaXRlcik7DQogICAgICB0bXAubGVuZ3RoID4gMSAmJiAocmVzW3RtcFswXS50cmltKCldID0gdG1wWzFdLnRyaW0oKSk7DQogICAgfQ0KICB9KTsNCiAgcmV0dXJuIHJlcw0KfSk7DQoNCi8vIG1lcmdlIHN0YXRpYyBhbmQgZHluYW1pYyBzdHlsZSBkYXRhIG9uIHRoZSBzYW1lIHZub2RlDQpmdW5jdGlvbiBub3JtYWxpemVTdHlsZURhdGEgKGRhdGEpIHsNCiAgdmFyIHN0eWxlID0gbm9ybWFsaXplU3R5bGVCaW5kaW5nKGRhdGEuc3R5bGUpOw0KICAvLyBzdGF0aWMgc3R5bGUgaXMgcHJlLXByb2Nlc3NlZCBpbnRvIGFuIG9iamVjdCBkdXJpbmcgY29tcGlsYXRpb24NCiAgLy8gYW5kIGlzIGFsd2F5cyBhIGZyZXNoIG9iamVjdCwgc28gaXQncyBzYWZlIHRvIG1lcmdlIGludG8gaXQNCiAgcmV0dXJuIGRhdGEuc3RhdGljU3R5bGUNCiAgICA/IGV4dGVuZChkYXRhLnN0YXRpY1N0eWxlLCBzdHlsZSkNCiAgICA6IHN0eWxlDQp9DQoNCi8vIG5vcm1hbGl6ZSBwb3NzaWJsZSBhcnJheSAvIHN0cmluZyB2YWx1ZXMgaW50byBPYmplY3QNCmZ1bmN0aW9uIG5vcm1hbGl6ZVN0eWxlQmluZGluZyAoYmluZGluZ1N0eWxlKSB7DQogIGlmIChBcnJheS5pc0FycmF5KGJpbmRpbmdTdHlsZSkpIHsNCiAgICByZXR1cm4gdG9PYmplY3QoYmluZGluZ1N0eWxlKQ0KICB9DQogIGlmICh0eXBlb2YgYmluZGluZ1N0eWxlID09PSAnc3RyaW5nJykgew0KICAgIHJldHVybiBwYXJzZVN0eWxlVGV4dChiaW5kaW5nU3R5bGUpDQogIH0NCiAgcmV0dXJuIGJpbmRpbmdTdHlsZQ0KfQ0KDQovKioNCiAqIHBhcmVudCBjb21wb25lbnQgc3R5bGUgc2hvdWxkIGJlIGFmdGVyIGNoaWxkJ3MNCiAqIHNvIHRoYXQgcGFyZW50IGNvbXBvbmVudCdzIHN0eWxlIGNvdWxkIG92ZXJyaWRlIGl0DQogKi8NCmZ1bmN0aW9uIGdldFN0eWxlICh2bm9kZSwgY2hlY2tDaGlsZCkgew0KICB2YXIgcmVzID0ge307DQogIHZhciBzdHlsZURhdGE7DQoNCiAgaWYgKGNoZWNrQ2hpbGQpIHsNCiAgICB2YXIgY2hpbGROb2RlID0gdm5vZGU7DQogICAgd2hpbGUgKGNoaWxkTm9kZS5jaGlsZCkgew0KICAgICAgY2hpbGROb2RlID0gY2hpbGROb2RlLmNoaWxkLl92bm9kZTsNCiAgICAgIGlmIChjaGlsZE5vZGUuZGF0YSAmJiAoc3R5bGVEYXRhID0gbm9ybWFsaXplU3R5bGVEYXRhKGNoaWxkTm9kZS5kYXRhKSkpIHsNCiAgICAgICAgZXh0ZW5kKHJlcywgc3R5bGVEYXRhKTsNCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICBpZiAoKHN0eWxlRGF0YSA9IG5vcm1hbGl6ZVN0eWxlRGF0YSh2bm9kZS5kYXRhKSkpIHsNCiAgICBleHRlbmQocmVzLCBzdHlsZURhdGEpOw0KICB9DQoNCiAgdmFyIHBhcmVudE5vZGUgPSB2bm9kZTsNCiAgd2hpbGUgKChwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnQpKSB7DQogICAgaWYgKHBhcmVudE5vZGUuZGF0YSAmJiAoc3R5bGVEYXRhID0gbm9ybWFsaXplU3R5bGVEYXRhKHBhcmVudE5vZGUuZGF0YSkpKSB7DQogICAgICBleHRlbmQocmVzLCBzdHlsZURhdGEpOw0KICAgIH0NCiAgfQ0KICByZXR1cm4gcmVzDQp9DQoNCi8qICAqLw0KDQp2YXIgY3NzVmFyUkUgPSAvXi0tLzsNCnZhciBpbXBvcnRhbnRSRSA9IC9ccyohaW1wb3J0YW50JC87DQp2YXIgc2V0UHJvcCA9IGZ1bmN0aW9uIChlbCwgbmFtZSwgdmFsKSB7DQogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLw0KICBpZiAoY3NzVmFyUkUudGVzdChuYW1lKSkgew0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbCk7DQogIH0gZWxzZSBpZiAoaW1wb3J0YW50UkUudGVzdCh2YWwpKSB7DQogICAgZWwuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsLnJlcGxhY2UoaW1wb3J0YW50UkUsICcnKSwgJ2ltcG9ydGFudCcpOw0KICB9IGVsc2Ugew0KICAgIGVsLnN0eWxlW25vcm1hbGl6ZShuYW1lKV0gPSB2YWw7DQogIH0NCn07DQoNCnZhciBwcmVmaXhlcyA9IFsnV2Via2l0JywgJ01veicsICdtcyddOw0KDQp2YXIgdGVzdEVsOw0KdmFyIG5vcm1hbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAocHJvcCkgew0KICB0ZXN0RWwgPSB0ZXN0RWwgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQogIHByb3AgPSBjYW1lbGl6ZShwcm9wKTsNCiAgaWYgKHByb3AgIT09ICdmaWx0ZXInICYmIChwcm9wIGluIHRlc3RFbC5zdHlsZSkpIHsNCiAgICByZXR1cm4gcHJvcA0KICB9DQogIHZhciB1cHBlciA9IHByb3AuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwcm9wLnNsaWNlKDEpOw0KICBmb3IgKHZhciBpID0gMDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrKSB7DQogICAgdmFyIHByZWZpeGVkID0gcHJlZml4ZXNbaV0gKyB1cHBlcjsNCiAgICBpZiAocHJlZml4ZWQgaW4gdGVzdEVsLnN0eWxlKSB7DQogICAgICByZXR1cm4gcHJlZml4ZWQNCiAgICB9DQogIH0NCn0pOw0KDQpmdW5jdGlvbiB1cGRhdGVTdHlsZSAob2xkVm5vZGUsIHZub2RlKSB7DQogIHZhciBkYXRhID0gdm5vZGUuZGF0YTsNCiAgdmFyIG9sZERhdGEgPSBvbGRWbm9kZS5kYXRhOw0KDQogIGlmICghZGF0YS5zdGF0aWNTdHlsZSAmJiAhZGF0YS5zdHlsZSAmJg0KICAgICAgIW9sZERhdGEuc3RhdGljU3R5bGUgJiYgIW9sZERhdGEuc3R5bGUpIHsNCiAgICByZXR1cm4NCiAgfQ0KDQogIHZhciBjdXIsIG5hbWU7DQogIHZhciBlbCA9IHZub2RlLmVsbTsNCiAgdmFyIG9sZFN0YXRpY1N0eWxlID0gb2xkVm5vZGUuZGF0YS5zdGF0aWNTdHlsZTsNCiAgdmFyIG9sZFN0eWxlQmluZGluZyA9IG9sZFZub2RlLmRhdGEuc3R5bGUgfHwge307DQoNCiAgLy8gaWYgc3RhdGljIHN0eWxlIGV4aXN0cywgc3R5bGViaW5kaW5nIGFscmVhZHkgbWVyZ2VkIGludG8gaXQgd2hlbiBkb2luZyBub3JtYWxpemVTdHlsZURhdGENCiAgdmFyIG9sZFN0eWxlID0gb2xkU3RhdGljU3R5bGUgfHwgb2xkU3R5bGVCaW5kaW5nOw0KDQogIHZhciBzdHlsZSA9IG5vcm1hbGl6ZVN0eWxlQmluZGluZyh2bm9kZS5kYXRhLnN0eWxlKSB8fCB7fTsNCg0KICB2bm9kZS5kYXRhLnN0eWxlID0gc3R5bGUuX19vYl9fID8gZXh0ZW5kKHt9LCBzdHlsZSkgOiBzdHlsZTsNCg0KICB2YXIgbmV3U3R5bGUgPSBnZXRTdHlsZSh2bm9kZSwgdHJ1ZSk7DQoNCiAgZm9yIChuYW1lIGluIG9sZFN0eWxlKSB7DQogICAgaWYgKG5ld1N0eWxlW25hbWVdID09IG51bGwpIHsNCiAgICAgIHNldFByb3AoZWwsIG5hbWUsICcnKTsNCiAgICB9DQogIH0NCiAgZm9yIChuYW1lIGluIG5ld1N0eWxlKSB7DQogICAgY3VyID0gbmV3U3R5bGVbbmFtZV07DQogICAgaWYgKGN1ciAhPT0gb2xkU3R5bGVbbmFtZV0pIHsNCiAgICAgIC8vIGllOSBzZXR0aW5nIHRvIG51bGwgaGFzIG5vIGVmZmVjdCwgbXVzdCB1c2UgZW1wdHkgc3RyaW5nDQogICAgICBzZXRQcm9wKGVsLCBuYW1lLCBjdXIgPT0gbnVsbCA/ICcnIDogY3VyKTsNCiAgICB9DQogIH0NCn0NCg0KdmFyIHN0eWxlID0gew0KICBjcmVhdGU6IHVwZGF0ZVN0eWxlLA0KICB1cGRhdGU6IHVwZGF0ZVN0eWxlDQp9Ow0KDQovKiAgKi8NCg0KLyoqDQogKiBBZGQgY2xhc3Mgd2l0aCBjb21wYXRpYmlsaXR5IGZvciBTVkcgc2luY2UgY2xhc3NMaXN0IGlzIG5vdCBzdXBwb3J0ZWQgb24NCiAqIFNWRyBlbGVtZW50cyBpbiBJRQ0KICovDQpmdW5jdGlvbiBhZGRDbGFzcyAoZWwsIGNscykgew0KICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8NCiAgaWYgKCFjbHMgfHwgIWNscy50cmltKCkpIHsNCiAgICByZXR1cm4NCiAgfQ0KDQogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovDQogIGlmIChlbC5jbGFzc0xpc3QpIHsNCiAgICBpZiAoY2xzLmluZGV4T2YoJyAnKSA+IC0xKSB7DQogICAgICBjbHMuc3BsaXQoL1xzKy8pLmZvckVhY2goZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGVsLmNsYXNzTGlzdC5hZGQoYyk7IH0pOw0KICAgIH0gZWxzZSB7DQogICAgICBlbC5jbGFzc0xpc3QuYWRkKGNscyk7DQogICAgfQ0KICB9IGVsc2Ugew0KICAgIHZhciBjdXIgPSAnICcgKyBlbC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykgKyAnICc7DQogICAgaWYgKGN1ci5pbmRleE9mKCcgJyArIGNscyArICcgJykgPCAwKSB7DQogICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgKGN1ciArIGNscykudHJpbSgpKTsNCiAgICB9DQogIH0NCn0NCg0KLyoqDQogKiBSZW1vdmUgY2xhc3Mgd2l0aCBjb21wYXRpYmlsaXR5IGZvciBTVkcgc2luY2UgY2xhc3NMaXN0IGlzIG5vdCBzdXBwb3J0ZWQgb24NCiAqIFNWRyBlbGVtZW50cyBpbiBJRQ0KICovDQpmdW5jdGlvbiByZW1vdmVDbGFzcyAoZWwsIGNscykgew0KICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8NCiAgaWYgKCFjbHMgfHwgIWNscy50cmltKCkpIHsNCiAgICByZXR1cm4NCiAgfQ0KDQogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovDQogIGlmIChlbC5jbGFzc0xpc3QpIHsNCiAgICBpZiAoY2xzLmluZGV4T2YoJyAnKSA+IC0xKSB7DQogICAgICBjbHMuc3BsaXQoL1xzKy8pLmZvckVhY2goZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGVsLmNsYXNzTGlzdC5yZW1vdmUoYyk7IH0pOw0KICAgIH0gZWxzZSB7DQogICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKGNscyk7DQogICAgfQ0KICB9IGVsc2Ugew0KICAgIHZhciBjdXIgPSAnICcgKyBlbC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykgKyAnICc7DQogICAgdmFyIHRhciA9ICcgJyArIGNscyArICcgJzsNCiAgICB3aGlsZSAoY3VyLmluZGV4T2YodGFyKSA+PSAwKSB7DQogICAgICBjdXIgPSBjdXIucmVwbGFjZSh0YXIsICcgJyk7DQogICAgfQ0KICAgIGVsLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCBjdXIudHJpbSgpKTsNCiAgfQ0KfQ0KDQovKiAgKi8NCg0KdmFyIGhhc1RyYW5zaXRpb24gPSBpbkJyb3dzZXIgJiYgIWlzSUU5Ow0KdmFyIFRSQU5TSVRJT04gPSAndHJhbnNpdGlvbic7DQp2YXIgQU5JTUFUSU9OID0gJ2FuaW1hdGlvbic7DQoNCi8vIFRyYW5zaXRpb24gcHJvcGVydHkvZXZlbnQgc25pZmZpbmcNCnZhciB0cmFuc2l0aW9uUHJvcCA9ICd0cmFuc2l0aW9uJzsNCnZhciB0cmFuc2l0aW9uRW5kRXZlbnQgPSAndHJhbnNpdGlvbmVuZCc7DQp2YXIgYW5pbWF0aW9uUHJvcCA9ICdhbmltYXRpb24nOw0KdmFyIGFuaW1hdGlvbkVuZEV2ZW50ID0gJ2FuaW1hdGlvbmVuZCc7DQppZiAoaGFzVHJhbnNpdGlvbikgew0KICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8NCiAgaWYgKHdpbmRvdy5vbnRyYW5zaXRpb25lbmQgPT09IHVuZGVmaW5lZCAmJg0KICAgIHdpbmRvdy5vbndlYmtpdHRyYW5zaXRpb25lbmQgIT09IHVuZGVmaW5lZCkgew0KICAgIHRyYW5zaXRpb25Qcm9wID0gJ1dlYmtpdFRyYW5zaXRpb24nOw0KICAgIHRyYW5zaXRpb25FbmRFdmVudCA9ICd3ZWJraXRUcmFuc2l0aW9uRW5kJzsNCiAgfQ0KICBpZiAod2luZG93Lm9uYW5pbWF0aW9uZW5kID09PSB1bmRlZmluZWQgJiYNCiAgICB3aW5kb3cub253ZWJraXRhbmltYXRpb25lbmQgIT09IHVuZGVmaW5lZCkgew0KICAgIGFuaW1hdGlvblByb3AgPSAnV2Via2l0QW5pbWF0aW9uJzsNCiAgICBhbmltYXRpb25FbmRFdmVudCA9ICd3ZWJraXRBbmltYXRpb25FbmQnOw0KICB9DQp9DQoNCnZhciByYWYgPSAoaW5Ccm93c2VyICYmIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHx8IHNldFRpbWVvdXQ7DQpmdW5jdGlvbiBuZXh0RnJhbWUgKGZuKSB7DQogIHJhZihmdW5jdGlvbiAoKSB7DQogICAgcmFmKGZuKTsNCiAgfSk7DQp9DQoNCmZ1bmN0aW9uIGFkZFRyYW5zaXRpb25DbGFzcyAoZWwsIGNscykgew0KICAoZWwuX3RyYW5zaXRpb25DbGFzc2VzIHx8IChlbC5fdHJhbnNpdGlvbkNsYXNzZXMgPSBbXSkpLnB1c2goY2xzKTsNCiAgYWRkQ2xhc3MoZWwsIGNscyk7DQp9DQoNCmZ1bmN0aW9uIHJlbW92ZVRyYW5zaXRpb25DbGFzcyAoZWwsIGNscykgew0KICBpZiAoZWwuX3RyYW5zaXRpb25DbGFzc2VzKSB7DQogICAgcmVtb3ZlJDEoZWwuX3RyYW5zaXRpb25DbGFzc2VzLCBjbHMpOw0KICB9DQogIHJlbW92ZUNsYXNzKGVsLCBjbHMpOw0KfQ0KDQpmdW5jdGlvbiB3aGVuVHJhbnNpdGlvbkVuZHMgKA0KICBlbCwNCiAgZXhwZWN0ZWRUeXBlLA0KICBjYg0KKSB7DQogIHZhciByZWYgPSBnZXRUcmFuc2l0aW9uSW5mbyhlbCwgZXhwZWN0ZWRUeXBlKTsNCiAgdmFyIHR5cGUgPSByZWYudHlwZTsNCiAgdmFyIHRpbWVvdXQgPSByZWYudGltZW91dDsNCiAgdmFyIHByb3BDb3VudCA9IHJlZi5wcm9wQ291bnQ7DQogIGlmICghdHlwZSkgeyByZXR1cm4gY2IoKSB9DQogIHZhciBldmVudCA9IHR5cGUgPT09IFRSQU5TSVRJT04gPyB0cmFuc2l0aW9uRW5kRXZlbnQgOiBhbmltYXRpb25FbmRFdmVudDsNCiAgdmFyIGVuZGVkID0gMDsNCiAgdmFyIGVuZCA9IGZ1bmN0aW9uICgpIHsNCiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBvbkVuZCk7DQogICAgY2IoKTsNCiAgfTsNCiAgdmFyIG9uRW5kID0gZnVuY3Rpb24gKGUpIHsNCiAgICBpZiAoZS50YXJnZXQgPT09IGVsKSB7DQogICAgICBpZiAoKytlbmRlZCA+PSBwcm9wQ291bnQpIHsNCiAgICAgICAgZW5kKCk7DQogICAgICB9DQogICAgfQ0KICB9Ow0KICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsNCiAgICBpZiAoZW5kZWQgPCBwcm9wQ291bnQpIHsNCiAgICAgIGVuZCgpOw0KICAgIH0NCiAgfSwgdGltZW91dCArIDEpOw0KICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBvbkVuZCk7DQp9DQoNCnZhciB0cmFuc2Zvcm1SRSA9IC9cYih0cmFuc2Zvcm18YWxsKSgsfCQpLzsNCg0KZnVuY3Rpb24gZ2V0VHJhbnNpdGlvbkluZm8gKGVsLCBleHBlY3RlZFR5cGUpIHsNCiAgdmFyIHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKTsNCiAgdmFyIHRyYW5zaXRpb25lRGVsYXlzID0gc3R5bGVzW3RyYW5zaXRpb25Qcm9wICsgJ0RlbGF5J10uc3BsaXQoJywgJyk7DQogIHZhciB0cmFuc2l0aW9uRHVyYXRpb25zID0gc3R5bGVzW3RyYW5zaXRpb25Qcm9wICsgJ0R1cmF0aW9uJ10uc3BsaXQoJywgJyk7DQogIHZhciB0cmFuc2l0aW9uVGltZW91dCA9IGdldFRpbWVvdXQodHJhbnNpdGlvbmVEZWxheXMsIHRyYW5zaXRpb25EdXJhdGlvbnMpOw0KICB2YXIgYW5pbWF0aW9uRGVsYXlzID0gc3R5bGVzW2FuaW1hdGlvblByb3AgKyAnRGVsYXknXS5zcGxpdCgnLCAnKTsNCiAgdmFyIGFuaW1hdGlvbkR1cmF0aW9ucyA9IHN0eWxlc1thbmltYXRpb25Qcm9wICsgJ0R1cmF0aW9uJ10uc3BsaXQoJywgJyk7DQogIHZhciBhbmltYXRpb25UaW1lb3V0ID0gZ2V0VGltZW91dChhbmltYXRpb25EZWxheXMsIGFuaW1hdGlvbkR1cmF0aW9ucyk7DQoNCiAgdmFyIHR5cGU7DQogIHZhciB0aW1lb3V0ID0gMDsNCiAgdmFyIHByb3BDb3VudCA9IDA7DQogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLw0KICBpZiAoZXhwZWN0ZWRUeXBlID09PSBUUkFOU0lUSU9OKSB7DQogICAgaWYgKHRyYW5zaXRpb25UaW1lb3V0ID4gMCkgew0KICAgICAgdHlwZSA9IFRSQU5TSVRJT047DQogICAgICB0aW1lb3V0ID0gdHJhbnNpdGlvblRpbWVvdXQ7DQogICAgICBwcm9wQ291bnQgPSB0cmFuc2l0aW9uRHVyYXRpb25zLmxlbmd0aDsNCiAgICB9DQogIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSBBTklNQVRJT04pIHsNCiAgICBpZiAoYW5pbWF0aW9uVGltZW91dCA+IDApIHsNCiAgICAgIHR5cGUgPSBBTklNQVRJT047DQogICAgICB0aW1lb3V0ID0gYW5pbWF0aW9uVGltZW91dDsNCiAgICAgIHByb3BDb3VudCA9IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGg7DQogICAgfQ0KICB9IGVsc2Ugew0KICAgIHRpbWVvdXQgPSBNYXRoLm1heCh0cmFuc2l0aW9uVGltZW91dCwgYW5pbWF0aW9uVGltZW91dCk7DQogICAgdHlwZSA9IHRpbWVvdXQgPiAwDQogICAgICA/IHRyYW5zaXRpb25UaW1lb3V0ID4gYW5pbWF0aW9uVGltZW91dA0KICAgICAgICA/IFRSQU5TSVRJT04NCiAgICAgICAgOiBBTklNQVRJT04NCiAgICAgIDogbnVsbDsNCiAgICBwcm9wQ291bnQgPSB0eXBlDQogICAgICA/IHR5cGUgPT09IFRSQU5TSVRJT04NCiAgICAgICAgPyB0cmFuc2l0aW9uRHVyYXRpb25zLmxlbmd0aA0KICAgICAgICA6IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGgNCiAgICAgIDogMDsNCiAgfQ0KICB2YXIgaGFzVHJhbnNmb3JtID0NCiAgICB0eXBlID09PSBUUkFOU0lUSU9OICYmDQogICAgdHJhbnNmb3JtUkUudGVzdChzdHlsZXNbdHJhbnNpdGlvblByb3AgKyAnUHJvcGVydHknXSk7DQogIHJldHVybiB7DQogICAgdHlwZTogdHlwZSwNCiAgICB0aW1lb3V0OiB0aW1lb3V0LA0KICAgIHByb3BDb3VudDogcHJvcENvdW50LA0KICAgIGhhc1RyYW5zZm9ybTogaGFzVHJhbnNmb3JtDQogIH0NCn0NCg0KZnVuY3Rpb24gZ2V0VGltZW91dCAoZGVsYXlzLCBkdXJhdGlvbnMpIHsNCiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8NCiAgd2hpbGUgKGRlbGF5cy5sZW5ndGggPCBkdXJhdGlvbnMubGVuZ3RoKSB7DQogICAgZGVsYXlzID0gZGVsYXlzLmNvbmNhdChkZWxheXMpOw0KICB9DQoNCiAgcmV0dXJuIE1hdGgubWF4LmFwcGx5KG51bGwsIGR1cmF0aW9ucy5tYXAoZnVuY3Rpb24gKGQsIGkpIHsNCiAgICByZXR1cm4gdG9NcyhkKSArIHRvTXMoZGVsYXlzW2ldKQ0KICB9KSkNCn0NCg0KZnVuY3Rpb24gdG9NcyAocykgew0KICByZXR1cm4gTnVtYmVyKHMuc2xpY2UoMCwgLTEpKSAqIDEwMDANCn0NCg0KLyogICovDQoNCmZ1bmN0aW9uIGVudGVyICh2bm9kZSkgew0KICB2YXIgZWwgPSB2bm9kZS5lbG07DQoNCiAgLy8gY2FsbCBsZWF2ZSBjYWxsYmFjayBub3cNCiAgaWYgKGVsLl9sZWF2ZUNiKSB7DQogICAgZWwuX2xlYXZlQ2IuY2FuY2VsbGVkID0gdHJ1ZTsNCiAgICBlbC5fbGVhdmVDYigpOw0KICB9DQoNCiAgdmFyIGRhdGEgPSByZXNvbHZlVHJhbnNpdGlvbih2bm9kZS5kYXRhLnRyYW5zaXRpb24pOw0KICBpZiAoIWRhdGEpIHsNCiAgICByZXR1cm4NCiAgfQ0KDQogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLw0KICBpZiAoZWwuX2VudGVyQ2IgfHwgZWwubm9kZVR5cGUgIT09IDEpIHsNCiAgICByZXR1cm4NCiAgfQ0KDQogIHZhciBjc3MgPSBkYXRhLmNzczsNCiAgdmFyIHR5cGUgPSBkYXRhLnR5cGU7DQogIHZhciBlbnRlckNsYXNzID0gZGF0YS5lbnRlckNsYXNzOw0KICB2YXIgZW50ZXJBY3RpdmVDbGFzcyA9IGRhdGEuZW50ZXJBY3RpdmVDbGFzczsNCiAgdmFyIGFwcGVhckNsYXNzID0gZGF0YS5hcHBlYXJDbGFzczsNCiAgdmFyIGFwcGVhckFjdGl2ZUNsYXNzID0gZGF0YS5hcHBlYXJBY3RpdmVDbGFzczsNCiAgdmFyIGJlZm9yZUVudGVyID0gZGF0YS5iZWZvcmVFbnRlcjsNCiAgdmFyIGVudGVyID0gZGF0YS5lbnRlcjsNCiAgdmFyIGFmdGVyRW50ZXIgPSBkYXRhLmFmdGVyRW50ZXI7DQogIHZhciBlbnRlckNhbmNlbGxlZCA9IGRhdGEuZW50ZXJDYW5jZWxsZWQ7DQogIHZhciBiZWZvcmVBcHBlYXIgPSBkYXRhLmJlZm9yZUFwcGVhcjsNCiAgdmFyIGFwcGVhciA9IGRhdGEuYXBwZWFyOw0KICB2YXIgYWZ0ZXJBcHBlYXIgPSBkYXRhLmFmdGVyQXBwZWFyOw0KICB2YXIgYXBwZWFyQ2FuY2VsbGVkID0gZGF0YS5hcHBlYXJDYW5jZWxsZWQ7DQoNCiAgLy8gYWN0aXZlSW5zdGFuY2Ugd2lsbCBhbHdheXMgYmUgdGhlIDx0cmFuc2l0aW9uPiBjb21wb25lbnQgbWFuYWdpbmcgdGhpcw0KICAvLyB0cmFuc2l0aW9uLiBPbmUgZWRnZSBjYXNlIHRvIGNoZWNrIGlzIHdoZW4gdGhlIDx0cmFuc2l0aW9uPiBpcyBwbGFjZWQNCiAgLy8gYXMgdGhlIHJvb3Qgbm9kZSBvZiBhIGNoaWxkIGNvbXBvbmVudC4gSW4gdGhhdCBjYXNlIHdlIG5lZWQgdG8gY2hlY2sNCiAgLy8gPHRyYW5zaXRpb24+J3MgcGFyZW50IGZvciBhcHBlYXIgY2hlY2suDQogIHZhciBjb250ZXh0ID0gYWN0aXZlSW5zdGFuY2U7DQogIHZhciB0cmFuc2l0aW9uTm9kZSA9IGFjdGl2ZUluc3RhbmNlLiR2bm9kZTsNCiAgd2hpbGUgKHRyYW5zaXRpb25Ob2RlICYmIHRyYW5zaXRpb25Ob2RlLnBhcmVudCkgew0KICAgIHRyYW5zaXRpb25Ob2RlID0gdHJhbnNpdGlvbk5vZGUucGFyZW50Ow0KICAgIGNvbnRleHQgPSB0cmFuc2l0aW9uTm9kZS5jb250ZXh0Ow0KICB9DQoNCiAgdmFyIGlzQXBwZWFyID0gIWNvbnRleHQuX2lzTW91bnRlZCB8fCAhdm5vZGUuaXNSb290SW5zZXJ0Ow0KDQogIGlmIChpc0FwcGVhciAmJiAhYXBwZWFyICYmIGFwcGVhciAhPT0gJycpIHsNCiAgICByZXR1cm4NCiAgfQ0KDQogIHZhciBzdGFydENsYXNzID0gaXNBcHBlYXIgPyBhcHBlYXJDbGFzcyA6IGVudGVyQ2xhc3M7DQogIHZhciBhY3RpdmVDbGFzcyA9IGlzQXBwZWFyID8gYXBwZWFyQWN0aXZlQ2xhc3MgOiBlbnRlckFjdGl2ZUNsYXNzOw0KICB2YXIgYmVmb3JlRW50ZXJIb29rID0gaXNBcHBlYXIgPyAoYmVmb3JlQXBwZWFyIHx8IGJlZm9yZUVudGVyKSA6IGJlZm9yZUVudGVyOw0KICB2YXIgZW50ZXJIb29rID0gaXNBcHBlYXIgPyAodHlwZW9mIGFwcGVhciA9PT0gJ2Z1bmN0aW9uJyA/IGFwcGVhciA6IGVudGVyKSA6IGVudGVyOw0KICB2YXIgYWZ0ZXJFbnRlckhvb2sgPSBpc0FwcGVhciA/IChhZnRlckFwcGVhciB8fCBhZnRlckVudGVyKSA6IGFmdGVyRW50ZXI7DQogIHZhciBlbnRlckNhbmNlbGxlZEhvb2sgPSBpc0FwcGVhciA/IChhcHBlYXJDYW5jZWxsZWQgfHwgZW50ZXJDYW5jZWxsZWQpIDogZW50ZXJDYW5jZWxsZWQ7DQoNCiAgdmFyIGV4cGVjdHNDU1MgPSBjc3MgIT09IGZhbHNlICYmICFpc0lFOTsNCiAgdmFyIHVzZXJXYW50c0NvbnRyb2wgPQ0KICAgIGVudGVySG9vayAmJg0KICAgIC8vIGVudGVySG9vayBtYXkgYmUgYSBib3VuZCBtZXRob2Qgd2hpY2ggZXhwb3Nlcw0KICAgIC8vIHRoZSBsZW5ndGggb2Ygb3JpZ2luYWwgZm4gYXMgX2xlbmd0aA0KICAgIChlbnRlckhvb2suX2xlbmd0aCB8fCBlbnRlckhvb2subGVuZ3RoKSA+IDE7DQoNCiAgdmFyIGNiID0gZWwuX2VudGVyQ2IgPSBvbmNlKGZ1bmN0aW9uICgpIHsNCiAgICBpZiAoZXhwZWN0c0NTUykgew0KICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBhY3RpdmVDbGFzcyk7DQogICAgfQ0KICAgIGlmIChjYi5jYW5jZWxsZWQpIHsNCiAgICAgIGlmIChleHBlY3RzQ1NTKSB7DQogICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgc3RhcnRDbGFzcyk7DQogICAgICB9DQogICAgICBlbnRlckNhbmNlbGxlZEhvb2sgJiYgZW50ZXJDYW5jZWxsZWRIb29rKGVsKTsNCiAgICB9IGVsc2Ugew0KICAgICAgYWZ0ZXJFbnRlckhvb2sgJiYgYWZ0ZXJFbnRlckhvb2soZWwpOw0KICAgIH0NCiAgICBlbC5fZW50ZXJDYiA9IG51bGw7DQogIH0pOw0KDQogIGlmICghdm5vZGUuZGF0YS5zaG93KSB7DQogICAgLy8gcmVtb3ZlIHBlbmRpbmcgbGVhdmUgZWxlbWVudCBvbiBlbnRlciBieSBpbmplY3RpbmcgYW4gaW5zZXJ0IGhvb2sNCiAgICBtZXJnZVZOb2RlSG9vayh2bm9kZS5kYXRhLmhvb2sgfHwgKHZub2RlLmRhdGEuaG9vayA9IHt9KSwgJ2luc2VydCcsIGZ1bmN0aW9uICgpIHsNCiAgICAgIHZhciBwYXJlbnQgPSBlbC5wYXJlbnROb2RlOw0KICAgICAgdmFyIHBlbmRpbmdOb2RlID0gcGFyZW50ICYmIHBhcmVudC5fcGVuZGluZyAmJiBwYXJlbnQuX3BlbmRpbmdbdm5vZGUua2V5XTsNCiAgICAgIGlmIChwZW5kaW5nTm9kZSAmJg0KICAgICAgICAgIHBlbmRpbmdOb2RlLmNvbnRleHQgPT09IHZub2RlLmNvbnRleHQgJiYNCiAgICAgICAgICBwZW5kaW5nTm9kZS50YWcgPT09IHZub2RlLnRhZyAmJg0KICAgICAgICAgIHBlbmRpbmdOb2RlLmVsbS5fbGVhdmVDYikgew0KICAgICAgICBwZW5kaW5nTm9kZS5lbG0uX2xlYXZlQ2IoKTsNCiAgICAgIH0NCiAgICAgIGVudGVySG9vayAmJiBlbnRlckhvb2soZWwsIGNiKTsNCiAgICB9LCAndHJhbnNpdGlvbi1pbnNlcnQnKTsNCiAgfQ0KDQogIC8vIHN0YXJ0IGVudGVyIHRyYW5zaXRpb24NCiAgYmVmb3JlRW50ZXJIb29rICYmIGJlZm9yZUVudGVySG9vayhlbCk7DQogIGlmIChleHBlY3RzQ1NTKSB7DQogICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBzdGFydENsYXNzKTsNCiAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGFjdGl2ZUNsYXNzKTsNCiAgICBuZXh0RnJhbWUoZnVuY3Rpb24gKCkgew0KICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBzdGFydENsYXNzKTsNCiAgICAgIGlmICghY2IuY2FuY2VsbGVkICYmICF1c2VyV2FudHNDb250cm9sKSB7DQogICAgICAgIHdoZW5UcmFuc2l0aW9uRW5kcyhlbCwgdHlwZSwgY2IpOw0KICAgICAgfQ0KICAgIH0pOw0KICB9DQoNCiAgaWYgKHZub2RlLmRhdGEuc2hvdykgew0KICAgIGVudGVySG9vayAmJiBlbnRlckhvb2soZWwsIGNiKTsNCiAgfQ0KDQogIGlmICghZXhwZWN0c0NTUyAmJiAhdXNlcldhbnRzQ29udHJvbCkgew0KICAgIGNiKCk7DQogIH0NCn0NCg0KZnVuY3Rpb24gbGVhdmUgKHZub2RlLCBybSkgew0KICB2YXIgZWwgPSB2bm9kZS5lbG07DQoNCiAgLy8gY2FsbCBlbnRlciBjYWxsYmFjayBub3cNCiAgaWYgKGVsLl9lbnRlckNiKSB7DQogICAgZWwuX2VudGVyQ2IuY2FuY2VsbGVkID0gdHJ1ZTsNCiAgICBlbC5fZW50ZXJDYigpOw0KICB9DQoNCiAgdmFyIGRhdGEgPSByZXNvbHZlVHJhbnNpdGlvbih2bm9kZS5kYXRhLnRyYW5zaXRpb24pOw0KICBpZiAoIWRhdGEpIHsNCiAgICByZXR1cm4gcm0oKQ0KICB9DQoNCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovDQogIGlmIChlbC5fbGVhdmVDYiB8fCBlbC5ub2RlVHlwZSAhPT0gMSkgew0KICAgIHJldHVybg0KICB9DQoNCiAgdmFyIGNzcyA9IGRhdGEuY3NzOw0KICB2YXIgdHlwZSA9IGRhdGEudHlwZTsNCiAgdmFyIGxlYXZlQ2xhc3MgPSBkYXRhLmxlYXZlQ2xhc3M7DQogIHZhciBsZWF2ZUFjdGl2ZUNsYXNzID0gZGF0YS5sZWF2ZUFjdGl2ZUNsYXNzOw0KICB2YXIgYmVmb3JlTGVhdmUgPSBkYXRhLmJlZm9yZUxlYXZlOw0KICB2YXIgbGVhdmUgPSBkYXRhLmxlYXZlOw0KICB2YXIgYWZ0ZXJMZWF2ZSA9IGRhdGEuYWZ0ZXJMZWF2ZTsNCiAgdmFyIGxlYXZlQ2FuY2VsbGVkID0gZGF0YS5sZWF2ZUNhbmNlbGxlZDsNCiAgdmFyIGRlbGF5TGVhdmUgPSBkYXRhLmRlbGF5TGVhdmU7DQoNCiAgdmFyIGV4cGVjdHNDU1MgPSBjc3MgIT09IGZhbHNlICYmICFpc0lFOTsNCiAgdmFyIHVzZXJXYW50c0NvbnRyb2wgPQ0KICAgIGxlYXZlICYmDQogICAgLy8gbGVhdmUgaG9vayBtYXkgYmUgYSBib3VuZCBtZXRob2Qgd2hpY2ggZXhwb3Nlcw0KICAgIC8vIHRoZSBsZW5ndGggb2Ygb3JpZ2luYWwgZm4gYXMgX2xlbmd0aA0KICAgIChsZWF2ZS5fbGVuZ3RoIHx8IGxlYXZlLmxlbmd0aCkgPiAxOw0KDQogIHZhciBjYiA9IGVsLl9sZWF2ZUNiID0gb25jZShmdW5jdGlvbiAoKSB7DQogICAgaWYgKGVsLnBhcmVudE5vZGUgJiYgZWwucGFyZW50Tm9kZS5fcGVuZGluZykgew0KICAgICAgZWwucGFyZW50Tm9kZS5fcGVuZGluZ1t2bm9kZS5rZXldID0gbnVsbDsNCiAgICB9DQogICAgaWYgKGV4cGVjdHNDU1MpIHsNCiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVBY3RpdmVDbGFzcyk7DQogICAgfQ0KICAgIGlmIChjYi5jYW5jZWxsZWQpIHsNCiAgICAgIGlmIChleHBlY3RzQ1NTKSB7DQogICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVDbGFzcyk7DQogICAgICB9DQogICAgICBsZWF2ZUNhbmNlbGxlZCAmJiBsZWF2ZUNhbmNlbGxlZChlbCk7DQogICAgfSBlbHNlIHsNCiAgICAgIHJtKCk7DQogICAgICBhZnRlckxlYXZlICYmIGFmdGVyTGVhdmUoZWwpOw0KICAgIH0NCiAgICBlbC5fbGVhdmVDYiA9IG51bGw7DQogIH0pOw0KDQogIGlmIChkZWxheUxlYXZlKSB7DQogICAgZGVsYXlMZWF2ZShwZXJmb3JtTGVhdmUpOw0KICB9IGVsc2Ugew0KICAgIHBlcmZvcm1MZWF2ZSgpOw0KICB9DQoNCiAgZnVuY3Rpb24gcGVyZm9ybUxlYXZlICgpIHsNCiAgICAvLyB0aGUgZGVsYXllZCBsZWF2ZSBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gY2FuY2VsbGVkDQogICAgaWYgKGNiLmNhbmNlbGxlZCkgew0KICAgICAgcmV0dXJuDQogICAgfQ0KICAgIC8vIHJlY29yZCBsZWF2aW5nIGVsZW1lbnQNCiAgICBpZiAoIXZub2RlLmRhdGEuc2hvdykgew0KICAgICAgKGVsLnBhcmVudE5vZGUuX3BlbmRpbmcgfHwgKGVsLnBhcmVudE5vZGUuX3BlbmRpbmcgPSB7fSkpW3Zub2RlLmtleV0gPSB2bm9kZTsNCiAgICB9DQogICAgYmVmb3JlTGVhdmUgJiYgYmVmb3JlTGVhdmUoZWwpOw0KICAgIGlmIChleHBlY3RzQ1NTKSB7DQogICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQ2xhc3MpOw0KICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUFjdGl2ZUNsYXNzKTsNCiAgICAgIG5leHRGcmFtZShmdW5jdGlvbiAoKSB7DQogICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVDbGFzcyk7DQogICAgICAgIGlmICghY2IuY2FuY2VsbGVkICYmICF1c2VyV2FudHNDb250cm9sKSB7DQogICAgICAgICAgd2hlblRyYW5zaXRpb25FbmRzKGVsLCB0eXBlLCBjYik7DQogICAgICAgIH0NCiAgICAgIH0pOw0KICAgIH0NCiAgICBsZWF2ZSAmJiBsZWF2ZShlbCwgY2IpOw0KICAgIGlmICghZXhwZWN0c0NTUyAmJiAhdXNlcldhbnRzQ29udHJvbCkgew0KICAgICAgY2IoKTsNCiAgICB9DQogIH0NCn0NCg0KZnVuY3Rpb24gcmVzb2x2ZVRyYW5zaXRpb24gKGRlZiQkMSkgew0KICBpZiAoIWRlZiQkMSkgew0KICAgIHJldHVybg0KICB9DQogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovDQogIGlmICh0eXBlb2YgZGVmJCQxID09PSAnb2JqZWN0Jykgew0KICAgIHZhciByZXMgPSB7fTsNCiAgICBpZiAoZGVmJCQxLmNzcyAhPT0gZmFsc2UpIHsNCiAgICAgIGV4dGVuZChyZXMsIGF1dG9Dc3NUcmFuc2l0aW9uKGRlZiQkMS5uYW1lIHx8ICd2JykpOw0KICAgIH0NCiAgICBleHRlbmQocmVzLCBkZWYkJDEpOw0KICAgIHJldHVybiByZXMNCiAgfSBlbHNlIGlmICh0eXBlb2YgZGVmJCQxID09PSAnc3RyaW5nJykgew0KICAgIHJldHVybiBhdXRvQ3NzVHJhbnNpdGlvbihkZWYkJDEpDQogIH0NCn0NCg0KdmFyIGF1dG9Dc3NUcmFuc2l0aW9uID0gY2FjaGVkKGZ1bmN0aW9uIChuYW1lKSB7DQogIHJldHVybiB7DQogICAgZW50ZXJDbGFzczogKG5hbWUgKyAiLWVudGVyIiksDQogICAgbGVhdmVDbGFzczogKG5hbWUgKyAiLWxlYXZlIiksDQogICAgYXBwZWFyQ2xhc3M6IChuYW1lICsgIi1lbnRlciIpLA0KICAgIGVudGVyQWN0aXZlQ2xhc3M6IChuYW1lICsgIi1lbnRlci1hY3RpdmUiKSwNCiAgICBsZWF2ZUFjdGl2ZUNsYXNzOiAobmFtZSArICItbGVhdmUtYWN0aXZlIiksDQogICAgYXBwZWFyQWN0aXZlQ2xhc3M6IChuYW1lICsgIi1lbnRlci1hY3RpdmUiKQ0KICB9DQp9KTsNCg0KZnVuY3Rpb24gb25jZSAoZm4pIHsNCiAgdmFyIGNhbGxlZCA9IGZhbHNlOw0KICByZXR1cm4gZnVuY3Rpb24gKCkgew0KICAgIGlmICghY2FsbGVkKSB7DQogICAgICBjYWxsZWQgPSB0cnVlOw0KICAgICAgZm4oKTsNCiAgICB9DQogIH0NCn0NCg0KZnVuY3Rpb24gX2VudGVyIChfLCB2bm9kZSkgew0KICBpZiAoIXZub2RlLmRhdGEuc2hvdykgew0KICAgIGVudGVyKHZub2RlKTsNCiAgfQ0KfQ0KDQp2YXIgdHJhbnNpdGlvbiA9IGluQnJvd3NlciA/IHsNCiAgY3JlYXRlOiBfZW50ZXIsDQogIGFjdGl2YXRlOiBfZW50ZXIsDQogIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlICh2bm9kZSwgcm0pIHsNCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLw0KICAgIGlmICghdm5vZGUuZGF0YS5zaG93KSB7DQogICAgICBsZWF2ZSh2bm9kZSwgcm0pOw0KICAgIH0gZWxzZSB7DQogICAgICBybSgpOw0KICAgIH0NCiAgfQ0KfSA6IHt9Ow0KDQp2YXIgcGxhdGZvcm1Nb2R1bGVzID0gWw0KICBhdHRycywNCiAga2xhc3MsDQogIGV2ZW50cywNCiAgZG9tUHJvcHMsDQogIHN0eWxlLA0KICB0cmFuc2l0aW9uDQpdOw0KDQovKiAgKi8NCg0KLy8gdGhlIGRpcmVjdGl2ZSBtb2R1bGUgc2hvdWxkIGJlIGFwcGxpZWQgbGFzdCwgYWZ0ZXIgYWxsDQovLyBidWlsdC1pbiBtb2R1bGVzIGhhdmUgYmVlbiBhcHBsaWVkLg0KdmFyIG1vZHVsZXMgPSBwbGF0Zm9ybU1vZHVsZXMuY29uY2F0KGJhc2VNb2R1bGVzKTsNCg0KdmFyIHBhdGNoJDEgPSBjcmVhdGVQYXRjaEZ1bmN0aW9uKHsgbm9kZU9wczogbm9kZU9wcywgbW9kdWxlczogbW9kdWxlcyB9KTsNCg0KLyoqDQogKiBOb3QgdHlwZSBjaGVja2luZyB0aGlzIGZpbGUgYmVjYXVzZSBmbG93IGRvZXNuJ3QgbGlrZSBhdHRhY2hpbmcNCiAqIHByb3BlcnRpZXMgdG8gRWxlbWVudHMuDQogKi8NCg0KdmFyIG1vZGVsYWJsZVRhZ1JFID0gL15pbnB1dHxzZWxlY3R8dGV4dGFyZWF8dnVlLWNvbXBvbmVudC1bMC05XSsoLVswLTlhLXpBLVpfLV0qKT8kLzsNCg0KLyogaXN0YW5idWwgaWdub3JlIGlmICovDQppZiAoaXNJRTkpIHsNCiAgLy8gaHR0cDovL3d3dy5tYXR0czQxMS5jb20vcG9zdC9pbnRlcm5ldC1leHBsb3Jlci05LW9uaW5wdXQvDQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3NlbGVjdGlvbmNoYW5nZScsIGZ1bmN0aW9uICgpIHsNCiAgICB2YXIgZWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50Ow0KICAgIGlmIChlbCAmJiBlbC52bW9kZWwpIHsNCiAgICAgIHRyaWdnZXIoZWwsICdpbnB1dCcpOw0KICAgIH0NCiAgfSk7DQp9DQoNCnZhciBtb2RlbCA9IHsNCiAgaW5zZXJ0ZWQ6IGZ1bmN0aW9uIGluc2VydGVkIChlbCwgYmluZGluZywgdm5vZGUpIHsNCiAgICB7DQogICAgICBpZiAoIW1vZGVsYWJsZVRhZ1JFLnRlc3Qodm5vZGUudGFnKSkgew0KICAgICAgICB3YXJuKA0KICAgICAgICAgICJ2LW1vZGVsIGlzIG5vdCBzdXBwb3J0ZWQgb24gZWxlbWVudCB0eXBlOiA8IiArICh2bm9kZS50YWcpICsgIj4uICIgKw0KICAgICAgICAgICdJZiB5b3UgYXJlIHdvcmtpbmcgd2l0aCBjb250ZW50ZWRpdGFibGUsIGl0XCdzIHJlY29tbWVuZGVkIHRvICcgKw0KICAgICAgICAgICd3cmFwIGEgbGlicmFyeSBkZWRpY2F0ZWQgZm9yIHRoYXQgcHVycG9zZSBpbnNpZGUgYSBjdXN0b20gY29tcG9uZW50LicsDQogICAgICAgICAgdm5vZGUuY29udGV4dA0KICAgICAgICApOw0KICAgICAgfQ0KICAgIH0NCiAgICBpZiAodm5vZGUudGFnID09PSAnc2VsZWN0Jykgew0KICAgICAgdmFyIGNiID0gZnVuY3Rpb24gKCkgew0KICAgICAgICBzZXRTZWxlY3RlZChlbCwgYmluZGluZywgdm5vZGUuY29udGV4dCk7DQogICAgICB9Ow0KICAgICAgY2IoKTsNCiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLw0KICAgICAgaWYgKGlzSUUgfHwgaXNFZGdlKSB7DQogICAgICAgIHNldFRpbWVvdXQoY2IsIDApOw0KICAgICAgfQ0KICAgIH0gZWxzZSBpZiAoDQogICAgICAodm5vZGUudGFnID09PSAndGV4dGFyZWEnIHx8IGVsLnR5cGUgPT09ICd0ZXh0JykgJiYNCiAgICAgICFiaW5kaW5nLm1vZGlmaWVycy5sYXp5DQogICAgKSB7DQogICAgICBpZiAoIWlzQW5kcm9pZCkgew0KICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjb21wb3NpdGlvbnN0YXJ0Jywgb25Db21wb3NpdGlvblN0YXJ0KTsNCiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY29tcG9zaXRpb25lbmQnLCBvbkNvbXBvc2l0aW9uRW5kKTsNCiAgICAgIH0NCiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLw0KICAgICAgaWYgKGlzSUU5KSB7DQogICAgICAgIGVsLnZtb2RlbCA9IHRydWU7DQogICAgICB9DQogICAgfQ0KICB9LA0KICBjb21wb25lbnRVcGRhdGVkOiBmdW5jdGlvbiBjb21wb25lbnRVcGRhdGVkIChlbCwgYmluZGluZywgdm5vZGUpIHsNCiAgICBpZiAodm5vZGUudGFnID09PSAnc2VsZWN0Jykgew0KICAgICAgc2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZub2RlLmNvbnRleHQpOw0KICAgICAgLy8gaW4gY2FzZSB0aGUgb3B0aW9ucyByZW5kZXJlZCBieSB2LWZvciBoYXZlIGNoYW5nZWQsDQogICAgICAvLyBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHZhbHVlIGlzIG91dC1vZi1zeW5jIHdpdGggdGhlIHJlbmRlcmVkIG9wdGlvbnMuDQogICAgICAvLyBkZXRlY3Qgc3VjaCBjYXNlcyBhbmQgZmlsdGVyIG91dCB2YWx1ZXMgdGhhdCBubyBsb25nZXIgaGFzIGEgbWF0Y2hpbmcNCiAgICAgIC8vIG9wdGlvbiBpbiB0aGUgRE9NLg0KICAgICAgdmFyIG5lZWRSZXNldCA9IGVsLm11bHRpcGxlDQogICAgICAgID8gYmluZGluZy52YWx1ZS5zb21lKGZ1bmN0aW9uICh2KSB7IHJldHVybiBoYXNOb01hdGNoaW5nT3B0aW9uKHYsIGVsLm9wdGlvbnMpOyB9KQ0KICAgICAgICA6IGJpbmRpbmcudmFsdWUgIT09IGJpbmRpbmcub2xkVmFsdWUgJiYgaGFzTm9NYXRjaGluZ09wdGlvbihiaW5kaW5nLnZhbHVlLCBlbC5vcHRpb25zKTsNCiAgICAgIGlmIChuZWVkUmVzZXQpIHsNCiAgICAgICAgdHJpZ2dlcihlbCwgJ2NoYW5nZScpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfTsNCg0KZnVuY3Rpb24gc2V0U2VsZWN0ZWQgKGVsLCBiaW5kaW5nLCB2bSkgew0KICB2YXIgdmFsdWUgPSBiaW5kaW5nLnZhbHVlOw0KICB2YXIgaXNNdWx0aXBsZSA9IGVsLm11bHRpcGxlOw0KICBpZiAoaXNNdWx0aXBsZSAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsNCiAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigNCiAgICAgICI8c2VsZWN0IG11bHRpcGxlIHYtbW9kZWw9XCIiICsgKGJpbmRpbmcuZXhwcmVzc2lvbikgKyAiXCI+ICIgKw0KICAgICAgImV4cGVjdHMgYW4gQXJyYXkgdmFsdWUgZm9yIGl0cyBiaW5kaW5nLCBidXQgZ290ICIgKyAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKS5zbGljZSg4LCAtMSkpLA0KICAgICAgdm0NCiAgICApOw0KICAgIHJldHVybg0KICB9DQogIHZhciBzZWxlY3RlZCwgb3B0aW9uOw0KICBmb3IgKHZhciBpID0gMCwgbCA9IGVsLm9wdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7DQogICAgb3B0aW9uID0gZWwub3B0aW9uc1tpXTsNCiAgICBpZiAoaXNNdWx0aXBsZSkgew0KICAgICAgc2VsZWN0ZWQgPSBsb29zZUluZGV4T2YodmFsdWUsIGdldFZhbHVlKG9wdGlvbikpID4gLTE7DQogICAgICBpZiAob3B0aW9uLnNlbGVjdGVkICE9PSBzZWxlY3RlZCkgew0KICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBzZWxlY3RlZDsNCiAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgaWYgKGxvb3NlRXF1YWwoZ2V0VmFsdWUob3B0aW9uKSwgdmFsdWUpKSB7DQogICAgICAgIGlmIChlbC5zZWxlY3RlZEluZGV4ICE9PSBpKSB7DQogICAgICAgICAgZWwuc2VsZWN0ZWRJbmRleCA9IGk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgfQ0KICB9DQogIGlmICghaXNNdWx0aXBsZSkgew0KICAgIGVsLnNlbGVjdGVkSW5kZXggPSAtMTsNCiAgfQ0KfQ0KDQpmdW5jdGlvbiBoYXNOb01hdGNoaW5nT3B0aW9uICh2YWx1ZSwgb3B0aW9ucykgew0KICBmb3IgKHZhciBpID0gMCwgbCA9IG9wdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7DQogICAgaWYgKGxvb3NlRXF1YWwoZ2V0VmFsdWUob3B0aW9uc1tpXSksIHZhbHVlKSkgew0KICAgICAgcmV0dXJuIGZhbHNlDQogICAgfQ0KICB9DQogIHJldHVybiB0cnVlDQp9DQoNCmZ1bmN0aW9uIGdldFZhbHVlIChvcHRpb24pIHsNCiAgcmV0dXJuICdfdmFsdWUnIGluIG9wdGlvbg0KICAgID8gb3B0aW9uLl92YWx1ZQ0KICAgIDogb3B0aW9uLnZhbHVlDQp9DQoNCmZ1bmN0aW9uIG9uQ29tcG9zaXRpb25TdGFydCAoZSkgew0KICBlLnRhcmdldC5jb21wb3NpbmcgPSB0cnVlOw0KfQ0KDQpmdW5jdGlvbiBvbkNvbXBvc2l0aW9uRW5kIChlKSB7DQogIGUudGFyZ2V0LmNvbXBvc2luZyA9IGZhbHNlOw0KICB0cmlnZ2VyKGUudGFyZ2V0LCAnaW5wdXQnKTsNCn0NCg0KZnVuY3Rpb24gdHJpZ2dlciAoZWwsIHR5cGUpIHsNCiAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnSFRNTEV2ZW50cycpOw0KICBlLmluaXRFdmVudCh0eXBlLCB0cnVlLCB0cnVlKTsNCiAgZWwuZGlzcGF0Y2hFdmVudChlKTsNCn0NCg0KLyogICovDQoNCi8vIHJlY3Vyc2l2ZWx5IHNlYXJjaCBmb3IgcG9zc2libGUgdHJhbnNpdGlvbiBkZWZpbmVkIGluc2lkZSB0aGUgY29tcG9uZW50IHJvb3QNCmZ1bmN0aW9uIGxvY2F0ZU5vZGUgKHZub2RlKSB7DQogIHJldHVybiB2bm9kZS5jaGlsZCAmJiAoIXZub2RlLmRhdGEgfHwgIXZub2RlLmRhdGEudHJhbnNpdGlvbikNCiAgICA/IGxvY2F0ZU5vZGUodm5vZGUuY2hpbGQuX3Zub2RlKQ0KICAgIDogdm5vZGUNCn0NCg0KdmFyIHNob3cgPSB7DQogIGJpbmQ6IGZ1bmN0aW9uIGJpbmQgKGVsLCByZWYsIHZub2RlKSB7DQogICAgdmFyIHZhbHVlID0gcmVmLnZhbHVlOw0KDQogICAgdm5vZGUgPSBsb2NhdGVOb2RlKHZub2RlKTsNCiAgICB2YXIgdHJhbnNpdGlvbiA9IHZub2RlLmRhdGEgJiYgdm5vZGUuZGF0YS50cmFuc2l0aW9uOw0KICAgIGlmICh2YWx1ZSAmJiB0cmFuc2l0aW9uICYmICFpc0lFOSkgew0KICAgICAgZW50ZXIodm5vZGUpOw0KICAgIH0NCiAgICB2YXIgb3JpZ2luYWxEaXNwbGF5ID0gZWwuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnID8gJycgOiBlbC5zdHlsZS5kaXNwbGF5Ow0KICAgIGVsLnN0eWxlLmRpc3BsYXkgPSB2YWx1ZSA/IG9yaWdpbmFsRGlzcGxheSA6ICdub25lJzsNCiAgICBlbC5fX3ZPcmlnaW5hbERpc3BsYXkgPSBvcmlnaW5hbERpc3BsYXk7DQogIH0sDQogIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlIChlbCwgcmVmLCB2bm9kZSkgew0KICAgIHZhciB2YWx1ZSA9IHJlZi52YWx1ZTsNCiAgICB2YXIgb2xkVmFsdWUgPSByZWYub2xkVmFsdWU7DQoNCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8NCiAgICBpZiAodmFsdWUgPT09IG9sZFZhbHVlKSB7IHJldHVybiB9DQogICAgdm5vZGUgPSBsb2NhdGVOb2RlKHZub2RlKTsNCiAgICB2YXIgdHJhbnNpdGlvbiA9IHZub2RlLmRhdGEgJiYgdm5vZGUuZGF0YS50cmFuc2l0aW9uOw0KICAgIGlmICh0cmFuc2l0aW9uICYmICFpc0lFOSkgew0KICAgICAgaWYgKHZhbHVlKSB7DQogICAgICAgIGVudGVyKHZub2RlKTsNCiAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9IGVsLl9fdk9yaWdpbmFsRGlzcGxheTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGxlYXZlKHZub2RlLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCiAgICAgICAgfSk7DQogICAgICB9DQogICAgfSBlbHNlIHsNCiAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSB2YWx1ZSA/IGVsLl9fdk9yaWdpbmFsRGlzcGxheSA6ICdub25lJzsNCiAgICB9DQogIH0NCn07DQoNCnZhciBwbGF0Zm9ybURpcmVjdGl2ZXMgPSB7DQogIG1vZGVsOiBtb2RlbCwNCiAgc2hvdzogc2hvdw0KfTsNCg0KLyogICovDQoNCi8vIFByb3ZpZGVzIHRyYW5zaXRpb24gc3VwcG9ydCBmb3IgYSBzaW5nbGUgZWxlbWVudC9jb21wb25lbnQuDQovLyBzdXBwb3J0cyB0cmFuc2l0aW9uIG1vZGUgKG91dC1pbiAvIGluLW91dCkNCg0KdmFyIHRyYW5zaXRpb25Qcm9wcyA9IHsNCiAgbmFtZTogU3RyaW5nLA0KICBhcHBlYXI6IEJvb2xlYW4sDQogIGNzczogQm9vbGVhbiwNCiAgbW9kZTogU3RyaW5nLA0KICB0eXBlOiBTdHJpbmcsDQogIGVudGVyQ2xhc3M6IFN0cmluZywNCiAgbGVhdmVDbGFzczogU3RyaW5nLA0KICBlbnRlckFjdGl2ZUNsYXNzOiBTdHJpbmcsDQogIGxlYXZlQWN0aXZlQ2xhc3M6IFN0cmluZywNCiAgYXBwZWFyQ2xhc3M6IFN0cmluZywNCiAgYXBwZWFyQWN0aXZlQ2xhc3M6IFN0cmluZw0KfTsNCg0KLy8gaW4gY2FzZSB0aGUgY2hpbGQgaXMgYWxzbyBhbiBhYnN0cmFjdCBjb21wb25lbnQsIGUuZy4gPGtlZXAtYWxpdmU+DQovLyB3ZSB3YW50IHRvIHJlY3Vyc2l2ZWx5IHJldHJpZXZlIHRoZSByZWFsIGNvbXBvbmVudCB0byBiZSByZW5kZXJlZA0KZnVuY3Rpb24gZ2V0UmVhbENoaWxkICh2bm9kZSkgew0KICB2YXIgY29tcE9wdGlvbnMgPSB2bm9kZSAmJiB2bm9kZS5jb21wb25lbnRPcHRpb25zOw0KICBpZiAoY29tcE9wdGlvbnMgJiYgY29tcE9wdGlvbnMuQ3Rvci5vcHRpb25zLmFic3RyYWN0KSB7DQogICAgcmV0dXJuIGdldFJlYWxDaGlsZChnZXRGaXJzdENvbXBvbmVudENoaWxkKGNvbXBPcHRpb25zLmNoaWxkcmVuKSkNCiAgfSBlbHNlIHsNCiAgICByZXR1cm4gdm5vZGUNCiAgfQ0KfQ0KDQpmdW5jdGlvbiBleHRyYWN0VHJhbnNpdGlvbkRhdGEgKGNvbXApIHsNCiAgdmFyIGRhdGEgPSB7fTsNCiAgdmFyIG9wdGlvbnMgPSBjb21wLiRvcHRpb25zOw0KICAvLyBwcm9wcw0KICBmb3IgKHZhciBrZXkgaW4gb3B0aW9ucy5wcm9wc0RhdGEpIHsNCiAgICBkYXRhW2tleV0gPSBjb21wW2tleV07DQogIH0NCiAgLy8gZXZlbnRzLg0KICAvLyBleHRyYWN0IGxpc3RlbmVycyBhbmQgcGFzcyB0aGVtIGRpcmVjdGx5IHRvIHRoZSB0cmFuc2l0aW9uIG1ldGhvZHMNCiAgdmFyIGxpc3RlbmVycyA9IG9wdGlvbnMuX3BhcmVudExpc3RlbmVyczsNCiAgZm9yICh2YXIga2V5JDEgaW4gbGlzdGVuZXJzKSB7DQogICAgZGF0YVtjYW1lbGl6ZShrZXkkMSldID0gbGlzdGVuZXJzW2tleSQxXS5mbjsNCiAgfQ0KICByZXR1cm4gZGF0YQ0KfQ0KDQpmdW5jdGlvbiBwbGFjZWhvbGRlciAoaCwgcmF3Q2hpbGQpIHsNCiAgcmV0dXJuIC9cZC1rZWVwLWFsaXZlJC8udGVzdChyYXdDaGlsZC50YWcpDQogICAgPyBoKCdrZWVwLWFsaXZlJykNCiAgICA6IG51bGwNCn0NCg0KZnVuY3Rpb24gaGFzUGFyZW50VHJhbnNpdGlvbiAodm5vZGUpIHsNCiAgd2hpbGUgKCh2bm9kZSA9IHZub2RlLnBhcmVudCkpIHsNCiAgICBpZiAodm5vZGUuZGF0YS50cmFuc2l0aW9uKSB7DQogICAgICByZXR1cm4gdHJ1ZQ0KICAgIH0NCiAgfQ0KfQ0KDQp2YXIgVHJhbnNpdGlvbiA9IHsNCiAgbmFtZTogJ3RyYW5zaXRpb24nLA0KICBwcm9wczogdHJhbnNpdGlvblByb3BzLA0KICBhYnN0cmFjdDogdHJ1ZSwNCiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKGgpIHsNCiAgICB2YXIgdGhpcyQxID0gdGhpczsNCg0KICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuJHNsb3RzLmRlZmF1bHQ7DQogICAgaWYgKCFjaGlsZHJlbikgew0KICAgICAgcmV0dXJuDQogICAgfQ0KDQogICAgLy8gZmlsdGVyIG91dCB0ZXh0IG5vZGVzIChwb3NzaWJsZSB3aGl0ZXNwYWNlcykNCiAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLmZpbHRlcihmdW5jdGlvbiAoYykgeyByZXR1cm4gYy50YWc7IH0pOw0KICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLw0KICAgIGlmICghY2hpbGRyZW4ubGVuZ3RoKSB7DQogICAgICByZXR1cm4NCiAgICB9DQoNCiAgICAvLyB3YXJuIG11bHRpcGxlIGVsZW1lbnRzDQogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBjaGlsZHJlbi5sZW5ndGggPiAxKSB7DQogICAgICB3YXJuKA0KICAgICAgICAnPHRyYW5zaXRpb24+IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBzaW5nbGUgZWxlbWVudC4gVXNlICcgKw0KICAgICAgICAnPHRyYW5zaXRpb24tZ3JvdXA+IGZvciBsaXN0cy4nLA0KICAgICAgICB0aGlzLiRwYXJlbnQNCiAgICAgICk7DQogICAgfQ0KDQogICAgdmFyIG1vZGUgPSB0aGlzLm1vZGU7DQoNCiAgICAvLyB3YXJuIGludmFsaWQgbW9kZQ0KICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYNCiAgICAgICAgbW9kZSAmJiBtb2RlICE9PSAnaW4tb3V0JyAmJiBtb2RlICE9PSAnb3V0LWluJykgew0KICAgICAgd2FybigNCiAgICAgICAgJ2ludmFsaWQgPHRyYW5zaXRpb24+IG1vZGU6ICcgKyBtb2RlLA0KICAgICAgICB0aGlzLiRwYXJlbnQNCiAgICAgICk7DQogICAgfQ0KDQogICAgdmFyIHJhd0NoaWxkID0gY2hpbGRyZW5bMF07DQoNCiAgICAvLyBpZiB0aGlzIGlzIGEgY29tcG9uZW50IHJvb3Qgbm9kZSBhbmQgdGhlIGNvbXBvbmVudCdzDQogICAgLy8gcGFyZW50IGNvbnRhaW5lciBub2RlIGFsc28gaGFzIHRyYW5zaXRpb24sIHNraXAuDQogICAgaWYgKGhhc1BhcmVudFRyYW5zaXRpb24odGhpcy4kdm5vZGUpKSB7DQogICAgICByZXR1cm4gcmF3Q2hpbGQNCiAgICB9DQoNCiAgICAvLyBhcHBseSB0cmFuc2l0aW9uIGRhdGEgdG8gY2hpbGQNCiAgICAvLyB1c2UgZ2V0UmVhbENoaWxkKCkgdG8gaWdub3JlIGFic3RyYWN0IGNvbXBvbmVudHMgZS5nLiBrZWVwLWFsaXZlDQogICAgdmFyIGNoaWxkID0gZ2V0UmVhbENoaWxkKHJhd0NoaWxkKTsNCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8NCiAgICBpZiAoIWNoaWxkKSB7DQogICAgICByZXR1cm4gcmF3Q2hpbGQNCiAgICB9DQoNCiAgICBpZiAodGhpcy5fbGVhdmluZykgew0KICAgICAgcmV0dXJuIHBsYWNlaG9sZGVyKGgsIHJhd0NoaWxkKQ0KICAgIH0NCg0KICAgIHZhciBrZXkgPSBjaGlsZC5rZXkgPSBjaGlsZC5rZXkgPT0gbnVsbCB8fCBjaGlsZC5pc1N0YXRpYw0KICAgICAgPyAoIl9fdiIgKyAoY2hpbGQudGFnICsgdGhpcy5fdWlkKSArICJfXyIpDQogICAgICA6IGNoaWxkLmtleTsNCiAgICB2YXIgZGF0YSA9IChjaGlsZC5kYXRhIHx8IChjaGlsZC5kYXRhID0ge30pKS50cmFuc2l0aW9uID0gZXh0cmFjdFRyYW5zaXRpb25EYXRhKHRoaXMpOw0KICAgIHZhciBvbGRSYXdDaGlsZCA9IHRoaXMuX3Zub2RlOw0KICAgIHZhciBvbGRDaGlsZCA9IGdldFJlYWxDaGlsZChvbGRSYXdDaGlsZCk7DQoNCiAgICAvLyBtYXJrIHYtc2hvdw0KICAgIC8vIHNvIHRoYXQgdGhlIHRyYW5zaXRpb24gbW9kdWxlIGNhbiBoYW5kIG92ZXIgdGhlIGNvbnRyb2wgdG8gdGhlIGRpcmVjdGl2ZQ0KICAgIGlmIChjaGlsZC5kYXRhLmRpcmVjdGl2ZXMgJiYgY2hpbGQuZGF0YS5kaXJlY3RpdmVzLnNvbWUoZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQubmFtZSA9PT0gJ3Nob3cnOyB9KSkgew0KICAgICAgY2hpbGQuZGF0YS5zaG93ID0gdHJ1ZTsNCiAgICB9DQoNCiAgICBpZiAob2xkQ2hpbGQgJiYgb2xkQ2hpbGQuZGF0YSAmJiBvbGRDaGlsZC5rZXkgIT09IGtleSkgew0KICAgICAgLy8gcmVwbGFjZSBvbGQgY2hpbGQgdHJhbnNpdGlvbiBkYXRhIHdpdGggZnJlc2ggb25lDQogICAgICAvLyBpbXBvcnRhbnQgZm9yIGR5bmFtaWMgdHJhbnNpdGlvbnMhDQogICAgICB2YXIgb2xkRGF0YSA9IG9sZENoaWxkLmRhdGEudHJhbnNpdGlvbiA9IGV4dGVuZCh7fSwgZGF0YSk7DQoNCiAgICAgIC8vIGhhbmRsZSB0cmFuc2l0aW9uIG1vZGUNCiAgICAgIGlmIChtb2RlID09PSAnb3V0LWluJykgew0KICAgICAgICAvLyByZXR1cm4gcGxhY2Vob2xkZXIgbm9kZSBhbmQgcXVldWUgdXBkYXRlIHdoZW4gbGVhdmUgZmluaXNoZXMNCiAgICAgICAgdGhpcy5fbGVhdmluZyA9IHRydWU7DQogICAgICAgIG1lcmdlVk5vZGVIb29rKG9sZERhdGEsICdhZnRlckxlYXZlJywgZnVuY3Rpb24gKCkgew0KICAgICAgICAgIHRoaXMkMS5fbGVhdmluZyA9IGZhbHNlOw0KICAgICAgICAgIHRoaXMkMS4kZm9yY2VVcGRhdGUoKTsNCiAgICAgICAgfSwga2V5KTsNCiAgICAgICAgcmV0dXJuIHBsYWNlaG9sZGVyKGgsIHJhd0NoaWxkKQ0KICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAnaW4tb3V0Jykgew0KICAgICAgICB2YXIgZGVsYXllZExlYXZlOw0KICAgICAgICB2YXIgcGVyZm9ybUxlYXZlID0gZnVuY3Rpb24gKCkgeyBkZWxheWVkTGVhdmUoKTsgfTsNCiAgICAgICAgbWVyZ2VWTm9kZUhvb2soZGF0YSwgJ2FmdGVyRW50ZXInLCBwZXJmb3JtTGVhdmUsIGtleSk7DQogICAgICAgIG1lcmdlVk5vZGVIb29rKGRhdGEsICdlbnRlckNhbmNlbGxlZCcsIHBlcmZvcm1MZWF2ZSwga2V5KTsNCiAgICAgICAgbWVyZ2VWTm9kZUhvb2sob2xkRGF0YSwgJ2RlbGF5TGVhdmUnLCBmdW5jdGlvbiAobGVhdmUpIHsNCiAgICAgICAgICBkZWxheWVkTGVhdmUgPSBsZWF2ZTsNCiAgICAgICAgfSwga2V5KTsNCiAgICAgIH0NCiAgICB9DQoNCiAgICByZXR1cm4gcmF3Q2hpbGQNCiAgfQ0KfTsNCg0KLyogICovDQoNCi8vIFByb3ZpZGVzIHRyYW5zaXRpb24gc3VwcG9ydCBmb3IgbGlzdCBpdGVtcy4NCi8vIHN1cHBvcnRzIG1vdmUgdHJhbnNpdGlvbnMgdXNpbmcgdGhlIEZMSVAgdGVjaG5pcXVlLg0KDQovLyBCZWNhdXNlIHRoZSB2ZG9tJ3MgY2hpbGRyZW4gdXBkYXRlIGFsZ29yaXRobSBpcyAidW5zdGFibGUiIC0gaS5lLg0KLy8gaXQgZG9lc24ndCBndWFyYW50ZWUgdGhlIHJlbGF0aXZlIHBvc2l0aW9uaW5nIG9mIHJlbW92ZWQgZWxlbWVudHMsDQovLyB3ZSBmb3JjZSB0cmFuc2l0aW9uLWdyb3VwIHRvIHVwZGF0ZSBpdHMgY2hpbGRyZW4gaW50byB0d28gcGFzc2VzOg0KLy8gaW4gdGhlIGZpcnN0IHBhc3MsIHdlIHJlbW92ZSBhbGwgbm9kZXMgdGhhdCBuZWVkIHRvIGJlIHJlbW92ZWQsDQovLyB0cmlnZ2VyaW5nIHRoZWlyIGxlYXZpbmcgdHJhbnNpdGlvbjsgaW4gdGhlIHNlY29uZCBwYXNzLCB3ZSBpbnNlcnQvbW92ZQ0KLy8gaW50byB0aGUgZmluYWwgZGlzaXJlZCBzdGF0ZS4gVGhpcyB3YXkgaW4gdGhlIHNlY29uZCBwYXNzIHJlbW92ZWQNCi8vIG5vZGVzIHdpbGwgcmVtYWluIHdoZXJlIHRoZXkgc2hvdWxkIGJlLg0KDQp2YXIgcHJvcHMgPSBleHRlbmQoew0KICB0YWc6IFN0cmluZywNCiAgbW92ZUNsYXNzOiBTdHJpbmcNCn0sIHRyYW5zaXRpb25Qcm9wcyk7DQoNCmRlbGV0ZSBwcm9wcy5tb2RlOw0KDQp2YXIgVHJhbnNpdGlvbkdyb3VwID0gew0KICBwcm9wczogcHJvcHMsDQoNCiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKGgpIHsNCiAgICB2YXIgdGFnID0gdGhpcy50YWcgfHwgdGhpcy4kdm5vZGUuZGF0YS50YWcgfHwgJ3NwYW4nOw0KICAgIHZhciBtYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpOw0KICAgIHZhciBwcmV2Q2hpbGRyZW4gPSB0aGlzLnByZXZDaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47DQogICAgdmFyIHJhd0NoaWxkcmVuID0gdGhpcy4kc2xvdHMuZGVmYXVsdCB8fCBbXTsNCiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuID0gW107DQogICAgdmFyIHRyYW5zaXRpb25EYXRhID0gZXh0cmFjdFRyYW5zaXRpb25EYXRhKHRoaXMpOw0KDQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYXdDaGlsZHJlbi5sZW5ndGg7IGkrKykgew0KICAgICAgdmFyIGMgPSByYXdDaGlsZHJlbltpXTsNCiAgICAgIGlmIChjLnRhZykgew0KICAgICAgICBpZiAoYy5rZXkgIT0gbnVsbCAmJiBTdHJpbmcoYy5rZXkpLmluZGV4T2YoJ19fdmxpc3QnKSAhPT0gMCkgew0KICAgICAgICAgIGNoaWxkcmVuLnB1c2goYyk7DQogICAgICAgICAgbWFwW2Mua2V5XSA9IGMNCiAgICAgICAgICA7KGMuZGF0YSB8fCAoYy5kYXRhID0ge30pKS50cmFuc2l0aW9uID0gdHJhbnNpdGlvbkRhdGE7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgdmFyIG9wdHMgPSBjLmNvbXBvbmVudE9wdGlvbnM7DQogICAgICAgICAgdmFyIG5hbWUgPSBvcHRzDQogICAgICAgICAgICA/IChvcHRzLkN0b3Iub3B0aW9ucy5uYW1lIHx8IG9wdHMudGFnKQ0KICAgICAgICAgICAgOiBjLnRhZzsNCiAgICAgICAgICB3YXJuKCgiPHRyYW5zaXRpb24tZ3JvdXA+IGNoaWxkcmVuIG11c3QgYmUga2V5ZWQ6IDwiICsgbmFtZSArICI+IikpOw0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KDQogICAgaWYgKHByZXZDaGlsZHJlbikgew0KICAgICAgdmFyIGtlcHQgPSBbXTsNCiAgICAgIHZhciByZW1vdmVkID0gW107DQogICAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBwcmV2Q2hpbGRyZW4ubGVuZ3RoOyBpJDErKykgew0KICAgICAgICB2YXIgYyQxID0gcHJldkNoaWxkcmVuW2kkMV07DQogICAgICAgIGMkMS5kYXRhLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uRGF0YTsNCiAgICAgICAgYyQxLmRhdGEucG9zID0gYyQxLmVsbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsNCiAgICAgICAgaWYgKG1hcFtjJDEua2V5XSkgew0KICAgICAgICAgIGtlcHQucHVzaChjJDEpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHJlbW92ZWQucHVzaChjJDEpOw0KICAgICAgICB9DQogICAgICB9DQogICAgICB0aGlzLmtlcHQgPSBoKHRhZywgbnVsbCwga2VwdCk7DQogICAgICB0aGlzLnJlbW92ZWQgPSByZW1vdmVkOw0KICAgIH0NCg0KICAgIHJldHVybiBoKHRhZywgbnVsbCwgY2hpbGRyZW4pDQogIH0sDQoNCiAgYmVmb3JlVXBkYXRlOiBmdW5jdGlvbiBiZWZvcmVVcGRhdGUgKCkgew0KICAgIC8vIGZvcmNlIHJlbW92aW5nIHBhc3MNCiAgICB0aGlzLl9fcGF0Y2hfXygNCiAgICAgIHRoaXMuX3Zub2RlLA0KICAgICAgdGhpcy5rZXB0LA0KICAgICAgZmFsc2UsIC8vIGh5ZHJhdGluZw0KICAgICAgdHJ1ZSAvLyByZW1vdmVPbmx5ICghaW1wb3J0YW50LCBhdm9pZHMgdW5uZWNlc3NhcnkgbW92ZXMpDQogICAgKTsNCiAgICB0aGlzLl92bm9kZSA9IHRoaXMua2VwdDsNCiAgfSwNCg0KICB1cGRhdGVkOiBmdW5jdGlvbiB1cGRhdGVkICgpIHsNCiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnByZXZDaGlsZHJlbjsNCiAgICB2YXIgbW92ZUNsYXNzID0gdGhpcy5tb3ZlQ2xhc3MgfHwgKCh0aGlzLm5hbWUgfHwgJ3YnKSArICctbW92ZScpOw0KICAgIGlmICghY2hpbGRyZW4ubGVuZ3RoIHx8ICF0aGlzLmhhc01vdmUoY2hpbGRyZW5bMF0uZWxtLCBtb3ZlQ2xhc3MpKSB7DQogICAgICByZXR1cm4NCiAgICB9DQoNCiAgICAvLyB3ZSBkaXZpZGUgdGhlIHdvcmsgaW50byB0aHJlZSBsb29wcyB0byBhdm9pZCBtaXhpbmcgRE9NIHJlYWRzIGFuZCB3cml0ZXMNCiAgICAvLyBpbiBlYWNoIGl0ZXJhdGlvbiAtIHdoaWNoIGhlbHBzIHByZXZlbnQgbGF5b3V0IHRocmFzaGluZy4NCiAgICBjaGlsZHJlbi5mb3JFYWNoKGNhbGxQZW5kaW5nQ2JzKTsNCiAgICBjaGlsZHJlbi5mb3JFYWNoKHJlY29yZFBvc2l0aW9uKTsNCiAgICBjaGlsZHJlbi5mb3JFYWNoKGFwcGx5VHJhbnNsYXRpb24pOw0KDQogICAgLy8gZm9yY2UgcmVmbG93IHRvIHB1dCBldmVyeXRoaW5nIGluIHBvc2l0aW9uDQogICAgdmFyIGYgPSBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodDsgLy8gZXNsaW50LWRpc2FibGUtbGluZQ0KDQogICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoYykgew0KICAgICAgaWYgKGMuZGF0YS5tb3ZlZCkgew0KICAgICAgICB2YXIgZWwgPSBjLmVsbTsNCiAgICAgICAgdmFyIHMgPSBlbC5zdHlsZTsNCiAgICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBtb3ZlQ2xhc3MpOw0KICAgICAgICBzLnRyYW5zZm9ybSA9IHMuV2Via2l0VHJhbnNmb3JtID0gcy50cmFuc2l0aW9uRHVyYXRpb24gPSAnJzsNCiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcih0cmFuc2l0aW9uRW5kRXZlbnQsIGVsLl9tb3ZlQ2IgPSBmdW5jdGlvbiBjYiAoZSkgew0KICAgICAgICAgIGlmICghZSB8fCAvdHJhbnNmb3JtJC8udGVzdChlLnByb3BlcnR5TmFtZSkpIHsNCiAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJhbnNpdGlvbkVuZEV2ZW50LCBjYik7DQogICAgICAgICAgICBlbC5fbW92ZUNiID0gbnVsbDsNCiAgICAgICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbW92ZUNsYXNzKTsNCiAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgfQ0KICAgIH0pOw0KICB9LA0KDQogIG1ldGhvZHM6IHsNCiAgICBoYXNNb3ZlOiBmdW5jdGlvbiBoYXNNb3ZlIChlbCwgbW92ZUNsYXNzKSB7DQogICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8NCiAgICAgIGlmICghaGFzVHJhbnNpdGlvbikgew0KICAgICAgICByZXR1cm4gZmFsc2UNCiAgICAgIH0NCiAgICAgIGlmICh0aGlzLl9oYXNNb3ZlICE9IG51bGwpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc01vdmUNCiAgICAgIH0NCiAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbW92ZUNsYXNzKTsNCiAgICAgIHZhciBpbmZvID0gZ2V0VHJhbnNpdGlvbkluZm8oZWwpOw0KICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBtb3ZlQ2xhc3MpOw0KICAgICAgcmV0dXJuICh0aGlzLl9oYXNNb3ZlID0gaW5mby5oYXNUcmFuc2Zvcm0pDQogICAgfQ0KICB9DQp9Ow0KDQpmdW5jdGlvbiBjYWxsUGVuZGluZ0NicyAoYykgew0KICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8NCiAgaWYgKGMuZWxtLl9tb3ZlQ2IpIHsNCiAgICBjLmVsbS5fbW92ZUNiKCk7DQogIH0NCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovDQogIGlmIChjLmVsbS5fZW50ZXJDYikgew0KICAgIGMuZWxtLl9lbnRlckNiKCk7DQogIH0NCn0NCg0KZnVuY3Rpb24gcmVjb3JkUG9zaXRpb24gKGMpIHsNCiAgYy5kYXRhLm5ld1BvcyA9IGMuZWxtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOw0KfQ0KDQpmdW5jdGlvbiBhcHBseVRyYW5zbGF0aW9uIChjKSB7DQogIHZhciBvbGRQb3MgPSBjLmRhdGEucG9zOw0KICB2YXIgbmV3UG9zID0gYy5kYXRhLm5ld1BvczsNCiAgdmFyIGR4ID0gb2xkUG9zLmxlZnQgLSBuZXdQb3MubGVmdDsNCiAgdmFyIGR5ID0gb2xkUG9zLnRvcCAtIG5ld1Bvcy50b3A7DQogIGlmIChkeCB8fCBkeSkgew0KICAgIGMuZGF0YS5tb3ZlZCA9IHRydWU7DQogICAgdmFyIHMgPSBjLmVsbS5zdHlsZTsNCiAgICBzLnRyYW5zZm9ybSA9IHMuV2Via2l0VHJhbnNmb3JtID0gInRyYW5zbGF0ZSgiICsgZHggKyAicHgsIiArIGR5ICsgInB4KSI7DQogICAgcy50cmFuc2l0aW9uRHVyYXRpb24gPSAnMHMnOw0KICB9DQp9DQoNCnZhciBwbGF0Zm9ybUNvbXBvbmVudHMgPSB7DQogIFRyYW5zaXRpb246IFRyYW5zaXRpb24sDQogIFRyYW5zaXRpb25Hcm91cDogVHJhbnNpdGlvbkdyb3VwDQp9Ow0KDQovKiAgKi8NCg0KLy8gaW5zdGFsbCBwbGF0Zm9ybSBzcGVjaWZpYyB1dGlscw0KVnVlJDMuY29uZmlnLmlzVW5rbm93bkVsZW1lbnQgPSBpc1Vua25vd25FbGVtZW50Ow0KVnVlJDMuY29uZmlnLmlzUmVzZXJ2ZWRUYWcgPSBpc1Jlc2VydmVkVGFnOw0KVnVlJDMuY29uZmlnLmdldFRhZ05hbWVzcGFjZSA9IGdldFRhZ05hbWVzcGFjZTsNClZ1ZSQzLmNvbmZpZy5tdXN0VXNlUHJvcCA9IG11c3RVc2VQcm9wOw0KDQovLyBpbnN0YWxsIHBsYXRmb3JtIHJ1bnRpbWUgZGlyZWN0aXZlcyAmIGNvbXBvbmVudHMNCmV4dGVuZChWdWUkMy5vcHRpb25zLmRpcmVjdGl2ZXMsIHBsYXRmb3JtRGlyZWN0aXZlcyk7DQpleHRlbmQoVnVlJDMub3B0aW9ucy5jb21wb25lbnRzLCBwbGF0Zm9ybUNvbXBvbmVudHMpOw0KDQovLyBpbnN0YWxsIHBsYXRmb3JtIHBhdGNoIGZ1bmN0aW9uDQpWdWUkMy5wcm90b3R5cGUuX19wYXRjaF9fID0gaW5Ccm93c2VyID8gcGF0Y2gkMSA6IG5vb3A7DQoNCi8vIHdyYXAgbW91bnQNClZ1ZSQzLnByb3RvdHlwZS4kbW91bnQgPSBmdW5jdGlvbiAoDQogIGVsLA0KICBoeWRyYXRpbmcNCikgew0KICBlbCA9IGVsICYmIGluQnJvd3NlciA/IHF1ZXJ5KGVsKSA6IHVuZGVmaW5lZDsNCiAgcmV0dXJuIHRoaXMuX21vdW50KGVsLCBoeWRyYXRpbmcpDQp9Ow0KDQovLyBkZXZ0b29scyBnbG9iYWwgaG9vaw0KLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8NCnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgew0KICBpZiAoY29uZmlnLmRldnRvb2xzKSB7DQogICAgaWYgKGRldnRvb2xzKSB7DQogICAgICBkZXZ0b29scy5lbWl0KCdpbml0JywgVnVlJDMpOw0KICAgIH0gZWxzZSBpZiAoDQogICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYNCiAgICAgIGluQnJvd3NlciAmJiAvQ2hyb21lXC9cZCsvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpDQogICAgKSB7DQogICAgICBjb25zb2xlLmxvZygNCiAgICAgICAgJ0Rvd25sb2FkIHRoZSBWdWUgRGV2dG9vbHMgZm9yIGEgYmV0dGVyIGRldmVsb3BtZW50IGV4cGVyaWVuY2U6XG4nICsNCiAgICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUtZGV2dG9vbHMnDQogICAgICApOw0KICAgIH0NCiAgfQ0KfSwgMCk7DQoNCi8qICAqLw0KDQovLyBjaGVjayB3aGV0aGVyIGN1cnJlbnQgYnJvd3NlciBlbmNvZGVzIGEgY2hhciBpbnNpZGUgYXR0cmlidXRlIHZhbHVlcw0KZnVuY3Rpb24gc2hvdWxkRGVjb2RlIChjb250ZW50LCBlbmNvZGVkKSB7DQogIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCiAgZGl2LmlubmVySFRNTCA9ICI8ZGl2IGE9XCIiICsgY29udGVudCArICJcIj4iOw0KICByZXR1cm4gZGl2LmlubmVySFRNTC5pbmRleE9mKGVuY29kZWQpID4gMA0KfQ0KDQovLyAjMzY2Mw0KLy8gSUUgZW5jb2RlcyBuZXdsaW5lcyBpbnNpZGUgYXR0cmlidXRlIHZhbHVlcyB3aGlsZSBvdGhlciBicm93c2VycyBkb24ndA0KdmFyIHNob3VsZERlY29kZU5ld2xpbmVzID0gaW5Ccm93c2VyID8gc2hvdWxkRGVjb2RlKCdcbicsICcmIzEwOycpIDogZmFsc2U7DQoNCi8qICAqLw0KDQp2YXIgZGVjb2RlcjsNCg0KZnVuY3Rpb24gZGVjb2RlIChodG1sKSB7DQogIGRlY29kZXIgPSBkZWNvZGVyIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KICBkZWNvZGVyLmlubmVySFRNTCA9IGh0bWw7DQogIHJldHVybiBkZWNvZGVyLnRleHRDb250ZW50DQp9DQoNCi8qICAqLw0KDQp2YXIgaXNVbmFyeVRhZyA9IG1ha2VNYXAoDQogICdhcmVhLGJhc2UsYnIsY29sLGVtYmVkLGZyYW1lLGhyLGltZyxpbnB1dCxpc2luZGV4LGtleWdlbiwnICsNCiAgJ2xpbmssbWV0YSxwYXJhbSxzb3VyY2UsdHJhY2ssd2JyJywNCiAgdHJ1ZQ0KKTsNCg0KLy8gRWxlbWVudHMgdGhhdCB5b3UgY2FuLCBpbnRlbnRpb25hbGx5LCBsZWF2ZSBvcGVuDQovLyAoYW5kIHdoaWNoIGNsb3NlIHRoZW1zZWx2ZXMpDQp2YXIgY2FuQmVMZWZ0T3BlblRhZyA9IG1ha2VNYXAoDQogICdjb2xncm91cCxkZCxkdCxsaSxvcHRpb25zLHAsdGQsdGZvb3QsdGgsdGhlYWQsdHIsc291cmNlJywNCiAgdHJ1ZQ0KKTsNCg0KLy8gSFRNTDUgdGFncyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9pbmRpY2VzLmh0bWwjZWxlbWVudHMtMw0KLy8gUGhyYXNpbmcgQ29udGVudCBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9kb20uaHRtbCNwaHJhc2luZy1jb250ZW50DQp2YXIgaXNOb25QaHJhc2luZ1RhZyA9IG1ha2VNYXAoDQogICdhZGRyZXNzLGFydGljbGUsYXNpZGUsYmFzZSxibG9ja3F1b3RlLGJvZHksY2FwdGlvbixjb2wsY29sZ3JvdXAsZGQsJyArDQogICdkZXRhaWxzLGRpYWxvZyxkaXYsZGwsZHQsZmllbGRzZXQsZmlnY2FwdGlvbixmaWd1cmUsZm9vdGVyLGZvcm0sJyArDQogICdoMSxoMixoMyxoNCxoNSxoNixoZWFkLGhlYWRlcixoZ3JvdXAsaHIsaHRtbCxsZWdlbmQsbGksbWVudWl0ZW0sbWV0YSwnICsNCiAgJ29wdGdyb3VwLG9wdGlvbixwYXJhbSxycCxydCxzb3VyY2Usc3R5bGUsc3VtbWFyeSx0Ym9keSx0ZCx0Zm9vdCx0aCx0aGVhZCwnICsNCiAgJ3RpdGxlLHRyLHRyYWNrJywNCiAgdHJ1ZQ0KKTsNCg0KLyoqDQogKiBOb3QgdHlwZS1jaGVja2luZyB0aGlzIGZpbGUgYmVjYXVzZSBpdCdzIG1vc3RseSB2ZW5kb3IgY29kZS4NCiAqLw0KDQovKiENCiAqIEhUTUwgUGFyc2VyIEJ5IEpvaG4gUmVzaWcgKGVqb2huLm9yZykNCiAqIE1vZGlmaWVkIGJ5IEp1cml5ICJrYW5nYXgiIFpheXRzZXYNCiAqIE9yaWdpbmFsIGNvZGUgYnkgRXJpayBBcnZpZHNzb24sIE1vemlsbGEgUHVibGljIExpY2Vuc2UNCiAqIGh0dHA6Ly9lcmlrLmVhZS5uZXQvc2ltcGxlaHRtbHBhcnNlci9zaW1wbGVodG1scGFyc2VyLmpzDQogKi8NCg0KLy8gUmVndWxhciBFeHByZXNzaW9ucyBmb3IgcGFyc2luZyB0YWdzIGFuZCBhdHRyaWJ1dGVzDQp2YXIgc2luZ2xlQXR0cklkZW50aWZpZXIgPSAvKFteXHMiJzw+Lz1dKykvOw0KdmFyIHNpbmdsZUF0dHJBc3NpZ24gPSAvKD86PSkvOw0KdmFyIHNpbmdsZUF0dHJWYWx1ZXMgPSBbDQogIC8vIGF0dHIgdmFsdWUgZG91YmxlIHF1b3Rlcw0KICAvIihbXiJdKikiKy8uc291cmNlLA0KICAvLyBhdHRyIHZhbHVlLCBzaW5nbGUgcXVvdGVzDQogIC8nKFteJ10qKScrLy5zb3VyY2UsDQogIC8vIGF0dHIgdmFsdWUsIG5vIHF1b3Rlcw0KICAvKFteXHMiJz08PmBdKykvLnNvdXJjZQ0KXTsNCnZhciBhdHRyaWJ1dGUgPSBuZXcgUmVnRXhwKA0KICAnXlxccyonICsgc2luZ2xlQXR0cklkZW50aWZpZXIuc291cmNlICsNCiAgJyg/OlxccyooJyArIHNpbmdsZUF0dHJBc3NpZ24uc291cmNlICsgJyknICsNCiAgJ1xccyooPzonICsgc2luZ2xlQXR0clZhbHVlcy5qb2luKCd8JykgKyAnKSk/Jw0KKTsNCg0KLy8gY291bGQgdXNlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy14bWwtbmFtZXMtMTk5OTAxMTQvI05ULVFOYW1lDQovLyBidXQgZm9yIFZ1ZSB0ZW1wbGF0ZXMgd2UgY2FuIGVuZm9yY2UgYSBzaW1wbGUgY2hhcnNldA0KdmFyIG5jbmFtZSA9ICdbYS16QS1aX11bXFx3XFwtXFwuXSonOw0KdmFyIHFuYW1lQ2FwdHVyZSA9ICcoKD86JyArIG5jbmFtZSArICdcXDopPycgKyBuY25hbWUgKyAnKSc7DQp2YXIgc3RhcnRUYWdPcGVuID0gbmV3IFJlZ0V4cCgnXjwnICsgcW5hbWVDYXB0dXJlKTsNCnZhciBzdGFydFRhZ0Nsb3NlID0gL15ccyooXC8/KT4vOw0KdmFyIGVuZFRhZyA9IG5ldyBSZWdFeHAoJ148XFwvJyArIHFuYW1lQ2FwdHVyZSArICdbXj5dKj4nKTsNCnZhciBkb2N0eXBlID0gL148IURPQ1RZUEUgW14+XSs+L2k7DQp2YXIgY29tbWVudCA9IC9ePCEtLS87DQp2YXIgY29uZGl0aW9uYWxDb21tZW50ID0gL148IVxbLzsNCg0KdmFyIElTX1JFR0VYX0NBUFRVUklOR19CUk9LRU4gPSBmYWxzZTsNCid4Jy5yZXBsYWNlKC94KC4pPy9nLCBmdW5jdGlvbiAobSwgZykgew0KICBJU19SRUdFWF9DQVBUVVJJTkdfQlJPS0VOID0gZyA9PT0gJyc7DQp9KTsNCg0KLy8gU3BlY2lhbCBFbGVtZW50cyAoY2FuIGNvbnRhaW4gYW55dGhpbmcpDQp2YXIgaXNTY3JpcHRPclN0eWxlID0gbWFrZU1hcCgnc2NyaXB0LHN0eWxlJywgdHJ1ZSk7DQp2YXIgaGFzTGFuZyA9IGZ1bmN0aW9uIChhdHRyKSB7IHJldHVybiBhdHRyLm5hbWUgPT09ICdsYW5nJyAmJiBhdHRyLnZhbHVlICE9PSAnaHRtbCc7IH07DQp2YXIgaXNTcGVjaWFsVGFnID0gZnVuY3Rpb24gKHRhZywgaXNTRkMsIHN0YWNrKSB7DQogIGlmIChpc1NjcmlwdE9yU3R5bGUodGFnKSkgew0KICAgIHJldHVybiB0cnVlDQogIH0NCiAgaWYgKGlzU0ZDICYmIHN0YWNrLmxlbmd0aCA9PT0gMSkgew0KICAgIC8vIHRvcC1sZXZlbCB0ZW1wbGF0ZSB0aGF0IGhhcyBubyBwcmUtcHJvY2Vzc29yDQogICAgaWYgKHRhZyA9PT0gJ3RlbXBsYXRlJyAmJiAhc3RhY2tbMF0uYXR0cnMuc29tZShoYXNMYW5nKSkgew0KICAgICAgcmV0dXJuIGZhbHNlDQogICAgfSBlbHNlIHsNCiAgICAgIHJldHVybiB0cnVlDQogICAgfQ0KICB9DQogIHJldHVybiBmYWxzZQ0KfTsNCg0KdmFyIHJlQ2FjaGUgPSB7fTsNCg0KdmFyIGx0UkUgPSAvJmx0Oy9nOw0KdmFyIGd0UkUgPSAvJmd0Oy9nOw0KdmFyIG5sUkUgPSAvJiMxMDsvZzsNCnZhciBhbXBSRSA9IC8mYW1wOy9nOw0KdmFyIHF1b3RlUkUgPSAvJnF1b3Q7L2c7DQoNCmZ1bmN0aW9uIGRlY29kZUF0dHIgKHZhbHVlLCBzaG91bGREZWNvZGVOZXdsaW5lcykgew0KICBpZiAoc2hvdWxkRGVjb2RlTmV3bGluZXMpIHsNCiAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UobmxSRSwgJ1xuJyk7DQogIH0NCiAgcmV0dXJuIHZhbHVlDQogICAgLnJlcGxhY2UobHRSRSwgJzwnKQ0KICAgIC5yZXBsYWNlKGd0UkUsICc+JykNCiAgICAucmVwbGFjZShhbXBSRSwgJyYnKQ0KICAgIC5yZXBsYWNlKHF1b3RlUkUsICciJykNCn0NCg0KZnVuY3Rpb24gcGFyc2VIVE1MIChodG1sLCBvcHRpb25zKSB7DQogIHZhciBzdGFjayA9IFtdOw0KICB2YXIgZXhwZWN0SFRNTCA9IG9wdGlvbnMuZXhwZWN0SFRNTDsNCiAgdmFyIGlzVW5hcnlUYWckJDEgPSBvcHRpb25zLmlzVW5hcnlUYWcgfHwgbm87DQogIHZhciBpbmRleCA9IDA7DQogIHZhciBsYXN0LCBsYXN0VGFnOw0KICB3aGlsZSAoaHRtbCkgew0KICAgIGxhc3QgPSBodG1sOw0KICAgIC8vIE1ha2Ugc3VyZSB3ZSdyZSBub3QgaW4gYSBzY3JpcHQgb3Igc3R5bGUgZWxlbWVudA0KICAgIGlmICghbGFzdFRhZyB8fCAhaXNTcGVjaWFsVGFnKGxhc3RUYWcsIG9wdGlvbnMuc2ZjLCBzdGFjaykpIHsNCiAgICAgIHZhciB0ZXh0RW5kID0gaHRtbC5pbmRleE9mKCc8Jyk7DQogICAgICBpZiAodGV4dEVuZCA9PT0gMCkgew0KICAgICAgICAvLyBDb21tZW50Og0KICAgICAgICBpZiAoY29tbWVudC50ZXN0KGh0bWwpKSB7DQogICAgICAgICAgdmFyIGNvbW1lbnRFbmQgPSBodG1sLmluZGV4T2YoJy0tPicpOw0KDQogICAgICAgICAgaWYgKGNvbW1lbnRFbmQgPj0gMCkgew0KICAgICAgICAgICAgYWR2YW5jZShjb21tZW50RW5kICsgMyk7DQogICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29uZGl0aW9uYWxfY29tbWVudCNEb3dubGV2ZWwtcmV2ZWFsZWRfY29uZGl0aW9uYWxfY29tbWVudA0KICAgICAgICBpZiAoY29uZGl0aW9uYWxDb21tZW50LnRlc3QoaHRtbCkpIHsNCiAgICAgICAgICB2YXIgY29uZGl0aW9uYWxFbmQgPSBodG1sLmluZGV4T2YoJ10+Jyk7DQoNCiAgICAgICAgICBpZiAoY29uZGl0aW9uYWxFbmQgPj0gMCkgew0KICAgICAgICAgICAgYWR2YW5jZShjb25kaXRpb25hbEVuZCArIDIpOw0KICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAvLyBEb2N0eXBlOg0KICAgICAgICB2YXIgZG9jdHlwZU1hdGNoID0gaHRtbC5tYXRjaChkb2N0eXBlKTsNCiAgICAgICAgaWYgKGRvY3R5cGVNYXRjaCkgew0KICAgICAgICAgIGFkdmFuY2UoZG9jdHlwZU1hdGNoWzBdLmxlbmd0aCk7DQogICAgICAgICAgY29udGludWUNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIEVuZCB0YWc6DQogICAgICAgIHZhciBlbmRUYWdNYXRjaCA9IGh0bWwubWF0Y2goZW5kVGFnKTsNCiAgICAgICAgaWYgKGVuZFRhZ01hdGNoKSB7DQogICAgICAgICAgdmFyIGN1ckluZGV4ID0gaW5kZXg7DQogICAgICAgICAgYWR2YW5jZShlbmRUYWdNYXRjaFswXS5sZW5ndGgpOw0KICAgICAgICAgIHBhcnNlRW5kVGFnKGVuZFRhZ01hdGNoWzBdLCBlbmRUYWdNYXRjaFsxXSwgY3VySW5kZXgsIGluZGV4KTsNCiAgICAgICAgICBjb250aW51ZQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8gU3RhcnQgdGFnOg0KICAgICAgICB2YXIgc3RhcnRUYWdNYXRjaCA9IHBhcnNlU3RhcnRUYWcoKTsNCiAgICAgICAgaWYgKHN0YXJ0VGFnTWF0Y2gpIHsNCiAgICAgICAgICBoYW5kbGVTdGFydFRhZyhzdGFydFRhZ01hdGNoKTsNCiAgICAgICAgICBjb250aW51ZQ0KICAgICAgICB9DQogICAgICB9DQoNCiAgICAgIHZhciB0ZXh0ID0gKHZvaWQgMCksIHJlc3QkMSA9ICh2b2lkIDApLCBuZXh0ID0gKHZvaWQgMCk7DQogICAgICBpZiAodGV4dEVuZCA+IDApIHsNCiAgICAgICAgcmVzdCQxID0gaHRtbC5zbGljZSh0ZXh0RW5kKTsNCiAgICAgICAgd2hpbGUgKA0KICAgICAgICAgICFlbmRUYWcudGVzdChyZXN0JDEpICYmDQogICAgICAgICAgIXN0YXJ0VGFnT3Blbi50ZXN0KHJlc3QkMSkgJiYNCiAgICAgICAgICAhY29tbWVudC50ZXN0KHJlc3QkMSkgJiYNCiAgICAgICAgICAhY29uZGl0aW9uYWxDb21tZW50LnRlc3QocmVzdCQxKQ0KICAgICAgICApIHsNCiAgICAgICAgICAvLyA8IGluIHBsYWluIHRleHQsIGJlIGZvcmdpdmluZyBhbmQgdHJlYXQgaXQgYXMgdGV4dA0KICAgICAgICAgIG5leHQgPSByZXN0JDEuaW5kZXhPZignPCcsIDEpOw0KICAgICAgICAgIGlmIChuZXh0IDwgMCkgeyBicmVhayB9DQogICAgICAgICAgdGV4dEVuZCArPSBuZXh0Ow0KICAgICAgICAgIHJlc3QkMSA9IGh0bWwuc2xpY2UodGV4dEVuZCk7DQogICAgICAgIH0NCiAgICAgICAgdGV4dCA9IGh0bWwuc3Vic3RyaW5nKDAsIHRleHRFbmQpOw0KICAgICAgICBhZHZhbmNlKHRleHRFbmQpOw0KICAgICAgfQ0KDQogICAgICBpZiAodGV4dEVuZCA8IDApIHsNCiAgICAgICAgdGV4dCA9IGh0bWw7DQogICAgICAgIGh0bWwgPSAnJzsNCiAgICAgIH0NCg0KICAgICAgaWYgKG9wdGlvbnMuY2hhcnMgJiYgdGV4dCkgew0KICAgICAgICBvcHRpb25zLmNoYXJzKHRleHQpOw0KICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICB2YXIgc3RhY2tlZFRhZyA9IGxhc3RUYWcudG9Mb3dlckNhc2UoKTsNCiAgICAgIHZhciByZVN0YWNrZWRUYWcgPSByZUNhY2hlW3N0YWNrZWRUYWddIHx8IChyZUNhY2hlW3N0YWNrZWRUYWddID0gbmV3IFJlZ0V4cCgnKFtcXHNcXFNdKj8pKDwvJyArIHN0YWNrZWRUYWcgKyAnW14+XSo+KScsICdpJykpOw0KICAgICAgdmFyIGVuZFRhZ0xlbmd0aCA9IDA7DQogICAgICB2YXIgcmVzdCA9IGh0bWwucmVwbGFjZShyZVN0YWNrZWRUYWcsIGZ1bmN0aW9uIChhbGwsIHRleHQsIGVuZFRhZykgew0KICAgICAgICBlbmRUYWdMZW5ndGggPSBlbmRUYWcubGVuZ3RoOw0KICAgICAgICBpZiAoc3RhY2tlZFRhZyAhPT0gJ3NjcmlwdCcgJiYgc3RhY2tlZFRhZyAhPT0gJ3N0eWxlJyAmJiBzdGFja2VkVGFnICE9PSAnbm9zY3JpcHQnKSB7DQogICAgICAgICAgdGV4dCA9IHRleHQNCiAgICAgICAgICAgIC5yZXBsYWNlKC88IS0tKFtcc1xTXSo/KS0tPi9nLCAnJDEnKQ0KICAgICAgICAgICAgLnJlcGxhY2UoLzwhXFtDREFUQVxbKFtcc1xTXSo/KV1dPi9nLCAnJDEnKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAob3B0aW9ucy5jaGFycykgew0KICAgICAgICAgIG9wdGlvbnMuY2hhcnModGV4dCk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICcnDQogICAgICB9KTsNCiAgICAgIGluZGV4ICs9IGh0bWwubGVuZ3RoIC0gcmVzdC5sZW5ndGg7DQogICAgICBodG1sID0gcmVzdDsNCiAgICAgIHBhcnNlRW5kVGFnKCc8LycgKyBzdGFja2VkVGFnICsgJz4nLCBzdGFja2VkVGFnLCBpbmRleCAtIGVuZFRhZ0xlbmd0aCwgaW5kZXgpOw0KICAgIH0NCg0KICAgIGlmIChodG1sID09PSBsYXN0ICYmIG9wdGlvbnMuY2hhcnMpIHsNCiAgICAgIG9wdGlvbnMuY2hhcnMoaHRtbCk7DQogICAgICBicmVhaw0KICAgIH0NCiAgfQ0KDQogIC8vIENsZWFuIHVwIGFueSByZW1haW5pbmcgdGFncw0KICBwYXJzZUVuZFRhZygpOw0KDQogIGZ1bmN0aW9uIGFkdmFuY2UgKG4pIHsNCiAgICBpbmRleCArPSBuOw0KICAgIGh0bWwgPSBodG1sLnN1YnN0cmluZyhuKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHBhcnNlU3RhcnRUYWcgKCkgew0KICAgIHZhciBzdGFydCA9IGh0bWwubWF0Y2goc3RhcnRUYWdPcGVuKTsNCiAgICBpZiAoc3RhcnQpIHsNCiAgICAgIHZhciBtYXRjaCA9IHsNCiAgICAgICAgdGFnTmFtZTogc3RhcnRbMV0sDQogICAgICAgIGF0dHJzOiBbXSwNCiAgICAgICAgc3RhcnQ6IGluZGV4DQogICAgICB9Ow0KICAgICAgYWR2YW5jZShzdGFydFswXS5sZW5ndGgpOw0KICAgICAgdmFyIGVuZCwgYXR0cjsNCiAgICAgIHdoaWxlICghKGVuZCA9IGh0bWwubWF0Y2goc3RhcnRUYWdDbG9zZSkpICYmIChhdHRyID0gaHRtbC5tYXRjaChhdHRyaWJ1dGUpKSkgew0KICAgICAgICBhZHZhbmNlKGF0dHJbMF0ubGVuZ3RoKTsNCiAgICAgICAgbWF0Y2guYXR0cnMucHVzaChhdHRyKTsNCiAgICAgIH0NCiAgICAgIGlmIChlbmQpIHsNCiAgICAgICAgbWF0Y2gudW5hcnlTbGFzaCA9IGVuZFsxXTsNCiAgICAgICAgYWR2YW5jZShlbmRbMF0ubGVuZ3RoKTsNCiAgICAgICAgbWF0Y2guZW5kID0gaW5kZXg7DQogICAgICAgIHJldHVybiBtYXRjaA0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIGhhbmRsZVN0YXJ0VGFnIChtYXRjaCkgew0KICAgIHZhciB0YWdOYW1lID0gbWF0Y2gudGFnTmFtZTsNCiAgICB2YXIgdW5hcnlTbGFzaCA9IG1hdGNoLnVuYXJ5U2xhc2g7DQoNCiAgICBpZiAoZXhwZWN0SFRNTCkgew0KICAgICAgaWYgKGxhc3RUYWcgPT09ICdwJyAmJiBpc05vblBocmFzaW5nVGFnKHRhZ05hbWUpKSB7DQogICAgICAgIHBhcnNlRW5kVGFnKCcnLCBsYXN0VGFnKTsNCiAgICAgIH0NCiAgICAgIGlmIChjYW5CZUxlZnRPcGVuVGFnKHRhZ05hbWUpICYmIGxhc3RUYWcgPT09IHRhZ05hbWUpIHsNCiAgICAgICAgcGFyc2VFbmRUYWcoJycsIHRhZ05hbWUpOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIHZhciB1bmFyeSA9IGlzVW5hcnlUYWckJDEodGFnTmFtZSkgfHwgdGFnTmFtZSA9PT0gJ2h0bWwnICYmIGxhc3RUYWcgPT09ICdoZWFkJyB8fCAhIXVuYXJ5U2xhc2g7DQoNCiAgICB2YXIgbCA9IG1hdGNoLmF0dHJzLmxlbmd0aDsNCiAgICB2YXIgYXR0cnMgPSBuZXcgQXJyYXkobCk7DQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHsNCiAgICAgIHZhciBhcmdzID0gbWF0Y2guYXR0cnNbaV07DQogICAgICAvLyBoYWNraXNoIHdvcmsgYXJvdW5kIEZGIGJ1ZyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0zNjk3NzgNCiAgICAgIGlmIChJU19SRUdFWF9DQVBUVVJJTkdfQlJPS0VOICYmIGFyZ3NbMF0uaW5kZXhPZignIiInKSA9PT0gLTEpIHsNCiAgICAgICAgaWYgKGFyZ3NbM10gPT09ICcnKSB7IGRlbGV0ZSBhcmdzWzNdOyB9DQogICAgICAgIGlmIChhcmdzWzRdID09PSAnJykgeyBkZWxldGUgYXJnc1s0XTsgfQ0KICAgICAgICBpZiAoYXJnc1s1XSA9PT0gJycpIHsgZGVsZXRlIGFyZ3NbNV07IH0NCiAgICAgIH0NCiAgICAgIHZhciB2YWx1ZSA9IGFyZ3NbM10gfHwgYXJnc1s0XSB8fCBhcmdzWzVdIHx8ICcnOw0KICAgICAgYXR0cnNbaV0gPSB7DQogICAgICAgIG5hbWU6IGFyZ3NbMV0sDQogICAgICAgIHZhbHVlOiBkZWNvZGVBdHRyKA0KICAgICAgICAgIHZhbHVlLA0KICAgICAgICAgIG9wdGlvbnMuc2hvdWxkRGVjb2RlTmV3bGluZXMNCiAgICAgICAgKQ0KICAgICAgfTsNCiAgICB9DQoNCiAgICBpZiAoIXVuYXJ5KSB7DQogICAgICBzdGFjay5wdXNoKHsgdGFnOiB0YWdOYW1lLCBhdHRyczogYXR0cnMgfSk7DQogICAgICBsYXN0VGFnID0gdGFnTmFtZTsNCiAgICAgIHVuYXJ5U2xhc2ggPSAnJzsNCiAgICB9DQoNCiAgICBpZiAob3B0aW9ucy5zdGFydCkgew0KICAgICAgb3B0aW9ucy5zdGFydCh0YWdOYW1lLCBhdHRycywgdW5hcnksIG1hdGNoLnN0YXJ0LCBtYXRjaC5lbmQpOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIHBhcnNlRW5kVGFnICh0YWcsIHRhZ05hbWUsIHN0YXJ0LCBlbmQpIHsNCiAgICB2YXIgcG9zOw0KICAgIGlmIChzdGFydCA9PSBudWxsKSB7IHN0YXJ0ID0gaW5kZXg7IH0NCiAgICBpZiAoZW5kID09IG51bGwpIHsgZW5kID0gaW5kZXg7IH0NCg0KICAgIC8vIEZpbmQgdGhlIGNsb3Nlc3Qgb3BlbmVkIHRhZyBvZiB0aGUgc2FtZSB0eXBlDQogICAgaWYgKHRhZ05hbWUpIHsNCiAgICAgIHZhciBuZWVkbGUgPSB0YWdOYW1lLnRvTG93ZXJDYXNlKCk7DQogICAgICBmb3IgKHBvcyA9IHN0YWNrLmxlbmd0aCAtIDE7IHBvcyA+PSAwOyBwb3MtLSkgew0KICAgICAgICBpZiAoc3RhY2tbcG9zXS50YWcudG9Mb3dlckNhc2UoKSA9PT0gbmVlZGxlKSB7DQogICAgICAgICAgYnJlYWsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICAvLyBJZiBubyB0YWcgbmFtZSBpcyBwcm92aWRlZCwgY2xlYW4gc2hvcA0KICAgICAgcG9zID0gMDsNCiAgICB9DQoNCiAgICBpZiAocG9zID49IDApIHsNCiAgICAgIC8vIENsb3NlIGFsbCB0aGUgb3BlbiBlbGVtZW50cywgdXAgdGhlIHN0YWNrDQogICAgICBmb3IgKHZhciBpID0gc3RhY2subGVuZ3RoIC0gMTsgaSA+PSBwb3M7IGktLSkgew0KICAgICAgICBpZiAob3B0aW9ucy5lbmQpIHsNCiAgICAgICAgICBvcHRpb25zLmVuZChzdGFja1tpXS50YWcsIHN0YXJ0LCBlbmQpOw0KICAgICAgICB9DQogICAgICB9DQoNCiAgICAgIC8vIFJlbW92ZSB0aGUgb3BlbiBlbGVtZW50cyBmcm9tIHRoZSBzdGFjaw0KICAgICAgc3RhY2subGVuZ3RoID0gcG9zOw0KICAgICAgbGFzdFRhZyA9IHBvcyAmJiBzdGFja1twb3MgLSAxXS50YWc7DQogICAgfSBlbHNlIGlmICh0YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdicicpIHsNCiAgICAgIGlmIChvcHRpb25zLnN0YXJ0KSB7DQogICAgICAgIG9wdGlvbnMuc3RhcnQodGFnTmFtZSwgW10sIHRydWUsIHN0YXJ0LCBlbmQpOw0KICAgICAgfQ0KICAgIH0gZWxzZSBpZiAodGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAncCcpIHsNCiAgICAgIGlmIChvcHRpb25zLnN0YXJ0KSB7DQogICAgICAgIG9wdGlvbnMuc3RhcnQodGFnTmFtZSwgW10sIGZhbHNlLCBzdGFydCwgZW5kKTsNCiAgICAgIH0NCiAgICAgIGlmIChvcHRpb25zLmVuZCkgew0KICAgICAgICBvcHRpb25zLmVuZCh0YWdOYW1lLCBzdGFydCwgZW5kKTsNCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg0KLyogICovDQoNCmZ1bmN0aW9uIHBhcnNlRmlsdGVycyAoZXhwKSB7DQogIHZhciBpblNpbmdsZSA9IGZhbHNlOw0KICB2YXIgaW5Eb3VibGUgPSBmYWxzZTsNCiAgdmFyIGluVGVtcGxhdGVTdHJpbmcgPSBmYWxzZTsNCiAgdmFyIGluUmVnZXggPSBmYWxzZTsNCiAgdmFyIGN1cmx5ID0gMDsNCiAgdmFyIHNxdWFyZSA9IDA7DQogIHZhciBwYXJlbiA9IDA7DQogIHZhciBsYXN0RmlsdGVySW5kZXggPSAwOw0KICB2YXIgYywgcHJldiwgaSwgZXhwcmVzc2lvbiwgZmlsdGVyczsNCg0KICBmb3IgKGkgPSAwOyBpIDwgZXhwLmxlbmd0aDsgaSsrKSB7DQogICAgcHJldiA9IGM7DQogICAgYyA9IGV4cC5jaGFyQ29kZUF0KGkpOw0KICAgIGlmIChpblNpbmdsZSkgew0KICAgICAgaWYgKGMgPT09IDB4MjcgJiYgcHJldiAhPT0gMHg1QykgeyBpblNpbmdsZSA9IGZhbHNlOyB9DQogICAgfSBlbHNlIGlmIChpbkRvdWJsZSkgew0KICAgICAgaWYgKGMgPT09IDB4MjIgJiYgcHJldiAhPT0gMHg1QykgeyBpbkRvdWJsZSA9IGZhbHNlOyB9DQogICAgfSBlbHNlIGlmIChpblRlbXBsYXRlU3RyaW5nKSB7DQogICAgICBpZiAoYyA9PT0gMHg2MCAmJiBwcmV2ICE9PSAweDVDKSB7IGluVGVtcGxhdGVTdHJpbmcgPSBmYWxzZTsgfQ0KICAgIH0gZWxzZSBpZiAoaW5SZWdleCkgew0KICAgICAgaWYgKGMgPT09IDB4MmYgJiYgcHJldiAhPT0gMHg1QykgeyBpblJlZ2V4ID0gZmFsc2U7IH0NCiAgICB9IGVsc2UgaWYgKA0KICAgICAgYyA9PT0gMHg3QyAmJiAvLyBwaXBlDQogICAgICBleHAuY2hhckNvZGVBdChpICsgMSkgIT09IDB4N0MgJiYNCiAgICAgIGV4cC5jaGFyQ29kZUF0KGkgLSAxKSAhPT0gMHg3QyAmJg0KICAgICAgIWN1cmx5ICYmICFzcXVhcmUgJiYgIXBhcmVuDQogICAgKSB7DQogICAgICBpZiAoZXhwcmVzc2lvbiA9PT0gdW5kZWZpbmVkKSB7DQogICAgICAgIC8vIGZpcnN0IGZpbHRlciwgZW5kIG9mIGV4cHJlc3Npb24NCiAgICAgICAgbGFzdEZpbHRlckluZGV4ID0gaSArIDE7DQogICAgICAgIGV4cHJlc3Npb24gPSBleHAuc2xpY2UoMCwgaSkudHJpbSgpOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgcHVzaEZpbHRlcigpOw0KICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICBzd2l0Y2ggKGMpIHsNCiAgICAgICAgY2FzZSAweDIyOiBpbkRvdWJsZSA9IHRydWU7IGJyZWFrICAgICAgICAgLy8gIg0KICAgICAgICBjYXNlIDB4Mjc6IGluU2luZ2xlID0gdHJ1ZTsgYnJlYWsgICAgICAgICAvLyAnDQogICAgICAgIGNhc2UgMHg2MDogaW5UZW1wbGF0ZVN0cmluZyA9IHRydWU7IGJyZWFrIC8vIGANCiAgICAgICAgY2FzZSAweDJmOiBpblJlZ2V4ID0gdHJ1ZTsgYnJlYWsgICAgICAgICAgLy8gLw0KICAgICAgICBjYXNlIDB4Mjg6IHBhcmVuKys7IGJyZWFrICAgICAgICAgICAgICAgICAvLyAoDQogICAgICAgIGNhc2UgMHgyOTogcGFyZW4tLTsgYnJlYWsgICAgICAgICAgICAgICAgIC8vICkNCiAgICAgICAgY2FzZSAweDVCOiBzcXVhcmUrKzsgYnJlYWsgICAgICAgICAgICAgICAgLy8gWw0KICAgICAgICBjYXNlIDB4NUQ6IHNxdWFyZS0tOyBicmVhayAgICAgICAgICAgICAgICAvLyBdDQogICAgICAgIGNhc2UgMHg3QjogY3VybHkrKzsgYnJlYWsgICAgICAgICAgICAgICAgIC8vIHsNCiAgICAgICAgY2FzZSAweDdEOiBjdXJseS0tOyBicmVhayAgICAgICAgICAgICAgICAgLy8gfQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIGlmIChleHByZXNzaW9uID09PSB1bmRlZmluZWQpIHsNCiAgICBleHByZXNzaW9uID0gZXhwLnNsaWNlKDAsIGkpLnRyaW0oKTsNCiAgfSBlbHNlIGlmIChsYXN0RmlsdGVySW5kZXggIT09IDApIHsNCiAgICBwdXNoRmlsdGVyKCk7DQogIH0NCg0KICBmdW5jdGlvbiBwdXNoRmlsdGVyICgpIHsNCiAgICAoZmlsdGVycyB8fCAoZmlsdGVycyA9IFtdKSkucHVzaChleHAuc2xpY2UobGFzdEZpbHRlckluZGV4LCBpKS50cmltKCkpOw0KICAgIGxhc3RGaWx0ZXJJbmRleCA9IGkgKyAxOw0KICB9DQoNCiAgaWYgKGZpbHRlcnMpIHsNCiAgICBmb3IgKGkgPSAwOyBpIDwgZmlsdGVycy5sZW5ndGg7IGkrKykgew0KICAgICAgZXhwcmVzc2lvbiA9IHdyYXBGaWx0ZXIoZXhwcmVzc2lvbiwgZmlsdGVyc1tpXSk7DQogICAgfQ0KICB9DQoNCiAgcmV0dXJuIGV4cHJlc3Npb24NCn0NCg0KZnVuY3Rpb24gd3JhcEZpbHRlciAoZXhwLCBmaWx0ZXIpIHsNCiAgdmFyIGkgPSBmaWx0ZXIuaW5kZXhPZignKCcpOw0KICBpZiAoaSA8IDApIHsNCiAgICAvLyBfZjogcmVzb2x2ZUZpbHRlcg0KICAgIHJldHVybiAoIl9mKFwiIiArIGZpbHRlciArICJcIikoIiArIGV4cCArICIpIikNCiAgfSBlbHNlIHsNCiAgICB2YXIgbmFtZSA9IGZpbHRlci5zbGljZSgwLCBpKTsNCiAgICB2YXIgYXJncyA9IGZpbHRlci5zbGljZShpICsgMSk7DQogICAgcmV0dXJuICgiX2YoXCIiICsgbmFtZSArICJcIikoIiArIGV4cCArICIsIiArIGFyZ3MpDQogIH0NCn0NCg0KLyogICovDQoNCnZhciBkZWZhdWx0VGFnUkUgPSAvXHtceygoPzoufFxuKSs/KVx9XH0vZzsNCnZhciByZWdleEVzY2FwZVJFID0gL1stLiorP14ke30oKXxbXF0vXFxdL2c7DQoNCnZhciBidWlsZFJlZ2V4ID0gY2FjaGVkKGZ1bmN0aW9uIChkZWxpbWl0ZXJzKSB7DQogIHZhciBvcGVuID0gZGVsaW1pdGVyc1swXS5yZXBsYWNlKHJlZ2V4RXNjYXBlUkUsICdcXCQmJyk7DQogIHZhciBjbG9zZSA9IGRlbGltaXRlcnNbMV0ucmVwbGFjZShyZWdleEVzY2FwZVJFLCAnXFwkJicpOw0KICByZXR1cm4gbmV3IFJlZ0V4cChvcGVuICsgJygoPzoufFxcbikrPyknICsgY2xvc2UsICdnJykNCn0pOw0KDQpmdW5jdGlvbiBwYXJzZVRleHQgKA0KICB0ZXh0LA0KICBkZWxpbWl0ZXJzDQopIHsNCiAgdmFyIHRhZ1JFID0gZGVsaW1pdGVycyA/IGJ1aWxkUmVnZXgoZGVsaW1pdGVycykgOiBkZWZhdWx0VGFnUkU7DQogIGlmICghdGFnUkUudGVzdCh0ZXh0KSkgew0KICAgIHJldHVybg0KICB9DQogIHZhciB0b2tlbnMgPSBbXTsNCiAgdmFyIGxhc3RJbmRleCA9IHRhZ1JFLmxhc3RJbmRleCA9IDA7DQogIHZhciBtYXRjaCwgaW5kZXg7DQogIHdoaWxlICgobWF0Y2ggPSB0YWdSRS5leGVjKHRleHQpKSkgew0KICAgIGluZGV4ID0gbWF0Y2guaW5kZXg7DQogICAgLy8gcHVzaCB0ZXh0IHRva2VuDQogICAgaWYgKGluZGV4ID4gbGFzdEluZGV4KSB7DQogICAgICB0b2tlbnMucHVzaChKU09OLnN0cmluZ2lmeSh0ZXh0LnNsaWNlKGxhc3RJbmRleCwgaW5kZXgpKSk7DQogICAgfQ0KICAgIC8vIHRhZyB0b2tlbg0KICAgIHZhciBleHAgPSBwYXJzZUZpbHRlcnMobWF0Y2hbMV0udHJpbSgpKTsNCiAgICB0b2tlbnMucHVzaCgoIl9zKCIgKyBleHAgKyAiKSIpKTsNCiAgICBsYXN0SW5kZXggPSBpbmRleCArIG1hdGNoWzBdLmxlbmd0aDsNCiAgfQ0KICBpZiAobGFzdEluZGV4IDwgdGV4dC5sZW5ndGgpIHsNCiAgICB0b2tlbnMucHVzaChKU09OLnN0cmluZ2lmeSh0ZXh0LnNsaWNlKGxhc3RJbmRleCkpKTsNCiAgfQ0KICByZXR1cm4gdG9rZW5zLmpvaW4oJysnKQ0KfQ0KDQovKiAgKi8NCg0KZnVuY3Rpb24gYmFzZVdhcm4gKG1zZykgew0KICBjb25zb2xlLmVycm9yKCgiW1Z1ZSBwYXJzZXJdOiAiICsgbXNnKSk7DQp9DQoNCmZ1bmN0aW9uIHBsdWNrTW9kdWxlRnVuY3Rpb24gKA0KICBtb2R1bGVzLA0KICBrZXkNCikgew0KICByZXR1cm4gbW9kdWxlcw0KICAgID8gbW9kdWxlcy5tYXAoZnVuY3Rpb24gKG0pIHsgcmV0dXJuIG1ba2V5XTsgfSkuZmlsdGVyKGZ1bmN0aW9uIChfKSB7IHJldHVybiBfOyB9KQ0KICAgIDogW10NCn0NCg0KZnVuY3Rpb24gYWRkUHJvcCAoZWwsIG5hbWUsIHZhbHVlKSB7DQogIChlbC5wcm9wcyB8fCAoZWwucHJvcHMgPSBbXSkpLnB1c2goeyBuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWUgfSk7DQp9DQoNCmZ1bmN0aW9uIGFkZEF0dHIgKGVsLCBuYW1lLCB2YWx1ZSkgew0KICAoZWwuYXR0cnMgfHwgKGVsLmF0dHJzID0gW10pKS5wdXNoKHsgbmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlIH0pOw0KfQ0KDQpmdW5jdGlvbiBhZGREaXJlY3RpdmUgKA0KICBlbCwNCiAgbmFtZSwNCiAgcmF3TmFtZSwNCiAgdmFsdWUsDQogIGFyZywNCiAgbW9kaWZpZXJzDQopIHsNCiAgKGVsLmRpcmVjdGl2ZXMgfHwgKGVsLmRpcmVjdGl2ZXMgPSBbXSkpLnB1c2goeyBuYW1lOiBuYW1lLCByYXdOYW1lOiByYXdOYW1lLCB2YWx1ZTogdmFsdWUsIGFyZzogYXJnLCBtb2RpZmllcnM6IG1vZGlmaWVycyB9KTsNCn0NCg0KZnVuY3Rpb24gYWRkSGFuZGxlciAoDQogIGVsLA0KICBuYW1lLA0KICB2YWx1ZSwNCiAgbW9kaWZpZXJzLA0KICBpbXBvcnRhbnQNCikgew0KICAvLyBjaGVjayBjYXB0dXJlIG1vZGlmaWVyDQogIGlmIChtb2RpZmllcnMgJiYgbW9kaWZpZXJzLmNhcHR1cmUpIHsNCiAgICBkZWxldGUgbW9kaWZpZXJzLmNhcHR1cmU7DQogICAgbmFtZSA9ICchJyArIG5hbWU7IC8vIG1hcmsgdGhlIGV2ZW50IGFzIGNhcHR1cmVkDQogIH0NCiAgaWYgKG1vZGlmaWVycyAmJiBtb2RpZmllcnMub25jZSkgew0KICAgIGRlbGV0ZSBtb2RpZmllcnMub25jZTsNCiAgICBuYW1lID0gJ34nICsgbmFtZTsgLy8gbWFyayB0aGUgZXZlbnQgYXMgb25jZQ0KICB9DQogIHZhciBldmVudHM7DQogIGlmIChtb2RpZmllcnMgJiYgbW9kaWZpZXJzLm5hdGl2ZSkgew0KICAgIGRlbGV0ZSBtb2RpZmllcnMubmF0aXZlOw0KICAgIGV2ZW50cyA9IGVsLm5hdGl2ZUV2ZW50cyB8fCAoZWwubmF0aXZlRXZlbnRzID0ge30pOw0KICB9IGVsc2Ugew0KICAgIGV2ZW50cyA9IGVsLmV2ZW50cyB8fCAoZWwuZXZlbnRzID0ge30pOw0KICB9DQogIHZhciBuZXdIYW5kbGVyID0geyB2YWx1ZTogdmFsdWUsIG1vZGlmaWVyczogbW9kaWZpZXJzIH07DQogIHZhciBoYW5kbGVycyA9IGV2ZW50c1tuYW1lXTsNCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovDQogIGlmIChBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkgew0KICAgIGltcG9ydGFudCA/IGhhbmRsZXJzLnVuc2hpZnQobmV3SGFuZGxlcikgOiBoYW5kbGVycy5wdXNoKG5ld0hhbmRsZXIpOw0KICB9IGVsc2UgaWYgKGhhbmRsZXJzKSB7DQogICAgZXZlbnRzW25hbWVdID0gaW1wb3J0YW50ID8gW25ld0hhbmRsZXIsIGhhbmRsZXJzXSA6IFtoYW5kbGVycywgbmV3SGFuZGxlcl07DQogIH0gZWxzZSB7DQogICAgZXZlbnRzW25hbWVdID0gbmV3SGFuZGxlcjsNCiAgfQ0KfQ0KDQpmdW5jdGlvbiBnZXRCaW5kaW5nQXR0ciAoDQogIGVsLA0KICBuYW1lLA0KICBnZXRTdGF0aWMNCikgew0KICB2YXIgZHluYW1pY1ZhbHVlID0NCiAgICBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnOicgKyBuYW1lKSB8fA0KICAgIGdldEFuZFJlbW92ZUF0dHIoZWwsICd2LWJpbmQ6JyArIG5hbWUpOw0KICBpZiAoZHluYW1pY1ZhbHVlICE9IG51bGwpIHsNCiAgICByZXR1cm4gcGFyc2VGaWx0ZXJzKGR5bmFtaWNWYWx1ZSkNCiAgfSBlbHNlIGlmIChnZXRTdGF0aWMgIT09IGZhbHNlKSB7DQogICAgdmFyIHN0YXRpY1ZhbHVlID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgbmFtZSk7DQogICAgaWYgKHN0YXRpY1ZhbHVlICE9IG51bGwpIHsNCiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzdGF0aWNWYWx1ZSkNCiAgICB9DQogIH0NCn0NCg0KZnVuY3Rpb24gZ2V0QW5kUmVtb3ZlQXR0ciAoZWwsIG5hbWUpIHsNCiAgdmFyIHZhbDsNCiAgaWYgKCh2YWwgPSBlbC5hdHRyc01hcFtuYW1lXSkgIT0gbnVsbCkgew0KICAgIHZhciBsaXN0ID0gZWwuYXR0cnNMaXN0Ow0KICAgIGZvciAodmFyIGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsOyBpKyspIHsNCiAgICAgIGlmIChsaXN0W2ldLm5hbWUgPT09IG5hbWUpIHsNCiAgICAgICAgbGlzdC5zcGxpY2UoaSwgMSk7DQogICAgICAgIGJyZWFrDQogICAgICB9DQogICAgfQ0KICB9DQogIHJldHVybiB2YWwNCn0NCg0KdmFyIGxlbjsNCnZhciBzdHI7DQp2YXIgY2hyOw0KdmFyIGluZGV4JDE7DQp2YXIgZXhwcmVzc2lvblBvczsNCnZhciBleHByZXNzaW9uRW5kUG9zOw0KDQovKioNCiAqIHBhcnNlIGRpcmVjdGl2ZSBtb2RlbCB0byBkbyB0aGUgYXJyYXkgdXBkYXRlIHRyYW5zZm9ybS4gYVtpZHhdID0gdmFsID0+ICQkYS5zcGxpY2UoJCRpZHgsIDEsIHZhbCkNCiAqDQogKiBmb3IgbG9vcCBwb3NzaWJsZSBjYXNlczoNCiAqDQogKiAtIHRlc3QNCiAqIC0gdGVzdFtpZHhdDQogKiAtIHRlc3RbdGVzdDFbaWR4XV0NCiAqIC0gdGVzdFsiYSJdW2lkeF0NCiAqIC0geHh4LnRlc3RbYVthXS50ZXN0MVtpZHhdXQ0KICogLSB0ZXN0Lnh4eC5hWyJhc2EiXVt0ZXN0MVtpZHhdXQ0KICoNCiAqLw0KDQpmdW5jdGlvbiBwYXJzZU1vZGVsICh2YWwpIHsNCiAgc3RyID0gdmFsOw0KICBsZW4gPSBzdHIubGVuZ3RoOw0KICBpbmRleCQxID0gZXhwcmVzc2lvblBvcyA9IGV4cHJlc3Npb25FbmRQb3MgPSAwOw0KDQogIGlmICh2YWwuaW5kZXhPZignWycpIDwgMCB8fCB2YWwubGFzdEluZGV4T2YoJ10nKSA8IGxlbiAtIDEpIHsNCiAgICByZXR1cm4gew0KICAgICAgZXhwOiB2YWwsDQogICAgICBpZHg6IG51bGwNCiAgICB9DQogIH0NCg0KICB3aGlsZSAoIWVvZigpKSB7DQogICAgY2hyID0gbmV4dCgpOw0KICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLw0KICAgIGlmIChpc1N0cmluZ1N0YXJ0KGNocikpIHsNCiAgICAgIHBhcnNlU3RyaW5nKGNocik7DQogICAgfSBlbHNlIGlmIChjaHIgPT09IDB4NUIpIHsNCiAgICAgIHBhcnNlQnJhY2tldChjaHIpOw0KICAgIH0NCiAgfQ0KDQogIHJldHVybiB7DQogICAgZXhwOiB2YWwuc3Vic3RyaW5nKDAsIGV4cHJlc3Npb25Qb3MpLA0KICAgIGlkeDogdmFsLnN1YnN0cmluZyhleHByZXNzaW9uUG9zICsgMSwgZXhwcmVzc2lvbkVuZFBvcykNCiAgfQ0KfQ0KDQpmdW5jdGlvbiBuZXh0ICgpIHsNCiAgcmV0dXJuIHN0ci5jaGFyQ29kZUF0KCsraW5kZXgkMSkNCn0NCg0KZnVuY3Rpb24gZW9mICgpIHsNCiAgcmV0dXJuIGluZGV4JDEgPj0gbGVuDQp9DQoNCmZ1bmN0aW9uIGlzU3RyaW5nU3RhcnQgKGNocikgew0KICByZXR1cm4gY2hyID09PSAweDIyIHx8IGNociA9PT0gMHgyNw0KfQ0KDQpmdW5jdGlvbiBwYXJzZUJyYWNrZXQgKGNocikgew0KICB2YXIgaW5CcmFja2V0ID0gMTsNCiAgZXhwcmVzc2lvblBvcyA9IGluZGV4JDE7DQogIHdoaWxlICghZW9mKCkpIHsNCiAgICBjaHIgPSBuZXh0KCk7DQogICAgaWYgKGlzU3RyaW5nU3RhcnQoY2hyKSkgew0KICAgICAgcGFyc2VTdHJpbmcoY2hyKTsNCiAgICAgIGNvbnRpbnVlDQogICAgfQ0KICAgIGlmIChjaHIgPT09IDB4NUIpIHsgaW5CcmFja2V0Kys7IH0NCiAgICBpZiAoY2hyID09PSAweDVEKSB7IGluQnJhY2tldC0tOyB9DQogICAgaWYgKGluQnJhY2tldCA9PT0gMCkgew0KICAgICAgZXhwcmVzc2lvbkVuZFBvcyA9IGluZGV4JDE7DQogICAgICBicmVhaw0KICAgIH0NCiAgfQ0KfQ0KDQpmdW5jdGlvbiBwYXJzZVN0cmluZyAoY2hyKSB7DQogIHZhciBzdHJpbmdRdW90ZSA9IGNocjsNCiAgd2hpbGUgKCFlb2YoKSkgew0KICAgIGNociA9IG5leHQoKTsNCiAgICBpZiAoY2hyID09PSBzdHJpbmdRdW90ZSkgew0KICAgICAgYnJlYWsNCiAgICB9DQogIH0NCn0NCg0KLyogICovDQoNCnZhciBkaXJSRSA9IC9edi18XkB8XjovOw0KdmFyIGZvckFsaWFzUkUgPSAvKC4qPylccysoPzppbnxvZilccysoLiopLzsNCnZhciBmb3JJdGVyYXRvclJFID0gL1woKFx7W159XSpcfXxbXixdKiksKFteLF0qKSg/OiwoW14sXSopKT9cKS87DQp2YXIgYmluZFJFID0gL146fF52LWJpbmQ6LzsNCnZhciBvblJFID0gL15AfF52LW9uOi87DQp2YXIgYXJnUkUgPSAvOiguKikkLzsNCnZhciBtb2RpZmllclJFID0gL1wuW14uXSsvZzsNCg0KdmFyIGRlY29kZUhUTUxDYWNoZWQgPSBjYWNoZWQoZGVjb2RlKTsNCg0KLy8gY29uZmlndXJhYmxlIHN0YXRlDQp2YXIgd2FybiQxOw0KdmFyIHBsYXRmb3JtR2V0VGFnTmFtZXNwYWNlOw0KdmFyIHBsYXRmb3JtTXVzdFVzZVByb3A7DQp2YXIgcGxhdGZvcm1Jc1ByZVRhZzsNCnZhciBwcmVUcmFuc2Zvcm1zOw0KdmFyIHRyYW5zZm9ybXM7DQp2YXIgcG9zdFRyYW5zZm9ybXM7DQp2YXIgZGVsaW1pdGVyczsNCg0KLyoqDQogKiBDb252ZXJ0IEhUTUwgc3RyaW5nIHRvIEFTVC4NCiAqLw0KZnVuY3Rpb24gcGFyc2UgKA0KICB0ZW1wbGF0ZSwNCiAgb3B0aW9ucw0KKSB7DQogIHdhcm4kMSA9IG9wdGlvbnMud2FybiB8fCBiYXNlV2FybjsNCiAgcGxhdGZvcm1HZXRUYWdOYW1lc3BhY2UgPSBvcHRpb25zLmdldFRhZ05hbWVzcGFjZSB8fCBubzsNCiAgcGxhdGZvcm1NdXN0VXNlUHJvcCA9IG9wdGlvbnMubXVzdFVzZVByb3AgfHwgbm87DQogIHBsYXRmb3JtSXNQcmVUYWcgPSBvcHRpb25zLmlzUHJlVGFnIHx8IG5vOw0KICBwcmVUcmFuc2Zvcm1zID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICdwcmVUcmFuc2Zvcm1Ob2RlJyk7DQogIHRyYW5zZm9ybXMgPSBwbHVja01vZHVsZUZ1bmN0aW9uKG9wdGlvbnMubW9kdWxlcywgJ3RyYW5zZm9ybU5vZGUnKTsNCiAgcG9zdFRyYW5zZm9ybXMgPSBwbHVja01vZHVsZUZ1bmN0aW9uKG9wdGlvbnMubW9kdWxlcywgJ3Bvc3RUcmFuc2Zvcm1Ob2RlJyk7DQogIGRlbGltaXRlcnMgPSBvcHRpb25zLmRlbGltaXRlcnM7DQogIHZhciBzdGFjayA9IFtdOw0KICB2YXIgcHJlc2VydmVXaGl0ZXNwYWNlID0gb3B0aW9ucy5wcmVzZXJ2ZVdoaXRlc3BhY2UgIT09IGZhbHNlOw0KICB2YXIgcm9vdDsNCiAgdmFyIGN1cnJlbnRQYXJlbnQ7DQogIHZhciBpblZQcmUgPSBmYWxzZTsNCiAgdmFyIGluUHJlID0gZmFsc2U7DQogIHZhciB3YXJuZWQgPSBmYWxzZTsNCiAgcGFyc2VIVE1MKHRlbXBsYXRlLCB7DQogICAgZXhwZWN0SFRNTDogb3B0aW9ucy5leHBlY3RIVE1MLA0KICAgIGlzVW5hcnlUYWc6IG9wdGlvbnMuaXNVbmFyeVRhZywNCiAgICBzaG91bGREZWNvZGVOZXdsaW5lczogb3B0aW9ucy5zaG91bGREZWNvZGVOZXdsaW5lcywNCiAgICBzdGFydDogZnVuY3Rpb24gc3RhcnQgKHRhZywgYXR0cnMsIHVuYXJ5KSB7DQogICAgICAvLyBjaGVjayBuYW1lc3BhY2UuDQogICAgICAvLyBpbmhlcml0IHBhcmVudCBucyBpZiB0aGVyZSBpcyBvbmUNCiAgICAgIHZhciBucyA9IChjdXJyZW50UGFyZW50ICYmIGN1cnJlbnRQYXJlbnQubnMpIHx8IHBsYXRmb3JtR2V0VGFnTmFtZXNwYWNlKHRhZyk7DQoNCiAgICAgIC8vIGhhbmRsZSBJRSBzdmcgYnVnDQogICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8NCiAgICAgIGlmIChpc0lFICYmIG5zID09PSAnc3ZnJykgew0KICAgICAgICBhdHRycyA9IGd1YXJkSUVTVkdCdWcoYXR0cnMpOw0KICAgICAgfQ0KDQogICAgICB2YXIgZWxlbWVudCA9IHsNCiAgICAgICAgdHlwZTogMSwNCiAgICAgICAgdGFnOiB0YWcsDQogICAgICAgIGF0dHJzTGlzdDogYXR0cnMsDQogICAgICAgIGF0dHJzTWFwOiBtYWtlQXR0cnNNYXAoYXR0cnMpLA0KICAgICAgICBwYXJlbnQ6IGN1cnJlbnRQYXJlbnQsDQogICAgICAgIGNoaWxkcmVuOiBbXQ0KICAgICAgfTsNCiAgICAgIGlmIChucykgew0KICAgICAgICBlbGVtZW50Lm5zID0gbnM7DQogICAgICB9DQoNCiAgICAgIGlmIChpc0ZvcmJpZGRlblRhZyhlbGVtZW50KSAmJiAhaXNTZXJ2ZXJSZW5kZXJpbmcoKSkgew0KICAgICAgICBlbGVtZW50LmZvcmJpZGRlbiA9IHRydWU7DQogICAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuJDEoDQogICAgICAgICAgJ1RlbXBsYXRlcyBzaG91bGQgb25seSBiZSByZXNwb25zaWJsZSBmb3IgbWFwcGluZyB0aGUgc3RhdGUgdG8gdGhlICcgKw0KICAgICAgICAgICdVSS4gQXZvaWQgcGxhY2luZyB0YWdzIHdpdGggc2lkZS1lZmZlY3RzIGluIHlvdXIgdGVtcGxhdGVzLCBzdWNoIGFzICcgKw0KICAgICAgICAgICI8IiArIHRhZyArICI+LiINCiAgICAgICAgKTsNCiAgICAgIH0NCg0KICAgICAgLy8gYXBwbHkgcHJlLXRyYW5zZm9ybXMNCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJlVHJhbnNmb3Jtcy5sZW5ndGg7IGkrKykgew0KICAgICAgICBwcmVUcmFuc2Zvcm1zW2ldKGVsZW1lbnQsIG9wdGlvbnMpOw0KICAgICAgfQ0KDQogICAgICBpZiAoIWluVlByZSkgew0KICAgICAgICBwcm9jZXNzUHJlKGVsZW1lbnQpOw0KICAgICAgICBpZiAoZWxlbWVudC5wcmUpIHsNCiAgICAgICAgICBpblZQcmUgPSB0cnVlOw0KICAgICAgICB9DQogICAgICB9DQogICAgICBpZiAocGxhdGZvcm1Jc1ByZVRhZyhlbGVtZW50LnRhZykpIHsNCiAgICAgICAgaW5QcmUgPSB0cnVlOw0KICAgICAgfQ0KICAgICAgaWYgKGluVlByZSkgew0KICAgICAgICBwcm9jZXNzUmF3QXR0cnMoZWxlbWVudCk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBwcm9jZXNzRm9yKGVsZW1lbnQpOw0KICAgICAgICBwcm9jZXNzSWYoZWxlbWVudCk7DQogICAgICAgIHByb2Nlc3NPbmNlKGVsZW1lbnQpOw0KICAgICAgICBwcm9jZXNzS2V5KGVsZW1lbnQpOw0KDQogICAgICAgIC8vIGRldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgYSBwbGFpbiBlbGVtZW50IGFmdGVyDQogICAgICAgIC8vIHJlbW92aW5nIHN0cnVjdHVyYWwgYXR0cmlidXRlcw0KICAgICAgICBlbGVtZW50LnBsYWluID0gIWVsZW1lbnQua2V5ICYmICFhdHRycy5sZW5ndGg7DQoNCiAgICAgICAgcHJvY2Vzc1JlZihlbGVtZW50KTsNCiAgICAgICAgcHJvY2Vzc1Nsb3QoZWxlbWVudCk7DQogICAgICAgIHByb2Nlc3NDb21wb25lbnQoZWxlbWVudCk7DQogICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IHRyYW5zZm9ybXMubGVuZ3RoOyBpJDErKykgew0KICAgICAgICAgIHRyYW5zZm9ybXNbaSQxXShlbGVtZW50LCBvcHRpb25zKTsNCiAgICAgICAgfQ0KICAgICAgICBwcm9jZXNzQXR0cnMoZWxlbWVudCk7DQogICAgICB9DQoNCiAgICAgIGZ1bmN0aW9uIGNoZWNrUm9vdENvbnN0cmFpbnRzIChlbCkgew0KICAgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmICF3YXJuZWQpIHsNCiAgICAgICAgICBpZiAoZWwudGFnID09PSAnc2xvdCcgfHwgZWwudGFnID09PSAndGVtcGxhdGUnKSB7DQogICAgICAgICAgICB3YXJuZWQgPSB0cnVlOw0KICAgICAgICAgICAgd2FybiQxKA0KICAgICAgICAgICAgICAiQ2Fubm90IHVzZSA8IiArIChlbC50YWcpICsgIj4gYXMgY29tcG9uZW50IHJvb3QgZWxlbWVudCBiZWNhdXNlIGl0IG1heSAiICsNCiAgICAgICAgICAgICAgJ2NvbnRhaW4gbXVsdGlwbGUgbm9kZXM6XG4nICsgdGVtcGxhdGUNCiAgICAgICAgICAgICk7DQogICAgICAgICAgfQ0KICAgICAgICAgIGlmIChlbC5hdHRyc01hcC5oYXNPd25Qcm9wZXJ0eSgndi1mb3InKSkgew0KICAgICAgICAgICAgd2FybmVkID0gdHJ1ZTsNCiAgICAgICAgICAgIHdhcm4kMSgNCiAgICAgICAgICAgICAgJ0Nhbm5vdCB1c2Ugdi1mb3Igb24gc3RhdGVmdWwgY29tcG9uZW50IHJvb3QgZWxlbWVudCBiZWNhdXNlICcgKw0KICAgICAgICAgICAgICAnaXQgcmVuZGVycyBtdWx0aXBsZSBlbGVtZW50czpcbicgKyB0ZW1wbGF0ZQ0KICAgICAgICAgICAgKTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgLy8gdHJlZSBtYW5hZ2VtZW50DQogICAgICBpZiAoIXJvb3QpIHsNCiAgICAgICAgcm9vdCA9IGVsZW1lbnQ7DQogICAgICAgIGNoZWNrUm9vdENvbnN0cmFpbnRzKHJvb3QpOw0KICAgICAgfSBlbHNlIGlmICghc3RhY2subGVuZ3RoKSB7DQogICAgICAgIC8vIGFsbG93IHJvb3QgZWxlbWVudHMgd2l0aCB2LWlmLCB2LWVsc2UtaWYgYW5kIHYtZWxzZQ0KICAgICAgICBpZiAocm9vdC5pZiAmJiAoZWxlbWVudC5lbHNlaWYgfHwgZWxlbWVudC5lbHNlKSkgew0KICAgICAgICAgIGNoZWNrUm9vdENvbnN0cmFpbnRzKGVsZW1lbnQpOw0KICAgICAgICAgIGFkZElmQ29uZGl0aW9uKHJvb3QsIHsNCiAgICAgICAgICAgIGV4cDogZWxlbWVudC5lbHNlaWYsDQogICAgICAgICAgICBibG9jazogZWxlbWVudA0KICAgICAgICAgIH0pOw0KICAgICAgICB9IGVsc2UgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiAhd2FybmVkKSB7DQogICAgICAgICAgd2FybmVkID0gdHJ1ZTsNCiAgICAgICAgICB3YXJuJDEoDQogICAgICAgICAgICAiQ29tcG9uZW50IHRlbXBsYXRlIHNob3VsZCBjb250YWluIGV4YWN0bHkgb25lIHJvb3QgZWxlbWVudDoiICsNCiAgICAgICAgICAgICJcblxuIiArIHRlbXBsYXRlICsgIlxuXG4iICsNCiAgICAgICAgICAgICJJZiB5b3UgYXJlIHVzaW5nIHYtaWYgb24gbXVsdGlwbGUgZWxlbWVudHMsICIgKw0KICAgICAgICAgICAgInVzZSB2LWVsc2UtaWYgdG8gY2hhaW4gdGhlbSBpbnN0ZWFkLiINCiAgICAgICAgICApOw0KICAgICAgICB9DQogICAgICB9DQogICAgICBpZiAoY3VycmVudFBhcmVudCAmJiAhZWxlbWVudC5mb3JiaWRkZW4pIHsNCiAgICAgICAgaWYgKGVsZW1lbnQuZWxzZWlmIHx8IGVsZW1lbnQuZWxzZSkgew0KICAgICAgICAgIHByb2Nlc3NJZkNvbmRpdGlvbnMoZWxlbWVudCwgY3VycmVudFBhcmVudCk7DQogICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5zbG90U2NvcGUpIHsgLy8gc2NvcGVkIHNsb3QNCiAgICAgICAgICBjdXJyZW50UGFyZW50LnBsYWluID0gZmFsc2U7DQogICAgICAgICAgdmFyIG5hbWUgPSBlbGVtZW50LnNsb3RUYXJnZXQgfHwgJ2RlZmF1bHQnOyhjdXJyZW50UGFyZW50LnNjb3BlZFNsb3RzIHx8IChjdXJyZW50UGFyZW50LnNjb3BlZFNsb3RzID0ge30pKVtuYW1lXSA9IGVsZW1lbnQ7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgY3VycmVudFBhcmVudC5jaGlsZHJlbi5wdXNoKGVsZW1lbnQpOw0KICAgICAgICAgIGVsZW1lbnQucGFyZW50ID0gY3VycmVudFBhcmVudDsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYgKCF1bmFyeSkgew0KICAgICAgICBjdXJyZW50UGFyZW50ID0gZWxlbWVudDsNCiAgICAgICAgc3RhY2sucHVzaChlbGVtZW50KTsNCiAgICAgIH0NCiAgICAgIC8vIGFwcGx5IHBvc3QtdHJhbnNmb3Jtcw0KICAgICAgZm9yICh2YXIgaSQyID0gMDsgaSQyIDwgcG9zdFRyYW5zZm9ybXMubGVuZ3RoOyBpJDIrKykgew0KICAgICAgICBwb3N0VHJhbnNmb3Jtc1tpJDJdKGVsZW1lbnQsIG9wdGlvbnMpOw0KICAgICAgfQ0KICAgIH0sDQoNCiAgICBlbmQ6IGZ1bmN0aW9uIGVuZCAoKSB7DQogICAgICAvLyByZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZQ0KICAgICAgdmFyIGVsZW1lbnQgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTsNCiAgICAgIHZhciBsYXN0Tm9kZSA9IGVsZW1lbnQuY2hpbGRyZW5bZWxlbWVudC5jaGlsZHJlbi5sZW5ndGggLSAxXTsNCiAgICAgIGlmIChsYXN0Tm9kZSAmJiBsYXN0Tm9kZS50eXBlID09PSAzICYmIGxhc3ROb2RlLnRleHQgPT09ICcgJykgew0KICAgICAgICBlbGVtZW50LmNoaWxkcmVuLnBvcCgpOw0KICAgICAgfQ0KICAgICAgLy8gcG9wIHN0YWNrDQogICAgICBzdGFjay5sZW5ndGggLT0gMTsNCiAgICAgIGN1cnJlbnRQYXJlbnQgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTsNCiAgICAgIC8vIGNoZWNrIHByZSBzdGF0ZQ0KICAgICAgaWYgKGVsZW1lbnQucHJlKSB7DQogICAgICAgIGluVlByZSA9IGZhbHNlOw0KICAgICAgfQ0KICAgICAgaWYgKHBsYXRmb3JtSXNQcmVUYWcoZWxlbWVudC50YWcpKSB7DQogICAgICAgIGluUHJlID0gZmFsc2U7DQogICAgICB9DQogICAgfSwNCg0KICAgIGNoYXJzOiBmdW5jdGlvbiBjaGFycyAodGV4dCkgew0KICAgICAgaWYgKCFjdXJyZW50UGFyZW50KSB7DQogICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgIXdhcm5lZCAmJiB0ZXh0ID09PSB0ZW1wbGF0ZSkgew0KICAgICAgICAgIHdhcm5lZCA9IHRydWU7DQogICAgICAgICAgd2FybiQxKA0KICAgICAgICAgICAgJ0NvbXBvbmVudCB0ZW1wbGF0ZSByZXF1aXJlcyBhIHJvb3QgZWxlbWVudCwgcmF0aGVyIHRoYW4ganVzdCB0ZXh0OlxuXG4nICsgdGVtcGxhdGUNCiAgICAgICAgICApOw0KICAgICAgICB9DQogICAgICAgIHJldHVybg0KICAgICAgfQ0KICAgICAgLy8gSUUgdGV4dGFyZWEgcGxhY2Vob2xkZXIgYnVnDQogICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8NCiAgICAgIGlmIChpc0lFICYmDQogICAgICAgICAgY3VycmVudFBhcmVudC50YWcgPT09ICd0ZXh0YXJlYScgJiYNCiAgICAgICAgICBjdXJyZW50UGFyZW50LmF0dHJzTWFwLnBsYWNlaG9sZGVyID09PSB0ZXh0KSB7DQogICAgICAgIHJldHVybg0KICAgICAgfQ0KICAgICAgdGV4dCA9IGluUHJlIHx8IHRleHQudHJpbSgpDQogICAgICAgID8gZGVjb2RlSFRNTENhY2hlZCh0ZXh0KQ0KICAgICAgICAvLyBvbmx5IHByZXNlcnZlIHdoaXRlc3BhY2UgaWYgaXRzIG5vdCByaWdodCBhZnRlciBhIHN0YXJ0aW5nIHRhZw0KICAgICAgICA6IHByZXNlcnZlV2hpdGVzcGFjZSAmJiBjdXJyZW50UGFyZW50LmNoaWxkcmVuLmxlbmd0aCA/ICcgJyA6ICcnOw0KICAgICAgaWYgKHRleHQpIHsNCiAgICAgICAgdmFyIGV4cHJlc3Npb247DQogICAgICAgIGlmICghaW5WUHJlICYmIHRleHQgIT09ICcgJyAmJiAoZXhwcmVzc2lvbiA9IHBhcnNlVGV4dCh0ZXh0LCBkZWxpbWl0ZXJzKSkpIHsNCiAgICAgICAgICBjdXJyZW50UGFyZW50LmNoaWxkcmVuLnB1c2goew0KICAgICAgICAgICAgdHlwZTogMiwNCiAgICAgICAgICAgIGV4cHJlc3Npb246IGV4cHJlc3Npb24sDQogICAgICAgICAgICB0ZXh0OiB0ZXh0DQogICAgICAgICAgfSk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgY3VycmVudFBhcmVudC5jaGlsZHJlbi5wdXNoKHsNCiAgICAgICAgICAgIHR5cGU6IDMsDQogICAgICAgICAgICB0ZXh0OiB0ZXh0DQogICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogIH0pOw0KICByZXR1cm4gcm9vdA0KfQ0KDQpmdW5jdGlvbiBwcm9jZXNzUHJlIChlbCkgew0KICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtcHJlJykgIT0gbnVsbCkgew0KICAgIGVsLnByZSA9IHRydWU7DQogIH0NCn0NCg0KZnVuY3Rpb24gcHJvY2Vzc1Jhd0F0dHJzIChlbCkgew0KICB2YXIgbCA9IGVsLmF0dHJzTGlzdC5sZW5ndGg7DQogIGlmIChsKSB7DQogICAgdmFyIGF0dHJzID0gZWwuYXR0cnMgPSBuZXcgQXJyYXkobCk7DQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHsNCiAgICAgIGF0dHJzW2ldID0gew0KICAgICAgICBuYW1lOiBlbC5hdHRyc0xpc3RbaV0ubmFtZSwNCiAgICAgICAgdmFsdWU6IEpTT04uc3RyaW5naWZ5KGVsLmF0dHJzTGlzdFtpXS52YWx1ZSkNCiAgICAgIH07DQogICAgfQ0KICB9IGVsc2UgaWYgKCFlbC5wcmUpIHsNCiAgICAvLyBub24gcm9vdCBub2RlIGluIHByZSBibG9ja3Mgd2l0aCBubyBhdHRyaWJ1dGVzDQogICAgZWwucGxhaW4gPSB0cnVlOw0KICB9DQp9DQoNCmZ1bmN0aW9uIHByb2Nlc3NLZXkgKGVsKSB7DQogIHZhciBleHAgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ2tleScpOw0KICBpZiAoZXhwKSB7DQogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBlbC50YWcgPT09ICd0ZW1wbGF0ZScpIHsNCiAgICAgIHdhcm4kMSgiPHRlbXBsYXRlPiBjYW5ub3QgYmUga2V5ZWQuIFBsYWNlIHRoZSBrZXkgb24gcmVhbCBlbGVtZW50cyBpbnN0ZWFkLiIpOw0KICAgIH0NCiAgICBlbC5rZXkgPSBleHA7DQogIH0NCn0NCg0KZnVuY3Rpb24gcHJvY2Vzc1JlZiAoZWwpIHsNCiAgdmFyIHJlZiA9IGdldEJpbmRpbmdBdHRyKGVsLCAncmVmJyk7DQogIGlmIChyZWYpIHsNCiAgICBlbC5yZWYgPSByZWY7DQogICAgZWwucmVmSW5Gb3IgPSBjaGVja0luRm9yKGVsKTsNCiAgfQ0KfQ0KDQpmdW5jdGlvbiBwcm9jZXNzRm9yIChlbCkgew0KICB2YXIgZXhwOw0KICBpZiAoKGV4cCA9IGdldEFuZFJlbW92ZUF0dHIoZWwsICd2LWZvcicpKSkgew0KICAgIHZhciBpbk1hdGNoID0gZXhwLm1hdGNoKGZvckFsaWFzUkUpOw0KICAgIGlmICghaW5NYXRjaCkgew0KICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4kMSgNCiAgICAgICAgKCJJbnZhbGlkIHYtZm9yIGV4cHJlc3Npb246ICIgKyBleHApDQogICAgICApOw0KICAgICAgcmV0dXJuDQogICAgfQ0KICAgIGVsLmZvciA9IGluTWF0Y2hbMl0udHJpbSgpOw0KICAgIHZhciBhbGlhcyA9IGluTWF0Y2hbMV0udHJpbSgpOw0KICAgIHZhciBpdGVyYXRvck1hdGNoID0gYWxpYXMubWF0Y2goZm9ySXRlcmF0b3JSRSk7DQogICAgaWYgKGl0ZXJhdG9yTWF0Y2gpIHsNCiAgICAgIGVsLmFsaWFzID0gaXRlcmF0b3JNYXRjaFsxXS50cmltKCk7DQogICAgICBlbC5pdGVyYXRvcjEgPSBpdGVyYXRvck1hdGNoWzJdLnRyaW0oKTsNCiAgICAgIGlmIChpdGVyYXRvck1hdGNoWzNdKSB7DQogICAgICAgIGVsLml0ZXJhdG9yMiA9IGl0ZXJhdG9yTWF0Y2hbM10udHJpbSgpOw0KICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICBlbC5hbGlhcyA9IGFsaWFzOw0KICAgIH0NCiAgfQ0KfQ0KDQpmdW5jdGlvbiBwcm9jZXNzSWYgKGVsKSB7DQogIHZhciBleHAgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAndi1pZicpOw0KICBpZiAoZXhwKSB7DQogICAgZWwuaWYgPSBleHA7DQogICAgYWRkSWZDb25kaXRpb24oZWwsIHsNCiAgICAgIGV4cDogZXhwLA0KICAgICAgYmxvY2s6IGVsDQogICAgfSk7DQogIH0gZWxzZSB7DQogICAgaWYgKGdldEFuZFJlbW92ZUF0dHIoZWwsICd2LWVsc2UnKSAhPSBudWxsKSB7DQogICAgICBlbC5lbHNlID0gdHJ1ZTsNCiAgICB9DQogICAgdmFyIGVsc2VpZiA9IGdldEFuZFJlbW92ZUF0dHIoZWwsICd2LWVsc2UtaWYnKTsNCiAgICBpZiAoZWxzZWlmKSB7DQogICAgICBlbC5lbHNlaWYgPSBlbHNlaWY7DQogICAgfQ0KICB9DQp9DQoNCmZ1bmN0aW9uIHByb2Nlc3NJZkNvbmRpdGlvbnMgKGVsLCBwYXJlbnQpIHsNCiAgdmFyIHByZXYgPSBmaW5kUHJldkVsZW1lbnQocGFyZW50LmNoaWxkcmVuKTsNCiAgaWYgKHByZXYgJiYgcHJldi5pZikgew0KICAgIGFkZElmQ29uZGl0aW9uKHByZXYsIHsNCiAgICAgIGV4cDogZWwuZWxzZWlmLA0KICAgICAgYmxvY2s6IGVsDQogICAgfSk7DQogIH0gZWxzZSB7DQogICAgd2FybiQxKA0KICAgICAgInYtIiArIChlbC5lbHNlaWYgPyAoJ2Vsc2UtaWY9IicgKyBlbC5lbHNlaWYgKyAnIicpIDogJ2Vsc2UnKSArICIgIiArDQogICAgICAidXNlZCBvbiBlbGVtZW50IDwiICsgKGVsLnRhZykgKyAiPiB3aXRob3V0IGNvcnJlc3BvbmRpbmcgdi1pZi4iDQogICAgKTsNCiAgfQ0KfQ0KDQpmdW5jdGlvbiBhZGRJZkNvbmRpdGlvbiAoZWwsIGNvbmRpdGlvbikgew0KICBpZiAoIWVsLmlmQ29uZGl0aW9ucykgew0KICAgIGVsLmlmQ29uZGl0aW9ucyA9IFtdOw0KICB9DQogIGVsLmlmQ29uZGl0aW9ucy5wdXNoKGNvbmRpdGlvbik7DQp9DQoNCmZ1bmN0aW9uIHByb2Nlc3NPbmNlIChlbCkgew0KICB2YXIgb25jZSA9IGdldEFuZFJlbW92ZUF0dHIoZWwsICd2LW9uY2UnKTsNCiAgaWYgKG9uY2UgIT0gbnVsbCkgew0KICAgIGVsLm9uY2UgPSB0cnVlOw0KICB9DQp9DQoNCmZ1bmN0aW9uIHByb2Nlc3NTbG90IChlbCkgew0KICBpZiAoZWwudGFnID09PSAnc2xvdCcpIHsNCiAgICBlbC5zbG90TmFtZSA9IGdldEJpbmRpbmdBdHRyKGVsLCAnbmFtZScpOw0KICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgZWwua2V5KSB7DQogICAgICB3YXJuJDEoDQogICAgICAgICJga2V5YCBkb2VzIG5vdCB3b3JrIG9uIDxzbG90PiBiZWNhdXNlIHNsb3RzIGFyZSBhYnN0cmFjdCBvdXRsZXRzICIgKw0KICAgICAgICAiYW5kIGNhbiBwb3NzaWJseSBleHBhbmQgaW50byBtdWx0aXBsZSBlbGVtZW50cy4gIiArDQogICAgICAgICJVc2UgdGhlIGtleSBvbiBhIHdyYXBwaW5nIGVsZW1lbnQgaW5zdGVhZC4iDQogICAgICApOw0KICAgIH0NCiAgfSBlbHNlIHsNCiAgICB2YXIgc2xvdFRhcmdldCA9IGdldEJpbmRpbmdBdHRyKGVsLCAnc2xvdCcpOw0KICAgIGlmIChzbG90VGFyZ2V0KSB7DQogICAgICBlbC5zbG90VGFyZ2V0ID0gc2xvdFRhcmdldCA9PT0gJyIiJyA/ICciZGVmYXVsdCInIDogc2xvdFRhcmdldDsNCiAgICB9DQogICAgaWYgKGVsLnRhZyA9PT0gJ3RlbXBsYXRlJykgew0KICAgICAgZWwuc2xvdFNjb3BlID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3Njb3BlJyk7DQogICAgfQ0KICB9DQp9DQoNCmZ1bmN0aW9uIHByb2Nlc3NDb21wb25lbnQgKGVsKSB7DQogIHZhciBiaW5kaW5nOw0KICBpZiAoKGJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ2lzJykpKSB7DQogICAgZWwuY29tcG9uZW50ID0gYmluZGluZzsNCiAgfQ0KICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ2lubGluZS10ZW1wbGF0ZScpICE9IG51bGwpIHsNCiAgICBlbC5pbmxpbmVUZW1wbGF0ZSA9IHRydWU7DQogIH0NCn0NCg0KZnVuY3Rpb24gcHJvY2Vzc0F0dHJzIChlbCkgew0KICB2YXIgbGlzdCA9IGVsLmF0dHJzTGlzdDsNCiAgdmFyIGksIGwsIG5hbWUsIHJhd05hbWUsIHZhbHVlLCBhcmcsIG1vZGlmaWVycywgaXNQcm9wOw0KICBmb3IgKGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsOyBpKyspIHsNCiAgICBuYW1lID0gcmF3TmFtZSA9IGxpc3RbaV0ubmFtZTsNCiAgICB2YWx1ZSA9IGxpc3RbaV0udmFsdWU7DQogICAgaWYgKGRpclJFLnRlc3QobmFtZSkpIHsNCiAgICAgIC8vIG1hcmsgZWxlbWVudCBhcyBkeW5hbWljDQogICAgICBlbC5oYXNCaW5kaW5ncyA9IHRydWU7DQogICAgICAvLyBtb2RpZmllcnMNCiAgICAgIG1vZGlmaWVycyA9IHBhcnNlTW9kaWZpZXJzKG5hbWUpOw0KICAgICAgaWYgKG1vZGlmaWVycykgew0KICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKG1vZGlmaWVyUkUsICcnKTsNCiAgICAgIH0NCiAgICAgIGlmIChiaW5kUkUudGVzdChuYW1lKSkgeyAvLyB2LWJpbmQNCiAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZShiaW5kUkUsICcnKTsNCiAgICAgICAgdmFsdWUgPSBwYXJzZUZpbHRlcnModmFsdWUpOw0KICAgICAgICBpZiAobW9kaWZpZXJzKSB7DQogICAgICAgICAgaWYgKG1vZGlmaWVycy5wcm9wKSB7DQogICAgICAgICAgICBpc1Byb3AgPSB0cnVlOw0KICAgICAgICAgICAgbmFtZSA9IGNhbWVsaXplKG5hbWUpOw0KICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdpbm5lckh0bWwnKSB7IG5hbWUgPSAnaW5uZXJIVE1MJzsgfQ0KICAgICAgICAgIH0NCiAgICAgICAgICBpZiAobW9kaWZpZXJzLmNhbWVsKSB7DQogICAgICAgICAgICBuYW1lID0gY2FtZWxpemUobmFtZSk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmIChpc1Byb3AgfHwgcGxhdGZvcm1NdXN0VXNlUHJvcChlbC50YWcsIG5hbWUpKSB7DQogICAgICAgICAgYWRkUHJvcChlbCwgbmFtZSwgdmFsdWUpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIGFkZEF0dHIoZWwsIG5hbWUsIHZhbHVlKTsNCiAgICAgICAgfQ0KICAgICAgfSBlbHNlIGlmIChvblJFLnRlc3QobmFtZSkpIHsgLy8gdi1vbg0KICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKG9uUkUsICcnKTsNCiAgICAgICAgYWRkSGFuZGxlcihlbCwgbmFtZSwgdmFsdWUsIG1vZGlmaWVycyk7DQogICAgICB9IGVsc2UgeyAvLyBub3JtYWwgZGlyZWN0aXZlcw0KICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKGRpclJFLCAnJyk7DQogICAgICAgIC8vIHBhcnNlIGFyZw0KICAgICAgICB2YXIgYXJnTWF0Y2ggPSBuYW1lLm1hdGNoKGFyZ1JFKTsNCiAgICAgICAgaWYgKGFyZ01hdGNoICYmIChhcmcgPSBhcmdNYXRjaFsxXSkpIHsNCiAgICAgICAgICBuYW1lID0gbmFtZS5zbGljZSgwLCAtKGFyZy5sZW5ndGggKyAxKSk7DQogICAgICAgIH0NCiAgICAgICAgYWRkRGlyZWN0aXZlKGVsLCBuYW1lLCByYXdOYW1lLCB2YWx1ZSwgYXJnLCBtb2RpZmllcnMpOw0KICAgICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIG5hbWUgPT09ICdtb2RlbCcpIHsNCiAgICAgICAgICBjaGVja0ZvckFsaWFzTW9kZWwoZWwsIHZhbHVlKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICAvLyBsaXRlcmFsIGF0dHJpYnV0ZQ0KICAgICAgew0KICAgICAgICB2YXIgZXhwcmVzc2lvbiA9IHBhcnNlVGV4dCh2YWx1ZSwgZGVsaW1pdGVycyk7DQogICAgICAgIGlmIChleHByZXNzaW9uKSB7DQogICAgICAgICAgd2FybiQxKA0KICAgICAgICAgICAgbmFtZSArICI9XCIiICsgdmFsdWUgKyAiXCI6ICIgKw0KICAgICAgICAgICAgJ0ludGVycG9sYXRpb24gaW5zaWRlIGF0dHJpYnV0ZXMgaGFzIGJlZW4gcmVtb3ZlZC4gJyArDQogICAgICAgICAgICAnVXNlIHYtYmluZCBvciB0aGUgY29sb24gc2hvcnRoYW5kIGluc3RlYWQuIEZvciBleGFtcGxlLCAnICsNCiAgICAgICAgICAgICdpbnN0ZWFkIG9mIDxkaXYgaWQ9Int7IHZhbCB9fSI+LCB1c2UgPGRpdiA6aWQ9InZhbCI+LicNCiAgICAgICAgICApOw0KICAgICAgICB9DQogICAgICB9DQogICAgICBhZGRBdHRyKGVsLCBuYW1lLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpOw0KICAgIH0NCiAgfQ0KfQ0KDQpmdW5jdGlvbiBjaGVja0luRm9yIChlbCkgew0KICB2YXIgcGFyZW50ID0gZWw7DQogIHdoaWxlIChwYXJlbnQpIHsNCiAgICBpZiAocGFyZW50LmZvciAhPT0gdW5kZWZpbmVkKSB7DQogICAgICByZXR1cm4gdHJ1ZQ0KICAgIH0NCiAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50Ow0KICB9DQogIHJldHVybiBmYWxzZQ0KfQ0KDQpmdW5jdGlvbiBwYXJzZU1vZGlmaWVycyAobmFtZSkgew0KICB2YXIgbWF0Y2ggPSBuYW1lLm1hdGNoKG1vZGlmaWVyUkUpOw0KICBpZiAobWF0Y2gpIHsNCiAgICB2YXIgcmV0ID0ge307DQogICAgbWF0Y2guZm9yRWFjaChmdW5jdGlvbiAobSkgeyByZXRbbS5zbGljZSgxKV0gPSB0cnVlOyB9KTsNCiAgICByZXR1cm4gcmV0DQogIH0NCn0NCg0KZnVuY3Rpb24gbWFrZUF0dHJzTWFwIChhdHRycykgew0KICB2YXIgbWFwID0ge307DQogIGZvciAodmFyIGkgPSAwLCBsID0gYXR0cnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7DQogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBtYXBbYXR0cnNbaV0ubmFtZV0gJiYgIWlzSUUpIHsNCiAgICAgIHdhcm4kMSgnZHVwbGljYXRlIGF0dHJpYnV0ZTogJyArIGF0dHJzW2ldLm5hbWUpOw0KICAgIH0NCiAgICBtYXBbYXR0cnNbaV0ubmFtZV0gPSBhdHRyc1tpXS52YWx1ZTsNCiAgfQ0KICByZXR1cm4gbWFwDQp9DQoNCmZ1bmN0aW9uIGZpbmRQcmV2RWxlbWVudCAoY2hpbGRyZW4pIHsNCiAgdmFyIGkgPSBjaGlsZHJlbi5sZW5ndGg7DQogIHdoaWxlIChpLS0pIHsNCiAgICBpZiAoY2hpbGRyZW5baV0udGFnKSB7IHJldHVybiBjaGlsZHJlbltpXSB9DQogIH0NCn0NCg0KZnVuY3Rpb24gaXNGb3JiaWRkZW5UYWcgKGVsKSB7DQogIHJldHVybiAoDQogICAgZWwudGFnID09PSAnc3R5bGUnIHx8DQogICAgKGVsLnRhZyA9PT0gJ3NjcmlwdCcgJiYgKA0KICAgICAgIWVsLmF0dHJzTWFwLnR5cGUgfHwNCiAgICAgIGVsLmF0dHJzTWFwLnR5cGUgPT09ICd0ZXh0L2phdmFzY3JpcHQnDQogICAgKSkNCiAgKQ0KfQ0KDQp2YXIgaWVOU0J1ZyA9IC9eeG1sbnM6TlNcZCsvOw0KdmFyIGllTlNQcmVmaXggPSAvXk5TXGQrOi87DQoNCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovDQpmdW5jdGlvbiBndWFyZElFU1ZHQnVnIChhdHRycykgew0KICB2YXIgcmVzID0gW107DQogIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspIHsNCiAgICB2YXIgYXR0ciA9IGF0dHJzW2ldOw0KICAgIGlmICghaWVOU0J1Zy50ZXN0KGF0dHIubmFtZSkpIHsNCiAgICAgIGF0dHIubmFtZSA9IGF0dHIubmFtZS5yZXBsYWNlKGllTlNQcmVmaXgsICcnKTsNCiAgICAgIHJlcy5wdXNoKGF0dHIpOw0KICAgIH0NCiAgfQ0KICByZXR1cm4gcmVzDQp9DQoNCmZ1bmN0aW9uIGNoZWNrRm9yQWxpYXNNb2RlbCAoZWwsIHZhbHVlKSB7DQogIHZhciBfZWwgPSBlbDsNCiAgd2hpbGUgKF9lbCkgew0KICAgIGlmIChfZWwuZm9yICYmIF9lbC5hbGlhcyA9PT0gdmFsdWUpIHsNCiAgICAgIHdhcm4kMSgNCiAgICAgICAgIjwiICsgKGVsLnRhZykgKyAiIHYtbW9kZWw9XCIiICsgdmFsdWUgKyAiXCI+OiAiICsNCiAgICAgICAgIllvdSBhcmUgYmluZGluZyB2LW1vZGVsIGRpcmVjdGx5IHRvIGEgdi1mb3IgaXRlcmF0aW9uIGFsaWFzLiAiICsNCiAgICAgICAgIlRoaXMgd2lsbCBub3QgYmUgYWJsZSB0byBtb2RpZnkgdGhlIHYtZm9yIHNvdXJjZSBhcnJheSBiZWNhdXNlICIgKw0KICAgICAgICAid3JpdGluZyB0byB0aGUgYWxpYXMgaXMgbGlrZSBtb2RpZnlpbmcgYSBmdW5jdGlvbiBsb2NhbCB2YXJpYWJsZS4gIiArDQogICAgICAgICJDb25zaWRlciB1c2luZyBhbiBhcnJheSBvZiBvYmplY3RzIGFuZCB1c2Ugdi1tb2RlbCBvbiBhbiBvYmplY3QgcHJvcGVydHkgaW5zdGVhZC4iDQogICAgICApOw0KICAgIH0NCiAgICBfZWwgPSBfZWwucGFyZW50Ow0KICB9DQp9DQoNCi8qICAqLw0KDQp2YXIgaXNTdGF0aWNLZXk7DQp2YXIgaXNQbGF0Zm9ybVJlc2VydmVkVGFnOw0KDQp2YXIgZ2VuU3RhdGljS2V5c0NhY2hlZCA9IGNhY2hlZChnZW5TdGF0aWNLZXlzJDEpOw0KDQovKioNCiAqIEdvYWwgb2YgdGhlIG9wdGltaXplcjogd2FsayB0aGUgZ2VuZXJhdGVkIHRlbXBsYXRlIEFTVCB0cmVlDQogKiBhbmQgZGV0ZWN0IHN1Yi10cmVlcyB0aGF0IGFyZSBwdXJlbHkgc3RhdGljLCBpLmUuIHBhcnRzIG9mDQogKiB0aGUgRE9NIHRoYXQgbmV2ZXIgbmVlZHMgdG8gY2hhbmdlLg0KICoNCiAqIE9uY2Ugd2UgZGV0ZWN0IHRoZXNlIHN1Yi10cmVlcywgd2UgY2FuOg0KICoNCiAqIDEuIEhvaXN0IHRoZW0gaW50byBjb25zdGFudHMsIHNvIHRoYXQgd2Ugbm8gbG9uZ2VyIG5lZWQgdG8NCiAqICAgIGNyZWF0ZSBmcmVzaCBub2RlcyBmb3IgdGhlbSBvbiBlYWNoIHJlLXJlbmRlcjsNCiAqIDIuIENvbXBsZXRlbHkgc2tpcCB0aGVtIGluIHRoZSBwYXRjaGluZyBwcm9jZXNzLg0KICovDQpmdW5jdGlvbiBvcHRpbWl6ZSAocm9vdCwgb3B0aW9ucykgew0KICBpZiAoIXJvb3QpIHsgcmV0dXJuIH0NCiAgaXNTdGF0aWNLZXkgPSBnZW5TdGF0aWNLZXlzQ2FjaGVkKG9wdGlvbnMuc3RhdGljS2V5cyB8fCAnJyk7DQogIGlzUGxhdGZvcm1SZXNlcnZlZFRhZyA9IG9wdGlvbnMuaXNSZXNlcnZlZFRhZyB8fCBubzsNCiAgLy8gZmlyc3QgcGFzczogbWFyayBhbGwgbm9uLXN0YXRpYyBub2Rlcy4NCiAgbWFya1N0YXRpYyhyb290KTsNCiAgLy8gc2Vjb25kIHBhc3M6IG1hcmsgc3RhdGljIHJvb3RzLg0KICBtYXJrU3RhdGljUm9vdHMocm9vdCwgZmFsc2UpOw0KfQ0KDQpmdW5jdGlvbiBnZW5TdGF0aWNLZXlzJDEgKGtleXMpIHsNCiAgcmV0dXJuIG1ha2VNYXAoDQogICAgJ3R5cGUsdGFnLGF0dHJzTGlzdCxhdHRyc01hcCxwbGFpbixwYXJlbnQsY2hpbGRyZW4sYXR0cnMnICsNCiAgICAoa2V5cyA/ICcsJyArIGtleXMgOiAnJykNCiAgKQ0KfQ0KDQpmdW5jdGlvbiBtYXJrU3RhdGljIChub2RlKSB7DQogIG5vZGUuc3RhdGljID0gaXNTdGF0aWMobm9kZSk7DQogIGlmIChub2RlLnR5cGUgPT09IDEpIHsNCiAgICAvLyBkbyBub3QgbWFrZSBjb21wb25lbnQgc2xvdCBjb250ZW50IHN0YXRpYy4gdGhpcyBhdm9pZHMNCiAgICAvLyAxLiBjb21wb25lbnRzIG5vdCBhYmxlIHRvIG11dGF0ZSBzbG90IG5vZGVzDQogICAgLy8gMi4gc3RhdGljIHNsb3QgY29udGVudCBmYWlscyBmb3IgaG90LXJlbG9hZGluZw0KICAgIGlmICgNCiAgICAgICFpc1BsYXRmb3JtUmVzZXJ2ZWRUYWcobm9kZS50YWcpICYmDQogICAgICBub2RlLnRhZyAhPT0gJ3Nsb3QnICYmDQogICAgICBub2RlLmF0dHJzTWFwWydpbmxpbmUtdGVtcGxhdGUnXSA9PSBudWxsDQogICAgKSB7DQogICAgICByZXR1cm4NCiAgICB9DQogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykgew0KICAgICAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTsNCiAgICAgIG1hcmtTdGF0aWMoY2hpbGQpOw0KICAgICAgaWYgKCFjaGlsZC5zdGF0aWMpIHsNCiAgICAgICAgbm9kZS5zdGF0aWMgPSBmYWxzZTsNCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg0KZnVuY3Rpb24gbWFya1N0YXRpY1Jvb3RzIChub2RlLCBpc0luRm9yKSB7DQogIGlmIChub2RlLnR5cGUgPT09IDEpIHsNCiAgICBpZiAobm9kZS5zdGF0aWMgfHwgbm9kZS5vbmNlKSB7DQogICAgICBub2RlLnN0YXRpY0luRm9yID0gaXNJbkZvcjsNCiAgICB9DQogICAgLy8gRm9yIGEgbm9kZSB0byBxdWFsaWZ5IGFzIGEgc3RhdGljIHJvb3QsIGl0IHNob3VsZCBoYXZlIGNoaWxkcmVuIHRoYXQNCiAgICAvLyBhcmUgbm90IGp1c3Qgc3RhdGljIHRleHQuIE90aGVyd2lzZSB0aGUgY29zdCBvZiBob2lzdGluZyBvdXQgd2lsbA0KICAgIC8vIG91dHdlaWdoIHRoZSBiZW5lZml0cyBhbmQgaXQncyBiZXR0ZXIgb2ZmIHRvIGp1c3QgYWx3YXlzIHJlbmRlciBpdCBmcmVzaC4NCiAgICBpZiAobm9kZS5zdGF0aWMgJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggJiYgISgNCiAgICAgIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmDQogICAgICBub2RlLmNoaWxkcmVuWzBdLnR5cGUgPT09IDMNCiAgICApKSB7DQogICAgICBub2RlLnN0YXRpY1Jvb3QgPSB0cnVlOw0KICAgICAgcmV0dXJuDQogICAgfSBlbHNlIHsNCiAgICAgIG5vZGUuc3RhdGljUm9vdCA9IGZhbHNlOw0KICAgIH0NCiAgICBpZiAobm9kZS5jaGlsZHJlbikgew0KICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykgew0KICAgICAgICBtYXJrU3RhdGljUm9vdHMobm9kZS5jaGlsZHJlbltpXSwgaXNJbkZvciB8fCAhIW5vZGUuZm9yKTsNCiAgICAgIH0NCiAgICB9DQogICAgaWYgKG5vZGUuaWZDb25kaXRpb25zKSB7DQogICAgICB3YWxrVGhyb3VnaENvbmRpdGlvbnNCbG9ja3Mobm9kZS5pZkNvbmRpdGlvbnMsIGlzSW5Gb3IpOw0KICAgIH0NCiAgfQ0KfQ0KDQpmdW5jdGlvbiB3YWxrVGhyb3VnaENvbmRpdGlvbnNCbG9ja3MgKGNvbmRpdGlvbkJsb2NrcywgaXNJbkZvcikgew0KICBmb3IgKHZhciBpID0gMSwgbGVuID0gY29uZGl0aW9uQmxvY2tzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7DQogICAgbWFya1N0YXRpY1Jvb3RzKGNvbmRpdGlvbkJsb2Nrc1tpXS5ibG9jaywgaXNJbkZvcik7DQogIH0NCn0NCg0KZnVuY3Rpb24gaXNTdGF0aWMgKG5vZGUpIHsNCiAgaWYgKG5vZGUudHlwZSA9PT0gMikgeyAvLyBleHByZXNzaW9uDQogICAgcmV0dXJuIGZhbHNlDQogIH0NCiAgaWYgKG5vZGUudHlwZSA9PT0gMykgeyAvLyB0ZXh0DQogICAgcmV0dXJuIHRydWUNCiAgfQ0KICByZXR1cm4gISEobm9kZS5wcmUgfHwgKA0KICAgICFub2RlLmhhc0JpbmRpbmdzICYmIC8vIG5vIGR5bmFtaWMgYmluZGluZ3MNCiAgICAhbm9kZS5pZiAmJiAhbm9kZS5mb3IgJiYgLy8gbm90IHYtaWYgb3Igdi1mb3Igb3Igdi1lbHNlDQogICAgIWlzQnVpbHRJblRhZyhub2RlLnRhZykgJiYgLy8gbm90IGEgYnVpbHQtaW4NCiAgICBpc1BsYXRmb3JtUmVzZXJ2ZWRUYWcobm9kZS50YWcpICYmIC8vIG5vdCBhIGNvbXBvbmVudA0KICAgICFpc0RpcmVjdENoaWxkT2ZUZW1wbGF0ZUZvcihub2RlKSAmJg0KICAgIE9iamVjdC5rZXlzKG5vZGUpLmV2ZXJ5KGlzU3RhdGljS2V5KQ0KICApKQ0KfQ0KDQpmdW5jdGlvbiBpc0RpcmVjdENoaWxkT2ZUZW1wbGF0ZUZvciAobm9kZSkgew0KICB3aGlsZSAobm9kZS5wYXJlbnQpIHsNCiAgICBub2RlID0gbm9kZS5wYXJlbnQ7DQogICAgaWYgKG5vZGUudGFnICE9PSAndGVtcGxhdGUnKSB7DQogICAgICByZXR1cm4gZmFsc2UNCiAgICB9DQogICAgaWYgKG5vZGUuZm9yKSB7DQogICAgICByZXR1cm4gdHJ1ZQ0KICAgIH0NCiAgfQ0KICByZXR1cm4gZmFsc2UNCn0NCg0KLyogICovDQoNCnZhciBmbkV4cFJFID0gL15ccyooW1x3JF9dK3xcKFteKV0qP1wpKVxzKj0+fF5mdW5jdGlvblxzKlwoLzsNCnZhciBzaW1wbGVQYXRoUkUgPSAvXlxzKltBLVphLXpfJF1bXHckXSooPzpcLltBLVphLXpfJF1bXHckXSp8XFsnLio/J118XFsiLio/Il18XFtcZCtdfFxbW0EtWmEtel8kXVtcdyRdKl0pKlxzKiQvOw0KDQovLyBrZXlDb2RlIGFsaWFzZXMNCnZhciBrZXlDb2RlcyA9IHsNCiAgZXNjOiAyNywNCiAgdGFiOiA5LA0KICBlbnRlcjogMTMsDQogIHNwYWNlOiAzMiwNCiAgdXA6IDM4LA0KICBsZWZ0OiAzNywNCiAgcmlnaHQ6IDM5LA0KICBkb3duOiA0MCwNCiAgJ2RlbGV0ZSc6IFs4LCA0Nl0NCn07DQoNCnZhciBtb2RpZmllckNvZGUgPSB7DQogIHN0b3A6ICckZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7JywNCiAgcHJldmVudDogJyRldmVudC5wcmV2ZW50RGVmYXVsdCgpOycsDQogIHNlbGY6ICdpZigkZXZlbnQudGFyZ2V0ICE9PSAkZXZlbnQuY3VycmVudFRhcmdldClyZXR1cm47JywNCiAgY3RybDogJ2lmKCEkZXZlbnQuY3RybEtleSlyZXR1cm47JywNCiAgc2hpZnQ6ICdpZighJGV2ZW50LnNoaWZ0S2V5KXJldHVybjsnLA0KICBhbHQ6ICdpZighJGV2ZW50LmFsdEtleSlyZXR1cm47JywNCiAgbWV0YTogJ2lmKCEkZXZlbnQubWV0YUtleSlyZXR1cm47Jw0KfTsNCg0KZnVuY3Rpb24gZ2VuSGFuZGxlcnMgKGV2ZW50cywgbmF0aXZlKSB7DQogIHZhciByZXMgPSBuYXRpdmUgPyAnbmF0aXZlT246eycgOiAnb246eyc7DQogIGZvciAodmFyIG5hbWUgaW4gZXZlbnRzKSB7DQogICAgcmVzICs9ICJcIiIgKyBuYW1lICsgIlwiOiIgKyAoZ2VuSGFuZGxlcihuYW1lLCBldmVudHNbbmFtZV0pKSArICIsIjsNCiAgfQ0KICByZXR1cm4gcmVzLnNsaWNlKDAsIC0xKSArICd9Jw0KfQ0KDQpmdW5jdGlvbiBnZW5IYW5kbGVyICgNCiAgbmFtZSwNCiAgaGFuZGxlcg0KKSB7DQogIGlmICghaGFuZGxlcikgew0KICAgIHJldHVybiAnZnVuY3Rpb24oKXt9Jw0KICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaGFuZGxlcikpIHsNCiAgICByZXR1cm4gKCJbIiArIChoYW5kbGVyLm1hcChmdW5jdGlvbiAoaGFuZGxlcikgeyByZXR1cm4gZ2VuSGFuZGxlcihuYW1lLCBoYW5kbGVyKTsgfSkuam9pbignLCcpKSArICJdIikNCiAgfSBlbHNlIGlmICghaGFuZGxlci5tb2RpZmllcnMpIHsNCiAgICByZXR1cm4gZm5FeHBSRS50ZXN0KGhhbmRsZXIudmFsdWUpIHx8IHNpbXBsZVBhdGhSRS50ZXN0KGhhbmRsZXIudmFsdWUpDQogICAgICA/IGhhbmRsZXIudmFsdWUNCiAgICAgIDogKCJmdW5jdGlvbigkZXZlbnQpeyIgKyAoaGFuZGxlci52YWx1ZSkgKyAifSIpDQogIH0gZWxzZSB7DQogICAgdmFyIGNvZGUgPSAnJzsNCiAgICB2YXIga2V5cyA9IFtdOw0KICAgIGZvciAodmFyIGtleSBpbiBoYW5kbGVyLm1vZGlmaWVycykgew0KICAgICAgaWYgKG1vZGlmaWVyQ29kZVtrZXldKSB7DQogICAgICAgIGNvZGUgKz0gbW9kaWZpZXJDb2RlW2tleV07DQogICAgICB9IGVsc2Ugew0KICAgICAgICBrZXlzLnB1c2goa2V5KTsNCiAgICAgIH0NCiAgICB9DQogICAgaWYgKGtleXMubGVuZ3RoKSB7DQogICAgICBjb2RlID0gZ2VuS2V5RmlsdGVyKGtleXMpICsgY29kZTsNCiAgICB9DQogICAgdmFyIGhhbmRsZXJDb2RlID0gc2ltcGxlUGF0aFJFLnRlc3QoaGFuZGxlci52YWx1ZSkNCiAgICAgID8gaGFuZGxlci52YWx1ZSArICcoJGV2ZW50KScNCiAgICAgIDogaGFuZGxlci52YWx1ZTsNCiAgICByZXR1cm4gJ2Z1bmN0aW9uKCRldmVudCl7JyArIGNvZGUgKyBoYW5kbGVyQ29kZSArICd9Jw0KICB9DQp9DQoNCmZ1bmN0aW9uIGdlbktleUZpbHRlciAoa2V5cykgew0KICByZXR1cm4gKCJpZigiICsgKGtleXMubWFwKGdlbkZpbHRlckNvZGUpLmpvaW4oJyYmJykpICsgIilyZXR1cm47IikNCn0NCg0KZnVuY3Rpb24gZ2VuRmlsdGVyQ29kZSAoa2V5KSB7DQogIHZhciBrZXlWYWwgPSBwYXJzZUludChrZXksIDEwKTsNCiAgaWYgKGtleVZhbCkgew0KICAgIHJldHVybiAoIiRldmVudC5rZXlDb2RlIT09IiArIGtleVZhbCkNCiAgfQ0KICB2YXIgYWxpYXMgPSBrZXlDb2Rlc1trZXldOw0KICByZXR1cm4gKCJfaygkZXZlbnQua2V5Q29kZSwiICsgKEpTT04uc3RyaW5naWZ5KGtleSkpICsgKGFsaWFzID8gJywnICsgSlNPTi5zdHJpbmdpZnkoYWxpYXMpIDogJycpICsgIikiKQ0KfQ0KDQovKiAgKi8NCg0KZnVuY3Rpb24gYmluZCQyIChlbCwgZGlyKSB7DQogIGVsLndyYXBEYXRhID0gZnVuY3Rpb24gKGNvZGUpIHsNCiAgICByZXR1cm4gKCJfYigiICsgY29kZSArICIsJyIgKyAoZWwudGFnKSArICInLCIgKyAoZGlyLnZhbHVlKSArIChkaXIubW9kaWZpZXJzICYmIGRpci5tb2RpZmllcnMucHJvcCA/ICcsdHJ1ZScgOiAnJykgKyAiKSIpDQogIH07DQp9DQoNCnZhciBiYXNlRGlyZWN0aXZlcyA9IHsNCiAgYmluZDogYmluZCQyLA0KICBjbG9hazogbm9vcA0KfTsNCg0KLyogICovDQoNCi8vIGNvbmZpZ3VyYWJsZSBzdGF0ZQ0KdmFyIHdhcm4kMjsNCnZhciB0cmFuc2Zvcm1zJDE7DQp2YXIgZGF0YUdlbkZuczsNCnZhciBwbGF0Zm9ybURpcmVjdGl2ZXMkMTsNCnZhciBzdGF0aWNSZW5kZXJGbnM7DQp2YXIgb25jZUNvdW50Ow0KdmFyIGN1cnJlbnRPcHRpb25zOw0KDQpmdW5jdGlvbiBnZW5lcmF0ZSAoDQogIGFzdCwNCiAgb3B0aW9ucw0KKSB7DQogIC8vIHNhdmUgcHJldmlvdXMgc3RhdGljUmVuZGVyRm5zIHNvIGdlbmVyYXRlIGNhbGxzIGNhbiBiZSBuZXN0ZWQNCiAgdmFyIHByZXZTdGF0aWNSZW5kZXJGbnMgPSBzdGF0aWNSZW5kZXJGbnM7DQogIHZhciBjdXJyZW50U3RhdGljUmVuZGVyRm5zID0gc3RhdGljUmVuZGVyRm5zID0gW107DQogIHZhciBwcmV2T25jZUNvdW50ID0gb25jZUNvdW50Ow0KICBvbmNlQ291bnQgPSAwOw0KICBjdXJyZW50T3B0aW9ucyA9IG9wdGlvbnM7DQogIHdhcm4kMiA9IG9wdGlvbnMud2FybiB8fCBiYXNlV2FybjsNCiAgdHJhbnNmb3JtcyQxID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICd0cmFuc2Zvcm1Db2RlJyk7DQogIGRhdGFHZW5GbnMgPSBwbHVja01vZHVsZUZ1bmN0aW9uKG9wdGlvbnMubW9kdWxlcywgJ2dlbkRhdGEnKTsNCiAgcGxhdGZvcm1EaXJlY3RpdmVzJDEgPSBvcHRpb25zLmRpcmVjdGl2ZXMgfHwge307DQogIHZhciBjb2RlID0gYXN0ID8gZ2VuRWxlbWVudChhc3QpIDogJ19oKCJkaXYiKSc7DQogIHN0YXRpY1JlbmRlckZucyA9IHByZXZTdGF0aWNSZW5kZXJGbnM7DQogIG9uY2VDb3VudCA9IHByZXZPbmNlQ291bnQ7DQogIHJldHVybiB7DQogICAgcmVuZGVyOiAoIndpdGgodGhpcyl7cmV0dXJuICIgKyBjb2RlICsgIn0iKSwNCiAgICBzdGF0aWNSZW5kZXJGbnM6IGN1cnJlbnRTdGF0aWNSZW5kZXJGbnMNCiAgfQ0KfQ0KDQpmdW5jdGlvbiBnZW5FbGVtZW50IChlbCkgew0KICBpZiAoZWwuc3RhdGljUm9vdCAmJiAhZWwuc3RhdGljUHJvY2Vzc2VkKSB7DQogICAgcmV0dXJuIGdlblN0YXRpYyhlbCkNCiAgfSBlbHNlIGlmIChlbC5vbmNlICYmICFlbC5vbmNlUHJvY2Vzc2VkKSB7DQogICAgcmV0dXJuIGdlbk9uY2UoZWwpDQogIH0gZWxzZSBpZiAoZWwuZm9yICYmICFlbC5mb3JQcm9jZXNzZWQpIHsNCiAgICByZXR1cm4gZ2VuRm9yKGVsKQ0KICB9IGVsc2UgaWYgKGVsLmlmICYmICFlbC5pZlByb2Nlc3NlZCkgew0KICAgIHJldHVybiBnZW5JZihlbCkNCiAgfSBlbHNlIGlmIChlbC50YWcgPT09ICd0ZW1wbGF0ZScgJiYgIWVsLnNsb3RUYXJnZXQpIHsNCiAgICByZXR1cm4gZ2VuQ2hpbGRyZW4oZWwpIHx8ICd2b2lkIDAnDQogIH0gZWxzZSBpZiAoZWwudGFnID09PSAnc2xvdCcpIHsNCiAgICByZXR1cm4gZ2VuU2xvdChlbCkNCiAgfSBlbHNlIHsNCiAgICAvLyBjb21wb25lbnQgb3IgZWxlbWVudA0KICAgIHZhciBjb2RlOw0KICAgIGlmIChlbC5jb21wb25lbnQpIHsNCiAgICAgIGNvZGUgPSBnZW5Db21wb25lbnQoZWwuY29tcG9uZW50LCBlbCk7DQogICAgfSBlbHNlIHsNCiAgICAgIHZhciBkYXRhID0gZWwucGxhaW4gPyB1bmRlZmluZWQgOiBnZW5EYXRhKGVsKTsNCg0KICAgICAgdmFyIGNoaWxkcmVuID0gZWwuaW5saW5lVGVtcGxhdGUgPyBudWxsIDogZ2VuQ2hpbGRyZW4oZWwpOw0KICAgICAgY29kZSA9ICJfaCgnIiArIChlbC50YWcpICsgIiciICsgKGRhdGEgPyAoIiwiICsgZGF0YSkgOiAnJykgKyAoY2hpbGRyZW4gPyAoIiwiICsgY2hpbGRyZW4pIDogJycpICsgIikiOw0KICAgIH0NCiAgICAvLyBtb2R1bGUgdHJhbnNmb3Jtcw0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhbnNmb3JtcyQxLmxlbmd0aDsgaSsrKSB7DQogICAgICBjb2RlID0gdHJhbnNmb3JtcyQxW2ldKGVsLCBjb2RlKTsNCiAgICB9DQogICAgcmV0dXJuIGNvZGUNCiAgfQ0KfQ0KDQovLyBob2lzdCBzdGF0aWMgc3ViLXRyZWVzIG91dA0KZnVuY3Rpb24gZ2VuU3RhdGljIChlbCkgew0KICBlbC5zdGF0aWNQcm9jZXNzZWQgPSB0cnVlOw0KICBzdGF0aWNSZW5kZXJGbnMucHVzaCgoIndpdGgodGhpcyl7cmV0dXJuICIgKyAoZ2VuRWxlbWVudChlbCkpICsgIn0iKSk7DQogIHJldHVybiAoIl9tKCIgKyAoc3RhdGljUmVuZGVyRm5zLmxlbmd0aCAtIDEpICsgKGVsLnN0YXRpY0luRm9yID8gJyx0cnVlJyA6ICcnKSArICIpIikNCn0NCg0KLy8gdi1vbmNlDQpmdW5jdGlvbiBnZW5PbmNlIChlbCkgew0KICBlbC5vbmNlUHJvY2Vzc2VkID0gdHJ1ZTsNCiAgaWYgKGVsLmlmICYmICFlbC5pZlByb2Nlc3NlZCkgew0KICAgIHJldHVybiBnZW5JZihlbCkNCiAgfSBlbHNlIGlmIChlbC5zdGF0aWNJbkZvcikgew0KICAgIHZhciBrZXkgPSAnJzsNCiAgICB2YXIgcGFyZW50ID0gZWwucGFyZW50Ow0KICAgIHdoaWxlIChwYXJlbnQpIHsNCiAgICAgIGlmIChwYXJlbnQuZm9yKSB7DQogICAgICAgIGtleSA9IHBhcmVudC5rZXk7DQogICAgICAgIGJyZWFrDQogICAgICB9DQogICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50Ow0KICAgIH0NCiAgICBpZiAoIWtleSkgew0KICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4kMigNCiAgICAgICAgInYtb25jZSBjYW4gb25seSBiZSB1c2VkIGluc2lkZSB2LWZvciB0aGF0IGlzIGtleWVkLiAiDQogICAgICApOw0KICAgICAgcmV0dXJuIGdlbkVsZW1lbnQoZWwpDQogICAgfQ0KICAgIHJldHVybiAoIl9vKCIgKyAoZ2VuRWxlbWVudChlbCkpICsgIiwiICsgKG9uY2VDb3VudCsrKSArIChrZXkgPyAoIiwiICsga2V5KSA6ICIiKSArICIpIikNCiAgfSBlbHNlIHsNCiAgICByZXR1cm4gZ2VuU3RhdGljKGVsKQ0KICB9DQp9DQoNCmZ1bmN0aW9uIGdlbklmIChlbCkgew0KICBlbC5pZlByb2Nlc3NlZCA9IHRydWU7IC8vIGF2b2lkIHJlY3Vyc2lvbg0KICByZXR1cm4gZ2VuSWZDb25kaXRpb25zKGVsLmlmQ29uZGl0aW9ucy5zbGljZSgpKQ0KfQ0KDQpmdW5jdGlvbiBnZW5JZkNvbmRpdGlvbnMgKGNvbmRpdGlvbnMpIHsNCiAgaWYgKCFjb25kaXRpb25zLmxlbmd0aCkgew0KICAgIHJldHVybiAnX2UoKScNCiAgfQ0KDQogIHZhciBjb25kaXRpb24gPSBjb25kaXRpb25zLnNoaWZ0KCk7DQogIGlmIChjb25kaXRpb24uZXhwKSB7DQogICAgcmV0dXJuICgiKCIgKyAoY29uZGl0aW9uLmV4cCkgKyAiKT8iICsgKGdlblRlcm5hcnlFeHAoY29uZGl0aW9uLmJsb2NrKSkgKyAiOiIgKyAoZ2VuSWZDb25kaXRpb25zKGNvbmRpdGlvbnMpKSkNCiAgfSBlbHNlIHsNCiAgICByZXR1cm4gKCIiICsgKGdlblRlcm5hcnlFeHAoY29uZGl0aW9uLmJsb2NrKSkpDQogIH0NCg0KICAvLyB2LWlmIHdpdGggdi1vbmNlIHNob3VsZCBnZW5lcmF0ZSBjb2RlIGxpa2UgKGEpP19tKDApOl9tKDEpDQogIGZ1bmN0aW9uIGdlblRlcm5hcnlFeHAgKGVsKSB7DQogICAgcmV0dXJuIGVsLm9uY2UgPyBnZW5PbmNlKGVsKSA6IGdlbkVsZW1lbnQoZWwpDQogIH0NCn0NCg0KZnVuY3Rpb24gZ2VuRm9yIChlbCkgew0KICB2YXIgZXhwID0gZWwuZm9yOw0KICB2YXIgYWxpYXMgPSBlbC5hbGlhczsNCiAgdmFyIGl0ZXJhdG9yMSA9IGVsLml0ZXJhdG9yMSA/ICgiLCIgKyAoZWwuaXRlcmF0b3IxKSkgOiAnJzsNCiAgdmFyIGl0ZXJhdG9yMiA9IGVsLml0ZXJhdG9yMiA/ICgiLCIgKyAoZWwuaXRlcmF0b3IyKSkgOiAnJzsNCiAgZWwuZm9yUHJvY2Vzc2VkID0gdHJ1ZTsgLy8gYXZvaWQgcmVjdXJzaW9uDQogIHJldHVybiAiX2woKCIgKyBleHAgKyAiKSwiICsNCiAgICAiZnVuY3Rpb24oIiArIGFsaWFzICsgaXRlcmF0b3IxICsgaXRlcmF0b3IyICsgIil7IiArDQogICAgICAicmV0dXJuICIgKyAoZ2VuRWxlbWVudChlbCkpICsNCiAgICAnfSknDQp9DQoNCmZ1bmN0aW9uIGdlbkRhdGEgKGVsKSB7DQogIHZhciBkYXRhID0gJ3snOw0KDQogIC8vIGRpcmVjdGl2ZXMgZmlyc3QuDQogIC8vIGRpcmVjdGl2ZXMgbWF5IG11dGF0ZSB0aGUgZWwncyBvdGhlciBwcm9wZXJ0aWVzIGJlZm9yZSB0aGV5IGFyZSBnZW5lcmF0ZWQuDQogIHZhciBkaXJzID0gZ2VuRGlyZWN0aXZlcyhlbCk7DQogIGlmIChkaXJzKSB7IGRhdGEgKz0gZGlycyArICcsJzsgfQ0KDQogIC8vIGtleQ0KICBpZiAoZWwua2V5KSB7DQogICAgZGF0YSArPSAia2V5OiIgKyAoZWwua2V5KSArICIsIjsNCiAgfQ0KICAvLyByZWYNCiAgaWYgKGVsLnJlZikgew0KICAgIGRhdGEgKz0gInJlZjoiICsgKGVsLnJlZikgKyAiLCI7DQogIH0NCiAgaWYgKGVsLnJlZkluRm9yKSB7DQogICAgZGF0YSArPSAicmVmSW5Gb3I6dHJ1ZSwiOw0KICB9DQogIC8vIHByZQ0KICBpZiAoZWwucHJlKSB7DQogICAgZGF0YSArPSAicHJlOnRydWUsIjsNCiAgfQ0KICAvLyByZWNvcmQgb3JpZ2luYWwgdGFnIG5hbWUgZm9yIGNvbXBvbmVudHMgdXNpbmcgImlzIiBhdHRyaWJ1dGUNCiAgaWYgKGVsLmNvbXBvbmVudCkgew0KICAgIGRhdGEgKz0gInRhZzpcIiIgKyAoZWwudGFnKSArICJcIiwiOw0KICB9DQogIC8vIG1vZHVsZSBkYXRhIGdlbmVyYXRpb24gZnVuY3Rpb25zDQogIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YUdlbkZucy5sZW5ndGg7IGkrKykgew0KICAgIGRhdGEgKz0gZGF0YUdlbkZuc1tpXShlbCk7DQogIH0NCiAgLy8gYXR0cmlidXRlcw0KICBpZiAoZWwuYXR0cnMpIHsNCiAgICBkYXRhICs9ICJhdHRyczp7IiArIChnZW5Qcm9wcyhlbC5hdHRycykpICsgIn0sIjsNCiAgfQ0KICAvLyBET00gcHJvcHMNCiAgaWYgKGVsLnByb3BzKSB7DQogICAgZGF0YSArPSAiZG9tUHJvcHM6eyIgKyAoZ2VuUHJvcHMoZWwucHJvcHMpKSArICJ9LCI7DQogIH0NCiAgLy8gZXZlbnQgaGFuZGxlcnMNCiAgaWYgKGVsLmV2ZW50cykgew0KICAgIGRhdGEgKz0gKGdlbkhhbmRsZXJzKGVsLmV2ZW50cykpICsgIiwiOw0KICB9DQogIGlmIChlbC5uYXRpdmVFdmVudHMpIHsNCiAgICBkYXRhICs9IChnZW5IYW5kbGVycyhlbC5uYXRpdmVFdmVudHMsIHRydWUpKSArICIsIjsNCiAgfQ0KICAvLyBzbG90IHRhcmdldA0KICBpZiAoZWwuc2xvdFRhcmdldCkgew0KICAgIGRhdGEgKz0gInNsb3Q6IiArIChlbC5zbG90VGFyZ2V0KSArICIsIjsNCiAgfQ0KICAvLyBzY29wZWQgc2xvdHMNCiAgaWYgKGVsLnNjb3BlZFNsb3RzKSB7DQogICAgZGF0YSArPSAoZ2VuU2NvcGVkU2xvdHMoZWwuc2NvcGVkU2xvdHMpKSArICIsIjsNCiAgfQ0KICAvLyBpbmxpbmUtdGVtcGxhdGUNCiAgaWYgKGVsLmlubGluZVRlbXBsYXRlKSB7DQogICAgdmFyIGlubGluZVRlbXBsYXRlID0gZ2VuSW5saW5lVGVtcGxhdGUoZWwpOw0KICAgIGlmIChpbmxpbmVUZW1wbGF0ZSkgew0KICAgICAgZGF0YSArPSBpbmxpbmVUZW1wbGF0ZSArICIsIjsNCiAgICB9DQogIH0NCiAgZGF0YSA9IGRhdGEucmVwbGFjZSgvLCQvLCAnJykgKyAnfSc7DQogIC8vIHYtYmluZCBkYXRhIHdyYXANCiAgaWYgKGVsLndyYXBEYXRhKSB7DQogICAgZGF0YSA9IGVsLndyYXBEYXRhKGRhdGEpOw0KICB9DQogIHJldHVybiBkYXRhDQp9DQoNCmZ1bmN0aW9uIGdlbkRpcmVjdGl2ZXMgKGVsKSB7DQogIHZhciBkaXJzID0gZWwuZGlyZWN0aXZlczsNCiAgaWYgKCFkaXJzKSB7IHJldHVybiB9DQogIHZhciByZXMgPSAnZGlyZWN0aXZlczpbJzsNCiAgdmFyIGhhc1J1bnRpbWUgPSBmYWxzZTsNCiAgdmFyIGksIGwsIGRpciwgbmVlZFJ1bnRpbWU7DQogIGZvciAoaSA9IDAsIGwgPSBkaXJzLmxlbmd0aDsgaSA8IGw7IGkrKykgew0KICAgIGRpciA9IGRpcnNbaV07DQogICAgbmVlZFJ1bnRpbWUgPSB0cnVlOw0KICAgIHZhciBnZW4gPSBwbGF0Zm9ybURpcmVjdGl2ZXMkMVtkaXIubmFtZV0gfHwgYmFzZURpcmVjdGl2ZXNbZGlyLm5hbWVdOw0KICAgIGlmIChnZW4pIHsNCiAgICAgIC8vIGNvbXBpbGUtdGltZSBkaXJlY3RpdmUgdGhhdCBtYW5pcHVsYXRlcyBBU1QuDQogICAgICAvLyByZXR1cm5zIHRydWUgaWYgaXQgYWxzbyBuZWVkcyBhIHJ1bnRpbWUgY291bnRlcnBhcnQuDQogICAgICBuZWVkUnVudGltZSA9ICEhZ2VuKGVsLCBkaXIsIHdhcm4kMik7DQogICAgfQ0KICAgIGlmIChuZWVkUnVudGltZSkgew0KICAgICAgaGFzUnVudGltZSA9IHRydWU7DQogICAgICByZXMgKz0gIntuYW1lOlwiIiArIChkaXIubmFtZSkgKyAiXCIscmF3TmFtZTpcIiIgKyAoZGlyLnJhd05hbWUpICsgIlwiIiArIChkaXIudmFsdWUgPyAoIix2YWx1ZTooIiArIChkaXIudmFsdWUpICsgIiksZXhwcmVzc2lvbjoiICsgKEpTT04uc3RyaW5naWZ5KGRpci52YWx1ZSkpKSA6ICcnKSArIChkaXIuYXJnID8gKCIsYXJnOlwiIiArIChkaXIuYXJnKSArICJcIiIpIDogJycpICsgKGRpci5tb2RpZmllcnMgPyAoIixtb2RpZmllcnM6IiArIChKU09OLnN0cmluZ2lmeShkaXIubW9kaWZpZXJzKSkpIDogJycpICsgIn0sIjsNCiAgICB9DQogIH0NCiAgaWYgKGhhc1J1bnRpbWUpIHsNCiAgICByZXR1cm4gcmVzLnNsaWNlKDAsIC0xKSArICddJw0KICB9DQp9DQoNCmZ1bmN0aW9uIGdlbklubGluZVRlbXBsYXRlIChlbCkgew0KICB2YXIgYXN0ID0gZWwuY2hpbGRyZW5bMF07DQogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgKA0KICAgIGVsLmNoaWxkcmVuLmxlbmd0aCA+IDEgfHwgYXN0LnR5cGUgIT09IDENCiAgKSkgew0KICAgIHdhcm4kMignSW5saW5lLXRlbXBsYXRlIGNvbXBvbmVudHMgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGNoaWxkIGVsZW1lbnQuJyk7DQogIH0NCiAgaWYgKGFzdC50eXBlID09PSAxKSB7DQogICAgdmFyIGlubGluZVJlbmRlckZucyA9IGdlbmVyYXRlKGFzdCwgY3VycmVudE9wdGlvbnMpOw0KICAgIHJldHVybiAoImlubGluZVRlbXBsYXRlOntyZW5kZXI6ZnVuY3Rpb24oKXsiICsgKGlubGluZVJlbmRlckZucy5yZW5kZXIpICsgIn0sc3RhdGljUmVuZGVyRm5zOlsiICsgKGlubGluZVJlbmRlckZucy5zdGF0aWNSZW5kZXJGbnMubWFwKGZ1bmN0aW9uIChjb2RlKSB7IHJldHVybiAoImZ1bmN0aW9uKCl7IiArIGNvZGUgKyAifSIpOyB9KS5qb2luKCcsJykpICsgIl19IikNCiAgfQ0KfQ0KDQpmdW5jdGlvbiBnZW5TY29wZWRTbG90cyAoc2xvdHMpIHsNCiAgcmV0dXJuICgic2NvcGVkU2xvdHM6eyIgKyAoT2JqZWN0LmtleXMoc2xvdHMpLm1hcChmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBnZW5TY29wZWRTbG90KGtleSwgc2xvdHNba2V5XSk7IH0pLmpvaW4oJywnKSkgKyAifSIpDQp9DQoNCmZ1bmN0aW9uIGdlblNjb3BlZFNsb3QgKGtleSwgZWwpIHsNCiAgcmV0dXJuIGtleSArICI6ZnVuY3Rpb24oIiArIChTdHJpbmcoZWwuYXR0cnNNYXAuc2NvcGUpKSArICIpeyIgKw0KICAgICJyZXR1cm4gIiArIChlbC50YWcgPT09ICd0ZW1wbGF0ZScNCiAgICAgID8gZ2VuQ2hpbGRyZW4oZWwpIHx8ICd2b2lkIDAnDQogICAgICA6IGdlbkVsZW1lbnQoZWwpKSArICJ9Ig0KfQ0KDQpmdW5jdGlvbiBnZW5DaGlsZHJlbiAoZWwpIHsNCiAgaWYgKGVsLmNoaWxkcmVuLmxlbmd0aCkgew0KICAgIHJldHVybiAnWycgKyBlbC5jaGlsZHJlbi5tYXAoZ2VuTm9kZSkuam9pbignLCcpICsgJ10nDQogIH0NCn0NCg0KZnVuY3Rpb24gZ2VuTm9kZSAobm9kZSkgew0KICBpZiAobm9kZS50eXBlID09PSAxKSB7DQogICAgcmV0dXJuIGdlbkVsZW1lbnQobm9kZSkNCiAgfSBlbHNlIHsNCiAgICByZXR1cm4gZ2VuVGV4dChub2RlKQ0KICB9DQp9DQoNCmZ1bmN0aW9uIGdlblRleHQgKHRleHQpIHsNCiAgcmV0dXJuIHRleHQudHlwZSA9PT0gMg0KICAgID8gdGV4dC5leHByZXNzaW9uIC8vIG5vIG5lZWQgZm9yICgpIGJlY2F1c2UgYWxyZWFkeSB3cmFwcGVkIGluIF9zKCkNCiAgICA6IHRyYW5zZm9ybVNwZWNpYWxOZXdsaW5lcyhKU09OLnN0cmluZ2lmeSh0ZXh0LnRleHQpKQ0KfQ0KDQpmdW5jdGlvbiBnZW5TbG90IChlbCkgew0KICB2YXIgc2xvdE5hbWUgPSBlbC5zbG90TmFtZSB8fCAnImRlZmF1bHQiJzsNCiAgdmFyIGNoaWxkcmVuID0gZ2VuQ2hpbGRyZW4oZWwpOw0KICByZXR1cm4gKCJfdCgiICsgc2xvdE5hbWUgKyAoY2hpbGRyZW4gPyAoIiwiICsgY2hpbGRyZW4pIDogJycpICsgKGVsLmF0dHJzID8gKChjaGlsZHJlbiA/ICcnIDogJyxudWxsJykgKyAiLHsiICsgKGVsLmF0dHJzLm1hcChmdW5jdGlvbiAoYSkgeyByZXR1cm4gKChjYW1lbGl6ZShhLm5hbWUpKSArICI6IiArIChhLnZhbHVlKSk7IH0pLmpvaW4oJywnKSkgKyAifSIpIDogJycpICsgIikiKQ0KfQ0KDQovLyBjb21wb25lbnROYW1lIGlzIGVsLmNvbXBvbmVudCwgdGFrZSBpdCBhcyBhcmd1bWVudCB0byBzaHVuIGZsb3cncyBwZXNzaW1pc3RpYyByZWZpbmVtZW50DQpmdW5jdGlvbiBnZW5Db21wb25lbnQgKGNvbXBvbmVudE5hbWUsIGVsKSB7DQogIHZhciBjaGlsZHJlbiA9IGVsLmlubGluZVRlbXBsYXRlID8gbnVsbCA6IGdlbkNoaWxkcmVuKGVsKTsNCiAgcmV0dXJuICgiX2goIiArIGNvbXBvbmVudE5hbWUgKyAiLCIgKyAoZ2VuRGF0YShlbCkpICsgKGNoaWxkcmVuID8gKCIsIiArIGNoaWxkcmVuKSA6ICcnKSArICIpIikNCn0NCg0KZnVuY3Rpb24gZ2VuUHJvcHMgKHByb3BzKSB7DQogIHZhciByZXMgPSAnJzsNCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgew0KICAgIHZhciBwcm9wID0gcHJvcHNbaV07DQogICAgcmVzICs9ICJcIiIgKyAocHJvcC5uYW1lKSArICJcIjoiICsgKHRyYW5zZm9ybVNwZWNpYWxOZXdsaW5lcyhwcm9wLnZhbHVlKSkgKyAiLCI7DQogIH0NCiAgcmV0dXJuIHJlcy5zbGljZSgwLCAtMSkNCn0NCg0KLy8gIzM4OTUsICM0MjY4DQpmdW5jdGlvbiB0cmFuc2Zvcm1TcGVjaWFsTmV3bGluZXMgKHRleHQpIHsNCiAgcmV0dXJuIHRleHQNCiAgICAucmVwbGFjZSgvXHUyMDI4L2csICdcXHUyMDI4JykNCiAgICAucmVwbGFjZSgvXHUyMDI5L2csICdcXHUyMDI5JykNCn0NCg0KLyogICovDQoNCi8qKg0KICogQ29tcGlsZSBhIHRlbXBsYXRlLg0KICovDQpmdW5jdGlvbiBjb21waWxlJDEgKA0KICB0ZW1wbGF0ZSwNCiAgb3B0aW9ucw0KKSB7DQogIHZhciBhc3QgPSBwYXJzZSh0ZW1wbGF0ZS50cmltKCksIG9wdGlvbnMpOw0KICBvcHRpbWl6ZShhc3QsIG9wdGlvbnMpOw0KICB2YXIgY29kZSA9IGdlbmVyYXRlKGFzdCwgb3B0aW9ucyk7DQogIHJldHVybiB7DQogICAgYXN0OiBhc3QsDQogICAgcmVuZGVyOiBjb2RlLnJlbmRlciwNCiAgICBzdGF0aWNSZW5kZXJGbnM6IGNvZGUuc3RhdGljUmVuZGVyRm5zDQogIH0NCn0NCg0KLyogICovDQoNCi8vIG9wZXJhdG9ycyBsaWtlIHR5cGVvZiwgaW5zdGFuY2VvZiBhbmQgaW4gYXJlIGFsbG93ZWQNCnZhciBwcm9oaWJpdGVkS2V5d29yZFJFID0gbmV3IFJlZ0V4cCgnXFxiJyArICgNCiAgJ2RvLGlmLGZvcixsZXQsbmV3LHRyeSx2YXIsY2FzZSxlbHNlLHdpdGgsYXdhaXQsYnJlYWssY2F0Y2gsY2xhc3MsY29uc3QsJyArDQogICdzdXBlcix0aHJvdyx3aGlsZSx5aWVsZCxkZWxldGUsZXhwb3J0LGltcG9ydCxyZXR1cm4sc3dpdGNoLGRlZmF1bHQsJyArDQogICdleHRlbmRzLGZpbmFsbHksY29udGludWUsZGVidWdnZXIsZnVuY3Rpb24sYXJndW1lbnRzJw0KKS5zcGxpdCgnLCcpLmpvaW4oJ1xcYnxcXGInKSArICdcXGInKTsNCi8vIGNoZWNrIHZhbGlkIGlkZW50aWZpZXIgZm9yIHYtZm9yDQp2YXIgaWRlbnRSRSA9IC9bQS1aYS16XyRdW1x3JF0qLzsNCi8vIHN0cmlwIHN0cmluZ3MgaW4gZXhwcmVzc2lvbnMNCnZhciBzdHJpcFN0cmluZ1JFID0gLycoPzpbXidcXF18XFwuKSonfCIoPzpbXiJcXF18XFwuKSoifGAoPzpbXmBcXF18XFwuKSpcJFx7fFx9KD86W15gXFxdfFxcLikqYHxgKD86W15gXFxdfFxcLikqYC9nOw0KDQovLyBkZXRlY3QgcHJvYmxlbWF0aWMgZXhwcmVzc2lvbnMgaW4gYSB0ZW1wbGF0ZQ0KZnVuY3Rpb24gZGV0ZWN0RXJyb3JzIChhc3QpIHsNCiAgdmFyIGVycm9ycyA9IFtdOw0KICBpZiAoYXN0KSB7DQogICAgY2hlY2tOb2RlKGFzdCwgZXJyb3JzKTsNCiAgfQ0KICByZXR1cm4gZXJyb3JzDQp9DQoNCmZ1bmN0aW9uIGNoZWNrTm9kZSAobm9kZSwgZXJyb3JzKSB7DQogIGlmIChub2RlLnR5cGUgPT09IDEpIHsNCiAgICBmb3IgKHZhciBuYW1lIGluIG5vZGUuYXR0cnNNYXApIHsNCiAgICAgIGlmIChkaXJSRS50ZXN0KG5hbWUpKSB7DQogICAgICAgIHZhciB2YWx1ZSA9IG5vZGUuYXR0cnNNYXBbbmFtZV07DQogICAgICAgIGlmICh2YWx1ZSkgew0KICAgICAgICAgIGlmIChuYW1lID09PSAndi1mb3InKSB7DQogICAgICAgICAgICBjaGVja0Zvcihub2RlLCAoInYtZm9yPVwiIiArIHZhbHVlICsgIlwiIiksIGVycm9ycyk7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGNoZWNrRXhwcmVzc2lvbih2YWx1ZSwgKG5hbWUgKyAiPVwiIiArIHZhbHVlICsgIlwiIiksIGVycm9ycyk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICAgIGlmIChub2RlLmNoaWxkcmVuKSB7DQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgY2hlY2tOb2RlKG5vZGUuY2hpbGRyZW5baV0sIGVycm9ycyk7DQogICAgICB9DQogICAgfQ0KICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gMikgew0KICAgIGNoZWNrRXhwcmVzc2lvbihub2RlLmV4cHJlc3Npb24sIG5vZGUudGV4dCwgZXJyb3JzKTsNCiAgfQ0KfQ0KDQpmdW5jdGlvbiBjaGVja0ZvciAobm9kZSwgdGV4dCwgZXJyb3JzKSB7DQogIGNoZWNrRXhwcmVzc2lvbihub2RlLmZvciB8fCAnJywgdGV4dCwgZXJyb3JzKTsNCiAgY2hlY2tJZGVudGlmaWVyKG5vZGUuYWxpYXMsICd2LWZvciBhbGlhcycsIHRleHQsIGVycm9ycyk7DQogIGNoZWNrSWRlbnRpZmllcihub2RlLml0ZXJhdG9yMSwgJ3YtZm9yIGl0ZXJhdG9yJywgdGV4dCwgZXJyb3JzKTsNCiAgY2hlY2tJZGVudGlmaWVyKG5vZGUuaXRlcmF0b3IyLCAndi1mb3IgaXRlcmF0b3InLCB0ZXh0LCBlcnJvcnMpOw0KfQ0KDQpmdW5jdGlvbiBjaGVja0lkZW50aWZpZXIgKGlkZW50LCB0eXBlLCB0ZXh0LCBlcnJvcnMpIHsNCiAgaWYgKHR5cGVvZiBpZGVudCA9PT0gJ3N0cmluZycgJiYgIWlkZW50UkUudGVzdChpZGVudCkpIHsNCiAgICBlcnJvcnMucHVzaCgoIi0gaW52YWxpZCAiICsgdHlwZSArICIgXCIiICsgaWRlbnQgKyAiXCIgaW4gZXhwcmVzc2lvbjogIiArIHRleHQpKTsNCiAgfQ0KfQ0KDQpmdW5jdGlvbiBjaGVja0V4cHJlc3Npb24gKGV4cCwgdGV4dCwgZXJyb3JzKSB7DQogIHRyeSB7DQogICAgbmV3IEZ1bmN0aW9uKCgicmV0dXJuICIgKyBleHApKTsNCiAgfSBjYXRjaCAoZSkgew0KICAgIHZhciBrZXl3b3JkTWF0Y2ggPSBleHAucmVwbGFjZShzdHJpcFN0cmluZ1JFLCAnJykubWF0Y2gocHJvaGliaXRlZEtleXdvcmRSRSk7DQogICAgaWYgKGtleXdvcmRNYXRjaCkgew0KICAgICAgZXJyb3JzLnB1c2goDQogICAgICAgICItIGF2b2lkIHVzaW5nIEphdmFTY3JpcHQga2V5d29yZCBhcyBwcm9wZXJ0eSBuYW1lOiAiICsNCiAgICAgICAgIlwiIiArIChrZXl3b3JkTWF0Y2hbMF0pICsgIlwiIGluIGV4cHJlc3Npb24gIiArIHRleHQNCiAgICAgICk7DQogICAgfSBlbHNlIHsNCiAgICAgIGVycm9ycy5wdXNoKCgiLSBpbnZhbGlkIGV4cHJlc3Npb246ICIgKyB0ZXh0KSk7DQogICAgfQ0KICB9DQp9DQoNCi8qICAqLw0KDQpmdW5jdGlvbiB0cmFuc2Zvcm1Ob2RlIChlbCwgb3B0aW9ucykgew0KICB2YXIgd2FybiA9IG9wdGlvbnMud2FybiB8fCBiYXNlV2FybjsNCiAgdmFyIHN0YXRpY0NsYXNzID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ2NsYXNzJyk7DQogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgc3RhdGljQ2xhc3MpIHsNCiAgICB2YXIgZXhwcmVzc2lvbiA9IHBhcnNlVGV4dChzdGF0aWNDbGFzcywgb3B0aW9ucy5kZWxpbWl0ZXJzKTsNCiAgICBpZiAoZXhwcmVzc2lvbikgew0KICAgICAgd2FybigNCiAgICAgICAgImNsYXNzPVwiIiArIHN0YXRpY0NsYXNzICsgIlwiOiAiICsNCiAgICAgICAgJ0ludGVycG9sYXRpb24gaW5zaWRlIGF0dHJpYnV0ZXMgaGFzIGJlZW4gcmVtb3ZlZC4gJyArDQogICAgICAgICdVc2Ugdi1iaW5kIG9yIHRoZSBjb2xvbiBzaG9ydGhhbmQgaW5zdGVhZC4gRm9yIGV4YW1wbGUsICcgKw0KICAgICAgICAnaW5zdGVhZCBvZiA8ZGl2IGNsYXNzPSJ7eyB2YWwgfX0iPiwgdXNlIDxkaXYgOmNsYXNzPSJ2YWwiPi4nDQogICAgICApOw0KICAgIH0NCiAgfQ0KICBpZiAoc3RhdGljQ2xhc3MpIHsNCiAgICBlbC5zdGF0aWNDbGFzcyA9IEpTT04uc3RyaW5naWZ5KHN0YXRpY0NsYXNzKTsNCiAgfQ0KICB2YXIgY2xhc3NCaW5kaW5nID0gZ2V0QmluZGluZ0F0dHIoZWwsICdjbGFzcycsIGZhbHNlIC8qIGdldFN0YXRpYyAqLyk7DQogIGlmIChjbGFzc0JpbmRpbmcpIHsNCiAgICBlbC5jbGFzc0JpbmRpbmcgPSBjbGFzc0JpbmRpbmc7DQogIH0NCn0NCg0KZnVuY3Rpb24gZ2VuRGF0YSQxIChlbCkgew0KICB2YXIgZGF0YSA9ICcnOw0KICBpZiAoZWwuc3RhdGljQ2xhc3MpIHsNCiAgICBkYXRhICs9ICJzdGF0aWNDbGFzczoiICsgKGVsLnN0YXRpY0NsYXNzKSArICIsIjsNCiAgfQ0KICBpZiAoZWwuY2xhc3NCaW5kaW5nKSB7DQogICAgZGF0YSArPSAiY2xhc3M6IiArIChlbC5jbGFzc0JpbmRpbmcpICsgIiwiOw0KICB9DQogIHJldHVybiBkYXRhDQp9DQoNCnZhciBrbGFzcyQxID0gew0KICBzdGF0aWNLZXlzOiBbJ3N0YXRpY0NsYXNzJ10sDQogIHRyYW5zZm9ybU5vZGU6IHRyYW5zZm9ybU5vZGUsDQogIGdlbkRhdGE6IGdlbkRhdGEkMQ0KfTsNCg0KLyogICovDQoNCmZ1bmN0aW9uIHRyYW5zZm9ybU5vZGUkMSAoZWwsIG9wdGlvbnMpIHsNCiAgdmFyIHdhcm4gPSBvcHRpb25zLndhcm4gfHwgYmFzZVdhcm47DQogIHZhciBzdGF0aWNTdHlsZSA9IGdldEFuZFJlbW92ZUF0dHIoZWwsICdzdHlsZScpOw0KICBpZiAoc3RhdGljU3R5bGUpIHsNCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8NCiAgICB7DQogICAgICB2YXIgZXhwcmVzc2lvbiA9IHBhcnNlVGV4dChzdGF0aWNTdHlsZSwgb3B0aW9ucy5kZWxpbWl0ZXJzKTsNCiAgICAgIGlmIChleHByZXNzaW9uKSB7DQogICAgICAgIHdhcm4oDQogICAgICAgICAgInN0eWxlPVwiIiArIHN0YXRpY1N0eWxlICsgIlwiOiAiICsNCiAgICAgICAgICAnSW50ZXJwb2xhdGlvbiBpbnNpZGUgYXR0cmlidXRlcyBoYXMgYmVlbiByZW1vdmVkLiAnICsNCiAgICAgICAgICAnVXNlIHYtYmluZCBvciB0aGUgY29sb24gc2hvcnRoYW5kIGluc3RlYWQuIEZvciBleGFtcGxlLCAnICsNCiAgICAgICAgICAnaW5zdGVhZCBvZiA8ZGl2IHN0eWxlPSJ7eyB2YWwgfX0iPiwgdXNlIDxkaXYgOnN0eWxlPSJ2YWwiPi4nDQogICAgICAgICk7DQogICAgICB9DQogICAgfQ0KICAgIGVsLnN0YXRpY1N0eWxlID0gSlNPTi5zdHJpbmdpZnkocGFyc2VTdHlsZVRleHQoc3RhdGljU3R5bGUpKTsNCiAgfQ0KDQogIHZhciBzdHlsZUJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ3N0eWxlJywgZmFsc2UgLyogZ2V0U3RhdGljICovKTsNCiAgaWYgKHN0eWxlQmluZGluZykgew0KICAgIGVsLnN0eWxlQmluZGluZyA9IHN0eWxlQmluZGluZzsNCiAgfQ0KfQ0KDQpmdW5jdGlvbiBnZW5EYXRhJDIgKGVsKSB7DQogIHZhciBkYXRhID0gJyc7DQogIGlmIChlbC5zdGF0aWNTdHlsZSkgew0KICAgIGRhdGEgKz0gInN0YXRpY1N0eWxlOiIgKyAoZWwuc3RhdGljU3R5bGUpICsgIiwiOw0KICB9DQogIGlmIChlbC5zdHlsZUJpbmRpbmcpIHsNCiAgICBkYXRhICs9ICJzdHlsZTooIiArIChlbC5zdHlsZUJpbmRpbmcpICsgIiksIjsNCiAgfQ0KICByZXR1cm4gZGF0YQ0KfQ0KDQp2YXIgc3R5bGUkMSA9IHsNCiAgc3RhdGljS2V5czogWydzdGF0aWNTdHlsZSddLA0KICB0cmFuc2Zvcm1Ob2RlOiB0cmFuc2Zvcm1Ob2RlJDEsDQogIGdlbkRhdGE6IGdlbkRhdGEkMg0KfTsNCg0KdmFyIG1vZHVsZXMkMSA9IFsNCiAga2xhc3MkMSwNCiAgc3R5bGUkMQ0KXTsNCg0KLyogICovDQoNCnZhciB3YXJuJDM7DQoNCmZ1bmN0aW9uIG1vZGVsJDEgKA0KICBlbCwNCiAgZGlyLA0KICBfd2Fybg0KKSB7DQogIHdhcm4kMyA9IF93YXJuOw0KICB2YXIgdmFsdWUgPSBkaXIudmFsdWU7DQogIHZhciBtb2RpZmllcnMgPSBkaXIubW9kaWZpZXJzOw0KICB2YXIgdGFnID0gZWwudGFnOw0KICB2YXIgdHlwZSA9IGVsLmF0dHJzTWFwLnR5cGU7DQogIHsNCiAgICB2YXIgZHluYW1pY1R5cGUgPSBlbC5hdHRyc01hcFsndi1iaW5kOnR5cGUnXSB8fCBlbC5hdHRyc01hcFsnOnR5cGUnXTsNCiAgICBpZiAodGFnID09PSAnaW5wdXQnICYmIGR5bmFtaWNUeXBlKSB7DQogICAgICB3YXJuJDMoDQogICAgICAgICI8aW5wdXQgOnR5cGU9XCIiICsgZHluYW1pY1R5cGUgKyAiXCIgdi1tb2RlbD1cIiIgKyB2YWx1ZSArICJcIj46XG4iICsNCiAgICAgICAgInYtbW9kZWwgZG9lcyBub3Qgc3VwcG9ydCBkeW5hbWljIGlucHV0IHR5cGVzLiBVc2Ugdi1pZiBicmFuY2hlcyBpbnN0ZWFkLiINCiAgICAgICk7DQogICAgfQ0KICB9DQogIGlmICh0YWcgPT09ICdzZWxlY3QnKSB7DQogICAgZ2VuU2VsZWN0KGVsLCB2YWx1ZSwgbW9kaWZpZXJzKTsNCiAgfSBlbHNlIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgdHlwZSA9PT0gJ2NoZWNrYm94Jykgew0KICAgIGdlbkNoZWNrYm94TW9kZWwoZWwsIHZhbHVlLCBtb2RpZmllcnMpOw0KICB9IGVsc2UgaWYgKHRhZyA9PT0gJ2lucHV0JyAmJiB0eXBlID09PSAncmFkaW8nKSB7DQogICAgZ2VuUmFkaW9Nb2RlbChlbCwgdmFsdWUsIG1vZGlmaWVycyk7DQogIH0gZWxzZSB7DQogICAgZ2VuRGVmYXVsdE1vZGVsKGVsLCB2YWx1ZSwgbW9kaWZpZXJzKTsNCiAgfQ0KICAvLyBlbnN1cmUgcnVudGltZSBkaXJlY3RpdmUgbWV0YWRhdGENCiAgcmV0dXJuIHRydWUNCn0NCg0KZnVuY3Rpb24gZ2VuQ2hlY2tib3hNb2RlbCAoDQogIGVsLA0KICB2YWx1ZSwNCiAgbW9kaWZpZXJzDQopIHsNCiAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJg0KICAgIGVsLmF0dHJzTWFwLmNoZWNrZWQgIT0gbnVsbCkgew0KICAgIHdhcm4kMygNCiAgICAgICI8IiArIChlbC50YWcpICsgIiB2LW1vZGVsPVwiIiArIHZhbHVlICsgIlwiIGNoZWNrZWQ+OlxuIiArDQogICAgICAiaW5saW5lIGNoZWNrZWQgYXR0cmlidXRlcyB3aWxsIGJlIGlnbm9yZWQgd2hlbiB1c2luZyB2LW1vZGVsLiAiICsNCiAgICAgICdEZWNsYXJlIGluaXRpYWwgdmFsdWVzIGluIHRoZSBjb21wb25lbnRcJ3MgZGF0YSBvcHRpb24gaW5zdGVhZC4nDQogICAgKTsNCiAgfQ0KICB2YXIgbnVtYmVyID0gbW9kaWZpZXJzICYmIG1vZGlmaWVycy5udW1iZXI7DQogIHZhciB2YWx1ZUJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ3ZhbHVlJykgfHwgJ251bGwnOw0KICB2YXIgdHJ1ZVZhbHVlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAndHJ1ZS12YWx1ZScpIHx8ICd0cnVlJzsNCiAgdmFyIGZhbHNlVmFsdWVCaW5kaW5nID0gZ2V0QmluZGluZ0F0dHIoZWwsICdmYWxzZS12YWx1ZScpIHx8ICdmYWxzZSc7DQogIGFkZFByb3AoZWwsICdjaGVja2VkJywNCiAgICAiQXJyYXkuaXNBcnJheSgiICsgdmFsdWUgKyAiKSIgKw0KICAgICAgIj9faSgiICsgdmFsdWUgKyAiLCIgKyB2YWx1ZUJpbmRpbmcgKyAiKT4tMSIgKw0KICAgICAgIjpfcSgiICsgdmFsdWUgKyAiLCIgKyB0cnVlVmFsdWVCaW5kaW5nICsgIikiDQogICk7DQogIGFkZEhhbmRsZXIoZWwsICdjaGFuZ2UnLA0KICAgICJ2YXIgJCRhPSIgKyB2YWx1ZSArICIsIiArDQogICAgICAgICckJGVsPSRldmVudC50YXJnZXQsJyArDQogICAgICAgICIkJGM9JCRlbC5jaGVja2VkPygiICsgdHJ1ZVZhbHVlQmluZGluZyArICIpOigiICsgZmFsc2VWYWx1ZUJpbmRpbmcgKyAiKTsiICsNCiAgICAnaWYoQXJyYXkuaXNBcnJheSgkJGEpKXsnICsNCiAgICAgICJ2YXIgJCR2PSIgKyAobnVtYmVyID8gJ19uKCcgKyB2YWx1ZUJpbmRpbmcgKyAnKScgOiB2YWx1ZUJpbmRpbmcpICsgIiwiICsNCiAgICAgICAgICAnJCRpPV9pKCQkYSwkJHYpOycgKw0KICAgICAgImlmKCQkYyl7JCRpPDAmJigiICsgdmFsdWUgKyAiPSQkYS5jb25jYXQoJCR2KSl9IiArDQogICAgICAiZWxzZXskJGk+LTEmJigiICsgdmFsdWUgKyAiPSQkYS5zbGljZSgwLCQkaSkuY29uY2F0KCQkYS5zbGljZSgkJGkrMSkpKX0iICsNCiAgICAifWVsc2V7IiArIHZhbHVlICsgIj0kJGN9IiwNCiAgICBudWxsLCB0cnVlDQogICk7DQp9DQoNCmZ1bmN0aW9uIGdlblJhZGlvTW9kZWwgKA0KICAgIGVsLA0KICAgIHZhbHVlLA0KICAgIG1vZGlmaWVycw0KKSB7DQogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYNCiAgICBlbC5hdHRyc01hcC5jaGVja2VkICE9IG51bGwpIHsNCiAgICB3YXJuJDMoDQogICAgICAiPCIgKyAoZWwudGFnKSArICIgdi1tb2RlbD1cIiIgKyB2YWx1ZSArICJcIiBjaGVja2VkPjpcbiIgKw0KICAgICAgImlubGluZSBjaGVja2VkIGF0dHJpYnV0ZXMgd2lsbCBiZSBpZ25vcmVkIHdoZW4gdXNpbmcgdi1tb2RlbC4gIiArDQogICAgICAnRGVjbGFyZSBpbml0aWFsIHZhbHVlcyBpbiB0aGUgY29tcG9uZW50XCdzIGRhdGEgb3B0aW9uIGluc3RlYWQuJw0KICAgICk7DQogIH0NCiAgdmFyIG51bWJlciA9IG1vZGlmaWVycyAmJiBtb2RpZmllcnMubnVtYmVyOw0KICB2YXIgdmFsdWVCaW5kaW5nID0gZ2V0QmluZGluZ0F0dHIoZWwsICd2YWx1ZScpIHx8ICdudWxsJzsNCiAgdmFsdWVCaW5kaW5nID0gbnVtYmVyID8gKCJfbigiICsgdmFsdWVCaW5kaW5nICsgIikiKSA6IHZhbHVlQmluZGluZzsNCiAgYWRkUHJvcChlbCwgJ2NoZWNrZWQnLCAoIl9xKCIgKyB2YWx1ZSArICIsIiArIHZhbHVlQmluZGluZyArICIpIikpOw0KICBhZGRIYW5kbGVyKGVsLCAnY2hhbmdlJywgZ2VuQXNzaWdubWVudENvZGUodmFsdWUsIHZhbHVlQmluZGluZyksIG51bGwsIHRydWUpOw0KfQ0KDQpmdW5jdGlvbiBnZW5EZWZhdWx0TW9kZWwgKA0KICBlbCwNCiAgdmFsdWUsDQogIG1vZGlmaWVycw0KKSB7DQogIHsNCiAgICBpZiAoZWwudGFnID09PSAnaW5wdXQnICYmIGVsLmF0dHJzTWFwLnZhbHVlKSB7DQogICAgICB3YXJuJDMoDQogICAgICAgICI8IiArIChlbC50YWcpICsgIiB2LW1vZGVsPVwiIiArIHZhbHVlICsgIlwiIHZhbHVlPVwiIiArIChlbC5hdHRyc01hcC52YWx1ZSkgKyAiXCI+OlxuIiArDQogICAgICAgICdpbmxpbmUgdmFsdWUgYXR0cmlidXRlcyB3aWxsIGJlIGlnbm9yZWQgd2hlbiB1c2luZyB2LW1vZGVsLiAnICsNCiAgICAgICAgJ0RlY2xhcmUgaW5pdGlhbCB2YWx1ZXMgaW4gdGhlIGNvbXBvbmVudFwncyBkYXRhIG9wdGlvbiBpbnN0ZWFkLicNCiAgICAgICk7DQogICAgfQ0KICAgIGlmIChlbC50YWcgPT09ICd0ZXh0YXJlYScgJiYgZWwuY2hpbGRyZW4ubGVuZ3RoKSB7DQogICAgICB3YXJuJDMoDQogICAgICAgICI8dGV4dGFyZWEgdi1tb2RlbD1cIiIgKyB2YWx1ZSArICJcIj46XG4iICsNCiAgICAgICAgJ2lubGluZSBjb250ZW50IGluc2lkZSA8dGV4dGFyZWE+IHdpbGwgYmUgaWdub3JlZCB3aGVuIHVzaW5nIHYtbW9kZWwuICcgKw0KICAgICAgICAnRGVjbGFyZSBpbml0aWFsIHZhbHVlcyBpbiB0aGUgY29tcG9uZW50XCdzIGRhdGEgb3B0aW9uIGluc3RlYWQuJw0KICAgICAgKTsNCiAgICB9DQogIH0NCg0KICB2YXIgdHlwZSA9IGVsLmF0dHJzTWFwLnR5cGU7DQogIHZhciByZWYgPSBtb2RpZmllcnMgfHwge307DQogIHZhciBsYXp5ID0gcmVmLmxhenk7DQogIHZhciBudW1iZXIgPSByZWYubnVtYmVyOw0KICB2YXIgdHJpbSA9IHJlZi50cmltOw0KICB2YXIgZXZlbnQgPSBsYXp5IHx8IChpc0lFICYmIHR5cGUgPT09ICdyYW5nZScpID8gJ2NoYW5nZScgOiAnaW5wdXQnOw0KICB2YXIgbmVlZENvbXBvc2l0aW9uR3VhcmQgPSAhbGF6eSAmJiB0eXBlICE9PSAncmFuZ2UnOw0KICB2YXIgaXNOYXRpdmUgPSBlbC50YWcgPT09ICdpbnB1dCcgfHwgZWwudGFnID09PSAndGV4dGFyZWEnOw0KDQogIHZhciB2YWx1ZUV4cHJlc3Npb24gPSBpc05hdGl2ZQ0KICAgID8gKCIkZXZlbnQudGFyZ2V0LnZhbHVlIiArICh0cmltID8gJy50cmltKCknIDogJycpKQ0KICAgIDogdHJpbSA/ICIodHlwZW9mICRldmVudCA9PT0gJ3N0cmluZycgPyAkZXZlbnQudHJpbSgpIDogJGV2ZW50KSIgOiAiJGV2ZW50IjsNCiAgdmFsdWVFeHByZXNzaW9uID0gbnVtYmVyIHx8IHR5cGUgPT09ICdudW1iZXInDQogICAgPyAoIl9uKCIgKyB2YWx1ZUV4cHJlc3Npb24gKyAiKSIpDQogICAgOiB2YWx1ZUV4cHJlc3Npb247DQogIHZhciBjb2RlID0gZ2VuQXNzaWdubWVudENvZGUodmFsdWUsIHZhbHVlRXhwcmVzc2lvbik7DQogIGlmIChpc05hdGl2ZSAmJiBuZWVkQ29tcG9zaXRpb25HdWFyZCkgew0KICAgIGNvZGUgPSAiaWYoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpcmV0dXJuOyIgKyBjb2RlOw0KICB9DQogIC8vIGlucHV0cyB3aXRoIHR5cGU9ImZpbGUiIGFyZSByZWFkIG9ubHkgYW5kIHNldHRpbmcgdGhlIGlucHV0J3MNCiAgLy8gdmFsdWUgd2lsbCB0aHJvdyBhbiBlcnJvci4NCiAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJg0KICAgICAgdHlwZSA9PT0gJ2ZpbGUnKSB7DQogICAgd2FybiQzKA0KICAgICAgIjwiICsgKGVsLnRhZykgKyAiIHYtbW9kZWw9XCIiICsgdmFsdWUgKyAiXCIgdHlwZT1cImZpbGVcIj46XG4iICsNCiAgICAgICJGaWxlIGlucHV0cyBhcmUgcmVhZCBvbmx5LiBVc2UgYSB2LW9uOmNoYW5nZSBsaXN0ZW5lciBpbnN0ZWFkLiINCiAgICApOw0KICB9DQogIGFkZFByb3AoZWwsICd2YWx1ZScsIGlzTmF0aXZlID8gKCJfcygiICsgdmFsdWUgKyAiKSIpIDogKCIoIiArIHZhbHVlICsgIikiKSk7DQogIGFkZEhhbmRsZXIoZWwsIGV2ZW50LCBjb2RlLCBudWxsLCB0cnVlKTsNCn0NCg0KZnVuY3Rpb24gZ2VuU2VsZWN0ICgNCiAgICBlbCwNCiAgICB2YWx1ZSwNCiAgICBtb2RpZmllcnMNCikgew0KICB7DQogICAgZWwuY2hpbGRyZW4uc29tZShjaGVja09wdGlvbldhcm5pbmcpOw0KICB9DQoNCiAgdmFyIG51bWJlciA9IG1vZGlmaWVycyAmJiBtb2RpZmllcnMubnVtYmVyOw0KICB2YXIgYXNzaWdubWVudCA9ICJBcnJheS5wcm90b3R5cGUuZmlsdGVyIiArDQogICAgIi5jYWxsKCRldmVudC50YXJnZXQub3B0aW9ucyxmdW5jdGlvbihvKXtyZXR1cm4gby5zZWxlY3RlZH0pIiArDQogICAgIi5tYXAoZnVuY3Rpb24obyl7dmFyIHZhbCA9IFwiX3ZhbHVlXCIgaW4gbyA/IG8uX3ZhbHVlIDogby52YWx1ZTsiICsNCiAgICAicmV0dXJuICIgKyAobnVtYmVyID8gJ19uKHZhbCknIDogJ3ZhbCcpICsgIn0pIiArDQogICAgKGVsLmF0dHJzTWFwLm11bHRpcGxlID09IG51bGwgPyAnWzBdJyA6ICcnKTsNCg0KICB2YXIgY29kZSA9IGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCBhc3NpZ25tZW50KTsNCiAgYWRkSGFuZGxlcihlbCwgJ2NoYW5nZScsIGNvZGUsIG51bGwsIHRydWUpOw0KfQ0KDQpmdW5jdGlvbiBjaGVja09wdGlvbldhcm5pbmcgKG9wdGlvbikgew0KICBpZiAob3B0aW9uLnR5cGUgPT09IDEgJiYNCiAgICBvcHRpb24udGFnID09PSAnb3B0aW9uJyAmJg0KICAgIG9wdGlvbi5hdHRyc01hcC5zZWxlY3RlZCAhPSBudWxsKSB7DQogICAgd2FybiQzKA0KICAgICAgIjxzZWxlY3Qgdi1tb2RlbD1cIiIgKyAob3B0aW9uLnBhcmVudC5hdHRyc01hcFsndi1tb2RlbCddKSArICJcIj46XG4iICsNCiAgICAgICdpbmxpbmUgc2VsZWN0ZWQgYXR0cmlidXRlcyBvbiA8b3B0aW9uPiB3aWxsIGJlIGlnbm9yZWQgd2hlbiB1c2luZyB2LW1vZGVsLiAnICsNCiAgICAgICdEZWNsYXJlIGluaXRpYWwgdmFsdWVzIGluIHRoZSBjb21wb25lbnRcJ3MgZGF0YSBvcHRpb24gaW5zdGVhZC4nDQogICAgKTsNCiAgICByZXR1cm4gdHJ1ZQ0KICB9DQogIHJldHVybiBmYWxzZQ0KfQ0KDQpmdW5jdGlvbiBnZW5Bc3NpZ25tZW50Q29kZSAodmFsdWUsIGFzc2lnbm1lbnQpIHsNCiAgdmFyIG1vZGVsUnMgPSBwYXJzZU1vZGVsKHZhbHVlKTsNCiAgaWYgKG1vZGVsUnMuaWR4ID09PSBudWxsKSB7DQogICAgcmV0dXJuICh2YWx1ZSArICI9IiArIGFzc2lnbm1lbnQpDQogIH0gZWxzZSB7DQogICAgcmV0dXJuICJ2YXIgJCRleHAgPSAiICsgKG1vZGVsUnMuZXhwKSArICIsICQkaWR4ID0gIiArIChtb2RlbFJzLmlkeCkgKyAiOyIgKw0KICAgICAgImlmICghQXJyYXkuaXNBcnJheSgkJGV4cCkpeyIgKw0KICAgICAgICB2YWx1ZSArICI9IiArIGFzc2lnbm1lbnQgKyAifSIgKw0KICAgICAgImVsc2V7JCRleHAuc3BsaWNlKCQkaWR4LCAxLCAiICsgYXNzaWdubWVudCArICIpfSINCiAgfQ0KfQ0KDQovKiAgKi8NCg0KZnVuY3Rpb24gdGV4dCAoZWwsIGRpcikgew0KICBpZiAoZGlyLnZhbHVlKSB7DQogICAgYWRkUHJvcChlbCwgJ3RleHRDb250ZW50JywgKCJfcygiICsgKGRpci52YWx1ZSkgKyAiKSIpKTsNCiAgfQ0KfQ0KDQovKiAgKi8NCg0KZnVuY3Rpb24gaHRtbCAoZWwsIGRpcikgew0KICBpZiAoZGlyLnZhbHVlKSB7DQogICAgYWRkUHJvcChlbCwgJ2lubmVySFRNTCcsICgiX3MoIiArIChkaXIudmFsdWUpICsgIikiKSk7DQogIH0NCn0NCg0KdmFyIGRpcmVjdGl2ZXMkMSA9IHsNCiAgbW9kZWw6IG1vZGVsJDEsDQogIHRleHQ6IHRleHQsDQogIGh0bWw6IGh0bWwNCn07DQoNCi8qICAqLw0KDQp2YXIgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOw0KDQp2YXIgYmFzZU9wdGlvbnMgPSB7DQogIGV4cGVjdEhUTUw6IHRydWUsDQogIG1vZHVsZXM6IG1vZHVsZXMkMSwNCiAgc3RhdGljS2V5czogZ2VuU3RhdGljS2V5cyhtb2R1bGVzJDEpLA0KICBkaXJlY3RpdmVzOiBkaXJlY3RpdmVzJDEsDQogIGlzUmVzZXJ2ZWRUYWc6IGlzUmVzZXJ2ZWRUYWcsDQogIGlzVW5hcnlUYWc6IGlzVW5hcnlUYWcsDQogIG11c3RVc2VQcm9wOiBtdXN0VXNlUHJvcCwNCiAgZ2V0VGFnTmFtZXNwYWNlOiBnZXRUYWdOYW1lc3BhY2UsDQogIGlzUHJlVGFnOiBpc1ByZVRhZw0KfTsNCg0KZnVuY3Rpb24gY29tcGlsZSQkMSAoDQogIHRlbXBsYXRlLA0KICBvcHRpb25zDQopIHsNCiAgb3B0aW9ucyA9IG9wdGlvbnMNCiAgICA/IGV4dGVuZChleHRlbmQoe30sIGJhc2VPcHRpb25zKSwgb3B0aW9ucykNCiAgICA6IGJhc2VPcHRpb25zOw0KICByZXR1cm4gY29tcGlsZSQxKHRlbXBsYXRlLCBvcHRpb25zKQ0KfQ0KDQpmdW5jdGlvbiBjb21waWxlVG9GdW5jdGlvbnMgKA0KICB0ZW1wbGF0ZSwNCiAgb3B0aW9ucywNCiAgdm0NCikgew0KICB2YXIgX3dhcm4gPSAob3B0aW9ucyAmJiBvcHRpb25zLndhcm4pIHx8IHdhcm47DQogIC8vIGRldGVjdCBwb3NzaWJsZSBDU1AgcmVzdHJpY3Rpb24NCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovDQogIHsNCiAgICB0cnkgew0KICAgICAgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gMScpOw0KICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgIGlmIChlLnRvU3RyaW5nKCkubWF0Y2goL3Vuc2FmZS1ldmFsfENTUC8pKSB7DQogICAgICAgIF93YXJuKA0KICAgICAgICAgICdJdCBzZWVtcyB5b3UgYXJlIHVzaW5nIHRoZSBzdGFuZGFsb25lIGJ1aWxkIG9mIFZ1ZS5qcyBpbiBhbiAnICsNCiAgICAgICAgICAnZW52aXJvbm1lbnQgd2l0aCBDb250ZW50IFNlY3VyaXR5IFBvbGljeSB0aGF0IHByb2hpYml0cyB1bnNhZmUtZXZhbC4gJyArDQogICAgICAgICAgJ1RoZSB0ZW1wbGF0ZSBjb21waWxlciBjYW5ub3Qgd29yayBpbiB0aGlzIGVudmlyb25tZW50LiBDb25zaWRlciAnICsNCiAgICAgICAgICAncmVsYXhpbmcgdGhlIHBvbGljeSB0byBhbGxvdyB1bnNhZmUtZXZhbCBvciBwcmUtY29tcGlsaW5nIHlvdXIgJyArDQogICAgICAgICAgJ3RlbXBsYXRlcyBpbnRvIHJlbmRlciBmdW5jdGlvbnMuJw0KICAgICAgICApOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KICB2YXIga2V5ID0gb3B0aW9ucyAmJiBvcHRpb25zLmRlbGltaXRlcnMNCiAgICA/IFN0cmluZyhvcHRpb25zLmRlbGltaXRlcnMpICsgdGVtcGxhdGUNCiAgICA6IHRlbXBsYXRlOw0KICBpZiAoY2FjaGVba2V5XSkgew0KICAgIHJldHVybiBjYWNoZVtrZXldDQogIH0NCiAgdmFyIHJlcyA9IHt9Ow0KICB2YXIgY29tcGlsZWQgPSBjb21waWxlJCQxKHRlbXBsYXRlLCBvcHRpb25zKTsNCiAgcmVzLnJlbmRlciA9IG1ha2VGdW5jdGlvbihjb21waWxlZC5yZW5kZXIpOw0KICB2YXIgbCA9IGNvbXBpbGVkLnN0YXRpY1JlbmRlckZucy5sZW5ndGg7DQogIHJlcy5zdGF0aWNSZW5kZXJGbnMgPSBuZXcgQXJyYXkobCk7DQogIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7DQogICAgcmVzLnN0YXRpY1JlbmRlckZuc1tpXSA9IG1ha2VGdW5jdGlvbihjb21waWxlZC5zdGF0aWNSZW5kZXJGbnNbaV0pOw0KICB9DQogIHsNCiAgICBpZiAocmVzLnJlbmRlciA9PT0gbm9vcCB8fCByZXMuc3RhdGljUmVuZGVyRm5zLnNvbWUoZnVuY3Rpb24gKGZuKSB7IHJldHVybiBmbiA9PT0gbm9vcDsgfSkpIHsNCiAgICAgIF93YXJuKA0KICAgICAgICAiZmFpbGVkIHRvIGNvbXBpbGUgdGVtcGxhdGU6XG5cbiIgKyB0ZW1wbGF0ZSArICJcblxuIiArDQogICAgICAgIGRldGVjdEVycm9ycyhjb21waWxlZC5hc3QpLmpvaW4oJ1xuJykgKw0KICAgICAgICAnXG5cbicsDQogICAgICAgIHZtDQogICAgICApOw0KICAgIH0NCiAgfQ0KICByZXR1cm4gKGNhY2hlW2tleV0gPSByZXMpDQp9DQoNCmZ1bmN0aW9uIG1ha2VGdW5jdGlvbiAoY29kZSkgew0KICB0cnkgew0KICAgIHJldHVybiBuZXcgRnVuY3Rpb24oY29kZSkNCiAgfSBjYXRjaCAoZSkgew0KICAgIHJldHVybiBub29wDQogIH0NCn0NCg0KLyogICovDQoNCnZhciBpZFRvVGVtcGxhdGUgPSBjYWNoZWQoZnVuY3Rpb24gKGlkKSB7DQogIHZhciBlbCA9IHF1ZXJ5KGlkKTsNCiAgcmV0dXJuIGVsICYmIGVsLmlubmVySFRNTA0KfSk7DQoNCnZhciBtb3VudCA9IFZ1ZSQzLnByb3RvdHlwZS4kbW91bnQ7DQpWdWUkMy5wcm90b3R5cGUuJG1vdW50ID0gZnVuY3Rpb24gKA0KICBlbCwNCiAgaHlkcmF0aW5nDQopIHsNCiAgZWwgPSBlbCAmJiBxdWVyeShlbCk7DQoNCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovDQogIGlmIChlbCA9PT0gZG9jdW1lbnQuYm9keSB8fCBlbCA9PT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7DQogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oDQogICAgICAiRG8gbm90IG1vdW50IFZ1ZSB0byA8aHRtbD4gb3IgPGJvZHk+IC0gbW91bnQgdG8gbm9ybWFsIGVsZW1lbnRzIGluc3RlYWQuIg0KICAgICk7DQogICAgcmV0dXJuIHRoaXMNCiAgfQ0KDQogIHZhciBvcHRpb25zID0gdGhpcy4kb3B0aW9uczsNCiAgLy8gcmVzb2x2ZSB0ZW1wbGF0ZS9lbCBhbmQgY29udmVydCB0byByZW5kZXIgZnVuY3Rpb24NCiAgaWYgKCFvcHRpb25zLnJlbmRlcikgew0KICAgIHZhciB0ZW1wbGF0ZSA9IG9wdGlvbnMudGVtcGxhdGU7DQogICAgaWYgKHRlbXBsYXRlKSB7DQogICAgICBpZiAodHlwZW9mIHRlbXBsYXRlID09PSAnc3RyaW5nJykgew0KICAgICAgICBpZiAodGVtcGxhdGUuY2hhckF0KDApID09PSAnIycpIHsNCiAgICAgICAgICB0ZW1wbGF0ZSA9IGlkVG9UZW1wbGF0ZSh0ZW1wbGF0ZSk7DQogICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovDQogICAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiAhdGVtcGxhdGUpIHsNCiAgICAgICAgICAgIHdhcm4oDQogICAgICAgICAgICAgICgiVGVtcGxhdGUgZWxlbWVudCBub3QgZm91bmQgb3IgaXMgZW1wdHk6ICIgKyAob3B0aW9ucy50ZW1wbGF0ZSkpLA0KICAgICAgICAgICAgICB0aGlzDQogICAgICAgICAgICApOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfSBlbHNlIGlmICh0ZW1wbGF0ZS5ub2RlVHlwZSkgew0KICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLmlubmVySFRNTDsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHsNCiAgICAgICAgICB3YXJuKCdpbnZhbGlkIHRlbXBsYXRlIG9wdGlvbjonICsgdGVtcGxhdGUsIHRoaXMpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0aGlzDQogICAgICB9DQogICAgfSBlbHNlIGlmIChlbCkgew0KICAgICAgdGVtcGxhdGUgPSBnZXRPdXRlckhUTUwoZWwpOw0KICAgIH0NCiAgICBpZiAodGVtcGxhdGUpIHsNCiAgICAgIHZhciByZWYgPSBjb21waWxlVG9GdW5jdGlvbnModGVtcGxhdGUsIHsNCiAgICAgICAgd2Fybjogd2FybiwNCiAgICAgICAgc2hvdWxkRGVjb2RlTmV3bGluZXM6IHNob3VsZERlY29kZU5ld2xpbmVzLA0KICAgICAgICBkZWxpbWl0ZXJzOiBvcHRpb25zLmRlbGltaXRlcnMNCiAgICAgIH0sIHRoaXMpOw0KICAgICAgdmFyIHJlbmRlciA9IHJlZi5yZW5kZXI7DQogICAgICB2YXIgc3RhdGljUmVuZGVyRm5zID0gcmVmLnN0YXRpY1JlbmRlckZuczsNCiAgICAgIG9wdGlvbnMucmVuZGVyID0gcmVuZGVyOw0KICAgICAgb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnMgPSBzdGF0aWNSZW5kZXJGbnM7DQogICAgfQ0KICB9DQogIHJldHVybiBtb3VudC5jYWxsKHRoaXMsIGVsLCBoeWRyYXRpbmcpDQp9Ow0KDQovKioNCiAqIEdldCBvdXRlckhUTUwgb2YgZWxlbWVudHMsIHRha2luZyBjYXJlDQogKiBvZiBTVkcgZWxlbWVudHMgaW4gSUUgYXMgd2VsbC4NCiAqLw0KZnVuY3Rpb24gZ2V0T3V0ZXJIVE1MIChlbCkgew0KICBpZiAoZWwub3V0ZXJIVE1MKSB7DQogICAgcmV0dXJuIGVsLm91dGVySFRNTA0KICB9IGVsc2Ugew0KICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWwuY2xvbmVOb2RlKHRydWUpKTsNCiAgICByZXR1cm4gY29udGFpbmVyLmlubmVySFRNTA0KICB9DQp9DQoNClZ1ZSQzLmNvbXBpbGUgPSBjb21waWxlVG9GdW5jdGlvbnM7DQoNCnJldHVybiBWdWUkMzsNCg0KfSkpKTsNCg=="></script>
<script src="data:application/x-javascript;base64,IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHQpe3JldHVybiB0Pm4/LTE6bj50PzE6bj49dD8wOjAvMH1mdW5jdGlvbiB0KG4pe3JldHVybiBudWxsPT09bj8wLzA6K259ZnVuY3Rpb24gZShuKXtyZXR1cm4haXNOYU4obil9ZnVuY3Rpb24gcihuKXtyZXR1cm57bGVmdDpmdW5jdGlvbih0LGUscix1KXtmb3IoYXJndW1lbnRzLmxlbmd0aDwzJiYocj0wKSxhcmd1bWVudHMubGVuZ3RoPDQmJih1PXQubGVuZ3RoKTt1PnI7KXt2YXIgaT1yK3U+Pj4xO24odFtpXSxlKTwwP3I9aSsxOnU9aX1yZXR1cm4gcn0scmlnaHQ6ZnVuY3Rpb24odCxlLHIsdSl7Zm9yKGFyZ3VtZW50cy5sZW5ndGg8MyYmKHI9MCksYXJndW1lbnRzLmxlbmd0aDw0JiYodT10Lmxlbmd0aCk7dT5yOyl7dmFyIGk9cit1Pj4+MTtuKHRbaV0sZSk+MD91PWk6cj1pKzF9cmV0dXJuIHJ9fX1mdW5jdGlvbiB1KG4pe3JldHVybiBuLmxlbmd0aH1mdW5jdGlvbiBpKG4pe2Zvcih2YXIgdD0xO24qdCUxOyl0Kj0xMDtyZXR1cm4gdH1mdW5jdGlvbiBvKG4sdCl7Zm9yKHZhciBlIGluIHQpT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLGUse3ZhbHVlOnRbZV0sZW51bWVyYWJsZTohMX0pfWZ1bmN0aW9uIGEoKXt0aGlzLl89T2JqZWN0LmNyZWF0ZShudWxsKX1mdW5jdGlvbiBjKG4pe3JldHVybihuKz0iIik9PT1kYXx8blswXT09PW1hP21hK246bn1mdW5jdGlvbiBsKG4pe3JldHVybihuKz0iIilbMF09PT1tYT9uLnNsaWNlKDEpOm59ZnVuY3Rpb24gcyhuKXtyZXR1cm4gYyhuKWluIHRoaXMuX31mdW5jdGlvbiBmKG4pe3JldHVybihuPWMobikpaW4gdGhpcy5fJiZkZWxldGUgdGhpcy5fW25dfWZ1bmN0aW9uIGgoKXt2YXIgbj1bXTtmb3IodmFyIHQgaW4gdGhpcy5fKW4ucHVzaChsKHQpKTtyZXR1cm4gbn1mdW5jdGlvbiBnKCl7dmFyIG49MDtmb3IodmFyIHQgaW4gdGhpcy5fKSsrbjtyZXR1cm4gbn1mdW5jdGlvbiBwKCl7Zm9yKHZhciBuIGluIHRoaXMuXylyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiB2KCl7dGhpcy5fPU9iamVjdC5jcmVhdGUobnVsbCl9ZnVuY3Rpb24gZChuLHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9ZS5hcHBseSh0LGFyZ3VtZW50cyk7cmV0dXJuIHI9PT10P246cn19ZnVuY3Rpb24gbShuLHQpe2lmKHQgaW4gbilyZXR1cm4gdDt0PXQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKTtmb3IodmFyIGU9MCxyPXlhLmxlbmd0aDtyPmU7KytlKXt2YXIgdT15YVtlXSt0O2lmKHUgaW4gbilyZXR1cm4gdX19ZnVuY3Rpb24geSgpe31mdW5jdGlvbiBNKCl7fWZ1bmN0aW9uIHgobil7ZnVuY3Rpb24gdCgpe2Zvcih2YXIgdCxyPWUsdT0tMSxpPXIubGVuZ3RoOysrdTxpOykodD1yW3VdLm9uKSYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG59dmFyIGU9W10scj1uZXcgYTtyZXR1cm4gdC5vbj1mdW5jdGlvbih0LHUpe3ZhciBpLG89ci5nZXQodCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj9vJiZvLm9uOihvJiYoby5vbj1udWxsLGU9ZS5zbGljZSgwLGk9ZS5pbmRleE9mKG8pKS5jb25jYXQoZS5zbGljZShpKzEpKSxyLnJlbW92ZSh0KSksdSYmZS5wdXNoKHIuc2V0KHQse29uOnV9KSksbil9LHR9ZnVuY3Rpb24gYigpe3RhLmV2ZW50LnByZXZlbnREZWZhdWx0KCl9ZnVuY3Rpb24gXygpe2Zvcih2YXIgbix0PXRhLmV2ZW50O249dC5zb3VyY2VFdmVudDspdD1uO3JldHVybiB0fWZ1bmN0aW9uIHcobil7Zm9yKHZhciB0PW5ldyBNLGU9MCxyPWFyZ3VtZW50cy5sZW5ndGg7KytlPHI7KXRbYXJndW1lbnRzW2VdXT14KHQpO3JldHVybiB0Lm9mPWZ1bmN0aW9uKGUscil7cmV0dXJuIGZ1bmN0aW9uKHUpe3RyeXt2YXIgaT11LnNvdXJjZUV2ZW50PXRhLmV2ZW50O3UudGFyZ2V0PW4sdGEuZXZlbnQ9dSx0W3UudHlwZV0uYXBwbHkoZSxyKX1maW5hbGx5e3RhLmV2ZW50PWl9fX0sdH1mdW5jdGlvbiBTKG4pe3JldHVybiB4YShuLGthKSxufWZ1bmN0aW9uIGsobil7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpmdW5jdGlvbigpe3JldHVybiBiYShuLHRoaXMpfX1mdW5jdGlvbiBFKG4pe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246ZnVuY3Rpb24oKXtyZXR1cm4gX2Eobix0aGlzKX19ZnVuY3Rpb24gQShuLHQpe2Z1bmN0aW9uIGUoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZShuKX1mdW5jdGlvbiByKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpfWZ1bmN0aW9uIHUoKXt0aGlzLnNldEF0dHJpYnV0ZShuLHQpfWZ1bmN0aW9uIGkoKXt0aGlzLnNldEF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCx0KX1mdW5jdGlvbiBvKCl7dmFyIGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT90aGlzLnJlbW92ZUF0dHJpYnV0ZShuKTp0aGlzLnNldEF0dHJpYnV0ZShuLGUpfWZ1bmN0aW9uIGEoKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsKTp0aGlzLnNldEF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCxlKX1yZXR1cm4gbj10YS5ucy5xdWFsaWZ5KG4pLG51bGw9PXQ/bi5sb2NhbD9yOmU6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/bi5sb2NhbD9hOm86bi5sb2NhbD9pOnV9ZnVuY3Rpb24gTihuKXtyZXR1cm4gbi50cmltKCkucmVwbGFjZSgvXHMrL2csIiAiKX1mdW5jdGlvbiBDKG4pe3JldHVybiBuZXcgUmVnRXhwKCIoPzpefFxccyspIit0YS5yZXF1b3RlKG4pKyIoPzpcXHMrfCQpIiwiZyIpfWZ1bmN0aW9uIHoobil7cmV0dXJuKG4rIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKX1mdW5jdGlvbiBxKG4sdCl7ZnVuY3Rpb24gZSgpe2Zvcih2YXIgZT0tMTsrK2U8dTspbltlXSh0aGlzLHQpfWZ1bmN0aW9uIHIoKXtmb3IodmFyIGU9LTEscj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTsrK2U8dTspbltlXSh0aGlzLHIpfW49eihuKS5tYXAoTCk7dmFyIHU9bi5sZW5ndGg7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/cjplfWZ1bmN0aW9uIEwobil7dmFyIHQ9QyhuKTtyZXR1cm4gZnVuY3Rpb24oZSxyKXtpZih1PWUuY2xhc3NMaXN0KXJldHVybiByP3UuYWRkKG4pOnUucmVtb3ZlKG4pO3ZhciB1PWUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIjtyPyh0Lmxhc3RJbmRleD0wLHQudGVzdCh1KXx8ZS5zZXRBdHRyaWJ1dGUoImNsYXNzIixOKHUrIiAiK24pKSk6ZS5zZXRBdHRyaWJ1dGUoImNsYXNzIixOKHUucmVwbGFjZSh0LCIgIikpKX19ZnVuY3Rpb24gVChuLHQsZSl7ZnVuY3Rpb24gcigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobil9ZnVuY3Rpb24gdSgpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkobix0LGUpfWZ1bmN0aW9uIGkoKXt2YXIgcj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1yP3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobik6dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLHIsZSl9cmV0dXJuIG51bGw9PXQ/cjoiZnVuY3Rpb24iPT10eXBlb2YgdD9pOnV9ZnVuY3Rpb24gUihuLHQpe2Z1bmN0aW9uIGUoKXtkZWxldGUgdGhpc1tuXX1mdW5jdGlvbiByKCl7dGhpc1tuXT10fWZ1bmN0aW9uIHUoKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP2RlbGV0ZSB0aGlzW25dOnRoaXNbbl09ZX1yZXR1cm4gbnVsbD09dD9lOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3U6cn1mdW5jdGlvbiBEKG4pe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246KG49dGEubnMucXVhbGlmeShuKSkubG9jYWw/ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuLnNwYWNlLG4ubG9jYWwpfTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHRoaXMubmFtZXNwYWNlVVJJLG4pfX1mdW5jdGlvbiBQKCl7dmFyIG49dGhpcy5wYXJlbnROb2RlO24mJm4ucmVtb3ZlQ2hpbGQodGhpcyl9ZnVuY3Rpb24gVShuKXtyZXR1cm57X19kYXRhX186bn19ZnVuY3Rpb24gaihuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gU2EodGhpcyxuKX19ZnVuY3Rpb24gRih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aHx8KHQ9biksZnVuY3Rpb24obixlKXtyZXR1cm4gbiYmZT90KG4uX19kYXRhX18sZS5fX2RhdGFfXyk6IW4tIWV9fWZ1bmN0aW9uIEgobix0KXtmb3IodmFyIGU9MCxyPW4ubGVuZ3RoO3I+ZTtlKyspZm9yKHZhciB1LGk9bltlXSxvPTAsYT1pLmxlbmd0aDthPm87bysrKSh1PWlbb10pJiZ0KHUsbyxlKTtyZXR1cm4gbn1mdW5jdGlvbiBPKG4pe3JldHVybiB4YShuLEFhKSxufWZ1bmN0aW9uIFkobil7dmFyIHQsZTtyZXR1cm4gZnVuY3Rpb24ocix1LGkpe3ZhciBvLGE9bltpXS51cGRhdGUsYz1hLmxlbmd0aDtmb3IoaSE9ZSYmKGU9aSx0PTApLHU+PXQmJih0PXUrMSk7IShvPWFbdF0pJiYrK3Q8YzspO3JldHVybiBvfX1mdW5jdGlvbiBJKG4sdCxlKXtmdW5jdGlvbiByKCl7dmFyIHQ9dGhpc1tvXTt0JiYodGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG4sdCx0LiQpLGRlbGV0ZSB0aGlzW29dKX1mdW5jdGlvbiB1KCl7dmFyIHU9Yyh0LHJhKGFyZ3VtZW50cykpO3IuY2FsbCh0aGlzKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIobix0aGlzW29dPXUsdS4kPWUpLHUuXz10fWZ1bmN0aW9uIGkoKXt2YXIgdCxlPW5ldyBSZWdFeHAoIl5fX29uKFteLl0rKSIrdGEucmVxdW90ZShuKSsiJCIpO2Zvcih2YXIgciBpbiB0aGlzKWlmKHQ9ci5tYXRjaChlKSl7dmFyIHU9dGhpc1tyXTt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodFsxXSx1LHUuJCksZGVsZXRlIHRoaXNbcl19fXZhciBvPSJfX29uIituLGE9bi5pbmRleE9mKCIuIiksYz1aO2E+MCYmKG49bi5zbGljZSgwLGEpKTt2YXIgbD1DYS5nZXQobik7cmV0dXJuIGwmJihuPWwsYz1WKSxhP3Q/dTpyOnQ/eTppfWZ1bmN0aW9uIFoobix0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHI9dGEuZXZlbnQ7dGEuZXZlbnQ9ZSx0WzBdPXRoaXMuX19kYXRhX187dHJ5e24uYXBwbHkodGhpcyx0KX1maW5hbGx5e3RhLmV2ZW50PXJ9fX1mdW5jdGlvbiBWKG4sdCl7dmFyIGU9WihuLHQpO3JldHVybiBmdW5jdGlvbihuKXt2YXIgdD10aGlzLHI9bi5yZWxhdGVkVGFyZ2V0O3ImJihyPT09dHx8OCZyLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpKXx8ZS5jYWxsKHQsbil9fWZ1bmN0aW9uIFgoKXt2YXIgbj0iLmRyYWdzdXBwcmVzcy0iKyArK3FhLHQ9ImNsaWNrIituLGU9dGEuc2VsZWN0KG9hKS5vbigidG91Y2htb3ZlIituLGIpLm9uKCJkcmFnc3RhcnQiK24sYikub24oInNlbGVjdHN0YXJ0IituLGIpO2lmKHphKXt2YXIgcj1pYS5zdHlsZSx1PXJbemFdO3JbemFdPSJub25lIn1yZXR1cm4gZnVuY3Rpb24oaSl7aWYoZS5vbihuLG51bGwpLHphJiYoclt6YV09dSksaSl7dmFyIG89ZnVuY3Rpb24oKXtlLm9uKHQsbnVsbCl9O2Uub24odCxmdW5jdGlvbigpe2IoKSxvKCl9LCEwKSxzZXRUaW1lb3V0KG8sMCl9fX1mdW5jdGlvbiAkKG4sdCl7dC5jaGFuZ2VkVG91Y2hlcyYmKHQ9dC5jaGFuZ2VkVG91Y2hlc1swXSk7dmFyIGU9bi5vd25lclNWR0VsZW1lbnR8fG47aWYoZS5jcmVhdGVTVkdQb2ludCl7dmFyIHI9ZS5jcmVhdGVTVkdQb2ludCgpO2lmKDA+TGEmJihvYS5zY3JvbGxYfHxvYS5zY3JvbGxZKSl7ZT10YS5zZWxlY3QoImJvZHkiKS5hcHBlbmQoInN2ZyIpLnN0eWxlKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxtYXJnaW46MCxwYWRkaW5nOjAsYm9yZGVyOiJub25lIn0sImltcG9ydGFudCIpO3ZhciB1PWVbMF1bMF0uZ2V0U2NyZWVuQ1RNKCk7TGE9ISh1LmZ8fHUuZSksZS5yZW1vdmUoKX1yZXR1cm4gTGE/KHIueD10LnBhZ2VYLHIueT10LnBhZ2VZKTooci54PXQuY2xpZW50WCxyLnk9dC5jbGllbnRZKSxyPXIubWF0cml4VHJhbnNmb3JtKG4uZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKSxbci54LHIueV19dmFyIGk9bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm5bdC5jbGllbnRYLWkubGVmdC1uLmNsaWVudExlZnQsdC5jbGllbnRZLWkudG9wLW4uY2xpZW50VG9wXX1mdW5jdGlvbiBCKCl7cmV0dXJuIHRhLmV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmlkZW50aWZpZXJ9ZnVuY3Rpb24gVygpe3JldHVybiB0YS5ldmVudC50YXJnZXR9ZnVuY3Rpb24gSigpe3JldHVybiBvYX1mdW5jdGlvbiBHKG4pe3JldHVybiBuPjA/MTowPm4/LTE6MH1mdW5jdGlvbiBLKG4sdCxlKXtyZXR1cm4odFswXS1uWzBdKSooZVsxXS1uWzFdKS0odFsxXS1uWzFdKSooZVswXS1uWzBdKX1mdW5jdGlvbiBRKG4pe3JldHVybiBuPjE/MDotMT5uP0RhOk1hdGguYWNvcyhuKX1mdW5jdGlvbiBudChuKXtyZXR1cm4gbj4xP2phOi0xPm4/LWphOk1hdGguYXNpbihuKX1mdW5jdGlvbiB0dChuKXtyZXR1cm4oKG49TWF0aC5leHAobikpLTEvbikvMn1mdW5jdGlvbiBldChuKXtyZXR1cm4oKG49TWF0aC5leHAobikpKzEvbikvMn1mdW5jdGlvbiBydChuKXtyZXR1cm4oKG49TWF0aC5leHAoMipuKSktMSkvKG4rMSl9ZnVuY3Rpb24gdXQobil7cmV0dXJuKG49TWF0aC5zaW4obi8yKSkqbn1mdW5jdGlvbiBpdCgpe31mdW5jdGlvbiBvdChuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBvdD8odGhpcy5oPStuLHRoaXMucz0rdCx2b2lkKHRoaXMubD0rZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2Ygb3Q/bmV3IG90KG4uaCxuLnMsbi5sKTp4dCgiIituLGJ0LG90KTpuZXcgb3Qobix0LGUpfWZ1bmN0aW9uIGF0KG4sdCxlKXtmdW5jdGlvbiByKG4pe3JldHVybiBuPjM2MD9uLT0zNjA6MD5uJiYobis9MzYwKSw2MD5uP2krKG8taSkqbi82MDoxODA+bj9vOjI0MD5uP2krKG8taSkqKDI0MC1uKS82MDppfWZ1bmN0aW9uIHUobil7cmV0dXJuIE1hdGgucm91bmQoMjU1KnIobikpfXZhciBpLG87cmV0dXJuIG49aXNOYU4obik/MDoobiU9MzYwKTwwP24rMzYwOm4sdD1pc05hTih0KT8wOjA+dD8wOnQ+MT8xOnQsZT0wPmU/MDplPjE/MTplLG89LjU+PWU/ZSooMSt0KTplK3QtZSp0LGk9MiplLW8sbmV3IGR0KHUobisxMjApLHUobiksdShuLTEyMCkpfWZ1bmN0aW9uIGN0KG4sdCxlKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGN0Pyh0aGlzLmg9K24sdGhpcy5jPSt0LHZvaWQodGhpcy5sPStlKSk6YXJndW1lbnRzLmxlbmd0aDwyP24gaW5zdGFuY2VvZiBjdD9uZXcgY3Qobi5oLG4uYyxuLmwpOm4gaW5zdGFuY2VvZiBzdD9odChuLmwsbi5hLG4uYik6aHQoKG49X3QoKG49dGEucmdiKG4pKS5yLG4uZyxuLmIpKS5sLG4uYSxuLmIpOm5ldyBjdChuLHQsZSl9ZnVuY3Rpb24gbHQobix0LGUpe3JldHVybiBpc05hTihuKSYmKG49MCksaXNOYU4odCkmJih0PTApLG5ldyBzdChlLE1hdGguY29zKG4qPUZhKSp0LE1hdGguc2luKG4pKnQpfWZ1bmN0aW9uIHN0KG4sdCxlKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIHN0Pyh0aGlzLmw9K24sdGhpcy5hPSt0LHZvaWQodGhpcy5iPStlKSk6YXJndW1lbnRzLmxlbmd0aDwyP24gaW5zdGFuY2VvZiBzdD9uZXcgc3Qobi5sLG4uYSxuLmIpOm4gaW5zdGFuY2VvZiBjdD9sdChuLmgsbi5jLG4ubCk6X3QoKG49ZHQobikpLnIsbi5nLG4uYik6bmV3IHN0KG4sdCxlKX1mdW5jdGlvbiBmdChuLHQsZSl7dmFyIHI9KG4rMTYpLzExNix1PXIrdC81MDAsaT1yLWUvMjAwO3JldHVybiB1PWd0KHUpKkphLHI9Z3QocikqR2EsaT1ndChpKSpLYSxuZXcgZHQodnQoMy4yNDA0NTQyKnUtMS41MzcxMzg1KnItLjQ5ODUzMTQqaSksdnQoLS45NjkyNjYqdSsxLjg3NjAxMDgqcisuMDQxNTU2KmkpLHZ0KC4wNTU2NDM0KnUtLjIwNDAyNTkqcisxLjA1NzIyNTIqaSkpfWZ1bmN0aW9uIGh0KG4sdCxlKXtyZXR1cm4gbj4wP25ldyBjdChNYXRoLmF0YW4yKGUsdCkqSGEsTWF0aC5zcXJ0KHQqdCtlKmUpLG4pOm5ldyBjdCgwLzAsMC8wLG4pfWZ1bmN0aW9uIGd0KG4pe3JldHVybiBuPi4yMDY4OTMwMzQ/bipuKm46KG4tNC8yOSkvNy43ODcwMzd9ZnVuY3Rpb24gcHQobil7cmV0dXJuIG4+LjAwODg1Nj9NYXRoLnBvdyhuLDEvMyk6Ny43ODcwMzcqbis0LzI5fWZ1bmN0aW9uIHZ0KG4pe3JldHVybiBNYXRoLnJvdW5kKDI1NSooLjAwMzA0Pj1uPzEyLjkyKm46MS4wNTUqTWF0aC5wb3cobiwxLzIuNCktLjA1NSkpfWZ1bmN0aW9uIGR0KG4sdCxlKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGR0Pyh0aGlzLnI9fn5uLHRoaXMuZz1+fnQsdm9pZCh0aGlzLmI9fn5lKSk6YXJndW1lbnRzLmxlbmd0aDwyP24gaW5zdGFuY2VvZiBkdD9uZXcgZHQobi5yLG4uZyxuLmIpOnh0KCIiK24sZHQsYXQpOm5ldyBkdChuLHQsZSl9ZnVuY3Rpb24gbXQobil7cmV0dXJuIG5ldyBkdChuPj4xNiwyNTUmbj4+OCwyNTUmbil9ZnVuY3Rpb24geXQobil7cmV0dXJuIG10KG4pKyIifWZ1bmN0aW9uIE10KG4pe3JldHVybiAxNj5uPyIwIitNYXRoLm1heCgwLG4pLnRvU3RyaW5nKDE2KTpNYXRoLm1pbigyNTUsbikudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIHh0KG4sdCxlKXt2YXIgcix1LGksbz0wLGE9MCxjPTA7aWYocj0vKFthLXpdKylcKCguKilcKS9pLmV4ZWMobikpc3dpdGNoKHU9clsyXS5zcGxpdCgiLCIpLHJbMV0pe2Nhc2UiaHNsIjpyZXR1cm4gZShwYXJzZUZsb2F0KHVbMF0pLHBhcnNlRmxvYXQodVsxXSkvMTAwLHBhcnNlRmxvYXQodVsyXSkvMTAwKTtjYXNlInJnYiI6cmV0dXJuIHQoU3QodVswXSksU3QodVsxXSksU3QodVsyXSkpfXJldHVybihpPXRjLmdldChuKSk/dChpLnIsaS5nLGkuYik6KG51bGw9PW58fCIjIiE9PW4uY2hhckF0KDApfHxpc05hTihpPXBhcnNlSW50KG4uc2xpY2UoMSksMTYpKXx8KDQ9PT1uLmxlbmd0aD8obz0oMzg0MCZpKT4+NCxvPW8+PjR8byxhPTI0MCZpLGE9YT4+NHxhLGM9MTUmaSxjPWM8PDR8Yyk6Nz09PW4ubGVuZ3RoJiYobz0oMTY3MTE2ODAmaSk+PjE2LGE9KDY1MjgwJmkpPj44LGM9MjU1JmkpKSx0KG8sYSxjKSl9ZnVuY3Rpb24gYnQobix0LGUpe3ZhciByLHUsaT1NYXRoLm1pbihuLz0yNTUsdC89MjU1LGUvPTI1NSksbz1NYXRoLm1heChuLHQsZSksYT1vLWksYz0obytpKS8yO3JldHVybiBhPyh1PS41PmM/YS8obytpKTphLygyLW8taSkscj1uPT1vPyh0LWUpL2ErKGU+dD82OjApOnQ9PW8/KGUtbikvYSsyOihuLXQpL2ErNCxyKj02MCk6KHI9MC8wLHU9Yz4wJiYxPmM/MDpyKSxuZXcgb3Qocix1LGMpfWZ1bmN0aW9uIF90KG4sdCxlKXtuPXd0KG4pLHQ9d3QodCksZT13dChlKTt2YXIgcj1wdCgoLjQxMjQ1NjQqbisuMzU3NTc2MSp0Ky4xODA0Mzc1KmUpL0phKSx1PXB0KCguMjEyNjcyOSpuKy43MTUxNTIyKnQrLjA3MjE3NSplKS9HYSksaT1wdCgoLjAxOTMzMzkqbisuMTE5MTkyKnQrLjk1MDMwNDEqZSkvS2EpO3JldHVybiBzdCgxMTYqdS0xNiw1MDAqKHItdSksMjAwKih1LWkpKX1mdW5jdGlvbiB3dChuKXtyZXR1cm4obi89MjU1KTw9LjA0MDQ1P24vMTIuOTI6TWF0aC5wb3coKG4rLjA1NSkvMS4wNTUsMi40KX1mdW5jdGlvbiBTdChuKXt2YXIgdD1wYXJzZUZsb2F0KG4pO3JldHVybiIlIj09PW4uY2hhckF0KG4ubGVuZ3RoLTEpP01hdGgucm91bmQoMi41NSp0KTp0fWZ1bmN0aW9uIGt0KG4pe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246ZnVuY3Rpb24oKXtyZXR1cm4gbn19ZnVuY3Rpb24gRXQobil7cmV0dXJuIG59ZnVuY3Rpb24gQXQobil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gMj09PWFyZ3VtZW50cy5sZW5ndGgmJiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9bnVsbCksTnQodCxlLG4scil9fWZ1bmN0aW9uIE50KG4sdCxlLHIpe2Z1bmN0aW9uIHUoKXt2YXIgbix0PWMuc3RhdHVzO2lmKCF0JiZ6dChjKXx8dD49MjAwJiYzMDA+dHx8MzA0PT09dCl7dHJ5e249ZS5jYWxsKGksYyl9Y2F0Y2gocil7cmV0dXJuIG8uZXJyb3IuY2FsbChpLHIpLHZvaWQgMH1vLmxvYWQuY2FsbChpLG4pfWVsc2Ugby5lcnJvci5jYWxsKGksYyl9dmFyIGk9e30sbz10YS5kaXNwYXRjaCgiYmVmb3Jlc2VuZCIsInByb2dyZXNzIiwibG9hZCIsImVycm9yIiksYT17fSxjPW5ldyBYTUxIdHRwUmVxdWVzdCxsPW51bGw7cmV0dXJuIW9hLlhEb21haW5SZXF1ZXN0fHwid2l0aENyZWRlbnRpYWxzImluIGN8fCEvXihodHRwKHMpPzopP1wvXC8vLnRlc3Qobil8fChjPW5ldyBYRG9tYWluUmVxdWVzdCksIm9ubG9hZCJpbiBjP2Mub25sb2FkPWMub25lcnJvcj11OmMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7Yy5yZWFkeVN0YXRlPjMmJnUoKX0sYy5vbnByb2dyZXNzPWZ1bmN0aW9uKG4pe3ZhciB0PXRhLmV2ZW50O3RhLmV2ZW50PW47dHJ5e28ucHJvZ3Jlc3MuY2FsbChpLGMpfWZpbmFsbHl7dGEuZXZlbnQ9dH19LGkuaGVhZGVyPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49KG4rIiIpLnRvTG93ZXJDYXNlKCksYXJndW1lbnRzLmxlbmd0aDwyP2Fbbl06KG51bGw9PXQ/ZGVsZXRlIGFbbl06YVtuXT10KyIiLGkpfSxpLm1pbWVUeXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PW4/bnVsbDpuKyIiLGkpOnR9LGkucmVzcG9uc2VUeXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4saSk6bH0saS5yZXNwb25zZT1mdW5jdGlvbihuKXtyZXR1cm4gZT1uLGl9LFsiZ2V0IiwicG9zdCJdLmZvckVhY2goZnVuY3Rpb24obil7aVtuXT1mdW5jdGlvbigpe3JldHVybiBpLnNlbmQuYXBwbHkoaSxbbl0uY29uY2F0KHJhKGFyZ3VtZW50cykpKX19KSxpLnNlbmQ9ZnVuY3Rpb24oZSxyLHUpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgciYmKHU9cixyPW51bGwpLGMub3BlbihlLG4sITApLG51bGw9PXR8fCJhY2NlcHQiaW4gYXx8KGEuYWNjZXB0PXQrIiwqLyoiKSxjLnNldFJlcXVlc3RIZWFkZXIpZm9yKHZhciBzIGluIGEpYy5zZXRSZXF1ZXN0SGVhZGVyKHMsYVtzXSk7cmV0dXJuIG51bGwhPXQmJmMub3ZlcnJpZGVNaW1lVHlwZSYmYy5vdmVycmlkZU1pbWVUeXBlKHQpLG51bGwhPWwmJihjLnJlc3BvbnNlVHlwZT1sKSxudWxsIT11JiZpLm9uKCJlcnJvciIsdSkub24oImxvYWQiLGZ1bmN0aW9uKG4pe3UobnVsbCxuKX0pLG8uYmVmb3Jlc2VuZC5jYWxsKGksYyksYy5zZW5kKG51bGw9PXI/bnVsbDpyKSxpfSxpLmFib3J0PWZ1bmN0aW9uKCl7cmV0dXJuIGMuYWJvcnQoKSxpfSx0YS5yZWJpbmQoaSxvLCJvbiIpLG51bGw9PXI/aTppLmdldChDdChyKSl9ZnVuY3Rpb24gQ3Qobil7cmV0dXJuIDE9PT1uLmxlbmd0aD9mdW5jdGlvbih0LGUpe24obnVsbD09dD9lOm51bGwpfTpufWZ1bmN0aW9uIHp0KG4pe3ZhciB0PW4ucmVzcG9uc2VUeXBlO3JldHVybiB0JiYidGV4dCIhPT10P24ucmVzcG9uc2U6bi5yZXNwb25zZVRleHR9ZnVuY3Rpb24gcXQoKXt2YXIgbj1MdCgpLHQ9VHQoKS1uO3Q+MjQ/KGlzRmluaXRlKHQpJiYoY2xlYXJUaW1lb3V0KGljKSxpYz1zZXRUaW1lb3V0KHF0LHQpKSx1Yz0wKToodWM9MSxhYyhxdCkpfWZ1bmN0aW9uIEx0KCl7dmFyIG49RGF0ZS5ub3coKTtmb3Iob2M9ZWM7b2M7KW4+PW9jLnQmJihvYy5mPW9jLmMobi1vYy50KSksb2M9b2MubjtyZXR1cm4gbn1mdW5jdGlvbiBUdCgpe2Zvcih2YXIgbix0PWVjLGU9MS8wO3Q7KXQuZj90PW4/bi5uPXQubjplYz10Lm46KHQudDxlJiYoZT10LnQpLHQ9KG49dCkubik7cmV0dXJuIHJjPW4sZX1mdW5jdGlvbiBSdChuLHQpe3JldHVybiB0LShuP01hdGguY2VpbChNYXRoLmxvZyhuKS9NYXRoLkxOMTApOjEpfWZ1bmN0aW9uIER0KG4sdCl7dmFyIGU9TWF0aC5wb3coMTAsMyp2YSg4LXQpKTtyZXR1cm57c2NhbGU6dD44P2Z1bmN0aW9uKG4pe3JldHVybiBuL2V9OmZ1bmN0aW9uKG4pe3JldHVybiBuKmV9LHN5bWJvbDpufX1mdW5jdGlvbiBQdChuKXt2YXIgdD1uLmRlY2ltYWwsZT1uLnRob3VzYW5kcyxyPW4uZ3JvdXBpbmcsdT1uLmN1cnJlbmN5LGk9ciYmZT9mdW5jdGlvbihuLHQpe2Zvcih2YXIgdT1uLmxlbmd0aCxpPVtdLG89MCxhPXJbMF0sYz0wO3U+MCYmYT4wJiYoYythKzE+dCYmKGE9TWF0aC5tYXgoMSx0LWMpKSxpLnB1c2gobi5zdWJzdHJpbmcodS09YSx1K2EpKSwhKChjKz1hKzEpPnQpKTspYT1yW289KG8rMSklci5sZW5ndGhdO3JldHVybiBpLnJldmVyc2UoKS5qb2luKGUpfTpFdDtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9bGMuZXhlYyhuKSxyPWVbMV18fCIgIixvPWVbMl18fCI+IixhPWVbM118fCItIixjPWVbNF18fCIiLGw9ZVs1XSxzPStlWzZdLGY9ZVs3XSxoPWVbOF0sZz1lWzldLHA9MSx2PSIiLGQ9IiIsbT0hMSx5PSEwO3N3aXRjaChoJiYoaD0raC5zdWJzdHJpbmcoMSkpLChsfHwiMCI9PT1yJiYiPSI9PT1vKSYmKGw9cj0iMCIsbz0iPSIpLGcpe2Nhc2UibiI6Zj0hMCxnPSJnIjticmVhaztjYXNlIiUiOnA9MTAwLGQ9IiUiLGc9ImYiO2JyZWFrO2Nhc2UicCI6cD0xMDAsZD0iJSIsZz0iciI7YnJlYWs7Y2FzZSJiIjpjYXNlIm8iOmNhc2UieCI6Y2FzZSJYIjoiIyI9PT1jJiYodj0iMCIrZy50b0xvd2VyQ2FzZSgpKTtjYXNlImMiOnk9ITE7Y2FzZSJkIjptPSEwLGg9MDticmVhaztjYXNlInMiOnA9LTEsZz0iciJ9IiQiPT09YyYmKHY9dVswXSxkPXVbMV0pLCJyIiE9Z3x8aHx8KGc9ImciKSxudWxsIT1oJiYoImciPT1nP2g9TWF0aC5tYXgoMSxNYXRoLm1pbigyMSxoKSk6KCJlIj09Z3x8ImYiPT1nKSYmKGg9TWF0aC5tYXgoMCxNYXRoLm1pbigyMCxoKSkpKSxnPXNjLmdldChnKXx8VXQ7dmFyIE09bCYmZjtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9ZDtpZihtJiZuJTEpcmV0dXJuIiI7dmFyIHU9MD5ufHwwPT09biYmMD4xL24/KG49LW4sIi0iKToiLSI9PT1hPyIiOmE7aWYoMD5wKXt2YXIgYz10YS5mb3JtYXRQcmVmaXgobixoKTtuPWMuc2NhbGUobiksZT1jLnN5bWJvbCtkfWVsc2Ugbio9cDtuPWcobixoKTt2YXIgeCxiLF89bi5sYXN0SW5kZXhPZigiLiIpO2lmKDA+Xyl7dmFyIHc9eT9uLmxhc3RJbmRleE9mKCJlIik6LTE7MD53Pyh4PW4sYj0iIik6KHg9bi5zdWJzdHJpbmcoMCx3KSxiPW4uc3Vic3RyaW5nKHcpKX1lbHNlIHg9bi5zdWJzdHJpbmcoMCxfKSxiPXQrbi5zdWJzdHJpbmcoXysxKTshbCYmZiYmKHg9aSh4LDEvMCkpO3ZhciBTPXYubGVuZ3RoK3gubGVuZ3RoK2IubGVuZ3RoKyhNPzA6dS5sZW5ndGgpLGs9cz5TP25ldyBBcnJheShTPXMtUysxKS5qb2luKHIpOiIiO3JldHVybiBNJiYoeD1pKGsreCxrLmxlbmd0aD9zLWIubGVuZ3RoOjEvMCkpLHUrPXYsbj14K2IsKCI8Ij09PW8/dStuK2s6Ij4iPT09bz9rK3UrbjoiXiI9PT1vP2suc3Vic3RyaW5nKDAsUz4+PTEpK3UrbitrLnN1YnN0cmluZyhTKTp1KyhNP246aytuKSkrZX19fWZ1bmN0aW9uIFV0KG4pe3JldHVybiBuKyIifWZ1bmN0aW9uIGp0KCl7dGhpcy5fPW5ldyBEYXRlKGFyZ3VtZW50cy5sZW5ndGg+MT9EYXRlLlVUQy5hcHBseSh0aGlzLGFyZ3VtZW50cyk6YXJndW1lbnRzWzBdKX1mdW5jdGlvbiBGdChuLHQsZSl7ZnVuY3Rpb24gcih0KXt2YXIgZT1uKHQpLHI9aShlLDEpO3JldHVybiByLXQ+dC1lP2U6cn1mdW5jdGlvbiB1KGUpe3JldHVybiB0KGU9bihuZXcgaGMoZS0xKSksMSksZX1mdW5jdGlvbiBpKG4sZSl7cmV0dXJuIHQobj1uZXcgaGMoK24pLGUpLG59ZnVuY3Rpb24gbyhuLHIsaSl7dmFyIG89dShuKSxhPVtdO2lmKGk+MSlmb3IoO3I+bzspZShvKSVpfHxhLnB1c2gobmV3IERhdGUoK28pKSx0KG8sMSk7ZWxzZSBmb3IoO3I+bzspYS5wdXNoKG5ldyBEYXRlKCtvKSksdChvLDEpO3JldHVybiBhfWZ1bmN0aW9uIGEobix0LGUpe3RyeXtoYz1qdDt2YXIgcj1uZXcganQ7cmV0dXJuIHIuXz1uLG8ocix0LGUpfWZpbmFsbHl7aGM9RGF0ZX19bi5mbG9vcj1uLG4ucm91bmQ9cixuLmNlaWw9dSxuLm9mZnNldD1pLG4ucmFuZ2U9bzt2YXIgYz1uLnV0Yz1IdChuKTtyZXR1cm4gYy5mbG9vcj1jLGMucm91bmQ9SHQociksYy5jZWlsPUh0KHUpLGMub2Zmc2V0PUh0KGkpLGMucmFuZ2U9YSxufWZ1bmN0aW9uIEh0KG4pe3JldHVybiBmdW5jdGlvbih0LGUpe3RyeXtoYz1qdDt2YXIgcj1uZXcganQ7cmV0dXJuIHIuXz10LG4ocixlKS5ffWZpbmFsbHl7aGM9RGF0ZX19fWZ1bmN0aW9uIE90KG4pe2Z1bmN0aW9uIHQobil7ZnVuY3Rpb24gdCh0KXtmb3IodmFyIGUsdSxpLG89W10sYT0tMSxjPTA7KythPHI7KTM3PT09bi5jaGFyQ29kZUF0KGEpJiYoby5wdXNoKG4uc2xpY2UoYyxhKSksbnVsbCE9KHU9cGNbZT1uLmNoYXJBdCgrK2EpXSkmJihlPW4uY2hhckF0KCsrYSkpLChpPU5bZV0pJiYoZT1pKHQsbnVsbD09dT8iZSI9PT1lPyIgIjoiMCI6dSkpLG8ucHVzaChlKSxjPWErMSk7cmV0dXJuIG8ucHVzaChuLnNsaWNlKGMsYSkpLG8uam9pbigiIil9dmFyIHI9bi5sZW5ndGg7cmV0dXJuIHQucGFyc2U9ZnVuY3Rpb24odCl7dmFyIHI9e3k6MTkwMCxtOjAsZDoxLEg6MCxNOjAsUzowLEw6MCxaOm51bGx9LHU9ZShyLG4sdCwwKTtpZih1IT10Lmxlbmd0aClyZXR1cm4gbnVsbDsicCJpbiByJiYoci5IPXIuSCUxMisxMipyLnApO3ZhciBpPW51bGwhPXIuWiYmaGMhPT1qdCxvPW5ldyhpP2p0OmhjKTtyZXR1cm4iaiJpbiByP28uc2V0RnVsbFllYXIoci55LDAsci5qKToidyJpbiByJiYoIlciaW4gcnx8IlUiaW4gcik/KG8uc2V0RnVsbFllYXIoci55LDAsMSksby5zZXRGdWxsWWVhcihyLnksMCwiVyJpbiByPyhyLncrNiklNys3KnIuVy0oby5nZXREYXkoKSs1KSU3OnIudys3KnIuVS0oby5nZXREYXkoKSs2KSU3KSk6by5zZXRGdWxsWWVhcihyLnksci5tLHIuZCksby5zZXRIb3VycyhyLkgrKDB8ci5aLzEwMCksci5NK3IuWiUxMDAsci5TLHIuTCksaT9vLl86b30sdC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBufSx0fWZ1bmN0aW9uIGUobix0LGUscil7Zm9yKHZhciB1LGksbyxhPTAsYz10Lmxlbmd0aCxsPWUubGVuZ3RoO2M+YTspe2lmKHI+PWwpcmV0dXJuLTE7aWYodT10LmNoYXJDb2RlQXQoYSsrKSwzNz09PXUpe2lmKG89dC5jaGFyQXQoYSsrKSxpPUNbbyBpbiBwYz90LmNoYXJBdChhKyspOm9dLCFpfHwocj1pKG4sZSxyKSk8MClyZXR1cm4tMX1lbHNlIGlmKHUhPWUuY2hhckNvZGVBdChyKyspKXJldHVybi0xfXJldHVybiByfWZ1bmN0aW9uIHIobix0LGUpe18ubGFzdEluZGV4PTA7dmFyIHI9Xy5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLnc9dy5nZXQoclswXS50b0xvd2VyQ2FzZSgpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB1KG4sdCxlKXt4Lmxhc3RJbmRleD0wO3ZhciByPXguZXhlYyh0LnNsaWNlKGUpKTtyZXR1cm4gcj8obi53PWIuZ2V0KHJbMF0udG9Mb3dlckNhc2UoKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gaShuLHQsZSl7RS5sYXN0SW5kZXg9MDt2YXIgcj1FLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4ubT1BLmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG8obix0LGUpe1MubGFzdEluZGV4PTA7dmFyIHI9Uy5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLm09ay5nZXQoclswXS50b0xvd2VyQ2FzZSgpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBhKG4sdCxyKXtyZXR1cm4gZShuLE4uYy50b1N0cmluZygpLHQscil9ZnVuY3Rpb24gYyhuLHQscil7cmV0dXJuIGUobixOLngudG9TdHJpbmcoKSx0LHIpfWZ1bmN0aW9uIGwobix0LHIpe3JldHVybiBlKG4sTi5YLnRvU3RyaW5nKCksdCxyKX1mdW5jdGlvbiBzKG4sdCxlKXt2YXIgcj1NLmdldCh0LnNsaWNlKGUsZSs9MikudG9Mb3dlckNhc2UoKSk7cmV0dXJuIG51bGw9PXI/LTE6KG4ucD1yLGUpfXZhciBmPW4uZGF0ZVRpbWUsaD1uLmRhdGUsZz1uLnRpbWUscD1uLnBlcmlvZHMsdj1uLmRheXMsZD1uLnNob3J0RGF5cyxtPW4ubW9udGhzLHk9bi5zaG9ydE1vbnRoczt0LnV0Yz1mdW5jdGlvbihuKXtmdW5jdGlvbiBlKG4pe3RyeXtoYz1qdDt2YXIgdD1uZXcgaGM7cmV0dXJuIHQuXz1uLHIodCl9ZmluYWxseXtoYz1EYXRlfX12YXIgcj10KG4pO3JldHVybiBlLnBhcnNlPWZ1bmN0aW9uKG4pe3RyeXtoYz1qdDt2YXIgdD1yLnBhcnNlKG4pO3JldHVybiB0JiZ0Ll99ZmluYWxseXtoYz1EYXRlfX0sZS50b1N0cmluZz1yLnRvU3RyaW5nLGV9LHQubXVsdGk9dC51dGMubXVsdGk9YWU7dmFyIE09dGEubWFwKCkseD1JdCh2KSxiPVp0KHYpLF89SXQoZCksdz1adChkKSxTPUl0KG0pLGs9WnQobSksRT1JdCh5KSxBPVp0KHkpO3AuZm9yRWFjaChmdW5jdGlvbihuLHQpe00uc2V0KG4udG9Mb3dlckNhc2UoKSx0KX0pO3ZhciBOPXthOmZ1bmN0aW9uKG4pe3JldHVybiBkW24uZ2V0RGF5KCldfSxBOmZ1bmN0aW9uKG4pe3JldHVybiB2W24uZ2V0RGF5KCldfSxiOmZ1bmN0aW9uKG4pe3JldHVybiB5W24uZ2V0TW9udGgoKV19LEI6ZnVuY3Rpb24obil7cmV0dXJuIG1bbi5nZXRNb250aCgpXX0sYzp0KGYpLGQ6ZnVuY3Rpb24obix0KXtyZXR1cm4gWXQobi5nZXREYXRlKCksdCwyKX0sZTpmdW5jdGlvbihuLHQpe3JldHVybiBZdChuLmdldERhdGUoKSx0LDIpfSxIOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFl0KG4uZ2V0SG91cnMoKSx0LDIpfSxJOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFl0KG4uZ2V0SG91cnMoKSUxMnx8MTIsdCwyKX0sajpmdW5jdGlvbihuLHQpe3JldHVybiBZdCgxK2ZjLmRheU9mWWVhcihuKSx0LDMpfSxMOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFl0KG4uZ2V0TWlsbGlzZWNvbmRzKCksdCwzKX0sbTpmdW5jdGlvbihuLHQpe3JldHVybiBZdChuLmdldE1vbnRoKCkrMSx0LDIpfSxNOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFl0KG4uZ2V0TWludXRlcygpLHQsMil9LHA6ZnVuY3Rpb24obil7cmV0dXJuIHBbKyhuLmdldEhvdXJzKCk+PTEyKV19LFM6ZnVuY3Rpb24obix0KXtyZXR1cm4gWXQobi5nZXRTZWNvbmRzKCksdCwyKX0sVTpmdW5jdGlvbihuLHQpe3JldHVybiBZdChmYy5zdW5kYXlPZlllYXIobiksdCwyKX0sdzpmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXREYXkoKX0sVzpmdW5jdGlvbihuLHQpe3JldHVybiBZdChmYy5tb25kYXlPZlllYXIobiksdCwyKX0seDp0KGgpLFg6dChnKSx5OmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFl0KG4uZ2V0RnVsbFllYXIoKSUxMDAsdCwyKX0sWTpmdW5jdGlvbihuLHQpe3JldHVybiBZdChuLmdldEZ1bGxZZWFyKCklMWU0LHQsNCl9LFo6aWUsIiUiOmZ1bmN0aW9uKCl7cmV0dXJuIiUifX0sQz17YTpyLEE6dSxiOmksQjpvLGM6YSxkOlF0LGU6UXQsSDp0ZSxJOnRlLGo6bmUsTDp1ZSxtOkt0LE06ZWUscDpzLFM6cmUsVTpYdCx3OlZ0LFc6JHQseDpjLFg6bCx5Old0LFk6QnQsWjpKdCwiJSI6b2V9O3JldHVybiB0fWZ1bmN0aW9uIFl0KG4sdCxlKXt2YXIgcj0wPm4/Ii0iOiIiLHU9KHI/LW46bikrIiIsaT11Lmxlbmd0aDtyZXR1cm4gcisoZT5pP25ldyBBcnJheShlLWkrMSkuam9pbih0KSt1OnUpfWZ1bmN0aW9uIEl0KG4pe3JldHVybiBuZXcgUmVnRXhwKCJeKD86IituLm1hcCh0YS5yZXF1b3RlKS5qb2luKCJ8IikrIikiLCJpIil9ZnVuY3Rpb24gWnQobil7Zm9yKHZhciB0PW5ldyBhLGU9LTEscj1uLmxlbmd0aDsrK2U8cjspdC5zZXQobltlXS50b0xvd2VyQ2FzZSgpLGUpO3JldHVybiB0fWZ1bmN0aW9uIFZ0KG4sdCxlKXt2Yy5sYXN0SW5kZXg9MDt2YXIgcj12Yy5leGVjKHQuc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj8obi53PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFh0KG4sdCxlKXt2Yy5sYXN0SW5kZXg9MDt2YXIgcj12Yy5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLlU9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gJHQobix0LGUpe3ZjLmxhc3RJbmRleD0wO3ZhciByPXZjLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4uVz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBCdChuLHQsZSl7dmMubGFzdEluZGV4PTA7dmFyIHI9dmMuZXhlYyh0LnNsaWNlKGUsZSs0KSk7cmV0dXJuIHI/KG4ueT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBXdChuLHQsZSl7dmMubGFzdEluZGV4PTA7dmFyIHI9dmMuZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4ueT1HdCgrclswXSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gSnQobix0LGUpe3JldHVybi9eWystXVxkezR9JC8udGVzdCh0PXQuc2xpY2UoZSxlKzUpKT8obi5aPS10LGUrNSk6LTF9ZnVuY3Rpb24gR3Qobil7cmV0dXJuIG4rKG4+Njg/MTkwMDoyZTMpfWZ1bmN0aW9uIEt0KG4sdCxlKXt2Yy5sYXN0SW5kZXg9MDt2YXIgcj12Yy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5tPXJbMF0tMSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBRdChuLHQsZSl7dmMubGFzdEluZGV4PTA7dmFyIHI9dmMuZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4uZD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBuZShuLHQsZSl7dmMubGFzdEluZGV4PTA7dmFyIHI9dmMuZXhlYyh0LnNsaWNlKGUsZSszKSk7cmV0dXJuIHI/KG4uaj0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB0ZShuLHQsZSl7dmMubGFzdEluZGV4PTA7dmFyIHI9dmMuZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4uSD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBlZShuLHQsZSl7dmMubGFzdEluZGV4PTA7dmFyIHI9dmMuZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4uTT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiByZShuLHQsZSl7dmMubGFzdEluZGV4PTA7dmFyIHI9dmMuZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4uUz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB1ZShuLHQsZSl7dmMubGFzdEluZGV4PTA7dmFyIHI9dmMuZXhlYyh0LnNsaWNlKGUsZSszKSk7cmV0dXJuIHI/KG4uTD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBpZShuKXt2YXIgdD1uLmdldFRpbWV6b25lT2Zmc2V0KCksZT10PjA/Ii0iOiIrIixyPTB8dmEodCkvNjAsdT12YSh0KSU2MDtyZXR1cm4gZStZdChyLCIwIiwyKStZdCh1LCIwIiwyKX1mdW5jdGlvbiBvZShuLHQsZSl7ZGMubGFzdEluZGV4PTA7dmFyIHI9ZGMuZXhlYyh0LnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/ZStyWzBdLmxlbmd0aDotMX1mdW5jdGlvbiBhZShuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT0tMTsrK2U8dDspbltlXVswXT10aGlzKG5bZV1bMF0pO3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIGU9MCxyPW5bZV07IXJbMV0odCk7KXI9blsrK2VdO3JldHVybiByWzBdKHQpfX1mdW5jdGlvbiBjZSgpe31mdW5jdGlvbiBsZShuLHQsZSl7dmFyIHI9ZS5zPW4rdCx1PXItbixpPXItdTtlLnQ9bi1pKyh0LXUpfWZ1bmN0aW9uIHNlKG4sdCl7biYmeGMuaGFzT3duUHJvcGVydHkobi50eXBlKSYmeGNbbi50eXBlXShuLHQpfWZ1bmN0aW9uIGZlKG4sdCxlKXt2YXIgcix1PS0xLGk9bi5sZW5ndGgtZTtmb3IodC5saW5lU3RhcnQoKTsrK3U8aTspcj1uW3VdLHQucG9pbnQoclswXSxyWzFdLHJbMl0pO3QubGluZUVuZCgpfWZ1bmN0aW9uIGhlKG4sdCl7dmFyIGU9LTEscj1uLmxlbmd0aDtmb3IodC5wb2x5Z29uU3RhcnQoKTsrK2U8cjspZmUobltlXSx0LDEpO3QucG9seWdvbkVuZCgpfWZ1bmN0aW9uIGdlKCl7ZnVuY3Rpb24gbihuLHQpe24qPUZhLHQ9dCpGYS8yK0RhLzQ7dmFyIGU9bi1yLG89ZT49MD8xOi0xLGE9byplLGM9TWF0aC5jb3ModCksbD1NYXRoLnNpbih0KSxzPWkqbCxmPXUqYytzKk1hdGguY29zKGEpLGg9cypvKk1hdGguc2luKGEpO19jLmFkZChNYXRoLmF0YW4yKGgsZikpLHI9bix1PWMsaT1sfXZhciB0LGUscix1LGk7d2MucG9pbnQ9ZnVuY3Rpb24obyxhKXt3Yy5wb2ludD1uLHI9KHQ9bykqRmEsdT1NYXRoLmNvcyhhPShlPWEpKkZhLzIrRGEvNCksaT1NYXRoLnNpbihhKX0sd2MubGluZUVuZD1mdW5jdGlvbigpe24odCxlKX19ZnVuY3Rpb24gcGUobil7dmFyIHQ9blswXSxlPW5bMV0scj1NYXRoLmNvcyhlKTtyZXR1cm5bcipNYXRoLmNvcyh0KSxyKk1hdGguc2luKHQpLE1hdGguc2luKGUpXX1mdW5jdGlvbiB2ZShuLHQpe3JldHVybiBuWzBdKnRbMF0rblsxXSp0WzFdK25bMl0qdFsyXX1mdW5jdGlvbiBkZShuLHQpe3JldHVybltuWzFdKnRbMl0tblsyXSp0WzFdLG5bMl0qdFswXS1uWzBdKnRbMl0sblswXSp0WzFdLW5bMV0qdFswXV19ZnVuY3Rpb24gbWUobix0KXtuWzBdKz10WzBdLG5bMV0rPXRbMV0sblsyXSs9dFsyXX1mdW5jdGlvbiB5ZShuLHQpe3JldHVybltuWzBdKnQsblsxXSp0LG5bMl0qdF19ZnVuY3Rpb24gTWUobil7dmFyIHQ9TWF0aC5zcXJ0KG5bMF0qblswXStuWzFdKm5bMV0rblsyXSpuWzJdKTtuWzBdLz10LG5bMV0vPXQsblsyXS89dH1mdW5jdGlvbiB4ZShuKXtyZXR1cm5bTWF0aC5hdGFuMihuWzFdLG5bMF0pLG50KG5bMl0pXX1mdW5jdGlvbiBiZShuLHQpe3JldHVybiB2YShuWzBdLXRbMF0pPFRhJiZ2YShuWzFdLXRbMV0pPFRhfWZ1bmN0aW9uIF9lKG4sdCl7bio9RmE7dmFyIGU9TWF0aC5jb3ModCo9RmEpO3dlKGUqTWF0aC5jb3MobiksZSpNYXRoLnNpbihuKSxNYXRoLnNpbih0KSl9ZnVuY3Rpb24gd2Uobix0LGUpeysrU2MsRWMrPShuLUVjKS9TYyxBYys9KHQtQWMpL1NjLE5jKz0oZS1OYykvU2N9ZnVuY3Rpb24gU2UoKXtmdW5jdGlvbiBuKG4sdSl7bio9RmE7dmFyIGk9TWF0aC5jb3ModSo9RmEpLG89aSpNYXRoLmNvcyhuKSxhPWkqTWF0aC5zaW4obiksYz1NYXRoLnNpbih1KSxsPU1hdGguYXRhbjIoTWF0aC5zcXJ0KChsPWUqYy1yKmEpKmwrKGw9cipvLXQqYykqbCsobD10KmEtZSpvKSpsKSx0Km8rZSphK3IqYyk7a2MrPWwsQ2MrPWwqKHQrKHQ9bykpLHpjKz1sKihlKyhlPWEpKSxxYys9bCoocisocj1jKSksd2UodCxlLHIpfXZhciB0LGUscjtEYy5wb2ludD1mdW5jdGlvbih1LGkpe3UqPUZhO3ZhciBvPU1hdGguY29zKGkqPUZhKTt0PW8qTWF0aC5jb3ModSksZT1vKk1hdGguc2luKHUpLHI9TWF0aC5zaW4oaSksRGMucG9pbnQ9bix3ZSh0LGUscil9fWZ1bmN0aW9uIGtlKCl7RGMucG9pbnQ9X2V9ZnVuY3Rpb24gRWUoKXtmdW5jdGlvbiBuKG4sdCl7bio9RmE7dmFyIGU9TWF0aC5jb3ModCo9RmEpLG89ZSpNYXRoLmNvcyhuKSxhPWUqTWF0aC5zaW4obiksYz1NYXRoLnNpbih0KSxsPXUqYy1pKmEscz1pKm8tcipjLGY9ciphLXUqbyxoPU1hdGguc3FydChsKmwrcypzK2YqZiksZz1yKm8rdSphK2kqYyxwPWgmJi1RKGcpL2gsdj1NYXRoLmF0YW4yKGgsZyk7TGMrPXAqbCxUYys9cCpzLFJjKz1wKmYsa2MrPXYsQ2MrPXYqKHIrKHI9bykpLHpjKz12Kih1Kyh1PWEpKSxxYys9diooaSsoaT1jKSksd2Uocix1LGkpfXZhciB0LGUscix1LGk7RGMucG9pbnQ9ZnVuY3Rpb24obyxhKXt0PW8sZT1hLERjLnBvaW50PW4sbyo9RmE7dmFyIGM9TWF0aC5jb3MoYSo9RmEpO3I9YypNYXRoLmNvcyhvKSx1PWMqTWF0aC5zaW4obyksaT1NYXRoLnNpbihhKSx3ZShyLHUsaSl9LERjLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSksRGMubGluZUVuZD1rZSxEYy5wb2ludD1fZX19ZnVuY3Rpb24gQWUobix0KXtmdW5jdGlvbiBlKGUscil7cmV0dXJuIGU9bihlLHIpLHQoZVswXSxlWzFdKX1yZXR1cm4gbi5pbnZlcnQmJnQuaW52ZXJ0JiYoZS5pbnZlcnQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZT10LmludmVydChlLHIpLGUmJm4uaW52ZXJ0KGVbMF0sZVsxXSl9KSxlfWZ1bmN0aW9uIE5lKCl7cmV0dXJuITB9ZnVuY3Rpb24gQ2Uobix0LGUscix1KXt2YXIgaT1bXSxvPVtdO2lmKG4uZm9yRWFjaChmdW5jdGlvbihuKXtpZighKCh0PW4ubGVuZ3RoLTEpPD0wKSl7dmFyIHQsZT1uWzBdLHI9blt0XTtpZihiZShlLHIpKXt1LmxpbmVTdGFydCgpO2Zvcih2YXIgYT0wO3Q+YTsrK2EpdS5wb2ludCgoZT1uW2FdKVswXSxlWzFdKTtyZXR1cm4gdS5saW5lRW5kKCksdm9pZCAwfXZhciBjPW5ldyBxZShlLG4sbnVsbCwhMCksbD1uZXcgcWUoZSxudWxsLGMsITEpO2Mubz1sLGkucHVzaChjKSxvLnB1c2gobCksYz1uZXcgcWUocixuLG51bGwsITEpLGw9bmV3IHFlKHIsbnVsbCxjLCEwKSxjLm89bCxpLnB1c2goYyksby5wdXNoKGwpfX0pLG8uc29ydCh0KSx6ZShpKSx6ZShvKSxpLmxlbmd0aCl7Zm9yKHZhciBhPTAsYz1lLGw9by5sZW5ndGg7bD5hOysrYSlvW2FdLmU9Yz0hYztmb3IodmFyIHMsZixoPWlbMF07Oyl7Zm9yKHZhciBnPWgscD0hMDtnLnY7KWlmKChnPWcubik9PT1oKXJldHVybjtzPWcueix1LmxpbmVTdGFydCgpO2Rve2lmKGcudj1nLm8udj0hMCxnLmUpe2lmKHApZm9yKHZhciBhPTAsbD1zLmxlbmd0aDtsPmE7KythKXUucG9pbnQoKGY9c1thXSlbMF0sZlsxXSk7ZWxzZSByKGcueCxnLm4ueCwxLHUpO2c9Zy5ufWVsc2V7aWYocCl7cz1nLnAuejtmb3IodmFyIGE9cy5sZW5ndGgtMTthPj0wOy0tYSl1LnBvaW50KChmPXNbYV0pWzBdLGZbMV0pfWVsc2UgcihnLngsZy5wLngsLTEsdSk7Zz1nLnB9Zz1nLm8scz1nLnoscD0hcH13aGlsZSghZy52KTt1LmxpbmVFbmQoKX19fWZ1bmN0aW9uIHplKG4pe2lmKHQ9bi5sZW5ndGgpe2Zvcih2YXIgdCxlLHI9MCx1PW5bMF07KytyPHQ7KXUubj1lPW5bcl0sZS5wPXUsdT1lO3Uubj1lPW5bMF0sZS5wPXV9fWZ1bmN0aW9uIHFlKG4sdCxlLHIpe3RoaXMueD1uLHRoaXMuej10LHRoaXMubz1lLHRoaXMuZT1yLHRoaXMudj0hMSx0aGlzLm49dGhpcy5wPW51bGx9ZnVuY3Rpb24gTGUobix0LGUscil7cmV0dXJuIGZ1bmN0aW9uKHUsaSl7ZnVuY3Rpb24gbyh0LGUpe3ZhciByPXUodCxlKTtuKHQ9clswXSxlPXJbMV0pJiZpLnBvaW50KHQsZSl9ZnVuY3Rpb24gYShuLHQpe3ZhciBlPXUobix0KTtkLnBvaW50KGVbMF0sZVsxXSl9ZnVuY3Rpb24gYygpe3kucG9pbnQ9YSxkLmxpbmVTdGFydCgpfWZ1bmN0aW9uIGwoKXt5LnBvaW50PW8sZC5saW5lRW5kKCl9ZnVuY3Rpb24gcyhuLHQpe3YucHVzaChbbix0XSk7dmFyIGU9dShuLHQpO3gucG9pbnQoZVswXSxlWzFdKX1mdW5jdGlvbiBmKCl7eC5saW5lU3RhcnQoKSx2PVtdfWZ1bmN0aW9uIGgoKXtzKHZbMF1bMF0sdlswXVsxXSkseC5saW5lRW5kKCk7dmFyIG4sdD14LmNsZWFuKCksZT1NLmJ1ZmZlcigpLHI9ZS5sZW5ndGg7aWYodi5wb3AoKSxwLnB1c2godiksdj1udWxsLHIpaWYoMSZ0KXtuPWVbMF07dmFyIHUscj1uLmxlbmd0aC0xLG89LTE7aWYocj4wKXtmb3IoYnx8KGkucG9seWdvblN0YXJ0KCksYj0hMCksaS5saW5lU3RhcnQoKTsrK288cjspaS5wb2ludCgodT1uW29dKVswXSx1WzFdKTtpLmxpbmVFbmQoKX19ZWxzZSByPjEmJjImdCYmZS5wdXNoKGUucG9wKCkuY29uY2F0KGUuc2hpZnQoKSkpLGcucHVzaChlLmZpbHRlcihUZSkpfXZhciBnLHAsdixkPXQoaSksbT11LmludmVydChyWzBdLHJbMV0pLHk9e3BvaW50Om8sbGluZVN0YXJ0OmMsbGluZUVuZDpsLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3kucG9pbnQ9cyx5LmxpbmVTdGFydD1mLHkubGluZUVuZD1oLGc9W10scD1bXX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3kucG9pbnQ9byx5LmxpbmVTdGFydD1jLHkubGluZUVuZD1sLGc9dGEubWVyZ2UoZyk7dmFyIG49RmUobSxwKTtnLmxlbmd0aD8oYnx8KGkucG9seWdvblN0YXJ0KCksYj0hMCksQ2UoZyxEZSxuLGUsaSkpOm4mJihifHwoaS5wb2x5Z29uU3RhcnQoKSxiPSEwKSxpLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCkpLGImJihpLnBvbHlnb25FbmQoKSxiPSExKSxnPXA9bnVsbH0sc3BoZXJlOmZ1bmN0aW9uKCl7aS5wb2x5Z29uU3RhcnQoKSxpLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCksaS5wb2x5Z29uRW5kKCl9fSxNPVJlKCkseD10KE0pLGI9ITE7cmV0dXJuIHl9fWZ1bmN0aW9uIFRlKG4pe3JldHVybiBuLmxlbmd0aD4xfWZ1bmN0aW9uIFJlKCl7dmFyIG4sdD1bXTtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dC5wdXNoKG49W10pfSxwb2ludDpmdW5jdGlvbih0LGUpe24ucHVzaChbdCxlXSl9LGxpbmVFbmQ6eSxidWZmZXI6ZnVuY3Rpb24oKXt2YXIgZT10O3JldHVybiB0PVtdLG49bnVsbCxlfSxyZWpvaW46ZnVuY3Rpb24oKXt0Lmxlbmd0aD4xJiZ0LnB1c2godC5wb3AoKS5jb25jYXQodC5zaGlmdCgpKSl9fX1mdW5jdGlvbiBEZShuLHQpe3JldHVybigobj1uLngpWzBdPDA/blsxXS1qYS1UYTpqYS1uWzFdKS0oKHQ9dC54KVswXTwwP3RbMV0tamEtVGE6amEtdFsxXSl9ZnVuY3Rpb24gUGUobil7dmFyIHQsZT0wLzAscj0wLzAsdT0wLzA7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe24ubGluZVN0YXJ0KCksdD0xfSxwb2ludDpmdW5jdGlvbihpLG8pe3ZhciBhPWk+MD9EYTotRGEsYz12YShpLWUpO3ZhKGMtRGEpPFRhPyhuLnBvaW50KGUscj0ocitvKS8yPjA/amE6LWphKSxuLnBvaW50KHUsciksbi5saW5lRW5kKCksbi5saW5lU3RhcnQoKSxuLnBvaW50KGEsciksbi5wb2ludChpLHIpLHQ9MCk6dSE9PWEmJmM+PURhJiYodmEoZS11KTxUYSYmKGUtPXUqVGEpLHZhKGktYSk8VGEmJihpLT1hKlRhKSxyPVVlKGUscixpLG8pLG4ucG9pbnQodSxyKSxuLmxpbmVFbmQoKSxuLmxpbmVTdGFydCgpLG4ucG9pbnQoYSxyKSx0PTApLG4ucG9pbnQoZT1pLHI9byksdT1hfSxsaW5lRW5kOmZ1bmN0aW9uKCl7bi5saW5lRW5kKCksZT1yPTAvMH0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gMi10fX19ZnVuY3Rpb24gVWUobix0LGUscil7dmFyIHUsaSxvPU1hdGguc2luKG4tZSk7cmV0dXJuIHZhKG8pPlRhP01hdGguYXRhbigoTWF0aC5zaW4odCkqKGk9TWF0aC5jb3MocikpKk1hdGguc2luKGUpLU1hdGguc2luKHIpKih1PU1hdGguY29zKHQpKSpNYXRoLnNpbihuKSkvKHUqaSpvKSk6KHQrcikvMn1mdW5jdGlvbiBqZShuLHQsZSxyKXt2YXIgdTtpZihudWxsPT1uKXU9ZSpqYSxyLnBvaW50KC1EYSx1KSxyLnBvaW50KDAsdSksci5wb2ludChEYSx1KSxyLnBvaW50KERhLDApLHIucG9pbnQoRGEsLXUpLHIucG9pbnQoMCwtdSksci5wb2ludCgtRGEsLXUpLHIucG9pbnQoLURhLDApLHIucG9pbnQoLURhLHUpO2Vsc2UgaWYodmEoblswXS10WzBdKT5UYSl7dmFyIGk9blswXTx0WzBdP0RhOi1EYTt1PWUqaS8yLHIucG9pbnQoLWksdSksci5wb2ludCgwLHUpLHIucG9pbnQoaSx1KX1lbHNlIHIucG9pbnQodFswXSx0WzFdKX1mdW5jdGlvbiBGZShuLHQpe3ZhciBlPW5bMF0scj1uWzFdLHU9W01hdGguc2luKGUpLC1NYXRoLmNvcyhlKSwwXSxpPTAsbz0wO19jLnJlc2V0KCk7Zm9yKHZhciBhPTAsYz10Lmxlbmd0aDtjPmE7KythKXt2YXIgbD10W2FdLHM9bC5sZW5ndGg7aWYocylmb3IodmFyIGY9bFswXSxoPWZbMF0sZz1mWzFdLzIrRGEvNCxwPU1hdGguc2luKGcpLHY9TWF0aC5jb3MoZyksZD0xOzspe2Q9PT1zJiYoZD0wKSxuPWxbZF07dmFyIG09blswXSx5PW5bMV0vMitEYS80LE09TWF0aC5zaW4oeSkseD1NYXRoLmNvcyh5KSxiPW0taCxfPWI+PTA/MTotMSx3PV8qYixTPXc+RGEsaz1wKk07aWYoX2MuYWRkKE1hdGguYXRhbjIoaypfKk1hdGguc2luKHcpLHYqeCtrKk1hdGguY29zKHcpKSksaSs9Uz9iK18qUGE6YixTXmg+PWVebT49ZSl7dmFyIEU9ZGUocGUoZikscGUobikpO01lKEUpO3ZhciBBPWRlKHUsRSk7TWUoQSk7dmFyIE49KFNeYj49MD8tMToxKSpudChBWzJdKTsocj5OfHxyPT09TiYmKEVbMF18fEVbMV0pKSYmKG8rPVNeYj49MD8xOi0xKX1pZighZCsrKWJyZWFrO2g9bSxwPU0sdj14LGY9bn19cmV0dXJuKC1UYT5pfHxUYT5pJiYwPl9jKV4xJm99ZnVuY3Rpb24gSGUobil7ZnVuY3Rpb24gdChuLHQpe3JldHVybiBNYXRoLmNvcyhuKSpNYXRoLmNvcyh0KT5pfWZ1bmN0aW9uIGUobil7dmFyIGUsaSxjLGwscztyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7bD1jPSExLHM9MX0scG9pbnQ6ZnVuY3Rpb24oZixoKXt2YXIgZyxwPVtmLGhdLHY9dChmLGgpLGQ9bz92PzA6dShmLGgpOnY/dShmKygwPmY/RGE6LURhKSxoKTowO2lmKCFlJiYobD1jPXYpJiZuLmxpbmVTdGFydCgpLHYhPT1jJiYoZz1yKGUscCksKGJlKGUsZyl8fGJlKHAsZykpJiYocFswXSs9VGEscFsxXSs9VGEsdj10KHBbMF0scFsxXSkpKSx2IT09YylzPTAsdj8obi5saW5lU3RhcnQoKSxnPXIocCxlKSxuLnBvaW50KGdbMF0sZ1sxXSkpOihnPXIoZSxwKSxuLnBvaW50KGdbMF0sZ1sxXSksbi5saW5lRW5kKCkpLGU9ZztlbHNlIGlmKGEmJmUmJm9edil7dmFyIG07ZCZpfHwhKG09cihwLGUsITApKXx8KHM9MCxvPyhuLmxpbmVTdGFydCgpLG4ucG9pbnQobVswXVswXSxtWzBdWzFdKSxuLnBvaW50KG1bMV1bMF0sbVsxXVsxXSksbi5saW5lRW5kKCkpOihuLnBvaW50KG1bMV1bMF0sbVsxXVsxXSksbi5saW5lRW5kKCksbi5saW5lU3RhcnQoKSxuLnBvaW50KG1bMF1bMF0sbVswXVsxXSkpKX0hdnx8ZSYmYmUoZSxwKXx8bi5wb2ludChwWzBdLHBbMV0pLGU9cCxjPXYsaT1kfSxsaW5lRW5kOmZ1bmN0aW9uKCl7YyYmbi5saW5lRW5kKCksZT1udWxsfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiBzfChsJiZjKTw8MX19fWZ1bmN0aW9uIHIobix0LGUpe3ZhciByPXBlKG4pLHU9cGUodCksbz1bMSwwLDBdLGE9ZGUocix1KSxjPXZlKGEsYSksbD1hWzBdLHM9Yy1sKmw7aWYoIXMpcmV0dXJuIWUmJm47dmFyIGY9aSpjL3MsaD0taSpsL3MsZz1kZShvLGEpLHA9eWUobyxmKSx2PXllKGEsaCk7bWUocCx2KTt2YXIgZD1nLG09dmUocCxkKSx5PXZlKGQsZCksTT1tKm0teSoodmUocCxwKS0xKTtpZighKDA+TSkpe3ZhciB4PU1hdGguc3FydChNKSxiPXllKGQsKC1tLXgpL3kpO2lmKG1lKGIscCksYj14ZShiKSwhZSlyZXR1cm4gYjt2YXIgXyx3PW5bMF0sUz10WzBdLGs9blsxXSxFPXRbMV07dz5TJiYoXz13LHc9UyxTPV8pO3ZhciBBPVMtdyxOPXZhKEEtRGEpPFRhLEM9Tnx8VGE+QTtpZighTiYmaz5FJiYoXz1rLGs9RSxFPV8pLEM/Tj9rK0U+MF5iWzFdPCh2YShiWzBdLXcpPFRhP2s6RSk6azw9YlsxXSYmYlsxXTw9RTpBPkRhXih3PD1iWzBdJiZiWzBdPD1TKSl7dmFyIHo9eWUoZCwoLW0reCkveSk7cmV0dXJuIG1lKHoscCksW2IseGUoeildfX19ZnVuY3Rpb24gdSh0LGUpe3ZhciByPW8/bjpEYS1uLHU9MDtyZXR1cm4tcj50P3V8PTE6dD5yJiYodXw9MiksLXI+ZT91fD00OmU+ciYmKHV8PTgpLHV9dmFyIGk9TWF0aC5jb3Mobiksbz1pPjAsYT12YShpKT5UYSxjPWdyKG4sNipGYSk7cmV0dXJuIExlKHQsZSxjLG8/WzAsLW5dOlstRGEsbi1EYV0pfWZ1bmN0aW9uIE9lKG4sdCxlLHIpe3JldHVybiBmdW5jdGlvbih1KXt2YXIgaSxvPXUuYSxhPXUuYixjPW8ueCxsPW8ueSxzPWEueCxmPWEueSxoPTAsZz0xLHA9cy1jLHY9Zi1sO2lmKGk9bi1jLHB8fCEoaT4wKSl7aWYoaS89cCwwPnApe2lmKGg+aSlyZXR1cm47Zz5pJiYoZz1pKX1lbHNlIGlmKHA+MCl7aWYoaT5nKXJldHVybjtpPmgmJihoPWkpfWlmKGk9ZS1jLHB8fCEoMD5pKSl7aWYoaS89cCwwPnApe2lmKGk+ZylyZXR1cm47aT5oJiYoaD1pKX1lbHNlIGlmKHA+MCl7aWYoaD5pKXJldHVybjtnPmkmJihnPWkpfWlmKGk9dC1sLHZ8fCEoaT4wKSl7aWYoaS89diwwPnYpe2lmKGg+aSlyZXR1cm47Zz5pJiYoZz1pKX1lbHNlIGlmKHY+MCl7aWYoaT5nKXJldHVybjtpPmgmJihoPWkpfWlmKGk9ci1sLHZ8fCEoMD5pKSl7aWYoaS89diwwPnYpe2lmKGk+ZylyZXR1cm47aT5oJiYoaD1pKX1lbHNlIGlmKHY+MCl7aWYoaD5pKXJldHVybjtnPmkmJihnPWkpfXJldHVybiBoPjAmJih1LmE9e3g6YytoKnAseTpsK2gqdn0pLDE+ZyYmKHUuYj17eDpjK2cqcCx5OmwrZyp2fSksdX19fX19fWZ1bmN0aW9uIFllKG4sdCxlLHIpe2Z1bmN0aW9uIHUocix1KXtyZXR1cm4gdmEoclswXS1uKTxUYT91PjA/MDozOnZhKHJbMF0tZSk8VGE/dT4wPzI6MTp2YShyWzFdLXQpPFRhP3U+MD8xOjA6dT4wPzM6Mn1mdW5jdGlvbiBpKG4sdCl7cmV0dXJuIG8obi54LHQueCl9ZnVuY3Rpb24gbyhuLHQpe3ZhciBlPXUobiwxKSxyPXUodCwxKTtyZXR1cm4gZSE9PXI/ZS1yOjA9PT1lP3RbMV0tblsxXToxPT09ZT9uWzBdLXRbMF06Mj09PWU/blsxXS10WzFdOnRbMF0tblswXX1yZXR1cm4gZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhuKXtmb3IodmFyIHQ9MCxlPWQubGVuZ3RoLHI9blsxXSx1PTA7ZT51OysrdSlmb3IodmFyIGksbz0xLGE9ZFt1XSxjPWEubGVuZ3RoLGw9YVswXTtjPm87KytvKWk9YVtvXSxsWzFdPD1yP2lbMV0+ciYmSyhsLGksbik+MCYmKyt0OmlbMV08PXImJksobCxpLG4pPDAmJi0tdCxsPWk7cmV0dXJuIDAhPT10fWZ1bmN0aW9uIGwoaSxhLGMsbCl7dmFyIHM9MCxmPTA7aWYobnVsbD09aXx8KHM9dShpLGMpKSE9PShmPXUoYSxjKSl8fG8oaSxhKTwwXmM+MCl7ZG8gbC5wb2ludCgwPT09c3x8Mz09PXM/bjplLHM+MT9yOnQpO3doaWxlKChzPShzK2MrNCklNCkhPT1mKX1lbHNlIGwucG9pbnQoYVswXSxhWzFdKX1mdW5jdGlvbiBzKHUsaSl7cmV0dXJuIHU+PW4mJmU+PXUmJmk+PXQmJnI+PWl9ZnVuY3Rpb24gZihuLHQpe3Mobix0KSYmYS5wb2ludChuLHQpfWZ1bmN0aW9uIGgoKXtDLnBvaW50PXAsZCYmZC5wdXNoKG09W10pLFM9ITAsdz0hMSxiPV89MC8wfWZ1bmN0aW9uIGcoKXt2JiYocCh5LE0pLHgmJncmJkEucmVqb2luKCksdi5wdXNoKEEuYnVmZmVyKCkpKSxDLnBvaW50PWYsdyYmYS5saW5lRW5kKCl9ZnVuY3Rpb24gcChuLHQpe249TWF0aC5tYXgoLVVjLE1hdGgubWluKFVjLG4pKSx0PU1hdGgubWF4KC1VYyxNYXRoLm1pbihVYyx0KSk7dmFyIGU9cyhuLHQpO2lmKGQmJm0ucHVzaChbbix0XSksUyl5PW4sTT10LHg9ZSxTPSExLGUmJihhLmxpbmVTdGFydCgpLGEucG9pbnQobix0KSk7ZWxzZSBpZihlJiZ3KWEucG9pbnQobix0KTtlbHNle3ZhciByPXthOnt4OmIseTpffSxiOnt4Om4seTp0fX07TihyKT8od3x8KGEubGluZVN0YXJ0KCksYS5wb2ludChyLmEueCxyLmEueSkpLGEucG9pbnQoci5iLngsci5iLnkpLGV8fGEubGluZUVuZCgpLGs9ITEpOmUmJihhLmxpbmVTdGFydCgpLGEucG9pbnQobix0KSxrPSExKX1iPW4sXz10LHc9ZX12YXIgdixkLG0seSxNLHgsYixfLHcsUyxrLEU9YSxBPVJlKCksTj1PZShuLHQsZSxyKSxDPXtwb2ludDpmLGxpbmVTdGFydDpoLGxpbmVFbmQ6Zyxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXthPUEsdj1bXSxkPVtdLGs9ITB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXthPUUsdj10YS5tZXJnZSh2KTt2YXIgdD1jKFtuLHJdKSxlPWsmJnQsdT12Lmxlbmd0aDsoZXx8dSkmJihhLnBvbHlnb25TdGFydCgpLGUmJihhLmxpbmVTdGFydCgpLGwobnVsbCxudWxsLDEsYSksYS5saW5lRW5kKCkpLHUmJkNlKHYsaSx0LGwsYSksYS5wb2x5Z29uRW5kKCkpLHY9ZD1tPW51bGx9fTtyZXR1cm4gQ319ZnVuY3Rpb24gSWUobil7dmFyIHQ9MCxlPURhLzMscj1pcihuKSx1PXIodCxlKTtyZXR1cm4gdS5wYXJhbGxlbHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/cih0PW5bMF0qRGEvMTgwLGU9blsxXSpEYS8xODApOlsxODAqKHQvRGEpLDE4MCooZS9EYSldfSx1fWZ1bmN0aW9uIFplKG4sdCl7ZnVuY3Rpb24gZShuLHQpe3ZhciBlPU1hdGguc3FydChpLTIqdSpNYXRoLnNpbih0KSkvdTtyZXR1cm5bZSpNYXRoLnNpbihuKj11KSxvLWUqTWF0aC5jb3MobildfXZhciByPU1hdGguc2luKG4pLHU9KHIrTWF0aC5zaW4odCkpLzIsaT0xK3IqKDIqdS1yKSxvPU1hdGguc3FydChpKS91O3JldHVybiBlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPW8tdDtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL3UsbnQoKGktKG4qbitlKmUpKnUqdSkvKDIqdSkpXX0sZX1mdW5jdGlvbiBWZSgpe2Z1bmN0aW9uIG4obix0KXtGYys9dSpuLXIqdCxyPW4sdT10fXZhciB0LGUscix1O1pjLnBvaW50PWZ1bmN0aW9uKGksbyl7WmMucG9pbnQ9bix0PXI9aSxlPXU9b30sWmMubGluZUVuZD1mdW5jdGlvbigpe24odCxlKX19ZnVuY3Rpb24gWGUobix0KXtIYz5uJiYoSGM9biksbj5ZYyYmKFljPW4pLE9jPnQmJihPYz10KSx0PkljJiYoSWM9dCl9ZnVuY3Rpb24gJGUoKXtmdW5jdGlvbiBuKG4sdCl7by5wdXNoKCJNIixuLCIsIix0LGkpfWZ1bmN0aW9uIHQobix0KXtvLnB1c2goIk0iLG4sIiwiLHQpLGEucG9pbnQ9ZX1mdW5jdGlvbiBlKG4sdCl7by5wdXNoKCJMIixuLCIsIix0KX1mdW5jdGlvbiByKCl7YS5wb2ludD1ufWZ1bmN0aW9uIHUoKXtvLnB1c2goIloiKX12YXIgaT1CZSg0LjUpLG89W10sYT17cG9pbnQ6bixsaW5lU3RhcnQ6ZnVuY3Rpb24oKXthLnBvaW50PXR9LGxpbmVFbmQ6cixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXthLmxpbmVFbmQ9dX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2EubGluZUVuZD1yLGEucG9pbnQ9bn0scG9pbnRSYWRpdXM6ZnVuY3Rpb24obil7cmV0dXJuIGk9QmUobiksYX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYoby5sZW5ndGgpe3ZhciBuPW8uam9pbigiIik7cmV0dXJuIG89W10sbn19fTtyZXR1cm4gYX1mdW5jdGlvbiBCZShuKXtyZXR1cm4ibTAsIituKyJhIituKyIsIituKyIgMCAxLDEgMCwiKy0yKm4rImEiK24rIiwiK24rIiAwIDEsMSAwLCIrMipuKyJ6In1mdW5jdGlvbiBXZShuLHQpe0VjKz1uLEFjKz10LCsrTmN9ZnVuY3Rpb24gSmUoKXtmdW5jdGlvbiBuKG4scil7dmFyIHU9bi10LGk9ci1lLG89TWF0aC5zcXJ0KHUqdStpKmkpO0NjKz1vKih0K24pLzIsemMrPW8qKGUrcikvMixxYys9byxXZSh0PW4sZT1yKX12YXIgdCxlO1hjLnBvaW50PWZ1bmN0aW9uKHIsdSl7WGMucG9pbnQ9bixXZSh0PXIsZT11KX19ZnVuY3Rpb24gR2UoKXtYYy5wb2ludD1XZX1mdW5jdGlvbiBLZSgpe2Z1bmN0aW9uIG4obix0KXt2YXIgZT1uLXIsaT10LXUsbz1NYXRoLnNxcnQoZSplK2kqaSk7Q2MrPW8qKHIrbikvMix6Yys9byoodSt0KS8yLHFjKz1vLG89dSpuLXIqdCxMYys9byoocituKSxUYys9byoodSt0KSxSYys9MypvLFdlKHI9bix1PXQpfXZhciB0LGUscix1O1hjLnBvaW50PWZ1bmN0aW9uKGksbyl7WGMucG9pbnQ9bixXZSh0PXI9aSxlPXU9byl9LFhjLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSl9fWZ1bmN0aW9uIFFlKG4pe2Z1bmN0aW9uIHQodCxlKXtuLm1vdmVUbyh0K28sZSksbi5hcmModCxlLG8sMCxQYSl9ZnVuY3Rpb24gZSh0LGUpe24ubW92ZVRvKHQsZSksYS5wb2ludD1yfWZ1bmN0aW9uIHIodCxlKXtuLmxpbmVUbyh0LGUpfWZ1bmN0aW9uIHUoKXthLnBvaW50PXR9ZnVuY3Rpb24gaSgpe24uY2xvc2VQYXRoKCl9dmFyIG89NC41LGE9e3BvaW50OnQsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7YS5wb2ludD1lfSxsaW5lRW5kOnUscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7YS5saW5lRW5kPWl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXthLmxpbmVFbmQ9dSxhLnBvaW50PXR9LHBvaW50UmFkaXVzOmZ1bmN0aW9uKG4pe3JldHVybiBvPW4sYX0scmVzdWx0Onl9O3JldHVybiBhfWZ1bmN0aW9uIG5yKG4pe2Z1bmN0aW9uIHQobil7cmV0dXJuKGE/cjplKShuKX1mdW5jdGlvbiBlKHQpe3JldHVybiBycih0LGZ1bmN0aW9uKGUscil7ZT1uKGUsciksdC5wb2ludChlWzBdLGVbMV0pfSl9ZnVuY3Rpb24gcih0KXtmdW5jdGlvbiBlKGUscil7ZT1uKGUsciksdC5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIHIoKXtNPTAvMCxTLnBvaW50PWksdC5saW5lU3RhcnQoKX1mdW5jdGlvbiBpKGUscil7dmFyIGk9cGUoW2Uscl0pLG89bihlLHIpO3UoTSx4LHksYixfLHcsTT1vWzBdLHg9b1sxXSx5PWUsYj1pWzBdLF89aVsxXSx3PWlbMl0sYSx0KSx0LnBvaW50KE0seCl9ZnVuY3Rpb24gbygpe1MucG9pbnQ9ZSx0LmxpbmVFbmQoKX1mdW5jdGlvbiBjKCl7cigpLFMucG9pbnQ9bCxTLmxpbmVFbmQ9c31mdW5jdGlvbiBsKG4sdCl7aShmPW4saD10KSxnPU0scD14LHY9YixkPV8sbT13LFMucG9pbnQ9aX1mdW5jdGlvbiBzKCl7dShNLHgseSxiLF8sdyxnLHAsZix2LGQsbSxhLHQpLFMubGluZUVuZD1vLG8oKX12YXIgZixoLGcscCx2LGQsbSx5LE0seCxiLF8sdyxTPXtwb2ludDplLGxpbmVTdGFydDpyLGxpbmVFbmQ6byxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0LnBvbHlnb25TdGFydCgpLFMubGluZVN0YXJ0PWN9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0LnBvbHlnb25FbmQoKSxTLmxpbmVTdGFydD1yfX07cmV0dXJuIFN9ZnVuY3Rpb24gdSh0LGUscixhLGMsbCxzLGYsaCxnLHAsdixkLG0pe3ZhciB5PXMtdCxNPWYtZSx4PXkqeStNKk07aWYoeD40KmkmJmQtLSl7dmFyIGI9YStnLF89YytwLHc9bCt2LFM9TWF0aC5zcXJ0KGIqYitfKl8rdyp3KSxrPU1hdGguYXNpbih3Lz1TKSxFPXZhKHZhKHcpLTEpPFRhfHx2YShyLWgpPFRhPyhyK2gpLzI6TWF0aC5hdGFuMihfLGIpLEE9bihFLGspLE49QVswXSxDPUFbMV0sej1OLXQscT1DLWUsTD1NKnoteSpxOwooTCpML3g+aXx8dmEoKHkqeitNKnEpL3gtLjUpPi4zfHxvPmEqZytjKnArbCp2KSYmKHUodCxlLHIsYSxjLGwsTixDLEUsYi89UyxfLz1TLHcsZCxtKSxtLnBvaW50KE4sQyksdShOLEMsRSxiLF8sdyxzLGYsaCxnLHAsdixkLG0pKX19dmFyIGk9LjUsbz1NYXRoLmNvcygzMCpGYSksYT0xNjtyZXR1cm4gdC5wcmVjaXNpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9KGk9bipuKT4wJiYxNix0KTpNYXRoLnNxcnQoaSl9LHR9ZnVuY3Rpb24gdHIobil7dmFyIHQ9bnIoZnVuY3Rpb24odCxlKXtyZXR1cm4gbihbdCpIYSxlKkhhXSl9KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG9yKHQobikpfX1mdW5jdGlvbiBlcihuKXt0aGlzLnN0cmVhbT1ufWZ1bmN0aW9uIHJyKG4sdCl7cmV0dXJue3BvaW50OnQsc3BoZXJlOmZ1bmN0aW9uKCl7bi5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7bi5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe24ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtuLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7bi5wb2x5Z29uRW5kKCl9fX1mdW5jdGlvbiB1cihuKXtyZXR1cm4gaXIoZnVuY3Rpb24oKXtyZXR1cm4gbn0pKCl9ZnVuY3Rpb24gaXIobil7ZnVuY3Rpb24gdChuKXtyZXR1cm4gbj1hKG5bMF0qRmEsblsxXSpGYSksW25bMF0qaCtjLGwtblsxXSpoXX1mdW5jdGlvbiBlKG4pe3JldHVybiBuPWEuaW52ZXJ0KChuWzBdLWMpL2gsKGwtblsxXSkvaCksbiYmW25bMF0qSGEsblsxXSpIYV19ZnVuY3Rpb24gcigpe2E9QWUobz1scihtLHksTSksaSk7dmFyIG49aSh2LGQpO3JldHVybiBjPWctblswXSpoLGw9cCtuWzFdKmgsdSgpfWZ1bmN0aW9uIHUoKXtyZXR1cm4gcyYmKHMudmFsaWQ9ITEscz1udWxsKSx0fXZhciBpLG8sYSxjLGwscyxmPW5yKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49aShuLHQpLFtuWzBdKmgrYyxsLW5bMV0qaF19KSxoPTE1MCxnPTQ4MCxwPTI1MCx2PTAsZD0wLG09MCx5PTAsTT0wLHg9UGMsYj1FdCxfPW51bGwsdz1udWxsO3JldHVybiB0LnN0cmVhbT1mdW5jdGlvbihuKXtyZXR1cm4gcyYmKHMudmFsaWQ9ITEpLHM9b3IoeChvLGYoYihuKSkpKSxzLnZhbGlkPSEwLHN9LHQuY2xpcEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PW51bGw9PW4/KF89bixQYyk6SGUoKF89K24pKkZhKSx1KCkpOl99LHQuY2xpcEV4dGVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odz1uLGI9bj9ZZShuWzBdWzBdLG5bMF1bMV0sblsxXVswXSxuWzFdWzFdKTpFdCx1KCkpOnd9LHQuc2NhbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9K24scigpKTpofSx0LnRyYW5zbGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz0rblswXSxwPStuWzFdLHIoKSk6W2cscF19LHQuY2VudGVyPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh2PW5bMF0lMzYwKkZhLGQ9blsxXSUzNjAqRmEscigpKTpbdipIYSxkKkhhXX0sdC5yb3RhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG09blswXSUzNjAqRmEseT1uWzFdJTM2MCpGYSxNPW4ubGVuZ3RoPjI/blsyXSUzNjAqRmE6MCxyKCkpOlttKkhhLHkqSGEsTSpIYV19LHRhLnJlYmluZCh0LGYsInByZWNpc2lvbiIpLGZ1bmN0aW9uKCl7cmV0dXJuIGk9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdC5pbnZlcnQ9aS5pbnZlcnQmJmUscigpfX1mdW5jdGlvbiBvcihuKXtyZXR1cm4gcnIobixmdW5jdGlvbih0LGUpe24ucG9pbnQodCpGYSxlKkZhKX0pfWZ1bmN0aW9uIGFyKG4sdCl7cmV0dXJuW24sdF19ZnVuY3Rpb24gY3Iobix0KXtyZXR1cm5bbj5EYT9uLVBhOi1EYT5uP24rUGE6bix0XX1mdW5jdGlvbiBscihuLHQsZSl7cmV0dXJuIG4/dHx8ZT9BZShmcihuKSxocih0LGUpKTpmcihuKTp0fHxlP2hyKHQsZSk6Y3J9ZnVuY3Rpb24gc3Iobil7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrPW4sW3Q+RGE/dC1QYTotRGE+dD90K1BhOnQsZV19fWZ1bmN0aW9uIGZyKG4pe3ZhciB0PXNyKG4pO3JldHVybiB0LmludmVydD1zcigtbiksdH1mdW5jdGlvbiBocihuLHQpe2Z1bmN0aW9uIGUobix0KXt2YXIgZT1NYXRoLmNvcyh0KSxhPU1hdGguY29zKG4pKmUsYz1NYXRoLnNpbihuKSplLGw9TWF0aC5zaW4odCkscz1sKnIrYSp1O3JldHVybltNYXRoLmF0YW4yKGMqaS1zKm8sYSpyLWwqdSksbnQocyppK2MqbyldfXZhciByPU1hdGguY29zKG4pLHU9TWF0aC5zaW4obiksaT1NYXRoLmNvcyh0KSxvPU1hdGguc2luKHQpO3JldHVybiBlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPU1hdGguY29zKHQpLGE9TWF0aC5jb3MobikqZSxjPU1hdGguc2luKG4pKmUsbD1NYXRoLnNpbih0KSxzPWwqaS1jKm87cmV0dXJuW01hdGguYXRhbjIoYyppK2wqbyxhKnIrcyp1KSxudChzKnItYSp1KV19LGV9ZnVuY3Rpb24gZ3Iobix0KXt2YXIgZT1NYXRoLmNvcyhuKSxyPU1hdGguc2luKG4pO3JldHVybiBmdW5jdGlvbih1LGksbyxhKXt2YXIgYz1vKnQ7bnVsbCE9dT8odT1wcihlLHUpLGk9cHIoZSxpKSwobz4wP2k+dTp1PmkpJiYodSs9bypQYSkpOih1PW4rbypQYSxpPW4tLjUqYyk7Zm9yKHZhciBsLHM9dTtvPjA/cz5pOmk+cztzLT1jKWEucG9pbnQoKGw9eGUoW2UsLXIqTWF0aC5jb3MocyksLXIqTWF0aC5zaW4ocyldKSlbMF0sbFsxXSl9fWZ1bmN0aW9uIHByKG4sdCl7dmFyIGU9cGUodCk7ZVswXS09bixNZShlKTt2YXIgcj1RKC1lWzFdKTtyZXR1cm4oKC1lWzJdPDA/LXI6cikrMipNYXRoLlBJLVRhKSUoMipNYXRoLlBJKX1mdW5jdGlvbiB2cihuLHQsZSl7dmFyIHI9dGEucmFuZ2Uobix0LVRhLGUpLmNvbmNhdCh0KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKHQpe3JldHVybltuLHRdfSl9fWZ1bmN0aW9uIGRyKG4sdCxlKXt2YXIgcj10YS5yYW5nZShuLHQtVGEsZSkuY29uY2F0KHQpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gci5tYXAoZnVuY3Rpb24odCl7cmV0dXJuW3Qsbl19KX19ZnVuY3Rpb24gbXIobil7cmV0dXJuIG4uc291cmNlfWZ1bmN0aW9uIHlyKG4pe3JldHVybiBuLnRhcmdldH1mdW5jdGlvbiBNcihuLHQsZSxyKXt2YXIgdT1NYXRoLmNvcyh0KSxpPU1hdGguc2luKHQpLG89TWF0aC5jb3MociksYT1NYXRoLnNpbihyKSxjPXUqTWF0aC5jb3MobiksbD11Kk1hdGguc2luKG4pLHM9bypNYXRoLmNvcyhlKSxmPW8qTWF0aC5zaW4oZSksaD0yKk1hdGguYXNpbihNYXRoLnNxcnQodXQoci10KSt1Km8qdXQoZS1uKSkpLGc9MS9NYXRoLnNpbihoKSxwPWg/ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zaW4obio9aCkqZyxlPU1hdGguc2luKGgtbikqZyxyPWUqYyt0KnMsdT1lKmwrdCpmLG89ZSppK3QqYTtyZXR1cm5bTWF0aC5hdGFuMih1LHIpKkhhLE1hdGguYXRhbjIobyxNYXRoLnNxcnQocipyK3UqdSkpKkhhXX06ZnVuY3Rpb24oKXtyZXR1cm5bbipIYSx0KkhhXX07cmV0dXJuIHAuZGlzdGFuY2U9aCxwfWZ1bmN0aW9uIHhyKCl7ZnVuY3Rpb24gbihuLHUpe3ZhciBpPU1hdGguc2luKHUqPUZhKSxvPU1hdGguY29zKHUpLGE9dmEoKG4qPUZhKS10KSxjPU1hdGguY29zKGEpOyRjKz1NYXRoLmF0YW4yKE1hdGguc3FydCgoYT1vKk1hdGguc2luKGEpKSphKyhhPXIqaS1lKm8qYykqYSksZSppK3IqbypjKSx0PW4sZT1pLHI9b312YXIgdCxlLHI7QmMucG9pbnQ9ZnVuY3Rpb24odSxpKXt0PXUqRmEsZT1NYXRoLnNpbihpKj1GYSkscj1NYXRoLmNvcyhpKSxCYy5wb2ludD1ufSxCYy5saW5lRW5kPWZ1bmN0aW9uKCl7QmMucG9pbnQ9QmMubGluZUVuZD15fX1mdW5jdGlvbiBicihuLHQpe2Z1bmN0aW9uIGUodCxlKXt2YXIgcj1NYXRoLmNvcyh0KSx1PU1hdGguY29zKGUpLGk9bihyKnUpO3JldHVybltpKnUqTWF0aC5zaW4odCksaSpNYXRoLnNpbihlKV19cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKG4sZSl7dmFyIHI9TWF0aC5zcXJ0KG4qbitlKmUpLHU9dChyKSxpPU1hdGguc2luKHUpLG89TWF0aC5jb3ModSk7cmV0dXJuW01hdGguYXRhbjIobippLHIqbyksTWF0aC5hc2luKHImJmUqaS9yKV19LGV9ZnVuY3Rpb24gX3Iobix0KXtmdW5jdGlvbiBlKG4sdCl7bz4wPy1qYStUYT50JiYodD0tamErVGEpOnQ+amEtVGEmJih0PWphLVRhKTt2YXIgZT1vL01hdGgucG93KHUodCksaSk7cmV0dXJuW2UqTWF0aC5zaW4oaSpuKSxvLWUqTWF0aC5jb3MoaSpuKV19dmFyIHI9TWF0aC5jb3MobiksdT1mdW5jdGlvbihuKXtyZXR1cm4gTWF0aC50YW4oRGEvNCtuLzIpfSxpPW49PT10P01hdGguc2luKG4pOk1hdGgubG9nKHIvTWF0aC5jb3ModCkpL01hdGgubG9nKHUodCkvdShuKSksbz1yKk1hdGgucG93KHUobiksaSkvaTtyZXR1cm4gaT8oZS5pbnZlcnQ9ZnVuY3Rpb24obix0KXt2YXIgZT1vLXQscj1HKGkpKk1hdGguc3FydChuKm4rZSplKTtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL2ksMipNYXRoLmF0YW4oTWF0aC5wb3coby9yLDEvaSkpLWphXX0sZSk6U3J9ZnVuY3Rpb24gd3Iobix0KXtmdW5jdGlvbiBlKG4sdCl7dmFyIGU9aS10O3JldHVybltlKk1hdGguc2luKHUqbiksaS1lKk1hdGguY29zKHUqbildfXZhciByPU1hdGguY29zKG4pLHU9bj09PXQ/TWF0aC5zaW4obik6KHItTWF0aC5jb3ModCkpLyh0LW4pLGk9ci91K247cmV0dXJuIHZhKHUpPFRhP2FyOihlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPWktdDtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL3UsaS1HKHUpKk1hdGguc3FydChuKm4rZSplKV19LGUpfWZ1bmN0aW9uIFNyKG4sdCl7cmV0dXJuW24sTWF0aC5sb2coTWF0aC50YW4oRGEvNCt0LzIpKV19ZnVuY3Rpb24ga3Iobil7dmFyIHQsZT11cihuKSxyPWUuc2NhbGUsdT1lLnRyYW5zbGF0ZSxpPWUuY2xpcEV4dGVudDtyZXR1cm4gZS5zY2FsZT1mdW5jdGlvbigpe3ZhciBuPXIuYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybiBuPT09ZT90P2UuY2xpcEV4dGVudChudWxsKTplOm59LGUudHJhbnNsYXRlPWZ1bmN0aW9uKCl7dmFyIG49dS5hcHBseShlLGFyZ3VtZW50cyk7cmV0dXJuIG49PT1lP3Q/ZS5jbGlwRXh0ZW50KG51bGwpOmU6bn0sZS5jbGlwRXh0ZW50PWZ1bmN0aW9uKG4pe3ZhciBvPWkuYXBwbHkoZSxhcmd1bWVudHMpO2lmKG89PT1lKXtpZih0PW51bGw9PW4pe3ZhciBhPURhKnIoKSxjPXUoKTtpKFtbY1swXS1hLGNbMV0tYV0sW2NbMF0rYSxjWzFdK2FdXSl9fWVsc2UgdCYmKG89bnVsbCk7cmV0dXJuIG99LGUuY2xpcEV4dGVudChudWxsKX1mdW5jdGlvbiBFcihuLHQpe3JldHVybltNYXRoLmxvZyhNYXRoLnRhbihEYS80K3QvMikpLC1uXX1mdW5jdGlvbiBBcihuKXtyZXR1cm4gblswXX1mdW5jdGlvbiBOcihuKXtyZXR1cm4gblsxXX1mdW5jdGlvbiBDcihuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT1bMCwxXSxyPTIsdT0yO3Q+dTt1Kyspe2Zvcig7cj4xJiZLKG5bZVtyLTJdXSxuW2Vbci0xXV0sblt1XSk8PTA7KS0tcjtlW3IrK109dX1yZXR1cm4gZS5zbGljZSgwLHIpfWZ1bmN0aW9uIHpyKG4sdCl7cmV0dXJuIG5bMF0tdFswXXx8blsxXS10WzFdfWZ1bmN0aW9uIHFyKG4sdCxlKXtyZXR1cm4oZVswXS10WzBdKSooblsxXS10WzFdKTwoZVsxXS10WzFdKSooblswXS10WzBdKX1mdW5jdGlvbiBMcihuLHQsZSxyKXt2YXIgdT1uWzBdLGk9ZVswXSxvPXRbMF0tdSxhPXJbMF0taSxjPW5bMV0sbD1lWzFdLHM9dFsxXS1jLGY9clsxXS1sLGg9KGEqKGMtbCktZioodS1pKSkvKGYqby1hKnMpO3JldHVyblt1K2gqbyxjK2gqc119ZnVuY3Rpb24gVHIobil7dmFyIHQ9blswXSxlPW5bbi5sZW5ndGgtMV07cmV0dXJuISh0WzBdLWVbMF18fHRbMV0tZVsxXSl9ZnVuY3Rpb24gUnIoKXt0dSh0aGlzKSx0aGlzLmVkZ2U9dGhpcy5zaXRlPXRoaXMuY2lyY2xlPW51bGx9ZnVuY3Rpb24gRHIobil7dmFyIHQ9b2wucG9wKCl8fG5ldyBScjtyZXR1cm4gdC5zaXRlPW4sdH1mdW5jdGlvbiBQcihuKXtYcihuKSxybC5yZW1vdmUobiksb2wucHVzaChuKSx0dShuKX1mdW5jdGlvbiBVcihuKXt2YXIgdD1uLmNpcmNsZSxlPXQueCxyPXQuY3ksdT17eDplLHk6cn0saT1uLlAsbz1uLk4sYT1bbl07UHIobik7Zm9yKHZhciBjPWk7Yy5jaXJjbGUmJnZhKGUtYy5jaXJjbGUueCk8VGEmJnZhKHItYy5jaXJjbGUuY3kpPFRhOylpPWMuUCxhLnVuc2hpZnQoYyksUHIoYyksYz1pO2EudW5zaGlmdChjKSxYcihjKTtmb3IodmFyIGw9bztsLmNpcmNsZSYmdmEoZS1sLmNpcmNsZS54KTxUYSYmdmEoci1sLmNpcmNsZS5jeSk8VGE7KW89bC5OLGEucHVzaChsKSxQcihsKSxsPW87YS5wdXNoKGwpLFhyKGwpO3ZhciBzLGY9YS5sZW5ndGg7Zm9yKHM9MTtmPnM7KytzKWw9YVtzXSxjPWFbcy0xXSxLcihsLmVkZ2UsYy5zaXRlLGwuc2l0ZSx1KTtjPWFbMF0sbD1hW2YtMV0sbC5lZGdlPUpyKGMuc2l0ZSxsLnNpdGUsbnVsbCx1KSxWcihjKSxWcihsKX1mdW5jdGlvbiBqcihuKXtmb3IodmFyIHQsZSxyLHUsaT1uLngsbz1uLnksYT1ybC5fO2E7KWlmKHI9RnIoYSxvKS1pLHI+VGEpYT1hLkw7ZWxzZXtpZih1PWktSHIoYSxvKSwhKHU+VGEpKXtyPi1UYT8odD1hLlAsZT1hKTp1Pi1UYT8odD1hLGU9YS5OKTp0PWU9YTticmVha31pZighYS5SKXt0PWE7YnJlYWt9YT1hLlJ9dmFyIGM9RHIobik7aWYocmwuaW5zZXJ0KHQsYyksdHx8ZSl7aWYodD09PWUpcmV0dXJuIFhyKHQpLGU9RHIodC5zaXRlKSxybC5pbnNlcnQoYyxlKSxjLmVkZ2U9ZS5lZGdlPUpyKHQuc2l0ZSxjLnNpdGUpLFZyKHQpLFZyKGUpLHZvaWQgMDtpZighZSlyZXR1cm4gYy5lZGdlPUpyKHQuc2l0ZSxjLnNpdGUpLHZvaWQgMDtYcih0KSxYcihlKTt2YXIgbD10LnNpdGUscz1sLngsZj1sLnksaD1uLngtcyxnPW4ueS1mLHA9ZS5zaXRlLHY9cC54LXMsZD1wLnktZixtPTIqKGgqZC1nKnYpLHk9aCpoK2cqZyxNPXYqditkKmQseD17eDooZCp5LWcqTSkvbStzLHk6KGgqTS12KnkpL20rZn07S3IoZS5lZGdlLGwscCx4KSxjLmVkZ2U9SnIobCxuLG51bGwseCksZS5lZGdlPUpyKG4scCxudWxsLHgpLFZyKHQpLFZyKGUpfX1mdW5jdGlvbiBGcihuLHQpe3ZhciBlPW4uc2l0ZSxyPWUueCx1PWUueSxpPXUtdDtpZighaSlyZXR1cm4gcjt2YXIgbz1uLlA7aWYoIW8pcmV0dXJuLTEvMDtlPW8uc2l0ZTt2YXIgYT1lLngsYz1lLnksbD1jLXQ7aWYoIWwpcmV0dXJuIGE7dmFyIHM9YS1yLGY9MS9pLTEvbCxoPXMvbDtyZXR1cm4gZj8oLWgrTWF0aC5zcXJ0KGgqaC0yKmYqKHMqcy8oLTIqbCktYytsLzIrdS1pLzIpKSkvZityOihyK2EpLzJ9ZnVuY3Rpb24gSHIobix0KXt2YXIgZT1uLk47aWYoZSlyZXR1cm4gRnIoZSx0KTt2YXIgcj1uLnNpdGU7cmV0dXJuIHIueT09PXQ/ci54OjEvMH1mdW5jdGlvbiBPcihuKXt0aGlzLnNpdGU9bix0aGlzLmVkZ2VzPVtdfWZ1bmN0aW9uIFlyKG4pe2Zvcih2YXIgdCxlLHIsdSxpLG8sYSxjLGwscyxmPW5bMF1bMF0saD1uWzFdWzBdLGc9blswXVsxXSxwPW5bMV1bMV0sdj1lbCxkPXYubGVuZ3RoO2QtLTspaWYoaT12W2RdLGkmJmkucHJlcGFyZSgpKWZvcihhPWkuZWRnZXMsYz1hLmxlbmd0aCxvPTA7Yz5vOylzPWFbb10uZW5kKCkscj1zLngsdT1zLnksbD1hWysrbyVjXS5zdGFydCgpLHQ9bC54LGU9bC55LCh2YShyLXQpPlRhfHx2YSh1LWUpPlRhKSYmKGEuc3BsaWNlKG8sMCxuZXcgUXIoR3IoaS5zaXRlLHMsdmEoci1mKTxUYSYmcC11PlRhP3t4OmYseTp2YSh0LWYpPFRhP2U6cH06dmEodS1wKTxUYSYmaC1yPlRhP3t4OnZhKGUtcCk8VGE/dDpoLHk6cH06dmEoci1oKTxUYSYmdS1nPlRhP3t4OmgseTp2YSh0LWgpPFRhP2U6Z306dmEodS1nKTxUYSYmci1mPlRhP3t4OnZhKGUtZyk8VGE/dDpmLHk6Z306bnVsbCksaS5zaXRlLG51bGwpKSwrK2MpfWZ1bmN0aW9uIElyKG4sdCl7cmV0dXJuIHQuYW5nbGUtbi5hbmdsZX1mdW5jdGlvbiBacigpe3R1KHRoaXMpLHRoaXMueD10aGlzLnk9dGhpcy5hcmM9dGhpcy5zaXRlPXRoaXMuY3k9bnVsbH1mdW5jdGlvbiBWcihuKXt2YXIgdD1uLlAsZT1uLk47aWYodCYmZSl7dmFyIHI9dC5zaXRlLHU9bi5zaXRlLGk9ZS5zaXRlO2lmKHIhPT1pKXt2YXIgbz11LngsYT11LnksYz1yLngtbyxsPXIueS1hLHM9aS54LW8sZj1pLnktYSxoPTIqKGMqZi1sKnMpO2lmKCEoaD49LVJhKSl7dmFyIGc9YypjK2wqbCxwPXMqcytmKmYsdj0oZipnLWwqcCkvaCxkPShjKnAtcypnKS9oLGY9ZCthLG09YWwucG9wKCl8fG5ldyBacjttLmFyYz1uLG0uc2l0ZT11LG0ueD12K28sbS55PWYrTWF0aC5zcXJ0KHYqditkKmQpLG0uY3k9ZixuLmNpcmNsZT1tO2Zvcih2YXIgeT1udWxsLE09aWwuXztNOylpZihtLnk8TS55fHxtLnk9PT1NLnkmJm0ueDw9TS54KXtpZighTS5MKXt5PU0uUDticmVha31NPU0uTH1lbHNle2lmKCFNLlIpe3k9TTticmVha31NPU0uUn1pbC5pbnNlcnQoeSxtKSx5fHwodWw9bSl9fX19ZnVuY3Rpb24gWHIobil7dmFyIHQ9bi5jaXJjbGU7dCYmKHQuUHx8KHVsPXQuTiksaWwucmVtb3ZlKHQpLGFsLnB1c2godCksdHUodCksbi5jaXJjbGU9bnVsbCl9ZnVuY3Rpb24gJHIobil7Zm9yKHZhciB0LGU9dGwscj1PZShuWzBdWzBdLG5bMF1bMV0sblsxXVswXSxuWzFdWzFdKSx1PWUubGVuZ3RoO3UtLTspdD1lW3VdLCghQnIodCxuKXx8IXIodCl8fHZhKHQuYS54LXQuYi54KTxUYSYmdmEodC5hLnktdC5iLnkpPFRhKSYmKHQuYT10LmI9bnVsbCxlLnNwbGljZSh1LDEpKX1mdW5jdGlvbiBCcihuLHQpe3ZhciBlPW4uYjtpZihlKXJldHVybiEwO3ZhciByLHUsaT1uLmEsbz10WzBdWzBdLGE9dFsxXVswXSxjPXRbMF1bMV0sbD10WzFdWzFdLHM9bi5sLGY9bi5yLGg9cy54LGc9cy55LHA9Zi54LHY9Zi55LGQ9KGgrcCkvMixtPShnK3YpLzI7aWYodj09PWcpe2lmKG8+ZHx8ZD49YSlyZXR1cm47aWYoaD5wKXtpZihpKXtpZihpLnk+PWwpcmV0dXJufWVsc2UgaT17eDpkLHk6Y307ZT17eDpkLHk6bH19ZWxzZXtpZihpKXtpZihpLnk8YylyZXR1cm59ZWxzZSBpPXt4OmQseTpsfTtlPXt4OmQseTpjfX19ZWxzZSBpZihyPShoLXApLyh2LWcpLHU9bS1yKmQsLTE+cnx8cj4xKWlmKGg+cCl7aWYoaSl7aWYoaS55Pj1sKXJldHVybn1lbHNlIGk9e3g6KGMtdSkvcix5OmN9O2U9e3g6KGwtdSkvcix5Omx9fWVsc2V7aWYoaSl7aWYoaS55PGMpcmV0dXJufWVsc2UgaT17eDoobC11KS9yLHk6bH07ZT17eDooYy11KS9yLHk6Y319ZWxzZSBpZih2Pmcpe2lmKGkpe2lmKGkueD49YSlyZXR1cm59ZWxzZSBpPXt4Om8seTpyKm8rdX07ZT17eDphLHk6ciphK3V9fWVsc2V7aWYoaSl7aWYoaS54PG8pcmV0dXJufWVsc2UgaT17eDphLHk6ciphK3V9O2U9e3g6byx5OnIqbyt1fX1yZXR1cm4gbi5hPWksbi5iPWUsITB9ZnVuY3Rpb24gV3Iobix0KXt0aGlzLmw9bix0aGlzLnI9dCx0aGlzLmE9dGhpcy5iPW51bGx9ZnVuY3Rpb24gSnIobix0LGUscil7dmFyIHU9bmV3IFdyKG4sdCk7cmV0dXJuIHRsLnB1c2godSksZSYmS3IodSxuLHQsZSksciYmS3IodSx0LG4sciksZWxbbi5pXS5lZGdlcy5wdXNoKG5ldyBRcih1LG4sdCkpLGVsW3QuaV0uZWRnZXMucHVzaChuZXcgUXIodSx0LG4pKSx1fWZ1bmN0aW9uIEdyKG4sdCxlKXt2YXIgcj1uZXcgV3IobixudWxsKTtyZXR1cm4gci5hPXQsci5iPWUsdGwucHVzaChyKSxyfWZ1bmN0aW9uIEtyKG4sdCxlLHIpe24uYXx8bi5iP24ubD09PWU/bi5iPXI6bi5hPXI6KG4uYT1yLG4ubD10LG4ucj1lKX1mdW5jdGlvbiBRcihuLHQsZSl7dmFyIHI9bi5hLHU9bi5iO3RoaXMuZWRnZT1uLHRoaXMuc2l0ZT10LHRoaXMuYW5nbGU9ZT9NYXRoLmF0YW4yKGUueS10LnksZS54LXQueCk6bi5sPT09dD9NYXRoLmF0YW4yKHUueC1yLngsci55LXUueSk6TWF0aC5hdGFuMihyLngtdS54LHUueS1yLnkpfWZ1bmN0aW9uIG51KCl7dGhpcy5fPW51bGx9ZnVuY3Rpb24gdHUobil7bi5VPW4uQz1uLkw9bi5SPW4uUD1uLk49bnVsbH1mdW5jdGlvbiBldShuLHQpe3ZhciBlPXQscj10LlIsdT1lLlU7dT91Lkw9PT1lP3UuTD1yOnUuUj1yOm4uXz1yLHIuVT11LGUuVT1yLGUuUj1yLkwsZS5SJiYoZS5SLlU9ZSksci5MPWV9ZnVuY3Rpb24gcnUobix0KXt2YXIgZT10LHI9dC5MLHU9ZS5VO3U/dS5MPT09ZT91Lkw9cjp1LlI9cjpuLl89cixyLlU9dSxlLlU9cixlLkw9ci5SLGUuTCYmKGUuTC5VPWUpLHIuUj1lfWZ1bmN0aW9uIHV1KG4pe2Zvcig7bi5MOyluPW4uTDtyZXR1cm4gbn1mdW5jdGlvbiBpdShuLHQpe3ZhciBlLHIsdSxpPW4uc29ydChvdSkucG9wKCk7Zm9yKHRsPVtdLGVsPW5ldyBBcnJheShuLmxlbmd0aCkscmw9bmV3IG51LGlsPW5ldyBudTs7KWlmKHU9dWwsaSYmKCF1fHxpLnk8dS55fHxpLnk9PT11LnkmJmkueDx1LngpKShpLnghPT1lfHxpLnkhPT1yKSYmKGVsW2kuaV09bmV3IE9yKGkpLGpyKGkpLGU9aS54LHI9aS55KSxpPW4ucG9wKCk7ZWxzZXtpZighdSlicmVhaztVcih1LmFyYyl9dCYmKCRyKHQpLFlyKHQpKTt2YXIgbz17Y2VsbHM6ZWwsZWRnZXM6dGx9O3JldHVybiBybD1pbD10bD1lbD1udWxsLG99ZnVuY3Rpb24gb3Uobix0KXtyZXR1cm4gdC55LW4ueXx8dC54LW4ueH1mdW5jdGlvbiBhdShuLHQsZSl7cmV0dXJuKG4ueC1lLngpKih0Lnktbi55KS0obi54LXQueCkqKGUueS1uLnkpfWZ1bmN0aW9uIGN1KG4pe3JldHVybiBuLnh9ZnVuY3Rpb24gbHUobil7cmV0dXJuIG4ueX1mdW5jdGlvbiBzdSgpe3JldHVybntsZWFmOiEwLG5vZGVzOltdLHBvaW50Om51bGwseDpudWxsLHk6bnVsbH19ZnVuY3Rpb24gZnUobix0LGUscix1LGkpe2lmKCFuKHQsZSxyLHUsaSkpe3ZhciBvPS41KihlK3UpLGE9LjUqKHIraSksYz10Lm5vZGVzO2NbMF0mJmZ1KG4sY1swXSxlLHIsbyxhKSxjWzFdJiZmdShuLGNbMV0sbyxyLHUsYSksY1syXSYmZnUobixjWzJdLGUsYSxvLGkpLGNbM10mJmZ1KG4sY1szXSxvLGEsdSxpKX19ZnVuY3Rpb24gaHUobix0LGUscix1LGksbyl7dmFyIGEsYz0xLzA7cmV0dXJuIGZ1bmN0aW9uIGwobixzLGYsaCxnKXtpZighKHM+aXx8Zj5vfHxyPmh8fHU+Zykpe2lmKHA9bi5wb2ludCl7dmFyIHAsdj10LXBbMF0sZD1lLXBbMV0sbT12KnYrZCpkO2lmKGM+bSl7dmFyIHk9TWF0aC5zcXJ0KGM9bSk7cj10LXksdT1lLXksaT10K3ksbz1lK3ksYT1wfX1mb3IodmFyIE09bi5ub2Rlcyx4PS41KihzK2gpLGI9LjUqKGYrZyksXz10Pj14LHc9ZT49YixTPXc8PDF8XyxrPVMrNDtrPlM7KytTKWlmKG49TVszJlNdKXN3aXRjaCgzJlMpe2Nhc2UgMDpsKG4scyxmLHgsYik7YnJlYWs7Y2FzZSAxOmwobix4LGYsaCxiKTticmVhaztjYXNlIDI6bChuLHMsYix4LGcpO2JyZWFrO2Nhc2UgMzpsKG4seCxiLGgsZyl9fX0obixyLHUsaSxvKSxhfWZ1bmN0aW9uIGd1KG4sdCl7bj10YS5yZ2IobiksdD10YS5yZ2IodCk7dmFyIGU9bi5yLHI9bi5nLHU9bi5iLGk9dC5yLWUsbz10LmctcixhPXQuYi11O3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4iIyIrTXQoTWF0aC5yb3VuZChlK2kqbikpK010KE1hdGgucm91bmQocitvKm4pKStNdChNYXRoLnJvdW5kKHUrYSpuKSl9fWZ1bmN0aW9uIHB1KG4sdCl7dmFyIGUscj17fSx1PXt9O2ZvcihlIGluIG4pZSBpbiB0P3JbZV09bXUobltlXSx0W2VdKTp1W2VdPW5bZV07Zm9yKGUgaW4gdCllIGluIG58fCh1W2VdPXRbZV0pO3JldHVybiBmdW5jdGlvbihuKXtmb3IoZSBpbiByKXVbZV09cltlXShuKTtyZXR1cm4gdX19ZnVuY3Rpb24gdnUobix0KXtyZXR1cm4gbj0rbix0PSt0LGZ1bmN0aW9uKGUpe3JldHVybiBuKigxLWUpK3QqZX19ZnVuY3Rpb24gZHUobix0KXt2YXIgZSxyLHUsaT1sbC5sYXN0SW5kZXg9c2wubGFzdEluZGV4PTAsbz0tMSxhPVtdLGM9W107Zm9yKG4rPSIiLHQrPSIiOyhlPWxsLmV4ZWMobikpJiYocj1zbC5leGVjKHQpKTspKHU9ci5pbmRleCk+aSYmKHU9dC5zbGljZShpLHUpLGFbb10/YVtvXSs9dTphWysrb109dSksKGU9ZVswXSk9PT0ocj1yWzBdKT9hW29dP2Fbb10rPXI6YVsrK29dPXI6KGFbKytvXT1udWxsLGMucHVzaCh7aTpvLHg6dnUoZSxyKX0pKSxpPXNsLmxhc3RJbmRleDtyZXR1cm4gaTx0Lmxlbmd0aCYmKHU9dC5zbGljZShpKSxhW29dP2Fbb10rPXU6YVsrK29dPXUpLGEubGVuZ3RoPDI/Y1swXT8odD1jWzBdLngsZnVuY3Rpb24obil7cmV0dXJuIHQobikrIiJ9KTpmdW5jdGlvbigpe3JldHVybiB0fToodD1jLmxlbmd0aCxmdW5jdGlvbihuKXtmb3IodmFyIGUscj0wO3Q+cjsrK3IpYVsoZT1jW3JdKS5pXT1lLngobik7cmV0dXJuIGEuam9pbigiIil9KX1mdW5jdGlvbiBtdShuLHQpe2Zvcih2YXIgZSxyPXRhLmludGVycG9sYXRvcnMubGVuZ3RoOy0tcj49MCYmIShlPXRhLmludGVycG9sYXRvcnNbcl0obix0KSk7KTtyZXR1cm4gZX1mdW5jdGlvbiB5dShuLHQpe3ZhciBlLHI9W10sdT1bXSxpPW4ubGVuZ3RoLG89dC5sZW5ndGgsYT1NYXRoLm1pbihuLmxlbmd0aCx0Lmxlbmd0aCk7Zm9yKGU9MDthPmU7KytlKXIucHVzaChtdShuW2VdLHRbZV0pKTtmb3IoO2k+ZTsrK2UpdVtlXT1uW2VdO2Zvcig7bz5lOysrZSl1W2VdPXRbZV07cmV0dXJuIGZ1bmN0aW9uKG4pe2ZvcihlPTA7YT5lOysrZSl1W2VdPXJbZV0obik7cmV0dXJuIHV9fWZ1bmN0aW9uIE11KG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gMD49dD8wOnQ+PTE/MTpuKHQpfX1mdW5jdGlvbiB4dShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIDEtbigxLXQpfX1mdW5jdGlvbiBidShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuLjUqKC41PnQ/bigyKnQpOjItbigyLTIqdCkpfX1mdW5jdGlvbiBfdShuKXtyZXR1cm4gbipufWZ1bmN0aW9uIHd1KG4pe3JldHVybiBuKm4qbn1mdW5jdGlvbiBTdShuKXtpZigwPj1uKXJldHVybiAwO2lmKG4+PTEpcmV0dXJuIDE7dmFyIHQ9bipuLGU9dCpuO3JldHVybiA0KiguNT5uP2U6Myoobi10KStlLS43NSl9ZnVuY3Rpb24ga3Uobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnBvdyh0LG4pfX1mdW5jdGlvbiBFdShuKXtyZXR1cm4gMS1NYXRoLmNvcyhuKmphKX1mdW5jdGlvbiBBdShuKXtyZXR1cm4gTWF0aC5wb3coMiwxMCoobi0xKSl9ZnVuY3Rpb24gTnUobil7cmV0dXJuIDEtTWF0aC5zcXJ0KDEtbipuKX1mdW5jdGlvbiBDdShuLHQpe3ZhciBlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDImJih0PS40NSksYXJndW1lbnRzLmxlbmd0aD9lPXQvUGEqTWF0aC5hc2luKDEvbik6KG49MSxlPXQvNCksZnVuY3Rpb24ocil7cmV0dXJuIDErbipNYXRoLnBvdygyLC0xMCpyKSpNYXRoLnNpbigoci1lKSpQYS90KX19ZnVuY3Rpb24genUobil7cmV0dXJuIG58fChuPTEuNzAxNTgpLGZ1bmN0aW9uKHQpe3JldHVybiB0KnQqKChuKzEpKnQtbil9fWZ1bmN0aW9uIHF1KG4pe3JldHVybiAxLzIuNzU+bj83LjU2MjUqbipuOjIvMi43NT5uPzcuNTYyNSoobi09MS41LzIuNzUpKm4rLjc1OjIuNS8yLjc1Pm4/Ny41NjI1KihuLT0yLjI1LzIuNzUpKm4rLjkzNzU6Ny41NjI1KihuLT0yLjYyNS8yLjc1KSpuKy45ODQzNzV9ZnVuY3Rpb24gTHUobix0KXtuPXRhLmhjbChuKSx0PXRhLmhjbCh0KTt2YXIgZT1uLmgscj1uLmMsdT1uLmwsaT10LmgtZSxvPXQuYy1yLGE9dC5sLXU7cmV0dXJuIGlzTmFOKG8pJiYobz0wLHI9aXNOYU4ocik/dC5jOnIpLGlzTmFOKGkpPyhpPTAsZT1pc05hTihlKT90Lmg6ZSk6aT4xODA/aS09MzYwOi0xODA+aSYmKGkrPTM2MCksZnVuY3Rpb24obil7cmV0dXJuIGx0KGUraSpuLHIrbypuLHUrYSpuKSsiIn19ZnVuY3Rpb24gVHUobix0KXtuPXRhLmhzbChuKSx0PXRhLmhzbCh0KTt2YXIgZT1uLmgscj1uLnMsdT1uLmwsaT10LmgtZSxvPXQucy1yLGE9dC5sLXU7cmV0dXJuIGlzTmFOKG8pJiYobz0wLHI9aXNOYU4ocik/dC5zOnIpLGlzTmFOKGkpPyhpPTAsZT1pc05hTihlKT90Lmg6ZSk6aT4xODA/aS09MzYwOi0xODA+aSYmKGkrPTM2MCksZnVuY3Rpb24obil7cmV0dXJuIGF0KGUraSpuLHIrbypuLHUrYSpuKSsiIn19ZnVuY3Rpb24gUnUobix0KXtuPXRhLmxhYihuKSx0PXRhLmxhYih0KTt2YXIgZT1uLmwscj1uLmEsdT1uLmIsaT10LmwtZSxvPXQuYS1yLGE9dC5iLXU7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBmdChlK2kqbixyK28qbix1K2EqbikrIiJ9fWZ1bmN0aW9uIER1KG4sdCl7cmV0dXJuIHQtPW4sZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucm91bmQobit0KmUpfX1mdW5jdGlvbiBQdShuKXt2YXIgdD1bbi5hLG4uYl0sZT1bbi5jLG4uZF0scj1qdSh0KSx1PVV1KHQsZSksaT1qdShGdShlLHQsLXUpKXx8MDt0WzBdKmVbMV08ZVswXSp0WzFdJiYodFswXSo9LTEsdFsxXSo9LTEscio9LTEsdSo9LTEpLHRoaXMucm90YXRlPShyP01hdGguYXRhbjIodFsxXSx0WzBdKTpNYXRoLmF0YW4yKC1lWzBdLGVbMV0pKSpIYSx0aGlzLnRyYW5zbGF0ZT1bbi5lLG4uZl0sdGhpcy5zY2FsZT1bcixpXSx0aGlzLnNrZXc9aT9NYXRoLmF0YW4yKHUsaSkqSGE6MH1mdW5jdGlvbiBVdShuLHQpe3JldHVybiBuWzBdKnRbMF0rblsxXSp0WzFdfWZ1bmN0aW9uIGp1KG4pe3ZhciB0PU1hdGguc3FydChVdShuLG4pKTtyZXR1cm4gdCYmKG5bMF0vPXQsblsxXS89dCksdH1mdW5jdGlvbiBGdShuLHQsZSl7cmV0dXJuIG5bMF0rPWUqdFswXSxuWzFdKz1lKnRbMV0sbn1mdW5jdGlvbiBIdShuLHQpe3ZhciBlLHI9W10sdT1bXSxpPXRhLnRyYW5zZm9ybShuKSxvPXRhLnRyYW5zZm9ybSh0KSxhPWkudHJhbnNsYXRlLGM9by50cmFuc2xhdGUsbD1pLnJvdGF0ZSxzPW8ucm90YXRlLGY9aS5za2V3LGg9by5za2V3LGc9aS5zY2FsZSxwPW8uc2NhbGU7cmV0dXJuIGFbMF0hPWNbMF18fGFbMV0hPWNbMV0/KHIucHVzaCgidHJhbnNsYXRlKCIsbnVsbCwiLCIsbnVsbCwiKSIpLHUucHVzaCh7aToxLHg6dnUoYVswXSxjWzBdKX0se2k6Myx4OnZ1KGFbMV0sY1sxXSl9KSk6Y1swXXx8Y1sxXT9yLnB1c2goInRyYW5zbGF0ZSgiK2MrIikiKTpyLnB1c2goIiIpLGwhPXM/KGwtcz4xODA/cys9MzYwOnMtbD4xODAmJihsKz0zNjApLHUucHVzaCh7aTpyLnB1c2goci5wb3AoKSsicm90YXRlKCIsbnVsbCwiKSIpLTIseDp2dShsLHMpfSkpOnMmJnIucHVzaChyLnBvcCgpKyJyb3RhdGUoIitzKyIpIiksZiE9aD91LnB1c2goe2k6ci5wdXNoKHIucG9wKCkrInNrZXdYKCIsbnVsbCwiKSIpLTIseDp2dShmLGgpfSk6aCYmci5wdXNoKHIucG9wKCkrInNrZXdYKCIraCsiKSIpLGdbMF0hPXBbMF18fGdbMV0hPXBbMV0/KGU9ci5wdXNoKHIucG9wKCkrInNjYWxlKCIsbnVsbCwiLCIsbnVsbCwiKSIpLHUucHVzaCh7aTplLTQseDp2dShnWzBdLHBbMF0pfSx7aTplLTIseDp2dShnWzFdLHBbMV0pfSkpOigxIT1wWzBdfHwxIT1wWzFdKSYmci5wdXNoKHIucG9wKCkrInNjYWxlKCIrcCsiKSIpLGU9dS5sZW5ndGgsZnVuY3Rpb24obil7Zm9yKHZhciB0LGk9LTE7KytpPGU7KXJbKHQ9dVtpXSkuaV09dC54KG4pO3JldHVybiByLmpvaW4oIiIpfX1mdW5jdGlvbiBPdShuLHQpe3JldHVybiB0PSh0LT1uPStuKXx8MS90LGZ1bmN0aW9uKGUpe3JldHVybihlLW4pL3R9fWZ1bmN0aW9uIFl1KG4sdCl7cmV0dXJuIHQ9KHQtPW49K24pfHwxL3QsZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oMSwoZS1uKS90KSl9fWZ1bmN0aW9uIEl1KG4pe2Zvcih2YXIgdD1uLnNvdXJjZSxlPW4udGFyZ2V0LHI9VnUodCxlKSx1PVt0XTt0IT09cjspdD10LnBhcmVudCx1LnB1c2godCk7Zm9yKHZhciBpPXUubGVuZ3RoO2UhPT1yOyl1LnNwbGljZShpLDAsZSksZT1lLnBhcmVudDtyZXR1cm4gdX1mdW5jdGlvbiBadShuKXtmb3IodmFyIHQ9W10sZT1uLnBhcmVudDtudWxsIT1lOyl0LnB1c2gobiksbj1lLGU9ZS5wYXJlbnQ7cmV0dXJuIHQucHVzaChuKSx0fWZ1bmN0aW9uIFZ1KG4sdCl7aWYobj09PXQpcmV0dXJuIG47Zm9yKHZhciBlPVp1KG4pLHI9WnUodCksdT1lLnBvcCgpLGk9ci5wb3AoKSxvPW51bGw7dT09PWk7KW89dSx1PWUucG9wKCksaT1yLnBvcCgpO3JldHVybiBvfWZ1bmN0aW9uIFh1KG4pe24uZml4ZWR8PTJ9ZnVuY3Rpb24gJHUobil7bi5maXhlZCY9LTd9ZnVuY3Rpb24gQnUobil7bi5maXhlZHw9NCxuLnB4PW4ueCxuLnB5PW4ueX1mdW5jdGlvbiBXdShuKXtuLmZpeGVkJj0tNX1mdW5jdGlvbiBKdShuLHQsZSl7dmFyIHI9MCx1PTA7aWYobi5jaGFyZ2U9MCwhbi5sZWFmKWZvcih2YXIgaSxvPW4ubm9kZXMsYT1vLmxlbmd0aCxjPS0xOysrYzxhOylpPW9bY10sbnVsbCE9aSYmKEp1KGksdCxlKSxuLmNoYXJnZSs9aS5jaGFyZ2Uscis9aS5jaGFyZ2UqaS5jeCx1Kz1pLmNoYXJnZSppLmN5KTtpZihuLnBvaW50KXtuLmxlYWZ8fChuLnBvaW50LngrPU1hdGgucmFuZG9tKCktLjUsbi5wb2ludC55Kz1NYXRoLnJhbmRvbSgpLS41KTt2YXIgbD10KmVbbi5wb2ludC5pbmRleF07bi5jaGFyZ2UrPW4ucG9pbnRDaGFyZ2U9bCxyKz1sKm4ucG9pbnQueCx1Kz1sKm4ucG9pbnQueX1uLmN4PXIvbi5jaGFyZ2Usbi5jeT11L24uY2hhcmdlfWZ1bmN0aW9uIEd1KG4sdCl7cmV0dXJuIHRhLnJlYmluZChuLHQsInNvcnQiLCJjaGlsZHJlbiIsInZhbHVlIiksbi5ub2Rlcz1uLG4ubGlua3M9cmksbn1mdW5jdGlvbiBLdShuLHQpe2Zvcih2YXIgZT1bbl07bnVsbCE9KG49ZS5wb3AoKSk7KWlmKHQobiksKHU9bi5jaGlsZHJlbikmJihyPXUubGVuZ3RoKSlmb3IodmFyIHIsdTstLXI+PTA7KWUucHVzaCh1W3JdKX1mdW5jdGlvbiBRdShuLHQpe2Zvcih2YXIgZT1bbl0scj1bXTtudWxsIT0obj1lLnBvcCgpKTspaWYoci5wdXNoKG4pLChpPW4uY2hpbGRyZW4pJiYodT1pLmxlbmd0aCkpZm9yKHZhciB1LGksbz0tMTsrK288dTspZS5wdXNoKGlbb10pO2Zvcig7bnVsbCE9KG49ci5wb3AoKSk7KXQobil9ZnVuY3Rpb24gbmkobil7cmV0dXJuIG4uY2hpbGRyZW59ZnVuY3Rpb24gdGkobil7cmV0dXJuIG4udmFsdWV9ZnVuY3Rpb24gZWkobix0KXtyZXR1cm4gdC52YWx1ZS1uLnZhbHVlfWZ1bmN0aW9uIHJpKG4pe3JldHVybiB0YS5tZXJnZShuLm1hcChmdW5jdGlvbihuKXtyZXR1cm4obi5jaGlsZHJlbnx8W10pLm1hcChmdW5jdGlvbih0KXtyZXR1cm57c291cmNlOm4sdGFyZ2V0OnR9fSl9KSl9ZnVuY3Rpb24gdWkobil7cmV0dXJuIG4ueH1mdW5jdGlvbiBpaShuKXtyZXR1cm4gbi55fWZ1bmN0aW9uIG9pKG4sdCxlKXtuLnkwPXQsbi55PWV9ZnVuY3Rpb24gYWkobil7cmV0dXJuIHRhLnJhbmdlKG4ubGVuZ3RoKX1mdW5jdGlvbiBjaShuKXtmb3IodmFyIHQ9LTEsZT1uWzBdLmxlbmd0aCxyPVtdOysrdDxlOylyW3RdPTA7cmV0dXJuIHJ9ZnVuY3Rpb24gbGkobil7Zm9yKHZhciB0LGU9MSxyPTAsdT1uWzBdWzFdLGk9bi5sZW5ndGg7aT5lOysrZSkodD1uW2VdWzFdKT51JiYocj1lLHU9dCk7cmV0dXJuIHJ9ZnVuY3Rpb24gc2kobil7cmV0dXJuIG4ucmVkdWNlKGZpLDApfWZ1bmN0aW9uIGZpKG4sdCl7cmV0dXJuIG4rdFsxXX1mdW5jdGlvbiBoaShuLHQpe3JldHVybiBnaShuLE1hdGguY2VpbChNYXRoLmxvZyh0Lmxlbmd0aCkvTWF0aC5MTjIrMSkpfWZ1bmN0aW9uIGdpKG4sdCl7Zm9yKHZhciBlPS0xLHI9K25bMF0sdT0oblsxXS1yKS90LGk9W107KytlPD10OylpW2VdPXUqZStyO3JldHVybiBpfWZ1bmN0aW9uIHBpKG4pe3JldHVyblt0YS5taW4obiksdGEubWF4KG4pXX1mdW5jdGlvbiB2aShuLHQpe3JldHVybiBuLnZhbHVlLXQudmFsdWV9ZnVuY3Rpb24gZGkobix0KXt2YXIgZT1uLl9wYWNrX25leHQ7bi5fcGFja19uZXh0PXQsdC5fcGFja19wcmV2PW4sdC5fcGFja19uZXh0PWUsZS5fcGFja19wcmV2PXR9ZnVuY3Rpb24gbWkobix0KXtuLl9wYWNrX25leHQ9dCx0Ll9wYWNrX3ByZXY9bn1mdW5jdGlvbiB5aShuLHQpe3ZhciBlPXQueC1uLngscj10Lnktbi55LHU9bi5yK3QucjtyZXR1cm4uOTk5KnUqdT5lKmUrcipyfWZ1bmN0aW9uIE1pKG4pe2Z1bmN0aW9uIHQobil7cz1NYXRoLm1pbihuLngtbi5yLHMpLGY9TWF0aC5tYXgobi54K24ucixmKSxoPU1hdGgubWluKG4ueS1uLnIsaCksZz1NYXRoLm1heChuLnkrbi5yLGcpfWlmKChlPW4uY2hpbGRyZW4pJiYobD1lLmxlbmd0aCkpe3ZhciBlLHIsdSxpLG8sYSxjLGwscz0xLzAsZj0tMS8wLGg9MS8wLGc9LTEvMDtpZihlLmZvckVhY2goeGkpLHI9ZVswXSxyLng9LXIucixyLnk9MCx0KHIpLGw+MSYmKHU9ZVsxXSx1Lng9dS5yLHUueT0wLHQodSksbD4yKSlmb3IoaT1lWzJdLHdpKHIsdSxpKSx0KGkpLGRpKHIsaSksci5fcGFja19wcmV2PWksZGkoaSx1KSx1PXIuX3BhY2tfbmV4dCxvPTM7bD5vO28rKyl7d2kocix1LGk9ZVtvXSk7dmFyIHA9MCx2PTEsZD0xO2ZvcihhPXUuX3BhY2tfbmV4dDthIT09dTthPWEuX3BhY2tfbmV4dCx2KyspaWYoeWkoYSxpKSl7cD0xO2JyZWFrfWlmKDE9PXApZm9yKGM9ci5fcGFja19wcmV2O2MhPT1hLl9wYWNrX3ByZXYmJiF5aShjLGkpO2M9Yy5fcGFja19wcmV2LGQrKyk7cD8oZD52fHx2PT1kJiZ1LnI8ci5yP21pKHIsdT1hKTptaShyPWMsdSksby0tKTooZGkocixpKSx1PWksdChpKSl9dmFyIG09KHMrZikvMix5PShoK2cpLzIsTT0wO2ZvcihvPTA7bD5vO28rKylpPWVbb10saS54LT1tLGkueS09eSxNPU1hdGgubWF4KE0saS5yK01hdGguc3FydChpLngqaS54K2kueSppLnkpKTtuLnI9TSxlLmZvckVhY2goYmkpfX1mdW5jdGlvbiB4aShuKXtuLl9wYWNrX25leHQ9bi5fcGFja19wcmV2PW59ZnVuY3Rpb24gYmkobil7ZGVsZXRlIG4uX3BhY2tfbmV4dCxkZWxldGUgbi5fcGFja19wcmV2fWZ1bmN0aW9uIF9pKG4sdCxlLHIpe3ZhciB1PW4uY2hpbGRyZW47aWYobi54PXQrPXIqbi54LG4ueT1lKz1yKm4ueSxuLnIqPXIsdSlmb3IodmFyIGk9LTEsbz11Lmxlbmd0aDsrK2k8bzspX2kodVtpXSx0LGUscil9ZnVuY3Rpb24gd2kobix0LGUpe3ZhciByPW4ucitlLnIsdT10Lngtbi54LGk9dC55LW4ueTtpZihyJiYodXx8aSkpe3ZhciBvPXQucitlLnIsYT11KnUraSppO28qPW8scio9cjt2YXIgYz0uNSsoci1vKS8oMiphKSxsPU1hdGguc3FydChNYXRoLm1heCgwLDIqbyoocithKS0oci09YSkqci1vKm8pKS8oMiphKTtlLng9bi54K2MqdStsKmksZS55PW4ueStjKmktbCp1fWVsc2UgZS54PW4ueCtyLGUueT1uLnl9ZnVuY3Rpb24gU2kobix0KXtyZXR1cm4gbi5wYXJlbnQ9PXQucGFyZW50PzE6Mn1mdW5jdGlvbiBraShuKXt2YXIgdD1uLmNoaWxkcmVuO3JldHVybiB0Lmxlbmd0aD90WzBdOm4udH1mdW5jdGlvbiBFaShuKXt2YXIgdCxlPW4uY2hpbGRyZW47cmV0dXJuKHQ9ZS5sZW5ndGgpP2VbdC0xXTpuLnR9ZnVuY3Rpb24gQWkobix0LGUpe3ZhciByPWUvKHQuaS1uLmkpO3QuYy09cix0LnMrPWUsbi5jKz1yLHQueis9ZSx0Lm0rPWV9ZnVuY3Rpb24gTmkobil7Zm9yKHZhciB0LGU9MCxyPTAsdT1uLmNoaWxkcmVuLGk9dS5sZW5ndGg7LS1pPj0wOyl0PXVbaV0sdC56Kz1lLHQubSs9ZSxlKz10LnMrKHIrPXQuYyl9ZnVuY3Rpb24gQ2kobix0LGUpe3JldHVybiBuLmEucGFyZW50PT09dC5wYXJlbnQ/bi5hOmV9ZnVuY3Rpb24gemkobil7cmV0dXJuIDErdGEubWF4KG4sZnVuY3Rpb24obil7cmV0dXJuIG4ueX0pfWZ1bmN0aW9uIHFpKG4pe3JldHVybiBuLnJlZHVjZShmdW5jdGlvbihuLHQpe3JldHVybiBuK3QueH0sMCkvbi5sZW5ndGh9ZnVuY3Rpb24gTGkobil7dmFyIHQ9bi5jaGlsZHJlbjtyZXR1cm4gdCYmdC5sZW5ndGg/TGkodFswXSk6bn1mdW5jdGlvbiBUaShuKXt2YXIgdCxlPW4uY2hpbGRyZW47cmV0dXJuIGUmJih0PWUubGVuZ3RoKT9UaShlW3QtMV0pOm59ZnVuY3Rpb24gUmkobil7cmV0dXJue3g6bi54LHk6bi55LGR4Om4uZHgsZHk6bi5keX19ZnVuY3Rpb24gRGkobix0KXt2YXIgZT1uLngrdFszXSxyPW4ueSt0WzBdLHU9bi5keC10WzFdLXRbM10saT1uLmR5LXRbMF0tdFsyXTtyZXR1cm4gMD51JiYoZSs9dS8yLHU9MCksMD5pJiYocis9aS8yLGk9MCkse3g6ZSx5OnIsZHg6dSxkeTppfX1mdW5jdGlvbiBQaShuKXt2YXIgdD1uWzBdLGU9bltuLmxlbmd0aC0xXTtyZXR1cm4gZT50P1t0LGVdOltlLHRdfWZ1bmN0aW9uIFVpKG4pe3JldHVybiBuLnJhbmdlRXh0ZW50P24ucmFuZ2VFeHRlbnQoKTpQaShuLnJhbmdlKCkpfWZ1bmN0aW9uIGppKG4sdCxlLHIpe3ZhciB1PWUoblswXSxuWzFdKSxpPXIodFswXSx0WzFdKTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGkodShuKSl9fWZ1bmN0aW9uIEZpKG4sdCl7dmFyIGUscj0wLHU9bi5sZW5ndGgtMSxpPW5bcl0sbz1uW3VdO3JldHVybiBpPm8mJihlPXIscj11LHU9ZSxlPWksaT1vLG89ZSksbltyXT10LmZsb29yKGkpLG5bdV09dC5jZWlsKG8pLG59ZnVuY3Rpb24gSGkobil7cmV0dXJuIG4/e2Zsb29yOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmZsb29yKHQvbikqbn0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5jZWlsKHQvbikqbn19OmJsfWZ1bmN0aW9uIE9pKG4sdCxlLHIpe3ZhciB1PVtdLGk9W10sbz0wLGE9TWF0aC5taW4obi5sZW5ndGgsdC5sZW5ndGgpLTE7Zm9yKG5bYV08blswXSYmKG49bi5zbGljZSgpLnJldmVyc2UoKSx0PXQuc2xpY2UoKS5yZXZlcnNlKCkpOysrbzw9YTspdS5wdXNoKGUobltvLTFdLG5bb10pKSxpLnB1c2gocih0W28tMV0sdFtvXSkpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT10YS5iaXNlY3Qobix0LDEsYSktMTtyZXR1cm4gaVtlXSh1W2VdKHQpKX19ZnVuY3Rpb24gWWkobix0LGUscil7ZnVuY3Rpb24gdSgpe3ZhciB1PU1hdGgubWluKG4ubGVuZ3RoLHQubGVuZ3RoKT4yP09pOmppLGM9cj9ZdTpPdTtyZXR1cm4gbz11KG4sdCxjLGUpLGE9dSh0LG4sYyxtdSksaX1mdW5jdGlvbiBpKG4pe3JldHVybiBvKG4pfXZhciBvLGE7cmV0dXJuIGkuaW52ZXJ0PWZ1bmN0aW9uKG4pe3JldHVybiBhKG4pfSxpLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10Lm1hcChOdW1iZXIpLHUoKSk6bn0saS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLHUoKSk6dH0saS5yYW5nZVJvdW5kPWZ1bmN0aW9uKG4pe3JldHVybiBpLnJhbmdlKG4pLmludGVycG9sYXRlKER1KX0saS5jbGFtcD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1uLHUoKSk6cn0saS5pbnRlcnBvbGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHUoKSk6ZX0saS50aWNrcz1mdW5jdGlvbih0KXtyZXR1cm4gWGkobix0KX0saS50aWNrRm9ybWF0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuICRpKG4sdCxlKX0saS5uaWNlPWZ1bmN0aW9uKHQpe3JldHVybiBaaShuLHQpLHUoKX0saS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFlpKG4sdCxlLHIpfSx1KCl9ZnVuY3Rpb24gSWkobix0KXtyZXR1cm4gdGEucmViaW5kKG4sdCwicmFuZ2UiLCJyYW5nZVJvdW5kIiwiaW50ZXJwb2xhdGUiLCJjbGFtcCIpfWZ1bmN0aW9uIFppKG4sdCl7cmV0dXJuIEZpKG4sSGkoVmkobix0KVsyXSkpfWZ1bmN0aW9uIFZpKG4sdCl7bnVsbD09dCYmKHQ9MTApO3ZhciBlPVBpKG4pLHI9ZVsxXS1lWzBdLHU9TWF0aC5wb3coMTAsTWF0aC5mbG9vcihNYXRoLmxvZyhyL3QpL01hdGguTE4xMCkpLGk9dC9yKnU7cmV0dXJuLjE1Pj1pP3UqPTEwOi4zNT49aT91Kj01Oi43NT49aSYmKHUqPTIpLGVbMF09TWF0aC5jZWlsKGVbMF0vdSkqdSxlWzFdPU1hdGguZmxvb3IoZVsxXS91KSp1Ky41KnUsZVsyXT11LGV9ZnVuY3Rpb24gWGkobix0KXtyZXR1cm4gdGEucmFuZ2UuYXBwbHkodGEsVmkobix0KSl9ZnVuY3Rpb24gJGkobix0LGUpe3ZhciByPVZpKG4sdCk7aWYoZSl7dmFyIHU9bGMuZXhlYyhlKTtpZih1LnNoaWZ0KCksInMiPT09dVs4XSl7dmFyIGk9dGEuZm9ybWF0UHJlZml4KE1hdGgubWF4KHZhKHJbMF0pLHZhKHJbMV0pKSk7cmV0dXJuIHVbN118fCh1WzddPSIuIitCaShpLnNjYWxlKHJbMl0pKSksdVs4XT0iZiIsZT10YS5mb3JtYXQodS5qb2luKCIiKSksZnVuY3Rpb24obil7cmV0dXJuIGUoaS5zY2FsZShuKSkraS5zeW1ib2x9fXVbN118fCh1WzddPSIuIitXaSh1WzhdLHIpKSxlPXUuam9pbigiIil9ZWxzZSBlPSIsLiIrQmkoclsyXSkrImYiO3JldHVybiB0YS5mb3JtYXQoZSl9ZnVuY3Rpb24gQmkobil7cmV0dXJuLU1hdGguZmxvb3IoTWF0aC5sb2cobikvTWF0aC5MTjEwKy4wMSl9ZnVuY3Rpb24gV2kobix0KXt2YXIgZT1CaSh0WzJdKTtyZXR1cm4gbiBpbiBfbD9NYXRoLmFicyhlLUJpKE1hdGgubWF4KHZhKHRbMF0pLHZhKHRbMV0pKSkpKyArKCJlIiE9PW4pOmUtMiooIiUiPT09bil9ZnVuY3Rpb24gSmkobix0LGUscil7ZnVuY3Rpb24gdShuKXtyZXR1cm4oZT9NYXRoLmxvZygwPm4/MDpuKTotTWF0aC5sb2cobj4wPzA6LW4pKS9NYXRoLmxvZyh0KX1mdW5jdGlvbiBpKG4pe3JldHVybiBlP01hdGgucG93KHQsbik6LU1hdGgucG93KHQsLW4pfWZ1bmN0aW9uIG8odCl7cmV0dXJuIG4odSh0KSl9cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBpKG4uaW52ZXJ0KHQpKX0sby5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dFswXT49MCxuLmRvbWFpbigocj10Lm1hcChOdW1iZXIpKS5tYXAodSkpLG8pOnJ9LG8uYmFzZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rZSxuLmRvbWFpbihyLm1hcCh1KSksbyk6dH0sby5uaWNlPWZ1bmN0aW9uKCl7dmFyIHQ9Rmkoci5tYXAodSksZT9NYXRoOlNsKTtyZXR1cm4gbi5kb21haW4odCkscj10Lm1hcChpKSxvfSxvLnRpY2tzPWZ1bmN0aW9uKCl7dmFyIG49UGkociksbz1bXSxhPW5bMF0sYz1uWzFdLGw9TWF0aC5mbG9vcih1KGEpKSxzPU1hdGguY2VpbCh1KGMpKSxmPXQlMT8yOnQ7aWYoaXNGaW5pdGUocy1sKSl7aWYoZSl7Zm9yKDtzPmw7bCsrKWZvcih2YXIgaD0xO2Y+aDtoKyspby5wdXNoKGkobCkqaCk7by5wdXNoKGkobCkpfWVsc2UgZm9yKG8ucHVzaChpKGwpKTtsKys8czspZm9yKHZhciBoPWYtMTtoPjA7aC0tKW8ucHVzaChpKGwpKmgpO2ZvcihsPTA7b1tsXTxhO2wrKyk7Zm9yKHM9by5sZW5ndGg7b1tzLTFdPmM7cy0tKTtvPW8uc2xpY2UobCxzKX1yZXR1cm4gb30sby50aWNrRm9ybWF0PWZ1bmN0aW9uKG4sdCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHdsO2FyZ3VtZW50cy5sZW5ndGg8Mj90PXdsOiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD10YS5mb3JtYXQodCkpO3ZhciByLGE9TWF0aC5tYXgoLjEsbi9vLnRpY2tzKCkubGVuZ3RoKSxjPWU/KHI9MWUtMTIsTWF0aC5jZWlsKToocj0tMWUtMTIsTWF0aC5mbG9vcik7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBuL2koYyh1KG4pK3IpKTw9YT90KG4pOiIifX0sby5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIEppKG4uY29weSgpLHQsZSxyKX0sSWkobyxuKX1mdW5jdGlvbiBHaShuLHQsZSl7ZnVuY3Rpb24gcih0KXtyZXR1cm4gbih1KHQpKX12YXIgdT1LaSh0KSxpPUtpKDEvdCk7cmV0dXJuIHIuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBpKG4uaW52ZXJ0KHQpKX0sci5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG4uZG9tYWluKChlPXQubWFwKE51bWJlcikpLm1hcCh1KSkscik6ZX0sci50aWNrcz1mdW5jdGlvbihuKXtyZXR1cm4gWGkoZSxuKX0sci50aWNrRm9ybWF0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuICRpKGUsbix0KX0sci5uaWNlPWZ1bmN0aW9uKG4pe3JldHVybiByLmRvbWFpbihaaShlLG4pKX0sci5leHBvbmVudD1mdW5jdGlvbihvKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1LaSh0PW8pLGk9S2koMS90KSxuLmRvbWFpbihlLm1hcCh1KSkscik6dH0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIEdpKG4uY29weSgpLHQsZSl9LElpKHIsbil9ZnVuY3Rpb24gS2kobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiAwPnQ/LU1hdGgucG93KC10LG4pOk1hdGgucG93KHQsbil9fWZ1bmN0aW9uIFFpKG4sdCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gaVsoKHUuZ2V0KGUpfHwoInJhbmdlIj09PXQudD91LnNldChlLG4ucHVzaChlKSk6MC8wKSktMSklaS5sZW5ndGhdfWZ1bmN0aW9uIHIodCxlKXtyZXR1cm4gdGEucmFuZ2Uobi5sZW5ndGgpLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gdCtlKm59KX12YXIgdSxpLG87cmV0dXJuIGUuZG9tYWluPWZ1bmN0aW9uKHIpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBuO249W10sdT1uZXcgYTtmb3IodmFyIGksbz0tMSxjPXIubGVuZ3RoOysrbzxjOyl1LmhhcyhpPXJbb10pfHx1LnNldChpLG4ucHVzaChpKSk7cmV0dXJuIGVbdC50XS5hcHBseShlLHQuYSl9LGUucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bixvPTAsdD17dDoicmFuZ2UiLGE6YXJndW1lbnRzfSxlKTppfSxlLnJhbmdlUG9pbnRzPWZ1bmN0aW9uKHUsYSl7YXJndW1lbnRzLmxlbmd0aDwyJiYoYT0wKTt2YXIgYz11WzBdLGw9dVsxXSxzPW4ubGVuZ3RoPDI/KGM9KGMrbCkvMiwwKToobC1jKS8obi5sZW5ndGgtMSthKTtyZXR1cm4gaT1yKGMrcyphLzIscyksbz0wLHQ9e3Q6InJhbmdlUG9pbnRzIixhOmFyZ3VtZW50c30sZX0sZS5yYW5nZVJvdW5kUG9pbnRzPWZ1bmN0aW9uKHUsYSl7YXJndW1lbnRzLmxlbmd0aDwyJiYoYT0wKTt2YXIgYz11WzBdLGw9dVsxXSxzPW4ubGVuZ3RoPDI/KGM9bD1NYXRoLnJvdW5kKChjK2wpLzIpLDApOjB8KGwtYykvKG4ubGVuZ3RoLTErYSk7cmV0dXJuIGk9cihjK01hdGgucm91bmQocyphLzIrKGwtYy0obi5sZW5ndGgtMSthKSpzKS8yKSxzKSxvPTAsdD17dDoicmFuZ2VSb3VuZFBvaW50cyIsYTphcmd1bWVudHN9LGV9LGUucmFuZ2VCYW5kcz1mdW5jdGlvbih1LGEsYyl7YXJndW1lbnRzLmxlbmd0aDwyJiYoYT0wKSxhcmd1bWVudHMubGVuZ3RoPDMmJihjPWEpO3ZhciBsPXVbMV08dVswXSxzPXVbbC0wXSxmPXVbMS1sXSxoPShmLXMpLyhuLmxlbmd0aC1hKzIqYyk7cmV0dXJuIGk9cihzK2gqYyxoKSxsJiZpLnJldmVyc2UoKSxvPWgqKDEtYSksdD17dDoicmFuZ2VCYW5kcyIsYTphcmd1bWVudHN9LGV9LGUucmFuZ2VSb3VuZEJhbmRzPWZ1bmN0aW9uKHUsYSxjKXthcmd1bWVudHMubGVuZ3RoPDImJihhPTApLGFyZ3VtZW50cy5sZW5ndGg8MyYmKGM9YSk7dmFyIGw9dVsxXTx1WzBdLHM9dVtsLTBdLGY9dVsxLWxdLGg9TWF0aC5mbG9vcigoZi1zKS8obi5sZW5ndGgtYSsyKmMpKTtyZXR1cm4gaT1yKHMrTWF0aC5yb3VuZCgoZi1zLShuLmxlbmd0aC1hKSpoKS8yKSxoKSxsJiZpLnJldmVyc2UoKSxvPU1hdGgucm91bmQoaCooMS1hKSksdD17dDoicmFuZ2VSb3VuZEJhbmRzIixhOmFyZ3VtZW50c30sZX0sZS5yYW5nZUJhbmQ9ZnVuY3Rpb24oKXtyZXR1cm4gb30sZS5yYW5nZUV4dGVudD1mdW5jdGlvbigpe3JldHVybiBQaSh0LmFbMF0pfSxlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gUWkobix0KX0sZS5kb21haW4obil9ZnVuY3Rpb24gbm8ocix1KXtmdW5jdGlvbiBpKCl7dmFyIG49MCx0PXUubGVuZ3RoO2ZvcihhPVtdOysrbjx0OylhW24tMV09dGEucXVhbnRpbGUocixuL3QpO3JldHVybiBvfWZ1bmN0aW9uIG8obil7cmV0dXJuIGlzTmFOKG49K24pP3ZvaWQgMDp1W3RhLmJpc2VjdChhLG4pXX12YXIgYTtyZXR1cm4gby5kb21haW49ZnVuY3Rpb24odSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dS5tYXAodCkuZmlsdGVyKGUpLnNvcnQobiksaSgpKTpyfSxvLnJhbmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW4saSgpKTp1fSxvLnF1YW50aWxlcz1mdW5jdGlvbigpe3JldHVybiBhfSxvLmludmVydEV4dGVudD1mdW5jdGlvbihuKXtyZXR1cm4gbj11LmluZGV4T2YobiksMD5uP1swLzAsMC8wXTpbbj4wP2Fbbi0xXTpyWzBdLG48YS5sZW5ndGg/YVtuXTpyW3IubGVuZ3RoLTFdXX0sby5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIG5vKHIsdSl9LGkoKX1mdW5jdGlvbiB0byhuLHQsZSl7ZnVuY3Rpb24gcih0KXtyZXR1cm4gZVtNYXRoLm1heCgwLE1hdGgubWluKG8sTWF0aC5mbG9vcihpKih0LW4pKSkpXX1mdW5jdGlvbiB1KCl7cmV0dXJuIGk9ZS5sZW5ndGgvKHQtbiksbz1lLmxlbmd0aC0xLHJ9dmFyIGksbztyZXR1cm4gci5kb21haW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K2VbMF0sdD0rZVtlLmxlbmd0aC0xXSx1KCkpOltuLHRdfSxyLnJhbmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdSgpKTplfSxyLmludmVydEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gdD1lLmluZGV4T2YodCksdD0wPnQ/MC8wOnQvaStuLFt0LHQrMS9pXX0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHRvKG4sdCxlKX0sdSgpfWZ1bmN0aW9uIGVvKG4sdCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gZT49ZT90W3RhLmJpc2VjdChuLGUpXTp2b2lkIDB9cmV0dXJuIGUuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsZSk6bn0sZS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGUpOnR9LGUuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlPXQuaW5kZXhPZihlKSxbbltlLTFdLG5bZV1dfSxlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gZW8obix0KX0sZX1mdW5jdGlvbiBybyhuKXtmdW5jdGlvbiB0KG4pe3JldHVybitufXJldHVybiB0LmludmVydD10LHQuZG9tYWluPXQucmFuZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ZS5tYXAodCksdCk6bn0sdC50aWNrcz1mdW5jdGlvbih0KXtyZXR1cm4gWGkobix0KX0sdC50aWNrRm9ybWF0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuICRpKG4sdCxlKX0sdC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHJvKG4pfSx0fWZ1bmN0aW9uIHVvKCl7cmV0dXJuIDB9ZnVuY3Rpb24gaW8obil7cmV0dXJuIG4uaW5uZXJSYWRpdXN9ZnVuY3Rpb24gb28obil7cmV0dXJuIG4ub3V0ZXJSYWRpdXN9ZnVuY3Rpb24gYW8obil7cmV0dXJuIG4uc3RhcnRBbmdsZX1mdW5jdGlvbiBjbyhuKXtyZXR1cm4gbi5lbmRBbmdsZX1mdW5jdGlvbiBsbyhuKXtyZXR1cm4gbiYmbi5wYWRBbmdsZX1mdW5jdGlvbiBzbyhuLHQsZSxyKXtyZXR1cm4obi1lKSp0LSh0LXIpKm4+MD8wOjF9ZnVuY3Rpb24gZm8obix0LGUscix1KXt2YXIgaT1uWzBdLXRbMF0sbz1uWzFdLXRbMV0sYT0odT9yOi1yKS9NYXRoLnNxcnQoaSppK28qbyksYz1hKm8sbD0tYSppLHM9blswXStjLGY9blsxXStsLGg9dFswXStjLGc9dFsxXStsLHA9KHMraCkvMix2PShmK2cpLzIsZD1oLXMsbT1nLWYseT1kKmQrbSptLE09ZS1yLHg9cypnLWgqZixiPSgwPm0/LTE6MSkqTWF0aC5zcXJ0KE0qTSp5LXgqeCksXz0oeCptLWQqYikveSx3PSgteCpkLW0qYikveSxTPSh4Km0rZCpiKS95LGs9KC14KmQrbSpiKS95LEU9Xy1wLEE9dy12LE49Uy1wLEM9ay12O3JldHVybiBFKkUrQSpBPk4qTitDKkMmJihfPVMsdz1rKSxbW18tYyx3LWxdLFtfKmUvTSx3KmUvTV1dfWZ1bmN0aW9uIGhvKG4pe2Z1bmN0aW9uIHQodCl7ZnVuY3Rpb24gbygpe2wucHVzaCgiTSIsaShuKHMpLGEpKX1mb3IodmFyIGMsbD1bXSxzPVtdLGY9LTEsaD10Lmxlbmd0aCxnPWt0KGUpLHA9a3Qocik7KytmPGg7KXUuY2FsbCh0aGlzLGM9dFtmXSxmKT9zLnB1c2goWytnLmNhbGwodGhpcyxjLGYpLCtwLmNhbGwodGhpcyxjLGYpXSk6cy5sZW5ndGgmJihvKCkscz1bXSk7cmV0dXJuIHMubGVuZ3RoJiZvKCksbC5sZW5ndGg/bC5qb2luKCIiKTpudWxsfXZhciBlPUFyLHI9TnIsdT1OZSxpPWdvLG89aS5rZXksYT0uNztyZXR1cm4gdC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdCk6ZX0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdCk6cn0sdC5kZWZpbmVkPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW4sdCk6dX0sdC5pbnRlcnBvbGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9pPW46KGk9emwuZ2V0KG4pfHxnbykua2V5LHQpOm99LHQudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1uLHQpOmF9LHR9ZnVuY3Rpb24gZ28obil7cmV0dXJuIG4uam9pbigiTCIpfWZ1bmN0aW9uIHBvKG4pe3JldHVybiBnbyhuKSsiWiJ9ZnVuY3Rpb24gdm8obil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aCxyPW5bMF0sdT1bclswXSwiLCIsclsxXV07Kyt0PGU7KXUucHVzaCgiSCIsKHJbMF0rKHI9blt0XSlbMF0pLzIsIlYiLHJbMV0pO3JldHVybiBlPjEmJnUucHVzaCgiSCIsclswXSksdS5qb2luKCIiKX1mdW5jdGlvbiBtbyhuKXtmb3IodmFyIHQ9MCxlPW4ubGVuZ3RoLHI9blswXSx1PVtyWzBdLCIsIixyWzFdXTsrK3Q8ZTspdS5wdXNoKCJWIiwocj1uW3RdKVsxXSwiSCIsclswXSk7cmV0dXJuIHUuam9pbigiIil9ZnVuY3Rpb24geW8obil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aCxyPW5bMF0sdT1bclswXSwiLCIsclsxXV07Kyt0PGU7KXUucHVzaCgiSCIsKHI9blt0XSlbMF0sIlYiLHJbMV0pO3JldHVybiB1LmpvaW4oIiIpfWZ1bmN0aW9uIE1vKG4sdCl7cmV0dXJuIG4ubGVuZ3RoPDQ/Z28obik6blsxXStfbyhuLnNsaWNlKDEsLTEpLHdvKG4sdCkpfWZ1bmN0aW9uIHhvKG4sdCl7cmV0dXJuIG4ubGVuZ3RoPDM/Z28obik6blswXStfbygobi5wdXNoKG5bMF0pLG4pLHdvKFtuW24ubGVuZ3RoLTJdXS5jb25jYXQobixbblsxXV0pLHQpKX1mdW5jdGlvbiBibyhuLHQpe3JldHVybiBuLmxlbmd0aDwzP2dvKG4pOm5bMF0rX28obix3byhuLHQpKX1mdW5jdGlvbiBfbyhuLHQpe2lmKHQubGVuZ3RoPDF8fG4ubGVuZ3RoIT10Lmxlbmd0aCYmbi5sZW5ndGghPXQubGVuZ3RoKzIpcmV0dXJuIGdvKG4pO3ZhciBlPW4ubGVuZ3RoIT10Lmxlbmd0aCxyPSIiLHU9blswXSxpPW5bMV0sbz10WzBdLGE9byxjPTE7aWYoZSYmKHIrPSJRIisoaVswXS0yKm9bMF0vMykrIiwiKyhpWzFdLTIqb1sxXS8zKSsiLCIraVswXSsiLCIraVsxXSx1PW5bMV0sYz0yKSx0Lmxlbmd0aD4xKXthPXRbMV0saT1uW2NdLGMrKyxyKz0iQyIrKHVbMF0rb1swXSkrIiwiKyh1WzFdK29bMV0pKyIsIisoaVswXS1hWzBdKSsiLCIrKGlbMV0tYVsxXSkrIiwiK2lbMF0rIiwiK2lbMV07Zm9yKHZhciBsPTI7bDx0Lmxlbmd0aDtsKyssYysrKWk9bltjXSxhPXRbbF0scis9IlMiKyhpWzBdLWFbMF0pKyIsIisoaVsxXS1hWzFdKSsiLCIraVswXSsiLCIraVsxXX1pZihlKXt2YXIgcz1uW2NdO3IrPSJRIisoaVswXSsyKmFbMF0vMykrIiwiKyhpWzFdKzIqYVsxXS8zKSsiLCIrc1swXSsiLCIrc1sxXX1yZXR1cm4gcn1mdW5jdGlvbiB3byhuLHQpe2Zvcih2YXIgZSxyPVtdLHU9KDEtdCkvMixpPW5bMF0sbz1uWzFdLGE9MSxjPW4ubGVuZ3RoOysrYTxjOyllPWksaT1vLG89blthXSxyLnB1c2goW3UqKG9bMF0tZVswXSksdSoob1sxXS1lWzFdKV0pO3JldHVybiByfWZ1bmN0aW9uIFNvKG4pe2lmKG4ubGVuZ3RoPDMpcmV0dXJuIGdvKG4pO3ZhciB0PTEsZT1uLmxlbmd0aCxyPW5bMF0sdT1yWzBdLGk9clsxXSxvPVt1LHUsdSwocj1uWzFdKVswXV0sYT1baSxpLGksclsxXV0sYz1bdSwiLCIsaSwiTCIsTm8oVGwsbyksIiwiLE5vKFRsLGEpXTtmb3Iobi5wdXNoKG5bZS0xXSk7Kyt0PD1lOylyPW5bdF0sby5zaGlmdCgpLG8ucHVzaChyWzBdKSxhLnNoaWZ0KCksYS5wdXNoKHJbMV0pLENvKGMsbyxhKTtyZXR1cm4gbi5wb3AoKSxjLnB1c2goIkwiLHIpLGMuam9pbigiIil9ZnVuY3Rpb24ga28obil7aWYobi5sZW5ndGg8NClyZXR1cm4gZ28obik7Zm9yKHZhciB0LGU9W10scj0tMSx1PW4ubGVuZ3RoLGk9WzBdLG89WzBdOysrcjwzOyl0PW5bcl0saS5wdXNoKHRbMF0pLG8ucHVzaCh0WzFdKTtmb3IoZS5wdXNoKE5vKFRsLGkpKyIsIitObyhUbCxvKSksLS1yOysrcjx1Oyl0PW5bcl0saS5zaGlmdCgpLGkucHVzaCh0WzBdKSxvLnNoaWZ0KCksby5wdXNoKHRbMV0pLENvKGUsaSxvKTtyZXR1cm4gZS5qb2luKCIiKX1mdW5jdGlvbiBFbyhuKXtmb3IodmFyIHQsZSxyPS0xLHU9bi5sZW5ndGgsaT11KzQsbz1bXSxhPVtdOysrcjw0OyllPW5bciV1XSxvLnB1c2goZVswXSksYS5wdXNoKGVbMV0pO2Zvcih0PVtObyhUbCxvKSwiLCIsTm8oVGwsYSldLC0tcjsrK3I8aTspZT1uW3IldV0sby5zaGlmdCgpLG8ucHVzaChlWzBdKSxhLnNoaWZ0KCksYS5wdXNoKGVbMV0pLENvKHQsbyxhKTtyZXR1cm4gdC5qb2luKCIiKX1mdW5jdGlvbiBBbyhuLHQpe3ZhciBlPW4ubGVuZ3RoLTE7aWYoZSlmb3IodmFyIHIsdSxpPW5bMF1bMF0sbz1uWzBdWzFdLGE9bltlXVswXS1pLGM9bltlXVsxXS1vLGw9LTE7KytsPD1lOylyPW5bbF0sdT1sL2UsclswXT10KnJbMF0rKDEtdCkqKGkrdSphKSxyWzFdPXQqclsxXSsoMS10KSoobyt1KmMpO3JldHVybiBTbyhuKX1mdW5jdGlvbiBObyhuLHQpe3JldHVybiBuWzBdKnRbMF0rblsxXSp0WzFdK25bMl0qdFsyXStuWzNdKnRbM119ZnVuY3Rpb24gQ28obix0LGUpe24ucHVzaCgiQyIsTm8ocWwsdCksIiwiLE5vKHFsLGUpLCIsIixObyhMbCx0KSwiLCIsTm8oTGwsZSksIiwiLE5vKFRsLHQpLCIsIixObyhUbCxlKSl9ZnVuY3Rpb24gem8obix0KXtyZXR1cm4odFsxXS1uWzFdKS8odFswXS1uWzBdKX1mdW5jdGlvbiBxbyhuKXtmb3IodmFyIHQ9MCxlPW4ubGVuZ3RoLTEscj1bXSx1PW5bMF0saT1uWzFdLG89clswXT16byh1LGkpOysrdDxlOylyW3RdPShvKyhvPXpvKHU9aSxpPW5bdCsxXSkpKS8yO3JldHVybiByW3RdPW8scn1mdW5jdGlvbiBMbyhuKXtmb3IodmFyIHQsZSxyLHUsaT1bXSxvPXFvKG4pLGE9LTEsYz1uLmxlbmd0aC0xOysrYTxjOyl0PXpvKG5bYV0sblthKzFdKSx2YSh0KTxUYT9vW2FdPW9bYSsxXT0wOihlPW9bYV0vdCxyPW9bYSsxXS90LHU9ZSplK3Iqcix1PjkmJih1PTMqdC9NYXRoLnNxcnQodSksb1thXT11KmUsb1thKzFdPXUqcikpO2ZvcihhPS0xOysrYTw9YzspdT0obltNYXRoLm1pbihjLGErMSldWzBdLW5bTWF0aC5tYXgoMCxhLTEpXVswXSkvKDYqKDErb1thXSpvW2FdKSksaS5wdXNoKFt1fHwwLG9bYV0qdXx8MF0pO3JldHVybiBpfWZ1bmN0aW9uIFRvKG4pe3JldHVybiBuLmxlbmd0aDwzP2dvKG4pOm5bMF0rX28obixMbyhuKSl9ZnVuY3Rpb24gUm8obil7Zm9yKHZhciB0LGUscix1PS0xLGk9bi5sZW5ndGg7Kyt1PGk7KXQ9blt1XSxlPXRbMF0scj10WzFdLWphLHRbMF09ZSpNYXRoLmNvcyhyKSx0WzFdPWUqTWF0aC5zaW4ocik7cmV0dXJuIG59ZnVuY3Rpb24gRG8obil7ZnVuY3Rpb24gdCh0KXtmdW5jdGlvbiBjKCl7di5wdXNoKCJNIixhKG4obSksZikscyxsKG4oZC5yZXZlcnNlKCkpLGYpLCJaIil9Zm9yKHZhciBoLGcscCx2PVtdLGQ9W10sbT1bXSx5PS0xLE09dC5sZW5ndGgseD1rdChlKSxiPWt0KHUpLF89ZT09PXI/ZnVuY3Rpb24oKXtyZXR1cm4gZ306a3Qociksdz11PT09aT9mdW5jdGlvbigpe3JldHVybiBwfTprdChpKTsrK3k8TTspby5jYWxsKHRoaXMsaD10W3ldLHkpPyhkLnB1c2goW2c9K3guY2FsbCh0aGlzLGgseSkscD0rYi5jYWxsKHRoaXMsaCx5KV0pLG0ucHVzaChbK18uY2FsbCh0aGlzLGgseSksK3cuY2FsbCh0aGlzLGgseSldKSk6ZC5sZW5ndGgmJihjKCksZD1bXSxtPVtdKTtyZXR1cm4gZC5sZW5ndGgmJmMoKSx2Lmxlbmd0aD92LmpvaW4oIiIpOm51bGx9dmFyIGU9QXIscj1Bcix1PTAsaT1OcixvPU5lLGE9Z28sYz1hLmtleSxsPWEscz0iTCIsZj0uNztyZXR1cm4gdC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXI9bix0KTpyfSx0LngwPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdCk6ZX0sdC54MT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1uLHQpOnJ9LHQueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1pPW4sdCk6aX0sdC55MD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1uLHQpOnV9LHQueTE9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bix0KTppfSx0LmRlZmluZWQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bix0KTpvfSx0LmludGVycG9sYXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSJmdW5jdGlvbiI9PXR5cGVvZiBuP2E9bjooYT16bC5nZXQobil8fGdvKS5rZXksbD1hLnJldmVyc2V8fGEscz1hLmNsb3NlZD8iTSI6IkwiLHQpOmMKfSx0LnRlbnNpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9bix0KTpmfSx0fWZ1bmN0aW9uIFBvKG4pe3JldHVybiBuLnJhZGl1c31mdW5jdGlvbiBVbyhuKXtyZXR1cm5bbi54LG4ueV19ZnVuY3Rpb24gam8obil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyksZT10WzBdLHI9dFsxXS1qYTtyZXR1cm5bZSpNYXRoLmNvcyhyKSxlKk1hdGguc2luKHIpXX19ZnVuY3Rpb24gRm8oKXtyZXR1cm4gNjR9ZnVuY3Rpb24gSG8oKXtyZXR1cm4iY2lyY2xlIn1mdW5jdGlvbiBPbyhuKXt2YXIgdD1NYXRoLnNxcnQobi9EYSk7cmV0dXJuIk0wLCIrdCsiQSIrdCsiLCIrdCsiIDAgMSwxIDAsIistdCsiQSIrdCsiLCIrdCsiIDAgMSwxIDAsIit0KyJaIn1mdW5jdGlvbiBZbyhuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdCxlOyh0PXRoaXNbbl0pJiYoZT10W3QuYWN0aXZlXSkmJigtLXQuY291bnQ/KGRlbGV0ZSB0W3QuYWN0aXZlXSx0LmFjdGl2ZSs9LjUpOmRlbGV0ZSB0aGlzW25dLGUuZXZlbnQmJmUuZXZlbnQuaW50ZXJydXB0LmNhbGwodGhpcyx0aGlzLl9fZGF0YV9fLGUuaW5kZXgpKX19ZnVuY3Rpb24gSW8obix0LGUpe3JldHVybiB4YShuLEhsKSxuLm5hbWVzcGFjZT10LG4uaWQ9ZSxufWZ1bmN0aW9uIFpvKG4sdCxlLHIpe3ZhciB1PW4uaWQsaT1uLm5hbWVzcGFjZTtyZXR1cm4gSChuLCJmdW5jdGlvbiI9PXR5cGVvZiBlP2Z1bmN0aW9uKG4sbyxhKXtuW2ldW3VdLnR3ZWVuLnNldCh0LHIoZS5jYWxsKG4sbi5fX2RhdGFfXyxvLGEpKSl9OihlPXIoZSksZnVuY3Rpb24obil7bltpXVt1XS50d2Vlbi5zZXQodCxlKX0pKX1mdW5jdGlvbiBWbyhuKXtyZXR1cm4gbnVsbD09biYmKG49IiIpLGZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD1ufX1mdW5jdGlvbiBYbyhuKXtyZXR1cm4gbnVsbD09bj8iX190cmFuc2l0aW9uX18iOiJfX3RyYW5zaXRpb25fIituKyJfXyJ9ZnVuY3Rpb24gJG8obix0LGUscix1KXt2YXIgaT1uW2VdfHwobltlXT17YWN0aXZlOjAsY291bnQ6MH0pLG89aVtyXTtpZighbyl7dmFyIGM9dS50aW1lO289aVtyXT17dHdlZW46bmV3IGEsdGltZTpjLGRlbGF5OnUuZGVsYXksZHVyYXRpb246dS5kdXJhdGlvbixlYXNlOnUuZWFzZSxpbmRleDp0fSx1PW51bGwsKytpLmNvdW50LHRhLnRpbWVyKGZ1bmN0aW9uKHUpe2Z1bmN0aW9uIGEoZSl7aWYoaS5hY3RpdmU+cilyZXR1cm4gcygpO3ZhciB1PWlbaS5hY3RpdmVdO3UmJigtLWkuY291bnQsZGVsZXRlIGlbaS5hY3RpdmVdLHUuZXZlbnQmJnUuZXZlbnQuaW50ZXJydXB0LmNhbGwobixuLl9fZGF0YV9fLHUuaW5kZXgpKSxpLmFjdGl2ZT1yLG8uZXZlbnQmJm8uZXZlbnQuc3RhcnQuY2FsbChuLG4uX19kYXRhX18sdCksby50d2Vlbi5mb3JFYWNoKGZ1bmN0aW9uKGUscil7KHI9ci5jYWxsKG4sbi5fX2RhdGFfXyx0KSkmJnYucHVzaChyKX0pLGg9by5lYXNlLGY9by5kdXJhdGlvbix0YS50aW1lcihmdW5jdGlvbigpe3JldHVybiBwLmM9bChlfHwxKT9OZTpsLDF9LDAsYyl9ZnVuY3Rpb24gbChlKXtpZihpLmFjdGl2ZSE9PXIpcmV0dXJuIDE7Zm9yKHZhciB1PWUvZixhPWgodSksYz12Lmxlbmd0aDtjPjA7KXZbLS1jXS5jYWxsKG4sYSk7cmV0dXJuIHU+PTE/KG8uZXZlbnQmJm8uZXZlbnQuZW5kLmNhbGwobixuLl9fZGF0YV9fLHQpLHMoKSk6dm9pZCAwfWZ1bmN0aW9uIHMoKXtyZXR1cm4tLWkuY291bnQ/ZGVsZXRlIGlbcl06ZGVsZXRlIG5bZV0sMX12YXIgZixoLGc9by5kZWxheSxwPW9jLHY9W107cmV0dXJuIHAudD1nK2MsdT49Zz9hKHUtZyk6KHAuYz1hLHZvaWQgMCl9LDAsYyl9fWZ1bmN0aW9uIEJvKG4sdCxlKXtuLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24obil7dmFyIHI9dChuKTtyZXR1cm4idHJhbnNsYXRlKCIrKGlzRmluaXRlKHIpP3I6ZShuKSkrIiwwKSJ9KX1mdW5jdGlvbiBXbyhuLHQsZSl7bi5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKG4pe3ZhciByPXQobik7cmV0dXJuInRyYW5zbGF0ZSgwLCIrKGlzRmluaXRlKHIpP3I6ZShuKSkrIikifSl9ZnVuY3Rpb24gSm8obil7cmV0dXJuIG4udG9JU09TdHJpbmcoKX1mdW5jdGlvbiBHbyhuLHQsZSl7ZnVuY3Rpb24gcih0KXtyZXR1cm4gbih0KX1mdW5jdGlvbiB1KG4sZSl7dmFyIHI9blsxXS1uWzBdLHU9ci9lLGk9dGEuYmlzZWN0KFdsLHUpO3JldHVybiBpPT1XbC5sZW5ndGg/W3QueWVhcixWaShuLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gbi8zMTUzNmU2fSksZSlbMl1dOmk/dFt1L1dsW2ktMV08V2xbaV0vdT9pLTE6aV06W0tsLFZpKG4sZSlbMl1dfXJldHVybiByLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gS28obi5pbnZlcnQodCkpfSxyLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obi5kb21haW4odCkscik6bi5kb21haW4oKS5tYXAoS28pfSxyLm5pY2U9ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKGUpe3JldHVybiFpc05hTihlKSYmIW4ucmFuZ2UoZSxLbygrZSsxKSx0KS5sZW5ndGh9dmFyIGk9ci5kb21haW4oKSxvPVBpKGkpLGE9bnVsbD09bj91KG8sMTApOiJudW1iZXIiPT10eXBlb2YgbiYmdShvLG4pO3JldHVybiBhJiYobj1hWzBdLHQ9YVsxXSksci5kb21haW4oRmkoaSx0PjE/e2Zsb29yOmZ1bmN0aW9uKHQpe2Zvcig7ZSh0PW4uZmxvb3IodCkpOyl0PUtvKHQtMSk7cmV0dXJuIHR9LGNlaWw6ZnVuY3Rpb24odCl7Zm9yKDtlKHQ9bi5jZWlsKHQpKTspdD1LbygrdCsxKTtyZXR1cm4gdH19Om4pKX0sci50aWNrcz1mdW5jdGlvbihuLHQpe3ZhciBlPVBpKHIuZG9tYWluKCkpLGk9bnVsbD09bj91KGUsMTApOiJudW1iZXIiPT10eXBlb2Ygbj91KGUsbik6IW4ucmFuZ2UmJlt7cmFuZ2U6bn0sdF07cmV0dXJuIGkmJihuPWlbMF0sdD1pWzFdKSxuLnJhbmdlKGVbMF0sS28oK2VbMV0rMSksMT50PzE6dCl9LHIudGlja0Zvcm1hdD1mdW5jdGlvbigpe3JldHVybiBlfSxyLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gR28obi5jb3B5KCksdCxlKX0sSWkocixuKX1mdW5jdGlvbiBLbyhuKXtyZXR1cm4gbmV3IERhdGUobil9ZnVuY3Rpb24gUW8obil7cmV0dXJuIEpTT04ucGFyc2Uobi5yZXNwb25zZVRleHQpfWZ1bmN0aW9uIG5hKG4pe3ZhciB0PXVhLmNyZWF0ZVJhbmdlKCk7cmV0dXJuIHQuc2VsZWN0Tm9kZSh1YS5ib2R5KSx0LmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChuLnJlc3BvbnNlVGV4dCl9dmFyIHRhPXt2ZXJzaW9uOiIzLjUuMiJ9O0RhdGUubm93fHwoRGF0ZS5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4rbmV3IERhdGV9KTt2YXIgZWE9W10uc2xpY2UscmE9ZnVuY3Rpb24obil7cmV0dXJuIGVhLmNhbGwobil9LHVhPWRvY3VtZW50LGlhPXVhLmRvY3VtZW50RWxlbWVudCxvYT13aW5kb3c7dHJ5e3JhKGlhLmNoaWxkTm9kZXMpWzBdLm5vZGVUeXBlfWNhdGNoKGFhKXtyYT1mdW5jdGlvbihuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT1uZXcgQXJyYXkodCk7dC0tOyllW3RdPW5bdF07cmV0dXJuIGV9fXRyeXt1YS5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZS5zZXRQcm9wZXJ0eSgib3BhY2l0eSIsMCwiIil9Y2F0Y2goY2Epe3ZhciBsYT1vYS5FbGVtZW50LnByb3RvdHlwZSxzYT1sYS5zZXRBdHRyaWJ1dGUsZmE9bGEuc2V0QXR0cmlidXRlTlMsaGE9b2EuQ1NTU3R5bGVEZWNsYXJhdGlvbi5wcm90b3R5cGUsZ2E9aGEuc2V0UHJvcGVydHk7bGEuc2V0QXR0cmlidXRlPWZ1bmN0aW9uKG4sdCl7c2EuY2FsbCh0aGlzLG4sdCsiIil9LGxhLnNldEF0dHJpYnV0ZU5TPWZ1bmN0aW9uKG4sdCxlKXtmYS5jYWxsKHRoaXMsbix0LGUrIiIpfSxoYS5zZXRQcm9wZXJ0eT1mdW5jdGlvbihuLHQsZSl7Z2EuY2FsbCh0aGlzLG4sdCsiIixlKX19dGEuYXNjZW5kaW5nPW4sdGEuZGVzY2VuZGluZz1mdW5jdGlvbihuLHQpe3JldHVybiBuPnQ/LTE6dD5uPzE6dD49bj8wOjAvMH0sdGEubWluPWZ1bmN0aW9uKG4sdCl7dmFyIGUscix1PS0xLGk9bi5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcig7Kyt1PGk7KWlmKG51bGwhPShyPW5bdV0pJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK3U8aTspbnVsbCE9KHI9blt1XSkmJmU+ciYmKGU9cil9ZWxzZXtmb3IoOysrdTxpOylpZihudWxsIT0ocj10LmNhbGwobixuW3VdLHUpKSYmcj49cil7ZT1yO2JyZWFrfWZvcig7Kyt1PGk7KW51bGwhPShyPXQuY2FsbChuLG5bdV0sdSkpJiZlPnImJihlPXIpfXJldHVybiBlfSx0YS5tYXg9ZnVuY3Rpb24obix0KXt2YXIgZSxyLHU9LTEsaT1uLmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKDsrK3U8aTspaWYobnVsbCE9KHI9blt1XSkmJnI+PXIpe2U9cjticmVha31mb3IoOysrdTxpOyludWxsIT0ocj1uW3VdKSYmcj5lJiYoZT1yKX1lbHNle2Zvcig7Kyt1PGk7KWlmKG51bGwhPShyPXQuY2FsbChuLG5bdV0sdSkpJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK3U8aTspbnVsbCE9KHI9dC5jYWxsKG4sblt1XSx1KSkmJnI+ZSYmKGU9cil9cmV0dXJuIGV9LHRhLmV4dGVudD1mdW5jdGlvbihuLHQpe3ZhciBlLHIsdSxpPS0xLG89bi5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcig7KytpPG87KWlmKG51bGwhPShyPW5baV0pJiZyPj1yKXtlPXU9cjticmVha31mb3IoOysraTxvOyludWxsIT0ocj1uW2ldKSYmKGU+ciYmKGU9cikscj51JiYodT1yKSl9ZWxzZXtmb3IoOysraTxvOylpZihudWxsIT0ocj10LmNhbGwobixuW2ldLGkpKSYmcj49cil7ZT11PXI7YnJlYWt9Zm9yKDsrK2k8bzspbnVsbCE9KHI9dC5jYWxsKG4sbltpXSxpKSkmJihlPnImJihlPXIpLHI+dSYmKHU9cikpfXJldHVybltlLHVdfSx0YS5zdW09ZnVuY3Rpb24obix0KXt2YXIgcix1PTAsaT1uLmxlbmd0aCxvPS0xO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7KytvPGk7KWUocj0rbltvXSkmJih1Kz1yKTtlbHNlIGZvcig7KytvPGk7KWUocj0rdC5jYWxsKG4sbltvXSxvKSkmJih1Kz1yKTtyZXR1cm4gdX0sdGEubWVhbj1mdW5jdGlvbihuLHIpe3ZhciB1LGk9MCxvPW4ubGVuZ3RoLGE9LTEsYz1vO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7KythPG87KWUodT10KG5bYV0pKT9pKz11Oi0tYztlbHNlIGZvcig7KythPG87KWUodT10KHIuY2FsbChuLG5bYV0sYSkpKT9pKz11Oi0tYztyZXR1cm4gYz9pL2M6dm9pZCAwfSx0YS5xdWFudGlsZT1mdW5jdGlvbihuLHQpe3ZhciBlPShuLmxlbmd0aC0xKSp0KzEscj1NYXRoLmZsb29yKGUpLHU9K25bci0xXSxpPWUtcjtyZXR1cm4gaT91K2kqKG5bcl0tdSk6dX0sdGEubWVkaWFuPWZ1bmN0aW9uKHIsdSl7dmFyIGksbz1bXSxhPXIubGVuZ3RoLGM9LTE7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2M8YTspZShpPXQocltjXSkpJiZvLnB1c2goaSk7ZWxzZSBmb3IoOysrYzxhOyllKGk9dCh1LmNhbGwocixyW2NdLGMpKSkmJm8ucHVzaChpKTtyZXR1cm4gby5sZW5ndGg/dGEucXVhbnRpbGUoby5zb3J0KG4pLC41KTp2b2lkIDB9LHRhLnZhcmlhbmNlPWZ1bmN0aW9uKG4scil7dmFyIHUsaSxvPW4ubGVuZ3RoLGE9MCxjPTAsbD0tMSxzPTA7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2w8bzspZSh1PXQobltsXSkpJiYoaT11LWEsYSs9aS8rK3MsYys9aSoodS1hKSk7ZWxzZSBmb3IoOysrbDxvOyllKHU9dChyLmNhbGwobixuW2xdLGwpKSkmJihpPXUtYSxhKz1pLysrcyxjKz1pKih1LWEpKTtyZXR1cm4gcz4xP2MvKHMtMSk6dm9pZCAwfSx0YS5kZXZpYXRpb249ZnVuY3Rpb24oKXt2YXIgbj10YS52YXJpYW5jZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG4/TWF0aC5zcXJ0KG4pOm59O3ZhciBwYT1yKG4pO3RhLmJpc2VjdExlZnQ9cGEubGVmdCx0YS5iaXNlY3Q9dGEuYmlzZWN0UmlnaHQ9cGEucmlnaHQsdGEuYmlzZWN0b3I9ZnVuY3Rpb24odCl7cmV0dXJuIHIoMT09PXQubGVuZ3RoP2Z1bmN0aW9uKGUscil7cmV0dXJuIG4odChlKSxyKX06dCl9LHRhLnNodWZmbGU9ZnVuY3Rpb24obix0LGUpeyhpPWFyZ3VtZW50cy5sZW5ndGgpPDMmJihlPW4ubGVuZ3RoLDI+aSYmKHQ9MCkpO2Zvcih2YXIgcix1LGk9ZS10O2k7KXU9MHxNYXRoLnJhbmRvbSgpKmktLSxyPW5baSt0XSxuW2krdF09blt1K3RdLG5bdSt0XT1yO3JldHVybiBufSx0YS5wZXJtdXRlPWZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPXQubGVuZ3RoLHI9bmV3IEFycmF5KGUpO2UtLTspcltlXT1uW3RbZV1dO3JldHVybiByfSx0YS5wYWlycz1mdW5jdGlvbihuKXtmb3IodmFyIHQsZT0wLHI9bi5sZW5ndGgtMSx1PW5bMF0saT1uZXcgQXJyYXkoMD5yPzA6cik7cj5lOylpW2VdPVt0PXUsdT1uWysrZV1dO3JldHVybiBpfSx0YS56aXA9ZnVuY3Rpb24oKXtpZighKHI9YXJndW1lbnRzLmxlbmd0aCkpcmV0dXJuW107Zm9yKHZhciBuPS0xLHQ9dGEubWluKGFyZ3VtZW50cyx1KSxlPW5ldyBBcnJheSh0KTsrK248dDspZm9yKHZhciByLGk9LTEsbz1lW25dPW5ldyBBcnJheShyKTsrK2k8cjspb1tpXT1hcmd1bWVudHNbaV1bbl07cmV0dXJuIGV9LHRhLnRyYW5zcG9zZT1mdW5jdGlvbihuKXtyZXR1cm4gdGEuemlwLmFwcGx5KHRhLG4pfSx0YS5rZXlzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiBuKXQucHVzaChlKTtyZXR1cm4gdH0sdGEudmFsdWVzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiBuKXQucHVzaChuW2VdKTtyZXR1cm4gdH0sdGEuZW50cmllcz1mdW5jdGlvbihuKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gbil0LnB1c2goe2tleTplLHZhbHVlOm5bZV19KTtyZXR1cm4gdH0sdGEubWVyZ2U9ZnVuY3Rpb24obil7Zm9yKHZhciB0LGUscix1PW4ubGVuZ3RoLGk9LTEsbz0wOysraTx1OylvKz1uW2ldLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkobyk7LS11Pj0wOylmb3Iocj1uW3VdLHQ9ci5sZW5ndGg7LS10Pj0wOyllWy0tb109clt0XTtyZXR1cm4gZX07dmFyIHZhPU1hdGguYWJzO3RhLnJhbmdlPWZ1bmN0aW9uKG4sdCxlKXtpZihhcmd1bWVudHMubGVuZ3RoPDMmJihlPTEsYXJndW1lbnRzLmxlbmd0aDwyJiYodD1uLG49MCkpLDEvMD09PSh0LW4pL2UpdGhyb3cgbmV3IEVycm9yKCJpbmZpbml0ZSByYW5nZSIpO3ZhciByLHU9W10sbz1pKHZhKGUpKSxhPS0xO2lmKG4qPW8sdCo9byxlKj1vLDA+ZSlmb3IoOyhyPW4rZSorK2EpPnQ7KXUucHVzaChyL28pO2Vsc2UgZm9yKDsocj1uK2UqKythKTx0Oyl1LnB1c2goci9vKTtyZXR1cm4gdX0sdGEubWFwPWZ1bmN0aW9uKG4sdCl7dmFyIGU9bmV3IGE7aWYobiBpbnN0YW5jZW9mIGEpbi5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7ZS5zZXQobix0KX0pO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShuKSl7dmFyIHIsdT0tMSxpPW4ubGVuZ3RoO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7Kyt1PGk7KWUuc2V0KHUsblt1XSk7ZWxzZSBmb3IoOysrdTxpOyllLnNldCh0LmNhbGwobixyPW5bdV0sdSkscil9ZWxzZSBmb3IodmFyIG8gaW4gbillLnNldChvLG5bb10pO3JldHVybiBlfTt2YXIgZGE9Il9fcHJvdG9fXyIsbWE9Ilx4MDAiO28oYSx7aGFzOnMsZ2V0OmZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLl9bYyhuKV19LHNldDpmdW5jdGlvbihuLHQpe3JldHVybiB0aGlzLl9bYyhuKV09dH0scmVtb3ZlOmYsa2V5czpoLHZhbHVlczpmdW5jdGlvbigpe3ZhciBuPVtdO2Zvcih2YXIgdCBpbiB0aGlzLl8pbi5wdXNoKHRoaXMuX1t0XSk7cmV0dXJuIG59LGVudHJpZXM6ZnVuY3Rpb24oKXt2YXIgbj1bXTtmb3IodmFyIHQgaW4gdGhpcy5fKW4ucHVzaCh7a2V5OmwodCksdmFsdWU6dGhpcy5fW3RdfSk7cmV0dXJuIG59LHNpemU6ZyxlbXB0eTpwLGZvckVhY2g6ZnVuY3Rpb24obil7Zm9yKHZhciB0IGluIHRoaXMuXyluLmNhbGwodGhpcyxsKHQpLHRoaXMuX1t0XSl9fSksdGEubmVzdD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odCxvLGMpe2lmKGM+PWkubGVuZ3RoKXJldHVybiByP3IuY2FsbCh1LG8pOmU/by5zb3J0KGUpOm87Zm9yKHZhciBsLHMsZixoLGc9LTEscD1vLmxlbmd0aCx2PWlbYysrXSxkPW5ldyBhOysrZzxwOykoaD1kLmdldChsPXYocz1vW2ddKSkpP2gucHVzaChzKTpkLnNldChsLFtzXSk7cmV0dXJuIHQ/KHM9dCgpLGY9ZnVuY3Rpb24oZSxyKXtzLnNldChlLG4odCxyLGMpKX0pOihzPXt9LGY9ZnVuY3Rpb24oZSxyKXtzW2VdPW4odCxyLGMpfSksZC5mb3JFYWNoKGYpLHN9ZnVuY3Rpb24gdChuLGUpe2lmKGU+PWkubGVuZ3RoKXJldHVybiBuO3ZhciByPVtdLHU9b1tlKytdO3JldHVybiBuLmZvckVhY2goZnVuY3Rpb24obix1KXtyLnB1c2goe2tleTpuLHZhbHVlczp0KHUsZSl9KX0pLHU/ci5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIHUobi5rZXksdC5rZXkpfSk6cn12YXIgZSxyLHU9e30saT1bXSxvPVtdO3JldHVybiB1Lm1hcD1mdW5jdGlvbih0LGUpe3JldHVybiBuKGUsdCwwKX0sdS5lbnRyaWVzPWZ1bmN0aW9uKGUpe3JldHVybiB0KG4odGEubWFwLGUsMCksMCl9LHUua2V5PWZ1bmN0aW9uKG4pe3JldHVybiBpLnB1c2gobiksdX0sdS5zb3J0S2V5cz1mdW5jdGlvbihuKXtyZXR1cm4gb1tpLmxlbmd0aC0xXT1uLHV9LHUuc29ydFZhbHVlcz1mdW5jdGlvbihuKXtyZXR1cm4gZT1uLHV9LHUucm9sbHVwPWZ1bmN0aW9uKG4pe3JldHVybiByPW4sdX0sdX0sdGEuc2V0PWZ1bmN0aW9uKG4pe3ZhciB0PW5ldyB2O2lmKG4pZm9yKHZhciBlPTAscj1uLmxlbmd0aDtyPmU7KytlKXQuYWRkKG5bZV0pO3JldHVybiB0fSxvKHYse2hhczpzLGFkZDpmdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5fW2Mobis9IiIpXT0hMCxufSxyZW1vdmU6Zix2YWx1ZXM6aCxzaXplOmcsZW1wdHk6cCxmb3JFYWNoOmZ1bmN0aW9uKG4pe2Zvcih2YXIgdCBpbiB0aGlzLl8pbi5jYWxsKHRoaXMsbCh0KSl9fSksdGEuYmVoYXZpb3I9e30sdGEucmViaW5kPWZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlLHI9MSx1PWFyZ3VtZW50cy5sZW5ndGg7KytyPHU7KW5bZT1hcmd1bWVudHNbcl1dPWQobix0LHRbZV0pO3JldHVybiBufTt2YXIgeWE9WyJ3ZWJraXQiLCJtcyIsIm1veiIsIk1veiIsIm8iLCJPIl07dGEuZGlzcGF0Y2g9ZnVuY3Rpb24oKXtmb3IodmFyIG49bmV3IE0sdD0tMSxlPWFyZ3VtZW50cy5sZW5ndGg7Kyt0PGU7KW5bYXJndW1lbnRzW3RdXT14KG4pO3JldHVybiBufSxNLnByb3RvdHlwZS5vbj1mdW5jdGlvbihuLHQpe3ZhciBlPW4uaW5kZXhPZigiLiIpLHI9IiI7aWYoZT49MCYmKHI9bi5zbGljZShlKzEpLG49bi5zbGljZSgwLGUpKSxuKXJldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/dGhpc1tuXS5vbihyKTp0aGlzW25dLm9uKHIsdCk7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKG51bGw9PXQpZm9yKG4gaW4gdGhpcyl0aGlzLmhhc093blByb3BlcnR5KG4pJiZ0aGlzW25dLm9uKHIsbnVsbCk7cmV0dXJuIHRoaXN9fSx0YS5ldmVudD1udWxsLHRhLnJlcXVvdGU9ZnVuY3Rpb24obil7cmV0dXJuIG4ucmVwbGFjZShNYSwiXFwkJiIpfTt2YXIgTWE9L1tcXFxeXCRcKlwrXD9cfFxbXF1cKFwpXC5ce1x9XS9nLHhhPXt9Ll9fcHJvdG9fXz9mdW5jdGlvbihuLHQpe24uX19wcm90b19fPXR9OmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlIGluIHQpbltlXT10W2VdfSxiYT1mdW5jdGlvbihuLHQpe3JldHVybiB0LnF1ZXJ5U2VsZWN0b3Iobil9LF9hPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHQucXVlcnlTZWxlY3RvckFsbChuKX0sd2E9aWEubWF0Y2hlc3x8aWFbbShpYSwibWF0Y2hlc1NlbGVjdG9yIildLFNhPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHdhLmNhbGwobix0KX07ImZ1bmN0aW9uIj09dHlwZW9mIFNpenpsZSYmKGJhPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIFNpenpsZShuLHQpWzBdfHxudWxsfSxfYT1TaXp6bGUsU2E9U2l6emxlLm1hdGNoZXNTZWxlY3RvciksdGEuc2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIE5hfTt2YXIga2E9dGEuc2VsZWN0aW9uLnByb3RvdHlwZT1bXTtrYS5zZWxlY3Q9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHUsaT1bXTtuPWsobik7Zm9yKHZhciBvPS0xLGE9dGhpcy5sZW5ndGg7KytvPGE7KXtpLnB1c2godD1bXSksdC5wYXJlbnROb2RlPShyPXRoaXNbb10pLnBhcmVudE5vZGU7Zm9yKHZhciBjPS0xLGw9ci5sZW5ndGg7KytjPGw7KSh1PXJbY10pPyh0LnB1c2goZT1uLmNhbGwodSx1Ll9fZGF0YV9fLGMsbykpLGUmJiJfX2RhdGFfXyJpbiB1JiYoZS5fX2RhdGFfXz11Ll9fZGF0YV9fKSk6dC5wdXNoKG51bGwpfXJldHVybiBTKGkpfSxrYS5zZWxlY3RBbGw9ZnVuY3Rpb24obil7dmFyIHQsZSxyPVtdO249RShuKTtmb3IodmFyIHU9LTEsaT10aGlzLmxlbmd0aDsrK3U8aTspZm9yKHZhciBvPXRoaXNbdV0sYT0tMSxjPW8ubGVuZ3RoOysrYTxjOykoZT1vW2FdKSYmKHIucHVzaCh0PXJhKG4uY2FsbChlLGUuX19kYXRhX18sYSx1KSkpLHQucGFyZW50Tm9kZT1lKTtyZXR1cm4gUyhyKX07dmFyIEVhPXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTt0YS5ucz17cHJlZml4OkVhLHF1YWxpZnk6ZnVuY3Rpb24obil7dmFyIHQ9bi5pbmRleE9mKCI6IiksZT1uO3JldHVybiB0Pj0wJiYoZT1uLnNsaWNlKDAsdCksbj1uLnNsaWNlKHQrMSkpLEVhLmhhc093blByb3BlcnR5KGUpP3tzcGFjZTpFYVtlXSxsb2NhbDpufTpufX0sa2EuYXR0cj1mdW5jdGlvbihuLHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7aWYoInN0cmluZyI9PXR5cGVvZiBuKXt2YXIgZT10aGlzLm5vZGUoKTtyZXR1cm4gbj10YS5ucy5xdWFsaWZ5KG4pLG4ubG9jYWw/ZS5nZXRBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpOmUuZ2V0QXR0cmlidXRlKG4pfWZvcih0IGluIG4pdGhpcy5lYWNoKEEodCxuW3RdKSk7cmV0dXJuIHRoaXN9cmV0dXJuIHRoaXMuZWFjaChBKG4sdCkpfSxrYS5jbGFzc2VkPWZ1bmN0aW9uKG4sdCl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtpZigic3RyaW5nIj09dHlwZW9mIG4pe3ZhciBlPXRoaXMubm9kZSgpLHI9KG49eihuKSkubGVuZ3RoLHU9LTE7aWYodD1lLmNsYXNzTGlzdCl7Zm9yKDsrK3U8cjspaWYoIXQuY29udGFpbnMoblt1XSkpcmV0dXJuITF9ZWxzZSBmb3IodD1lLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsrK3U8cjspaWYoIUMoblt1XSkudGVzdCh0KSlyZXR1cm4hMTtyZXR1cm4hMH1mb3IodCBpbiBuKXRoaXMuZWFjaChxKHQsblt0XSkpO3JldHVybiB0aGlzfXJldHVybiB0aGlzLmVhY2gocShuLHQpKX0sa2Euc3R5bGU9ZnVuY3Rpb24obix0LGUpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg7aWYoMz5yKXtpZigic3RyaW5nIiE9dHlwZW9mIG4pezI+ciYmKHQ9IiIpO2ZvcihlIGluIG4pdGhpcy5lYWNoKFQoZSxuW2VdLHQpKTtyZXR1cm4gdGhpc31pZigyPnIpcmV0dXJuIG9hLmdldENvbXB1dGVkU3R5bGUodGhpcy5ub2RlKCksbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuKTtlPSIifXJldHVybiB0aGlzLmVhY2goVChuLHQsZSkpfSxrYS5wcm9wZXJ0eT1mdW5jdGlvbihuLHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7aWYoInN0cmluZyI9PXR5cGVvZiBuKXJldHVybiB0aGlzLm5vZGUoKVtuXTtmb3IodCBpbiBuKXRoaXMuZWFjaChSKHQsblt0XSkpO3JldHVybiB0aGlzfXJldHVybiB0aGlzLmVhY2goUihuLHQpKX0sa2EudGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24oKXt2YXIgdD1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PXQ/IiI6dH06bnVsbD09bj9mdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9IiJ9OmZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD1ufSk6dGhpcy5ub2RlKCkudGV4dENvbnRlbnR9LGthLmh0bWw9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKCl7dmFyIHQ9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pbm5lckhUTUw9bnVsbD09dD8iIjp0fTpudWxsPT1uP2Z1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9IiJ9OmZ1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9bn0pOnRoaXMubm9kZSgpLmlubmVySFRNTH0sa2EuYXBwZW5kPWZ1bmN0aW9uKG4pe3JldHVybiBuPUQobiksdGhpcy5zZWxlY3QoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9KX0sa2EuaW5zZXJ0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49RChuKSx0PWsodCksdGhpcy5zZWxlY3QoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUobi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fG51bGwpfSl9LGthLnJlbW92ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goUCl9LGthLmRhdGE9ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKG4sZSl7dmFyIHIsdSxpLG89bi5sZW5ndGgsZj1lLmxlbmd0aCxoPU1hdGgubWluKG8sZiksZz1uZXcgQXJyYXkoZikscD1uZXcgQXJyYXkoZiksdj1uZXcgQXJyYXkobyk7aWYodCl7dmFyIGQsbT1uZXcgYSx5PW5ldyBBcnJheShvKTtmb3Iocj0tMTsrK3I8bzspbS5oYXMoZD10LmNhbGwodT1uW3JdLHUuX19kYXRhX18scikpP3Zbcl09dTptLnNldChkLHUpLHlbcl09ZDtmb3Iocj0tMTsrK3I8ZjspKHU9bS5nZXQoZD10LmNhbGwoZSxpPWVbcl0scikpKT91IT09ITAmJihnW3JdPXUsdS5fX2RhdGFfXz1pKTpwW3JdPVUoaSksbS5zZXQoZCwhMCk7Zm9yKHI9LTE7KytyPG87KW0uZ2V0KHlbcl0pIT09ITAmJih2W3JdPW5bcl0pfWVsc2V7Zm9yKHI9LTE7KytyPGg7KXU9bltyXSxpPWVbcl0sdT8odS5fX2RhdGFfXz1pLGdbcl09dSk6cFtyXT1VKGkpO2Zvcig7Zj5yOysrcilwW3JdPVUoZVtyXSk7Zm9yKDtvPnI7KytyKXZbcl09bltyXX1wLnVwZGF0ZT1nLHAucGFyZW50Tm9kZT1nLnBhcmVudE5vZGU9di5wYXJlbnROb2RlPW4ucGFyZW50Tm9kZSxjLnB1c2gocCksbC5wdXNoKGcpLHMucHVzaCh2KX12YXIgcix1LGk9LTEsbz10aGlzLmxlbmd0aDtpZighYXJndW1lbnRzLmxlbmd0aCl7Zm9yKG49bmV3IEFycmF5KG89KHI9dGhpc1swXSkubGVuZ3RoKTsrK2k8bzspKHU9cltpXSkmJihuW2ldPXUuX19kYXRhX18pO3JldHVybiBufXZhciBjPU8oW10pLGw9UyhbXSkscz1TKFtdKTtpZigiZnVuY3Rpb24iPT10eXBlb2Ygbilmb3IoOysraTxvOyllKHI9dGhpc1tpXSxuLmNhbGwocixyLnBhcmVudE5vZGUuX19kYXRhX18saSkpO2Vsc2UgZm9yKDsrK2k8bzspZShyPXRoaXNbaV0sbik7cmV0dXJuIGwuZW50ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gY30sbC5leGl0PWZ1bmN0aW9uKCl7cmV0dXJuIHN9LGx9LGthLmRhdHVtPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMucHJvcGVydHkoIl9fZGF0YV9fIixuKTp0aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIpfSxrYS5maWx0ZXI9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHU9W107ImZ1bmN0aW9uIiE9dHlwZW9mIG4mJihuPWoobikpO2Zvcih2YXIgaT0wLG89dGhpcy5sZW5ndGg7bz5pO2krKyl7dS5wdXNoKHQ9W10pLHQucGFyZW50Tm9kZT0oZT10aGlzW2ldKS5wYXJlbnROb2RlO2Zvcih2YXIgYT0wLGM9ZS5sZW5ndGg7Yz5hO2ErKykocj1lW2FdKSYmbi5jYWxsKHIsci5fX2RhdGFfXyxhLGkpJiZ0LnB1c2gocil9cmV0dXJuIFModSl9LGthLm9yZGVyPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPS0xLHQ9dGhpcy5sZW5ndGg7KytuPHQ7KWZvcih2YXIgZSxyPXRoaXNbbl0sdT1yLmxlbmd0aC0xLGk9clt1XTstLXU+PTA7KShlPXJbdV0pJiYoaSYmaSE9PWUubmV4dFNpYmxpbmcmJmkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxpKSxpPWUpO3JldHVybiB0aGlzfSxrYS5zb3J0PWZ1bmN0aW9uKG4pe249Ri5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Zm9yKHZhciB0PS0xLGU9dGhpcy5sZW5ndGg7Kyt0PGU7KXRoaXNbdF0uc29ydChuKTtyZXR1cm4gdGhpcy5vcmRlcigpfSxrYS5lYWNoPWZ1bmN0aW9uKG4pe3JldHVybiBIKHRoaXMsZnVuY3Rpb24odCxlLHIpe24uY2FsbCh0LHQuX19kYXRhX18sZSxyKX0pfSxrYS5jYWxsPWZ1bmN0aW9uKG4pe3ZhciB0PXJhKGFyZ3VtZW50cyk7cmV0dXJuIG4uYXBwbHkodFswXT10aGlzLHQpLHRoaXN9LGthLmVtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMubm9kZSgpfSxrYS5ub2RlPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPTAsdD10aGlzLmxlbmd0aDt0Pm47bisrKWZvcih2YXIgZT10aGlzW25dLHI9MCx1PWUubGVuZ3RoO3U+cjtyKyspe3ZhciBpPWVbcl07aWYoaSlyZXR1cm4gaX1yZXR1cm4gbnVsbH0sa2Euc2l6ZT1mdW5jdGlvbigpe3ZhciBuPTA7cmV0dXJuIEgodGhpcyxmdW5jdGlvbigpeysrbn0pLG59O3ZhciBBYT1bXTt0YS5zZWxlY3Rpb24uZW50ZXI9Tyx0YS5zZWxlY3Rpb24uZW50ZXIucHJvdG90eXBlPUFhLEFhLmFwcGVuZD1rYS5hcHBlbmQsQWEuZW1wdHk9a2EuZW1wdHksQWEubm9kZT1rYS5ub2RlLEFhLmNhbGw9a2EuY2FsbCxBYS5zaXplPWthLnNpemUsQWEuc2VsZWN0PWZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxlLHIsdSxpLG89W10sYT0tMSxjPXRoaXMubGVuZ3RoOysrYTxjOyl7cj0odT10aGlzW2FdKS51cGRhdGUsby5wdXNoKHQ9W10pLHQucGFyZW50Tm9kZT11LnBhcmVudE5vZGU7Zm9yKHZhciBsPS0xLHM9dS5sZW5ndGg7KytsPHM7KShpPXVbbF0pPyh0LnB1c2gocltsXT1lPW4uY2FsbCh1LnBhcmVudE5vZGUsaS5fX2RhdGFfXyxsLGEpKSxlLl9fZGF0YV9fPWkuX19kYXRhX18pOnQucHVzaChudWxsKX1yZXR1cm4gUyhvKX0sQWEuaW5zZXJ0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MiYmKHQ9WSh0aGlzKSksa2EuaW5zZXJ0LmNhbGwodGhpcyxuLHQpfSx0YS5zZWxlY3Q9ZnVuY3Rpb24obil7dmFyIHQ9WyJzdHJpbmciPT10eXBlb2Ygbj9iYShuLHVhKTpuXTtyZXR1cm4gdC5wYXJlbnROb2RlPWlhLFMoW3RdKX0sdGEuc2VsZWN0QWxsPWZ1bmN0aW9uKG4pe3ZhciB0PXJhKCJzdHJpbmciPT10eXBlb2Ygbj9fYShuLHVhKTpuKTtyZXR1cm4gdC5wYXJlbnROb2RlPWlhLFMoW3RdKX07dmFyIE5hPXRhLnNlbGVjdChpYSk7a2Eub249ZnVuY3Rpb24obix0LGUpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg7aWYoMz5yKXtpZigic3RyaW5nIiE9dHlwZW9mIG4pezI+ciYmKHQ9ITEpO2ZvcihlIGluIG4pdGhpcy5lYWNoKEkoZSxuW2VdLHQpKTtyZXR1cm4gdGhpc31pZigyPnIpcmV0dXJuKHI9dGhpcy5ub2RlKClbIl9fb24iK25dKSYmci5fO2U9ITF9cmV0dXJuIHRoaXMuZWFjaChJKG4sdCxlKSl9O3ZhciBDYT10YS5tYXAoe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSk7Q2EuZm9yRWFjaChmdW5jdGlvbihuKXsib24iK24gaW4gdWEmJkNhLnJlbW92ZShuKX0pO3ZhciB6YT0ib25zZWxlY3RzdGFydCJpbiB1YT9udWxsOm0oaWEuc3R5bGUsInVzZXJTZWxlY3QiKSxxYT0wO3RhLm1vdXNlPWZ1bmN0aW9uKG4pe3JldHVybiAkKG4sXygpKX07dmFyIExhPS9XZWJLaXQvLnRlc3Qob2EubmF2aWdhdG9yLnVzZXJBZ2VudCk/LTE6MDt0YS50b3VjaD1mdW5jdGlvbihuLHQsZSl7aWYoYXJndW1lbnRzLmxlbmd0aDwzJiYoZT10LHQ9XygpLmNoYW5nZWRUb3VjaGVzKSx0KWZvcih2YXIgcix1PTAsaT10Lmxlbmd0aDtpPnU7Kyt1KWlmKChyPXRbdV0pLmlkZW50aWZpZXI9PT1lKXJldHVybiAkKG4scil9LHRhLmJlaGF2aW9yLmRyYWc9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7dGhpcy5vbigibW91c2Vkb3duLmRyYWciLHUpLm9uKCJ0b3VjaHN0YXJ0LmRyYWciLGkpfWZ1bmN0aW9uIHQobix0LHUsaSxvKXtyZXR1cm4gZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dmFyIG4sZSxyPXQoaCx2KTtyJiYobj1yWzBdLU1bMF0sZT1yWzFdLU1bMV0scHw9bnxlLE09cixnKHt0eXBlOiJkcmFnIix4OnJbMF0rbFswXSx5OnJbMV0rbFsxXSxkeDpuLGR5OmV9KSl9ZnVuY3Rpb24gYygpe3QoaCx2KSYmKG0ub24oaStkLG51bGwpLm9uKG8rZCxudWxsKSx5KHAmJnRhLmV2ZW50LnRhcmdldD09PWYpLGcoe3R5cGU6ImRyYWdlbmQifSkpfXZhciBsLHM9dGhpcyxmPXRhLmV2ZW50LnRhcmdldCxoPXMucGFyZW50Tm9kZSxnPWUub2Yocyxhcmd1bWVudHMpLHA9MCx2PW4oKSxkPSIuZHJhZyIrKG51bGw9PXY/IiI6Ii0iK3YpLG09dGEuc2VsZWN0KHUoKSkub24oaStkLGEpLm9uKG8rZCxjKSx5PVgoKSxNPXQoaCx2KTtyPyhsPXIuYXBwbHkocyxhcmd1bWVudHMpLGw9W2wueC1NWzBdLGwueS1NWzFdXSk6bD1bMCwwXSxnKHt0eXBlOiJkcmFnc3RhcnQifSl9fXZhciBlPXcobiwiZHJhZyIsImRyYWdzdGFydCIsImRyYWdlbmQiKSxyPW51bGwsdT10KHksdGEubW91c2UsSiwibW91c2Vtb3ZlIiwibW91c2V1cCIpLGk9dChCLHRhLnRvdWNoLFcsInRvdWNobW92ZSIsInRvdWNoZW5kIik7cmV0dXJuIG4ub3JpZ2luPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsbik6cn0sdGEucmViaW5kKG4sZSwib24iKX0sdGEudG91Y2hlcz1mdW5jdGlvbihuLHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDImJih0PV8oKS50b3VjaGVzKSx0P3JhKHQpLm1hcChmdW5jdGlvbih0KXt2YXIgZT0kKG4sdCk7cmV0dXJuIGUuaWRlbnRpZmllcj10LmlkZW50aWZpZXIsZX0pOltdfTt2YXIgVGE9MWUtNixSYT1UYSpUYSxEYT1NYXRoLlBJLFBhPTIqRGEsVWE9UGEtVGEsamE9RGEvMixGYT1EYS8xODAsSGE9MTgwL0RhLE9hPU1hdGguU1FSVDIsWWE9MixJYT00O3RhLmludGVycG9sYXRlWm9vbT1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobil7dmFyIHQ9bip5O2lmKG0pe3ZhciBlPWV0KHYpLG89aS8oWWEqaCkqKGUqcnQoT2EqdCt2KS10dCh2KSk7cmV0dXJuW3IrbypsLHUrbypzLGkqZS9ldChPYSp0K3YpXX1yZXR1cm5bcituKmwsdStuKnMsaSpNYXRoLmV4cChPYSp0KV19dmFyIHI9blswXSx1PW5bMV0saT1uWzJdLG89dFswXSxhPXRbMV0sYz10WzJdLGw9by1yLHM9YS11LGY9bCpsK3MqcyxoPU1hdGguc3FydChmKSxnPShjKmMtaSppK0lhKmYpLygyKmkqWWEqaCkscD0oYypjLWkqaS1JYSpmKS8oMipjKllhKmgpLHY9TWF0aC5sb2coTWF0aC5zcXJ0KGcqZysxKS1nKSxkPU1hdGgubG9nKE1hdGguc3FydChwKnArMSktcCksbT1kLXYseT0obXx8TWF0aC5sb2coYy9pKSkvT2E7cmV0dXJuIGUuZHVyYXRpb249MWUzKnksZX0sdGEuYmVoYXZpb3Iuem9vbT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7bi5vbih6LHMpLm9uKFhhKyIuem9vbSIsaCkub24oImRibGNsaWNrLnpvb20iLGcpLm9uKFQsZil9ZnVuY3Rpb24gdChuKXtyZXR1cm5bKG5bMF0tay54KS9rLmssKG5bMV0tay55KS9rLmtdfWZ1bmN0aW9uIGUobil7cmV0dXJuW25bMF0qay5rK2sueCxuWzFdKmsuaytrLnldfWZ1bmN0aW9uIHIobil7ay5rPU1hdGgubWF4KEFbMF0sTWF0aC5taW4oQVsxXSxuKSl9ZnVuY3Rpb24gdShuLHQpe3Q9ZSh0KSxrLngrPW5bMF0tdFswXSxrLnkrPW5bMV0tdFsxXX1mdW5jdGlvbiBpKHQsZSxpLG8pe3QuX19jaGFydF9fPXt4OmsueCx5OmsueSxrOmsua30scihNYXRoLnBvdygyLG8pKSx1KHY9ZSxpKSx0PXRhLnNlbGVjdCh0KSxOPjAmJih0PXQudHJhbnNpdGlvbigpLmR1cmF0aW9uKE4pKSx0LmNhbGwobi5ldmVudCl9ZnVuY3Rpb24gbygpe3gmJnguZG9tYWluKE0ucmFuZ2UoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuKG4tay54KS9rLmt9KS5tYXAoTS5pbnZlcnQpKSxTJiZTLmRvbWFpbihfLnJhbmdlKCkubWFwKGZ1bmN0aW9uKG4pe3JldHVybihuLWsueSkvay5rfSkubWFwKF8uaW52ZXJ0KSl9ZnVuY3Rpb24gYShuKXtDKyt8fG4oe3R5cGU6Inpvb21zdGFydCJ9KX1mdW5jdGlvbiBjKG4pe28oKSxuKHt0eXBlOiJ6b29tIixzY2FsZTprLmssdHJhbnNsYXRlOltrLngsay55XX0pfWZ1bmN0aW9uIGwobil7LS1DfHxuKHt0eXBlOiJ6b29tZW5kIn0pLHY9bnVsbH1mdW5jdGlvbiBzKCl7ZnVuY3Rpb24gbigpe3M9MSx1KHRhLm1vdXNlKHIpLGgpLGMobyl9ZnVuY3Rpb24gZSgpe2Yub24ocSxudWxsKS5vbihMLG51bGwpLGcocyYmdGEuZXZlbnQudGFyZ2V0PT09aSksbChvKX12YXIgcj10aGlzLGk9dGEuZXZlbnQudGFyZ2V0LG89Ui5vZihyLGFyZ3VtZW50cykscz0wLGY9dGEuc2VsZWN0KG9hKS5vbihxLG4pLm9uKEwsZSksaD10KHRhLm1vdXNlKHIpKSxnPVgoKTtGbC5jYWxsKHIpLGEobyl9ZnVuY3Rpb24gZigpe2Z1bmN0aW9uIG4oKXt2YXIgbj10YS50b3VjaGVzKHApO3JldHVybiBnPWsuayxuLmZvckVhY2goZnVuY3Rpb24obil7bi5pZGVudGlmaWVyIGluIGQmJihkW24uaWRlbnRpZmllcl09dChuKSl9KSxufWZ1bmN0aW9uIGUoKXt2YXIgdD10YS5ldmVudC50YXJnZXQ7dGEuc2VsZWN0KHQpLm9uKHgsbykub24oXyxoKSx3LnB1c2godCk7Zm9yKHZhciBlPXRhLmV2ZW50LmNoYW5nZWRUb3VjaGVzLHI9MCx1PWUubGVuZ3RoO3U+cjsrK3IpZFtlW3JdLmlkZW50aWZpZXJdPW51bGw7dmFyIGE9bigpLGM9RGF0ZS5ub3coKTtpZigxPT09YS5sZW5ndGgpe2lmKDUwMD5jLXkpe3ZhciBsPWFbMF07aShwLGwsZFtsLmlkZW50aWZpZXJdLE1hdGguZmxvb3IoTWF0aC5sb2coay5rKS9NYXRoLkxOMikrMSksYigpfXk9Y31lbHNlIGlmKGEubGVuZ3RoPjEpe3ZhciBsPWFbMF0scz1hWzFdLGY9bFswXS1zWzBdLGc9bFsxXS1zWzFdO209ZipmK2cqZ319ZnVuY3Rpb24gbygpe3ZhciBuLHQsZSxpLG89dGEudG91Y2hlcyhwKTtGbC5jYWxsKHApO2Zvcih2YXIgYT0wLGw9by5sZW5ndGg7bD5hOysrYSxpPW51bGwpaWYoZT1vW2FdLGk9ZFtlLmlkZW50aWZpZXJdKXtpZih0KWJyZWFrO249ZSx0PWl9aWYoaSl7dmFyIHM9KHM9ZVswXS1uWzBdKSpzKyhzPWVbMV0tblsxXSkqcyxmPW0mJk1hdGguc3FydChzL20pO249WyhuWzBdK2VbMF0pLzIsKG5bMV0rZVsxXSkvMl0sdD1bKHRbMF0raVswXSkvMiwodFsxXStpWzFdKS8yXSxyKGYqZyl9eT1udWxsLHUobix0KSxjKHYpfWZ1bmN0aW9uIGgoKXtpZih0YS5ldmVudC50b3VjaGVzLmxlbmd0aCl7Zm9yKHZhciB0PXRhLmV2ZW50LmNoYW5nZWRUb3VjaGVzLGU9MCxyPXQubGVuZ3RoO3I+ZTsrK2UpZGVsZXRlIGRbdFtlXS5pZGVudGlmaWVyXTtmb3IodmFyIHUgaW4gZClyZXR1cm4gdm9pZCBuKCl9dGEuc2VsZWN0QWxsKHcpLm9uKE0sbnVsbCksUy5vbih6LHMpLm9uKFQsZiksRSgpLGwodil9dmFyIGcscD10aGlzLHY9Ui5vZihwLGFyZ3VtZW50cyksZD17fSxtPTAsTT0iLnpvb20tIit0YS5ldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5pZGVudGlmaWVyLHg9InRvdWNobW92ZSIrTSxfPSJ0b3VjaGVuZCIrTSx3PVtdLFM9dGEuc2VsZWN0KHApLEU9WCgpO2UoKSxhKHYpLFMub24oeixudWxsKS5vbihULGUpfWZ1bmN0aW9uIGgoKXt2YXIgbj1SLm9mKHRoaXMsYXJndW1lbnRzKTttP2NsZWFyVGltZW91dChtKToocD10KHY9ZHx8dGEubW91c2UodGhpcykpLEZsLmNhbGwodGhpcyksYShuKSksbT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bT1udWxsLGwobil9LDUwKSxiKCkscihNYXRoLnBvdygyLC4wMDIqWmEoKSkqay5rKSx1KHYscCksYyhuKX1mdW5jdGlvbiBnKCl7dmFyIG49dGEubW91c2UodGhpcyksZT1NYXRoLmxvZyhrLmspL01hdGguTE4yO2kodGhpcyxuLHQobiksdGEuZXZlbnQuc2hpZnRLZXk/TWF0aC5jZWlsKGUpLTE6TWF0aC5mbG9vcihlKSsxKX12YXIgcCx2LGQsbSx5LE0seCxfLFMsaz17eDowLHk6MCxrOjF9LEU9Wzk2MCw1MDBdLEE9VmEsTj0yNTAsQz0wLHo9Im1vdXNlZG93bi56b29tIixxPSJtb3VzZW1vdmUuem9vbSIsTD0ibW91c2V1cC56b29tIixUPSJ0b3VjaHN0YXJ0Lnpvb20iLFI9dyhuLCJ6b29tc3RhcnQiLCJ6b29tIiwiem9vbWVuZCIpO3JldHVybiBuLmV2ZW50PWZ1bmN0aW9uKG4pe24uZWFjaChmdW5jdGlvbigpe3ZhciBuPVIub2YodGhpcyxhcmd1bWVudHMpLHQ9aztVbD90YS5zZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmVhY2goInN0YXJ0Lnpvb20iLGZ1bmN0aW9uKCl7az10aGlzLl9fY2hhcnRfX3x8e3g6MCx5OjAsazoxfSxhKG4pfSkudHdlZW4oInpvb206em9vbSIsZnVuY3Rpb24oKXt2YXIgZT1FWzBdLHI9RVsxXSx1PXY/dlswXTplLzIsaT12P3ZbMV06ci8yLG89dGEuaW50ZXJwb2xhdGVab29tKFsodS1rLngpL2suaywoaS1rLnkpL2suayxlL2sua10sWyh1LXQueCkvdC5rLChpLXQueSkvdC5rLGUvdC5rXSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciByPW8odCksYT1lL3JbMl07dGhpcy5fX2NoYXJ0X189az17eDp1LXJbMF0qYSx5OmktclsxXSphLGs6YX0sYyhuKX19KS5lYWNoKCJpbnRlcnJ1cHQuem9vbSIsZnVuY3Rpb24oKXtsKG4pfSkuZWFjaCgiZW5kLnpvb20iLGZ1bmN0aW9uKCl7bChuKX0pOih0aGlzLl9fY2hhcnRfXz1rLGEobiksYyhuKSxsKG4pKX0pfSxuLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaz17eDordFswXSx5Oit0WzFdLGs6ay5rfSxvKCksbik6W2sueCxrLnldfSxuLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhrPXt4OmsueCx5OmsueSxrOit0fSxvKCksbik6ay5rfSxuLnNjYWxlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhBPW51bGw9PXQ/VmE6Wyt0WzBdLCt0WzFdXSxuKTpBfSxuLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD10JiZbK3RbMF0sK3RbMV1dLG4pOmR9LG4uc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oRT10JiZbK3RbMF0sK3RbMV1dLG4pOkV9LG4uZHVyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KE49K3Qsbik6Tn0sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PXQsTT10LmNvcHkoKSxrPXt4OjAseTowLGs6MX0sbik6eH0sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhTPXQsXz10LmNvcHkoKSxrPXt4OjAseTowLGs6MX0sbik6U30sdGEucmViaW5kKG4sUiwib24iKX07dmFyIFphLFZhPVswLDEvMF0sWGE9Im9ud2hlZWwiaW4gdWE/KFphPWZ1bmN0aW9uKCl7cmV0dXJuLXRhLmV2ZW50LmRlbHRhWSoodGEuZXZlbnQuZGVsdGFNb2RlPzEyMDoxKX0sIndoZWVsIik6Im9ubW91c2V3aGVlbCJpbiB1YT8oWmE9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuZXZlbnQud2hlZWxEZWx0YX0sIm1vdXNld2hlZWwiKTooWmE9ZnVuY3Rpb24oKXtyZXR1cm4tdGEuZXZlbnQuZGV0YWlsfSwiTW96TW91c2VQaXhlbFNjcm9sbCIpO3RhLmNvbG9yPWl0LGl0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJnYigpKyIifSx0YS5oc2w9b3Q7dmFyICRhPW90LnByb3RvdHlwZT1uZXcgaXQ7JGEuYnJpZ2h0ZXI9ZnVuY3Rpb24obil7cmV0dXJuIG49TWF0aC5wb3coLjcsYXJndW1lbnRzLmxlbmd0aD9uOjEpLG5ldyBvdCh0aGlzLmgsdGhpcy5zLHRoaXMubC9uKX0sJGEuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKSxuZXcgb3QodGhpcy5oLHRoaXMucyxuKnRoaXMubCl9LCRhLnJnYj1mdW5jdGlvbigpe3JldHVybiBhdCh0aGlzLmgsdGhpcy5zLHRoaXMubCl9LHRhLmhjbD1jdDt2YXIgQmE9Y3QucHJvdG90eXBlPW5ldyBpdDtCYS5icmlnaHRlcj1mdW5jdGlvbihuKXtyZXR1cm4gbmV3IGN0KHRoaXMuaCx0aGlzLmMsTWF0aC5taW4oMTAwLHRoaXMubCtXYSooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSl9LEJhLmRhcmtlcj1mdW5jdGlvbihuKXtyZXR1cm4gbmV3IGN0KHRoaXMuaCx0aGlzLmMsTWF0aC5tYXgoMCx0aGlzLmwtV2EqKGFyZ3VtZW50cy5sZW5ndGg/bjoxKSkpfSxCYS5yZ2I9ZnVuY3Rpb24oKXtyZXR1cm4gbHQodGhpcy5oLHRoaXMuYyx0aGlzLmwpLnJnYigpfSx0YS5sYWI9c3Q7dmFyIFdhPTE4LEphPS45NTA0NyxHYT0xLEthPTEuMDg4ODMsUWE9c3QucHJvdG90eXBlPW5ldyBpdDtRYS5icmlnaHRlcj1mdW5jdGlvbihuKXtyZXR1cm4gbmV3IHN0KE1hdGgubWluKDEwMCx0aGlzLmwrV2EqKGFyZ3VtZW50cy5sZW5ndGg/bjoxKSksdGhpcy5hLHRoaXMuYil9LFFhLmRhcmtlcj1mdW5jdGlvbihuKXtyZXR1cm4gbmV3IHN0KE1hdGgubWF4KDAsdGhpcy5sLVdhKihhcmd1bWVudHMubGVuZ3RoP246MSkpLHRoaXMuYSx0aGlzLmIpfSxRYS5yZ2I9ZnVuY3Rpb24oKXtyZXR1cm4gZnQodGhpcy5sLHRoaXMuYSx0aGlzLmIpfSx0YS5yZ2I9ZHQ7dmFyIG5jPWR0LnByb3RvdHlwZT1uZXcgaXQ7bmMuYnJpZ2h0ZXI9ZnVuY3Rpb24obil7bj1NYXRoLnBvdyguNyxhcmd1bWVudHMubGVuZ3RoP246MSk7dmFyIHQ9dGhpcy5yLGU9dGhpcy5nLHI9dGhpcy5iLHU9MzA7cmV0dXJuIHR8fGV8fHI/KHQmJnU+dCYmKHQ9dSksZSYmdT5lJiYoZT11KSxyJiZ1PnImJihyPXUpLG5ldyBkdChNYXRoLm1pbigyNTUsdC9uKSxNYXRoLm1pbigyNTUsZS9uKSxNYXRoLm1pbigyNTUsci9uKSkpOm5ldyBkdCh1LHUsdSl9LG5jLmRhcmtlcj1mdW5jdGlvbihuKXtyZXR1cm4gbj1NYXRoLnBvdyguNyxhcmd1bWVudHMubGVuZ3RoP246MSksbmV3IGR0KG4qdGhpcy5yLG4qdGhpcy5nLG4qdGhpcy5iKX0sbmMuaHNsPWZ1bmN0aW9uKCl7cmV0dXJuIGJ0KHRoaXMucix0aGlzLmcsdGhpcy5iKX0sbmMudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iIyIrTXQodGhpcy5yKStNdCh0aGlzLmcpK010KHRoaXMuYil9O3ZhciB0Yz10YS5tYXAoe2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LGRhcmtzbGF0ZWdyZXk6MzEwMDQ5NSxkYXJrdHVycXVvaXNlOjUyOTQ1LGRhcmt2aW9sZXQ6OTY5OTUzOSxkZWVwcGluazoxNjcxNjk0NyxkZWVwc2t5Ymx1ZTo0OTE1MSxkaW1ncmF5OjY5MDgyNjUsZGltZ3JleTo2OTA4MjY1LGRvZGdlcmJsdWU6MjAwMzE5OSxmaXJlYnJpY2s6MTE2NzQxNDYsZmxvcmFsd2hpdGU6MTY3NzU5MjAsZm9yZXN0Z3JlZW46MjI2Mzg0MixmdWNoc2lhOjE2NzExOTM1LGdhaW5zYm9ybzoxNDQ3NDQ2MCxnaG9zdHdoaXRlOjE2MzE2NjcxLGdvbGQ6MTY3NjY3MjAsZ29sZGVucm9kOjE0MzI5MTIwLGdyYXk6ODQyMTUwNCxncmVlbjozMjc2OCxncmVlbnllbGxvdzoxMTQwMzA1NSxncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fSk7dGMuZm9yRWFjaChmdW5jdGlvbihuLHQpe3RjLnNldChuLG10KHQpKX0pLHRhLmZ1bmN0b3I9a3QsdGEueGhyPUF0KEV0KSx0YS5kc3Y9ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKG4sZSxpKXthcmd1bWVudHMubGVuZ3RoPDMmJihpPWUsZT1udWxsKTt2YXIgbz1OdChuLHQsbnVsbD09ZT9yOnUoZSksaSk7cmV0dXJuIG8ucm93PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP28ucmVzcG9uc2UobnVsbD09KGU9bik/cjp1KG4pKTplfSxvfWZ1bmN0aW9uIHIobil7cmV0dXJuIGUucGFyc2Uobi5yZXNwb25zZVRleHQpfWZ1bmN0aW9uIHUobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLnBhcnNlKHQucmVzcG9uc2VUZXh0LG4pfX1mdW5jdGlvbiBpKHQpe3JldHVybiB0Lm1hcChvKS5qb2luKG4pfWZ1bmN0aW9uIG8obil7cmV0dXJuIGEudGVzdChuKT8nIicrbi5yZXBsYWNlKC9cIi9nLCciIicpKyciJzpufXZhciBhPW5ldyBSZWdFeHAoJ1siJytuKyJcbl0iKSxjPW4uY2hhckNvZGVBdCgwKTtyZXR1cm4gZS5wYXJzZT1mdW5jdGlvbihuLHQpe3ZhciByO3JldHVybiBlLnBhcnNlUm93cyhuLGZ1bmN0aW9uKG4sZSl7aWYocilyZXR1cm4gcihuLGUtMSk7dmFyIHU9bmV3IEZ1bmN0aW9uKCJkIiwicmV0dXJuIHsiK24ubWFwKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KG4pKyI6IGRbIit0KyJdIn0pLmpvaW4oIiwiKSsifSIpO3I9dD9mdW5jdGlvbihuLGUpe3JldHVybiB0KHUobiksZSl9OnV9KX0sZS5wYXJzZVJvd3M9ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKCl7aWYocz49bClyZXR1cm4gbztpZih1KXJldHVybiB1PSExLGk7dmFyIHQ9cztpZigzND09PW4uY2hhckNvZGVBdCh0KSl7Zm9yKHZhciBlPXQ7ZSsrPGw7KWlmKDM0PT09bi5jaGFyQ29kZUF0KGUpKXtpZigzNCE9PW4uY2hhckNvZGVBdChlKzEpKWJyZWFrOysrZX1zPWUrMjt2YXIgcj1uLmNoYXJDb2RlQXQoZSsxKTtyZXR1cm4gMTM9PT1yPyh1PSEwLDEwPT09bi5jaGFyQ29kZUF0KGUrMikmJisrcyk6MTA9PT1yJiYodT0hMCksbi5zbGljZSh0KzEsZSkucmVwbGFjZSgvIiIvZywnIicpfWZvcig7bD5zOyl7dmFyIHI9bi5jaGFyQ29kZUF0KHMrKyksYT0xO2lmKDEwPT09cil1PSEwO2Vsc2UgaWYoMTM9PT1yKXU9ITAsMTA9PT1uLmNoYXJDb2RlQXQocykmJigrK3MsKythKTtlbHNlIGlmKHIhPT1jKWNvbnRpbnVlO3JldHVybiBuLnNsaWNlKHQscy1hKX1yZXR1cm4gbi5zbGljZSh0KX1mb3IodmFyIHIsdSxpPXt9LG89e30sYT1bXSxsPW4ubGVuZ3RoLHM9MCxmPTA7KHI9ZSgpKSE9PW87KXtmb3IodmFyIGg9W107ciE9PWkmJnIhPT1vOyloLnB1c2gocikscj1lKCk7dCYmbnVsbD09KGg9dChoLGYrKykpfHxhLnB1c2goaCl9cmV0dXJuIGF9LGUuZm9ybWF0PWZ1bmN0aW9uKHQpe2lmKEFycmF5LmlzQXJyYXkodFswXSkpcmV0dXJuIGUuZm9ybWF0Um93cyh0KTt2YXIgcj1uZXcgdix1PVtdO3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24obil7Zm9yKHZhciB0IGluIG4pci5oYXModCl8fHUucHVzaChyLmFkZCh0KSl9KSxbdS5tYXAobykuam9pbihuKV0uY29uY2F0KHQubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB1Lm1hcChmdW5jdGlvbihuKXtyZXR1cm4gbyh0W25dKX0pLmpvaW4obil9KSkuam9pbigiXG4iKX0sZS5mb3JtYXRSb3dzPWZ1bmN0aW9uKG4pe3JldHVybiBuLm1hcChpKS5qb2luKCJcbiIpfSxlfSx0YS5jc3Y9dGEuZHN2KCIsIiwidGV4dC9jc3YiKSx0YS50c3Y9dGEuZHN2KCIJIiwidGV4dC90YWItc2VwYXJhdGVkLXZhbHVlcyIpO3ZhciBlYyxyYyx1YyxpYyxvYyxhYz1vYVttKG9hLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiKV18fGZ1bmN0aW9uKG4pe3NldFRpbWVvdXQobiwxNyl9O3RhLnRpbWVyPWZ1bmN0aW9uKG4sdCxlKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoOzI+ciYmKHQ9MCksMz5yJiYoZT1EYXRlLm5vdygpKTt2YXIgdT1lK3QsaT17YzpuLHQ6dSxmOiExLG46bnVsbH07cmM/cmMubj1pOmVjPWkscmM9aSx1Y3x8KGljPWNsZWFyVGltZW91dChpYyksdWM9MSxhYyhxdCkpfSx0YS50aW1lci5mbHVzaD1mdW5jdGlvbigpe0x0KCksVHQoKX0sdGEucm91bmQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gdD9NYXRoLnJvdW5kKG4qKHQ9TWF0aC5wb3coMTAsdCkpKS90Ok1hdGgucm91bmQobil9O3ZhciBjYz1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIlx4YjUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXS5tYXAoRHQpO3RhLmZvcm1hdFByZWZpeD1mdW5jdGlvbihuLHQpe3ZhciBlPTA7cmV0dXJuIG4mJigwPm4mJihuKj0tMSksdCYmKG49dGEucm91bmQobixSdChuLHQpKSksZT0xK01hdGguZmxvb3IoMWUtMTIrTWF0aC5sb2cobikvTWF0aC5MTjEwKSxlPU1hdGgubWF4KC0yNCxNYXRoLm1pbigyNCwzKk1hdGguZmxvb3IoKGUtMSkvMykpKSksY2NbOCtlLzNdfTt2YXIgbGM9Lyg/OihbXntdKT8oWzw+PV5dKSk/KFsrXC0gXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuLT9cZCspPyhbYS16JV0pPy9pLHNjPXRhLm1hcCh7YjpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZygyKX0sYzpmdW5jdGlvbihuKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShuKX0sbzpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZyg4KX0seDpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZygxNil9LFg6ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LGc6ZnVuY3Rpb24obix0KXtyZXR1cm4gbi50b1ByZWNpc2lvbih0KX0sZTpmdW5jdGlvbihuLHQpe3JldHVybiBuLnRvRXhwb25lbnRpYWwodCl9LGY6ZnVuY3Rpb24obix0KXtyZXR1cm4gbi50b0ZpeGVkKHQpfSxyOmZ1bmN0aW9uKG4sdCl7cmV0dXJuKG49dGEucm91bmQobixSdChuLHQpKSkudG9GaXhlZChNYXRoLm1heCgwLE1hdGgubWluKDIwLFJ0KG4qKDErMWUtMTUpLHQpKSkpfX0pLGZjPXRhLnRpbWU9e30saGM9RGF0ZTtqdC5wcm90b3R5cGU9e2dldERhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ0RhdGUoKX0sZ2V0RGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENEYXkoKX0sZ2V0RnVsbFllYXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ0Z1bGxZZWFyKCl9LGdldEhvdXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENIb3VycygpfSxnZXRNaWxsaXNlY29uZHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ01pbGxpc2Vjb25kcygpfSxnZXRNaW51dGVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENNaW51dGVzKCl9LGdldE1vbnRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENNb250aCgpfSxnZXRTZWNvbmRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENTZWNvbmRzKCl9LGdldFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFRpbWUoKX0sZ2V0VGltZXpvbmVPZmZzZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8udmFsdWVPZigpfSxzZXREYXRlOmZ1bmN0aW9uKCl7Z2Muc2V0VVRDRGF0ZS5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0RGF5OmZ1bmN0aW9uKCl7Z2Muc2V0VVRDRGF5LmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRGdWxsWWVhcjpmdW5jdGlvbigpe2djLnNldFVUQ0Z1bGxZZWFyLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRIb3VyczpmdW5jdGlvbigpe2djLnNldFVUQ0hvdXJzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRNaWxsaXNlY29uZHM6ZnVuY3Rpb24oKXtnYy5zZXRVVENNaWxsaXNlY29uZHMuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldE1pbnV0ZXM6ZnVuY3Rpb24oKXtnYy5zZXRVVENNaW51dGVzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRNb250aDpmdW5jdGlvbigpe2djLnNldFVUQ01vbnRoLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRTZWNvbmRzOmZ1bmN0aW9uKCl7Z2Muc2V0VVRDU2Vjb25kcy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0VGltZTpmdW5jdGlvbigpe2djLnNldFRpbWUuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9fTt2YXIgZ2M9RGF0ZS5wcm90b3R5cGU7ZmMueWVhcj1GdChmdW5jdGlvbihuKXtyZXR1cm4gbj1mYy5kYXkobiksbi5zZXRNb250aCgwLDEpLG59LGZ1bmN0aW9uKG4sdCl7bi5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCkrdCl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldEZ1bGxZZWFyKCl9KSxmYy55ZWFycz1mYy55ZWFyLnJhbmdlLGZjLnllYXJzLnV0Yz1mYy55ZWFyLnV0Yy5yYW5nZSxmYy5kYXk9RnQoZnVuY3Rpb24obil7dmFyIHQ9bmV3IGhjKDJlMywwKTtyZXR1cm4gdC5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCksbi5nZXRNb250aCgpLG4uZ2V0RGF0ZSgpKSx0fSxmdW5jdGlvbihuLHQpe24uc2V0RGF0ZShuLmdldERhdGUoKSt0KX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0RGF0ZSgpLTF9KSxmYy5kYXlzPWZjLmRheS5yYW5nZSxmYy5kYXlzLnV0Yz1mYy5kYXkudXRjLnJhbmdlLGZjLmRheU9mWWVhcj1mdW5jdGlvbihuKXt2YXIgdD1mYy55ZWFyKG4pO3JldHVybiBNYXRoLmZsb29yKChuLXQtNmU0KihuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSkvODY0ZTUpfSxbInN1bmRheSIsIm1vbmRheSIsInR1ZXNkYXkiLCJ3ZWRuZXNkYXkiLCJ0aHVyc2RheSIsImZyaWRheSIsInNhdHVyZGF5Il0uZm9yRWFjaChmdW5jdGlvbihuLHQpe3Q9Ny10O3ZhciBlPWZjW25dPUZ0KGZ1bmN0aW9uKG4pe3JldHVybihuPWZjLmRheShuKSkuc2V0RGF0ZShuLmdldERhdGUoKS0obi5nZXREYXkoKSt0KSU3KSxufSxmdW5jdGlvbihuLHQpe24uc2V0RGF0ZShuLmdldERhdGUoKSs3Kk1hdGguZmxvb3IodCkpfSxmdW5jdGlvbihuKXt2YXIgZT1mYy55ZWFyKG4pLmdldERheSgpO3JldHVybiBNYXRoLmZsb29yKChmYy5kYXlPZlllYXIobikrKGUrdCklNykvNyktKGUhPT10KX0pO2ZjW24rInMiXT1lLnJhbmdlLGZjW24rInMiXS51dGM9ZS51dGMucmFuZ2UsZmNbbisiT2ZZZWFyIl09ZnVuY3Rpb24obil7dmFyIGU9ZmMueWVhcihuKS5nZXREYXkoKTtyZXR1cm4gTWF0aC5mbG9vcigoZmMuZGF5T2ZZZWFyKG4pKyhlK3QpJTcpLzcpfX0pLGZjLndlZWs9ZmMuc3VuZGF5LGZjLndlZWtzPWZjLnN1bmRheS5yYW5nZSxmYy53ZWVrcy51dGM9ZmMuc3VuZGF5LnV0Yy5yYW5nZSxmYy53ZWVrT2ZZZWFyPWZjLnN1bmRheU9mWWVhcjt2YXIgcGM9eyItIjoiIixfOiIgIiwwOiIwIn0sdmM9L15ccypcZCsvLGRjPS9eJS87dGEubG9jYWxlPWZ1bmN0aW9uKG4pe3JldHVybntudW1iZXJGb3JtYXQ6UHQobiksdGltZUZvcm1hdDpPdChuKX19O3ZhciBtYz10YS5sb2NhbGUoe2RlY2ltYWw6Ii4iLHRob3VzYW5kczoiLCIsZ3JvdXBpbmc6WzNdLGN1cnJlbmN5OlsiJCIsIiJdLGRhdGVUaW1lOiIlYSAlYiAlZSAlWCAlWSIsZGF0ZToiJW0vJWQvJVkiLHRpbWU6IiVIOiVNOiVTIixwZXJpb2RzOlsiQU0iLCJQTSJdLGRheXM6WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLHNob3J0RGF5czpbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLG1vbnRoczpbIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sc2hvcnRNb250aHM6WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXX0pO3RhLmZvcm1hdD1tYy5udW1iZXJGb3JtYXQsdGEuZ2VvPXt9LGNlLnByb3RvdHlwZT17czowLHQ6MCxhZGQ6ZnVuY3Rpb24obil7bGUobix0aGlzLnQseWMpLGxlKHljLnMsdGhpcy5zLHRoaXMpLHRoaXMucz90aGlzLnQrPXljLnQ6dGhpcy5zPXljLnR9LHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5zPXRoaXMudD0wfSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc319O3ZhciB5Yz1uZXcgY2U7dGEuZ2VvLnN0cmVhbT1mdW5jdGlvbihuLHQpe24mJk1jLmhhc093blByb3BlcnR5KG4udHlwZSk/TWNbbi50eXBlXShuLHQpOnNlKG4sdCl9O3ZhciBNYz17RmVhdHVyZTpmdW5jdGlvbihuLHQpe3NlKG4uZ2VvbWV0cnksdCl9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPW4uZmVhdHVyZXMscj0tMSx1PWUubGVuZ3RoOysrcjx1OylzZShlW3JdLmdlb21ldHJ5LHQpfX0seGM9e1NwaGVyZTpmdW5jdGlvbihuLHQpe3Quc3BoZXJlKCl9LFBvaW50OmZ1bmN0aW9uKG4sdCl7bj1uLmNvb3JkaW5hdGVzLHQucG9pbnQoblswXSxuWzFdLG5bMl0pfSxNdWx0aVBvaW50OmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPW4uY29vcmRpbmF0ZXMscj0tMSx1PWUubGVuZ3RoOysrcjx1OyluPWVbcl0sdC5wb2ludChuWzBdLG5bMV0sblsyXSkKfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKG4sdCl7ZmUobi5jb29yZGluYXRlcyx0LDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5jb29yZGluYXRlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KWZlKGVbcl0sdCwwKX0sUG9seWdvbjpmdW5jdGlvbihuLHQpe2hlKG4uY29vcmRpbmF0ZXMsdCl9LE11bHRpUG9seWdvbjpmdW5jdGlvbihuLHQpe2Zvcih2YXIgZT1uLmNvb3JkaW5hdGVzLHI9LTEsdT1lLmxlbmd0aDsrK3I8dTspaGUoZVtyXSx0KX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPW4uZ2VvbWV0cmllcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KXNlKGVbcl0sdCl9fTt0YS5nZW8uYXJlYT1mdW5jdGlvbihuKXtyZXR1cm4gYmM9MCx0YS5nZW8uc3RyZWFtKG4sd2MpLGJjfTt2YXIgYmMsX2M9bmV3IGNlLHdjPXtzcGhlcmU6ZnVuY3Rpb24oKXtiYys9NCpEYX0scG9pbnQ6eSxsaW5lU3RhcnQ6eSxsaW5lRW5kOnkscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7X2MucmVzZXQoKSx3Yy5saW5lU3RhcnQ9Z2V9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt2YXIgbj0yKl9jO2JjKz0wPm4/NCpEYStuOm4sd2MubGluZVN0YXJ0PXdjLmxpbmVFbmQ9d2MucG9pbnQ9eX19O3RhLmdlby5ib3VuZHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4sdCl7TS5wdXNoKHg9W3M9bixoPW5dKSxmPnQmJihmPXQpLHQ+ZyYmKGc9dCl9ZnVuY3Rpb24gdCh0LGUpe3ZhciByPXBlKFt0KkZhLGUqRmFdKTtpZihtKXt2YXIgdT1kZShtLHIpLGk9W3VbMV0sLXVbMF0sMF0sbz1kZShpLHUpO01lKG8pLG89eGUobyk7dmFyIGM9dC1wLGw9Yz4wPzE6LTEsdj1vWzBdKkhhKmwsZD12YShjKT4xODA7aWYoZF4odj5sKnAmJmwqdD52KSl7dmFyIHk9b1sxXSpIYTt5PmcmJihnPXkpfWVsc2UgaWYodj0odiszNjApJTM2MC0xODAsZF4odj5sKnAmJmwqdD52KSl7dmFyIHk9LW9bMV0qSGE7Zj55JiYoZj15KX1lbHNlIGY+ZSYmKGY9ZSksZT5nJiYoZz1lKTtkP3A+dD9hKHMsdCk+YShzLGgpJiYoaD10KTphKHQsaCk+YShzLGgpJiYocz10KTpoPj1zPyhzPnQmJihzPXQpLHQ+aCYmKGg9dCkpOnQ+cD9hKHMsdCk+YShzLGgpJiYoaD10KTphKHQsaCk+YShzLGgpJiYocz10KX1lbHNlIG4odCxlKTttPXIscD10fWZ1bmN0aW9uIGUoKXtiLnBvaW50PXR9ZnVuY3Rpb24gcigpe3hbMF09cyx4WzFdPWgsYi5wb2ludD1uLG09bnVsbH1mdW5jdGlvbiB1KG4sZSl7aWYobSl7dmFyIHI9bi1wO3krPXZhKHIpPjE4MD9yKyhyPjA/MzYwOi0zNjApOnJ9ZWxzZSB2PW4sZD1lO3djLnBvaW50KG4sZSksdChuLGUpfWZ1bmN0aW9uIGkoKXt3Yy5saW5lU3RhcnQoKX1mdW5jdGlvbiBvKCl7dSh2LGQpLHdjLmxpbmVFbmQoKSx2YSh5KT5UYSYmKHM9LShoPTE4MCkpLHhbMF09cyx4WzFdPWgsbT1udWxsfWZ1bmN0aW9uIGEobix0KXtyZXR1cm4odC09bik8MD90KzM2MDp0fWZ1bmN0aW9uIGMobix0KXtyZXR1cm4gblswXS10WzBdfWZ1bmN0aW9uIGwobix0KXtyZXR1cm4gdFswXTw9dFsxXT90WzBdPD1uJiZuPD10WzFdOm48dFswXXx8dFsxXTxufXZhciBzLGYsaCxnLHAsdixkLG0seSxNLHgsYj17cG9pbnQ6bixsaW5lU3RhcnQ6ZSxsaW5lRW5kOnIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Yi5wb2ludD11LGIubGluZVN0YXJ0PWksYi5saW5lRW5kPW8seT0wLHdjLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7d2MucG9seWdvbkVuZCgpLGIucG9pbnQ9bixiLmxpbmVTdGFydD1lLGIubGluZUVuZD1yLDA+X2M/KHM9LShoPTE4MCksZj0tKGc9OTApKTp5PlRhP2c9OTA6LVRhPnkmJihmPS05MCkseFswXT1zLHhbMV09aH19O3JldHVybiBmdW5jdGlvbihuKXtnPWg9LShzPWY9MS8wKSxNPVtdLHRhLmdlby5zdHJlYW0obixiKTt2YXIgdD1NLmxlbmd0aDtpZih0KXtNLnNvcnQoYyk7Zm9yKHZhciBlLHI9MSx1PU1bMF0saT1bdV07dD5yOysrcillPU1bcl0sbChlWzBdLHUpfHxsKGVbMV0sdSk/KGEodVswXSxlWzFdKT5hKHVbMF0sdVsxXSkmJih1WzFdPWVbMV0pLGEoZVswXSx1WzFdKT5hKHVbMF0sdVsxXSkmJih1WzBdPWVbMF0pKTppLnB1c2godT1lKTtmb3IodmFyIG8sZSxwPS0xLzAsdD1pLmxlbmd0aC0xLHI9MCx1PWlbdF07dD49cjt1PWUsKytyKWU9aVtyXSwobz1hKHVbMV0sZVswXSkpPnAmJihwPW8scz1lWzBdLGg9dVsxXSl9cmV0dXJuIE09eD1udWxsLDEvMD09PXN8fDEvMD09PWY/W1swLzAsMC8wXSxbMC8wLDAvMF1dOltbcyxmXSxbaCxnXV19fSgpLHRhLmdlby5jZW50cm9pZD1mdW5jdGlvbihuKXtTYz1rYz1FYz1BYz1OYz1DYz16Yz1xYz1MYz1UYz1SYz0wLHRhLmdlby5zdHJlYW0obixEYyk7dmFyIHQ9TGMsZT1UYyxyPVJjLHU9dCp0K2UqZStyKnI7cmV0dXJuIFJhPnUmJih0PUNjLGU9emMscj1xYyxUYT5rYyYmKHQ9RWMsZT1BYyxyPU5jKSx1PXQqdCtlKmUrcipyLFJhPnUpP1swLzAsMC8wXTpbTWF0aC5hdGFuMihlLHQpKkhhLG50KHIvTWF0aC5zcXJ0KHUpKSpIYV19O3ZhciBTYyxrYyxFYyxBYyxOYyxDYyx6YyxxYyxMYyxUYyxSYyxEYz17c3BoZXJlOnkscG9pbnQ6X2UsbGluZVN0YXJ0OlNlLGxpbmVFbmQ6a2UscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7RGMubGluZVN0YXJ0PUVlfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7RGMubGluZVN0YXJ0PVNlfX0sUGM9TGUoTmUsUGUsamUsWy1EYSwtRGEvMl0pLFVjPTFlOTt0YS5nZW8uY2xpcEV4dGVudD1mdW5jdGlvbigpe3ZhciBuLHQsZSxyLHUsaSxvPXtzdHJlYW06ZnVuY3Rpb24obil7cmV0dXJuIHUmJih1LnZhbGlkPSExKSx1PWkobiksdS52YWxpZD0hMCx1fSxleHRlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9WWUobj0rYVswXVswXSx0PSthWzBdWzFdLGU9K2FbMV1bMF0scj0rYVsxXVsxXSksdSYmKHUudmFsaWQ9ITEsdT1udWxsKSxvKTpbW24sdF0sW2Uscl1dfX07cmV0dXJuIG8uZXh0ZW50KFtbMCwwXSxbOTYwLDUwMF1dKX0sKHRhLmdlby5jb25pY0VxdWFsQXJlYT1mdW5jdGlvbigpe3JldHVybiBJZShaZSl9KS5yYXc9WmUsdGEuZ2VvLmFsYmVycz1mdW5jdGlvbigpe3JldHVybiB0YS5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWzk2LDBdKS5jZW50ZXIoWy0uNiwzOC43XSkucGFyYWxsZWxzKFsyOS41LDQ1LjVdKS5zY2FsZSgxMDcwKX0sdGEuZ2VvLmFsYmVyc1VzYT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7dmFyIGk9blswXSxvPW5bMV07cmV0dXJuIHQ9bnVsbCxlKGksbyksdHx8KHIoaSxvKSx0KXx8dShpLG8pLHR9dmFyIHQsZSxyLHUsaT10YS5nZW8uYWxiZXJzKCksbz10YS5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWzE1NCwwXSkuY2VudGVyKFstMiw1OC41XSkucGFyYWxsZWxzKFs1NSw2NV0pLGE9dGEuZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFsxNTcsMF0pLmNlbnRlcihbLTMsMTkuOV0pLnBhcmFsbGVscyhbOCwxOF0pLGM9e3BvaW50OmZ1bmN0aW9uKG4sZSl7dD1bbixlXX19O3JldHVybiBuLmludmVydD1mdW5jdGlvbihuKXt2YXIgdD1pLnNjYWxlKCksZT1pLnRyYW5zbGF0ZSgpLHI9KG5bMF0tZVswXSkvdCx1PShuWzFdLWVbMV0pL3Q7cmV0dXJuKHU+PS4xMiYmLjIzND51JiZyPj0tLjQyNSYmLS4yMTQ+cj9vOnU+PS4xNjYmJi4yMzQ+dSYmcj49LS4yMTQmJi0uMTE1PnI/YTppKS5pbnZlcnQobil9LG4uc3RyZWFtPWZ1bmN0aW9uKG4pe3ZhciB0PWkuc3RyZWFtKG4pLGU9by5zdHJlYW0obikscj1hLnN0cmVhbShuKTtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24obix1KXt0LnBvaW50KG4sdSksZS5wb2ludChuLHUpLHIucG9pbnQobix1KX0sc3BoZXJlOmZ1bmN0aW9uKCl7dC5zcGhlcmUoKSxlLnNwaGVyZSgpLHIuc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3QubGluZVN0YXJ0KCksZS5saW5lU3RhcnQoKSxyLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dC5saW5lRW5kKCksZS5saW5lRW5kKCksci5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3QucG9seWdvblN0YXJ0KCksZS5wb2x5Z29uU3RhcnQoKSxyLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dC5wb2x5Z29uRW5kKCksZS5wb2x5Z29uRW5kKCksci5wb2x5Z29uRW5kKCl9fX0sbi5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGkucHJlY2lzaW9uKHQpLG8ucHJlY2lzaW9uKHQpLGEucHJlY2lzaW9uKHQpLG4pOmkucHJlY2lzaW9uKCl9LG4uc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGkuc2NhbGUodCksby5zY2FsZSguMzUqdCksYS5zY2FsZSh0KSxuLnRyYW5zbGF0ZShpLnRyYW5zbGF0ZSgpKSk6aS5zY2FsZSgpfSxuLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gaS50cmFuc2xhdGUoKTt2YXIgbD1pLnNjYWxlKCkscz0rdFswXSxmPSt0WzFdO3JldHVybiBlPWkudHJhbnNsYXRlKHQpLmNsaXBFeHRlbnQoW1tzLS40NTUqbCxmLS4yMzgqbF0sW3MrLjQ1NSpsLGYrLjIzOCpsXV0pLnN0cmVhbShjKS5wb2ludCxyPW8udHJhbnNsYXRlKFtzLS4zMDcqbCxmKy4yMDEqbF0pLmNsaXBFeHRlbnQoW1tzLS40MjUqbCtUYSxmKy4xMipsK1RhXSxbcy0uMjE0KmwtVGEsZisuMjM0KmwtVGFdXSkuc3RyZWFtKGMpLnBvaW50LHU9YS50cmFuc2xhdGUoW3MtLjIwNSpsLGYrLjIxMipsXSkuY2xpcEV4dGVudChbW3MtLjIxNCpsK1RhLGYrLjE2NipsK1RhXSxbcy0uMTE1KmwtVGEsZisuMjM0KmwtVGFdXSkuc3RyZWFtKGMpLnBvaW50LG59LG4uc2NhbGUoMTA3MCl9O3ZhciBqYyxGYyxIYyxPYyxZYyxJYyxaYz17cG9pbnQ6eSxsaW5lU3RhcnQ6eSxsaW5lRW5kOnkscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7RmM9MCxaYy5saW5lU3RhcnQ9VmV9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtaYy5saW5lU3RhcnQ9WmMubGluZUVuZD1aYy5wb2ludD15LGpjKz12YShGYy8yKX19LFZjPXtwb2ludDpYZSxsaW5lU3RhcnQ6eSxsaW5lRW5kOnkscG9seWdvblN0YXJ0OnkscG9seWdvbkVuZDp5fSxYYz17cG9pbnQ6V2UsbGluZVN0YXJ0OkplLGxpbmVFbmQ6R2UscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7WGMubGluZVN0YXJ0PUtlfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7WGMucG9pbnQ9V2UsWGMubGluZVN0YXJ0PUplLFhjLmxpbmVFbmQ9R2V9fTt0YS5nZW8ucGF0aD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7cmV0dXJuIG4mJigiZnVuY3Rpb24iPT10eXBlb2YgYSYmaS5wb2ludFJhZGl1cygrYS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLG8mJm8udmFsaWR8fChvPXUoaSkpLHRhLmdlby5zdHJlYW0obixvKSksaS5yZXN1bHQoKX1mdW5jdGlvbiB0KCl7cmV0dXJuIG89bnVsbCxufXZhciBlLHIsdSxpLG8sYT00LjU7cmV0dXJuIG4uYXJlYT1mdW5jdGlvbihuKXtyZXR1cm4gamM9MCx0YS5nZW8uc3RyZWFtKG4sdShaYykpLGpjfSxuLmNlbnRyb2lkPWZ1bmN0aW9uKG4pe3JldHVybiBFYz1BYz1OYz1DYz16Yz1xYz1MYz1UYz1SYz0wLHRhLmdlby5zdHJlYW0obix1KFhjKSksUmM/W0xjL1JjLFRjL1JjXTpxYz9bQ2MvcWMsemMvcWNdOk5jP1tFYy9OYyxBYy9OY106WzAvMCwwLzBdfSxuLmJvdW5kcz1mdW5jdGlvbihuKXtyZXR1cm4gWWM9SWM9LShIYz1PYz0xLzApLHRhLmdlby5zdHJlYW0obix1KFZjKSksW1tIYyxPY10sW1ljLEljXV19LG4ucHJvamVjdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0oZT1uKT9uLnN0cmVhbXx8dHIobik6RXQsdCgpKTplfSxuLmNvbnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09KHI9bik/bmV3ICRlOm5ldyBRZShuKSwiZnVuY3Rpb24iIT10eXBlb2YgYSYmaS5wb2ludFJhZGl1cyhhKSx0KCkpOnJ9LG4ucG9pbnRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDooaS5wb2ludFJhZGl1cygrdCksK3QpLG4pOmF9LG4ucHJvamVjdGlvbih0YS5nZW8uYWxiZXJzVXNhKCkpLmNvbnRleHQobnVsbCl9LHRhLmdlby50cmFuc2Zvcm09ZnVuY3Rpb24obil7cmV0dXJue3N0cmVhbTpmdW5jdGlvbih0KXt2YXIgZT1uZXcgZXIodCk7Zm9yKHZhciByIGluIG4pZVtyXT1uW3JdO3JldHVybiBlfX19LGVyLnByb3RvdHlwZT17cG9pbnQ6ZnVuY3Rpb24obix0KXt0aGlzLnN0cmVhbS5wb2ludChuLHQpfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX0sdGEuZ2VvLnByb2plY3Rpb249dXIsdGEuZ2VvLnByb2plY3Rpb25NdXRhdG9yPWlyLCh0YS5nZW8uZXF1aXJlY3Rhbmd1bGFyPWZ1bmN0aW9uKCl7cmV0dXJuIHVyKGFyKX0pLnJhdz1hci5pbnZlcnQ9YXIsdGEuZ2VvLnJvdGF0aW9uPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQodCl7cmV0dXJuIHQ9bih0WzBdKkZhLHRbMV0qRmEpLHRbMF0qPUhhLHRbMV0qPUhhLHR9cmV0dXJuIG49bHIoblswXSUzNjAqRmEsblsxXSpGYSxuLmxlbmd0aD4yP25bMl0qRmE6MCksdC5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bi5pbnZlcnQodFswXSpGYSx0WzFdKkZhKSx0WzBdKj1IYSx0WzFdKj1IYSx0fSx0fSxjci5pbnZlcnQ9YXIsdGEuZ2VvLmNpcmNsZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpyLHQ9bHIoLW5bMF0qRmEsLW5bMV0qRmEsMCkuaW52ZXJ0LHU9W107cmV0dXJuIGUobnVsbCxudWxsLDEse3BvaW50OmZ1bmN0aW9uKG4sZSl7dS5wdXNoKG49dChuLGUpKSxuWzBdKj1IYSxuWzFdKj1IYX19KSx7dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W3VdfX12YXIgdCxlLHI9WzAsMF0sdT02O3JldHVybiBuLm9yaWdpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG4uYW5nbGU9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9Z3IoKHQ9K3IpKkZhLHUqRmEpLG4pOnR9LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWdyKHQqRmEsKHU9K3IpKkZhKSxuKTp1fSxuLmFuZ2xlKDkwKX0sdGEuZ2VvLmRpc3RhbmNlPWZ1bmN0aW9uKG4sdCl7dmFyIGUscj0odFswXS1uWzBdKSpGYSx1PW5bMV0qRmEsaT10WzFdKkZhLG89TWF0aC5zaW4ociksYT1NYXRoLmNvcyhyKSxjPU1hdGguc2luKHUpLGw9TWF0aC5jb3ModSkscz1NYXRoLnNpbihpKSxmPU1hdGguY29zKGkpO3JldHVybiBNYXRoLmF0YW4yKE1hdGguc3FydCgoZT1mKm8pKmUrKGU9bCpzLWMqZiphKSplKSxjKnMrbCpmKmEpfSx0YS5nZW8uZ3JhdGljdWxlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe3JldHVybnt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnQoKX19ZnVuY3Rpb24gdCgpe3JldHVybiB0YS5yYW5nZShNYXRoLmNlaWwoaS9kKSpkLHUsZCkubWFwKGgpLmNvbmNhdCh0YS5yYW5nZShNYXRoLmNlaWwobC9tKSptLGMsbSkubWFwKGcpKS5jb25jYXQodGEucmFuZ2UoTWF0aC5jZWlsKHIvcCkqcCxlLHApLmZpbHRlcihmdW5jdGlvbihuKXtyZXR1cm4gdmEobiVkKT5UYX0pLm1hcChzKSkuY29uY2F0KHRhLnJhbmdlKE1hdGguY2VpbChhL3YpKnYsbyx2KS5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIHZhKG4lbSk+VGF9KS5tYXAoZikpfXZhciBlLHIsdSxpLG8sYSxjLGwscyxmLGgsZyxwPTEwLHY9cCxkPTkwLG09MzYwLHk9Mi41O3JldHVybiBuLmxpbmVzPWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJue3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOm59fSl9LG4ub3V0bGluZT1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbaChpKS5jb25jYXQoZyhjKS5zbGljZSgxKSxoKHUpLnJldmVyc2UoKS5zbGljZSgxKSxnKGwpLnJldmVyc2UoKS5zbGljZSgxKSldfX0sbi5leHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bi5tYWpvckV4dGVudCh0KS5taW5vckV4dGVudCh0KTpuLm1pbm9yRXh0ZW50KCl9LG4ubWFqb3JFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3RbMF1bMF0sdT0rdFsxXVswXSxsPSt0WzBdWzFdLGM9K3RbMV1bMV0saT51JiYodD1pLGk9dSx1PXQpLGw+YyYmKHQ9bCxsPWMsYz10KSxuLnByZWNpc2lvbih5KSk6W1tpLGxdLFt1LGNdXX0sbi5taW5vckV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdFswXVswXSxlPSt0WzFdWzBdLGE9K3RbMF1bMV0sbz0rdFsxXVsxXSxyPmUmJih0PXIscj1lLGU9dCksYT5vJiYodD1hLGE9byxvPXQpLG4ucHJlY2lzaW9uKHkpKTpbW3IsYV0sW2Usb11dfSxuLnN0ZXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bi5tYWpvclN0ZXAodCkubWlub3JTdGVwKHQpOm4ubWlub3JTdGVwKCl9LG4ubWFqb3JTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPSt0WzBdLG09K3RbMV0sbik6W2QsbV19LG4ubWlub3JTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPSt0WzBdLHY9K3RbMV0sbik6W3Asdl19LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PSt0LHM9dnIoYSxvLDkwKSxmPWRyKHIsZSx5KSxoPXZyKGwsYyw5MCksZz1kcihpLHUseSksbik6eX0sbi5tYWpvckV4dGVudChbWy0xODAsLTkwK1RhXSxbMTgwLDkwLVRhXV0pLm1pbm9yRXh0ZW50KFtbLTE4MCwtODAtVGFdLFsxODAsODArVGFdXSl9LHRhLmdlby5ncmVhdEFyYz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXtyZXR1cm57dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6W3R8fHIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGV8fHUuYXBwbHkodGhpcyxhcmd1bWVudHMpXX19dmFyIHQsZSxyPW1yLHU9eXI7cmV0dXJuIG4uZGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuZ2VvLmRpc3RhbmNlKHR8fHIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGV8fHUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sbi5zb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ZSx0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP251bGw6ZSxuKTpyfSxuLnRhcmdldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/bnVsbDp0LG4pOnV9LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bjowfSxufSx0YS5nZW8uaW50ZXJwb2xhdGU9ZnVuY3Rpb24obix0KXtyZXR1cm4gTXIoblswXSpGYSxuWzFdKkZhLHRbMF0qRmEsdFsxXSpGYSl9LHRhLmdlby5sZW5ndGg9ZnVuY3Rpb24obil7cmV0dXJuICRjPTAsdGEuZ2VvLnN0cmVhbShuLEJjKSwkY307dmFyICRjLEJjPXtzcGhlcmU6eSxwb2ludDp5LGxpbmVTdGFydDp4cixsaW5lRW5kOnkscG9seWdvblN0YXJ0OnkscG9seWdvbkVuZDp5fSxXYz1icihmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5zcXJ0KDIvKDErbikpfSxmdW5jdGlvbihuKXtyZXR1cm4gMipNYXRoLmFzaW4obi8yKX0pOyh0YS5nZW8uYXppbXV0aGFsRXF1YWxBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIHVyKFdjKX0pLnJhdz1XYzt2YXIgSmM9YnIoZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5hY29zKG4pO3JldHVybiB0JiZ0L01hdGguc2luKHQpfSxFdCk7KHRhLmdlby5hemltdXRoYWxFcXVpZGlzdGFudD1mdW5jdGlvbigpe3JldHVybiB1cihKYyl9KS5yYXc9SmMsKHRhLmdlby5jb25pY0NvbmZvcm1hbD1mdW5jdGlvbigpe3JldHVybiBJZShfcil9KS5yYXc9X3IsKHRhLmdlby5jb25pY0VxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIEllKHdyKX0pLnJhdz13cjt2YXIgR2M9YnIoZnVuY3Rpb24obil7cmV0dXJuIDEvbn0sTWF0aC5hdGFuKTsodGEuZ2VvLmdub21vbmljPWZ1bmN0aW9uKCl7cmV0dXJuIHVyKEdjKX0pLnJhdz1HYyxTci5pbnZlcnQ9ZnVuY3Rpb24obix0KXtyZXR1cm5bbiwyKk1hdGguYXRhbihNYXRoLmV4cCh0KSktamFdfSwodGEuZ2VvLm1lcmNhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIGtyKFNyKX0pLnJhdz1Tcjt2YXIgS2M9YnIoZnVuY3Rpb24oKXtyZXR1cm4gMX0sTWF0aC5hc2luKTsodGEuZ2VvLm9ydGhvZ3JhcGhpYz1mdW5jdGlvbigpe3JldHVybiB1cihLYyl9KS5yYXc9S2M7dmFyIFFjPWJyKGZ1bmN0aW9uKG4pe3JldHVybiAxLygxK24pfSxmdW5jdGlvbihuKXtyZXR1cm4gMipNYXRoLmF0YW4obil9KTsodGEuZ2VvLnN0ZXJlb2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gdXIoUWMpfSkucmF3PVFjLEVyLmludmVydD1mdW5jdGlvbihuLHQpe3JldHVyblstdCwyKk1hdGguYXRhbihNYXRoLmV4cChuKSktamFdfSwodGEuZ2VvLnRyYW5zdmVyc2VNZXJjYXRvcj1mdW5jdGlvbigpe3ZhciBuPWtyKEVyKSx0PW4uY2VudGVyLGU9bi5yb3RhdGU7cmV0dXJuIG4uY2VudGVyPWZ1bmN0aW9uKG4pe3JldHVybiBuP3QoWy1uWzFdLG5bMF1dKToobj10KCksW25bMV0sLW5bMF1dKX0sbi5yb3RhdGU9ZnVuY3Rpb24obil7cmV0dXJuIG4/ZShbblswXSxuWzFdLG4ubGVuZ3RoPjI/blsyXSs5MDo5MF0pOihuPWUoKSxbblswXSxuWzFdLG5bMl0tOTBdKX0sZShbMCwwLDkwXSl9KS5yYXc9RXIsdGEuZ2VvbT17fSx0YS5nZW9tLmh1bGw9ZnVuY3Rpb24obil7ZnVuY3Rpb24gdChuKXtpZihuLmxlbmd0aDwzKXJldHVybltdO3ZhciB0LHU9a3QoZSksaT1rdChyKSxvPW4ubGVuZ3RoLGE9W10sYz1bXTtmb3IodD0wO28+dDt0KyspYS5wdXNoKFsrdS5jYWxsKHRoaXMsblt0XSx0KSwraS5jYWxsKHRoaXMsblt0XSx0KSx0XSk7Zm9yKGEuc29ydCh6ciksdD0wO28+dDt0KyspYy5wdXNoKFthW3RdWzBdLC1hW3RdWzFdXSk7dmFyIGw9Q3IoYSkscz1DcihjKSxmPXNbMF09PT1sWzBdLGg9c1tzLmxlbmd0aC0xXT09PWxbbC5sZW5ndGgtMV0sZz1bXTtmb3IodD1sLmxlbmd0aC0xO3Q+PTA7LS10KWcucHVzaChuW2FbbFt0XV1bMl1dKTtmb3IodD0rZjt0PHMubGVuZ3RoLWg7Kyt0KWcucHVzaChuW2Fbc1t0XV1bMl1dKTtyZXR1cm4gZ312YXIgZT1BcixyPU5yO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3Qobik6KHQueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHQpOmV9LHQueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1uLHQpOnJ9LHQpfSx0YS5nZW9tLnBvbHlnb249ZnVuY3Rpb24obil7cmV0dXJuIHhhKG4sbmwpLG59O3ZhciBubD10YS5nZW9tLnBvbHlnb24ucHJvdG90eXBlPVtdO25sLmFyZWE9ZnVuY3Rpb24oKXtmb3IodmFyIG4sdD0tMSxlPXRoaXMubGVuZ3RoLHI9dGhpc1tlLTFdLHU9MDsrK3Q8ZTspbj1yLHI9dGhpc1t0XSx1Kz1uWzFdKnJbMF0tblswXSpyWzFdO3JldHVybi41KnV9LG5sLmNlbnRyb2lkPWZ1bmN0aW9uKG4pe3ZhciB0LGUscj0tMSx1PXRoaXMubGVuZ3RoLGk9MCxvPTAsYT10aGlzW3UtMV07Zm9yKGFyZ3VtZW50cy5sZW5ndGh8fChuPS0xLyg2KnRoaXMuYXJlYSgpKSk7KytyPHU7KXQ9YSxhPXRoaXNbcl0sZT10WzBdKmFbMV0tYVswXSp0WzFdLGkrPSh0WzBdK2FbMF0pKmUsbys9KHRbMV0rYVsxXSkqZTtyZXR1cm5baSpuLG8qbl19LG5sLmNsaXA9ZnVuY3Rpb24obil7Zm9yKHZhciB0LGUscix1LGksbyxhPVRyKG4pLGM9LTEsbD10aGlzLmxlbmd0aC1Ucih0aGlzKSxzPXRoaXNbbC0xXTsrK2M8bDspe2Zvcih0PW4uc2xpY2UoKSxuLmxlbmd0aD0wLHU9dGhpc1tjXSxpPXRbKHI9dC5sZW5ndGgtYSktMV0sZT0tMTsrK2U8cjspbz10W2VdLHFyKG8scyx1KT8ocXIoaSxzLHUpfHxuLnB1c2goTHIoaSxvLHMsdSkpLG4ucHVzaChvKSk6cXIoaSxzLHUpJiZuLnB1c2goTHIoaSxvLHMsdSkpLGk9bzthJiZuLnB1c2goblswXSkscz11fXJldHVybiBufTt2YXIgdGwsZWwscmwsdWwsaWwsb2w9W10sYWw9W107T3IucHJvdG90eXBlLnByZXBhcmU9ZnVuY3Rpb24oKXtmb3IodmFyIG4sdD10aGlzLmVkZ2VzLGU9dC5sZW5ndGg7ZS0tOyluPXRbZV0uZWRnZSxuLmImJm4uYXx8dC5zcGxpY2UoZSwxKTtyZXR1cm4gdC5zb3J0KElyKSx0Lmxlbmd0aH0sUXIucHJvdG90eXBlPXtzdGFydDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2UubD09PXRoaXMuc2l0ZT90aGlzLmVkZ2UuYTp0aGlzLmVkZ2UuYn0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZS5sPT09dGhpcy5zaXRlP3RoaXMuZWRnZS5iOnRoaXMuZWRnZS5hfX0sbnUucHJvdG90eXBlPXtpbnNlcnQ6ZnVuY3Rpb24obix0KXt2YXIgZSxyLHU7aWYobil7aWYodC5QPW4sdC5OPW4uTixuLk4mJihuLk4uUD10KSxuLk49dCxuLlIpe2ZvcihuPW4uUjtuLkw7KW49bi5MO24uTD10fWVsc2Ugbi5SPXQ7ZT1ufWVsc2UgdGhpcy5fPyhuPXV1KHRoaXMuXyksdC5QPW51bGwsdC5OPW4sbi5QPW4uTD10LGU9bik6KHQuUD10Lk49bnVsbCx0aGlzLl89dCxlPW51bGwpO2Zvcih0Lkw9dC5SPW51bGwsdC5VPWUsdC5DPSEwLG49dDtlJiZlLkM7KXI9ZS5VLGU9PT1yLkw/KHU9ci5SLHUmJnUuQz8oZS5DPXUuQz0hMSxyLkM9ITAsbj1yKToobj09PWUuUiYmKGV1KHRoaXMsZSksbj1lLGU9bi5VKSxlLkM9ITEsci5DPSEwLHJ1KHRoaXMscikpKToodT1yLkwsdSYmdS5DPyhlLkM9dS5DPSExLHIuQz0hMCxuPXIpOihuPT09ZS5MJiYocnUodGhpcyxlKSxuPWUsZT1uLlUpLGUuQz0hMSxyLkM9ITAsZXUodGhpcyxyKSkpLGU9bi5VO3RoaXMuXy5DPSExfSxyZW1vdmU6ZnVuY3Rpb24obil7bi5OJiYobi5OLlA9bi5QKSxuLlAmJihuLlAuTj1uLk4pLG4uTj1uLlA9bnVsbDt2YXIgdCxlLHIsdT1uLlUsaT1uLkwsbz1uLlI7aWYoZT1pP28/dXUobyk6aTpvLHU/dS5MPT09bj91Lkw9ZTp1LlI9ZTp0aGlzLl89ZSxpJiZvPyhyPWUuQyxlLkM9bi5DLGUuTD1pLGkuVT1lLGUhPT1vPyh1PWUuVSxlLlU9bi5VLG49ZS5SLHUuTD1uLGUuUj1vLG8uVT1lKTooZS5VPXUsdT1lLG49ZS5SKSk6KHI9bi5DLG49ZSksbiYmKG4uVT11KSwhcil7aWYobiYmbi5DKXJldHVybiBuLkM9ITEsdm9pZCAwO2Rve2lmKG49PT10aGlzLl8pYnJlYWs7aWYobj09PXUuTCl7aWYodD11LlIsdC5DJiYodC5DPSExLHUuQz0hMCxldSh0aGlzLHUpLHQ9dS5SKSx0LkwmJnQuTC5DfHx0LlImJnQuUi5DKXt0LlImJnQuUi5DfHwodC5MLkM9ITEsdC5DPSEwLHJ1KHRoaXMsdCksdD11LlIpLHQuQz11LkMsdS5DPXQuUi5DPSExLGV1KHRoaXMsdSksbj10aGlzLl87YnJlYWt9fWVsc2UgaWYodD11LkwsdC5DJiYodC5DPSExLHUuQz0hMCxydSh0aGlzLHUpLHQ9dS5MKSx0LkwmJnQuTC5DfHx0LlImJnQuUi5DKXt0LkwmJnQuTC5DfHwodC5SLkM9ITEsdC5DPSEwLGV1KHRoaXMsdCksdD11LkwpLHQuQz11LkMsdS5DPXQuTC5DPSExLHJ1KHRoaXMsdSksbj10aGlzLl87YnJlYWt9dC5DPSEwLG49dSx1PXUuVX13aGlsZSghbi5DKTtuJiYobi5DPSExKX19fSx0YS5nZW9tLnZvcm9ub2k9ZnVuY3Rpb24obil7ZnVuY3Rpb24gdChuKXt2YXIgdD1uZXcgQXJyYXkobi5sZW5ndGgpLHI9YVswXVswXSx1PWFbMF1bMV0saT1hWzFdWzBdLG89YVsxXVsxXTtyZXR1cm4gaXUoZShuKSxhKS5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKGUsYSl7dmFyIGM9ZS5lZGdlcyxsPWUuc2l0ZSxzPXRbYV09Yy5sZW5ndGg/Yy5tYXAoZnVuY3Rpb24obil7dmFyIHQ9bi5zdGFydCgpO3JldHVyblt0LngsdC55XX0pOmwueD49ciYmbC54PD1pJiZsLnk+PXUmJmwueTw9bz9bW3Isb10sW2ksb10sW2ksdV0sW3IsdV1dOltdO3MucG9pbnQ9blthXX0pLHR9ZnVuY3Rpb24gZShuKXtyZXR1cm4gbi5tYXAoZnVuY3Rpb24obix0KXtyZXR1cm57eDpNYXRoLnJvdW5kKGkobix0KS9UYSkqVGEseTpNYXRoLnJvdW5kKG8obix0KS9UYSkqVGEsaTp0fX0pfXZhciByPUFyLHU9TnIsaT1yLG89dSxhPWNsO3JldHVybiBuP3Qobik6KHQubGlua3M9ZnVuY3Rpb24obil7cmV0dXJuIGl1KGUobikpLmVkZ2VzLmZpbHRlcihmdW5jdGlvbihuKXtyZXR1cm4gbi5sJiZuLnJ9KS5tYXAoZnVuY3Rpb24odCl7cmV0dXJue3NvdXJjZTpuW3QubC5pXSx0YXJnZXQ6blt0LnIuaV19fSl9LHQudHJpYW5nbGVzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO3JldHVybiBpdShlKG4pKS5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKGUscil7Zm9yKHZhciB1LGksbz1lLnNpdGUsYT1lLmVkZ2VzLnNvcnQoSXIpLGM9LTEsbD1hLmxlbmd0aCxzPWFbbC0xXS5lZGdlLGY9cy5sPT09bz9zLnI6cy5sOysrYzxsOyl1PXMsaT1mLHM9YVtjXS5lZGdlLGY9cy5sPT09bz9zLnI6cy5sLHI8aS5pJiZyPGYuaSYmYXUobyxpLGYpPDAmJnQucHVzaChbbltyXSxuW2kuaV0sbltmLmldXSl9KSx0fSx0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9a3Qocj1uKSx0KTpyfSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89a3QodT1uKSx0KTp1fSx0LmNsaXBFeHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9bnVsbD09bj9jbDpuLHQpOmE9PT1jbD9udWxsOmF9LHQuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90LmNsaXBFeHRlbnQobiYmW1swLDBdLG5dKTphPT09Y2w/bnVsbDphJiZhWzFdfSx0KX07dmFyIGNsPVtbLTFlNiwtMWU2XSxbMWU2LDFlNl1dO3RhLmdlb20uZGVsYXVuYXk9ZnVuY3Rpb24obil7cmV0dXJuIHRhLmdlb20udm9yb25vaSgpLnRyaWFuZ2xlcyhuKX0sdGEuZ2VvbS5xdWFkdHJlZT1mdW5jdGlvbihuLHQsZSxyLHUpe2Z1bmN0aW9uIGkobil7ZnVuY3Rpb24gaShuLHQsZSxyLHUsaSxvLGEpe2lmKCFpc05hTihlKSYmIWlzTmFOKHIpKWlmKG4ubGVhZil7dmFyIGM9bi54LHM9bi55O2lmKG51bGwhPWMpaWYodmEoYy1lKSt2YShzLXIpPC4wMSlsKG4sdCxlLHIsdSxpLG8sYSk7ZWxzZXt2YXIgZj1uLnBvaW50O24ueD1uLnk9bi5wb2ludD1udWxsLGwobixmLGMscyx1LGksbyxhKSxsKG4sdCxlLHIsdSxpLG8sYSl9ZWxzZSBuLng9ZSxuLnk9cixuLnBvaW50PXR9ZWxzZSBsKG4sdCxlLHIsdSxpLG8sYSl9ZnVuY3Rpb24gbChuLHQsZSxyLHUsbyxhLGMpe3ZhciBsPS41Kih1K2EpLHM9LjUqKG8rYyksZj1lPj1sLGg9cj49cyxnPWg8PDF8ZjtuLmxlYWY9ITEsbj1uLm5vZGVzW2ddfHwobi5ub2Rlc1tnXT1zdSgpKSxmP3U9bDphPWwsaD9vPXM6Yz1zLGkobix0LGUscix1LG8sYSxjKX12YXIgcyxmLGgsZyxwLHYsZCxtLHksTT1rdChhKSx4PWt0KGMpO2lmKG51bGwhPXQpdj10LGQ9ZSxtPXIseT11O2Vsc2UgaWYobT15PS0odj1kPTEvMCksZj1bXSxoPVtdLHA9bi5sZW5ndGgsbylmb3IoZz0wO3A+ZzsrK2cpcz1uW2ddLHMueDx2JiYodj1zLngpLHMueTxkJiYoZD1zLnkpLHMueD5tJiYobT1zLngpLHMueT55JiYoeT1zLnkpLGYucHVzaChzLngpLGgucHVzaChzLnkpO2Vsc2UgZm9yKGc9MDtwPmc7KytnKXt2YXIgYj0rTShzPW5bZ10sZyksXz0reChzLGcpO3Y+YiYmKHY9YiksZD5fJiYoZD1fKSxiPm0mJihtPWIpLF8+eSYmKHk9XyksZi5wdXNoKGIpLGgucHVzaChfKX12YXIgdz1tLXYsUz15LWQ7dz5TP3k9ZCt3Om09ditTO3ZhciBrPXN1KCk7aWYoay5hZGQ9ZnVuY3Rpb24obil7aShrLG4sK00obiwrK2cpLCt4KG4sZyksdixkLG0seSl9LGsudmlzaXQ9ZnVuY3Rpb24obil7ZnUobixrLHYsZCxtLHkpfSxrLmZpbmQ9ZnVuY3Rpb24obil7cmV0dXJuIGh1KGssblswXSxuWzFdLHYsZCxtLHkpfSxnPS0xLG51bGw9PXQpe2Zvcig7KytnPHA7KWkoayxuW2ddLGZbZ10saFtnXSx2LGQsbSx5KTstLWd9ZWxzZSBuLmZvckVhY2goay5hZGQpO3JldHVybiBmPWg9bj1zPW51bGwsa312YXIgbyxhPUFyLGM9TnI7cmV0dXJuKG89YXJndW1lbnRzLmxlbmd0aCk/KGE9Y3UsYz1sdSwzPT09byYmKHU9ZSxyPXQsZT10PTApLGkobikpOihpLng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9bixpKTphfSxpLnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9bixpKTpjfSxpLmV4dGVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09bj90PWU9cj11PW51bGw6KHQ9K25bMF1bMF0sZT0rblswXVsxXSxyPStuWzFdWzBdLHU9K25bMV1bMV0pLGkpOm51bGw9PXQ/bnVsbDpbW3QsZV0sW3IsdV1dfSxpLnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PW4/dD1lPXI9dT1udWxsOih0PWU9MCxyPStuWzBdLHU9K25bMV0pLGkpOm51bGw9PXQ/bnVsbDpbci10LHUtZV19LGkpfSx0YS5pbnRlcnBvbGF0ZVJnYj1ndSx0YS5pbnRlcnBvbGF0ZU9iamVjdD1wdSx0YS5pbnRlcnBvbGF0ZU51bWJlcj12dSx0YS5pbnRlcnBvbGF0ZVN0cmluZz1kdTt2YXIgbGw9L1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLHNsPW5ldyBSZWdFeHAobGwuc291cmNlLCJnIik7dGEuaW50ZXJwb2xhdGU9bXUsdGEuaW50ZXJwb2xhdG9ycz1bZnVuY3Rpb24obix0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4oInN0cmluZyI9PT1lP3RjLmhhcyh0KXx8L14oI3xyZ2JcKHxoc2xcKCkvLnRlc3QodCk/Z3U6ZHU6dCBpbnN0YW5jZW9mIGl0P2d1OkFycmF5LmlzQXJyYXkodCk/eXU6Im9iamVjdCI9PT1lJiZpc05hTih0KT9wdTp2dSkobix0KX1dLHRhLmludGVycG9sYXRlQXJyYXk9eXU7dmFyIGZsPWZ1bmN0aW9uKCl7cmV0dXJuIEV0fSxobD10YS5tYXAoe2xpbmVhcjpmbCxwb2x5Omt1LHF1YWQ6ZnVuY3Rpb24oKXtyZXR1cm4gX3V9LGN1YmljOmZ1bmN0aW9uKCl7cmV0dXJuIHd1fSxzaW46ZnVuY3Rpb24oKXtyZXR1cm4gRXV9LGV4cDpmdW5jdGlvbigpe3JldHVybiBBdX0sY2lyY2xlOmZ1bmN0aW9uKCl7cmV0dXJuIE51fSxlbGFzdGljOkN1LGJhY2s6enUsYm91bmNlOmZ1bmN0aW9uKCl7cmV0dXJuIHF1fX0pLGdsPXRhLm1hcCh7ImluIjpFdCxvdXQ6eHUsImluLW91dCI6YnUsIm91dC1pbiI6ZnVuY3Rpb24obil7cmV0dXJuIGJ1KHh1KG4pKX19KTt0YS5lYXNlPWZ1bmN0aW9uKG4pe3ZhciB0PW4uaW5kZXhPZigiLSIpLGU9dD49MD9uLnNsaWNlKDAsdCk6bixyPXQ+PTA/bi5zbGljZSh0KzEpOiJpbiI7cmV0dXJuIGU9aGwuZ2V0KGUpfHxmbCxyPWdsLmdldChyKXx8RXQsTXUocihlLmFwcGx5KG51bGwsZWEuY2FsbChhcmd1bWVudHMsMSkpKSl9LHRhLmludGVycG9sYXRlSGNsPUx1LHRhLmludGVycG9sYXRlSHNsPVR1LHRhLmludGVycG9sYXRlTGFiPVJ1LHRhLmludGVycG9sYXRlUm91bmQ9RHUsdGEudHJhbnNmb3JtPWZ1bmN0aW9uKG4pe3ZhciB0PXVhLmNyZWF0ZUVsZW1lbnROUyh0YS5ucy5wcmVmaXguc3ZnLCJnIik7cmV0dXJuKHRhLnRyYW5zZm9ybT1mdW5jdGlvbihuKXtpZihudWxsIT1uKXt0LnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIixuKTt2YXIgZT10LnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCl9cmV0dXJuIG5ldyBQdShlP2UubWF0cml4OnBsKX0pKG4pfSxQdS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4idHJhbnNsYXRlKCIrdGhpcy50cmFuc2xhdGUrIilyb3RhdGUoIit0aGlzLnJvdGF0ZSsiKXNrZXdYKCIrdGhpcy5za2V3KyIpc2NhbGUoIit0aGlzLnNjYWxlKyIpIn07dmFyIHBsPXthOjEsYjowLGM6MCxkOjEsZTowLGY6MH07dGEuaW50ZXJwb2xhdGVUcmFuc2Zvcm09SHUsdGEubGF5b3V0PXt9LHRhLmxheW91dC5idW5kbGU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obil7Zm9yKHZhciB0PVtdLGU9LTEscj1uLmxlbmd0aDsrK2U8cjspdC5wdXNoKEl1KG5bZV0pKTtyZXR1cm4gdH19LHRhLmxheW91dC5jaG9yZD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt2YXIgbixsLGYsaCxnLHA9e30sdj1bXSxkPXRhLnJhbmdlKGkpLG09W107Zm9yKGU9W10scj1bXSxuPTAsaD0tMTsrK2g8aTspe2ZvcihsPTAsZz0tMTsrK2c8aTspbCs9dVtoXVtnXTt2LnB1c2gobCksbS5wdXNoKHRhLnJhbmdlKGkpKSxuKz1sfWZvcihvJiZkLnNvcnQoZnVuY3Rpb24obix0KXtyZXR1cm4gbyh2W25dLHZbdF0pfSksYSYmbS5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7bi5zb3J0KGZ1bmN0aW9uKG4sZSl7cmV0dXJuIGEodVt0XVtuXSx1W3RdW2VdKX0pfSksbj0oUGEtcyppKS9uLGw9MCxoPS0xOysraDxpOyl7Zm9yKGY9bCxnPS0xOysrZzxpOyl7dmFyIHk9ZFtoXSxNPW1beV1bZ10seD11W3ldW01dLGI9bCxfPWwrPXgqbjtwW3krIi0iK01dPXtpbmRleDp5LHN1YmluZGV4Ok0sc3RhcnRBbmdsZTpiLGVuZEFuZ2xlOl8sdmFsdWU6eH19clt5XT17aW5kZXg6eSxzdGFydEFuZ2xlOmYsZW5kQW5nbGU6bCx2YWx1ZToobC1mKS9ufSxsKz1zfWZvcihoPS0xOysraDxpOylmb3IoZz1oLTE7KytnPGk7KXt2YXIgdz1wW2grIi0iK2ddLFM9cFtnKyItIitoXTsody52YWx1ZXx8Uy52YWx1ZSkmJmUucHVzaCh3LnZhbHVlPFMudmFsdWU/e3NvdXJjZTpTLHRhcmdldDp3fTp7c291cmNlOncsdGFyZ2V0OlN9KX1jJiZ0KCl9ZnVuY3Rpb24gdCgpe2Uuc29ydChmdW5jdGlvbihuLHQpe3JldHVybiBjKChuLnNvdXJjZS52YWx1ZStuLnRhcmdldC52YWx1ZSkvMiwodC5zb3VyY2UudmFsdWUrdC50YXJnZXQudmFsdWUpLzIpfSl9dmFyIGUscix1LGksbyxhLGMsbD17fSxzPTA7cmV0dXJuIGwubWF0cml4PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSh1PW4pJiZ1Lmxlbmd0aCxlPXI9bnVsbCxsKTp1fSxsLnBhZGRpbmc9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9bixlPXI9bnVsbCxsKTpzfSxsLnNvcnRHcm91cHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bixlPXI9bnVsbCxsKTpvfSxsLnNvcnRTdWJncm91cHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9bixlPW51bGwsbCk6YX0sbC5zb3J0Q2hvcmRzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW4sZSYmdCgpLGwpOmN9LGwuY2hvcmRzPWZ1bmN0aW9uKCl7cmV0dXJuIGV8fG4oKSxlfSxsLmdyb3Vwcz1mdW5jdGlvbigpe3JldHVybiByfHxuKCkscn0sbH0sdGEubGF5b3V0LmZvcmNlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gZnVuY3Rpb24odCxlLHIsdSl7aWYodC5wb2ludCE9PW4pe3ZhciBpPXQuY3gtbi54LG89dC5jeS1uLnksYT11LWUsYz1pKmkrbypvO2lmKGM+YSphL2Qpe2lmKHA+Yyl7dmFyIGw9dC5jaGFyZ2UvYztuLnB4LT1pKmwsbi5weS09bypsfXJldHVybiEwfWlmKHQucG9pbnQmJmMmJnA+Yyl7dmFyIGw9dC5wb2ludENoYXJnZS9jO24ucHgtPWkqbCxuLnB5LT1vKmx9fXJldHVybiF0LmNoYXJnZX19ZnVuY3Rpb24gdChuKXtuLnB4PXRhLmV2ZW50Lngsbi5weT10YS5ldmVudC55LGEucmVzdW1lKCl9dmFyIGUscix1LGksbyxhPXt9LGM9dGEuZGlzcGF0Y2goInN0YXJ0IiwidGljayIsImVuZCIpLGw9WzEsMV0scz0uOSxmPXZsLGg9ZGwsZz0tMzAscD1tbCx2PS4xLGQ9LjY0LG09W10seT1bXTtyZXR1cm4gYS50aWNrPWZ1bmN0aW9uKCl7aWYoKHIqPS45OSk8LjAwNSlyZXR1cm4gYy5lbmQoe3R5cGU6ImVuZCIsYWxwaGE6cj0wfSksITA7dmFyIHQsZSxhLGYsaCxwLGQsTSx4LGI9bS5sZW5ndGgsXz15Lmxlbmd0aDtmb3IoZT0wO18+ZTsrK2UpYT15W2VdLGY9YS5zb3VyY2UsaD1hLnRhcmdldCxNPWgueC1mLngseD1oLnktZi55LChwPU0qTSt4KngpJiYocD1yKmlbZV0qKChwPU1hdGguc3FydChwKSktdVtlXSkvcCxNKj1wLHgqPXAsaC54LT1NKihkPWYud2VpZ2h0LyhoLndlaWdodCtmLndlaWdodCkpLGgueS09eCpkLGYueCs9TSooZD0xLWQpLGYueSs9eCpkKTtpZigoZD1yKnYpJiYoTT1sWzBdLzIseD1sWzFdLzIsZT0tMSxkKSlmb3IoOysrZTxiOylhPW1bZV0sYS54Kz0oTS1hLngpKmQsYS55Kz0oeC1hLnkpKmQ7aWYoZylmb3IoSnUodD10YS5nZW9tLnF1YWR0cmVlKG0pLHIsbyksZT0tMTsrK2U8YjspKGE9bVtlXSkuZml4ZWR8fHQudmlzaXQobihhKSk7Zm9yKGU9LTE7KytlPGI7KWE9bVtlXSxhLmZpeGVkPyhhLng9YS5weCxhLnk9YS5weSk6KGEueC09KGEucHgtKGEucHg9YS54KSkqcyxhLnktPShhLnB5LShhLnB5PWEueSkpKnMpO2MudGljayh7dHlwZToidGljayIsYWxwaGE6cn0pfSxhLm5vZGVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPW4sYSk6bX0sYS5saW5rcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT1uLGEpOnl9LGEuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1uLGEpOmx9LGEubGlua0Rpc3RhbmNlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246K24sYSk6Zn0sYS5kaXN0YW5jZT1hLmxpbmtEaXN0YW5jZSxhLmxpbmtTdHJlbmd0aD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOituLGEpOmh9LGEuZnJpY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9K24sYSk6c30sYS5jaGFyZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjorbixhKTpnfSxhLmNoYXJnZURpc3RhbmNlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPW4qbixhKTpNYXRoLnNxcnQocCl9LGEuZ3Jhdml0eT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj0rbixhKTp2fSxhLnRoZXRhPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPW4qbixhKTpNYXRoLnNxcnQoZCl9LGEuYWxwaGE9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K24scj9yPW4+MD9uOjA6bj4wJiYoYy5zdGFydCh7dHlwZToic3RhcnQiLGFscGhhOnI9bn0pLHRhLnRpbWVyKGEudGljaykpLGEpOnJ9LGEuc3RhcnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4scil7aWYoIWUpe2ZvcihlPW5ldyBBcnJheShjKSxhPTA7Yz5hOysrYSllW2FdPVtdO2ZvcihhPTA7bD5hOysrYSl7dmFyIHU9eVthXTtlW3Uuc291cmNlLmluZGV4XS5wdXNoKHUudGFyZ2V0KSxlW3UudGFyZ2V0LmluZGV4XS5wdXNoKHUuc291cmNlKX19Zm9yKHZhciBpLG89ZVt0XSxhPS0xLGw9by5sZW5ndGg7KythPGw7KWlmKCFpc05hTihpPW9bYV1bbl0pKXJldHVybiBpO3JldHVybiBNYXRoLnJhbmRvbSgpKnJ9dmFyIHQsZSxyLGM9bS5sZW5ndGgscz15Lmxlbmd0aCxwPWxbMF0sdj1sWzFdO2Zvcih0PTA7Yz50OysrdCkocj1tW3RdKS5pbmRleD10LHIud2VpZ2h0PTA7Zm9yKHQ9MDtzPnQ7Kyt0KXI9eVt0XSwibnVtYmVyIj09dHlwZW9mIHIuc291cmNlJiYoci5zb3VyY2U9bVtyLnNvdXJjZV0pLCJudW1iZXIiPT10eXBlb2Ygci50YXJnZXQmJihyLnRhcmdldD1tW3IudGFyZ2V0XSksKytyLnNvdXJjZS53ZWlnaHQsKytyLnRhcmdldC53ZWlnaHQ7Zm9yKHQ9MDtjPnQ7Kyt0KXI9bVt0XSxpc05hTihyLngpJiYoci54PW4oIngiLHApKSxpc05hTihyLnkpJiYoci55PW4oInkiLHYpKSxpc05hTihyLnB4KSYmKHIucHg9ci54KSxpc05hTihyLnB5KSYmKHIucHk9ci55KTtpZih1PVtdLCJmdW5jdGlvbiI9PXR5cGVvZiBmKWZvcih0PTA7cz50OysrdCl1W3RdPStmLmNhbGwodGhpcyx5W3RdLHQpO2Vsc2UgZm9yKHQ9MDtzPnQ7Kyt0KXVbdF09ZjtpZihpPVtdLCJmdW5jdGlvbiI9PXR5cGVvZiBoKWZvcih0PTA7cz50OysrdClpW3RdPStoLmNhbGwodGhpcyx5W3RdLHQpO2Vsc2UgZm9yKHQ9MDtzPnQ7Kyt0KWlbdF09aDtpZihvPVtdLCJmdW5jdGlvbiI9PXR5cGVvZiBnKWZvcih0PTA7Yz50OysrdClvW3RdPStnLmNhbGwodGhpcyxtW3RdLHQpO2Vsc2UgZm9yKHQ9MDtjPnQ7Kyt0KW9bdF09ZztyZXR1cm4gYS5yZXN1bWUoKX0sYS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hbHBoYSguMSl9LGEuc3RvcD1mdW5jdGlvbigpe3JldHVybiBhLmFscGhhKDApfSxhLmRyYWc9ZnVuY3Rpb24oKXtyZXR1cm4gZXx8KGU9dGEuYmVoYXZpb3IuZHJhZygpLm9yaWdpbihFdCkub24oImRyYWdzdGFydC5mb3JjZSIsWHUpLm9uKCJkcmFnLmZvcmNlIix0KS5vbigiZHJhZ2VuZC5mb3JjZSIsJHUpKSxhcmd1bWVudHMubGVuZ3RoPyh0aGlzLm9uKCJtb3VzZW92ZXIuZm9yY2UiLEJ1KS5vbigibW91c2VvdXQuZm9yY2UiLFd1KS5jYWxsKGUpLHZvaWQgMCk6ZX0sdGEucmViaW5kKGEsYywib24iKX07dmFyIHZsPTIwLGRsPTEsbWw9MS8wO3RhLmxheW91dC5oaWVyYXJjaHk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKHUpe3ZhciBpLG89W3VdLGE9W107Zm9yKHUuZGVwdGg9MDtudWxsIT0oaT1vLnBvcCgpKTspaWYoYS5wdXNoKGkpLChsPWUuY2FsbChuLGksaS5kZXB0aCkpJiYoYz1sLmxlbmd0aCkpe2Zvcih2YXIgYyxsLHM7LS1jPj0wOylvLnB1c2gocz1sW2NdKSxzLnBhcmVudD1pLHMuZGVwdGg9aS5kZXB0aCsxO3ImJihpLnZhbHVlPTApLGkuY2hpbGRyZW49bH1lbHNlIHImJihpLnZhbHVlPStyLmNhbGwobixpLGkuZGVwdGgpfHwwKSxkZWxldGUgaS5jaGlsZHJlbjtyZXR1cm4gUXUodSxmdW5jdGlvbihuKXt2YXIgZSx1O3QmJihlPW4uY2hpbGRyZW4pJiZlLnNvcnQodCksciYmKHU9bi5wYXJlbnQpJiYodS52YWx1ZSs9bi52YWx1ZSl9KSxhfXZhciB0PWVpLGU9bmkscj10aTtyZXR1cm4gbi5zb3J0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsbik6dH0sbi5jaGlsZHJlbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4udmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxuKTpyfSxuLnJldmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIHImJihLdSh0LGZ1bmN0aW9uKG4pe24uY2hpbGRyZW4mJihuLnZhbHVlPTApfSksUXUodCxmdW5jdGlvbih0KXt2YXIgZTt0LmNoaWxkcmVufHwodC52YWx1ZT0rci5jYWxsKG4sdCx0LmRlcHRoKXx8MCksKGU9dC5wYXJlbnQpJiYoZS52YWx1ZSs9dC52YWx1ZSl9KSksdH0sbn0sdGEubGF5b3V0LnBhcnRpdGlvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odCxlLHIsdSl7dmFyIGk9dC5jaGlsZHJlbjtpZih0Lng9ZSx0Lnk9dC5kZXB0aCp1LHQuZHg9cix0LmR5PXUsaSYmKG89aS5sZW5ndGgpKXt2YXIgbyxhLGMsbD0tMTtmb3Iocj10LnZhbHVlP3IvdC52YWx1ZTowOysrbDxvOyluKGE9aVtsXSxlLGM9YS52YWx1ZSpyLHUpLGUrPWN9fWZ1bmN0aW9uIHQobil7dmFyIGU9bi5jaGlsZHJlbixyPTA7aWYoZSYmKHU9ZS5sZW5ndGgpKWZvcih2YXIgdSxpPS0xOysraTx1OylyPU1hdGgubWF4KHIsdChlW2ldKSk7cmV0dXJuIDErcn1mdW5jdGlvbiBlKGUsaSl7dmFyIG89ci5jYWxsKHRoaXMsZSxpKTtyZXR1cm4gbihvWzBdLDAsdVswXSx1WzFdL3Qob1swXSkpLG99dmFyIHI9dGEubGF5b3V0LmhpZXJhcmNoeSgpLHU9WzEsMV07cmV0dXJuIGUuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1uLGUpOnV9LEd1KGUscil9LHRhLmxheW91dC5waWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG8pe3ZhciBhLGM9by5sZW5ndGgsbD1vLm1hcChmdW5jdGlvbihlLHIpe3JldHVybit0LmNhbGwobixlLHIpfSkscz0rKCJmdW5jdGlvbiI9PXR5cGVvZiByP3IuYXBwbHkodGhpcyxhcmd1bWVudHMpOnIpLGY9KCJmdW5jdGlvbiI9PXR5cGVvZiB1P3UuYXBwbHkodGhpcyxhcmd1bWVudHMpOnUpLXMsaD1NYXRoLm1pbihNYXRoLmFicyhmKS9jLCsoImZ1bmN0aW9uIj09dHlwZW9mIGk/aS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6aSkpLGc9aCooMD5mPy0xOjEpLHA9KGYtYypnKS90YS5zdW0obCksdj10YS5yYW5nZShjKSxkPVtdO3JldHVybiBudWxsIT1lJiZ2LnNvcnQoZT09PXlsP2Z1bmN0aW9uKG4sdCl7cmV0dXJuIGxbdF0tbFtuXX06ZnVuY3Rpb24obix0KXtyZXR1cm4gZShvW25dLG9bdF0pfSksdi5mb3JFYWNoKGZ1bmN0aW9uKG4pe2Rbbl09e2RhdGE6b1tuXSx2YWx1ZTphPWxbbl0sc3RhcnRBbmdsZTpzLGVuZEFuZ2xlOnMrPWEqcCtnLHBhZEFuZ2xlOmh9fSksZH12YXIgdD1OdW1iZXIsZT15bCxyPTAsdT1QYSxpPTA7cmV0dXJuIG4udmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLnNvcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxuKTpyfSxuLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsbik6dX0sbi5wYWRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LG4pOml9LG59O3ZhciB5bD17fTt0YS5sYXlvdXQuc3RhY2s9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKGEsYyl7aWYoIShoPWEubGVuZ3RoKSlyZXR1cm4gYTt2YXIgbD1hLm1hcChmdW5jdGlvbihlLHIpe3JldHVybiB0LmNhbGwobixlLHIpfSkscz1sLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5tYXAoZnVuY3Rpb24odCxlKXtyZXR1cm5baS5jYWxsKG4sdCxlKSxvLmNhbGwobix0LGUpXX0pfSksZj1lLmNhbGwobixzLGMpO2w9dGEucGVybXV0ZShsLGYpLHM9dGEucGVybXV0ZShzLGYpO3ZhciBoLGcscCx2LGQ9ci5jYWxsKG4scyxjKSxtPWxbMF0ubGVuZ3RoO2ZvcihwPTA7bT5wOysrcClmb3IodS5jYWxsKG4sbFswXVtwXSx2PWRbcF0sc1swXVtwXVsxXSksZz0xO2g+ZzsrK2cpdS5jYWxsKG4sbFtnXVtwXSx2Kz1zW2ctMV1bcF1bMV0sc1tnXVtwXVsxXSk7cmV0dXJuIGF9dmFyIHQ9RXQsZT1haSxyPWNpLHU9b2ksaT11aSxvPWlpO3JldHVybiBuLnZhbHVlcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLG4pOnR9LG4ub3JkZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpNbC5nZXQodCl8fGFpLG4pOmV9LG4ub2Zmc2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eGwuZ2V0KHQpfHxjaSxuKTpyfSxuLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dCxuKTppfSxuLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89dCxuKTpvfSxuLm91dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LG4pOnV9LG59O3ZhciBNbD10YS5tYXAoeyJpbnNpZGUtb3V0IjpmdW5jdGlvbihuKXt2YXIgdCxlLHI9bi5sZW5ndGgsdT1uLm1hcChsaSksaT1uLm1hcChzaSksbz10YS5yYW5nZShyKS5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIHVbbl0tdVt0XX0pLGE9MCxjPTAsbD1bXSxzPVtdO2Zvcih0PTA7cj50OysrdCllPW9bdF0sYz5hPyhhKz1pW2VdLGwucHVzaChlKSk6KGMrPWlbZV0scy5wdXNoKGUpKTtyZXR1cm4gcy5yZXZlcnNlKCkuY29uY2F0KGwpfSxyZXZlcnNlOmZ1bmN0aW9uKG4pe3JldHVybiB0YS5yYW5nZShuLmxlbmd0aCkucmV2ZXJzZSgpfSwiZGVmYXVsdCI6YWl9KSx4bD10YS5tYXAoe3NpbGhvdWV0dGU6ZnVuY3Rpb24obil7dmFyIHQsZSxyLHU9bi5sZW5ndGgsaT1uWzBdLmxlbmd0aCxvPVtdLGE9MCxjPVtdO2ZvcihlPTA7aT5lOysrZSl7Zm9yKHQ9MCxyPTA7dT50O3QrKylyKz1uW3RdW2VdWzFdO3I+YSYmKGE9ciksby5wdXNoKHIpfWZvcihlPTA7aT5lOysrZSljW2VdPShhLW9bZV0pLzI7cmV0dXJuIGN9LHdpZ2dsZTpmdW5jdGlvbihuKXt2YXIgdCxlLHIsdSxpLG8sYSxjLGwscz1uLmxlbmd0aCxmPW5bMF0saD1mLmxlbmd0aCxnPVtdO2ZvcihnWzBdPWM9bD0wLGU9MTtoPmU7KytlKXtmb3IodD0wLHU9MDtzPnQ7Kyt0KXUrPW5bdF1bZV1bMV07Zm9yKHQ9MCxpPTAsYT1mW2VdWzBdLWZbZS0xXVswXTtzPnQ7Kyt0KXtmb3Iocj0wLG89KG5bdF1bZV1bMV0tblt0XVtlLTFdWzFdKS8oMiphKTt0PnI7KytyKW8rPShuW3JdW2VdWzFdLW5bcl1bZS0xXVsxXSkvYTtpKz1vKm5bdF1bZV1bMV19Z1tlXT1jLT11P2kvdSphOjAsbD5jJiYobD1jKX1mb3IoZT0wO2g+ZTsrK2UpZ1tlXS09bDtyZXR1cm4gZ30sZXhwYW5kOmZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PW4ubGVuZ3RoLGk9blswXS5sZW5ndGgsbz0xL3UsYT1bXTtmb3IoZT0wO2k+ZTsrK2Upe2Zvcih0PTAscj0wO3U+dDt0Kyspcis9blt0XVtlXVsxXTtpZihyKWZvcih0PTA7dT50O3QrKyluW3RdW2VdWzFdLz1yO2Vsc2UgZm9yKHQ9MDt1PnQ7dCsrKW5bdF1bZV1bMV09b31mb3IoZT0wO2k+ZTsrK2UpYVtlXT0wO3JldHVybiBhfSx6ZXJvOmNpfSk7dGEubGF5b3V0Lmhpc3RvZ3JhbT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixpKXtmb3IodmFyIG8sYSxjPVtdLGw9bi5tYXAoZSx0aGlzKSxzPXIuY2FsbCh0aGlzLGwsaSksZj11LmNhbGwodGhpcyxzLGwsaSksaT0tMSxoPWwubGVuZ3RoLGc9Zi5sZW5ndGgtMSxwPXQ/MToxL2g7KytpPGc7KW89Y1tpXT1bXSxvLmR4PWZbaSsxXS0oby54PWZbaV0pLG8ueT0wO2lmKGc+MClmb3IoaT0tMTsrK2k8aDspYT1sW2ldLGE+PXNbMF0mJmE8PXNbMV0mJihvPWNbdGEuYmlzZWN0KGYsYSwxLGcpLTFdLG8ueSs9cCxvLnB1c2gobltpXSkpO3JldHVybiBjfXZhciB0PSEwLGU9TnVtYmVyLHI9cGksdT1oaTtyZXR1cm4gbi52YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4ucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9a3QodCksbik6cn0sbi5iaW5zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJudW1iZXIiPT10eXBlb2YgdD9mdW5jdGlvbihuKXtyZXR1cm4gZ2kobix0KX06a3QodCksbik6dX0sbi5mcmVxdWVuY3k9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ISFlLG4pOnR9LG59LHRhLmxheW91dC5wYWNrPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLGkpe3ZhciBvPWUuY2FsbCh0aGlzLG4saSksYT1vWzBdLGM9dVswXSxsPXVbMV0scz1udWxsPT10P01hdGguc3FydDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OmZ1bmN0aW9uKCl7cmV0dXJuIHR9O2lmKGEueD1hLnk9MCxRdShhLGZ1bmN0aW9uKG4pe24ucj0rcyhuLnZhbHVlKX0pLFF1KGEsTWkpLHIpe3ZhciBmPXIqKHQ/MTpNYXRoLm1heCgyKmEuci9jLDIqYS5yL2wpKS8yO1F1KGEsZnVuY3Rpb24obil7bi5yKz1mfSksUXUoYSxNaSksUXUoYSxmdW5jdGlvbihuKXtuLnItPWZ9KX1yZXR1cm4gX2koYSxjLzIsbC8yLHQ/MToxL01hdGgubWF4KDIqYS5yL2MsMiphLnIvbCkpLG99dmFyIHQsZT10YS5sYXlvdXQuaGllcmFyY2h5KCkuc29ydCh2aSkscj0wLHU9WzEsMV07cmV0dXJuIG4uc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LG4pOnV9LG4ucmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PWV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6K2Usbik6dH0sbi5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0LG4pOnJ9LEd1KG4sZSl9LHRhLmxheW91dC50cmVlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHUpe3ZhciBzPW8uY2FsbCh0aGlzLG4sdSksZj1zWzBdLGg9dChmKTtpZihRdShoLGUpLGgucGFyZW50Lm09LWgueixLdShoLHIpLGwpS3UoZixpKTtlbHNle3ZhciBnPWYscD1mLHY9ZjtLdShmLGZ1bmN0aW9uKG4pe24ueDxnLngmJihnPW4pLG4ueD5wLngmJihwPW4pLG4uZGVwdGg+di5kZXB0aCYmKHY9bil9KTt2YXIgZD1hKGcscCkvMi1nLngsbT1jWzBdLyhwLngrYShwLGcpLzIrZCkseT1jWzFdLyh2LmRlcHRofHwxKTtLdShmLGZ1bmN0aW9uKG4pe24ueD0obi54K2QpKm0sbi55PW4uZGVwdGgqeX0pfXJldHVybiBzfWZ1bmN0aW9uIHQobil7Zm9yKHZhciB0LGU9e0E6bnVsbCxjaGlsZHJlbjpbbl19LHI9W2VdO251bGwhPSh0PXIucG9wKCkpOylmb3IodmFyIHUsaT10LmNoaWxkcmVuLG89MCxhPWkubGVuZ3RoO2E+bzsrK28pci5wdXNoKChpW29dPXU9e186aVtvXSxwYXJlbnQ6dCxjaGlsZHJlbjoodT1pW29dLmNoaWxkcmVuKSYmdS5zbGljZSgpfHxbXSxBOm51bGwsYTpudWxsLHo6MCxtOjAsYzowLHM6MCx0Om51bGwsaTpvfSkuYT11KTtyZXR1cm4gZS5jaGlsZHJlblswXX1mdW5jdGlvbiBlKG4pe3ZhciB0PW4uY2hpbGRyZW4sZT1uLnBhcmVudC5jaGlsZHJlbixyPW4uaT9lW24uaS0xXTpudWxsO2lmKHQubGVuZ3RoKXtOaShuKTt2YXIgaT0odFswXS56K3RbdC5sZW5ndGgtMV0ueikvMjtyPyhuLno9ci56K2Eobi5fLHIuXyksbi5tPW4uei1pKTpuLno9aX1lbHNlIHImJihuLno9ci56K2Eobi5fLHIuXykpO24ucGFyZW50LkE9dShuLHIsbi5wYXJlbnQuQXx8ZVswXSl9ZnVuY3Rpb24gcihuKXtuLl8ueD1uLnorbi5wYXJlbnQubSxuLm0rPW4ucGFyZW50Lm19ZnVuY3Rpb24gdShuLHQsZSl7aWYodCl7Zm9yKHZhciByLHU9bixpPW4sbz10LGM9dS5wYXJlbnQuY2hpbGRyZW5bMF0sbD11Lm0scz1pLm0sZj1vLm0saD1jLm07bz1FaShvKSx1PWtpKHUpLG8mJnU7KWM9a2koYyksaT1FaShpKSxpLmE9bixyPW8ueitmLXUuei1sK2Eoby5fLHUuXykscj4wJiYoQWkoQ2kobyxuLGUpLG4sciksbCs9cixzKz1yKSxmKz1vLm0sbCs9dS5tLGgrPWMubSxzKz1pLm07byYmIUVpKGkpJiYoaS50PW8saS5tKz1mLXMpLHUmJiFraShjKSYmKGMudD11LGMubSs9bC1oLGU9bil9cmV0dXJuIGV9ZnVuY3Rpb24gaShuKXtuLngqPWNbMF0sbi55PW4uZGVwdGgqY1sxXX12YXIgbz10YS5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChudWxsKS52YWx1ZShudWxsKSxhPVNpLGM9WzEsMV0sbD1udWxsO3JldHVybiBuLnNlcGFyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCxuKTphfSxuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9bnVsbD09KGM9dCk/aTpudWxsLG4pOmw/bnVsbDpjfSxuLm5vZGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW51bGw9PShjPXQpP251bGw6aSxuKTpsP2M6bnVsbH0sR3UobixvKX0sdGEubGF5b3V0LmNsdXN0ZXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4saSl7dmFyIG8sYT10LmNhbGwodGhpcyxuLGkpLGM9YVswXSxsPTA7UXUoYyxmdW5jdGlvbihuKXt2YXIgdD1uLmNoaWxkcmVuO3QmJnQubGVuZ3RoPyhuLng9cWkodCksbi55PXppKHQpKToobi54PW8/bCs9ZShuLG8pOjAsbi55PTAsbz1uKX0pO3ZhciBzPUxpKGMpLGY9VGkoYyksaD1zLngtZShzLGYpLzIsZz1mLngrZShmLHMpLzI7cmV0dXJuIFF1KGMsdT9mdW5jdGlvbihuKXtuLng9KG4ueC1jLngpKnJbMF0sbi55PShjLnktbi55KSpyWzFdfTpmdW5jdGlvbihuKXtuLng9KG4ueC1oKS8oZy1oKSpyWzBdLG4ueT0oMS0oYy55P24ueS9jLnk6MSkpKnJbMV19KSxhfXZhciB0PXRhLmxheW91dC5oaWVyYXJjaHkoKS5zb3J0KG51bGwpLnZhbHVlKG51bGwpLGU9U2kscj1bMSwxXSx1PSExO3JldHVybiBuLnNlcGFyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bnVsbD09KHI9dCksbik6dT9udWxsOnJ9LG4ubm9kZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bnVsbCE9KHI9dCksbik6dT9yOm51bGx9LEd1KG4sdCl9LHRhLmxheW91dC50cmVlbWFwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHQpe2Zvcih2YXIgZSxyLHU9LTEsaT1uLmxlbmd0aDsrK3U8aTspcj0oZT1uW3VdKS52YWx1ZSooMD50PzA6dCksZS5hcmVhPWlzTmFOKHIpfHwwPj1yPzA6cn1mdW5jdGlvbiB0KGUpe3ZhciBpPWUuY2hpbGRyZW47aWYoaSYmaS5sZW5ndGgpe3ZhciBvLGEsYyxsPWYoZSkscz1bXSxoPWkuc2xpY2UoKSxwPTEvMCx2PSJzbGljZSI9PT1nP2wuZHg6ImRpY2UiPT09Zz9sLmR5OiJzbGljZS1kaWNlIj09PWc/MSZlLmRlcHRoP2wuZHk6bC5keDpNYXRoLm1pbihsLmR4LGwuZHkpO2ZvcihuKGgsbC5keCpsLmR5L2UudmFsdWUpLHMuYXJlYT0wOyhjPWgubGVuZ3RoKT4wOylzLnB1c2gobz1oW2MtMV0pLHMuYXJlYSs9by5hcmVhLCJzcXVhcmlmeSIhPT1nfHwoYT1yKHMsdikpPD1wPyhoLnBvcCgpLHA9YSk6KHMuYXJlYS09cy5wb3AoKS5hcmVhLHUocyx2LGwsITEpLHY9TWF0aC5taW4obC5keCxsLmR5KSxzLmxlbmd0aD1zLmFyZWE9MCxwPTEvMCk7cy5sZW5ndGgmJih1KHMsdixsLCEwKSxzLmxlbmd0aD1zLmFyZWE9MCksaS5mb3JFYWNoKHQpfX1mdW5jdGlvbiBlKHQpe3ZhciByPXQuY2hpbGRyZW47aWYociYmci5sZW5ndGgpe3ZhciBpLG89Zih0KSxhPXIuc2xpY2UoKSxjPVtdO2ZvcihuKGEsby5keCpvLmR5L3QudmFsdWUpLGMuYXJlYT0wO2k9YS5wb3AoKTspYy5wdXNoKGkpLGMuYXJlYSs9aS5hcmVhLG51bGwhPWkueiYmKHUoYyxpLno/by5keDpvLmR5LG8sIWEubGVuZ3RoKSxjLmxlbmd0aD1jLmFyZWE9MCk7ci5mb3JFYWNoKGUpfX1mdW5jdGlvbiByKG4sdCl7Zm9yKHZhciBlLHI9bi5hcmVhLHU9MCxpPTEvMCxvPS0xLGE9bi5sZW5ndGg7KytvPGE7KShlPW5bb10uYXJlYSkmJihpPmUmJihpPWUpLGU+dSYmKHU9ZSkpO3JldHVybiByKj1yLHQqPXQscj9NYXRoLm1heCh0KnUqcC9yLHIvKHQqaSpwKSk6MS8wfWZ1bmN0aW9uIHUobix0LGUscil7dmFyIHUsaT0tMSxvPW4ubGVuZ3RoLGE9ZS54LGw9ZS55LHM9dD9jKG4uYXJlYS90KTowO2lmKHQ9PWUuZHgpe2Zvcigocnx8cz5lLmR5KSYmKHM9ZS5keSk7KytpPG87KXU9bltpXSx1Lng9YSx1Lnk9bCx1LmR5PXMsYSs9dS5keD1NYXRoLm1pbihlLngrZS5keC1hLHM/Yyh1LmFyZWEvcyk6MCk7dS56PSEwLHUuZHgrPWUueCtlLmR4LWEsZS55Kz1zLGUuZHktPXN9ZWxzZXtmb3IoKHJ8fHM+ZS5keCkmJihzPWUuZHgpOysraTxvOyl1PW5baV0sdS54PWEsdS55PWwsdS5keD1zLGwrPXUuZHk9TWF0aC5taW4oZS55K2UuZHktbCxzP2ModS5hcmVhL3MpOjApO3Uuej0hMSx1LmR5Kz1lLnkrZS5keS1sLGUueCs9cyxlLmR4LT1zfX1mdW5jdGlvbiBpKHIpe3ZhciB1PW98fGEociksaT11WzBdO3JldHVybiBpLng9MCxpLnk9MCxpLmR4PWxbMF0saS5keT1sWzFdLG8mJmEucmV2YWx1ZShpKSxuKFtpXSxpLmR4KmkuZHkvaS52YWx1ZSksKG8/ZTp0KShpKSxoJiYobz11KSx1fXZhciBvLGE9dGEubGF5b3V0LmhpZXJhcmNoeSgpLGM9TWF0aC5yb3VuZCxsPVsxLDFdLHM9bnVsbCxmPVJpLGg9ITEsZz0ic3F1YXJpZnkiLHA9LjUqKDErTWF0aC5zcXJ0KDUpKTtyZXR1cm4gaS5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4saSk6bH0saS5wYWRkaW5nPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQodCl7dmFyIGU9bi5jYWxsKGksdCx0LmRlcHRoKTtyZXR1cm4gbnVsbD09ZT9SaSh0KTpEaSh0LCJudW1iZXIiPT10eXBlb2YgZT9bZSxlLGUsZV06ZSl9ZnVuY3Rpb24gZSh0KXtyZXR1cm4gRGkodCxuKX1pZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gczt2YXIgcjtyZXR1cm4gZj1udWxsPT0ocz1uKT9SaToiZnVuY3Rpb24iPT0ocj10eXBlb2Ygbik/dDoibnVtYmVyIj09PXI/KG49W24sbixuLG5dLGUpOmUsaX0saS5yb3VuZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1uP01hdGgucm91bmQ6TnVtYmVyLGkpOmMhPU51bWJlcn0saS5zdGlja3k9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9bixvPW51bGwsaSk6aAp9LGkucmF0aW89ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9bixpKTpwfSxpLm1vZGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9bisiIixpKTpnfSxHdShpLGEpfSx0YS5yYW5kb209e25vcm1hbDpmdW5jdGlvbihuLHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIDI+ZSYmKHQ9MSksMT5lJiYobj0wKSxmdW5jdGlvbigpe3ZhciBlLHIsdTtkbyBlPTIqTWF0aC5yYW5kb20oKS0xLHI9MipNYXRoLnJhbmRvbSgpLTEsdT1lKmUrcipyO3doaWxlKCF1fHx1PjEpO3JldHVybiBuK3QqZSpNYXRoLnNxcnQoLTIqTWF0aC5sb2codSkvdSl9fSxsb2dOb3JtYWw6ZnVuY3Rpb24oKXt2YXIgbj10YS5yYW5kb20ubm9ybWFsLmFwcGx5KHRhLGFyZ3VtZW50cyk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguZXhwKG4oKSl9fSxiYXRlczpmdW5jdGlvbihuKXt2YXIgdD10YS5yYW5kb20uaXJ3aW5IYWxsKG4pO3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0KCkvbn19LGlyd2luSGFsbDpmdW5jdGlvbihuKXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPTA7bj5lO2UrKyl0Kz1NYXRoLnJhbmRvbSgpO3JldHVybiB0fX19LHRhLnNjYWxlPXt9O3ZhciBibD17Zmxvb3I6RXQsY2VpbDpFdH07dGEuc2NhbGUubGluZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIFlpKFswLDFdLFswLDFdLG11LCExKX07dmFyIF9sPXtzOjEsZzoxLHA6MSxyOjEsZToxfTt0YS5zY2FsZS5sb2c9ZnVuY3Rpb24oKXtyZXR1cm4gSmkodGEuc2NhbGUubGluZWFyKCkuZG9tYWluKFswLDFdKSwxMCwhMCxbMSwxMF0pfTt2YXIgd2w9dGEuZm9ybWF0KCIuMGUiKSxTbD17Zmxvb3I6ZnVuY3Rpb24obil7cmV0dXJuLU1hdGguY2VpbCgtbil9LGNlaWw6ZnVuY3Rpb24obil7cmV0dXJuLU1hdGguZmxvb3IoLW4pfX07dGEuc2NhbGUucG93PWZ1bmN0aW9uKCl7cmV0dXJuIEdpKHRhLnNjYWxlLmxpbmVhcigpLDEsWzAsMV0pfSx0YS5zY2FsZS5zcXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRhLnNjYWxlLnBvdygpLmV4cG9uZW50KC41KX0sdGEuc2NhbGUub3JkaW5hbD1mdW5jdGlvbigpe3JldHVybiBRaShbXSx7dDoicmFuZ2UiLGE6W1tdXX0pfSx0YS5zY2FsZS5jYXRlZ29yeTEwPWZ1bmN0aW9uKCl7cmV0dXJuIHRhLnNjYWxlLm9yZGluYWwoKS5yYW5nZShrbCl9LHRhLnNjYWxlLmNhdGVnb3J5MjA9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuc2NhbGUub3JkaW5hbCgpLnJhbmdlKEVsKX0sdGEuc2NhbGUuY2F0ZWdvcnkyMGI9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuc2NhbGUub3JkaW5hbCgpLnJhbmdlKEFsKX0sdGEuc2NhbGUuY2F0ZWdvcnkyMGM9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuc2NhbGUub3JkaW5hbCgpLnJhbmdlKE5sKX07dmFyIGtsPVsyMDYyMjYwLDE2NzQ0MjA2LDI5MjQ1ODgsMTQwMzQ3MjgsOTcyNTg4NSw5MTk3MTMxLDE0OTA3MzMwLDgzNTU3MTEsMTIzNjkxODYsMTU1NjE3NV0ubWFwKHl0KSxFbD1bMjA2MjI2MCwxMTQ1NDQ0MCwxNjc0NDIwNiwxNjc1OTY3MiwyOTI0NTg4LDEwMDE4Njk4LDE0MDM0NzI4LDE2NzUwNzQyLDk3MjU4ODUsMTI5NTU4NjEsOTE5NzEzMSwxMjg4NTE0MCwxNDkwNzMzMCwxNjIzNDE5NCw4MzU1NzExLDEzMDkyODA3LDEyMzY5MTg2LDE0NDA4NTg5LDE1NTYxNzUsMTA0MTA3MjVdLm1hcCh5dCksQWw9WzM3NTA3NzcsNTM5NTYxOSw3MDQwNzE5LDEwMjY0Mjg2LDY1MTkwOTcsOTIxNjU5NCwxMTkxNTExNSwxMzU1NjYzNiw5MjAyOTkzLDEyNDI2ODA5LDE1MTg2NTE0LDE1MTkwOTMyLDg2NjYxNjksMTEzNTY0OTAsMTQwNDk2NDMsMTUxNzczNzIsODA3NzY4MywxMDgzNDMyNCwxMzUyODUwOSwxNDU4OTY1NF0ubWFwKHl0KSxObD1bMzI0NDczMyw3MDU3MTEwLDEwNDA2NjI1LDEzMDMyNDMxLDE1MDk1MDUzLDE2NjE2NzY0LDE2NjI1MjU5LDE2NjM0MDE4LDMyNTMwNzYsNzY1MjQ3MCwxMDYwNzAwMywxMzEwMTUwNCw3Njk1MjgxLDEwMzk0MzEyLDEyMzY5MzcyLDE0MzQyODkxLDY1MTM1MDcsOTg2ODk1MCwxMjQzNDg3NywxNDI3NzA4MV0ubWFwKHl0KTt0YS5zY2FsZS5xdWFudGlsZT1mdW5jdGlvbigpe3JldHVybiBubyhbXSxbXSl9LHRhLnNjYWxlLnF1YW50aXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRvKDAsMSxbMCwxXSl9LHRhLnNjYWxlLnRocmVzaG9sZD1mdW5jdGlvbigpe3JldHVybiBlbyhbLjVdLFswLDFdKX0sdGEuc2NhbGUuaWRlbnRpdHk9ZnVuY3Rpb24oKXtyZXR1cm4gcm8oWzAsMV0pfSx0YS5zdmc9e30sdGEuc3ZnLmFyYz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt2YXIgbj1NYXRoLm1heCgwLCtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksbD1NYXRoLm1heCgwLCtyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkscz1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1qYSxmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpLWphLGg9TWF0aC5hYnMoZi1zKSxnPXM+Zj8wOjE7aWYobj5sJiYocD1sLGw9bixuPXApLGg+PVVhKXJldHVybiB0KGwsZykrKG4/dChuLDEtZyk6IiIpKyJaIjt2YXIgcCx2LGQsbSx5LE0seCxiLF8sdyxTLGssRT0wLEE9MCxOPVtdO2lmKChtPSgrYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fDApLzIpJiYoZD1pPT09Q2w/TWF0aC5zcXJ0KG4qbitsKmwpOitpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxnfHwoQSo9LTEpLGwmJihBPW50KGQvbCpNYXRoLnNpbihtKSkpLG4mJihFPW50KGQvbipNYXRoLnNpbihtKSkpKSxsKXt5PWwqTWF0aC5jb3MocytBKSxNPWwqTWF0aC5zaW4ocytBKSx4PWwqTWF0aC5jb3MoZi1BKSxiPWwqTWF0aC5zaW4oZi1BKTt2YXIgQz1NYXRoLmFicyhmLXMtMipBKTw9RGE/MDoxO2lmKEEmJnNvKHksTSx4LGIpPT09Z15DKXt2YXIgej0ocytmKS8yO3k9bCpNYXRoLmNvcyh6KSxNPWwqTWF0aC5zaW4oeikseD1iPW51bGx9fWVsc2UgeT1NPTA7aWYobil7Xz1uKk1hdGguY29zKGYtRSksdz1uKk1hdGguc2luKGYtRSksUz1uKk1hdGguY29zKHMrRSksaz1uKk1hdGguc2luKHMrRSk7dmFyIHE9TWF0aC5hYnMocy1mKzIqRSk8PURhPzA6MTtpZihFJiZzbyhfLHcsUyxrKT09PTEtZ15xKXt2YXIgTD0ocytmKS8yO189bipNYXRoLmNvcyhMKSx3PW4qTWF0aC5zaW4oTCksUz1rPW51bGx9fWVsc2UgXz13PTA7aWYoKHA9TWF0aC5taW4oTWF0aC5hYnMobC1uKS8yLCt1LmFwcGx5KHRoaXMsYXJndW1lbnRzKSkpPi4wMDEpe3Y9bD5uXmc/MDoxO3ZhciBUPW51bGw9PVM/W18sd106bnVsbD09eD9beSxNXTpMcihbeSxNXSxbUyxrXSxbeCxiXSxbXyx3XSksUj15LVRbMF0sRD1NLVRbMV0sUD14LVRbMF0sVT1iLVRbMV0saj0xL01hdGguc2luKE1hdGguYWNvcygoUipQK0QqVSkvKE1hdGguc3FydChSKlIrRCpEKSpNYXRoLnNxcnQoUCpQK1UqVSkpKS8yKSxGPU1hdGguc3FydChUWzBdKlRbMF0rVFsxXSpUWzFdKTtpZihudWxsIT14KXt2YXIgSD1NYXRoLm1pbihwLChsLUYpLyhqKzEpKSxPPWZvKG51bGw9PVM/W18sd106W1Msa10sW3ksTV0sbCxILGcpLFk9Zm8oW3gsYl0sW18sd10sbCxILGcpO3A9PT1IP04ucHVzaCgiTSIsT1swXSwiQSIsSCwiLCIsSCwiIDAgMCwiLHYsIiAiLE9bMV0sIkEiLGwsIiwiLGwsIiAwICIsMS1nXnNvKE9bMV1bMF0sT1sxXVsxXSxZWzFdWzBdLFlbMV1bMV0pLCIsIixnLCIgIixZWzFdLCJBIixILCIsIixILCIgMCAwLCIsdiwiICIsWVswXSk6Ti5wdXNoKCJNIixPWzBdLCJBIixILCIsIixILCIgMCAxLCIsdiwiICIsWVswXSl9ZWxzZSBOLnB1c2goIk0iLHksIiwiLE0pO2lmKG51bGwhPVMpe3ZhciBJPU1hdGgubWluKHAsKG4tRikvKGotMSkpLFo9Zm8oW3ksTV0sW1Msa10sbiwtSSxnKSxWPWZvKFtfLHddLG51bGw9PXg/W3ksTV06W3gsYl0sbiwtSSxnKTtwPT09ST9OLnB1c2goIkwiLFZbMF0sIkEiLEksIiwiLEksIiAwIDAsIix2LCIgIixWWzFdLCJBIixuLCIsIixuLCIgMCAiLGdec28oVlsxXVswXSxWWzFdWzFdLFpbMV1bMF0sWlsxXVsxXSksIiwiLDEtZywiICIsWlsxXSwiQSIsSSwiLCIsSSwiIDAgMCwiLHYsIiAiLFpbMF0pOk4ucHVzaCgiTCIsVlswXSwiQSIsSSwiLCIsSSwiIDAgMCwiLHYsIiAiLFpbMF0pfWVsc2UgTi5wdXNoKCJMIixfLCIsIix3KX1lbHNlIE4ucHVzaCgiTSIseSwiLCIsTSksbnVsbCE9eCYmTi5wdXNoKCJBIixsLCIsIixsLCIgMCAiLEMsIiwiLGcsIiAiLHgsIiwiLGIpLE4ucHVzaCgiTCIsXywiLCIsdyksbnVsbCE9UyYmTi5wdXNoKCJBIixuLCIsIixuLCIgMCAiLHEsIiwiLDEtZywiICIsUywiLCIsayk7cmV0dXJuIE4ucHVzaCgiWiIpLE4uam9pbigiIil9ZnVuY3Rpb24gdChuLHQpe3JldHVybiJNMCwiK24rIkEiK24rIiwiK24rIiAwIDEsIit0KyIgMCwiKy1uKyJBIituKyIsIituKyIgMCAxLCIrdCsiIDAsIitufXZhciBlPWlvLHI9b28sdT11byxpPUNsLG89YW8sYT1jbyxjPWxvO3JldHVybiBuLmlubmVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWt0KHQpLG4pOmV9LG4ub3V0ZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9a3QodCksbik6cn0sbi5jb3JuZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9a3QodCksbik6dX0sbi5wYWRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dD09Q2w/Q2w6a3QodCksbik6aX0sbi5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWt0KHQpLG4pOm99LG4uZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9a3QodCksbik6YX0sbi5wYWRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1rdCh0KSxuKTpjfSxuLmNlbnRyb2lkPWZ1bmN0aW9uKCl7dmFyIG49KCtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSsgK3IuYXBwbHkodGhpcyxhcmd1bWVudHMpKS8yLHQ9KCtvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSsgK2EuYXBwbHkodGhpcyxhcmd1bWVudHMpKS8yLWphO3JldHVybltNYXRoLmNvcyh0KSpuLE1hdGguc2luKHQpKm5dfSxufTt2YXIgQ2w9ImF1dG8iO3RhLnN2Zy5saW5lPWZ1bmN0aW9uKCl7cmV0dXJuIGhvKEV0KX07dmFyIHpsPXRhLm1hcCh7bGluZWFyOmdvLCJsaW5lYXItY2xvc2VkIjpwbyxzdGVwOnZvLCJzdGVwLWJlZm9yZSI6bW8sInN0ZXAtYWZ0ZXIiOnlvLGJhc2lzOlNvLCJiYXNpcy1vcGVuIjprbywiYmFzaXMtY2xvc2VkIjpFbyxidW5kbGU6QW8sY2FyZGluYWw6Ym8sImNhcmRpbmFsLW9wZW4iOk1vLCJjYXJkaW5hbC1jbG9zZWQiOnhvLG1vbm90b25lOlRvfSk7emwuZm9yRWFjaChmdW5jdGlvbihuLHQpe3Qua2V5PW4sdC5jbG9zZWQ9Ly1jbG9zZWQkLy50ZXN0KG4pfSk7dmFyIHFsPVswLDIvMywxLzMsMF0sTGw9WzAsMS8zLDIvMywwXSxUbD1bMCwxLzYsMi8zLDEvNl07dGEuc3ZnLmxpbmUucmFkaWFsPWZ1bmN0aW9uKCl7dmFyIG49aG8oUm8pO3JldHVybiBuLnJhZGl1cz1uLngsZGVsZXRlIG4ueCxuLmFuZ2xlPW4ueSxkZWxldGUgbi55LG59LG1vLnJldmVyc2U9eW8seW8ucmV2ZXJzZT1tbyx0YS5zdmcuYXJlYT1mdW5jdGlvbigpe3JldHVybiBEbyhFdCl9LHRhLnN2Zy5hcmVhLnJhZGlhbD1mdW5jdGlvbigpe3ZhciBuPURvKFJvKTtyZXR1cm4gbi5yYWRpdXM9bi54LGRlbGV0ZSBuLngsbi5pbm5lclJhZGl1cz1uLngwLGRlbGV0ZSBuLngwLG4ub3V0ZXJSYWRpdXM9bi54MSxkZWxldGUgbi54MSxuLmFuZ2xlPW4ueSxkZWxldGUgbi55LG4uc3RhcnRBbmdsZT1uLnkwLGRlbGV0ZSBuLnkwLG4uZW5kQW5nbGU9bi55MSxkZWxldGUgbi55MSxufSx0YS5zdmcuY2hvcmQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4sYSl7dmFyIGM9dCh0aGlzLGksbixhKSxsPXQodGhpcyxvLG4sYSk7cmV0dXJuIk0iK2MucDArcihjLnIsYy5wMSxjLmExLWMuYTApKyhlKGMsbCk/dShjLnIsYy5wMSxjLnIsYy5wMCk6dShjLnIsYy5wMSxsLnIsbC5wMCkrcihsLnIsbC5wMSxsLmExLWwuYTApK3UobC5yLGwucDEsYy5yLGMucDApKSsiWiJ9ZnVuY3Rpb24gdChuLHQsZSxyKXt2YXIgdT10LmNhbGwobixlLHIpLGk9YS5jYWxsKG4sdSxyKSxvPWMuY2FsbChuLHUsciktamEscz1sLmNhbGwobix1LHIpLWphO3JldHVybntyOmksYTA6byxhMTpzLHAwOltpKk1hdGguY29zKG8pLGkqTWF0aC5zaW4obyldLHAxOltpKk1hdGguY29zKHMpLGkqTWF0aC5zaW4ocyldfX1mdW5jdGlvbiBlKG4sdCl7cmV0dXJuIG4uYTA9PXQuYTAmJm4uYTE9PXQuYTF9ZnVuY3Rpb24gcihuLHQsZSl7cmV0dXJuIkEiK24rIiwiK24rIiAwICIrICsoZT5EYSkrIiwxICIrdH1mdW5jdGlvbiB1KG4sdCxlLHIpe3JldHVybiJRIDAsMCAiK3J9dmFyIGk9bXIsbz15cixhPVBvLGM9YW8sbD1jbztyZXR1cm4gbi5yYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9a3QodCksbik6YX0sbi5zb3VyY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9a3QodCksbik6aX0sbi50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89a3QodCksbik6b30sbi5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPWt0KHQpLG4pOmN9LG4uZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9a3QodCksbik6bH0sbn0sdGEuc3ZnLmRpYWdvbmFsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHUpe3ZhciBpPXQuY2FsbCh0aGlzLG4sdSksbz1lLmNhbGwodGhpcyxuLHUpLGE9KGkueStvLnkpLzIsYz1baSx7eDppLngseTphfSx7eDpvLngseTphfSxvXTtyZXR1cm4gYz1jLm1hcChyKSwiTSIrY1swXSsiQyIrY1sxXSsiICIrY1syXSsiICIrY1szXX12YXIgdD1tcixlPXlyLHI9VW87cmV0dXJuIG4uc291cmNlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWt0KGUpLG4pOnR9LG4udGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWt0KHQpLG4pOmV9LG4ucHJvamVjdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG59LHRhLnN2Zy5kaWFnb25hbC5yYWRpYWw9ZnVuY3Rpb24oKXt2YXIgbj10YS5zdmcuZGlhZ29uYWwoKSx0PVVvLGU9bi5wcm9qZWN0aW9uO3JldHVybiBuLnByb2plY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/ZShqbyh0PW4pKTp0fSxufSx0YS5zdmcuc3ltYm9sPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHIpe3JldHVybihSbC5nZXQodC5jYWxsKHRoaXMsbixyKSl8fE9vKShlLmNhbGwodGhpcyxuLHIpKX12YXIgdD1IbyxlPUZvO3JldHVybiBuLnR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9a3QoZSksbik6dH0sbi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWt0KHQpLG4pOmV9LG59O3ZhciBSbD10YS5tYXAoe2NpcmNsZTpPbyxjcm9zczpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobi81KS8yO3JldHVybiJNIistMyp0KyIsIistdCsiSCIrLXQrIlYiKy0zKnQrIkgiK3QrIlYiKy10KyJIIiszKnQrIlYiK3QrIkgiK3QrIlYiKzMqdCsiSCIrLXQrIlYiK3QrIkgiKy0zKnQrIloifSxkaWFtb25kOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuLygyKlBsKSksZT10KlBsO3JldHVybiJNMCwiKy10KyJMIitlKyIsMCIrIiAwLCIrdCsiICIrLWUrIiwwIisiWiJ9LHNxdWFyZTpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobikvMjtyZXR1cm4iTSIrLXQrIiwiKy10KyJMIit0KyIsIistdCsiICIrdCsiLCIrdCsiICIrLXQrIiwiK3QrIloifSwidHJpYW5nbGUtZG93biI6ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zcXJ0KG4vRGwpLGU9dCpEbC8yO3JldHVybiJNMCwiK2UrIkwiK3QrIiwiKy1lKyIgIistdCsiLCIrLWUrIloifSwidHJpYW5nbGUtdXAiOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuL0RsKSxlPXQqRGwvMjtyZXR1cm4iTTAsIistZSsiTCIrdCsiLCIrZSsiICIrLXQrIiwiK2UrIloifX0pO3RhLnN2Zy5zeW1ib2xUeXBlcz1SbC5rZXlzKCk7dmFyIERsPU1hdGguc3FydCgzKSxQbD1NYXRoLnRhbigzMCpGYSk7a2EudHJhbnNpdGlvbj1mdW5jdGlvbihuKXtmb3IodmFyIHQsZSxyPVVsfHwrK09sLHU9WG8obiksaT1bXSxvPWpsfHx7dGltZTpEYXRlLm5vdygpLGVhc2U6U3UsZGVsYXk6MCxkdXJhdGlvbjoyNTB9LGE9LTEsYz10aGlzLmxlbmd0aDsrK2E8Yzspe2kucHVzaCh0PVtdKTtmb3IodmFyIGw9dGhpc1thXSxzPS0xLGY9bC5sZW5ndGg7KytzPGY7KShlPWxbc10pJiYkbyhlLHMsdSxyLG8pLHQucHVzaChlKX1yZXR1cm4gSW8oaSx1LHIpfSxrYS5pbnRlcnJ1cHQ9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuZWFjaChudWxsPT1uP0ZsOllvKFhvKG4pKSl9O3ZhciBVbCxqbCxGbD1ZbyhYbygpKSxIbD1bXSxPbD0wO0hsLmNhbGw9a2EuY2FsbCxIbC5lbXB0eT1rYS5lbXB0eSxIbC5ub2RlPWthLm5vZGUsSGwuc2l6ZT1rYS5zaXplLHRhLnRyYW5zaXRpb249ZnVuY3Rpb24obix0KXtyZXR1cm4gbiYmbi50cmFuc2l0aW9uP1VsP24udHJhbnNpdGlvbih0KTpuOk5hLnRyYW5zaXRpb24obil9LHRhLnRyYW5zaXRpb24ucHJvdG90eXBlPUhsLEhsLnNlbGVjdD1mdW5jdGlvbihuKXt2YXIgdCxlLHIsdT10aGlzLmlkLGk9dGhpcy5uYW1lc3BhY2Usbz1bXTtuPWsobik7Zm9yKHZhciBhPS0xLGM9dGhpcy5sZW5ndGg7KythPGM7KXtvLnB1c2godD1bXSk7Zm9yKHZhciBsPXRoaXNbYV0scz0tMSxmPWwubGVuZ3RoOysrczxmOykocj1sW3NdKSYmKGU9bi5jYWxsKHIsci5fX2RhdGFfXyxzLGEpKT8oIl9fZGF0YV9fImluIHImJihlLl9fZGF0YV9fPXIuX19kYXRhX18pLCRvKGUscyxpLHUscltpXVt1XSksdC5wdXNoKGUpKTp0LnB1c2gobnVsbCl9cmV0dXJuIElvKG8saSx1KX0sSGwuc2VsZWN0QWxsPWZ1bmN0aW9uKG4pe3ZhciB0LGUscix1LGksbz10aGlzLmlkLGE9dGhpcy5uYW1lc3BhY2UsYz1bXTtuPUUobik7Zm9yKHZhciBsPS0xLHM9dGhpcy5sZW5ndGg7KytsPHM7KWZvcih2YXIgZj10aGlzW2xdLGg9LTEsZz1mLmxlbmd0aDsrK2g8ZzspaWYocj1mW2hdKXtpPXJbYV1bb10sZT1uLmNhbGwocixyLl9fZGF0YV9fLGgsbCksYy5wdXNoKHQ9W10pO2Zvcih2YXIgcD0tMSx2PWUubGVuZ3RoOysrcDx2OykodT1lW3BdKSYmJG8odSxwLGEsbyxpKSx0LnB1c2godSl9cmV0dXJuIElvKGMsYSxvKX0sSGwuZmlsdGVyPWZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PVtdOyJmdW5jdGlvbiIhPXR5cGVvZiBuJiYobj1qKG4pKTtmb3IodmFyIGk9MCxvPXRoaXMubGVuZ3RoO28+aTtpKyspe3UucHVzaCh0PVtdKTtmb3IodmFyIGU9dGhpc1tpXSxhPTAsYz1lLmxlbmd0aDtjPmE7YSsrKShyPWVbYV0pJiZuLmNhbGwocixyLl9fZGF0YV9fLGEsaSkmJnQucHVzaChyKX1yZXR1cm4gSW8odSx0aGlzLm5hbWVzcGFjZSx0aGlzLmlkKX0sSGwudHdlZW49ZnVuY3Rpb24obix0KXt2YXIgZT10aGlzLmlkLHI9dGhpcy5uYW1lc3BhY2U7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj90aGlzLm5vZGUoKVtyXVtlXS50d2Vlbi5nZXQobik6SCh0aGlzLG51bGw9PXQ/ZnVuY3Rpb24odCl7dFtyXVtlXS50d2Vlbi5yZW1vdmUobil9OmZ1bmN0aW9uKHUpe3Vbcl1bZV0udHdlZW4uc2V0KG4sdCl9KX0sSGwuYXR0cj1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZShhKX1mdW5jdGlvbiByKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhhLnNwYWNlLGEubG9jYWwpfWZ1bmN0aW9uIHUobil7cmV0dXJuIG51bGw9PW4/ZToobis9IiIsZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuZ2V0QXR0cmlidXRlKGEpO3JldHVybiBlIT09biYmKHQ9byhlLG4pLGZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlKGEsdChuKSl9KX0pfWZ1bmN0aW9uIGkobil7cmV0dXJuIG51bGw9PW4/cjoobis9IiIsZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuZ2V0QXR0cmlidXRlTlMoYS5zcGFjZSxhLmxvY2FsKTtyZXR1cm4gZSE9PW4mJih0PW8oZSxuKSxmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZU5TKGEuc3BhY2UsYS5sb2NhbCx0KG4pKX0pfSl9aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtmb3IodCBpbiBuKXRoaXMuYXR0cih0LG5bdF0pO3JldHVybiB0aGlzfXZhciBvPSJ0cmFuc2Zvcm0iPT1uP0h1Om11LGE9dGEubnMucXVhbGlmeShuKTtyZXR1cm4gWm8odGhpcywiYXR0ci4iK24sdCxhLmxvY2FsP2k6dSl9LEhsLmF0dHJUd2Vlbj1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobixlKXt2YXIgcj10LmNhbGwodGhpcyxuLGUsdGhpcy5nZXRBdHRyaWJ1dGUodSkpO3JldHVybiByJiZmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZSh1LHIobikpfX1mdW5jdGlvbiByKG4sZSl7dmFyIHI9dC5jYWxsKHRoaXMsbixlLHRoaXMuZ2V0QXR0cmlidXRlTlModS5zcGFjZSx1LmxvY2FsKSk7cmV0dXJuIHImJmZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlTlModS5zcGFjZSx1LmxvY2FsLHIobikpfX12YXIgdT10YS5ucy5xdWFsaWZ5KG4pO3JldHVybiB0aGlzLnR3ZWVuKCJhdHRyLiIrbix1LmxvY2FsP3I6ZSl9LEhsLnN0eWxlPWZ1bmN0aW9uKG4sdCxlKXtmdW5jdGlvbiByKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKX1mdW5jdGlvbiB1KHQpe3JldHVybiBudWxsPT10P3I6KHQrPSIiLGZ1bmN0aW9uKCl7dmFyIHIsdT1vYS5nZXRDb21wdXRlZFN0eWxlKHRoaXMsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuKTtyZXR1cm4gdSE9PXQmJihyPW11KHUsdCksZnVuY3Rpb24odCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLHIodCksZSl9KX0pfXZhciBpPWFyZ3VtZW50cy5sZW5ndGg7aWYoMz5pKXtpZigic3RyaW5nIiE9dHlwZW9mIG4pezI+aSYmKHQ9IiIpO2ZvcihlIGluIG4pdGhpcy5zdHlsZShlLG5bZV0sdCk7cmV0dXJuIHRoaXN9ZT0iIn1yZXR1cm4gWm8odGhpcywic3R5bGUuIituLHQsdSl9LEhsLnN0eWxlVHdlZW49ZnVuY3Rpb24obix0LGUpe2Z1bmN0aW9uIHIocix1KXt2YXIgaT10LmNhbGwodGhpcyxyLHUsb2EuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLG51bGwpLmdldFByb3BlcnR5VmFsdWUobikpO3JldHVybiBpJiZmdW5jdGlvbih0KXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KG4saSh0KSxlKX19cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MyYmKGU9IiIpLHRoaXMudHdlZW4oInN0eWxlLiIrbixyKX0sSGwudGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gWm8odGhpcywidGV4dCIsbixWbyl9LEhsLnJlbW92ZT1mdW5jdGlvbigpe3ZhciBuPXRoaXMubmFtZXNwYWNlO3JldHVybiB0aGlzLmVhY2goImVuZC50cmFuc2l0aW9uIixmdW5jdGlvbigpe3ZhciB0O3RoaXNbbl0uY291bnQ8MiYmKHQ9dGhpcy5wYXJlbnROb2RlKSYmdC5yZW1vdmVDaGlsZCh0aGlzKX0pfSxIbC5lYXNlPWZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMuaWQsZT10aGlzLm5hbWVzcGFjZTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwxP3RoaXMubm9kZSgpW2VdW3RdLmVhc2U6KCJmdW5jdGlvbiIhPXR5cGVvZiBuJiYobj10YS5lYXNlLmFwcGx5KHRhLGFyZ3VtZW50cykpLEgodGhpcyxmdW5jdGlvbihyKXtyW2VdW3RdLmVhc2U9bn0pKX0sSGwuZGVsYXk9ZnVuY3Rpb24obil7dmFyIHQ9dGhpcy5pZCxlPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/dGhpcy5ub2RlKClbZV1bdF0uZGVsYXk6SCh0aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHIsdSxpKXtyW2VdW3RdLmRlbGF5PStuLmNhbGwocixyLl9fZGF0YV9fLHUsaSl9OihuPStuLGZ1bmN0aW9uKHIpe3JbZV1bdF0uZGVsYXk9bn0pKX0sSGwuZHVyYXRpb249ZnVuY3Rpb24obil7dmFyIHQ9dGhpcy5pZCxlPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/dGhpcy5ub2RlKClbZV1bdF0uZHVyYXRpb246SCh0aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHIsdSxpKXtyW2VdW3RdLmR1cmF0aW9uPU1hdGgubWF4KDEsbi5jYWxsKHIsci5fX2RhdGFfXyx1LGkpKX06KG49TWF0aC5tYXgoMSxuKSxmdW5jdGlvbihyKXtyW2VdW3RdLmR1cmF0aW9uPW59KSl9LEhsLmVhY2g9ZnVuY3Rpb24obix0KXt2YXIgZT10aGlzLmlkLHI9dGhpcy5uYW1lc3BhY2U7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXt2YXIgdT1qbCxpPVVsO3RyeXtVbD1lLEgodGhpcyxmdW5jdGlvbih0LHUsaSl7amw9dFtyXVtlXSxuLmNhbGwodCx0Ll9fZGF0YV9fLHUsaSl9KX1maW5hbGx5e2psPXUsVWw9aX19ZWxzZSBIKHRoaXMsZnVuY3Rpb24odSl7dmFyIGk9dVtyXVtlXTsoaS5ldmVudHx8KGkuZXZlbnQ9dGEuZGlzcGF0Y2goInN0YXJ0IiwiZW5kIiwiaW50ZXJydXB0IikpKS5vbihuLHQpfSk7cmV0dXJuIHRoaXN9LEhsLnRyYW5zaXRpb249ZnVuY3Rpb24oKXtmb3IodmFyIG4sdCxlLHIsdT10aGlzLmlkLGk9KytPbCxvPXRoaXMubmFtZXNwYWNlLGE9W10sYz0wLGw9dGhpcy5sZW5ndGg7bD5jO2MrKyl7YS5wdXNoKG49W10pO2Zvcih2YXIgdD10aGlzW2NdLHM9MCxmPXQubGVuZ3RoO2Y+cztzKyspKGU9dFtzXSkmJihyPWVbb11bdV0sJG8oZSxzLG8saSx7dGltZTpyLnRpbWUsZWFzZTpyLmVhc2UsZGVsYXk6ci5kZWxheStyLmR1cmF0aW9uLGR1cmF0aW9uOnIuZHVyYXRpb259KSksbi5wdXNoKGUpfXJldHVybiBJbyhhLG8saSl9LHRhLnN2Zy5heGlzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtuLmVhY2goZnVuY3Rpb24oKXt2YXIgbixsPXRhLnNlbGVjdCh0aGlzKSxzPXRoaXMuX19jaGFydF9ffHxlLGY9dGhpcy5fX2NoYXJ0X189ZS5jb3B5KCksaD1udWxsPT1jP2YudGlja3M/Zi50aWNrcy5hcHBseShmLGEpOmYuZG9tYWluKCk6YyxnPW51bGw9PXQ/Zi50aWNrRm9ybWF0P2YudGlja0Zvcm1hdC5hcHBseShmLGEpOkV0OnQscD1sLnNlbGVjdEFsbCgiLnRpY2siKS5kYXRhKGgsZiksdj1wLmVudGVyKCkuaW5zZXJ0KCJnIiwiLmRvbWFpbiIpLmF0dHIoImNsYXNzIiwidGljayIpLnN0eWxlKCJvcGFjaXR5IixUYSksZD10YS50cmFuc2l0aW9uKHAuZXhpdCgpKS5zdHlsZSgib3BhY2l0eSIsVGEpLnJlbW92ZSgpLG09dGEudHJhbnNpdGlvbihwLm9yZGVyKCkpLnN0eWxlKCJvcGFjaXR5IiwxKSx5PU1hdGgubWF4KHUsMCkrbyxNPVVpKGYpLHg9bC5zZWxlY3RBbGwoIi5kb21haW4iKS5kYXRhKFswXSksYj0oeC5lbnRlcigpLmFwcGVuZCgicGF0aCIpLmF0dHIoImNsYXNzIiwiZG9tYWluIiksdGEudHJhbnNpdGlvbih4KSk7di5hcHBlbmQoImxpbmUiKSx2LmFwcGVuZCgidGV4dCIpO3ZhciBfLHcsUyxrLEU9di5zZWxlY3QoImxpbmUiKSxBPW0uc2VsZWN0KCJsaW5lIiksTj1wLnNlbGVjdCgidGV4dCIpLnRleHQoZyksQz12LnNlbGVjdCgidGV4dCIpLHo9bS5zZWxlY3QoInRleHQiKSxxPSJ0b3AiPT09cnx8ImxlZnQiPT09cj8tMToxO2lmKCJib3R0b20iPT09cnx8InRvcCI9PT1yPyhuPUJvLF89IngiLFM9InkiLHc9IngyIixrPSJ5MiIsTi5hdHRyKCJkeSIsMD5xPyIwZW0iOiIuNzFlbSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLGIuYXR0cigiZCIsIk0iK01bMF0rIiwiK3EqaSsiVjBIIitNWzFdKyJWIitxKmkpKToobj1XbyxfPSJ5IixTPSJ4Iix3PSJ5MiIsaz0ieDIiLE4uYXR0cigiZHkiLCIuMzJlbSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsMD5xPyJlbmQiOiJzdGFydCIpLGIuYXR0cigiZCIsIk0iK3EqaSsiLCIrTVswXSsiSDBWIitNWzFdKyJIIitxKmkpKSxFLmF0dHIoayxxKnUpLEMuYXR0cihTLHEqeSksQS5hdHRyKHcsMCkuYXR0cihrLHEqdSksei5hdHRyKF8sMCkuYXR0cihTLHEqeSksZi5yYW5nZUJhbmQpe3ZhciBMPWYsVD1MLnJhbmdlQmFuZCgpLzI7cz1mPWZ1bmN0aW9uKG4pe3JldHVybiBMKG4pK1R9fWVsc2Ugcy5yYW5nZUJhbmQ/cz1mOmQuY2FsbChuLGYscyk7di5jYWxsKG4scyxmKSxtLmNhbGwobixmLGYpfSl9dmFyIHQsZT10YS5zY2FsZS5saW5lYXIoKSxyPVlsLHU9NixpPTYsbz0zLGE9WzEwXSxjPW51bGw7cmV0dXJuIG4uc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLm9yaWVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10IGluIElsP3QrIiI6WWwsbik6cn0sbi50aWNrcz1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPWFyZ3VtZW50cyxuKTphfSxuLnRpY2tWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9dCxuKTpjfSxuLnRpY2tGb3JtYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLnRpY2tTaXplPWZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIGU/KHU9K3QsaT0rYXJndW1lbnRzW2UtMV0sbik6dX0sbi5pbm5lclRpY2tTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSt0LG4pOnV9LG4ub3V0ZXJUaWNrU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCxuKTppfSxuLnRpY2tQYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSt0LG4pOm99LG4udGlja1N1YmRpdmlkZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoJiZufSxufTt2YXIgWWw9ImJvdHRvbSIsSWw9e3RvcDoxLHJpZ2h0OjEsYm90dG9tOjEsbGVmdDoxfTt0YS5zdmcuYnJ1c2g9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKGkpe2kuZWFjaChmdW5jdGlvbigpe3ZhciBpPXRhLnNlbGVjdCh0aGlzKS5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpLm9uKCJtb3VzZWRvd24uYnJ1c2giLHUpLm9uKCJ0b3VjaHN0YXJ0LmJydXNoIix1KSxvPWkuc2VsZWN0QWxsKCIuYmFja2dyb3VuZCIpLmRhdGEoWzBdKTtvLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJiYWNrZ3JvdW5kIikuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKS5zdHlsZSgiY3Vyc29yIiwiY3Jvc3NoYWlyIiksaS5zZWxlY3RBbGwoIi5leHRlbnQiKS5kYXRhKFswXSkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsImV4dGVudCIpLnN0eWxlKCJjdXJzb3IiLCJtb3ZlIik7dmFyIGE9aS5zZWxlY3RBbGwoIi5yZXNpemUiKS5kYXRhKHAsRXQpO2EuZXhpdCgpLnJlbW92ZSgpLGEuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsZnVuY3Rpb24obil7cmV0dXJuInJlc2l6ZSAiK259KS5zdHlsZSgiY3Vyc29yIixmdW5jdGlvbihuKXtyZXR1cm4gWmxbbl19KS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IixmdW5jdGlvbihuKXtyZXR1cm4vW2V3XSQvLnRlc3Qobik/LTM6bnVsbH0pLmF0dHIoInkiLGZ1bmN0aW9uKG4pe3JldHVybi9eW25zXS8udGVzdChuKT8tMzpudWxsfSkuYXR0cigid2lkdGgiLDYpLmF0dHIoImhlaWdodCIsNikuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKSxhLnN0eWxlKCJkaXNwbGF5IixuLmVtcHR5KCk/Im5vbmUiOm51bGwpO3ZhciBzLGY9dGEudHJhbnNpdGlvbihpKSxoPXRhLnRyYW5zaXRpb24obyk7YyYmKHM9VWkoYyksaC5hdHRyKCJ4IixzWzBdKS5hdHRyKCJ3aWR0aCIsc1sxXS1zWzBdKSxlKGYpKSxsJiYocz1VaShsKSxoLmF0dHIoInkiLHNbMF0pLmF0dHIoImhlaWdodCIsc1sxXS1zWzBdKSxyKGYpKSx0KGYpfSl9ZnVuY3Rpb24gdChuKXtuLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24obil7cmV0dXJuInRyYW5zbGF0ZSgiK3NbKy9lJC8udGVzdChuKV0rIiwiK2ZbKy9ecy8udGVzdChuKV0rIikifSl9ZnVuY3Rpb24gZShuKXtuLnNlbGVjdCgiLmV4dGVudCIpLmF0dHIoIngiLHNbMF0pLG4uc2VsZWN0QWxsKCIuZXh0ZW50LC5uPnJlY3QsLnM+cmVjdCIpLmF0dHIoIndpZHRoIixzWzFdLXNbMF0pfWZ1bmN0aW9uIHIobil7bi5zZWxlY3QoIi5leHRlbnQiKS5hdHRyKCJ5IixmWzBdKSxuLnNlbGVjdEFsbCgiLmV4dGVudCwuZT5yZWN0LC53PnJlY3QiKS5hdHRyKCJoZWlnaHQiLGZbMV0tZlswXSl9ZnVuY3Rpb24gdSgpe2Z1bmN0aW9uIHUoKXszMj09dGEuZXZlbnQua2V5Q29kZSYmKE58fCh5PW51bGwselswXS09c1sxXSx6WzFdLT1mWzFdLE49MiksYigpKX1mdW5jdGlvbiBwKCl7MzI9PXRhLmV2ZW50LmtleUNvZGUmJjI9PU4mJih6WzBdKz1zWzFdLHpbMV0rPWZbMV0sTj0wLGIoKSl9ZnVuY3Rpb24gdigpe3ZhciBuPXRhLm1vdXNlKHgpLHU9ITE7TSYmKG5bMF0rPU1bMF0sblsxXSs9TVsxXSksTnx8KHRhLmV2ZW50LmFsdEtleT8oeXx8KHk9WyhzWzBdK3NbMV0pLzIsKGZbMF0rZlsxXSkvMl0pLHpbMF09c1srKG5bMF08eVswXSldLHpbMV09ZlsrKG5bMV08eVsxXSldKTp5PW51bGwpLEUmJmQobixjLDApJiYoZShTKSx1PSEwKSxBJiZkKG4sbCwxKSYmKHIoUyksdT0hMCksdSYmKHQoUyksdyh7dHlwZToiYnJ1c2giLG1vZGU6Tj8ibW92ZSI6InJlc2l6ZSJ9KSl9ZnVuY3Rpb24gZChuLHQsZSl7dmFyIHIsdSxhPVVpKHQpLGM9YVswXSxsPWFbMV0scD16W2VdLHY9ZT9mOnMsZD12WzFdLXZbMF07cmV0dXJuIE4mJihjLT1wLGwtPWQrcCkscj0oZT9nOmgpP01hdGgubWF4KGMsTWF0aC5taW4obCxuW2VdKSk6bltlXSxOP3U9KHIrPXApK2Q6KHkmJihwPU1hdGgubWF4KGMsTWF0aC5taW4obCwyKnlbZV0tcikpKSxyPnA/KHU9cixyPXApOnU9cCksdlswXSE9cnx8dlsxXSE9dT8oZT9vPW51bGw6aT1udWxsLHZbMF09cix2WzFdPXUsITApOnZvaWQgMH1mdW5jdGlvbiBtKCl7digpLFMuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuc2VsZWN0QWxsKCIucmVzaXplIikuc3R5bGUoImRpc3BsYXkiLG4uZW1wdHkoKT8ibm9uZSI6bnVsbCksdGEuc2VsZWN0KCJib2R5Iikuc3R5bGUoImN1cnNvciIsbnVsbCkscS5vbigibW91c2Vtb3ZlLmJydXNoIixudWxsKS5vbigibW91c2V1cC5icnVzaCIsbnVsbCkub24oInRvdWNobW92ZS5icnVzaCIsbnVsbCkub24oInRvdWNoZW5kLmJydXNoIixudWxsKS5vbigia2V5ZG93bi5icnVzaCIsbnVsbCkub24oImtleXVwLmJydXNoIixudWxsKSxDKCksdyh7dHlwZToiYnJ1c2hlbmQifSl9dmFyIHksTSx4PXRoaXMsXz10YS5zZWxlY3QodGEuZXZlbnQudGFyZ2V0KSx3PWEub2YoeCxhcmd1bWVudHMpLFM9dGEuc2VsZWN0KHgpLGs9Xy5kYXR1bSgpLEU9IS9eKG58cykkLy50ZXN0KGspJiZjLEE9IS9eKGV8dykkLy50ZXN0KGspJiZsLE49Xy5jbGFzc2VkKCJleHRlbnQiKSxDPVgoKSx6PXRhLm1vdXNlKHgpLHE9dGEuc2VsZWN0KG9hKS5vbigia2V5ZG93bi5icnVzaCIsdSkub24oImtleXVwLmJydXNoIixwKTtpZih0YS5ldmVudC5jaGFuZ2VkVG91Y2hlcz9xLm9uKCJ0b3VjaG1vdmUuYnJ1c2giLHYpLm9uKCJ0b3VjaGVuZC5icnVzaCIsbSk6cS5vbigibW91c2Vtb3ZlLmJydXNoIix2KS5vbigibW91c2V1cC5icnVzaCIsbSksUy5pbnRlcnJ1cHQoKS5zZWxlY3RBbGwoIioiKS5pbnRlcnJ1cHQoKSxOKXpbMF09c1swXS16WzBdLHpbMV09ZlswXS16WzFdO2Vsc2UgaWYoayl7dmFyIEw9Ky93JC8udGVzdChrKSxUPSsvXm4vLnRlc3Qoayk7TT1bc1sxLUxdLXpbMF0sZlsxLVRdLXpbMV1dLHpbMF09c1tMXSx6WzFdPWZbVF19ZWxzZSB0YS5ldmVudC5hbHRLZXkmJih5PXouc2xpY2UoKSk7Uy5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJub25lIikuc2VsZWN0QWxsKCIucmVzaXplIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLHRhLnNlbGVjdCgiYm9keSIpLnN0eWxlKCJjdXJzb3IiLF8uc3R5bGUoImN1cnNvciIpKSx3KHt0eXBlOiJicnVzaHN0YXJ0In0pLHYoKX12YXIgaSxvLGE9dyhuLCJicnVzaHN0YXJ0IiwiYnJ1c2giLCJicnVzaGVuZCIpLGM9bnVsbCxsPW51bGwscz1bMCwwXSxmPVswLDBdLGg9ITAsZz0hMCxwPVZsWzBdO3JldHVybiBuLmV2ZW50PWZ1bmN0aW9uKG4pe24uZWFjaChmdW5jdGlvbigpe3ZhciBuPWEub2YodGhpcyxhcmd1bWVudHMpLHQ9e3g6cyx5OmYsaTppLGo6b30sZT10aGlzLl9fY2hhcnRfX3x8dDt0aGlzLl9fY2hhcnRfXz10LFVsP3RhLnNlbGVjdCh0aGlzKS50cmFuc2l0aW9uKCkuZWFjaCgic3RhcnQuYnJ1c2giLGZ1bmN0aW9uKCl7aT1lLmksbz1lLmoscz1lLngsZj1lLnksbih7dHlwZToiYnJ1c2hzdGFydCJ9KX0pLnR3ZWVuKCJicnVzaDpicnVzaCIsZnVuY3Rpb24oKXt2YXIgZT15dShzLHQueCkscj15dShmLHQueSk7cmV0dXJuIGk9bz1udWxsLGZ1bmN0aW9uKHUpe3M9dC54PWUodSksZj10Lnk9cih1KSxuKHt0eXBlOiJicnVzaCIsbW9kZToicmVzaXplIn0pfX0pLmVhY2goImVuZC5icnVzaCIsZnVuY3Rpb24oKXtpPXQuaSxvPXQuaixuKHt0eXBlOiJicnVzaCIsbW9kZToicmVzaXplIn0pLG4oe3R5cGU6ImJydXNoZW5kIn0pfSk6KG4oe3R5cGU6ImJydXNoc3RhcnQifSksbih7dHlwZToiYnJ1c2giLG1vZGU6InJlc2l6ZSJ9KSxuKHt0eXBlOiJicnVzaGVuZCJ9KSl9KX0sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPXQscD1WbFshYzw8MXwhbF0sbik6Y30sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPXQscD1WbFshYzw8MXwhbF0sbik6bH0sbi5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYyYmbD8oaD0hIXRbMF0sZz0hIXRbMV0pOmM/aD0hIXQ6bCYmKGc9ISF0KSxuKTpjJiZsP1toLGddOmM/aDpsP2c6bnVsbH0sbi5leHRlbnQ9ZnVuY3Rpb24odCl7dmFyIGUscix1LGEsaDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYyYmKGU9dFswXSxyPXRbMV0sbCYmKGU9ZVswXSxyPXJbMF0pLGk9W2Uscl0sYy5pbnZlcnQmJihlPWMoZSkscj1jKHIpKSxlPnImJihoPWUsZT1yLHI9aCksKGUhPXNbMF18fHIhPXNbMV0pJiYocz1bZSxyXSkpLGwmJih1PXRbMF0sYT10WzFdLGMmJih1PXVbMV0sYT1hWzFdKSxvPVt1LGFdLGwuaW52ZXJ0JiYodT1sKHUpLGE9bChhKSksdT5hJiYoaD11LHU9YSxhPWgpLCh1IT1mWzBdfHxhIT1mWzFdKSYmKGY9W3UsYV0pKSxuKTooYyYmKGk/KGU9aVswXSxyPWlbMV0pOihlPXNbMF0scj1zWzFdLGMuaW52ZXJ0JiYoZT1jLmludmVydChlKSxyPWMuaW52ZXJ0KHIpKSxlPnImJihoPWUsZT1yLHI9aCkpKSxsJiYobz8odT1vWzBdLGE9b1sxXSk6KHU9ZlswXSxhPWZbMV0sbC5pbnZlcnQmJih1PWwuaW52ZXJ0KHUpLGE9bC5pbnZlcnQoYSkpLHU+YSYmKGg9dSx1PWEsYT1oKSkpLGMmJmw/W1tlLHVdLFtyLGFdXTpjP1tlLHJdOmwmJlt1LGFdKX0sbi5jbGVhcj1mdW5jdGlvbigpe3JldHVybiBuLmVtcHR5KCl8fChzPVswLDBdLGY9WzAsMF0saT1vPW51bGwpLG59LG4uZW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4hIWMmJnNbMF09PXNbMV18fCEhbCYmZlswXT09ZlsxXX0sdGEucmViaW5kKG4sYSwib24iKX07dmFyIFpsPXtuOiJucy1yZXNpemUiLGU6ImV3LXJlc2l6ZSIsczoibnMtcmVzaXplIix3OiJldy1yZXNpemUiLG53OiJud3NlLXJlc2l6ZSIsbmU6Im5lc3ctcmVzaXplIixzZToibndzZS1yZXNpemUiLHN3OiJuZXN3LXJlc2l6ZSJ9LFZsPVtbIm4iLCJlIiwicyIsInciLCJudyIsIm5lIiwic2UiLCJzdyJdLFsiZSIsInciXSxbIm4iLCJzIl0sW11dLFhsPWZjLmZvcm1hdD1tYy50aW1lRm9ybWF0LCRsPVhsLnV0YyxCbD0kbCgiJVktJW0tJWRUJUg6JU06JVMuJUxaIik7WGwuaXNvPURhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nJiYrbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpP0pvOkJsLEpvLnBhcnNlPWZ1bmN0aW9uKG4pe3ZhciB0PW5ldyBEYXRlKG4pO3JldHVybiBpc05hTih0KT9udWxsOnR9LEpvLnRvU3RyaW5nPUJsLnRvU3RyaW5nLGZjLnNlY29uZD1GdChmdW5jdGlvbihuKXtyZXR1cm4gbmV3IGhjKDFlMypNYXRoLmZsb29yKG4vMWUzKSl9LGZ1bmN0aW9uKG4sdCl7bi5zZXRUaW1lKG4uZ2V0VGltZSgpKzFlMypNYXRoLmZsb29yKHQpKX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0U2Vjb25kcygpfSksZmMuc2Vjb25kcz1mYy5zZWNvbmQucmFuZ2UsZmMuc2Vjb25kcy51dGM9ZmMuc2Vjb25kLnV0Yy5yYW5nZSxmYy5taW51dGU9RnQoZnVuY3Rpb24obil7cmV0dXJuIG5ldyBoYyg2ZTQqTWF0aC5mbG9vcihuLzZlNCkpfSxmdW5jdGlvbihuLHQpe24uc2V0VGltZShuLmdldFRpbWUoKSs2ZTQqTWF0aC5mbG9vcih0KSl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1pbnV0ZXMoKX0pLGZjLm1pbnV0ZXM9ZmMubWludXRlLnJhbmdlLGZjLm1pbnV0ZXMudXRjPWZjLm1pbnV0ZS51dGMucmFuZ2UsZmMuaG91cj1GdChmdW5jdGlvbihuKXt2YXIgdD1uLmdldFRpbWV6b25lT2Zmc2V0KCkvNjA7cmV0dXJuIG5ldyBoYygzNmU1KihNYXRoLmZsb29yKG4vMzZlNS10KSt0KSl9LGZ1bmN0aW9uKG4sdCl7bi5zZXRUaW1lKG4uZ2V0VGltZSgpKzM2ZTUqTWF0aC5mbG9vcih0KSl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldEhvdXJzKCl9KSxmYy5ob3Vycz1mYy5ob3VyLnJhbmdlLGZjLmhvdXJzLnV0Yz1mYy5ob3VyLnV0Yy5yYW5nZSxmYy5tb250aD1GdChmdW5jdGlvbihuKXtyZXR1cm4gbj1mYy5kYXkobiksbi5zZXREYXRlKDEpLG59LGZ1bmN0aW9uKG4sdCl7bi5zZXRNb250aChuLmdldE1vbnRoKCkrdCl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1vbnRoKCl9KSxmYy5tb250aHM9ZmMubW9udGgucmFuZ2UsZmMubW9udGhzLnV0Yz1mYy5tb250aC51dGMucmFuZ2U7dmFyIFdsPVsxZTMsNWUzLDE1ZTMsM2U0LDZlNCwzZTUsOWU1LDE4ZTUsMzZlNSwxMDhlNSwyMTZlNSw0MzJlNSw4NjRlNSwxNzI4ZTUsNjA0OGU1LDI1OTJlNiw3Nzc2ZTYsMzE1MzZlNl0sSmw9W1tmYy5zZWNvbmQsMV0sW2ZjLnNlY29uZCw1XSxbZmMuc2Vjb25kLDE1XSxbZmMuc2Vjb25kLDMwXSxbZmMubWludXRlLDFdLFtmYy5taW51dGUsNV0sW2ZjLm1pbnV0ZSwxNV0sW2ZjLm1pbnV0ZSwzMF0sW2ZjLmhvdXIsMV0sW2ZjLmhvdXIsM10sW2ZjLmhvdXIsNl0sW2ZjLmhvdXIsMTJdLFtmYy5kYXksMV0sW2ZjLmRheSwyXSxbZmMud2VlaywxXSxbZmMubW9udGgsMV0sW2ZjLm1vbnRoLDNdLFtmYy55ZWFyLDFdXSxHbD1YbC5tdWx0aShbWyIuJUwiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1pbGxpc2Vjb25kcygpfV0sWyI6JVMiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFNlY29uZHMoKX1dLFsiJUk6JU0iLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1pbnV0ZXMoKX1dLFsiJUkgJXAiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldEhvdXJzKCl9XSxbIiVhICVkIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXREYXkoKSYmMSE9bi5nZXREYXRlKCl9XSxbIiViICVkIixmdW5jdGlvbihuKXtyZXR1cm4gMSE9bi5nZXREYXRlKCl9XSxbIiVCIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRNb250aCgpfV0sWyIlWSIsTmVdXSksS2w9e3JhbmdlOmZ1bmN0aW9uKG4sdCxlKXtyZXR1cm4gdGEucmFuZ2UoTWF0aC5jZWlsKG4vZSkqZSwrdCxlKS5tYXAoS28pfSxmbG9vcjpFdCxjZWlsOkV0fTtKbC55ZWFyPWZjLnllYXIsZmMuc2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gR28odGEuc2NhbGUubGluZWFyKCksSmwsR2wpfTt2YXIgUWw9SmwubWFwKGZ1bmN0aW9uKG4pe3JldHVybltuWzBdLnV0YyxuWzFdXX0pLG5zPSRsLm11bHRpKFtbIi4lTCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDTWlsbGlzZWNvbmRzKCl9XSxbIjolUyIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDU2Vjb25kcygpfV0sWyIlSTolTSIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDTWludXRlcygpfV0sWyIlSSAlcCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDSG91cnMoKX1dLFsiJWEgJWQiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ0RheSgpJiYxIT1uLmdldFVUQ0RhdGUoKX1dLFsiJWIgJWQiLGZ1bmN0aW9uKG4pe3JldHVybiAxIT1uLmdldFVUQ0RhdGUoKX1dLFsiJUIiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ01vbnRoKCl9XSxbIiVZIixOZV1dKTtRbC55ZWFyPWZjLnllYXIudXRjLGZjLnNjYWxlLnV0Yz1mdW5jdGlvbigpe3JldHVybiBHbyh0YS5zY2FsZS5saW5lYXIoKSxRbCxucyl9LHRhLnRleHQ9QXQoZnVuY3Rpb24obil7cmV0dXJuIG4ucmVzcG9uc2VUZXh0fSksdGEuanNvbj1mdW5jdGlvbihuLHQpe3JldHVybiBOdChuLCJhcHBsaWNhdGlvbi9qc29uIixRbyx0KX0sdGEuaHRtbD1mdW5jdGlvbihuLHQpe3JldHVybiBOdChuLCJ0ZXh0L2h0bWwiLG5hLHQpfSx0YS54bWw9QXQoZnVuY3Rpb24obil7cmV0dXJuIG4ucmVzcG9uc2VYTUx9KSwiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZSh0YSk6Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzJiYobW9kdWxlLmV4cG9ydHM9dGEpLHRoaXMuZDM9dGF9KCk7"></script>
<script src="data:application/x-javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsKCiAgbmFtZTogImRpYWdvbmFsTmV0d29yayIsCiAgdHlwZTogIm91dHB1dCIsCgogIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CgogICAgZDMuc2VsZWN0KGVsKS5hcHBlbmQoInN2ZyIpCiAgICAgIC5zdHlsZSgid2lkdGgiLCAiMTAwJSIpCiAgICAgIC5zdHlsZSgiaGVpZ2h0IiwgIjEwMCUiKQogICAgICAuYXBwZW5kKCJnIikKICAgICAgLmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoNDAsMCkiKTsKICAgIHJldHVybiBkMy5sYXlvdXQudHJlZSgpOwoKICB9LAoKICByZXNpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0LCB0cmVlKSB7CiAgICAvLyByZXNpemUgbm93IGhhbmRsZWQgYnkgc3ZnIHZpZXdCb3ggYXR0cmlidXRlCiAgICAvKgogICAgdmFyIHMgPSBkMy5zZWxlY3QoZWwpLnNlbGVjdEFsbCgic3ZnIik7CiAgICBzLmF0dHIoIndpZHRoIiwgd2lkdGgpLmF0dHIoImhlaWdodCIsIGhlaWdodCk7CiAgICAKICAgIHZhciBtYXJnaW4gPSB7dG9wOiAyMCwgcmlnaHQ6IDIwLCBib3R0b206IDIwLCBsZWZ0OiAyMH07CiAgICB3aWR0aCA9IHdpZHRoIC0gbWFyZ2luLnJpZ2h0IC0gbWFyZ2luLmxlZnQ7CiAgICBoZWlnaHQgPSBoZWlnaHQgLSBtYXJnaW4udG9wIC0gbWFyZ2luLmJvdHRvbTsKICAgIAogICAgdHJlZS5zaXplKFtoZWlnaHQsIHdpZHRoXSk7CiAgICB2YXIgc3ZnID0gZDMuc2VsZWN0KGVsKS5zZWxlY3RBbGwoInN2ZyIpLnNlbGVjdCgiZyIpCiAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlKCIgKyBtYXJnaW4ubGVmdCArICIsIiArIG1hcmdpbi50b3AgKyAiKSIpOwogICAgKi8KCiAgfSwKCiAgcmVuZGVyVmFsdWU6IGZ1bmN0aW9uKGVsLCB4LCB0cmVlKSB7CiAgICAvLyB4IGlzIGEgbGlzdCB3aXRoIHR3byBlbGVtZW50cywgb3B0aW9ucyBhbmQgcm9vdDsgcm9vdCBtdXN0IGFscmVhZHkgYmUgYQogICAgLy8gSlNPTiBhcnJheSB3aXRoIHRoZSBkM1RyZWUgcm9vdCBkYXRhCgogICAgdmFyIHMgPSBkMy5zZWxlY3QoZWwpLnNlbGVjdEFsbCgic3ZnIik7CiAgIAogICAgLy8gd2hlbiByZS1yZW5kZXJpbmcgdGhlIHN2ZywgdGhlIHZpZXdCb3ggYXR0cmlidXRlIHNldCBpbiB0aGUgY29kZSBiZWxvdywgd2lsbAogICAgLy8gYmUgYWZmZWN0ZWQgYnkgdGhlIHByZXZpb3VzbHkgc2V0IHZpZXdCb3guIFRoaXMgbGluZSBlbnN1cmVzLCB0aGF0IHRoZSAKICAgIC8vIHZpZXdCb3ggd2lsbCBhbHdheXMgYmUgY2FsY3VsYXRlZCByaWdodC4gCiAgICBzLmF0dHIoInZpZXdCb3giLCBudWxsKTsKICAgIAogICAgLy8gbWFyZ2luIGhhbmRsaW5nCiAgICAvLyAgIHNldCBvdXIgZGVmYXVsdCBtYXJnaW4gdG8gYmUgMjAKICAgIC8vICAgd2lsbCBvdmVycmlkZSB3aXRoIHgub3B0aW9ucy5tYXJnaW4gaWYgcHJvdmlkZWQKICAgIHZhciBtYXJnaW4gPSB7dG9wOiAyMCwgcmlnaHQ6IDIwLCBib3R0b206IDIwLCBsZWZ0OiAyMH07CiAgICAvLyAgIGdvIHRocm91Z2ggZWFjaCBrZXkgb2YgeC5vcHRpb25zLm1hcmdpbgogICAgLy8gICB1c2UgdGhpcyB2YWx1ZSBpZiBwcm92aWRlZCBmcm9tIHRoZSBSIHNpZGUKICAgIE9iamVjdC5rZXlzKHgub3B0aW9ucy5tYXJnaW4pLm1hcChmdW5jdGlvbihreSl7CiAgICAgIGlmKHgub3B0aW9ucy5tYXJnaW5ba3ldICE9PSBudWxsKSB7CiAgICAgICAgbWFyZ2luW2t5XSA9IHgub3B0aW9ucy5tYXJnaW5ba3ldOwogICAgICB9CiAgICAgIC8vIHNldCB0aGUgbWFyZ2luIG9uIHRoZSBzdmcgd2l0aCBjc3Mgc3R5bGUKICAgICAgLy8gY29tbWVudGluZyB0aGlzIG91dCBzaW5jZSBub3QgY29ycmVjdAogICAgICAvLyBzLnN0eWxlKFsibWFyZ2luIixreV0uam9pbigiLSIpLCBtYXJnaW5ba3ldKTsKICAgIH0pOwogICAgICAKICAgIAogICAgd2lkdGggPSBzLm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAtIG1hcmdpbi5yaWdodCAtIG1hcmdpbi5sZWZ0OwogICAgaGVpZ2h0ID0gcy5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0IC0gbWFyZ2luLnRvcCAtIG1hcmdpbi5ib3R0b207CiAgICAKICAgIC8vYWRkZWQgTWF0aC5tYXgoMSwgLi4uKSB0byBhdm9pZCBOYU4gdmFsdWVzIHdoZW4gZGVhbGluZyB3aXRoIG5vZGVzIG9mIGRlcHRoIDAuCiAgICB0cmVlLnNpemUoW2hlaWdodCwgd2lkdGhdKQogICAgICAuc2VwYXJhdGlvbihmdW5jdGlvbihhLCBiKSB7IHJldHVybiAoYS5wYXJlbnQgPT0gYi5wYXJlbnQgPyAxIDogMikgLyBNYXRoLm1heCgxLCBhLmRlcHRoKTsgfSk7CgogICAgLy8gc2VsZWN0IHRoZSBzdmcgZ3JvdXAgZWxlbWVudCBhbmQgcmVtb3ZlIGV4aXN0aW5nIGNoaWxkcmVuCiAgICBzLmF0dHIoInBvaW50ZXItZXZlbnRzIiwgImFsbCIpLnNlbGVjdEFsbCgiKiIpLnJlbW92ZSgpOwogICAgcy5hcHBlbmQoImciKQogICAgICAuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgiICsgbWFyZ2luLmxlZnQgKyAiLCIgKyBtYXJnaW4udG9wICsgIikiKTsKCiAgICB2YXIgc3ZnID0gZDMuc2VsZWN0KGVsKS5zZWxlY3RBbGwoImciKTsKCiAgICB2YXIgcm9vdCA9IHgucm9vdDsKICAgIHZhciBub2RlcyA9IHRyZWUubm9kZXMocm9vdCksCiAgICAgIGxpbmtzID0gdHJlZS5saW5rcyhub2Rlcyk7CgogICAgdmFyIGRpYWdvbmFsID0gZDMuc3ZnLmRpYWdvbmFsKCkKICAgICAgLnByb2plY3Rpb24oZnVuY3Rpb24oZCkgeyByZXR1cm4gW2QueSwgZC54XTsgfSk7CgogICAgLy8gZHJhdyBsaW5rcwogICAgdmFyIGxpbmsgPSBzdmcuc2VsZWN0QWxsKCIubGluayIpCiAgICAgIC5kYXRhKGxpbmtzKQogICAgICAuZW50ZXIoKS5hcHBlbmQoInBhdGgiKQogICAgICAuc3R5bGUoImZpbGwiLCAibm9uZSIpCiAgICAgIC5zdHlsZSgic3Ryb2tlIiwgeC5vcHRpb25zLmxpbmtDb2xvdXIpCiAgICAgIC5zdHlsZSgib3BhY2l0eSIsICIwLjU1IikKICAgICAgLnN0eWxlKCJzdHJva2Utd2lkdGgiLCAiMS41cHgiKQogICAgICAuYXR0cigiZCIsIGRpYWdvbmFsKTsKCiAgICAvLyBkcmF3IG5vZGVzCiAgICB2YXIgbm9kZSA9IHN2Zy5zZWxlY3RBbGwoIi5ub2RlIikKICAgICAgLmRhdGEobm9kZXMpCiAgICAgIC5lbnRlcigpLmFwcGVuZCgiZyIpCiAgICAgIC5hdHRyKCJjbGFzcyIsICJub2RlIikKICAgICAgLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQpIHsgCiAgICAgICAgcmV0dXJuICJ0cmFuc2xhdGUoIiArIGQueSArICIsIiArIGQueCArICIpIjsKICAgICAgfSkKICAgICAgLm9uKCJtb3VzZW92ZXIiLCBtb3VzZW92ZXIpCiAgICAgIC5vbigibW91c2VvdXQiLCBtb3VzZW91dCk7CgogICAgLy8gbm9kZSBjaXJjbGVzCiAgICBub2RlLmFwcGVuZCgiY2lyY2xlIikKICAgICAgICAuYXR0cigiciIsIDQuNSkKICAgICAgICAuc3R5bGUoImZpbGwiLCB4Lm9wdGlvbnMubm9kZUNvbG91cikKICAgICAgICAuc3R5bGUoIm9wYWNpdHkiLCB4Lm9wdGlvbnMub3BhY2l0eSkKICAgICAgICAuc3R5bGUoInN0cm9rZSIsIHgub3B0aW9ucy5ub2RlU3Ryb2tlKQogICAgICAgIC5zdHlsZSgic3Ryb2tlLXdpZHRoIiwgIjEuNXB4Iik7CgogICAgLy8gbm9kZSB0ZXh0CiAgICBub2RlLmFwcGVuZCgidGV4dCIpCiAgICAgICAgLmF0dHIoImR4IiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5jaGlsZHJlbiA/IC04IDogODsgfSkKICAgICAgICAuYXR0cigiZHkiLCAiLjMxZW0iKQogICAgICAgIC5hdHRyKCJ0ZXh0LWFuY2hvciIsIGZ1bmN0aW9uKGQpIHsgCiAgICAgICAgICByZXR1cm4gZC5jaGlsZHJlbiB8fCBkLl9jaGlsZHJlbiA/ICJlbmQiIDogInN0YXJ0IjsKICAgICAgICB9KQogICAgICAgIC5zdHlsZSgiZm9udCIsIHgub3B0aW9ucy5mb250U2l6ZSArICJweCAiICsgeC5vcHRpb25zLmZvbnRGYW1pbHkpCiAgICAgICAgLnN0eWxlKCJvcGFjaXR5IiwgeC5vcHRpb25zLm9wYWNpdHkpCiAgICAgICAgLnN0eWxlKCJmaWxsIiwgeC5vcHRpb25zLnRleHRDb2xvdXIpCiAgICAgICAgLnRleHQoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5uYW1lOyB9KTsKICAgICAgICAKICAgIC8vIGFkanVzdCB2aWV3Qm94IHRvIGZpdCB0aGUgYm91bmRzIG9mIG91ciB0cmVlCiAgICBzLmF0dHIoCiAgICAgICAgInZpZXdCb3giLAogICAgICAgIFsKICAgICAgICAgIGQzLm1pbigKICAgICAgICAgICAgcy5zZWxlY3RBbGwoJy5ub2RlIHRleHQnKVswXS5tYXAoZnVuY3Rpb24oZCl7CiAgICAgICAgICAgICAgcmV0dXJuIGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdAogICAgICAgICAgICB9KQogICAgICAgICAgKSAtIHMubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSBtYXJnaW4ucmlnaHQsCiAgICAgICAgICBkMy5taW4oCiAgICAgICAgICAgIHMuc2VsZWN0QWxsKCcubm9kZSB0ZXh0JylbMF0ubWFwKGZ1bmN0aW9uKGQpewogICAgICAgICAgICAgIHJldHVybiBkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcAogICAgICAgICAgICB9KQogICAgICAgICAgKSAtIHMubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIG1hcmdpbi50b3AsCiAgICAgICAgICBkMy5tYXgoCiAgICAgICAgICAgIHMuc2VsZWN0QWxsKCcubm9kZSB0ZXh0JylbMF0ubWFwKGZ1bmN0aW9uKGQpewogICAgICAgICAgICAgIHJldHVybiBkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0CiAgICAgICAgICAgIH0pCiAgICAgICAgICApIC0KICAgICAgICAgIGQzLm1pbigKICAgICAgICAgICAgcy5zZWxlY3RBbGwoJy5ub2RlIHRleHQnKVswXS5tYXAoZnVuY3Rpb24oZCl7CiAgICAgICAgICAgICAgcmV0dXJuIGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdAogICAgICAgICAgICB9KQogICAgICAgICAgKSArIG1hcmdpbi5sZWZ0ICsgbWFyZ2luLnJpZ2h0LAogICAgICAgICAgZDMubWF4KAogICAgICAgICAgICBzLnNlbGVjdEFsbCgnLm5vZGUgdGV4dCcpWzBdLm1hcChmdW5jdGlvbihkKXsKICAgICAgICAgICAgICByZXR1cm4gZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20KICAgICAgICAgICAgfSkKICAgICAgICAgICkgLQogICAgICAgICAgZDMubWluKAogICAgICAgICAgICBzLnNlbGVjdEFsbCgnLm5vZGUgdGV4dCcpWzBdLm1hcChmdW5jdGlvbihkKXsKICAgICAgICAgICAgICByZXR1cm4gZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AKICAgICAgICAgICAgfSkKICAgICAgICAgICkgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbQogICAgICAgIF0uam9pbigiLCIpCiAgICAgICk7ICAgICAgICAKCiAgICAvLyBtb3VzZW92ZXIgZXZlbnQgaGFuZGxlcgogICAgZnVuY3Rpb24gbW91c2VvdmVyKCkgewogICAgICBkMy5zZWxlY3QodGhpcykuc2VsZWN0KCJjaXJjbGUiKS50cmFuc2l0aW9uKCkKICAgICAgICAuZHVyYXRpb24oNzUwKQogICAgICAgIC5hdHRyKCJyIiwgOSk7CiAgICAgICAgCiAgICAgIGQzLnNlbGVjdCh0aGlzKS5zZWxlY3QoInRleHQiKS50cmFuc2l0aW9uKCkKICAgICAgICAuZHVyYXRpb24oNzUwKQogICAgICAgIC5zdHlsZSgic3Ryb2tlLXdpZHRoIiwgIi41cHgiKQogICAgICAgIC5zdHlsZSgiZm9udCIsICIyNXB4ICIgKyB4Lm9wdGlvbnMuZm9udEZhbWlseSkKICAgICAgICAuc3R5bGUoIm9wYWNpdHkiLCAxKTsKICAgIH0KCiAgICAvLyBtb3VzZW91dCBldmVudCBoYW5kbGVyCiAgICBmdW5jdGlvbiBtb3VzZW91dCgpIHsKICAgICAgZDMuc2VsZWN0KHRoaXMpLnNlbGVjdCgiY2lyY2xlIikudHJhbnNpdGlvbigpCiAgICAgICAgLmR1cmF0aW9uKDc1MCkKICAgICAgICAuYXR0cigiciIsIDQuNSk7CiAgICAgICAgCiAgICAgIGQzLnNlbGVjdCh0aGlzKS5zZWxlY3QoInRleHQiKS50cmFuc2l0aW9uKCkKICAgICAgICAuZHVyYXRpb24oNzUwKQogICAgICAgIC5zdHlsZSgiZm9udCIsIHgub3B0aW9ucy5mb250U2l6ZSArICJweCAiICsgeC5vcHRpb25zLmZvbnRGYW1pbHkpCiAgICAgICAgLnN0eWxlKCJvcGFjaXR5IiwgeC5vcHRpb25zLm9wYWNpdHkpOwogICAgfQoKICB9LAp9KTsK"></script>
<link href="data:text/css;charset=utf-8,%40charset%20%22UTF%2D8%22%3B%2Eel%2Dbreadcrumb%3Aafter%2C%2Eel%2Dbreadcrumb%3Abefore%2C%2Eel%2Dform%2Ditem%3Aafter%2C%2Eel%2Dform%2Ditem%3Abefore%2C%2Eel%2Dform%2Ditem%5F%5Fcontent%3Aafter%2C%2Eel%2Dform%2Ditem%5F%5Fcontent%3Abefore%7Bdisplay%3Atable%3Bcontent%3A%22%22%7D%2Eel%2Dslider%5F%5Fbutton%2C%2Eel%2Dslider%5F%5Fbutton%2Dwrapper%7B%2Dwebkit%2Duser%2Dselect%3Anone%3B%2Dmoz%2Duser%2Dselect%3Anone%3B%2Dms%2Duser%2Dselect%3Anone%7D%2Eel%2Dalert%2C%2Eel%2Ddialog%2C%2Eel%2Dnotification%2C%2Eel%2Dradio%5F%5Finner%2C%2Eel%2Dswitch%5F%5Fcore%7Bbox%2Dsizing%3Aborder%2Dbox%7D%2Eel%2Dradio%2C%2Eel%2Dradio%5F%5Finput%2C%2Eel%2Dtable%20%2Eel%2Dtooltip%5F%5Frel%20%2Ecell%2C%2Eel%2Dtable%20th%2C%2Eel%2Dtable%20th%3Ediv%7Bwhite%2Dspace%3Anowrap%7D%2Eel%2Dpagination%2D%2Dsmall%20%2Earrow%2Edisabled%2C%2Eel%2Dtable%20td%2Eis%2Dhidden%3E%2A%2C%2Eel%2Dtable%20th%2Eis%2Dhidden%3E%2A%7Bvisibility%3Ahidden%7D%2Eel%2Dbreadcrumb%3Aafter%2C%2Eel%2Dbutton%2Dgroup%3Aafter%2C%2Eel%2Dform%2Ditem%3Aafter%2C%2Eel%2Dform%2Ditem%5F%5Fcontent%3Aafter%2C%2Eel%2Dmenu%3Aafter%2C%2Eel%2Drow%3Aafter%2C%2Eel%2Dslider%3Aafter%2C%2Eel%2Dtabs%5F%5Fheader%3Aafter%7Bclear%3Aboth%7D%2Eel%2Dautocomplete%5F%5Fsuggestions%2Eis%2Dloading%20li%3Aafter%7Bdisplay%3Ainline%2Dblock%3Bcontent%3A%22%22%3Bheight%3A100%25%3Bvertical%2Dalign%3Amiddle%7D%2Eel%2Dbutton%2Dgroup%3Aafter%2C%2Eel%2Dbutton%2Dgroup%3Abefore%7Bdisplay%3Atable%3Bcontent%3A%22%22%7D%40font%2Dface%7Bfont%2Dfamily%3Aelement%2Dicons%3Bsrc%3Aurl%28data%3Atext%2Fplain%3Bcharset%3Dutf%2D8%2CInvalid%2520URL%253A%2520%252Felement%252Dui%252Flib%252Ftheme%252Ddefault%252Ffonts%252Felement%252Dicons%252Eeot%253Ft%253D1472440741%29%3Bsrc%3Aurl%28data%3Atext%2Fplain%3Bcharset%3Dutf%2D8%2CInvalid%2520URL%253A%2520%252Felement%252Dui%252Flib%252Ftheme%252Ddefault%252Ffonts%252Felement%252Dicons%252Ewoff%253Ft%253D1472440741%29%20format%28%27woff%27%29%2Curl%28data%3Atext%2Fplain%3Bcharset%3Dutf%2D8%2CInvalid%2520URL%253A%2520%252Felement%252Dui%252Flib%252Ftheme%252Ddefault%252Ffonts%252Felement%252Dicons%252Ettf%253Ft%253D1472440741%29%20format%28%27truetype%27%29%2Curl%28data%3Atext%2Fplain%3Bcharset%3Dutf%2D8%2CInvalid%2520URL%253A%2520%252Felement%252Dui%252Flib%252Ftheme%252Ddefault%252Ffonts%252Felement%252Dicons%252Esvg%253Ft%253D1472440741%29%20format%28%27svg%27%29%3Bfont%2Dweight%3A400%3Bfont%2Dstyle%3Anormal%7D%5Bclass%2A%3D%22%20el%2Dicon%2D%22%5D%2C%5Bclass%5E%3Del%2Dicon%2D%5D%7Bfont%2Dfamily%3Aelement%2Dicons%21important%3Bspeak%3Anone%3Bfont%2Dstyle%3Anormal%3Bfont%2Dweight%3A400%3Bfont%2Dvariant%3Anormal%3Btext%2Dtransform%3Anone%3Bline%2Dheight%3A1%3Bvertical%2Dalign%3Abaseline%3Bdisplay%3Ainline%2Dblock%3B%2Dwebkit%2Dfont%2Dsmoothing%3Aantialiased%3B%2Dmoz%2Dosx%2Dfont%2Dsmoothing%3Agrayscale%7D%2Eel%2Dalert%5F%5Ficon%2C%2Eel%2Dradio%2Dbutton%5F%5Finner%2C%2Eel%2Dradio%5F%5Finput%2C%2Eel%2Dslider%5F%5Fbutton%2Dwrapper%20%2Eel%2Dtooltip%5F%5Frel%2C%2Eel%2Dslider%5F%5Frunway%2C%2Eel%2Dswitch%5F%5Fcore%2C%2Eel%2Dtable%20td%2C%2Eel%2Dtable%20th%7Bvertical%2Dalign%3Amiddle%7D%2Eel%2Dicon%2Darrow%2Ddown%3Abefore%7Bcontent%3A%22%5Ce600%22%7D%2Eel%2Dicon%2Darrow%2Dleft%3Abefore%7Bcontent%3A%22%5Ce601%22%7D%2Eel%2Dicon%2Darrow%2Dright%3Abefore%7Bcontent%3A%22%5Ce602%22%7D%2Eel%2Dicon%2Darrow%2Dup%3Abefore%7Bcontent%3A%22%5Ce603%22%7D%2Eel%2Dicon%2Dcaret%2Dbottom%3Abefore%7Bcontent%3A%22%5Ce604%22%7D%2Eel%2Dicon%2Dcaret%2Dleft%3Abefore%7Bcontent%3A%22%5Ce605%22%7D%2Eel%2Dicon%2Dcaret%2Dright%3Abefore%7Bcontent%3A%22%5Ce606%22%7D%2Eel%2Dicon%2Dcaret%2Dtop%3Abefore%7Bcontent%3A%22%5Ce607%22%7D%2Eel%2Dicon%2Dcheck%3Abefore%7Bcontent%3A%22%5Ce608%22%7D%2Eel%2Dicon%2Dcircle%2Dcheck%3Abefore%7Bcontent%3A%22%5Ce609%22%7D%2Eel%2Dicon%2Dcircle%2Dclose%3Abefore%7Bcontent%3A%22%5Ce60a%22%7D%2Eel%2Dicon%2Dcircle%2Dcross%3Abefore%7Bcontent%3A%22%5Ce60b%22%7D%2Eel%2Dicon%2Dclose%3Abefore%7Bcontent%3A%22%5Ce60c%22%7D%2Eel%2Dicon%2Dupload%3Abefore%7Bcontent%3A%22%5Ce60d%22%7D%2Eel%2Dicon%2Dd%2Darrow%2Dleft%3Abefore%7Bcontent%3A%22%5Ce60e%22%7D%2Eel%2Dicon%2Dd%2Darrow%2Dright%3Abefore%7Bcontent%3A%22%5Ce60f%22%7D%2Eel%2Dicon%2Dd%2Dcaret%3Abefore%7Bcontent%3A%22%5Ce610%22%7D%2Eel%2Dicon%2Ddate%3Abefore%7Bcontent%3A%22%5Ce611%22%7D%2Eel%2Dicon%2Ddelete%3Abefore%7Bcontent%3A%22%5Ce612%22%7D%2Eel%2Dicon%2Ddocument%3Abefore%7Bcontent%3A%22%5Ce613%22%7D%2Eel%2Dicon%2Dedit%3Abefore%7Bcontent%3A%22%5Ce614%22%7D%2Eel%2Dicon%2Dinformation%3Abefore%7Bcontent%3A%22%5Ce615%22%7D%2Eel%2Dicon%2Dloading%3Abefore%7Bcontent%3A%22%5Ce616%22%7D%2Eel%2Dicon%2Dmenu%3Abefore%7Bcontent%3A%22%5Ce617%22%7D%2Eel%2Dicon%2Dmessage%3Abefore%7Bcontent%3A%22%5Ce618%22%7D%2Eel%2Dicon%2Dminus%3Abefore%7Bcontent%3A%22%5Ce619%22%7D%2Eel%2Dicon%2Dmore%3Abefore%7Bcontent%3A%22%5Ce61a%22%7D%2Eel%2Dicon%2Dpicture%3Abefore%7Bcontent%3A%22%5Ce61b%22%7D%2Eel%2Dicon%2Dplus%3Abefore%7Bcontent%3A%22%5Ce61c%22%7D%2Eel%2Dicon%2Dsearch%3Abefore%7Bcontent%3A%22%5Ce61d%22%7D%2Eel%2Dicon%2Dsetting%3Abefore%7Bcontent%3A%22%5Ce61e%22%7D%2Eel%2Dicon%2Dshare%3Abefore%7Bcontent%3A%22%5Ce61f%22%7D%2Eel%2Dicon%2Dstar%2Doff%3Abefore%7Bcontent%3A%22%5Ce620%22%7D%2Eel%2Dicon%2Dstar%2Don%3Abefore%7Bcontent%3A%22%5Ce621%22%7D%2Eel%2Dicon%2Dtime%3Abefore%7Bcontent%3A%22%5Ce622%22%7D%2Eel%2Dicon%2Dwarning%3Abefore%7Bcontent%3A%22%5Ce623%22%7D%2Eel%2Dicon%2Ddelete2%3Abefore%7Bcontent%3A%22%5Ce624%22%7D%2Eel%2Dicon%2Dupload2%3Abefore%7Bcontent%3A%22%5Ce627%22%7D%2Eel%2Dicon%2Dview%3Abefore%7Bcontent%3A%22%5Ce626%22%7D%2Eel%2Dicon%2Dloading%7Banimation%3Arotating%201s%20linear%20infinite%7D%2Eel%2Dicon%2D%2Dright%7Bmargin%2Dleft%3A5px%7D%2Eel%2Dicon%2D%2Dleft%7Bmargin%2Dright%3A5px%7D%40keyframes%20rotating%7B0%25%7Btransform%3ArotateZ%280%29%7D100%25%7Btransform%3ArotateZ%28360deg%29%7D%7D%2Eel%2Dalert%7Bwidth%3A100%25%3Bpadding%3A8px%2016px%3Bmargin%3A0%3Bborder%2Dradius%3A4px%3Bposition%3Arelative%3Bbackground%2Dcolor%3A%23fff%3Boverflow%3Ahidden%3Bcolor%3A%23fff%3Bopacity%3A1%3Bdisplay%3Atable%3Btransition%3Aopacity%20%2E2s%7D%2Eel%2Dalert%20%2Eel%2Dalert%5F%5Fdescription%7Bcolor%3A%23fff%3Bfont%2Dsize%3A12px%3Bmargin%3A5px%200%200%7D%2Eel%2Dalert%2D%2Dsuccess%7Bbackground%2Dcolor%3A%2313ce66%7D%2Eel%2Dalert%2D%2Dinfo%7Bbackground%2Dcolor%3A%2350bfff%7D%2Eel%2Dalert%2D%2Dwarning%7Bbackground%2Dcolor%3A%23f7ba2a%7D%2Eel%2Dalert%2D%2Derror%7Bbackground%2Dcolor%3A%23ff4949%7D%2Eel%2Dalert%5F%5Fcontent%7Bdisplay%3Atable%2Dcell%3Bpadding%3A0%208px%7D%2Eel%2Dalert%5F%5Ficon%7Bfont%2Dsize%3A16px%3Bwidth%3A16px%3Bdisplay%3Atable%2Dcell%3Bcolor%3A%23fff%7D%2Eel%2Dalert%5F%5Ficon%2Eis%2Dbig%7Bfont%2Dsize%3A28px%3Bwidth%3A28px%7D%2Eel%2Dalert%5F%5Ftitle%7Bfont%2Dsize%3A13px%3Bline%2Dheight%3A18px%7D%2Eel%2Dalert%5F%5Ftitle%2Eis%2Dbold%7Bfont%2Dweight%3A700%7D%2Eel%2Dalert%5F%5Fclosebtn%7Bfont%2Dsize%3A12px%3Bcolor%3A%23fff%3Bopacity%3A1%3Btop%3A12px%3Bright%3A15px%3Bposition%3Aabsolute%3Bcursor%3Apointer%7D%2Eel%2Dalert%2Dfade%2Denter%2C%2Eel%2Dalert%2Dfade%2Dleave%2Dactive%2C%2Eel%2Dnotification%2Dfade%2Dleave%2Dactive%2C%2Eel%2Dradio%5F%5Foriginal%2C%2Eel%2Dswitch%20%2Elabel%2Dfade%2Denter%2C%2Eel%2Dswitch%20%2Elabel%2Dfade%2Dleave%2Dactive%7Bopacity%3A0%7D%2Eel%2Dalert%5F%5Fclosebtn%2Eis%2Dcustomed%7Bfont%2Dstyle%3Anormal%3Bfont%2Dsize%3A13px%3Btop%3A9px%7D%2Eel%2Dnotification%7Bwidth%3A330px%3Bpadding%3A20px%3Bborder%2Dradius%3A2px%3Bposition%3Afixed%3Bright%3A16px%3Bbackground%2Dcolor%3A%23fff%3Bbox%2Dshadow%3A0%202px%204px%20rgba%280%2C0%2C0%2C%2E12%29%2C0%200%206px%20rgba%280%2C0%2C0%2C%2E04%29%3Btransition%3Aopacity%20%2E3s%2Ctransform%20%2E3s%2Cright%20%2E3s%2Ctop%20%2E4s%3Boverflow%3Ahidden%7D%2Eel%2Dnotification%20%2Eel%2Dicon%2Dcircle%2Dcheck%7Bcolor%3A%2313ce66%7D%2Eel%2Dnotification%20%2Eel%2Dicon%2Dcircle%2Dcross%7Bcolor%3A%23ff4949%7D%2Eel%2Dnotification%20%2Eel%2Dicon%2Dinformation%7Bcolor%3A%2350bfff%7D%2Eel%2Dnotification%20%2Eel%2Dicon%2Dwarning%7Bcolor%3A%23f7ba2a%7D%2Eel%2Dnotification%5F%5Fgroup%7Bmargin%2Dleft%3A0%7D%2Eel%2Dnotification%5F%5Fgroup%20span%7Bfont%2Dsize%3A16px%3Bcolor%3A%231f2d3d%7D%2Eel%2Dnotification%5F%5Fgroup%20p%7Bfont%2Dsize%3A14px%3Bline%2Dheight%3A21px%3Bmargin%3A10px%200%200%3Bcolor%3A%238492a6%3Btext%2Dalign%3Ajustify%7D%2Eel%2Dnotification%5F%5Fgroup%2Eis%2Dwith%2Dicon%7Bmargin%2Dleft%3A55px%7D%2Eel%2Dnotification%5F%5Ficon%7Bwidth%3A40px%3Bheight%3A40px%3Bfont%2Dsize%3A40px%3Bfloat%3Aleft%3Bposition%3Arelative%3Btop%3A3px%7D%2Eel%2Ddialog%5F%5Fheaderbtn%2C%2Eel%2Dpagination%5F%5Frightwrapper%7Bfloat%3Aright%7D%2Eel%2Dnotification%5F%5FcloseBtn%7Btop%3A20px%3Bright%3A20px%3Bposition%3Aabsolute%3Bcursor%3Apointer%3Bcolor%3A%23c0ccda%3Bfont%2Dsize%3A14px%7D%2Eel%2Dnotification%5F%5FcloseBtn%3Ahover%7Bcolor%3A%2399A9BF%7D%2Eel%2Dnotification%2Dfade%2Denter%7B%2Dms%2Dtransform%3AtranslateX%28100%25%29%3Btransform%3AtranslateX%28100%25%29%3Bright%3A0%7D%2Eel%2Dslider%3Aafter%2C%2Eel%2Dslider%3Abefore%7Bdisplay%3Atable%3Bcontent%3A%22%22%7D%2Eel%2Dslider%5F%5Frunway%7Bwidth%3A100%25%3Bheight%3A4px%3Bmargin%3A16px%200%3Bbackground%2Dcolor%3A%23e5e9f2%3Bborder%2Dradius%3A3px%3Bposition%3Arelative%3Bcursor%3Apointer%7D%2Eel%2Dslider%5F%5Frunway%2Eshow%2Dinput%7Bmargin%2Dright%3A160px%3Bwidth%3Aauto%7D%2Eel%2Dslider%5F%5Frunway%2Edisabled%7Bcursor%3Adefault%7D%2Eel%2Dslider%5F%5Frunway%2Edisabled%20%2Eel%2Dslider%5F%5Fbar%2C%2Eel%2Dslider%5F%5Frunway%2Edisabled%20%2Eel%2Dslider%5F%5Fbutton%7Bbackground%2Dcolor%3A%23c0ccda%7D%2Eel%2Dslider%5F%5Frunway%2Edisabled%20%2Eel%2Dslider%5F%5Fbutton%2Dwrapper%2Edragging%2C%2Eel%2Dslider%5F%5Frunway%2Edisabled%20%2Eel%2Dslider%5F%5Fbutton%2Dwrapper%2Ehover%2C%2Eel%2Dslider%5F%5Frunway%2Edisabled%20%2Eel%2Dslider%5F%5Fbutton%2Dwrapper%3Ahover%7Bcursor%3Anot%2Dallowed%7D%2Eel%2Dslider%5F%5Frunway%2Edisabled%20%2Eel%2Dslider%5F%5Fbutton%2Edragging%2C%2Eel%2Dslider%5F%5Frunway%2Edisabled%20%2Eel%2Dslider%5F%5Fbutton%2Ehover%2C%2Eel%2Dslider%5F%5Frunway%2Edisabled%20%2Eel%2Dslider%5F%5Fbutton%3Ahover%7B%2Dms%2Dtransform%3Ascale%281%29%3Btransform%3Ascale%281%29%3Bcursor%3Anot%2Dallowed%7D%2Eel%2Dslider%5F%5Finput%7Bfloat%3Aright%3Bmargin%2Dtop%3A3px%7D%2Eel%2Dslider%5F%5Fbar%7Bheight%3A4px%3Bbackground%2Dcolor%3A%2320a0ff%3Bborder%2Dtop%2Dleft%2Dradius%3A3px%3Bborder%2Dbottom%2Dleft%2Dradius%3A3px%3Bposition%3Aabsolute%7D%2Eel%2Dslider%5F%5Fbutton%2Dwrapper%7Bwidth%3A36px%3Bheight%3A36px%3Bposition%3Aabsolute%3Bz%2Dindex%3A1001%3Btop%3A%2D16px%3B%2Dms%2Dtransform%3AtranslateX%28%2D50%25%29%3Btransform%3AtranslateX%28%2D50%25%29%3Bbackground%2Dcolor%3Atransparent%3Btext%2Dalign%3Acenter%3Buser%2Dselect%3Anone%7D%2Eel%2Dslider%5F%5Fbutton%2Dwrapper%20%2Eel%2Dtooltip%7Bline%2Dheight%3A1%3Bheight%3A100%25%3Bdisplay%3Ablock%7D%2Eel%2Dslider%5F%5Fbutton%2Dwrapper%20%2Eel%2Dtooltip%3A%3Aafter%7Bcontent%3A%27%27%3Bwidth%3A0%3Bheight%3A100%25%3Bdisplay%3Ainline%2Dblock%3Bvertical%2Dalign%3Amiddle%7D%2Eel%2Dslider%5F%5Fbutton%2Dwrapper%2Ehover%2C%2Eel%2Dslider%5F%5Fbutton%2Dwrapper%3Ahover%7Bcursor%3A%2Dwebkit%2Dgrab%3Bcursor%3Agrab%7D%2Eel%2Dslider%5F%5Fbutton%2Dwrapper%2Edragging%7Bcursor%3A%2Dwebkit%2Dgrabbing%3Bcursor%3Agrabbing%7D%2Eel%2Dslider%5F%5Fbutton%7Bwidth%3A12px%3Bheight%3A12px%3Bbackground%2Dcolor%3A%2320a0ff%3Bborder%2Dradius%3A50%25%3Btransition%3A%2E2s%3Buser%2Dselect%3Anone%7D%2Eel%2Dradio%2C%2Eel%2Dradio%2Dbutton%5F%5Finner%2C%2Eel%2Dswitch%5F%5Flabel%7B%2Dwebkit%2Duser%2Dselect%3Anone%3B%2Dmoz%2Duser%2Dselect%3Anone%3B%2Dms%2Duser%2Dselect%3Anone%7D%2Eel%2Dslider%5F%5Fbutton%2Edragging%2C%2Eel%2Dslider%5F%5Fbutton%2Ehover%2C%2Eel%2Dslider%5F%5Fbutton%3Ahover%7B%2Dms%2Dtransform%3Ascale%281%2E5%29%3Btransform%3Ascale%281%2E5%29%3Bbackground%2Dcolor%3A%231d8ce0%7D%2Eel%2Dslider%5F%5Fbutton%2Ehover%2C%2Eel%2Dslider%5F%5Fbutton%3Ahover%7Bcursor%3A%2Dwebkit%2Dgrab%3Bcursor%3Agrab%7D%2Eel%2Dslider%5F%5Fbutton%2Edragging%7Bcursor%3A%2Dwebkit%2Dgrabbing%3Bcursor%3Agrabbing%7D%2Eel%2Dslider%5F%5Fstop%7Bposition%3Aabsolute%3Bwidth%3A4px%3Bheight%3A4px%3Bborder%2Dradius%3A100%25%3Bbackground%2Dcolor%3A%23c0ccda%3B%2Dms%2Dtransform%3AtranslateX%28%2D50%25%29%3Btransform%3AtranslateX%28%2D50%25%29%7D%2Eel%2Dradio%2C%2Eel%2Dradio%5F%5Finner%2C%2Eel%2Dradio%5F%5Finput%7Bposition%3Arelative%3Bcursor%3Apointer%3Bdisplay%3Ainline%2Dblock%7D%2Eel%2Dradio%7Bcolor%3A%231f2d3d%7D%2Eel%2Dradio%2B%2Eel%2Dradio%7Bmargin%2Dleft%3A15px%7D%2Eel%2Dradio%5F%5Finput%7Boutline%3A0%3Bline%2Dheight%3A1%7D%2Eel%2Dradio%5F%5Finner%7Bborder%3A1px%20solid%20%23c0ccda%3Bwidth%3A18px%3Bheight%3A18px%3Bborder%2Dradius%3A50%25%3Bbackground%2Dcolor%3A%23fff%7D%2Eel%2Dradio%5F%5Finner%3Anot%28%2Eis%2Ddisabled%29%3Ahover%7Bborder%2Dcolor%3A%2320a0ff%7D%2Eel%2Dradio%5F%5Finner%3A%3Aafter%7Bwidth%3A6px%3Bheight%3A6px%3Bborder%2Dradius%3A50%25%3Bbackground%2Dcolor%3A%23fff%3Bcontent%3A%22%22%3Bposition%3Aabsolute%3Bleft%3A50%25%3Btop%3A50%25%3B%2Dms%2Dtransform%3Atranslate%28%2D50%25%2C%2D50%25%29%20scale%280%29%3Btransform%3Atranslate%28%2D50%25%2C%2D50%25%29%20scale%280%29%3Btransition%3Atransform%20%2E15s%20cubic%2Dbezier%28%2E71%2C%2D%2E46%2C%2E88%2C%2E6%29%7D%2Eel%2Dswitch%5F%5Fcore%2C%2Eel%2Dswitch%5F%5Flabel%7Bwidth%3A46px%3Bheight%3A22px%3Bcursor%3Apointer%7D%2Eel%2Dradio%5F%5Finner%2Eis%2Ddisabled%2Eis%2Dchecked%7Bbackground%2Dcolor%3A%23D3DCE6%3Bborder%2Dcolor%3A%23D3DCE6%7D%2Eel%2Dradio%5F%5Finner%2Eis%2Ddisabled%2Eis%2Dchecked%3A%3Aafter%7Bbackground%2Dcolor%3A%23fff%7D%2Eel%2Dradio%5F%5Finner%2Eis%2Dfocus%7Bborder%2Dcolor%3A%2320a0ff%7D%2Eel%2Dradio%5F%5Finner%2Eis%2Dchecked%7Bborder%2Dcolor%3A%2320a0ff%3Bbackground%3A%2320a0ff%7D%2Eel%2Dradio%5F%5Finner%2Eis%2Ddisabled%2C%2Eel%2Dradio%5F%5Finner%2Eis%2Ddisabled%3A%3Aafter%7Bbackground%2Dcolor%3A%23EFF2F7%3Bcursor%3Anot%2Dallowed%7D%2Eel%2Dradio%5F%5Finner%2Eis%2Dchecked%3A%3Aafter%7B%2Dms%2Dtransform%3Atranslate%28%2D50%25%2C%2D50%25%29%20scale%281%29%3Btransform%3Atranslate%28%2D50%25%2C%2D50%25%29%20scale%281%29%7D%2Eel%2Dradio%5F%5Finner%2Eis%2Ddisabled%7Bborder%2Dcolor%3A%23D3DCE6%7D%2Eel%2Dradio%5F%5Finner%2Eis%2Ddisabled%2B%2Eel%2Dradio%5F%5Flabel%7Bcursor%3Anot%2Dallowed%7D%2Eel%2Dradio%5F%5Foriginal%7Boutline%3A0%3Bposition%3Aabsolute%3Bz%2Dindex%3A%2D1%3Btop%3A0%3Bleft%3A0%3Bright%3A0%3Bbottom%3A0%3Bmargin%3A0%7D%2Eel%2Dbutton%2Dgroup%20%2Eel%2Dbutton%3Anot%28%3Alast%2Dchild%29%2C%2Eel%2Dradio%2Dbutton%3Anot%28%3Alast%2Dchild%29%7Bmargin%2Dright%3A%2D1px%7D%2Eel%2Dradio%5F%5Flabel%7Bfont%2Dsize%3A14px%3Bpadding%2Dleft%3A5px%7D%2Eel%2Dradio%2Dgroup%7Bdisplay%3Ainline%2Dblock%3Bfont%2Dsize%3A0%3Bline%2Dheight%3A1%7D%2Eel%2Dradio%2Dgroup%20%2Eel%2Dradio%7Bfont%2Dsize%3A14px%7D%2Eel%2Dradio%2Dbutton%7Bposition%3Arelative%3Boverflow%3Ahidden%3Bdisplay%3Ainline%2Dblock%7D%2Eel%2Dradio%2Dbutton%3Afirst%2Dchild%20%2Eel%2Dradio%2Dbutton%5F%5Finner%7Bborder%2Dradius%3A4px%200%200%204px%7D%2Eel%2Dradio%2Dbutton%3Alast%2Dchild%20%2Eel%2Dradio%2Dbutton%5F%5Finner%7Bborder%2Dradius%3A0%204px%204px%200%7D%2Eel%2Dradio%2Dbutton%5F%5Finner%7Bdisplay%3Ainline%2Dblock%3Bline%2Dheight%3A1%3Bwhite%2Dspace%3Anowrap%3Bbackground%3A%23fff%3Bborder%3A1px%20solid%20%23c0ccda%3Bcolor%3A%231F2D3D%3B%2Dwebkit%2Dappearance%3Anone%3Btext%2Dalign%3Acenter%3Bbox%2Dsizing%3Aborder%2Dbox%3Boutline%3A0%3Bmargin%3A0%3Bposition%3Arelative%3Bcursor%3Apointer%3Btransition%3Aall%20%2E3s%20cubic%2Dbezier%28%2E645%2C%2E045%2C%2E355%2C1%29%3Bpadding%3A10px%2015px%3Bfont%2Dsize%3A14px%3Bborder%2Dradius%3A0%7D%2Eel%2Dradio%2Dbutton%5F%5Finner%3Ahover%7Bcolor%3A%2320a0ff%7D%2Eel%2Dradio%2Dbutton%5F%5Finner%20%5Bclass%2A%3Del%2Dicon%2D%5D%7Bline%2Dheight%3A%2E9%7D%2Eel%2Dradio%2Dbutton%5F%5Finner%20%5Bclass%2A%3Del%2Dicon%2D%5D%2Bspan%7Bmargin%2Dleft%3A5px%7D%2Eel%2Dradio%2Dbutton%5F%5Forig%2Dradio%7Bopacity%3A0%3Boutline%3A0%3Bposition%3Aabsolute%3Bz%2Dindex%3A%2D1%3Bleft%3A%2D999px%7D%2Eel%2Dradio%2Dbutton%5F%5Forig%2Dradio%3Adisabled%2B%2Eel%2Dradio%2Dbutton%5F%5Finner%7Bcolor%3A%23c0ccda%3Bcursor%3Anot%2Dallowed%3Bbackground%2Dimage%3Anone%3Bbackground%2Dcolor%3A%23EFF2F7%3Bborder%2Dcolor%3A%23D3DCE6%7D%2Eel%2Dradio%2Dbutton%2D%2Dlarge%20%2Eel%2Dradio%2Dbutton%5F%5Finner%7Bpadding%3A11px%2019px%3Bfont%2Dsize%3A16px%3Bborder%2Dradius%3A0%7D%2Eel%2Dradio%2Dbutton%2D%2Dsmall%20%2Eel%2Dradio%2Dbutton%5F%5Finner%7Bpadding%3A7px%209px%3Bfont%2Dsize%3A12px%3Bborder%2Dradius%3A0%7D%2Eel%2Dradio%2Dbutton%2D%2Dmini%20%2Eel%2Dradio%2Dbutton%5F%5Finner%7Bpadding%3A4px%3Bfont%2Dsize%3A12px%3Bborder%2Dradius%3A0%7D%2Eel%2Dswitch%7Bdisplay%3Ainline%2Dblock%3Bposition%3Arelative%3Bfont%2Dsize%3A14px%3Bline%2Dheight%3A22px%7D%2Eel%2Dswitch%5F%5Flabel%2C%2Eel%2Dswitch%5F%5Flabel%20%2A%7Bposition%3Aabsolute%3Bdisplay%3Ainline%2Dblock%3Bfont%2Dsize%3A14px%7D%2Eel%2Dswitch%2Eis%2Ddisabled%20%2Eel%2Dswitch%5F%5Fcore%7Bborder%2Dcolor%3A%23E5E9F3%21important%3Bbackground%3A%23E5E9F3%21important%7D%2Eel%2Dswitch%2Eis%2Ddisabled%20%2Eel%2Dswitch%5F%5Fcore%20span%7Bbackground%2Dcolor%3A%23F9FAFC%21important%7D%2Eel%2Dswitch%2Eis%2Ddisabled%20%2Eel%2Dswitch%5F%5Fcore%7E%2Eel%2Dswitch%5F%5Flabel%20%2A%7Bcolor%3A%23F9FAFC%21important%7D%2Eel%2Dswitch%2Eis%2Ddisabled%20%2Eel%2Dswitch%5F%5Finput%3Achecked%2B%2Eel%2Dswitch%5F%5Fcore%7Bborder%2Dcolor%3A%23E5E9F3%3Bbackground%2Dcolor%3A%23E5E9F3%7D%2Eel%2Dswitch%2Eis%2Ddisabled%20%2Eel%2Dswitch%5F%5Fcore%2C%2Eel%2Dswitch%2Eis%2Ddisabled%20%2Eel%2Dswitch%5F%5Flabel%7Bcursor%3Anot%2Dallowed%7D%2Eel%2Dswitch%5F%5Flabel%7Btransition%3A%2E2s%3Bz%2Dindex%3A10%3Bleft%3A0%3Btop%3A0%3Buser%2Dselect%3Anone%7D%2Eel%2Dcheckbox%2C%2Eel%2Dpager%7B%2Dwebkit%2Duser%2Dselect%3Anone%3B%2Dmoz%2Duser%2Dselect%3Anone%3B%2Dms%2Duser%2Dselect%3Anone%7D%2Eel%2Dswitch%5F%5Flabel%20%2A%7Bline%2Dheight%3A1%3Btop%3A4px%3Bcolor%3A%23fff%7D%2Eel%2Dswitch%5F%5Flabel%2D%2Dleft%20i%7Bleft%3A6px%7D%2Eel%2Dswitch%5F%5Flabel%2D%2Dright%20i%7Bright%3A6px%7D%2Eel%2Dswitch%5F%5Finput%7Bdisplay%3Anone%7D%2Eel%2Dswitch%5F%5Finput%3Achecked%2B%2Eel%2Dswitch%5F%5Fcore%7Bborder%2Dcolor%3A%2320a0ff%3Bbackground%2Dcolor%3A%2320a0ff%7D%2Eel%2Dswitch%5F%5Fcore%7Bmargin%3A0%3Bdisplay%3Ainline%2Dblock%3Bposition%3Arelative%3Bborder%3A1px%20solid%20%23c0ccda%3Boutline%3A0%3Bborder%2Dradius%3A12px%3Bbackground%3A%23c0ccda%3Btransition%3Aborder%2Dcolor%20%2E3s%2Cbackground%2Dcolor%20%2E3s%7D%2Eel%2Dswitch%5F%5Fcore%20%2Eel%2Dswitch%5F%5Fbutton%7Btop%3A0%3Bleft%3A0%3Bposition%3Aabsolute%3Bborder%2Dradius%3A100%25%3Btransition%3Atransform%20%2E3s%3Bwidth%3A16px%3Bheight%3A16px%3Bz%2Dindex%3A20%3Bbackground%2Dcolor%3A%23fff%7D%2Eel%2Dswitch%2D%2Dwide%20%2Eel%2Dswitch%5F%5Flabel%2Eel%2Dswitch%5F%5Flabel%2D%2Dleft%20span%7Bleft%3A10px%7D%2Eel%2Dswitch%2D%2Dwide%20%2Eel%2Dswitch%5F%5Flabel%2Eel%2Dswitch%5F%5Flabel%2D%2Dright%20span%7Bright%3A10px%7D%2Eel%2Ddropdown%7Bdisplay%3Ainline%2Dblock%3Bposition%3Arelative%3Bcolor%3A%23475669%3Bfont%2Dsize%3A14px%7D%2Eel%2Ddropdown%20%2Eel%2Dbutton%2Dgroup%2C%2Eel%2Dtable%20%2Eel%2Dtooltip%2C%2Eel%2Dtable%20%2Eel%2Dtooltip%5F%5Frel%7Bdisplay%3Ablock%7D%2Eel%2Ddropdown%20%2Eel%2Ddropdown%5F%5Fcaret%2Dbutton%7Bpadding%2Dright%3A5px%3Bpadding%2Dleft%3A5px%7D%2Eel%2Ddropdown%20%2Eel%2Ddropdown%5F%5Fcaret%2Dbutton%20%2Eel%2Ddropdown%5F%5Ficon%7Bpadding%2Dleft%3A0%7D%2Eel%2Ddropdown%5F%5Ficon%7Bfont%2Dsize%3A12px%3Bmargin%3A0%203px%7D%2Eel%2Ddropdown%2Dmenu%7Bmargin%3A5px%200%3Bbackground%2Dcolor%3A%23fff%3Bborder%3A1px%20solid%20%23D3DCE6%3Bbox%2Dshadow%3A0%202px%204px%20rgba%280%2C0%2C0%2C%2E12%29%2C0%200%206px%20rgba%280%2C0%2C0%2C%2E12%29%3Bpadding%3A6px%200%3Bz%2Dindex%3A10%3Bposition%3Aabsolute%3Btop%3A0%3Bleft%3A0%3Bmin%2Dwidth%3A100px%7D%2Eel%2Ddropdown%2Dmenu%5F%5Fitem%7Blist%2Dstyle%3Anone%3Bline%2Dheight%3A36px%3Bpadding%3A0%2010px%3Bmargin%3A0%3Bcursor%3Apointer%7D%2Eel%2Ddropdown%2Dmenu%5F%5Fitem%3Anot%28%2Eis%2Ddisabled%29%3Ahover%7Bbackground%2Dcolor%3A%23e5e9f2%3Bcolor%3A%23475669%7D%2Eel%2Ddropdown%2Dmenu%5F%5Fitem%2Eis%2Ddisabled%7Bcursor%3Adefault%3Bcolor%3A%23c0ccda%3Bpointer%2Devents%3Anone%7D%2Eel%2Ddropdown%2Dmenu%5F%5Fitem%2D%2Ddivided%7Bposition%3Arelative%3Bmargin%2Dtop%3A6px%3Bborder%2Dtop%3A1px%20solid%20%23D3DCE6%7D%2Eel%2Ddropdown%2Dmenu%5F%5Fitem%2D%2Ddivided%3Abefore%7Bcontent%3A%27%27%3Bheight%3A6px%3Bdisplay%3Ablock%3Bmargin%3A0%20%2D10px%3Bbackground%2Dcolor%3A%23fff%7D%2Eel%2Dloading%2Dmask%7Bposition%3Aabsolute%3Bz%2Dindex%3A10000%3Bbackground%2Dcolor%3Argba%28255%2C255%2C255%2C%2E9%29%3Bmargin%3A0%3Btop%3A0%3Bright%3A0%3Bbottom%3A0%3Bleft%3A0%7D%2Eel%2Dloading%2Dmask%2Eis%2Dfullscreen%7Bposition%3Afixed%7D%2Eel%2Dloading%2Dmask%2Eis%2Dfullscreen%20%2Eel%2Dloading%2Dspinner%7Bmargin%2Dtop%3A%2D25px%7D%2Eel%2Dloading%2Dmask%2Eis%2Dfullscreen%20%2Eel%2Dloading%2Dspinner%20%2Ecircular%7Bwidth%3A50px%7D%2Eel%2Dloading%2Dspinner%7Btop%3A50%25%3Bmargin%2Dtop%3A%2D21px%3Bwidth%3A100%25%3Btext%2Dalign%3Acenter%3Bposition%3Aabsolute%7D%2Eel%2Dloading%2Dspinner%20%2Eel%2Dloading%2Dtext%7Bcolor%3A%2320a0ff%3Bmargin%3A3px%200%3Bfont%2Dsize%3A14px%7D%2Eel%2Dloading%2Dspinner%20%2Ecircular%7Bwidth%3A42px%3Banimation%3Arotate%202s%20linear%20infinite%7D%2Eel%2Dloading%2Dspinner%20%2Epath%7Banimation%3Adash%201%2E5s%20ease%2Din%2Dout%20infinite%3Bstroke%2Ddasharray%3A1%2C100%3Bstroke%2Ddashoffset%3A0%3Bstroke%2Dwidth%3A2%3Bstroke%3A%2320a0ff%3Bstroke%2Dlinecap%3Around%7D%2Eel%2Ddialog%2C%2Eel%2Dmessage%7B%2Dms%2Dtransform%3AtranslateX%28%2D50%25%29%7D%40keyframes%20dash%7B0%25%7Bstroke%2Ddasharray%3A1%2C100%3Bstroke%2Ddashoffset%3A0%7D50%25%7Bstroke%2Ddasharray%3A45%2C100%3Bstroke%2Ddashoffset%3A%2D35px%7D100%25%7Bstroke%2Ddasharray%3A45%2C100%3Bstroke%2Ddashoffset%3A%2D124px%7D%7D%2Eel%2Ddialog%7Bposition%3Aabsolute%3Bleft%3A50%25%3Btransform%3AtranslateX%28%2D50%25%29%3Bbackground%3A%23fff%3Bborder%2Dradius%3A2px%3Bbox%2Dshadow%3A0%201px%203px%20rgba%280%2C0%2C0%2C%2E3%29%7D%2Eel%2Ddialog%2D%2Dtiny%7Bwidth%3A30%25%7D%2Eel%2Ddialog%2D%2Dsmall%7Bwidth%3A50%25%7D%2Eel%2Ddialog%2D%2Dlarge%7Bwidth%3A90%25%7D%2Eel%2Ddialog%2D%2Dfull%7Bwidth%3A100%25%3Btop%3A0%3Bheight%3A100%25%3Boverflow%3Aauto%7D%2Eel%2Ddialog%5F%5Fwrapper%7Btop%3A0%3Bright%3A0%3Bbottom%3A0%3Bleft%3A0%3Bposition%3Afixed%3Boverflow%3Aauto%3Bmargin%3A0%7D%2Eel%2Dtable%2C%2Eel%2Dtable%20td%2C%2Eel%2Dtable%20th%7Bbox%2Dsizing%3Aborder%2Dbox%3Bposition%3Arelative%7D%2Eel%2Ddialog%5F%5Fheader%7Bpadding%3A20px%2020px%200%7D%2Eel%2Ddialog%5F%5Fclose%7Bcursor%3Apointer%3Bcolor%3A%23c0ccda%7D%2Eel%2Ddialog%5F%5Fclose%3Ahover%7Bcolor%3A%2320a0ff%7D%2Eel%2Ddialog%5F%5Ftitle%7Bline%2Dheight%3A1%3Bfont%2Dsize%3A16px%3Bfont%2Dweight%3A700%3Bcolor%3A%231f2d3d%7D%2Eel%2Ddialog%5F%5Fbody%7Bpadding%3A30px%2020px%3Bcolor%3A%23475669%3Bfont%2Dsize%3A14px%7D%2Eel%2Ddialog%5F%5Ffooter%7Bpadding%3A10px%2020px%2015px%3Btext%2Dalign%3Aright%3Bbox%2Dsizing%3Aborder%2Dbox%7D%2Edialog%2Dfade%2Denter%2Dactive%7Banimation%3Adialog%2Dfade%2Din%20%2E3s%7D%2Edialog%2Dfade%2Dleave%2Dactive%7Banimation%3Adialog%2Dfade%2Dout%20%2E3s%7D%40keyframes%20dialog%2Dfade%2Din%7B0%25%7Btransform%3Atranslate3d%280%2C%2D20px%2C0%29%3Bopacity%3A0%7D100%25%7Btransform%3Atranslate3d%280%2C0%2C0%29%3Bopacity%3A1%7D%7D%40keyframes%20dialog%2Dfade%2Dout%7B0%25%7Btransform%3Atranslate3d%280%2C0%2C0%29%3Bopacity%3A1%7D100%25%7Btransform%3Atranslate3d%280%2C%2D20px%2C0%29%3Bopacity%3A0%7D%7D%2Eel%2Dtable%7Boverflow%3Ahidden%3Bwidth%3A100%25%3Bmax%2Dwidth%3A100%25%3Bbackground%2Dcolor%3A%23fff%3Bborder%3A1px%20solid%20%23e0e6ed%3Bfont%2Dsize%3A14px%3Bcolor%3A%231f2d3d%7D%2Eel%2Dtable%20td%2C%2Eel%2Dtable%20th%7Bheight%3A40px%3Bmin%2Dwidth%3A0%3Btext%2Doverflow%3Aellipsis%7D%2Eel%2Dtable%3A%3Aafter%2C%2Eel%2Dtable%3A%3Abefore%7Bcontent%3A%27%27%3Bposition%3Aabsolute%3Bbackground%2Dcolor%3A%23e0e6ed%3Bz%2Dindex%3A1%7D%2Eel%2Dtable%20td%2Eis%2Dright%2C%2Eel%2Dtable%20th%2Eis%2Dright%7Btext%2Dalign%3Aright%7D%2Eel%2Dtable%20td%2Eis%2Dleft%2C%2Eel%2Dtable%20th%2Eis%2Dleft%7Btext%2Dalign%3Aleft%7D%2Eel%2Dtable%20td%2Eis%2Dcenter%2C%2Eel%2Dtable%20th%2Eis%2Dcenter%7Btext%2Dalign%3Acenter%7D%2Eel%2Dtable%20td%2C%2Eel%2Dtable%20th%2Eis%2Dleaf%7Bborder%2Dbottom%3A1px%20solid%20%23e0e6ed%7D%2Eel%2Dtable%20td%2Egutter%2C%2Eel%2Dtable%20th%2Egutter%7Bwidth%3A15px%3Bborder%2Dright%2Dwidth%3A0%3Bborder%2Dbottom%2Dwidth%3A0%3Bpadding%3A0%7D%2Eel%2Dtable%20%2Ecell%2C%2Eel%2Dtable%20th%3Ediv%7Bpadding%2Dleft%3A18px%3Bpadding%2Dright%3A18px%3Bbox%2Dsizing%3Aborder%2Dbox%3Btext%2Doverflow%3Aellipsis%7D%2Eel%2Dtable%3A%3Abefore%7Bleft%3A0%3Bbottom%3A0%3Bwidth%3A100%25%3Bheight%3A1px%7D%2Eel%2Dtable%3A%3Aafter%7Btop%3A0%3Bright%3A0%3Bwidth%3A1px%3Bheight%3A100%25%7D%2Eel%2Dtable%20%2Ecaret%2Dwrapper%2C%2Eel%2Dtable%20th%3E%2Ecell%7Bposition%3Arelative%3Bdisplay%3Ainline%2Dblock%3Bvertical%2Dalign%3Amiddle%7D%2Eel%2Dtable%20th%7Boverflow%3Ahidden%3Bbackground%2Dcolor%3A%23EFF2F7%3Btext%2Dalign%3Aleft%7D%2Eel%2Dtable%20th%3Ediv%7Bdisplay%3Ainline%2Dblock%3Bline%2Dheight%3A40px%3Boverflow%3Ahidden%7D%2Eel%2Dtable%20td%3Ediv%7Bbox%2Dsizing%3Aborder%2Dbox%7D%2Eel%2Dtable%20th%2Erequired%3Ediv%3A%3Abefore%7Bdisplay%3Ainline%2Dblock%3Bcontent%3A%22%22%3Bwidth%3A8px%3Bheight%3A8px%3Bborder%2Dradius%3A50%25%3Bbackground%3A%23ff4d51%3Bmargin%2Dright%3A5px%3Bvertical%2Dalign%3Amiddle%7D%2Eel%2Dtable%20th%3E%2Ecell%7Bword%2Dwrap%3Anormal%3Btext%2Doverflow%3Aellipsis%3Bline%2Dheight%3A20px%3Bwidth%3A100%25%3Bbox%2Dsizing%3Aborder%2Dbox%7D%2Eel%2Dtable%20th%3E%2Ecell%2Ehighlight%7Bcolor%3A%2320a0ff%7D%2Eel%2Dtable%20%2Ecaret%2Dwrapper%7Bcursor%3Apointer%3Bmargin%2Dleft%3A5px%3Bmargin%2Dtop%3A%2D2px%3Bwidth%3A16px%3Bheight%3A34px%3Boverflow%3Avisible%3Boverflow%3Ainitial%7D%2Eel%2Dtable%20%2Ecell%2C%2Eel%2Dtable%5F%5Fheader%2Dwrapper%7Boverflow%3Ahidden%7D%2Eel%2Dtable%20%2Esort%2Dcaret%7Bdisplay%3Ainline%2Dblock%3Bwidth%3A0%3Bheight%3A0%3Bborder%3A0%3Bcontent%3A%22%22%3Bposition%3Aabsolute%3Bleft%3A3px%3Bz%2Dindex%3A2%7D%2Eel%2Dtable%20%2Esort%2Dcaret%2Eascending%2C%2Eel%2Dtable%20%2Esort%2Dcaret%2Edescending%7Bborder%2Dright%3A5px%20solid%20transparent%3Bborder%2Dleft%3A5px%20solid%20transparent%7D%2Eel%2Dtable%20%2Esort%2Dcaret%2Eascending%7Btop%3A11px%3Bborder%2Dtop%3Anone%3Bborder%2Dbottom%3A5px%20solid%20%2399a9bf%7D%2Eel%2Dtable%20%2Esort%2Dcaret%2Edescending%7Bbottom%3A11px%3Bborder%2Dtop%3A5px%20solid%20%2399a9bf%3Bborder%2Dbottom%3Anone%7D%2Eel%2Dtable%20%2Eascending%20%2Esort%2Dcaret%2Eascending%7Bborder%2Dbottom%2Dcolor%3A%23475669%7D%2Eel%2Dtable%20%2Edescending%20%2Esort%2Dcaret%2Edescending%7Bborder%2Dtop%2Dcolor%3A%23475669%7D%2Eel%2Dtable%20td%2Egutter%7Bwidth%3A0%7D%2Eel%2Dtable%20%2Ecell%7Bwhite%2Dspace%3Anormal%3Bword%2Dbreak%3Abreak%2Dall%3Bline%2Dheight%3A24px%7D%2Eel%2Dtable%20tr%20input%5Btype%3Dcheckbox%5D%7Bmargin%3A0%7D%2Eel%2Dtable%20tr%7Bbackground%2Dcolor%3A%23fff%7D%2Eel%2Dtable%20%2Ehidden%2Dcolumns%7Bvisibility%3Ahidden%3Bposition%3Aabsolute%3Bz%2Dindex%3A%2D1%7D%2Eel%2Dtable%5F%5Fempty%2Dblock%7Bposition%3Arelative%3Bmin%2Dheight%3A60px%3Btext%2Dalign%3Acenter%3Bwidth%3A100%25%3Bheight%3A100%25%7D%2Eel%2Dtable%5F%5Fempty%2Dtext%7Bposition%3Aabsolute%3Bleft%3A50%25%3Btop%3A50%25%3B%2Dms%2Dtransform%3Atranslate%28%2D50%25%2C%2D50%25%29%3Btransform%3Atranslate%28%2D50%25%2C%2D50%25%29%3Bcolor%3A%235e6d82%7D%2Eel%2Dtable%5F%5Ffixed%2Dheader%2Dwrapper%20thead%20div%2C%2Eel%2Dtable%5F%5Fheader%2Dwrapper%20thead%20div%7Bcolor%3A%231f2d3d%3Bbackground%2Dcolor%3A%23EFF2F7%7D%2Eel%2Dtable%2D%2Dfit%7Bborder%2Dright%3A0%3Bborder%2Dbottom%3A0%7D%2Eel%2Dtable%2D%2Dborder%20th%2C%2Eel%2Dtable%5F%5Ffixed%2Dright%2Dpatch%7Bborder%2Dbottom%3A1px%20solid%20%23e0e6ed%7D%2Eel%2Dtable%2D%2Dfit%20td%2Egutter%2C%2Eel%2Dtable%2D%2Dfit%20th%2Egutter%7Bborder%2Dright%2Dwidth%3A1px%7D%2Eel%2Dtable%2D%2Dborder%20td%2C%2Eel%2Dtable%2D%2Dborder%20th%7Bborder%2Dright%3A1px%20solid%20%23e0e6ed%7D%2Eel%2Dtable%5F%5Ffixed%2C%2Eel%2Dtable%5F%5Ffixed%2Dright%7Bposition%3Aabsolute%3Btop%3A0%3Bleft%3A0%3Bbox%2Dshadow%3A1px%200%208px%20%23d3d4d6%3Boverflow%2Dx%3Ahidden%7D%2Eel%2Dtable%5F%5Ffixed%2Dright%3A%3Abefore%2C%2Eel%2Dtable%5F%5Ffixed%3A%3Abefore%7Bcontent%3A%27%27%3Bposition%3Aabsolute%3Bleft%3A0%3Bbottom%3A0%3Bwidth%3A100%25%3Bheight%3A1px%3Bbackground%2Dcolor%3A%23e0e6ed%3Bz%2Dindex%3A4%7D%2Eel%2Dtable%5F%5Ffixed%2Dright%2Dpatch%7Bposition%3Aabsolute%3Btop%3A%2D1px%3Bright%3A0%3Bbackground%2Dcolor%3A%23EFF2F7%7D%2Eel%2Dtable%5F%5Ffixed%2Dright%7Btop%3A0%3Bleft%3Aauto%3Bright%3A0%3Bbox%2Dshadow%3A%2D1px%200%208px%20%23d3d4d6%7D%2Eel%2Dtable%5F%5Ffixed%2Dright%20%2Eel%2Dtable%5F%5Ffixed%2Dbody%2Dwrapper%2C%2Eel%2Dtable%5F%5Ffixed%2Dright%20%2Eel%2Dtable%5F%5Ffixed%2Dheader%2Dwrapper%7Bleft%3Aauto%3Bright%3A0%7D%2Eel%2Dtable%5F%5Ffixed%2Dheader%2Dwrapper%7Bposition%3Aabsolute%3Bleft%3A0%3Btop%3A0%3Bz%2Dindex%3A3%7D%2Eel%2Dtable%5F%5Ffixed%2Dbody%2Dwrapper%7Bposition%3Aabsolute%3Bleft%3A0%3Btop%3A37px%3Boverflow%3Ahidden%3Bz%2Dindex%3A3%7D%2Eel%2Dtable%5F%5Fbody%2Dwrapper%2C%2Eel%2Dtable%5F%5Fheader%2Dwrapper%7Bwidth%3A100%25%7D%2Eel%2Dtable%5F%5Fbody%2C%2Eel%2Dtable%5F%5Fheader%7Btable%2Dlayout%3Afixed%7D%2Eel%2Dtable%5F%5Fbody%2Dwrapper%7Boverflow%3Aauto%3Bposition%3Arelative%7D%2Eel%2Dtable%2D%2Dstriped%20%2Eel%2Dtable%5F%5Fbody%20tr%3Anth%2Dchild%282n%29%20td%7Bbackground%3A%23FAFAFA%7D%2Eel%2Dtable%2D%2Dstriped%20%2Eel%2Dtable%5F%5Fbody%20tr%3Anth%2Dchild%282n%29%2Ecurrent%2Drow%20td%7Bbackground%3A%23EFF7FF%7D%2Eel%2Dtable%5F%5Fbody%20tr%2Ehover%2Drow%3Etd%7Bbackground%2Dcolor%3A%23eff2f7%7D%2Eel%2Dtable%5F%5Fbody%20tr%2Ecurrent%2Drow%3Etd%7Bbackground%3A%23eff7ff%7D%2Eel%2Dtable%5F%5Fcolumn%2Dresize%2Dproxy%7Bposition%3Aabsolute%3Bleft%3A200px%3Btop%3A0%3Bbottom%3A0%3Bwidth%3A0%3Bborder%2Dleft%3A1px%20solid%20%23e0e6ed%3Bz%2Dindex%3A10%7D%2Eel%2Dcheckbox%2C%2Eel%2Dcheckbox%5F%5Finner%2C%2Eel%2Dcheckbox%5F%5Finput%7Bdisplay%3Ainline%2Dblock%3Bposition%3Arelative%7D%2Eel%2Dtable%5F%5Fcolumn%2Dfilter%2Dtrigger%7Bdisplay%3Ainline%2Dblock%3Bline%2Dheight%3A34px%3Bmargin%2Dleft%3A5px%3Bcursor%3Apointer%7D%2Eel%2Dtable%5F%5Fcolumn%2Dfilter%2Dtrigger%20i%7Bcolor%3A%2399a9bf%7D%2Eel%2Dtable%2D%2Denable%2Drow%2Dtransition%20%2Eel%2Dtable%5F%5Fbody%20td%7Btransition%3Abackground%2Dcolor%20%2E25s%20ease%7D%2Eel%2Dtable%2D%2Denable%2Drow%2Dhover%20tr%3Ahover%3Etd%7Bbackground%2Dcolor%3A%23eff2f7%7D%2Eel%2Dtable%2D%2Dfluid%2Dheight%20%2Eel%2Dtable%5F%5Ffixed%2C%2Eel%2Dtable%2D%2Dfluid%2Dheight%20%2Eel%2Dtable%5F%5Ffixed%2Dright%7Bbottom%3A0%3Boverflow%3Ahidden%7D%2Eel%2Dcheckbox%7Bcolor%3A%231f2d3d%3Bcursor%3Apointer%3Bwhite%2Dspace%3Anowrap%7D%2Eel%2Dcheckbox%2B%2Eel%2Dcheckbox%7Bmargin%2Dleft%3A15px%7D%2Eel%2Dcheckbox%5F%5Finput%7Bwhite%2Dspace%3Anowrap%3Bcursor%3Apointer%3Boutline%3A0%3Bline%2Dheight%3A1%3Bvertical%2Dalign%3Amiddle%7D%2Eel%2Dcheckbox%5F%5Finner%7Bborder%3A1px%20solid%20%23c0ccda%3Bborder%2Dradius%3A4px%3Bbox%2Dsizing%3Aborder%2Dbox%3Bwidth%3A18px%3Bheight%3A18px%3Bbackground%2Dcolor%3A%23fff%3Bz%2Dindex%3A1%3Btransition%3Aborder%2Dcolor%20%2E25s%20cubic%2Dbezier%28%2E71%2C%2D%2E46%2C%2E29%2C1%2E46%29%2Cbackground%2Dcolor%20%2E25s%20cubic%2Dbezier%28%2E71%2C%2D%2E46%2C%2E29%2C1%2E46%29%7D%2Eel%2Dcheckbox%5F%5Finner%3Anot%28%2Eis%2Ddisabled%29%3Ahover%7Bborder%2Dcolor%3A%2320a0ff%7D%2Eel%2Dcheckbox%5F%5Finner%3A%3Aafter%7Bbox%2Dsizing%3Acontent%2Dbox%3Bcontent%3A%22%22%3Bborder%3A2px%20solid%20%23fff%3Bborder%2Dleft%3A0%3Bborder%2Dtop%3A0%3Bheight%3A8px%3Bleft%3A5px%3Bposition%3Aabsolute%3Btop%3A1px%3B%2Dms%2Dtransform%3Arotate%2845deg%29%20scaleY%280%29%3Btransform%3Arotate%2845deg%29%20scaleY%280%29%3Bwidth%3A4px%3Btransition%3Atransform%20%2E15s%20cubic%2Dbezier%28%2E71%2C%2D%2E46%2C%2E88%2C%2E6%29%20%2E05s%3B%2Dms%2Dtransform%2Dorigin%3Acenter%3Btransform%2Dorigin%3Acenter%7D%2Eel%2Dcheckbox%5F%5Finner%2Eis%2Ddisabled%2Eis%2Dchecked%7Bbackground%2Dcolor%3A%23D3DCE6%3Bborder%2Dcolor%3A%23D3DCE6%7D%2Eel%2Dcheckbox%5F%5Finner%2Eis%2Ddisabled%2Eis%2Dchecked%3A%3Aafter%7Bborder%2Dcolor%3A%23fff%7D%2Eel%2Dcheckbox%5F%5Finner%2Eis%2Ddisabled%2Eis%2Dindeterminate%7Bbackground%2Dcolor%3A%23D3DCE6%3Bborder%2Dcolor%3A%23D3DCE6%7D%2Eel%2Dcheckbox%5F%5Finner%2Eis%2Ddisabled%2Eis%2Dindeterminate%3A%3Abefore%7Bborder%2Dcolor%3A%23fff%7D%2Eel%2Dcheckbox%5F%5Finner%2Eis%2Dindeterminate%7Bbackground%2Dcolor%3A%2320a0ff%3Bborder%2Dcolor%3A%232e90fe%7D%2Eel%2Dcheckbox%5F%5Finner%2Eis%2Dindeterminate%3A%3Abefore%7Bcontent%3A%27%27%3Bposition%3Aabsolute%3Bdisplay%3Ablock%3Bborder%3A1px%20solid%20%23fff%3Bmargin%2Dtop%3A%2D1px%3Bleft%3A3px%3Bright%3A3px%3Btop%3A50%25%7D%2Eel%2Dcheckbox%5F%5Finner%2Eis%2Dindeterminate%3A%3Aafter%7Bdisplay%3Anone%7D%2Eel%2Dcheckbox%5F%5Finner%2Eis%2Dfocus%7Bborder%2Dcolor%3A%2320a0ff%7D%2Eel%2Dcheckbox%5F%5Finner%2Eis%2Dchecked%7Bbackground%2Dcolor%3A%2320a0ff%3Bborder%2Dcolor%3A%232e90fe%7D%2Eel%2Dcheckbox%5F%5Finner%2Eis%2Dchecked%3A%3Aafter%7B%2Dms%2Dtransform%3Arotate%2845deg%29%20scaleY%281%29%3Btransform%3Arotate%2845deg%29%20scaleY%281%29%7D%2Eel%2Dcheckbox%5F%5Finner%2Eis%2Ddisabled%7Bbackground%2Dcolor%3A%23EFF2F7%3Bborder%2Dcolor%3A%23D3DCE6%3Bcursor%3Anot%2Dallowed%7D%2Eel%2Dcheckbox%5F%5Finner%2Eis%2Ddisabled%3A%3Aafter%7Bcursor%3Anot%2Dallowed%3Bborder%2Dcolor%3A%23EFF2F7%7D%2Eel%2Dcheckbox%5F%5Finner%2Eis%2Ddisabled%2B%2Eel%2Dcheckbox%5F%5Flabel%7Bcursor%3Anot%2Dallowed%7D%2Eel%2Dcheckbox%5F%5Foriginal%7Bopacity%3A0%3Boutline%3A0%3Bposition%3Aabsolute%3Bmargin%3A0%3Bleft%3A%2D999px%7D%2Eel%2Dcheckbox%5F%5Flabel%7Bfont%2Dsize%3A14px%3Bpadding%2Dleft%3A5px%7D%2Eel%2Dtable%2Dcolumn%2D%2Dselection%20%2Ecell%7Bpadding%2Dleft%3A14px%3Bpadding%2Dright%3A14px%7D%2Eel%2Dtable%2Dfilter%7Bborder%3A1px%20solid%20%23d3dce6%3Bborder%2Dradius%3A2px%3Bbackground%2Dcolor%3A%23fff%3Bbox%2Dshadow%3A0%202px%204px%20rgba%280%2C0%2C0%2C%2E12%29%2C0%200%206px%20rgba%280%2C0%2C0%2C%2E12%29%3Bbox%2Dsizing%3Aborder%2Dbox%3Bmargin%3A2px%200%7D%2Eel%2Dtable%2Dfilter%5F%5Flist%7Bpadding%3A5px%200%3Bmargin%3A0%3Blist%2Dstyle%3Anone%3Bmin%2Dwidth%3A100px%7D%2Eel%2Dtable%2Dfilter%5F%5Flist%2Ditem%7Bline%2Dheight%3A36px%3Bpadding%3A0%2010px%3Bcursor%3Apointer%3Bfont%2Dsize%3A14px%7D%2Eel%2Dtable%2Dfilter%5F%5Flist%2Ditem%3Ahover%7Bbackground%2Dcolor%3A%23e5e9f2%3Bcolor%3A%23475669%7D%2Eel%2Dtable%2Dfilter%5F%5Flist%2Ditem%2Eis%2Dactive%7Bbackground%2Dcolor%3A%2320a0ff%3Bcolor%3A%23fff%7D%2Eel%2Dtable%2Dfilter%5F%5Fcontent%7Bmin%2Dwidth%3A100px%7D%2Eel%2Dtable%2Dfilter%5F%5Fbottom%7Bborder%2Dtop%3A1px%20solid%20%23d3dce6%3Bpadding%3A8px%7D%2Eel%2Dtable%2Dfilter%5F%5Fbottom%20button%7Bbackground%3A0%200%3Bborder%3Anone%3Bcolor%3A%238492a6%3Bcursor%3Apointer%3Bfont%2Dsize%3A14px%3Bpadding%3A0%203px%7D%2Eel%2Dtable%2Dfilter%5F%5Fbottom%20button%3Ahover%7Bcolor%3A%2320a0ff%7D%2Eel%2Dtable%2Dfilter%5F%5Fbottom%20button%3Afocus%7Boutline%3A0%7D%2Eel%2Dtable%2Dfilter%5F%5Fbottom%20button%2Eis%2Ddisabled%7Bcolor%3A%23c0ccda%3Bcursor%3Anot%2Dallowed%7D%2Eel%2Dtable%2Dfilter%5F%5Fcheckbox%2Dgroup%7Bpadding%3A10px%7D%2Eel%2Dtable%2Dfilter%5F%5Fcheckbox%2Dgroup%20%2Eel%2Dcheckbox%7Bdisplay%3Ablock%3Bmargin%2Dbottom%3A8px%3Bmargin%2Dleft%3A5px%7D%2Eel%2Dtable%2Dfilter%5F%5Fcheckbox%2Dgroup%20%2Eel%2Dcheckbox%3Alast%2Dchild%7Bmargin%2Dbottom%3A0%7D%2Eel%2Dselect%2Ddropdown%7Bposition%3Aabsolute%3Bz%2Dindex%3A1001%3Bborder%3A1px%20solid%20%23D3DCE6%3Bborder%2Dradius%3A2px%3Bbackground%2Dcolor%3A%23fff%3Bbox%2Dshadow%3A0%202px%204px%20rgba%280%2C0%2C0%2C%2E12%29%2C0%200%206px%20rgba%280%2C0%2C0%2C%2E04%29%3Bbox%2Dsizing%3Aborder%2Dbox%3Bmargin%3A5px%200%7D%2Eel%2Dselect%2Ddropdown%2Eis%2Dmultiple%20%2Eel%2Dselect%2Ddropdown%5F%5Fitem%2Eselected%7Bcolor%3A%2320a0ff%3Bbackground%2Dcolor%3A%23fff%7D%2Eel%2Dselect%2Ddropdown%2Eis%2Dmultiple%20%2Eel%2Dselect%2Ddropdown%5F%5Fitem%2Eselected%2Ehover%2C%2Eel%2Dselect%2Ddropdown%5F%5Fitem%2Ehover%7Bbackground%2Dcolor%3A%23e5e9f2%7D%2Eel%2Dselect%2Ddropdown%2Eis%2Dmultiple%20%2Eel%2Dselect%2Ddropdown%5F%5Fitem%2Eselected%3A%3Aafter%7Bposition%3Aabsolute%3Bright%3A10px%3Bfont%2Dfamily%3Aelement%2Dicons%3Bcontent%3A%22%5CE608%22%3Bfont%2Dsize%3A11px%3B%2Dwebkit%2Dfont%2Dsmoothing%3Aantialiased%3B%2Dmoz%2Dosx%2Dfont%2Dsmoothing%3Agrayscale%7D%2Eel%2Dselect%2Ddropdown%5F%5Fempty%7Bpadding%3A10px%200%3Bmargin%3A0%3Btext%2Dalign%3Acenter%3Bcolor%3A%23999%3Bfont%2Dsize%3A14px%7D%2Eel%2Dselect%2Ddropdown%5F%5Flist%7Blist%2Dstyle%3Anone%3Bpadding%3A6px%200%3Bmargin%3A0%3Bwidth%3A100%25%3Bmax%2Dheight%3A274px%3Bbox%2Dsizing%3Aborder%2Dbox%3Boverflow%2Dy%3Aauto%7D%2Eel%2Dselect%2Ddropdown%5F%5Flist%2Eis%2Dempty%7Bpadding%3A0%7D%2Eel%2Dselect%2Ddropdown%5F%5Fitem%7Bfont%2Dsize%3A14px%3Bpadding%3A8px%2010px%3Bposition%3Arelative%3Bwhite%2Dspace%3Anowrap%3Boverflow%3Ahidden%3Btext%2Doverflow%3Aellipsis%3Bcolor%3A%23475669%3Bheight%3A36px%3Bline%2Dheight%3A1%2E5%3Bbox%2Dsizing%3Aborder%2Dbox%3Bcursor%3Apointer%7D%2Eel%2Dselect%2Ddropdown%5F%5Fitem%2Eselected%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%2320a0ff%7D%2Eel%2Dselect%2Ddropdown%5F%5Fitem%2Eselected%2Ehover%7Bbackground%2Dcolor%3A%231D8CE0%7D%2Eel%2Dselect%2Ddropdown%5F%5Fitem%20span%7Bline%2Dheight%3A1%2E5%21important%7D%2Eel%2Dselect%2Ddropdown%5F%5Fitem%2Eis%2Ddisabled%7Bcolor%3A%23c0ccda%3Bcursor%3Anot%2Dallowed%7D%2Eel%2Dselect%2Ddropdown%5F%5Fitem%2Eis%2Ddisabled%3Ahover%7Bbackground%2Dcolor%3A%23fff%7D%2Eel%2Dselect%2Dgroup%7Bmargin%3A0%3Bpadding%3A0%7D%2Eel%2Dselect%2Dgroup%20%2Eel%2Dselect%2Ddropdown%5F%5Fitem%7Bpadding%2Dleft%3A20px%7D%2Eel%2Dselect%2Dgroup%5F%5Fwrap%7Blist%2Dstyle%3Anone%3Bmargin%3A0%3Bpadding%3A0%7D%2Eel%2Dselect%2Dgroup%5F%5Ftitle%7Bpadding%2Dleft%3A10px%3Bfont%2Dsize%3A12px%3Bcolor%3A%23999%3Bheight%3A30px%3Bline%2Dheight%3A30px%7D%2Eel%2Dselect%7Bdisplay%3Ablock%3Bposition%3Arelative%7D%2Eel%2Dselect%3Ahover%20%2Eel%2Dinput%5F%5Finner%7Bborder%2Dcolor%3A%238492a6%7D%2Eel%2Dselect%20%2Eel%2Dinput%5F%5Finner%7Bcursor%3Apointer%7D%2Eel%2Dselect%20%2Eel%2Dinput%5F%5Finner%3Afocus%7Bborder%2Dcolor%3A%2320a0ff%7D%2Eel%2Dselect%20%2Eel%2Dinput%20%2Eel%2Dinput%5F%5Ficon%7Bcolor%3A%23c0ccda%3Bfont%2Dsize%3A12px%3Btransition%3Atransform%20%2E3s%3B%2Dms%2Dtransform%3AtranslateY%28%2D50%25%29%20rotate%28180deg%29%3Btransform%3AtranslateY%28%2D50%25%29%20rotateZ%28180deg%29%3Bline%2Dheight%3A16px%3Btop%3A50%25%3Bcursor%3Apointer%7D%2Eel%2Dselect%20%2Eel%2Dinput%20%2Eel%2Dinput%5F%5Ficon%2Eis%2Dshow%2Dclose%7Btransition%3A0s%3Bwidth%3A16px%3Bheight%3A16px%3Bfont%2Dsize%3A14px%3Bright%3A8px%3Btext%2Dalign%3Acenter%3B%2Dms%2Dtransform%3AtranslateY%28%2D50%25%29%20rotate%28180deg%29%3Btransform%3AtranslateY%28%2D50%25%29%20rotateZ%28180deg%29%3Bborder%2Dradius%3A100%25%3Bcolor%3A%23c0ccda%7D%2Eel%2Dselect%20%2Eel%2Dinput%20%2Eel%2Dinput%5F%5Ficon%2Eis%2Dshow%2Dclose%3Ahover%7Bcolor%3A%2399a9bf%7D%2Eel%2Dselect%20%2Eel%2Dinput%20%2Eel%2Dinput%5F%5Ficon%2Eis%2Dreverse%7B%2Dms%2Dtransform%3AtranslateY%28%2D50%25%29%3Btransform%3AtranslateY%28%2D50%25%29%7D%2Eel%2Dselect%20%2Eel%2Dinput%2Eis%2Ddisabled%20%2Eel%2Dinput%5F%5Finner%7Bcursor%3Anot%2Dallowed%7D%2Eel%2Dselect%20%2Eel%2Dinput%2Eis%2Ddisabled%20%2Eel%2Dinput%5F%5Finner%3Ahover%7Bborder%2Dcolor%3A%23D3DCE6%7D%2Eel%2Dselect%20%2Eel%2Dtag%5F%5Fclose%7Bmargin%2Dtop%3A%2D2px%7D%2Eel%2Dselect%20%2Eel%2Dtag%7Bheight%3A24px%3Bline%2Dheight%3A24px%3Bbox%2Dsizing%3Aborder%2Dbox%3Bmargin%3A3px%200%203px%206px%7D%2Eel%2Dselect%5F%5Finput%7Bborder%3Anone%3Boutline%3A0%3Bpadding%3A0%3Bmargin%2Dleft%3A10px%3Bcolor%3A%23666%3Bfont%2Dsize%3A14px%3Bvertical%2Dalign%3Abaseline%3B%2Dwebkit%2Dappearance%3Anone%3B%2Dmoz%2Dappearance%3Anone%3Bappearance%3Anone%3Bheight%3A28px%3Bbackground%2Dcolor%3Atransparent%7D%2Eel%2Dbutton%2C%2Eel%2Dinput%5F%5Finner%7B%2Dwebkit%2Dappearance%3Anone%3Boutline%3A0%7D%2Eel%2Dselect%5F%5Finput%2Eis%2Dmini%7Bheight%3A14px%7D%2Eel%2Dselect%5F%5Fclose%7Bcursor%3Apointer%3Bposition%3Aabsolute%3Btop%3A8px%3Bz%2Dindex%3A1000%3Bright%3A25px%3Bcolor%3A%23c0ccda%3Bline%2Dheight%3A18px%3Bfont%2Dsize%3A12px%7D%2Eel%2Dselect%5F%5Fclose%3Ahover%7Bcolor%3A%2399a9bf%7D%2Eel%2Dselect%5F%5Ftags%7Bposition%3Aabsolute%3Bline%2Dheight%3Anormal%3Bwhite%2Dspace%3Anormal%3Bz%2Dindex%3A1000%3Btop%3A50%25%3B%2Dms%2Dtransform%3AtranslateY%28%2D50%25%29%3Btransform%3AtranslateY%28%2D50%25%29%7D%2Eel%2Dselect%5F%5Ftag%7Bdisplay%3Ainline%2Dblock%3Bheight%3A24px%3Bline%2Dheight%3A24px%3Bfont%2Dsize%3A14px%3Bborder%2Dradius%3A4px%3Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%2320a0ff%7D%2Eel%2Dselect%5F%5Ftag%20%2Eel%2Dicon%2Dclose%7Bfont%2Dsize%3A12px%7D%2Eel%2Dpagination%7Bwhite%2Dspace%3Anowrap%3Bpadding%3A2px%205px%3Bcolor%3A%23475669%7D%2Eel%2Dpagination%20button%2C%2Eel%2Dpagination%20span%7Bdisplay%3Ainline%2Dblock%3Bfont%2Dsize%3A13px%3Bmin%2Dwidth%3A28px%3Bheight%3A28px%3Bline%2Dheight%3A28px%3Bvertical%2Dalign%3Atop%3Bbox%2Dsizing%3Aborder%2Dbox%7D%2Eel%2Dpagination%20%2Eel%2Dselect%20%2Eel%2Dinput%7Bwidth%3A110px%7D%2Eel%2Dpagination%20%2Eel%2Dselect%20%2Eel%2Dinput%20input%7Bpadding%2Dright%3A25px%3Bborder%2Dradius%3A2px%3Bheight%3A28px%7D%2Eel%2Dpagination%20button%7Bborder%3Anone%3Bpadding%3A0%206px%3Bbackground%3A0%200%7D%2Eel%2Dpagination%20button%3Afocus%7Boutline%3A0%7D%2Eel%2Dpagination%20button%3Ahover%7Bcolor%3A%2320a0ff%7D%2Eel%2Dpagination%20button%2Edisabled%7Bcolor%3A%23e4e4e4%3Bbackground%2Dcolor%3A%23fff%3Bcursor%3Anot%2Dallowed%7D%2Eel%2Dpager%20li%2C%2Eel%2Dpager%20li%2Ebtn%2Dquicknext%3Ahover%2C%2Eel%2Dpager%20li%2Ebtn%2Dquickprev%3Ahover%7Bcursor%3Apointer%7D%2Eel%2Dpagination%20%2Ebtn%2Dnext%2C%2Eel%2Dpagination%20%2Ebtn%2Dprev%7Bbackground%3Acenter%20center%20no%2Drepeat%20%23fff%3Bbackground%2Dsize%3A16px%3Bborder%3A1px%20solid%20%23D3DCE6%3Bcursor%3Apointer%3Bmargin%3A0%3Bcolor%3A%2399a9bf%7D%2Eel%2Dpagination%20%2Ebtn%2Dnext%20%2Eel%2Dicon%2C%2Eel%2Dpagination%20%2Ebtn%2Dprev%20%2Eel%2Dicon%7Bdisplay%3Ablock%3Bfont%2Dsize%3A12px%7D%2Eel%2Dpager%2C%2Eel%2Dpager%20li%7Bvertical%2Dalign%3Atop%3Bdisplay%3Ainline%2Dblock%7D%2Eel%2Dpagination%20%2Ebtn%2Dprev%7Bborder%2Dradius%3A2px%200%200%202px%3Bborder%2Dright%3A0%7D%2Eel%2Dpagination%20%2Ebtn%2Dnext%7Bborder%2Dradius%3A0%202px%202px%200%3Bborder%2Dleft%3A0%7D%2Eel%2Dpagination%2D%2Dsmall%20%2Ebtn%2Dnext%2C%2Eel%2Dpagination%2D%2Dsmall%20%2Ebtn%2Dprev%2C%2Eel%2Dpagination%2D%2Dsmall%20%2Eel%2Dpager%20li%2C%2Eel%2Dpagination%2D%2Dsmall%20%2Eel%2Dpager%20li%3Alast%2Dchild%7Bborder%2Dcolor%3Atransparent%3Bfont%2Dsize%3A12px%3Bline%2Dheight%3A22px%3Bheight%3A22px%3Bmin%2Dwidth%3A22px%7D%2Eel%2Dpagination%2D%2Dsmall%20%2Eel%2Dpager%20li%7Bborder%2Dradius%3A2px%7D%2Eel%2Dpagination%5F%5Fsizes%7Bmargin%3A0%2010px%200%200%7D%2Eel%2Dpagination%5F%5Fsizes%20%2Eel%2Dinput%20%2Eel%2Dinput%5F%5Finner%7Bfont%2Dsize%3A13px%3Bborder%2Dcolor%3A%23D3DCE6%7D%2Eel%2Dpagination%5F%5Fsizes%20%2Eel%2Dinput%20%2Eel%2Dinput%5F%5Finner%3Ahover%7Bborder%2Dcolor%3A%2320a0ff%7D%2Eel%2Dpagination%5F%5Fjump%7Bmargin%2Dleft%3A10px%7D%2Eel%2Dpagination%5F%5Ftotal%7Bmargin%3A0%2010px%7D%2Eel%2Dpagination%5F%5Feditor%7Bborder%3A1px%20solid%20%23D3DCE6%3Bborder%2Dradius%3A2px%3Bline%2Dheight%3A18px%3Bpadding%3A4px%202px%3Bwidth%3A30px%3Btext%2Dalign%3Acenter%3Bmargin%3A0%206px%3Bbox%2Dsizing%3Aborder%2Dbox%3Btransition%3Aborder%20%2E3s%7D%2Eel%2Dpagination%5F%5Feditor%3A%3A%2Dwebkit%2Dinner%2Dspin%2Dbutton%2C%2Eel%2Dpagination%5F%5Feditor%3A%3A%2Dwebkit%2Douter%2Dspin%2Dbutton%7B%2Dwebkit%2Dappearance%3Anone%3Bmargin%3A0%7D%2Eel%2Dpagination%5F%5Feditor%3Afocus%7Boutline%3A0%3Bborder%2Dcolor%3A%2320a0ff%7D%2Eel%2Dpager%7Buser%2Dselect%3Anone%3Blist%2Dstyle%3Anone%3Bfont%2Dsize%3A0%3Bpadding%3A0%7D%2Eel%2Dbutton%2C%2Eel%2Ddate%2Dtable%7B%2Dmoz%2Duser%2Dselect%3Anone%3B%2Dms%2Duser%2Dselect%3Anone%7D%2Eel%2Dbutton%2C%2Eel%2Ddate%2Dtable%2C%2Eel%2Dmessage%2Dbox%7B%2Dwebkit%2Duser%2Dselect%3Anone%7D%2Eel%2Dpager%20li%7Bpadding%3A0%204px%3Bborder%3A1px%20solid%20%23D3DCE6%3Bborder%2Dright%3A0%3Bbackground%3A%23fff%3Bfont%2Dsize%3A13px%3Bmin%2Dwidth%3A28px%3Bheight%3A28px%3Bline%2Dheight%3A28px%3Bbox%2Dsizing%3Aborder%2Dbox%3Btext%2Dalign%3Acenter%7D%2Eel%2Dautocomplete%5F%5Fsuggestions%2Eis%2Dloading%20%2Eel%2Dicon%2Dloading%2C%2Eel%2Dbutton%2Dgroup%2C%2Eel%2Dmessage%2Dbox%2C%2Eel%2Dmessage%2Dbox%5F%5Fwrapper%3A%3Aafter%2C%2Eel%2Dmessage%5F%5Fgroup%20p%2C%2Eel%2Dmessage%5F%5Ficon%7Bvertical%2Dalign%3Amiddle%7D%2Eel%2Dpager%20li%3Alast%2Dchild%7Bborder%2Dright%3A1px%20solid%20%23D3DCE6%7D%2Eel%2Dpager%20li%2Ebtn%2Dquicknext%2C%2Eel%2Dpager%20li%2Ebtn%2Dquickprev%7Bline%2Dheight%3A28px%3Bcolor%3A%2399a9bf%7D%2Eel%2Dpager%20li%2Eactive%2Bli%7Bborder%2Dleft%3A0%3Bpadding%2Dleft%3A5px%7D%2Eel%2Dpager%20li%3Ahover%7Bcolor%3A%2320a0ff%7D%2Eel%2Dpager%20li%2Eactive%7Bborder%2Dcolor%3A%2320a0ff%3Bbackground%2Dcolor%3A%2320a0ff%3Bcolor%3A%23fff%3Bcursor%3Adefault%7D%2Eel%2Dpopover%7Bposition%3Aabsolute%3Bbackground%3A%23fff%3Bmin%2Dwidth%3A150px%3Bborder%2Dradius%3A2px%3Bborder%3A1px%20solid%20%23D3DCE6%3Bpadding%3A10px%3Bz%2Dindex%3A2000%3Bfont%2Dsize%3A12px%3Bbox%2Dshadow%3A0%202px%204px%200%20rgba%280%2C0%2C0%2C%2E12%29%2C0%200%206px%200%20rgba%280%2C0%2C0%2C%2E04%29%7D%2Eel%2Dpopover%20%2Epopper%5F%5Farrow%2C%2Eel%2Dtooltip%5F%5Fpopper%20%2Epopper%5F%5Farrow%7Bborder%2Dwidth%3A6px%7D%2Eel%2Dpopover%20%2Epopper%5F%5Farrow%2C%2Eel%2Dpopover%20%2Epopper%5F%5Farrow%3A%3Aafter%7Bposition%3Aabsolute%3Bdisplay%3Ablock%3Bwidth%3A0%3Bheight%3A0%3Bborder%2Dcolor%3Atransparent%3Bborder%2Dstyle%3Asolid%7D%2Eel%2Dtooltip%2C%2Eel%2Dtooltip%5F%5Frel%7Bdisplay%3Ainline%2Dblock%7D%2Eel%2Dpopover%20%2Epopper%5F%5Farrow%3A%3Aafter%7Bcontent%3A%22%20%22%3Bborder%2Dwidth%3A6px%7D%2Eel%2Dpopover%5Bx%2Dplacement%5E%3Dtop%5D%7Bmargin%2Dbottom%3A12px%7D%2Eel%2Dpopover%5Bx%2Dplacement%5E%3Dtop%5D%20%2Epopper%5F%5Farrow%7Bbottom%3A%2D6px%3Bleft%3A50%25%3Bmargin%2Dright%3A3px%3Bborder%2Dtop%2Dcolor%3A%23D3DCE6%3Bborder%2Dbottom%2Dwidth%3A0%7D%2Eel%2Dpopover%5Bx%2Dplacement%5E%3Dtop%5D%20%2Epopper%5F%5Farrow%3A%3Aafter%7Bbottom%3A1px%3Bmargin%2Dleft%3A%2D6px%3Bborder%2Dtop%2Dcolor%3A%23fff%3Bborder%2Dbottom%2Dwidth%3A0%7D%2Eel%2Dpopover%5Bx%2Dplacement%5E%3Dbottom%5D%7Bmargin%2Dtop%3A12px%7D%2Eel%2Dpopover%5Bx%2Dplacement%5E%3Dbottom%5D%20%2Epopper%5F%5Farrow%7Btop%3A%2D6px%3Bleft%3A50%25%3Bmargin%2Dright%3A3px%3Bborder%2Dtop%2Dwidth%3A0%3Bborder%2Dbottom%2Dcolor%3A%23D3DCE6%7D%2Eel%2Dpopover%5Bx%2Dplacement%5E%3Dleft%5D%2C%2Eel%2Dtooltip%5F%5Fpopper%5Bx%2Dplacement%5E%3Dleft%5D%7Bmargin%2Dright%3A12px%7D%2Eel%2Dpopover%5Bx%2Dplacement%5E%3Dbottom%5D%20%2Epopper%5F%5Farrow%3A%3Aafter%7Btop%3A1px%3Bmargin%2Dleft%3A%2D6px%3Bborder%2Dtop%2Dwidth%3A0%3Bborder%2Dbottom%2Dcolor%3A%23fff%7D%2Eel%2Dpopover%5Bx%2Dplacement%5E%3Dright%5D%7Bmargin%2Dleft%3A12px%7D%2Eel%2Dpopover%5Bx%2Dplacement%5E%3Dright%5D%20%2Epopper%5F%5Farrow%7Btop%3A50%25%3Bleft%3A%2D6px%3Bmargin%2Dbottom%3A3px%3Bborder%2Dright%2Dcolor%3A%23D3DCE6%3Bborder%2Dleft%2Dwidth%3A0%7D%2Eel%2Dpopover%5Bx%2Dplacement%5E%3Dright%5D%20%2Epopper%5F%5Farrow%3A%3Aafter%7Bbottom%3A%2D6px%3Bleft%3A1px%3Bborder%2Dright%2Dcolor%3A%23fff%3Bborder%2Dleft%2Dwidth%3A0%7D%2Eel%2Dpopover%5Bx%2Dplacement%5E%3Dleft%5D%20%2Epopper%5F%5Farrow%7Btop%3A50%25%3Bright%3A%2D6px%3Bmargin%2Dbottom%3A3px%3Bborder%2Dright%2Dwidth%3A0%3Bborder%2Dleft%2Dcolor%3A%23D3DCE6%7D%2Eel%2Dpopover%5Bx%2Dplacement%5E%3Dleft%5D%20%2Epopper%5F%5Farrow%3A%3Aafter%7Bright%3A1px%3Bbottom%3A%2D6px%3Bmargin%2Dleft%3A%2D6px%3Bborder%2Dright%2Dwidth%3A0%3Bborder%2Dleft%2Dcolor%3A%23fff%7D%2Eel%2Dpopover%5F%5Ftitle%7Bcolor%3A%231f2d3d%3Bfont%2Dsize%3A13px%3Bline%2Dheight%3A1%3Bmargin%2Dbottom%3A9px%7D%2Eel%2Dtooltip%5F%5Frel%7Bposition%3Arelative%7D%2Eel%2Dtooltip%5F%5Fpopper%7Bposition%3Aabsolute%3Bborder%2Dradius%3A4px%3Bpadding%3A10px%3Bz%2Dindex%3A2000%3Bfont%2Dsize%3A12px%3Bline%2Dheight%3A1%2E2%7D%2Eel%2Dtooltip%5F%5Fpopper%20%2Epopper%5F%5Farrow%2C%2Eel%2Dtooltip%5F%5Fpopper%20%2Epopper%5F%5Farrow%3A%3Aafter%7Bposition%3Aabsolute%3Bdisplay%3Ablock%3Bwidth%3A0%3Bheight%3A0%3Bborder%2Dcolor%3Atransparent%3Bborder%2Dstyle%3Asolid%7D%2Eel%2Dtooltip%5F%5Fpopper%20%2Epopper%5F%5Farrow%3A%3Aafter%7Bcontent%3A%22%20%22%3Bborder%2Dwidth%3A5px%7D%2Eel%2Dtooltip%5F%5Fpopper%5Bx%2Dplacement%5E%3Dtop%5D%7Bmargin%2Dbottom%3A12px%7D%2Eel%2Dtooltip%5F%5Fpopper%5Bx%2Dplacement%5E%3Dtop%5D%20%2Epopper%5F%5Farrow%7Bbottom%3A%2D6px%3Bborder%2Dtop%2Dcolor%3A%231f2d3d%3Bborder%2Dbottom%2Dwidth%3A0%7D%2Eel%2Dtooltip%5F%5Fpopper%5Bx%2Dplacement%5E%3Dtop%5D%20%2Epopper%5F%5Farrow%3A%3Aafter%7Bbottom%3A1px%3Bmargin%2Dleft%3A%2D5px%3Bborder%2Dtop%2Dcolor%3A%231f2d3d%3Bborder%2Dbottom%2Dwidth%3A0%7D%2Eel%2Dtooltip%5F%5Fpopper%5Bx%2Dplacement%5E%3Dbottom%5D%7Bmargin%2Dtop%3A12px%7D%2Eel%2Dtooltip%5F%5Fpopper%5Bx%2Dplacement%5E%3Dbottom%5D%20%2Epopper%5F%5Farrow%7Btop%3A%2D6px%3Bborder%2Dtop%2Dwidth%3A0%3Bborder%2Dbottom%2Dcolor%3A%231f2d3d%7D%2Eel%2Dtooltip%5F%5Fpopper%5Bx%2Dplacement%5E%3Dbottom%5D%20%2Epopper%5F%5Farrow%3A%3Aafter%7Btop%3A1px%3Bmargin%2Dleft%3A%2D5px%3Bborder%2Dtop%2Dwidth%3A0%3Bborder%2Dbottom%2Dcolor%3A%231f2d3d%7D%2Eel%2Dtooltip%5F%5Fpopper%5Bx%2Dplacement%5E%3Dright%5D%7Bmargin%2Dleft%3A12px%7D%2Eel%2Dtooltip%5F%5Fpopper%5Bx%2Dplacement%5E%3Dright%5D%20%2Epopper%5F%5Farrow%7Bleft%3A%2D6px%3Bborder%2Dright%2Dcolor%3A%231f2d3d%3Bborder%2Dleft%2Dwidth%3A0%7D%2Eel%2Dtooltip%5F%5Fpopper%5Bx%2Dplacement%5E%3Dright%5D%20%2Epopper%5F%5Farrow%3A%3Aafter%7Bbottom%3A%2D5px%3Bleft%3A1px%3Bborder%2Dright%2Dcolor%3A%231f2d3d%3Bborder%2Dleft%2Dwidth%3A0%7D%2Eel%2Dtooltip%5F%5Fpopper%5Bx%2Dplacement%5E%3Dleft%5D%20%2Epopper%5F%5Farrow%7Bright%3A%2D6px%3Bborder%2Dright%2Dwidth%3A0%3Bborder%2Dleft%2Dcolor%3A%231f2d3d%7D%2Eel%2Dtooltip%5F%5Fpopper%5Bx%2Dplacement%5E%3Dleft%5D%20%2Epopper%5F%5Farrow%3A%3Aafter%7Bright%3A1px%3Bbottom%3A%2D5px%3Bmargin%2Dleft%3A%2D5px%3Bborder%2Dright%2Dwidth%3A0%3Bborder%2Dleft%2Dcolor%3A%231f2d3d%7D%2Eel%2Dtooltip%5F%5Fpopper%2Eis%2Dlight%7Bbackground%3A%23fff%3Bborder%3A1px%20solid%20%231f2d3d%7D%2Eel%2Dtooltip%5F%5Fpopper%2Eis%2Dlight%5Bx%2Dplacement%5E%3Dtop%5D%20%2Epopper%5F%5Farrow%7Bborder%2Dtop%2Dcolor%3A%231f2d3d%7D%2Eel%2Dtooltip%5F%5Fpopper%2Eis%2Dlight%5Bx%2Dplacement%5E%3Dtop%5D%20%2Epopper%5F%5Farrow%3A%3Aafter%7Bborder%2Dtop%2Dcolor%3A%23fff%7D%2Eel%2Dtooltip%5F%5Fpopper%2Eis%2Dlight%5Bx%2Dplacement%5E%3Dbottom%5D%20%2Epopper%5F%5Farrow%7Bborder%2Dbottom%2Dcolor%3A%231f2d3d%7D%2Eel%2Dtooltip%5F%5Fpopper%2Eis%2Dlight%5Bx%2Dplacement%5E%3Dbottom%5D%20%2Epopper%5F%5Farrow%3A%3Aafter%7Bborder%2Dbottom%2Dcolor%3A%23fff%7D%2Eel%2Dtooltip%5F%5Fpopper%2Eis%2Dlight%5Bx%2Dplacement%5E%3Dleft%5D%20%2Epopper%5F%5Farrow%7Bborder%2Dleft%2Dcolor%3A%231f2d3d%7D%2Eel%2Dtooltip%5F%5Fpopper%2Eis%2Dlight%5Bx%2Dplacement%5E%3Dleft%5D%20%2Epopper%5F%5Farrow%3A%3Aafter%7Bborder%2Dleft%2Dcolor%3A%23fff%7D%2Eel%2Dtooltip%5F%5Fpopper%2Eis%2Dlight%5Bx%2Dplacement%5E%3Dright%5D%20%2Epopper%5F%5Farrow%7Bborder%2Dright%2Dcolor%3A%231f2d3d%7D%2Eel%2Dtooltip%5F%5Fpopper%2Eis%2Dlight%5Bx%2Dplacement%5E%3Dright%5D%20%2Epopper%5F%5Farrow%3A%3Aafter%7Bborder%2Dright%2Dcolor%3A%23fff%7D%2Eel%2Dtooltip%5F%5Fpopper%2Eis%2Ddark%7Bbackground%3A%231f2d3d%3Bcolor%3A%23fff%7D%2Eel%2Dautocomplete%7Bposition%3Arelative%7D%2Eel%2Dautocomplete%5F%5Fsuggestions%7Bposition%3Aabsolute%3Bleft%3A0%3Btop%3A110%25%3Bmargin%3A0%3Bbackground%2Dcolor%3A%23fff%3Bborder%3A1px%20solid%20%23D3DCE6%3Bwidth%3A100%25%3Bpadding%3A6px%200%3Bz%2Dindex%3A10%3Bborder%2Dradius%3A2px%3Bmax%2Dheight%3A280px%3Bbox%2Dsizing%3Aborder%2Dbox%3Boverflow%3Aauto%3Bbox%2Dshadow%3A0%200%206px%200%20rgba%280%2C0%2C0%2C%2E04%29%2C0%202px%204px%200%20rgba%280%2C0%2C0%2C%2E12%29%7D%2Eel%2Dmessage%2C%2Eel%2Dtime%2Dpanel%7Bbox%2Dshadow%3A0%202px%204px%20rgba%280%2C0%2C0%2C%2E12%29%2C0%200%206px%20rgba%280%2C0%2C0%2C%2E04%29%7D%2Eel%2Dautocomplete%5F%5Fsuggestions%20li%7Blist%2Dstyle%3Anone%3Bline%2Dheight%3A36px%3Bpadding%3A0%2010px%3Bmargin%3A0%3Bcursor%3Apointer%3Bcolor%3A%23475669%3Bfont%2Dsize%3A14px%3Bwhite%2Dspace%3Anowrap%3Boverflow%3Ahidden%3Btext%2Doverflow%3Aellipsis%7D%2Eel%2Dautocomplete%5F%5Fsuggestions%20li%3Ahover%7Bbackground%2Dcolor%3A%23e5e9f2%7D%2Eel%2Dautocomplete%5F%5Fsuggestions%20li%2Ehighlighted%7Bbackground%2Dcolor%3A%2320a0ff%3Bcolor%3A%23fff%7D%2Eel%2Dautocomplete%5F%5Fsuggestions%20li%3Aactive%7Bbackground%2Dcolor%3A%230082e6%7D%2Eel%2Dautocomplete%5F%5Fsuggestions%2Eis%2Dloading%20li%3Ahover%2C%2Eel%2Dmessage%7Bbackground%2Dcolor%3A%23fff%7D%2Eel%2Dautocomplete%5F%5Fsuggestions%20li%2Edivider%7Bmargin%2Dtop%3A6px%3Bborder%2Dtop%3A1px%20solid%20%23D3DCE6%7D%2Eel%2Dautocomplete%5F%5Fsuggestions%20li%2Edivider%3Alast%2Dchild%7Bmargin%2Dbottom%3A%2D6px%7D%2Eel%2Dautocomplete%5F%5Fsuggestions%2Eis%2Dloading%20li%7Btext%2Dalign%3Acenter%3Bheight%3A100px%3Bline%2Dheight%3A100px%3Bfont%2Dsize%3A20px%3Bcolor%3A%23999%7D%2Eel%2Dmessage%7Bmin%2Dwidth%3A300px%3Bpadding%3A10px%2012px%3Bbox%2Dsizing%3Aborder%2Dbox%3Bborder%2Dradius%3A2px%3Bposition%3Afixed%3Bleft%3A50%25%3Btop%3A20px%3Btransform%3AtranslateX%28%2D50%25%29%3Btransition%3Aopacity%20%2E3s%2Ctransform%20%2E4s%3Boverflow%3Ahidden%7D%2Eel%2Dmessage%20%2Eel%2Dicon%2Dcircle%2Dcheck%7Bcolor%3A%2313ce66%7D%2Eel%2Dmessage%20%2Eel%2Dicon%2Dcircle%2Dcross%7Bcolor%3A%23ff4949%7D%2Eel%2Dmessage%20%2Eel%2Dicon%2Dinformation%7Bcolor%3A%2350bfff%7D%2Eel%2Dmessage%20%2Eel%2Dicon%2Dwarning%7Bcolor%3A%23f7ba2a%7D%2Eel%2Dmessage%5F%5Fgroup%7Bmargin%2Dleft%3A38px%3Bposition%3Arelative%3Bheight%3A20px%7D%2Eel%2Dmessage%5F%5Fgroup%20p%7Bfont%2Dsize%3A14px%3Bline%2Dheight%3A20px%3Bmargin%3A0%2034px%200%200%3Bwhite%2Dspace%3Anowrap%3Bcolor%3A%238492a6%3Btext%2Dalign%3Ajustify%3Bdisplay%3Ainline%2Dblock%7D%2Eel%2Dmessage%5F%5Fgroup%2Eis%2Dwith%2Dicon%7Bmargin%2Dleft%3A0%7D%2Eel%2Dmessage%5F%5Fimg%7Bwidth%3A40px%3Bheight%3A40px%3Bposition%3Aabsolute%3Bleft%3A0%3Btop%3A0%7D%2Eel%2Dmessage%5F%5Ficon%7Bmargin%2Dright%3A8px%7D%2Eel%2Dmessage%5F%5FcloseBtn%7Btop%3A3px%3Bright%3A0%3Bposition%3Aabsolute%3Bcursor%3Apointer%3Bcolor%3A%23c0ccda%3Bfont%2Dsize%3A14px%7D%2Eel%2Dmessage%5F%5FcloseBtn%3Ahover%7Bcolor%3A%2399A9BF%7D%2Eel%2Dmessage%2Dfade%2Denter%2C%2Eel%2Dmessage%2Dfade%2Dleave%2Dactive%7Bopacity%3A0%3B%2Dms%2Dtransform%3Atranslate%28%2D50%25%2C%2D100%25%29%3Btransform%3Atranslate%28%2D50%25%2C%2D100%25%29%7D%2Eel%2Dbutton%7Bdisplay%3Ainline%2Dblock%3Bline%2Dheight%3A1%3Bwhite%2Dspace%3Anowrap%3Bcursor%3Apointer%3Bbackground%3A%23fff%3Bborder%3A1px%20solid%20%23c0ccda%3Bcolor%3A%231F2D3D%3Btext%2Dalign%3Acenter%3Bbox%2Dsizing%3Aborder%2Dbox%3Bmargin%3A0%3Bpadding%3A10px%2015px%3Bfont%2Dsize%3A14px%3Bborder%2Dradius%3A4px%7D%2Eel%2Dbutton%2B%2Eel%2Dbutton%7Bmargin%2Dleft%3A10px%7D%2Eel%2Dbutton%3Afocus%2C%2Eel%2Dbutton%3Ahover%7Bcolor%3A%2320a0ff%3Bborder%2Dcolor%3A%2320a0ff%7D%2Eel%2Dbutton%3Aactive%7Bcolor%3A%231d90e6%3Bborder%2Dcolor%3A%231d90e6%3Boutline%3A0%7D%2Eel%2Dbutton%3A%3A%2Dmoz%2Dfocus%2Dinner%7Bborder%3A0%7D%2Eel%2Dbutton%20%5Bclass%2A%3Del%2Dicon%2D%5D%2Bspan%7Bmargin%2Dleft%3A5px%7D%2Eel%2Dbutton%2Eis%2Dloading%7Bposition%3Arelative%3Bpointer%2Devents%3Anone%7D%2Eel%2Dbutton%2Eis%2Dloading%3Abefore%7Bpointer%2Devents%3Anone%3Bcontent%3A%27%27%3Bposition%3Aabsolute%3Bleft%3A%2D1px%3Btop%3A%2D1px%3Bright%3A%2D1px%3Bbottom%3A%2D1px%3Bborder%2Dradius%3Ainherit%3Bbackground%2Dcolor%3Argba%28255%2C255%2C255%2C%2E35%29%7D%2Eel%2Dbutton%2Eis%2Ddisabled%2C%2Eel%2Dbutton%2Eis%2Ddisabled%3Afocus%2C%2Eel%2Dbutton%2Eis%2Ddisabled%3Ahover%7Bcolor%3A%23c0ccda%3Bcursor%3Anot%2Dallowed%3Bbackground%2Dimage%3Anone%3Bbackground%2Dcolor%3A%23EFF2F7%3Bborder%2Dcolor%3A%23D3DCE6%7D%2Eel%2Dbutton%2Eis%2Ddisabled%2Eel%2Dbutton%2D%2Dtext%7Bbackground%2Dcolor%3Atransparent%7D%2Eel%2Dbutton%2Eis%2Ddisabled%2Eis%2Dplain%2C%2Eel%2Dbutton%2Eis%2Ddisabled%2Eis%2Dplain%3Afocus%2C%2Eel%2Dbutton%2Eis%2Ddisabled%2Eis%2Dplain%3Ahover%7Bbackground%2Dcolor%3A%23fff%3Bborder%2Dcolor%3A%23d3dce6%3Bcolor%3A%23C0CCDA%7D%2Eel%2Dbutton%2Eis%2Dactive%7Bcolor%3A%231d90e6%3Bborder%2Dcolor%3A%231d90e6%7D%2Eel%2Dbutton%2Eis%2Dplain%3Afocus%2C%2Eel%2Dbutton%2Eis%2Dplain%3Ahover%7Bbackground%3A%23fff%3Bborder%2Dcolor%3A%2320a0ff%3Bcolor%3A%2320a0ff%7D%2Eel%2Dbutton%2Eis%2Dplain%3Aactive%7Bbackground%3A%23fff%3Bborder%2Dcolor%3A%231d90e6%3Bcolor%3A%231d90e6%3Boutline%3A0%7D%2Eel%2Dbutton%2D%2Dprimary%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%2320a0ff%3Bborder%2Dcolor%3A%2320a0ff%7D%2Eel%2Dbutton%2D%2Dprimary%3Afocus%2C%2Eel%2Dbutton%2D%2Dprimary%3Ahover%7Bbackground%3A%234db3ff%3Bborder%2Dcolor%3A%234db3ff%3Bcolor%3A%23fff%7D%2Eel%2Dbutton%2D%2Dprimary%2Eis%2Dactive%2C%2Eel%2Dbutton%2D%2Dprimary%3Aactive%7Bbackground%3A%231d90e6%3Bborder%2Dcolor%3A%231d90e6%3Bcolor%3A%23fff%7D%2Eel%2Dbutton%2D%2Dprimary%3Aactive%7Boutline%3A0%7D%2Eel%2Dbutton%2D%2Dprimary%2Eis%2Dplain%7Bbackground%3A%23fff%3Bborder%3A1px%20solid%20%23c0ccda%3Bcolor%3A%231F2D3D%7D%2Eel%2Dbutton%2D%2Dprimary%2Eis%2Dplain%3Afocus%2C%2Eel%2Dbutton%2D%2Dprimary%2Eis%2Dplain%3Ahover%7Bbackground%3A%23fff%3Bborder%2Dcolor%3A%2320a0ff%3Bcolor%3A%2320a0ff%7D%2Eel%2Dbutton%2D%2Dprimary%2Eis%2Dplain%3Aactive%7Bbackground%3A%23fff%3Bborder%2Dcolor%3A%231d90e6%3Bcolor%3A%231d90e6%3Boutline%3A0%7D%2Eel%2Dbutton%2D%2Dsuccess%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%2313ce66%3Bborder%2Dcolor%3A%2313ce66%7D%2Eel%2Dbutton%2D%2Dsuccess%3Afocus%2C%2Eel%2Dbutton%2D%2Dsuccess%3Ahover%7Bbackground%3A%2342d885%3Bborder%2Dcolor%3A%2342d885%3Bcolor%3A%23fff%7D%2Eel%2Dbutton%2D%2Dsuccess%2Eis%2Dactive%2C%2Eel%2Dbutton%2D%2Dsuccess%3Aactive%7Bbackground%3A%2311b95c%3Bborder%2Dcolor%3A%2311b95c%3Bcolor%3A%23fff%7D%2Eel%2Dbutton%2D%2Dsuccess%3Aactive%7Boutline%3A0%7D%2Eel%2Dbutton%2D%2Dsuccess%2Eis%2Dplain%7Bbackground%3A%23fff%3Bborder%3A1px%20solid%20%23c0ccda%3Bcolor%3A%231F2D3D%7D%2Eel%2Dbutton%2D%2Dsuccess%2Eis%2Dplain%3Afocus%2C%2Eel%2Dbutton%2D%2Dsuccess%2Eis%2Dplain%3Ahover%7Bbackground%3A%23fff%3Bborder%2Dcolor%3A%2313ce66%3Bcolor%3A%2313ce66%7D%2Eel%2Dbutton%2D%2Dsuccess%2Eis%2Dplain%3Aactive%7Bbackground%3A%23fff%3Bborder%2Dcolor%3A%2311b95c%3Bcolor%3A%2311b95c%3Boutline%3A0%7D%2Eel%2Dbutton%2D%2Dwarning%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23f7ba2a%3Bborder%2Dcolor%3A%23f7ba2a%7D%2Eel%2Dbutton%2D%2Dwarning%3Afocus%2C%2Eel%2Dbutton%2D%2Dwarning%3Ahover%7Bbackground%3A%23f9c855%3Bborder%2Dcolor%3A%23f9c855%3Bcolor%3A%23fff%7D%2Eel%2Dbutton%2D%2Dwarning%2Eis%2Dactive%2C%2Eel%2Dbutton%2D%2Dwarning%3Aactive%7Bbackground%3A%23dea726%3Bborder%2Dcolor%3A%23dea726%3Bcolor%3A%23fff%7D%2Eel%2Dbutton%2D%2Dwarning%3Aactive%7Boutline%3A0%7D%2Eel%2Dbutton%2D%2Dwarning%2Eis%2Dplain%7Bbackground%3A%23fff%3Bborder%3A1px%20solid%20%23c0ccda%3Bcolor%3A%231F2D3D%7D%2Eel%2Dbutton%2D%2Dwarning%2Eis%2Dplain%3Afocus%2C%2Eel%2Dbutton%2D%2Dwarning%2Eis%2Dplain%3Ahover%7Bbackground%3A%23fff%3Bborder%2Dcolor%3A%23f7ba2a%3Bcolor%3A%23f7ba2a%7D%2Eel%2Dbutton%2D%2Dwarning%2Eis%2Dplain%3Aactive%7Bbackground%3A%23fff%3Bborder%2Dcolor%3A%23dea726%3Bcolor%3A%23dea726%3Boutline%3A0%7D%2Eel%2Dbutton%2D%2Ddanger%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23ff4949%3Bborder%2Dcolor%3A%23ff4949%7D%2Eel%2Dbutton%2D%2Ddanger%3Afocus%2C%2Eel%2Dbutton%2D%2Ddanger%3Ahover%7Bbackground%3A%23ff6d6d%3Bborder%2Dcolor%3A%23ff6d6d%3Bcolor%3A%23fff%7D%2Eel%2Dbutton%2D%2Ddanger%2Eis%2Dactive%2C%2Eel%2Dbutton%2D%2Ddanger%3Aactive%7Bbackground%3A%23e64242%3Bborder%2Dcolor%3A%23e64242%3Bcolor%3A%23fff%7D%2Eel%2Dbutton%2D%2Ddanger%3Aactive%7Boutline%3A0%7D%2Eel%2Dbutton%2D%2Ddanger%2Eis%2Dplain%7Bbackground%3A%23fff%3Bborder%3A1px%20solid%20%23c0ccda%3Bcolor%3A%231F2D3D%7D%2Eel%2Dbutton%2D%2Ddanger%2Eis%2Dplain%3Afocus%2C%2Eel%2Dbutton%2D%2Ddanger%2Eis%2Dplain%3Ahover%7Bbackground%3A%23fff%3Bborder%2Dcolor%3A%23ff4949%3Bcolor%3A%23ff4949%7D%2Eel%2Dbutton%2D%2Ddanger%2Eis%2Dplain%3Aactive%7Bbackground%3A%23fff%3Bborder%2Dcolor%3A%23e64242%3Bcolor%3A%23e64242%3Boutline%3A0%7D%2Eel%2Dbutton%2D%2Dinfo%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%2350bfff%3Bborder%2Dcolor%3A%2350bfff%7D%2Eel%2Dbutton%2D%2Dinfo%3Afocus%2C%2Eel%2Dbutton%2D%2Dinfo%3Ahover%7Bbackground%3A%2373ccff%3Bborder%2Dcolor%3A%2373ccff%3Bcolor%3A%23fff%7D%2Eel%2Dbutton%2D%2Dinfo%2Eis%2Dactive%2C%2Eel%2Dbutton%2D%2Dinfo%3Aactive%7Bbackground%3A%2348ace6%3Bborder%2Dcolor%3A%2348ace6%3Bcolor%3A%23fff%7D%2Eel%2Dbutton%2D%2Dinfo%3Aactive%7Boutline%3A0%7D%2Eel%2Dbutton%2D%2Dinfo%2Eis%2Dplain%7Bbackground%3A%23fff%3Bborder%3A1px%20solid%20%23c0ccda%3Bcolor%3A%231F2D3D%7D%2Eel%2Dbutton%2D%2Dinfo%2Eis%2Dplain%3Afocus%2C%2Eel%2Dbutton%2D%2Dinfo%2Eis%2Dplain%3Ahover%7Bbackground%3A%23fff%3Bborder%2Dcolor%3A%2350bfff%3Bcolor%3A%2350bfff%7D%2Eel%2Dbutton%2D%2Dinfo%2Eis%2Dplain%3Aactive%7Bbackground%3A%23fff%3Bborder%2Dcolor%3A%2348ace6%3Bcolor%3A%2348ace6%3Boutline%3A0%7D%2Eel%2Dbutton%2D%2Dlarge%7Bpadding%3A11px%2019px%3Bfont%2Dsize%3A16px%3Bborder%2Dradius%3A4px%7D%2Eel%2Dbutton%2D%2Dsmall%7Bpadding%3A7px%209px%3Bfont%2Dsize%3A12px%3Bborder%2Dradius%3A4px%7D%2Eel%2Dbutton%2D%2Dmini%7Bpadding%3A4px%3Bfont%2Dsize%3A12px%3Bborder%2Dradius%3A4px%7D%2Eel%2Dbutton%2D%2Dtext%7Bborder%3Anone%3Bcolor%3A%2320a0ff%3Bbackground%3A0%200%3Bpadding%2Dleft%3A0%3Bpadding%2Dright%3A0%7D%2Eel%2Dbutton%2D%2Dtext%3Afocus%2C%2Eel%2Dbutton%2D%2Dtext%3Ahover%7Bcolor%3A%234db3ff%7D%2Eel%2Dbutton%2D%2Dtext%3Aactive%7Bcolor%3A%231d90e6%7D%2Eel%2Dbutton%2Dgroup%7Bdisplay%3Ainline%2Dblock%7D%2Eel%2Dbutton%2Dgroup%20%2Eel%2Dbutton%2D%2Dprimary%3Afirst%2Dchild%7Bborder%2Dright%2Dcolor%3Argba%28255%2C255%2C255%2C%2E5%29%7D%2Eel%2Dbutton%2Dgroup%20%2Eel%2Dbutton%2D%2Dprimary%3Alast%2Dchild%7Bborder%2Dleft%2Dcolor%3Argba%28255%2C255%2C255%2C%2E5%29%7D%2Eel%2Dbutton%2Dgroup%20%2Eel%2Dbutton%2D%2Dprimary%3Anot%28%3Afirst%2Dchild%29%3Anot%28%3Alast%2Dchild%29%7Bborder%2Dleft%2Dcolor%3Argba%28255%2C255%2C255%2C%2E5%29%3Bborder%2Dright%2Dcolor%3Argba%28255%2C255%2C255%2C%2E5%29%7D%2Eel%2Dbutton%2Dgroup%20%2Eel%2Dbutton%2D%2Dsuccess%3Afirst%2Dchild%7Bborder%2Dright%2Dcolor%3Argba%28255%2C255%2C255%2C%2E5%29%7D%2Eel%2Dbutton%2Dgroup%20%2Eel%2Dbutton%2D%2Dsuccess%3Alast%2Dchild%7Bborder%2Dleft%2Dcolor%3Argba%28255%2C255%2C255%2C%2E5%29%7D%2Eel%2Dbutton%2Dgroup%20%2Eel%2Dbutton%2D%2Dsuccess%3Anot%28%3Afirst%2Dchild%29%3Anot%28%3Alast%2Dchild%29%7Bborder%2Dleft%2Dcolor%3Argba%28255%2C255%2C255%2C%2E5%29%3Bborder%2Dright%2Dcolor%3Argba%28255%2C255%2C255%2C%2E5%29%7D%2Eel%2Dbutton%2Dgroup%20%2Eel%2Dbutton%2D%2Dwarning%3Afirst%2Dchild%7Bborder%2Dright%2Dcolor%3Argba%28255%2C255%2C255%2C%2E5%29%7D%2Eel%2Dbutton%2Dgroup%20%2Eel%2Dbutton%2D%2Dwarning%3Alast%2Dchild%7Bborder%2Dleft%2Dcolor%3Argba%28255%2C255%2C255%2C%2E5%29%7D%2Eel%2Dbutton%2Dgroup%20%2Eel%2Dbutton%2D%2Dwarning%3Anot%28%3Afirst%2Dchild%29%3Anot%28%3Alast%2Dchild%29%7Bborder%2Dleft%2Dcolor%3Argba%28255%2C255%2C255%2C%2E5%29%3Bborder%2Dright%2Dcolor%3Argba%28255%2C255%2C255%2C%2E5%29%7D%2Eel%2Dbutton%2Dgroup%20%2Eel%2Dbutton%2D%2Ddanger%3Afirst%2Dchild%7Bborder%2Dright%2Dcolor%3Argba%28255%2C255%2C255%2C%2E5%29%7D%2Eel%2Dbutton%2Dgroup%20%2Eel%2Dbutton%2D%2Ddanger%3Alast%2Dchild%7Bborder%2Dleft%2Dcolor%3Argba%28255%2C255%2C255%2C%2E5%29%7D%2Eel%2Dbutton%2Dgroup%20%2Eel%2Dbutton%2D%2Ddanger%3Anot%28%3Afirst%2Dchild%29%3Anot%28%3Alast%2Dchild%29%7Bborder%2Dleft%2Dcolor%3Argba%28255%2C255%2C255%2C%2E5%29%3Bborder%2Dright%2Dcolor%3Argba%28255%2C255%2C255%2C%2E5%29%7D%2Eel%2Dbutton%2Dgroup%20%2Eel%2Dbutton%2D%2Dinfo%3Afirst%2Dchild%7Bborder%2Dright%2Dcolor%3Argba%28255%2C255%2C255%2C%2E5%29%7D%2Eel%2Dbutton%2Dgroup%20%2Eel%2Dbutton%2D%2Dinfo%3Alast%2Dchild%7Bborder%2Dleft%2Dcolor%3Argba%28255%2C255%2C255%2C%2E5%29%7D%2Eel%2Dbutton%2Dgroup%20%2Eel%2Dbutton%2D%2Dinfo%3Anot%28%3Afirst%2Dchild%29%3Anot%28%3Alast%2Dchild%29%7Bborder%2Dleft%2Dcolor%3Argba%28255%2C255%2C255%2C%2E5%29%3Bborder%2Dright%2Dcolor%3Argba%28255%2C255%2C255%2C%2E5%29%7D%2Eel%2Dbutton%2Dgroup%20%2Eel%2Dbutton%7Bfloat%3Aleft%3Bposition%3Arelative%7D%2Eel%2Dbutton%2Dgroup%20%2Eel%2Dbutton%2B%2Eel%2Dbutton%7Bmargin%2Dleft%3A0%7D%2Eel%2Dbutton%2Dgroup%20%2Eel%2Dbutton%3Afirst%2Dchild%7Bborder%2Dtop%2Dright%2Dradius%3A0%3Bborder%2Dbottom%2Dright%2Dradius%3A0%7D%2Eel%2Dbutton%2Dgroup%20%2Eel%2Dbutton%3Alast%2Dchild%7Bborder%2Dtop%2Dleft%2Dradius%3A0%3Bborder%2Dbottom%2Dleft%2Dradius%3A0%7D%2Eel%2Dbutton%2Dgroup%20%2Eel%2Dbutton%3Anot%28%3Afirst%2Dchild%29%3Anot%28%3Alast%2Dchild%29%7Bborder%2Dradius%3A0%7D%2Eel%2Dbutton%2Dgroup%20%2Eel%2Dbutton%2Eis%2Dactive%2C%2Eel%2Dbutton%2Dgroup%20%2Eel%2Dbutton%3Aactive%2C%2Eel%2Dbutton%2Dgroup%20%2Eel%2Dbutton%3Afocus%2C%2Eel%2Dbutton%2Dgroup%20%2Eel%2Dbutton%3Ahover%7Bz%2Dindex%3A1%7D%2Ev%2Dmodal%2Denter%7Banimation%3Av%2Dmodal%2Din%20%2E2s%20ease%7D%2Ev%2Dmodal%2Dleave%7Banimation%3Av%2Dmodal%2Dout%20%2E2s%20ease%20forwards%7D%40keyframes%20v%2Dmodal%2Din%7B0%25%7Bopacity%3A0%7D%7D%40keyframes%20v%2Dmodal%2Dout%7Bto%7Bopacity%3A0%7D%7D%2Ev%2Dmodal%7Bposition%3Afixed%3Bleft%3A0%3Btop%3A0%3Bwidth%3A100%25%3Bheight%3A100%25%3Bopacity%3A%2E5%3Bbackground%3A%23000%7D%2Eel%2Dmessage%2Dbox%7Btext%2Dalign%3Aleft%3Bdisplay%3Ainline%2Dblock%3Bbackground%2Dcolor%3A%23fff%3Bwidth%3A420px%3Bborder%2Dradius%3A3px%3Bfont%2Dsize%3A16px%3Boverflow%3Ahidden%3B%2Dwebkit%2Dbackface%2Dvisibility%3Ahidden%3Bbackface%2Dvisibility%3Ahidden%7D%2Eel%2Dmessage%2Dbox%5F%5Fwrapper%7Bposition%3Afixed%3Btop%3A0%3Bbottom%3A0%3Bleft%3A0%3Bright%3A0%3Btext%2Dalign%3Acenter%7D%2Eel%2Dmessage%2Dbox%5F%5Fwrapper%3A%3Aafter%7Bcontent%3A%22%22%3Bdisplay%3Ainline%2Dblock%3Bheight%3A100%25%3Bwidth%3A0%7D%2Eel%2Dmessage%2Dbox%5F%5Fheader%7Bposition%3Arelative%3Bpadding%3A20px%2020px%200%7D%2Eel%2Dmessage%2Dbox%5F%5Fcontent%7Bpadding%3A30px%2020px%3Bcolor%3A%23475669%3Bfont%2Dsize%3A14px%3Bposition%3Arelative%7D%2Eel%2Dmessage%2Dbox%5F%5Fclose%7Bdisplay%3Ainline%2Dblock%3Bposition%3Aabsolute%3Btop%3A19px%3Bright%3A20px%3Bcolor%3A%23999%3Bcursor%3Apointer%3Bline%2Dheight%3A20px%3Btext%2Dalign%3Acenter%7D%2Eel%2Dmessage%2Dbox%5F%5Fclose%3Ahover%7Bcolor%3A%2320a0ff%7D%2Eel%2Dmessage%2Dbox%5F%5Finput%7Bpadding%2Dtop%3A15px%7D%2Eel%2Dmessage%2Dbox%5F%5Finput%20input%2Einvalid%2C%2Eel%2Dmessage%2Dbox%5F%5Finput%20input%2Einvalid%3Afocus%7Bborder%2Dcolor%3A%23ff4949%7D%2Eel%2Dmessage%2Dbox%5F%5Ferrormsg%7Bcolor%3A%23ff4949%3Bfont%2Dsize%3A12px%3Bmin%2Dheight%3A18px%3Bmargin%2Dtop%3A2px%7D%2Eel%2Dmessage%2Dbox%5F%5Ftitle%7Bpadding%2Dleft%3A0%3Bmargin%2Dbottom%3A0%3Bfont%2Dsize%3A16px%3Bfont%2Dweight%3A700%3Bheight%3A18px%3Bcolor%3A%23333%7D%2Eel%2Dmessage%2Dbox%5F%5Fmessage%7Bmargin%3A0%7D%2Eel%2Dmessage%2Dbox%5F%5Fmessage%20p%7Bmargin%3A0%3Bline%2Dheight%3A1%2E4%7D%2Eel%2Dmessage%2Dbox%5F%5Fbtns%7Bpadding%3A10px%2020px%2015px%3Btext%2Dalign%3Aright%7D%2Eel%2Dmessage%2Dbox%5F%5Fbtns%20button%3Anth%2Dchild%282%29%7Bmargin%2Dleft%3A10px%7D%2Eel%2Dmessage%2Dbox%5F%5Fbtns%2Dreverse%7B%2Dms%2Dflex%2Ddirection%3Arow%2Dreverse%3Bflex%2Ddirection%3Arow%2Dreverse%7D%2Eel%2Dmessage%2Dbox%5F%5Fstatus%7Bposition%3Aabsolute%3Btop%3A50%25%3B%2Dms%2Dtransform%3AtranslateY%28%2D50%25%29%3Btransform%3AtranslateY%28%2D50%25%29%3Bfont%2Dsize%3A36px%21important%7D%2Eel%2Dmessage%2Dbox%5F%5Fstatus%2Eel%2Dicon%2Dcircle%2Dcheck%7Bcolor%3A%2313ce66%7D%2Eel%2Dmessage%2Dbox%5F%5Fstatus%2Eel%2Dicon%2Dinformation%7Bcolor%3A%2350bfff%7D%2Eel%2Dmessage%2Dbox%5F%5Fstatus%2Eel%2Dicon%2Dwarning%7Bcolor%3A%23f7ba2a%7D%2Eel%2Dmessage%2Dbox%5F%5Fstatus%2Eel%2Dicon%2Dcircle%2Dcross%7Bcolor%3A%23ff4949%7D%2Emsgbox%2Dfade%2Denter%2Dactive%7Banimation%3Amsgbox%2Dfade%2Din%20%2E3s%7D%2Emsgbox%2Dfade%2Dleave%2Dactive%7Banimation%3Amsgbox%2Dfade%2Dout%20%2E3s%7D%40keyframes%20msgbox%2Dfade%2Din%7B0%25%7Btransform%3Atranslate3d%280%2C%2D20px%2C0%29%3Bopacity%3A0%7D100%25%7Btransform%3Atranslate3d%280%2C0%2C0%29%3Bopacity%3A1%7D%7D%40keyframes%20msgbox%2Dfade%2Dout%7B0%25%7Btransform%3Atranslate3d%280%2C0%2C0%29%3Bopacity%3A1%7D100%25%7Btransform%3Atranslate3d%280%2C%2D20px%2C0%29%3Bopacity%3A0%7D%7D%2Eel%2Ddate%2Dtable%7Bfont%2Dsize%3A12px%3Bmin%2Dwidth%3A224px%3Buser%2Dselect%3Anone%7D%2Eel%2Ddate%2Dtable%20td%7Bwidth%3A32px%3Bheight%3A32px%3Bbox%2Dsizing%3Aborder%2Dbox%3Btext%2Dalign%3Acenter%3Bcursor%3Apointer%7D%2Eel%2Dmonth%2Dtable%20td%20%2Ecell%2C%2Eel%2Dyear%2Dtable%20td%20%2Ecell%7Bwidth%3A48px%3Bheight%3A32px%3Bdisplay%3Ablock%3Bline%2Dheight%3A32px%7D%2Eel%2Ddate%2Dtable%20td%2Enext%2Dmonth%2C%2Eel%2Ddate%2Dtable%20td%2Eprev%2Dmonth%7Bcolor%3A%23ddd%7D%2Eel%2Ddate%2Dtable%20td%2Etoday%7Bcolor%3A%2320a0ff%7D%2Eel%2Ddate%2Dtable%20td%2Eavailable%3Ahover%7Bbackground%2Dcolor%3A%23e5e9f2%7D%2Eel%2Ddate%2Dtable%20td%2Ein%2Drange%7Bbackground%2Dcolor%3A%23D3ECFF%7D%2Eel%2Ddate%2Dtable%20td%2Ein%2Drange%3Ahover%7Bbackground%2Dcolor%3A%23AFDCFF%7D%2Eel%2Ddate%2Dtable%20td%2Ecurrent%2C%2Eel%2Ddate%2Dtable%20td%2Eend%2Ddate%2C%2Eel%2Ddate%2Dtable%20td%2Estart%2Ddate%7Bbackground%2Dcolor%3A%2320a0ff%21important%3Bcolor%3A%23fff%7D%2Eel%2Ddate%2Dtable%20td%2Edisabled%7Bbackground%2Dcolor%3A%23f4f4f4%3Bopacity%3A1%3Bcursor%3Anot%2Dallowed%3Bcolor%3A%23ccc%7D%2Eel%2Dfade%2Din%2Denter%2C%2Eel%2Dfade%2Din%2Dleave%2Dactive%2C%2Efade%2Din%2Dlinear%2Denter%2C%2Efade%2Din%2Dlinear%2Dleave%2C%2Efade%2Din%2Dlinear%2Dleave%2Dactive%7Bopacity%3A0%7D%2Eel%2Ddate%2Dtable%20td%2Eweek%7Bfont%2Dsize%3A80%25%3Bcolor%3A%238492a6%7D%2Eel%2Dmonth%2Dtable%2C%2Eel%2Dyear%2Dtable%7Bfont%2Dsize%3A12px%3Bmargin%3A%2D1px%3Bborder%2Dcollapse%3Acollapse%7D%2Eel%2Ddate%2Dtable%20th%7Bpadding%3A5px%3Bcolor%3A%238492a6%3Bfont%2Dweight%3A400%7D%2Eel%2Ddate%2Dtable%2Eis%2Dweek%2Dmode%20%2Eel%2Ddate%2Dtable%5F%5Frow%3Ahover%7Bbackground%2Dcolor%3A%23e5e9f2%7D%2Eel%2Ddate%2Dtable%2Eis%2Dweek%2Dmode%20%2Eel%2Ddate%2Dtable%5F%5Frow%2Ecurrent%7Bbackground%2Dcolor%3A%23D3ECFF%7D%2Eel%2Dmonth%2Dtable%20td%7Btext%2Dalign%3Acenter%3Bpadding%3A20px%203px%3Bcursor%3Apointer%7D%2Eel%2Dmonth%2Dtable%20td%20%2Ecell%7Bcolor%3A%23475669%7D%2Eel%2Dmonth%2Dtable%20td%20%2Ecell%3Ahover%7Bbackground%2Dcolor%3A%23e5e9f2%7D%2Eel%2Dmonth%2Dtable%20td%2Edisabled%20%2Ecell%7Bbackground%2Dcolor%3A%23f4f4f4%3Bcursor%3Anot%2Dallowed%3Bcolor%3A%23ccc%7D%2Eel%2Dmonth%2Dtable%20td%2Ecurrent%20%2Ecell%7Bbackground%2Dcolor%3A%2320a0ff%21important%3Bcolor%3A%23fff%7D%2Eel%2Dyear%2Dtable%20%2Eel%2Dicon%7Bcolor%3A%2399a9bf%7D%2Eel%2Dyear%2Dtable%20td%7Btext%2Dalign%3Acenter%3Bpadding%3A20px%203px%3Bcursor%3Apointer%7D%2Eel%2Dyear%2Dtable%20td%20%2Ecell%7Bcolor%3A%23475669%7D%2Eel%2Dyear%2Dtable%20td%20%2Ecell%3Ahover%7Bbackground%2Dcolor%3A%23e5e9f2%7D%2Eel%2Dyear%2Dtable%20td%2Edisabled%20%2Ecell%7Bbackground%2Dcolor%3A%23f4f4f4%3Bcursor%3Anot%2Dallowed%3Bcolor%3A%23ccc%7D%2Eel%2Dyear%2Dtable%20td%2Ecurrent%20%2Ecell%7Bbackground%2Dcolor%3A%2320a0ff%21important%3Bcolor%3A%23fff%7D%2Eel%2Ddate%2Drange%2Dpicker%7Bmin%2Dwidth%3A520px%7D%2Eel%2Ddate%2Drange%2Dpicker%20table%7Btable%2Dlayout%3Afixed%3Bwidth%3A100%25%7D%2Eel%2Ddate%2Drange%2Dpicker%20%2Eel%2Dpicker%2Dpanel%5F%5Fbody%7Bmin%2Dwidth%3A513px%7D%2Eel%2Ddate%2Drange%2Dpicker%20%2Eel%2Dpicker%2Dpanel%5F%5Fcontent%7Bmargin%3A0%7D%2Eel%2Ddate%2Drange%2Dpicker%2Ehas%2Dsidebar%2Ehas%2Dtime%7Bmin%2Dwidth%3A766px%7D%2Eel%2Ddate%2Drange%2Dpicker%2Ehas%2Dsidebar%7Bmin%2Dwidth%3A620px%7D%2Eel%2Ddate%2Drange%2Dpicker%2Ehas%2Dtime%7Bmin%2Dwidth%3A660px%7D%2Eel%2Ddate%2Drange%2Dpicker%5F%5Fheader%7Bposition%3Arelative%3Btext%2Dalign%3Acenter%3Bheight%3A28px%7D%2Eel%2Ddate%2Drange%2Dpicker%5F%5Fheader%20button%7Bfloat%3Aleft%7D%2Eel%2Ddate%2Drange%2Dpicker%5F%5Fheader%20div%7Bfont%2Dsize%3A14px%3Bmargin%2Dright%3A50px%7D%2Eel%2Ddate%2Drange%2Dpicker%5F%5Fcontent%7Bfloat%3Aleft%3Bwidth%3A50%25%3Bbox%2Dsizing%3Aborder%2Dbox%3Bmargin%3A0%3Bpadding%3A16px%7D%2Eel%2Ddate%2Drange%2Dpicker%5F%5Fcontent%2Eis%2Dright%20%2Eel%2Ddate%2Drange%2Dpicker%5F%5Fheader%20button%7Bfloat%3Aright%7D%2Eel%2Ddate%2Drange%2Dpicker%5F%5Fcontent%2Eis%2Dright%20%2Eel%2Ddate%2Drange%2Dpicker%5F%5Fheader%20div%7Bmargin%2Dleft%3A50px%3Bmargin%2Dright%3A50px%7D%2Eel%2Ddate%2Drange%2Dpicker%5F%5Fcontent%2Eis%2Dleft%7Bborder%2Dright%3A1px%20solid%20%23e4e4e4%7D%2Eel%2Ddate%2Drange%2Dpicker%5F%5Feditors%2Dwrap%7Bbox%2Dsizing%3Aborder%2Dbox%3Bdisplay%3Atable%2Dcell%7D%2Eel%2Ddate%2Drange%2Dpicker%5F%5Feditors%2Dwrap%2Eis%2Dright%7Btext%2Dalign%3Aright%7D%2Eel%2Ddate%2Drange%2Dpicker%5F%5Ftime%2Dheader%7Bposition%3Arelative%3Bborder%2Dbottom%3A1px%20solid%20%23e4e4e4%3Bfont%2Dsize%3A12px%3Bpadding%3A8px%205px%205px%3Bdisplay%3Atable%3Bwidth%3A100%25%3Bbox%2Dsizing%3Aborder%2Dbox%7D%2Eel%2Ddate%2Drange%2Dpicker%5F%5Ftime%2Dheader%3E%2Eel%2Dicon%2Darrow%2Dright%7Bfont%2Dsize%3A20px%3Bvertical%2Dalign%3Amiddle%3Bdisplay%3Atable%2Dcell%3Bcolor%3A%2399a9bf%7D%2Eel%2Ddate%2Drange%2Dpicker%5F%5Ftime%2Dpicker%2Dwrap%7Bposition%3Arelative%3Bdisplay%3Atable%2Dcell%3Bpadding%3A0%205px%7D%2Eel%2Ddate%2Drange%2Dpicker%5F%5Ftime%2Dpicker%2Dwrap%20%2Eel%2Dpicker%2Dpanel%7Bposition%3Aabsolute%3Btop%3A13px%3Bright%3A0%3Bz%2Dindex%3A1%3Bbackground%3A%23fff%7D%2Eel%2Dtime%2Drange%2Dpicker%7Bmin%2Dwidth%3A354px%3Boverflow%3Avisible%7D%2Eel%2Dtime%2Drange%2Dpicker%5F%5Fcontent%7Bposition%3Arelative%3Btext%2Dalign%3Acenter%3Bpadding%3A10px%7D%2Eel%2Dtime%2Drange%2Dpicker%5F%5Fcell%7Bbox%2Dsizing%3Aborder%2Dbox%3Bmargin%3A0%3Bpadding%3A4px%207px%207px%3Bwidth%3A50%25%3Bdisplay%3Ainline%2Dblock%7D%2Eel%2Dtime%2Drange%2Dpicker%5F%5Fheader%7Bmargin%2Dbottom%3A5px%3Btext%2Dalign%3Acenter%3Bfont%2Dsize%3A14px%7D%2Eel%2Dtime%2Drange%2Dpicker%5F%5Fbody%7Bborder%2Dradius%3A2px%3Bborder%3A1px%20solid%20%23D3DCE6%7D%2Eel%2Dtime%2Dspinner%2Ehas%2Dseconds%20%2Eel%2Dtime%2Dspinner%5F%5Fwrapper%7Bwidth%3A33%2E33333%25%7D%2Eel%2Dtime%2Dspinner%5F%5Fwrapper%7Bheight%3A190px%3Boverflow%3Ahidden%3Bdisplay%3Ainline%2Dblock%3Bwidth%3A50%25%3Bvertical%2Dalign%3Atop%3Bposition%3Arelative%3B%2Dms%2Doverflow%2Dstyle%3Anone%7D%2Eel%2Dtime%2Dspinner%5F%5Fwrapper%3Ahover%7Boverflow%2Dy%3Aauto%7D%2Eel%2Dtime%2Dspinner%5F%5Flist%7Bpadding%3A0%3Bmargin%3A0%3Blist%2Dstyle%3Anone%3Btext%2Dalign%3Acenter%7D%2Eel%2Dtime%2Dspinner%5F%5Flist%3A%3Aafter%2C%2Eel%2Dtime%2Dspinner%5F%5Flist%3A%3Abefore%7Bcontent%3A%27%27%3Bdisplay%3Ablock%3Bwidth%3A100%25%3Bheight%3A80px%7D%2Eel%2Dtime%2Dspinner%5F%5Fitem%7Bheight%3A32px%3Bline%2Dheight%3A32px%3Bfont%2Dsize%3A12px%7D%2Eel%2Dtime%2Dspinner%5F%5Fitem%3Ahover%3Anot%28%2Edisabled%29%3Anot%28%2Eactive%29%7Bbackground%3A%23e5e9f2%3Bcursor%3Apointer%7D%2Eel%2Dtime%2Dspinner%5F%5Fitem%2Eactive%3Anot%28%2Edisabled%29%7Bcolor%3A%23fff%7D%2Eel%2Dtime%2Dspinner%5F%5Fitem%2Edisabled%7Bcolor%3A%23D3DCE6%3Bcursor%3Anot%2Dallowed%7D%2Eel%2Dtime%2Dpanel%7Bmargin%3A5px%200%3Bborder%3A1px%20solid%20%23D3DCE6%3Bbackground%2Dcolor%3A%23fff%3Bborder%2Dradius%3A2px%3Bposition%3Aabsolute%3Bwidth%3A180px%3Bleft%3A0%3Bz%2Dindex%3A1000%3B%2Dwebkit%2Duser%2Dselect%3Anone%3B%2Dmoz%2Duser%2Dselect%3Anone%3B%2Dms%2Duser%2Dselect%3Anone%3Buser%2Dselect%3Anone%7D%2Eel%2Dtime%2Dpanel%5F%5Fcontent%7Bfont%2Dsize%3A0%3Bposition%3Arelative%3Boverflow%3Ahidden%7D%2Eel%2Dtime%2Dpanel%5F%5Fcontent%3A%3Aafter%2C%2Eel%2Dtime%2Dpanel%5F%5Fcontent%3A%3Abefore%7Bcontent%3A%22%3A%22%3Btop%3A50%25%3Bcolor%3A%23fff%3Bposition%3Aabsolute%3Bfont%2Dsize%3A14px%3Bmargin%2Dtop%3A%2D15px%3Bline%2Dheight%3A16px%3Bbackground%2Dcolor%3A%2320a0ff%3Bheight%3A32px%3Bz%2Dindex%3A%2D1%3Bleft%3A0%3Bright%3A0%3Bbox%2Dsizing%3Aborder%2Dbox%3Bpadding%2Dtop%3A6px%3Btext%2Dalign%3Aleft%7D%2Eel%2Dtime%2Dpanel%5F%5Fcontent%3A%3Aafter%7Bleft%3A50%25%3Bmargin%2Dleft%3A%2D2px%7D%2Eel%2Dtime%2Dpanel%5F%5Fcontent%3A%3Abefore%7Bpadding%2Dleft%3A50%25%3Bmargin%2Dright%3A%2D2px%7D%2Eel%2Dtime%2Dpanel%5F%5Fcontent%2Ehas%2Dseconds%3A%3Aafter%7Bleft%3A66%2E66667%25%7D%2Eel%2Dtime%2Dpanel%5F%5Fcontent%2Ehas%2Dseconds%3A%3Abefore%7Bpadding%2Dleft%3A33%2E33333%25%7D%2Eel%2Dtime%2Dpanel%5F%5Ffooter%7Bborder%2Dtop%3A1px%20solid%20%23e4e4e4%3Bpadding%3A4px%3Bheight%3A36px%3Bline%2Dheight%3A25px%3Btext%2Dalign%3Aright%3Bbox%2Dsizing%3Aborder%2Dbox%7D%2Eel%2Dtime%2Dpanel%5F%5Fbtn%7Bborder%3Anone%3Bline%2Dheight%3A28px%3Bpadding%3A0%205px%3Bmargin%3A0%205px%3Bcursor%3Apointer%3Bbackground%2Dcolor%3Atransparent%3Boutline%3A0%3Bfont%2Dsize%3A12px%3Bcolor%3A%238492a6%7D%2Eel%2Dtime%2Dpanel%5F%5Fbtn%2Econfirm%7Bfont%2Dweight%3A800%3Bcolor%3A%2320a0ff%7D%2Efade%2Din%2Dlinear%2Denter%2Dactive%2C%2Efade%2Din%2Dlinear%2Dleave%2Dactive%7Btransition%3Aopacity%20%2E2s%20linear%7D%2Eel%2Dfade%2Din%2Denter%2Dactive%2C%2Eel%2Dfade%2Din%2Dleave%2Dactive%2C%2Eel%2Dzoom%2Din%2Dcenter%2Denter%2Dactive%2C%2Eel%2Dzoom%2Din%2Dcenter%2Dleave%2Dactive%7Btransition%3Aall%20%2E3s%20cubic%2Dbezier%28%2E55%2C0%2C%2E1%2C1%29%7D%2Eel%2Dzoom%2Din%2Dcenter%2Denter%2C%2Eel%2Dzoom%2Din%2Dcenter%2Dleave%2Dactive%7Bopacity%3A0%3B%2Dms%2Dtransform%3AscaleX%280%29%3Btransform%3AscaleX%280%29%7D%2Eel%2Dzoom%2Din%2Dtop%2Denter%2Dactive%2C%2Eel%2Dzoom%2Din%2Dtop%2Dleave%2Dactive%7Bopacity%3A1%3B%2Dms%2Dtransform%3AscaleY%281%29%3Btransform%3AscaleY%281%29%3Btransition%3Atransform%20%2E3s%20cubic%2Dbezier%28%2E23%2C1%2C%2E32%2C1%29%20%2E1s%2Copacity%20%2E3s%20cubic%2Dbezier%28%2E23%2C1%2C%2E32%2C1%29%20%2E1s%3B%2Dms%2Dtransform%2Dorigin%3Acenter%20top%3Btransform%2Dorigin%3Acenter%20top%7D%2Eel%2Dzoom%2Din%2Dtop%2Denter%2C%2Eel%2Dzoom%2Din%2Dtop%2Dleave%2Dactive%7Bopacity%3A0%3B%2Dms%2Dtransform%3AscaleY%280%29%3Btransform%3AscaleY%280%29%7D%2Eel%2Dzoom%2Din%2Dbottom%2Denter%2Dactive%2C%2Eel%2Dzoom%2Din%2Dbottom%2Dleave%2Dactive%7Bopacity%3A1%3B%2Dms%2Dtransform%3AscaleY%281%29%3Btransform%3AscaleY%281%29%3Btransition%3Atransform%20%2E3s%20cubic%2Dbezier%28%2E23%2C1%2C%2E32%2C1%29%20%2E1s%2Copacity%20%2E3s%20cubic%2Dbezier%28%2E23%2C1%2C%2E32%2C1%29%20%2E1s%3B%2Dms%2Dtransform%2Dorigin%3Acenter%20bottom%3Btransform%2Dorigin%3Acenter%20bottom%7D%2Eel%2Dzoom%2Din%2Dbottom%2Denter%2C%2Eel%2Dzoom%2Din%2Dbottom%2Dleave%2Dactive%7Bopacity%3A0%3B%2Dms%2Dtransform%3AscaleY%280%29%3Btransform%3AscaleY%280%29%7D%2Eel%2Ddate%2Deditor%7Bposition%3Arelative%3Bdisplay%3Ainline%2Dblock%7D%2Eel%2Ddate%2Deditor%20%2Eel%2Dpicker%2Dpanel%7Bposition%3Aabsolute%3Bmin%2Dwidth%3A180px%3Bbox%2Dsizing%3Aborder%2Dbox%3Bbox%2Dshadow%3A0%202px%206px%20%23ccc%3Bbackground%3A%23fff%3Bz%2Dindex%3A10%3Btop%3A41px%7D%2Eel%2Dpicker%2Dpanel%7Bcolor%3A%23475669%3Bborder%3A1px%20solid%20%23D3DCE6%3Bbox%2Dshadow%3A0%202px%206px%20%23ccc%3Bbackground%3A%23fff%3Bborder%2Dradius%3A2px%3Bline%2Dheight%3A20px%3Bmargin%3A5px%200%7D%2Eel%2Dcard%2C%2Eel%2Dmenu%2D%2Dhorizontal%20%2Eel%2Dsubmenu%3E%2Eel%2Dmenu%2C%2Eel%2Dtabs%2D%2Dborder%2Dcard%7Bbox%2Dshadow%3A0%202px%204px%200%20rgba%280%2C0%2C0%2C%2E12%29%2C0%200%206px%200%20rgba%280%2C0%2C0%2C%2E04%29%7D%2Eel%2Dpicker%2Dpanel%5F%5Fbody%2Dwrapper%3A%3Aafter%2C%2Eel%2Dpicker%2Dpanel%5F%5Fbody%3A%3Aafter%7Bcontent%3A%22%22%3Bdisplay%3Atable%3Bclear%3Aboth%7D%2Eel%2Dpicker%2Dpanel%5F%5Fcontent%7Bposition%3Arelative%3Bmargin%3A15px%7D%2Eel%2Dpicker%2Dpanel%5F%5Ffooter%7Bborder%2Dtop%3A1px%20solid%20%23e4e4e4%3Bpadding%3A4px%3Btext%2Dalign%3Aright%3Bbackground%2Dcolor%3A%23fff%3Bposition%3Arelative%7D%2Eel%2Dpicker%2Dpanel%5F%5Fshortcut%7Bdisplay%3Ablock%3Bwidth%3A100%25%3Bborder%3A0%3Bbackground%2Dcolor%3Atransparent%3Bline%2Dheight%3A28px%3Bfont%2Dsize%3A14px%3Bcolor%3A%23475669%3Bpadding%2Dleft%3A12px%3Btext%2Dalign%3Aleft%3Boutline%3A0%3Bcursor%3Apointer%7D%2Eel%2Dpicker%2Dpanel%5F%5Fshortcut%3Ahover%7Bbackground%2Dcolor%3A%23e5e9f2%7D%2Eel%2Dpicker%2Dpanel%5F%5Fshortcut%2Eactive%7Bbackground%2Dcolor%3A%23e6f1fe%3Bcolor%3A%2320a0ff%7D%2Eel%2Dpicker%2Dpanel%5F%5Fbtn%7Bborder%3A1px%20solid%20%23dcdcdc%3Bcolor%3A%23333%3Bline%2Dheight%3A24px%3Bborder%2Dradius%3A2px%3Bpadding%3A0%2020px%3Bcursor%3Apointer%3Bbackground%2Dcolor%3Atransparent%3Boutline%3A0%3Bfont%2Dsize%3A12px%7D%2Eel%2Dpicker%2Dpanel%5F%5Fbtn%5Bdisabled%5D%7Bcolor%3A%23ccc%3Bcursor%3Anot%2Dallowed%7D%2Eel%2Dpicker%2Dpanel%5F%5Ficon%2Dbtn%7Bfont%2Dsize%3A12px%3Bcolor%3A%2399a9bf%3Bborder%3A0%3Bbackground%3A0%200%3Bcursor%3Apointer%3Boutline%3A0%3Bmargin%2Dtop%3A3px%7D%2Eel%2Ddate%2Dpicker%5F%5Fheader%2Dlabel%2Eactive%2C%2Eel%2Ddate%2Dpicker%5F%5Fheader%2Dlabel%3Ahover%2C%2Eel%2Dpicker%2Dpanel%5F%5Ficon%2Dbtn%3Ahover%7Bcolor%3A%2320a0ff%7D%2Eel%2Dinput%5F%5Finner%2C%2Eel%2Dtextarea%5F%5Finner%7Bbackground%2Dimage%3Anone%3Btransition%3Aborder%2Dcolor%20%2E2s%20cubic%2Dbezier%28%2E645%2C%2E045%2C%2E355%2C1%29%3Bbox%2Dsizing%3Aborder%2Dbox%7D%2Eel%2Dpicker%2Dpanel%5F%5Flink%2Dbtn%7Bcursor%3Apointer%3Bcolor%3A%2320a0ff%3Btext%2Ddecoration%3Anone%3Bpadding%3A15px%3Bfont%2Dsize%3A12px%7D%2Eel%2Dpicker%2Dpanel%20%5Bslot%3Dsidebar%5D%2C%2Eel%2Dpicker%2Dpanel%5F%5Fsidebar%7Bposition%3Aabsolute%3Btop%3A0%3Bbottom%3A0%3Bwidth%3A110px%3Bborder%2Dright%3A1px%20solid%20%23e4e4e4%3Bbox%2Dsizing%3Aborder%2Dbox%3Bpadding%2Dtop%3A6px%3Bbackground%2Dcolor%3A%23f9fafc%7D%2Eel%2Dpicker%2Dpanel%20%5Bslot%3Dsidebar%5D%2B%2Eel%2Dpicker%2Dpanel%5F%5Fbody%2C%2Eel%2Dpicker%2Dpanel%5F%5Fsidebar%2B%2Eel%2Dpicker%2Dpanel%5F%5Fbody%7Bmargin%2Dleft%3A110px%7D%2Eel%2Ddate%2Dpicker%7Bmin%2Dwidth%3A254px%7D%2Eel%2Ddate%2Dpicker%20%2Eel%2Dpicker%2Dpanel%5F%5Fcontent%7Bmin%2Dwidth%3A224px%7D%2Eel%2Ddate%2Dpicker%20table%7Btable%2Dlayout%3Afixed%3Bwidth%3A100%25%7D%2Eel%2Ddate%2Dpicker%2Ehas%2Dsidebar%2Ehas%2Dtime%7Bmin%2Dwidth%3A434px%7D%2Eel%2Ddate%2Dpicker%2Ehas%2Dsidebar%7Bmin%2Dwidth%3A370px%7D%2Eel%2Ddate%2Dpicker%2Ehas%2Dtime%7Bmin%2Dwidth%3A324px%7D%2Eel%2Ddate%2Dpicker%5F%5Feditor%2Dwrap%7Bposition%3Arelative%3Bdisplay%3Atable%2Dcell%3Bpadding%3A0%205px%7D%2Eel%2Ddate%2Dpicker%5F%5Ftime%2Dheader%7Bposition%3Arelative%3Bborder%2Dbottom%3A1px%20solid%20%23e4e4e4%3Bfont%2Dsize%3A12px%3Bpadding%3A8px%205px%205px%3Bdisplay%3Atable%3Bwidth%3A100%25%3Bbox%2Dsizing%3Aborder%2Dbox%7D%2Eel%2Ddate%2Dpicker%5F%5Fheader%7Bmargin%3A12px%3Btext%2Dalign%3Acenter%7D%2Eel%2Ddate%2Dpicker%5F%5Fheader%2Dlabel%7Bfont%2Dsize%3A14px%3Bpadding%3A0%205px%3Bline%2Dheight%3A22px%3Btext%2Dalign%3Acenter%3Bcursor%3Apointer%7D%2Eel%2Ddate%2Dpicker%5F%5Fprev%2Dbtn%7Bfloat%3Aleft%7D%2Eel%2Ddate%2Dpicker%5F%5Fnext%2Dbtn%7Bfloat%3Aright%7D%2Eel%2Ddate%2Dpicker%5F%5Ftime%2Dwrap%7Bpadding%3A10px%3Btext%2Dalign%3Acenter%7D%2Eel%2Ddate%2Dpicker%5F%5Ftime%2Dlabel%7Bfloat%3Aleft%3Bcursor%3Apointer%3Bline%2Dheight%3A30px%3Bmargin%2Dleft%3A10px%7D%2Etime%2Dselect%7Bmargin%3A5px%200%3Bmin%2Dwidth%3A0%7D%2Etime%2Dselect%20%2Eel%2Dpicker%2Dpanel%5F%5Fcontent%7Bmax%2Dheight%3A200px%3Boverflow%3Ahidden%3Bmargin%3A0%7D%2Etime%2Dselect%20%2Eel%2Dpicker%2Dpanel%5F%5Fcontent%3Ahover%7Boverflow%2Dy%3Aauto%7D%2Etime%2Dselect%2Ditem%7Bpadding%3A8px%2010px%3Bfont%2Dsize%3A14px%7D%2Etime%2Dselect%2Ditem%2Eselected%3Anot%28%2Edisabled%29%7Bbackground%2Dcolor%3A%2320a0ff%3Bcolor%3A%23fff%7D%2Etime%2Dselect%2Ditem%2Eselected%3Anot%28%2Edisabled%29%3Ahover%7Bbackground%2Dcolor%3A%2320a0ff%7D%2Etime%2Dselect%2Ditem%2Edisabled%7Bcolor%3A%23D3DCE6%3Bcursor%3Anot%2Dallowed%7D%2Etime%2Dselect%2Ditem%3Ahover%7Bbackground%2Dcolor%3A%23e5e9f2%3Bcursor%3Apointer%7D%2Eel%2Dinput%7Bposition%3Arelative%3Bfont%2Dsize%3A14px%7D%2Eel%2Dinput%2Eis%2Ddisabled%20%2Eel%2Dinput%5F%5Finner%7Bbackground%2Dcolor%3A%23EFF2F7%3Bborder%2Dcolor%3A%23D3DCE6%3Bcolor%3A%23bbb%3Bcursor%3Anot%2Dallowed%7D%2Eel%2Dinput%2Eis%2Ddisabled%20%2Eel%2Dinput%5F%5Finner%3A%3A%2Dwebkit%2Dinput%2Dplaceholder%7Bcolor%3A%23c0ccda%7D%2Eel%2Dinput%2Eis%2Ddisabled%20%2Eel%2Dinput%5F%5Finner%3A%3A%2Dmoz%2Dplaceholder%7Bcolor%3A%23c0ccda%7D%2Eel%2Dinput%2Eis%2Ddisabled%20%2Eel%2Dinput%5F%5Finner%3A%2Dms%2Dinput%2Dplaceholder%7Bcolor%3A%23c0ccda%7D%2Eel%2Dinput%2Eis%2Ddisabled%20%2Eel%2Dinput%5F%5Finner%3A%3Aplaceholder%7Bcolor%3A%23c0ccda%7D%2Eel%2Dinput%2Eis%2Dactive%20%2Eel%2Dinput%5F%5Finner%7Boutline%3A0%3Bborder%2Dcolor%3A%2320a0ff%7D%2Eel%2Dinput%5F%5Finner%7B%2Dmoz%2Dappearance%3Anone%3Bappearance%3Anone%3Bbackground%2Dcolor%3A%23fff%3Bborder%2Dradius%3A4px%3Bborder%3A1px%20solid%20%23c0ccda%3Bcolor%3A%231f2d3d%3Bdisplay%3Ablock%3Bfont%2Dsize%3Ainherit%3Bheight%3A36px%3Bline%2Dheight%3Anormal%3Bpadding%3A3px%2010px%3Bwidth%3A100%25%7D%2Eel%2Dinput%5F%5Finner%3A%3A%2Dwebkit%2Dinput%2Dplaceholder%7Bcolor%3A%2399a9bf%7D%2Eel%2Dinput%5F%5Finner%3A%3A%2Dmoz%2Dplaceholder%7Bcolor%3A%2399a9bf%7D%2Eel%2Dinput%5F%5Finner%3A%2Dms%2Dinput%2Dplaceholder%7Bcolor%3A%2399a9bf%7D%2Eel%2Dinput%5F%5Finner%3A%3Aplaceholder%7Bcolor%3A%2399a9bf%7D%2Eel%2Dinput%5F%5Finner%3Ahover%7Bborder%2Dcolor%3A%238492a6%7D%2Eel%2Dinput%5F%5Finner%3Afocus%7Boutline%3A0%3Bborder%2Dcolor%3A%2320a0ff%7D%2Eel%2Dinput%5F%5Ficon%7Bposition%3Aabsolute%3Bwidth%3A35px%3Bheight%3A100%25%3Bright%3A0%3Btop%3A0%3Btext%2Dalign%3Acenter%3Bcolor%3A%23c0ccda%7D%2Eel%2Dinput%5F%5Ficon%3Aafter%7Bcontent%3A%27%27%3Bheight%3A100%25%3Bwidth%3A0%3Bdisplay%3Ainline%2Dblock%3Bvertical%2Dalign%3Amiddle%7D%2Eel%2Dinput%5F%5Ficon%2B%2Eel%2Dinput%5F%5Finner%7Bpadding%2Dright%3A35px%7D%2Eel%2Dinput%2D%2Dlarge%7Bfont%2Dsize%3A16px%7D%2Eel%2Dinput%2D%2Dlarge%20%2Eel%2Dinput%5F%5Finner%7Bheight%3A42px%7D%2Eel%2Dinput%2D%2Dsmall%7Bfont%2Dsize%3A13px%7D%2Eel%2Dinput%2D%2Dsmall%20%2Eel%2Dinput%5F%5Finner%7Bheight%3A30px%7D%2Eel%2Dinput%2D%2Dmini%7Bfont%2Dsize%3A12px%7D%2Eel%2Dinput%2D%2Dmini%20%2Eel%2Dinput%5F%5Finner%7Bheight%3A22px%7D%2Eel%2Dinput%2Dgroup%7Bline%2Dheight%3Anormal%3Bdisplay%3Atable%3Bborder%2Dcollapse%3Aseparate%7D%2Eel%2Dinput%2Dgroup%3E%2Eel%2Dinput%5F%5Finner%7Bvertical%2Dalign%3Amiddle%3Bdisplay%3Atable%2Dcell%7D%2Eel%2Dinput%2Dgroup%5F%5Fappend%2C%2Eel%2Dinput%2Dgroup%5F%5Fprepend%7Bbackground%2Dcolor%3A%23f9fafc%3Bcolor%3A%2399a9bf%3Bvertical%2Dalign%3Amiddle%3Bdisplay%3Atable%2Dcell%3Bposition%3Arelative%3Bborder%3A1px%20solid%20%23c0ccda%3Bborder%2Dradius%3A4px%3Bpadding%3A0%2010px%3Bwidth%3A1%25%3Bwhite%2Dspace%3Anowrap%7D%2Eel%2Dinput%2Dgroup%2D%2Dprepend%20%2Eel%2Dinput%5F%5Finner%2C%2Eel%2Dinput%2Dgroup%5F%5Fappend%7Bborder%2Dtop%2Dleft%2Dradius%3A0%3Bborder%2Dbottom%2Dleft%2Dradius%3A0%7D%2Eel%2Dinput%2Dgroup%2D%2Dappend%20%2Eel%2Dinput%5F%5Finner%2C%2Eel%2Dinput%2Dgroup%5F%5Fprepend%7Bborder%2Dtop%2Dright%2Dradius%3A0%3Bborder%2Dbottom%2Dright%2Dradius%3A0%7D%2Eel%2Dinput%2Dgroup%5F%5Fappend%20%2Eel%2Dbutton%2C%2Eel%2Dinput%2Dgroup%5F%5Fappend%20%2Eel%2Dselect%2C%2Eel%2Dinput%2Dgroup%5F%5Fprepend%20%2Eel%2Dbutton%2C%2Eel%2Dinput%2Dgroup%5F%5Fprepend%20%2Eel%2Dselect%7Bdisplay%3Ablock%3Bmargin%3A%2D10px%7D%2Eel%2Dinput%2Dgroup%5F%5Fappend%20%2Eel%2Dbutton%2C%2Eel%2Dinput%2Dgroup%5F%5Fappend%20%2Eel%2Dselect%20%2Eel%2Dinput%5F%5Finner%2C%2Eel%2Dinput%2Dgroup%5F%5Fappend%20%2Eel%2Dselect%3Ahover%20%2Eel%2Dinput%5F%5Finner%2C%2Eel%2Dinput%2Dgroup%5F%5Fprepend%20%2Eel%2Dbutton%2C%2Eel%2Dinput%2Dgroup%5F%5Fprepend%20%2Eel%2Dselect%20%2Eel%2Dinput%5F%5Finner%2C%2Eel%2Dinput%2Dgroup%5F%5Fprepend%20%2Eel%2Dselect%3Ahover%20%2Eel%2Dinput%5F%5Finner%7Bborder%2Dcolor%3Atransparent%3Bbackground%2Dcolor%3Atransparent%3Bcolor%3Ainherit%3Bborder%2Dtop%3A0%3Bborder%2Dbottom%3A0%7D%2Eel%2Dinput%2Dgroup%5F%5Fappend%20%2Eel%2Dbutton%2C%2Eel%2Dinput%2Dgroup%5F%5Fappend%20%2Eel%2Dinput%2C%2Eel%2Dinput%2Dgroup%5F%5Fprepend%20%2Eel%2Dbutton%2C%2Eel%2Dinput%2Dgroup%5F%5Fprepend%20%2Eel%2Dinput%7Bfont%2Dsize%3Ainherit%7D%2Eel%2Dinput%2Dgroup%5F%5Fprepend%7Bborder%2Dright%3A0%7D%2Eel%2Dinput%2Dgroup%5F%5Fappend%7Bborder%2Dleft%3A0%7D%2Eel%2Dtextarea%2Eis%2Ddisabled%20%2Eel%2Dtextarea%5F%5Finner%7Bbackground%2Dcolor%3A%23EFF2F7%3Bborder%2Dcolor%3A%23D3DCE6%3Bcolor%3A%23bbb%3Bcursor%3Anot%2Dallowed%7D%2Eel%2Dtextarea%2Eis%2Ddisabled%20%2Eel%2Dtextarea%5F%5Finner%3A%3A%2Dwebkit%2Dinput%2Dplaceholder%7Bcolor%3A%23c0ccda%7D%2Eel%2Dtextarea%2Eis%2Ddisabled%20%2Eel%2Dtextarea%5F%5Finner%3A%3A%2Dmoz%2Dplaceholder%7Bcolor%3A%23c0ccda%7D%2Eel%2Dtextarea%2Eis%2Ddisabled%20%2Eel%2Dtextarea%5F%5Finner%3A%2Dms%2Dinput%2Dplaceholder%7Bcolor%3A%23c0ccda%7D%2Eel%2Dtextarea%2Eis%2Ddisabled%20%2Eel%2Dtextarea%5F%5Finner%3A%3Aplaceholder%7Bcolor%3A%23c0ccda%7D%2Eel%2Dtextarea%5F%5Finner%7Bdisplay%3Ablock%3Bresize%3Avertical%3Bpadding%3A5px%207px%3Bline%2Dheight%3A1%2E5%3Bwidth%3A100%25%3Bfont%2Dsize%3A14px%3Bcolor%3A%231f2d3d%3Bbackground%2Dcolor%3A%23fff%3Bborder%3A1px%20solid%20%23c0ccda%3Bborder%2Dradius%3A4px%7D%2Eel%2Dtextarea%5F%5Finner%3A%3A%2Dwebkit%2Dinput%2Dplaceholder%7Bcolor%3A%2399a9bf%7D%2Eel%2Dtextarea%5F%5Finner%3A%3A%2Dmoz%2Dplaceholder%7Bcolor%3A%2399a9bf%7D%2Eel%2Dtextarea%5F%5Finner%3A%2Dms%2Dinput%2Dplaceholder%7Bcolor%3A%2399a9bf%7D%2Eel%2Dtextarea%5F%5Finner%3A%3Aplaceholder%7Bcolor%3A%2399a9bf%7D%2Eel%2Dtextarea%5F%5Finner%3Ahover%7Bborder%2Dcolor%3A%238492a6%7D%2Eel%2Dtextarea%5F%5Finner%3Afocus%7Boutline%3A0%3Bborder%2Dcolor%3A%2320a0ff%7D%2Eel%2Dinput%2Dnumber%7Bdisplay%3Ainline%2Dblock%3Boverflow%3Ahidden%3Bwidth%3A180px%3Bposition%3Arelative%7D%2Eel%2Dinput%2Dnumber%20%2Eel%2Dinput%5F%5Finner%7B%2Dwebkit%2Dappearance%3Anone%3B%2Dmoz%2Dappearance%3Anone%3Bappearance%3Anone%3Bpadding%2Dright%3A82px%7D%2Eel%2Dinput%2Dnumber%2Eis%2Dwithout%2Dcontrols%20%2Eel%2Dinput%5F%5Finner%7Bpadding%2Dright%3A10px%7D%2Eel%2Dinput%2Dnumber%2Eis%2Ddisabled%20%2Eel%2Dinput%2Dnumber%5F%5Fdecrease%2C%2Eel%2Dinput%2Dnumber%2Eis%2Ddisabled%20%2Eel%2Dinput%2Dnumber%5F%5Fincrease%7Bborder%2Dcolor%3A%23D3DCE6%3Bcolor%3A%23D3DCE6%7D%2Eel%2Dinput%2Dnumber%2Eis%2Ddisabled%20%2Eel%2Dinput%2Dnumber%5F%5Fdecrease%3Ahover%2C%2Eel%2Dinput%2Dnumber%2Eis%2Ddisabled%20%2Eel%2Dinput%2Dnumber%5F%5Fincrease%3Ahover%7Bcolor%3A%23D3DCE6%3Bcursor%3Anot%2Dallowed%7D%2Eel%2Dinput%2Dnumber%5F%5Fdecrease%2C%2Eel%2Dinput%2Dnumber%5F%5Fincrease%7Bheight%3Aauto%3Bborder%2Dleft%3A1px%20solid%20%23c0ccda%3Bwidth%3A36px%3Bline%2Dheight%3A34px%3Btop%3A1px%3Btext%2Dalign%3Acenter%3Bcolor%3A%2399A9BF%3Bcursor%3Apointer%3Bposition%3Aabsolute%7D%2Eel%2Dinput%2Dnumber%5F%5Fdecrease%3Ahover%2C%2Eel%2Dinput%2Dnumber%5F%5Fincrease%3Ahover%7Bcolor%3A%2320a0ff%7D%2Eel%2Dinput%2Dnumber%5F%5Fdecrease%2Eis%2Ddisabled%2C%2Eel%2Dinput%2Dnumber%5F%5Fincrease%2Eis%2Ddisabled%7Bcolor%3A%23D3DCE6%3Bcursor%3Anot%2Dallowed%7D%2Eel%2Dinput%2Dnumber%5F%5Fincrease%7Bright%3A0%7D%2Eel%2Dinput%2Dnumber%5F%5Fdecrease%7Bright%3A37px%7D%2Eel%2Dinput%2Dnumber%2D%2Dlarge%7Bwidth%3A200px%7D%2Eel%2Dinput%2Dnumber%2D%2Dlarge%20%2Eel%2Dinput%2Dnumber%5F%5Fdecrease%2C%2Eel%2Dinput%2Dnumber%2D%2Dlarge%20%2Eel%2Dinput%2Dnumber%5F%5Fincrease%7Bline%2Dheight%3A42px%3Bwidth%3A42px%3Bfont%2Dsize%3A16px%7D%2Eel%2Dinput%2Dnumber%2D%2Dlarge%20%2Eel%2Dinput%2Dnumber%5F%5Fdecrease%7Bright%3A43px%7D%2Eel%2Dinput%2Dnumber%2D%2Dlarge%20%2Eel%2Dinput%5F%5Finner%7Bpadding%2Dright%3A94px%7D%2Eel%2Dinput%2Dnumber%2D%2Dsmall%7Bwidth%3A130px%7D%2Eel%2Dinput%2Dnumber%2D%2Dsmall%20%2Eel%2Dinput%2Dnumber%5F%5Fdecrease%2C%2Eel%2Dinput%2Dnumber%2D%2Dsmall%20%2Eel%2Dinput%2Dnumber%5F%5Fincrease%7Bline%2Dheight%3A30px%3Bwidth%3A30px%3Bfont%2Dsize%3A13px%7D%2Eel%2Dinput%2Dnumber%2D%2Dsmall%20%2Eel%2Dinput%2Dnumber%5F%5Fdecrease%7Bright%3A31px%7D%2Eel%2Dinput%2Dnumber%2D%2Dsmall%20%2Eel%2Dinput%5F%5Finner%7Bpadding%2Dright%3A70px%7D%2Eel%2Dtag%7Bbackground%2Dcolor%3A%238492a6%3Bdisplay%3Ainline%2Dblock%3Bpadding%3A0%205px%3Bheight%3A24px%3Bline%2Dheight%3A22px%3Bfont%2Dsize%3A12px%3Bcolor%3A%23fff%3Bborder%2Dradius%3A4px%3Bbox%2Dsizing%3Aborder%2Dbox%3Bborder%3A1px%20solid%20transparent%7D%2Eel%2Dtag%20%2Eel%2Dicon%2Dclose%7Bborder%2Dradius%3A50%25%3Btext%2Dalign%3Acenter%3Bposition%3Arelative%3Bcursor%3Apointer%3Bfont%2Dsize%3A12px%3B%2Dms%2Dtransform%3Ascale%28%2E75%2C%2E75%29%3Btransform%3Ascale%28%2E75%2C%2E75%29%3Bheight%3A18px%3Bwidth%3A18px%3Bline%2Dheight%3A18px%3Bvertical%2Dalign%3Amiddle%3Btop%3A%2D1px%3Bright%3A%2D2px%7D%2Eel%2Dtag%20%2Eel%2Dicon%2Dclose%3Ahover%7Bbackground%2Dcolor%3A%23fff%3Bcolor%3A%238492a6%7D%2Eel%2Dtag%2D%2Dgray%7Bbackground%2Dcolor%3A%23e5e9f2%3Bborder%2Dcolor%3A%23e5e9f2%3Bcolor%3A%23475669%7D%2Eel%2Dtag%2D%2Dgray%20%2Eel%2Dtag%5F%5Fclose%3Ahover%7Bbackground%2Dcolor%3A%23475669%3Bcolor%3A%23fff%7D%2Eel%2Dtag%2D%2Dgray%2Eis%2Dhit%7Bborder%2Dcolor%3A%23475669%7D%2Eel%2Dtag%2D%2Dprimary%7Bbackground%2Dcolor%3Argba%2832%2C159%2C255%2C%2E1%29%3Bborder%2Dcolor%3Argba%2832%2C159%2C255%2C%2E2%29%3Bcolor%3A%2320a0ff%7D%2Eel%2Dtag%2D%2Dprimary%20%2Eel%2Dtag%5F%5Fclose%3Ahover%7Bbackground%2Dcolor%3A%2320a0ff%3Bcolor%3A%23fff%7D%2Eel%2Dtag%2D%2Dprimary%2Eis%2Dhit%7Bborder%2Dcolor%3A%2320a0ff%7D%2Eel%2Dtag%2D%2Dsuccess%7Bbackground%2Dcolor%3Argba%2818%2C206%2C102%2C%2E1%29%3Bborder%2Dcolor%3Argba%2818%2C206%2C102%2C%2E2%29%3Bcolor%3A%2313ce66%7D%2Eel%2Dtag%2D%2Dsuccess%20%2Eel%2Dtag%5F%5Fclose%3Ahover%7Bbackground%2Dcolor%3A%2313ce66%3Bcolor%3A%23fff%7D%2Eel%2Dtag%2D%2Dsuccess%2Eis%2Dhit%7Bborder%2Dcolor%3A%2313ce66%7D%2Eel%2Dtag%2D%2Dwarning%7Bbackground%2Dcolor%3Argba%28247%2C186%2C41%2C%2E1%29%3Bborder%2Dcolor%3Argba%28247%2C186%2C41%2C%2E2%29%3Bcolor%3A%23f7ba2a%7D%2Eel%2Dtag%2D%2Dwarning%20%2Eel%2Dtag%5F%5Fclose%3Ahover%7Bbackground%2Dcolor%3A%23f7ba2a%3Bcolor%3A%23fff%7D%2Eel%2Dtag%2D%2Dwarning%2Eis%2Dhit%7Bborder%2Dcolor%3A%23f7ba2a%7D%2Eel%2Dtag%2D%2Ddanger%7Bbackground%2Dcolor%3Argba%28255%2C73%2C73%2C%2E1%29%3Bborder%2Dcolor%3Argba%28255%2C73%2C73%2C%2E2%29%3Bcolor%3A%23ff4949%7D%2Eel%2Dform%2Ditem%2Eis%2Derror%20%2Eel%2Dinput%5F%5Finner%2C%2Eel%2Dform%2Ditem%2Eis%2Derror%20%2Eel%2Dtextarea%5F%5Finner%2C%2Eel%2Dtag%2D%2Ddanger%2Eis%2Dhit%7Bborder%2Dcolor%3A%23ff4949%7D%2Eel%2Dtag%2D%2Ddanger%20%2Eel%2Dtag%5F%5Fclose%3Ahover%7Bbackground%2Dcolor%3A%23ff4949%3Bcolor%3A%23fff%7D%2Eel%2Dbreadcrumb%7Bfont%2Dsize%3A13px%3Bline%2Dheight%3A1%7D%2Eel%2Dbreadcrumb%5F%5Fseparator%7Bmargin%3A0%208px%3Bcolor%3A%23c0ccda%7D%2Eel%2Dbreadcrumb%5F%5Fitem%7Bfloat%3Aleft%7D%2Eel%2Dbreadcrumb%5F%5Fitem%3Alast%2Dchild%20%2Eel%2Dbreadcrumb%5F%5Fitem%5F%5Finner%2C%2Eel%2Dbreadcrumb%5F%5Fitem%3Alast%2Dchild%20%2Eel%2Dbreadcrumb%5F%5Fitem%5F%5Finner%20a%2C%2Eel%2Dbreadcrumb%5F%5Fitem%3Alast%2Dchild%20%2Eel%2Dbreadcrumb%5F%5Fitem%5F%5Finner%20a%3Ahover%2C%2Eel%2Dbreadcrumb%5F%5Fitem%3Alast%2Dchild%20%2Eel%2Dbreadcrumb%5F%5Fitem%5F%5Finner%3Ahover%7Bcolor%3A%2399a9bf%3Bcursor%3Atext%7D%2Eel%2Dbreadcrumb%5F%5Fitem%3Alast%2Dchild%20%2Eel%2Dbreadcrumb%5F%5Fseparator%7Bdisplay%3Anone%7D%2Eel%2Dbreadcrumb%5F%5Fitem%5F%5Finner%2C%2Eel%2Dbreadcrumb%5F%5Fitem%5F%5Finner%20a%7Btransition%3Acolor%20%2E15s%20linear%3Bcolor%3A%23475669%7D%2Eel%2Dbreadcrumb%5F%5Fitem%5F%5Finner%20a%3Ahover%2C%2Eel%2Dbreadcrumb%5F%5Fitem%5F%5Finner%3Ahover%7Bcolor%3A%2320a0ff%3Bcursor%3Apointer%7D%2Eel%2Dform%2D%2Dlabel%2Dleft%20%2Eel%2Dform%2Ditem%5F%5Flabel%7Btext%2Dalign%3Aleft%7D%2Eel%2Dform%2D%2Dlabel%2Dtop%20%2Eel%2Dform%2Ditem%5F%5Flabel%7Bfloat%3Anone%3Bdisplay%3Ainline%2Dblock%3Bpadding%3A0%200%2010px%7D%2Eel%2Dform%2D%2Dinline%20%2Eel%2Dform%2Ditem%7Bdisplay%3Ainline%2Dblock%3Bmargin%2Dright%3A10px%3Bvertical%2Dalign%3Atop%7D%2Eel%2Dform%2Ditem%7Bmargin%2Dbottom%3A22px%7D%2Eel%2Dform%2Ditem%20%2Eel%2Dform%2Ditem%7Bmargin%2Dbottom%3A0%7D%2Eel%2Dform%2Ditem%20%2Eel%2Dform%2Ditem%20%2Eel%2Dform%2Ditem%5F%5Fcontent%7Bmargin%2Dleft%3A0%21important%7D%2Eel%2Dform%2Ditem%2Eis%2Drequired%20%2Eel%2Dform%2Ditem%5F%5Flabel%3Abefore%7Bcontent%3A%27%2A%27%3Bcolor%3A%23ff4949%3Bmargin%2Dright%3A4px%7D%2Eel%2Ddragger%5F%5Fcover%3Aafter%2C%2Eel%2Dmenu%3Aafter%2C%2Eel%2Dmenu%3Abefore%2C%2Eel%2Dprogress%2Dbar%5F%5Finner%3Aafter%2C%2Eel%2Drow%3Aafter%2C%2Eel%2Drow%3Abefore%7Bcontent%3A%22%22%7D%2Eel%2Dform%2Ditem%5F%5Flabel%7Btext%2Dalign%3Aright%3Bvertical%2Dalign%3Amiddle%3Bfloat%3Aleft%3Bfont%2Dsize%3A14px%3Bcolor%3A%235e6d82%3Bline%2Dheight%3A1%3Bpadding%3A11px%2012px%2011px%200%3Bbox%2Dsizing%3Aborder%2Dbox%7D%2Eel%2Dform%2Ditem%5F%5Fcontent%7Bline%2Dheight%3A36px%3Bposition%3Arelative%3Bfont%2Dsize%3A14px%7D%2Eel%2Dform%2Ditem%5F%5Ferror%7Bcolor%3A%23ff4949%3Bfont%2Dsize%3A12px%3Bline%2Dheight%3A1%3Bpadding%2Dtop%3A4px%3Bposition%3Aabsolute%3Btop%3A100%25%3Bleft%3A0%7D%2Eel%2Dtabs%7Bdisplay%3Ainline%2Dblock%7D%2Eel%2Dtabs%5F%5Fheader%7Bborder%2Dbottom%3A1px%20solid%20%23d3dce6%3Bpadding%3A0%3Bposition%3Arelative%3Bmargin%3A0%200%2015px%7D%2Eel%2Dtabs%5F%5Fheader%3Aafter%2C%2Eel%2Dtabs%5F%5Fheader%3Abefore%7Bdisplay%3Atable%3Bcontent%3A%22%22%7D%2Eel%2Dtabs%5F%5Factive%2Dbar%7Bposition%3Aabsolute%3Bbottom%3A0%3Bleft%3A0%3Bwidth%3A100%25%3Bheight%3A3px%3Bbackground%2Dcolor%3A%2320a0ff%3Bz%2Dindex%3A1%3Btransition%3Atransform%20%2E3s%20cubic%2Dbezier%28%2E645%2C%2E045%2C%2E355%2C1%29%3Blist%2Dstyle%3Anone%7D%2Eel%2Dtabs%2D%2Dcard%20%2Eel%2Dtabs%5F%5Fitem%2Eis%2Dactive%2Eis%2Dclosable%20%2Eel%2Dicon%2Dclose%2C%2Eel%2Dtabs%2D%2Dcard%20%2Eel%2Dtabs%5F%5Fitem%2Eis%2Dclosable%3Ahover%20%2Eel%2Dicon%2Dclose%7Bwidth%3A14px%7D%2Eel%2Dtabs%2D%2Dborder%2Dcard%20%2Eel%2Dtabs%5F%5Fitem%2C%2Eel%2Dtabs%2D%2Dcard%20%2Eel%2Dtabs%5F%5Fitem%2C%2Eel%2Dtabs%5F%5Fitem%20%2Eel%2Dicon%2Dclose%7Btransition%3Aall%20%2E3s%20cubic%2Dbezier%28%2E645%2C%2E045%2C%2E355%2C1%29%7D%2Eel%2Dtabs%5F%5Fitem%7Bpadding%3A0%2016px%3Bheight%3A42px%3Bbox%2Dsizing%3Aborder%2Dbox%3Bline%2Dheight%3A42px%3Bfloat%3Aleft%3Blist%2Dstyle%3Anone%3Bfont%2Dsize%3A14px%3Bcolor%3A%238492a6%3Bmargin%2Dbottom%3A%2D1px%3Bposition%3Arelative%7D%2Eel%2Dtabs%5F%5Fitem%20%2Eel%2Dicon%2Dclose%7Bborder%2Dradius%3A50%25%3Btext%2Dalign%3Acenter%3Bmargin%2Dleft%3A5px%7D%2Eel%2Dtabs%5F%5Fitem%20%2Eel%2Dicon%2Dclose%3Abefore%7B%2Dms%2Dtransform%3Ascale%28%2E7%2C%2E7%29%3Btransform%3Ascale%28%2E7%2C%2E7%29%3Bdisplay%3Ainline%2Dblock%7D%2Eel%2Dtabs%5F%5Fitem%20%2Eel%2Dicon%2Dclose%3Ahover%7Bbackground%2Dcolor%3A%2399a9bf%3Bcolor%3A%23fff%7D%2Eel%2Dtabs%5F%5Fitem%3Ahover%7Bcolor%3A%231f2d3d%3Bcursor%3Apointer%7D%2Eel%2Dtabs%5F%5Fitem%2Eis%2Ddisabled%7Bcolor%3A%23bbb%3Bcursor%3Adefault%7D%2Eel%2Dtabs%5F%5Fitem%2Eis%2Dactive%7Bcolor%3A%2320a0ff%7D%2Eel%2Dtabs%5F%5Fcontent%7Boverflow%3Ahidden%3Bposition%3Arelative%7D%2Eel%2Dtabs%2D%2Dcard%20%2Eel%2Dtabs%5F%5Factive%2Dbar%7Bdisplay%3Anone%7D%2Eel%2Dtab%2Dpane%2C%2EslideInLeft%2Dtransition%2C%2EslideInRight%2Dtransition%7Bdisplay%3Ainline%2Dblock%7D%2Eel%2Dtabs%2D%2Dcard%20%2Eel%2Dtabs%5F%5Fitem%7Bborder%3A1px%20solid%20transparent%7D%2Eel%2Dtabs%2D%2Dcard%20%2Eel%2Dtabs%5F%5Fitem%2Eis%2Dclosable%3Ahover%7Bpadding%2Dright%3A9px%3Bpadding%2Dleft%3A9px%7D%2Eel%2Dtabs%2D%2Dcard%20%2Eel%2Dtabs%5F%5Fitem%2Eis%2Dactive%7Bborder%3A1px%20solid%20%23d3dce6%3Bborder%2Dbottom%2Dcolor%3A%23fff%3Bborder%2Dradius%3A4px%204px%200%200%7D%2Eel%2Dtabs%2D%2Dcard%20%2Eel%2Dtabs%5F%5Fitem%2Eis%2Dactive%2Eis%2Dclosable%7Bpadding%2Dright%3A16px%3Bpadding%2Dleft%3A16px%7D%2Eel%2Dtabs%2D%2Dcard%20%2Eel%2Dtabs%5F%5Fitem%20%2Eel%2Dicon%2Dclose%7Bposition%3Arelative%3Bfont%2Dsize%3A12px%3Bwidth%3A0%3Bheight%3A14px%3Bvertical%2Dalign%3Amiddle%3Bline%2Dheight%3A15px%3Boverflow%3Ahidden%3Btop%3A%2D1px%3Bright%3A%2D2px%3B%2Dms%2Dtransform%2Dorigin%3A100%25%2050%25%3Btransform%2Dorigin%3A100%25%2050%25%7D%2Eel%2Dtabs%2D%2Dborder%2Dcard%7Bbackground%3A%23fff%3Bborder%3A1px%20solid%20%23d3dce6%7D%2Eel%2Dtabs%2D%2Dborder%2Dcard%20%2Eel%2Dtabs%5F%5Fcontent%7Bpadding%3A15px%7D%2Eel%2Dtabs%2D%2Dborder%2Dcard%20%2Eel%2Dtabs%5F%5Fheader%7Bbackground%2Dcolor%3A%23eff2f7%3Bmargin%3A0%7D%2Eel%2Dtabs%2D%2Dborder%2Dcard%20%2Eel%2Dtabs%5F%5Fitem%7Bborder%3A1px%20solid%20transparent%3Bborder%2Dtop%3A0%3Bmargin%2Dright%3A%2D1px%3Bmargin%2Dleft%3A%2D1px%7D%2Eel%2Dtabs%2D%2Dborder%2Dcard%20%2Eel%2Dtabs%5F%5Fitem%2Eis%2Dactive%7Bbackground%2Dcolor%3A%23fff%3Bborder%2Dright%2Dcolor%3A%23d3dce6%3Bborder%2Dleft%2Dcolor%3A%23d3dce6%7D%2Eel%2Dtabs%2D%2Dborder%2Dcard%20%2Eel%2Dtabs%5F%5Fitem%2Eis%2Dactive%3Afirst%2Dchild%7Bborder%2Dleft%2Dcolor%3A%23d3dce6%7D%2Eel%2Dtabs%2D%2Dborder%2Dcard%20%2Eel%2Dtabs%5F%5Fitem%2Eis%2Dactive%3Alast%2Dchild%7Bborder%2Dright%2Dcolor%3A%23d3dce6%7D%2Eel%2Dtab%2Dpane%7Bwidth%3A100%25%7D%2EslideInRight%2Denter%7Banimation%3AslideInRight%2Denter%20%2E3s%7D%2EslideInRight%2Dleave%7Bposition%3Aabsolute%3Bleft%3A0%3Bright%3A0%3Banimation%3AslideInRight%2Dleave%20%2E3s%7D%2EslideInLeft%2Denter%7Banimation%3AslideInLeft%2Denter%20%2E3s%7D%2EslideInLeft%2Dleave%7Bposition%3Aabsolute%3Bleft%3A0%3Bright%3A0%3Banimation%3AslideInLeft%2Dleave%20%2E3s%7D%40keyframes%20slideInRight%2Denter%7B0%25%7Bopacity%3A0%3Btransform%2Dorigin%3A0%200%3Btransform%3AtranslateX%28100%25%29%7Dto%7Bopacity%3A1%3Btransform%2Dorigin%3A0%200%3Btransform%3AtranslateX%280%29%7D%7D%40keyframes%20slideInRight%2Dleave%7B0%25%7Btransform%2Dorigin%3A0%200%3Btransform%3AtranslateX%280%29%3Bopacity%3A1%7D100%25%7Btransform%2Dorigin%3A0%200%3Btransform%3AtranslateX%28100%25%29%3Bopacity%3A0%7D%7D%40keyframes%20slideInLeft%2Denter%7B0%25%7Bopacity%3A0%3Btransform%2Dorigin%3A0%200%3Btransform%3AtranslateX%28%2D100%25%29%7Dto%7Bopacity%3A1%3Btransform%2Dorigin%3A0%200%3Btransform%3AtranslateX%280%29%7D%7D%40keyframes%20slideInLeft%2Dleave%7B0%25%7Btransform%2Dorigin%3A0%200%3Btransform%3AtranslateX%280%29%3Bopacity%3A1%7D100%25%7Btransform%2Dorigin%3A0%200%3Btransform%3AtranslateX%28%2D100%25%29%3Bopacity%3A0%7D%7D%2Eel%2Dprogress%2Dbar%5F%5Finner%3Aafter%7Bdisplay%3Ainline%2Dblock%3Bheight%3A100%25%3Bvertical%2Dalign%3Amiddle%7D%2Eel%2Dtree%7Bcursor%3Adefault%3Bbackground%3A%23fff%3Bborder%3A1px%20solid%20%23d3dce6%7D%2Eel%2Dtree%5F%5Fempty%2Dblock%7Bposition%3Arelative%3Bmin%2Dheight%3A60px%3Btext%2Dalign%3Acenter%3Bwidth%3A100%25%3Bheight%3A100%25%7D%2Eel%2Dtree%5F%5Fempty%2Dtext%7Bposition%3Aabsolute%3Bleft%3A50%25%3Btop%3A50%25%3B%2Dms%2Dtransform%3Atranslate%28%2D50%25%2C%2D50%25%29%3Btransform%3Atranslate%28%2D50%25%2C%2D50%25%29%3Bcolor%3A%235e6d82%7D%2Eel%2Dtree%2Dnode%7Bwhite%2Dspace%3Anowrap%7D%2Eel%2Dtree%2Dnode%3E%2Eel%2Dtree%2Dnode%5F%5Fchildren%7Boverflow%3Ahidden%3Bbackground%2Dcolor%3Atransparent%3Bdisplay%3Anone%7D%2Eel%2Dtree%2Dnode%2Eis%2Dexpanded%3E%2Eel%2Dtree%2Dnode%5F%5Fchildren%7Bdisplay%3Ablock%7D%2Eel%2Dtree%2Dnode%5F%5Fexpand%2Dicon%2C%2Eel%2Dtree%2Dnode%5F%5Flabel%2C%2Eel%2Dtree%2Dnode%5F%5Floading%2Dicon%7Bdisplay%3Ainline%2Dblock%3Bvertical%2Dalign%3Amiddle%7D%2Eel%2Dtree%2Dnode%5F%5Fcontent%7Bline%2Dheight%3A36px%3Bheight%3A36px%3Bcursor%3Apointer%7D%2Eel%2Dtree%2Dnode%5F%5Fcontent%3E%2Eel%2Dcheckbox%2C%2Eel%2Dtree%2Dnode%5F%5Fcontent%3E%2Eel%2Dtree%2Dnode%5F%5Fexpand%2Dicon%7Bmargin%2Dright%3A8px%7D%2Eel%2Dtree%2Dnode%5F%5Fcontent%3E%2Eel%2Dcheckbox%7Bvertical%2Dalign%3Amiddle%7D%2Eel%2Dtree%2Dnode%5F%5Fcontent%3Ahover%7Bbackground%3A%23e5e9f2%7D%2Eel%2Dtree%2Dnode%5F%5Fexpand%2Dicon%7Bcursor%3Apointer%3Bwidth%3A0%3Bheight%3A0%3Bmargin%2Dleft%3A10px%3Bborder%3A6px%20solid%20transparent%3Bborder%2Dright%2Dwidth%3A0%3Bborder%2Dleft%2Dcolor%3A%2399a9bf%3Bborder%2Dleft%2Dwidth%3A7px%3B%2Dms%2Dtransform%3Arotate%280%29%3Btransform%3Arotate%280%29%3Btransition%3Atransform%20%2E3s%20ease%2Din%2Dout%7D%2Eel%2Dtree%2Dnode%5F%5Fexpand%2Dicon%3Ahover%7Bborder%2Dleft%2Dcolor%3A%23999%7D%2Eel%2Dtree%2Dnode%5F%5Fexpand%2Dicon%2Eexpanded%7B%2Dms%2Dtransform%3Arotate%2890deg%29%3Btransform%3Arotate%2890deg%29%7D%2Eel%2Dtree%2Dnode%5F%5Fexpand%2Dicon%2Eis%2Dleaf%7Bborder%2Dcolor%3Atransparent%3Bcursor%3Adefault%7D%2Eel%2Dtree%2Dnode%5F%5Flabel%7Bfont%2Dsize%3A14px%7D%2Eel%2Dtree%2Dnode%5F%5Floading%2Dicon%7Bmargin%2Dright%3A4px%3Bfont%2Dsize%3A14px%3Bcolor%3A%2399a9bf%7D%2Eel%2Dtree%2D%2Dhighlight%2Dcurrent%20%2Eel%2Dtree%2Dnode%2Eis%2Dcurrent%3E%2Eel%2Dtree%2Dnode%5F%5Fcontent%7Bbackground%2Dcolor%3A%23eff7ff%7D%2Ecollapse%2Dtransition%7Btransition%3A%2E3s%20height%20ease%2Din%2Dout%2C%2E3s%20padding%2Dtop%20ease%2Din%2Dout%2C%2E3s%20padding%2Dbottom%20ease%2Din%2Dout%7D%2Eel%2Dmenu%2Ditem%2C%2Eel%2Dsubmenu%5F%5Ftitle%7Bheight%3A56px%3Bline%2Dheight%3A56px%3Bfont%2Dsize%3A14px%3Bcolor%3A%23475669%3Bpadding%3A0%2020px%3Bcursor%3Apointer%3Bposition%3Arelative%3Btransition%3Aborder%2Dcolor%20%2E3s%2Cbackground%2Dcolor%20%2E3s%2Ccolor%20%2E3s%3Bbox%2Dsizing%3Aborder%2Dbox%3Bwhite%2Dspace%3Anowrap%7D%2Eel%2Dmenu%7Bborder%2Dradius%3A2px%3Blist%2Dstyle%3Anone%3Bposition%3Arelative%3Bmargin%3A0%3Bpadding%2Dleft%3A0%3Bbackground%2Dcolor%3A%23eff2f7%7D%2Eel%2Dmenu%3Aafter%2C%2Eel%2Dmenu%3Abefore%7Bdisplay%3Atable%7D%2Eel%2Dmenu%20li%7Blist%2Dstyle%3Anone%7D%2Eel%2Dmenu%2D%2Ddark%7Bbackground%2Dcolor%3A%23324057%7D%2Eel%2Dmenu%2D%2Ddark%20%2Eel%2Dmenu%2Ditem%2C%2Eel%2Dmenu%2D%2Ddark%20%2Eel%2Dsubmenu%5F%5Ftitle%7Bcolor%3A%23c0ccda%7D%2Eel%2Dmenu%2D%2Ddark%20%2Eel%2Dmenu%2Ditem%3Ahover%2C%2Eel%2Dmenu%2D%2Ddark%20%2Eel%2Dsubmenu%5F%5Ftitle%3Ahover%7Bbackground%2Dcolor%3A%23475669%7D%2Eel%2Dmenu%2D%2Ddark%20%2Eel%2Dsubmenu%20%2Eel%2Dmenu%7Bbackground%2Dcolor%3A%231f2f3d%7D%2Eel%2Dmenu%2D%2Ddark%20%2Eel%2Dsubmenu%20%2Eel%2Dmenu%20%2Eel%2Dmenu%2Ditem%3Ahover%7Bbackground%2Dcolor%3A%23475669%7D%2Eel%2Dmenu%2D%2Dhorizontal%20%2Eel%2Dmenu%2Ditem%7Bfloat%3Aleft%3Bheight%3A60px%3Bline%2Dheight%3A60px%3Bmargin%3A0%3Bcursor%3Apointer%3Bposition%3Arelative%3Bbox%2Dsizing%3Aborder%2Dbox%3Bborder%2Dbottom%3A5px%20solid%20transparent%7D%2Eel%2Dmenu%2D%2Dhorizontal%20%2Eel%2Dsubmenu%7Bfloat%3Aleft%3Bposition%3Arelative%7D%2Eel%2Dmenu%2D%2Dhorizontal%20%2Eel%2Dsubmenu%3E%2Eel%2Dmenu%7Bposition%3Aabsolute%3Btop%3A65px%3Bleft%3A0%3Bborder%3A1px%20solid%20%23d3dce6%3Bpadding%3A5px%200%3Bbackground%2Dcolor%3A%23fff%3Bz%2Dindex%3A100%3Bmin%2Dwidth%3A100%25%7D%2Eel%2Dmenu%2D%2Dhorizontal%20%2Eel%2Dsubmenu%20%2Eel%2Dsubmenu%5F%5Ftitle%7Bheight%3A60px%3Bline%2Dheight%3A60px%3Bborder%2Dbottom%3A5px%20solid%20transparent%7D%2Eel%2Dmenu%2D%2Dhorizontal%20%2Eel%2Dsubmenu%20%2Eel%2Dmenu%2Ditem%7Bbackground%2Dcolor%3A%23fff%3Bfloat%3Anone%3Bheight%3A36px%3Bline%2Dheight%3A36px%3Bpadding%3A0%2010px%7D%2Eel%2Dmenu%2D%2Dhorizontal%20%2Eel%2Dsubmenu%20%2Eel%2Dsubmenu%5F%5Ficon%2Darrow%7Bposition%3Astatic%3Bvertical%2Dalign%3Amiddle%3Bmargin%2Dleft%3A5px%3Bcolor%3A%2399a9bf%3Bmargin%2Dtop%3A%2D3px%7D%2Eel%2Dmenu%2D%2Dhorizontal%20%2Eel%2Dmenu%2Ditem%3Ahover%2C%2Eel%2Dmenu%2D%2Dhorizontal%20%2Eel%2Dsubmenu%5F%5Ftitle%3Ahover%7Bbackground%2Dcolor%3A%23eff2f7%7D%2Eel%2Dmenu%2D%2Dhorizontal%3E%2Eel%2Dmenu%2Ditem%3Ahover%2C%2Eel%2Dmenu%2D%2Dhorizontal%3E%2Eel%2Dsubmenu%2Eis%2Dactive%20%2Eel%2Dsubmenu%5F%5Ftitle%2C%2Eel%2Dmenu%2D%2Dhorizontal%3E%2Eel%2Dsubmenu%3Ahover%20%2Eel%2Dsubmenu%5F%5Ftitle%7Bborder%2Dbottom%3A5px%20solid%20%2320a0ff%7D%2Eel%2Dmenu%2D%2Dhorizontal%2Eel%2Dmenu%2D%2Ddark%20%2Eel%2Dmenu%2Ditem%3Ahover%2C%2Eel%2Dmenu%2D%2Dhorizontal%2Eel%2Dmenu%2D%2Ddark%20%2Eel%2Dsubmenu%5F%5Ftitle%3Ahover%7Bbackground%2Dcolor%3A%23324057%7D%2Eel%2Dmenu%2D%2Dhorizontal%2Eel%2Dmenu%2D%2Ddark%20%2Eel%2Dsubmenu%20%2Eel%2Dmenu%2Ditem%3Ahover%2C%2Eel%2Dmenu%2D%2Dhorizontal%2Eel%2Dmenu%2D%2Ddark%20%2Eel%2Dsubmenu%20%2Eel%2Dsubmenu%2Dtitle%3Ahover%2C%2Eel%2Dmenu%2Ditem%3Ahover%7Bbackground%2Dcolor%3A%23d3dce6%7D%2Eel%2Dmenu%2D%2Dhorizontal%2Eel%2Dmenu%2D%2Ddark%20%2Eel%2Dsubmenu%20%2Eel%2Dmenu%2Ditem%2C%2Eel%2Dmenu%2D%2Dhorizontal%2Eel%2Dmenu%2D%2Ddark%20%2Eel%2Dsubmenu%20%2Eel%2Dsubmenu%2Dtitle%7Bcolor%3A%23475669%7D%2Eel%2Dmenu%2D%2Dhorizontal%2Eel%2Dmenu%2D%2Ddark%20%2Eel%2Dsubmenu%20%2Eel%2Dmenu%2Ditem%2Eis%2Dactive%2C%2Eel%2Dmenu%2Ditem%2Eis%2Dactive%7Bcolor%3A%2320a0ff%7D%2Eel%2Dmenu%2Ditem%20%5Bclass%5E%3Del%2Dicon%2D%5D%7Bvertical%2Dalign%3Abaseline%3Bmargin%2Dright%3A10px%7D%2Eel%2Dmenu%2Ditem%3Afirst%2Dchild%7Bmargin%2Dleft%3A0%7D%2Eel%2Dmenu%2Ditem%3Alast%2Dchild%7Bmargin%2Dright%3A0%7D%2Eel%2Dsubmenu%20%5Bclass%5E%3Del%2Dicon%2D%5D%7Bvertical%2Dalign%3Abaseline%3Bmargin%2Dright%3A10px%7D%2Eel%2Dsubmenu%20%2Eel%2Dmenu%7Bbackground%2Dcolor%3A%23e5e9f2%7D%2Eel%2Dsubmenu%20%2Eel%2Dmenu%2Ditem%3Ahover%2C%2Eel%2Dsubmenu%5F%5Ftitle%3Ahover%7Bbackground%2Dcolor%3A%23d3dce6%7D%2Eel%2Dsubmenu%20%2Eel%2Dmenu%2Ditem%7Bheight%3A50px%3Bline%2Dheight%3A50px%3Bpadding%3A0%2045px%7D%2Eel%2Dsubmenu%2Eis%2Dopened%20%2Eel%2Dsubmenu%5F%5Ficon%2Darrow%7B%2Dms%2Dtransform%3Arotate%28180deg%29%3Btransform%3ArotateZ%28180deg%29%7D%2Eel%2Dsubmenu%2Eis%2Dactive%20%2Eel%2Dsubmenu%5F%5Ftitle%7Bborder%2Dbottom%2Dcolor%3A%2320a0ff%7D%2Eel%2Dsubmenu%5F%5Ftitle%7Bposition%3Arelative%7D%2Eel%2Dsubmenu%5F%5Ficon%2Darrow%7Bposition%3Aabsolute%3Btop%3A50%25%3Bright%3A20px%3Bmargin%2Dtop%3A%2D7px%3Btransition%3Atransform%20%2E3s%3Bfont%2Dsize%3A12px%7D%2Eel%2Dmenu%2Ditem%2Dgroup%3Eul%7Bpadding%3A0%7D%2Eel%2Dmenu%2Ditem%2Dgroup%5F%5Ftitle%7Bpadding%2Dtop%3A15px%3Bline%2Dheight%3Anormal%3Bfont%2Dsize%3A14px%3Bpadding%2Dleft%3A20px%3Bcolor%3A%2399a9bf%7D%2Eel%2Dprogress%7Bposition%3Arelative%3Bline%2Dheight%3A1%7D%2Eel%2Dprogress%2Eis%2Dexception%20%2Eel%2Dprogress%2Dbar%5F%5Finner%7Bbackground%2Dcolor%3A%23ff4949%7D%2Eel%2Dprogress%2Eis%2Dexception%20%2Eel%2Dprogress%5F%5Ftext%7Bcolor%3A%23ff4949%7D%2Eel%2Dprogress%2Eis%2Dsuccess%20%2Eel%2Dprogress%2Dbar%5F%5Finner%7Bbackground%2Dcolor%3A%2313ce66%7D%2Eel%2Dprogress%2Eis%2Dsuccess%20%2Eel%2Dprogress%5F%5Ftext%7Bcolor%3A%2313ce66%7D%2Eel%2Dprogress%5F%5Ftext%7Bfont%2Dsize%3A14px%3Bcolor%3A%23475669%3Bdisplay%3Ainline%2Dblock%3Bvertical%2Dalign%3Amiddle%3Bmargin%2Dleft%3A10px%3Bline%2Dheight%3A1%7D%2Eel%2Dprogress%5F%5Ftext%20i%7Bvertical%2Dalign%3Amiddle%3Bdisplay%3Ablock%7D%2Eel%2Dprogress%2D%2Dcircle%7Bdisplay%3Ainline%2Dblock%7D%2Eel%2Dprogress%2D%2Dcircle%20%2Eel%2Dprogress%5F%5Ftext%7Bposition%3Aabsolute%3Btop%3A50%25%3Bleft%3A0%3Bwidth%3A100%25%3Btext%2Dalign%3Acenter%3Bmargin%3A0%3B%2Dms%2Dtransform%3Atranslate%280%2C%2D50%25%29%3Btransform%3Atranslate%280%2C%2D50%25%29%7D%2Eel%2Dprogress%2D%2Dcircle%20%2Eel%2Dprogress%5F%5Ftext%20i%7Bvertical%2Dalign%3Amiddle%3Bdisplay%3Ainline%2Dblock%7D%2Eel%2Dprogress%2D%2Dwithout%2Dtext%20%2Eel%2Dprogress%5F%5Ftext%7Bdisplay%3Anone%7D%2Eel%2Dprogress%2D%2Dwithout%2Dtext%20%2Eel%2Dprogress%2Dbar%7Bpadding%2Dright%3A0%3Bmargin%2Dright%3A0%3Bdisplay%3Ablock%7D%2Eel%2Dprogress%2D%2Dtext%2Dinside%20%2Eel%2Dprogress%2Dbar%7Bpadding%2Dright%3A0%3Bmargin%2Dright%3A0%7D%2Eel%2Dprogress%2Dbar%7Bpadding%2Dright%3A50px%3Bdisplay%3Ainline%2Dblock%3Bvertical%2Dalign%3Amiddle%3Bwidth%3A100%25%3Bmargin%2Dright%3A%2D55px%3Bbox%2Dsizing%3Aborder%2Dbox%7D%2Eel%2Dprogress%2Dbar%5F%5Fouter%7Bheight%3A6px%3Bborder%2Dradius%3A100px%3Bbackground%2Dcolor%3A%23e5e9f2%3Boverflow%3Ahidden%3Bposition%3Arelative%3Bvertical%2Dalign%3Amiddle%7D%2Eel%2Dprogress%2Dbar%5F%5Finner%7Bposition%3Aabsolute%3Bleft%3A0%3Btop%3A0%3Bheight%3A100%25%3Bbackground%2Dcolor%3A%2320a0ff%3Btext%2Dalign%3Aright%3Bborder%2Dradius%3A100px%3Bline%2Dheight%3A1%7D%2Eel%2Ddragger%2C%2Eel%2Ddragger%2B%2Eel%2Dupload%5F%5Ftip%7Btext%2Dalign%3Acenter%7D%2Eel%2Dprogress%2Dbar%5F%5FinnerText%7Bdisplay%3Ainline%2Dblock%3Bvertical%2Dalign%3Amiddle%3Bcolor%3A%23fff%3Bfont%2Dsize%3A12px%3Bmargin%3A0%205px%7D%40keyframes%20progress%7B0%25%7Bbackground%2Dposition%3A0%200%7D100%25%7Bbackground%2Dposition%3A32px%200%7D%7D%2Eel%2Dupload%7Bwidth%3A360px%7D%2Eel%2Dupload%5F%5Finput%7Bdisplay%3Anone%7D%2Eel%2Dupload%5F%5Finner%7Bdisplay%3Ainline%2Dblock%3Bposition%3Arelative%7D%2Eel%2Dupload%5F%5Finner%20iframe%7Bposition%3Aabsolute%3Bz%2Dindex%3A%2D1%3Btop%3A0%3Bleft%3A0%3Bopacity%3A0%3Bfilter%3Aalpha%28opacity%3D0%29%7D%2Eel%2Dupload%5F%5Ffiles%7Bmargin%3A0%200%2010px%3Bpadding%3A0%3Blist%2Dstyle%3Anone%7D%2Eel%2Dupload%5F%5Ffile%7Btransition%3Aall%20%2E5s%20cubic%2Dbezier%28%2E55%2C0%2C%2E1%2C1%29%3Bfont%2Dsize%3A14px%3Bcolor%3A%23475669%3Bline%2Dheight%3A32px%3Bbox%2Dsizing%3Aborder%2Dbox%3Bborder%2Dradius%3A4px%3Bwidth%3A100%25%3Bposition%3Arelative%7D%2Eel%2Dupload%5F%5Ffile%20a%7Bcolor%3A%23475669%3Bdisplay%3Ablock%3Bmargin%2Dright%3A40px%3Boverflow%3Ahidden%3Bpadding%2Dleft%3A4px%3Btext%2Doverflow%3Aellipsis%3Btransition%3Acolor%20%2E3s%3Bwhite%2Dspace%3Anowrap%7D%2Eel%2Dupload%5F%5Ffile%20a%20%5Bclass%5E%3Del%2Dicon%5D%7Bcolor%3A%2399a9bf%3Bmargin%2Dright%3A7px%3Bheight%3A100%25%3Bline%2Dheight%3Ainherit%7D%2Eel%2Dupload%5F%5Ffile%20%2Eel%2Dprogress%2Dbar%7Bmargin%2Dright%3A0%3Bpadding%2Dright%3A0%7D%2Eel%2Dupload%5F%5Ffile%20%2Eel%2Dprogress%7Bposition%3Aabsolute%3Bbottom%3A%2D3px%3Bwidth%3A100%25%7D%2Eel%2Dupload%5F%5Ffile%20%2Eel%2Dprogress%5F%5Ftext%7Bposition%3Aabsolute%3Btop%3A%2D10px%3Bright%3A0%7D%2Eel%2Dupload%5F%5Ffile%3Ahover%7Bbackground%2Dcolor%3A%23eff2f7%7D%2Eel%2Dupload%5F%5Ffile%2Eis%2Dfinished%20a%3Ahover%7Bcolor%3A%2320a0ff%3Bcursor%3Apointer%7D%2Eel%2Dupload%5F%5Ffile%2Eis%2Dfinished%3Ahover%20%2Eel%2Dupload%5F%5Fbtn%2Ddelete%7Bdisplay%3Ablock%3Bcursor%3Apointer%7D%2Eel%2Dupload%5F%5Ftip%7Bfont%2Dsize%3A12px%3Bcolor%3A%238492a6%3Bmargin%2Dtop%3A7px%7D%2Eel%2Dupload%5F%5Fbtn%2Ddelete%7Bposition%3Aabsolute%3Bright%3A15px%3Btop%3A0%3Bfont%2Dsize%3A12px%3Bcolor%3A%2320a0ff%3Bdisplay%3Anone%7D%2Eel%2Ddragger%7Bbackground%2Dcolor%3A%23f9fafc%3Bborder%3A1px%20solid%20%23c0ccda%3Bbox%2Dsizing%3Aborder%2Dbox%3Bwidth%3A360px%3Bheight%3A180px%3Bborder%2Dradius%3A4px%3Bcursor%3Apointer%3Bposition%3Arelative%3Boverflow%3Ahidden%7D%2Eel%2Ddragger%20%2Eel%2Dupload%5F%5Finner%7Bdisplay%3Ablock%3Bheight%3A100%25%7D%2Eel%2Ddragger%20%2Eel%2Dicon%2Dupload%7Bfont%2Dsize%3A67px%3Bcolor%3A%2399a9bf%3Bmargin%3A40px%200%2016px%3Bline%2Dheight%3A50px%7D%2Eel%2Ddragger%7E%2Eel%2Dupload%5F%5Ffiles%7Bmargin%2Dtop%3A7px%3Bpadding%2Dtop%3A5px%3Bborder%2Dtop%3A1px%20solid%20rgba%28192%2C204%2C218%2C%2E2%29%7D%2Eel%2Ddragger%3Anot%28%2Eis%2DshowCover%29%3Ahover%7Bborder%2Dcolor%3A%2320a0ff%7D%2Eel%2Ddragger%2Eis%2DdragOver%7Bbackground%2Dcolor%3Argba%2832%2C159%2C255%2C%2E06%29%3Bborder%3A2px%20dashed%20%2320a0ff%7D%2Eel%2Ddragger%5F%5Fcover%7Bposition%3Aabsolute%3Bleft%3A0%3Btop%3A0%3Bwidth%3A100%25%3Bheight%3A100%25%3Boverflow%3Ahidden%3Bz%2Dindex%3A10%3Bcursor%3Adefault%7D%2Eel%2Ddragger%5F%5Fcover%3Aafter%7Bdisplay%3Ainline%2Dblock%3Bheight%3A100%25%3Bvertical%2Dalign%3Amiddle%7D%2Eel%2Ddragger%5F%5Fcover%20img%7Bdisplay%3Ablock%3Bwidth%3A100%25%3Bheight%3A100%25%7D%2Eel%2Ddragger%5F%5Fcover%2B%2Eel%2Dupload%5F%5Finner%7Bopacity%3A0%3Bposition%3Arelative%3Bz%2Dindex%3A1%7D%2Eel%2Ddragger%5F%5Fcover%5F%5Fprogress%7Bdisplay%3Ainline%2Dblock%3Bvertical%2Dalign%3Amiddle%3Bposition%3Astatic%3Bwidth%3A243px%7D%2Eel%2Ddragger%5F%5Fcover%5F%5Fprogress%2B%2Eel%2Dupload%5F%5Finner%7Bopacity%3A0%7D%2Eel%2Ddragger%5F%5Fcover%5F%5Fcontent%7Bposition%3Aabsolute%3Btop%3A0%3Bleft%3A0%3Bwidth%3A100%25%3Bheight%3A100%25%7D%2Eel%2Ddragger%5F%5Fcover%5F%5Finteract%7Bposition%3Aabsolute%3Bbottom%3A0%3Bleft%3A0%3Bwidth%3A100%25%3Bheight%3A100%25%3Bbackground%2Dcolor%3Argba%280%2C0%2C0%2C%2E72%29%3Btext%2Dalign%3Acenter%7D%2Eel%2Ddragger%5F%5Fcover%5F%5Finteract%20%2Ebtn%7Bdisplay%3Ainline%2Dblock%3Bcolor%3A%23fff%3Bfont%2Dsize%3A14px%3Bcursor%3Apointer%3Bvertical%2Dalign%3Amiddle%3Btransition%3Atransform%20%2E3s%20cubic%2Dbezier%28%2E23%2C1%2C%2E32%2C1%29%20%2E1s%2Copacity%20%2E3s%20cubic%2Dbezier%28%2E23%2C1%2C%2E32%2C1%29%20%2E1s%3Bmargin%2Dtop%3A60px%7D%2Eel%2Ddragger%5F%5Fcover%5F%5Finteract%20%2Ebtn%20span%7Bopacity%3A0%3Btransition%3Aopacity%20%2E15s%20linear%7D%2Eel%2Ddragger%5F%5Fcover%5F%5Finteract%20%2Ebtn%3Anot%28%3Afirst%2Dchild%29%7Bmargin%2Dleft%3A35px%7D%2Eel%2Ddragger%5F%5Fcover%5F%5Finteract%20%2Ebtn%3Ahover%7B%2Dms%2Dtransform%3AtranslateY%28%2D13px%29%3Btransform%3AtranslateY%28%2D13px%29%7D%2Eel%2Ddragger%5F%5Fcover%5F%5Finteract%20%2Ebtn%3Ahover%20span%7Bopacity%3A1%7D%2Eel%2Ddragger%5F%5Fcover%5F%5Finteract%20%2Ebtn%20i%7Bcolor%3A%23fff%3Bdisplay%3Ablock%3Bfont%2Dsize%3A24px%3Bline%2Dheight%3Ainherit%3Bmargin%3A0%20auto%205px%7D%2Eel%2Ddragger%5F%5Fcover%5F%5Ftitle%7Bposition%3Aabsolute%3Bbottom%3A0%3Bleft%3A0%3Bbackground%2Dcolor%3A%23fff%3Bheight%3A36px%3Bwidth%3A100%25%3Boverflow%3Ahidden%3Btext%2Doverflow%3Aellipsis%3Bwhite%2Dspace%3Anowrap%3Bfont%2Dweight%3A400%3Btext%2Dalign%3Aleft%3Bpadding%3A0%2010px%3Bmargin%3A0%3Bline%2Dheight%3A36px%3Bfont%2Dsize%3A14px%3Bcolor%3A%23475669%7D%2Eel%2Ddragger%5F%5Ftext%7Bcolor%3A%2399a9bf%3Bfont%2Dsize%3A14px%3Btext%2Dalign%3Acenter%7D%2Eel%2Ddragger%5F%5Ftext%20em%7Bcolor%3A%2320a0ff%3Bfont%2Dstyle%3Anormal%7D%2Eel%2Drow%7Bposition%3Arelative%3Bbox%2Dsizing%3Aborder%2Dbox%7D%2Eel%2Drow%3Aafter%2C%2Eel%2Drow%3Abefore%7Bdisplay%3Atable%7D%2Eel%2Drow%2D%2Dflex%7Bdisplay%3A%2Dms%2Dflexbox%3Bdisplay%3Aflex%7D%2Eel%2Drow%2D%2Dflex%3Aafter%2C%2Eel%2Drow%2D%2Dflex%3Abefore%7Bdisplay%3Anone%7D%2Eel%2Dbadge%2C%2Eel%2Dbadge%5F%5Fcontent%2C%2Eel%2Dspinner%7Bdisplay%3Ainline%2Dblock%7D%2Eel%2Drow%2D%2Dflex%2Eis%2Dalign%2Dbottom%7B%2Dms%2Dflex%2Dalign%3Aend%3Balign%2Ditems%3Aflex%2Dend%7D%2Eel%2Drow%2D%2Dflex%2Eis%2Dalign%2Dmiddle%7B%2Dms%2Dflex%2Dalign%3Acenter%3Balign%2Ditems%3Acenter%7D%2Eel%2Drow%2D%2Dflex%2Eis%2Djustify%2Dspace%2Daround%7B%2Dms%2Dflex%2Dpack%3Adistribute%3Bjustify%2Dcontent%3Aspace%2Daround%7D%2Eel%2Drow%2D%2Dflex%2Eis%2Djustify%2Dspace%2Dbetween%7B%2Dms%2Dflex%2Dpack%3Ajustify%3Bjustify%2Dcontent%3Aspace%2Dbetween%7D%2Eel%2Drow%2D%2Dflex%2Eis%2Djustify%2Dend%7B%2Dms%2Dflex%2Dpack%3Aend%3Bjustify%2Dcontent%3Aflex%2Dend%7D%2Eel%2Drow%2D%2Dflex%2Eis%2Djustify%2Dcenter%7B%2Dms%2Dflex%2Dpack%3Acenter%3Bjustify%2Dcontent%3Acenter%7D%2Eel%2Dcol%2D1%2C%2Eel%2Dcol%2D10%2C%2Eel%2Dcol%2D11%2C%2Eel%2Dcol%2D12%2C%2Eel%2Dcol%2D13%2C%2Eel%2Dcol%2D14%2C%2Eel%2Dcol%2D15%2C%2Eel%2Dcol%2D16%2C%2Eel%2Dcol%2D17%2C%2Eel%2Dcol%2D18%2C%2Eel%2Dcol%2D19%2C%2Eel%2Dcol%2D2%2C%2Eel%2Dcol%2D20%2C%2Eel%2Dcol%2D21%2C%2Eel%2Dcol%2D22%2C%2Eel%2Dcol%2D23%2C%2Eel%2Dcol%2D24%2C%2Eel%2Dcol%2D3%2C%2Eel%2Dcol%2D4%2C%2Eel%2Dcol%2D5%2C%2Eel%2Dcol%2D6%2C%2Eel%2Dcol%2D7%2C%2Eel%2Dcol%2D8%2C%2Eel%2Dcol%2D9%7Bfloat%3Aleft%3Bbox%2Dsizing%3Aborder%2Dbox%7D%2Eel%2Dcol%2D1%2C%2Eel%2Dcol%2Dxs%2D1%7Bwidth%3A4%2E16667%25%7D%2Eel%2Dcol%2Doffset%2D1%2C%2Eel%2Dcol%2Dxs%2Doffset%2D1%7Bmargin%2Dleft%3A4%2E16667%25%7D%2Eel%2Dcol%2Dpull%2D1%2C%2Eel%2Dcol%2Dxs%2Dpull%2D1%7Bposition%3Arelative%3Bright%3A4%2E16667%25%7D%2Eel%2Dcol%2Dpush%2D1%2C%2Eel%2Dcol%2Dxs%2Dpush%2D1%7Bposition%3Arelative%3Bleft%3A4%2E16667%25%7D%2Eel%2Dcol%2D2%2C%2Eel%2Dcol%2Dxs%2D2%7Bwidth%3A8%2E33333%25%7D%2Eel%2Dcol%2Doffset%2D2%2C%2Eel%2Dcol%2Dxs%2Doffset%2D2%7Bmargin%2Dleft%3A8%2E33333%25%7D%2Eel%2Dcol%2Dpull%2D2%2C%2Eel%2Dcol%2Dxs%2Dpull%2D2%7Bposition%3Arelative%3Bright%3A8%2E33333%25%7D%2Eel%2Dcol%2Dpush%2D2%2C%2Eel%2Dcol%2Dxs%2Dpush%2D2%7Bposition%3Arelative%3Bleft%3A8%2E33333%25%7D%2Eel%2Dcol%2D3%2C%2Eel%2Dcol%2Dxs%2D3%7Bwidth%3A12%2E5%25%7D%2Eel%2Dcol%2Doffset%2D3%2C%2Eel%2Dcol%2Dxs%2Doffset%2D3%7Bmargin%2Dleft%3A12%2E5%25%7D%2Eel%2Dcol%2Dpull%2D3%2C%2Eel%2Dcol%2Dxs%2Dpull%2D3%7Bposition%3Arelative%3Bright%3A12%2E5%25%7D%2Eel%2Dcol%2Dpush%2D3%2C%2Eel%2Dcol%2Dxs%2Dpush%2D3%7Bposition%3Arelative%3Bleft%3A12%2E5%25%7D%2Eel%2Dcol%2D4%2C%2Eel%2Dcol%2Dxs%2D4%7Bwidth%3A16%2E66667%25%7D%2Eel%2Dcol%2Doffset%2D4%2C%2Eel%2Dcol%2Dxs%2Doffset%2D4%7Bmargin%2Dleft%3A16%2E66667%25%7D%2Eel%2Dcol%2Dpull%2D4%2C%2Eel%2Dcol%2Dxs%2Dpull%2D4%7Bposition%3Arelative%3Bright%3A16%2E66667%25%7D%2Eel%2Dcol%2Dpush%2D4%2C%2Eel%2Dcol%2Dxs%2Dpush%2D4%7Bposition%3Arelative%3Bleft%3A16%2E66667%25%7D%2Eel%2Dcol%2D5%2C%2Eel%2Dcol%2Dxs%2D5%7Bwidth%3A20%2E83333%25%7D%2Eel%2Dcol%2Doffset%2D5%2C%2Eel%2Dcol%2Dxs%2Doffset%2D5%7Bmargin%2Dleft%3A20%2E83333%25%7D%2Eel%2Dcol%2Dpull%2D5%2C%2Eel%2Dcol%2Dxs%2Dpull%2D5%7Bposition%3Arelative%3Bright%3A20%2E83333%25%7D%2Eel%2Dcol%2Dpush%2D5%2C%2Eel%2Dcol%2Dxs%2Dpush%2D5%7Bposition%3Arelative%3Bleft%3A20%2E83333%25%7D%2Eel%2Dcol%2D6%2C%2Eel%2Dcol%2Dxs%2D6%7Bwidth%3A25%25%7D%2Eel%2Dcol%2Doffset%2D6%2C%2Eel%2Dcol%2Dxs%2Doffset%2D6%7Bmargin%2Dleft%3A25%25%7D%2Eel%2Dcol%2Dpull%2D6%2C%2Eel%2Dcol%2Dxs%2Dpull%2D6%7Bposition%3Arelative%3Bright%3A25%25%7D%2Eel%2Dcol%2Dpush%2D6%2C%2Eel%2Dcol%2Dxs%2Dpush%2D6%7Bposition%3Arelative%3Bleft%3A25%25%7D%2Eel%2Dcol%2D7%2C%2Eel%2Dcol%2Dxs%2D7%7Bwidth%3A29%2E16667%25%7D%2Eel%2Dcol%2Doffset%2D7%2C%2Eel%2Dcol%2Dxs%2Doffset%2D7%7Bmargin%2Dleft%3A29%2E16667%25%7D%2Eel%2Dcol%2Dpull%2D7%2C%2Eel%2Dcol%2Dxs%2Dpull%2D7%7Bposition%3Arelative%3Bright%3A29%2E16667%25%7D%2Eel%2Dcol%2Dpush%2D7%2C%2Eel%2Dcol%2Dxs%2Dpush%2D7%7Bposition%3Arelative%3Bleft%3A29%2E16667%25%7D%2Eel%2Dcol%2D8%2C%2Eel%2Dcol%2Dxs%2D8%7Bwidth%3A33%2E33333%25%7D%2Eel%2Dcol%2Doffset%2D8%2C%2Eel%2Dcol%2Dxs%2Doffset%2D8%7Bmargin%2Dleft%3A33%2E33333%25%7D%2Eel%2Dcol%2Dpull%2D8%2C%2Eel%2Dcol%2Dxs%2Dpull%2D8%7Bposition%3Arelative%3Bright%3A33%2E33333%25%7D%2Eel%2Dcol%2Dpush%2D8%2C%2Eel%2Dcol%2Dxs%2Dpush%2D8%7Bposition%3Arelative%3Bleft%3A33%2E33333%25%7D%2Eel%2Dcol%2D9%2C%2Eel%2Dcol%2Dxs%2D9%7Bwidth%3A37%2E5%25%7D%2Eel%2Dcol%2Doffset%2D9%2C%2Eel%2Dcol%2Dxs%2Doffset%2D9%7Bmargin%2Dleft%3A37%2E5%25%7D%2Eel%2Dcol%2Dpull%2D9%2C%2Eel%2Dcol%2Dxs%2Dpull%2D9%7Bposition%3Arelative%3Bright%3A37%2E5%25%7D%2Eel%2Dcol%2Dpush%2D9%2C%2Eel%2Dcol%2Dxs%2Dpush%2D9%7Bposition%3Arelative%3Bleft%3A37%2E5%25%7D%2Eel%2Dcol%2D10%2C%2Eel%2Dcol%2Dxs%2D10%7Bwidth%3A41%2E66667%25%7D%2Eel%2Dcol%2Doffset%2D10%2C%2Eel%2Dcol%2Dxs%2Doffset%2D10%7Bmargin%2Dleft%3A41%2E66667%25%7D%2Eel%2Dcol%2Dpull%2D10%2C%2Eel%2Dcol%2Dxs%2Dpull%2D10%7Bposition%3Arelative%3Bright%3A41%2E66667%25%7D%2Eel%2Dcol%2Dpush%2D10%2C%2Eel%2Dcol%2Dxs%2Dpush%2D10%7Bposition%3Arelative%3Bleft%3A41%2E66667%25%7D%2Eel%2Dcol%2D11%2C%2Eel%2Dcol%2Dxs%2D11%7Bwidth%3A45%2E83333%25%7D%2Eel%2Dcol%2Doffset%2D11%2C%2Eel%2Dcol%2Dxs%2Doffset%2D11%7Bmargin%2Dleft%3A45%2E83333%25%7D%2Eel%2Dcol%2Dpull%2D11%2C%2Eel%2Dcol%2Dxs%2Dpull%2D11%7Bposition%3Arelative%3Bright%3A45%2E83333%25%7D%2Eel%2Dcol%2Dpush%2D11%2C%2Eel%2Dcol%2Dxs%2Dpush%2D11%7Bposition%3Arelative%3Bleft%3A45%2E83333%25%7D%2Eel%2Dcol%2D12%2C%2Eel%2Dcol%2Dxs%2D12%7Bwidth%3A50%25%7D%2Eel%2Dcol%2Doffset%2D12%2C%2Eel%2Dcol%2Dxs%2Doffset%2D12%7Bmargin%2Dleft%3A50%25%7D%2Eel%2Dcol%2Dpull%2D12%2C%2Eel%2Dcol%2Dxs%2Dpull%2D12%7Bposition%3Arelative%3Bright%3A50%25%7D%2Eel%2Dcol%2Dpush%2D12%2C%2Eel%2Dcol%2Dxs%2Dpush%2D12%7Bposition%3Arelative%3Bleft%3A50%25%7D%2Eel%2Dcol%2D13%2C%2Eel%2Dcol%2Dxs%2D13%7Bwidth%3A54%2E16667%25%7D%2Eel%2Dcol%2Doffset%2D13%2C%2Eel%2Dcol%2Dxs%2Doffset%2D13%7Bmargin%2Dleft%3A54%2E16667%25%7D%2Eel%2Dcol%2Dpull%2D13%2C%2Eel%2Dcol%2Dxs%2Dpull%2D13%7Bposition%3Arelative%3Bright%3A54%2E16667%25%7D%2Eel%2Dcol%2Dpush%2D13%2C%2Eel%2Dcol%2Dxs%2Dpush%2D13%7Bposition%3Arelative%3Bleft%3A54%2E16667%25%7D%2Eel%2Dcol%2D14%2C%2Eel%2Dcol%2Dxs%2D14%7Bwidth%3A58%2E33333%25%7D%2Eel%2Dcol%2Doffset%2D14%2C%2Eel%2Dcol%2Dxs%2Doffset%2D14%7Bmargin%2Dleft%3A58%2E33333%25%7D%2Eel%2Dcol%2Dpull%2D14%2C%2Eel%2Dcol%2Dxs%2Dpull%2D14%7Bposition%3Arelative%3Bright%3A58%2E33333%25%7D%2Eel%2Dcol%2Dpush%2D14%2C%2Eel%2Dcol%2Dxs%2Dpush%2D14%7Bposition%3Arelative%3Bleft%3A58%2E33333%25%7D%2Eel%2Dcol%2D15%2C%2Eel%2Dcol%2Dxs%2D15%7Bwidth%3A62%2E5%25%7D%2Eel%2Dcol%2Doffset%2D15%2C%2Eel%2Dcol%2Dxs%2Doffset%2D15%7Bmargin%2Dleft%3A62%2E5%25%7D%2Eel%2Dcol%2Dpull%2D15%2C%2Eel%2Dcol%2Dxs%2Dpull%2D15%7Bposition%3Arelative%3Bright%3A62%2E5%25%7D%2Eel%2Dcol%2Dpush%2D15%2C%2Eel%2Dcol%2Dxs%2Dpush%2D15%7Bposition%3Arelative%3Bleft%3A62%2E5%25%7D%2Eel%2Dcol%2D16%2C%2Eel%2Dcol%2Dxs%2D16%7Bwidth%3A66%2E66667%25%7D%2Eel%2Dcol%2Doffset%2D16%2C%2Eel%2Dcol%2Dxs%2Doffset%2D16%7Bmargin%2Dleft%3A66%2E66667%25%7D%2Eel%2Dcol%2Dpull%2D16%2C%2Eel%2Dcol%2Dxs%2Dpull%2D16%7Bposition%3Arelative%3Bright%3A66%2E66667%25%7D%2Eel%2Dcol%2Dpush%2D16%2C%2Eel%2Dcol%2Dxs%2Dpush%2D16%7Bposition%3Arelative%3Bleft%3A66%2E66667%25%7D%2Eel%2Dcol%2D17%2C%2Eel%2Dcol%2Dxs%2D17%7Bwidth%3A70%2E83333%25%7D%2Eel%2Dcol%2Doffset%2D17%2C%2Eel%2Dcol%2Dxs%2Doffset%2D17%7Bmargin%2Dleft%3A70%2E83333%25%7D%2Eel%2Dcol%2Dpull%2D17%2C%2Eel%2Dcol%2Dxs%2Dpull%2D17%7Bposition%3Arelative%3Bright%3A70%2E83333%25%7D%2Eel%2Dcol%2Dpush%2D17%2C%2Eel%2Dcol%2Dxs%2Dpush%2D17%7Bposition%3Arelative%3Bleft%3A70%2E83333%25%7D%2Eel%2Dcol%2D18%2C%2Eel%2Dcol%2Dxs%2D18%7Bwidth%3A75%25%7D%2Eel%2Dcol%2Doffset%2D18%2C%2Eel%2Dcol%2Dxs%2Doffset%2D18%7Bmargin%2Dleft%3A75%25%7D%2Eel%2Dcol%2Dpull%2D18%2C%2Eel%2Dcol%2Dxs%2Dpull%2D18%7Bposition%3Arelative%3Bright%3A75%25%7D%2Eel%2Dcol%2Dpush%2D18%2C%2Eel%2Dcol%2Dxs%2Dpush%2D18%7Bposition%3Arelative%3Bleft%3A75%25%7D%2Eel%2Dcol%2D19%2C%2Eel%2Dcol%2Dxs%2D19%7Bwidth%3A79%2E16667%25%7D%2Eel%2Dcol%2Doffset%2D19%2C%2Eel%2Dcol%2Dxs%2Doffset%2D19%7Bmargin%2Dleft%3A79%2E16667%25%7D%2Eel%2Dcol%2Dpull%2D19%2C%2Eel%2Dcol%2Dxs%2Dpull%2D19%7Bposition%3Arelative%3Bright%3A79%2E16667%25%7D%2Eel%2Dcol%2Dpush%2D19%2C%2Eel%2Dcol%2Dxs%2Dpush%2D19%7Bposition%3Arelative%3Bleft%3A79%2E16667%25%7D%2Eel%2Dcol%2D20%2C%2Eel%2Dcol%2Dxs%2D20%7Bwidth%3A83%2E33333%25%7D%2Eel%2Dcol%2Doffset%2D20%2C%2Eel%2Dcol%2Dxs%2Doffset%2D20%7Bmargin%2Dleft%3A83%2E33333%25%7D%2Eel%2Dcol%2Dpull%2D20%2C%2Eel%2Dcol%2Dxs%2Dpull%2D20%7Bposition%3Arelative%3Bright%3A83%2E33333%25%7D%2Eel%2Dcol%2Dpush%2D20%2C%2Eel%2Dcol%2Dxs%2Dpush%2D20%7Bposition%3Arelative%3Bleft%3A83%2E33333%25%7D%2Eel%2Dcol%2D21%2C%2Eel%2Dcol%2Dxs%2D21%7Bwidth%3A87%2E5%25%7D%2Eel%2Dcol%2Doffset%2D21%2C%2Eel%2Dcol%2Dxs%2Doffset%2D21%7Bmargin%2Dleft%3A87%2E5%25%7D%2Eel%2Dcol%2Dpull%2D21%2C%2Eel%2Dcol%2Dxs%2Dpull%2D21%7Bposition%3Arelative%3Bright%3A87%2E5%25%7D%2Eel%2Dcol%2Dpush%2D21%2C%2Eel%2Dcol%2Dxs%2Dpush%2D21%7Bposition%3Arelative%3Bleft%3A87%2E5%25%7D%2Eel%2Dcol%2D22%2C%2Eel%2Dcol%2Dxs%2D22%7Bwidth%3A91%2E66667%25%7D%2Eel%2Dcol%2Doffset%2D22%2C%2Eel%2Dcol%2Dxs%2Doffset%2D22%7Bmargin%2Dleft%3A91%2E66667%25%7D%2Eel%2Dcol%2Dpull%2D22%2C%2Eel%2Dcol%2Dxs%2Dpull%2D22%7Bposition%3Arelative%3Bright%3A91%2E66667%25%7D%2Eel%2Dcol%2Dpush%2D22%2C%2Eel%2Dcol%2Dxs%2Dpush%2D22%7Bposition%3Arelative%3Bleft%3A91%2E66667%25%7D%2Eel%2Dcol%2D23%2C%2Eel%2Dcol%2Dxs%2D23%7Bwidth%3A95%2E83333%25%7D%2Eel%2Dcol%2Doffset%2D23%2C%2Eel%2Dcol%2Dxs%2Doffset%2D23%7Bmargin%2Dleft%3A95%2E83333%25%7D%2Eel%2Dcol%2Dpull%2D23%2C%2Eel%2Dcol%2Dxs%2Dpull%2D23%7Bposition%3Arelative%3Bright%3A95%2E83333%25%7D%2Eel%2Dcol%2Dpush%2D23%2C%2Eel%2Dcol%2Dxs%2Dpush%2D23%7Bposition%3Arelative%3Bleft%3A95%2E83333%25%7D%2Eel%2Dcol%2D24%2C%2Eel%2Dcol%2Dxs%2D24%7Bwidth%3A100%25%7D%2Eel%2Dcol%2Doffset%2D24%2C%2Eel%2Dcol%2Dxs%2Doffset%2D24%7Bmargin%2Dleft%3A100%25%7D%2Eel%2Dcol%2Dpull%2D24%2C%2Eel%2Dcol%2Dxs%2Dpull%2D24%7Bposition%3Arelative%3Bright%3A100%25%7D%2Eel%2Dcol%2Dpush%2D24%2C%2Eel%2Dcol%2Dxs%2Dpush%2D24%7Bposition%3Arelative%3Bleft%3A100%25%7D%40media%20%28min%2Dwidth%3A768px%29%7B%2Eel%2Dcol%2Dsm%2D1%7Bwidth%3A4%2E16667%25%7D%2Eel%2Dcol%2Dsm%2Doffset%2D1%7Bmargin%2Dleft%3A4%2E16667%25%7D%2Eel%2Dcol%2Dsm%2Dpull%2D1%7Bposition%3Arelative%3Bright%3A4%2E16667%25%7D%2Eel%2Dcol%2Dsm%2Dpush%2D1%7Bposition%3Arelative%3Bleft%3A4%2E16667%25%7D%2Eel%2Dcol%2Dsm%2D2%7Bwidth%3A8%2E33333%25%7D%2Eel%2Dcol%2Dsm%2Doffset%2D2%7Bmargin%2Dleft%3A8%2E33333%25%7D%2Eel%2Dcol%2Dsm%2Dpull%2D2%7Bposition%3Arelative%3Bright%3A8%2E33333%25%7D%2Eel%2Dcol%2Dsm%2Dpush%2D2%7Bposition%3Arelative%3Bleft%3A8%2E33333%25%7D%2Eel%2Dcol%2Dsm%2D3%7Bwidth%3A12%2E5%25%7D%2Eel%2Dcol%2Dsm%2Doffset%2D3%7Bmargin%2Dleft%3A12%2E5%25%7D%2Eel%2Dcol%2Dsm%2Dpull%2D3%7Bposition%3Arelative%3Bright%3A12%2E5%25%7D%2Eel%2Dcol%2Dsm%2Dpush%2D3%7Bposition%3Arelative%3Bleft%3A12%2E5%25%7D%2Eel%2Dcol%2Dsm%2D4%7Bwidth%3A16%2E66667%25%7D%2Eel%2Dcol%2Dsm%2Doffset%2D4%7Bmargin%2Dleft%3A16%2E66667%25%7D%2Eel%2Dcol%2Dsm%2Dpull%2D4%7Bposition%3Arelative%3Bright%3A16%2E66667%25%7D%2Eel%2Dcol%2Dsm%2Dpush%2D4%7Bposition%3Arelative%3Bleft%3A16%2E66667%25%7D%2Eel%2Dcol%2Dsm%2D5%7Bwidth%3A20%2E83333%25%7D%2Eel%2Dcol%2Dsm%2Doffset%2D5%7Bmargin%2Dleft%3A20%2E83333%25%7D%2Eel%2Dcol%2Dsm%2Dpull%2D5%7Bposition%3Arelative%3Bright%3A20%2E83333%25%7D%2Eel%2Dcol%2Dsm%2Dpush%2D5%7Bposition%3Arelative%3Bleft%3A20%2E83333%25%7D%2Eel%2Dcol%2Dsm%2D6%7Bwidth%3A25%25%7D%2Eel%2Dcol%2Dsm%2Doffset%2D6%7Bmargin%2Dleft%3A25%25%7D%2Eel%2Dcol%2Dsm%2Dpull%2D6%7Bposition%3Arelative%3Bright%3A25%25%7D%2Eel%2Dcol%2Dsm%2Dpush%2D6%7Bposition%3Arelative%3Bleft%3A25%25%7D%2Eel%2Dcol%2Dsm%2D7%7Bwidth%3A29%2E16667%25%7D%2Eel%2Dcol%2Dsm%2Doffset%2D7%7Bmargin%2Dleft%3A29%2E16667%25%7D%2Eel%2Dcol%2Dsm%2Dpull%2D7%7Bposition%3Arelative%3Bright%3A29%2E16667%25%7D%2Eel%2Dcol%2Dsm%2Dpush%2D7%7Bposition%3Arelative%3Bleft%3A29%2E16667%25%7D%2Eel%2Dcol%2Dsm%2D8%7Bwidth%3A33%2E33333%25%7D%2Eel%2Dcol%2Dsm%2Doffset%2D8%7Bmargin%2Dleft%3A33%2E33333%25%7D%2Eel%2Dcol%2Dsm%2Dpull%2D8%7Bposition%3Arelative%3Bright%3A33%2E33333%25%7D%2Eel%2Dcol%2Dsm%2Dpush%2D8%7Bposition%3Arelative%3Bleft%3A33%2E33333%25%7D%2Eel%2Dcol%2Dsm%2D9%7Bwidth%3A37%2E5%25%7D%2Eel%2Dcol%2Dsm%2Doffset%2D9%7Bmargin%2Dleft%3A37%2E5%25%7D%2Eel%2Dcol%2Dsm%2Dpull%2D9%7Bposition%3Arelative%3Bright%3A37%2E5%25%7D%2Eel%2Dcol%2Dsm%2Dpush%2D9%7Bposition%3Arelative%3Bleft%3A37%2E5%25%7D%2Eel%2Dcol%2Dsm%2D10%7Bwidth%3A41%2E66667%25%7D%2Eel%2Dcol%2Dsm%2Doffset%2D10%7Bmargin%2Dleft%3A41%2E66667%25%7D%2Eel%2Dcol%2Dsm%2Dpull%2D10%7Bposition%3Arelative%3Bright%3A41%2E66667%25%7D%2Eel%2Dcol%2Dsm%2Dpush%2D10%7Bposition%3Arelative%3Bleft%3A41%2E66667%25%7D%2Eel%2Dcol%2Dsm%2D11%7Bwidth%3A45%2E83333%25%7D%2Eel%2Dcol%2Dsm%2Doffset%2D11%7Bmargin%2Dleft%3A45%2E83333%25%7D%2Eel%2Dcol%2Dsm%2Dpull%2D11%7Bposition%3Arelative%3Bright%3A45%2E83333%25%7D%2Eel%2Dcol%2Dsm%2Dpush%2D11%7Bposition%3Arelative%3Bleft%3A45%2E83333%25%7D%2Eel%2Dcol%2Dsm%2D12%7Bwidth%3A50%25%7D%2Eel%2Dcol%2Dsm%2Doffset%2D12%7Bmargin%2Dleft%3A50%25%7D%2Eel%2Dcol%2Dsm%2Dpull%2D12%7Bposition%3Arelative%3Bright%3A50%25%7D%2Eel%2Dcol%2Dsm%2Dpush%2D12%7Bposition%3Arelative%3Bleft%3A50%25%7D%2Eel%2Dcol%2Dsm%2D13%7Bwidth%3A54%2E16667%25%7D%2Eel%2Dcol%2Dsm%2Doffset%2D13%7Bmargin%2Dleft%3A54%2E16667%25%7D%2Eel%2Dcol%2Dsm%2Dpull%2D13%7Bposition%3Arelative%3Bright%3A54%2E16667%25%7D%2Eel%2Dcol%2Dsm%2Dpush%2D13%7Bposition%3Arelative%3Bleft%3A54%2E16667%25%7D%2Eel%2Dcol%2Dsm%2D14%7Bwidth%3A58%2E33333%25%7D%2Eel%2Dcol%2Dsm%2Doffset%2D14%7Bmargin%2Dleft%3A58%2E33333%25%7D%2Eel%2Dcol%2Dsm%2Dpull%2D14%7Bposition%3Arelative%3Bright%3A58%2E33333%25%7D%2Eel%2Dcol%2Dsm%2Dpush%2D14%7Bposition%3Arelative%3Bleft%3A58%2E33333%25%7D%2Eel%2Dcol%2Dsm%2D15%7Bwidth%3A62%2E5%25%7D%2Eel%2Dcol%2Dsm%2Doffset%2D15%7Bmargin%2Dleft%3A62%2E5%25%7D%2Eel%2Dcol%2Dsm%2Dpull%2D15%7Bposition%3Arelative%3Bright%3A62%2E5%25%7D%2Eel%2Dcol%2Dsm%2Dpush%2D15%7Bposition%3Arelative%3Bleft%3A62%2E5%25%7D%2Eel%2Dcol%2Dsm%2D16%7Bwidth%3A66%2E66667%25%7D%2Eel%2Dcol%2Dsm%2Doffset%2D16%7Bmargin%2Dleft%3A66%2E66667%25%7D%2Eel%2Dcol%2Dsm%2Dpull%2D16%7Bposition%3Arelative%3Bright%3A66%2E66667%25%7D%2Eel%2Dcol%2Dsm%2Dpush%2D16%7Bposition%3Arelative%3Bleft%3A66%2E66667%25%7D%2Eel%2Dcol%2Dsm%2D17%7Bwidth%3A70%2E83333%25%7D%2Eel%2Dcol%2Dsm%2Doffset%2D17%7Bmargin%2Dleft%3A70%2E83333%25%7D%2Eel%2Dcol%2Dsm%2Dpull%2D17%7Bposition%3Arelative%3Bright%3A70%2E83333%25%7D%2Eel%2Dcol%2Dsm%2Dpush%2D17%7Bposition%3Arelative%3Bleft%3A70%2E83333%25%7D%2Eel%2Dcol%2Dsm%2D18%7Bwidth%3A75%25%7D%2Eel%2Dcol%2Dsm%2Doffset%2D18%7Bmargin%2Dleft%3A75%25%7D%2Eel%2Dcol%2Dsm%2Dpull%2D18%7Bposition%3Arelative%3Bright%3A75%25%7D%2Eel%2Dcol%2Dsm%2Dpush%2D18%7Bposition%3Arelative%3Bleft%3A75%25%7D%2Eel%2Dcol%2Dsm%2D19%7Bwidth%3A79%2E16667%25%7D%2Eel%2Dcol%2Dsm%2Doffset%2D19%7Bmargin%2Dleft%3A79%2E16667%25%7D%2Eel%2Dcol%2Dsm%2Dpull%2D19%7Bposition%3Arelative%3Bright%3A79%2E16667%25%7D%2Eel%2Dcol%2Dsm%2Dpush%2D19%7Bposition%3Arelative%3Bleft%3A79%2E16667%25%7D%2Eel%2Dcol%2Dsm%2D20%7Bwidth%3A83%2E33333%25%7D%2Eel%2Dcol%2Dsm%2Doffset%2D20%7Bmargin%2Dleft%3A83%2E33333%25%7D%2Eel%2Dcol%2Dsm%2Dpull%2D20%7Bposition%3Arelative%3Bright%3A83%2E33333%25%7D%2Eel%2Dcol%2Dsm%2Dpush%2D20%7Bposition%3Arelative%3Bleft%3A83%2E33333%25%7D%2Eel%2Dcol%2Dsm%2D21%7Bwidth%3A87%2E5%25%7D%2Eel%2Dcol%2Dsm%2Doffset%2D21%7Bmargin%2Dleft%3A87%2E5%25%7D%2Eel%2Dcol%2Dsm%2Dpull%2D21%7Bposition%3Arelative%3Bright%3A87%2E5%25%7D%2Eel%2Dcol%2Dsm%2Dpush%2D21%7Bposition%3Arelative%3Bleft%3A87%2E5%25%7D%2Eel%2Dcol%2Dsm%2D22%7Bwidth%3A91%2E66667%25%7D%2Eel%2Dcol%2Dsm%2Doffset%2D22%7Bmargin%2Dleft%3A91%2E66667%25%7D%2Eel%2Dcol%2Dsm%2Dpull%2D22%7Bposition%3Arelative%3Bright%3A91%2E66667%25%7D%2Eel%2Dcol%2Dsm%2Dpush%2D22%7Bposition%3Arelative%3Bleft%3A91%2E66667%25%7D%2Eel%2Dcol%2Dsm%2D23%7Bwidth%3A95%2E83333%25%7D%2Eel%2Dcol%2Dsm%2Doffset%2D23%7Bmargin%2Dleft%3A95%2E83333%25%7D%2Eel%2Dcol%2Dsm%2Dpull%2D23%7Bposition%3Arelative%3Bright%3A95%2E83333%25%7D%2Eel%2Dcol%2Dsm%2Dpush%2D23%7Bposition%3Arelative%3Bleft%3A95%2E83333%25%7D%2Eel%2Dcol%2Dsm%2D24%7Bwidth%3A100%25%7D%2Eel%2Dcol%2Dsm%2Doffset%2D24%7Bmargin%2Dleft%3A100%25%7D%2Eel%2Dcol%2Dsm%2Dpull%2D24%7Bposition%3Arelative%3Bright%3A100%25%7D%2Eel%2Dcol%2Dsm%2Dpush%2D24%7Bposition%3Arelative%3Bleft%3A100%25%7D%7D%40media%20%28min%2Dwidth%3A992px%29%7B%2Eel%2Dcol%2Dmd%2D1%7Bwidth%3A4%2E16667%25%7D%2Eel%2Dcol%2Dmd%2Doffset%2D1%7Bmargin%2Dleft%3A4%2E16667%25%7D%2Eel%2Dcol%2Dmd%2Dpull%2D1%7Bposition%3Arelative%3Bright%3A4%2E16667%25%7D%2Eel%2Dcol%2Dmd%2Dpush%2D1%7Bposition%3Arelative%3Bleft%3A4%2E16667%25%7D%2Eel%2Dcol%2Dmd%2D2%7Bwidth%3A8%2E33333%25%7D%2Eel%2Dcol%2Dmd%2Doffset%2D2%7Bmargin%2Dleft%3A8%2E33333%25%7D%2Eel%2Dcol%2Dmd%2Dpull%2D2%7Bposition%3Arelative%3Bright%3A8%2E33333%25%7D%2Eel%2Dcol%2Dmd%2Dpush%2D2%7Bposition%3Arelative%3Bleft%3A8%2E33333%25%7D%2Eel%2Dcol%2Dmd%2D3%7Bwidth%3A12%2E5%25%7D%2Eel%2Dcol%2Dmd%2Doffset%2D3%7Bmargin%2Dleft%3A12%2E5%25%7D%2Eel%2Dcol%2Dmd%2Dpull%2D3%7Bposition%3Arelative%3Bright%3A12%2E5%25%7D%2Eel%2Dcol%2Dmd%2Dpush%2D3%7Bposition%3Arelative%3Bleft%3A12%2E5%25%7D%2Eel%2Dcol%2Dmd%2D4%7Bwidth%3A16%2E66667%25%7D%2Eel%2Dcol%2Dmd%2Doffset%2D4%7Bmargin%2Dleft%3A16%2E66667%25%7D%2Eel%2Dcol%2Dmd%2Dpull%2D4%7Bposition%3Arelative%3Bright%3A16%2E66667%25%7D%2Eel%2Dcol%2Dmd%2Dpush%2D4%7Bposition%3Arelative%3Bleft%3A16%2E66667%25%7D%2Eel%2Dcol%2Dmd%2D5%7Bwidth%3A20%2E83333%25%7D%2Eel%2Dcol%2Dmd%2Doffset%2D5%7Bmargin%2Dleft%3A20%2E83333%25%7D%2Eel%2Dcol%2Dmd%2Dpull%2D5%7Bposition%3Arelative%3Bright%3A20%2E83333%25%7D%2Eel%2Dcol%2Dmd%2Dpush%2D5%7Bposition%3Arelative%3Bleft%3A20%2E83333%25%7D%2Eel%2Dcol%2Dmd%2D6%7Bwidth%3A25%25%7D%2Eel%2Dcol%2Dmd%2Doffset%2D6%7Bmargin%2Dleft%3A25%25%7D%2Eel%2Dcol%2Dmd%2Dpull%2D6%7Bposition%3Arelative%3Bright%3A25%25%7D%2Eel%2Dcol%2Dmd%2Dpush%2D6%7Bposition%3Arelative%3Bleft%3A25%25%7D%2Eel%2Dcol%2Dmd%2D7%7Bwidth%3A29%2E16667%25%7D%2Eel%2Dcol%2Dmd%2Doffset%2D7%7Bmargin%2Dleft%3A29%2E16667%25%7D%2Eel%2Dcol%2Dmd%2Dpull%2D7%7Bposition%3Arelative%3Bright%3A29%2E16667%25%7D%2Eel%2Dcol%2Dmd%2Dpush%2D7%7Bposition%3Arelative%3Bleft%3A29%2E16667%25%7D%2Eel%2Dcol%2Dmd%2D8%7Bwidth%3A33%2E33333%25%7D%2Eel%2Dcol%2Dmd%2Doffset%2D8%7Bmargin%2Dleft%3A33%2E33333%25%7D%2Eel%2Dcol%2Dmd%2Dpull%2D8%7Bposition%3Arelative%3Bright%3A33%2E33333%25%7D%2Eel%2Dcol%2Dmd%2Dpush%2D8%7Bposition%3Arelative%3Bleft%3A33%2E33333%25%7D%2Eel%2Dcol%2Dmd%2D9%7Bwidth%3A37%2E5%25%7D%2Eel%2Dcol%2Dmd%2Doffset%2D9%7Bmargin%2Dleft%3A37%2E5%25%7D%2Eel%2Dcol%2Dmd%2Dpull%2D9%7Bposition%3Arelative%3Bright%3A37%2E5%25%7D%2Eel%2Dcol%2Dmd%2Dpush%2D9%7Bposition%3Arelative%3Bleft%3A37%2E5%25%7D%2Eel%2Dcol%2Dmd%2D10%7Bwidth%3A41%2E66667%25%7D%2Eel%2Dcol%2Dmd%2Doffset%2D10%7Bmargin%2Dleft%3A41%2E66667%25%7D%2Eel%2Dcol%2Dmd%2Dpull%2D10%7Bposition%3Arelative%3Bright%3A41%2E66667%25%7D%2Eel%2Dcol%2Dmd%2Dpush%2D10%7Bposition%3Arelative%3Bleft%3A41%2E66667%25%7D%2Eel%2Dcol%2Dmd%2D11%7Bwidth%3A45%2E83333%25%7D%2Eel%2Dcol%2Dmd%2Doffset%2D11%7Bmargin%2Dleft%3A45%2E83333%25%7D%2Eel%2Dcol%2Dmd%2Dpull%2D11%7Bposition%3Arelative%3Bright%3A45%2E83333%25%7D%2Eel%2Dcol%2Dmd%2Dpush%2D11%7Bposition%3Arelative%3Bleft%3A45%2E83333%25%7D%2Eel%2Dcol%2Dmd%2D12%7Bwidth%3A50%25%7D%2Eel%2Dcol%2Dmd%2Doffset%2D12%7Bmargin%2Dleft%3A50%25%7D%2Eel%2Dcol%2Dmd%2Dpull%2D12%7Bposition%3Arelative%3Bright%3A50%25%7D%2Eel%2Dcol%2Dmd%2Dpush%2D12%7Bposition%3Arelative%3Bleft%3A50%25%7D%2Eel%2Dcol%2Dmd%2D13%7Bwidth%3A54%2E16667%25%7D%2Eel%2Dcol%2Dmd%2Doffset%2D13%7Bmargin%2Dleft%3A54%2E16667%25%7D%2Eel%2Dcol%2Dmd%2Dpull%2D13%7Bposition%3Arelative%3Bright%3A54%2E16667%25%7D%2Eel%2Dcol%2Dmd%2Dpush%2D13%7Bposition%3Arelative%3Bleft%3A54%2E16667%25%7D%2Eel%2Dcol%2Dmd%2D14%7Bwidth%3A58%2E33333%25%7D%2Eel%2Dcol%2Dmd%2Doffset%2D14%7Bmargin%2Dleft%3A58%2E33333%25%7D%2Eel%2Dcol%2Dmd%2Dpull%2D14%7Bposition%3Arelative%3Bright%3A58%2E33333%25%7D%2Eel%2Dcol%2Dmd%2Dpush%2D14%7Bposition%3Arelative%3Bleft%3A58%2E33333%25%7D%2Eel%2Dcol%2Dmd%2D15%7Bwidth%3A62%2E5%25%7D%2Eel%2Dcol%2Dmd%2Doffset%2D15%7Bmargin%2Dleft%3A62%2E5%25%7D%2Eel%2Dcol%2Dmd%2Dpull%2D15%7Bposition%3Arelative%3Bright%3A62%2E5%25%7D%2Eel%2Dcol%2Dmd%2Dpush%2D15%7Bposition%3Arelative%3Bleft%3A62%2E5%25%7D%2Eel%2Dcol%2Dmd%2D16%7Bwidth%3A66%2E66667%25%7D%2Eel%2Dcol%2Dmd%2Doffset%2D16%7Bmargin%2Dleft%3A66%2E66667%25%7D%2Eel%2Dcol%2Dmd%2Dpull%2D16%7Bposition%3Arelative%3Bright%3A66%2E66667%25%7D%2Eel%2Dcol%2Dmd%2Dpush%2D16%7Bposition%3Arelative%3Bleft%3A66%2E66667%25%7D%2Eel%2Dcol%2Dmd%2D17%7Bwidth%3A70%2E83333%25%7D%2Eel%2Dcol%2Dmd%2Doffset%2D17%7Bmargin%2Dleft%3A70%2E83333%25%7D%2Eel%2Dcol%2Dmd%2Dpull%2D17%7Bposition%3Arelative%3Bright%3A70%2E83333%25%7D%2Eel%2Dcol%2Dmd%2Dpush%2D17%7Bposition%3Arelative%3Bleft%3A70%2E83333%25%7D%2Eel%2Dcol%2Dmd%2D18%7Bwidth%3A75%25%7D%2Eel%2Dcol%2Dmd%2Doffset%2D18%7Bmargin%2Dleft%3A75%25%7D%2Eel%2Dcol%2Dmd%2Dpull%2D18%7Bposition%3Arelative%3Bright%3A75%25%7D%2Eel%2Dcol%2Dmd%2Dpush%2D18%7Bposition%3Arelative%3Bleft%3A75%25%7D%2Eel%2Dcol%2Dmd%2D19%7Bwidth%3A79%2E16667%25%7D%2Eel%2Dcol%2Dmd%2Doffset%2D19%7Bmargin%2Dleft%3A79%2E16667%25%7D%2Eel%2Dcol%2Dmd%2Dpull%2D19%7Bposition%3Arelative%3Bright%3A79%2E16667%25%7D%2Eel%2Dcol%2Dmd%2Dpush%2D19%7Bposition%3Arelative%3Bleft%3A79%2E16667%25%7D%2Eel%2Dcol%2Dmd%2D20%7Bwidth%3A83%2E33333%25%7D%2Eel%2Dcol%2Dmd%2Doffset%2D20%7Bmargin%2Dleft%3A83%2E33333%25%7D%2Eel%2Dcol%2Dmd%2Dpull%2D20%7Bposition%3Arelative%3Bright%3A83%2E33333%25%7D%2Eel%2Dcol%2Dmd%2Dpush%2D20%7Bposition%3Arelative%3Bleft%3A83%2E33333%25%7D%2Eel%2Dcol%2Dmd%2D21%7Bwidth%3A87%2E5%25%7D%2Eel%2Dcol%2Dmd%2Doffset%2D21%7Bmargin%2Dleft%3A87%2E5%25%7D%2Eel%2Dcol%2Dmd%2Dpull%2D21%7Bposition%3Arelative%3Bright%3A87%2E5%25%7D%2Eel%2Dcol%2Dmd%2Dpush%2D21%7Bposition%3Arelative%3Bleft%3A87%2E5%25%7D%2Eel%2Dcol%2Dmd%2D22%7Bwidth%3A91%2E66667%25%7D%2Eel%2Dcol%2Dmd%2Doffset%2D22%7Bmargin%2Dleft%3A91%2E66667%25%7D%2Eel%2Dcol%2Dmd%2Dpull%2D22%7Bposition%3Arelative%3Bright%3A91%2E66667%25%7D%2Eel%2Dcol%2Dmd%2Dpush%2D22%7Bposition%3Arelative%3Bleft%3A91%2E66667%25%7D%2Eel%2Dcol%2Dmd%2D23%7Bwidth%3A95%2E83333%25%7D%2Eel%2Dcol%2Dmd%2Doffset%2D23%7Bmargin%2Dleft%3A95%2E83333%25%7D%2Eel%2Dcol%2Dmd%2Dpull%2D23%7Bposition%3Arelative%3Bright%3A95%2E83333%25%7D%2Eel%2Dcol%2Dmd%2Dpush%2D23%7Bposition%3Arelative%3Bleft%3A95%2E83333%25%7D%2Eel%2Dcol%2Dmd%2D24%7Bwidth%3A100%25%7D%2Eel%2Dcol%2Dmd%2Doffset%2D24%7Bmargin%2Dleft%3A100%25%7D%2Eel%2Dcol%2Dmd%2Dpull%2D24%7Bposition%3Arelative%3Bright%3A100%25%7D%2Eel%2Dcol%2Dmd%2Dpush%2D24%7Bposition%3Arelative%3Bleft%3A100%25%7D%7D%40media%20%28min%2Dwidth%3A1200px%29%7B%2Eel%2Dcol%2Dlg%2D1%7Bwidth%3A4%2E16667%25%7D%2Eel%2Dcol%2Dlg%2Doffset%2D1%7Bmargin%2Dleft%3A4%2E16667%25%7D%2Eel%2Dcol%2Dlg%2Dpull%2D1%7Bposition%3Arelative%3Bright%3A4%2E16667%25%7D%2Eel%2Dcol%2Dlg%2Dpush%2D1%7Bposition%3Arelative%3Bleft%3A4%2E16667%25%7D%2Eel%2Dcol%2Dlg%2D2%7Bwidth%3A8%2E33333%25%7D%2Eel%2Dcol%2Dlg%2Doffset%2D2%7Bmargin%2Dleft%3A8%2E33333%25%7D%2Eel%2Dcol%2Dlg%2Dpull%2D2%7Bposition%3Arelative%3Bright%3A8%2E33333%25%7D%2Eel%2Dcol%2Dlg%2Dpush%2D2%7Bposition%3Arelative%3Bleft%3A8%2E33333%25%7D%2Eel%2Dcol%2Dlg%2D3%7Bwidth%3A12%2E5%25%7D%2Eel%2Dcol%2Dlg%2Doffset%2D3%7Bmargin%2Dleft%3A12%2E5%25%7D%2Eel%2Dcol%2Dlg%2Dpull%2D3%7Bposition%3Arelative%3Bright%3A12%2E5%25%7D%2Eel%2Dcol%2Dlg%2Dpush%2D3%7Bposition%3Arelative%3Bleft%3A12%2E5%25%7D%2Eel%2Dcol%2Dlg%2D4%7Bwidth%3A16%2E66667%25%7D%2Eel%2Dcol%2Dlg%2Doffset%2D4%7Bmargin%2Dleft%3A16%2E66667%25%7D%2Eel%2Dcol%2Dlg%2Dpull%2D4%7Bposition%3Arelative%3Bright%3A16%2E66667%25%7D%2Eel%2Dcol%2Dlg%2Dpush%2D4%7Bposition%3Arelative%3Bleft%3A16%2E66667%25%7D%2Eel%2Dcol%2Dlg%2D5%7Bwidth%3A20%2E83333%25%7D%2Eel%2Dcol%2Dlg%2Doffset%2D5%7Bmargin%2Dleft%3A20%2E83333%25%7D%2Eel%2Dcol%2Dlg%2Dpull%2D5%7Bposition%3Arelative%3Bright%3A20%2E83333%25%7D%2Eel%2Dcol%2Dlg%2Dpush%2D5%7Bposition%3Arelative%3Bleft%3A20%2E83333%25%7D%2Eel%2Dcol%2Dlg%2D6%7Bwidth%3A25%25%7D%2Eel%2Dcol%2Dlg%2Doffset%2D6%7Bmargin%2Dleft%3A25%25%7D%2Eel%2Dcol%2Dlg%2Dpull%2D6%7Bposition%3Arelative%3Bright%3A25%25%7D%2Eel%2Dcol%2Dlg%2Dpush%2D6%7Bposition%3Arelative%3Bleft%3A25%25%7D%2Eel%2Dcol%2Dlg%2D7%7Bwidth%3A29%2E16667%25%7D%2Eel%2Dcol%2Dlg%2Doffset%2D7%7Bmargin%2Dleft%3A29%2E16667%25%7D%2Eel%2Dcol%2Dlg%2Dpull%2D7%7Bposition%3Arelative%3Bright%3A29%2E16667%25%7D%2Eel%2Dcol%2Dlg%2Dpush%2D7%7Bposition%3Arelative%3Bleft%3A29%2E16667%25%7D%2Eel%2Dcol%2Dlg%2D8%7Bwidth%3A33%2E33333%25%7D%2Eel%2Dcol%2Dlg%2Doffset%2D8%7Bmargin%2Dleft%3A33%2E33333%25%7D%2Eel%2Dcol%2Dlg%2Dpull%2D8%7Bposition%3Arelative%3Bright%3A33%2E33333%25%7D%2Eel%2Dcol%2Dlg%2Dpush%2D8%7Bposition%3Arelative%3Bleft%3A33%2E33333%25%7D%2Eel%2Dcol%2Dlg%2D9%7Bwidth%3A37%2E5%25%7D%2Eel%2Dcol%2Dlg%2Doffset%2D9%7Bmargin%2Dleft%3A37%2E5%25%7D%2Eel%2Dcol%2Dlg%2Dpull%2D9%7Bposition%3Arelative%3Bright%3A37%2E5%25%7D%2Eel%2Dcol%2Dlg%2Dpush%2D9%7Bposition%3Arelative%3Bleft%3A37%2E5%25%7D%2Eel%2Dcol%2Dlg%2D10%7Bwidth%3A41%2E66667%25%7D%2Eel%2Dcol%2Dlg%2Doffset%2D10%7Bmargin%2Dleft%3A41%2E66667%25%7D%2Eel%2Dcol%2Dlg%2Dpull%2D10%7Bposition%3Arelative%3Bright%3A41%2E66667%25%7D%2Eel%2Dcol%2Dlg%2Dpush%2D10%7Bposition%3Arelative%3Bleft%3A41%2E66667%25%7D%2Eel%2Dcol%2Dlg%2D11%7Bwidth%3A45%2E83333%25%7D%2Eel%2Dcol%2Dlg%2Doffset%2D11%7Bmargin%2Dleft%3A45%2E83333%25%7D%2Eel%2Dcol%2Dlg%2Dpull%2D11%7Bposition%3Arelative%3Bright%3A45%2E83333%25%7D%2Eel%2Dcol%2Dlg%2Dpush%2D11%7Bposition%3Arelative%3Bleft%3A45%2E83333%25%7D%2Eel%2Dcol%2Dlg%2D12%7Bwidth%3A50%25%7D%2Eel%2Dcol%2Dlg%2Doffset%2D12%7Bmargin%2Dleft%3A50%25%7D%2Eel%2Dcol%2Dlg%2Dpull%2D12%7Bposition%3Arelative%3Bright%3A50%25%7D%2Eel%2Dcol%2Dlg%2Dpush%2D12%7Bposition%3Arelative%3Bleft%3A50%25%7D%2Eel%2Dcol%2Dlg%2D13%7Bwidth%3A54%2E16667%25%7D%2Eel%2Dcol%2Dlg%2Doffset%2D13%7Bmargin%2Dleft%3A54%2E16667%25%7D%2Eel%2Dcol%2Dlg%2Dpull%2D13%7Bposition%3Arelative%3Bright%3A54%2E16667%25%7D%2Eel%2Dcol%2Dlg%2Dpush%2D13%7Bposition%3Arelative%3Bleft%3A54%2E16667%25%7D%2Eel%2Dcol%2Dlg%2D14%7Bwidth%3A58%2E33333%25%7D%2Eel%2Dcol%2Dlg%2Doffset%2D14%7Bmargin%2Dleft%3A58%2E33333%25%7D%2Eel%2Dcol%2Dlg%2Dpull%2D14%7Bposition%3Arelative%3Bright%3A58%2E33333%25%7D%2Eel%2Dcol%2Dlg%2Dpush%2D14%7Bposition%3Arelative%3Bleft%3A58%2E33333%25%7D%2Eel%2Dcol%2Dlg%2D15%7Bwidth%3A62%2E5%25%7D%2Eel%2Dcol%2Dlg%2Doffset%2D15%7Bmargin%2Dleft%3A62%2E5%25%7D%2Eel%2Dcol%2Dlg%2Dpull%2D15%7Bposition%3Arelative%3Bright%3A62%2E5%25%7D%2Eel%2Dcol%2Dlg%2Dpush%2D15%7Bposition%3Arelative%3Bleft%3A62%2E5%25%7D%2Eel%2Dcol%2Dlg%2D16%7Bwidth%3A66%2E66667%25%7D%2Eel%2Dcol%2Dlg%2Doffset%2D16%7Bmargin%2Dleft%3A66%2E66667%25%7D%2Eel%2Dcol%2Dlg%2Dpull%2D16%7Bposition%3Arelative%3Bright%3A66%2E66667%25%7D%2Eel%2Dcol%2Dlg%2Dpush%2D16%7Bposition%3Arelative%3Bleft%3A66%2E66667%25%7D%2Eel%2Dcol%2Dlg%2D17%7Bwidth%3A70%2E83333%25%7D%2Eel%2Dcol%2Dlg%2Doffset%2D17%7Bmargin%2Dleft%3A70%2E83333%25%7D%2Eel%2Dcol%2Dlg%2Dpull%2D17%7Bposition%3Arelative%3Bright%3A70%2E83333%25%7D%2Eel%2Dcol%2Dlg%2Dpush%2D17%7Bposition%3Arelative%3Bleft%3A70%2E83333%25%7D%2Eel%2Dcol%2Dlg%2D18%7Bwidth%3A75%25%7D%2Eel%2Dcol%2Dlg%2Doffset%2D18%7Bmargin%2Dleft%3A75%25%7D%2Eel%2Dcol%2Dlg%2Dpull%2D18%7Bposition%3Arelative%3Bright%3A75%25%7D%2Eel%2Dcol%2Dlg%2Dpush%2D18%7Bposition%3Arelative%3Bleft%3A75%25%7D%2Eel%2Dcol%2Dlg%2D19%7Bwidth%3A79%2E16667%25%7D%2Eel%2Dcol%2Dlg%2Doffset%2D19%7Bmargin%2Dleft%3A79%2E16667%25%7D%2Eel%2Dcol%2Dlg%2Dpull%2D19%7Bposition%3Arelative%3Bright%3A79%2E16667%25%7D%2Eel%2Dcol%2Dlg%2Dpush%2D19%7Bposition%3Arelative%3Bleft%3A79%2E16667%25%7D%2Eel%2Dcol%2Dlg%2D20%7Bwidth%3A83%2E33333%25%7D%2Eel%2Dcol%2Dlg%2Doffset%2D20%7Bmargin%2Dleft%3A83%2E33333%25%7D%2Eel%2Dcol%2Dlg%2Dpull%2D20%7Bposition%3Arelative%3Bright%3A83%2E33333%25%7D%2Eel%2Dcol%2Dlg%2Dpush%2D20%7Bposition%3Arelative%3Bleft%3A83%2E33333%25%7D%2Eel%2Dcol%2Dlg%2D21%7Bwidth%3A87%2E5%25%7D%2Eel%2Dcol%2Dlg%2Doffset%2D21%7Bmargin%2Dleft%3A87%2E5%25%7D%2Eel%2Dcol%2Dlg%2Dpull%2D21%7Bposition%3Arelative%3Bright%3A87%2E5%25%7D%2Eel%2Dcol%2Dlg%2Dpush%2D21%7Bposition%3Arelative%3Bleft%3A87%2E5%25%7D%2Eel%2Dcol%2Dlg%2D22%7Bwidth%3A91%2E66667%25%7D%2Eel%2Dcol%2Dlg%2Doffset%2D22%7Bmargin%2Dleft%3A91%2E66667%25%7D%2Eel%2Dcol%2Dlg%2Dpull%2D22%7Bposition%3Arelative%3Bright%3A91%2E66667%25%7D%2Eel%2Dcol%2Dlg%2Dpush%2D22%7Bposition%3Arelative%3Bleft%3A91%2E66667%25%7D%2Eel%2Dcol%2Dlg%2D23%7Bwidth%3A95%2E83333%25%7D%2Eel%2Dcol%2Dlg%2Doffset%2D23%7Bmargin%2Dleft%3A95%2E83333%25%7D%2Eel%2Dcol%2Dlg%2Dpull%2D23%7Bposition%3Arelative%3Bright%3A95%2E83333%25%7D%2Eel%2Dcol%2Dlg%2Dpush%2D23%7Bposition%3Arelative%3Bleft%3A95%2E83333%25%7D%2Eel%2Dcol%2Dlg%2D24%7Bwidth%3A100%25%7D%2Eel%2Dcol%2Dlg%2Doffset%2D24%7Bmargin%2Dleft%3A100%25%7D%2Eel%2Dcol%2Dlg%2Dpull%2D24%7Bposition%3Arelative%3Bright%3A100%25%7D%2Eel%2Dcol%2Dlg%2Dpush%2D24%7Bposition%3Arelative%3Bleft%3A100%25%7D%7D%2Eel%2Dtime%2Dspinner%7Bwidth%3A100%25%3Bwhite%2Dspace%3Anowrap%7D%2Eel%2Dspinner%7Bvertical%2Dalign%3Amiddle%7D%2Eel%2Dspinner%2Dinner%7Banimation%3Arotate%202s%20linear%20infinite%3Bwidth%3A50px%3Bheight%3A50px%7D%2Eel%2Dspinner%2Dinner%20%2Epath%7Bstroke%3A%23ececec%3Bstroke%2Dlinecap%3Around%3Banimation%3Adash%201%2E5s%20ease%2Din%2Dout%20infinite%7D%40keyframes%20rotate%7B100%25%7Btransform%3Arotate%28360deg%29%7D%7D%40keyframes%20dash%7B0%25%7Bstroke%2Ddasharray%3A1%2C150%3Bstroke%2Ddashoffset%3A0%7D50%25%7Bstroke%2Ddasharray%3A90%2C150%3Bstroke%2Ddashoffset%3A%2D35%7D100%25%7Bstroke%2Ddasharray%3A90%2C150%3Bstroke%2Ddashoffset%3A%2D124%7D%7D%2Eel%2Dbadge%7Bposition%3Arelative%3Bvertical%2Dalign%3Amiddle%7D%2Eel%2Dbadge%5F%5Fcontent%7Bbackground%2Dcolor%3A%23ff4949%3Bborder%2Dradius%3A10px%3Bcolor%3A%23fff%3Bfont%2Dsize%3A12px%3Bheight%3A18px%3Bline%2Dheight%3A18px%3Bpadding%3A0%206px%3Btext%2Dalign%3Acenter%3Bwhite%2Dspace%3Anowrap%3Bborder%3A1px%20solid%20%23fff%7D%2Eel%2Dbadge%5F%5Fcontent%2Eis%2Ddot%7Bwidth%3A8px%3Bheight%3A8px%3Bpadding%3A0%3Bright%3A0%3Bborder%2Dradius%3A50%25%7D%2Eel%2Dbadge%5F%5Fcontent%2Eis%2Dfixed%7Btop%3A0%3Bright%3A10px%3Bposition%3Aabsolute%3B%2Dms%2Dtransform%3AtranslateY%28%2D50%25%29%20translateX%28100%25%29%3Btransform%3AtranslateY%28%2D50%25%29%20translateX%28100%25%29%7D%2Eel%2Drate%5F%5Ficon%2C%2Eel%2Drate%5F%5Fitem%7Bposition%3Arelative%3Bdisplay%3Ainline%2Dblock%7D%2Eel%2Dbadge%5F%5Fcontent%2Eis%2Dfixed%2Eis%2Ddot%7Bright%3A5px%7D%2Eel%2Dcard%7Bborder%3A1px%20solid%20%23D3DCE6%3Bborder%2Dradius%3A4px%3Bbackground%2Dcolor%3A%23fff%3Boverflow%3Ahidden%7D%2Eel%2Dcard%5F%5Fheader%7Bpadding%3A18px%2020px%3Bborder%2Dbottom%3A1px%20solid%20%23D3DCE6%3Bbox%2Dsizing%3Aborder%2Dbox%7D%2Eel%2Dcard%5F%5Fbody%7Bpadding%3A20px%7D%2Eel%2Drate%7Bheight%3A20px%3Bline%2Dheight%3A1%7D%2Eel%2Drate%5F%5Fitem%7Bfont%2Dsize%3A0%3Bvertical%2Dalign%3Amiddle%7D%2Eel%2Drate%5F%5Ficon%7Bfont%2Dsize%3A18px%3Bmargin%2Dright%3A6px%3Bcolor%3A%23C6D1DE%3Btransition%3A%2E3s%7D%2Eel%2Drate%5F%5Fdecimal%2C%2Eel%2Drate%5F%5Ficon%20%2Epath2%7Bposition%3Aabsolute%3Btop%3A0%3Bleft%3A0%7D%2Eel%2Drate%5F%5Ficon%2Ehover%7B%2Dms%2Dtransform%3Ascale%281%2E15%29%3Btransform%3Ascale%281%2E15%29%7D%2Eel%2Drate%5F%5Fdecimal%7Bdisplay%3Ainline%2Dblock%3Boverflow%3Ahidden%7D%2Eel%2Drate%5F%5Ftext%7Bfont%2Dsize%3A14px%3Bvertical%2Dalign%3Amiddle%7D%2Eel%2Dsteps%7Bfont%2Dsize%3A0%7D%2Eel%2Dsteps%3E%3Alast%2Dchild%20%2Eel%2Dstep%5F%5Fline%7Bdisplay%3Anone%7D%2Eel%2Dstep%2Eis%2Dhorizontal%2C%2Eel%2Dstep%2Eis%2Dvertical%20%2Eel%2Dstep%5F%5Fhead%2C%2Eel%2Dstep%2Eis%2Dvertical%20%2Eel%2Dstep%5F%5Fmain%2C%2Eel%2Dstep%5F%5Fline%7Bdisplay%3Ainline%2Dblock%7D%2Eel%2Dsteps%2Eis%2Dhorizontal%7Bwhite%2Dspace%3Anowrap%7D%2Eel%2Dstep%7Bposition%3Arelative%3Bvertical%2Dalign%3Atop%7D%2Eel%2Dstep%2Eis%2Dvertical%20%2Eel%2Dstep%5F%5Fmain%7Bpadding%2Dleft%3A10px%7D%2Eel%2Dstep%5F%5Fline%7Bposition%3Aabsolute%3Bborder%2Dcolor%3Ainherit%3Bbackground%2Dcolor%3A%23c0ccda%7D%2Eel%2Dstep%5F%5Fline%2Eis%2Dvertical%7Bwidth%3A2px%3Bbox%2Dsizing%3Aborder%2Dbox%3Btop%3A32px%3Bbottom%3A0%3Bleft%3A15px%7D%2Eel%2Dstep%5F%5Fline%2Eis%2Dhorizontal%7Btop%3A15px%3Bheight%3A2px%3Bleft%3A32px%3Bright%3A0%7D%2Eel%2Dstep%5F%5Fline%2Eis%2Dicon%2Eis%2Dhorizontal%7Bright%3A4px%7D%2Eel%2Dstep%5F%5Fline%2Dinner%7Bdisplay%3Ablock%3Bborder%2Dwidth%3A1px%3Bborder%2Dstyle%3Asolid%3Bborder%2Dcolor%3Ainherit%3Btransition%3Aall%20150ms%3Bwidth%3A0%3Bheight%3A0%7D%2Eel%2Dstep%5F%5Ficon%7Bdisplay%3Ablock%3Bline%2Dheight%3A28px%7D%2Eel%2Dstep%5F%5Ficon%3E%2A%7Bline%2Dheight%3Ainherit%3Bvertical%2Dalign%3Amiddle%7D%2Eel%2Dstep%5F%5Fhead%7Bwidth%3A28px%3Bheight%3A28px%3Bborder%2Dradius%3A50%25%3Bbackground%2Dcolor%3Atransparent%3Btext%2Dalign%3Acenter%3Bline%2Dheight%3A28px%3Bfont%2Dsize%3A28px%3Bvertical%2Dalign%3Atop%3Btransition%3Aall%20150ms%7D%2Eel%2Dstep%5F%5Fhead%2Eis%2Dfinish%7Bcolor%3A%2320a0ff%3Bborder%2Dcolor%3A%2320a0ff%7D%2Eel%2Dstep%5F%5Fhead%2Eis%2Derror%7Bcolor%3A%23ff4949%3Bborder%2Dcolor%3A%23ff4949%7D%2Eel%2Dstep%5F%5Fhead%2Eis%2Dsuccess%7Bcolor%3A%2313ce66%3Bborder%2Dcolor%3A%2313ce66%7D%2Eel%2Dstep%5F%5Fhead%2Eis%2Dprocess%2C%2Eel%2Dstep%5F%5Fhead%2Eis%2Dwait%7Bcolor%3A%23c0ccda%3Bborder%2Dcolor%3A%23c0ccda%7D%2Eel%2Dstep%5F%5Fhead%2Eis%2Dtext%7Bfont%2Dsize%3A14px%3Bborder%2Dwidth%3A2px%3Bborder%2Dstyle%3Asolid%7D%2Eel%2Dstep%5F%5Fhead%2Eis%2Dtext%2Eis%2Dfinish%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%2320a0ff%3Bborder%2Dcolor%3A%2320a0ff%7D%2Eel%2Dstep%5F%5Fhead%2Eis%2Dtext%2Eis%2Derror%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23ff4949%3Bborder%2Dcolor%3A%23ff4949%7D%2Eel%2Dstep%5F%5Fhead%2Eis%2Dtext%2Eis%2Dsuccess%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%2313ce66%3Bborder%2Dcolor%3A%2313ce66%7D%2Eel%2Dstep%5F%5Fhead%2Eis%2Dtext%2Eis%2Dwait%7Bcolor%3A%23c0ccda%3Bbackground%2Dcolor%3A%23fff%3Bborder%2Dcolor%3A%23c0ccda%7D%2Eel%2Dstep%5F%5Fhead%2Eis%2Dtext%2Eis%2Dprocess%7Bcolor%3A%23fff%3Bbackground%2Dcolor%3A%23c0ccda%3Bborder%2Dcolor%3A%23c0ccda%7D%2Eel%2Dstep%5F%5Fmain%7Bwhite%2Dspace%3Anormal%3Bpadding%2Dright%3A10px%3Btext%2Dalign%3Aleft%7D%2Eel%2Dstep%5F%5Ftitle%7Bfont%2Dsize%3A14px%3Bline%2Dheight%3A32px%3Bdisplay%3Ainline%2Dblock%7D%2Eel%2Dstep%5F%5Ftitle%2Eis%2Dfinish%7Bfont%2Dweight%3A700%3Bcolor%3A%2320a0ff%7D%2Eel%2Dstep%5F%5Ftitle%2Eis%2Derror%7Bfont%2Dweight%3A700%3Bcolor%3A%23ff4949%7D%2Eel%2Dstep%5F%5Ftitle%2Eis%2Dsuccess%7Bfont%2Dweight%3A700%3Bcolor%3A%2313ce66%7D%2Eel%2Dstep%5F%5Ftitle%2Eis%2Dwait%7Bfont%2Dweight%3A400%3Bcolor%3A%2399a9bf%7D%2Eel%2Dstep%5F%5Ftitle%2Eis%2Dprocess%7Bfont%2Dweight%3A700%3Bcolor%3A%23475669%7D%2Eel%2Dstep%5F%5Fdescription%7Bfont%2Dsize%3A12px%3Bfont%2Dweight%3A400%3Bline%2Dheight%3A14px%7D%2Eel%2Dstep%5F%5Fdescription%2Eis%2Dfinish%7Bcolor%3A%2320a0ff%7D%2Eel%2Dstep%5F%5Fdescription%2Eis%2Derror%7Bcolor%3A%23ff4949%7D%2Eel%2Dstep%5F%5Fdescription%2Eis%2Dsuccess%7Bcolor%3A%2313ce66%7D%2Eel%2Dstep%5F%5Fdescription%2Eis%2Dwait%7Bcolor%3A%23c0ccda%7D%2Eel%2Dstep%5F%5Fdescription%2Eis%2Dprocess%7Bcolor%3A%238492a6%7D" rel="stylesheet" />
<script src="data:application/javascript;base64,IWZ1bmN0aW9uKGUsdCl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KHJlcXVpcmUoInZ1ZSIpKToiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZSgiRUxFTUVOVCIsWyJ2dWUiXSx0KToib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0cy5FTEVNRU5UPXQocmVxdWlyZSgidnVlIikpOmUuRUxFTUVOVD10KGUuVnVlKX0odGhpcyxmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChpKXtpZihuW2ldKXJldHVybiBuW2ldLmV4cG9ydHM7dmFyIHM9bltpXT17ZXhwb3J0czp7fSxpZDppLGxvYWRlZDohMX07cmV0dXJuIGVbaV0uY2FsbChzLmV4cG9ydHMscyxzLmV4cG9ydHMsdCkscy5sb2FkZWQ9ITAscy5leHBvcnRzfXZhciBuPXt9O3JldHVybiB0Lm09ZSx0LmM9bix0LnA9Ii9kaXN0LyIsdCgwKX0oW2Z1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9bigxKX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fXZhciBzPW4oMiksbz1pKHMpLGE9big0NCkscj1pKGEpLGw9big0OCksdT1pKGwpLGQ9big1MiksYz1pKGQpLGY9big1NSksaD1pKGYpLHA9big1OSksbT1pKHApLGc9big2Myksdj1pKGcpLHk9big2NyksYj1pKHkpLF89big3MiksQz1pKF8pLHc9big3NikseD1pKHcpLE09bigxNyksaz1pKE0pLEQ9big4MCksST1pKEQpLE49big4NCksUz1pKE4pLFQ9big4OCksRT1pKFQpLE89big5MiksQT1pKE8pLCQ9big5NiksUD1pKCQpLGo9bigxMDApLEw9aShqKSxGPW4oMTA0KSx6PWkoRiksUj1uKDcpLEI9aShSKSxWPW4oNDIpLFc9aShWKSxIPW4oMTA4KSxZPWkoSCksVT1uKDExMikscT1pKFUpLFo9bigxMTYpLEc9aShaKSxRPW4oMTIwKSxLPWkoUSksSj1uKDEzMyksWD1pKEopLGVlPW4oMTM2KSx0ZT1pKGVlKSxuZT1uKDE2NCksaWU9aShuZSksc2U9bigxNjkpLG9lPWkoc2UpLGFlPW4oMTc0KSxyZT1pKGFlKSxsZT1uKDE3OSksdWU9aShsZSksZGU9bigxODMpLGNlPWkoZGUpLGZlPW4oMTg4KSxoZT1pKGZlKSxwZT1uKDE5MiksbWU9aShwZSksZ2U9bigxOTYpLHZlPWkoZ2UpLHllPW4oMjAwKSxiZT1pKHllKSxfZT1uKDIyOSksQ2U9aShfZSksd2U9bigyMzIpLHhlPWkod2UpLE1lPW4oMzEpLGtlPWkoTWUpLERlPW4oMjM2KSxJZT1pKERlKSxOZT1uKDI0NyksU2U9aShOZSksVGU9bigyNTEpLEVlPWkoVGUpLE9lPW4oMjU2KSxBZT1pKE9lKSwkZT1uKDI2MSksUGU9aSgkZSksamU9bigyNjcpLExlPWkoamUpLEZlPW4oMjcxKSx6ZT1pKEZlKSxSZT1uKDI3NSksQmU9aShSZSksVmU9bigyNzcpLFdlPWkoVmUpLEhlPW4oMjgyKSxZZT1pKEhlKSxVZT1uKDI5NikscWU9aShVZSksWmU9bigzMDApLEdlPWkoWmUpLFFlPW4oMzEwKSxLZT1pKFFlKSxKZT1uKDMxNCksWGU9aShKZSksZXQ9bigzMTgpLHR0PWkoZXQpLG50PW4oMzIyKSxpdD1pKG50KSxzdD1uKDMyNiksb3Q9aShzdCksYXQ9bigxMikscnQ9aShhdCksbHQ9ZnVuY3Rpb24gdXQoZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O3V0Lmluc3RhbGxlZHx8KHJ0WyJkZWZhdWx0Il0udXNlKHQubG9jYWxlKSxlLmNvbXBvbmVudChvWyJkZWZhdWx0Il0ubmFtZSxvWyJkZWZhdWx0Il0pLGUuY29tcG9uZW50KHJbImRlZmF1bHQiXS5uYW1lLHJbImRlZmF1bHQiXSksZS5jb21wb25lbnQodVsiZGVmYXVsdCJdLm5hbWUsdVsiZGVmYXVsdCJdKSxlLmNvbXBvbmVudChjWyJkZWZhdWx0Il0ubmFtZSxjWyJkZWZhdWx0Il0pLGUuY29tcG9uZW50KGhbImRlZmF1bHQiXS5uYW1lLGhbImRlZmF1bHQiXSksZS5jb21wb25lbnQobVsiZGVmYXVsdCJdLm5hbWUsbVsiZGVmYXVsdCJdKSxlLmNvbXBvbmVudCh2WyJkZWZhdWx0Il0ubmFtZSx2WyJkZWZhdWx0Il0pLGUuY29tcG9uZW50KGJbImRlZmF1bHQiXS5uYW1lLGJbImRlZmF1bHQiXSksZS5jb21wb25lbnQoQ1siZGVmYXVsdCJdLm5hbWUsQ1siZGVmYXVsdCJdKSxlLmNvbXBvbmVudCh4WyJkZWZhdWx0Il0ubmFtZSx4WyJkZWZhdWx0Il0pLGUuY29tcG9uZW50KGtbImRlZmF1bHQiXS5uYW1lLGtbImRlZmF1bHQiXSksZS5jb21wb25lbnQoSVsiZGVmYXVsdCJdLm5hbWUsSVsiZGVmYXVsdCJdKSxlLmNvbXBvbmVudChTWyJkZWZhdWx0Il0ubmFtZSxTWyJkZWZhdWx0Il0pLGUuY29tcG9uZW50KEVbImRlZmF1bHQiXS5uYW1lLEVbImRlZmF1bHQiXSksZS5jb21wb25lbnQoQVsiZGVmYXVsdCJdLm5hbWUsQVsiZGVmYXVsdCJdKSxlLmNvbXBvbmVudChQWyJkZWZhdWx0Il0ubmFtZSxQWyJkZWZhdWx0Il0pLGUuY29tcG9uZW50KExbImRlZmF1bHQiXS5uYW1lLExbImRlZmF1bHQiXSksZS5jb21wb25lbnQoelsiZGVmYXVsdCJdLm5hbWUselsiZGVmYXVsdCJdKSxlLmNvbXBvbmVudChCWyJkZWZhdWx0Il0ubmFtZSxCWyJkZWZhdWx0Il0pLGUuY29tcG9uZW50KFdbImRlZmF1bHQiXS5uYW1lLFdbImRlZmF1bHQiXSksZS5jb21wb25lbnQoWVsiZGVmYXVsdCJdLm5hbWUsWVsiZGVmYXVsdCJdKSxlLmNvbXBvbmVudChxWyJkZWZhdWx0Il0ubmFtZSxxWyJkZWZhdWx0Il0pLGUuY29tcG9uZW50KEdbImRlZmF1bHQiXS5uYW1lLEdbImRlZmF1bHQiXSksZS5jb21wb25lbnQoS1siZGVmYXVsdCJdLm5hbWUsS1siZGVmYXVsdCJdKSxlLmNvbXBvbmVudChYWyJkZWZhdWx0Il0ubmFtZSxYWyJkZWZhdWx0Il0pLGUuY29tcG9uZW50KHRlWyJkZWZhdWx0Il0ubmFtZSx0ZVsiZGVmYXVsdCJdKSxlLmNvbXBvbmVudChpZVsiZGVmYXVsdCJdLm5hbWUsaWVbImRlZmF1bHQiXSksZS5jb21wb25lbnQob2VbImRlZmF1bHQiXS5uYW1lLG9lWyJkZWZhdWx0Il0pLGUuY29tcG9uZW50KHJlWyJkZWZhdWx0Il0ubmFtZSxyZVsiZGVmYXVsdCJdKSxlLmNvbXBvbmVudCh1ZVsiZGVmYXVsdCJdLm5hbWUsdWVbImRlZmF1bHQiXSksZS5jb21wb25lbnQoaGVbImRlZmF1bHQiXS5uYW1lLGhlWyJkZWZhdWx0Il0pLGUuY29tcG9uZW50KG1lWyJkZWZhdWx0Il0ubmFtZSxtZVsiZGVmYXVsdCJdKSxlLmNvbXBvbmVudCh2ZVsiZGVmYXVsdCJdLm5hbWUsdmVbImRlZmF1bHQiXSksZS5jb21wb25lbnQoYmVbImRlZmF1bHQiXS5uYW1lLGJlWyJkZWZhdWx0Il0pLGUuY29tcG9uZW50KENlWyJkZWZhdWx0Il0ubmFtZSxDZVsiZGVmYXVsdCJdKSxlLmNvbXBvbmVudCh4ZVsiZGVmYXVsdCJdLm5hbWUseGVbImRlZmF1bHQiXSksZS5jb21wb25lbnQoa2VbImRlZmF1bHQiXS5uYW1lLGtlWyJkZWZhdWx0Il0pLGUuY29tcG9uZW50KEllWyJkZWZhdWx0Il0ubmFtZSxJZVsiZGVmYXVsdCJdKSxlLmNvbXBvbmVudChTZVsiZGVmYXVsdCJdLm5hbWUsU2VbImRlZmF1bHQiXSksZS5jb21wb25lbnQoQWVbImRlZmF1bHQiXS5uYW1lLEFlWyJkZWZhdWx0Il0pLGUuY29tcG9uZW50KExlWyJkZWZhdWx0Il0ubmFtZSxMZVsiZGVmYXVsdCJdKSxlLmNvbXBvbmVudCh6ZVsiZGVmYXVsdCJdLm5hbWUsemVbImRlZmF1bHQiXSksZS5jb21wb25lbnQoQmVbImRlZmF1bHQiXS5uYW1lLEJlWyJkZWZhdWx0Il0pLGUuY29tcG9uZW50KFdlWyJkZWZhdWx0Il0ubmFtZSxXZVsiZGVmYXVsdCJdKSxlLmNvbXBvbmVudChZZVsiZGVmYXVsdCJdLm5hbWUsWWVbImRlZmF1bHQiXSksZS5jb21wb25lbnQocWVbImRlZmF1bHQiXS5uYW1lLHFlWyJkZWZhdWx0Il0pLGUuY29tcG9uZW50KEtlWyJkZWZhdWx0Il0ubmFtZSxLZVsiZGVmYXVsdCJdKSxlLmNvbXBvbmVudChYZVsiZGVmYXVsdCJdLm5hbWUsWGVbImRlZmF1bHQiXSksZS5jb21wb25lbnQodHRbImRlZmF1bHQiXS5uYW1lLHR0WyJkZWZhdWx0Il0pLGUuY29tcG9uZW50KGl0WyJkZWZhdWx0Il0ubmFtZSxpdFsiZGVmYXVsdCJdKSxlLmNvbXBvbmVudChvdFsiZGVmYXVsdCJdLm5hbWUsb3RbImRlZmF1bHQiXSksZS51c2UoUGVbImRlZmF1bHQiXS5kaXJlY3RpdmUpLGUucHJvdG90eXBlLiRsb2FkaW5nPVBlWyJkZWZhdWx0Il0uc2VydmljZSxlLnByb3RvdHlwZS4kbXNnYm94PWNlWyJkZWZhdWx0Il0sZS5wcm90b3R5cGUuJGFsZXJ0PWNlWyJkZWZhdWx0Il0uYWxlcnQsZS5wcm90b3R5cGUuJGNvbmZpcm09Y2VbImRlZmF1bHQiXS5jb25maXJtLGUucHJvdG90eXBlLiRwcm9tcHQ9Y2VbImRlZmF1bHQiXS5wcm9tcHQsZS5wcm90b3R5cGUuJG5vdGlmeT1FZVsiZGVmYXVsdCJdLGUucHJvdG90eXBlLiRtZXNzYWdlPUdlWyJkZWZhdWx0Il0pfTsidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93LlZ1ZSYmbHQod2luZG93LlZ1ZSksZS5leHBvcnRzPXt2ZXJzaW9uOiIxLjAuNyIsbG9jYWxlOnJ0WyJkZWZhdWx0Il0udXNlLGluc3RhbGw6bHQsTG9hZGluZzpQZVsiZGVmYXVsdCJdLFBhZ2luYXRpb246b1siZGVmYXVsdCJdLERpYWxvZzpyWyJkZWZhdWx0Il0sQXV0b2NvbXBsZXRlOnVbImRlZmF1bHQiXSxEcm9wZG93bjpjWyJkZWZhdWx0Il0sRHJvcGRvd25NZW51OmhbImRlZmF1bHQiXSxEcm9wZG93bkl0ZW06bVsiZGVmYXVsdCJdLE1lbnU6dlsiZGVmYXVsdCJdLFN1Ym1lbnU6YlsiZGVmYXVsdCJdLE1lbnVJdGVtOkNbImRlZmF1bHQiXSxNZW51SXRlbUdyb3VwOnhbImRlZmF1bHQiXSxJbnB1dDprWyJkZWZhdWx0Il0sSW5wdXROdW1iZXI6SVsiZGVmYXVsdCJdLFJhZGlvOlNbImRlZmF1bHQiXSxSYWRpb0dyb3VwOkVbImRlZmF1bHQiXSxSYWRpb0J1dHRvbjpBWyJkZWZhdWx0Il0sQ2hlY2tib3g6UFsiZGVmYXVsdCJdLENoZWNrYm94R3JvdXA6TFsiZGVmYXVsdCJdLFN3aXRjaDp6WyJkZWZhdWx0Il0sU2VsZWN0OkJbImRlZmF1bHQiXSxPcHRpb246V1siZGVmYXVsdCJdLE9wdGlvbkdyb3VwOllbImRlZmF1bHQiXSxCdXR0b246cVsiZGVmYXVsdCJdLEJ1dHRvbkdyb3VwOkdbImRlZmF1bHQiXSxUYWJsZTpLWyJkZWZhdWx0Il0sVGFibGVDb2x1bW46WFsiZGVmYXVsdCJdLERhdGVQaWNrZXI6dGVbImRlZmF1bHQiXSxUaW1lU2VsZWN0OmllWyJkZWZhdWx0Il0sVGltZVBpY2tlcjpvZVsiZGVmYXVsdCJdLFBvcG92ZXI6cmVbImRlZmF1bHQiXSxUb29sdGlwOnVlWyJkZWZhdWx0Il0sTWVzc2FnZUJveDpjZVsiZGVmYXVsdCJdLEJyZWFkY3J1bWI6aGVbImRlZmF1bHQiXSxCcmVhZGNydW1iSXRlbTptZVsiZGVmYXVsdCJdLEZvcm06dmVbImRlZmF1bHQiXSxGb3JtSXRlbTpiZVsiZGVmYXVsdCJdLFRhYnM6Q2VbImRlZmF1bHQiXSxUYWJQYW5lOnhlWyJkZWZhdWx0Il0sVGFnOmtlWyJkZWZhdWx0Il0sVHJlZTpJZVsiZGVmYXVsdCJdLEFsZXJ0OlNlWyJkZWZhdWx0Il0sTm90aWZpY2F0aW9uOkVlWyJkZWZhdWx0Il0sU2xpZGVyOkFlWyJkZWZhdWx0Il0sSWNvbjpMZVsiZGVmYXVsdCJdLFJvdzp6ZVsiZGVmYXVsdCJdLENvbDpCZVsiZGVmYXVsdCJdLFVwbG9hZDpXZVsiZGVmYXVsdCJdLFByb2dyZXNzOlllWyJkZWZhdWx0Il0sU3Bpbm5lcjpxZVsiZGVmYXVsdCJdLE1lc3NhZ2U6R2VbImRlZmF1bHQiXSxCYWRnZTpLZVsiZGVmYXVsdCJdLENhcmQ6WGVbImRlZmF1bHQiXSxSYXRlOnR0WyJkZWZhdWx0Il0sU3RlcHM6aXRbImRlZmF1bHQiXSxTdGVwOm90WyJkZWZhdWx0Il19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19dC5fX2VzTW9kdWxlPSEwO3ZhciBzPW4oMyksbz1pKHMpO29bImRlZmF1bHQiXS5pbnN0YWxsPWZ1bmN0aW9uKGUpe2UuY29tcG9uZW50KG9bImRlZmF1bHQiXS5uYW1lLG9bImRlZmF1bHQiXSl9LHRbImRlZmF1bHQiXT1vWyJkZWZhdWx0Il19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX10Ll9fZXNNb2R1bGU9ITA7dmFyIHM9big0KSxvPWkocyksYT1uKDcpLHI9aShhKSxsPW4oNDIpLHU9aShsKSxkPW4oNDMpLGM9aShkKSxmPW4oMTEpLGg9aShmKTt0WyJkZWZhdWx0Il09e25hbWU6IkVsUGFnaW5hdGlvbiIsbWl4aW5zOltjWyJkZWZhdWx0Il1dLHByb3BzOntwYWdlU2l6ZTp7dHlwZTpOdW1iZXIsImRlZmF1bHQiOjEwfSxzbWFsbDpCb29sZWFuLHRvdGFsOk51bWJlcixwYWdlQ291bnQ6TnVtYmVyLGN1cnJlbnRQYWdlOnt0eXBlOk51bWJlciwiZGVmYXVsdCI6MX0sbGF5b3V0OnsiZGVmYXVsdCI6InByZXYsIHBhZ2VyLCBuZXh0LCBqdW1wZXIsIC0+LCB0b3RhbCJ9LHBhZ2VTaXplczp7dHlwZTpBcnJheSwiZGVmYXVsdCI6ZnVuY3Rpb24oKXtyZXR1cm5bMTAsMjAsMzAsNDAsNTAsMTAwXX19fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue2ludGVybmFsQ3VycmVudFBhZ2U6MSxpbnRlcm5hbFBhZ2VTaXplOjB9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZSgiZGl2Iix7ImNsYXNzIjoiZWwtcGFnaW5hdGlvbiJ9LFtdKSxuPXRoaXMubGF5b3V0fHwiIjtpZihuKXt2YXIgaT17cHJldjplKCJwcmV2IixudWxsLFtdKSxqdW1wZXI6ZSgianVtcGVyIixudWxsLFtdKSxwYWdlcjplKCJwYWdlciIse2F0dHJzOntjdXJyZW50UGFnZTp0aGlzLmludGVybmFsQ3VycmVudFBhZ2UscGFnZUNvdW50OnRoaXMuaW50ZXJuYWxQYWdlQ291bnR9LG9uOntjaGFuZ2U6dGhpcy5oYW5kbGVDdXJyZW50Q2hhbmdlfX0sW10pLG5leHQ6ZSgibmV4dCIsbnVsbCxbXSksc2l6ZXM6ZSgic2l6ZXMiLHthdHRyczp7cGFnZVNpemVzOnRoaXMucGFnZVNpemVzfX0sW10pLHNsb3Q6ZSgic2xvdCIsbnVsbCxbXSksdG90YWw6ZSgidG90YWwiLG51bGwsW10pfSxzPW4uc3BsaXQoIiwiKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbSgpfSksbz1lKCJkaXYiLHsiY2xhc3MiOiJlbC1wYWdpbmF0aW9uX19yaWdodHdyYXBwZXIifSxbXSksYT0hMTtyZXR1cm4gdGhpcy5zbWFsbCYmKHQuZGF0YVsiY2xhc3MiXSs9IiBlbC1wYWdpbmF0aW9uLS1zbWFsbCIpLHMuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4iLT4iPT09ZT92b2lkKGE9ITApOnZvaWQoYT9vLmNoaWxkcmVuLnB1c2goaVtlXSk6dC5jaGlsZHJlbi5wdXNoKGlbZV0pKX0pLGEmJnQuY2hpbGRyZW4ucHVzaChvKSx0fX0sY29tcG9uZW50czp7UHJldjp7cmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJidXR0b24iLHsiY2xhc3MiOlsiYnRuLXByZXYiLHtkaXNhYmxlZDp0aGlzLiRwYXJlbnQuaW50ZXJuYWxDdXJyZW50UGFnZTw9MX1dLG9uOntjbGljazp0aGlzLiRwYXJlbnQucHJldn19LFtlKCJpIix7ImNsYXNzIjoiZWwtaWNvbiBlbC1pY29uLWFycm93LWxlZnQifSxbXSldKX19LE5leHQ6e3JlbmRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZSgiYnV0dG9uIix7ImNsYXNzIjpbImJ0bi1uZXh0Iix7ZGlzYWJsZWQ6dGhpcy4kcGFyZW50LmludGVybmFsQ3VycmVudFBhZ2U9PT10aGlzLiRwYXJlbnQuaW50ZXJuYWxQYWdlQ291bnR8fDA9PT10aGlzLiRwYXJlbnQuaW50ZXJuYWxQYWdlQ291bnR9XSxvbjp7Y2xpY2s6dGhpcy4kcGFyZW50Lm5leHR9fSxbZSgiaSIseyJjbGFzcyI6ImVsLWljb24gZWwtaWNvbi1hcnJvdy1yaWdodCJ9LFtdKV0pfX0sU2l6ZXM6e21peGluczpbaFsiZGVmYXVsdCJdXSxwcm9wczp7cGFnZVNpemVzOkFycmF5fSx3YXRjaDp7cGFnZVNpemVzOntpbW1lZGlhdGU6ITAsaGFuZGxlcjpmdW5jdGlvbihlKXtBcnJheS5pc0FycmF5KGUpJiYodGhpcy4kcGFyZW50LmludGVybmFsUGFnZVNpemU9ZS5pbmRleE9mKHRoaXMuJHBhcmVudC5wYWdlU2l6ZSk+LTE/dGhpcy4kcGFyZW50LnBhZ2VTaXplOnRoaXMucGFnZVNpemVzWzBdKX19fSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gZSgic3BhbiIseyJjbGFzcyI6ImVsLXBhZ2luYXRpb25fX3NpemVzIn0sW2UoImVsLXNlbGVjdCIse2F0dHJzOnt2YWx1ZTp0aGlzLiRwYXJlbnQuaW50ZXJuYWxQYWdlU2l6ZX0sb246e2lucHV0OnRoaXMuaGFuZGxlQ2hhbmdlfX0sW3RoaXMucGFnZVNpemVzLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gZSgiZWwtb3B0aW9uIix7YXR0cnM6e3ZhbHVlOm4sbGFiZWw6bisiICIrdC50KCJlbC5wYWdpbmF0aW9uLnBhZ2VzaXplIil9fSxbXSl9KV0pXSl9LGNvbXBvbmVudHM6e0VsU2VsZWN0OnJbImRlZmF1bHQiXSxFbE9wdGlvbjp1WyJkZWZhdWx0Il19LG1ldGhvZHM6e2hhbmRsZUNoYW5nZTpmdW5jdGlvbihlKXtlIT09dGhpcy4kcGFyZW50LmludGVybmFsUGFnZVNpemUmJih0aGlzLiRwYXJlbnQuaW50ZXJuYWxQYWdlU2l6ZT1lPXBhcnNlSW50KGUsMTApLHRoaXMuJHBhcmVudC4kZW1pdCgic2l6ZS1jaGFuZ2UiLGUpKX19fSxKdW1wZXI6e21peGluczpbaFsiZGVmYXVsdCJdXSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue29sZFZhbHVlOm51bGx9fSxtZXRob2RzOntoYW5kbGVGb2N1czpmdW5jdGlvbihlKXt0aGlzLm9sZFZhbHVlPWUudGFyZ2V0LnZhbHVlfSxoYW5kbGVDaGFuZ2U6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YXJnZXQ7dGhpcy4kcGFyZW50LmludGVybmFsQ3VycmVudFBhZ2U9dGhpcy4kcGFyZW50LmdldFZhbGlkQ3VycmVudFBhZ2UodC52YWx1ZSksdGhpcy5vbGRWYWx1ZT1udWxsfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJzcGFuIix7ImNsYXNzIjoiZWwtcGFnaW5hdGlvbl9fanVtcCJ9LFt0aGlzLnQoImVsLnBhZ2luYXRpb24uZ290byIpLGUoImlucHV0Iix7ImNsYXNzIjoiZWwtcGFnaW5hdGlvbl9fZWRpdG9yIixhdHRyczp7dHlwZToibnVtYmVyIixtaW46MSxtYXg6dGhpcy5pbnRlcm5hbFBhZ2VDb3VudCxudW1iZXI6ITB9LGRvbVByb3BzOnt2YWx1ZTp0aGlzLiRwYXJlbnQuaW50ZXJuYWxDdXJyZW50UGFnZX0sb246e2NoYW5nZTp0aGlzLmhhbmRsZUNoYW5nZSxmb2N1czp0aGlzLmhhbmRsZUZvY3VzfSxzdHlsZTp7d2lkdGg6IjMwcHgifX0sW10pLHRoaXMudCgiZWwucGFnaW5hdGlvbi5wYWdlQ2xhc3NpZmllciIpXSl9fSxUb3RhbDp7bWl4aW5zOltoWyJkZWZhdWx0Il1dLHJlbmRlcjpmdW5jdGlvbihlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHRoaXMuJHBhcmVudC50b3RhbD9lKCJzcGFuIix7ImNsYXNzIjoiZWwtcGFnaW5hdGlvbl9fdG90YWwifSxbdGhpcy50KCJlbC5wYWdpbmF0aW9uLnRvdGFsIix7dG90YWw6dGhpcy4kcGFyZW50LnRvdGFsfSldKToiIn19LFBhZ2VyOm9bImRlZmF1bHQiXX0sbWV0aG9kczp7Z2V0TWlncmF0aW5nQ29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue3Byb3BzOnt9LGV2ZW50czp7Y3VycmVudGNoYW5nZToiUGFnaW5hdGlvbjogY3VycmVudGNoYW5nZSBoYXMgYmVlbiByZW5hbWVkIHRvIGN1cnJlbnQtY2hhbmdlIixzaXplY2hhbmdlOiJQYWdpbmF0aW9uOiBzaXplY2hhbmdlIGhhcyBiZWVuIHJlbmFtZWQgdG8gc2l6ZS1jaGFuZ2UifX19LGhhbmRsZUN1cnJlbnRDaGFuZ2U6ZnVuY3Rpb24oZSl7dGhpcy5pbnRlcm5hbEN1cnJlbnRQYWdlPXRoaXMuZ2V0VmFsaWRDdXJyZW50UGFnZShlKX0scHJldjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuaW50ZXJuYWxDdXJyZW50UGFnZS0xO3RoaXMuaW50ZXJuYWxDdXJyZW50UGFnZT10aGlzLmdldFZhbGlkQ3VycmVudFBhZ2UoZSl9LG5leHQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmludGVybmFsQ3VycmVudFBhZ2UrMTt0aGlzLmludGVybmFsQ3VycmVudFBhZ2U9dGhpcy5nZXRWYWxpZEN1cnJlbnRQYWdlKGUpfSxnZXRWYWxpZEN1cnJlbnRQYWdlOmZ1bmN0aW9uKGUpe2U9cGFyc2VJbnQoZSwxMCk7dmFyIHQ9Im51bWJlciI9PXR5cGVvZiB0aGlzLmludGVybmFsUGFnZUNvdW50LG49dm9pZCAwO3JldHVybiB0P2U8MT9uPTE6ZT50aGlzLmludGVybmFsUGFnZUNvdW50JiYobj10aGlzLmludGVybmFsUGFnZUNvdW50KTooaXNOYU4oZSl8fGU8MSkmJihuPTEpLHZvaWQgMD09PW4mJmlzTmFOKGUpP249MTowPT09biYmKG49MSksdm9pZCAwPT09bj9lOm59fSxjb21wdXRlZDp7aW50ZXJuYWxQYWdlQ291bnQ6ZnVuY3Rpb24oKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHRoaXMudG90YWw/TWF0aC5jZWlsKHRoaXMudG90YWwvdGhpcy5pbnRlcm5hbFBhZ2VTaXplKToibnVtYmVyIj09dHlwZW9mIHRoaXMucGFnZUNvdW50P3RoaXMucGFnZUNvdW50Om51bGx9fSx3YXRjaDp7Y3VycmVudFBhZ2U6e2ltbWVkaWF0ZTohMCxoYW5kbGVyOmZ1bmN0aW9uKGUpe3RoaXMuaW50ZXJuYWxDdXJyZW50UGFnZT1lfX0scGFnZVNpemU6e2ltbWVkaWF0ZTohMCxoYW5kbGVyOmZ1bmN0aW9uKGUpe3RoaXMuaW50ZXJuYWxQYWdlU2l6ZT1lfX0saW50ZXJuYWxDdXJyZW50UGFnZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7ZT1wYXJzZUludChlLDEwKSxlPWlzTmFOKGUpP3R8fDE6dGhpcy5nZXRWYWxpZEN1cnJlbnRQYWdlKGUpLHZvaWQgMCE9PWU/dGhpcy4kbmV4dFRpY2soZnVuY3Rpb24oKXtuLmludGVybmFsQ3VycmVudFBhZ2U9ZSx0IT09ZSYmbi4kZW1pdCgiY3VycmVudC1jaGFuZ2UiLG4uaW50ZXJuYWxDdXJyZW50UGFnZSl9KTp0aGlzLiRlbWl0KCJjdXJyZW50LWNoYW5nZSIsdGhpcy5pbnRlcm5hbEN1cnJlbnRQYWdlKX0saW50ZXJuYWxQYWdlQ291bnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5pbnRlcm5hbEN1cnJlbnRQYWdlO2U+MCYmMD09PXQ/dGhpcy5pbnRlcm5hbEN1cnJlbnRQYWdlPTE6dD5lJiYodGhpcy5pbnRlcm5hbEN1cnJlbnRQYWdlPTA9PT1lPzE6ZSl9fX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgaSxzO2k9big1KTt2YXIgbz1uKDYpO3M9aT1pfHx7fSwib2JqZWN0IiE9dHlwZW9mIGlbImRlZmF1bHQiXSYmImZ1bmN0aW9uIiE9dHlwZW9mIGlbImRlZmF1bHQiXXx8KHM9aT1pWyJkZWZhdWx0Il0pLCJmdW5jdGlvbiI9PXR5cGVvZiBzJiYocz1zLm9wdGlvbnMpLHMucmVuZGVyPW8ucmVuZGVyLHMuc3RhdGljUmVuZGVyRm5zPW8uc3RhdGljUmVuZGVyRm5zLGUuZXhwb3J0cz1pfSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0Ijt0Ll9fZXNNb2R1bGU9ITAsdFsiZGVmYXVsdCJdPXtuYW1lOiJFbFBhZ2VyIixwcm9wczp7Y3VycmVudFBhZ2U6TnVtYmVyLHBhZ2VDb3VudDpOdW1iZXJ9LHdhdGNoOntzaG93UHJldk1vcmU6ZnVuY3Rpb24oZSl7ZXx8KHRoaXMucXVpY2twcmV2SWNvbkNsYXNzPSJlbC1pY29uLW1vcmUiKX0sc2hvd05leHRNb3JlOmZ1bmN0aW9uKGUpe2V8fCh0aGlzLnF1aWNrbmV4dEljb25DbGFzcz0iZWwtaWNvbi1tb3JlIil9fSxtZXRob2RzOntvblBhZ2VyQ2xpY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YXJnZXQ7aWYoIlVMIiE9PXQudGFnTmFtZSl7dmFyIG49TnVtYmVyKGUudGFyZ2V0LnRleHRDb250ZW50KSxpPXRoaXMucGFnZUNvdW50LHM9dGhpcy5jdXJyZW50UGFnZTt0LmNsYXNzTmFtZS5pbmRleE9mKCJtb3JlIikhPT0tMSYmKHQuY2xhc3NOYW1lLmluZGV4T2YoInF1aWNrcHJldiIpIT09LTE/bj1zLTU6dC5jbGFzc05hbWUuaW5kZXhPZigicXVpY2tuZXh0IikhPT0tMSYmKG49cys1KSksaXNOYU4obil8fChuPDEmJihuPTEpLG4+aSYmKG49aSkpLG4hPT1zJiZ0aGlzLiRlbWl0KCJjaGFuZ2UiLG4pfX19LGNvbXB1dGVkOntwYWdlcnM6ZnVuY3Rpb24oKXt2YXIgZT03LHQ9TnVtYmVyKHRoaXMuY3VycmVudFBhZ2UpLG49TnVtYmVyKHRoaXMucGFnZUNvdW50KSxpPSExLHM9ITE7bj5lJiYodD5lLTImJihpPSEwKSx0PG4tMiYmKHM9ITApKTt2YXIgbz1bXTtpZihpJiYhcylmb3IodmFyIGE9bi0oZS0yKSxyPWE7cjxuO3IrKylvLnB1c2gocik7ZWxzZSBpZighaSYmcylmb3IodmFyIGw9MjtsPGU7bCsrKW8ucHVzaChsKTtlbHNlIGlmKGkmJnMpZm9yKHZhciB1PU1hdGguZmxvb3IoZS8yKS0xLGQ9dC11O2Q8PXQrdTtkKyspby5wdXNoKGQpO2Vsc2UgZm9yKHZhciBjPTI7YzxuO2MrKylvLnB1c2goYyk7cmV0dXJuIHRoaXMuc2hvd1ByZXZNb3JlPWksdGhpcy5zaG93TmV4dE1vcmU9cyxvfX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntjdXJyZW50Om51bGwsc2hvd1ByZXZNb3JlOiExLHNob3dOZXh0TW9yZTohMSxxdWlja25leHRJY29uQ2xhc3M6ImVsLWljb24tbW9yZSIscXVpY2twcmV2SWNvbkNsYXNzOiJlbC1pY29uLW1vcmUifX19fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWUuJGNyZWF0ZUVsZW1lbnQ7ZS5fYztyZXR1cm4gdCgidWwiLHtzdGF0aWNDbGFzczoiZWwtcGFnZXIiLG9uOntjbGljazplLm9uUGFnZXJDbGlja319LFtlLnBhZ2VDb3VudD4wP3QoImxpIix7c3RhdGljQ2xhc3M6Im51bWJlciIsImNsYXNzIjp7YWN0aXZlOjE9PT1lLmN1cnJlbnRQYWdlfX0sWyIxIl0pOmUuX2UoKSxlLnNob3dQcmV2TW9yZT90KCJsaSIse3N0YXRpY0NsYXNzOiJlbC1pY29uIG1vcmUgYnRuLXF1aWNrcHJldiIsImNsYXNzIjpbZS5xdWlja3ByZXZJY29uQ2xhc3NdLG9uOnttb3VzZWVudGVyOmZ1bmN0aW9uKHQpe2UucXVpY2twcmV2SWNvbkNsYXNzPSJlbC1pY29uLWQtYXJyb3ctbGVmdCJ9LG1vdXNlbGVhdmU6ZnVuY3Rpb24odCl7ZS5xdWlja3ByZXZJY29uQ2xhc3M9ImVsLWljb24tbW9yZSJ9fX0pOmUuX2UoKSxlLl9sKGUucGFnZXJzLGZ1bmN0aW9uKG4pe3JldHVybiB0KCJsaSIse3N0YXRpY0NsYXNzOiJudW1iZXIiLCJjbGFzcyI6e2FjdGl2ZTplLmN1cnJlbnRQYWdlPT09bn19LFtlLl9zKG4pXSl9KSxlLnNob3dOZXh0TW9yZT90KCJsaSIse3N0YXRpY0NsYXNzOiJlbC1pY29uIG1vcmUgYnRuLXF1aWNrbmV4dCIsImNsYXNzIjpbZS5xdWlja25leHRJY29uQ2xhc3NdLG9uOnttb3VzZWVudGVyOmZ1bmN0aW9uKHQpe2UucXVpY2tuZXh0SWNvbkNsYXNzPSJlbC1pY29uLWQtYXJyb3ctcmlnaHQifSxtb3VzZWxlYXZlOmZ1bmN0aW9uKHQpe2UucXVpY2tuZXh0SWNvbkNsYXNzPSJlbC1pY29uLW1vcmUifX19KTplLl9lKCksZS5wYWdlQ291bnQ+MT90KCJsaSIse3N0YXRpY0NsYXNzOiJudW1iZXIiLCJjbGFzcyI6e2FjdGl2ZTplLmN1cnJlbnRQYWdlPT09ZS5wYWdlQ291bnR9fSxbZS5fcyhlLnBhZ2VDb3VudCldKTplLl9lKCldKX0sc3RhdGljUmVuZGVyRm5zOltdfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fXQuX19lc01vZHVsZT0hMDt2YXIgcz1uKDgpLG89aShzKTtvWyJkZWZhdWx0Il0uaW5zdGFsbD1mdW5jdGlvbihlKXtlLmNvbXBvbmVudChvWyJkZWZhdWx0Il0ubmFtZSxvWyJkZWZhdWx0Il0pfSx0WyJkZWZhdWx0Il09b1siZGVmYXVsdCJdfSxmdW5jdGlvbihlLHQsbil7dmFyIGkscztpPW4oOSk7dmFyIG89big0MSk7cz1pPWl8fHt9LCJvYmplY3QiIT10eXBlb2YgaVsiZGVmYXVsdCJdJiYiZnVuY3Rpb24iIT10eXBlb2YgaVsiZGVmYXVsdCJdfHwocz1pPWlbImRlZmF1bHQiXSksImZ1bmN0aW9uIj09dHlwZW9mIHMmJihzPXMub3B0aW9ucykscy5yZW5kZXI9by5yZW5kZXIscy5zdGF0aWNSZW5kZXJGbnM9by5zdGF0aWNSZW5kZXJGbnMsZS5leHBvcnRzPWl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX10Ll9fZXNNb2R1bGU9ITA7dmFyIHM9bigxMCksbz1pKHMpLGE9bigxMSkscj1pKGEpLGw9bigxNyksdT1pKGwpLGQ9bigyMiksYz1pKGQpLGY9bigyOCksaD1pKGYpLHA9bigzMSksbT1pKHApLGc9bigzNSksdj1pKGcpLHk9bigzNyksYj1pKHkpLF89bigzOSksQz1uKDQwKSx3PW4oMTIpLHg9e2xhcmdlOjQyLHNtYWxsOjMwLG1pbmk6MjJ9O3RbImRlZmF1bHQiXT17bWl4aW5zOltvWyJkZWZhdWx0Il0sclsiZGVmYXVsdCJdXSxuYW1lOiJFbFNlbGVjdCIsY29tcG9uZW50TmFtZToiRWxTZWxlY3QiLGNvbXB1dGVkOntpY29uQ2xhc3M6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmNsZWFyYWJsZSYmIXRoaXMuZGlzYWJsZWQmJnRoaXMuaW5wdXRIb3ZlcmluZyYmIXRoaXMubXVsdGlwbGUmJnZvaWQgMCE9PXRoaXMudmFsdWUmJiIiIT09dGhpcy52YWx1ZTtyZXR1cm4gZT8iY2lyY2xlLWNsb3NlIGlzLXNob3ctY2xvc2UiOnRoaXMucmVtb3RlJiZ0aGlzLmZpbHRlcmFibGU/IiI6ImNhcmV0LXRvcCJ9LGRlYm91bmNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVtb3RlPzMwMDowfSxlbXB0eVRleHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb2FkaW5nP3RoaXMudCgiZWwuc2VsZWN0LmxvYWRpbmciKTooIXRoaXMucmVtb3RlfHwiIiE9PXRoaXMucXVlcnl8fDAhPT10aGlzLm9wdGlvbnMubGVuZ3RoKSYmKHRoaXMuZmlsdGVyYWJsZSYmdGhpcy5vcHRpb25zLmxlbmd0aD4wJiYwPT09dGhpcy5maWx0ZXJlZE9wdGlvbnNDb3VudD90aGlzLnQoImVsLnNlbGVjdC5ub01hdGNoIik6MD09PXRoaXMub3B0aW9ucy5sZW5ndGg/dGhpcy50KCJlbC5zZWxlY3Qubm9EYXRhIik6bnVsbCl9LHNob3dOZXdPcHRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5vcHRpb25zLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hZS5jcmVhdGVkfSkuc29tZShmdW5jdGlvbih0KXtyZXR1cm4gdC5jdXJyZW50TGFiZWw9PT1lLnF1ZXJ5fSk7cmV0dXJuIHRoaXMuZmlsdGVyYWJsZSYmdGhpcy5hbGxvd0NyZWF0ZSYmIiIhPT10aGlzLnF1ZXJ5JiYhdH19LGNvbXBvbmVudHM6e0VsSW5wdXQ6dVsiZGVmYXVsdCJdLEVsU2VsZWN0TWVudTpjWyJkZWZhdWx0Il0sRWxPcHRpb246aFsiZGVmYXVsdCJdLEVsVGFnOm1bImRlZmF1bHQiXX0sZGlyZWN0aXZlczp7Q2xpY2tvdXRzaWRlOmJbImRlZmF1bHQiXX0scHJvcHM6e25hbWU6U3RyaW5nLHZhbHVlOnt9LHNpemU6U3RyaW5nLGRpc2FibGVkOkJvb2xlYW4sY2xlYXJhYmxlOkJvb2xlYW4sZmlsdGVyYWJsZTpCb29sZWFuLGFsbG93Q3JlYXRlOkJvb2xlYW4sbG9hZGluZzpCb29sZWFuLHJlbW90ZTpCb29sZWFuLHJlbW90ZU1ldGhvZDpGdW5jdGlvbixmaWx0ZXJNZXRob2Q6RnVuY3Rpb24sbXVsdGlwbGU6Qm9vbGVhbixtdWx0aXBsZUxpbWl0Ont0eXBlOk51bWJlciwiZGVmYXVsdCI6MH0scGxhY2Vob2xkZXI6e3R5cGU6U3RyaW5nLCJkZWZhdWx0IjpmdW5jdGlvbigpe3JldHVybigwLHcudCkoImVsLnNlbGVjdC5wbGFjZWhvbGRlciIpfX19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57b3B0aW9uczpbXSxjYWNoZWRPcHRpb25zOltdLHNlbGVjdGVkOnRoaXMubXVsdGlwbGU/W106e30saXNTZWxlY3Q6ITAsaW5wdXRMZW5ndGg6MjAsaW5wdXRXaWR0aDowLGNhY2hlZFBsYWNlSG9sZGVyOiIiLG9wdGlvbnNDb3VudDowLGZpbHRlcmVkT3B0aW9uc0NvdW50OjAsZHJvcGRvd25VbDpudWxsLHZpc2libGU6ITEsc2VsZWN0ZWRMYWJlbDoiIixob3ZlckluZGV4Oi0xLHF1ZXJ5OiIiLGlzRm9yY2VkVmlzaWJsZTohMSxib3R0b21PdmVyZmxvd0JlZm9yZUhpZGRlbjowLHRvcE92ZXJmbG93QmVmb3JlSGlkZGVuOjAsb3B0aW9uc0FsbERpc2FibGVkOiExLGlucHV0SG92ZXJpbmc6ITEsY3VycmVudFBsYWNlaG9sZGVyOiIifX0sd2F0Y2g6e3BsYWNlaG9sZGVyOmZ1bmN0aW9uKGUpe3RoaXMuY3VycmVudFBsYWNlaG9sZGVyPWV9LHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMubXVsdGlwbGUmJih0aGlzLnJlc2V0SW5wdXRIZWlnaHQoKSxlLmxlbmd0aD4wfHx0aGlzLiRyZWZzLmlucHV0JiYiIiE9PXRoaXMucXVlcnk/dGhpcy5jdXJyZW50UGxhY2Vob2xkZXI9IiI6dGhpcy5jdXJyZW50UGxhY2Vob2xkZXI9dGhpcy5jYWNoZWRQbGFjZUhvbGRlcix0aGlzLmRpc3BhdGNoKCJFbEZvcm1JdGVtIiwiZWwuZm9ybS5jaGFuZ2UiLGUpKSx0aGlzLnNldFNlbGVjdGVkKCksdGhpcy5maWx0ZXJhYmxlJiYhdGhpcy5tdWx0aXBsZSYmKHRoaXMuaW5wdXRMZW5ndGg9MjApLHRoaXMuJGVtaXQoImNoYW5nZSIsZSl9LHF1ZXJ5OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmJyb2FkY2FzdCgiRWxTZWxlY3REcm9wZG93biIsInVwZGF0ZVBvcHBlciIpLHRoaXMuaG92ZXJJbmRleD0tMSx0aGlzLm11bHRpcGxlJiZ0aGlzLmZpbHRlcmFibGUmJnRoaXMucmVzZXRJbnB1dEhlaWdodCgpLHRoaXMuaXNGb3JjZWRWaXNpYmxlP3ZvaWQodGhpcy5pc0ZvcmNlZFZpc2libGU9ITEpOnZvaWQodGhpcy5yZW1vdGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnJlbW90ZU1ldGhvZD8odGhpcy5ob3ZlckluZGV4PS0xLHRoaXMucmVtb3RlTWV0aG9kKGUpLHRoaXMuYnJvYWRjYXN0KCJFbE9wdGlvbiIsInJlc2V0SW5kZXgiKSk6ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZmlsdGVyTWV0aG9kPyh0aGlzLmZpbHRlck1ldGhvZChlKSx0aGlzLmJyb2FkY2FzdCgiRWxPcHRpb25Hcm91cCIsInF1ZXJ5Q2hhbmdlIikpOih0aGlzLmZpbHRlcmVkT3B0aW9uc0NvdW50PXRoaXMub3B0aW9uc0NvdW50LHRoaXMuYnJvYWRjYXN0KCJFbE9wdGlvbiIsInF1ZXJ5Q2hhbmdlIixlKSx0aGlzLmJyb2FkY2FzdCgiRWxPcHRpb25Hcm91cCIsInF1ZXJ5Q2hhbmdlIikpKX0sdmlzaWJsZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKGUpe2lmKHRoaXMuaGFuZGxlSWNvblNob3coKSx0aGlzLmJyb2FkY2FzdCgiRWxTZWxlY3REcm9wZG93biIsInVwZGF0ZVBvcHBlciIpLHRoaXMuZmlsdGVyYWJsZSYmKHRoaXMucXVlcnk9dGhpcy5zZWxlY3RlZExhYmVsLHRoaXMubXVsdGlwbGU/dGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpOih0aGlzLnJlbW90ZXx8KHRoaXMuaXNGb3JjZWRWaXNpYmxlPSEwLHRoaXMuYnJvYWRjYXN0KCJFbE9wdGlvbiIsInF1ZXJ5Q2hhbmdlIiwiIikpLHRoaXMuYnJvYWRjYXN0KCJFbElucHV0IiwiaW5wdXRTZWxlY3QiKSkpLCF0aGlzLmRyb3Bkb3duVWwpe3ZhciBuPXRoaXMuJHJlZnMucG9wcGVyLiRlbC5jaGlsZE5vZGVzO3RoaXMuZHJvcGRvd25VbD1bXS5maWx0ZXIuY2FsbChuLGZ1bmN0aW9uKGUpe3JldHVybiJVTCI9PT1lLnRhZ05hbWV9KVswXX0hdGhpcy5tdWx0aXBsZSYmdGhpcy5kcm9wZG93blVsJiZ0aGlzLnNldE92ZXJmbG93KCl9ZWxzZSB0aGlzLiRyZWZzLnJlZmVyZW5jZS4kZWwucXVlcnlTZWxlY3RvcigiaW5wdXQiKS5ibHVyKCksdGhpcy5oYW5kbGVJY29uSGlkZSgpLHRoaXMuYnJvYWRjYXN0KCJFbFNlbGVjdERyb3Bkb3duIiwiZGVzdHJveVBvcHBlciIpLHRoaXMuJHJlZnMuaW5wdXQmJnRoaXMuJHJlZnMuaW5wdXQuYmx1cigpLHRoaXMucXVlcnk9IiIsdGhpcy5zZWxlY3RlZExhYmVsPSIiLHRoaXMucmVzZXRIb3ZlckluZGV4KCksdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24oKXt0LiRyZWZzLmlucHV0JiYiIj09PXQuJHJlZnMuaW5wdXQudmFsdWUmJjA9PT10LnNlbGVjdGVkLmxlbmd0aCYmKHQuY3VycmVudFBsYWNlaG9sZGVyPXQuY2FjaGVkUGxhY2VIb2xkZXIpfSksdGhpcy5tdWx0aXBsZXx8KHRoaXMuZ2V0T3ZlcmZsb3dzKCksdGhpcy5zZWxlY3RlZCYmKHRoaXMuc2VsZWN0ZWRMYWJlbD10aGlzLnNlbGVjdGVkLmN1cnJlbnRMYWJlbCkpfSxvcHRpb25zOmZ1bmN0aW9uKGUpe3RoaXMub3B0aW9uc0FsbERpc2FibGVkPWUubGVuZ3RoPT09ZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGlzYWJsZWQ9PT0hMH0pLmxlbmd0aCx0aGlzLm11bHRpcGxlJiZ0aGlzLnJlc2V0SW5wdXRIZWlnaHQoKTt2YXIgdD10aGlzLiRlbC5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dCIpO1tdLmluZGV4T2YuY2FsbCh0LGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpPT09LTEmJnRoaXMuc2V0U2VsZWN0ZWQoKX19LG1ldGhvZHM6e2hhbmRsZUljb25IaWRlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kZWwucXVlcnlTZWxlY3RvcigiLmVsLWlucHV0X19pY29uIik7ZSYmKDAsXy5yZW1vdmVDbGFzcykoZSwiaXMtcmV2ZXJzZSIpfSxoYW5kbGVJY29uU2hvdzpmdW5jdGlvbigpe3ZhciBlPXRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoIi5lbC1pbnB1dF9faWNvbiIpO2UmJiEoMCxfLmhhc0NsYXNzKShlLCJlbC1pY29uLWNpcmNsZS1jbG9zZSIpJiYoMCxfLmFkZENsYXNzKShlLCJpcy1yZXZlcnNlIil9LGdldE92ZXJmbG93czpmdW5jdGlvbigpe2lmKHRoaXMuZHJvcGRvd25VbCYmdGhpcy5zZWxlY3RlZCYmdGhpcy5zZWxlY3RlZC4kZWwpe3ZhciBlPXRoaXMuc2VsZWN0ZWQuJGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHQ9dGhpcy4kcmVmcy5wb3BwZXIuJGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3RoaXMuYm90dG9tT3ZlcmZsb3dCZWZvcmVIaWRkZW49ZS5ib3R0b20tdC5ib3R0b20sdGhpcy50b3BPdmVyZmxvd0JlZm9yZUhpZGRlbj1lLnRvcC10LnRvcH19LHNldE92ZXJmbG93OmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLmJvdHRvbU92ZXJmbG93QmVmb3JlSGlkZGVuPjA/dGhpcy4kbmV4dFRpY2soZnVuY3Rpb24oKXtlLmRyb3Bkb3duVWwuc2Nyb2xsVG9wKz1lLmJvdHRvbU92ZXJmbG93QmVmb3JlSGlkZGVufSk6dGhpcy50b3BPdmVyZmxvd0JlZm9yZUhpZGRlbjwwJiZ0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe2UuZHJvcGRvd25VbC5zY3JvbGxUb3ArPWUudG9wT3ZlcmZsb3dCZWZvcmVIaWRkZW59KX0sZ2V0T3B0aW9uOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY2FjaGVkT3B0aW9ucy5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQudmFsdWU9PT1lfSlbMF07aWYodClyZXR1cm4gdDt2YXIgbj0ic3RyaW5nIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZT9lOiIiLGk9e3ZhbHVlOmUsY3VycmVudExhYmVsOm59O3JldHVybiB0aGlzLm11bHRpcGxlJiYoaS5oaXRTdGF0ZT0hMSksaX0sc2V0U2VsZWN0ZWQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKCF0aGlzLm11bHRpcGxlKXt2YXIgdD10aGlzLmdldE9wdGlvbih0aGlzLnZhbHVlKTtyZXR1cm4gdGhpcy5zZWxlY3RlZExhYmVsPXQuY3VycmVudExhYmVsLHZvaWQodGhpcy5zZWxlY3RlZD10KX12YXIgbj1bXTtBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpJiZ0aGlzLnZhbHVlLmZvckVhY2goZnVuY3Rpb24odCl7bi5wdXNoKGUuZ2V0T3B0aW9uKHQpKX0pLHRoaXMuc2VsZWN0ZWQ9bn0saGFuZGxlSWNvbkNsaWNrOmZ1bmN0aW9uKGUpe3RoaXMuaWNvbkNsYXNzLmluZGV4T2YoImNpcmNsZS1jbG9zZSIpPi0xP3RoaXMuZGVsZXRlU2VsZWN0ZWQoZSk6dGhpcy50b2dnbGVNZW51KCl9LGhhbmRsZU1vdXNlRG93bjpmdW5jdGlvbihlKXsiSU5QVVQiPT09ZS50YXJnZXQudGFnTmFtZSYmdGhpcy52aXNpYmxlJiYodGhpcy5oYW5kbGVDbG9zZSgpLGUucHJldmVudERlZmF1bHQoKSl9LGRvRGVzdHJveTpmdW5jdGlvbigpe3RoaXMuJHJlZnMucG9wcGVyLmRvRGVzdHJveSgpfSxoYW5kbGVDbG9zZTpmdW5jdGlvbigpe3RoaXMudmlzaWJsZT0hMX0sdG9nZ2xlTGFzdE9wdGlvbkhpdFN0YXRlOmZ1bmN0aW9uKGUpe2lmKEFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3RlZCkpe3ZhciB0PXRoaXMuc2VsZWN0ZWRbdGhpcy5zZWxlY3RlZC5sZW5ndGgtMV07aWYodClyZXR1cm4gZT09PSEwfHxlPT09ITE/KHQuaGl0U3RhdGU9ZSxlKToodC5oaXRTdGF0ZT0hdC5oaXRTdGF0ZSx0LmhpdFN0YXRlKX19LGRlbGV0ZVByZXZUYWc6ZnVuY3Rpb24oZSl7ZS50YXJnZXQudmFsdWUubGVuZ3RoPD0wJiYhdGhpcy50b2dnbGVMYXN0T3B0aW9uSGl0U3RhdGUoKSYmdGhpcy52YWx1ZS5wb3AoKX0sbWFuYWdlUGxhY2Vob2xkZXI6ZnVuY3Rpb24oKXsiIiE9PXRoaXMuY3VycmVudFBsYWNlaG9sZGVyJiYodGhpcy5jdXJyZW50UGxhY2Vob2xkZXI9dGhpcy4kcmVmcy5pbnB1dC52YWx1ZT8iIjp0aGlzLmNhY2hlZFBsYWNlSG9sZGVyKX0scmVzZXRJbnB1dFN0YXRlOmZ1bmN0aW9uKGUpezghPT1lLmtleUNvZGUmJnRoaXMudG9nZ2xlTGFzdE9wdGlvbkhpdFN0YXRlKCExKSx0aGlzLmlucHV0TGVuZ3RoPTE1KnRoaXMuJHJlZnMuaW5wdXQudmFsdWUubGVuZ3RoKzIwLHRoaXMucmVzZXRJbnB1dEhlaWdodCgpfSxyZXNldElucHV0SGVpZ2h0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe3ZhciB0PWUuJHJlZnMucmVmZXJlbmNlLiRlbC5jaGlsZE5vZGVzLG49W10uZmlsdGVyLmNhbGwodCxmdW5jdGlvbihlKXtyZXR1cm4iSU5QVVQiPT09ZS50YWdOYW1lfSlbMF07bi5zdHlsZS5oZWlnaHQ9TWF0aC5tYXgoZS4kcmVmcy50YWdzLmNsaWVudEhlaWdodCs2LHhbZS5zaXplXXx8MzYpKyJweCIsZS5icm9hZGNhc3QoIkVsU2VsZWN0RHJvcGRvd24iLCJ1cGRhdGVQb3BwZXIiKX0pfSxyZXNldEhvdmVySW5kZXg6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm11bHRpcGxlP2Uuc2VsZWN0ZWQubGVuZ3RoPjA/ZS5ob3ZlckluZGV4PU1hdGgubWluLmFwcGx5KG51bGwsZS5zZWxlY3RlZC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIGUub3B0aW9ucy5pbmRleE9mKHQpfSkpOmUuaG92ZXJJbmRleD0tMTplLmhvdmVySW5kZXg9ZS5vcHRpb25zLmluZGV4T2YoZS5zZWxlY3RlZCl9LDMwMCl9LGhhbmRsZU9wdGlvblNlbGVjdDpmdW5jdGlvbihlKXtpZih0aGlzLm11bHRpcGxlKXt2YXIgdD0tMTt0aGlzLnZhbHVlLmZvckVhY2goZnVuY3Rpb24obixpKXtuPT09ZS52YWx1ZSYmKHQ9aSl9KSx0Pi0xP3RoaXMudmFsdWUuc3BsaWNlKHQsMSk6KHRoaXMubXVsdGlwbGVMaW1pdDw9MHx8dGhpcy52YWx1ZS5sZW5ndGg8dGhpcy5tdWx0aXBsZUxpbWl0KSYmdGhpcy52YWx1ZS5wdXNoKGUudmFsdWUpLGUuY3JlYXRlZCYmKHRoaXMucXVlcnk9IiIsdGhpcy5pbnB1dExlbmd0aD0yMCx0aGlzLiRyZWZzLmlucHV0LmZvY3VzKCkpfWVsc2UgdGhpcy4kZW1pdCgiaW5wdXQiLGUudmFsdWUpLHRoaXMudmlzaWJsZT0hMX0sdG9nZ2xlTWVudTpmdW5jdGlvbigpe3RoaXMuZmlsdGVyYWJsZSYmIiI9PT10aGlzLnF1ZXJ5JiZ0aGlzLnZpc2libGV8fHRoaXMuZGlzYWJsZWR8fCh0aGlzLnZpc2libGU9IXRoaXMudmlzaWJsZSl9LG5hdmlnYXRlT3B0aW9uczpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy52aXNpYmxlP3ZvaWQoMCE9PXRoaXMub3B0aW9ucy5sZW5ndGgmJjAhPT10aGlzLmZpbHRlcmVkT3B0aW9uc0NvdW50JiYodGhpcy5vcHRpb25zQWxsRGlzYWJsZWR8fCgibmV4dCI9PT1lJiYodGhpcy5ob3ZlckluZGV4KyssdGhpcy5ob3ZlckluZGV4PT09dGhpcy5vcHRpb25zLmxlbmd0aCYmKHRoaXMuaG92ZXJJbmRleD0wKSx0aGlzLnJlc2V0U2Nyb2xsVG9wKCksdGhpcy5vcHRpb25zW3RoaXMuaG92ZXJJbmRleF0uZGlzYWJsZWQhPT0hMCYmdGhpcy5vcHRpb25zW3RoaXMuaG92ZXJJbmRleF0uZ3JvdXBEaXNhYmxlZCE9PSEwJiZ0aGlzLm9wdGlvbnNbdGhpcy5ob3ZlckluZGV4XS52aXNpYmxlfHx0aGlzLm5hdmlnYXRlT3B0aW9ucygibmV4dCIpKSwicHJldiI9PT1lJiYodGhpcy5ob3ZlckluZGV4LS0sdGhpcy5ob3ZlckluZGV4PDAmJih0aGlzLmhvdmVySW5kZXg9dGhpcy5vcHRpb25zLmxlbmd0aC0xKSx0aGlzLnJlc2V0U2Nyb2xsVG9wKCksdGhpcy5vcHRpb25zW3RoaXMuaG92ZXJJbmRleF0uZGlzYWJsZWQhPT0hMCYmdGhpcy5vcHRpb25zW3RoaXMuaG92ZXJJbmRleF0uZ3JvdXBEaXNhYmxlZCE9PSEwJiZ0aGlzLm9wdGlvbnNbdGhpcy5ob3ZlckluZGV4XS52aXNpYmxlfHx0aGlzLm5hdmlnYXRlT3B0aW9ucygicHJldiIpKSkpKTp2b2lkKHRoaXMudmlzaWJsZT0hMCl9LHJlc2V0U2Nyb2xsVG9wOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zW3RoaXMuaG92ZXJJbmRleF0uJGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbS10aGlzLiRyZWZzLnBvcHBlci4kZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tLHQ9dGhpcy5vcHRpb25zW3RoaXMuaG92ZXJJbmRleF0uJGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcC10aGlzLiRyZWZzLnBvcHBlci4kZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO2U+MCYmKHRoaXMuZHJvcGRvd25VbC5zY3JvbGxUb3ArPWUpLHQ8MCYmKHRoaXMuZHJvcGRvd25VbC5zY3JvbGxUb3ArPXQpfSxzZWxlY3RPcHRpb246ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnNbdGhpcy5ob3ZlckluZGV4XSYmdGhpcy5oYW5kbGVPcHRpb25TZWxlY3QodGhpcy5vcHRpb25zW3RoaXMuaG92ZXJJbmRleF0pfSxkZWxldGVTZWxlY3RlZDpmdW5jdGlvbihlKXtlLnN0b3BQcm9wYWdhdGlvbigpLHRoaXMuJGVtaXQoImlucHV0IiwiIiksdGhpcy52aXNpYmxlPSExfSxkZWxldGVUYWc6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnNlbGVjdGVkLmluZGV4T2YodCk7bj4tMSYmdGhpcy52YWx1ZS5zcGxpY2UobiwxKSxlLnN0b3BQcm9wYWdhdGlvbigpfSxvbklucHV0Q2hhbmdlOmZ1bmN0aW9uKCl7dGhpcy5maWx0ZXJhYmxlJiYodGhpcy5xdWVyeT10aGlzLnNlbGVjdGVkTGFiZWwpfSxvbk9wdGlvbkRlc3Ryb3k6ZnVuY3Rpb24oZSl7dGhpcy5vcHRpb25zQ291bnQtLSx0aGlzLmZpbHRlcmVkT3B0aW9uc0NvdW50LS07dmFyIHQ9dGhpcy5vcHRpb25zLmluZGV4T2YoZSk7dD4tMSYmdGhpcy5vcHRpb25zLnNwbGljZSh0LDEpLHRoaXMuYnJvYWRjYXN0KCJFbE9wdGlvbiIsInJlc2V0SW5kZXgiKX0scmVzZXRJbnB1dFdpZHRoOmZ1bmN0aW9uKCl7dGhpcy5pbnB1dFdpZHRoPXRoaXMuJHJlZnMucmVmZXJlbmNlLiRlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aH19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuY2FjaGVkUGxhY2VIb2xkZXI9dGhpcy5jdXJyZW50UGxhY2Vob2xkZXI9dGhpcy5wbGFjZWhvbGRlcix0aGlzLm11bHRpcGxlJiYhQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSYmdGhpcy4kZW1pdCgiaW5wdXQiLFtdKSwhdGhpcy5tdWx0aXBsZSYmQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSYmdGhpcy4kZW1pdCgiaW5wdXQiLCIiKSx0aGlzLnNldFNlbGVjdGVkKCksdGhpcy5kZWJvdW5jZWRPbklucHV0Q2hhbmdlPSgwLHZbImRlZmF1bHQiXSkodGhpcy5kZWJvdW5jZSxmdW5jdGlvbigpe2Uub25JbnB1dENoYW5nZSgpfSksdGhpcy4kb24oImhhbmRsZU9wdGlvbkNsaWNrIix0aGlzLmhhbmRsZU9wdGlvblNlbGVjdCksdGhpcy4kb24oIm9uT3B0aW9uRGVzdHJveSIsdGhpcy5vbk9wdGlvbkRlc3Ryb3kpfSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLm11bHRpcGxlJiZBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpJiZ0aGlzLnZhbHVlLmxlbmd0aD4wJiYodGhpcy5jdXJyZW50UGxhY2Vob2xkZXI9IiIpLCgwLEMuYWRkUmVzaXplTGlzdGVuZXIpKHRoaXMuJGVsLHRoaXMucmVzZXRJbnB1dFdpZHRoKSx0aGlzLnJlbW90ZSYmdGhpcy5tdWx0aXBsZSYmdGhpcy5yZXNldElucHV0SGVpZ2h0KCksdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24oKXtlLiRyZWZzLnJlZmVyZW5jZS4kZWwmJihlLmlucHV0V2lkdGg9ZS4kcmVmcy5yZWZlcmVuY2UuJGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKX0pfSxkZXN0cm95ZWQ6ZnVuY3Rpb24oKXt0aGlzLnJlc2V0SW5wdXRXaWR0aCYmKDAsQy5yZW1vdmVSZXNpemVMaXN0ZW5lcikodGhpcy4kZWwsdGhpcy5yZXNldElucHV0V2lkdGgpfX19LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSx0LGkpe3RoaXMuJGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24ocyl7dmFyIG89cy4kb3B0aW9ucy5jb21wb25lbnROYW1lO289PT1lP3MuJGVtaXQuYXBwbHkocyxbdF0uY29uY2F0KGkpKTpuLmFwcGx5KHMsW2UsdF0uY29uY2F0KFtpXSkpfSl9dC5fX2VzTW9kdWxlPSEwLHRbImRlZmF1bHQiXT17bWV0aG9kczp7ZGlzcGF0Y2g6ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgaT10aGlzLiRwYXJlbnR8fHRoaXMuJHJvb3Qscz1pLiRvcHRpb25zLmNvbXBvbmVudE5hbWU7aSYmKCFzfHxzIT09ZSk7KWk9aS4kcGFyZW50LGkmJihzPWkuJG9wdGlvbnMuY29tcG9uZW50TmFtZSk7aSYmaS4kZW1pdC5hcHBseShpLFt0XS5jb25jYXQobikpfSxicm9hZGNhc3Q6ZnVuY3Rpb24oZSx0LGkpe24uY2FsbCh0aGlzLGUsdCxpKX19fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt0Ll9fZXNNb2R1bGU9ITA7dmFyIGk9bigxMik7dFsiZGVmYXVsdCJdPXttZXRob2RzOnt0OmZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1BcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gaS50LmFwcGx5KHRoaXMsdCl9fX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX10Ll9fZXNNb2R1bGU9ITAsdC51c2U9dC50PXZvaWQgMDt2YXIgcz1uKDEzKSxvPWkocyksYT1uKDE0KSxyPWkoYSksbD1uKDE1KSx1PWkobCksZD1uKDE2KSxjPWkoZCksZj0oMCxjWyJkZWZhdWx0Il0pKHJbImRlZmF1bHQiXSksaD1vWyJkZWZhdWx0Il0scD0hMSxtPXQudD1mdW5jdGlvbihlLHQpe3ZhciBuPU9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzfHxyWyJkZWZhdWx0Il0pLiR0O2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuKXJldHVybiBwfHwocD0hMCxyWyJkZWZhdWx0Il0ubG9jYWxlKHJbImRlZmF1bHQiXS5jb25maWcubGFuZywoMCx1WyJkZWZhdWx0Il0pKGgsclsiZGVmYXVsdCJdLmxvY2FsZShyWyJkZWZhdWx0Il0uY29uZmlnLmxhbmcpfHx7fSx7Y2xvbmU6ITB9KSkpLG4uYXBwbHkodGhpcyxbZSx0XSk7Zm9yKHZhciBpPWUuc3BsaXQoIi4iKSxzPWgsbz0wLGE9aS5sZW5ndGg7bzxhO28rKyl7dmFyIGw9aVtvXSxkPXNbbF07aWYobz09PWEtMSlyZXR1cm4gZihkLHQpO2lmKCFkKXJldHVybiIiO3M9ZH1yZXR1cm4iIn0sZz10LnVzZT1mdW5jdGlvbihlKXtoPWV8fGh9O3RbImRlZmF1bHQiXT17dXNlOmcsdDptfX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7dC5fX2VzTW9kdWxlPSEwLHRbImRlZmF1bHQiXT17ZWw6e2RhdGVwaWNrZXI6e25vdzoi5q2k5Yi7Iix0b2RheToi5LuK5aSpIixjYW5jZWw6IuWPlua2iCIsY2xlYXI6Iua4heepuiIsY29uZmlybToi56Gu5a6aIixzZWxlY3REYXRlOiLpgInmi6nml6XmnJ8iLHNlbGVjdFRpbWU6IumAieaLqeaXtumXtCIsc3RhcnREYXRlOiLlvIDlp4vml6XmnJ8iLHN0YXJ0VGltZToi5byA5aeL5pe26Ze0IixlbmREYXRlOiLnu5PmnZ/ml6XmnJ8iLGVuZFRpbWU6Iue7k+adn+aXtumXtCIseWVhcjoi5bm0Iixtb250aDE6IjEg5pyIIixtb250aDI6IjIg5pyIIixtb250aDM6IjMg5pyIIixtb250aDQ6IjQg5pyIIixtb250aDU6IjUg5pyIIixtb250aDY6IjYg5pyIIixtb250aDc6Ijcg5pyIIixtb250aDg6Ijgg5pyIIixtb250aDk6Ijkg5pyIIixtb250aDEwOiIxMCDmnIgiLG1vbnRoMTE6IjExIOaciCIsbW9udGgxMjoiMTIg5pyIIix3ZWVrczp7c3VuOiLml6UiLG1vbjoi5LiAIix0dWU6IuS6jCIsd2VkOiLkuIkiLHRodToi5ZubIixmcmk6IuS6lCIsc2F0OiLlha0ifSxtb250aHM6e2phbjoi5LiA5pyIIixmZWI6IuS6jOaciCIsbWFyOiLkuInmnIgiLGFwcjoi5Zub5pyIIixtYXk6IuS6lOaciCIsanVuOiLlha3mnIgiLGp1bDoi5LiD5pyIIixhdWc6IuWFq+aciCIsc2VwOiLkuZ3mnIgiLG9jdDoi5Y2B5pyIIixub3Y6IuWNgeS4gOaciCIsZGVjOiLljYHkuozmnIgifX0sc2VsZWN0Ontsb2FkaW5nOiLliqDovb3kuK0iLG5vTWF0Y2g6IuaXoOWMuemFjeaVsOaNriIsbm9EYXRhOiLml6DmlbDmja4iLHBsYWNlaG9sZGVyOiLor7fpgInmi6kifSxwYWdpbmF0aW9uOnsiZ290byI6IuWJjeW+gCIscGFnZXNpemU6IuadoS/pobUiLHRvdGFsOiLlhbEge3RvdGFsfSDmnaEiLHBhZ2VDbGFzc2lmaWVyOiLpobUifSxtZXNzYWdlYm94Ont0aXRsZToi5o+Q56S6Iixjb25maXJtOiLnoa7lrpoiLGNhbmNlbDoi5Y+W5raIIixlcnJvcjoi6L6T5YWl55qE5pWw5o2u5LiN5ZCI5rOVISJ9LHVwbG9hZDp7ImRlbGV0ZSI6IuWIoOmZpCIscHJldmlldzoi5p+l55yL5Zu+54mHIiwiY29udGludWUiOiLnu6fnu63kuIrkvKAifSx0YWJsZTp7ZW1wdHlUZXh0OiLmmoLml6DmlbDmja4iLGNvbmZpcm1GaWx0ZXI6Iuetm+mAiSIscmVzZXRGaWx0ZXI6IumHjee9riIsY2xlYXJGaWx0ZXI6IuWFqOmDqCJ9LHRyZWU6e2VtcHR5VGV4dDoi5pqC5peg5pWw5o2uIn19fX0sZnVuY3Rpb24odCxuKXt0LmV4cG9ydHM9ZX0sZnVuY3Rpb24oZSx0LG4pe3ZhciBpLHM7IWZ1bmN0aW9uKG8sYSl7aT1hLHM9ImZ1bmN0aW9uIj09dHlwZW9mIGk/aS5jYWxsKHQsbix0LGUpOmksISh2b2lkIDAhPT1zJiYoZS5leHBvcnRzPXMpKX0odGhpcyxmdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dmFyIHQ9ZSYmIm9iamVjdCI9PXR5cGVvZiBlO3JldHVybiB0JiYiW29iamVjdCBSZWdFeHBdIiE9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSYmIltvYmplY3QgRGF0ZV0iIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfWZ1bmN0aW9uIHQoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/W106e319ZnVuY3Rpb24gbihuLGkpe3ZhciBzPWkmJmkuY2xvbmU9PT0hMDtyZXR1cm4gcyYmZShuKT9vKHQobiksbixpKTpufWZ1bmN0aW9uIGkodCxpLHMpe3ZhciBhPXQuc2xpY2UoKTtyZXR1cm4gaS5mb3JFYWNoKGZ1bmN0aW9uKGkscil7InVuZGVmaW5lZCI9PXR5cGVvZiBhW3JdP2Fbcl09bihpLHMpOmUoaSk/YVtyXT1vKHRbcl0saSxzKTp0LmluZGV4T2YoaSk9PT0tMSYmYS5wdXNoKG4oaSxzKSl9KSxhfWZ1bmN0aW9uIHModCxpLHMpe3ZhciBhPXt9O3JldHVybiBlKHQpJiZPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2FbZV09bih0W2VdLHMpfSksT2JqZWN0LmtleXMoaSkuZm9yRWFjaChmdW5jdGlvbihyKXtlKGlbcl0pJiZ0W3JdP2Fbcl09byh0W3JdLGlbcl0scyk6YVtyXT1uKGlbcl0scyl9KSxhfWZ1bmN0aW9uIG8oZSx0LG8pe3ZhciBhPUFycmF5LmlzQXJyYXkodCkscj1vfHx7YXJyYXlNZXJnZTppfSxsPXIuYXJyYXlNZXJnZXx8aTtyZXR1cm4gYT9BcnJheS5pc0FycmF5KGUpP2woZSx0LG8pOm4odCxvKTpzKGUsdCxvKX1yZXR1cm4gb30pfSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0Ijt0Ll9fZXNNb2R1bGU9ITA7dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9O3RbImRlZmF1bHQiXT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG89QXJyYXkodD4xP3QtMTowKSxhPTE7YTx0O2ErKylvW2EtMV09YXJndW1lbnRzW2FdO3JldHVybiAxPT09by5sZW5ndGgmJiJvYmplY3QiPT09bihvWzBdKSYmKG89b1swXSksbyYmby5oYXNPd25Qcm9wZXJ0eXx8KG89e30pLGUucmVwbGFjZShpLGZ1bmN0aW9uKHQsbixpLGEpe3ZhciByPXZvaWQgMDtyZXR1cm4ieyI9PT1lW2EtMV0mJiJ9Ij09PWVbYSt0Lmxlbmd0aF0/aToocj1zKG8saSk/b1tpXTpudWxsLG51bGw9PT1yfHx2b2lkIDA9PT1yPyIiOnIpfSl9dmFyIHM9ZS51dGlsLmhhc093bjtyZXR1cm4gdH07dmFyIGk9LyglfClceyhbMC05YS16QS1aX10rKVx9L2d9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX10Ll9fZXNNb2R1bGU9ITA7dmFyIHM9bigxOCksbz1pKHMpO29bImRlZmF1bHQiXS5pbnN0YWxsPWZ1bmN0aW9uKGUpe2UuY29tcG9uZW50KG9bImRlZmF1bHQiXS5uYW1lLG9bImRlZmF1bHQiXSl9LHRbImRlZmF1bHQiXT1vWyJkZWZhdWx0Il19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgaSxzO2k9bigxOSk7dmFyIG89bigyMSk7cz1pPWl8fHt9LCJvYmplY3QiIT10eXBlb2YgaVsiZGVmYXVsdCJdJiYiZnVuY3Rpb24iIT10eXBlb2YgaVsiZGVmYXVsdCJdfHwocz1pPWlbImRlZmF1bHQiXSksImZ1bmN0aW9uIj09dHlwZW9mIHMmJihzPXMub3B0aW9ucykscy5yZW5kZXI9by5yZW5kZXIscy5zdGF0aWNSZW5kZXJGbnM9by5zdGF0aWNSZW5kZXJGbnMsZS5leHBvcnRzPWl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX10Ll9fZXNNb2R1bGU9ITA7dmFyIHM9bigxMCksbz1pKHMpLGE9bigyMCkscj1pKGEpO3RbImRlZmF1bHQiXT17bmFtZToiRWxJbnB1dCIsY29tcG9uZW50TmFtZToiRWxJbnB1dCIsbWl4aW5zOltvWyJkZWZhdWx0Il1dLHByb3BzOnt2YWx1ZTpbU3RyaW5nLE51bWJlcl0scGxhY2Vob2xkZXI6U3RyaW5nLHNpemU6U3RyaW5nLHJlYWRvbmx5OkJvb2xlYW4sYXV0b2ZvY3VzOkJvb2xlYW4saWNvbjpTdHJpbmcsZGlzYWJsZWQ6Qm9vbGVhbix0eXBlOnt0eXBlOlN0cmluZywiZGVmYXVsdCI6InRleHQifSxuYW1lOlN0cmluZyxhdXRvc2l6ZTp7dHlwZTpbQm9vbGVhbixPYmplY3RdLCJkZWZhdWx0IjohMX0scm93czp7dHlwZTpOdW1iZXIsImRlZmF1bHQiOjJ9LGF1dG9Db21wbGV0ZTp7dHlwZTpTdHJpbmcsImRlZmF1bHQiOiJvZmYifSxmb3JtOlN0cmluZyxtYXhsZW5ndGg6TnVtYmVyLG1pbmxlbmd0aDpOdW1iZXIsbWF4Ont9LG1pbjp7fX0sbWV0aG9kczp7aGFuZGxlQmx1cjpmdW5jdGlvbihlKXt0aGlzLiRlbWl0KCJibHVyIixlKSx0aGlzLmRpc3BhdGNoKCJFbEZvcm1JdGVtIiwiZWwuZm9ybS5ibHVyIixbdGhpcy5jdXJyZW50VmFsdWVdKX0saW5wdXRTZWxlY3Q6ZnVuY3Rpb24oKXt0aGlzLiRyZWZzLmlucHV0LnNlbGVjdCgpfSxyZXNpemVUZXh0YXJlYTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuYXV0b3NpemUsdD10aGlzLnR5cGU7aWYoZSYmInRleHRhcmVhIj09PXQpe3ZhciBuPWUubWluUm93cyxpPWUubWF4Um93czt0aGlzLnRleHRhcmVhU3R5bGU9KDAsclsiZGVmYXVsdCJdKSh0aGlzLiRyZWZzLnRleHRhcmVhLG4saSl9fSxoYW5kbGVGb2N1czpmdW5jdGlvbihlKXt0aGlzLiRlbWl0KCJmb2N1cyIsZSl9LGhhbmRsZUlucHV0OmZ1bmN0aW9uKGUpe3RoaXMuY3VycmVudFZhbHVlPWUudGFyZ2V0LnZhbHVlfSxoYW5kbGVJY29uQ2xpY2s6ZnVuY3Rpb24oZSl7dGhpcy4kZW1pdCgiY2xpY2siLGUpfX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntjdXJyZW50VmFsdWU6dGhpcy52YWx1ZSx0ZXh0YXJlYVN0eWxlOnt9fX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuJG9uKCJpbnB1dFNlbGVjdCIsdGhpcy5pbnB1dFNlbGVjdCl9LG1vdW50ZWQ6ZnVuY3Rpb24oKXt0aGlzLnJlc2l6ZVRleHRhcmVhKCl9LGNvbXB1dGVkOnt2YWxpZGF0aW5nOmZ1bmN0aW9uKCl7cmV0dXJuInZhbGlkYXRpbmciPT09dGhpcy4kcGFyZW50LnZhbGlkYXRlU3RhdGV9fSx3YXRjaDp7dmFsdWU6ZnVuY3Rpb24oZSx0KXt0aGlzLmN1cnJlbnRWYWx1ZT1lfSxjdXJyZW50VmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aGlzLiRuZXh0VGljayhmdW5jdGlvbihlKXt0LnJlc2l6ZVRleHRhcmVhKCl9KSx0aGlzLiRlbWl0KCJpbnB1dCIsZSksdGhpcy4kZW1pdCgiY2hhbmdlIixlKSx0aGlzLmRpc3BhdGNoKCJFbEZvcm1JdGVtIiwiZWwuZm9ybS5jaGFuZ2UiLFtlXSl9fX19LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSl7dmFyIHQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSksbj10LmdldFByb3BlcnR5VmFsdWUoImJveC1zaXppbmciKSxpPXBhcnNlRmxvYXQodC5nZXRQcm9wZXJ0eVZhbHVlKCJwYWRkaW5nLWJvdHRvbSIpKStwYXJzZUZsb2F0KHQuZ2V0UHJvcGVydHlWYWx1ZSgicGFkZGluZy10b3AiKSkscz1wYXJzZUZsb2F0KHQuZ2V0UHJvcGVydHlWYWx1ZSgiYm9yZGVyLWJvdHRvbS13aWR0aCIpKStwYXJzZUZsb2F0KHQuZ2V0UHJvcGVydHlWYWx1ZSgiYm9yZGVyLXRvcC13aWR0aCIpKSxvPWEubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlKyI6Iit0LmdldFByb3BlcnR5VmFsdWUoZSl9KS5qb2luKCI7Iik7cmV0dXJue2NvbnRleHRTdHlsZTpvLHBhZGRpbmdTaXplOmksYm9yZGVyU2l6ZTpzLGJveFNpemluZzpufX1mdW5jdGlvbiBpKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGw7c3x8KHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHMpKTt2YXIgYT1uKGUpLHI9YS5wYWRkaW5nU2l6ZSxsPWEuYm9yZGVyU2l6ZSx1PWEuYm94U2l6aW5nLGQ9YS5jb250ZXh0U3R5bGU7cy5zZXRBdHRyaWJ1dGUoInN0eWxlIixkKyI7IitvKSxzLnZhbHVlPWUudmFsdWV8fGUucGxhY2Vob2xkZXJ8fCIiO3ZhciBjPXMuc2Nyb2xsSGVpZ2h0OyJib3JkZXItYm94Ij09PXU/Yys9bDoiY29udGVudC1ib3giPT09dSYmKGMtPXIpLHMudmFsdWU9IiI7dmFyIGY9cy5zY3JvbGxIZWlnaHQtcjtpZihudWxsIT09dCl7dmFyIGg9Zip0OyJib3JkZXItYm94Ij09PXUmJihoPWgrcitsKSxjPU1hdGgubWF4KGgsYyl9aWYobnVsbCE9PWkpe3ZhciBwPWYqaTsiYm9yZGVyLWJveCI9PT11JiYocD1wK3IrbCksYz1NYXRoLm1pbihwLGMpfXJldHVybntoZWlnaHQ6YysicHgifX10Ll9fZXNNb2R1bGU9ITAsdFsiZGVmYXVsdCJdPWk7dmFyIHM9dm9pZCAwLG89IlxuICBoZWlnaHQ6MCAhaW1wb3J0YW50O1xuICB2aXNpYmlsaXR5OmhpZGRlbiAhaW1wb3J0YW50O1xuICBvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudDtcbiAgcG9zaXRpb246YWJzb2x1dGUgIWltcG9ydGFudDtcbiAgei1pbmRleDotMTAwMCAhaW1wb3J0YW50O1xuICB0b3A6MCAhaW1wb3J0YW50O1xuICByaWdodDowICFpbXBvcnRhbnRcbiIsYT1bImxldHRlci1zcGFjaW5nIiwibGluZS1oZWlnaHQiLCJwYWRkaW5nLXRvcCIsInBhZGRpbmctYm90dG9tIiwiZm9udC1mYW1pbHkiLCJmb250LXdlaWdodCIsImZvbnQtc2l6ZSIsInRleHQtcmVuZGVyaW5nIiwidGV4dC10cmFuc2Zvcm0iLCJ3aWR0aCIsInRleHQtaW5kZW50IiwicGFkZGluZy1sZWZ0IiwicGFkZGluZy1yaWdodCIsImJvcmRlci13aWR0aCIsImJveC1zaXppbmciXX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1lLiRjcmVhdGVFbGVtZW50O2UuX2M7cmV0dXJuIHQoImRpdiIseyJjbGFzcyI6WyJ0ZXh0YXJlYSI9PT1lLnR5cGU/ImVsLXRleHRhcmVhIjoiZWwtaW5wdXQiLGUuc2l6ZT8iZWwtaW5wdXQtLSIrZS5zaXplOiIiLHsiaXMtZGlzYWJsZWQiOmUuZGlzYWJsZWQsImVsLWlucHV0LWdyb3VwIjplLiRzbG90cy5wcmVwZW5kfHxlLiRzbG90cy5hcHBlbmQsImVsLWlucHV0LWdyb3VwLS1hcHBlbmQiOmUuJHNsb3RzLmFwcGVuZCwiZWwtaW5wdXQtZ3JvdXAtLXByZXBlbmQiOmUuJHNsb3RzLnByZXBlbmR9XX0sWyJ0ZXh0YXJlYSIhPT1lLnR5cGU/W2UuJHNsb3RzLnByZXBlbmQ/dCgiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLWlucHV0LWdyb3VwX19wcmVwZW5kIn0sW2UuX3QoInByZXBlbmQiKV0pOmUuX2UoKSxlLl90KCJpY29uIixbZS5pY29uP3QoImkiLHtzdGF0aWNDbGFzczoiZWwtaW5wdXRfX2ljb24iLCJjbGFzcyI6ImVsLWljb24tIitlLmljb24sb246e2NsaWNrOmUuaGFuZGxlSWNvbkNsaWNrfX0pOmUuX2UoKV0pLCJ0ZXh0YXJlYSIhPT1lLnR5cGU/dCgiaW5wdXQiLHtyZWY6ImlucHV0IixzdGF0aWNDbGFzczoiZWwtaW5wdXRfX2lubmVyIixhdHRyczp7dHlwZTplLnR5cGUsbmFtZTplLm5hbWUscGxhY2Vob2xkZXI6ZS5wbGFjZWhvbGRlcixkaXNhYmxlZDplLmRpc2FibGVkLHJlYWRvbmx5OmUucmVhZG9ubHksbWF4bGVuZ3RoOmUubWF4bGVuZ3RoLG1pbmxlbmd0aDplLm1pbmxlbmd0aCxhdXRvY29tcGxldGU6ZS5hdXRvQ29tcGxldGUsYXV0b2ZvY3VzOmUuYXV0b2ZvY3VzLG1pbjplLm1pbixtYXg6ZS5tYXgsZm9ybTplLmZvcm19LGRvbVByb3BzOnt2YWx1ZTplLnZhbHVlfSxvbjp7aW5wdXQ6ZS5oYW5kbGVJbnB1dCxmb2N1czplLmhhbmRsZUZvY3VzLGJsdXI6ZS5oYW5kbGVCbHVyfX0pOmUuX2UoKSxlLnZhbGlkYXRpbmc/dCgiaSIse3N0YXRpY0NsYXNzOiJlbC1pbnB1dF9faWNvbiBlbC1pY29uLWxvYWRpbmcifSk6ZS5fZSgpLGUuJHNsb3RzLmFwcGVuZD90KCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtaW5wdXQtZ3JvdXBfX2FwcGVuZCJ9LFtlLl90KCJhcHBlbmQiKV0pOmUuX2UoKV06dCgidGV4dGFyZWEiLHtkaXJlY3RpdmVzOlt7bmFtZToibW9kZWwiLHJhd05hbWU6InYtbW9kZWwiLHZhbHVlOmUuY3VycmVudFZhbHVlLGV4cHJlc3Npb246ImN1cnJlbnRWYWx1ZSIKfV0scmVmOiJ0ZXh0YXJlYSIsc3RhdGljQ2xhc3M6ImVsLXRleHRhcmVhX19pbm5lciIsc3R5bGU6ZS50ZXh0YXJlYVN0eWxlLGF0dHJzOntuYW1lOmUubmFtZSxwbGFjZWhvbGRlcjplLnBsYWNlaG9sZGVyLGRpc2FibGVkOmUuZGlzYWJsZWQscmVhZG9ubHk6ZS5yZWFkb25seSxyb3dzOmUucm93cyxmb3JtOmUuZm9ybSxhdXRvZm9jdXM6ZS5hdXRvZm9jdXMsbWF4bGVuZ3RoOmUubWF4bGVuZ3RoLG1pbmxlbmd0aDplLm1pbmxlbmd0aH0sZG9tUHJvcHM6e3ZhbHVlOmUuX3MoZS5jdXJyZW50VmFsdWUpfSxvbjp7Zm9jdXM6ZS5oYW5kbGVGb2N1cyxibHVyOmUuaGFuZGxlQmx1cixpbnB1dDpmdW5jdGlvbih0KXt0LnRhcmdldC5jb21wb3Npbmd8fChlLmN1cnJlbnRWYWx1ZT10LnRhcmdldC52YWx1ZSl9fX0pXSl9LHN0YXRpY1JlbmRlckZuczpbXX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgaSxzO2k9bigyMyk7dmFyIG89bigyNyk7cz1pPWl8fHt9LCJvYmplY3QiIT10eXBlb2YgaVsiZGVmYXVsdCJdJiYiZnVuY3Rpb24iIT10eXBlb2YgaVsiZGVmYXVsdCJdfHwocz1pPWlbImRlZmF1bHQiXSksImZ1bmN0aW9uIj09dHlwZW9mIHMmJihzPXMub3B0aW9ucykscy5yZW5kZXI9by5yZW5kZXIscy5zdGF0aWNSZW5kZXJGbnM9by5zdGF0aWNSZW5kZXJGbnMsZS5leHBvcnRzPWl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX10Ll9fZXNNb2R1bGU9ITA7dmFyIHM9bigyNCksbz1pKHMpO3RbImRlZmF1bHQiXT17bmFtZToiZWwtc2VsZWN0LWRyb3Bkb3duIixjb21wb25lbnROYW1lOiJFbFNlbGVjdERyb3Bkb3duIixtaXhpbnM6W29bImRlZmF1bHQiXV0scHJvcHM6e3BsYWNlbWVudDp7ImRlZmF1bHQiOiJib3R0b20tc3RhcnQifSxib3VuZGFyaWVzUGFkZGluZzp7ImRlZmF1bHQiOjB9LG9wdGlvbnM6eyJkZWZhdWx0IjpmdW5jdGlvbigpe3JldHVybntmb3JjZUFic29sdXRlOiEwLGdwdUFjY2VsZXJhdGlvbjohMX19fX0sZGF0YTpmdW5jdGlvbigpe3JldHVybnttaW5XaWR0aDoiIn19LHdhdGNoOnsiJHBhcmVudC5pbnB1dFdpZHRoIjpmdW5jdGlvbigpe3RoaXMubWluV2lkdGg9dGhpcy4kcGFyZW50LiRlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCsicHgifX0sbW91bnRlZDpmdW5jdGlvbigpe3RoaXMucmVmZXJlbmNlRWxtPXRoaXMuJHBhcmVudC4kcmVmcy5yZWZlcmVuY2UuJGVsLHRoaXMuJHBhcmVudC5wb3BwZXJFbG09dGhpcy5wb3BwZXJFbG09dGhpcy4kZWwsdGhpcy4kb24oInVwZGF0ZVBvcHBlciIsdGhpcy51cGRhdGVQb3BwZXIpLHRoaXMuJG9uKCJkZXN0cm95UG9wcGVyIix0aGlzLmRlc3Ryb3lQb3BwZXIpfX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX10Ll9fZXNNb2R1bGU9ITA7dmFyIHM9bigyNSksbz1pKHMpLGE9bigyNik7dFsiZGVmYXVsdCJdPXtwcm9wczp7cGxhY2VtZW50Ont0eXBlOlN0cmluZywiZGVmYXVsdCI6ImJvdHRvbSJ9LGJvdW5kYXJpZXNQYWRkaW5nOnt0eXBlOk51bWJlciwiZGVmYXVsdCI6NX0scmVmZXJlbmNlOnt9LHBvcHBlcjp7fSxvZmZzZXQ6eyJkZWZhdWx0IjowfSx2YWx1ZTpCb29sZWFuLHZpc2libGVBcnJvdzpCb29sZWFuLHRyYW5zaXRpb246U3RyaW5nLGFwcGVuZFRvQm9keTp7dHlwZTpCb29sZWFuLCJkZWZhdWx0IjohMH0sb3B0aW9uczp7dHlwZTpPYmplY3QsImRlZmF1bHQiOmZ1bmN0aW9uKCl7cmV0dXJue2dwdUFjY2VsZXJhdGlvbjohMX19fX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntzaG93UG9wcGVyOiExfX0sd2F0Y2g6e3ZhbHVlOntpbW1lZGlhdGU6ITAsaGFuZGxlcjpmdW5jdGlvbihlKXt0aGlzLnNob3dQb3BwZXI9ZSx0aGlzLiRlbWl0KCJpbnB1dCIsZSl9fSxzaG93UG9wcGVyOmZ1bmN0aW9uKGUpe2U/dGhpcy51cGRhdGVQb3BwZXIoKTp0aGlzLmRlc3Ryb3lQb3BwZXIoKSx0aGlzLiRlbWl0KCJpbnB1dCIsZSl9fSxtZXRob2RzOntjcmVhdGVQb3BwZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKC9eKHRvcHxib3R0b218bGVmdHxyaWdodCkoLXN0YXJ0fC1lbmQpPyQvZy50ZXN0KHRoaXMucGxhY2VtZW50KSl7dmFyIHQ9dGhpcy5vcHRpb25zLG49dGhpcy5wb3BwZXJFbG09dGhpcy5wb3BwZXJFbG18fHRoaXMucG9wcGVyfHx0aGlzLiRyZWZzLnBvcHBlcixpPXRoaXMucmVmZXJlbmNlRWxtPXRoaXMucmVmZXJlbmNlRWxtfHx0aGlzLnJlZmVyZW5jZXx8dGhpcy4kcmVmcy5yZWZlcmVuY2U7IWkmJnRoaXMuJHNsb3RzLnJlZmVyZW5jZSYmdGhpcy4kc2xvdHMucmVmZXJlbmNlWzBdJiYoaT10aGlzLnJlZmVyZW5jZUVsbT10aGlzLiRzbG90cy5yZWZlcmVuY2VbMF0uZWxtKSxuJiZpJiYodGhpcy52aXNpYmxlQXJyb3cmJnRoaXMuYXBwZW5kQXJyb3cobiksdGhpcy5hcHBlbmRUb0JvZHkmJmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5wb3BwZXJFbG0pLHRoaXMucG9wcGVySlMmJnRoaXMucG9wcGVySlMuZGVzdHJveSYmdGhpcy5wb3BwZXJKUy5kZXN0cm95KCksdC5wbGFjZW1lbnQ9dGhpcy5wbGFjZW1lbnQsdC5vZmZzZXQ9dGhpcy5vZmZzZXQsdGhpcy5wb3BwZXJKUz1uZXcgb1siZGVmYXVsdCJdKGksbix0KSx0aGlzLnBvcHBlckpTLm9uQ3JlYXRlKGZ1bmN0aW9uKHQpe2UuJGVtaXQoImNyZWF0ZWQiLGUpLGUucmVzZXRUcmFuc2Zvcm1PcmlnaW4oKSxlLiRuZXh0VGljayhlLnVwZGF0ZVBvcHBlcil9KSx0aGlzLnBvcHBlckpTLl9wb3BwZXIuc3R5bGUuekluZGV4PWEuUG9wdXBNYW5hZ2VyLm5leHRaSW5kZXgoKSl9fSx1cGRhdGVQb3BwZXI6ZnVuY3Rpb24oKXt0aGlzLnBvcHBlckpTP3RoaXMucG9wcGVySlMudXBkYXRlKCk6dGhpcy5jcmVhdGVQb3BwZXIoKX0sZG9EZXN0cm95OmZ1bmN0aW9uKCl7IXRoaXMuc2hvd1BvcHBlciYmdGhpcy5wb3BwZXJKUyYmKHRoaXMucG9wcGVySlMuZGVzdHJveSgpLHRoaXMucG9wcGVySlM9bnVsbCl9LGRlc3Ryb3lQb3BwZXI6ZnVuY3Rpb24oKXt0aGlzLnBvcHBlckpTJiZ0aGlzLnJlc2V0VHJhbnNmb3JtT3JpZ2luKCl9LHJlc2V0VHJhbnNmb3JtT3JpZ2luOmZ1bmN0aW9uKCl7dmFyIGU9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsbGVmdDoicmlnaHQiLHJpZ2h0OiJsZWZ0In0sdD10aGlzLnBvcHBlckpTLl9wb3BwZXIuZ2V0QXR0cmlidXRlKCJ4LXBsYWNlbWVudCIpLnNwbGl0KCItIilbMF0sbj1lW3RdO3RoaXMucG9wcGVySlMuX3BvcHBlci5zdHlsZS50cmFuc2Zvcm1PcmlnaW49WyJ0b3AiLCJib3R0b20iXS5pbmRleE9mKHQpPi0xPyJjZW50ZXIgIituOm4rIiBjZW50ZXIifSxhcHBlbmRBcnJvdzpmdW5jdGlvbihlKXt2YXIgdD12b2lkIDA7aWYoIXRoaXMuYXBwZW5kZWQpe3RoaXMuYXBwZW5kZWQ9ITA7Zm9yKHZhciBuIGluIGUuYXR0cmlidXRlcylpZigvXl92LS8udGVzdChlLmF0dHJpYnV0ZXNbbl0ubmFtZSkpe3Q9ZS5hdHRyaWJ1dGVzW25dLm5hbWU7YnJlYWt9dmFyIGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dCYmaS5zZXRBdHRyaWJ1dGUodCwiIiksaS5zZXRBdHRyaWJ1dGUoIngtYXJyb3ciLCIiKSxpLmNsYXNzTmFtZT0icG9wcGVyX19hcnJvdyIsZS5hcHBlbmRDaGlsZChpKX19fSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5kb0Rlc3Ryb3koKSx0aGlzLnBvcHBlckVsbSYmdGhpcy5wb3BwZXJFbG0ucGFyZW50Tm9kZT09PWRvY3VtZW50LmJvZHkmJmRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy5wb3BwZXJFbG0pfSxkZWFjdGl2YXRlZDpmdW5jdGlvbigpe3RoaXMuJG9wdGlvbnMuYmVmb3JlRGVzdHJveVswXS5jYWxsKHRoaXMpfX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgaSxzOyFmdW5jdGlvbihvLGEpe2k9YSxzPSJmdW5jdGlvbiI9PXR5cGVvZiBpP2kuY2FsbCh0LG4sdCxlKTppLCEodm9pZCAwIT09cyYmKGUuZXhwb3J0cz1zKSl9KHRoaXMsZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZShlLHQsbil7dGhpcy5fcmVmZXJlbmNlPWUuanF1ZXJ5P2VbMF06ZSx0aGlzLnN0YXRlPXt9O3ZhciBpPSJ1bmRlZmluZWQiPT10eXBlb2YgdHx8bnVsbD09PXQscz10JiYiW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KTtyZXR1cm4gaXx8cz90aGlzLl9wb3BwZXI9dGhpcy5wYXJzZShzP3Q6e30pOnRoaXMuX3BvcHBlcj10LmpxdWVyeT90WzBdOnQsdGhpcy5fb3B0aW9ucz1PYmplY3QuYXNzaWduKHt9LGcsbiksdGhpcy5fb3B0aW9ucy5tb2RpZmllcnM9dGhpcy5fb3B0aW9ucy5tb2RpZmllcnMubWFwKGZ1bmN0aW9uKGUpe2lmKHRoaXMuX29wdGlvbnMubW9kaWZpZXJzSWdub3JlZC5pbmRleE9mKGUpPT09LTEpcmV0dXJuImFwcGx5U3R5bGUiPT09ZSYmdGhpcy5fcG9wcGVyLnNldEF0dHJpYnV0ZSgieC1wbGFjZW1lbnQiLHRoaXMuX29wdGlvbnMucGxhY2VtZW50KSx0aGlzLm1vZGlmaWVyc1tlXXx8ZX0uYmluZCh0aGlzKSksdGhpcy5zdGF0ZS5wb3NpdGlvbj10aGlzLl9nZXRQb3NpdGlvbih0aGlzLl9wb3BwZXIsdGhpcy5fcmVmZXJlbmNlKSx1KHRoaXMuX3BvcHBlcix7cG9zaXRpb246dGhpcy5zdGF0ZS5wb3NpdGlvbn0pLHRoaXMudXBkYXRlKCksdGhpcy5fc2V0dXBFdmVudExpc3RlbmVycygpLHRoaXN9ZnVuY3Rpb24gdChlKXt2YXIgdD1lLnN0eWxlLmRpc3BsYXksbj1lLnN0eWxlLnZpc2liaWxpdHk7ZS5zdHlsZS5kaXNwbGF5PSJibG9jayIsZS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iO3ZhciBpPShlLm9mZnNldFdpZHRoLG0uZ2V0Q29tcHV0ZWRTdHlsZShlKSkscz1wYXJzZUZsb2F0KGkubWFyZ2luVG9wKStwYXJzZUZsb2F0KGkubWFyZ2luQm90dG9tKSxvPXBhcnNlRmxvYXQoaS5tYXJnaW5MZWZ0KStwYXJzZUZsb2F0KGkubWFyZ2luUmlnaHQpLGE9e3dpZHRoOmUub2Zmc2V0V2lkdGgrbyxoZWlnaHQ6ZS5vZmZzZXRIZWlnaHQrc307cmV0dXJuIGUuc3R5bGUuZGlzcGxheT10LGUuc3R5bGUudmlzaWJpbGl0eT1uLGF9ZnVuY3Rpb24gbihlKXt2YXIgdD17bGVmdDoicmlnaHQiLHJpZ2h0OiJsZWZ0Iixib3R0b206InRvcCIsdG9wOiJib3R0b20ifTtyZXR1cm4gZS5yZXBsYWNlKC9sZWZ0fHJpZ2h0fGJvdHRvbXx0b3AvZyxmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pfWZ1bmN0aW9uIGkoZSl7dmFyIHQ9T2JqZWN0LmFzc2lnbih7fSxlKTtyZXR1cm4gdC5yaWdodD10LmxlZnQrdC53aWR0aCx0LmJvdHRvbT10LnRvcCt0LmhlaWdodCx0fWZ1bmN0aW9uIHMoZSx0KXt2YXIgbixpPTA7Zm9yKG4gaW4gZSl7aWYoZVtuXT09PXQpcmV0dXJuIGk7aSsrfXJldHVybiBudWxsfWZ1bmN0aW9uIG8oZSx0KXt2YXIgbj1tLmdldENvbXB1dGVkU3R5bGUoZSxudWxsKTtyZXR1cm4gblt0XX1mdW5jdGlvbiBhKGUpe3ZhciB0PWUub2Zmc2V0UGFyZW50O3JldHVybiB0IT09bS5kb2N1bWVudC5ib2R5JiZ0P3Q6bS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnR9ZnVuY3Rpb24gcihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQ/dD09PW0uZG9jdW1lbnQ/bS5kb2N1bWVudC5ib2R5LnNjcm9sbFRvcD9tLmRvY3VtZW50LmJvZHk6bS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ6WyJzY3JvbGwiLCJhdXRvIl0uaW5kZXhPZihvKHQsIm92ZXJmbG93IikpIT09LTF8fFsic2Nyb2xsIiwiYXV0byJdLmluZGV4T2Yobyh0LCJvdmVyZmxvdy14IikpIT09LTF8fFsic2Nyb2xsIiwiYXV0byJdLmluZGV4T2Yobyh0LCJvdmVyZmxvdy15IikpIT09LTE/dDpyKGUucGFyZW50Tm9kZSk6ZX1mdW5jdGlvbiBsKGUpe3JldHVybiBlIT09bS5kb2N1bWVudC5ib2R5JiYoImZpeGVkIj09PW8oZSwicG9zaXRpb24iKXx8KGUucGFyZW50Tm9kZT9sKGUucGFyZW50Tm9kZSk6ZSkpfWZ1bmN0aW9uIHUoZSx0KXtmdW5jdGlvbiBuKGUpe3JldHVybiIiIT09ZSYmIWlzTmFOKHBhcnNlRmxvYXQoZSkpJiZpc0Zpbml0ZShlKX1PYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKGkpe3ZhciBzPSIiO1sid2lkdGgiLCJoZWlnaHQiLCJ0b3AiLCJyaWdodCIsImJvdHRvbSIsImxlZnQiXS5pbmRleE9mKGkpIT09LTEmJm4odFtpXSkmJihzPSJweCIpLGUuc3R5bGVbaV09dFtpXStzfSl9ZnVuY3Rpb24gZChlKXt2YXIgdD17fTtyZXR1cm4gZSYmIltvYmplY3QgRnVuY3Rpb25dIj09PXQudG9TdHJpbmcuY2FsbChlKX1mdW5jdGlvbiBjKGUpe3ZhciB0PXt3aWR0aDplLm9mZnNldFdpZHRoLGhlaWdodDplLm9mZnNldEhlaWdodCxsZWZ0OmUub2Zmc2V0TGVmdCx0b3A6ZS5vZmZzZXRUb3B9O3JldHVybiB0LnJpZ2h0PXQubGVmdCt0LndpZHRoLHQuYm90dG9tPXQudG9wK3QuaGVpZ2h0LHR9ZnVuY3Rpb24gZihlKXt2YXIgdD1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIikhPS0xLGk9biYmIkhUTUwiPT09ZS50YWdOYW1lPy1lLnNjcm9sbFRvcDp0LnRvcDtyZXR1cm57bGVmdDp0LmxlZnQsdG9wOmkscmlnaHQ6dC5yaWdodCxib3R0b206dC5ib3R0b20sd2lkdGg6dC5yaWdodC10LmxlZnQsaGVpZ2h0OnQuYm90dG9tLWl9fWZ1bmN0aW9uIGgoZSx0LG4pe3ZhciBpPWYoZSkscz1mKHQpO2lmKG4pe3ZhciBvPXIodCk7cy50b3ArPW8uc2Nyb2xsVG9wLHMuYm90dG9tKz1vLnNjcm9sbFRvcCxzLmxlZnQrPW8uc2Nyb2xsTGVmdCxzLnJpZ2h0Kz1vLnNjcm9sbExlZnR9dmFyIGE9e3RvcDppLnRvcC1zLnRvcCxsZWZ0OmkubGVmdC1zLmxlZnQsYm90dG9tOmkudG9wLXMudG9wK2kuaGVpZ2h0LHJpZ2h0OmkubGVmdC1zLmxlZnQraS53aWR0aCx3aWR0aDppLndpZHRoLGhlaWdodDppLmhlaWdodH07cmV0dXJuIGF9ZnVuY3Rpb24gcChlKXtmb3IodmFyIHQ9WyIiLCJtcyIsIndlYmtpdCIsIm1veiIsIm8iXSxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBpPXRbbl0/dFtuXStlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSk6ZTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIG0uZG9jdW1lbnQuYm9keS5zdHlsZVtpXSlyZXR1cm4gaX1yZXR1cm4gbnVsbH12YXIgbT13aW5kb3csZz17cGxhY2VtZW50OiJib3R0b20iLGdwdUFjY2VsZXJhdGlvbjohMCxvZmZzZXQ6MCxib3VuZGFyaWVzRWxlbWVudDoidmlld3BvcnQiLGJvdW5kYXJpZXNQYWRkaW5nOjUscHJldmVudE92ZXJmbG93T3JkZXI6WyJsZWZ0IiwicmlnaHQiLCJ0b3AiLCJib3R0b20iXSxmbGlwQmVoYXZpb3I6ImZsaXAiLGFycm93RWxlbWVudDoiW3gtYXJyb3ddIixtb2RpZmllcnM6WyJzaGlmdCIsIm9mZnNldCIsInByZXZlbnRPdmVyZmxvdyIsImtlZXBUb2dldGhlciIsImFycm93IiwiZmxpcCIsImFwcGx5U3R5bGUiXSxtb2RpZmllcnNJZ25vcmVkOltdLGZvcmNlQWJzb2x1dGU6ITF9O3JldHVybiBlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BvcHBlci5yZW1vdmVBdHRyaWJ1dGUoIngtcGxhY2VtZW50IiksdGhpcy5fcG9wcGVyLnN0eWxlLmxlZnQ9IiIsdGhpcy5fcG9wcGVyLnN0eWxlLnBvc2l0aW9uPSIiLHRoaXMuX3BvcHBlci5zdHlsZS50b3A9IiIsdGhpcy5fcG9wcGVyLnN0eWxlW3AoInRyYW5zZm9ybSIpXT0iIix0aGlzLl9yZW1vdmVFdmVudExpc3RlbmVycygpLHRoaXMuX29wdGlvbnMucmVtb3ZlT25EZXN0cm95JiZ0aGlzLl9wb3BwZXIucmVtb3ZlKCksdGhpc30sZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dmFyIGU9e2luc3RhbmNlOnRoaXMsc3R5bGVzOnt9fTtlLnBsYWNlbWVudD10aGlzLl9vcHRpb25zLnBsYWNlbWVudCxlLl9vcmlnaW5hbFBsYWNlbWVudD10aGlzLl9vcHRpb25zLnBsYWNlbWVudCxlLm9mZnNldHM9dGhpcy5fZ2V0T2Zmc2V0cyh0aGlzLl9wb3BwZXIsdGhpcy5fcmVmZXJlbmNlLGUucGxhY2VtZW50KSxlLmJvdW5kYXJpZXM9dGhpcy5fZ2V0Qm91bmRhcmllcyhlLHRoaXMuX29wdGlvbnMuYm91bmRhcmllc1BhZGRpbmcsdGhpcy5fb3B0aW9ucy5ib3VuZGFyaWVzRWxlbWVudCksZT10aGlzLnJ1bk1vZGlmaWVycyhlLHRoaXMuX29wdGlvbnMubW9kaWZpZXJzKSwiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5zdGF0ZS51cGRhdGVDYWxsYmFjayYmdGhpcy5zdGF0ZS51cGRhdGVDYWxsYmFjayhlKX0sZS5wcm90b3R5cGUub25DcmVhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUodGhpcyksdGhpc30sZS5wcm90b3R5cGUub25VcGRhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc3RhdGUudXBkYXRlQ2FsbGJhY2s9ZSx0aGlzfSxlLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUsdCl7dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2UuY2xhc3NMaXN0LmFkZCh0KX0pfWZ1bmN0aW9uIG4oZSx0KXt0LmZvckVhY2goZnVuY3Rpb24odCl7ZS5zZXRBdHRyaWJ1dGUodC5zcGxpdCgiOiIpWzBdLHQuc3BsaXQoIjoiKVsxXXx8IiIpfSl9dmFyIGk9e3RhZ05hbWU6ImRpdiIsY2xhc3NOYW1lczpbInBvcHBlciJdLGF0dHJpYnV0ZXM6W10scGFyZW50Om0uZG9jdW1lbnQuYm9keSxjb250ZW50OiIiLGNvbnRlbnRUeXBlOiJ0ZXh0IixhcnJvd1RhZ05hbWU6ImRpdiIsYXJyb3dDbGFzc05hbWVzOlsicG9wcGVyX19hcnJvdyJdLGFycm93QXR0cmlidXRlczpbIngtYXJyb3ciXX07ZT1PYmplY3QuYXNzaWduKHt9LGksZSk7dmFyIHM9bS5kb2N1bWVudCxvPXMuY3JlYXRlRWxlbWVudChlLnRhZ05hbWUpO2lmKHQobyxlLmNsYXNzTmFtZXMpLG4obyxlLmF0dHJpYnV0ZXMpLCJub2RlIj09PWUuY29udGVudFR5cGU/by5hcHBlbmRDaGlsZChlLmNvbnRlbnQuanF1ZXJ5P2UuY29udGVudFswXTplLmNvbnRlbnQpOiJodG1sIj09PWUuY29udGVudFR5cGU/by5pbm5lckhUTUw9ZS5jb250ZW50Om8udGV4dENvbnRlbnQ9ZS5jb250ZW50LGUuYXJyb3dUYWdOYW1lKXt2YXIgYT1zLmNyZWF0ZUVsZW1lbnQoZS5hcnJvd1RhZ05hbWUpO3QoYSxlLmFycm93Q2xhc3NOYW1lcyksbihhLGUuYXJyb3dBdHRyaWJ1dGVzKSxvLmFwcGVuZENoaWxkKGEpfXZhciByPWUucGFyZW50LmpxdWVyeT9lLnBhcmVudFswXTplLnBhcmVudDtpZigic3RyaW5nIj09dHlwZW9mIHIpe2lmKHI9cy5xdWVyeVNlbGVjdG9yQWxsKGUucGFyZW50KSxyLmxlbmd0aD4xJiZjb25zb2xlLndhcm4oIldBUk5JTkc6IHRoZSBnaXZlbiBgcGFyZW50YCBxdWVyeSgiK2UucGFyZW50KyIpIG1hdGNoZWQgbW9yZSB0aGFuIG9uZSBlbGVtZW50LCB0aGUgZmlyc3Qgb25lIHdpbGwgYmUgdXNlZCIpLDA9PT1yLmxlbmd0aCl0aHJvdyJFUlJPUjogdGhlIGdpdmVuIGBwYXJlbnRgIGRvZXNuJ3QgZXhpc3RzISI7cj1yWzBdfXJldHVybiByLmxlbmd0aD4xJiZyIGluc3RhbmNlb2YgRWxlbWVudD09ITEmJihjb25zb2xlLndhcm4oIldBUk5JTkc6IHlvdSBoYXZlIHBhc3NlZCBhcyBwYXJlbnQgYSBsaXN0IG9mIGVsZW1lbnRzLCB0aGUgZmlyc3Qgb25lIHdpbGwgYmUgdXNlZCIpLHI9clswXSksci5hcHBlbmRDaGlsZChvKSxvfSxlLnByb3RvdHlwZS5fZ2V0UG9zaXRpb249ZnVuY3Rpb24oZSx0KXt2YXIgbj1hKHQpO2lmKHRoaXMuX29wdGlvbnMuZm9yY2VBYnNvbHV0ZSlyZXR1cm4iYWJzb2x1dGUiO3ZhciBpPWwodCxuKTtyZXR1cm4gaT8iZml4ZWQiOiJhYnNvbHV0ZSJ9LGUucHJvdG90eXBlLl9nZXRPZmZzZXRzPWZ1bmN0aW9uKGUsbixpKXtpPWkuc3BsaXQoIi0iKVswXTt2YXIgcz17fTtzLnBvc2l0aW9uPXRoaXMuc3RhdGUucG9zaXRpb247dmFyIG89ImZpeGVkIj09PXMucG9zaXRpb24scj1oKG4sYShlKSxvKSxsPXQoZSk7cmV0dXJuWyJyaWdodCIsImxlZnQiXS5pbmRleE9mKGkpIT09LTE/KHMudG9wPXIudG9wK3IuaGVpZ2h0LzItbC5oZWlnaHQvMiwibGVmdCI9PT1pP3MubGVmdD1yLmxlZnQtbC53aWR0aDpzLmxlZnQ9ci5yaWdodCk6KHMubGVmdD1yLmxlZnQrci53aWR0aC8yLWwud2lkdGgvMiwidG9wIj09PWk/cy50b3A9ci50b3AtbC5oZWlnaHQ6cy50b3A9ci5ib3R0b20pLHMud2lkdGg9bC53aWR0aCxzLmhlaWdodD1sLmhlaWdodCx7cG9wcGVyOnMscmVmZXJlbmNlOnJ9fSxlLnByb3RvdHlwZS5fc2V0dXBFdmVudExpc3RlbmVycz1mdW5jdGlvbigpe2lmKHRoaXMuc3RhdGUudXBkYXRlQm91bmQ9dGhpcy51cGRhdGUuYmluZCh0aGlzKSxtLmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdGhpcy5zdGF0ZS51cGRhdGVCb3VuZCksIndpbmRvdyIhPT10aGlzLl9vcHRpb25zLmJvdW5kYXJpZXNFbGVtZW50KXt2YXIgZT1yKHRoaXMuX3JlZmVyZW5jZSk7ZSE9PW0uZG9jdW1lbnQuYm9keSYmZSE9PW0uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHwoZT1tKSxlLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdGhpcy5zdGF0ZS51cGRhdGVCb3VuZCl9fSxlLnByb3RvdHlwZS5fcmVtb3ZlRXZlbnRMaXN0ZW5lcnM9ZnVuY3Rpb24oKXtpZihtLnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdGhpcy5zdGF0ZS51cGRhdGVCb3VuZCksIndpbmRvdyIhPT10aGlzLl9vcHRpb25zLmJvdW5kYXJpZXNFbGVtZW50KXt2YXIgZT1yKHRoaXMuX3JlZmVyZW5jZSk7ZSE9PW0uZG9jdW1lbnQuYm9keSYmZSE9PW0uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHwoZT1tKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdGhpcy5zdGF0ZS51cGRhdGVCb3VuZCl9dGhpcy5zdGF0ZS51cGRhdGVCb3VuZD1udWxsfSxlLnByb3RvdHlwZS5fZ2V0Qm91bmRhcmllcz1mdW5jdGlvbihlLHQsbil7dmFyIGkscyxvPXt9O2lmKCJ3aW5kb3ciPT09bil7dmFyIGw9bS5kb2N1bWVudC5ib2R5LHU9bS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7cz1NYXRoLm1heChsLnNjcm9sbEhlaWdodCxsLm9mZnNldEhlaWdodCx1LmNsaWVudEhlaWdodCx1LnNjcm9sbEhlaWdodCx1Lm9mZnNldEhlaWdodCksaT1NYXRoLm1heChsLnNjcm9sbFdpZHRoLGwub2Zmc2V0V2lkdGgsdS5jbGllbnRXaWR0aCx1LnNjcm9sbFdpZHRoLHUub2Zmc2V0V2lkdGgpLG89e3RvcDowLHJpZ2h0OmksYm90dG9tOnMsbGVmdDowfX1lbHNlIGlmKCJ2aWV3cG9ydCI9PT1uKXt2YXIgZD1hKHRoaXMuX3BvcHBlciksZj1yKHRoaXMuX3BvcHBlciksaD1jKGQpLHA9ImZpeGVkIj09PWUub2Zmc2V0cy5wb3BwZXIucG9zaXRpb24/MDpmLnNjcm9sbFRvcCxnPSJmaXhlZCI9PT1lLm9mZnNldHMucG9wcGVyLnBvc2l0aW9uPzA6Zi5zY3JvbGxMZWZ0O289e3RvcDowLShoLnRvcC1wKSxyaWdodDptLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aC0oaC5sZWZ0LWcpLGJvdHRvbTptLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQtKGgudG9wLXApLGxlZnQ6MC0oaC5sZWZ0LWcpfX1lbHNlIG89YSh0aGlzLl9wb3BwZXIpPT09bj97dG9wOjAsbGVmdDowLHJpZ2h0Om4uY2xpZW50V2lkdGgsYm90dG9tOm4uY2xpZW50SGVpZ2h0fTpjKG4pO3JldHVybiBvLmxlZnQrPXQsby5yaWdodC09dCxvLnRvcD1vLnRvcCt0LG8uYm90dG9tPW8uYm90dG9tLXQsb30sZS5wcm90b3R5cGUucnVuTW9kaWZpZXJzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgaT10LnNsaWNlKCk7cmV0dXJuIHZvaWQgMCE9PW4mJihpPXRoaXMuX29wdGlvbnMubW9kaWZpZXJzLnNsaWNlKDAscyh0aGlzLl9vcHRpb25zLm1vZGlmaWVycyxuKSkpLGkuZm9yRWFjaChmdW5jdGlvbih0KXtkKHQpJiYoZT10LmNhbGwodGhpcyxlKSl9LmJpbmQodGhpcykpLGV9LGUucHJvdG90eXBlLmlzTW9kaWZpZXJSZXF1aXJlZD1mdW5jdGlvbihlLHQpe3ZhciBuPXModGhpcy5fb3B0aW9ucy5tb2RpZmllcnMsZSk7cmV0dXJuISF0aGlzLl9vcHRpb25zLm1vZGlmaWVycy5zbGljZSgwLG4pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZT09PXR9KS5sZW5ndGh9LGUucHJvdG90eXBlLm1vZGlmaWVycz17fSxlLnByb3RvdHlwZS5tb2RpZmllcnMuYXBwbHlTdHlsZT1mdW5jdGlvbihlKXt2YXIgdCxuPXtwb3NpdGlvbjplLm9mZnNldHMucG9wcGVyLnBvc2l0aW9ufSxpPU1hdGgucm91bmQoZS5vZmZzZXRzLnBvcHBlci5sZWZ0KSxzPU1hdGgucm91bmQoZS5vZmZzZXRzLnBvcHBlci50b3ApO3JldHVybiB0aGlzLl9vcHRpb25zLmdwdUFjY2VsZXJhdGlvbiYmKHQ9cCgidHJhbnNmb3JtIikpPyhuW3RdPSJ0cmFuc2xhdGUzZCgiK2krInB4LCAiK3MrInB4LCAwKSIsbi50b3A9MCxuLmxlZnQ9MCk6KG4ubGVmdD1pLG4udG9wPXMpLE9iamVjdC5hc3NpZ24obixlLnN0eWxlcyksdSh0aGlzLl9wb3BwZXIsbiksdGhpcy5fcG9wcGVyLnNldEF0dHJpYnV0ZSgieC1wbGFjZW1lbnQiLGUucGxhY2VtZW50KSx0aGlzLmlzTW9kaWZpZXJSZXF1aXJlZCh0aGlzLm1vZGlmaWVycy5hcHBseVN0eWxlLHRoaXMubW9kaWZpZXJzLmFycm93KSYmZS5vZmZzZXRzLmFycm93JiZ1KGUuYXJyb3dFbGVtZW50LGUub2Zmc2V0cy5hcnJvdyksZX0sZS5wcm90b3R5cGUubW9kaWZpZXJzLnNoaWZ0PWZ1bmN0aW9uKGUpe3ZhciB0PWUucGxhY2VtZW50LG49dC5zcGxpdCgiLSIpWzBdLHM9dC5zcGxpdCgiLSIpWzFdO2lmKHMpe3ZhciBvPWUub2Zmc2V0cy5yZWZlcmVuY2UsYT1pKGUub2Zmc2V0cy5wb3BwZXIpLHI9e3k6e3N0YXJ0Ont0b3A6by50b3B9LGVuZDp7dG9wOm8udG9wK28uaGVpZ2h0LWEuaGVpZ2h0fX0seDp7c3RhcnQ6e2xlZnQ6by5sZWZ0fSxlbmQ6e2xlZnQ6by5sZWZ0K28ud2lkdGgtYS53aWR0aH19fSxsPVsiYm90dG9tIiwidG9wIl0uaW5kZXhPZihuKSE9PS0xPyJ4IjoieSI7ZS5vZmZzZXRzLnBvcHBlcj1PYmplY3QuYXNzaWduKGEscltsXVtzXSl9cmV0dXJuIGV9LGUucHJvdG90eXBlLm1vZGlmaWVycy5wcmV2ZW50T3ZlcmZsb3c9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fb3B0aW9ucy5wcmV2ZW50T3ZlcmZsb3dPcmRlcixuPWkoZS5vZmZzZXRzLnBvcHBlcikscz17bGVmdDpmdW5jdGlvbigpe3ZhciB0PW4ubGVmdDtyZXR1cm4gbi5sZWZ0PGUuYm91bmRhcmllcy5sZWZ0JiYodD1NYXRoLm1heChuLmxlZnQsZS5ib3VuZGFyaWVzLmxlZnQpKSx7bGVmdDp0fX0scmlnaHQ6ZnVuY3Rpb24oKXt2YXIgdD1uLmxlZnQ7cmV0dXJuIG4ucmlnaHQ+ZS5ib3VuZGFyaWVzLnJpZ2h0JiYodD1NYXRoLm1pbihuLmxlZnQsZS5ib3VuZGFyaWVzLnJpZ2h0LW4ud2lkdGgpKSx7bGVmdDp0fX0sdG9wOmZ1bmN0aW9uKCl7dmFyIHQ9bi50b3A7cmV0dXJuIG4udG9wPGUuYm91bmRhcmllcy50b3AmJih0PU1hdGgubWF4KG4udG9wLGUuYm91bmRhcmllcy50b3ApKSx7dG9wOnR9fSxib3R0b206ZnVuY3Rpb24oKXt2YXIgdD1uLnRvcDtyZXR1cm4gbi5ib3R0b20+ZS5ib3VuZGFyaWVzLmJvdHRvbSYmKHQ9TWF0aC5taW4obi50b3AsZS5ib3VuZGFyaWVzLmJvdHRvbS1uLmhlaWdodCkpLHt0b3A6dH19fTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Uub2Zmc2V0cy5wb3BwZXI9T2JqZWN0LmFzc2lnbihuLHNbdF0oKSl9KSxlfSxlLnByb3RvdHlwZS5tb2RpZmllcnMua2VlcFRvZ2V0aGVyPWZ1bmN0aW9uKGUpe3ZhciB0PWkoZS5vZmZzZXRzLnBvcHBlciksbj1lLm9mZnNldHMucmVmZXJlbmNlLHM9TWF0aC5mbG9vcjtyZXR1cm4gdC5yaWdodDxzKG4ubGVmdCkmJihlLm9mZnNldHMucG9wcGVyLmxlZnQ9cyhuLmxlZnQpLXQud2lkdGgpLHQubGVmdD5zKG4ucmlnaHQpJiYoZS5vZmZzZXRzLnBvcHBlci5sZWZ0PXMobi5yaWdodCkpLHQuYm90dG9tPHMobi50b3ApJiYoZS5vZmZzZXRzLnBvcHBlci50b3A9cyhuLnRvcCktdC5oZWlnaHQpLHQudG9wPnMobi5ib3R0b20pJiYoZS5vZmZzZXRzLnBvcHBlci50b3A9cyhuLmJvdHRvbSkpLGV9LGUucHJvdG90eXBlLm1vZGlmaWVycy5mbGlwPWZ1bmN0aW9uKGUpe2lmKCF0aGlzLmlzTW9kaWZpZXJSZXF1aXJlZCh0aGlzLm1vZGlmaWVycy5mbGlwLHRoaXMubW9kaWZpZXJzLnByZXZlbnRPdmVyZmxvdykpcmV0dXJuIGNvbnNvbGUud2FybigiV0FSTklORzogcHJldmVudE92ZXJmbG93IG1vZGlmaWVyIGlzIHJlcXVpcmVkIGJ5IGZsaXAgbW9kaWZpZXIgaW4gb3JkZXIgdG8gd29yaywgYmUgc3VyZSB0byBpbmNsdWRlIGl0IGJlZm9yZSBmbGlwISIpLGU7aWYoZS5mbGlwcGVkJiZlLnBsYWNlbWVudD09PWUuX29yaWdpbmFsUGxhY2VtZW50KXJldHVybiBlO3ZhciB0PWUucGxhY2VtZW50LnNwbGl0KCItIilbMF0scz1uKHQpLG89ZS5wbGFjZW1lbnQuc3BsaXQoIi0iKVsxXXx8IiIsYT1bXTtyZXR1cm4gYT0iZmxpcCI9PT10aGlzLl9vcHRpb25zLmZsaXBCZWhhdmlvcj9bdCxzXTp0aGlzLl9vcHRpb25zLmZsaXBCZWhhdmlvcixhLmZvckVhY2goZnVuY3Rpb24ocixsKXtpZih0PT09ciYmYS5sZW5ndGghPT1sKzEpe3Q9ZS5wbGFjZW1lbnQuc3BsaXQoIi0iKVswXSxzPW4odCk7dmFyIHU9aShlLm9mZnNldHMucG9wcGVyKSxkPVsicmlnaHQiLCJib3R0b20iXS5pbmRleE9mKHQpIT09LTE7KGQmJk1hdGguZmxvb3IoZS5vZmZzZXRzLnJlZmVyZW5jZVt0XSk+TWF0aC5mbG9vcih1W3NdKXx8IWQmJk1hdGguZmxvb3IoZS5vZmZzZXRzLnJlZmVyZW5jZVt0XSk8TWF0aC5mbG9vcih1W3NdKSkmJihlLmZsaXBwZWQ9ITAsZS5wbGFjZW1lbnQ9YVtsKzFdLG8mJihlLnBsYWNlbWVudCs9Ii0iK28pLGUub2Zmc2V0cy5wb3BwZXI9dGhpcy5fZ2V0T2Zmc2V0cyh0aGlzLl9wb3BwZXIsdGhpcy5fcmVmZXJlbmNlLGUucGxhY2VtZW50KS5wb3BwZXIsZT10aGlzLnJ1bk1vZGlmaWVycyhlLHRoaXMuX29wdGlvbnMubW9kaWZpZXJzLHRoaXMuX2ZsaXApKX19LmJpbmQodGhpcykpLGV9LGUucHJvdG90eXBlLm1vZGlmaWVycy5vZmZzZXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fb3B0aW9ucy5vZmZzZXQsbj1lLm9mZnNldHMucG9wcGVyO3JldHVybiBlLnBsYWNlbWVudC5pbmRleE9mKCJsZWZ0IikhPT0tMT9uLnRvcC09dDplLnBsYWNlbWVudC5pbmRleE9mKCJyaWdodCIpIT09LTE/bi50b3ArPXQ6ZS5wbGFjZW1lbnQuaW5kZXhPZigidG9wIikhPT0tMT9uLmxlZnQtPXQ6ZS5wbGFjZW1lbnQuaW5kZXhPZigiYm90dG9tIikhPT0tMSYmKG4ubGVmdCs9dCksZX0sZS5wcm90b3R5cGUubW9kaWZpZXJzLmFycm93PWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMuX29wdGlvbnMuYXJyb3dFbGVtZW50O2lmKCJzdHJpbmciPT10eXBlb2YgbiYmKG49dGhpcy5fcG9wcGVyLnF1ZXJ5U2VsZWN0b3IobikpLCFuKXJldHVybiBlO2lmKCF0aGlzLl9wb3BwZXIuY29udGFpbnMobikpcmV0dXJuIGNvbnNvbGUud2FybigiV0FSTklORzogYGFycm93RWxlbWVudGAgbXVzdCBiZSBjaGlsZCBvZiBpdHMgcG9wcGVyIGVsZW1lbnQhIiksZTtpZighdGhpcy5pc01vZGlmaWVyUmVxdWlyZWQodGhpcy5tb2RpZmllcnMuYXJyb3csdGhpcy5tb2RpZmllcnMua2VlcFRvZ2V0aGVyKSlyZXR1cm4gY29uc29sZS53YXJuKCJXQVJOSU5HOiBrZWVwVG9nZXRoZXIgbW9kaWZpZXIgaXMgcmVxdWlyZWQgYnkgYXJyb3cgbW9kaWZpZXIgaW4gb3JkZXIgdG8gd29yaywgYmUgc3VyZSB0byBpbmNsdWRlIGl0IGJlZm9yZSBhcnJvdyEiKSxlO3ZhciBzPXt9LG89ZS5wbGFjZW1lbnQuc3BsaXQoIi0iKVswXSxhPWkoZS5vZmZzZXRzLnBvcHBlcikscj1lLm9mZnNldHMucmVmZXJlbmNlLGw9WyJsZWZ0IiwicmlnaHQiXS5pbmRleE9mKG8pIT09LTEsdT1sPyJoZWlnaHQiOiJ3aWR0aCIsZD1sPyJ0b3AiOiJsZWZ0IixjPWw/ImxlZnQiOiJ0b3AiLGY9bD8iYm90dG9tIjoicmlnaHQiLGg9dChuKVt1XTtyW2ZdLWg8YVtkXSYmKGUub2Zmc2V0cy5wb3BwZXJbZF0tPWFbZF0tKHJbZl0taCkpLHJbZF0raD5hW2ZdJiYoZS5vZmZzZXRzLnBvcHBlcltkXSs9cltkXStoLWFbZl0pO3ZhciBwPXJbZF0rclt1XS8yLWgvMixtPXAtYVtkXTtyZXR1cm4gbT1NYXRoLm1heChNYXRoLm1pbihhW3VdLWgsbSksMCksc1tkXT1tLHNbY109IiIsZS5vZmZzZXRzLmFycm93PXMsZS5hcnJvd0VsZW1lbnQ9bixlfSxPYmplY3QuYXNzaWdufHxPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JqZWN0LCJhc3NpZ24iLHtlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpmdW5jdGlvbihlKXtpZih2b2lkIDA9PT1lfHxudWxsPT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY29udmVydCBmaXJzdCBhcmd1bWVudCB0byBvYmplY3QiKTtmb3IodmFyIHQ9T2JqZWN0KGUpLG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXt2YXIgaT1hcmd1bWVudHNbbl07aWYodm9pZCAwIT09aSYmbnVsbCE9PWkpe2k9T2JqZWN0KGkpO2Zvcih2YXIgcz1PYmplY3Qua2V5cyhpKSxvPTAsYT1zLmxlbmd0aDtvPGE7bysrKXt2YXIgcj1zW29dLGw9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpLHIpO3ZvaWQgMCE9PWwmJmwuZW51bWVyYWJsZSYmKHRbcl09aVtyXSl9fX1yZXR1cm4gdH19KSxlfSl9LGZ1bmN0aW9uKGUsdCxuKXshZnVuY3Rpb24odCxpKXtlLmV4cG9ydHM9aShuKDE0KSl9KHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoaSl7aWYobltpXSlyZXR1cm4gbltpXS5leHBvcnRzO3ZhciBzPW5baV09e2k6aSxsOiExLGV4cG9ydHM6e319O3JldHVybiBlW2ldLmNhbGwocy5leHBvcnRzLHMscy5leHBvcnRzLHQpLHMubD0hMCxzLmV4cG9ydHN9dmFyIG49e307cmV0dXJuIHQubT1lLHQuYz1uLHQuaT1mdW5jdGlvbihlKXtyZXR1cm4gZX0sdC5kPWZ1bmN0aW9uKGUsdCxuKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCxnZXQ6bn0pfSx0Lm49ZnVuY3Rpb24oZSl7dmFyIG49ZSYmZS5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIGVbImRlZmF1bHQiXX06ZnVuY3Rpb24oKXtyZXR1cm4gZX07cmV0dXJuIHQuZChuLCJhIixuKSxufSx0Lm89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCl9LHQucD0iL2xpYi8iLHQodC5zPTYpfShbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fXQuX19lc01vZHVsZT0hMCx0LlBvcHVwTWFuYWdlcj12b2lkIDA7dmFyIHM9big1KSxvPWkocyksYT1uKDMpLHI9bigyKSxsPWkocik7big0KTt2YXIgdT0xLGQ9W10sYz1mdW5jdGlvbihlKXtpZihkLmluZGV4T2YoZSk9PT0tMSl7dmFyIHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5fX3Z1ZV9fO2lmKCF0KXt2YXIgbj1lLnByZXZpb3VzU2libGluZztuLl9fdnVlX18mJih0PW4uX192dWVfXyl9cmV0dXJuIHR9O29bImRlZmF1bHQiXS50cmFuc2l0aW9uKGUse2FmdGVyRW50ZXI6ZnVuY3Rpb24oZSl7dmFyIG49dChlKTtuJiZuLmRvQWZ0ZXJPcGVuJiZuLmRvQWZ0ZXJPcGVuKCl9LGFmdGVyTGVhdmU6ZnVuY3Rpb24oZSl7dmFyIG49dChlKTtuJiZuLmRvQWZ0ZXJDbG9zZSYmbi5kb0FmdGVyQ2xvc2UoKX19KX19LGY9dm9pZCAwLGg9ZnVuY3Rpb24oKXtpZih2b2lkIDAhPT1mKXJldHVybiBmO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIixlLnN0eWxlLndpZHRoPSIxMDBweCIsZS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGUuc3R5bGUudG9wPSItOTk5OXB4Iixkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpO3ZhciB0PWUub2Zmc2V0V2lkdGg7ZS5zdHlsZS5vdmVyZmxvdz0ic2Nyb2xsIjt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtuLnN0eWxlLndpZHRoPSIxMDAlIixlLmFwcGVuZENoaWxkKG4pO3ZhciBpPW4ub2Zmc2V0V2lkdGg7cmV0dXJuIGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSx0LWl9LHA9ZnVuY3Rpb24gbShlKXtyZXR1cm4gMz09PWUubm9kZVR5cGUmJihlPWUubmV4dEVsZW1lbnRTaWJsaW5nfHxlLm5leHRTaWJsaW5nLG0oZSkpLGV9O3RbImRlZmF1bHQiXT17cHJvcHM6e3ZhbHVlOnt0eXBlOkJvb2xlYW4sImRlZmF1bHQiOiExfSx0cmFuc2l0aW9uOnt0eXBlOlN0cmluZywiZGVmYXVsdCI6IiJ9LG9wZW5EZWxheTp7fSxjbG9zZURlbGF5Ont9LHpJbmRleDp7fSxtb2RhbDp7dHlwZTpCb29sZWFuLCJkZWZhdWx0IjohMX0sbW9kYWxGYWRlOnt0eXBlOkJvb2xlYW4sImRlZmF1bHQiOiEwfSxtb2RhbENsYXNzOnt9LGxvY2tTY3JvbGw6e3R5cGU6Qm9vbGVhbiwiZGVmYXVsdCI6ITB9LGNsb3NlT25QcmVzc0VzY2FwZTp7dHlwZTpCb29sZWFuLCJkZWZhdWx0IjohMX0sY2xvc2VPbkNsaWNrTW9kYWw6e3R5cGU6Qm9vbGVhbiwiZGVmYXVsdCI6ITF9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy50cmFuc2l0aW9uJiZjKHRoaXMudHJhbnNpdGlvbil9LGJlZm9yZU1vdW50OmZ1bmN0aW9uKCl7dGhpcy5fcG9wdXBJZD0icG9wdXAtIit1KyssbFsiZGVmYXVsdCJdLnJlZ2lzdGVyKHRoaXMuX3BvcHVwSWQsdGhpcyl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXtsWyJkZWZhdWx0Il0uZGVyZWdpc3Rlcih0aGlzLl9wb3B1cElkKSxsWyJkZWZhdWx0Il0uY2xvc2VNb2RhbCh0aGlzLl9wb3B1cElkKSx0aGlzLm1vZGFsJiZudWxsIT09dGhpcy5ib2R5T3ZlcmZsb3cmJiJoaWRkZW4iIT09dGhpcy5ib2R5T3ZlcmZsb3cmJihkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93PXRoaXMuYm9keU92ZXJmbG93LGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0PXRoaXMuYm9keVBhZGRpbmdSaWdodCksdGhpcy5ib2R5T3ZlcmZsb3c9bnVsbCx0aGlzLmJvZHlQYWRkaW5nUmlnaHQ9bnVsbH0sZGF0YTpmdW5jdGlvbigpe3JldHVybntvcGVuZWQ6ITEsYm9keU92ZXJmbG93Om51bGwsYm9keVBhZGRpbmdSaWdodDpudWxsLHJlbmRlcmVkOiExfX0sd2F0Y2g6e3ZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYoZSl7aWYodGhpcy5fb3BlbmluZylyZXR1cm47dGhpcy5yZW5kZXJlZD90aGlzLm9wZW4oKToodGhpcy5yZW5kZXJlZD0hMCxvWyJkZWZhdWx0Il0ubmV4dFRpY2soZnVuY3Rpb24oKXt0Lm9wZW4oKX0pKX1lbHNlIHRoaXMuY2xvc2UoKX19LG1ldGhvZHM6e29wZW46ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aGlzLnJlbmRlcmVkfHwodGhpcy5yZW5kZXJlZD0hMCx0aGlzLiRlbWl0KCJpbnB1dCIsITApKTt2YXIgbj0oMCxhLm1lcmdlKSh7fSx0aGlzLGUpO3RoaXMuX2Nsb3NlVGltZXImJihjbGVhclRpbWVvdXQodGhpcy5fY2xvc2VUaW1lciksdGhpcy5fY2xvc2VUaW1lcj1udWxsKSxjbGVhclRpbWVvdXQodGhpcy5fb3BlblRpbWVyKTt2YXIgaT1OdW1iZXIobi5vcGVuRGVsYXkpO2k+MD90aGlzLl9vcGVuVGltZXI9c2V0VGltZW91dChmdW5jdGlvbigpe3QuX29wZW5UaW1lcj1udWxsLHQuZG9PcGVuKG4pfSxpKTp0aGlzLmRvT3BlbihuKX0sZG9PcGVuOmZ1bmN0aW9uKGUpe2lmKCghdGhpcy53aWxsT3Blbnx8dGhpcy53aWxsT3BlbigpKSYmIXRoaXMub3BlbmVkKXt0aGlzLl9vcGVuaW5nPSEwLHRoaXMudmlzaWJsZT0hMCx0aGlzLiRlbWl0KCJpbnB1dCIsITApO3ZhciB0PXAodGhpcy4kZWwpLG49ZS5tb2RhbCxpPWUuekluZGV4O2lmKGkmJihsWyJkZWZhdWx0Il0uekluZGV4PWkpLG4mJih0aGlzLl9jbG9zaW5nJiYobFsiZGVmYXVsdCJdLmNsb3NlTW9kYWwodGhpcy5fcG9wdXBJZCksdGhpcy5fY2xvc2luZz0hMSksbFsiZGVmYXVsdCJdLm9wZW5Nb2RhbCh0aGlzLl9wb3B1cElkLGxbImRlZmF1bHQiXS5uZXh0WkluZGV4KCksdCxlLm1vZGFsQ2xhc3MsZS5tb2RhbEZhZGUpLGUubG9ja1Njcm9sbCkpe3RoaXMuYm9keU92ZXJmbG93fHwodGhpcy5ib2R5UGFkZGluZ1JpZ2h0PWRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0LHRoaXMuYm9keU92ZXJmbG93PWRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cpLGY9aCgpO3ZhciBzPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ8ZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQ7Zj4wJiZzJiYoZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ9ZisicHgiKSxkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93PSJoaWRkZW4ifSJzdGF0aWMiPT09Z2V0Q29tcHV0ZWRTdHlsZSh0KS5wb3NpdGlvbiYmKHQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIiksbj90LnN0eWxlLnpJbmRleD1sWyJkZWZhdWx0Il0ubmV4dFpJbmRleCgpOmkmJih0LnN0eWxlLnpJbmRleD1pKSx0aGlzLm9wZW5lZD0hMCx0aGlzLm9uT3BlbiYmdGhpcy5vbk9wZW4oKSx0aGlzLnRyYW5zaXRpb258fHRoaXMuZG9BZnRlck9wZW4oKX19LGRvQWZ0ZXJPcGVuOmZ1bmN0aW9uKCl7dGhpcy5fb3BlbmluZz0hMX0sY2xvc2U6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKCF0aGlzLndpbGxDbG9zZXx8dGhpcy53aWxsQ2xvc2UoKSl7bnVsbCE9PXRoaXMuX29wZW5UaW1lciYmKGNsZWFyVGltZW91dCh0aGlzLl9vcGVuVGltZXIpLHRoaXMuX29wZW5UaW1lcj1udWxsKSxjbGVhclRpbWVvdXQodGhpcy5fY2xvc2VUaW1lcik7dmFyIHQ9TnVtYmVyKHRoaXMuY2xvc2VEZWxheSk7dD4wP3RoaXMuX2Nsb3NlVGltZXI9c2V0VGltZW91dChmdW5jdGlvbigpe2UuX2Nsb3NlVGltZXI9bnVsbCxlLmRvQ2xvc2UoKX0sdCk6dGhpcy5kb0Nsb3NlKCl9fSxkb0Nsb3NlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLnZpc2libGU9ITEsdGhpcy4kZW1pdCgiaW5wdXQiLCExKSx0aGlzLl9jbG9zaW5nPSEwLHRoaXMub25DbG9zZSYmdGhpcy5vbkNsb3NlKCksdGhpcy5sb2NrU2Nyb2xsJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tb2RhbCYmImhpZGRlbiIhPT1lLmJvZHlPdmVyZmxvdyYmKGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3c9ZS5ib2R5T3ZlcmZsb3csZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ9ZS5ib2R5UGFkZGluZ1JpZ2h0KSxlLmJvZHlPdmVyZmxvdz1udWxsLGUuYm9keVBhZGRpbmdSaWdodD1udWxsfSwyMDApLHRoaXMub3BlbmVkPSExLHRoaXMudHJhbnNpdGlvbnx8dGhpcy5kb0FmdGVyQ2xvc2UoKX0sZG9BZnRlckNsb3NlOmZ1bmN0aW9uKCl7bFsiZGVmYXVsdCJdLmNsb3NlTW9kYWwodGhpcy5fcG9wdXBJZCksdGhpcy5fY2xvc2luZz0hMX19fSx0LlBvcHVwTWFuYWdlcj1sWyJkZWZhdWx0Il19LGZ1bmN0aW9uKGUsdCl7dmFyIG49ZnVuY3Rpb24oZSl7cmV0dXJuKGV8fCIiKS5yZXBsYWNlKC9eW1xzXHVGRUZGXSt8W1xzXHVGRUZGXSskL2csIiIpfSxpPWZ1bmN0aW9uKGUsdCl7aWYoIWV8fCF0KXJldHVybiExO2lmKHQuaW5kZXhPZigiICIpIT0tMSl0aHJvdyBuZXcgRXJyb3IoImNsYXNzTmFtZSBzaG91bGQgbm90IGNvbnRhaW4gc3BhY2UuIik7cmV0dXJuIGUuY2xhc3NMaXN0P2UuY2xhc3NMaXN0LmNvbnRhaW5zKHQpOigiICIrZS5jbGFzc05hbWUrIiAiKS5pbmRleE9mKCIgIit0KyIgIik+LTF9LHM9ZnVuY3Rpb24oZSx0KXtpZihlKXtmb3IodmFyIG49ZS5jbGFzc05hbWUscz0odHx8IiIpLnNwbGl0KCIgIiksbz0wLGE9cy5sZW5ndGg7bzxhO28rKyl7dmFyIHI9c1tvXTtyJiYoZS5jbGFzc0xpc3Q/ZS5jbGFzc0xpc3QuYWRkKHIpOmkoZSxyKXx8KG4rPSIgIityKSl9ZS5jbGFzc0xpc3R8fChlLmNsYXNzTmFtZT1uKX19LG89ZnVuY3Rpb24oZSx0KXtpZihlJiZ0KXtmb3IodmFyIHM9dC5zcGxpdCgiICIpLG89IiAiK2UuY2xhc3NOYW1lKyIgIixhPTAscj1zLmxlbmd0aDthPHI7YSsrKXt2YXIgbD1zW2FdO2wmJihlLmNsYXNzTGlzdD9lLmNsYXNzTGlzdC5yZW1vdmUobCk6aShlLGwpJiYobz1vLnJlcGxhY2UoIiAiK2wrIiAiLCIgIikpKX1lLmNsYXNzTGlzdHx8KGUuY2xhc3NOYW1lPW4obykpfX07ZS5leHBvcnRzPXtoYXNDbGFzczppLGFkZENsYXNzOnMscmVtb3ZlQ2xhc3M6b319LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dC5fX2VzTW9kdWxlPSEwO3ZhciBpPW4oMSkscz0hMSxvPWZ1bmN0aW9uKCl7dmFyIGU9ci5tb2RhbERvbTtyZXR1cm4gZT9zPSEwOihzPSExLGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iiksci5tb2RhbERvbT1lLGUuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCksZS5zdG9wUHJvcGFnYXRpb24oKX0pLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7ci5kb09uTW9kYWxDbGljayYmci5kb09uTW9kYWxDbGljaygpfSkpLGV9LGE9e30scj17ekluZGV4OjJlMyxtb2RhbEZhZGU6ITAsZ2V0SW5zdGFuY2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGFbZV19LHJlZ2lzdGVyOmZ1bmN0aW9uKGUsdCl7ZSYmdCYmKGFbZV09dCl9LGRlcmVnaXN0ZXI6ZnVuY3Rpb24oZSl7ZSYmKGFbZV09bnVsbCxkZWxldGUgYVtlXSl9LG5leHRaSW5kZXg6ZnVuY3Rpb24oKXtyZXR1cm4gci56SW5kZXgrK30sbW9kYWxTdGFjazpbXSxkb09uTW9kYWxDbGljazpmdW5jdGlvbigpe3ZhciBlPXIubW9kYWxTdGFja1tyLm1vZGFsU3RhY2subGVuZ3RoLTFdO2lmKGUpe3ZhciB0PXIuZ2V0SW5zdGFuY2UoZS5pZCk7dCYmdC5jbG9zZU9uQ2xpY2tNb2RhbCYmdC5jbG9zZSgpfX0sb3Blbk1vZGFsOmZ1bmN0aW9uKGUsdCxuLGEscil7aWYoZSYmdm9pZCAwIT09dCl7dGhpcy5tb2RhbEZhZGU9cjtmb3IodmFyIGw9dGhpcy5tb2RhbFN0YWNrLHU9MCxkPWwubGVuZ3RoO3U8ZDt1Kyspe3ZhciBjPWxbdV07aWYoYy5pZD09PWUpcmV0dXJufXZhciBmPW8oKTtpZigoMCxpLmFkZENsYXNzKShmLCJ2LW1vZGFsIiksdGhpcy5tb2RhbEZhZGUmJiFzJiYoMCxpLmFkZENsYXNzKShmLCJ2LW1vZGFsLWVudGVyIiksYSl7dmFyIGg9YS50cmltKCkuc3BsaXQoL1xzKy8pO2guZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4oMCxpLmFkZENsYXNzKShmLGUpfSl9c2V0VGltZW91dChmdW5jdGlvbigpeygwLGkucmVtb3ZlQ2xhc3MpKGYsInYtbW9kYWwtZW50ZXIiKX0sMjAwKSxuJiZuLnBhcmVudE5vZGUmJjExIT09bi5wYXJlbnROb2RlLm5vZGVUeXBlP24ucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChmKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpLHQmJihmLnN0eWxlLnpJbmRleD10KSxmLnN0eWxlLmRpc3BsYXk9IiIsdGhpcy5tb2RhbFN0YWNrLnB1c2goe2lkOmUsekluZGV4OnQsbW9kYWxDbGFzczphfSl9fSxjbG9zZU1vZGFsOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMubW9kYWxTdGFjayxuPW8oKTtpZih0Lmxlbmd0aD4wKXt2YXIgcz10W3QubGVuZ3RoLTFdO2lmKHMuaWQ9PT1lKXtpZihzLm1vZGFsQ2xhc3Mpe3ZhciBhPXMubW9kYWxDbGFzcy50cmltKCkuc3BsaXQoL1xzKy8pO2EuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4oMCxpLnJlbW92ZUNsYXNzKShuLGUpfSl9dC5wb3AoKSx0Lmxlbmd0aD4wJiYobi5zdHlsZS56SW5kZXg9dFt0Lmxlbmd0aC0xXS56SW5kZXgpfWVsc2UgZm9yKHZhciBsPXQubGVuZ3RoLTE7bD49MDtsLS0paWYodFtsXS5pZD09PWUpe3Quc3BsaWNlKGwsMSk7YnJlYWt9fTA9PT10Lmxlbmd0aCYmKHRoaXMubW9kYWxGYWRlJiYoMCxpLmFkZENsYXNzKShuLCJ2LW1vZGFsLWxlYXZlIiksc2V0VGltZW91dChmdW5jdGlvbigpezA9PT10Lmxlbmd0aCYmKG4ucGFyZW50Tm9kZSYmbi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG4pLG4uc3R5bGUuZGlzcGxheT0ibm9uZSIsci5tb2RhbERvbT12b2lkIDApLCgwLGkucmVtb3ZlQ2xhc3MpKG4sInYtbW9kYWwtbGVhdmUiKX0sMjAwKSl9fTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oZSl7aWYoMjc9PT1lLmtleUNvZGUmJnIubW9kYWxTdGFjay5sZW5ndGg+MCl7dmFyIHQ9ci5tb2RhbFN0YWNrW3IubW9kYWxTdGFjay5sZW5ndGgtMV07aWYoIXQpcmV0dXJuO3ZhciBuPXIuZ2V0SW5zdGFuY2UodC5pZCk7bi5jbG9zZU9uUHJlc3NFc2NhcGUmJm4uY2xvc2UoKX19KSx0WyJkZWZhdWx0Il09cn0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlKXtmb3IodmFyIHQ9MSxuPWFyZ3VtZW50cy5sZW5ndGg7dDxuO3QrKyl7dmFyIGk9YXJndW1lbnRzW3RdO2Zvcih2YXIgcyBpbiBpKWlmKGkuaGFzT3duUHJvcGVydHkocykpe3ZhciBvPWlbc107dm9pZCAwIT09byYmKGVbc109byl9fXJldHVybiBlfXQuX19lc01vZHVsZT0hMCx0Lm1lcmdlPW59LGZ1bmN0aW9uKGUsdCl7fSxmdW5jdGlvbih0LG4pe3QuZXhwb3J0cz1lfSxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW4oMCl9XSl9KX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1lLiRjcmVhdGVFbGVtZW50O2UuX2M7cmV0dXJuIHQoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1zZWxlY3QtZHJvcGRvd24iLCJjbGFzcyI6eyJpcy1tdWx0aXBsZSI6ZS4kcGFyZW50Lm11bHRpcGxlfSxzdHlsZTp7bWluV2lkdGg6ZS5taW5XaWR0aH19LFtlLl90KCJkZWZhdWx0IildKX0sc3RhdGljUmVuZGVyRm5zOltdfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciBpLHM7aT1uKDI5KTt2YXIgbz1uKDMwKTtzPWk9aXx8e30sIm9iamVjdCIhPXR5cGVvZiBpWyJkZWZhdWx0Il0mJiJmdW5jdGlvbiIhPXR5cGVvZiBpWyJkZWZhdWx0Il18fChzPWk9aVsiZGVmYXVsdCJdKSwiZnVuY3Rpb24iPT10eXBlb2YgcyYmKHM9cy5vcHRpb25zKSxzLnJlbmRlcj1vLnJlbmRlcixzLnN0YXRpY1JlbmRlckZucz1vLnN0YXRpY1JlbmRlckZucyxlLmV4cG9ydHM9aX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fXQuX19lc01vZHVsZT0hMDt2YXIgcz1uKDEwKSxvPWkocyk7dFsiZGVmYXVsdCJdPXttaXhpbnM6W29bImRlZmF1bHQiXV0sbmFtZToiZWwtb3B0aW9uIixjb21wb25lbnROYW1lOiJFbE9wdGlvbiIscHJvcHM6e3ZhbHVlOntyZXF1aXJlZDohMH0sbGFiZWw6W1N0cmluZyxOdW1iZXJdLHNlbGVjdGVkOnt0eXBlOkJvb2xlYW4sImRlZmF1bHQiOiExfSxjcmVhdGVkOkJvb2xlYW4sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbiwiZGVmYXVsdCI6ITF9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue2luZGV4Oi0xLGdyb3VwRGlzYWJsZWQ6ITEsdmlzaWJsZTohMCxoaXRTdGF0ZTohMX19LGNvbXB1dGVkOntjdXJyZW50TGFiZWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYWJlbHx8KCJzdHJpbmciPT10eXBlb2YgdGhpcy52YWx1ZXx8Im51bWJlciI9PXR5cGVvZiB0aGlzLnZhbHVlP3RoaXMudmFsdWU6IiIpfSxjdXJyZW50VmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZXx8dGhpcy5sYWJlbHx8IiJ9LHBhcmVudDpmdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLiRwYXJlbnQ7IWUuaXNTZWxlY3Q7KWU9ZS4kcGFyZW50O3JldHVybiBlfSxpdGVtU2VsZWN0ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQubXVsdGlwbGU/dGhpcy5wYXJlbnQudmFsdWUuaW5kZXhPZih0aGlzLnZhbHVlKT4tMTp0aGlzLnZhbHVlPT09dGhpcy5wYXJlbnQudmFsdWV9LGxpbWl0UmVhY2hlZDpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5wYXJlbnQubXVsdGlwbGUmJighdGhpcy5pdGVtU2VsZWN0ZWQmJnRoaXMucGFyZW50LnZhbHVlLmxlbmd0aD49dGhpcy5wYXJlbnQubXVsdGlwbGVMaW1pdCYmdGhpcy5wYXJlbnQubXVsdGlwbGVMaW1pdD4wKX19LG1ldGhvZHM6e2hhbmRsZUdyb3VwRGlzYWJsZWQ6ZnVuY3Rpb24oZSl7dGhpcy5ncm91cERpc2FibGVkPWV9LGhvdmVySXRlbTpmdW5jdGlvbigpe3RoaXMuZGlzYWJsZWR8fHRoaXMuZ3JvdXBEaXNhYmxlZHx8KHRoaXMucGFyZW50LmhvdmVySW5kZXg9dGhpcy5wYXJlbnQub3B0aW9ucy5pbmRleE9mKHRoaXMpKX0sc2VsZWN0T3B0aW9uQ2xpY2s6ZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkIT09ITAmJnRoaXMuZ3JvdXBEaXNhYmxlZCE9PSEwJiZ0aGlzLmRpc3BhdGNoKCJFbFNlbGVjdCIsImhhbmRsZU9wdGlvbkNsaWNrIix0aGlzKX0scXVlcnlDaGFuZ2U6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKC8oXF58XCh8XCl8XFt8XF18XCR8XCp8XCt8XC58XD98XFx8XHt8XH18XHwpL2csIlxcJDEiKTt0aGlzLnZpc2libGU9bmV3IFJlZ0V4cCh0LCJpIikudGVzdCh0aGlzLmN1cnJlbnRMYWJlbCl8fHRoaXMuY3JlYXRlZCx0aGlzLnZpc2libGV8fHRoaXMucGFyZW50LmZpbHRlcmVkT3B0aW9uc0NvdW50LS19LHJlc2V0SW5kZXg6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuJG5leHRUaWNrKGZ1bmN0aW9uKCl7ZS5pbmRleD1lLnBhcmVudC5vcHRpb25zLmluZGV4T2YoZSl9KX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLnBhcmVudC5vcHRpb25zLnB1c2godGhpcyksdGhpcy5wYXJlbnQuY2FjaGVkT3B0aW9ucy5wdXNoKHRoaXMpLHRoaXMucGFyZW50Lm9wdGlvbnNDb3VudCsrLHRoaXMucGFyZW50LmZpbHRlcmVkT3B0aW9uc0NvdW50KyssdGhpcy5pbmRleD10aGlzLnBhcmVudC5vcHRpb25zLmluZGV4T2YodGhpcyksdGhpcy4kb24oInF1ZXJ5Q2hhbmdlIix0aGlzLnF1ZXJ5Q2hhbmdlKSx0aGlzLiRvbigiaGFuZGxlR3JvdXBEaXNhYmxlZCIsdGhpcy5oYW5kbGVHcm91cERpc2FibGVkKSx0aGlzLiRvbigicmVzZXRJbmRleCIsdGhpcy5yZXNldEluZGV4KX0sYmVmb3JlRGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZGlzcGF0Y2goIkVsU2VsZWN0Iiwib25PcHRpb25EZXN0cm95Iix0aGlzKX19fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWUuJGNyZWF0ZUVsZW1lbnQ7ZS5fYztyZXR1cm4gdCgibGkiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTplLnZpc2libGUsZXhwcmVzc2lvbjoidmlzaWJsZSJ9XSxzdGF0aWNDbGFzczoiZWwtc2VsZWN0LWRyb3Bkb3duX19pdGVtIiwiY2xhc3MiOntzZWxlY3RlZDplLml0ZW1TZWxlY3RlZCwiaXMtZGlzYWJsZWQiOmUuZGlzYWJsZWR8fGUuZ3JvdXBEaXNhYmxlZHx8ZS5saW1pdFJlYWNoZWQsaG92ZXI6ZS5wYXJlbnQuaG92ZXJJbmRleD09PWUuaW5kZXh9LG9uOnttb3VzZWVudGVyOmUuaG92ZXJJdGVtLGNsaWNrOmZ1bmN0aW9uKHQpe3Quc3RvcFByb3BhZ2F0aW9uKCksZS5zZWxlY3RPcHRpb25DbGljayh0KX19fSxbZS5fdCgiZGVmYXVsdCIsW3QoInNwYW4iLFtlLl9zKGUuY3VycmVudExhYmVsKV0pXSldKX0sc3RhdGljUmVuZGVyRm5zOltdfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fXQuX19lc01vZHVsZT0hMDt2YXIgcz1uKDMyKSxvPWkocyk7b1siZGVmYXVsdCJdLmluc3RhbGw9ZnVuY3Rpb24oZSl7ZS5jb21wb25lbnQob1siZGVmYXVsdCJdLm5hbWUsb1siZGVmYXVsdCJdKX0sdFsiZGVmYXVsdCJdPW9bImRlZmF1bHQiXX0sZnVuY3Rpb24oZSx0LG4pe3ZhciBpLHM7aT1uKDMzKTt2YXIgbz1uKDM0KTtzPWk9aXx8e30sIm9iamVjdCIhPXR5cGVvZiBpWyJkZWZhdWx0Il0mJiJmdW5jdGlvbiIhPXR5cGVvZiBpWyJkZWZhdWx0Il18fChzPWk9aVsiZGVmYXVsdCJdKSwiZnVuY3Rpb24iPT10eXBlb2YgcyYmKHM9cy5vcHRpb25zKSxzLnJlbmRlcj1vLnJlbmRlcixzLnN0YXRpY1JlbmRlckZucz1vLnN0YXRpY1JlbmRlckZucyxlLmV4cG9ydHM9aX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7dC5fX2VzTW9kdWxlPSEwLHRbImRlZmF1bHQiXT17bmFtZToiRWxUYWciLHByb3BzOnt0ZXh0OlN0cmluZyxjbG9zYWJsZTpCb29sZWFuLHR5cGU6U3RyaW5nLGhpdDpCb29sZWFuLGNsb3NlVHJhbnNpdGlvbjpCb29sZWFuLGNvbG9yOlN0cmluZ30sbWV0aG9kczp7aGFuZGxlQ2xvc2U6ZnVuY3Rpb24oZSl7dGhpcy4kZW1pdCgiY2xvc2UiLGUpfX19fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWUuJGNyZWF0ZUVsZW1lbnQ7ZS5fYztyZXR1cm4gdCgidHJhbnNpdGlvbiIse2F0dHJzOntuYW1lOmUuY2xvc2VUcmFuc2l0aW9uPyIiOiJlbC16b29tLWluLWNlbnRlciJ9fSxbdCgic3BhbiIse3N0YXRpY0NsYXNzOiJlbC10YWciLCJjbGFzcyI6W2UudHlwZT8iZWwtdGFnLS0iK2UudHlwZToiIix7ImlzLWhpdCI6ZS5oaXR9XSxzdHlsZTp7YmFja2dyb3VuZENvbG9yOmUuY29sb3J9fSxbZS5fdCgiZGVmYXVsdCIpLGUuY2xvc2FibGU/dCgiaSIse3N0YXRpY0NsYXNzOiJlbC10YWdfX2Nsb3NlIGVsLWljb24tY2xvc2UiLG9uOntjbGljazplLmhhbmRsZUNsb3NlfX0pOmUuX2UoKV0pXSl9LHN0YXRpY1JlbmRlckZuczpbXX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1uKDM2KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2b2lkIDA9PT1uP2koZSx0LCExKTppKGUsbix0IT09ITEpfX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4saSl7ZnVuY3Rpb24gcygpe2Z1bmN0aW9uIHMoKXthPU51bWJlcihuZXcgRGF0ZSksbi5hcHBseShsLGQpfWZ1bmN0aW9uIHIoKXtvPXZvaWQgMH12YXIgbD10aGlzLHU9TnVtYmVyKG5ldyBEYXRlKS1hLGQ9YXJndW1lbnRzO2kmJiFvJiZzKCksbyYmY2xlYXJUaW1lb3V0KG8pLHZvaWQgMD09PWkmJnU+ZT9zKCk6dCE9PSEwJiYobz1zZXRUaW1lb3V0KGk/cjpzLHZvaWQgMD09PWk/ZS11OmUpKX12YXIgbyxhPTA7cmV0dXJuImJvb2xlYW4iIT10eXBlb2YgdCYmKGk9bixuPXQsdD12b2lkIDApLHN9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3QuX19lc01vZHVsZT0hMDt2YXIgaT1uKDM4KSxzPVtdLG89IkBAY2xpY2tvdXRzaWRlQ29udGV4dCI7KDAsaS5vbikoZG9jdW1lbnQsImNsaWNrIixmdW5jdGlvbihlKXtzLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIHRbb10uZG9jdW1lbnRIYW5kbGVyKGUpfSl9KSx0WyJkZWZhdWx0Il09e2JpbmQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXMucHVzaChlKS0xLGE9ZnVuY3Rpb24oaSl7IW4uY29udGV4dHx8ZS5jb250YWlucyhpLnRhcmdldCl8fG4uY29udGV4dC5wb3BwZXJFbG0mJm4uY29udGV4dC5wb3BwZXJFbG0uY29udGFpbnMoaS50YXJnZXQpfHwodC5leHByZXNzaW9uP2Vbb10ubWV0aG9kTmFtZSYmbi5jb250ZXh0W2Vbb10ubWV0aG9kTmFtZV0mJm4uY29udGV4dFtlW29dLm1ldGhvZE5hbWVdKCk6ZVtvXS5iaW5kaW5nRm4mJmVbb10uYmluZGluZ0ZuKCkpfTtlW29dPXtpZDppLGRvY3VtZW50SGFuZGxlcjphLG1ldGhvZE5hbWU6dC5leHByZXNzaW9uLGJpbmRpbmdGbjp0LnZhbHVlfX0sdXBkYXRlOmZ1bmN0aW9uKGUsdCl7ZVtvXS5tZXRob2ROYW1lPXQuZXhwcmVzc2lvbixlW29dLmJpbmRpbmdGbj10LnZhbHVlfSx1bmJpbmQ6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXMubGVuZ3RoLG49MDtuPHQ7bisrKWlmKHNbbl1bb10uaWQ9PT1lW29dLmlkKXtzLnNwbGljZShuLDEpO2JyZWFrfX19fSxmdW5jdGlvbihlLHQpe3ZhciBuPWZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oZSx0LG4pe2UmJnQmJm4mJmUuYWRkRXZlbnRMaXN0ZW5lcih0LG4sITEpfTpmdW5jdGlvbihlLHQsbil7ZSYmdCYmbiYmZS5hdHRhY2hFdmVudCgib24iK3Qsbil9fSgpLGk9ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcj9mdW5jdGlvbihlLHQsbil7ZSYmdCYmZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiwhMSl9OmZ1bmN0aW9uKGUsdCxuKXtlJiZ0JiZlLmRldGFjaEV2ZW50KCJvbiIrdCxuKX19KCkscz1mdW5jdGlvbihlLHQscyl7dmFyIG89ZnVuY3Rpb24oKXtzJiZzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxpKGUsdCxvKX07bihlLHQsbyl9O2UuZXhwb3J0cz17b246bixvZmY6aSxvbmNlOnN9fSxmdW5jdGlvbihlLHQpe3ZhciBuPWZ1bmN0aW9uKGUpe3JldHVybihlfHwiIikucmVwbGFjZSgvXltcc1x1RkVGRl0rfFtcc1x1RkVGRl0rJC9nLCIiKX0saT1mdW5jdGlvbihlLHQpe2lmKCFlfHwhdClyZXR1cm4hMTtpZih0LmluZGV4T2YoIiAiKSE9LTEpdGhyb3cgbmV3IEVycm9yKCJjbGFzc05hbWUgc2hvdWxkIG5vdCBjb250YWluIHNwYWNlLiIpO3JldHVybiBlLmNsYXNzTGlzdD9lLmNsYXNzTGlzdC5jb250YWlucyh0KTooIiAiK2UuY2xhc3NOYW1lKyIgIikuaW5kZXhPZigiICIrdCsiICIpPi0xfSxzPWZ1bmN0aW9uKGUsdCl7aWYoZSl7Zm9yKHZhciBuPWUuY2xhc3NOYW1lLHM9KHR8fCIiKS5zcGxpdCgiICIpLG89MCxhPXMubGVuZ3RoO288YTtvKyspe3ZhciByPXNbb107ciYmKGUuY2xhc3NMaXN0P2UuY2xhc3NMaXN0LmFkZChyKTppKGUscil8fChuKz0iICIrcikpfWUuY2xhc3NMaXN0fHwoZS5jbGFzc05hbWU9bil9fSxvPWZ1bmN0aW9uKGUsdCl7aWYoZSYmdCl7Zm9yKHZhciBzPXQuc3BsaXQoIiAiKSxvPSIgIitlLmNsYXNzTmFtZSsiICIsYT0wLHI9cy5sZW5ndGg7YTxyO2ErKyl7dmFyIGw9c1thXTtsJiYoZS5jbGFzc0xpc3Q/ZS5jbGFzc0xpc3QucmVtb3ZlKGwpOmkoZSxsKSYmKG89by5yZXBsYWNlKCIgIitsKyIgIiwiICIpKSl9ZS5jbGFzc0xpc3R8fChlLmNsYXNzTmFtZT1uKG8pKX19O2UuZXhwb3J0cz17aGFzQ2xhc3M6aSxhZGRDbGFzczpzLHJlbW92ZUNsYXNzOm99fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0Ijt0Ll9fZXNNb2R1bGU9ITA7dmFyIG49ZnVuY3Rpb24oKXt2YXIgZT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHxmdW5jdGlvbihlKXtyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZSwyMCl9O3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZSh0KX19KCksaT1mdW5jdGlvbigpe3ZhciBlPXdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZXx8d2luZG93Lm1vekNhbmNlbEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cud2Via2l0Q2FuY2VsQW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5jbGVhclRpbWVvdXQ7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlKHQpfX0oKSxzPWZ1bmN0aW9uKGUpe3ZhciB0PWUuX19yZXNpemVUcmlnZ2VyX18sbj10LmZpcnN0RWxlbWVudENoaWxkLGk9dC5sYXN0RWxlbWVudENoaWxkLHM9bi5maXJzdEVsZW1lbnRDaGlsZDtpLnNjcm9sbExlZnQ9aS5zY3JvbGxXaWR0aCxpLnNjcm9sbFRvcD1pLnNjcm9sbEhlaWdodCxzLnN0eWxlLndpZHRoPW4ub2Zmc2V0V2lkdGgrMSsicHgiLHMuc3R5bGUuaGVpZ2h0PW4ub2Zmc2V0SGVpZ2h0KzErInB4IixuLnNjcm9sbExlZnQ9bi5zY3JvbGxXaWR0aCxuLnNjcm9sbFRvcD1uLnNjcm9sbEhlaWdodH0sbz1mdW5jdGlvbihlKXtyZXR1cm4gZS5vZmZzZXRXaWR0aCE9PWUuX19yZXNpemVMYXN0X18ud2lkdGh8fGUub2Zmc2V0SGVpZ2h0IT09ZS5fX3Jlc2l6ZUxhc3RfXy5oZWlnaHR9LGE9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztzKHRoaXMpLHRoaXMuX19yZXNpemVSQUZfXyYmaSh0aGlzLl9fcmVzaXplUkFGX18pLHRoaXMuX19yZXNpemVSQUZfXz1uKGZ1bmN0aW9uKCl7byh0KSYmKHQuX19yZXNpemVMYXN0X18ud2lkdGg9dC5vZmZzZXRXaWR0aCx0Ll9fcmVzaXplTGFzdF9fLmhlaWdodD10Lm9mZnNldEhlaWdodCx0Ll9fcmVzaXplTGlzdGVuZXJzX18uZm9yRWFjaChmdW5jdGlvbihuKXtuLmNhbGwodCxlKX0pKX0pfSxyPWRvY3VtZW50LmF0dGFjaEV2ZW50LGw9IldlYmtpdCBNb3ogTyBtcyIuc3BsaXQoIiAiKSx1PSJ3ZWJraXRBbmltYXRpb25TdGFydCBhbmltYXRpb25zdGFydCBvQW5pbWF0aW9uU3RhcnQgTVNBbmltYXRpb25TdGFydCIuc3BsaXQoIiAiKSxkPSJyZXNpemVhbmltIixjPSExLGY9IiIsaD0iYW5pbWF0aW9uc3RhcnQiO2lmKCFyKXt2YXIgcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJmYWtlZWxlbWVudCIpO2lmKHZvaWQgMCE9PXAuc3R5bGUuYW5pbWF0aW9uTmFtZSYmKGM9ITApLGM9PT0hMSlmb3IodmFyIG09IiIsZz0wO2c8bC5sZW5ndGg7ZysrKWlmKHZvaWQgMCE9PXAuc3R5bGVbbFtnXSsiQW5pbWF0aW9uTmFtZSJdKXttPWxbZ10sZj0iLSIrbS50b0xvd2VyQ2FzZSgpKyItIixoPXVbZ10sYz0hMDticmVha319dmFyIHY9ITEseT1mdW5jdGlvbigpe2lmKCF2KXt2YXIgZT0iQCIrZisia2V5ZnJhbWVzICIrZCsiIHsgZnJvbSB7IG9wYWNpdHk6IDA7IH0gdG8geyBvcGFjaXR5OiAwOyB9IH0gIix0PWYrImFuaW1hdGlvbjogMW1zICIrZCsiOyIsbj1lKyJcbiAgICAgIC5yZXNpemUtdHJpZ2dlcnMgeyAiK3QrJyB2aXNpYmlsaXR5OiBoaWRkZW47IG9wYWNpdHk6IDA7IH1cbiAgICAgIC5yZXNpemUtdHJpZ2dlcnMsIC5yZXNpemUtdHJpZ2dlcnMgPiBkaXYsIC5jb250cmFjdC10cmlnZ2VyOmJlZm9yZSB7IGNvbnRlbnQ6ICIgIjsgZGlzcGxheTogYmxvY2s7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyBoZWlnaHQ6IDEwMCU7IHdpZHRoOiAxMDAlOyBvdmVyZmxvdzogaGlkZGVuOyB9XG4gICAgICAucmVzaXplLXRyaWdnZXJzID4gZGl2IHsgYmFja2dyb3VuZDogI2VlZTsgb3ZlcmZsb3c6IGF1dG87IH1cbiAgICAgIC5jb250cmFjdC10cmlnZ2VyOmJlZm9yZSB7IHdpZHRoOiAyMDAlOyBoZWlnaHQ6IDIwMCU7IH0nLGk9ZG9jdW1lbnQuaGVhZHx8ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXSxzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CnMudHlwZT0idGV4dC9jc3MiLHMuc3R5bGVTaGVldD9zLnN0eWxlU2hlZXQuY3NzVGV4dD1uOnMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobikpLGkuYXBwZW5kQ2hpbGQocyksdj0hMH19O3QuYWRkUmVzaXplTGlzdGVuZXI9ZnVuY3Rpb24oZSx0KXtpZihyKWUuYXR0YWNoRXZlbnQoIm9ucmVzaXplIix0KTtlbHNle2lmKCFlLl9fcmVzaXplVHJpZ2dlcl9fKXsic3RhdGljIj09PWdldENvbXB1dGVkU3R5bGUoZSkucG9zaXRpb24mJihlLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpLHkoKSxlLl9fcmVzaXplTGFzdF9fPXt9LGUuX19yZXNpemVMaXN0ZW5lcnNfXz1bXTt2YXIgbj1lLl9fcmVzaXplVHJpZ2dlcl9fPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO24uY2xhc3NOYW1lPSJyZXNpemUtdHJpZ2dlcnMiLG4uaW5uZXJIVE1MPSc8ZGl2IGNsYXNzPSJleHBhbmQtdHJpZ2dlciI+PGRpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJjb250cmFjdC10cmlnZ2VyIj48L2Rpdj4nLGUuYXBwZW5kQ2hpbGQobikscyhlKSxlLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsYSwhMCksaCYmbi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24odCl7dC5hbmltYXRpb25OYW1lPT09ZCYmcyhlKX0pfWUuX19yZXNpemVMaXN0ZW5lcnNfXy5wdXNoKHQpfX0sdC5yZW1vdmVSZXNpemVMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3I/ZS5kZXRhY2hFdmVudCgib25yZXNpemUiLHQpOihlLl9fcmVzaXplTGlzdGVuZXJzX18uc3BsaWNlKGUuX19yZXNpemVMaXN0ZW5lcnNfXy5pbmRleE9mKHQpLDEpLGUuX19yZXNpemVMaXN0ZW5lcnNfXy5sZW5ndGh8fChlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsYSksZS5fX3Jlc2l6ZVRyaWdnZXJfXz0hZS5yZW1vdmVDaGlsZChlLl9fcmVzaXplVHJpZ2dlcl9fKSkpfX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1lLiRjcmVhdGVFbGVtZW50O2UuX2M7cmV0dXJuIHQoImRpdiIse2RpcmVjdGl2ZXM6W3tuYW1lOiJjbGlja291dHNpZGUiLHJhd05hbWU6InYtY2xpY2tvdXRzaWRlIix2YWx1ZTplLmhhbmRsZUNsb3NlLGV4cHJlc3Npb246ImhhbmRsZUNsb3NlIn1dLHN0YXRpY0NsYXNzOiJlbC1zZWxlY3QifSxbZS5tdWx0aXBsZT90KCJkaXYiLHtyZWY6InRhZ3MiLHN0YXRpY0NsYXNzOiJlbC1zZWxlY3RfX3RhZ3MiLHN0eWxlOnsibWF4LXdpZHRoIjplLmlucHV0V2lkdGgtMzIrInB4In0sb246e2NsaWNrOmZ1bmN0aW9uKHQpe3Quc3RvcFByb3BhZ2F0aW9uKCksZS50b2dnbGVNZW51KHQpfX19LFt0KCJ0cmFuc2l0aW9uLWdyb3VwIix7b246eyJhZnRlci1sZWF2ZSI6ZS5yZXNldElucHV0SGVpZ2h0fX0sW2UuX2woZS5zZWxlY3RlZCxmdW5jdGlvbihuKXtyZXR1cm4gdCgiZWwtdGFnIix7a2V5Om4udmFsdWUsYXR0cnM6e2Nsb3NhYmxlOiIiLGhpdDpuLmhpdFN0YXRlLHR5cGU6InByaW1hcnkiLCJjbG9zZS10cmFuc2l0aW9uIjoiIn0sb246e2Nsb3NlOmZ1bmN0aW9uKHQpe2UuZGVsZXRlVGFnKHQsbil9fX0sWyJcbiAgICAgICAgIitlLl9zKG4uY3VycmVudExhYmVsKSsiXG4gICAgICAiXSl9KV0pLGUuZmlsdGVyYWJsZT90KCJpbnB1dCIse2RpcmVjdGl2ZXM6W3tuYW1lOiJtb2RlbCIscmF3TmFtZToidi1tb2RlbCIsdmFsdWU6ZS5xdWVyeSxleHByZXNzaW9uOiJxdWVyeSJ9XSxyZWY6ImlucHV0IixzdGF0aWNDbGFzczoiZWwtc2VsZWN0X19pbnB1dCIsImNsYXNzIjoiaXMtIitlLnNpemUsc3R5bGU6e3dpZHRoOmUuaW5wdXRMZW5ndGgrInB4IiwibWF4LXdpZHRoIjplLmlucHV0V2lkdGgtNDIrInB4In0sYXR0cnM6e3R5cGU6InRleHQiLGRlYm91bmNlOmUucmVtb3RlPzMwMDowfSxkb21Qcm9wczp7dmFsdWU6ZS5fcyhlLnF1ZXJ5KX0sb246e2ZvY3VzOmZ1bmN0aW9uKHQpe2UudmlzaWJsZT0hMH0sa2V5dXA6ZS5tYW5hZ2VQbGFjZWhvbGRlcixrZXlkb3duOltlLnJlc2V0SW5wdXRTdGF0ZSxmdW5jdGlvbih0KXs0MD09PXQua2V5Q29kZSYmKHQucHJldmVudERlZmF1bHQoKSxlLm5hdmlnYXRlT3B0aW9ucygibmV4dCIpKX0sZnVuY3Rpb24odCl7Mzg9PT10LmtleUNvZGUmJih0LnByZXZlbnREZWZhdWx0KCksZS5uYXZpZ2F0ZU9wdGlvbnMoInByZXYiKSl9LGZ1bmN0aW9uKHQpezEzPT09dC5rZXlDb2RlJiYodC5wcmV2ZW50RGVmYXVsdCgpLGUuc2VsZWN0T3B0aW9uKHQpKX0sZnVuY3Rpb24odCl7Mjc9PT10LmtleUNvZGUmJih0LnByZXZlbnREZWZhdWx0KCksZS52aXNpYmxlPSExKX0sZnVuY3Rpb24odCl7OCE9PXQua2V5Q29kZSYmNDYhPT10LmtleUNvZGV8fGUuZGVsZXRlUHJldlRhZyh0KX1dLGlucHV0OmZ1bmN0aW9uKHQpe3QudGFyZ2V0LmNvbXBvc2luZ3x8KGUucXVlcnk9dC50YXJnZXQudmFsdWUpfX19KTplLl9lKCldKTplLl9lKCksdCgiZWwtaW5wdXQiLHtkaXJlY3RpdmVzOlt7bmFtZToibW9kZWwiLHJhd05hbWU6InYtbW9kZWwiLHZhbHVlOmUuc2VsZWN0ZWRMYWJlbCxleHByZXNzaW9uOiJzZWxlY3RlZExhYmVsIn1dLHJlZjoicmVmZXJlbmNlIixhdHRyczp7dHlwZToidGV4dCIscGxhY2Vob2xkZXI6ZS5jdXJyZW50UGxhY2Vob2xkZXIsbmFtZTplLm5hbWUsc2l6ZTplLnNpemUsZGlzYWJsZWQ6ZS5kaXNhYmxlZCxyZWFkb25seTohZS5maWx0ZXJhYmxlfHxlLm11bHRpcGxlLGljb246ZS5pY29uQ2xhc3N9LGRvbVByb3BzOnt2YWx1ZTplLnNlbGVjdGVkTGFiZWx9LG9uOntmb2N1czplLnRvZ2dsZU1lbnUsY2xpY2s6ZS5oYW5kbGVJY29uQ2xpY2ssaW5wdXQ6ZnVuY3Rpb24odCl7ZS5zZWxlY3RlZExhYmVsPXR9fSxuYXRpdmVPbjp7bW91c2Vkb3duOmZ1bmN0aW9uKHQpe2UuaGFuZGxlTW91c2VEb3duKHQpfSxrZXl1cDpmdW5jdGlvbih0KXtlLmRlYm91bmNlZE9uSW5wdXRDaGFuZ2UodCl9LGtleWRvd246W2Z1bmN0aW9uKHQpezQwPT09dC5rZXlDb2RlJiYodC5wcmV2ZW50RGVmYXVsdCgpLGUubmF2aWdhdGVPcHRpb25zKCJuZXh0IikpfSxmdW5jdGlvbih0KXszOD09PXQua2V5Q29kZSYmKHQucHJldmVudERlZmF1bHQoKSxlLm5hdmlnYXRlT3B0aW9ucygicHJldiIpKX0sZnVuY3Rpb24odCl7MTM9PT10LmtleUNvZGUmJih0LnByZXZlbnREZWZhdWx0KCksZS5zZWxlY3RPcHRpb24odCkpfSxmdW5jdGlvbih0KXsyNz09PXQua2V5Q29kZSYmKHQucHJldmVudERlZmF1bHQoKSxlLnZpc2libGU9ITEpfSxmdW5jdGlvbih0KXs5PT09dC5rZXlDb2RlJiYoZS52aXNpYmxlPSExKX1dLG1vdXNlZW50ZXI6ZnVuY3Rpb24odCl7ZS5pbnB1dEhvdmVyaW5nPSEwfSxtb3VzZWxlYXZlOmZ1bmN0aW9uKHQpe2UuaW5wdXRIb3ZlcmluZz0hMX19fSksdCgidHJhbnNpdGlvbiIse2F0dHJzOntuYW1lOiJlbC16b29tLWluLXRvcCJ9LG9uOnsiYWZ0ZXItbGVhdmUiOmUuZG9EZXN0cm95fX0sW3QoImVsLXNlbGVjdC1tZW51Iix7ZGlyZWN0aXZlczpbe25hbWU6InNob3ciLHJhd05hbWU6InYtc2hvdyIsdmFsdWU6ZS52aXNpYmxlJiZlLmVtcHR5VGV4dCE9PSExLGV4cHJlc3Npb246InZpc2libGUgJiYgZW1wdHlUZXh0ICE9PSBmYWxzZSJ9XSxyZWY6InBvcHBlciJ9LFt0KCJ1bCIse2RpcmVjdGl2ZXM6W3tuYW1lOiJzaG93IixyYXdOYW1lOiJ2LXNob3ciLHZhbHVlOmUub3B0aW9ucy5sZW5ndGg+MCYmIWUubG9hZGluZyxleHByZXNzaW9uOiJvcHRpb25zLmxlbmd0aCA+IDAgJiYgIWxvYWRpbmcifV0sc3RhdGljQ2xhc3M6ImVsLXNlbGVjdC1kcm9wZG93bl9fbGlzdCIsImNsYXNzIjp7ImlzLWVtcHR5IjohZS5hbGxvd0NyZWF0ZSYmMD09PWUuZmlsdGVyZWRPcHRpb25zQ291bnR9fSxbZS5zaG93TmV3T3B0aW9uP3QoImVsLW9wdGlvbiIse2F0dHJzOntjcmVhdGVkOiIifSxkb21Qcm9wczp7dmFsdWU6ZS5xdWVyeX19KTplLl9lKCksZS5fdCgiZGVmYXVsdCIpXSksZS5lbXB0eVRleHQmJiFlLmFsbG93Q3JlYXRlP3QoInAiLHtzdGF0aWNDbGFzczoiZWwtc2VsZWN0LWRyb3Bkb3duX19lbXB0eSJ9LFtlLl9zKGUuZW1wdHlUZXh0KV0pOmUuX2UoKV0pXSldKX0sc3RhdGljUmVuZGVyRm5zOltdfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fXQuX19lc01vZHVsZT0hMDt2YXIgcz1uKDI4KSxvPWkocyk7b1siZGVmYXVsdCJdLmluc3RhbGw9ZnVuY3Rpb24oZSl7ZS5jb21wb25lbnQob1siZGVmYXVsdCJdLm5hbWUsb1siZGVmYXVsdCJdKX0sdFsiZGVmYXVsdCJdPW9bImRlZmF1bHQiXX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt0Ll9fZXNNb2R1bGU9ITAsdFsiZGVmYXVsdCJdPXttb3VudGVkOmZ1bmN0aW9uKCl7cmV0dXJufSxtZXRob2RzOntnZXRNaWdyYXRpbmdDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57cHJvcHM6e30sZXZlbnRzOnt9fX19fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fXQuX19lc01vZHVsZT0hMDt2YXIgcz1uKDQ1KSxvPWkocyk7b1siZGVmYXVsdCJdLmluc3RhbGw9ZnVuY3Rpb24oZSl7ZS5jb21wb25lbnQob1siZGVmYXVsdCJdLm5hbWUsb1siZGVmYXVsdCJdKX0sdFsiZGVmYXVsdCJdPW9bImRlZmF1bHQiXX0sZnVuY3Rpb24oZSx0LG4pe3ZhciBpLHM7aT1uKDQ2KTt2YXIgbz1uKDQ3KTtzPWk9aXx8e30sIm9iamVjdCIhPXR5cGVvZiBpWyJkZWZhdWx0Il0mJiJmdW5jdGlvbiIhPXR5cGVvZiBpWyJkZWZhdWx0Il18fChzPWk9aVsiZGVmYXVsdCJdKSwiZnVuY3Rpb24iPT10eXBlb2YgcyYmKHM9cy5vcHRpb25zKSxzLnJlbmRlcj1vLnJlbmRlcixzLnN0YXRpY1JlbmRlckZucz1vLnN0YXRpY1JlbmRlckZucyxlLmV4cG9ydHM9aX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fXQuX19lc01vZHVsZT0hMDt2YXIgcz1uKDI2KSxvPWkocyk7dFsiZGVmYXVsdCJdPXtuYW1lOiJlbC1kaWFsb2ciLG1peGluczpbb1siZGVmYXVsdCJdXSxwcm9wczp7dGl0bGU6e3R5cGU6U3RyaW5nLCJkZWZhdWx0IjoiIn0sbW9kYWw6e3R5cGU6Qm9vbGVhbiwiZGVmYXVsdCI6ITB9LGxvY2tTY3JvbGw6e3R5cGU6Qm9vbGVhbiwiZGVmYXVsdCI6ITB9LGNsb3NlT25DbGlja01vZGFsOnt0eXBlOkJvb2xlYW4sImRlZmF1bHQiOiEwfSxjbG9zZU9uUHJlc3NFc2NhcGU6e3R5cGU6Qm9vbGVhbiwiZGVmYXVsdCI6ITB9LHNob3dDbG9zZTp7dHlwZTpCb29sZWFuLCJkZWZhdWx0IjohMH0sc2l6ZTp7dHlwZTpTdHJpbmcsImRlZmF1bHQiOiJzbWFsbCJ9LGN1c3RvbUNsYXNzOnt0eXBlOlN0cmluZywiZGVmYXVsdCI6IiJ9LHRvcDp7dHlwZTpTdHJpbmcsImRlZmF1bHQiOiIxNSUifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybnt2aXNpYmxlOiExfX0sd2F0Y2g6e3ZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMudmlzaWJsZT1lfSx2aXNpYmxlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGhpcy4kZW1pdCgiaW5wdXQiLGUpLGU/KHRoaXMuJGVtaXQoIm9wZW4iKSx0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe3QuJHJlZnMuZGlhbG9nLnNjcm9sbFRvcD0wfSkpOnRoaXMuJGVtaXQoImNsb3NlIil9fSxjb21wdXRlZDp7c2l6ZUNsYXNzOmZ1bmN0aW9uKCl7cmV0dXJuImVsLWRpYWxvZy0tIit0aGlzLnNpemV9LHN0eWxlOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bGwiPT09dGhpcy5zaXplP3t9OnsibWFyZ2luLWJvdHRvbSI6IjUwcHgiLHRvcDp0aGlzLnRvcH19fSxtZXRob2RzOntoYW5kbGVXcmFwcGVyQ2xpY2s6ZnVuY3Rpb24oKXt0aGlzLmNsb3NlT25DbGlja01vZGFsJiZ0aGlzLmNsb3NlKCl9fSxtb3VudGVkOmZ1bmN0aW9uKCl7dGhpcy52YWx1ZSYmKHRoaXMucmVuZGVyZWQ9ITAsdGhpcy5vcGVuKCkpfX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS4kY3JlYXRlRWxlbWVudDtlLl9jO3JldHVybiB0KCJ0cmFuc2l0aW9uIix7YXR0cnM6e25hbWU6ImRpYWxvZy1mYWRlIn19LFt0KCJkaXYiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTplLnZpc2libGUsZXhwcmVzc2lvbjoidmlzaWJsZSJ9XSxzdGF0aWNDbGFzczoiZWwtZGlhbG9nX193cmFwcGVyIixvbjp7Y2xpY2s6ZnVuY3Rpb24odCl7dC50YXJnZXQ9PT10LmN1cnJlbnRUYXJnZXQmJmUuaGFuZGxlV3JhcHBlckNsaWNrKHQpfX19LFt0KCJkaXYiLHtyZWY6ImRpYWxvZyIsc3RhdGljQ2xhc3M6ImVsLWRpYWxvZyIsImNsYXNzIjpbZS5zaXplQ2xhc3MsZS5jdXN0b21DbGFzc10sc3R5bGU6ZS5zdHlsZX0sW3QoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1kaWFsb2dfX2hlYWRlciJ9LFt0KCJzcGFuIix7c3RhdGljQ2xhc3M6ImVsLWRpYWxvZ19fdGl0bGUifSxbZS5fcyhlLnRpdGxlKV0pLHQoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1kaWFsb2dfX2hlYWRlcmJ0biJ9LFtlLnNob3dDbG9zZT90KCJpIix7c3RhdGljQ2xhc3M6ImVsLWRpYWxvZ19fY2xvc2UgZWwtaWNvbiBlbC1pY29uLWNsb3NlIixvbjp7Y2xpY2s6ZnVuY3Rpb24odCl7ZS5jbG9zZSgpfX19KTplLl9lKCldKV0pLGUucmVuZGVyZWQ/dCgiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLWRpYWxvZ19fYm9keSJ9LFtlLl90KCJkZWZhdWx0IildKTplLl9lKCksZS4kc2xvdHMuZm9vdGVyP3QoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1kaWFsb2dfX2Zvb3RlciJ9LFtlLl90KCJmb290ZXIiKV0pOmUuX2UoKV0pXSldKX0sc3RhdGljUmVuZGVyRm5zOltdfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fXQuX19lc01vZHVsZT0hMDt2YXIgcz1uKDQ5KSxvPWkocyk7b1siZGVmYXVsdCJdLmluc3RhbGw9ZnVuY3Rpb24oZSl7ZS5jb21wb25lbnQob1siZGVmYXVsdCJdLm5hbWUsb1siZGVmYXVsdCJdKX0sdFsiZGVmYXVsdCJdPW9bImRlZmF1bHQiXX0sZnVuY3Rpb24oZSx0LG4pe3ZhciBpLHM7aT1uKDUwKTt2YXIgbz1uKDUxKTtzPWk9aXx8e30sIm9iamVjdCIhPXR5cGVvZiBpWyJkZWZhdWx0Il0mJiJmdW5jdGlvbiIhPXR5cGVvZiBpWyJkZWZhdWx0Il18fChzPWk9aVsiZGVmYXVsdCJdKSwiZnVuY3Rpb24iPT10eXBlb2YgcyYmKHM9cy5vcHRpb25zKSxzLnJlbmRlcj1vLnJlbmRlcixzLnN0YXRpY1JlbmRlckZucz1vLnN0YXRpY1JlbmRlckZucyxlLmV4cG9ydHM9aX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fXQuX19lc01vZHVsZT0hMDt2YXIgcz1uKDE3KSxvPWkocyksYT1uKDM3KSxyPWkoYSk7dFsiZGVmYXVsdCJdPXtuYW1lOiJFbEF1dG9jb21wbGV0ZSIsY29tcG9uZW50czp7RWxJbnB1dDpvWyJkZWZhdWx0Il19LGRpcmVjdGl2ZXM6e0NsaWNrb3V0c2lkZTpyWyJkZWZhdWx0Il19LHByb3BzOntwbGFjZWhvbGRlcjpTdHJpbmcsZGlzYWJsZWQ6Qm9vbGVhbixuYW1lOlN0cmluZyxzaXplOlN0cmluZyx2YWx1ZTpTdHJpbmcsZmV0Y2hTdWdnZXN0aW9uczpGdW5jdGlvbix0cmlnZ2VyT25Gb2N1czp7dHlwZTpCb29sZWFuLCJkZWZhdWx0IjohMH0sY3VzdG9tSXRlbTpTdHJpbmd9LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57c3VnZ2VzdGlvbnM6W10sc3VnZ2VzdGlvblZpc2libGU6ITEsbG9hZGluZzohMSxoaWdobGlnaHRlZEluZGV4Oi0xfX0sbW91bnRlZDpmdW5jdGlvbigpe3RoaXMuJHBhcmVudC5wb3BwZXJFbG09dGhpcy5wb3BwZXJFbG09dGhpcy4kZWx9LG1ldGhvZHM6e2hhbmRsZUNoYW5nZTpmdW5jdGlvbihlKXt0aGlzLiRlbWl0KCJpbnB1dCIsZSksdGhpcy5zaG93U3VnZ2VzdGlvbnMoZSl9LGhhbmRsZUZvY3VzOmZ1bmN0aW9uKCl7dGhpcy50cmlnZ2VyT25Gb2N1cyYmdGhpcy5zaG93U3VnZ2VzdGlvbnModGhpcy52YWx1ZSl9LGhhbmRsZUJsdXI6ZnVuY3Rpb24oKXt0aGlzLmhpZGVTdWdnZXN0aW9ucygpfSxzZWxlY3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aGlzLnN1Z2dlc3Rpb25zJiZ0aGlzLnN1Z2dlc3Rpb25zW2VdJiYodGhpcy4kZW1pdCgiaW5wdXQiLHRoaXMuc3VnZ2VzdGlvbnNbZV0udmFsdWUpLHRoaXMuJGVtaXQoInNlbGVjdCIsdGhpcy5zdWdnZXN0aW9uc1tlXSksdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24oKXt0LmhpZGVTdWdnZXN0aW9ucygpfSkpfSxoaWRlU3VnZ2VzdGlvbnM6ZnVuY3Rpb24oKXt0aGlzLnN1Z2dlc3Rpb25WaXNpYmxlPSExLHRoaXMuc3VnZ2VzdGlvbnM9W10sdGhpcy5sb2FkaW5nPSExfSxzaG93U3VnZ2VzdGlvbnM6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aGlzLnN1Z2dlc3Rpb25WaXNpYmxlPSEwLHRoaXMubG9hZGluZz0hMCx0aGlzLmZldGNoU3VnZ2VzdGlvbnMoZSxmdW5jdGlvbihlKXt0LmxvYWRpbmc9ITEsQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGg+MD90LnN1Z2dlc3Rpb25zPWU6dC5oaWRlU3VnZ2VzdGlvbnMoKX0pfSxoaWdobGlnaHQ6ZnVuY3Rpb24oZSl7aWYodGhpcy5zdWdnZXN0aW9uVmlzaWJsZSYmIXRoaXMubG9hZGluZyl7ZTwwP2U9MDplPj10aGlzLnN1Z2dlc3Rpb25zLmxlbmd0aCYmKGU9dGhpcy5zdWdnZXN0aW9ucy5sZW5ndGgtMSk7dmFyIHQ9dGhpcy4kcmVmcy5zdWdnZXN0aW9ucyxuPXQuY2hpbGRyZW5bZV0saT10LnNjcm9sbFRvcCxzPW4ub2Zmc2V0VG9wO3Mrbi5zY3JvbGxIZWlnaHQ+aSt0LmNsaWVudEhlaWdodCYmKHQuc2Nyb2xsVG9wKz1uLnNjcm9sbEhlaWdodCksczxpJiYodC5zY3JvbGxUb3AtPW4uc2Nyb2xsSGVpZ2h0KSx0aGlzLmhpZ2hsaWdodGVkSW5kZXg9ZX19fX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS4kY3JlYXRlRWxlbWVudDtlLl9jO3JldHVybiB0KCJkaXYiLHtkaXJlY3RpdmVzOlt7bmFtZToiY2xpY2tvdXRzaWRlIixyYXdOYW1lOiJ2LWNsaWNrb3V0c2lkZSIsdmFsdWU6ZS5oYW5kbGVCbHVyLGV4cHJlc3Npb246ImhhbmRsZUJsdXIifV0sc3RhdGljQ2xhc3M6ImVsLWF1dG9jb21wbGV0ZSJ9LFt0KCJlbC1pbnB1dCIse2F0dHJzOntkaXNhYmxlZDplLmRpc2FibGVkLHBsYWNlaG9sZGVyOmUucGxhY2Vob2xkZXIsbmFtZTplLm5hbWUsc2l6ZTplLnNpemV9LGRvbVByb3BzOnt2YWx1ZTplLnZhbHVlfSxvbjp7Y2hhbmdlOmUuaGFuZGxlQ2hhbmdlLGZvY3VzOmUuaGFuZGxlRm9jdXN9LG5hdGl2ZU9uOntrZXlkb3duOltmdW5jdGlvbih0KXszOD09PXQua2V5Q29kZSYmZS5oaWdobGlnaHQoZS5oaWdobGlnaHRlZEluZGV4LTEpfSxmdW5jdGlvbih0KXs0MD09PXQua2V5Q29kZSYmZS5oaWdobGlnaHQoZS5oaWdobGlnaHRlZEluZGV4KzEpfSxmdW5jdGlvbih0KXsxMz09PXQua2V5Q29kZSYmKHQuc3RvcFByb3BhZ2F0aW9uKCksZS5zZWxlY3QoZS5oaWdobGlnaHRlZEluZGV4KSl9XX19LFtlLiRzbG90cy5wcmVwZW5kP3QoInRlbXBsYXRlIix7c2xvdDoicHJlcGVuZCJ9LFtlLl90KCJwcmVwZW5kIildKTplLl9lKCksZS4kc2xvdHMuYXBwZW5kP3QoInRlbXBsYXRlIix7c2xvdDoiYXBwZW5kIn0sW2UuX3QoImFwcGVuZCIpXSk6ZS5fZSgpXSksdCgidHJhbnNpdGlvbiIse2F0dHJzOntuYW1lOiJlbC16b29tLWluLXRvcCJ9fSxbZS5zdWdnZXN0aW9uVmlzaWJsZT90KCJ1bCIse3JlZjoic3VnZ2VzdGlvbnMiLHN0YXRpY0NsYXNzOiJlbC1hdXRvY29tcGxldGVfX3N1Z2dlc3Rpb25zIiwiY2xhc3MiOnsiaXMtbG9hZGluZyI6ZS5sb2FkaW5nfX0sW2UubG9hZGluZz90KCJsaSIsW2UuX20oMCldKTplLl9sKGUuc3VnZ2VzdGlvbnMsZnVuY3Rpb24obixpKXtyZXR1cm5bZS5jdXN0b21JdGVtP3QoZS5jdXN0b21JdGVtLHt0YWc6ImNvbXBvbmVudCIsImNsYXNzIjp7aGlnaGxpZ2h0ZWQ6ZS5oaWdobGlnaHRlZEluZGV4PT09aX0sYXR0cnM6e2l0ZW06bixpbmRleDppfSxvbjp7Y2xpY2s6ZnVuY3Rpb24odCl7ZS5zZWxlY3QoaSl9fX0pOnQoImxpIix7ImNsYXNzIjp7aGlnaGxpZ2h0ZWQ6ZS5oaWdobGlnaHRlZEluZGV4PT09aX0sb246e2NsaWNrOmZ1bmN0aW9uKHQpe2Uuc2VsZWN0KGkpfX19LFsiXG4gICAgICAgICAgIitlLl9zKG4udmFsdWUpKyJcbiAgICAgICAgIl0pXX0pXSk6ZS5fZSgpXSldKX0sc3RhdGljUmVuZGVyRm5zOltmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1lLiRjcmVhdGVFbGVtZW50O2UuX2M7cmV0dXJuIHQoImkiLHtzdGF0aWNDbGFzczoiZWwtaWNvbi1sb2FkaW5nIn0pfV19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19dC5fX2VzTW9kdWxlPSEwO3ZhciBzPW4oNTMpLG89aShzKTtvWyJkZWZhdWx0Il0uaW5zdGFsbD1mdW5jdGlvbihlKXtlLmNvbXBvbmVudChvWyJkZWZhdWx0Il0ubmFtZSxvWyJkZWZhdWx0Il0pfSx0WyJkZWZhdWx0Il09b1siZGVmYXVsdCJdfSxmdW5jdGlvbihlLHQsbil7dmFyIGkscztpPW4oNTQpLHM9aT1pfHx7fSwib2JqZWN0IiE9dHlwZW9mIGlbImRlZmF1bHQiXSYmImZ1bmN0aW9uIiE9dHlwZW9mIGlbImRlZmF1bHQiXXx8KHM9aT1pWyJkZWZhdWx0Il0pLCJmdW5jdGlvbiI9PXR5cGVvZiBzJiYocz1zLm9wdGlvbnMpLGUuZXhwb3J0cz1pfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19dC5fX2VzTW9kdWxlPSEwO3ZhciBzPW4oMzcpLG89aShzKSxhPW4oMTApLHI9aShhKTt0WyJkZWZhdWx0Il09e25hbWU6IkVsRHJvcGRvd24iLGNvbXBvbmVudE5hbWU6IkVsRHJvcGRvd24iLG1peGluczpbclsiZGVmYXVsdCJdXSxkaXJlY3RpdmVzOntDbGlja291dHNpZGU6b1siZGVmYXVsdCJdfSxwcm9wczp7dHJpZ2dlcjp7dHlwZTpTdHJpbmcsImRlZmF1bHQiOiJob3ZlciJ9LG1lbnVBbGlnbjp7dHlwZTpTdHJpbmcsImRlZmF1bHQiOiJlbmQifSx0eXBlOlN0cmluZyxzaXplOlN0cmluZyxzcGxpdEJ1dHRvbjpCb29sZWFufSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3RpbWVvdXQ6bnVsbCx2aXNpYmxlOiExfX0sbW91bnRlZDpmdW5jdGlvbigpe3RoaXMuJG9uKCJtZW51LWl0ZW0tY2xpY2siLHRoaXMuaGFuZGxlTWVudUl0ZW1DbGljayksdGhpcy5pbml0RXZlbnQoKX0sd2F0Y2g6e3Zpc2libGU6ZnVuY3Rpb24oZSl7dGhpcy5icm9hZGNhc3QoIkVsRHJvcGRvd25NZW51IiwidmlzaWJsZSIsZSl9fSxtZXRob2RzOntzaG93OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KSx0aGlzLnRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe2UudmlzaWJsZT0hMH0sMjUwKX0saGlkZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7Y2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCksdGhpcy50aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnZpc2libGU9ITF9LDE1MCl9LGhhbmRsZUNsaWNrOmZ1bmN0aW9uKCl7dGhpcy52aXNpYmxlPSF0aGlzLnZpc2libGV9LGluaXRFdmVudDpmdW5jdGlvbigpe3ZhciBlPXRoaXMudHJpZ2dlcix0PXRoaXMuc2hvdyxuPXRoaXMuaGlkZSxpPXRoaXMuaGFuZGxlQ2xpY2sscz10aGlzLnNwbGl0QnV0dG9uLG89cz90aGlzLiRyZWZzLnRyaWdnZXIuJGVsOnRoaXMuJHNsb3RzWyJkZWZhdWx0Il1bMF0uZWxtO2lmKCJob3ZlciI9PT1lKXtvLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLHQpLG8uYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsbik7dmFyIGE9dGhpcy4kc2xvdHMuZHJvcGRvd25bMF0uZWxtO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsdCksYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIixuKX1lbHNlImNsaWNrIj09PWUmJm8uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGkpfSxoYW5kbGVNZW51SXRlbUNsaWNrOmZ1bmN0aW9uKGUsdCl7dGhpcy52aXNpYmxlPSExLHRoaXMuJGVtaXQoImNvbW1hbmQiLGUsdCl9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXRoaXMuaGlkZSxpPXRoaXMuc3BsaXRCdXR0b24scz10aGlzLnR5cGUsbz10aGlzLnNpemUsYT1mdW5jdGlvbihlKXt0LiRlbWl0KCJjbGljayIpfSxyPWk/ZSgiZWwtYnV0dG9uLWdyb3VwIixudWxsLFtlKCJlbC1idXR0b24iLHthdHRyczp7dHlwZTpzLHNpemU6b30sbmF0aXZlT246e2NsaWNrOmF9fSxbdGhpcy4kc2xvdHNbImRlZmF1bHQiXV0pLGUoImVsLWJ1dHRvbiIse3JlZjoidHJpZ2dlciIsYXR0cnM6e3R5cGU6cyxzaXplOm99LCJjbGFzcyI6ImVsLWRyb3Bkb3duX19jYXJldC1idXR0b24ifSxbZSgiaSIseyJjbGFzcyI6ImVsLWRyb3Bkb3duX19pY29uIGVsLWljb24tY2FyZXQtYm90dG9tIn0sW10pXSldKTp0aGlzLiRzbG90c1siZGVmYXVsdCJdO3JldHVybiBlKCJkaXYiLHsiY2xhc3MiOiJlbC1kcm9wZG93biIsZGlyZWN0aXZlczpbe25hbWU6ImNsaWNrb3V0c2lkZSIsdmFsdWU6bn1dfSxbcix0aGlzLiRzbG90cy5kcm9wZG93bl0pfX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX10Ll9fZXNNb2R1bGU9ITA7dmFyIHM9big1Niksbz1pKHMpO29bImRlZmF1bHQiXS5pbnN0YWxsPWZ1bmN0aW9uKGUpe2UuY29tcG9uZW50KG9bImRlZmF1bHQiXS5uYW1lLG9bImRlZmF1bHQiXSl9LHRbImRlZmF1bHQiXT1vWyJkZWZhdWx0Il19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgaSxzO2k9big1Nyk7dmFyIG89big1OCk7cz1pPWl8fHt9LCJvYmplY3QiIT10eXBlb2YgaVsiZGVmYXVsdCJdJiYiZnVuY3Rpb24iIT10eXBlb2YgaVsiZGVmYXVsdCJdfHwocz1pPWlbImRlZmF1bHQiXSksImZ1bmN0aW9uIj09dHlwZW9mIHMmJihzPXMub3B0aW9ucykscy5yZW5kZXI9by5yZW5kZXIscy5zdGF0aWNSZW5kZXJGbnM9by5zdGF0aWNSZW5kZXJGbnMsZS5leHBvcnRzPWl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX10Ll9fZXNNb2R1bGU9ITA7dmFyIHM9bigyNCksbz1pKHMpO3RbImRlZmF1bHQiXT17bmFtZToiRWxEcm9wZG93bk1lbnUiLGNvbXBvbmVudE5hbWU6IkVsRHJvcGRvd25NZW51IixtaXhpbnM6W29bImRlZmF1bHQiXV0sY3JlYXRlZDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy4kb24oInZpc2libGUiLGZ1bmN0aW9uKHQpe2Uuc2hvd1BvcHBlcj10fSl9LG1vdW50ZWQ6ZnVuY3Rpb24oKXt0aGlzLiRwYXJlbnQucG9wcGVyRWxtPXRoaXMucG9wcGVyRWxtPXRoaXMuJGVsLHRoaXMucmVmZXJlbmNlRWxtPXRoaXMuJHBhcmVudC4kZWx9LGNvbXB1dGVkOntwbGFjZW1lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4iYm90dG9tLSIrdGhpcy4kcGFyZW50Lm1lbnVBbGlnbn19fX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1lLiRjcmVhdGVFbGVtZW50O2UuX2M7cmV0dXJuIHQoInRyYW5zaXRpb24iLHthdHRyczp7bmFtZToiZWwtem9vbS1pbi10b3AifSxvbjp7ImFmdGVyLWxlYXZlIjplLmRvRGVzdHJveX19LFt0KCJ1bCIse2RpcmVjdGl2ZXM6W3tuYW1lOiJzaG93IixyYXdOYW1lOiJ2LXNob3ciLHZhbHVlOmUuc2hvd1BvcHBlcixleHByZXNzaW9uOiJzaG93UG9wcGVyIn1dLHN0YXRpY0NsYXNzOiJlbC1kcm9wZG93bi1tZW51In0sW2UuX3QoImRlZmF1bHQiKV0pXSl9LHN0YXRpY1JlbmRlckZuczpbXX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX10Ll9fZXNNb2R1bGU9ITA7dmFyIHM9big2MCksbz1pKHMpO29bImRlZmF1bHQiXS5pbnN0YWxsPWZ1bmN0aW9uKGUpe2UuY29tcG9uZW50KG9bImRlZmF1bHQiXS5uYW1lLG9bImRlZmF1bHQiXSl9LHRbImRlZmF1bHQiXT1vWyJkZWZhdWx0Il19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgaSxzO2k9big2MSk7dmFyIG89big2Mik7cz1pPWl8fHt9LCJvYmplY3QiIT10eXBlb2YgaVsiZGVmYXVsdCJdJiYiZnVuY3Rpb24iIT10eXBlb2YgaVsiZGVmYXVsdCJdfHwocz1pPWlbImRlZmF1bHQiXSksImZ1bmN0aW9uIj09dHlwZW9mIHMmJihzPXMub3B0aW9ucykscy5yZW5kZXI9by5yZW5kZXIscy5zdGF0aWNSZW5kZXJGbnM9by5zdGF0aWNSZW5kZXJGbnMsZS5leHBvcnRzPWl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX10Ll9fZXNNb2R1bGU9ITA7dmFyIHM9bigxMCksbz1pKHMpO3RbImRlZmF1bHQiXT17bmFtZToiRWxEcm9wZG93bkl0ZW0iLG1peGluczpbb1siZGVmYXVsdCJdXSxwcm9wczp7Y29tbWFuZDpTdHJpbmcsZGlzYWJsZWQ6Qm9vbGVhbixkaXZpZGVkOkJvb2xlYW59LG1ldGhvZHM6e2hhbmRsZUNsaWNrOmZ1bmN0aW9uKGUpe3RoaXMuZGlzcGF0Y2goIkVsRHJvcGRvd24iLCJtZW51LWl0ZW0tY2xpY2siLFt0aGlzLmNvbW1hbmQsdGhpc10pfX19fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWUuJGNyZWF0ZUVsZW1lbnQ7ZS5fYztyZXR1cm4gdCgibGkiLHtzdGF0aWNDbGFzczoiZWwtZHJvcGRvd24tbWVudV9faXRlbSIsImNsYXNzIjp7ImlzLWRpc2FibGVkIjplLmRpc2FibGVkLCJlbC1kcm9wZG93bi1tZW51X19pdGVtLS1kaXZpZGVkIjplLmRpdmlkZWR9LG9uOntjbGljazplLmhhbmRsZUNsaWNrfX0sW2UuX3QoImRlZmF1bHQiKV0pfSxzdGF0aWNSZW5kZXJGbnM6W119fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19dC5fX2VzTW9kdWxlPSEwO3ZhciBzPW4oNjQpLG89aShzKTtvWyJkZWZhdWx0Il0uaW5zdGFsbD1mdW5jdGlvbihlKXtlLmNvbXBvbmVudChvWyJkZWZhdWx0Il0ubmFtZSxvWyJkZWZhdWx0Il0pfSx0WyJkZWZhdWx0Il09b1siZGVmYXVsdCJdfSxmdW5jdGlvbihlLHQsbil7dmFyIGkscztpPW4oNjUpO3ZhciBvPW4oNjYpO3M9aT1pfHx7fSwib2JqZWN0IiE9dHlwZW9mIGlbImRlZmF1bHQiXSYmImZ1bmN0aW9uIiE9dHlwZW9mIGlbImRlZmF1bHQiXXx8KHM9aT1pWyJkZWZhdWx0Il0pLCJmdW5jdGlvbiI9PXR5cGVvZiBzJiYocz1zLm9wdGlvbnMpLHMucmVuZGVyPW8ucmVuZGVyLHMuc3RhdGljUmVuZGVyRm5zPW8uc3RhdGljUmVuZGVyRm5zLGUuZXhwb3J0cz1pfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19dC5fX2VzTW9kdWxlPSEwO3ZhciBzPW4oMTApLG89aShzKTt0WyJkZWZhdWx0Il09e25hbWU6IkVsTWVudSIsY29tcG9uZW50TmFtZToiRWxNZW51IixtaXhpbnM6W29bImRlZmF1bHQiXV0scHJvcHM6e21vZGU6e3R5cGU6U3RyaW5nLCJkZWZhdWx0IjoidmVydGljYWwifSxkZWZhdWx0QWN0aXZlOnt0eXBlOlN0cmluZywiZGVmYXVsdCI6IiJ9LGRlZmF1bHRPcGVuZWRzOkFycmF5LHRoZW1lOnt0eXBlOlN0cmluZywiZGVmYXVsdCI6ImxpZ2h0In0sdW5pcXVlT3BlbmVkOkJvb2xlYW4scm91dGVyOkJvb2xlYW4sbWVudVRyaWdnZXI6e3R5cGU6U3RyaW5nLCJkZWZhdWx0IjoiaG92ZXIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybnthY3RpdmVJbmRleDp0aGlzLmRlZmF1bHRBY3RpdmUsb3BlbmVkTWVudXM6dGhpcy5kZWZhdWx0T3BlbmVkcz90aGlzLmRlZmF1bHRPcGVuZWRzLnNsaWNlKDApOltdLG1lbnVJdGVtczp7fSxzdWJtZW51czp7fX19LHdhdGNoOntkZWZhdWx0QWN0aXZlOmZ1bmN0aW9uKGUpe2lmKHRoaXMuYWN0aXZlSW5kZXg9ZSx0aGlzLm1lbnVJdGVtc1tlXSl7dmFyIHQ9dGhpcy5tZW51SXRlbXNbZV0sbj10LmluZGV4UGF0aDt0aGlzLmhhbmRsZVNlbGVjdChlLG4sbnVsbCx0KX19LGRlZmF1bHRPcGVuZWRzOmZ1bmN0aW9uKGUpe3RoaXMub3BlbmVkTWVudXM9ZX19LG1ldGhvZHM6e29wZW5NZW51OmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5vcGVuZWRNZW51cztuLmluZGV4T2YoZSk9PT0tMSYmKHRoaXMudW5pcXVlT3BlbmVkJiYodGhpcy5vcGVuZWRNZW51cz1uLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gdC5pbmRleE9mKGUpIT09LTF9KSksdGhpcy5vcGVuZWRNZW51cy5wdXNoKGUpKX0sY2xvc2VNZW51OmZ1bmN0aW9uKGUsdCl7dGhpcy5vcGVuZWRNZW51cy5zcGxpY2UodGhpcy5vcGVuZWRNZW51cy5pbmRleE9mKGUpLDEpfSxoYW5kbGVTdWJtZW51Q2xpY2s6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLm9wZW5lZE1lbnVzLmluZGV4T2YoZSkhPT0tMTtuPyh0aGlzLmNsb3NlTWVudShlLHQpLHRoaXMuJGVtaXQoImNsb3NlIixlLHQpKToodGhpcy5vcGVuTWVudShlLHQpLHRoaXMuJGVtaXQoIm9wZW4iLGUsdCkpfSxoYW5kbGVTZWxlY3Q6ZnVuY3Rpb24oZSx0LG4saSl7aWYodGhpcy5hY3RpdmVJbmRleD1lLHRoaXMuJGVtaXQoInNlbGVjdCIsZSx0LGkpLCJob3Jpem9udGFsIj09PXRoaXMubW9kZT8odGhpcy5icm9hZGNhc3QoIkVsU3VibWVudSIsIml0ZW0tc2VsZWN0IixbZSx0XSksdGhpcy5vcGVuZWRNZW51cz1bXSk6dGhpcy5vcGVuQWN0aXZlSXRlbU1lbnVzKCksdGhpcy5yb3V0ZXImJm4pdHJ5e3RoaXMuJHJvdXRlci5wdXNoKG4pfWNhdGNoKHMpe2NvbnNvbGUuZXJyb3Iocyl9fSxvcGVuQWN0aXZlSXRlbU1lbnVzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMuYWN0aXZlSW5kZXg7aWYodGhpcy5tZW51SXRlbXNbdF0mJnQmJiJ2ZXJ0aWNhbCI9PT10aGlzLm1vZGUpe3ZhciBuPXRoaXMubWVudUl0ZW1zW3RdLmluZGV4UGF0aDtuLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49ZS5zdWJtZW51c1t0XTtuJiZlLm9wZW5NZW51KHQsbi5pbmRleFBhdGgpfSl9fX0sbW91bnRlZDpmdW5jdGlvbigpe3RoaXMub3BlbkFjdGl2ZUl0ZW1NZW51cygpfX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS4kY3JlYXRlRWxlbWVudDtlLl9jO3JldHVybiB0KCJ1bCIse3N0YXRpY0NsYXNzOiJlbC1tZW51IiwiY2xhc3MiOnsiZWwtbWVudS0taG9yaXpvbnRhbCI6Imhvcml6b250YWwiPT09ZS5tb2RlLCJlbC1tZW51LS1kYXJrIjoiZGFyayI9PT1lLnRoZW1lfX0sW2UuX3QoImRlZmF1bHQiKV0pfSxzdGF0aWNSZW5kZXJGbnM6W119fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19dC5fX2VzTW9kdWxlPSEwO3ZhciBzPW4oNjgpLG89aShzKTtvWyJkZWZhdWx0Il0uaW5zdGFsbD1mdW5jdGlvbihlKXtlLmNvbXBvbmVudChvWyJkZWZhdWx0Il0ubmFtZSxvWyJkZWZhdWx0Il0pfSx0WyJkZWZhdWx0Il09b1siZGVmYXVsdCJdfSxmdW5jdGlvbihlLHQsbil7dmFyIGkscztpPW4oNjkpO3ZhciBvPW4oNzEpO3M9aT1pfHx7fSwib2JqZWN0IiE9dHlwZW9mIGlbImRlZmF1bHQiXSYmImZ1bmN0aW9uIiE9dHlwZW9mIGlbImRlZmF1bHQiXXx8KHM9aT1pWyJkZWZhdWx0Il0pLCJmdW5jdGlvbiI9PXR5cGVvZiBzJiYocz1zLm9wdGlvbnMpLHMucmVuZGVyPW8ucmVuZGVyLHMuc3RhdGljUmVuZGVyRm5zPW8uc3RhdGljUmVuZGVyRm5zLGUuZXhwb3J0cz1pfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19dmFyIHM9big3MCksbz1pKHMpO2UuZXhwb3J0cz17bmFtZToiRWxTdWJtZW51Iixjb21wb25lbnROYW1lOiJFbFN1Ym1lbnUiLG1peGluczpbb1siZGVmYXVsdCJdXSxwcm9wczp7aW5kZXg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfX0sZGF0YTpmdW5jdGlvbigpe3JldHVybnt0aW1lb3V0Om51bGwsYWN0aXZlOiExfX0sY29tcHV0ZWQ6e29wZW5lZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJvb3RNZW51Lm9wZW5lZE1lbnVzLmluZGV4T2YodGhpcy5pbmRleCkhPT0tMX19LG1ldGhvZHM6e2hhbmRsZUNsaWNrOmZ1bmN0aW9uKCl7dGhpcy5yb290TWVudS5oYW5kbGVTdWJtZW51Q2xpY2sodGhpcy5pbmRleCx0aGlzLmluZGV4UGF0aCl9LGhhbmRsZU1vdXNlZW50ZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2NsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpLHRoaXMudGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5yb290TWVudS5vcGVuTWVudShlLmluZGV4LGUuaW5kZXhQYXRoKX0sMzAwKX0saGFuZGxlTW91c2VsZWF2ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7Y2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCksdGhpcy50aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnJvb3RNZW51LmNsb3NlTWVudShlLmluZGV4LGUuaW5kZXhQYXRoKX0sMzAwKX0saW5pdEV2ZW50czpmdW5jdGlvbigpe3ZhciBlPXRoaXMucm9vdE1lbnUsdD10aGlzLmhhbmRsZU1vdXNlZW50ZXIsbj10aGlzLmhhbmRsZU1vdXNlbGVhdmUsaT10aGlzLmhhbmRsZUNsaWNrLHM9dm9pZCAwOyJob3Jpem9udGFsIj09PWUubW9kZSYmImhvdmVyIj09PWUubWVudVRyaWdnZXI/KHM9dGhpcy4kZWwscy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIix0KSxzLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLG4pKToocz10aGlzLiRyZWZzWyJzdWJtZW51LXRpdGxlIl0scy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsaSkpfX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMucm9vdE1lbnUuc3VibWVudXNbdGhpcy5pbmRleF09dGhpc30sbW91bnRlZDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy4kb24oIml0ZW0tc2VsZWN0IixmdW5jdGlvbih0LG4pe2UuYWN0aXZlPW4uaW5kZXhPZihlLmluZGV4KSE9PS0xfSksdGhpcy5pbml0RXZlbnRzKCl9fX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXtjb21wdXRlZDp7aW5kZXhQYXRoOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVt0aGlzLmluZGV4XSx0PXRoaXMuJHBhcmVudDsiRWxNZW51IiE9PXQuJG9wdGlvbnMuY29tcG9uZW50TmFtZTspdC5pbmRleCYmZS51bnNoaWZ0KHQuaW5kZXgpLHQ9dC4kcGFyZW50O3JldHVybiBlfSxyb290TWVudTpmdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLiRwYXJlbnQ7IkVsTWVudSIhPT1lLiRvcHRpb25zLmNvbXBvbmVudE5hbWU7KWU9ZS4kcGFyZW50O3JldHVybiBlfX19fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWUuJGNyZWF0ZUVsZW1lbnQ7ZS5fYztyZXR1cm4gdCgibGkiLHsiY2xhc3MiOnsiZWwtc3VibWVudSI6ITAsImlzLWFjdGl2ZSI6ZS5hY3RpdmUsImlzLW9wZW5lZCI6ZS5vcGVuZWR9fSxbdCgiZGl2Iix7cmVmOiJzdWJtZW51LXRpdGxlIixzdGF0aWNDbGFzczoiZWwtc3VibWVudV9fdGl0bGUifSxbZS5fdCgidGl0bGUiKSx0KCJpIix7ImNsYXNzIjp7ImVsLXN1Ym1lbnVfX2ljb24tYXJyb3ciOiEwLCJlbC1pY29uLWFycm93LWRvd24iOiJ2ZXJ0aWNhbCI9PT1lLnJvb3RNZW51Lm1vZGUsImVsLWljb24tY2FyZXQtYm90dG9tIjoiaG9yaXpvbnRhbCI9PT1lLnJvb3RNZW51Lm1vZGV9fSldKSx0KCJ0cmFuc2l0aW9uIix7YXR0cnM6e25hbWU6Imhvcml6b250YWwiPT09ZS5yb290TWVudS5tb2RlPyJlbC16b29tLWluLXRvcCI6IiJ9fSxbdCgidWwiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTplLm9wZW5lZCxleHByZXNzaW9uOiJvcGVuZWQifV0sc3RhdGljQ2xhc3M6ImVsLW1lbnUifSxbZS5fdCgiZGVmYXVsdCIpXSldKV0pfSxzdGF0aWNSZW5kZXJGbnM6W119fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19dC5fX2VzTW9kdWxlPSEwO3ZhciBzPW4oNzMpLG89aShzKTtvWyJkZWZhdWx0Il0uaW5zdGFsbD1mdW5jdGlvbihlKXtlLmNvbXBvbmVudChvWyJkZWZhdWx0Il0ubmFtZSxvWyJkZWZhdWx0Il0pfSx0WyJkZWZhdWx0Il09b1siZGVmYXVsdCJdfSxmdW5jdGlvbihlLHQsbil7dmFyIGkscztpPW4oNzQpO3ZhciBvPW4oNzUpO3M9aT1pfHx7fSwib2JqZWN0IiE9dHlwZW9mIGlbImRlZmF1bHQiXSYmImZ1bmN0aW9uIiE9dHlwZW9mIGlbImRlZmF1bHQiXXx8KHM9aT1pWyJkZWZhdWx0Il0pLCJmdW5jdGlvbiI9PXR5cGVvZiBzJiYocz1zLm9wdGlvbnMpLHMucmVuZGVyPW8ucmVuZGVyLHMuc3RhdGljUmVuZGVyRm5zPW8uc3RhdGljUmVuZGVyRm5zLGUuZXhwb3J0cz1pfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19dmFyIHM9big3MCksbz1pKHMpO2UuZXhwb3J0cz17bmFtZToiRWxNZW51SXRlbSIsY29tcG9uZW50TmFtZToiRWxNZW51SXRlbSIsbWl4aW5zOltvWyJkZWZhdWx0Il1dLHByb3BzOntpbmRleDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHJvdXRlOnt0eXBlOk9iamVjdCxyZXF1aXJlZDohMX0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbixyZXF1aXJlZDohMX19LGNvbXB1dGVkOnthY3RpdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbmRleD09PXRoaXMucm9vdE1lbnUuYWN0aXZlSW5kZXh9fSxtZXRob2RzOntoYW5kbGVDbGljazpmdW5jdGlvbigpe3RoaXMucm9vdE1lbnUuaGFuZGxlU2VsZWN0KHRoaXMuaW5kZXgsdGhpcy5pbmRleFBhdGgsdGhpcy5yb3V0ZXx8dGhpcy5pbmRleCx0aGlzKX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLnJvb3RNZW51Lm1lbnVJdGVtc1t0aGlzLmluZGV4XT10aGlzfX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS4kY3JlYXRlRWxlbWVudDtlLl9jO3JldHVybiB0KCJsaSIse3N0YXRpY0NsYXNzOiJlbC1tZW51LWl0ZW0iLCJjbGFzcyI6eyJpcy1hY3RpdmUiOmUuYWN0aXZlLCJpcy1kaXNhYmxlZCI6ZS5kaXNhYmxlZH0sb246e2NsaWNrOmUuaGFuZGxlQ2xpY2t9fSxbZS5fdCgiZGVmYXVsdCIpXSl9LHN0YXRpY1JlbmRlckZuczpbXX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX10Ll9fZXNNb2R1bGU9ITA7dmFyIHM9big3Nyksbz1pKHMpO29bImRlZmF1bHQiXS5pbnN0YWxsPWZ1bmN0aW9uKGUpe2UuY29tcG9uZW50KG9bImRlZmF1bHQiXS5uYW1lLG9bImRlZmF1bHQiXSl9LHRbImRlZmF1bHQiXT1vWyJkZWZhdWx0Il19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgaSxzO2k9big3OCk7dmFyIG89big3OSk7cz1pPWl8fHt9LCJvYmplY3QiIT10eXBlb2YgaVsiZGVmYXVsdCJdJiYiZnVuY3Rpb24iIT10eXBlb2YgaVsiZGVmYXVsdCJdfHwocz1pPWlbImRlZmF1bHQiXSksImZ1bmN0aW9uIj09dHlwZW9mIHMmJihzPXMub3B0aW9ucykscy5yZW5kZXI9by5yZW5kZXIscy5zdGF0aWNSZW5kZXJGbnM9by5zdGF0aWNSZW5kZXJGbnMsZS5leHBvcnRzPWl9LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz17bmFtZToiRWxNZW51SXRlbUdyb3VwIixjb21wb25lbnROYW1lOiJFbE1lbnVJdGVtR3JvdXAiLHByb3BzOnt0aXRsZTp7dHlwZTpTdHJpbmd9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3BhZGRpbmdMZWZ0OjIwfX0sbWV0aG9kczp7aW5pdFBhZGRpbmc6ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy4kcGFyZW50LHQ9MCxuPWUuJG9wdGlvbnMuY29tcG9uZW50TmFtZTsiRWxNZW51IiE9PW47KSJFbFN1Ym1lbnUiPT09biYmdCsrLGU9ZS4kcGFyZW50LG49ZS4kb3B0aW9ucy5jb21wb25lbnROYW1lO3RoaXMucGFkZGluZ0xlZnQrPTEwKnR9fSxtb3VudGVkOmZ1bmN0aW9uKCl7dGhpcy5pbml0UGFkZGluZygpfX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS4kY3JlYXRlRWxlbWVudDtlLl9jO3JldHVybiB0KCJsaSIse3N0YXRpY0NsYXNzOiJlbC1tZW51LWl0ZW0tZ3JvdXAifSxbdCgiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLW1lbnUtaXRlbS1ncm91cF9fdGl0bGUiLHN0eWxlOnsicGFkZGluZy1sZWZ0IjplLnBhZGRpbmdMZWZ0KyJweCJ9fSxbZS4kc2xvdHMudGl0bGU/ZS5fdCgidGl0bGUiKTpbZS5fcyhlLnRpdGxlKV1dKSx0KCJ1bCIsW2UuX3QoImRlZmF1bHQiKV0pXSl9LHN0YXRpY1JlbmRlckZuczpbXX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX10Ll9fZXNNb2R1bGU9ITA7dmFyIHM9big4MSksbz1pKHMpO29bImRlZmF1bHQiXS5pbnN0YWxsPWZ1bmN0aW9uKGUpe2UuY29tcG9uZW50KG9bImRlZmF1bHQiXS5uYW1lLG9bImRlZmF1bHQiXSl9LHRbImRlZmF1bHQiXT1vWyJkZWZhdWx0Il19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgaSxzO2k9big4Mik7dmFyIG89big4Myk7cz1pPWl8fHt9LCJvYmplY3QiIT10eXBlb2YgaVsiZGVmYXVsdCJdJiYiZnVuY3Rpb24iIT10eXBlb2YgaVsiZGVmYXVsdCJdfHwocz1pPWlbImRlZmF1bHQiXSksImZ1bmN0aW9uIj09dHlwZW9mIHMmJihzPXMub3B0aW9ucykscy5yZW5kZXI9by5yZW5kZXIscy5zdGF0aWNSZW5kZXJGbnM9by5zdGF0aWNSZW5kZXJGbnMsZS5leHBvcnRzPWl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX10Ll9fZXNNb2R1bGU9ITA7dmFyIHM9bigxNyksbz1pKHMpLGE9bigzOCk7dFsiZGVmYXVsdCJdPXtuYW1lOiJFbElucHV0TnVtYmVyIixwcm9wczp7c3RlcDp7dHlwZTpOdW1iZXIsImRlZmF1bHQiOjF9LG1heDp7dHlwZTpOdW1iZXIsImRlZmF1bHQiOjEvMH0sbWluOnt0eXBlOk51bWJlciwiZGVmYXVsdCI6MH0sdmFsdWU6eyJkZWZhdWx0IjowfSxkaXNhYmxlZDpCb29sZWFuLHNpemU6U3RyaW5nLGNvbnRyb2xzOnt0eXBlOkJvb2xlYW4sImRlZmF1bHQiOiEwfX0sZGlyZWN0aXZlczp7cmVwZWF0Q2xpY2s6e2JpbmQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPW51bGwscz12b2lkIDAsbz1mdW5jdGlvbigpe24uY29udGV4dFt0LmV4cHJlc3Npb25dKCl9LHI9ZnVuY3Rpb24oKXtuZXcgRGF0ZS1zPDEwMCYmbygpLGNsZWFySW50ZXJ2YWwoaSksaT1udWxsfTsoMCxhLm9uKShlLCJtb3VzZWRvd24iLGZ1bmN0aW9uKCl7cz1uZXcgRGF0ZSwoMCxhLm9uY2UpKGRvY3VtZW50LCJtb3VzZXVwIixyKSxpPXNldEludGVydmFsKGZ1bmN0aW9uKCl7bygpfSwxMDApfSl9fX0sY29tcG9uZW50czp7RWxJbnB1dDpvWyJkZWZhdWx0Il19LGRhdGE6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnZhbHVlO3JldHVybiBlPHRoaXMubWluJiYodGhpcy4kZW1pdCgiaW5wdXQiLHRoaXMubWluKSxlPXRoaXMubWluKSxlPnRoaXMubWF4JiYodGhpcy4kZW1pdCgiaW5wdXQiLHRoaXMubWF4KSxlPXRoaXMubWF4KSx7Y3VycmVudFZhbHVlOmUsaW5wdXRBY3RpdmU6ITF9fSx3YXRjaDp7dmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5jdXJyZW50VmFsdWU9ZX0sY3VycmVudFZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49TnVtYmVyKGUpO248PXRoaXMubWF4JiZuPj10aGlzLm1pbiYmKHRoaXMuJGVtaXQoImNoYW5nZSIsbix0KSx0aGlzLiRlbWl0KCJpbnB1dCIsbikpfX0sY29tcHV0ZWQ6e21pbkRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWUtdGhpcy5zdGVwPHRoaXMubWlufSxtYXhEaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlK3RoaXMuc3RlcD50aGlzLm1heH19LG1ldGhvZHM6e2FjY1N1YjpmdW5jdGlvbihlLHQpe3ZhciBuLGkscyxvO3RyeXtuPWUudG9TdHJpbmcoKS5zcGxpdCgiLiIpWzFdLmxlbmd0aH1jYXRjaChhKXtuPTB9dHJ5e2k9dC50b1N0cmluZygpLnNwbGl0KCIuIilbMV0ubGVuZ3RofWNhdGNoKGEpe2k9MH1yZXR1cm4gcz1NYXRoLnBvdygxMCxNYXRoLm1heChuLGkpKSxvPW4+PWk/bjppLHBhcnNlRmxvYXQoKChlKnMtdCpzKS9zKS50b0ZpeGVkKG8pKX0sYWNjQWRkOmZ1bmN0aW9uKGUsdCl7dmFyIG4saSxzLG87dHJ5e249ZS50b1N0cmluZygpLnNwbGl0KCIuIilbMV0ubGVuZ3RofWNhdGNoKGEpe249MH10cnl7aT10LnRvU3RyaW5nKCkuc3BsaXQoIi4iKVsxXS5sZW5ndGh9Y2F0Y2goYSl7aT0wfWlmKG89TWF0aC5hYnMobi1pKSxzPU1hdGgucG93KDEwLE1hdGgubWF4KG4saSkpLG8+MCl7dmFyIHI9TWF0aC5wb3coMTAsbyk7bj5pPyhlPU51bWJlcihlLnRvU3RyaW5nKCkucmVwbGFjZSgiLiIsIiIpKSx0PU51bWJlcih0LnRvU3RyaW5nKCkucmVwbGFjZSgiLiIsIiIpKSpyKTooZT1OdW1iZXIoZS50b1N0cmluZygpLnJlcGxhY2UoIi4iLCIiKSkqcix0PU51bWJlcih0LnRvU3RyaW5nKCkucmVwbGFjZSgiLiIsIiIpKSl9ZWxzZSBlPU51bWJlcihlLnRvU3RyaW5nKCkucmVwbGFjZSgiLiIsIiIpKSx0PU51bWJlcih0LnRvU3RyaW5nKCkucmVwbGFjZSgiLiIsIiIpKTtyZXR1cm4oZSt0KS9zfSxpbmNyZWFzZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMudmFsdWV8fDA7ZSt0aGlzLnN0ZXA+dGhpcy5tYXh8fHRoaXMuZGlzYWJsZWR8fCh0aGlzLmN1cnJlbnRWYWx1ZT10aGlzLmFjY0FkZCh0aGlzLnN0ZXAsZSksdGhpcy5tYXhEaXNhYmxlZCYmKHRoaXMuaW5wdXRBY3RpdmU9ITEpKX0sZGVjcmVhc2U6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnZhbHVlfHwwO2UtdGhpcy5zdGVwPHRoaXMubWlufHx0aGlzLmRpc2FibGVkfHwodGhpcy5jdXJyZW50VmFsdWU9dGhpcy5hY2NTdWIoZSx0aGlzLnN0ZXApLHRoaXMubWluRGlzYWJsZWQmJih0aGlzLmlucHV0QWN0aXZlPSExKSl9LGFjdGl2ZUlucHV0OmZ1bmN0aW9uKGUpe3RoaXMuZGlzYWJsZWR8fGV8fCh0aGlzLmlucHV0QWN0aXZlPSEwKX0saW5hY3RpdmVJbnB1dDpmdW5jdGlvbihlKXt0aGlzLmRpc2FibGVkfHxlfHwodGhpcy5pbnB1dEFjdGl2ZT0hMSl9LGhhbmRsZUJsdXI6ZnVuY3Rpb24oZSl7dmFyIHQ9TnVtYmVyKHRoaXMuY3VycmVudFZhbHVlKTtpc05hTih0KXx8dD50aGlzLm1heHx8dDx0aGlzLm1pbj90aGlzLmN1cnJlbnRWYWx1ZT10aGlzLnZhbHVlOnRoaXMuY3VycmVudFZhbHVlPXR9LGhhbmRsZUlucHV0OmZ1bmN0aW9uKGUpe3RoaXMuY3VycmVudFZhbHVlPWV9fX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS4kY3JlYXRlRWxlbWVudDtlLl9jO3JldHVybiB0KCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtaW5wdXQtbnVtYmVyIiwiY2xhc3MiOltlLnNpemU/ImVsLWlucHV0LW51bWJlci0tIitlLnNpemU6IiIseyJpcy1kaXNhYmxlZCI6ZS5kaXNhYmxlZH0seyJpcy13aXRob3V0LWNvbnRyb2xzIjohZS5jb250cm9sc31dfSxbdCgiZWwtaW5wdXQiLHsiY2xhc3MiOnsiaXMtYWN0aXZlIjplLmlucHV0QWN0aXZlfSxhdHRyczp7ZGlzYWJsZWQ6ZS5kaXNhYmxlZCxzaXplOmUuc2l6ZX0sZG9tUHJvcHM6e3ZhbHVlOmUuY3VycmVudFZhbHVlfSxvbjp7Ymx1cjplLmhhbmRsZUJsdXIsaW5wdXQ6ZS5oYW5kbGVJbnB1dH0sbmF0aXZlT246e2tleWRvd246W2Z1bmN0aW9uKHQpezM4PT09dC5rZXlDb2RlJiZlLmluY3JlYXNlKHQpfSxmdW5jdGlvbih0KXs0MD09PXQua2V5Q29kZSYmZS5kZWNyZWFzZSh0KX1dfX0sW2UuJHNsb3RzLnByZXBlbmQ/dCgidGVtcGxhdGUiLHtzbG90OiJwcmVwZW5kIn0sW2UuX3QoInByZXBlbmQiKV0pOmUuX2UoKSxlLiRzbG90cy5hcHBlbmQ/dCgidGVtcGxhdGUiLHtzbG90OiJhcHBlbmQifSxbZS5fdCgiYXBwZW5kIildKTplLl9lKCldKSxlLmNvbnRyb2xzP3QoInNwYW4iLHtkaXJlY3RpdmVzOlt7bmFtZToicmVwZWF0LWNsaWNrIixyYXdOYW1lOiJ2LXJlcGVhdC1jbGljayIsdmFsdWU6ZS5kZWNyZWFzZSxleHByZXNzaW9uOiJkZWNyZWFzZSJ9XSxzdGF0aWNDbGFzczoiZWwtaW5wdXQtbnVtYmVyX19kZWNyZWFzZSBlbC1pY29uLW1pbnVzIiwiY2xhc3MiOnsiaXMtZGlzYWJsZWQiOmUubWluRGlzYWJsZWR9LG9uOnttb3VzZWVudGVyOmZ1bmN0aW9uKHQpe2UuYWN0aXZlSW5wdXQoZS5taW5EaXNhYmxlZCl9LG1vdXNlbGVhdmU6ZnVuY3Rpb24odCl7ZS5pbmFjdGl2ZUlucHV0KGUubWluRGlzYWJsZWQpfX19KTplLl9lKCksZS5jb250cm9scz90KCJzcGFuIix7ZGlyZWN0aXZlczpbe25hbWU6InJlcGVhdC1jbGljayIscmF3TmFtZToidi1yZXBlYXQtY2xpY2siLHZhbHVlOmUuaW5jcmVhc2UsZXhwcmVzc2lvbjoiaW5jcmVhc2UifV0sc3RhdGljQ2xhc3M6ImVsLWlucHV0LW51bWJlcl9faW5jcmVhc2UgZWwtaWNvbi1wbHVzIiwiY2xhc3MiOnsiaXMtZGlzYWJsZWQiOmUubWF4RGlzYWJsZWR9LG9uOnttb3VzZWVudGVyOmZ1bmN0aW9uKHQpe2UuYWN0aXZlSW5wdXQoZS5tYXhEaXNhYmxlZCl9LG1vdXNlbGVhdmU6ZnVuY3Rpb24odCl7ZS5pbmFjdGl2ZUlucHV0KGUubWF4RGlzYWJsZWQpfX19KTplLl9lKCldKX0sc3RhdGljUmVuZGVyRm5zOltdfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fXQuX19lc01vZHVsZT0hMDt2YXIgcz1uKDg1KSxvPWkocyk7b1siZGVmYXVsdCJdLmluc3RhbGw9ZnVuY3Rpb24oZSl7ZS5jb21wb25lbnQoImVsLXJhZGlvIixvWyJkZWZhdWx0Il0pfSx0WyJkZWZhdWx0Il09b1siZGVmYXVsdCJdfSxmdW5jdGlvbihlLHQsbil7dmFyIGkscztpPW4oODYpO3ZhciBvPW4oODcpO3M9aT1pfHx7fSwib2JqZWN0IiE9dHlwZW9mIGlbImRlZmF1bHQiXSYmImZ1bmN0aW9uIiE9dHlwZW9mIGlbImRlZmF1bHQiXXx8KHM9aT1pWyJkZWZhdWx0Il0pLCJmdW5jdGlvbiI9PXR5cGVvZiBzJiYocz1zLm9wdGlvbnMpLHMucmVuZGVyPW8ucmVuZGVyLHMuc3RhdGljUmVuZGVyRm5zPW8uc3RhdGljUmVuZGVyRm5zLGUuZXhwb3J0cz1pfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19dC5fX2VzTW9kdWxlPSEwO3ZhciBzPW4oMTApLG89aShzKTt0WyJkZWZhdWx0Il09e25hbWU6IkVsUmFkaW8iLG1peGluczpbb1siZGVmYXVsdCJdXSxjb21wb25lbnROYW1lOiJFbFJhZGlvIixwcm9wczp7dmFsdWU6e30sbGFiZWw6e30sZGlzYWJsZWQ6Qm9vbGVhbixuYW1lOlN0cmluZ30sZGF0YTpmdW5jdGlvbigpe3JldHVybntmb2N1czohMX19LGNvbXB1dGVkOntpc0dyb3VwOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuJHBhcmVudDtlOyl7aWYoIkVsUmFkaW9Hcm91cCI9PT1lLiRvcHRpb25zLmNvbXBvbmVudE5hbWUpcmV0dXJuIHRoaXMuX3JhZGlvR3JvdXA9ZSwhMDtlPWUuJHBhcmVudH1yZXR1cm4hMX0sbW9kZWw6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlzR3JvdXA/dGhpcy5fcmFkaW9Hcm91cC52YWx1ZTp0aGlzLnZhbHVlfSxzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5pc0dyb3VwP3RoaXMuZGlzcGF0Y2goIkVsUmFkaW9Hcm91cCIsImlucHV0IixbZV0pOnRoaXMuJGVtaXQoImlucHV0IixlKX19fX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS4kY3JlYXRlRWxlbWVudDtlLl9jO3JldHVybiB0KCJsYWJlbCIse3N0YXRpY0NsYXNzOiJlbC1yYWRpbyJ9LFt0KCJzcGFuIix7c3RhdGljQ2xhc3M6ImVsLXJhZGlvX19pbnB1dCJ9LFt0KCJzcGFuIix7c3RhdGljQ2xhc3M6ImVsLXJhZGlvX19pbm5lciIsImNsYXNzIjp7ImlzLWRpc2FibGVkIjplLmRpc2FibGVkLCJpcy1jaGVja2VkIjplLm1vZGVsPT09ZS5sYWJlbCwiaXMtZm9jdXMiOmUuZm9jdXN9fSksdCgiaW5wdXQiLHtkaXJlY3RpdmVzOlt7bmFtZToibW9kZWwiLHJhd05hbWU6InYtbW9kZWwiLHZhbHVlOmUubW9kZWwsZXhwcmVzc2lvbjoibW9kZWwifV0sc3RhdGljQ2xhc3M6ImVsLXJhZGlvX19vcmlnaW5hbCIsYXR0cnM6e3R5cGU6InJhZGlvIixuYW1lOmUubmFtZSxkaXNhYmxlZDplLmRpc2FibGVkfSxkb21Qcm9wczp7dmFsdWU6ZS5sYWJlbCxjaGVja2VkOmUuX3EoZS5tb2RlbCxlLmxhYmVsKX0sb246e2ZvY3VzOmZ1bmN0aW9uKHQpe2UuZm9jdXM9ITB9LGJsdXI6ZnVuY3Rpb24odCl7ZS5mb2N1cz0hMX0sY2hhbmdlOmZ1bmN0aW9uKHQpe2UubW9kZWw9ZS5sYWJlbH19fSldKSx0KCJzcGFuIix7c3RhdGljQ2xhc3M6ImVsLXJhZGlvX19sYWJlbCJ9LFtlLl90KCJkZWZhdWx0IiksZS4kc2xvdHNbImRlZmF1bHQiXT9lLl9lKCk6W2UuX3MoZS5sYWJlbCldXSldKX0sc3RhdGljUmVuZGVyRm5zOltdfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fXQuX19lc01vZHVsZT0hMDt2YXIgcz1uKDg5KSxvPWkocyk7b1siZGVmYXVsdCJdLmluc3RhbGw9ZnVuY3Rpb24oZSl7ZS5jb21wb25lbnQob1siZGVmYXVsdCJdLm5hbWUsb1siZGVmYXVsdCJdKX0sdFsiZGVmYXVsdCJdPW9bImRlZmF1bHQiXX0sZnVuY3Rpb24oZSx0LG4pe3ZhciBpLHM7aT1uKDkwKTt2YXIgbz1uKDkxKTtzPWk9aXx8e30sIm9iamVjdCIhPXR5cGVvZiBpWyJkZWZhdWx0Il0mJiJmdW5jdGlvbiIhPXR5cGVvZiBpWyJkZWZhdWx0Il18fChzPWk9aVsiZGVmYXVsdCJdKSwiZnVuY3Rpb24iPT10eXBlb2YgcyYmKHM9cy5vcHRpb25zKSxzLnJlbmRlcj1vLnJlbmRlcixzLnN0YXRpY1JlbmRlckZucz1vLnN0YXRpY1JlbmRlckZucyxlLmV4cG9ydHM9aX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fXQuX19lc01vZHVsZT0hMDt2YXIgcz1uKDEwKSxvPWkocyk7dFsiZGVmYXVsdCJdPXtuYW1lOiJFbFJhZGlvR3JvdXAiLGNvbXBvbmVudE5hbWU6IkVsUmFkaW9Hcm91cCIsbWl4aW5zOltvWyJkZWZhdWx0Il1dLHByb3BzOnt2YWx1ZTpbU3RyaW5nLE51bWJlcl0sc2l6ZTpTdHJpbmcsZmlsbDp7dHlwZTpTdHJpbmcsImRlZmF1bHQiOiIjMjBhMGZmIn0sdGV4dENvbG9yOnt0eXBlOlN0cmluZywiZGVmYXVsdCI6IiNmZmYifX0sd2F0Y2g6e3ZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMuJGVtaXQoImNoYW5nZSIsZSksdGhpcy5kaXNwYXRjaCgiRWxGb3JtSXRlbSIsImVsLmZvcm0uY2hhbmdlIixbdGhpcy52YWx1ZV0pfX19fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWUuJGNyZWF0ZUVsZW1lbnQ7ZS5fYztyZXR1cm4gdCgiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXJhZGlvLWdyb3VwIn0sW2UuX3QoImRlZmF1bHQiKV0pfSxzdGF0aWNSZW5kZXJGbnM6W119fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19dC5fX2VzTW9kdWxlPSEwO3ZhciBzPW4oOTMpLG89aShzKTtvWyJkZWZhdWx0Il0uaW5zdGFsbD1mdW5jdGlvbihlKXtlLmNvbXBvbmVudChvWyJkZWZhdWx0Il0ubmFtZSxvWyJkZWZhdWx0Il0pfSx0WyJkZWZhdWx0Il09b1siZGVmYXVsdCJdfSxmdW5jdGlvbihlLHQsbil7dmFyIGkscztpPW4oOTQpO3ZhciBvPW4oOTUpO3M9aT1pfHx7fSwib2JqZWN0IiE9dHlwZW9mIGlbImRlZmF1bHQiXSYmImZ1bmN0aW9uIiE9dHlwZW9mIGlbImRlZmF1bHQiXXx8KHM9aT1pWyJkZWZhdWx0Il0pLCJmdW5jdGlvbiI9PXR5cGVvZiBzJiYocz1zLm9wdGlvbnMpLHMucmVuZGVyPW8ucmVuZGVyLHMuc3RhdGljUmVuZGVyRm5zPW8uc3RhdGljUmVuZGVyRm5zLGUuZXhwb3J0cz1pfSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0Ijt0Ll9fZXNNb2R1bGU9ITAsdFsiZGVmYXVsdCJdPXtuYW1lOiJFbFJhZGlvQnV0dG9uIixwcm9wczp7bGFiZWw6e30sZGlzYWJsZWQ6Qm9vbGVhbixuYW1lOlN0cmluZ30sY29tcHV0ZWQ6e3ZhbHVlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmFkaW9Hcm91cC52YWx1ZX0sc2V0OmZ1bmN0aW9uKGUpe3RoaXMuX3JhZGlvR3JvdXAuJGVtaXQoImlucHV0IixlKX19LF9yYWRpb0dyb3VwOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuJHBhcmVudDtlOyl7aWYoIkVsUmFkaW9Hcm91cCI9PT1lLiRvcHRpb25zLmNvbXBvbmVudE5hbWUpcmV0dXJuIGU7ZT1lLiRwYXJlbnR9cmV0dXJuITF9LGFjdGl2ZVN0eWxlOmZ1bmN0aW9uKCl7cmV0dXJue2JhY2tncm91bmRDb2xvcjp0aGlzLl9yYWRpb0dyb3VwLmZpbGwsYm9yZGVyQ29sb3I6dGhpcy5fcmFkaW9Hcm91cC5maWxsLGNvbG9yOnRoaXMuX3JhZGlvR3JvdXAudGV4dENvbG9yfX0sc2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYWRpb0dyb3VwLnNpemV9fX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS4kY3JlYXRlRWxlbWVudDtlLl9jO3JldHVybiB0KCJsYWJlbCIse3N0YXRpY0NsYXNzOiJlbC1yYWRpby1idXR0b24iLCJjbGFzcyI6W2Uuc2l6ZT8iZWwtcmFkaW8tYnV0dG9uLS0iK2Uuc2l6ZToiIix7ImlzLWFjdGl2ZSI6ZS52YWx1ZT09PWUubGFiZWx9XX0sW3QoImlucHV0Iix7ZGlyZWN0aXZlczpbe25hbWU6Im1vZGVsIixyYXdOYW1lOiJ2LW1vZGVsIix2YWx1ZTplLnZhbHVlLGV4cHJlc3Npb246InZhbHVlIn1dLHN0YXRpY0NsYXNzOiJlbC1yYWRpby1idXR0b25fX29yaWctcmFkaW8iLGF0dHJzOnt0eXBlOiJyYWRpbyIsbmFtZTplLm5hbWUsZGlzYWJsZWQ6ZS5kaXNhYmxlZH0sZG9tUHJvcHM6e3ZhbHVlOmUubGFiZWwsY2hlY2tlZDplLl9xKGUudmFsdWUsZS5sYWJlbCl9LG9uOntjaGFuZ2U6ZnVuY3Rpb24odCl7ZS52YWx1ZT1lLmxhYmVsfX19KSx0KCJzcGFuIix7c3RhdGljQ2xhc3M6ImVsLXJhZGlvLWJ1dHRvbl9faW5uZXIiLHN0eWxlOmUudmFsdWU9PT1lLmxhYmVsP2UuYWN0aXZlU3R5bGU6bnVsbH0sW2UuX3QoImRlZmF1bHQiKSxlLiRzbG90c1siZGVmYXVsdCJdP2UuX2UoKTpbZS5fcyhlLmxhYmVsKV1dKV0pfSxzdGF0aWNSZW5kZXJGbnM6W119fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19dC5fX2VzTW9kdWxlPSEwO3ZhciBzPW4oOTcpLG89aShzKTtvWyJkZWZhdWx0Il0uaW5zdGFsbD1mdW5jdGlvbihlKXtlLmNvbXBvbmVudChvWyJkZWZhdWx0Il0ubmFtZSxvWyJkZWZhdWx0Il0pfSx0WyJkZWZhdWx0Il09b1siZGVmYXVsdCJdfSxmdW5jdGlvbihlLHQsbil7dmFyIGkscztpPW4oOTgpO3ZhciBvPW4oOTkpO3M9aT1pfHx7fSwib2JqZWN0IiE9dHlwZW9mIGlbImRlZmF1bHQiXSYmImZ1bmN0aW9uIiE9dHlwZW9mIGlbImRlZmF1bHQiXXx8KHM9aT1pWyJkZWZhdWx0Il0pLCJmdW5jdGlvbiI9PXR5cGVvZiBzJiYocz1zLm9wdGlvbnMpLHMucmVuZGVyPW8ucmVuZGVyLHMuc3RhdGljUmVuZGVyRm5zPW8uc3RhdGljUmVuZGVyRm5zLGUuZXhwb3J0cz1pfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19dC5fX2VzTW9kdWxlPSEwO3ZhciBzPW4oMTApLG89aShzKTt0WyJkZWZhdWx0Il09e25hbWU6IkVsQ2hlY2tib3giLG1peGluczpbb1siZGVmYXVsdCJdXSxjb21wb25lbnROYW1lOiJFbENoZWNrYm94Iixjb21wdXRlZDp7bW9kZWw6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlzR3JvdXA/dGhpcy5zdG9yZTp0aGlzLnZhbHVlfSxzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5pc0dyb3VwP3RoaXMuZGlzcGF0Y2goIkVsQ2hlY2tib3hHcm91cCIsImlucHV0IixbZV0pOnRoaXMuJGVtaXQoImlucHV0IixlKTsKfX0saXNDaGVja2VkOmZ1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgQm9vbGVhbl0iPT09e30udG9TdHJpbmcuY2FsbCh0aGlzLm1vZGVsKT90aGlzLm1vZGVsOkFycmF5LmlzQXJyYXkodGhpcy5tb2RlbCk/dGhpcy5tb2RlbC5pbmRleE9mKHRoaXMubGFiZWwpPi0xOm51bGwhPT10aGlzLm1vZGVsJiZ2b2lkIDAhPT10aGlzLm1vZGVsP3RoaXMubW9kZWw9PT10aGlzLnRydWVMYWJlbDp2b2lkIDB9LGlzR3JvdXA6ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy4kcGFyZW50O2U7KXtpZigiRWxDaGVja2JveEdyb3VwIj09PWUuJG9wdGlvbnMuY29tcG9uZW50TmFtZSlyZXR1cm4gdGhpcy5fY2hlY2tib3hHcm91cD1lLCEwO2U9ZS4kcGFyZW50fXJldHVybiExfSxzdG9yZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jaGVja2JveEdyb3VwLnZhbHVlfX0scHJvcHM6e3ZhbHVlOnt9LGxhYmVsOnt9LGluZGV0ZXJtaW5hdGU6Qm9vbGVhbixkaXNhYmxlZDpCb29sZWFuLGNoZWNrZWQ6Qm9vbGVhbixuYW1lOlN0cmluZyx0cnVlTGFiZWw6W1N0cmluZyxOdW1iZXJdLGZhbHNlTGFiZWw6W1N0cmluZyxOdW1iZXJdfSxtZXRob2RzOnthZGRUb1N0b3JlOmZ1bmN0aW9uKCl7QXJyYXkuaXNBcnJheSh0aGlzLm1vZGVsKT90aGlzLm1vZGVsLmluZGV4T2YodGhpcy5sYWJlbCk9PT0tMSYmdGhpcy5tb2RlbC5wdXNoKHRoaXMubGFiZWwpOnRoaXMubW9kZWw9dGhpcy50cnVlTGFiZWx8fCEwfX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuY2hlY2tlZCYmdGhpcy5hZGRUb1N0b3JlKCl9fX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1lLiRjcmVhdGVFbGVtZW50O2UuX2M7cmV0dXJuIHQoImxhYmVsIix7c3RhdGljQ2xhc3M6ImVsLWNoZWNrYm94In0sW3QoInNwYW4iLHtzdGF0aWNDbGFzczoiZWwtY2hlY2tib3hfX2lucHV0In0sW3QoInNwYW4iLHtzdGF0aWNDbGFzczoiZWwtY2hlY2tib3hfX2lubmVyIiwiY2xhc3MiOnsiaXMtZGlzYWJsZWQiOmUuZGlzYWJsZWQsImlzLWNoZWNrZWQiOmUuaXNDaGVja2VkLCJpcy1pbmRldGVybWluYXRlIjplLmluZGV0ZXJtaW5hdGUsImlzLWZvY3VzIjplLmZvY3VzfX0pLGUudHJ1ZUxhYmVsfHxlLmZhbHNlTGFiZWw/dCgiaW5wdXQiLHtkaXJlY3RpdmVzOlt7bmFtZToibW9kZWwiLHJhd05hbWU6InYtbW9kZWwiLHZhbHVlOmUubW9kZWwsZXhwcmVzc2lvbjoibW9kZWwifV0sc3RhdGljQ2xhc3M6ImVsLWNoZWNrYm94X19vcmlnaW5hbCIsYXR0cnM6e3R5cGU6ImNoZWNrYm94IixuYW1lOmUubmFtZSxkaXNhYmxlZDplLmRpc2FibGVkLCJ0cnVlLXZhbHVlIjplLnRydWVMYWJlbCwiZmFsc2UtdmFsdWUiOmUuZmFsc2VMYWJlbH0sZG9tUHJvcHM6e2NoZWNrZWQ6QXJyYXkuaXNBcnJheShlLm1vZGVsKT9lLl9pKGUubW9kZWwsbnVsbCk+LTE6ZS5fcShlLm1vZGVsLGUudHJ1ZUxhYmVsKX0sb246e2NoYW5nZTpbZnVuY3Rpb24odCl7dmFyIG49ZS5tb2RlbCxpPXQudGFyZ2V0LHM9aS5jaGVja2VkP2UudHJ1ZUxhYmVsOmUuZmFsc2VMYWJlbDtpZihBcnJheS5pc0FycmF5KG4pKXt2YXIgbz1udWxsLGE9ZS5faShuLG8pO3M/YTwwJiYoZS5tb2RlbD1uLmNvbmNhdChvKSk6YT4tMSYmKGUubW9kZWw9bi5zbGljZSgwLGEpLmNvbmNhdChuLnNsaWNlKGErMSkpKX1lbHNlIGUubW9kZWw9c30sZnVuY3Rpb24odCl7ZS4kZW1pdCgiY2hhbmdlIix0KX1dLGZvY3VzOmZ1bmN0aW9uKHQpe2UuZm9jdXM9ITB9LGJsdXI6ZnVuY3Rpb24odCl7ZS5mb2N1cz0hMX19fSk6dCgiaW5wdXQiLHtkaXJlY3RpdmVzOlt7bmFtZToibW9kZWwiLHJhd05hbWU6InYtbW9kZWwiLHZhbHVlOmUubW9kZWwsZXhwcmVzc2lvbjoibW9kZWwifV0sc3RhdGljQ2xhc3M6ImVsLWNoZWNrYm94X19vcmlnaW5hbCIsYXR0cnM6e3R5cGU6ImNoZWNrYm94IixkaXNhYmxlZDplLmRpc2FibGVkLG5hbWU6ZS5uYW1lfSxkb21Qcm9wczp7dmFsdWU6ZS5sYWJlbCxjaGVja2VkOkFycmF5LmlzQXJyYXkoZS5tb2RlbCk/ZS5faShlLm1vZGVsLGUubGFiZWwpPi0xOmUuX3EoZS5tb2RlbCwhMCl9LG9uOntjaGFuZ2U6W2Z1bmN0aW9uKHQpe3ZhciBuPWUubW9kZWwsaT10LnRhcmdldCxzPSEhaS5jaGVja2VkO2lmKEFycmF5LmlzQXJyYXkobikpe3ZhciBvPWUubGFiZWwsYT1lLl9pKG4sbyk7cz9hPDAmJihlLm1vZGVsPW4uY29uY2F0KG8pKTphPi0xJiYoZS5tb2RlbD1uLnNsaWNlKDAsYSkuY29uY2F0KG4uc2xpY2UoYSsxKSkpfWVsc2UgZS5tb2RlbD1zfSxmdW5jdGlvbih0KXtlLiRlbWl0KCJjaGFuZ2UiLHQpfV0sZm9jdXM6ZnVuY3Rpb24odCl7ZS5mb2N1cz0hMH0sYmx1cjpmdW5jdGlvbih0KXtlLmZvY3VzPSExfX19KV0pLGUuJHNsb3RzWyJkZWZhdWx0Il18fGUubGFiZWw/dCgic3BhbiIse3N0YXRpY0NsYXNzOiJlbC1jaGVja2JveF9fbGFiZWwifSxbZS5fdCgiZGVmYXVsdCIpLGUuJHNsb3RzWyJkZWZhdWx0Il0/ZS5fZSgpOltlLl9zKGUubGFiZWwpXV0pOmUuX2UoKV0pfSxzdGF0aWNSZW5kZXJGbnM6W119fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19dC5fX2VzTW9kdWxlPSEwO3ZhciBzPW4oMTAxKSxvPWkocyk7b1siZGVmYXVsdCJdLmluc3RhbGw9ZnVuY3Rpb24oZSl7ZS5jb21wb25lbnQob1siZGVmYXVsdCJdLm5hbWUsb1siZGVmYXVsdCJdKX0sdFsiZGVmYXVsdCJdPW9bImRlZmF1bHQiXX0sZnVuY3Rpb24oZSx0LG4pe3ZhciBpLHM7aT1uKDEwMik7dmFyIG89bigxMDMpO3M9aT1pfHx7fSwib2JqZWN0IiE9dHlwZW9mIGlbImRlZmF1bHQiXSYmImZ1bmN0aW9uIiE9dHlwZW9mIGlbImRlZmF1bHQiXXx8KHM9aT1pWyJkZWZhdWx0Il0pLCJmdW5jdGlvbiI9PXR5cGVvZiBzJiYocz1zLm9wdGlvbnMpLHMucmVuZGVyPW8ucmVuZGVyLHMuc3RhdGljUmVuZGVyRm5zPW8uc3RhdGljUmVuZGVyRm5zLGUuZXhwb3J0cz1pfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19dC5fX2VzTW9kdWxlPSEwO3ZhciBzPW4oMTApLG89aShzKTt0WyJkZWZhdWx0Il09e25hbWU6IkVsQ2hlY2tib3hHcm91cCIsY29tcG9uZW50TmFtZToiRWxDaGVja2JveEdyb3VwIixtaXhpbnM6W29bImRlZmF1bHQiXV0scHJvcHM6e3ZhbHVlOnt9fSx3YXRjaDp7dmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy4kZW1pdCgiY2hhbmdlIixlKSx0aGlzLmRpc3BhdGNoKCJFbEZvcm1JdGVtIiwiZWwuZm9ybS5jaGFuZ2UiLFtlXSl9fX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS4kY3JlYXRlRWxlbWVudDtlLl9jO3JldHVybiB0KCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtY2hlY2tib3gtZ3JvdXAifSxbZS5fdCgiZGVmYXVsdCIpXSl9LHN0YXRpY1JlbmRlckZuczpbXX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX10Ll9fZXNNb2R1bGU9ITA7dmFyIHM9bigxMDUpLG89aShzKTtvWyJkZWZhdWx0Il0uaW5zdGFsbD1mdW5jdGlvbihlKXtlLmNvbXBvbmVudChvWyJkZWZhdWx0Il0ubmFtZSxvWyJkZWZhdWx0Il0pfSx0WyJkZWZhdWx0Il09b1siZGVmYXVsdCJdfSxmdW5jdGlvbihlLHQsbil7dmFyIGkscztpPW4oMTA2KTt2YXIgbz1uKDEwNyk7cz1pPWl8fHt9LCJvYmplY3QiIT10eXBlb2YgaVsiZGVmYXVsdCJdJiYiZnVuY3Rpb24iIT10eXBlb2YgaVsiZGVmYXVsdCJdfHwocz1pPWlbImRlZmF1bHQiXSksImZ1bmN0aW9uIj09dHlwZW9mIHMmJihzPXMub3B0aW9ucykscy5yZW5kZXI9by5yZW5kZXIscy5zdGF0aWNSZW5kZXJGbnM9by5zdGF0aWNSZW5kZXJGbnMsZS5leHBvcnRzPWl9LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO3QuX19lc01vZHVsZT0hMCx0WyJkZWZhdWx0Il09e25hbWU6ImVsLXN3aXRjaCIscHJvcHM6e3ZhbHVlOnt0eXBlOkJvb2xlYW4sImRlZmF1bHQiOiEwfSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLCJkZWZhdWx0IjohMX0sd2lkdGg6e3R5cGU6TnVtYmVyLCJkZWZhdWx0IjowfSxvbkljb25DbGFzczp7dHlwZTpTdHJpbmcsImRlZmF1bHQiOiIifSxvZmZJY29uQ2xhc3M6e3R5cGU6U3RyaW5nLCJkZWZhdWx0IjoiIn0sb25UZXh0Ont0eXBlOlN0cmluZywiZGVmYXVsdCI6Ik9OIn0sb2ZmVGV4dDp7dHlwZTpTdHJpbmcsImRlZmF1bHQiOiJPRkYifSxvbkNvbG9yOnt0eXBlOlN0cmluZywiZGVmYXVsdCI6IiJ9LG9mZkNvbG9yOnt0eXBlOlN0cmluZywiZGVmYXVsdCI6IiJ9LG5hbWU6e3R5cGU6U3RyaW5nLCJkZWZhdWx0IjoiIn19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57Y29yZVdpZHRoOnRoaXMud2lkdGgsYnV0dG9uU3R5bGU6e3RyYW5zZm9ybToiIn19fSxjb21wdXRlZDp7aGFzVGV4dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9uVGV4dHx8dGhpcy5vZmZUZXh0fSxfdmFsdWU6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlfSxzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kZW1pdCgiaW5wdXQiLGUpfX19LHdhdGNoOnt2YWx1ZTpmdW5jdGlvbigpeyh0aGlzLm9uQ29sb3J8fHRoaXMub2ZmQ29sb3IpJiZ0aGlzLnNldEJhY2tncm91bmRDb2xvcigpLHRoaXMuaGFuZGxlQnV0dG9uVHJhbnNmb3JtKCl9fSxtZXRob2RzOntoYW5kbGVDaGFuZ2U6ZnVuY3Rpb24oZSl7dGhpcy4kZW1pdCgiY2hhbmdlIixlLmN1cnJlbnRUYXJnZXQuY2hlY2tlZCl9LGhhbmRsZUJ1dHRvblRyYW5zZm9ybTpmdW5jdGlvbigpe3RoaXMuYnV0dG9uU3R5bGUudHJhbnNmb3JtPXRoaXMudmFsdWU/InRyYW5zbGF0ZSgiKyh0aGlzLmNvcmVXaWR0aC0yMCkrInB4LCAycHgpIjoidHJhbnNsYXRlKDJweCwgMnB4KSJ9LHNldEJhY2tncm91bmRDb2xvcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMudmFsdWU/dGhpcy5vbkNvbG9yOnRoaXMub2ZmQ29sb3I7dGhpcy4kcmVmcy5jb3JlLnN0eWxlLmJvcmRlckNvbG9yPWUsdGhpcy4kcmVmcy5jb3JlLnN0eWxlLmJhY2tncm91bmRDb2xvcj1lfX0sbW91bnRlZDpmdW5jdGlvbigpezA9PT10aGlzLndpZHRoJiYodGhpcy5jb3JlV2lkdGg9dGhpcy5oYXNUZXh0PzU4OjQ2KSx0aGlzLmhhbmRsZUJ1dHRvblRyYW5zZm9ybSgpLCh0aGlzLm9uQ29sb3J8fHRoaXMub2ZmQ29sb3IpJiZ0aGlzLnNldEJhY2tncm91bmRDb2xvcigpfX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS4kY3JlYXRlRWxlbWVudDtlLl9jO3JldHVybiB0KCJsYWJlbCIse3N0YXRpY0NsYXNzOiJlbC1zd2l0Y2giLCJjbGFzcyI6eyJpcy1kaXNhYmxlZCI6ZS5kaXNhYmxlZCwiZWwtc3dpdGNoLS13aWRlIjplLmhhc1RleHR9fSxbdCgiZGl2Iix7ZGlyZWN0aXZlczpbe25hbWU6InNob3ciLHJhd05hbWU6InYtc2hvdyIsdmFsdWU6ZS5kaXNhYmxlZCxleHByZXNzaW9uOiJkaXNhYmxlZCJ9XSxzdGF0aWNDbGFzczoiZWwtc3dpdGNoX19tYXNrIn0pLHQoImlucHV0Iix7ZGlyZWN0aXZlczpbe25hbWU6Im1vZGVsIixyYXdOYW1lOiJ2LW1vZGVsIix2YWx1ZTplLl92YWx1ZSxleHByZXNzaW9uOiJfdmFsdWUifV0sc3RhdGljQ2xhc3M6ImVsLXN3aXRjaF9faW5wdXQiLGF0dHJzOnt0eXBlOiJjaGVja2JveCIsbmFtZTplLm5hbWUsZGlzYWJsZWQ6ZS5kaXNhYmxlZH0sZG9tUHJvcHM6e2NoZWNrZWQ6QXJyYXkuaXNBcnJheShlLl92YWx1ZSk/ZS5faShlLl92YWx1ZSxudWxsKT4tMTplLl9xKGUuX3ZhbHVlLCEwKX0sb246e2NoYW5nZTpbZnVuY3Rpb24odCl7dmFyIG49ZS5fdmFsdWUsaT10LnRhcmdldCxzPSEhaS5jaGVja2VkO2lmKEFycmF5LmlzQXJyYXkobikpe3ZhciBvPW51bGwsYT1lLl9pKG4sbyk7cz9hPDAmJihlLl92YWx1ZT1uLmNvbmNhdChvKSk6YT4tMSYmKGUuX3ZhbHVlPW4uc2xpY2UoMCxhKS5jb25jYXQobi5zbGljZShhKzEpKSl9ZWxzZSBlLl92YWx1ZT1zfSxlLmhhbmRsZUNoYW5nZV19fSksdCgic3BhbiIse3JlZjoiY29yZSIsc3RhdGljQ2xhc3M6ImVsLXN3aXRjaF9fY29yZSIsc3R5bGU6e3dpZHRoOmUuY29yZVdpZHRoKyJweCJ9fSxbdCgic3BhbiIse3N0YXRpY0NsYXNzOiJlbC1zd2l0Y2hfX2J1dHRvbiIsc3R5bGU6ZS5idXR0b25TdHlsZX0pXSksdCgidHJhbnNpdGlvbiIse2F0dHJzOntuYW1lOiJsYWJlbC1mYWRlIn19LFt0KCJkaXYiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTplLnZhbHVlLGV4cHJlc3Npb246InZhbHVlIn1dLHN0YXRpY0NsYXNzOiJlbC1zd2l0Y2hfX2xhYmVsIGVsLXN3aXRjaF9fbGFiZWwtLWxlZnQiLHN0eWxlOnt3aWR0aDplLmNvcmVXaWR0aCsicHgifX0sW2Uub25JY29uQ2xhc3M/dCgiaSIseyJjbGFzcyI6W2Uub25JY29uQ2xhc3NdfSk6ZS5fZSgpLCFlLm9uSWNvbkNsYXNzJiZlLm9uVGV4dD90KCJzcGFuIixbZS5fcyhlLm9uVGV4dCldKTplLl9lKCldKV0pLHQoInRyYW5zaXRpb24iLHthdHRyczp7bmFtZToibGFiZWwtZmFkZSJ9fSxbdCgiZGl2Iix7ZGlyZWN0aXZlczpbe25hbWU6InNob3ciLHJhd05hbWU6InYtc2hvdyIsdmFsdWU6IWUudmFsdWUsZXhwcmVzc2lvbjoiIXZhbHVlIn1dLHN0YXRpY0NsYXNzOiJlbC1zd2l0Y2hfX2xhYmVsIGVsLXN3aXRjaF9fbGFiZWwtLXJpZ2h0IixzdHlsZTp7d2lkdGg6ZS5jb3JlV2lkdGgrInB4In19LFtlLm9mZkljb25DbGFzcz90KCJpIix7ImNsYXNzIjpbZS5vZmZJY29uQ2xhc3NdfSk6ZS5fZSgpLCFlLm9mZkljb25DbGFzcyYmZS5vZmZUZXh0P3QoInNwYW4iLFtlLl9zKGUub2ZmVGV4dCldKTplLl9lKCldKV0pXSl9LHN0YXRpY1JlbmRlckZuczpbXX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX10Ll9fZXNNb2R1bGU9ITA7dmFyIHM9bigxMDkpLG89aShzKTtvWyJkZWZhdWx0Il0uaW5zdGFsbD1mdW5jdGlvbihlKXtlLmNvbXBvbmVudChvWyJkZWZhdWx0Il0ubmFtZSxvWyJkZWZhdWx0Il0pfSx0WyJkZWZhdWx0Il09b1siZGVmYXVsdCJdfSxmdW5jdGlvbihlLHQsbil7dmFyIGkscztpPW4oMTEwKTt2YXIgbz1uKDExMSk7cz1pPWl8fHt9LCJvYmplY3QiIT10eXBlb2YgaVsiZGVmYXVsdCJdJiYiZnVuY3Rpb24iIT10eXBlb2YgaVsiZGVmYXVsdCJdfHwocz1pPWlbImRlZmF1bHQiXSksImZ1bmN0aW9uIj09dHlwZW9mIHMmJihzPXMub3B0aW9ucykscy5yZW5kZXI9by5yZW5kZXIscy5zdGF0aWNSZW5kZXJGbnM9by5zdGF0aWNSZW5kZXJGbnMsZS5leHBvcnRzPWl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX10Ll9fZXNNb2R1bGU9ITA7dmFyIHM9bigxMCksbz1pKHMpO3RbImRlZmF1bHQiXT17bWl4aW5zOltvWyJkZWZhdWx0Il1dLG5hbWU6ImVsLW9wdGlvbi1ncm91cCIsY29tcG9uZW50TmFtZToiRWxPcHRpb25Hcm91cCIscHJvcHM6e2xhYmVsOlN0cmluZyxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLCJkZWZhdWx0IjohMX19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57dmlzaWJsZTohMH19LHdhdGNoOntkaXNhYmxlZDpmdW5jdGlvbihlKXt0aGlzLmJyb2FkY2FzdCgiRWxPcHRpb24iLCJoYW5kbGVHcm91cERpc2FibGVkIixlKX19LG1ldGhvZHM6e3F1ZXJ5Q2hhbmdlOmZ1bmN0aW9uKCl7dGhpcy52aXNpYmxlPXRoaXMuJGNoaWxkcmVuJiZBcnJheS5pc0FycmF5KHRoaXMuJGNoaWxkcmVuKSYmdGhpcy4kY2hpbGRyZW4uc29tZShmdW5jdGlvbihlKXtyZXR1cm4gZS52aXNpYmxlPT09ITB9KX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLiRvbigicXVlcnlDaGFuZ2UiLHRoaXMucXVlcnlDaGFuZ2UpfSxtb3VudGVkOmZ1bmN0aW9uKCl7dGhpcy5kaXNhYmxlZCYmdGhpcy5icm9hZGNhc3QoIkVsT3B0aW9uIiwiaGFuZGxlR3JvdXBEaXNhYmxlZCIsdGhpcy5kaXNhYmxlZCl9fX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1lLiRjcmVhdGVFbGVtZW50O2UuX2M7cmV0dXJuIHQoInVsIix7c3RhdGljQ2xhc3M6ImVsLXNlbGVjdC1ncm91cF9fd3JhcCJ9LFt0KCJsaSIse2RpcmVjdGl2ZXM6W3tuYW1lOiJzaG93IixyYXdOYW1lOiJ2LXNob3ciLHZhbHVlOmUudmlzaWJsZSxleHByZXNzaW9uOiJ2aXNpYmxlIn1dLHN0YXRpY0NsYXNzOiJlbC1zZWxlY3QtZ3JvdXBfX3RpdGxlIn0sW2UuX3MoZS5sYWJlbCldKSx0KCJsaSIsW3QoInVsIix7c3RhdGljQ2xhc3M6ImVsLXNlbGVjdC1ncm91cCJ9LFtlLl90KCJkZWZhdWx0IildKV0pXSl9LHN0YXRpY1JlbmRlckZuczpbXX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX10Ll9fZXNNb2R1bGU9ITA7dmFyIHM9bigxMTMpLG89aShzKTtvWyJkZWZhdWx0Il0uaW5zdGFsbD1mdW5jdGlvbihlKXtlLmNvbXBvbmVudChvWyJkZWZhdWx0Il0ubmFtZSxvWyJkZWZhdWx0Il0pfSx0WyJkZWZhdWx0Il09b1siZGVmYXVsdCJdfSxmdW5jdGlvbihlLHQsbil7dmFyIGkscztpPW4oMTE0KTt2YXIgbz1uKDExNSk7cz1pPWl8fHt9LCJvYmplY3QiIT10eXBlb2YgaVsiZGVmYXVsdCJdJiYiZnVuY3Rpb24iIT10eXBlb2YgaVsiZGVmYXVsdCJdfHwocz1pPWlbImRlZmF1bHQiXSksImZ1bmN0aW9uIj09dHlwZW9mIHMmJihzPXMub3B0aW9ucykscy5yZW5kZXI9by5yZW5kZXIscy5zdGF0aWNSZW5kZXJGbnM9by5zdGF0aWNSZW5kZXJGbnMsZS5leHBvcnRzPWl9LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO3QuX19lc01vZHVsZT0hMCx0WyJkZWZhdWx0Il09e25hbWU6IkVsQnV0dG9uIixwcm9wczp7dHlwZTp7dHlwZTpTdHJpbmcsImRlZmF1bHQiOiJkZWZhdWx0In0sc2l6ZTpTdHJpbmcsaWNvbjp7dHlwZTpTdHJpbmcsImRlZmF1bHQiOiIifSxuYXRpdmVUeXBlOnt0eXBlOlN0cmluZywiZGVmYXVsdCI6ImJ1dHRvbiJ9LGxvYWRpbmc6Qm9vbGVhbixkaXNhYmxlZDpCb29sZWFuLHBsYWluOkJvb2xlYW4sYXV0b2ZvY3VzOkJvb2xlYW59LG1ldGhvZHM6e2hhbmRsZUNsaWNrOmZ1bmN0aW9uKGUpe3RoaXMuJGVtaXQoImNsaWNrIixlKX19fX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1lLiRjcmVhdGVFbGVtZW50O2UuX2M7cmV0dXJuIHQoImJ1dHRvbiIse3N0YXRpY0NsYXNzOiJlbC1idXR0b24iLCJjbGFzcyI6W2UudHlwZT8iZWwtYnV0dG9uLS0iK2UudHlwZToiIixlLnNpemU/ImVsLWJ1dHRvbi0tIitlLnNpemU6IiIseyJpcy1kaXNhYmxlZCI6ZS5kaXNhYmxlZCwiaXMtbG9hZGluZyI6ZS5sb2FkaW5nLCJpcy1wbGFpbiI6ZS5wbGFpbn1dLGF0dHJzOntkaXNhYmxlZDplLmRpc2FibGVkLGF1dG9mb2N1czplLmF1dG9mb2N1cyx0eXBlOmUubmF0aXZlVHlwZX0sb246e2NsaWNrOmUuaGFuZGxlQ2xpY2t9fSxbZS5sb2FkaW5nP3QoImkiLHtzdGF0aWNDbGFzczoiZWwtaWNvbi1sb2FkaW5nIn0pOmUuX2UoKSxlLmljb24mJiFlLmxvYWRpbmc/dCgiaSIseyJjbGFzcyI6ImVsLWljb24tIitlLmljb259KTplLl9lKCksZS4kc2xvdHNbImRlZmF1bHQiXT90KCJzcGFuIixbZS5fdCgiZGVmYXVsdCIpXSk6ZS5fZSgpXSl9LHN0YXRpY1JlbmRlckZuczpbXX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX10Ll9fZXNNb2R1bGU9ITA7dmFyIHM9bigxMTcpLG89aShzKTtvWyJkZWZhdWx0Il0uaW5zdGFsbD1mdW5jdGlvbihlKXtlLmNvbXBvbmVudChvWyJkZWZhdWx0Il0ubmFtZSxvWyJkZWZhdWx0Il0pfSx0WyJkZWZhdWx0Il09b1siZGVmYXVsdCJdfSxmdW5jdGlvbihlLHQsbil7dmFyIGkscztpPW4oMTE4KTt2YXIgbz1uKDExOSk7cz1pPWl8fHt9LCJvYmplY3QiIT10eXBlb2YgaVsiZGVmYXVsdCJdJiYiZnVuY3Rpb24iIT10eXBlb2YgaVsiZGVmYXVsdCJdfHwocz1pPWlbImRlZmF1bHQiXSksImZ1bmN0aW9uIj09dHlwZW9mIHMmJihzPXMub3B0aW9ucykscy5yZW5kZXI9by5yZW5kZXIscy5zdGF0aWNSZW5kZXJGbnM9by5zdGF0aWNSZW5kZXJGbnMsZS5leHBvcnRzPWl9LGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO3QuX19lc01vZHVsZT0hMCx0WyJkZWZhdWx0Il09e25hbWU6IkVsQnV0dG9uR3JvdXAifX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1lLiRjcmVhdGVFbGVtZW50O2UuX2M7cmV0dXJuIHQoImRpdiIse3N0YXRpY0NsYXNzOiJlbC1idXR0b24tZ3JvdXAifSxbZS5fdCgiZGVmYXVsdCIpXSl9LHN0YXRpY1JlbmRlckZuczpbXX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX10Ll9fZXNNb2R1bGU9ITA7dmFyIHM9bigxMjEpLG89aShzKTtvWyJkZWZhdWx0Il0uaW5zdGFsbD1mdW5jdGlvbihlKXtlLmNvbXBvbmVudChvWyJkZWZhdWx0Il0ubmFtZSxvWyJkZWZhdWx0Il0pfSx0WyJkZWZhdWx0Il09b1siZGVmYXVsdCJdfSxmdW5jdGlvbihlLHQsbil7dmFyIGkscztpPW4oMTIyKTt2YXIgbz1uKDEzMik7cz1pPWl8fHt9LCJvYmplY3QiIT10eXBlb2YgaVsiZGVmYXVsdCJdJiYiZnVuY3Rpb24iIT10eXBlb2YgaVsiZGVmYXVsdCJdfHwocz1pPWlbImRlZmF1bHQiXSksImZ1bmN0aW9uIj09dHlwZW9mIHMmJihzPXMub3B0aW9ucykscy5yZW5kZXI9by5yZW5kZXIscy5zdGF0aWNSZW5kZXJGbnM9by5zdGF0aWNSZW5kZXJGbnMsZS5leHBvcnRzPWl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX10Ll9fZXNNb2R1bGU9ITA7dmFyIHM9big5Niksbz1pKHMpLGE9big0Mykscj1pKGEpLGw9bigzNiksdT1pKGwpLGQ9bigzNSksYz1pKGQpLGY9big0MCksaD1uKDExKSxwPWkoaCksbT1uKDEyMyksZz1pKG0pLHY9bigxMjUpLHk9aSh2KSxiPW4oMTI2KSxfPWkoYiksQz1uKDEyNyksdz1pKEMpLHg9bigxMjQpLE09MTt0WyJkZWZhdWx0Il09e25hbWU6ImVsLXRhYmxlIixtaXhpbnM6W3JbImRlZmF1bHQiXSxwWyJkZWZhdWx0Il1dLHByb3BzOntkYXRhOnt0eXBlOkFycmF5LCJkZWZhdWx0IjpmdW5jdGlvbigpe3JldHVybltdfX0sd2lkdGg6W1N0cmluZyxOdW1iZXJdLGhlaWdodDpbU3RyaW5nLE51bWJlcl0sbWF4SGVpZ2h0OltTdHJpbmcsTnVtYmVyXSxmaXQ6e3R5cGU6Qm9vbGVhbiwiZGVmYXVsdCI6ITB9LHN0cmlwZTpCb29sZWFuLGJvcmRlcjpCb29sZWFuLHJvd0tleTpbU3RyaW5nLEZ1bmN0aW9uXSxjb250ZXh0Ont9LHNob3dIZWFkZXI6e3R5cGU6Qm9vbGVhbiwiZGVmYXVsdCI6ITB9LHJvd0NsYXNzTmFtZTpbU3RyaW5nLEZ1bmN0aW9uXSxyb3dTdHlsZTpbT2JqZWN0LEZ1bmN0aW9uXSxoaWdobGlnaHRDdXJyZW50Um93OkJvb2xlYW4sZW1wdHlUZXh0OlN0cmluZ30sY29tcG9uZW50czp7VGFibGVIZWFkZXI6d1siZGVmYXVsdCJdLFRhYmxlQm9keTpfWyJkZWZhdWx0Il0sRWxDaGVja2JveDpvWyJkZWZhdWx0Il19LG1ldGhvZHM6e2dldE1pZ3JhdGluZ0NvbmZpZzpmdW5jdGlvbigpe3JldHVybntwcm9wczp7ImFsbG93LW5vLXNlbGVjdGlvbiI6IlRhYmxlOiBhbGxvdy1uby1zZWxlY3Rpb24gaGFzIGJlZW4gcmVtb3ZlZC4iLCJzZWxlY3Rpb24tbW9kZSI6IlRhYmxlOiBzZWxlY3Rpb24tbW9kZSBoYXMgYmVlbiByZW1vdmVkLiIsImZpeGVkLWNvbHVtbi1jb3VudCI6IlRhYmxlOiBmaXhlZC1jb2x1bW4tY291bnQgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGZpeGVkIHByb3AgaW4gVGFibGVDb2x1bW4gaW5zdGVhZC4iLCJjdXN0b20tY3JpdGVyaWEiOiJUYWJsZTogY3VzdG9tLWNyaXRlcmlhIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSByb3ctY2xhc3MtbmFtZSBpbnN0ZWFkLiIsImN1c3RvbS1iYWNrZ3JvdW5kLWNvbG9ycyI6ImN1c3RvbS1iYWNrZ3JvdW5kLWNvbG9ycyBoYXMgYmVlbiByZW1vdmVkLiBVc2Ugcm93LWNsYXNzLW5hbWUgaW5zdGVhZC4ifSxldmVudHM6e3NlbGVjdGlvbmNoYW5nZToiVGFibGU6IHNlbGVjdGlvbmNoYW5nZSBoYXMgYmVlbiByZW5hbWVkIHRvIHNlbGVjdGlvbi1jaGFuZ2UuIixjZWxsbW91c2VlbnRlcjoiVGFibGU6IGNlbGxtb3VzZWVudGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gY2VsbC1tb3VzZS1lbnRlci4iLGNlbGxtb3VzZWxlYXZlOiJUYWJsZTogY2VsbG1vdXNlbGVhdmUgaGFzIGJlZW4gcmVuYW1lZCB0byBjZWxsLW1vdXNlLWxlYXZlLiIsY2VsbGNsaWNrOiJUYWJsZTogY2VsbGNsaWNrIGhhcyBiZWVuIHJlbmFtZWQgdG8gY2VsbC1jbGljay4ifX19LHRvZ2dsZVJvd1NlbGVjdGlvbjpmdW5jdGlvbihlLHQpe3RoaXMuc3RvcmUudG9nZ2xlUm93U2VsZWN0aW9uKGUsdCksdGhpcy5zdG9yZS51cGRhdGVBbGxTZWxlY3RlZCgpfSxjbGVhclNlbGVjdGlvbjpmdW5jdGlvbigpe3RoaXMuc3RvcmUuY2xlYXJTZWxlY3Rpb24oKX0saGFuZGxlTW91c2VMZWF2ZTpmdW5jdGlvbigpe3RoaXMuc3RvcmUuY29tbWl0KCJzZXRIb3ZlclJvdyIsbnVsbCksdGhpcy5ob3ZlclN0YXRlJiYodGhpcy5ob3ZlclN0YXRlPW51bGwpfSx1cGRhdGVTY3JvbGxZOmZ1bmN0aW9uKCl7dGhpcy5sYXlvdXQudXBkYXRlU2Nyb2xsWSgpfSxiaW5kRXZlbnRzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMuJHJlZnMsbj10LmJvZHlXcmFwcGVyLGk9dC5oZWFkZXJXcmFwcGVyLHM9dGhpcy4kcmVmcztuLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsZnVuY3Rpb24oKXtpJiYoaS5zY3JvbGxMZWZ0PXRoaXMuc2Nyb2xsTGVmdCkscy5maXhlZEJvZHlXcmFwcGVyJiYocy5maXhlZEJvZHlXcmFwcGVyLnNjcm9sbFRvcD10aGlzLnNjcm9sbFRvcCkscy5yaWdodEZpeGVkQm9keVdyYXBwZXImJihzLnJpZ2h0Rml4ZWRCb2R5V3JhcHBlci5zY3JvbGxUb3A9dGhpcy5zY3JvbGxUb3ApfSksaSYmKDAseC5tb3VzZXdoZWVsKShpLCgwLHVbImRlZmF1bHQiXSkoMTYsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kZWx0YVg7dD4wP24uc2Nyb2xsTGVmdD1uLnNjcm9sbExlZnQrMTA6bi5zY3JvbGxMZWZ0PW4uc2Nyb2xsTGVmdC0xMH0pKSx0aGlzLmZpdCYmKHRoaXMud2luZG93UmVzaXplTGlzdGVuZXI9KDAsdVsiZGVmYXVsdCJdKSg1MCxmdW5jdGlvbigpe2UuJHJlYWR5JiZlLmRvTGF5b3V0KCl9KSwoMCxmLmFkZFJlc2l6ZUxpc3RlbmVyKSh0aGlzLiRlbCx0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyKSl9LGRvTGF5b3V0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLnN0b3JlLnVwZGF0ZUNvbHVtbnMoKSx0aGlzLmxheW91dC51cGRhdGUoKSx0aGlzLnVwZGF0ZVNjcm9sbFkoKSx0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe2UuaGVpZ2h0P2UubGF5b3V0LnNldEhlaWdodChlLmhlaWdodCk6ZS5tYXhIZWlnaHQ/ZS5sYXlvdXQuc2V0TWF4SGVpZ2h0KGUubWF4SGVpZ2h0KTplLnNob3VsZFVwZGF0ZUhlaWdodCYmZS5sYXlvdXQudXBkYXRlSGVpZ2h0KCl9KX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMudGFibGVJZD0iZWwtdGFibGVfIitNKyJfIix0aGlzLmRlYm91bmNlZExheW91dD0oMCxjWyJkZWZhdWx0Il0pKDUwLGZ1bmN0aW9uKCl7cmV0dXJuIGUuZG9MYXlvdXQoKX0pfSxjb21wdXRlZDp7c2hvdWxkVXBkYXRlSGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0aGlzLmhlaWdodHx8dGhpcy5maXhlZENvbHVtbnMubGVuZ3RoPjB8fHRoaXMucmlnaHRGaXhlZENvbHVtbnMubGVuZ3RoPjB9LHNlbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0b3JlLnNlbGVjdGlvbn0sY29sdW1uczpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0b3JlLnN0YXRlcy5jb2x1bW5zfSx0YWJsZURhdGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdG9yZS5zdGF0ZXMuZGF0YX0sZml4ZWRDb2x1bW5zOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RvcmUuc3RhdGVzLmZpeGVkQ29sdW1uc30scmlnaHRGaXhlZENvbHVtbnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdG9yZS5zdGF0ZXMucmlnaHRGaXhlZENvbHVtbnN9LGJvZHlIZWlnaHQ6ZnVuY3Rpb24oKXt2YXIgZT17fTtyZXR1cm4gdGhpcy5oZWlnaHQ/ZT17aGVpZ2h0OnRoaXMubGF5b3V0LmJvZHlIZWlnaHQ/dGhpcy5sYXlvdXQuYm9keUhlaWdodCsicHgiOiIifTp0aGlzLm1heEhlaWdodCYmKGU9eyJtYXgtaGVpZ2h0IjoodGhpcy5zaG93SGVhZGVyP3RoaXMubWF4SGVpZ2h0LXRoaXMubGF5b3V0LmhlYWRlckhlaWdodDp0aGlzLm1heEhlaWdodCkrInB4In0pLGV9LGZpeGVkQm9keUhlaWdodDpmdW5jdGlvbigpe3ZhciBlPXt9O2lmKHRoaXMuaGVpZ2h0KWU9e2hlaWdodDp0aGlzLmxheW91dC5maXhlZEJvZHlIZWlnaHQ/dGhpcy5sYXlvdXQuZml4ZWRCb2R5SGVpZ2h0KyJweCI6IiJ9O2Vsc2UgaWYodGhpcy5tYXhIZWlnaHQpe3ZhciB0PXRoaXMubGF5b3V0LnNjcm9sbFg/dGhpcy5tYXhIZWlnaHQtdGhpcy5sYXlvdXQuZ3V0dGVyV2lkdGg6dGhpcy5tYXhIZWlnaHQ7dGhpcy5zaG93SGVhZGVyJiYodC09dGhpcy5sYXlvdXQuaGVhZGVySGVpZ2h0KSxlPXsibWF4LWhlaWdodCI6dCsicHgifX1yZXR1cm4gZX0sZml4ZWRIZWlnaHQ6ZnVuY3Rpb24oKXt2YXIgZT17fTtyZXR1cm4gZT10aGlzLm1heEhlaWdodD97Ym90dG9tOnRoaXMubGF5b3V0LnNjcm9sbFgmJnRoaXMuZGF0YS5sZW5ndGg/dGhpcy5sYXlvdXQuZ3V0dGVyV2lkdGgrInB4IjoiIn06e2hlaWdodDp0aGlzLmxheW91dC52aWV3cG9ydEhlaWdodD90aGlzLmxheW91dC52aWV3cG9ydEhlaWdodCsicHgiOiIifX19LHdhdGNoOntoZWlnaHQ6ZnVuY3Rpb24oZSl7dGhpcy5sYXlvdXQuc2V0SGVpZ2h0KGUpfSxkYXRhOntpbW1lZGlhdGU6ITAsaGFuZGxlcjpmdW5jdGlvbihlKXt0aGlzLnN0b3JlLmNvbW1pdCgic2V0RGF0YSIsZSl9fX0sZGVzdHJveWVkOmZ1bmN0aW9uKCl7dGhpcy53aW5kb3dSZXNpemVMaXN0ZW5lciYmKDAsZi5yZW1vdmVSZXNpemVMaXN0ZW5lcikodGhpcy4kZWwsdGhpcy53aW5kb3dSZXNpemVMaXN0ZW5lcil9LG1vdW50ZWQ6ZnVuY3Rpb24oKXt0aGlzLmJpbmRFdmVudHMoKSx0aGlzLmRvTGF5b3V0KCksdGhpcy4kcmVhZHk9ITB9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgZT1uZXcgZ1siZGVmYXVsdCJdKHRoaXMse3Jvd0tleTp0aGlzLnJvd0tleX0pLHQ9bmV3IHlbImRlZmF1bHQiXSh7c3RvcmU6ZSx0YWJsZTp0aGlzLGZpdDp0aGlzLmZpdCxzaG93SGVhZGVyOnRoaXMuc2hvd0hlYWRlcn0pO3JldHVybntzdG9yZTplLGxheW91dDp0LHJlc2l6ZVByb3h5VmlzaWJsZTohMX19fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fXQuX19lc01vZHVsZT0hMDt2YXIgcz1uKDE0KSxvPWkocyksYT1uKDM1KSxyPWkoYSksbD1uKDEyNCksdT1mdW5jdGlvbihlLHQpe3ZhciBuPXQuc29ydGluZ0NvbHVtbjtyZXR1cm4gbiYmInN0cmluZyIhPXR5cGVvZiBuLnNvcnRhYmxlPygwLGwub3JkZXJCeSkoZSx0LnNvcnRQcm9wLHQuc29ydE9yZGVyLG4uc29ydE1ldGhvZCk6ZX0sZD1mdW5jdGlvbihlLHQpe3ZhciBuPXt9O3JldHVybihlfHxbXSkuZm9yRWFjaChmdW5jdGlvbihlLGkpe25bKDAsbC5nZXRSb3dJZGVudGl0eSkoZSx0KV09e3JvdzplLGluZGV4Oml9fSksbn0sYz1mdW5jdGlvbihlLHQsbil7dmFyIGk9ITEscz1lLnNlbGVjdGlvbixvPXMuaW5kZXhPZih0KTtyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIG4/bz09PS0xPyhzLnB1c2godCksaT0hMCk6KHMuc3BsaWNlKG8sMSksaT0hMCk6biYmbz09PS0xPyhzLnB1c2godCksaT0hMCk6IW4mJm8+LTEmJihzLnNwbGljZShvLDEpLGk9ITApLGl9LGY9ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKCFlKXRocm93IG5ldyBFcnJvcigiVGFibGUgaXMgcmVxdWlyZWQuIik7dGhpcy50YWJsZT1lLHRoaXMuc3RhdGVzPXtyb3dLZXk6bnVsbCxfY29sdW1uczpbXSxvcmlnaW5Db2x1bW5zOltdLGNvbHVtbnM6W10sZml4ZWRDb2x1bW5zOltdLHJpZ2h0Rml4ZWRDb2x1bW5zOltdLGlzQ29tcGxleDohMSxfZGF0YTpudWxsLGZpbHRlcmVkRGF0YTpudWxsLGRhdGE6bnVsbCxzb3J0aW5nQ29sdW1uOm51bGwsc29ydFByb3A6bnVsbCxzb3J0T3JkZXI6bnVsbCxpc0FsbFNlbGVjdGVkOiExLHNlbGVjdGlvbjpbXSxyZXNlcnZlU2VsZWN0aW9uOiExLHNlbGVjdGFibGU6bnVsbCxjdXJyZW50Um93Om51bGwsaG92ZXJSb3c6bnVsbCxmaWx0ZXJzOnt9fTtmb3IodmFyIG4gaW4gdCl0Lmhhc093blByb3BlcnR5KG4pJiZ0aGlzLnN0YXRlcy5oYXNPd25Qcm9wZXJ0eShuKSYmKHRoaXMuc3RhdGVzW25dPXRbbl0pfTtmLnByb3RvdHlwZS5tdXRhdGlvbnM9e3NldERhdGE6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLGk9ZS5fZGF0YSE9PXQ7ZS5fZGF0YT10LGUuZGF0YT11KHR8fFtdLGUpLHRoaXMudXBkYXRlQ3VycmVudFJvdygpLGUucmVzZXJ2ZVNlbGVjdGlvbj8hZnVuY3Rpb24oKXt2YXIgdD1lLnJvd0tleTt0PyFmdW5jdGlvbigpe3ZhciBpPWUuc2VsZWN0aW9uLHM9ZChpLHQpO2UuZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBuPSgwLGwuZ2V0Um93SWRlbnRpdHkpKGUsdCksbz1zW25dO28mJihpW28uaW5kZXhdPWUpfSksbi51cGRhdGVBbGxTZWxlY3RlZCgpfSgpOmNvbnNvbGUud2FybigiV0FSTjogcm93S2V5IGlzIHJlcXVpcmVkIHdoZW4gcmVzZXJ2ZS1zZWxlY3Rpb24gaXMgZW5hYmxlZC4iKX0oKTooaT90aGlzLmNsZWFyU2VsZWN0aW9uKCk6dGhpcy5jbGVhblNlbGVjdGlvbigpLHRoaXMudXBkYXRlQWxsU2VsZWN0ZWQoKSksb1siZGVmYXVsdCJdLm5leHRUaWNrKGZ1bmN0aW9uKCl7cmV0dXJuIG4udGFibGUudXBkYXRlU2Nyb2xsWSgpfSl9LGNoYW5nZVNvcnRDb25kaXRpb246ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztlLmRhdGE9dShlLmZpbHRlcmVkRGF0YXx8ZS5fZGF0YXx8W10sZSksdGhpcy50YWJsZS4kZW1pdCgic29ydC1jaGFuZ2UiLHtjb2x1bW46dGhpcy5zdGF0ZXMuc29ydGluZ0NvbHVtbixwcm9wOnRoaXMuc3RhdGVzLnNvcnRQcm9wLG9yZGVyOnRoaXMuc3RhdGVzLnNvcnRPcmRlcn0pLG9bImRlZmF1bHQiXS5uZXh0VGljayhmdW5jdGlvbigpe3JldHVybiB0LnRhYmxlLnVwZGF0ZVNjcm9sbFkoKX0pfSxmaWx0ZXJDaGFuZ2U6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLGk9dC5jb2x1bW4scz10LnZhbHVlcztzJiYhQXJyYXkuaXNBcnJheShzKSYmKHM9W3NdKTt2YXIgYT1pLnByb3BlcnR5O2EmJihlLmZpbHRlcnNbaS5pZF09cyk7dmFyIHI9ZS5fZGF0YSxkPWUuZmlsdGVycztPYmplY3Qua2V5cyhkKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWRbZV07aWYodCYmMCE9PXQubGVuZ3RoKXt2YXIgaT0oMCxsLmdldENvbHVtbkJ5SWQpKG4uc3RhdGVzLGUpO2kmJmkuZmlsdGVyTWV0aG9kJiYocj1yLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gdC5zb21lKGZ1bmN0aW9uKHQpe3JldHVybiBpLmZpbHRlck1ldGhvZC5jYWxsKG51bGwsdCxlKX0pfSkpfX0pLGUuZmlsdGVyZWREYXRhPXIsZS5kYXRhPXUocixlKSxvWyJkZWZhdWx0Il0ubmV4dFRpY2soZnVuY3Rpb24oKXtyZXR1cm4gbi50YWJsZS51cGRhdGVTY3JvbGxZKCl9KX0saW5zZXJ0Q29sdW1uOmZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBzPWUuX2NvbHVtbnM7aSYmKHM9aS5jaGlsZHJlbixzfHwocz1pLmNoaWxkcmVuPVtdKSksInVuZGVmaW5lZCIhPXR5cGVvZiBuP3Muc3BsaWNlKG4sMCx0KTpzLnB1c2godCksInNlbGVjdGlvbiI9PT10LnR5cGUmJihlLnNlbGVjdGFibGU9dC5zZWxlY3RhYmxlLGUucmVzZXJ2ZVNlbGVjdGlvbj10LnJlc2VydmVTZWxlY3Rpb24pLHRoaXMuc2NoZWR1bGVMYXlvdXQoKX0scmVtb3ZlQ29sdW1uOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5fY29sdW1ucztuJiZuLnNwbGljZShuLmluZGV4T2YodCksMSksdGhpcy5zY2hlZHVsZUxheW91dCgpfSxzZXRIb3ZlclJvdzpmdW5jdGlvbihlLHQpe2UuaG92ZXJSb3c9dH0sc2V0Q3VycmVudFJvdzpmdW5jdGlvbihlLHQpe3ZhciBuPWUuY3VycmVudFJvdztlLmN1cnJlbnRSb3c9dCxuIT09dCYmdGhpcy50YWJsZS4kZW1pdCgiY3VycmVudC1jaGFuZ2UiLHQsbil9LHJvd1NlbGVjdGVkQ2hhbmdlZDpmdW5jdGlvbihlLHQpe3ZhciBuPWMoZSx0KSxpPWUuc2VsZWN0aW9uO2lmKG4pe3ZhciBzPXRoaXMudGFibGU7cy4kZW1pdCgic2VsZWN0aW9uLWNoYW5nZSIsaSkscy4kZW1pdCgic2VsZWN0IixpLHQpfXRoaXMudXBkYXRlQWxsU2VsZWN0ZWQoKX0sdG9nZ2xlQWxsU2VsZWN0aW9uOigwLHJbImRlZmF1bHQiXSkoMTAsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kYXRhfHxbXSxuPSFlLmlzQWxsU2VsZWN0ZWQsaT10aGlzLnN0YXRlcy5zZWxlY3Rpb24scz0hMTt0LmZvckVhY2goZnVuY3Rpb24odCxpKXtlLnNlbGVjdGFibGU/ZS5zZWxlY3RhYmxlLmNhbGwobnVsbCx0LGkpJiZjKGUsdCxuKSYmKHM9ITApOmMoZSx0LG4pJiYocz0hMCl9KTt2YXIgbz10aGlzLnRhYmxlO3MmJm8uJGVtaXQoInNlbGVjdGlvbi1jaGFuZ2UiLGkpLG8uJGVtaXQoInNlbGVjdC1hbGwiLGkpLGUuaXNBbGxTZWxlY3RlZD1ufSl9O3ZhciBoPWZ1bmN0aW9uIHAoZSl7dmFyIHQ9W107cmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbihlKXtlLmNoaWxkcmVuP3QucHVzaC5hcHBseSh0LHAoZS5jaGlsZHJlbikpOnQucHVzaChlKX0pLHR9O2YucHJvdG90eXBlLnVwZGF0ZUNvbHVtbnM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnN0YXRlcyx0PWUuX2NvbHVtbnN8fFtdO2UuZml4ZWRDb2x1bW5zPXQuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlLmZpeGVkPT09ITB8fCJsZWZ0Ij09PWUuZml4ZWR9KSxlLnJpZ2h0Rml4ZWRDb2x1bW5zPXQuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiJyaWdodCI9PT1lLmZpeGVkfSksZS5maXhlZENvbHVtbnMubGVuZ3RoPjAmJnRbMF0mJiJzZWxlY3Rpb24iPT09dFswXS50eXBlJiYhdFswXS5maXhlZCYmKHRbMF0uZml4ZWQ9ITAsZS5maXhlZENvbHVtbnMudW5zaGlmdCh0WzBdKSksZS5vcmlnaW5Db2x1bW5zPVtdLmNvbmNhdChlLmZpeGVkQ29sdW1ucykuY29uY2F0KHQuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLmZpeGVkfSkpLmNvbmNhdChlLnJpZ2h0Rml4ZWRDb2x1bW5zKSxlLmNvbHVtbnM9aChlLm9yaWdpbkNvbHVtbnMpLGUuaXNDb21wbGV4PWUuZml4ZWRDb2x1bW5zLmxlbmd0aD4wfHxlLnJpZ2h0Rml4ZWRDb2x1bW5zLmxlbmd0aD4wfSxmLnByb3RvdHlwZS5pc1NlbGVjdGVkPWZ1bmN0aW9uKGUpe3JldHVybih0aGlzLnN0YXRlcy5zZWxlY3Rpb258fFtdKS5pbmRleE9mKGUpPi0xfSxmLnByb3RvdHlwZS5jbGVhclNlbGVjdGlvbj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc3RhdGVzO2UuaXNBbGxTZWxlY3RlZD0hMTt2YXIgdD1lLnNlbGVjdGlvbjtlLnNlbGVjdGlvbj1bXSx0Lmxlbmd0aD4wJiZ0aGlzLnRhYmxlLiRlbWl0KCJzZWxlY3Rpb24tY2hhbmdlIixlLnNlbGVjdGlvbil9LGYucHJvdG90eXBlLnRvZ2dsZVJvd1NlbGVjdGlvbj1mdW5jdGlvbihlLHQpe3ZhciBuPWModGhpcy5zdGF0ZXMsZSx0KTtuJiZ0aGlzLnRhYmxlLiRlbWl0KCJzZWxlY3Rpb24tY2hhbmdlIix0aGlzLnN0YXRlcy5zZWxlY3Rpb24pfSxmLnByb3RvdHlwZS5jbGVhblNlbGVjdGlvbj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc3RhdGVzLnNlbGVjdGlvbnx8W10sdD10aGlzLnN0YXRlcy5kYXRhLG49dGhpcy5zdGF0ZXMucm93S2V5LGk9dm9pZCAwO2lmKG4pe2k9W107dmFyIHM9ZChlLG4pLG89ZCh0LG4pO2Zvcih2YXIgYSBpbiBzKXMuaGFzT3duUHJvcGVydHkoYSkmJiFvW2FdJiZpLnB1c2goc1thXS5yb3cpfWVsc2UgaT1lLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gdC5pbmRleE9mKGUpPT09LTF9KTtpLmZvckVhY2goZnVuY3Rpb24odCl7ZS5zcGxpY2UoZS5pbmRleE9mKHQpLDEpfSksaS5sZW5ndGgmJnRoaXMudGFibGUuJGVtaXQoInNlbGVjdGlvbi1jaGFuZ2UiLGUpfSxmLnByb3RvdHlwZS51cGRhdGVBbGxTZWxlY3RlZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc3RhdGVzLHQ9ZS5zZWxlY3Rpb24sbj1lLnJvd0tleSxpPWUuc2VsZWN0YWJsZSxzPWUuZGF0YTtpZighc3x8MD09PXMubGVuZ3RoKXJldHVybiB2b2lkKGUuaXNBbGxTZWxlY3RlZD0hMSk7dmFyIG89dm9pZCAwO24mJihvPWQoZS5zZWxlY3Rpb24sbikpO2Zvcih2YXIgYT1mdW5jdGlvbihlKXtyZXR1cm4gbz8hIW9bKDAsbC5nZXRSb3dJZGVudGl0eSkoZSxuKV06dC5pbmRleE9mKGUpIT09LTF9LHI9ITAsdT0wLGM9MCxmPXMubGVuZ3RoO2M8ZjtjKyspe3ZhciBoPXNbY107aWYoaSl7dmFyIHA9aS5jYWxsKG51bGwsaCxjKTtpZihwKXtpZighYShoKSl7cj0hMTticmVha311Kyt9fWVsc2V7aWYoIWEoaCkpe3I9ITE7YnJlYWt9dSsrfX0wPT09dSYmKHI9ITEpLGUuaXNBbGxTZWxlY3RlZD1yfSxmLnByb3RvdHlwZS5zY2hlZHVsZUxheW91dD1mdW5jdGlvbigpe3RoaXMudGFibGUuZGVib3VuY2VkTGF5b3V0KCl9LGYucHJvdG90eXBlLnVwZGF0ZUN1cnJlbnRSb3c9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnN0YXRlcyx0PXRoaXMudGFibGUsbj1lLmRhdGF8fFtdLGk9ZS5jdXJyZW50Um93O24uaW5kZXhPZihpKT09PS0xJiYoZS5jdXJyZW50Um93PW51bGwsZS5jdXJyZW50Um93IT09aSYmdC4kZW1pdCgiY3VycmVudC1jaGFuZ2UiLG51bGwsaSkpfSxmLnByb3RvdHlwZS5jb21taXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5tdXRhdGlvbnM7aWYodFtlXSl7Zm9yKHZhciBuPWFyZ3VtZW50cy5sZW5ndGgsaT1BcnJheShuPjE/bi0xOjApLHM9MTtzPG47cysrKWlbcy0xXT1hcmd1bWVudHNbc107dFtlXS5hcHBseSh0aGlzLFt0aGlzLnN0YXRlc10uY29uY2F0KGkpKX19LHRbImRlZmF1bHQiXT1mfSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0Ijt0Ll9fZXNNb2R1bGU9ITA7dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9LGk9dm9pZCAwLHM9KHQuZ2V0U2Nyb2xsQmFyV2lkdGg9ZnVuY3Rpb24oKXtpZih2b2lkIDAhPT1pKXJldHVybiBpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIixlLnN0eWxlLndpZHRoPSIxMDBweCIsZS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGUuc3R5bGUudG9wPSItOTk5OXB4Iixkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpO3ZhciB0PWUub2Zmc2V0V2lkdGg7ZS5zdHlsZS5vdmVyZmxvdz0ic2Nyb2xsIjt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtuLnN0eWxlLndpZHRoPSIxMDAlIixlLmFwcGVuZENoaWxkKG4pO3ZhciBzPW4ub2Zmc2V0V2lkdGg7cmV0dXJuIGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSx0LXN9LHQuZ2V0Q2VsbD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS50YXJnZXQ7dCYmIkhUTUwiIT09dC50YWdOYW1lLnRvVXBwZXJDYXNlKCk7KXtpZigiVEQiPT09dC50YWdOYW1lLnRvVXBwZXJDYXNlKCkpcmV0dXJuIHQ7dD10LnBhcmVudE5vZGV9cmV0dXJuIG51bGx9LHQuZ2V0VmFsdWVCeVBhdGg9ZnVuY3Rpb24oZSx0KXt0PXR8fCIiO2Zvcih2YXIgbj10LnNwbGl0KCIuIiksaT1lLHM9bnVsbCxvPTAsYT1uLmxlbmd0aDtvPGE7bysrKXt2YXIgcj1uW29dO2lmKCFpKWJyZWFrO2lmKG89PT1hLTEpe3M9aVtyXTticmVha31pPWlbcl19cmV0dXJuIHN9KSxvPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT09ZSYmIm9iamVjdCI9PT0oInVuZGVmaW5lZCI9PXR5cGVvZiBlPyJ1bmRlZmluZWQiOm4oZSkpfSxhPSh0Lm9yZGVyQnk9ZnVuY3Rpb24oZSx0LG4saSl7aWYoInN0cmluZyI9PXR5cGVvZiBuJiYobj0iZGVzY2VuZGluZyI9PT1uPy0xOjEpLCF0KXJldHVybiBlO3ZhciBhPW4mJm48MD8tMToxO3JldHVybiBlLnNsaWNlKCkuc29ydChpP2Z1bmN0aW9uKGUsdCl7cmV0dXJuIGkoZSx0KT9hOi1hfTpmdW5jdGlvbihlLG4pe3JldHVybiIka2V5IiE9PXQmJihvKGUpJiYiJHZhbHVlImluIGUmJihlPWUuJHZhbHVlKSxvKG4pJiYiJHZhbHVlImluIG4mJihuPW4uJHZhbHVlKSksZT1vKGUpP3MoZSx0KTplLG49byhuKT9zKG4sdCk6bixlPT09bj8wOmU+bj9hOi1hfSl9LHQuZ2V0Q29sdW1uQnlJZD1mdW5jdGlvbihlLHQpe3ZhciBuPW51bGw7cmV0dXJuIGUuY29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuaWQ9PT10JiYobj1lKX0pLG59KSxyPSh0LmdldENvbHVtbkJ5Q2VsbD1mdW5jdGlvbihlLHQpe3ZhciBuPSh0LmNsYXNzTmFtZXx8IiIpLm1hdGNoKC9lbC10YWJsZV9bXlxzXSsvZ20pO3JldHVybiBuP2EoZSxuWzBdKTpudWxsfSxuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZmlyZWZveCIpPi0xKTt0Lm1vdXNld2hlZWw9ZnVuY3Rpb24oZSx0KXtlJiZlLmFkZEV2ZW50TGlzdGVuZXImJmUuYWRkRXZlbnRMaXN0ZW5lcihyPyJET01Nb3VzZVNjcm9sbCI6Im1vdXNld2hlZWwiLHQpfSx0LmdldFJvd0lkZW50aXR5PWZ1bmN0aW9uKGUsdCl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJyb3cgaXMgcmVxdWlyZWQgd2hlbiBnZXQgcm93IGlkZW50aXR5Iik7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P2VbdF06ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dC5jYWxsKG51bGwsZSk6dm9pZCAwfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9dC5fX2VzTW9kdWxlPSEwO3ZhciBzPW4oMTI0KSxvPXZvaWQgMCxhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtpKHRoaXMsZSksdGhpcy50YWJsZT1udWxsLHRoaXMuc3RvcmU9bnVsbCx0aGlzLmNvbHVtbnM9bnVsbCx0aGlzLmZpdD0hMCx0aGlzLnNob3dIZWFkZXI9ITAsdGhpcy5oZWlnaHQ9bnVsbCx0aGlzLnNjcm9sbFg9ITEsdGhpcy5zY3JvbGxZPSExLHRoaXMuYm9keVdpZHRoPW51bGwsdGhpcy5maXhlZFdpZHRoPW51bGwsdGhpcy5yaWdodEZpeGVkV2lkdGg9bnVsbCx0aGlzLnRhYmxlSGVpZ2h0PW51bGwsdGhpcy5oZWFkZXJIZWlnaHQ9NDQsdGhpcy52aWV3cG9ydEhlaWdodD1udWxsLHRoaXMuYm9keUhlaWdodD1udWxsLHRoaXMuZml4ZWRCb2R5SGVpZ2h0PW51bGwsdm9pZCAwPT09byYmKG89KDAscy5nZXRTY3JvbGxCYXJXaWR0aCkoKSksdGhpcy5ndXR0ZXJXaWR0aD1vO2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJih0aGlzW25dPXRbbl0pO2lmKCF0aGlzLnRhYmxlKXRocm93IG5ldyBFcnJvcigidGFibGUgaXMgcmVxdWlyZWQgZm9yIFRhYmxlIExheW91dCIpO2lmKCF0aGlzLnN0b3JlKXRocm93IG5ldyBFcnJvcigic3RvcmUgaXMgcmVxdWlyZWQgZm9yIFRhYmxlIExheW91dCIpfXJldHVybiBlLnByb3RvdHlwZS51cGRhdGVTY3JvbGxZPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5oZWlnaHQ7aWYoInN0cmluZyI9PXR5cGVvZiBlfHwibnVtYmVyIj09dHlwZW9mIGUpe3ZhciB0PXRoaXMudGFibGUuJHJlZnMuYm9keVdyYXBwZXI7aWYodGhpcy50YWJsZS4kZWwmJnQpe3ZhciBuPXQucXVlcnlTZWxlY3RvcigiLmVsLXRhYmxlX19ib2R5Iik7dGhpcy5zY3JvbGxZPW4ub2Zmc2V0SGVpZ2h0PnQub2Zmc2V0SGVpZ2h0fX19LGUucHJvdG90eXBlLnNldEhlaWdodD1mdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06ImhlaWdodCIsbj10aGlzLnRhYmxlLiRlbDsic3RyaW5nIj09dHlwZW9mIGUmJi9eXGQrJC8udGVzdChlKSYmKGU9TnVtYmVyKGUpKSx0aGlzLmhlaWdodD1lLG4mJigibnVtYmVyIj09dHlwZW9mIGU/KG4uc3R5bGVbdF09ZSsicHgiLHRoaXMudXBkYXRlSGVpZ2h0KCkpOiJzdHJpbmciPT10eXBlb2YgZSYmdGhpcy51cGRhdGVIZWlnaHQoKSl9LGUucHJvdG90eXBlLnNldE1heEhlaWdodD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5zZXRIZWlnaHQoZSwibWF4LWhlaWdodCIpfSxlLnByb3RvdHlwZS51cGRhdGVIZWlnaHQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnRhYmxlSGVpZ2h0PXRoaXMudGFibGUuJGVsLmNsaWVudEhlaWdodCx0PXRoaXMudGFibGUuJHJlZnMuaGVhZGVyV3JhcHBlcjtpZighdGhpcy5zaG93SGVhZGVyfHx0KXtpZih0aGlzLnNob3dIZWFkZXIpe3ZhciBuPXRoaXMuaGVhZGVySGVpZ2h0PXQub2Zmc2V0SGVpZ2h0LGk9ZS1uO251bGw9PT10aGlzLmhlaWdodHx8aXNOYU4odGhpcy5oZWlnaHQpJiYic3RyaW5nIiE9dHlwZW9mIHRoaXMuaGVpZ2h0fHwodGhpcy5ib2R5SGVpZ2h0PWkpLHRoaXMuZml4ZWRCb2R5SGVpZ2h0PXRoaXMuc2Nyb2xsWD9pLXRoaXMuZ3V0dGVyV2lkdGg6aX1lbHNlIHRoaXMuaGVhZGVySGVpZ2h0PTAsbnVsbD09PXRoaXMuaGVpZ2h0fHxpc05hTih0aGlzLmhlaWdodCkmJiJzdHJpbmciIT10eXBlb2YgdGhpcy5oZWlnaHR8fCh0aGlzLmJvZHlIZWlnaHQ9ZSksdGhpcy5maXhlZEJvZHlIZWlnaHQ9dGhpcy5zY3JvbGxYP2UtdGhpcy5ndXR0ZXJXaWR0aDplO3RoaXMudmlld3BvcnRIZWlnaHQ9dGhpcy5zY3JvbGxYP2UtdGhpcy5ndXR0ZXJXaWR0aDplfX0sZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5maXQsdD10aGlzLnRhYmxlLmNvbHVtbnMsbj10aGlzLnRhYmxlLiRlbC5jbGllbnRXaWR0aCxpPTAscz1bXTt0LmZvckVhY2goZnVuY3Rpb24oZSl7ZS5pc0NvbHVtbkdyb3VwP3MucHVzaC5hcHBseShzLGUuY29sdW1ucyk6cy5wdXNoKGUpfSk7dmFyIG89cy5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIm51bWJlciIhPXR5cGVvZiBlLndpZHRofSk7aWYoby5sZW5ndGg+MCYmZSl7aWYocy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2krPWUud2lkdGh8fGUubWluV2lkdGh8fDgwfSksaTxuLXRoaXMuZ3V0dGVyV2lkdGgpe3RoaXMuc2Nyb2xsWD0hMTt2YXIgYT1uLXRoaXMuZ3V0dGVyV2lkdGgtaTsxPT09by5sZW5ndGg/b1swXS5yZWFsV2lkdGg9KG9bMF0ubWluV2lkdGh8fDgwKSthOiFmdW5jdGlvbigpe3ZhciBlPW8ucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUrKHQubWluV2lkdGh8fDgwKX0sMCksdD1hL2Usbj0wO28uZm9yRWFjaChmdW5jdGlvbihlLGkpe2lmKDAhPT1pKXt2YXIgcz1NYXRoLmZsb29yKChlLm1pbldpZHRofHw4MCkqdCk7bis9cyxlLnJlYWxXaWR0aD0oZS5taW5XaWR0aHx8ODApK3N9fSksb1swXS5yZWFsV2lkdGg9KG9bMF0ubWluV2lkdGh8fDgwKSthLW59KCl9ZWxzZSB0aGlzLnNjcm9sbFg9ITAsby5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UucmVhbFdpZHRoPWUubWluV2lkdGh9KTt0aGlzLmJvZHlXaWR0aD1NYXRoLm1heChpLG4pfWVsc2Ugcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uud2lkdGh8fGUubWluV2lkdGg/ZS5yZWFsV2lkdGg9ZS53aWR0aHx8ZS5taW5XaWR0aDplLnJlYWxXaWR0aD04MCxpKz1lLnJlYWxXaWR0aH0pLHRoaXMuc2Nyb2xsWD1pPm4sdGhpcy5ib2R5V2lkdGg9aTt2YXIgcj10aGlzLnN0b3JlLnN0YXRlcy5maXhlZENvbHVtbnM7aWYoci5sZW5ndGg+MCl7dmFyIGw9MDtyLmZvckVhY2goZnVuY3Rpb24oZSl7bCs9ZS5yZWFsV2lkdGh9KSx0aGlzLmZpeGVkV2lkdGg9bH12YXIgdT10aGlzLnN0b3JlLnN0YXRlcy5yaWdodEZpeGVkQ29sdW1ucztpZih1Lmxlbmd0aD4wKXt2YXIgZD0wO3UuZm9yRWFjaChmdW5jdGlvbihlKXtkKz1lLnJlYWxXaWR0aH0pLHRoaXMucmlnaHRGaXhlZFdpZHRoPWR9fSxlfSgpO3RbImRlZmF1bHQiXT1hfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19dC5fX2VzTW9kdWxlPSEwO3ZhciBzPW4oMTI0KSxvPW4oOTYpLGE9aShvKTt0WyJkZWZhdWx0Il09e2NvbXBvbmVudHM6e0VsQ2hlY2tib3g6YVsiZGVmYXVsdCJdfSxwcm9wczp7c3RvcmU6e3JlcXVpcmVkOiEwfSxjb250ZXh0Ont9LGxheW91dDp7cmVxdWlyZWQ6ITB9LHJvd0NsYXNzTmFtZTpbU3RyaW5nLEZ1bmN0aW9uXSxyb3dTdHlsZTpbT2JqZWN0LEZ1bmN0aW9uXSxmaXhlZDpTdHJpbmcsaGlnaGxpZ2h0OkJvb2xlYW59LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49dGhpcy5jb2x1bW5zLm1hcChmdW5jdGlvbihlLG4pe3JldHVybiB0LmlzQ29sdW1uSGlkZGVuKG4pfSk7cmV0dXJuIGUoInRhYmxlIix7ImNsYXNzIjoiZWwtdGFibGVfX2JvZHkiLGF0dHJzOntjZWxsc3BhY2luZzoiMCIsY2VsbHBhZGRpbmc6IjAiLGJvcmRlcjoiMCJ9fSxbdGhpcy5fbCh0aGlzLmNvbHVtbnMsZnVuY3Rpb24odCl7cmV0dXJuIGUoImNvbCIse2F0dHJzOntuYW1lOnQuaWQsd2lkdGg6dC5yZWFsV2lkdGh8fHQud2lkdGh9fSxbXSl9KSxlKCJ0Ym9keSIsbnVsbCxbdGhpcy5fbCh0aGlzLmRhdGEsZnVuY3Rpb24oaSxzKXtyZXR1cm4gZSgidHIiLHtzdHlsZTp0LnJvd1N0eWxlP3QuZ2V0Um93U3R5bGUoaSxzKTpudWxsLGtleTp0LiRwYXJlbnQucm93S2V5P3QuZ2V0S2V5T2ZSb3coaSxzKTpzLG9uOntkYmxjbGljazpmdW5jdGlvbihlKXtyZXR1cm4gdC5oYW5kbGVEb3VibGVDbGljayhlLGkpfSxjbGljazpmdW5jdGlvbihlKXtyZXR1cm4gdC5oYW5kbGVDbGljayhlLGkpfSxjb250ZXh0bWVudTpmdW5jdGlvbihlKXtyZXR1cm4gdC5oYW5kbGVDb250ZXh0TWVudShlLGkpfSxtb3VzZWVudGVyOmZ1bmN0aW9uKGUpe3JldHVybiB0LmhhbmRsZU1vdXNlRW50ZXIocyl9LG1vdXNlbGVhdmU6ZnVuY3Rpb24oZSl7cmV0dXJuIHQuaGFuZGxlTW91c2VMZWF2ZSgpfX0sImNsYXNzIjp0LmdldFJvd0NsYXNzKGkscyl9LFt0Ll9sKHQuY29sdW1ucyxmdW5jdGlvbihvLGEpe3JldHVybiBlKCJ0ZCIseyJjbGFzcyI6W28uaWQsby5hbGlnbixvLmNsYXNzTmFtZXx8IiIsblthXT8iaXMtaGlkZGVuIjoiIl0sb246e21vdXNlZW50ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHQuaGFuZGxlQ2VsbE1vdXNlRW50ZXIoZSxpKX0sbW91c2VsZWF2ZTp0LmhhbmRsZUNlbGxNb3VzZUxlYXZlfX0sW28ucmVuZGVyQ2VsbC5jYWxsKHQuX3JlbmRlclByb3h5LGUse3JvdzppLGNvbHVtbjpvLCRpbmRleDpzLHN0b3JlOnQuc3RvcmUsX3NlbGY6dC5jb250ZXh0fHx0LiRwYXJlbnQuJHZub2RlLmNvbnRleHR9KV0pfSksIXQuZml4ZWQmJnQubGF5b3V0LnNjcm9sbFkmJnQubGF5b3V0Lmd1dHRlcldpZHRoP2UoInRkIix7ImNsYXNzIjoiZ3V0dGVyIn0sW10pOiIiXSl9KV0pXSl9LHdhdGNoOnsic3RvcmUuc3RhdGVzLmhvdmVyUm93IjpmdW5jdGlvbihlLHQpe2lmKHRoaXMuc3RvcmUuc3RhdGVzLmlzQ29tcGxleCl7dmFyIG49dGhpcy4kZWw7aWYobil7dmFyIGk9bi5xdWVyeVNlbGVjdG9yQWxsKCJ0Ym9keSA+IHRyIikscz1pW3RdLG89aVtlXTtzJiZzLmNsYXNzTGlzdC5yZW1vdmUoImhvdmVyLXJvdyIpLG8mJm8uY2xhc3NMaXN0LmFkZCgiaG92ZXItcm93Iil9fX0sInN0b3JlLnN0YXRlcy5jdXJyZW50Um93IjpmdW5jdGlvbihlLHQpe2lmKHRoaXMuaGlnaGxpZ2h0KXt2YXIgbj10aGlzLiRlbDtpZihuKXt2YXIgaT10aGlzLnN0b3JlLnN0YXRlcy5kYXRhLHM9bi5xdWVyeVNlbGVjdG9yQWxsKCJ0Ym9keSA+IHRyIiksbz1zW2kuaW5kZXhPZih0KV0sYT1zW2kuaW5kZXhPZihlKV07byYmby5jbGFzc0xpc3QucmVtb3ZlKCJjdXJyZW50LXJvdyIpLGEmJmEuY2xhc3NMaXN0LmFkZCgiY3VycmVudC1yb3ciKX19fX0sY29tcHV0ZWQ6e2RhdGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdG9yZS5zdGF0ZXMuZGF0YX0sY29sdW1uc0NvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RvcmUuc3RhdGVzLmNvbHVtbnMubGVuZ3RofSxsZWZ0Rml4ZWRDb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0b3JlLnN0YXRlcy5maXhlZENvbHVtbnMubGVuZ3RofSxyaWdodEZpeGVkQ291bnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdG9yZS5zdGF0ZXMucmlnaHRGaXhlZENvbHVtbnMubGVuZ3RofSxjb2x1bW5zOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RvcmUuc3RhdGVzLmNvbHVtbnN9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3Rvb2x0aXBEaXNhYmxlZDohMH19LG1ldGhvZHM6e2dldEtleU9mUm93OmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy4kcGFyZW50LnJvd0tleTtyZXR1cm4gbj8oMCxzLmdldFJvd0lkZW50aXR5KShlLG4pOnR9LGlzQ29sdW1uSGlkZGVuOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmZpeGVkPT09ITB8fCJsZWZ0Ij09PXRoaXMuZml4ZWQ/ZT49dGhpcy5sZWZ0Rml4ZWRDb3VudDoicmlnaHQiPT09dGhpcy5maXhlZD9lPHRoaXMuY29sdW1uc0NvdW50LXRoaXMucmlnaHRGaXhlZENvdW50OmU8dGhpcy5sZWZ0Rml4ZWRDb3VudHx8ZT49dGhpcy5jb2x1bW5zQ291bnQtdGhpcy5yaWdodEZpeGVkQ291bnR9LGdldFJvd1N0eWxlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5yb3dTdHlsZTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmNhbGwobnVsbCxlLHQpOm59LGdldFJvd0NsYXNzOmZ1bmN0aW9uKGUsdCl7dmFyIG49W10saT10aGlzLnJvd0NsYXNzTmFtZTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGk/bi5wdXNoKGkpOiJmdW5jdGlvbiI9PXR5cGVvZiBpJiZuLnB1c2goaS5jYWxsKG51bGwsZSx0KXx8IiIpLG4uam9pbigiICIpfSxoYW5kbGVDZWxsTW91c2VFbnRlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuJHBhcmVudCxpPSgwLHMuZ2V0Q2VsbCkoZSk7aWYoaSl7dmFyIG89KDAscy5nZXRDb2x1bW5CeUNlbGwpKG4saSksYT1uLmhvdmVyU3RhdGU9e2NlbGw6aSxjb2x1bW46byxyb3c6dH07bi4kZW1pdCgiY2VsbC1tb3VzZS1lbnRlciIsYS5yb3csYS5jb2x1bW4sYS5jZWxsLGUpfXZhciByPWUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoIi5jZWxsIik7dGhpcy50b29sdGlwRGlzYWJsZWQ9ci5zY3JvbGxXaWR0aDw9ci5vZmZzZXRXaWR0aH0saGFuZGxlQ2VsbE1vdXNlTGVhdmU6ZnVuY3Rpb24oZSl7dmFyIHQ9KDAscy5nZXRDZWxsKShlKTtpZih0KXt2YXIgbj10aGlzLiRwYXJlbnQuaG92ZXJTdGF0ZTt0aGlzLiRwYXJlbnQuJGVtaXQoImNlbGwtbW91c2UtbGVhdmUiLG4ucm93LG4uY29sdW1uLG4uY2VsbCxlKX19LGhhbmRsZU1vdXNlRW50ZXI6ZnVuY3Rpb24oZSl7dGhpcy5zdG9yZS5jb21taXQoInNldEhvdmVyUm93IixlKX0saGFuZGxlTW91c2VMZWF2ZTpmdW5jdGlvbigpe3RoaXMuc3RvcmUuY29tbWl0KCJzZXRIb3ZlclJvdyIsbnVsbCl9LGhhbmRsZUNvbnRleHRNZW51OmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy4kcGFyZW50O24uJGVtaXQoInJvdy1jb250ZXh0bWVudSIsdCxlKX0saGFuZGxlRG91YmxlQ2xpY2s6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLiRwYXJlbnQ7bi4kZW1pdCgicm93LWRibGNsaWNrIix0LGUpfSxoYW5kbGVDbGljazpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuJHBhcmVudCxpPSgwLHMuZ2V0Q2VsbCkoZSk7aWYoaSl7dmFyIG89KDAscy5nZXRDb2x1bW5CeUNlbGwpKG4saSk7byYmbi4kZW1pdCgiY2VsbC1jbGljayIsdCxvLGksZSl9dGhpcy5zdG9yZS5jb21taXQoInNldEN1cnJlbnRSb3ciLHQpLG4uJGVtaXQoInJvdy1jbGljayIsdCxlKX19fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fXQuX19lc01vZHVsZT0hMDt2YXIgcz1uKDk2KSxvPWkocyksYT1uKDMxKSxyPWkoYSksbD1uKDE0KSx1PWkobCksZD1uKDEyOCksYz1pKGQpLGY9ZnVuY3Rpb24gcChlKXt2YXIgdD1bXTtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY2hpbGRyZW4/KHQucHVzaChlKSx0LnB1c2guYXBwbHkodCxwKGUuY2hpbGRyZW4pKSk6dC5wdXNoKGUpfSksdH0saD1mdW5jdGlvbihlKXt2YXIgdD0xLG49ZnVuY3Rpb24gYShlLG4pe24mJihlLmxldmVsPW4ubGV2ZWwrMSx0PGUubGV2ZWwmJih0PWUubGV2ZWwpKSxlLmNoaWxkcmVuPyFmdW5jdGlvbigpe3ZhciB0PTEsbj0wO2UuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihpKXt2YXIgcz1hKGksZSk7cz50JiYodD1zKSxuKz1pLmNvbFNwYW59KSxlLmNvbFNwYW49bn0oKTplLmNvbFNwYW49MX07ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UubGV2ZWw9MSxuKGUpfSk7Zm9yKHZhciBpPVtdLHM9MDtzPHQ7cysrKWkucHVzaChbXSk7dmFyIG89ZihlKTtyZXR1cm4gby5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY2hpbGRyZW4/ZS5yb3dTcGFuPTE6ZS5yb3dTcGFuPXQtZS5sZXZlbCsxLGlbZS5sZXZlbC0xXS5wdXNoKGUpfSksaX07dFsiZGVmYXVsdCJdPXtuYW1lOiJlbC10YWJsZS1oZWFkZXIiLHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49dGhpcy5zdG9yZS5zdGF0ZXMub3JpZ2luQ29sdW1ucyxpPWgobix0aGlzLmNvbHVtbnMpO3JldHVybiBlKCJ0YWJsZSIseyJjbGFzcyI6ImVsLXRhYmxlX19oZWFkZXIiLGF0dHJzOntjZWxsc3BhY2luZzoiMCIsY2VsbHBhZGRpbmc6IjAiLGJvcmRlcjoiMCJ9fSxbdGhpcy5fbCh0aGlzLmNvbHVtbnMsZnVuY3Rpb24odCl7cmV0dXJuIGUoImNvbCIse2F0dHJzOntuYW1lOnQuaWQsd2lkdGg6dC5yZWFsV2lkdGh8fHQud2lkdGh9fSxbXSl9KSwhdGhpcy5maXhlZCYmdGhpcy5sYXlvdXQuZ3V0dGVyV2lkdGg/ZSgiY29sIix7YXR0cnM6e25hbWU6Imd1dHRlciIsd2lkdGg6dGhpcy5sYXlvdXQuc2Nyb2xsWT90aGlzLmxheW91dC5ndXR0ZXJXaWR0aDoiIn19LFtdKToiIixlKCJ0aGVhZCIsbnVsbCxbdGhpcy5fbChpLGZ1bmN0aW9uKG4saSl7cmV0dXJuIGUoInRyIixudWxsLFt0Ll9sKG4sZnVuY3Rpb24obixzKXtyZXR1cm4gZSgidGgiLHthdHRyczp7Y29sc3BhbjpuLmNvbFNwYW4scm93c3BhbjpuLnJvd1NwYW59LG9uOnttb3VzZW1vdmU6ZnVuY3Rpb24oZSl7cmV0dXJuIHQuaGFuZGxlTW91c2VNb3ZlKGUsbil9LG1vdXNlb3V0OnQuaGFuZGxlTW91c2VPdXQsbW91c2Vkb3duOmZ1bmN0aW9uKGUpe3JldHVybiB0LmhhbmRsZU1vdXNlRG93bihlLG4pfSxjbGljazpmdW5jdGlvbihlKXtyZXR1cm4gdC5oYW5kbGVDbGljayhlLG4pfX0sImNsYXNzIjpbbi5pZCxuLm9yZGVyLG4uYWxpZ24sbi5jbGFzc05hbWV8fCIiLDA9PT1pJiZ0LmlzQ2VsbEhpZGRlbihzKT8iaXMtaGlkZGVuIjoiIixuLmNoaWxkcmVuPyIiOiJpcy1sZWFmIl19LFtlKCJkaXYiLHsiY2xhc3MiOlsiY2VsbCIsbi5maWx0ZXJlZFZhbHVlJiZuLmZpbHRlcmVkVmFsdWUubGVuZ3RoPjA/ImhpZ2hsaWdodCI6IiJdfSxbbi5yZW5kZXJIZWFkZXI/bi5yZW5kZXJIZWFkZXIuY2FsbCh0Ll9yZW5kZXJQcm94eSxlLHtjb2x1bW46biwkaW5kZXg6cyxzdG9yZTp0LnN0b3JlLF9zZWxmOnQuJHBhcmVudC4kdm5vZGUuY29udGV4dH0pOm4ubGFiZWwsbi5zb3J0YWJsZT9lKCJzcGFuIix7ImNsYXNzIjoiY2FyZXQtd3JhcHBlciIsb246e2NsaWNrOmZ1bmN0aW9uKGUpe3JldHVybiB0LmhhbmRsZUhlYWRlckNsaWNrKGUsbil9fX0sW2UoImkiLHsiY2xhc3MiOiJzb3J0LWNhcmV0IGFzY2VuZGluZyJ9LFtdKSxlKCJpIix7ImNsYXNzIjoic29ydC1jYXJldCBkZXNjZW5kaW5nIgp9LFtdKV0pOiIiLG4uZmlsdGVyYWJsZT9lKCJzcGFuIix7ImNsYXNzIjoiZWwtdGFibGVfX2NvbHVtbi1maWx0ZXItdHJpZ2dlciIsb246e2NsaWNrOmZ1bmN0aW9uKGUpe3JldHVybiB0LmhhbmRsZUZpbHRlckNsaWNrKGUsbil9fX0sW2UoImkiLHsiY2xhc3MiOlsiZWwtaWNvbi1hcnJvdy1kb3duIixuLmZpbHRlck9wZW5lZD8iZWwtaWNvbi1hcnJvdy11cCI6IiJdfSxbXSldKToiIl0pXSl9KSwhdC5maXhlZCYmdC5sYXlvdXQuZ3V0dGVyV2lkdGg/ZSgidGgiLHsiY2xhc3MiOiJndXR0ZXIiLHN0eWxlOnt3aWR0aDp0LmxheW91dC5zY3JvbGxZP3QubGF5b3V0Lmd1dHRlcldpZHRoKyJweCI6IjAifX0sW10pOiIiXSl9KV0pXSl9LHByb3BzOntmaXhlZDpTdHJpbmcsc3RvcmU6e3JlcXVpcmVkOiEwfSxsYXlvdXQ6e3JlcXVpcmVkOiEwfSxib3JkZXI6Qm9vbGVhbn0sY29tcG9uZW50czp7RWxDaGVja2JveDpvWyJkZWZhdWx0Il0sRWxUYWc6clsiZGVmYXVsdCJdfSxjb21wdXRlZDp7aXNBbGxTZWxlY3RlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0b3JlLnN0YXRlcy5pc0FsbFNlbGVjdGVkfSxjb2x1bW5zQ291bnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdG9yZS5zdGF0ZXMuY29sdW1ucy5sZW5ndGh9LGxlZnRGaXhlZENvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RvcmUuc3RhdGVzLmZpeGVkQ29sdW1ucy5sZW5ndGh9LHJpZ2h0Rml4ZWRDb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0b3JlLnN0YXRlcy5yaWdodEZpeGVkQ29sdW1ucy5sZW5ndGh9LGNvbHVtbnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdG9yZS5zdGF0ZXMuY29sdW1uc319LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLmZpbHRlclBhbmVscz17fX0sYmVmb3JlRGVzdHJveTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZmlsdGVyUGFuZWxzO2Zvcih2YXIgdCBpbiBlKWUuaGFzT3duUHJvcGVydHkodCkmJmVbdF0mJmVbdF0uJGRlc3Ryb3koITApfSxtZXRob2RzOntpc0NlbGxIaWRkZW46ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZml4ZWQ9PT0hMHx8ImxlZnQiPT09dGhpcy5maXhlZD9lPj10aGlzLmxlZnRGaXhlZENvdW50OiJyaWdodCI9PT10aGlzLmZpeGVkP2U8dGhpcy5jb2x1bW5zQ291bnQtdGhpcy5yaWdodEZpeGVkQ291bnQ6ZTx0aGlzLmxlZnRGaXhlZENvdW50fHxlPj10aGlzLmNvbHVtbnNDb3VudC10aGlzLnJpZ2h0Rml4ZWRDb3VudH0sdG9nZ2xlQWxsU2VsZWN0aW9uOmZ1bmN0aW9uKCl7dGhpcy5zdG9yZS5jb21taXQoInRvZ2dsZUFsbFNlbGVjdGlvbiIpfSxoYW5kbGVGaWx0ZXJDbGljazpmdW5jdGlvbihlLHQpe2Uuc3RvcFByb3BhZ2F0aW9uKCk7dmFyIG49ZS50YXJnZXQsaT1uLnBhcmVudE5vZGUscz10aGlzLiRwYXJlbnQsbz10aGlzLmZpbHRlclBhbmVsc1t0LmlkXTtyZXR1cm4gbyYmdC5maWx0ZXJPcGVuZWQ/dm9pZChvLnNob3dQb3BwZXI9ITEpOihvfHwobz1uZXcgdVsiZGVmYXVsdCJdKGNbImRlZmF1bHQiXSksdGhpcy5maWx0ZXJQYW5lbHNbdC5pZF09byxvLnRhYmxlPXMsby5jZWxsPWksby5jb2x1bW49dCxvLiRtb3VudChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkpLHZvaWQgc2V0VGltZW91dChmdW5jdGlvbigpe28uc2hvd1BvcHBlcj0hMH0sMTYpKX0saGFuZGxlQ2xpY2s6ZnVuY3Rpb24oZSx0KXt0aGlzLiRwYXJlbnQuJGVtaXQoImhlYWRlci1jbGljayIsdCxlKX0saGFuZGxlTW91c2VEb3duOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpczt0LmNoaWxkcmVuJiZ0LmNoaWxkcmVuLmxlbmd0aD4wfHx0aGlzLmRyYWdnaW5nQ29sdW1uJiZ0aGlzLmJvcmRlciYmIWZ1bmN0aW9uKCl7bi5kcmFnZ2luZz0hMCxuLiRwYXJlbnQucmVzaXplUHJveHlWaXNpYmxlPSEwO3ZhciBpPW4uJHBhcmVudC4kZWwscz1pLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQsbz1uLiRlbC5xdWVyeVNlbGVjdG9yKCJ0aC4iK3QuaWQpLGE9by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxyPWEubGVmdC1zKzMwO28uY2xhc3NMaXN0LmFkZCgibm9jbGljayIpLG4uZHJhZ1N0YXRlPXtzdGFydE1vdXNlTGVmdDplLmNsaWVudFgsc3RhcnRMZWZ0OmEucmlnaHQtcyxzdGFydENvbHVtbkxlZnQ6YS5sZWZ0LXMsdGFibGVMZWZ0OnN9O3ZhciBsPW4uJHBhcmVudC4kcmVmcy5yZXNpemVQcm94eTtsLnN0eWxlLmxlZnQ9bi5kcmFnU3RhdGUuc3RhcnRMZWZ0KyJweCIsZG9jdW1lbnQub25zZWxlY3RzdGFydD1mdW5jdGlvbigpe3JldHVybiExfSxkb2N1bWVudC5vbmRyYWdzdGFydD1mdW5jdGlvbigpe3JldHVybiExfTt2YXIgdT1mdW5jdGlvbihlKXt2YXIgdD1lLmNsaWVudFgtbi5kcmFnU3RhdGUuc3RhcnRNb3VzZUxlZnQsaT1uLmRyYWdTdGF0ZS5zdGFydExlZnQrdDtsLnN0eWxlLmxlZnQ9TWF0aC5tYXgocixpKSsicHgifSxkPWZ1bmN0aW9uIGMoKXtpZihuLmRyYWdnaW5nKXt2YXIgZT1wYXJzZUludChsLnN0eWxlLmxlZnQsMTApLGk9ZS1uLmRyYWdTdGF0ZS5zdGFydENvbHVtbkxlZnQ7dC53aWR0aD10LnJlYWxXaWR0aD1pLG4uc3RvcmUuc2NoZWR1bGVMYXlvdXQoKSxkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvcj0iIixuLmRyYWdnaW5nPSExLG4uZHJhZ2dpbmdDb2x1bW49bnVsbCxuLmRyYWdTdGF0ZT17fSxuLiRwYXJlbnQucmVzaXplUHJveHlWaXNpYmxlPSExfWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsYyksZG9jdW1lbnQub25zZWxlY3RzdGFydD1udWxsLGRvY3VtZW50Lm9uZHJhZ3N0YXJ0PW51bGwsc2V0VGltZW91dChmdW5jdGlvbigpe28uY2xhc3NMaXN0LnJlbW92ZSgibm9jbGljayIpfSwwKX07ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix1KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIixkKX0oKX0saGFuZGxlTW91c2VNb3ZlOmZ1bmN0aW9uKGUsdCl7aWYoISh0LmNoaWxkcmVuJiZ0LmNoaWxkcmVuLmxlbmd0aD4wKSl7Zm9yKHZhciBuPWUudGFyZ2V0O24mJiJUSCIhPT1uLnRhZ05hbWU7KW49bi5wYXJlbnROb2RlO2lmKHQmJnQucmVzaXphYmxlJiYhdGhpcy5kcmFnZ2luZyYmdGhpcy5ib3JkZXIpe3ZhciBpPW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscz1kb2N1bWVudC5ib2R5LnN0eWxlO2kud2lkdGg+MTImJmkucmlnaHQtZS5wYWdlWDw4PyhzLmN1cnNvcj0iY29sLXJlc2l6ZSIsdGhpcy5kcmFnZ2luZ0NvbHVtbj10KTp0aGlzLmRyYWdnaW5nfHwocy5jdXJzb3I9IiIsdGhpcy5kcmFnZ2luZ0NvbHVtbj1udWxsKX19fSxoYW5kbGVNb3VzZU91dDpmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yPSIifSxoYW5kbGVIZWFkZXJDbGljazpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1lLnRhcmdldDtuJiYiVEgiIT09bi50YWdOYW1lOyluPW4ucGFyZW50Tm9kZTtpZihuJiYiVEgiPT09bi50YWdOYW1lJiZuLmNsYXNzTGlzdC5jb250YWlucygibm9jbGljayIpKXJldHVybiB2b2lkIG4uY2xhc3NMaXN0LnJlbW92ZSgibm9jbGljayIpO2lmKHQuc29ydGFibGUpe3ZhciBpPXRoaXMuc3RvcmUuc3RhdGVzLHM9aS5zb3J0UHJvcCxvPXZvaWQgMCxhPWkuc29ydGluZ0NvbHVtbjthIT09dCYmKGEmJihhLm9yZGVyPW51bGwpLGkuc29ydGluZ0NvbHVtbj10LHM9dC5wcm9wZXJ0eSksdC5vcmRlcj8iYXNjZW5kaW5nIj09PXQub3JkZXI/bz10Lm9yZGVyPSJkZXNjZW5kaW5nIjoobz10Lm9yZGVyPW51bGwsaS5zb3J0aW5nQ29sdW1uPW51bGwscz1udWxsKTpvPXQub3JkZXI9ImFzY2VuZGluZyIsaS5zb3J0UHJvcD1zLGkuc29ydE9yZGVyPW8sdGhpcy5zdG9yZS5jb21taXQoImNoYW5nZVNvcnRDb25kaXRpb24iKX19fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue2RyYWdnaW5nQ29sdW1uOm51bGwsZHJhZ2dpbmc6ITEsZHJhZ1N0YXRlOnt9fX19fSxmdW5jdGlvbihlLHQsbil7dmFyIGkscztpPW4oMTI5KTt2YXIgbz1uKDEzMSk7cz1pPWl8fHt9LCJvYmplY3QiIT10eXBlb2YgaVsiZGVmYXVsdCJdJiYiZnVuY3Rpb24iIT10eXBlb2YgaVsiZGVmYXVsdCJdfHwocz1pPWlbImRlZmF1bHQiXSksImZ1bmN0aW9uIj09dHlwZW9mIHMmJihzPXMub3B0aW9ucykscy5yZW5kZXI9by5yZW5kZXIscy5zdGF0aWNSZW5kZXJGbnM9by5zdGF0aWNSZW5kZXJGbnMsZS5leHBvcnRzPWl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX10Ll9fZXNNb2R1bGU9ITA7dmFyIHM9bigyNCksbz1pKHMpLGE9bigxMSkscj1pKGEpLGw9bigzNyksdT1pKGwpLGQ9bigxMzApLGM9aShkKSxmPW4oOTYpLGg9aShmKSxwPW4oMTAwKSxtPWkocCk7dFsiZGVmYXVsdCJdPXtuYW1lOiJlbC10YWJsZS1maWx0ZXItcGFuZWwiLG1peGluczpbb1siZGVmYXVsdCJdLHJbImRlZmF1bHQiXV0sZGlyZWN0aXZlczp7Q2xpY2tvdXRzaWRlOnVbImRlZmF1bHQiXX0sY29tcG9uZW50czp7RWxDaGVja2JveDpoWyJkZWZhdWx0Il0sRWxDaGVja2JveEdyb3VwOm1bImRlZmF1bHQiXX0scHJvcHM6e3BsYWNlbWVudDp7dHlwZTpTdHJpbmcsImRlZmF1bHQiOiJib3R0b20tZW5kIn19LGN1c3RvbVJlbmRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZSgiZGl2Iix7ImNsYXNzIjoiZWwtdGFibGUtZmlsdGVyIn0sW2UoImRpdiIseyJjbGFzcyI6ImVsLXRhYmxlLWZpbHRlcl9fY29udGVudCJ9LFtdKSxlKCJkaXYiLHsiY2xhc3MiOiJlbC10YWJsZS1maWx0ZXJfX2JvdHRvbSJ9LFtlKCJidXR0b24iLHtvbjp7Y2xpY2s6dGhpcy5oYW5kbGVDb25maXJtfX0sW3RoaXMudCgiZWwudGFibGUuY29uZmlybUZpbHRlciIpXSksZSgiYnV0dG9uIix7b246e2NsaWNrOnRoaXMuaGFuZGxlUmVzZXR9fSxbdGhpcy50KCJlbC50YWJsZS5yZXNldEZpbHRlciIpXSldKV0pfSxtZXRob2RzOntpc0FjdGl2ZTpmdW5jdGlvbihlKXtyZXR1cm4gZS52YWx1ZT09PXRoaXMuZmlsdGVyVmFsdWV9LGhhbmRsZU91dHNpZGVDbGljazpmdW5jdGlvbigpe3RoaXMuc2hvd1BvcHBlcj0hMX0saGFuZGxlQ29uZmlybTpmdW5jdGlvbigpe3RoaXMuY29uZmlybUZpbHRlcih0aGlzLmZpbHRlcmVkVmFsdWUpLHRoaXMuaGFuZGxlT3V0c2lkZUNsaWNrKCl9LGhhbmRsZVJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5maWx0ZXJlZFZhbHVlPVtdLHRoaXMuY29uZmlybUZpbHRlcih0aGlzLmZpbHRlcmVkVmFsdWUpLHRoaXMuaGFuZGxlT3V0c2lkZUNsaWNrKCl9LGhhbmRsZVNlbGVjdDpmdW5jdGlvbihlKXt0aGlzLmZpbHRlclZhbHVlPWUsZT90aGlzLmNvbmZpcm1GaWx0ZXIodGhpcy5maWx0ZXJlZFZhbHVlKTp0aGlzLmNvbmZpcm1GaWx0ZXIoW10pLHRoaXMuaGFuZGxlT3V0c2lkZUNsaWNrKCl9LGNvbmZpcm1GaWx0ZXI6ZnVuY3Rpb24oZSl7dGhpcy50YWJsZS5zdG9yZS5jb21taXQoImZpbHRlckNoYW5nZSIse2NvbHVtbjp0aGlzLmNvbHVtbix2YWx1ZXM6ZX0pfX0sZGF0YTpmdW5jdGlvbigpe3JldHVybnt0YWJsZTpudWxsLGNlbGw6bnVsbCxjb2x1bW46bnVsbH19LGNvbXB1dGVkOntmaWx0ZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29sdW1uJiZ0aGlzLmNvbHVtbi5maWx0ZXJzfSxmaWx0ZXJWYWx1ZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuY29sdW1uLmZpbHRlcmVkVmFsdWV8fFtdKVswXX0sc2V0OmZ1bmN0aW9uKGUpe3RoaXMuZmlsdGVyZWRWYWx1ZSYmKGU/dGhpcy5maWx0ZXJlZFZhbHVlLnNwbGljZSgwLDEsZSk6dGhpcy5maWx0ZXJlZFZhbHVlLnNwbGljZSgwLDEpKX19LGZpbHRlcmVkVmFsdWU6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbHVtbj90aGlzLmNvbHVtbi5maWx0ZXJlZFZhbHVlfHxbXTpbXX0sc2V0OmZ1bmN0aW9uKGUpe3RoaXMuY29sdW1uJiYodGhpcy5jb2x1bW4uZmlsdGVyZWRWYWx1ZT1lKX19LG11bHRpcGxlOmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuY29sdW1ufHx0aGlzLmNvbHVtbi5maWx0ZXJNdWx0aXBsZX19LG1vdW50ZWQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMucG9wcGVyRWxtPXRoaXMuJGVsLHRoaXMucmVmZXJlbmNlRWxtPXRoaXMuY2VsbCx0aGlzLnRhYmxlLiRyZWZzLmJvZHlXcmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsZnVuY3Rpb24oKXtlLnVwZGF0ZVBvcHBlcigpfSksdGhpcy4kd2F0Y2goInNob3dQb3BwZXIiLGZ1bmN0aW9uKHQpe2UuY29sdW1uJiYoZS5jb2x1bW4uZmlsdGVyT3BlbmVkPXQpLHQ/Y1siZGVmYXVsdCJdLm9wZW4oZSk6Y1siZGVmYXVsdCJdLmNsb3NlKGUpfSl9fX0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7dC5fX2VzTW9kdWxlPSEwO3ZhciBuPVtdO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihlKXtuLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49ZS50YXJnZXQ7dCYmdC4kZWwmJihuPT09dC4kZWx8fHQuJGVsLmNvbnRhaW5zKG4pfHx0LmhhbmRsZU91dHNpZGVDbGljayYmdC5oYW5kbGVPdXRzaWRlQ2xpY2soZSkpfSl9KSx0WyJkZWZhdWx0Il09e29wZW46ZnVuY3Rpb24oZSl7ZSYmbi5wdXNoKGUpfSxjbG9zZTpmdW5jdGlvbihlKXt2YXIgdD1uLmluZGV4T2YoZSk7dCE9PS0xJiZuLnNwbGljZShlLDEpfX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS4kY3JlYXRlRWxlbWVudDtlLl9jO3JldHVybiB0KCJ0cmFuc2l0aW9uIix7YXR0cnM6e25hbWU6ImVsLXpvb20taW4tdG9wIn19LFtlLm11bHRpcGxlP3QoImRpdiIse2RpcmVjdGl2ZXM6W3tuYW1lOiJzaG93IixyYXdOYW1lOiJ2LXNob3ciLHZhbHVlOmUuc2hvd1BvcHBlcixleHByZXNzaW9uOiJzaG93UG9wcGVyIn1dLHN0YXRpY0NsYXNzOiJlbC10YWJsZS1maWx0ZXIifSxbdCgiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXRhYmxlLWZpbHRlcl9fY29udGVudCJ9LFt0KCJlbC1jaGVja2JveC1ncm91cCIse2RpcmVjdGl2ZXM6W3tuYW1lOiJtb2RlbCIscmF3TmFtZToidi1tb2RlbCIsdmFsdWU6ZS5maWx0ZXJlZFZhbHVlLGV4cHJlc3Npb246ImZpbHRlcmVkVmFsdWUifV0sc3RhdGljQ2xhc3M6ImVsLXRhYmxlLWZpbHRlcl9fY2hlY2tib3gtZ3JvdXAiLGRvbVByb3BzOnt2YWx1ZTplLmZpbHRlcmVkVmFsdWV9LG9uOntpbnB1dDpmdW5jdGlvbih0KXtlLmZpbHRlcmVkVmFsdWU9dH19fSxbZS5fbChlLmZpbHRlcnMsZnVuY3Rpb24obil7cmV0dXJuIHQoImVsLWNoZWNrYm94Iix7YXR0cnM6e2xhYmVsOm4udmFsdWV9fSxbZS5fcyhuLnRleHQpXSl9KV0pXSksdCgiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXRhYmxlLWZpbHRlcl9fYm90dG9tIn0sW3QoImJ1dHRvbiIseyJjbGFzcyI6eyJpcy1kaXNhYmxlZCI6MD09PWUuZmlsdGVyZWRWYWx1ZS5sZW5ndGh9LGF0dHJzOntkaXNhYmxlZDowPT09ZS5maWx0ZXJlZFZhbHVlLmxlbmd0aH0sb246e2NsaWNrOmUuaGFuZGxlQ29uZmlybX19LFtlLl9zKGUudCgiZWwudGFibGUuY29uZmlybUZpbHRlciIpKV0pLHQoImJ1dHRvbiIse29uOntjbGljazplLmhhbmRsZVJlc2V0fX0sW2UuX3MoZS50KCJlbC50YWJsZS5yZXNldEZpbHRlciIpKV0pXSldKTp0KCJkaXYiLHtkaXJlY3RpdmVzOlt7bmFtZToic2hvdyIscmF3TmFtZToidi1zaG93Iix2YWx1ZTplLnNob3dQb3BwZXIsZXhwcmVzc2lvbjoic2hvd1BvcHBlciJ9XSxzdGF0aWNDbGFzczoiZWwtdGFibGUtZmlsdGVyIn0sW3QoInVsIix7c3RhdGljQ2xhc3M6ImVsLXRhYmxlLWZpbHRlcl9fbGlzdCJ9LFt0KCJsaSIse3N0YXRpY0NsYXNzOiJlbC10YWJsZS1maWx0ZXJfX2xpc3QtaXRlbSIsImNsYXNzIjp7ImlzLWFjdGl2ZSI6IWUuZmlsdGVyVmFsdWV9LG9uOntjbGljazpmdW5jdGlvbih0KXtlLmhhbmRsZVNlbGVjdChudWxsKX19fSxbZS5fcyhlLnQoImVsLnRhYmxlLmNsZWFyRmlsdGVyIikpXSksZS5fbChlLmZpbHRlcnMsZnVuY3Rpb24obil7cmV0dXJuIHQoImxpIix7c3RhdGljQ2xhc3M6ImVsLXRhYmxlLWZpbHRlcl9fbGlzdC1pdGVtIiwiY2xhc3MiOnsiaXMtYWN0aXZlIjplLmlzQWN0aXZlKG4pfSxhdHRyczp7bGFiZWw6bi52YWx1ZX0sb246e2NsaWNrOmZ1bmN0aW9uKHQpe2UuaGFuZGxlU2VsZWN0KG4udmFsdWUpfX19LFtlLl9zKG4udGV4dCldKX0pXSldKV0pfSxzdGF0aWNSZW5kZXJGbnM6W119fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWUuJGNyZWF0ZUVsZW1lbnQ7ZS5fYztyZXR1cm4gdCgiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXRhYmxlIiwiY2xhc3MiOnsiZWwtdGFibGUtLWZpdCI6ZS5maXQsImVsLXRhYmxlLS1zdHJpcGVkIjplLnN0cmlwZSwiZWwtdGFibGUtLWJvcmRlciI6ZS5ib3JkZXIsImVsLXRhYmxlLS1mbHVpZC1oZWlnaHQiOmUubWF4SGVpZ2h0LCJlbC10YWJsZS0tZW5hYmxlLXJvdy1ob3ZlciI6IWUuc3RvcmUuc3RhdGVzLmlzQ29tcGxleCwiZWwtdGFibGUtLWVuYWJsZS1yb3ctdHJhbnNpdGlvbiI6ITB9LG9uOnttb3VzZWxlYXZlOmZ1bmN0aW9uKHQpe2UuaGFuZGxlTW91c2VMZWF2ZSh0KX19fSxbdCgiZGl2Iix7cmVmOiJoaWRkZW5Db2x1bW5zIixzdGF0aWNDbGFzczoiaGlkZGVuLWNvbHVtbnMifSxbZS5fdCgiZGVmYXVsdCIpXSksZS5zaG93SGVhZGVyP3QoImRpdiIse3JlZjoiaGVhZGVyV3JhcHBlciIsc3RhdGljQ2xhc3M6ImVsLXRhYmxlX19oZWFkZXItd3JhcHBlciJ9LFt0KCJ0YWJsZS1oZWFkZXIiLHtzdHlsZTp7d2lkdGg6ZS5sYXlvdXQuYm9keVdpZHRoP2UubGF5b3V0LmJvZHlXaWR0aCsicHgiOiIifSxhdHRyczp7c3RvcmU6ZS5zdG9yZSxsYXlvdXQ6ZS5sYXlvdXQsYm9yZGVyOmUuYm9yZGVyfX0pXSk6ZS5fZSgpLHQoImRpdiIse3JlZjoiYm9keVdyYXBwZXIiLHN0YXRpY0NsYXNzOiJlbC10YWJsZV9fYm9keS13cmFwcGVyIixzdHlsZTpbZS5ib2R5SGVpZ2h0XX0sW3QoInRhYmxlLWJvZHkiLHtzdHlsZTp7d2lkdGg6ZS5sYXlvdXQuYm9keVdpZHRoP2UubGF5b3V0LmJvZHlXaWR0aC0oZS5sYXlvdXQuc2Nyb2xsWT9lLmxheW91dC5ndXR0ZXJXaWR0aDowKSsicHgiOiIifSxhdHRyczp7Y29udGV4dDplLmNvbnRleHQsc3RvcmU6ZS5zdG9yZSxsYXlvdXQ6ZS5sYXlvdXQsInJvdy1jbGFzcy1uYW1lIjplLnJvd0NsYXNzTmFtZSwicm93LXN0eWxlIjplLnJvd1N0eWxlLGhpZ2hsaWdodDplLmhpZ2hsaWdodEN1cnJlbnRSb3d9fSksZS5kYXRhJiYwIT09ZS5kYXRhLmxlbmd0aD9lLl9lKCk6dCgiZGl2Iix7c3RhdGljQ2xhc3M6ImVsLXRhYmxlX19lbXB0eS1ibG9jayJ9LFt0KCJzcGFuIix7c3RhdGljQ2xhc3M6ImVsLXRhYmxlX19lbXB0eS10ZXh0In0sW2UuX3QoImVtcHR5IixbZS5fcyhlLmVtcHR5VGV4dHx8ZS50KCJlbC50YWJsZS5lbXB0eVRleHQiKSldKV0pXSldKSxlLmZpeGVkQ29sdW1ucy5sZW5ndGg+MD90KCJkaXYiLHtyZWY6ImZpeGVkV3JhcHBlciIsc3RhdGljQ2xhc3M6ImVsLXRhYmxlX19maXhlZCIsc3R5bGU6W3t3aWR0aDplLmxheW91dC5maXhlZFdpZHRoP2UubGF5b3V0LmZpeGVkV2lkdGgrInB4IjoiIn0sZS5maXhlZEhlaWdodF19LFtlLnNob3dIZWFkZXI/dCgiZGl2Iix7cmVmOiJmaXhlZEhlYWRlcldyYXBwZXIiLHN0YXRpY0NsYXNzOiJlbC10YWJsZV9fZml4ZWQtaGVhZGVyLXdyYXBwZXIifSxbdCgidGFibGUtaGVhZGVyIix7c3R5bGU6e3dpZHRoOmUubGF5b3V0LmZpeGVkV2lkdGg/ZS5sYXlvdXQuZml4ZWRXaWR0aCsicHgiOiIifSxhdHRyczp7Zml4ZWQ6ImxlZnQiLGJvcmRlcjplLmJvcmRlcixzdG9yZTplLnN0b3JlLGxheW91dDplLmxheW91dH19KV0pOmUuX2UoKSx0KCJkaXYiLHtyZWY6ImZpeGVkQm9keVdyYXBwZXIiLHN0YXRpY0NsYXNzOiJlbC10YWJsZV9fZml4ZWQtYm9keS13cmFwcGVyIixzdHlsZTpbe3RvcDplLmxheW91dC5oZWFkZXJIZWlnaHQrInB4In0sZS5maXhlZEJvZHlIZWlnaHRdfSxbdCgidGFibGUtYm9keSIse3N0eWxlOnt3aWR0aDplLmxheW91dC5maXhlZFdpZHRoP2UubGF5b3V0LmZpeGVkV2lkdGgrInB4IjoiIn0sYXR0cnM6e2ZpeGVkOiJsZWZ0IixzdG9yZTplLnN0b3JlLGxheW91dDplLmxheW91dCxoaWdobGlnaHQ6ZS5oaWdobGlnaHRDdXJyZW50Um93LCJyb3ctY2xhc3MtbmFtZSI6ZS5yb3dDbGFzc05hbWUsInJvdy1zdHlsZSI6ZS5yb3dTdHlsZX19KV0pXSk6ZS5fZSgpLGUucmlnaHRGaXhlZENvbHVtbnMubGVuZ3RoPjA/dCgiZGl2Iix7cmVmOiJyaWdodEZpeGVkV3JhcHBlciIsc3RhdGljQ2xhc3M6ImVsLXRhYmxlX19maXhlZC1yaWdodCIsc3R5bGU6W3t3aWR0aDplLmxheW91dC5yaWdodEZpeGVkV2lkdGg/ZS5sYXlvdXQucmlnaHRGaXhlZFdpZHRoKyJweCI6IiJ9LHtyaWdodDplLmxheW91dC5zY3JvbGxZPyhlLmJvcmRlcj9lLmxheW91dC5ndXR0ZXJXaWR0aDplLmxheW91dC5ndXR0ZXJXaWR0aHx8MSkrInB4IjoiIn0sZS5maXhlZEhlaWdodF19LFtlLnNob3dIZWFkZXI/dCgiZGl2Iix7cmVmOiJyaWdodEZpeGVkSGVhZGVyV3JhcHBlciIsc3RhdGljQ2xhc3M6ImVsLXRhYmxlX19maXhlZC1oZWFkZXItd3JhcHBlciJ9LFt0KCJ0YWJsZS1oZWFkZXIiLHtzdHlsZTp7d2lkdGg6ZS5sYXlvdXQucmlnaHRGaXhlZFdpZHRoP2UubGF5b3V0LnJpZ2h0Rml4ZWRXaWR0aCsicHgiOiIifSxhdHRyczp7Zml4ZWQ6InJpZ2h0Iixib3JkZXI6ZS5ib3JkZXIsc3RvcmU6ZS5zdG9yZSxsYXlvdXQ6ZS5sYXlvdXR9fSldKTplLl9lKCksdCgiZGl2Iix7cmVmOiJyaWdodEZpeGVkQm9keVdyYXBwZXIiLHN0YXRpY0NsYXNzOiJlbC10YWJsZV9fZml4ZWQtYm9keS13cmFwcGVyIixzdHlsZTpbe3RvcDplLmxheW91dC5oZWFkZXJIZWlnaHQrInB4In0sZS5maXhlZEJvZHlIZWlnaHRdfSxbdCgidGFibGUtYm9keSIse3N0eWxlOnt3aWR0aDplLmxheW91dC5yaWdodEZpeGVkV2lkdGg/ZS5sYXlvdXQucmlnaHRGaXhlZFdpZHRoKyJweCI6IiJ9LGF0dHJzOntmaXhlZDoicmlnaHQiLHN0b3JlOmUuc3RvcmUsbGF5b3V0OmUubGF5b3V0LCJyb3ctY2xhc3MtbmFtZSI6ZS5yb3dDbGFzc05hbWUsInJvdy1zdHlsZSI6ZS5yb3dTdHlsZSxoaWdobGlnaHQ6ZS5oaWdobGlnaHRDdXJyZW50Um93fX0pXSldKTplLl9lKCksZS5yaWdodEZpeGVkQ29sdW1ucy5sZW5ndGg+MD90KCJkaXYiLHtzdGF0aWNDbGFzczoiZWwtdGFibGVfX2ZpeGVkLXJpZ2h0LXBhdGNoIixzdHlsZTp7d2lkdGg6ZS5sYXlvdXQuc2Nyb2xsWT9lLmxheW91dC5ndXR0ZXJXaWR0aCsicHgiOiIwIixoZWlnaHQ6ZS5sYXlvdXQuaGVhZGVySGVpZ2h0KyJweCJ9fSk6ZS5fZSgpLHQoImRpdiIse2RpcmVjdGl2ZXM6W3tuYW1lOiJzaG93IixyYXdOYW1lOiJ2LXNob3ciLHZhbHVlOmUucmVzaXplUHJveHlWaXNpYmxlLGV4cHJlc3Npb246InJlc2l6ZVByb3h5VmlzaWJsZSJ9XSxyZWY6InJlc2l6ZVByb3h5IixzdGF0aWNDbGFzczoiZWwtdGFibGVfX2NvbHVtbi1yZXNpemUtcHJveHkifSldKX0sc3RhdGljUmVuZGVyRm5zOltdfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fXQuX19lc01vZHVsZT0hMDt2YXIgcz1uKDEzNCksbz1pKHMpO29bImRlZmF1bHQiXS5pbnN0YWxsPWZ1bmN0aW9uKGUpe2UuY29tcG9uZW50KG9bImRlZmF1bHQiXS5uYW1lLG9bImRlZmF1bHQiXSl9LHRbImRlZmF1bHQiXT1vWyJkZWZhdWx0Il19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX10Ll9fZXNNb2R1bGU9ITA7dmFyIHM9big5Niksbz1pKHMpLGE9bigzMSkscj1pKGEpLGw9bigxMzUpLHU9aShsKSxkPW4oMTI0KSxjPTEsZj17ImRlZmF1bHQiOntvcmRlcjoiIn0sc2VsZWN0aW9uOnt3aWR0aDo0OCxtaW5XaWR0aDo0OCxyZWFsV2lkdGg6NDgsb3JkZXI6IiIsY2xhc3NOYW1lOiJlbC10YWJsZS1jb2x1bW4tLXNlbGVjdGlvbiJ9LGluZGV4Ont3aWR0aDo0OCxtaW5XaWR0aDo0OCxyZWFsV2lkdGg6NDgsb3JkZXI6IiJ9fSxwPXtzZWxlY3Rpb246e3JlbmRlckhlYWRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZSgiZWwtY2hlY2tib3giLHtuYXRpdmVPbjp7Y2xpY2s6dGhpcy50b2dnbGVBbGxTZWxlY3Rpb259LGRvbVByb3BzOnt2YWx1ZTp0aGlzLmlzQWxsU2VsZWN0ZWR9fSxbXSl9LHJlbmRlckNlbGw6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LnJvdyxpPXQuY29sdW1uLHM9dC5zdG9yZSxvPXQuJGluZGV4O3JldHVybiBlKCJlbC1jaGVja2JveCIse2RvbVByb3BzOnt2YWx1ZTpzLmlzU2VsZWN0ZWQobil9LGF0dHJzOntkaXNhYmxlZDohIWkuc2VsZWN0YWJsZSYmIWkuc2VsZWN0YWJsZS5jYWxsKG51bGwsbixvKX0sb246e2lucHV0OmZ1bmN0aW9uKCl7cy5jb21taXQoInJvd1NlbGVjdGVkQ2hhbmdlZCIsbil9fX0sW10pfSxzb3J0YWJsZTohMSxyZXNpemFibGU6ITF9LGluZGV4OntyZW5kZXJIZWFkZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmNvbHVtbjtyZXR1cm4gbi5sYWJlbHx8IiMifSxyZW5kZXJDZWxsOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC4kaW5kZXg7cmV0dXJuIGUoImRpdiIsbnVsbCxbbisxXSl9LHNvcnRhYmxlOiExfX0sbT1mdW5jdGlvbihlLHQpe3ZhciBuPXt9OygwLHVbImRlZmF1bHQiXSkobixmW2V8fCJkZWZhdWx0Il0pO2Zvcih2YXIgaSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoaSkpe3ZhciBzPXRbaV07InVuZGVmaW5lZCIhPXR5cGVvZiBzJiYobltpXT1zKX1yZXR1cm4gbi5taW5XaWR0aHx8KG4ubWluV2lkdGg9ODApLG4ucmVhbFdpZHRoPW4ud2lkdGh8fG4ubWluV2lkdGgsbn0sZz1mdW5jdGlvbihlLHQpe3ZhciBuPXQucm93LGk9dC5jb2x1bW4scz1pLnByb3BlcnR5O3JldHVybiBpJiZpLmZvcm1hdHRlcj9pLmZvcm1hdHRlcihuLGkpOnMmJnMuaW5kZXhPZigiLiIpPT09LTE/bltzXTooMCxkLmdldFZhbHVlQnlQYXRoKShuLHMpfTt0WyJkZWZhdWx0Il09e25hbWU6ImVsLXRhYmxlLWNvbHVtbiIscHJvcHM6e3R5cGU6e3R5cGU6U3RyaW5nLCJkZWZhdWx0IjoiZGVmYXVsdCJ9LGxhYmVsOlN0cmluZyxjbGFzc05hbWU6U3RyaW5nLHByb3BlcnR5OlN0cmluZyxwcm9wOlN0cmluZyx3aWR0aDp7fSxtaW5XaWR0aDp7fSxyZW5kZXJIZWFkZXI6RnVuY3Rpb24sc29ydGFibGU6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSwiZGVmYXVsdCI6ITF9LHNvcnRNZXRob2Q6RnVuY3Rpb24scmVzaXphYmxlOnt0eXBlOkJvb2xlYW4sImRlZmF1bHQiOiEwfSxjb250ZXh0Ont9LGFsaWduOlN0cmluZyxzaG93VG9vbHRpcFdoZW5PdmVyZmxvdzpCb29sZWFuLHNob3dPdmVyZmxvd1Rvb2x0aXA6Qm9vbGVhbixmaXhlZDpbQm9vbGVhbixTdHJpbmddLGZvcm1hdHRlcjpGdW5jdGlvbixzZWxlY3RhYmxlOkZ1bmN0aW9uLHJlc2VydmVTZWxlY3Rpb246Qm9vbGVhbixmaWx0ZXJNZXRob2Q6RnVuY3Rpb24sZmlsdGVyczpBcnJheSxmaWx0ZXJNdWx0aXBsZTp7dHlwZTpCb29sZWFuLCJkZWZhdWx0IjohMH19LHJlbmRlcjpmdW5jdGlvbigpe3JldHVybiBoKCJkaXYiLG51bGwsW3RoaXMuX3QoImRlZmF1bHQiKV0pfSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue2lzU3ViQ29sdW1uOiExLGNvbHVtbnM6W119fSxiZWZvcmVDcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLnJvdz17fSx0aGlzLmNvbHVtbj17fSx0aGlzLiRpbmRleD0wfSxjb21wb25lbnRzOntFbENoZWNrYm94Om9bImRlZmF1bHQiXSxFbFRhZzpyWyJkZWZhdWx0Il19LGNvbXB1dGVkOntvd25lcjpmdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLiRwYXJlbnQ7ZSYmIWUudGFibGVJZDspZT1lLiRwYXJlbnQ7cmV0dXJuIGV9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLmN1c3RvbVJlbmRlcj10aGlzLiRvcHRpb25zLnJlbmRlcix0aGlzLiRvcHRpb25zLnJlbmRlcj1mdW5jdGlvbih0KXtyZXR1cm4gdCgiZGl2IixudWxsLFtlLl90KCJkZWZhdWx0IildKX07dmFyIHQ9dGhpcy5jb2x1bW5JZD0odGhpcy4kcGFyZW50LnRhYmxlSWR8fHRoaXMuJHBhcmVudC5jb2x1bW5JZCsiXyIpKyJjb2x1bW5fIitjKyssbj10aGlzLiRwYXJlbnQsaT10aGlzLm93bmVyO3RoaXMuaXNTdWJDb2x1bW49aSE9PW47dmFyIHM9dGhpcy50eXBlLG89dGhpcy53aWR0aDt2b2lkIDAhPT1vJiYobz1wYXJzZUludChvLDEwKSxpc05hTihvKSYmKG89bnVsbCkpO3ZhciBhPXRoaXMubWluV2lkdGg7dm9pZCAwIT09YSYmKGE9cGFyc2VJbnQoYSwxMCksaXNOYU4oYSkmJihhPTgwKSk7dmFyIHI9ITEsbD1tKHMse2lkOnQsbGFiZWw6dGhpcy5sYWJlbCxjbGFzc05hbWU6dGhpcy5jbGFzc05hbWUscHJvcGVydHk6dGhpcy5wcm9wfHx0aGlzLnByb3BlcnR5LHR5cGU6cyxyZW5kZXJDZWxsOm51bGwscmVuZGVySGVhZGVyOnRoaXMucmVuZGVySGVhZGVyLG1pbldpZHRoOmEsd2lkdGg6byxpc0NvbHVtbkdyb3VwOnIsY29udGV4dDp0aGlzLmNvbnRleHQsYWxpZ246dGhpcy5hbGlnbj8iaXMtIit0aGlzLmFsaWduOm51bGwsc29ydGFibGU6dGhpcy5zb3J0YWJsZSxzb3J0TWV0aG9kOnRoaXMuc29ydE1ldGhvZCxyZXNpemFibGU6dGhpcy5yZXNpemFibGUsc2hvd092ZXJmbG93VG9vbHRpcDp0aGlzLnNob3dPdmVyZmxvd1Rvb2x0aXB8fHRoaXMuc2hvd1Rvb2x0aXBXaGVuT3ZlcmZsb3csZm9ybWF0dGVyOnRoaXMuZm9ybWF0dGVyLHNlbGVjdGFibGU6dGhpcy5zZWxlY3RhYmxlLHJlc2VydmVTZWxlY3Rpb246dGhpcy5yZXNlcnZlU2VsZWN0aW9uLGZpeGVkOnRoaXMuZml4ZWQsZmlsdGVyTWV0aG9kOnRoaXMuZmlsdGVyTWV0aG9kLGZpbHRlcnM6dGhpcy5maWx0ZXJzLGZpbHRlcmFibGU6dGhpcy5maWx0ZXJzfHx0aGlzLmZpbHRlck1ldGhvZCxmaWx0ZXJNdWx0aXBsZTp0aGlzLmZpbHRlck11bHRpcGxlLGZpbHRlck9wZW5lZDohMSxmaWx0ZXJlZFZhbHVlOltdfSk7KDAsdVsiZGVmYXVsdCJdKShsLHBbc118fHt9KTt2YXIgZD1sLnJlbmRlckNlbGwsZj10aGlzO2wucmVuZGVyQ2VsbD1mdW5jdGlvbihlLHQpe3JldHVybiBmLiR2bm9kZS5kYXRhLmlubGluZVRlbXBsYXRlJiYoZD1mdW5jdGlvbigpe2lmKHQuX3NlbGY9Zi5jb250ZXh0fHx0Ll9zZWxmLCJbb2JqZWN0IE9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQuX3NlbGYpKWZvcih2YXIgZSBpbiB0Ll9zZWxmKXQuaGFzT3duUHJvcGVydHkoZSl8fCh0W2VdPXQuX3NlbGZbZV0pO3JldHVybiB0Ll9zdGF0aWNUcmVlcz1mLl9zdGF0aWNUcmVlcyx0LiRvcHRpb25zLnN0YXRpY1JlbmRlckZucz1mLiRvcHRpb25zLnN0YXRpY1JlbmRlckZucyxmLmN1c3RvbVJlbmRlci5jYWxsKHQpfSksZHx8KGQ9ZyksZi5zaG93T3ZlcmZsb3dUb29sdGlwfHxmLnNob3dUb29sdGlwV2hlbk92ZXJmbG93P2UoImVsLXRvb2x0aXAiLHthdHRyczp7ZWZmZWN0OnRoaXMuZWZmZWN0LHBsYWNlbWVudDoidG9wIixkaXNhYmxlZDp0aGlzLnRvb2x0aXBEaXNhYmxlZH19LFtlKCJkaXYiLHsiY2xhc3MiOiJjZWxsIn0sW2QoZSx0KV0pLGUoInNwYW4iLHtzbG90OiJjb250ZW50In0sW2QoZSx0KV0pXSk6ZSgiZGl2Iix7ImNsYXNzIjoiY2VsbCJ9LFtkKGUsdCldKX0sdGhpcy5jb2x1bW5Db25maWc9bH0sZGVzdHJveWVkOmZ1bmN0aW9uKCl7dGhpcy4kcGFyZW50JiZ0aGlzLm93bmVyLnN0b3JlLmNvbW1pdCgicmVtb3ZlQ29sdW1uIix0aGlzLmNvbHVtbkNvbmZpZyl9LHdhdGNoOntsYWJlbDpmdW5jdGlvbihlKXt0aGlzLmNvbHVtbkNvbmZpZyYmKHRoaXMuY29sdW1uQ29uZmlnLmxhYmVsPWUpfSxwcm9wOmZ1bmN0aW9uKGUpe3RoaXMuY29sdW1uQ29uZmlnJiYodGhpcy5jb2x1bW5Db25maWcucHJvcGVydHk9ZSl9LHByb3BlcnR5OmZ1bmN0aW9uKGUpe3RoaXMuY29sdW1uQ29uZmlnJiYodGhpcy5jb2x1bW5Db25maWcucHJvcGVydHk9ZSl9LGZpbHRlcnM6ZnVuY3Rpb24oZSl7dGhpcy5jb2x1bW5Db25maWcmJih0aGlzLmNvbHVtbkNvbmZpZy5maWx0ZXJzPWUpfSxmaWx0ZXJNdWx0aXBsZTpmdW5jdGlvbihlKXt0aGlzLmNvbHVtbkNvbmZpZyYmKHRoaXMuY29sdW1uQ29uZmlnLmZpbHRlck11bHRpcGxlPWUpfSxhbGlnbjpmdW5jdGlvbihlKXt0aGlzLmNvbHVtbkNvbmZpZyYmKHRoaXMuY29sdW1uQ29uZmlnLmFsaWduPWU/ImlzLSIrZTpudWxsKX0sd2lkdGg6ZnVuY3Rpb24oZSl7dGhpcy5jb2x1bW5Db25maWcmJih0aGlzLmNvbHVtbkNvbmZpZy53aWR0aD1lLHRoaXMub3duZXIuc3RvcmUuc2NoZWR1bGVMYXlvdXQoKSl9LG1pbldpZHRoOmZ1bmN0aW9uKGUpe3RoaXMuY29sdW1uQ29uZmlnJiYodGhpcy5jb2x1bW5Db25maWcubWluV2lkdGg9ZSx0aGlzLm93bmVyLnN0b3JlLnNjaGVkdWxlTGF5b3V0KCkpfSxmaXhlZDpmdW5jdGlvbihlKXt0aGlzLmNvbHVtbkNvbmZpZyYmKHRoaXMuY29sdW1uQ29uZmlnLmZpeGVkPWUsdGhpcy5vd25lci5zdG9yZS5zY2hlZHVsZUxheW91dCgpKX19LG1vdW50ZWQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm93bmVyLHQ9dGhpcy4kcGFyZW50LG49dm9pZCAwO249dGhpcy5pc1N1YkNvbHVtbj9bXS5pbmRleE9mLmNhbGwodC4kZWwuY2hpbGRyZW4sdGhpcy4kZWwpOltdLmluZGV4T2YuY2FsbCh0LiRyZWZzLmhpZGRlbkNvbHVtbnMuY2hpbGRyZW4sdGhpcy4kZWwpLGUuc3RvcmUuY29tbWl0KCJpbnNlcnRDb2x1bW4iLHRoaXMuY29sdW1uQ29uZmlnLG4sdGhpcy5pc1N1YkNvbHVtbj90LmNvbHVtbkNvbmZpZzpudWxsKX19fSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0Ijt0Ll9fZXNNb2R1bGU9ITAsdFsiZGVmYXVsdCJdPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xLG49YXJndW1lbnRzLmxlbmd0aDt0PG47dCsrKXt2YXIgaT1hcmd1bWVudHNbdF18fHt9O2Zvcih2YXIgcyBpbiBpKWlmKGkuaGFzT3duUHJvcGVydHkocykpe3ZhciBvPWlbc107dm9pZCAwIT09byYmKGVbc109byl9fXJldHVybiBlfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fXQuX19lc01vZHVsZT0hMDt2YXIgcz1uKDEzNyksbz1pKHMpO29bImRlZmF1bHQiXS5pbnN0YWxsPWZ1bmN0aW9uKGUpe2UuY29tcG9uZW50KG9bImRlZmF1bHQiXS5uYW1lLG9bImRlZmF1bHQiXSl9LHRbImRlZmF1bHQiXT1vWyJkZWZhdWx0Il19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX10Ll9fZXNNb2R1bGU9ITA7dmFyIHM9bigxMzgpLG89aShzKSxhPW4oMTQzKSxyPWkoYSksbD1uKDE2MSksdT1pKGwpLGQ9ZnVuY3Rpb24oZSl7cmV0dXJuImRhdGVyYW5nZSI9PT1lfHwiZGF0ZXRpbWVyYW5nZSI9PT1lP3VbImRlZmF1bHQiXTpyWyJkZWZhdWx0Il19O3RbImRlZmF1bHQiXT17bWl4aW5zOltvWyJkZWZhdWx0Il1dLG5hbWU6IkVsRGF0ZVBpY2tlciIscHJvcHM6e3R5cGU6e3R5cGU6U3RyaW5nLCJkZWZhdWx0IjoiZGF0ZSJ9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5wYW5lbD1kKHRoaXMudHlwZSl9fX0sZnVuY3Rpb24oZSx0LG4pe3ZhciBpLHM7aT1uKDEzOSk7dmFyIG89bigxNDIpO3M9aT1pfHx7fSwib2JqZWN0IiE9dHlwZW9mIGlbImRlZmF1bHQiXSYmImZ1bmN0aW9uIiE9dHlwZW9mIGlbImRlZmF1bHQiXXx8KHM9aT1pWyJkZWZhdWx0Il0pLCJmdW5jdGlvbiI9PXR5cGVvZiBzJiYocz1zLm9wdGlvbnMpLHMucmVuZGVyPW8ucmVuZGVyLHMuc3RhdGljUmVuZGVyRm5zPW8uc3RhdGljUmVuZGVyRm5zLGUuZXhwb3J0cz1pfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19dC5fX2VzTW9kdWxlPSEwO3ZhciBzPW4oMTQpLG89aShzKSxhPW4oMzcpLHI9aShhKSxsPW4oMTQwKSx1PW4oMjQpLGQ9aSh1KSxjPW4oMTApLGY9aShjKSxoPW4oMTcpLHA9aShoKSxtPXtwcm9wczp7YXBwZW5kVG9Cb2R5OmRbImRlZmF1bHQiXS5wcm9wcy5hcHBlbmRUb0JvZHksb2Zmc2V0OmRbImRlZmF1bHQiXS5wcm9wcy5vZmZzZXQsYm91bmRhcmllc1BhZGRpbmc6ZFsiZGVmYXVsdCJdLnByb3BzLmJvdW5kYXJpZXNQYWRkaW5nfSxtZXRob2RzOmRbImRlZmF1bHQiXS5tZXRob2RzLGRhdGE6ZFsiZGVmYXVsdCJdLmRhdGEsYmVmb3JlRGVzdHJveTpkWyJkZWZhdWx0Il0uYmVmb3JlRGVzdHJveX0sZz0iIC0gIix2PXtkYXRlOiJ5eXl5LU1NLWRkIixtb250aDoieXl5eS1NTSIsZGF0ZXRpbWU6Inl5eXktTU0tZGQgSEg6bW06c3MiLHRpbWU6IkhIOm1tOnNzIix0aW1lcmFuZ2U6IkhIOm1tOnNzIixkYXRlcmFuZ2U6Inl5eXktTU0tZGQiLGRhdGV0aW1lcmFuZ2U6Inl5eXktTU0tZGQgSEg6bW06c3MiLHllYXI6Inl5eXkifSx5PVsiZGF0ZSIsImRhdGV0aW1lIiwidGltZSIsInRpbWUtc2VsZWN0Iiwid2VlayIsIm1vbnRoIiwieWVhciIsImRhdGVyYW5nZSIsInRpbWVyYW5nZSIsImRhdGV0aW1lcmFuZ2UiXSxiPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKDAsbC5mb3JtYXREYXRlKShlLHQpfSxfPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKDAsbC5wYXJzZURhdGUpKGUsdCl9LEM9ZnVuY3Rpb24oZSx0KXtpZihBcnJheS5pc0FycmF5KGUpJiYyPT09ZS5sZW5ndGgpe3ZhciBuPWVbMF0saT1lWzFdO2lmKG4mJmkpcmV0dXJuKDAsbC5mb3JtYXREYXRlKShuLHQpK2crKDAsbC5mb3JtYXREYXRlKShpLHQpfXJldHVybiIifSx3PWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5zcGxpdChnKTtpZigyPT09bi5sZW5ndGgpe3ZhciBpPW5bMF0scz1uWzFdO3JldHVyblsoMCxsLnBhcnNlRGF0ZSkoaSx0KSwoMCxsLnBhcnNlRGF0ZSkocyx0KV19cmV0dXJuW119LHg9eyJkZWZhdWx0Ijp7Zm9ybWF0dGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlPyIiK2U6IiJ9LHBhcnNlcjpmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZXx8IiI9PT1lP251bGw6ZX19LHdlZWs6e2Zvcm1hdHRlcjpmdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgRGF0ZSl7dmFyIHQ9KDAsbC5nZXRXZWVrTnVtYmVyKShlKTtyZXR1cm4gZS5nZXRGdWxsWWVhcigpKyJ3IisodD45P3Q6IjAiK3QpfXJldHVybiBlfSxwYXJzZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9KGV8fCIiKS5zcGxpdCgidyIpO2lmKDI9PT10Lmxlbmd0aCl7dmFyIG49TnVtYmVyKHRbMF0pLGk9TnVtYmVyKHRbMV0pO2lmKCFpc05hTihuKSYmIWlzTmFOKGkpJiZpPDU0KXJldHVybiBlfXJldHVybiBudWxsfX0sZGF0ZTp7Zm9ybWF0dGVyOmIscGFyc2VyOl99LGRhdGV0aW1lOntmb3JtYXR0ZXI6YixwYXJzZXI6X30sZGF0ZXJhbmdlOntmb3JtYXR0ZXI6QyxwYXJzZXI6d30sZGF0ZXRpbWVyYW5nZTp7Zm9ybWF0dGVyOkMscGFyc2VyOnd9LHRpbWVyYW5nZTp7Zm9ybWF0dGVyOkMscGFyc2VyOnd9LHRpbWU6e2Zvcm1hdHRlcjpiLHBhcnNlcjpffSxtb250aDp7Zm9ybWF0dGVyOmIscGFyc2VyOl99LHllYXI6e2Zvcm1hdHRlcjpiLHBhcnNlcjpffSxudW1iZXI6e2Zvcm1hdHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZT8iIitlOiIifSxwYXJzZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9TnVtYmVyKGUpO3JldHVybiBpc05hTihlKT9udWxsOnR9fX0sTT17bGVmdDoiYm90dG9tLXN0YXJ0IixjZW50ZXI6ImJvdHRvbS1jZW50ZXIiLHJpZ2h0OiJib3R0b20tZW5kIn07dFsiZGVmYXVsdCJdPXttaXhpbnM6W2ZbImRlZmF1bHQiXSxtXSxwcm9wczp7c2l6ZTpTdHJpbmcsZm9ybWF0OlN0cmluZyxyZWFkb25seTpCb29sZWFuLHBsYWNlaG9sZGVyOlN0cmluZyxkaXNhYmxlZDpCb29sZWFuLGVkaXRhYmxlOnt0eXBlOkJvb2xlYW4sImRlZmF1bHQiOiEwfSxhbGlnbjp7dHlwZTpTdHJpbmcsImRlZmF1bHQiOiJsZWZ0In0sdmFsdWU6e30saGF2ZVRyaWdnZXI6e30scGlja2VyT3B0aW9uczp7fX0sY29tcG9uZW50czp7RWxJbnB1dDpwWyJkZWZhdWx0Il19LGRpcmVjdGl2ZXM6e0NsaWNrb3V0c2lkZTpyWyJkZWZhdWx0Il19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57cGlja2VyVmlzaWJsZTohMSxzaG93Q2xvc2U6ITEsaW50ZXJuYWxWYWx1ZToiIn19LHdhdGNoOntwaWNrZXJWaXNpYmxlOmZ1bmN0aW9uKGUpe3RoaXMucmVhZG9ubHl8fHRoaXMuZGlzYWJsZWR8fChlP3RoaXMuc2hvd1BpY2tlcigpOnRoaXMuaGlkZVBpY2tlcigpKX0saW50ZXJuYWxWYWx1ZTpmdW5jdGlvbihlKXshZSYmdGhpcy5waWNrZXImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBpY2tlci5oYW5kbGVDbGVhciYmdGhpcy5waWNrZXIuaGFuZGxlQ2xlYXIoKX0sdmFsdWU6e2ltbWVkaWF0ZTohMCxoYW5kbGVyOmZ1bmN0aW9uKGUpe3RoaXMuaW50ZXJuYWxWYWx1ZT1lfX19LGNvbXB1dGVkOntyZWZlcmVuY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcmVmcy5yZWZlcmVuY2UuJGVsfSxyZWZJbnB1dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlZmVyZW5jZT90aGlzLnJlZmVyZW5jZS5xdWVyeVNlbGVjdG9yKCJpbnB1dCIpOnt9fSx2YWx1ZUlzRW1wdHk6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmludGVybmFsVmFsdWU7aWYoQXJyYXkuaXNBcnJheShlKSl7Zm9yKHZhciB0PTAsbj1lLmxlbmd0aDt0PG47dCsrKWlmKGVbdF0pcmV0dXJuITF9ZWxzZSBpZihlKXJldHVybiExO3JldHVybiEwfSx0cmlnZ2VyQ2xhc3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlLmluZGV4T2YoInRpbWUiKSE9PS0xPyJlbC1pY29uLXRpbWUiOiJlbC1pY29uLWRhdGUifSxzZWxlY3Rpb25Nb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIndlZWsiPT09dGhpcy50eXBlPyJ3ZWVrIjoibW9udGgiPT09dGhpcy50eXBlPyJtb250aCI6InllYXIiPT09dGhpcy50eXBlPyJ5ZWFyIjoiZGF5In0saGF2ZVRyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHRoaXMuc2hvd1RyaWdnZXI/dGhpcy5zaG93VHJpZ2dlcjp5LmluZGV4T2YodGhpcy50eXBlKSE9PS0xfSx2aXN1YWxWYWx1ZTp7Z2V0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5pbnRlcm5hbFZhbHVlO2lmKGUpe3ZhciB0PSh4W3RoaXMudHlwZV18fHhbImRlZmF1bHQiXSkuZm9ybWF0dGVyLG49dlt0aGlzLnR5cGVdO3JldHVybiB0KGUsdGhpcy5mb3JtYXR8fG4pfX0sc2V0OmZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PXRoaXMudHlwZSxuPSh4W3RdfHx4WyJkZWZhdWx0Il0pLnBhcnNlcixpPW4oZSx0aGlzLmZvcm1hdHx8dlt0XSk7cmV0dXJuIHZvaWQoaSYmKHRoaXMucGlja2VyLnZhbHVlPWkpKX10aGlzLnBpY2tlci52YWx1ZT1lfX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnM9e2JvdW5kYXJpZXNQYWRkaW5nOjAsZ3B1QWNjZWxlcmF0aW9uOiExfSx0aGlzLnBsYWNlbWVudD1NW3RoaXMuYWxpZ25dfHxNLmxlZnR9LG1ldGhvZHM6e2hhbmRsZU1vdXNlRW50ZXJJY29uOmZ1bmN0aW9uKCl7dGhpcy5yZWFkb25seXx8dGhpcy5kaXNhYmxlZHx8dGhpcy52YWx1ZUlzRW1wdHl8fCh0aGlzLnNob3dDbG9zZT0hMCl9LGhhbmRsZUNsaWNrSWNvbjpmdW5jdGlvbigpe3RoaXMucmVhZG9ubHl8fHRoaXMuZGlzYWJsZWR8fCh0aGlzLnZhbHVlSXNFbXB0eT90aGlzLnBpY2tlclZpc2libGU9IXRoaXMucGlja2VyVmlzaWJsZToodGhpcy5pbnRlcm5hbFZhbHVlPSIiLHRoaXMuJGVtaXQoImlucHV0IiwiIikpKX0saGFuZGxlQ2xvc2U6ZnVuY3Rpb24oKXt0aGlzLnBpY2tlclZpc2libGU9ITF9LGhhbmRsZUZvY3VzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy50eXBlO3kuaW5kZXhPZihlKT09PS0xfHx0aGlzLnBpY2tlclZpc2libGV8fCh0aGlzLnBpY2tlclZpc2libGU9ITApLHRoaXMuJGVtaXQoImZvY3VzIix0aGlzKX0saGFuZGxlQmx1cjpmdW5jdGlvbigpe3RoaXMuJGVtaXQoImJsdXIiLHRoaXMpLHRoaXMuZGlzcGF0Y2goIkVsRm9ybUl0ZW0iLCJlbC5mb3JtLmJsdXIiKX0saGFuZGxlS2V5ZG93bjpmdW5jdGlvbihlKXt2YXIgdD1lLmtleUNvZGU7OT09PXQmJih0aGlzLnBpY2tlclZpc2libGU9ITEpfSxoaWRlUGlja2VyOmZ1bmN0aW9uKCl7dGhpcy5waWNrZXImJih0aGlzLnBpY2tlci5yZXNldFZpZXcmJnRoaXMucGlja2VyLnJlc2V0VmlldygpLHRoaXMucGlja2VyVmlzaWJsZT10aGlzLnBpY2tlci52aXNpYmxlPSExLHRoaXMuZGVzdHJveVBvcHBlcigpKX0sc2hvd1BpY2tlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYodGhpcy5waWNrZXIpdGhpcy5waWNrZXJWaXNpYmxlPXRoaXMucGlja2VyLnZpc2libGU9ITA7ZWxzZXt0aGlzLnBhbmVsLmRlZmF1bHRWYWx1ZT10aGlzLmludGVybmFsVmFsdWUsdGhpcy5waWNrZXI9bmV3IG9bImRlZmF1bHQiXSh0aGlzLnBhbmVsKS4kbW91bnQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpLHRoaXMucG9wcGVyRWxtPXRoaXMucGlja2VyLiRlbCx0aGlzLnBpY2tlci53aWR0aD10aGlzLnJlZmVyZW5jZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCx0aGlzLnBpY2tlci5zaG93VGltZT0iZGF0ZXRpbWUiPT09dGhpcy50eXBlfHwiZGF0ZXRpbWVyYW5nZSI9PT10aGlzLnR5cGUsdGhpcy5waWNrZXIuc2VsZWN0aW9uTW9kZT10aGlzLnNlbGVjdGlvbk1vZGUsdGhpcy5mb3JtYXQmJih0aGlzLnBpY2tlci5mb3JtYXQ9dGhpcy5mb3JtYXQpO3ZhciB0PXRoaXMucGlja2VyT3B0aW9uczt0JiZ0LnNlbGVjdGFibGVSYW5nZSYmIWZ1bmN0aW9uKCl7dmFyIG49dC5zZWxlY3RhYmxlUmFuZ2UsaT14LmRhdGV0aW1lcmFuZ2UucGFyc2VyLHM9di50aW1lcmFuZ2U7bj1BcnJheS5pc0FycmF5KG4pP246W25dLGUucGlja2VyLnNlbGVjdGFibGVSYW5nZT1uLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gaShlLHMpfSl9KCksInRpbWUtc2VsZWN0Ij09PXRoaXMudHlwZSYmdCYmdGhpcy4kd2F0Y2goInBpY2tlck9wdGlvbnMubWluVGltZSIsZnVuY3Rpb24odCl7ZS5waWNrZXIubWluVGltZT10fSk7Zm9yKHZhciBuIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmInNlbGVjdGFibGVSYW5nZSIhPT1uJiYodGhpcy5waWNrZXJbbl09dFtuXSk7dGhpcy4kZWwuYXBwZW5kQ2hpbGQodGhpcy5waWNrZXIuJGVsKSx0aGlzLnBpY2tlclZpc2libGU9dGhpcy5waWNrZXIudmlzaWJsZT0hMCx0aGlzLnBpY2tlci5yZXNldFZpZXcmJnRoaXMucGlja2VyLnJlc2V0VmlldygpLHRoaXMucGlja2VyLiRvbigiZG9kZXN0cm95Iix0aGlzLmRvRGVzdHJveSksdGhpcy5waWNrZXIuJG9uKCJwaWNrIixmdW5jdGlvbih0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdO2UuJGVtaXQoImlucHV0Iix0KSxlLnBpY2tlclZpc2libGU9ZS5waWNrZXIudmlzaWJsZT1uLGUucGlja2VyLnJlc2V0VmlldyYmZS5waWNrZXIucmVzZXRWaWV3KCl9KSx0aGlzLnBpY2tlci4kb24oInNlbGVjdC1yYW5nZSIsZnVuY3Rpb24odCxuKXtlLnJlZklucHV0LnNldFNlbGVjdGlvblJhbmdlKHQsbiksZS5yZWZJbnB1dC5mb2N1cygpfSl9dGhpcy51cGRhdGVQb3BwZXIoKSx0aGlzLmludGVybmFsVmFsdWUgaW5zdGFuY2VvZiBEYXRlP3RoaXMucGlja2VyLmRhdGU9bmV3IERhdGUodGhpcy5pbnRlcm5hbFZhbHVlLmdldFRpbWUoKSk6dGhpcy5waWNrZXIudmFsdWU9dGhpcy5pbnRlcm5hbFZhbHVlLHRoaXMucGlja2VyLnJlc2V0VmlldyYmdGhpcy5waWNrZXIucmVzZXRWaWV3KCksdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24oKXtlLnBpY2tlci5hanVzdFNjcm9sbFRvcCYmZS5waWNrZXIuYWp1c3RTY3JvbGxUb3AoKX0pfX19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOnsiZGVmYXVsdCI6ZX19dC5fX2VzTW9kdWxlPSEwLHQubGltaXRSYW5nZT10LmdldFJhbmdlSG91cnM9dC5uZXh0TW9udGg9dC5wcmV2TW9udGg9dC5nZXRXZWVrTnVtYmVyPXQuZ2V0U3RhcnREYXRlT2ZNb250aD10LkRBWV9EVVJBVElPTj10LmdldEZpcnN0RGF5T2ZNb250aD10LmdldERheUNvdW50T2ZNb250aD10LnBhcnNlRGF0ZT10LmZvcm1hdERhdGU9dC50b0RhdGU9dm9pZCAwO3ZhciBzPW4oMTQxKSxvPWkocyksYT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXSxpPWU7aTw9dDtpKyspbi5wdXNoKGkpO3JldHVybiBufSxyPXQudG9EYXRlPWZ1bmN0aW9uKGUpe3JldHVybiBlPW5ldyBEYXRlKGUpLGlzTmFOKGUuZ2V0VGltZSgpKT9udWxsOmV9LGw9KHQuZm9ybWF0RGF0ZT1mdW5jdGlvbihlLHQpe3JldHVybiBlPXIoZSksZT9vWyJkZWZhdWx0Il0uZm9ybWF0KGUsdHx8Inl5eXktTU0tZGQiKToiIn0sdC5wYXJzZURhdGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gb1siZGVmYXVsdCJdLnBhcnNlKGUsdHx8Inl5eXktTU0tZGQiKX0sdC5nZXREYXlDb3VudE9mTW9udGg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gMz09PXR8fDU9PT10fHw4PT09dHx8MTA9PT10PzMwOjE9PT10P2UlND09PTAmJmUlMTAwIT09MHx8ZSU0MDA9PT0wPzI5OjI4OjMxfSksdT0odC5nZXRGaXJzdERheU9mTW9udGg9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IERhdGUoZS5nZXRUaW1lKCkpO3JldHVybiB0LnNldERhdGUoMSksdC5nZXREYXkoKX0sdC5EQVlfRFVSQVRJT049ODY0ZTUpO3QuZ2V0U3RhcnREYXRlT2ZNb250aD1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBEYXRlKGUsdCwxKSxpPW4uZ2V0RGF5KCk7cmV0dXJuIDA9PT1pP24uc2V0VGltZShuLmdldFRpbWUoKS03KnUpOm4uc2V0VGltZShuLmdldFRpbWUoKS11KmkpLG59LHQuZ2V0V2Vla051bWJlcj1mdW5jdGlvbihlKXt2YXIgdD1uZXcgRGF0ZShlLmdldFRpbWUoKSk7dC5zZXRIb3VycygwLDAsMCwwKSx0LnNldERhdGUodC5nZXREYXRlKCkrMy0odC5nZXREYXkoKSs2KSU3KTt2YXIgbj1uZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksMCw0KTtyZXR1cm4gMStNYXRoLnJvdW5kKCgodC5nZXRUaW1lKCktbi5nZXRUaW1lKCkpLzg2NGU1LTMrKG4uZ2V0RGF5KCkrNiklNykvNyl9LHQucHJldk1vbnRoPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0RnVsbFllYXIoKSxuPWUuZ2V0TW9udGgoKSxpPWUuZ2V0RGF0ZSgpLHM9MD09PW4/dC0xOnQsbz0wPT09bj8xMTpuLTEsYT1sKHMsbyk7cmV0dXJuIGE8aSYmZS5zZXREYXRlKGEpLGUuc2V0TW9udGgobyksZS5zZXRGdWxsWWVhcihzKSxuZXcgRGF0ZShlLmdldFRpbWUoKSl9LHQubmV4dE1vbnRoPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0RnVsbFllYXIoKSxuPWUuZ2V0TW9udGgoKSxpPWUuZ2V0RGF0ZSgpLHM9MTE9PT1uP3QrMTp0LG89MTE9PT1uPzA6bisxLGE9bChzLG8pO3JldHVybiBhPGkmJmUuc2V0RGF0ZShhKSxlLnNldE1vbnRoKG8pLGUuc2V0RnVsbFllYXIocyksbmV3IERhdGUoZS5nZXRUaW1lKCkpfSx0LmdldFJhbmdlSG91cnM9ZnVuY3Rpb24oZSl7dmFyIHQ9W10sbj1bXTtpZigoZXx8W10pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0SG91cnMoKX0pO249bi5jb25jYXQoYSh0WzBdLHRbMV0pKX0pLG4ubGVuZ3RoKWZvcih2YXIgaT0wO2k8MjQ7aSsrKXRbaV09bi5pbmRleE9mKGkpPT09LTE7ZWxzZSBmb3IodmFyIHM9MDtzPDI0O3MrKyl0W3NdPSExO3JldHVybiB0fSx0LmxpbWl0UmFuZ2U9ZnVuY3Rpb24oZSx0KXtpZighdHx8IXQubGVuZ3RoKXJldHVybiBlO3ZhciBuPXQubGVuZ3RoLGk9IkhIOm1tOnNzIjtlPW9bImRlZmF1bHQiXS5wYXJzZShvWyJkZWZhdWx0Il0uZm9ybWF0KGUsaSksaSk7Zm9yKHZhciBzPTA7czxuO3MrKyl7dmFyIGE9dFtzXTtpZihlPj1hWzBdJiZlPD1hWzFdKXJldHVybiBlfXZhciByPXRbMF1bMF0sbD10WzBdWzBdO3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24oZSl7bD1uZXcgRGF0ZShNYXRoLm1pbihlWzBdLGwpKSxyPW5ldyBEYXRlKE1hdGgubWF4KGVbMV0scikpfSksZTxsP2w6cn19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgaTshZnVuY3Rpb24ocyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSx0KXtmb3IodmFyIG49W10saT0wLHM9ZS5sZW5ndGg7aTxzO2krKyluLnB1c2goZVtpXS5zdWJzdHIoMCx0KSk7cmV0dXJuIG59ZnVuY3Rpb24gYShlKXtyZXR1cm4gZnVuY3Rpb24odCxuLGkpe3ZhciBzPWlbZV0uaW5kZXhPZihuLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK24uc3Vic3RyKDEpLnRvTG93ZXJDYXNlKCkpO35zJiYodC5tb250aD1zKX19ZnVuY3Rpb24gcihlLHQpe2ZvcihlPVN0cmluZyhlKSx0PXR8fDI7ZS5sZW5ndGg8dDspZT0iMCIrZTtyZXR1cm4gZX12YXIgbD17fSx1PS9kezEsNH18TXsxLDR9fHl5KD86eXkpP3xTezEsM318RG98Wlp8KFtIaE1zRG1dKVwxP3xbYUFdfCJbXiJdKiJ8J1teJ10qJy9nLGQ9L1xkXGQ/LyxjPS9cZHszfS8sZj0vXGR7NH0vLGg9L1swLTldKlsnYS16XHUwMEEwLVx1MDVGRlx1MDcwMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0rfFtcdTA2MDAtXHUwNkZGXC9dKyhccyo/W1x1MDYwMC1cdTA2RkZdKyl7MSwyfS9pLHA9ZnVuY3Rpb24oKXt9LG09WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLGc9WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHY9byhnLDMpLHk9byhtLDMpO2wuaTE4bj17ZGF5TmFtZXNTaG9ydDp5LGRheU5hbWVzOm0sbW9udGhOYW1lc1Nob3J0OnYsbW9udGhOYW1lczpnLGFtUG06WyJhbSIsInBtIl0sRG9GbjpmdW5jdGlvbihlKXtyZXR1cm4gZStbInRoIiwic3QiLCJuZCIsInJkIl1bZSUxMD4zPzA6KGUtZSUxMCE9PTEwKSplJTEwXX19O3ZhciBiPXtEOmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldERheSgpfSxERDpmdW5jdGlvbihlKXtyZXR1cm4gcihlLmdldERheSgpKX0sRG86ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5Eb0ZuKGUuZ2V0RGF0ZSgpKX0sZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXREYXRlKCl9LGRkOmZ1bmN0aW9uKGUpe3JldHVybiByKGUuZ2V0RGF0ZSgpKX0sZGRkOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuZGF5TmFtZXNTaG9ydFtlLmdldERheSgpXX0sZGRkZDpmdW5jdGlvbihlLHQpe3JldHVybiB0LmRheU5hbWVzW2UuZ2V0RGF5KCldfSxNOmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldE1vbnRoKCkrMX0sTU06ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZS5nZXRNb250aCgpKzEpfSxNTU06ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5tb250aE5hbWVzU2hvcnRbZS5nZXRNb250aCgpXX0sTU1NTTpmdW5jdGlvbihlLHQpe3JldHVybiB0Lm1vbnRoTmFtZXNbZS5nZXRNb250aCgpXX0seXk6ZnVuY3Rpb24oZSl7cmV0dXJuIFN0cmluZyhlLmdldEZ1bGxZZWFyKCkpLnN1YnN0cigyKX0seXl5eTpmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRGdWxsWWVhcigpfSxoOmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEhvdXJzKCklMTJ8fDEyfSxoaDpmdW5jdGlvbihlKXtyZXR1cm4gcihlLmdldEhvdXJzKCklMTJ8fDEyKX0sSDpmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRIb3VycygpfSxISDpmdW5jdGlvbihlKXtyZXR1cm4gcihlLmdldEhvdXJzKCkpfSxtOmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldE1pbnV0ZXMoKX0sbW06ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZS5nZXRNaW51dGVzKCkpfSxzOmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldFNlY29uZHMoKX0sc3M6ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZS5nZXRTZWNvbmRzKCkpfSxTOmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnJvdW5kKGUuZ2V0TWlsbGlzZWNvbmRzKCkvMTAwKX0sU1M6ZnVuY3Rpb24oZSl7cmV0dXJuIHIoTWF0aC5yb3VuZChlLmdldE1pbGxpc2Vjb25kcygpLzEwKSwyKX0sU1NTOmZ1bmN0aW9uKGUpe3JldHVybiByKGUuZ2V0TWlsbGlzZWNvbmRzKCksMyl9LGE6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5nZXRIb3VycygpPDEyP3QuYW1QbVswXTp0LmFtUG1bMV19LEE6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5nZXRIb3VycygpPDEyP3QuYW1QbVswXS50b1VwcGVyQ2FzZSgpOnQuYW1QbVsxXS50b1VwcGVyQ2FzZSgpfSxaWjpmdW5jdGlvbihlKXt2YXIgdD1lLmdldFRpbWV6b25lT2Zmc2V0KCk7cmV0dXJuKHQ+MD8iLSI6IisiKStyKDEwMCpNYXRoLmZsb29yKE1hdGguYWJzKHQpLzYwKStNYXRoLmFicyh0KSU2MCw0KX19LF89e2Q6W2QsZnVuY3Rpb24oZSx0KXtlLmRheT10fV0sTTpbZCxmdW5jdGlvbihlLHQpe2UubW9udGg9dC0xfV0seXk6W2QsZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgRGF0ZSxpPSsoIiIrbi5nZXRGdWxsWWVhcigpKS5zdWJzdHIoMCwyKTtlLnllYXI9IiIrKHQ+Njg/aS0xOmkpK3R9XSxoOltkLGZ1bmN0aW9uKGUsdCl7ZS5ob3VyPXR9XSxtOltkLGZ1bmN0aW9uKGUsdCl7ZS5taW51dGU9dH1dLHM6W2QsZnVuY3Rpb24oZSx0KXtlLnNlY29uZD10fV0seXl5eTpbZixmdW5jdGlvbihlLHQpe2UueWVhcj10fV0sUzpbL1xkLyxmdW5jdGlvbihlLHQpe2UubWlsbGlzZWNvbmQ9MTAwKnR9XSxTUzpbL1xkezJ9LyxmdW5jdGlvbihlLHQpe2UubWlsbGlzZWNvbmQ9MTAqdH1dLFNTUzpbYyxmdW5jdGlvbihlLHQpe2UubWlsbGlzZWNvbmQ9dH1dLEQ6W2QscF0sZGRkOltoLHBdLE1NTTpbaCxhKCJtb250aE5hbWVzU2hvcnQiKV0sTU1NTTpbaCxhKCJtb250aE5hbWVzIildLGE6W2gsZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXQudG9Mb3dlckNhc2UoKTtpPT09bi5hbVBtWzBdP2UuaXNQbT0hMTppPT09bi5hbVBtWzFdJiYoZS5pc1BtPSEwKX1dLFpaOlsvW1wrXC1dXGRcZDo/XGRcZC8sZnVuY3Rpb24oZSx0KXt2YXIgbixpPSh0KyIiKS5tYXRjaCgvKFtcK1wtXXxcZFxkKS9naSk7aSYmKG49Kyg2MCppWzFdKStwYXJzZUludChpWzJdLDEwKSxlLnRpbWV6b25lT2Zmc2V0PSIrIj09PWlbMF0/bjotbil9XX07Xy5ERD1fLkRELF8uZGRkZD1fLmRkZCxfLkRvPV8uZGQ9Xy5kLF8ubW09Xy5tLF8uaGg9Xy5IPV8uSEg9Xy5oLF8uTU09Xy5NLF8uc3M9Xy5zLF8uQT1fLmEsbC5tYXNrcz17ImRlZmF1bHQiOiJkZGQgTU1NIGRkIHl5eXkgSEg6bW06c3MiLHNob3J0RGF0ZToiTS9EL3l5IixtZWRpdW1EYXRlOiJNTU0gZCwgeXl5eSIsbG9uZ0RhdGU6Ik1NTU0gZCwgeXl5eSIsZnVsbERhdGU6ImRkZGQsIE1NTU0gZCwgeXl5eSIsc2hvcnRUaW1lOiJISDptbSIsbWVkaXVtVGltZToiSEg6bW06c3MiLGxvbmdUaW1lOiJISDptbTpzcy5TU1MifSxsLmZvcm1hdD1mdW5jdGlvbihlLHQsbil7dmFyIGk9bnx8bC5pMThuO2lmKCJudW1iZXIiPT10eXBlb2YgZSYmKGU9bmV3IERhdGUoZSkpLCJbb2JqZWN0IERhdGVdIiE9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKXx8aXNOYU4oZS5nZXRUaW1lKCkpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBEYXRlIGluIGZlY2hhLmZvcm1hdCIpO3JldHVybiB0PWwubWFza3NbdF18fHR8fGwubWFza3NbImRlZmF1bHQiXSx0LnJlcGxhY2UodSxmdW5jdGlvbih0KXtyZXR1cm4gdCBpbiBiP2JbdF0oZSxpKTp0LnNsaWNlKDEsdC5sZW5ndGgtMSl9KX0sbC5wYXJzZT1mdW5jdGlvbihlLHQsbil7dmFyIGk9bnx8bC5pMThuO2lmKCJzdHJpbmciIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgZm9ybWF0IGluIGZlY2hhLnBhcnNlIik7aWYodD1sLm1hc2tzW3RdfHx0LGUubGVuZ3RoPjFlMylyZXR1cm4hMTt2YXIgcz0hMCxvPXt9O2lmKHQucmVwbGFjZSh1LGZ1bmN0aW9uKHQpe2lmKF9bdF0pe3ZhciBuPV9bdF0sYT1lLnNlYXJjaChuWzBdKTt+YT9lLnJlcGxhY2UoblswXSxmdW5jdGlvbih0KXtyZXR1cm4gblsxXShvLHQsaSksZT1lLnN1YnN0cihhK3QubGVuZ3RoKSx0fSk6cz0hMX1yZXR1cm4gX1t0XT8iIjp0LnNsaWNlKDEsdC5sZW5ndGgtMSl9KSwhcylyZXR1cm4hMTt2YXIgYT1uZXcgRGF0ZTtvLmlzUG09PT0hMCYmbnVsbCE9by5ob3VyJiYxMiE9PStvLmhvdXI/by5ob3VyPStvLmhvdXIrMTI6by5pc1BtPT09ITEmJjEyPT09K28uaG91ciYmKG8uaG91cj0wKTt2YXIgcjtyZXR1cm4gbnVsbCE9by50aW1lem9uZU9mZnNldD8oby5taW51dGU9KyhvLm1pbnV0ZXx8MCktK28udGltZXpvbmVPZmZzZXQscj1uZXcgRGF0ZShEYXRlLlVUQyhvLnllYXJ8fGEuZ2V0RnVsbFllYXIoKSxvLm1vbnRofHwwLG8uZGF5fHwxLG8uaG91cnx8MCxvLm1pbnV0ZXx8MCxvLnNlY29uZHx8MCxvLm1pbGxpc2Vjb25kfHwwKSkpOnI9bmV3IERhdGUoby55ZWFyfHxhLmdldEZ1bGxZZWFyKCksby5tb250aHx8MCxvLmRheXx8MSxvLmhvdXJ8fDAsby5taW51dGV8fDAsby5zZWNvbmR8fDAsby5taWxsaXNlY29uZHx8MCkscn0sInVuZGVmaW5lZCIhPXR5cGVvZiBlJiZlLmV4cG9ydHM/ZS5leHBvcnRzPWw6KGk9ZnVuY3Rpb24oKXtyZXR1cm4gbH0uY2FsbCh0LG4sdCxlKSwhKHZvaWQgMCE9PWkmJihlLmV4cG9ydHM9aSkpKX0odGhpcyl9LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS4kY3JlYXRlRWxlbWVudDtlLl9jO3JldHVybiB0KCJlbC1pbnB1dCIse2RpcmVjdGl2ZXM6W3tuYW1lOiJjbGlja291dHNpZGUiLHJhd05hbWU6InYtY2xpY2tvdXRzaWRlIix2YWx1ZTplLmhhbmRsZUNsb3NlLGV4cHJlc3Npb246ImhhbmRsZUNsb3NlIn1dLHJlZjoicmVmZXJlbmNlIixzdGF0aWNDbGFzczoiZWwtZGF0ZS1lZGl0b3IiLGF0dHJzOntyZWFkb25seTohZS5lZGl0YWJsZXx8ZS5yZWFkb25seSxkaXNhYmxlZDplLmRpc2FibGVkLHNpemU6ZS5zaXplLHBsYWNlaG9sZGVyOmUucGxhY2Vob2xkZXJ9LGRvbVByb3BzOnt2YWx1ZTplLnZpc3VhbFZhbHVlfSxvbjp7Zm9jdXM6ZS5oYW5kbGVGb2N1cyxibHVyOmUuaGFuZGxlQmx1cn0sbmF0aXZlT246e2tleWRvd246ZnVuY3Rpb24odCl7ZS5oYW5kbGVLZXlkb3duKHQpfSxjaGFuZ2U6ZnVuY3Rpb24odCl7ZS52aXN1YWxWYWx1ZT10LnRhcmdldC52YWx1ZX19fSxbZS5oYXZlVHJpZ2dlcj90KCJpIix7c2xvdDoiaWNvbiIsc3RhdGljQ2xhc3M6ImVsLWlucHV0X19pY29uIiwiY2xhc3MiOltlLnNob3dDbG9zZT8iZWwtaWNvbi1jbG9zZSI6ZS50cmlnZ2VyQ2xhc3NdLG9uOntjbGljazplLmhhbmRsZUNsaWNrSWNvbixtb3VzZWVudGVyOmUuaGFuZGxlTW91c2VFbnRlckljb24sbW91c2VsZWF2ZTpmdW5jdGlvbih0KXtlLnNob3dDbG9zZT0hMX19fSk6ZS5fZSgpXSl9LHN0YXRpY1JlbmRlckZuczpbXX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgaSxzO2k9bigxNDQpO3ZhciBvPW4oMTYwKTtzPWk9aXx8e30sIm9iamVjdCIhPXR5cGVvZiBpWyJkZWZhdWx0Il0mJiJmdW5jdGlvbiIhPXR5cGVvZiBpWyJkZWZhdWx0Il18fChzPWk9aVsiZGVmYXVsdCJdKSwiZnVuY3Rpb24iPT10eXBlb2YgcyYmKHM9cy5vcHRpb25zKSxzLnJlbmRlcj1vLnJlbmRlcixzLnN0YXRpY1JlbmRlckZucz1vLnN0YXRpY1JlbmRlckZucyxlLmV4cG9ydHM9aX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ImRlZmF1bHQiOmV9fXQuX19lc01vZHVsZT0hMDt2YXIgcz1uKDE0MCksbz1uKDExKSxhPWkobykscj1uKDE3KSxsPWkociksdT1uKDE0NSksZD1pKHUpLGM9bigxNTEpLGY9aShjKSxoPW4oMTU0KSxwPWkoaCksbT1uKDE1NyksZz1pKG0pO3RbImRlZmF1bHQiXT17bWl4aW5zOlthWyJkZWZhdWx0Il1dLHdhdGNoOntzaG93VGltZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2UmJnRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uKGUpe3ZhciBuPXQuJHJlZnMuaW5wdXQuJGVsO24mJih0LnBpY2tlcldpZHRoPW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgrMTApfSl9LHZhbHVlOmZ1bmN0aW9uKGUpe2lmKGUmJihlPW5ldyBEYXRlKGUpLCFpc05hTihlKSkpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmRpc2FibGVkRGF0ZSYmdGhpcy5kaXNhYmxlZERhdGUobmV3IERhdGUoZSkpKXJldHVybjt0aGlzLmRhdGU9ZSx0aGlzLnllYXI9ZS5nZXRGdWxsWWVhcigpLHRoaXMubW9udGg9ZS5nZXRNb250aCgpLAp0aGlzLiRlbWl0KCJwaWNrIixlLCEwKX19LHRpbWVQaWNrZXJWaXNpYmxlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7ZSYmdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24oKXtyZXR1cm4gdC4kcmVmcy50aW1lcGlja2VyLmFqdXN0U2Nyb2xsVG9wKCl9KX0sc2VsZWN0aW9uTW9kZTpmdW5jdGlvbihlKXsibW9udGgiPT09ZSYmKCJ5ZWFyIj09PXRoaXMuY3VycmVudFZpZXcmJiJtb250aCI9PT10aGlzLmN1cnJlbnRWaWV3fHwodGhpcy5jdXJyZW50Vmlldz0ibW9udGgiKSl9LGRhdGU6ZnVuY3Rpb24oZSl7dGhpcy55ZWFyfHwodGhpcy55ZWFyPWUuZ2V0RnVsbFllYXIoKSx0aGlzLm1vbnRoPWUuZ2V0TW9udGgoKSl9fSxtZXRob2RzOntoYW5kbGVDbGVhcjpmdW5jdGlvbigpe3RoaXMuZGF0ZT1uZXcgRGF0ZSx0aGlzLiRlbWl0KCJwaWNrIiwiIil9LHJlc2V0RGF0ZTpmdW5jdGlvbigpe3RoaXMuZGF0ZT1uZXcgRGF0ZSh0aGlzLmRhdGUpfSxzaG93TW9udGhQaWNrZXI6ZnVuY3Rpb24oKXt0aGlzLmN1cnJlbnRWaWV3PSJtb250aCJ9LHNob3dZZWFyUGlja2VyOmZ1bmN0aW9uKCl7dGhpcy5jdXJyZW50Vmlldz0ieWVhciJ9LHByZXZNb250aDpmdW5jdGlvbigpe3RoaXMubW9udGgtLSx0aGlzLm1vbnRoPDAmJih0aGlzLm1vbnRoPTExLHRoaXMueWVhci0tKX0sbmV4dE1vbnRoOmZ1bmN0aW9uKCl7dGhpcy5tb250aCsrLHRoaXMubW9udGg+MTEmJih0aGlzLm1vbnRoPTAsdGhpcy55ZWFyKyspfSxuZXh0WWVhcjpmdW5jdGlvbigpeyJ5ZWFyIj09PXRoaXMuY3VycmVudFZpZXc/dGhpcy4kcmVmcy55ZWFyVGFibGUubmV4dFRlblllYXIoKToodGhpcy55ZWFyKyssdGhpcy5kYXRlLnNldEZ1bGxZZWFyKHRoaXMueWVhciksdGhpcy5yZXNldERhdGUoKSl9LHByZXZZZWFyOmZ1bmN0aW9uKCl7InllYXIiPT09dGhpcy5jdXJyZW50Vmlldz90aGlzLiRyZWZzLnllYXJUYWJsZS5wcmV2VGVuWWVhcigpOih0aGlzLnllYXItLSx0aGlzLmRhdGUuc2V0RnVsbFllYXIodGhpcy55ZWFyKSx0aGlzLnJlc2V0RGF0ZSgpKX0saGFuZGxlU2hvcnRjdXRDbGljazpmdW5jdGlvbihlKXtlLm9uQ2xpY2smJmUub25DbGljayh0aGlzKX0saGFuZGxlVGltZVBpY2s6ZnVuY3Rpb24oZSx0LG4pe2lmKGUpe3ZhciBpPW5ldyBEYXRlKHRoaXMuZGF0ZS5nZXRUaW1lKCkpLHM9ZS5nZXRIb3VycygpLG89ZS5nZXRNaW51dGVzKCksYT1lLmdldFNlY29uZHMoKTtpLnNldEhvdXJzKHMpLGkuc2V0TWludXRlcyhvKSxpLnNldFNlY29uZHMoYSksdGhpcy5kYXRlPW5ldyBEYXRlKGkuZ2V0VGltZSgpKX1ufHwodGhpcy50aW1lUGlja2VyVmlzaWJsZT10KX0saGFuZGxlTW9udGhQaWNrOmZ1bmN0aW9uKGUpe3RoaXMubW9udGg9ZTt2YXIgdD10aGlzLnNlbGVjdGlvbk1vZGU7aWYoIm1vbnRoIiE9PXQpdGhpcy5kYXRlLnNldE1vbnRoKGUpLHRoaXMuY3VycmVudFZpZXc9ImRhdGUiLHRoaXMucmVzZXREYXRlKCk7ZWxzZXt0aGlzLmRhdGUuc2V0TW9udGgoZSksdGhpcy55ZWFyJiZ0aGlzLmRhdGUuc2V0RnVsbFllYXIodGhpcy55ZWFyKSx0aGlzLnJlc2V0RGF0ZSgpO3ZhciBuPW5ldyBEYXRlKHRoaXMuZGF0ZS5nZXRGdWxsWWVhcigpLGUsMSk7dGhpcy4kZW1pdCgicGljayIsbil9fSxoYW5kbGVEYXRlUGljazpmdW5jdGlvbihlKXtpZigiZGF5Ij09PXRoaXMuc2VsZWN0aW9uTW9kZSl0aGlzLnNob3dUaW1lfHx0aGlzLiRlbWl0KCJwaWNrIixuZXcgRGF0ZShlLmdldFRpbWUoKSkpLHRoaXMuZGF0ZS5zZXRGdWxsWWVhcihlLmdldEZ1bGxZZWFyKCkpLHRoaXMuZGF0ZS5zZXRNb250aChlLmdldE1vbnRoKCkpLHRoaXMuZGF0ZS5zZXREYXRlKGUuZ2V0RGF0ZSgpKTtlbHNlIGlmKCJ3ZWVrIj09PXRoaXMuc2VsZWN0aW9uTW9kZSl7dmFyIHQ9KDAscy5mb3JtYXREYXRlKShlLmRhdGUsdGhpcy5mb3JtYXR8fCJ5eXl5d1dXIiksbj10aGlzLndlZWs9ZS53ZWVrO3Q9L1dXLy50ZXN0KHQpP3QucmVwbGFjZSgvV1cvLG48MTA/IjAiK246bik6dC5yZXBsYWNlKC9XLyxuKSx0aGlzLiRlbWl0KCJwaWNrIix0KX10aGlzLnJlc2V0RGF0ZSgpfSxoYW5kbGVZZWFyUGljazpmdW5jdGlvbihlKXt2YXIgdD0hKGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdKXx8YXJndW1lbnRzWzFdO3RoaXMueWVhcj1lLHQmJih0aGlzLmRhdGUuc2V0RnVsbFllYXIoZSksInllYXIiPT09dGhpcy5zZWxlY3Rpb25Nb2RlP3RoaXMuJGVtaXQoInBpY2siLG5ldyBEYXRlKGUpKTp0aGlzLmN1cnJlbnRWaWV3PSJtb250aCIsdGhpcy5yZXNldERhdGUoKSl9LGNoYW5nZVRvTm93OmZ1bmN0aW9uKCl7dGhpcy5kYXRlLnNldFRpbWUoK25ldyBEYXRlKSx0aGlzLiRlbWl0KCJwaWNrIixuZXcgRGF0ZSh0aGlzLmRhdGUuZ2V0VGltZSgpKSksdGhpcy5yZXNldERhdGUoKX0sY29uZmlybTpmdW5jdGlvbigpe3RoaXMuJGVtaXQoInBpY2siLHRoaXMuZGF0ZSl9LHJlc2V0VmlldzpmdW5jdGlvbigpeyJtb250aCI9PT10aGlzLnNlbGVjdGlvbk1vZGU/dGhpcy5jdXJyZW50Vmlldz0ibW9udGgiOiJ5ZWFyIj09PXRoaXMuc2VsZWN0aW9uTW9kZT90aGlzLmN1cnJlbnRWaWV3PSJ5ZWFyIjp0aGlzLmN1cnJlbnRWaWV3PSJkYXRlIiwid2VlayIhPT10aGlzLnNlbGVjdGlvbk1vZGUmJih0aGlzLnllYXI9dGhpcy5kYXRlLmdldEZ1bGxZZWFyKCksdGhpcy5tb250aD10aGlzLmRhdGUuZ2V0TW9udGgoKSl9fSxjb21wb25lbnRzOntUaW1lUGlja2VyOmRbImRlZmF1bHQiXSxZZWFyVGFibGU6ZlsiZGVmYXVsdCJdLE1vbnRoVGFibGU6cFsiZGVmYXVsdCJdLERhdGVUYWJsZTpnWyJkZWZhdWx0Il0sRWxJbnB1dDpsWyJkZWZhdWx0Il19LG1vdW50ZWQ6ZnVuY3Rpb24oKXsibW9udGgiPT09dGhpcy5zZWxlY3Rpb25Nb2RlJiYodGhpcy5jdXJyZW50Vmlldz0ibW9udGgiKSx0aGlzLmRhdGUmJiF0aGlzLnllYXImJih0aGlzLnllYXI9dGhpcy5kYXRlLmdldEZ1bGxZZWFyKCksdGhpcy5tb250aD10aGlzLmRhdGUuZ2V0TW9udGgoKSl9LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57cGlja2VyV2lkdGg6MCxkYXRlOm5ldyBEYXRlLHZhbHVlOiIiLHNob3dUaW1lOiExLHNlbGVjdGlvbk1vZGU6ImRheSIsc2hvcnRjdXRzOiIiLHZpc2libGU6ITEsY3VycmVudFZpZXc6ImRhdGUiLGRpc2FibGVkRGF0ZToiIix5ZWFyOm51bGwsbW9udGg6bnVsbCx3ZWVrOm51bGwsc2hvd1dlZWtOdW1iZXI6ITEsdGltZVBpY2tlclZpc2libGU6ITEsd2lkdGg6MH19LGNvbXB1dGVkOntmb290ZXJWaXNpYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2hvd1RpbWV9LHZpc2libGVUaW1lOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4oMCxzLmZvcm1hdERhdGUpKHRoaXMuZGF0ZSwiSEg6bW06c3MiKX0sc2V0OmZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PSgwLHMucGFyc2VEYXRlKShlLCJISDptbTpzcyIpO3QmJih0LnNldEZ1bGxZZWFyKHRoaXMuZGF0ZS5nZXRGdWxsWWVhcigpKSx0LnNldE1vbnRoKHRoaXMuZGF0ZS5nZXRNb250aCgpKSx0LnNldERhdGUodGhpcy5kYXRlLmdldERhdGUoKSksdGhpcy5kYXRlPXQsdGhpcy4kcmVmcy50aW1lcGlja2VyLnZhbHVlPXQsdGhpcy50aW1lUGlja2VyVmlzaWJsZT0hMSl9fX0sdmlzaWJsZURhdGU6e2dldDpmdW5jdGlvbigpe3JldHVybigwLHMuZm9ybWF0RGF0ZSkodGhpcy5kYXRlKX0sc2V0OmZ1bmN0aW9uKGUpe3ZhciB0PSgwLHMucGFyc2VEYXRlKShlLCJ5eXl5LU1NLWRkIik7dCYmKHQuc2V0SG91cnModGhpcy5kYXRlLmdldEhvdXJzKCkpLHQuc2V0TWludXRlcyh0aGlzLmRhdGUuZ2V0TWludXRlcygpKSx0LnNldFNlY29uZHModGhpcy5kYXRlLmdldFNlY29uZHMoKSksdGhpcy5kYXRlPXQsdGhpcy5yZXNldFZpZXcoKSl9fSx5ZWFyTGFiZWw6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnllYXI7aWYoIWUpcmV0dXJuIiI7dmFyIHQ9dGhpcy50KCJlbC5kYXRlcGlja2VyLnllYXIiKTtpZigieWVhciI9PT10aGlzLmN1cnJlbnRWaWV3KXt2YXIgbj0xMCpNYXRoLmZsb29yKGUvMTApO3JldHVybiBuKyIgIit0KyItIisobis5KSsiICIrdH1yZXR1cm4gdGhpcy55ZWFyKyIgIit0fX19fSxmdW5jdGlvbihlLHQsbil7dmFyIGkscztpPW4oMTQ2KTt2YXIgbz1uKDE1MCk7cz1pPWl8fHt9LCJvYmplY3QiIT10eXBlb2YgaVsiZGVmYXVsdCJdJiYiZnVuY3Rpb24iIT10eXBlb2YgaVsiZGVmYXVsdCJdfHwocz1pPWlbImRlZmF1bHQiXSksImZ1bmN0aW9uIj09dHlwZW9mIHMmJihzPXMub3B0aW9ucykscy5yZW5kZXI9by5yZW5kZXIscy5zdGF0aWNSZW5kZXJGbnM9by5zdGF0aWNSZW5kZXJGbnMsZS5leHBvcnRzPWl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6eyJkZWZhdWx0IjplfX10Ll9fZXNNb2R1bGU9ITA7dmFyIHM9bigxNDApLG89bigxMSksYT1pKG8pO3RbImRlZmF1bHQiXT17bWl4aW5zOlthWyJkZWZhdWx0Il1dLGNvbXBvbmVudHM6e1RpbWVTcGlubmVyOm4oMTQ3KX0scHJvcHM6e3BpY2tlcldpZHRoOnt9LGRhdGU6eyJkZWZhdWx0IjpmdW5jdGlvbigpe3JldHVybiBuZXcgRGF0ZX19LHZpc2libGU6Qm9vbGVhbn0sd2F0Y2g6e3Zpc2libGU6ZnVuY3Rpb24oZSl7dGhpcy5jdXJyZW50VmlzaWJsZT1lfSxwaWNrZXJXaWR0aDpmdW5jdGlvbihlKXt0aGlzLndpZHRoPWV9LHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXR
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment